[
  {
    "path": ".gitignore",
    "content": "*.dSYM\n/build/*.png\n/c/**/*.png\n/build\n/c/add-markers\n/c/batch\n/c/demod-fm\n/c/demod-fm-streaming\n/c/export\n/c/fft\n/c/fft-batch\n/c/fft-batch-broad\n/c/fft-stitch\n/c/fft-stitch-broad\n/c/gradual-noise\n/c/gridvis\n/c/iq-lines\n/c/iqvis\n/c/iqvis-rtl\n/c/osc-server\n/c/piqvis\n/c/play\n/c/reader\n/c/rfcap\n/c/sender\n/c/single-sample\n/c/tv-sender\n/c/vis\n/c/render-text\n/rpi-fdb/iqvis\n/rpi-fdb/iqvis_lines\n/rust/target\n/rftmp\n"
  },
  {
    "path": "API.md",
    "content": "## Introduction\n\nHere's a typical example of a script:\n\n    function setup()\n        -- Load the model, shaders, camera, ...\n    end\n\n    function draw()\n        ngl_clear(0.2, 0.2, 0.2, 1)\n        -- Draw your scene\n    end\n\nThe Frequensea API uses a consistent naming scheme. Each call starts with the name of the module (nut, nwm, ngl, nosc or nrf), then the name of the object, then the action on that object. To illustrate, here's how you create a camera object:\n\n    camera = ngl_camera_new()\n\nTo call a method on that object, use the object as the first argument:\n\n    ngl_camera_rotate_x(camera, 45)\n\n## NWM -- Window Manager\n\nCurrently you can't create, move or resize windows in Lua. You can call the \"frequensea\" binary with the `--width` and `--height` flags to change the size, e.g.:\n\n    ./frequensea --width 1920 --height 1080 ../lua/static.lua\n\n## nwm_get_time()\nGet the current time, in seconds. This is a floating-point number, so the\nfractional part contains greater precision.\n\n## NGL -- OpenGL API\n\nThe API that loads models, shaders, initializes the camera and can draw things on screen.\n\n### ngl_clear(red, green, blue, alpha)\n\nClear the screen and the depth buffer. The alpha component doesn't do anything at the moment, I don't know why.\n\n### ngl_clear_depth()\n\nOnly clear the depth buffer; the screen is not cleared.\n\n### ngl_camera\n\nThe `ngl_camera` object contains the current view and projection transforms. The projection is currently fixed: only the view transform (the position of the camera) can be modified.\n\n### ngl_camera_new()\n\nCreate a new camera positioned at (0,0,0). Use `ngl_camera_translate` to move the camera. Returns a `ngl_camera` object that can be used with `ngl_draw_model`.\n\n### ngl_camera_new_look_at(x, y, z)\n\nCreate a camera object that is positioned at the given x/y/z values and looks at\nthe origin (0,0,0) of the scene. Returns a camera object that can be used with `ngl_draw_model`.\n\n### ngl_camera_translate(camera, x, y, z)\n\nTranslate (or move) the camera by the given x, y, z values. This changes the camera in-place, no new camera object is created.\n\n### ngl_camera_rotate_x(camera, degrees) / ngl_camera_rotate_y(camera, degrees) / ngl_camera_rotate_z(camera, degrees)\n\nRotate the camera over the given axis by degrees. This changes the camera in-place, no new camera object is created.\n\n### ngl_shader\n\nThe `ngl_shader` object contains the vertex and fragment shaders necessary for drawing objects on screen. It also contains the draw mode: an OpenGL constant that specifies whether you want to draw lines (`GL_LINES`, `GL_LINE_STRIP`, `GL_LINE_LOOP`) or triangles (`GL_TRIANGLES`, `GL_TRIANGLE_STRIP`, `GL_TRIANGLE_FAN`).\n\n### ngl_shader_new(draw_mode, vertex_shader, fragment_shader)\n\nCreate a new shader using the given vertex shader and fragment shader source.\nNote that you can use Lua's multi-line strings:\n\n    VERTEX_SHADER = [[\n        #version 400\n        <Rest of the shader code goes here>\n    ]]\n\nThe first argument is a OpenGL draw mode. For a scene loaded using `ngl_model_load_obj`\nthis should probably be GL_TRIANGLES.\n\nOther modes are `GL_POINTS`, `GL_LINE_STRIP`, `GL_LINE_LOOP`, `GL_LINES`, `GL_TRIANGLE_STRIP`, `GL_TRIANGLE_FAN`, `GL_TRIANGLES`. See [glDrawArrays](https://www.opengl.org/sdk/docs/man3/xhtml/glDrawArrays.xml) for more info on drawing modes.\n\n### ngl_shader_new_from_file(draw_mode, vertex_file, fragment_file)\n\nCreate a new shader by loading the vertex and fragment file. The first argument is a OpenGL draw mode;\nfor a scene loaded using `ngl_model_load_obj` this should probably be GL_TRIANGLES.\n\nOther modes are `GL_POINTS`, `GL_LINE_STRIP`, `GL_LINE_LOOP`, `GL_LINES`, `GL_TRIANGLE_STRIP`, `GL_TRIANGLE_FAN`, `GL_TRIANGLES`. See [glDrawArrays](https://www.opengl.org/sdk/docs/man3/xhtml/glDrawArrays.xml) for more info on drawing modes.\n\n### ngl_shader_uniform_set_float(shader, uniform_name, value)\n\nSet the uniform in GLSL to the given value. This is useful to change a running shader on the fly.\n\n\n### ngl_texture\n\nTextures are images that are sent to the shader. These images can be loaded from a file (using `ngl_texture_new_from_file`) or updated on-the-fly, with data from a buffer (using `ngl_texture_update`).\n\n### ngl_texture_new(shader, uniform_name)\n\nCreate an empty texture object. The name refers to the texture uniform name in the shader. Returns a `ngl_texture` object that can be used with `ngl_texture_update`.\n\n### ngl_texture_new_from_file(file_name, shader, uniform_name)\n\nCreate a texture object from an image file. The name refers to the texture uniform name in the shader. Returns a `ngl_texture` object.\n\n## ngl_texture_update(texture, buffer, width, height)\n\nSet the texture data. `texture` is the texture object returned by `ngl_texture_new.` `buffer` is a `nut_buffer`, such as returned from `nrf_device_get_samples_buffer`. Since buffers are one-dimensional, `width` and `height` are needed to change this into a two-dimensional texture. Note that width * height needs to match the size of the buffer. If the sizes are incorrect, the program will crash.\n\n### ngl_model_new_with_buffer(buffer)\n\nCreate a new model by initializing it with a list of points. The model will have as many channels as the buffer, that is 2D for 2 channels, 3D for 3 channels. The points will not have normals or texture coordinates.\n\nThis function returns a `ngl_model` object that can be used in `ngl_draw_model`.\n\n### ngl_model_new_grid_points(row_count, column_count, row_height, column_width)\n\nCreate a new model that contains a two-dimensional grids with one point per grid position. The grid will have row_count * column_count points. `row_height` and `column_width` specify the distance between each row and column. This model won't have any normals.\n\n### ngl_model_new_grid_triangles(row_count, column_count, row_height, column_width)\n\nInitialize a grid that can be used to draw triangles. Point positions are in the X and Z components. The grid will have (row_count-1) * (column_count -1) * 6 points (two triangles per grid \"square\"). `row_height` and `column_width` specify the distance between each row and column. This model has normals.\n\n## ngl_model_load_obj(file)\nLoad an OBJ file from disk. The OBJ file should only use triangles, and should have normals exported.\n\nThis function returns a model object that can be used in `ngl_draw_model`.\n\n## ngl_model_translate(model, tx, ty, tz)\nTranslate the model. The model is transformed in-place; no data is returned.\n\n## ngl_draw_model(camera, model, shader)\nDraw the model with the given shader. Use the same camera object if you want consistent views of the scene.\n\n## ngl_capture_model(camera, model, shader, file_name)\nSave the model to an OBJ file called `file_name`. This will use the [OpenGL Transform Feedback](https://www.opengl.org/wiki/Transform_Feedback) feature to save the output of the vertex shader. Currently, only gl_Position is saved. This call is very slow, so best is to trigger it on a key press. See `save-model.lua` for an example.\n\n## NRF -- NDBX Radio Frequency\nFunctions for reading data from a software defined radio (SDR) device.\n\nHere's a basic example:\n\n    device = nrf_device_new(204.0)\n    while true do\n        -- Do something with device.samples\n    end\n    nrf_device_free(device)\n\n## nrf_device_new(freq_mhz, data_file)\nTune the SDR device to the given frequency (in MHz) and start receiving data. We can receive data from RTL-SDR, HackRF, or fall back to a data file. The function returns a device object. The device object has a member, `samples`, that contains a list of NRF_SAMPLES_LENGTH three-component floating-point values, containing (i, q, t) where t is a value between 0.0 (beginning of the sample data) to 1.0 (end of the sample data).\n\n### nrf_device_set_frequency(device, freq_mhz)\nChange the frequency device to the given frequency (in MHz). The `device` is a device object as returned by `nrf_device_new`.\n\n### nrf_device_set_paused(device, paused)\nIf `paused` is 1, stop receiving new blocks; instead just keep working on the current block. This currently only works for dummy devices.\n\n### nrf_device_step(device)\nAdvance one block. This is only works if the device is paused using `nrf_device_set_paused(device, true)`\n\n### nrf_device_get_samples_buffer(device)\nGet the raw samples buffer. This returns a buffer object that can be used with ngl_texture_update, e.g.:\n\n    buffer = nrf_device_get_samples_buffer(device)\n    ngl_texture_update(texture, buffer.width, buffer.height, buffer.channels, buffer.data)\n\n### nrf_device_get_iq_buffer(device)\nGet the IQ values plotted as points. This returns a buffer object that can be used with ngl_texture_update.\n\n### nrf_device_get_iq_lines(device, int size_multiplier, float line_percentage)\nGet the IQ values plotted as lines. This returns a buffer object that can be used with ngl_texture_update. `size_multiplier` specifies the multiplication factor with regards to the IQ data resolution (so 256 * size_multiplier). The line_percentage is a value between 0-1 that specifies how much of the sample buffer to draw.\n\nThe buffer will have one color channel, which maps to the red channel in the fragment shader.\n\nNote that lines can overlap, and the buffer values can be higher than 1.0. It is a good idea to scale the colors down in the shader.\n\n### nrf_device_get_fft_buffer(device)\nGet the FFT data as a buffer. This returns a buffer object that can be used with ngl_texture_update. The size is controlled by fft_size (the buffer width) and fft_history_size (the buffer_height). Both can be set when initializing the device, for example:\n\n    device = nrf_device_new_with_config({freq_mhz=100.0, fft_width=1024, fft_history_size=2048})\n\n## NUT -- Utilities\n\n### nut_buffer\n\nA number of functions, such as nrf_device_get_samples_buffer, return a `nut_buffer`. There are two types of nut_buffers: one that contain unsigned bytes (`NUT_BUFFER_U8`) and one that contains double-precision floating point values (`NUT_BUFFER_F64`).\n\nYou can't create new buffers in Lua, but you can modify them using the following commands:\n\n### nut_buffer_append(dst, src)\n\nAppend the `src` buffer to the `dst` buffer. Both buffers need to be of the same type. The destination buffer is enlarged to fit the contents of both buffers. The `src` buffer is not modified.\n\n### nut_buffer_reduce(buffer, percentage)\n\nReturn a new buffer that's a given percentage of the original buffer's size. Percentage is a value between 0.0-1.0. The returned buffer will have the same type as the input buffer.\n\n### nut_buffer_clip(buffer, offset, length)\n\nReturn a new buffer that's a subset of the original buffer. The returned buffer will have the same type as the input buffer.\n\n### nut_buffer_convert(buffer, new_type)\n\nReturn a new buffer that's converted from the original type. `new_type` can be `NUT_BUFFER_U8` for unsigned bytes or `NUT_BUFFER_F64` for double-precision floating point values. Converting to the same type just creates a copy of the buffer.\n\n### nut_buffer_save(buffer, file_name)\n\nSave the contents of the buffer to the given file. The buffer data is saved \"as-is\", that is, no conversion is performed.\n"
  },
  {
    "path": "AUTHORS",
    "content": "# Primary Author\nFrederik De Bleser <frederik@debleser.be>\n\n# Contributors\nLieven Menschaert <lieven.menschaert@gmail.com>\nPieter Heremans <pieter.heremans@gmail.com>\n\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 2.8.4)\nproject(frequensea)\n\nSET(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} --std=c99 -g -Wall -Werror -pedantic\")\n\nadd_subdirectory(externals/lua)\n\ninclude_directories(src)\ninclude_directories(externals/ovr/Include)\ninclude_directories(externals/ovr/Src)\ninclude_directories(externals/lua/src)\ninclude_directories(externals/stb)\n\nfind_library(LIBRARY_MATH m)\nfind_library(LIBRARY_PTHREAD pthread)\nfind_library(LIBRARY_FFTW fftw3)\nfind_library(LIBRARY_HACKRF hackrf)\nfind_library(LIBRARY_PNG png)\nfind_library(LIBRARY_RTLSDR rtlsdr)\n\nfind_package(PkgConfig REQUIRED)\npkg_search_module(GLFW REQUIRED glfw3)\ninclude_directories(${GLFW_INCLUDE_DIRS})\n\nfind_package(OpenGL REQUIRED)\nfind_package(GLEW REQUIRED)\n\ninclude(FindOpenAL)\nset(CORE_LIBS ${LIBRARY_MATH} ${LIBRARY_PTHREAD} ${LIBRARY_FFTW} ${LIBRARY_HACKRF} ${LIBRARY_PNG} ${LIBRARY_RTLSDR} ${OPENGL_LIBRARY})\ninclude_directories(${GLEW_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIRS} ${OPENAL_INCLUDE_DIR})\n\nif (APPLE)\n    include_directories(/System/Library/Frameworks /usr/local/include)\n    #find_library(LIBRARY_OVR ovr PATHS externals/ovr/Lib/Mac/Debug)\n    find_library(FRAMEWORK_COCOA Cocoa)\n    find_library(FRAMEWORK_OPENGL OpenGL)\n    find_library(FRAMEWORK_OPENAL OpenAL)\n    find_library(FRAMEWORK_CORE_VIDEO CoreVideo)\n    find_library(FRAMEWORK_IO_KIT IOKit)\n    set(PLATFORM_LIBS ${LIBRARY_OVR} ${FRAMEWORK_COCOA} ${FRAMEWORK_OPENGL} ${FRAMEWORK_OPENAL} ${FRAMEWORK_CORE_VIDEO} ${FRAMEWORK_IO_KIT})\n    #add_definitions(-DWITH_NVR)\n    #set(WITH_NVR 1)\nendif (APPLE)\n\nif (LINUX)\n    find_package(X11 REQUIRED)\n    set(PLATFORM_LIBS ${X11_X11_LIB} ${RT_LIBRARY} ${X11_Xrandr_LIB})\nendif (LINUX)\n\nset(SOURCE_FILES\n    src/main.cpp\n    src/nfile.c\n    src/ngl.c\n    src/nim.c\n    src/noise.c\n    src/nosc.c\n    src/nrf.c\n    src/nut.c\n    src/nwm.c\n    src/obj.c\n    src/vec.c)\n\nif (WITH_NVR)\n    set(SOURCE_FILES ${SOURCE_FILES} src/nvr.cpp)\nendif (WITH_NVR)\n\nadd_executable(frequensea ${SOURCE_FILES})\ntarget_link_libraries(frequensea ${CORE_LIBS} ${PLATFORM_LIBS} stdc++ lua ${GLEW_LIBRARIES} ${OPENAL_LIBRARY} ${GLFW_LDFLAGS})\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Frederik De Bleser\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "NOTES",
    "content": "## hackrf public header\n\nhttps://github.com/mossmann/hackrf/blob/master/host/libhackrf/src/hackrf.h"
  },
  {
    "path": "README.md",
    "content": "## Frequensea\n\nFrequensea is an open-source toolkit for visualizing the electromagnetic spectrum.\n\n![A sea of FFT data](https://raw.github.com/fdb/frequensea/master/screenshots/fft-sea.png)\n\nWatch the [Frequensea video introduction](https://youtu.be/u6H1DatxLAc).\n\n## Features\n- Fast core written in C, with Lua scripting on top.\n- Support for RTL-SDR and HackRF devices.\n- Support for Oculus Rift for viewing the spectrum in virtual reality.\n- Support for OSC to communicate with other applications or devices.\n- Basic building blocks for sampling, filtering and visualizing RF data.\n\n## Installing dependencies (OS X)\n\n    brew update\n    brew install cmake glew fftw librtlsdr hackrf libpng libsndfile pkgconfig homebrew/versions/glfw3\n\n## Installing dependencies (Ubuntu 14.04 LTS)\n\n    sudo apt-get install -y git cmake gcc g++ make libfftw3-dev libpng-dev libusb-1.0.0-dev pkg-config xorg-dev libglu1-mesa-dev libopenal-dev libglew-dev libhackrf-dev librtlsdr-dev pkg-config\n\n    # There is no GLFW3 package so install from source\n    wget https://github.com/glfw/glfw/releases/download/3.1.1/glfw-3.1.1.zip\n    unzip 3.1.1.zip\n    cd glfw-3.1.1\n    mkdir build\n    cd build\n    cmake ..\n    make\n    sudo make install\n    sudo ldconfig\n\n## Installing dependencies (Raspberry Pi - Raspbian Jessie)\n\n    sudo apt-get install -y git cmake gcc g++ make libfftw3-dev libpng-dev libusb-1.0.0-dev pkg-config xorg-dev libglu1-mesa-dev libopenal-dev libglew-dev libhackrf-dev librtlsdr-dev libglfw3-dev\n\n    # Raspberry Pi doesn't support GLX, so until that's supported,\n    # we'll use the software rendering packages.\n    # Note that I found that installing mesa can *remove* libglfw3-dev,\n    # which we need, so if you get errors against that make sure\n    # it's installed.\n    sudo apt-get install -y libgl1-mesa-swx11 libglu1-mesa-dev libglew-dev\n\n    # Disable default kernel driver\n    sudo modprobe -r dvb_usb_rtl28xxu\n\nNote that you might need to run as root to claim the graphics driver, especially if you don't use the default \"pi\" user.\n\n## Building\n\n    mkdir build\n    cd build/\n    cmake ..\n    make\n\n## Running\n\n    ./frequensea ../lua/static.lua\n\nWith the Oculus:\n\n    ./frequensea --vr ../lua/static.lua\n\nSave the output to a PNG sequence:\n\n    ./frequensea --capture ../lua/animate-camera.lua\n\n## Build and Run\n\n    make && ./frequensea ../lua/static.lua\n\n## Documentation\n\n- API.md contains all available Frequensea calls.\n- Examples are in the \"lua\" folder.\n"
  },
  {
    "path": "c/Makefile",
    "content": "add-markers: add-markers.c\n\tgcc --std=c99 -g -Wall -Werror -pedantic -I /opt/homebrew/include -I /usr/local/include -L /usr/local/lib -L /opt/homebrew/lib -o add-markers add-markers.c -lpng\n\nreader: reader.c\n\tgcc -I /opt/homebrew/include -I /usr/local/include -L /usr/local/lib -L /opt/homebrew/lib -l hackrf -o reader reader.c\n\nsender: sender.c\n\tgcc -I /opt/homebrew/include -I /usr/local/include -L /usr/local/lib -L /opt/homebrew/lib -l hackrf -o sender sender.c\n\ntv-sender: tv-sender.c\n\tgcc -g -Wall -Werror -pedantic -I /opt/homebrew/include -I /usr/local/include -L /usr/local/lib -L /opt/homebrew/lib -l hackrf -o tv-sender tv-sender.c\n\nvis: vis.c\n\tgcc -I /opt/homebrew/include -I /usr/local/include -L /usr/local/lib -L /opt/homebrew/lib -o vis vis.c -l glfw -l hackrf -lpng -framework OpenGL\n\ngradual-noise: gradual-noise.c\n\tgcc -O3 --std=c99 -g -Wall -Werror -pedantic -I /opt/homebrew/include -I /usr/local/include -L /usr/local/lib -L /opt/homebrew/lib -o gradual-noise gradual-noise.c -lpng\n\ngridvis: gridvis.c\n\tgcc -I /opt/homebrew/include -I /usr/local/include -L /usr/local/lib -L /opt/homebrew/lib -o gridvis gridvis.c -l glfw -l hackrf -lpng -framework OpenGL\n\nrfcap: rfcap.c\n\tgcc -I /opt/homebrew/include -I /usr/local/include -L /usr/local/lib -L /opt/homebrew/lib -l hackrf -o rfcap rfcap.c\n\nbatch: batch.c\n\tgcc -I /opt/homebrew/include -I /usr/local/include -L /usr/local/lib -L /opt/homebrew/lib -o batch batch.c -l hackrf -lpng\n\nfft: fft.c\n\tgcc -I /opt/homebrew/include -I /usr/local/include -L /usr/local/lib -L /opt/homebrew/lib -o fft fft.c -l hackrf -lpng -lfftw3 -lm -l glfw -framework OpenGL\n\nfft-batch: fft-batch.c\n\tgcc --std=c99 -g -Wall -Werror -pedantic -I /opt/homebrew/include -I /usr/local/include -L /usr/local/lib -L /opt/homebrew/lib -o fft-batch fft-batch.c -lhackrf -lpng -lfftw3\n\nfft-batch-broad: fft-batch-broad.c\n\tgcc --std=c99 -g -Wall -Werror -pedantic -I /opt/homebrew/include -I /usr/local/include -L /usr/local/lib -L /opt/homebrew/lib -o fft-batch-broad fft-batch-broad.c -lhackrf -lpng -lfftw3\n\nfft-stitch: fft-stitch.c\n\tgcc --std=c99 -g -Wall -Werror -pedantic -I /opt/homebrew/include -I /usr/local/include -L /usr/local/lib -L /opt/homebrew/lib -o fft-stitch fft-stitch.c -lpng\n\nfft-stitch-broad: fft-stitch-broad.c\n\tgcc --std=c99 -g -Wall -Werror -pedantic -I /opt/homebrew/include -I /usr/local/include -L /usr/local/lib -L /opt/homebrew/lib -o fft-stitch-broad fft-stitch-broad.c -lpng\n\niq-lines: iq-lines.c\n\tgcc --std=c99 -g -Wall -Werror -pedantic `pkg-config --cflags --libs --static libpng libhackrf glfw3` -o iq-lines iq-lines.c\n\niqvis: iqvis.c\n\tgcc -I /opt/homebrew/include -I /opt/homebrew/include -I /usr/local/include -L /usr/local/lib -L /opt/homebrew/lib -L /opt/homebrew/lib -o iqvis iqvis.c -l glfw -l hackrf -lpng -framework OpenGL\n\niqvis-rtl: iqvis-rtl.c\n\tgcc --std=c99 -g -Wall -Werror -pedantic -I/usr/local/include `pkg-config --cflags libpng librtlsdr glfw3 glew` -o iqvis-rtl iqvis-rtl.c -L/usr/local/lib `pkg-config --libs --static libpng librtlsdr glfw3 glew`\n\ndemod-fm: demod-fm.c\n\tgcc --std=c99 -g -Wall -Werror -pedantic -I /opt/homebrew/include -I /usr/local/include -L /usr/local/lib -L /opt/homebrew/lib -l hackrf -framework OpenAL -o demod-fm demod-fm.c\n\ndemod-fm-streaming: demod-fm-streaming.c\n\tgcc --std=c99 -g -Wall -Werror -pedantic -I /opt/homebrew/include -I /usr/local/include -L /usr/local/lib -L /opt/homebrew/lib -l hackrf -framework OpenAL -o demod-fm-streaming demod-fm-streaming.c\n\nosc-server: osc-server.c\n\tgcc --std=c99 -g -Wall -Werror -pedantic -o osc-server osc-server.c\n\nplay: play.c\n\tgcc --std=c99 -g -Wall -Werror -pedantic -I /opt/homebrew/include -I /usr/local/include -L /usr/local/lib -L /opt/homebrew/lib -l sndfile -framework OpenAL -o play play.c\n\npiqvis: piqvis.c\n\tgcc --std=c99 -g -Wall -Werror -pedantic -I/usr/local/include `pkg-config --cflags librtlsdr glfw3 glew` -o piqvis piqvis.c -L/usr/local/lib `pkg-config --libs --static librtlsdr glfw3 glew`\n\nsingle-sample: single-sample.c\n\tgcc -O3 --std=c99 -g -Wall -Werror -pedantic `pkg-config --cflags --libs libpng` -o single-sample single-sample.c\n\nrender-text: render-text.c\n\tgcc --std=c99 -g -Wall -Werror -pedantic `pkg-config --cflags --libs libpng` -o render-text render-text.c\n"
  },
  {
    "path": "c/README.md",
    "content": "Mac OS X\n========\nTo install on OS X:\n\n    sudo port install hackrf glfw libpng fftw\n    make vis && ./vis\n"
  },
  {
    "path": "c/_export/.gitkeep",
    "content": ""
  },
  {
    "path": "c/add-all-markers.sh",
    "content": "#!/bin/sh\nmake add-markers\n./add-markers 10 465\n./add-markers 470 925\n./add-markers 930 1385\n./add-markers 1390 1845\n./add-markers 1850 2305\n./add-markers 2310 2765\n./add-markers 2770 3225\n./add-markers 3230 3685\n./add-markers 3690 4145\n./add-markers 4150 4605\n"
  },
  {
    "path": "c/add-markers.c",
    "content": "// Add markers\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <math.h>\n#include <string.h>\n\n#define STB_IMAGE_IMPLEMENTATION\n#include \"../externals/stb/stb_image.h\"\n#define STB_TRUETYPE_IMPLEMENTATION\n#include \"../externals/stb/stb_truetype.h\"\n\n#include \"easypng.h\"\n\n// Utility //////////////////////////////////////////////////////////////////\n\nuint8_t max_u8(uint8_t a, uint8_t b) {\n    return a > b ? a : b;\n}\n\n// Image operations /////////////////////////////////////////////////////////\n\nvoid img_gray_copy(uint8_t *dst, uint8_t *src, uint32_t dst_x, uint32_t dst_y, uint32_t src_x, uint32_t src_y, uint32_t width, uint32_t height, uint32_t dst_stride, uint32_t src_stride) {\n    for (uint32_t i = 0; i < height; i++) {\n        for (uint32_t j = 0; j < width; j++) {\n            uint32_t dst_offset = (dst_y + i) * dst_stride + dst_x + j;\n            uint32_t src_offset = (src_y + i) * src_stride + src_x + j;\n            dst[dst_offset] = max_u8(dst[dst_offset], src[src_offset]);\n        }\n    }\n}\n\nvoid img_pixel_put(uint8_t *buffer, uint32_t stride, uint32_t x, uint32_t y, uint8_t v) {\n    if (x > 0 && y > 0) {\n        buffer[(y * stride) + x] = v;\n    }\n}\n\nvoid img_vline(uint8_t *buffer, uint32_t stride, uint32_t x1, uint32_t y1, uint32_t y2, uint8_t v) {\n    if (x1 > stride) return;\n    for (int y = y1; y < y2; y++) {\n        img_pixel_put(buffer, stride, x1, y, v);\n    }\n}\n\nvoid img_hline(uint8_t *buffer, uint32_t stride, uint32_t x1, uint32_t y1, uint32_t x2, uint8_t v) {\n    for (int x = x1; x < x2; x++) {\n        img_pixel_put(buffer, stride, x, y1, v);\n    }\n}\n\n// Font operations //////////////////////////////////////////////////////////\n\ntypedef struct {\n    stbtt_fontinfo font;\n    uint8_t *buffer;\n} ntt_font;\n\nntt_font *ntt_font_load(const char *font_file) {\n    ntt_font *font = calloc(1, sizeof(ntt_font));\n\n    FILE *fp = fopen(font_file, \"rb\");\n    fseek(fp, 0L, SEEK_END);\n    long size = ftell(fp);\n    rewind(fp);\n    font->buffer = calloc(size, 1);\n    fread(font->buffer, size, 1, fp);\n    fclose(fp);\n\n    stbtt_InitFont(&font->font, font->buffer, stbtt_GetFontOffsetForIndex(font->buffer, 0));\n    return font;\n}\n\nvoid ntt_font_measure(const ntt_font *font, const char *text, const int x, const int y, const int font_size, int *width, int *height) {\n    float font_scale = stbtt_ScaleForPixelHeight(&font->font, font_size);\n    int ascent, descent;\n    stbtt_GetFontVMetrics(&font->font, &ascent, &descent, 0);\n    int baseline = (int) (ascent * font_scale);\n    int descent_scaled = (int) (descent * font_scale);\n    //printf(\"Baseline %d descent %d\\n\", baseline, descent_scaled);\n\n    *width = x;\n    // The glyph height is constant for the font.\n    // Descent_scaled is negative.\n    *height = y + (baseline - descent_scaled);\n\n    int ch = 0;\n    while (text[ch]) {\n        int x0, y0, x1, y1;\n        int advance, lsb;\n        char c = text[ch];\n        stbtt_GetCodepointBitmapBox(&font->font, c, font_scale, font_scale, &x0, &y0, &x1, &y1);\n        stbtt_GetCodepointHMetrics(&font->font, c, &advance, &lsb);\n        int glyph_width = advance * font_scale;\n        *width += glyph_width;\n        if (text[ch + 1]) {\n            *width += font_scale * stbtt_GetCodepointKernAdvance(&font->font, c, text[ch + 1]);\n        }\n        ch++;\n    }\n}\n\nvoid ntt_font_draw(const ntt_font *font, uint8_t *img, const uint32_t img_stride, const char *text, const int x, const int y, const int font_size) {\n    int text_width, text_height;\n    ntt_font_measure(font, text, 0, 0, font_size, &text_width, &text_height);\n    int start_x = x - text_width / 2;\n    if (start_x < 0) return;\n\n    float font_scale = stbtt_ScaleForPixelHeight(&font->font, font_size);\n    int ascent;\n    stbtt_GetFontVMetrics(&font->font, &ascent, 0, 0);\n    int baseline = (int) (ascent * font_scale);\n\n    int ch = 0;\n    int _x = 0;\n    while (text[ch]) {\n        int w, h, dx, dy;\n        int advance, lsb;\n        char c = text[ch];\n        stbtt_GetCodepointHMetrics(&font->font, c, &advance, &lsb);\n        uint8_t *glyph_bitmap = stbtt_GetCodepointBitmap(&font->font, font_scale, font_scale, c, &w, &h, &dx, &dy);\n        //printf(\"Offset %d %d\\n\", dx, baseline + dy);\n        img_gray_copy(img, glyph_bitmap, start_x + _x + dx, y + baseline + dy, 0, 0, w, h, img_stride, w);\n        //x += w;\n        _x += (advance * font_scale);\n\n        if (text[ch + 1]) {\n            _x += font_scale * stbtt_GetCodepointKernAdvance(&font->font, c, text[ch + 1]);\n        }\n\n        ch++;\n    }\n}\n\n// Main /////////////////////////////////////////////////////////////////////\n\nint frequency_to_x(const int image_width, const uint64_t frequency_real_start, const uint64_t frequency_real_range, const uint64_t freq) {\n    const uint64_t real_freq = freq - frequency_real_start;\n    return round(real_freq / (double) frequency_real_range * image_width);\n}\n\nint main(int argc, char **argv) {\n    assert(argc == 3);\n\n    const uint32_t HEADER_HEIGHT = 300;\n    const uint32_t FOOTER_HEIGHT = 300;\n    const uint32_t FOOTER_BLEED = 35;\n\n    const uint32_t TARGET_WIDTH = 23693;\n    const uint32_t TARGET_HEIGHT = 7157;\n\n    const uint32_t SOURCE_WIDTH = TARGET_WIDTH;\n    const uint32_t SOURCE_HEIGHT = TARGET_HEIGHT - HEADER_HEIGHT - FOOTER_HEIGHT;\n\n    const uint64_t FREQUENCY_START = atoi(argv[1]) * 1e6;\n    const uint64_t FREQUENCY_END = atoi(argv[2]) * 1e6;\n    const uint32_t SAMPLE_RATE = 5e6;\n\n    // The FREQUENCY_START is the center frequency of each file. The real start of the file is the start - sample_rate / 2.\n    const uint64_t FREQUENCY_REAL_START = FREQUENCY_START - (SAMPLE_RATE / 2);\n    const uint64_t FREQUENCY_REAL_END = FREQUENCY_END + (SAMPLE_RATE / 2);\n    const uint64_t FREQUENCY_REAL_RANGE = FREQUENCY_REAL_END - FREQUENCY_REAL_START;\n\n    const uint32_t MINOR_TICK_RATE = 1e6;\n    const uint32_t MINOR_TICK_HEIGHT = 30;\n    const uint32_t MAJOR_TICK_RATE = 50e6;\n    const uint32_t MAJOR_TICK_HEIGHT = 60;\n    const uint8_t LINE_COLOR = 255;\n    const char* FONT_FILE = \"../fonts/RobotoCondensed-Bold.ttf\";\n    const uint16_t FONT_SIZE_PX = 64;\n\n    printf(\"Frequency range: %.0f MHz - %.0f MHz\\n\", FREQUENCY_START / 1e6, FREQUENCY_END / 1e6);\n\n    ntt_font *font = ntt_font_load(FONT_FILE);\n\n    char in_file_name[100];\n    snprintf(in_file_name, 100, \"broad-stitched-%.0f-%.0f.png\", FREQUENCY_START / 1e6, FREQUENCY_END / 1e6);\n    char out_file_name[100];\n    snprintf(out_file_name, 100, \"broad-stitched-%.0f-%.0f-markers.png\", FREQUENCY_START / 1e6, FREQUENCY_END / 1e6);\n\n    int width, height, n;\n    printf(\"Reading %s...\\n\", in_file_name);\n    uint8_t *in_buffer = stbi_load(in_file_name, &width, &height, &n, 1);\n    assert(width == SOURCE_WIDTH);\n    assert(height == SOURCE_HEIGHT);\n    int out_width = width;\n    int out_height = height + HEADER_HEIGHT + FOOTER_HEIGHT;\n    assert(out_width == TARGET_WIDTH);\n    assert(out_height == TARGET_HEIGHT);\n    uint8_t *out_buffer = calloc(out_width * out_height, sizeof(uint8_t));\n\n    printf(\"Composing...\\n\");\n    img_gray_copy(out_buffer, in_buffer, 0, HEADER_HEIGHT, 0, 0, width, height, out_width, width);\n\n    printf(\"Adding markers...\\n\");\n\n    int header_bottom = HEADER_HEIGHT;\n    int footer_top = HEADER_HEIGHT + height;\n    int footer_bottom = out_height - 1;\n\n    // Add white lines at header bottom + footer top/bottom.\n    const int border_height = 10;\n    for (int i = 0; i < border_height; i++) {\n        img_hline(out_buffer, out_width, 0, header_bottom - i, out_width, LINE_COLOR);\n        img_hline(out_buffer, out_width, 0, footer_top + i, out_width, LINE_COLOR);\n    }\n    footer_top += border_height;\n\n    // Add minor ticks.\n    for (uint64_t freq = 0; freq < FREQUENCY_REAL_END; freq += MINOR_TICK_RATE) {\n        int x = frequency_to_x(out_width, FREQUENCY_REAL_START, FREQUENCY_REAL_RANGE, freq);\n        if (x > 0 && x < out_width) {\n            for (int dx = -1; dx <= 1; dx += 1) {\n                img_vline(out_buffer, out_width, x + dx, footer_top, footer_top + MINOR_TICK_HEIGHT, LINE_COLOR);\n                img_vline(out_buffer, out_width, x + dx, footer_bottom - MINOR_TICK_HEIGHT - FOOTER_BLEED, footer_bottom + 1, LINE_COLOR);\n            }\n        }\n    }\n\n    // Add major ticks + text.\n    const uint32_t labels_y = height + HEADER_HEIGHT + (FOOTER_HEIGHT / 2 - FONT_SIZE_PX / 2 - FOOTER_BLEED / 2);\n    for (uint64_t freq = 0; freq < FREQUENCY_REAL_END; freq += MAJOR_TICK_RATE) {\n        int x = frequency_to_x(out_width, FREQUENCY_REAL_START, FREQUENCY_REAL_RANGE, freq);\n        if (x > 0 && x < out_width) {\n            for (int dx = -2; dx <= 2; dx += 1) {\n                img_vline(out_buffer, out_width, x + dx, footer_top, footer_top + MAJOR_TICK_HEIGHT, LINE_COLOR);\n                img_vline(out_buffer, out_width, x + dx, footer_bottom - MAJOR_TICK_HEIGHT - FOOTER_BLEED, footer_bottom + 1, LINE_COLOR);\n            }\n            if (freq > FREQUENCY_REAL_START && freq < FREQUENCY_REAL_END) {\n                char text[200];\n                snprintf(text, 200, \"%.2f\", (freq / (double) 1e6));\n                ntt_font_draw(font, out_buffer, out_width, text, x, labels_y, FONT_SIZE_PX);\n            }\n        }\n    }\n\n    printf(\"Writing %s...\\n\", out_file_name);\n    write_gray_png(out_file_name, out_width, out_height, out_buffer);\n\n    exit(0);\n}\n\n"
  },
  {
    "path": "c/batch.c",
    "content": "// Process frequency range in batch.\n\n#include <libhackrf/hackrf.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include \"easypng.h\"\n\n#define WIDTH 512\n#define HEIGHT 512\n\nconst double start_freq = 1;\nconst double end_freq = 6000;\nconst double freq_step = 1;\ndouble current_freq = start_freq;\n\nhackrf_device *device;\nint receive_count = 0;\nint paused = 0;\nuint8_t buffer[WIDTH * HEIGHT];\n\n#define HACKRF_CHECK_STATUS(status, message) \\\n    if (status != 0) { \\\n        printf(\"FAIL: %s\\n\", message); \\\n        hackrf_close(device); \\\n        hackrf_exit(); \\\n        exit(EXIT_FAILURE); \\\n    } \\\n\nvoid export_buffer() {\n    paused = 1;\n    char fname[100];\n    snprintf(fname, 100, \"export/img-%.3f.png\", current_freq);\n    write_gray_png(fname, WIDTH, HEIGHT, buffer);\n    paused = 0;\n}\n\nvoid next_frequency() {\n    receive_count = 0;\n    current_freq += freq_step;\n    if (current_freq <= end_freq) {\n        printf(\"Frequency: %.3f MHz\\n\", current_freq);\n        int status = hackrf_set_freq(device, current_freq * 1e6);\n        HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n    } else {\n        printf(\"Done.\\n\");\n        exit(0);\n    }\n}\n\nint receive_sample_block(hackrf_transfer *transfer) {\n    if (paused) return 0;\n    receive_count += 1;\n    // memcpy(buffer, transfer->buffer, transfer->valid_length);\n    for (int i = 0; i < transfer->valid_length; i+= 2) {\n        buffer[i] = transfer->buffer[i + 1];\n        buffer[i + 1] = transfer->buffer[i + 1];\n    }\n    return 0;\n}\n\nint main(int argc, char **argv) {\n    int status;\n\n    status = hackrf_init();\n    HACKRF_CHECK_STATUS(status, \"hackrf_init\");\n\n    status = hackrf_open(&device);\n    HACKRF_CHECK_STATUS(status, \"hackrf_open\");\n\n    status = hackrf_set_freq(device, current_freq * 1e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n\n    status = hackrf_set_sample_rate(device, 10e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_sample_rate\");\n\n    status = hackrf_set_amp_enable(device, 0);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_amp_enable\");\n\n    status = hackrf_set_lna_gain(device, 32);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_set_vga_gain(device, 30);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_start_rx(device, receive_sample_block, NULL);\n    HACKRF_CHECK_STATUS(status, \"hackrf_start_rx\");\n\n    while (1) {\n        if (receive_count < 10) {\n            usleep(100);\n        } else {\n            export_buffer();\n            next_frequency();\n        }\n    }\n\n    hackrf_stop_rx(device);\n    hackrf_close(device);\n    hackrf_exit();\n    return 0;\n}\n"
  },
  {
    "path": "c/demod-fm-streaming.c",
    "content": "// Demodulate FM stream, continuously.\n\n#include <assert.h>\n#include <math.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <unistd.h>\n\n#include <OpenAL/al.h>\n#include <OpenAL/alc.h>\n\n#include <libhackrf/hackrf.h>\n\nconst double TAU = M_PI * 2;\nconst int IN_SAMPLE_RATE = 10e6;\nconst int OUT_SAMPLE_RATE = 48000;\nconst int DESIRED_FREQ = 100900000;\nconst int FREQ_OFFSET = 50000;\nconst int CENTER_FREQ = DESIRED_FREQ + FREQ_OFFSET;\nconst int SECONDS = 3;\nconst int DESIRED_OUT_SAMPLES = SECONDS * OUT_SAMPLE_RATE;\nconst ALenum AL_BUFFER_FORMAT = AL_FORMAT_MONO16;\n\nALCcontext *ctx;\nALCdevice *device;\nALuint audio_source;\nhackrf_device *hrf = NULL;\nint is_playing = 0;\nint shutting_down = 0;\ndouble deemphasis_val;\n\n#define HACKRF_CHECK_STATUS(device, status, message) \\\nif (status != 0) { \\\n    fprintf(stderr, \"HackRF error: %s\\n\", message); \\\n    if (device != NULL) hackrf_close(device); \\\n    hackrf_exit(); \\\n    exit(EXIT_FAILURE); \\\n} \\\n\nvoid nal_check_error(const char *file, int line) {\n    ALenum err = alGetError();\n    int has_error = 0;\n    while (err != AL_NO_ERROR) {\n        has_error = 1;\n        char *msg = NULL;\n        switch (err) {\n            case AL_INVALID_NAME:\n                msg = \"AL_INVALID_NAME\";\n                break;\n            case AL_INVALID_ENUM:\n                msg = \"AL_INVALID_ENUM\";\n                break;\n            case AL_INVALID_VALUE:\n                msg = \"AL_INVALID_VALUE\";\n                break;\n            case AL_INVALID_OPERATION:\n                msg = \"AL_INVALID_OPERATION\";\n                break;\n            case AL_OUT_OF_MEMORY:\n                msg = \"AL_OUT_OF_MEMORY\";\n                break;\n        }\n        fprintf(stderr, \"OpenAL error: %s - %s:%d\\n\", msg, file, line);\n        err = alGetError();\n    }\n    if (has_error) {\n        exit(EXIT_FAILURE);\n    }\n}\n\n#define NAL_CHECK_ERROR() nal_check_error(__FILE__, __LINE__)\n\n\n\ntypedef struct {\n    int size;\n    int capacity;\n    ALuint *values;\n} queue;\n\nqueue *queue_new(int capacity) {\n    queue *q = calloc(1, sizeof(queue));\n    q->size = 0;\n    q->capacity = capacity;\n    q->values = calloc(capacity, sizeof(int));\n    return q;\n}\n\nvoid queue_push(queue *q, ALuint v) {\n    if (q->size + 1 > q->capacity) {\n        fprintf(stderr, \"Queue is too small (capacity: %d)\\n\", q->capacity);\n    }\n    q->values[q->size] = v;\n    q->size++;\n}\n\nALuint queue_pop(queue *q) {\n    if (q->size == 0) {\n        fprintf(stderr, \"No more items to pop.\\n\");\n    }\n    int v = q->values[0];\n    // Shift all items.\n    for (int i = 1; i < q->size; i++) {\n        q->values[i-1] = q->values[i];\n    }\n    q->size--;\n    return v;\n}\n\nqueue *audio_buffer_queue;\n\n// Generates coefficients for a FIR low-pass filter with the given\n// half-amplitude frequency and kernel length at the given sample rate.\n//\n// sample_rate    - The signal's sample rate.\n// half_ampl_freq - The half-amplitude frequency in Hz.\n// length         - The filter kernel's length. Should be an odd number.\n//\n// Returns the FIR coefficients for the filter.\ndouble *get_low_pass_fir_coefficients(int sample_rate, int half_ampl_freq, int length) {\n    length += (length + 1) % 2;\n    double freq = half_ampl_freq / (double) sample_rate;\n    double *coefs = calloc(length, sizeof(double));\n    int center = floor(length / 2);\n    double sum = 0;\n    for (int i = 0; i < length; i++) {\n        double val;\n        if (i == center) {\n            val = TAU * freq;\n        } else {\n            double angle = TAU * (i + 1) / (double) (length + 1);\n            val = sin(TAU * freq * (i - center)) / (double) (i - center);\n            val *= 0.42 - 0.5 * cos(angle) + 0.08 * cos(2 * angle);\n        }\n        sum += val;\n        coefs[i] = val;\n    }\n    for (int i = 0; i < length; i++) {\n        coefs[i] /= sum;\n    }\n    return coefs;\n}\n\ntypedef struct {\n    int length;\n    double *coefficients;\n    int offset;\n    int center;\n    int samples_length;\n    double *samples;\n} fir_filter;\n\nfir_filter *fir_filter_new(int sample_rate, int half_ampl_freq, int length) {\n    fir_filter *filter = calloc(1, sizeof(fir_filter));\n    filter->length = length;\n    filter->coefficients = get_low_pass_fir_coefficients(sample_rate, half_ampl_freq, length);\n    filter->offset = length - 1;\n    filter->center = floor(length / 2);\n    filter->samples_length = filter->offset;\n    filter->samples = calloc(filter->samples_length, sizeof(double));\n    return filter;\n}\n\nvoid fir_filter_load(fir_filter *filter, double *samples, int length) {\n    int should_free = 0;\n    int new_length = length + filter->offset;\n    double *new_samples;\n    if (filter->samples_length != new_length) {\n        should_free = 1;\n        new_samples = calloc(new_length, sizeof(double));\n    } else {\n        new_samples = filter->samples;\n    }\n\n    // Copy the last `offset` samples to the new buffer.\n    memcpy(new_samples, filter->samples + filter->samples_length - filter->offset, filter->offset * sizeof(double));\n    memcpy(new_samples + filter->offset, samples, length * sizeof(double));\n\n    if (should_free) {\n        free(filter->samples);\n    }\n    filter->samples = new_samples;\n    filter->samples_length = new_length;\n}\n\ndouble fir_filter_get(fir_filter *filter, int index) {\n    double v = 0;\n    for (int i = 0; i < filter->length; i++) {\n        v += filter->coefficients[i] * filter->samples[index + i];\n    }\n    return v;\n}\n\nvoid fir_filter_free(fir_filter *filter) {\n    free(filter->coefficients);\n    free(filter->samples);\n    free(filter);\n}\n\ntypedef struct {\n    int in_rate;\n    int out_rate;\n    fir_filter *filter;\n    double rate_mul;\n    int out_length;\n    double *out_samples;\n} downsampler;\n\ndownsampler *downsampler_new(int in_rate, int out_rate, int filter_freq, int kernel_length) {\n    downsampler *d = calloc(1, sizeof(downsampler));\n    d->in_rate = in_rate;\n    d->out_rate = out_rate;\n    d->filter = fir_filter_new(in_rate, filter_freq, kernel_length);\n    d->rate_mul = in_rate / (double) out_rate;\n    d->out_length = 0;\n    d->out_samples = NULL;\n    return d;\n}\n\nvoid downsampler_process(downsampler *d, double *samples, int length) {\n    fir_filter_load(d->filter, samples, length);\n\n    free(d->out_samples);\n    d->out_length = floor(length / d->rate_mul);\n    d->out_samples = calloc(d->out_length, sizeof(double));\n\n    double t = 0;\n    for (int i = 0; i < d->out_length; i++) {\n        d->out_samples[i] = fir_filter_get(d->filter, floor(t));\n        t += d->rate_mul;\n    }\n}\n\nvoid downsampler_free(downsampler *d) {\n    fir_filter_free(d->filter);\n    free(d->out_samples);\n    free(d);\n}\n\n\ndouble cosine = 1;\ndouble sine = 0;\n\ndownsampler *downsampler_i;\ndownsampler *downsampler_q;\ndownsampler *downsampler_audio;\n\ndouble l_i = 0;\ndouble l_q = 0;\n\ndouble average(double *values, int length) {\n    double sum = 0;\n    for (int i = 0; i < length; i++) {\n        sum += values[i];\n    }\n    return sum / length;\n}\n\nvoid shift_frequency(double *samples_i, double *samples_q, int length, int freq_offset, int sample_rate, double *cosine_ptr, double *sine_ptr) {\n    double delta_cos = cos(TAU * freq_offset / (double) sample_rate);\n    double delta_sin = sin(TAU * freq_offset / (double) sample_rate);\n    double cosine = *cosine_ptr;\n    double sine = *sine_ptr;\n    for (int i = 0; i < length; i++) {\n        double vi = samples_i[i];\n        double vq = samples_q[i];\n        samples_i[i] = vi * cosine - vq * sine;\n        samples_q[i] = vi * sine + vq * cosine;\n        double new_sine = cosine * delta_sin + sine * delta_cos;\n        double new_cosine = cosine * delta_cos - sine * delta_sin;\n        sine = new_sine;\n        cosine = new_cosine;\n    }\n    *cosine_ptr = cosine;\n    *sine_ptr = sine;\n}\n\nvoid process_sample_block(uint8_t *buffer, size_t length) {\n    if (shutting_down) return;\n\n    double *samples_i = calloc(length, sizeof(double));\n    double *samples_q = calloc(length, sizeof(double));\n\n    // Convert to doubles\n    for (int i = 0; i < length; i++) {\n        unsigned int vi = buffer[i * 2];\n        unsigned int vq = buffer[i * 2 + 1];\n        samples_i[i] = vi / 128.0 - 0.995;\n        samples_q[i] = vq / 128.0 - 0.995;\n        //samples_i[i] = (vi - 128.0) / 256.0;\n        //samples_q[i] = (vq - 128.0) / 256.0;\n    }\n\n    // Shift frequency\n    shift_frequency(samples_i, samples_q, length, FREQ_OFFSET, IN_SAMPLE_RATE, &cosine, &sine);\n\n    // Downsample\n    downsampler_process(downsampler_i, samples_i, length);\n    downsampler_process(downsampler_q, samples_q, length);\n\n    // Demodulate\n    int out_length = downsampler_i->out_length;\n    double *demodulated = calloc(out_length, sizeof(double));\n\n    double prev = 0;\n    double difSqrSum = 0;\n\n    double AMPL_CONV = 336000 / (2 * M_PI * 75000);\n\n    for (int i = 0; i < out_length; i++) {\n        double real = l_i * downsampler_i->out_samples[i] + l_q * downsampler_q->out_samples[i];\n        double imag = l_i * downsampler_q->out_samples[i] - downsampler_i->out_samples[i] * l_q;\n        double sgn = 1;\n        if (imag < 0) {\n            sgn *= -1;\n            imag *= -1;\n        }\n        double ang = 0;\n        double div;\n        if (real == imag) {\n            div = 1;\n        } else if (real > imag) {\n            div = imag / real;\n        } else {\n            ang = -M_PI / 2;\n            div = real / imag;\n            sgn *= -1;\n        }\n        demodulated[i] = sgn *\n            (ang + div\n                / (0.98419158358617365\n                    + div * (0.093485702629671305\n                        + div * 0.19556307900617517))) * AMPL_CONV;\n        l_i = downsampler_i->out_samples[i];\n        l_q = downsampler_q->out_samples[i];\n        double dif = prev - demodulated[i];\n        difSqrSum += dif * dif;\n        prev = demodulated[i];\n    }\n\n    // Downsample again, for audio\n    downsampler_process(downsampler_audio, demodulated, out_length);\n    double *audio_samples = downsampler_audio->out_samples;\n    int audio_length = downsampler_audio->out_length;\n\n    // De-emphasize samples\n    double alpha = 1.0 / (1.0 + OUT_SAMPLE_RATE * 50.0 / 1e6);\n    for (int i = 0; i < audio_length; i++) {\n        deemphasis_val = deemphasis_val + alpha * (audio_samples[i] - deemphasis_val);\n        audio_samples[i] = deemphasis_val;\n    }\n\n    // Convert to signed 16-bit integers.\n    int16_t *pcm_samples = calloc(audio_length, sizeof(int16_t));\n    for (int i = 0; i < audio_length; i++) {\n        pcm_samples[i] = audio_samples[i] * 32000;\n    }\n\n    // Since the signal processing takes a while, we check again if we are shutting down.\n    if (shutting_down) return;\n\n    // Check if there are processed buffers we need to unqueue\n    int processed_buffers;\n    alGetSourceiv(audio_source, AL_BUFFERS_PROCESSED, &processed_buffers);\n    NAL_CHECK_ERROR();\n    assert (processed_buffers <= audio_buffer_queue->size);\n    while (processed_buffers > 0) {\n        ALuint buffer_id = queue_pop(audio_buffer_queue);\n        alSourceUnqueueBuffers(audio_source, 1, &buffer_id);\n        NAL_CHECK_ERROR();\n        alDeleteBuffers(1, &buffer_id);\n        processed_buffers--;\n    }\n\n    // Initialize an audio buffer\n    ALuint buffer_id;\n    alGenBuffers(1, &buffer_id);\n    NAL_CHECK_ERROR();\n    queue_push(audio_buffer_queue, buffer_id);\n\n    // Set the data for the buffer\n    alBufferData(buffer_id, AL_BUFFER_FORMAT, pcm_samples, audio_length * sizeof(int16_t), OUT_SAMPLE_RATE);\n    NAL_CHECK_ERROR();\n\n    alSourceQueueBuffers(audio_source, 1, &buffer_id);\n    NAL_CHECK_ERROR();\n\n    if (!is_playing && audio_buffer_queue->size > 2) {\n        alSourcePlay(audio_source);\n        NAL_CHECK_ERROR();\n        is_playing = 1;\n    }\n\n\n    // The data is now stored in OpenAL, delete our PCM sample buffer.\n    free(pcm_samples);\n\n    free(samples_i);\n    free(samples_q);\n}\n\nint receive_sample_block(hackrf_transfer *transfer) {\n    process_sample_block(transfer->buffer, transfer->valid_length / 2);\n    return 0;\n}\n\n\nvoid cleanup() {\n    shutting_down = 1;\n\n    hackrf_stop_rx(hrf);\n    hackrf_close(hrf);\n    hackrf_exit();\n\n    alcMakeContextCurrent(NULL);\n    alcDestroyContext(ctx);\n    alcCloseDevice(device);\n}\n\nint main(int argc, char **argv) {\n    int status;\n\n    // Initialize the audio context\n    device = alcOpenDevice(NULL);\n    if (!device) {\n        fprintf(stderr, \"Could not open audio device.\\n\");\n        return 1;\n    }\n    ctx = alcCreateContext(device, NULL);\n    alcMakeContextCurrent(ctx);\n    NAL_CHECK_ERROR();\n\n    const int INTER_RATE = 336000;\n    const int  MAX_F = 75000;\n    const double FILTER = MAX_F * 0.8;\n\n    int filter_freq = FILTER * 0.8;\n    downsampler_i = downsampler_new(IN_SAMPLE_RATE, INTER_RATE, filter_freq, 51);\n    downsampler_q = downsampler_new(IN_SAMPLE_RATE, INTER_RATE, filter_freq, 51);\n\n    downsampler_audio = downsampler_new(INTER_RATE, OUT_SAMPLE_RATE, 10000, 41);\n\n    // Initialize an audio source.\n    alGenSources(1, &audio_source);\n    NAL_CHECK_ERROR();\n\n    // Turn off looping.\n    alSourcei(audio_source, AL_LOOPING, AL_FALSE);\n    NAL_CHECK_ERROR();\n\n    // Create a queue holding the list of audio buffers.\n    audio_buffer_queue = queue_new(20);\n\n    // Initialize HackRF and start receiving.\n    status = hackrf_init();\n    HACKRF_CHECK_STATUS(NULL, status, \"hackrf_init\");\n\n    status = hackrf_open(&hrf);\n    HACKRF_CHECK_STATUS(hrf, status, \"hackrf_open\");\n\n    status = hackrf_set_freq(hrf, CENTER_FREQ);\n    HACKRF_CHECK_STATUS(hrf, status, \"hackrf_set_freq\");\n\n    status = hackrf_set_sample_rate(hrf, IN_SAMPLE_RATE);\n    HACKRF_CHECK_STATUS(hrf, status, \"hackrf_set_sample_rate\");\n\n    status = hackrf_set_amp_enable(hrf, 0);\n    HACKRF_CHECK_STATUS(hrf, status, \"hackrf_set_amp_enable\");\n\n    status = hackrf_set_lna_gain(hrf, 32);\n    HACKRF_CHECK_STATUS(hrf, status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_set_vga_gain(hrf, 30);\n    HACKRF_CHECK_STATUS(hrf, status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_start_rx(hrf, receive_sample_block, NULL);\n    HACKRF_CHECK_STATUS(hrf, status, \"hackrf_start_rx\");\n\n    signal(SIGINT, cleanup);\n\n    printf(\"Press Ctrl-C to exit.\\n\");\n\n    // Playing is asynchronous so pause the main thread\n    sleep(1000000);\n\n    return 0;\n}\n"
  },
  {
    "path": "c/demod-fm.c",
    "content": "// Play random noise as audio\n\n#include <math.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <unistd.h>\n\n#include <OpenAL/al.h>\n#include <OpenAL/alc.h>\n\n#include <libhackrf/hackrf.h>\n\nconst double TAU = M_PI * 2;\nconst int IN_SAMPLE_RATE = 10e6;\nconst int OUT_SAMPLE_RATE = 48000;\nconst int DESIRED_FREQ = 100900000;\nconst int FREQ_OFFSET = 50000;\nconst int CENTER_FREQ = DESIRED_FREQ + FREQ_OFFSET;\nconst int SECONDS = 3;\nconst int DESIRED_OUT_SAMPLES = SECONDS * OUT_SAMPLE_RATE;\nconst ALenum AL_BUFFER_FORMAT = AL_FORMAT_MONO16;\n\n#define HACKRF_CHECK_STATUS(device, status, message) \\\nif (status != 0) { \\\n    fprintf(stderr, \"HackRF error: %s\\n\", message); \\\n    if (device != NULL) hackrf_close(device); \\\n    hackrf_exit(); \\\n    exit(EXIT_FAILURE); \\\n} \\\n\nvoid nal_check_error(const char *file, int line) {\n    ALenum err = alGetError();\n    int has_error = 0;\n    while (err != AL_NO_ERROR) {\n        has_error = 1;\n        char *msg = NULL;\n        switch (err) {\n            case AL_INVALID_NAME:\n                msg = \"AL_INVALID_NAME\";\n                break;\n            case AL_INVALID_ENUM:\n                msg = \"AL_INVALID_ENUM\";\n                break;\n            case AL_INVALID_VALUE:\n                msg = \"AL_INVALID_VALUE\";\n                break;\n            case AL_INVALID_OPERATION:\n                msg = \"AL_INVALID_OPERATION\";\n                break;\n            case AL_OUT_OF_MEMORY:\n                msg = \"AL_OUT_OF_MEMORY\";\n                break;\n        }\n        fprintf(stderr, \"OpenAL error: %s - %s:%d\\n\", msg, file, line);\n        err = alGetError();\n    }\n    if (has_error) {\n        exit(EXIT_FAILURE);\n    }\n}\n\n#define NAL_CHECK_ERROR() nal_check_error(__FILE__, __LINE__)\n\nALuint audio_buffer = -1;\n\nALuint source;\n\nALshort *audio_buffer_samples;\nint has_received = 0;\n\nint received_samples = 0;\n\n\n// Generates coefficients for a FIR low-pass filter with the given\n// half-amplitude frequency and kernel length at the given sample rate.\n//\n// sample_rate    - The signal's sample rate.\n// half_ampl_freq - The half-amplitude frequency in Hz.\n// length         - The filter kernel's length. Should be an odd number.\n//\n// Returns the FIR coefficients for the filter.\ndouble *get_low_pass_fir_coefficients(int sample_rate, int half_ampl_freq, int length) {\n    length += (length + 1) % 2;\n    double freq = half_ampl_freq / (double) sample_rate;\n    double *coefs = calloc(length, sizeof(double));\n    int center = floor(length / 2);\n    double sum = 0;\n    for (int i = 0; i < length; i++) {\n        double val;\n        if (i == center) {\n            val = TAU * freq;\n        } else {\n            double angle = TAU * (i + 1) / (double) (length + 1);\n            val = sin(TAU * freq * (i - center)) / (double) (i - center);\n            val *= 0.42 - 0.5 * cos(angle) + 0.08 * cos(2 * angle);\n        }\n        sum += val;\n        coefs[i] = val;\n    }\n    for (int i = 0; i < length; i++) {\n        coefs[i] /= sum;\n    }\n    return coefs;\n}\n\ntypedef struct {\n    int length;\n    double *coefficients;\n    int offset;\n    int center;\n    int samples_length;\n    double *samples;\n} fir_filter;\n\nfir_filter *fir_filter_new(int sample_rate, int half_ampl_freq, int length) {\n    fir_filter *filter = calloc(1, sizeof(fir_filter));\n    filter->length = length;\n    filter->coefficients = get_low_pass_fir_coefficients(sample_rate, half_ampl_freq, length);\n    filter->offset = length - 1;\n    filter->center = floor(length / 2);\n    filter->samples_length = filter->offset;\n    filter->samples = calloc(filter->samples_length, sizeof(double));\n    return filter;\n}\n\nvoid fir_filter_load(fir_filter *filter, double *samples, int length) {\n    int should_free = 0;\n    int new_length = length + filter->offset;\n    double *new_samples;\n    if (filter->samples_length != new_length) {\n        should_free = 1;\n        new_samples = calloc(new_length, sizeof(double));\n    } else {\n        new_samples = filter->samples;\n    }\n\n    // Copy the last `offset` samples to the new buffer.\n    memcpy(new_samples, filter->samples + filter->samples_length - filter->offset, filter->offset * sizeof(double));\n    memcpy(new_samples + filter->offset, samples, length * sizeof(double));\n\n    if (should_free) {\n        free(filter->samples);\n    }\n    filter->samples = new_samples;\n    filter->samples_length = new_length;\n}\n\ndouble fir_filter_get(fir_filter *filter, int index) {\n    double v = 0;\n    for (int i = 0; i < filter->length; i++) {\n        v += filter->coefficients[i] * filter->samples[index + i];\n    }\n    return v;\n}\n\nvoid fir_filter_free(fir_filter *filter) {\n    free(filter->coefficients);\n    free(filter->samples);\n    free(filter);\n}\n\ntypedef struct {\n    int in_rate;\n    int out_rate;\n    fir_filter *filter;\n    double rate_mul;\n    int out_length;\n    double *out_samples;\n} downsampler;\n\ndownsampler *downsampler_new(int in_rate, int out_rate, int filter_freq, int kernel_length) {\n    downsampler *d = calloc(1, sizeof(downsampler));\n    d->in_rate = in_rate;\n    d->out_rate = out_rate;\n    d->filter = fir_filter_new(in_rate, filter_freq, kernel_length);\n    d->rate_mul = in_rate / (double) out_rate;\n    d->out_length = 0;\n    d->out_samples = NULL;\n    return d;\n}\n\nvoid downsampler_process(downsampler *d, double *samples, int length) {\n    fir_filter_load(d->filter, samples, length);\n\n    free(d->out_samples);\n    d->out_length = floor(length / d->rate_mul);\n    d->out_samples = calloc(d->out_length, sizeof(double));\n\n    double t = 0;\n    for (int i = 0; i < d->out_length; i++) {\n        d->out_samples[i] = fir_filter_get(d->filter, floor(t));\n        t += d->rate_mul;\n    }\n}\n\nvoid downsampler_free(downsampler *d) {\n    fir_filter_free(d->filter);\n    free(d->out_samples);\n    free(d);\n}\n\n\ndouble cosine = 1;\ndouble sine = 0;\n\ndownsampler *downsampler_i;\ndownsampler *downsampler_q;\ndownsampler *downsampler_audio;\n\ndouble l_i = 0;\ndouble l_q = 0;\n\ndouble average(double *values, int length) {\n    double sum = 0;\n    for (int i = 0; i < length; i++) {\n        sum += values[i];\n    }\n    return sum / length;\n}\n\nvoid shift_frequency(double *samples_i, double *samples_q, int length, int freq_offset, int sample_rate, double *cosine_ptr, double *sine_ptr) {\n    double delta_cos = cos(TAU * freq_offset / (double) sample_rate);\n    double delta_sin = sin(TAU * freq_offset / (double) sample_rate);\n    double cosine = *cosine_ptr;\n    double sine = *sine_ptr;\n    for (int i = 0; i < length; i++) {\n        double vi = samples_i[i];\n        double vq = samples_q[i];\n        samples_i[i] = vi * cosine - vq * sine;\n        samples_q[i] = vi * sine + vq * cosine;\n        double new_sine = cosine * delta_sin + sine * delta_cos;\n        double new_cosine = cosine * delta_cos - sine * delta_sin;\n        sine = new_sine;\n        cosine = new_cosine;\n    }\n    *cosine_ptr = cosine;\n    *sine_ptr = sine;\n}\n\nvoid process_sample_block(uint8_t *buffer, size_t length) {\n    if (received_samples > DESIRED_OUT_SAMPLES) {\n        return;\n    }\n\n    double *samples_i = calloc(length, sizeof(double));\n    double *samples_q = calloc(length, sizeof(double));\n\n    // Convert to doubles\n    for (int i = 0; i < length; i++) {\n        unsigned int vi = buffer[i * 2];\n        unsigned int vq = buffer[i * 2 + 1];\n        samples_i[i] = vi / 128.0 - 0.995;\n        samples_q[i] = vq / 128.0 - 0.995;\n        //samples_i[i] = (vi - 128.0) / 256.0;\n        //samples_q[i] = (vq - 128.0) / 256.0;\n    }\n\n    // Shift frequency\n    shift_frequency(samples_i, samples_q, length, FREQ_OFFSET, IN_SAMPLE_RATE, &cosine, &sine);\n\n    // Downsample\n    downsampler_process(downsampler_i, samples_i, length);\n    downsampler_process(downsampler_q, samples_q, length);\n\n    // Demodulate\n    int out_length = downsampler_i->out_length;\n    double *demodulated = calloc(out_length, sizeof(double));\n\n    double prev = 0;\n    double difSqrSum = 0;\n\n    double AMPL_CONV = 336000 / (2 * M_PI * 75000);\n\n    for (int i = 0; i < out_length; i++) {\n        double real = l_i * downsampler_i->out_samples[i] + l_q * downsampler_q->out_samples[i];\n        double imag = l_i * downsampler_q->out_samples[i] - downsampler_i->out_samples[i] * l_q;\n        double sgn = 1;\n        if (imag < 0) {\n            sgn *= -1;\n            imag *= -1;\n        }\n        double ang = 0;\n        double div;\n        if (real == imag) {\n            div = 1;\n        } else if (real > imag) {\n            div = imag / real;\n        } else {\n            ang = -M_PI / 2;\n            div = real / imag;\n            sgn *= -1;\n        }\n        demodulated[i] = sgn *\n            (ang + div\n                / (0.98419158358617365\n                    + div * (0.093485702629671305\n                        + div * 0.19556307900617517))) * AMPL_CONV;\n        l_i = downsampler_i->out_samples[i];\n        l_q = downsampler_q->out_samples[i];\n        double dif = prev - demodulated[i];\n        difSqrSum += dif * dif;\n        prev = demodulated[i];\n    }\n\n    // Downsample again, for audio\n    downsampler_process(downsampler_audio, demodulated, out_length);\n\n    // Convert to signed 16-bit integers.\n    for (int i = 0; i < downsampler_audio->out_length; i++) {\n        if (received_samples > DESIRED_OUT_SAMPLES) {\n            break;\n        }\n        double f_sample = downsampler_audio->out_samples[i];\n        int16_t i_sample = f_sample * 32000;\n        audio_buffer_samples[received_samples++] = i_sample;\n    }\n\n    printf(\"Received %.1f%%\\n\", received_samples / (double) DESIRED_OUT_SAMPLES * 100);\n\n    if (received_samples > DESIRED_OUT_SAMPLES) {\n        // Write out the final sound as 16-bit signed PCM samples at 48000 Hz\n        // FILE *fp = fopen(\"out-out.raw\", \"w\");\n        // fwrite(audio_buffer_samples, sizeof(int16_t), received_samples * sizeof(ALshort), fp);\n        // fclose(fp);\n\n        alBufferData(audio_buffer, AL_BUFFER_FORMAT, audio_buffer_samples, received_samples * sizeof(ALshort), OUT_SAMPLE_RATE);\n        NAL_CHECK_ERROR();\n        alSourcei(source, AL_BUFFER, audio_buffer);\n        NAL_CHECK_ERROR();\n        alSourcePlay(source);\n        NAL_CHECK_ERROR();\n    }\n\n    free(samples_i);\n    free(samples_q);\n\n}\n\nint receive_sample_block(hackrf_transfer *transfer) {\n    process_sample_block(transfer->buffer, transfer->valid_length / 2);\n    return 0;\n}\n\nint main(int argc, char **argv) {\n    int status;\n    hackrf_device *hrf = NULL;\n\n    audio_buffer_samples = calloc(DESIRED_OUT_SAMPLES, sizeof(ALshort)); // We need a bit of extra data because we go over the buffer size.\n\n    // Initialize the audio context\n    ALCdevice *device = alcOpenDevice(NULL);\n    if (!device) {\n        fprintf(stderr, \"Could not open audio device.\\n\");\n        return 1;\n    }\n    ALCcontext *ctx = alcCreateContext(device, NULL);\n    alcMakeContextCurrent(ctx);\n\n    // Initialize an audio buffer\n    alGetError(); // clear error code\n    alGenBuffers(1, &audio_buffer);\n    NAL_CHECK_ERROR();\n\n    const int INTER_RATE = 336000;\n    const int  MAX_F = 75000;\n    const double FILTER = MAX_F * 0.8;\n\n    int filter_freq = FILTER * 0.8;\n    downsampler_i = downsampler_new(IN_SAMPLE_RATE, INTER_RATE, filter_freq, 51);\n    downsampler_q = downsampler_new(IN_SAMPLE_RATE, INTER_RATE, filter_freq, 51);\n\n    downsampler_audio = downsampler_new(INTER_RATE, OUT_SAMPLE_RATE, 10000, 41);\n\n    // Fill buffer with random data\n    //arc4random_buf(data, size);\n\n    // Initialize a source\n    alGenSources(1, &source);\n    NAL_CHECK_ERROR();\n\n    // Attach buffer to source\n    //alSourcei(source, AL_BUFFER, buffer);\n    //NAL_CHECK_ERROR();\n\n    // Play\n    //alSourcePlay(source);\n    //NAL_CHECK_ERROR();\n\n    char *fname = NULL;\n    if (argc == 2) {\n        fname = argv[1];\n    }\n\n    if (fname == NULL) {\n        // Live data\n        status = hackrf_init();\n        HACKRF_CHECK_STATUS(NULL, status, \"hackrf_init\");\n\n        status = hackrf_open(&hrf);\n        HACKRF_CHECK_STATUS(hrf, status, \"hackrf_open\");\n\n        status = hackrf_set_freq(hrf, CENTER_FREQ);\n        HACKRF_CHECK_STATUS(hrf, status, \"hackrf_set_freq\");\n\n        status = hackrf_set_sample_rate(hrf, IN_SAMPLE_RATE);\n        HACKRF_CHECK_STATUS(hrf, status, \"hackrf_set_sample_rate\");\n\n        status = hackrf_set_amp_enable(hrf, 0);\n        HACKRF_CHECK_STATUS(hrf, status, \"hackrf_set_amp_enable\");\n\n        status = hackrf_set_lna_gain(hrf, 32);\n        HACKRF_CHECK_STATUS(hrf, status, \"hackrf_set_lna_gain\");\n\n        status = hackrf_set_vga_gain(hrf, 30);\n        HACKRF_CHECK_STATUS(hrf, status, \"hackrf_set_lna_gain\");\n\n        status = hackrf_start_rx(hrf, receive_sample_block, NULL);\n        HACKRF_CHECK_STATUS(hrf, status, \"hackrf_start_rx\");\n\n        // Wait to receive data.\n        sleep(SECONDS);\n\n    } else {\n        FILE *fp = fopen(fname, \"r\");\n        fseek(fp, 0L, SEEK_END);\n        long size = ftell(fp);\n        rewind(fp);\n        uint8_t *file_buffer = calloc(size, 1);\n        fread(file_buffer, size, 1, fp);\n        fclose(fp);\n        process_sample_block(file_buffer, size / 2);\n    }\n\n    // Playing is asynchronous so wait a while\n    sleep(SECONDS);\n\n    // Cleanup\n    if (audio_buffer != -1) {\n        alDeleteBuffers(1, &audio_buffer);\n    }\n    alcMakeContextCurrent(NULL);\n    alcDestroyContext(ctx);\n    alcCloseDevice(device);\n\n    if (fname == NULL) {\n        hackrf_stop_rx(hrf);\n        hackrf_close(hrf);\n        hackrf_exit();\n    }\n    return 0;\n}\n"
  },
  {
    "path": "c/easypng.h",
    "content": "#include <stdlib.h>\n#include <stdio.h>\n#include <png.h>\n\n// Write a grayscale PNG image.\nstatic void write_gray_png(const char *fname, const int width, const int height, uint8_t *buffer) {\n    png_structp png_ptr = NULL;\n    png_infop info_ptr = NULL;\n    png_bytepp row_pointers;\n\n    FILE *fp = fopen(fname, \"wb\");\n    if (!fp) {\n        printf(\"ERROR: Could not write open file %s for writing.\\n\", fname);\n        return;\n    }\n\n    // Init PNG writer.\n    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);\n    if (png_ptr == NULL) {\n        printf(\"ERROR: png_create_write_struct.\\n\");\n        return;\n    }\n\n    info_ptr = png_create_info_struct(png_ptr);\n    if (info_ptr == NULL) {\n        printf(\"ERROR: png_create_info_struct.\\n\");\n        png_destroy_write_struct(&png_ptr, NULL);\n        return;\n    }\n\n    png_set_IHDR(png_ptr, info_ptr,\n                 width, height,\n                 8,\n                 PNG_COLOR_TYPE_GRAY,\n                 PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);\n\n    // PNG expects a list of pointers. We just calculate offsets into our buffer.\n    row_pointers = (png_bytepp) png_malloc(png_ptr, height * sizeof(png_bytep));\n    for (int y = 0; y < height; y++) {\n       row_pointers[y] = buffer + y * width;\n   }\n\n    // Write out the image data.\n    png_init_io(png_ptr, fp);\n    png_set_rows(png_ptr, info_ptr, row_pointers);\n    png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);\n\n    // Cleanup.\n    png_free(png_ptr, row_pointers);\n    png_destroy_write_struct(&png_ptr, &info_ptr);\n    fclose(fp);\n    printf(\"Written %s.\\n\", fname);\n}\n"
  },
  {
    "path": "c/fft-batch-broad.c",
    "content": "// Batch export of FFT data as images.\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <math.h>\n#include <string.h>\n\n#include <libhackrf/hackrf.h>\n#include <fftw3.h>\n\n#include \"easypng.h\"\n\nconst uint32_t FFT_SIZE = 256;\nconst uint32_t FFT_HISTORY_SIZE = 4096;\nconst uint32_t SAMPLES_SIZE = 131072;\nconst uint64_t FREQUENCY_START = 660.00001e6;\nconst uint64_t FREQUENCY_END = 3010.00001e6;\nconst uint32_t FREQUENCY_STEP = 5e6;\nconst uint32_t SAMPLE_RATE = 5e6;\nconst uint32_t SAMPLE_BLOCKS_TO_SKIP = 10;\nconst uint32_t EVALUATE_ROWS = 100;\n\nuint64_t frequency = FREQUENCY_START;\n\nfftw_complex *fft_in;\nfftw_complex *fft_out;\nfftw_complex *fft_history;\nint history_rows = 0;\nfftw_plan fft_plan;\nhackrf_device *device;\nint skip = SAMPLE_BLOCKS_TO_SKIP;\ntime_t start_time, end_time;\n\n// Utility ////////////////////////////////////////////////////////////////////\n\nuint8_t clamp_u8(int v, uint8_t min, uint8_t max) {\n    return (uint8_t) (v < min ? min : v > max ? max : v);\n}\n\n// HackRF /////////////////////////////////////////////////////////////////////\n\nstatic void hackrf_check_status(int status, const char *message, const char *file, int line) {\n    if (status != 0) {\n        fprintf(stderr, \"NRF HackRF fatal error: %s\\n\", message);\n        if (device != NULL) {\n            hackrf_close(device);\n        }\n        hackrf_exit();\n        exit(EXIT_FAILURE);\n    }\n}\n\n#define HACKRF_CHECK_STATUS(status, message) hackrf_check_status(status, message, __FILE__, __LINE__)\n\nint receive_sample_block(hackrf_transfer *transfer) {\n    uint64_t local_frequency = frequency;\n    if (skip > 0) {\n        skip--;\n        return 0;\n    }\n    if (history_rows >= FFT_HISTORY_SIZE) return 0;\n    int ii = 0;\n    for (int i = 0; i < SAMPLES_SIZE; i += 2) {\n        int vi = (transfer->buffer[i] + 128) % 256;\n        int vq = (transfer->buffer[i + 1] + 128) % 256;\n        fft_in[ii][0] = powf(-1, ii) * vi / 256.0;\n        fft_in[ii][1] = powf(-1, ii) * vq / 256.0;\n        ii++;\n    }\n    fftw_execute(fft_plan);\n\n    // Move one line down.\n    memcpy(fft_history + FFT_SIZE, fft_history, FFT_SIZE * (FFT_HISTORY_SIZE - 1) * sizeof(fftw_complex));\n    // Set the first line.\n    memcpy(fft_history, fft_out, FFT_SIZE * sizeof(fftw_complex));\n\n    history_rows++;\n\n    // Verify that there actually is some data before continuing.\n    if (history_rows == EVALUATE_ROWS) {\n        double total = 0;\n        int size = history_rows * FFT_SIZE;\n        for (int i = 0; i < size; i ++) {\n            double ci = fft_history[i][0];\n            double cq = fft_history[i][1];\n            double pwr = sqrt(ci * ci + cq * cq);\n            total += pwr;\n        }\n        double avg_pwr = total / (double) size;\n        printf(\"\\n(Average power: %.2f)\\n\", avg_pwr);\n        if (avg_pwr < 1.1) {\n            printf(\"Not interesting. Skipping...\\n\");\n            // Trigger exit condition.\n            history_rows = FFT_HISTORY_SIZE;\n            return 0;\n        }\n    }\n\n    printf(\"\\r%.f%%\", history_rows / (float)FFT_HISTORY_SIZE * 100);\n    fflush(stdout);\n    if (history_rows >= FFT_HISTORY_SIZE) {\n        printf(\"\\n\");\n        // Write image.\n        uint8_t *buffer = calloc(FFT_SIZE * FFT_HISTORY_SIZE, sizeof(uint8_t));\n        for (int y = 0; y < FFT_HISTORY_SIZE; y++) {\n            for (int x = 0; x < FFT_SIZE; x++) {\n                double ci = fft_history[y * FFT_SIZE + x][0];\n                double cq = fft_history[y * FFT_SIZE + x][1];\n                double pwr = ci * ci + cq * cq;\n                //double pwr_dbfs = 10.0 * log2(pwr + 1.0e-20) / log2(2.7182818284);\n                double pwr_dbfs = 10.0 * log10(pwr + 1.0e-20);\n                pwr_dbfs = pwr_dbfs * 5;\n                uint8_t v = clamp_u8(pwr_dbfs, 0, 255);\n                if (x == FFT_SIZE / 2) {\n                    v = buffer[y * FFT_SIZE + x - 1];\n                }\n                buffer[y * FFT_SIZE + x] = v;\n            }\n        }\n        char file_name[100];\n        snprintf(file_name, 100, \"broad-%.0f.png\", local_frequency / 1.0e6);\n        write_gray_png(file_name, FFT_SIZE, FFT_HISTORY_SIZE, buffer);\n\n        free(buffer);\n    }\n\n    return 0;\n}\n\nstatic void setup_hackrf() {\n    int status;\n\n    status = hackrf_init();\n    HACKRF_CHECK_STATUS(status, \"hackrf_init\");\n\n    status = hackrf_open(&device);\n    HACKRF_CHECK_STATUS(status, \"hackrf_open\");\n\n    status = hackrf_set_freq(device, frequency);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n\n    status = hackrf_set_sample_rate(device, SAMPLE_RATE);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_sample_rate\");\n\n    status = hackrf_set_amp_enable(device, 0);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_amp_enable\");\n\n    status = hackrf_set_lna_gain(device, 32);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_set_vga_gain(device, 40);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_start_rx(device, receive_sample_block, NULL);\n    HACKRF_CHECK_STATUS(status, \"hackrf_start_rx\");\n}\n\nstatic void teardown_hackrf() {\n    hackrf_stop_rx(device);\n    hackrf_close(device);\n    hackrf_exit();\n}\n\n// FFTW /////////////////////////////////////////////////////////////////////\n\nstatic void setup_fftw() {\n    fft_in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * SAMPLES_SIZE);\n    fft_out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * SAMPLES_SIZE);\n    fft_history = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * FFT_SIZE * FFT_HISTORY_SIZE);\n    fft_plan = fftw_plan_dft_1d(FFT_SIZE, fft_in, fft_out, FFTW_FORWARD, FFTW_ESTIMATE);\n}\n\nstatic void teardown_fftw() {\n    fftw_destroy_plan(fft_plan);\n    fftw_free(fft_in);\n    fftw_free(fft_out);\n    fftw_free(fft_history);\n}\n\n// Main /////////////////////////////////////////////////////////////////////\n\nint main(int argc, char **argv) {\n    setup_fftw();\n    setup_hackrf();\n    printf(\"Frequency: %.4f MHz\\n\", frequency / 1.0e6);\n    time(&start_time);\n\n    while (frequency <= FREQUENCY_END) {\n        while (history_rows < FFT_HISTORY_SIZE) {\n            sleep(1);\n        }\n\n        time(&end_time);\n        printf(\"Elapsed: %.0f seconds.\\n\", difftime(end_time, start_time));\n\n        frequency = frequency + FREQUENCY_STEP;\n        if (frequency > FREQUENCY_END) {\n            exit(0);\n        }\n\n        int status = hackrf_set_freq(device, frequency);\n        HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n\n        skip = SAMPLE_BLOCKS_TO_SKIP;\n        history_rows = 0;\n        printf(\"Frequency: %.4f MHz\\n\", frequency / 1.0e6);\n        time(&start_time);\n    }\n\n    teardown_hackrf();\n    teardown_fftw();\n\n    return 0;\n}\n"
  },
  {
    "path": "c/fft-batch.c",
    "content": "// Batch export of FFT data as images.\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <math.h>\n#include <string.h>\n\n#include <libhackrf/hackrf.h>\n#include <fftw3.h>\n\n#include \"easypng.h\"\n\nconst uint32_t FFT_SIZE = 1024;\nconst uint32_t FFT_HISTORY_SIZE = 16384;\nconst uint32_t SAMPLES_SIZE = 131072;\nconst uint64_t FREQUENCY_START = 2e6;\nconst uint64_t FREQUENCY_END = 148e6;\nconst uint32_t FREQUENCY_STEP = 2e6;\nconst uint32_t SAMPLE_RATE = 5e6;\nconst uint32_t SAMPLE_BLOCKS_TO_SKIP = 10;\n\nuint64_t frequency = FREQUENCY_START;\n\nfftw_complex *fft_in;\nfftw_complex *fft_out;\nfftw_complex *fft_history;\nint history_rows = 0;\nfftw_plan fft_plan;\nhackrf_device *device;\nint skip = SAMPLE_BLOCKS_TO_SKIP;\n\n// Utility ////////////////////////////////////////////////////////////////////\n\nuint8_t clamp_u8(int v, uint8_t min, uint8_t max) {\n    return (uint8_t) (v < min ? min : v > max ? max : v);\n}\n\n// HackRF /////////////////////////////////////////////////////////////////////\n\nstatic void hackrf_check_status(int status, const char *message, const char *file, int line) {\n    if (status != 0) {\n        fprintf(stderr, \"NRF HackRF fatal error: %s\\n\", message);\n        if (device != NULL) {\n            hackrf_close(device);\n        }\n        hackrf_exit();\n        exit(EXIT_FAILURE);\n    }\n}\n\n#define HACKRF_CHECK_STATUS(status, message) hackrf_check_status(status, message, __FILE__, __LINE__)\n\nint receive_sample_block(hackrf_transfer *transfer) {\n    uint64_t local_frequency = frequency;\n    if (skip > 0) {\n        skip--;\n        return 0;\n    }\n    if (history_rows >= FFT_HISTORY_SIZE) return 0;\n    int ii = 0;\n    for (int i = 0; i < SAMPLES_SIZE; i += 2) {\n        int vi = (transfer->buffer[i] + 128) % 256;\n        int vq = (transfer->buffer[i + 1] + 128) % 256;\n        fft_in[ii][0] = powf(-1, ii) * vi / 256.0;\n        fft_in[ii][1] = powf(-1, ii) * vq / 256.0;\n        ii++;\n    }\n    fftw_execute(fft_plan);\n\n    // Move one line down.\n    memcpy(fft_history + FFT_SIZE, fft_history, FFT_SIZE * (FFT_HISTORY_SIZE - 1) * sizeof(fftw_complex));\n    // Set the first line.\n    memcpy(fft_history, fft_out, FFT_SIZE * sizeof(fftw_complex));\n\n    history_rows++;\n    printf(\"\\r%.f%%\", history_rows / (float)FFT_HISTORY_SIZE * 100);\n    fflush(stdout);\n    if (history_rows >= FFT_HISTORY_SIZE) {\n        printf(\"\\n\");\n        // Write image.\n        uint8_t *buffer = calloc(FFT_SIZE * FFT_HISTORY_SIZE, sizeof(uint8_t));\n        for (int y = 0; y < FFT_HISTORY_SIZE; y++) {\n            for (int x = 0; x < FFT_SIZE; x++) {\n                double ci = fft_history[y * FFT_SIZE + x][0];\n                double cq = fft_history[y * FFT_SIZE + x][1];\n                double pwr = ci * ci + cq * cq;\n                //double pwr_dbfs = 10.0 * log2(pwr + 1.0e-20) / log2(2.7182818284);\n                double pwr_dbfs = 10.0 * log10(pwr + 1.0e-20);\n                pwr_dbfs = pwr_dbfs * 10;\n                uint8_t v = clamp_u8(pwr_dbfs, 0, 255);\n                buffer[y * FFT_SIZE + x] = v;\n            }\n        }\n        char file_name[100];\n        snprintf(file_name, 100, \"fft-%.4f.png\", local_frequency / 1.0e6);\n        write_gray_png(file_name, FFT_SIZE, FFT_HISTORY_SIZE, buffer);\n        free(buffer);\n    }\n\n    return 0;\n}\n\nstatic void setup_hackrf() {\n    int status;\n\n    status = hackrf_init();\n    HACKRF_CHECK_STATUS(status, \"hackrf_init\");\n\n    status = hackrf_open(&device);\n    HACKRF_CHECK_STATUS(status, \"hackrf_open\");\n\n    status = hackrf_set_freq(device, frequency);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n\n    status = hackrf_set_sample_rate(device, SAMPLE_RATE);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_sample_rate\");\n\n    status = hackrf_set_amp_enable(device, 0);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_amp_enable\");\n\n    status = hackrf_set_lna_gain(device, 32);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_set_vga_gain(device, 30);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_start_rx(device, receive_sample_block, NULL);\n    HACKRF_CHECK_STATUS(status, \"hackrf_start_rx\");\n}\n\nstatic void teardown_hackrf() {\n    hackrf_stop_rx(device);\n    hackrf_close(device);\n    hackrf_exit();\n}\n\n// FFTW /////////////////////////////////////////////////////////////////////\n\nstatic void setup_fftw() {\n    fft_in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * SAMPLES_SIZE);\n    fft_out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * SAMPLES_SIZE);\n    fft_history = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * FFT_SIZE * FFT_HISTORY_SIZE);\n    fft_plan = fftw_plan_dft_1d(FFT_SIZE, fft_in, fft_out, FFTW_FORWARD, FFTW_ESTIMATE);\n}\n\nstatic void teardown_fftw() {\n    fftw_destroy_plan(fft_plan);\n    fftw_free(fft_in);\n    fftw_free(fft_out);\n    fftw_free(fft_history);\n}\n\n// Main /////////////////////////////////////////////////////////////////////\n\nint main(int argc, char **argv) {\n    setup_fftw();\n    setup_hackrf();\n    printf(\"Frequency: %.4f MHz\\n\", frequency / 1.0e6);\n\n    while (frequency <= FREQUENCY_END) {\n        while (history_rows < FFT_HISTORY_SIZE) {\n            sleep(1);\n        }\n\n        frequency = frequency + FREQUENCY_STEP;\n        if (frequency > FREQUENCY_END) {\n            exit(0);\n        }\n\n        int status = hackrf_set_freq(device, frequency);\n        HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n\n        skip = SAMPLE_BLOCKS_TO_SKIP;\n        history_rows = 0;\n        printf(\"Frequency: %.4f MHz\\n\", frequency / 1.0e6);\n    }\n\n    teardown_hackrf();\n    teardown_fftw();\n\n    return 0;\n}\n"
  },
  {
    "path": "c/fft-stitch-broad.c",
    "content": "#include <assert.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <math.h>\n#include <string.h>\n\n#define STB_IMAGE_IMPLEMENTATION\n#include \"../externals/stb/stb_image.h\"\n#define STB_TRUETYPE_IMPLEMENTATION\n#include \"../externals/stb/stb_truetype.h\"\n\n#include \"easypng.h\"\n\n// Stitch FFT sweeps PNG\n\n\n\n\n// Utility //////////////////////////////////////////////////////////////////\n\nuint8_t max_u8(uint8_t a, uint8_t b) {\n    return a > b ? a : b;\n}\n\n// Image operations /////////////////////////////////////////////////////////\n\nvoid img_gray_copy(uint8_t *dst, uint8_t *src, uint32_t dst_x, uint32_t dst_y, uint32_t src_x, uint32_t src_y, uint32_t width, uint32_t height, uint32_t dst_stride, uint32_t src_stride) {\n    for (uint32_t i = 0; i < height; i++) {\n        for (uint32_t j = 0; j < width; j++) {\n            uint32_t dst_offset = (dst_y + i) * dst_stride + dst_x + j;\n            uint32_t src_offset = (src_y + i) * src_stride + src_x + j;\n            dst[dst_offset] = max_u8(dst[dst_offset], src[src_offset]);\n        }\n    }\n}\n\nvoid img_pixel_put(uint8_t *buffer, uint32_t stride, uint32_t x, uint32_t y, uint8_t v) {\n    if (x > 0 && y > 0) {\n        buffer[(y * stride) + x] = v;\n    }\n}\n\n// Main /////////////////////////////////////////////////////////////////////\n\nint main(int argc, char **argv) {\n    assert(argc == 3);\n\n    const uint32_t FFT_SIZE = 256;\n    const uint32_t FFT_HISTORY_SIZE = 4096;\n    const uint64_t FREQUENCY_START = atoi(argv[1]) * 1e6;\n    const uint64_t FREQUENCY_END = atoi(argv[2]) * 1e6;\n    const uint32_t FREQUENCY_STEP = 5e6;\n    const uint32_t SAMPLE_RATE = 5e6;\n\n    const uint32_t FREQUENCY_RANGE = (FREQUENCY_END - FREQUENCY_START) / FREQUENCY_STEP;\n    const uint32_t WIDTH_STEP = FFT_SIZE / (SAMPLE_RATE / FREQUENCY_STEP);\n    const uint32_t IMAGE_WIDTH = FFT_SIZE + (FREQUENCY_RANGE) * WIDTH_STEP;\n    const uint32_t IMAGE_HEIGHT = FFT_HISTORY_SIZE;\n\n    uint32_t image_height = IMAGE_HEIGHT;\n    printf(\"Frequency range: %.0f MHz - %.0f MHz\\n\", FREQUENCY_START / 1e6, FREQUENCY_END / 1e6);\n    printf(\"Image size: %d x %d\\n\", IMAGE_WIDTH, image_height);\n    uint8_t *buffer = calloc(IMAGE_WIDTH * image_height, sizeof(uint8_t));\n    uint32_t x = 0;\n    for (uint64_t frequency = FREQUENCY_START; frequency <= FREQUENCY_END; frequency += FREQUENCY_STEP) {\n        char file_name[100];\n        snprintf(file_name, 100, \"broad-%.0f.png\", frequency / 1.0e6);\n        printf(\"Composing %s...\\n\", file_name);\n\n        int width, height, n;\n        unsigned char *image_data = stbi_load(file_name, &width, &height, &n, 1);\n        if (!image_data) {\n            fprintf (stderr, \"ERROR: could not load %s\\n\", file_name);\n            exit(1);\n        }\n        if (width != FFT_SIZE || height < FFT_HISTORY_SIZE) {\n            fprintf (stderr, \"ERROR: bad image size %s\\n\", file_name);\n            exit(1);\n        }\n\n        // Compose image into buffer\n        img_gray_copy(buffer, image_data, x, 0, 0, 0, FFT_SIZE, FFT_HISTORY_SIZE, IMAGE_WIDTH, FFT_SIZE);\n\n        stbi_image_free(image_data);\n\n        x += WIDTH_STEP;\n    }\n\n    char out_file_name[100];\n    snprintf(out_file_name, 100, \"broad-stitched-%.0f-%.0f.png\", FREQUENCY_START / 1e6, FREQUENCY_END / 1e6);\n    printf(\"Saving %s...\\n\", out_file_name);\n\n    write_gray_png(out_file_name, IMAGE_WIDTH, image_height, buffer);\n    exit(0);\n}\n\n"
  },
  {
    "path": "c/fft-stitch.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <math.h>\n#include <string.h>\n\n#define STB_IMAGE_IMPLEMENTATION\n#include \"../externals/stb/stb_image.h\"\n#define STB_TRUETYPE_IMPLEMENTATION\n#include \"../externals/stb/stb_truetype.h\"\n\n#include \"easypng.h\"\n\n// Stitch FFT sweeps PNG\n\nconst uint32_t IMAGE_HEIGHT = 11811;\nconst uint32_t FOOTER_HEIGHT = 600;\nconst uint32_t FFT_SIZE = 1024;\nconst uint32_t FFT_HISTORY_SIZE = IMAGE_HEIGHT - FOOTER_HEIGHT;\nconst uint64_t FREQUENCY_START = 1802e6;\nconst uint64_t FREQUENCY_END = 2400e6;\nconst uint32_t FREQUENCY_STEP = 2e6;\n\nconst uint32_t SAMPLE_RATE = 5e6;\nconst uint32_t WIDTH_STEP = FFT_SIZE / (SAMPLE_RATE / FREQUENCY_STEP);\nconst uint32_t FREQUENCY_RANGE = (FREQUENCY_END - FREQUENCY_START) / FREQUENCY_STEP;\nconst uint32_t IMAGE_WIDTH = FFT_SIZE + (FREQUENCY_RANGE) * WIDTH_STEP;\nconst uint32_t MINOR_TICK_RATE = 0.1e6;\nconst double MINOR_TICK_SIZE = (FFT_SIZE / (double) FREQUENCY_STEP / 2) * MINOR_TICK_RATE;\nconst uint32_t MAJOR_TICK_RATE = 1e6;\nconst double MAJOR_TICK_SIZE = (FFT_SIZE / (double) FREQUENCY_STEP / 2) * MAJOR_TICK_RATE;\nconst uint8_t LINE_COLOR = 255;\nconst char* FONT_FILE = \"../fonts/RobotoCondensed-Regular.ttf\";\nconst uint16_t FONT_SIZE_PX = 48;\nconst uint32_t MARKERS_Y = FFT_HISTORY_SIZE + (FOOTER_HEIGHT / 2 - FONT_SIZE_PX / 2);\nconst uint32_t MARKERS_X = FFT_SIZE-SAMPLE_RATE / 2;\n\n// Utility //////////////////////////////////////////////////////////////////\n\nuint8_t max_u8(uint8_t a, uint8_t b) {\n    return a > b ? a : b;\n}\n\n// Image operations /////////////////////////////////////////////////////////\n\nvoid img_gray_copy(uint8_t *dst, uint8_t *src, uint32_t dst_x, uint32_t dst_y, uint32_t src_x, uint32_t src_y, uint32_t width, uint32_t height, uint32_t dst_stride, uint32_t src_stride) {\n    for (uint32_t i = 0; i < height; i++) {\n        for (uint32_t j = 0; j < width; j++) {\n            uint32_t dst_offset = (dst_y + i) * dst_stride + dst_x + j;\n            uint32_t src_offset = (src_y + i) * src_stride + src_x + j;\n            dst[dst_offset] = max_u8(dst[dst_offset], src[src_offset]);\n        }\n    }\n}\n\nvoid img_pixel_put(uint8_t *buffer, uint32_t stride, uint32_t x, uint32_t y, uint8_t v) {\n    if (x > 0 && y > 0) {\n        buffer[(y * stride) + x] = v;\n    }\n}\n\nvoid img_vline(uint8_t *buffer, uint32_t stride, uint32_t x1, uint32_t y1, uint32_t y2, uint8_t v) {\n    for (int y = y1; y < y2; y++) {\n        img_pixel_put(buffer, stride, x1, y, v);\n    }\n}\n\nvoid img_hline(uint8_t *buffer, uint32_t stride, uint32_t x1, uint32_t y1, uint32_t x2, uint8_t v) {\n    for (int x = x1; x < x2; x++) {\n        img_pixel_put(buffer, stride, x, y1, v);\n    }\n}\n\n// Font operations //////////////////////////////////////////////////////////\n\ntypedef struct {\n    stbtt_fontinfo font;\n    uint8_t *buffer;\n} ntt_font;\n\nntt_font *ntt_font_load(const char *font_file) {\n    ntt_font *font = calloc(1, sizeof(ntt_font));\n\n    FILE *fp = fopen(font_file, \"rb\");\n    fseek(fp, 0L, SEEK_END);\n    long size = ftell(fp);\n    rewind(fp);\n    font->buffer = calloc(size, 1);\n    fread(font->buffer, size, 1, fp);\n    fclose(fp);\n\n    stbtt_InitFont(&font->font, font->buffer, stbtt_GetFontOffsetForIndex(font->buffer, 0));\n    return font;\n}\n\n\nvoid ntt_font_measure(const ntt_font *font, const char *text, const int x, const int y, const int font_size, int *width, int *height) {\n    float font_scale = stbtt_ScaleForPixelHeight(&font->font, font_size);\n    int ascent, descent;\n    stbtt_GetFontVMetrics(&font->font, &ascent, &descent, 0);\n    int baseline = (int) (ascent * font_scale);\n    int descent_scaled = (int) (descent * font_scale);\n    //printf(\"Baseline %d descent %d\\n\", baseline, descent_scaled);\n\n    *width = x;\n    // The glyph height is constant for the font.\n    // Descent_scaled is negative.\n    *height = y + (baseline - descent_scaled);\n\n    int ch = 0;\n    while (text[ch]) {\n        int x0, y0, x1, y1;\n        int advance, lsb;\n        char c = text[ch];\n        stbtt_GetCodepointBitmapBox(&font->font, c, font_scale, font_scale, &x0, &y0, &x1, &y1);\n        stbtt_GetCodepointHMetrics(&font->font, c, &advance, &lsb);\n        int glyph_width = advance * font_scale;\n        *width += glyph_width;\n        if (text[ch + 1]) {\n            *width += font_scale * stbtt_GetCodepointKernAdvance(&font->font, c, text[ch + 1]);\n        }\n        ch++;\n    }\n}\n\nvoid ntt_font_draw(const ntt_font *font, uint8_t *img, const uint32_t img_stride, const char *text, const int x, const int y, const int font_size) {\n    int text_width, text_height;\n    ntt_font_measure(font, text, 0, 0, font_size, &text_width, &text_height);\n    int start_x = x - text_width / 2;\n    if (start_x < 0) return;\n\n    float font_scale = stbtt_ScaleForPixelHeight(&font->font, font_size);\n    int ascent;\n    stbtt_GetFontVMetrics(&font->font, &ascent, 0, 0);\n    int baseline = (int) (ascent * font_scale);\n\n    int ch = 0;\n    int _x = 0;\n    while (text[ch]) {\n        int w, h, dx, dy;\n        int advance, lsb;\n        char c = text[ch];\n        stbtt_GetCodepointHMetrics(&font->font, c, &advance, &lsb);\n        uint8_t *glyph_bitmap = stbtt_GetCodepointBitmap(&font->font, font_scale, font_scale, c, &w, &h, &dx, &dy);\n        //printf(\"Offset %d %d\\n\", dx, baseline + dy);\n        img_gray_copy(img, glyph_bitmap, start_x + _x + dx, y + baseline + dy, 0, 0, w, h, img_stride, w);\n        //x += w;\n        _x += (advance * font_scale);\n\n        if (text[ch + 1]) {\n            _x += font_scale * stbtt_GetCodepointKernAdvance(&font->font, c, text[ch + 1]);\n        }\n\n        ch++;\n    }\n}\n\n// Main /////////////////////////////////////////////////////////////////////\n\nint main() {\n    ntt_font *font = ntt_font_load(FONT_FILE);\n    uint32_t image_height = IMAGE_HEIGHT;\n    printf(\"Image size: %d x %d\\n\", IMAGE_WIDTH, image_height);\n    uint8_t *buffer = calloc(IMAGE_WIDTH * image_height, sizeof(uint8_t));\n    //memset(buffer, 128, IMAGE_WIDTH * image_height);\n    uint32_t x = 0;\n    for (uint32_t frequency = FREQUENCY_START; frequency <= FREQUENCY_END; frequency += FREQUENCY_STEP) {\n        char file_name[100];\n        snprintf(file_name, 100, \"fft-%.4f.png\", frequency / 1.0e6);\n        printf(\"Composing %s...\\n\", file_name);\n\n        int width, height, n;\n        unsigned char *image_data = stbi_load(file_name, &width, &height, &n, 1);\n        if (!image_data) {\n            fprintf (stderr, \"ERROR: could not load %s\\n\", file_name);\n            exit(1);\n        }\n        if (width != FFT_SIZE || height < FFT_HISTORY_SIZE) {\n            fprintf (stderr, \"ERROR: bad image size %s\\n\", file_name);\n            exit(1);\n        }\n\n        // Compose image into buffer\n        img_gray_copy(buffer, image_data, x, 0, 0, 0, FFT_SIZE, FFT_HISTORY_SIZE, IMAGE_WIDTH, FFT_SIZE);\n\n        stbi_image_free(image_data);\n\n        x += WIDTH_STEP;\n    }\n\n    printf(\"Adding markers...\\n\");\n\n    int banner_y = FFT_HISTORY_SIZE;\n    int banner_bottom = image_height;\n    for (int i = 0; i < 10; i++) {\n        img_hline(buffer, IMAGE_WIDTH, 0, banner_y++, IMAGE_WIDTH, LINE_COLOR);\n        img_hline(buffer, IMAGE_WIDTH, 0, banner_bottom--, IMAGE_WIDTH, LINE_COLOR);\n    }\n    banner_bottom++;\n\n    for (double x = 0; x < IMAGE_WIDTH; x += MINOR_TICK_SIZE) {\n        img_vline(buffer, IMAGE_WIDTH, x, banner_y, banner_y + 50, LINE_COLOR);\n        img_vline(buffer, IMAGE_WIDTH, x, banner_bottom - 50, banner_bottom, LINE_COLOR);\n    }\n\n    int freq = FREQUENCY_START - (SAMPLE_RATE / 2) + (MAJOR_TICK_RATE / 2);\n    double start_x = FFT_SIZE / (double) SAMPLE_RATE * (MAJOR_TICK_RATE / 2);\n    for (double x = start_x; x < IMAGE_WIDTH; x += MAJOR_TICK_SIZE) {\n        img_vline(buffer, IMAGE_WIDTH, x, banner_y, banner_y + 100, LINE_COLOR);\n        img_vline(buffer, IMAGE_WIDTH, x, banner_bottom - 100, banner_bottom, LINE_COLOR);\n        if (freq >= 0 && freq < FREQUENCY_END + (SAMPLE_RATE / 2)) {\n            char text[200];\n            snprintf(text, 200, \"%.2f\", (freq / (double) 1e6));\n            ntt_font_draw(font, buffer, IMAGE_WIDTH, text, x, MARKERS_Y, FONT_SIZE_PX);\n        }\n        freq += MAJOR_TICK_RATE;\n    }\n\n\n    char out_file_name[100];\n    snprintf(out_file_name, 100, \"fft-stitched-%.4f-%.4f.png\", FREQUENCY_START / 1e6, FREQUENCY_END / 1e6);\n    printf(\"Saving %s...\\n\", out_file_name);\n\n    write_gray_png(out_file_name, IMAGE_WIDTH, image_height, buffer);\n    exit(0);\n}\n\n"
  },
  {
    "path": "c/fft.c",
    "content": "// Perform FFT analysis on HackRF data.\n\n#include <GLFW/glfw3.h>\n#include <libhackrf/hackrf.h>\n#include <fftw3.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <math.h>\n#include <string.h>\n\n#define WIDTH 1024\n#define HEIGHT 1024\n#define BUFFER_SIZE (WIDTH * HEIGHT)\n#define FFT_SIZE 512\n\nfftw_complex *fft_in;\nfftw_complex *fft_out;\nfftw_plan fft_plan;\nGLfloat fft_real_buffer[FFT_SIZE];\nGLfloat buffer[WIDTH * HEIGHT];\n// byte_to_double_lut[256];\nhackrf_device *device;\ndouble freq_mhz = 88;\nGLFWwindow* window;\nGLuint texture_id;\nGLuint program;\nint paused = 0;\nint n_samples = 0;\nfloat intensity = 10.0;\ndouble freq_shift = 0.2;\ndouble intensity_shift = 0.5;\n\n// HackRF ///////////////////////////////////////////////////////////////////\n\n#define HACKRF_CHECK_STATUS(status, message) \\\n    if (status != 0) { \\\n        printf(\"FAIL: %s\\n\", message); \\\n        hackrf_close(device); \\\n        hackrf_exit(); \\\n        exit(EXIT_FAILURE); \\\n    } \\\n\nint receive_sample_block(hackrf_transfer *transfer) {\n    if (paused) return 0;\n    fftw_complex *p = fft_in;\n    int ii = 0;\n    for (int i = 0; i < 512 * 512; i += 2) {\n        fft_in[ii][0] = transfer->buffer[i] / 255.0;\n        fft_in[ii][1] = transfer->buffer[i + 1] / 255.0;\n        ii++;\n    }\n    fftw_execute(fft_plan);\n    return 0;\n}\n\nstatic void setup_hackrf() {\n    int status;\n\n    status = hackrf_init();\n    HACKRF_CHECK_STATUS(status, \"hackrf_init\");\n\n    status = hackrf_open(&device);\n    HACKRF_CHECK_STATUS(status, \"hackrf_open\");\n\n    status = hackrf_set_freq(device, freq_mhz * 1e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n\n    status = hackrf_set_sample_rate(device, 10e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_sample_rate\");\n\n    status = hackrf_set_amp_enable(device, 0);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_amp_enable\");\n\n    status = hackrf_set_lna_gain(device, 32);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_set_vga_gain(device, 30);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_start_rx(device, receive_sample_block, NULL);\n    HACKRF_CHECK_STATUS(status, \"hackrf_start_rx\");\n}\n\nstatic void teardown_hackrf() {\n    hackrf_stop_rx(device);\n    hackrf_close(device);\n    hackrf_exit();\n}\n\nstatic void set_frequency() {\n    freq_mhz = round(freq_mhz * 10.0) / 10.0;\n    printf(\"Seting freq to %f MHz.\\n\", freq_mhz);\n    int status = hackrf_set_freq(device, freq_mhz * 1e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n}\n\n// FFTW /////////////////////////////////////////////////////////////////////\n\nstatic void setup_fftw() {\n    fft_in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * BUFFER_SIZE);\n    fft_out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * BUFFER_SIZE);\n    fft_plan = fftw_plan_dft_1d(FFT_SIZE, fft_in, fft_out, FFTW_FORWARD, FFTW_MEASURE);\n}\n\nstatic void teardown_fftw() {\n    fftw_destroy_plan(fft_plan);\n    fftw_free(fft_in);\n    fftw_free(fft_out);\n}\n\n// OpenGL ///////////////////////////////////////////////////////////////////\n\nstatic void check_shader_error(GLuint shader) {\n    int length = 0;\n    int charsWritten  = 0;\n    char *infoLog;\n\n    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);\n\n    if (length > 0) {\n        char message[length];\n        glGetShaderInfoLog(shader, length, NULL, message);\n        printf(\"%s\\n\", message);\n    }\n}\n\nstatic void setup_gl() {\n    glGenTextures(1, &texture_id);\n    glBindTexture(GL_TEXTURE_2D, texture_id);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n\n    const char *vertex_shader_source =\n        \"void main(void) {\"\n        \"  gl_TexCoord[0] = gl_MultiTexCoord0;\"\n        \"  gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\"\n        \"}\";\n\n    const char *fragment_shader_source =\n        \"uniform sampler2D texture;\"\n        \"void main(void) {\"\n        \"  vec4 c = texture2D(texture, gl_TexCoord[0].st);\"\n        \"  float v = c.r;\"\n        \"  gl_FragColor = vec4(v, v, v, 1);\"\n        \"}\";\n\n    GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);\n    glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);\n    glCompileShader(vertex_shader);\n    check_shader_error(vertex_shader);\n\n    GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);\n    glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);\n    glCompileShader(fragment_shader);\n    check_shader_error(fragment_shader);\n\n    program = glCreateProgram();\n    glAttachShader(program, vertex_shader);\n    glAttachShader(program, fragment_shader);\n    glLinkProgram(program);\n\n    glActiveTexture(0);\n    GLuint u_texture = glGetUniformLocation(program, \"texture\");\n    glUniform1i(u_texture, texture_id);\n}\n\nstatic void prepare() {\n    int width, height;\n    glfwGetFramebufferSize(window, &width, &height);\n    glViewport(0, 0, width, height);\n    glClear(GL_COLOR_BUFFER_BIT);\n    glMatrixMode(GL_PROJECTION);\n    glLoadIdentity();\n    glOrtho(0, WIDTH, 0, HEIGHT, -1, 1);\n    glMatrixMode(GL_MODELVIEW);\n    glLoadIdentity();\n}\n\nstatic void update() {\n    if (paused) return;\n\n    for (int i = 0; i < FFT_SIZE; i++) {\n        fftw_complex *pt;\n        if (i < FFT_SIZE / 2) {\n            pt = &fft_out[FFT_SIZE / 2 + i];\n        } else {\n            pt = &fft_out[i - FFT_SIZE / 2];\n        }\n        *pt[0] /= (double) FFT_SIZE;\n        *pt[1] /= (double) FFT_SIZE;\n\n\n        double power = *pt[0] * *pt[0] + *pt[1] * *pt[1];\n        fft_real_buffer[i] = intensity * log10(power + 1.0e-20);\n    }\n\n    memset(buffer, 0, sizeof(GLfloat) * WIDTH * HEIGHT);\n\n    for (int i = 0; i < FFT_SIZE; i += 1) {\n        int ix = i;\n        double y = fft_real_buffer[i];\n        int iy = (int)(y  + HEIGHT / 2);\n        ix = ix < 0 ? 0 : ix > 512 ? 512 : ix;\n        iy = iy < 0 ? 0 : iy > 512 ? 512 : iy;\n        // Draw a line\n        for (int y = 0; y < iy; y++) {\n            int d = (y * 512) + ix;\n            buffer[d] = 255;\n        }\n    }\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, WIDTH, HEIGHT, 0, GL_RED, GL_FLOAT, buffer);\n}\n\nstatic void draw() {\n    glEnable(GL_TEXTURE_2D);\n    glEnable(GL_BLEND);\n    glBlendFunc(GL_ONE, GL_SRC_COLOR);\n\n    glUseProgram(program);\n    glBindTexture(GL_TEXTURE_2D, texture_id);\n    glBegin(GL_QUADS);\n    glTexCoord2f(0.0, 0.0);\n    glVertex2f(0, 0);\n    glTexCoord2f(1.0, 0.0);\n    glVertex2f(WIDTH, 0);\n    glTexCoord2f(1.0, 1.0);\n    glVertex2f(WIDTH, HEIGHT);\n    glTexCoord2f(0.0, 1.0);\n    glVertex2f(0, HEIGHT);\n    glEnd();\n    glUseProgram(0);\n}\n\nstatic void teardown_gl() {\n}\n\n// GLFW /////////////////////////////////////////////////////////////////////\n\nstatic void export() {\n    FILE *fp = fopen(\"out.raw\", \"wb\");\n    if (fp) {\n        fwrite(fft_out, BUFFER_SIZE, 1, fp);\n        fclose(fp);\n        printf(\"Written file.\\n\");\n    }\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {\n    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) {\n        glfwSetWindowShouldClose(window, GL_TRUE);\n    } else if (key == GLFW_KEY_RIGHT && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        freq_mhz += freq_shift;\n        set_frequency();\n    } else if (key == GLFW_KEY_LEFT && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        freq_mhz -= freq_shift;\n        set_frequency();\n    } else if (key == GLFW_KEY_SPACE && action == GLFW_PRESS) {\n        paused = !paused;\n    } else if (key == GLFW_KEY_E && action == GLFW_PRESS) {\n        export();\n    } else if (key == GLFW_KEY_EQUAL && action == GLFW_PRESS) {\n        intensity += intensity_shift;\n        printf(\"Intensity: %.2f\\n\", intensity);\n    } else if (key == GLFW_KEY_MINUS && action == GLFW_PRESS) {\n        intensity -= intensity_shift;\n        printf(\"Intensity: %.2f\\n\", intensity);\n    }\n}\n\nstatic void setup_glfw() {\n    if (!glfwInit()) {\n        exit(EXIT_FAILURE);\n    }\n    window = glfwCreateWindow(WIDTH, HEIGHT, \"HackRF\", NULL, NULL);\n    if (!window) {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n    glfwMakeContextCurrent(window);\n    glfwSetKeyCallback(window, key_callback);\n}\n\nstatic void teardown_glfw() {\n    glfwDestroyWindow(window);\n    glfwTerminate();\n}\n\n// Main /////////////////////////////////////////////////////////////////////\n\nint main(int argc, char **argv) {\n    setup_glfw();\n    setup_fftw();\n    setup_hackrf();\n    setup_gl();\n\n    while (!glfwWindowShouldClose(window)) {\n        prepare();\n        update();\n        draw();\n        glfwSwapBuffers(window);\n        glfwPollEvents();\n    }\n\n    teardown_gl();\n    teardown_hackrf();\n    teardown_fftw();\n    teardown_glfw();\n\n    return 0;\n}\n"
  },
  {
    "path": "c/gradual-noise.c",
    "content": "// Gradual noise movie.\n// Expects noise data files in ../rfdata/rf-x.xxx-big.raw\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <math.h>\n#include <string.h>\n\n#include \"easypng.h\"\n\nconst int BLOCK_SIZE_BYTES = 262144;\nconst int IMAGE_WIDTH = 1920;\nconst int IMAGE_HEIGHT = 1080;\nconst int IQ_SIZE = 256;\nconst int RF_BUFFER_SIZE = IMAGE_WIDTH * IMAGE_HEIGHT * 2;\nconst int IMAGE_BUFFER_SIZE = IMAGE_WIDTH * IMAGE_HEIGHT;\nconst int TOTAL_FRAMES = 20000;\nconst double INTERPOLATE_STEP = 0.01;\nconst double FREQ_MHZ_START = 1.0;\nconst double FREQ_MHZ_STEP = 0.01;\nconst double WIDTH_SCALE = IMAGE_WIDTH / (double) IQ_SIZE;\nconst double HEIGHT_SCALE = IMAGE_HEIGHT / (double) IQ_SIZE;\nconst double BLOCK_SCALE  = WIDTH_SCALE > HEIGHT_SCALE ? WIDTH_SCALE : HEIGHT_SCALE;\n\n// Modeled after half sine wave\ndouble sine_ease_in_out(double p) {\n    return 0.5 * (1 - cos(p * M_PI));\n}\n\n// Modeled after the piecewise quadratic\n// y = (1/2)((2x)^2)             ; [0, 0.5)\n// y = -(1/2)((2x-1)*(2x-3) - 1) ; [0.5, 1]\ndouble quadratic_ease_in_out(double p) {\n    if(p < 0.5) {\n        return 2 * p * p;\n    } else {\n        return (-2 * p * p) + (4 * p) - 1;\n    }\n}\n\n// Modeled after the piecewise quintic\n// y = (1/2)((2x)^5)       ; [0, 0.5)\n// y = (1/2)((2x-2)^5 + 2) ; [0.5, 1]\ndouble quintic_ease_in_out(double p) {\n    if (p < 0.5) {\n        return 16 * p * p * p * p * p;\n    } else {\n        double f = ((2 * p) - 2);\n        return  0.5 * f * f * f * f * f + 1;\n    }\n}\n\ndouble lerp(double a, double b, double t) {\n    t = sine_ease_in_out(t);\n    return a * (1.0 - t) + b * t;\n}\n\ndouble clamp(double v, double min, double max) {\n    return v < min ? min : v > max ? max : v;\n}\n\nvoid read_buffer(uint8_t *dst, double freq_mhz) {\n    char fname[100];\n    snprintf(fname, 100, \"../rftmp/rf-%.3f-big.raw\", freq_mhz);\n    FILE *fp = fopen(fname, \"r\");\n    fread(dst, RF_BUFFER_SIZE, 1, fp);\n    fclose(fp);\n}\n\nstatic inline void put_pixel(uint8_t *image_buffer, int x, int y, uint8_t color) {\n    if (x >= IMAGE_WIDTH || y >= IMAGE_HEIGHT) return;\n    int offset = y * IMAGE_WIDTH + x;\n    image_buffer[offset] = color;\n}\n\nstatic inline void put_block(uint8_t *image_buffer, int x, int y, uint8_t color) {\n    for (int dy = 0; dy < BLOCK_SCALE; dy++) {\n        for (int dx = 0; dx < BLOCK_SCALE; dx++) {\n            put_pixel(image_buffer, x * BLOCK_SCALE + dx, y * BLOCK_SCALE + dy, color);\n        }\n    }\n}\n\nint main() {\n    double freq_mhz = FREQ_MHZ_START;\n    double t = 0.0;\n\n    uint8_t *rf_buffer_a = calloc(RF_BUFFER_SIZE, 1);\n    uint8_t *rf_buffer_b = calloc(RF_BUFFER_SIZE, 1);\n    uint8_t *image_buffer = calloc(IMAGE_BUFFER_SIZE, 1);\n\n    read_buffer(rf_buffer_a, freq_mhz);\n    read_buffer(rf_buffer_b, freq_mhz + FREQ_MHZ_STEP);\n\n    for (int frame = 1; frame <= TOTAL_FRAMES; frame++) {\n        int i = 0;\n        for (int y = 0; y < IQ_SIZE; y++) {\n            for (int x = 0; x < IQ_SIZE; x++) {\n                int ai = (rf_buffer_a[i] + 128) % 256;\n                int bi = (rf_buffer_b[i] + 128) % 256;\n                double pwr = lerp(ai, bi, t);\n                int color = clamp(pwr, 0, 255);\n                put_block(image_buffer, x, y, color);\n                i += 2;\n            }\n        }\n\n        char fname[100];\n        snprintf(fname, 100, \"_export/noise-%d.png\", frame);\n        write_gray_png(fname, IMAGE_WIDTH, IMAGE_HEIGHT, image_buffer);\n\n        t += INTERPOLATE_STEP;\n\n        if (t >= 1.0) {\n            t = 0.0;\n            freq_mhz += FREQ_MHZ_STEP;\n            printf(\"Frequency: %.3f\\n\", freq_mhz);\n            read_buffer(rf_buffer_a, freq_mhz);\n            read_buffer(rf_buffer_b, freq_mhz + FREQ_MHZ_STEP);\n        }\n    }\n}\n"
  },
  {
    "path": "c/gridvis.c",
    "content": "// 3D visualization of spectrum\n\n#include <GLFW/glfw3.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <libhackrf/hackrf.h>\n#include <unistd.h>\n#include <string.h>\n#include <math.h>\n#include <png.h>\n#include <OpenGL/glu.h>\n\n#define WIDTH 800\n#define HEIGHT 600\n\n\nGLFWwindow* window;\nGLuint texture_id;\nGLuint program;\nuint8_t buffer[512 * 512];\nhackrf_device *device;\ndouble freq_mhz = 124.2;\nint paused = 0;\nfloat camera_x = 112;\nfloat camera_y = 40;\nfloat camera_z = -50;\n\n#define HAVE_HACKRF\n\n\n#define HACKRF_CHECK_STATUS(status, message) \\\n    if (status != 0) { \\\n        printf(\"FAIL: %s\\n\", message); \\\n        hackrf_close(device); \\\n        hackrf_exit(); \\\n        exit(EXIT_FAILURE); \\\n    } \\\n\nint receive_sample_block(hackrf_transfer *transfer) {\n    if (paused) return 0;\n    for (int idx = 0; idx < transfer->valid_length; idx += 2) {\n        double i = transfer->buffer[idx] / 255.0;\n        double q = transfer->buffer[idx + 1] / 255.0;\n        double v = sqrt(i * i + q * q);\n\n\n\n        // double v = transfer->buffer[i + 1] / 255.0;\n        // if (v <= 0.05) {\n        //     v *= 10.0;\n        // } else if (v >= 0.95) {\n        //     v = 0.5 + (v - 0.95) * 10.0;\n        // }\n        uint8_t vi = (uint8_t) round(v * 255);\n        buffer[idx] = vi;\n        buffer[idx + 1] = vi;\n    }\n    return 0;\n}\n\nstatic void setup_fake() {\n\tchar *fname = \"img.raw\";\n    FILE *fp = fopen(fname, \"rb\");\n    if (!fp) {\n        printf(\"ERROR: Could not write open file %s.\\n\", fname);\n        exit(EXIT_FAILURE);\n    }\n    fread(buffer, 512 * 512, 1, fp);\n    fclose(fp);\n}\n\nstatic void setup_hackrf() {\n    int status;\n\n    status = hackrf_init();\n    HACKRF_CHECK_STATUS(status, \"hackrf_init\");\n\n    status = hackrf_open(&device);\n    HACKRF_CHECK_STATUS(status, \"hackrf_open\");\n\n    status = hackrf_set_freq(device, freq_mhz * 1e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n\n    status = hackrf_set_sample_rate(device, 8e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_sample_rate\");\n\n    status = hackrf_set_amp_enable(device, 0);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_amp_enable\");\n\n    status = hackrf_set_lna_gain(device, 32);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_set_vga_gain(device, 30);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_start_rx(device, receive_sample_block, NULL);\n    HACKRF_CHECK_STATUS(status, \"hackrf_start_rx\");\n\n    memset(buffer, 0, 512 * 512);\n\n    //status = hackrf_set_freq(device, freq_mhz * 1e6);\n    //HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n}\n\nstatic void set_frequency() {\n    #if defined(HAVE_HACKRF)\n    freq_mhz = round(freq_mhz * 1000.0) / 1000.0;\n    printf(\"Seting freq to %f MHz.\\n\", freq_mhz);\n    int status = hackrf_set_freq(device, freq_mhz * 1e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n    #endif\n}\n\nstatic void teardown_hackrf() {\n    hackrf_stop_rx(device);\n    hackrf_close(device);\n    hackrf_exit();\n}\n\nstatic void check_shader_error(char *prefix, GLuint shader) {\n    int length = 0;\n    int charsWritten  = 0;\n    char *infoLog;\n\n    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);\n\n    if (length > 0) {\n        char message[length];\n        glGetShaderInfoLog(shader, length, NULL, message);\n        printf(\"%s: %s\\n\", prefix, message);\n        exit(EXIT_FAILURE);\n    }\n}\n\nstatic void setup() {\n    glEnable(GL_DEPTH_TEST);\n    const char *vertex_shader_source =\n        \"#extension GL_EXT_gpu_shader4 : require\\n\"\n        \"\\n\"\n        \"vec4 light_pos = vec4(0, 4, 0, 1);\\n\"\n        \"vec3 light_color = vec3(1.5, 0.5, 5);\\n\"\n        \"vec3 diffuse_reflectivity = vec3(1.0, 1.0, 1.0);\\n\"\n        \"flat varying vec3 color;\\n\"\n        \"\\n\"\n        \"void main(void) {\\n\"\n        \"  vec3 normal_dir = normalize(gl_NormalMatrix * gl_Normal);\\n\"\n        \"  vec4 eye_coords = gl_ModelViewMatrix * gl_Vertex;\\n\"\n        \"  vec3 s = normalize(vec3(light_pos - eye_coords));\\n\"\n        \"  color = light_color * diffuse_reflectivity * max(0.0, dot(s, normal_dir));\\n\"\n        \"  gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\\n\"\n        //\"  normal = vec3(0, 0, 0);\"\n        \"}\\n\";\n\n    const char *fragment_shader_source =\n        \"#extension GL_EXT_gpu_shader4 : require\\n\"\n        \"\\n\"\n        \"flat varying vec3 color;\\n\"\n        \"\\n\"\n        \"void main(void) {\\n\"\n        \"  gl_FragColor = vec4(color, 0.8);\\n\"\n        //\"  gl_FragColor = vec4(0.5, 0.5, 1, 0.1);\"\n        \"}\\n\";\n\n    GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);\n    glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);\n    glCompileShader(vertex_shader);\n    check_shader_error(\"V\", vertex_shader);\n\n    GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);\n    glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);\n    glCompileShader(fragment_shader);\n    check_shader_error(\"F\", fragment_shader);\n\n    program = glCreateProgram();\n    glAttachShader(program, vertex_shader);\n    glAttachShader(program, fragment_shader);\n    glLinkProgram(program);\n\n    // glActiveTexture(0);\n    // GLuint u_texture = glGetUniformLocation(program, \"texture\");\n    // glUniform1i(u_texture, texture_id);\n}\n\nstatic void prepare() {\n    int width, height;\n    glfwGetFramebufferSize(window, &width, &height);\n    glViewport(0, 0, width, height);\n    glClearColor(1, 1, 0.93, 1);\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n    glMatrixMode(GL_PROJECTION);\n    glLoadIdentity();\n    //glFrustum( -1.0, 1.0, -1.0, 1.0, 1.0, 102.0 );\n    gluPerspective(80.0, width / height, 1, 5000);\n    //glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);\n\n    //glOrtho(0, WIDTH, 0, HEIGHT, -1, 1);\n    glMatrixMode(GL_MODELVIEW);\n    glLoadIdentity();\n    gluLookAt(camera_x, camera_y, camera_z, 0, 0, 0, 0, 1, 0);\n    //glTranslatef(camera_x, camera_y, camera_z);\n\n    glShadeModel(GL_FLAT);\n    glEnable(GL_BLEND);\n    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n\n\n    glEnable(GL_LIGHTING);\n    glEnable(GL_COLOR_MATERIAL);\n\n    glEnable(GL_LIGHT0);\n    GLfloat light0_position[] = {10.0, 10.0, 0.0, 1.0};\n\n    GLfloat light0_ambient[] = {0.0, 0.0, 0.0, 1.0};\n    GLfloat light0_diffuse[] = {1.0, 1.0, 1.0, 1.0};\n    GLfloat light0_specular[] = {1.0, 1.0, 1.0, 1.0};\n    glLightfv(GL_LIGHT1, GL_POSITION, light0_position);\n    glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient);\n    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);\n    glLightfv(GL_LIGHT0, GL_SPECULAR, light0_specular);\n\n    glEnable(GL_LIGHT1);\n    GLfloat light1_ambient[] = {0.8, 0.8, 0.8, 1.0};\n\n    // glEnable(GL_FOG);\n    // float fog_color[3] = {1.0, 1.0, 0.93};\n    // glFogfv(GL_FOG_COLOR, fog_color);\n    // glFogi(GL_FOG_MODE, GL_LINEAR);\n    // glFogf(GL_FOG_START, 100.f);\n    // glFogf(GL_FOG_END, 110.f);\n}\n\n\n\nstatic void update() {\n    //glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, 512, 512, 0, GL_RED, GL_UNSIGNED_BYTE, buffer);\n}\n\nstatic void draw() {\n    // Draw simple ground plane\n    // int ground_size = 10;\n    // glColor4f(1, 1, 1, 0.3);\n    // glBegin(GL_QUADS);\n    // glVertex3f(-ground_size, 0, -ground_size);\n    // glVertex3f(-ground_size, 0, ground_size);\n    // glVertex3f(ground_size, 0, ground_size);\n    // glVertex3f(ground_size, 0, -ground_size);\n    // glEnd();\n\n    GLdouble vertices[256 * 256 * 3];\n    GLdouble normals[256 * 256 * 3];\n    GLushort indices[255 * 255 * 6];\n    GLubyte colors[255 * 255 * 6];\n\n    int vi = 0;\n    int ni = 0;\n    for (int y = 0; y < 256; y += 1) {\n        for (int x = 0; x < 256; x += 1) {\n            vertices[vi++] = (x - 128);\n            //vertices[vi++] =  sin(x / 5.0) + cos(y / 7.0) * 10.2;\n            vertices[vi++] =  buffer[(y * 256) + x] / 100.0;\n            vertices[vi++] = (y - 128);\n            //printf(\"%3.1f %3.1f %3.1f\\n\", points[i-3], points[i-2], points[i-1]);\n            normals[ni++] = 0.0;\n            normals[ni++] = 0;\n            normals[ni++] = 0.0;\n        }\n    }\n\n    int ii = 0;\n    int ci = 0;\n    for (int y = 0; y < 255; y += 1) {\n        for (int x = 0; x < 255; x += 1) {\n            indices[ii++] = (y * 256) + x;\n            indices[ii++] = ((y + 1) * 256) + x;\n            indices[ii++] = ((y + 1) * 256) + (x + 1);\n\n            colors[ci++] = 0; //x % 255;\n            colors[ci++] = 0; //y % 255;\n            colors[ci++] = 0; //220;\n\n            indices[ii++] = (y * 256) + x;\n            indices[ii++] = ((y + 1) * 256) + (x + 1);\n            indices[ii++] = (y * 256) + (x + 1);\n\n            colors[ci++] = 0; //y % 255;\n            colors[ci++] = 0; // x % 255;\n            colors[ci++] = 0; //240;\n\n        }\n    }\n\n    glColor4f(1, 0, 1, 1);\n    glUseProgram(program);\n    //glUseProgram(0);\n    glPointSize(2);\n    glEnableClientState(GL_VERTEX_ARRAY);\n    glEnableClientState(GL_NORMAL_ARRAY);\n    glEnableClientState(GL_COLOR_ARRAY);\n    glVertexPointer(3, GL_DOUBLE, 0, vertices);\n    glNormalPointer(GL_DOUBLE, 0, normals);\n    glColorPointer(3, GL_UNSIGNED_BYTE, 0, colors);\n    //glDrawElements(GL_TRIANGLES, 255 * 255 * 6, GL_UNSIGNED_SHORT, indices);\n    glDrawArrays(GL_POINTS, 0, 256 * 256);\n    glDisableClientState(GL_COLOR_ARRAY);\n    glDisableClientState(GL_NORMAL_ARRAY);\n    glDisableClientState(GL_VERTEX_ARRAY);\n    glUseProgram(0);\n\n\n    // glEnable(GL_TEXTURE_2D);\n    // glBlendFunc(GL_ONE, GL_SRC_COLOR);\n\n    // glBindTexture(GL_TEXTURE_2D, texture_id);\n    // glBegin(GL_QUADS);\n    // glTexCoord2f(0.0, 0.0);\n    // glVertex2f(0, 0);\n    // glTexCoord2f(1.0, 0.0);\n    // glVertex2f(WIDTH, 0);\n    // glTexCoord2f(1.0, 1.0);\n    // glVertex2f(WIDTH, HEIGHT);\n    // glTexCoord2f(0.0, 1.0);\n    // glVertex2f(0, HEIGHT);\n    // glEnd();\n    // glUseProgram(0);\n}\n\nstatic void error_callback(int error, const char* description) {\n    fputs(description, stderr);\n}\n\nstatic void print_camera_pos() {\n    printf(\"Camera: %.1f %.1f %.1f\\n\", camera_x, camera_y, camera_z);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {\n    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) {\n        glfwSetWindowShouldClose(window, GL_TRUE);\n    } else if (key == GLFW_KEY_W && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        camera_z += 1;\n        print_camera_pos();\n    } else if (key == GLFW_KEY_S && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        camera_z -= 1;\n        print_camera_pos();\n    } else if (key == GLFW_KEY_A && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        camera_x -= 1;\n        print_camera_pos();\n    } else if (key == GLFW_KEY_D && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        camera_x += 1;\n        print_camera_pos();\n    } else if (key == GLFW_KEY_Q && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        camera_y += 1;\n        print_camera_pos();\n    } else if (key == GLFW_KEY_E && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        camera_y -= 1;\n        print_camera_pos();\n    } else if (key == GLFW_KEY_RIGHT && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        freq_mhz += 0.01;\n        set_frequency();\n    } else if (key == GLFW_KEY_LEFT && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        freq_mhz -= 0.01;\n        set_frequency();\n    } else if (key == GLFW_KEY_SPACE && action == GLFW_PRESS) {\n        paused = !paused;\n    }\n}\n\nint main(void) {\n    glfwSetErrorCallback(error_callback);\n    if (!glfwInit()) {\n        exit(EXIT_FAILURE);\n    }\n    window = glfwCreateWindow(WIDTH, HEIGHT, \"Frequensea\", NULL, NULL);\n    if (!window) {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n    glfwMakeContextCurrent(window);\n    glfwSetKeyCallback(window, key_callback);\n    #if defined(HAVE_HACKRF)\n        setup_hackrf();\n    #else\n        setup_fake();\n    #endif\n    setup();\n    while (!glfwWindowShouldClose(window)) {\n        prepare();\n        update();\n        draw();\n        glfwSwapBuffers(window);\n        glfwPollEvents();\n    }\n    #if defined(HAVE_HACKRF)\n        teardown_hackrf();\n    #endif\n    glfwDestroyWindow(window);\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n"
  },
  {
    "path": "c/iq-lines.c",
    "content": "// Slowly show a single sample, frame by frame. Used for exporting to movie.\n\n#include <assert.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <math.h>\n#include <string.h>\n#include <pthread.h>\n\n#include <libhackrf/hackrf.h>\n#include <GLFW/glfw3.h>\n\n#include \"easypng.h\"\n\nconst int SAMPLES_STEP = 100;\nconst int IQ_RESOLUTION = 256;\nconst int SIZE_MULTIPLIER = 4;\nconst int WIDTH = IQ_RESOLUTION * SIZE_MULTIPLIER;\nconst int HEIGHT = IQ_RESOLUTION * SIZE_MULTIPLIER;\nconst int SAMPLE_BUFFER_SIZE = 262144;\n\nhackrf_device *device;\ndouble freq_mhz = 124.2;\n\npthread_mutex_t data_mutex;\nuint8_t *sample_buffer;\nuint8_t *image_buffer;\n\nGLFWwindow* window;\nGLuint texture_id;\nGLuint program;\n\nint line_intensity = 4;\nfloat line_percentage = 1.0;\n\n// Utility ////////////////////////////////////////////////////////////////////\n\nfloat clampf(float v, float min, float max) {\n    return v < min ? min : v > max ? max : v;\n}\n\n// HackRF /////////////////////////////////////////////////////////////////////\n\nvoid hackrf_check_status(int status, const char *message, const char *file, int line) {\n    if (status != 0) {\n        fprintf(stderr, \"NRF HackRF fatal error: %s\\n\", message);\n        if (device != NULL) {\n            hackrf_close(device);\n        }\n        hackrf_exit();\n        exit(EXIT_FAILURE);\n    }\n}\n\n#define HACKRF_CHECK_STATUS(status, message) hackrf_check_status(status, message, __FILE__, __LINE__)\n\nint receive_sample_block(hackrf_transfer *transfer) {\n    assert(SAMPLE_BUFFER_SIZE == transfer->valid_length);\n    pthread_mutex_lock(&data_mutex);\n    memcpy(sample_buffer, transfer->buffer, SAMPLE_BUFFER_SIZE);\n    pthread_mutex_unlock(&data_mutex);\n    return 0;\n}\n\nstatic void setup_hackrf() {\n    int status;\n\n    status = hackrf_init();\n    HACKRF_CHECK_STATUS(status, \"hackrf_init\");\n\n    status = hackrf_open(&device);\n    HACKRF_CHECK_STATUS(status, \"hackrf_open\");\n\n    status = hackrf_set_freq(device, freq_mhz * 1e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n\n    status = hackrf_set_sample_rate(device, 10e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_sample_rate\");\n\n    status = hackrf_set_amp_enable(device, 0);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_amp_enable\");\n\n    status = hackrf_set_lna_gain(device, 32);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_set_vga_gain(device, 30);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_start_rx(device, receive_sample_block, NULL);\n    HACKRF_CHECK_STATUS(status, \"hackrf_start_rx\");\n\n    //memset(buffer, 0, WIDTH * HEIGHT);\n\n    //status = hackrf_set_freq(device, freq_mhz * 1e6);\n    //HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n}\n\nstatic void teardown_hackrf() {\n    hackrf_stop_rx(device);\n    hackrf_close(device);\n    hackrf_exit();\n}\n\nstatic void set_frequency() {\n    freq_mhz = freq_mhz < 1 ? 1 : freq_mhz > 6000 ? 6000 : freq_mhz;\n    freq_mhz = round(freq_mhz * 1000.0) / 1000.0;\n    printf(\"Seting freq to %f MHz.\\n\", freq_mhz);\n    int status = hackrf_set_freq(device, freq_mhz * 1e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n}\n\n// Line drawing ///////////////////////////////////////////////////////////////\n\nvoid pixel_put(uint8_t *image_buffer, int x, int y, int color) {\n    int offset = y * WIDTH + x;\n    image_buffer[offset] = color;\n}\n\nvoid pixel_inc(uint8_t *image_buffer, int x, int y) {\n    static int have_warned = 0;\n    int offset = y * WIDTH + x;\n    int v = image_buffer[offset];\n    if (v + line_intensity >= 255) {\n        if (!have_warned) {\n            fprintf(stderr, \"WARN: pixel value out of range (%d, %d)\\n\", x, y);\n            have_warned = 1;\n        }\n    } else {\n        v += line_intensity;\n        image_buffer[offset] = v;\n    }\n}\n\nvoid draw_line(uint8_t *image_buffer, int x1, int y1, int x2, int y2, int color) {\n  int dx = abs(x2 - x1);\n  int sx = x1 < x2 ? 1 : -1;\n  int dy = abs(y2-y1);\n  int sy = y1 < y2 ? 1 : -1;\n  int err = (dx > dy ? dx : -dy) / 2;\n  int e2;\n\n  for(;;){\n    pixel_inc(image_buffer, x1, y1);\n    if (x1 == x2 && y1 == y2) break;\n    e2 = err;\n    if (e2 > -dx) { err -= dy; x1 += sx; }\n    if (e2 <  dy) { err += dx; y1 += sy; }\n  }\n}\n\nstatic void update_image_buffer() {\n    pthread_mutex_lock(&data_mutex);\n    memset(image_buffer, 0, WIDTH * HEIGHT * sizeof(uint8_t));\n    int x1 = 0;\n    int y1 = 0;\n    int max = SAMPLE_BUFFER_SIZE * line_percentage;\n    for (int i = 0; i < max; i += 2) {\n        int x2 = (sample_buffer[i] + 128) % 256;\n        int y2 = (sample_buffer[i + 1] + 128) % 256;\n        if (i > 0) {\n            draw_line(image_buffer, x1 * SIZE_MULTIPLIER, y1 * SIZE_MULTIPLIER, x2 * SIZE_MULTIPLIER, y2 * SIZE_MULTIPLIER, 0);\n        }\n        x1 = x2;\n        y1 = y2;\n    }\n    pthread_mutex_unlock(&data_mutex);\n}\n\n// OpenGL /////////////////////////////////////////////////////////////////////\n\nstatic void check_shader_error(GLuint shader) {\n    int length = 0;\n    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);\n\n    if (length > 0) {\n        char message[length];\n        glGetShaderInfoLog(shader, length, NULL, message);\n        printf(\"%s\\n\", message);\n    }\n}\n\nstatic void setup() {\n    glGenTextures(1, &texture_id);\n    glBindTexture(GL_TEXTURE_2D, texture_id);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n\n    const char *vertex_shader_source =\n        \"void main(void) {\"\n        \"  gl_TexCoord[0] = gl_MultiTexCoord0;\"\n        \"  gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\"\n        \"}\";\n\n    const char *fragment_shader_source =\n        \"uniform sampler2D texture;\"\n        \"void main(void) {\"\n        \"  vec4 c = texture2D(texture, gl_TexCoord[0].st);\"\n        \"  float v = c.r;\"\n        \"  gl_FragColor = vec4(v, v, v, 1);\"\n        \"}\";\n\n    GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);\n    glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);\n    glCompileShader(vertex_shader);\n    check_shader_error(vertex_shader);\n\n    GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);\n    glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);\n    glCompileShader(fragment_shader);\n    check_shader_error(fragment_shader);\n\n    program = glCreateProgram();\n    glAttachShader(program, vertex_shader);\n    glAttachShader(program, fragment_shader);\n    glLinkProgram(program);\n\n    glActiveTexture(0);\n    GLuint u_texture = glGetUniformLocation(program, \"texture\");\n    glUniform1i(u_texture, texture_id);\n}\n\n\nstatic void prepare() {\n    int width, height;\n    glfwGetFramebufferSize(window, &width, &height);\n    glViewport(0, 0, width, height);\n    glClear(GL_COLOR_BUFFER_BIT);\n    glMatrixMode(GL_PROJECTION);\n    glLoadIdentity();\n    glOrtho(0, WIDTH, 0, HEIGHT, -1, 1);\n    glMatrixMode(GL_MODELVIEW);\n    glLoadIdentity();\n}\n\n\nstatic void update() {\n    update_image_buffer();\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, WIDTH, HEIGHT, 0, GL_RED, GL_UNSIGNED_BYTE, image_buffer);\n}\n\nstatic void draw() {\n    glEnable(GL_TEXTURE_2D);\n    glEnable(GL_BLEND);\n    glBlendFunc(GL_ONE, GL_SRC_COLOR);\n\n    glUseProgram(program);\n    glBindTexture(GL_TEXTURE_2D, texture_id);\n    glBegin(GL_QUADS);\n    glTexCoord2f(0.0, 0.0);\n    glVertex2f(0, 0);\n    glTexCoord2f(1.0, 0.0);\n    glVertex2f(WIDTH, 0);\n    glTexCoord2f(1.0, 1.0);\n    glVertex2f(WIDTH, HEIGHT);\n    glTexCoord2f(0.0, 1.0);\n    glVertex2f(0, HEIGHT);\n    glEnd();\n    glUseProgram(0);\n}\n\n// GLFW ///////////////////////////////////////////////////////////////////////\n\nstatic void export() {\n    time_t t;\n    time(&t);\n    struct tm* tm_info = localtime(&t);\n    char s_time[20];\n    strftime(s_time, 20, \"%Y-%m-%d_%H.%M.%S\", tm_info);\n    char fname[100];\n    snprintf(fname, 100, \"screenshot-%s-%.4f.png\", s_time, freq_mhz);\n    write_gray_png(fname, WIDTH, HEIGHT, image_buffer);\n}\n\nstatic void error_callback(int error, const char* description) {\n    fputs(description, stderr);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {\n    if (action == GLFW_PRESS || action == GLFW_REPEAT) {\n\n        double d;\n        if (mods == 1) { // Shift key\n            d = 10;\n        } else if (mods == 4) { // Alt key\n            d = 0.001;\n        } else {\n            d = 0.1;\n        }\n        if (key == GLFW_KEY_ESCAPE) {\n            glfwSetWindowShouldClose(window, GL_TRUE);\n        } else if (key == GLFW_KEY_RIGHT) {\n            freq_mhz += d;\n            set_frequency();\n        } else if (key == GLFW_KEY_LEFT) {\n            freq_mhz -= d;\n            set_frequency();\n        } else if (key == GLFW_KEY_SPACE) {\n            //paused = !paused;\n        } else if (key == GLFW_KEY_E) {\n            export();\n        } else if (key == GLFW_KEY_EQUAL) {\n            line_intensity += 1;\n            printf(\"Intensity: %d\\n\", line_intensity);\n        } else if (key == GLFW_KEY_MINUS) {\n            line_intensity -= 1;\n            printf(\"Intensity: %d\\n\", line_intensity);\n        } else if (key == GLFW_KEY_COMMA) {\n            line_percentage = clampf(line_percentage - (d / 100), 0, 1);\n            printf(\"Line percentage: %.2f%%\\n\", line_percentage * 100);\n        } else if (key == GLFW_KEY_PERIOD) {\n            line_percentage = clampf(line_percentage + (d / 100), 0, 1);\n            printf(\"Line percentage: %.2f%%\\n\", line_percentage * 100);\n        }\n    }\n}\n\n// Main ///////////////////////////////////////////////////////////////////////\n\nint main(void) {\n    glfwSetErrorCallback(error_callback);\n    if (!glfwInit()) {\n        exit(EXIT_FAILURE);\n    }\n    window = glfwCreateWindow(WIDTH, HEIGHT, \"HackRF\", NULL, NULL);\n    if (!window) {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n    glfwMakeContextCurrent(window);\n    glfwSetKeyCallback(window, key_callback);\n\n    sample_buffer = calloc(SAMPLE_BUFFER_SIZE, sizeof(uint8_t));\n    image_buffer = calloc(WIDTH * HEIGHT, sizeof(uint8_t));\n\n    setup_hackrf();\n    setup();\n    while (!glfwWindowShouldClose(window)) {\n        prepare();\n        update();\n        draw();\n        glfwSwapBuffers(window);\n        glfwPollEvents();\n    }\n    teardown_hackrf();\n    glfwDestroyWindow(window);\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n"
  },
  {
    "path": "c/iqvis-rtl.c",
    "content": "#include <math.h>\n#include <png.h>\n#include <pthread.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <unistd.h>\n\n#include <GL/glew.h>\n#include <GLFW/glfw3.h>\n#include <rtl-sdr.h>\n\n#define WIDTH 256\n#define HEIGHT 256\n\nGLFWwindow* window;\nGLuint texture_id;\nGLuint program;\nGLfloat buffer[WIDTH * HEIGHT];\nrtlsdr_dev_t *device;\npthread_t receive_thread;\ndouble freq_mhz = 1000;\nint paused = 0;\nfloat intensity = 0.03;\nvoid *rtl_buffer;\nconst uint32_t rtl_buffer_length = (16 * 16384);\nint rtl_should_quit = 0;\n\nvoid rtl_check_status(rtlsdr_dev_t *device, int status, const char *message, const char *file, int line) {\n    if (status != 0) {\n        fprintf(stderr, \"RTL-SDR: %s (Status code %d) %s:%d\\n\", message, status, file, line);\n        if (device != NULL) {\n            rtlsdr_close(device);\n        }\n        exit(EXIT_FAILURE);\n    }\n}\n\n#define RTL_CHECK_STATUS(device, status, message) rtl_check_status(device, status, message, __FILE__, __LINE__)\n\nvoid receive_block(unsigned char *in_buffer, uint32_t buffer_length, void *ctx) {\n    printf(\"o\\n\");\n    if (paused) return;\n    memset(buffer, 0, sizeof(GLfloat) * WIDTH * HEIGHT);\n    for (int i = 0; i < buffer_length; i += 2) {\n        int vi = in_buffer[i];\n        int vq = in_buffer[i + 1];\n\n        int d = (vq * 256) + vi;\n        float v = buffer[d];\n        v += intensity;\n        v = v < 0 ? 0 : v > 255 ? 255 : v;\n        buffer[d] = v;\n    }\n}\n\n// This function will block, so needs to be called on its own thread.\nvoid *_receive_loop(rtlsdr_dev_t *device) {\n    while (!rtl_should_quit) {\n        int n_read;\n        int status = rtlsdr_read_sync(device, rtl_buffer, rtl_buffer_length, &n_read);\n        RTL_CHECK_STATUS(device, status, \"rtlsdr_read_sync\");\n\n        if (n_read < rtl_buffer_length) {\n            fprintf(stderr, \"Short read, samples lost, exiting!\\n\");\n            exit(EXIT_FAILURE);\n        }\n\n        receive_block(rtl_buffer, rtl_buffer_length, device);\n    }\n    return NULL;\n}\n\nstatic void setup_rtl() {\n    int status;\n\n    rtl_buffer = calloc(rtl_buffer_length, sizeof(uint8_t));\n\n    int device_count = rtlsdr_get_device_count();\n    if (device_count == 0) {\n        fprintf(stderr, \"RTL-SDR: No devices found.\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    const char *device_name = rtlsdr_get_device_name(0);\n    printf(\"Device %s\\n\", device_name);\n\n    status = rtlsdr_open(&device, 0);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_open\");\n\n    status = rtlsdr_set_sample_rate(device, 3e6);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_sample_rate\");\n\n    // Set auto-gain mode\n    status = rtlsdr_set_tuner_gain_mode(device, 0);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_tuner_gain_mode\");\n\n    status = rtlsdr_set_agc_mode(device, 1);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_agc_mode\");\n\n    status = rtlsdr_set_center_freq(device, freq_mhz * 1e6);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_center_freq\");\n\n    status = rtlsdr_reset_buffer(device);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_reset_buffer\");\n\n    printf(\"Start\\n\");\n    pthread_create(&receive_thread, NULL, (void *(*)(void *))_receive_loop, device);\n    printf(\"Running\\n\");\n\n}\n\nstatic void set_frequency() {\n    freq_mhz = round(freq_mhz * 10.0) / 10.0;\n    printf(\"Seting freq to %f MHz.\\n\", freq_mhz);\n    int status = rtlsdr_set_center_freq(device, freq_mhz * 1e6);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_center_freq\");\n}\n\nstatic void teardown_rtl() {\n    int status;\n\n    rtl_should_quit = 1;\n\n    printf(\"pthread_join\\n\");\n    pthread_join(receive_thread, NULL);\n\n    printf(\"rtlsdr_close\\n\");\n    status = rtlsdr_close(device);\n    //printf(\"Closed\\n\");\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_close\");\n}\n\nstatic void setup() {\n    glGenTextures(1, &texture_id);\n    glBindTexture(GL_TEXTURE_2D, texture_id);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n\n}\n\nstatic void prepare() {\n    int width, height;\n    glfwGetFramebufferSize(window, &width, &height);\n    glViewport(0, 0, width, height);\n    glClear(GL_COLOR_BUFFER_BIT);\n    glMatrixMode(GL_PROJECTION);\n    glLoadIdentity();\n    glOrtho(0, WIDTH, 0, HEIGHT, -1, 1);\n    glMatrixMode(GL_MODELVIEW);\n    glLoadIdentity();\n}\n\nstatic void update() {\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, WIDTH, HEIGHT, 0, GL_RED, GL_FLOAT, buffer);\n}\n\nstatic void export() {\n    png_structp png_ptr = NULL;\n    png_infop info_ptr = NULL;\n    png_bytepp row_pointers;\n\n    // We set paused so we don't write to the buffer while saving the file.\n    paused = 1;\n\n    // Filename contains the frequency.\n    char fname[100];\n    snprintf(fname, 100, \"vis-%.3f.png\", freq_mhz);\n\n    FILE *fp = fopen(fname, \"wb\");\n    if (!fp) {\n        printf(\"ERROR: Could not write open file %s for writing.\\n\", fname);\n        paused = 0;\n        return;\n    }\n\n    // Init PNG writer.\n    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);\n    if (png_ptr == NULL) {\n        printf(\"ERROR: png_create_write_struct.\\n\");\n        paused = 0;\n        return;\n    }\n\n    info_ptr = png_create_info_struct(png_ptr);\n    if (info_ptr == NULL) {\n        printf(\"ERROR: png_create_info_struct.\\n\");\n        png_destroy_write_struct(&png_ptr, NULL);\n        paused = 0;\n        return;\n    }\n\n    png_set_IHDR(png_ptr, info_ptr,\n                 WIDTH, HEIGHT,\n                 8,\n                 PNG_COLOR_TYPE_GRAY,\n                 PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);\n\n    // PNG expects a list of pointers. We just calculate offsets into our buffer.\n    row_pointers = (png_bytepp) png_malloc(png_ptr, HEIGHT * sizeof(png_bytep));\n    for (int y = 0; y < HEIGHT; y++) {\n       row_pointers[y] = (png_byte *) (buffer + y * WIDTH);\n   }\n\n    // Write out the image data.\n    png_init_io(png_ptr, fp);\n    png_set_rows(png_ptr, info_ptr, row_pointers);\n    png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);\n\n    // Cleanup.\n    png_free(png_ptr, row_pointers);\n    png_destroy_write_struct(&png_ptr, &info_ptr);\n    fclose(fp);\n    printf(\"Written %s.\\n\", fname);\n    paused = 0;\n}\n\nstatic void draw() {\n    glEnable(GL_TEXTURE_2D);\n    glEnable(GL_BLEND);\n    glBlendFunc(GL_ONE, GL_SRC_COLOR);\n\n    glBindTexture(GL_TEXTURE_2D, texture_id);\n    glBegin(GL_QUADS);\n    glTexCoord2f(0.0, 0.0);\n    glVertex2f(0, 0);\n    glTexCoord2f(1.0, 0.0);\n    glVertex2f(WIDTH, 0);\n    glTexCoord2f(1.0, 1.0);\n    glVertex2f(WIDTH, HEIGHT);\n    glTexCoord2f(0.0, 1.0);\n    glVertex2f(0, HEIGHT);\n    glEnd();\n}\n\nstatic void error_callback(int error, const char* description) {\n    fputs(description, stderr);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {\n    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) {\n        glfwSetWindowShouldClose(window, GL_TRUE);\n    } else if (key == GLFW_KEY_RIGHT && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        if (mods == 0) {\n            freq_mhz += 0.1;\n        } else {\n            freq_mhz += 10;\n        }\n        set_frequency();\n    } else if (key == GLFW_KEY_LEFT && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        if (mods == 0) {\n            freq_mhz -= 0.1;\n        } else {\n            freq_mhz -= 10;\n        }\n        set_frequency();\n    } else if (key == GLFW_KEY_SPACE && action == GLFW_PRESS) {\n        paused = !paused;\n    } else if (key == GLFW_KEY_E && action == GLFW_PRESS) {\n        export();\n    } else if (key == GLFW_KEY_EQUAL && action == GLFW_PRESS) {\n        intensity += 0.01;\n        printf(\"Intensity: %.2f\\n\", intensity);\n    } else if (key == GLFW_KEY_MINUS && action == GLFW_PRESS) {\n        intensity -= 0.01;\n        printf(\"Intensity: %.2f\\n\", intensity);\n    }\n}\n\nint main(void) {\n    glfwSetErrorCallback(error_callback);\n    if (!glfwInit()) {\n        exit(EXIT_FAILURE);\n    }\n    window = glfwCreateWindow(WIDTH * 2, HEIGHT * 2, \"RTL-SDR\", NULL, NULL);\n    if (!window) {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n    glfwMakeContextCurrent(window);\n    glfwSetKeyCallback(window, key_callback);\n    setup_rtl();\n    setup();\n    while (!glfwWindowShouldClose(window)) {\n        prepare();\n        update();\n        draw();\n        glfwSwapBuffers(window);\n        glfwPollEvents();\n    }\n    teardown_rtl();\n    glfwDestroyWindow(window);\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n"
  },
  {
    "path": "c/iqvis.c",
    "content": "#include <GLFW/glfw3.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <libhackrf/hackrf.h>\n#include <unistd.h>\n#include <string.h>\n#include <math.h>\n#include <png.h>\n\n#define WIDTH 256\n#define HEIGHT 256\n\nGLFWwindow* window;\nGLuint texture_id;\nGLuint program;\nGLfloat buffer[WIDTH * HEIGHT];\nhackrf_device *device;\ndouble freq_mhz = 124.2;\nint paused = 0;\nfloat intensity = 0.01;\n\n#define HACKRF_CHECK_STATUS(status, message) \\\n    if (status != 0) { \\\n        printf(\"FAIL: %s\\n\", message); \\\n        hackrf_close(device); \\\n        hackrf_exit(); \\\n        exit(EXIT_FAILURE); \\\n    } \\\n\nint receive_sample_block(hackrf_transfer *transfer) {\n    if (paused) return 0;\n    memset(buffer, 0, sizeof(GLfloat) * WIDTH * HEIGHT);\n    // for (int i = 0; i < WIDTH * HEIGHT; i += 1) {\n    //     buffer[i] = 0;\n    // }\n    for (int i = 0; i < transfer->valid_length; i += 2) {\n\n        int vi = transfer->buffer[i];\n        int vq = transfer->buffer[i + 1];\n\n        vi = (vi + 128) % 256;\n        vq = (vq + 128) % 256;\n        int d = (vq * 256) + vi;\n        float v = buffer[d];\n        v += intensity;\n        v = v < 0 ? 0 : v > 255 ? 255 : v;\n        buffer[d] = v;\n        //buffer[i] = transfer->buffer[i + 1];\n        //buffer[i + 1] = transfer->buffer[i + 1];\n    }\n    return 0;\n}\n\nstatic void setup_hackrf() {\n    int status;\n\n    status = hackrf_init();\n    HACKRF_CHECK_STATUS(status, \"hackrf_init\");\n\n    status = hackrf_open(&device);\n    HACKRF_CHECK_STATUS(status, \"hackrf_open\");\n\n    status = hackrf_set_freq(device, freq_mhz * 1e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n\n    status = hackrf_set_sample_rate(device, 10e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_sample_rate\");\n\n    status = hackrf_set_amp_enable(device, 0);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_amp_enable\");\n\n    status = hackrf_set_lna_gain(device, 32);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_set_vga_gain(device, 30);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_start_rx(device, receive_sample_block, NULL);\n    HACKRF_CHECK_STATUS(status, \"hackrf_start_rx\");\n\n    //memset(buffer, 0, WIDTH * HEIGHT);\n\n    //status = hackrf_set_freq(device, freq_mhz * 1e6);\n    //HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n}\n\nstatic void set_frequency() {\n    freq_mhz = round(freq_mhz * 10.0) / 10.0;\n    printf(\"Seting freq to %f MHz.\\n\", freq_mhz);\n    int status = hackrf_set_freq(device, freq_mhz * 1e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n}\n\nstatic void teardown_hackrf() {\n    hackrf_stop_rx(device);\n    hackrf_close(device);\n    hackrf_exit();\n}\n\nstatic void check_shader_error(GLuint shader) {\n    int length = 0;\n    int charsWritten  = 0;\n    char *infoLog;\n\n    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);\n\n    if (length > 0) {\n        char message[length];\n        glGetShaderInfoLog(shader, length, NULL, message);\n        printf(\"%s\\n\", message);\n    }\n}\n\nstatic void setup() {\n    glGenTextures(1, &texture_id);\n    glBindTexture(GL_TEXTURE_2D, texture_id);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n\n    const char *vertex_shader_source =\n        \"void main(void) {\"\n        \"  gl_TexCoord[0] = gl_MultiTexCoord0;\"\n        \"  gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\"\n        \"}\";\n\n    const char *fragment_shader_source =\n        \"uniform sampler2D texture;\"\n        \"void main(void) {\"\n        \"  vec4 c = texture2D(texture, gl_TexCoord[0].st);\"\n        \"  float v = c.r;\"\n        \"  gl_FragColor = vec4(v, v, v, 1);\"\n        \"}\";\n\n    GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);\n    glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);\n    glCompileShader(vertex_shader);\n    check_shader_error(vertex_shader);\n\n    GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);\n    glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);\n    glCompileShader(fragment_shader);\n    check_shader_error(fragment_shader);\n\n    program = glCreateProgram();\n    glAttachShader(program, vertex_shader);\n    glAttachShader(program, fragment_shader);\n    glLinkProgram(program);\n\n    glActiveTexture(0);\n    GLuint u_texture = glGetUniformLocation(program, \"texture\");\n    glUniform1i(u_texture, texture_id);\n}\n\nstatic void prepare() {\n    int width, height;\n    glfwGetFramebufferSize(window, &width, &height);\n    glViewport(0, 0, width, height);\n    glClear(GL_COLOR_BUFFER_BIT);\n    glMatrixMode(GL_PROJECTION);\n    glLoadIdentity();\n    glOrtho(0, WIDTH, 0, HEIGHT, -1, 1);\n    glMatrixMode(GL_MODELVIEW);\n    glLoadIdentity();\n}\n\nstatic void update() {\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, WIDTH, HEIGHT, 0, GL_RED, GL_FLOAT, buffer);\n}\n\nstatic void export() {\n    png_structp png_ptr = NULL;\n    png_infop info_ptr = NULL;\n    png_bytepp row_pointers;\n\n    // We set paused so we don't write to the buffer while saving the file.\n    paused = 1;\n\n    // Filename contains the frequency.\n    char fname[100];\n    snprintf(fname, 100, \"vis-%.3f.png\", freq_mhz);\n\n    FILE *fp = fopen(fname, \"wb\");\n    if (!fp) {\n        printf(\"ERROR: Could not write open file %s for writing.\\n\", fname);\n        paused = 0;\n        return;\n    }\n\n    // Init PNG writer.\n    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);\n    if (png_ptr == NULL) {\n        printf(\"ERROR: png_create_write_struct.\\n\");\n        paused = 0;\n        return;\n    }\n\n    info_ptr = png_create_info_struct(png_ptr);\n    if (info_ptr == NULL) {\n        printf(\"ERROR: png_create_info_struct.\\n\");\n        png_destroy_write_struct(&png_ptr, NULL);\n        paused = 0;\n        return;\n    }\n\n    png_set_IHDR(png_ptr, info_ptr,\n                 WIDTH, HEIGHT,\n                 8,\n                 PNG_COLOR_TYPE_GRAY,\n                 PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);\n\n    // PNG expects a list of pointers. We just calculate offsets into our buffer.\n    row_pointers = (png_bytepp) png_malloc(png_ptr, HEIGHT * sizeof(png_bytep));\n    for (int y = 0; y < HEIGHT; y++) {\n       row_pointers[y] = buffer + y * WIDTH;\n   }\n\n    // Write out the image data.\n    png_init_io(png_ptr, fp);\n    png_set_rows(png_ptr, info_ptr, row_pointers);\n    png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);\n\n    // Cleanup.\n    png_free(png_ptr, row_pointers);\n    png_destroy_write_struct(&png_ptr, &info_ptr);\n    fclose(fp);\n    printf(\"Written %s.\\n\", fname);\n    paused = 0;\n}\n\nstatic void draw() {\n    glEnable(GL_TEXTURE_2D);\n    glEnable(GL_BLEND);\n    glBlendFunc(GL_ONE, GL_SRC_COLOR);\n\n    glUseProgram(program);\n    glBindTexture(GL_TEXTURE_2D, texture_id);\n    glBegin(GL_QUADS);\n    glTexCoord2f(0.0, 0.0);\n    glVertex2f(0, 0);\n    glTexCoord2f(1.0, 0.0);\n    glVertex2f(WIDTH, 0);\n    glTexCoord2f(1.0, 1.0);\n    glVertex2f(WIDTH, HEIGHT);\n    glTexCoord2f(0.0, 1.0);\n    glVertex2f(0, HEIGHT);\n    glEnd();\n    glUseProgram(0);\n}\n\nstatic void error_callback(int error, const char* description) {\n    fputs(description, stderr);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {\n    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) {\n        glfwSetWindowShouldClose(window, GL_TRUE);\n    } else if (key == GLFW_KEY_RIGHT && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        freq_mhz += 0.1;\n        set_frequency();\n    } else if (key == GLFW_KEY_LEFT && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        freq_mhz -= 0.1;\n        set_frequency();\n    } else if (key == GLFW_KEY_SPACE && action == GLFW_PRESS) {\n        paused = !paused;\n    } else if (key == GLFW_KEY_E && action == GLFW_PRESS) {\n        export();\n    } else if (key == GLFW_KEY_EQUAL && action == GLFW_PRESS) {\n        intensity += 0.01;\n        printf(\"Intensity: %.2f\\n\", intensity);\n    } else if (key == GLFW_KEY_MINUS && action == GLFW_PRESS) {\n        intensity -= 0.01;\n        printf(\"Intensity: %.2f\\n\", intensity);\n    }\n}\n\nint main(void) {\n    glfwSetErrorCallback(error_callback);\n    if (!glfwInit()) {\n        exit(EXIT_FAILURE);\n    }\n    window = glfwCreateWindow(WIDTH * 2, HEIGHT * 2, \"HackRF\", NULL, NULL);\n    if (!window) {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n    glfwMakeContextCurrent(window);\n    glfwSetKeyCallback(window, key_callback);\n    setup_hackrf();\n    setup();\n    while (!glfwWindowShouldClose(window)) {\n        prepare();\n        update();\n        draw();\n        glfwSwapBuffers(window);\n        glfwPollEvents();\n    }\n    teardown_hackrf();\n    glfwDestroyWindow(window);\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n"
  },
  {
    "path": "c/osc-server.c",
    "content": "// A simple OSC listening server.\n// Can be used to receive messages from OSCulator.\n\n#include <assert.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n#include <netdb.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n\nstatic void die(const char * format, ...)\n{\n    va_list vargs;\n    va_start(vargs, format);\n    vfprintf(stderr, format, vargs);\n    fprintf(stderr, \".\\n\");\n    exit(1);\n}\n\nstatic void warn(const char * format, ...) {\n    va_list vargs;\n    va_start(vargs, format);\n    vfprintf(stderr, format, vargs);\n    fprintf(stderr, \".\\n\");\n}\n\n#if defined( __BIG_ENDIAN__ )\n    static inline void swap32(void *v) { }\n#elif defined( __LITTLE_ENDIAN__ )\n    static inline void swap(char *a, char *b){\n        char t = *a;\n        *a = *b;\n        *b = t;\n    }\n\n    static inline void swap32(void *v) {\n        char *b = (char *) v;\n        swap(b  , b+3);\n        swap(b+1, b+2);\n    }\n#else\n    #error Either __BIG_ENDIAN__ or __LITTLE_ENDIAN__ must be defined.\n#endif\n\nvoid check_arg(int cond, const char *format, ...) {\n    if (!cond) {\n        va_list vargs;\n        va_start(vargs, format);\n        fprintf(stderr, \"ERROR checking arg: \");\n        vfprintf(stderr, format, vargs);\n        fprintf(stderr, \".\\n\");\n        exit(1);\n    }\n}\n\nssize_t get_string(void *data, ssize_t size) {\n    ssize_t i = 0;\n    ssize_t len = 0;\n    char *c = data;\n    if (size < 0) {\n        return -1;\n    }\n    for (i = 0; i < size; ++i) {\n        if (c[i] == '\\0') {\n            len = 4 * (i / 4 + 1);\n            break;\n        }\n    }\n    if (0 == len) {\n        return -1;\n    }\n    if (len > size) {\n        return -1;\n    }\n    for (; i < len; ++i) {\n        if (c[i] != '\\0') {\n            return -1;\n        }\n    }\n    return len;\n}\n\n#define MAX_PATH_LENGTH 200\n#define MAX_TYPES_LENGTH 10\n\ntypedef union osc_arg {\n    char *s;\n    int32_t i;\n    float f;\n} osc_arg;\n\ntypedef struct {\n    char path[MAX_PATH_LENGTH];\n    char types[MAX_TYPES_LENGTH];\n    osc_arg *args;\n} osc_message;\n\nconst char *osc_message_get_string_arg(const osc_message *msg, int index) {\n    char arg_type = msg->types[index];\n    check_arg(arg_type == 's', \"OSC argument %d is not a string.\", index);\n    return msg->args[index].s;\n}\n\nint32_t osc_message_get_int_arg(const osc_message *msg, int index) {\n    char arg_type = msg->types[index];\n    check_arg(arg_type == 'i', \"OSC argument %d is not an int32.\", index);\n    return msg->args[index].i;\n}\n\nfloat osc_message_get_float_arg(const osc_message *msg, int index) {\n    char arg_type = msg->types[index];\n    check_arg(arg_type == 'f', \"OSC argument %d is not a float.\", index);\n    return msg->args[index].f;\n}\n\ntypedef struct {\n    char *pos;\n    int remaining;\n} parser;\n\nchar *parse_string(parser *p) {\n    assert(p != NULL);\n    assert(p->pos != NULL);\n    assert(p->remaining > 0);\n\n    // The string starts where the parser is.\n    char *start = p->pos;\n\n    // Now let's find the end\n    char *end = p->pos;\n    end += 3;\n    while (*end) {\n        end += 4;\n    }\n    end++;\n\n    printf(\"parse_string %s len %ld\\n\", start, end - start);\n    p->pos = end;\n    p->remaining = end - start;\n\n    return start;\n}\n\nint32_t parse_int32(parser *p) {\n    assert(p != NULL);\n    assert(p->pos != NULL);\n    assert(p->remaining >= 4);\n\n    swap32(p->pos);\n    uint32_t v = *(int32_t *)p->pos;\n\n    printf(\"parse_int32 %d\\n\", v);\n    p->pos += 4;\n    p->remaining -= 4;\n\n    return v;\n}\n\nfloat parse_float(parser *p) {\n    assert(p != NULL);\n    assert(p->pos != NULL);\n    assert(p->remaining >= 4);\n\n    swap32(p->pos);\n    float v = *(float *)p->pos;\n\n    printf(\"parse_float %.3f\\n\", v);\n    p->pos += 4;\n    p->remaining -= 4;\n\n    return v;\n}\n\n\nvoid handle_datagram(char *data, size_t size) {\n    printf(\"Size: %ld\\n\", size);\n    printf(\"Buffer: %s\\n\", data);\n\n    for (int i = 0; i < size; i++) {\n        printf(\"%4d: %d\\n\", i, data[i]);\n    }\n\n    osc_message *msg = calloc(1, sizeof(osc_message));\n\n    parser p;\n    p.pos = data;\n    p.remaining = size;\n\n\n\n    //int pos = 0;\n    //int len = 0;\n    //int remaining = size;\n\n    //char *p = data;\n\n    // Parse the path\n    const char *path = parse_string(&p);\n    strncpy(msg->path, path, MAX_PATH_LENGTH);\n\n    // Parse the types\n    printf(\"Types: %s\\n\", p.pos);\n    const char *types = parse_string(&p);\n    check_arg(*types == ',', \"OSC message does not contain type tag string.\");\n    types++;\n    strncpy(msg->types, types, MAX_TYPES_LENGTH);\n    int types_count = strlen(types);\n    printf(\"Types in msg: %s\\n\", msg->types);\n\n    // char *types_ptr = data + len;\n    // types_ptr++;\n    // len = get_string(types_ptr, remaining);\n    // remaining -= len;\n    // strncpy(msg->types, types_ptr, MAX_TYPES_LENGTH);\n\n    // Allocate the data structures.\n    msg->args = calloc(types_count, sizeof(osc_arg));\n\n    // Parse the actual arguments.\n    //char *args_ptr = types_ptr + len;\n    for (int i = 0; i < types_count; i ++) {\n        char arg_type = types[i];\n        if (arg_type == 's') {\n            const char *str = parse_string(&p);\n            //len = get_string(args_ptr, remaining);\n            //remaining -= len;\n            int len = strlen(str);\n            msg->args[i].s = calloc(len, 1);\n            printf(\"Len %d\\n\", len);\n            strncpy(msg->args[i].s, str, len);\n        } else if (arg_type == 'i') {\n            int v = parse_int32(&p);\n            msg->args[i].i = v;\n        } else if (arg_type == 'f') {\n            float v = parse_float(&p);\n            msg->args[i].f = v;\n        }\n\n        printf(\"Arg %c\\n\", arg_type);\n    }\n\n    printf(\"Message PATH %s TYPES %s\\n\", msg->path, msg->types);\n\n    const char *arg0 = osc_message_get_string_arg(msg, 0);\n    printf(\"Arg 0 %s\\n\", arg0);\n\n    int arg1 = osc_message_get_int_arg(msg, 1);\n    printf(\"Arg 1 %d\\n\", arg1);\n\n    float arg2 = osc_message_get_float_arg(msg, 2);\n    printf(\"Arg 2 %.3f\\n\", arg2);\n\n    free(msg);\n}\n\nint main() {\n    const char *hostname = 0;\n    const char *portname = \"2222\";\n    struct addrinfo hints;\n    memset(&hints, 0 ,sizeof(hints));\n    hints.ai_family=AF_UNSPEC;\n    hints.ai_socktype=SOCK_DGRAM;\n    hints.ai_protocol=0;\n    hints.ai_flags=AI_PASSIVE|AI_ADDRCONFIG;\n    struct addrinfo *res = NULL;\n    int err=getaddrinfo(hostname,portname,&hints,&res);\n    if (err!=0) {\n            die(\"failed to resolve local socket address (err=%d)\",err);\n    }\n    // Create the socket\n    int fd=socket(res->ai_family,res->ai_socktype,res->ai_protocol);\n    if (fd==-1) {\n            die(\"%s\",strerror(errno));\n    }\n    // Bind the local address to the socket\n    if (bind(fd,res->ai_addr,res->ai_addrlen)==-1) {\n            die(\"%s\",strerror(errno));\n    }\n    // Free addrinfo\n    freeaddrinfo(res);\n\n    char buffer[548];\n    struct sockaddr_storage src_addr;\n\n    struct iovec iov[1];\n    iov[0].iov_base=buffer;\n    iov[0].iov_len=sizeof(buffer);\n\n    struct msghdr message;\n    message.msg_name=&src_addr;\n    message.msg_namelen=sizeof(src_addr);\n    message.msg_iov=iov;\n    message.msg_iovlen=1;\n    message.msg_control=0;\n    message.msg_controllen=0;\n\n    while (1) {\n        ssize_t count=recvmsg(fd,&message,0);\n        if (count==-1) {\n                die(\"%s\",strerror(errno));\n        } else if (message.msg_flags&MSG_TRUNC) {\n                warn(\"datagram too large for buffer: truncated\");\n        } else {\n                handle_datagram(buffer,count);\n        }\n\n    }\n\n\n\n}\n"
  },
  {
    "path": "c/piqvis.c",
    "content": "// Visualisation on the Raspberry PI\n\n#include <math.h>\n#include <pthread.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <unistd.h>\n\n#define GLFW_INCLUDE_ES2\n#include <GLFW/glfw3.h>\n#include <rtl-sdr.h>\n\n#define WIDTH 256\n#define HEIGHT 256\n\nGLFWwindow* window;\nGLuint texture_id;\nGLuint program;\nGLuint position_vbo;\nGLuint uv_vbo;\nGLuint vao;\nGLfloat buffer[WIDTH * HEIGHT * 3];\nrtlsdr_dev_t *device;\npthread_t receive_thread;\ndouble freq_mhz = 124.2;\nint paused = 0;\nfloat intensity = 0.03;\nvoid *rtl_buffer;\nconst uint32_t rtl_buffer_length = (16 * 16384);\nint rtl_should_quit = 0;\n\nvoid rtl_check_status(rtlsdr_dev_t *device, int status, const char *message, const char *file, int line) {\n    if (status != 0) {\n        fprintf(stderr, \"RTL-SDR: %s (Status code %d) %s:%d\\n\", message, status, file, line);\n        if (device != NULL) {\n            rtlsdr_close(device);\n        }\n        exit(EXIT_FAILURE);\n    }\n}\n\n#define RTL_CHECK_STATUS(device, status, message) rtl_check_status(device, status, message, __FILE__, __LINE__)\n\nvoid receive_block(unsigned char *in_buffer, uint32_t buffer_length, void *ctx) {\n    if (paused) return;\n    memset(buffer, 0, WIDTH * HEIGHT * 3 * sizeof(GLfloat));\n    for (int i = 0; i < buffer_length; i += 2) {\n        int vi = in_buffer[i];\n        int vq = in_buffer[i + 1];\n\n        int d = (vq * 256) + vi;\n        float v = buffer[d];\n        v += intensity;\n        v = v < 0 ? 0 : v > 255 ? 255 : v;\n        buffer[d * 3] = v;\n    }\n}\n\n// This function will block, so needs to be called on its own thread.\nvoid *_receive_loop(rtlsdr_dev_t *device) {\n    while (!rtl_should_quit) {\n        int n_read;\n        int status = rtlsdr_read_sync(device, rtl_buffer, rtl_buffer_length, &n_read);\n        RTL_CHECK_STATUS(device, status, \"rtlsdr_read_sync\");\n\n        if (n_read < rtl_buffer_length) {\n            fprintf(stderr, \"Short read, samples lost, exiting!\\n\");\n            exit(EXIT_FAILURE);\n        }\n\n        receive_block(rtl_buffer, rtl_buffer_length, device);\n    }\n    return NULL;\n}\n\nstatic void setup_rtl() {\n    int status;\n\n    rtl_buffer = calloc(rtl_buffer_length, sizeof(uint8_t));\n\n    int device_count = rtlsdr_get_device_count();\n    if (device_count == 0) {\n        fprintf(stderr, \"RTL-SDR: No devices found.\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    const char *device_name = rtlsdr_get_device_name(0);\n    printf(\"Device %s\\n\", device_name);\n\n    status = rtlsdr_open(&device, 0);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_open\");\n\n    status = rtlsdr_set_sample_rate(device, 2e6);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_sample_rate\");\n\n    // Set auto-gain mode\n    status = rtlsdr_set_tuner_gain_mode(device, 0);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_tuner_gain_mode\");\n\n    status = rtlsdr_set_agc_mode(device, 1);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_agc_mode\");\n\n    status = rtlsdr_set_center_freq(device, freq_mhz * 1e6);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_center_freq\");\n\n    status = rtlsdr_reset_buffer(device);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_reset_buffer\");\n\n    printf(\"Start\\n\");\n    pthread_create(&receive_thread, NULL, (void *(*)(void *))_receive_loop, device);\n    printf(\"Running\\n\");\n\n}\n\nstatic void set_frequency() {\n    freq_mhz = round(freq_mhz * 10.0) / 10.0;\n    printf(\"Seting freq to %f MHz.\\n\", freq_mhz);\n    int status = rtlsdr_set_center_freq(device, freq_mhz * 1e6);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_center_freq\");\n}\n\nstatic void teardown_rtl() {\n    int status;\n\n    rtl_should_quit = 1;\n\n    printf(\"pthread_join\\n\");\n    pthread_join(receive_thread, NULL);\n\n    printf(\"rtlsdr_close\\n\");\n    status = rtlsdr_close(device);\n    //printf(\"Closed\\n\");\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_close\");\n}\n\n\nvoid ngl_check_gl_error(const char *file, int line) {\n    GLenum err = glGetError();\n    int has_error = 0;\n    while (err != GL_NO_ERROR) {\n        has_error = 1;\n        char *msg = NULL;\n        switch(err) {\n            case GL_INVALID_OPERATION:\n            msg = \"GL_INVALID_OPERATION\";\n            break;\n            case GL_INVALID_ENUM:\n            msg = \"GL_INVALID_ENUM\";\n            fprintf(stderr, \"OpenGL error: GL_INVALID_ENUM\\n\");\n            break;\n            case GL_INVALID_VALUE:\n            msg = \"GL_INVALID_VALUE\";\n            fprintf(stderr, \"OpenGL error: GL_INVALID_VALUE\\n\");\n            break;\n            case GL_OUT_OF_MEMORY:\n            msg = \"GL_OUT_OF_MEMORY\";\n            fprintf(stderr, \"OpenGL error: GL_OUT_OF_MEMORY\\n\");\n            break;\n            default:\n            msg = \"UNKNOWN_ERROR\";\n        }\n        fprintf(stderr, \"OpenGL error: %s - %s:%d\\n\", msg, file, line);\n        err = glGetError();\n    }\n    if (has_error) {\n        exit(EXIT_FAILURE);\n    }\n}\n\n#define NGL_CHECK_ERROR() ngl_check_gl_error(__FILE__, __LINE__)\n\nstatic void check_shader_error(GLuint shader) {\n    int length = 0;\n\n    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);\n\n    if (length > 0) {\n        char message[length];\n        glGetShaderInfoLog(shader, length, NULL, message);\n        printf(\"%s\\n\", message);\n    }\n}\n\n\nstatic const GLfloat positions[] = {\n    -1.0, -1.0,\n     1.0, -1.0,\n    -1.0,  1.0,\n     1.0,  1.0\n};\n\nstatic const GLfloat uvs[] = {\n    1.0, 1.0,\n    1.0, 0.0,\n    0.0, 1.0,\n    0.0, 0.0\n};\n\nconst int ATTRIB_VERTEX = 0;\nconst int ATTRIB_TEXTUREPOSITION = 1;\n\nstatic void setup() {\n    glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, positions);\n    glEnableVertexAttribArray(ATTRIB_VERTEX);\n    glVertexAttribPointer(ATTRIB_TEXTUREPOSITION, 2, GL_FLOAT, 0, 0, uvs);\n    glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITION);\n    NGL_CHECK_ERROR();\n\n    glGenTextures(1, &texture_id);\n    glBindTexture(GL_TEXTURE_2D, texture_id);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n    NGL_CHECK_ERROR();\n\n    const char *vertex_shader_source =\n        \"#ifdef GL_ES\\n\"\n        \"precision mediump float;\\n\"\n        \"#endif\\n\"\n        \"attribute vec2 vp;\\n\"\n        \"attribute vec2 vt;\\n\"\n        \"varying vec2 uv;\\n\"\n        \"void main(void) {\\n\"\n        \"  uv = vt;\\n\"\n        \"  gl_Position = vec4(vp.x, vp.y, 0, 1);\\n\"\n        \"}\\n\";\n\n    const char *fragment_shader_source =\n        \"#ifdef GL_ES\\n\"\n        \"precision mediump float;\\n\"\n        \"#endif\\n\"\n        \"uniform sampler2D texture;\\n\"\n        \"varying vec2 uv;\\n\"\n        \"void main(void) {\\n\"\n        \"  vec4 c = texture2D(texture, uv);\\n\"\n        \"  float v = c.r;\\n\"\n        \"  gl_FragColor = vec4(v, v, v, 1);\\n\"\n        \"}\\n\";\n\n    GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);\n    glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);\n    glCompileShader(vertex_shader);\n    check_shader_error(vertex_shader);\n\n    GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);\n    glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);\n    glCompileShader(fragment_shader);\n    check_shader_error(fragment_shader);\n\n    program = glCreateProgram();\n    glAttachShader(program, vertex_shader);\n    glAttachShader(program, fragment_shader);\n    glLinkProgram(program);\n    NGL_CHECK_ERROR();\n\n    glActiveTexture(0);\n    GLuint u_texture = glGetUniformLocation(program, \"texture\");\n    glUniform1i(u_texture, texture_id);\n    NGL_CHECK_ERROR();\n}\n\nstatic void prepare() {\n    int width, height;\n    glfwGetFramebufferSize(window, &width, &height);\n    glViewport(0, 0, width, height);\n    glClear(GL_COLOR_BUFFER_BIT);\n    NGL_CHECK_ERROR();\n}\n\nstatic void update() {\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WIDTH, HEIGHT, 0, GL_RGB, GL_FLOAT, buffer);\n    NGL_CHECK_ERROR();\n}\n\nstatic void draw() {\n    glEnable(GL_TEXTURE_2D);\n    glEnable(GL_BLEND);\n    glBlendFunc(GL_ONE, GL_SRC_COLOR);\n    NGL_CHECK_ERROR();\n\n    glUseProgram(program);\n    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\n    glUseProgram(0);\n}\n\nstatic void error_callback(int error, const char* description) {\n    fputs(description, stderr);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {\n    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) {\n        glfwSetWindowShouldClose(window, GL_TRUE);\n    } else if (key == GLFW_KEY_RIGHT && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        if (mods == 0) {\n            freq_mhz += 0.1;\n        } else {\n            freq_mhz += 10;\n        }\n        set_frequency();\n    } else if (key == GLFW_KEY_LEFT && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        if (mods == 0) {\n            freq_mhz -= 0.1;\n        } else {\n            freq_mhz -= 10;\n        }\n        set_frequency();\n    } else if (key == GLFW_KEY_SPACE && action == GLFW_PRESS) {\n        paused = !paused;\n    } else if (key == GLFW_KEY_EQUAL && action == GLFW_PRESS) {\n        intensity += 0.01;\n        printf(\"Intensity: %.2f\\n\", intensity);\n    } else if (key == GLFW_KEY_MINUS && action == GLFW_PRESS) {\n        intensity -= 0.01;\n        printf(\"Intensity: %.2f\\n\", intensity);\n    }\n}\n\nint main(void) {\n    glfwSetErrorCallback(error_callback);\n    if (!glfwInit()) {\n        exit(EXIT_FAILURE);\n    }\n    window = glfwCreateWindow(WIDTH * 2, HEIGHT * 2, \"RTL-SDR\", NULL, NULL);\n    if (!window) {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n    glfwMakeContextCurrent(window);\n    glfwSetKeyCallback(window, key_callback);\n    setup_rtl();\n    setup();\n    while (!glfwWindowShouldClose(window)) {\n        prepare();\n        update();\n        draw();\n        glfwSwapBuffers(window);\n        glfwPollEvents();\n    }\n    teardown_rtl();\n    glfwDestroyWindow(window);\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n"
  },
  {
    "path": "c/play.c",
    "content": "// Play random noise as audio\n\n#include <math.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <unistd.h>\n\n#include <OpenAL/al.h>\n#include <OpenAL/alc.h>\n#include <sndfile.h>\n\nvoid nal_check_error(const char *file, int line) {\n    ALenum err = alGetError();\n    int has_error = 0;\n    while (err != AL_NO_ERROR) {\n        has_error = 1;\n        char *msg = NULL;\n        switch (err) {\n            case AL_INVALID_NAME:\n                msg = \"AL_INVALID_NAME\";\n                break;\n            case AL_INVALID_ENUM:\n                msg = \"AL_INVALID_ENUM\";\n                break;\n            case AL_INVALID_VALUE:\n                msg = \"AL_INVALID_VALUE\";\n                break;\n            case AL_INVALID_OPERATION:\n                msg = \"AL_INVALID_OPERATION\";\n                break;\n            case AL_OUT_OF_MEMORY:\n                msg = \"AL_OUT_OF_MEMORY\";\n                break;\n        }\n        fprintf(stderr, \"OpenAL error: %s - %s:%d\\n\", msg, file, line);\n        err = alGetError();\n    }\n    if (has_error) {\n        exit(EXIT_FAILURE);\n    }\n}\n\n#define NAL_CHECK_ERROR() nal_check_error(__FILE__, __LINE__)\n\nint main(int argc, char **argv) {\n    if (argc != 2) {\n        fprintf(stderr, \"Usage: play <audio_file.wav>\\n\");\n        exit(1);\n    }\n    const char *file_name = argv[1];\n\n    // Initialize the audio context\n    ALCdevice *device = alcOpenDevice(NULL);\n    if (!device) {\n        fprintf(stderr, \"Could not open audio device.\\n\");\n        return 1;\n    }\n    ALCcontext *ctx = alcCreateContext(device, NULL);\n    alcMakeContextCurrent(ctx);\n\n    SF_INFO wav_file_info;\n    SNDFILE* wav_file = sf_open(file_name, SFM_READ, &wav_file_info);\n\n    ALsizei n_samples  = wav_file_info.channels * wav_file_info.frames;\n    ALsizei sample_rate = wav_file_info.samplerate;\n    int16_t *samples = calloc(n_samples, sizeof(short));\n    if (sf_read_short(wav_file, samples, n_samples) < n_samples) {\n        fprintf(stderr, \"Error while reading audio.\\n\");\n        exit(1);\n    }\n\n    sf_close(wav_file);\n\n    // Initialize an audio buffer\n    ALuint buffer;\n    alGetError(); // clear error code\n    alGenBuffers(1, &buffer);\n    NAL_CHECK_ERROR();\n\n    alBufferData(buffer, AL_FORMAT_MONO16, samples, n_samples * sizeof(ALushort), sample_rate);\n    NAL_CHECK_ERROR();\n\n    // Initialize a source\n    ALuint source;\n    alGenSources(1, &source);\n    NAL_CHECK_ERROR();\n\n    // Attach buffer to source\n    alSourcei(source, AL_BUFFER, buffer);\n    NAL_CHECK_ERROR();\n\n    // Play\n    alSourcePlay(source);\n    NAL_CHECK_ERROR();\n\n    // Playing is asynchronous so wait a while\n    sleep(3);\n\n    // Cleanup\n    alDeleteBuffers(1, &buffer);\n    alcMakeContextCurrent(NULL);\n    alcDestroyContext(ctx);\n    alcCloseDevice(device);\n\n    return 0;\n}\n"
  },
  {
    "path": "c/reader-all.sh",
    "content": "./reader 1.00 100\n./reader 1.01 100\n./reader 1.02 100\n./reader 1.03 100\n./reader 1.04 100\n./reader 1.05 100\n./reader 1.06 100\n./reader 1.07 100\n./reader 1.08 100\n./reader 1.09 100\n./reader 1.10 100\n./reader 1.11 100\n./reader 1.12 100\n./reader 1.13 100\n./reader 1.14 100\n./reader 1.15 100\n./reader 1.16 100\n./reader 1.17 100\n./reader 1.18 100\n./reader 1.19 100\n./reader 1.20 100\n./reader 1.21 100\n./reader 1.22 100\n./reader 1.23 100\n./reader 1.24 100\n./reader 1.25 100\n./reader 1.26 100\n./reader 1.27 100\n./reader 1.28 100\n./reader 1.29 100\n./reader 1.30 100\n./reader 1.31 100\n./reader 1.32 100\n./reader 1.33 100\n./reader 1.34 100\n./reader 1.35 100\n./reader 1.36 100\n./reader 1.37 100\n./reader 1.38 100\n./reader 1.39 100\n./reader 1.40 100\n./reader 1.41 100\n./reader 1.42 100\n./reader 1.43 100\n./reader 1.44 100\n./reader 1.45 100\n./reader 1.46 100\n./reader 1.47 100\n./reader 1.48 100\n./reader 1.49 100\n./reader 1.50 100\n./reader 1.51 100\n./reader 1.52 100\n./reader 1.53 100\n./reader 1.54 100\n./reader 1.55 100\n./reader 1.56 100\n./reader 1.57 100\n./reader 1.58 100\n./reader 1.59 100\n./reader 1.60 100\n./reader 1.61 100\n./reader 1.62 100\n./reader 1.63 100\n./reader 1.64 100\n./reader 1.65 100\n./reader 1.66 100\n./reader 1.67 100\n./reader 1.68 100\n./reader 1.69 100\n./reader 1.70 100\n./reader 1.71 100\n./reader 1.72 100\n./reader 1.73 100\n./reader 1.74 100\n./reader 1.75 100\n./reader 1.76 100\n./reader 1.77 100\n./reader 1.78 100\n./reader 1.79 100\n./reader 1.80 100\n./reader 1.81 100\n./reader 1.82 100\n./reader 1.83 100\n./reader 1.84 100\n./reader 1.85 100\n./reader 1.86 100\n./reader 1.87 100\n./reader 1.88 100\n./reader 1.89 100\n./reader 1.90 100\n./reader 1.91 100\n./reader 1.92 100\n./reader 1.93 100\n./reader 1.94 100\n./reader 1.95 100\n./reader 1.96 100\n./reader 1.97 100\n./reader 1.98 100\n./reader 1.99 100\n./reader 2.00 100\n./reader 2.01 100\n./reader 2.02 100\n./reader 2.03 100\n./reader 2.04 100\n./reader 2.05 100\n./reader 2.06 100\n./reader 2.07 100\n./reader 2.08 100\n./reader 2.09 100\n./reader 2.10 100\n./reader 2.11 100\n./reader 2.12 100\n./reader 2.13 100\n./reader 2.14 100\n./reader 2.15 100\n./reader 2.16 100\n./reader 2.17 100\n./reader 2.18 100\n./reader 2.19 100\n./reader 2.20 100\n./reader 2.21 100\n./reader 2.22 100\n./reader 2.23 100\n./reader 2.24 100\n./reader 2.25 100\n./reader 2.26 100\n./reader 2.27 100\n./reader 2.28 100\n./reader 2.29 100\n./reader 2.30 100\n./reader 2.31 100\n./reader 2.32 100\n./reader 2.33 100\n./reader 2.34 100\n./reader 2.35 100\n./reader 2.36 100\n./reader 2.37 100\n./reader 2.38 100\n./reader 2.39 100\n./reader 2.40 100\n./reader 2.41 100\n./reader 2.42 100\n./reader 2.43 100\n./reader 2.44 100\n./reader 2.45 100\n./reader 2.46 100\n./reader 2.47 100\n./reader 2.48 100\n./reader 2.49 100\n./reader 2.50 100\n./reader 2.51 100\n./reader 2.52 100\n./reader 2.53 100\n./reader 2.54 100\n./reader 2.55 100\n./reader 2.56 100\n./reader 2.57 100\n./reader 2.58 100\n./reader 2.59 100\n./reader 2.60 100\n./reader 2.61 100\n./reader 2.62 100\n./reader 2.63 100\n./reader 2.64 100\n./reader 2.65 100\n./reader 2.66 100\n./reader 2.67 100\n./reader 2.68 100\n./reader 2.69 100\n./reader 2.70 100\n./reader 2.71 100\n./reader 2.72 100\n./reader 2.73 100\n./reader 2.74 100\n./reader 2.75 100\n./reader 2.76 100\n./reader 2.77 100\n./reader 2.78 100\n./reader 2.79 100\n./reader 2.80 100\n./reader 2.81 100\n./reader 2.82 100\n./reader 2.83 100\n./reader 2.84 100\n./reader 2.85 100\n./reader 2.86 100\n./reader 2.87 100\n./reader 2.88 100\n./reader 2.89 100\n./reader 2.90 100\n./reader 2.91 100\n./reader 2.92 100\n./reader 2.93 100\n./reader 2.94 100\n./reader 2.95 100\n./reader 2.96 100\n./reader 2.97 100\n./reader 2.98 100\n./reader 2.99 100\n./reader 3.00 100\n./reader 3.01 100\n./reader 3.02 100\n./reader 3.03 100\n./reader 3.04 100\n./reader 3.05 100\n./reader 3.06 100\n./reader 3.07 100\n./reader 3.08 100\n./reader 3.09 100\n./reader 3.10 100\n./reader 3.11 100\n./reader 3.12 100\n./reader 3.13 100\n./reader 3.14 100\n./reader 3.15 100\n./reader 3.16 100\n./reader 3.17 100\n./reader 3.18 100\n./reader 3.19 100\n./reader 3.20 100\n./reader 3.21 100\n./reader 3.22 100\n./reader 3.23 100\n./reader 3.24 100\n./reader 3.25 100\n./reader 3.26 100\n./reader 3.27 100\n./reader 3.28 100\n./reader 3.29 100\n./reader 3.30 100\n./reader 3.31 100\n./reader 3.32 100\n./reader 3.33 100\n./reader 3.34 100\n./reader 3.35 100\n./reader 3.36 100\n./reader 3.37 100\n./reader 3.38 100\n./reader 3.39 100\n./reader 3.40 100\n./reader 3.41 100\n./reader 3.42 100\n./reader 3.43 100\n./reader 3.44 100\n./reader 3.45 100\n./reader 3.46 100\n./reader 3.47 100\n./reader 3.48 100\n./reader 3.49 100\n./reader 3.50 100\n./reader 3.51 100\n./reader 3.52 100\n./reader 3.53 100\n./reader 3.54 100\n./reader 3.55 100\n./reader 3.56 100\n./reader 3.57 100\n./reader 3.58 100\n./reader 3.59 100\n./reader 3.60 100\n./reader 3.61 100\n./reader 3.62 100\n./reader 3.63 100\n./reader 3.64 100\n./reader 3.65 100\n./reader 3.66 100\n./reader 3.67 100\n./reader 3.68 100\n./reader 3.69 100\n./reader 3.70 100\n./reader 3.71 100\n./reader 3.72 100\n./reader 3.73 100\n./reader 3.74 100\n./reader 3.75 100\n./reader 3.76 100\n./reader 3.77 100\n./reader 3.78 100\n./reader 3.79 100\n./reader 3.80 100\n./reader 3.81 100\n./reader 3.82 100\n./reader 3.83 100\n./reader 3.84 100\n./reader 3.85 100\n./reader 3.86 100\n./reader 3.87 100\n./reader 3.88 100\n./reader 3.89 100\n./reader 3.90 100\n./reader 3.91 100\n./reader 3.92 100\n./reader 3.93 100\n./reader 3.94 100\n./reader 3.95 100\n./reader 3.96 100\n./reader 3.97 100\n./reader 3.98 100\n./reader 3.99 100\n./reader 4.00 100\n./reader 4.01 100\n./reader 4.02 100\n./reader 4.03 100\n./reader 4.04 100\n./reader 4.05 100\n./reader 4.06 100\n./reader 4.07 100\n./reader 4.08 100\n./reader 4.09 100\n./reader 4.10 100\n./reader 4.11 100\n./reader 4.12 100\n./reader 4.13 100\n./reader 4.14 100\n./reader 4.15 100\n./reader 4.16 100\n./reader 4.17 100\n./reader 4.18 100\n./reader 4.19 100\n./reader 4.20 100\n./reader 4.21 100\n./reader 4.22 100\n./reader 4.23 100\n./reader 4.24 100\n./reader 4.25 100\n./reader 4.26 100\n./reader 4.27 100\n./reader 4.28 100\n./reader 4.29 100\n./reader 4.30 100\n./reader 4.31 100\n./reader 4.32 100\n./reader 4.33 100\n./reader 4.34 100\n./reader 4.35 100\n./reader 4.36 100\n./reader 4.37 100\n./reader 4.38 100\n./reader 4.39 100\n./reader 4.40 100\n./reader 4.41 100\n./reader 4.42 100\n./reader 4.43 100\n./reader 4.44 100\n./reader 4.45 100\n./reader 4.46 100\n./reader 4.47 100\n./reader 4.48 100\n./reader 4.49 100\n./reader 4.50 100\n./reader 4.51 100\n./reader 4.52 100\n./reader 4.53 100\n./reader 4.54 100\n./reader 4.55 100\n./reader 4.56 100\n./reader 4.57 100\n./reader 4.58 100\n./reader 4.59 100\n./reader 4.60 100\n./reader 4.61 100\n./reader 4.62 100\n./reader 4.63 100\n./reader 4.64 100\n./reader 4.65 100\n./reader 4.66 100\n./reader 4.67 100\n./reader 4.68 100\n./reader 4.69 100\n./reader 4.70 100\n./reader 4.71 100\n./reader 4.72 100\n./reader 4.73 100\n./reader 4.74 100\n./reader 4.75 100\n./reader 4.76 100\n./reader 4.77 100\n./reader 4.78 100\n./reader 4.79 100\n./reader 4.80 100\n./reader 4.81 100\n./reader 4.82 100\n./reader 4.83 100\n./reader 4.84 100\n./reader 4.85 100\n./reader 4.86 100\n./reader 4.87 100\n./reader 4.88 100\n./reader 4.89 100\n./reader 4.90 100\n./reader 4.91 100\n./reader 4.92 100\n./reader 4.93 100\n./reader 4.94 100\n./reader 4.95 100\n./reader 4.96 100\n./reader 4.97 100\n./reader 4.98 100\n./reader 4.99 100\n./reader 5.00 100\n./reader 5.01 100\n./reader 5.02 100\n./reader 5.03 100\n./reader 5.04 100\n./reader 5.05 100\n./reader 5.06 100\n./reader 5.07 100\n./reader 5.08 100\n./reader 5.09 100\n./reader 5.10 100\n./reader 5.11 100\n./reader 5.12 100\n./reader 5.13 100\n./reader 5.14 100\n./reader 5.15 100\n./reader 5.16 100\n./reader 5.17 100\n./reader 5.18 100\n./reader 5.19 100\n./reader 5.20 100\n./reader 5.21 100\n./reader 5.22 100\n./reader 5.23 100\n./reader 5.24 100\n./reader 5.25 100\n./reader 5.26 100\n./reader 5.27 100\n./reader 5.28 100\n./reader 5.29 100\n./reader 5.30 100\n./reader 5.31 100\n./reader 5.32 100\n./reader 5.33 100\n./reader 5.34 100\n./reader 5.35 100\n./reader 5.36 100\n./reader 5.37 100\n./reader 5.38 100\n./reader 5.39 100\n./reader 5.40 100\n./reader 5.41 100\n./reader 5.42 100\n./reader 5.43 100\n./reader 5.44 100\n./reader 5.45 100\n./reader 5.46 100\n./reader 5.47 100\n./reader 5.48 100\n./reader 5.49 100\n./reader 5.50 100\n./reader 5.51 100\n./reader 5.52 100\n./reader 5.53 100\n./reader 5.54 100\n./reader 5.55 100\n./reader 5.56 100\n./reader 5.57 100\n./reader 5.58 100\n./reader 5.59 100\n./reader 5.60 100\n./reader 5.61 100\n./reader 5.62 100\n./reader 5.63 100\n./reader 5.64 100\n./reader 5.65 100\n./reader 5.66 100\n./reader 5.67 100\n./reader 5.68 100\n./reader 5.69 100\n./reader 5.70 100\n./reader 5.71 100\n./reader 5.72 100\n./reader 5.73 100\n./reader 5.74 100\n./reader 5.75 100\n./reader 5.76 100\n./reader 5.77 100\n./reader 5.78 100\n./reader 5.79 100\n./reader 5.80 100\n./reader 5.81 100\n./reader 5.82 100\n./reader 5.83 100\n./reader 5.84 100\n./reader 5.85 100\n./reader 5.86 100\n./reader 5.87 100\n./reader 5.88 100\n./reader 5.89 100\n./reader 5.90 100\n./reader 5.91 100\n./reader 5.92 100\n./reader 5.93 100\n./reader 5.94 100\n./reader 5.95 100\n./reader 5.96 100\n./reader 5.97 100\n./reader 5.98 100\n./reader 5.99 100\n./reader 6.00 100\n./reader 6.01 100\n./reader 6.02 100\n./reader 6.03 100\n./reader 6.04 100\n./reader 6.05 100\n./reader 6.06 100\n./reader 6.07 100\n./reader 6.08 100\n./reader 6.09 100\n./reader 6.10 100\n./reader 6.11 100\n./reader 6.12 100\n./reader 6.13 100\n./reader 6.14 100\n./reader 6.15 100\n./reader 6.16 100\n./reader 6.17 100\n./reader 6.18 100\n./reader 6.19 100\n./reader 6.20 100\n./reader 6.21 100\n./reader 6.22 100\n./reader 6.23 100\n./reader 6.24 100\n./reader 6.25 100\n./reader 6.26 100\n./reader 6.27 100\n./reader 6.28 100\n./reader 6.29 100\n./reader 6.30 100\n./reader 6.31 100\n./reader 6.32 100\n./reader 6.33 100\n./reader 6.34 100\n./reader 6.35 100\n./reader 6.36 100\n./reader 6.37 100\n./reader 6.38 100\n./reader 6.39 100\n./reader 6.40 100\n./reader 6.41 100\n./reader 6.42 100\n./reader 6.43 100\n./reader 6.44 100\n./reader 6.45 100\n./reader 6.46 100\n./reader 6.47 100\n./reader 6.48 100\n./reader 6.49 100\n./reader 6.50 100\n./reader 6.51 100\n./reader 6.52 100\n./reader 6.53 100\n./reader 6.54 100\n./reader 6.55 100\n./reader 6.56 100\n./reader 6.57 100\n./reader 6.58 100\n./reader 6.59 100\n./reader 6.60 100\n./reader 6.61 100\n./reader 6.62 100\n./reader 6.63 100\n./reader 6.64 100\n./reader 6.65 100\n./reader 6.66 100\n./reader 6.67 100\n./reader 6.68 100\n./reader 6.69 100\n./reader 6.70 100\n./reader 6.71 100\n./reader 6.72 100\n./reader 6.73 100\n./reader 6.74 100\n./reader 6.75 100\n./reader 6.76 100\n./reader 6.77 100\n./reader 6.78 100\n./reader 6.79 100\n./reader 6.80 100\n./reader 6.81 100\n./reader 6.82 100\n./reader 6.83 100\n./reader 6.84 100\n./reader 6.85 100\n./reader 6.86 100\n./reader 6.87 100\n./reader 6.88 100\n./reader 6.89 100\n./reader 6.90 100\n./reader 6.91 100\n./reader 6.92 100\n./reader 6.93 100\n./reader 6.94 100\n./reader 6.95 100\n./reader 6.96 100\n./reader 6.97 100\n./reader 6.98 100\n./reader 6.99 100\n./reader 7.00 100\n./reader 7.01 100\n./reader 7.02 100\n./reader 7.03 100\n./reader 7.04 100\n./reader 7.05 100\n./reader 7.06 100\n./reader 7.07 100\n./reader 7.08 100\n./reader 7.09 100\n./reader 7.10 100\n./reader 7.11 100\n./reader 7.12 100\n./reader 7.13 100\n./reader 7.14 100\n./reader 7.15 100\n./reader 7.16 100\n./reader 7.17 100\n./reader 7.18 100\n./reader 7.19 100\n./reader 7.20 100\n./reader 7.21 100\n./reader 7.22 100\n./reader 7.23 100\n./reader 7.24 100\n./reader 7.25 100\n./reader 7.26 100\n./reader 7.27 100\n./reader 7.28 100\n./reader 7.29 100\n./reader 7.30 100\n./reader 7.31 100\n./reader 7.32 100\n./reader 7.33 100\n./reader 7.34 100\n./reader 7.35 100\n./reader 7.36 100\n./reader 7.37 100\n./reader 7.38 100\n./reader 7.39 100\n./reader 7.40 100\n./reader 7.41 100\n./reader 7.42 100\n./reader 7.43 100\n./reader 7.44 100\n./reader 7.45 100\n./reader 7.46 100\n./reader 7.47 100\n./reader 7.48 100\n./reader 7.49 100\n./reader 7.50 100\n./reader 7.51 100\n./reader 7.52 100\n./reader 7.53 100\n./reader 7.54 100\n./reader 7.55 100\n./reader 7.56 100\n./reader 7.57 100\n./reader 7.58 100\n./reader 7.59 100\n./reader 7.60 100\n./reader 7.61 100\n./reader 7.62 100\n./reader 7.63 100\n./reader 7.64 100\n./reader 7.65 100\n./reader 7.66 100\n./reader 7.67 100\n./reader 7.68 100\n./reader 7.69 100\n./reader 7.70 100\n./reader 7.71 100\n./reader 7.72 100\n./reader 7.73 100\n./reader 7.74 100\n./reader 7.75 100\n./reader 7.76 100\n./reader 7.77 100\n./reader 7.78 100\n./reader 7.79 100\n./reader 7.80 100\n./reader 7.81 100\n./reader 7.82 100\n./reader 7.83 100\n./reader 7.84 100\n./reader 7.85 100\n./reader 7.86 100\n./reader 7.87 100\n./reader 7.88 100\n./reader 7.89 100\n./reader 7.90 100\n./reader 7.91 100\n./reader 7.92 100\n./reader 7.93 100\n./reader 7.94 100\n./reader 7.95 100\n./reader 7.96 100\n./reader 7.97 100\n./reader 7.98 100\n./reader 7.99 100\n./reader 8.00 100\n./reader 8.01 100\n./reader 8.02 100\n./reader 8.03 100\n./reader 8.04 100\n./reader 8.05 100\n./reader 8.06 100\n./reader 8.07 100\n./reader 8.08 100\n./reader 8.09 100\n./reader 8.10 100\n./reader 8.11 100\n./reader 8.12 100\n./reader 8.13 100\n./reader 8.14 100\n./reader 8.15 100\n./reader 8.16 100\n./reader 8.17 100\n./reader 8.18 100\n./reader 8.19 100\n./reader 8.20 100\n./reader 8.21 100\n./reader 8.22 100\n./reader 8.23 100\n./reader 8.24 100\n./reader 8.25 100\n./reader 8.26 100\n./reader 8.27 100\n./reader 8.28 100\n./reader 8.29 100\n./reader 8.30 100\n./reader 8.31 100\n./reader 8.32 100\n./reader 8.33 100\n./reader 8.34 100\n./reader 8.35 100\n./reader 8.36 100\n./reader 8.37 100\n./reader 8.38 100\n./reader 8.39 100\n./reader 8.40 100\n./reader 8.41 100\n./reader 8.42 100\n./reader 8.43 100\n./reader 8.44 100\n./reader 8.45 100\n./reader 8.46 100\n./reader 8.47 100\n./reader 8.48 100\n./reader 8.49 100\n./reader 8.50 100\n./reader 8.51 100\n./reader 8.52 100\n./reader 8.53 100\n./reader 8.54 100\n./reader 8.55 100\n./reader 8.56 100\n./reader 8.57 100\n./reader 8.58 100\n./reader 8.59 100\n./reader 8.60 100\n./reader 8.61 100\n./reader 8.62 100\n./reader 8.63 100\n./reader 8.64 100\n./reader 8.65 100\n./reader 8.66 100\n./reader 8.67 100\n./reader 8.68 100\n./reader 8.69 100\n./reader 8.70 100\n./reader 8.71 100\n./reader 8.72 100\n./reader 8.73 100\n./reader 8.74 100\n./reader 8.75 100\n./reader 8.76 100\n./reader 8.77 100\n./reader 8.78 100\n./reader 8.79 100\n./reader 8.80 100\n./reader 8.81 100\n./reader 8.82 100\n./reader 8.83 100\n./reader 8.84 100\n./reader 8.85 100\n./reader 8.86 100\n./reader 8.87 100\n./reader 8.88 100\n./reader 8.89 100\n./reader 8.90 100\n./reader 8.91 100\n./reader 8.92 100\n./reader 8.93 100\n./reader 8.94 100\n./reader 8.95 100\n./reader 8.96 100\n./reader 8.97 100\n./reader 8.98 100\n./reader 8.99 100\n./reader 9.00 100\n./reader 9.01 100\n./reader 9.02 100\n./reader 9.03 100\n./reader 9.04 100\n./reader 9.05 100\n./reader 9.06 100\n./reader 9.07 100\n./reader 9.08 100\n./reader 9.09 100\n./reader 9.10 100\n./reader 9.11 100\n./reader 9.12 100\n./reader 9.13 100\n./reader 9.14 100\n./reader 9.15 100\n./reader 9.16 100\n./reader 9.17 100\n./reader 9.18 100\n./reader 9.19 100\n./reader 9.20 100\n./reader 9.21 100\n./reader 9.22 100\n./reader 9.23 100\n./reader 9.24 100\n./reader 9.25 100\n./reader 9.26 100\n./reader 9.27 100\n./reader 9.28 100\n./reader 9.29 100\n./reader 9.30 100\n./reader 9.31 100\n./reader 9.32 100\n./reader 9.33 100\n./reader 9.34 100\n./reader 9.35 100\n./reader 9.36 100\n./reader 9.37 100\n./reader 9.38 100\n./reader 9.39 100\n./reader 9.40 100\n./reader 9.41 100\n./reader 9.42 100\n./reader 9.43 100\n./reader 9.44 100\n./reader 9.45 100\n./reader 9.46 100\n./reader 9.47 100\n./reader 9.48 100\n./reader 9.49 100\n./reader 9.50 100\n./reader 9.51 100\n./reader 9.52 100\n./reader 9.53 100\n./reader 9.54 100\n./reader 9.55 100\n./reader 9.56 100\n./reader 9.57 100\n./reader 9.58 100\n./reader 9.59 100\n./reader 9.60 100\n./reader 9.61 100\n./reader 9.62 100\n./reader 9.63 100\n./reader 9.64 100\n./reader 9.65 100\n./reader 9.66 100\n./reader 9.67 100\n./reader 9.68 100\n./reader 9.69 100\n./reader 9.70 100\n./reader 9.71 100\n./reader 9.72 100\n./reader 9.73 100\n./reader 9.74 100\n./reader 9.75 100\n./reader 9.76 100\n./reader 9.77 100\n./reader 9.78 100\n./reader 9.79 100\n./reader 9.80 100\n./reader 9.81 100\n./reader 9.82 100\n./reader 9.83 100\n./reader 9.84 100\n./reader 9.85 100\n./reader 9.86 100\n./reader 9.87 100\n./reader 9.88 100\n./reader 9.89 100\n./reader 9.90 100\n./reader 9.91 100\n./reader 9.92 100\n./reader 9.93 100\n./reader 9.94 100\n./reader 9.95 100\n./reader 9.96 100\n./reader 9.97 100\n./reader 9.98 100\n./reader 9.99 100\n./reader 10.00 100\n"
  },
  {
    "path": "c/reader.c",
    "content": "#include <assert.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n\n#include <libhackrf/hackrf.h>\n\nconst uint64_t NRF_SAMPLES_LENGTH = 262144;\nuint64_t BUFFER_SIZE = 0;\nuint64_t FREQUENCY = 1e6;\nconst uint32_t SAMPLE_RATE = 5e6;\nuint8_t *buffer;\nlong buffer_pos = 0;\n\nint skip = 10;\n\n#define CHECK_STATUS(status, message) \\\n    if (status != 0) { \\\n        printf(\"FAIL: %s\\n\", message); \\\n        hackrf_close(device); \\\n        hackrf_exit(); \\\n        exit(EXIT_FAILURE); \\\n    } \\\n\nint receive_sample_block(hackrf_transfer *transfer) {\n    if (skip > 0) {\n        printf(\"skip: %d\\n\", skip);\n        skip--;\n        return 0;\n    }\n    printf(\"block length: %d index: %d\\n\", transfer->valid_length, (int)(buffer_pos / (double) NRF_SAMPLES_LENGTH));\n    for (int i = 0; i < transfer->valid_length; i++) {\n        if (buffer_pos < BUFFER_SIZE) {\n            buffer[buffer_pos++] = transfer->buffer[i];\n        }\n    }\n    if (buffer_pos >= BUFFER_SIZE) {\n        char fname[100];\n        snprintf(fname, 100, \"../rfdata/rf-%.3f.raw\", FREQUENCY / 1.0e6);\n        FILE *fp = fopen(fname, \"wb\");\n        if (fp) {\n            fwrite(buffer, BUFFER_SIZE, 1, fp);\n            fclose(fp);\n            printf(\"Written %s.\\n\", fname);\n            exit(0);\n        }\n    }\n    return 0;\n}\n\nvoid usage() {\n    printf(\"reader freq_mhz count\\n\");\n}\n\nint main(int argc, char **argv) {\n    if (argc != 3) {\n        usage();\n        exit(1);\n    }\n    double freq_mhz = atof(argv[1]);\n    FREQUENCY = freq_mhz * 1e6;\n    int count = atoi(argv[2]);\n    BUFFER_SIZE = NRF_SAMPLES_LENGTH * count;\n    buffer = calloc(BUFFER_SIZE, 1);\n\n    int status;\n    hackrf_device *device;\n\n    status = hackrf_init();\n    CHECK_STATUS(status, \"hackrf_init\");\n\n    status = hackrf_open(&device);\n    CHECK_STATUS(status, \"hackrf_open\");\n\n    status = hackrf_set_freq(device, FREQUENCY);\n    CHECK_STATUS(status, \"hackrf_set_freq\");\n\n    status = hackrf_set_sample_rate(device, SAMPLE_RATE);\n    CHECK_STATUS(status, \"hackrf_set_sample_rate\");\n\n    status = hackrf_set_amp_enable(device, 0);\n    CHECK_STATUS(status, \"hackrf_set_amp_enable\");\n\n    status = hackrf_set_lna_gain(device, 32);\n    CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_set_vga_gain(device, 34);\n    CHECK_STATUS(status, \"hackrf_set_vga_gain\");\n\n    status = hackrf_start_rx(device, receive_sample_block, NULL);\n    CHECK_STATUS(status, \"hackrf_start_rx\");\n\n    while (buffer_pos < BUFFER_SIZE) {\n        sleep(1);\n    }\n\n    hackrf_stop_rx(device);\n    hackrf_close(device);\n    hackrf_exit();\n    return 0;\n}\n"
  },
  {
    "path": "c/render-text.c",
    "content": "#include <math.h>\n\n#define STB_TRUETYPE_IMPLEMENTATION\n#include \"../externals/stb/stb_truetype.h\"\n\n#include \"easypng.h\"\n\nconst char* font_file = \"../fonts/Roboto-Bold.ttf\";\n\nint imax(const int a, const int b) {\n    return a > b ? a : b;\n}\n\nvoid measure_text(const stbtt_fontinfo *font, const char *text, int x, int y, int font_size, int *width, int *height) {\n    float font_scale = stbtt_ScaleForPixelHeight(font, font_size);\n    int ascent, descent;\n    stbtt_GetFontVMetrics(font, &ascent, &descent, 0);\n    int baseline = (int) (ascent * font_scale);\n    int descent_scaled = (int) (descent * font_scale);\n    printf(\"Baseline %d descent %d\\n\", baseline, descent_scaled);\n\n    *width = x;\n    // The glyph height is constant for the font.\n    // Descent_scaled is negative.\n    *height = y + (baseline - descent_scaled);\n\n    int ch = 0;\n    while (text[ch]) {\n        int x0, y0, x1, y1;\n        int advance, lsb;\n        char c = text[ch];\n        stbtt_GetCodepointBitmapBox(font, c, font_scale, font_scale, &x0, &y0, &x1, &y1);\n        stbtt_GetCodepointHMetrics(font, c, &advance, &lsb);\n        int glyph_width = advance * font_scale;\n        *width += glyph_width;\n        if (text[ch + 1]) {\n            *width += font_scale * stbtt_GetCodepointKernAdvance(font, c, text[ch + 1]);\n        }\n        ch++;\n    }\n}\n\n// FIXME compose using alpha lookup\nvoid img_gray_copy(uint8_t *dst, uint8_t *src, uint32_t dst_x, uint32_t dst_y, uint32_t src_x, uint32_t src_y, uint32_t width, uint32_t height, uint32_t dst_stride, uint32_t src_stride) {\n    for (uint32_t i = 0; i < height; i++) {\n        for (uint32_t j = 0; j < width; j++) {\n            dst[(dst_y + i) * dst_stride + dst_x + j] = src[(src_y + i) * src_stride + src_x + j];\n        }\n    }\n}\n\nint main() {\n    FILE *fp = fopen(font_file, \"rb\");\n    fseek(fp, 0L, SEEK_END);\n    long size = ftell(fp);\n    rewind(fp);\n    uint8_t *font_buffer = calloc(size, 1);\n    fread(font_buffer, size, 1, fp);\n    fclose(fp);\n    printf(\"Font file size %ld\\n\", size);\n\n    stbtt_fontinfo font;\n    printf(\"Offset: %d\\n\", stbtt_GetFontOffsetForIndex(font_buffer, 0));\n    stbtt_InitFont(&font, font_buffer, stbtt_GetFontOffsetForIndex(font_buffer, 0));\n\n    const char *text = \"Hello, World!\";\n    int font_size = 300;\n    float font_scale = stbtt_ScaleForPixelHeight(&font, font_size);\n    int text_width, text_height;\n    measure_text(&font, text, 0, 0, font_size, &text_width, &text_height);\n    printf(\"Text W: %d H: %d\\n\", text_width, text_height);\n\n    int ascent;\n    stbtt_GetFontVMetrics(&font, &ascent, 0, 0);\n    int baseline = (int) (ascent * font_scale);\n\n\n    // Make full image\n    uint8_t *image_buffer = calloc(text_width * text_height, 1);\n    int ch = 0;\n    int x = 0;\n    while (text[ch]) {\n        int w, h, dx, dy;\n        int advance, lsb;\n        char c = text[ch];\n        stbtt_GetCodepointHMetrics(&font, c, &advance, &lsb);\n        uint8_t *glyph_bitmap = stbtt_GetCodepointBitmap(&font, font_scale, font_scale, c, &w, &h, &dx, &dy);\n        printf(\"Offset %d %d\\n\", dx, baseline + dy);\n        img_gray_copy(image_buffer, glyph_bitmap, x + dx, baseline + dy, 0, 0, w, h, text_width, w);\n        //x += w;\n        x += (advance * font_scale);\n\n        if (text[ch + 1]) {\n            x += font_scale * stbtt_GetCodepointKernAdvance(&font, c, text[ch + 1]);\n        }\n\n        ch++;\n    }\n\n    //draw_text(&font, \"Hi!\", 0, 0)\n    write_gray_png(\"_text.png\", text_width, text_height, image_buffer);\n\n\n\n\n\n\n\n    // float font_scale = stbtt_ScaleForPixelHeight(&font, font_size);\n    // int ascent;\n    // stbtt_GetFontVMetrics(&font, &ascent, 0, 0);\n    // printf(\"Sclae %.2f Ascent %d\\n\", font_scale, ascent);\n    // //int baseline = (int) (ascent * font_scale);\n    // int x_pos = 2; // Pad a little bit.\n\n\n    // const char *text = \"&\";\n    // int ch = 0;\n    // while (text[ch]) {\n    //     int advance, lsb;\n    //     //float x_shift = x_pos - (float) floor(x_pos);\n    //     char c = text[ch];\n    //     stbtt_GetCodepointHMetrics(&font, c, &advance, &lsb);\n    //     //stbtt_GetCodepointBitmapBoxSubpixel(&font, c, font_scale, font_scale, x_shift, 0, &x0, &y0, &x1, &y1);\n    //     int w, h;\n    //     unsigned char *bitmap = stbtt_GetCodepointBitmap(&font, 0, font_scale, c, &w, &h, 0, 0);\n    //     printf(\"Width %d Height %d\\n\", w, h);\n    //     write_gray_png(\"_text.png\", w, h, bitmap);\n\n    //     //sbtt_MakeCodepointBitmap(&font, );\n    //     x_pos += (advance * font_scale);\n    //     if (text[ch + 1]) {\n    //         x_pos += font_scale * stbtt_GetCodepointKernAdvance(&font, text[ch], text[ch + 1]);\n    //     }\n    //     ch++;\n    // }\n\n\n    return 0;\n}\n"
  },
  {
    "path": "c/rfcap.c",
    "content": "// Capture n samples of a frequency range.\n\n#include <libhackrf/hackrf.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n\nconst int SAMPLE_SIZE=512*512;\n\ndouble current_freq = 0;\nint n_samples = 0;\n\nhackrf_device *device;\nint receive_count = 0;\nuint8_t buffer[SAMPLE_SIZE];\n\n#define HACKRF_CHECK_STATUS(status, message) \\\n    if (status != 0) { \\\n        printf(\"FAIL: %s\\n\", message); \\\n        hackrf_close(device); \\\n        hackrf_exit(); \\\n        exit(EXIT_FAILURE); \\\n    } \\\n\nvoid export_buffer(uint8_t *buffer) {\n    char fname[100];\n    snprintf(fname, 100, \"export/rf-%.3f-%d.raw\", current_freq, receive_count + 1);\n    printf(\"%s\\n\", fname);\n    FILE *write_ptr = fopen(fname, \"wb\");\n    fwrite(buffer, SAMPLE_SIZE, 1, write_ptr);\n    fclose(write_ptr);\n}\n\n\nint receive_sample_block(hackrf_transfer *transfer) {\n    memcpy(buffer, transfer->buffer, SAMPLE_SIZE);\n    export_buffer(buffer);\n    receive_count += 1;\n    return 0;\n}\n\nint main(int argc, char **argv) {\n    int status;\n\n    if (argc != 3) {\n        printf(\"Usage: rfcap FREQ N_SAMPLES\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    current_freq = atof(argv[1]);\n    n_samples = atoi(argv[2]);\n\n    status = hackrf_init();\n    HACKRF_CHECK_STATUS(status, \"hackrf_init\");\n\n    status = hackrf_open(&device);\n    HACKRF_CHECK_STATUS(status, \"hackrf_open\");\n\n    status = hackrf_set_freq(device, current_freq * 1e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n\n    status = hackrf_set_sample_rate(device, 10e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_sample_rate\");\n\n    status = hackrf_set_amp_enable(device, 0);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_amp_enable\");\n\n    status = hackrf_set_lna_gain(device, 32);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_set_vga_gain(device, 30);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_start_rx(device, receive_sample_block, NULL);\n    HACKRF_CHECK_STATUS(status, \"hackrf_start_rx\");\n\n    while (receive_count < n_samples) {\n        usleep(100);\n    }\n\n    hackrf_stop_rx(device);\n    hackrf_close(device);\n    hackrf_exit();\n    return 0;\n}\n"
  },
  {
    "path": "c/sender.c",
    "content": "#include <libhackrf/hackrf.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n\nint send_sample_block(hackrf_transfer *transfer) {\n    arc4random_buf(transfer->buffer, transfer->buffer_length);\n    printf(\"block length: %d\\n\", transfer->valid_length);\n    return 0;\n}\n\nint main(int argc, char **argv) {\n    int status;\n    status = hackrf_init();\n    if (status != 0) {\n        printf(\"FAIL: hackrf_init\\n\");\n        hackrf_exit();\n        exit(EXIT_FAILURE);\n    }\n\n    hackrf_device *device;\n    status = hackrf_open(&device);\n    if (status != 0) {\n        printf(\"FAIL: hackrf_open\\n\");\n        hackrf_exit();\n        exit(EXIT_FAILURE);\n    }\n\n    status = hackrf_set_freq(device, 100.9e6);\n    if (status != 0) {\n        printf(\"FAIL: hackrf_set_freq: %d\\n\", status);\n        hackrf_close(device);\n        hackrf_exit();\n        exit(EXIT_FAILURE);\n    }\n\n    status = hackrf_set_amp_enable(device, 1);\n    if (status != 0) {\n        printf(\"FAIL: hackrf_set_amp_enable: %d\\n\", status);\n        hackrf_close(device);\n        hackrf_exit();\n        exit(EXIT_FAILURE);\n    }\n\n    status = hackrf_set_lna_gain(device, 40);\n    if (status != 0) {\n        printf(\"FAIL: hackrf_set_lna_gain: %d\\n\", status);\n        hackrf_close(device);\n        hackrf_exit();\n        exit(EXIT_FAILURE);\n    }\n\n    status = hackrf_set_vga_gain(device, 62);\n    if (status != 0) {\n        printf(\"FAIL: hackrf_set_vga_gain: %d\\n\", status);\n        hackrf_close(device);\n        hackrf_exit();\n        exit(EXIT_FAILURE);\n    }\n\n    status = hackrf_set_txvga_gain(device, 47);\n    if (status != 0) {\n        printf(\"FAIL: hackrf_set_txvga_gain: %d\\n\", status);\n        hackrf_close(device);\n        hackrf_exit();\n        exit(EXIT_FAILURE);\n    }\n\n    status = hackrf_start_tx(device, send_sample_block, NULL);\n    if (status != 0) {\n        printf(\"FAIL: hackrf_start_rx: %d\\n\", status);\n        hackrf_close(device);\n        hackrf_exit();\n        exit(EXIT_FAILURE);\n    }\n\n    sleep(3);\n\n    hackrf_stop_tx(device);\n    hackrf_close(device);\n    hackrf_exit();\n    return 0;\n}\n"
  },
  {
    "path": "c/single-sample.c",
    "content": "// Slowly show a single sample, frame by frame. Used for exporting to movie.\n\n#include <assert.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <math.h>\n#include <string.h>\n\n#include \"easypng.h\"\n\nint SAMPLES_STEP = 100;\nconst int IQ_RESOLUTION = 256;\nconst int SIZE_MULTIPLIER = 4;\nconst int IMAGE_WIDTH = 1920;\nconst int IMAGE_HEIGHT = 1080;\nconst int IQ_WIDTH = IQ_RESOLUTION * SIZE_MULTIPLIER;\nconst int IQ_HEIGHT = IQ_RESOLUTION * SIZE_MULTIPLIER;\nconst int IMAGE_OFFSET_X = (IMAGE_WIDTH - IQ_WIDTH) / 2;\nconst int IMAGE_OFFSET_Y = (IMAGE_HEIGHT - IQ_HEIGHT) / 2;\nint PIXEL_INC = 4;\nint FADE_PER_FRAME = 0;\nint PREVIEW_MODE = 0;\n\nstatic inline uint8_t clamp_u8(int v, uint8_t min, uint8_t max) {\n    return (uint8_t) (v < min ? min : v > max ? max : v);\n}\n\nvoid pixel_put(uint8_t *image_buffer, int x, int y, int color) {\n    int offset = y * IQ_WIDTH + x;\n    image_buffer[offset] = color;\n}\n\nvoid pixel_inc(uint8_t *image_buffer, int x, int y) {\n    static int have_warned = 0;\n    // Avoid white borders.\n    if (x == 0 || y == 0 || x == IMAGE_WIDTH - 1 || y == IMAGE_HEIGHT - 1) {\n        return;\n    }\n    int offset = ((y + IMAGE_OFFSET_Y) * IMAGE_WIDTH) + (x + IMAGE_OFFSET_X);\n    int v = image_buffer[offset];\n    if (v + PIXEL_INC >= 255) {\n        if (!have_warned) {\n            fprintf(stderr, \"WARN: pixel value out of range (%d, %d)\\n\", x, y);\n            have_warned = 1;\n        }\n    } else {\n        v += PIXEL_INC;\n        image_buffer[offset] = v;\n    }\n}\n\nvoid draw_line(uint8_t *image_buffer, int x1, int y1, int x2, int y2, int color) {\n  int dx = abs(x2 - x1);\n  int sx = x1 < x2 ? 1 : -1;\n  int dy = abs(y2-y1);\n  int sy = y1 < y2 ? 1 : -1;\n  int err = (dx > dy ? dx : -dy) / 2;\n  int e2;\n\n  for(;;){\n    pixel_inc(image_buffer, x1, y1);\n    if (x1 == x2 && y1 == y2) break;\n    e2 = err;\n    if (e2 > -dx) { err -= dy; x1 += sx; }\n    if (e2 <  dy) { err += dx; y1 += sy; }\n  }\n}\n\nvoid write_image(uint8_t *image_buffer, int fname_index) {\n    char fname[100];\n    snprintf(fname, 100, \"_export/sample-%d.png\", fname_index);\n    write_gray_png(fname, IMAGE_WIDTH, IMAGE_HEIGHT, image_buffer);\n}\n\nvoid usage() {\n    printf(\"single-sample [-p pixel_inc] [-s samples_per_frame] [-f fade_per_frame] [-v (preview)] rfdata.raw\\n\");\n}\n\nint main(int argc, char **argv) {\n    char *sample_fname;\n    char ch;\n    while ((ch = getopt(argc, argv, \"p:s:f:v\")) != -1) {\n        switch (ch) {\n            case 'p':\n                PIXEL_INC = atoi(optarg);\n                break;\n            case 's':\n                SAMPLES_STEP = atoi(optarg);\n                break;\n            case 'f':\n                FADE_PER_FRAME = atoi(optarg);\n                break;\n            case 'v':\n                PREVIEW_MODE = 1;\n                break;\n            case '?':\n            default:\n                usage();\n                exit(1);\n        }\n    }\n    argc -= optind;\n    argv += optind;\n    if (argc != 1) {\n        usage();\n        exit(1);\n    }\n    sample_fname = argv[0];\n    FILE *fp = fopen(sample_fname, \"r\");\n    assert(fp != NULL);\n    fseek(fp, 0L, SEEK_END);\n    long size = ftell(fp);\n    rewind(fp);\n    uint8_t *sample_buffer = calloc(size, sizeof(uint8_t));\n    fread(sample_buffer, size, 1, fp);\n    fclose(fp);\n\n    uint8_t *image_buffer = calloc(IMAGE_WIDTH * IMAGE_HEIGHT, sizeof(uint8_t));\n    printf(\"Size: %ld\\n\", size);\n\n    int x1 = 0;\n    int y1 = 0;\n\n    int fname_index = 1;\n    for (int j = 0; j < size; j += SAMPLES_STEP) {\n        if (FADE_PER_FRAME > 0) {\n            for (int i = 0; i < IMAGE_WIDTH * IMAGE_HEIGHT; ++i) {\n                int v = image_buffer[i];\n                v -= FADE_PER_FRAME;\n                v = clamp_u8(v, 0, 255);\n                image_buffer[i] = v;\n            }\n        }\n\n        for (int i = 0; i < SAMPLES_STEP; i += 2) {\n            int x2 = (sample_buffer[j + i] + 128) % 256;\n            int y2 = (sample_buffer[j + i + 1] + 128) % 256;\n            if (i > 0) {\n                draw_line(image_buffer, x1 * SIZE_MULTIPLIER, y1 * SIZE_MULTIPLIER, x2 * SIZE_MULTIPLIER, y2 * SIZE_MULTIPLIER, 0);\n            }\n            x1 = x2;\n            y1 = y2;\n        }\n        if (!PREVIEW_MODE) {\n            write_image(image_buffer, fname_index);\n        }\n        fname_index++;\n    }\n    if (PREVIEW_MODE) {\n        write_image(image_buffer, fname_index);\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "c/tv-sender.c",
    "content": "#include <libhackrf/hackrf.h>\n#include <assert.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <math.h>\n#include <string.h>\n\n#define STB_IMAGE_IMPLEMENTATION\n#include \"../externals/stb/stb_image.h\"\n\nuint8_t *image_data;\n\nconst int freq = 49e6;\n\nint send_sample_block(hackrf_transfer *transfer) {\n    //printf(\".\\n\");\n    //arc4random_buf(transfer->buffer, transfer->buffer_length);\n    memset(transfer->buffer, 0, transfer->buffer_length);\n\n    //memcpy(transfer->buffer, image_data, transfer->buffer_length);\n\n    int v = 0;\n    for (int i = 0; i < transfer->buffer_length; i += 2) {\n        int px = image_data[v];\n        int vi = 255-px ;\n        int vq = 255-px ;\n        //printf(\"%d %d %d\\n\", px, vi, vq);\n        transfer->buffer[i] = vi;\n        transfer->buffer[i + 1] = vq;\n        v+= 3;\n    }\n    //printf(\"%d\\n\", v);\n    //     //double vi = i;\n    //     //vi /= (double) transfer->buffer_length;\n    //     //vi *= 255;\n    //     //vi *= M_PI * 2;\n    //     //vi = sin(vi);\n    //     //vi = abs(vi) * 255;\n    //     //printf(\"%d\\n\", transfer->buffer[i]);\n    //     //transfer->buffer[i] = 0;\n    //     transfer->buffer[i+1] = 255;\n    //     transfer->buffer[i+2] = 128;\n    //     transfer->buffer[i+3] = 0;\n    // }\n    //printf(\"block length: %d\\n\", transfer->valid_length);\n    return 0;\n}\n\n\nint main(int argc, char **argv) {\n    int width, height, channels;\n    image_data  = stbi_load(\"../img/lenna-tv.jpg\", &width, &height, &channels, 3);\n    printf(\"width %d height %d channels %d\\n\", width, height, channels);\n\n    int status;\n    status = hackrf_init();\n    if (status != 0) {\n        printf(\"FAIL: hackrf_init\\n\");\n        hackrf_exit();\n        exit(EXIT_FAILURE);\n    }\n\n    hackrf_device *device;\n    status = hackrf_open(&device);\n    if (status != 0) {\n        printf(\"FAIL: hackrf_open\\n\");\n        hackrf_exit();\n        exit(EXIT_FAILURE);\n    }\n\n    status = hackrf_set_freq(device, freq);\n    if (status != 0) {\n        printf(\"FAIL: hackrf_set_freq: %d\\n\", status);\n        hackrf_close(device);\n        hackrf_exit();\n        exit(EXIT_FAILURE);\n    }\n\n    status = hackrf_set_sample_rate(device, 6e6);\n    if (status != 0) {\n        printf(\"FAIL: hackrf_set_sample_rate: %d\\n\", status);\n        hackrf_close(device);\n        hackrf_exit();\n        exit(EXIT_FAILURE);\n    }\n\n    status = hackrf_set_amp_enable(device, 1);\n    if (status != 0) {\n        printf(\"FAIL: hackrf_set_amp_enable: %d\\n\", status);\n        hackrf_close(device);\n        hackrf_exit();\n        exit(EXIT_FAILURE);\n    }\n\n    // // status = hackrf_set_lna_gain(device, 40);\n    // // if (status != 0) {\n    // //     printf(\"FAIL: hackrf_set_lna_gain: %d\\n\", status);\n    // //     hackrf_close(device);\n    // //     hackrf_exit();\n    // //     exit(EXIT_FAILURE);\n    // // }\n\n    // // status = hackrf_set_vga_gain(device, 62);\n    // // if (status != 0) {\n    // //     printf(\"FAIL: hackrf_set_vga_gain: %d\\n\", status);\n    // //     hackrf_close(device);\n    // //     hackrf_exit();\n    // //     exit(EXIT_FAILURE);\n    // // }\n\n    // status = hackrf_set_txvga_gain(device, 47);\n    // if (status != 0) {\n    //     printf(\"FAIL: hackrf_set_txvga_gain: %d\\n\", status);\n    //     hackrf_close(device);\n    //     hackrf_exit();\n    //     exit(EXIT_FAILURE);\n    // }\n\n    status = hackrf_start_tx(device, send_sample_block, NULL);\n    if (status != 0) {\n        printf(\"FAIL: hackrf_start_rx: %d\\n\", status);\n        hackrf_close(device);\n        hackrf_exit();\n        exit(EXIT_FAILURE);\n    }\n\n    for (int i = 170.6e6; i < 230e6; i += 0.001e6) {\n        printf(\"Freq %d\\n\", i);\n        status = hackrf_set_freq(device, i);\n\n        sleep(1);\n    }\n    //sleep(9999);\n\n    hackrf_stop_tx(device);\n    hackrf_close(device);\n    hackrf_exit();\n    return 0;\n}\n"
  },
  {
    "path": "c/vis.c",
    "content": "#include <GLFW/glfw3.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <libhackrf/hackrf.h>\n#include <unistd.h>\n#include <string.h>\n#include <math.h>\n#include <png.h>\n\n#define WIDTH 512\n#define HEIGHT 512\n\nGLFWwindow* window;\nGLuint texture_id;\nGLuint program;\nuint8_t buffer[512 * 512];\nhackrf_device *device;\ndouble freq_mhz = 1.05;\nint paused = 0;\n\n#define HACKRF_CHECK_STATUS(status, message) \\\n    if (status != 0) { \\\n        printf(\"FAIL: %s\\n\", message); \\\n        hackrf_close(device); \\\n        hackrf_exit(); \\\n        exit(EXIT_FAILURE); \\\n    } \\\n\nint receive_sample_block(hackrf_transfer *transfer) {\n    if (paused) return 0;\n    for (int i = 0; i < transfer->valid_length; i += 2) {\n        buffer[i] = transfer->buffer[i + 1];\n        buffer[i + 1] = transfer->buffer[i + 1];\n    }\n    return 0;\n}\n\nstatic void setup_hackrf() {\n    int status;\n\n    status = hackrf_init();\n    HACKRF_CHECK_STATUS(status, \"hackrf_init\");\n\n    status = hackrf_open(&device);\n    HACKRF_CHECK_STATUS(status, \"hackrf_open\");\n\n    status = hackrf_set_freq(device, freq_mhz * 1e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n\n    status = hackrf_set_sample_rate(device, 5e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_sample_rate\");\n\n    status = hackrf_set_amp_enable(device, 0);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_amp_enable\");\n\n    status = hackrf_set_lna_gain(device, 32);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_set_vga_gain(device, 30);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_start_rx(device, receive_sample_block, NULL);\n    HACKRF_CHECK_STATUS(status, \"hackrf_start_rx\");\n\n    memset(buffer, 0, 512 * 512);\n\n    //status = hackrf_set_freq(device, freq_mhz * 1e6);\n    //HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n}\n\nstatic void set_frequency() {\n    freq_mhz = round(freq_mhz * 10.0) / 10.0;\n    printf(\"Seting freq to %f MHz.\\n\", freq_mhz);\n    int status = hackrf_set_freq(device, freq_mhz * 1e6);\n    HACKRF_CHECK_STATUS(status, \"hackrf_set_freq\");\n}\n\nstatic void teardown_hackrf() {\n    hackrf_stop_rx(device);\n    hackrf_close(device);\n    hackrf_exit();\n}\n\nstatic void check_shader_error(GLuint shader) {\n    int length = 0;\n    int charsWritten  = 0;\n    char *infoLog;\n\n    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);\n\n    if (length > 0) {\n        char message[length];\n        glGetShaderInfoLog(shader, length, NULL, message);\n        printf(\"%s\\n\", message);\n    }\n}\n\nstatic void setup() {\n    glGenTextures(1, &texture_id);\n    glBindTexture(GL_TEXTURE_2D, texture_id);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n\n    const char *vertex_shader_source =\n        \"void main(void) {\"\n        \"  gl_TexCoord[0] = gl_MultiTexCoord0;\"\n        \"  gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\"\n        \"}\";\n\n    const char *fragment_shader_source =\n        \"uniform sampler2D texture;\"\n        \"void main(void) {\"\n        \"  vec4 c = texture2D(texture, gl_TexCoord[0].st);\"\n        \"  float v = c.r;\"\n        \"  if (v <= 0.05) {\"\n        \"    v *= 10.0; \"\n        \"  } else if (v >= 0.95) {\"\n        \"    v = 0.5 + (v - 0.95) * 10.0;\"\n        \"  }\"\n        \"  gl_FragColor = vec4(v, v, v, 1);\"\n        \"}\";\n\n    GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);\n    glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);\n    glCompileShader(vertex_shader);\n    check_shader_error(vertex_shader);\n\n    GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);\n    glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);\n    glCompileShader(fragment_shader);\n    check_shader_error(fragment_shader);\n\n    program = glCreateProgram();\n    glAttachShader(program, vertex_shader);\n    glAttachShader(program, fragment_shader);\n    glLinkProgram(program);\n\n    glActiveTexture(0);\n    GLuint u_texture = glGetUniformLocation(program, \"texture\");\n    glUniform1i(u_texture, texture_id);\n}\n\nstatic void prepare() {\n    int width, height;\n    glfwGetFramebufferSize(window, &width, &height);\n    glViewport(0, 0, width, height);\n    glClear(GL_COLOR_BUFFER_BIT);\n    glMatrixMode(GL_PROJECTION);\n    glLoadIdentity();\n    glOrtho(0, WIDTH, 0, HEIGHT, -1, 1);\n    glMatrixMode(GL_MODELVIEW);\n    glLoadIdentity();\n}\n\nstatic void update() {\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, 512, 512, 0, GL_RED, GL_UNSIGNED_BYTE, buffer);\n}\n\nstatic void export() {\n    png_structp png_ptr = NULL;\n    png_infop info_ptr = NULL;\n    png_bytepp row_pointers;\n\n    // We set paused so we don't write to the buffer while saving the file.\n    paused = 1;\n\n    // Filename contains the frequency.\n    char fname[100];\n    snprintf(fname, 100, \"vis-%.3f.png\", freq_mhz);\n\n    FILE *fp = fopen(fname, \"wb\");\n    if (!fp) {\n        printf(\"ERROR: Could not write open file %s for writing.\\n\", fname);\n        paused = 0;\n        return;\n    }\n\n    // Init PNG writer.\n    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);\n    if (png_ptr == NULL) {\n        printf(\"ERROR: png_create_write_struct.\\n\");\n        paused = 0;\n        return;\n    }\n\n    info_ptr = png_create_info_struct(png_ptr);\n    if (info_ptr == NULL) {\n        printf(\"ERROR: png_create_info_struct.\\n\");\n        png_destroy_write_struct(&png_ptr, NULL);\n        paused = 0;\n        return;\n    }\n\n    png_set_IHDR(png_ptr, info_ptr,\n                 WIDTH, HEIGHT,\n                 8,\n                 PNG_COLOR_TYPE_GRAY,\n                 PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);\n\n    // PNG expects a list of pointers. We just calculate offsets into our buffer.\n    row_pointers = (png_bytepp) png_malloc(png_ptr, HEIGHT * sizeof(png_bytep));\n    for (int y = 0; y < HEIGHT; y++) {\n       row_pointers[y] = buffer + y * WIDTH;\n   }\n\n    // Write out the image data.\n    png_init_io(png_ptr, fp);\n    png_set_rows(png_ptr, info_ptr, row_pointers);\n    png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);\n\n    // Cleanup.\n    png_free(png_ptr, row_pointers);\n    png_destroy_write_struct(&png_ptr, &info_ptr);\n    fclose(fp);\n    printf(\"Written %s.\\n\", fname);\n    paused = 0;\n}\n\nstatic void draw() {\n    glEnable(GL_TEXTURE_2D);\n    glEnable(GL_BLEND);\n    glBlendFunc(GL_ONE, GL_SRC_COLOR);\n\n    glUseProgram(program);\n    glBindTexture(GL_TEXTURE_2D, texture_id);\n    glBegin(GL_QUADS);\n    glTexCoord2f(0.0, 0.0);\n    glVertex2f(0.0, 0);\n    glTexCoord2f(1.0, 0.0);\n    glVertex2f(WIDTH, 0);\n    glTexCoord2f(1.0, 1.0);\n    glVertex2f(WIDTH, HEIGHT);\n    glTexCoord2f(0.0, 1.0);\n    glVertex2f(0, HEIGHT);\n    glEnd();\n    glUseProgram(0);\n}\n\nstatic void error_callback(int error, const char* description) {\n    fputs(description, stderr);\n}\n\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {\n    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) {\n        glfwSetWindowShouldClose(window, GL_TRUE);\n    } else if (key == GLFW_KEY_RIGHT && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        freq_mhz += 0.1;\n        set_frequency();\n    } else if (key == GLFW_KEY_LEFT && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        freq_mhz -= 0.1;\n        set_frequency();\n    } else if (key == GLFW_KEY_SPACE && action == GLFW_PRESS) {\n        paused = !paused;\n    } else if (key == GLFW_KEY_E && action == GLFW_PRESS) {\n        export();\n    }\n}\n\nint main(void) {\n    glfwSetErrorCallback(error_callback);\n    if (!glfwInit()) {\n        exit(EXIT_FAILURE);\n    }\n    window = glfwCreateWindow(WIDTH, HEIGHT, \"HackRF\", NULL, NULL);\n    if (!window) {\n        glfwTerminate();\n        exit(EXIT_FAILURE);\n    }\n    glfwMakeContextCurrent(window);\n    glfwSetKeyCallback(window, key_callback);\n    setup_hackrf();\n    setup();\n    while (!glfwWindowShouldClose(window)) {\n        prepare();\n        update();\n        draw();\n        glfwSwapBuffers(window);\n        glfwPollEvents();\n    }\n    teardown_hackrf();\n    glfwDestroyWindow(window);\n    glfwTerminate();\n    exit(EXIT_SUCCESS);\n}\n"
  },
  {
    "path": "data-wrangling/bipt_freqs.csv",
    "content": "start_freq,end_freq,allocation,applications\n9000,14000,not allocated,\"Inductive applications, Ultra Low Power Active Medical Implants, On-site paging\"\n14000,19950,MARITIME MOBILE,\"Inductive applications, Ultra Low Power Active Medical Implants, Maritime military systems, On-site paging\"\n19950,20050,not allocated,\"Inductive applications, Ultra Low Power Active Medical Implants, On-site paging\"\n20050,70000,\"FIXED, MARITIME MOBILE\",\"Inductive applications, Ultra Low Power Active Medical Implants, Maritime military systems, On-site paging, Point-to-Point\"\n70000,72000,not allocated,\"Inductive applications, Ultra Low Power Active Medical Implants\"\n72000,84000,FIXED,\"Inductive applications, Ultra Low Power Active Medical Implants, Point-to-Point\"\n84000,130000,not allocated,\"Inductive applications, Ultra Low Power Active Medical Implants\"\n130000,135700,FIXED,\"Inductive applications, Ultra Low Power Active Medical Implants, Point-to-Point, Tracking systems\"\n135700,137800,\"FIXED, Amateur\",\"Inductive applications, Ultra Low Power Active Medical Implants, Point-to-Point, Tracking systems, Amateur\"\n137800,148500,FIXED,\"Inductive applications, Ultra Low Power Active Medical Implants, Point-to-Point, Tracking systems\"\n148500,255000,not allocated,\"Inductive applications, Ultra Low Power Active Medical Implants\"\n255000,283500,AERONAUTICAL RADIONAVIGATION,\"Inductive applications, Ultra Low Power Active Medical Implants, Beacons (aeronautical)\"\n283500,315000,\"AERONAUTICAL RADIONAVIGATION, MARITIME RADIONAVIGATION\",\"Inductive applications, Ultra Low Power Active Medical Implants, Beacons (aeronautical), Beacons (maritime), Defence systems\"\n315000,405000,AERONAUTICAL RADIONAVIGATION,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Beacons (aeronautical), Defence systems\"\n405000,415000,RADIONAVIGATION,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Defence systems\"\n415000,435000,\"AERONAUTICAL RADIONAVIGATION, MARITIME MOBILE\",\"Inductive applications, Ultra Low Power Animal Implantable Devices, Maritime communications, Defence systems\"\n435000,495000,MARITIME MOBILE,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Maritime communications, Defence systems, Detection of avalanche victims (457 kHz), Amateur (472-479 kHz)\"\n495000,505000,MOBILE (distress and calling),\"Inductive applications, Ultra Low Power Animal Implantable Devices, GMDSS, Amateur (501-504 kHz)\"\n505000,526500,MARITIME MOBILE,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Defence systems, Maritime communications\"\n526500,1606500,BROADCASTING,\"Inductive applications, Ultra Low Power Animal Implantable Devices (315-600 kHz), AM sound analogue\"\n1606500,1625000,MARITIME MOBILE,\"Inductive applications, Defence systems, Maritime communications\"\n1625000,1635000,RADIOLOCATION,\"Inductive applications, Defence systems\"\n1635000,1800000,\"FIXED, MARITIME MOBILE\",\"Inductive applications, Defence systems, Maritime communications, Point-to-Point\"\n1800000,1810000,RADIOLOCATION,\"Inductive applications, Defence systems\"\n1810000,1830000,MOBILE except aeronautical mobile,\"Inductive applications, Amateur, Defence systems, Maritime communications\"\n1830000,1850000,AMATEUR,\"Inductive applications, Amateur\"\n1850000,2000000,MOBILE except aeronautical mobile,\"Inductive applications, Amateur, Defence systems, Maritime communications\"\n2000000,2025000,\"FIXED, MOBILE except aeronautical mobile (R)\",\"Inductive applications, Defence systems\"\n2025000,2045000,MOBILE except aeronautical mobile (R),\"Inductive applications, Defence systems\"\n2045000,2160000,\"LAND MOBILE, MARITIME MOBILE\",\"Inductive applications, Defence systems, Maritime communications\"\n2160000,2170000,RADIOLOCATION,\"Inductive applications, Defence systems\"\n2170000,2173500,MARITIME MOBILE,\"Inductive applications, Defence systems\"\n2173500,2190500,MOBILE (distress and calling),\"Inductive applications, GMDSS\"\n2190500,2300000,MARITIME MOBILE,\"Inductive applications, Defence systems\"\n2300000,2498000,MOBILE except aeronautical mobile (R),\"Inductive applications, Defence systems\"\n2498000,2502000,not allocated,Inductive applications\n2502000,2625000,\"FIXED, MOBILE except aeronautical mobile (R)\",\"Inductive applications, Defence systems, Point-to-Point\"\n2625000,2650000,\"MARITIME MOBILE, MARITIME RADIONAVIGATION\",\"Inductive applications, Defence systems\"\n2650000,2850000,\"FIXED, MOBILE except aeronautical mobile (R)\",\"Inductive applications, Defence systems, Point-to-Point\"\n2850000,3025000,AERONAUTICAL MOBILE (R),\"Inductive applications, Aeronautical communications\"\n3025000,3155000,AERONAUTICAL MOBILE (OR),\"Inductive applications, Aeronautical military systems\"\n3155000,3230000,\"FIXED, MOBILE except aeronautical mobile (R)\",\"Inductive applications, Defence systems, Point-to-Point\"\n3230000,3400000,\"FIXED, MOBILE except aeronautical mobile\",\"Inductive applications, Defence systems, Point-to-Point\"\n3400000,3500000,AERONAUTICAL MOBILE (R),\"Inductive applications, Aeronautical communications\"\n3500000,3800000,\"AMATEUR, FIXED, MOBILE except aeronautical mobile\",\"Inductive applications, Amateur, Defence systems, Point-to-Point\"\n3800000,3900000,\"AERONAUTICAL MOBILE (OR), FIXED, LAND MOBILE\",\"Inductive applications, Defence systems, Point-to-Point\"\n3900000,3950000,AERONAUTICAL MOBILE (OR),\"Inductive applications, Aeronautical military systems\"\n3950000,4000000,FIXED,\"Inductive applications, Point-to-Point\"\n4000000,4063000,FIXED,\"Inductive applications, Point-to-Point, Defence systems\"\n4063000,4152000,MARITIME MOBILE,\"Inductive applications, Maritime communications\"\n4152000,4172000,MARITIME MOBILE,\"Inductive applications, Maritime military systems\"\n4172000,4438000,MARITIME MOBILE,\"Inductive applications, Maritime communications\"\n4438000,4650000,\"FIXED, MOBILE except aeronautical mobile (R)\",\"Inductive applications, Defence systems, Euroloop, Point-to-Point\"\n4650000,4700000,AERONAUTICAL MOBILE (R),\"Inductive applications, Aeronautical communications\"\n4700000,4750000,AERONAUTICAL MOBILE (OR),\"Inductive applications, Aeronautical military systems\"\n4750000,4850000,FIXED,\"Inductive applications, Point-to-Point\"\n4850000,4995000,\"FIXED, LAND MOBILE\",\"Inductive applications, Point-to-Point\"\n4995000,5060000,not allocated,Inductive applications\n5060000,5450000,FIXED,\"Inductive applications, Defence systems, Point-to-Point\"\n5450000,5480000,\"FIXED, LAND MOBILE, AERONAUTICAL MOBILE (OR)\",\"Inductive applications, Defence systems\"\n5480000,5680000,AERONAUTICAL MOBILE (R),\"Inductive applications, Aeronautical communications\"\n5680000,5730000,AERONAUTICAL MOBILE (OR),\"Inductive applications, Aeronautical military systems\"\n5730000,5900000,FIXED,\"Inductive applications, Point-to-Point\"\n5900000,5950000,not allocated,Inductive applications\n5950000,6200000,BROADCASTING,\"Inductive applications, AM sound analogue\"\n6200000,6233000,MARITIME MOBILE,\"Inductive applications, Maritime communications\"\n6233000,6261000,MARITIME MOBILE,\"Inductive applications, Maritime military systems\"\n6261000,6525000,MARITIME MOBILE,\"Inductive applications, Maritime communications\"\n6525000,6685000,AERONAUTICAL MOBILE (R),\"Inductive applications, Aeronautical communications\"\n6685000,6765000,AERONAUTICAL MOBILE (OR),\"Inductive applications, Aeronautical military systems\"\n6765000,7000000,FIXED,\"Inductive applications, Point-to-Point, ISM (6765-6795 kHz), Non-specific Short Range Devices (6765-6795 kHz)\"\n7000000,7100000,\"AMATEUR, AMATEUR-SATELLITE\",\"Inductive applications, Amateur, Amateur-satellite\"\n7100000,7200000,Amateur,\"Inductive applications, Amateur\"\n7200000,7300000,BROADCASTING,\"Inductive applications, AM sound analogue\"\n7300000,7350000,not allocated,Inductive applications\n7350000,8195000,FIXED,\"Inductive applications, Point-to-Point\"\n8195000,8300000,MARITIME MOBILE,\"Inductive applications, Maritime communications\"\n8300000,8340000,MARITIME MOBILE,\"Inductive applications, Maritime military systems\"\n8340000,8815000,MARITIME MOBILE,\"Inductive applications, Maritime communications\"\n8815000,8965000,AERONAUTICAL MOBILE (R),\"Inductive applications, Aeronautical communications\"\n8965000,9040000,AERONAUTICAL MOBILE (OR),\"Inductive applications, Aeronautical military systems\"\n9040000,9400000,FIXED,\"Inductive applications, Point-to-Point\"\n9400000,9500000,not allocated,Inductive applications\n9500000,9900000,BROADCASTING,\"Inductive applications, AM sound analogue\"\n9900000,9995000,FIXED,\"Inductive applications, Point-to-Point\"\n9995000,10005000,not allocated,Inductive applications\n10005000,10100000,not allocated,Inductive applications\n10100000,10150000,Amateur,\"Inductive applications, Amateur\"\n10150000,11175000,FIXED,\"Inductive applications, Defence systems, Point-to-Point\"\n11175000,11275000,AERONAUTICAL MOBILE (OR),\"Inductive applications, Aeronautical military systems\"\n11275000,11400000,AERONAUTICAL MOBILE (R),\"Inductive applications, Aeronautical communications\"\n11400000,11600000,FIXED,\"Inductive applications, Point-to-Point\"\n11600000,11650000,not allocated,Inductive applications\n11650000,12050000,BROADCASTING,\"Inductive applications, AM sound analogue\"\n12050000,12100000,not allocated,Inductive applications\n12100000,12230000,FIXED,\"Inductive applications, Point-to-Point\"\n12230000,12368000,MARITIME MOBILE,\"Inductive applications, Maritime communications\"\n12368000,12420000,MARITIME MOBILE,\"Inductive applications, Maritime military systems\"\n12420000,13200000,MARITIME MOBILE,\"Inductive applications, Maritime communications, Ultra Low Power Animal Implantable Devices (12500-20000 kHz)\"\n13200000,13260000,AERONAUTICAL MOBILE (OR),\"Inductive applications, Ultra Low Power Animal Implantable Devices, Aeronautical military systems\"\n13260000,13360000,AERONAUTICAL MOBILE (R),\"Inductive applications, Ultra Low Power Animal Implantable Devices, Aeronautical communications\"\n13360000,13570000,FIXED,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Defence systems, Point-to-Point, ISM (13553-13567 kHz), Non-specific Short Range Devices (13553-13567 kHz)\"\n13570000,13600000,not allocated,\"Inductive applications, Ultra Low Power Animal Implantable Devices\"\n13600000,13800000,BROADCASTING,\"Inductive applications, Ultra Low Power Animal Implantable Devices, AM sound analogue\"\n13800000,13870000,not allocated,\"Inductive applications, Ultra Low Power Animal Implantable Devices\"\n13870000,14000000,FIXED,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Defence systems, Point-to-Point\"\n14000000,14250000,\"AMATEUR, AMATEUR-SATELLITE\",\"Inductive applications, Ultra Low Power Animal Implantable Devices, Amateur, Amateur-satellite\"\n14250000,14350000,AMATEUR,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Amateur\"\n14350000,14990000,FIXED,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Defence systems, Point-to-Point\"\n14990000,15010000,not allocated,\"Inductive applications, Ultra Low Power Animal Implantable Devices\"\n15010000,15100000,AERONAUTICAL MOBILE (OR),\"Inductive applications, Ultra Low Power Animal Implantable Devices, Aeronautical military systems\"\n15100000,15600000,BROADCASTING,\"Inductive applications, Ultra Low Power Animal Implantable Devices, AM sound analogue\"\n15600000,15800000,not allocated,\"Inductive applications, Ultra Low Power Animal Implantable Devices\"\n15800000,16360000,FIXED,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Point-to-Point\"\n16360000,16549000,MARITIME MOBILE,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Maritime communications\"\n16549000,16617000,MARITIME MOBILE,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Maritime military systems\"\n16617000,17410000,MARITIME MOBILE,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Maritime communications\"\n17410000,17480000,FIXED,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Point-to-Point\"\n17480000,17550000,not allocated,\"Inductive applications, Ultra Low Power Animal Implantable Devices\"\n17550000,17900000,BROADCASTING,\"Inductive applications, Ultra Low Power Animal Implantable Devices, AM sound analogue\"\n17900000,17970000,AERONAUTICAL MOBILE (R),\"Inductive applications, Ultra Low Power Animal Implantable Devices, Aeronautical communications\"\n17970000,18030000,AERONAUTICAL MOBILE (OR),\"Inductive applications, Ultra Low Power Animal Implantable Devices, Aeronautical military systems\"\n18030000,18052000,FIXED,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Point-to-Point\"\n18052000,18068000,not allocated,\"Inductive applications, Ultra Low Power Animal Implantable Devices\"\n18068000,18168000,\"AMATEUR, AMATEUR-SATELLITE\",\"Inductive applications, Ultra Low Power Animal Implantable Devices, Amateur, Amateur-satellite\"\n18168000,18780000,FIXED,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Defence systems, Point-to-Point\"\n18780000,18846000,MARITIME MOBILE,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Maritime communications\"\n18846000,18870000,MARITIME MOBILE,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Maritime military systems\"\n18870000,18900000,MARITIME MOBILE,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Maritime communications\"\n18900000,19020000,not allocated,\"Inductive applications, Ultra Low Power Animal Implantable Devices\"\n19020000,19680000,FIXED,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Point-to-Point\"\n19680000,19800000,MARITIME MOBILE,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Defence systems\"\n19800000,19990000,FIXED,\"Inductive applications, Ultra Low Power Animal Implantable Devices, Point-to-Point\"\n19990000,20010000,not allocated,\"Inductive applications, Ultra Low Power Animal Implantable Devices (12500-20000 kHz)\"\n20010000,21000000,FIXED,\"Inductive applications, Point-to-Point\"\n21000000,21450000,\"AMATEUR, AMATEUR-SATELLITE\",\"Inductive applications, Amateur, Amateur-satellite\"\n21450000,21850000,BROADCASTING,\"Inductive applications, AM sound analogue\"\n21850000,21870000,FIXED,\"Inductive applications, Point-to-Point\"\n21870000,21924000,not allocated,Inductive applications\n21924000,22000000,AERONAUTICAL MOBILE (R),\"Inductive applications, Aeronautical communications\"\n22000000,22180000,MARITIME MOBILE,\"Inductive applications, Maritime communications\"\n22180000,22240000,MARITIME MOBILE,\"Inductive applications, Maritime military systems\"\n22240000,22855000,MARITIME MOBILE,\"Inductive applications, Maritime communications\"\n22855000,23200000,FIXED,\"Inductive applications, Defence systems, Point-to-Point\"\n23200000,23350000,\"AERONAUTICAL MOBILE (OR), FIXED\",\"Inductive applications, Defence systems\"\n23350000,24890000,FIXED,\"Inductive applications, Defence systems, Point-to-Point\"\n24890000,24990000,\"AMATEUR, AMATEUR-SATELLITE\",\"Inductive applications, Amateur, Amateur-satellite\"\n24990000,25070000,not allocated,\"Inductive applications, Defence systems\"\n25070000,25121000,MARITIME MOBILE,\"Inductive applications, Maritime communications\"\n25121000,25161250,MARITIME MOBILE,\"Inductive applications, Maritime military systems\"\n25161250,25210000,MARITIME MOBILE,\"Inductive applications, Maritime communications\"\n25210000,25550000,FIXED,\"Inductive applications, Defence systems, Point-to-Point\"\n25550000,25670000,not allocated,Inductive applications\n25670000,26100000,BROADCASTING,\"Inductive applications, AM sound analogue\"\n26100000,26175000,MARITIME MOBILE,Inductive applications\n26175000,27500000,\"FIXED, MOBILE except aeronautical mobile\",\"Inductive applications, Defence systems, Point-to-Point, Eurobalise (26345-27845 kHz) (27.095 MHz), On-site paging (26500-26960 kHz), ISM (26957-27283 kHz), Non-specific Short Range Devices (26957-27283 kHz), AM CB (26960-26990 kHz), PR 27 (26960-26990 kHz), Model control (26990-27000 kHz), AM CB (27000-27040 kHz), PR 27 (27000-27040 kHz), Model control (27040-27050 kHz), AM CB (27050-27090 kHz), PR 27 (27050-27090 kHz), Model control (27090-27100 kHz), AM CB (27100-27140 kHz), PR 27 (27100-27140 kHz), Model control (27140-27150 kHz), AM CB (27150-27190 kHz), PR 27 (27150-27190 kHz), Model control (27190-27200 kHz), AM CB (27200-27410 kHz), PR 27 (27200-27410 kHz)\"\n27500000,28000000,not allocated,\"Inductive applications, Eurobalise (26345-27845 kHz) (27.095 MHz)\"\n28000000,29700000,\"AMATEUR, AMATEUR-SATELLITE\",\"Inductive applications, Amateur, Amateur-satellite\"\n29700000,30025000,MOBILE,\"Inductive applications (9-30000 kHz), Defence systems, Ultra Low Power Medical Membrane Implants (30-37.5 MHz)\"\n30025000,30287500,MOBILE,\"Ultra Low Power Medical Membrane Implants, PMR, Radio microphone\"\n30287500,32462500,MOBILE,\"Ultra Low Power Medical Membrane Implants, Defence systems\"\n32462500,33287500,MOBILE,\"Ultra Low Power Medical Membrane Implants, PMR, Radio microphone\"\n33287500,34062500,MOBILE,\"Ultra Low Power Medical Membrane Implants, Defence systems\"\n34062500,36987500,MOBILE,\"Ultra Low Power Medical Membrane Implants, Radio microphone, PMR, Flying model control (34.995-35.335 MHz), Wireless audio applications (36.6-36.8 MHz)\"\n36987500,37262500,MOBILE,\"Ultra Low Power Medical Membrane Implants, Radio microphone, Defence systems, Wireless audio applications (37-37.2 MHz)\"\n37262500,37712500,MOBILE,\"Ultra Low Power Medical Membrane Implants (30-37.5 MHz), Defence systems\"\n37712500,39925000,MOBILE,\"Radio microphone, Wireless audio applications (37.8-38 MHz)\"\n39925000,40562500,MOBILE,Defence systems\n40562500,40700000,MOBILE,\"Radio microphone, Model control (40.57-40.7 MHz), ISM (40.66-40.7 MHz), Non-specific Short Range Devices (40.66-40.7 MHz)\"\n40700000,40787500,MOBILE,On-site paging\n40787500,40975000,MOBILE,Defence systems\n40975000,41212500,MOBILE,\"On-site paging, Radio microphone\"\n41212500,41725000,MOBILE,Defence systems\n41725000,41987500,MOBILE,\"On-site paging, Radio microphone\"\n41987500,47000000,MOBILE,Defence systems\n47000000,68000000,LAND MOBILE,\"Land military systems, Amateur (50-52 MHz)\"\n68000000,69945000,MOBILE except aeronautical mobile,Defence systems\n69945000,69955000,\"MOBILE except aeronautical mobile, Amateur\",\"Defence systems, Amateur (69.950 MHz)\"\n69955000,70112500,MOBILE except aeronautical mobile,Defence systems\n70112500,70412500,MOBILE except aeronautical mobile,\"PMR, Amateur (70.19-70.4125 MHz)\"\n70412500,71987500,MOBILE except aeronautical mobile,Defence systems\n71987500,72512500,MOBILE except aeronautical mobile,\"PMR, Model control (72.0125-72.2625 MHz)\"\n72512500,74787500,MOBILE except aeronautical mobile,Defence systems\n74787500,74800000,MOBILE except aeronautical mobile,\n74800000,75200000,AERONAUTICAL RADIONAVIGATION,ILS\n75200000,78687500,MOBILE except aeronautical mobile,PMR\n78687500,81525000,MOBILE except aeronautical mobile,Defence systems\n81525000,82500000,MOBILE except aeronautical mobile,PMR\n82500000,84987500,MOBILE except aeronautical mobile,Defence systems\n84987500,87500000,MOBILE except aeronautical mobile,PMR\n87500000,108000000,BROADCASTING,\"FM sound analogue, Wireless audio applications\"\n108000000,117975000,AERONAUTICAL RADIONAVIGATION,\"ILS, VOR\"\n117975000,121450000,AERONAUTICAL MOBILE (R),Aeronautical communications\n121450000,121550000,AERONAUTICAL MOBILE (R),EPIRBs\n121550000,137000000,AERONAUTICAL MOBILE (R),Aeronautical communications\n137000000,137025000,\"METEOROLOGICAL-SATELLITE (space-to-Earth), MOBILE-SATELLITE (space-to-Earth), SPACE OPERATION (space-to-Earth), SPACE RESEARCH (space-to-Earth)\",\"Space Operations, S-PCS, Weather satellites\"\n137025000,137175000,\"METEOROLOGICAL-SATELLITE (space-to-Earth), Mobile-Satellite (space-to-Earth), SPACE OPERATION (space-to-Earth), SPACE RESEARCH (space-to-Earth)\",\"Space Operations, S-PCS, Weather satellites\"\n137175000,137875000,\"METEOROLOGICAL-SATELLITE (space-to-Earth), MOBILE-SATELLITE (space-to-Earth), SPACE OPERATION (space-to-Earth), SPACE RESEARCH (space-to-Earth)\",\"Space Operations, S-PCS, Weather satellites\"\n137875000,138000000,\"METEOROLOGICAL-SATELLITE (space-to-Earth), Mobile-Satellite (space-to-Earth), SPACE OPERATION (space-to-Earth), SPACE RESEARCH (space-to-Earth)\",\"Space Operations, S-PCS, Weather satellites\"\n138000000,144000000,\"AERONAUTICAL MOBILE (OR), LAND MOBILE\",Defence systems\n144000000,146000000,\"AMATEUR, AMATEUR-SATELLITE\",\"Amateur, Amateur-satellite\"\n146000000,148000000,MOBILE except aeronautical mobile (R),PMR\n148000000,149900000,\"MOBILE except aeronautical mobile (R), MOBILE-SATELLITE (Earth-to-space)\",\"On-site paging, PMR, S-PCS\"\n149900000,150050000,\"MOBILE-SATELLITE (Earth-to-space), RADIONAVIGATION-SATELLITE\",\"PMR (No new assignments), S-PCS\"\n150050000,153000000,\"MOBILE except aeronautical mobile, RADIO ASTRONOMY\",PMR\n153000000,154000000,\"Meteorological Aids, MOBILE except aeronautical mobile (R)\",PMR\n154000000,156000000,MOBILE except aeronautical mobile (R),PMR\n156000000,156512500,MOBILE except aeronautical mobile (R),Maritime communications\n156512500,156537500,MOBILE except aeronautical mobile (R),SAR (communications)\n156537500,156762500,MOBILE except aeronautical mobile (R),Maritime communications\n156762500,156837500,MARITIME MOBILE (distress and calling),SAR (communications)\n156837500,174000000,MOBILE except aeronautical mobile,\"On-site paging, Maritime communications (156.8375-157.45 MHz), PMR (157.45-160.6 MHz), Maritime communications (160.6-160.975 MHz), PMR (160.975-161.475 MHz), Maritime communications (161.475-162.05 MHz), PMR (162.05-169.4 MHz), Aids for hearing impaired (169.4-169.475 MHz) (License exempt), Aids for hearing impaired (169.4-169.475 MHz) (Individual license required), Aids for hearing impaired (169.4-169.475 MHz) (Individual license required), Aids for hearing impaired (169.4-169.475 MHz) (License exempt), Asset tracking and tracing (169.4-169.475 MHz), Meter reading (169.4-169.475 MHz), Alarms (169.475-169.4875 MHz), Aids for hearing impaired (169.4875-169.5875 MHz) (Individual license , required), Aids for hearing impaired (169.4875-169.5875 MHz) (License exempt), Aids for hearing impaired (169.4875-169.5875 MHz) (License exempt), Aids for hearing impaired (169.4875-169.5875 MHz) (Individual license , required), Alarms (169.5875-169.6 MHz), PMR (169.825-174 MHz)\"\n174000000,223000000,\"BROADCASTING, LAND MOBILE\",\"T-DAB (Foreseen), SAP/SAB portable audio link (174-216 MHz), SAP/SAB vehicular audio links (174-216 MHz), Radio microphone (174-202 MHz), On-site paging (174-174.06 MHz), Radio microphone (202-209 MHz), Radio microphone (209-216 MHz)\"\n223000000,226500000,BROADCASTING,T-DAB\n226500000,230000000,\"BROADCASTING, Fixed, Mobile\",\"Defence systems, T-DAB (Foreseen)\"\n230000000,235000000,\"FIXED, MOBILE\",Defence systems\n235000000,242950000,\"FIXED, MOBILE, Mobile-Satellite\",Defence systems\n242950000,243050000,\"FIXED, MOBILE, Mobile-Satellite\",EPIRBs\n243050000,322000000,\"FIXED, MOBILE, Mobile-Satellite\",Defence systems\n322000000,328600000,\"FIXED, MOBILE, RADIO ASTRONOMY\",\"Defence systems, Radio astronomy\"\n328600000,335400000,AERONAUTICAL RADIONAVIGATION,ILS\n335400000,380000000,\"FIXED, MOBILE, Mobile-Satellite\",Defence systems\n380000000,385000000,\"FIXED, MOBILE, Mobile-Satellite\",Emergency services\n385000000,390000000,\"FIXED, MOBILE, Mobile-Satellite\",Defence systems\n390000000,395000000,\"FIXED, MOBILE, Mobile-Satellite\",Emergency services\n395000000,399900000,\"FIXED, MOBILE, Mobile-Satellite\",Defence systems\n399900000,400050000,\"MOBILE-SATELLITE (Earth-to-space), RADIONAVIGATION-SATELLITE\",\n400050000,400150000,STANDARD FREQUENCY AND TIME SIGNAL-SATELLITE,\n400150000,401000000,\"METEOROLOGICAL AIDS, MOBILE-SATELLITE (space-to-Earth)\",\"Defence systems, Sondes\"\n401000000,403000000,\"METEOROLOGICAL AIDS, Meteorological-Satellite (Earth-to-space)\",\"Defence systems, Sondes, Weather satellites, Active medical implants (401-402 MHz), Ultra Low Power Active Medical Implants (402-405 MHz)\"\n403000000,406000000,METEOROLOGICAL AIDS,\"Defence systems, Sondes, Ultra Low Power Active Medical Implants (402-405 MHz), Active medical implants (405-406 MHz)\"\n406000000,406100000,MOBILE-SATELLITE (Earth-to-space),EPIRBs\n406100000,410000000,\"MOBILE except aeronautical mobile, RADIO ASTRONOMY\",\"PMR, Radio astronomy\"\n410000000,430000000,MOBILE except aeronautical mobile,\"PAMR, PMR, TETRA (415-419 MHz), TETRA (425-429 MHz)\"\n430000000,440000000,\"AMATEUR, RADIOLOCATION\",\"Amateur, Defence systems, ISM (433.05-434.79 MHz), Non-specific Short Range Devices (433.05-434.79 MHz), Amateur-satellite (435-438 MHz)\"\n440000000,450000000,MOBILE except aeronautical mobile,\"Medical Telemetry, PMR, Analogue PMR446 (446-446.1 MHz), Digital PMR446 (446.1-446.2 MHz)\"\n450000000,470000000,\"FIXED, MOBILE\",\"Medical Telemetry, On-site paging, PMR, On-board communications (457.525-457.575 MHz), On-board communications (467.525-467.575 MHz)\"\n470000000,608000000,\"BROADCASTING, Land Mobile\",\"DVB-T, SAP/SAB portable audio link, SAP/SAB vehicular audio links, Radio microphone (470-518 MHz), Medical Telemetry (470-470.225 MHz), Radio microphone (518-526 MHz), Radio microphone (526-534 MHz), Radio microphone (534-542 MHz), Radio microphone (542-786 MHz), Intercom (550-574 MHz)\"\n608000000,614000000,\"BROADCASTING, Land Mobile, Radio Astronomy\",\"Radio microphone, Radio astronomy\"\n614000000,790000000,\"BROADCASTING, Land Mobile\",\"Radio microphone (542-786 MHz), DVB-T, SAP/SAB portable audio link (614-780 MHz), SAP/SAB vehicular audio links (614-780 MHz), Intercom (614-646 MHz), Intercom (774-784 MHz), Radio microphone (786-789 MHz)\"\n790000000,826000000,MOBILE except aeronautical mobile,\"Broadband Wireless Access (791-821 MHz), Radio microphone (823-826 MHz)\"\n826000000,832000000,MOBILE except aeronautical mobile,Radio microphone\n832000000,862000000,MOBILE except aeronautical mobile,Broadband Wireless Access\n862000000,863000000,MOBILE except aeronautical mobile,Defence systems\n863000000,868600000,MOBILE except aeronautical mobile,\"Radio microphone (863-865 MHz), Wireless audio applications (863-865 MHz), CT2 (864.1-868.1 MHz), RFID (865-868 MHz), Non-specific Short Range Devices (868-868.6 MHz)\"\n868600000,868700000,MOBILE except aeronautical mobile,Alarms\n868700000,869200000,MOBILE except aeronautical mobile,Non-specific Short Range Devices\n869200000,869400000,MOBILE except aeronautical mobile,Alarms\n869400000,869650000,MOBILE except aeronautical mobile,Non-specific Short Range Devices\n869650000,869700000,MOBILE except aeronautical mobile,Alarms\n869700000,870000000,MOBILE except aeronautical mobile,Non-specific Short Range Devices\n870000000,876000000,MOBILE except aeronautical mobile,\n876000000,880000000,MOBILE except aeronautical mobile,GSM-R\n880000000,915000000,MOBILE except aeronautical mobile,\"GSM, IMT-2000\"\n915000000,921000000,MOBILE except aeronautical mobile,\n921000000,925000000,MOBILE except aeronautical mobile,GSM-R\n925000000,960000000,MOBILE except aeronautical mobile,\"GSM, IMT-2000\"\n960000000,1164000000,AERONAUTICAL RADIONAVIGATION,\"Aeronautical surveillance, DME, JTIDS/MIDS, TACAN-DME\"\n1164000000,1215000000,\"AERONAUTICAL RADIONAVIGATION, RADIONAVIGATION-SATELLITE (space-to-Earth)\",\"Aeronautical surveillance, DME, JTIDS/MIDS, TACAN-DME, Satellite navigation systems\"\n1215000000,1240000000,\"RADIOLOCATION, RADIONAVIGATION, RADIONAVIGATION-SATELLITE (space-to-Earth)\",\"Satellite navigation systems, Defence systems\"\n1240000000,1260000000,\"Amateur, RADIOLOCATION, RADIONAVIGATION, RADIONAVIGATION-SATELLITE (space-to-Earth)\",\"Amateur, Defence systems\"\n1260000000,1270000000,\"Amateur, Amateur-Satellite, RADIOLOCATION, RADIONAVIGATION, RADIONAVIGATION-SATELLITE (space-to-Earth)\",\"Satellite navigation systems, Aeronautical surveillance, Amateur, Amateur-satellite, Defence systems\"\n1270000000,1300000000,\"Amateur, RADIOLOCATION, RADIONAVIGATION, RADIONAVIGATION-SATELLITE (space-to-Earth)\",\"Satellite navigation systems, Aeronautical surveillance, Amateur, Defence systems\"\n1300000000,1350000000,\"AERONAUTICAL RADIONAVIGATION, Radiolocation\",\"Aeronautical surveillance, Defence systems\"\n1350000000,1362500000,FIXED,\n1362500000,1375000000,FIXED,Tactical radio relay\n1375000000,1387500000,FIXED,Radio relay\n1387500000,1400000000,FIXED,Tactical radio relay\n1400000000,1427000000,RADIO ASTRONOMY,\n1427000000,1439500000,FIXED,Radio relay\n1439500000,1452000000,FIXED,Tactical radio relay\n1452000000,1467500000,BROADCASTING,T-DAB (Foreseen)\n1467500000,1492000000,\"BROADCASTING, FIXED\",T-DAB (1452-1479.5 MHz) (Foreseen)\n1492000000,1504500000,FIXED,Radio relay (Unidirectional links)\n1504500000,1517000000,FIXED,Tactical radio relay\n1517000000,1525000000,FIXED,Radio relay (Unidirectional links)\n1525000000,1530000000,\"FIXED, MOBILE-SATELLITE (space-to-Earth)\",MSS Earth stations\n1530000000,1535000000,\"Fixed, MOBILE-SATELLITE (space-to-Earth)\",MSS Earth stations\n1535000000,1559000000,MOBILE-SATELLITE (space-to-Earth),\"MSS Earth stations, SAR (communications) (1544-1545 MHz)\"\n1559000000,1610000000,\"AERONAUTICAL RADIONAVIGATION, RADIONAVIGATION-SATELLITE (space-to-Earth)\",Satellite navigation systems\n1610000000,1613800000,\"AERONAUTICAL RADIONAVIGATION, MOBILE-SATELLITE (Earth-to-space)\",S-PCS\n1613800000,1626500000,\"AERONAUTICAL RADIONAVIGATION, METEOROLOGICAL-SATELLITE (Earth-to-space), Meteorological-Satellite (space-to-Earth)\",S-PCS\n1626500000,1660000000,MOBILE-SATELLITE (Earth-to-space),\"MSS Earth stations, SAR (communications) (1645.5-1646.5 MHz)\"\n1660000000,1660500000,\"METEOROLOGICAL-SATELLITE (Earth-to-space), RADIO ASTRONOMY\",MSS Earth stations\n1660500000,1668400000,RADIO ASTRONOMY,\n1668400000,1670000000,METEOROLOGICAL AIDS,Meteorology\n1670000000,1675000000,\"METEOROLOGICAL AIDS, METEOROLOGICAL-SATELLITE (space-to-Earth), MOBILE\",Meteorology\n1675000000,1700000000,\"METEOROLOGICAL AIDS, METEOROLOGICAL-SATELLITE (space-to-Earth)\",Meteorology\n1700000000,1710000000,FIXED,Tactical radio relay\n1710000000,1785000000,MOBILE,\"GSM, IMT-2000, Mobile Communications on Board Aircraft, Mobile Communications on Board Vessel (1731.1-1733.5 MHz)\"\n1785000000,1880000000,MOBILE,\"Radio microphone (1785-1800 MHz), GSM (1805-1880 MHz), IMT-2000 (1805-1880 MHz), Mobile Communications on Board Aircraft (1805-1880 MHz), Mobile Communications on Board Vessel (1826.1-1828.5 MHz)\"\n1880000000,1900000000,MOBILE,DECT\n1900000000,1980000000,MOBILE,IMT-2000\n1980000000,2010000000,\"FIXED, MOBILE-SATELLITE (Earth-to-space)\",\"SAP/SAB and ENG/OB (Temporary links), MSS Earth stations\"\n2010000000,2025000000,\"FIXED, MOBILE\",SAP/SAB and ENG/OB (Temporary links)\n2025000000,2110000000,\"FIXED, SPACE OPERATION (Earth-to-space) (space-to-space)\",\"SAP/SAB airborne video links, SAP/SAB portable video link, SAP/SAB vehicular video links, Space Operations\"\n2110000000,2170000000,MOBILE,IMT-2000\n2170000000,2200000000,\"FIXED, MOBILE-SATELLITE (space-to-Earth)\",\"MSS Earth stations, SAP/SAB and ENG/OB (Temporary links)\"\n2200000000,2290000000,\"FIXED, SPACE OPERATION (space-to-Earth) (space-to-space)\",\"SAP/SAB airborne video links, SAP/SAB portable video link, SAP/SAB vehicular video links, Space Operations\"\n2290000000,2300000000,FIXED,\"SAP/SAB airborne video links, SAP/SAB portable video link, SAP/SAB vehicular video links\"\n2300000000,2450000000,\"Amateur, MOBILE, Radiolocation\",\"SAP/SAB airborne video links (2200-2400 MHz), SAP/SAB portable video link (2200-2400 MHz), SAP/SAB vehicular video links (2200-2400 MHz), Amateur, Defence systems, Detection of movement and alert (2400-2483.5 MHz), ISM (2400-2483.5 MHz), Non-specific Short Range Devices (2400-2483.5 MHz), Wideband Data Transmission Systems (2400-2483.5 MHz), Amateur-satellite (2400-2450 MHz), AVI (2446-2454 MHz), RFID (2446-2454 MHz)\"\n2450000000,2483500000,\"MOBILE, Radiolocation\",\"Detection of movement and alert, ISM, Non-specific Short Range Devices, Wideband Data Transmission Systems, AVI (2446-2454 MHz), RFID (2446-2454 MHz), Defence systems\"\n2483500000,2500000000,\"FIXED, MOBILE, MOBILE-SATELLITE (space-to-Earth), Radiolocation\",\"SAP/SAB and ENG/OB (Temporary links), S-PCS\"\n2500000000,2690000000,\"FIXED, MOBILE except aeronautical mobile\",\"SAP/SAB and ENG/OB (Temporary links), Broadband Wireless Access\"\n2690000000,2700000000,RADIO ASTRONOMY,SAP/SAB and ENG/OB (Temporary links)\n2700000000,2900000000,\"AERONAUTICAL RADIONAVIGATION, Radiolocation\",\"Aeronautical surveillance, Radiolocation (military)\"\n2900000000,3100000000,\"Radiolocation, RADIONAVIGATION\",Radiolocation (military)\n3100000000,3400000000,RADIOLOCATION,Radiolocation (military)\n3400000000,3410000000,Radiolocation,\"SAP/SAB airborne video links (Until 01/10/2010), Radiolocation (military)\"\n3410000000,3500000000,\"FIXED, Mobile\",\"SAP/SAB airborne video links (3400-3450 MHz) (Until 01/10/2010), Broadband Wireless Access\"\n3500000000,3600000000,\"FIXED, Mobile\",\"SAP/SAB airborne video links (3500-3550 MHz) (Until 01/10/2010), Broadband Wireless Access (3510-3600 MHz)\"\n3600000000,3625000000,FIXED,Radio relay (ITU-R F.635)\n3625000000,4200000000,\"FIXED, FIXED-SATELLITE (space-to-Earth)\",\"Radio relay (ITU-R F.635), FSS Earth stations, Radio relay (3800-4200 MHz) (ERC/REC 12-08 Annex B)\"\n4200000000,4400000000,AERONAUTICAL RADIONAVIGATION,Defence systems\n4400000000,4825000000,\"FIXED, MOBILE\",\"Defence systems, Tank Level Probing Radar (4500-7000 MHz)\"\n4825000000,4835000000,\"MOBILE except aeronautical mobile, FIXED\",\"Defence systems, Tank Level Probing Radar\"\n4835000000,4950000000,\"MOBILE, FIXED\",\"Defence systems, Tank Level Probing Radar\"\n4950000000,5000000000,\"MOBILE except aeronautical mobile, FIXED\",\"Defence systems, Tank Level Probing Radar\"\n5000000000,5150000000,AERONAUTICAL RADIONAVIGATION,\"Tank Level Probing Radar, MLS (5031-5091 MHz) (Envisaged)\"\n5150000000,5250000000,\"AERONAUTICAL RADIONAVIGATION, MOBILE\",\"Tank Level Probing Radar, Wideband Data Transmission Systems\"\n5250000000,5350000000,RADIOLOCATION,\"Tank Level Probing Radar, Defence systems, Wideband Data Transmission Systems\"\n5350000000,5470000000,\"AERONAUTICAL RADIONAVIGATION, Radiolocation\",\"Tank Level Probing Radar, Defence systems\"\n5470000000,5650000000,\"MARITIME RADIONAVIGATION, Radiolocation\",\"Tank Level Probing Radar, Wideband Data Transmission Systems, Defence systems, Weather radar\"\n5650000000,5830000000,\"RADIOLOCATION, Amateur\",\"Tank Level Probing Radar, Wideband Data Transmission Systems (5470-5725 MHz), Amateur, Defence systems, Amateur-satellite (5650-5670 MHz), ISM (5725-5875 MHz), Non-specific Short Range Devices (5725-5875 MHz), RTTT (5795-5815 MHz)\"\n5830000000,5850000000,\"RADIOLOCATION, Amateur, Amateur-Satellite\",\"Tank Level Probing Radar, Amateur, Defence systems, ISM, Non-specific Short Range Devices, Amateur-satellite\"\n5850000000,6700000000,\"FIXED, FIXED-SATELLITE (Earth-to-space)\",\"Tank Level Probing Radar, ISM (5725-5875 MHz), Non-specific Short Range Devices (5725-5875 MHz), FSS Earth stations (5850-6425 MHz), Intelligent Transport Systems (5875-5905 MHz), Radio relay (5925-6425 MHz), Radio relay (6425-7125 MHz), SAP/SAB P to P video links (6425-7125 MHz)\"\n6700000000,7075000000,\"FIXED, FIXED-SATELLITE (space-to-Earth) (Earth-to-space)\",\"Tank Level Probing Radar (4500-7000 MHz), Radio relay, SAP/SAB P to P video links\"\n7075000000,7250000000,FIXED,\"Radio relay (6425-7125 MHz), SAP/SAB P to P video links (6425-7125 MHz)\"\n7250000000,7375000000,\"FIXED, FIXED-SATELLITE (space-to-Earth), MOBILE-SATELLITE\",Satellite systems (military)\n7375000000,7450000000,\"FIXED, FIXED-SATELLITE (space-to-Earth), MOBILE-SATELLITE\",\"Satellite systems (military), SAP/SAB P to P video links, Radio relay (7425-7900 MHz)\"\n7450000000,7750000000,\"FIXED, FIXED-SATELLITE (space-to-Earth)\",\"Satellite systems (military), SAP/SAB P to P video links (7375-7484 MHz), Radio relay, SAP/SAB P to P video links (7596-7729 MHz)\"\n7750000000,7900000000,FIXED,\"Radio relay, SAP/SAB P to P video links (7841-7900 MHz)\"\n7900000000,8025000000,\"FIXED, FIXED-SATELLITE (Earth-to-space), MOBILE-SATELLITE\",Satellite systems (military)\n8025000000,8400000000,\"FIXED, FIXED-SATELLITE (Earth-to-space)\",\"Satellite systems (military), Fixed radio relay (military) (8200-8500 MHz), Radio relay (8200-8500 MHz)\"\n8400000000,8500000000,FIXED,\"Fixed radio relay (military), Radio relay\"\n8500000000,8750000000,RADIOLOCATION,\"Tank Level Probing Radar, Radiolocation (military)\"\n8750000000,8850000000,\"AERONAUTICAL RADIONAVIGATION, MARITIME RADIONAVIGATION, RADIOLOCATION\",\"Tank Level Probing Radar, Radiolocation (military)\"\n8850000000,9000000000,\"MARITIME RADIONAVIGATION, RADIOLOCATION\",\"Tank Level Probing Radar, Radiolocation (military)\"\n9000000000,9200000000,\"AERONAUTICAL RADIONAVIGATION, MARITIME RADIONAVIGATION, Radiolocation\",\"Tank Level Probing Radar, Radiolocation (military)\"\n9200000000,9300000000,\"MARITIME RADIONAVIGATION, RADIOLOCATION\",\"Tank Level Probing Radar, Radiolocation (military), Detection of movement and alert\"\n9300000000,9500000000,\"Radiolocation, RADIONAVIGATION\",\"Tank Level Probing Radar, Radiolocation (military), Detection of movement and alert\"\n9500000000,9800000000,\"RADIOLOCATION, RADIONAVIGATION\",\"Tank Level Probing Radar, Radiolocation (military), Detection of movement and alert\"\n9800000000,10000000000,\"Fixed, Meteorological-Satellite, RADIOLOCATION\",\"Tank Level Probing Radar, Radiolocation (military), Detection of movement and alert (9500-9975 MHz)\"\n10000000000,10150000000,\"Amateur, RADIOLOCATION\",\"Tank Level Probing Radar, Radiolocation (military), Amateur\"\n10150000000,10300000000,\"Amateur, FIXED, RADIOLOCATION\",\"Tank Level Probing Radar, Radiolocation (military), Amateur, Broadband Wireless Access\"\n10300000000,10450000000,\"Amateur, RADIOLOCATION\",\"Tank Level Probing Radar, Radiolocation (military), Amateur\"\n10450000000,10500000000,\"Amateur, Amateur-Satellite, RADIOLOCATION\",\"Tank Level Probing Radar, Radiolocation (military), Amateur, Amateur-satellite\"\n10500000000,10600000000,\"FIXED, Radiolocation\",\"Tank Level Probing Radar, Broadband Wireless Access, Detection of movement and alert, Radiolocation (civil), SAP/SAB P to P video links (10.56-10.588 GHz)\"\n10600000000,10680000000,FIXED,Broadband Wireless Access (10.5-10.65 GHz)\n10680000000,10700000000,RADIO ASTRONOMY,\n10700000000,11700000000,\"FIXED, FIXED-SATELLITE (space-to-Earth) (Earth-to-space)\",\"SIT/SUT, FSS Earth stations, MSS Earth stations, Radio relay, SNG, VSAT\"\n11700000000,12500000000,\"BROADCASTING-SATELLITE, FIXED\",SIT/SUT\n12500000000,12750000000,FIXED-SATELLITE (space-to-Earth) (Earth-to-space),\"SIT/SUT, MSS Earth stations, SNG, VSAT\"\n12750000000,13250000000,FIXED,\"FSS Earth stations (No new assignments), Radio relay, SAP/SAB P to P video links\"\n13250000000,13400000000,AERONAUTICAL RADIONAVIGATION,Defence systems\n13400000000,13750000000,RADIOLOCATION,\"Detection of movement and alert, Radiolocation (civil), Radiolocation (military)\"\n13750000000,14000000000,\"RADIOLOCATION, FIXED-SATELLITE (Earth-to-space)\",\"Detection of movement and alert, Radiolocation (civil), Radiolocation (military), FSS Earth stations\"\n14000000000,14250000000,\"FIXED-SATELLITE (Earth-to-space), RADIONAVIGATION\",\"FSS Earth stations, SNG, VSAT, MSS Earth stations\"\n14250000000,14500000000,FIXED-SATELLITE (Earth-to-space),\"FSS Earth stations, SNG, VSAT\"\n14500000000,14620000000,FIXED,Radio relay\n14620000000,15230000000,FIXED,Fixed radio relay (military)\n15230000000,15350000000,FIXED,Radio relay\n15350000000,15400000000,RADIO ASTRONOMY,\n15400000000,15700000000,AERONAUTICAL RADIONAVIGATION,\n15700000000,16200000000,RADIOLOCATION,Radiolocation (military)\n16200000000,17300000000,RADIOLOCATION,\"Radiolocation (military), Ground Based Synthetic Aperture Radar (17.1-17.3 GHz)\"\n17300000000,17700000000,\"FIXED-SATELLITE (Earth-to-space), Radiolocation\",\"Radiolocation (military), FSS Earth stations\"\n17700000000,19700000000,FIXED,\"FSS Earth stations (No new assignments), Radio relay\"\n19700000000,20200000000,FIXED-SATELLITE (space-to-Earth),SIT/SUT\n20200000000,21200000000,\"FIXED-SATELLITE (space-to-Earth), MOBILE-SATELLITE (space-to-Earth)\",Defence systems\n21200000000,23600000000,FIXED,\"Radio relay, SAP/SAB P to P video links, Short-range radar (21.65-24.25 GHz)\"\n23600000000,24000000000,not allocated,Short-range radar\n24000000000,24050000000,\"AMATEUR, AMATEUR-SATELLITE\",\"Short-range radar, ISM, Non-specific Short Range Devices, Amateur, Amateur-satellite\"\n24050000000,24250000000,\"Amateur, RADIOLOCATION\",\"Short-range radar, ISM, Non-specific Short Range Devices, Tank Level Probing Radar, Amateur, Detection of movement and alert, Radiolocation (civil), Radiolocation (military)\"\n24250000000,24500000000,FIXED,\"Tank Level Probing Radar, Short-range radar\"\n24500000000,25250000000,FIXED,\"Tank Level Probing Radar, Short-range radar, Radio relay (24.549-25.333 GHz), Wireless Local Loop (25.137-25.193 GHz)\"\n25250000000,25333000000,\"FIXED, MOBILE\",\"Tank Level Probing Radar, Short-range radar, Radio relay\"\n25333000000,25500000000,\"FIXED, MOBILE\",\"Tank Level Probing Radar, Short-range radar, Fixed radio relay (military) (25.333-25.445 GHz)\"\n25500000000,26341000000,\"FIXED, MOBILE\",\"Tank Level Probing Radar, Short-range radar, Radio relay (25.557-26.341 GHz), Wireless Local Loop (26.145-26.201 GHz)\"\n26341000000,27500000000,\"FIXED, MOBILE\",\"Tank Level Probing Radar (24.05-27 GHz), Short-range radar (24.25-26.65 GHz), Fixed radio relay (military) (26.341-26.453 GHz)\"\n27500000000,27828500000,FIXED,FSS Earth stations (27.5485-27.8285 GHz) (Foreseen)\n27828500000,27940500000,FIXED,Fixed radio relay (military)\n27940500000,28836500000,FIXED,\"Radio relay (27.9405-28.1925 GHz), Wireless Local Loop (28.2205-28.4445 GHz), FSS Earth stations (28.5565-28.8365 GHz) (Foreseen)\"\n28836500000,28948500000,FIXED,Fixed radio relay (military)\n28948500000,29500000000,FIXED,\"Radio relay (28.9485-29.2005 GHz), Wireless Local Loop (29.2285-29.4525 GHz)\"\n29500000000,30000000000,FIXED-SATELLITE (Earth-to-space),SIT/SUT\n30000000000,31000000000,\"FIXED-SATELLITE (Earth-to-space), MOBILE-SATELLITE (Earth-to-space)\",Defence systems\n31000000000,31300000000,FIXED,Radio relay\n31300000000,31500000000,\"EARTH EXPLORATION-SATELLITE (passive), RADIO ASTRONOMY, SPACE RESEARCH (passive)\",\n31500000000,31800000000,not allocated,\n31800000000,33400000000,\"RADIONAVIGATION, FIXED\",Radio relay\n33400000000,36000000000,RADIOLOCATION,Radiolocation (military)\n36000000000,37282000000,\"FIXED, MOBILE\",\"Defence systems (36-37 GHz), Fixed radio relay (military) (37.058-37.282 GHz) (CEPT T/R 12-01)\"\n37282000000,37500000000,\"FIXED, MOBILE\",Radio relay (37.308-38.178 GHz)\n37500000000,38318000000,FIXED,Radio relay (37.308-38.178 GHz)\n38318000000,38542000000,FIXED,Fixed radio relay (military) (38.318-38.452 GHz) (CEPT T/R 12-01)\n38542000000,39500000000,FIXED,Radio relay (38.568-39.438 GHz)\n39500000000,40500000000,\"FIXED-SATELLITE (space-to-Earth), MOBILE-SATELLITE (space-to-Earth)\",Satellite systems (military) (Foreseen)\n40500000000,43500000000,FIXED,\n43500000000,47000000000,\"MOBILE, MOBILE-SATELLITE, RADIONAVIGATION, RADIONAVIGATION-SATELLITE\",\n47000000000,47200000000,\"AMATEUR, AMATEUR-SATELLITE\",\"Amateur, Amateur-satellite\"\n47200000000,50200000000,FIXED,\"HAPS (47.2-47.5 GHz) (Foreseen), HAPS (47.9-48.2 GHz) (Foreseen)\"\n50200000000,50400000000,not allocated,\n50400000000,51400000000,\"FIXED-SATELLITE (Earth-to-space), Mobile-Satellite (Earth-to-space)\",\n51400000000,52600000000,FIXED,Radio relay\n52600000000,55780000000,not allocated,\n55780000000,57000000000,FIXED,Radio relay\n57000000000,59000000000,FIXED,\"Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems, Wideband Data Transmission Systems, Tank Level Probing Radar, Unplanned. uncoordinated fixed links\"\n59000000000,62000000000,\"FIXED, MOBILE, RADIOLOCATION\",\"Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems, Wideband Data Transmission Systems, Tank Level Probing Radar, Unplanned. uncoordinated fixed links, ISM (61-61.5 GHz), Non-specific Short Range Devices (61-61.5 GHz)\"\n62000000000,63000000000,\"FIXED, MOBILE, RADIOLOCATION\",\"Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems, Wideband Data Transmission Systems, Tank Level Probing Radar, Unplanned. uncoordinated fixed links\"\n63000000000,64000000000,\"MOBILE, RADIOLOCATION\",\"Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems, Wideband Data Transmission Systems, Tank Level Probing Radar, RTTT\"\n64000000000,66000000000,\"MOBILE, FIXED\",\"Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems, Wideband Data Transmission Systems, Unplanned. uncoordinated fixed links\"\n66000000000,71000000000,\"RADIONAVIGATION, RADIONAVIGATION-SATELLITE\",\n71000000000,74000000000,FIXED,Unplanned. uncoordinated fixed links\n74000000000,75500000000,FIXED,\"Unplanned. uncoordinated fixed links, Tank Level Probing Radar (75-85 GHz)\"\n75500000000,76000000000,\"AMATEUR, AMATEUR-SATELLITE, FIXED\",\"Unplanned. uncoordinated fixed links, Tank Level Probing Radar, Amateur, Amateur-satellite\"\n76000000000,81000000000,\"RADIOLOCATION, Amateur, Amateur-Satellite\",\"Tank Level Probing Radar, Amateur, Amateur-satellite, RTTT (76-77 GHz), Short-range radar (77-81 GHz)\"\n81000000000,84000000000,FIXED,\"Tank Level Probing Radar, Unplanned. uncoordinated fixed links\"\n84000000000,86000000000,FIXED,\"Tank Level Probing Radar (75-85 GHz), Unplanned. uncoordinated fixed links\"\n86000000000,92000000000,not allocated,\n92000000000,95000000000,RADIOLOCATION,\n95000000000,100000000000,\"RADIONAVIGATION, RADIONAVIGATION-SATELLITE, RADIOLOCATION\",\n100000000000,126000000000,not allocated,\"ISM (122-123 GHz), Non-specific Short Range Devices (122-123 GHz)\"\n126000000000,134000000000,RADIOLOCATION,\n134000000000,142000000000,\"RADIONAVIGATION, RADIONAVIGATION-SATELLITE\",\n142000000000,144000000000,\"AMATEUR, AMATEUR-SATELLITE\",\"Amateur, Amateur-satellite\"\n144000000000,149000000000,\"Amateur, Amateur-Satellite\",\"Amateur, Amateur-satellite\"\n149000000000,190000000000,not allocated,\n190000000000,200000000000,\"RADIONAVIGATION, RADIONAVIGATION-SATELLITE\",\n200000000000,231000000000,not allocated,\n231000000000,235000000000,Radiolocation,\n235000000000,238000000000,not allocated,\n238000000000,241000000000,Radiolocation,\n241000000000,248000000000,\"Amateur, Amateur-Satellite, RADIOLOCATION\",\"Amateur, Amateur-satellite, ISM (244-246 GHz), Non-specific Short Range Devices (244-246 GHz)\"\n248000000000,250000000000,\"AMATEUR, AMATEUR-SATELLITE\",\"Amateur, Amateur-satellite\"\n250000000000,252000000000,not allocated,\n252000000000,265000000000,\"RADIONAVIGATION, RADIONAVIGATION-SATELLITE\",\n265000000000,275000000000,not allocated,"
  },
  {
    "path": "data-wrangling/csv2lua.py",
    "content": "# Convert a CSV file to a Lua table script that can be imported using `dofile`.\n\nimport csv\n\ndef csv2lua(in_file, out_file, global_name):\n    fp_in = open(in_file, 'r')\n    rows = list(csv.reader(fp_in))\n    fp_in.close()\n\n    headers = rows[0]\n    lua_rows = []\n    for row in rows[1:]:\n        cells = []\n        print row\n        for i, cell in enumerate(row):\n            key = headers[i]\n            try:\n                cell = int(cell)\n                cells.append('%s=%s' % (key, cell))\n            except ValueError:\n                cells.append('%s=\"%s\"' % (key, cell))\n        lua_rows.append('  {' + ', '.join(cells) + '}')\n\n\n\n        #start_freq, end_freq, allocation, applications = row\n        #s = '  {start_freq=%s, end_freq=%s, allocation=\"%s\", applications=\"%s\"}' % (start_freq, end_freq, allocation, applications)\n        #lua_rows.append(s)\n    s = '%s = {\\n%s\\n}\\n' % (global_name, ',\\n'.join(lua_rows))\n    print s\n    fp_out = open(out_file, 'w')\n    fp_out.write(s)\n    fp_out.close()\n\ndef usage():\n    print \"python csv2lua.py <table.csv> <table.lua> <global>\"\n\nif __name__ == '__main__':\n    import sys\n    if len(sys.argv) != 4:\n        usage()\n    else:\n        csv2lua(sys.argv[1], sys.argv[2], sys.argv[3])\n"
  },
  {
    "path": "externals/lua/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 2.8.4)\n\nset(LUA_SOURCES\n    src/lapi.c\n    src/lauxlib.c\n    src/lbaselib.c\n    src/lbitlib.c\n    src/lcode.c\n    src/lcorolib.c\n    src/lctype.c\n    src/ldblib.c\n    src/ldebug.c\n    src/ldo.c\n    src/ldump.c\n    src/lfunc.c\n    src/lgc.c\n    src/linit.c\n    src/liolib.c\n    src/llex.c\n    src/lmathlib.c\n    src/lmem.c\n    src/loadlib.c\n    src/lobject.c\n    src/lopcodes.c\n    src/loslib.c\n    src/lparser.c\n    src/lstate.c\n    src/lstring.c\n    src/lstrlib.c\n    src/ltable.c\n    src/ltablib.c\n    src/ltm.c\n    src/lua.c\n    src/luac.c\n    src/lundump.c\n    src/lutf8lib.c\n    src/lvm.c\n    src/lzio.c)\n\nadd_library(lua ${LUA_SOURCES})\n"
  },
  {
    "path": "externals/lua/src/Makefile",
    "content": "# Makefile for building Lua\n# See ../doc/readme.html for installation and customization instructions.\n\n# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================\n\n# Your platform. See PLATS for possible values.\nPLAT= none\n\nCC= gcc -std=gnu99\nCFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS) $(MYCFLAGS)\nLDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS)\nLIBS= -lm $(SYSLIBS) $(MYLIBS)\n\nAR= ar rcu\nRANLIB= ranlib\nRM= rm -f\n\nSYSCFLAGS=\nSYSLDFLAGS=\nSYSLIBS=\n\nMYCFLAGS=\nMYLDFLAGS=\nMYLIBS=\nMYOBJS=\n\n# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE =======\n\nPLATS= aix bsd c89 freebsd generic linux macosx mingw posix solaris\n\nLUA_A=\tliblua.a\nCORE_O=\tlapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o \\\n\tlmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o \\\n\tltm.o lundump.o lvm.o lzio.o\nLIB_O=\tlauxlib.o lbaselib.o lbitlib.o lcorolib.o ldblib.o liolib.o \\\n\tlmathlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o loadlib.o linit.o\nBASE_O= $(CORE_O) $(LIB_O) $(MYOBJS)\n\nLUA_T=\tlua\nLUA_O=\tlua.o\n\nLUAC_T=\tluac\nLUAC_O=\tluac.o\n\nALL_O= $(BASE_O) $(LUA_O) $(LUAC_O)\nALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)\nALL_A= $(LUA_A)\n\n# Targets start here.\ndefault: $(PLAT)\n\nall:\t$(ALL_T)\n\no:\t$(ALL_O)\n\na:\t$(ALL_A)\n\n$(LUA_A): $(BASE_O)\n\t$(AR) $@ $(BASE_O)\n\t$(RANLIB) $@\n\n$(LUA_T): $(LUA_O) $(LUA_A)\n\t$(CC) -o $@ $(LDFLAGS) $(LUA_O) $(LUA_A) $(LIBS)\n\n$(LUAC_T): $(LUAC_O) $(LUA_A)\n\t$(CC) -o $@ $(LDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS)\n\nclean:\n\t$(RM) $(ALL_T) $(ALL_O)\n\ndepend:\n\t@$(CC) $(CFLAGS) -MM l*.c\n\necho:\n\t@echo \"PLAT= $(PLAT)\"\n\t@echo \"CC= $(CC)\"\n\t@echo \"CFLAGS= $(CFLAGS)\"\n\t@echo \"LDFLAGS= $(SYSLDFLAGS)\"\n\t@echo \"LIBS= $(LIBS)\"\n\t@echo \"AR= $(AR)\"\n\t@echo \"RANLIB= $(RANLIB)\"\n\t@echo \"RM= $(RM)\"\n\n# Convenience targets for popular platforms\nALL= all\n\nnone:\n\t@echo \"Please do 'make PLATFORM' where PLATFORM is one of these:\"\n\t@echo \"   $(PLATS)\"\n\naix:\n\t$(MAKE) $(ALL) CC=\"xlc\" CFLAGS=\"-O2 -DLUA_USE_POSIX -DLUA_USE_DLOPEN\" SYSLIBS=\"-ldl\" SYSLDFLAGS=\"-brtl -bexpall\"\n\nbsd:\n\t$(MAKE) $(ALL) SYSCFLAGS=\"-DLUA_USE_POSIX -DLUA_USE_DLOPEN\" SYSLIBS=\"-Wl,-E\"\n\nc89:\n\t$(MAKE) $(ALL) SYSCFLAGS=\"-DLUA_USE_C89\" CC=\"gcc -std=c89\"\n\t@echo ''\n\t@echo '*** C89 does not guarantee 64-bit integers for Lua.'\n\t@echo ''\n\n\nfreebsd:\n\t$(MAKE) $(ALL) SYSCFLAGS=\"-DLUA_USE_LINUX\" SYSLIBS=\"-Wl,-E -lreadline\"\n\ngeneric: $(ALL)\n\nlinux:\n\t$(MAKE) $(ALL) SYSCFLAGS=\"-DLUA_USE_LINUX\" SYSLIBS=\"-Wl,-E -ldl -lreadline\"\n\nmacosx:\n\t$(MAKE) $(ALL) SYSCFLAGS=\"-DLUA_USE_MACOSX\" SYSLIBS=\"-lreadline\" CC=cc\n\nmingw:\n\t$(MAKE) \"LUA_A=lua53.dll\" \"LUA_T=lua.exe\" \\\n\t\"AR=$(CC) -shared -o\" \"RANLIB=strip --strip-unneeded\" \\\n\t\"SYSCFLAGS=-DLUA_BUILD_AS_DLL\" \"SYSLIBS=\" \"SYSLDFLAGS=-s\" lua.exe\n\t$(MAKE) \"LUAC_T=luac.exe\" luac.exe\n\nposix:\n\t$(MAKE) $(ALL) SYSCFLAGS=\"-DLUA_USE_POSIX\"\n\nsolaris:\n\t$(MAKE) $(ALL) SYSCFLAGS=\"-DLUA_USE_POSIX -DLUA_USE_DLOPEN -D_REENTRANT\" SYSLIBS=\"-ldl\"\n\n# list targets that do not create files (but not all makes understand .PHONY)\n.PHONY: all $(PLATS) default o a clean depend echo none\n\n# DO NOT DELETE\n\nlapi.o: lapi.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \\\n  lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lstring.h \\\n  ltable.h lundump.h lvm.h\nlauxlib.o: lauxlib.c lprefix.h lua.h luaconf.h lauxlib.h\nlbaselib.o: lbaselib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h\nlbitlib.o: lbitlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h\nlcode.o: lcode.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \\\n  llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \\\n  ldo.h lgc.h lstring.h ltable.h lvm.h\nlcorolib.o: lcorolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h\nlctype.o: lctype.c lprefix.h lctype.h lua.h luaconf.h llimits.h\nldblib.o: ldblib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h\nldebug.o: ldebug.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \\\n  lobject.h ltm.h lzio.h lmem.h lcode.h llex.h lopcodes.h lparser.h \\\n  ldebug.h ldo.h lfunc.h lstring.h lgc.h ltable.h lvm.h\nldo.o: ldo.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \\\n  lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lopcodes.h \\\n  lparser.h lstring.h ltable.h lundump.h lvm.h\nldump.o: ldump.c lprefix.h lua.h luaconf.h lobject.h llimits.h lstate.h \\\n  ltm.h lzio.h lmem.h lundump.h\nlfunc.o: lfunc.c lprefix.h lua.h luaconf.h lfunc.h lobject.h llimits.h \\\n  lgc.h lstate.h ltm.h lzio.h lmem.h\nlgc.o: lgc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \\\n  llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h\nlinit.o: linit.c lprefix.h lua.h luaconf.h lualib.h lauxlib.h\nliolib.o: liolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h\nllex.o: llex.c lprefix.h lua.h luaconf.h lctype.h llimits.h ldo.h \\\n  lobject.h lstate.h ltm.h lzio.h lmem.h lgc.h llex.h lparser.h lstring.h \\\n  ltable.h\nlmathlib.o: lmathlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h\nlmem.o: lmem.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \\\n  llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h\nloadlib.o: loadlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h\nlobject.o: lobject.c lprefix.h lua.h luaconf.h lctype.h llimits.h \\\n  ldebug.h lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h \\\n  lvm.h\nlopcodes.o: lopcodes.c lprefix.h lopcodes.h llimits.h lua.h luaconf.h\nloslib.o: loslib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h\nlparser.o: lparser.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \\\n  llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \\\n  ldo.h lfunc.h lstring.h lgc.h ltable.h\nlstate.o: lstate.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \\\n  lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h llex.h \\\n  lstring.h ltable.h\nlstring.o: lstring.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \\\n  lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h\nlstrlib.o: lstrlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h\nltable.o: ltable.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \\\n  llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h\nltablib.o: ltablib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h\nltm.o: ltm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \\\n  llimits.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h ltable.h lvm.h\nlua.o: lua.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h\nluac.o: luac.c lprefix.h lua.h luaconf.h lauxlib.h lobject.h llimits.h \\\n  lstate.h ltm.h lzio.h lmem.h lundump.h ldebug.h lopcodes.h\nlundump.o: lundump.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \\\n  lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h \\\n  lundump.h\nlutf8lib.o: lutf8lib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h\nlvm.o: lvm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \\\n  llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h \\\n  ltable.h lvm.h\nlzio.o: lzio.c lprefix.h lua.h luaconf.h llimits.h lmem.h lstate.h \\\n  lobject.h ltm.h lzio.h\n\n# (end of Makefile)\n"
  },
  {
    "path": "externals/lua/src/lapi.c",
    "content": "/*\n** $Id: lapi.c,v 2.244 2014/12/26 14:43:45 roberto Exp $\n** Lua API\n** See Copyright Notice in lua.h\n*/\n\n#define lapi_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include <stdarg.h>\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"lapi.h\"\n#include \"ldebug.h\"\n#include \"ldo.h\"\n#include \"lfunc.h\"\n#include \"lgc.h\"\n#include \"lmem.h\"\n#include \"lobject.h\"\n#include \"lstate.h\"\n#include \"lstring.h\"\n#include \"ltable.h\"\n#include \"ltm.h\"\n#include \"lundump.h\"\n#include \"lvm.h\"\n\n\n\nconst char lua_ident[] =\n  \"$LuaVersion: \" LUA_COPYRIGHT \" $\"\n  \"$LuaAuthors: \" LUA_AUTHORS \" $\";\n\n\n/* value at a non-valid index */\n#define NONVALIDVALUE\t\tcast(TValue *, luaO_nilobject)\n\n/* corresponding test */\n#define isvalid(o)\t((o) != luaO_nilobject)\n\n/* test for pseudo index */\n#define ispseudo(i)\t\t((i) <= LUA_REGISTRYINDEX)\n\n/* test for upvalue */\n#define isupvalue(i)\t\t((i) < LUA_REGISTRYINDEX)\n\n/* test for valid but not pseudo index */\n#define isstackindex(i, o)\t(isvalid(o) && !ispseudo(i))\n\n#define api_checkvalidindex(o)  api_check(isvalid(o), \"invalid index\")\n\n#define api_checkstackindex(i, o)  \\\n\tapi_check(isstackindex(i, o), \"index not in the stack\")\n\n\nstatic TValue *index2addr (lua_State *L, int idx) {\n  CallInfo *ci = L->ci;\n  if (idx > 0) {\n    TValue *o = ci->func + idx;\n    api_check(idx <= ci->top - (ci->func + 1), \"unacceptable index\");\n    if (o >= L->top) return NONVALIDVALUE;\n    else return o;\n  }\n  else if (!ispseudo(idx)) {  /* negative index */\n    api_check(idx != 0 && -idx <= L->top - (ci->func + 1), \"invalid index\");\n    return L->top + idx;\n  }\n  else if (idx == LUA_REGISTRYINDEX)\n    return &G(L)->l_registry;\n  else {  /* upvalues */\n    idx = LUA_REGISTRYINDEX - idx;\n    api_check(idx <= MAXUPVAL + 1, \"upvalue index too large\");\n    if (ttislcf(ci->func))  /* light C function? */\n      return NONVALIDVALUE;  /* it has no upvalues */\n    else {\n      CClosure *func = clCvalue(ci->func);\n      return (idx <= func->nupvalues) ? &func->upvalue[idx-1] : NONVALIDVALUE;\n    }\n  }\n}\n\n\n/*\n** to be called by 'lua_checkstack' in protected mode, to grow stack\n** capturing memory errors\n*/\nstatic void growstack (lua_State *L, void *ud) {\n  int size = *(int *)ud;\n  luaD_growstack(L, size);\n}\n\n\nLUA_API int lua_checkstack (lua_State *L, int n) {\n  int res;\n  CallInfo *ci = L->ci;\n  lua_lock(L);\n  api_check(n >= 0, \"negative 'n'\");\n  if (L->stack_last - L->top > n)  /* stack large enough? */\n    res = 1;  /* yes; check is OK */\n  else {  /* no; need to grow stack */\n    int inuse = cast_int(L->top - L->stack) + EXTRA_STACK;\n    if (inuse > LUAI_MAXSTACK - n)  /* can grow without overflow? */\n      res = 0;  /* no */\n    else  /* try to grow stack */\n      res = (luaD_rawrunprotected(L, &growstack, &n) == LUA_OK);\n  }\n  if (res && ci->top < L->top + n)\n    ci->top = L->top + n;  /* adjust frame top */\n  lua_unlock(L);\n  return res;\n}\n\n\nLUA_API void lua_xmove (lua_State *from, lua_State *to, int n) {\n  int i;\n  if (from == to) return;\n  lua_lock(to);\n  api_checknelems(from, n);\n  api_check(G(from) == G(to), \"moving among independent states\");\n  api_check(to->ci->top - to->top >= n, \"not enough elements to move\");\n  from->top -= n;\n  for (i = 0; i < n; i++) {\n    setobj2s(to, to->top++, from->top + i);\n  }\n  lua_unlock(to);\n}\n\n\nLUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) {\n  lua_CFunction old;\n  lua_lock(L);\n  old = G(L)->panic;\n  G(L)->panic = panicf;\n  lua_unlock(L);\n  return old;\n}\n\n\nLUA_API const lua_Number *lua_version (lua_State *L) {\n  static const lua_Number version = LUA_VERSION_NUM;\n  if (L == NULL) return &version;\n  else return G(L)->version;\n}\n\n\n\n/*\n** basic stack manipulation\n*/\n\n\n/*\n** convert an acceptable stack index into an absolute index\n*/\nLUA_API int lua_absindex (lua_State *L, int idx) {\n  return (idx > 0 || ispseudo(idx))\n         ? idx\n         : cast_int(L->top - L->ci->func + idx);\n}\n\n\nLUA_API int lua_gettop (lua_State *L) {\n  return cast_int(L->top - (L->ci->func + 1));\n}\n\n\nLUA_API void lua_settop (lua_State *L, int idx) {\n  StkId func = L->ci->func;\n  lua_lock(L);\n  if (idx >= 0) {\n    api_check(idx <= L->stack_last - (func + 1), \"new top too large\");\n    while (L->top < (func + 1) + idx)\n      setnilvalue(L->top++);\n    L->top = (func + 1) + idx;\n  }\n  else {\n    api_check(-(idx+1) <= (L->top - (func + 1)), \"invalid new top\");\n    L->top += idx+1;  /* 'subtract' index (index is negative) */\n  }\n  lua_unlock(L);\n}\n\n\n/*\n** Reverse the stack segment from 'from' to 'to'\n** (auxiliary to 'lua_rotate')\n*/\nstatic void reverse (lua_State *L, StkId from, StkId to) {\n  for (; from < to; from++, to--) {\n    TValue temp;\n    setobj(L, &temp, from);\n    setobjs2s(L, from, to);\n    setobj2s(L, to, &temp);\n  }\n}\n\n\n/*\n** Let x = AB, where A is a prefix of length 'n'. Then,\n** rotate x n == BA. But BA == (A^r . B^r)^r.\n*/\nLUA_API void lua_rotate (lua_State *L, int idx, int n) {\n  StkId p, t, m;\n  lua_lock(L);\n  t = L->top - 1;  /* end of stack segment being rotated */\n  p = index2addr(L, idx);  /* start of segment */\n  api_checkstackindex(idx, p);\n  api_check((n >= 0 ? n : -n) <= (t - p + 1), \"invalid 'n'\");\n  m = (n >= 0 ? t - n : p - n - 1);  /* end of prefix */\n  reverse(L, p, m);  /* reverse the prefix with length 'n' */\n  reverse(L, m + 1, t);  /* reverse the suffix */\n  reverse(L, p, t);  /* reverse the entire segment */\n  lua_unlock(L);\n}\n\n\nLUA_API void lua_copy (lua_State *L, int fromidx, int toidx) {\n  TValue *fr, *to;\n  lua_lock(L);\n  fr = index2addr(L, fromidx);\n  to = index2addr(L, toidx);\n  api_checkvalidindex(to);\n  setobj(L, to, fr);\n  if (isupvalue(toidx))  /* function upvalue? */\n    luaC_barrier(L, clCvalue(L->ci->func), fr);\n  /* LUA_REGISTRYINDEX does not need gc barrier\n     (collector revisits it before finishing collection) */\n  lua_unlock(L);\n}\n\n\nLUA_API void lua_pushvalue (lua_State *L, int idx) {\n  lua_lock(L);\n  setobj2s(L, L->top, index2addr(L, idx));\n  api_incr_top(L);\n  lua_unlock(L);\n}\n\n\n\n/*\n** access functions (stack -> C)\n*/\n\n\nLUA_API int lua_type (lua_State *L, int idx) {\n  StkId o = index2addr(L, idx);\n  return (isvalid(o) ? ttnov(o) : LUA_TNONE);\n}\n\n\nLUA_API const char *lua_typename (lua_State *L, int t) {\n  UNUSED(L);\n  api_check(LUA_TNONE <= t && t < LUA_NUMTAGS, \"invalid tag\");\n  return ttypename(t);\n}\n\n\nLUA_API int lua_iscfunction (lua_State *L, int idx) {\n  StkId o = index2addr(L, idx);\n  return (ttislcf(o) || (ttisCclosure(o)));\n}\n\n\nLUA_API int lua_isinteger (lua_State *L, int idx) {\n  StkId o = index2addr(L, idx);\n  return ttisinteger(o);\n}\n\n\nLUA_API int lua_isnumber (lua_State *L, int idx) {\n  lua_Number n;\n  const TValue *o = index2addr(L, idx);\n  return tonumber(o, &n);\n}\n\n\nLUA_API int lua_isstring (lua_State *L, int idx) {\n  const TValue *o = index2addr(L, idx);\n  return (ttisstring(o) || cvt2str(o));\n}\n\n\nLUA_API int lua_isuserdata (lua_State *L, int idx) {\n  const TValue *o = index2addr(L, idx);\n  return (ttisfulluserdata(o) || ttislightuserdata(o));\n}\n\n\nLUA_API int lua_rawequal (lua_State *L, int index1, int index2) {\n  StkId o1 = index2addr(L, index1);\n  StkId o2 = index2addr(L, index2);\n  return (isvalid(o1) && isvalid(o2)) ? luaV_rawequalobj(o1, o2) : 0;\n}\n\n\nLUA_API void lua_arith (lua_State *L, int op) {\n  lua_lock(L);\n  if (op != LUA_OPUNM && op != LUA_OPBNOT)\n    api_checknelems(L, 2);  /* all other operations expect two operands */\n  else {  /* for unary operations, add fake 2nd operand */\n    api_checknelems(L, 1);\n    setobjs2s(L, L->top, L->top - 1);\n    L->top++;\n  }\n  /* first operand at top - 2, second at top - 1; result go to top - 2 */\n  luaO_arith(L, op, L->top - 2, L->top - 1, L->top - 2);\n  L->top--;  /* remove second operand */\n  lua_unlock(L);\n}\n\n\nLUA_API int lua_compare (lua_State *L, int index1, int index2, int op) {\n  StkId o1, o2;\n  int i = 0;\n  lua_lock(L);  /* may call tag method */\n  o1 = index2addr(L, index1);\n  o2 = index2addr(L, index2);\n  if (isvalid(o1) && isvalid(o2)) {\n    switch (op) {\n      case LUA_OPEQ: i = luaV_equalobj(L, o1, o2); break;\n      case LUA_OPLT: i = luaV_lessthan(L, o1, o2); break;\n      case LUA_OPLE: i = luaV_lessequal(L, o1, o2); break;\n      default: api_check(0, \"invalid option\");\n    }\n  }\n  lua_unlock(L);\n  return i;\n}\n\n\nLUA_API size_t lua_stringtonumber (lua_State *L, const char *s) {\n  size_t sz = luaO_str2num(s, L->top);\n  if (sz != 0)\n    api_incr_top(L);\n  return sz;\n}\n\n\nLUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *pisnum) {\n  lua_Number n;\n  const TValue *o = index2addr(L, idx);\n  int isnum = tonumber(o, &n);\n  if (!isnum)\n    n = 0;  /* call to 'tonumber' may change 'n' even if it fails */\n  if (pisnum) *pisnum = isnum;\n  return n;\n}\n\n\nLUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *pisnum) {\n  lua_Integer res;\n  const TValue *o = index2addr(L, idx);\n  int isnum = tointeger(o, &res);\n  if (!isnum)\n    res = 0;  /* call to 'tointeger' may change 'n' even if it fails */\n  if (pisnum) *pisnum = isnum;\n  return res;\n}\n\n\nLUA_API int lua_toboolean (lua_State *L, int idx) {\n  const TValue *o = index2addr(L, idx);\n  return !l_isfalse(o);\n}\n\n\nLUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {\n  StkId o = index2addr(L, idx);\n  if (!ttisstring(o)) {\n    if (!cvt2str(o)) {  /* not convertible? */\n      if (len != NULL) *len = 0;\n      return NULL;\n    }\n    lua_lock(L);  /* 'luaO_tostring' may create a new string */\n    luaC_checkGC(L);\n    o = index2addr(L, idx);  /* previous call may reallocate the stack */\n    luaO_tostring(L, o);\n    lua_unlock(L);\n  }\n  if (len != NULL) *len = tsvalue(o)->len;\n  return svalue(o);\n}\n\n\nLUA_API size_t lua_rawlen (lua_State *L, int idx) {\n  StkId o = index2addr(L, idx);\n  switch (ttnov(o)) {\n    case LUA_TSTRING: return tsvalue(o)->len;\n    case LUA_TUSERDATA: return uvalue(o)->len;\n    case LUA_TTABLE: return luaH_getn(hvalue(o));\n    default: return 0;\n  }\n}\n\n\nLUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) {\n  StkId o = index2addr(L, idx);\n  if (ttislcf(o)) return fvalue(o);\n  else if (ttisCclosure(o))\n    return clCvalue(o)->f;\n  else return NULL;  /* not a C function */\n}\n\n\nLUA_API void *lua_touserdata (lua_State *L, int idx) {\n  StkId o = index2addr(L, idx);\n  switch (ttnov(o)) {\n    case LUA_TUSERDATA: return getudatamem(uvalue(o));\n    case LUA_TLIGHTUSERDATA: return pvalue(o);\n    default: return NULL;\n  }\n}\n\n\nLUA_API lua_State *lua_tothread (lua_State *L, int idx) {\n  StkId o = index2addr(L, idx);\n  return (!ttisthread(o)) ? NULL : thvalue(o);\n}\n\n\nLUA_API const void *lua_topointer (lua_State *L, int idx) {\n  StkId o = index2addr(L, idx);\n  switch (ttype(o)) {\n    case LUA_TTABLE: return hvalue(o);\n    case LUA_TLCL: return clLvalue(o);\n    case LUA_TCCL: return clCvalue(o);\n    case LUA_TLCF: return cast(void *, cast(size_t, fvalue(o)));\n    case LUA_TTHREAD: return thvalue(o);\n    case LUA_TUSERDATA:\n    case LUA_TLIGHTUSERDATA:\n      return lua_touserdata(L, idx);\n    default: return NULL;\n  }\n}\n\n\n\n/*\n** push functions (C -> stack)\n*/\n\n\nLUA_API void lua_pushnil (lua_State *L) {\n  lua_lock(L);\n  setnilvalue(L->top);\n  api_incr_top(L);\n  lua_unlock(L);\n}\n\n\nLUA_API void lua_pushnumber (lua_State *L, lua_Number n) {\n  lua_lock(L);\n  setfltvalue(L->top, n);\n  api_incr_top(L);\n  lua_unlock(L);\n}\n\n\nLUA_API void lua_pushinteger (lua_State *L, lua_Integer n) {\n  lua_lock(L);\n  setivalue(L->top, n);\n  api_incr_top(L);\n  lua_unlock(L);\n}\n\n\nLUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t len) {\n  TString *ts;\n  lua_lock(L);\n  luaC_checkGC(L);\n  ts = luaS_newlstr(L, s, len);\n  setsvalue2s(L, L->top, ts);\n  api_incr_top(L);\n  lua_unlock(L);\n  return getstr(ts);\n}\n\n\nLUA_API const char *lua_pushstring (lua_State *L, const char *s) {\n  if (s == NULL) {\n    lua_pushnil(L);\n    return NULL;\n  }\n  else {\n    TString *ts;\n    lua_lock(L);\n    luaC_checkGC(L);\n    ts = luaS_new(L, s);\n    setsvalue2s(L, L->top, ts);\n    api_incr_top(L);\n    lua_unlock(L);\n    return getstr(ts);\n  }\n}\n\n\nLUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt,\n                                      va_list argp) {\n  const char *ret;\n  lua_lock(L);\n  luaC_checkGC(L);\n  ret = luaO_pushvfstring(L, fmt, argp);\n  lua_unlock(L);\n  return ret;\n}\n\n\nLUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) {\n  const char *ret;\n  va_list argp;\n  lua_lock(L);\n  luaC_checkGC(L);\n  va_start(argp, fmt);\n  ret = luaO_pushvfstring(L, fmt, argp);\n  va_end(argp);\n  lua_unlock(L);\n  return ret;\n}\n\n\nLUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {\n  lua_lock(L);\n  if (n == 0) {\n    setfvalue(L->top, fn);\n  }\n  else {\n    CClosure *cl;\n    api_checknelems(L, n);\n    api_check(n <= MAXUPVAL, \"upvalue index too large\");\n    luaC_checkGC(L);\n    cl = luaF_newCclosure(L, n);\n    cl->f = fn;\n    L->top -= n;\n    while (n--) {\n      setobj2n(L, &cl->upvalue[n], L->top + n);\n      /* does not need barrier because closure is white */\n    }\n    setclCvalue(L, L->top, cl);\n  }\n  api_incr_top(L);\n  lua_unlock(L);\n}\n\n\nLUA_API void lua_pushboolean (lua_State *L, int b) {\n  lua_lock(L);\n  setbvalue(L->top, (b != 0));  /* ensure that true is 1 */\n  api_incr_top(L);\n  lua_unlock(L);\n}\n\n\nLUA_API void lua_pushlightuserdata (lua_State *L, void *p) {\n  lua_lock(L);\n  setpvalue(L->top, p);\n  api_incr_top(L);\n  lua_unlock(L);\n}\n\n\nLUA_API int lua_pushthread (lua_State *L) {\n  lua_lock(L);\n  setthvalue(L, L->top, L);\n  api_incr_top(L);\n  lua_unlock(L);\n  return (G(L)->mainthread == L);\n}\n\n\n\n/*\n** get functions (Lua -> stack)\n*/\n\n\nLUA_API int lua_getglobal (lua_State *L, const char *name) {\n  Table *reg = hvalue(&G(L)->l_registry);\n  const TValue *gt;  /* global table */\n  lua_lock(L);\n  gt = luaH_getint(reg, LUA_RIDX_GLOBALS);\n  setsvalue2s(L, L->top++, luaS_new(L, name));\n  luaV_gettable(L, gt, L->top - 1, L->top - 1);\n  lua_unlock(L);\n  return ttnov(L->top - 1);\n}\n\n\nLUA_API int lua_gettable (lua_State *L, int idx) {\n  StkId t;\n  lua_lock(L);\n  t = index2addr(L, idx);\n  luaV_gettable(L, t, L->top - 1, L->top - 1);\n  lua_unlock(L);\n  return ttnov(L->top - 1);\n}\n\n\nLUA_API int lua_getfield (lua_State *L, int idx, const char *k) {\n  StkId t;\n  lua_lock(L);\n  t = index2addr(L, idx);\n  setsvalue2s(L, L->top, luaS_new(L, k));\n  api_incr_top(L);\n  luaV_gettable(L, t, L->top - 1, L->top - 1);\n  lua_unlock(L);\n  return ttnov(L->top - 1);\n}\n\n\nLUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) {\n  StkId t;\n  lua_lock(L);\n  t = index2addr(L, idx);\n  setivalue(L->top, n);\n  api_incr_top(L);\n  luaV_gettable(L, t, L->top - 1, L->top - 1);\n  lua_unlock(L);\n  return ttnov(L->top - 1);\n}\n\n\nLUA_API int lua_rawget (lua_State *L, int idx) {\n  StkId t;\n  lua_lock(L);\n  t = index2addr(L, idx);\n  api_check(ttistable(t), \"table expected\");\n  setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1));\n  lua_unlock(L);\n  return ttnov(L->top - 1);\n}\n\n\nLUA_API int lua_rawgeti (lua_State *L, int idx, lua_Integer n) {\n  StkId t;\n  lua_lock(L);\n  t = index2addr(L, idx);\n  api_check(ttistable(t), \"table expected\");\n  setobj2s(L, L->top, luaH_getint(hvalue(t), n));\n  api_incr_top(L);\n  lua_unlock(L);\n  return ttnov(L->top - 1);\n}\n\n\nLUA_API int lua_rawgetp (lua_State *L, int idx, const void *p) {\n  StkId t;\n  TValue k;\n  lua_lock(L);\n  t = index2addr(L, idx);\n  api_check(ttistable(t), \"table expected\");\n  setpvalue(&k, cast(void *, p));\n  setobj2s(L, L->top, luaH_get(hvalue(t), &k));\n  api_incr_top(L);\n  lua_unlock(L);\n  return ttnov(L->top - 1);\n}\n\n\nLUA_API void lua_createtable (lua_State *L, int narray, int nrec) {\n  Table *t;\n  lua_lock(L);\n  luaC_checkGC(L);\n  t = luaH_new(L);\n  sethvalue(L, L->top, t);\n  api_incr_top(L);\n  if (narray > 0 || nrec > 0)\n    luaH_resize(L, t, narray, nrec);\n  lua_unlock(L);\n}\n\n\nLUA_API int lua_getmetatable (lua_State *L, int objindex) {\n  const TValue *obj;\n  Table *mt;\n  int res = 0;\n  lua_lock(L);\n  obj = index2addr(L, objindex);\n  switch (ttnov(obj)) {\n    case LUA_TTABLE:\n      mt = hvalue(obj)->metatable;\n      break;\n    case LUA_TUSERDATA:\n      mt = uvalue(obj)->metatable;\n      break;\n    default:\n      mt = G(L)->mt[ttnov(obj)];\n      break;\n  }\n  if (mt != NULL) {\n    sethvalue(L, L->top, mt);\n    api_incr_top(L);\n    res = 1;\n  }\n  lua_unlock(L);\n  return res;\n}\n\n\nLUA_API int lua_getuservalue (lua_State *L, int idx) {\n  StkId o;\n  lua_lock(L);\n  o = index2addr(L, idx);\n  api_check(ttisfulluserdata(o), \"full userdata expected\");\n  getuservalue(L, uvalue(o), L->top);\n  api_incr_top(L);\n  lua_unlock(L);\n  return ttnov(L->top - 1);\n}\n\n\n/*\n** set functions (stack -> Lua)\n*/\n\n\nLUA_API void lua_setglobal (lua_State *L, const char *name) {\n  Table *reg = hvalue(&G(L)->l_registry);\n  const TValue *gt;  /* global table */\n  lua_lock(L);\n  api_checknelems(L, 1);\n  gt = luaH_getint(reg, LUA_RIDX_GLOBALS);\n  setsvalue2s(L, L->top++, luaS_new(L, name));\n  luaV_settable(L, gt, L->top - 1, L->top - 2);\n  L->top -= 2;  /* pop value and key */\n  lua_unlock(L);\n}\n\n\nLUA_API void lua_settable (lua_State *L, int idx) {\n  StkId t;\n  lua_lock(L);\n  api_checknelems(L, 2);\n  t = index2addr(L, idx);\n  luaV_settable(L, t, L->top - 2, L->top - 1);\n  L->top -= 2;  /* pop index and value */\n  lua_unlock(L);\n}\n\n\nLUA_API void lua_setfield (lua_State *L, int idx, const char *k) {\n  StkId t;\n  lua_lock(L);\n  api_checknelems(L, 1);\n  t = index2addr(L, idx);\n  setsvalue2s(L, L->top++, luaS_new(L, k));\n  luaV_settable(L, t, L->top - 1, L->top - 2);\n  L->top -= 2;  /* pop value and key */\n  lua_unlock(L);\n}\n\n\nLUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) {\n  StkId t;\n  lua_lock(L);\n  api_checknelems(L, 1);\n  t = index2addr(L, idx);\n  setivalue(L->top++, n);\n  luaV_settable(L, t, L->top - 1, L->top - 2);\n  L->top -= 2;  /* pop value and key */\n  lua_unlock(L);\n}\n\n\nLUA_API void lua_rawset (lua_State *L, int idx) {\n  StkId o;\n  Table *t;\n  lua_lock(L);\n  api_checknelems(L, 2);\n  o = index2addr(L, idx);\n  api_check(ttistable(o), \"table expected\");\n  t = hvalue(o);\n  setobj2t(L, luaH_set(L, t, L->top-2), L->top-1);\n  invalidateTMcache(t);\n  luaC_barrierback(L, t, L->top-1);\n  L->top -= 2;\n  lua_unlock(L);\n}\n\n\nLUA_API void lua_rawseti (lua_State *L, int idx, lua_Integer n) {\n  StkId o;\n  Table *t;\n  lua_lock(L);\n  api_checknelems(L, 1);\n  o = index2addr(L, idx);\n  api_check(ttistable(o), \"table expected\");\n  t = hvalue(o);\n  luaH_setint(L, t, n, L->top - 1);\n  luaC_barrierback(L, t, L->top-1);\n  L->top--;\n  lua_unlock(L);\n}\n\n\nLUA_API void lua_rawsetp (lua_State *L, int idx, const void *p) {\n  StkId o;\n  Table *t;\n  TValue k;\n  lua_lock(L);\n  api_checknelems(L, 1);\n  o = index2addr(L, idx);\n  api_check(ttistable(o), \"table expected\");\n  t = hvalue(o);\n  setpvalue(&k, cast(void *, p));\n  setobj2t(L, luaH_set(L, t, &k), L->top - 1);\n  luaC_barrierback(L, t, L->top - 1);\n  L->top--;\n  lua_unlock(L);\n}\n\n\nLUA_API int lua_setmetatable (lua_State *L, int objindex) {\n  TValue *obj;\n  Table *mt;\n  lua_lock(L);\n  api_checknelems(L, 1);\n  obj = index2addr(L, objindex);\n  if (ttisnil(L->top - 1))\n    mt = NULL;\n  else {\n    api_check(ttistable(L->top - 1), \"table expected\");\n    mt = hvalue(L->top - 1);\n  }\n  switch (ttnov(obj)) {\n    case LUA_TTABLE: {\n      hvalue(obj)->metatable = mt;\n      if (mt) {\n        luaC_objbarrier(L, gcvalue(obj), mt);\n        luaC_checkfinalizer(L, gcvalue(obj), mt);\n      }\n      break;\n    }\n    case LUA_TUSERDATA: {\n      uvalue(obj)->metatable = mt;\n      if (mt) {\n        luaC_objbarrier(L, uvalue(obj), mt);\n        luaC_checkfinalizer(L, gcvalue(obj), mt);\n      }\n      break;\n    }\n    default: {\n      G(L)->mt[ttnov(obj)] = mt;\n      break;\n    }\n  }\n  L->top--;\n  lua_unlock(L);\n  return 1;\n}\n\n\nLUA_API void lua_setuservalue (lua_State *L, int idx) {\n  StkId o;\n  lua_lock(L);\n  api_checknelems(L, 1);\n  o = index2addr(L, idx);\n  api_check(ttisfulluserdata(o), \"full userdata expected\");\n  setuservalue(L, uvalue(o), L->top - 1);\n  luaC_barrier(L, gcvalue(o), L->top - 1);\n  L->top--;\n  lua_unlock(L);\n}\n\n\n/*\n** 'load' and 'call' functions (run Lua code)\n*/\n\n\n#define checkresults(L,na,nr) \\\n     api_check((nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na)), \\\n\t\"results from function overflow current stack size\")\n\n\nLUA_API void lua_callk (lua_State *L, int nargs, int nresults,\n                        lua_KContext ctx, lua_KFunction k) {\n  StkId func;\n  lua_lock(L);\n  api_check(k == NULL || !isLua(L->ci),\n    \"cannot use continuations inside hooks\");\n  api_checknelems(L, nargs+1);\n  api_check(L->status == LUA_OK, \"cannot do calls on non-normal thread\");\n  checkresults(L, nargs, nresults);\n  func = L->top - (nargs+1);\n  if (k != NULL && L->nny == 0) {  /* need to prepare continuation? */\n    L->ci->u.c.k = k;  /* save continuation */\n    L->ci->u.c.ctx = ctx;  /* save context */\n    luaD_call(L, func, nresults, 1);  /* do the call */\n  }\n  else  /* no continuation or no yieldable */\n    luaD_call(L, func, nresults, 0);  /* just do the call */\n  adjustresults(L, nresults);\n  lua_unlock(L);\n}\n\n\n\n/*\n** Execute a protected call.\n*/\nstruct CallS {  /* data to 'f_call' */\n  StkId func;\n  int nresults;\n};\n\n\nstatic void f_call (lua_State *L, void *ud) {\n  struct CallS *c = cast(struct CallS *, ud);\n  luaD_call(L, c->func, c->nresults, 0);\n}\n\n\n\nLUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc,\n                        lua_KContext ctx, lua_KFunction k) {\n  struct CallS c;\n  int status;\n  ptrdiff_t func;\n  lua_lock(L);\n  api_check(k == NULL || !isLua(L->ci),\n    \"cannot use continuations inside hooks\");\n  api_checknelems(L, nargs+1);\n  api_check(L->status == LUA_OK, \"cannot do calls on non-normal thread\");\n  checkresults(L, nargs, nresults);\n  if (errfunc == 0)\n    func = 0;\n  else {\n    StkId o = index2addr(L, errfunc);\n    api_checkstackindex(errfunc, o);\n    func = savestack(L, o);\n  }\n  c.func = L->top - (nargs+1);  /* function to be called */\n  if (k == NULL || L->nny > 0) {  /* no continuation or no yieldable? */\n    c.nresults = nresults;  /* do a 'conventional' protected call */\n    status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func);\n  }\n  else {  /* prepare continuation (call is already protected by 'resume') */\n    CallInfo *ci = L->ci;\n    ci->u.c.k = k;  /* save continuation */\n    ci->u.c.ctx = ctx;  /* save context */\n    /* save information for error recovery */\n    ci->extra = savestack(L, c.func);\n    ci->u.c.old_errfunc = L->errfunc;\n    L->errfunc = func;\n    setoah(ci->callstatus, L->allowhook);  /* save value of 'allowhook' */\n    ci->callstatus |= CIST_YPCALL;  /* function can do error recovery */\n    luaD_call(L, c.func, nresults, 1);  /* do the call */\n    ci->callstatus &= ~CIST_YPCALL;\n    L->errfunc = ci->u.c.old_errfunc;\n    status = LUA_OK;  /* if it is here, there were no errors */\n  }\n  adjustresults(L, nresults);\n  lua_unlock(L);\n  return status;\n}\n\n\nLUA_API int lua_load (lua_State *L, lua_Reader reader, void *data,\n                      const char *chunkname, const char *mode) {\n  ZIO z;\n  int status;\n  lua_lock(L);\n  if (!chunkname) chunkname = \"?\";\n  luaZ_init(L, &z, reader, data);\n  status = luaD_protectedparser(L, &z, chunkname, mode);\n  if (status == LUA_OK) {  /* no errors? */\n    LClosure *f = clLvalue(L->top - 1);  /* get newly created function */\n    if (f->nupvalues >= 1) {  /* does it have an upvalue? */\n      /* get global table from registry */\n      Table *reg = hvalue(&G(L)->l_registry);\n      const TValue *gt = luaH_getint(reg, LUA_RIDX_GLOBALS);\n      /* set global table as 1st upvalue of 'f' (may be LUA_ENV) */\n      setobj(L, f->upvals[0]->v, gt);\n      luaC_upvalbarrier(L, f->upvals[0]);\n    }\n  }\n  lua_unlock(L);\n  return status;\n}\n\n\nLUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data, int strip) {\n  int status;\n  TValue *o;\n  lua_lock(L);\n  api_checknelems(L, 1);\n  o = L->top - 1;\n  if (isLfunction(o))\n    status = luaU_dump(L, getproto(o), writer, data, strip);\n  else\n    status = 1;\n  lua_unlock(L);\n  return status;\n}\n\n\nLUA_API int lua_status (lua_State *L) {\n  return L->status;\n}\n\n\n/*\n** Garbage-collection function\n*/\n\nLUA_API int lua_gc (lua_State *L, int what, int data) {\n  int res = 0;\n  global_State *g;\n  lua_lock(L);\n  g = G(L);\n  switch (what) {\n    case LUA_GCSTOP: {\n      g->gcrunning = 0;\n      break;\n    }\n    case LUA_GCRESTART: {\n      luaE_setdebt(g, 0);\n      g->gcrunning = 1;\n      break;\n    }\n    case LUA_GCCOLLECT: {\n      luaC_fullgc(L, 0);\n      break;\n    }\n    case LUA_GCCOUNT: {\n      /* GC values are expressed in Kbytes: #bytes/2^10 */\n      res = cast_int(gettotalbytes(g) >> 10);\n      break;\n    }\n    case LUA_GCCOUNTB: {\n      res = cast_int(gettotalbytes(g) & 0x3ff);\n      break;\n    }\n    case LUA_GCSTEP: {\n      l_mem debt = 1;  /* =1 to signal that it did an actual step */\n      int oldrunning = g->gcrunning;\n      g->gcrunning = 1;  /* allow GC to run */\n      if (data == 0) {\n        luaE_setdebt(g, -GCSTEPSIZE);  /* to do a \"small\" step */\n        luaC_step(L);\n      }\n      else {  /* add 'data' to total debt */\n        debt = cast(l_mem, data) * 1024 + g->GCdebt;\n        luaE_setdebt(g, debt);\n        luaC_checkGC(L);\n      }\n      g->gcrunning = oldrunning;  /* restore previous state */\n      if (debt > 0 && g->gcstate == GCSpause)  /* end of cycle? */\n        res = 1;  /* signal it */\n      break;\n    }\n    case LUA_GCSETPAUSE: {\n      res = g->gcpause;\n      g->gcpause = data;\n      break;\n    }\n    case LUA_GCSETSTEPMUL: {\n      res = g->gcstepmul;\n      if (data < 40) data = 40;  /* avoid ridiculous low values (and 0) */\n      g->gcstepmul = data;\n      break;\n    }\n    case LUA_GCISRUNNING: {\n      res = g->gcrunning;\n      break;\n    }\n    default: res = -1;  /* invalid option */\n  }\n  lua_unlock(L);\n  return res;\n}\n\n\n\n/*\n** miscellaneous functions\n*/\n\n\nLUA_API int lua_error (lua_State *L) {\n  lua_lock(L);\n  api_checknelems(L, 1);\n  luaG_errormsg(L);\n  /* code unreachable; will unlock when control actually leaves the kernel */\n  return 0;  /* to avoid warnings */\n}\n\n\nLUA_API int lua_next (lua_State *L, int idx) {\n  StkId t;\n  int more;\n  lua_lock(L);\n  t = index2addr(L, idx);\n  api_check(ttistable(t), \"table expected\");\n  more = luaH_next(L, hvalue(t), L->top - 1);\n  if (more) {\n    api_incr_top(L);\n  }\n  else  /* no more elements */\n    L->top -= 1;  /* remove key */\n  lua_unlock(L);\n  return more;\n}\n\n\nLUA_API void lua_concat (lua_State *L, int n) {\n  lua_lock(L);\n  api_checknelems(L, n);\n  if (n >= 2) {\n    luaC_checkGC(L);\n    luaV_concat(L, n);\n  }\n  else if (n == 0) {  /* push empty string */\n    setsvalue2s(L, L->top, luaS_newlstr(L, \"\", 0));\n    api_incr_top(L);\n  }\n  /* else n == 1; nothing to do */\n  lua_unlock(L);\n}\n\n\nLUA_API void lua_len (lua_State *L, int idx) {\n  StkId t;\n  lua_lock(L);\n  t = index2addr(L, idx);\n  luaV_objlen(L, L->top, t);\n  api_incr_top(L);\n  lua_unlock(L);\n}\n\n\nLUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) {\n  lua_Alloc f;\n  lua_lock(L);\n  if (ud) *ud = G(L)->ud;\n  f = G(L)->frealloc;\n  lua_unlock(L);\n  return f;\n}\n\n\nLUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) {\n  lua_lock(L);\n  G(L)->ud = ud;\n  G(L)->frealloc = f;\n  lua_unlock(L);\n}\n\n\nLUA_API void *lua_newuserdata (lua_State *L, size_t size) {\n  Udata *u;\n  lua_lock(L);\n  luaC_checkGC(L);\n  u = luaS_newudata(L, size);\n  setuvalue(L, L->top, u);\n  api_incr_top(L);\n  lua_unlock(L);\n  return getudatamem(u);\n}\n\n\n\nstatic const char *aux_upvalue (StkId fi, int n, TValue **val,\n                                CClosure **owner, UpVal **uv) {\n  switch (ttype(fi)) {\n    case LUA_TCCL: {  /* C closure */\n      CClosure *f = clCvalue(fi);\n      if (!(1 <= n && n <= f->nupvalues)) return NULL;\n      *val = &f->upvalue[n-1];\n      if (owner) *owner = f;\n      return \"\";\n    }\n    case LUA_TLCL: {  /* Lua closure */\n      LClosure *f = clLvalue(fi);\n      TString *name;\n      Proto *p = f->p;\n      if (!(1 <= n && n <= p->sizeupvalues)) return NULL;\n      *val = f->upvals[n-1]->v;\n      if (uv) *uv = f->upvals[n - 1];\n      name = p->upvalues[n-1].name;\n      return (name == NULL) ? \"(*no name)\" : getstr(name);\n    }\n    default: return NULL;  /* not a closure */\n  }\n}\n\n\nLUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) {\n  const char *name;\n  TValue *val = NULL;  /* to avoid warnings */\n  lua_lock(L);\n  name = aux_upvalue(index2addr(L, funcindex), n, &val, NULL, NULL);\n  if (name) {\n    setobj2s(L, L->top, val);\n    api_incr_top(L);\n  }\n  lua_unlock(L);\n  return name;\n}\n\n\nLUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {\n  const char *name;\n  TValue *val = NULL;  /* to avoid warnings */\n  CClosure *owner = NULL;\n  UpVal *uv = NULL;\n  StkId fi;\n  lua_lock(L);\n  fi = index2addr(L, funcindex);\n  api_checknelems(L, 1);\n  name = aux_upvalue(fi, n, &val, &owner, &uv);\n  if (name) {\n    L->top--;\n    setobj(L, val, L->top);\n    if (owner) { luaC_barrier(L, owner, L->top); }\n    else if (uv) { luaC_upvalbarrier(L, uv); }\n  }\n  lua_unlock(L);\n  return name;\n}\n\n\nstatic UpVal **getupvalref (lua_State *L, int fidx, int n, LClosure **pf) {\n  LClosure *f;\n  StkId fi = index2addr(L, fidx);\n  api_check(ttisLclosure(fi), \"Lua function expected\");\n  f = clLvalue(fi);\n  api_check((1 <= n && n <= f->p->sizeupvalues), \"invalid upvalue index\");\n  if (pf) *pf = f;\n  return &f->upvals[n - 1];  /* get its upvalue pointer */\n}\n\n\nLUA_API void *lua_upvalueid (lua_State *L, int fidx, int n) {\n  StkId fi = index2addr(L, fidx);\n  switch (ttype(fi)) {\n    case LUA_TLCL: {  /* lua closure */\n      return *getupvalref(L, fidx, n, NULL);\n    }\n    case LUA_TCCL: {  /* C closure */\n      CClosure *f = clCvalue(fi);\n      api_check(1 <= n && n <= f->nupvalues, \"invalid upvalue index\");\n      return &f->upvalue[n - 1];\n    }\n    default: {\n      api_check(0, \"closure expected\");\n      return NULL;\n    }\n  }\n}\n\n\nLUA_API void lua_upvaluejoin (lua_State *L, int fidx1, int n1,\n                                            int fidx2, int n2) {\n  LClosure *f1;\n  UpVal **up1 = getupvalref(L, fidx1, n1, &f1);\n  UpVal **up2 = getupvalref(L, fidx2, n2, NULL);\n  luaC_upvdeccount(L, *up1);\n  *up1 = *up2;\n  (*up1)->refcount++;\n  if (upisopen(*up1)) (*up1)->u.open.touched = 1;\n  luaC_upvalbarrier(L, *up1);\n}\n\n\n"
  },
  {
    "path": "externals/lua/src/lapi.h",
    "content": "/*\n** $Id: lapi.h,v 2.8 2014/07/15 21:26:50 roberto Exp $\n** Auxiliary functions from Lua API\n** See Copyright Notice in lua.h\n*/\n\n#ifndef lapi_h\n#define lapi_h\n\n\n#include \"llimits.h\"\n#include \"lstate.h\"\n\n#define api_incr_top(L)   {L->top++; api_check(L->top <= L->ci->top, \\\n\t\t\t\t\"stack overflow\");}\n\n#define adjustresults(L,nres) \\\n    { if ((nres) == LUA_MULTRET && L->ci->top < L->top) L->ci->top = L->top; }\n\n#define api_checknelems(L,n)\tapi_check((n) < (L->top - L->ci->func), \\\n\t\t\t\t  \"not enough elements in the stack\")\n\n\n#endif\n"
  },
  {
    "path": "externals/lua/src/lauxlib.c",
    "content": "/*\n** $Id: lauxlib.c,v 1.279 2014/12/14 18:32:26 roberto Exp $\n** Auxiliary functions for building Lua libraries\n** See Copyright Notice in lua.h\n*/\n\n#define lauxlib_c\n#define LUA_LIB\n\n#include \"lprefix.h\"\n\n\n#include <errno.h>\n#include <stdarg.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n\n/* This file uses only the official API of Lua.\n** Any function declared here could be written as an application function.\n*/\n\n#include \"lua.h\"\n\n#include \"lauxlib.h\"\n\n\n/*\n** {======================================================\n** Traceback\n** =======================================================\n*/\n\n\n#define LEVELS1\t12\t/* size of the first part of the stack */\n#define LEVELS2\t10\t/* size of the second part of the stack */\n\n\n\n/*\n** search for 'objidx' in table at index -1.\n** return 1 + string at top if find a good name.\n*/\nstatic int findfield (lua_State *L, int objidx, int level) {\n  if (level == 0 || !lua_istable(L, -1))\n    return 0;  /* not found */\n  lua_pushnil(L);  /* start 'next' loop */\n  while (lua_next(L, -2)) {  /* for each pair in table */\n    if (lua_type(L, -2) == LUA_TSTRING) {  /* ignore non-string keys */\n      if (lua_rawequal(L, objidx, -1)) {  /* found object? */\n        lua_pop(L, 1);  /* remove value (but keep name) */\n        return 1;\n      }\n      else if (findfield(L, objidx, level - 1)) {  /* try recursively */\n        lua_remove(L, -2);  /* remove table (but keep name) */\n        lua_pushliteral(L, \".\");\n        lua_insert(L, -2);  /* place '.' between the two names */\n        lua_concat(L, 3);\n        return 1;\n      }\n    }\n    lua_pop(L, 1);  /* remove value */\n  }\n  return 0;  /* not found */\n}\n\n\n/*\n** Search for a name for a function in all loaded modules\n** (registry._LOADED).\n*/\nstatic int pushglobalfuncname (lua_State *L, lua_Debug *ar) {\n  int top = lua_gettop(L);\n  lua_getinfo(L, \"f\", ar);  /* push function */\n  lua_getfield(L, LUA_REGISTRYINDEX, \"_LOADED\");\n  if (findfield(L, top + 1, 2)) {\n    const char *name = lua_tostring(L, -1);\n    if (strncmp(name, \"_G.\", 3) == 0) {  /* name start with '_G.'? */\n      lua_pushstring(L, name + 3);  /* push name without prefix */\n      lua_remove(L, -2);  /* remove original name */\n    }\n    lua_copy(L, -1, top + 1);  /* move name to proper place */\n    lua_pop(L, 2);  /* remove pushed values */\n    return 1;\n  }\n  else {\n    lua_settop(L, top);  /* remove function and global table */\n    return 0;\n  }\n}\n\n\nstatic void pushfuncname (lua_State *L, lua_Debug *ar) {\n  if (pushglobalfuncname(L, ar)) {  /* try first a global name */\n    lua_pushfstring(L, \"function '%s'\", lua_tostring(L, -1));\n    lua_remove(L, -2);  /* remove name */\n  }\n  else if (*ar->namewhat != '\\0')  /* is there a name from code? */\n    lua_pushfstring(L, \"%s '%s'\", ar->namewhat, ar->name);  /* use it */\n  else if (*ar->what == 'm')  /* main? */\n      lua_pushliteral(L, \"main chunk\");\n  else if (*ar->what != 'C')  /* for Lua functions, use <file:line> */\n    lua_pushfstring(L, \"function <%s:%d>\", ar->short_src, ar->linedefined);\n  else  /* nothing left... */\n    lua_pushliteral(L, \"?\");\n}\n\n\nstatic int countlevels (lua_State *L) {\n  lua_Debug ar;\n  int li = 1, le = 1;\n  /* find an upper bound */\n  while (lua_getstack(L, le, &ar)) { li = le; le *= 2; }\n  /* do a binary search */\n  while (li < le) {\n    int m = (li + le)/2;\n    if (lua_getstack(L, m, &ar)) li = m + 1;\n    else le = m;\n  }\n  return le - 1;\n}\n\n\nLUALIB_API void luaL_traceback (lua_State *L, lua_State *L1,\n                                const char *msg, int level) {\n  lua_Debug ar;\n  int top = lua_gettop(L);\n  int numlevels = countlevels(L1);\n  int mark = (numlevels > LEVELS1 + LEVELS2) ? LEVELS1 : 0;\n  if (msg) lua_pushfstring(L, \"%s\\n\", msg);\n  lua_pushliteral(L, \"stack traceback:\");\n  while (lua_getstack(L1, level++, &ar)) {\n    if (level == mark) {  /* too many levels? */\n      lua_pushliteral(L, \"\\n\\t...\");  /* add a '...' */\n      level = numlevels - LEVELS2;  /* and skip to last ones */\n    }\n    else {\n      lua_getinfo(L1, \"Slnt\", &ar);\n      lua_pushfstring(L, \"\\n\\t%s:\", ar.short_src);\n      if (ar.currentline > 0)\n        lua_pushfstring(L, \"%d:\", ar.currentline);\n      lua_pushliteral(L, \" in \");\n      pushfuncname(L, &ar);\n      if (ar.istailcall)\n        lua_pushliteral(L, \"\\n\\t(...tail calls...)\");\n      lua_concat(L, lua_gettop(L) - top);\n    }\n  }\n  lua_concat(L, lua_gettop(L) - top);\n}\n\n/* }====================================================== */\n\n\n/*\n** {======================================================\n** Error-report functions\n** =======================================================\n*/\n\nLUALIB_API int luaL_argerror (lua_State *L, int arg, const char *extramsg) {\n  lua_Debug ar;\n  if (!lua_getstack(L, 0, &ar))  /* no stack frame? */\n    return luaL_error(L, \"bad argument #%d (%s)\", arg, extramsg);\n  lua_getinfo(L, \"n\", &ar);\n  if (strcmp(ar.namewhat, \"method\") == 0) {\n    arg--;  /* do not count 'self' */\n    if (arg == 0)  /* error is in the self argument itself? */\n      return luaL_error(L, \"calling '%s' on bad self (%s)\",\n                           ar.name, extramsg);\n  }\n  if (ar.name == NULL)\n    ar.name = (pushglobalfuncname(L, &ar)) ? lua_tostring(L, -1) : \"?\";\n  return luaL_error(L, \"bad argument #%d to '%s' (%s)\",\n                        arg, ar.name, extramsg);\n}\n\n\nstatic int typeerror (lua_State *L, int arg, const char *tname) {\n  const char *msg;\n  const char *typearg;  /* name for the type of the actual argument */\n  if (luaL_getmetafield(L, arg, \"__name\") == LUA_TSTRING)\n    typearg = lua_tostring(L, -1);  /* use the given type name */\n  else if (lua_type(L, arg) == LUA_TLIGHTUSERDATA)\n    typearg = \"light userdata\";  /* special name for messages */\n  else\n    typearg = luaL_typename(L, arg);  /* standard name */\n  msg = lua_pushfstring(L, \"%s expected, got %s\", tname, typearg);\n  return luaL_argerror(L, arg, msg);\n}\n\n\nstatic void tag_error (lua_State *L, int arg, int tag) {\n  typeerror(L, arg, lua_typename(L, tag));\n}\n\n\nLUALIB_API void luaL_where (lua_State *L, int level) {\n  lua_Debug ar;\n  if (lua_getstack(L, level, &ar)) {  /* check function at level */\n    lua_getinfo(L, \"Sl\", &ar);  /* get info about it */\n    if (ar.currentline > 0) {  /* is there info? */\n      lua_pushfstring(L, \"%s:%d: \", ar.short_src, ar.currentline);\n      return;\n    }\n  }\n  lua_pushliteral(L, \"\");  /* else, no information available... */\n}\n\n\nLUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) {\n  va_list argp;\n  va_start(argp, fmt);\n  luaL_where(L, 1);\n  lua_pushvfstring(L, fmt, argp);\n  va_end(argp);\n  lua_concat(L, 2);\n  return lua_error(L);\n}\n\n\nLUALIB_API int luaL_fileresult (lua_State *L, int stat, const char *fname) {\n  int en = errno;  /* calls to Lua API may change this value */\n  if (stat) {\n    lua_pushboolean(L, 1);\n    return 1;\n  }\n  else {\n    lua_pushnil(L);\n    if (fname)\n      lua_pushfstring(L, \"%s: %s\", fname, strerror(en));\n    else\n      lua_pushstring(L, strerror(en));\n    lua_pushinteger(L, en);\n    return 3;\n  }\n}\n\n\n#if !defined(l_inspectstat)\t/* { */\n\n#if defined(LUA_USE_POSIX)\n\n#include <sys/wait.h>\n\n/*\n** use appropriate macros to interpret 'pclose' return status\n*/\n#define l_inspectstat(stat,what)  \\\n   if (WIFEXITED(stat)) { stat = WEXITSTATUS(stat); } \\\n   else if (WIFSIGNALED(stat)) { stat = WTERMSIG(stat); what = \"signal\"; }\n\n#else\n\n#define l_inspectstat(stat,what)  /* no op */\n\n#endif\n\n#endif\t\t\t\t/* } */\n\n\nLUALIB_API int luaL_execresult (lua_State *L, int stat) {\n  const char *what = \"exit\";  /* type of termination */\n  if (stat == -1)  /* error? */\n    return luaL_fileresult(L, 0, NULL);\n  else {\n    l_inspectstat(stat, what);  /* interpret result */\n    if (*what == 'e' && stat == 0)  /* successful termination? */\n      lua_pushboolean(L, 1);\n    else\n      lua_pushnil(L);\n    lua_pushstring(L, what);\n    lua_pushinteger(L, stat);\n    return 3;  /* return true/nil,what,code */\n  }\n}\n\n/* }====================================================== */\n\n\n/*\n** {======================================================\n** Userdata's metatable manipulation\n** =======================================================\n*/\n\nLUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) {\n  if (luaL_getmetatable(L, tname))  /* name already in use? */\n    return 0;  /* leave previous value on top, but return 0 */\n  lua_pop(L, 1);\n  lua_newtable(L);  /* create metatable */\n  lua_pushstring(L, tname);\n  lua_setfield(L, -2, \"__name\");  /* metatable.__name = tname */\n  lua_pushvalue(L, -1);\n  lua_setfield(L, LUA_REGISTRYINDEX, tname);  /* registry.name = metatable */\n  return 1;\n}\n\n\nLUALIB_API void luaL_setmetatable (lua_State *L, const char *tname) {\n  luaL_getmetatable(L, tname);\n  lua_setmetatable(L, -2);\n}\n\n\nLUALIB_API void *luaL_testudata (lua_State *L, int ud, const char *tname) {\n  void *p = lua_touserdata(L, ud);\n  if (p != NULL) {  /* value is a userdata? */\n    if (lua_getmetatable(L, ud)) {  /* does it have a metatable? */\n      luaL_getmetatable(L, tname);  /* get correct metatable */\n      if (!lua_rawequal(L, -1, -2))  /* not the same? */\n        p = NULL;  /* value is a userdata with wrong metatable */\n      lua_pop(L, 2);  /* remove both metatables */\n      return p;\n    }\n  }\n  return NULL;  /* value is not a userdata with a metatable */\n}\n\n\nLUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) {\n  void *p = luaL_testudata(L, ud, tname);\n  if (p == NULL) typeerror(L, ud, tname);\n  return p;\n}\n\n/* }====================================================== */\n\n\n/*\n** {======================================================\n** Argument check functions\n** =======================================================\n*/\n\nLUALIB_API int luaL_checkoption (lua_State *L, int arg, const char *def,\n                                 const char *const lst[]) {\n  const char *name = (def) ? luaL_optstring(L, arg, def) :\n                             luaL_checkstring(L, arg);\n  int i;\n  for (i=0; lst[i]; i++)\n    if (strcmp(lst[i], name) == 0)\n      return i;\n  return luaL_argerror(L, arg,\n                       lua_pushfstring(L, \"invalid option '%s'\", name));\n}\n\n\nLUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg) {\n  /* keep some extra space to run error routines, if needed */\n  const int extra = LUA_MINSTACK;\n  if (!lua_checkstack(L, space + extra)) {\n    if (msg)\n      luaL_error(L, \"stack overflow (%s)\", msg);\n    else\n      luaL_error(L, \"stack overflow\");\n  }\n}\n\n\nLUALIB_API void luaL_checktype (lua_State *L, int arg, int t) {\n  if (lua_type(L, arg) != t)\n    tag_error(L, arg, t);\n}\n\n\nLUALIB_API void luaL_checkany (lua_State *L, int arg) {\n  if (lua_type(L, arg) == LUA_TNONE)\n    luaL_argerror(L, arg, \"value expected\");\n}\n\n\nLUALIB_API const char *luaL_checklstring (lua_State *L, int arg, size_t *len) {\n  const char *s = lua_tolstring(L, arg, len);\n  if (!s) tag_error(L, arg, LUA_TSTRING);\n  return s;\n}\n\n\nLUALIB_API const char *luaL_optlstring (lua_State *L, int arg,\n                                        const char *def, size_t *len) {\n  if (lua_isnoneornil(L, arg)) {\n    if (len)\n      *len = (def ? strlen(def) : 0);\n    return def;\n  }\n  else return luaL_checklstring(L, arg, len);\n}\n\n\nLUALIB_API lua_Number luaL_checknumber (lua_State *L, int arg) {\n  int isnum;\n  lua_Number d = lua_tonumberx(L, arg, &isnum);\n  if (!isnum)\n    tag_error(L, arg, LUA_TNUMBER);\n  return d;\n}\n\n\nLUALIB_API lua_Number luaL_optnumber (lua_State *L, int arg, lua_Number def) {\n  return luaL_opt(L, luaL_checknumber, arg, def);\n}\n\n\nstatic void interror (lua_State *L, int arg) {\n  if (lua_isnumber(L, arg))\n    luaL_argerror(L, arg, \"number has no integer representation\");\n  else\n    tag_error(L, arg, LUA_TNUMBER);\n}\n\n\nLUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int arg) {\n  int isnum;\n  lua_Integer d = lua_tointegerx(L, arg, &isnum);\n  if (!isnum) {\n    interror(L, arg);\n  }\n  return d;\n}\n\n\nLUALIB_API lua_Integer luaL_optinteger (lua_State *L, int arg,\n                                                      lua_Integer def) {\n  return luaL_opt(L, luaL_checkinteger, arg, def);\n}\n\n/* }====================================================== */\n\n\n/*\n** {======================================================\n** Generic Buffer manipulation\n** =======================================================\n*/\n\n/*\n** check whether buffer is using a userdata on the stack as a temporary\n** buffer\n*/\n#define buffonstack(B)\t((B)->b != (B)->initb)\n\n\n/*\n** returns a pointer to a free area with at least 'sz' bytes\n*/\nLUALIB_API char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz) {\n  lua_State *L = B->L;\n  if (B->size - B->n < sz) {  /* not enough space? */\n    char *newbuff;\n    size_t newsize = B->size * 2;  /* double buffer size */\n    if (newsize - B->n < sz)  /* not big enough? */\n      newsize = B->n + sz;\n    if (newsize < B->n || newsize - B->n < sz)\n      luaL_error(L, \"buffer too large\");\n    /* create larger buffer */\n    newbuff = (char *)lua_newuserdata(L, newsize * sizeof(char));\n    /* move content to new buffer */\n    memcpy(newbuff, B->b, B->n * sizeof(char));\n    if (buffonstack(B))\n      lua_remove(L, -2);  /* remove old buffer */\n    B->b = newbuff;\n    B->size = newsize;\n  }\n  return &B->b[B->n];\n}\n\n\nLUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) {\n  char *b = luaL_prepbuffsize(B, l);\n  memcpy(b, s, l * sizeof(char));\n  luaL_addsize(B, l);\n}\n\n\nLUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) {\n  luaL_addlstring(B, s, strlen(s));\n}\n\n\nLUALIB_API void luaL_pushresult (luaL_Buffer *B) {\n  lua_State *L = B->L;\n  lua_pushlstring(L, B->b, B->n);\n  if (buffonstack(B))\n    lua_remove(L, -2);  /* remove old buffer */\n}\n\n\nLUALIB_API void luaL_pushresultsize (luaL_Buffer *B, size_t sz) {\n  luaL_addsize(B, sz);\n  luaL_pushresult(B);\n}\n\n\nLUALIB_API void luaL_addvalue (luaL_Buffer *B) {\n  lua_State *L = B->L;\n  size_t l;\n  const char *s = lua_tolstring(L, -1, &l);\n  if (buffonstack(B))\n    lua_insert(L, -2);  /* put value below buffer */\n  luaL_addlstring(B, s, l);\n  lua_remove(L, (buffonstack(B)) ? -2 : -1);  /* remove value */\n}\n\n\nLUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) {\n  B->L = L;\n  B->b = B->initb;\n  B->n = 0;\n  B->size = LUAL_BUFFERSIZE;\n}\n\n\nLUALIB_API char *luaL_buffinitsize (lua_State *L, luaL_Buffer *B, size_t sz) {\n  luaL_buffinit(L, B);\n  return luaL_prepbuffsize(B, sz);\n}\n\n/* }====================================================== */\n\n\n/*\n** {======================================================\n** Reference system\n** =======================================================\n*/\n\n/* index of free-list header */\n#define freelist\t0\n\n\nLUALIB_API int luaL_ref (lua_State *L, int t) {\n  int ref;\n  if (lua_isnil(L, -1)) {\n    lua_pop(L, 1);  /* remove from stack */\n    return LUA_REFNIL;  /* 'nil' has a unique fixed reference */\n  }\n  t = lua_absindex(L, t);\n  lua_rawgeti(L, t, freelist);  /* get first free element */\n  ref = (int)lua_tointeger(L, -1);  /* ref = t[freelist] */\n  lua_pop(L, 1);  /* remove it from stack */\n  if (ref != 0) {  /* any free element? */\n    lua_rawgeti(L, t, ref);  /* remove it from list */\n    lua_rawseti(L, t, freelist);  /* (t[freelist] = t[ref]) */\n  }\n  else  /* no free elements */\n    ref = (int)lua_rawlen(L, t) + 1;  /* get a new reference */\n  lua_rawseti(L, t, ref);\n  return ref;\n}\n\n\nLUALIB_API void luaL_unref (lua_State *L, int t, int ref) {\n  if (ref >= 0) {\n    t = lua_absindex(L, t);\n    lua_rawgeti(L, t, freelist);\n    lua_rawseti(L, t, ref);  /* t[ref] = t[freelist] */\n    lua_pushinteger(L, ref);\n    lua_rawseti(L, t, freelist);  /* t[freelist] = ref */\n  }\n}\n\n/* }====================================================== */\n\n\n/*\n** {======================================================\n** Load functions\n** =======================================================\n*/\n\ntypedef struct LoadF {\n  int n;  /* number of pre-read characters */\n  FILE *f;  /* file being read */\n  char buff[BUFSIZ];  /* area for reading file */\n} LoadF;\n\n\nstatic const char *getF (lua_State *L, void *ud, size_t *size) {\n  LoadF *lf = (LoadF *)ud;\n  (void)L;  /* not used */\n  if (lf->n > 0) {  /* are there pre-read characters to be read? */\n    *size = lf->n;  /* return them (chars already in buffer) */\n    lf->n = 0;  /* no more pre-read characters */\n  }\n  else {  /* read a block from file */\n    /* 'fread' can return > 0 *and* set the EOF flag. If next call to\n       'getF' called 'fread', it might still wait for user input.\n       The next check avoids this problem. */\n    if (feof(lf->f)) return NULL;\n    *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f);  /* read block */\n  }\n  return lf->buff;\n}\n\n\nstatic int errfile (lua_State *L, const char *what, int fnameindex) {\n  const char *serr = strerror(errno);\n  const char *filename = lua_tostring(L, fnameindex) + 1;\n  lua_pushfstring(L, \"cannot %s %s: %s\", what, filename, serr);\n  lua_remove(L, fnameindex);\n  return LUA_ERRFILE;\n}\n\n\nstatic int skipBOM (LoadF *lf) {\n  const char *p = \"\\xEF\\xBB\\xBF\";  /* Utf8 BOM mark */\n  int c;\n  lf->n = 0;\n  do {\n    c = getc(lf->f);\n    if (c == EOF || c != *(const unsigned char *)p++) return c;\n    lf->buff[lf->n++] = c;  /* to be read by the parser */\n  } while (*p != '\\0');\n  lf->n = 0;  /* prefix matched; discard it */\n  return getc(lf->f);  /* return next character */\n}\n\n\n/*\n** reads the first character of file 'f' and skips an optional BOM mark\n** in its beginning plus its first line if it starts with '#'. Returns\n** true if it skipped the first line.  In any case, '*cp' has the\n** first \"valid\" character of the file (after the optional BOM and\n** a first-line comment).\n*/\nstatic int skipcomment (LoadF *lf, int *cp) {\n  int c = *cp = skipBOM(lf);\n  if (c == '#') {  /* first line is a comment (Unix exec. file)? */\n    do {  /* skip first line */\n      c = getc(lf->f);\n    } while (c != EOF && c != '\\n') ;\n    *cp = getc(lf->f);  /* skip end-of-line, if present */\n    return 1;  /* there was a comment */\n  }\n  else return 0;  /* no comment */\n}\n\n\nLUALIB_API int luaL_loadfilex (lua_State *L, const char *filename,\n                                             const char *mode) {\n  LoadF lf;\n  int status, readstatus;\n  int c;\n  int fnameindex = lua_gettop(L) + 1;  /* index of filename on the stack */\n  if (filename == NULL) {\n    lua_pushliteral(L, \"=stdin\");\n    lf.f = stdin;\n  }\n  else {\n    lua_pushfstring(L, \"@%s\", filename);\n    lf.f = fopen(filename, \"r\");\n    if (lf.f == NULL) return errfile(L, \"open\", fnameindex);\n  }\n  if (skipcomment(&lf, &c))  /* read initial portion */\n    lf.buff[lf.n++] = '\\n';  /* add line to correct line numbers */\n  if (c == LUA_SIGNATURE[0] && filename) {  /* binary file? */\n    lf.f = freopen(filename, \"rb\", lf.f);  /* reopen in binary mode */\n    if (lf.f == NULL) return errfile(L, \"reopen\", fnameindex);\n    skipcomment(&lf, &c);  /* re-read initial portion */\n  }\n  if (c != EOF)\n    lf.buff[lf.n++] = c;  /* 'c' is the first character of the stream */\n  status = lua_load(L, getF, &lf, lua_tostring(L, -1), mode);\n  readstatus = ferror(lf.f);\n  if (filename) fclose(lf.f);  /* close file (even in case of errors) */\n  if (readstatus) {\n    lua_settop(L, fnameindex);  /* ignore results from 'lua_load' */\n    return errfile(L, \"read\", fnameindex);\n  }\n  lua_remove(L, fnameindex);\n  return status;\n}\n\n\ntypedef struct LoadS {\n  const char *s;\n  size_t size;\n} LoadS;\n\n\nstatic const char *getS (lua_State *L, void *ud, size_t *size) {\n  LoadS *ls = (LoadS *)ud;\n  (void)L;  /* not used */\n  if (ls->size == 0) return NULL;\n  *size = ls->size;\n  ls->size = 0;\n  return ls->s;\n}\n\n\nLUALIB_API int luaL_loadbufferx (lua_State *L, const char *buff, size_t size,\n                                 const char *name, const char *mode) {\n  LoadS ls;\n  ls.s = buff;\n  ls.size = size;\n  return lua_load(L, getS, &ls, name, mode);\n}\n\n\nLUALIB_API int luaL_loadstring (lua_State *L, const char *s) {\n  return luaL_loadbuffer(L, s, strlen(s), s);\n}\n\n/* }====================================================== */\n\n\n\nLUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) {\n  if (!lua_getmetatable(L, obj))  /* no metatable? */\n    return LUA_TNIL;\n  else {\n    int tt;\n    lua_pushstring(L, event);\n    tt = lua_rawget(L, -2);\n    if (tt == LUA_TNIL)  /* is metafield nil? */\n      lua_pop(L, 2);  /* remove metatable and metafield */\n    else\n      lua_remove(L, -2);  /* remove only metatable */\n    return tt;  /* return metafield type */\n  }\n}\n\n\nLUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) {\n  obj = lua_absindex(L, obj);\n  if (luaL_getmetafield(L, obj, event) == LUA_TNIL)  /* no metafield? */\n    return 0;\n  lua_pushvalue(L, obj);\n  lua_call(L, 1, 1);\n  return 1;\n}\n\n\nLUALIB_API lua_Integer luaL_len (lua_State *L, int idx) {\n  lua_Integer l;\n  int isnum;\n  lua_len(L, idx);\n  l = lua_tointegerx(L, -1, &isnum);\n  if (!isnum)\n    luaL_error(L, \"object length is not an integer\");\n  lua_pop(L, 1);  /* remove object */\n  return l;\n}\n\n\nLUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) {\n  if (!luaL_callmeta(L, idx, \"__tostring\")) {  /* no metafield? */\n    switch (lua_type(L, idx)) {\n      case LUA_TNUMBER: {\n        if (lua_isinteger(L, idx))\n          lua_pushfstring(L, \"%I\", lua_tointeger(L, idx));\n        else\n          lua_pushfstring(L, \"%f\", lua_tonumber(L, idx));\n        break;\n      }\n      case LUA_TSTRING:\n        lua_pushvalue(L, idx);\n        break;\n      case LUA_TBOOLEAN:\n        lua_pushstring(L, (lua_toboolean(L, idx) ? \"true\" : \"false\"));\n        break;\n      case LUA_TNIL:\n        lua_pushliteral(L, \"nil\");\n        break;\n      default:\n        lua_pushfstring(L, \"%s: %p\", luaL_typename(L, idx),\n                                            lua_topointer(L, idx));\n        break;\n    }\n  }\n  return lua_tolstring(L, -1, len);\n}\n\n\n/*\n** {======================================================\n** Compatibility with 5.1 module functions\n** =======================================================\n*/\n#if defined(LUA_COMPAT_MODULE)\n\nstatic const char *luaL_findtable (lua_State *L, int idx,\n                                   const char *fname, int szhint) {\n  const char *e;\n  if (idx) lua_pushvalue(L, idx);\n  do {\n    e = strchr(fname, '.');\n    if (e == NULL) e = fname + strlen(fname);\n    lua_pushlstring(L, fname, e - fname);\n    if (lua_rawget(L, -2) == LUA_TNIL) {  /* no such field? */\n      lua_pop(L, 1);  /* remove this nil */\n      lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */\n      lua_pushlstring(L, fname, e - fname);\n      lua_pushvalue(L, -2);\n      lua_settable(L, -4);  /* set new table into field */\n    }\n    else if (!lua_istable(L, -1)) {  /* field has a non-table value? */\n      lua_pop(L, 2);  /* remove table and value */\n      return fname;  /* return problematic part of the name */\n    }\n    lua_remove(L, -2);  /* remove previous table */\n    fname = e + 1;\n  } while (*e == '.');\n  return NULL;\n}\n\n\n/*\n** Count number of elements in a luaL_Reg list.\n*/\nstatic int libsize (const luaL_Reg *l) {\n  int size = 0;\n  for (; l && l->name; l++) size++;\n  return size;\n}\n\n\n/*\n** Find or create a module table with a given name. The function\n** first looks at the _LOADED table and, if that fails, try a\n** global variable with that name. In any case, leaves on the stack\n** the module table.\n*/\nLUALIB_API void luaL_pushmodule (lua_State *L, const char *modname,\n                                 int sizehint) {\n  luaL_findtable(L, LUA_REGISTRYINDEX, \"_LOADED\", 1);  /* get _LOADED table */\n  if (lua_getfield(L, -1, modname) != LUA_TTABLE) {  /* no _LOADED[modname]? */\n    lua_pop(L, 1);  /* remove previous result */\n    /* try global variable (and create one if it does not exist) */\n    lua_pushglobaltable(L);\n    if (luaL_findtable(L, 0, modname, sizehint) != NULL)\n      luaL_error(L, \"name conflict for module '%s'\", modname);\n    lua_pushvalue(L, -1);\n    lua_setfield(L, -3, modname);  /* _LOADED[modname] = new table */\n  }\n  lua_remove(L, -2);  /* remove _LOADED table */\n}\n\n\nLUALIB_API void luaL_openlib (lua_State *L, const char *libname,\n                               const luaL_Reg *l, int nup) {\n  luaL_checkversion(L);\n  if (libname) {\n    luaL_pushmodule(L, libname, libsize(l));  /* get/create library table */\n    lua_insert(L, -(nup + 1));  /* move library table to below upvalues */\n  }\n  if (l)\n    luaL_setfuncs(L, l, nup);\n  else\n    lua_pop(L, nup);  /* remove upvalues */\n}\n\n#endif\n/* }====================================================== */\n\n/*\n** set functions from list 'l' into table at top - 'nup'; each\n** function gets the 'nup' elements at the top as upvalues.\n** Returns with only the table at the stack.\n*/\nLUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) {\n  luaL_checkstack(L, nup, \"too many upvalues\");\n  for (; l->name != NULL; l++) {  /* fill the table with given functions */\n    int i;\n    for (i = 0; i < nup; i++)  /* copy upvalues to the top */\n      lua_pushvalue(L, -nup);\n    lua_pushcclosure(L, l->func, nup);  /* closure with those upvalues */\n    lua_setfield(L, -(nup + 2), l->name);\n  }\n  lua_pop(L, nup);  /* remove upvalues */\n}\n\n\n/*\n** ensure that stack[idx][fname] has a table and push that table\n** into the stack\n*/\nLUALIB_API int luaL_getsubtable (lua_State *L, int idx, const char *fname) {\n  if (lua_getfield(L, idx, fname) == LUA_TTABLE)\n    return 1;  /* table already there */\n  else {\n    lua_pop(L, 1);  /* remove previous result */\n    idx = lua_absindex(L, idx);\n    lua_newtable(L);\n    lua_pushvalue(L, -1);  /* copy to be left at top */\n    lua_setfield(L, idx, fname);  /* assign new table to field */\n    return 0;  /* false, because did not find table there */\n  }\n}\n\n\n/*\n** Stripped-down 'require': After checking \"loaded\" table, calls 'openf'\n** to open a module, registers the result in 'package.loaded' table and,\n** if 'glb' is true, also registers the result in the global table.\n** Leaves resulting module on the top.\n*/\nLUALIB_API void luaL_requiref (lua_State *L, const char *modname,\n                               lua_CFunction openf, int glb) {\n  luaL_getsubtable(L, LUA_REGISTRYINDEX, \"_LOADED\");\n  lua_getfield(L, -1, modname);  /* _LOADED[modname] */\n  if (!lua_toboolean(L, -1)) {  /* package not already loaded? */\n    lua_pop(L, 1);  /* remove field */\n    lua_pushcfunction(L, openf);\n    lua_pushstring(L, modname);  /* argument to open function */\n    lua_call(L, 1, 1);  /* call 'openf' to open module */\n    lua_pushvalue(L, -1);  /* make copy of module (call result) */\n    lua_setfield(L, -3, modname);  /* _LOADED[modname] = module */\n  }\n  lua_remove(L, -2);  /* remove _LOADED table */\n  if (glb) {\n    lua_pushvalue(L, -1);  /* copy of module */\n    lua_setglobal(L, modname);  /* _G[modname] = module */\n  }\n}\n\n\nLUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const char *p,\n                                                               const char *r) {\n  const char *wild;\n  size_t l = strlen(p);\n  luaL_Buffer b;\n  luaL_buffinit(L, &b);\n  while ((wild = strstr(s, p)) != NULL) {\n    luaL_addlstring(&b, s, wild - s);  /* push prefix */\n    luaL_addstring(&b, r);  /* push replacement in place of pattern */\n    s = wild + l;  /* continue after 'p' */\n  }\n  luaL_addstring(&b, s);  /* push last suffix */\n  luaL_pushresult(&b);\n  return lua_tostring(L, -1);\n}\n\n\nstatic void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {\n  (void)ud; (void)osize;  /* not used */\n  if (nsize == 0) {\n    free(ptr);\n    return NULL;\n  }\n  else\n    return realloc(ptr, nsize);\n}\n\n\nstatic int panic (lua_State *L) {\n  lua_writestringerror(\"PANIC: unprotected error in call to Lua API (%s)\\n\",\n                        lua_tostring(L, -1));\n  return 0;  /* return to Lua to abort */\n}\n\n\nLUALIB_API lua_State *luaL_newstate (void) {\n  lua_State *L = lua_newstate(l_alloc, NULL);\n  if (L) lua_atpanic(L, &panic);\n  return L;\n}\n\n\nLUALIB_API void luaL_checkversion_ (lua_State *L, lua_Number ver, size_t sz) {\n  const lua_Number *v = lua_version(L);\n  if (sz != LUAL_NUMSIZES)  /* check numeric types */\n    luaL_error(L, \"core and library have incompatible numeric types\");\n  if (v != lua_version(NULL))\n    luaL_error(L, \"multiple Lua VMs detected\");\n  else if (*v != ver)\n    luaL_error(L, \"version mismatch: app. needs %f, Lua core provides %f\",\n                  ver, *v);\n}\n\n"
  },
  {
    "path": "externals/lua/src/lauxlib.h",
    "content": "/*\n** $Id: lauxlib.h,v 1.128 2014/10/29 16:11:17 roberto Exp $\n** Auxiliary functions for building Lua libraries\n** See Copyright Notice in lua.h\n*/\n\n\n#ifndef lauxlib_h\n#define lauxlib_h\n\n\n#include <stddef.h>\n#include <stdio.h>\n\n#include \"lua.h\"\n\n\n\n/* extra error code for 'luaL_load' */\n#define LUA_ERRFILE     (LUA_ERRERR+1)\n\n\ntypedef struct luaL_Reg {\n  const char *name;\n  lua_CFunction func;\n} luaL_Reg;\n\n\n#define LUAL_NUMSIZES\t(sizeof(lua_Integer)*16 + sizeof(lua_Number))\n\nLUALIB_API void (luaL_checkversion_) (lua_State *L, lua_Number ver, size_t sz);\n#define luaL_checkversion(L)  \\\n\t  luaL_checkversion_(L, LUA_VERSION_NUM, LUAL_NUMSIZES)\n\nLUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e);\nLUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e);\nLUALIB_API const char *(luaL_tolstring) (lua_State *L, int idx, size_t *len);\nLUALIB_API int (luaL_argerror) (lua_State *L, int arg, const char *extramsg);\nLUALIB_API const char *(luaL_checklstring) (lua_State *L, int arg,\n                                                          size_t *l);\nLUALIB_API const char *(luaL_optlstring) (lua_State *L, int arg,\n                                          const char *def, size_t *l);\nLUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int arg);\nLUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int arg, lua_Number def);\n\nLUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int arg);\nLUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int arg,\n                                          lua_Integer def);\n\nLUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg);\nLUALIB_API void (luaL_checktype) (lua_State *L, int arg, int t);\nLUALIB_API void (luaL_checkany) (lua_State *L, int arg);\n\nLUALIB_API int   (luaL_newmetatable) (lua_State *L, const char *tname);\nLUALIB_API void  (luaL_setmetatable) (lua_State *L, const char *tname);\nLUALIB_API void *(luaL_testudata) (lua_State *L, int ud, const char *tname);\nLUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname);\n\nLUALIB_API void (luaL_where) (lua_State *L, int lvl);\nLUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...);\n\nLUALIB_API int (luaL_checkoption) (lua_State *L, int arg, const char *def,\n                                   const char *const lst[]);\n\nLUALIB_API int (luaL_fileresult) (lua_State *L, int stat, const char *fname);\nLUALIB_API int (luaL_execresult) (lua_State *L, int stat);\n\n/* pre-defined references */\n#define LUA_NOREF       (-2)\n#define LUA_REFNIL      (-1)\n\nLUALIB_API int (luaL_ref) (lua_State *L, int t);\nLUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);\n\nLUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename,\n                                               const char *mode);\n\n#define luaL_loadfile(L,f)\tluaL_loadfilex(L,f,NULL)\n\nLUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz,\n                                   const char *name, const char *mode);\nLUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);\n\nLUALIB_API lua_State *(luaL_newstate) (void);\n\nLUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx);\n\nLUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p,\n                                                  const char *r);\n\nLUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup);\n\nLUALIB_API int (luaL_getsubtable) (lua_State *L, int idx, const char *fname);\n\nLUALIB_API void (luaL_traceback) (lua_State *L, lua_State *L1,\n                                  const char *msg, int level);\n\nLUALIB_API void (luaL_requiref) (lua_State *L, const char *modname,\n                                 lua_CFunction openf, int glb);\n\n/*\n** ===============================================================\n** some useful macros\n** ===============================================================\n*/\n\n\n#define luaL_newlibtable(L,l)\t\\\n  lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1)\n\n#define luaL_newlib(L,l)  \\\n  (luaL_checkversion(L), luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))\n\n#define luaL_argcheck(L, cond,arg,extramsg)\t\\\n\t\t((void)((cond) || luaL_argerror(L, (arg), (extramsg))))\n#define luaL_checkstring(L,n)\t(luaL_checklstring(L, (n), NULL))\n#define luaL_optstring(L,n,d)\t(luaL_optlstring(L, (n), (d), NULL))\n\n#define luaL_typename(L,i)\tlua_typename(L, lua_type(L,(i)))\n\n#define luaL_dofile(L, fn) \\\n\t(luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))\n\n#define luaL_dostring(L, s) \\\n\t(luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0))\n\n#define luaL_getmetatable(L,n)\t(lua_getfield(L, LUA_REGISTRYINDEX, (n)))\n\n#define luaL_opt(L,f,n,d)\t(lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))\n\n#define luaL_loadbuffer(L,s,sz,n)\tluaL_loadbufferx(L,s,sz,n,NULL)\n\n\n/*\n** {======================================================\n** Generic Buffer manipulation\n** =======================================================\n*/\n\ntypedef struct luaL_Buffer {\n  char *b;  /* buffer address */\n  size_t size;  /* buffer size */\n  size_t n;  /* number of characters in buffer */\n  lua_State *L;\n  char initb[LUAL_BUFFERSIZE];  /* initial buffer */\n} luaL_Buffer;\n\n\n#define luaL_addchar(B,c) \\\n  ((void)((B)->n < (B)->size || luaL_prepbuffsize((B), 1)), \\\n   ((B)->b[(B)->n++] = (c)))\n\n#define luaL_addsize(B,s)\t((B)->n += (s))\n\nLUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B);\nLUALIB_API char *(luaL_prepbuffsize) (luaL_Buffer *B, size_t sz);\nLUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l);\nLUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s);\nLUALIB_API void (luaL_addvalue) (luaL_Buffer *B);\nLUALIB_API void (luaL_pushresult) (luaL_Buffer *B);\nLUALIB_API void (luaL_pushresultsize) (luaL_Buffer *B, size_t sz);\nLUALIB_API char *(luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz);\n\n#define luaL_prepbuffer(B)\tluaL_prepbuffsize(B, LUAL_BUFFERSIZE)\n\n/* }====================================================== */\n\n\n\n/*\n** {======================================================\n** File handles for IO library\n** =======================================================\n*/\n\n/*\n** A file handle is a userdata with metatable 'LUA_FILEHANDLE' and\n** initial structure 'luaL_Stream' (it may contain other fields\n** after that initial structure).\n*/\n\n#define LUA_FILEHANDLE          \"FILE*\"\n\n\ntypedef struct luaL_Stream {\n  FILE *f;  /* stream (NULL for incompletely created streams) */\n  lua_CFunction closef;  /* to close stream (NULL for closed streams) */\n} luaL_Stream;\n\n/* }====================================================== */\n\n\n\n/* compatibility with old module system */\n#if defined(LUA_COMPAT_MODULE)\n\nLUALIB_API void (luaL_pushmodule) (lua_State *L, const char *modname,\n                                   int sizehint);\nLUALIB_API void (luaL_openlib) (lua_State *L, const char *libname,\n                                const luaL_Reg *l, int nup);\n\n#define luaL_register(L,n,l)\t(luaL_openlib(L,(n),(l),0))\n\n#endif\n\n\n/*\n** {==================================================================\n** \"Abstraction Layer\" for basic report of messages and errors\n** ===================================================================\n*/\n\n/* print a string */\n#if !defined(lua_writestring)\n#define lua_writestring(s,l)   fwrite((s), sizeof(char), (l), stdout)\n#endif\n\n/* print a newline and flush the output */\n#if !defined(lua_writeline)\n#define lua_writeline()        (lua_writestring(\"\\n\", 1), fflush(stdout))\n#endif\n\n/* print an error message */\n#if !defined(lua_writestringerror)\n#define lua_writestringerror(s,p) \\\n        (fprintf(stderr, (s), (p)), fflush(stderr))\n#endif\n\n/* }================================================================== */\n\n\n/*\n** {============================================================\n** Compatibility with deprecated conversions\n** =============================================================\n*/\n#if defined(LUA_COMPAT_APIINTCASTS)\n\n#define luaL_checkunsigned(L,a)\t((lua_Unsigned)luaL_checkinteger(L,a))\n#define luaL_optunsigned(L,a,d)\t\\\n\t((lua_Unsigned)luaL_optinteger(L,a,(lua_Integer)(d)))\n\n#define luaL_checkint(L,n)\t((int)luaL_checkinteger(L, (n)))\n#define luaL_optint(L,n,d)\t((int)luaL_optinteger(L, (n), (d)))\n\n#define luaL_checklong(L,n)\t((long)luaL_checkinteger(L, (n)))\n#define luaL_optlong(L,n,d)\t((long)luaL_optinteger(L, (n), (d)))\n\n#endif\n/* }============================================================ */\n\n\n\n#endif\n\n\n"
  },
  {
    "path": "externals/lua/src/lbaselib.c",
    "content": "/*\n** $Id: lbaselib.c,v 1.309 2014/12/10 12:26:42 roberto Exp $\n** Basic library\n** See Copyright Notice in lua.h\n*/\n\n#define lbaselib_c\n#define LUA_LIB\n\n#include \"lprefix.h\"\n\n\n#include <ctype.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"lauxlib.h\"\n#include \"lualib.h\"\n\n\nstatic int luaB_print (lua_State *L) {\n  int n = lua_gettop(L);  /* number of arguments */\n  int i;\n  lua_getglobal(L, \"tostring\");\n  for (i=1; i<=n; i++) {\n    const char *s;\n    size_t l;\n    lua_pushvalue(L, -1);  /* function to be called */\n    lua_pushvalue(L, i);   /* value to print */\n    lua_call(L, 1, 1);\n    s = lua_tolstring(L, -1, &l);  /* get result */\n    if (s == NULL)\n      return luaL_error(L, \"'tostring' must return a string to 'print'\");\n    if (i>1) lua_writestring(\"\\t\", 1);\n    lua_writestring(s, l);\n    lua_pop(L, 1);  /* pop result */\n  }\n  lua_writeline();\n  return 0;\n}\n\n\n#define SPACECHARS\t\" \\f\\n\\r\\t\\v\"\n\nstatic const char *b_str2int (const char *s, int base, lua_Integer *pn) {\n  lua_Unsigned n = 0;\n  int neg = 0;\n  s += strspn(s, SPACECHARS);  /* skip initial spaces */\n  if (*s == '-') { s++; neg = 1; }  /* handle signal */\n  else if (*s == '+') s++;\n  if (!isalnum((unsigned char)*s))  /* no digit? */\n    return NULL;\n  do {\n    int digit = (isdigit((unsigned char)*s)) ? *s - '0'\n                   : toupper((unsigned char)*s) - 'A' + 10;\n    if (digit >= base) return NULL;  /* invalid numeral */\n    n = n * base + digit;\n    s++;\n  } while (isalnum((unsigned char)*s));\n  s += strspn(s, SPACECHARS);  /* skip trailing spaces */\n  *pn = (lua_Integer)((neg) ? (0u - n) : n);\n  return s;\n}\n\n\nstatic int luaB_tonumber (lua_State *L) {\n  if (lua_isnoneornil(L, 2)) {  /* standard conversion? */\n    luaL_checkany(L, 1);\n    if (lua_type(L, 1) == LUA_TNUMBER) {  /* already a number? */\n      lua_settop(L, 1);  /* yes; return it */\n      return 1;\n    }\n    else {\n      size_t l;\n      const char *s = lua_tolstring(L, 1, &l);\n      if (s != NULL && lua_stringtonumber(L, s) == l + 1)\n        return 1;  /* successful conversion to number */\n      /* else not a number */\n    }\n  }\n  else {\n    size_t l;\n    const char *s;\n    lua_Integer n = 0;  /* to avoid warnings */\n    lua_Integer base = luaL_checkinteger(L, 2);\n    luaL_checktype(L, 1, LUA_TSTRING);  /* before 'luaL_checklstring'! */\n    s = luaL_checklstring(L, 1, &l);\n    luaL_argcheck(L, 2 <= base && base <= 36, 2, \"base out of range\");\n    if (b_str2int(s, (int)base, &n) == s + l) {\n      lua_pushinteger(L, n);\n      return 1;\n    }  /* else not a number */\n  }  /* else not a number */\n  lua_pushnil(L);  /* not a number */\n  return 1;\n}\n\n\nstatic int luaB_error (lua_State *L) {\n  int level = (int)luaL_optinteger(L, 2, 1);\n  lua_settop(L, 1);\n  if (lua_isstring(L, 1) && level > 0) {  /* add extra information? */\n    luaL_where(L, level);\n    lua_pushvalue(L, 1);\n    lua_concat(L, 2);\n  }\n  return lua_error(L);\n}\n\n\nstatic int luaB_getmetatable (lua_State *L) {\n  luaL_checkany(L, 1);\n  if (!lua_getmetatable(L, 1)) {\n    lua_pushnil(L);\n    return 1;  /* no metatable */\n  }\n  luaL_getmetafield(L, 1, \"__metatable\");\n  return 1;  /* returns either __metatable field (if present) or metatable */\n}\n\n\nstatic int luaB_setmetatable (lua_State *L) {\n  int t = lua_type(L, 2);\n  luaL_checktype(L, 1, LUA_TTABLE);\n  luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2,\n                    \"nil or table expected\");\n  if (luaL_getmetafield(L, 1, \"__metatable\") != LUA_TNIL)\n    return luaL_error(L, \"cannot change a protected metatable\");\n  lua_settop(L, 2);\n  lua_setmetatable(L, 1);\n  return 1;\n}\n\n\nstatic int luaB_rawequal (lua_State *L) {\n  luaL_checkany(L, 1);\n  luaL_checkany(L, 2);\n  lua_pushboolean(L, lua_rawequal(L, 1, 2));\n  return 1;\n}\n\n\nstatic int luaB_rawlen (lua_State *L) {\n  int t = lua_type(L, 1);\n  luaL_argcheck(L, t == LUA_TTABLE || t == LUA_TSTRING, 1,\n                   \"table or string expected\");\n  lua_pushinteger(L, lua_rawlen(L, 1));\n  return 1;\n}\n\n\nstatic int luaB_rawget (lua_State *L) {\n  luaL_checktype(L, 1, LUA_TTABLE);\n  luaL_checkany(L, 2);\n  lua_settop(L, 2);\n  lua_rawget(L, 1);\n  return 1;\n}\n\nstatic int luaB_rawset (lua_State *L) {\n  luaL_checktype(L, 1, LUA_TTABLE);\n  luaL_checkany(L, 2);\n  luaL_checkany(L, 3);\n  lua_settop(L, 3);\n  lua_rawset(L, 1);\n  return 1;\n}\n\n\nstatic int luaB_collectgarbage (lua_State *L) {\n  static const char *const opts[] = {\"stop\", \"restart\", \"collect\",\n    \"count\", \"step\", \"setpause\", \"setstepmul\",\n    \"isrunning\", NULL};\n  static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT,\n    LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL,\n    LUA_GCISRUNNING};\n  int o = optsnum[luaL_checkoption(L, 1, \"collect\", opts)];\n  int ex = (int)luaL_optinteger(L, 2, 0);\n  int res = lua_gc(L, o, ex);\n  switch (o) {\n    case LUA_GCCOUNT: {\n      int b = lua_gc(L, LUA_GCCOUNTB, 0);\n      lua_pushnumber(L, (lua_Number)res + ((lua_Number)b/1024));\n      return 1;\n    }\n    case LUA_GCSTEP: case LUA_GCISRUNNING: {\n      lua_pushboolean(L, res);\n      return 1;\n    }\n    default: {\n      lua_pushinteger(L, res);\n      return 1;\n    }\n  }\n}\n\n\n/*\n** This function has all type names as upvalues, to maximize performance.\n*/\nstatic int luaB_type (lua_State *L) {\n  luaL_checkany(L, 1);\n  lua_pushvalue(L, lua_upvalueindex(lua_type(L, 1) + 1));\n  return 1;\n}\n\n\nstatic int pairsmeta (lua_State *L, const char *method, int iszero,\n                      lua_CFunction iter) {\n  if (luaL_getmetafield(L, 1, method) == LUA_TNIL) {  /* no metamethod? */\n    luaL_checktype(L, 1, LUA_TTABLE);  /* argument must be a table */\n    lua_pushcfunction(L, iter);  /* will return generator, */\n    lua_pushvalue(L, 1);  /* state, */\n    if (iszero) lua_pushinteger(L, 0);  /* and initial value */\n    else lua_pushnil(L);\n  }\n  else {\n    lua_pushvalue(L, 1);  /* argument 'self' to metamethod */\n    lua_call(L, 1, 3);  /* get 3 values from metamethod */\n  }\n  return 3;\n}\n\n\nstatic int luaB_next (lua_State *L) {\n  luaL_checktype(L, 1, LUA_TTABLE);\n  lua_settop(L, 2);  /* create a 2nd argument if there isn't one */\n  if (lua_next(L, 1))\n    return 2;\n  else {\n    lua_pushnil(L);\n    return 1;\n  }\n}\n\n\nstatic int luaB_pairs (lua_State *L) {\n  return pairsmeta(L, \"__pairs\", 0, luaB_next);\n}\n\n\n/*\n** Traversal function for 'ipairs' for raw tables\n*/\nstatic int ipairsaux_raw (lua_State *L) {\n  lua_Integer i = luaL_checkinteger(L, 2) + 1;\n  luaL_checktype(L, 1, LUA_TTABLE);\n  lua_pushinteger(L, i);\n  return (lua_rawgeti(L, 1, i) == LUA_TNIL) ? 1 : 2;\n}\n\n\n/*\n** Traversal function for 'ipairs' for tables with metamethods\n*/\nstatic int ipairsaux (lua_State *L) {\n  lua_Integer i = luaL_checkinteger(L, 2) + 1;\n  lua_pushinteger(L, i);\n  return (lua_geti(L, 1, i) == LUA_TNIL) ? 1 : 2;\n}\n\n\n/*\n** This function will use either 'ipairsaux' or 'ipairsaux_raw' to\n** traverse a table, depending on whether the table has metamethods\n** that can affect the traversal.\n*/\nstatic int luaB_ipairs (lua_State *L) {\n  lua_CFunction iter = (luaL_getmetafield(L, 1, \"__index\") != LUA_TNIL)\n                       ? ipairsaux : ipairsaux_raw;\n#if defined(LUA_COMPAT_IPAIRS)\n  return pairsmeta(L, \"__ipairs\", 1, iter);\n#else\n  luaL_checkany(L, 1);\n  lua_pushcfunction(L, iter);  /* iteration function */\n  lua_pushvalue(L, 1);  /* state */\n  lua_pushinteger(L, 0);  /* initial value */\n  return 3;\n#endif\n}\n\n\nstatic int load_aux (lua_State *L, int status, int envidx) {\n  if (status == LUA_OK) {\n    if (envidx != 0) {  /* 'env' parameter? */\n      lua_pushvalue(L, envidx);  /* environment for loaded function */\n      if (!lua_setupvalue(L, -2, 1))  /* set it as 1st upvalue */\n        lua_pop(L, 1);  /* remove 'env' if not used by previous call */\n    }\n    return 1;\n  }\n  else {  /* error (message is on top of the stack) */\n    lua_pushnil(L);\n    lua_insert(L, -2);  /* put before error message */\n    return 2;  /* return nil plus error message */\n  }\n}\n\n\nstatic int luaB_loadfile (lua_State *L) {\n  const char *fname = luaL_optstring(L, 1, NULL);\n  const char *mode = luaL_optstring(L, 2, NULL);\n  int env = (!lua_isnone(L, 3) ? 3 : 0);  /* 'env' index or 0 if no 'env' */\n  int status = luaL_loadfilex(L, fname, mode);\n  return load_aux(L, status, env);\n}\n\n\n/*\n** {======================================================\n** Generic Read function\n** =======================================================\n*/\n\n\n/*\n** reserved slot, above all arguments, to hold a copy of the returned\n** string to avoid it being collected while parsed. 'load' has four\n** optional arguments (chunk, source name, mode, and environment).\n*/\n#define RESERVEDSLOT\t5\n\n\n/*\n** Reader for generic 'load' function: 'lua_load' uses the\n** stack for internal stuff, so the reader cannot change the\n** stack top. Instead, it keeps its resulting string in a\n** reserved slot inside the stack.\n*/\nstatic const char *generic_reader (lua_State *L, void *ud, size_t *size) {\n  (void)(ud);  /* not used */\n  luaL_checkstack(L, 2, \"too many nested functions\");\n  lua_pushvalue(L, 1);  /* get function */\n  lua_call(L, 0, 1);  /* call it */\n  if (lua_isnil(L, -1)) {\n    lua_pop(L, 1);  /* pop result */\n    *size = 0;\n    return NULL;\n  }\n  else if (!lua_isstring(L, -1))\n    luaL_error(L, \"reader function must return a string\");\n  lua_replace(L, RESERVEDSLOT);  /* save string in reserved slot */\n  return lua_tolstring(L, RESERVEDSLOT, size);\n}\n\n\nstatic int luaB_load (lua_State *L) {\n  int status;\n  size_t l;\n  const char *s = lua_tolstring(L, 1, &l);\n  const char *mode = luaL_optstring(L, 3, \"bt\");\n  int env = (!lua_isnone(L, 4) ? 4 : 0);  /* 'env' index or 0 if no 'env' */\n  if (s != NULL) {  /* loading a string? */\n    const char *chunkname = luaL_optstring(L, 2, s);\n    status = luaL_loadbufferx(L, s, l, chunkname, mode);\n  }\n  else {  /* loading from a reader function */\n    const char *chunkname = luaL_optstring(L, 2, \"=(load)\");\n    luaL_checktype(L, 1, LUA_TFUNCTION);\n    lua_settop(L, RESERVEDSLOT);  /* create reserved slot */\n    status = lua_load(L, generic_reader, NULL, chunkname, mode);\n  }\n  return load_aux(L, status, env);\n}\n\n/* }====================================================== */\n\n\nstatic int dofilecont (lua_State *L, int d1, lua_KContext d2) {\n  (void)d1;  (void)d2;  /* only to match 'lua_Kfunction' prototype */\n  return lua_gettop(L) - 1;\n}\n\n\nstatic int luaB_dofile (lua_State *L) {\n  const char *fname = luaL_optstring(L, 1, NULL);\n  lua_settop(L, 1);\n  if (luaL_loadfile(L, fname) != LUA_OK)\n    return lua_error(L);\n  lua_callk(L, 0, LUA_MULTRET, 0, dofilecont);\n  return dofilecont(L, 0, 0);\n}\n\n\nstatic int luaB_assert (lua_State *L) {\n  if (lua_toboolean(L, 1))  /* condition is true? */\n    return lua_gettop(L);  /* return all arguments */\n  else {  /* error */\n    luaL_checkany(L, 1);  /* there must be a condition */\n    lua_remove(L, 1);  /* remove it */\n    lua_pushliteral(L, \"assertion failed!\");  /* default message */\n    lua_settop(L, 1);  /* leave only message (default if no other one) */\n    return luaB_error(L);  /* call 'error' */\n  }\n}\n\n\nstatic int luaB_select (lua_State *L) {\n  int n = lua_gettop(L);\n  if (lua_type(L, 1) == LUA_TSTRING && *lua_tostring(L, 1) == '#') {\n    lua_pushinteger(L, n-1);\n    return 1;\n  }\n  else {\n    lua_Integer i = luaL_checkinteger(L, 1);\n    if (i < 0) i = n + i;\n    else if (i > n) i = n;\n    luaL_argcheck(L, 1 <= i, 1, \"index out of range\");\n    return n - (int)i;\n  }\n}\n\n\n/*\n** Continuation function for 'pcall' and 'xpcall'. Both functions\n** already pushed a 'true' before doing the call, so in case of success\n** 'finishpcall' only has to return everything in the stack minus\n** 'extra' values (where 'extra' is exactly the number of items to be\n** ignored).\n*/\nstatic int finishpcall (lua_State *L, int status, lua_KContext extra) {\n  if (status != LUA_OK && status != LUA_YIELD) {  /* error? */\n    lua_pushboolean(L, 0);  /* first result (false) */\n    lua_pushvalue(L, -2);  /* error message */\n    return 2;  /* return false, msg */\n  }\n  else\n    return lua_gettop(L) - (int)extra;  /* return all results */\n}\n\n\nstatic int luaB_pcall (lua_State *L) {\n  int status;\n  luaL_checkany(L, 1);\n  lua_pushboolean(L, 1);  /* first result if no errors */\n  lua_insert(L, 1);  /* put it in place */\n  status = lua_pcallk(L, lua_gettop(L) - 2, LUA_MULTRET, 0, 0, finishpcall);\n  return finishpcall(L, status, 0);\n}\n\n\n/*\n** Do a protected call with error handling. After 'lua_rotate', the\n** stack will have <f, err, true, f, [args...]>; so, the function passes\n** 2 to 'finishpcall' to skip the 2 first values when returning results.\n*/\nstatic int luaB_xpcall (lua_State *L) {\n  int status;\n  int n = lua_gettop(L);\n  luaL_checktype(L, 2, LUA_TFUNCTION);  /* check error function */\n  lua_pushboolean(L, 1);  /* first result */\n  lua_pushvalue(L, 1);  /* function */\n  lua_rotate(L, 3, 2);  /* move them below function's arguments */\n  status = lua_pcallk(L, n - 2, LUA_MULTRET, 2, 2, finishpcall);\n  return finishpcall(L, status, 2);\n}\n\n\nstatic int luaB_tostring (lua_State *L) {\n  luaL_checkany(L, 1);\n  luaL_tolstring(L, 1, NULL);\n  return 1;\n}\n\n\nstatic const luaL_Reg base_funcs[] = {\n  {\"assert\", luaB_assert},\n  {\"collectgarbage\", luaB_collectgarbage},\n  {\"dofile\", luaB_dofile},\n  {\"error\", luaB_error},\n  {\"getmetatable\", luaB_getmetatable},\n  {\"ipairs\", luaB_ipairs},\n  {\"loadfile\", luaB_loadfile},\n  {\"load\", luaB_load},\n#if defined(LUA_COMPAT_LOADSTRING)\n  {\"loadstring\", luaB_load},\n#endif\n  {\"next\", luaB_next},\n  {\"pairs\", luaB_pairs},\n  {\"pcall\", luaB_pcall},\n  {\"print\", luaB_print},\n  {\"rawequal\", luaB_rawequal},\n  {\"rawlen\", luaB_rawlen},\n  {\"rawget\", luaB_rawget},\n  {\"rawset\", luaB_rawset},\n  {\"select\", luaB_select},\n  {\"setmetatable\", luaB_setmetatable},\n  {\"tonumber\", luaB_tonumber},\n  {\"tostring\", luaB_tostring},\n  {\"xpcall\", luaB_xpcall},\n  /* placeholders */\n  {\"type\", NULL},\n  {\"_G\", NULL},\n  {\"_VERSION\", NULL},\n  {NULL, NULL}\n};\n\n\nLUAMOD_API int luaopen_base (lua_State *L) {\n  int i;\n  /* open lib into global table */\n  lua_pushglobaltable(L);\n  luaL_setfuncs(L, base_funcs, 0);\n  /* set global _G */\n  lua_pushvalue(L, -1);\n  lua_setfield(L, -2, \"_G\");\n  /* set global _VERSION */\n  lua_pushliteral(L, LUA_VERSION);\n  lua_setfield(L, -2, \"_VERSION\");\n  /* set function 'type' with proper upvalues */\n  for (i = 0; i < LUA_NUMTAGS; i++)  /* push all type names as upvalues */\n    lua_pushstring(L, lua_typename(L, i));\n  lua_pushcclosure(L, luaB_type, LUA_NUMTAGS);\n  lua_setfield(L, -2, \"type\");\n  return 1;\n}\n\n"
  },
  {
    "path": "externals/lua/src/lbitlib.c",
    "content": "/*\n** $Id: lbitlib.c,v 1.28 2014/11/02 19:19:04 roberto Exp $\n** Standard library for bitwise operations\n** See Copyright Notice in lua.h\n*/\n\n#define lbitlib_c\n#define LUA_LIB\n\n#include \"lprefix.h\"\n\n\n#include \"lua.h\"\n\n#include \"lauxlib.h\"\n#include \"lualib.h\"\n\n\n#if defined(LUA_COMPAT_BITLIB)\t\t/* { */\n\n\n/* number of bits to consider in a number */\n#if !defined(LUA_NBITS)\n#define LUA_NBITS\t32\n#endif\n\n\n/*\n** a lua_Unsigned with its first LUA_NBITS bits equal to 1. (Shift must\n** be made in two parts to avoid problems when LUA_NBITS is equal to the\n** number of bits in a lua_Unsigned.)\n*/\n#define ALLONES\t\t(~(((~(lua_Unsigned)0) << (LUA_NBITS - 1)) << 1))\n\n\n/* macro to trim extra bits */\n#define trim(x)\t\t((x) & ALLONES)\n\n\n/* builds a number with 'n' ones (1 <= n <= LUA_NBITS) */\n#define mask(n)\t\t(~((ALLONES << 1) << ((n) - 1)))\n\n\n\nstatic lua_Unsigned andaux (lua_State *L) {\n  int i, n = lua_gettop(L);\n  lua_Unsigned r = ~(lua_Unsigned)0;\n  for (i = 1; i <= n; i++)\n    r &= luaL_checkunsigned(L, i);\n  return trim(r);\n}\n\n\nstatic int b_and (lua_State *L) {\n  lua_Unsigned r = andaux(L);\n  lua_pushunsigned(L, r);\n  return 1;\n}\n\n\nstatic int b_test (lua_State *L) {\n  lua_Unsigned r = andaux(L);\n  lua_pushboolean(L, r != 0);\n  return 1;\n}\n\n\nstatic int b_or (lua_State *L) {\n  int i, n = lua_gettop(L);\n  lua_Unsigned r = 0;\n  for (i = 1; i <= n; i++)\n    r |= luaL_checkunsigned(L, i);\n  lua_pushunsigned(L, trim(r));\n  return 1;\n}\n\n\nstatic int b_xor (lua_State *L) {\n  int i, n = lua_gettop(L);\n  lua_Unsigned r = 0;\n  for (i = 1; i <= n; i++)\n    r ^= luaL_checkunsigned(L, i);\n  lua_pushunsigned(L, trim(r));\n  return 1;\n}\n\n\nstatic int b_not (lua_State *L) {\n  lua_Unsigned r = ~luaL_checkunsigned(L, 1);\n  lua_pushunsigned(L, trim(r));\n  return 1;\n}\n\n\nstatic int b_shift (lua_State *L, lua_Unsigned r, lua_Integer i) {\n  if (i < 0) {  /* shift right? */\n    i = -i;\n    r = trim(r);\n    if (i >= LUA_NBITS) r = 0;\n    else r >>= i;\n  }\n  else {  /* shift left */\n    if (i >= LUA_NBITS) r = 0;\n    else r <<= i;\n    r = trim(r);\n  }\n  lua_pushunsigned(L, r);\n  return 1;\n}\n\n\nstatic int b_lshift (lua_State *L) {\n  return b_shift(L, luaL_checkunsigned(L, 1), luaL_checkinteger(L, 2));\n}\n\n\nstatic int b_rshift (lua_State *L) {\n  return b_shift(L, luaL_checkunsigned(L, 1), -luaL_checkinteger(L, 2));\n}\n\n\nstatic int b_arshift (lua_State *L) {\n  lua_Unsigned r = luaL_checkunsigned(L, 1);\n  lua_Integer i = luaL_checkinteger(L, 2);\n  if (i < 0 || !(r & ((lua_Unsigned)1 << (LUA_NBITS - 1))))\n    return b_shift(L, r, -i);\n  else {  /* arithmetic shift for 'negative' number */\n    if (i >= LUA_NBITS) r = ALLONES;\n    else\n      r = trim((r >> i) | ~(trim(~(lua_Unsigned)0) >> i));  /* add signal bit */\n    lua_pushunsigned(L, r);\n    return 1;\n  }\n}\n\n\nstatic int b_rot (lua_State *L, lua_Integer d) {\n  lua_Unsigned r = luaL_checkunsigned(L, 1);\n  int i = d & (LUA_NBITS - 1);  /* i = d % NBITS */\n  r = trim(r);\n  if (i != 0)  /* avoid undefined shift of LUA_NBITS when i == 0 */\n    r = (r << i) | (r >> (LUA_NBITS - i));\n  lua_pushunsigned(L, trim(r));\n  return 1;\n}\n\n\nstatic int b_lrot (lua_State *L) {\n  return b_rot(L, luaL_checkinteger(L, 2));\n}\n\n\nstatic int b_rrot (lua_State *L) {\n  return b_rot(L, -luaL_checkinteger(L, 2));\n}\n\n\n/*\n** get field and width arguments for field-manipulation functions,\n** checking whether they are valid.\n** ('luaL_error' called without 'return' to avoid later warnings about\n** 'width' being used uninitialized.)\n*/\nstatic int fieldargs (lua_State *L, int farg, int *width) {\n  lua_Integer f = luaL_checkinteger(L, farg);\n  lua_Integer w = luaL_optinteger(L, farg + 1, 1);\n  luaL_argcheck(L, 0 <= f, farg, \"field cannot be negative\");\n  luaL_argcheck(L, 0 < w, farg + 1, \"width must be positive\");\n  if (f + w > LUA_NBITS)\n    luaL_error(L, \"trying to access non-existent bits\");\n  *width = (int)w;\n  return (int)f;\n}\n\n\nstatic int b_extract (lua_State *L) {\n  int w;\n  lua_Unsigned r = trim(luaL_checkunsigned(L, 1));\n  int f = fieldargs(L, 2, &w);\n  r = (r >> f) & mask(w);\n  lua_pushunsigned(L, r);\n  return 1;\n}\n\n\nstatic int b_replace (lua_State *L) {\n  int w;\n  lua_Unsigned r = trim(luaL_checkunsigned(L, 1));\n  lua_Unsigned v = luaL_checkunsigned(L, 2);\n  int f = fieldargs(L, 3, &w);\n  int m = mask(w);\n  v &= m;  /* erase bits outside given width */\n  r = (r & ~(m << f)) | (v << f);\n  lua_pushunsigned(L, r);\n  return 1;\n}\n\n\nstatic const luaL_Reg bitlib[] = {\n  {\"arshift\", b_arshift},\n  {\"band\", b_and},\n  {\"bnot\", b_not},\n  {\"bor\", b_or},\n  {\"bxor\", b_xor},\n  {\"btest\", b_test},\n  {\"extract\", b_extract},\n  {\"lrotate\", b_lrot},\n  {\"lshift\", b_lshift},\n  {\"replace\", b_replace},\n  {\"rrotate\", b_rrot},\n  {\"rshift\", b_rshift},\n  {NULL, NULL}\n};\n\n\n\nLUAMOD_API int luaopen_bit32 (lua_State *L) {\n  luaL_newlib(L, bitlib);\n  return 1;\n}\n\n\n#else\t\t\t\t\t/* }{ */\n\n\nLUAMOD_API int luaopen_bit32 (lua_State *L) {\n  return luaL_error(L, \"library 'bit32' has been deprecated\");\n}\n\n#endif\t\t\t\t\t/* } */\n"
  },
  {
    "path": "externals/lua/src/lcode.c",
    "content": "/*\n** $Id: lcode.c,v 2.99 2014/12/29 16:49:25 roberto Exp $\n** Code generator for Lua\n** See Copyright Notice in lua.h\n*/\n\n#define lcode_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include <math.h>\n#include <stdlib.h>\n\n#include \"lua.h\"\n\n#include \"lcode.h\"\n#include \"ldebug.h\"\n#include \"ldo.h\"\n#include \"lgc.h\"\n#include \"llex.h\"\n#include \"lmem.h\"\n#include \"lobject.h\"\n#include \"lopcodes.h\"\n#include \"lparser.h\"\n#include \"lstring.h\"\n#include \"ltable.h\"\n#include \"lvm.h\"\n\n\n/* Maximum number of registers in a Lua function */\n#define MAXREGS\t\t250\n\n\n#define hasjumps(e)\t((e)->t != (e)->f)\n\n\nstatic int tonumeral(expdesc *e, TValue *v) {\n  if (e->t != NO_JUMP || e->f != NO_JUMP)\n    return 0;  /* not a numeral */\n  switch (e->k) {\n    case VKINT:\n      if (v) setivalue(v, e->u.ival);\n      return 1;\n    case VKFLT:\n      if (v) setfltvalue(v, e->u.nval);\n      return 1;\n    default: return 0;\n  }\n}\n\n\nvoid luaK_nil (FuncState *fs, int from, int n) {\n  Instruction *previous;\n  int l = from + n - 1;  /* last register to set nil */\n  if (fs->pc > fs->lasttarget) {  /* no jumps to current position? */\n    previous = &fs->f->code[fs->pc-1];\n    if (GET_OPCODE(*previous) == OP_LOADNIL) {\n      int pfrom = GETARG_A(*previous);\n      int pl = pfrom + GETARG_B(*previous);\n      if ((pfrom <= from && from <= pl + 1) ||\n          (from <= pfrom && pfrom <= l + 1)) {  /* can connect both? */\n        if (pfrom < from) from = pfrom;  /* from = min(from, pfrom) */\n        if (pl > l) l = pl;  /* l = max(l, pl) */\n        SETARG_A(*previous, from);\n        SETARG_B(*previous, l - from);\n        return;\n      }\n    }  /* else go through */\n  }\n  luaK_codeABC(fs, OP_LOADNIL, from, n - 1, 0);  /* else no optimization */\n}\n\n\nint luaK_jump (FuncState *fs) {\n  int jpc = fs->jpc;  /* save list of jumps to here */\n  int j;\n  fs->jpc = NO_JUMP;\n  j = luaK_codeAsBx(fs, OP_JMP, 0, NO_JUMP);\n  luaK_concat(fs, &j, jpc);  /* keep them on hold */\n  return j;\n}\n\n\nvoid luaK_ret (FuncState *fs, int first, int nret) {\n  luaK_codeABC(fs, OP_RETURN, first, nret+1, 0);\n}\n\n\nstatic int condjump (FuncState *fs, OpCode op, int A, int B, int C) {\n  luaK_codeABC(fs, op, A, B, C);\n  return luaK_jump(fs);\n}\n\n\nstatic void fixjump (FuncState *fs, int pc, int dest) {\n  Instruction *jmp = &fs->f->code[pc];\n  int offset = dest-(pc+1);\n  lua_assert(dest != NO_JUMP);\n  if (abs(offset) > MAXARG_sBx)\n    luaX_syntaxerror(fs->ls, \"control structure too long\");\n  SETARG_sBx(*jmp, offset);\n}\n\n\n/*\n** returns current 'pc' and marks it as a jump target (to avoid wrong\n** optimizations with consecutive instructions not in the same basic block).\n*/\nint luaK_getlabel (FuncState *fs) {\n  fs->lasttarget = fs->pc;\n  return fs->pc;\n}\n\n\nstatic int getjump (FuncState *fs, int pc) {\n  int offset = GETARG_sBx(fs->f->code[pc]);\n  if (offset == NO_JUMP)  /* point to itself represents end of list */\n    return NO_JUMP;  /* end of list */\n  else\n    return (pc+1)+offset;  /* turn offset into absolute position */\n}\n\n\nstatic Instruction *getjumpcontrol (FuncState *fs, int pc) {\n  Instruction *pi = &fs->f->code[pc];\n  if (pc >= 1 && testTMode(GET_OPCODE(*(pi-1))))\n    return pi-1;\n  else\n    return pi;\n}\n\n\n/*\n** check whether list has any jump that do not produce a value\n** (or produce an inverted value)\n*/\nstatic int need_value (FuncState *fs, int list) {\n  for (; list != NO_JUMP; list = getjump(fs, list)) {\n    Instruction i = *getjumpcontrol(fs, list);\n    if (GET_OPCODE(i) != OP_TESTSET) return 1;\n  }\n  return 0;  /* not found */\n}\n\n\nstatic int patchtestreg (FuncState *fs, int node, int reg) {\n  Instruction *i = getjumpcontrol(fs, node);\n  if (GET_OPCODE(*i) != OP_TESTSET)\n    return 0;  /* cannot patch other instructions */\n  if (reg != NO_REG && reg != GETARG_B(*i))\n    SETARG_A(*i, reg);\n  else  /* no register to put value or register already has the value */\n    *i = CREATE_ABC(OP_TEST, GETARG_B(*i), 0, GETARG_C(*i));\n\n  return 1;\n}\n\n\nstatic void removevalues (FuncState *fs, int list) {\n  for (; list != NO_JUMP; list = getjump(fs, list))\n      patchtestreg(fs, list, NO_REG);\n}\n\n\nstatic void patchlistaux (FuncState *fs, int list, int vtarget, int reg,\n                          int dtarget) {\n  while (list != NO_JUMP) {\n    int next = getjump(fs, list);\n    if (patchtestreg(fs, list, reg))\n      fixjump(fs, list, vtarget);\n    else\n      fixjump(fs, list, dtarget);  /* jump to default target */\n    list = next;\n  }\n}\n\n\nstatic void dischargejpc (FuncState *fs) {\n  patchlistaux(fs, fs->jpc, fs->pc, NO_REG, fs->pc);\n  fs->jpc = NO_JUMP;\n}\n\n\nvoid luaK_patchlist (FuncState *fs, int list, int target) {\n  if (target == fs->pc)\n    luaK_patchtohere(fs, list);\n  else {\n    lua_assert(target < fs->pc);\n    patchlistaux(fs, list, target, NO_REG, target);\n  }\n}\n\n\nvoid luaK_patchclose (FuncState *fs, int list, int level) {\n  level++;  /* argument is +1 to reserve 0 as non-op */\n  while (list != NO_JUMP) {\n    int next = getjump(fs, list);\n    lua_assert(GET_OPCODE(fs->f->code[list]) == OP_JMP &&\n                (GETARG_A(fs->f->code[list]) == 0 ||\n                 GETARG_A(fs->f->code[list]) >= level));\n    SETARG_A(fs->f->code[list], level);\n    list = next;\n  }\n}\n\n\nvoid luaK_patchtohere (FuncState *fs, int list) {\n  luaK_getlabel(fs);\n  luaK_concat(fs, &fs->jpc, list);\n}\n\n\nvoid luaK_concat (FuncState *fs, int *l1, int l2) {\n  if (l2 == NO_JUMP) return;\n  else if (*l1 == NO_JUMP)\n    *l1 = l2;\n  else {\n    int list = *l1;\n    int next;\n    while ((next = getjump(fs, list)) != NO_JUMP)  /* find last element */\n      list = next;\n    fixjump(fs, list, l2);\n  }\n}\n\n\nstatic int luaK_code (FuncState *fs, Instruction i) {\n  Proto *f = fs->f;\n  dischargejpc(fs);  /* 'pc' will change */\n  /* put new instruction in code array */\n  luaM_growvector(fs->ls->L, f->code, fs->pc, f->sizecode, Instruction,\n                  MAX_INT, \"opcodes\");\n  f->code[fs->pc] = i;\n  /* save corresponding line information */\n  luaM_growvector(fs->ls->L, f->lineinfo, fs->pc, f->sizelineinfo, int,\n                  MAX_INT, \"opcodes\");\n  f->lineinfo[fs->pc] = fs->ls->lastline;\n  return fs->pc++;\n}\n\n\nint luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) {\n  lua_assert(getOpMode(o) == iABC);\n  lua_assert(getBMode(o) != OpArgN || b == 0);\n  lua_assert(getCMode(o) != OpArgN || c == 0);\n  lua_assert(a <= MAXARG_A && b <= MAXARG_B && c <= MAXARG_C);\n  return luaK_code(fs, CREATE_ABC(o, a, b, c));\n}\n\n\nint luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) {\n  lua_assert(getOpMode(o) == iABx || getOpMode(o) == iAsBx);\n  lua_assert(getCMode(o) == OpArgN);\n  lua_assert(a <= MAXARG_A && bc <= MAXARG_Bx);\n  return luaK_code(fs, CREATE_ABx(o, a, bc));\n}\n\n\nstatic int codeextraarg (FuncState *fs, int a) {\n  lua_assert(a <= MAXARG_Ax);\n  return luaK_code(fs, CREATE_Ax(OP_EXTRAARG, a));\n}\n\n\nint luaK_codek (FuncState *fs, int reg, int k) {\n  if (k <= MAXARG_Bx)\n    return luaK_codeABx(fs, OP_LOADK, reg, k);\n  else {\n    int p = luaK_codeABx(fs, OP_LOADKX, reg, 0);\n    codeextraarg(fs, k);\n    return p;\n  }\n}\n\n\nvoid luaK_checkstack (FuncState *fs, int n) {\n  int newstack = fs->freereg + n;\n  if (newstack > fs->f->maxstacksize) {\n    if (newstack >= MAXREGS)\n      luaX_syntaxerror(fs->ls, \"function or expression too complex\");\n    fs->f->maxstacksize = cast_byte(newstack);\n  }\n}\n\n\nvoid luaK_reserveregs (FuncState *fs, int n) {\n  luaK_checkstack(fs, n);\n  fs->freereg += n;\n}\n\n\nstatic void freereg (FuncState *fs, int reg) {\n  if (!ISK(reg) && reg >= fs->nactvar) {\n    fs->freereg--;\n    lua_assert(reg == fs->freereg);\n  }\n}\n\n\nstatic void freeexp (FuncState *fs, expdesc *e) {\n  if (e->k == VNONRELOC)\n    freereg(fs, e->u.info);\n}\n\n\n/*\n** Use scanner's table to cache position of constants in constant list\n** and try to reuse constants\n*/\nstatic int addk (FuncState *fs, TValue *key, TValue *v) {\n  lua_State *L = fs->ls->L;\n  Proto *f = fs->f;\n  TValue *idx = luaH_set(L, fs->ls->h, key);  /* index scanner table */\n  int k, oldsize;\n  if (ttisinteger(idx)) {  /* is there an index there? */\n    k = cast_int(ivalue(idx));\n    /* correct value? (warning: must distinguish floats from integers!) */\n    if (k < fs->nk && ttype(&f->k[k]) == ttype(v) &&\n                      luaV_rawequalobj(&f->k[k], v))\n      return k;  /* reuse index */\n  }\n  /* constant not found; create a new entry */\n  oldsize = f->sizek;\n  k = fs->nk;\n  /* numerical value does not need GC barrier;\n     table has no metatable, so it does not need to invalidate cache */\n  setivalue(idx, k);\n  luaM_growvector(L, f->k, k, f->sizek, TValue, MAXARG_Ax, \"constants\");\n  while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]);\n  setobj(L, &f->k[k], v);\n  fs->nk++;\n  luaC_barrier(L, f, v);\n  return k;\n}\n\n\nint luaK_stringK (FuncState *fs, TString *s) {\n  TValue o;\n  setsvalue(fs->ls->L, &o, s);\n  return addk(fs, &o, &o);\n}\n\n\n/*\n** Integers use userdata as keys to avoid collision with floats with same\n** value; conversion to 'void*' used only for hashing, no \"precision\"\n** problems\n*/\nint luaK_intK (FuncState *fs, lua_Integer n) {\n  TValue k, o;\n  setpvalue(&k, cast(void*, cast(size_t, n)));\n  setivalue(&o, n);\n  return addk(fs, &k, &o);\n}\n\n\nstatic int luaK_numberK (FuncState *fs, lua_Number r) {\n  TValue o;\n  setfltvalue(&o, r);\n  return addk(fs, &o, &o);\n}\n\n\nstatic int boolK (FuncState *fs, int b) {\n  TValue o;\n  setbvalue(&o, b);\n  return addk(fs, &o, &o);\n}\n\n\nstatic int nilK (FuncState *fs) {\n  TValue k, v;\n  setnilvalue(&v);\n  /* cannot use nil as key; instead use table itself to represent nil */\n  sethvalue(fs->ls->L, &k, fs->ls->h);\n  return addk(fs, &k, &v);\n}\n\n\nvoid luaK_setreturns (FuncState *fs, expdesc *e, int nresults) {\n  if (e->k == VCALL) {  /* expression is an open function call? */\n    SETARG_C(getcode(fs, e), nresults+1);\n  }\n  else if (e->k == VVARARG) {\n    SETARG_B(getcode(fs, e), nresults+1);\n    SETARG_A(getcode(fs, e), fs->freereg);\n    luaK_reserveregs(fs, 1);\n  }\n}\n\n\nvoid luaK_setoneret (FuncState *fs, expdesc *e) {\n  if (e->k == VCALL) {  /* expression is an open function call? */\n    e->k = VNONRELOC;\n    e->u.info = GETARG_A(getcode(fs, e));\n  }\n  else if (e->k == VVARARG) {\n    SETARG_B(getcode(fs, e), 2);\n    e->k = VRELOCABLE;  /* can relocate its simple result */\n  }\n}\n\n\nvoid luaK_dischargevars (FuncState *fs, expdesc *e) {\n  switch (e->k) {\n    case VLOCAL: {\n      e->k = VNONRELOC;\n      break;\n    }\n    case VUPVAL: {\n      e->u.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.info, 0);\n      e->k = VRELOCABLE;\n      break;\n    }\n    case VINDEXED: {\n      OpCode op = OP_GETTABUP;  /* assume 't' is in an upvalue */\n      freereg(fs, e->u.ind.idx);\n      if (e->u.ind.vt == VLOCAL) {  /* 't' is in a register? */\n        freereg(fs, e->u.ind.t);\n        op = OP_GETTABLE;\n      }\n      e->u.info = luaK_codeABC(fs, op, 0, e->u.ind.t, e->u.ind.idx);\n      e->k = VRELOCABLE;\n      break;\n    }\n    case VVARARG:\n    case VCALL: {\n      luaK_setoneret(fs, e);\n      break;\n    }\n    default: break;  /* there is one value available (somewhere) */\n  }\n}\n\n\nstatic int code_label (FuncState *fs, int A, int b, int jump) {\n  luaK_getlabel(fs);  /* those instructions may be jump targets */\n  return luaK_codeABC(fs, OP_LOADBOOL, A, b, jump);\n}\n\n\nstatic void discharge2reg (FuncState *fs, expdesc *e, int reg) {\n  luaK_dischargevars(fs, e);\n  switch (e->k) {\n    case VNIL: {\n      luaK_nil(fs, reg, 1);\n      break;\n    }\n    case VFALSE: case VTRUE: {\n      luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0);\n      break;\n    }\n    case VK: {\n      luaK_codek(fs, reg, e->u.info);\n      break;\n    }\n    case VKFLT: {\n      luaK_codek(fs, reg, luaK_numberK(fs, e->u.nval));\n      break;\n    }\n    case VKINT: {\n      luaK_codek(fs, reg, luaK_intK(fs, e->u.ival));\n      break;\n    }\n    case VRELOCABLE: {\n      Instruction *pc = &getcode(fs, e);\n      SETARG_A(*pc, reg);\n      break;\n    }\n    case VNONRELOC: {\n      if (reg != e->u.info)\n        luaK_codeABC(fs, OP_MOVE, reg, e->u.info, 0);\n      break;\n    }\n    default: {\n      lua_assert(e->k == VVOID || e->k == VJMP);\n      return;  /* nothing to do... */\n    }\n  }\n  e->u.info = reg;\n  e->k = VNONRELOC;\n}\n\n\nstatic void discharge2anyreg (FuncState *fs, expdesc *e) {\n  if (e->k != VNONRELOC) {\n    luaK_reserveregs(fs, 1);\n    discharge2reg(fs, e, fs->freereg-1);\n  }\n}\n\n\nstatic void exp2reg (FuncState *fs, expdesc *e, int reg) {\n  discharge2reg(fs, e, reg);\n  if (e->k == VJMP)\n    luaK_concat(fs, &e->t, e->u.info);  /* put this jump in 't' list */\n  if (hasjumps(e)) {\n    int final;  /* position after whole expression */\n    int p_f = NO_JUMP;  /* position of an eventual LOAD false */\n    int p_t = NO_JUMP;  /* position of an eventual LOAD true */\n    if (need_value(fs, e->t) || need_value(fs, e->f)) {\n      int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs);\n      p_f = code_label(fs, reg, 0, 1);\n      p_t = code_label(fs, reg, 1, 0);\n      luaK_patchtohere(fs, fj);\n    }\n    final = luaK_getlabel(fs);\n    patchlistaux(fs, e->f, final, reg, p_f);\n    patchlistaux(fs, e->t, final, reg, p_t);\n  }\n  e->f = e->t = NO_JUMP;\n  e->u.info = reg;\n  e->k = VNONRELOC;\n}\n\n\nvoid luaK_exp2nextreg (FuncState *fs, expdesc *e) {\n  luaK_dischargevars(fs, e);\n  freeexp(fs, e);\n  luaK_reserveregs(fs, 1);\n  exp2reg(fs, e, fs->freereg - 1);\n}\n\n\nint luaK_exp2anyreg (FuncState *fs, expdesc *e) {\n  luaK_dischargevars(fs, e);\n  if (e->k == VNONRELOC) {\n    if (!hasjumps(e)) return e->u.info;  /* exp is already in a register */\n    if (e->u.info >= fs->nactvar) {  /* reg. is not a local? */\n      exp2reg(fs, e, e->u.info);  /* put value on it */\n      return e->u.info;\n    }\n  }\n  luaK_exp2nextreg(fs, e);  /* default */\n  return e->u.info;\n}\n\n\nvoid luaK_exp2anyregup (FuncState *fs, expdesc *e) {\n  if (e->k != VUPVAL || hasjumps(e))\n    luaK_exp2anyreg(fs, e);\n}\n\n\nvoid luaK_exp2val (FuncState *fs, expdesc *e) {\n  if (hasjumps(e))\n    luaK_exp2anyreg(fs, e);\n  else\n    luaK_dischargevars(fs, e);\n}\n\n\nint luaK_exp2RK (FuncState *fs, expdesc *e) {\n  luaK_exp2val(fs, e);\n  switch (e->k) {\n    case VTRUE:\n    case VFALSE:\n    case VNIL: {\n      if (fs->nk <= MAXINDEXRK) {  /* constant fits in RK operand? */\n        e->u.info = (e->k == VNIL) ? nilK(fs) : boolK(fs, (e->k == VTRUE));\n        e->k = VK;\n        return RKASK(e->u.info);\n      }\n      else break;\n    }\n    case VKINT: {\n      e->u.info = luaK_intK(fs, e->u.ival);\n      e->k = VK;\n      goto vk;\n    }\n    case VKFLT: {\n      e->u.info = luaK_numberK(fs, e->u.nval);\n      e->k = VK;\n      /* go through */\n    }\n    case VK: {\n     vk:\n      if (e->u.info <= MAXINDEXRK)  /* constant fits in 'argC'? */\n        return RKASK(e->u.info);\n      else break;\n    }\n    default: break;\n  }\n  /* not a constant in the right range: put it in a register */\n  return luaK_exp2anyreg(fs, e);\n}\n\n\nvoid luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) {\n  switch (var->k) {\n    case VLOCAL: {\n      freeexp(fs, ex);\n      exp2reg(fs, ex, var->u.info);\n      return;\n    }\n    case VUPVAL: {\n      int e = luaK_exp2anyreg(fs, ex);\n      luaK_codeABC(fs, OP_SETUPVAL, e, var->u.info, 0);\n      break;\n    }\n    case VINDEXED: {\n      OpCode op = (var->u.ind.vt == VLOCAL) ? OP_SETTABLE : OP_SETTABUP;\n      int e = luaK_exp2RK(fs, ex);\n      luaK_codeABC(fs, op, var->u.ind.t, var->u.ind.idx, e);\n      break;\n    }\n    default: {\n      lua_assert(0);  /* invalid var kind to store */\n      break;\n    }\n  }\n  freeexp(fs, ex);\n}\n\n\nvoid luaK_self (FuncState *fs, expdesc *e, expdesc *key) {\n  int ereg;\n  luaK_exp2anyreg(fs, e);\n  ereg = e->u.info;  /* register where 'e' was placed */\n  freeexp(fs, e);\n  e->u.info = fs->freereg;  /* base register for op_self */\n  e->k = VNONRELOC;\n  luaK_reserveregs(fs, 2);  /* function and 'self' produced by op_self */\n  luaK_codeABC(fs, OP_SELF, e->u.info, ereg, luaK_exp2RK(fs, key));\n  freeexp(fs, key);\n}\n\n\nstatic void invertjump (FuncState *fs, expdesc *e) {\n  Instruction *pc = getjumpcontrol(fs, e->u.info);\n  lua_assert(testTMode(GET_OPCODE(*pc)) && GET_OPCODE(*pc) != OP_TESTSET &&\n                                           GET_OPCODE(*pc) != OP_TEST);\n  SETARG_A(*pc, !(GETARG_A(*pc)));\n}\n\n\nstatic int jumponcond (FuncState *fs, expdesc *e, int cond) {\n  if (e->k == VRELOCABLE) {\n    Instruction ie = getcode(fs, e);\n    if (GET_OPCODE(ie) == OP_NOT) {\n      fs->pc--;  /* remove previous OP_NOT */\n      return condjump(fs, OP_TEST, GETARG_B(ie), 0, !cond);\n    }\n    /* else go through */\n  }\n  discharge2anyreg(fs, e);\n  freeexp(fs, e);\n  return condjump(fs, OP_TESTSET, NO_REG, e->u.info, cond);\n}\n\n\nvoid luaK_goiftrue (FuncState *fs, expdesc *e) {\n  int pc;  /* pc of last jump */\n  luaK_dischargevars(fs, e);\n  switch (e->k) {\n    case VJMP: {\n      invertjump(fs, e);\n      pc = e->u.info;\n      break;\n    }\n    case VK: case VKFLT: case VKINT: case VTRUE: {\n      pc = NO_JUMP;  /* always true; do nothing */\n      break;\n    }\n    default: {\n      pc = jumponcond(fs, e, 0);\n      break;\n    }\n  }\n  luaK_concat(fs, &e->f, pc);  /* insert last jump in 'f' list */\n  luaK_patchtohere(fs, e->t);\n  e->t = NO_JUMP;\n}\n\n\nvoid luaK_goiffalse (FuncState *fs, expdesc *e) {\n  int pc;  /* pc of last jump */\n  luaK_dischargevars(fs, e);\n  switch (e->k) {\n    case VJMP: {\n      pc = e->u.info;\n      break;\n    }\n    case VNIL: case VFALSE: {\n      pc = NO_JUMP;  /* always false; do nothing */\n      break;\n    }\n    default: {\n      pc = jumponcond(fs, e, 1);\n      break;\n    }\n  }\n  luaK_concat(fs, &e->t, pc);  /* insert last jump in 't' list */\n  luaK_patchtohere(fs, e->f);\n  e->f = NO_JUMP;\n}\n\n\nstatic void codenot (FuncState *fs, expdesc *e) {\n  luaK_dischargevars(fs, e);\n  switch (e->k) {\n    case VNIL: case VFALSE: {\n      e->k = VTRUE;\n      break;\n    }\n    case VK: case VKFLT: case VKINT: case VTRUE: {\n      e->k = VFALSE;\n      break;\n    }\n    case VJMP: {\n      invertjump(fs, e);\n      break;\n    }\n    case VRELOCABLE:\n    case VNONRELOC: {\n      discharge2anyreg(fs, e);\n      freeexp(fs, e);\n      e->u.info = luaK_codeABC(fs, OP_NOT, 0, e->u.info, 0);\n      e->k = VRELOCABLE;\n      break;\n    }\n    default: {\n      lua_assert(0);  /* cannot happen */\n      break;\n    }\n  }\n  /* interchange true and false lists */\n  { int temp = e->f; e->f = e->t; e->t = temp; }\n  removevalues(fs, e->f);\n  removevalues(fs, e->t);\n}\n\n\nvoid luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {\n  lua_assert(!hasjumps(t));\n  t->u.ind.t = t->u.info;\n  t->u.ind.idx = luaK_exp2RK(fs, k);\n  t->u.ind.vt = (t->k == VUPVAL) ? VUPVAL\n                                 : check_exp(vkisinreg(t->k), VLOCAL);\n  t->k = VINDEXED;\n}\n\n\n/*\n** return false if folding can raise an error\n*/\nstatic int validop (int op, TValue *v1, TValue *v2) {\n  switch (op) {\n    case LUA_OPBAND: case LUA_OPBOR: case LUA_OPBXOR:\n    case LUA_OPSHL: case LUA_OPSHR: case LUA_OPBNOT: {  /* conversion errors */\n      lua_Integer i;\n      return (tointeger(v1, &i) && tointeger(v2, &i));\n    }\n    case LUA_OPDIV: case LUA_OPIDIV: case LUA_OPMOD:  /* division by 0 */\n      return (nvalue(v2) != 0);\n    default: return 1;  /* everything else is valid */\n  }\n}\n\n\n/*\n** Try to \"constant-fold\" an operation; return 1 iff successful\n*/\nstatic int constfolding (FuncState *fs, int op, expdesc *e1, expdesc *e2) {\n  TValue v1, v2, res;\n  if (!tonumeral(e1, &v1) || !tonumeral(e2, &v2) || !validop(op, &v1, &v2))\n    return 0;  /* non-numeric operands or not safe to fold */\n  luaO_arith(fs->ls->L, op, &v1, &v2, &res);  /* does operation */\n  if (ttisinteger(&res)) {\n    e1->k = VKINT;\n    e1->u.ival = ivalue(&res);\n  }\n  else {  /* folds neither NaN nor 0.0 (to avoid collapsing with -0.0) */\n    lua_Number n = fltvalue(&res);\n    if (luai_numisnan(n) || n == 0)\n      return 0;\n    e1->k = VKFLT;\n    e1->u.nval = n;\n  }\n  return 1;\n}\n\n\n/*\n** Code for binary and unary expressions that \"produce values\"\n** (arithmetic operations, bitwise operations, concat, length). First\n** try to do constant folding (only for numeric [arithmetic and\n** bitwise] operations, which is what 'lua_arith' accepts).\n** Expression to produce final result will be encoded in 'e1'.\n*/\nstatic void codeexpval (FuncState *fs, OpCode op,\n                        expdesc *e1, expdesc *e2, int line) {\n  lua_assert(op >= OP_ADD);\n  if (op <= OP_BNOT && constfolding(fs, op - OP_ADD + LUA_OPADD, e1, e2))\n    return;  /* result has been folded */\n  else {\n    int o1, o2;\n    /* move operands to registers (if needed) */\n    if (op == OP_UNM || op == OP_BNOT || op == OP_LEN) {  /* unary op? */\n      o2 = 0;  /* no second expression */\n      o1 = luaK_exp2anyreg(fs, e1);  /* cannot operate on constants */\n    }\n    else {  /* regular case (binary operators) */\n      o2 = luaK_exp2RK(fs, e2);  /* both operands are \"RK\" */\n      o1 = luaK_exp2RK(fs, e1);\n    }\n    if (o1 > o2) {  /* free registers in proper order */\n      freeexp(fs, e1);\n      freeexp(fs, e2);\n    }\n    else {\n      freeexp(fs, e2);\n      freeexp(fs, e1);\n    }\n    e1->u.info = luaK_codeABC(fs, op, 0, o1, o2);  /* generate opcode */\n    e1->k = VRELOCABLE;  /* all those operations are relocable */\n    luaK_fixline(fs, line);\n  }\n}\n\n\nstatic void codecomp (FuncState *fs, OpCode op, int cond, expdesc *e1,\n                                                          expdesc *e2) {\n  int o1 = luaK_exp2RK(fs, e1);\n  int o2 = luaK_exp2RK(fs, e2);\n  freeexp(fs, e2);\n  freeexp(fs, e1);\n  if (cond == 0 && op != OP_EQ) {\n    int temp;  /* exchange args to replace by '<' or '<=' */\n    temp = o1; o1 = o2; o2 = temp;  /* o1 <==> o2 */\n    cond = 1;\n  }\n  e1->u.info = condjump(fs, op, cond, o1, o2);\n  e1->k = VJMP;\n}\n\n\nvoid luaK_prefix (FuncState *fs, UnOpr op, expdesc *e, int line) {\n  expdesc e2;\n  e2.t = e2.f = NO_JUMP; e2.k = VKINT; e2.u.ival = 0;\n  switch (op) {\n    case OPR_MINUS: case OPR_BNOT: case OPR_LEN: {\n      codeexpval(fs, cast(OpCode, (op - OPR_MINUS) + OP_UNM), e, &e2, line);\n      break;\n    }\n    case OPR_NOT: codenot(fs, e); break;\n    default: lua_assert(0);\n  }\n}\n\n\nvoid luaK_infix (FuncState *fs, BinOpr op, expdesc *v) {\n  switch (op) {\n    case OPR_AND: {\n      luaK_goiftrue(fs, v);\n      break;\n    }\n    case OPR_OR: {\n      luaK_goiffalse(fs, v);\n      break;\n    }\n    case OPR_CONCAT: {\n      luaK_exp2nextreg(fs, v);  /* operand must be on the 'stack' */\n      break;\n    }\n    case OPR_ADD: case OPR_SUB:\n    case OPR_MUL: case OPR_DIV: case OPR_IDIV:\n    case OPR_MOD: case OPR_POW:\n    case OPR_BAND: case OPR_BOR: case OPR_BXOR:\n    case OPR_SHL: case OPR_SHR: {\n      if (!tonumeral(v, NULL)) luaK_exp2RK(fs, v);\n      break;\n    }\n    default: {\n      luaK_exp2RK(fs, v);\n      break;\n    }\n  }\n}\n\n\nvoid luaK_posfix (FuncState *fs, BinOpr op,\n                  expdesc *e1, expdesc *e2, int line) {\n  switch (op) {\n    case OPR_AND: {\n      lua_assert(e1->t == NO_JUMP);  /* list must be closed */\n      luaK_dischargevars(fs, e2);\n      luaK_concat(fs, &e2->f, e1->f);\n      *e1 = *e2;\n      break;\n    }\n    case OPR_OR: {\n      lua_assert(e1->f == NO_JUMP);  /* list must be closed */\n      luaK_dischargevars(fs, e2);\n      luaK_concat(fs, &e2->t, e1->t);\n      *e1 = *e2;\n      break;\n    }\n    case OPR_CONCAT: {\n      luaK_exp2val(fs, e2);\n      if (e2->k == VRELOCABLE && GET_OPCODE(getcode(fs, e2)) == OP_CONCAT) {\n        lua_assert(e1->u.info == GETARG_B(getcode(fs, e2))-1);\n        freeexp(fs, e1);\n        SETARG_B(getcode(fs, e2), e1->u.info);\n        e1->k = VRELOCABLE; e1->u.info = e2->u.info;\n      }\n      else {\n        luaK_exp2nextreg(fs, e2);  /* operand must be on the 'stack' */\n        codeexpval(fs, OP_CONCAT, e1, e2, line);\n      }\n      break;\n    }\n    case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV:\n    case OPR_IDIV: case OPR_MOD: case OPR_POW:\n    case OPR_BAND: case OPR_BOR: case OPR_BXOR:\n    case OPR_SHL: case OPR_SHR: {\n      codeexpval(fs, cast(OpCode, (op - OPR_ADD) + OP_ADD), e1, e2, line);\n      break;\n    }\n    case OPR_EQ: case OPR_LT: case OPR_LE: {\n      codecomp(fs, cast(OpCode, op - OPR_EQ + OP_EQ), 1, e1, e2);\n      break;\n    }\n    case OPR_NE: case OPR_GT: case OPR_GE: {\n      codecomp(fs, cast(OpCode, op - OPR_NE + OP_EQ), 0, e1, e2);\n      break;\n    }\n    default: lua_assert(0);\n  }\n}\n\n\nvoid luaK_fixline (FuncState *fs, int line) {\n  fs->f->lineinfo[fs->pc - 1] = line;\n}\n\n\nvoid luaK_setlist (FuncState *fs, int base, int nelems, int tostore) {\n  int c =  (nelems - 1)/LFIELDS_PER_FLUSH + 1;\n  int b = (tostore == LUA_MULTRET) ? 0 : tostore;\n  lua_assert(tostore != 0);\n  if (c <= MAXARG_C)\n    luaK_codeABC(fs, OP_SETLIST, base, b, c);\n  else if (c <= MAXARG_Ax) {\n    luaK_codeABC(fs, OP_SETLIST, base, b, 0);\n    codeextraarg(fs, c);\n  }\n  else\n    luaX_syntaxerror(fs->ls, \"constructor too long\");\n  fs->freereg = base + 1;  /* free registers with list values */\n}\n\n"
  },
  {
    "path": "externals/lua/src/lcode.h",
    "content": "/*\n** $Id: lcode.h,v 1.63 2013/12/30 20:47:58 roberto Exp $\n** Code generator for Lua\n** See Copyright Notice in lua.h\n*/\n\n#ifndef lcode_h\n#define lcode_h\n\n#include \"llex.h\"\n#include \"lobject.h\"\n#include \"lopcodes.h\"\n#include \"lparser.h\"\n\n\n/*\n** Marks the end of a patch list. It is an invalid value both as an absolute\n** address, and as a list link (would link an element to itself).\n*/\n#define NO_JUMP (-1)\n\n\n/*\n** grep \"ORDER OPR\" if you change these enums  (ORDER OP)\n*/\ntypedef enum BinOpr {\n  OPR_ADD, OPR_SUB, OPR_MUL, OPR_MOD, OPR_POW,\n  OPR_DIV,\n  OPR_IDIV,\n  OPR_BAND, OPR_BOR, OPR_BXOR,\n  OPR_SHL, OPR_SHR,\n  OPR_CONCAT,\n  OPR_EQ, OPR_LT, OPR_LE,\n  OPR_NE, OPR_GT, OPR_GE,\n  OPR_AND, OPR_OR,\n  OPR_NOBINOPR\n} BinOpr;\n\n\ntypedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;\n\n\n#define getcode(fs,e)\t((fs)->f->code[(e)->u.info])\n\n#define luaK_codeAsBx(fs,o,A,sBx)\tluaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx)\n\n#define luaK_setmultret(fs,e)\tluaK_setreturns(fs, e, LUA_MULTRET)\n\n#define luaK_jumpto(fs,t)\tluaK_patchlist(fs, luaK_jump(fs), t)\n\nLUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx);\nLUAI_FUNC int luaK_codeABC (FuncState *fs, OpCode o, int A, int B, int C);\nLUAI_FUNC int luaK_codek (FuncState *fs, int reg, int k);\nLUAI_FUNC void luaK_fixline (FuncState *fs, int line);\nLUAI_FUNC void luaK_nil (FuncState *fs, int from, int n);\nLUAI_FUNC void luaK_reserveregs (FuncState *fs, int n);\nLUAI_FUNC void luaK_checkstack (FuncState *fs, int n);\nLUAI_FUNC int luaK_stringK (FuncState *fs, TString *s);\nLUAI_FUNC int luaK_intK (FuncState *fs, lua_Integer n);\nLUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e);\nLUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e);\nLUAI_FUNC void luaK_exp2anyregup (FuncState *fs, expdesc *e);\nLUAI_FUNC void luaK_exp2nextreg (FuncState *fs, expdesc *e);\nLUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e);\nLUAI_FUNC int luaK_exp2RK (FuncState *fs, expdesc *e);\nLUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key);\nLUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k);\nLUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e);\nLUAI_FUNC void luaK_goiffalse (FuncState *fs, expdesc *e);\nLUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e);\nLUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults);\nLUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e);\nLUAI_FUNC int luaK_jump (FuncState *fs);\nLUAI_FUNC void luaK_ret (FuncState *fs, int first, int nret);\nLUAI_FUNC void luaK_patchlist (FuncState *fs, int list, int target);\nLUAI_FUNC void luaK_patchtohere (FuncState *fs, int list);\nLUAI_FUNC void luaK_patchclose (FuncState *fs, int list, int level);\nLUAI_FUNC void luaK_concat (FuncState *fs, int *l1, int l2);\nLUAI_FUNC int luaK_getlabel (FuncState *fs);\nLUAI_FUNC void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v, int line);\nLUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v);\nLUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1,\n                            expdesc *v2, int line);\nLUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore);\n\n\n#endif\n"
  },
  {
    "path": "externals/lua/src/lcorolib.c",
    "content": "/*\n** $Id: lcorolib.c,v 1.9 2014/11/02 19:19:04 roberto Exp $\n** Coroutine Library\n** See Copyright Notice in lua.h\n*/\n\n#define lcorolib_c\n#define LUA_LIB\n\n#include \"lprefix.h\"\n\n\n#include <stdlib.h>\n\n#include \"lua.h\"\n\n#include \"lauxlib.h\"\n#include \"lualib.h\"\n\n\nstatic lua_State *getco (lua_State *L) {\n  lua_State *co = lua_tothread(L, 1);\n  luaL_argcheck(L, co, 1, \"thread expected\");\n  return co;\n}\n\n\nstatic int auxresume (lua_State *L, lua_State *co, int narg) {\n  int status;\n  if (!lua_checkstack(co, narg)) {\n    lua_pushliteral(L, \"too many arguments to resume\");\n    return -1;  /* error flag */\n  }\n  if (lua_status(co) == LUA_OK && lua_gettop(co) == 0) {\n    lua_pushliteral(L, \"cannot resume dead coroutine\");\n    return -1;  /* error flag */\n  }\n  lua_xmove(L, co, narg);\n  status = lua_resume(co, L, narg);\n  if (status == LUA_OK || status == LUA_YIELD) {\n    int nres = lua_gettop(co);\n    if (!lua_checkstack(L, nres + 1)) {\n      lua_pop(co, nres);  /* remove results anyway */\n      lua_pushliteral(L, \"too many results to resume\");\n      return -1;  /* error flag */\n    }\n    lua_xmove(co, L, nres);  /* move yielded values */\n    return nres;\n  }\n  else {\n    lua_xmove(co, L, 1);  /* move error message */\n    return -1;  /* error flag */\n  }\n}\n\n\nstatic int luaB_coresume (lua_State *L) {\n  lua_State *co = getco(L);\n  int r;\n  r = auxresume(L, co, lua_gettop(L) - 1);\n  if (r < 0) {\n    lua_pushboolean(L, 0);\n    lua_insert(L, -2);\n    return 2;  /* return false + error message */\n  }\n  else {\n    lua_pushboolean(L, 1);\n    lua_insert(L, -(r + 1));\n    return r + 1;  /* return true + 'resume' returns */\n  }\n}\n\n\nstatic int luaB_auxwrap (lua_State *L) {\n  lua_State *co = lua_tothread(L, lua_upvalueindex(1));\n  int r = auxresume(L, co, lua_gettop(L));\n  if (r < 0) {\n    if (lua_isstring(L, -1)) {  /* error object is a string? */\n      luaL_where(L, 1);  /* add extra info */\n      lua_insert(L, -2);\n      lua_concat(L, 2);\n    }\n    return lua_error(L);  /* propagate error */\n  }\n  return r;\n}\n\n\nstatic int luaB_cocreate (lua_State *L) {\n  lua_State *NL;\n  luaL_checktype(L, 1, LUA_TFUNCTION);\n  NL = lua_newthread(L);\n  lua_pushvalue(L, 1);  /* move function to top */\n  lua_xmove(L, NL, 1);  /* move function from L to NL */\n  return 1;\n}\n\n\nstatic int luaB_cowrap (lua_State *L) {\n  luaB_cocreate(L);\n  lua_pushcclosure(L, luaB_auxwrap, 1);\n  return 1;\n}\n\n\nstatic int luaB_yield (lua_State *L) {\n  return lua_yield(L, lua_gettop(L));\n}\n\n\nstatic int luaB_costatus (lua_State *L) {\n  lua_State *co = getco(L);\n  if (L == co) lua_pushliteral(L, \"running\");\n  else {\n    switch (lua_status(co)) {\n      case LUA_YIELD:\n        lua_pushliteral(L, \"suspended\");\n        break;\n      case LUA_OK: {\n        lua_Debug ar;\n        if (lua_getstack(co, 0, &ar) > 0)  /* does it have frames? */\n          lua_pushliteral(L, \"normal\");  /* it is running */\n        else if (lua_gettop(co) == 0)\n            lua_pushliteral(L, \"dead\");\n        else\n          lua_pushliteral(L, \"suspended\");  /* initial state */\n        break;\n      }\n      default:  /* some error occurred */\n        lua_pushliteral(L, \"dead\");\n        break;\n    }\n  }\n  return 1;\n}\n\n\nstatic int luaB_yieldable (lua_State *L) {\n  lua_pushboolean(L, lua_isyieldable(L));\n  return 1;\n}\n\n\nstatic int luaB_corunning (lua_State *L) {\n  int ismain = lua_pushthread(L);\n  lua_pushboolean(L, ismain);\n  return 2;\n}\n\n\nstatic const luaL_Reg co_funcs[] = {\n  {\"create\", luaB_cocreate},\n  {\"resume\", luaB_coresume},\n  {\"running\", luaB_corunning},\n  {\"status\", luaB_costatus},\n  {\"wrap\", luaB_cowrap},\n  {\"yield\", luaB_yield},\n  {\"isyieldable\", luaB_yieldable},\n  {NULL, NULL}\n};\n\n\n\nLUAMOD_API int luaopen_coroutine (lua_State *L) {\n  luaL_newlib(L, co_funcs);\n  return 1;\n}\n\n"
  },
  {
    "path": "externals/lua/src/lctype.c",
    "content": "/*\n** $Id: lctype.c,v 1.12 2014/11/02 19:19:04 roberto Exp $\n** 'ctype' functions for Lua\n** See Copyright Notice in lua.h\n*/\n\n#define lctype_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include \"lctype.h\"\n\n#if !LUA_USE_CTYPE\t/* { */\n\n#include <limits.h>\n\nLUAI_DDEF const lu_byte luai_ctype_[UCHAR_MAX + 2] = {\n  0x00,  /* EOZ */\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\t/* 0. */\n  0x00,  0x08,  0x08,  0x08,  0x08,  0x08,  0x00,  0x00,\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\t/* 1. */\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\n  0x0c,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,\t/* 2. */\n  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,\n  0x16,  0x16,  0x16,  0x16,  0x16,  0x16,  0x16,  0x16,\t/* 3. */\n  0x16,  0x16,  0x04,  0x04,  0x04,  0x04,  0x04,  0x04,\n  0x04,  0x15,  0x15,  0x15,  0x15,  0x15,  0x15,  0x05,\t/* 4. */\n  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,\n  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,\t/* 5. */\n  0x05,  0x05,  0x05,  0x04,  0x04,  0x04,  0x04,  0x05,\n  0x04,  0x15,  0x15,  0x15,  0x15,  0x15,  0x15,  0x05,\t/* 6. */\n  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,\n  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,  0x05,\t/* 7. */\n  0x05,  0x05,  0x05,  0x04,  0x04,  0x04,  0x04,  0x00,\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\t/* 8. */\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\t/* 9. */\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\t/* a. */\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\t/* b. */\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\t/* c. */\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\t/* d. */\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\t/* e. */\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\t/* f. */\n  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,\n};\n\n#endif\t\t\t/* } */\n"
  },
  {
    "path": "externals/lua/src/lctype.h",
    "content": "/*\n** $Id: lctype.h,v 1.12 2011/07/15 12:50:29 roberto Exp $\n** 'ctype' functions for Lua\n** See Copyright Notice in lua.h\n*/\n\n#ifndef lctype_h\n#define lctype_h\n\n#include \"lua.h\"\n\n\n/*\n** WARNING: the functions defined here do not necessarily correspond\n** to the similar functions in the standard C ctype.h. They are\n** optimized for the specific needs of Lua\n*/\n\n#if !defined(LUA_USE_CTYPE)\n\n#if 'A' == 65 && '0' == 48\n/* ASCII case: can use its own tables; faster and fixed */\n#define LUA_USE_CTYPE\t0\n#else\n/* must use standard C ctype */\n#define LUA_USE_CTYPE\t1\n#endif\n\n#endif\n\n\n#if !LUA_USE_CTYPE\t/* { */\n\n#include <limits.h>\n\n#include \"llimits.h\"\n\n\n#define ALPHABIT\t0\n#define DIGITBIT\t1\n#define PRINTBIT\t2\n#define SPACEBIT\t3\n#define XDIGITBIT\t4\n\n\n#define MASK(B)\t\t(1 << (B))\n\n\n/*\n** add 1 to char to allow index -1 (EOZ)\n*/\n#define testprop(c,p)\t(luai_ctype_[(c)+1] & (p))\n\n/*\n** 'lalpha' (Lua alphabetic) and 'lalnum' (Lua alphanumeric) both include '_'\n*/\n#define lislalpha(c)\ttestprop(c, MASK(ALPHABIT))\n#define lislalnum(c)\ttestprop(c, (MASK(ALPHABIT) | MASK(DIGITBIT)))\n#define lisdigit(c)\ttestprop(c, MASK(DIGITBIT))\n#define lisspace(c)\ttestprop(c, MASK(SPACEBIT))\n#define lisprint(c)\ttestprop(c, MASK(PRINTBIT))\n#define lisxdigit(c)\ttestprop(c, MASK(XDIGITBIT))\n\n/*\n** this 'ltolower' only works for alphabetic characters\n*/\n#define ltolower(c)\t((c) | ('A' ^ 'a'))\n\n\n/* two more entries for 0 and -1 (EOZ) */\nLUAI_DDEC const lu_byte luai_ctype_[UCHAR_MAX + 2];\n\n\n#else\t\t\t/* }{ */\n\n/*\n** use standard C ctypes\n*/\n\n#include <ctype.h>\n\n\n#define lislalpha(c)\t(isalpha(c) || (c) == '_')\n#define lislalnum(c)\t(isalnum(c) || (c) == '_')\n#define lisdigit(c)\t(isdigit(c))\n#define lisspace(c)\t(isspace(c))\n#define lisprint(c)\t(isprint(c))\n#define lisxdigit(c)\t(isxdigit(c))\n\n#define ltolower(c)\t(tolower(c))\n\n#endif\t\t\t/* } */\n\n#endif\n\n"
  },
  {
    "path": "externals/lua/src/ldblib.c",
    "content": "/*\n** $Id: ldblib.c,v 1.148 2015/01/02 12:52:22 roberto Exp $\n** Interface from Lua to its debug API\n** See Copyright Notice in lua.h\n*/\n\n#define ldblib_c\n#define LUA_LIB\n\n#include \"lprefix.h\"\n\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"lauxlib.h\"\n#include \"lualib.h\"\n\n\n/*\n** The hook table at registry[&HOOKKEY] maps threads to their current\n** hook function. (We only need the unique address of 'HOOKKEY'.)\n*/\nstatic const int HOOKKEY = 0;\n\n\nstatic int db_getregistry (lua_State *L) {\n  lua_pushvalue(L, LUA_REGISTRYINDEX);\n  return 1;\n}\n\n\nstatic int db_getmetatable (lua_State *L) {\n  luaL_checkany(L, 1);\n  if (!lua_getmetatable(L, 1)) {\n    lua_pushnil(L);  /* no metatable */\n  }\n  return 1;\n}\n\n\nstatic int db_setmetatable (lua_State *L) {\n  int t = lua_type(L, 2);\n  luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2,\n                    \"nil or table expected\");\n  lua_settop(L, 2);\n  lua_setmetatable(L, 1);\n  return 1;  /* return 1st argument */\n}\n\n\nstatic int db_getuservalue (lua_State *L) {\n  if (lua_type(L, 1) != LUA_TUSERDATA)\n    lua_pushnil(L);\n  else\n    lua_getuservalue(L, 1);\n  return 1;\n}\n\n\nstatic int db_setuservalue (lua_State *L) {\n  luaL_checktype(L, 1, LUA_TUSERDATA);\n  luaL_checkany(L, 2);\n  lua_settop(L, 2);\n  lua_setuservalue(L, 1);\n  return 1;\n}\n\n\n/*\n** Auxiliary function used by several library functions: check for\n** an optional thread as function's first argument and set 'arg' with\n** 1 if this argument is present (so that functions can skip it to\n** access their other arguments)\n*/\nstatic lua_State *getthread (lua_State *L, int *arg) {\n  if (lua_isthread(L, 1)) {\n    *arg = 1;\n    return lua_tothread(L, 1);\n  }\n  else {\n    *arg = 0;\n    return L;  /* function will operate over current thread */\n  }\n}\n\n\n/*\n** Variations of 'lua_settable', used by 'db_getinfo' to put results\n** from 'lua_getinfo' into result table. Key is always a string;\n** value can be a string, an int, or a boolean.\n*/\nstatic void settabss (lua_State *L, const char *k, const char *v) {\n  lua_pushstring(L, v);\n  lua_setfield(L, -2, k);\n}\n\nstatic void settabsi (lua_State *L, const char *k, int v) {\n  lua_pushinteger(L, v);\n  lua_setfield(L, -2, k);\n}\n\nstatic void settabsb (lua_State *L, const char *k, int v) {\n  lua_pushboolean(L, v);\n  lua_setfield(L, -2, k);\n}\n\n\n/*\n** In function 'db_getinfo', the call to 'lua_getinfo' may push\n** results on the stack; later it creates the result table to put\n** these objects. Function 'treatstackoption' puts the result from\n** 'lua_getinfo' on top of the result table so that it can call\n** 'lua_setfield'.\n*/\nstatic void treatstackoption (lua_State *L, lua_State *L1, const char *fname) {\n  if (L == L1)\n    lua_rotate(L, -2, 1);  /* exchange object and table */\n  else\n    lua_xmove(L1, L, 1);  /* move object to the \"main\" stack */\n  lua_setfield(L, -2, fname);  /* put object into table */\n}\n\n\n/*\n** Calls 'lua_getinfo' and collects all results in a new table.\n*/\nstatic int db_getinfo (lua_State *L) {\n  lua_Debug ar;\n  int arg;\n  lua_State *L1 = getthread(L, &arg);\n  const char *options = luaL_optstring(L, arg+2, \"flnStu\");\n  if (lua_isfunction(L, arg + 1)) {  /* info about a function? */\n    options = lua_pushfstring(L, \">%s\", options);  /* add '>' to 'options' */\n    lua_pushvalue(L, arg + 1);  /* move function to 'L1' stack */\n    lua_xmove(L, L1, 1);\n  }\n  else {  /* stack level */\n    if (!lua_getstack(L1, (int)luaL_checkinteger(L, arg + 1), &ar)) {\n      lua_pushnil(L);  /* level out of range */\n      return 1;\n    }\n  }\n  if (!lua_getinfo(L1, options, &ar))\n    return luaL_argerror(L, arg+2, \"invalid option\");\n  lua_newtable(L);  /* table to collect results */\n  if (strchr(options, 'S')) {\n    settabss(L, \"source\", ar.source);\n    settabss(L, \"short_src\", ar.short_src);\n    settabsi(L, \"linedefined\", ar.linedefined);\n    settabsi(L, \"lastlinedefined\", ar.lastlinedefined);\n    settabss(L, \"what\", ar.what);\n  }\n  if (strchr(options, 'l'))\n    settabsi(L, \"currentline\", ar.currentline);\n  if (strchr(options, 'u')) {\n    settabsi(L, \"nups\", ar.nups);\n    settabsi(L, \"nparams\", ar.nparams);\n    settabsb(L, \"isvararg\", ar.isvararg);\n  }\n  if (strchr(options, 'n')) {\n    settabss(L, \"name\", ar.name);\n    settabss(L, \"namewhat\", ar.namewhat);\n  }\n  if (strchr(options, 't'))\n    settabsb(L, \"istailcall\", ar.istailcall);\n  if (strchr(options, 'L'))\n    treatstackoption(L, L1, \"activelines\");\n  if (strchr(options, 'f'))\n    treatstackoption(L, L1, \"func\");\n  return 1;  /* return table */\n}\n\n\nstatic int db_getlocal (lua_State *L) {\n  int arg;\n  lua_State *L1 = getthread(L, &arg);\n  lua_Debug ar;\n  const char *name;\n  int nvar = (int)luaL_checkinteger(L, arg + 2);  /* local-variable index */\n  if (lua_isfunction(L, arg + 1)) {  /* function argument? */\n    lua_pushvalue(L, arg + 1);  /* push function */\n    lua_pushstring(L, lua_getlocal(L, NULL, nvar));  /* push local name */\n    return 1;  /* return only name (there is no value) */\n  }\n  else {  /* stack-level argument */\n    int level = (int)luaL_checkinteger(L, arg + 1);\n    if (!lua_getstack(L1, level, &ar))  /* out of range? */\n      return luaL_argerror(L, arg+1, \"level out of range\");\n    name = lua_getlocal(L1, &ar, nvar);\n    if (name) {\n      lua_xmove(L1, L, 1);  /* move local value */\n      lua_pushstring(L, name);  /* push name */\n      lua_rotate(L, -2, 1);  /* re-order */\n      return 2;\n    }\n    else {\n      lua_pushnil(L);  /* no name (nor value) */\n      return 1;\n    }\n  }\n}\n\n\nstatic int db_setlocal (lua_State *L) {\n  int arg;\n  const char *name;\n  lua_State *L1 = getthread(L, &arg);\n  lua_Debug ar;\n  int level = (int)luaL_checkinteger(L, arg + 1);\n  int nvar = (int)luaL_checkinteger(L, arg + 2);\n  if (!lua_getstack(L1, level, &ar))  /* out of range? */\n    return luaL_argerror(L, arg+1, \"level out of range\");\n  luaL_checkany(L, arg+3);\n  lua_settop(L, arg+3);\n  lua_xmove(L, L1, 1);\n  name = lua_setlocal(L1, &ar, nvar);\n  if (name == NULL)\n    lua_pop(L1, 1);  /* pop value (if not popped by 'lua_setlocal') */\n  lua_pushstring(L, name);\n  return 1;\n}\n\n\n/*\n** get (if 'get' is true) or set an upvalue from a closure\n*/\nstatic int auxupvalue (lua_State *L, int get) {\n  const char *name;\n  int n = (int)luaL_checkinteger(L, 2);  /* upvalue index */\n  luaL_checktype(L, 1, LUA_TFUNCTION);  /* closure */\n  name = get ? lua_getupvalue(L, 1, n) : lua_setupvalue(L, 1, n);\n  if (name == NULL) return 0;\n  lua_pushstring(L, name);\n  lua_insert(L, -(get+1));  /* no-op if get is false */\n  return get + 1;\n}\n\n\nstatic int db_getupvalue (lua_State *L) {\n  return auxupvalue(L, 1);\n}\n\n\nstatic int db_setupvalue (lua_State *L) {\n  luaL_checkany(L, 3);\n  return auxupvalue(L, 0);\n}\n\n\n/*\n** Check whether a given upvalue from a given closure exists and\n** returns its index\n*/\nstatic int checkupval (lua_State *L, int argf, int argnup) {\n  int nup = (int)luaL_checkinteger(L, argnup);  /* upvalue index */\n  luaL_checktype(L, argf, LUA_TFUNCTION);  /* closure */\n  luaL_argcheck(L, (lua_getupvalue(L, argf, nup) != NULL), argnup,\n                   \"invalid upvalue index\");\n  return nup;\n}\n\n\nstatic int db_upvalueid (lua_State *L) {\n  int n = checkupval(L, 1, 2);\n  lua_pushlightuserdata(L, lua_upvalueid(L, 1, n));\n  return 1;\n}\n\n\nstatic int db_upvaluejoin (lua_State *L) {\n  int n1 = checkupval(L, 1, 2);\n  int n2 = checkupval(L, 3, 4);\n  luaL_argcheck(L, !lua_iscfunction(L, 1), 1, \"Lua function expected\");\n  luaL_argcheck(L, !lua_iscfunction(L, 3), 3, \"Lua function expected\");\n  lua_upvaluejoin(L, 1, n1, 3, n2);\n  return 0;\n}\n\n\n/*\n** Call hook function registered at hook table for the current\n** thread (if there is one)\n*/\nstatic void hookf (lua_State *L, lua_Debug *ar) {\n  static const char *const hooknames[] =\n    {\"call\", \"return\", \"line\", \"count\", \"tail call\"};\n  lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY);\n  lua_pushthread(L);\n  if (lua_rawget(L, -2) == LUA_TFUNCTION) {  /* is there a hook function? */\n    lua_pushstring(L, hooknames[(int)ar->event]);  /* push event name */\n    if (ar->currentline >= 0)\n      lua_pushinteger(L, ar->currentline);  /* push current line */\n    else lua_pushnil(L);\n    lua_assert(lua_getinfo(L, \"lS\", ar));\n    lua_call(L, 2, 0);  /* call hook function */\n  }\n}\n\n\n/*\n** Convert a string mask (for 'sethook') into a bit mask\n*/\nstatic int makemask (const char *smask, int count) {\n  int mask = 0;\n  if (strchr(smask, 'c')) mask |= LUA_MASKCALL;\n  if (strchr(smask, 'r')) mask |= LUA_MASKRET;\n  if (strchr(smask, 'l')) mask |= LUA_MASKLINE;\n  if (count > 0) mask |= LUA_MASKCOUNT;\n  return mask;\n}\n\n\n/*\n** Convert a bit mask (for 'gethook') into a string mask\n*/\nstatic char *unmakemask (int mask, char *smask) {\n  int i = 0;\n  if (mask & LUA_MASKCALL) smask[i++] = 'c';\n  if (mask & LUA_MASKRET) smask[i++] = 'r';\n  if (mask & LUA_MASKLINE) smask[i++] = 'l';\n  smask[i] = '\\0';\n  return smask;\n}\n\n\nstatic int db_sethook (lua_State *L) {\n  int arg, mask, count;\n  lua_Hook func;\n  lua_State *L1 = getthread(L, &arg);\n  if (lua_isnoneornil(L, arg+1)) {  /* no hook? */\n    lua_settop(L, arg+1);\n    func = NULL; mask = 0; count = 0;  /* turn off hooks */\n  }\n  else {\n    const char *smask = luaL_checkstring(L, arg+2);\n    luaL_checktype(L, arg+1, LUA_TFUNCTION);\n    count = (int)luaL_optinteger(L, arg + 3, 0);\n    func = hookf; mask = makemask(smask, count);\n  }\n  if (lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY) == LUA_TNIL) {\n    lua_createtable(L, 0, 2);  /* create a hook table */\n    lua_pushvalue(L, -1);\n    lua_rawsetp(L, LUA_REGISTRYINDEX, &HOOKKEY);  /* set it in position */\n    lua_pushstring(L, \"k\");\n    lua_setfield(L, -2, \"__mode\");  /** hooktable.__mode = \"k\" */\n    lua_pushvalue(L, -1);\n    lua_setmetatable(L, -2);  /* setmetatable(hooktable) = hooktable */\n  }\n  lua_pushthread(L1); lua_xmove(L1, L, 1);  /* key (thread) */\n  lua_pushvalue(L, arg + 1);  /* value (hook function) */\n  lua_rawset(L, -3);  /* hooktable[L1] = new Lua hook */\n  lua_sethook(L1, func, mask, count);\n  return 0;\n}\n\n\nstatic int db_gethook (lua_State *L) {\n  int arg;\n  lua_State *L1 = getthread(L, &arg);\n  char buff[5];\n  int mask = lua_gethookmask(L1);\n  lua_Hook hook = lua_gethook(L1);\n  if (hook == NULL)  /* no hook? */\n    lua_pushnil(L);\n  else if (hook != hookf)  /* external hook? */\n    lua_pushliteral(L, \"external hook\");\n  else {  /* hook table must exist */\n    lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY);\n    lua_pushthread(L1); lua_xmove(L1, L, 1);\n    lua_rawget(L, -2);   /* 1st result = hooktable[L1] */\n    lua_remove(L, -2);  /* remove hook table */\n  }\n  lua_pushstring(L, unmakemask(mask, buff));  /* 2nd result = mask */\n  lua_pushinteger(L, lua_gethookcount(L1));  /* 3rd result = count */\n  return 3;\n}\n\n\nstatic int db_debug (lua_State *L) {\n  for (;;) {\n    char buffer[250];\n    lua_writestringerror(\"%s\", \"lua_debug> \");\n    if (fgets(buffer, sizeof(buffer), stdin) == 0 ||\n        strcmp(buffer, \"cont\\n\") == 0)\n      return 0;\n    if (luaL_loadbuffer(L, buffer, strlen(buffer), \"=(debug command)\") ||\n        lua_pcall(L, 0, 0, 0))\n      lua_writestringerror(\"%s\\n\", lua_tostring(L, -1));\n    lua_settop(L, 0);  /* remove eventual returns */\n  }\n}\n\n\nstatic int db_traceback (lua_State *L) {\n  int arg;\n  lua_State *L1 = getthread(L, &arg);\n  const char *msg = lua_tostring(L, arg + 1);\n  if (msg == NULL && !lua_isnoneornil(L, arg + 1))  /* non-string 'msg'? */\n    lua_pushvalue(L, arg + 1);  /* return it untouched */\n  else {\n    int level = (int)luaL_optinteger(L, arg + 2, (L == L1) ? 1 : 0);\n    luaL_traceback(L, L1, msg, level);\n  }\n  return 1;\n}\n\n\nstatic const luaL_Reg dblib[] = {\n  {\"debug\", db_debug},\n  {\"getuservalue\", db_getuservalue},\n  {\"gethook\", db_gethook},\n  {\"getinfo\", db_getinfo},\n  {\"getlocal\", db_getlocal},\n  {\"getregistry\", db_getregistry},\n  {\"getmetatable\", db_getmetatable},\n  {\"getupvalue\", db_getupvalue},\n  {\"upvaluejoin\", db_upvaluejoin},\n  {\"upvalueid\", db_upvalueid},\n  {\"setuservalue\", db_setuservalue},\n  {\"sethook\", db_sethook},\n  {\"setlocal\", db_setlocal},\n  {\"setmetatable\", db_setmetatable},\n  {\"setupvalue\", db_setupvalue},\n  {\"traceback\", db_traceback},\n  {NULL, NULL}\n};\n\n\nLUAMOD_API int luaopen_debug (lua_State *L) {\n  luaL_newlib(L, dblib);\n  return 1;\n}\n\n"
  },
  {
    "path": "externals/lua/src/ldebug.c",
    "content": "/*\n** $Id: ldebug.c,v 2.110 2015/01/02 12:52:22 roberto Exp $\n** Debug Interface\n** See Copyright Notice in lua.h\n*/\n\n#define ldebug_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include <stdarg.h>\n#include <stddef.h>\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"lapi.h\"\n#include \"lcode.h\"\n#include \"ldebug.h\"\n#include \"ldo.h\"\n#include \"lfunc.h\"\n#include \"lobject.h\"\n#include \"lopcodes.h\"\n#include \"lstate.h\"\n#include \"lstring.h\"\n#include \"ltable.h\"\n#include \"ltm.h\"\n#include \"lvm.h\"\n\n\n\n#define noLuaClosure(f)\t\t((f) == NULL || (f)->c.tt == LUA_TCCL)\n\n\nstatic const char *getfuncname (lua_State *L, CallInfo *ci, const char **name);\n\n\nstatic int currentpc (CallInfo *ci) {\n  lua_assert(isLua(ci));\n  return pcRel(ci->u.l.savedpc, ci_func(ci)->p);\n}\n\n\nstatic int currentline (CallInfo *ci) {\n  return getfuncline(ci_func(ci)->p, currentpc(ci));\n}\n\n\n/*\n** this function can be called asynchronous (e.g. during a signal)\n*/\nLUA_API void lua_sethook (lua_State *L, lua_Hook func, int mask, int count) {\n  if (func == NULL || mask == 0) {  /* turn off hooks? */\n    mask = 0;\n    func = NULL;\n  }\n  if (isLua(L->ci))\n    L->oldpc = L->ci->u.l.savedpc;\n  L->hook = func;\n  L->basehookcount = count;\n  resethookcount(L);\n  L->hookmask = cast_byte(mask);\n}\n\n\nLUA_API lua_Hook lua_gethook (lua_State *L) {\n  return L->hook;\n}\n\n\nLUA_API int lua_gethookmask (lua_State *L) {\n  return L->hookmask;\n}\n\n\nLUA_API int lua_gethookcount (lua_State *L) {\n  return L->basehookcount;\n}\n\n\nLUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) {\n  int status;\n  CallInfo *ci;\n  if (level < 0) return 0;  /* invalid (negative) level */\n  lua_lock(L);\n  for (ci = L->ci; level > 0 && ci != &L->base_ci; ci = ci->previous)\n    level--;\n  if (level == 0 && ci != &L->base_ci) {  /* level found? */\n    status = 1;\n    ar->i_ci = ci;\n  }\n  else status = 0;  /* no such level */\n  lua_unlock(L);\n  return status;\n}\n\n\nstatic const char *upvalname (Proto *p, int uv) {\n  TString *s = check_exp(uv < p->sizeupvalues, p->upvalues[uv].name);\n  if (s == NULL) return \"?\";\n  else return getstr(s);\n}\n\n\nstatic const char *findvararg (CallInfo *ci, int n, StkId *pos) {\n  int nparams = clLvalue(ci->func)->p->numparams;\n  if (n >= ci->u.l.base - ci->func - nparams)\n    return NULL;  /* no such vararg */\n  else {\n    *pos = ci->func + nparams + n;\n    return \"(*vararg)\";  /* generic name for any vararg */\n  }\n}\n\n\nstatic const char *findlocal (lua_State *L, CallInfo *ci, int n,\n                              StkId *pos) {\n  const char *name = NULL;\n  StkId base;\n  if (isLua(ci)) {\n    if (n < 0)  /* access to vararg values? */\n      return findvararg(ci, -n, pos);\n    else {\n      base = ci->u.l.base;\n      name = luaF_getlocalname(ci_func(ci)->p, n, currentpc(ci));\n    }\n  }\n  else\n    base = ci->func + 1;\n  if (name == NULL) {  /* no 'standard' name? */\n    StkId limit = (ci == L->ci) ? L->top : ci->next->func;\n    if (limit - base >= n && n > 0)  /* is 'n' inside 'ci' stack? */\n      name = \"(*temporary)\";  /* generic name for any valid slot */\n    else\n      return NULL;  /* no name */\n  }\n  *pos = base + (n - 1);\n  return name;\n}\n\n\nLUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) {\n  const char *name;\n  lua_lock(L);\n  if (ar == NULL) {  /* information about non-active function? */\n    if (!isLfunction(L->top - 1))  /* not a Lua function? */\n      name = NULL;\n    else  /* consider live variables at function start (parameters) */\n      name = luaF_getlocalname(clLvalue(L->top - 1)->p, n, 0);\n  }\n  else {  /* active function; get information through 'ar' */\n    StkId pos = 0;  /* to avoid warnings */\n    name = findlocal(L, ar->i_ci, n, &pos);\n    if (name) {\n      setobj2s(L, L->top, pos);\n      api_incr_top(L);\n    }\n  }\n  lua_unlock(L);\n  return name;\n}\n\n\nLUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) {\n  StkId pos = 0;  /* to avoid warnings */\n  const char *name = findlocal(L, ar->i_ci, n, &pos);\n  lua_lock(L);\n  if (name) {\n    setobjs2s(L, pos, L->top - 1);\n    L->top--;  /* pop value */\n  }\n  lua_unlock(L);\n  return name;\n}\n\n\nstatic void funcinfo (lua_Debug *ar, Closure *cl) {\n  if (noLuaClosure(cl)) {\n    ar->source = \"=[C]\";\n    ar->linedefined = -1;\n    ar->lastlinedefined = -1;\n    ar->what = \"C\";\n  }\n  else {\n    Proto *p = cl->l.p;\n    ar->source = p->source ? getstr(p->source) : \"=?\";\n    ar->linedefined = p->linedefined;\n    ar->lastlinedefined = p->lastlinedefined;\n    ar->what = (ar->linedefined == 0) ? \"main\" : \"Lua\";\n  }\n  luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE);\n}\n\n\nstatic void collectvalidlines (lua_State *L, Closure *f) {\n  if (noLuaClosure(f)) {\n    setnilvalue(L->top);\n    api_incr_top(L);\n  }\n  else {\n    int i;\n    TValue v;\n    int *lineinfo = f->l.p->lineinfo;\n    Table *t = luaH_new(L);  /* new table to store active lines */\n    sethvalue(L, L->top, t);  /* push it on stack */\n    api_incr_top(L);\n    setbvalue(&v, 1);  /* boolean 'true' to be the value of all indices */\n    for (i = 0; i < f->l.p->sizelineinfo; i++)  /* for all lines with code */\n      luaH_setint(L, t, lineinfo[i], &v);  /* table[line] = true */\n  }\n}\n\n\nstatic int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar,\n                       Closure *f, CallInfo *ci) {\n  int status = 1;\n  for (; *what; what++) {\n    switch (*what) {\n      case 'S': {\n        funcinfo(ar, f);\n        break;\n      }\n      case 'l': {\n        ar->currentline = (ci && isLua(ci)) ? currentline(ci) : -1;\n        break;\n      }\n      case 'u': {\n        ar->nups = (f == NULL) ? 0 : f->c.nupvalues;\n        if (noLuaClosure(f)) {\n          ar->isvararg = 1;\n          ar->nparams = 0;\n        }\n        else {\n          ar->isvararg = f->l.p->is_vararg;\n          ar->nparams = f->l.p->numparams;\n        }\n        break;\n      }\n      case 't': {\n        ar->istailcall = (ci) ? ci->callstatus & CIST_TAIL : 0;\n        break;\n      }\n      case 'n': {\n        /* calling function is a known Lua function? */\n        if (ci && !(ci->callstatus & CIST_TAIL) && isLua(ci->previous))\n          ar->namewhat = getfuncname(L, ci->previous, &ar->name);\n        else\n          ar->namewhat = NULL;\n        if (ar->namewhat == NULL) {\n          ar->namewhat = \"\";  /* not found */\n          ar->name = NULL;\n        }\n        break;\n      }\n      case 'L':\n      case 'f':  /* handled by lua_getinfo */\n        break;\n      default: status = 0;  /* invalid option */\n    }\n  }\n  return status;\n}\n\n\nLUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {\n  int status;\n  Closure *cl;\n  CallInfo *ci;\n  StkId func;\n  lua_lock(L);\n  if (*what == '>') {\n    ci = NULL;\n    func = L->top - 1;\n    api_check(ttisfunction(func), \"function expected\");\n    what++;  /* skip the '>' */\n    L->top--;  /* pop function */\n  }\n  else {\n    ci = ar->i_ci;\n    func = ci->func;\n    lua_assert(ttisfunction(ci->func));\n  }\n  cl = ttisclosure(func) ? clvalue(func) : NULL;\n  status = auxgetinfo(L, what, ar, cl, ci);\n  if (strchr(what, 'f')) {\n    setobjs2s(L, L->top, func);\n    api_incr_top(L);\n  }\n  if (strchr(what, 'L'))\n    collectvalidlines(L, cl);\n  lua_unlock(L);\n  return status;\n}\n\n\n/*\n** {======================================================\n** Symbolic Execution\n** =======================================================\n*/\n\nstatic const char *getobjname (Proto *p, int lastpc, int reg,\n                               const char **name);\n\n\n/*\n** find a \"name\" for the RK value 'c'\n*/\nstatic void kname (Proto *p, int pc, int c, const char **name) {\n  if (ISK(c)) {  /* is 'c' a constant? */\n    TValue *kvalue = &p->k[INDEXK(c)];\n    if (ttisstring(kvalue)) {  /* literal constant? */\n      *name = svalue(kvalue);  /* it is its own name */\n      return;\n    }\n    /* else no reasonable name found */\n  }\n  else {  /* 'c' is a register */\n    const char *what = getobjname(p, pc, c, name); /* search for 'c' */\n    if (what && *what == 'c') {  /* found a constant name? */\n      return;  /* 'name' already filled */\n    }\n    /* else no reasonable name found */\n  }\n  *name = \"?\";  /* no reasonable name found */\n}\n\n\nstatic int filterpc (int pc, int jmptarget) {\n  if (pc < jmptarget)  /* is code conditional (inside a jump)? */\n    return -1;  /* cannot know who sets that register */\n  else return pc;  /* current position sets that register */\n}\n\n\n/*\n** try to find last instruction before 'lastpc' that modified register 'reg'\n*/\nstatic int findsetreg (Proto *p, int lastpc, int reg) {\n  int pc;\n  int setreg = -1;  /* keep last instruction that changed 'reg' */\n  int jmptarget = 0;  /* any code before this address is conditional */\n  for (pc = 0; pc < lastpc; pc++) {\n    Instruction i = p->code[pc];\n    OpCode op = GET_OPCODE(i);\n    int a = GETARG_A(i);\n    switch (op) {\n      case OP_LOADNIL: {\n        int b = GETARG_B(i);\n        if (a <= reg && reg <= a + b)  /* set registers from 'a' to 'a+b' */\n          setreg = filterpc(pc, jmptarget);\n        break;\n      }\n      case OP_TFORCALL: {\n        if (reg >= a + 2)  /* affect all regs above its base */\n          setreg = filterpc(pc, jmptarget);\n        break;\n      }\n      case OP_CALL:\n      case OP_TAILCALL: {\n        if (reg >= a)  /* affect all registers above base */\n          setreg = filterpc(pc, jmptarget);\n        break;\n      }\n      case OP_JMP: {\n        int b = GETARG_sBx(i);\n        int dest = pc + 1 + b;\n        /* jump is forward and do not skip 'lastpc'? */\n        if (pc < dest && dest <= lastpc) {\n          if (dest > jmptarget)\n            jmptarget = dest;  /* update 'jmptarget' */\n        }\n        break;\n      }\n      default:\n        if (testAMode(op) && reg == a)  /* any instruction that set A */\n          setreg = filterpc(pc, jmptarget);\n        break;\n    }\n  }\n  return setreg;\n}\n\n\nstatic const char *getobjname (Proto *p, int lastpc, int reg,\n                               const char **name) {\n  int pc;\n  *name = luaF_getlocalname(p, reg + 1, lastpc);\n  if (*name)  /* is a local? */\n    return \"local\";\n  /* else try symbolic execution */\n  pc = findsetreg(p, lastpc, reg);\n  if (pc != -1) {  /* could find instruction? */\n    Instruction i = p->code[pc];\n    OpCode op = GET_OPCODE(i);\n    switch (op) {\n      case OP_MOVE: {\n        int b = GETARG_B(i);  /* move from 'b' to 'a' */\n        if (b < GETARG_A(i))\n          return getobjname(p, pc, b, name);  /* get name for 'b' */\n        break;\n      }\n      case OP_GETTABUP:\n      case OP_GETTABLE: {\n        int k = GETARG_C(i);  /* key index */\n        int t = GETARG_B(i);  /* table index */\n        const char *vn = (op == OP_GETTABLE)  /* name of indexed variable */\n                         ? luaF_getlocalname(p, t + 1, pc)\n                         : upvalname(p, t);\n        kname(p, pc, k, name);\n        return (vn && strcmp(vn, LUA_ENV) == 0) ? \"global\" : \"field\";\n      }\n      case OP_GETUPVAL: {\n        *name = upvalname(p, GETARG_B(i));\n        return \"upvalue\";\n      }\n      case OP_LOADK:\n      case OP_LOADKX: {\n        int b = (op == OP_LOADK) ? GETARG_Bx(i)\n                                 : GETARG_Ax(p->code[pc + 1]);\n        if (ttisstring(&p->k[b])) {\n          *name = svalue(&p->k[b]);\n          return \"constant\";\n        }\n        break;\n      }\n      case OP_SELF: {\n        int k = GETARG_C(i);  /* key index */\n        kname(p, pc, k, name);\n        return \"method\";\n      }\n      default: break;  /* go through to return NULL */\n    }\n  }\n  return NULL;  /* could not find reasonable name */\n}\n\n\nstatic const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) {\n  TMS tm = (TMS)0;  /* to avoid warnings */\n  Proto *p = ci_func(ci)->p;  /* calling function */\n  int pc = currentpc(ci);  /* calling instruction index */\n  Instruction i = p->code[pc];  /* calling instruction */\n  if (ci->callstatus & CIST_HOOKED) {  /* was it called inside a hook? */\n    *name = \"?\";\n    return \"hook\";\n  }\n  switch (GET_OPCODE(i)) {\n    case OP_CALL:\n    case OP_TAILCALL:  /* get function name */\n      return getobjname(p, pc, GETARG_A(i), name);\n    case OP_TFORCALL: {  /* for iterator */\n      *name = \"for iterator\";\n       return \"for iterator\";\n    }\n    /* all other instructions can call only through metamethods */\n    case OP_SELF: case OP_GETTABUP: case OP_GETTABLE:\n      tm = TM_INDEX;\n      break;\n    case OP_SETTABUP: case OP_SETTABLE:\n      tm = TM_NEWINDEX;\n      break;\n    case OP_ADD: case OP_SUB: case OP_MUL: case OP_MOD:\n    case OP_POW: case OP_DIV: case OP_IDIV: case OP_BAND:\n    case OP_BOR: case OP_BXOR: case OP_SHL: case OP_SHR: {\n      int offset = cast_int(GET_OPCODE(i)) - cast_int(OP_ADD);  /* ORDER OP */\n      tm = cast(TMS, offset + cast_int(TM_ADD));  /* ORDER TM */\n      break;\n    }\n    case OP_UNM: tm = TM_UNM; break;\n    case OP_BNOT: tm = TM_BNOT; break;\n    case OP_LEN: tm = TM_LEN; break;\n    case OP_CONCAT: tm = TM_CONCAT; break;\n    case OP_EQ: tm = TM_EQ; break;\n    case OP_LT: tm = TM_LT; break;\n    case OP_LE: tm = TM_LE; break;\n    default: lua_assert(0);  /* other instructions cannot call a function */\n  }\n  *name = getstr(G(L)->tmname[tm]);\n  return \"metamethod\";\n}\n\n/* }====================================================== */\n\n\n\n/*\n** The subtraction of two potentially unrelated pointers is\n** not ISO C, but it should not crash a program; the subsequent\n** checks are ISO C and ensure a correct result.\n*/\nstatic int isinstack (CallInfo *ci, const TValue *o) {\n  ptrdiff_t i = o - ci->u.l.base;\n  return (0 <= i && i < (ci->top - ci->u.l.base) && ci->u.l.base + i == o);\n}\n\n\n/*\n** Checks whether value 'o' came from an upvalue. (That can only happen\n** with instructions OP_GETTABUP/OP_SETTABUP, which operate directly on\n** upvalues.)\n*/\nstatic const char *getupvalname (CallInfo *ci, const TValue *o,\n                                 const char **name) {\n  LClosure *c = ci_func(ci);\n  int i;\n  for (i = 0; i < c->nupvalues; i++) {\n    if (c->upvals[i]->v == o) {\n      *name = upvalname(c->p, i);\n      return \"upvalue\";\n    }\n  }\n  return NULL;\n}\n\n\nstatic const char *varinfo (lua_State *L, const TValue *o) {\n  const char *name = NULL;  /* to avoid warnings */\n  CallInfo *ci = L->ci;\n  const char *kind = NULL;\n  if (isLua(ci)) {\n    kind = getupvalname(ci, o, &name);  /* check whether 'o' is an upvalue */\n    if (!kind && isinstack(ci, o))  /* no? try a register */\n      kind = getobjname(ci_func(ci)->p, currentpc(ci),\n                        cast_int(o - ci->u.l.base), &name);\n  }\n  return (kind) ? luaO_pushfstring(L, \" (%s '%s')\", kind, name) : \"\";\n}\n\n\nl_noret luaG_typeerror (lua_State *L, const TValue *o, const char *op) {\n  const char *t = objtypename(o);\n  luaG_runerror(L, \"attempt to %s a %s value%s\", op, t, varinfo(L, o));\n}\n\n\nl_noret luaG_concaterror (lua_State *L, const TValue *p1, const TValue *p2) {\n  if (ttisstring(p1) || cvt2str(p1)) p1 = p2;\n  luaG_typeerror(L, p1, \"concatenate\");\n}\n\n\nl_noret luaG_opinterror (lua_State *L, const TValue *p1,\n                         const TValue *p2, const char *msg) {\n  lua_Number temp;\n  if (!tonumber(p1, &temp))  /* first operand is wrong? */\n    p2 = p1;  /* now second is wrong */\n  luaG_typeerror(L, p2, msg);\n}\n\n\n/*\n** Error when both values are convertible to numbers, but not to integers\n*/\nl_noret luaG_tointerror (lua_State *L, const TValue *p1, const TValue *p2) {\n  lua_Integer temp;\n  if (!tointeger(p1, &temp))\n    p2 = p1;\n  luaG_runerror(L, \"number%s has no integer representation\", varinfo(L, p2));\n}\n\n\nl_noret luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) {\n  const char *t1 = objtypename(p1);\n  const char *t2 = objtypename(p2);\n  if (t1 == t2)\n    luaG_runerror(L, \"attempt to compare two %s values\", t1);\n  else\n    luaG_runerror(L, \"attempt to compare %s with %s\", t1, t2);\n}\n\n\nstatic void addinfo (lua_State *L, const char *msg) {\n  CallInfo *ci = L->ci;\n  if (isLua(ci)) {  /* is Lua code? */\n    char buff[LUA_IDSIZE];  /* add file:line information */\n    int line = currentline(ci);\n    TString *src = ci_func(ci)->p->source;\n    if (src)\n      luaO_chunkid(buff, getstr(src), LUA_IDSIZE);\n    else {  /* no source available; use \"?\" instead */\n      buff[0] = '?'; buff[1] = '\\0';\n    }\n    luaO_pushfstring(L, \"%s:%d: %s\", buff, line, msg);\n  }\n}\n\n\nl_noret luaG_errormsg (lua_State *L) {\n  if (L->errfunc != 0) {  /* is there an error handling function? */\n    StkId errfunc = restorestack(L, L->errfunc);\n    setobjs2s(L, L->top, L->top - 1);  /* move argument */\n    setobjs2s(L, L->top - 1, errfunc);  /* push function */\n    L->top++;  /* assume EXTRA_STACK */\n    luaD_call(L, L->top - 2, 1, 0);  /* call it */\n  }\n  luaD_throw(L, LUA_ERRRUN);\n}\n\n\nl_noret luaG_runerror (lua_State *L, const char *fmt, ...) {\n  va_list argp;\n  va_start(argp, fmt);\n  addinfo(L, luaO_pushvfstring(L, fmt, argp));\n  va_end(argp);\n  luaG_errormsg(L);\n}\n\n\nvoid luaG_traceexec (lua_State *L) {\n  CallInfo *ci = L->ci;\n  lu_byte mask = L->hookmask;\n  int counthook = ((mask & LUA_MASKCOUNT) && L->hookcount == 0);\n  if (counthook)\n    resethookcount(L);  /* reset count */\n  if (ci->callstatus & CIST_HOOKYIELD) {  /* called hook last time? */\n    ci->callstatus &= ~CIST_HOOKYIELD;  /* erase mark */\n    return;  /* do not call hook again (VM yielded, so it did not move) */\n  }\n  if (counthook)\n    luaD_hook(L, LUA_HOOKCOUNT, -1);  /* call count hook */\n  if (mask & LUA_MASKLINE) {\n    Proto *p = ci_func(ci)->p;\n    int npc = pcRel(ci->u.l.savedpc, p);\n    int newline = getfuncline(p, npc);\n    if (npc == 0 ||  /* call linehook when enter a new function, */\n        ci->u.l.savedpc <= L->oldpc ||  /* when jump back (loop), or when */\n        newline != getfuncline(p, pcRel(L->oldpc, p)))  /* enter a new line */\n      luaD_hook(L, LUA_HOOKLINE, newline);  /* call line hook */\n  }\n  L->oldpc = ci->u.l.savedpc;\n  if (L->status == LUA_YIELD) {  /* did hook yield? */\n    if (counthook)\n      L->hookcount = 1;  /* undo decrement to zero */\n    ci->u.l.savedpc--;  /* undo increment (resume will increment it again) */\n    ci->callstatus |= CIST_HOOKYIELD;  /* mark that it yielded */\n    ci->func = L->top - 1;  /* protect stack below results */\n    luaD_throw(L, LUA_YIELD);\n  }\n}\n\n"
  },
  {
    "path": "externals/lua/src/ldebug.h",
    "content": "/*\n** $Id: ldebug.h,v 2.12 2014/11/10 14:46:05 roberto Exp $\n** Auxiliary functions from Debug Interface module\n** See Copyright Notice in lua.h\n*/\n\n#ifndef ldebug_h\n#define ldebug_h\n\n\n#include \"lstate.h\"\n\n\n#define pcRel(pc, p)\t(cast(int, (pc) - (p)->code) - 1)\n\n#define getfuncline(f,pc)\t(((f)->lineinfo) ? (f)->lineinfo[pc] : -1)\n\n#define resethookcount(L)\t(L->hookcount = L->basehookcount)\n\n/* Active Lua function (given call info) */\n#define ci_func(ci)\t\t(clLvalue((ci)->func))\n\n\nLUAI_FUNC l_noret luaG_typeerror (lua_State *L, const TValue *o,\n                                                const char *opname);\nLUAI_FUNC l_noret luaG_concaterror (lua_State *L, const TValue *p1,\n                                                  const TValue *p2);\nLUAI_FUNC l_noret luaG_opinterror (lua_State *L, const TValue *p1,\n                                                 const TValue *p2,\n                                                 const char *msg);\nLUAI_FUNC l_noret luaG_tointerror (lua_State *L, const TValue *p1,\n                                                 const TValue *p2);\nLUAI_FUNC l_noret luaG_ordererror (lua_State *L, const TValue *p1,\n                                                 const TValue *p2);\nLUAI_FUNC l_noret luaG_runerror (lua_State *L, const char *fmt, ...);\nLUAI_FUNC l_noret luaG_errormsg (lua_State *L);\nLUAI_FUNC void luaG_traceexec (lua_State *L);\n\n\n#endif\n"
  },
  {
    "path": "externals/lua/src/ldo.c",
    "content": "/*\n** $Id: ldo.c,v 2.135 2014/11/11 17:13:39 roberto Exp $\n** Stack and Call structure of Lua\n** See Copyright Notice in lua.h\n*/\n\n#define ldo_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include <setjmp.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"lapi.h\"\n#include \"ldebug.h\"\n#include \"ldo.h\"\n#include \"lfunc.h\"\n#include \"lgc.h\"\n#include \"lmem.h\"\n#include \"lobject.h\"\n#include \"lopcodes.h\"\n#include \"lparser.h\"\n#include \"lstate.h\"\n#include \"lstring.h\"\n#include \"ltable.h\"\n#include \"ltm.h\"\n#include \"lundump.h\"\n#include \"lvm.h\"\n#include \"lzio.h\"\n\n\n\n#define errorstatus(s)\t((s) > LUA_YIELD)\n\n\n/*\n** {======================================================\n** Error-recovery functions\n** =======================================================\n*/\n\n/*\n** LUAI_THROW/LUAI_TRY define how Lua does exception handling. By\n** default, Lua handles errors with exceptions when compiling as\n** C++ code, with _longjmp/_setjmp when asked to use them, and with\n** longjmp/setjmp otherwise.\n*/\n#if !defined(LUAI_THROW)\t\t\t\t/* { */\n\n#if defined(__cplusplus) && !defined(LUA_USE_LONGJMP)\t/* { */\n\n/* C++ exceptions */\n#define LUAI_THROW(L,c)\t\tthrow(c)\n#define LUAI_TRY(L,c,a) \\\n\ttry { a } catch(...) { if ((c)->status == 0) (c)->status = -1; }\n#define luai_jmpbuf\t\tint  /* dummy variable */\n\n#elif defined(LUA_USE_POSIX)\t\t\t\t/* }{ */\n\n/* in POSIX, try _longjmp/_setjmp (more efficient) */\n#define LUAI_THROW(L,c)\t\t_longjmp((c)->b, 1)\n#define LUAI_TRY(L,c,a)\t\tif (_setjmp((c)->b) == 0) { a }\n#define luai_jmpbuf\t\tjmp_buf\n\n#else\t\t\t\t\t\t\t/* }{ */\n\n/* ISO C handling with long jumps */\n#define LUAI_THROW(L,c)\t\tlongjmp((c)->b, 1)\n#define LUAI_TRY(L,c,a)\t\tif (setjmp((c)->b) == 0) { a }\n#define luai_jmpbuf\t\tjmp_buf\n\n#endif\t\t\t\t\t\t\t/* } */\n\n#endif\t\t\t\t\t\t\t/* } */\n\n\n\n/* chain list of long jump buffers */\nstruct lua_longjmp {\n  struct lua_longjmp *previous;\n  luai_jmpbuf b;\n  volatile int status;  /* error code */\n};\n\n\nstatic void seterrorobj (lua_State *L, int errcode, StkId oldtop) {\n  switch (errcode) {\n    case LUA_ERRMEM: {  /* memory error? */\n      setsvalue2s(L, oldtop, G(L)->memerrmsg); /* reuse preregistered msg. */\n      break;\n    }\n    case LUA_ERRERR: {\n      setsvalue2s(L, oldtop, luaS_newliteral(L, \"error in error handling\"));\n      break;\n    }\n    default: {\n      setobjs2s(L, oldtop, L->top - 1);  /* error message on current top */\n      break;\n    }\n  }\n  L->top = oldtop + 1;\n}\n\n\nl_noret luaD_throw (lua_State *L, int errcode) {\n  if (L->errorJmp) {  /* thread has an error handler? */\n    L->errorJmp->status = errcode;  /* set status */\n    LUAI_THROW(L, L->errorJmp);  /* jump to it */\n  }\n  else {  /* thread has no error handler */\n    global_State *g = G(L);\n    L->status = cast_byte(errcode);  /* mark it as dead */\n    if (g->mainthread->errorJmp) {  /* main thread has a handler? */\n      setobjs2s(L, g->mainthread->top++, L->top - 1);  /* copy error obj. */\n      luaD_throw(g->mainthread, errcode);  /* re-throw in main thread */\n    }\n    else {  /* no handler at all; abort */\n      if (g->panic) {  /* panic function? */\n        seterrorobj(L, errcode, L->top);  /* assume EXTRA_STACK */\n        if (L->ci->top < L->top)\n          L->ci->top = L->top;  /* pushing msg. can break this invariant */\n        lua_unlock(L);\n        g->panic(L);  /* call panic function (last chance to jump out) */\n      }\n      abort();\n    }\n  }\n}\n\n\nint luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {\n  unsigned short oldnCcalls = L->nCcalls;\n  struct lua_longjmp lj;\n  lj.status = LUA_OK;\n  lj.previous = L->errorJmp;  /* chain new error handler */\n  L->errorJmp = &lj;\n  LUAI_TRY(L, &lj,\n    (*f)(L, ud);\n  );\n  L->errorJmp = lj.previous;  /* restore old error handler */\n  L->nCcalls = oldnCcalls;\n  return lj.status;\n}\n\n/* }====================================================== */\n\n\nstatic void correctstack (lua_State *L, TValue *oldstack) {\n  CallInfo *ci;\n  UpVal *up;\n  L->top = (L->top - oldstack) + L->stack;\n  for (up = L->openupval; up != NULL; up = up->u.open.next)\n    up->v = (up->v - oldstack) + L->stack;\n  for (ci = L->ci; ci != NULL; ci = ci->previous) {\n    ci->top = (ci->top - oldstack) + L->stack;\n    ci->func = (ci->func - oldstack) + L->stack;\n    if (isLua(ci))\n      ci->u.l.base = (ci->u.l.base - oldstack) + L->stack;\n  }\n}\n\n\n/* some space for error handling */\n#define ERRORSTACKSIZE\t(LUAI_MAXSTACK + 200)\n\n\nvoid luaD_reallocstack (lua_State *L, int newsize) {\n  TValue *oldstack = L->stack;\n  int lim = L->stacksize;\n  lua_assert(newsize <= LUAI_MAXSTACK || newsize == ERRORSTACKSIZE);\n  lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK);\n  luaM_reallocvector(L, L->stack, L->stacksize, newsize, TValue);\n  for (; lim < newsize; lim++)\n    setnilvalue(L->stack + lim); /* erase new segment */\n  L->stacksize = newsize;\n  L->stack_last = L->stack + newsize - EXTRA_STACK;\n  correctstack(L, oldstack);\n}\n\n\nvoid luaD_growstack (lua_State *L, int n) {\n  int size = L->stacksize;\n  if (size > LUAI_MAXSTACK)  /* error after extra size? */\n    luaD_throw(L, LUA_ERRERR);\n  else {\n    int needed = cast_int(L->top - L->stack) + n + EXTRA_STACK;\n    int newsize = 2 * size;\n    if (newsize > LUAI_MAXSTACK) newsize = LUAI_MAXSTACK;\n    if (newsize < needed) newsize = needed;\n    if (newsize > LUAI_MAXSTACK) {  /* stack overflow? */\n      luaD_reallocstack(L, ERRORSTACKSIZE);\n      luaG_runerror(L, \"stack overflow\");\n    }\n    else\n      luaD_reallocstack(L, newsize);\n  }\n}\n\n\nstatic int stackinuse (lua_State *L) {\n  CallInfo *ci;\n  StkId lim = L->top;\n  for (ci = L->ci; ci != NULL; ci = ci->previous) {\n    lua_assert(ci->top <= L->stack_last);\n    if (lim < ci->top) lim = ci->top;\n  }\n  return cast_int(lim - L->stack) + 1;  /* part of stack in use */\n}\n\n\nvoid luaD_shrinkstack (lua_State *L) {\n  int inuse = stackinuse(L);\n  int goodsize = inuse + (inuse / 8) + 2*EXTRA_STACK;\n  if (goodsize > LUAI_MAXSTACK) goodsize = LUAI_MAXSTACK;\n  if (L->stacksize > LUAI_MAXSTACK)  /* was handling stack overflow? */\n    luaE_freeCI(L);  /* free all CIs (list grew because of an error) */\n  else\n    luaE_shrinkCI(L);  /* shrink list */\n  if (inuse > LUAI_MAXSTACK ||  /* still handling stack overflow? */\n      goodsize >= L->stacksize)  /* would grow instead of shrink? */\n    condmovestack(L);  /* don't change stack (change only for debugging) */\n  else\n    luaD_reallocstack(L, goodsize);  /* shrink it */\n}\n\n\nvoid luaD_hook (lua_State *L, int event, int line) {\n  lua_Hook hook = L->hook;\n  if (hook && L->allowhook) {\n    CallInfo *ci = L->ci;\n    ptrdiff_t top = savestack(L, L->top);\n    ptrdiff_t ci_top = savestack(L, ci->top);\n    lua_Debug ar;\n    ar.event = event;\n    ar.currentline = line;\n    ar.i_ci = ci;\n    luaD_checkstack(L, LUA_MINSTACK);  /* ensure minimum stack size */\n    ci->top = L->top + LUA_MINSTACK;\n    lua_assert(ci->top <= L->stack_last);\n    L->allowhook = 0;  /* cannot call hooks inside a hook */\n    ci->callstatus |= CIST_HOOKED;\n    lua_unlock(L);\n    (*hook)(L, &ar);\n    lua_lock(L);\n    lua_assert(!L->allowhook);\n    L->allowhook = 1;\n    ci->top = restorestack(L, ci_top);\n    L->top = restorestack(L, top);\n    ci->callstatus &= ~CIST_HOOKED;\n  }\n}\n\n\nstatic void callhook (lua_State *L, CallInfo *ci) {\n  int hook = LUA_HOOKCALL;\n  ci->u.l.savedpc++;  /* hooks assume 'pc' is already incremented */\n  if (isLua(ci->previous) &&\n      GET_OPCODE(*(ci->previous->u.l.savedpc - 1)) == OP_TAILCALL) {\n    ci->callstatus |= CIST_TAIL;\n    hook = LUA_HOOKTAILCALL;\n  }\n  luaD_hook(L, hook, -1);\n  ci->u.l.savedpc--;  /* correct 'pc' */\n}\n\n\nstatic StkId adjust_varargs (lua_State *L, Proto *p, int actual) {\n  int i;\n  int nfixargs = p->numparams;\n  StkId base, fixed;\n  lua_assert(actual >= nfixargs);\n  /* move fixed parameters to final position */\n  luaD_checkstack(L, p->maxstacksize);  /* check again for new 'base' */\n  fixed = L->top - actual;  /* first fixed argument */\n  base = L->top;  /* final position of first argument */\n  for (i=0; i<nfixargs; i++) {\n    setobjs2s(L, L->top++, fixed + i);\n    setnilvalue(fixed + i);\n  }\n  return base;\n}\n\n\n/*\n** Check whether __call metafield of 'func' is a function. If so, put\n** it in stack below original 'func' so that 'luaD_precall' can call\n** it. Raise an error if __call metafield is not a function.\n*/\nstatic void tryfuncTM (lua_State *L, StkId func) {\n  const TValue *tm = luaT_gettmbyobj(L, func, TM_CALL);\n  StkId p;\n  if (!ttisfunction(tm))\n    luaG_typeerror(L, func, \"call\");\n  /* Open a hole inside the stack at 'func' */\n  for (p = L->top; p > func; p--)\n    setobjs2s(L, p, p-1);\n  L->top++;  /* slot ensured by caller */\n  setobj2s(L, func, tm);  /* tag method is the new function to be called */\n}\n\n\n\n#define next_ci(L) (L->ci = (L->ci->next ? L->ci->next : luaE_extendCI(L)))\n\n\n/*\n** returns true if function has been executed (C function)\n*/\nint luaD_precall (lua_State *L, StkId func, int nresults) {\n  lua_CFunction f;\n  CallInfo *ci;\n  int n;  /* number of arguments (Lua) or returns (C) */\n  ptrdiff_t funcr = savestack(L, func);\n  switch (ttype(func)) {\n    case LUA_TLCF:  /* light C function */\n      f = fvalue(func);\n      goto Cfunc;\n    case LUA_TCCL: {  /* C closure */\n      f = clCvalue(func)->f;\n     Cfunc:\n      luaD_checkstack(L, LUA_MINSTACK);  /* ensure minimum stack size */\n      ci = next_ci(L);  /* now 'enter' new function */\n      ci->nresults = nresults;\n      ci->func = restorestack(L, funcr);\n      ci->top = L->top + LUA_MINSTACK;\n      lua_assert(ci->top <= L->stack_last);\n      ci->callstatus = 0;\n      luaC_checkGC(L);  /* stack grow uses memory */\n      if (L->hookmask & LUA_MASKCALL)\n        luaD_hook(L, LUA_HOOKCALL, -1);\n      lua_unlock(L);\n      n = (*f)(L);  /* do the actual call */\n      lua_lock(L);\n      api_checknelems(L, n);\n      luaD_poscall(L, L->top - n);\n      return 1;\n    }\n    case LUA_TLCL: {  /* Lua function: prepare its call */\n      StkId base;\n      Proto *p = clLvalue(func)->p;\n      n = cast_int(L->top - func) - 1;  /* number of real arguments */\n      luaD_checkstack(L, p->maxstacksize);\n      for (; n < p->numparams; n++)\n        setnilvalue(L->top++);  /* complete missing arguments */\n      if (!p->is_vararg) {\n        func = restorestack(L, funcr);\n        base = func + 1;\n      }\n      else {\n        base = adjust_varargs(L, p, n);\n        func = restorestack(L, funcr);  /* previous call can change stack */\n      }\n      ci = next_ci(L);  /* now 'enter' new function */\n      ci->nresults = nresults;\n      ci->func = func;\n      ci->u.l.base = base;\n      ci->top = base + p->maxstacksize;\n      lua_assert(ci->top <= L->stack_last);\n      ci->u.l.savedpc = p->code;  /* starting point */\n      ci->callstatus = CIST_LUA;\n      L->top = ci->top;\n      luaC_checkGC(L);  /* stack grow uses memory */\n      if (L->hookmask & LUA_MASKCALL)\n        callhook(L, ci);\n      return 0;\n    }\n    default: {  /* not a function */\n      luaD_checkstack(L, 1);  /* ensure space for metamethod */\n      func = restorestack(L, funcr);  /* previous call may change stack */\n      tryfuncTM(L, func);  /* try to get '__call' metamethod */\n      return luaD_precall(L, func, nresults);  /* now it must be a function */\n    }\n  }\n}\n\n\nint luaD_poscall (lua_State *L, StkId firstResult) {\n  StkId res;\n  int wanted, i;\n  CallInfo *ci = L->ci;\n  if (L->hookmask & (LUA_MASKRET | LUA_MASKLINE)) {\n    if (L->hookmask & LUA_MASKRET) {\n      ptrdiff_t fr = savestack(L, firstResult);  /* hook may change stack */\n      luaD_hook(L, LUA_HOOKRET, -1);\n      firstResult = restorestack(L, fr);\n    }\n    L->oldpc = ci->previous->u.l.savedpc;  /* 'oldpc' for caller function */\n  }\n  res = ci->func;  /* res == final position of 1st result */\n  wanted = ci->nresults;\n  L->ci = ci = ci->previous;  /* back to caller */\n  /* move results to correct place */\n  for (i = wanted; i != 0 && firstResult < L->top; i--)\n    setobjs2s(L, res++, firstResult++);\n  while (i-- > 0)\n    setnilvalue(res++);\n  L->top = res;\n  return (wanted - LUA_MULTRET);  /* 0 iff wanted == LUA_MULTRET */\n}\n\n\n/*\n** Call a function (C or Lua). The function to be called is at *func.\n** The arguments are on the stack, right after the function.\n** When returns, all the results are on the stack, starting at the original\n** function position.\n*/\nvoid luaD_call (lua_State *L, StkId func, int nResults, int allowyield) {\n  if (++L->nCcalls >= LUAI_MAXCCALLS) {\n    if (L->nCcalls == LUAI_MAXCCALLS)\n      luaG_runerror(L, \"C stack overflow\");\n    else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3)))\n      luaD_throw(L, LUA_ERRERR);  /* error while handing stack error */\n  }\n  if (!allowyield) L->nny++;\n  if (!luaD_precall(L, func, nResults))  /* is a Lua function? */\n    luaV_execute(L);  /* call it */\n  if (!allowyield) L->nny--;\n  L->nCcalls--;\n}\n\n\n/*\n** Completes the execution of an interrupted C function, calling its\n** continuation function.\n*/\nstatic void finishCcall (lua_State *L, int status) {\n  CallInfo *ci = L->ci;\n  int n;\n  /* must have a continuation and must be able to call it */\n  lua_assert(ci->u.c.k != NULL && L->nny == 0);\n  /* error status can only happen in a protected call */\n  lua_assert((ci->callstatus & CIST_YPCALL) || status == LUA_YIELD);\n  if (ci->callstatus & CIST_YPCALL) {  /* was inside a pcall? */\n    ci->callstatus &= ~CIST_YPCALL;  /* finish 'lua_pcall' */\n    L->errfunc = ci->u.c.old_errfunc;\n  }\n  /* finish 'lua_callk'/'lua_pcall'; CIST_YPCALL and 'errfunc' already\n     handled */\n  adjustresults(L, ci->nresults);\n  /* call continuation function */\n  lua_unlock(L);\n  n = (*ci->u.c.k)(L, status, ci->u.c.ctx);\n  lua_lock(L);\n  api_checknelems(L, n);\n  /* finish 'luaD_precall' */\n  luaD_poscall(L, L->top - n);\n}\n\n\n/*\n** Executes \"full continuation\" (everything in the stack) of a\n** previously interrupted coroutine until the stack is empty (or another\n** interruption long-jumps out of the loop). If the coroutine is\n** recovering from an error, 'ud' points to the error status, which must\n** be passed to the first continuation function (otherwise the default\n** status is LUA_YIELD).\n*/\nstatic void unroll (lua_State *L, void *ud) {\n  if (ud != NULL)  /* error status? */\n    finishCcall(L, *(int *)ud);  /* finish 'lua_pcallk' callee */\n  while (L->ci != &L->base_ci) {  /* something in the stack */\n    if (!isLua(L->ci))  /* C function? */\n      finishCcall(L, LUA_YIELD);  /* complete its execution */\n    else {  /* Lua function */\n      luaV_finishOp(L);  /* finish interrupted instruction */\n      luaV_execute(L);  /* execute down to higher C 'boundary' */\n    }\n  }\n}\n\n\n/*\n** Try to find a suspended protected call (a \"recover point\") for the\n** given thread.\n*/\nstatic CallInfo *findpcall (lua_State *L) {\n  CallInfo *ci;\n  for (ci = L->ci; ci != NULL; ci = ci->previous) {  /* search for a pcall */\n    if (ci->callstatus & CIST_YPCALL)\n      return ci;\n  }\n  return NULL;  /* no pending pcall */\n}\n\n\n/*\n** Recovers from an error in a coroutine. Finds a recover point (if\n** there is one) and completes the execution of the interrupted\n** 'luaD_pcall'. If there is no recover point, returns zero.\n*/\nstatic int recover (lua_State *L, int status) {\n  StkId oldtop;\n  CallInfo *ci = findpcall(L);\n  if (ci == NULL) return 0;  /* no recovery point */\n  /* \"finish\" luaD_pcall */\n  oldtop = restorestack(L, ci->extra);\n  luaF_close(L, oldtop);\n  seterrorobj(L, status, oldtop);\n  L->ci = ci;\n  L->allowhook = getoah(ci->callstatus);  /* restore original 'allowhook' */\n  L->nny = 0;  /* should be zero to be yieldable */\n  luaD_shrinkstack(L);\n  L->errfunc = ci->u.c.old_errfunc;\n  return 1;  /* continue running the coroutine */\n}\n\n\n/*\n** signal an error in the call to 'resume', not in the execution of the\n** coroutine itself. (Such errors should not be handled by any coroutine\n** error handler and should not kill the coroutine.)\n*/\nstatic l_noret resume_error (lua_State *L, const char *msg, StkId firstArg) {\n  L->top = firstArg;  /* remove args from the stack */\n  setsvalue2s(L, L->top, luaS_new(L, msg));  /* push error message */\n  api_incr_top(L);\n  luaD_throw(L, -1);  /* jump back to 'lua_resume' */\n}\n\n\n/*\n** Do the work for 'lua_resume' in protected mode. Most of the work\n** depends on the status of the coroutine: initial state, suspended\n** inside a hook, or regularly suspended (optionally with a continuation\n** function), plus erroneous cases: non-suspended coroutine or dead\n** coroutine.\n*/\nstatic void resume (lua_State *L, void *ud) {\n  int nCcalls = L->nCcalls;\n  StkId firstArg = cast(StkId, ud);\n  CallInfo *ci = L->ci;\n  if (nCcalls >= LUAI_MAXCCALLS)\n    resume_error(L, \"C stack overflow\", firstArg);\n  if (L->status == LUA_OK) {  /* may be starting a coroutine */\n    if (ci != &L->base_ci)  /* not in base level? */\n      resume_error(L, \"cannot resume non-suspended coroutine\", firstArg);\n    /* coroutine is in base level; start running it */\n    if (!luaD_precall(L, firstArg - 1, LUA_MULTRET))  /* Lua function? */\n      luaV_execute(L);  /* call it */\n  }\n  else if (L->status != LUA_YIELD)\n    resume_error(L, \"cannot resume dead coroutine\", firstArg);\n  else {  /* resuming from previous yield */\n    L->status = LUA_OK;  /* mark that it is running (again) */\n    ci->func = restorestack(L, ci->extra);\n    if (isLua(ci))  /* yielded inside a hook? */\n      luaV_execute(L);  /* just continue running Lua code */\n    else {  /* 'common' yield */\n      if (ci->u.c.k != NULL) {  /* does it have a continuation function? */\n        int n;\n        lua_unlock(L);\n        n = (*ci->u.c.k)(L, LUA_YIELD, ci->u.c.ctx); /* call continuation */\n        lua_lock(L);\n        api_checknelems(L, n);\n        firstArg = L->top - n;  /* yield results come from continuation */\n      }\n      luaD_poscall(L, firstArg);  /* finish 'luaD_precall' */\n    }\n    unroll(L, NULL);  /* run continuation */\n  }\n  lua_assert(nCcalls == L->nCcalls);\n}\n\n\nLUA_API int lua_resume (lua_State *L, lua_State *from, int nargs) {\n  int status;\n  int oldnny = L->nny;  /* save \"number of non-yieldable\" calls */\n  lua_lock(L);\n  luai_userstateresume(L, nargs);\n  L->nCcalls = (from) ? from->nCcalls + 1 : 1;\n  L->nny = 0;  /* allow yields */\n  api_checknelems(L, (L->status == LUA_OK) ? nargs + 1 : nargs);\n  status = luaD_rawrunprotected(L, resume, L->top - nargs);\n  if (status == -1)  /* error calling 'lua_resume'? */\n    status = LUA_ERRRUN;\n  else {  /* continue running after recoverable errors */\n    while (errorstatus(status) && recover(L, status)) {\n      /* unroll continuation */\n      status = luaD_rawrunprotected(L, unroll, &status);\n    }\n    if (errorstatus(status)) {  /* unrecoverable error? */\n      L->status = cast_byte(status);  /* mark thread as 'dead' */\n      seterrorobj(L, status, L->top);  /* push error message */\n      L->ci->top = L->top;\n    }\n    else lua_assert(status == L->status);  /* normal end or yield */\n  }\n  L->nny = oldnny;  /* restore 'nny' */\n  L->nCcalls--;\n  lua_assert(L->nCcalls == ((from) ? from->nCcalls : 0));\n  lua_unlock(L);\n  return status;\n}\n\n\nLUA_API int lua_isyieldable (lua_State *L) {\n  return (L->nny == 0);\n}\n\n\nLUA_API int lua_yieldk (lua_State *L, int nresults, lua_KContext ctx,\n                        lua_KFunction k) {\n  CallInfo *ci = L->ci;\n  luai_userstateyield(L, nresults);\n  lua_lock(L);\n  api_checknelems(L, nresults);\n  if (L->nny > 0) {\n    if (L != G(L)->mainthread)\n      luaG_runerror(L, \"attempt to yield across a C-call boundary\");\n    else\n      luaG_runerror(L, \"attempt to yield from outside a coroutine\");\n  }\n  L->status = LUA_YIELD;\n  ci->extra = savestack(L, ci->func);  /* save current 'func' */\n  if (isLua(ci)) {  /* inside a hook? */\n    api_check(k == NULL, \"hooks cannot continue after yielding\");\n  }\n  else {\n    if ((ci->u.c.k = k) != NULL)  /* is there a continuation? */\n      ci->u.c.ctx = ctx;  /* save context */\n    ci->func = L->top - nresults - 1;  /* protect stack below results */\n    luaD_throw(L, LUA_YIELD);\n  }\n  lua_assert(ci->callstatus & CIST_HOOKED);  /* must be inside a hook */\n  lua_unlock(L);\n  return 0;  /* return to 'luaD_hook' */\n}\n\n\nint luaD_pcall (lua_State *L, Pfunc func, void *u,\n                ptrdiff_t old_top, ptrdiff_t ef) {\n  int status;\n  CallInfo *old_ci = L->ci;\n  lu_byte old_allowhooks = L->allowhook;\n  unsigned short old_nny = L->nny;\n  ptrdiff_t old_errfunc = L->errfunc;\n  L->errfunc = ef;\n  status = luaD_rawrunprotected(L, func, u);\n  if (status != LUA_OK) {  /* an error occurred? */\n    StkId oldtop = restorestack(L, old_top);\n    luaF_close(L, oldtop);  /* close possible pending closures */\n    seterrorobj(L, status, oldtop);\n    L->ci = old_ci;\n    L->allowhook = old_allowhooks;\n    L->nny = old_nny;\n    luaD_shrinkstack(L);\n  }\n  L->errfunc = old_errfunc;\n  return status;\n}\n\n\n\n/*\n** Execute a protected parser.\n*/\nstruct SParser {  /* data to 'f_parser' */\n  ZIO *z;\n  Mbuffer buff;  /* dynamic structure used by the scanner */\n  Dyndata dyd;  /* dynamic structures used by the parser */\n  const char *mode;\n  const char *name;\n};\n\n\nstatic void checkmode (lua_State *L, const char *mode, const char *x) {\n  if (mode && strchr(mode, x[0]) == NULL) {\n    luaO_pushfstring(L,\n       \"attempt to load a %s chunk (mode is '%s')\", x, mode);\n    luaD_throw(L, LUA_ERRSYNTAX);\n  }\n}\n\n\nstatic void f_parser (lua_State *L, void *ud) {\n  LClosure *cl;\n  struct SParser *p = cast(struct SParser *, ud);\n  int c = zgetc(p->z);  /* read first character */\n  if (c == LUA_SIGNATURE[0]) {\n    checkmode(L, p->mode, \"binary\");\n    cl = luaU_undump(L, p->z, &p->buff, p->name);\n  }\n  else {\n    checkmode(L, p->mode, \"text\");\n    cl = luaY_parser(L, p->z, &p->buff, &p->dyd, p->name, c);\n  }\n  lua_assert(cl->nupvalues == cl->p->sizeupvalues);\n  luaF_initupvals(L, cl);\n}\n\n\nint luaD_protectedparser (lua_State *L, ZIO *z, const char *name,\n                                        const char *mode) {\n  struct SParser p;\n  int status;\n  L->nny++;  /* cannot yield during parsing */\n  p.z = z; p.name = name; p.mode = mode;\n  p.dyd.actvar.arr = NULL; p.dyd.actvar.size = 0;\n  p.dyd.gt.arr = NULL; p.dyd.gt.size = 0;\n  p.dyd.label.arr = NULL; p.dyd.label.size = 0;\n  luaZ_initbuffer(L, &p.buff);\n  status = luaD_pcall(L, f_parser, &p, savestack(L, L->top), L->errfunc);\n  luaZ_freebuffer(L, &p.buff);\n  luaM_freearray(L, p.dyd.actvar.arr, p.dyd.actvar.size);\n  luaM_freearray(L, p.dyd.gt.arr, p.dyd.gt.size);\n  luaM_freearray(L, p.dyd.label.arr, p.dyd.label.size);\n  L->nny--;\n  return status;\n}\n\n\n"
  },
  {
    "path": "externals/lua/src/ldo.h",
    "content": "/*\n** $Id: ldo.h,v 2.21 2014/10/25 11:50:46 roberto Exp $\n** Stack and Call structure of Lua\n** See Copyright Notice in lua.h\n*/\n\n#ifndef ldo_h\n#define ldo_h\n\n\n#include \"lobject.h\"\n#include \"lstate.h\"\n#include \"lzio.h\"\n\n\n#define luaD_checkstack(L,n)\tif (L->stack_last - L->top <= (n)) \\\n\t\t\t\t    luaD_growstack(L, n); else condmovestack(L);\n\n\n#define incr_top(L) {L->top++; luaD_checkstack(L,0);}\n\n#define savestack(L,p)\t\t((char *)(p) - (char *)L->stack)\n#define restorestack(L,n)\t((TValue *)((char *)L->stack + (n)))\n\n\n/* type of protected functions, to be ran by 'runprotected' */\ntypedef void (*Pfunc) (lua_State *L, void *ud);\n\nLUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name,\n                                                  const char *mode);\nLUAI_FUNC void luaD_hook (lua_State *L, int event, int line);\nLUAI_FUNC int luaD_precall (lua_State *L, StkId func, int nresults);\nLUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults,\n                                        int allowyield);\nLUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u,\n                                        ptrdiff_t oldtop, ptrdiff_t ef);\nLUAI_FUNC int luaD_poscall (lua_State *L, StkId firstResult);\nLUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize);\nLUAI_FUNC void luaD_growstack (lua_State *L, int n);\nLUAI_FUNC void luaD_shrinkstack (lua_State *L);\n\nLUAI_FUNC l_noret luaD_throw (lua_State *L, int errcode);\nLUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud);\n\n#endif\n\n"
  },
  {
    "path": "externals/lua/src/ldump.c",
    "content": "/*\n** $Id: ldump.c,v 2.34 2014/11/02 19:19:04 roberto Exp $\n** save precompiled Lua chunks\n** See Copyright Notice in lua.h\n*/\n\n#define ldump_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include <stddef.h>\n\n#include \"lua.h\"\n\n#include \"lobject.h\"\n#include \"lstate.h\"\n#include \"lundump.h\"\n\n\ntypedef struct {\n  lua_State *L;\n  lua_Writer writer;\n  void *data;\n  int strip;\n  int status;\n} DumpState;\n\n\n/*\n** All high-level dumps go through DumpVector; you can change it to\n** change the endianness of the result\n*/\n#define DumpVector(v,n,D)\tDumpBlock(v,(n)*sizeof((v)[0]),D)\n\n#define DumpLiteral(s,D)\tDumpBlock(s, sizeof(s) - sizeof(char), D)\n\n\nstatic void DumpBlock (const void *b, size_t size, DumpState *D) {\n  if (D->status == 0) {\n    lua_unlock(D->L);\n    D->status = (*D->writer)(D->L, b, size, D->data);\n    lua_lock(D->L);\n  }\n}\n\n\n#define DumpVar(x,D)\t\tDumpVector(&x,1,D)\n\n\nstatic void DumpByte (int y, DumpState *D) {\n  lu_byte x = (lu_byte)y;\n  DumpVar(x, D);\n}\n\n\nstatic void DumpInt (int x, DumpState *D) {\n  DumpVar(x, D);\n}\n\n\nstatic void DumpNumber (lua_Number x, DumpState *D) {\n  DumpVar(x, D);\n}\n\n\nstatic void DumpInteger (lua_Integer x, DumpState *D) {\n  DumpVar(x, D);\n}\n\n\nstatic void DumpString (const TString *s, DumpState *D) {\n  if (s == NULL)\n    DumpByte(0, D);\n  else {\n    size_t size = s->len + 1;  /* include trailing '\\0' */\n    if (size < 0xFF)\n      DumpByte(cast_int(size), D);\n    else {\n      DumpByte(0xFF, D);\n      DumpVar(size, D);\n    }\n    DumpVector(getstr(s), size - 1, D);  /* no need to save '\\0' */\n  }\n}\n\n\nstatic void DumpCode (const Proto *f, DumpState *D) {\n  DumpInt(f->sizecode, D);\n  DumpVector(f->code, f->sizecode, D);\n}\n\n\nstatic void DumpFunction(const Proto *f, TString *psource, DumpState *D);\n\nstatic void DumpConstants (const Proto *f, DumpState *D) {\n  int i;\n  int n = f->sizek;\n  DumpInt(n, D);\n  for (i = 0; i < n; i++) {\n    const TValue *o = &f->k[i];\n    DumpByte(ttype(o), D);\n    switch (ttype(o)) {\n    case LUA_TNIL:\n      break;\n    case LUA_TBOOLEAN:\n      DumpByte(bvalue(o), D);\n      break;\n    case LUA_TNUMFLT:\n      DumpNumber(fltvalue(o), D);\n      break;\n    case LUA_TNUMINT:\n      DumpInteger(ivalue(o), D);\n      break;\n    case LUA_TSHRSTR:\n    case LUA_TLNGSTR:\n      DumpString(tsvalue(o), D);\n      break;\n    default:\n      lua_assert(0);\n    }\n  }\n}\n\n\nstatic void DumpProtos (const Proto *f, DumpState *D) {\n  int i;\n  int n = f->sizep;\n  DumpInt(n, D);\n  for (i = 0; i < n; i++)\n    DumpFunction(f->p[i], f->source, D);\n}\n\n\nstatic void DumpUpvalues (const Proto *f, DumpState *D) {\n  int i, n = f->sizeupvalues;\n  DumpInt(n, D);\n  for (i = 0; i < n; i++) {\n    DumpByte(f->upvalues[i].instack, D);\n    DumpByte(f->upvalues[i].idx, D);\n  }\n}\n\n\nstatic void DumpDebug (const Proto *f, DumpState *D) {\n  int i, n;\n  n = (D->strip) ? 0 : f->sizelineinfo;\n  DumpInt(n, D);\n  DumpVector(f->lineinfo, n, D);\n  n = (D->strip) ? 0 : f->sizelocvars;\n  DumpInt(n, D);\n  for (i = 0; i < n; i++) {\n    DumpString(f->locvars[i].varname, D);\n    DumpInt(f->locvars[i].startpc, D);\n    DumpInt(f->locvars[i].endpc, D);\n  }\n  n = (D->strip) ? 0 : f->sizeupvalues;\n  DumpInt(n, D);\n  for (i = 0; i < n; i++)\n    DumpString(f->upvalues[i].name, D);\n}\n\n\nstatic void DumpFunction (const Proto *f, TString *psource, DumpState *D) {\n  if (D->strip || f->source == psource)\n    DumpString(NULL, D);  /* no debug info or same source as its parent */\n  else\n    DumpString(f->source, D);\n  DumpInt(f->linedefined, D);\n  DumpInt(f->lastlinedefined, D);\n  DumpByte(f->numparams, D);\n  DumpByte(f->is_vararg, D);\n  DumpByte(f->maxstacksize, D);\n  DumpCode(f, D);\n  DumpConstants(f, D);\n  DumpUpvalues(f, D);\n  DumpProtos(f, D);\n  DumpDebug(f, D);\n}\n\n\nstatic void DumpHeader (DumpState *D) {\n  DumpLiteral(LUA_SIGNATURE, D);\n  DumpByte(LUAC_VERSION, D);\n  DumpByte(LUAC_FORMAT, D);\n  DumpLiteral(LUAC_DATA, D);\n  DumpByte(sizeof(int), D);\n  DumpByte(sizeof(size_t), D);\n  DumpByte(sizeof(Instruction), D);\n  DumpByte(sizeof(lua_Integer), D);\n  DumpByte(sizeof(lua_Number), D);\n  DumpInteger(LUAC_INT, D);\n  DumpNumber(LUAC_NUM, D);\n}\n\n\n/*\n** dump Lua function as precompiled chunk\n*/\nint luaU_dump(lua_State *L, const Proto *f, lua_Writer w, void *data,\n              int strip) {\n  DumpState D;\n  D.L = L;\n  D.writer = w;\n  D.data = data;\n  D.strip = strip;\n  D.status = 0;\n  DumpHeader(&D);\n  DumpByte(f->sizeupvalues, &D);\n  DumpFunction(f, NULL, &D);\n  return D.status;\n}\n\n"
  },
  {
    "path": "externals/lua/src/lfunc.c",
    "content": "/*\n** $Id: lfunc.c,v 2.45 2014/11/02 19:19:04 roberto Exp $\n** Auxiliary functions to manipulate prototypes and closures\n** See Copyright Notice in lua.h\n*/\n\n#define lfunc_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include <stddef.h>\n\n#include \"lua.h\"\n\n#include \"lfunc.h\"\n#include \"lgc.h\"\n#include \"lmem.h\"\n#include \"lobject.h\"\n#include \"lstate.h\"\n\n\n\nCClosure *luaF_newCclosure (lua_State *L, int n) {\n  GCObject *o = luaC_newobj(L, LUA_TCCL, sizeCclosure(n));\n  CClosure *c = gco2ccl(o);\n  c->nupvalues = cast_byte(n);\n  return c;\n}\n\n\nLClosure *luaF_newLclosure (lua_State *L, int n) {\n  GCObject *o = luaC_newobj(L, LUA_TLCL, sizeLclosure(n));\n  LClosure *c = gco2lcl(o);\n  c->p = NULL;\n  c->nupvalues = cast_byte(n);\n  while (n--) c->upvals[n] = NULL;\n  return c;\n}\n\n/*\n** fill a closure with new closed upvalues\n*/\nvoid luaF_initupvals (lua_State *L, LClosure *cl) {\n  int i;\n  for (i = 0; i < cl->nupvalues; i++) {\n    UpVal *uv = luaM_new(L, UpVal);\n    uv->refcount = 1;\n    uv->v = &uv->u.value;  /* make it closed */\n    setnilvalue(uv->v);\n    cl->upvals[i] = uv;\n  }\n}\n\n\nUpVal *luaF_findupval (lua_State *L, StkId level) {\n  UpVal **pp = &L->openupval;\n  UpVal *p;\n  UpVal *uv;\n  lua_assert(isintwups(L) || L->openupval == NULL);\n  while (*pp != NULL && (p = *pp)->v >= level) {\n    lua_assert(upisopen(p));\n    if (p->v == level)  /* found a corresponding upvalue? */\n      return p;  /* return it */\n    pp = &p->u.open.next;\n  }\n  /* not found: create a new upvalue */\n  uv = luaM_new(L, UpVal);\n  uv->refcount = 0;\n  uv->u.open.next = *pp;  /* link it to list of open upvalues */\n  uv->u.open.touched = 1;\n  *pp = uv;\n  uv->v = level;  /* current value lives in the stack */\n  if (!isintwups(L)) {  /* thread not in list of threads with upvalues? */\n    L->twups = G(L)->twups;  /* link it to the list */\n    G(L)->twups = L;\n  }\n  return uv;\n}\n\n\nvoid luaF_close (lua_State *L, StkId level) {\n  UpVal *uv;\n  while (L->openupval != NULL && (uv = L->openupval)->v >= level) {\n    lua_assert(upisopen(uv));\n    L->openupval = uv->u.open.next;  /* remove from 'open' list */\n    if (uv->refcount == 0)  /* no references? */\n      luaM_free(L, uv);  /* free upvalue */\n    else {\n      setobj(L, &uv->u.value, uv->v);  /* move value to upvalue slot */\n      uv->v = &uv->u.value;  /* now current value lives here */\n      luaC_upvalbarrier(L, uv);\n    }\n  }\n}\n\n\nProto *luaF_newproto (lua_State *L) {\n  GCObject *o = luaC_newobj(L, LUA_TPROTO, sizeof(Proto));\n  Proto *f = gco2p(o);\n  f->k = NULL;\n  f->sizek = 0;\n  f->p = NULL;\n  f->sizep = 0;\n  f->code = NULL;\n  f->cache = NULL;\n  f->sizecode = 0;\n  f->lineinfo = NULL;\n  f->sizelineinfo = 0;\n  f->upvalues = NULL;\n  f->sizeupvalues = 0;\n  f->numparams = 0;\n  f->is_vararg = 0;\n  f->maxstacksize = 0;\n  f->locvars = NULL;\n  f->sizelocvars = 0;\n  f->linedefined = 0;\n  f->lastlinedefined = 0;\n  f->source = NULL;\n  return f;\n}\n\n\nvoid luaF_freeproto (lua_State *L, Proto *f) {\n  luaM_freearray(L, f->code, f->sizecode);\n  luaM_freearray(L, f->p, f->sizep);\n  luaM_freearray(L, f->k, f->sizek);\n  luaM_freearray(L, f->lineinfo, f->sizelineinfo);\n  luaM_freearray(L, f->locvars, f->sizelocvars);\n  luaM_freearray(L, f->upvalues, f->sizeupvalues);\n  luaM_free(L, f);\n}\n\n\n/*\n** Look for n-th local variable at line 'line' in function 'func'.\n** Returns NULL if not found.\n*/\nconst char *luaF_getlocalname (const Proto *f, int local_number, int pc) {\n  int i;\n  for (i = 0; i<f->sizelocvars && f->locvars[i].startpc <= pc; i++) {\n    if (pc < f->locvars[i].endpc) {  /* is variable active? */\n      local_number--;\n      if (local_number == 0)\n        return getstr(f->locvars[i].varname);\n    }\n  }\n  return NULL;  /* not found */\n}\n\n"
  },
  {
    "path": "externals/lua/src/lfunc.h",
    "content": "/*\n** $Id: lfunc.h,v 2.14 2014/06/19 18:27:20 roberto Exp $\n** Auxiliary functions to manipulate prototypes and closures\n** See Copyright Notice in lua.h\n*/\n\n#ifndef lfunc_h\n#define lfunc_h\n\n\n#include \"lobject.h\"\n\n\n#define sizeCclosure(n)\t(cast(int, sizeof(CClosure)) + \\\n                         cast(int, sizeof(TValue)*((n)-1)))\n\n#define sizeLclosure(n)\t(cast(int, sizeof(LClosure)) + \\\n                         cast(int, sizeof(TValue *)*((n)-1)))\n\n\n/* test whether thread is in 'twups' list */\n#define isintwups(L)\t(L->twups != L)\n\n\n/*\n** Upvalues for Lua closures\n*/\nstruct UpVal {\n  TValue *v;  /* points to stack or to its own value */\n  lu_mem refcount;  /* reference counter */\n  union {\n    struct {  /* (when open) */\n      UpVal *next;  /* linked list */\n      int touched;  /* mark to avoid cycles with dead threads */\n    } open;\n    TValue value;  /* the value (when closed) */\n  } u;\n};\n\n#define upisopen(up)\t((up)->v != &(up)->u.value)\n\n\nLUAI_FUNC Proto *luaF_newproto (lua_State *L);\nLUAI_FUNC CClosure *luaF_newCclosure (lua_State *L, int nelems);\nLUAI_FUNC LClosure *luaF_newLclosure (lua_State *L, int nelems);\nLUAI_FUNC void luaF_initupvals (lua_State *L, LClosure *cl);\nLUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level);\nLUAI_FUNC void luaF_close (lua_State *L, StkId level);\nLUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f);\nLUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number,\n                                         int pc);\n\n\n#endif\n"
  },
  {
    "path": "externals/lua/src/lgc.c",
    "content": "/*\n** $Id: lgc.c,v 2.201 2014/12/20 13:58:15 roberto Exp $\n** Garbage Collector\n** See Copyright Notice in lua.h\n*/\n\n#define lgc_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"ldebug.h\"\n#include \"ldo.h\"\n#include \"lfunc.h\"\n#include \"lgc.h\"\n#include \"lmem.h\"\n#include \"lobject.h\"\n#include \"lstate.h\"\n#include \"lstring.h\"\n#include \"ltable.h\"\n#include \"ltm.h\"\n\n\n/*\n** internal state for collector while inside the atomic phase. The\n** collector should never be in this state while running regular code.\n*/\n#define GCSinsideatomic\t\t(GCSpause + 1)\n\n/*\n** cost of sweeping one element (the size of a small object divided\n** by some adjust for the sweep speed)\n*/\n#define GCSWEEPCOST\t((sizeof(TString) + 4) / 4)\n\n/* maximum number of elements to sweep in each single step */\n#define GCSWEEPMAX\t(cast_int((GCSTEPSIZE / GCSWEEPCOST) / 4))\n\n/* cost of calling one finalizer */\n#define GCFINALIZECOST\tGCSWEEPCOST\n\n\n/*\n** macro to adjust 'stepmul': 'stepmul' is actually used like\n** 'stepmul / STEPMULADJ' (value chosen by tests)\n*/\n#define STEPMULADJ\t\t200\n\n\n/*\n** macro to adjust 'pause': 'pause' is actually used like\n** 'pause / PAUSEADJ' (value chosen by tests)\n*/\n#define PAUSEADJ\t\t100\n\n\n/*\n** 'makewhite' erases all color bits then sets only the current white\n** bit\n*/\n#define maskcolors\t(~(bitmask(BLACKBIT) | WHITEBITS))\n#define makewhite(g,x)\t\\\n (x->marked = cast_byte((x->marked & maskcolors) | luaC_white(g)))\n\n#define white2gray(x)\tresetbits(x->marked, WHITEBITS)\n#define black2gray(x)\tresetbit(x->marked, BLACKBIT)\n\n\n#define valiswhite(x)   (iscollectable(x) && iswhite(gcvalue(x)))\n\n#define checkdeadkey(n)\tlua_assert(!ttisdeadkey(gkey(n)) || ttisnil(gval(n)))\n\n\n#define checkconsistency(obj)  \\\n  lua_longassert(!iscollectable(obj) || righttt(obj))\n\n\n#define markvalue(g,o) { checkconsistency(o); \\\n  if (valiswhite(o)) reallymarkobject(g,gcvalue(o)); }\n\n#define markobject(g,t) \\\n  { if ((t) && iswhite(t)) reallymarkobject(g, obj2gco(t)); }\n\nstatic void reallymarkobject (global_State *g, GCObject *o);\n\n\n/*\n** {======================================================\n** Generic functions\n** =======================================================\n*/\n\n\n/*\n** one after last element in a hash array\n*/\n#define gnodelast(h)\tgnode(h, cast(size_t, sizenode(h)))\n\n\n/*\n** link collectable object 'o' into list pointed by 'p'\n*/\n#define linkgclist(o,p)\t((o)->gclist = (p), (p) = obj2gco(o))\n\n\n/*\n** if key is not marked, mark its entry as dead (therefore removing it\n** from the table)\n*/\nstatic void removeentry (Node *n) {\n  lua_assert(ttisnil(gval(n)));\n  if (valiswhite(gkey(n)))\n    setdeadvalue(wgkey(n));  /* unused and unmarked key; remove it */\n}\n\n\n/*\n** tells whether a key or value can be cleared from a weak\n** table. Non-collectable objects are never removed from weak\n** tables. Strings behave as 'values', so are never removed too. for\n** other objects: if really collected, cannot keep them; for objects\n** being finalized, keep them in keys, but not in values\n*/\nstatic int iscleared (global_State *g, const TValue *o) {\n  if (!iscollectable(o)) return 0;\n  else if (ttisstring(o)) {\n    markobject(g, tsvalue(o));  /* strings are 'values', so are never weak */\n    return 0;\n  }\n  else return iswhite(gcvalue(o));\n}\n\n\n/*\n** barrier that moves collector forward, that is, mark the white object\n** being pointed by a black object. (If in sweep phase, clear the black\n** object to white [sweep it] to avoid other barrier calls for this\n** same object.)\n*/\nvoid luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) {\n  global_State *g = G(L);\n  lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o));\n  if (keepinvariant(g))  /* must keep invariant? */\n    reallymarkobject(g, v);  /* restore invariant */\n  else {  /* sweep phase */\n    lua_assert(issweepphase(g));\n    makewhite(g, o);  /* mark main obj. as white to avoid other barriers */\n  }\n}\n\n\n/*\n** barrier that moves collector backward, that is, mark the black object\n** pointing to a white object as gray again.\n*/\nvoid luaC_barrierback_ (lua_State *L, Table *t) {\n  global_State *g = G(L);\n  lua_assert(isblack(t) && !isdead(g, t));\n  black2gray(t);  /* make table gray (again) */\n  linkgclist(t, g->grayagain);\n}\n\n\n/*\n** barrier for assignments to closed upvalues. Because upvalues are\n** shared among closures, it is impossible to know the color of all\n** closures pointing to it. So, we assume that the object being assigned\n** must be marked.\n*/\nvoid luaC_upvalbarrier_ (lua_State *L, UpVal *uv) {\n  global_State *g = G(L);\n  GCObject *o = gcvalue(uv->v);\n  lua_assert(!upisopen(uv));  /* ensured by macro luaC_upvalbarrier */\n  if (keepinvariant(g))\n    markobject(g, o);\n}\n\n\nvoid luaC_fix (lua_State *L, GCObject *o) {\n  global_State *g = G(L);\n  lua_assert(g->allgc == o);  /* object must be 1st in 'allgc' list! */\n  white2gray(o);  /* they will be gray forever */\n  g->allgc = o->next;  /* remove object from 'allgc' list */\n  o->next = g->fixedgc;  /* link it to 'fixedgc' list */\n  g->fixedgc = o;\n}\n\n\n/*\n** create a new collectable object (with given type and size) and link\n** it to 'allgc' list.\n*/\nGCObject *luaC_newobj (lua_State *L, int tt, size_t sz) {\n  global_State *g = G(L);\n  GCObject *o = cast(GCObject *, luaM_newobject(L, novariant(tt), sz));\n  o->marked = luaC_white(g);\n  o->tt = tt;\n  o->next = g->allgc;\n  g->allgc = o;\n  return o;\n}\n\n/* }====================================================== */\n\n\n\n/*\n** {======================================================\n** Mark functions\n** =======================================================\n*/\n\n\n/*\n** mark an object. Userdata, strings, and closed upvalues are visited\n** and turned black here. Other objects are marked gray and added\n** to appropriate list to be visited (and turned black) later. (Open\n** upvalues are already linked in 'headuv' list.)\n*/\nstatic void reallymarkobject (global_State *g, GCObject *o) {\n reentry:\n  white2gray(o);\n  switch (o->tt) {\n    case LUA_TSHRSTR:\n    case LUA_TLNGSTR: {\n      gray2black(o);\n      g->GCmemtrav += sizestring(gco2ts(o));\n      break;\n    }\n    case LUA_TUSERDATA: {\n      TValue uvalue;\n      markobject(g, gco2u(o)->metatable);  /* mark its metatable */\n      gray2black(o);\n      g->GCmemtrav += sizeudata(gco2u(o));\n      getuservalue(g->mainthread, gco2u(o), &uvalue);\n      if (valiswhite(&uvalue)) {  /* markvalue(g, &uvalue); */\n        o = gcvalue(&uvalue);\n        goto reentry;\n      }\n      break;\n    }\n    case LUA_TLCL: {\n      linkgclist(gco2lcl(o), g->gray);\n      break;\n    }\n    case LUA_TCCL: {\n      linkgclist(gco2ccl(o), g->gray);\n      break;\n    }\n    case LUA_TTABLE: {\n      linkgclist(gco2t(o), g->gray);\n      break;\n    }\n    case LUA_TTHREAD: {\n      linkgclist(gco2th(o), g->gray);\n      break;\n    }\n    case LUA_TPROTO: {\n      linkgclist(gco2p(o), g->gray);\n      break;\n    }\n    default: lua_assert(0); break;\n  }\n}\n\n\n/*\n** mark metamethods for basic types\n*/\nstatic void markmt (global_State *g) {\n  int i;\n  for (i=0; i < LUA_NUMTAGS; i++)\n    markobject(g, g->mt[i]);\n}\n\n\n/*\n** mark all objects in list of being-finalized\n*/\nstatic void markbeingfnz (global_State *g) {\n  GCObject *o;\n  for (o = g->tobefnz; o != NULL; o = o->next)\n    markobject(g, o);\n}\n\n\n/*\n** Mark all values stored in marked open upvalues from non-marked threads.\n** (Values from marked threads were already marked when traversing the\n** thread.) Remove from the list threads that no longer have upvalues and\n** not-marked threads.\n*/\nstatic void remarkupvals (global_State *g) {\n  lua_State *thread;\n  lua_State **p = &g->twups;\n  while ((thread = *p) != NULL) {\n    lua_assert(!isblack(thread));  /* threads are never black */\n    if (isgray(thread) && thread->openupval != NULL)\n      p = &thread->twups;  /* keep marked thread with upvalues in the list */\n    else {  /* thread is not marked or without upvalues */\n      UpVal *uv;\n      *p = thread->twups;  /* remove thread from the list */\n      thread->twups = thread;  /* mark that it is out of list */\n      for (uv = thread->openupval; uv != NULL; uv = uv->u.open.next) {\n        if (uv->u.open.touched) {\n          markvalue(g, uv->v);  /* remark upvalue's value */\n          uv->u.open.touched = 0;\n        }\n      }\n    }\n  }\n}\n\n\n/*\n** mark root set and reset all gray lists, to start a new collection\n*/\nstatic void restartcollection (global_State *g) {\n  g->gray = g->grayagain = NULL;\n  g->weak = g->allweak = g->ephemeron = NULL;\n  markobject(g, g->mainthread);\n  markvalue(g, &g->l_registry);\n  markmt(g);\n  markbeingfnz(g);  /* mark any finalizing object left from previous cycle */\n}\n\n/* }====================================================== */\n\n\n/*\n** {======================================================\n** Traverse functions\n** =======================================================\n*/\n\n/*\n** Traverse a table with weak values and link it to proper list. During\n** propagate phase, keep it in 'grayagain' list, to be revisited in the\n** atomic phase. In the atomic phase, if table has any white value,\n** put it in 'weak' list, to be cleared.\n*/\nstatic void traverseweakvalue (global_State *g, Table *h) {\n  Node *n, *limit = gnodelast(h);\n  /* if there is array part, assume it may have white values (it is not\n     worth traversing it now just to check) */\n  int hasclears = (h->sizearray > 0);\n  for (n = gnode(h, 0); n < limit; n++) {  /* traverse hash part */\n    checkdeadkey(n);\n    if (ttisnil(gval(n)))  /* entry is empty? */\n      removeentry(n);  /* remove it */\n    else {\n      lua_assert(!ttisnil(gkey(n)));\n      markvalue(g, gkey(n));  /* mark key */\n      if (!hasclears && iscleared(g, gval(n)))  /* is there a white value? */\n        hasclears = 1;  /* table will have to be cleared */\n    }\n  }\n  if (g->gcstate == GCSpropagate)\n    linkgclist(h, g->grayagain);  /* must retraverse it in atomic phase */\n  else if (hasclears)\n    linkgclist(h, g->weak);  /* has to be cleared later */\n}\n\n\n/*\n** Traverse an ephemeron table and link it to proper list. Returns true\n** iff any object was marked during this traversal (which implies that\n** convergence has to continue). During propagation phase, keep table\n** in 'grayagain' list, to be visited again in the atomic phase. In\n** the atomic phase, if table has any white->white entry, it has to\n** be revisited during ephemeron convergence (as that key may turn\n** black). Otherwise, if it has any white key, table has to be cleared\n** (in the atomic phase).\n*/\nstatic int traverseephemeron (global_State *g, Table *h) {\n  int marked = 0;  /* true if an object is marked in this traversal */\n  int hasclears = 0;  /* true if table has white keys */\n  int hasww = 0;  /* true if table has entry \"white-key -> white-value\" */\n  Node *n, *limit = gnodelast(h);\n  unsigned int i;\n  /* traverse array part */\n  for (i = 0; i < h->sizearray; i++) {\n    if (valiswhite(&h->array[i])) {\n      marked = 1;\n      reallymarkobject(g, gcvalue(&h->array[i]));\n    }\n  }\n  /* traverse hash part */\n  for (n = gnode(h, 0); n < limit; n++) {\n    checkdeadkey(n);\n    if (ttisnil(gval(n)))  /* entry is empty? */\n      removeentry(n);  /* remove it */\n    else if (iscleared(g, gkey(n))) {  /* key is not marked (yet)? */\n      hasclears = 1;  /* table must be cleared */\n      if (valiswhite(gval(n)))  /* value not marked yet? */\n        hasww = 1;  /* white-white entry */\n    }\n    else if (valiswhite(gval(n))) {  /* value not marked yet? */\n      marked = 1;\n      reallymarkobject(g, gcvalue(gval(n)));  /* mark it now */\n    }\n  }\n  /* link table into proper list */\n  if (g->gcstate == GCSpropagate)\n    linkgclist(h, g->grayagain);  /* must retraverse it in atomic phase */\n  else if (hasww)  /* table has white->white entries? */\n    linkgclist(h, g->ephemeron);  /* have to propagate again */\n  else if (hasclears)  /* table has white keys? */\n    linkgclist(h, g->allweak);  /* may have to clean white keys */\n  return marked;\n}\n\n\nstatic void traversestrongtable (global_State *g, Table *h) {\n  Node *n, *limit = gnodelast(h);\n  unsigned int i;\n  for (i = 0; i < h->sizearray; i++)  /* traverse array part */\n    markvalue(g, &h->array[i]);\n  for (n = gnode(h, 0); n < limit; n++) {  /* traverse hash part */\n    checkdeadkey(n);\n    if (ttisnil(gval(n)))  /* entry is empty? */\n      removeentry(n);  /* remove it */\n    else {\n      lua_assert(!ttisnil(gkey(n)));\n      markvalue(g, gkey(n));  /* mark key */\n      markvalue(g, gval(n));  /* mark value */\n    }\n  }\n}\n\n\nstatic lu_mem traversetable (global_State *g, Table *h) {\n  const char *weakkey, *weakvalue;\n  const TValue *mode = gfasttm(g, h->metatable, TM_MODE);\n  markobject(g, h->metatable);\n  if (mode && ttisstring(mode) &&  /* is there a weak mode? */\n      ((weakkey = strchr(svalue(mode), 'k')),\n       (weakvalue = strchr(svalue(mode), 'v')),\n       (weakkey || weakvalue))) {  /* is really weak? */\n    black2gray(h);  /* keep table gray */\n    if (!weakkey)  /* strong keys? */\n      traverseweakvalue(g, h);\n    else if (!weakvalue)  /* strong values? */\n      traverseephemeron(g, h);\n    else  /* all weak */\n      linkgclist(h, g->allweak);  /* nothing to traverse now */\n  }\n  else  /* not weak */\n    traversestrongtable(g, h);\n  return sizeof(Table) + sizeof(TValue) * h->sizearray +\n                         sizeof(Node) * cast(size_t, sizenode(h));\n}\n\n\nstatic int traverseproto (global_State *g, Proto *f) {\n  int i;\n  if (f->cache && iswhite(f->cache))\n    f->cache = NULL;  /* allow cache to be collected */\n  markobject(g, f->source);\n  for (i = 0; i < f->sizek; i++)  /* mark literals */\n    markvalue(g, &f->k[i]);\n  for (i = 0; i < f->sizeupvalues; i++)  /* mark upvalue names */\n    markobject(g, f->upvalues[i].name);\n  for (i = 0; i < f->sizep; i++)  /* mark nested protos */\n    markobject(g, f->p[i]);\n  for (i = 0; i < f->sizelocvars; i++)  /* mark local-variable names */\n    markobject(g, f->locvars[i].varname);\n  return sizeof(Proto) + sizeof(Instruction) * f->sizecode +\n                         sizeof(Proto *) * f->sizep +\n                         sizeof(TValue) * f->sizek +\n                         sizeof(int) * f->sizelineinfo +\n                         sizeof(LocVar) * f->sizelocvars +\n                         sizeof(Upvaldesc) * f->sizeupvalues;\n}\n\n\nstatic lu_mem traverseCclosure (global_State *g, CClosure *cl) {\n  int i;\n  for (i = 0; i < cl->nupvalues; i++)  /* mark its upvalues */\n    markvalue(g, &cl->upvalue[i]);\n  return sizeCclosure(cl->nupvalues);\n}\n\n/*\n** open upvalues point to values in a thread, so those values should\n** be marked when the thread is traversed except in the atomic phase\n** (because then the value cannot be changed by the thread and the\n** thread may not be traversed again)\n*/\nstatic lu_mem traverseLclosure (global_State *g, LClosure *cl) {\n  int i;\n  markobject(g, cl->p);  /* mark its prototype */\n  for (i = 0; i < cl->nupvalues; i++) {  /* mark its upvalues */\n    UpVal *uv = cl->upvals[i];\n    if (uv != NULL) {\n      if (upisopen(uv) && g->gcstate != GCSinsideatomic)\n        uv->u.open.touched = 1;  /* can be marked in 'remarkupvals' */\n      else\n        markvalue(g, uv->v);\n    }\n  }\n  return sizeLclosure(cl->nupvalues);\n}\n\n\nstatic lu_mem traversethread (global_State *g, lua_State *th) {\n  StkId o = th->stack;\n  if (o == NULL)\n    return 1;  /* stack not completely built yet */\n  lua_assert(g->gcstate == GCSinsideatomic ||\n             th->openupval == NULL || isintwups(th));\n  for (; o < th->top; o++)  /* mark live elements in the stack */\n    markvalue(g, o);\n  if (g->gcstate == GCSinsideatomic) {  /* final traversal? */\n    StkId lim = th->stack + th->stacksize;  /* real end of stack */\n    for (; o < lim; o++)  /* clear not-marked stack slice */\n      setnilvalue(o);\n    /* 'remarkupvals' may have removed thread from 'twups' list */ \n    if (!isintwups(th) && th->openupval != NULL) {\n      th->twups = g->twups;  /* link it back to the list */\n      g->twups = th;\n    }\n  }\n  else if (g->gckind != KGC_EMERGENCY)\n    luaD_shrinkstack(th); /* do not change stack in emergency cycle */\n  return (sizeof(lua_State) + sizeof(TValue) * th->stacksize);\n}\n\n\n/*\n** traverse one gray object, turning it to black (except for threads,\n** which are always gray).\n*/\nstatic void propagatemark (global_State *g) {\n  lu_mem size;\n  GCObject *o = g->gray;\n  lua_assert(isgray(o));\n  gray2black(o);\n  switch (o->tt) {\n    case LUA_TTABLE: {\n      Table *h = gco2t(o);\n      g->gray = h->gclist;  /* remove from 'gray' list */\n      size = traversetable(g, h);\n      break;\n    }\n    case LUA_TLCL: {\n      LClosure *cl = gco2lcl(o);\n      g->gray = cl->gclist;  /* remove from 'gray' list */\n      size = traverseLclosure(g, cl);\n      break;\n    }\n    case LUA_TCCL: {\n      CClosure *cl = gco2ccl(o);\n      g->gray = cl->gclist;  /* remove from 'gray' list */\n      size = traverseCclosure(g, cl);\n      break;\n    }\n    case LUA_TTHREAD: {\n      lua_State *th = gco2th(o);\n      g->gray = th->gclist;  /* remove from 'gray' list */\n      linkgclist(th, g->grayagain);  /* insert into 'grayagain' list */\n      black2gray(o);\n      size = traversethread(g, th);\n      break;\n    }\n    case LUA_TPROTO: {\n      Proto *p = gco2p(o);\n      g->gray = p->gclist;  /* remove from 'gray' list */\n      size = traverseproto(g, p);\n      break;\n    }\n    default: lua_assert(0); return;\n  }\n  g->GCmemtrav += size;\n}\n\n\nstatic void propagateall (global_State *g) {\n  while (g->gray) propagatemark(g);\n}\n\n\nstatic void convergeephemerons (global_State *g) {\n  int changed;\n  do {\n    GCObject *w;\n    GCObject *next = g->ephemeron;  /* get ephemeron list */\n    g->ephemeron = NULL;  /* tables may return to this list when traversed */\n    changed = 0;\n    while ((w = next) != NULL) {\n      next = gco2t(w)->gclist;\n      if (traverseephemeron(g, gco2t(w))) {  /* traverse marked some value? */\n        propagateall(g);  /* propagate changes */\n        changed = 1;  /* will have to revisit all ephemeron tables */\n      }\n    }\n  } while (changed);\n}\n\n/* }====================================================== */\n\n\n/*\n** {======================================================\n** Sweep Functions\n** =======================================================\n*/\n\n\n/*\n** clear entries with unmarked keys from all weaktables in list 'l' up\n** to element 'f'\n*/\nstatic void clearkeys (global_State *g, GCObject *l, GCObject *f) {\n  for (; l != f; l = gco2t(l)->gclist) {\n    Table *h = gco2t(l);\n    Node *n, *limit = gnodelast(h);\n    for (n = gnode(h, 0); n < limit; n++) {\n      if (!ttisnil(gval(n)) && (iscleared(g, gkey(n)))) {\n        setnilvalue(gval(n));  /* remove value ... */\n        removeentry(n);  /* and remove entry from table */\n      }\n    }\n  }\n}\n\n\n/*\n** clear entries with unmarked values from all weaktables in list 'l' up\n** to element 'f'\n*/\nstatic void clearvalues (global_State *g, GCObject *l, GCObject *f) {\n  for (; l != f; l = gco2t(l)->gclist) {\n    Table *h = gco2t(l);\n    Node *n, *limit = gnodelast(h);\n    unsigned int i;\n    for (i = 0; i < h->sizearray; i++) {\n      TValue *o = &h->array[i];\n      if (iscleared(g, o))  /* value was collected? */\n        setnilvalue(o);  /* remove value */\n    }\n    for (n = gnode(h, 0); n < limit; n++) {\n      if (!ttisnil(gval(n)) && iscleared(g, gval(n))) {\n        setnilvalue(gval(n));  /* remove value ... */\n        removeentry(n);  /* and remove entry from table */\n      }\n    }\n  }\n}\n\n\nvoid luaC_upvdeccount (lua_State *L, UpVal *uv) {\n  lua_assert(uv->refcount > 0);\n  uv->refcount--;\n  if (uv->refcount == 0 && !upisopen(uv))\n    luaM_free(L, uv);\n}\n\n\nstatic void freeLclosure (lua_State *L, LClosure *cl) {\n  int i;\n  for (i = 0; i < cl->nupvalues; i++) {\n    UpVal *uv = cl->upvals[i];\n    if (uv)\n      luaC_upvdeccount(L, uv);\n  }\n  luaM_freemem(L, cl, sizeLclosure(cl->nupvalues));\n}\n\n\nstatic void freeobj (lua_State *L, GCObject *o) {\n  switch (o->tt) {\n    case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break;\n    case LUA_TLCL: {\n      freeLclosure(L, gco2lcl(o));\n      break;\n    }\n    case LUA_TCCL: {\n      luaM_freemem(L, o, sizeCclosure(gco2ccl(o)->nupvalues));\n      break;\n    }\n    case LUA_TTABLE: luaH_free(L, gco2t(o)); break;\n    case LUA_TTHREAD: luaE_freethread(L, gco2th(o)); break;\n    case LUA_TUSERDATA: luaM_freemem(L, o, sizeudata(gco2u(o))); break;\n    case LUA_TSHRSTR:\n      luaS_remove(L, gco2ts(o));  /* remove it from hash table */\n      /* go through */\n    case LUA_TLNGSTR: {\n      luaM_freemem(L, o, sizestring(gco2ts(o)));\n      break;\n    }\n    default: lua_assert(0);\n  }\n}\n\n\n#define sweepwholelist(L,p)\tsweeplist(L,p,MAX_LUMEM)\nstatic GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count);\n\n\n/*\n** sweep at most 'count' elements from a list of GCObjects erasing dead\n** objects, where a dead object is one marked with the old (non current)\n** white; change all non-dead objects back to white, preparing for next\n** collection cycle. Return where to continue the traversal or NULL if\n** list is finished.\n*/\nstatic GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count) {\n  global_State *g = G(L);\n  int ow = otherwhite(g);\n  int white = luaC_white(g);  /* current white */\n  while (*p != NULL && count-- > 0) {\n    GCObject *curr = *p;\n    int marked = curr->marked;\n    if (isdeadm(ow, marked)) {  /* is 'curr' dead? */\n      *p = curr->next;  /* remove 'curr' from list */\n      freeobj(L, curr);  /* erase 'curr' */\n    }\n    else {  /* change mark to 'white' */\n      curr->marked = cast_byte((marked & maskcolors) | white);\n      p = &curr->next;  /* go to next element */\n    }\n  }\n  return (*p == NULL) ? NULL : p;\n}\n\n\n/*\n** sweep a list until a live object (or end of list)\n*/\nstatic GCObject **sweeptolive (lua_State *L, GCObject **p, int *n) {\n  GCObject **old = p;\n  int i = 0;\n  do {\n    i++;\n    p = sweeplist(L, p, 1);\n  } while (p == old);\n  if (n) *n += i;\n  return p;\n}\n\n/* }====================================================== */\n\n\n/*\n** {======================================================\n** Finalization\n** =======================================================\n*/\n\n/*\n** If possible, free concatenation buffer and shrink string table\n*/\nstatic void checkSizes (lua_State *L, global_State *g) {\n  if (g->gckind != KGC_EMERGENCY) {\n    l_mem olddebt = g->GCdebt;\n    luaZ_freebuffer(L, &g->buff);  /* free concatenation buffer */\n    if (g->strt.nuse < g->strt.size / 4)  /* string table too big? */\n      luaS_resize(L, g->strt.size / 2);  /* shrink it a little */\n    g->GCestimate += g->GCdebt - olddebt;  /* update estimate */\n  }\n}\n\n\nstatic GCObject *udata2finalize (global_State *g) {\n  GCObject *o = g->tobefnz;  /* get first element */\n  lua_assert(tofinalize(o));\n  g->tobefnz = o->next;  /* remove it from 'tobefnz' list */\n  o->next = g->allgc;  /* return it to 'allgc' list */\n  g->allgc = o;\n  resetbit(o->marked, FINALIZEDBIT);  /* object is \"normal\" again */\n  if (issweepphase(g))\n    makewhite(g, o);  /* \"sweep\" object */\n  return o;\n}\n\n\nstatic void dothecall (lua_State *L, void *ud) {\n  UNUSED(ud);\n  luaD_call(L, L->top - 2, 0, 0);\n}\n\n\nstatic void GCTM (lua_State *L, int propagateerrors) {\n  global_State *g = G(L);\n  const TValue *tm;\n  TValue v;\n  setgcovalue(L, &v, udata2finalize(g));\n  tm = luaT_gettmbyobj(L, &v, TM_GC);\n  if (tm != NULL && ttisfunction(tm)) {  /* is there a finalizer? */\n    int status;\n    lu_byte oldah = L->allowhook;\n    int running  = g->gcrunning;\n    L->allowhook = 0;  /* stop debug hooks during GC metamethod */\n    g->gcrunning = 0;  /* avoid GC steps */\n    setobj2s(L, L->top, tm);  /* push finalizer... */\n    setobj2s(L, L->top + 1, &v);  /* ... and its argument */\n    L->top += 2;  /* and (next line) call the finalizer */\n    status = luaD_pcall(L, dothecall, NULL, savestack(L, L->top - 2), 0);\n    L->allowhook = oldah;  /* restore hooks */\n    g->gcrunning = running;  /* restore state */\n    if (status != LUA_OK && propagateerrors) {  /* error while running __gc? */\n      if (status == LUA_ERRRUN) {  /* is there an error object? */\n        const char *msg = (ttisstring(L->top - 1))\n                            ? svalue(L->top - 1)\n                            : \"no message\";\n        luaO_pushfstring(L, \"error in __gc metamethod (%s)\", msg);\n        status = LUA_ERRGCMM;  /* error in __gc metamethod */\n      }\n      luaD_throw(L, status);  /* re-throw error */\n    }\n  }\n}\n\n\n/*\n** call a few (up to 'g->gcfinnum') finalizers\n*/\nstatic int runafewfinalizers (lua_State *L) {\n  global_State *g = G(L);\n  unsigned int i;\n  lua_assert(!g->tobefnz || g->gcfinnum > 0);\n  for (i = 0; g->tobefnz && i < g->gcfinnum; i++)\n    GCTM(L, 1);  /* call one finalizer */\n  g->gcfinnum = (!g->tobefnz) ? 0  /* nothing more to finalize? */\n                    : g->gcfinnum * 2;  /* else call a few more next time */\n  return i;\n}\n\n\n/*\n** call all pending finalizers\n*/\nstatic void callallpendingfinalizers (lua_State *L, int propagateerrors) {\n  global_State *g = G(L);\n  while (g->tobefnz)\n    GCTM(L, propagateerrors);\n}\n\n\n/*\n** find last 'next' field in list 'p' list (to add elements in its end)\n*/\nstatic GCObject **findlast (GCObject **p) {\n  while (*p != NULL)\n    p = &(*p)->next;\n  return p;\n}\n\n\n/*\n** move all unreachable objects (or 'all' objects) that need\n** finalization from list 'finobj' to list 'tobefnz' (to be finalized)\n*/\nstatic void separatetobefnz (global_State *g, int all) {\n  GCObject *curr;\n  GCObject **p = &g->finobj;\n  GCObject **lastnext = findlast(&g->tobefnz);\n  while ((curr = *p) != NULL) {  /* traverse all finalizable objects */\n    lua_assert(tofinalize(curr));\n    if (!(iswhite(curr) || all))  /* not being collected? */\n      p = &curr->next;  /* don't bother with it */\n    else {\n      *p = curr->next;  /* remove 'curr' from 'finobj' list */\n      curr->next = *lastnext;  /* link at the end of 'tobefnz' list */\n      *lastnext = curr;\n      lastnext = &curr->next;\n    }\n  }\n}\n\n\n/*\n** if object 'o' has a finalizer, remove it from 'allgc' list (must\n** search the list to find it) and link it in 'finobj' list.\n*/\nvoid luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt) {\n  global_State *g = G(L);\n  if (tofinalize(o) ||                 /* obj. is already marked... */\n      gfasttm(g, mt, TM_GC) == NULL)   /* or has no finalizer? */\n    return;  /* nothing to be done */\n  else {  /* move 'o' to 'finobj' list */\n    GCObject **p;\n    if (issweepphase(g)) {\n      makewhite(g, o);  /* \"sweep\" object 'o' */\n      if (g->sweepgc == &o->next)  /* should not remove 'sweepgc' object */\n        g->sweepgc = sweeptolive(L, g->sweepgc, NULL);  /* change 'sweepgc' */\n    }\n    /* search for pointer pointing to 'o' */\n    for (p = &g->allgc; *p != o; p = &(*p)->next) { /* empty */ }\n    *p = o->next;  /* remove 'o' from 'allgc' list */\n    o->next = g->finobj;  /* link it in 'finobj' list */\n    g->finobj = o;\n    l_setbit(o->marked, FINALIZEDBIT);  /* mark it as such */\n  }\n}\n\n/* }====================================================== */\n\n\n\n/*\n** {======================================================\n** GC control\n** =======================================================\n*/\n\n\n/*\n** Set a reasonable \"time\" to wait before starting a new GC cycle; cycle\n** will start when memory use hits threshold. (Division by 'estimate'\n** should be OK: it cannot be zero (because Lua cannot even start with\n** less than PAUSEADJ bytes).\n*/\nstatic void setpause (global_State *g) {\n  l_mem threshold, debt;\n  l_mem estimate = g->GCestimate / PAUSEADJ;  /* adjust 'estimate' */\n  lua_assert(estimate > 0);\n  threshold = (g->gcpause < MAX_LMEM / estimate)  /* overflow? */\n            ? estimate * g->gcpause  /* no overflow */\n            : MAX_LMEM;  /* overflow; truncate to maximum */\n  debt = gettotalbytes(g) - threshold;\n  luaE_setdebt(g, debt);\n}\n\n\n/*\n** Enter first sweep phase.\n** The call to 'sweeptolive' makes pointer point to an object inside\n** the list (instead of to the header), so that the real sweep do not\n** need to skip objects created between \"now\" and the start of the real\n** sweep.\n** Returns how many objects it swept.\n*/\nstatic int entersweep (lua_State *L) {\n  global_State *g = G(L);\n  int n = 0;\n  g->gcstate = GCSswpallgc;\n  lua_assert(g->sweepgc == NULL);\n  g->sweepgc = sweeptolive(L, &g->allgc, &n);\n  return n;\n}\n\n\nvoid luaC_freeallobjects (lua_State *L) {\n  global_State *g = G(L);\n  separatetobefnz(g, 1);  /* separate all objects with finalizers */\n  lua_assert(g->finobj == NULL);\n  callallpendingfinalizers(L, 0);\n  lua_assert(g->tobefnz == NULL);\n  g->currentwhite = WHITEBITS; /* this \"white\" makes all objects look dead */\n  g->gckind = KGC_NORMAL;\n  sweepwholelist(L, &g->finobj);\n  sweepwholelist(L, &g->allgc);\n  sweepwholelist(L, &g->fixedgc);  /* collect fixed objects */\n  lua_assert(g->strt.nuse == 0);\n}\n\n\nstatic l_mem atomic (lua_State *L) {\n  global_State *g = G(L);\n  l_mem work;\n  GCObject *origweak, *origall;\n  GCObject *grayagain = g->grayagain;  /* save original list */\n  lua_assert(g->ephemeron == NULL && g->weak == NULL);\n  lua_assert(!iswhite(g->mainthread));\n  g->gcstate = GCSinsideatomic;\n  g->GCmemtrav = 0;  /* start counting work */\n  markobject(g, L);  /* mark running thread */\n  /* registry and global metatables may be changed by API */\n  markvalue(g, &g->l_registry);\n  markmt(g);  /* mark global metatables */\n  /* remark occasional upvalues of (maybe) dead threads */\n  remarkupvals(g);\n  propagateall(g);  /* propagate changes */\n  work = g->GCmemtrav;  /* stop counting (do not recount 'grayagain') */\n  g->gray = grayagain;\n  propagateall(g);  /* traverse 'grayagain' list */\n  g->GCmemtrav = 0;  /* restart counting */\n  convergeephemerons(g);\n  /* at this point, all strongly accessible objects are marked. */\n  /* Clear values from weak tables, before checking finalizers */\n  clearvalues(g, g->weak, NULL);\n  clearvalues(g, g->allweak, NULL);\n  origweak = g->weak; origall = g->allweak;\n  work += g->GCmemtrav;  /* stop counting (objects being finalized) */\n  separatetobefnz(g, 0);  /* separate objects to be finalized */\n  g->gcfinnum = 1;  /* there may be objects to be finalized */\n  markbeingfnz(g);  /* mark objects that will be finalized */\n  propagateall(g);  /* remark, to propagate 'resurrection' */\n  g->GCmemtrav = 0;  /* restart counting */\n  convergeephemerons(g);\n  /* at this point, all resurrected objects are marked. */\n  /* remove dead objects from weak tables */\n  clearkeys(g, g->ephemeron, NULL);  /* clear keys from all ephemeron tables */\n  clearkeys(g, g->allweak, NULL);  /* clear keys from all 'allweak' tables */\n  /* clear values from resurrected weak tables */\n  clearvalues(g, g->weak, origweak);\n  clearvalues(g, g->allweak, origall);\n  g->currentwhite = cast_byte(otherwhite(g));  /* flip current white */\n  work += g->GCmemtrav;  /* complete counting */\n  return work;  /* estimate of memory marked by 'atomic' */\n}\n\n\nstatic lu_mem sweepstep (lua_State *L, global_State *g,\n                         int nextstate, GCObject **nextlist) {\n  if (g->sweepgc) {\n    l_mem olddebt = g->GCdebt;\n    g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX);\n    g->GCestimate += g->GCdebt - olddebt;  /* update estimate */\n    if (g->sweepgc)  /* is there still something to sweep? */\n      return (GCSWEEPMAX * GCSWEEPCOST);\n  }\n  /* else enter next state */\n  g->gcstate = nextstate;\n  g->sweepgc = nextlist;\n  return 0;\n}\n\n\nstatic lu_mem singlestep (lua_State *L) {\n  global_State *g = G(L);\n  switch (g->gcstate) {\n    case GCSpause: {\n      g->GCmemtrav = g->strt.size * sizeof(GCObject*);\n      restartcollection(g);\n      g->gcstate = GCSpropagate;\n      return g->GCmemtrav;\n    }\n    case GCSpropagate: {\n      g->GCmemtrav = 0;\n      lua_assert(g->gray);\n      propagatemark(g);\n       if (g->gray == NULL)  /* no more gray objects? */\n        g->gcstate = GCSatomic;  /* finish propagate phase */\n      return g->GCmemtrav;  /* memory traversed in this step */\n    }\n    case GCSatomic: {\n      lu_mem work;\n      int sw;\n      propagateall(g);  /* make sure gray list is empty */\n      work = atomic(L);  /* work is what was traversed by 'atomic' */\n      sw = entersweep(L);\n      g->GCestimate = gettotalbytes(g);  /* first estimate */;\n      return work + sw * GCSWEEPCOST;\n    }\n    case GCSswpallgc: {  /* sweep \"regular\" objects */\n      return sweepstep(L, g, GCSswpfinobj, &g->finobj);\n    }\n    case GCSswpfinobj: {  /* sweep objects with finalizers */\n      return sweepstep(L, g, GCSswptobefnz, &g->tobefnz);\n    }\n    case GCSswptobefnz: {  /* sweep objects to be finalized */\n      return sweepstep(L, g, GCSswpend, NULL);\n    }\n    case GCSswpend: {  /* finish sweeps */\n      makewhite(g, g->mainthread);  /* sweep main thread */\n      checkSizes(L, g);\n      g->gcstate = GCScallfin;\n      return 0;\n    }\n    case GCScallfin: {  /* call remaining finalizers */\n      if (g->tobefnz && g->gckind != KGC_EMERGENCY) {\n        int n = runafewfinalizers(L);\n        return (n * GCFINALIZECOST);\n      }\n      else {  /* emergency mode or no more finalizers */\n        g->gcstate = GCSpause;  /* finish collection */\n        return 0;\n      }\n    }\n    default: lua_assert(0); return 0;\n  }\n}\n\n\n/*\n** advances the garbage collector until it reaches a state allowed\n** by 'statemask'\n*/\nvoid luaC_runtilstate (lua_State *L, int statesmask) {\n  global_State *g = G(L);\n  while (!testbit(statesmask, g->gcstate))\n    singlestep(L);\n}\n\n\n/*\n** get GC debt and convert it from Kb to 'work units' (avoid zero debt\n** and overflows)\n*/\nstatic l_mem getdebt (global_State *g) {\n  l_mem debt = g->GCdebt;\n  int stepmul = g->gcstepmul;\n  debt = (debt / STEPMULADJ) + 1;\n  debt = (debt < MAX_LMEM / stepmul) ? debt * stepmul : MAX_LMEM;\n  return debt;\n}\n\n/*\n** performs a basic GC step when collector is running\n*/\nvoid luaC_step (lua_State *L) {\n  global_State *g = G(L);\n  l_mem debt = getdebt(g);  /* GC deficit (be paid now) */\n  if (!g->gcrunning) {  /* not running? */\n    luaE_setdebt(g, -GCSTEPSIZE * 10);  /* avoid being called too often */\n    return;\n  }\n  do {  /* repeat until pause or enough \"credit\" (negative debt) */\n    lu_mem work = singlestep(L);  /* perform one single step */\n    debt -= work;\n  } while (debt > -GCSTEPSIZE && g->gcstate != GCSpause);\n  if (g->gcstate == GCSpause)\n    setpause(g);  /* pause until next cycle */\n  else {\n    debt = (debt / g->gcstepmul) * STEPMULADJ;  /* convert 'work units' to Kb */\n    luaE_setdebt(g, debt);\n    runafewfinalizers(L);\n  }\n}\n\n\n/*\n** Performs a full GC cycle; if 'isemergency', set a flag to avoid\n** some operations which could change the interpreter state in some\n** unexpected ways (running finalizers and shrinking some structures).\n** Before running the collection, check 'keepinvariant'; if it is true,\n** there may be some objects marked as black, so the collector has\n** to sweep all objects to turn them back to white (as white has not\n** changed, nothing will be collected).\n*/\nvoid luaC_fullgc (lua_State *L, int isemergency) {\n  global_State *g = G(L);\n  lua_assert(g->gckind == KGC_NORMAL);\n  if (isemergency) g->gckind = KGC_EMERGENCY;  /* set flag */\n  if (keepinvariant(g)) {  /* black objects? */\n    entersweep(L); /* sweep everything to turn them back to white */\n  }\n  /* finish any pending sweep phase to start a new cycle */\n  luaC_runtilstate(L, bitmask(GCSpause));\n  luaC_runtilstate(L, ~bitmask(GCSpause));  /* start new collection */\n  luaC_runtilstate(L, bitmask(GCScallfin));  /* run up to finalizers */\n  /* estimate must be correct after a full GC cycle */\n  lua_assert(g->GCestimate == gettotalbytes(g));\n  luaC_runtilstate(L, bitmask(GCSpause));  /* finish collection */\n  g->gckind = KGC_NORMAL;\n  setpause(g);\n}\n\n/* }====================================================== */\n\n\n"
  },
  {
    "path": "externals/lua/src/lgc.h",
    "content": "/*\n** $Id: lgc.h,v 2.86 2014/10/25 11:50:46 roberto Exp $\n** Garbage Collector\n** See Copyright Notice in lua.h\n*/\n\n#ifndef lgc_h\n#define lgc_h\n\n\n#include \"lobject.h\"\n#include \"lstate.h\"\n\n/*\n** Collectable objects may have one of three colors: white, which\n** means the object is not marked; gray, which means the\n** object is marked, but its references may be not marked; and\n** black, which means that the object and all its references are marked.\n** The main invariant of the garbage collector, while marking objects,\n** is that a black object can never point to a white one. Moreover,\n** any gray object must be in a \"gray list\" (gray, grayagain, weak,\n** allweak, ephemeron) so that it can be visited again before finishing\n** the collection cycle. These lists have no meaning when the invariant\n** is not being enforced (e.g., sweep phase).\n*/\n\n\n\n/* how much to allocate before next GC step */\n#if !defined(GCSTEPSIZE)\n/* ~100 small strings */\n#define GCSTEPSIZE\t(cast_int(100 * sizeof(TString)))\n#endif\n\n\n/*\n** Possible states of the Garbage Collector\n*/\n#define GCSpropagate\t0\n#define GCSatomic\t1\n#define GCSswpallgc\t2\n#define GCSswpfinobj\t3\n#define GCSswptobefnz\t4\n#define GCSswpend\t5\n#define GCScallfin\t6\n#define GCSpause\t7\n\n\n#define issweepphase(g)  \\\n\t(GCSswpallgc <= (g)->gcstate && (g)->gcstate <= GCSswpend)\n\n\n/*\n** macro to tell when main invariant (white objects cannot point to black\n** ones) must be kept. During a collection, the sweep\n** phase may break the invariant, as objects turned white may point to\n** still-black objects. The invariant is restored when sweep ends and\n** all objects are white again.\n*/\n\n#define keepinvariant(g)\t((g)->gcstate <= GCSatomic)\n\n\n/*\n** some useful bit tricks\n*/\n#define resetbits(x,m)\t\t((x) &= cast(lu_byte, ~(m)))\n#define setbits(x,m)\t\t((x) |= (m))\n#define testbits(x,m)\t\t((x) & (m))\n#define bitmask(b)\t\t(1<<(b))\n#define bit2mask(b1,b2)\t\t(bitmask(b1) | bitmask(b2))\n#define l_setbit(x,b)\t\tsetbits(x, bitmask(b))\n#define resetbit(x,b)\t\tresetbits(x, bitmask(b))\n#define testbit(x,b)\t\ttestbits(x, bitmask(b))\n\n\n/* Layout for bit use in 'marked' field: */\n#define WHITE0BIT\t0  /* object is white (type 0) */\n#define WHITE1BIT\t1  /* object is white (type 1) */\n#define BLACKBIT\t2  /* object is black */\n#define FINALIZEDBIT\t3  /* object has been marked for finalization */\n/* bit 7 is currently used by tests (luaL_checkmemory) */\n\n#define WHITEBITS\tbit2mask(WHITE0BIT, WHITE1BIT)\n\n\n#define iswhite(x)      testbits((x)->marked, WHITEBITS)\n#define isblack(x)      testbit((x)->marked, BLACKBIT)\n#define isgray(x)  /* neither white nor black */  \\\n\t(!testbits((x)->marked, WHITEBITS | bitmask(BLACKBIT)))\n\n#define tofinalize(x)\ttestbit((x)->marked, FINALIZEDBIT)\n\n#define otherwhite(g)\t((g)->currentwhite ^ WHITEBITS)\n#define isdeadm(ow,m)\t(!(((m) ^ WHITEBITS) & (ow)))\n#define isdead(g,v)\tisdeadm(otherwhite(g), (v)->marked)\n\n#define changewhite(x)\t((x)->marked ^= WHITEBITS)\n#define gray2black(x)\tl_setbit((x)->marked, BLACKBIT)\n\n#define luaC_white(g)\tcast(lu_byte, (g)->currentwhite & WHITEBITS)\n\n\n#define luaC_condGC(L,c) \\\n\t{if (G(L)->GCdebt > 0) {c;}; condchangemem(L);}\n#define luaC_checkGC(L)\t\tluaC_condGC(L, luaC_step(L);)\n\n\n#define luaC_barrier(L,p,v) {  \\\n\tif (iscollectable(v) && isblack(p) && iswhite(gcvalue(v)))  \\\n\tluaC_barrier_(L,obj2gco(p),gcvalue(v)); }\n\n#define luaC_barrierback(L,p,v) {  \\\n\tif (iscollectable(v) && isblack(p) && iswhite(gcvalue(v)))  \\\n\tluaC_barrierback_(L,p); }\n\n#define luaC_objbarrier(L,p,o) {  \\\n\tif (isblack(p) && iswhite(o)) \\\n\t\tluaC_barrier_(L,obj2gco(p),obj2gco(o)); }\n\n#define luaC_upvalbarrier(L,uv) \\\n  { if (iscollectable((uv)->v) && !upisopen(uv)) \\\n         luaC_upvalbarrier_(L,uv); }\n\nLUAI_FUNC void luaC_fix (lua_State *L, GCObject *o);\nLUAI_FUNC void luaC_freeallobjects (lua_State *L);\nLUAI_FUNC void luaC_step (lua_State *L);\nLUAI_FUNC void luaC_runtilstate (lua_State *L, int statesmask);\nLUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency);\nLUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz);\nLUAI_FUNC void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v);\nLUAI_FUNC void luaC_barrierback_ (lua_State *L, Table *o);\nLUAI_FUNC void luaC_upvalbarrier_ (lua_State *L, UpVal *uv);\nLUAI_FUNC void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt);\nLUAI_FUNC void luaC_upvdeccount (lua_State *L, UpVal *uv);\n\n\n#endif\n"
  },
  {
    "path": "externals/lua/src/linit.c",
    "content": "/*\n** $Id: linit.c,v 1.38 2015/01/05 13:48:33 roberto Exp $\n** Initialization of libraries for lua.c and other clients\n** See Copyright Notice in lua.h\n*/\n\n\n#define linit_c\n#define LUA_LIB\n\n/*\n** If you embed Lua in your program and need to open the standard\n** libraries, call luaL_openlibs in your program. If you need a\n** different set of libraries, copy this file to your project and edit\n** it to suit your needs.\n**\n** You can also *preload* libraries, so that a later 'require' can\n** open the library, which is already linked to the application.\n** For that, do the following code:\n**\n**  luaL_getsubtable(L, LUA_REGISTRYINDEX, \"_PRELOAD\");\n**  lua_pushcfunction(L, luaopen_modname);\n**  lua_setfield(L, -2, modname);\n**  lua_pop(L, 1);  // remove _PRELOAD table\n*/\n\n#include \"lprefix.h\"\n\n\n#include <stddef.h>\n\n#include \"lua.h\"\n\n#include \"lualib.h\"\n#include \"lauxlib.h\"\n\n\n/*\n** these libs are loaded by lua.c and are readily available to any Lua\n** program\n*/\nstatic const luaL_Reg loadedlibs[] = {\n  {\"_G\", luaopen_base},\n  {LUA_LOADLIBNAME, luaopen_package},\n  {LUA_COLIBNAME, luaopen_coroutine},\n  {LUA_TABLIBNAME, luaopen_table},\n  {LUA_IOLIBNAME, luaopen_io},\n  {LUA_OSLIBNAME, luaopen_os},\n  {LUA_STRLIBNAME, luaopen_string},\n  {LUA_MATHLIBNAME, luaopen_math},\n  {LUA_UTF8LIBNAME, luaopen_utf8},\n  {LUA_DBLIBNAME, luaopen_debug},\n#if defined(LUA_COMPAT_BITLIB)\n  {LUA_BITLIBNAME, luaopen_bit32},\n#endif\n  {NULL, NULL}\n};\n\n\nLUALIB_API void luaL_openlibs (lua_State *L) {\n  const luaL_Reg *lib;\n  /* \"require\" functions from 'loadedlibs' and set results to global table */\n  for (lib = loadedlibs; lib->func; lib++) {\n    luaL_requiref(L, lib->name, lib->func, 1);\n    lua_pop(L, 1);  /* remove lib */\n  }\n}\n\n"
  },
  {
    "path": "externals/lua/src/liolib.c",
    "content": "/*\n** $Id: liolib.c,v 2.142 2015/01/02 12:50:28 roberto Exp $\n** Standard I/O (and system) library\n** See Copyright Notice in lua.h\n*/\n\n#define liolib_c\n#define LUA_LIB\n\n#include \"lprefix.h\"\n\n\n#include <ctype.h>\n#include <errno.h>\n#include <locale.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"lauxlib.h\"\n#include \"lualib.h\"\n\n\n#if !defined(l_checkmode)\n\n/*\n** Check whether 'mode' matches '[rwa]%+?b?'.\n** Change this macro to accept other modes for 'fopen' besides\n** the standard ones.\n*/\n#define l_checkmode(mode) \\\n\t(*mode != '\\0' && strchr(\"rwa\", *(mode++)) != NULL &&\t\\\n\t(*mode != '+' || ++mode) &&  /* skip if char is '+' */\t\\\n\t(*mode != 'b' || ++mode) &&  /* skip if char is 'b' */\t\\\n\t(*mode == '\\0'))\n\n#endif\n\n/*\n** {======================================================\n** l_popen spawns a new process connected to the current\n** one through the file streams.\n** =======================================================\n*/\n\n#if !defined(l_popen)\t\t/* { */\n\n#if defined(LUA_USE_POSIX)\t/* { */\n\n#define l_popen(L,c,m)\t\t(fflush(NULL), popen(c,m))\n#define l_pclose(L,file)\t(pclose(file))\n\n#elif defined(LUA_USE_WINDOWS)\t/* }{ */\n\n#define l_popen(L,c,m)\t\t(_popen(c,m))\n#define l_pclose(L,file)\t(_pclose(file))\n\n#else\t\t\t\t/* }{ */\n\n/* ISO C definitions */\n#define l_popen(L,c,m)  \\\n\t  ((void)((void)c, m), \\\n\t  luaL_error(L, \"'popen' not supported\"), \\\n\t  (FILE*)0)\n#define l_pclose(L,file)\t\t((void)L, (void)file, -1)\n\n#endif\t\t\t\t/* } */\n\n#endif\t\t\t\t/* } */\n\n/* }====================================================== */\n\n\n#if !defined(l_getc)\t\t/* { */\n\n#if defined(LUA_USE_POSIX)\n#define l_getc(f)\t\tgetc_unlocked(f)\n#define l_lockfile(f)\t\tflockfile(f)\n#define l_unlockfile(f)\t\tfunlockfile(f)\n#else\n#define l_getc(f)\t\tgetc(f)\n#define l_lockfile(f)\t\t((void)0)\n#define l_unlockfile(f)\t\t((void)0)\n#endif\n\n#endif\t\t\t\t/* } */\n\n\n/*\n** {======================================================\n** l_fseek: configuration for longer offsets\n** =======================================================\n*/\n\n#if !defined(l_fseek)\t\t/* { */\n\n#if defined(LUA_USE_POSIX)\t/* { */\n\n#include <sys/types.h>\n\n#define l_fseek(f,o,w)\t\tfseeko(f,o,w)\n#define l_ftell(f)\t\tftello(f)\n#define l_seeknum\t\toff_t\n\n#elif defined(LUA_USE_WINDOWS) && !defined(_CRTIMP_TYPEINFO) \\\n   && defined(_MSC_VER) && (_MSC_VER >= 1400)\t/* }{ */\n\n/* Windows (but not DDK) and Visual C++ 2005 or higher */\n#define l_fseek(f,o,w)\t\t_fseeki64(f,o,w)\n#define l_ftell(f)\t\t_ftelli64(f)\n#define l_seeknum\t\t__int64\n\n#else\t\t\t\t/* }{ */\n\n/* ISO C definitions */\n#define l_fseek(f,o,w)\t\tfseek(f,o,w)\n#define l_ftell(f)\t\tftell(f)\n#define l_seeknum\t\tlong\n\n#endif\t\t\t\t/* } */\n\n#endif\t\t\t\t/* } */\n\n/* }====================================================== */\n\n\n#define IO_PREFIX\t\"_IO_\"\n#define IOPREF_LEN\t(sizeof(IO_PREFIX)/sizeof(char) - 1)\n#define IO_INPUT\t(IO_PREFIX \"input\")\n#define IO_OUTPUT\t(IO_PREFIX \"output\")\n\n\ntypedef luaL_Stream LStream;\n\n\n#define tolstream(L)\t((LStream *)luaL_checkudata(L, 1, LUA_FILEHANDLE))\n\n#define isclosed(p)\t((p)->closef == NULL)\n\n\nstatic int io_type (lua_State *L) {\n  LStream *p;\n  luaL_checkany(L, 1);\n  p = (LStream *)luaL_testudata(L, 1, LUA_FILEHANDLE);\n  if (p == NULL)\n    lua_pushnil(L);  /* not a file */\n  else if (isclosed(p))\n    lua_pushliteral(L, \"closed file\");\n  else\n    lua_pushliteral(L, \"file\");\n  return 1;\n}\n\n\nstatic int f_tostring (lua_State *L) {\n  LStream *p = tolstream(L);\n  if (isclosed(p))\n    lua_pushliteral(L, \"file (closed)\");\n  else\n    lua_pushfstring(L, \"file (%p)\", p->f);\n  return 1;\n}\n\n\nstatic FILE *tofile (lua_State *L) {\n  LStream *p = tolstream(L);\n  if (isclosed(p))\n    luaL_error(L, \"attempt to use a closed file\");\n  lua_assert(p->f);\n  return p->f;\n}\n\n\n/*\n** When creating file handles, always creates a 'closed' file handle\n** before opening the actual file; so, if there is a memory error, the\n** file is not left opened.\n*/\nstatic LStream *newprefile (lua_State *L) {\n  LStream *p = (LStream *)lua_newuserdata(L, sizeof(LStream));\n  p->closef = NULL;  /* mark file handle as 'closed' */\n  luaL_setmetatable(L, LUA_FILEHANDLE);\n  return p;\n}\n\n\n/*\n** Calls the 'close' function from a file handle. The 'volatile' avoids\n** a bug in some versions of the Clang compiler (e.g., clang 3.0 for\n** 32 bits).\n*/\nstatic int aux_close (lua_State *L) {\n  LStream *p = tolstream(L);\n  volatile lua_CFunction cf = p->closef;\n  p->closef = NULL;  /* mark stream as closed */\n  return (*cf)(L);  /* close it */\n}\n\n\nstatic int io_close (lua_State *L) {\n  if (lua_isnone(L, 1))  /* no argument? */\n    lua_getfield(L, LUA_REGISTRYINDEX, IO_OUTPUT);  /* use standard output */\n  tofile(L);  /* make sure argument is an open stream */\n  return aux_close(L);\n}\n\n\nstatic int f_gc (lua_State *L) {\n  LStream *p = tolstream(L);\n  if (!isclosed(p) && p->f != NULL)\n    aux_close(L);  /* ignore closed and incompletely open files */\n  return 0;\n}\n\n\n/*\n** function to close regular files\n*/\nstatic int io_fclose (lua_State *L) {\n  LStream *p = tolstream(L);\n  int res = fclose(p->f);\n  return luaL_fileresult(L, (res == 0), NULL);\n}\n\n\nstatic LStream *newfile (lua_State *L) {\n  LStream *p = newprefile(L);\n  p->f = NULL;\n  p->closef = &io_fclose;\n  return p;\n}\n\n\nstatic void opencheck (lua_State *L, const char *fname, const char *mode) {\n  LStream *p = newfile(L);\n  p->f = fopen(fname, mode);\n  if (p->f == NULL)\n    luaL_error(L, \"cannot open file '%s' (%s)\", fname, strerror(errno));\n}\n\n\nstatic int io_open (lua_State *L) {\n  const char *filename = luaL_checkstring(L, 1);\n  const char *mode = luaL_optstring(L, 2, \"r\");\n  LStream *p = newfile(L);\n  const char *md = mode;  /* to traverse/check mode */\n  luaL_argcheck(L, l_checkmode(md), 2, \"invalid mode\");\n  p->f = fopen(filename, mode);\n  return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1;\n}\n\n\n/*\n** function to close 'popen' files\n*/\nstatic int io_pclose (lua_State *L) {\n  LStream *p = tolstream(L);\n  return luaL_execresult(L, l_pclose(L, p->f));\n}\n\n\nstatic int io_popen (lua_State *L) {\n  const char *filename = luaL_checkstring(L, 1);\n  const char *mode = luaL_optstring(L, 2, \"r\");\n  LStream *p = newprefile(L);\n  p->f = l_popen(L, filename, mode);\n  p->closef = &io_pclose;\n  return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1;\n}\n\n\nstatic int io_tmpfile (lua_State *L) {\n  LStream *p = newfile(L);\n  p->f = tmpfile();\n  return (p->f == NULL) ? luaL_fileresult(L, 0, NULL) : 1;\n}\n\n\nstatic FILE *getiofile (lua_State *L, const char *findex) {\n  LStream *p;\n  lua_getfield(L, LUA_REGISTRYINDEX, findex);\n  p = (LStream *)lua_touserdata(L, -1);\n  if (isclosed(p))\n    luaL_error(L, \"standard %s file is closed\", findex + IOPREF_LEN);\n  return p->f;\n}\n\n\nstatic int g_iofile (lua_State *L, const char *f, const char *mode) {\n  if (!lua_isnoneornil(L, 1)) {\n    const char *filename = lua_tostring(L, 1);\n    if (filename)\n      opencheck(L, filename, mode);\n    else {\n      tofile(L);  /* check that it's a valid file handle */\n      lua_pushvalue(L, 1);\n    }\n    lua_setfield(L, LUA_REGISTRYINDEX, f);\n  }\n  /* return current value */\n  lua_getfield(L, LUA_REGISTRYINDEX, f);\n  return 1;\n}\n\n\nstatic int io_input (lua_State *L) {\n  return g_iofile(L, IO_INPUT, \"r\");\n}\n\n\nstatic int io_output (lua_State *L) {\n  return g_iofile(L, IO_OUTPUT, \"w\");\n}\n\n\nstatic int io_readline (lua_State *L);\n\n\nstatic void aux_lines (lua_State *L, int toclose) {\n  int n = lua_gettop(L) - 1;  /* number of arguments to read */\n  lua_pushinteger(L, n);  /* number of arguments to read */\n  lua_pushboolean(L, toclose);  /* close/not close file when finished */\n  lua_rotate(L, 2, 2);  /* move 'n' and 'toclose' to their positions */\n  lua_pushcclosure(L, io_readline, 3 + n);\n}\n\n\nstatic int f_lines (lua_State *L) {\n  tofile(L);  /* check that it's a valid file handle */\n  aux_lines(L, 0);\n  return 1;\n}\n\n\nstatic int io_lines (lua_State *L) {\n  int toclose;\n  if (lua_isnone(L, 1)) lua_pushnil(L);  /* at least one argument */\n  if (lua_isnil(L, 1)) {  /* no file name? */\n    lua_getfield(L, LUA_REGISTRYINDEX, IO_INPUT);  /* get default input */\n    lua_replace(L, 1);  /* put it at index 1 */\n    tofile(L);  /* check that it's a valid file handle */\n    toclose = 0;  /* do not close it after iteration */\n  }\n  else {  /* open a new file */\n    const char *filename = luaL_checkstring(L, 1);\n    opencheck(L, filename, \"r\");\n    lua_replace(L, 1);  /* put file at index 1 */\n    toclose = 1;  /* close it after iteration */\n  }\n  aux_lines(L, toclose);\n  return 1;\n}\n\n\n/*\n** {======================================================\n** READ\n** =======================================================\n*/\n\n\n/* maximum length of a numeral */\n#define MAXRN\t\t200\n\n/* auxiliary structure used by 'read_number' */\ntypedef struct {\n  FILE *f;  /* file being read */\n  int c;  /* current character (look ahead) */\n  int n;  /* number of elements in buffer 'buff' */\n  char buff[MAXRN + 1];  /* +1 for ending '\\0' */\n} RN;\n\n\n/*\n** Add current char to buffer (if not out of space) and read next one\n*/\nstatic int nextc (RN *rn) {\n  if (rn->n >= MAXRN) {  /* buffer overflow? */\n    rn->buff[0] = '\\0';  /* invalidate result */\n    return 0;  /* fail */\n  }\n  else {\n    rn->buff[rn->n++] = rn->c;  /* save current char */\n    rn->c = l_getc(rn->f);  /* read next one */\n    return 1;\n  }\n}\n\n\n/*\n** Accept current char if it is in 'set' (of size 1 or 2)\n*/\nstatic int test2 (RN *rn, const char *set) {\n  if (rn->c == set[0] || (rn->c == set[1] && rn->c != '\\0'))\n    return nextc(rn);\n  else return 0;\n}\n\n\n/*\n** Read a sequence of (hex)digits\n*/\nstatic int readdigits (RN *rn, int hex) {\n  int count = 0;\n  while ((hex ? isxdigit(rn->c) : isdigit(rn->c)) && nextc(rn))\n    count++;\n  return count;\n}\n\n\n/* access to locale \"radix character\" (decimal point) */\n#if !defined(l_getlocaledecpoint)\n#define l_getlocaledecpoint()     (localeconv()->decimal_point[0])\n#endif\n\n\n/*\n** Read a number: first reads a valid prefix of a numeral into a buffer.\n** Then it calls 'lua_stringtonumber' to check whether the format is\n** correct and to convert it to a Lua number\n*/\nstatic int read_number (lua_State *L, FILE *f) {\n  RN rn;\n  int count = 0;\n  int hex = 0;\n  char decp[2] = \".\";\n  rn.f = f; rn.n = 0;\n  decp[0] = l_getlocaledecpoint();  /* get decimal point from locale */\n  l_lockfile(rn.f);\n  do { rn.c = l_getc(rn.f); } while (isspace(rn.c));  /* skip spaces */\n  test2(&rn, \"-+\");  /* optional signal */\n  if (test2(&rn, \"0\")) {\n    if (test2(&rn, \"xX\")) hex = 1;  /* numeral is hexadecimal */\n    else count = 1;  /* count initial '0' as a valid digit */\n  }\n  count += readdigits(&rn, hex);  /* integral part */\n  if (test2(&rn, decp))  /* decimal point? */\n    count += readdigits(&rn, hex);  /* fractional part */\n  if (count > 0 && test2(&rn, (hex ? \"pP\" : \"eE\"))) {  /* exponent mark? */\n    test2(&rn, \"-+\");  /* exponent signal */\n    readdigits(&rn, 0);  /* exponent digits */\n  }\n  ungetc(rn.c, rn.f);  /* unread look-ahead char */\n  l_unlockfile(rn.f);\n  rn.buff[rn.n] = '\\0';  /* finish string */\n  if (lua_stringtonumber(L, rn.buff))  /* is this a valid number? */\n    return 1;  /* ok */\n  else {  /* invalid format */\n   lua_pushnil(L);  /* \"result\" to be removed */\n   return 0;  /* read fails */\n  }\n}\n\n\nstatic int test_eof (lua_State *L, FILE *f) {\n  int c = getc(f);\n  ungetc(c, f);  /* no-op when c == EOF */\n  lua_pushlstring(L, NULL, 0);\n  return (c != EOF);\n}\n\n\nstatic int read_line (lua_State *L, FILE *f, int chop) {\n  luaL_Buffer b;\n  int c = '\\0';\n  luaL_buffinit(L, &b);\n  while (c != EOF && c != '\\n') {  /* repeat until end of line */\n    char *buff = luaL_prepbuffer(&b);  /* pre-allocate buffer */\n    int i = 0;\n    l_lockfile(f);  /* no memory errors can happen inside the lock */\n    while (i < LUAL_BUFFERSIZE && (c = l_getc(f)) != EOF && c != '\\n')\n      buff[i++] = c;\n    l_unlockfile(f);\n    luaL_addsize(&b, i);\n  }\n  if (!chop && c == '\\n')  /* want a newline and have one? */\n    luaL_addchar(&b, c);  /* add ending newline to result */\n  luaL_pushresult(&b);  /* close buffer */\n  /* return ok if read something (either a newline or something else) */\n  return (c == '\\n' || lua_rawlen(L, -1) > 0);\n}\n\n\nstatic void read_all (lua_State *L, FILE *f) {\n  size_t nr;\n  luaL_Buffer b;\n  luaL_buffinit(L, &b);\n  do {  /* read file in chunks of LUAL_BUFFERSIZE bytes */\n    char *p = luaL_prepbuffsize(&b, LUAL_BUFFERSIZE);\n    nr = fread(p, sizeof(char), LUAL_BUFFERSIZE, f);\n    luaL_addsize(&b, nr);\n  } while (nr == LUAL_BUFFERSIZE);\n  luaL_pushresult(&b);  /* close buffer */\n}\n\n\nstatic int read_chars (lua_State *L, FILE *f, size_t n) {\n  size_t nr;  /* number of chars actually read */\n  char *p;\n  luaL_Buffer b;\n  luaL_buffinit(L, &b);\n  p = luaL_prepbuffsize(&b, n);  /* prepare buffer to read whole block */\n  nr = fread(p, sizeof(char), n, f);  /* try to read 'n' chars */\n  luaL_addsize(&b, nr);\n  luaL_pushresult(&b);  /* close buffer */\n  return (nr > 0);  /* true iff read something */\n}\n\n\nstatic int g_read (lua_State *L, FILE *f, int first) {\n  int nargs = lua_gettop(L) - 1;\n  int success;\n  int n;\n  clearerr(f);\n  if (nargs == 0) {  /* no arguments? */\n    success = read_line(L, f, 1);\n    n = first+1;  /* to return 1 result */\n  }\n  else {  /* ensure stack space for all results and for auxlib's buffer */\n    luaL_checkstack(L, nargs+LUA_MINSTACK, \"too many arguments\");\n    success = 1;\n    for (n = first; nargs-- && success; n++) {\n      if (lua_type(L, n) == LUA_TNUMBER) {\n        size_t l = (size_t)luaL_checkinteger(L, n);\n        success = (l == 0) ? test_eof(L, f) : read_chars(L, f, l);\n      }\n      else {\n        const char *p = luaL_checkstring(L, n);\n        if (*p == '*') p++;  /* skip optional '*' (for compatibility) */\n        switch (*p) {\n          case 'n':  /* number */\n            success = read_number(L, f);\n            break;\n          case 'l':  /* line */\n            success = read_line(L, f, 1);\n            break;\n          case 'L':  /* line with end-of-line */\n            success = read_line(L, f, 0);\n            break;\n          case 'a':  /* file */\n            read_all(L, f);  /* read entire file */\n            success = 1; /* always success */\n            break;\n          default:\n            return luaL_argerror(L, n, \"invalid format\");\n        }\n      }\n    }\n  }\n  if (ferror(f))\n    return luaL_fileresult(L, 0, NULL);\n  if (!success) {\n    lua_pop(L, 1);  /* remove last result */\n    lua_pushnil(L);  /* push nil instead */\n  }\n  return n - first;\n}\n\n\nstatic int io_read (lua_State *L) {\n  return g_read(L, getiofile(L, IO_INPUT), 1);\n}\n\n\nstatic int f_read (lua_State *L) {\n  return g_read(L, tofile(L), 2);\n}\n\n\nstatic int io_readline (lua_State *L) {\n  LStream *p = (LStream *)lua_touserdata(L, lua_upvalueindex(1));\n  int i;\n  int n = (int)lua_tointeger(L, lua_upvalueindex(2));\n  if (isclosed(p))  /* file is already closed? */\n    return luaL_error(L, \"file is already closed\");\n  lua_settop(L , 1);\n  luaL_checkstack(L, n, \"too many arguments\");\n  for (i = 1; i <= n; i++)  /* push arguments to 'g_read' */\n    lua_pushvalue(L, lua_upvalueindex(3 + i));\n  n = g_read(L, p->f, 2);  /* 'n' is number of results */\n  lua_assert(n > 0);  /* should return at least a nil */\n  if (lua_toboolean(L, -n))  /* read at least one value? */\n    return n;  /* return them */\n  else {  /* first result is nil: EOF or error */\n    if (n > 1) {  /* is there error information? */\n      /* 2nd result is error message */\n      return luaL_error(L, \"%s\", lua_tostring(L, -n + 1));\n    }\n    if (lua_toboolean(L, lua_upvalueindex(3))) {  /* generator created file? */\n      lua_settop(L, 0);\n      lua_pushvalue(L, lua_upvalueindex(1));\n      aux_close(L);  /* close it */\n    }\n    return 0;\n  }\n}\n\n/* }====================================================== */\n\n\nstatic int g_write (lua_State *L, FILE *f, int arg) {\n  int nargs = lua_gettop(L) - arg;\n  int status = 1;\n  for (; nargs--; arg++) {\n    if (lua_type(L, arg) == LUA_TNUMBER) {\n      /* optimization: could be done exactly as for strings */\n      int len = lua_isinteger(L, arg)\n                ? fprintf(f, LUA_INTEGER_FMT, lua_tointeger(L, arg))\n                : fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg));\n      status = status && (len > 0);\n    }\n    else {\n      size_t l;\n      const char *s = luaL_checklstring(L, arg, &l);\n      status = status && (fwrite(s, sizeof(char), l, f) == l);\n    }\n  }\n  if (status) return 1;  /* file handle already on stack top */\n  else return luaL_fileresult(L, status, NULL);\n}\n\n\nstatic int io_write (lua_State *L) {\n  return g_write(L, getiofile(L, IO_OUTPUT), 1);\n}\n\n\nstatic int f_write (lua_State *L) {\n  FILE *f = tofile(L);\n  lua_pushvalue(L, 1);  /* push file at the stack top (to be returned) */\n  return g_write(L, f, 2);\n}\n\n\nstatic int f_seek (lua_State *L) {\n  static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END};\n  static const char *const modenames[] = {\"set\", \"cur\", \"end\", NULL};\n  FILE *f = tofile(L);\n  int op = luaL_checkoption(L, 2, \"cur\", modenames);\n  lua_Integer p3 = luaL_optinteger(L, 3, 0);\n  l_seeknum offset = (l_seeknum)p3;\n  luaL_argcheck(L, (lua_Integer)offset == p3, 3,\n                  \"not an integer in proper range\");\n  op = l_fseek(f, offset, mode[op]);\n  if (op)\n    return luaL_fileresult(L, 0, NULL);  /* error */\n  else {\n    lua_pushinteger(L, (lua_Integer)l_ftell(f));\n    return 1;\n  }\n}\n\n\nstatic int f_setvbuf (lua_State *L) {\n  static const int mode[] = {_IONBF, _IOFBF, _IOLBF};\n  static const char *const modenames[] = {\"no\", \"full\", \"line\", NULL};\n  FILE *f = tofile(L);\n  int op = luaL_checkoption(L, 2, NULL, modenames);\n  lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE);\n  int res = setvbuf(f, NULL, mode[op], (size_t)sz);\n  return luaL_fileresult(L, res == 0, NULL);\n}\n\n\n\nstatic int io_flush (lua_State *L) {\n  return luaL_fileresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL);\n}\n\n\nstatic int f_flush (lua_State *L) {\n  return luaL_fileresult(L, fflush(tofile(L)) == 0, NULL);\n}\n\n\n/*\n** functions for 'io' library\n*/\nstatic const luaL_Reg iolib[] = {\n  {\"close\", io_close},\n  {\"flush\", io_flush},\n  {\"input\", io_input},\n  {\"lines\", io_lines},\n  {\"open\", io_open},\n  {\"output\", io_output},\n  {\"popen\", io_popen},\n  {\"read\", io_read},\n  {\"tmpfile\", io_tmpfile},\n  {\"type\", io_type},\n  {\"write\", io_write},\n  {NULL, NULL}\n};\n\n\n/*\n** methods for file handles\n*/\nstatic const luaL_Reg flib[] = {\n  {\"close\", io_close},\n  {\"flush\", f_flush},\n  {\"lines\", f_lines},\n  {\"read\", f_read},\n  {\"seek\", f_seek},\n  {\"setvbuf\", f_setvbuf},\n  {\"write\", f_write},\n  {\"__gc\", f_gc},\n  {\"__tostring\", f_tostring},\n  {NULL, NULL}\n};\n\n\nstatic void createmeta (lua_State *L) {\n  luaL_newmetatable(L, LUA_FILEHANDLE);  /* create metatable for file handles */\n  lua_pushvalue(L, -1);  /* push metatable */\n  lua_setfield(L, -2, \"__index\");  /* metatable.__index = metatable */\n  luaL_setfuncs(L, flib, 0);  /* add file methods to new metatable */\n  lua_pop(L, 1);  /* pop new metatable */\n}\n\n\n/*\n** function to (not) close the standard files stdin, stdout, and stderr\n*/\nstatic int io_noclose (lua_State *L) {\n  LStream *p = tolstream(L);\n  p->closef = &io_noclose;  /* keep file opened */\n  lua_pushnil(L);\n  lua_pushliteral(L, \"cannot close standard file\");\n  return 2;\n}\n\n\nstatic void createstdfile (lua_State *L, FILE *f, const char *k,\n                           const char *fname) {\n  LStream *p = newprefile(L);\n  p->f = f;\n  p->closef = &io_noclose;\n  if (k != NULL) {\n    lua_pushvalue(L, -1);\n    lua_setfield(L, LUA_REGISTRYINDEX, k);  /* add file to registry */\n  }\n  lua_setfield(L, -2, fname);  /* add file to module */\n}\n\n\nLUAMOD_API int luaopen_io (lua_State *L) {\n  luaL_newlib(L, iolib);  /* new module */\n  createmeta(L);\n  /* create (and set) default files */\n  createstdfile(L, stdin, IO_INPUT, \"stdin\");\n  createstdfile(L, stdout, IO_OUTPUT, \"stdout\");\n  createstdfile(L, stderr, NULL, \"stderr\");\n  return 1;\n}\n\n"
  },
  {
    "path": "externals/lua/src/llex.c",
    "content": "/*\n** $Id: llex.c,v 2.89 2014/11/14 16:06:09 roberto Exp $\n** Lexical Analyzer\n** See Copyright Notice in lua.h\n*/\n\n#define llex_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include <locale.h>\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"lctype.h\"\n#include \"ldo.h\"\n#include \"lgc.h\"\n#include \"llex.h\"\n#include \"lobject.h\"\n#include \"lparser.h\"\n#include \"lstate.h\"\n#include \"lstring.h\"\n#include \"ltable.h\"\n#include \"lzio.h\"\n\n\n\n#define next(ls) (ls->current = zgetc(ls->z))\n\n\n\n#define currIsNewline(ls)\t(ls->current == '\\n' || ls->current == '\\r')\n\n\n/* ORDER RESERVED */\nstatic const char *const luaX_tokens [] = {\n    \"and\", \"break\", \"do\", \"else\", \"elseif\",\n    \"end\", \"false\", \"for\", \"function\", \"goto\", \"if\",\n    \"in\", \"local\", \"nil\", \"not\", \"or\", \"repeat\",\n    \"return\", \"then\", \"true\", \"until\", \"while\",\n    \"//\", \"..\", \"...\", \"==\", \">=\", \"<=\", \"~=\",\n    \"<<\", \">>\", \"::\", \"<eof>\",\n    \"<number>\", \"<integer>\", \"<name>\", \"<string>\"\n};\n\n\n#define save_and_next(ls) (save(ls, ls->current), next(ls))\n\n\nstatic l_noret lexerror (LexState *ls, const char *msg, int token);\n\n\nstatic void save (LexState *ls, int c) {\n  Mbuffer *b = ls->buff;\n  if (luaZ_bufflen(b) + 1 > luaZ_sizebuffer(b)) {\n    size_t newsize;\n    if (luaZ_sizebuffer(b) >= MAX_SIZE/2)\n      lexerror(ls, \"lexical element too long\", 0);\n    newsize = luaZ_sizebuffer(b) * 2;\n    luaZ_resizebuffer(ls->L, b, newsize);\n  }\n  b->buffer[luaZ_bufflen(b)++] = cast(char, c);\n}\n\n\nvoid luaX_init (lua_State *L) {\n  int i;\n  TString *e = luaS_new(L, LUA_ENV);  /* create env name */\n  luaC_fix(L, obj2gco(e));  /* never collect this name */\n  for (i=0; i<NUM_RESERVED; i++) {\n    TString *ts = luaS_new(L, luaX_tokens[i]);\n    luaC_fix(L, obj2gco(ts));  /* reserved words are never collected */\n    ts->extra = cast_byte(i+1);  /* reserved word */\n  }\n}\n\n\nconst char *luaX_token2str (LexState *ls, int token) {\n  if (token < FIRST_RESERVED) {  /* single-byte symbols? */\n    lua_assert(token == cast_uchar(token));\n    return luaO_pushfstring(ls->L, \"'%c'\", token);\n  }\n  else {\n    const char *s = luaX_tokens[token - FIRST_RESERVED];\n    if (token < TK_EOS)  /* fixed format (symbols and reserved words)? */\n      return luaO_pushfstring(ls->L, \"'%s'\", s);\n    else  /* names, strings, and numerals */\n      return s;\n  }\n}\n\n\nstatic const char *txtToken (LexState *ls, int token) {\n  switch (token) {\n    case TK_NAME: case TK_STRING:\n    case TK_FLT: case TK_INT:\n      save(ls, '\\0');\n      return luaO_pushfstring(ls->L, \"'%s'\", luaZ_buffer(ls->buff));\n    default:\n      return luaX_token2str(ls, token);\n  }\n}\n\n\nstatic l_noret lexerror (LexState *ls, const char *msg, int token) {\n  char buff[LUA_IDSIZE];\n  luaO_chunkid(buff, getstr(ls->source), LUA_IDSIZE);\n  msg = luaO_pushfstring(ls->L, \"%s:%d: %s\", buff, ls->linenumber, msg);\n  if (token)\n    luaO_pushfstring(ls->L, \"%s near %s\", msg, txtToken(ls, token));\n  luaD_throw(ls->L, LUA_ERRSYNTAX);\n}\n\n\nl_noret luaX_syntaxerror (LexState *ls, const char *msg) {\n  lexerror(ls, msg, ls->t.token);\n}\n\n\n/*\n** creates a new string and anchors it in scanner's table so that\n** it will not be collected until the end of the compilation\n** (by that time it should be anchored somewhere)\n*/\nTString *luaX_newstring (LexState *ls, const char *str, size_t l) {\n  lua_State *L = ls->L;\n  TValue *o;  /* entry for 'str' */\n  TString *ts = luaS_newlstr(L, str, l);  /* create new string */\n  setsvalue2s(L, L->top++, ts);  /* temporarily anchor it in stack */\n  o = luaH_set(L, ls->h, L->top - 1);\n  if (ttisnil(o)) {  /* not in use yet? */\n    /* boolean value does not need GC barrier;\n       table has no metatable, so it does not need to invalidate cache */\n    setbvalue(o, 1);  /* t[string] = true */\n    luaC_checkGC(L);\n  }\n  else {  /* string already present */\n    ts = tsvalue(keyfromval(o));  /* re-use value previously stored */\n  }\n  L->top--;  /* remove string from stack */\n  return ts;\n}\n\n\n/*\n** increment line number and skips newline sequence (any of\n** \\n, \\r, \\n\\r, or \\r\\n)\n*/\nstatic void inclinenumber (LexState *ls) {\n  int old = ls->current;\n  lua_assert(currIsNewline(ls));\n  next(ls);  /* skip '\\n' or '\\r' */\n  if (currIsNewline(ls) && ls->current != old)\n    next(ls);  /* skip '\\n\\r' or '\\r\\n' */\n  if (++ls->linenumber >= MAX_INT)\n    lexerror(ls, \"chunk has too many lines\", 0);\n}\n\n\nvoid luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source,\n                    int firstchar) {\n  ls->t.token = 0;\n  ls->decpoint = '.';\n  ls->L = L;\n  ls->current = firstchar;\n  ls->lookahead.token = TK_EOS;  /* no look-ahead token */\n  ls->z = z;\n  ls->fs = NULL;\n  ls->linenumber = 1;\n  ls->lastline = 1;\n  ls->source = source;\n  ls->envn = luaS_new(L, LUA_ENV);  /* get env name */\n  luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER);  /* initialize buffer */\n}\n\n\n\n/*\n** =======================================================\n** LEXICAL ANALYZER\n** =======================================================\n*/\n\n\nstatic int check_next1 (LexState *ls, int c) {\n  if (ls->current == c) {\n    next(ls);\n    return 1;\n  }\n  else return 0;\n}\n\n\n/*\n** Check whether current char is in set 'set' (with two chars) and\n** saves it\n*/\nstatic int check_next2 (LexState *ls, const char *set) {\n  lua_assert(set[2] == '\\0');\n  if (ls->current == set[0] || ls->current == set[1]) {\n    save_and_next(ls);\n    return 1;\n  }\n  else return 0;\n}\n\n\n/*\n** change all characters 'from' in buffer to 'to'\n*/\nstatic void buffreplace (LexState *ls, char from, char to) {\n  if (from != to) {\n    size_t n = luaZ_bufflen(ls->buff);\n    char *p = luaZ_buffer(ls->buff);\n    while (n--)\n      if (p[n] == from) p[n] = to;\n  }\n}\n\n\n#if !defined(l_getlocaledecpoint)\n#define l_getlocaledecpoint()\t(localeconv()->decimal_point[0])\n#endif\n\n\n#define buff2num(b,o)\t(luaO_str2num(luaZ_buffer(b), o) != 0)\n\n/*\n** in case of format error, try to change decimal point separator to\n** the one defined in the current locale and check again\n*/\nstatic void trydecpoint (LexState *ls, TValue *o) {\n  char old = ls->decpoint;\n  ls->decpoint = l_getlocaledecpoint();\n  buffreplace(ls, old, ls->decpoint);  /* try new decimal separator */\n  if (!buff2num(ls->buff, o)) {\n    /* format error with correct decimal point: no more options */\n    buffreplace(ls, ls->decpoint, '.');  /* undo change (for error message) */\n    lexerror(ls, \"malformed number\", TK_FLT);\n  }\n}\n\n\n/* LUA_NUMBER */\n/*\n** this function is quite liberal in what it accepts, as 'luaO_str2num'\n** will reject ill-formed numerals.\n*/\nstatic int read_numeral (LexState *ls, SemInfo *seminfo) {\n  TValue obj;\n  const char *expo = \"Ee\";\n  int first = ls->current;\n  lua_assert(lisdigit(ls->current));\n  save_and_next(ls);\n  if (first == '0' && check_next2(ls, \"xX\"))  /* hexadecimal? */\n    expo = \"Pp\";\n  for (;;) {\n    if (check_next2(ls, expo))  /* exponent part? */\n      check_next2(ls, \"-+\");  /* optional exponent sign */\n    if (lisxdigit(ls->current))\n      save_and_next(ls);\n    else if (ls->current == '.')\n      save_and_next(ls);\n    else break;\n  }\n  save(ls, '\\0');\n  buffreplace(ls, '.', ls->decpoint);  /* follow locale for decimal point */\n  if (!buff2num(ls->buff, &obj))  /* format error? */\n    trydecpoint(ls, &obj); /* try to update decimal point separator */\n  if (ttisinteger(&obj)) {\n    seminfo->i = ivalue(&obj);\n    return TK_INT;\n  }\n  else {\n    lua_assert(ttisfloat(&obj));\n    seminfo->r = fltvalue(&obj);\n    return TK_FLT;\n  }\n}\n\n\n/*\n** skip a sequence '[=*[' or ']=*]' and return its number of '='s or\n** -1 if sequence is malformed\n*/\nstatic int skip_sep (LexState *ls) {\n  int count = 0;\n  int s = ls->current;\n  lua_assert(s == '[' || s == ']');\n  save_and_next(ls);\n  while (ls->current == '=') {\n    save_and_next(ls);\n    count++;\n  }\n  return (ls->current == s) ? count : (-count) - 1;\n}\n\n\nstatic void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {\n  int line = ls->linenumber;  /* initial line (for error message) */\n  save_and_next(ls);  /* skip 2nd '[' */\n  if (currIsNewline(ls))  /* string starts with a newline? */\n    inclinenumber(ls);  /* skip it */\n  for (;;) {\n    switch (ls->current) {\n      case EOZ: {  /* error */\n        const char *what = (seminfo ? \"string\" : \"comment\");\n        const char *msg = luaO_pushfstring(ls->L,\n                     \"unfinished long %s (starting at line %d)\", what, line);\n        lexerror(ls, msg, TK_EOS);\n        break;  /* to avoid warnings */\n      }\n      case ']': {\n        if (skip_sep(ls) == sep) {\n          save_and_next(ls);  /* skip 2nd ']' */\n          goto endloop;\n        }\n        break;\n      }\n      case '\\n': case '\\r': {\n        save(ls, '\\n');\n        inclinenumber(ls);\n        if (!seminfo) luaZ_resetbuffer(ls->buff);  /* avoid wasting space */\n        break;\n      }\n      default: {\n        if (seminfo) save_and_next(ls);\n        else next(ls);\n      }\n    }\n  } endloop:\n  if (seminfo)\n    seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + (2 + sep),\n                                     luaZ_bufflen(ls->buff) - 2*(2 + sep));\n}\n\n\nstatic void esccheck (LexState *ls, int c, const char *msg) {\n  if (!c) {\n    if (ls->current != EOZ)\n      save_and_next(ls);  /* add current to buffer for error message */\n    lexerror(ls, msg, TK_STRING);\n  }\n}\n\n\nstatic int gethexa (LexState *ls) {\n  save_and_next(ls);\n  esccheck (ls, lisxdigit(ls->current), \"hexadecimal digit expected\");\n  return luaO_hexavalue(ls->current);\n}\n\n\nstatic int readhexaesc (LexState *ls) {\n  int r = gethexa(ls);\n  r = (r << 4) + gethexa(ls);\n  luaZ_buffremove(ls->buff, 2);  /* remove saved chars from buffer */\n  return r;\n}\n\n\nstatic unsigned long readutf8esc (LexState *ls) {\n  unsigned long r;\n  int i = 4;  /* chars to be removed: '\\', 'u', '{', and first digit */\n  save_and_next(ls);  /* skip 'u' */\n  esccheck(ls, ls->current == '{', \"missing '{'\");\n  r = gethexa(ls);  /* must have at least one digit */\n  while ((save_and_next(ls), lisxdigit(ls->current))) {\n    i++;\n    r = (r << 4) + luaO_hexavalue(ls->current);\n    esccheck(ls, r <= 0x10FFFF, \"UTF-8 value too large\");\n  }\n  esccheck(ls, ls->current == '}', \"missing '}'\");\n  next(ls);  /* skip '}' */\n  luaZ_buffremove(ls->buff, i);  /* remove saved chars from buffer */\n  return r;\n}\n\n\nstatic void utf8esc (LexState *ls) {\n  char buff[UTF8BUFFSZ];\n  int n = luaO_utf8esc(buff, readutf8esc(ls));\n  for (; n > 0; n--)  /* add 'buff' to string */\n    save(ls, buff[UTF8BUFFSZ - n]);\n}\n\n\nstatic int readdecesc (LexState *ls) {\n  int i;\n  int r = 0;  /* result accumulator */\n  for (i = 0; i < 3 && lisdigit(ls->current); i++) {  /* read up to 3 digits */\n    r = 10*r + ls->current - '0';\n    save_and_next(ls);\n  }\n  esccheck(ls, r <= UCHAR_MAX, \"decimal escape too large\");\n  luaZ_buffremove(ls->buff, i);  /* remove read digits from buffer */\n  return r;\n}\n\n\nstatic void read_string (LexState *ls, int del, SemInfo *seminfo) {\n  save_and_next(ls);  /* keep delimiter (for error messages) */\n  while (ls->current != del) {\n    switch (ls->current) {\n      case EOZ:\n        lexerror(ls, \"unfinished string\", TK_EOS);\n        break;  /* to avoid warnings */\n      case '\\n':\n      case '\\r':\n        lexerror(ls, \"unfinished string\", TK_STRING);\n        break;  /* to avoid warnings */\n      case '\\\\': {  /* escape sequences */\n        int c;  /* final character to be saved */\n        save_and_next(ls);  /* keep '\\\\' for error messages */\n        switch (ls->current) {\n          case 'a': c = '\\a'; goto read_save;\n          case 'b': c = '\\b'; goto read_save;\n          case 'f': c = '\\f'; goto read_save;\n          case 'n': c = '\\n'; goto read_save;\n          case 'r': c = '\\r'; goto read_save;\n          case 't': c = '\\t'; goto read_save;\n          case 'v': c = '\\v'; goto read_save;\n          case 'x': c = readhexaesc(ls); goto read_save;\n          case 'u': utf8esc(ls);  goto no_save;\n          case '\\n': case '\\r':\n            inclinenumber(ls); c = '\\n'; goto only_save;\n          case '\\\\': case '\\\"': case '\\'':\n            c = ls->current; goto read_save;\n          case EOZ: goto no_save;  /* will raise an error next loop */\n          case 'z': {  /* zap following span of spaces */\n            luaZ_buffremove(ls->buff, 1);  /* remove '\\\\' */\n            next(ls);  /* skip the 'z' */\n            while (lisspace(ls->current)) {\n              if (currIsNewline(ls)) inclinenumber(ls);\n              else next(ls);\n            }\n            goto no_save;\n          }\n          default: {\n            esccheck(ls, lisdigit(ls->current), \"invalid escape sequence\");\n            c = readdecesc(ls);  /* digital escape '\\ddd' */\n            goto only_save;\n          }\n        }\n       read_save:\n         next(ls);\n         /* go through */\n       only_save:\n         luaZ_buffremove(ls->buff, 1);  /* remove '\\\\' */\n         save(ls, c);\n         /* go through */\n       no_save: break;\n      }\n      default:\n        save_and_next(ls);\n    }\n  }\n  save_and_next(ls);  /* skip delimiter */\n  seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1,\n                                   luaZ_bufflen(ls->buff) - 2);\n}\n\n\nstatic int llex (LexState *ls, SemInfo *seminfo) {\n  luaZ_resetbuffer(ls->buff);\n  for (;;) {\n    switch (ls->current) {\n      case '\\n': case '\\r': {  /* line breaks */\n        inclinenumber(ls);\n        break;\n      }\n      case ' ': case '\\f': case '\\t': case '\\v': {  /* spaces */\n        next(ls);\n        break;\n      }\n      case '-': {  /* '-' or '--' (comment) */\n        next(ls);\n        if (ls->current != '-') return '-';\n        /* else is a comment */\n        next(ls);\n        if (ls->current == '[') {  /* long comment? */\n          int sep = skip_sep(ls);\n          luaZ_resetbuffer(ls->buff);  /* 'skip_sep' may dirty the buffer */\n          if (sep >= 0) {\n            read_long_string(ls, NULL, sep);  /* skip long comment */\n            luaZ_resetbuffer(ls->buff);  /* previous call may dirty the buff. */\n            break;\n          }\n        }\n        /* else short comment */\n        while (!currIsNewline(ls) && ls->current != EOZ)\n          next(ls);  /* skip until end of line (or end of file) */\n        break;\n      }\n      case '[': {  /* long string or simply '[' */\n        int sep = skip_sep(ls);\n        if (sep >= 0) {\n          read_long_string(ls, seminfo, sep);\n          return TK_STRING;\n        }\n        else if (sep == -1) return '[';\n        else lexerror(ls, \"invalid long string delimiter\", TK_STRING);\n      }\n      case '=': {\n        next(ls);\n        if (check_next1(ls, '=')) return TK_EQ;\n        else return '=';\n      }\n      case '<': {\n        next(ls);\n        if (check_next1(ls, '=')) return TK_LE;\n        else if (check_next1(ls, '<')) return TK_SHL;\n        else return '<';\n      }\n      case '>': {\n        next(ls);\n        if (check_next1(ls, '=')) return TK_GE;\n        else if (check_next1(ls, '>')) return TK_SHR;\n        else return '>';\n      }\n      case '/': {\n        next(ls);\n        if (check_next1(ls, '/')) return TK_IDIV;\n        else return '/';\n      }\n      case '~': {\n        next(ls);\n        if (check_next1(ls, '=')) return TK_NE;\n        else return '~';\n      }\n      case ':': {\n        next(ls);\n        if (check_next1(ls, ':')) return TK_DBCOLON;\n        else return ':';\n      }\n      case '\"': case '\\'': {  /* short literal strings */\n        read_string(ls, ls->current, seminfo);\n        return TK_STRING;\n      }\n      case '.': {  /* '.', '..', '...', or number */\n        save_and_next(ls);\n        if (check_next1(ls, '.')) {\n          if (check_next1(ls, '.'))\n            return TK_DOTS;   /* '...' */\n          else return TK_CONCAT;   /* '..' */\n        }\n        else if (!lisdigit(ls->current)) return '.';\n        else return read_numeral(ls, seminfo);\n      }\n      case '0': case '1': case '2': case '3': case '4':\n      case '5': case '6': case '7': case '8': case '9': {\n        return read_numeral(ls, seminfo);\n      }\n      case EOZ: {\n        return TK_EOS;\n      }\n      default: {\n        if (lislalpha(ls->current)) {  /* identifier or reserved word? */\n          TString *ts;\n          do {\n            save_and_next(ls);\n          } while (lislalnum(ls->current));\n          ts = luaX_newstring(ls, luaZ_buffer(ls->buff),\n                                  luaZ_bufflen(ls->buff));\n          seminfo->ts = ts;\n          if (isreserved(ts))  /* reserved word? */\n            return ts->extra - 1 + FIRST_RESERVED;\n          else {\n            return TK_NAME;\n          }\n        }\n        else {  /* single-char tokens (+ - / ...) */\n          int c = ls->current;\n          next(ls);\n          return c;\n        }\n      }\n    }\n  }\n}\n\n\nvoid luaX_next (LexState *ls) {\n  ls->lastline = ls->linenumber;\n  if (ls->lookahead.token != TK_EOS) {  /* is there a look-ahead token? */\n    ls->t = ls->lookahead;  /* use this one */\n    ls->lookahead.token = TK_EOS;  /* and discharge it */\n  }\n  else\n    ls->t.token = llex(ls, &ls->t.seminfo);  /* read next token */\n}\n\n\nint luaX_lookahead (LexState *ls) {\n  lua_assert(ls->lookahead.token == TK_EOS);\n  ls->lookahead.token = llex(ls, &ls->lookahead.seminfo);\n  return ls->lookahead.token;\n}\n\n"
  },
  {
    "path": "externals/lua/src/llex.h",
    "content": "/*\n** $Id: llex.h,v 1.78 2014/10/29 15:38:24 roberto Exp $\n** Lexical Analyzer\n** See Copyright Notice in lua.h\n*/\n\n#ifndef llex_h\n#define llex_h\n\n#include \"lobject.h\"\n#include \"lzio.h\"\n\n\n#define FIRST_RESERVED\t257\n\n\n#if !defined(LUA_ENV)\n#define LUA_ENV\t\t\"_ENV\"\n#endif\n\n\n/*\n* WARNING: if you change the order of this enumeration,\n* grep \"ORDER RESERVED\"\n*/\nenum RESERVED {\n  /* terminal symbols denoted by reserved words */\n  TK_AND = FIRST_RESERVED, TK_BREAK,\n  TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION,\n  TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,\n  TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE,\n  /* other terminal symbols */\n  TK_IDIV, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE,\n  TK_SHL, TK_SHR,\n  TK_DBCOLON, TK_EOS,\n  TK_FLT, TK_INT, TK_NAME, TK_STRING\n};\n\n/* number of reserved words */\n#define NUM_RESERVED\t(cast(int, TK_WHILE-FIRST_RESERVED+1))\n\n\ntypedef union {\n  lua_Number r;\n  lua_Integer i;\n  TString *ts;\n} SemInfo;  /* semantics information */\n\n\ntypedef struct Token {\n  int token;\n  SemInfo seminfo;\n} Token;\n\n\n/* state of the lexer plus state of the parser when shared by all\n   functions */\ntypedef struct LexState {\n  int current;  /* current character (charint) */\n  int linenumber;  /* input line counter */\n  int lastline;  /* line of last token 'consumed' */\n  Token t;  /* current token */\n  Token lookahead;  /* look ahead token */\n  struct FuncState *fs;  /* current function (parser) */\n  struct lua_State *L;\n  ZIO *z;  /* input stream */\n  Mbuffer *buff;  /* buffer for tokens */\n  Table *h;  /* to avoid collection/reuse strings */\n  struct Dyndata *dyd;  /* dynamic structures used by the parser */\n  TString *source;  /* current source name */\n  TString *envn;  /* environment variable name */\n  char decpoint;  /* locale decimal point */\n} LexState;\n\n\nLUAI_FUNC void luaX_init (lua_State *L);\nLUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z,\n                              TString *source, int firstchar);\nLUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l);\nLUAI_FUNC void luaX_next (LexState *ls);\nLUAI_FUNC int luaX_lookahead (LexState *ls);\nLUAI_FUNC l_noret luaX_syntaxerror (LexState *ls, const char *s);\nLUAI_FUNC const char *luaX_token2str (LexState *ls, int token);\n\n\n#endif\n"
  },
  {
    "path": "externals/lua/src/llimits.h",
    "content": "/*\n** $Id: llimits.h,v 1.125 2014/12/19 13:30:23 roberto Exp $\n** Limits, basic types, and some other 'installation-dependent' definitions\n** See Copyright Notice in lua.h\n*/\n\n#ifndef llimits_h\n#define llimits_h\n\n\n#include <limits.h>\n#include <stddef.h>\n\n\n#include \"lua.h\"\n\n/*\n** 'lu_mem' and 'l_mem' are unsigned/signed integers big enough to count\n** the total memory used by Lua (in bytes). Usually, 'size_t' and\n** 'ptrdiff_t' should work, but we use 'long' for 16-bit machines.\n*/\n#if defined(LUAI_MEM)\t\t/* { external definitions? */\ntypedef LUAI_UMEM lu_mem;\ntypedef LUAI_MEM l_mem;\n#elif LUAI_BITSINT >= 32\t/* }{ */\ntypedef size_t lu_mem;\ntypedef ptrdiff_t l_mem;\n#else  /* 16-bit ints */\t/* }{ */\ntypedef unsigned long lu_mem;\ntypedef long l_mem;\n#endif\t\t\t\t/* } */\n\n\n/* chars used as small naturals (so that 'char' is reserved for characters) */\ntypedef unsigned char lu_byte;\n\n\n/* maximum value for size_t */\n#define MAX_SIZET\t((size_t)(~(size_t)0))\n\n/* maximum size visible for Lua (must be representable in a lua_Integer */\n#define MAX_SIZE\t(sizeof(size_t) < sizeof(lua_Integer) ? MAX_SIZET \\\n                          : (size_t)(LUA_MAXINTEGER))\n\n\n#define MAX_LUMEM\t((lu_mem)(~(lu_mem)0))\n\n#define MAX_LMEM\t((l_mem)(MAX_LUMEM >> 1))\n\n\n#define MAX_INT\t\tINT_MAX  /* maximum value of an int */\n\n\n/*\n** conversion of pointer to integer:\n** this is for hashing only; there is no problem if the integer\n** cannot hold the whole pointer value\n*/\n#define point2int(p)\t((unsigned int)((size_t)(p) & UINT_MAX))\n\n\n\n/* type to ensure maximum alignment */\n#if defined(LUAI_USER_ALIGNMENT_T)\ntypedef LUAI_USER_ALIGNMENT_T L_Umaxalign;\n#else\ntypedef union { double u; void *s; lua_Integer i; long l; } L_Umaxalign;\n#endif\n\n\n\n/* types of 'usual argument conversions' for lua_Number and lua_Integer */\ntypedef LUAI_UACNUMBER l_uacNumber;\ntypedef LUAI_UACINT l_uacInt;\n\n\n/* internal assertions for in-house debugging */\n#if defined(lua_assert)\n#define check_exp(c,e)\t\t(lua_assert(c), (e))\n/* to avoid problems with conditions too long */\n#define lua_longassert(c)\t{ if (!(c)) lua_assert(0); }\n#else\n#define lua_assert(c)\t\t((void)0)\n#define check_exp(c,e)\t\t(e)\n#define lua_longassert(c)\t((void)0)\n#endif\n\n/*\n** assertion for checking API calls\n*/\n#if defined(LUA_USE_APICHECK)\n#include <assert.h>\n#define luai_apicheck(e)\tassert(e)\n#else\n#define luai_apicheck(e)\tlua_assert(e)\n#endif\n\n\n#define api_check(e,msg)\tluai_apicheck((e) && msg)\n\n\n#if !defined(UNUSED)\n#define UNUSED(x)\t((void)(x))\t/* to avoid warnings */\n#endif\n\n\n#define cast(t, exp)\t((t)(exp))\n\n#define cast_void(i)\tcast(void, (i))\n#define cast_byte(i)\tcast(lu_byte, (i))\n#define cast_num(i)\tcast(lua_Number, (i))\n#define cast_int(i)\tcast(int, (i))\n#define cast_uchar(i)\tcast(unsigned char, (i))\n\n\n/* cast a signed lua_Integer to lua_Unsigned */\n#if !defined(l_castS2U)\n#define l_castS2U(i)\t((lua_Unsigned)(i))\n#endif\n\n/*\n** cast a lua_Unsigned to a signed lua_Integer; this cast is\n** not strict ISO C, but two-complement architectures should\n** work fine.\n*/\n#if !defined(l_castU2S)\n#define l_castU2S(i)\t((lua_Integer)(i))\n#endif\n\n\n/*\n** non-return type\n*/\n#if defined(__GNUC__)\n#define l_noret\t\tvoid __attribute__((noreturn))\n#elif defined(_MSC_VER) && _MSC_VER >= 1200\n#define l_noret\t\tvoid __declspec(noreturn)\n#else\n#define l_noret\t\tvoid\n#endif\n\n\n\n/*\n** maximum depth for nested C calls and syntactical nested non-terminals\n** in a program. (Value must fit in an unsigned short int.)\n*/\n#if !defined(LUAI_MAXCCALLS)\n#define LUAI_MAXCCALLS\t\t200\n#endif\n\n/*\n** maximum number of upvalues in a closure (both C and Lua). (Value\n** must fit in an unsigned char.)\n*/\n#define MAXUPVAL\tUCHAR_MAX\n\n\n/*\n** type for virtual-machine instructions;\n** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h)\n*/\n#if LUAI_BITSINT >= 32\ntypedef unsigned int Instruction;\n#else\ntypedef unsigned long Instruction;\n#endif\n\n\n\n\n/* minimum size for the string table (must be power of 2) */\n#if !defined(MINSTRTABSIZE)\n#define MINSTRTABSIZE\t64\t/* minimum size for \"predefined\" strings */\n#endif\n\n\n/* minimum size for string buffer */\n#if !defined(LUA_MINBUFFER)\n#define LUA_MINBUFFER\t32\n#endif\n\n\n#if !defined(lua_lock)\n#define lua_lock(L)\t((void) 0)\n#define lua_unlock(L)\t((void) 0)\n#endif\n\n#if !defined(luai_threadyield)\n#define luai_threadyield(L)\t{lua_unlock(L); lua_lock(L);}\n#endif\n\n\n/*\n** these macros allow user-specific actions on threads when you defined\n** LUAI_EXTRASPACE and need to do something extra when a thread is\n** created/deleted/resumed/yielded.\n*/\n#if !defined(luai_userstateopen)\n#define luai_userstateopen(L)\t\t((void)L)\n#endif\n\n#if !defined(luai_userstateclose)\n#define luai_userstateclose(L)\t\t((void)L)\n#endif\n\n#if !defined(luai_userstatethread)\n#define luai_userstatethread(L,L1)\t((void)L)\n#endif\n\n#if !defined(luai_userstatefree)\n#define luai_userstatefree(L,L1)\t((void)L)\n#endif\n\n#if !defined(luai_userstateresume)\n#define luai_userstateresume(L,n)\t((void)L)\n#endif\n\n#if !defined(luai_userstateyield)\n#define luai_userstateyield(L,n)\t((void)L)\n#endif\n\n\n\n/*\n** macro to control inclusion of some hard tests on stack reallocation\n*/\n#if !defined(HARDSTACKTESTS)\n#define condmovestack(L)\t((void)0)\n#else\n/* realloc stack keeping its size */\n#define condmovestack(L)\tluaD_reallocstack((L), (L)->stacksize)\n#endif\n\n#if !defined(HARDMEMTESTS)\n#define condchangemem(L)\tcondmovestack(L)\n#else\n#define condchangemem(L)  \\\n\t((void)(!(G(L)->gcrunning) || (luaC_fullgc(L, 0), 1)))\n#endif\n\n#endif\n"
  },
  {
    "path": "externals/lua/src/lmathlib.c",
    "content": "/*\n** $Id: lmathlib.c,v 1.114 2014/12/27 20:32:26 roberto Exp $\n** Standard mathematical library\n** See Copyright Notice in lua.h\n*/\n\n#define lmathlib_c\n#define LUA_LIB\n\n#include \"lprefix.h\"\n\n\n#include <stdlib.h>\n#include <math.h>\n\n#include \"lua.h\"\n\n#include \"lauxlib.h\"\n#include \"lualib.h\"\n\n\n#undef PI\n#define PI\t(l_mathop(3.141592653589793238462643383279502884))\n\n\n#if !defined(l_rand)\t\t/* { */\n#if defined(LUA_USE_POSIX)\n#define l_rand()\trandom()\n#define l_srand(x)\tsrandom(x)\n#define L_RANDMAX\t2147483647\t/* (2^31 - 1), following POSIX */\n#else\n#define l_rand()\trand()\n#define l_srand(x)\tsrand(x)\n#define L_RANDMAX\tRAND_MAX\n#endif\n#endif\t\t\t\t/* } */\n\n\nstatic int math_abs (lua_State *L) {\n  if (lua_isinteger(L, 1)) {\n    lua_Integer n = lua_tointeger(L, 1);\n    if (n < 0) n = (lua_Integer)(0u - n);\n    lua_pushinteger(L, n);\n  }\n  else\n    lua_pushnumber(L, l_mathop(fabs)(luaL_checknumber(L, 1)));\n  return 1;\n}\n\nstatic int math_sin (lua_State *L) {\n  lua_pushnumber(L, l_mathop(sin)(luaL_checknumber(L, 1)));\n  return 1;\n}\n\nstatic int math_cos (lua_State *L) {\n  lua_pushnumber(L, l_mathop(cos)(luaL_checknumber(L, 1)));\n  return 1;\n}\n\nstatic int math_tan (lua_State *L) {\n  lua_pushnumber(L, l_mathop(tan)(luaL_checknumber(L, 1)));\n  return 1;\n}\n\nstatic int math_asin (lua_State *L) {\n  lua_pushnumber(L, l_mathop(asin)(luaL_checknumber(L, 1)));\n  return 1;\n}\n\nstatic int math_acos (lua_State *L) {\n  lua_pushnumber(L, l_mathop(acos)(luaL_checknumber(L, 1)));\n  return 1;\n}\n\nstatic int math_atan (lua_State *L) {\n  lua_Number y = luaL_checknumber(L, 1);\n  lua_Number x = luaL_optnumber(L, 2, 1);\n  lua_pushnumber(L, l_mathop(atan2)(y, x));\n  return 1;\n}\n\n\nstatic int math_toint (lua_State *L) {\n  int valid;\n  lua_Integer n = lua_tointegerx(L, 1, &valid);\n  if (valid)\n    lua_pushinteger(L, n);\n  else {\n    luaL_checkany(L, 1);\n    lua_pushnil(L);  /* value is not convertible to integer */\n  }\n  return 1;\n}\n\n\nstatic void pushnumint (lua_State *L, lua_Number d) {\n  lua_Integer n;\n  if (lua_numbertointeger(d, &n))  /* does 'd' fit in an integer? */\n    lua_pushinteger(L, n);  /* result is integer */\n  else\n    lua_pushnumber(L, d);  /* result is float */\n}\n\n\nstatic int math_floor (lua_State *L) {\n  if (lua_isinteger(L, 1))\n    lua_settop(L, 1);  /* integer is its own floor */\n  else {\n    lua_Number d = l_mathop(floor)(luaL_checknumber(L, 1));\n    pushnumint(L, d);\n  }\n  return 1;\n}\n\n\nstatic int math_ceil (lua_State *L) {\n  if (lua_isinteger(L, 1))\n    lua_settop(L, 1);  /* integer is its own ceil */\n  else {\n    lua_Number d = l_mathop(ceil)(luaL_checknumber(L, 1));\n    pushnumint(L, d);\n  }\n  return 1;\n}\n\n\nstatic int math_fmod (lua_State *L) {\n  if (lua_isinteger(L, 1) && lua_isinteger(L, 2)) {\n    lua_Integer d = lua_tointeger(L, 2);\n    if ((lua_Unsigned)d + 1u <= 1u) {  /* special cases: -1 or 0 */\n      luaL_argcheck(L, d != 0, 2, \"zero\");\n      lua_pushinteger(L, 0);  /* avoid overflow with 0x80000... / -1 */\n    }\n    else\n      lua_pushinteger(L, lua_tointeger(L, 1) % d);\n  }\n  else\n    lua_pushnumber(L, l_mathop(fmod)(luaL_checknumber(L, 1),\n                                     luaL_checknumber(L, 2)));\n  return 1;\n}\n\n\n/*\n** next function does not use 'modf', avoiding problems with 'double*'\n** (which is not compatible with 'float*') when lua_Number is not\n** 'double'.\n*/\nstatic int math_modf (lua_State *L) {\n  if (lua_isinteger(L ,1)) {\n    lua_settop(L, 1);  /* number is its own integer part */\n    lua_pushnumber(L, 0);  /* no fractional part */\n  }\n  else {\n    lua_Number n = luaL_checknumber(L, 1);\n    /* integer part (rounds toward zero) */\n    lua_Number ip = (n < 0) ? l_mathop(ceil)(n) : l_mathop(floor)(n);\n    pushnumint(L, ip);\n    /* fractional part (test needed for inf/-inf) */\n    lua_pushnumber(L, (n == ip) ? l_mathop(0.0) : (n - ip));\n  }\n  return 2;\n}\n\n\nstatic int math_sqrt (lua_State *L) {\n  lua_pushnumber(L, l_mathop(sqrt)(luaL_checknumber(L, 1)));\n  return 1;\n}\n\n\nstatic int math_ult (lua_State *L) {\n  lua_Integer a = luaL_checkinteger(L, 1);\n  lua_Integer b = luaL_checkinteger(L, 2);\n  lua_pushboolean(L, (lua_Unsigned)a < (lua_Unsigned)b);\n  return 1;\n}\n\nstatic int math_log (lua_State *L) {\n  lua_Number x = luaL_checknumber(L, 1);\n  lua_Number res;\n  if (lua_isnoneornil(L, 2))\n    res = l_mathop(log)(x);\n  else {\n    lua_Number base = luaL_checknumber(L, 2);\n    if (base == 10.0) res = l_mathop(log10)(x);\n    else res = l_mathop(log)(x)/l_mathop(log)(base);\n  }\n  lua_pushnumber(L, res);\n  return 1;\n}\n\nstatic int math_exp (lua_State *L) {\n  lua_pushnumber(L, l_mathop(exp)(luaL_checknumber(L, 1)));\n  return 1;\n}\n\nstatic int math_deg (lua_State *L) {\n  lua_pushnumber(L, luaL_checknumber(L, 1) * (l_mathop(180.0) / PI));\n  return 1;\n}\n\nstatic int math_rad (lua_State *L) {\n  lua_pushnumber(L, luaL_checknumber(L, 1) * (PI / l_mathop(180.0)));\n  return 1;\n}\n\n\nstatic int math_min (lua_State *L) {\n  int n = lua_gettop(L);  /* number of arguments */\n  int imin = 1;  /* index of current minimum value */\n  int i;\n  luaL_argcheck(L, n >= 1, 1, \"value expected\");\n  for (i = 2; i <= n; i++) {\n    if (lua_compare(L, i, imin, LUA_OPLT))\n      imin = i;\n  }\n  lua_pushvalue(L, imin);\n  return 1;\n}\n\n\nstatic int math_max (lua_State *L) {\n  int n = lua_gettop(L);  /* number of arguments */\n  int imax = 1;  /* index of current maximum value */\n  int i;\n  luaL_argcheck(L, n >= 1, 1, \"value expected\");\n  for (i = 2; i <= n; i++) {\n    if (lua_compare(L, imax, i, LUA_OPLT))\n      imax = i;\n  }\n  lua_pushvalue(L, imax);\n  return 1;\n}\n\n/*\n** This function uses 'double' (instead of 'lua_Number') to ensure that\n** all bits from 'l_rand' can be represented, and that 'RANDMAX + 1.0'\n** will keep full precision (ensuring that 'r' is always less than 1.0.)\n*/\nstatic int math_random (lua_State *L) {\n  lua_Integer low, up;\n  double r = (double)l_rand() * (1.0 / ((double)L_RANDMAX + 1.0));\n  switch (lua_gettop(L)) {  /* check number of arguments */\n    case 0: {  /* no arguments */\n      lua_pushnumber(L, (lua_Number)r);  /* Number between 0 and 1 */\n      return 1;\n    }\n    case 1: {  /* only upper limit */\n      low = 1;\n      up = luaL_checkinteger(L, 1);\n      break;\n    }\n    case 2: {  /* lower and upper limits */\n      low = luaL_checkinteger(L, 1);\n      up = luaL_checkinteger(L, 2);\n      break;\n    }\n    default: return luaL_error(L, \"wrong number of arguments\");\n  }\n  /* random integer in the interval [low, up] */\n  luaL_argcheck(L, low <= up, 1, \"interval is empty\"); \n  luaL_argcheck(L, low >= 0 || up <= LUA_MAXINTEGER + low, 1,\n                   \"interval too large\");\n  r *= (double)(up - low) + 1.0;\n  lua_pushinteger(L, (lua_Integer)r + low);\n  return 1;\n}\n\n\nstatic int math_randomseed (lua_State *L) {\n  l_srand((unsigned int)(lua_Integer)luaL_checknumber(L, 1));\n  (void)rand(); /* discard first value to avoid undesirable correlations */\n  return 0;\n}\n\n\nstatic int math_type (lua_State *L) {\n  if (lua_type(L, 1) == LUA_TNUMBER) {\n      if (lua_isinteger(L, 1))\n        lua_pushliteral(L, \"integer\"); \n      else\n        lua_pushliteral(L, \"float\"); \n  }\n  else {\n    luaL_checkany(L, 1);\n    lua_pushnil(L);\n  }\n  return 1;\n}\n\n\n/*\n** {==================================================================\n** Deprecated functions (for compatibility only)\n** ===================================================================\n*/\n#if defined(LUA_COMPAT_MATHLIB)\n\nstatic int math_cosh (lua_State *L) {\n  lua_pushnumber(L, l_mathop(cosh)(luaL_checknumber(L, 1)));\n  return 1;\n}\n\nstatic int math_sinh (lua_State *L) {\n  lua_pushnumber(L, l_mathop(sinh)(luaL_checknumber(L, 1)));\n  return 1;\n}\n\nstatic int math_tanh (lua_State *L) {\n  lua_pushnumber(L, l_mathop(tanh)(luaL_checknumber(L, 1)));\n  return 1;\n}\n\nstatic int math_pow (lua_State *L) {\n  lua_Number x = luaL_checknumber(L, 1);\n  lua_Number y = luaL_checknumber(L, 2);\n  lua_pushnumber(L, l_mathop(pow)(x, y));\n  return 1;\n}\n\nstatic int math_frexp (lua_State *L) {\n  int e;\n  lua_pushnumber(L, l_mathop(frexp)(luaL_checknumber(L, 1), &e));\n  lua_pushinteger(L, e);\n  return 2;\n}\n\nstatic int math_ldexp (lua_State *L) {\n  lua_Number x = luaL_checknumber(L, 1);\n  int ep = (int)luaL_checkinteger(L, 2);\n  lua_pushnumber(L, l_mathop(ldexp)(x, ep));\n  return 1;\n}\n\nstatic int math_log10 (lua_State *L) {\n  lua_pushnumber(L, l_mathop(log10)(luaL_checknumber(L, 1)));\n  return 1;\n}\n\n#endif\n/* }================================================================== */\n\n\n\nstatic const luaL_Reg mathlib[] = {\n  {\"abs\",   math_abs},\n  {\"acos\",  math_acos},\n  {\"asin\",  math_asin},\n  {\"atan\",  math_atan},\n  {\"ceil\",  math_ceil},\n  {\"cos\",   math_cos},\n  {\"deg\",   math_deg},\n  {\"exp\",   math_exp},\n  {\"tointeger\", math_toint},\n  {\"floor\", math_floor},\n  {\"fmod\",   math_fmod},\n  {\"ult\",   math_ult},\n  {\"log\",   math_log},\n  {\"max\",   math_max},\n  {\"min\",   math_min},\n  {\"modf\",   math_modf},\n  {\"rad\",   math_rad},\n  {\"random\",     math_random},\n  {\"randomseed\", math_randomseed},\n  {\"sin\",   math_sin},\n  {\"sqrt\",  math_sqrt},\n  {\"tan\",   math_tan},\n  {\"type\", math_type},\n#if defined(LUA_COMPAT_MATHLIB)\n  {\"atan2\", math_atan},\n  {\"cosh\",   math_cosh},\n  {\"sinh\",   math_sinh},\n  {\"tanh\",   math_tanh},\n  {\"pow\",   math_pow},\n  {\"frexp\", math_frexp},\n  {\"ldexp\", math_ldexp},\n  {\"log10\", math_log10},\n#endif\n  /* placeholders */\n  {\"pi\", NULL},\n  {\"huge\", NULL},\n  {\"maxinteger\", NULL},\n  {\"mininteger\", NULL},\n  {NULL, NULL}\n};\n\n\n/*\n** Open math library\n*/\nLUAMOD_API int luaopen_math (lua_State *L) {\n  luaL_newlib(L, mathlib);\n  lua_pushnumber(L, PI);\n  lua_setfield(L, -2, \"pi\");\n  lua_pushnumber(L, (lua_Number)HUGE_VAL);\n  lua_setfield(L, -2, \"huge\");\n  lua_pushinteger(L, LUA_MAXINTEGER);\n  lua_setfield(L, -2, \"maxinteger\");\n  lua_pushinteger(L, LUA_MININTEGER);\n  lua_setfield(L, -2, \"mininteger\");\n  return 1;\n}\n\n"
  },
  {
    "path": "externals/lua/src/lmem.c",
    "content": "/*\n** $Id: lmem.c,v 1.89 2014/11/02 19:33:33 roberto Exp $\n** Interface to Memory Manager\n** See Copyright Notice in lua.h\n*/\n\n#define lmem_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include <stddef.h>\n\n#include \"lua.h\"\n\n#include \"ldebug.h\"\n#include \"ldo.h\"\n#include \"lgc.h\"\n#include \"lmem.h\"\n#include \"lobject.h\"\n#include \"lstate.h\"\n\n\n\n/*\n** About the realloc function:\n** void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize);\n** ('osize' is the old size, 'nsize' is the new size)\n**\n** * frealloc(ud, NULL, x, s) creates a new block of size 's' (no\n** matter 'x').\n**\n** * frealloc(ud, p, x, 0) frees the block 'p'\n** (in this specific case, frealloc must return NULL);\n** particularly, frealloc(ud, NULL, 0, 0) does nothing\n** (which is equivalent to free(NULL) in ISO C)\n**\n** frealloc returns NULL if it cannot create or reallocate the area\n** (any reallocation to an equal or smaller size cannot fail!)\n*/\n\n\n\n#define MINSIZEARRAY\t4\n\n\nvoid *luaM_growaux_ (lua_State *L, void *block, int *size, size_t size_elems,\n                     int limit, const char *what) {\n  void *newblock;\n  int newsize;\n  if (*size >= limit/2) {  /* cannot double it? */\n    if (*size >= limit)  /* cannot grow even a little? */\n      luaG_runerror(L, \"too many %s (limit is %d)\", what, limit);\n    newsize = limit;  /* still have at least one free place */\n  }\n  else {\n    newsize = (*size)*2;\n    if (newsize < MINSIZEARRAY)\n      newsize = MINSIZEARRAY;  /* minimum size */\n  }\n  newblock = luaM_reallocv(L, block, *size, newsize, size_elems);\n  *size = newsize;  /* update only when everything else is OK */\n  return newblock;\n}\n\n\nl_noret luaM_toobig (lua_State *L) {\n  luaG_runerror(L, \"memory allocation error: block too big\");\n}\n\n\n\n/*\n** generic allocation routine.\n*/\nvoid *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) {\n  void *newblock;\n  global_State *g = G(L);\n  size_t realosize = (block) ? osize : 0;\n  lua_assert((realosize == 0) == (block == NULL));\n#if defined(HARDMEMTESTS)\n  if (nsize > realosize && g->gcrunning)\n    luaC_fullgc(L, 1);  /* force a GC whenever possible */\n#endif\n  newblock = (*g->frealloc)(g->ud, block, osize, nsize);\n  if (newblock == NULL && nsize > 0) {\n    api_check( nsize > realosize,\n                 \"realloc cannot fail when shrinking a block\");\n    luaC_fullgc(L, 1);  /* try to free some memory... */\n    newblock = (*g->frealloc)(g->ud, block, osize, nsize);  /* try again */\n    if (newblock == NULL)\n      luaD_throw(L, LUA_ERRMEM);\n  }\n  lua_assert((nsize == 0) == (newblock == NULL));\n  g->GCdebt = (g->GCdebt + nsize) - realosize;\n  return newblock;\n}\n\n"
  },
  {
    "path": "externals/lua/src/lmem.h",
    "content": "/*\n** $Id: lmem.h,v 1.43 2014/12/19 17:26:14 roberto Exp $\n** Interface to Memory Manager\n** See Copyright Notice in lua.h\n*/\n\n#ifndef lmem_h\n#define lmem_h\n\n\n#include <stddef.h>\n\n#include \"llimits.h\"\n#include \"lua.h\"\n\n\n/*\n** This macro reallocs a vector 'b' from 'on' to 'n' elements, where\n** each element has size 'e'. In case of arithmetic overflow of the\n** product 'n'*'e', it raises an error (calling 'luaM_toobig'). Because\n** 'e' is always constant, it avoids the runtime division MAX_SIZET/(e).\n**\n** (The macro is somewhat complex to avoid warnings:  The 'sizeof'\n** comparison avoids a runtime comparison when overflow cannot occur.\n** The compiler should be able to optimize the real test by itself, but\n** when it does it, it may give a warning about \"comparison is always\n** false due to limited range of data type\"; the +1 tricks the compiler,\n** avoiding this warning but also this optimization.)\n*/\n#define luaM_reallocv(L,b,on,n,e) \\\n  (((sizeof(n) >= sizeof(size_t) && cast(size_t, (n)) + 1 > MAX_SIZET/(e)) \\\n      ? luaM_toobig(L) : cast_void(0)) , \\\n   luaM_realloc_(L, (b), (on)*(e), (n)*(e)))\n\n/*\n** Arrays of chars do not need any test\n*/\n#define luaM_reallocvchar(L,b,on,n)  \\\n    cast(char *, luaM_realloc_(L, (b), (on)*sizeof(char), (n)*sizeof(char)))\n\n#define luaM_freemem(L, b, s)\tluaM_realloc_(L, (b), (s), 0)\n#define luaM_free(L, b)\t\tluaM_realloc_(L, (b), sizeof(*(b)), 0)\n#define luaM_freearray(L, b, n)   luaM_realloc_(L, (b), (n)*sizeof(*(b)), 0)\n\n#define luaM_malloc(L,s)\tluaM_realloc_(L, NULL, 0, (s))\n#define luaM_new(L,t)\t\tcast(t *, luaM_malloc(L, sizeof(t)))\n#define luaM_newvector(L,n,t) \\\n\t\tcast(t *, luaM_reallocv(L, NULL, 0, n, sizeof(t)))\n\n#define luaM_newobject(L,tag,s)\tluaM_realloc_(L, NULL, tag, (s))\n\n#define luaM_growvector(L,v,nelems,size,t,limit,e) \\\n          if ((nelems)+1 > (size)) \\\n            ((v)=cast(t *, luaM_growaux_(L,v,&(size),sizeof(t),limit,e)))\n\n#define luaM_reallocvector(L, v,oldn,n,t) \\\n   ((v)=cast(t *, luaM_reallocv(L, v, oldn, n, sizeof(t))))\n\nLUAI_FUNC l_noret luaM_toobig (lua_State *L);\n\n/* not to be called directly */\nLUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize,\n                                                          size_t size);\nLUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int *size,\n                               size_t size_elem, int limit,\n                               const char *what);\n\n#endif\n\n"
  },
  {
    "path": "externals/lua/src/loadlib.c",
    "content": "/*\n** $Id: loadlib.c,v 1.124 2015/01/05 13:51:39 roberto Exp $\n** Dynamic library loader for Lua\n** See Copyright Notice in lua.h\n**\n** This module contains an implementation of loadlib for Unix systems\n** that have dlfcn, an implementation for Windows, and a stub for other\n** systems.\n*/\n\n#define loadlib_c\n#define LUA_LIB\n\n#include \"lprefix.h\"\n\n\n#include <stdlib.h>\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"lauxlib.h\"\n#include \"lualib.h\"\n\n\n/*\n** LUA_PATH_VAR and LUA_CPATH_VAR are the names of the environment\n** variables that Lua check to set its paths.\n*/\n#if !defined(LUA_PATH_VAR)\n#define LUA_PATH_VAR\t\"LUA_PATH\"\n#endif\n\n#if !defined(LUA_CPATH_VAR)\n#define LUA_CPATH_VAR\t\"LUA_CPATH\"\n#endif\n\n#define LUA_PATHSUFFIX\t\t\"_\" LUA_VERSION_MAJOR \"_\" LUA_VERSION_MINOR\n\n#define LUA_PATHVARVERSION\t\tLUA_PATH_VAR LUA_PATHSUFFIX\n#define LUA_CPATHVARVERSION\t\tLUA_CPATH_VAR LUA_PATHSUFFIX\n\n/*\n** LUA_PATH_SEP is the character that separates templates in a path.\n** LUA_PATH_MARK is the string that marks the substitution points in a\n** template.\n** LUA_EXEC_DIR in a Windows path is replaced by the executable's\n** directory.\n** LUA_IGMARK is a mark to ignore all before it when building the\n** luaopen_ function name.\n*/\n#if !defined (LUA_PATH_SEP)\n#define LUA_PATH_SEP\t\t\";\"\n#endif\n#if !defined (LUA_PATH_MARK)\n#define LUA_PATH_MARK\t\t\"?\"\n#endif\n#if !defined (LUA_EXEC_DIR)\n#define LUA_EXEC_DIR\t\t\"!\"\n#endif\n#if !defined (LUA_IGMARK)\n#define LUA_IGMARK\t\t\"-\"\n#endif\n\n\n/*\n** LUA_CSUBSEP is the character that replaces dots in submodule names\n** when searching for a C loader.\n** LUA_LSUBSEP is the character that replaces dots in submodule names\n** when searching for a Lua loader.\n*/\n#if !defined(LUA_CSUBSEP)\n#define LUA_CSUBSEP\t\tLUA_DIRSEP\n#endif\n\n#if !defined(LUA_LSUBSEP)\n#define LUA_LSUBSEP\t\tLUA_DIRSEP\n#endif\n\n\n/* prefix for open functions in C libraries */\n#define LUA_POF\t\t\"luaopen_\"\n\n/* separator for open functions in C libraries */\n#define LUA_OFSEP\t\"_\"\n\n\n/*\n** unique key for table in the registry that keeps handles\n** for all loaded C libraries\n*/\nstatic const int CLIBS = 0;\n\n#define LIB_FAIL\t\"open\"\n\n#define setprogdir(L)\t\t((void)0)\n\n\n/*\n** system-dependent functions\n*/\n\n/*\n** unload library 'lib'\n*/\nstatic void lsys_unloadlib (void *lib);\n\n/*\n** load C library in file 'path'. If 'seeglb', load with all names in\n** the library global.\n** Returns the library; in case of error, returns NULL plus an\n** error string in the stack.\n*/\nstatic void *lsys_load (lua_State *L, const char *path, int seeglb);\n\n/*\n** Try to find a function named 'sym' in library 'lib'.\n** Returns the function; in case of error, returns NULL plus an\n** error string in the stack.\n*/\nstatic lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym);\n\n\n\n\n#if defined(LUA_USE_DLOPEN)\t/* { */\n/*\n** {========================================================================\n** This is an implementation of loadlib based on the dlfcn interface.\n** The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD,\n** NetBSD, AIX 4.2, HPUX 11, and  probably most other Unix flavors, at least\n** as an emulation layer on top of native functions.\n** =========================================================================\n*/\n\n#include <dlfcn.h>\n\n/*\n** Macro to covert pointer to void* to pointer to function. This cast\n** is undefined according to ISO C, but POSIX assumes that it must work.\n** (The '__extension__' in gnu compilers is only to avoid warnings.)\n*/\n#if defined(__GNUC__)\n#define cast_func(p) (__extension__ (lua_CFunction)(p))\n#else\n#define cast_func(p) ((lua_CFunction)(p))\n#endif\n\n\nstatic void lsys_unloadlib (void *lib) {\n  dlclose(lib);\n}\n\n\nstatic void *lsys_load (lua_State *L, const char *path, int seeglb) {\n  void *lib = dlopen(path, RTLD_NOW | (seeglb ? RTLD_GLOBAL : RTLD_LOCAL));\n  if (lib == NULL) lua_pushstring(L, dlerror());\n  return lib;\n}\n\n\nstatic lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) {\n  lua_CFunction f = cast_func(dlsym(lib, sym));\n  if (f == NULL) lua_pushstring(L, dlerror());\n  return f;\n}\n\n/* }====================================================== */\n\n\n\n#elif defined(LUA_DL_DLL)\t/* }{ */\n/*\n** {======================================================================\n** This is an implementation of loadlib for Windows using native functions.\n** =======================================================================\n*/\n\n#include <windows.h>\n\n#undef setprogdir\n\n/*\n** optional flags for LoadLibraryEx\n*/\n#if !defined(LUA_LLE_FLAGS)\n#define LUA_LLE_FLAGS\t0\n#endif\n\n\nstatic void setprogdir (lua_State *L) {\n  char buff[MAX_PATH + 1];\n  char *lb;\n  DWORD nsize = sizeof(buff)/sizeof(char);\n  DWORD n = GetModuleFileNameA(NULL, buff, nsize);\n  if (n == 0 || n == nsize || (lb = strrchr(buff, '\\\\')) == NULL)\n    luaL_error(L, \"unable to get ModuleFileName\");\n  else {\n    *lb = '\\0';\n    luaL_gsub(L, lua_tostring(L, -1), LUA_EXEC_DIR, buff);\n    lua_remove(L, -2);  /* remove original string */\n  }\n}\n\n\nstatic void pusherror (lua_State *L) {\n  int error = GetLastError();\n  char buffer[128];\n  if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,\n      NULL, error, 0, buffer, sizeof(buffer)/sizeof(char), NULL))\n    lua_pushstring(L, buffer);\n  else\n    lua_pushfstring(L, \"system error %d\\n\", error);\n}\n\nstatic void lsys_unloadlib (void *lib) {\n  FreeLibrary((HMODULE)lib);\n}\n\n\nstatic void *lsys_load (lua_State *L, const char *path, int seeglb) {\n  HMODULE lib = LoadLibraryExA(path, NULL, LUA_LLE_FLAGS);\n  (void)(seeglb);  /* not used: symbols are 'global' by default */\n  if (lib == NULL) pusherror(L);\n  return lib;\n}\n\n\nstatic lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) {\n  lua_CFunction f = (lua_CFunction)GetProcAddress((HMODULE)lib, sym);\n  if (f == NULL) pusherror(L);\n  return f;\n}\n\n/* }====================================================== */\n\n\n#else\t\t\t\t/* }{ */\n/*\n** {======================================================\n** Fallback for other systems\n** =======================================================\n*/\n\n#undef LIB_FAIL\n#define LIB_FAIL\t\"absent\"\n\n\n#define DLMSG\t\"dynamic libraries not enabled; check your Lua installation\"\n\n\nstatic void lsys_unloadlib (void *lib) {\n  (void)(lib);  /* not used */\n}\n\n\nstatic void *lsys_load (lua_State *L, const char *path, int seeglb) {\n  (void)(path); (void)(seeglb);  /* not used */\n  lua_pushliteral(L, DLMSG);\n  return NULL;\n}\n\n\nstatic lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) {\n  (void)(lib); (void)(sym);  /* not used */\n  lua_pushliteral(L, DLMSG);\n  return NULL;\n}\n\n/* }====================================================== */\n#endif\t\t\t\t/* } */\n\n\n/*\n** return registry.CLIBS[path]\n*/\nstatic void *checkclib (lua_State *L, const char *path) {\n  void *plib;\n  lua_rawgetp(L, LUA_REGISTRYINDEX, &CLIBS);\n  lua_getfield(L, -1, path);\n  plib = lua_touserdata(L, -1);  /* plib = CLIBS[path] */\n  lua_pop(L, 2);  /* pop CLIBS table and 'plib' */\n  return plib;\n}\n\n\n/*\n** registry.CLIBS[path] = plib        -- for queries\n** registry.CLIBS[#CLIBS + 1] = plib  -- also keep a list of all libraries\n*/\nstatic void addtoclib (lua_State *L, const char *path, void *plib) {\n  lua_rawgetp(L, LUA_REGISTRYINDEX, &CLIBS);\n  lua_pushlightuserdata(L, plib);\n  lua_pushvalue(L, -1);\n  lua_setfield(L, -3, path);  /* CLIBS[path] = plib */\n  lua_rawseti(L, -2, luaL_len(L, -2) + 1);  /* CLIBS[#CLIBS + 1] = plib */\n  lua_pop(L, 1);  /* pop CLIBS table */\n}\n\n\n/*\n** __gc tag method for CLIBS table: calls 'lsys_unloadlib' for all lib\n** handles in list CLIBS\n*/\nstatic int gctm (lua_State *L) {\n  lua_Integer n = luaL_len(L, 1);\n  for (; n >= 1; n--) {  /* for each handle, in reverse order */\n    lua_rawgeti(L, 1, n);  /* get handle CLIBS[n] */\n    lsys_unloadlib(lua_touserdata(L, -1));\n    lua_pop(L, 1);  /* pop handle */\n  }\n  return 0;\n}\n\n\n\n/* error codes for 'lookforfunc' */\n#define ERRLIB\t\t1\n#define ERRFUNC\t\t2\n\n/*\n** Look for a C function named 'sym' in a dynamically loaded library\n** 'path'.\n** First, check whether the library is already loaded; if not, try\n** to load it.\n** Then, if 'sym' is '*', return true (as library has been loaded).\n** Otherwise, look for symbol 'sym' in the library and push a\n** C function with that symbol.\n** Return 0 and 'true' or a function in the stack; in case of\n** errors, return an error code and an error message in the stack.\n*/\nstatic int lookforfunc (lua_State *L, const char *path, const char *sym) {\n  void *reg = checkclib(L, path);  /* check loaded C libraries */\n  if (reg == NULL) {  /* must load library? */\n    reg = lsys_load(L, path, *sym == '*');  /* global symbols if 'sym'=='*' */\n    if (reg == NULL) return ERRLIB;  /* unable to load library */\n    addtoclib(L, path, reg);\n  }\n  if (*sym == '*') {  /* loading only library (no function)? */\n    lua_pushboolean(L, 1);  /* return 'true' */\n    return 0;  /* no errors */\n  }\n  else {\n    lua_CFunction f = lsys_sym(L, reg, sym);\n    if (f == NULL)\n      return ERRFUNC;  /* unable to find function */\n    lua_pushcfunction(L, f);  /* else create new function */\n    return 0;  /* no errors */\n  }\n}\n\n\nstatic int ll_loadlib (lua_State *L) {\n  const char *path = luaL_checkstring(L, 1);\n  const char *init = luaL_checkstring(L, 2);\n  int stat = lookforfunc(L, path, init);\n  if (stat == 0)  /* no errors? */\n    return 1;  /* return the loaded function */\n  else {  /* error; error message is on stack top */\n    lua_pushnil(L);\n    lua_insert(L, -2);\n    lua_pushstring(L, (stat == ERRLIB) ?  LIB_FAIL : \"init\");\n    return 3;  /* return nil, error message, and where */\n  }\n}\n\n\n\n/*\n** {======================================================\n** 'require' function\n** =======================================================\n*/\n\n\nstatic int readable (const char *filename) {\n  FILE *f = fopen(filename, \"r\");  /* try to open file */\n  if (f == NULL) return 0;  /* open failed */\n  fclose(f);\n  return 1;\n}\n\n\nstatic const char *pushnexttemplate (lua_State *L, const char *path) {\n  const char *l;\n  while (*path == *LUA_PATH_SEP) path++;  /* skip separators */\n  if (*path == '\\0') return NULL;  /* no more templates */\n  l = strchr(path, *LUA_PATH_SEP);  /* find next separator */\n  if (l == NULL) l = path + strlen(path);\n  lua_pushlstring(L, path, l - path);  /* template */\n  return l;\n}\n\n\nstatic const char *searchpath (lua_State *L, const char *name,\n                                             const char *path,\n                                             const char *sep,\n                                             const char *dirsep) {\n  luaL_Buffer msg;  /* to build error message */\n  luaL_buffinit(L, &msg);\n  if (*sep != '\\0')  /* non-empty separator? */\n    name = luaL_gsub(L, name, sep, dirsep);  /* replace it by 'dirsep' */\n  while ((path = pushnexttemplate(L, path)) != NULL) {\n    const char *filename = luaL_gsub(L, lua_tostring(L, -1),\n                                     LUA_PATH_MARK, name);\n    lua_remove(L, -2);  /* remove path template */\n    if (readable(filename))  /* does file exist and is readable? */\n      return filename;  /* return that file name */\n    lua_pushfstring(L, \"\\n\\tno file '%s'\", filename);\n    lua_remove(L, -2);  /* remove file name */\n    luaL_addvalue(&msg);  /* concatenate error msg. entry */\n  }\n  luaL_pushresult(&msg);  /* create error message */\n  return NULL;  /* not found */\n}\n\n\nstatic int ll_searchpath (lua_State *L) {\n  const char *f = searchpath(L, luaL_checkstring(L, 1),\n                                luaL_checkstring(L, 2),\n                                luaL_optstring(L, 3, \".\"),\n                                luaL_optstring(L, 4, LUA_DIRSEP));\n  if (f != NULL) return 1;\n  else {  /* error message is on top of the stack */\n    lua_pushnil(L);\n    lua_insert(L, -2);\n    return 2;  /* return nil + error message */\n  }\n}\n\n\nstatic const char *findfile (lua_State *L, const char *name,\n                                           const char *pname,\n                                           const char *dirsep) {\n  const char *path;\n  lua_getfield(L, lua_upvalueindex(1), pname);\n  path = lua_tostring(L, -1);\n  if (path == NULL)\n    luaL_error(L, \"'package.%s' must be a string\", pname);\n  return searchpath(L, name, path, \".\", dirsep);\n}\n\n\nstatic int checkload (lua_State *L, int stat, const char *filename) {\n  if (stat) {  /* module loaded successfully? */\n    lua_pushstring(L, filename);  /* will be 2nd argument to module */\n    return 2;  /* return open function and file name */\n  }\n  else\n    return luaL_error(L, \"error loading module '%s' from file '%s':\\n\\t%s\",\n                          lua_tostring(L, 1), filename, lua_tostring(L, -1));\n}\n\n\nstatic int searcher_Lua (lua_State *L) {\n  const char *filename;\n  const char *name = luaL_checkstring(L, 1);\n  filename = findfile(L, name, \"path\", LUA_LSUBSEP);\n  if (filename == NULL) return 1;  /* module not found in this path */\n  return checkload(L, (luaL_loadfile(L, filename) == LUA_OK), filename);\n}\n\n\n/*\n** Try to find a load function for module 'modname' at file 'filename'.\n** First, change '.' to '_' in 'modname'; then, if 'modname' has\n** the form X-Y (that is, it has an \"ignore mark\"), build a function\n** name \"luaopen_X\" and look for it. (For compatibility, if that\n** fails, it also tries \"luaopen_Y\".) If there is no ignore mark,\n** look for a function named \"luaopen_modname\".\n*/\nstatic int loadfunc (lua_State *L, const char *filename, const char *modname) {\n  const char *openfunc;\n  const char *mark;\n  modname = luaL_gsub(L, modname, \".\", LUA_OFSEP);\n  mark = strchr(modname, *LUA_IGMARK);\n  if (mark) {\n    int stat;\n    openfunc = lua_pushlstring(L, modname, mark - modname);\n    openfunc = lua_pushfstring(L, LUA_POF\"%s\", openfunc);\n    stat = lookforfunc(L, filename, openfunc);\n    if (stat != ERRFUNC) return stat;\n    modname = mark + 1;  /* else go ahead and try old-style name */\n  }\n  openfunc = lua_pushfstring(L, LUA_POF\"%s\", modname);\n  return lookforfunc(L, filename, openfunc);\n}\n\n\nstatic int searcher_C (lua_State *L) {\n  const char *name = luaL_checkstring(L, 1);\n  const char *filename = findfile(L, name, \"cpath\", LUA_CSUBSEP);\n  if (filename == NULL) return 1;  /* module not found in this path */\n  return checkload(L, (loadfunc(L, filename, name) == 0), filename);\n}\n\n\nstatic int searcher_Croot (lua_State *L) {\n  const char *filename;\n  const char *name = luaL_checkstring(L, 1);\n  const char *p = strchr(name, '.');\n  int stat;\n  if (p == NULL) return 0;  /* is root */\n  lua_pushlstring(L, name, p - name);\n  filename = findfile(L, lua_tostring(L, -1), \"cpath\", LUA_CSUBSEP);\n  if (filename == NULL) return 1;  /* root not found */\n  if ((stat = loadfunc(L, filename, name)) != 0) {\n    if (stat != ERRFUNC)\n      return checkload(L, 0, filename);  /* real error */\n    else {  /* open function not found */\n      lua_pushfstring(L, \"\\n\\tno module '%s' in file '%s'\", name, filename);\n      return 1;\n    }\n  }\n  lua_pushstring(L, filename);  /* will be 2nd argument to module */\n  return 2;\n}\n\n\nstatic int searcher_preload (lua_State *L) {\n  const char *name = luaL_checkstring(L, 1);\n  lua_getfield(L, LUA_REGISTRYINDEX, \"_PRELOAD\");\n  if (lua_getfield(L, -1, name) == LUA_TNIL)  /* not found? */\n    lua_pushfstring(L, \"\\n\\tno field package.preload['%s']\", name);\n  return 1;\n}\n\n\nstatic void findloader (lua_State *L, const char *name) {\n  int i;\n  luaL_Buffer msg;  /* to build error message */\n  luaL_buffinit(L, &msg);\n  /* push 'package.searchers' to index 3 in the stack */\n  if (lua_getfield(L, lua_upvalueindex(1), \"searchers\") != LUA_TTABLE)\n    luaL_error(L, \"'package.searchers' must be a table\");\n  /*  iterate over available searchers to find a loader */\n  for (i = 1; ; i++) {\n    if (lua_rawgeti(L, 3, i) == LUA_TNIL) {  /* no more searchers? */\n      lua_pop(L, 1);  /* remove nil */\n      luaL_pushresult(&msg);  /* create error message */\n      luaL_error(L, \"module '%s' not found:%s\", name, lua_tostring(L, -1));\n    }\n    lua_pushstring(L, name);\n    lua_call(L, 1, 2);  /* call it */\n    if (lua_isfunction(L, -2))  /* did it find a loader? */\n      return;  /* module loader found */\n    else if (lua_isstring(L, -2)) {  /* searcher returned error message? */\n      lua_pop(L, 1);  /* remove extra return */\n      luaL_addvalue(&msg);  /* concatenate error message */\n    }\n    else\n      lua_pop(L, 2);  /* remove both returns */\n  }\n}\n\n\nstatic int ll_require (lua_State *L) {\n  const char *name = luaL_checkstring(L, 1);\n  lua_settop(L, 1);  /* _LOADED table will be at index 2 */\n  lua_getfield(L, LUA_REGISTRYINDEX, \"_LOADED\");\n  lua_getfield(L, 2, name);  /* _LOADED[name] */\n  if (lua_toboolean(L, -1))  /* is it there? */\n    return 1;  /* package is already loaded */\n  /* else must load package */\n  lua_pop(L, 1);  /* remove 'getfield' result */\n  findloader(L, name);\n  lua_pushstring(L, name);  /* pass name as argument to module loader */\n  lua_insert(L, -2);  /* name is 1st argument (before search data) */\n  lua_call(L, 2, 1);  /* run loader to load module */\n  if (!lua_isnil(L, -1))  /* non-nil return? */\n    lua_setfield(L, 2, name);  /* _LOADED[name] = returned value */\n  if (lua_getfield(L, 2, name) == LUA_TNIL) {   /* module set no value? */\n    lua_pushboolean(L, 1);  /* use true as result */\n    lua_pushvalue(L, -1);  /* extra copy to be returned */\n    lua_setfield(L, 2, name);  /* _LOADED[name] = true */\n  }\n  return 1;\n}\n\n/* }====================================================== */\n\n\n\n/*\n** {======================================================\n** 'module' function\n** =======================================================\n*/\n#if defined(LUA_COMPAT_MODULE)\n\n/*\n** changes the environment variable of calling function\n*/\nstatic void set_env (lua_State *L) {\n  lua_Debug ar;\n  if (lua_getstack(L, 1, &ar) == 0 ||\n      lua_getinfo(L, \"f\", &ar) == 0 ||  /* get calling function */\n      lua_iscfunction(L, -1))\n    luaL_error(L, \"'module' not called from a Lua function\");\n  lua_pushvalue(L, -2);  /* copy new environment table to top */\n  lua_setupvalue(L, -2, 1);\n  lua_pop(L, 1);  /* remove function */\n}\n\n\nstatic void dooptions (lua_State *L, int n) {\n  int i;\n  for (i = 2; i <= n; i++) {\n    if (lua_isfunction(L, i)) {  /* avoid 'calling' extra info. */\n      lua_pushvalue(L, i);  /* get option (a function) */\n      lua_pushvalue(L, -2);  /* module */\n      lua_call(L, 1, 0);\n    }\n  }\n}\n\n\nstatic void modinit (lua_State *L, const char *modname) {\n  const char *dot;\n  lua_pushvalue(L, -1);\n  lua_setfield(L, -2, \"_M\");  /* module._M = module */\n  lua_pushstring(L, modname);\n  lua_setfield(L, -2, \"_NAME\");\n  dot = strrchr(modname, '.');  /* look for last dot in module name */\n  if (dot == NULL) dot = modname;\n  else dot++;\n  /* set _PACKAGE as package name (full module name minus last part) */\n  lua_pushlstring(L, modname, dot - modname);\n  lua_setfield(L, -2, \"_PACKAGE\");\n}\n\n\nstatic int ll_module (lua_State *L) {\n  const char *modname = luaL_checkstring(L, 1);\n  int lastarg = lua_gettop(L);  /* last parameter */\n  luaL_pushmodule(L, modname, 1);  /* get/create module table */\n  /* check whether table already has a _NAME field */\n  if (lua_getfield(L, -1, \"_NAME\") != LUA_TNIL)\n    lua_pop(L, 1);  /* table is an initialized module */\n  else {  /* no; initialize it */\n    lua_pop(L, 1);\n    modinit(L, modname);\n  }\n  lua_pushvalue(L, -1);\n  set_env(L);\n  dooptions(L, lastarg);\n  return 1;\n}\n\n\nstatic int ll_seeall (lua_State *L) {\n  luaL_checktype(L, 1, LUA_TTABLE);\n  if (!lua_getmetatable(L, 1)) {\n    lua_createtable(L, 0, 1); /* create new metatable */\n    lua_pushvalue(L, -1);\n    lua_setmetatable(L, 1);\n  }\n  lua_pushglobaltable(L);\n  lua_setfield(L, -2, \"__index\");  /* mt.__index = _G */\n  return 0;\n}\n\n#endif\n/* }====================================================== */\n\n\n\n/* auxiliary mark (for internal use) */\n#define AUXMARK\t\t\"\\1\"\n\n\n/*\n** return registry.LUA_NOENV as a boolean\n*/\nstatic int noenv (lua_State *L) {\n  int b;\n  lua_getfield(L, LUA_REGISTRYINDEX, \"LUA_NOENV\");\n  b = lua_toboolean(L, -1);\n  lua_pop(L, 1);  /* remove value */\n  return b;\n}\n\n\nstatic void setpath (lua_State *L, const char *fieldname, const char *envname1,\n                                   const char *envname2, const char *def) {\n  const char *path = getenv(envname1);\n  if (path == NULL)  /* no environment variable? */\n    path = getenv(envname2);  /* try alternative name */\n  if (path == NULL || noenv(L))  /* no environment variable? */\n    lua_pushstring(L, def);  /* use default */\n  else {\n    /* replace \";;\" by \";AUXMARK;\" and then AUXMARK by default path */\n    path = luaL_gsub(L, path, LUA_PATH_SEP LUA_PATH_SEP,\n                              LUA_PATH_SEP AUXMARK LUA_PATH_SEP);\n    luaL_gsub(L, path, AUXMARK, def);\n    lua_remove(L, -2);\n  }\n  setprogdir(L);\n  lua_setfield(L, -2, fieldname);\n}\n\n\nstatic const luaL_Reg pk_funcs[] = {\n  {\"loadlib\", ll_loadlib},\n  {\"searchpath\", ll_searchpath},\n#if defined(LUA_COMPAT_MODULE)\n  {\"seeall\", ll_seeall},\n#endif\n  /* placeholders */\n  {\"preload\", NULL},\n  {\"cpath\", NULL},\n  {\"path\", NULL},\n  {\"searchers\", NULL},\n  {\"loaded\", NULL},\n  {NULL, NULL}\n};\n\n\nstatic const luaL_Reg ll_funcs[] = {\n#if defined(LUA_COMPAT_MODULE)\n  {\"module\", ll_module},\n#endif\n  {\"require\", ll_require},\n  {NULL, NULL}\n};\n\n\nstatic void createsearcherstable (lua_State *L) {\n  static const lua_CFunction searchers[] =\n    {searcher_preload, searcher_Lua, searcher_C, searcher_Croot, NULL};\n  int i;\n  /* create 'searchers' table */\n  lua_createtable(L, sizeof(searchers)/sizeof(searchers[0]) - 1, 0);\n  /* fill it with pre-defined searchers */\n  for (i=0; searchers[i] != NULL; i++) {\n    lua_pushvalue(L, -2);  /* set 'package' as upvalue for all searchers */\n    lua_pushcclosure(L, searchers[i], 1);\n    lua_rawseti(L, -2, i+1);\n  }\n#if defined(LUA_COMPAT_LOADERS)\n  lua_pushvalue(L, -1);  /* make a copy of 'searchers' table */\n  lua_setfield(L, -3, \"loaders\");  /* put it in field 'loaders' */\n#endif\n  lua_setfield(L, -2, \"searchers\");  /* put it in field 'searchers' */\n}\n\n\n/*\n** create table CLIBS to keep track of loaded C libraries,\n** setting a finalizer to close all libraries when closing state.\n*/\nstatic void createclibstable (lua_State *L) {\n  lua_newtable(L);  /* create CLIBS table */\n  lua_createtable(L, 0, 1);  /* create metatable for CLIBS */\n  lua_pushcfunction(L, gctm);\n  lua_setfield(L, -2, \"__gc\");  /* set finalizer for CLIBS table */\n  lua_setmetatable(L, -2);\n  lua_rawsetp(L, LUA_REGISTRYINDEX, &CLIBS);  /* set CLIBS table in registry */\n}\n\n\nLUAMOD_API int luaopen_package (lua_State *L) {\n  createclibstable(L);\n  luaL_newlib(L, pk_funcs);  /* create 'package' table */\n  createsearcherstable(L);\n  /* set field 'path' */\n  setpath(L, \"path\", LUA_PATHVARVERSION, LUA_PATH_VAR, LUA_PATH_DEFAULT);\n  /* set field 'cpath' */\n  setpath(L, \"cpath\", LUA_CPATHVARVERSION, LUA_CPATH_VAR, LUA_CPATH_DEFAULT);\n  /* store config information */\n  lua_pushliteral(L, LUA_DIRSEP \"\\n\" LUA_PATH_SEP \"\\n\" LUA_PATH_MARK \"\\n\"\n                     LUA_EXEC_DIR \"\\n\" LUA_IGMARK \"\\n\");\n  lua_setfield(L, -2, \"config\");\n  /* set field 'loaded' */\n  luaL_getsubtable(L, LUA_REGISTRYINDEX, \"_LOADED\");\n  lua_setfield(L, -2, \"loaded\");\n  /* set field 'preload' */\n  luaL_getsubtable(L, LUA_REGISTRYINDEX, \"_PRELOAD\");\n  lua_setfield(L, -2, \"preload\");\n  lua_pushglobaltable(L);\n  lua_pushvalue(L, -2);  /* set 'package' as upvalue for next lib */\n  luaL_setfuncs(L, ll_funcs, 1);  /* open lib into global table */\n  lua_pop(L, 1);  /* pop global table */\n  return 1;  /* return 'package' table */\n}\n\n"
  },
  {
    "path": "externals/lua/src/lobject.c",
    "content": "/*\n** $Id: lobject.c,v 2.101 2014/12/26 14:43:45 roberto Exp $\n** Some generic functions over Lua objects\n** See Copyright Notice in lua.h\n*/\n\n#define lobject_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include <stdarg.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"lctype.h\"\n#include \"ldebug.h\"\n#include \"ldo.h\"\n#include \"lmem.h\"\n#include \"lobject.h\"\n#include \"lstate.h\"\n#include \"lstring.h\"\n#include \"lvm.h\"\n\n\n\nLUAI_DDEF const TValue luaO_nilobject_ = {NILCONSTANT};\n\n\n/*\n** converts an integer to a \"floating point byte\", represented as\n** (eeeeexxx), where the real value is (1xxx) * 2^(eeeee - 1) if\n** eeeee != 0 and (xxx) otherwise.\n*/\nint luaO_int2fb (unsigned int x) {\n  int e = 0;  /* exponent */\n  if (x < 8) return x;\n  while (x >= 0x10) {\n    x = (x+1) >> 1;\n    e++;\n  }\n  return ((e+1) << 3) | (cast_int(x) - 8);\n}\n\n\n/* converts back */\nint luaO_fb2int (int x) {\n  int e = (x >> 3) & 0x1f;\n  if (e == 0) return x;\n  else return ((x & 7) + 8) << (e - 1);\n}\n\n\nint luaO_ceillog2 (unsigned int x) {\n  static const lu_byte log_2[256] = {\n    0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,\n    6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,\n    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\n    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\n    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\n    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8\n  };\n  int l = 0;\n  x--;\n  while (x >= 256) { l += 8; x >>= 8; }\n  return l + log_2[x];\n}\n\n\nstatic lua_Integer intarith (lua_State *L, int op, lua_Integer v1,\n                                                   lua_Integer v2) {\n  switch (op) {\n    case LUA_OPADD: return intop(+, v1, v2);\n    case LUA_OPSUB:return intop(-, v1, v2);\n    case LUA_OPMUL:return intop(*, v1, v2);\n    case LUA_OPMOD: return luaV_mod(L, v1, v2);\n    case LUA_OPIDIV: return luaV_div(L, v1, v2);\n    case LUA_OPBAND: return intop(&, v1, v2);\n    case LUA_OPBOR: return intop(|, v1, v2);\n    case LUA_OPBXOR: return intop(^, v1, v2);\n    case LUA_OPSHL: return luaV_shiftl(v1, v2);\n    case LUA_OPSHR: return luaV_shiftl(v1, -v2);\n    case LUA_OPUNM: return intop(-, 0, v1);\n    case LUA_OPBNOT: return intop(^, ~l_castS2U(0), v1);\n    default: lua_assert(0); return 0;\n  }\n}\n\n\nstatic lua_Number numarith (lua_State *L, int op, lua_Number v1,\n                                                  lua_Number v2) {\n  switch (op) {\n    case LUA_OPADD: return luai_numadd(L, v1, v2);\n    case LUA_OPSUB: return luai_numsub(L, v1, v2);\n    case LUA_OPMUL: return luai_nummul(L, v1, v2);\n    case LUA_OPDIV: return luai_numdiv(L, v1, v2);\n    case LUA_OPPOW: return luai_numpow(L, v1, v2);\n    case LUA_OPIDIV: return luai_numidiv(L, v1, v2);\n    case LUA_OPUNM: return luai_numunm(L, v1);\n    case LUA_OPMOD: {\n      lua_Number m;\n      luai_nummod(L, v1, v2, m);\n      return m;\n    }\n    default: lua_assert(0); return 0;\n  }\n}\n\n\nvoid luaO_arith (lua_State *L, int op, const TValue *p1, const TValue *p2,\n                 TValue *res) {\n  switch (op) {\n    case LUA_OPBAND: case LUA_OPBOR: case LUA_OPBXOR:\n    case LUA_OPSHL: case LUA_OPSHR:\n    case LUA_OPBNOT: {  /* operate only on integers */\n      lua_Integer i1; lua_Integer i2;\n      if (tointeger(p1, &i1) && tointeger(p2, &i2)) {\n        setivalue(res, intarith(L, op, i1, i2));\n        return;\n      }\n      else break;  /* go to the end */\n    }\n    case LUA_OPDIV: case LUA_OPPOW: {  /* operate only on floats */\n      lua_Number n1; lua_Number n2;\n      if (tonumber(p1, &n1) && tonumber(p2, &n2)) {\n        setfltvalue(res, numarith(L, op, n1, n2));\n        return;\n      }\n      else break;  /* go to the end */\n    }\n    default: {  /* other operations */\n      lua_Number n1; lua_Number n2;\n      if (ttisinteger(p1) && ttisinteger(p2)) {\n        setivalue(res, intarith(L, op, ivalue(p1), ivalue(p2)));\n        return;\n      }\n      else if (tonumber(p1, &n1) && tonumber(p2, &n2)) {\n        setfltvalue(res, numarith(L, op, n1, n2));\n        return;\n      }\n      else break;  /* go to the end */\n    }\n  }\n  /* could not perform raw operation; try metamethod */\n  lua_assert(L != NULL);  /* should not fail when folding (compile time) */\n  luaT_trybinTM(L, p1, p2, res, cast(TMS, op - LUA_OPADD + TM_ADD));\n}\n\n\nint luaO_hexavalue (int c) {\n  if (lisdigit(c)) return c - '0';\n  else return ltolower(c) - 'a' + 10;\n}\n\n\nstatic int isneg (const char **s) {\n  if (**s == '-') { (*s)++; return 1; }\n  else if (**s == '+') (*s)++;\n  return 0;\n}\n\n\n\n/*\n** {==================================================================\n** Lua's implementation for 'lua_strx2number'\n** ===================================================================\n*/\n#if !defined(lua_strx2number)\n\n#include <math.h>\n\n/* maximum number of significant digits to read (to avoid overflows\n   even with single floats) */\n#define MAXSIGDIG\t30\n\n/*\n** convert an hexadecimal numeric string to a number, following\n** C99 specification for 'strtod'\n*/\nstatic lua_Number lua_strx2number (const char *s, char **endptr) {\n  lua_Number r = 0.0;  /* result (accumulator) */\n  int sigdig = 0;  /* number of significant digits */\n  int nosigdig = 0;  /* number of non-significant digits */\n  int e = 0;  /* exponent correction */\n  int neg;  /* 1 if number is negative */\n  int dot = 0;  /* true after seen a dot */\n  *endptr = cast(char *, s);  /* nothing is valid yet */\n  while (lisspace(cast_uchar(*s))) s++;  /* skip initial spaces */\n  neg = isneg(&s);  /* check signal */\n  if (!(*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X')))  /* check '0x' */\n    return 0.0;  /* invalid format (no '0x') */\n  for (s += 2; ; s++) {  /* skip '0x' and read numeral */\n    if (*s == '.') {\n      if (dot) break;  /* second dot? stop loop */\n      else dot = 1;\n    }\n    else if (lisxdigit(cast_uchar(*s))) {\n      if (sigdig == 0 && *s == '0')  /* non-significant digit (zero)? */\n        nosigdig++;\n      else if (++sigdig <= MAXSIGDIG)  /* can read it without overflow? */\n          r = (r * cast_num(16.0)) + luaO_hexavalue(*s);\n      else e++; /* too many digits; ignore, but still count for exponent */\n      if (dot) e--;  /* decimal digit? correct exponent */\n    }\n    else break;  /* neither a dot nor a digit */\n  }\n  if (nosigdig + sigdig == 0)  /* no digits? */\n    return 0.0;  /* invalid format */\n  *endptr = cast(char *, s);  /* valid up to here */\n  e *= 4;  /* each digit multiplies/divides value by 2^4 */\n  if (*s == 'p' || *s == 'P') {  /* exponent part? */\n    int exp1 = 0;  /* exponent value */\n    int neg1;  /* exponent signal */\n    s++;  /* skip 'p' */\n    neg1 = isneg(&s);  /* signal */\n    if (!lisdigit(cast_uchar(*s)))\n      return 0.0;  /* invalid; must have at least one digit */\n    while (lisdigit(cast_uchar(*s)))  /* read exponent */\n      exp1 = exp1 * 10 + *(s++) - '0';\n    if (neg1) exp1 = -exp1;\n    e += exp1;\n    *endptr = cast(char *, s);  /* valid up to here */\n  }\n  if (neg) r = -r;\n  return l_mathop(ldexp)(r, e);\n}\n\n#endif\n/* }====================================================== */\n\n\nstatic const char *l_str2d (const char *s, lua_Number *result) {\n  char *endptr;\n  if (strpbrk(s, \"nN\"))  /* reject 'inf' and 'nan' */\n    return NULL;\n  else if (strpbrk(s, \"xX\"))  /* hex? */\n    *result = lua_strx2number(s, &endptr);\n  else\n    *result = lua_str2number(s, &endptr);\n  if (endptr == s) return 0;  /* nothing recognized */\n  while (lisspace(cast_uchar(*endptr))) endptr++;\n  return (*endptr == '\\0' ? endptr : NULL);  /* OK if no trailing characters */\n}\n\n\nstatic const char *l_str2int (const char *s, lua_Integer *result) {\n  lua_Unsigned a = 0;\n  int empty = 1;\n  int neg;\n  while (lisspace(cast_uchar(*s))) s++;  /* skip initial spaces */\n  neg = isneg(&s);\n  if (s[0] == '0' &&\n      (s[1] == 'x' || s[1] == 'X')) {  /* hex? */\n    s += 2;  /* skip '0x' */\n    for (; lisxdigit(cast_uchar(*s)); s++) {\n      a = a * 16 + luaO_hexavalue(*s);\n      empty = 0;\n    }\n  }\n  else {  /* decimal */\n    for (; lisdigit(cast_uchar(*s)); s++) {\n      a = a * 10 + *s - '0';\n      empty = 0;\n    }\n  }\n  while (lisspace(cast_uchar(*s))) s++;  /* skip trailing spaces */\n  if (empty || *s != '\\0') return NULL;  /* something wrong in the numeral */\n  else {\n    *result = l_castU2S((neg) ? 0u - a : a);\n    return s;\n  }\n}\n\n\nsize_t luaO_str2num (const char *s, TValue *o) {\n  lua_Integer i; lua_Number n;\n  const char *e;\n  if ((e = l_str2int(s, &i)) != NULL) {  /* try as an integer */\n    setivalue(o, i);\n  }\n  else if ((e = l_str2d(s, &n)) != NULL) {  /* else try as a float */\n    setfltvalue(o, n);\n  }\n  else\n    return 0;  /* conversion failed */\n  return (e - s + 1);  /* success; return string size */\n}\n\n\nint luaO_utf8esc (char *buff, unsigned long x) {\n  int n = 1;  /* number of bytes put in buffer (backwards) */\n  lua_assert(x <= 0x10FFFF);\n  if (x < 0x80)  /* ascii? */\n    buff[UTF8BUFFSZ - 1] = cast(char, x);\n  else {  /* need continuation bytes */\n    unsigned int mfb = 0x3f;  /* maximum that fits in first byte */\n    do {  /* add continuation bytes */\n      buff[UTF8BUFFSZ - (n++)] = cast(char, 0x80 | (x & 0x3f));\n      x >>= 6;  /* remove added bits */\n      mfb >>= 1;  /* now there is one less bit available in first byte */\n    } while (x > mfb);  /* still needs continuation byte? */\n    buff[UTF8BUFFSZ - n] = cast(char, (~mfb << 1) | x);  /* add first byte */\n  }\n  return n;\n}\n\n\n/* maximum length of the conversion of a number to a string */\n#define MAXNUMBER2STR\t50\n\n\n/*\n** Convert a number object to a string\n*/\nvoid luaO_tostring (lua_State *L, StkId obj) {\n  char buff[MAXNUMBER2STR];\n  size_t len;\n  lua_assert(ttisnumber(obj));\n  if (ttisinteger(obj))\n    len = lua_integer2str(buff, ivalue(obj));\n  else {\n    len = lua_number2str(buff, fltvalue(obj));\n#if !defined(LUA_COMPAT_FLOATSTRING)\n    if (buff[strspn(buff, \"-0123456789\")] == '\\0') {  /* looks like an int? */\n      buff[len++] = '.';\n      buff[len++] = '0';  /* adds '.0' to result */\n    }\n#endif\n  }\n  setsvalue2s(L, obj, luaS_newlstr(L, buff, len));\n}\n\n\nstatic void pushstr (lua_State *L, const char *str, size_t l) {\n  setsvalue2s(L, L->top++, luaS_newlstr(L, str, l));\n}\n\n\n/* this function handles only '%d', '%c', '%f', '%p', and '%s' \n   conventional formats, plus Lua-specific '%I' and '%U' */\nconst char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) {\n  int n = 0;\n  for (;;) {\n    const char *e = strchr(fmt, '%');\n    if (e == NULL) break;\n    luaD_checkstack(L, 2);  /* fmt + item */\n    pushstr(L, fmt, e - fmt);\n    switch (*(e+1)) {\n      case 's': {\n        const char *s = va_arg(argp, char *);\n        if (s == NULL) s = \"(null)\";\n        pushstr(L, s, strlen(s));\n        break;\n      }\n      case 'c': {\n        char buff = cast(char, va_arg(argp, int));\n        if (lisprint(cast_uchar(buff)))\n          pushstr(L, &buff, 1);\n        else  /* non-printable character; print its code */\n          luaO_pushfstring(L, \"<\\\\%d>\", cast_uchar(buff));\n        break;\n      }\n      case 'd': {\n        setivalue(L->top++, va_arg(argp, int));\n        luaO_tostring(L, L->top - 1);\n        break;\n      }\n      case 'I': {\n        setivalue(L->top++, cast(lua_Integer, va_arg(argp, l_uacInt)));\n        luaO_tostring(L, L->top - 1);\n        break;\n      }\n      case 'f': {\n        setfltvalue(L->top++, cast_num(va_arg(argp, l_uacNumber)));\n        luaO_tostring(L, L->top - 1);\n        break;\n      }\n      case 'p': {\n        char buff[4*sizeof(void *) + 8]; /* should be enough space for a '%p' */\n        int l = sprintf(buff, \"%p\", va_arg(argp, void *));\n        pushstr(L, buff, l);\n        break;\n      }\n      case 'U': {\n        char buff[UTF8BUFFSZ];\n        int l = luaO_utf8esc(buff, cast(long, va_arg(argp, long)));\n        pushstr(L, buff + UTF8BUFFSZ - l, l);\n        break;\n      }\n      case '%': {\n        pushstr(L, \"%\", 1);\n        break;\n      }\n      default: {\n        luaG_runerror(L, \"invalid option '%%%c' to 'lua_pushfstring'\",\n                         *(e + 1));\n      }\n    }\n    n += 2;\n    fmt = e+2;\n  }\n  luaD_checkstack(L, 1);\n  pushstr(L, fmt, strlen(fmt));\n  if (n > 0) luaV_concat(L, n + 1);\n  return svalue(L->top - 1);\n}\n\n\nconst char *luaO_pushfstring (lua_State *L, const char *fmt, ...) {\n  const char *msg;\n  va_list argp;\n  va_start(argp, fmt);\n  msg = luaO_pushvfstring(L, fmt, argp);\n  va_end(argp);\n  return msg;\n}\n\n\n/* number of chars of a literal string without the ending \\0 */\n#define LL(x)\t(sizeof(x)/sizeof(char) - 1)\n\n#define RETS\t\"...\"\n#define PRE\t\"[string \\\"\"\n#define POS\t\"\\\"]\"\n\n#define addstr(a,b,l)\t( memcpy(a,b,(l) * sizeof(char)), a += (l) )\n\nvoid luaO_chunkid (char *out, const char *source, size_t bufflen) {\n  size_t l = strlen(source);\n  if (*source == '=') {  /* 'literal' source */\n    if (l <= bufflen)  /* small enough? */\n      memcpy(out, source + 1, l * sizeof(char));\n    else {  /* truncate it */\n      addstr(out, source + 1, bufflen - 1);\n      *out = '\\0';\n    }\n  }\n  else if (*source == '@') {  /* file name */\n    if (l <= bufflen)  /* small enough? */\n      memcpy(out, source + 1, l * sizeof(char));\n    else {  /* add '...' before rest of name */\n      addstr(out, RETS, LL(RETS));\n      bufflen -= LL(RETS);\n      memcpy(out, source + 1 + l - bufflen, bufflen * sizeof(char));\n    }\n  }\n  else {  /* string; format as [string \"source\"] */\n    const char *nl = strchr(source, '\\n');  /* find first new line (if any) */\n    addstr(out, PRE, LL(PRE));  /* add prefix */\n    bufflen -= LL(PRE RETS POS) + 1;  /* save space for prefix+suffix+'\\0' */\n    if (l < bufflen && nl == NULL) {  /* small one-line source? */\n      addstr(out, source, l);  /* keep it */\n    }\n    else {\n      if (nl != NULL) l = nl - source;  /* stop at first newline */\n      if (l > bufflen) l = bufflen;\n      addstr(out, source, l);\n      addstr(out, RETS, LL(RETS));\n    }\n    memcpy(out, POS, (LL(POS) + 1) * sizeof(char));\n  }\n}\n\n"
  },
  {
    "path": "externals/lua/src/lobject.h",
    "content": "/*\n** $Id: lobject.h,v 2.106 2015/01/05 13:52:37 roberto Exp $\n** Type definitions for Lua objects\n** See Copyright Notice in lua.h\n*/\n\n\n#ifndef lobject_h\n#define lobject_h\n\n\n#include <stdarg.h>\n\n\n#include \"llimits.h\"\n#include \"lua.h\"\n\n\n/*\n** Extra tags for non-values\n*/\n#define LUA_TPROTO\tLUA_NUMTAGS\n#define LUA_TDEADKEY\t(LUA_NUMTAGS+1)\n\n/*\n** number of all possible tags (including LUA_TNONE but excluding DEADKEY)\n*/\n#define LUA_TOTALTAGS\t(LUA_TPROTO + 2)\n\n\n/*\n** tags for Tagged Values have the following use of bits:\n** bits 0-3: actual tag (a LUA_T* value)\n** bits 4-5: variant bits\n** bit 6: whether value is collectable\n*/\n\n#define VARBITS\t\t(3 << 4)\n\n\n/*\n** LUA_TFUNCTION variants:\n** 0 - Lua function\n** 1 - light C function\n** 2 - regular C function (closure)\n*/\n\n/* Variant tags for functions */\n#define LUA_TLCL\t(LUA_TFUNCTION | (0 << 4))  /* Lua closure */\n#define LUA_TLCF\t(LUA_TFUNCTION | (1 << 4))  /* light C function */\n#define LUA_TCCL\t(LUA_TFUNCTION | (2 << 4))  /* C closure */\n\n\n/* Variant tags for strings */\n#define LUA_TSHRSTR\t(LUA_TSTRING | (0 << 4))  /* short strings */\n#define LUA_TLNGSTR\t(LUA_TSTRING | (1 << 4))  /* long strings */\n\n\n/* Variant tags for numbers */\n#define LUA_TNUMFLT\t(LUA_TNUMBER | (0 << 4))  /* float numbers */\n#define LUA_TNUMINT\t(LUA_TNUMBER | (1 << 4))  /* integer numbers */\n\n\n/* Bit mark for collectable types */\n#define BIT_ISCOLLECTABLE\t(1 << 6)\n\n/* mark a tag as collectable */\n#define ctb(t)\t\t\t((t) | BIT_ISCOLLECTABLE)\n\n\n/*\n** Common type for all collectable objects\n*/\ntypedef struct GCObject GCObject;\n\n\n/*\n** Common Header for all collectable objects (in macro form, to be\n** included in other objects)\n*/\n#define CommonHeader\tGCObject *next; lu_byte tt; lu_byte marked\n\n\n/*\n** Common type has only the common header\n*/\nstruct GCObject {\n  CommonHeader;\n};\n\n\n\n/*\n** Union of all Lua values\n*/\ntypedef union Value Value;\n\n\n\n\n/*\n** Tagged Values. This is the basic representation of values in Lua,\n** an actual value plus a tag with its type.\n*/\n\n#define TValuefields\tValue value_; int tt_\n\ntypedef struct lua_TValue TValue;\n\n\n/* macro defining a nil value */\n#define NILCONSTANT\t{NULL}, LUA_TNIL\n\n\n#define val_(o)\t\t((o)->value_)\n\n\n/* raw type tag of a TValue */\n#define rttype(o)\t((o)->tt_)\n\n/* tag with no variants (bits 0-3) */\n#define novariant(x)\t((x) & 0x0F)\n\n/* type tag of a TValue (bits 0-3 for tags + variant bits 4-5) */\n#define ttype(o)\t(rttype(o) & 0x3F)\n\n/* type tag of a TValue with no variants (bits 0-3) */\n#define ttnov(o)\t(novariant(rttype(o)))\n\n\n/* Macros to test type */\n#define checktag(o,t)\t\t(rttype(o) == (t))\n#define checktype(o,t)\t\t(ttnov(o) == (t))\n#define ttisnumber(o)\t\tchecktype((o), LUA_TNUMBER)\n#define ttisfloat(o)\t\tchecktag((o), LUA_TNUMFLT)\n#define ttisinteger(o)\t\tchecktag((o), LUA_TNUMINT)\n#define ttisnil(o)\t\tchecktag((o), LUA_TNIL)\n#define ttisboolean(o)\t\tchecktag((o), LUA_TBOOLEAN)\n#define ttislightuserdata(o)\tchecktag((o), LUA_TLIGHTUSERDATA)\n#define ttisstring(o)\t\tchecktype((o), LUA_TSTRING)\n#define ttisshrstring(o)\tchecktag((o), ctb(LUA_TSHRSTR))\n#define ttislngstring(o)\tchecktag((o), ctb(LUA_TLNGSTR))\n#define ttistable(o)\t\tchecktag((o), ctb(LUA_TTABLE))\n#define ttisfunction(o)\t\tchecktype(o, LUA_TFUNCTION)\n#define ttisclosure(o)\t\t((rttype(o) & 0x1F) == LUA_TFUNCTION)\n#define ttisCclosure(o)\t\tchecktag((o), ctb(LUA_TCCL))\n#define ttisLclosure(o)\t\tchecktag((o), ctb(LUA_TLCL))\n#define ttislcf(o)\t\tchecktag((o), LUA_TLCF)\n#define ttisfulluserdata(o)\tchecktag((o), ctb(LUA_TUSERDATA))\n#define ttisthread(o)\t\tchecktag((o), ctb(LUA_TTHREAD))\n#define ttisdeadkey(o)\t\tchecktag((o), LUA_TDEADKEY)\n\n\n/* Macros to access values */\n#define ivalue(o)\tcheck_exp(ttisinteger(o), val_(o).i)\n#define fltvalue(o)\tcheck_exp(ttisfloat(o), val_(o).n)\n#define nvalue(o)\tcheck_exp(ttisnumber(o), \\\n\t(ttisinteger(o) ? cast_num(ivalue(o)) : fltvalue(o)))\n#define gcvalue(o)\tcheck_exp(iscollectable(o), val_(o).gc)\n#define pvalue(o)\tcheck_exp(ttislightuserdata(o), val_(o).p)\n#define tsvalue(o)\tcheck_exp(ttisstring(o), gco2ts(val_(o).gc))\n#define uvalue(o)\tcheck_exp(ttisfulluserdata(o), gco2u(val_(o).gc))\n#define clvalue(o)\tcheck_exp(ttisclosure(o), gco2cl(val_(o).gc))\n#define clLvalue(o)\tcheck_exp(ttisLclosure(o), gco2lcl(val_(o).gc))\n#define clCvalue(o)\tcheck_exp(ttisCclosure(o), gco2ccl(val_(o).gc))\n#define fvalue(o)\tcheck_exp(ttislcf(o), val_(o).f)\n#define hvalue(o)\tcheck_exp(ttistable(o), gco2t(val_(o).gc))\n#define bvalue(o)\tcheck_exp(ttisboolean(o), val_(o).b)\n#define thvalue(o)\tcheck_exp(ttisthread(o), gco2th(val_(o).gc))\n/* a dead value may get the 'gc' field, but cannot access its contents */\n#define deadvalue(o)\tcheck_exp(ttisdeadkey(o), cast(void *, val_(o).gc))\n\n#define l_isfalse(o)\t(ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0))\n\n\n#define iscollectable(o)\t(rttype(o) & BIT_ISCOLLECTABLE)\n\n\n/* Macros for internal tests */\n#define righttt(obj)\t\t(ttype(obj) == gcvalue(obj)->tt)\n\n#define checkliveness(g,obj) \\\n\tlua_longassert(!iscollectable(obj) || \\\n\t\t\t(righttt(obj) && !isdead(g,gcvalue(obj))))\n\n\n/* Macros to set values */\n#define settt_(o,t)\t((o)->tt_=(t))\n\n#define setfltvalue(obj,x) \\\n  { TValue *io=(obj); val_(io).n=(x); settt_(io, LUA_TNUMFLT); }\n\n#define setivalue(obj,x) \\\n  { TValue *io=(obj); val_(io).i=(x); settt_(io, LUA_TNUMINT); }\n\n#define setnilvalue(obj) settt_(obj, LUA_TNIL)\n\n#define setfvalue(obj,x) \\\n  { TValue *io=(obj); val_(io).f=(x); settt_(io, LUA_TLCF); }\n\n#define setpvalue(obj,x) \\\n  { TValue *io=(obj); val_(io).p=(x); settt_(io, LUA_TLIGHTUSERDATA); }\n\n#define setbvalue(obj,x) \\\n  { TValue *io=(obj); val_(io).b=(x); settt_(io, LUA_TBOOLEAN); }\n\n#define setgcovalue(L,obj,x) \\\n  { TValue *io = (obj); GCObject *i_g=(x); \\\n    val_(io).gc = i_g; settt_(io, ctb(i_g->tt)); }\n\n#define setsvalue(L,obj,x) \\\n  { TValue *io = (obj); TString *x_ = (x); \\\n    val_(io).gc = obj2gco(x_); settt_(io, ctb(x_->tt)); \\\n    checkliveness(G(L),io); }\n\n#define setuvalue(L,obj,x) \\\n  { TValue *io = (obj); Udata *x_ = (x); \\\n    val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TUSERDATA)); \\\n    checkliveness(G(L),io); }\n\n#define setthvalue(L,obj,x) \\\n  { TValue *io = (obj); lua_State *x_ = (x); \\\n    val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTHREAD)); \\\n    checkliveness(G(L),io); }\n\n#define setclLvalue(L,obj,x) \\\n  { TValue *io = (obj); LClosure *x_ = (x); \\\n    val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TLCL)); \\\n    checkliveness(G(L),io); }\n\n#define setclCvalue(L,obj,x) \\\n  { TValue *io = (obj); CClosure *x_ = (x); \\\n    val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TCCL)); \\\n    checkliveness(G(L),io); }\n\n#define sethvalue(L,obj,x) \\\n  { TValue *io = (obj); Table *x_ = (x); \\\n    val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTABLE)); \\\n    checkliveness(G(L),io); }\n\n#define setdeadvalue(obj)\tsettt_(obj, LUA_TDEADKEY)\n\n\n\n#define setobj(L,obj1,obj2) \\\n\t{ TValue *io1=(obj1); *io1 = *(obj2); \\\n\t  (void)L; checkliveness(G(L),io1); }\n\n\n/*\n** different types of assignments, according to destination\n*/\n\n/* from stack to (same) stack */\n#define setobjs2s\tsetobj\n/* to stack (not from same stack) */\n#define setobj2s\tsetobj\n#define setsvalue2s\tsetsvalue\n#define sethvalue2s\tsethvalue\n#define setptvalue2s\tsetptvalue\n/* from table to same table */\n#define setobjt2t\tsetobj\n/* to table */\n#define setobj2t\tsetobj\n/* to new object */\n#define setobj2n\tsetobj\n#define setsvalue2n\tsetsvalue\n\n\n\n\n/*\n** {======================================================\n** types and prototypes\n** =======================================================\n*/\n\n\nunion Value {\n  GCObject *gc;    /* collectable objects */\n  void *p;         /* light userdata */\n  int b;           /* booleans */\n  lua_CFunction f; /* light C functions */\n  lua_Integer i;   /* integer numbers */\n  lua_Number n;    /* float numbers */\n};\n\n\nstruct lua_TValue {\n  TValuefields;\n};\n\n\ntypedef TValue *StkId;  /* index to stack elements */\n\n\n\n\n/*\n** Header for string value; string bytes follow the end of this structure\n** (aligned according to 'UTString'; see next).\n*/\ntypedef struct TString {\n  CommonHeader;\n  lu_byte extra;  /* reserved words for short strings; \"has hash\" for longs */\n  unsigned int hash;\n  size_t len;  /* number of characters in string */\n  struct TString *hnext;  /* linked list for hash table */\n} TString;\n\n\n/*\n** Ensures that address after this type is always fully aligned.\n*/\ntypedef union UTString {\n  L_Umaxalign dummy;  /* ensures maximum alignment for strings */\n  TString tsv;\n} UTString;\n\n\n/*\n** Get the actual string (array of bytes) from a 'TString'.\n** (Access to 'extra' ensures that value is really a 'TString'.)\n*/\n#define getaddrstr(ts)\t(cast(char *, (ts)) + sizeof(UTString))\n#define getstr(ts)  \\\n  check_exp(sizeof((ts)->extra), cast(const char*, getaddrstr(ts)))\n\n/* get the actual string (array of bytes) from a Lua value */\n#define svalue(o)       getstr(tsvalue(o))\n\n\n/*\n** Header for userdata; memory area follows the end of this structure\n** (aligned according to 'UUdata'; see next).\n*/\ntypedef struct Udata {\n  CommonHeader;\n  lu_byte ttuv_;  /* user value's tag */\n  struct Table *metatable;\n  size_t len;  /* number of bytes */\n  union Value user_;  /* user value */\n} Udata;\n\n\n/*\n** Ensures that address after this type is always fully aligned.\n*/\ntypedef union UUdata {\n  L_Umaxalign dummy;  /* ensures maximum alignment for 'local' udata */\n  Udata uv;\n} UUdata;\n\n\n/*\n**  Get the address of memory block inside 'Udata'.\n** (Access to 'ttuv_' ensures that value is really a 'Udata'.)\n*/\n#define getudatamem(u)  \\\n  check_exp(sizeof((u)->ttuv_), (cast(char*, (u)) + sizeof(UUdata)))\n\n#define setuservalue(L,u,o) \\\n\t{ const TValue *io=(o); Udata *iu = (u); \\\n\t  iu->user_ = io->value_; iu->ttuv_ = io->tt_; \\\n\t  checkliveness(G(L),io); }\n\n\n#define getuservalue(L,u,o) \\\n\t{ TValue *io=(o); const Udata *iu = (u); \\\n\t  io->value_ = iu->user_; io->tt_ = iu->ttuv_; \\\n\t  checkliveness(G(L),io); }\n\n\n/*\n** Description of an upvalue for function prototypes\n*/\ntypedef struct Upvaldesc {\n  TString *name;  /* upvalue name (for debug information) */\n  lu_byte instack;  /* whether it is in stack */\n  lu_byte idx;  /* index of upvalue (in stack or in outer function's list) */\n} Upvaldesc;\n\n\n/*\n** Description of a local variable for function prototypes\n** (used for debug information)\n*/\ntypedef struct LocVar {\n  TString *varname;\n  int startpc;  /* first point where variable is active */\n  int endpc;    /* first point where variable is dead */\n} LocVar;\n\n\n/*\n** Function Prototypes\n*/\ntypedef struct Proto {\n  CommonHeader;\n  lu_byte numparams;  /* number of fixed parameters */\n  lu_byte is_vararg;\n  lu_byte maxstacksize;  /* maximum stack used by this function */\n  int sizeupvalues;  /* size of 'upvalues' */\n  int sizek;  /* size of 'k' */\n  int sizecode;\n  int sizelineinfo;\n  int sizep;  /* size of 'p' */\n  int sizelocvars;\n  int linedefined;\n  int lastlinedefined;\n  TValue *k;  /* constants used by the function */\n  Instruction *code;\n  struct Proto **p;  /* functions defined inside the function */\n  int *lineinfo;  /* map from opcodes to source lines (debug information) */\n  LocVar *locvars;  /* information about local variables (debug information) */\n  Upvaldesc *upvalues;  /* upvalue information */\n  struct LClosure *cache;  /* last created closure with this prototype */\n  TString  *source;  /* used for debug information */\n  GCObject *gclist;\n} Proto;\n\n\n\n/*\n** Lua Upvalues\n*/\ntypedef struct UpVal UpVal;\n\n\n/*\n** Closures\n*/\n\n#define ClosureHeader \\\n\tCommonHeader; lu_byte nupvalues; GCObject *gclist\n\ntypedef struct CClosure {\n  ClosureHeader;\n  lua_CFunction f;\n  TValue upvalue[1];  /* list of upvalues */\n} CClosure;\n\n\ntypedef struct LClosure {\n  ClosureHeader;\n  struct Proto *p;\n  UpVal *upvals[1];  /* list of upvalues */\n} LClosure;\n\n\ntypedef union Closure {\n  CClosure c;\n  LClosure l;\n} Closure;\n\n\n#define isLfunction(o)\tttisLclosure(o)\n\n#define getproto(o)\t(clLvalue(o)->p)\n\n\n/*\n** Tables\n*/\n\ntypedef union TKey {\n  struct {\n    TValuefields;\n    int next;  /* for chaining (offset for next node) */\n  } nk;\n  TValue tvk;\n} TKey;\n\n\n/* copy a value into a key without messing up field 'next' */\n#define setnodekey(L,key,obj) \\\n\t{ TKey *k_=(key); const TValue *io_=(obj); \\\n\t  k_->nk.value_ = io_->value_; k_->nk.tt_ = io_->tt_; \\\n\t  (void)L; checkliveness(G(L),io_); }\n\n\ntypedef struct Node {\n  TValue i_val;\n  TKey i_key;\n} Node;\n\n\ntypedef struct Table {\n  CommonHeader;\n  lu_byte flags;  /* 1<<p means tagmethod(p) is not present */\n  lu_byte lsizenode;  /* log2 of size of 'node' array */\n  unsigned int sizearray;  /* size of 'array' array */\n  TValue *array;  /* array part */\n  Node *node;\n  Node *lastfree;  /* any free position is before this position */\n  struct Table *metatable;\n  GCObject *gclist;\n} Table;\n\n\n\n/*\n** 'module' operation for hashing (size is always a power of 2)\n*/\n#define lmod(s,size) \\\n\t(check_exp((size&(size-1))==0, (cast(int, (s) & ((size)-1)))))\n\n\n#define twoto(x)\t(1<<(x))\n#define sizenode(t)\t(twoto((t)->lsizenode))\n\n\n/*\n** (address of) a fixed nil value\n*/\n#define luaO_nilobject\t\t(&luaO_nilobject_)\n\n\nLUAI_DDEC const TValue luaO_nilobject_;\n\n/* size of buffer for 'luaO_utf8esc' function */\n#define UTF8BUFFSZ\t8\n\nLUAI_FUNC int luaO_int2fb (unsigned int x);\nLUAI_FUNC int luaO_fb2int (int x);\nLUAI_FUNC int luaO_utf8esc (char *buff, unsigned long x);\nLUAI_FUNC int luaO_ceillog2 (unsigned int x);\nLUAI_FUNC void luaO_arith (lua_State *L, int op, const TValue *p1,\n                           const TValue *p2, TValue *res);\nLUAI_FUNC size_t luaO_str2num (const char *s, TValue *o);\nLUAI_FUNC int luaO_hexavalue (int c);\nLUAI_FUNC void luaO_tostring (lua_State *L, StkId obj);\nLUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt,\n                                                       va_list argp);\nLUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...);\nLUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len);\n\n\n#endif\n\n"
  },
  {
    "path": "externals/lua/src/lopcodes.c",
    "content": "/*\n** $Id: lopcodes.c,v 1.55 2015/01/05 13:48:33 roberto Exp $\n** Opcodes for Lua virtual machine\n** See Copyright Notice in lua.h\n*/\n\n#define lopcodes_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include <stddef.h>\n\n#include \"lopcodes.h\"\n\n\n/* ORDER OP */\n\nLUAI_DDEF const char *const luaP_opnames[NUM_OPCODES+1] = {\n  \"MOVE\",\n  \"LOADK\",\n  \"LOADKX\",\n  \"LOADBOOL\",\n  \"LOADNIL\",\n  \"GETUPVAL\",\n  \"GETTABUP\",\n  \"GETTABLE\",\n  \"SETTABUP\",\n  \"SETUPVAL\",\n  \"SETTABLE\",\n  \"NEWTABLE\",\n  \"SELF\",\n  \"ADD\",\n  \"SUB\",\n  \"MUL\",\n  \"MOD\",\n  \"POW\",\n  \"DIV\",\n  \"IDIV\",\n  \"BAND\",\n  \"BOR\",\n  \"BXOR\",\n  \"SHL\",\n  \"SHR\",\n  \"UNM\",\n  \"BNOT\",\n  \"NOT\",\n  \"LEN\",\n  \"CONCAT\",\n  \"JMP\",\n  \"EQ\",\n  \"LT\",\n  \"LE\",\n  \"TEST\",\n  \"TESTSET\",\n  \"CALL\",\n  \"TAILCALL\",\n  \"RETURN\",\n  \"FORLOOP\",\n  \"FORPREP\",\n  \"TFORCALL\",\n  \"TFORLOOP\",\n  \"SETLIST\",\n  \"CLOSURE\",\n  \"VARARG\",\n  \"EXTRAARG\",\n  NULL\n};\n\n\n#define opmode(t,a,b,c,m) (((t)<<7) | ((a)<<6) | ((b)<<4) | ((c)<<2) | (m))\n\nLUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = {\n/*       T  A    B       C     mode\t\t   opcode\t*/\n  opmode(0, 1, OpArgR, OpArgN, iABC)\t\t/* OP_MOVE */\n ,opmode(0, 1, OpArgK, OpArgN, iABx)\t\t/* OP_LOADK */\n ,opmode(0, 1, OpArgN, OpArgN, iABx)\t\t/* OP_LOADKX */\n ,opmode(0, 1, OpArgU, OpArgU, iABC)\t\t/* OP_LOADBOOL */\n ,opmode(0, 1, OpArgU, OpArgN, iABC)\t\t/* OP_LOADNIL */\n ,opmode(0, 1, OpArgU, OpArgN, iABC)\t\t/* OP_GETUPVAL */\n ,opmode(0, 1, OpArgU, OpArgK, iABC)\t\t/* OP_GETTABUP */\n ,opmode(0, 1, OpArgR, OpArgK, iABC)\t\t/* OP_GETTABLE */\n ,opmode(0, 0, OpArgK, OpArgK, iABC)\t\t/* OP_SETTABUP */\n ,opmode(0, 0, OpArgU, OpArgN, iABC)\t\t/* OP_SETUPVAL */\n ,opmode(0, 0, OpArgK, OpArgK, iABC)\t\t/* OP_SETTABLE */\n ,opmode(0, 1, OpArgU, OpArgU, iABC)\t\t/* OP_NEWTABLE */\n ,opmode(0, 1, OpArgR, OpArgK, iABC)\t\t/* OP_SELF */\n ,opmode(0, 1, OpArgK, OpArgK, iABC)\t\t/* OP_ADD */\n ,opmode(0, 1, OpArgK, OpArgK, iABC)\t\t/* OP_SUB */\n ,opmode(0, 1, OpArgK, OpArgK, iABC)\t\t/* OP_MUL */\n ,opmode(0, 1, OpArgK, OpArgK, iABC)\t\t/* OP_MOD */\n ,opmode(0, 1, OpArgK, OpArgK, iABC)\t\t/* OP_POW */\n ,opmode(0, 1, OpArgK, OpArgK, iABC)\t\t/* OP_DIV */\n ,opmode(0, 1, OpArgK, OpArgK, iABC)\t\t/* OP_IDIV */\n ,opmode(0, 1, OpArgK, OpArgK, iABC)\t\t/* OP_BAND */\n ,opmode(0, 1, OpArgK, OpArgK, iABC)\t\t/* OP_BOR */\n ,opmode(0, 1, OpArgK, OpArgK, iABC)\t\t/* OP_BXOR */\n ,opmode(0, 1, OpArgK, OpArgK, iABC)\t\t/* OP_SHL */\n ,opmode(0, 1, OpArgK, OpArgK, iABC)\t\t/* OP_SHR */\n ,opmode(0, 1, OpArgR, OpArgN, iABC)\t\t/* OP_UNM */\n ,opmode(0, 1, OpArgR, OpArgN, iABC)\t\t/* OP_BNOT */\n ,opmode(0, 1, OpArgR, OpArgN, iABC)\t\t/* OP_NOT */\n ,opmode(0, 1, OpArgR, OpArgN, iABC)\t\t/* OP_LEN */\n ,opmode(0, 1, OpArgR, OpArgR, iABC)\t\t/* OP_CONCAT */\n ,opmode(0, 0, OpArgR, OpArgN, iAsBx)\t\t/* OP_JMP */\n ,opmode(1, 0, OpArgK, OpArgK, iABC)\t\t/* OP_EQ */\n ,opmode(1, 0, OpArgK, OpArgK, iABC)\t\t/* OP_LT */\n ,opmode(1, 0, OpArgK, OpArgK, iABC)\t\t/* OP_LE */\n ,opmode(1, 0, OpArgN, OpArgU, iABC)\t\t/* OP_TEST */\n ,opmode(1, 1, OpArgR, OpArgU, iABC)\t\t/* OP_TESTSET */\n ,opmode(0, 1, OpArgU, OpArgU, iABC)\t\t/* OP_CALL */\n ,opmode(0, 1, OpArgU, OpArgU, iABC)\t\t/* OP_TAILCALL */\n ,opmode(0, 0, OpArgU, OpArgN, iABC)\t\t/* OP_RETURN */\n ,opmode(0, 1, OpArgR, OpArgN, iAsBx)\t\t/* OP_FORLOOP */\n ,opmode(0, 1, OpArgR, OpArgN, iAsBx)\t\t/* OP_FORPREP */\n ,opmode(0, 0, OpArgN, OpArgU, iABC)\t\t/* OP_TFORCALL */\n ,opmode(0, 1, OpArgR, OpArgN, iAsBx)\t\t/* OP_TFORLOOP */\n ,opmode(0, 0, OpArgU, OpArgU, iABC)\t\t/* OP_SETLIST */\n ,opmode(0, 1, OpArgU, OpArgN, iABx)\t\t/* OP_CLOSURE */\n ,opmode(0, 1, OpArgU, OpArgN, iABC)\t\t/* OP_VARARG */\n ,opmode(0, 0, OpArgU, OpArgU, iAx)\t\t/* OP_EXTRAARG */\n};\n\n"
  },
  {
    "path": "externals/lua/src/lopcodes.h",
    "content": "/*\n** $Id: lopcodes.h,v 1.148 2014/10/25 11:50:46 roberto Exp $\n** Opcodes for Lua virtual machine\n** See Copyright Notice in lua.h\n*/\n\n#ifndef lopcodes_h\n#define lopcodes_h\n\n#include \"llimits.h\"\n\n\n/*===========================================================================\n  We assume that instructions are unsigned numbers.\n  All instructions have an opcode in the first 6 bits.\n  Instructions can have the following fields:\n\t'A' : 8 bits\n\t'B' : 9 bits\n\t'C' : 9 bits\n\t'Ax' : 26 bits ('A', 'B', and 'C' together)\n\t'Bx' : 18 bits ('B' and 'C' together)\n\t'sBx' : signed Bx\n\n  A signed argument is represented in excess K; that is, the number\n  value is the unsigned value minus K. K is exactly the maximum value\n  for that argument (so that -max is represented by 0, and +max is\n  represented by 2*max), which is half the maximum for the corresponding\n  unsigned argument.\n===========================================================================*/\n\n\nenum OpMode {iABC, iABx, iAsBx, iAx};  /* basic instruction format */\n\n\n/*\n** size and position of opcode arguments.\n*/\n#define SIZE_C\t\t9\n#define SIZE_B\t\t9\n#define SIZE_Bx\t\t(SIZE_C + SIZE_B)\n#define SIZE_A\t\t8\n#define SIZE_Ax\t\t(SIZE_C + SIZE_B + SIZE_A)\n\n#define SIZE_OP\t\t6\n\n#define POS_OP\t\t0\n#define POS_A\t\t(POS_OP + SIZE_OP)\n#define POS_C\t\t(POS_A + SIZE_A)\n#define POS_B\t\t(POS_C + SIZE_C)\n#define POS_Bx\t\tPOS_C\n#define POS_Ax\t\tPOS_A\n\n\n/*\n** limits for opcode arguments.\n** we use (signed) int to manipulate most arguments,\n** so they must fit in LUAI_BITSINT-1 bits (-1 for sign)\n*/\n#if SIZE_Bx < LUAI_BITSINT-1\n#define MAXARG_Bx        ((1<<SIZE_Bx)-1)\n#define MAXARG_sBx        (MAXARG_Bx>>1)         /* 'sBx' is signed */\n#else\n#define MAXARG_Bx        MAX_INT\n#define MAXARG_sBx        MAX_INT\n#endif\n\n#if SIZE_Ax < LUAI_BITSINT-1\n#define MAXARG_Ax\t((1<<SIZE_Ax)-1)\n#else\n#define MAXARG_Ax\tMAX_INT\n#endif\n\n\n#define MAXARG_A        ((1<<SIZE_A)-1)\n#define MAXARG_B        ((1<<SIZE_B)-1)\n#define MAXARG_C        ((1<<SIZE_C)-1)\n\n\n/* creates a mask with 'n' 1 bits at position 'p' */\n#define MASK1(n,p)\t((~((~(Instruction)0)<<(n)))<<(p))\n\n/* creates a mask with 'n' 0 bits at position 'p' */\n#define MASK0(n,p)\t(~MASK1(n,p))\n\n/*\n** the following macros help to manipulate instructions\n*/\n\n#define GET_OPCODE(i)\t(cast(OpCode, ((i)>>POS_OP) & MASK1(SIZE_OP,0)))\n#define SET_OPCODE(i,o)\t((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \\\n\t\t((cast(Instruction, o)<<POS_OP)&MASK1(SIZE_OP,POS_OP))))\n\n#define getarg(i,pos,size)\t(cast(int, ((i)>>pos) & MASK1(size,0)))\n#define setarg(i,v,pos,size)\t((i) = (((i)&MASK0(size,pos)) | \\\n                ((cast(Instruction, v)<<pos)&MASK1(size,pos))))\n\n#define GETARG_A(i)\tgetarg(i, POS_A, SIZE_A)\n#define SETARG_A(i,v)\tsetarg(i, v, POS_A, SIZE_A)\n\n#define GETARG_B(i)\tgetarg(i, POS_B, SIZE_B)\n#define SETARG_B(i,v)\tsetarg(i, v, POS_B, SIZE_B)\n\n#define GETARG_C(i)\tgetarg(i, POS_C, SIZE_C)\n#define SETARG_C(i,v)\tsetarg(i, v, POS_C, SIZE_C)\n\n#define GETARG_Bx(i)\tgetarg(i, POS_Bx, SIZE_Bx)\n#define SETARG_Bx(i,v)\tsetarg(i, v, POS_Bx, SIZE_Bx)\n\n#define GETARG_Ax(i)\tgetarg(i, POS_Ax, SIZE_Ax)\n#define SETARG_Ax(i,v)\tsetarg(i, v, POS_Ax, SIZE_Ax)\n\n#define GETARG_sBx(i)\t(GETARG_Bx(i)-MAXARG_sBx)\n#define SETARG_sBx(i,b)\tSETARG_Bx((i),cast(unsigned int, (b)+MAXARG_sBx))\n\n\n#define CREATE_ABC(o,a,b,c)\t((cast(Instruction, o)<<POS_OP) \\\n\t\t\t| (cast(Instruction, a)<<POS_A) \\\n\t\t\t| (cast(Instruction, b)<<POS_B) \\\n\t\t\t| (cast(Instruction, c)<<POS_C))\n\n#define CREATE_ABx(o,a,bc)\t((cast(Instruction, o)<<POS_OP) \\\n\t\t\t| (cast(Instruction, a)<<POS_A) \\\n\t\t\t| (cast(Instruction, bc)<<POS_Bx))\n\n#define CREATE_Ax(o,a)\t\t((cast(Instruction, o)<<POS_OP) \\\n\t\t\t| (cast(Instruction, a)<<POS_Ax))\n\n\n/*\n** Macros to operate RK indices\n*/\n\n/* this bit 1 means constant (0 means register) */\n#define BITRK\t\t(1 << (SIZE_B - 1))\n\n/* test whether value is a constant */\n#define ISK(x)\t\t((x) & BITRK)\n\n/* gets the index of the constant */\n#define INDEXK(r)\t((int)(r) & ~BITRK)\n\n#define MAXINDEXRK\t(BITRK - 1)\n\n/* code a constant index as a RK value */\n#define RKASK(x)\t((x) | BITRK)\n\n\n/*\n** invalid register that fits in 8 bits\n*/\n#define NO_REG\t\tMAXARG_A\n\n\n/*\n** R(x) - register\n** Kst(x) - constant (in constant table)\n** RK(x) == if ISK(x) then Kst(INDEXK(x)) else R(x)\n*/\n\n\n/*\n** grep \"ORDER OP\" if you change these enums\n*/\n\ntypedef enum {\n/*----------------------------------------------------------------------\nname\t\targs\tdescription\n------------------------------------------------------------------------*/\nOP_MOVE,/*\tA B\tR(A) := R(B)\t\t\t\t\t*/\nOP_LOADK,/*\tA Bx\tR(A) := Kst(Bx)\t\t\t\t\t*/\nOP_LOADKX,/*\tA \tR(A) := Kst(extra arg)\t\t\t\t*/\nOP_LOADBOOL,/*\tA B C\tR(A) := (Bool)B; if (C) pc++\t\t\t*/\nOP_LOADNIL,/*\tA B\tR(A), R(A+1), ..., R(A+B) := nil\t\t*/\nOP_GETUPVAL,/*\tA B\tR(A) := UpValue[B]\t\t\t\t*/\n\nOP_GETTABUP,/*\tA B C\tR(A) := UpValue[B][RK(C)]\t\t\t*/\nOP_GETTABLE,/*\tA B C\tR(A) := R(B)[RK(C)]\t\t\t\t*/\n\nOP_SETTABUP,/*\tA B C\tUpValue[A][RK(B)] := RK(C)\t\t\t*/\nOP_SETUPVAL,/*\tA B\tUpValue[B] := R(A)\t\t\t\t*/\nOP_SETTABLE,/*\tA B C\tR(A)[RK(B)] := RK(C)\t\t\t\t*/\n\nOP_NEWTABLE,/*\tA B C\tR(A) := {} (size = B,C)\t\t\t\t*/\n\nOP_SELF,/*\tA B C\tR(A+1) := R(B); R(A) := R(B)[RK(C)]\t\t*/\n\nOP_ADD,/*\tA B C\tR(A) := RK(B) + RK(C)\t\t\t\t*/\nOP_SUB,/*\tA B C\tR(A) := RK(B) - RK(C)\t\t\t\t*/\nOP_MUL,/*\tA B C\tR(A) := RK(B) * RK(C)\t\t\t\t*/\nOP_MOD,/*\tA B C\tR(A) := RK(B) % RK(C)\t\t\t\t*/\nOP_POW,/*\tA B C\tR(A) := RK(B) ^ RK(C)\t\t\t\t*/\nOP_DIV,/*\tA B C\tR(A) := RK(B) / RK(C)\t\t\t\t*/\nOP_IDIV,/*\tA B C\tR(A) := RK(B) // RK(C)\t\t\t\t*/\nOP_BAND,/*\tA B C\tR(A) := RK(B) & RK(C)\t\t\t\t*/\nOP_BOR,/*\tA B C\tR(A) := RK(B) | RK(C)\t\t\t\t*/\nOP_BXOR,/*\tA B C\tR(A) := RK(B) ~ RK(C)\t\t\t\t*/\nOP_SHL,/*\tA B C\tR(A) := RK(B) << RK(C)\t\t\t\t*/\nOP_SHR,/*\tA B C\tR(A) := RK(B) >> RK(C)\t\t\t\t*/\nOP_UNM,/*\tA B\tR(A) := -R(B)\t\t\t\t\t*/\nOP_BNOT,/*\tA B\tR(A) := ~R(B)\t\t\t\t\t*/\nOP_NOT,/*\tA B\tR(A) := not R(B)\t\t\t\t*/\nOP_LEN,/*\tA B\tR(A) := length of R(B)\t\t\t\t*/\n\nOP_CONCAT,/*\tA B C\tR(A) := R(B).. ... ..R(C)\t\t\t*/\n\nOP_JMP,/*\tA sBx\tpc+=sBx; if (A) close all upvalues >= R(A - 1)\t*/\nOP_EQ,/*\tA B C\tif ((RK(B) == RK(C)) ~= A) then pc++\t\t*/\nOP_LT,/*\tA B C\tif ((RK(B) <  RK(C)) ~= A) then pc++\t\t*/\nOP_LE,/*\tA B C\tif ((RK(B) <= RK(C)) ~= A) then pc++\t\t*/\n\nOP_TEST,/*\tA C\tif not (R(A) <=> C) then pc++\t\t\t*/\nOP_TESTSET,/*\tA B C\tif (R(B) <=> C) then R(A) := R(B) else pc++\t*/\n\nOP_CALL,/*\tA B C\tR(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */\nOP_TAILCALL,/*\tA B C\treturn R(A)(R(A+1), ... ,R(A+B-1))\t\t*/\nOP_RETURN,/*\tA B\treturn R(A), ... ,R(A+B-2)\t(see note)\t*/\n\nOP_FORLOOP,/*\tA sBx\tR(A)+=R(A+2);\n\t\t\tif R(A) <?= R(A+1) then { pc+=sBx; R(A+3)=R(A) }*/\nOP_FORPREP,/*\tA sBx\tR(A)-=R(A+2); pc+=sBx\t\t\t\t*/\n\nOP_TFORCALL,/*\tA C\tR(A+3), ... ,R(A+2+C) := R(A)(R(A+1), R(A+2));\t*/\nOP_TFORLOOP,/*\tA sBx\tif R(A+1) ~= nil then { R(A)=R(A+1); pc += sBx }*/\n\nOP_SETLIST,/*\tA B C\tR(A)[(C-1)*FPF+i] := R(A+i), 1 <= i <= B\t*/\n\nOP_CLOSURE,/*\tA Bx\tR(A) := closure(KPROTO[Bx])\t\t\t*/\n\nOP_VARARG,/*\tA B\tR(A), R(A+1), ..., R(A+B-2) = vararg\t\t*/\n\nOP_EXTRAARG/*\tAx\textra (larger) argument for previous opcode\t*/\n} OpCode;\n\n\n#define NUM_OPCODES\t(cast(int, OP_EXTRAARG) + 1)\n\n\n\n/*===========================================================================\n  Notes:\n  (*) In OP_CALL, if (B == 0) then B = top. If (C == 0), then 'top' is\n  set to last_result+1, so next open instruction (OP_CALL, OP_RETURN,\n  OP_SETLIST) may use 'top'.\n\n  (*) In OP_VARARG, if (B == 0) then use actual number of varargs and\n  set top (like in OP_CALL with C == 0).\n\n  (*) In OP_RETURN, if (B == 0) then return up to 'top'.\n\n  (*) In OP_SETLIST, if (B == 0) then B = 'top'; if (C == 0) then next\n  'instruction' is EXTRAARG(real C).\n\n  (*) In OP_LOADKX, the next 'instruction' is always EXTRAARG.\n\n  (*) For comparisons, A specifies what condition the test should accept\n  (true or false).\n\n  (*) All 'skips' (pc++) assume that next instruction is a jump.\n\n===========================================================================*/\n\n\n/*\n** masks for instruction properties. The format is:\n** bits 0-1: op mode\n** bits 2-3: C arg mode\n** bits 4-5: B arg mode\n** bit 6: instruction set register A\n** bit 7: operator is a test (next instruction must be a jump)\n*/\n\nenum OpArgMask {\n  OpArgN,  /* argument is not used */\n  OpArgU,  /* argument is used */\n  OpArgR,  /* argument is a register or a jump offset */\n  OpArgK   /* argument is a constant or register/constant */\n};\n\nLUAI_DDEC const lu_byte luaP_opmodes[NUM_OPCODES];\n\n#define getOpMode(m)\t(cast(enum OpMode, luaP_opmodes[m] & 3))\n#define getBMode(m)\t(cast(enum OpArgMask, (luaP_opmodes[m] >> 4) & 3))\n#define getCMode(m)\t(cast(enum OpArgMask, (luaP_opmodes[m] >> 2) & 3))\n#define testAMode(m)\t(luaP_opmodes[m] & (1 << 6))\n#define testTMode(m)\t(luaP_opmodes[m] & (1 << 7))\n\n\nLUAI_DDEC const char *const luaP_opnames[NUM_OPCODES+1];  /* opcode names */\n\n\n/* number of list items to accumulate before a SETLIST instruction */\n#define LFIELDS_PER_FLUSH\t50\n\n\n#endif\n"
  },
  {
    "path": "externals/lua/src/loslib.c",
    "content": "/*\n** $Id: loslib.c,v 1.54 2014/12/26 14:46:07 roberto Exp $\n** Standard Operating System library\n** See Copyright Notice in lua.h\n*/\n\n#define loslib_c\n#define LUA_LIB\n\n#include \"lprefix.h\"\n\n\n#include <errno.h>\n#include <locale.h>\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n\n#include \"lua.h\"\n\n#include \"lauxlib.h\"\n#include \"lualib.h\"\n\n\n#if !defined(LUA_STRFTIMEOPTIONS)\t/* { */\n/*\n** list of valid conversion specifiers for the 'strftime' function\n*/\n\n#if defined(LUA_USE_C89)\n#define LUA_STRFTIMEOPTIONS\t{ \"aAbBcdHIjmMpSUwWxXyYz%\", \"\" }\n#else  /* C99 specification */\n#define LUA_STRFTIMEOPTIONS \\\n\t{ \"aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ%\", \"\", \\\n\t  \"E\", \"cCxXyY\",  \\\n\t  \"O\", \"deHImMSuUVwWy\" }\n#endif\n\n#endif\t\t\t\t\t/* } */\n\n\n\n#if !defined(l_time_t)\t\t/* { */\n/*\n** type to represent time_t in Lua\n*/\n#define l_timet\t\t\tlua_Integer\n#define l_pushtime(L,t)\t\tlua_pushinteger(L,(lua_Integer)(t))\n#define l_checktime(L,a)\t((time_t)luaL_checkinteger(L,a))\n\n#endif\t\t\t\t/* } */\n\n\n\n#if !defined(lua_tmpnam)\t/* { */\n/*\n** By default, Lua uses tmpnam except when POSIX is available, where it\n** uses mkstemp.\n*/\n\n#if defined(LUA_USE_POSIX)\t/* { */\n\n#include <unistd.h>\n\n#define LUA_TMPNAMBUFSIZE\t32\n\n#if !defined(LUA_TMPNAMTEMPLATE)\n#define LUA_TMPNAMTEMPLATE\t\"/tmp/lua_XXXXXX\"\n#endif\n\n#define lua_tmpnam(b,e) { \\\n        strcpy(b, LUA_TMPNAMTEMPLATE); \\\n        e = mkstemp(b); \\\n        if (e != -1) close(e); \\\n        e = (e == -1); }\n\n#else\t\t\t\t/* }{ */\n\n/* ISO C definitions */\n#define LUA_TMPNAMBUFSIZE\tL_tmpnam\n#define lua_tmpnam(b,e)\t\t{ e = (tmpnam(b) == NULL); }\n\n#endif\t\t\t\t/* } */\n\n#endif\t\t\t\t/* } */\n\n\n\n#if !defined(l_gmtime)\t\t/* { */\n/*\n** By default, Lua uses gmtime/localtime, except when POSIX is available,\n** where it uses gmtime_r/localtime_r\n*/\n\n#if defined(LUA_USE_POSIX)\t/* { */\n\n#define l_gmtime(t,r)\t\tgmtime_r(t,r)\n#define l_localtime(t,r)\tlocaltime_r(t,r)\n\n#else\t\t\t\t/* }{ */\n\n/* ISO C definitions */\n#define l_gmtime(t,r)\t\t((void)(r)->tm_sec, gmtime(t))\n#define l_localtime(t,r)  \t((void)(r)->tm_sec, localtime(t))\n\n#endif\t\t\t\t/* } */\n\n#endif\t\t\t\t/* } */\n\n\n\nstatic int os_execute (lua_State *L) {\n  const char *cmd = luaL_optstring(L, 1, NULL);\n  int stat = system(cmd);\n  if (cmd != NULL)\n    return luaL_execresult(L, stat);\n  else {\n    lua_pushboolean(L, stat);  /* true if there is a shell */\n    return 1;\n  }\n}\n\n\nstatic int os_remove (lua_State *L) {\n  const char *filename = luaL_checkstring(L, 1);\n  return luaL_fileresult(L, remove(filename) == 0, filename);\n}\n\n\nstatic int os_rename (lua_State *L) {\n  const char *fromname = luaL_checkstring(L, 1);\n  const char *toname = luaL_checkstring(L, 2);\n  return luaL_fileresult(L, rename(fromname, toname) == 0, NULL);\n}\n\n\nstatic int os_tmpname (lua_State *L) {\n  char buff[LUA_TMPNAMBUFSIZE];\n  int err;\n  lua_tmpnam(buff, err);\n  if (err)\n    return luaL_error(L, \"unable to generate a unique filename\");\n  lua_pushstring(L, buff);\n  return 1;\n}\n\n\nstatic int os_getenv (lua_State *L) {\n  lua_pushstring(L, getenv(luaL_checkstring(L, 1)));  /* if NULL push nil */\n  return 1;\n}\n\n\nstatic int os_clock (lua_State *L) {\n  lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC);\n  return 1;\n}\n\n\n/*\n** {======================================================\n** Time/Date operations\n** { year=%Y, month=%m, day=%d, hour=%H, min=%M, sec=%S,\n**   wday=%w+1, yday=%j, isdst=? }\n** =======================================================\n*/\n\nstatic void setfield (lua_State *L, const char *key, int value) {\n  lua_pushinteger(L, value);\n  lua_setfield(L, -2, key);\n}\n\nstatic void setboolfield (lua_State *L, const char *key, int value) {\n  if (value < 0)  /* undefined? */\n    return;  /* does not set field */\n  lua_pushboolean(L, value);\n  lua_setfield(L, -2, key);\n}\n\nstatic int getboolfield (lua_State *L, const char *key) {\n  int res;\n  res = (lua_getfield(L, -1, key) == LUA_TNIL) ? -1 : lua_toboolean(L, -1);\n  lua_pop(L, 1);\n  return res;\n}\n\n\nstatic int getfield (lua_State *L, const char *key, int d) {\n  int res, isnum;\n  lua_getfield(L, -1, key);\n  res = (int)lua_tointegerx(L, -1, &isnum);\n  if (!isnum) {\n    if (d < 0)\n      return luaL_error(L, \"field '%s' missing in date table\", key);\n    res = d;\n  }\n  lua_pop(L, 1);\n  return res;\n}\n\n\nstatic const char *checkoption (lua_State *L, const char *conv, char *buff) {\n  static const char *const options[] = LUA_STRFTIMEOPTIONS;\n  unsigned int i;\n  for (i = 0; i < sizeof(options)/sizeof(options[0]); i += 2) {\n    if (*conv != '\\0' && strchr(options[i], *conv) != NULL) {\n      buff[1] = *conv;\n      if (*options[i + 1] == '\\0') {  /* one-char conversion specifier? */\n        buff[2] = '\\0';  /* end buffer */\n        return conv + 1;\n      }\n      else if (*(conv + 1) != '\\0' &&\n               strchr(options[i + 1], *(conv + 1)) != NULL) {\n        buff[2] = *(conv + 1);  /* valid two-char conversion specifier */\n        buff[3] = '\\0';  /* end buffer */\n        return conv + 2;\n      }\n    }\n  }\n  luaL_argerror(L, 1,\n    lua_pushfstring(L, \"invalid conversion specifier '%%%s'\", conv));\n  return conv;  /* to avoid warnings */\n}\n\n\nstatic int os_date (lua_State *L) {\n  const char *s = luaL_optstring(L, 1, \"%c\");\n  time_t t = luaL_opt(L, l_checktime, 2, time(NULL));\n  struct tm tmr, *stm;\n  if (*s == '!') {  /* UTC? */\n    stm = l_gmtime(&t, &tmr);\n    s++;  /* skip '!' */\n  }\n  else\n    stm = l_localtime(&t, &tmr);\n  if (stm == NULL)  /* invalid date? */\n    lua_pushnil(L);\n  else if (strcmp(s, \"*t\") == 0) {\n    lua_createtable(L, 0, 9);  /* 9 = number of fields */\n    setfield(L, \"sec\", stm->tm_sec);\n    setfield(L, \"min\", stm->tm_min);\n    setfield(L, \"hour\", stm->tm_hour);\n    setfield(L, \"day\", stm->tm_mday);\n    setfield(L, \"month\", stm->tm_mon+1);\n    setfield(L, \"year\", stm->tm_year+1900);\n    setfield(L, \"wday\", stm->tm_wday+1);\n    setfield(L, \"yday\", stm->tm_yday+1);\n    setboolfield(L, \"isdst\", stm->tm_isdst);\n  }\n  else {\n    char cc[4];\n    luaL_Buffer b;\n    cc[0] = '%';\n    luaL_buffinit(L, &b);\n    while (*s) {\n      if (*s != '%')  /* no conversion specifier? */\n        luaL_addchar(&b, *s++);\n      else {\n        size_t reslen;\n        char buff[200];  /* should be big enough for any conversion result */\n        s = checkoption(L, s + 1, cc);\n        reslen = strftime(buff, sizeof(buff), cc, stm);\n        luaL_addlstring(&b, buff, reslen);\n      }\n    }\n    luaL_pushresult(&b);\n  }\n  return 1;\n}\n\n\nstatic int os_time (lua_State *L) {\n  time_t t;\n  if (lua_isnoneornil(L, 1))  /* called without args? */\n    t = time(NULL);  /* get current time */\n  else {\n    struct tm ts;\n    luaL_checktype(L, 1, LUA_TTABLE);\n    lua_settop(L, 1);  /* make sure table is at the top */\n    ts.tm_sec = getfield(L, \"sec\", 0);\n    ts.tm_min = getfield(L, \"min\", 0);\n    ts.tm_hour = getfield(L, \"hour\", 12);\n    ts.tm_mday = getfield(L, \"day\", -1);\n    ts.tm_mon = getfield(L, \"month\", -1) - 1;\n    ts.tm_year = getfield(L, \"year\", -1) - 1900;\n    ts.tm_isdst = getboolfield(L, \"isdst\");\n    t = mktime(&ts);\n  }\n  if (t != (time_t)(l_timet)t)\n    luaL_error(L, \"time result cannot be represented in this Lua instalation\");\n  else if (t == (time_t)(-1))\n    lua_pushnil(L);\n  else\n    l_pushtime(L, t);\n  return 1;\n}\n\n\nstatic int os_difftime (lua_State *L) {\n  double res = difftime((l_checktime(L, 1)), (l_checktime(L, 2)));\n  lua_pushnumber(L, (lua_Number)res);\n  return 1;\n}\n\n/* }====================================================== */\n\n\nstatic int os_setlocale (lua_State *L) {\n  static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY,\n                      LC_NUMERIC, LC_TIME};\n  static const char *const catnames[] = {\"all\", \"collate\", \"ctype\", \"monetary\",\n     \"numeric\", \"time\", NULL};\n  const char *l = luaL_optstring(L, 1, NULL);\n  int op = luaL_checkoption(L, 2, \"all\", catnames);\n  lua_pushstring(L, setlocale(cat[op], l));\n  return 1;\n}\n\n\nstatic int os_exit (lua_State *L) {\n  int status;\n  if (lua_isboolean(L, 1))\n    status = (lua_toboolean(L, 1) ? EXIT_SUCCESS : EXIT_FAILURE);\n  else\n    status = (int)luaL_optinteger(L, 1, EXIT_SUCCESS);\n  if (lua_toboolean(L, 2))\n    lua_close(L);\n  if (L) exit(status);  /* 'if' to avoid warnings for unreachable 'return' */\n  return 0;\n}\n\n\nstatic const luaL_Reg syslib[] = {\n  {\"clock\",     os_clock},\n  {\"date\",      os_date},\n  {\"difftime\",  os_difftime},\n  {\"execute\",   os_execute},\n  {\"exit\",      os_exit},\n  {\"getenv\",    os_getenv},\n  {\"remove\",    os_remove},\n  {\"rename\",    os_rename},\n  {\"setlocale\", os_setlocale},\n  {\"time\",      os_time},\n  {\"tmpname\",   os_tmpname},\n  {NULL, NULL}\n};\n\n/* }====================================================== */\n\n\n\nLUAMOD_API int luaopen_os (lua_State *L) {\n  luaL_newlib(L, syslib);\n  return 1;\n}\n\n"
  },
  {
    "path": "externals/lua/src/lparser.c",
    "content": "/*\n** $Id: lparser.c,v 2.147 2014/12/27 20:31:43 roberto Exp $\n** Lua Parser\n** See Copyright Notice in lua.h\n*/\n\n#define lparser_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"lcode.h\"\n#include \"ldebug.h\"\n#include \"ldo.h\"\n#include \"lfunc.h\"\n#include \"llex.h\"\n#include \"lmem.h\"\n#include \"lobject.h\"\n#include \"lopcodes.h\"\n#include \"lparser.h\"\n#include \"lstate.h\"\n#include \"lstring.h\"\n#include \"ltable.h\"\n\n\n\n/* maximum number of local variables per function (must be smaller\n   than 250, due to the bytecode format) */\n#define MAXVARS\t\t200\n\n\n#define hasmultret(k)\t\t((k) == VCALL || (k) == VVARARG)\n\n\n/* because all strings are unified by the scanner, the parser\n   can use pointer equality for string equality */\n#define eqstr(a,b)\t((a) == (b))\n\n\n/*\n** nodes for block list (list of active blocks)\n*/\ntypedef struct BlockCnt {\n  struct BlockCnt *previous;  /* chain */\n  int firstlabel;  /* index of first label in this block */\n  int firstgoto;  /* index of first pending goto in this block */\n  lu_byte nactvar;  /* # active locals outside the block */\n  lu_byte upval;  /* true if some variable in the block is an upvalue */\n  lu_byte isloop;  /* true if 'block' is a loop */\n} BlockCnt;\n\n\n\n/*\n** prototypes for recursive non-terminal functions\n*/\nstatic void statement (LexState *ls);\nstatic void expr (LexState *ls, expdesc *v);\n\n\n/* semantic error */\nstatic l_noret semerror (LexState *ls, const char *msg) {\n  ls->t.token = 0;  /* remove \"near <token>\" from final message */\n  luaX_syntaxerror(ls, msg);\n}\n\n\nstatic l_noret error_expected (LexState *ls, int token) {\n  luaX_syntaxerror(ls,\n      luaO_pushfstring(ls->L, \"%s expected\", luaX_token2str(ls, token)));\n}\n\n\nstatic l_noret errorlimit (FuncState *fs, int limit, const char *what) {\n  lua_State *L = fs->ls->L;\n  const char *msg;\n  int line = fs->f->linedefined;\n  const char *where = (line == 0)\n                      ? \"main function\"\n                      : luaO_pushfstring(L, \"function at line %d\", line);\n  msg = luaO_pushfstring(L, \"too many %s (limit is %d) in %s\",\n                             what, limit, where);\n  luaX_syntaxerror(fs->ls, msg);\n}\n\n\nstatic void checklimit (FuncState *fs, int v, int l, const char *what) {\n  if (v > l) errorlimit(fs, l, what);\n}\n\n\nstatic int testnext (LexState *ls, int c) {\n  if (ls->t.token == c) {\n    luaX_next(ls);\n    return 1;\n  }\n  else return 0;\n}\n\n\nstatic void check (LexState *ls, int c) {\n  if (ls->t.token != c)\n    error_expected(ls, c);\n}\n\n\nstatic void checknext (LexState *ls, int c) {\n  check(ls, c);\n  luaX_next(ls);\n}\n\n\n#define check_condition(ls,c,msg)\t{ if (!(c)) luaX_syntaxerror(ls, msg); }\n\n\n\nstatic void check_match (LexState *ls, int what, int who, int where) {\n  if (!testnext(ls, what)) {\n    if (where == ls->linenumber)\n      error_expected(ls, what);\n    else {\n      luaX_syntaxerror(ls, luaO_pushfstring(ls->L,\n             \"%s expected (to close %s at line %d)\",\n              luaX_token2str(ls, what), luaX_token2str(ls, who), where));\n    }\n  }\n}\n\n\nstatic TString *str_checkname (LexState *ls) {\n  TString *ts;\n  check(ls, TK_NAME);\n  ts = ls->t.seminfo.ts;\n  luaX_next(ls);\n  return ts;\n}\n\n\nstatic void init_exp (expdesc *e, expkind k, int i) {\n  e->f = e->t = NO_JUMP;\n  e->k = k;\n  e->u.info = i;\n}\n\n\nstatic void codestring (LexState *ls, expdesc *e, TString *s) {\n  init_exp(e, VK, luaK_stringK(ls->fs, s));\n}\n\n\nstatic void checkname (LexState *ls, expdesc *e) {\n  codestring(ls, e, str_checkname(ls));\n}\n\n\nstatic int registerlocalvar (LexState *ls, TString *varname) {\n  FuncState *fs = ls->fs;\n  Proto *f = fs->f;\n  int oldsize = f->sizelocvars;\n  luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars,\n                  LocVar, SHRT_MAX, \"local variables\");\n  while (oldsize < f->sizelocvars) f->locvars[oldsize++].varname = NULL;\n  f->locvars[fs->nlocvars].varname = varname;\n  luaC_objbarrier(ls->L, f, varname);\n  return fs->nlocvars++;\n}\n\n\nstatic void new_localvar (LexState *ls, TString *name) {\n  FuncState *fs = ls->fs;\n  Dyndata *dyd = ls->dyd;\n  int reg = registerlocalvar(ls, name);\n  checklimit(fs, dyd->actvar.n + 1 - fs->firstlocal,\n                  MAXVARS, \"local variables\");\n  luaM_growvector(ls->L, dyd->actvar.arr, dyd->actvar.n + 1,\n                  dyd->actvar.size, Vardesc, MAX_INT, \"local variables\");\n  dyd->actvar.arr[dyd->actvar.n++].idx = cast(short, reg);\n}\n\n\nstatic void new_localvarliteral_ (LexState *ls, const char *name, size_t sz) {\n  new_localvar(ls, luaX_newstring(ls, name, sz));\n}\n\n#define new_localvarliteral(ls,v) \\\n\tnew_localvarliteral_(ls, \"\" v, (sizeof(v)/sizeof(char))-1)\n\n\nstatic LocVar *getlocvar (FuncState *fs, int i) {\n  int idx = fs->ls->dyd->actvar.arr[fs->firstlocal + i].idx;\n  lua_assert(idx < fs->nlocvars);\n  return &fs->f->locvars[idx];\n}\n\n\nstatic void adjustlocalvars (LexState *ls, int nvars) {\n  FuncState *fs = ls->fs;\n  fs->nactvar = cast_byte(fs->nactvar + nvars);\n  for (; nvars; nvars--) {\n    getlocvar(fs, fs->nactvar - nvars)->startpc = fs->pc;\n  }\n}\n\n\nstatic void removevars (FuncState *fs, int tolevel) {\n  fs->ls->dyd->actvar.n -= (fs->nactvar - tolevel);\n  while (fs->nactvar > tolevel)\n    getlocvar(fs, --fs->nactvar)->endpc = fs->pc;\n}\n\n\nstatic int searchupvalue (FuncState *fs, TString *name) {\n  int i;\n  Upvaldesc *up = fs->f->upvalues;\n  for (i = 0; i < fs->nups; i++) {\n    if (eqstr(up[i].name, name)) return i;\n  }\n  return -1;  /* not found */\n}\n\n\nstatic int newupvalue (FuncState *fs, TString *name, expdesc *v) {\n  Proto *f = fs->f;\n  int oldsize = f->sizeupvalues;\n  checklimit(fs, fs->nups + 1, MAXUPVAL, \"upvalues\");\n  luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues,\n                  Upvaldesc, MAXUPVAL, \"upvalues\");\n  while (oldsize < f->sizeupvalues) f->upvalues[oldsize++].name = NULL;\n  f->upvalues[fs->nups].instack = (v->k == VLOCAL);\n  f->upvalues[fs->nups].idx = cast_byte(v->u.info);\n  f->upvalues[fs->nups].name = name;\n  luaC_objbarrier(fs->ls->L, f, name);\n  return fs->nups++;\n}\n\n\nstatic int searchvar (FuncState *fs, TString *n) {\n  int i;\n  for (i = cast_int(fs->nactvar) - 1; i >= 0; i--) {\n    if (eqstr(n, getlocvar(fs, i)->varname))\n      return i;\n  }\n  return -1;  /* not found */\n}\n\n\n/*\n  Mark block where variable at given level was defined\n  (to emit close instructions later).\n*/\nstatic void markupval (FuncState *fs, int level) {\n  BlockCnt *bl = fs->bl;\n  while (bl->nactvar > level) bl = bl->previous;\n  bl->upval = 1;\n}\n\n\n/*\n  Find variable with given name 'n'. If it is an upvalue, add this\n  upvalue into all intermediate functions.\n*/\nstatic int singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) {\n  if (fs == NULL)  /* no more levels? */\n    return VVOID;  /* default is global */\n  else {\n    int v = searchvar(fs, n);  /* look up locals at current level */\n    if (v >= 0) {  /* found? */\n      init_exp(var, VLOCAL, v);  /* variable is local */\n      if (!base)\n        markupval(fs, v);  /* local will be used as an upval */\n      return VLOCAL;\n    }\n    else {  /* not found as local at current level; try upvalues */\n      int idx = searchupvalue(fs, n);  /* try existing upvalues */\n      if (idx < 0) {  /* not found? */\n        if (singlevaraux(fs->prev, n, var, 0) == VVOID) /* try upper levels */\n          return VVOID;  /* not found; is a global */\n        /* else was LOCAL or UPVAL */\n        idx  = newupvalue(fs, n, var);  /* will be a new upvalue */\n      }\n      init_exp(var, VUPVAL, idx);\n      return VUPVAL;\n    }\n  }\n}\n\n\nstatic void singlevar (LexState *ls, expdesc *var) {\n  TString *varname = str_checkname(ls);\n  FuncState *fs = ls->fs;\n  if (singlevaraux(fs, varname, var, 1) == VVOID) {  /* global name? */\n    expdesc key;\n    singlevaraux(fs, ls->envn, var, 1);  /* get environment variable */\n    lua_assert(var->k == VLOCAL || var->k == VUPVAL);\n    codestring(ls, &key, varname);  /* key is variable name */\n    luaK_indexed(fs, var, &key);  /* env[varname] */\n  }\n}\n\n\nstatic void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) {\n  FuncState *fs = ls->fs;\n  int extra = nvars - nexps;\n  if (hasmultret(e->k)) {\n    extra++;  /* includes call itself */\n    if (extra < 0) extra = 0;\n    luaK_setreturns(fs, e, extra);  /* last exp. provides the difference */\n    if (extra > 1) luaK_reserveregs(fs, extra-1);\n  }\n  else {\n    if (e->k != VVOID) luaK_exp2nextreg(fs, e);  /* close last expression */\n    if (extra > 0) {\n      int reg = fs->freereg;\n      luaK_reserveregs(fs, extra);\n      luaK_nil(fs, reg, extra);\n    }\n  }\n}\n\n\nstatic void enterlevel (LexState *ls) {\n  lua_State *L = ls->L;\n  ++L->nCcalls;\n  checklimit(ls->fs, L->nCcalls, LUAI_MAXCCALLS, \"C levels\");\n}\n\n\n#define leavelevel(ls)\t((ls)->L->nCcalls--)\n\n\nstatic void closegoto (LexState *ls, int g, Labeldesc *label) {\n  int i;\n  FuncState *fs = ls->fs;\n  Labellist *gl = &ls->dyd->gt;\n  Labeldesc *gt = &gl->arr[g];\n  lua_assert(eqstr(gt->name, label->name));\n  if (gt->nactvar < label->nactvar) {\n    TString *vname = getlocvar(fs, gt->nactvar)->varname;\n    const char *msg = luaO_pushfstring(ls->L,\n      \"<goto %s> at line %d jumps into the scope of local '%s'\",\n      getstr(gt->name), gt->line, getstr(vname));\n    semerror(ls, msg);\n  }\n  luaK_patchlist(fs, gt->pc, label->pc);\n  /* remove goto from pending list */\n  for (i = g; i < gl->n - 1; i++)\n    gl->arr[i] = gl->arr[i + 1];\n  gl->n--;\n}\n\n\n/*\n** try to close a goto with existing labels; this solves backward jumps\n*/\nstatic int findlabel (LexState *ls, int g) {\n  int i;\n  BlockCnt *bl = ls->fs->bl;\n  Dyndata *dyd = ls->dyd;\n  Labeldesc *gt = &dyd->gt.arr[g];\n  /* check labels in current block for a match */\n  for (i = bl->firstlabel; i < dyd->label.n; i++) {\n    Labeldesc *lb = &dyd->label.arr[i];\n    if (eqstr(lb->name, gt->name)) {  /* correct label? */\n      if (gt->nactvar > lb->nactvar &&\n          (bl->upval || dyd->label.n > bl->firstlabel))\n        luaK_patchclose(ls->fs, gt->pc, lb->nactvar);\n      closegoto(ls, g, lb);  /* close it */\n      return 1;\n    }\n  }\n  return 0;  /* label not found; cannot close goto */\n}\n\n\nstatic int newlabelentry (LexState *ls, Labellist *l, TString *name,\n                          int line, int pc) {\n  int n = l->n;\n  luaM_growvector(ls->L, l->arr, n, l->size,\n                  Labeldesc, SHRT_MAX, \"labels/gotos\");\n  l->arr[n].name = name;\n  l->arr[n].line = line;\n  l->arr[n].nactvar = ls->fs->nactvar;\n  l->arr[n].pc = pc;\n  l->n = n + 1;\n  return n;\n}\n\n\n/*\n** check whether new label 'lb' matches any pending gotos in current\n** block; solves forward jumps\n*/\nstatic void findgotos (LexState *ls, Labeldesc *lb) {\n  Labellist *gl = &ls->dyd->gt;\n  int i = ls->fs->bl->firstgoto;\n  while (i < gl->n) {\n    if (eqstr(gl->arr[i].name, lb->name))\n      closegoto(ls, i, lb);\n    else\n      i++;\n  }\n}\n\n\n/*\n** export pending gotos to outer level, to check them against\n** outer labels; if the block being exited has upvalues, and\n** the goto exits the scope of any variable (which can be the\n** upvalue), close those variables being exited.\n*/\nstatic void movegotosout (FuncState *fs, BlockCnt *bl) {\n  int i = bl->firstgoto;\n  Labellist *gl = &fs->ls->dyd->gt;\n  /* correct pending gotos to current block and try to close it\n     with visible labels */\n  while (i < gl->n) {\n    Labeldesc *gt = &gl->arr[i];\n    if (gt->nactvar > bl->nactvar) {\n      if (bl->upval)\n        luaK_patchclose(fs, gt->pc, bl->nactvar);\n      gt->nactvar = bl->nactvar;\n    }\n    if (!findlabel(fs->ls, i))\n      i++;  /* move to next one */\n  }\n}\n\n\nstatic void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isloop) {\n  bl->isloop = isloop;\n  bl->nactvar = fs->nactvar;\n  bl->firstlabel = fs->ls->dyd->label.n;\n  bl->firstgoto = fs->ls->dyd->gt.n;\n  bl->upval = 0;\n  bl->previous = fs->bl;\n  fs->bl = bl;\n  lua_assert(fs->freereg == fs->nactvar);\n}\n\n\n/*\n** create a label named 'break' to resolve break statements\n*/\nstatic void breaklabel (LexState *ls) {\n  TString *n = luaS_new(ls->L, \"break\");\n  int l = newlabelentry(ls, &ls->dyd->label, n, 0, ls->fs->pc);\n  findgotos(ls, &ls->dyd->label.arr[l]);\n}\n\n/*\n** generates an error for an undefined 'goto'; choose appropriate\n** message when label name is a reserved word (which can only be 'break')\n*/\nstatic l_noret undefgoto (LexState *ls, Labeldesc *gt) {\n  const char *msg = isreserved(gt->name)\n                    ? \"<%s> at line %d not inside a loop\"\n                    : \"no visible label '%s' for <goto> at line %d\";\n  msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line);\n  semerror(ls, msg);\n}\n\n\nstatic void leaveblock (FuncState *fs) {\n  BlockCnt *bl = fs->bl;\n  LexState *ls = fs->ls;\n  if (bl->previous && bl->upval) {\n    /* create a 'jump to here' to close upvalues */\n    int j = luaK_jump(fs);\n    luaK_patchclose(fs, j, bl->nactvar);\n    luaK_patchtohere(fs, j);\n  }\n  if (bl->isloop)\n    breaklabel(ls);  /* close pending breaks */\n  fs->bl = bl->previous;\n  removevars(fs, bl->nactvar);\n  lua_assert(bl->nactvar == fs->nactvar);\n  fs->freereg = fs->nactvar;  /* free registers */\n  ls->dyd->label.n = bl->firstlabel;  /* remove local labels */\n  if (bl->previous)  /* inner block? */\n    movegotosout(fs, bl);  /* update pending gotos to outer block */\n  else if (bl->firstgoto < ls->dyd->gt.n)  /* pending gotos in outer block? */\n    undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]);  /* error */\n}\n\n\n/*\n** adds a new prototype into list of prototypes\n*/\nstatic Proto *addprototype (LexState *ls) {\n  Proto *clp;\n  lua_State *L = ls->L;\n  FuncState *fs = ls->fs;\n  Proto *f = fs->f;  /* prototype of current function */\n  if (fs->np >= f->sizep) {\n    int oldsize = f->sizep;\n    luaM_growvector(L, f->p, fs->np, f->sizep, Proto *, MAXARG_Bx, \"functions\");\n    while (oldsize < f->sizep) f->p[oldsize++] = NULL;\n  }\n  f->p[fs->np++] = clp = luaF_newproto(L);\n  luaC_objbarrier(L, f, clp);\n  return clp;\n}\n\n\n/*\n** codes instruction to create new closure in parent function.\n** The OP_CLOSURE instruction must use the last available register,\n** so that, if it invokes the GC, the GC knows which registers\n** are in use at that time.\n*/\nstatic void codeclosure (LexState *ls, expdesc *v) {\n  FuncState *fs = ls->fs->prev;\n  init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np - 1));\n  luaK_exp2nextreg(fs, v);  /* fix it at the last register */\n}\n\n\nstatic void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) {\n  Proto *f;\n  fs->prev = ls->fs;  /* linked list of funcstates */\n  fs->ls = ls;\n  ls->fs = fs;\n  fs->pc = 0;\n  fs->lasttarget = 0;\n  fs->jpc = NO_JUMP;\n  fs->freereg = 0;\n  fs->nk = 0;\n  fs->np = 0;\n  fs->nups = 0;\n  fs->nlocvars = 0;\n  fs->nactvar = 0;\n  fs->firstlocal = ls->dyd->actvar.n;\n  fs->bl = NULL;\n  f = fs->f;\n  f->source = ls->source;\n  f->maxstacksize = 2;  /* registers 0/1 are always valid */\n  enterblock(fs, bl, 0);\n}\n\n\nstatic void close_func (LexState *ls) {\n  lua_State *L = ls->L;\n  FuncState *fs = ls->fs;\n  Proto *f = fs->f;\n  luaK_ret(fs, 0, 0);  /* final return */\n  leaveblock(fs);\n  luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction);\n  f->sizecode = fs->pc;\n  luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int);\n  f->sizelineinfo = fs->pc;\n  luaM_reallocvector(L, f->k, f->sizek, fs->nk, TValue);\n  f->sizek = fs->nk;\n  luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *);\n  f->sizep = fs->np;\n  luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar);\n  f->sizelocvars = fs->nlocvars;\n  luaM_reallocvector(L, f->upvalues, f->sizeupvalues, fs->nups, Upvaldesc);\n  f->sizeupvalues = fs->nups;\n  lua_assert(fs->bl == NULL);\n  ls->fs = fs->prev;\n  luaC_checkGC(L);\n}\n\n\n\n/*============================================================*/\n/* GRAMMAR RULES */\n/*============================================================*/\n\n\n/*\n** check whether current token is in the follow set of a block.\n** 'until' closes syntactical blocks, but do not close scope,\n** so it is handled in separate.\n*/\nstatic int block_follow (LexState *ls, int withuntil) {\n  switch (ls->t.token) {\n    case TK_ELSE: case TK_ELSEIF:\n    case TK_END: case TK_EOS:\n      return 1;\n    case TK_UNTIL: return withuntil;\n    default: return 0;\n  }\n}\n\n\nstatic void statlist (LexState *ls) {\n  /* statlist -> { stat [';'] } */\n  while (!block_follow(ls, 1)) {\n    if (ls->t.token == TK_RETURN) {\n      statement(ls);\n      return;  /* 'return' must be last statement */\n    }\n    statement(ls);\n  }\n}\n\n\nstatic void fieldsel (LexState *ls, expdesc *v) {\n  /* fieldsel -> ['.' | ':'] NAME */\n  FuncState *fs = ls->fs;\n  expdesc key;\n  luaK_exp2anyregup(fs, v);\n  luaX_next(ls);  /* skip the dot or colon */\n  checkname(ls, &key);\n  luaK_indexed(fs, v, &key);\n}\n\n\nstatic void yindex (LexState *ls, expdesc *v) {\n  /* index -> '[' expr ']' */\n  luaX_next(ls);  /* skip the '[' */\n  expr(ls, v);\n  luaK_exp2val(ls->fs, v);\n  checknext(ls, ']');\n}\n\n\n/*\n** {======================================================================\n** Rules for Constructors\n** =======================================================================\n*/\n\n\nstruct ConsControl {\n  expdesc v;  /* last list item read */\n  expdesc *t;  /* table descriptor */\n  int nh;  /* total number of 'record' elements */\n  int na;  /* total number of array elements */\n  int tostore;  /* number of array elements pending to be stored */\n};\n\n\nstatic void recfield (LexState *ls, struct ConsControl *cc) {\n  /* recfield -> (NAME | '['exp1']') = exp1 */\n  FuncState *fs = ls->fs;\n  int reg = ls->fs->freereg;\n  expdesc key, val;\n  int rkkey;\n  if (ls->t.token == TK_NAME) {\n    checklimit(fs, cc->nh, MAX_INT, \"items in a constructor\");\n    checkname(ls, &key);\n  }\n  else  /* ls->t.token == '[' */\n    yindex(ls, &key);\n  cc->nh++;\n  checknext(ls, '=');\n  rkkey = luaK_exp2RK(fs, &key);\n  expr(ls, &val);\n  luaK_codeABC(fs, OP_SETTABLE, cc->t->u.info, rkkey, luaK_exp2RK(fs, &val));\n  fs->freereg = reg;  /* free registers */\n}\n\n\nstatic void closelistfield (FuncState *fs, struct ConsControl *cc) {\n  if (cc->v.k == VVOID) return;  /* there is no list item */\n  luaK_exp2nextreg(fs, &cc->v);\n  cc->v.k = VVOID;\n  if (cc->tostore == LFIELDS_PER_FLUSH) {\n    luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore);  /* flush */\n    cc->tostore = 0;  /* no more items pending */\n  }\n}\n\n\nstatic void lastlistfield (FuncState *fs, struct ConsControl *cc) {\n  if (cc->tostore == 0) return;\n  if (hasmultret(cc->v.k)) {\n    luaK_setmultret(fs, &cc->v);\n    luaK_setlist(fs, cc->t->u.info, cc->na, LUA_MULTRET);\n    cc->na--;  /* do not count last expression (unknown number of elements) */\n  }\n  else {\n    if (cc->v.k != VVOID)\n      luaK_exp2nextreg(fs, &cc->v);\n    luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore);\n  }\n}\n\n\nstatic void listfield (LexState *ls, struct ConsControl *cc) {\n  /* listfield -> exp */\n  expr(ls, &cc->v);\n  checklimit(ls->fs, cc->na, MAX_INT, \"items in a constructor\");\n  cc->na++;\n  cc->tostore++;\n}\n\n\nstatic void field (LexState *ls, struct ConsControl *cc) {\n  /* field -> listfield | recfield */\n  switch(ls->t.token) {\n    case TK_NAME: {  /* may be 'listfield' or 'recfield' */\n      if (luaX_lookahead(ls) != '=')  /* expression? */\n        listfield(ls, cc);\n      else\n        recfield(ls, cc);\n      break;\n    }\n    case '[': {\n      recfield(ls, cc);\n      break;\n    }\n    default: {\n      listfield(ls, cc);\n      break;\n    }\n  }\n}\n\n\nstatic void constructor (LexState *ls, expdesc *t) {\n  /* constructor -> '{' [ field { sep field } [sep] ] '}'\n     sep -> ',' | ';' */\n  FuncState *fs = ls->fs;\n  int line = ls->linenumber;\n  int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0);\n  struct ConsControl cc;\n  cc.na = cc.nh = cc.tostore = 0;\n  cc.t = t;\n  init_exp(t, VRELOCABLE, pc);\n  init_exp(&cc.v, VVOID, 0);  /* no value (yet) */\n  luaK_exp2nextreg(ls->fs, t);  /* fix it at stack top */\n  checknext(ls, '{');\n  do {\n    lua_assert(cc.v.k == VVOID || cc.tostore > 0);\n    if (ls->t.token == '}') break;\n    closelistfield(fs, &cc);\n    field(ls, &cc);\n  } while (testnext(ls, ',') || testnext(ls, ';'));\n  check_match(ls, '}', '{', line);\n  lastlistfield(fs, &cc);\n  SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */\n  SETARG_C(fs->f->code[pc], luaO_int2fb(cc.nh));  /* set initial table size */\n}\n\n/* }====================================================================== */\n\n\n\nstatic void parlist (LexState *ls) {\n  /* parlist -> [ param { ',' param } ] */\n  FuncState *fs = ls->fs;\n  Proto *f = fs->f;\n  int nparams = 0;\n  f->is_vararg = 0;\n  if (ls->t.token != ')') {  /* is 'parlist' not empty? */\n    do {\n      switch (ls->t.token) {\n        case TK_NAME: {  /* param -> NAME */\n          new_localvar(ls, str_checkname(ls));\n          nparams++;\n          break;\n        }\n        case TK_DOTS: {  /* param -> '...' */\n          luaX_next(ls);\n          f->is_vararg = 1;\n          break;\n        }\n        default: luaX_syntaxerror(ls, \"<name> or '...' expected\");\n      }\n    } while (!f->is_vararg && testnext(ls, ','));\n  }\n  adjustlocalvars(ls, nparams);\n  f->numparams = cast_byte(fs->nactvar);\n  luaK_reserveregs(fs, fs->nactvar);  /* reserve register for parameters */\n}\n\n\nstatic void body (LexState *ls, expdesc *e, int ismethod, int line) {\n  /* body ->  '(' parlist ')' block END */\n  FuncState new_fs;\n  BlockCnt bl;\n  new_fs.f = addprototype(ls);\n  new_fs.f->linedefined = line;\n  open_func(ls, &new_fs, &bl);\n  checknext(ls, '(');\n  if (ismethod) {\n    new_localvarliteral(ls, \"self\");  /* create 'self' parameter */\n    adjustlocalvars(ls, 1);\n  }\n  parlist(ls);\n  checknext(ls, ')');\n  statlist(ls);\n  new_fs.f->lastlinedefined = ls->linenumber;\n  check_match(ls, TK_END, TK_FUNCTION, line);\n  codeclosure(ls, e);\n  close_func(ls);\n}\n\n\nstatic int explist (LexState *ls, expdesc *v) {\n  /* explist -> expr { ',' expr } */\n  int n = 1;  /* at least one expression */\n  expr(ls, v);\n  while (testnext(ls, ',')) {\n    luaK_exp2nextreg(ls->fs, v);\n    expr(ls, v);\n    n++;\n  }\n  return n;\n}\n\n\nstatic void funcargs (LexState *ls, expdesc *f, int line) {\n  FuncState *fs = ls->fs;\n  expdesc args;\n  int base, nparams;\n  switch (ls->t.token) {\n    case '(': {  /* funcargs -> '(' [ explist ] ')' */\n      luaX_next(ls);\n      if (ls->t.token == ')')  /* arg list is empty? */\n        args.k = VVOID;\n      else {\n        explist(ls, &args);\n        luaK_setmultret(fs, &args);\n      }\n      check_match(ls, ')', '(', line);\n      break;\n    }\n    case '{': {  /* funcargs -> constructor */\n      constructor(ls, &args);\n      break;\n    }\n    case TK_STRING: {  /* funcargs -> STRING */\n      codestring(ls, &args, ls->t.seminfo.ts);\n      luaX_next(ls);  /* must use 'seminfo' before 'next' */\n      break;\n    }\n    default: {\n      luaX_syntaxerror(ls, \"function arguments expected\");\n    }\n  }\n  lua_assert(f->k == VNONRELOC);\n  base = f->u.info;  /* base register for call */\n  if (hasmultret(args.k))\n    nparams = LUA_MULTRET;  /* open call */\n  else {\n    if (args.k != VVOID)\n      luaK_exp2nextreg(fs, &args);  /* close last argument */\n    nparams = fs->freereg - (base+1);\n  }\n  init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2));\n  luaK_fixline(fs, line);\n  fs->freereg = base+1;  /* call remove function and arguments and leaves\n                            (unless changed) one result */\n}\n\n\n\n\n/*\n** {======================================================================\n** Expression parsing\n** =======================================================================\n*/\n\n\nstatic void primaryexp (LexState *ls, expdesc *v) {\n  /* primaryexp -> NAME | '(' expr ')' */\n  switch (ls->t.token) {\n    case '(': {\n      int line = ls->linenumber;\n      luaX_next(ls);\n      expr(ls, v);\n      check_match(ls, ')', '(', line);\n      luaK_dischargevars(ls->fs, v);\n      return;\n    }\n    case TK_NAME: {\n      singlevar(ls, v);\n      return;\n    }\n    default: {\n      luaX_syntaxerror(ls, \"unexpected symbol\");\n    }\n  }\n}\n\n\nstatic void suffixedexp (LexState *ls, expdesc *v) {\n  /* suffixedexp ->\n       primaryexp { '.' NAME | '[' exp ']' | ':' NAME funcargs | funcargs } */\n  FuncState *fs = ls->fs;\n  int line = ls->linenumber;\n  primaryexp(ls, v);\n  for (;;) {\n    switch (ls->t.token) {\n      case '.': {  /* fieldsel */\n        fieldsel(ls, v);\n        break;\n      }\n      case '[': {  /* '[' exp1 ']' */\n        expdesc key;\n        luaK_exp2anyregup(fs, v);\n        yindex(ls, &key);\n        luaK_indexed(fs, v, &key);\n        break;\n      }\n      case ':': {  /* ':' NAME funcargs */\n        expdesc key;\n        luaX_next(ls);\n        checkname(ls, &key);\n        luaK_self(fs, v, &key);\n        funcargs(ls, v, line);\n        break;\n      }\n      case '(': case TK_STRING: case '{': {  /* funcargs */\n        luaK_exp2nextreg(fs, v);\n        funcargs(ls, v, line);\n        break;\n      }\n      default: return;\n    }\n  }\n}\n\n\nstatic void simpleexp (LexState *ls, expdesc *v) {\n  /* simpleexp -> FLT | INT | STRING | NIL | TRUE | FALSE | ... |\n                  constructor | FUNCTION body | suffixedexp */\n  switch (ls->t.token) {\n    case TK_FLT: {\n      init_exp(v, VKFLT, 0);\n      v->u.nval = ls->t.seminfo.r;\n      break;\n    }\n    case TK_INT: {\n      init_exp(v, VKINT, 0);\n      v->u.ival = ls->t.seminfo.i;\n      break;\n    }\n    case TK_STRING: {\n      codestring(ls, v, ls->t.seminfo.ts);\n      break;\n    }\n    case TK_NIL: {\n      init_exp(v, VNIL, 0);\n      break;\n    }\n    case TK_TRUE: {\n      init_exp(v, VTRUE, 0);\n      break;\n    }\n    case TK_FALSE: {\n      init_exp(v, VFALSE, 0);\n      break;\n    }\n    case TK_DOTS: {  /* vararg */\n      FuncState *fs = ls->fs;\n      check_condition(ls, fs->f->is_vararg,\n                      \"cannot use '...' outside a vararg function\");\n      init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 1, 0));\n      break;\n    }\n    case '{': {  /* constructor */\n      constructor(ls, v);\n      return;\n    }\n    case TK_FUNCTION: {\n      luaX_next(ls);\n      body(ls, v, 0, ls->linenumber);\n      return;\n    }\n    default: {\n      suffixedexp(ls, v);\n      return;\n    }\n  }\n  luaX_next(ls);\n}\n\n\nstatic UnOpr getunopr (int op) {\n  switch (op) {\n    case TK_NOT: return OPR_NOT;\n    case '-': return OPR_MINUS;\n    case '~': return OPR_BNOT;\n    case '#': return OPR_LEN;\n    default: return OPR_NOUNOPR;\n  }\n}\n\n\nstatic BinOpr getbinopr (int op) {\n  switch (op) {\n    case '+': return OPR_ADD;\n    case '-': return OPR_SUB;\n    case '*': return OPR_MUL;\n    case '%': return OPR_MOD;\n    case '^': return OPR_POW;\n    case '/': return OPR_DIV;\n    case TK_IDIV: return OPR_IDIV;\n    case '&': return OPR_BAND;\n    case '|': return OPR_BOR;\n    case '~': return OPR_BXOR;\n    case TK_SHL: return OPR_SHL;\n    case TK_SHR: return OPR_SHR;\n    case TK_CONCAT: return OPR_CONCAT;\n    case TK_NE: return OPR_NE;\n    case TK_EQ: return OPR_EQ;\n    case '<': return OPR_LT;\n    case TK_LE: return OPR_LE;\n    case '>': return OPR_GT;\n    case TK_GE: return OPR_GE;\n    case TK_AND: return OPR_AND;\n    case TK_OR: return OPR_OR;\n    default: return OPR_NOBINOPR;\n  }\n}\n\n\nstatic const struct {\n  lu_byte left;  /* left priority for each binary operator */\n  lu_byte right; /* right priority */\n} priority[] = {  /* ORDER OPR */\n   {10, 10}, {10, 10},           /* '+' '-' */\n   {11, 11}, {11, 11},           /* '*' '%' */\n   {14, 13},                  /* '^' (right associative) */\n   {11, 11}, {11, 11},           /* '/' '//' */\n   {6, 6}, {4, 4}, {5, 5},   /* '&' '|' '~' */\n   {7, 7}, {7, 7},           /* '<<' '>>' */\n   {9, 8},                   /* '..' (right associative) */\n   {3, 3}, {3, 3}, {3, 3},   /* ==, <, <= */\n   {3, 3}, {3, 3}, {3, 3},   /* ~=, >, >= */\n   {2, 2}, {1, 1}            /* and, or */\n};\n\n#define UNARY_PRIORITY\t12  /* priority for unary operators */\n\n\n/*\n** subexpr -> (simpleexp | unop subexpr) { binop subexpr }\n** where 'binop' is any binary operator with a priority higher than 'limit'\n*/\nstatic BinOpr subexpr (LexState *ls, expdesc *v, int limit) {\n  BinOpr op;\n  UnOpr uop;\n  enterlevel(ls);\n  uop = getunopr(ls->t.token);\n  if (uop != OPR_NOUNOPR) {\n    int line = ls->linenumber;\n    luaX_next(ls);\n    subexpr(ls, v, UNARY_PRIORITY);\n    luaK_prefix(ls->fs, uop, v, line);\n  }\n  else simpleexp(ls, v);\n  /* expand while operators have priorities higher than 'limit' */\n  op = getbinopr(ls->t.token);\n  while (op != OPR_NOBINOPR && priority[op].left > limit) {\n    expdesc v2;\n    BinOpr nextop;\n    int line = ls->linenumber;\n    luaX_next(ls);\n    luaK_infix(ls->fs, op, v);\n    /* read sub-expression with higher priority */\n    nextop = subexpr(ls, &v2, priority[op].right);\n    luaK_posfix(ls->fs, op, v, &v2, line);\n    op = nextop;\n  }\n  leavelevel(ls);\n  return op;  /* return first untreated operator */\n}\n\n\nstatic void expr (LexState *ls, expdesc *v) {\n  subexpr(ls, v, 0);\n}\n\n/* }==================================================================== */\n\n\n\n/*\n** {======================================================================\n** Rules for Statements\n** =======================================================================\n*/\n\n\nstatic void block (LexState *ls) {\n  /* block -> statlist */\n  FuncState *fs = ls->fs;\n  BlockCnt bl;\n  enterblock(fs, &bl, 0);\n  statlist(ls);\n  leaveblock(fs);\n}\n\n\n/*\n** structure to chain all variables in the left-hand side of an\n** assignment\n*/\nstruct LHS_assign {\n  struct LHS_assign *prev;\n  expdesc v;  /* variable (global, local, upvalue, or indexed) */\n};\n\n\n/*\n** check whether, in an assignment to an upvalue/local variable, the\n** upvalue/local variable is begin used in a previous assignment to a\n** table. If so, save original upvalue/local value in a safe place and\n** use this safe copy in the previous assignment.\n*/\nstatic void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) {\n  FuncState *fs = ls->fs;\n  int extra = fs->freereg;  /* eventual position to save local variable */\n  int conflict = 0;\n  for (; lh; lh = lh->prev) {  /* check all previous assignments */\n    if (lh->v.k == VINDEXED) {  /* assigning to a table? */\n      /* table is the upvalue/local being assigned now? */\n      if (lh->v.u.ind.vt == v->k && lh->v.u.ind.t == v->u.info) {\n        conflict = 1;\n        lh->v.u.ind.vt = VLOCAL;\n        lh->v.u.ind.t = extra;  /* previous assignment will use safe copy */\n      }\n      /* index is the local being assigned? (index cannot be upvalue) */\n      if (v->k == VLOCAL && lh->v.u.ind.idx == v->u.info) {\n        conflict = 1;\n        lh->v.u.ind.idx = extra;  /* previous assignment will use safe copy */\n      }\n    }\n  }\n  if (conflict) {\n    /* copy upvalue/local value to a temporary (in position 'extra') */\n    OpCode op = (v->k == VLOCAL) ? OP_MOVE : OP_GETUPVAL;\n    luaK_codeABC(fs, op, extra, v->u.info, 0);\n    luaK_reserveregs(fs, 1);\n  }\n}\n\n\nstatic void assignment (LexState *ls, struct LHS_assign *lh, int nvars) {\n  expdesc e;\n  check_condition(ls, vkisvar(lh->v.k), \"syntax error\");\n  if (testnext(ls, ',')) {  /* assignment -> ',' suffixedexp assignment */\n    struct LHS_assign nv;\n    nv.prev = lh;\n    suffixedexp(ls, &nv.v);\n    if (nv.v.k != VINDEXED)\n      check_conflict(ls, lh, &nv.v);\n    checklimit(ls->fs, nvars + ls->L->nCcalls, LUAI_MAXCCALLS,\n                    \"C levels\");\n    assignment(ls, &nv, nvars+1);\n  }\n  else {  /* assignment -> '=' explist */\n    int nexps;\n    checknext(ls, '=');\n    nexps = explist(ls, &e);\n    if (nexps != nvars) {\n      adjust_assign(ls, nvars, nexps, &e);\n      if (nexps > nvars)\n        ls->fs->freereg -= nexps - nvars;  /* remove extra values */\n    }\n    else {\n      luaK_setoneret(ls->fs, &e);  /* close last expression */\n      luaK_storevar(ls->fs, &lh->v, &e);\n      return;  /* avoid default */\n    }\n  }\n  init_exp(&e, VNONRELOC, ls->fs->freereg-1);  /* default assignment */\n  luaK_storevar(ls->fs, &lh->v, &e);\n}\n\n\nstatic int cond (LexState *ls) {\n  /* cond -> exp */\n  expdesc v;\n  expr(ls, &v);  /* read condition */\n  if (v.k == VNIL) v.k = VFALSE;  /* 'falses' are all equal here */\n  luaK_goiftrue(ls->fs, &v);\n  return v.f;\n}\n\n\nstatic void gotostat (LexState *ls, int pc) {\n  int line = ls->linenumber;\n  TString *label;\n  int g;\n  if (testnext(ls, TK_GOTO))\n    label = str_checkname(ls);\n  else {\n    luaX_next(ls);  /* skip break */\n    label = luaS_new(ls->L, \"break\");\n  }\n  g = newlabelentry(ls, &ls->dyd->gt, label, line, pc);\n  findlabel(ls, g);  /* close it if label already defined */\n}\n\n\n/* check for repeated labels on the same block */\nstatic void checkrepeated (FuncState *fs, Labellist *ll, TString *label) {\n  int i;\n  for (i = fs->bl->firstlabel; i < ll->n; i++) {\n    if (eqstr(label, ll->arr[i].name)) {\n      const char *msg = luaO_pushfstring(fs->ls->L,\n                          \"label '%s' already defined on line %d\",\n                          getstr(label), ll->arr[i].line);\n      semerror(fs->ls, msg);\n    }\n  }\n}\n\n\n/* skip no-op statements */\nstatic void skipnoopstat (LexState *ls) {\n  while (ls->t.token == ';' || ls->t.token == TK_DBCOLON)\n    statement(ls);\n}\n\n\nstatic void labelstat (LexState *ls, TString *label, int line) {\n  /* label -> '::' NAME '::' */\n  FuncState *fs = ls->fs;\n  Labellist *ll = &ls->dyd->label;\n  int l;  /* index of new label being created */\n  checkrepeated(fs, ll, label);  /* check for repeated labels */\n  checknext(ls, TK_DBCOLON);  /* skip double colon */\n  /* create new entry for this label */\n  l = newlabelentry(ls, ll, label, line, fs->pc);\n  skipnoopstat(ls);  /* skip other no-op statements */\n  if (block_follow(ls, 0)) {  /* label is last no-op statement in the block? */\n    /* assume that locals are already out of scope */\n    ll->arr[l].nactvar = fs->bl->nactvar;\n  }\n  findgotos(ls, &ll->arr[l]);\n}\n\n\nstatic void whilestat (LexState *ls, int line) {\n  /* whilestat -> WHILE cond DO block END */\n  FuncState *fs = ls->fs;\n  int whileinit;\n  int condexit;\n  BlockCnt bl;\n  luaX_next(ls);  /* skip WHILE */\n  whileinit = luaK_getlabel(fs);\n  condexit = cond(ls);\n  enterblock(fs, &bl, 1);\n  checknext(ls, TK_DO);\n  block(ls);\n  luaK_jumpto(fs, whileinit);\n  check_match(ls, TK_END, TK_WHILE, line);\n  leaveblock(fs);\n  luaK_patchtohere(fs, condexit);  /* false conditions finish the loop */\n}\n\n\nstatic void repeatstat (LexState *ls, int line) {\n  /* repeatstat -> REPEAT block UNTIL cond */\n  int condexit;\n  FuncState *fs = ls->fs;\n  int repeat_init = luaK_getlabel(fs);\n  BlockCnt bl1, bl2;\n  enterblock(fs, &bl1, 1);  /* loop block */\n  enterblock(fs, &bl2, 0);  /* scope block */\n  luaX_next(ls);  /* skip REPEAT */\n  statlist(ls);\n  check_match(ls, TK_UNTIL, TK_REPEAT, line);\n  condexit = cond(ls);  /* read condition (inside scope block) */\n  if (bl2.upval)  /* upvalues? */\n    luaK_patchclose(fs, condexit, bl2.nactvar);\n  leaveblock(fs);  /* finish scope */\n  luaK_patchlist(fs, condexit, repeat_init);  /* close the loop */\n  leaveblock(fs);  /* finish loop */\n}\n\n\nstatic int exp1 (LexState *ls) {\n  expdesc e;\n  int reg;\n  expr(ls, &e);\n  luaK_exp2nextreg(ls->fs, &e);\n  lua_assert(e.k == VNONRELOC);\n  reg = e.u.info;\n  return reg;\n}\n\n\nstatic void forbody (LexState *ls, int base, int line, int nvars, int isnum) {\n  /* forbody -> DO block */\n  BlockCnt bl;\n  FuncState *fs = ls->fs;\n  int prep, endfor;\n  adjustlocalvars(ls, 3);  /* control variables */\n  checknext(ls, TK_DO);\n  prep = isnum ? luaK_codeAsBx(fs, OP_FORPREP, base, NO_JUMP) : luaK_jump(fs);\n  enterblock(fs, &bl, 0);  /* scope for declared variables */\n  adjustlocalvars(ls, nvars);\n  luaK_reserveregs(fs, nvars);\n  block(ls);\n  leaveblock(fs);  /* end of scope for declared variables */\n  luaK_patchtohere(fs, prep);\n  if (isnum)  /* numeric for? */\n    endfor = luaK_codeAsBx(fs, OP_FORLOOP, base, NO_JUMP);\n  else {  /* generic for */\n    luaK_codeABC(fs, OP_TFORCALL, base, 0, nvars);\n    luaK_fixline(fs, line);\n    endfor = luaK_codeAsBx(fs, OP_TFORLOOP, base + 2, NO_JUMP);\n  }\n  luaK_patchlist(fs, endfor, prep + 1);\n  luaK_fixline(fs, line);\n}\n\n\nstatic void fornum (LexState *ls, TString *varname, int line) {\n  /* fornum -> NAME = exp1,exp1[,exp1] forbody */\n  FuncState *fs = ls->fs;\n  int base = fs->freereg;\n  new_localvarliteral(ls, \"(for index)\");\n  new_localvarliteral(ls, \"(for limit)\");\n  new_localvarliteral(ls, \"(for step)\");\n  new_localvar(ls, varname);\n  checknext(ls, '=');\n  exp1(ls);  /* initial value */\n  checknext(ls, ',');\n  exp1(ls);  /* limit */\n  if (testnext(ls, ','))\n    exp1(ls);  /* optional step */\n  else {  /* default step = 1 */\n    luaK_codek(fs, fs->freereg, luaK_intK(fs, 1));\n    luaK_reserveregs(fs, 1);\n  }\n  forbody(ls, base, line, 1, 1);\n}\n\n\nstatic void forlist (LexState *ls, TString *indexname) {\n  /* forlist -> NAME {,NAME} IN explist forbody */\n  FuncState *fs = ls->fs;\n  expdesc e;\n  int nvars = 4;  /* gen, state, control, plus at least one declared var */\n  int line;\n  int base = fs->freereg;\n  /* create control variables */\n  new_localvarliteral(ls, \"(for generator)\");\n  new_localvarliteral(ls, \"(for state)\");\n  new_localvarliteral(ls, \"(for control)\");\n  /* create declared variables */\n  new_localvar(ls, indexname);\n  while (testnext(ls, ',')) {\n    new_localvar(ls, str_checkname(ls));\n    nvars++;\n  }\n  checknext(ls, TK_IN);\n  line = ls->linenumber;\n  adjust_assign(ls, 3, explist(ls, &e), &e);\n  luaK_checkstack(fs, 3);  /* extra space to call generator */\n  forbody(ls, base, line, nvars - 3, 0);\n}\n\n\nstatic void forstat (LexState *ls, int line) {\n  /* forstat -> FOR (fornum | forlist) END */\n  FuncState *fs = ls->fs;\n  TString *varname;\n  BlockCnt bl;\n  enterblock(fs, &bl, 1);  /* scope for loop and control variables */\n  luaX_next(ls);  /* skip 'for' */\n  varname = str_checkname(ls);  /* first variable name */\n  switch (ls->t.token) {\n    case '=': fornum(ls, varname, line); break;\n    case ',': case TK_IN: forlist(ls, varname); break;\n    default: luaX_syntaxerror(ls, \"'=' or 'in' expected\");\n  }\n  check_match(ls, TK_END, TK_FOR, line);\n  leaveblock(fs);  /* loop scope ('break' jumps to this point) */\n}\n\n\nstatic void test_then_block (LexState *ls, int *escapelist) {\n  /* test_then_block -> [IF | ELSEIF] cond THEN block */\n  BlockCnt bl;\n  FuncState *fs = ls->fs;\n  expdesc v;\n  int jf;  /* instruction to skip 'then' code (if condition is false) */\n  luaX_next(ls);  /* skip IF or ELSEIF */\n  expr(ls, &v);  /* read condition */\n  checknext(ls, TK_THEN);\n  if (ls->t.token == TK_GOTO || ls->t.token == TK_BREAK) {\n    luaK_goiffalse(ls->fs, &v);  /* will jump to label if condition is true */\n    enterblock(fs, &bl, 0);  /* must enter block before 'goto' */\n    gotostat(ls, v.t);  /* handle goto/break */\n    skipnoopstat(ls);  /* skip other no-op statements */\n    if (block_follow(ls, 0)) {  /* 'goto' is the entire block? */\n      leaveblock(fs);\n      return;  /* and that is it */\n    }\n    else  /* must skip over 'then' part if condition is false */\n      jf = luaK_jump(fs);\n  }\n  else {  /* regular case (not goto/break) */\n    luaK_goiftrue(ls->fs, &v);  /* skip over block if condition is false */\n    enterblock(fs, &bl, 0);\n    jf = v.f;\n  }\n  statlist(ls);  /* 'then' part */\n  leaveblock(fs);\n  if (ls->t.token == TK_ELSE ||\n      ls->t.token == TK_ELSEIF)  /* followed by 'else'/'elseif'? */\n    luaK_concat(fs, escapelist, luaK_jump(fs));  /* must jump over it */\n  luaK_patchtohere(fs, jf);\n}\n\n\nstatic void ifstat (LexState *ls, int line) {\n  /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */\n  FuncState *fs = ls->fs;\n  int escapelist = NO_JUMP;  /* exit list for finished parts */\n  test_then_block(ls, &escapelist);  /* IF cond THEN block */\n  while (ls->t.token == TK_ELSEIF)\n    test_then_block(ls, &escapelist);  /* ELSEIF cond THEN block */\n  if (testnext(ls, TK_ELSE))\n    block(ls);  /* 'else' part */\n  check_match(ls, TK_END, TK_IF, line);\n  luaK_patchtohere(fs, escapelist);  /* patch escape list to 'if' end */\n}\n\n\nstatic void localfunc (LexState *ls) {\n  expdesc b;\n  FuncState *fs = ls->fs;\n  new_localvar(ls, str_checkname(ls));  /* new local variable */\n  adjustlocalvars(ls, 1);  /* enter its scope */\n  body(ls, &b, 0, ls->linenumber);  /* function created in next register */\n  /* debug information will only see the variable after this point! */\n  getlocvar(fs, b.u.info)->startpc = fs->pc;\n}\n\n\nstatic void localstat (LexState *ls) {\n  /* stat -> LOCAL NAME {',' NAME} ['=' explist] */\n  int nvars = 0;\n  int nexps;\n  expdesc e;\n  do {\n    new_localvar(ls, str_checkname(ls));\n    nvars++;\n  } while (testnext(ls, ','));\n  if (testnext(ls, '='))\n    nexps = explist(ls, &e);\n  else {\n    e.k = VVOID;\n    nexps = 0;\n  }\n  adjust_assign(ls, nvars, nexps, &e);\n  adjustlocalvars(ls, nvars);\n}\n\n\nstatic int funcname (LexState *ls, expdesc *v) {\n  /* funcname -> NAME {fieldsel} [':' NAME] */\n  int ismethod = 0;\n  singlevar(ls, v);\n  while (ls->t.token == '.')\n    fieldsel(ls, v);\n  if (ls->t.token == ':') {\n    ismethod = 1;\n    fieldsel(ls, v);\n  }\n  return ismethod;\n}\n\n\nstatic void funcstat (LexState *ls, int line) {\n  /* funcstat -> FUNCTION funcname body */\n  int ismethod;\n  expdesc v, b;\n  luaX_next(ls);  /* skip FUNCTION */\n  ismethod = funcname(ls, &v);\n  body(ls, &b, ismethod, line);\n  luaK_storevar(ls->fs, &v, &b);\n  luaK_fixline(ls->fs, line);  /* definition \"happens\" in the first line */\n}\n\n\nstatic void exprstat (LexState *ls) {\n  /* stat -> func | assignment */\n  FuncState *fs = ls->fs;\n  struct LHS_assign v;\n  suffixedexp(ls, &v.v);\n  if (ls->t.token == '=' || ls->t.token == ',') { /* stat -> assignment ? */\n    v.prev = NULL;\n    assignment(ls, &v, 1);\n  }\n  else {  /* stat -> func */\n    check_condition(ls, v.v.k == VCALL, \"syntax error\");\n    SETARG_C(getcode(fs, &v.v), 1);  /* call statement uses no results */\n  }\n}\n\n\nstatic void retstat (LexState *ls) {\n  /* stat -> RETURN [explist] [';'] */\n  FuncState *fs = ls->fs;\n  expdesc e;\n  int first, nret;  /* registers with returned values */\n  if (block_follow(ls, 1) || ls->t.token == ';')\n    first = nret = 0;  /* return no values */\n  else {\n    nret = explist(ls, &e);  /* optional return values */\n    if (hasmultret(e.k)) {\n      luaK_setmultret(fs, &e);\n      if (e.k == VCALL && nret == 1) {  /* tail call? */\n        SET_OPCODE(getcode(fs,&e), OP_TAILCALL);\n        lua_assert(GETARG_A(getcode(fs,&e)) == fs->nactvar);\n      }\n      first = fs->nactvar;\n      nret = LUA_MULTRET;  /* return all values */\n    }\n    else {\n      if (nret == 1)  /* only one single value? */\n        first = luaK_exp2anyreg(fs, &e);\n      else {\n        luaK_exp2nextreg(fs, &e);  /* values must go to the stack */\n        first = fs->nactvar;  /* return all active values */\n        lua_assert(nret == fs->freereg - first);\n      }\n    }\n  }\n  luaK_ret(fs, first, nret);\n  testnext(ls, ';');  /* skip optional semicolon */\n}\n\n\nstatic void statement (LexState *ls) {\n  int line = ls->linenumber;  /* may be needed for error messages */\n  enterlevel(ls);\n  switch (ls->t.token) {\n    case ';': {  /* stat -> ';' (empty statement) */\n      luaX_next(ls);  /* skip ';' */\n      break;\n    }\n    case TK_IF: {  /* stat -> ifstat */\n      ifstat(ls, line);\n      break;\n    }\n    case TK_WHILE: {  /* stat -> whilestat */\n      whilestat(ls, line);\n      break;\n    }\n    case TK_DO: {  /* stat -> DO block END */\n      luaX_next(ls);  /* skip DO */\n      block(ls);\n      check_match(ls, TK_END, TK_DO, line);\n      break;\n    }\n    case TK_FOR: {  /* stat -> forstat */\n      forstat(ls, line);\n      break;\n    }\n    case TK_REPEAT: {  /* stat -> repeatstat */\n      repeatstat(ls, line);\n      break;\n    }\n    case TK_FUNCTION: {  /* stat -> funcstat */\n      funcstat(ls, line);\n      break;\n    }\n    case TK_LOCAL: {  /* stat -> localstat */\n      luaX_next(ls);  /* skip LOCAL */\n      if (testnext(ls, TK_FUNCTION))  /* local function? */\n        localfunc(ls);\n      else\n        localstat(ls);\n      break;\n    }\n    case TK_DBCOLON: {  /* stat -> label */\n      luaX_next(ls);  /* skip double colon */\n      labelstat(ls, str_checkname(ls), line);\n      break;\n    }\n    case TK_RETURN: {  /* stat -> retstat */\n      luaX_next(ls);  /* skip RETURN */\n      retstat(ls);\n      break;\n    }\n    case TK_BREAK:   /* stat -> breakstat */\n    case TK_GOTO: {  /* stat -> 'goto' NAME */\n      gotostat(ls, luaK_jump(ls->fs));\n      break;\n    }\n    default: {  /* stat -> func | assignment */\n      exprstat(ls);\n      break;\n    }\n  }\n  lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg &&\n             ls->fs->freereg >= ls->fs->nactvar);\n  ls->fs->freereg = ls->fs->nactvar;  /* free registers */\n  leavelevel(ls);\n}\n\n/* }====================================================================== */\n\n\n/*\n** compiles the main function, which is a regular vararg function with an\n** upvalue named LUA_ENV\n*/\nstatic void mainfunc (LexState *ls, FuncState *fs) {\n  BlockCnt bl;\n  expdesc v;\n  open_func(ls, fs, &bl);\n  fs->f->is_vararg = 1;  /* main function is always vararg */\n  init_exp(&v, VLOCAL, 0);  /* create and... */\n  newupvalue(fs, ls->envn, &v);  /* ...set environment upvalue */\n  luaX_next(ls);  /* read first token */\n  statlist(ls);  /* parse main body */\n  check(ls, TK_EOS);\n  close_func(ls);\n}\n\n\nLClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,\n                       Dyndata *dyd, const char *name, int firstchar) {\n  LexState lexstate;\n  FuncState funcstate;\n  LClosure *cl = luaF_newLclosure(L, 1);  /* create main closure */\n  setclLvalue(L, L->top, cl);  /* anchor it (to avoid being collected) */\n  incr_top(L);\n  lexstate.h = luaH_new(L);  /* create table for scanner */\n  sethvalue(L, L->top, lexstate.h);  /* anchor it */\n  incr_top(L);\n  funcstate.f = cl->p = luaF_newproto(L);\n  funcstate.f->source = luaS_new(L, name);  /* create and anchor TString */\n  lua_assert(iswhite(funcstate.f));  /* do not need barrier here */\n  lexstate.buff = buff;\n  lexstate.dyd = dyd;\n  dyd->actvar.n = dyd->gt.n = dyd->label.n = 0;\n  luaX_setinput(L, &lexstate, z, funcstate.f->source, firstchar);\n  mainfunc(&lexstate, &funcstate);\n  lua_assert(!funcstate.prev && funcstate.nups == 1 && !lexstate.fs);\n  /* all scopes should be correctly finished */\n  lua_assert(dyd->actvar.n == 0 && dyd->gt.n == 0 && dyd->label.n == 0);\n  L->top--;  /* remove scanner's table */\n  return cl;  /* closure is on the stack, too */\n}\n\n"
  },
  {
    "path": "externals/lua/src/lparser.h",
    "content": "/*\n** $Id: lparser.h,v 1.74 2014/10/25 11:50:46 roberto Exp $\n** Lua Parser\n** See Copyright Notice in lua.h\n*/\n\n#ifndef lparser_h\n#define lparser_h\n\n#include \"llimits.h\"\n#include \"lobject.h\"\n#include \"lzio.h\"\n\n\n/*\n** Expression descriptor\n*/\n\ntypedef enum {\n  VVOID,\t/* no value */\n  VNIL,\n  VTRUE,\n  VFALSE,\n  VK,\t\t/* info = index of constant in 'k' */\n  VKFLT,\t/* nval = numerical float value */\n  VKINT,\t/* nval = numerical integer value */\n  VNONRELOC,\t/* info = result register */\n  VLOCAL,\t/* info = local register */\n  VUPVAL,       /* info = index of upvalue in 'upvalues' */\n  VINDEXED,\t/* t = table register/upvalue; idx = index R/K */\n  VJMP,\t\t/* info = instruction pc */\n  VRELOCABLE,\t/* info = instruction pc */\n  VCALL,\t/* info = instruction pc */\n  VVARARG\t/* info = instruction pc */\n} expkind;\n\n\n#define vkisvar(k)\t(VLOCAL <= (k) && (k) <= VINDEXED)\n#define vkisinreg(k)\t((k) == VNONRELOC || (k) == VLOCAL)\n\ntypedef struct expdesc {\n  expkind k;\n  union {\n    struct {  /* for indexed variables (VINDEXED) */\n      short idx;  /* index (R/K) */\n      lu_byte t;  /* table (register or upvalue) */\n      lu_byte vt;  /* whether 't' is register (VLOCAL) or upvalue (VUPVAL) */\n    } ind;\n    int info;  /* for generic use */\n    lua_Number nval;  /* for VKFLT */\n    lua_Integer ival;    /* for VKINT */\n  } u;\n  int t;  /* patch list of 'exit when true' */\n  int f;  /* patch list of 'exit when false' */\n} expdesc;\n\n\n/* description of active local variable */\ntypedef struct Vardesc {\n  short idx;  /* variable index in stack */\n} Vardesc;\n\n\n/* description of pending goto statements and label statements */\ntypedef struct Labeldesc {\n  TString *name;  /* label identifier */\n  int pc;  /* position in code */\n  int line;  /* line where it appeared */\n  lu_byte nactvar;  /* local level where it appears in current block */\n} Labeldesc;\n\n\n/* list of labels or gotos */\ntypedef struct Labellist {\n  Labeldesc *arr;  /* array */\n  int n;  /* number of entries in use */\n  int size;  /* array size */\n} Labellist;\n\n\n/* dynamic structures used by the parser */\ntypedef struct Dyndata {\n  struct {  /* list of active local variables */\n    Vardesc *arr;\n    int n;\n    int size;\n  } actvar;\n  Labellist gt;  /* list of pending gotos */\n  Labellist label;   /* list of active labels */\n} Dyndata;\n\n\n/* control of blocks */\nstruct BlockCnt;  /* defined in lparser.c */\n\n\n/* state needed to generate code for a given function */\ntypedef struct FuncState {\n  Proto *f;  /* current function header */\n  struct FuncState *prev;  /* enclosing function */\n  struct LexState *ls;  /* lexical state */\n  struct BlockCnt *bl;  /* chain of current blocks */\n  int pc;  /* next position to code (equivalent to 'ncode') */\n  int lasttarget;   /* 'label' of last 'jump label' */\n  int jpc;  /* list of pending jumps to 'pc' */\n  int nk;  /* number of elements in 'k' */\n  int np;  /* number of elements in 'p' */\n  int firstlocal;  /* index of first local var (in Dyndata array) */\n  short nlocvars;  /* number of elements in 'f->locvars' */\n  lu_byte nactvar;  /* number of active local variables */\n  lu_byte nups;  /* number of upvalues */\n  lu_byte freereg;  /* first free register */\n} FuncState;\n\n\nLUAI_FUNC LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,\n                                 Dyndata *dyd, const char *name, int firstchar);\n\n\n#endif\n"
  },
  {
    "path": "externals/lua/src/lprefix.h",
    "content": "/*\n** $Id: lprefix.h,v 1.2 2014/12/29 16:54:13 roberto Exp $\n** Definitions for Lua code that must come before any other header file\n** See Copyright Notice in lua.h\n*/\n\n#ifndef lprefix_h\n#define lprefix_h\n\n\n/*\n** Allows POSIX/XSI stuff\n*/\n#if !defined(LUA_USE_C89)\t/* { */\n\n#if !defined(_XOPEN_SOURCE)\n#define _XOPEN_SOURCE           600\n#elif _XOPEN_SOURCE == 0\n#undef _XOPEN_SOURCE  /* use -D_XOPEN_SOURCE=0 to undefine it */\n#endif\n\n/*\n** Allows manipulation of large files in gcc and some other compilers\n*/\n#if !defined(LUA_32BITS) && !defined(_FILE_OFFSET_BITS)\n#define _LARGEFILE_SOURCE       1\n#define _FILE_OFFSET_BITS       64\n#endif\n\n#endif\t\t\t\t/* } */\n\n\n/*\n** Windows stuff\n*/\n#if defined(_WIN32) \t/* { */\n\n#if !defined(_CRT_SECURE_NO_WARNINGS)\n#define _CRT_SECURE_NO_WARNINGS  /* avoid warnings about ISO C functions */\n#endif\n\n#endif\t\t\t/* } */\n\n#endif\n\n"
  },
  {
    "path": "externals/lua/src/lstate.c",
    "content": "/*\n** $Id: lstate.c,v 2.127 2014/11/02 19:33:33 roberto Exp $\n** Global State\n** See Copyright Notice in lua.h\n*/\n\n#define lstate_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include <stddef.h>\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"lapi.h\"\n#include \"ldebug.h\"\n#include \"ldo.h\"\n#include \"lfunc.h\"\n#include \"lgc.h\"\n#include \"llex.h\"\n#include \"lmem.h\"\n#include \"lstate.h\"\n#include \"lstring.h\"\n#include \"ltable.h\"\n#include \"ltm.h\"\n\n\n#if !defined(LUAI_GCPAUSE)\n#define LUAI_GCPAUSE\t200  /* 200% */\n#endif\n\n#if !defined(LUAI_GCMUL)\n#define LUAI_GCMUL\t200 /* GC runs 'twice the speed' of memory allocation */\n#endif\n\n\n#define MEMERRMSG\t\"not enough memory\"\n\n\n/*\n** a macro to help the creation of a unique random seed when a state is\n** created; the seed is used to randomize hashes.\n*/\n#if !defined(luai_makeseed)\n#include <time.h>\n#define luai_makeseed()\t\tcast(unsigned int, time(NULL))\n#endif\n\n\n\n/*\n** thread state + extra space\n*/\ntypedef struct LX {\n  lu_byte extra_[LUA_EXTRASPACE];\n  lua_State l;\n} LX;\n\n\n/*\n** Main thread combines a thread state and the global state\n*/\ntypedef struct LG {\n  LX l;\n  global_State g;\n} LG;\n\n\n\n#define fromstate(L)\t(cast(LX *, cast(lu_byte *, (L)) - offsetof(LX, l)))\n\n\n/*\n** Compute an initial seed as random as possible. Rely on Address Space\n** Layout Randomization (if present) to increase randomness..\n*/\n#define addbuff(b,p,e) \\\n  { size_t t = cast(size_t, e); \\\n    memcpy(buff + p, &t, sizeof(t)); p += sizeof(t); }\n\nstatic unsigned int makeseed (lua_State *L) {\n  char buff[4 * sizeof(size_t)];\n  unsigned int h = luai_makeseed();\n  int p = 0;\n  addbuff(buff, p, L);  /* heap variable */\n  addbuff(buff, p, &h);  /* local variable */\n  addbuff(buff, p, luaO_nilobject);  /* global variable */\n  addbuff(buff, p, &lua_newstate);  /* public function */\n  lua_assert(p == sizeof(buff));\n  return luaS_hash(buff, p, h);\n}\n\n\n/*\n** set GCdebt to a new value keeping the value (totalbytes + GCdebt)\n** invariant\n*/\nvoid luaE_setdebt (global_State *g, l_mem debt) {\n  g->totalbytes -= (debt - g->GCdebt);\n  g->GCdebt = debt;\n}\n\n\nCallInfo *luaE_extendCI (lua_State *L) {\n  CallInfo *ci = luaM_new(L, CallInfo);\n  lua_assert(L->ci->next == NULL);\n  L->ci->next = ci;\n  ci->previous = L->ci;\n  ci->next = NULL;\n  return ci;\n}\n\n\n/*\n** free all CallInfo structures not in use by a thread\n*/\nvoid luaE_freeCI (lua_State *L) {\n  CallInfo *ci = L->ci;\n  CallInfo *next = ci->next;\n  ci->next = NULL;\n  while ((ci = next) != NULL) {\n    next = ci->next;\n    luaM_free(L, ci);\n  }\n}\n\n\n/*\n** free half of the CallInfo structures not in use by a thread\n*/\nvoid luaE_shrinkCI (lua_State *L) {\n  CallInfo *ci = L->ci;\n  while (ci->next != NULL) {  /* while there is 'next' */\n    CallInfo *next2 = ci->next->next;  /* next's next */\n    if (next2 == NULL) break;\n    luaM_free(L, ci->next);  /* remove next */\n    ci->next = next2;  /* remove 'next' from the list */\n    next2->previous = ci;\n    ci = next2;\n  }\n}\n\n\nstatic void stack_init (lua_State *L1, lua_State *L) {\n  int i; CallInfo *ci;\n  /* initialize stack array */\n  L1->stack = luaM_newvector(L, BASIC_STACK_SIZE, TValue);\n  L1->stacksize = BASIC_STACK_SIZE;\n  for (i = 0; i < BASIC_STACK_SIZE; i++)\n    setnilvalue(L1->stack + i);  /* erase new stack */\n  L1->top = L1->stack;\n  L1->stack_last = L1->stack + L1->stacksize - EXTRA_STACK;\n  /* initialize first ci */\n  ci = &L1->base_ci;\n  ci->next = ci->previous = NULL;\n  ci->callstatus = 0;\n  ci->func = L1->top;\n  setnilvalue(L1->top++);  /* 'function' entry for this 'ci' */\n  ci->top = L1->top + LUA_MINSTACK;\n  L1->ci = ci;\n}\n\n\nstatic void freestack (lua_State *L) {\n  if (L->stack == NULL)\n    return;  /* stack not completely built yet */\n  L->ci = &L->base_ci;  /* free the entire 'ci' list */\n  luaE_freeCI(L);\n  luaM_freearray(L, L->stack, L->stacksize);  /* free stack array */\n}\n\n\n/*\n** Create registry table and its predefined values\n*/\nstatic void init_registry (lua_State *L, global_State *g) {\n  TValue temp;\n  /* create registry */\n  Table *registry = luaH_new(L);\n  sethvalue(L, &g->l_registry, registry);\n  luaH_resize(L, registry, LUA_RIDX_LAST, 0);\n  /* registry[LUA_RIDX_MAINTHREAD] = L */\n  setthvalue(L, &temp, L);  /* temp = L */\n  luaH_setint(L, registry, LUA_RIDX_MAINTHREAD, &temp);\n  /* registry[LUA_RIDX_GLOBALS] = table of globals */\n  sethvalue(L, &temp, luaH_new(L));  /* temp = new table (global table) */\n  luaH_setint(L, registry, LUA_RIDX_GLOBALS, &temp);\n}\n\n\n/*\n** open parts of the state that may cause memory-allocation errors.\n** ('g->version' != NULL flags that the state was completely build)\n*/\nstatic void f_luaopen (lua_State *L, void *ud) {\n  global_State *g = G(L);\n  UNUSED(ud);\n  stack_init(L, L);  /* init stack */\n  init_registry(L, g);\n  luaS_resize(L, MINSTRTABSIZE);  /* initial size of string table */\n  luaT_init(L);\n  luaX_init(L);\n  /* pre-create memory-error message */\n  g->memerrmsg = luaS_newliteral(L, MEMERRMSG);\n  luaC_fix(L, obj2gco(g->memerrmsg));  /* it should never be collected */\n  g->gcrunning = 1;  /* allow gc */\n  g->version = lua_version(NULL);\n  luai_userstateopen(L);\n}\n\n\n/*\n** preinitialize a thread with consistent values without allocating\n** any memory (to avoid errors)\n*/\nstatic void preinit_thread (lua_State *L, global_State *g) {\n  G(L) = g;\n  L->stack = NULL;\n  L->ci = NULL;\n  L->stacksize = 0;\n  L->twups = L;  /* thread has no upvalues */\n  L->errorJmp = NULL;\n  L->nCcalls = 0;\n  L->hook = NULL;\n  L->hookmask = 0;\n  L->basehookcount = 0;\n  L->allowhook = 1;\n  resethookcount(L);\n  L->openupval = NULL;\n  L->nny = 1;\n  L->status = LUA_OK;\n  L->errfunc = 0;\n}\n\n\nstatic void close_state (lua_State *L) {\n  global_State *g = G(L);\n  luaF_close(L, L->stack);  /* close all upvalues for this thread */\n  luaC_freeallobjects(L);  /* collect all objects */\n  if (g->version)  /* closing a fully built state? */\n    luai_userstateclose(L);\n  luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size);\n  luaZ_freebuffer(L, &g->buff);\n  freestack(L);\n  lua_assert(gettotalbytes(g) == sizeof(LG));\n  (*g->frealloc)(g->ud, fromstate(L), sizeof(LG), 0);  /* free main block */\n}\n\n\nLUA_API lua_State *lua_newthread (lua_State *L) {\n  global_State *g = G(L);\n  lua_State *L1;\n  lua_lock(L);\n  luaC_checkGC(L);\n  /* create new thread */\n  L1 = &cast(LX *, luaM_newobject(L, LUA_TTHREAD, sizeof(LX)))->l;\n  L1->marked = luaC_white(g);\n  L1->tt = LUA_TTHREAD;\n  /* link it on list 'allgc' */\n  L1->next = g->allgc;\n  g->allgc = obj2gco(L1);\n  /* anchor it on L stack */\n  setthvalue(L, L->top, L1);\n  api_incr_top(L);\n  preinit_thread(L1, g);\n  L1->hookmask = L->hookmask;\n  L1->basehookcount = L->basehookcount;\n  L1->hook = L->hook;\n  resethookcount(L1);\n  /* initialize L1 extra space */\n  memcpy(lua_getextraspace(L1), lua_getextraspace(g->mainthread),\n         LUA_EXTRASPACE);\n  luai_userstatethread(L, L1);\n  stack_init(L1, L);  /* init stack */\n  lua_unlock(L);\n  return L1;\n}\n\n\nvoid luaE_freethread (lua_State *L, lua_State *L1) {\n  LX *l = fromstate(L1);\n  luaF_close(L1, L1->stack);  /* close all upvalues for this thread */\n  lua_assert(L1->openupval == NULL);\n  luai_userstatefree(L, L1);\n  freestack(L1);\n  luaM_free(L, l);\n}\n\n\nLUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {\n  int i;\n  lua_State *L;\n  global_State *g;\n  LG *l = cast(LG *, (*f)(ud, NULL, LUA_TTHREAD, sizeof(LG)));\n  if (l == NULL) return NULL;\n  L = &l->l.l;\n  g = &l->g;\n  L->next = NULL;\n  L->tt = LUA_TTHREAD;\n  g->currentwhite = bitmask(WHITE0BIT);\n  L->marked = luaC_white(g);\n  preinit_thread(L, g);\n  g->frealloc = f;\n  g->ud = ud;\n  g->mainthread = L;\n  g->seed = makeseed(L);\n  g->gcrunning = 0;  /* no GC while building state */\n  g->GCestimate = 0;\n  g->strt.size = g->strt.nuse = 0;\n  g->strt.hash = NULL;\n  setnilvalue(&g->l_registry);\n  luaZ_initbuffer(L, &g->buff);\n  g->panic = NULL;\n  g->version = NULL;\n  g->gcstate = GCSpause;\n  g->gckind = KGC_NORMAL;\n  g->allgc = g->finobj = g->tobefnz = g->fixedgc = NULL;\n  g->sweepgc = NULL;\n  g->gray = g->grayagain = NULL;\n  g->weak = g->ephemeron = g->allweak = NULL;\n  g->twups = NULL;\n  g->totalbytes = sizeof(LG);\n  g->GCdebt = 0;\n  g->gcfinnum = 0;\n  g->gcpause = LUAI_GCPAUSE;\n  g->gcstepmul = LUAI_GCMUL;\n  for (i=0; i < LUA_NUMTAGS; i++) g->mt[i] = NULL;\n  if (luaD_rawrunprotected(L, f_luaopen, NULL) != LUA_OK) {\n    /* memory allocation error: free partial state */\n    close_state(L);\n    L = NULL;\n  }\n  return L;\n}\n\n\nLUA_API void lua_close (lua_State *L) {\n  L = G(L)->mainthread;  /* only the main thread can be closed */\n  lua_lock(L);\n  close_state(L);\n}\n\n\n"
  },
  {
    "path": "externals/lua/src/lstate.h",
    "content": "/*\n** $Id: lstate.h,v 2.119 2014/10/30 18:53:28 roberto Exp $\n** Global State\n** See Copyright Notice in lua.h\n*/\n\n#ifndef lstate_h\n#define lstate_h\n\n#include \"lua.h\"\n\n#include \"lobject.h\"\n#include \"ltm.h\"\n#include \"lzio.h\"\n\n\n/*\n\n** Some notes about garbage-collected objects: All objects in Lua must\n** be kept somehow accessible until being freed, so all objects always\n** belong to one (and only one) of these lists, using field 'next' of\n** the 'CommonHeader' for the link:\n**\n** 'allgc': all objects not marked for finalization;\n** 'finobj': all objects marked for finalization;\n** 'tobefnz': all objects ready to be finalized; \n** 'fixedgc': all objects that are not to be collected (currently\n** only small strings, such as reserved words).\n\n*/\n\n\nstruct lua_longjmp;  /* defined in ldo.c */\n\n\n\n/* extra stack space to handle TM calls and some other extras */\n#define EXTRA_STACK   5\n\n\n#define BASIC_STACK_SIZE        (2*LUA_MINSTACK)\n\n\n/* kinds of Garbage Collection */\n#define KGC_NORMAL\t0\n#define KGC_EMERGENCY\t1\t/* gc was forced by an allocation failure */\n\n\ntypedef struct stringtable {\n  TString **hash;\n  int nuse;  /* number of elements */\n  int size;\n} stringtable;\n\n\n/*\n** Information about a call.\n** When a thread yields, 'func' is adjusted to pretend that the\n** top function has only the yielded values in its stack; in that\n** case, the actual 'func' value is saved in field 'extra'. \n** When a function calls another with a continuation, 'extra' keeps\n** the function index so that, in case of errors, the continuation\n** function can be called with the correct top.\n*/\ntypedef struct CallInfo {\n  StkId func;  /* function index in the stack */\n  StkId\ttop;  /* top for this function */\n  struct CallInfo *previous, *next;  /* dynamic call link */\n  union {\n    struct {  /* only for Lua functions */\n      StkId base;  /* base for this function */\n      const Instruction *savedpc;\n    } l;\n    struct {  /* only for C functions */\n      lua_KFunction k;  /* continuation in case of yields */\n      ptrdiff_t old_errfunc;\n      lua_KContext ctx;  /* context info. in case of yields */\n    } c;\n  } u;\n  ptrdiff_t extra;\n  short nresults;  /* expected number of results from this function */\n  lu_byte callstatus;\n} CallInfo;\n\n\n/*\n** Bits in CallInfo status\n*/\n#define CIST_OAH\t(1<<0)\t/* original value of 'allowhook' */\n#define CIST_LUA\t(1<<1)\t/* call is running a Lua function */\n#define CIST_HOOKED\t(1<<2)\t/* call is running a debug hook */\n#define CIST_REENTRY\t(1<<3)\t/* call is running on same invocation of\n                                   luaV_execute of previous call */\n#define CIST_YPCALL\t(1<<4)\t/* call is a yieldable protected call */\n#define CIST_TAIL\t(1<<5)\t/* call was tail called */\n#define CIST_HOOKYIELD\t(1<<6)\t/* last hook called yielded */\n\n#define isLua(ci)\t((ci)->callstatus & CIST_LUA)\n\n/* assume that CIST_OAH has offset 0 and that 'v' is strictly 0/1 */\n#define setoah(st,v)\t((st) = ((st) & ~CIST_OAH) | (v))\n#define getoah(st)\t((st) & CIST_OAH)\n\n\n/*\n** 'global state', shared by all threads of this state\n*/\ntypedef struct global_State {\n  lua_Alloc frealloc;  /* function to reallocate memory */\n  void *ud;         /* auxiliary data to 'frealloc' */\n  lu_mem totalbytes;  /* number of bytes currently allocated - GCdebt */\n  l_mem GCdebt;  /* bytes allocated not yet compensated by the collector */\n  lu_mem GCmemtrav;  /* memory traversed by the GC */\n  lu_mem GCestimate;  /* an estimate of the non-garbage memory in use */\n  stringtable strt;  /* hash table for strings */\n  TValue l_registry;\n  unsigned int seed;  /* randomized seed for hashes */\n  lu_byte currentwhite;\n  lu_byte gcstate;  /* state of garbage collector */\n  lu_byte gckind;  /* kind of GC running */\n  lu_byte gcrunning;  /* true if GC is running */\n  GCObject *allgc;  /* list of all collectable objects */\n  GCObject **sweepgc;  /* current position of sweep in list */\n  GCObject *finobj;  /* list of collectable objects with finalizers */\n  GCObject *gray;  /* list of gray objects */\n  GCObject *grayagain;  /* list of objects to be traversed atomically */\n  GCObject *weak;  /* list of tables with weak values */\n  GCObject *ephemeron;  /* list of ephemeron tables (weak keys) */\n  GCObject *allweak;  /* list of all-weak tables */\n  GCObject *tobefnz;  /* list of userdata to be GC */\n  GCObject *fixedgc;  /* list of objects not to be collected */\n  struct lua_State *twups;  /* list of threads with open upvalues */\n  Mbuffer buff;  /* temporary buffer for string concatenation */\n  unsigned int gcfinnum;  /* number of finalizers to call in each GC step */\n  int gcpause;  /* size of pause between successive GCs */\n  int gcstepmul;  /* GC 'granularity' */\n  lua_CFunction panic;  /* to be called in unprotected errors */\n  struct lua_State *mainthread;\n  const lua_Number *version;  /* pointer to version number */\n  TString *memerrmsg;  /* memory-error message */\n  TString *tmname[TM_N];  /* array with tag-method names */\n  struct Table *mt[LUA_NUMTAGS];  /* metatables for basic types */\n} global_State;\n\n\n/*\n** 'per thread' state\n*/\nstruct lua_State {\n  CommonHeader;\n  lu_byte status;\n  StkId top;  /* first free slot in the stack */\n  global_State *l_G;\n  CallInfo *ci;  /* call info for current function */\n  const Instruction *oldpc;  /* last pc traced */\n  StkId stack_last;  /* last free slot in the stack */\n  StkId stack;  /* stack base */\n  UpVal *openupval;  /* list of open upvalues in this stack */\n  GCObject *gclist;\n  struct lua_State *twups;  /* list of threads with open upvalues */\n  struct lua_longjmp *errorJmp;  /* current error recover point */\n  CallInfo base_ci;  /* CallInfo for first level (C calling Lua) */\n  lua_Hook hook;\n  ptrdiff_t errfunc;  /* current error handling function (stack index) */\n  int stacksize;\n  int basehookcount;\n  int hookcount;\n  unsigned short nny;  /* number of non-yieldable calls in stack */\n  unsigned short nCcalls;  /* number of nested C calls */\n  lu_byte hookmask;\n  lu_byte allowhook;\n};\n\n\n#define G(L)\t(L->l_G)\n\n\n/*\n** Union of all collectable objects (only for conversions)\n*/\nunion GCUnion {\n  GCObject gc;  /* common header */\n  struct TString ts;\n  struct Udata u;\n  union Closure cl;\n  struct Table h;\n  struct Proto p;\n  struct lua_State th;  /* thread */\n};\n\n\n#define cast_u(o)\tcast(union GCUnion *, (o))\n\n/* macros to convert a GCObject into a specific value */\n#define gco2ts(o)  \\\n\tcheck_exp(novariant((o)->tt) == LUA_TSTRING, &((cast_u(o))->ts))\n#define gco2u(o)  check_exp((o)->tt == LUA_TUSERDATA, &((cast_u(o))->u))\n#define gco2lcl(o)  check_exp((o)->tt == LUA_TLCL, &((cast_u(o))->cl.l))\n#define gco2ccl(o)  check_exp((o)->tt == LUA_TCCL, &((cast_u(o))->cl.c))\n#define gco2cl(o)  \\\n\tcheck_exp(novariant((o)->tt) == LUA_TFUNCTION, &((cast_u(o))->cl))\n#define gco2t(o)  check_exp((o)->tt == LUA_TTABLE, &((cast_u(o))->h))\n#define gco2p(o)  check_exp((o)->tt == LUA_TPROTO, &((cast_u(o))->p))\n#define gco2th(o)  check_exp((o)->tt == LUA_TTHREAD, &((cast_u(o))->th))\n\n\n/* macro to convert a Lua object into a GCObject */\n#define obj2gco(v) \\\n\tcheck_exp(novariant((v)->tt) < LUA_TDEADKEY, (&(cast_u(v)->gc)))\n\n\n/* actual number of total bytes allocated */\n#define gettotalbytes(g)\t((g)->totalbytes + (g)->GCdebt)\n\nLUAI_FUNC void luaE_setdebt (global_State *g, l_mem debt);\nLUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1);\nLUAI_FUNC CallInfo *luaE_extendCI (lua_State *L);\nLUAI_FUNC void luaE_freeCI (lua_State *L);\nLUAI_FUNC void luaE_shrinkCI (lua_State *L);\n\n\n#endif\n\n"
  },
  {
    "path": "externals/lua/src/lstring.c",
    "content": "/*\n** $Id: lstring.c,v 2.45 2014/11/02 19:19:04 roberto Exp $\n** String table (keeps all strings handled by Lua)\n** See Copyright Notice in lua.h\n*/\n\n#define lstring_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"ldebug.h\"\n#include \"ldo.h\"\n#include \"lmem.h\"\n#include \"lobject.h\"\n#include \"lstate.h\"\n#include \"lstring.h\"\n\n\n\n/*\n** Lua will use at most ~(2^LUAI_HASHLIMIT) bytes from a string to\n** compute its hash\n*/\n#if !defined(LUAI_HASHLIMIT)\n#define LUAI_HASHLIMIT\t\t5\n#endif\n\n\n/*\n** equality for long strings\n*/\nint luaS_eqlngstr (TString *a, TString *b) {\n  size_t len = a->len;\n  lua_assert(a->tt == LUA_TLNGSTR && b->tt == LUA_TLNGSTR);\n  return (a == b) ||  /* same instance or... */\n    ((len == b->len) &&  /* equal length and ... */\n     (memcmp(getstr(a), getstr(b), len) == 0));  /* equal contents */\n}\n\n\nunsigned int luaS_hash (const char *str, size_t l, unsigned int seed) {\n  unsigned int h = seed ^ cast(unsigned int, l);\n  size_t l1;\n  size_t step = (l >> LUAI_HASHLIMIT) + 1;\n  for (l1 = l; l1 >= step; l1 -= step)\n    h = h ^ ((h<<5) + (h>>2) + cast_byte(str[l1 - 1]));\n  return h;\n}\n\n\n/*\n** resizes the string table\n*/\nvoid luaS_resize (lua_State *L, int newsize) {\n  int i;\n  stringtable *tb = &G(L)->strt;\n  if (newsize > tb->size) {  /* grow table if needed */\n    luaM_reallocvector(L, tb->hash, tb->size, newsize, TString *);\n    for (i = tb->size; i < newsize; i++)\n      tb->hash[i] = NULL;\n  }\n  for (i = 0; i < tb->size; i++) {  /* rehash */\n    TString *p = tb->hash[i];\n    tb->hash[i] = NULL;\n    while (p) {  /* for each node in the list */\n      TString *hnext = p->hnext;  /* save next */\n      unsigned int h = lmod(p->hash, newsize);  /* new position */\n      p->hnext = tb->hash[h];  /* chain it */\n      tb->hash[h] = p;\n      p = hnext;\n    }\n  }\n  if (newsize < tb->size) {  /* shrink table if needed */\n    /* vanishing slice should be empty */\n    lua_assert(tb->hash[newsize] == NULL && tb->hash[tb->size - 1] == NULL);\n    luaM_reallocvector(L, tb->hash, tb->size, newsize, TString *);\n  }\n  tb->size = newsize;\n}\n\n\n\n/*\n** creates a new string object\n*/\nstatic TString *createstrobj (lua_State *L, const char *str, size_t l,\n                              int tag, unsigned int h) {\n  TString *ts;\n  GCObject *o;\n  size_t totalsize;  /* total size of TString object */\n  totalsize = sizelstring(l);\n  o = luaC_newobj(L, tag, totalsize);\n  ts = gco2ts(o);\n  ts->len = l;\n  ts->hash = h;\n  ts->extra = 0;\n  memcpy(getaddrstr(ts), str, l * sizeof(char));\n  getaddrstr(ts)[l] = '\\0';  /* ending 0 */\n  return ts;\n}\n\n\nvoid luaS_remove (lua_State *L, TString *ts) {\n  stringtable *tb = &G(L)->strt;\n  TString **p = &tb->hash[lmod(ts->hash, tb->size)];\n  while (*p != ts)  /* find previous element */\n    p = &(*p)->hnext;\n  *p = (*p)->hnext;  /* remove element from its list */\n  tb->nuse--;\n}\n\n\n/*\n** checks whether short string exists and reuses it or creates a new one\n*/\nstatic TString *internshrstr (lua_State *L, const char *str, size_t l) {\n  TString *ts;\n  global_State *g = G(L);\n  unsigned int h = luaS_hash(str, l, g->seed);\n  TString **list = &g->strt.hash[lmod(h, g->strt.size)];\n  for (ts = *list; ts != NULL; ts = ts->hnext) {\n    if (l == ts->len &&\n        (memcmp(str, getstr(ts), l * sizeof(char)) == 0)) {\n      /* found! */\n      if (isdead(g, ts))  /* dead (but not collected yet)? */\n        changewhite(ts);  /* resurrect it */\n      return ts;\n    }\n  }\n  if (g->strt.nuse >= g->strt.size && g->strt.size <= MAX_INT/2) {\n    luaS_resize(L, g->strt.size * 2);\n    list = &g->strt.hash[lmod(h, g->strt.size)];  /* recompute with new size */\n  }\n  ts = createstrobj(L, str, l, LUA_TSHRSTR, h);\n  ts->hnext = *list;\n  *list = ts;\n  g->strt.nuse++;\n  return ts;\n}\n\n\n/*\n** new string (with explicit length)\n*/\nTString *luaS_newlstr (lua_State *L, const char *str, size_t l) {\n  if (l <= LUAI_MAXSHORTLEN)  /* short string? */\n    return internshrstr(L, str, l);\n  else {\n    if (l + 1 > (MAX_SIZE - sizeof(TString))/sizeof(char))\n      luaM_toobig(L);\n    return createstrobj(L, str, l, LUA_TLNGSTR, G(L)->seed);\n  }\n}\n\n\n/*\n** new zero-terminated string\n*/\nTString *luaS_new (lua_State *L, const char *str) {\n  return luaS_newlstr(L, str, strlen(str));\n}\n\n\nUdata *luaS_newudata (lua_State *L, size_t s) {\n  Udata *u;\n  GCObject *o;\n  if (s > MAX_SIZE - sizeof(Udata))\n    luaM_toobig(L);\n  o = luaC_newobj(L, LUA_TUSERDATA, sizeludata(s));\n  u = gco2u(o);\n  u->len = s;\n  u->metatable = NULL;\n  setuservalue(L, u, luaO_nilobject);\n  return u;\n}\n\n"
  },
  {
    "path": "externals/lua/src/lstring.h",
    "content": "/*\n** $Id: lstring.h,v 1.56 2014/07/18 14:46:47 roberto Exp $\n** String table (keep all strings handled by Lua)\n** See Copyright Notice in lua.h\n*/\n\n#ifndef lstring_h\n#define lstring_h\n\n#include \"lgc.h\"\n#include \"lobject.h\"\n#include \"lstate.h\"\n\n\n#define sizelstring(l)  (sizeof(union UTString) + ((l) + 1) * sizeof(char))\n#define sizestring(s)\tsizelstring((s)->len)\n\n#define sizeludata(l)\t(sizeof(union UUdata) + (l))\n#define sizeudata(u)\tsizeludata((u)->len)\n\n#define luaS_newliteral(L, s)\t(luaS_newlstr(L, \"\" s, \\\n                                 (sizeof(s)/sizeof(char))-1))\n\n\n/*\n** test whether a string is a reserved word\n*/\n#define isreserved(s)\t((s)->tt == LUA_TSHRSTR && (s)->extra > 0)\n\n\n/*\n** equality for short strings, which are always internalized\n*/\n#define eqshrstr(a,b)\tcheck_exp((a)->tt == LUA_TSHRSTR, (a) == (b))\n\n\nLUAI_FUNC unsigned int luaS_hash (const char *str, size_t l, unsigned int seed);\nLUAI_FUNC int luaS_eqlngstr (TString *a, TString *b);\nLUAI_FUNC void luaS_resize (lua_State *L, int newsize);\nLUAI_FUNC void luaS_remove (lua_State *L, TString *ts);\nLUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s);\nLUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l);\nLUAI_FUNC TString *luaS_new (lua_State *L, const char *str);\n\n\n#endif\n"
  },
  {
    "path": "externals/lua/src/lstrlib.c",
    "content": "/*\n** $Id: lstrlib.c,v 1.221 2014/12/11 14:03:07 roberto Exp $\n** Standard library for string operations and pattern-matching\n** See Copyright Notice in lua.h\n*/\n\n#define lstrlib_c\n#define LUA_LIB\n\n#include \"lprefix.h\"\n\n\n#include <ctype.h>\n#include <limits.h>\n#include <stddef.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"lauxlib.h\"\n#include \"lualib.h\"\n\n\n/*\n** maximum number of captures that a pattern can do during\n** pattern-matching. This limit is arbitrary.\n*/\n#if !defined(LUA_MAXCAPTURES)\n#define LUA_MAXCAPTURES\t\t32\n#endif\n\n\n/* macro to 'unsign' a character */\n#define uchar(c)\t((unsigned char)(c))\n\n\n/*\n** Some sizes are better limited to fit in 'int', but must also fit in\n** 'size_t'. (We assume that 'lua_Integer' cannot be smaller than 'int'.)\n*/\n#define MAXSIZE  \\\n\t(sizeof(size_t) < sizeof(int) ? (~(size_t)0) : (size_t)(INT_MAX))\n\n\n\n\nstatic int str_len (lua_State *L) {\n  size_t l;\n  luaL_checklstring(L, 1, &l);\n  lua_pushinteger(L, (lua_Integer)l);\n  return 1;\n}\n\n\n/* translate a relative string position: negative means back from end */\nstatic lua_Integer posrelat (lua_Integer pos, size_t len) {\n  if (pos >= 0) return pos;\n  else if (0u - (size_t)pos > len) return 0;\n  else return (lua_Integer)len + pos + 1;\n}\n\n\nstatic int str_sub (lua_State *L) {\n  size_t l;\n  const char *s = luaL_checklstring(L, 1, &l);\n  lua_Integer start = posrelat(luaL_checkinteger(L, 2), l);\n  lua_Integer end = posrelat(luaL_optinteger(L, 3, -1), l);\n  if (start < 1) start = 1;\n  if (end > (lua_Integer)l) end = l;\n  if (start <= end)\n    lua_pushlstring(L, s + start - 1, (size_t)(end - start + 1));\n  else lua_pushliteral(L, \"\");\n  return 1;\n}\n\n\nstatic int str_reverse (lua_State *L) {\n  size_t l, i;\n  luaL_Buffer b;\n  const char *s = luaL_checklstring(L, 1, &l);\n  char *p = luaL_buffinitsize(L, &b, l);\n  for (i = 0; i < l; i++)\n    p[i] = s[l - i - 1];\n  luaL_pushresultsize(&b, l);\n  return 1;\n}\n\n\nstatic int str_lower (lua_State *L) {\n  size_t l;\n  size_t i;\n  luaL_Buffer b;\n  const char *s = luaL_checklstring(L, 1, &l);\n  char *p = luaL_buffinitsize(L, &b, l);\n  for (i=0; i<l; i++)\n    p[i] = tolower(uchar(s[i]));\n  luaL_pushresultsize(&b, l);\n  return 1;\n}\n\n\nstatic int str_upper (lua_State *L) {\n  size_t l;\n  size_t i;\n  luaL_Buffer b;\n  const char *s = luaL_checklstring(L, 1, &l);\n  char *p = luaL_buffinitsize(L, &b, l);\n  for (i=0; i<l; i++)\n    p[i] = toupper(uchar(s[i]));\n  luaL_pushresultsize(&b, l);\n  return 1;\n}\n\n\nstatic int str_rep (lua_State *L) {\n  size_t l, lsep;\n  const char *s = luaL_checklstring(L, 1, &l);\n  lua_Integer n = luaL_checkinteger(L, 2);\n  const char *sep = luaL_optlstring(L, 3, \"\", &lsep);\n  if (n <= 0) lua_pushliteral(L, \"\");\n  else if (l + lsep < l || l + lsep > MAXSIZE / n)  /* may overflow? */\n    return luaL_error(L, \"resulting string too large\");\n  else {\n    size_t totallen = (size_t)n * l + (size_t)(n - 1) * lsep;\n    luaL_Buffer b;\n    char *p = luaL_buffinitsize(L, &b, totallen);\n    while (n-- > 1) {  /* first n-1 copies (followed by separator) */\n      memcpy(p, s, l * sizeof(char)); p += l;\n      if (lsep > 0) {  /* empty 'memcpy' is not that cheap */\n        memcpy(p, sep, lsep * sizeof(char));\n        p += lsep;\n      }\n    }\n    memcpy(p, s, l * sizeof(char));  /* last copy (not followed by separator) */\n    luaL_pushresultsize(&b, totallen);\n  }\n  return 1;\n}\n\n\nstatic int str_byte (lua_State *L) {\n  size_t l;\n  const char *s = luaL_checklstring(L, 1, &l);\n  lua_Integer posi = posrelat(luaL_optinteger(L, 2, 1), l);\n  lua_Integer pose = posrelat(luaL_optinteger(L, 3, posi), l);\n  int n, i;\n  if (posi < 1) posi = 1;\n  if (pose > (lua_Integer)l) pose = l;\n  if (posi > pose) return 0;  /* empty interval; return no values */\n  n = (int)(pose -  posi + 1);\n  if (posi + n <= pose)  /* arithmetic overflow? */\n    return luaL_error(L, \"string slice too long\");\n  luaL_checkstack(L, n, \"string slice too long\");\n  for (i=0; i<n; i++)\n    lua_pushinteger(L, uchar(s[posi+i-1]));\n  return n;\n}\n\n\nstatic int str_char (lua_State *L) {\n  int n = lua_gettop(L);  /* number of arguments */\n  int i;\n  luaL_Buffer b;\n  char *p = luaL_buffinitsize(L, &b, n);\n  for (i=1; i<=n; i++) {\n    lua_Integer c = luaL_checkinteger(L, i);\n    luaL_argcheck(L, uchar(c) == c, i, \"value out of range\");\n    p[i - 1] = uchar(c);\n  }\n  luaL_pushresultsize(&b, n);\n  return 1;\n}\n\n\nstatic int writer (lua_State *L, const void *b, size_t size, void *B) {\n  (void)L;\n  luaL_addlstring((luaL_Buffer *) B, (const char *)b, size);\n  return 0;\n}\n\n\nstatic int str_dump (lua_State *L) {\n  luaL_Buffer b;\n  int strip = lua_toboolean(L, 2);\n  luaL_checktype(L, 1, LUA_TFUNCTION);\n  lua_settop(L, 1);\n  luaL_buffinit(L,&b);\n  if (lua_dump(L, writer, &b, strip) != 0)\n    return luaL_error(L, \"unable to dump given function\");\n  luaL_pushresult(&b);\n  return 1;\n}\n\n\n\n/*\n** {======================================================\n** PATTERN MATCHING\n** =======================================================\n*/\n\n\n#define CAP_UNFINISHED\t(-1)\n#define CAP_POSITION\t(-2)\n\n\ntypedef struct MatchState {\n  int matchdepth;  /* control for recursive depth (to avoid C stack overflow) */\n  const char *src_init;  /* init of source string */\n  const char *src_end;  /* end ('\\0') of source string */\n  const char *p_end;  /* end ('\\0') of pattern */\n  lua_State *L;\n  int level;  /* total number of captures (finished or unfinished) */\n  struct {\n    const char *init;\n    ptrdiff_t len;\n  } capture[LUA_MAXCAPTURES];\n} MatchState;\n\n\n/* recursive function */\nstatic const char *match (MatchState *ms, const char *s, const char *p);\n\n\n/* maximum recursion depth for 'match' */\n#if !defined(MAXCCALLS)\n#define MAXCCALLS\t200\n#endif\n\n\n#define L_ESC\t\t'%'\n#define SPECIALS\t\"^$*+?.([%-\"\n\n\nstatic int check_capture (MatchState *ms, int l) {\n  l -= '1';\n  if (l < 0 || l >= ms->level || ms->capture[l].len == CAP_UNFINISHED)\n    return luaL_error(ms->L, \"invalid capture index %%%d\", l + 1);\n  return l;\n}\n\n\nstatic int capture_to_close (MatchState *ms) {\n  int level = ms->level;\n  for (level--; level>=0; level--)\n    if (ms->capture[level].len == CAP_UNFINISHED) return level;\n  return luaL_error(ms->L, \"invalid pattern capture\");\n}\n\n\nstatic const char *classend (MatchState *ms, const char *p) {\n  switch (*p++) {\n    case L_ESC: {\n      if (p == ms->p_end)\n        luaL_error(ms->L, \"malformed pattern (ends with '%%')\");\n      return p+1;\n    }\n    case '[': {\n      if (*p == '^') p++;\n      do {  /* look for a ']' */\n        if (p == ms->p_end)\n          luaL_error(ms->L, \"malformed pattern (missing ']')\");\n        if (*(p++) == L_ESC && p < ms->p_end)\n          p++;  /* skip escapes (e.g. '%]') */\n      } while (*p != ']');\n      return p+1;\n    }\n    default: {\n      return p;\n    }\n  }\n}\n\n\nstatic int match_class (int c, int cl) {\n  int res;\n  switch (tolower(cl)) {\n    case 'a' : res = isalpha(c); break;\n    case 'c' : res = iscntrl(c); break;\n    case 'd' : res = isdigit(c); break;\n    case 'g' : res = isgraph(c); break;\n    case 'l' : res = islower(c); break;\n    case 'p' : res = ispunct(c); break;\n    case 's' : res = isspace(c); break;\n    case 'u' : res = isupper(c); break;\n    case 'w' : res = isalnum(c); break;\n    case 'x' : res = isxdigit(c); break;\n    case 'z' : res = (c == 0); break;  /* deprecated option */\n    default: return (cl == c);\n  }\n  return (islower(cl) ? res : !res);\n}\n\n\nstatic int matchbracketclass (int c, const char *p, const char *ec) {\n  int sig = 1;\n  if (*(p+1) == '^') {\n    sig = 0;\n    p++;  /* skip the '^' */\n  }\n  while (++p < ec) {\n    if (*p == L_ESC) {\n      p++;\n      if (match_class(c, uchar(*p)))\n        return sig;\n    }\n    else if ((*(p+1) == '-') && (p+2 < ec)) {\n      p+=2;\n      if (uchar(*(p-2)) <= c && c <= uchar(*p))\n        return sig;\n    }\n    else if (uchar(*p) == c) return sig;\n  }\n  return !sig;\n}\n\n\nstatic int singlematch (MatchState *ms, const char *s, const char *p,\n                        const char *ep) {\n  if (s >= ms->src_end)\n    return 0;\n  else {\n    int c = uchar(*s);\n    switch (*p) {\n      case '.': return 1;  /* matches any char */\n      case L_ESC: return match_class(c, uchar(*(p+1)));\n      case '[': return matchbracketclass(c, p, ep-1);\n      default:  return (uchar(*p) == c);\n    }\n  }\n}\n\n\nstatic const char *matchbalance (MatchState *ms, const char *s,\n                                   const char *p) {\n  if (p >= ms->p_end - 1)\n    luaL_error(ms->L, \"malformed pattern (missing arguments to '%%b')\");\n  if (*s != *p) return NULL;\n  else {\n    int b = *p;\n    int e = *(p+1);\n    int cont = 1;\n    while (++s < ms->src_end) {\n      if (*s == e) {\n        if (--cont == 0) return s+1;\n      }\n      else if (*s == b) cont++;\n    }\n  }\n  return NULL;  /* string ends out of balance */\n}\n\n\nstatic const char *max_expand (MatchState *ms, const char *s,\n                                 const char *p, const char *ep) {\n  ptrdiff_t i = 0;  /* counts maximum expand for item */\n  while (singlematch(ms, s + i, p, ep))\n    i++;\n  /* keeps trying to match with the maximum repetitions */\n  while (i>=0) {\n    const char *res = match(ms, (s+i), ep+1);\n    if (res) return res;\n    i--;  /* else didn't match; reduce 1 repetition to try again */\n  }\n  return NULL;\n}\n\n\nstatic const char *min_expand (MatchState *ms, const char *s,\n                                 const char *p, const char *ep) {\n  for (;;) {\n    const char *res = match(ms, s, ep+1);\n    if (res != NULL)\n      return res;\n    else if (singlematch(ms, s, p, ep))\n      s++;  /* try with one more repetition */\n    else return NULL;\n  }\n}\n\n\nstatic const char *start_capture (MatchState *ms, const char *s,\n                                    const char *p, int what) {\n  const char *res;\n  int level = ms->level;\n  if (level >= LUA_MAXCAPTURES) luaL_error(ms->L, \"too many captures\");\n  ms->capture[level].init = s;\n  ms->capture[level].len = what;\n  ms->level = level+1;\n  if ((res=match(ms, s, p)) == NULL)  /* match failed? */\n    ms->level--;  /* undo capture */\n  return res;\n}\n\n\nstatic const char *end_capture (MatchState *ms, const char *s,\n                                  const char *p) {\n  int l = capture_to_close(ms);\n  const char *res;\n  ms->capture[l].len = s - ms->capture[l].init;  /* close capture */\n  if ((res = match(ms, s, p)) == NULL)  /* match failed? */\n    ms->capture[l].len = CAP_UNFINISHED;  /* undo capture */\n  return res;\n}\n\n\nstatic const char *match_capture (MatchState *ms, const char *s, int l) {\n  size_t len;\n  l = check_capture(ms, l);\n  len = ms->capture[l].len;\n  if ((size_t)(ms->src_end-s) >= len &&\n      memcmp(ms->capture[l].init, s, len) == 0)\n    return s+len;\n  else return NULL;\n}\n\n\nstatic const char *match (MatchState *ms, const char *s, const char *p) {\n  if (ms->matchdepth-- == 0)\n    luaL_error(ms->L, \"pattern too complex\");\n  init: /* using goto's to optimize tail recursion */\n  if (p != ms->p_end) {  /* end of pattern? */\n    switch (*p) {\n      case '(': {  /* start capture */\n        if (*(p + 1) == ')')  /* position capture? */\n          s = start_capture(ms, s, p + 2, CAP_POSITION);\n        else\n          s = start_capture(ms, s, p + 1, CAP_UNFINISHED);\n        break;\n      }\n      case ')': {  /* end capture */\n        s = end_capture(ms, s, p + 1);\n        break;\n      }\n      case '$': {\n        if ((p + 1) != ms->p_end)  /* is the '$' the last char in pattern? */\n          goto dflt;  /* no; go to default */\n        s = (s == ms->src_end) ? s : NULL;  /* check end of string */\n        break;\n      }\n      case L_ESC: {  /* escaped sequences not in the format class[*+?-]? */\n        switch (*(p + 1)) {\n          case 'b': {  /* balanced string? */\n            s = matchbalance(ms, s, p + 2);\n            if (s != NULL) {\n              p += 4; goto init;  /* return match(ms, s, p + 4); */\n            }  /* else fail (s == NULL) */\n            break;\n          }\n          case 'f': {  /* frontier? */\n            const char *ep; char previous;\n            p += 2;\n            if (*p != '[')\n              luaL_error(ms->L, \"missing '[' after '%%f' in pattern\");\n            ep = classend(ms, p);  /* points to what is next */\n            previous = (s == ms->src_init) ? '\\0' : *(s - 1);\n            if (!matchbracketclass(uchar(previous), p, ep - 1) &&\n               matchbracketclass(uchar(*s), p, ep - 1)) {\n              p = ep; goto init;  /* return match(ms, s, ep); */\n            }\n            s = NULL;  /* match failed */\n            break;\n          }\n          case '0': case '1': case '2': case '3':\n          case '4': case '5': case '6': case '7':\n          case '8': case '9': {  /* capture results (%0-%9)? */\n            s = match_capture(ms, s, uchar(*(p + 1)));\n            if (s != NULL) {\n              p += 2; goto init;  /* return match(ms, s, p + 2) */\n            }\n            break;\n          }\n          default: goto dflt;\n        }\n        break;\n      }\n      default: dflt: {  /* pattern class plus optional suffix */\n        const char *ep = classend(ms, p);  /* points to optional suffix */\n        /* does not match at least once? */\n        if (!singlematch(ms, s, p, ep)) {\n          if (*ep == '*' || *ep == '?' || *ep == '-') {  /* accept empty? */\n            p = ep + 1; goto init;  /* return match(ms, s, ep + 1); */\n          }\n          else  /* '+' or no suffix */\n            s = NULL;  /* fail */\n        }\n        else {  /* matched once */\n          switch (*ep) {  /* handle optional suffix */\n            case '?': {  /* optional */\n              const char *res;\n              if ((res = match(ms, s + 1, ep + 1)) != NULL)\n                s = res;\n              else {\n                p = ep + 1; goto init;  /* else return match(ms, s, ep + 1); */\n              }\n              break;\n            }\n            case '+':  /* 1 or more repetitions */\n              s++;  /* 1 match already done */\n              /* go through */\n            case '*':  /* 0 or more repetitions */\n              s = max_expand(ms, s, p, ep);\n              break;\n            case '-':  /* 0 or more repetitions (minimum) */\n              s = min_expand(ms, s, p, ep);\n              break;\n            default:  /* no suffix */\n              s++; p = ep; goto init;  /* return match(ms, s + 1, ep); */\n          }\n        }\n        break;\n      }\n    }\n  }\n  ms->matchdepth++;\n  return s;\n}\n\n\n\nstatic const char *lmemfind (const char *s1, size_t l1,\n                               const char *s2, size_t l2) {\n  if (l2 == 0) return s1;  /* empty strings are everywhere */\n  else if (l2 > l1) return NULL;  /* avoids a negative 'l1' */\n  else {\n    const char *init;  /* to search for a '*s2' inside 's1' */\n    l2--;  /* 1st char will be checked by 'memchr' */\n    l1 = l1-l2;  /* 's2' cannot be found after that */\n    while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) {\n      init++;   /* 1st char is already checked */\n      if (memcmp(init, s2+1, l2) == 0)\n        return init-1;\n      else {  /* correct 'l1' and 's1' to try again */\n        l1 -= init-s1;\n        s1 = init;\n      }\n    }\n    return NULL;  /* not found */\n  }\n}\n\n\nstatic void push_onecapture (MatchState *ms, int i, const char *s,\n                                                    const char *e) {\n  if (i >= ms->level) {\n    if (i == 0)  /* ms->level == 0, too */\n      lua_pushlstring(ms->L, s, e - s);  /* add whole match */\n    else\n      luaL_error(ms->L, \"invalid capture index %%%d\", i + 1);\n  }\n  else {\n    ptrdiff_t l = ms->capture[i].len;\n    if (l == CAP_UNFINISHED) luaL_error(ms->L, \"unfinished capture\");\n    if (l == CAP_POSITION)\n      lua_pushinteger(ms->L, ms->capture[i].init - ms->src_init + 1);\n    else\n      lua_pushlstring(ms->L, ms->capture[i].init, l);\n  }\n}\n\n\nstatic int push_captures (MatchState *ms, const char *s, const char *e) {\n  int i;\n  int nlevels = (ms->level == 0 && s) ? 1 : ms->level;\n  luaL_checkstack(ms->L, nlevels, \"too many captures\");\n  for (i = 0; i < nlevels; i++)\n    push_onecapture(ms, i, s, e);\n  return nlevels;  /* number of strings pushed */\n}\n\n\n/* check whether pattern has no special characters */\nstatic int nospecials (const char *p, size_t l) {\n  size_t upto = 0;\n  do {\n    if (strpbrk(p + upto, SPECIALS))\n      return 0;  /* pattern has a special character */\n    upto += strlen(p + upto) + 1;  /* may have more after \\0 */\n  } while (upto <= l);\n  return 1;  /* no special chars found */\n}\n\n\nstatic int str_find_aux (lua_State *L, int find) {\n  size_t ls, lp;\n  const char *s = luaL_checklstring(L, 1, &ls);\n  const char *p = luaL_checklstring(L, 2, &lp);\n  lua_Integer init = posrelat(luaL_optinteger(L, 3, 1), ls);\n  if (init < 1) init = 1;\n  else if (init > (lua_Integer)ls + 1) {  /* start after string's end? */\n    lua_pushnil(L);  /* cannot find anything */\n    return 1;\n  }\n  /* explicit request or no special characters? */\n  if (find && (lua_toboolean(L, 4) || nospecials(p, lp))) {\n    /* do a plain search */\n    const char *s2 = lmemfind(s + init - 1, ls - (size_t)init + 1, p, lp);\n    if (s2) {\n      lua_pushinteger(L, s2 - s + 1);\n      lua_pushinteger(L, s2 - s + lp);\n      return 2;\n    }\n  }\n  else {\n    MatchState ms;\n    const char *s1 = s + init - 1;\n    int anchor = (*p == '^');\n    if (anchor) {\n      p++; lp--;  /* skip anchor character */\n    }\n    ms.L = L;\n    ms.matchdepth = MAXCCALLS;\n    ms.src_init = s;\n    ms.src_end = s + ls;\n    ms.p_end = p + lp;\n    do {\n      const char *res;\n      ms.level = 0;\n      lua_assert(ms.matchdepth == MAXCCALLS);\n      if ((res=match(&ms, s1, p)) != NULL) {\n        if (find) {\n          lua_pushinteger(L, s1 - s + 1);  /* start */\n          lua_pushinteger(L, res - s);   /* end */\n          return push_captures(&ms, NULL, 0) + 2;\n        }\n        else\n          return push_captures(&ms, s1, res);\n      }\n    } while (s1++ < ms.src_end && !anchor);\n  }\n  lua_pushnil(L);  /* not found */\n  return 1;\n}\n\n\nstatic int str_find (lua_State *L) {\n  return str_find_aux(L, 1);\n}\n\n\nstatic int str_match (lua_State *L) {\n  return str_find_aux(L, 0);\n}\n\n\nstatic int gmatch_aux (lua_State *L) {\n  MatchState ms;\n  size_t ls, lp;\n  const char *s = lua_tolstring(L, lua_upvalueindex(1), &ls);\n  const char *p = lua_tolstring(L, lua_upvalueindex(2), &lp);\n  const char *src;\n  ms.L = L;\n  ms.matchdepth = MAXCCALLS;\n  ms.src_init = s;\n  ms.src_end = s+ls;\n  ms.p_end = p + lp;\n  for (src = s + (size_t)lua_tointeger(L, lua_upvalueindex(3));\n       src <= ms.src_end;\n       src++) {\n    const char *e;\n    ms.level = 0;\n    lua_assert(ms.matchdepth == MAXCCALLS);\n    if ((e = match(&ms, src, p)) != NULL) {\n      lua_Integer newstart = e-s;\n      if (e == src) newstart++;  /* empty match? go at least one position */\n      lua_pushinteger(L, newstart);\n      lua_replace(L, lua_upvalueindex(3));\n      return push_captures(&ms, src, e);\n    }\n  }\n  return 0;  /* not found */\n}\n\n\nstatic int gmatch (lua_State *L) {\n  luaL_checkstring(L, 1);\n  luaL_checkstring(L, 2);\n  lua_settop(L, 2);\n  lua_pushinteger(L, 0);\n  lua_pushcclosure(L, gmatch_aux, 3);\n  return 1;\n}\n\n\nstatic void add_s (MatchState *ms, luaL_Buffer *b, const char *s,\n                                                   const char *e) {\n  size_t l, i;\n  lua_State *L = ms->L;\n  const char *news = lua_tolstring(L, 3, &l);\n  for (i = 0; i < l; i++) {\n    if (news[i] != L_ESC)\n      luaL_addchar(b, news[i]);\n    else {\n      i++;  /* skip ESC */\n      if (!isdigit(uchar(news[i]))) {\n        if (news[i] != L_ESC)\n          luaL_error(L, \"invalid use of '%c' in replacement string\", L_ESC);\n        luaL_addchar(b, news[i]);\n      }\n      else if (news[i] == '0')\n          luaL_addlstring(b, s, e - s);\n      else {\n        push_onecapture(ms, news[i] - '1', s, e);\n        luaL_tolstring(L, -1, NULL);  /* if number, convert it to string */\n        lua_remove(L, -2);  /* remove original value */\n        luaL_addvalue(b);  /* add capture to accumulated result */\n      }\n    }\n  }\n}\n\n\nstatic void add_value (MatchState *ms, luaL_Buffer *b, const char *s,\n                                       const char *e, int tr) {\n  lua_State *L = ms->L;\n  switch (tr) {\n    case LUA_TFUNCTION: {\n      int n;\n      lua_pushvalue(L, 3);\n      n = push_captures(ms, s, e);\n      lua_call(L, n, 1);\n      break;\n    }\n    case LUA_TTABLE: {\n      push_onecapture(ms, 0, s, e);\n      lua_gettable(L, 3);\n      break;\n    }\n    default: {  /* LUA_TNUMBER or LUA_TSTRING */\n      add_s(ms, b, s, e);\n      return;\n    }\n  }\n  if (!lua_toboolean(L, -1)) {  /* nil or false? */\n    lua_pop(L, 1);\n    lua_pushlstring(L, s, e - s);  /* keep original text */\n  }\n  else if (!lua_isstring(L, -1))\n    luaL_error(L, \"invalid replacement value (a %s)\", luaL_typename(L, -1));\n  luaL_addvalue(b);  /* add result to accumulator */\n}\n\n\nstatic int str_gsub (lua_State *L) {\n  size_t srcl, lp;\n  const char *src = luaL_checklstring(L, 1, &srcl);\n  const char *p = luaL_checklstring(L, 2, &lp);\n  int tr = lua_type(L, 3);\n  lua_Integer max_s = luaL_optinteger(L, 4, srcl + 1);\n  int anchor = (*p == '^');\n  lua_Integer n = 0;\n  MatchState ms;\n  luaL_Buffer b;\n  luaL_argcheck(L, tr == LUA_TNUMBER || tr == LUA_TSTRING ||\n                   tr == LUA_TFUNCTION || tr == LUA_TTABLE, 3,\n                      \"string/function/table expected\");\n  luaL_buffinit(L, &b);\n  if (anchor) {\n    p++; lp--;  /* skip anchor character */\n  }\n  ms.L = L;\n  ms.matchdepth = MAXCCALLS;\n  ms.src_init = src;\n  ms.src_end = src+srcl;\n  ms.p_end = p + lp;\n  while (n < max_s) {\n    const char *e;\n    ms.level = 0;\n    lua_assert(ms.matchdepth == MAXCCALLS);\n    e = match(&ms, src, p);\n    if (e) {\n      n++;\n      add_value(&ms, &b, src, e, tr);\n    }\n    if (e && e>src) /* non empty match? */\n      src = e;  /* skip it */\n    else if (src < ms.src_end)\n      luaL_addchar(&b, *src++);\n    else break;\n    if (anchor) break;\n  }\n  luaL_addlstring(&b, src, ms.src_end-src);\n  luaL_pushresult(&b);\n  lua_pushinteger(L, n);  /* number of substitutions */\n  return 2;\n}\n\n/* }====================================================== */\n\n\n\n/*\n** {======================================================\n** STRING FORMAT\n** =======================================================\n*/\n\n/* maximum size of each formatted item (> len(format('%99.99f', -1e308))) */\n#define MAX_ITEM\t512\n\n/* valid flags in a format specification */\n#define FLAGS\t\"-+ #0\"\n\n/*\n** maximum size of each format specification (such as \"%-099.99d\")\n** (+2 for length modifiers; +10 accounts for %99.99x plus margin of error)\n*/\n#define MAX_FORMAT\t(sizeof(FLAGS) + 2 + 10)\n\n\nstatic void addquoted (lua_State *L, luaL_Buffer *b, int arg) {\n  size_t l;\n  const char *s = luaL_checklstring(L, arg, &l);\n  luaL_addchar(b, '\"');\n  while (l--) {\n    if (*s == '\"' || *s == '\\\\' || *s == '\\n') {\n      luaL_addchar(b, '\\\\');\n      luaL_addchar(b, *s);\n    }\n    else if (*s == '\\0' || iscntrl(uchar(*s))) {\n      char buff[10];\n      if (!isdigit(uchar(*(s+1))))\n        sprintf(buff, \"\\\\%d\", (int)uchar(*s));\n      else\n        sprintf(buff, \"\\\\%03d\", (int)uchar(*s));\n      luaL_addstring(b, buff);\n    }\n    else\n      luaL_addchar(b, *s);\n    s++;\n  }\n  luaL_addchar(b, '\"');\n}\n\nstatic const char *scanformat (lua_State *L, const char *strfrmt, char *form) {\n  const char *p = strfrmt;\n  while (*p != '\\0' && strchr(FLAGS, *p) != NULL) p++;  /* skip flags */\n  if ((size_t)(p - strfrmt) >= sizeof(FLAGS)/sizeof(char))\n    luaL_error(L, \"invalid format (repeated flags)\");\n  if (isdigit(uchar(*p))) p++;  /* skip width */\n  if (isdigit(uchar(*p))) p++;  /* (2 digits at most) */\n  if (*p == '.') {\n    p++;\n    if (isdigit(uchar(*p))) p++;  /* skip precision */\n    if (isdigit(uchar(*p))) p++;  /* (2 digits at most) */\n  }\n  if (isdigit(uchar(*p)))\n    luaL_error(L, \"invalid format (width or precision too long)\");\n  *(form++) = '%';\n  memcpy(form, strfrmt, (p - strfrmt + 1) * sizeof(char));\n  form += p - strfrmt + 1;\n  *form = '\\0';\n  return p;\n}\n\n\n/*\n** add length modifier into formats\n*/\nstatic void addlenmod (char *form, const char *lenmod) {\n  size_t l = strlen(form);\n  size_t lm = strlen(lenmod);\n  char spec = form[l - 1];\n  strcpy(form + l - 1, lenmod);\n  form[l + lm - 1] = spec;\n  form[l + lm] = '\\0';\n}\n\n\nstatic int str_format (lua_State *L) {\n  int top = lua_gettop(L);\n  int arg = 1;\n  size_t sfl;\n  const char *strfrmt = luaL_checklstring(L, arg, &sfl);\n  const char *strfrmt_end = strfrmt+sfl;\n  luaL_Buffer b;\n  luaL_buffinit(L, &b);\n  while (strfrmt < strfrmt_end) {\n    if (*strfrmt != L_ESC)\n      luaL_addchar(&b, *strfrmt++);\n    else if (*++strfrmt == L_ESC)\n      luaL_addchar(&b, *strfrmt++);  /* %% */\n    else { /* format item */\n      char form[MAX_FORMAT];  /* to store the format ('%...') */\n      char *buff = luaL_prepbuffsize(&b, MAX_ITEM);  /* to put formatted item */\n      int nb = 0;  /* number of bytes in added item */\n      if (++arg > top)\n        luaL_argerror(L, arg, \"no value\");\n      strfrmt = scanformat(L, strfrmt, form);\n      switch (*strfrmt++) {\n        case 'c': {\n          nb = sprintf(buff, form, (int)luaL_checkinteger(L, arg));\n          break;\n        }\n        case 'd': case 'i':\n        case 'o': case 'u': case 'x': case 'X': {\n          lua_Integer n = luaL_checkinteger(L, arg);\n          addlenmod(form, LUA_INTEGER_FRMLEN);\n          nb = sprintf(buff, form, n);\n          break;\n        }\n#if defined(LUA_USE_AFORMAT)\n        case 'a': case 'A':\n#endif\n        case 'e': case 'E': case 'f':\n        case 'g': case 'G': {\n          addlenmod(form, LUA_NUMBER_FRMLEN);\n          nb = sprintf(buff, form, luaL_checknumber(L, arg));\n          break;\n        }\n        case 'q': {\n          addquoted(L, &b, arg);\n          break;\n        }\n        case 's': {\n          size_t l;\n          const char *s = luaL_tolstring(L, arg, &l);\n          if (!strchr(form, '.') && l >= 100) {\n            /* no precision and string is too long to be formatted;\n               keep original string */\n            luaL_addvalue(&b);\n            break;\n          }\n          else {\n            nb = sprintf(buff, form, s);\n            lua_pop(L, 1);  /* remove result from 'luaL_tolstring' */\n            break;\n          }\n        }\n        default: {  /* also treat cases 'pnLlh' */\n          return luaL_error(L, \"invalid option '%%%c' to 'format'\",\n                               *(strfrmt - 1));\n        }\n      }\n      luaL_addsize(&b, nb);\n    }\n  }\n  luaL_pushresult(&b);\n  return 1;\n}\n\n/* }====================================================== */\n\n\n/*\n** {======================================================\n** PACK/UNPACK\n** =======================================================\n*/\n\n\n/* value used for padding */\n#if !defined(LUA_PACKPADBYTE)\n#define LUA_PACKPADBYTE\t\t0x00\n#endif\n\n/* maximum size for the binary representation of an integer */\n#define MAXINTSIZE\t16\n\n/* number of bits in a character */\n#define NB\tCHAR_BIT\n\n/* mask for one character (NB 1's) */\n#define MC\t((1 << NB) - 1)\n\n/* size of a lua_Integer */\n#define SZINT\t((int)sizeof(lua_Integer))\n\n\n/* dummy union to get native endianness */\nstatic const union {\n  int dummy;\n  char little;  /* true iff machine is little endian */\n} nativeendian = {1};\n\n\n/* dummy structure to get native alignment requirements */\nstruct cD {\n  char c;\n  union { double d; void *p; lua_Integer i; lua_Number n; } u;\n};\n\n#define MAXALIGN\t(offsetof(struct cD, u))\n\n\n/*\n** Union for serializing floats\n*/\ntypedef union Ftypes {\n  float f;\n  double d;\n  lua_Number n;\n  char buff[5 * sizeof(lua_Number)];  /* enough for any float type */\n} Ftypes;\n\n\n/*\n** information to pack/unpack stuff\n*/\ntypedef struct Header {\n  lua_State *L;\n  int islittle;\n  int maxalign;\n} Header;\n\n\n/*\n** options for pack/unpack\n*/\ntypedef enum KOption {\n  Kint,\t\t/* signed integers */\n  Kuint,\t/* unsigned integers */\n  Kfloat,\t/* floating-point numbers */\n  Kchar,\t/* fixed-length strings */\n  Kstring,\t/* strings with prefixed length */\n  Kzstr,\t/* zero-terminated strings */\n  Kpadding,\t/* padding */\n  Kpaddalign,\t/* padding for alignment */\n  Knop\t\t/* no-op (configuration or spaces) */\n} KOption;\n\n\n/*\n** Read an integer numeral from string 'fmt' or return 'df' if\n** there is no numeral\n*/\nstatic int digit (int c) { return '0' <= c && c <= '9'; }\n\nstatic int getnum (const char **fmt, int df) {\n  if (!digit(**fmt))  /* no number? */\n    return df;  /* return default value */\n  else {\n    int a = 0;\n    do {\n      a = a*10 + (*((*fmt)++) - '0');\n    } while (digit(**fmt) && a <= ((int)MAXSIZE - 9)/10);\n    return a;\n  }\n}\n\n\n/*\n** Read an integer numeral and raises an error if it is larger\n** than the maximum size for integers.\n*/\nstatic int getnumlimit (Header *h, const char **fmt, int df) {\n  int sz = getnum(fmt, df);\n  if (sz > MAXINTSIZE || sz <= 0)\n    luaL_error(h->L, \"integral size (%d) out of limits [1,%d]\",\n                     sz, MAXINTSIZE);\n  return sz;\n}\n\n\n/*\n** Initialize Header\n*/\nstatic void initheader (lua_State *L, Header *h) {\n  h->L = L;\n  h->islittle = nativeendian.little;\n  h->maxalign = 1;\n}\n\n\n/*\n** Read and classify next option. 'size' is filled with option's size.\n*/\nstatic KOption getoption (Header *h, const char **fmt, int *size) {\n  int opt = *((*fmt)++);\n  *size = 0;  /* default */\n  switch (opt) {\n    case 'b': *size = sizeof(char); return Kint;\n    case 'B': *size = sizeof(char); return Kuint;\n    case 'h': *size = sizeof(short); return Kint;\n    case 'H': *size = sizeof(short); return Kuint;\n    case 'l': *size = sizeof(long); return Kint;\n    case 'L': *size = sizeof(long); return Kuint;\n    case 'j': *size = sizeof(lua_Integer); return Kint;\n    case 'J': *size = sizeof(lua_Integer); return Kuint;\n    case 'T': *size = sizeof(size_t); return Kuint;\n    case 'f': *size = sizeof(float); return Kfloat;\n    case 'd': *size = sizeof(double); return Kfloat;\n    case 'n': *size = sizeof(lua_Number); return Kfloat;\n    case 'i': *size = getnumlimit(h, fmt, sizeof(int)); return Kint;\n    case 'I': *size = getnumlimit(h, fmt, sizeof(int)); return Kuint;\n    case 's': *size = getnumlimit(h, fmt, sizeof(size_t)); return Kstring;\n    case 'c':\n      *size = getnum(fmt, -1);\n      if (*size == -1)\n        luaL_error(h->L, \"missing size for format option 'c'\");\n      return Kchar;\n    case 'z': return Kzstr;\n    case 'x': *size = 1; return Kpadding;\n    case 'X': return Kpaddalign;\n    case ' ': break;\n    case '<': h->islittle = 1; break;\n    case '>': h->islittle = 0; break;\n    case '=': h->islittle = nativeendian.little; break;\n    case '!': h->maxalign = getnumlimit(h, fmt, MAXALIGN); break;\n    default: luaL_error(h->L, \"invalid format option '%c'\", opt);\n  }\n  return Knop;\n}\n\n\n/*\n** Read, classify, and fill other details about the next option.\n** 'psize' is filled with option's size, 'notoalign' with its\n** alignment requirements.\n** Local variable 'size' gets the size to be aligned. (Kpadal option\n** always gets its full alignment, other options are limited by \n** the maximum alignment ('maxalign'). Kchar option needs no alignment\n** despite its size.\n*/\nstatic KOption getdetails (Header *h, size_t totalsize,\n                           const char **fmt, int *psize, int *ntoalign) {\n  KOption opt = getoption(h, fmt, psize);\n  int align = *psize;  /* usually, alignment follows size */\n  if (opt == Kpaddalign) {  /* 'X' gets alignment from following option */\n    if (**fmt == '\\0' || getoption(h, fmt, &align) == Kchar || align == 0)\n      luaL_argerror(h->L, 1, \"invalid next option for option 'X'\");\n  }\n  if (align <= 1 || opt == Kchar)  /* need no alignment? */\n    *ntoalign = 0;\n  else {\n    if (align > h->maxalign)  /* enforce maximum alignment */\n      align = h->maxalign;\n    if ((align & (align - 1)) != 0)  /* is 'align' not a power of 2? */\n      luaL_argerror(h->L, 1, \"format asks for alignment not power of 2\");\n    *ntoalign = (align - (int)(totalsize & (align - 1))) & (align - 1);\n  }\n  return opt;\n}\n\n\n/*\n** Pack integer 'n' with 'size' bytes and 'islittle' endianness.\n** The final 'if' handles the case when 'size' is larger than\n** the size of a Lua integer, correcting the extra sign-extension\n** bytes if necessary (by default they would be zeros).\n*/\nstatic void packint (luaL_Buffer *b, lua_Unsigned n,\n                     int islittle, int size, int neg) {\n  char *buff = luaL_prepbuffsize(b, size);\n  int i;\n  buff[islittle ? 0 : size - 1] = (char)(n & MC);  /* first byte */\n  for (i = 1; i < size; i++) {\n    n >>= NB;\n    buff[islittle ? i : size - 1 - i] = (char)(n & MC);\n  }\n  if (neg && size > SZINT) {  /* negative number need sign extension? */\n    for (i = SZINT; i < size; i++)  /* correct extra bytes */\n      buff[islittle ? i : size - 1 - i] = (char)MC;\n  }\n  luaL_addsize(b, size);  /* add result to buffer */\n}\n\n\n/*\n** Copy 'size' bytes from 'src' to 'dest', correcting endianness if\n** given 'islittle' is different from native endianness.\n*/\nstatic void copywithendian (volatile char *dest, volatile const char *src,\n                            int size, int islittle) {\n  if (islittle == nativeendian.little) {\n    while (size-- != 0)\n      *(dest++) = *(src++);\n  }\n  else {\n    dest += size - 1;\n    while (size-- != 0)\n      *(dest--) = *(src++);\n  }\n}\n\n\nstatic int str_pack (lua_State *L) {\n  luaL_Buffer b;\n  Header h;\n  const char *fmt = luaL_checkstring(L, 1);  /* format string */\n  int arg = 1;  /* current argument to pack */\n  size_t totalsize = 0;  /* accumulate total size of result */\n  initheader(L, &h);\n  lua_pushnil(L);  /* mark to separate arguments from string buffer */\n  luaL_buffinit(L, &b);\n  while (*fmt != '\\0') {\n    int size, ntoalign;\n    KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign);\n    totalsize += ntoalign + size;\n    while (ntoalign-- > 0)\n     luaL_addchar(&b, LUA_PACKPADBYTE);  /* fill alignment */\n    arg++;\n    switch (opt) {\n      case Kint: {  /* signed integers */\n        lua_Integer n = luaL_checkinteger(L, arg);\n        if (size < SZINT) {  /* need overflow check? */\n          lua_Integer lim = (lua_Integer)1 << ((size * NB) - 1);\n          luaL_argcheck(L, -lim <= n && n < lim, arg, \"integer overflow\");\n        }\n        packint(&b, (lua_Unsigned)n, h.islittle, size, (n < 0));\n        break;\n      }\n      case Kuint: {  /* unsigned integers */\n        lua_Integer n = luaL_checkinteger(L, arg);\n        if (size < SZINT)  /* need overflow check? */\n          luaL_argcheck(L, (lua_Unsigned)n < ((lua_Unsigned)1 << (size * NB)),\n                           arg, \"unsigned overflow\");\n        packint(&b, (lua_Unsigned)n, h.islittle, size, 0);\n        break;\n      }\n      case Kfloat: {  /* floating-point options */\n        volatile Ftypes u;\n        char *buff = luaL_prepbuffsize(&b, size);\n        lua_Number n = luaL_checknumber(L, arg);  /* get argument */\n        if (size == sizeof(u.f)) u.f = (float)n;  /* copy it into 'u' */\n        else if (size == sizeof(u.d)) u.d = (double)n;\n        else u.n = n;\n        /* move 'u' to final result, correcting endianness if needed */\n        copywithendian(buff, u.buff, size, h.islittle);\n        luaL_addsize(&b, size);\n        break;\n      }\n      case Kchar: {  /* fixed-size string */\n        size_t len;\n        const char *s = luaL_checklstring(L, arg, &len);\n        luaL_argcheck(L, len == (size_t)size, arg, \"wrong length\");\n        luaL_addlstring(&b, s, size);\n        break;\n      }\n      case Kstring: {  /* strings with length count */\n        size_t len;\n        const char *s = luaL_checklstring(L, arg, &len);\n        luaL_argcheck(L, size >= (int)sizeof(size_t) ||\n                         len < ((size_t)1 << (size * NB)),\n                         arg, \"string length does not fit in given size\");\n        packint(&b, (lua_Unsigned)len, h.islittle, size, 0);  /* pack length */\n        luaL_addlstring(&b, s, len);\n        totalsize += len;\n        break;\n      }\n      case Kzstr: {  /* zero-terminated string */\n        size_t len;\n        const char *s = luaL_checklstring(L, arg, &len);\n        luaL_argcheck(L, strlen(s) == len, arg, \"string contains zeros\");\n        luaL_addlstring(&b, s, len);\n        luaL_addchar(&b, '\\0');  /* add zero at the end */\n        totalsize += len + 1;\n        break;\n      }\n      case Kpadding: luaL_addchar(&b, LUA_PACKPADBYTE);  /* go through */\n      case Kpaddalign: case Knop:\n        arg--;  /* undo increment */\n        break;\n    }\n  }\n  luaL_pushresult(&b);\n  return 1;\n}\n\n\nstatic int str_packsize (lua_State *L) {\n  Header h;\n  const char *fmt = luaL_checkstring(L, 1);  /* format string */\n  size_t totalsize = 0;  /* accumulate total size of result */\n  initheader(L, &h);\n  while (*fmt != '\\0') {\n    int size, ntoalign;\n    KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign);\n    size += ntoalign;  /* total space used by option */\n    luaL_argcheck(L, totalsize <= MAXSIZE - size, 1,\n                     \"format result too large\");\n    totalsize += size;\n    switch (opt) {\n      case Kstring:  /* strings with length count */\n      case Kzstr:    /* zero-terminated string */\n        luaL_argerror(L, 1, \"variable-length format\");\n        break;\n      default:  break;\n    }\n  }\n  lua_pushinteger(L, (lua_Integer)totalsize);\n  return 1;\n}\n\n\n/*\n** Unpack an integer with 'size' bytes and 'islittle' endianness.\n** If size is smaller than the size of a Lua integer and integer\n** is signed, must do sign extension (propagating the sign to the\n** higher bits); if size is larger than the size of a Lua integer,\n** it must check the unread bytes to see whether they do not cause an\n** overflow.\n*/\nstatic lua_Integer unpackint (lua_State *L, const char *str,\n                              int islittle, int size, int issigned) {\n  lua_Unsigned res = 0;\n  int i;\n  int limit = (size  <= SZINT) ? size : SZINT;\n  for (i = limit - 1; i >= 0; i--) {\n    res <<= NB;\n    res |= (lua_Unsigned)(unsigned char)str[islittle ? i : size - 1 - i];\n  }\n  if (size < SZINT) {  /* real size smaller than lua_Integer? */\n    if (issigned) {  /* needs sign extension? */\n      lua_Unsigned mask = (lua_Unsigned)1 << (size*NB - 1);\n      res = ((res ^ mask) - mask);  /* do sign extension */\n    }\n  }\n  else if (size > SZINT) {  /* must check unread bytes */\n    int mask = (!issigned || (lua_Integer)res >= 0) ? 0 : MC;\n    for (i = limit; i < size; i++) {\n      if ((unsigned char)str[islittle ? i : size - 1 - i] != mask)\n        luaL_error(L, \"%d-byte integer does not fit into Lua Integer\", size);\n    }\n  }\n  return (lua_Integer)res;\n}\n\n\nstatic int str_unpack (lua_State *L) {\n  Header h;\n  const char *fmt = luaL_checkstring(L, 1);\n  size_t ld;\n  const char *data = luaL_checklstring(L, 2, &ld);\n  size_t pos = (size_t)posrelat(luaL_optinteger(L, 3, 1), ld) - 1;\n  int n = 0;  /* number of results */\n  luaL_argcheck(L, pos <= ld, 3, \"initial position out of string\");\n  initheader(L, &h);\n  while (*fmt != '\\0') {\n    int size, ntoalign;\n    KOption opt = getdetails(&h, pos, &fmt, &size, &ntoalign);\n    if ((size_t)ntoalign + size > ~pos || pos + ntoalign + size > ld)\n      luaL_argerror(L, 2, \"data string too short\");\n    pos += ntoalign;  /* skip alignment */\n    /* stack space for item + next position */\n    luaL_checkstack(L, 2, \"too many results\");\n    n++;\n    switch (opt) {\n      case Kint:\n      case Kuint: {\n        lua_Integer res = unpackint(L, data + pos, h.islittle, size,\n                                       (opt == Kint));\n        lua_pushinteger(L, res);\n        break;\n      }\n      case Kfloat: {\n        volatile Ftypes u;\n        lua_Number num;\n        copywithendian(u.buff, data + pos, size, h.islittle);\n        if (size == sizeof(u.f)) num = (lua_Number)u.f;\n        else if (size == sizeof(u.d)) num = (lua_Number)u.d;\n        else num = u.n;\n        lua_pushnumber(L, num);\n        break;\n      }\n      case Kchar: {\n        lua_pushlstring(L, data + pos, size);\n        break;\n      }\n      case Kstring: {\n        size_t len = (size_t)unpackint(L, data + pos, h.islittle, size, 0);\n        luaL_argcheck(L, pos + len + size <= ld, 2, \"data string too short\");\n        lua_pushlstring(L, data + pos + size, len);\n        pos += len;  /* skip string */\n        break;\n      }\n      case Kzstr: {\n        size_t len = (int)strlen(data + pos);\n        lua_pushlstring(L, data + pos, len);\n        pos += len + 1;  /* skip string plus final '\\0' */\n        break;\n      }\n      case Kpaddalign: case Kpadding: case Knop:\n        n--;  /* undo increment */\n        break;\n    }\n    pos += size;\n  }\n  lua_pushinteger(L, pos + 1);  /* next position */\n  return n + 1;\n}\n\n/* }====================================================== */\n\n\nstatic const luaL_Reg strlib[] = {\n  {\"byte\", str_byte},\n  {\"char\", str_char},\n  {\"dump\", str_dump},\n  {\"find\", str_find},\n  {\"format\", str_format},\n  {\"gmatch\", gmatch},\n  {\"gsub\", str_gsub},\n  {\"len\", str_len},\n  {\"lower\", str_lower},\n  {\"match\", str_match},\n  {\"rep\", str_rep},\n  {\"reverse\", str_reverse},\n  {\"sub\", str_sub},\n  {\"upper\", str_upper},\n  {\"pack\", str_pack},\n  {\"packsize\", str_packsize},\n  {\"unpack\", str_unpack},\n  {NULL, NULL}\n};\n\n\nstatic void createmetatable (lua_State *L) {\n  lua_createtable(L, 0, 1);  /* table to be metatable for strings */\n  lua_pushliteral(L, \"\");  /* dummy string */\n  lua_pushvalue(L, -2);  /* copy table */\n  lua_setmetatable(L, -2);  /* set table as metatable for strings */\n  lua_pop(L, 1);  /* pop dummy string */\n  lua_pushvalue(L, -2);  /* get string library */\n  lua_setfield(L, -2, \"__index\");  /* metatable.__index = string */\n  lua_pop(L, 1);  /* pop metatable */\n}\n\n\n/*\n** Open string library\n*/\nLUAMOD_API int luaopen_string (lua_State *L) {\n  luaL_newlib(L, strlib);\n  createmetatable(L);\n  return 1;\n}\n\n"
  },
  {
    "path": "externals/lua/src/ltable.c",
    "content": "/*\n** $Id: ltable.c,v 2.100 2015/01/05 13:52:37 roberto Exp $\n** Lua tables (hash)\n** See Copyright Notice in lua.h\n*/\n\n#define ltable_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n/*\n** Implementation of tables (aka arrays, objects, or hash tables).\n** Tables keep its elements in two parts: an array part and a hash part.\n** Non-negative integer keys are all candidates to be kept in the array\n** part. The actual size of the array is the largest 'n' such that at\n** least half the slots between 0 and n are in use.\n** Hash uses a mix of chained scatter table with Brent's variation.\n** A main invariant of these tables is that, if an element is not\n** in its main position (i.e. the 'original' position that its hash gives\n** to it), then the colliding element is in its own main position.\n** Hence even when the load factor reaches 100%, performance remains good.\n*/\n\n#include <float.h>\n#include <math.h>\n#include <string.h>\n#include <limits.h>\n\n#include \"lua.h\"\n\n#include \"ldebug.h\"\n#include \"ldo.h\"\n#include \"lgc.h\"\n#include \"lmem.h\"\n#include \"lobject.h\"\n#include \"lstate.h\"\n#include \"lstring.h\"\n#include \"ltable.h\"\n#include \"lvm.h\"\n\n\n/*\n** Maximum size of array part (MAXASIZE) is 2^MAXABITS. MAXABITS is\n** the largest integer such that MAXASIZE fits in an unsigned int.\n*/\n#define MAXABITS\tcast_int(sizeof(int) * CHAR_BIT - 1)\n#define MAXASIZE\t(1u << MAXABITS)\n\n/*\n** Maximum size of hash part is 2^MAXHBITS. MAXHBITS is the largest\n** integer such that 2^MAXHBITS fits in a signed int. (Note that the\n** maximum number of elements in a table, 2^MAXABITS + 2^MAXHBITS, still\n** fits comfortably in an unsigned int.)\n*/\n#define MAXHBITS\t(MAXABITS - 1)\n\n\n#define hashpow2(t,n)\t\t(gnode(t, lmod((n), sizenode(t))))\n\n#define hashstr(t,str)\t\thashpow2(t, (str)->hash)\n#define hashboolean(t,p)\thashpow2(t, p)\n#define hashint(t,i)\t\thashpow2(t, i)\n\n\n/*\n** for some types, it is better to avoid modulus by power of 2, as\n** they tend to have many 2 factors.\n*/\n#define hashmod(t,n)\t(gnode(t, ((n) % ((sizenode(t)-1)|1))))\n\n\n#define hashpointer(t,p)\thashmod(t, point2int(p))\n\n\n#define dummynode\t\t(&dummynode_)\n\n#define isdummy(n)\t\t((n) == dummynode)\n\nstatic const Node dummynode_ = {\n  {NILCONSTANT},  /* value */\n  {{NILCONSTANT, 0}}  /* key */\n};\n\n\n/*\n** Checks whether a float has a value representable as a lua_Integer\n** (and does the conversion if so)\n*/\nstatic int numisinteger (lua_Number x, lua_Integer *p) {\n  if ((x) == l_floor(x))  /* integral value? */\n    return lua_numbertointeger(x, p);  /* try as an integer */\n  else return 0;\n}\n\n\n/*\n** hash for floating-point numbers\n*/\nstatic Node *hashfloat (const Table *t, lua_Number n) {\n  int i;\n  n = l_mathop(frexp)(n, &i) * cast_num(INT_MAX - DBL_MAX_EXP);\n  i += cast_int(n);\n  if (i < 0) {\n    if (cast(unsigned int, i) == 0u - i)  /* use unsigned to avoid overflows */\n      i = 0;  /* handle INT_MIN */\n    i = -i;  /* must be a positive value */\n  }\n  return hashmod(t, i);\n}\n\n\n\n/*\n** returns the 'main' position of an element in a table (that is, the index\n** of its hash value)\n*/\nstatic Node *mainposition (const Table *t, const TValue *key) {\n  switch (ttype(key)) {\n    case LUA_TNUMINT:\n      return hashint(t, ivalue(key));\n    case LUA_TNUMFLT:\n      return hashfloat(t, fltvalue(key));\n    case LUA_TSHRSTR:\n      return hashstr(t, tsvalue(key));\n    case LUA_TLNGSTR: {\n      TString *s = tsvalue(key);\n      if (s->extra == 0) {  /* no hash? */\n        s->hash = luaS_hash(getstr(s), s->len, s->hash);\n        s->extra = 1;  /* now it has its hash */\n      }\n      return hashstr(t, tsvalue(key));\n    }\n    case LUA_TBOOLEAN:\n      return hashboolean(t, bvalue(key));\n    case LUA_TLIGHTUSERDATA:\n      return hashpointer(t, pvalue(key));\n    case LUA_TLCF:\n      return hashpointer(t, fvalue(key));\n    default:\n      return hashpointer(t, gcvalue(key));\n  }\n}\n\n\n/*\n** returns the index for 'key' if 'key' is an appropriate key to live in\n** the array part of the table, 0 otherwise.\n*/\nstatic unsigned int arrayindex (const TValue *key) {\n  if (ttisinteger(key)) {\n    lua_Integer k = ivalue(key);\n    if (0 < k && (lua_Unsigned)k <= MAXASIZE)\n      return cast(unsigned int, k);  /* 'key' is an appropriate array index */\n  }\n  return 0;  /* 'key' did not match some condition */\n}\n\n\n/*\n** returns the index of a 'key' for table traversals. First goes all\n** elements in the array part, then elements in the hash part. The\n** beginning of a traversal is signaled by 0.\n*/\nstatic unsigned int findindex (lua_State *L, Table *t, StkId key) {\n  unsigned int i;\n  if (ttisnil(key)) return 0;  /* first iteration */\n  i = arrayindex(key);\n  if (i != 0 && i <= t->sizearray)  /* is 'key' inside array part? */\n    return i;  /* yes; that's the index */\n  else {\n    int nx;\n    Node *n = mainposition(t, key);\n    for (;;) {  /* check whether 'key' is somewhere in the chain */\n      /* key may be dead already, but it is ok to use it in 'next' */\n      if (luaV_rawequalobj(gkey(n), key) ||\n            (ttisdeadkey(gkey(n)) && iscollectable(key) &&\n             deadvalue(gkey(n)) == gcvalue(key))) {\n        i = cast_int(n - gnode(t, 0));  /* key index in hash table */\n        /* hash elements are numbered after array ones */\n        return (i + 1) + t->sizearray;\n      }\n      nx = gnext(n);\n      if (nx == 0)\n        luaG_runerror(L, \"invalid key to 'next'\");  /* key not found */\n      else n += nx;\n    }\n  }\n}\n\n\nint luaH_next (lua_State *L, Table *t, StkId key) {\n  unsigned int i = findindex(L, t, key);  /* find original element */\n  for (; i < t->sizearray; i++) {  /* try first array part */\n    if (!ttisnil(&t->array[i])) {  /* a non-nil value? */\n      setivalue(key, i + 1);\n      setobj2s(L, key+1, &t->array[i]);\n      return 1;\n    }\n  }\n  for (i -= t->sizearray; cast_int(i) < sizenode(t); i++) {  /* hash part */\n    if (!ttisnil(gval(gnode(t, i)))) {  /* a non-nil value? */\n      setobj2s(L, key, gkey(gnode(t, i)));\n      setobj2s(L, key+1, gval(gnode(t, i)));\n      return 1;\n    }\n  }\n  return 0;  /* no more elements */\n}\n\n\n/*\n** {=============================================================\n** Rehash\n** ==============================================================\n*/\n\n/*\n** Compute the optimal size for the array part of table 't'. 'nums' is a\n** \"count array\" where 'nums[i]' is the number of integers in the table\n** between 2^(i - 1) + 1 and 2^i. Put in '*narray' the optimal size, and\n** return the number of elements that will go to that part.\n*/\nstatic unsigned int computesizes (unsigned int nums[], unsigned int *narray) {\n  int i;\n  unsigned int twotoi;  /* 2^i */\n  unsigned int a = 0;  /* number of elements smaller than 2^i */\n  unsigned int na = 0;  /* number of elements to go to array part */\n  unsigned int n = 0;  /* optimal size for array part */\n  for (i = 0, twotoi = 1; twotoi/2 < *narray; i++, twotoi *= 2) {\n    if (nums[i] > 0) {\n      a += nums[i];\n      if (a > twotoi/2) {  /* more than half elements present? */\n        n = twotoi;  /* optimal size (till now) */\n        na = a;  /* all elements up to 'n' will go to array part */\n      }\n    }\n    if (a == *narray) break;  /* all elements already counted */\n  }\n  *narray = n;\n  lua_assert(*narray/2 <= na && na <= *narray);\n  return na;\n}\n\n\nstatic int countint (const TValue *key, unsigned int *nums) {\n  unsigned int k = arrayindex(key);\n  if (k != 0) {  /* is 'key' an appropriate array index? */\n    nums[luaO_ceillog2(k)]++;  /* count as such */\n    return 1;\n  }\n  else\n    return 0;\n}\n\n\nstatic unsigned int numusearray (const Table *t, unsigned int *nums) {\n  int lg;\n  unsigned int ttlg;  /* 2^lg */\n  unsigned int ause = 0;  /* summation of 'nums' */\n  unsigned int i = 1;  /* count to traverse all array keys */\n  /* traverse each slice */\n  for (lg = 0, ttlg = 1; lg <= MAXABITS; lg++, ttlg *= 2) {\n    unsigned int lc = 0;  /* counter */\n    unsigned int lim = ttlg;\n    if (lim > t->sizearray) {\n      lim = t->sizearray;  /* adjust upper limit */\n      if (i > lim)\n        break;  /* no more elements to count */\n    }\n    /* count elements in range (2^(lg - 1), 2^lg] */\n    for (; i <= lim; i++) {\n      if (!ttisnil(&t->array[i-1]))\n        lc++;\n    }\n    nums[lg] += lc;\n    ause += lc;\n  }\n  return ause;\n}\n\n\nstatic int numusehash (const Table *t, unsigned int *nums,\n                       unsigned int *pnasize) {\n  int totaluse = 0;  /* total number of elements */\n  int ause = 0;  /* elements added to 'nums' (can go to array part) */\n  int i = sizenode(t);\n  while (i--) {\n    Node *n = &t->node[i];\n    if (!ttisnil(gval(n))) {\n      ause += countint(gkey(n), nums);\n      totaluse++;\n    }\n  }\n  *pnasize += ause;\n  return totaluse;\n}\n\n\nstatic void setarrayvector (lua_State *L, Table *t, unsigned int size) {\n  unsigned int i;\n  luaM_reallocvector(L, t->array, t->sizearray, size, TValue);\n  for (i=t->sizearray; i<size; i++)\n     setnilvalue(&t->array[i]);\n  t->sizearray = size;\n}\n\n\nstatic void setnodevector (lua_State *L, Table *t, unsigned int size) {\n  int lsize;\n  if (size == 0) {  /* no elements to hash part? */\n    t->node = cast(Node *, dummynode);  /* use common 'dummynode' */\n    lsize = 0;\n  }\n  else {\n    int i;\n    lsize = luaO_ceillog2(size);\n    if (lsize > MAXHBITS)\n      luaG_runerror(L, \"table overflow\");\n    size = twoto(lsize);\n    t->node = luaM_newvector(L, size, Node);\n    for (i = 0; i < (int)size; i++) {\n      Node *n = gnode(t, i);\n      gnext(n) = 0;\n      setnilvalue(wgkey(n));\n      setnilvalue(gval(n));\n    }\n  }\n  t->lsizenode = cast_byte(lsize);\n  t->lastfree = gnode(t, size);  /* all positions are free */\n}\n\n\nvoid luaH_resize (lua_State *L, Table *t, unsigned int nasize,\n                                          unsigned int nhsize) {\n  unsigned int i;\n  int j;\n  unsigned int oldasize = t->sizearray;\n  int oldhsize = t->lsizenode;\n  Node *nold = t->node;  /* save old hash ... */\n  if (nasize > oldasize)  /* array part must grow? */\n    setarrayvector(L, t, nasize);\n  /* create new hash part with appropriate size */\n  setnodevector(L, t, nhsize);\n  if (nasize < oldasize) {  /* array part must shrink? */\n    t->sizearray = nasize;\n    /* re-insert elements from vanishing slice */\n    for (i=nasize; i<oldasize; i++) {\n      if (!ttisnil(&t->array[i]))\n        luaH_setint(L, t, i + 1, &t->array[i]);\n    }\n    /* shrink array */\n    luaM_reallocvector(L, t->array, oldasize, nasize, TValue);\n  }\n  /* re-insert elements from hash part */\n  for (j = twoto(oldhsize) - 1; j >= 0; j--) {\n    Node *old = nold + j;\n    if (!ttisnil(gval(old))) {\n      /* doesn't need barrier/invalidate cache, as entry was\n         already present in the table */\n      setobjt2t(L, luaH_set(L, t, gkey(old)), gval(old));\n    }\n  }\n  if (!isdummy(nold))\n    luaM_freearray(L, nold, cast(size_t, twoto(oldhsize))); /* free old array */\n}\n\n\nvoid luaH_resizearray (lua_State *L, Table *t, unsigned int nasize) {\n  int nsize = isdummy(t->node) ? 0 : sizenode(t);\n  luaH_resize(L, t, nasize, nsize);\n}\n\n/*\n** nums[i] = number of keys 'k' where 2^(i - 1) < k <= 2^i\n*/\nstatic void rehash (lua_State *L, Table *t, const TValue *ek) {\n  unsigned int nasize, na;\n  unsigned int nums[MAXABITS + 1];\n  int i;\n  int totaluse;\n  for (i = 0; i <= MAXABITS; i++) nums[i] = 0;  /* reset counts */\n  nasize = numusearray(t, nums);  /* count keys in array part */\n  totaluse = nasize;  /* all those keys are integer keys */\n  totaluse += numusehash(t, nums, &nasize);  /* count keys in hash part */\n  /* count extra key */\n  nasize += countint(ek, nums);\n  totaluse++;\n  /* compute new size for array part */\n  na = computesizes(nums, &nasize);\n  /* resize the table to new computed sizes */\n  luaH_resize(L, t, nasize, totaluse - na);\n}\n\n\n\n/*\n** }=============================================================\n*/\n\n\nTable *luaH_new (lua_State *L) {\n  GCObject *o = luaC_newobj(L, LUA_TTABLE, sizeof(Table));\n  Table *t = gco2t(o);\n  t->metatable = NULL;\n  t->flags = cast_byte(~0);\n  t->array = NULL;\n  t->sizearray = 0;\n  setnodevector(L, t, 0);\n  return t;\n}\n\n\nvoid luaH_free (lua_State *L, Table *t) {\n  if (!isdummy(t->node))\n    luaM_freearray(L, t->node, cast(size_t, sizenode(t)));\n  luaM_freearray(L, t->array, t->sizearray);\n  luaM_free(L, t);\n}\n\n\nstatic Node *getfreepos (Table *t) {\n  while (t->lastfree > t->node) {\n    t->lastfree--;\n    if (ttisnil(gkey(t->lastfree)))\n      return t->lastfree;\n  }\n  return NULL;  /* could not find a free place */\n}\n\n\n\n/*\n** inserts a new key into a hash table; first, check whether key's main\n** position is free. If not, check whether colliding node is in its main\n** position or not: if it is not, move colliding node to an empty place and\n** put new key in its main position; otherwise (colliding node is in its main\n** position), new key goes to an empty position.\n*/\nTValue *luaH_newkey (lua_State *L, Table *t, const TValue *key) {\n  Node *mp;\n  TValue aux;\n  if (ttisnil(key)) luaG_runerror(L, \"table index is nil\");\n  else if (ttisfloat(key)) {\n    lua_Number n = fltvalue(key);\n    lua_Integer k;\n    if (luai_numisnan(n))\n      luaG_runerror(L, \"table index is NaN\");\n    if (numisinteger(n, &k)) {  /* index is int? */\n      setivalue(&aux, k);\n      key = &aux;  /* insert it as an integer */\n    }\n  }\n  mp = mainposition(t, key);\n  if (!ttisnil(gval(mp)) || isdummy(mp)) {  /* main position is taken? */\n    Node *othern;\n    Node *f = getfreepos(t);  /* get a free place */\n    if (f == NULL) {  /* cannot find a free place? */\n      rehash(L, t, key);  /* grow table */\n      /* whatever called 'newkey' takes care of TM cache and GC barrier */\n      return luaH_set(L, t, key);  /* insert key into grown table */\n    }\n    lua_assert(!isdummy(f));\n    othern = mainposition(t, gkey(mp));\n    if (othern != mp) {  /* is colliding node out of its main position? */\n      /* yes; move colliding node into free position */\n      while (othern + gnext(othern) != mp)  /* find previous */\n        othern += gnext(othern);\n      gnext(othern) = cast_int(f - othern);  /* rechain to point to 'f' */\n      *f = *mp;  /* copy colliding node into free pos. (mp->next also goes) */\n      if (gnext(mp) != 0) {\n        gnext(f) += cast_int(mp - f);  /* correct 'next' */\n        gnext(mp) = 0;  /* now 'mp' is free */\n      }\n      setnilvalue(gval(mp));\n    }\n    else {  /* colliding node is in its own main position */\n      /* new node will go into free position */\n      if (gnext(mp) != 0)\n        gnext(f) = cast_int((mp + gnext(mp)) - f);  /* chain new position */\n      else lua_assert(gnext(f) == 0);\n      gnext(mp) = cast_int(f - mp);\n      mp = f;\n    }\n  }\n  setnodekey(L, &mp->i_key, key);\n  luaC_barrierback(L, t, key);\n  lua_assert(ttisnil(gval(mp)));\n  return gval(mp);\n}\n\n\n/*\n** search function for integers\n*/\nconst TValue *luaH_getint (Table *t, lua_Integer key) {\n  /* (1 <= key && key <= t->sizearray) */\n  if (l_castS2U(key - 1) < t->sizearray)\n    return &t->array[key - 1];\n  else {\n    Node *n = hashint(t, key);\n    for (;;) {  /* check whether 'key' is somewhere in the chain */\n      if (ttisinteger(gkey(n)) && ivalue(gkey(n)) == key)\n        return gval(n);  /* that's it */\n      else {\n        int nx = gnext(n);\n        if (nx == 0) break;\n        n += nx;\n      }\n    };\n    return luaO_nilobject;\n  }\n}\n\n\n/*\n** search function for short strings\n*/\nconst TValue *luaH_getstr (Table *t, TString *key) {\n  Node *n = hashstr(t, key);\n  lua_assert(key->tt == LUA_TSHRSTR);\n  for (;;) {  /* check whether 'key' is somewhere in the chain */\n    const TValue *k = gkey(n);\n    if (ttisshrstring(k) && eqshrstr(tsvalue(k), key))\n      return gval(n);  /* that's it */\n    else {\n      int nx = gnext(n);\n      if (nx == 0) break;\n      n += nx;\n    }\n  };\n  return luaO_nilobject;\n}\n\n\n/*\n** main search function\n*/\nconst TValue *luaH_get (Table *t, const TValue *key) {\n  switch (ttype(key)) {\n    case LUA_TSHRSTR: return luaH_getstr(t, tsvalue(key));\n    case LUA_TNUMINT: return luaH_getint(t, ivalue(key));\n    case LUA_TNIL: return luaO_nilobject;\n    case LUA_TNUMFLT: {\n      lua_Integer k;\n      if (numisinteger(fltvalue(key), &k)) /* index is int? */\n        return luaH_getint(t, k);  /* use specialized version */\n      /* else go through */\n    }\n    default: {\n      Node *n = mainposition(t, key);\n      for (;;) {  /* check whether 'key' is somewhere in the chain */\n        if (luaV_rawequalobj(gkey(n), key))\n          return gval(n);  /* that's it */\n        else {\n          int nx = gnext(n);\n          if (nx == 0) break;\n          n += nx;\n        }\n      };\n      return luaO_nilobject;\n    }\n  }\n}\n\n\n/*\n** beware: when using this function you probably need to check a GC\n** barrier and invalidate the TM cache.\n*/\nTValue *luaH_set (lua_State *L, Table *t, const TValue *key) {\n  const TValue *p = luaH_get(t, key);\n  if (p != luaO_nilobject)\n    return cast(TValue *, p);\n  else return luaH_newkey(L, t, key);\n}\n\n\nvoid luaH_setint (lua_State *L, Table *t, lua_Integer key, TValue *value) {\n  const TValue *p = luaH_getint(t, key);\n  TValue *cell;\n  if (p != luaO_nilobject)\n    cell = cast(TValue *, p);\n  else {\n    TValue k;\n    setivalue(&k, key);\n    cell = luaH_newkey(L, t, &k);\n  }\n  setobj2t(L, cell, value);\n}\n\n\nstatic int unbound_search (Table *t, unsigned int j) {\n  unsigned int i = j;  /* i is zero or a present index */\n  j++;\n  /* find 'i' and 'j' such that i is present and j is not */\n  while (!ttisnil(luaH_getint(t, j))) {\n    i = j;\n    if (j > cast(unsigned int, MAX_INT)/2) {  /* overflow? */\n      /* table was built with bad purposes: resort to linear search */\n      i = 1;\n      while (!ttisnil(luaH_getint(t, i))) i++;\n      return i - 1;\n    }\n    j *= 2;\n  }\n  /* now do a binary search between them */\n  while (j - i > 1) {\n    unsigned int m = (i+j)/2;\n    if (ttisnil(luaH_getint(t, m))) j = m;\n    else i = m;\n  }\n  return i;\n}\n\n\n/*\n** Try to find a boundary in table 't'. A 'boundary' is an integer index\n** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil).\n*/\nint luaH_getn (Table *t) {\n  unsigned int j = t->sizearray;\n  if (j > 0 && ttisnil(&t->array[j - 1])) {\n    /* there is a boundary in the array part: (binary) search for it */\n    unsigned int i = 0;\n    while (j - i > 1) {\n      unsigned int m = (i+j)/2;\n      if (ttisnil(&t->array[m - 1])) j = m;\n      else i = m;\n    }\n    return i;\n  }\n  /* else must find a boundary in hash part */\n  else if (isdummy(t->node))  /* hash part is empty? */\n    return j;  /* that is easy... */\n  else return unbound_search(t, j);\n}\n\n\n\n#if defined(LUA_DEBUG)\n\nNode *luaH_mainposition (const Table *t, const TValue *key) {\n  return mainposition(t, key);\n}\n\nint luaH_isdummy (Node *n) { return isdummy(n); }\n\n#endif\n"
  },
  {
    "path": "externals/lua/src/ltable.h",
    "content": "/*\n** $Id: ltable.h,v 2.20 2014/09/04 18:15:29 roberto Exp $\n** Lua tables (hash)\n** See Copyright Notice in lua.h\n*/\n\n#ifndef ltable_h\n#define ltable_h\n\n#include \"lobject.h\"\n\n\n#define gnode(t,i)\t(&(t)->node[i])\n#define gval(n)\t\t(&(n)->i_val)\n#define gnext(n)\t((n)->i_key.nk.next)\n\n\n/* 'const' to avoid wrong writings that can mess up field 'next' */ \n#define gkey(n)\t\tcast(const TValue*, (&(n)->i_key.tvk))\n\n#define wgkey(n)\t\t(&(n)->i_key.nk)\n\n#define invalidateTMcache(t)\t((t)->flags = 0)\n\n\n/* returns the key, given the value of a table entry */\n#define keyfromval(v) \\\n  (gkey(cast(Node *, cast(char *, (v)) - offsetof(Node, i_val))))\n\n\nLUAI_FUNC const TValue *luaH_getint (Table *t, lua_Integer key);\nLUAI_FUNC void luaH_setint (lua_State *L, Table *t, lua_Integer key,\n                                                    TValue *value);\nLUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key);\nLUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key);\nLUAI_FUNC TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key);\nLUAI_FUNC TValue *luaH_set (lua_State *L, Table *t, const TValue *key);\nLUAI_FUNC Table *luaH_new (lua_State *L);\nLUAI_FUNC void luaH_resize (lua_State *L, Table *t, unsigned int nasize,\n                                                    unsigned int nhsize);\nLUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize);\nLUAI_FUNC void luaH_free (lua_State *L, Table *t);\nLUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key);\nLUAI_FUNC int luaH_getn (Table *t);\n\n\n#if defined(LUA_DEBUG)\nLUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key);\nLUAI_FUNC int luaH_isdummy (Node *n);\n#endif\n\n\n#endif\n"
  },
  {
    "path": "externals/lua/src/ltablib.c",
    "content": "/*\n** $Id: ltablib.c,v 1.79 2014/11/02 19:19:04 roberto Exp $\n** Library for Table Manipulation\n** See Copyright Notice in lua.h\n*/\n\n#define ltablib_c\n#define LUA_LIB\n\n#include \"lprefix.h\"\n\n\n#include <limits.h>\n#include <stddef.h>\n\n#include \"lua.h\"\n\n#include \"lauxlib.h\"\n#include \"lualib.h\"\n\n\n\n/*\n** Structure with table-access functions\n*/\ntypedef struct {\n  int (*geti) (lua_State *L, int idx, lua_Integer n);\n  void (*seti) (lua_State *L, int idx, lua_Integer n);\n} TabA;\n\n\n/*\n** Check that 'arg' has a table and set access functions in 'ta' to raw\n** or non-raw according to the presence of corresponding metamethods.\n*/\nstatic void checktab (lua_State *L, int arg, TabA *ta) {\n  ta->geti = NULL; ta->seti = NULL;\n  if (lua_getmetatable(L, arg)) {\n    lua_pushliteral(L, \"__index\");  /* 'index' metamethod */\n    if (lua_rawget(L, -2) != LUA_TNIL)\n      ta->geti = lua_geti;\n    lua_pushliteral(L, \"__newindex\");  /* 'newindex' metamethod */\n    if (lua_rawget(L, -3) != LUA_TNIL)\n      ta->seti = lua_seti;\n    lua_pop(L, 3);  /* pop metatable plus both metamethods */\n  }\n  if (ta->geti == NULL || ta->seti == NULL) {\n    luaL_checktype(L, arg, LUA_TTABLE);  /* must be table for raw methods */\n    if (ta->geti == NULL) ta->geti = lua_rawgeti;\n    if (ta->seti == NULL) ta->seti = lua_rawseti;\n  }\n}\n\n\n#define aux_getn(L,n,ta)\t(checktab(L, n, ta), luaL_len(L, n))\n\n\n#if defined(LUA_COMPAT_MAXN)\nstatic int maxn (lua_State *L) {\n  lua_Number max = 0;\n  luaL_checktype(L, 1, LUA_TTABLE);\n  lua_pushnil(L);  /* first key */\n  while (lua_next(L, 1)) {\n    lua_pop(L, 1);  /* remove value */\n    if (lua_type(L, -1) == LUA_TNUMBER) {\n      lua_Number v = lua_tonumber(L, -1);\n      if (v > max) max = v;\n    }\n  }\n  lua_pushnumber(L, max);\n  return 1;\n}\n#endif\n\n\nstatic int tinsert (lua_State *L) {\n  TabA ta;\n  lua_Integer e = aux_getn(L, 1, &ta) + 1;  /* first empty element */\n  lua_Integer pos;  /* where to insert new element */\n  switch (lua_gettop(L)) {\n    case 2: {  /* called with only 2 arguments */\n      pos = e;  /* insert new element at the end */\n      break;\n    }\n    case 3: {\n      lua_Integer i;\n      pos = luaL_checkinteger(L, 2);  /* 2nd argument is the position */\n      luaL_argcheck(L, 1 <= pos && pos <= e, 2, \"position out of bounds\");\n      for (i = e; i > pos; i--) {  /* move up elements */\n        (*ta.geti)(L, 1, i - 1);\n        (*ta.seti)(L, 1, i);  /* t[i] = t[i - 1] */\n      }\n      break;\n    }\n    default: {\n      return luaL_error(L, \"wrong number of arguments to 'insert'\");\n    }\n  }\n  (*ta.seti)(L, 1, pos);  /* t[pos] = v */\n  return 0;\n}\n\n\nstatic int tremove (lua_State *L) {\n  TabA ta;\n  lua_Integer size = aux_getn(L, 1, &ta);\n  lua_Integer pos = luaL_optinteger(L, 2, size);\n  if (pos != size)  /* validate 'pos' if given */\n    luaL_argcheck(L, 1 <= pos && pos <= size + 1, 1, \"position out of bounds\");\n  (*ta.geti)(L, 1, pos);  /* result = t[pos] */\n  for ( ; pos < size; pos++) {\n    (*ta.geti)(L, 1, pos + 1);\n    (*ta.seti)(L, 1, pos);  /* t[pos] = t[pos + 1] */\n  }\n  lua_pushnil(L);\n  (*ta.seti)(L, 1, pos);  /* t[pos] = nil */\n  return 1;\n}\n\n\nstatic int tmove (lua_State *L) {\n  TabA ta;\n  lua_Integer f = luaL_checkinteger(L, 2);\n  lua_Integer e = luaL_checkinteger(L, 3);\n  lua_Integer t = luaL_checkinteger(L, 4);\n  int tt = !lua_isnoneornil(L, 5) ? 5 : 1;  /* destination table */\n  /* the following restriction avoids several problems with overflows */\n  luaL_argcheck(L, f > 0, 2, \"initial position must be positive\");\n  if (e >= f) {  /* otherwise, nothing to move */\n    lua_Integer n, i;\n    ta.geti = (luaL_getmetafield(L, 1, \"__index\") == LUA_TNIL)\n      ? (luaL_checktype(L, 1, LUA_TTABLE), lua_rawgeti)\n      : lua_geti;\n    ta.seti = (luaL_getmetafield(L, tt, \"__newindex\") == LUA_TNIL)\n      ? (luaL_checktype(L, tt, LUA_TTABLE), lua_rawseti)\n      : lua_seti;\n    n = e - f + 1;  /* number of elements to move */\n    if (t > f) {\n      for (i = n - 1; i >= 0; i--) {\n        (*ta.geti)(L, 1, f + i);\n        (*ta.seti)(L, tt, t + i);\n      }\n    }\n    else {\n      for (i = 0; i < n; i++) {\n        (*ta.geti)(L, 1, f + i);\n        (*ta.seti)(L, tt, t + i);\n      }\n    }\n  }\n  lua_pushvalue(L, tt);  /* return \"to table\" */\n  return 1;\n}\n\n\nstatic void addfield (lua_State *L, luaL_Buffer *b, TabA *ta, lua_Integer i) {\n  (*ta->geti)(L, 1, i);\n  if (!lua_isstring(L, -1))\n    luaL_error(L, \"invalid value (%s) at index %d in table for 'concat'\",\n                  luaL_typename(L, -1), i);\n  luaL_addvalue(b);\n}\n\n\nstatic int tconcat (lua_State *L) {\n  TabA ta;\n  luaL_Buffer b;\n  size_t lsep;\n  lua_Integer i, last;\n  const char *sep = luaL_optlstring(L, 2, \"\", &lsep);\n  checktab(L, 1, &ta);\n  i = luaL_optinteger(L, 3, 1);\n  last = luaL_opt(L, luaL_checkinteger, 4, luaL_len(L, 1));\n  luaL_buffinit(L, &b);\n  for (; i < last; i++) {\n    addfield(L, &b, &ta, i);\n    luaL_addlstring(&b, sep, lsep);\n  }\n  if (i == last)  /* add last value (if interval was not empty) */\n    addfield(L, &b, &ta, i);\n  luaL_pushresult(&b);\n  return 1;\n}\n\n\n/*\n** {======================================================\n** Pack/unpack\n** =======================================================\n*/\n\nstatic int pack (lua_State *L) {\n  int i;\n  int n = lua_gettop(L);  /* number of elements to pack */\n  lua_createtable(L, n, 1);  /* create result table */\n  lua_insert(L, 1);  /* put it at index 1 */\n  for (i = n; i >= 1; i--)  /* assign elements */\n    lua_rawseti(L, 1, i);\n  lua_pushinteger(L, n);\n  lua_setfield(L, 1, \"n\");  /* t.n = number of elements */\n  return 1;  /* return table */\n}\n\n\nstatic int unpack (lua_State *L) {\n  TabA ta;\n  lua_Integer i, e;\n  lua_Unsigned n;\n  checktab(L, 1, &ta);\n  i = luaL_optinteger(L, 2, 1);\n  e = luaL_opt(L, luaL_checkinteger, 3, luaL_len(L, 1));\n  if (i > e) return 0;  /* empty range */\n  n = (lua_Unsigned)e - i;  /* number of elements minus 1 (avoid overflows) */\n  if (n >= (unsigned int)INT_MAX  || !lua_checkstack(L, (int)(++n)))\n    return luaL_error(L, \"too many results to unpack\");\n  do {  /* must have at least one element */\n    (*ta.geti)(L, 1, i);  /* push arg[i..e] */\n  } while (i++ < e); \n\n  return (int)n;\n}\n\n/* }====================================================== */\n\n\n\n/*\n** {======================================================\n** Quicksort\n** (based on 'Algorithms in MODULA-3', Robert Sedgewick;\n**  Addison-Wesley, 1993.)\n** =======================================================\n*/\n\n\nstatic void set2 (lua_State *L, TabA *ta, int i, int j) {\n  (*ta->seti)(L, 1, i);\n  (*ta->seti)(L, 1, j);\n}\n\nstatic int sort_comp (lua_State *L, int a, int b) {\n  if (!lua_isnil(L, 2)) {  /* function? */\n    int res;\n    lua_pushvalue(L, 2);\n    lua_pushvalue(L, a-1);  /* -1 to compensate function */\n    lua_pushvalue(L, b-2);  /* -2 to compensate function and 'a' */\n    lua_call(L, 2, 1);\n    res = lua_toboolean(L, -1);\n    lua_pop(L, 1);\n    return res;\n  }\n  else  /* a < b? */\n    return lua_compare(L, a, b, LUA_OPLT);\n}\n\nstatic void auxsort (lua_State *L, TabA *ta, int l, int u) {\n  while (l < u) {  /* for tail recursion */\n    int i, j;\n    /* sort elements a[l], a[(l+u)/2] and a[u] */\n    (*ta->geti)(L, 1, l);\n    (*ta->geti)(L, 1, u);\n    if (sort_comp(L, -1, -2))  /* a[u] < a[l]? */\n      set2(L, ta, l, u);  /* swap a[l] - a[u] */\n    else\n      lua_pop(L, 2);\n    if (u-l == 1) break;  /* only 2 elements */\n    i = (l+u)/2;\n    (*ta->geti)(L, 1, i);\n    (*ta->geti)(L, 1, l);\n    if (sort_comp(L, -2, -1))  /* a[i]<a[l]? */\n      set2(L, ta, i, l);\n    else {\n      lua_pop(L, 1);  /* remove a[l] */\n      (*ta->geti)(L, 1, u);\n      if (sort_comp(L, -1, -2))  /* a[u]<a[i]? */\n        set2(L, ta, i, u);\n      else\n        lua_pop(L, 2);\n    }\n    if (u-l == 2) break;  /* only 3 elements */\n    (*ta->geti)(L, 1, i);  /* Pivot */\n    lua_pushvalue(L, -1);\n    (*ta->geti)(L, 1, u-1);\n    set2(L, ta, i, u-1);\n    /* a[l] <= P == a[u-1] <= a[u], only need to sort from l+1 to u-2 */\n    i = l; j = u-1;\n    for (;;) {  /* invariant: a[l..i] <= P <= a[j..u] */\n      /* repeat ++i until a[i] >= P */\n      while ((*ta->geti)(L, 1, ++i), sort_comp(L, -1, -2)) {\n        if (i>=u) luaL_error(L, \"invalid order function for sorting\");\n        lua_pop(L, 1);  /* remove a[i] */\n      }\n      /* repeat --j until a[j] <= P */\n      while ((*ta->geti)(L, 1, --j), sort_comp(L, -3, -1)) {\n        if (j<=l) luaL_error(L, \"invalid order function for sorting\");\n        lua_pop(L, 1);  /* remove a[j] */\n      }\n      if (j<i) {\n        lua_pop(L, 3);  /* pop pivot, a[i], a[j] */\n        break;\n      }\n      set2(L, ta, i, j);\n    }\n    (*ta->geti)(L, 1, u-1);\n    (*ta->geti)(L, 1, i);\n    set2(L, ta, u-1, i);  /* swap pivot (a[u-1]) with a[i] */\n    /* a[l..i-1] <= a[i] == P <= a[i+1..u] */\n    /* adjust so that smaller half is in [j..i] and larger one in [l..u] */\n    if (i-l < u-i) {\n      j=l; i=i-1; l=i+2;\n    }\n    else {\n      j=i+1; i=u; u=j-2;\n    }\n    auxsort(L, ta, j, i);  /* call recursively the smaller one */\n  }  /* repeat the routine for the larger one */\n}\n\nstatic int sort (lua_State *L) {\n  TabA ta;\n  int n = (int)aux_getn(L, 1, &ta);\n  luaL_checkstack(L, 50, \"\");  /* assume array is smaller than 2^50 */\n  if (!lua_isnoneornil(L, 2))  /* is there a 2nd argument? */\n    luaL_checktype(L, 2, LUA_TFUNCTION);\n  lua_settop(L, 2);  /* make sure there are two arguments */\n  auxsort(L, &ta, 1, n);\n  return 0;\n}\n\n/* }====================================================== */\n\n\nstatic const luaL_Reg tab_funcs[] = {\n  {\"concat\", tconcat},\n#if defined(LUA_COMPAT_MAXN)\n  {\"maxn\", maxn},\n#endif\n  {\"insert\", tinsert},\n  {\"pack\", pack},\n  {\"unpack\", unpack},\n  {\"remove\", tremove},\n  {\"move\", tmove},\n  {\"sort\", sort},\n  {NULL, NULL}\n};\n\n\nLUAMOD_API int luaopen_table (lua_State *L) {\n  luaL_newlib(L, tab_funcs);\n#if defined(LUA_COMPAT_UNPACK)\n  /* _G.unpack = table.unpack */\n  lua_getfield(L, -1, \"unpack\");\n  lua_setglobal(L, \"unpack\");\n#endif\n  return 1;\n}\n\n"
  },
  {
    "path": "externals/lua/src/ltm.c",
    "content": "/*\n** $Id: ltm.c,v 2.33 2014/11/21 12:15:57 roberto Exp $\n** Tag methods\n** See Copyright Notice in lua.h\n*/\n\n#define ltm_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"ldebug.h\"\n#include \"ldo.h\" \n#include \"lobject.h\"\n#include \"lstate.h\"\n#include \"lstring.h\"\n#include \"ltable.h\"\n#include \"ltm.h\"\n#include \"lvm.h\"\n\n\nstatic const char udatatypename[] = \"userdata\";\n\nLUAI_DDEF const char *const luaT_typenames_[LUA_TOTALTAGS] = {\n  \"no value\",\n  \"nil\", \"boolean\", udatatypename, \"number\",\n  \"string\", \"table\", \"function\", udatatypename, \"thread\",\n  \"proto\" /* this last case is used for tests only */\n};\n\n\nvoid luaT_init (lua_State *L) {\n  static const char *const luaT_eventname[] = {  /* ORDER TM */\n    \"__index\", \"__newindex\",\n    \"__gc\", \"__mode\", \"__len\", \"__eq\",\n    \"__add\", \"__sub\", \"__mul\", \"__mod\", \"__pow\",\n    \"__div\", \"__idiv\",\n    \"__band\", \"__bor\", \"__bxor\", \"__shl\", \"__shr\",\n    \"__unm\", \"__bnot\", \"__lt\", \"__le\",\n    \"__concat\", \"__call\"\n  };\n  int i;\n  for (i=0; i<TM_N; i++) {\n    G(L)->tmname[i] = luaS_new(L, luaT_eventname[i]);\n    luaC_fix(L, obj2gco(G(L)->tmname[i]));  /* never collect these names */\n  }\n}\n\n\n/*\n** function to be used with macro \"fasttm\": optimized for absence of\n** tag methods\n*/\nconst TValue *luaT_gettm (Table *events, TMS event, TString *ename) {\n  const TValue *tm = luaH_getstr(events, ename);\n  lua_assert(event <= TM_EQ);\n  if (ttisnil(tm)) {  /* no tag method? */\n    events->flags |= cast_byte(1u<<event);  /* cache this fact */\n    return NULL;\n  }\n  else return tm;\n}\n\n\nconst TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) {\n  Table *mt;\n  switch (ttnov(o)) {\n    case LUA_TTABLE:\n      mt = hvalue(o)->metatable;\n      break;\n    case LUA_TUSERDATA:\n      mt = uvalue(o)->metatable;\n      break;\n    default:\n      mt = G(L)->mt[ttnov(o)];\n  }\n  return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject);\n}\n\n\nvoid luaT_callTM (lua_State *L, const TValue *f, const TValue *p1,\n                  const TValue *p2, TValue *p3, int hasres) {\n  ptrdiff_t result = savestack(L, p3);\n  setobj2s(L, L->top++, f);  /* push function (assume EXTRA_STACK) */\n  setobj2s(L, L->top++, p1);  /* 1st argument */\n  setobj2s(L, L->top++, p2);  /* 2nd argument */\n  if (!hasres)  /* no result? 'p3' is third argument */\n    setobj2s(L, L->top++, p3);  /* 3rd argument */\n  /* metamethod may yield only when called from Lua code */\n  luaD_call(L, L->top - (4 - hasres), hasres, isLua(L->ci));\n  if (hasres) {  /* if has result, move it to its place */\n    p3 = restorestack(L, result);\n    setobjs2s(L, p3, --L->top);\n  }\n}\n\n\nint luaT_callbinTM (lua_State *L, const TValue *p1, const TValue *p2,\n                    StkId res, TMS event) {\n  const TValue *tm = luaT_gettmbyobj(L, p1, event);  /* try first operand */\n  if (ttisnil(tm))\n    tm = luaT_gettmbyobj(L, p2, event);  /* try second operand */\n  if (ttisnil(tm)) return 0;\n  luaT_callTM(L, tm, p1, p2, res, 1);\n  return 1;\n}\n\n\nvoid luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2,\n                    StkId res, TMS event) {\n  if (!luaT_callbinTM(L, p1, p2, res, event)) {\n    switch (event) {\n      case TM_CONCAT:\n        luaG_concaterror(L, p1, p2);\n      case TM_BAND: case TM_BOR: case TM_BXOR:\n      case TM_SHL: case TM_SHR: case TM_BNOT: {\n        lua_Number dummy;\n        if (tonumber(p1, &dummy) && tonumber(p2, &dummy))\n          luaG_tointerror(L, p1, p2);\n        else\n          luaG_opinterror(L, p1, p2, \"perform bitwise operation on\");\n        /* else go through */\n      }\n      default:\n        luaG_opinterror(L, p1, p2, \"perform arithmetic on\");\n    }\n  }\n}\n\n\nint luaT_callorderTM (lua_State *L, const TValue *p1, const TValue *p2,\n                      TMS event) {\n  if (!luaT_callbinTM(L, p1, p2, L->top, event))\n    return -1;  /* no metamethod */\n  else\n    return !l_isfalse(L->top);\n}\n\n"
  },
  {
    "path": "externals/lua/src/ltm.h",
    "content": "/*\n** $Id: ltm.h,v 2.21 2014/10/25 11:50:46 roberto Exp $\n** Tag methods\n** See Copyright Notice in lua.h\n*/\n\n#ifndef ltm_h\n#define ltm_h\n\n\n#include \"lobject.h\"\n\n\n/*\n* WARNING: if you change the order of this enumeration,\n* grep \"ORDER TM\" and \"ORDER OP\"\n*/\ntypedef enum {\n  TM_INDEX,\n  TM_NEWINDEX,\n  TM_GC,\n  TM_MODE,\n  TM_LEN,\n  TM_EQ,  /* last tag method with fast access */\n  TM_ADD,\n  TM_SUB,\n  TM_MUL,\n  TM_MOD,\n  TM_POW,\n  TM_DIV,\n  TM_IDIV,\n  TM_BAND,\n  TM_BOR,\n  TM_BXOR,\n  TM_SHL,\n  TM_SHR,\n  TM_UNM,\n  TM_BNOT,\n  TM_LT,\n  TM_LE,\n  TM_CONCAT,\n  TM_CALL,\n  TM_N\t\t/* number of elements in the enum */\n} TMS;\n\n\n\n#define gfasttm(g,et,e) ((et) == NULL ? NULL : \\\n  ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e]))\n\n#define fasttm(l,et,e)\tgfasttm(G(l), et, e)\n\n#define ttypename(x)\tluaT_typenames_[(x) + 1]\n#define objtypename(x)\tttypename(ttnov(x))\n\nLUAI_DDEC const char *const luaT_typenames_[LUA_TOTALTAGS];\n\n\nLUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename);\nLUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o,\n                                                       TMS event);\nLUAI_FUNC void luaT_init (lua_State *L);\n\nLUAI_FUNC void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1,\n                            const TValue *p2, TValue *p3, int hasres);\nLUAI_FUNC int luaT_callbinTM (lua_State *L, const TValue *p1, const TValue *p2,\n                              StkId res, TMS event);\nLUAI_FUNC void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2,\n                              StkId res, TMS event);\nLUAI_FUNC int luaT_callorderTM (lua_State *L, const TValue *p1,\n                                const TValue *p2, TMS event);\n\n\n\n#endif\n"
  },
  {
    "path": "externals/lua/src/lua.c",
    "content": "/*\n** $Id: lua.c,v 1.222 2014/11/11 19:41:27 roberto Exp $\n** Lua stand-alone interpreter\n** See Copyright Notice in lua.h\n*/\n\n#define lua_c\n\n#include \"lprefix.h\"\n\n\n#include <signal.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"lauxlib.h\"\n#include \"lualib.h\"\n\n\n#if !defined(LUA_PROMPT)\n#define LUA_PROMPT\t\t\"> \"\n#define LUA_PROMPT2\t\t\">> \"\n#endif\n\n#if !defined(LUA_PROGNAME)\n#define LUA_PROGNAME\t\t\"lua\"\n#endif\n\n#if !defined(LUA_MAXINPUT)\n#define LUA_MAXINPUT\t\t512\n#endif\n\n#if !defined(LUA_INIT_VAR)\n#define LUA_INIT_VAR\t\t\"LUA_INIT\"\n#endif\n\n#define LUA_INITVARVERSION  \\\n\tLUA_INIT_VAR \"_\" LUA_VERSION_MAJOR \"_\" LUA_VERSION_MINOR\n\n\n/*\n** lua_stdin_is_tty detects whether the standard input is a 'tty' (that\n** is, whether we're running lua interactively).\n*/\n#if !defined(lua_stdin_is_tty)\t/* { */\n\n#if defined(LUA_USE_POSIX)\t/* { */\n\n#include <unistd.h>\n#define lua_stdin_is_tty()\tisatty(0)\n\n#elif defined(LUA_USE_WINDOWS)\t/* }{ */\n\n#include <io.h>\n#define lua_stdin_is_tty()\t_isatty(_fileno(stdin))\n\n#else\t\t\t\t/* }{ */\n\n/* ISO C definition */\n#define lua_stdin_is_tty()\t1  /* assume stdin is a tty */\n\n#endif\t\t\t\t/* } */\n\n#endif\t\t\t\t/* } */\n\n\n/*\n** lua_readline defines how to show a prompt and then read a line from\n** the standard input.\n** lua_saveline defines how to \"save\" a read line in a \"history\".\n** lua_freeline defines how to free a line read by lua_readline.\n*/\n#if !defined(lua_readline)\t/* { */\n\n#if defined(LUA_USE_READLINE)\t/* { */\n\n#include <readline/readline.h>\n#include <readline/history.h>\n#define lua_readline(L,b,p)\t((void)L, ((b)=readline(p)) != NULL)\n#define lua_saveline(L,idx) \\\n        if (lua_rawlen(L,idx) > 0)  /* non-empty line? */ \\\n          add_history(lua_tostring(L, idx));  /* add it to history */\n#define lua_freeline(L,b)\t((void)L, free(b))\n\n#else\t\t\t\t/* }{ */\n\n#define lua_readline(L,b,p) \\\n        ((void)L, fputs(p, stdout), fflush(stdout),  /* show prompt */ \\\n        fgets(b, LUA_MAXINPUT, stdin) != NULL)  /* get line */\n#define lua_saveline(L,idx)\t{ (void)L; (void)idx; }\n#define lua_freeline(L,b)\t{ (void)L; (void)b; }\n\n#endif\t\t\t\t/* } */\n\n#endif\t\t\t\t/* } */\n\n\n\n\nstatic lua_State *globalL = NULL;\n\nstatic const char *progname = LUA_PROGNAME;\n\n\n/*\n** Hook set by signal function to stop the interpreter.\n*/\nstatic void lstop (lua_State *L, lua_Debug *ar) {\n  (void)ar;  /* unused arg. */\n  lua_sethook(L, NULL, 0, 0);  /* reset hook */\n  luaL_error(L, \"interrupted!\");\n}\n\n\n/*\n** Function to be called at a C signal. Because a C signal cannot\n** just change a Lua state (as there is no proper synchronization),\n** this function only sets a hook that, when called, will stop the\n** interpreter.\n*/\nstatic void laction (int i) {\n  signal(i, SIG_DFL); /* if another SIGINT happens, terminate process */\n  lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1);\n}\n\n\nstatic void print_usage (const char *badoption) {\n  lua_writestringerror(\"%s: \", progname);\n  if (badoption[1] == 'e' || badoption[1] == 'l')\n    lua_writestringerror(\"'%s' needs argument\\n\", badoption);\n  else\n    lua_writestringerror(\"unrecognized option '%s'\\n\", badoption);\n  lua_writestringerror(\n  \"usage: %s [options] [script [args]]\\n\"\n  \"Available options are:\\n\"\n  \"  -e stat  execute string 'stat'\\n\"\n  \"  -i       enter interactive mode after executing 'script'\\n\"\n  \"  -l name  require library 'name'\\n\"\n  \"  -v       show version information\\n\"\n  \"  -E       ignore environment variables\\n\"\n  \"  --       stop handling options\\n\"\n  \"  -        stop handling options and execute stdin\\n\"\n  ,\n  progname);\n}\n\n\n/*\n** Prints an error message, adding the program name in front of it\n** (if present)\n*/\nstatic void l_message (const char *pname, const char *msg) {\n  if (pname) lua_writestringerror(\"%s: \", pname);\n  lua_writestringerror(\"%s\\n\", msg);\n}\n\n\n/*\n** Check whether 'status' is not OK and, if so, prints the error\n** message on the top of the stack. It assumes that the error object\n** is a string, as it was either generated by Lua or by 'msghandler'.\n*/\nstatic int report (lua_State *L, int status) {\n  if (status != LUA_OK) {\n    const char *msg = lua_tostring(L, -1);\n    l_message(progname, msg);\n    lua_pop(L, 1);  /* remove message */\n  }\n  return status;\n}\n\n\n/*\n** Message handler used to run all chunks\n*/\nstatic int msghandler (lua_State *L) {\n  const char *msg = lua_tostring(L, 1);\n  if (msg == NULL) {  /* is error object not a string? */\n    if (luaL_callmeta(L, 1, \"__tostring\") &&  /* does it have a metamethod */\n        lua_type(L, -1) == LUA_TSTRING)  /* that produces a string? */\n      return 1;  /* that is the message */\n    else\n      msg = lua_pushfstring(L, \"(error object is a %s value)\",\n                               luaL_typename(L, 1));\n  }\n  luaL_traceback(L, L, msg, 1);  /* append a standard traceback */\n  return 1;  /* return the traceback */\n}\n\n\n/*\n** Interface to 'lua_pcall', which sets appropriate message function\n** and C-signal handler. Used to run all chunks.\n*/\nstatic int docall (lua_State *L, int narg, int nres) {\n  int status;\n  int base = lua_gettop(L) - narg;  /* function index */\n  lua_pushcfunction(L, msghandler);  /* push message handler */\n  lua_insert(L, base);  /* put it under function and args */\n  globalL = L;  /* to be available to 'laction' */\n  signal(SIGINT, laction);  /* set C-signal handler */\n  status = lua_pcall(L, narg, nres, base);\n  signal(SIGINT, SIG_DFL); /* reset C-signal handler */\n  lua_remove(L, base);  /* remove message handler from the stack */\n  return status;\n}\n\n\nstatic void print_version (void) {\n  lua_writestring(LUA_COPYRIGHT, strlen(LUA_COPYRIGHT));\n  lua_writeline();\n}\n\n\n/*\n** Create the 'arg' table, which stores all arguments from the\n** command line ('argv'). It should be aligned so that, at index 0,\n** it has 'argv[script]', which is the script name. The arguments\n** to the script (everything after 'script') go to positive indices;\n** other arguments (before the script name) go to negative indices.\n** If there is no script name, assume interpreter's name as base.\n*/\nstatic void createargtable (lua_State *L, char **argv, int argc, int script) {\n  int i, narg;\n  if (script == argc) script = 0;  /* no script name? */\n  narg = argc - (script + 1);  /* number of positive indices */\n  lua_createtable(L, narg, script + 1);\n  for (i = 0; i < argc; i++) {\n    lua_pushstring(L, argv[i]);\n    lua_rawseti(L, -2, i - script);\n  }\n  lua_setglobal(L, \"arg\");\n}\n\n\nstatic int dochunk (lua_State *L, int status) {\n  if (status == LUA_OK) status = docall(L, 0, 0);\n  return report(L, status);\n}\n\n\nstatic int dofile (lua_State *L, const char *name) {\n  return dochunk(L, luaL_loadfile(L, name));\n}\n\n\nstatic int dostring (lua_State *L, const char *s, const char *name) {\n  return dochunk(L, luaL_loadbuffer(L, s, strlen(s), name));\n}\n\n\n/*\n** Calls 'require(name)' and stores the result in a global variable\n** with the given name.\n*/\nstatic int dolibrary (lua_State *L, const char *name) {\n  int status;\n  lua_getglobal(L, \"require\");\n  lua_pushstring(L, name);\n  status = docall(L, 1, 1);  /* call 'require(name)' */\n  if (status == LUA_OK)\n    lua_setglobal(L, name);  /* global[name] = require return */\n  return report(L, status);\n}\n\n\n/*\n** Returns the string to be used as a prompt by the interpreter.\n*/\nstatic const char *get_prompt (lua_State *L, int firstline) {\n  const char *p;\n  lua_getglobal(L, firstline ? \"_PROMPT\" : \"_PROMPT2\");\n  p = lua_tostring(L, -1);\n  if (p == NULL) p = (firstline ? LUA_PROMPT : LUA_PROMPT2);\n  return p;\n}\n\n/* mark in error messages for incomplete statements */\n#define EOFMARK\t\t\"<eof>\"\n#define marklen\t\t(sizeof(EOFMARK)/sizeof(char) - 1)\n\n\n/*\n** Check whether 'status' signals a syntax error and the error\n** message at the top of the stack ends with the above mark for\n** incomplete statements.\n*/\nstatic int incomplete (lua_State *L, int status) {\n  if (status == LUA_ERRSYNTAX) {\n    size_t lmsg;\n    const char *msg = lua_tolstring(L, -1, &lmsg);\n    if (lmsg >= marklen && strcmp(msg + lmsg - marklen, EOFMARK) == 0) {\n      lua_pop(L, 1);\n      return 1;\n    }\n  }\n  return 0;  /* else... */\n}\n\n\n/*\n** Prompt the user, read a line, and push it into the Lua stack.\n*/\nstatic int pushline (lua_State *L, int firstline) {\n  char buffer[LUA_MAXINPUT];\n  char *b = buffer;\n  size_t l;\n  const char *prmt = get_prompt(L, firstline);\n  int readstatus = lua_readline(L, b, prmt);\n  if (readstatus == 0)\n    return 0;  /* no input (prompt will be popped by caller) */\n  lua_pop(L, 1);  /* remove prompt */\n  l = strlen(b);\n  if (l > 0 && b[l-1] == '\\n')  /* line ends with newline? */\n    b[l-1] = '\\0';  /* remove it */\n  if (firstline && b[0] == '=')  /* for compatibility with 5.2, ... */\n    lua_pushfstring(L, \"return %s\", b + 1);  /* change '=' to 'return' */\n  else\n    lua_pushstring(L, b);\n  lua_freeline(L, b);\n  return 1;\n}\n\n\n/*\n** Try to compile line on the stack as 'return <line>'; on return, stack\n** has either compiled chunk or original line (if compilation failed).\n*/\nstatic int addreturn (lua_State *L) {\n  int status;\n  size_t len; const char *line;\n  lua_pushliteral(L, \"return \");\n  lua_pushvalue(L, -2);  /* duplicate line */\n  lua_concat(L, 2);  /* new line is \"return ...\" */\n  line = lua_tolstring(L, -1, &len);\n  if ((status = luaL_loadbuffer(L, line, len, \"=stdin\")) == LUA_OK)\n    lua_remove(L, -3);  /* remove original line */\n  else\n    lua_pop(L, 2);  /* remove result from 'luaL_loadbuffer' and new line */\n  return status;\n}\n\n\n/*\n** Read multiple lines until a complete Lua statement\n*/\nstatic int multiline (lua_State *L) {\n  for (;;) {  /* repeat until gets a complete statement */\n    size_t len;\n    const char *line = lua_tolstring(L, 1, &len);  /* get what it has */\n    int status = luaL_loadbuffer(L, line, len, \"=stdin\");  /* try it */\n    if (!incomplete(L, status) || !pushline(L, 0))\n      return status;  /* cannot or should not try to add continuation line */\n    lua_pushliteral(L, \"\\n\");  /* add newline... */\n    lua_insert(L, -2);  /* ...between the two lines */\n    lua_concat(L, 3);  /* join them */\n  }\n}\n\n\n/*\n** Read a line and try to load (compile) it first as an expression (by\n** adding \"return \" in front of it) and second as a statement. Return\n** the final status of load/call with the resulting function (if any)\n** in the top of the stack.\n*/\nstatic int loadline (lua_State *L) {\n  int status;\n  lua_settop(L, 0);\n  if (!pushline(L, 1))\n    return -1;  /* no input */\n  if ((status = addreturn(L)) != LUA_OK)  /* 'return ...' did not work? */\n    status = multiline(L);  /* try as command, maybe with continuation lines */\n  lua_saveline(L, 1);  /* keep history */\n  lua_remove(L, 1);  /* remove line from the stack */\n  lua_assert(lua_gettop(L) == 1);\n  return status;\n}\n\n\n/*\n** Prints (calling the Lua 'print' function) any values on the stack\n*/\nstatic void l_print (lua_State *L) {\n  int n = lua_gettop(L);\n  if (n > 0) {  /* any result to be printed? */\n    luaL_checkstack(L, LUA_MINSTACK, \"too many results to print\");\n    lua_getglobal(L, \"print\");\n    lua_insert(L, 1);\n    if (lua_pcall(L, n, 0, 0) != LUA_OK)\n      l_message(progname, lua_pushfstring(L, \"error calling 'print' (%s)\",\n                                             lua_tostring(L, -1)));\n  }\n}\n\n\n/*\n** Do the REPL: repeatedly read (load) a line, evaluate (call) it, and\n** print any results.\n*/\nstatic void doREPL (lua_State *L) {\n  int status;\n  const char *oldprogname = progname;\n  progname = NULL;  /* no 'progname' on errors in interactive mode */\n  while ((status = loadline(L)) != -1) {\n    if (status == LUA_OK)\n      status = docall(L, 0, LUA_MULTRET);\n    if (status == LUA_OK) l_print(L);\n    else report(L, status);\n  }\n  lua_settop(L, 0);  /* clear stack */\n  lua_writeline();\n  progname = oldprogname;\n}\n\n\n/*\n** Push on the stack the contents of table 'arg' from 1 to #arg\n*/\nstatic int pushargs (lua_State *L) {\n  int i, n;\n  if (lua_getglobal(L, \"arg\") != LUA_TTABLE)\n    luaL_error(L, \"'arg' is not a table\");\n  n = (int)luaL_len(L, -1);\n  luaL_checkstack(L, n + 3, \"too many arguments to script\");\n  for (i = 1; i <= n; i++)\n    lua_rawgeti(L, -i, i);\n  lua_remove(L, -i);  /* remove table from the stack */\n  return n;\n}\n\n\nstatic int handle_script (lua_State *L, char **argv) {\n  int status;\n  const char *fname = argv[0];\n  if (strcmp(fname, \"-\") == 0 && strcmp(argv[-1], \"--\") != 0)\n    fname = NULL;  /* stdin */\n  status = luaL_loadfile(L, fname);\n  if (status == LUA_OK) {\n    int n = pushargs(L);  /* push arguments to script */\n    status = docall(L, n, LUA_MULTRET);\n  }\n  return report(L, status);\n}\n\n\n\n/* bits of various argument indicators in 'args' */\n#define has_error\t1\t/* bad option */\n#define has_i\t\t2\t/* -i */\n#define has_v\t\t4\t/* -v */\n#define has_e\t\t8\t/* -e */\n#define has_E\t\t16\t/* -E */\n\n/*\n** Traverses all arguments from 'argv', returning a mask with those\n** needed before running any Lua code (or an error code if it finds\n** any invalid argument). 'first' returns the first not-handled argument \n** (either the script name or a bad argument in case of error).\n*/\nstatic int collectargs (char **argv, int *first) {\n  int args = 0;\n  int i;\n  for (i = 1; argv[i] != NULL; i++) {\n    *first = i;\n    if (argv[i][0] != '-')  /* not an option? */\n        return args;  /* stop handling options */\n    switch (argv[i][1]) {  /* else check option */\n      case '-':  /* '--' */\n        if (argv[i][2] != '\\0')  /* extra characters after '--'? */\n          return has_error;  /* invalid option */\n        *first = i + 1;\n        return args;\n      case '\\0':  /* '-' */\n        return args;  /* script \"name\" is '-' */\n      case 'E':\n        if (argv[i][2] != '\\0')  /* extra characters after 1st? */\n          return has_error;  /* invalid option */\n        args |= has_E;\n        break;\n      case 'i':\n        args |= has_i;  /* goes through  (-i implies -v) */\n      case 'v':\n        if (argv[i][2] != '\\0')  /* extra characters after 1st? */\n          return has_error;  /* invalid option */\n        args |= has_v;\n        break;\n      case 'e':\n        args |= has_e;  /* go through */\n      case 'l':  /* both options need an argument */\n        if (argv[i][2] == '\\0') {  /* no concatenated argument? */\n          i++;  /* try next 'argv' */\n          if (argv[i] == NULL || argv[i][0] == '-')\n            return has_error;  /* no next argument or it is another option */\n        }\n        break;\n      default:  /* invalid option */\n        return has_error;\n    }\n  }\n  *first = i;  /* no script name */\n  return args;\n}\n\n\n/*\n** Processes options 'e' and 'l', which involve running Lua code.\n** Returns 0 if some code raises an error.\n*/\nstatic int runargs (lua_State *L, char **argv, int n) {\n  int i;\n  for (i = 1; i < n; i++) {\n    int status;\n    int option = argv[i][1];\n    lua_assert(argv[i][0] == '-');  /* already checked */\n    if (option == 'e' || option == 'l') {\n      const char *extra = argv[i] + 2;  /* both options need an argument */\n      if (*extra == '\\0') extra = argv[++i];\n      lua_assert(extra != NULL);\n      if (option == 'e')\n        status = dostring(L, extra, \"=(command line)\");\n      else\n        status = dolibrary(L, extra);\n      if (status != LUA_OK) return 0;\n    }\n  }\n  return 1;\n}\n\n\nstatic int handle_luainit (lua_State *L) {\n  const char *name = \"=\" LUA_INITVARVERSION;\n  const char *init = getenv(name + 1);\n  if (init == NULL) {\n    name = \"=\" LUA_INIT_VAR;\n    init = getenv(name + 1);  /* try alternative name */\n  }\n  if (init == NULL) return LUA_OK;\n  else if (init[0] == '@')\n    return dofile(L, init+1);\n  else\n    return dostring(L, init, name);\n}\n\n\n/*\n** Main body of stand-alone interpreter (to be called in protected mode).\n** Reads the options and handles them all.\n*/\nstatic int pmain (lua_State *L) {\n  int argc = (int)lua_tointeger(L, 1);\n  char **argv = (char **)lua_touserdata(L, 2);\n  int script;\n  int args = collectargs(argv, &script);\n  luaL_checkversion(L);  /* check that interpreter has correct version */\n  if (argv[0] && argv[0][0]) progname = argv[0];\n  if (args == has_error) {  /* bad arg? */\n    print_usage(argv[script]);  /* 'script' has index of bad arg. */\n    return 0;\n  }\n  if (args & has_v)  /* option '-v'? */\n    print_version();\n  if (args & has_E) {  /* option '-E'? */\n    lua_pushboolean(L, 1);  /* signal for libraries to ignore env. vars. */\n    lua_setfield(L, LUA_REGISTRYINDEX, \"LUA_NOENV\");\n  }\n  luaL_openlibs(L);  /* open standard libraries */\n  createargtable(L, argv, argc, script);  /* create table 'arg' */\n  if (!(args & has_E)) {  /* no option '-E'? */\n    if (handle_luainit(L) != LUA_OK)  /* run LUA_INIT */\n      return 0;  /* error running LUA_INIT */\n  }\n  if (!runargs(L, argv, script))  /* execute arguments -e and -l */\n    return 0;  /* something failed */\n  if (script < argc &&  /* execute main script (if there is one) */\n      handle_script(L, argv + script) != LUA_OK)\n    return 0;\n  if (args & has_i)  /* -i option? */\n    doREPL(L);  /* do read-eval-print loop */\n  else if (script == argc && !(args & (has_e | has_v))) {  /* no arguments? */\n    if (lua_stdin_is_tty()) {  /* running in interactive mode? */\n      print_version();\n      doREPL(L);  /* do read-eval-print loop */\n    }\n    else dofile(L, NULL);  /* executes stdin as a file */\n  }\n  lua_pushboolean(L, 1);  /* signal no errors */\n  return 1;\n}\n\n\nint main (int argc, char **argv) {\n  int status, result;\n  lua_State *L = luaL_newstate();  /* create state */\n  if (L == NULL) {\n    l_message(argv[0], \"cannot create state: not enough memory\");\n    return EXIT_FAILURE;\n  }\n  lua_pushcfunction(L, &pmain);  /* to call 'pmain' in protected mode */\n  lua_pushinteger(L, argc);  /* 1st argument */\n  lua_pushlightuserdata(L, argv); /* 2nd argument */\n  status = lua_pcall(L, 2, 1, 0);  /* do the call */\n  result = lua_toboolean(L, -1);  /* get result */\n  report(L, status);\n  lua_close(L);\n  return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE;\n}\n\n"
  },
  {
    "path": "externals/lua/src/lua.h",
    "content": "/*\n** $Id: lua.h,v 1.325 2014/12/26 17:24:27 roberto Exp $\n** Lua - A Scripting Language\n** Lua.org, PUC-Rio, Brazil (http://www.lua.org)\n** See Copyright Notice at the end of this file\n*/\n\n\n#ifndef lua_h\n#define lua_h\n\n#include <stdarg.h>\n#include <stddef.h>\n\n\n#include \"luaconf.h\"\n\n\n#define LUA_VERSION_MAJOR\t\"5\"\n#define LUA_VERSION_MINOR\t\"3\"\n#define LUA_VERSION_NUM\t\t503\n#define LUA_VERSION_RELEASE\t\"0\"\n\n#define LUA_VERSION\t\"Lua \" LUA_VERSION_MAJOR \".\" LUA_VERSION_MINOR\n#define LUA_RELEASE\tLUA_VERSION \".\" LUA_VERSION_RELEASE\n#define LUA_COPYRIGHT\tLUA_RELEASE \"  Copyright (C) 1994-2015 Lua.org, PUC-Rio\"\n#define LUA_AUTHORS\t\"R. Ierusalimschy, L. H. de Figueiredo, W. Celes\"\n\n\n/* mark for precompiled code ('<esc>Lua') */\n#define LUA_SIGNATURE\t\"\\x1bLua\"\n\n/* option for multiple returns in 'lua_pcall' and 'lua_call' */\n#define LUA_MULTRET\t(-1)\n\n\n/*\n** pseudo-indices\n*/\n#define LUA_REGISTRYINDEX\tLUAI_FIRSTPSEUDOIDX\n#define lua_upvalueindex(i)\t(LUA_REGISTRYINDEX - (i))\n\n\n/* thread status */\n#define LUA_OK\t\t0\n#define LUA_YIELD\t1\n#define LUA_ERRRUN\t2\n#define LUA_ERRSYNTAX\t3\n#define LUA_ERRMEM\t4\n#define LUA_ERRGCMM\t5\n#define LUA_ERRERR\t6\n\n\ntypedef struct lua_State lua_State;\n\n\n/*\n** basic types\n*/\n#define LUA_TNONE\t\t(-1)\n\n#define LUA_TNIL\t\t0\n#define LUA_TBOOLEAN\t\t1\n#define LUA_TLIGHTUSERDATA\t2\n#define LUA_TNUMBER\t\t3\n#define LUA_TSTRING\t\t4\n#define LUA_TTABLE\t\t5\n#define LUA_TFUNCTION\t\t6\n#define LUA_TUSERDATA\t\t7\n#define LUA_TTHREAD\t\t8\n\n#define LUA_NUMTAGS\t\t9\n\n\n\n/* minimum Lua stack available to a C function */\n#define LUA_MINSTACK\t20\n\n\n/* predefined values in the registry */\n#define LUA_RIDX_MAINTHREAD\t1\n#define LUA_RIDX_GLOBALS\t2\n#define LUA_RIDX_LAST\t\tLUA_RIDX_GLOBALS\n\n\n/* type of numbers in Lua */\ntypedef LUA_NUMBER lua_Number;\n\n\n/* type for integer functions */\ntypedef LUA_INTEGER lua_Integer;\n\n/* unsigned integer type */\ntypedef LUA_UNSIGNED lua_Unsigned;\n\n/* type for continuation-function contexts */\ntypedef LUA_KCONTEXT lua_KContext;\n\n\n/*\n** Type for C functions registered with Lua\n*/\ntypedef int (*lua_CFunction) (lua_State *L);\n\n/*\n** Type for continuation functions\n*/\ntypedef int (*lua_KFunction) (lua_State *L, int status, lua_KContext ctx);\n\n\n/*\n** Type for functions that read/write blocks when loading/dumping Lua chunks\n*/\ntypedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz);\n\ntypedef int (*lua_Writer) (lua_State *L, const void *p, size_t sz, void *ud);\n\n\n/*\n** Type for memory-allocation functions\n*/\ntypedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);\n\n\n\n/*\n** generic extra include file\n*/\n#if defined(LUA_USER_H)\n#include LUA_USER_H\n#endif\n\n\n/*\n** RCS ident string\n*/\nextern const char lua_ident[];\n\n\n/*\n** state manipulation\n*/\nLUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud);\nLUA_API void       (lua_close) (lua_State *L);\nLUA_API lua_State *(lua_newthread) (lua_State *L);\n\nLUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf);\n\n\nLUA_API const lua_Number *(lua_version) (lua_State *L);\n\n\n/*\n** basic stack manipulation\n*/\nLUA_API int   (lua_absindex) (lua_State *L, int idx);\nLUA_API int   (lua_gettop) (lua_State *L);\nLUA_API void  (lua_settop) (lua_State *L, int idx);\nLUA_API void  (lua_pushvalue) (lua_State *L, int idx);\nLUA_API void  (lua_rotate) (lua_State *L, int idx, int n);\nLUA_API void  (lua_copy) (lua_State *L, int fromidx, int toidx);\nLUA_API int   (lua_checkstack) (lua_State *L, int n);\n\nLUA_API void  (lua_xmove) (lua_State *from, lua_State *to, int n);\n\n\n/*\n** access functions (stack -> C)\n*/\n\nLUA_API int             (lua_isnumber) (lua_State *L, int idx);\nLUA_API int             (lua_isstring) (lua_State *L, int idx);\nLUA_API int             (lua_iscfunction) (lua_State *L, int idx);\nLUA_API int             (lua_isinteger) (lua_State *L, int idx);\nLUA_API int             (lua_isuserdata) (lua_State *L, int idx);\nLUA_API int             (lua_type) (lua_State *L, int idx);\nLUA_API const char     *(lua_typename) (lua_State *L, int tp);\n\nLUA_API lua_Number      (lua_tonumberx) (lua_State *L, int idx, int *isnum);\nLUA_API lua_Integer     (lua_tointegerx) (lua_State *L, int idx, int *isnum);\nLUA_API int             (lua_toboolean) (lua_State *L, int idx);\nLUA_API const char     *(lua_tolstring) (lua_State *L, int idx, size_t *len);\nLUA_API size_t          (lua_rawlen) (lua_State *L, int idx);\nLUA_API lua_CFunction   (lua_tocfunction) (lua_State *L, int idx);\nLUA_API void\t       *(lua_touserdata) (lua_State *L, int idx);\nLUA_API lua_State      *(lua_tothread) (lua_State *L, int idx);\nLUA_API const void     *(lua_topointer) (lua_State *L, int idx);\n\n\n/*\n** Comparison and arithmetic functions\n*/\n\n#define LUA_OPADD\t0\t/* ORDER TM, ORDER OP */\n#define LUA_OPSUB\t1\n#define LUA_OPMUL\t2\n#define LUA_OPMOD\t3\n#define LUA_OPPOW\t4\n#define LUA_OPDIV\t5\n#define LUA_OPIDIV\t6\n#define LUA_OPBAND\t7\n#define LUA_OPBOR\t8\n#define LUA_OPBXOR\t9\n#define LUA_OPSHL\t10\n#define LUA_OPSHR\t11\n#define LUA_OPUNM\t12\n#define LUA_OPBNOT\t13\n\nLUA_API void  (lua_arith) (lua_State *L, int op);\n\n#define LUA_OPEQ\t0\n#define LUA_OPLT\t1\n#define LUA_OPLE\t2\n\nLUA_API int   (lua_rawequal) (lua_State *L, int idx1, int idx2);\nLUA_API int   (lua_compare) (lua_State *L, int idx1, int idx2, int op);\n\n\n/*\n** push functions (C -> stack)\n*/\nLUA_API void        (lua_pushnil) (lua_State *L);\nLUA_API void        (lua_pushnumber) (lua_State *L, lua_Number n);\nLUA_API void        (lua_pushinteger) (lua_State *L, lua_Integer n);\nLUA_API const char *(lua_pushlstring) (lua_State *L, const char *s, size_t len);\nLUA_API const char *(lua_pushstring) (lua_State *L, const char *s);\nLUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt,\n                                                      va_list argp);\nLUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...);\nLUA_API void  (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n);\nLUA_API void  (lua_pushboolean) (lua_State *L, int b);\nLUA_API void  (lua_pushlightuserdata) (lua_State *L, void *p);\nLUA_API int   (lua_pushthread) (lua_State *L);\n\n\n/*\n** get functions (Lua -> stack)\n*/\nLUA_API int (lua_getglobal) (lua_State *L, const char *name);\nLUA_API int (lua_gettable) (lua_State *L, int idx);\nLUA_API int (lua_getfield) (lua_State *L, int idx, const char *k);\nLUA_API int (lua_geti) (lua_State *L, int idx, lua_Integer n);\nLUA_API int (lua_rawget) (lua_State *L, int idx);\nLUA_API int (lua_rawgeti) (lua_State *L, int idx, lua_Integer n);\nLUA_API int (lua_rawgetp) (lua_State *L, int idx, const void *p);\n\nLUA_API void  (lua_createtable) (lua_State *L, int narr, int nrec);\nLUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);\nLUA_API int   (lua_getmetatable) (lua_State *L, int objindex);\nLUA_API int  (lua_getuservalue) (lua_State *L, int idx);\n\n\n/*\n** set functions (stack -> Lua)\n*/\nLUA_API void  (lua_setglobal) (lua_State *L, const char *name);\nLUA_API void  (lua_settable) (lua_State *L, int idx);\nLUA_API void  (lua_setfield) (lua_State *L, int idx, const char *k);\nLUA_API void  (lua_seti) (lua_State *L, int idx, lua_Integer n);\nLUA_API void  (lua_rawset) (lua_State *L, int idx);\nLUA_API void  (lua_rawseti) (lua_State *L, int idx, lua_Integer n);\nLUA_API void  (lua_rawsetp) (lua_State *L, int idx, const void *p);\nLUA_API int   (lua_setmetatable) (lua_State *L, int objindex);\nLUA_API void  (lua_setuservalue) (lua_State *L, int idx);\n\n\n/*\n** 'load' and 'call' functions (load and run Lua code)\n*/\nLUA_API void  (lua_callk) (lua_State *L, int nargs, int nresults,\n                           lua_KContext ctx, lua_KFunction k);\n#define lua_call(L,n,r)\t\tlua_callk(L, (n), (r), 0, NULL)\n\nLUA_API int   (lua_pcallk) (lua_State *L, int nargs, int nresults, int errfunc,\n                            lua_KContext ctx, lua_KFunction k);\n#define lua_pcall(L,n,r,f)\tlua_pcallk(L, (n), (r), (f), 0, NULL)\n\nLUA_API int   (lua_load) (lua_State *L, lua_Reader reader, void *dt,\n                          const char *chunkname, const char *mode);\n\nLUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data, int strip);\n\n\n/*\n** coroutine functions\n*/\nLUA_API int  (lua_yieldk)     (lua_State *L, int nresults, lua_KContext ctx,\n                               lua_KFunction k);\nLUA_API int  (lua_resume)     (lua_State *L, lua_State *from, int narg);\nLUA_API int  (lua_status)     (lua_State *L);\nLUA_API int (lua_isyieldable) (lua_State *L);\n\n#define lua_yield(L,n)\t\tlua_yieldk(L, (n), 0, NULL)\n\n\n/*\n** garbage-collection function and options\n*/\n\n#define LUA_GCSTOP\t\t0\n#define LUA_GCRESTART\t\t1\n#define LUA_GCCOLLECT\t\t2\n#define LUA_GCCOUNT\t\t3\n#define LUA_GCCOUNTB\t\t4\n#define LUA_GCSTEP\t\t5\n#define LUA_GCSETPAUSE\t\t6\n#define LUA_GCSETSTEPMUL\t7\n#define LUA_GCISRUNNING\t\t9\n\nLUA_API int (lua_gc) (lua_State *L, int what, int data);\n\n\n/*\n** miscellaneous functions\n*/\n\nLUA_API int   (lua_error) (lua_State *L);\n\nLUA_API int   (lua_next) (lua_State *L, int idx);\n\nLUA_API void  (lua_concat) (lua_State *L, int n);\nLUA_API void  (lua_len)    (lua_State *L, int idx);\n\nLUA_API size_t   (lua_stringtonumber) (lua_State *L, const char *s);\n\nLUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud);\nLUA_API void      (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud);\n\n\n\n/*\n** {==============================================================\n** some useful macros\n** ===============================================================\n*/\n\n#define lua_getextraspace(L)\t((void *)((char *)(L) - LUA_EXTRASPACE))\n\n#define lua_tonumber(L,i)\tlua_tonumberx(L,(i),NULL)\n#define lua_tointeger(L,i)\tlua_tointegerx(L,(i),NULL)\n\n#define lua_pop(L,n)\t\tlua_settop(L, -(n)-1)\n\n#define lua_newtable(L)\t\tlua_createtable(L, 0, 0)\n\n#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))\n\n#define lua_pushcfunction(L,f)\tlua_pushcclosure(L, (f), 0)\n\n#define lua_isfunction(L,n)\t(lua_type(L, (n)) == LUA_TFUNCTION)\n#define lua_istable(L,n)\t(lua_type(L, (n)) == LUA_TTABLE)\n#define lua_islightuserdata(L,n)\t(lua_type(L, (n)) == LUA_TLIGHTUSERDATA)\n#define lua_isnil(L,n)\t\t(lua_type(L, (n)) == LUA_TNIL)\n#define lua_isboolean(L,n)\t(lua_type(L, (n)) == LUA_TBOOLEAN)\n#define lua_isthread(L,n)\t(lua_type(L, (n)) == LUA_TTHREAD)\n#define lua_isnone(L,n)\t\t(lua_type(L, (n)) == LUA_TNONE)\n#define lua_isnoneornil(L, n)\t(lua_type(L, (n)) <= 0)\n\n#define lua_pushliteral(L, s)\t\\\n\tlua_pushlstring(L, \"\" s, (sizeof(s)/sizeof(char))-1)\n\n#define lua_pushglobaltable(L)  \\\n\tlua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS)\n\n#define lua_tostring(L,i)\tlua_tolstring(L, (i), NULL)\n\n\n#define lua_insert(L,idx)\tlua_rotate(L, (idx), 1)\n\n#define lua_remove(L,idx)\t(lua_rotate(L, (idx), -1), lua_pop(L, 1))\n\n#define lua_replace(L,idx)\t(lua_copy(L, -1, (idx)), lua_pop(L, 1))\n\n/* }============================================================== */\n\n\n/*\n** {==============================================================\n** compatibility macros for unsigned conversions\n** ===============================================================\n*/\n#if defined(LUA_COMPAT_APIINTCASTS)\n\n#define lua_pushunsigned(L,n)\tlua_pushinteger(L, (lua_Integer)(n))\n#define lua_tounsignedx(L,i,is)\t((lua_Unsigned)lua_tointegerx(L,i,is))\n#define lua_tounsigned(L,i)\tlua_tounsignedx(L,(i),NULL)\n\n#endif\n/* }============================================================== */\n\n/*\n** {======================================================================\n** Debug API\n** =======================================================================\n*/\n\n\n/*\n** Event codes\n*/\n#define LUA_HOOKCALL\t0\n#define LUA_HOOKRET\t1\n#define LUA_HOOKLINE\t2\n#define LUA_HOOKCOUNT\t3\n#define LUA_HOOKTAILCALL 4\n\n\n/*\n** Event masks\n*/\n#define LUA_MASKCALL\t(1 << LUA_HOOKCALL)\n#define LUA_MASKRET\t(1 << LUA_HOOKRET)\n#define LUA_MASKLINE\t(1 << LUA_HOOKLINE)\n#define LUA_MASKCOUNT\t(1 << LUA_HOOKCOUNT)\n\ntypedef struct lua_Debug lua_Debug;  /* activation record */\n\n\n/* Functions to be called by the debugger in specific events */\ntypedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);\n\n\nLUA_API int (lua_getstack) (lua_State *L, int level, lua_Debug *ar);\nLUA_API int (lua_getinfo) (lua_State *L, const char *what, lua_Debug *ar);\nLUA_API const char *(lua_getlocal) (lua_State *L, const lua_Debug *ar, int n);\nLUA_API const char *(lua_setlocal) (lua_State *L, const lua_Debug *ar, int n);\nLUA_API const char *(lua_getupvalue) (lua_State *L, int funcindex, int n);\nLUA_API const char *(lua_setupvalue) (lua_State *L, int funcindex, int n);\n\nLUA_API void *(lua_upvalueid) (lua_State *L, int fidx, int n);\nLUA_API void  (lua_upvaluejoin) (lua_State *L, int fidx1, int n1,\n                                               int fidx2, int n2);\n\nLUA_API void (lua_sethook) (lua_State *L, lua_Hook func, int mask, int count);\nLUA_API lua_Hook (lua_gethook) (lua_State *L);\nLUA_API int (lua_gethookmask) (lua_State *L);\nLUA_API int (lua_gethookcount) (lua_State *L);\n\n\nstruct lua_Debug {\n  int event;\n  const char *name;\t/* (n) */\n  const char *namewhat;\t/* (n) 'global', 'local', 'field', 'method' */\n  const char *what;\t/* (S) 'Lua', 'C', 'main', 'tail' */\n  const char *source;\t/* (S) */\n  int currentline;\t/* (l) */\n  int linedefined;\t/* (S) */\n  int lastlinedefined;\t/* (S) */\n  unsigned char nups;\t/* (u) number of upvalues */\n  unsigned char nparams;/* (u) number of parameters */\n  char isvararg;        /* (u) */\n  char istailcall;\t/* (t) */\n  char short_src[LUA_IDSIZE]; /* (S) */\n  /* private part */\n  struct CallInfo *i_ci;  /* active function */\n};\n\n/* }====================================================================== */\n\n\n/******************************************************************************\n* Copyright (C) 1994-2015 Lua.org, PUC-Rio.\n*\n* Permission is hereby granted, free of charge, to any person obtaining\n* a copy of this software and associated documentation files (the\n* \"Software\"), to deal in the Software without restriction, including\n* without limitation the rights to use, copy, modify, merge, publish,\n* distribute, sublicense, and/or sell copies of the Software, and to\n* permit persons to whom the Software is furnished to do so, subject to\n* the following conditions:\n*\n* The above copyright notice and this permission notice shall be\n* included in all copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n******************************************************************************/\n\n\n#endif\n"
  },
  {
    "path": "externals/lua/src/lua.hpp",
    "content": "// lua.hpp\n// Lua header files for C++\n// <<extern \"C\">> not supplied automatically because Lua also compiles as C++\n\nextern \"C\" {\n#include \"lua.h\"\n#include \"lualib.h\"\n#include \"lauxlib.h\"\n}\n"
  },
  {
    "path": "externals/lua/src/luac.c",
    "content": "/*\n** $Id: luac.c,v 1.72 2015/01/06 03:09:13 lhf Exp $\n** Lua compiler (saves bytecodes to files; also lists bytecodes)\n** See Copyright Notice in lua.h\n*/\n\n#define luac_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"lua.h\"\n#include \"lauxlib.h\"\n\n#include \"lobject.h\"\n#include \"lstate.h\"\n#include \"lundump.h\"\n\nstatic void PrintFunction(const Proto* f, int full);\n#define luaU_print\tPrintFunction\n\n#define PROGNAME\t\"luac\"\t\t/* default program name */\n#define OUTPUT\t\tPROGNAME \".out\"\t/* default output file */\n\nstatic int listing=0;\t\t\t/* list bytecodes? */\nstatic int dumping=1;\t\t\t/* dump bytecodes? */\nstatic int stripping=0;\t\t\t/* strip debug information? */\nstatic char Output[]={ OUTPUT };\t/* default output file name */\nstatic const char* output=Output;\t/* actual output file name */\nstatic const char* progname=PROGNAME;\t/* actual program name */\n\nstatic void fatal(const char* message)\n{\n fprintf(stderr,\"%s: %s\\n\",progname,message);\n exit(EXIT_FAILURE);\n}\n\nstatic void cannot(const char* what)\n{\n fprintf(stderr,\"%s: cannot %s %s: %s\\n\",progname,what,output,strerror(errno));\n exit(EXIT_FAILURE);\n}\n\nstatic void usage(const char* message)\n{\n if (*message=='-')\n  fprintf(stderr,\"%s: unrecognized option '%s'\\n\",progname,message);\n else\n  fprintf(stderr,\"%s: %s\\n\",progname,message);\n fprintf(stderr,\n  \"usage: %s [options] [filenames]\\n\"\n  \"Available options are:\\n\"\n  \"  -l       list (use -l -l for full listing)\\n\"\n  \"  -o name  output to file 'name' (default is \\\"%s\\\")\\n\"\n  \"  -p       parse only\\n\"\n  \"  -s       strip debug information\\n\"\n  \"  -v       show version information\\n\"\n  \"  --       stop handling options\\n\"\n  \"  -        stop handling options and process stdin\\n\"\n  ,progname,Output);\n exit(EXIT_FAILURE);\n}\n\n#define IS(s)\t(strcmp(argv[i],s)==0)\n\nstatic int doargs(int argc, char* argv[])\n{\n int i;\n int version=0;\n if (argv[0]!=NULL && *argv[0]!=0) progname=argv[0];\n for (i=1; i<argc; i++)\n {\n  if (*argv[i]!='-')\t\t\t/* end of options; keep it */\n   break;\n  else if (IS(\"--\"))\t\t\t/* end of options; skip it */\n  {\n   ++i;\n   if (version) ++version;\n   break;\n  }\n  else if (IS(\"-\"))\t\t\t/* end of options; use stdin */\n   break;\n  else if (IS(\"-l\"))\t\t\t/* list */\n   ++listing;\n  else if (IS(\"-o\"))\t\t\t/* output file */\n  {\n   output=argv[++i];\n   if (output==NULL || *output==0 || (*output=='-' && output[1]!=0))\n    usage(\"'-o' needs argument\");\n   if (IS(\"-\")) output=NULL;\n  }\n  else if (IS(\"-p\"))\t\t\t/* parse only */\n   dumping=0;\n  else if (IS(\"-s\"))\t\t\t/* strip debug information */\n   stripping=1;\n  else if (IS(\"-v\"))\t\t\t/* show version */\n   ++version;\n  else\t\t\t\t\t/* unknown option */\n   usage(argv[i]);\n }\n if (i==argc && (listing || !dumping))\n {\n  dumping=0;\n  argv[--i]=Output;\n }\n if (version)\n {\n  printf(\"%s\\n\",LUA_COPYRIGHT);\n  if (version==argc-1) exit(EXIT_SUCCESS);\n }\n return i;\n}\n\n#define FUNCTION \"(function()end)();\"\n\nstatic const char* reader(lua_State *L, void *ud, size_t *size)\n{\n UNUSED(L);\n if ((*(int*)ud)--)\n {\n  *size=sizeof(FUNCTION)-1;\n  return FUNCTION;\n }\n else\n {\n  *size=0;\n  return NULL;\n }\n}\n\n#define toproto(L,i) getproto(L->top+(i))\n\nstatic const Proto* combine(lua_State* L, int n)\n{\n if (n==1)\n  return toproto(L,-1);\n else\n {\n  Proto* f;\n  int i=n;\n  if (lua_load(L,reader,&i,\"=(\" PROGNAME \")\",NULL)!=LUA_OK) fatal(lua_tostring(L,-1));\n  f=toproto(L,-1);\n  for (i=0; i<n; i++)\n  {\n   f->p[i]=toproto(L,i-n-1);\n   if (f->p[i]->sizeupvalues>0) f->p[i]->upvalues[0].instack=0;\n  }\n  f->sizelineinfo=0;\n  return f;\n }\n}\n\nstatic int writer(lua_State* L, const void* p, size_t size, void* u)\n{\n UNUSED(L);\n return (fwrite(p,size,1,(FILE*)u)!=1) && (size!=0);\n}\n\nstatic int pmain(lua_State* L)\n{\n int argc=(int)lua_tointeger(L,1);\n char** argv=(char**)lua_touserdata(L,2);\n const Proto* f;\n int i;\n if (!lua_checkstack(L,argc)) fatal(\"too many input files\");\n for (i=0; i<argc; i++)\n {\n  const char* filename=IS(\"-\") ? NULL : argv[i];\n  if (luaL_loadfile(L,filename)!=LUA_OK) fatal(lua_tostring(L,-1));\n }\n f=combine(L,argc);\n if (listing) luaU_print(f,listing>1);\n if (dumping)\n {\n  FILE* D= (output==NULL) ? stdout : fopen(output,\"wb\");\n  if (D==NULL) cannot(\"open\");\n  lua_lock(L);\n  luaU_dump(L,f,writer,D,stripping);\n  lua_unlock(L);\n  if (ferror(D)) cannot(\"write\");\n  if (fclose(D)) cannot(\"close\");\n }\n return 0;\n}\n\nint main(int argc, char* argv[])\n{\n lua_State* L;\n int i=doargs(argc,argv);\n argc-=i; argv+=i;\n if (argc<=0) usage(\"no input files given\");\n L=luaL_newstate();\n if (L==NULL) fatal(\"cannot create state: not enough memory\");\n lua_pushcfunction(L,&pmain);\n lua_pushinteger(L,argc);\n lua_pushlightuserdata(L,argv);\n if (lua_pcall(L,2,0,0)!=LUA_OK) fatal(lua_tostring(L,-1));\n lua_close(L);\n return EXIT_SUCCESS;\n}\n\n/*\n** $Id: print.c,v 1.76 2015/01/05 16:12:50 lhf Exp $\n** print bytecodes\n** See Copyright Notice in lua.h\n*/\n\n#include <ctype.h>\n#include <stdio.h>\n\n#define luac_c\n#define LUA_CORE\n\n#include \"ldebug.h\"\n#include \"lobject.h\"\n#include \"lopcodes.h\"\n\n#define VOID(p)\t\t((const void*)(p))\n\nstatic void PrintString(const TString* ts)\n{\n const char* s=getstr(ts);\n size_t i,n=ts->len;\n printf(\"%c\",'\"');\n for (i=0; i<n; i++)\n {\n  int c=(int)(unsigned char)s[i];\n  switch (c)\n  {\n   case '\"':  printf(\"\\\\\\\"\"); break;\n   case '\\\\': printf(\"\\\\\\\\\"); break;\n   case '\\a': printf(\"\\\\a\"); break;\n   case '\\b': printf(\"\\\\b\"); break;\n   case '\\f': printf(\"\\\\f\"); break;\n   case '\\n': printf(\"\\\\n\"); break;\n   case '\\r': printf(\"\\\\r\"); break;\n   case '\\t': printf(\"\\\\t\"); break;\n   case '\\v': printf(\"\\\\v\"); break;\n   default:\tif (isprint(c))\n   \t\t\tprintf(\"%c\",c);\n\t\telse\n\t\t\tprintf(\"\\\\%03d\",c);\n  }\n }\n printf(\"%c\",'\"');\n}\n\nstatic void PrintConstant(const Proto* f, int i)\n{\n const TValue* o=&f->k[i];\n switch (ttype(o))\n {\n  case LUA_TNIL:\n\tprintf(\"nil\");\n\tbreak;\n  case LUA_TBOOLEAN:\n\tprintf(bvalue(o) ? \"true\" : \"false\");\n\tbreak;\n  case LUA_TNUMFLT:\n\t{\n\tchar buff[100];\n\tsprintf(buff,LUA_NUMBER_FMT,fltvalue(o));\n\tprintf(\"%s\",buff);\n\tif (buff[strspn(buff,\"-0123456789\")]=='\\0') printf(\".0\");\n\tbreak;\n\t}\n  case LUA_TNUMINT:\n\tprintf(LUA_INTEGER_FMT,ivalue(o));\n\tbreak;\n  case LUA_TSHRSTR: case LUA_TLNGSTR:\n\tPrintString(tsvalue(o));\n\tbreak;\n  default:\t\t\t\t/* cannot happen */\n\tprintf(\"? type=%d\",ttype(o));\n\tbreak;\n }\n}\n\n#define UPVALNAME(x) ((f->upvalues[x].name) ? getstr(f->upvalues[x].name) : \"-\")\n#define MYK(x)\t\t(-1-(x))\n\nstatic void PrintCode(const Proto* f)\n{\n const Instruction* code=f->code;\n int pc,n=f->sizecode;\n for (pc=0; pc<n; pc++)\n {\n  Instruction i=code[pc];\n  OpCode o=GET_OPCODE(i);\n  int a=GETARG_A(i);\n  int b=GETARG_B(i);\n  int c=GETARG_C(i);\n  int ax=GETARG_Ax(i);\n  int bx=GETARG_Bx(i);\n  int sbx=GETARG_sBx(i);\n  int line=getfuncline(f,pc);\n  printf(\"\\t%d\\t\",pc+1);\n  if (line>0) printf(\"[%d]\\t\",line); else printf(\"[-]\\t\");\n  printf(\"%-9s\\t\",luaP_opnames[o]);\n  switch (getOpMode(o))\n  {\n   case iABC:\n    printf(\"%d\",a);\n    if (getBMode(o)!=OpArgN) printf(\" %d\",ISK(b) ? (MYK(INDEXK(b))) : b);\n    if (getCMode(o)!=OpArgN) printf(\" %d\",ISK(c) ? (MYK(INDEXK(c))) : c);\n    break;\n   case iABx:\n    printf(\"%d\",a);\n    if (getBMode(o)==OpArgK) printf(\" %d\",MYK(bx));\n    if (getBMode(o)==OpArgU) printf(\" %d\",bx);\n    break;\n   case iAsBx:\n    printf(\"%d %d\",a,sbx);\n    break;\n   case iAx:\n    printf(\"%d\",MYK(ax));\n    break;\n  }\n  switch (o)\n  {\n   case OP_LOADK:\n    printf(\"\\t; \"); PrintConstant(f,bx);\n    break;\n   case OP_GETUPVAL:\n   case OP_SETUPVAL:\n    printf(\"\\t; %s\",UPVALNAME(b));\n    break;\n   case OP_GETTABUP:\n    printf(\"\\t; %s\",UPVALNAME(b));\n    if (ISK(c)) { printf(\" \"); PrintConstant(f,INDEXK(c)); }\n    break;\n   case OP_SETTABUP:\n    printf(\"\\t; %s\",UPVALNAME(a));\n    if (ISK(b)) { printf(\" \"); PrintConstant(f,INDEXK(b)); }\n    if (ISK(c)) { printf(\" \"); PrintConstant(f,INDEXK(c)); }\n    break;\n   case OP_GETTABLE:\n   case OP_SELF:\n    if (ISK(c)) { printf(\"\\t; \"); PrintConstant(f,INDEXK(c)); }\n    break;\n   case OP_SETTABLE:\n   case OP_ADD:\n   case OP_SUB:\n   case OP_MUL:\n   case OP_POW:\n   case OP_DIV:\n   case OP_IDIV:\n   case OP_BAND:\n   case OP_BOR:\n   case OP_BXOR:\n   case OP_SHL:\n   case OP_SHR:\n   case OP_EQ:\n   case OP_LT:\n   case OP_LE:\n    if (ISK(b) || ISK(c))\n    {\n     printf(\"\\t; \");\n     if (ISK(b)) PrintConstant(f,INDEXK(b)); else printf(\"-\");\n     printf(\" \");\n     if (ISK(c)) PrintConstant(f,INDEXK(c)); else printf(\"-\");\n    }\n    break;\n   case OP_JMP:\n   case OP_FORLOOP:\n   case OP_FORPREP:\n   case OP_TFORLOOP:\n    printf(\"\\t; to %d\",sbx+pc+2);\n    break;\n   case OP_CLOSURE:\n    printf(\"\\t; %p\",VOID(f->p[bx]));\n    break;\n   case OP_SETLIST:\n    if (c==0) printf(\"\\t; %d\",(int)code[++pc]); else printf(\"\\t; %d\",c);\n    break;\n   case OP_EXTRAARG:\n    printf(\"\\t; \"); PrintConstant(f,ax);\n    break;\n   default:\n    break;\n  }\n  printf(\"\\n\");\n }\n}\n\n#define SS(x)\t((x==1)?\"\":\"s\")\n#define S(x)\t(int)(x),SS(x)\n\nstatic void PrintHeader(const Proto* f)\n{\n const char* s=f->source ? getstr(f->source) : \"=?\";\n if (*s=='@' || *s=='=')\n  s++;\n else if (*s==LUA_SIGNATURE[0])\n  s=\"(bstring)\";\n else\n  s=\"(string)\";\n printf(\"\\n%s <%s:%d,%d> (%d instruction%s at %p)\\n\",\n \t(f->linedefined==0)?\"main\":\"function\",s,\n\tf->linedefined,f->lastlinedefined,\n\tS(f->sizecode),VOID(f));\n printf(\"%d%s param%s, %d slot%s, %d upvalue%s, \",\n\t(int)(f->numparams),f->is_vararg?\"+\":\"\",SS(f->numparams),\n\tS(f->maxstacksize),S(f->sizeupvalues));\n printf(\"%d local%s, %d constant%s, %d function%s\\n\",\n\tS(f->sizelocvars),S(f->sizek),S(f->sizep));\n}\n\nstatic void PrintDebug(const Proto* f)\n{\n int i,n;\n n=f->sizek;\n printf(\"constants (%d) for %p:\\n\",n,VOID(f));\n for (i=0; i<n; i++)\n {\n  printf(\"\\t%d\\t\",i+1);\n  PrintConstant(f,i);\n  printf(\"\\n\");\n }\n n=f->sizelocvars;\n printf(\"locals (%d) for %p:\\n\",n,VOID(f));\n for (i=0; i<n; i++)\n {\n  printf(\"\\t%d\\t%s\\t%d\\t%d\\n\",\n  i,getstr(f->locvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1);\n }\n n=f->sizeupvalues;\n printf(\"upvalues (%d) for %p:\\n\",n,VOID(f));\n for (i=0; i<n; i++)\n {\n  printf(\"\\t%d\\t%s\\t%d\\t%d\\n\",\n  i,UPVALNAME(i),f->upvalues[i].instack,f->upvalues[i].idx);\n }\n}\n\nstatic void PrintFunction(const Proto* f, int full)\n{\n int i,n=f->sizep;\n PrintHeader(f);\n PrintCode(f);\n if (full) PrintDebug(f);\n for (i=0; i<n; i++) PrintFunction(f->p[i],full);\n}\n"
  },
  {
    "path": "externals/lua/src/luaconf.h",
    "content": "/*\n** $Id: luaconf.h,v 1.238 2014/12/29 13:27:55 roberto Exp $\n** Configuration file for Lua\n** See Copyright Notice in lua.h\n*/\n\n\n#ifndef luaconf_h\n#define luaconf_h\n\n#include <limits.h>\n#include <stddef.h>\n\n\n/*\n** ===================================================================\n** Search for \"@@\" to find all configurable definitions.\n** ===================================================================\n*/\n\n\n/*\n** {====================================================================\n** System Configuration: macros to adapt (if needed) Lua to some\n** particular platform, for instance compiling it with 32-bit numbers or\n** restricting it to C89.\n** =====================================================================\n*/\n\n/*\n@@ LUA_32BITS enables Lua with 32-bit integers and 32-bit floats. You\n** can also define LUA_32BITS in the make file, but changing here you\n** ensure that all software connected to Lua will be compiled with the\n** same configuration.\n*/\n/* #define LUA_32BITS */\n\n\n/*\n@@ LUA_USE_C89 controls the use of non-ISO-C89 features.\n** Define it if you want Lua to avoid the use of a few C99 features\n** or Windows-specific features on Windows.\n*/\n/* #define LUA_USE_C89 */\n\n\n/*\n** By default, Lua on Windows use (some) specific Windows features\n*/\n#if !defined(LUA_USE_C89) && defined(_WIN32) && !defined(_WIN32_WCE)\n#define LUA_USE_WINDOWS  /* enable goodies for regular Windows */\n#endif\n\n\n#if defined(LUA_USE_WINDOWS)\n#define LUA_DL_DLL\t/* enable support for DLL */\n#define LUA_USE_C89\t/* broadly, Windows is C89 */\n#endif\n\n\n#if defined(LUA_USE_LINUX)\n#define LUA_USE_POSIX\n#define LUA_USE_DLOPEN\t\t/* needs an extra library: -ldl */\n#define LUA_USE_READLINE\t/* needs some extra libraries */\n#endif\n\n\n#if defined(LUA_USE_MACOSX)\n#define LUA_USE_POSIX\n#define LUA_USE_DLOPEN\t\t/* MacOS does not need -ldl */\n#define LUA_USE_READLINE\t/* needs an extra library: -lreadline */\n#endif\n\n\n/*\n@@ LUA_C89_NUMBERS ensures that Lua uses the largest types available for\n** C89 ('long' and 'double'); Windows always has '__int64', so it does\n** not need to use this case.\n*/\n#if defined(LUA_USE_C89) && !defined(LUA_USE_WINDOWS)\n#define LUA_C89_NUMBERS\n#endif\n\n\n\n/*\n@@ LUAI_BITSINT defines the (minimum) number of bits in an 'int'.\n*/\n/* avoid undefined shifts */\n#if ((INT_MAX >> 15) >> 15) >= 1\n#define LUAI_BITSINT\t32\n#else\n/* 'int' always must have at least 16 bits */\n#define LUAI_BITSINT\t16\n#endif\n\n\n/*\n@@ LUA_INT_INT / LUA_INT_LONG / LUA_INT_LONGLONG defines the type for\n** Lua integers.\n@@ LUA_REAL_FLOAT / LUA_REAL_DOUBLE / LUA_REAL_LONGDOUBLE defines\n** the type for Lua floats.\n** Lua should work fine with any mix of these options (if supported\n** by your C compiler). The usual configurations are 64-bit integers\n** and 'double' (the default), 32-bit integers and 'float' (for\n** restricted platforms), and 'long'/'double' (for C compilers not\n** compliant with C99, which may not have support for 'long long').\n*/\n\n#if defined(LUA_32BITS)\t\t/* { */\n/*\n** 32-bit integers and 'float'\n*/\n#if LUAI_BITSINT >= 32  /* use 'int' if big enough */\n#define LUA_INT_INT\n#else  /* otherwise use 'long' */\n#define LUA_INT_LONG\n#endif\n#define LUA_REAL_FLOAT\n\n#elif defined(LUA_C89_NUMBERS)\t/* }{ */\n/*\n** largest types available for C89 ('long' and 'double')\n*/\n#define LUA_INT_LONG\n#define LUA_REAL_DOUBLE\n\n#else\t\t\t\t/* }{ */\n/*\n** default configuration for 64-bit Lua ('long long' and 'double')\n*/\n#define LUA_INT_LONGLONG\n#define LUA_REAL_DOUBLE\n\n#endif\t\t\t\t\t\t\t\t/* } */\n\n/* }================================================================== */\n\n\n\n\n/*\n** {==================================================================\n** Configuration for Paths.\n** ===================================================================\n*/\n\n/*\n@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for\n** Lua libraries.\n@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for\n** C libraries.\n** CHANGE them if your machine has a non-conventional directory\n** hierarchy or if you want to install your libraries in\n** non-conventional directories.\n*/\n#define LUA_VDIR\tLUA_VERSION_MAJOR \".\" LUA_VERSION_MINOR\n#if defined(_WIN32) \t/* { */\n/*\n** In Windows, any exclamation mark ('!') in the path is replaced by the\n** path of the directory of the executable file of the current process.\n*/\n#define LUA_LDIR\t\"!\\\\lua\\\\\"\n#define LUA_CDIR\t\"!\\\\\"\n#define LUA_SHRDIR\t\"!\\\\..\\\\share\\\\lua\\\\\" LUA_VDIR \"\\\\\"\n#define LUA_PATH_DEFAULT  \\\n\t\tLUA_LDIR\"?.lua;\"  LUA_LDIR\"?\\\\init.lua;\" \\\n\t\tLUA_CDIR\"?.lua;\"  LUA_CDIR\"?\\\\init.lua;\" \\\n\t\tLUA_SHRDIR\"?.lua;\" LUA_SHRDIR\"?\\\\init.lua;\" \\\n\t\t\".\\\\?.lua;\" \".\\\\?\\\\init.lua\"\n#define LUA_CPATH_DEFAULT \\\n\t\tLUA_CDIR\"?.dll;\" \\\n\t\tLUA_CDIR\"..\\\\lib\\\\lua\\\\\" LUA_VDIR \"\\\\?.dll;\" \\\n\t\tLUA_CDIR\"loadall.dll;\" \".\\\\?.dll\"\n\n#else\t\t\t/* }{ */\n\n#define LUA_ROOT\t\"/usr/local/\"\n#define LUA_LDIR\tLUA_ROOT \"share/lua/\" LUA_VDIR \"/\"\n#define LUA_CDIR\tLUA_ROOT \"lib/lua/\" LUA_VDIR \"/\"\n#define LUA_PATH_DEFAULT  \\\n\t\tLUA_LDIR\"?.lua;\"  LUA_LDIR\"?/init.lua;\" \\\n\t\tLUA_CDIR\"?.lua;\"  LUA_CDIR\"?/init.lua;\" \\\n\t\t\"./?.lua;\" \"./?/init.lua\"\n#define LUA_CPATH_DEFAULT \\\n\t\tLUA_CDIR\"?.so;\" LUA_CDIR\"loadall.so;\" \"./?.so\"\n#endif\t\t\t/* } */\n\n\n/*\n@@ LUA_DIRSEP is the directory separator (for submodules).\n** CHANGE it if your machine does not use \"/\" as the directory separator\n** and is not Windows. (On Windows Lua automatically uses \"\\\".)\n*/\n#if defined(_WIN32)\n#define LUA_DIRSEP\t\"\\\\\"\n#else\n#define LUA_DIRSEP\t\"/\"\n#endif\n\n/* }================================================================== */\n\n\n/*\n** {==================================================================\n** Marks for exported symbols in the C code\n** ===================================================================\n*/\n\n/*\n@@ LUA_API is a mark for all core API functions.\n@@ LUALIB_API is a mark for all auxiliary library functions.\n@@ LUAMOD_API is a mark for all standard library opening functions.\n** CHANGE them if you need to define those functions in some special way.\n** For instance, if you want to create one Windows DLL with the core and\n** the libraries, you may want to use the following definition (define\n** LUA_BUILD_AS_DLL to get it).\n*/\n#if defined(LUA_BUILD_AS_DLL)\t/* { */\n\n#if defined(LUA_CORE) || defined(LUA_LIB)\t/* { */\n#define LUA_API __declspec(dllexport)\n#else\t\t\t\t\t\t/* }{ */\n#define LUA_API __declspec(dllimport)\n#endif\t\t\t\t\t\t/* } */\n\n#else\t\t\t\t/* }{ */\n\n#define LUA_API\t\textern\n\n#endif\t\t\t\t/* } */\n\n\n/* more often than not the libs go together with the core */\n#define LUALIB_API\tLUA_API\n#define LUAMOD_API\tLUALIB_API\n\n\n/*\n@@ LUAI_FUNC is a mark for all extern functions that are not to be\n** exported to outside modules.\n@@ LUAI_DDEF and LUAI_DDEC are marks for all extern (const) variables\n** that are not to be exported to outside modules (LUAI_DDEF for\n** definitions and LUAI_DDEC for declarations).\n** CHANGE them if you need to mark them in some special way. Elf/gcc\n** (versions 3.2 and later) mark them as \"hidden\" to optimize access\n** when Lua is compiled as a shared library. Not all elf targets support\n** this attribute. Unfortunately, gcc does not offer a way to check\n** whether the target offers that support, and those without support\n** give a warning about it. To avoid these warnings, change to the\n** default definition.\n*/\n#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \\\n    defined(__ELF__)\t\t/* { */\n#define LUAI_FUNC\t__attribute__((visibility(\"hidden\"))) extern\n#else\t\t\t\t/* }{ */\n#define LUAI_FUNC\textern\n#endif\t\t\t\t/* } */\n\n#define LUAI_DDEC\tLUAI_FUNC\n#define LUAI_DDEF\t/* empty */\n\n/* }================================================================== */\n\n\n/*\n** {==================================================================\n** Compatibility with previous versions\n** ===================================================================\n*/\n\n/*\n@@ LUA_COMPAT_5_2 controls other macros for compatibility with Lua 5.2.\n@@ LUA_COMPAT_5_1 controls other macros for compatibility with Lua 5.1.\n** You can define it to get all options, or change specific options\n** to fit your specific needs.\n*/\n#if defined(LUA_COMPAT_5_2)\t/* { */\n\n/*\n@@ LUA_COMPAT_MATHLIB controls the presence of several deprecated\n** functions in the mathematical library.\n*/\n#define LUA_COMPAT_MATHLIB\n\n/*\n@@ LUA_COMPAT_BITLIB controls the presence of library 'bit32'.\n*/\n#define LUA_COMPAT_BITLIB\n\n/*\n@@ LUA_COMPAT_IPAIRS controls the effectiveness of the __ipairs metamethod.\n*/\n#define LUA_COMPAT_IPAIRS\n\n/*\n@@ LUA_COMPAT_APIINTCASTS controls the presence of macros for\n** manipulating other integer types (lua_pushunsigned, lua_tounsigned,\n** luaL_checkint, luaL_checklong, etc.)\n*/\n#define LUA_COMPAT_APIINTCASTS\n\n\n/*\n@@ LUA_COMPAT_FLOATSTRING makes Lua format integral floats without a\n@@ a float mark ('.0').\n** This macro is not on by default even in compatibility mode,\n** because this is not really an incompatibility.\n*/\n/* #define LUA_COMPAT_FLOATSTRING */\n\n#endif\t\t\t\t/* } */\n\n\n#if defined(LUA_COMPAT_5_1)\t/* { */\n\n/*\n@@ LUA_COMPAT_UNPACK controls the presence of global 'unpack'.\n** You can replace it with 'table.unpack'.\n*/\n#define LUA_COMPAT_UNPACK\n\n/*\n@@ LUA_COMPAT_LOADERS controls the presence of table 'package.loaders'.\n** You can replace it with 'package.searchers'.\n*/\n#define LUA_COMPAT_LOADERS\n\n/*\n@@ macro 'lua_cpcall' emulates deprecated function lua_cpcall.\n** You can call your C function directly (with light C functions).\n*/\n#define lua_cpcall(L,f,u)  \\\n\t(lua_pushcfunction(L, (f)), \\\n\t lua_pushlightuserdata(L,(u)), \\\n\t lua_pcall(L,1,0,0))\n\n\n/*\n@@ LUA_COMPAT_LOG10 defines the function 'log10' in the math library.\n** You can rewrite 'log10(x)' as 'log(x, 10)'.\n*/\n#define LUA_COMPAT_LOG10\n\n/*\n@@ LUA_COMPAT_LOADSTRING defines the function 'loadstring' in the base\n** library. You can rewrite 'loadstring(s)' as 'load(s)'.\n*/\n#define LUA_COMPAT_LOADSTRING\n\n/*\n@@ LUA_COMPAT_MAXN defines the function 'maxn' in the table library.\n*/\n#define LUA_COMPAT_MAXN\n\n/*\n@@ The following macros supply trivial compatibility for some\n** changes in the API. The macros themselves document how to\n** change your code to avoid using them.\n*/\n#define lua_strlen(L,i)\t\tlua_rawlen(L, (i))\n\n#define lua_objlen(L,i)\t\tlua_rawlen(L, (i))\n\n#define lua_equal(L,idx1,idx2)\t\tlua_compare(L,(idx1),(idx2),LUA_OPEQ)\n#define lua_lessthan(L,idx1,idx2)\tlua_compare(L,(idx1),(idx2),LUA_OPLT)\n\n/*\n@@ LUA_COMPAT_MODULE controls compatibility with previous\n** module functions 'module' (Lua) and 'luaL_register' (C).\n*/\n#define LUA_COMPAT_MODULE\n\n#endif\t\t\t\t/* } */\n\n/* }================================================================== */\n\n\n\n/*\n** {==================================================================\n** Configuration for Numbers.\n** Change these definitions if no predefined LUA_REAL_* / LUA_INT_*\n** satisfy your needs.\n** ===================================================================\n*/\n\n/*\n@@ LUA_NUMBER is the floating-point type used by Lua.\n**\n@@ LUAI_UACNUMBER is the result of an 'usual argument conversion'\n@@ over a floating number.\n**\n@@ LUA_NUMBER_FRMLEN is the length modifier for writing floats.\n@@ LUA_NUMBER_FMT is the format for writing floats.\n@@ lua_number2str converts a float to a string.\n**\n@@ l_mathop allows the addition of an 'l' or 'f' to all math operations.\n**\n@@ lua_str2number converts a decimal numeric string to a number.\n*/\n\n#if defined(LUA_REAL_FLOAT)\t\t/* { single float */\n\n#define LUA_NUMBER\tfloat\n\n#define LUAI_UACNUMBER\tdouble\n\n#define LUA_NUMBER_FRMLEN\t\"\"\n#define LUA_NUMBER_FMT\t\t\"%.7g\"\n\n#define l_mathop(op)\t\top##f\n\n#define lua_str2number(s,p)\tstrtof((s), (p))\n\n\n#elif defined(LUA_REAL_LONGDOUBLE)\t/* }{ long double */\n\n#define LUA_NUMBER\tlong double\n\n#define LUAI_UACNUMBER\tlong double\n\n#define LUA_NUMBER_FRMLEN\t\"L\"\n#define LUA_NUMBER_FMT\t\t\"%.19Lg\"\n\n#define l_mathop(op)\t\top##l\n\n#define lua_str2number(s,p)\tstrtold((s), (p))\n\n#elif defined(LUA_REAL_DOUBLE)\t\t/* }{ double */\n\n#define LUA_NUMBER\tdouble\n\n#define LUAI_UACNUMBER\tdouble\n\n#define LUA_NUMBER_FRMLEN\t\"\"\n#define LUA_NUMBER_FMT\t\t\"%.14g\"\n\n#define l_mathop(op)\t\top\n\n#define lua_str2number(s,p)\tstrtod((s), (p))\n\n#else\t\t\t\t\t/* }{ */\n\n#error \"numeric real type not defined\"\n\n#endif\t\t\t\t\t/* } */\n\n\n#define l_floor(x)\t\t(l_mathop(floor)(x))\n\n#define lua_number2str(s,n)\tsprintf((s), LUA_NUMBER_FMT, (n))\n\n\n/*\n@@ lua_numbertointeger converts a float number to an integer, or\n** returns 0 if float is not within the range of a lua_Integer.\n** (The range comparisons are tricky because of rounding. The tests\n** here assume a two-complement representation, where MININTEGER always\n** has an exact representation as a float; MAXINTEGER may not have one,\n** and therefore its conversion to float may have an ill-defined value.)\n*/\n#define lua_numbertointeger(n,p) \\\n  ((n) >= (LUA_NUMBER)(LUA_MININTEGER) && \\\n   (n) < -(LUA_NUMBER)(LUA_MININTEGER) && \\\n      (*(p) = (LUA_INTEGER)(n), 1))\n\n\n/*\n@@ The luai_num* macros define the primitive operations over numbers.\n** They should work for any size of floating numbers.\n*/\n\n/* the following operations need the math library */\n#if defined(lobject_c) || defined(lvm_c)\n#include <math.h>\n\n/* floor division (defined as 'floor(a/b)') */\n#define luai_numidiv(L,a,b)\t((void)L, l_mathop(floor)(luai_numdiv(L,a,b)))\n\n/*\n** module: defined as 'a - floor(a/b)*b'; the previous definition gives\n** NaN when 'b' is huge, but the result should be 'a'. 'fmod' gives the\n** result of 'a - trunc(a/b)*b', and therefore must be corrected when\n** 'trunc(a/b) ~= floor(a/b)'. That happens when the division has a\n** non-integer negative result, which is equivalent to the test below\n*/\n#define luai_nummod(L,a,b,m)  \\\n  { (m) = l_mathop(fmod)(a,b); if ((m)*(b) < 0) (m) += (b); }\n\n/* exponentiation */\n#define luai_numpow(L,a,b)\t((void)L, l_mathop(pow)(a,b))\n\n#endif\n\n/* these are quite standard operations */\n#if defined(LUA_CORE)\n#define luai_numadd(L,a,b)\t((a)+(b))\n#define luai_numsub(L,a,b)\t((a)-(b))\n#define luai_nummul(L,a,b)\t((a)*(b))\n#define luai_numdiv(L,a,b)\t((a)/(b))\n#define luai_numunm(L,a)\t(-(a))\n#define luai_numeq(a,b)\t\t((a)==(b))\n#define luai_numlt(a,b)\t\t((a)<(b))\n#define luai_numle(a,b)\t\t((a)<=(b))\n#define luai_numisnan(a)\t(!luai_numeq((a), (a)))\n#endif\n\n\n/*\n@@ LUA_INTEGER is the integer type used by Lua.\n**\n@@ LUA_UNSIGNED is the unsigned version of LUA_INTEGER.\n**\n@@ LUAI_UACINT is the result of an 'usual argument conversion'\n@@ over a lUA_INTEGER.\n@@ LUA_INTEGER_FRMLEN is the length modifier for reading/writing integers.\n@@ LUA_INTEGER_FMT is the format for writing integers.\n@@ LUA_MAXINTEGER is the maximum value for a LUA_INTEGER.\n@@ LUA_MININTEGER is the minimum value for a LUA_INTEGER.\n@@ lua_integer2str converts an integer to a string.\n*/\n\n\n/* The following definitions are good for most cases here */\n\n#define LUA_INTEGER_FMT\t\t\"%\" LUA_INTEGER_FRMLEN \"d\"\n#define lua_integer2str(s,n)\tsprintf((s), LUA_INTEGER_FMT, (n))\n\n#define LUAI_UACINT\t\tLUA_INTEGER\n\n/*\n** use LUAI_UACINT here to avoid problems with promotions (which\n** can turn a comparison between unsigneds into a signed comparison)\n*/\n#define LUA_UNSIGNED\t\tunsigned LUAI_UACINT\n\n\n/* now the variable definitions */\n\n#if defined(LUA_INT_INT)\t\t/* { int */\n\n#define LUA_INTEGER\t\tint\n#define LUA_INTEGER_FRMLEN\t\"\"\n\n#define LUA_MAXINTEGER\t\tINT_MAX\n#define LUA_MININTEGER\t\tINT_MIN\n\n#elif defined(LUA_INT_LONG)\t/* }{ long */\n\n#define LUA_INTEGER\t\tlong\n#define LUA_INTEGER_FRMLEN\t\"l\"\n\n#define LUA_MAXINTEGER\t\tLONG_MAX\n#define LUA_MININTEGER\t\tLONG_MIN\n\n#elif defined(LUA_INT_LONGLONG)\t/* }{ long long */\n\n#if defined(LLONG_MAX)\t\t/* { */\n/* use ISO C99 stuff */\n\n#define LUA_INTEGER\t\tlong long\n#define LUA_INTEGER_FRMLEN\t\"ll\"\n\n#define LUA_MAXINTEGER\t\tLLONG_MAX\n#define LUA_MININTEGER\t\tLLONG_MIN\n\n#elif defined(LUA_USE_WINDOWS) /* }{ */\n/* in Windows, can use specific Windows types */\n\n#define LUA_INTEGER\t\t__int64\n#define LUA_INTEGER_FRMLEN\t\"I64\"\n\n#define LUA_MAXINTEGER\t\t_I64_MAX\n#define LUA_MININTEGER\t\t_I64_MIN\n\n#else\t\t\t\t/* }{ */\n\n#error \"Compiler does not support 'long long'. Use option '-DLUA_32BITS' \\\n  or '-DLUA_C89_NUMBERS' (see file 'luaconf.h' for details)\"\n\n#endif\t\t\t\t/* } */\n\n#else\t\t\t\t/* }{ */\n\n#error \"numeric integer type not defined\"\n\n#endif\t\t\t\t/* } */\n\n/* }================================================================== */\n\n\n/*\n** {==================================================================\n** Dependencies with C99\n** ===================================================================\n*/\n\n/*\n@@ lua_strx2number converts an hexadecimal numeric string to a number.\n** In C99, 'strtod' does both conversions. Otherwise, you can\n** leave 'lua_strx2number' undefined and Lua will provide its own\n** implementation.\n*/\n#if !defined(LUA_USE_C89)\n#define lua_strx2number(s,p)\tlua_str2number(s,p)\n#endif\n\n\n/*\n@@ LUA_USE_AFORMAT allows '%a'/'%A' specifiers in 'string.format'\n** Enable it if the C function 'printf' supports these specifiers.\n** (C99 demands it and Windows also supports it.)\n*/\n#if !defined(LUA_USE_C89) || defined(LUA_USE_WINDOWS)\n#define LUA_USE_AFORMAT\n#endif\n\n\n/*\n** 'strtof' and 'opf' variants for math functions are not valid in\n** C89. Otherwise, the macro 'HUGE_VALF' is a good proxy for testing the\n** availability of these variants. ('math.h' is already included in\n** all files that use these macros.)\n*/\n#if defined(LUA_USE_C89) || (defined(HUGE_VAL) && !defined(HUGE_VALF))\n#undef l_mathop  /* variants not available */\n#undef lua_str2number\n#define l_mathop(op)\t\t(lua_Number)op  /* no variant */\n#define lua_str2number(s,p)\t((lua_Number)strtod((s), (p)))\n#endif\n\n\n/*\n@@ LUA_KCONTEXT is the type of the context ('ctx') for continuation\n** functions.  It must be a numerical type; Lua will use 'intptr_t' if\n** available, otherwise it will use 'ptrdiff_t' (the nearest thing to\n** 'intptr_t' in C89)\n*/\n#define LUA_KCONTEXT\tptrdiff_t\n\n#if !defined(LUA_USE_C89) && defined(__STDC_VERSION__) && \\\n    __STDC_VERSION__ >= 199901L\n#include <stdint.h>\n#if defined (INTPTR_MAX)  /* even in C99 this type is optional */\n#undef LUA_KCONTEXT\n#define LUA_KCONTEXT\tintptr_t\n#endif\n#endif\n\n/* }================================================================== */\n\n\n/*\n** {==================================================================\n** Macros that affect the API and must be stable (that is, must be the\n** same when you compile Lua and when you compile code that links to\n** Lua). You probably do not want/need to change them.\n** =====================================================================\n*/\n\n/*\n@@ LUAI_MAXSTACK limits the size of the Lua stack.\n** CHANGE it if you need a different limit. This limit is arbitrary;\n** its only purpose is to stop Lua from consuming unlimited stack\n** space (and to reserve some numbers for pseudo-indices).\n*/\n#if LUAI_BITSINT >= 32\n#define LUAI_MAXSTACK\t\t1000000\n#else\n#define LUAI_MAXSTACK\t\t15000\n#endif\n\n/* reserve some space for error handling */\n#define LUAI_FIRSTPSEUDOIDX\t(-LUAI_MAXSTACK - 1000)\n\n\n/*\n@@ LUA_EXTRASPACE defines the size of a raw memory area associated with\n** a Lua state with very fast access.\n** CHANGE it if you need a different size.\n*/\n#define LUA_EXTRASPACE\t\t(sizeof(void *))\n\n\n/*\n@@ LUA_IDSIZE gives the maximum size for the description of the source\n@@ of a function in debug information.\n** CHANGE it if you want a different size.\n*/\n#define LUA_IDSIZE\t60\n\n\n/*\n@@ LUAI_MAXSHORTLEN is the maximum length for short strings, that is,\n** strings that are internalized. (Cannot be smaller than reserved words\n** or tags for metamethods, as these strings must be internalized;\n** #(\"function\") = 8, #(\"__newindex\") = 10.)\n*/\n#define LUAI_MAXSHORTLEN        40\n\n\n/*\n@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system.\n** CHANGE it if it uses too much C-stack space.\n*/\n#define LUAL_BUFFERSIZE\t((int)(0x80 * sizeof(void*) * sizeof(lua_Integer)))\n\n/* }================================================================== */\n\n\n/*\n@@ LUA_QL describes how error messages quote program elements.\n** Lua does not use these macros anymore; they are here for\n** compatibility only.\n*/\n#define LUA_QL(x)\t\"'\" x \"'\"\n#define LUA_QS\t\tLUA_QL(\"%s\")\n\n\n\n\n/* =================================================================== */\n\n/*\n** Local configuration. You can use this space to add your redefinitions\n** without modifying the main part of the file.\n*/\n\n\n\n\n\n#endif\n\n"
  },
  {
    "path": "externals/lua/src/lualib.h",
    "content": "/*\n** $Id: lualib.h,v 1.44 2014/02/06 17:32:33 roberto Exp $\n** Lua standard libraries\n** See Copyright Notice in lua.h\n*/\n\n\n#ifndef lualib_h\n#define lualib_h\n\n#include \"lua.h\"\n\n\n\nLUAMOD_API int (luaopen_base) (lua_State *L);\n\n#define LUA_COLIBNAME\t\"coroutine\"\nLUAMOD_API int (luaopen_coroutine) (lua_State *L);\n\n#define LUA_TABLIBNAME\t\"table\"\nLUAMOD_API int (luaopen_table) (lua_State *L);\n\n#define LUA_IOLIBNAME\t\"io\"\nLUAMOD_API int (luaopen_io) (lua_State *L);\n\n#define LUA_OSLIBNAME\t\"os\"\nLUAMOD_API int (luaopen_os) (lua_State *L);\n\n#define LUA_STRLIBNAME\t\"string\"\nLUAMOD_API int (luaopen_string) (lua_State *L);\n\n#define LUA_UTF8LIBNAME\t\"utf8\"\nLUAMOD_API int (luaopen_utf8) (lua_State *L);\n\n#define LUA_BITLIBNAME\t\"bit32\"\nLUAMOD_API int (luaopen_bit32) (lua_State *L);\n\n#define LUA_MATHLIBNAME\t\"math\"\nLUAMOD_API int (luaopen_math) (lua_State *L);\n\n#define LUA_DBLIBNAME\t\"debug\"\nLUAMOD_API int (luaopen_debug) (lua_State *L);\n\n#define LUA_LOADLIBNAME\t\"package\"\nLUAMOD_API int (luaopen_package) (lua_State *L);\n\n\n/* open all previous libraries */\nLUALIB_API void (luaL_openlibs) (lua_State *L);\n\n\n\n#if !defined(lua_assert)\n#define lua_assert(x)\t((void)0)\n#endif\n\n\n#endif\n"
  },
  {
    "path": "externals/lua/src/lundump.c",
    "content": "/*\n** $Id: lundump.c,v 2.41 2014/11/02 19:19:04 roberto Exp $\n** load precompiled Lua chunks\n** See Copyright Notice in lua.h\n*/\n\n#define lundump_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"ldebug.h\"\n#include \"ldo.h\"\n#include \"lfunc.h\"\n#include \"lmem.h\"\n#include \"lobject.h\"\n#include \"lstring.h\"\n#include \"lundump.h\"\n#include \"lzio.h\"\n\n\n#if !defined(luai_verifycode)\n#define luai_verifycode(L,b,f)  /* empty */\n#endif\n\n\ntypedef struct {\n  lua_State *L;\n  ZIO *Z;\n  Mbuffer *b;\n  const char *name;\n} LoadState;\n\n\nstatic l_noret error(LoadState *S, const char *why) {\n  luaO_pushfstring(S->L, \"%s: %s precompiled chunk\", S->name, why);\n  luaD_throw(S->L, LUA_ERRSYNTAX);\n}\n\n\n/*\n** All high-level loads go through LoadVector; you can change it to\n** adapt to the endianness of the input\n*/\n#define LoadVector(S,b,n)\tLoadBlock(S,b,(n)*sizeof((b)[0]))\n\nstatic void LoadBlock (LoadState *S, void *b, size_t size) {\n  if (luaZ_read(S->Z, b, size) != 0)\n    error(S, \"truncated\");\n}\n\n\n#define LoadVar(S,x)\t\tLoadVector(S,&x,1)\n\n\nstatic lu_byte LoadByte (LoadState *S) {\n  lu_byte x;\n  LoadVar(S, x);\n  return x;\n}\n\n\nstatic int LoadInt (LoadState *S) {\n  int x;\n  LoadVar(S, x);\n  return x;\n}\n\n\nstatic lua_Number LoadNumber (LoadState *S) {\n  lua_Number x;\n  LoadVar(S, x);\n  return x;\n}\n\n\nstatic lua_Integer LoadInteger (LoadState *S) {\n  lua_Integer x;\n  LoadVar(S, x);\n  return x;\n}\n\n\nstatic TString *LoadString (LoadState *S) {\n  size_t size = LoadByte(S);\n  if (size == 0xFF)\n    LoadVar(S, size);\n  if (size == 0)\n    return NULL;\n  else {\n    char *s = luaZ_openspace(S->L, S->b, --size);\n    LoadVector(S, s, size);\n    return luaS_newlstr(S->L, s, size);\n  }\n}\n\n\nstatic void LoadCode (LoadState *S, Proto *f) {\n  int n = LoadInt(S);\n  f->code = luaM_newvector(S->L, n, Instruction);\n  f->sizecode = n;\n  LoadVector(S, f->code, n);\n}\n\n\nstatic void LoadFunction(LoadState *S, Proto *f, TString *psource);\n\n\nstatic void LoadConstants (LoadState *S, Proto *f) {\n  int i;\n  int n = LoadInt(S);\n  f->k = luaM_newvector(S->L, n, TValue);\n  f->sizek = n;\n  for (i = 0; i < n; i++)\n    setnilvalue(&f->k[i]);\n  for (i = 0; i < n; i++) {\n    TValue *o = &f->k[i];\n    int t = LoadByte(S);\n    switch (t) {\n    case LUA_TNIL:\n      setnilvalue(o);\n      break;\n    case LUA_TBOOLEAN:\n      setbvalue(o, LoadByte(S));\n      break;\n    case LUA_TNUMFLT:\n      setfltvalue(o, LoadNumber(S));\n      break;\n    case LUA_TNUMINT:\n      setivalue(o, LoadInteger(S));\n      break;\n    case LUA_TSHRSTR:\n    case LUA_TLNGSTR:\n      setsvalue2n(S->L, o, LoadString(S));\n      break;\n    default:\n      lua_assert(0);\n    }\n  }\n}\n\n\nstatic void LoadProtos (LoadState *S, Proto *f) {\n  int i;\n  int n = LoadInt(S);\n  f->p = luaM_newvector(S->L, n, Proto *);\n  f->sizep = n;\n  for (i = 0; i < n; i++)\n    f->p[i] = NULL;\n  for (i = 0; i < n; i++) {\n    f->p[i] = luaF_newproto(S->L);\n    LoadFunction(S, f->p[i], f->source);\n  }\n}\n\n\nstatic void LoadUpvalues (LoadState *S, Proto *f) {\n  int i, n;\n  n = LoadInt(S);\n  f->upvalues = luaM_newvector(S->L, n, Upvaldesc);\n  f->sizeupvalues = n;\n  for (i = 0; i < n; i++)\n    f->upvalues[i].name = NULL;\n  for (i = 0; i < n; i++) {\n    f->upvalues[i].instack = LoadByte(S);\n    f->upvalues[i].idx = LoadByte(S);\n  }\n}\n\n\nstatic void LoadDebug (LoadState *S, Proto *f) {\n  int i, n;\n  n = LoadInt(S);\n  f->lineinfo = luaM_newvector(S->L, n, int);\n  f->sizelineinfo = n;\n  LoadVector(S, f->lineinfo, n);\n  n = LoadInt(S);\n  f->locvars = luaM_newvector(S->L, n, LocVar);\n  f->sizelocvars = n;\n  for (i = 0; i < n; i++)\n    f->locvars[i].varname = NULL;\n  for (i = 0; i < n; i++) {\n    f->locvars[i].varname = LoadString(S);\n    f->locvars[i].startpc = LoadInt(S);\n    f->locvars[i].endpc = LoadInt(S);\n  }\n  n = LoadInt(S);\n  for (i = 0; i < n; i++)\n    f->upvalues[i].name = LoadString(S);\n}\n\n\nstatic void LoadFunction (LoadState *S, Proto *f, TString *psource) {\n  f->source = LoadString(S);\n  if (f->source == NULL)  /* no source in dump? */\n    f->source = psource;  /* reuse parent's source */\n  f->linedefined = LoadInt(S);\n  f->lastlinedefined = LoadInt(S);\n  f->numparams = LoadByte(S);\n  f->is_vararg = LoadByte(S);\n  f->maxstacksize = LoadByte(S);\n  LoadCode(S, f);\n  LoadConstants(S, f);\n  LoadUpvalues(S, f);\n  LoadProtos(S, f);\n  LoadDebug(S, f);\n}\n\n\nstatic void checkliteral (LoadState *S, const char *s, const char *msg) {\n  char buff[sizeof(LUA_SIGNATURE) + sizeof(LUAC_DATA)]; /* larger than both */\n  size_t len = strlen(s);\n  LoadVector(S, buff, len);\n  if (memcmp(s, buff, len) != 0)\n    error(S, msg);\n}\n\n\nstatic void fchecksize (LoadState *S, size_t size, const char *tname) {\n  if (LoadByte(S) != size)\n    error(S, luaO_pushfstring(S->L, \"%s size mismatch in\", tname));\n}\n\n\n#define checksize(S,t)\tfchecksize(S,sizeof(t),#t)\n\nstatic void checkHeader (LoadState *S) {\n  checkliteral(S, LUA_SIGNATURE + 1, \"not a\");  /* 1st char already checked */\n  if (LoadByte(S) != LUAC_VERSION)\n    error(S, \"version mismatch in\");\n  if (LoadByte(S) != LUAC_FORMAT)\n    error(S, \"format mismatch in\");\n  checkliteral(S, LUAC_DATA, \"corrupted\");\n  checksize(S, int);\n  checksize(S, size_t);\n  checksize(S, Instruction);\n  checksize(S, lua_Integer);\n  checksize(S, lua_Number);\n  if (LoadInteger(S) != LUAC_INT)\n    error(S, \"endianness mismatch in\");\n  if (LoadNumber(S) != LUAC_NUM)\n    error(S, \"float format mismatch in\");\n}\n\n\n/*\n** load precompiled chunk\n*/\nLClosure *luaU_undump(lua_State *L, ZIO *Z, Mbuffer *buff,\n                      const char *name) {\n  LoadState S;\n  LClosure *cl;\n  if (*name == '@' || *name == '=')\n    S.name = name + 1;\n  else if (*name == LUA_SIGNATURE[0])\n    S.name = \"binary string\";\n  else\n    S.name = name;\n  S.L = L;\n  S.Z = Z;\n  S.b = buff;\n  checkHeader(&S);\n  cl = luaF_newLclosure(L, LoadByte(&S));\n  setclLvalue(L, L->top, cl);\n  incr_top(L);\n  cl->p = luaF_newproto(L);\n  LoadFunction(&S, cl->p, NULL);\n  lua_assert(cl->nupvalues == cl->p->sizeupvalues);\n  luai_verifycode(L, buff, cl->p);\n  return cl;\n}\n\n"
  },
  {
    "path": "externals/lua/src/lundump.h",
    "content": "/*\n** $Id: lundump.h,v 1.44 2014/06/19 18:27:20 roberto Exp $\n** load precompiled Lua chunks\n** See Copyright Notice in lua.h\n*/\n\n#ifndef lundump_h\n#define lundump_h\n\n#include \"llimits.h\"\n#include \"lobject.h\"\n#include \"lzio.h\"\n\n\n/* data to catch conversion errors */\n#define LUAC_DATA\t\"\\x19\\x93\\r\\n\\x1a\\n\"\n\n#define LUAC_INT\t0x5678\n#define LUAC_NUM\tcast_num(370.5)\n\n#define MYINT(s)\t(s[0]-'0')\n#define LUAC_VERSION\t(MYINT(LUA_VERSION_MAJOR)*16+MYINT(LUA_VERSION_MINOR))\n#define LUAC_FORMAT\t0\t/* this is the official format */\n\n/* load one chunk; from lundump.c */\nLUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff,\n                                 const char* name);\n\n/* dump one chunk; from ldump.c */\nLUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w,\n                         void* data, int strip);\n\n#endif\n"
  },
  {
    "path": "externals/lua/src/lutf8lib.c",
    "content": "/*\n** $Id: lutf8lib.c,v 1.13 2014/11/02 19:19:04 roberto Exp $\n** Standard library for UTF-8 manipulation\n** See Copyright Notice in lua.h\n*/\n\n#define lutf8lib_c\n#define LUA_LIB\n\n#include \"lprefix.h\"\n\n\n#include <assert.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"lauxlib.h\"\n#include \"lualib.h\"\n\n#define MAXUNICODE\t0x10FFFF\n\n#define iscont(p)\t((*(p) & 0xC0) == 0x80)\n\n\n/* from strlib */\n/* translate a relative string position: negative means back from end */\nstatic lua_Integer u_posrelat (lua_Integer pos, size_t len) {\n  if (pos >= 0) return pos;\n  else if (0u - (size_t)pos > len) return 0;\n  else return (lua_Integer)len + pos + 1;\n}\n\n\n/*\n** Decode one UTF-8 sequence, returning NULL if byte sequence is invalid.\n*/\nstatic const char *utf8_decode (const char *o, int *val) {\n  static unsigned int limits[] = {0xFF, 0x7F, 0x7FF, 0xFFFF};\n  const unsigned char *s = (const unsigned char *)o;\n  unsigned int c = s[0];\n  unsigned int res = 0;  /* final result */\n  if (c < 0x80)  /* ascii? */\n    res = c;\n  else {\n    int count = 0;  /* to count number of continuation bytes */\n    while (c & 0x40) {  /* still have continuation bytes? */\n      int cc = s[++count];  /* read next byte */\n      if ((cc & 0xC0) != 0x80)  /* not a continuation byte? */\n        return NULL;  /* invalid byte sequence */\n      res = (res << 6) | (cc & 0x3F);  /* add lower 6 bits from cont. byte */\n      c <<= 1;  /* to test next bit */\n    }\n    res |= ((c & 0x7F) << (count * 5));  /* add first byte */\n    if (count > 3 || res > MAXUNICODE || res <= limits[count])\n      return NULL;  /* invalid byte sequence */\n    s += count;  /* skip continuation bytes read */\n  }\n  if (val) *val = res;\n  return (const char *)s + 1;  /* +1 to include first byte */\n}\n\n\n/*\n** utf8len(s [, i [, j]]) --> number of characters that start in the\n** range [i,j], or nil + current position if 's' is not well formed in\n** that interval\n*/\nstatic int utflen (lua_State *L) {\n  int n = 0;\n  size_t len;\n  const char *s = luaL_checklstring(L, 1, &len);\n  lua_Integer posi = u_posrelat(luaL_optinteger(L, 2, 1), len);\n  lua_Integer posj = u_posrelat(luaL_optinteger(L, 3, -1), len);\n  luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 2,\n                   \"initial position out of string\");\n  luaL_argcheck(L, --posj < (lua_Integer)len, 3,\n                   \"final position out of string\");\n  while (posi <= posj) {\n    const char *s1 = utf8_decode(s + posi, NULL);\n    if (s1 == NULL) {  /* conversion error? */\n      lua_pushnil(L);  /* return nil ... */\n      lua_pushinteger(L, posi + 1);  /* ... and current position */\n      return 2;\n    }\n    posi = s1 - s;\n    n++;\n  }\n  lua_pushinteger(L, n);\n  return 1;\n}\n\n\n/*\n** codepoint(s, [i, [j]])  -> returns codepoints for all characters\n** that start in the range [i,j]\n*/\nstatic int codepoint (lua_State *L) {\n  size_t len;\n  const char *s = luaL_checklstring(L, 1, &len);\n  lua_Integer posi = u_posrelat(luaL_optinteger(L, 2, 1), len);\n  lua_Integer pose = u_posrelat(luaL_optinteger(L, 3, posi), len);\n  int n;\n  const char *se;\n  luaL_argcheck(L, posi >= 1, 2, \"out of range\");\n  luaL_argcheck(L, pose <= (lua_Integer)len, 3, \"out of range\");\n  if (posi > pose) return 0;  /* empty interval; return no values */\n  n = (int)(pose -  posi + 1);\n  if (posi + n <= pose)  /* (lua_Integer -> int) overflow? */\n    return luaL_error(L, \"string slice too long\");\n  luaL_checkstack(L, n, \"string slice too long\");\n  n = 0;\n  se = s + pose;\n  for (s += posi - 1; s < se;) {\n    int code;\n    s = utf8_decode(s, &code);\n    if (s == NULL)\n      return luaL_error(L, \"invalid UTF-8 code\");\n    lua_pushinteger(L, code);\n    n++;\n  }\n  return n;\n}\n\n\nstatic void pushutfchar (lua_State *L, int arg) {\n  lua_Integer code = luaL_checkinteger(L, arg);\n  luaL_argcheck(L, 0 <= code && code <= MAXUNICODE, arg, \"value out of range\");\n  lua_pushfstring(L, \"%U\", (long)code);\n}\n\n\n/*\n** utfchar(n1, n2, ...)  -> char(n1)..char(n2)...\n*/\nstatic int utfchar (lua_State *L) {\n  int n = lua_gettop(L);  /* number of arguments */\n  if (n == 1)  /* optimize common case of single char */\n    pushutfchar(L, 1);\n  else {\n    int i;\n    luaL_Buffer b;\n    luaL_buffinit(L, &b);\n    for (i = 1; i <= n; i++) {\n      pushutfchar(L, i);\n      luaL_addvalue(&b);\n    }\n    luaL_pushresult(&b);\n  }\n  return 1;\n}\n\n\n/*\n** offset(s, n, [i])  -> index where n-th character counting from\n**   position 'i' starts; 0 means character at 'i'.\n*/\nstatic int byteoffset (lua_State *L) {\n  size_t len;\n  const char *s = luaL_checklstring(L, 1, &len);\n  lua_Integer n  = luaL_checkinteger(L, 2);\n  lua_Integer posi = (n >= 0) ? 1 : len + 1;\n  posi = u_posrelat(luaL_optinteger(L, 3, posi), len);\n  luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 3,\n                   \"position out of range\");\n  if (n == 0) {\n    /* find beginning of current byte sequence */\n    while (posi > 0 && iscont(s + posi)) posi--;\n  }\n  else {\n    if (iscont(s + posi))\n      luaL_error(L, \"initial position is a continuation byte\");\n    if (n < 0) {\n       while (n < 0 && posi > 0) {  /* move back */\n         do {  /* find beginning of previous character */\n           posi--;\n         } while (posi > 0 && iscont(s + posi));\n         n++;\n       }\n     }\n     else {\n       n--;  /* do not move for 1st character */\n       while (n > 0 && posi < (lua_Integer)len) {\n         do {  /* find beginning of next character */\n           posi++;\n         } while (iscont(s + posi));  /* (cannot pass final '\\0') */\n         n--;\n       }\n     }\n  }\n  if (n == 0)  /* did it find given character? */\n    lua_pushinteger(L, posi + 1);\n  else  /* no such character */\n    lua_pushnil(L);\n  return 1;  \n}\n\n\nstatic int iter_aux (lua_State *L) {\n  size_t len;\n  const char *s = luaL_checklstring(L, 1, &len);\n  lua_Integer n = lua_tointeger(L, 2) - 1;\n  if (n < 0)  /* first iteration? */\n    n = 0;  /* start from here */\n  else if (n < (lua_Integer)len) {\n    n++;  /* skip current byte */\n    while (iscont(s + n)) n++;  /* and its continuations */\n  }\n  if (n >= (lua_Integer)len)\n    return 0;  /* no more codepoints */\n  else {\n    int code;\n    const char *next = utf8_decode(s + n, &code);\n    if (next == NULL || iscont(next))\n      return luaL_error(L, \"invalid UTF-8 code\");\n    lua_pushinteger(L, n + 1);\n    lua_pushinteger(L, code);\n    return 2;\n  }\n}\n\n\nstatic int iter_codes (lua_State *L) {\n  luaL_checkstring(L, 1);\n  lua_pushcfunction(L, iter_aux);\n  lua_pushvalue(L, 1);\n  lua_pushinteger(L, 0);\n  return 3;\n}\n\n\n/* pattern to match a single UTF-8 character */\n#define UTF8PATT\t\"[\\0-\\x7F\\xC2-\\xF4][\\x80-\\xBF]*\"\n\n\nstatic struct luaL_Reg funcs[] = {\n  {\"offset\", byteoffset},\n  {\"codepoint\", codepoint},\n  {\"char\", utfchar},\n  {\"len\", utflen},\n  {\"codes\", iter_codes},\n  /* placeholders */\n  {\"charpattern\", NULL},\n  {NULL, NULL}\n};\n\n\nLUAMOD_API int luaopen_utf8 (lua_State *L) {\n  luaL_newlib(L, funcs);\n  lua_pushliteral(L, UTF8PATT);\n  lua_setfield(L, -2, \"charpattern\");\n  return 1;\n}\n\n"
  },
  {
    "path": "externals/lua/src/lvm.c",
    "content": "/*\n** $Id: lvm.c,v 2.232 2014/12/27 20:30:38 roberto Exp $\n** Lua virtual machine\n** See Copyright Notice in lua.h\n*/\n\n#define lvm_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include <limits.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"ldebug.h\"\n#include \"ldo.h\"\n#include \"lfunc.h\"\n#include \"lgc.h\"\n#include \"lobject.h\"\n#include \"lopcodes.h\"\n#include \"lstate.h\"\n#include \"lstring.h\"\n#include \"ltable.h\"\n#include \"ltm.h\"\n#include \"lvm.h\"\n\n\n/*\n** You can define LUA_FLOORN2I if you want to convert floats to integers\n** by flooring them (instead of raising an error if they are not\n** integral values)\n*/\n#if !defined(LUA_FLOORN2I)\n#define LUA_FLOORN2I\t\t0\n#endif\n\n\n/* limit for table tag-method chains (to avoid loops) */\n#define MAXTAGLOOP\t2000\n\n\n/*\n** Similar to 'tonumber', but does not attempt to convert strings and\n** ensure correct precision (no extra bits). Used in comparisons.\n*/\nstatic int tofloat (const TValue *obj, lua_Number *n) {\n  if (ttisfloat(obj)) *n = fltvalue(obj);\n  else if (ttisinteger(obj)) {\n    volatile lua_Number x = cast_num(ivalue(obj));  /* avoid extra precision */\n    *n = x;\n  }\n  else {\n    *n = 0;  /* to avoid warnings */\n    return 0;\n  }\n  return 1;\n}\n\n\n/*\n** Try to convert a value to a float. The float case is already handled\n** by the macro 'tonumber'.\n*/\nint luaV_tonumber_ (const TValue *obj, lua_Number *n) {\n  TValue v;\n  if (ttisinteger(obj)) {\n    *n = cast_num(ivalue(obj));\n    return 1;\n  }\n  else if (cvt2num(obj) &&  /* string convertible to number? */\n            luaO_str2num(svalue(obj), &v) == tsvalue(obj)->len + 1) {\n    *n = nvalue(&v);  /* convert result of 'luaO_str2num' to a float */\n    return 1;\n  }\n  else\n    return 0;  /* conversion failed */\n}\n\n\n/*\n** try to convert a value to an integer, rounding according to 'mode':\n** mode == 0: accepts only integral values\n** mode == 1: takes the floor of the number\n** mode == 2: takes the ceil of the number\n*/\nstatic int tointeger_aux (const TValue *obj, lua_Integer *p, int mode) {\n  TValue v;\n again:\n  if (ttisfloat(obj)) {\n    lua_Number n = fltvalue(obj);\n    lua_Number f = l_floor(n);\n    if (n != f) {  /* not an integral value? */\n      if (mode == 0) return 0;  /* fails if mode demands integral value */\n      else if (mode > 1)  /* needs ceil? */\n        f += 1;  /* convert floor to ceil (remember: n != f) */\n    }\n    return lua_numbertointeger(f, p);\n  }\n  else if (ttisinteger(obj)) {\n    *p = ivalue(obj);\n    return 1;\n  }\n  else if (cvt2num(obj) &&\n            luaO_str2num(svalue(obj), &v) == tsvalue(obj)->len + 1) {\n    obj = &v;\n    goto again;  /* convert result from 'luaO_str2num' to an integer */\n  }\n  return 0;  /* conversion failed */\n}\n\n\n/*\n** try to convert a value to an integer\n*/\nint luaV_tointeger_ (const TValue *obj, lua_Integer *p) {\n  return tointeger_aux(obj, p, LUA_FLOORN2I);\n}\n\n\n/*\n** Try to convert a 'for' limit to an integer, preserving the\n** semantics of the loop.\n** (The following explanation assumes a non-negative step; it is valid\n** for negative steps mutatis mutandis.)\n** If the limit can be converted to an integer, rounding down, that is\n** it.\n** Otherwise, check whether the limit can be converted to a number.  If\n** the number is too large, it is OK to set the limit as LUA_MAXINTEGER,\n** which means no limit.  If the number is too negative, the loop\n** should not run, because any initial integer value is larger than the\n** limit. So, it sets the limit to LUA_MININTEGER. 'stopnow' corrects\n** the extreme case when the initial value is LUA_MININTEGER, in which\n** case the LUA_MININTEGER limit would still run the loop once.\n*/\nstatic int forlimit (const TValue *obj, lua_Integer *p, lua_Integer step,\n                     int *stopnow) {\n  *stopnow = 0;  /* usually, let loops run */\n  if (!tointeger_aux(obj, p, (step < 0 ? 2 : 1))) {  /* not fit in integer? */\n    lua_Number n;  /* try to convert to float */\n    if (!tonumber(obj, &n)) /* cannot convert to float? */\n      return 0;  /* not a number */\n    if (n > 0) {  /* if true, float is larger than max integer */\n      *p = LUA_MAXINTEGER;\n      if (step < 0) *stopnow = 1;\n    }\n    else {  /* float is smaller than min integer */\n      *p = LUA_MININTEGER;\n      if (step >= 0) *stopnow = 1;\n    }\n  }\n  return 1;\n}\n\n\n/*\n** Main function for table access (invoking metamethods if needed).\n** Compute 'val = t[key]'\n*/\nvoid luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) {\n  int loop;  /* counter to avoid infinite loops */\n  for (loop = 0; loop < MAXTAGLOOP; loop++) {\n    const TValue *tm;\n    if (ttistable(t)) {  /* 't' is a table? */\n      Table *h = hvalue(t);\n      const TValue *res = luaH_get(h, key); /* do a primitive get */\n      if (!ttisnil(res) ||  /* result is not nil? */\n          (tm = fasttm(L, h->metatable, TM_INDEX)) == NULL) { /* or no TM? */\n        setobj2s(L, val, res);  /* result is the raw get */\n        return;\n      }\n      /* else will try metamethod */\n    }\n    else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX)))\n      luaG_typeerror(L, t, \"index\");  /* no metamethod */\n    if (ttisfunction(tm)) {  /* metamethod is a function */\n      luaT_callTM(L, tm, t, key, val, 1);\n      return;\n    }\n    t = tm;  /* else repeat access over 'tm' */\n  }\n  luaG_runerror(L, \"gettable chain too long; possible loop\");\n}\n\n\n/*\n** Main function for table assignment (invoking metamethods if needed).\n** Compute 't[key] = val'\n*/\nvoid luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) {\n  int loop;  /* counter to avoid infinite loops */\n  for (loop = 0; loop < MAXTAGLOOP; loop++) {\n    const TValue *tm;\n    if (ttistable(t)) {  /* 't' is a table? */\n      Table *h = hvalue(t);\n      TValue *oldval = cast(TValue *, luaH_get(h, key));\n      /* if previous value is not nil, there must be a previous entry\n         in the table; a metamethod has no relevance */\n      if (!ttisnil(oldval) ||\n         /* previous value is nil; must check the metamethod */\n         ((tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL &&\n         /* no metamethod; is there a previous entry in the table? */\n         (oldval != luaO_nilobject ||\n         /* no previous entry; must create one. (The next test is\n            always true; we only need the assignment.) */\n         (oldval = luaH_newkey(L, h, key), 1)))) {\n        /* no metamethod and (now) there is an entry with given key */\n        setobj2t(L, oldval, val);  /* assign new value to that entry */\n        invalidateTMcache(h);\n        luaC_barrierback(L, h, val);\n        return;\n      }\n      /* else will try the metamethod */\n    }\n    else  /* not a table; check metamethod */\n      if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX)))\n        luaG_typeerror(L, t, \"index\");\n    /* try the metamethod */\n    if (ttisfunction(tm)) {\n      luaT_callTM(L, tm, t, key, val, 0);\n      return;\n    }\n    t = tm;  /* else repeat assignment over 'tm' */\n  }\n  luaG_runerror(L, \"settable chain too long; possible loop\");\n}\n\n\n/*\n** Compare two strings 'ls' x 'rs', returning an integer smaller-equal-\n** -larger than zero if 'ls' is smaller-equal-larger than 'rs'.\n** The code is a little tricky because it allows '\\0' in the strings\n** and it uses 'strcoll' (to respect locales) for each segments\n** of the strings.\n*/\nstatic int l_strcmp (const TString *ls, const TString *rs) {\n  const char *l = getstr(ls);\n  size_t ll = ls->len;\n  const char *r = getstr(rs);\n  size_t lr = rs->len;\n  for (;;) {  /* for each segment */\n    int temp = strcoll(l, r);\n    if (temp != 0)  /* not equal? */\n      return temp;  /* done */\n    else {  /* strings are equal up to a '\\0' */\n      size_t len = strlen(l);  /* index of first '\\0' in both strings */\n      if (len == lr)  /* 'rs' is finished? */\n        return (len == ll) ? 0 : 1;  /* check 'ls' */\n      else if (len == ll)  /* 'ls' is finished? */\n        return -1;  /* 'ls' is smaller than 'rs' ('rs' is not finished) */\n      /* both strings longer than 'len'; go on comparing after the '\\0' */\n      len++;\n      l += len; ll -= len; r += len; lr -= len;\n    }\n  }\n}\n\n\n/*\n** Main operation less than; return 'l < r'.\n*/\nint luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) {\n  int res;\n  lua_Number nl, nr;\n  if (ttisinteger(l) && ttisinteger(r))  /* both operands are integers? */\n    return (ivalue(l) < ivalue(r));\n  else if (tofloat(l, &nl) && tofloat(r, &nr))  /* both are numbers? */\n    return luai_numlt(nl, nr);\n  else if (ttisstring(l) && ttisstring(r))  /* both are strings? */\n    return l_strcmp(tsvalue(l), tsvalue(r)) < 0;\n  else if ((res = luaT_callorderTM(L, l, r, TM_LT)) < 0)  /* no metamethod? */\n    luaG_ordererror(L, l, r);  /* error */\n  return res;\n}\n\n\n/*\n** Main operation less than or equal to; return 'l <= r'.\n*/\nint luaV_lessequal (lua_State *L, const TValue *l, const TValue *r) {\n  int res;\n  lua_Number nl, nr;\n  if (ttisinteger(l) && ttisinteger(r))  /* both operands are integers? */\n    return (ivalue(l) <= ivalue(r));\n  else if (tofloat(l, &nl) && tofloat(r, &nr))  /* both are numbers? */\n    return luai_numle(nl, nr);\n  else if (ttisstring(l) && ttisstring(r))  /* both are strings? */\n    return l_strcmp(tsvalue(l), tsvalue(r)) <= 0;\n  else if ((res = luaT_callorderTM(L, l, r, TM_LE)) >= 0)  /* first try 'le' */\n    return res;\n  else if ((res = luaT_callorderTM(L, r, l, TM_LT)) < 0)  /* else try 'lt' */\n    luaG_ordererror(L, l, r);\n  return !res;\n}\n\n\n/*\n** Main operation for equality of Lua values; return 't1 == t2'. \n** L == NULL means raw equality (no metamethods)\n*/\nint luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2) {\n  const TValue *tm;\n  if (ttype(t1) != ttype(t2)) {  /* not the same variant? */\n    if (ttnov(t1) != ttnov(t2) || ttnov(t1) != LUA_TNUMBER)\n      return 0;  /* only numbers can be equal with different variants */\n    else {  /* two numbers with different variants */\n      lua_Number n1, n2;  /* compare them as floats */\n      lua_assert(ttisnumber(t1) && ttisnumber(t2));\n      cast_void(tofloat(t1, &n1)); cast_void(tofloat(t2, &n2));\n      return luai_numeq(n1, n2);\n    }\n  }\n  /* values have same type and same variant */\n  switch (ttype(t1)) {\n    case LUA_TNIL: return 1;\n    case LUA_TNUMINT: return (ivalue(t1) == ivalue(t2));\n    case LUA_TNUMFLT: return luai_numeq(fltvalue(t1), fltvalue(t2));\n    case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2);  /* true must be 1 !! */\n    case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2);\n    case LUA_TLCF: return fvalue(t1) == fvalue(t2);\n    case LUA_TSHRSTR: return eqshrstr(tsvalue(t1), tsvalue(t2));\n    case LUA_TLNGSTR: return luaS_eqlngstr(tsvalue(t1), tsvalue(t2));\n    case LUA_TUSERDATA: {\n      if (uvalue(t1) == uvalue(t2)) return 1;\n      else if (L == NULL) return 0;\n      tm = fasttm(L, uvalue(t1)->metatable, TM_EQ);\n      if (tm == NULL)\n        tm = fasttm(L, uvalue(t2)->metatable, TM_EQ);\n      break;  /* will try TM */\n    }\n    case LUA_TTABLE: {\n      if (hvalue(t1) == hvalue(t2)) return 1;\n      else if (L == NULL) return 0;\n      tm = fasttm(L, hvalue(t1)->metatable, TM_EQ);\n      if (tm == NULL)\n        tm = fasttm(L, hvalue(t2)->metatable, TM_EQ);\n      break;  /* will try TM */\n    }\n    default:\n      return gcvalue(t1) == gcvalue(t2);\n  }\n  if (tm == NULL)  /* no TM? */\n    return 0;  /* objects are different */\n  luaT_callTM(L, tm, t1, t2, L->top, 1);  /* call TM */\n  return !l_isfalse(L->top);\n}\n\n\n/* macro used by 'luaV_concat' to ensure that element at 'o' is a string */\n#define tostring(L,o)  \\\n\t(ttisstring(o) || (cvt2str(o) && (luaO_tostring(L, o), 1)))\n\n/*\n** Main operation for concatenation: concat 'total' values in the stack,\n** from 'L->top - total' up to 'L->top - 1'.\n*/\nvoid luaV_concat (lua_State *L, int total) {\n  lua_assert(total >= 2);\n  do {\n    StkId top = L->top;\n    int n = 2;  /* number of elements handled in this pass (at least 2) */\n    if (!(ttisstring(top-2) || cvt2str(top-2)) || !tostring(L, top-1))\n      luaT_trybinTM(L, top-2, top-1, top-2, TM_CONCAT);\n    else if (tsvalue(top-1)->len == 0)  /* second operand is empty? */\n      cast_void(tostring(L, top - 2));  /* result is first operand */\n    else if (ttisstring(top-2) && tsvalue(top-2)->len == 0) {\n      setobjs2s(L, top - 2, top - 1);  /* result is second op. */\n    }\n    else {\n      /* at least two non-empty string values; get as many as possible */\n      size_t tl = tsvalue(top-1)->len;\n      char *buffer;\n      int i;\n      /* collect total length */\n      for (i = 1; i < total && tostring(L, top-i-1); i++) {\n        size_t l = tsvalue(top-i-1)->len;\n        if (l >= (MAX_SIZE/sizeof(char)) - tl)\n          luaG_runerror(L, \"string length overflow\");\n        tl += l;\n      }\n      buffer = luaZ_openspace(L, &G(L)->buff, tl);\n      tl = 0;\n      n = i;\n      do {  /* copy all strings to buffer */\n        size_t l = tsvalue(top-i)->len;\n        memcpy(buffer+tl, svalue(top-i), l * sizeof(char));\n        tl += l;\n      } while (--i > 0);\n      setsvalue2s(L, top-n, luaS_newlstr(L, buffer, tl));  /* create result */\n    }\n    total -= n-1;  /* got 'n' strings to create 1 new */\n    L->top -= n-1;  /* popped 'n' strings and pushed one */\n  } while (total > 1);  /* repeat until only 1 result left */\n}\n\n\n/*\n** Main operation 'ra' = #rb'.\n*/\nvoid luaV_objlen (lua_State *L, StkId ra, const TValue *rb) {\n  const TValue *tm;\n  switch (ttnov(rb)) {\n    case LUA_TTABLE: {\n      Table *h = hvalue(rb);\n      tm = fasttm(L, h->metatable, TM_LEN);\n      if (tm) break;  /* metamethod? break switch to call it */\n      setivalue(ra, luaH_getn(h));  /* else primitive len */\n      return;\n    }\n    case LUA_TSTRING: {\n      setivalue(ra, tsvalue(rb)->len);\n      return;\n    }\n    default: {  /* try metamethod */\n      tm = luaT_gettmbyobj(L, rb, TM_LEN);\n      if (ttisnil(tm))  /* no metamethod? */\n        luaG_typeerror(L, rb, \"get length of\");\n      break;\n    }\n  }\n  luaT_callTM(L, tm, rb, rb, ra, 1);\n}\n\n\n/*\n** Integer division; return 'm // n', that is, floor(m/n).\n** C division truncates its result (rounds towards zero).\n** 'floor(q) == trunc(q)' when 'q >= 0' or when 'q' is integer,\n** otherwise 'floor(q) == trunc(q) - 1'.\n*/\nlua_Integer luaV_div (lua_State *L, lua_Integer m, lua_Integer n) {\n  if (l_castS2U(n) + 1u <= 1u) {  /* special cases: -1 or 0 */\n    if (n == 0)\n      luaG_runerror(L, \"attempt to divide by zero\");\n    return intop(-, 0, m);   /* n==-1; avoid overflow with 0x80000...//-1 */\n  }\n  else {\n    lua_Integer q = m / n;  /* perform C division */\n    if ((m ^ n) < 0 && m % n != 0)  /* 'm/n' would be negative non-integer? */\n      q -= 1;  /* correct result for different rounding */\n    return q;\n  }\n}\n\n\n/*\n** Integer modulus; return 'm % n'. (Assume that C '%' with \n** negative operands follows C99 behavior. See previous comment\n** about luaV_div.)\n*/\nlua_Integer luaV_mod (lua_State *L, lua_Integer m, lua_Integer n) {\n  if (l_castS2U(n) + 1u <= 1u) {  /* special cases: -1 or 0 */\n    if (n == 0)\n      luaG_runerror(L, \"attempt to perform 'n%%0'\");\n    return 0;   /* m % -1 == 0; avoid overflow with 0x80000...%-1 */\n  }\n  else {\n    lua_Integer r = m % n;\n    if (r != 0 && (m ^ n) < 0)  /* 'm/n' would be non-integer negative? */\n      r += n;  /* correct result for different rounding */\n    return r;\n  }\n}\n\n\n/* number of bits in an integer */\n#define NBITS\tcast_int(sizeof(lua_Integer) * CHAR_BIT)\n\n/*\n** Shift left operation. (Shift right just negates 'y'.)\n*/\nlua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) {\n  if (y < 0) {  /* shift right? */\n    if (y <= -NBITS) return 0;\n    else return intop(>>, x, -y);\n  }\n  else {  /* shift left */\n    if (y >= NBITS) return 0;\n    else return intop(<<, x, y);\n  }\n}\n\n\n/*\n** check whether cached closure in prototype 'p' may be reused, that is,\n** whether there is a cached closure with the same upvalues needed by\n** new closure to be created.\n*/\nstatic LClosure *getcached (Proto *p, UpVal **encup, StkId base) {\n  LClosure *c = p->cache;\n  if (c != NULL) {  /* is there a cached closure? */\n    int nup = p->sizeupvalues;\n    Upvaldesc *uv = p->upvalues;\n    int i;\n    for (i = 0; i < nup; i++) {  /* check whether it has right upvalues */\n      TValue *v = uv[i].instack ? base + uv[i].idx : encup[uv[i].idx]->v;\n      if (c->upvals[i]->v != v)\n        return NULL;  /* wrong upvalue; cannot reuse closure */\n    }\n  }\n  return c;  /* return cached closure (or NULL if no cached closure) */\n}\n\n\n/*\n** create a new Lua closure, push it in the stack, and initialize\n** its upvalues. Note that the closure is not cached if prototype is\n** already black (which means that 'cache' was already cleared by the\n** GC).\n*/\nstatic void pushclosure (lua_State *L, Proto *p, UpVal **encup, StkId base,\n                         StkId ra) {\n  int nup = p->sizeupvalues;\n  Upvaldesc *uv = p->upvalues;\n  int i;\n  LClosure *ncl = luaF_newLclosure(L, nup);\n  ncl->p = p;\n  setclLvalue(L, ra, ncl);  /* anchor new closure in stack */\n  for (i = 0; i < nup; i++) {  /* fill in its upvalues */\n    if (uv[i].instack)  /* upvalue refers to local variable? */\n      ncl->upvals[i] = luaF_findupval(L, base + uv[i].idx);\n    else  /* get upvalue from enclosing function */\n      ncl->upvals[i] = encup[uv[i].idx];\n    ncl->upvals[i]->refcount++;\n    /* new closure is white, so we do not need a barrier here */\n  }\n  if (!isblack(p))  /* cache will not break GC invariant? */\n    p->cache = ncl;  /* save it on cache for reuse */\n}\n\n\n/*\n** finish execution of an opcode interrupted by an yield\n*/\nvoid luaV_finishOp (lua_State *L) {\n  CallInfo *ci = L->ci;\n  StkId base = ci->u.l.base;\n  Instruction inst = *(ci->u.l.savedpc - 1);  /* interrupted instruction */\n  OpCode op = GET_OPCODE(inst);\n  switch (op) {  /* finish its execution */\n    case OP_ADD: case OP_SUB: case OP_MUL: case OP_DIV: case OP_IDIV:\n    case OP_BAND: case OP_BOR: case OP_BXOR: case OP_SHL: case OP_SHR:\n    case OP_MOD: case OP_POW:\n    case OP_UNM: case OP_BNOT: case OP_LEN:\n    case OP_GETTABUP: case OP_GETTABLE: case OP_SELF: {\n      setobjs2s(L, base + GETARG_A(inst), --L->top);\n      break;\n    }\n    case OP_LE: case OP_LT: case OP_EQ: {\n      int res = !l_isfalse(L->top - 1);\n      L->top--;\n      /* metamethod should not be called when operand is K */\n      lua_assert(!ISK(GETARG_B(inst)));\n      if (op == OP_LE &&  /* \"<=\" using \"<\" instead? */\n          ttisnil(luaT_gettmbyobj(L, base + GETARG_B(inst), TM_LE)))\n        res = !res;  /* invert result */\n      lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_JMP);\n      if (res != GETARG_A(inst))  /* condition failed? */\n        ci->u.l.savedpc++;  /* skip jump instruction */\n      break;\n    }\n    case OP_CONCAT: {\n      StkId top = L->top - 1;  /* top when 'luaT_trybinTM' was called */\n      int b = GETARG_B(inst);      /* first element to concatenate */\n      int total = cast_int(top - 1 - (base + b));  /* yet to concatenate */\n      setobj2s(L, top - 2, top);  /* put TM result in proper position */\n      if (total > 1) {  /* are there elements to concat? */\n        L->top = top - 1;  /* top is one after last element (at top-2) */\n        luaV_concat(L, total);  /* concat them (may yield again) */\n      }\n      /* move final result to final position */\n      setobj2s(L, ci->u.l.base + GETARG_A(inst), L->top - 1);\n      L->top = ci->top;  /* restore top */\n      break;\n    }\n    case OP_TFORCALL: {\n      lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_TFORLOOP);\n      L->top = ci->top;  /* correct top */\n      break;\n    }\n    case OP_CALL: {\n      if (GETARG_C(inst) - 1 >= 0)  /* nresults >= 0? */\n        L->top = ci->top;  /* adjust results */\n      break;\n    }\n    case OP_TAILCALL: case OP_SETTABUP: case OP_SETTABLE:\n      break;\n    default: lua_assert(0);\n  }\n}\n\n\n\n\n/*\n** {==================================================================\n** Function 'luaV_execute': main interpreter loop\n** ===================================================================\n*/\n\n\n/*\n** some macros for common tasks in 'luaV_execute'\n*/\n\n#if !defined luai_runtimecheck\n#define luai_runtimecheck(L, c)\t\t/* void */\n#endif\n\n\n#define RA(i)\t(base+GETARG_A(i))\n/* to be used after possible stack reallocation */\n#define RB(i)\tcheck_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i))\n#define RC(i)\tcheck_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i))\n#define RKB(i)\tcheck_exp(getBMode(GET_OPCODE(i)) == OpArgK, \\\n\tISK(GETARG_B(i)) ? k+INDEXK(GETARG_B(i)) : base+GETARG_B(i))\n#define RKC(i)\tcheck_exp(getCMode(GET_OPCODE(i)) == OpArgK, \\\n\tISK(GETARG_C(i)) ? k+INDEXK(GETARG_C(i)) : base+GETARG_C(i))\n#define KBx(i)  \\\n  (k + (GETARG_Bx(i) != 0 ? GETARG_Bx(i) - 1 : GETARG_Ax(*ci->u.l.savedpc++)))\n\n\n/* execute a jump instruction */\n#define dojump(ci,i,e) \\\n  { int a = GETARG_A(i); \\\n    if (a > 0) luaF_close(L, ci->u.l.base + a - 1); \\\n    ci->u.l.savedpc += GETARG_sBx(i) + e; }\n\n/* for test instructions, execute the jump instruction that follows it */\n#define donextjump(ci)\t{ i = *ci->u.l.savedpc; dojump(ci, i, 1); }\n\n\n#define Protect(x)\t{ {x;}; base = ci->u.l.base; }\n\n#define checkGC(L,c)  \\\n  Protect( luaC_condGC(L,{L->top = (c);  /* limit of live values */ \\\n                          luaC_step(L); \\\n                          L->top = ci->top;})  /* restore top */ \\\n           luai_threadyield(L); )\n\n\n#define vmdispatch(o)\tswitch(o)\n#define vmcase(l)\tcase l:\n#define vmbreak\t\tbreak\n\nvoid luaV_execute (lua_State *L) {\n  CallInfo *ci = L->ci;\n  LClosure *cl;\n  TValue *k;\n  StkId base;\n newframe:  /* reentry point when frame changes (call/return) */\n  lua_assert(ci == L->ci);\n  cl = clLvalue(ci->func);\n  k = cl->p->k;\n  base = ci->u.l.base;\n  /* main loop of interpreter */\n  for (;;) {\n    Instruction i = *(ci->u.l.savedpc++);\n    StkId ra;\n    if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) &&\n        (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) {\n      Protect(luaG_traceexec(L));\n    }\n    /* WARNING: several calls may realloc the stack and invalidate 'ra' */\n    ra = RA(i);\n    lua_assert(base == ci->u.l.base);\n    lua_assert(base <= L->top && L->top < L->stack + L->stacksize);\n    vmdispatch (GET_OPCODE(i)) {\n      vmcase(OP_MOVE) {\n        setobjs2s(L, ra, RB(i));\n        vmbreak;\n      }\n      vmcase(OP_LOADK) {\n        TValue *rb = k + GETARG_Bx(i);\n        setobj2s(L, ra, rb);\n        vmbreak;\n      }\n      vmcase(OP_LOADKX) {\n        TValue *rb;\n        lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_EXTRAARG);\n        rb = k + GETARG_Ax(*ci->u.l.savedpc++);\n        setobj2s(L, ra, rb);\n        vmbreak;\n      }\n      vmcase(OP_LOADBOOL) {\n        setbvalue(ra, GETARG_B(i));\n        if (GETARG_C(i)) ci->u.l.savedpc++;  /* skip next instruction (if C) */\n        vmbreak;\n      }\n      vmcase(OP_LOADNIL) {\n        int b = GETARG_B(i);\n        do {\n          setnilvalue(ra++);\n        } while (b--);\n        vmbreak;\n      }\n      vmcase(OP_GETUPVAL) {\n        int b = GETARG_B(i);\n        setobj2s(L, ra, cl->upvals[b]->v);\n        vmbreak;\n      }\n      vmcase(OP_GETTABUP) {\n        int b = GETARG_B(i);\n        Protect(luaV_gettable(L, cl->upvals[b]->v, RKC(i), ra));\n        vmbreak;\n      }\n      vmcase(OP_GETTABLE) {\n        Protect(luaV_gettable(L, RB(i), RKC(i), ra));\n        vmbreak;\n      }\n      vmcase(OP_SETTABUP) {\n        int a = GETARG_A(i);\n        Protect(luaV_settable(L, cl->upvals[a]->v, RKB(i), RKC(i)));\n        vmbreak;\n      }\n      vmcase(OP_SETUPVAL) {\n        UpVal *uv = cl->upvals[GETARG_B(i)];\n        setobj(L, uv->v, ra);\n        luaC_upvalbarrier(L, uv);\n        vmbreak;\n      }\n      vmcase(OP_SETTABLE) {\n        Protect(luaV_settable(L, ra, RKB(i), RKC(i)));\n        vmbreak;\n      }\n      vmcase(OP_NEWTABLE) {\n        int b = GETARG_B(i);\n        int c = GETARG_C(i);\n        Table *t = luaH_new(L);\n        sethvalue(L, ra, t);\n        if (b != 0 || c != 0)\n          luaH_resize(L, t, luaO_fb2int(b), luaO_fb2int(c));\n        checkGC(L, ra + 1);\n        vmbreak;\n      }\n      vmcase(OP_SELF) {\n        StkId rb = RB(i);\n        setobjs2s(L, ra+1, rb);\n        Protect(luaV_gettable(L, rb, RKC(i), ra));\n        vmbreak;\n      }\n      vmcase(OP_ADD) { \n        TValue *rb = RKB(i);\n        TValue *rc = RKC(i);\n        lua_Number nb; lua_Number nc;\n        if (ttisinteger(rb) && ttisinteger(rc)) {\n          lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);\n          setivalue(ra, intop(+, ib, ic));\n        }\n        else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {\n          setfltvalue(ra, luai_numadd(L, nb, nc));\n        }\n        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_ADD)); }\n        vmbreak;\n      }\n      vmcase(OP_SUB) {\n        TValue *rb = RKB(i);\n        TValue *rc = RKC(i);\n        lua_Number nb; lua_Number nc;\n        if (ttisinteger(rb) && ttisinteger(rc)) {\n          lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);\n          setivalue(ra, intop(-, ib, ic));\n        }\n        else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {\n          setfltvalue(ra, luai_numsub(L, nb, nc));\n        }\n        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SUB)); }\n        vmbreak;\n      }\n      vmcase(OP_MUL) {\n        TValue *rb = RKB(i);\n        TValue *rc = RKC(i);\n        lua_Number nb; lua_Number nc;\n        if (ttisinteger(rb) && ttisinteger(rc)) {\n          lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);\n          setivalue(ra, intop(*, ib, ic));\n        }\n        else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {\n          setfltvalue(ra, luai_nummul(L, nb, nc));\n        }\n        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_MUL)); }\n        vmbreak;\n      }\n      vmcase(OP_DIV) {  /* float division (always with floats) */\n        TValue *rb = RKB(i);\n        TValue *rc = RKC(i);\n        lua_Number nb; lua_Number nc;\n        if (tonumber(rb, &nb) && tonumber(rc, &nc)) {\n          setfltvalue(ra, luai_numdiv(L, nb, nc));\n        }\n        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_DIV)); }\n        vmbreak;\n      }\n      vmcase(OP_BAND) {\n        TValue *rb = RKB(i);\n        TValue *rc = RKC(i);\n        lua_Integer ib; lua_Integer ic;\n        if (tointeger(rb, &ib) && tointeger(rc, &ic)) {\n          setivalue(ra, intop(&, ib, ic));\n        }\n        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BAND)); }\n        vmbreak;\n      }\n      vmcase(OP_BOR) {\n        TValue *rb = RKB(i);\n        TValue *rc = RKC(i);\n        lua_Integer ib; lua_Integer ic;\n        if (tointeger(rb, &ib) && tointeger(rc, &ic)) {\n          setivalue(ra, intop(|, ib, ic));\n        }\n        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BOR)); }\n        vmbreak;\n      }\n      vmcase(OP_BXOR) {\n        TValue *rb = RKB(i);\n        TValue *rc = RKC(i);\n        lua_Integer ib; lua_Integer ic;\n        if (tointeger(rb, &ib) && tointeger(rc, &ic)) {\n          setivalue(ra, intop(^, ib, ic));\n        }\n        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BXOR)); }\n        vmbreak;\n      }\n      vmcase(OP_SHL) {\n        TValue *rb = RKB(i);\n        TValue *rc = RKC(i);\n        lua_Integer ib; lua_Integer ic;\n        if (tointeger(rb, &ib) && tointeger(rc, &ic)) {\n          setivalue(ra, luaV_shiftl(ib, ic));\n        }\n        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHL)); }\n        vmbreak;\n      }\n      vmcase(OP_SHR) {\n        TValue *rb = RKB(i);\n        TValue *rc = RKC(i);\n        lua_Integer ib; lua_Integer ic;\n        if (tointeger(rb, &ib) && tointeger(rc, &ic)) {\n          setivalue(ra, luaV_shiftl(ib, -ic));\n        }\n        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHR)); }\n        vmbreak;\n      }\n      vmcase(OP_MOD) {\n        TValue *rb = RKB(i);\n        TValue *rc = RKC(i);\n        lua_Number nb; lua_Number nc;\n        if (ttisinteger(rb) && ttisinteger(rc)) {\n          lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);\n          setivalue(ra, luaV_mod(L, ib, ic));\n        }\n        else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {\n          lua_Number m;\n          luai_nummod(L, nb, nc, m);\n          setfltvalue(ra, m);\n        }\n        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_MOD)); }\n        vmbreak;\n      }\n      vmcase(OP_IDIV) {  /* floor division */\n        TValue *rb = RKB(i);\n        TValue *rc = RKC(i);\n        lua_Number nb; lua_Number nc;\n        if (ttisinteger(rb) && ttisinteger(rc)) {\n          lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);\n          setivalue(ra, luaV_div(L, ib, ic));\n        }\n        else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {\n          setfltvalue(ra, luai_numidiv(L, nb, nc));\n        }\n        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_IDIV)); }\n        vmbreak;\n      }\n      vmcase(OP_POW) {\n        TValue *rb = RKB(i);\n        TValue *rc = RKC(i);\n        lua_Number nb; lua_Number nc;\n        if (tonumber(rb, &nb) && tonumber(rc, &nc)) {\n          setfltvalue(ra, luai_numpow(L, nb, nc));\n        }\n        else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_POW)); }\n        vmbreak;\n      }\n      vmcase(OP_UNM) {\n        TValue *rb = RB(i);\n        lua_Number nb;\n        if (ttisinteger(rb)) {\n          lua_Integer ib = ivalue(rb);\n          setivalue(ra, intop(-, 0, ib));\n        }\n        else if (tonumber(rb, &nb)) {\n          setfltvalue(ra, luai_numunm(L, nb));\n        }\n        else {\n          Protect(luaT_trybinTM(L, rb, rb, ra, TM_UNM));\n        }\n        vmbreak;\n      }\n      vmcase(OP_BNOT) {\n        TValue *rb = RB(i);\n        lua_Integer ib;\n        if (tointeger(rb, &ib)) {\n          setivalue(ra, intop(^, ~l_castS2U(0), ib));\n        }\n        else {\n          Protect(luaT_trybinTM(L, rb, rb, ra, TM_BNOT));\n        }\n        vmbreak;\n      }\n      vmcase(OP_NOT) {\n        TValue *rb = RB(i);\n        int res = l_isfalse(rb);  /* next assignment may change this value */\n        setbvalue(ra, res);\n        vmbreak;\n      }\n      vmcase(OP_LEN) {\n        Protect(luaV_objlen(L, ra, RB(i)));\n        vmbreak;\n      }\n      vmcase(OP_CONCAT) {\n        int b = GETARG_B(i);\n        int c = GETARG_C(i);\n        StkId rb;\n        L->top = base + c + 1;  /* mark the end of concat operands */\n        Protect(luaV_concat(L, c - b + 1));\n        ra = RA(i);  /* 'luav_concat' may invoke TMs and move the stack */\n        rb = b + base;\n        setobjs2s(L, ra, rb);\n        checkGC(L, (ra >= rb ? ra + 1 : rb));\n        L->top = ci->top;  /* restore top */\n        vmbreak;\n      }\n      vmcase(OP_JMP) {\n        dojump(ci, i, 0);\n        vmbreak;\n      }\n      vmcase(OP_EQ) {\n        TValue *rb = RKB(i);\n        TValue *rc = RKC(i);\n        Protect(\n          if (cast_int(luaV_equalobj(L, rb, rc)) != GETARG_A(i))\n            ci->u.l.savedpc++;\n          else\n            donextjump(ci);\n        )\n        vmbreak;\n      }\n      vmcase(OP_LT) {\n        Protect(\n          if (luaV_lessthan(L, RKB(i), RKC(i)) != GETARG_A(i))\n            ci->u.l.savedpc++;\n          else\n            donextjump(ci);\n        )\n        vmbreak;\n      }\n      vmcase(OP_LE) {\n        Protect(\n          if (luaV_lessequal(L, RKB(i), RKC(i)) != GETARG_A(i))\n            ci->u.l.savedpc++;\n          else\n            donextjump(ci);\n        )\n        vmbreak;\n      }\n      vmcase(OP_TEST) {\n        if (GETARG_C(i) ? l_isfalse(ra) : !l_isfalse(ra))\n            ci->u.l.savedpc++;\n          else\n          donextjump(ci);\n        vmbreak;\n      }\n      vmcase(OP_TESTSET) {\n        TValue *rb = RB(i);\n        if (GETARG_C(i) ? l_isfalse(rb) : !l_isfalse(rb))\n          ci->u.l.savedpc++;\n        else {\n          setobjs2s(L, ra, rb);\n          donextjump(ci);\n        }\n        vmbreak;\n      }\n      vmcase(OP_CALL) {\n        int b = GETARG_B(i);\n        int nresults = GETARG_C(i) - 1;\n        if (b != 0) L->top = ra+b;  /* else previous instruction set top */\n        if (luaD_precall(L, ra, nresults)) {  /* C function? */\n          if (nresults >= 0) L->top = ci->top;  /* adjust results */\n          base = ci->u.l.base;\n        }\n        else {  /* Lua function */\n          ci = L->ci;\n          ci->callstatus |= CIST_REENTRY;\n          goto newframe;  /* restart luaV_execute over new Lua function */\n        }\n        vmbreak;\n      }\n      vmcase(OP_TAILCALL) {\n        int b = GETARG_B(i);\n        if (b != 0) L->top = ra+b;  /* else previous instruction set top */\n        lua_assert(GETARG_C(i) - 1 == LUA_MULTRET);\n        if (luaD_precall(L, ra, LUA_MULTRET))  /* C function? */\n          base = ci->u.l.base;\n        else {\n          /* tail call: put called frame (n) in place of caller one (o) */\n          CallInfo *nci = L->ci;  /* called frame */\n          CallInfo *oci = nci->previous;  /* caller frame */\n          StkId nfunc = nci->func;  /* called function */\n          StkId ofunc = oci->func;  /* caller function */\n          /* last stack slot filled by 'precall' */\n          StkId lim = nci->u.l.base + getproto(nfunc)->numparams;\n          int aux;\n          /* close all upvalues from previous call */\n          if (cl->p->sizep > 0) luaF_close(L, oci->u.l.base);\n          /* move new frame into old one */\n          for (aux = 0; nfunc + aux < lim; aux++)\n            setobjs2s(L, ofunc + aux, nfunc + aux);\n          oci->u.l.base = ofunc + (nci->u.l.base - nfunc);  /* correct base */\n          oci->top = L->top = ofunc + (L->top - nfunc);  /* correct top */\n          oci->u.l.savedpc = nci->u.l.savedpc;\n          oci->callstatus |= CIST_TAIL;  /* function was tail called */\n          ci = L->ci = oci;  /* remove new frame */\n          lua_assert(L->top == oci->u.l.base + getproto(ofunc)->maxstacksize);\n          goto newframe;  /* restart luaV_execute over new Lua function */\n        }\n        vmbreak;\n      }\n      vmcase(OP_RETURN) {\n        int b = GETARG_B(i);\n        if (b != 0) L->top = ra+b-1;\n        if (cl->p->sizep > 0) luaF_close(L, base);\n        b = luaD_poscall(L, ra);\n        if (!(ci->callstatus & CIST_REENTRY))  /* 'ci' still the called one */\n          return;  /* external invocation: return */\n        else {  /* invocation via reentry: continue execution */\n          ci = L->ci;\n          if (b) L->top = ci->top;\n          lua_assert(isLua(ci));\n          lua_assert(GET_OPCODE(*((ci)->u.l.savedpc - 1)) == OP_CALL);\n          goto newframe;  /* restart luaV_execute over new Lua function */\n        }\n      }\n      vmcase(OP_FORLOOP) {\n        if (ttisinteger(ra)) {  /* integer loop? */\n          lua_Integer step = ivalue(ra + 2);\n          lua_Integer idx = ivalue(ra) + step; /* increment index */\n          lua_Integer limit = ivalue(ra + 1);\n          if ((0 < step) ? (idx <= limit) : (limit <= idx)) {\n            ci->u.l.savedpc += GETARG_sBx(i);  /* jump back */\n            setivalue(ra, idx);  /* update internal index... */\n            setivalue(ra + 3, idx);  /* ...and external index */\n          }\n        }\n        else {  /* floating loop */\n          lua_Number step = fltvalue(ra + 2);\n          lua_Number idx = luai_numadd(L, fltvalue(ra), step); /* inc. index */\n          lua_Number limit = fltvalue(ra + 1);\n          if (luai_numlt(0, step) ? luai_numle(idx, limit)\n                                  : luai_numle(limit, idx)) {\n            ci->u.l.savedpc += GETARG_sBx(i);  /* jump back */\n            setfltvalue(ra, idx);  /* update internal index... */\n            setfltvalue(ra + 3, idx);  /* ...and external index */\n          }\n        }\n        vmbreak;\n      }\n      vmcase(OP_FORPREP) {\n        TValue *init = ra;\n        TValue *plimit = ra + 1;\n        TValue *pstep = ra + 2;\n        lua_Integer ilimit;\n        int stopnow;\n        if (ttisinteger(init) && ttisinteger(pstep) &&\n            forlimit(plimit, &ilimit, ivalue(pstep), &stopnow)) {\n          /* all values are integer */\n          lua_Integer initv = (stopnow ? 0 : ivalue(init));\n          setivalue(plimit, ilimit);\n          setivalue(init, initv - ivalue(pstep));\n        }\n        else {  /* try making all values floats */\n          lua_Number ninit; lua_Number nlimit; lua_Number nstep;\n          if (!tonumber(plimit, &nlimit))\n            luaG_runerror(L, \"'for' limit must be a number\");\n          setfltvalue(plimit, nlimit);\n          if (!tonumber(pstep, &nstep))\n            luaG_runerror(L, \"'for' step must be a number\");\n          setfltvalue(pstep, nstep);\n          if (!tonumber(init, &ninit))\n            luaG_runerror(L, \"'for' initial value must be a number\");\n          setfltvalue(init, luai_numsub(L, ninit, nstep));\n        }\n        ci->u.l.savedpc += GETARG_sBx(i);\n        vmbreak;\n      }\n      vmcase(OP_TFORCALL) {\n        StkId cb = ra + 3;  /* call base */\n        setobjs2s(L, cb+2, ra+2);\n        setobjs2s(L, cb+1, ra+1);\n        setobjs2s(L, cb, ra);\n        L->top = cb + 3;  /* func. + 2 args (state and index) */\n        Protect(luaD_call(L, cb, GETARG_C(i), 1));\n        L->top = ci->top;\n        i = *(ci->u.l.savedpc++);  /* go to next instruction */\n        ra = RA(i);\n        lua_assert(GET_OPCODE(i) == OP_TFORLOOP);\n        goto l_tforloop;\n      }\n      vmcase(OP_TFORLOOP) {\n        l_tforloop:\n        if (!ttisnil(ra + 1)) {  /* continue loop? */\n          setobjs2s(L, ra, ra + 1);  /* save control variable */\n           ci->u.l.savedpc += GETARG_sBx(i);  /* jump back */\n        }\n        vmbreak;\n      }\n      vmcase(OP_SETLIST) {\n        int n = GETARG_B(i);\n        int c = GETARG_C(i);\n        unsigned int last;\n        Table *h;\n        if (n == 0) n = cast_int(L->top - ra) - 1;\n        if (c == 0) {\n          lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_EXTRAARG);\n          c = GETARG_Ax(*ci->u.l.savedpc++);\n        }\n        luai_runtimecheck(L, ttistable(ra));\n        h = hvalue(ra);\n        last = ((c-1)*LFIELDS_PER_FLUSH) + n;\n        if (last > h->sizearray)  /* needs more space? */\n          luaH_resizearray(L, h, last);  /* pre-allocate it at once */\n        for (; n > 0; n--) {\n          TValue *val = ra+n;\n          luaH_setint(L, h, last--, val);\n          luaC_barrierback(L, h, val);\n        }\n        L->top = ci->top;  /* correct top (in case of previous open call) */\n        vmbreak;\n      }\n      vmcase(OP_CLOSURE) {\n        Proto *p = cl->p->p[GETARG_Bx(i)];\n        LClosure *ncl = getcached(p, cl->upvals, base);  /* cached closure */\n        if (ncl == NULL)  /* no match? */\n          pushclosure(L, p, cl->upvals, base, ra);  /* create a new one */\n        else\n          setclLvalue(L, ra, ncl);  /* push cashed closure */\n        checkGC(L, ra + 1);\n        vmbreak;\n      }\n      vmcase(OP_VARARG) {\n        int b = GETARG_B(i) - 1;\n        int j;\n        int n = cast_int(base - ci->func) - cl->p->numparams - 1;\n        if (b < 0) {  /* B == 0? */\n          b = n;  /* get all var. arguments */\n          Protect(luaD_checkstack(L, n));\n          ra = RA(i);  /* previous call may change the stack */\n          L->top = ra + n;\n        }\n        for (j = 0; j < b; j++) {\n          if (j < n) {\n            setobjs2s(L, ra + j, base - n + j);\n          }\n          else {\n            setnilvalue(ra + j);\n          }\n        }\n        vmbreak;\n      }\n      vmcase(OP_EXTRAARG) {\n        lua_assert(0);\n        vmbreak;\n      }\n    }\n  }\n}\n\n/* }================================================================== */\n\n"
  },
  {
    "path": "externals/lua/src/lvm.h",
    "content": "/*\n** $Id: lvm.h,v 2.34 2014/08/01 17:24:02 roberto Exp $\n** Lua virtual machine\n** See Copyright Notice in lua.h\n*/\n\n#ifndef lvm_h\n#define lvm_h\n\n\n#include \"ldo.h\"\n#include \"lobject.h\"\n#include \"ltm.h\"\n\n\n#if !defined(LUA_NOCVTN2S)\n#define cvt2str(o)\tttisnumber(o)\n#else\n#define cvt2str(o)\t0\t/* no conversion from numbers to strings */\n#endif\n\n\n#if !defined(LUA_NOCVTS2N)\n#define cvt2num(o)\tttisstring(o)\n#else\n#define cvt2num(o)\t0\t/* no conversion from strings to numbers */\n#endif\n\n\n#define tonumber(o,n) \\\n\t(ttisfloat(o) ? (*(n) = fltvalue(o), 1) : luaV_tonumber_(o,n))\n\n#define tointeger(o,i) \\\n\t(ttisinteger(o) ? (*(i) = ivalue(o), 1) : luaV_tointeger_(o,i))\n\n#define intop(op,v1,v2) l_castU2S(l_castS2U(v1) op l_castS2U(v2))\n\n#define luaV_rawequalobj(t1,t2)\t\tluaV_equalobj(NULL,t1,t2)\n\n\nLUAI_FUNC int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2);\nLUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r);\nLUAI_FUNC int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r);\nLUAI_FUNC int luaV_tonumber_ (const TValue *obj, lua_Number *n);\nLUAI_FUNC int luaV_tointeger_ (const TValue *obj, lua_Integer *p);\nLUAI_FUNC void luaV_gettable (lua_State *L, const TValue *t, TValue *key,\n                                            StkId val);\nLUAI_FUNC void luaV_settable (lua_State *L, const TValue *t, TValue *key,\n                                            StkId val);\nLUAI_FUNC void luaV_finishOp (lua_State *L);\nLUAI_FUNC void luaV_execute (lua_State *L);\nLUAI_FUNC void luaV_concat (lua_State *L, int total);\nLUAI_FUNC lua_Integer luaV_div (lua_State *L, lua_Integer x, lua_Integer y);\nLUAI_FUNC lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y);\nLUAI_FUNC lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y);\nLUAI_FUNC void luaV_objlen (lua_State *L, StkId ra, const TValue *rb);\n\n#endif\n"
  },
  {
    "path": "externals/lua/src/lzio.c",
    "content": "/*\n** $Id: lzio.c,v 1.36 2014/11/02 19:19:04 roberto Exp $\n** Buffered streams\n** See Copyright Notice in lua.h\n*/\n\n#define lzio_c\n#define LUA_CORE\n\n#include \"lprefix.h\"\n\n\n#include <string.h>\n\n#include \"lua.h\"\n\n#include \"llimits.h\"\n#include \"lmem.h\"\n#include \"lstate.h\"\n#include \"lzio.h\"\n\n\nint luaZ_fill (ZIO *z) {\n  size_t size;\n  lua_State *L = z->L;\n  const char *buff;\n  lua_unlock(L);\n  buff = z->reader(L, z->data, &size);\n  lua_lock(L);\n  if (buff == NULL || size == 0)\n    return EOZ;\n  z->n = size - 1;  /* discount char being returned */\n  z->p = buff;\n  return cast_uchar(*(z->p++));\n}\n\n\nvoid luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) {\n  z->L = L;\n  z->reader = reader;\n  z->data = data;\n  z->n = 0;\n  z->p = NULL;\n}\n\n\n/* --------------------------------------------------------------- read --- */\nsize_t luaZ_read (ZIO *z, void *b, size_t n) {\n  while (n) {\n    size_t m;\n    if (z->n == 0) {  /* no bytes in buffer? */\n      if (luaZ_fill(z) == EOZ)  /* try to read more */\n        return n;  /* no more input; return number of missing bytes */\n      else {\n        z->n++;  /* luaZ_fill consumed first byte; put it back */\n        z->p--;\n      }\n    }\n    m = (n <= z->n) ? n : z->n;  /* min. between n and z->n */\n    memcpy(b, z->p, m);\n    z->n -= m;\n    z->p += m;\n    b = (char *)b + m;\n    n -= m;\n  }\n  return 0;\n}\n\n/* ------------------------------------------------------------------------ */\nchar *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n) {\n  if (n > buff->buffsize) {\n    if (n < LUA_MINBUFFER) n = LUA_MINBUFFER;\n    luaZ_resizebuffer(L, buff, n);\n  }\n  return buff->buffer;\n}\n\n\n"
  },
  {
    "path": "externals/lua/src/lzio.h",
    "content": "/*\n** $Id: lzio.h,v 1.30 2014/12/19 17:26:14 roberto Exp $\n** Buffered streams\n** See Copyright Notice in lua.h\n*/\n\n\n#ifndef lzio_h\n#define lzio_h\n\n#include \"lua.h\"\n\n#include \"lmem.h\"\n\n\n#define EOZ\t(-1)\t\t\t/* end of stream */\n\ntypedef struct Zio ZIO;\n\n#define zgetc(z)  (((z)->n--)>0 ?  cast_uchar(*(z)->p++) : luaZ_fill(z))\n\n\ntypedef struct Mbuffer {\n  char *buffer;\n  size_t n;\n  size_t buffsize;\n} Mbuffer;\n\n#define luaZ_initbuffer(L, buff) ((buff)->buffer = NULL, (buff)->buffsize = 0)\n\n#define luaZ_buffer(buff)\t((buff)->buffer)\n#define luaZ_sizebuffer(buff)\t((buff)->buffsize)\n#define luaZ_bufflen(buff)\t((buff)->n)\n\n#define luaZ_buffremove(buff,i)\t((buff)->n -= (i))\n#define luaZ_resetbuffer(buff) ((buff)->n = 0)\n\n\n#define luaZ_resizebuffer(L, buff, size) \\\n\t((buff)->buffer = luaM_reallocvchar(L, (buff)->buffer, \\\n\t\t\t\t(buff)->buffsize, size), \\\n\t(buff)->buffsize = size)\n\n#define luaZ_freebuffer(L, buff)\tluaZ_resizebuffer(L, buff, 0)\n\n\nLUAI_FUNC char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n);\nLUAI_FUNC void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader,\n                                        void *data);\nLUAI_FUNC size_t luaZ_read (ZIO* z, void *b, size_t n);\t/* read next n bytes */\n\n\n\n/* --------- Private Part ------------------ */\n\nstruct Zio {\n  size_t n;\t\t\t/* bytes still unread */\n  const char *p;\t\t/* current position in buffer */\n  lua_Reader reader;\t\t/* reader function */\n  void *data;\t\t\t/* additional data */\n  lua_State *L;\t\t\t/* Lua state (for reader) */\n};\n\n\nLUAI_FUNC int luaZ_fill (ZIO *z);\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Include/OVR.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR.h\nContent     :   The main public interface to Oculus for C++ Developers.\n                Includes C API and helper classes.\n\nCopyright   :   Copyright 2014 Oculus VR, LLC. All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_h\n#define OVR_h\n\n#include \"OVR_Version.h\"\n\n#include \"../Src/Kernel/OVR_Math.h\"\n\n#include \"../Src/OVR_CAPI.h\"\n\n#endif\n\n"
  },
  {
    "path": "externals/ovr/Include/OVR_Kernel.h",
    "content": "/************************************************************************************\n\nFilename    :   OVRKernel.h\nContent     :   This contains references to all OVR Kernel headers in Src folder.\n                Should be generated automatically based on PublicHeader tags.\n\nCopyright   :   Copyright 2014 Oculus VR, LLC. All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_h\n#define OVR_h\n\n#include \"../Src/Kernel/OVR_Types.h\"\n#include \"../Src/Kernel/OVR_Allocator.h\"\n#include \"../Src/Kernel/OVR_RefCount.h\"\n#include \"../Src/Kernel/OVR_Log.h\"\n#include \"../Src/Kernel/OVR_Math.h\"\n#include \"../Src/Kernel/OVR_System.h\"\n#include \"../Src/Kernel/OVR_Nullptr.h\"\n#include \"../Src/Kernel/OVR_String.h\"\n#include \"../Src/Kernel/OVR_Array.h\"\n#include \"../Src/Kernel/OVR_Timer.h\"\n#include \"../Src/Kernel/OVR_SysFile.h\"\n\n#endif\n\n"
  },
  {
    "path": "externals/ovr/Include/OVR_Version.h",
    "content": "/************************************************************************************\n\nFilename    :   OVRVersion.h\nContent     :\n\nCopyright   :   Copyright 2014 Oculus VR, LLC. All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef _OVR_VERSION_H\n#define _OVR_VERSION_H\n\n#define OVR_MAJOR_VERSION 0\n#define OVR_MINOR_VERSION 4\n#define OVR_BUILD_VERSION 4\n#define OVR_VERSION_STRING \"0.4.4\"\n\n#define OVR_DK2_LATEST_FIRMWARE_MAJOR_VERSION 2\n#define OVR_DK2_LATEST_FIRMWARE_MINOR_VERSION 12\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/CAPI_DistortionRenderer.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_DistortionRenderer.cpp\nContent     :   Combines all of the rendering state associated with the HMD\nCreated     :   February 2, 2014\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_DistortionRenderer.h\"\n\n#if defined (OVR_OS_WIN32)\n\n// TBD: Move to separate config file that handles back-ends.\n#define OVR_D3D_VERSION 11\n#include \"D3D1X/CAPI_D3D1X_DistortionRenderer.h\"\n#undef OVR_D3D_VERSION\n\n#define OVR_D3D_VERSION 10\n#include \"D3D1X/CAPI_D3D1X_DistortionRenderer.h\"\n#undef OVR_D3D_VERSION\n\n#define OVR_D3D_VERSION 9\n#include \"D3D9/CAPI_D3D9_DistortionRenderer.h\"\n#undef OVR_D3D_VERSION\n\n#endif\n\n#include \"GL/CAPI_GL_DistortionRenderer.h\"\n\nnamespace OVR { namespace CAPI {\n\n//-------------------------------------------------------------------------------------\n// ***** DistortionRenderer\n\n// TBD: Move to separate config file that handles back-ends.\n\nDistortionRenderer::CreateFunc DistortionRenderer::APICreateRegistry[ovrRenderAPI_Count] =\n{\n    0, // None\n    &GL::DistortionRenderer::Create,\n    0, // Android_GLES\n#if defined (OVR_OS_WIN32)\n    &D3D9::DistortionRenderer::Create,\n    &D3D10::DistortionRenderer::Create,\n    &D3D11::DistortionRenderer::Create\n#else\n    0,\n    0,\n    0\n#endif\n};\n\nvoid DistortionRenderer::SetLatencyTestColor(unsigned char* color)\n{\n    if(color)\n    {\n        LatencyTestDrawColor[0] = color[0];\n        LatencyTestDrawColor[1] = color[1];\n        LatencyTestDrawColor[2] = color[2];\n    }\n\n    LatencyTestActive = color != NULL;\n}\n\nvoid DistortionRenderer::SetLatencyTest2Color(unsigned char* color)\n{\n    if(color)\n    {\n        LatencyTest2DrawColor[0] = color[0];\n        LatencyTest2DrawColor[1] = color[1];\n        LatencyTest2DrawColor[2] = color[2];\n    }\n\n    LatencyTest2Active = color != NULL;\n}\n\nvoid DistortionRenderer::GetOverdriveScales(float& outRiseScale, float& outFallScale)\n{\n    outRiseScale = 0.1f;\n    outFallScale = 0.05f;\t// falling issues are hardly visible\n}\n\ndouble DistortionRenderer::WaitTillTime(double absTime)\n{\n    double initialTime = ovr_GetTimeInSeconds();\n    if (initialTime >= absTime)\n        return 0.0;\n\n    double newTime = initialTime;\n\n    while (newTime < absTime)\n    {\n// TODO: Needs further testing before enabling it on all Windows configs\n#if 0 //def OVR_OS_WIN32\n        double remainingWaitTime = absTime - newTime;\n\n        // don't yield if <2ms\n        if(remainingWaitTime > 0.002)\n        {\n            // round down wait time to closest 1 ms\n            int roundedWaitTime = (remainingWaitTime * 1000);\n\n            waitableTimerInterval.QuadPart = -10000LL; // 10000 * 100 ns = 1 ms\n            waitableTimerInterval.QuadPart *= roundedWaitTime;\n\n            SetWaitableTimer(timer, &waitableTimerInterval, 0, NULL, NULL, TRUE);\n            DWORD waitResult = WaitForSingleObject(timer, roundedWaitTime + 3);   // give 3 ms extra time\n            OVR_UNUSED(waitResult);\n\n#ifdef OVR_BUILD_DEBUG\n            double sleptTime = ovr_GetTimeInSeconds() - newTime;\n            // Make sure we didn't sleep too long and it is reliable, otherwise we might miss v-sync causing a stutter\n            if (sleptTime > (roundedWaitTime + 2) * 0.001) \n            {\n                OVR_DEBUG_LOG_TEXT(\n                    (\"[DistortionRenderer::WaitTillTime] Sleep interval too long: %f\\n\", sleptTime));\n            }\n            else\n            {\n                OVR_ASSERT(WAIT_OBJECT_0 == waitResult);\n            }\n#endif\n        }\n        else\n#endif\n        {\n            for (int j = 0; j < 5; j++)\n                OVR_PROCESSOR_PAUSE();\n        }\n\n        newTime = ovr_GetTimeInSeconds();\n    }\n\n    // How long we waited\n    return newTime - initialTime;\n}\n\n}} // namespace OVR::CAPI\n\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/CAPI_DistortionRenderer.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_DistortionRenderer.h\nContent     :   Abstract interface for platform-specific rendering of distortion\nCreated     :   February 2, 2014\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_DistortionRenderer_h\n#define OVR_CAPI_DistortionRenderer_h\n\n#include \"CAPI_HMDRenderState.h\"\n#include \"CAPI_FrameTimeManager.h\"\n\ntypedef void (*PostDistortionCallback)(void* pRenderContext);\n\nnamespace OVR { namespace CAPI {\n\n//-------------------------------------------------------------------------------------\n// ***** CAPI::DistortionRenderer\n\n// DistortionRenderer implements rendering of distortion and other overlay elements\n// in platform-independent way.\n// Platform-specific renderer back ends for CAPI are derived from this class.\n\nclass  DistortionRenderer : public RefCountBase<DistortionRenderer>\n{\n    // Quiet assignment compiler warning.\n    void operator = (const DistortionRenderer&) { }\npublic:\n    \n    DistortionRenderer(ovrRenderAPIType api, ovrHmd hmd,\n                       FrameTimeManager& timeManager,              \n                       const HMDRenderState& renderState) :\n\t\tLastUsedOverdriveTextureIndex(-1),\n        LatencyTestActive(false),\n        LatencyTest2Active(false),\n        RenderAPI(api),\n        HMD(hmd),\n        TimeManager(timeManager),\n        RState(renderState),\n        GfxState(),\n        RegisteredPostDistortionCallback(NULL)\n    {\n#ifdef OVR_OS_WIN32\n        timer = CreateWaitableTimer(NULL, TRUE, NULL);\n        OVR_ASSERT(timer != NULL);\n#endif\n    }\n    virtual ~DistortionRenderer()\n    {\n    }\n    \n\n    // Configures the Renderer based on externally passed API settings. Must be\n    // called before use.\n    // Under D3D, apiConfig includes D3D Device pointer, back buffer and other\n    // needed structures.\n    virtual bool Initialize(const ovrRenderAPIConfig* apiConfig) = 0;\n\n    // Submits one eye texture for rendering. This is in the separate method to\n    // allow \"submit as you render\" scenarios on horizontal screens where one\n    // eye can be scanned out before the other.\n    virtual void SubmitEye(int eyeId, const ovrTexture* eyeTexture) = 0;\n\n    // Finish the frame, optionally swapping buffers.\n    // Many implementations may actually apply the distortion here.\n    virtual void EndFrame(bool swapBuffers) = 0;\n    \n    void RegisterPostDistortionCallback(PostDistortionCallback postDistortionCallback)\n    {\n        RegisteredPostDistortionCallback = postDistortionCallback;\n    }\n\n\t// Stores the current graphics pipeline state so it can be restored later.\n\tvoid SaveGraphicsState() { if (GfxState && !(RState.DistortionCaps & ovrDistortionCap_NoRestore)) GfxState->Save(); }\n\n\t// Restores the saved graphics pipeline state.\n\tvoid RestoreGraphicsState() { if (GfxState && !(RState.DistortionCaps & ovrDistortionCap_NoRestore)) GfxState->Restore(); }\n\n    // *** Creation Factory logic\n    \n    ovrRenderAPIType GetRenderAPI() const { return RenderAPI; }\n\n    // Creation function for this interface, registered for API.\n    typedef DistortionRenderer* (*CreateFunc)(ovrHmd hmd,\n                                              FrameTimeManager &timeManager,\n                                              const HMDRenderState& renderState);\n\n    static CreateFunc APICreateRegistry[ovrRenderAPI_Count];\n\n    // Color is expected to be 3 byte RGB\n    void SetLatencyTestColor(unsigned char* color);\n    void SetLatencyTest2Color(unsigned char* color);\n    \nprotected:\n\t// Used for pixel luminance overdrive on DK2 displays\n\t// A copy of back buffer images will be ping ponged\n\t// TODO: figure out 0 dynamically based on DK2 latency?\n\tstatic const int\tNumOverdriveTextures = 2;\n\tint\t\t\t\t\tLastUsedOverdriveTextureIndex;\n\n    bool                LatencyTestActive;\n    unsigned char       LatencyTestDrawColor[3];\n    bool                LatencyTest2Active;\n    unsigned char       LatencyTest2DrawColor[3];\n\n    bool IsOverdriveActive()\n\t{\n\t\t// doesn't make sense to use overdrive when vsync is disabled as we cannot guarantee\n\t\t// when the rendered frame will be displayed\n\t\treturn LastUsedOverdriveTextureIndex >= 0 &&\n                !((RState.EnabledHmdCaps & ovrHmdCap_NoVSync) > 0) &&\n                (RState.DistortionCaps & ovrDistortionCap_Chromatic);\n\t}\n\n    void GetOverdriveScales(float& outRiseScale, float& outFallScale);\n\n    double WaitTillTime(double absTime);\n\n#ifdef OVR_OS_WIN32\n    HANDLE timer;\n    LARGE_INTEGER waitableTimerInterval;\n#endif\n\n    class GraphicsState : public RefCountBase<GraphicsState>\n    {\n    public:\n        GraphicsState() : IsValid(false) {}\n        virtual ~GraphicsState() {}\n        virtual void Save() = 0;\n        virtual void Restore() = 0;\n        \n    protected:\n        bool IsValid;\n    };\n    \n    const ovrRenderAPIType  RenderAPI;\n    const ovrHmd            HMD;\n    FrameTimeManager&       TimeManager;\n    const HMDRenderState&   RState;\n    Ptr<GraphicsState>      GfxState;\n    PostDistortionCallback  RegisteredPostDistortionCallback;\n};\n\n}} // namespace OVR::CAPI\n\n\n#endif // OVR_CAPI_DistortionRenderer_h\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/CAPI_FrameTimeManager.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_FrameTimeManager.cpp\nContent     :   Manage frame timing and pose prediction for rendering\nCreated     :   November 30, 2013\nAuthors     :   Volga Aksoy, Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_FrameTimeManager.h\"\n\n#include \"../Kernel/OVR_Log.h\"\n\nnamespace OVR { namespace CAPI {\n\n\n//-------------------------------------------------------------------------------------\n// ***** FrameLatencyTracker\n    \n\nFrameLatencyTracker::FrameLatencyTracker()\n{\n   Reset();\n}\n\n\nvoid FrameLatencyTracker::Reset()\n{\n    TrackerEnabled         = true;\n    WaitMode               = SampleWait_Zeroes;\n    MatchCount             = 0;\n    memset(FrameEndTimes, 0, sizeof(FrameEndTimes));\n    FrameIndex             = 0;\n  //FrameDeltas\n    RenderLatencySeconds   = 0.0;\n    TimewarpLatencySeconds = 0.0;\n    LatencyRecordTime      = 0.0;\n\n    FrameDeltas.Clear();\n}\n\n\nunsigned char FrameLatencyTracker::GetNextDrawColor()\n{   \n    if (!TrackerEnabled || (WaitMode == SampleWait_Zeroes) ||\n        (FrameIndex >= FramesTracked))\n    {        \n        return (unsigned char)Util::FrameTimeRecord::ReadbackIndexToColor(0);\n    }\n\n    OVR_ASSERT(FrameIndex < FramesTracked);    \n    return (unsigned char)Util::FrameTimeRecord::ReadbackIndexToColor(FrameIndex+1);\n}\n\n\nvoid FrameLatencyTracker::SaveDrawColor(unsigned char drawColor, double endFrameTime,\n                                        double renderIMUTime, double timewarpIMUTime )\n{\n    if (!TrackerEnabled || (WaitMode == SampleWait_Zeroes))\n        return;\n\n    if (FrameIndex < FramesTracked)\n    {\n        OVR_ASSERT(Util::FrameTimeRecord::ReadbackIndexToColor(FrameIndex+1) == drawColor);\n        OVR_UNUSED(drawColor);\n\n        // saves {color, endFrame time}\n        FrameEndTimes[FrameIndex].ReadbackIndex         = FrameIndex + 1;\n        FrameEndTimes[FrameIndex].TimeSeconds           = endFrameTime;\n        FrameEndTimes[FrameIndex].RenderIMUTimeSeconds  = renderIMUTime;\n        FrameEndTimes[FrameIndex].TimewarpIMUTimeSeconds= timewarpIMUTime;\n        FrameEndTimes[FrameIndex].MatchedRecord         = false;\n        FrameIndex++;\n    }\n    else\n    {\n        // If the request was outstanding for too long, switch to zero mode to restart.\n        if (endFrameTime > (FrameEndTimes[FrameIndex-1].TimeSeconds + 0.15))\n        {\n            if (MatchCount == 0)\n            {\n                // If nothing was matched, we have no latency reading.\n                RenderLatencySeconds   = 0.0;\n                TimewarpLatencySeconds = 0.0;\n            }\n\n            WaitMode   =  SampleWait_Zeroes;\n            MatchCount = 0;\n            FrameIndex = 0;\n        }\n    }\n}\n\n\nvoid FrameLatencyTracker::MatchRecord(const Util::FrameTimeRecordSet &r)\n{\n    if (!TrackerEnabled)\n        return;\n\n    if (WaitMode == SampleWait_Zeroes)\n    {\n        // Do we have all zeros?\n        if (r.IsAllZeroes())\n        {\n            OVR_ASSERT(FrameIndex == 0);\n            WaitMode = SampleWait_Match;\n            MatchCount = 0;\n        }\n        return;\n    }\n\n    // We are in Match Mode. Wait until all colors are matched or timeout,\n    // at which point we go back to zeros.\n\n    for (int i = 0; i < FrameIndex; i++)\n    {\n        int recordIndex = 0;\n        int consecutiveMatch  = 0;\n\n        OVR_ASSERT(FrameEndTimes[i].ReadbackIndex != 0);\n\n        if (r.FindReadbackIndex(&recordIndex, FrameEndTimes[i].ReadbackIndex))\n        {\n            // Advance forward to see that we have several more matches.\n            int  ri = recordIndex + 1;\n            int  j  = i + 1;\n\n            consecutiveMatch++;\n\n            for (; (j < FrameIndex) && (ri < Util::FrameTimeRecordSet::RecordCount); j++, ri++)\n            {\n                if (r[ri].ReadbackIndex != FrameEndTimes[j].ReadbackIndex)\n                    break;\n                consecutiveMatch++;\n            }\n\n            // Match at least 2 items in the row, to avoid accidentally matching color.\n            if (consecutiveMatch > 1)\n            {\n                // Record latency values for all but last samples. Keep last 2 samples\n                // for the future to simplify matching.\n                for (int q = 0; q < consecutiveMatch; q++)\n                {\n                    const Util::FrameTimeRecord &scanoutFrame = r[recordIndex+q];\n                    FrameTimeRecordEx           &renderFrame  = FrameEndTimes[i+q];\n                    \n                    if (!renderFrame.MatchedRecord)\n                    {\n                        double deltaSeconds = scanoutFrame.TimeSeconds - renderFrame.TimeSeconds;\n                        if (deltaSeconds > 0.0)\n                        {\n                            FrameDeltas.AddTimeDelta(deltaSeconds);\n\n                            // FIRMWARE HACK: don't take new readings if they're 10ms higher than previous reading\n                            // but only do that for 1 second, after that accept it regardless of the timing difference\n                            double newRenderLatency = scanoutFrame.TimeSeconds - renderFrame.RenderIMUTimeSeconds;                            \n                            if( newRenderLatency < RenderLatencySeconds + 0.01 ||\n                                scanoutFrame.TimeSeconds > LatencyRecordTime + 1.0)\n                            {\n                                LatencyRecordTime      = scanoutFrame.TimeSeconds;\n                                RenderLatencySeconds   = scanoutFrame.TimeSeconds - renderFrame.RenderIMUTimeSeconds;\n                                TimewarpLatencySeconds = (renderFrame.TimewarpIMUTimeSeconds == 0.0)  ?  0.0 :\n                                                         (scanoutFrame.TimeSeconds - renderFrame.TimewarpIMUTimeSeconds);\n                            }\n                        }\n\n                        renderFrame.MatchedRecord = true;\n                        MatchCount++;\n                    }\n                }\n\n                // Exit for.\n                break;\n            }\n        }\n    } // for ( i => FrameIndex )\n\n\n    // If we matched all frames, start over.\n    if (MatchCount == FramesTracked)\n    {\n        WaitMode   =  SampleWait_Zeroes;\n        MatchCount = 0;\n        FrameIndex = 0;\n    }\n}\n\nbool FrameLatencyTracker::IsLatencyTimingAvailable()\n{\n    return ovr_GetTimeInSeconds() < (LatencyRecordTime + 2.0);\n}\n\nvoid FrameLatencyTracker::GetLatencyTimings(float& latencyRender, float& latencyTimewarp, float& latencyPostPresent)\n{\n    if (!IsLatencyTimingAvailable())\n    {\n        latencyRender = 0.0f;\n        latencyTimewarp = 0.0f;\n        latencyPostPresent = 0.0f;\n    }\n    else\n    {\n        latencyRender = (float)RenderLatencySeconds;\n        latencyTimewarp = (float)TimewarpLatencySeconds;\n        latencyPostPresent = (float)FrameDeltas.GetMedianTimeDelta();\n    }    \n}\n\n\n//-------------------------------------------------------------------------------------\n// ***** FrameTimeManager\n\nFrameTimeManager::FrameTimeManager(bool vsyncEnabled) :\n    RenderInfo(),\n    FrameTimeDeltas(),\n    DistortionRenderTimes(),\n    ScreenLatencyTracker(),\n    VsyncEnabled(vsyncEnabled),\n    DynamicPrediction(true),\n    SdkRender(false),\n  //DirectToRift(false), Initialized below.\n  //VSyncToScanoutDelay(0.0), Initialized below.\n  //NoVSyncToScanoutDelay(0.0), Initialized below.\n    ScreenSwitchingDelay(0.0),\n    FrameTiming(),\n    LocklessTiming(),\n    RenderIMUTimeSeconds(0.0),\n    TimewarpIMUTimeSeconds(0.0)\n{\n    // If driver is in use,\n    DirectToRift = !Display::InCompatibilityMode(false);\n    if (DirectToRift)\n    {\n        // The latest driver provides a post-present vsync-to-scan-out delay\n        // that is roughly zero.  The latency tester will provide real numbers\n        // but when it is unavailable for some reason, we should default to\n        // an expected value.\n        VSyncToScanoutDelay = 0.0001f;\n    }\n    else\n    {\n        // HACK: SyncToScanoutDelay observed close to 1 frame in video cards.\n        //       Overwritten by dynamic latency measurement on DK2.\n        VSyncToScanoutDelay = 0.013f;\n    }\n    NoVSyncToScanoutDelay = 0.004f;\n}\n\nvoid FrameTimeManager::Init(HmdRenderInfo& renderInfo)\n{\n    // Set up prediction distances.\n    // With-Vsync timings.\n    RenderInfo = renderInfo;\n\n    ScreenSwitchingDelay = RenderInfo.Shutter.PixelSettleTime * 0.5f + \n                           RenderInfo.Shutter.PixelPersistence * 0.5f;\n}\n\nvoid FrameTimeManager::ResetFrameTiming(unsigned frameIndex,\n                                        bool dynamicPrediction,\n                                        bool sdkRender)\n{    \n    DynamicPrediction   = dynamicPrediction;\n    SdkRender           = sdkRender;\n\n    FrameTimeDeltas.Clear();\n    DistortionRenderTimes.Clear();\n    ScreenLatencyTracker.Reset();\n    //Revisit dynamic pre-Timewarp delay adjustment logic\n    //TimewarpAdjuster.Reset();\n\n    FrameTiming.FrameIndex               = frameIndex;\n    FrameTiming.NextFrameTime            = 0.0;\n    FrameTiming.ThisFrameTime            = 0.0;\n    FrameTiming.Inputs.FrameDelta        = calcFrameDelta();\n    // This one is particularly critical, and has been missed in the past because\n    // this init function wasn't called for app-rendered.\n    FrameTiming.Inputs.ScreenDelay       = calcScreenDelay();\n    FrameTiming.Inputs.TimewarpWaitDelta = 0.0f;\n\n    LocklessTiming.SetState(FrameTiming);\n}\n\n\ndouble  FrameTimeManager::calcFrameDelta() const\n{\n    // Timing difference between frame is tracked by FrameTimeDeltas, or\n    // is a hard-coded value of 1/FrameRate.\n    double  frameDelta;    \n\n    if (!VsyncEnabled)\n    {\n        frameDelta = 0.0;\n    }\n    else if (FrameTimeDeltas.GetCount() > 3)\n    {\n        frameDelta = FrameTimeDeltas.GetMedianTimeDelta();\n        if (frameDelta > (RenderInfo.Shutter.VsyncToNextVsync + 0.001))\n            frameDelta = RenderInfo.Shutter.VsyncToNextVsync;\n    }\n    else\n    {\n        frameDelta = RenderInfo.Shutter.VsyncToNextVsync;\n    }\n\n    return frameDelta;\n}\n\n\ndouble  FrameTimeManager::calcScreenDelay() const\n{\n    double  screenDelay = ScreenSwitchingDelay;\n    double  measuredVSyncToScanout;\n\n    // Use real-time DK2 latency tester HW for prediction if its is working.\n    // Do sanity check under 60 ms\n    if (!VsyncEnabled)\n    {\n        screenDelay += NoVSyncToScanoutDelay;\n    }\n    else if ( DynamicPrediction &&\n              (ScreenLatencyTracker.FrameDeltas.GetCount() > 3) &&\n              (measuredVSyncToScanout = ScreenLatencyTracker.FrameDeltas.GetMedianTimeDelta(),\n               (measuredVSyncToScanout > -0.0001) && (measuredVSyncToScanout < 0.06)) ) \n    {\n        screenDelay += measuredVSyncToScanout;\n    }\n    else\n    {\n        screenDelay += VSyncToScanoutDelay;\n    }\n\n    return screenDelay;\n}\n\ndouble FrameTimeManager::calcTimewarpWaitDelta() const\n{\n    // If timewarp timing hasn't been calculated, we should wait.\n    if (!VsyncEnabled)\n        return 0.0;\n\n    if (SdkRender)\n    {\n        if (NeedDistortionTimeMeasurement())\n            return 0.0;\n        return -(DistortionRenderTimes.GetMedianTimeDelta() + 0.0035);\n\n        //Revisit dynamic pre-Timewarp delay adjustment logic\n        /*return -(DistortionRenderTimes.GetMedianTimeDelta() + 0.002 +\n                 TimewarpAdjuster.GetDelayReduction());*/\n    }\n   \n    // Just a hard-coded \"high\" value for game-drawn code.\n    // TBD: Just return 0 and let users calculate this themselves?\n    return -0.004;\n\n    //Revisit dynamic pre-Timewarp delay adjustment logic\n    //return -(0.003 + TimewarpAdjuster.GetDelayReduction());\n}\n\n//Revisit dynamic pre-Timewarp delay adjustment logic\n/*\nvoid FrameTimeManager::updateTimewarpTiming()\n{\n    // If timewarp timing changes based on this sample, update it.\n    double newTimewarpWaitDelta = calcTimewarpWaitDelta();\n    if (newTimewarpWaitDelta != FrameTiming.Inputs.TimewarpWaitDelta)\n    {\n        FrameTiming.Inputs.TimewarpWaitDelta = newTimewarpWaitDelta;\n        LocklessTiming.SetState(FrameTiming);\n    }\n}\n*/\n\nvoid FrameTimeManager::Timing::InitTimingFromInputs(const FrameTimeManager::TimingInputs& inputs,\n                                                    HmdShutterTypeEnum shutterType,\n                                                    double thisFrameTime, unsigned int frameIndex)\n{    \n    // ThisFrameTime comes from the end of last frame, unless it it changed.  \n    double  nextFrameBase;\n    double  frameDelta = inputs.FrameDelta;\n\n    FrameIndex        = frameIndex;\n\n    ThisFrameTime     = thisFrameTime;\n    NextFrameTime     = ThisFrameTime + frameDelta;\n    nextFrameBase     = NextFrameTime + inputs.ScreenDelay;\n    MidpointTime      = nextFrameBase + frameDelta * 0.5;\n    TimewarpPointTime = (inputs.TimewarpWaitDelta == 0.0) ?\n                        0.0 : (NextFrameTime + inputs.TimewarpWaitDelta);\n\n    // Calculate absolute points in time when eye rendering or corresponding time-warp\n    // screen edges will become visible.\n    // This only matters with VSync.\n    switch(shutterType)\n    {            \n    case HmdShutter_RollingTopToBottom:\n        EyeRenderTimes[0]               = MidpointTime;\n        EyeRenderTimes[1]               = MidpointTime;\n        TimeWarpStartEndTimes[0][0]     = nextFrameBase;\n        TimeWarpStartEndTimes[0][1]     = nextFrameBase + frameDelta;\n        TimeWarpStartEndTimes[1][0]     = nextFrameBase;\n        TimeWarpStartEndTimes[1][1]     = nextFrameBase + frameDelta;\n        break;\n    case HmdShutter_RollingLeftToRight:\n        EyeRenderTimes[0]               = nextFrameBase + frameDelta * 0.25;\n        EyeRenderTimes[1]               = nextFrameBase + frameDelta * 0.75;\n\n        /*\n        // TBD: MA: It is probably better if mesh sets it up per-eye.\n        // Would apply if screen is 0 -> 1 for each eye mesh\n        TimeWarpStartEndTimes[0][0]     = nextFrameBase;\n        TimeWarpStartEndTimes[0][1]     = MidpointTime;\n        TimeWarpStartEndTimes[1][0]     = MidpointTime;\n        TimeWarpStartEndTimes[1][1]     = nextFrameBase + frameDelta;\n        */\n\n        // Mesh is set up to vary from Edge of scree 0 -> 1 across both eyes\n        TimeWarpStartEndTimes[0][0]     = nextFrameBase;\n        TimeWarpStartEndTimes[0][1]     = nextFrameBase + frameDelta;\n        TimeWarpStartEndTimes[1][0]     = nextFrameBase;\n        TimeWarpStartEndTimes[1][1]     = nextFrameBase + frameDelta;\n\n        break;\n    case HmdShutter_RollingRightToLeft:\n\n        EyeRenderTimes[0]               = nextFrameBase + frameDelta * 0.75;\n        EyeRenderTimes[1]               = nextFrameBase + frameDelta * 0.25;\n        \n        // This is *Correct* with Tom's distortion mesh organization.\n        TimeWarpStartEndTimes[0][0]     = nextFrameBase ;\n        TimeWarpStartEndTimes[0][1]     = nextFrameBase + frameDelta;\n        TimeWarpStartEndTimes[1][0]     = nextFrameBase ;\n        TimeWarpStartEndTimes[1][1]     = nextFrameBase + frameDelta;\n        break;\n    case HmdShutter_Global:\n        // TBD\n        EyeRenderTimes[0]               = MidpointTime;\n        EyeRenderTimes[1]               = MidpointTime;\n        TimeWarpStartEndTimes[0][0]     = MidpointTime;\n        TimeWarpStartEndTimes[0][1]     = MidpointTime;\n        TimeWarpStartEndTimes[1][0]     = MidpointTime;\n        TimeWarpStartEndTimes[1][1]     = MidpointTime;\n        break;\n    default:\n        break;\n    }\n}\n\n  \ndouble FrameTimeManager::BeginFrame(unsigned frameIndex)\n{    \n    RenderIMUTimeSeconds = 0.0;\n    TimewarpIMUTimeSeconds = 0.0;\n\n    // TPH - putting an assert so this doesn't remain a hidden problem.\n    OVR_ASSERT(FrameTiming.Inputs.ScreenDelay != 0);\n\n    // ThisFrameTime comes from the end of last frame, unless it it changed.\n    double thisFrameTime = (FrameTiming.NextFrameTime != 0.0) ?\n                           FrameTiming.NextFrameTime : ovr_GetTimeInSeconds();\n    \n    // We are starting to process a new frame...\n    FrameTiming.InitTimingFromInputs(FrameTiming.Inputs, RenderInfo.Shutter.Type,\n                                     thisFrameTime, frameIndex);\n\n    return FrameTiming.ThisFrameTime;\n}\n\n\nvoid FrameTimeManager::EndFrame()\n{\n    // Record timing since last frame; must be called after Present & sync.\n    FrameTiming.NextFrameTime = ovr_GetTimeInSeconds();    \n    if (FrameTiming.ThisFrameTime > 0.0)\n    {\n    //Revisit dynamic pre-Timewarp delay adjustment logic\n    /*\n        double actualFrameDelta = FrameTiming.NextFrameTime - FrameTiming.ThisFrameTime;\n\n        if (VsyncEnabled)\n            TimewarpAdjuster.UpdateTimewarpWaitIfSkippedFrames(this, actualFrameDelta,\n                                                               FrameTiming.NextFrameTime);\n\n        FrameTimeDeltas.AddTimeDelta(actualFrameDelta);\n    */\n        FrameTimeDeltas.AddTimeDelta(FrameTiming.NextFrameTime - FrameTiming.ThisFrameTime);\n        FrameTiming.Inputs.FrameDelta = calcFrameDelta();\n    }\n\n    // Write to Lock-less\n    LocklessTiming.SetState(FrameTiming);\n}\n\n// Thread-safe function to query timing for a future frame\n\nFrameTimeManager::Timing FrameTimeManager::GetFrameTiming(unsigned frameIndex)\n{\n    Timing frameTiming = LocklessTiming.GetState();\n\n    if (frameTiming.ThisFrameTime == 0.0)\n    {\n        // If timing hasn't been initialized, starting based on \"now\" is the best guess.\n        frameTiming.InitTimingFromInputs(frameTiming.Inputs, RenderInfo.Shutter.Type,\n                                         ovr_GetTimeInSeconds(), frameIndex);\n    }\n    \n    else if (frameIndex > frameTiming.FrameIndex)\n    {\n        unsigned frameDelta    = frameIndex - frameTiming.FrameIndex;\n        double   thisFrameTime = frameTiming.NextFrameTime +\n                                 double(frameDelta-1) * frameTiming.Inputs.FrameDelta;\n        // Don't run away too far into the future beyond rendering.\n\t\tOVR_DEBUG_LOG_COND(frameDelta >= 6, (\"GetFrameTiming is 6 or more frames in future beyond rendering!\"));\n\n        frameTiming.InitTimingFromInputs(frameTiming.Inputs, RenderInfo.Shutter.Type,\n                                         thisFrameTime, frameIndex);\n    }\n\n    return frameTiming;\n}\n\n\ndouble FrameTimeManager::GetEyePredictionTime(ovrEyeType eye, unsigned int frameIndex)\n{\n    if (VsyncEnabled)\n    {\n        FrameTimeManager::Timing frameTiming = GetFrameTiming(frameIndex);\n\n        // Special case: ovrEye_Count predicts to midpoint\n        return (eye == ovrEye_Count) ? frameTiming.MidpointTime : frameTiming.EyeRenderTimes[eye];\n    }\n\n    // No VSync: Best guess for the near future\n    return ovr_GetTimeInSeconds() + ScreenSwitchingDelay + NoVSyncToScanoutDelay;\n}\n\novrTrackingState FrameTimeManager::GetEyePredictionTracking(ovrHmd hmd, ovrEyeType eye, unsigned int frameIndex)\n{\n    double           eyeRenderTime = GetEyePredictionTime(eye, frameIndex);\n    ovrTrackingState eyeState      = ovrHmd_GetTrackingState(hmd, eyeRenderTime);\n        \n    // Record view pose sampling time for Latency reporting.\n    if (RenderIMUTimeSeconds == 0.0)\n    {\n        // TODO: Figure out why this are not as accurate as ovr_GetTimeInSeconds()\n        //RenderIMUTimeSeconds = eyeState.RawSensorData.TimeInSeconds;\n        RenderIMUTimeSeconds = ovr_GetTimeInSeconds();\n    }\n\n    return eyeState;\n}\n\nPosef FrameTimeManager::GetEyePredictionPose(ovrHmd hmd, ovrEyeType eye)\n{\n    double           eyeRenderTime = GetEyePredictionTime(eye, 0);\n    ovrTrackingState eyeState      = ovrHmd_GetTrackingState(hmd, eyeRenderTime);\n\n    // Record view pose sampling time for Latency reporting.\n    if (RenderIMUTimeSeconds == 0.0)\n    {\n        // TODO: Figure out why this are not as accurate as ovr_GetTimeInSeconds()\n        //RenderIMUTimeSeconds = eyeState.RawSensorData.TimeInSeconds;\n        RenderIMUTimeSeconds = ovr_GetTimeInSeconds();\n    }\n\n    return eyeState.HeadPose.ThePose;\n}\n\nvoid FrameTimeManager::GetTimewarpPredictions(ovrEyeType eye, double timewarpStartEnd[2])\n{\n    if (VsyncEnabled)\n    {\n        timewarpStartEnd[0] = FrameTiming.TimeWarpStartEndTimes[eye][0];\n        timewarpStartEnd[1] = FrameTiming.TimeWarpStartEndTimes[eye][1];\n        return;\n    }    \n\n    // Free-running, so this will be displayed immediately.\n    // Unfortunately we have no idea which bit of the screen is actually going to be displayed.\n    // TODO: guess which bit of the screen is being displayed!\n    // (e.g. use DONOTWAIT on present and see when the return isn't WASSTILLWAITING?)\n\n    // We have no idea where scan-out is currently, so we can't usefully warp the screen spatially.\n    timewarpStartEnd[0] = ovr_GetTimeInSeconds() + ScreenSwitchingDelay + NoVSyncToScanoutDelay;\n    timewarpStartEnd[1] = timewarpStartEnd[0];\n}\n\n\nvoid FrameTimeManager::GetTimewarpMatrices(ovrHmd hmd, ovrEyeType eyeId,\n                                           ovrPosef renderPose, ovrMatrix4f twmOut[2],\n\t\t\t\t\t\t\t\t\t\t   double debugTimingOffsetInSeconds)\n{\n    if (!hmd)\n    {\n        return;\n    }\n\n    double timewarpStartEnd[2] = { 0.0, 0.0 };    \n    GetTimewarpPredictions(eyeId, timewarpStartEnd);\n\n\t//TPH, to vary timing, to allow developers to debug, to shunt the predicted time forward \n\t//and back, and see if the SDK is truly delivering the correct time.  Also to allow\n\t//illustration of the detrimental effects when this is not done right. \n\ttimewarpStartEnd[0] += debugTimingOffsetInSeconds;\n\ttimewarpStartEnd[1] += debugTimingOffsetInSeconds;\n\n      \n    //HMDState* p = (HMDState*)hmd;\n    ovrTrackingState startState = ovrHmd_GetTrackingState(hmd, timewarpStartEnd[0]);\n    ovrTrackingState endState   = ovrHmd_GetTrackingState(hmd, timewarpStartEnd[1]);\n\n    if (TimewarpIMUTimeSeconds == 0.0)\n    {\n        // TODO: Figure out why this are not as accurate as ovr_GetTimeInSeconds()\n        //TimewarpIMUTimeSeconds = startState.RawSensorData.TimeInSeconds;\n        TimewarpIMUTimeSeconds = ovr_GetTimeInSeconds();\n    }\n\n    Quatf quatFromStart = startState.HeadPose.ThePose.Orientation;\n    Quatf quatFromEnd   = endState.HeadPose.ThePose.Orientation;\n    Quatf quatFromEye   = renderPose.Orientation; //EyeRenderPoses[eyeId].Orientation;\n    quatFromEye.Invert();   // because we need the view matrix, not the camera matrix\n    \n    Quatf timewarpStartQuat = quatFromEye * quatFromStart;\n    Quatf timewarpEndQuat   = quatFromEye * quatFromEnd;\n\n    Matrix4f timewarpStart(timewarpStartQuat);\n    Matrix4f timewarpEnd(timewarpEndQuat);\n    \n\n    // The real-world orientations have:                                  X=right, Y=up,   Z=backwards.\n    // The vectors inside the mesh are in NDC to keep the shader simple: X=right, Y=down, Z=forwards.\n    // So we need to perform a similarity transform on this delta matrix.\n    // The verbose code would look like this:\n    /*\n    Matrix4f matBasisChange;\n    matBasisChange.SetIdentity();\n    matBasisChange.M[0][0] =  1.0f;\n    matBasisChange.M[1][1] = -1.0f;\n    matBasisChange.M[2][2] = -1.0f;\n    Matrix4f matBasisChangeInv = matBasisChange.Inverted();\n    matRenderFromNow = matBasisChangeInv * matRenderFromNow * matBasisChange;\n    */\n    // ...but of course all the above is a constant transform and much more easily done.\n    // We flip the signs of the Y&Z row, then flip the signs of the Y&Z column,\n    // and of course most of the flips cancel:\n    // +++                        +--                     +--\n    // +++ -> flip Y&Z columns -> +-- -> flip Y&Z rows -> -++\n    // +++                        +--                     -++\n    timewarpStart.M[0][1] = -timewarpStart.M[0][1];\n    timewarpStart.M[0][2] = -timewarpStart.M[0][2];\n    timewarpStart.M[1][0] = -timewarpStart.M[1][0];\n    timewarpStart.M[2][0] = -timewarpStart.M[2][0];\n\n    timewarpEnd  .M[0][1] = -timewarpEnd  .M[0][1];\n    timewarpEnd  .M[0][2] = -timewarpEnd  .M[0][2];\n    timewarpEnd  .M[1][0] = -timewarpEnd  .M[1][0];\n    timewarpEnd  .M[2][0] = -timewarpEnd  .M[2][0];\n\n    twmOut[0] = timewarpStart;\n    twmOut[1] = timewarpEnd;\n}\n\n\n// Used by renderer to determine if it should time distortion rendering.\nbool  FrameTimeManager::NeedDistortionTimeMeasurement() const\n{\n    if (!VsyncEnabled)\n        return false;\n    return DistortionRenderTimes.GetCount() < DistortionRenderTimes.Capacity;\n}\n\n\nvoid  FrameTimeManager::AddDistortionTimeMeasurement(double distortionTimeSeconds)\n{\n    DistortionRenderTimes.AddTimeDelta(distortionTimeSeconds);\n\n    //Revisit dynamic pre-Timewarp delay adjustment logic\n    //updateTimewarpTiming();\n\n    // If timewarp timing changes based on this sample, update it.\n    double newTimewarpWaitDelta = calcTimewarpWaitDelta();\n    if (newTimewarpWaitDelta != FrameTiming.Inputs.TimewarpWaitDelta)\n    {\n        FrameTiming.Inputs.TimewarpWaitDelta = newTimewarpWaitDelta;\n        LocklessTiming.SetState(FrameTiming);\n    }\n}\n\n\nvoid FrameTimeManager::UpdateFrameLatencyTrackingAfterEndFrame(\n                                    unsigned char frameLatencyTestColor[3],\n                                    const Util::FrameTimeRecordSet& rs)\n{    \n    // FrameTiming.NextFrameTime in this context (after EndFrame) is the end frame time.\n    ScreenLatencyTracker.SaveDrawColor(frameLatencyTestColor[0],\n                                       FrameTiming.NextFrameTime,\n                                       RenderIMUTimeSeconds,\n                                       TimewarpIMUTimeSeconds);\n\n    ScreenLatencyTracker.MatchRecord(rs);\n\n    // If screen delay changed, update timing.\n    double newScreenDelay = calcScreenDelay();\n    if (newScreenDelay != FrameTiming.Inputs.ScreenDelay)\n    {\n        FrameTiming.Inputs.ScreenDelay = newScreenDelay;\n        LocklessTiming.SetState(FrameTiming);\n    }\n}\n\n\n//-----------------------------------------------------------------------------------\n//Revisit dynamic pre-Timewarp delay adjustment logic\n/*\nvoid FrameTimeManager::TimewarpDelayAdjuster::Reset()    \n{\n    State                           = State_WaitingToReduceLevel;\n    DelayLevel                      = 0;\n    InitialFrameCounter             = 0;\n    TimewarpDelayReductionSeconds   = 0.0;\n    DelayLevelFinishTime            = 0.0;\n\n    memset(WaitTimeIndexForLevel, 0, sizeof(WaitTimeIndexForLevel));\n    // If we are at level 0, waits are infinite.\n    WaitTimeIndexForLevel[0] = MaxTimeIndex;\n}\n\n\nvoid FrameTimeManager::TimewarpDelayAdjuster::\n        UpdateTimewarpWaitIfSkippedFrames(FrameTimeManager* manager,\n                                          double measuredFrameDelta, double nextFrameTime)\n{    \n    // Times in seconds\n    const static double delayTimingTiers[7] = { 1.0, 5.0, 15.0, 30.0, 60.0, 120.0, 1000000.0 };\n\n    const double currentFrameDelta = manager->FrameTiming.Inputs.FrameDelta;\n\n\n    // Once we detected frame spike, we skip several frames before testing again.    \n    if (InitialFrameCounter > 0)\n    {\n        InitialFrameCounter --;\n        return;\n    }\n\n    // Skipped frame would usually take 2x longer then regular frame\n    if (measuredFrameDelta > currentFrameDelta * 1.8)\n    {        \n        if (State == State_WaitingToReduceLevel)\n        {\n            // If we got here, escalate the level again. \n            if (DelayLevel < MaxDelayLevel)\n            {\n                DelayLevel++;\n                InitialFrameCounter = 3;\n            }\n        }\n\n        else if (State == State_VerifyingAfterReduce)\n        {\n            // So we went down to this level and tried to wait to see if there was\n            // as skipped frame and there is -> go back up a level and incrment its timing tier\n            if (DelayLevel < MaxDelayLevel)\n            {\n                DelayLevel++;\n                State = State_WaitingToReduceLevel;\n                \n                // For higher level delays reductions, i.e. more then half a frame,\n                // we don't go into the infinite wait tier.\n                int maxTimingTier = MaxTimeIndex;\n                if (DelayLevel > MaxInfiniteTimingLevel)\n                    maxTimingTier--;\n\n                if (WaitTimeIndexForLevel[DelayLevel] < maxTimingTier )\n                    WaitTimeIndexForLevel[DelayLevel]++;\n            }\n        }\n\n        DelayLevelFinishTime          = nextFrameTime +\n                                        delayTimingTiers[WaitTimeIndexForLevel[DelayLevel]];\n        TimewarpDelayReductionSeconds = currentFrameDelta * 0.125 * DelayLevel;\n        manager->updateTimewarpTiming();\n\n    }\n\n    else if (nextFrameTime > DelayLevelFinishTime)\n    {        \n        if (State == State_WaitingToReduceLevel)\n        {\n            if (DelayLevel > 0)\n            {\n                DelayLevel--;\n                State = State_VerifyingAfterReduce;\n                // Always use 1 sec to see if \"down sampling mode\" caused problems\n                DelayLevelFinishTime = nextFrameTime + 1.0f; \n            }\n        }\n        else if (State == State_VerifyingAfterReduce)\n        {\n            // Prior display level successfully reduced,\n            // try to see we we could go down further after wait.\n            WaitTimeIndexForLevel[DelayLevel+1] = 0;            \n            State                               = State_WaitingToReduceLevel;\n            DelayLevelFinishTime                = nextFrameTime +\n                                                  delayTimingTiers[WaitTimeIndexForLevel[DelayLevel]];\n        }\n\n        // TBD: Update TimeWarpTiming\n        TimewarpDelayReductionSeconds = currentFrameDelta * 0.125 * DelayLevel;\n        manager->updateTimewarpTiming();\n    }\n\n\n    //static int oldDelayLevel = 0;\n\n    //if (oldDelayLevel != DelayLevel)\n    //{\n        //OVR_DEBUG_LOG((\"DelayLevel:%d tReduction = %0.5f \", DelayLevel, TimewarpDelayReductionSeconds));\n        //oldDelayLevel = DelayLevel;\n    //}\n    }\n    */\n\n//-----------------------------------------------------------------------------------\n// ***** TimeDeltaCollector\n\nvoid TimeDeltaCollector::AddTimeDelta(double timeSeconds)\n{\n    // avoid adding invalid timing values\n    if(timeSeconds < 0.0f)\n        return;\n\n    if (Count == Capacity)\n    {\n        for(int i=0; i< Count-1; i++)\n            TimeBufferSeconds[i] = TimeBufferSeconds[i+1];\n        Count--;\n    }\n    TimeBufferSeconds[Count++] = timeSeconds;\n\n    ReCalcMedian = true;\n}\n\n// KevinJ: Better median function\ndouble CalculateListMedianRecursive(const double inputList[TimeDeltaCollector::Capacity], int inputListLength, int lessThanSum, int greaterThanSum)\n{\n    double lessThanMedian[TimeDeltaCollector::Capacity], greaterThanMedian[TimeDeltaCollector::Capacity];\n    int lessThanMedianListLength = 0, greaterThanMedianListLength = 0;\n    double median = inputList[0];\n    int i;\n    for (i = 1; i < inputListLength; i++)\n    {\n        // If same value, spread among lists evenly\n        if (inputList[i] < median || ((i & 1) == 0 && inputList[i] == median))\n            lessThanMedian[lessThanMedianListLength++] = inputList[i];\n        else\n            greaterThanMedian[greaterThanMedianListLength++] = inputList[i];\n    }\n    if (lessThanMedianListLength + lessThanSum == greaterThanMedianListLength + greaterThanSum + 1 ||\n        lessThanMedianListLength + lessThanSum == greaterThanMedianListLength + greaterThanSum - 1)\n        return median;\n\n    if (lessThanMedianListLength + lessThanSum < greaterThanMedianListLength + greaterThanSum)\n    {\n        lessThanMedian[lessThanMedianListLength++] = median;\n        return CalculateListMedianRecursive(greaterThanMedian, greaterThanMedianListLength, lessThanMedianListLength + lessThanSum, greaterThanSum);\n    }\n    else\n    {\n        greaterThanMedian[greaterThanMedianListLength++] = median;\n        return CalculateListMedianRecursive(lessThanMedian, lessThanMedianListLength, lessThanSum, greaterThanMedianListLength + greaterThanSum);\n    }\n}\n// KevinJ: Excludes Firmware hack\ndouble TimeDeltaCollector::GetMedianTimeDeltaNoFirmwareHack() const\n{\n    if (ReCalcMedian)\n    {\n        ReCalcMedian = false;\n        Median = CalculateListMedianRecursive(TimeBufferSeconds, Count, 0, 0);\n    }\n    return Median;\n}\ndouble TimeDeltaCollector::GetMedianTimeDelta() const\n{\n    if(ReCalcMedian)\n    {\n        double  SortedList[Capacity];\n        bool    used[Capacity];\n\n        memset(used, 0, sizeof(used));\n        SortedList[0] = 0.0; // In case Count was 0...\n\n        // Probably the slowest way to find median...\n        for (int i=0; i<Count; i++)\n        {\n            double smallestDelta = 1000000.0;\n            int    index = 0;\n\n            for (int j = 0; j < Count; j++)\n            {\n                if (!used[j])\n                {                \n                    if (TimeBufferSeconds[j] < smallestDelta)\n                    {\n                        smallestDelta = TimeBufferSeconds[j];\n                        index = j;\n                    }\n                }\n            }\n\n            // Mark as used\n            used[index]   = true;\n            SortedList[i] = smallestDelta;\n        }\n\n        // FIRMWARE HACK: Don't take the actual median, but err on the low time side\n        Median = SortedList[Count/4];\n        ReCalcMedian = false;\n    }\n\n    return Median;\n}\n      \n\n}} // namespace OVR::CAPI\n\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/CAPI_FrameTimeManager.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_FrameTimeManager.h\nContent     :   Manage frame timing and pose prediction for rendering\nCreated     :   November 30, 2013\nAuthors     :   Volga Aksoy, Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_FrameTimeManager_h\n#define OVR_CAPI_FrameTimeManager_h\n\n#include \"../OVR_CAPI.h\"\n#include \"../Kernel/OVR_Timer.h\"\n#include \"../Kernel/OVR_Math.h\"\n#include \"../Util/Util_Render_Stereo.h\"\n\nnamespace OVR { namespace CAPI {\n\n\n//-------------------------------------------------------------------------------------\n// ***** TimeDeltaCollector\n\n// Helper class to collect median times between frames, so that we know\n// how long to wait. \nstruct TimeDeltaCollector\n{\n    TimeDeltaCollector() : Median(-1.0), Count(0), ReCalcMedian(true) { }\n\n    void    AddTimeDelta(double timeSeconds);\n    void    Clear() { Count = 0; }\n\n    double  GetMedianTimeDelta() const;\n    double  GetMedianTimeDeltaNoFirmwareHack() const;\n\n    double  GetCount() const { return Count; }\n\n    enum { Capacity = 12 };\nprivate:\n    double  TimeBufferSeconds[Capacity];\n    mutable double  Median;\n    int     Count;\n    mutable bool    ReCalcMedian;\n};\n\n\n//-------------------------------------------------------------------------------------\n// ***** FrameLatencyTracker\n\n// FrameLatencyTracker tracks frame Present to display Scan-out timing, as reported by\n// the DK2 internal latency tester pixel read-back. The computed value is used in\n// FrameTimeManager for prediction. View Render and TimeWarp to scan-out latencies are\n// also reported for debugging.\n//\n// The class operates by generating color values from GetNextDrawColor() that must\n// be rendered on the back end and then looking for matching values in FrameTimeRecordSet\n// structure as reported by HW.\n\nclass FrameLatencyTracker\n{\npublic:\n\n    enum { FramesTracked = Util::LT2_IncrementCount-1 };\n\n    FrameLatencyTracker();\n\n    // DrawColor == 0 is special in that it doesn't need saving of timestamp\n    unsigned char GetNextDrawColor();\n\n    void SaveDrawColor(unsigned char drawColor, double endFrameTime,\n                       double renderIMUTime, double timewarpIMUTime );\n\n    void MatchRecord(const Util::FrameTimeRecordSet &r);   \n\n    bool IsLatencyTimingAvailable();\n    void GetLatencyTimings(float& latencyRender, float& latencyTimewarp, float& latencyPostPresent);\n\n    void Reset();\n\npublic:\n\n    struct FrameTimeRecordEx : public Util::FrameTimeRecord\n    {\n        bool    MatchedRecord;\n        double  RenderIMUTimeSeconds;\n        double  TimewarpIMUTimeSeconds;\n    };\n\n    // True if rendering read-back is enabled.\n    bool                  TrackerEnabled;\n\n    enum SampleWaitType {\n        SampleWait_Zeroes, // We are waiting for a record with all zeros.\n        SampleWait_Match   // We are issuing & matching colors.\n    };\n    \n    SampleWaitType        WaitMode;\n    int                   MatchCount;\n    // Records of frame timings that we are trying to measure.\n    FrameTimeRecordEx     FrameEndTimes[FramesTracked];\n    int                   FrameIndex;\n    // Median filter for (ScanoutTimeSeconds - PostPresent frame time)\n    TimeDeltaCollector    FrameDeltas;\n    // Latency reporting results\n    double                RenderLatencySeconds;\n    double                TimewarpLatencySeconds;\n    double                LatencyRecordTime;\n};\n\n\n\n//-------------------------------------------------------------------------------------\n// ***** FrameTimeManager\n\n// FrameTimeManager keeps track of rendered frame timing and handles predictions for\n// orientations and time-warp.\n\nclass FrameTimeManager\n{\npublic:\n    FrameTimeManager(bool vsyncEnabled);\n\n    // Data that affects frame timing computation.\n    struct TimingInputs\n    {\n        // Hard-coded value or dynamic as reported by FrameTimeDeltas.GetMedianTimeDelta().\n        double              FrameDelta;\n        // Screen delay from present to scan-out, as potentially reported by ScreenLatencyTracker.\n        double              ScreenDelay;\n        // Negative value of how many seconds before EndFrame we start timewarp. 0.0 if not used.\n        double              TimewarpWaitDelta;\n        \n        TimingInputs()\n            : FrameDelta(0), ScreenDelay(0), TimewarpWaitDelta(0)\n        { }\n    };\n\n    // Timing values for a specific frame.\n    struct Timing\n    {\n        TimingInputs        Inputs;\n        \n        // Index of a frame that started at ThisFrameTime.\n        unsigned int        FrameIndex;\n        // Predicted absolute times for when this frame will show up on screen.\n        // Generally, all values will be >= NextFrameTime, since that's the time we expect next\n        // vsync to succeed.\n        double              ThisFrameTime;\n        double              TimewarpPointTime;\n        double              NextFrameTime;        \n        double              MidpointTime;\n        double              EyeRenderTimes[2];\n        double              TimeWarpStartEndTimes[2][2];\n\n        Timing()\n        {\n            memset(this, 0, sizeof(Timing));\n        }\n\n        void InitTimingFromInputs(const TimingInputs& inputs, HmdShutterTypeEnum shutterType,\n                                  double thisFrameTime, unsigned int frameIndex);\n    };\n\n   \n    // Called on startup to provided data on HMD timing.\n    void    Init(HmdRenderInfo& renderInfo);\n\n    // Called with each new ConfigureRendering.\n    void    ResetFrameTiming(unsigned frameIndex,\n                             bool dynamicPrediction, bool sdkRender);\n\n    void    SetVsync(bool enabled) { VsyncEnabled = enabled; }\n\n    // BeginFrame returns time of the call\n    // TBD: Should this be a predicted time value instead ?\n    double  BeginFrame(unsigned frameIndex);\n    void    EndFrame();    \n\n    // Thread-safe function to query timing for a future frame\n    Timing  GetFrameTiming(unsigned frameIndex);\n \n    // if eye == ovrEye_Count, timing is for MidpointTime as opposed to any specific eye\n    double           GetEyePredictionTime(ovrEyeType eye, unsigned int frameIndex);\n    ovrTrackingState GetEyePredictionTracking(ovrHmd hmd, ovrEyeType eye, unsigned int frameIndex);\n    Posef            GetEyePredictionPose(ovrHmd hmd, ovrEyeType eye);\n\n    void    GetTimewarpPredictions(ovrEyeType eye, double timewarpStartEnd[2]); \n    void    GetTimewarpMatrices(ovrHmd hmd, ovrEyeType eye, ovrPosef renderPose, ovrMatrix4f twmOut[2],double debugTimingOffsetInSeconds = 0.0);\n\n    // Used by renderer to determine if it should time distortion rendering.\n    bool    NeedDistortionTimeMeasurement() const;\n    void    AddDistortionTimeMeasurement(double distortionTimeSeconds);\n\n    \n    // DK2 Latency test interface\n    \n    // Get next draw color for DK2 latency tester (3-byte RGB)\n    void GetFrameLatencyTestDrawColor(unsigned char outColor[3])\n    {\n        outColor[0] = ScreenLatencyTracker.GetNextDrawColor();\n        outColor[1] = ScreenLatencyTracker.IsLatencyTimingAvailable() ? 255 : 0;\n        outColor[2] = ScreenLatencyTracker.IsLatencyTimingAvailable() ? 0 : 255;\n    }\n\n    // Must be called after EndFrame() to update latency tester timings.\n    // Must pass color reported by NextFrameColor for this frame.\n    void    UpdateFrameLatencyTrackingAfterEndFrame(unsigned char frameLatencyTestColor[3],\n                                                    const Util::FrameTimeRecordSet& rs);\n\n    void    GetLatencyTimings(float& latencyRender, float& latencyTimewarp, float& latencyPostPresent)\n    {\n        return ScreenLatencyTracker.GetLatencyTimings(latencyRender, latencyTimewarp, latencyPostPresent);\n    }\n\n    const Timing& GetFrameTiming() const { return FrameTiming; }\n\nprivate:\n    double  calcFrameDelta() const;\n    double  calcScreenDelay() const;\n    double  calcTimewarpWaitDelta() const;\n\n    //Revisit dynamic pre-Timewarp delay adjustment logic\n    /*\n    void    updateTimewarpTiming();\n\n\n    \n    // TimewarpDelayAdjuster implements a simple state machine that reduces the amount\n    // of time-warp waiting based on skipped frames. \n    struct TimewarpDelayAdjuster\n    {\n        enum StateInLevel\n        {        \n            // We are ok at this level, and will be waiting for some time before trying to reduce.\n            State_WaitingToReduceLevel,  \n            // After decrementing a level, we are verifying that this won't cause skipped frames.\n            State_VerifyingAfterReduce\n       };\n    \n        enum {\n            MaxDelayLevel          = 5,\n            MaxInfiniteTimingLevel = 3,\n            MaxTimeIndex           = 6\n        };\n\n        StateInLevel State;   \n        // Current level. Higher levels means larger delay reduction (smaller overall time-warp delay).\n        int          DelayLevel;\n        // Index for the amount of time we'd wait in this level. If attempt to decrease level fails,\n        // with is incrementing causing the level to become \"sticky\". \n        int          WaitTimeIndexForLevel[MaxTimeIndex + 1];\n        // We skip few frames after each escalation to avoid too rapid of a reduction.\n        int          InitialFrameCounter;\n        // What th currect \"reduction\" currently is.\n        double       TimewarpDelayReductionSeconds;\n        // When we should try changing the level again.\n        double       DelayLevelFinishTime;\n\n    public:\n        TimewarpDelayAdjuster() { Reset(); }\n\n        void    Reset();\n\n        void    UpdateTimewarpWaitIfSkippedFrames(FrameTimeManager* manager,\n                                                  double measuredFrameDelta,\n                                                  double nextFrameTime);\n\n        double  GetDelayReduction() const { return TimewarpDelayReductionSeconds; }\n    };\n    */\n\n    \n    HmdRenderInfo       RenderInfo;\n    // Timings are collected through a median filter, to avoid outliers.\n    TimeDeltaCollector  FrameTimeDeltas;\n    TimeDeltaCollector  DistortionRenderTimes;\n    FrameLatencyTracker ScreenLatencyTracker;\n\n    // Timing changes if we have no Vsync (all prediction is reduced to fixed interval).\n    bool                VsyncEnabled;\n    // Set if we are rendering via the SDK, so DistortionRenderTimes is valid.\n    bool                DynamicPrediction;\n    // Set if SDk is doing the rendering.\n    bool                SdkRender;\n    // Direct to rift.\n    bool                DirectToRift;\n\n    // Total frame delay due to VsyncToFirstScanline, persistence and settle time.\n    // Computed from RenderInfor.Shutter.\n    double              VSyncToScanoutDelay;\n    double              NoVSyncToScanoutDelay;\n    double              ScreenSwitchingDelay;\n\n    //Revisit dynamic pre-Timewarp delay adjustment logic\n    //TimewarpDelayAdjuster  TimewarpAdjuster;\n\n    // Current (or last) frame timing info. Used as a source for LocklessTiming.\n    Timing                  FrameTiming;\n    // TBD: Don't we need NextFrame here as well?\n    LocklessUpdater<Timing, Timing> LocklessTiming;\n\n    // IMU Read timings\n    double              RenderIMUTimeSeconds;\n    double              TimewarpIMUTimeSeconds;\n};\n\n\n}} // namespace OVR::CAPI\n\n#endif // OVR_CAPI_FrameTimeManager_h\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/CAPI_HMDRenderState.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_CAPI_HMDRenderState.cpp\nContent     :   Combines all of the rendering state associated with the HMD\nCreated     :   February 2, 2014\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_HMDRenderState.h\"\n\nnamespace OVR { namespace CAPI {\n\n\n//-------------------------------------------------------------------------------------\n// ***** HMDRenderState\n\novrHmdDesc HMDRenderState::GetDesc() const\n{\n    ovrHmdDesc d;\n    memset(&d, 0, sizeof(d));\n    \n    d.Type = ovrHmd_Other;\n     \n    d.ProductName       = OurHMDInfo.ProductName;    \n    d.Manufacturer      = OurHMDInfo.Manufacturer;\n    d.Resolution.w      = OurHMDInfo.ResolutionInPixels.w;\n    d.Resolution.h      = OurHMDInfo.ResolutionInPixels.h;\n    d.WindowsPos.x      = OurHMDInfo.DesktopX;\n    d.WindowsPos.y      = OurHMDInfo.DesktopY;\n    d.DisplayDeviceName = OurHMDInfo.DisplayDeviceName;\n    d.DisplayId         = OurHMDInfo.DisplayId;\n    d.VendorId          = (short)OurHMDInfo.VendorId;\n    d.ProductId         = (short)OurHMDInfo.ProductId;\n    d.FirmwareMajor     = (short)OurHMDInfo.FirmwareMajor;\n    d.FirmwareMinor     = (short)OurHMDInfo.FirmwareMinor;\n    d.CameraFrustumFarZInMeters  = OurHMDInfo.CameraFrustumFarZInMeters;\n    d.CameraFrustumHFovInRadians = OurHMDInfo.CameraFrustumHFovInRadians;\n    d.CameraFrustumNearZInMeters = OurHMDInfo.CameraFrustumNearZInMeters;\n    d.CameraFrustumVFovInRadians = OurHMDInfo.CameraFrustumVFovInRadians;\n\n    OVR_strcpy(d.SerialNumber, sizeof(d.SerialNumber), OurHMDInfo.PrintedSerial.ToCStr());\n\n    d.HmdCaps           = ovrHmdCap_Present | ovrHmdCap_NoVSync;\n    d.TrackingCaps      = ovrTrackingCap_MagYawCorrection | ovrTrackingCap_Orientation;\n    d.DistortionCaps    = ovrDistortionCap_Chromatic | ovrDistortionCap_TimeWarp |\n                          ovrDistortionCap_Vignette | ovrDistortionCap_SRGB |\n                          ovrDistortionCap_FlipInput | ovrDistortionCap_ProfileNoTimewarpSpinWaits |\n                          ovrDistortionCap_HqDistortion | ovrDistortionCap_LinuxDevFullscreen;\n\n#if defined(OVR_OS_WIN32) || defined(OVR_OS_WIN64)\n    // TODO: this gets enabled for everything, but is only applicable for DX11+\n    d.DistortionCaps   |= ovrDistortionCap_ComputeShader;\n#endif\n\n    if( OurHMDInfo.InCompatibilityMode )\n        d.HmdCaps |= ovrHmdCap_ExtendDesktop;\n\n    if (strstr(OurHMDInfo.ProductName, \"DK1\"))\n    {\n        d.Type = ovrHmd_DK1;        \n    }\n    else if (strstr(OurHMDInfo.ProductName, \"DK2\"))\n    {\n        d.Type        = ovrHmd_DK2;\n        d.HmdCaps    |= ovrHmdCap_LowPersistence | ovrHmdCap_DynamicPrediction;\n        d.TrackingCaps |= ovrTrackingCap_Position;\n\t\td.DistortionCaps |= ovrDistortionCap_Overdrive;\n    }\n        \n    const DistortionRenderDesc& leftDistortion  = Distortion[0];\n    const DistortionRenderDesc& rightDistortion = Distortion[1];\n  \n    // The suggested FOV (assuming eye rotation)\n    d.DefaultEyeFov[0] = CalculateFovFromHmdInfo(StereoEye_Left, leftDistortion, RenderInfo, OVR_DEFAULT_EXTRA_EYE_ROTATION);\n    d.DefaultEyeFov[1] = CalculateFovFromHmdInfo(StereoEye_Right, rightDistortion, RenderInfo, OVR_DEFAULT_EXTRA_EYE_ROTATION);\n\n    // FOV extended across the entire screen\n    d.MaxEyeFov[0] = GetPhysicalScreenFov(StereoEye_Left, leftDistortion);\n    d.MaxEyeFov[1] = GetPhysicalScreenFov(StereoEye_Right, rightDistortion);\n    \n    if (OurHMDInfo.Shutter.Type == HmdShutter_RollingRightToLeft)\n    {\n        d.EyeRenderOrder[0] = ovrEye_Right;\n        d.EyeRenderOrder[1] = ovrEye_Left;\n    }\n    else\n    {\n        d.EyeRenderOrder[0] = ovrEye_Left;\n        d.EyeRenderOrder[1] = ovrEye_Right;\n    }    \n\n    // MA: Taking this out on purpose.\n\t// Important information for those that are required to do their own timing,\n    // because of shortfalls in timing code.\n\t//d.VsyncToNextVsync = OurHMDInfo.Shutter.VsyncToNextVsync;\n\t//d.PixelPersistence = OurHMDInfo.Shutter.PixelPersistence;\n\n    return d;\n}\n\n\novrSizei HMDRenderState::GetFOVTextureSize(int eye, ovrFovPort fov, float pixelsPerDisplayPixel) const\n{\n    OVR_ASSERT((unsigned)eye < 2);\n    StereoEye seye = (eye == ovrEye_Left) ? StereoEye_Left : StereoEye_Right;\n    return CalculateIdealPixelSize(seye, Distortion[eye], fov, pixelsPerDisplayPixel);\n}\n\novrEyeRenderDesc HMDRenderState::CalcRenderDesc(ovrEyeType eyeType, const ovrFovPort& fov) const\n{    \n    const HmdRenderInfo&   hmdri = RenderInfo;\n    StereoEye        eye   = (eyeType == ovrEye_Left) ? StereoEye_Left : StereoEye_Right;\n    ovrEyeRenderDesc e0;\n    \n    e0.Eye                       = eyeType;\n    e0.Fov                       = fov;\n    e0.HmdToEyeViewOffset        = CalculateEyeVirtualCameraOffset(hmdri, eye, false);\n    e0.DistortedViewport         = GetFramebufferViewport(eye, hmdri);\n    e0.PixelsPerTanAngleAtCenter = Distortion[0].PixelsPerTanAngleAtCenter;\n\n    return e0;\n}\n\n}} // namespace OVR::CAPI\n\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/CAPI_HMDRenderState.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_HMDRenderState.h\nContent     :   Combines all of the rendering state associated with the HMD\nCreated     :   February 2, 2014\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_HMDRenderState_h\n#define OVR_CAPI_HMDRenderState_h\n\n#include \"../OVR_CAPI.h\"\n#include \"../Kernel/OVR_Math.h\"\n#include \"../Util/Util_Render_Stereo.h\"\n#include \"../Service/Service_NetSessionCommon.h\"\n\nnamespace OVR { namespace CAPI {\n\nusing namespace OVR::Util::Render;\n\n\n//-------------------------------------------------------------------------------------\n// ***** HMDRenderState\n\n// Combines all of the rendering setup information about one HMD.\n// This structure only ever exists inside HMDState, but this \n// declaration is in a separate file to reduce #include dependencies.\n// All actual lifetime and update control is done by the surrounding HMDState.\nstruct HMDRenderState\n{\n    // Utility query functions.\n    ovrHmdDesc          GetDesc() const;\n    ovrSizei            GetFOVTextureSize(int eye, ovrFovPort fov, float pixelsPerDisplayPixel) const;\n    ovrEyeRenderDesc    CalcRenderDesc(ovrEyeType eyeType, const ovrFovPort& fov) const;\n\n    HMDInfo                 OurHMDInfo;\n\n    HmdRenderInfo           RenderInfo;\n    DistortionRenderDesc    Distortion[2];\n    ovrEyeRenderDesc        EyeRenderDesc[2]; \n\n    // Clear color used for distortion\n    float                   ClearColor[4];\n\n    // Pose at which last time the eye was rendered, as submitted by EndEyeRender.\n    ovrPosef                EyeRenderPoses[2];\n\n    // Capabilities passed to Configure.\n    unsigned                EnabledHmdCaps;\n    unsigned                DistortionCaps;     // enum ovrDistortionCaps\n};\n\n\n}} // namespace OVR::CAPI\n\n#endif // OVR_CAPI_HMDState_h\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/CAPI_HMDState.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_HMDState.cpp\nContent     :   State associated with a single HMD\nCreated     :   January 24, 2014\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_HMDState.h\"\n#include \"../OVR_Profile.h\"\n#include \"../Service/Service_NetClient.h\"\n#ifdef OVR_OS_WIN32\n#include \"../Displays/OVR_Win32_ShimFunctions.h\"\n#endif\n\n\nnamespace OVR { namespace CAPI {\n\n\n// Accessed via HMDState::GetHMDStateList()\nstatic OVR::List<HMDState> hmdStateList; // List of all created HMDStates.\n\n\n//-------------------------------------------------------------------------------------\n// ***** HMDState\n\nHMDState::HMDState(const OVR::Service::HMDNetworkInfo& netInfo,\n\t\t\t\t   const OVR::HMDInfo& hmdInfo,\n\t\t\t\t   Profile* profile,\n\t\t\t\t   Service::NetClient* client) :\n    pProfile(profile),\n    pHmdDesc(0),\n    pWindow(0),\n    pClient(client),\n    NetId(netInfo.NetId),\n    NetInfo(netInfo),\n    OurHMDInfo(hmdInfo),\n    pLastError(NULL),\n    EnabledHmdCaps(0),\n    EnabledServiceHmdCaps(0),\n    SharedStateReader(),\n    TheSensorStateReader(),\n    TheLatencyTestStateReader(),\n    LatencyTestActive(false),\n  //LatencyTestDrawColor(),\n    LatencyTest2Active(false),\n  //LatencyTest2DrawColor(),\n    TimeManager(true),\n    RenderState(),\n    pRenderer(),\n    pHSWDisplay(),\n    LastFrameTimeSeconds(0.),\n    LastGetFrameTimeSeconds(0.),\n  //LastGetStringValue(),\n    RenderingConfigured(false),\n    BeginFrameCalled(false),\n    BeginFrameThreadId(),\n    RenderAPIThreadChecker(),\n    BeginFrameTimingCalled(false)\n{\n    sharedInit(profile);\n    hmdStateList.PushBack(this);\n}\n\n\nHMDState::HMDState(const OVR::HMDInfo& hmdInfo, Profile* profile) :\n    pProfile(profile),\n    pHmdDesc(0),\n    pWindow(0),\n    pClient(0),\n    NetId(InvalidVirtualHmdId),\n    NetInfo(),\n    OurHMDInfo(hmdInfo),\n    pLastError(NULL),\n    EnabledHmdCaps(0),\n    EnabledServiceHmdCaps(0),\n    SharedStateReader(),\n    TheSensorStateReader(),\n    TheLatencyTestStateReader(),\n    LatencyTestActive(false),\n  //LatencyTestDrawColor(),\n    LatencyTest2Active(false),\n  //LatencyTest2DrawColor(),\n    TimeManager(true),\n    RenderState(),\n    pRenderer(),\n    pHSWDisplay(),\n    LastFrameTimeSeconds(0.),\n    LastGetFrameTimeSeconds(0.),\n  //LastGetStringValue(),\n    RenderingConfigured(false),\n    BeginFrameCalled(false),\n    BeginFrameThreadId(),\n    RenderAPIThreadChecker(),\n    BeginFrameTimingCalled(false)\n{\n    sharedInit(profile);\n    hmdStateList.PushBack(this);\n}\n\nHMDState::~HMDState()\n{\n    hmdStateList.Remove(this);\n\n    if (pClient)\n    {\n\t\tpClient->Hmd_Release(NetId);\n\t\tpClient = 0;\n    }\n\n    ConfigureRendering(0,0,0,0);\n\n    if (pHmdDesc)\n    {\n        OVR_FREE(pHmdDesc);\n        pHmdDesc = NULL;\n    }\n}\n\nvoid HMDState::sharedInit(Profile* profile)\n{\n    // TBD: We should probably be looking up the default profile for the given\n    // device type + user if profile == 0.    \n    pLastError = 0;\n\n    RenderState.OurHMDInfo = OurHMDInfo;\n\n    UpdateRenderProfile(profile);\n\n    OVR_ASSERT(!pHmdDesc);\n    pHmdDesc         = (ovrHmdDesc*)OVR_ALLOC(sizeof(ovrHmdDesc));\n    *pHmdDesc        = RenderState.GetDesc();\n    pHmdDesc->Handle = this;\n\n    RenderState.ClearColor[0] = 0.0f;\n    RenderState.ClearColor[1] = 0.0f;\n    RenderState.ClearColor[2] = 0.0f;\n    RenderState.ClearColor[3] = 0.0f;\n\n    RenderState.EnabledHmdCaps = 0;\n\n    TimeManager.Init(RenderState.RenderInfo);\n\n    /*\n    LatencyTestDrawColor[0] = 0;\n    LatencyTestDrawColor[1] = 0;\n    LatencyTestDrawColor[2] = 0;\n    */\n\n    RenderingConfigured = false;\n    BeginFrameCalled   = false;\n    BeginFrameThreadId = 0;\n    BeginFrameTimingCalled = false;\n\n    // Construct the HSWDisplay. We will later reconstruct it with a specific ovrRenderAPI type if the application starts using SDK-based rendering.\n    if(!pHSWDisplay)\n    {\n        pHSWDisplay = *OVR::CAPI::HSWDisplay::Factory(ovrRenderAPI_None, pHmdDesc, RenderState);\n        pHSWDisplay->Enable(pProfile->GetBoolValue(\"HSW\", true));\n    }\n}\n\nstatic Vector3f GetNeckModelFromProfile(Profile* profile)\n{\n    OVR_ASSERT(profile);\n\n    float neckeye[2] = { OVR_DEFAULT_NECK_TO_EYE_HORIZONTAL, OVR_DEFAULT_NECK_TO_EYE_VERTICAL };\n    profile->GetFloatValues(OVR_KEY_NECK_TO_EYE_DISTANCE, neckeye, 2);\n\n    // Make sure these are vaguely sensible values.\n    //OVR_ASSERT((neckeye[0] > 0.05f) && (neckeye[0] < 0.5f));\n    //OVR_ASSERT((neckeye[1] > 0.05f) && (neckeye[1] < 0.5f));\n\n    // Named for clarity\n    float NeckToEyeHorizontal = neckeye[0];\n    float NeckToEyeVertical = neckeye[1];\n\n    // Store the neck model\n    return Vector3f(0.0, NeckToEyeVertical, -NeckToEyeHorizontal);\n}\n\nstatic float GetCenterPupilDepthFromRenderInfo(HmdRenderInfo* hmdRenderInfo)\n{\n    OVR_ASSERT(hmdRenderInfo);\n\n    // Find the distance from the center of the screen to the \"center eye\"\n    // This center eye is used by systems like rendering & audio to represent the player,\n    // and they will handle the offsets needed from there to each actual eye.\n\n    // HACK HACK HACK\n    // We know for DK1 the screen->lens surface distance is roughly 0.049f, and that the faceplate->lens is 0.02357f.\n    // We're going to assume(!!!!) that all HMDs have the same screen->faceplate distance.\n    // Crystal Cove was measured to be roughly 0.025 screen->faceplate which agrees with this assumption.\n    // TODO: do this properly!  Update:  Measured this at 0.02733 with a CC prototype, CES era (PT7), on 2/19/14 -Steve\n    float screenCenterToMidplate = 0.02733f;\n    float centerEyeRelief = hmdRenderInfo->GetEyeCenter().ReliefInMeters;\n    float CenterPupilDepth = screenCenterToMidplate + hmdRenderInfo->LensSurfaceToMidplateInMeters + centerEyeRelief;\n\n    return CenterPupilDepth;\n}\n\nvoid HMDState::UpdateRenderProfile(Profile* profile)\n{\n    // Apply the given profile to generate a render context\n    RenderState.RenderInfo = GenerateHmdRenderInfoFromHmdInfo(RenderState.OurHMDInfo, profile);\n    RenderState.Distortion[0] = CalculateDistortionRenderDesc(StereoEye_Left, RenderState.RenderInfo, 0);\n    RenderState.Distortion[1] = CalculateDistortionRenderDesc(StereoEye_Right, RenderState.RenderInfo, 0);\n\n    if (pClient)\n    {\n        // Center pupil depth\n        float centerPupilDepth = GetCenterPupilDepthFromRenderInfo(&RenderState.RenderInfo);\n        pClient->SetNumberValue(GetNetId(), \"CenterPupilDepth\", centerPupilDepth);\n\n        // Neck model\n        Vector3f neckModel = GetNeckModelFromProfile(profile);\n        double neckModelArray[3] = {\n            neckModel.x,\n            neckModel.y,\n            neckModel.z\n        };\n        pClient->SetNumberValues(GetNetId(), \"NeckModelVector3f\", neckModelArray, 3);\n\n        double camerastate[7];\n        if (profile->GetDoubleValues(OVR_KEY_CAMERA_POSITION, camerastate, 7) == 0)\n        {\n            //there is no value, so we load the default\n            for (int i = 0; i < 7; i++) camerastate[i] = 0;\n            camerastate[3] = 1;//no offset. by default, give the quaternion w component value 1\n        }\n        else\n\n        TheSensorStateReader.setCenteredFromWorld(OVR::Posed::FromArray(camerastate));\n    }\n\n\n}\n\nHMDState* HMDState::CreateHMDState(NetClient* client, const HMDNetworkInfo& netInfo)\n{\n    // HMDState works through a handle to service HMD....\n    HMDInfo hinfo;\n    if (!client->Hmd_GetHmdInfo(netInfo.NetId, &hinfo))\n    {\n        OVR_DEBUG_LOG((\"[HMDState] Unable to get HMD info\"));\n        return NULL;\n    }\n\n#ifdef OVR_OS_WIN32\n    OVR_DEBUG_LOG((\"Setting up display shim\"));\n\n    // Initialize the display shim before reporting the display to the user code\n    // so that this will happen before the D3D display object is created.\n    Win32::DisplayShim::GetInstance().Update(&hinfo.ShimInfo);\n#endif\n\n    Ptr<Profile> pDefaultProfile = *ProfileManager::GetInstance()->GetDefaultUserProfile(&hinfo);\n    OVR_DEBUG_LOG((\"Using profile %s\", pDefaultProfile->GetValue(OVR_KEY_USER)));\n\n    HMDState* hmds = new HMDState(netInfo, hinfo, pDefaultProfile, client);\n\n    if (!hmds->SharedStateReader.Open(netInfo.SharedMemoryName.ToCStr()))\n    {\n        delete hmds;\n        return NULL;\n    }\n\n    hmds->TheSensorStateReader.SetUpdater(hmds->SharedStateReader.Get());\n    hmds->TheLatencyTestStateReader.SetUpdater(hmds->SharedStateReader.Get());\n\n    return hmds;\n}\n\nHMDState* HMDState::CreateHMDState(ovrHmdType hmdType)\n{\n    HmdTypeEnum t = HmdType_None;\n    if (hmdType == ovrHmd_DK1)\n        t = HmdType_DK1;    \n    else if (hmdType == ovrHmd_DK2)\n        t = HmdType_DK2;\n\n    // FIXME: This does not actually grab the right user..\n    Ptr<Profile> pDefaultProfile = *ProfileManager::GetInstance()->GetDefaultProfile(t);\n\n    return new HMDState(CreateDebugHMDInfo(t), pDefaultProfile);\n}\n    \n\nconst OVR::List<HMDState>& HMDState::GetHMDStateList()\n{\n    return hmdStateList;\n}\n\n\n//-------------------------------------------------------------------------------------\n// *** Sensor \n\nbool HMDState::ConfigureTracking(unsigned supportedCaps, unsigned requiredCaps)\n{\n\treturn pClient ? pClient->Hmd_ConfigureTracking(NetId, supportedCaps, requiredCaps) : true;\n}\n\nvoid HMDState::ResetTracking()\n{\n\tif (pClient) pClient->Hmd_ResetTracking(NetId);\n}        \n\n// Re-center the orientation.\nvoid HMDState::RecenterPose()\n{\n    TheSensorStateReader.RecenterPose();\n}\n\n// Returns prediction for time.\novrTrackingState HMDState::PredictedTrackingState(double absTime)\n{    \n\tTracking::TrackingState ss;\n    TheSensorStateReader.GetSensorStateAtTime(absTime, ss);\n\n    // Zero out the status flags\n    if (!pClient || !pClient->IsConnected(false, false))\n    {\n        ss.StatusFlags = 0;\n    }\n\n    return ss;\n}\n\nvoid HMDState::SetEnabledHmdCaps(unsigned hmdCaps)\n{\n    if (OurHMDInfo.HmdType < HmdType_DK2)\n    {\n        // disable low persistence and pentile.\n        hmdCaps &= ~ovrHmdCap_LowPersistence;\n        hmdCaps &= ~ovrHmdCap_DirectPentile;\n\n        // disable dynamic prediction using the internal latency tester\n        hmdCaps &= ~ovrHmdCap_DynamicPrediction;\n    }\n\n    if (OurHMDInfo.HmdType >= HmdType_DK2)\n    {\n        if ((EnabledHmdCaps ^ hmdCaps) & ovrHmdCap_DynamicPrediction)\n        {\n            // DynamicPrediction change\n            TimeManager.ResetFrameTiming(TimeManager.GetFrameTiming().FrameIndex,\n                                         (hmdCaps & ovrHmdCap_DynamicPrediction) ? true : false,\n                                         RenderingConfigured);\n        }\n    }\n\n    // Pentile unsupported on everything right now.\n    hmdCaps &= ~ovrHmdCap_DirectPentile;\n\t\n    if ((EnabledHmdCaps ^ hmdCaps) & ovrHmdCap_NoVSync)\n    {\n        TimeManager.SetVsync((hmdCaps & ovrHmdCap_NoVSync) ? false : true);\n    }\n\n    if ((EnabledHmdCaps ^ hmdCaps) & ovrHmdCap_NoMirrorToWindow)\n    {\n#ifdef OVR_OS_WIN32\n        Win32::DisplayShim::GetInstance().UseMirroring = (hmdCaps & ovrHmdCap_NoMirrorToWindow)  ?\n                                                         false : true;\n        if (pWindow)\n        {   // Force window repaint so that stale mirrored image doesn't persist.\n            ::InvalidateRect((HWND)pWindow, 0, true);\n        }\n#endif\n    }\n\n    // TBD: Should this include be only the rendering flags? Otherwise, bits that failed\n    //      modification in Hmd_SetEnabledCaps may mis-match...\n    EnabledHmdCaps             = hmdCaps & ovrHmdCap_Writable_Mask;\n    RenderState.EnabledHmdCaps = EnabledHmdCaps;\n\n\n    // If any of the modifiable service caps changed, call on the service.\n    unsigned prevServiceCaps = EnabledServiceHmdCaps & ovrHmdCap_Writable_Mask;\n    unsigned newServiceCaps  = hmdCaps & ovrHmdCap_Writable_Mask & ovrHmdCap_Service_Mask;\n\n    if (prevServiceCaps ^ newServiceCaps)\n\t{\n        EnabledServiceHmdCaps = pClient ? pClient->Hmd_SetEnabledCaps(NetId, newServiceCaps)\n                                : newServiceCaps;\n    }\n}\n\n\nunsigned HMDState::SetEnabledHmdCaps()\n{\n\tunsigned serviceCaps = pClient ? pClient->Hmd_GetEnabledCaps(NetId) :\n                                      EnabledServiceHmdCaps;\n    \n    return serviceCaps & ((~ovrHmdCap_Service_Mask) | EnabledHmdCaps);    \n}\n\n\n//-------------------------------------------------------------------------------------\n// ***** Property Access\n\n// FIXME: Remove the EGetBoolValue stuff and do it with a \"Server:\" prefix, so we do not\n// need to keep a white-list of keys.  This is also way cool because it allows us to add\n// new settings keys from outside CAPI that can modify internal server data.\n\nbool HMDState::getBoolValue(const char* propertyName, bool defaultVal)\n{\n    if (NetSessionCommon::IsServiceProperty(NetSessionCommon::EGetBoolValue, propertyName))\n    {\n       return NetClient::GetInstance()->GetBoolValue(GetNetId(), propertyName, defaultVal);\n    }\n    else if (pProfile)\n    {\n        return pProfile->GetBoolValue(propertyName, defaultVal);\n    }\n    return defaultVal;\n}\n\nbool HMDState::setBoolValue(const char* propertyName, bool value)\n{\n\tif (NetSessionCommon::IsServiceProperty(NetSessionCommon::ESetBoolValue, propertyName))\n\t{\n\t\treturn NetClient::GetInstance()->SetBoolValue(GetNetId(), propertyName, value);\n\t}\n\n\treturn false;\n}\n\nint HMDState::getIntValue(const char* propertyName, int defaultVal)\n{\n    if (NetSessionCommon::IsServiceProperty(NetSessionCommon::EGetIntValue, propertyName))\n    {\n        return NetClient::GetInstance()->GetIntValue(GetNetId(), propertyName, defaultVal);\n    }\n    else if (pProfile)\n    {\n        return pProfile->GetIntValue(propertyName, defaultVal);\n    }\n    return defaultVal;\n}\n\nbool HMDState::setIntValue(const char* propertyName, int value)\n{\n\tif (NetSessionCommon::IsServiceProperty(NetSessionCommon::ESetIntValue, propertyName))\n\t{\n\t\treturn NetClient::GetInstance()->SetIntValue(GetNetId(), propertyName, value);\n\t}\n\n\treturn false;\n}\n\nfloat HMDState::getFloatValue(const char* propertyName, float defaultVal)\n{\n    if (OVR_strcmp(propertyName, \"LensSeparation\") == 0)\n    {\n        return OurHMDInfo.LensSeparationInMeters;\n    }\n    else if (OVR_strcmp(propertyName, \"VsyncToNextVsync\") == 0) \n    {\n        return OurHMDInfo.Shutter.VsyncToNextVsync;\n    }\n    else if (OVR_strcmp(propertyName, \"PixelPersistence\") == 0) \n    {\n        return OurHMDInfo.Shutter.PixelPersistence;\n    }\n    else if (NetSessionCommon::IsServiceProperty(NetSessionCommon::EGetNumberValue, propertyName))\n    {\n       return (float)NetClient::GetInstance()->GetNumberValue(GetNetId(), propertyName, defaultVal);\n    }\n    else if (pProfile)\n    {\n        return pProfile->GetFloatValue(propertyName, defaultVal);\n    }\n\n    return defaultVal;\n}\n\nbool HMDState::setFloatValue(const char* propertyName, float value)\n{\n\tif (NetSessionCommon::IsServiceProperty(NetSessionCommon::ESetNumberValue, propertyName))\n\t{\n\t\treturn NetClient::GetInstance()->SetNumberValue(GetNetId(), propertyName, value);\n\t}\n\n\treturn false;\n}\n\nstatic unsigned CopyFloatArrayWithLimit(float dest[], unsigned destSize,\n                                        float source[], unsigned sourceSize)\n{\n    unsigned count = Alg::Min(destSize, sourceSize);\n    for (unsigned i = 0; i < count; i++)\n        dest[i] = source[i];\n    return count;\n}\n\nunsigned HMDState::getFloatArray(const char* propertyName, float values[], unsigned arraySize)\n{\n\tif (arraySize)\n\t{\n\t\tif (OVR_strcmp(propertyName, \"ScreenSize\") == 0)\n\t\t{\n\t\t\tfloat data[2] = { OurHMDInfo.ScreenSizeInMeters.w, OurHMDInfo.ScreenSizeInMeters.h };\n\n            return CopyFloatArrayWithLimit(values, arraySize, data, 2);\n\t\t}\n        else if (OVR_strcmp(propertyName, \"DistortionClearColor\") == 0)\n        {\n            return CopyFloatArrayWithLimit(values, arraySize, RenderState.ClearColor, 4);\n        }\n        else if (OVR_strcmp(propertyName, \"DK2Latency\") == 0)\n        {\n            if (OurHMDInfo.HmdType != HmdType_DK2)\n            {\n                return 0;\n            }\n\n            union {\n                struct X {\n                    float latencyRender, latencyTimewarp, latencyPostPresent;\n                } x;\n                float data[3];\n            } m;\n\n            static_assert(sizeof(m.x)==sizeof(m.data), \"sizeof(struct X) failure\");\n\n            TimeManager.GetLatencyTimings(m.x.latencyRender, m.x.latencyTimewarp, m.x.latencyPostPresent);\n\n            return CopyFloatArrayWithLimit(values, arraySize, m.data, 3);\n        }\n        else if (NetSessionCommon::IsServiceProperty(NetSessionCommon::EGetNumberValues, propertyName))\n        {\n            // Convert floats to doubles\n            double* da = new double[arraySize];\n            for (int i = 0; i < (int)arraySize; ++i)\n            {\n                da[i] = values[i];\n            }\n\n            int count = NetClient::GetInstance()->GetNumberValues(GetNetId(), propertyName, da, (int)arraySize);\n\n            for (int i = 0; i < count; ++i)\n            {\n                values[i] = (float)da[i];\n            }\n\n            delete[] da;\n\n            return count;\n        }\n\t\telse if (pProfile)\n\t\t{        \n\t\t\t// TBD: Not quite right. Should update profile interface, so that\n\t\t\t//      we can return 0 in all conditions if property doesn't exist.\n\t\t\n            return pProfile->GetFloatValues(propertyName, values, arraySize);\n\t\t}\n\t}\n\n\treturn 0;\n}\n\nbool HMDState::setFloatArray(const char* propertyName, float values[], unsigned arraySize)\n{\n    if (!arraySize)\n    {\n        return false;\n    }\n    \n    if (OVR_strcmp(propertyName, \"DistortionClearColor\") == 0)\n    {\n        CopyFloatArrayWithLimit(RenderState.ClearColor, 4, values, arraySize);\n        return true;\n    }\n\n\tif (NetSessionCommon::IsServiceProperty(NetSessionCommon::ESetNumberValues, propertyName))\n\t{\n\t\tdouble* da = new double[arraySize];\n\t\tfor (int i = 0; i < (int)arraySize; ++i)\n\t\t{\n\t\t\tda[i] = values[i];\n\t\t}\n\n\t\tbool result = NetClient::GetInstance()->SetNumberValues(GetNetId(), propertyName, da, arraySize);\n\n\t\tdelete[] da;\n\n\t\treturn result;\n\t}\n\n\treturn false;\n}\n\nconst char* HMDState::getString(const char* propertyName, const char* defaultVal)\n{\n    if (NetSessionCommon::IsServiceProperty(NetSessionCommon::EGetStringValue, propertyName))\n    {\n        return NetClient::GetInstance()->GetStringValue(GetNetId(), propertyName, defaultVal);\n    }\n\n\tif (pProfile)\n\t{\n\t\tLastGetStringValue[0] = 0;\n\t\tif (pProfile->GetValue(propertyName, LastGetStringValue, sizeof(LastGetStringValue)))\n\t\t{\n\t\t\treturn LastGetStringValue;\n\t\t}\n\t}\n\n\treturn defaultVal;\n}\n\nbool HMDState::setString(const char* propertyName, const char* value)\n{\n\tif (NetSessionCommon::IsServiceProperty(NetSessionCommon::ESetStringValue, propertyName))\n\t{\n\t\treturn NetClient::GetInstance()->SetStringValue(GetNetId(), propertyName, value);\n\t}\n\n\treturn false;\n}\n\n\n//-------------------------------------------------------------------------------------\n// *** Latency Test\n\nbool HMDState::ProcessLatencyTest(unsigned char rgbColorOut[3])\n{    \n    return NetClient::GetInstance()->LatencyUtil_ProcessInputs(Timer::GetSeconds(), rgbColorOut);\n}\n\n//-------------------------------------------------------------------------------------\n// *** Rendering\n\nbool HMDState::ConfigureRendering(ovrEyeRenderDesc eyeRenderDescOut[2],\n                                  const ovrFovPort eyeFovIn[2],\n                                  const ovrRenderAPIConfig* apiConfig,                                  \n                                  unsigned distortionCaps)\n{\n    ThreadChecker::Scope checkScope(&RenderAPIThreadChecker, \"ovrHmd_ConfigureRendering\");\n\n    // null -> shut down.\n    if (!apiConfig)\n    {\n        if (pHSWDisplay)\n        {\n            pHSWDisplay->Shutdown();\n            pHSWDisplay.Clear();\n        }\n\n        if (pRenderer)\n            pRenderer.Clear();        \n        RenderingConfigured = false; \n        return true;\n    }\n\n    if (pRenderer &&\n        (apiConfig->Header.API != pRenderer->GetRenderAPI()))\n    {\n        // Shutdown old renderer.\n        if (pHSWDisplay)\n        {\n            pHSWDisplay->Shutdown();\n            pHSWDisplay.Clear();\n        }\n\n        if (pRenderer)\n            pRenderer.Clear();\n    }\n\n\tdistortionCaps = distortionCaps & pHmdDesc->DistortionCaps;\n\n    // Step 1: do basic setup configuration\n    RenderState.EnabledHmdCaps = EnabledHmdCaps;     // This is a copy... Any cleaner way?\n    RenderState.DistortionCaps = distortionCaps;\n    RenderState.EyeRenderDesc[0] = RenderState.CalcRenderDesc(ovrEye_Left,  eyeFovIn[0]);\n    RenderState.EyeRenderDesc[1] = RenderState.CalcRenderDesc(ovrEye_Right, eyeFovIn[1]);\n    eyeRenderDescOut[0] = RenderState.EyeRenderDesc[0];\n    eyeRenderDescOut[1] = RenderState.EyeRenderDesc[1];\n\n    TimeManager.ResetFrameTiming(0,\n                                 (EnabledHmdCaps & ovrHmdCap_DynamicPrediction) ? true : false,\n                                 true);\n\n    LastFrameTimeSeconds = 0.0f;\n\n    // Set RenderingConfigured early to avoid ASSERTs in renderer initialization.\n    RenderingConfigured = true;\n\n    if (!pRenderer)\n    {\n        pRenderer = *DistortionRenderer::APICreateRegistry\n                        [apiConfig->Header.API](pHmdDesc, TimeManager, RenderState);\n    }\n\n    if (!pRenderer ||\n        !pRenderer->Initialize(apiConfig))\n    {\n        RenderingConfigured = false;\n        return false;\n    }    \n\n    // Setup the Health and Safety Warning display system.\n    if(pHSWDisplay && (pHSWDisplay->GetRenderAPIType() != apiConfig->Header.API)) // If we need to reconstruct the HSWDisplay for a different graphics API type, delete the existing display.\n    {\n        pHSWDisplay->Shutdown();\n        pHSWDisplay.Clear();\n    }\n\n    if(!pHSWDisplay) // Use * below because that for of operator= causes it to inherit the refcount the factory gave the object.\n    {\n        pHSWDisplay = *OVR::CAPI::HSWDisplay::Factory(apiConfig->Header.API, pHmdDesc, RenderState);\n        pHSWDisplay->Enable(pProfile->GetBoolValue(\"HSW\", true));\n    }\n\n    if (pHSWDisplay)\n        pHSWDisplay->Initialize(apiConfig); // This is potentially re-initializing it with a new config.\n\n    return true;\n}\n\n\nvoid  HMDState::SubmitEyeTextures(const ovrPosef renderPose[2],\n                                  const ovrTexture eyeTexture[2])\n{\n    RenderState.EyeRenderPoses[0] = renderPose[0];\n    RenderState.EyeRenderPoses[1] = renderPose[1];\n\n    if (pRenderer)\n    {\n        pRenderer->SubmitEye(0, &eyeTexture[0]);\n        pRenderer->SubmitEye(1, &eyeTexture[1]);\n    }\n}\n\n\n// I appreciate this is not an idea place for this function, but it didn't seem to be\n// being linked properly when in OVR_CAPI.cpp. \n// Please relocate if you know of a better place\novrBool ovrHmd_CreateDistortionMeshInternal( ovrHmdStruct *  hmd,\n                                             ovrEyeType eyeType, ovrFovPort fov,\n                                             unsigned int distortionCaps,\n                                             ovrDistortionMesh *meshData,\n\t\t\t\t\t\t\t\t\t\t\t float overrideEyeReliefIfNonZero )\n{\n    if (!meshData)\n        return 0;\n    HMDState* hmds = (HMDState*)hmd;\n\n    // Not used now, but Chromatic flag or others could possibly be checked for in the future.\n    OVR_UNUSED1(distortionCaps); \n   \n#if defined (OVR_CC_MSVC)\n    static_assert(sizeof(DistortionMeshVertexData) == sizeof(ovrDistortionVertex), \"DistortionMeshVertexData size mismatch\");\n#endif\n\t\n    // *** Calculate a part of \"StereoParams\" needed for mesh generation\n\n    // Note that mesh distortion generation is invariant of RenderTarget UVs, allowing\n    // render target size and location to be changed after the fact dynamically. \n    // eyeToSourceUV is computed here for convenience, so that users don't need\n    // to call ovrHmd_GetRenderScaleAndOffset unless changing RT dynamically.\n\n    const HmdRenderInfo&  hmdri          = hmds->RenderState.RenderInfo;    \n    StereoEye             stereoEye      = (eyeType == ovrEye_Left) ? StereoEye_Left : StereoEye_Right;\n\n    DistortionRenderDesc& distortion = hmds->RenderState.Distortion[eyeType];\n\tif (overrideEyeReliefIfNonZero)\n\t{\n\t\tdistortion.Lens = GenerateLensConfigFromEyeRelief(overrideEyeReliefIfNonZero,hmdri);\n\t}\n\n    // Find the mapping from TanAngle space to target NDC space.\n    ScaleAndOffset2D      eyeToSourceNDC = CreateNDCScaleAndOffsetFromFov(fov);\n\n    int triangleCount = 0;\n    int vertexCount = 0;\n\n    DistortionMeshCreate((DistortionMeshVertexData**)&meshData->pVertexData,\n                         (uint16_t**)&meshData->pIndexData,\n                          &vertexCount, &triangleCount,\n                          (stereoEye == StereoEye_Right),\n                          hmdri, distortion, eyeToSourceNDC);\n\n    if (meshData->pVertexData)\n    {\n        // Convert to index\n        meshData->IndexCount = triangleCount * 3;\n        meshData->VertexCount = vertexCount;\n        return 1;\n    }\n\n    return 0;\n}\n\n\n\n}} // namespace OVR::CAPI\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/CAPI_HMDState.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_HMDState.h\nContent     :   State associated with a single HMD\nCreated     :   January 24, 2014\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_HMDState_h\n#define OVR_CAPI_HMDState_h\n\n#include \"../Kernel/OVR_Math.h\"\n#include \"../Kernel/OVR_List.h\"\n#include \"../Kernel/OVR_Log.h\"\n#include \"../OVR_CAPI.h\"\n\n#include \"CAPI_FrameTimeManager.h\"\n#include \"CAPI_LatencyStatistics.h\"\n#include \"CAPI_HMDRenderState.h\"\n#include \"CAPI_DistortionRenderer.h\"\n#include \"CAPI_HSWDisplay.h\"\n\n#include \"../Service/Service_NetClient.h\"\n#include \"../Net/OVR_NetworkTypes.h\"\n#include \"../Util/Util_LatencyTest2Reader.h\"\n\nstruct ovrHmdStruct { };\n\nnamespace OVR { namespace CAPI {\n\n\nusing namespace OVR::Util::Render;\nusing namespace OVR::Service;\nusing namespace OVR::Net;\n\n\n//-------------------------------------------------------------------------------------\n// ***** ThreadChecker\n\n// This helper class is used to verify that the API is used according to supported\n// thread safety constraints (is not re-entrant for this and related functions).\nclass ThreadChecker\n{\npublic:\n\n#ifndef OVR_BUILD_DEBUG\n\n    // In release build, thread checks are disabled.\n    ThreadChecker() { }\n    void Begin(const char* functionName)    { OVR_UNUSED1(functionName); }\n    void End()                              {  }\n\n    // Add thread-re-entrancy check for function scope\n    struct Scope\n    {\n        Scope(ThreadChecker*, const char *) { }\n        ~Scope() { }\n    };\n\n\n#else // OVR_BUILD_DEBUG\n    ThreadChecker() : pFunctionName(0), FirstThread(0)\n    { }\n\n    void Begin(const char* functionName)\n    {        \n        if (!pFunctionName)\n        {\n            pFunctionName = functionName;\n            FirstThread   = GetCurrentThreadId();\n        }\n        else\n        {\n            // pFunctionName may be not null here if function is called internally on the same thread.\n            OVR_ASSERT_LOG((FirstThread == GetCurrentThreadId()),\n                (\"%s (threadId=%p) called at the same times as %s (threadId=%p)\\n\",\n                functionName, GetCurrentThreadId(), pFunctionName, FirstThread) );\n        }        \n    }\n    void End()\n    {\n        pFunctionName = 0;\n        FirstThread   = 0;\n    }\n\n    // Add thread-reentrancy check for function scope.\n    struct Scope\n    {\n        Scope(ThreadChecker* threadChecker, const char *functionName) : pChecker(threadChecker)\n        { pChecker->Begin(functionName); }\n        ~Scope()\n        { pChecker->End(); }\n    private:\n        ThreadChecker* pChecker;\n    };\n\nprivate:\n    // If not 0, contains the name of the function that first entered the scope.\n    const char * pFunctionName;\n    ThreadId     FirstThread;\n\n#endif // OVR_BUILD_DEBUG\n};\n\n\n//-------------------------------------------------------------------------------------\n// ***** HMDState\n\n// Describes a single HMD.\nclass HMDState : public ListNode<HMDState>,\n                 public ovrHmdStruct, public NewOverrideBase \n{\n    void operator=(const HMDState&) { } // Quiet warning.\n\nprotected:   \n\tHMDState(const OVR::Service::HMDNetworkInfo& netInfo,\n\t\t\t const OVR::HMDInfo& hmdInfo,\n\t\t\t Profile* profile,\n\t\t\t Service::NetClient* client);\n    HMDState(const HMDInfo& src, Profile* profile);\n\npublic:   \n    virtual ~HMDState();\n\n    static HMDState* CreateHMDState(Service::NetClient* client, const HMDNetworkInfo& netInfo);\n    static HMDState* CreateHMDState(ovrHmdType hmdType); // Used for debug mode\n    static const OVR::List<HMDState>& GetHMDStateList();\n\n    // *** Sensor Setup\n\n    bool            ConfigureTracking(unsigned supportedCaps, unsigned requiredCaps);    \n    void            ResetTracking();\n\tvoid\t\t\tRecenterPose();\n    ovrTrackingState PredictedTrackingState(double absTime);\n\n    // Changes HMD Caps.\n    // Capability bits that are not directly or logically tied to one system (such as sensor)\n    // are grouped here. ovrHmdCap_VSync, for example, affects rendering and timing.\n    void            SetEnabledHmdCaps(unsigned caps);\n    unsigned        SetEnabledHmdCaps();\n\n    bool            ProcessLatencyTest(unsigned char rgbColorOut[3]);\n\n    // *** Rendering Setup\n    bool        ConfigureRendering(ovrEyeRenderDesc eyeRenderDescOut[2],\n                                   const ovrFovPort eyeFovIn[2],\n                                   const ovrRenderAPIConfig* apiConfig,                                  \n                                   unsigned distortionCaps);  \n    \n    void        UpdateRenderProfile(Profile* profile);\n\n\n    void        SubmitEyeTextures(const ovrPosef renderPose[2],\n                                  const ovrTexture eyeTexture[2]);\n\n\n    void sharedInit ( Profile *profile );\n\n    void applyProfileToSensorFusion();\n\n    // INlines so that they can be easily compiled out.    \n    // Does debug ASSERT checks for functions that require BeginFrame.\n    // Also verifies that we are on the right thread.\n    void checkBeginFrameScope(const char* functionName)\n    {\n        OVR_UNUSED1(functionName); // for Release build.\n        OVR_ASSERT_LOG(BeginFrameCalled == true,\n                       (\"%s called outside ovrHmd_BeginFrame.\", functionName));\n\t\tOVR_DEBUG_LOG_COND(BeginFrameThreadId != OVR::GetCurrentThreadId(),\n                       (\"%s called on a different thread then ovrHmd_BeginFrame.\", functionName));\n    }\n\n    void checkRenderingConfigured(const char* functionName)\n    {\n        OVR_UNUSED1(functionName); // for Release build.\n        OVR_ASSERT_LOG(RenderingConfigured == true,\n                       (\"%s called without ovrHmd_ConfigureRendering.\", functionName));\n    }\n\n    void checkBeginFrameTimingScope(const char* functionName)\n    {\n        OVR_UNUSED1(functionName); // for Release build.\n        OVR_ASSERT_LOG(BeginFrameTimingCalled == true,\n                       (\"%s called outside ovrHmd_BeginFrameTiming.\", functionName));\n    }\n\n\t// Get properties by name.\n    bool     getBoolValue(const char* propertyName, bool defaultVal);\n    bool     setBoolValue(const char* propertyName, bool value);\n    int      getIntValue(const char* propertyName, int defaultVal);\n    bool     setIntValue(const char* propertyName, int value);\n    float    getFloatValue(const char* propertyName, float defaultVal);\n    bool     setFloatValue(const char* propertyName, float value);\n\tunsigned getFloatArray(const char* propertyName, float values[], unsigned arraySize);\n    bool     setFloatArray(const char* propertyName, float values[], unsigned arraySize);\n    const char* getString(const char* propertyName, const char* defaultVal);\n    bool        setString(const char* propertyName, const char* value);\n\n\tVirtualHmdId GetNetId() { return NetId; }\n\npublic:\n\tPtr<Profile>            pProfile;\n    // Descriptor that gets allocated and returned to the user as ovrHmd.\n    ovrHmdDesc*             pHmdDesc;\n    // Window handle passed in AttachWindow.\n    void*                   pWindow;\n\n\t// Network\n\tService::NetClient*     pClient;\n\tVirtualHmdId            NetId;\n\tHMDNetworkInfo          NetInfo;\n\n    // HMDInfo shouldn't change, as its string pointers are passed out.    \n    HMDInfo                 OurHMDInfo;\n\n    const char*             pLastError;\n\n    // Caps enabled for the HMD.\n    unsigned                EnabledHmdCaps;\n    \n    // Caps actually sent to the Sensor Service\n    unsigned                EnabledServiceHmdCaps;\n    \n    // These are the flags actually applied to the Sensor device,\n    // used to track whether SetDisplayReport calls are necessary.\n    //unsigned                HmdCapsAppliedToSensor;\n    \n    // *** Sensor\n    Tracking::CombinedSharedStateReader SharedStateReader;\n    Tracking::SensorStateReader         TheSensorStateReader;\n    Util::RecordStateReader             TheLatencyTestStateReader;\n\n    bool                    LatencyTestActive;\n    unsigned char           LatencyTestDrawColor[3];\n\n    bool                    LatencyTest2Active;\n    unsigned char           LatencyTest2DrawColor[3];\n\n    // Rendering part\n    FrameTimeManager        TimeManager;\n    LagStatsCalculator      LagStats;\n    LatencyStatisticsCSV    LagStatsCSV;\n    HMDRenderState          RenderState;\n    Ptr<DistortionRenderer> pRenderer;\n\n    // Health and Safety Warning display.\n    Ptr<HSWDisplay>         pHSWDisplay;\n\n    // Last timing value reported by BeginFrame.\n    double                  LastFrameTimeSeconds;    \n    // Last timing value reported by GetFrameTime. These are separate since the intended\n    // use is from different threads. TBD: Move to FrameTimeManager? Make atomic?\n    double                  LastGetFrameTimeSeconds;\n\n    // Last cached value returned by ovrHmd_GetString/ovrHmd_GetStringArray.\n    char                    LastGetStringValue[256];\n   \n    // Debug flag set after ovrHmd_ConfigureRendering succeeds.\n    bool                    RenderingConfigured;\n    // Set after BeginFrame succeeds, and its corresponding thread id for debug checks.\n    bool                    BeginFrameCalled;\n    ThreadId                BeginFrameThreadId;    \n    // Graphics functions are not re-entrant from other threads.\n    ThreadChecker           RenderAPIThreadChecker;\n    // \n    bool                    BeginFrameTimingCalled;\n};\n\n\n\n\n//I appreciate this isn't an idea place for this function prototype, but needed\n//to be seen by OVR_CAPI.cpp and the various SDK renderers of CAPI,\n//and have everything defined.  Please move to a better place if you know of one.\novrBool ovrHmd_CreateDistortionMeshInternal( ovrHmdStruct *  hmd,\n                                             ovrEyeType eyeType, ovrFovPort fov,\n                                             unsigned int distortionCaps,\n                                             ovrDistortionMesh *meshData,\n\t\t\t\t\t\t\t\t\t\t\t float overrideEyeReliefIfNonZero=0 );\n\n\n\n\n}} // namespace OVR::CAPI\n\n#endif // OVR_CAPI_HMDState_h\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/CAPI_HSWDisplay.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_HSWDisplay.cpp\nContent     :   Implements Health and Safety Warning system.\nCreated     :   July 3, 2014\nAuthors     :   Paul Pedriana\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_HSWDisplay.h\"\n#include \"CAPI_HMDState.h\"\n#include \"../Kernel/OVR_Log.h\"\n#include \"../Kernel/OVR_String.h\"\n#include \"Textures/healthAndSafety.tga.h\" // TGA file as a C array declaration.\n#include <stdlib.h>\n\n//-------------------------------------------------------------------------------------\n// ***** HSWDISPLAY_DEBUGGING\n//\n// Defined as 0 or 1. Enables debugging features of this module.\n\n#if !defined(HSWDISPLAY_DEBUGGING)\n    #if defined(AUTHOR_PPEDRIANA)\n        #define HSWDISPLAY_DEBUGGING 1\n    #else\n        #define HSWDISPLAY_DEBUGGING 0\n    #endif\n#endif\n\n#if HSWDISPLAY_DEBUGGING\n    OVR_DISABLE_ALL_MSVC_WARNINGS()\n    #include <winsock2.h>\n    #include <Windows.h>\n    OVR_RESTORE_ALL_MSVC_WARNINGS()\n#endif\n\nOVR_DISABLE_MSVC_WARNING(4996) // \"This function or variable may be unsafe...\"\n\n\n//-------------------------------------------------------------------------------------\n// ***** HSWDISPLAY_DEFAULT_ENABLED\n//\n// Defined as 0 or 1. 1 is default. If 0 then by default HSWDisplay is disabled.\n// Developers can set it to 0 to disable HSW display.\n//\n#if !defined(HSWDISPLAY_DEFAULT_ENABLED)\n    #define HSWDISPLAY_DEFAULT_ENABLED 1\n#endif\n\n\n\n//-------------------------------------------------------------------------------------\n// ***** Experimental C API functions\n//\n\nextern \"C\"\n{\n    OVR_EXPORT void ovrhmd_EnableHSWDisplaySDKRender(ovrHmd hmd, ovrBool enabled)\n    {\n        OVR::CAPI::HMDState* pHMDState = (OVR::CAPI::HMDState*)hmd->Handle;\n\n\t    if (pHMDState)\n\t    {\n            OVR::CAPI::HSWDisplay* pHSWDisplay = pHMDState->pHSWDisplay;\n\n            if(pHSWDisplay)\n                pHSWDisplay->EnableRender((enabled == 0) ? false : true);\n        }\n    }\n}\n\n\n\n\n//-------------------------------------------------------------------------------------\n// ***** HSWDisplay implementation\n//\n\nnamespace OVR { namespace CAPI {\n\n\nstatic const time_t HSWDisplayTimeNever = (time_t)0; // Constant which denotes the time of \"never\", as in the display has never been shown yet.\n\n#define HSWDISPLAY_POLL_INTERVAL            0.400 // Seconds between polling for whether the display should be shown.\n#define OVR_KEY_HSWDISPLAYLASTDISPLAYEDTIME \"HASWLastDisplayedTime\"\n\n\n#if defined(OVR_BUILD_DEBUG)\n    #define HSWDISPLAY_FIRST_DISMISSAL_TIME    4     // Earliest time in seconds until the user can dismiss the display.\n    #define HSWDISPLAY_REGULAR_DISMISSAL_TIME  2\n#else\n    #define HSWDISPLAY_FIRST_DISMISSAL_TIME   15\n    #define HSWDISPLAY_REGULAR_DISMISSAL_TIME  6\n#endif\n\n\nHSWDisplay::HSWDisplay(ovrRenderAPIType renderAPIType, ovrHmd hmd, const HMDRenderState& hmdRenderState)\n  : Enabled(HSWDISPLAY_DEFAULT_ENABLED ? true : false),\n    Displayed(false),\n    SDKRendered(false),\n    DismissRequested(false),\n    RenderEnabled(true),\n    UnloadGraphicsRequested(false),\n    StartTime(0.0),\n    DismissibleTime(0.0),\n    LastPollTime(0.0),\n    HMD(hmd), \n    HMDMounted(false),\n    HMDNewlyMounted(false),\n    RenderAPIType(renderAPIType), \n    RenderState(hmdRenderState),\n    LastProfileName(),\n    LastHSWTime(0)\n{\n}\n\n\nHSWDisplay::~HSWDisplay()\n{\n    // To consider: assert that we are already shut down.\n    HSWDisplay::Shutdown();\n}\n\n\nvoid HSWDisplay::Enable(bool enable)\n{\n    Enabled = enable;\n\n    if(!enable && Displayed) // If it's visible but should not be...\n        Dismiss();\n}\n\n\nvoid HSWDisplay::EnableRender(bool enable)\n{\n    RenderEnabled = enable;\n}\n\n\nvoid HSWDisplay::Display()\n{\n    HSWDISPLAY_LOG((\"[HSWDisplay] Display()\"));\n\n    DisplayInternal();\n\n    HMDNewlyMounted = false;\n    Displayed = true;\n    SDKRendered = RenderEnabled;\n    StartTime = ovr_GetTimeInSeconds();\n\n    const time_t lastDisplayedTime = HSWDisplay::GetCurrentProfileLastHSWTime();\n    DismissibleTime = StartTime + ((lastDisplayedTime == HSWDisplayTimeNever) ? HSWDISPLAY_FIRST_DISMISSAL_TIME : HSWDISPLAY_REGULAR_DISMISSAL_TIME);\n\n    SetCurrentProfileLastHSWTime(time(NULL));\n}\n\n\nbool HSWDisplay::IsDisplayViewable() const\n{\n    // This function is called IsDisplayViewable, but currently it refers only to whether the \n    // HMD is mounted on the user's head.\n\n    return HMDMounted;\n}\n\n\nbool HSWDisplay::Dismiss()\n{\n    #if HSWDISPLAY_DEBUGGING && defined(OVR_OS_WIN32)\n        if(GetKeyState(VK_SCROLL) & 0x0001) // If the scroll lock key is toggled on...\n            return false;                   // Make it so that the display doesn't dismiss, so we can debug this.\n    #endif\n\n    // If dismissal is not requested yet, mark it as such.\n    bool newlyRequested = false;\n\n    if(!DismissRequested)\n    {\n        DismissRequested = true;\n        newlyRequested = true;\n    }\n\n    // If displayed and time has elapsed, do the dismissal.\n    OVR_ASSERT(DismissibleTime <= (ovr_GetTimeInSeconds() + HSWDISPLAY_FIRST_DISMISSAL_TIME)); // Make sure the dismissal time is sane.\n    if (Displayed && (ovr_GetTimeInSeconds() >= DismissibleTime))\n    {\n        DismissInternal();\n        Displayed = false;\n        DismissRequested = false;\n        SDKRendered = false;\n        return true;\n    }\n\n    if(newlyRequested)\n        { HSWDISPLAY_LOG((\"[HSWDisplay] Dismiss(): Not permitted yet. Queued for timeout in %.1f seconds.\", DismissibleTime - ovr_GetTimeInSeconds())); }\n\n    return false; // Cannot dismiss yet.\n}\n\n\nbool HSWDisplay::TickState(ovrHSWDisplayState *hswDisplayState, bool graphicsContext)\n{\n    bool newlyDisplayed = false;\n    const double currentTime = ovr_GetTimeInSeconds();\n\n    // See if we need to be currently displayed. By design we automatically display but don't automatically dismiss.\n    if (Displayed)\n    {\n        if (DismissRequested) // If dismiss was previously requested, see if it can be executed.\n            Dismiss();\n\n        if (Displayed) // If not already dismissed above...\n        {\n            // We currently have the debug behavior that we permit dismiss very soon after launch.\n            #if defined(OVR_BUILD_DEBUG)\n                if(currentTime >= (StartTime + 2))\n                {\n                    DismissibleTime = StartTime;\n                    //Dismiss();\n                }\n            #endif\n        }\n\n        if (Displayed) // If not already dismissed above...\n        {\n            const ovrTrackingState ts = ((OVR::CAPI::HMDState*)HMD->Handle)->PredictedTrackingState(currentTime);\n\n            if (ts.StatusFlags & ovrStatus_OrientationTracked) // If the Accelerometer data is valid...\n            {\n\t\t\t\tconst OVR::Vector3f v(ts.HeadPose.LinearAcceleration.x, ts.HeadPose.LinearAcceleration.y, ts.HeadPose.LinearAcceleration.z);\n\n                const float minTapMagnitude = 350.0f; // Empirically determined by some testing.\n\n                if (v.LengthSq() > minTapMagnitude)\n                    Dismiss(); // This will do nothing if the display is not present.\n            }\n        }\n    }\n    else if (Enabled && (currentTime >= (LastPollTime + HSWDISPLAY_POLL_INTERVAL)))\n    {\n        LastPollTime = currentTime;\n\n        // We need to display if any of the following are true:\n        //     - The application is just started in Event Mode while the HMD is mounted (warning display would be viewable) and this app was not spawned from a launcher.\n        //     - The current user has never seen the display yet while the HMD is mounted (warning display would be viewable).\n        //     - The HMD is newly mounted (or the warning display is otherwise newly viewable).\n        //     - The warning display hasn't shown in 24 hours (need to verify this as a requirement).\n        // Event Mode refers to when the app is being run in a public demo event such as a trade show.\n\n        OVR::CAPI::HMDState* pHMDState = (OVR::CAPI::HMDState*)HMD->Handle;\n\n        if(pHMDState)\n        {\n            const time_t lastDisplayedTime = HSWDisplay::GetCurrentProfileLastHSWTime();\n\n            // We currently unilaterally set HMDMounted to true because we don't yet have the ability to detect this. To do: Implement this when possible.\n            const bool previouslyMounted = HMDMounted;\n            HMDMounted = true;\n            HMDNewlyMounted = (!previouslyMounted && HMDMounted); // We set this back to false in the Display function or if the HMD is unmounted before then.\n\n            if((lastDisplayedTime == HSWDisplayTimeNever) || HMDNewlyMounted)\n            {\n                if(IsDisplayViewable()) // If the HMD is mounted and otherwise being viewed by the user...\n                {\n                    Display();\n                    newlyDisplayed = true;\n                }\n            }\n        }\n    }\n    else if(graphicsContext && UnloadGraphicsRequested)\n    {\n        UnloadGraphics();\n        UnloadGraphicsRequested = false;\n    }\n\n    if(hswDisplayState)\n        GetState(hswDisplayState);\n\n    return newlyDisplayed;\n}\n\n\nvoid HSWDisplay::GetState(ovrHSWDisplayState *hswDisplayState) const\n{\n    // Return the state to the caller.\n    OVR_ASSERT(hswDisplayState != NULL);\n    if(hswDisplayState)\n    {\n        hswDisplayState->Displayed = Displayed;\n        hswDisplayState->StartTime = StartTime;\n        hswDisplayState->DismissibleTime = DismissibleTime;\n    }\n}\n\n\nvoid HSWDisplay::Render(ovrEyeType eye, const ovrTexture* eyeTexture)\n{\n    SDKRendered = true;\n    RenderInternal(eye, eyeTexture);\n}\n\n// Persist the HSW settings on the server, since it needs to be synchronized across all applications.\n// Note that the profile manager singleton cannot be used for this task because it overwrites the global\n// settings for which the rift config tool is supposed to be authoritative.  That also would step on the\n// settings generated by other rift apps.  The server settings, however, are synchronized for all apps\n// and so are appropriate for this task.\nstatic String getHSWTimeKey(const char* userName)\n{\n    String keyName = \"server:\";\n    keyName += OVR_KEY_HSWDISPLAYLASTDISPLAYEDTIME;\n    keyName += \":\";\n    if (userName)\n    {\n        keyName += userName;\n    }\n    return keyName;\n}\n\n// Returns HSWDisplayTimeNever (0) if there is no profile or this is the first time we are seeing this profile.\ntime_t HSWDisplay::GetCurrentProfileLastHSWTime() const\n{\n    // We store the timeout value in HMDState's pProfile.\n    HMDState* pHMDState = (HMDState*)HMD->Handle;\n\n    if (pHMDState)\n    {\n        const char* profileName = pHMDState->pProfile ? pHMDState->pProfile->GetValue(OVR_KEY_USER) : NULL;\n\n        if (profileName)\n        {\n            if (LastProfileName == profileName)\n            {\n                return LastHSWTime;\n            }\n\n            LastProfileName = profileName;\n            String timeKey = getHSWTimeKey(profileName);\n            int lastTime = pHMDState->getIntValue(timeKey.ToCStr(), (int)HSWDisplayTimeNever);\n\n            LastHSWTime = lastTime;\n            return lastTime;\n        }\n    }\n\n    return HSWDisplayTimeNever;\n}\n\nvoid HSWDisplay::SetCurrentProfileLastHSWTime(time_t t)\n{\n    // The timeout value is stored in HMDState's pProfile.\n    HMDState* pHMDState = (HMDState*)HMD->Handle;\n\n    if (pHMDState)\n    {\n        const char* profileName = pHMDState->pProfile ? pHMDState->pProfile->GetValue(OVR_KEY_USER) : NULL;\n\n        if (profileName)\n        {\n            LastProfileName = profileName;\n            LastHSWTime = (int)t;\n\n            String timeKey = getHSWTimeKey(profileName);\n            pHMDState->setIntValue(timeKey.ToCStr(), (int)t);\n        }\n    }\n}\n\n\n// Generates an appropriate stereo ortho projection matrix.\nvoid HSWDisplay::GetOrthoProjection(const HMDRenderState& RenderState, Matrix4f OrthoProjection[2])\n{\n    Matrix4f perspectiveProjection[2];\n    perspectiveProjection[0] = ovrMatrix4f_Projection(RenderState.EyeRenderDesc[0].Fov, 0.01f, 10000.f, true);\n    perspectiveProjection[1] = ovrMatrix4f_Projection(RenderState.EyeRenderDesc[1].Fov, 0.01f, 10000.f, true);\n\n    const float    orthoDistance = HSWDISPLAY_DISTANCE; // This is meters from the camera (viewer) that we place the ortho plane.\n    const Vector2f orthoScale0   = Vector2f(1.f) / Vector2f(RenderState.EyeRenderDesc[0].PixelsPerTanAngleAtCenter);\n    const Vector2f orthoScale1   = Vector2f(1.f) / Vector2f(RenderState.EyeRenderDesc[1].PixelsPerTanAngleAtCenter);\n    \n    OrthoProjection[0] = ovrMatrix4f_OrthoSubProjection(perspectiveProjection[0], orthoScale0, orthoDistance, RenderState.EyeRenderDesc[0].HmdToEyeViewOffset.x);\n    OrthoProjection[1] = ovrMatrix4f_OrthoSubProjection(perspectiveProjection[1], orthoScale1, orthoDistance, RenderState.EyeRenderDesc[1].HmdToEyeViewOffset.x);\n}\n\n\nconst uint8_t* HSWDisplay::GetDefaultTexture(size_t& TextureSize)\n{\n    TextureSize = sizeof(healthAndSafety_tga);\n    return healthAndSafety_tga;\n}\n\n\n\n}} // namespace OVR::CAPI\n\n\n\n\n//-------------------------------------------------------------------------------------\n// ***** HSWDisplay factory\n//\n\n#if defined (OVR_OS_WIN32)\n    #define OVR_D3D_VERSION 9\n    #include \"D3D9/CAPI_D3D9_HSWDisplay.h\"\n    #undef  OVR_D3D_VERSION\n\n    #define OVR_D3D_VERSION 10\n    #include \"D3D1X/CAPI_D3D10_HSWDisplay.h\"\n    #undef  OVR_D3D_VERSION\n\n    #define OVR_D3D_VERSION 11\n    #include \"D3D1X/CAPI_D3D11_HSWDisplay.h\"\n    #undef  OVR_D3D_VERSION\n#endif\n\n#include \"GL/CAPI_GL_HSWDisplay.h\"\n\n\nOVR::CAPI::HSWDisplay* OVR::CAPI::HSWDisplay::Factory(ovrRenderAPIType apiType, ovrHmd hmd, const OVR::CAPI::HMDRenderState& renderState)\n{\n    OVR::CAPI::HSWDisplay* pHSWDisplay = NULL;\n\n    switch (apiType)\n    {\n        case ovrRenderAPI_None:\n            pHSWDisplay = new OVR::CAPI::HSWDisplay(apiType, hmd, renderState);\n            break;\n\n        case ovrRenderAPI_OpenGL:\n            pHSWDisplay = new OVR::CAPI::GL::HSWDisplay(apiType, hmd, renderState);\n            break;\n\n    #if defined(OVR_OS_WIN32)\n        case ovrRenderAPI_D3D9:\n            pHSWDisplay = new OVR::CAPI::D3D9::HSWDisplay(apiType, hmd, renderState);\n            break;\n\n        case ovrRenderAPI_D3D10:\n            pHSWDisplay = new OVR::CAPI::D3D10::HSWDisplay(apiType, hmd, renderState);\n            break;\n\n        case ovrRenderAPI_D3D11:\n            pHSWDisplay = new OVR::CAPI::D3D11::HSWDisplay(apiType, hmd, renderState);\n            break;\n    #else\n        case ovrRenderAPI_D3D9:\n        case ovrRenderAPI_D3D10:\n        case ovrRenderAPI_D3D11: // Fall through\n    #endif\n\n        // Handle unsupported cases.\n        case ovrRenderAPI_Android_GLES:\n        case ovrRenderAPI_Count: // This is not actually a type.\n        default:\n            break;\n    }\n\n    return pHSWDisplay;\n}\n\n\n\n\n\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/CAPI_HSWDisplay.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_HSWDisplay.h\nContent     :   Implements Health and Safety Warning system.\nCreated     :   July 3, 2014\nAuthors     :   Paul Pedriana\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_HSWDisplay_h\n#define OVR_CAPI_HSWDisplay_h\n\n#include \"../OVR_CAPI.h\"\n#include \"CAPI_HMDRenderState.h\"\n#include <time.h>\n\n\n\n//-------------------------------------------------------------------------------------\n// ***** HSWDISPLAY_LOG\n//\n// Debug log wrapper.\n\n#if !defined(HSWDISPLAY_LOG_ENABLED)\n    #ifdef OVR_BUILD_DEBUG\n        #define HSWDISPLAY_LOG_ENABLED 1\n    #else\n        #define HSWDISPLAY_LOG_ENABLED 0\n    #endif\n#endif\n\n#if HSWDISPLAY_LOG_ENABLED\n    #define HSWDISPLAY_LOG(...) OVR_DEBUG_LOG(__VA_ARGS__)\n#else\n    #define HSWDISPLAY_LOG(...)\n#endif\n\n\n//-------------------------------------------------------------------------------------\n// ***** HSWDISPLAY_DISTANCE\n//\n// Floating point value in the range of ~0.75 to ~3.0 which controls the distance \n// (in meters) of the display from the viewer.\n\n#ifndef HSWDISPLAY_DISTANCE\n    #define HSWDISPLAY_DISTANCE 1.5f\n#endif\n\n\n//-------------------------------------------------------------------------------------\n// ***** HSWDISPLAY_SCALE\n//\n// Floating point value in the range of ~0.1 to ~2.0 which controls the size scale of the \n// SDK-rendered HSW display. The value is an arbitrary relative value, though this may \n// change in future SDK versions.\n\n#ifndef HSWDISPLAY_SCALE\n    #define HSWDISPLAY_SCALE 0.92f\n#endif\n\n\n\n\n//-------------------------------------------------------------------------------------\n// ***** Experimental C API functions\n//\n// These are currently not formally supported and may be promoted to the formal C API\n// or may be removed in the future.\n\nextern \"C\"\n{\n    // Normally if an application uses SDK-based distortion rendering \n    // (ovrHmd_BeginFrame / ovrHmd_EndFrame) then the SDK also takes care of \n    // drawing the health and safety warning. If an application is using \n    // SDK-based rendering but wants to draw the warning display itself, \n    // it call this function with enabled set to false.\n    OVR_EXPORT void ovrhmd_EnableHSWDisplaySDKRender(ovrHmd hmd, ovrBool enabled);\n}\n\n\nnamespace OVR { namespace CAPI {\n\n\n//-------------------------------------------------------------------------------------\n// ***** CAPI::HSWDisplay\n//\n// Note: This will be renamed to HSWDisplay in the future.\n//\n// Implements the logic for the Health and Safety (HAS) warning display. Primarily this\n// is two things: providing information about whether the warning needs to be currently\n// displayed, and implementing the display itself. \n//\n// An HSWDisplay is associated 1:1 with an HMD. There can be at most one HSWDisplay \n// being displayed on an HMD at a time. If a warning needs to be displayed while an  \n// existing one is present, it replaces the existing one. \n//\n// Notes\n//    Warnings are displayed per HMD (head mounted display).\n//    The app can have multiple HMDs.\n//    There can be multiple users of a given HMD over time, with each identified by a different user profile.\n//    There can be multiple apps using HMDs.\n//\n//    Shows upon first entering a VR application (or VR mode in an application) when in Event Mode (e.g. trade show).\n//    Shows upon each wearing of the HMD.\n//    If the user profile is switched while display is active, the display must restart.\n//    Doesn't show in app when app was started by a launcher app.\n//\n//    First display ever (per profile): 15 seconds until the display can be dismissed.\n//    Subsequent displays: 6 seconds until the display can be dismissed. Per profile.\n//    Dismissing occurs via HMD tap, designated keypress, gaze detection on OK button for N seconds, \n//        and possibly via an input gesture in the future.\n//\n//    If the warning fades out upon completion, the fade out should begin after the full display time has elapsed, \n//        but it needs to avoid interfering (e.g. obscuring) with the application. This likely means the application \n//        would need to put in a couple seconds delay to allow the fade to complete.\n//    Ideally we'd handle the case of a user switching HMDs and not needing to see the warning again.\n\nclass HSWDisplay : public RefCountBase<HSWDisplay>\n{\npublic:\n    HSWDisplay(ovrRenderAPIType api, ovrHmd hmd, const HMDRenderState& renderState);\n\n    virtual ~HSWDisplay();\n\n    // Must be called after construction and before use.\n    virtual bool Initialize(const ovrRenderAPIConfig*)\n        { return true; }\n\n    // Must be called before destruction.\n    virtual void Shutdown() {}\n\n    // Enables or disables the HSW display system. It may be disabled only for development uses.\n    // It is enabled by default. \n    void Enable(bool enable);\n\n    // Enables or disables our internal rendering when Render is called. If set to false then the \n    // application is expected to implement drawing of the display when Displayed is true.\n    // It is enabled by default. \n    void EnableRender(bool enable);\n\n    // Triggers a display of the HSW display for the associated HMD. Restarts the display if \n    // the warning is already being displayed. \n    void Display();\n\n    // This function should be called per HMD every frame in order to give this class processing time. \n    // Writes the new state to newHSWDisplayState if it's non-NULL.\n    // The graphicsContext argument indicates if the Tick is occurring within a graphics context and\n    // thus if graphics operations are allowed during the TickState call.\n    // Returns true if the new state results in a required warning display (ovrHSWDisplayState::Displayed became true).\n    bool TickState(ovrHSWDisplayState *newHSWDisplayState = NULL, bool graphicsContext = false);\n\n    // Gets the current state of the HSW display. \n    // Corresponds to ovrhmd_GetHSWDisplayState.\n    void GetState(ovrHSWDisplayState *hasWarningState) const;\n\n    // Removes the HSW display display if the minimum dismissal time has occurred. \n    // Returns true if the warning display could be dissmissed or was not displayed at the time of the call.\n    // Corresponds to ovrhmd_DismissHSWDisplay.\n    bool Dismiss();\n\n    // Returns true if the HMD appears to be currently mounted and in a state that a \n    // warning display would be viewable.\n    bool IsDisplayViewable() const;\n\n    // Draws the warning to the eye texture(s). This must be done at the end of a \n    // frame but prior to executing the distortion rendering of the eye textures. \n    virtual void Render(ovrEyeType, const ovrTexture*);\n\n    // Resets the current profile's HAS settings (e.g. to act as if the user has never seen the HSW display before).\n    void ResetProfileData();\n\n    // Returns the ovrRenderAPIType. This is essentially the same as RTTI, as it's indicating what subclass\n    // is being used for this.\n    ovrRenderAPIType GetRenderAPIType() const // e.g. ovrRenderAPI_D3D11\n        { return RenderAPIType; }\n\n    // Returns the required HSW display text for the current profile's locale. \n    // Useful for implementing custom warning displays. Returns the required strlen \n    // of the text, and thus success is indicated by a return value < strCapacity.\n    // size_t GetText(char *str, size_t strCapacity);\n\n    // Creates and constructs an instance of an HSWDisplay subclass based on the API type.\n    static HSWDisplay* Factory(ovrRenderAPIType apiType, ovrHmd hmd, const HMDRenderState& renderState);\n\nprivate:\n    OVR_NON_COPYABLE(HSWDisplay)\n\nprotected:\n    virtual void DisplayInternal() {}\n    virtual void DismissInternal() {}\n    virtual void RenderInternal(ovrEyeType, const ovrTexture*) {}\n    virtual void UnloadGraphics() {}\n    virtual void LoadGraphics() {}\n\n    // Profile functionality\n    time_t GetCurrentProfileLastHSWTime() const;\n    void   SetCurrentProfileLastHSWTime(time_t t);\n\n    // Generates an appropriate stereo ortho projection matrix.\n    static void GetOrthoProjection(const HMDRenderState& RenderState, Matrix4f OrthoProjection[2]);\n\n    // Returns the default HSW display texture data.\n    static const uint8_t* GetDefaultTexture(size_t& TextureSize);\n\nprotected:\n    bool                   Enabled;                 // If true then the HSW display system is enabled. True by default.\n    bool                   Displayed;               // If true then the warning is currently visible and the following variables have meaning. Else there is no warning being displayed for this application on the given HMD.\n    bool                   SDKRendered;             // If true then the display is being rendered by the SDK as opposed to the application.\n    bool                   DismissRequested;        // If true then the warning has been requested to be hidden.\n    bool                   RenderEnabled;           // If true then we handle rendering when Render is called. Else we skip it and assume the application is otherwise handling it itself.\n    bool                   UnloadGraphicsRequested; // If true then an unload of graphics was requested. This acts as a message from the main thread to the drawing thread so that the unload happens in the expected thread.\n    double                 StartTime;               // Absolute time when the warning was first displayed. See ovr_GetTimeInSeconds().\n    double                 DismissibleTime;         // Absolute time when the warning can be dismissed.\n    double                 LastPollTime;            // Used to prevent us from polling the required display state every frame but rather more like every 200 milliseconds.\n    const ovrHmd           HMD;                     // The HMDState this HSWDisplay instance corresponds to.\n    mutable bool           HMDMounted;              // True if the HMD was most recently found to be mounted. We need this in order to maintain HMDNewlyMounted.\n    mutable bool           HMDNewlyMounted;         // True if HMDMounted has transitioned from false to true. We need this in order to tell if the HMD was recently mounted so we can display the HSW display.\n    const ovrRenderAPIType RenderAPIType;           // e.g. ovrRenderAPI_D3D11\n    const HMDRenderState&  RenderState;             // Information about the rendering setup.\n\n    // Settings cache\n    mutable String         LastProfileName;\n    mutable int            LastHSWTime;\n\n}; // class HSWDisplay\n\n\n\n}} // namespace OVR::CAPI\n\n\n#endif // OVR_CAPI_HSWDisplay_h\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/CAPI_LatencyStatistics.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_LatencyStatistics.cpp\nContent     :   Record latency statistics during rendering\nCreated     :   Sept 23, 2014\nAuthors     :   Chris Taylor, Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_LatencyStatistics.h\"\n\n#include \"../Kernel/OVR_Log.h\"\n#include \"../Kernel/OVR_Threads.h\"\n#include \"../Util/Util_SystemInfo.h\"\n\nnamespace OVR { namespace CAPI {\n\n//-----------------------------------------------------------------------------\n// ***** LatencyStatisticsObserver\n\nLatencyStatisticsCSV::LatencyStatisticsCSV()\n{\n}\n\nLatencyStatisticsCSV::~LatencyStatisticsCSV()\n{\n    Stop();\n}\n\nbool LatencyStatisticsCSV::Start(String fileName, String userData1)\n{\n    if (_File.IsValid())\n    {\n        if (fileName == FileName)\n        {\n            UserData1 = userData1;\n            return true;\n        }\n        else\n        {\n            Stop();\n        }\n    }\n\n    OVR::String basePath = OVR::GetBaseOVRPath(true);\n    OVR::String path = basePath;\n    path.AppendString(\"\\\\\");\n    path.AppendString(fileName);\n    OS = OVR::Util::OSAsString();\n    OSVersion = OVR::Util::OSVersionAsString();\n#if defined (OVR_OS_WIN64) || defined (OVR_OS_WIN32)\n    ProcessInfo = OVR::Util::GetProcessInfo();\n    DisplayDriverVersion = OVR::Util::GetDisplayDriverVersion();\n    CameraDriverVersion = OVR::Util::GetCameraDriverVersion();\n    OVR::Array< OVR::String > gpus;\n    OVR::Util::GetGraphicsCardList(gpus);\n    StringBuffer sb;\n    size_t gpuIdx;\n    for (gpuIdx = 0; gpuIdx < gpus.GetSize(); gpuIdx++)\n    {\n        sb.AppendString(gpus[gpuIdx]);\n        if (gpuIdx + 1 < gpus.GetSize())\n            sb.AppendString(\"; \");\n    }\n    GPUVersion = sb;\n#endif\n    Guid = OVR::Util::GetGuidString();\n\n    if (!_File.Open(path, OVR::File::Open_Write, OVR::File::Mode_Write))\n    {\n        _File.Create(path, OVR::File::Mode_Write);\n        WriteHeaderV1();\n    }\n    else\n    {\n        _File.Seek(0, FileConstants::Seek_End);\n    }\n\n    if (_File.IsValid())\n    {\n        UserData1 = userData1;\n        FileName = fileName;\n        _Observer.SetHandler(LatencyStatisticsSlot::FromMember<LatencyStatisticsCSV, &LatencyStatisticsCSV::OnResults>(this));\n\n        return true;\n    }\n\n    return false;\n}\nbool LatencyStatisticsCSV::Stop()\n{\n    if (_File.IsValid())\n    {\n        _File.Flush();\n        _File.Close();\n        _Observer.ReleaseAll();\n\n        Guid.Clear();\n        FileName.Clear();\n        return true;\n    }\n    return false;\n}\nvoid LatencyStatisticsCSV::WriteHeaderV1()\n{\n    if (_File.IsValid())\n    {\n        // Write header if creating the file\n        const char *str = \"GUID,OS,OSVersion,Process,DisplayDriver,CameraDriver,GPU,Time,Interval,FPS,EndFrameExecutionTime,LatencyRender,LatencyTimewarp,LatencyPostPresent,LatencyVisionProc,LatencyVisionFrame,UserData1\\n\";\n        _File.Write((const uint8_t *) str, (int)OVR_strlen(str));\n    }\n}\n\nvoid LatencyStatisticsCSV::WriteResultsV1(LatencyStatisticsResults *results)\n{\n    if (_File.IsValid())\n    {\n        char str[512];\n        OVR_sprintf(str, sizeof(str),\n            \"%s,%s,%s,%s,%s,%s,%s,%f,%f,%f,%f,%f,%f,%f,%f,%f,%s\\n\",\n            Guid.ToCStr(),\n            OS.ToCStr(),\n            OSVersion.ToCStr(),\n            ProcessInfo.ToCStr(),\n            DisplayDriverVersion.ToCStr(),\n            CameraDriverVersion.ToCStr(),\n            GPUVersion.ToCStr(),\n            ovr_GetTimeInSeconds(),\n            results->IntervalSeconds,\n            results->FPS,\n            results->EndFrameExecutionTime,\n            results->LatencyRender,\n            results->LatencyTimewarp,\n            results->LatencyPostPresent,\n            results->LatencyVisionProc,\n            results->LatencyVisionFrame,\n            UserData1.ToCStr());\n        str[sizeof(str)-1] = 0;\n        _File.Write((const uint8_t *)str, (int)OVR_strlen(str));\n    }\n}\nvoid LatencyStatisticsCSV::OnResults(LatencyStatisticsResults *results)\n{\n    WriteResultsV1(results);\n}\n//-------------------------------------------------------------------------------------\n// ***** LatencyStatisticsCalculator\n    \nLagStatsCalculator::LagStatsCalculator()\n{\n    resetPerfStats();\n}\n\nvoid LagStatsCalculator::resetPerfStats(double resetTime)\n{\n    EndFrameStartTime = 0.;\n    EndFrameEndTime = 0.;\n\n    LastCameraFrameCounter = ~(uint32_t)0;\n\n    EpochBegin = resetTime; // Set epoch start to now\n\n    FrameCount = 0;\n    //EndFrameSum = 0.;\n\n    //VisionProcSum = 0.;\n    //VisionLagSum = 0.;\n    VisionFrames = 0;\n\n    //for (int i = 0; i < 3; ++i)\n    //{\n    //    LatencyData[i] = 0.f;\n    //    LatencySum[i] = 0.;\n    //}\n\n    latencyStatisticsData.EndFrameExecutionTime = 0;\n    latencyStatisticsData.LatencyRender = 0;\n    latencyStatisticsData.LatencyTimewarp = 0;\n    latencyStatisticsData.LatencyPostPresent = 0;\n    latencyStatisticsData.LatencyVisionProc = 0;\n    latencyStatisticsData.LatencyVisionFrame = 0;\n}\n\nvoid LagStatsCalculator::GetLatestResults(LatencyStatisticsResults* results)\n{\n    *results = Results.GetState();\n}\nvoid LagStatsCalculator::AddResultsObserver(ObserverScope<LatencyStatisticsSlot> *calculateResultsObserver)\n{\n    Lock::Locker locker(&calculateResultsLock);\n    calculateResultsObserver->GetPtr()->Observe(calculateResultsSubject);\n}\nvoid LagStatsCalculator::InstrumentEndFrameStart(double timestamp)\n{\n    EndFrameStartTime = timestamp;\n}\n\nvoid LagStatsCalculator::InstrumentLatencyTimings(FrameTimeManager& ftm)\n{\n    //latencies[0] = (float)RenderLatencySeconds;\n    //latencies[1] = (float)TimewarpLatencySeconds;\n    //latencies[2] = (float)FrameDeltas.GetMedianTimeDelta();\n\n    // Note: This assumes that it is called right before InstrumentEndFrameEnd()\n\tfloat latencyRender, latencyTimewarp, latencyPostPresent;\n    ftm.GetLatencyTimings(latencyRender, latencyTimewarp, latencyPostPresent);\n\tlatencyStatisticsData.LatencyRender += latencyRender;\n\tlatencyStatisticsData.LatencyTimewarp += latencyTimewarp;\n\tlatencyStatisticsData.LatencyPostPresent += latencyPostPresent;\n}\n\nvoid LagStatsCalculator::InstrumentEndFrameEnd(double timestamp)\n{\n    EndFrameEndTime = timestamp;\n\n    calculateResults();\n}\n\nvoid LagStatsCalculator::InstrumentEyePose(const ovrTrackingState& state)\n{\n    // If the camera frame counter has rolled,\n    if (LastCameraFrameCounter != state.LastCameraFrameCounter)\n    {\n        // Accumulate eye pose data\n        if (state.StatusFlags != 0)\n        {\n            latencyStatisticsData.LatencyVisionProc += state.LastVisionProcessingTime;\n            latencyStatisticsData.LatencyVisionFrame += state.LastVisionFrameLatency;\n        }\n        ++VisionFrames;\n\n        LastCameraFrameCounter = state.LastCameraFrameCounter;\n    }\n}\n\n// Note: Currently assumes this is being called from OnEndFrameEnd() above.\nvoid LagStatsCalculator::calculateResults()\n{\n    // Calculate time in the current epoch so far\n    double intervalDuration = EndFrameEndTime - EpochBegin;\n\n    // If stats should be reset due to inactivity,\n    if (intervalDuration >= OVR_LAG_STATS_RESET_LIMIT)\n    {\n        resetPerfStats(EndFrameEndTime);\n        return;\n    }\n\n    // Calculate EndFrame() duration\n    double endFrameDuration = EndFrameEndTime - EndFrameStartTime;\n\n    // Incorporate EndFrame() duration into the running sum\n    latencyStatisticsData.EndFrameExecutionTime += endFrameDuration;\n\n    //for (int i = 0; i < 3; ++i)\n    //{\n    //    LatencySum[i] += LatencyData[i];\n    //}\n\n    // Increment frame counter\n    ++FrameCount;\n\n    // If enough time has passed,\n    if (intervalDuration >= OVR_LAG_STATS_EPOCH)\n    {\n        LatencyStatisticsResults results;\n\n        float invFrameCount = 1.0f / (float) FrameCount;\n\n        // EndFrame() instrumentation\n        results.IntervalSeconds = intervalDuration;\n        results.FPS = FrameCount / intervalDuration;\n        results.EndFrameExecutionTime = latencyStatisticsData.EndFrameExecutionTime * invFrameCount;\n\n        // Latency data\n        results.LatencyRender = latencyStatisticsData.LatencyRender * invFrameCount;\n        results.LatencyTimewarp = latencyStatisticsData.LatencyTimewarp * invFrameCount;\n        results.LatencyPostPresent = latencyStatisticsData.LatencyPostPresent * invFrameCount;\n\n        double invVisionFrameCount = 1. / VisionFrames;\n\n        // Eye pose instrumentation\n        results.LatencyVisionProc = latencyStatisticsData.LatencyVisionProc * invVisionFrameCount;\n        results.LatencyVisionFrame = latencyStatisticsData.LatencyVisionFrame * invVisionFrameCount;\n\n        Results.SetState(results);\n\n        {\n            Lock::Locker locker(&calculateResultsLock);\n            calculateResultsSubject.GetPtr()->Call(&results);\n        }\n\n        // Reset for next frame\n        resetPerfStats();\n    }\n}\n\n\n}} // namespace OVR::CAPI\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/CAPI_LatencyStatistics.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_LatencyStatistics.h\nContent     :   Record latency statistics during rendering\nCreated     :   Sept 23, 2014\nAuthors     :   Chris Taylor, Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_LatencyStatistics_h\n#define OVR_CAPI_LatencyStatistics_h\n\n#include \"../OVR_CAPI.h\"\n#include \"../Kernel/OVR_Timer.h\"\n#include \"../Kernel/OVR_Lockless.h\"\n#include \"../Kernel/OVR_SysFile.h\"\n#include \"CAPI_FrameTimeManager.h\"\n\nnamespace OVR { namespace CAPI {\n\n\n// Define epoch period for lag statistics\n#define OVR_LAG_STATS_EPOCH 1.0 /* seconds */\n// Define seconds without frames before resetting stats\n#define OVR_LAG_STATS_RESET_LIMIT 2.0 /* seconds */\n\n\n//-------------------------------------------------------------------------------------\n// ***** LatencyStatisticsResults\n\n// Results from statistics collection\nstruct LatencyStatisticsResults\n{\n    // Number of seconds of data represented by these statistics.\n    double IntervalSeconds;\n\n    // Frames per second during the epoch.\n    double FPS;\n\n    // Measures average time for EndFrame() call over each of the frames.\n    double EndFrameExecutionTime;\n\n    // Measures the time between first scanline and first pose request before app starts rendering eyes.\n    float LatencyRender;\n\n    // Measures the time between first scanline and distortion/timewarp rendering.\n    float LatencyTimewarp;\n\n    // Time between Present() call and photon emission from first scanline of screen\n    float LatencyPostPresent;\n\n    // Measures the time from receiving the camera frame until vision CPU processing completes.\n    double LatencyVisionProc;\n\n    // Measures the time from exposure until the pose is available for the frame, including processing time.\n    double LatencyVisionFrame;\n};\n\n//-----------------------------------------------------------------------------\ntypedef Delegate1<void, LatencyStatisticsResults*> LatencyStatisticsSlot;\n\n// ***** LatencyStatisticsObserver\nclass LatencyStatisticsCSV\n{\npublic:\n    LatencyStatisticsCSV();\n    ~LatencyStatisticsCSV();\n    bool Start(String fileName, String userData1);\n    bool Stop();\n    void OnResults(LatencyStatisticsResults *results);\n\n    // Internal\n    void WriteHeaderV1();\n    void WriteResultsV1(LatencyStatisticsResults *results);\n    ObserverScope<LatencyStatisticsSlot>* GetObserver() { return &_Observer; }\n\nprotected:\n    ObserverScope<LatencyStatisticsSlot> _Observer;\n    String Guid, UserData1;\n    String FileName;\n    OVR::SysFile _File;\n    String OS, OSVersion, ProcessInfo, DisplayDriverVersion, CameraDriverVersion, GPUVersion;\n};\n\n//-----------------------------------------------------------------------------\n// ***** LatencyStatisticsCalculator\n\n// Calculator for latency statistics\nclass LagStatsCalculator\n{\n    // Statistics instrumentation inputs:\n\n    // Timestamp when the EndFrame() call started executing\n    double              EndFrameStartTime;\n    // Timestamp when the EndFrame() call finished executing\n    double              EndFrameEndTime;\n\n    // Latency statistics for the epoch\n    LatencyStatisticsResults latencyStatisticsData;\n\n    // Last latency data\n    // float               LatencyData[3]; // render, timewarp, median post-present\n\n    // Last vision processing frame counter number\n    uint32_t            LastCameraFrameCounter;\n\n    // Running statistics:\n\n    void resetPerfStats(double resetTime = 0.);\n\n    // Start of the current statistics epoch\n    double              EpochBegin;\n    // Count of frames in this stats epoch, measured at EndFrame()\n    int                 FrameCount;\n    // Sum of end frame durations for this stats epoch\n    //double              EndFrameSum;\n\n    // Sum of latencies\n    // double              LatencySum[3];\n\n    // Sum of vision processing times\n    //double              VisionProcSum;\n    // Sum of vision latency times\n    //double              VisionLagSum;\n    // Count of vision frames\n    int                 VisionFrames;\n\n    // Statistics results:\n\n    LocklessUpdater<LatencyStatisticsResults, LatencyStatisticsResults> Results;\n\n    void calculateResults();\n\n    OVR::ObserverScope<LatencyStatisticsSlot> calculateResultsSubject;\n    OVR::Lock calculateResultsLock;\n\npublic:\n    LagStatsCalculator();\n\n    void GetLatestResults(LatencyStatisticsResults* results);\n    void AddResultsObserver(ObserverScope<LatencyStatisticsSlot> *calculateResultsObserver);\n\npublic:\n    // Internal instrumentation interface:\n\n    // EndFrame() instrumentation\n    void InstrumentEndFrameStart(double timestamp);\n    void InstrumentEndFrameEnd(double timestamp);\n\n    // DK2 latency tester instrumentation\n    // Note: This assumes that it is called right before InstrumentEndFrameEnd()\n    void InstrumentLatencyTimings(FrameTimeManager& ftm);\n\n    // Eye pose instrumentation\n    void InstrumentEyePose(const ovrTrackingState& state);\n};\n\n\n}} // namespace OVR::CAPI\n\n#endif // OVR_CAPI_LatencyStatistics_h\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/GL/CAPI_GLE.cpp",
    "content": "/************************************************************************************\n\nFilename    :   Render_GLE.cpp\nContent     :   OpenGL Extensions support. Implements a stripped down glew-like \n                interface with some additional functionality.\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_GLE.h\"\n#include \"../../Kernel/OVR_Log.h\"\n#include <string.h>\n\n\n#if defined(_WIN32)\n    #if !defined(WINAPI)\n        #ifndef WIN32_LEAN_AND_MEAN\n            #define WIN32_LEAN_AND_MEAN 1\n        #endif\n        #include <windows.h>\n    #endif\n\n    #pragma comment(lib, \"opengl32.lib\")\n#elif defined(__APPLE__)\n    #include <stdlib.h>\n    #include <string.h>\n    #include <AvailabilityMacros.h>\n    #include <dlfcn.h>\n#endif\n\n\n\n//namespace OVR\n//{\n    // OVRTypeof\n    // Acts the same as the C++11 decltype expression, though with reduced requirements.\n    #if !defined(OVRTypeof)\n        #if defined(_MSC_VER)\n            #define OVRTypeof(x) decltype(x)    // VS2010+ unilaterally supports decltype\n        #else\n            #define OVRTypeof(x) __typeof__(x)  // Other compilers support decltype, but usually not unless C++11 support is present and explicitly enabled.\n        #endif\n    #endif\n\n    \n    // GLELoadProc\n    // Macro which implements dynamically looking up and assigning an OpenGL function.\n    //\n    // Example usage:\n    //     GLELoadProc(glCopyTexSubImage3D, glCopyTexSubImage3D);\n    // Expands to:\n    //     gleCopyTexSubImage3D = (OVRTypeof(gleCopyTexSubImage3D)) GLEGetProcAddress(\"glCopyTexSubImage3D\");\n    \n    #define GLELoadProc(var, name) var = (OVRTypeof(var))GLEGetProcAddress(#name)\n    \n\n    // Disable some #defines, as we need to call these functions directly.\n    #if defined(GLE_HOOKING_ENABLED)\n        #if defined(_WIN32)\n            #undef wglGetProcAddress\n            extern \"C\" { GLAPI PROC GLAPIENTRY wglGetProcAddress(LPCSTR lpszProc); }\n        #endif\n\n        #undef glGetString\n        extern \"C\" { GLAPI const GLubyte * GLAPIENTRY glGetString(GLenum name); }\n    #endif\n\n\n    // Generic OpenGL GetProcAddress function interface. Maps to platform-specific functionality\n    // internally. On Windows this is equivalent to wglGetProcAddress as opposed to global GetProcAddress.\n    void* OVR::GLEGetProcAddress(const char* name)\n    {\n        #if defined(_WIN32)\n            return wglGetProcAddress(name);\n        \n        #elif defined(__APPLE__)\n            // Requires the OS 10.3 SDK or later.\n            static void* dlImage = NULL;\n            void* addr = nullptr;\n        \n            if(!dlImage)\n                dlImage = dlopen(\"/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL\", RTLD_LAZY);\n        \n            if(dlImage)\n                addr = dlsym(dlImage, name);\n        \n            return addr;\n        \n        #elif defined(__ANDROID__)\n            return eglGetProcAddress(name);\n        \n        #else\n            // This was glXGetProcAddressARB in GLX versions prior to v1.4, but that was ten years ago.\n            return (void*)glXGetProcAddress((const GLubyte*)name);\n        #endif\n    }\n\n\n\n    // Current context functionality\n    static OVR::GLEContext* GLECurrentContext = NULL;\n    \n    OVR::GLEContext* OVR::GLEContext::GetCurrentContext()\n    {\n        return GLECurrentContext;\n    }\n\n    void OVR::GLEContext::SetCurrentContext(OVR::GLEContext* p)\n    {\n        GLECurrentContext = p;\n    }\n        \n\n    \n    OVR::GLEContext::GLEContext()\n      : MajorVersion(0)\n      , MinorVersion(0)\n      , WholeVersion(0)\n      , IsGLES(false)\n      , IsCoreProfile(false)\n      , EnableHookGetError(true)\n      , PlatformMajorVersion(0)\n      , PlatformMinorVersion(0)\n      , PlatformWholeVersion(0)\n    {\n        // The following sequence is not thread-safe. Two threads could set the context to this at the same time.\n        if(GetCurrentContext() == NULL)\n            SetCurrentContext(this);\n    }\n    \n    \n    OVR::GLEContext::~GLEContext()\n    {\n        // Currently empty\n    }\n    \n    \n    void OVR::GLEContext::Init()\n    {\n        PlatformInit();\n\n        if(!IsInitialized())\n        {\n            InitVersion();\n            InitExtensionLoad();\n            InitExtensionSupport();\n        }\n    }\n    \n\n    bool OVR::GLEContext::IsInitialized() const\n    {\n        return (MajorVersion != 0);\n    }\n\n\n    void OVR::GLEContext::Shutdown()\n    {\n        // This memset is valid only if this class has no virtual functions (similar to concept of POD).\n        // We cannot assert this because restrictions prevent us from using C++11 type traits here.\n        memset(this, 0, sizeof(GLEContext));\n    }\n\n\n    void OVR::GLEContext::PlatformInit()\n    {\n        if(!IsPlatformInitialized())\n        {\n            InitPlatformExtensionLoad();\n            InitPlatformExtensionSupport();\n            InitPlatformVersion();\n        }\n    }\n\n\n    bool OVR::GLEContext::IsPlatformInitialized() const\n    {\n        return (PlatformMajorVersion != 0);\n    }\n\n\n    void OVR::GLEContext::InitVersion()\n    {\n        const char* version = (const char*)glGetString(GL_VERSION);\n        int fields = 0, major = 0, minor = 0;\n        bool isGLES = false;\n\n        OVR_ASSERT(version);\n        if (version)\n        {\n            OVR_DEBUG_LOG((\"GL_VERSION: %s\", (const char*)version));\n\n            // Skip all leading non-digits before reading %d.\n            // Example GL_VERSION strings:\n            //   \"1.5 ATI-1.4.18\"\n            //   \"OpenGL ES-CM 3.2\"\n            OVR_DISABLE_MSVC_WARNING(4996) // \"scanf may be unsafe\"\n            fields = sscanf(version, isdigit(*version) ? \"%d.%d\" : \"%*[^0-9]%d.%d\", &major, &minor);\n            isGLES = (strstr(version, \"OpenGL ES\") != NULL);\n            OVR_RESTORE_MSVC_WARNING()\n        }\n        else\n        {\n            LogText(\"Warning: GL_VERSION was NULL\\n\");\n        }\n\n        // If two fields were not found,\n        if (fields != 2)\n        {\n            static_assert(sizeof(major) == sizeof(GLint), \"type mis-match\");\n\n            glGetIntegerv(GL_MAJOR_VERSION, &major);\n            glGetIntegerv(GL_MINOR_VERSION, &minor);\n        }\n\n        // Write version data\n        MajorVersion  = major;\n        MinorVersion  = minor;\n        WholeVersion  = (major * 100) + minor;\n\n        GLint profileMask = 0;\n        if(WholeVersion >= 302)\n        {\n            // Older NVidia drivers have a bug with this on at least Windows.\n            // https://www.opengl.org/discussion_boards/showthread.php/171380-NVIDIA-drivers-not-returning-the-right-profile-mas\n            // A workaround could be to check for the GL_ARB_compatibility extension, which indicates if OpenGL is in compatibility mode,\n            // and if not then we are in core profile mode. On Apple another solution would be to use NSOpeNGLPixelFormat\n            // NSOpenGLView::pixelFormat to get the core profile attribute.\n            glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &profileMask);\n        }\n        IsCoreProfile = (profileMask == GL_CONTEXT_CORE_PROFILE_BIT); // There's also GL_CONTEXT_COMPATIBILITY_PROFILE_BIT\n        IsGLES        = isGLES;\n    }\n    \n    \n    void OVR::GLEContext::InitExtensionLoad()\n    {\n        // GL_VERSION_1_1\n        // We don't load these but rather link to them directly.\n        \n        // GL_VERSION_1_2\n        GLELoadProc(glCopyTexSubImage3D_Impl, glCopyTexSubImage3D);  // This expands to a get proc address call (e.g. wglGetProcAddress on Windows).\n        GLELoadProc(glDrawRangeElements_Impl, glDrawRangeElements);\n        GLELoadProc(glTexImage3D_Impl, glTexImage3D);\n        GLELoadProc(glTexSubImage3D_Impl, glTexSubImage3D);\n\n        // GL_VERSION_1_3\n        GLELoadProc(glActiveTexture_Impl, glActiveTexture);\n        GLELoadProc(glClientActiveTexture_Impl, glClientActiveTexture);\n        GLELoadProc(glCompressedTexImage1D_Impl, glCompressedTexImage1D);\n        GLELoadProc(glCompressedTexImage2D_Impl, glCompressedTexImage2D);\n        GLELoadProc(glCompressedTexImage3D_Impl, glCompressedTexImage3D);\n        GLELoadProc(glCompressedTexSubImage1D_Impl, glCompressedTexSubImage1D);\n        GLELoadProc(glCompressedTexSubImage2D_Impl, glCompressedTexSubImage2D);\n        GLELoadProc(glCompressedTexSubImage3D_Impl, glCompressedTexSubImage3D);\n        GLELoadProc(glGetCompressedTexImage_Impl, glGetCompressedTexImage);\n        GLELoadProc(glLoadTransposeMatrixd_Impl, glLoadTransposeMatrixd);\n        GLELoadProc(glLoadTransposeMatrixf_Impl, glLoadTransposeMatrixf);\n        GLELoadProc(glMultTransposeMatrixd_Impl, glMultTransposeMatrixd);\n        GLELoadProc(glMultTransposeMatrixf_Impl, glMultTransposeMatrixf);\n        GLELoadProc(glMultiTexCoord1d_Impl, glMultiTexCoord1d);\n        GLELoadProc(glMultiTexCoord1dv_Impl, glMultiTexCoord1dv);\n        GLELoadProc(glMultiTexCoord1f_Impl, glMultiTexCoord1f);\n        GLELoadProc(glMultiTexCoord1fv_Impl, glMultiTexCoord1fv);\n        GLELoadProc(glMultiTexCoord1i_Impl, glMultiTexCoord1i);\n        GLELoadProc(glMultiTexCoord1iv_Impl, glMultiTexCoord1iv);\n        GLELoadProc(glMultiTexCoord1s_Impl, glMultiTexCoord1s);\n        GLELoadProc(glMultiTexCoord1sv_Impl, glMultiTexCoord1sv);\n        GLELoadProc(glMultiTexCoord2d_Impl, glMultiTexCoord2d);\n        GLELoadProc(glMultiTexCoord2dv_Impl, glMultiTexCoord2dv);\n        GLELoadProc(glMultiTexCoord2f_Impl, glMultiTexCoord2f);\n        GLELoadProc(glMultiTexCoord2fv_Impl, glMultiTexCoord2fv);\n        GLELoadProc(glMultiTexCoord2i_Impl, glMultiTexCoord2i);\n        GLELoadProc(glMultiTexCoord2iv_Impl, glMultiTexCoord2iv);\n        GLELoadProc(glMultiTexCoord2s_Impl, glMultiTexCoord2s);\n        GLELoadProc(glMultiTexCoord2sv_Impl, glMultiTexCoord2sv);\n        GLELoadProc(glMultiTexCoord3d_Impl, glMultiTexCoord3d);\n        GLELoadProc(glMultiTexCoord3dv_Impl, glMultiTexCoord3dv);\n        GLELoadProc(glMultiTexCoord3f_Impl, glMultiTexCoord3f);\n        GLELoadProc(glMultiTexCoord3fv_Impl, glMultiTexCoord3fv);\n        GLELoadProc(glMultiTexCoord3i_Impl, glMultiTexCoord3i);\n        GLELoadProc(glMultiTexCoord3iv_Impl, glMultiTexCoord3iv);\n        GLELoadProc(glMultiTexCoord3s_Impl, glMultiTexCoord3s);\n        GLELoadProc(glMultiTexCoord3sv_Impl, glMultiTexCoord3sv);\n        GLELoadProc(glMultiTexCoord4d_Impl, glMultiTexCoord4d);\n        GLELoadProc(glMultiTexCoord4dv_Impl, glMultiTexCoord4dv);\n        GLELoadProc(glMultiTexCoord4f_Impl, glMultiTexCoord4f);\n        GLELoadProc(glMultiTexCoord4fv_Impl, glMultiTexCoord4fv);\n        GLELoadProc(glMultiTexCoord4i_Impl, glMultiTexCoord4i);\n        GLELoadProc(glMultiTexCoord4iv_Impl, glMultiTexCoord4iv);\n        GLELoadProc(glMultiTexCoord4s_Impl, glMultiTexCoord4s);\n        GLELoadProc(glMultiTexCoord4sv_Impl, glMultiTexCoord4sv);\n        GLELoadProc(glSampleCoverage_Impl, glSampleCoverage);\n\n        // GL_VERSION_1_4\n        GLELoadProc(glBlendColor_Impl, glBlendColor);\n        GLELoadProc(glBlendEquation_Impl, glBlendEquation);\n        GLELoadProc(glBlendFuncSeparate_Impl, glBlendFuncSeparate);\n        GLELoadProc(glFogCoordPointer_Impl, glFogCoordPointer);\n        GLELoadProc(glFogCoordd_Impl, glFogCoordd);\n        GLELoadProc(glFogCoorddv_Impl, glFogCoorddv);\n        GLELoadProc(glFogCoordf_Impl, glFogCoordf);\n        GLELoadProc(glFogCoordfv_Impl, glFogCoordfv);\n        GLELoadProc(glMultiDrawArrays_Impl, glMultiDrawArrays);\n        GLELoadProc(glMultiDrawElements_Impl, glMultiDrawElements);\n        GLELoadProc(glPointParameterf_Impl, glPointParameterf);\n        GLELoadProc(glPointParameterfv_Impl, glPointParameterfv);\n        GLELoadProc(glPointParameteri_Impl, glPointParameteri);\n        GLELoadProc(glPointParameteriv_Impl, glPointParameteriv);\n        GLELoadProc(glSecondaryColor3b_Impl, glSecondaryColor3b);\n        GLELoadProc(glSecondaryColor3bv_Impl, glSecondaryColor3bv);\n        GLELoadProc(glSecondaryColor3d_Impl, glSecondaryColor3d);\n        GLELoadProc(glSecondaryColor3dv_Impl, glSecondaryColor3dv);\n        GLELoadProc(glSecondaryColor3f_Impl, glSecondaryColor3f);\n        GLELoadProc(glSecondaryColor3fv_Impl, glSecondaryColor3fv);\n        GLELoadProc(glSecondaryColor3i_Impl, glSecondaryColor3i);\n        GLELoadProc(glSecondaryColor3iv_Impl, glSecondaryColor3iv);\n        GLELoadProc(glSecondaryColor3s_Impl, glSecondaryColor3s);\n        GLELoadProc(glSecondaryColor3sv_Impl, glSecondaryColor3sv);\n        GLELoadProc(glSecondaryColor3ub_Impl, glSecondaryColor3ub);\n        GLELoadProc(glSecondaryColor3ubv_Impl, glSecondaryColor3ubv);\n        GLELoadProc(glSecondaryColor3ui_Impl, glSecondaryColor3ui);\n        GLELoadProc(glSecondaryColor3uiv_Impl, glSecondaryColor3uiv);\n        GLELoadProc(glSecondaryColor3us_Impl, glSecondaryColor3us);\n        GLELoadProc(glSecondaryColor3usv_Impl, glSecondaryColor3usv);\n        GLELoadProc(glSecondaryColorPointer_Impl, glSecondaryColorPointer);\n        GLELoadProc(glWindowPos2d_Impl, glWindowPos2d);\n        GLELoadProc(glWindowPos2dv_Impl, glWindowPos2dv);\n        GLELoadProc(glWindowPos2f_Impl, glWindowPos2f);\n        GLELoadProc(glWindowPos2fv_Impl, glWindowPos2fv);\n        GLELoadProc(glWindowPos2i_Impl, glWindowPos2i);\n        GLELoadProc(glWindowPos2iv_Impl, glWindowPos2iv);\n        GLELoadProc(glWindowPos2s_Impl, glWindowPos2s);\n        GLELoadProc(glWindowPos2sv_Impl, glWindowPos2sv);\n        GLELoadProc(glWindowPos3d_Impl, glWindowPos3d);\n        GLELoadProc(glWindowPos3dv_Impl, glWindowPos3dv);\n        GLELoadProc(glWindowPos3f_Impl, glWindowPos3f);\n        GLELoadProc(glWindowPos3fv_Impl, glWindowPos3fv);\n        GLELoadProc(glWindowPos3i_Impl, glWindowPos3i);\n        GLELoadProc(glWindowPos3iv_Impl, glWindowPos3iv);\n        GLELoadProc(glWindowPos3s_Impl, glWindowPos3s);\n        GLELoadProc(glWindowPos3sv_Impl, glWindowPos3sv);\n\n        // GL_VERSION_1_5\n        GLELoadProc(glBeginQuery_Impl, glBeginQuery);\n        GLELoadProc(glBindBuffer_Impl, glBindBuffer);\n        GLELoadProc(glBufferData_Impl, glBufferData);\n        GLELoadProc(glBufferSubData_Impl, glBufferSubData);\n        GLELoadProc(glDeleteBuffers_Impl, glDeleteBuffers);\n        GLELoadProc(glDeleteQueries_Impl, glDeleteQueries);\n        GLELoadProc(glEndQuery_Impl, glEndQuery);\n        GLELoadProc(glGenBuffers_Impl, glGenBuffers);\n        GLELoadProc(glGenQueries_Impl, glGenQueries);\n        GLELoadProc(glGetBufferParameteriv_Impl, glGetBufferParameteriv);\n        GLELoadProc(glGetBufferPointerv_Impl, glGetBufferPointerv);\n        GLELoadProc(glGetBufferSubData_Impl, glGetBufferSubData);\n        GLELoadProc(glGetQueryObjectiv_Impl, glGetQueryObjectiv);\n        GLELoadProc(glGetQueryObjectuiv_Impl, glGetQueryObjectuiv);\n        GLELoadProc(glGetQueryiv_Impl, glGetQueryiv);\n        GLELoadProc(glIsBuffer_Impl, glIsBuffer);\n        GLELoadProc(glIsQuery_Impl, glIsQuery);\n        GLELoadProc(glMapBuffer_Impl, glMapBuffer);\n        GLELoadProc(glUnmapBuffer_Impl, glUnmapBuffer);\n\n        // GL_VERSION_2_0\n        GLELoadProc(glAttachShader_Impl, glAttachShader);\n        GLELoadProc(glBindAttribLocation_Impl, glBindAttribLocation);\n        GLELoadProc(glBlendEquationSeparate_Impl, glBlendEquationSeparate);\n        GLELoadProc(glCompileShader_Impl, glCompileShader);\n        GLELoadProc(glCreateProgram_Impl, glCreateProgram);\n        GLELoadProc(glCreateShader_Impl, glCreateShader);\n        GLELoadProc(glDeleteProgram_Impl, glDeleteProgram);\n        GLELoadProc(glDeleteShader_Impl, glDeleteShader);\n        GLELoadProc(glDetachShader_Impl, glDetachShader);\n        GLELoadProc(glDisableVertexAttribArray_Impl, glDisableVertexAttribArray);\n        GLELoadProc(glDrawBuffers_Impl, glDrawBuffers);\n        GLELoadProc(glEnableVertexAttribArray_Impl, glEnableVertexAttribArray);\n        GLELoadProc(glGetActiveAttrib_Impl, glGetActiveAttrib);\n        GLELoadProc(glGetActiveUniform_Impl, glGetActiveUniform);\n        GLELoadProc(glGetAttachedShaders_Impl, glGetAttachedShaders);\n        GLELoadProc(glGetAttribLocation_Impl, glGetAttribLocation);\n        GLELoadProc(glGetProgramInfoLog_Impl, glGetProgramInfoLog);\n        GLELoadProc(glGetProgramiv_Impl, glGetProgramiv);\n        GLELoadProc(glGetShaderInfoLog_Impl, glGetShaderInfoLog);\n        GLELoadProc(glGetShaderSource_Impl, glGetShaderSource);\n        GLELoadProc(glGetShaderiv_Impl, glGetShaderiv);\n        GLELoadProc(glGetUniformLocation_Impl, glGetUniformLocation);\n        GLELoadProc(glGetUniformfv_Impl, glGetUniformfv);\n        GLELoadProc(glGetUniformiv_Impl, glGetUniformiv);\n        GLELoadProc(glGetVertexAttribPointerv_Impl, glGetVertexAttribPointerv);\n        GLELoadProc(glGetVertexAttribdv_Impl, glGetVertexAttribdv);\n        GLELoadProc(glGetVertexAttribfv_Impl, glGetVertexAttribfv);\n        GLELoadProc(glGetVertexAttribiv_Impl, glGetVertexAttribiv);\n        GLELoadProc(glIsProgram_Impl, glIsProgram);\n        GLELoadProc(glIsShader_Impl, glIsShader);\n        GLELoadProc(glLinkProgram_Impl, glLinkProgram);\n        GLELoadProc(glShaderSource_Impl, glShaderSource);\n        GLELoadProc(glStencilFuncSeparate_Impl, glStencilFuncSeparate);\n        GLELoadProc(glStencilMaskSeparate_Impl, glStencilMaskSeparate);\n        GLELoadProc(glStencilOpSeparate_Impl, glStencilOpSeparate);\n        GLELoadProc(glUniform1f_Impl, glUniform1f);\n        GLELoadProc(glUniform1fv_Impl, glUniform1fv);\n        GLELoadProc(glUniform1i_Impl, glUniform1i);\n        GLELoadProc(glUniform1iv_Impl, glUniform1iv);\n        GLELoadProc(glUniform2f_Impl, glUniform2f);\n        GLELoadProc(glUniform2fv_Impl, glUniform2fv);\n        GLELoadProc(glUniform2i_Impl, glUniform2i);\n        GLELoadProc(glUniform2iv_Impl, glUniform2iv);\n        GLELoadProc(glUniform3f_Impl, glUniform3f);\n        GLELoadProc(glUniform3fv_Impl, glUniform3fv);\n        GLELoadProc(glUniform3i_Impl, glUniform3i);\n        GLELoadProc(glUniform3iv_Impl, glUniform3iv);\n        GLELoadProc(glUniform4f_Impl, glUniform4f);\n        GLELoadProc(glUniform4fv_Impl, glUniform4fv);\n        GLELoadProc(glUniform4i_Impl, glUniform4i);\n        GLELoadProc(glUniform4iv_Impl, glUniform4iv);\n        GLELoadProc(glUniformMatrix2fv_Impl, glUniformMatrix2fv);\n        GLELoadProc(glUniformMatrix3fv_Impl, glUniformMatrix3fv);\n        GLELoadProc(glUniformMatrix4fv_Impl, glUniformMatrix4fv);\n        GLELoadProc(glUseProgram_Impl, glUseProgram);\n        GLELoadProc(glValidateProgram_Impl, glValidateProgram);\n        GLELoadProc(glVertexAttrib1d_Impl, glVertexAttrib1d);\n        GLELoadProc(glVertexAttrib1dv_Impl, glVertexAttrib1dv);\n        GLELoadProc(glVertexAttrib1f_Impl, glVertexAttrib1f);\n        GLELoadProc(glVertexAttrib1fv_Impl, glVertexAttrib1fv);\n        GLELoadProc(glVertexAttrib1s_Impl, glVertexAttrib1s);\n        GLELoadProc(glVertexAttrib1sv_Impl, glVertexAttrib1sv);\n        GLELoadProc(glVertexAttrib2d_Impl, glVertexAttrib2d);\n        GLELoadProc(glVertexAttrib2dv_Impl, glVertexAttrib2dv);\n        GLELoadProc(glVertexAttrib2f_Impl, glVertexAttrib2f);\n        GLELoadProc(glVertexAttrib2fv_Impl, glVertexAttrib2fv);\n        GLELoadProc(glVertexAttrib2s_Impl, glVertexAttrib2s);\n        GLELoadProc(glVertexAttrib2sv_Impl, glVertexAttrib2sv);\n        GLELoadProc(glVertexAttrib3d_Impl, glVertexAttrib3d);\n        GLELoadProc(glVertexAttrib3dv_Impl, glVertexAttrib3dv);\n        GLELoadProc(glVertexAttrib3f_Impl, glVertexAttrib3f);\n        GLELoadProc(glVertexAttrib3fv_Impl, glVertexAttrib3fv);\n        GLELoadProc(glVertexAttrib3s_Impl, glVertexAttrib3s);\n        GLELoadProc(glVertexAttrib3sv_Impl, glVertexAttrib3sv);\n        GLELoadProc(glVertexAttrib4Nbv_Impl, glVertexAttrib4Nbv);\n        GLELoadProc(glVertexAttrib4Niv_Impl, glVertexAttrib4Niv);\n        GLELoadProc(glVertexAttrib4Nsv_Impl, glVertexAttrib4Nsv);\n        GLELoadProc(glVertexAttrib4Nub_Impl, glVertexAttrib4Nub);\n        GLELoadProc(glVertexAttrib4Nubv_Impl, glVertexAttrib4Nubv);\n        GLELoadProc(glVertexAttrib4Nuiv_Impl, glVertexAttrib4Nuiv);\n        GLELoadProc(glVertexAttrib4Nusv_Impl, glVertexAttrib4Nusv);\n        GLELoadProc(glVertexAttrib4bv_Impl, glVertexAttrib4bv);\n        GLELoadProc(glVertexAttrib4d_Impl, glVertexAttrib4d);\n        GLELoadProc(glVertexAttrib4dv_Impl, glVertexAttrib4dv);\n        GLELoadProc(glVertexAttrib4f_Impl, glVertexAttrib4f);\n        GLELoadProc(glVertexAttrib4fv_Impl, glVertexAttrib4fv);\n        GLELoadProc(glVertexAttrib4iv_Impl, glVertexAttrib4iv);\n        GLELoadProc(glVertexAttrib4s_Impl, glVertexAttrib4s);\n        GLELoadProc(glVertexAttrib4sv_Impl, glVertexAttrib4sv);\n        GLELoadProc(glVertexAttrib4ubv_Impl, glVertexAttrib4ubv);\n        GLELoadProc(glVertexAttrib4uiv_Impl, glVertexAttrib4uiv);\n        GLELoadProc(glVertexAttrib4usv_Impl, glVertexAttrib4usv);\n        GLELoadProc(glVertexAttribPointer_Impl, glVertexAttribPointer);\n\n        // GL_VERSION_2_1\n        GLELoadProc(glUniformMatrix2x3fv_Impl, glUniformMatrix2x3fv);\n        GLELoadProc(glUniformMatrix2x4fv_Impl, glUniformMatrix2x4fv);\n        GLELoadProc(glUniformMatrix3x2fv_Impl, glUniformMatrix3x2fv);\n        GLELoadProc(glUniformMatrix3x4fv_Impl, glUniformMatrix3x4fv);\n        GLELoadProc(glUniformMatrix4x2fv_Impl, glUniformMatrix4x2fv);\n        GLELoadProc(glUniformMatrix4x3fv_Impl, glUniformMatrix4x3fv);\n\n        // GL_VERSION_3_0\n        GLELoadProc(glBeginConditionalRender_Impl, glBeginConditionalRender);\n        GLELoadProc(glBeginTransformFeedback_Impl, glBeginTransformFeedback);\n        GLELoadProc(glBindFragDataLocation_Impl, glBindFragDataLocation);\n        GLELoadProc(glClampColor_Impl, glClampColor);\n        GLELoadProc(glClearBufferfi_Impl, glClearBufferfi);\n        GLELoadProc(glClearBufferfv_Impl, glClearBufferfv);\n        GLELoadProc(glClearBufferiv_Impl, glClearBufferiv);\n        GLELoadProc(glClearBufferuiv_Impl, glClearBufferuiv);\n        GLELoadProc(glColorMaski_Impl, glColorMaski);\n        GLELoadProc(glDisablei_Impl, glDisablei);\n        GLELoadProc(glEnablei_Impl, glEnablei);\n        GLELoadProc(glEndConditionalRender_Impl, glEndConditionalRender);\n        GLELoadProc(glEndTransformFeedback_Impl, glEndTransformFeedback);\n        GLELoadProc(glBindBufferRange_Impl, glBindBufferRange);\n        GLELoadProc(glBindBufferBase_Impl, glBindBufferBase);\n        GLELoadProc(glGetBooleani_v_Impl, glGetBooleani_v);\n        GLELoadProc(glGetIntegeri_v_Impl, glGetIntegeri_v);\n        GLELoadProc(glGetFragDataLocation_Impl, glGetFragDataLocation);\n        GLELoadProc(glGetStringi_Impl, glGetStringi);\n        GLELoadProc(glGetTexParameterIiv_Impl, glGetTexParameterIiv);\n        GLELoadProc(glGetTexParameterIuiv_Impl, glGetTexParameterIuiv);\n        GLELoadProc(glGetTransformFeedbackVarying_Impl, glGetTransformFeedbackVarying);\n        GLELoadProc(glGetUniformuiv_Impl, glGetUniformuiv);\n        GLELoadProc(glGetVertexAttribIiv_Impl, glGetVertexAttribIiv);\n        GLELoadProc(glGetVertexAttribIuiv_Impl, glGetVertexAttribIuiv);\n        GLELoadProc(glIsEnabledi_Impl, glIsEnabledi);\n        GLELoadProc(glTexParameterIiv_Impl, glTexParameterIiv);\n        GLELoadProc(glTexParameterIuiv_Impl, glTexParameterIuiv);\n        GLELoadProc(glTransformFeedbackVaryings_Impl, glTransformFeedbackVaryings);\n        GLELoadProc(glUniform1ui_Impl, glUniform1ui);\n        GLELoadProc(glUniform1uiv_Impl, glUniform1uiv);\n        GLELoadProc(glUniform2ui_Impl, glUniform2ui);\n        GLELoadProc(glUniform2uiv_Impl, glUniform2uiv);\n        GLELoadProc(glUniform3ui_Impl, glUniform3ui);\n        GLELoadProc(glUniform3uiv_Impl, glUniform3uiv);\n        GLELoadProc(glUniform4ui_Impl, glUniform4ui);\n        GLELoadProc(glUniform4uiv_Impl, glUniform4uiv);\n        GLELoadProc(glVertexAttribI1i_Impl, glVertexAttribI1i);\n        GLELoadProc(glVertexAttribI1iv_Impl, glVertexAttribI1iv);\n        GLELoadProc(glVertexAttribI1ui_Impl, glVertexAttribI1ui);\n        GLELoadProc(glVertexAttribI1uiv_Impl, glVertexAttribI1uiv);\n        GLELoadProc(glVertexAttribI2i_Impl, glVertexAttribI2i);\n        GLELoadProc(glVertexAttribI2iv_Impl, glVertexAttribI2iv);\n        GLELoadProc(glVertexAttribI2ui_Impl, glVertexAttribI2ui);\n        GLELoadProc(glVertexAttribI2uiv_Impl, glVertexAttribI2uiv);\n        GLELoadProc(glVertexAttribI3i_Impl, glVertexAttribI3i);\n        GLELoadProc(glVertexAttribI3iv_Impl, glVertexAttribI3iv);\n        GLELoadProc(glVertexAttribI3ui_Impl, glVertexAttribI3ui);\n        GLELoadProc(glVertexAttribI3uiv_Impl, glVertexAttribI3uiv);\n        GLELoadProc(glVertexAttribI4bv_Impl, glVertexAttribI4bv);\n        GLELoadProc(glVertexAttribI4i_Impl, glVertexAttribI4i);\n        GLELoadProc(glVertexAttribI4iv_Impl, glVertexAttribI4iv);\n        GLELoadProc(glVertexAttribI4sv_Impl, glVertexAttribI4sv);\n        GLELoadProc(glVertexAttribI4ubv_Impl, glVertexAttribI4ubv);\n        GLELoadProc(glVertexAttribI4ui_Impl, glVertexAttribI4ui);\n        GLELoadProc(glVertexAttribI4uiv_Impl, glVertexAttribI4uiv);\n        GLELoadProc(glVertexAttribI4usv_Impl, glVertexAttribI4usv);\n        GLELoadProc(glVertexAttribIPointer_Impl, glVertexAttribIPointer);\n\n        // GL_VERSION_3_1\n        GLELoadProc(glDrawArraysInstanced_Impl, glDrawArraysInstanced);\n        GLELoadProc(glDrawElementsInstanced_Impl, glDrawElementsInstanced);\n        GLELoadProc(glPrimitiveRestartIndex_Impl, glPrimitiveRestartIndex);\n        GLELoadProc(glTexBuffer_Impl, glTexBuffer);\n\n        // GL_VERSION_3_2\n        GLELoadProc(glFramebufferTexture_Impl, glFramebufferTexture);\n        GLELoadProc(glGetBufferParameteri64v_Impl, glGetBufferParameteri64v);\n        GLELoadProc(glGetInteger64i_v_Impl, glGetInteger64i_v);\n\n        // GL_VERSION_3_3\n        GLELoadProc(glVertexAttribDivisor_Impl, glVertexAttribDivisor);\n\n        // GL_VERSION_4_0\n        GLELoadProc(glBlendEquationSeparatei_Impl, glBlendEquationSeparatei);\n        GLELoadProc(glBlendEquationi_Impl, glBlendEquationi);\n        GLELoadProc(glBlendFuncSeparatei_Impl, glBlendFuncSeparatei);\n        GLELoadProc(glBlendFunci_Impl, glBlendFunci);\n        GLELoadProc(glMinSampleShading_Impl, glMinSampleShading);\n\n        // GL_AMD_debug_output\n        GLELoadProc(glDebugMessageCallbackAMD_Impl, glDebugMessageCallbackAMD);\n        GLELoadProc(glDebugMessageEnableAMD_Impl, glDebugMessageEnableAMD);\n        GLELoadProc(glDebugMessageInsertAMD_Impl, glDebugMessageInsertAMD);\n        GLELoadProc(glGetDebugMessageLogAMD_Impl, glGetDebugMessageLogAMD);\n\n      #if defined(GLE_CGL_ENABLED)\n        // GL_APPLE_element_array\n        GLELoadProc(glDrawElementArrayAPPLE_Impl, glDrawElementArrayAPPLE);\n        GLELoadProc(glDrawRangeElementArrayAPPLE_Impl, glDrawRangeElementArrayAPPLE);\n        GLELoadProc(glElementPointerAPPLE_Impl, glElementPointerAPPLE);\n        GLELoadProc(glMultiDrawElementArrayAPPLE_Impl, glMultiDrawElementArrayAPPLE);\n        GLELoadProc(glMultiDrawRangeElementArrayAPPLE_Impl, glMultiDrawRangeElementArrayAPPLE);\n\n        // GL_APPLE_fence\n        GLELoadProc(glDeleteFencesAPPLE_Impl, glDeleteFencesAPPLE);\n        GLELoadProc(glFinishFenceAPPLE_Impl, glFinishFenceAPPLE);\n        GLELoadProc(glFinishObjectAPPLE_Impl, glFinishObjectAPPLE);\n        GLELoadProc(glGenFencesAPPLE_Impl, glGenFencesAPPLE);\n        GLELoadProc(glIsFenceAPPLE_Impl, glIsFenceAPPLE);\n        GLELoadProc(glSetFenceAPPLE_Impl, glSetFenceAPPLE);\n        GLELoadProc(glTestFenceAPPLE_Impl, glTestFenceAPPLE);\n        GLELoadProc(glTestObjectAPPLE_Impl, glTestObjectAPPLE);\n\n        // GL_APPLE_flush_buffer_range\n        GLELoadProc(glBufferParameteriAPPLE_Impl, glMultiDrawRangeElementArrayAPPLE);\n        GLELoadProc(glFlushMappedBufferRangeAPPLE_Impl, glFlushMappedBufferRangeAPPLE);\n\n        // GL_APPLE_object_purgeable\n        GLELoadProc(glGetObjectParameterivAPPLE_Impl, glGetObjectParameterivAPPLE);\n        GLELoadProc(glObjectPurgeableAPPLE_Impl, glObjectPurgeableAPPLE);\n        GLELoadProc(glObjectUnpurgeableAPPLE_Impl, glObjectUnpurgeableAPPLE);\n\n        // GL_APPLE_texture_range\n        GLELoadProc(glGetTexParameterPointervAPPLE_Impl, glGetTexParameterPointervAPPLE);\n        GLELoadProc(glTextureRangeAPPLE_Impl, glTextureRangeAPPLE);\n\n        // GL_APPLE_vertex_array_object\n        GLELoadProc(glBindVertexArrayAPPLE_Impl, glBindVertexArrayAPPLE);\n        GLELoadProc(glDeleteVertexArraysAPPLE_Impl, glDeleteVertexArraysAPPLE);\n        GLELoadProc(glGenVertexArraysAPPLE_Impl, glGenVertexArraysAPPLE);\n        GLELoadProc(glIsVertexArrayAPPLE_Impl, glIsVertexArrayAPPLE);\n\n        // GL_APPLE_vertex_array_range\n        GLELoadProc(glFlushVertexArrayRangeAPPLE_Impl, glFlushVertexArrayRangeAPPLE);\n        GLELoadProc(glVertexArrayParameteriAPPLE_Impl, glVertexArrayParameteriAPPLE);\n        GLELoadProc(glVertexArrayRangeAPPLE_Impl, glVertexArrayRangeAPPLE);\n\n        // GL_APPLE_vertex_program_evaluators\n        GLELoadProc(glDisableVertexAttribAPPLE_Impl, glDisableVertexAttribAPPLE);\n        GLELoadProc(glEnableVertexAttribAPPLE_Impl, glEnableVertexAttribAPPLE);\n        GLELoadProc(glIsVertexAttribEnabledAPPLE_Impl, glIsVertexAttribEnabledAPPLE);\n        GLELoadProc(glMapVertexAttrib1dAPPLE_Impl, glMapVertexAttrib1dAPPLE);\n        GLELoadProc(glMapVertexAttrib1fAPPLE_Impl, glMapVertexAttrib1fAPPLE);\n        GLELoadProc(glMapVertexAttrib2dAPPLE_Impl, glMapVertexAttrib2dAPPLE);\n        GLELoadProc(glMapVertexAttrib2fAPPLE_Impl, glMapVertexAttrib2fAPPLE);\n        \n      #endif // GLE_CGL_ENABLED\n      \n        // GL_ARB_debug_output\n        GLELoadProc(glDebugMessageCallbackARB_Impl, glDebugMessageCallbackARB);\n        GLELoadProc(glDebugMessageControlARB_Impl, glDebugMessageControlARB);\n        GLELoadProc(glDebugMessageInsertARB_Impl, glDebugMessageInsertARB);\n        GLELoadProc(glGetDebugMessageLogARB_Impl, glGetDebugMessageLogARB);\n        \n        // GL_ARB_ES2_compatibility\n        GLELoadProc(glClearDepthf_Impl, glClearDepthf);\n        GLELoadProc(glDepthRangef_Impl, glDepthRangef);\n        GLELoadProc(glGetShaderPrecisionFormat_Impl, glGetShaderPrecisionFormat);\n        GLELoadProc(glReleaseShaderCompiler_Impl, glReleaseShaderCompiler);\n        GLELoadProc(glShaderBinary_Impl, glShaderBinary);\n\n        // GL_ARB_framebuffer_object\n        GLELoadProc(glBindFramebuffer_Impl, glBindFramebuffer);\n        GLELoadProc(glBindRenderbuffer_Impl, glBindRenderbuffer);\n        GLELoadProc(glBlitFramebuffer_Impl, glBlitFramebuffer);\n        GLELoadProc(glCheckFramebufferStatus_Impl, glCheckFramebufferStatus);\n        GLELoadProc(glDeleteFramebuffers_Impl, glDeleteFramebuffers);\n        GLELoadProc(glDeleteRenderbuffers_Impl, glDeleteRenderbuffers);\n        GLELoadProc(glFramebufferRenderbuffer_Impl, glFramebufferRenderbuffer);\n        GLELoadProc(glFramebufferTexture1D_Impl, glFramebufferTexture1D);\n        GLELoadProc(glFramebufferTexture2D_Impl, glFramebufferTexture2D);\n        GLELoadProc(glFramebufferTexture3D_Impl, glFramebufferTexture3D);\n        GLELoadProc(glFramebufferTextureLayer_Impl, glFramebufferTextureLayer);\n        GLELoadProc(glGenFramebuffers_Impl, glGenFramebuffers);\n        GLELoadProc(glGenRenderbuffers_Impl, glGenRenderbuffers);\n        GLELoadProc(glGenerateMipmap_Impl, glGenerateMipmap);\n        GLELoadProc(glGetFramebufferAttachmentParameteriv_Impl, glGetFramebufferAttachmentParameteriv);\n        GLELoadProc(glGetRenderbufferParameteriv_Impl, glGetRenderbufferParameteriv);\n        GLELoadProc(glIsFramebuffer_Impl, glIsFramebuffer);\n        GLELoadProc(glIsRenderbuffer_Impl, glIsRenderbuffer);\n        GLELoadProc(glRenderbufferStorage_Impl, glRenderbufferStorage);\n        GLELoadProc(glRenderbufferStorageMultisample_Impl, glRenderbufferStorageMultisample);\n\n        if(!glBindFramebuffer_Impl) // This will rarely if ever be the case in practice with modern computers and drivers.\n        {\n            // See if we can map GL_EXT_framebuffer_object to GL_ARB_framebuffer_object. The former is basically a subset of the latter, but we use only that subset.\n            GLELoadProc(glBindFramebuffer_Impl, glBindFramebufferEXT);\n            GLELoadProc(glBindRenderbuffer_Impl, glBindRenderbufferEXT);\n          //GLELoadProc(glBlitFramebuffer_Impl, glBlitFramebufferEXT (nonexistent));\n            GLELoadProc(glCheckFramebufferStatus_Impl, glCheckFramebufferStatusEXT);\n            GLELoadProc(glDeleteFramebuffers_Impl, glDeleteFramebuffersEXT);\n            GLELoadProc(glDeleteRenderbuffers_Impl, glDeleteRenderbuffersEXT);\n            GLELoadProc(glFramebufferRenderbuffer_Impl, glFramebufferRenderbufferEXT);\n            GLELoadProc(glFramebufferTexture1D_Impl, glFramebufferTexture1DEXT);\n            GLELoadProc(glFramebufferTexture2D_Impl, glFramebufferTexture2DEXT);\n            GLELoadProc(glFramebufferTexture3D_Impl, glFramebufferTexture3DEXT);\n          //GLELoadProc(glFramebufferTextureLayer_Impl, glFramebufferTextureLayerEXT (nonexistent));\n            GLELoadProc(glGenFramebuffers_Impl, glGenFramebuffersEXT);\n            GLELoadProc(glGenRenderbuffers_Impl, glGenRenderbuffersEXT);\n            GLELoadProc(glGenerateMipmap_Impl, glGenerateMipmapEXT);\n            GLELoadProc(glGetFramebufferAttachmentParameteriv_Impl, glGetFramebufferAttachmentParameterivEXT);\n            GLELoadProc(glGetRenderbufferParameteriv_Impl, glGetRenderbufferParameterivEXT);\n            GLELoadProc(glIsFramebuffer_Impl, glIsFramebufferEXT);\n            GLELoadProc(glIsRenderbuffer_Impl, glIsRenderbufferEXT);\n            GLELoadProc(glRenderbufferStorage_Impl, glRenderbufferStorageEXT);\n          //GLELoadProc(glRenderbufferStorageMultisample_Impl, glRenderbufferStorageMultisampleEXT (nonexistent));\n        }\n        \n        // GL_ARB_texture_multisample\n        GLELoadProc(glGetMultisamplefv_Impl, glGetMultisamplefv);\n        GLELoadProc(glSampleMaski_Impl, glSampleMaski);\n        GLELoadProc(glTexImage2DMultisample_Impl, glTexImage2DMultisample);\n        GLELoadProc(glTexImage3DMultisample_Impl, glTexImage3DMultisample);\n        \n        // GL_ARB_timer_query\n        GLELoadProc(glGetQueryObjecti64v_Impl, glGetQueryObjecti64v);\n        GLELoadProc(glGetQueryObjectui64v_Impl, glGetQueryObjectui64v);\n        GLELoadProc(glQueryCounter_Impl, glQueryCounter);\n\n        // GL_ARB_vertex_array_object\n        GLELoadProc(glBindVertexArray_Impl, glBindVertexArray);\n        GLELoadProc(glDeleteVertexArrays_Impl, glDeleteVertexArrays);\n        GLELoadProc(glGenVertexArrays_Impl, glGenVertexArrays);\n        GLELoadProc(glIsVertexArray_Impl, glIsVertexArray);\n\n        #if defined(GLE_CGL_ENABLED) // Apple OpenGL...\n            if(WholeVersion < 302) // It turns out that Apple OpenGL versions prior to 3.2 have glBindVertexArray, etc. but they silently fail by default. So always use the APPLE version.\n            {\n                glBindVertexArray_Impl    = glBindVertexArrayAPPLE_Impl;\n                glDeleteVertexArrays_Impl = glDeleteVertexArraysAPPLE_Impl;\n                glGenVertexArrays_Impl    = (OVRTypeof(glGenVertexArrays_Impl)) glGenVertexArraysAPPLE_Impl; // There is a const cast of the arrays argument here due to a slight difference in the Apple behavior. For our purposes it should be OK.\n                glIsVertexArray_Impl      = glIsVertexArrayAPPLE_Impl;\n                \n                if(glBindVertexArray_Impl)\n                    gle_ARB_vertex_array_object = true; // We are routing the APPLE version through our version, with the assumption that we use the ARB version the same as we would use the APPLE version.\n            }\n        #endif\n        \n        // GL_EXT_draw_buffers2\n        GLELoadProc(glColorMaskIndexedEXT_Impl, glColorMaskIndexedEXT);\n        GLELoadProc(glDisableIndexedEXT_Impl, glDisableIndexedEXT);\n        GLELoadProc(glEnableIndexedEXT_Impl, glEnableIndexedEXT);\n        GLELoadProc(glGetBooleanIndexedvEXT_Impl, glGetBooleanIndexedvEXT);\n        GLELoadProc(glGetIntegerIndexedvEXT_Impl, glGetIntegerIndexedvEXT);\n        GLELoadProc(glIsEnabledIndexedEXT_Impl, glIsEnabledIndexedEXT);\n\n        // GL_KHR_debug\n        GLELoadProc(glDebugMessageCallback_Impl, glDebugMessageCallback);\n        GLELoadProc(glDebugMessageControl_Impl, glDebugMessageControl);\n        GLELoadProc(glDebugMessageInsert_Impl, glDebugMessageInsert);\n        GLELoadProc(glGetDebugMessageLog_Impl, glGetDebugMessageLog);\n        GLELoadProc(glGetObjectLabel_Impl, glGetObjectLabel);\n        GLELoadProc(glGetObjectPtrLabel_Impl, glGetObjectPtrLabel);\n        GLELoadProc(glObjectLabel_Impl, glObjectLabel);\n        GLELoadProc(glObjectPtrLabel_Impl, glObjectPtrLabel);\n        GLELoadProc(glPopDebugGroup_Impl, glPopDebugGroup);\n        GLELoadProc(glPushDebugGroup_Impl, glPushDebugGroup);\n\n        // GL_WIN_swap_hint\n        GLELoadProc(glAddSwapHintRectWIN_Impl, glAddSwapHintRectWIN);\n    }\n    \n\n\n    OVR_DISABLE_MSVC_WARNING(4510 4512 4610) // default constructor could not be generated,\n    struct ValueStringPair\n    {\n        bool& IsPresent;\n        const char* ExtensionName;\n    };\n\n\n    // Helper function for InitExtensionSupport.\n    static void CheckExtensions(ValueStringPair* pValueStringPairArray, size_t arrayCount, const char* extensions)\n    {\n        // We search the extesion list string for each of the individual extensions we are interested in. \n        // We do this by walking over the string and comparing each entry in turn to our array of entries of interest.\n        // Example string (with patholigical extra spaces): \"   ext1 ext2   ext3  \"\n           \n        char extension[64];\n        const char* p = extensions; // p points to the beginning of the current word\n        const char* pEnd;           // pEnd points to one-past the last character of the current word. It is where the trailing '\\0' of the string would be.\n           \n        while(*p)\n        {\n            while(*p == ' ') // Find the next word begin.\n                ++p;\n                \n            pEnd = p;\n               \n            while((*pEnd != '\\0') && (*pEnd != ' ')) // Find the next word end.\n                ++pEnd;\n               \n            if(((pEnd - p) > 0) && ((size_t)(pEnd - p) < OVR_ARRAY_COUNT(extension)))\n            {\n                memcpy(extension, p, pEnd - p); // To consider: Revise this code to directly read from p/pEnd instead of doing a memcpy.\n                extension[pEnd - p] = '\\0';\n                   \n                for(size_t i = 0; i < arrayCount; i++) // For each extension we are interested in...\n                {\n                    ValueStringPair& vsp = pValueStringPairArray[i];\n \n                    if(strcmp(extension, vsp.ExtensionName) == 0) // case-sensitive compare\n                        pValueStringPairArray[i].IsPresent = true;\n                }\n            }\n               \n            p = pEnd;\n        }\n    }\n\n\n    void OVR::GLEContext::InitExtensionSupport()\n    {\n        // It may be better in the long run to use a member STL map<const char*, bool>.\n        // It would make this loading code cleaner, though it would make lookups slower.\n\n        ValueStringPair vspArray[] =\n        {\n            { gle_AMD_debug_output, \"GL_AMD_debug_output\" },\n          #if defined(GLE_CGL_ENABLED)\n            { gle_APPLE_aux_depth_stencil, \"GL_APPLE_aux_depth_stencil\" },\n            { gle_APPLE_client_storage, \"GL_APPLE_client_storage\" },\n            { gle_APPLE_element_array, \"GL_APPLE_element_array\" },\n            { gle_APPLE_fence, \"GL_APPLE_fence\" },\n            { gle_APPLE_float_pixels, \"GL_APPLE_float_pixels\" },\n            { gle_APPLE_flush_buffer_range, \"GL_APPLE_flush_buffer_range\" },\n            { gle_APPLE_object_purgeable, \"GL_APPLE_object_purgeable\" },\n            { gle_APPLE_pixel_buffer, \"GL_APPLE_pixel_buffer\" },\n            { gle_APPLE_rgb_422, \"GL_APPLE_rgb_422\" },\n            { gle_APPLE_row_bytes, \"GL_APPLE_row_bytes\" },\n            { gle_APPLE_specular_vector, \"GL_APPLE_specular_vector\" },\n            { gle_APPLE_texture_range, \"GL_APPLE_texture_range\" },\n            { gle_APPLE_transform_hint, \"GL_APPLE_transform_hint\" },\n            { gle_APPLE_vertex_array_object, \"GL_APPLE_vertex_array_object\" },\n            { gle_APPLE_vertex_array_range, \"GL_APPLE_vertex_array_range\" },\n            { gle_APPLE_vertex_program_evaluators, \"GL_APPLE_vertex_program_evaluators\" },\n            { gle_APPLE_ycbcr_422, \"GL_APPLE_ycbcr_422\" },\n          #endif\n            { gle_ARB_debug_output, \"GL_ARB_debug_output\" },\n            { gle_ARB_depth_buffer_float, \"GL_ARB_depth_buffer_float\" },\n            { gle_ARB_ES2_compatibility, \"GL_ARB_ES2_compatibility\" },\n            { gle_ARB_framebuffer_object, \"GL_ARB_framebuffer_object\" },\n            { gle_ARB_framebuffer_object, \"GL_EXT_framebuffer_object\" },    // We map glBindFramebuffer, etc. to glBindFramebufferEXT, etc. if necessary\n            { gle_ARB_framebuffer_sRGB, \"GL_ARB_framebuffer_sRGB\" },\n            { gle_ARB_texture_multisample, \"GL_ARB_texture_multisample\" },\n            { gle_ARB_texture_non_power_of_two, \"GL_ARB_texture_non_power_of_two\" },\n            { gle_ARB_texture_rectangle, \"GL_ARB_texture_rectangle\" },\n            { gle_ARB_texture_rectangle, \"GL_EXT_texture_rectangle\" },  // We also check for GL_EXT_texture_rectangle and GL_NV_texture_rectangle.\n            { gle_ARB_texture_rectangle, \"GL_NV_texture_rectangle\" },\n            { gle_ARB_timer_query, \"GL_ARB_timer_query\" },\n            { gle_ARB_vertex_array_object, \"GL_ARB_vertex_array_object\" },\n            { gle_EXT_draw_buffers2, \"GL_EXT_draw_buffers2\" },\n            { gle_EXT_texture_compression_s3tc, \"GL_EXT_texture_compression_s3tc\" },\n            { gle_EXT_texture_filter_anisotropic, \"GL_EXT_texture_filter_anisotropic\" },\n            { gle_KHR_debug, \"GL_KHR_debug\" },\n            { gle_WIN_swap_hint, \"GL_WIN_swap_hint\" }\n            // Windows WGL, Unix GLX, and Apple CGL extensions are handled below, as they require different calls from glGetString(GL_EXTENSIONS).\n        };\n\n        // We cannot use glGetString(GL_EXTENSIONS) when an OpenGL core profile is active,\n        // as it's deprecated in favor of using OpenGL 3+ glGetStringi.\n        const char* extensions = (MajorVersion < 3) ? (const char*)glGetString(GL_EXTENSIONS) : \"\";\n       \n        if (extensions && *extensions) // If we have a space-delimited extension string to search for individual extensions...\n        {\n            OVR_DEBUG_LOG((\"GL_EXTENSIONS: %s\", (const char*)extensions));\n            CheckExtensions(vspArray, OVR_ARRAY_COUNT(vspArray), extensions); // Call our shared helper function for this.\n        }\n        else\n        {\n            if(MajorVersion >= 3) // If glGetIntegerv(GL_NUM_EXTENSIONS, ...) is supported...\n            {\n                // In this case we need to match an array of individual extensions against an array of\n                // externsions provided by glGetStringi. This is an O(n^2) operation, but at least we\n                // are doing this only once on startup. There are a few tricks we can employ to speed\n                // up the logic below, but they may not be worth much.\n               \n                GLint extensionCount = 0;\n                glGetIntegerv(GL_NUM_EXTENSIONS, &extensionCount);\n                GLenum err = glGetError();\n               \n                if(err == 0)\n                {\n                    #ifdef OVR_BUILD_DEBUG\n                    OVR::StringBuffer extensionsStr;\n                    #endif\n \n                    for(GLint e = 0; e != extensionCount; ++e) // For each extension supported...\n                    {\n                        const char* extension = (const char*)glGetStringi(GL_EXTENSIONS, (GLuint)e);\n \n                        if(extension) // glGetStringi returns NULL upon error.\n                        {\n                            #ifdef OVR_BUILD_DEBUG\n                                extensionsStr.AppendFormat(\" %s\", extension);\n                            #endif\n \n                            for(size_t i = 0; i < OVR_ARRAY_COUNT(vspArray); i++) // For each extension we are interested in...\n                            {\n                                ValueStringPair& vsp = vspArray[i];\n \n                                if(strcmp(extension, vsp.ExtensionName) == 0) // case-sensitive compare\n                                    vspArray[i].IsPresent = true;\n                            }\n                        }\n                        else\n                            break;\n                    }\n \n                    OVR_DEBUG_LOG((\"GL_EXTENSIONS: %s\", extensionsStr.ToCStr()));\n                }\n            }\n            // Else we have a problem: no means to read the extensions was successful.\n        }\n\n        #if defined(GLE_CGL_ENABLED)\n            // The following are built into Apple OpenGL 3.2+ (declared in <OpenGL/gl3.h>) and not identified as extensions.\n            // On other platforms (e.g. Windows) these are identified as extensions and are detected above.\n            if(WholeVersion >= 302)\n            {\n                gle_ARB_depth_buffer_float       = true;\n                gle_ARB_framebuffer_object       = true;\n                gle_ARB_framebuffer_sRGB         = true;\n                gle_ARB_texture_multisample      = true;\n                gle_ARB_texture_non_power_of_two = true;\n                gle_ARB_texture_rectangle        = true;\n                gle_ARB_vertex_array_object      = true;\n            }\n        #endif\n\n    } // GLEContext::InitExtensionSupport()\n        \n\n    void OVR::GLEContext::InitPlatformVersion()\n    {\n        #if defined(GLE_GLX_ENABLED)\n            const char* pGLXVersion = glXGetClientString(glXGetCurrentDisplay(), GLX_VERSION); // To do: Use a better mechanism to get the desired display.\n            sscanf(pGLXVersion, \"%d.%d\", &PlatformMajorVersion, &PlatformMinorVersion);\n\n        #elif defined(GLE_EGL_ENABLED)\n            const char* pEGLVersion = eglQueryString(eglGetDisplay(EGL_DEFAULT_DISPLAY), EGL_VERSION);\n            sscanf(pEGLVersion, \"%d.%d\", &PlatformMajorVersion, &PlatformMinorVersion);\n\n        #else\n            PlatformMajorVersion = 1;\n            PlatformMinorVersion = 0;\n            PlatformWholeVersion = 100;\n        #endif\n    }\n\n\n    void OVR::GLEContext::InitPlatformExtensionLoad()\n    {\n        #if defined(GLE_WGL_ENABLED)\n            // WGL\n            // We don't load these as function pointers but rather statically link to them.\n            // These need to be loaded via LoadLibrary instead of wglLoadLibrary.\n\n            #if 0\n        \tHINSTANCE hOpenGL = LoadLibraryW(L\"Opengl32.dll\");\n            if(hOpenGL)\n            {\n                wglCopyContext_Impl            = (OVRTypeof(wglCopyContext_Impl)) GetProcAddress(hOpenGL, \"wglCopyContext\");\n                wglCreateContext_Impl          = (OVRTypeof(wglCreateContext_Impl)) GetProcAddress(hOpenGL, \"wglCreateContext\");\n                wglCreateLayerContext_Impl     = (OVRTypeof(wglCreateLayerContext_Impl)) GetProcAddress(hOpenGL, \"wglCreateLayerContext\");\n                wglDeleteContext_Impl          = (OVRTypeof(wglDeleteContext_Impl)) GetProcAddress(hOpenGL, \"wglDeleteContext\");\n                wglGetCurrentContext_Impl      = (OVRTypeof(wglGetCurrentContext_Impl)) GetProcAddress(hOpenGL, \"wglGetCurrentContext\");\n                wglGetCurrentDC_Impl           = (OVRTypeof(wglGetCurrentDC_Impl)) GetProcAddress(hOpenGL, \"wglGetCurrentDC\");\n                wglGetProcAddress_Impl         = (OVRTypeof(wglGetProcAddress_Impl)) GetProcAddress(hOpenGL, \"wglGetProcAddress\");\n                wglMakeCurrent_Impl            = (OVRTypeof(wglMakeCurrent_Impl)) GetProcAddress(hOpenGL, \"wglMakeCurrent\");\n                wglShareLists_Impl             = (OVRTypeof(wglShareLists_Impl)) GetProcAddress(hOpenGL, \"wglShareLists\");\n                wglUseFontBitmapsA_Impl        = (OVRTypeof(wglUseFontBitmapsA_Impl)) GetProcAddress(hOpenGL, \"wglUseFontBitmapsA\");\n                wglUseFontBitmapsW_Impl        = (OVRTypeof(wglUseFontBitmapsW_Impl)) GetProcAddress(hOpenGL, \"wglUseFontBitmapsW\");\n                wglUseFontOutlinesA_Impl       = (OVRTypeof(wglUseFontOutlinesA_Impl)) GetProcAddress(hOpenGL, \"wglUseFontOutlinesA\");\n                wglUseFontOutlinesW_Impl       = (OVRTypeof(wglUseFontOutlinesW_Impl)) GetProcAddress(hOpenGL, \"wglUseFontOutlinesW\");\n                wglDescribeLayerPlane_Impl     = (OVRTypeof(wglDescribeLayerPlane_Impl)) GetProcAddress(hOpenGL, \"wglDescribeLayerPlane\");\n                wglSetLayerPaletteEntries_Impl = (OVRTypeof(wglSetLayerPaletteEntries_Impl)) GetProcAddress(hOpenGL, \"wglSetLayerPaletteEntries\");\n                wglGetLayerPaletteEntries_Impl = (OVRTypeof(wglGetLayerPaletteEntries_Impl)) GetProcAddress(hOpenGL, \"wglGetLayerPaletteEntries\");\n                wglRealizeLayerPalette_Impl    = (OVRTypeof(wglRealizeLayerPalette_Impl)) GetProcAddress(hOpenGL, \"wglRealizeLayerPalette\");\n                wglSwapLayerBuffers_Impl       = (OVRTypeof(wglSwapLayerBuffers_Impl)) GetProcAddress(hOpenGL, \"wglSwapLayerBuffers\");\n                wglSwapMultipleBuffers_Impl    = (OVRTypeof(wglSwapMultipleBuffers_Impl)) GetProcAddress(hOpenGL, \"wglSwapMultipleBuffers\");\n                FreeLibrary(hOpenGL);\n            }\n            #endif\n\n            // WGL_ARB_buffer_region\n            GLELoadProc(wglCreateBufferRegionARB_Impl, wglCreateBufferRegionARB);\n            GLELoadProc(wglDeleteBufferRegionARB_Impl, wglDeleteBufferRegionARB);\n            GLELoadProc(wglSaveBufferRegionARB_Impl, wglSaveBufferRegionARB);\n            GLELoadProc(wglRestoreBufferRegionARB_Impl, wglRestoreBufferRegionARB);\n\n            // WGL_ARB_extensions_string\n            GLELoadProc(wglGetExtensionsStringARB_Impl, wglGetExtensionsStringARB);\n\n            // WGL_ARB_pixel_format\n            GLELoadProc(wglGetPixelFormatAttribivARB_Impl, wglGetPixelFormatAttribivARB);\n            GLELoadProc(wglGetPixelFormatAttribfvARB_Impl, wglGetPixelFormatAttribfvARB);\n            GLELoadProc(wglChoosePixelFormatARB_Impl, wglChoosePixelFormatARB);\n\n            // WGL_ARB_make_current_read\n            GLELoadProc(wglMakeContextCurrentARB_Impl, wglMakeContextCurrentARB);\n            GLELoadProc(wglGetCurrentReadDCARB_Impl, wglGetCurrentReadDCARB);\n\n            // WGL_ARB_pbuffer\n            GLELoadProc(wglCreatePbufferARB_Impl, wglCreatePbufferARB);\n            GLELoadProc(wglGetPbufferDCARB_Impl, wglGetPbufferDCARB);\n            GLELoadProc(wglReleasePbufferDCARB_Impl, wglReleasePbufferDCARB);\n            GLELoadProc(wglDestroyPbufferARB_Impl, wglDestroyPbufferARB);\n            GLELoadProc(wglQueryPbufferARB_Impl, wglQueryPbufferARB);\n\n            // WGL_ARB_render_texture\n            GLELoadProc(wglBindTexImageARB_Impl, wglBindTexImageARB);\n            GLELoadProc(wglReleaseTexImageARB_Impl, wglReleaseTexImageARB);\n            GLELoadProc(wglSetPbufferAttribARB_Impl, wglSetPbufferAttribARB);\n\n            // WGL_NV_present_video\n            GLELoadProc(wglEnumerateVideoDevicesNV_Impl, wglEnumerateVideoDevicesNV);\n            GLELoadProc(wglBindVideoDeviceNV_Impl, wglBindVideoDeviceNV);\n            GLELoadProc(wglQueryCurrentContextNV_Impl, wglQueryCurrentContextNV);\n\n            // WGL_ARB_create_context\n            GLELoadProc(wglCreateContextAttribsARB_Impl, wglCreateContextAttribsARB);\n\n            // WGL_EXT_extensions_string\n            GLELoadProc(wglGetExtensionsStringEXT_Impl, wglGetExtensionsStringEXT);\n\n            // WGL_EXT_swap_control\n            GLELoadProc(wglGetSwapIntervalEXT_Impl, wglGetSwapIntervalEXT);\n            GLELoadProc(wglSwapIntervalEXT_Impl, wglSwapIntervalEXT);\n        \n            // WGL_OML_sync_control\n            GLELoadProc(wglGetSyncValuesOML_Impl, wglGetSyncValuesOML);\n            GLELoadProc(wglGetMscRateOML_Impl, wglGetMscRateOML);\n            GLELoadProc(wglSwapBuffersMscOML_Impl, wglSwapBuffersMscOML);\n            GLELoadProc(wglSwapLayerBuffersMscOML_Impl, wglSwapLayerBuffersMscOML);\n            GLELoadProc(wglWaitForMscOML_Impl, wglWaitForMscOML);\n            GLELoadProc(wglWaitForSbcOML_Impl, wglWaitForSbcOML);\n\n            // WGL_NV_video_output\n            GLELoadProc(wglGetVideoDeviceNV_Impl, wglGetVideoDeviceNV);\n            GLELoadProc(wglReleaseVideoDeviceNV_Impl, wglReleaseVideoDeviceNV);\n            GLELoadProc(wglBindVideoImageNV_Impl, wglBindVideoImageNV);\n            GLELoadProc(wglReleaseVideoImageNV_Impl, wglReleaseVideoImageNV);\n            GLELoadProc(wglSendPbufferToVideoNV_Impl, wglSendPbufferToVideoNV);\n            GLELoadProc(wglGetVideoInfoNV_Impl, wglGetVideoInfoNV);\n\n            // WGL_NV_swap_group\n            GLELoadProc(wglJoinSwapGroupNV_Impl, wglJoinSwapGroupNV);\n            GLELoadProc(wglBindSwapBarrierNV_Impl, wglBindSwapBarrierNV);\n            GLELoadProc(wglQuerySwapGroupNV_Impl, wglQuerySwapGroupNV);\n            GLELoadProc(wglQueryMaxSwapGroupsNV_Impl, wglQueryMaxSwapGroupsNV);\n            GLELoadProc(wglQueryFrameCountNV_Impl, wglQueryFrameCountNV);\n            GLELoadProc(wglResetFrameCountNV_Impl, wglResetFrameCountNV);\n\n            // WGL_NV_video_capture\n            GLELoadProc(wglBindVideoCaptureDeviceNV_Impl, wglBindVideoCaptureDeviceNV);\n            GLELoadProc(wglEnumerateVideoCaptureDevicesNV_Impl, wglEnumerateVideoCaptureDevicesNV);\n            GLELoadProc(wglLockVideoCaptureDeviceNV_Impl, wglLockVideoCaptureDeviceNV);\n            GLELoadProc(wglQueryVideoCaptureDeviceNV_Impl, wglQueryVideoCaptureDeviceNV);\n            GLELoadProc(wglReleaseVideoCaptureDeviceNV_Impl, wglReleaseVideoCaptureDeviceNV);\n\n            // WGL_NV_copy_image\n            GLELoadProc(wglCopyImageSubDataNV_Impl, wglCopyImageSubDataNV);\n\n            // WGL_NV_DX_interop\n            GLELoadProc(wglDXCloseDeviceNV_Impl, wglDXCloseDeviceNV);\n            GLELoadProc(wglDXLockObjectsNV_Impl, wglDXLockObjectsNV);\n            GLELoadProc(wglDXObjectAccessNV_Impl, wglDXObjectAccessNV);\n            GLELoadProc(wglDXOpenDeviceNV_Impl, wglDXOpenDeviceNV);\n            GLELoadProc(wglDXRegisterObjectNV_Impl, wglDXRegisterObjectNV);\n            GLELoadProc(wglDXSetResourceShareHandleNV_Impl, wglDXSetResourceShareHandleNV);\n            GLELoadProc(wglDXUnlockObjectsNV_Impl, wglDXUnlockObjectsNV);\n            GLELoadProc(wglDXUnregisterObjectNV_Impl, wglDXUnregisterObjectNV);\n\n        #elif defined(GLE_GLX_ENABLED)\n            // GLX_VERSION_1_1\n            // We don't create any pointers_Impl, because we assume these functions are always present.\n        \n            // GLX_VERSION_1_2\n            GLELoadProc(glXGetCurrentDisplay_Impl, glXGetCurrentDisplay);\n\n            // GLX_VERSION_1_3\n            GLELoadProc(glXChooseFBConfig_Impl, glXChooseFBConfig);\n            GLELoadProc(glXCreateNewContext_Impl, glXCreateNewContext);\n            GLELoadProc(glXCreatePbuffer_Impl, glXCreatePbuffer);\n            GLELoadProc(glXCreatePixmap_Impl, glXCreatePixmap);\n            GLELoadProc(glXCreateWindow_Impl, glXCreateWindow);\n            GLELoadProc(glXDestroyPbuffer_Impl, glXDestroyPbuffer);\n            GLELoadProc(glXDestroyPixmap_Impl, glXDestroyPixmap);\n            GLELoadProc(glXDestroyWindow_Impl, glXDestroyWindow);\n            GLELoadProc(glXGetCurrentReadDrawable_Impl, glXGetCurrentReadDrawable);\n            GLELoadProc(glXGetFBConfigAttrib_Impl, glXGetFBConfigAttrib);\n            GLELoadProc(glXGetFBConfigs_Impl, glXGetFBConfigs);\n            GLELoadProc(glXGetSelectedEvent_Impl, glXGetSelectedEvent);\n            GLELoadProc(glXGetVisualFromFBConfig_Impl, glXGetVisualFromFBConfig);\n            GLELoadProc(glXMakeContextCurrent_Impl, glXMakeContextCurrent);\n            GLELoadProc(glXQueryContext_Impl, glXQueryContext);\n            GLELoadProc(glXQueryDrawable_Impl, glXQueryDrawable);\n            GLELoadProc(glXSelectEvent_Impl, glXSelectEvent);\n\n            // GLX_VERSION_1_4\n            // Nothing to declare\n        \n            // GLX_ARB_create_context\n            GLELoadProc(glXCreateContextAttribsARB_Impl, glXCreateContextAttribsARB);\n\n            // GLX_EXT_swap_control\n            GLELoadProc(glXSwapIntervalEXT_Impl, glXSwapIntervalEXT);\n \n            // GLX_OML_sync_control\n            GLELoadProc(glXGetMscRateOML_Impl, glXGetMscRateOML);\n            GLELoadProc(glXGetSyncValuesOML_Impl, glXGetSyncValuesOML);\n            GLELoadProc(glXGetSyncValuesOML_Impl, glXSwapBuffersMscOML);\n            GLELoadProc(glXSwapBuffersMscOML_Impl, glXSwapBuffersMscOML);\n            GLELoadProc(glXWaitForSbcOML_Impl, glXWaitForSbcOML);\n\n            // GLX_MESA_swap_control\n            GLELoadProc(glXGetSwapIntervalMESA_Impl, glXGetSwapIntervalMESA);\n            GLELoadProc(glXSwapIntervalMESA_Impl, glXSwapIntervalMESA);\n        #endif\n    }\n\n\n    void OVR::GLEContext::InitPlatformExtensionSupport()\n    {\n        #if defined(GLE_WGL_ENABLED)\n            // We need to use wglGetExtensionsStringARB or wglGetExtensionsStringEXT as opposed to above with glGetString(GL_EXTENSIONS).\n            ValueStringPair vspWGLArray[] =\n            {\n                 { gle_WGL_ARB_buffer_region, \"WGL_ARB_buffer_region\" }\n                ,{ gle_WGL_ARB_create_context, \"WGL_ARB_create_context\" }\n                ,{ gle_WGL_ARB_create_context_profile, \"WGL_ARB_create_context_profile\" }\n                ,{ gle_WGL_ARB_create_context_robustness, \"WGL_ARB_create_context_robustness\" }\n                ,{ gle_WGL_ARB_extensions_string, \"WGL_ARB_extensions_string\" }\n                ,{ gle_WGL_ARB_framebuffer_sRGB, \"WGL_ARB_framebuffer_sRGB\" }\n                ,{ gle_WGL_ARB_framebuffer_sRGB, \"WGL_EXT_framebuffer_sRGB\" }    // We map the EXT to the ARB.\n                ,{ gle_WGL_ARB_make_current_read, \"WGL_ARB_make_current_read\" }\n                ,{ gle_WGL_ARB_pbuffer, \"WGL_ARB_pbuffer\" }\n                ,{ gle_WGL_ARB_pixel_format, \"WGL_ARB_pixel_format\" }\n                ,{ gle_WGL_ARB_pixel_format_float, \"WGL_ARB_pixel_format_float\" }\n                ,{ gle_WGL_ARB_render_texture, \"WGL_ARB_render_texture\" }\n                ,{ gle_WGL_ATI_render_texture_rectangle, \"WGL_ATI_render_texture_rectangle\" }\n                ,{ gle_WGL_EXT_extensions_string, \"WGL_EXT_extensions_string\" }\n                ,{ gle_WGL_EXT_swap_control, \"WGL_EXT_swap_control\" }\n                ,{ gle_WGL_NV_copy_image, \"WGL_NV_copy_image\" }\n                ,{ gle_WGL_NV_DX_interop, \"WGL_NV_DX_interop\" }\n                ,{ gle_WGL_NV_DX_interop2, \"WGL_NV_DX_interop2\" }\n                ,{ gle_WGL_NV_present_video, \"WGL_NV_present_video\" }\n                ,{ gle_WGL_NV_render_texture_rectangle, \"WGL_NV_render_texture_rectangle\" }\n                ,{ gle_WGL_NV_swap_group, \"WGL_NV_swap_group\" }\n                ,{ gle_WGL_NV_video_capture, \"WGL_NV_video_capture\" }\n                ,{ gle_WGL_NV_video_output, \"WGL_NV_video_output\" }\n                ,{ gle_WGL_OML_sync_control, \"WGL_OML_sync_control\" }\n            };\n\n            const char* extensions = NULL;\n\n            if(wglGetExtensionsStringARB_Impl)\n                extensions = wglGetExtensionsStringARB_Impl(wglGetCurrentDC()); // To do: Use a better mechanism to get the desired HDC.\n            else if(wglGetExtensionsStringEXT_Impl)\n                extensions = wglGetExtensionsStringEXT_Impl();\n\n            if (extensions && *extensions)\n            {\n                OVR_DEBUG_LOG((\"WGL_EXTENSIONS: %s\", (const char*)extensions));\n                CheckExtensions(vspWGLArray, OVR_ARRAY_COUNT(vspWGLArray), extensions);\n            }\n\n        #elif defined(GLE_GLX_ENABLED)\n            ValueStringPair vspGLXArray[] =\n            {\n                 { gle_GLX_ARB_create_context,            \"GLX_ARB_create_context\" }\n                ,{ gle_GLX_ARB_create_context_profile,    \"GLX_ARB_create_context_profile\" }\n                ,{ gle_GLX_ARB_create_context_robustness, \"GLX_ARB_create_context_robustness\" }\n                ,{ gle_GLX_EXT_swap_control,              \"GLX_EXT_swap_control\" }\n                ,{ gle_GLX_OML_sync_control,              \"GLX_OML_sync_control\" }\n                ,{ gle_MESA_swap_control,                 \"GLX_MESA_swap_control\" }\n            };\n\n            const char* extensions = glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS); // To do: Use a better mechanism to get the desired display.\n\n            if (extensions && *extensions)\n            {\n                OVR_DEBUG_LOG((\"GLX_EXTENSIONS: %s\", (const char*)extensions));\n                CheckExtensions(vspGLXArray, OVR_ARRAY_COUNT(vspGLXArray), extensions);\n            }\n        #endif\n    }\n\n\n    #if defined(GLE_HOOKING_ENABLED)\n\n        #undef glGetError\n        extern \"C\" { GLAPI GLenum GLAPIENTRY glGetError(); }\n\n        // Disabled until such time as it might be useful to enable for debug purposes.\n        //void OVR::GLEContext::PreHook(const char* functionName)\n        //{\n        //    if(EnableHookGetError)\n        //    {\n        //        int err = glGetError();\n        //\n        //        for(int i = 0; (i < 6) && (err != GL_NO_ERROR); i++) // 6 is an arbitrary cap to prevent infinite looping which would occur if the current GL context is invalid.\n        //        {\n        //            OVR_DEBUG_LOG((\"GL Error prior to hook: %d (%#x) from %s\", err, err, functionName ? functionName : \"OpenGL\")); OVR_UNUSED(functionName);\n        //            err = glGetError();\n        //        }\n        //    }\n        //}\n\n        void OVR::GLEContext::PostHook(const char* functionName)\n        {\n            if(EnableHookGetError)\n            {\n                // OpenGL Standard regarding error state: To allow for distributed implementations, there may be several error flags. If any single error flag has recorded an error, the value of that flag \n                // is returned and that flag is reset to GL_NO_ERROR when glGetError is called. If more than one flag has recorded an error, glGetError returns and \n                // clears an arbitrary error flag value. Thus, glGetError should always be called in a loop, until it returns GL_NO_ERROR, if all error flags are to be reset.\n                int err = glGetError();\n\n                for(int i = 0; (i < 6) && (err != GL_NO_ERROR); i++) // 6 is an arbitrary cap to prevent infinite looping which would occur if the current GL context is invalid.\n                {\n                    OVR_DEBUG_LOG((\"GL Error: %d (%#x) from %s\", err, err, functionName ? functionName : \"OpenGL\")); OVR_UNUSED(functionName);\n                    err = glGetError();\n                }\n            }\n        }\n\n\n        // OpenGL 1.1 link-based functions\n        #undef glAccum // Undefine the macro from our header so that we can directly call the real version of this function.\n        extern \"C\" { GLAPI void GLAPIENTRY glAccum(GLenum op, GLfloat value); }\n        void OVR::GLEContext::glAccum_Hook(GLenum op, GLfloat value)\n        {\n            glAccum(op, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glAlphaFunc\n        extern \"C\" { GLAPI void GLAPIENTRY glAlphaFunc(GLenum func, GLclampf ref); }\n        void OVR::GLEContext::glAlphaFunc_Hook(GLenum func, GLclampf ref)\n        {\n            glAlphaFunc(func, ref);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glAreTexturesResident\n        extern \"C\" { GLAPI GLboolean GLAPIENTRY glAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences); }\n        GLboolean OVR::GLEContext::glAreTexturesResident_Hook(GLsizei n, const GLuint *textures, GLboolean *residences)\n        {\n            GLboolean b = glAreTexturesResident(n, textures, residences);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n        #undef glArrayElement\n        extern \"C\" { GLAPI void GLAPIENTRY glArrayElement(GLint i); }\n        void OVR::GLEContext::glArrayElement_Hook(GLint i)\n        {\n            glArrayElement(i);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glBegin\n        extern \"C\" { GLAPI void GLAPIENTRY glBegin(GLenum mode); }\n        void OVR::GLEContext::glBegin_Hook(GLenum mode)\n        {\n            glBegin(mode);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glBindTexture\n        extern \"C\" { GLAPI void GLAPIENTRY glBindTexture(GLenum target, GLuint texture); }\n        void OVR::GLEContext::glBindTexture_Hook(GLenum target, GLuint texture)\n        {\n            glBindTexture(target, texture);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glBitmap\n        extern \"C\" { GLAPI void GLAPIENTRY glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); }\n        void OVR::GLEContext::glBitmap_Hook(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)\n        {\n            glBitmap(width, height, xorig, yorig, xmove, ymove, bitmap);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glBlendFunc\n        extern \"C\" { GLAPI void GLAPIENTRY glBlendFunc(GLenum sfactor, GLenum dfactor); }\n        void OVR::GLEContext::glBlendFunc_Hook(GLenum sfactor, GLenum dfactor)\n        {\n            glBlendFunc(sfactor, dfactor);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glCallList\n        extern \"C\" { GLAPI void GLAPIENTRY glCallList(GLuint list); }\n        void OVR::GLEContext::glCallList_Hook(GLuint list)\n        {\n            glCallList(list);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glCallLists\n        extern \"C\" { GLAPI void GLAPIENTRY glCallLists(GLsizei n, GLenum type, const void *lists); }\n        void OVR::GLEContext::glCallLists_Hook(GLsizei n, GLenum type, const void *lists)\n        {\n            glCallLists(n, type, lists);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glClear\n        extern \"C\" { GLAPI void GLAPIENTRY glClear(GLbitfield mask); }\n        void OVR::GLEContext::glClear_Hook(GLbitfield mask)\n        {\n            glClear(mask);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glClearAccum\n        extern \"C\" { GLAPI void GLAPIENTRY glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); }\n        void OVR::GLEContext::glClearAccum_Hook(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)\n        {\n            glClearAccum(red, green, blue, alpha);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glClearColor\n        extern \"C\" { GLAPI void GLAPIENTRY glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); }\n        void OVR::GLEContext::glClearColor_Hook(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)\n        {\n            glClearColor(red, green, blue, alpha);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glClearDepth\n        extern \"C\" { GLAPI void GLAPIENTRY glClearDepth(GLclampd depth); }\n        void OVR::GLEContext::glClearDepth_Hook(GLclampd depth)\n        {\n            glClearDepth(depth);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glClearIndex\n        extern \"C\" { GLAPI void GLAPIENTRY glClearIndex(GLfloat c); }\n        void OVR::GLEContext::glClearIndex_Hook(GLfloat c)\n        {\n            glClearIndex(c);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glClearStencil\n        extern \"C\" { GLAPI void GLAPIENTRY glClearStencil(GLint s); }\n        void OVR::GLEContext::glClearStencil_Hook(GLint s)\n        {\n            glClearStencil(s);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glClipPlane\n        extern \"C\" { GLAPI void GLAPIENTRY glClipPlane(GLenum plane, const GLdouble *equation); }\n        void OVR::GLEContext::glClipPlane_Hook(GLenum plane, const GLdouble *equation)\n        {\n            glClipPlane(plane, equation);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor3b\n        extern \"C\" { GLAPI void GLAPIENTRY glColor3b(GLbyte red, GLbyte green, GLbyte blue); }\n        void OVR::GLEContext::glColor3b_Hook(GLbyte red, GLbyte green, GLbyte blue)\n        {\n            glColor3b(red, green, blue);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor3bv\n        extern \"C\" { GLAPI void GLAPIENTRY glColor3bv(const GLbyte *v); }\n        void OVR::GLEContext::glColor3bv_Hook(const GLbyte *v)\n        {\n            glColor3bv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor3d\n        extern \"C\" { GLAPI void GLAPIENTRY glColor3d(GLdouble red, GLdouble green, GLdouble blue); }\n        void OVR::GLEContext::glColor3d_Hook(GLdouble red, GLdouble green, GLdouble blue)\n        {\n            glColor3d(red, green, blue);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor3dv\n        extern \"C\" { GLAPI void GLAPIENTRY glColor3dv(const GLdouble *v); }\n        void OVR::GLEContext::glColor3dv_Hook(const GLdouble *v)\n        {\n            glColor3dv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor3f\n        extern \"C\" { GLAPI void GLAPIENTRY glColor3f(GLfloat red, GLfloat green, GLfloat blue); }\n        void OVR::GLEContext::glColor3f_Hook(GLfloat red, GLfloat green, GLfloat blue)\n        {\n            glColor3f(red, green, blue);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor3fv\n        extern \"C\" { GLAPI void GLAPIENTRY glColor3fv(const GLfloat *v); }\n        void OVR::GLEContext::glColor3fv_Hook(const GLfloat *v)\n        {\n            glColor3fv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor3i\n        extern \"C\" { GLAPI void GLAPIENTRY glColor3i(GLint red, GLint green, GLint blue); }\n        void OVR::GLEContext::glColor3i_Hook(GLint red, GLint green, GLint blue)\n        {\n            glColor3i(red, green, blue);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor3iv\n        extern \"C\" { GLAPI void GLAPIENTRY glColor3iv(const GLint *v); }\n        void OVR::GLEContext::glColor3iv_Hook(const GLint *v)\n        {\n            glColor3iv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor3s\n        extern \"C\" { GLAPI void GLAPIENTRY glColor3s(GLshort red, GLshort green, GLshort blue); }\n        void OVR::GLEContext::glColor3s_Hook(GLshort red, GLshort green, GLshort blue)\n        {\n            glColor3s(red, green, blue);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor3sv\n        extern \"C\" { GLAPI void GLAPIENTRY glColor3sv(const GLshort *v); }\n        void OVR::GLEContext::glColor3sv_Hook(const GLshort *v)\n        {\n            glColor3sv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor3ub\n        extern \"C\" { GLAPI void GLAPIENTRY glColor3ub(GLubyte red, GLubyte green, GLubyte blue); }\n        void OVR::GLEContext::glColor3ub_Hook(GLubyte red, GLubyte green, GLubyte blue)\n        {\n            glColor3ub(red, green, blue);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor3ubv\n        extern \"C\" { GLAPI void GLAPIENTRY glColor3ubv(const GLubyte *v); }\n        void OVR::GLEContext::glColor3ubv_Hook(const GLubyte *v)\n        {\n            glColor3ubv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor3ui\n        extern \"C\" { GLAPI void GLAPIENTRY glColor3ui(GLuint red, GLuint green, GLuint blue); }\n        void OVR::GLEContext::glColor3ui_Hook(GLuint red, GLuint green, GLuint blue)\n        {\n            glColor3ui(red, green, blue);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor3uiv\n        extern \"C\" { GLAPI void GLAPIENTRY glColor3uiv(const GLuint *v); }\n        void OVR::GLEContext::glColor3uiv_Hook(const GLuint *v)\n        {\n            glColor3uiv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor3us\n        extern \"C\" { GLAPI void GLAPIENTRY glColor3us(GLushort red, GLushort green, GLushort blue); }\n        void OVR::GLEContext::glColor3us_Hook(GLushort red, GLushort green, GLushort blue)\n        {\n            glColor3us(red, green, blue);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor3usv\n        extern \"C\" { GLAPI void GLAPIENTRY glColor3usv(const GLushort *v); }\n        void OVR::GLEContext::glColor3usv_Hook(const GLushort *v)\n        {\n            glColor3usv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor4b\n        extern \"C\" { GLAPI void GLAPIENTRY glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); }\n        void OVR::GLEContext::glColor4b_Hook(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)\n        {\n            glColor4b(red, green, blue, alpha);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor4bv\n        extern \"C\" { GLAPI void GLAPIENTRY glColor4bv(const GLbyte *v); }\n        void OVR::GLEContext::glColor4bv_Hook(const GLbyte *v)\n        {\n            glColor4bv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor4d\n        extern \"C\" { GLAPI void GLAPIENTRY glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); }\n        void OVR::GLEContext::glColor4d_Hook(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)\n        {\n            glColor4d(red, green, blue, alpha);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor4dv\n        extern \"C\" { GLAPI void GLAPIENTRY glColor4dv(const GLdouble *v); }\n        void OVR::GLEContext::glColor4dv_Hook(const GLdouble *v)\n        {\n            glColor4dv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor4f\n        extern \"C\" { GLAPI void GLAPIENTRY glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); }\n        void OVR::GLEContext::glColor4f_Hook(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)\n        {\n            glColor4f(red, green, blue, alpha);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor4fv\n        extern \"C\" { GLAPI void GLAPIENTRY glColor4fv(const GLfloat *v); }\n        void OVR::GLEContext::glColor4fv_Hook(const GLfloat *v)\n        {\n            glColor4fv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor4i\n        extern \"C\" { GLAPI void GLAPIENTRY glColor4i(GLint red, GLint green, GLint blue, GLint alpha); }\n        void OVR::GLEContext::glColor4i_Hook(GLint red, GLint green, GLint blue, GLint alpha)\n        {\n            glColor4i(red, green, blue, alpha);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor4iv\n        extern \"C\" { GLAPI void GLAPIENTRY glColor4iv(const GLint *v); }\n        void OVR::GLEContext::glColor4iv_Hook(const GLint *v)\n        {\n            glColor4iv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor4s\n        extern \"C\" { GLAPI void GLAPIENTRY glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha); }\n        void OVR::GLEContext::glColor4s_Hook(GLshort red, GLshort green, GLshort blue, GLshort alpha)\n        {\n            glColor4s(red, green, blue, alpha);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor4sv\n        extern \"C\" { GLAPI void GLAPIENTRY glColor4sv(const GLshort *v); }\n        void OVR::GLEContext::glColor4sv_Hook(const GLshort *v)\n        {\n            glColor4sv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor4ub\n        extern \"C\" { GLAPI void GLAPIENTRY glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); }\n        void OVR::GLEContext::glColor4ub_Hook(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)\n        {\n            glColor4ub(red, green, blue, alpha);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor4ubv\n        extern \"C\" { GLAPI void GLAPIENTRY glColor4ubv(const GLubyte *v); }\n        void OVR::GLEContext::glColor4ubv_Hook(const GLubyte *v)\n        {\n            glColor4ubv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor4ui\n        extern \"C\" { GLAPI void GLAPIENTRY glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha); }\n        void OVR::GLEContext::glColor4ui_Hook(GLuint red, GLuint green, GLuint blue, GLuint alpha)\n        {\n            glColor4ui(red, green, blue, alpha);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor4uiv\n        extern \"C\" { GLAPI void GLAPIENTRY glColor4uiv(const GLuint *v); }\n        void OVR::GLEContext::glColor4uiv_Hook(const GLuint *v)\n        {\n            glColor4uiv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor4us\n        extern \"C\" { GLAPI void GLAPIENTRY glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha); }\n        void OVR::GLEContext::glColor4us_Hook(GLushort red, GLushort green, GLushort blue, GLushort alpha)\n        {\n            glColor4us(red, green, blue, alpha);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColor4usv\n        extern \"C\" { GLAPI void GLAPIENTRY glColor4usv(const GLushort *v); }\n        void OVR::GLEContext::glColor4usv_Hook(const GLushort *v)\n        {\n            glColor4usv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColorMask\n        extern \"C\" { GLAPI void GLAPIENTRY glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); }\n        void OVR::GLEContext::glColorMask_Hook(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)\n        {\n            glColorMask(red, green, blue, alpha);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColorMaterial\n        extern \"C\" { GLAPI void GLAPIENTRY glColorMaterial(GLenum face, GLenum mode); }\n        void OVR::GLEContext::glColorMaterial_Hook(GLenum face, GLenum mode)\n        {\n            glColorMaterial(face, mode);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glColorPointer\n        extern \"C\" { GLAPI void GLAPIENTRY glColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer); }\n        void OVR::GLEContext::glColorPointer_Hook(GLint size, GLenum type, GLsizei stride, const void *pointer)\n        {\n            glColorPointer(size, type, stride, pointer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glCopyPixels\n        extern \"C\" { GLAPI void GLAPIENTRY glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); }\n        void OVR::GLEContext::glCopyPixels_Hook(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)\n        {\n            glCopyPixels(x, y, width, height, type);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glCopyTexImage1D\n        extern \"C\" { GLAPI void GLAPIENTRY glCopyTexImage1D(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); }\n        void OVR::GLEContext::glCopyTexImage1D_Hook(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border)\n        {\n            glCopyTexImage1D(target, level, internalFormat, x, y, width, border);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glCopyTexImage2D\n        extern \"C\" { GLAPI void GLAPIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); }\n        void OVR::GLEContext::glCopyTexImage2D_Hook(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)\n        {\n            glCopyTexImage2D(target, level, internalFormat, x, y, width, height, border);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glCopyTexSubImage1D\n        extern \"C\" { GLAPI void GLAPIENTRY glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); }\n        void OVR::GLEContext::glCopyTexSubImage1D_Hook(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)\n        {\n            glCopyTexSubImage1D(target, level, xoffset, x, y, width);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glCopyTexSubImage2D\n        extern \"C\" { GLAPI void GLAPIENTRY glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); }\n        void OVR::GLEContext::glCopyTexSubImage2D_Hook(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)\n        {\n            glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glCullFace\n        extern \"C\" { GLAPI void GLAPIENTRY glCullFace(GLenum mode); }\n        void OVR::GLEContext::glCullFace_Hook(GLenum mode)\n        {\n            glCullFace(mode);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glDeleteLists\n        extern \"C\" { GLAPI void GLAPIENTRY glDeleteLists(GLuint list, GLsizei range); }\n        void OVR::GLEContext::glDeleteLists_Hook(GLuint list, GLsizei range)\n        {\n            glDeleteLists(list, range);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glDeleteTextures\n        extern \"C\" { GLAPI void GLAPIENTRY glDeleteTextures(GLsizei n, const GLuint *textures); }\n        void OVR::GLEContext::glDeleteTextures_Hook(GLsizei n, const GLuint *textures)\n        {\n            glDeleteTextures(n, textures);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glDepthFunc\n        extern \"C\" { GLAPI void GLAPIENTRY glDepthFunc(GLenum func); }\n        void OVR::GLEContext::glDepthFunc_Hook(GLenum func)\n        {\n            glDepthFunc(func);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glDepthMask\n        extern \"C\" { GLAPI void GLAPIENTRY glDepthMask(GLboolean flag); }\n        void OVR::GLEContext::glDepthMask_Hook(GLboolean flag)\n        {\n            glDepthMask(flag);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glDepthRange\n        extern \"C\" { GLAPI void GLAPIENTRY glDepthRange(GLclampd zNear, GLclampd zFar); }\n        void OVR::GLEContext::glDepthRange_Hook(GLclampd zNear, GLclampd zFar)\n        {\n            glDepthRange(zNear, zFar);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glDisable\n        extern \"C\" { GLAPI void GLAPIENTRY glDisable(GLenum cap); }\n        void OVR::GLEContext::glDisable_Hook(GLenum cap)\n        {\n            glDisable(cap);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glDisableClientState\n        extern \"C\" { GLAPI void GLAPIENTRY glDisableClientState(GLenum array); }\n        void OVR::GLEContext::glDisableClientState_Hook(GLenum array)\n        {\n            glDisableClientState(array);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glDrawArrays\n        extern \"C\" { GLAPI void GLAPIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count); }\n        void OVR::GLEContext::glDrawArrays_Hook(GLenum mode, GLint first, GLsizei count)\n        {\n            glDrawArrays(mode, first, count);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glDrawBuffer\n        extern \"C\" { GLAPI void GLAPIENTRY glDrawBuffer(GLenum mode); }\n        void OVR::GLEContext::glDrawBuffer_Hook(GLenum mode)\n        {\n            glDrawBuffer(mode);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glDrawElements\n        extern \"C\" { GLAPI void GLAPIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices); }\n        void OVR::GLEContext::glDrawElements_Hook(GLenum mode, GLsizei count, GLenum type, const void *indices)\n        {\n            glDrawElements(mode, count, type, indices);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glDrawPixels\n        extern \"C\" { GLAPI void GLAPIENTRY glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); }\n        void OVR::GLEContext::glDrawPixels_Hook(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)\n        {\n            glDrawPixels(width, height, format, type, pixels);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glEdgeFlag\n        extern \"C\" { GLAPI void GLAPIENTRY glEdgeFlag(GLboolean flag); }\n        void OVR::GLEContext::glEdgeFlag_Hook(GLboolean flag)\n        {\n            glEdgeFlag(flag);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glEdgeFlagPointer\n        extern \"C\" { GLAPI void GLAPIENTRY glEdgeFlagPointer(GLsizei stride, const void *pointer); }\n        void OVR::GLEContext::glEdgeFlagPointer_Hook(GLsizei stride, const void *pointer)\n        {\n            glEdgeFlagPointer(stride, pointer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glEdgeFlagv\n        extern \"C\" { GLAPI void GLAPIENTRY glEdgeFlagv(const GLboolean *flag); }\n        void OVR::GLEContext::glEdgeFlagv_Hook(const GLboolean *flag)\n        {\n            glEdgeFlagv(flag);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glEnable\n        extern \"C\" { GLAPI void GLAPIENTRY glEnable(GLenum cap); }\n        namespace OVR {\n        void GLEContext::glEnable_Hook(GLenum cap)\n        {\n            glEnable(cap);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n        }\n\n        #undef glEnableClientState\n        extern \"C\" { GLAPI void GLAPIENTRY glEnableClientState(GLenum array); }\n        void OVR::GLEContext::glEnableClientState_Hook(GLenum array)\n        {\n            glEnableClientState(array);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glEnd\n        extern \"C\" { GLAPI void GLAPIENTRY glEnd(); }\n        void OVR::GLEContext::glEnd_Hook()\n        {\n            glEnd();\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glEndList\n        extern \"C\" { GLAPI void GLAPIENTRY glEndList(); }\n        void OVR::GLEContext::glEndList_Hook()\n        {\n            glEndList();\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glEvalCoord1d\n        extern \"C\" { GLAPI void GLAPIENTRY glEvalCoord1d(GLdouble u); }\n        void OVR::GLEContext::glEvalCoord1d_Hook(GLdouble u)\n        {\n            glEvalCoord1d(u);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glEvalCoord1dv\n        extern \"C\" { GLAPI void GLAPIENTRY glEvalCoord1dv(const GLdouble *u); }\n        void OVR::GLEContext::glEvalCoord1dv_Hook(const GLdouble *u)\n        {\n            glEvalCoord1dv(u);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glEvalCoord1f\n        extern \"C\" { GLAPI void GLAPIENTRY glEvalCoord1f(GLfloat u); }\n        void OVR::GLEContext::glEvalCoord1f_Hook(GLfloat u)\n        {\n            glEvalCoord1f(u);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glEvalCoord1fv\n        extern \"C\" { GLAPI void GLAPIENTRY glEvalCoord1fv(const GLfloat *u); }\n        void OVR::GLEContext::glEvalCoord1fv_Hook(const GLfloat *u)\n        {\n            glEvalCoord1fv(u);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glEvalCoord2d\n        extern \"C\" { GLAPI void GLAPIENTRY glEvalCoord2d(GLdouble u, GLdouble v); }\n        void OVR::GLEContext::glEvalCoord2d_Hook(GLdouble u, GLdouble v)\n        {\n            glEvalCoord2d(u, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glEvalCoord2dv\n        extern \"C\" { GLAPI void GLAPIENTRY glEvalCoord2dv(const GLdouble *u); }\n        void OVR::GLEContext::glEvalCoord2dv_Hook(const GLdouble *u)\n        {\n            glEvalCoord2dv(u);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glEvalCoord2f\n        extern \"C\" { GLAPI void GLAPIENTRY glEvalCoord2f(GLfloat u, GLfloat v); }\n        void OVR::GLEContext::glEvalCoord2f_Hook(GLfloat u, GLfloat v)\n        {\n            glEvalCoord2f(u, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glEvalCoord2fv\n        extern \"C\" { GLAPI void GLAPIENTRY glEvalCoord2fv(const GLfloat *u); }\n        void OVR::GLEContext::glEvalCoord2fv_Hook(const GLfloat *u)\n        {\n            glEvalCoord2fv(u);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glEvalMesh1\n        extern \"C\" { GLAPI void GLAPIENTRY glEvalMesh1(GLenum mode, GLint i1, GLint i2); }\n        void OVR::GLEContext::glEvalMesh1_Hook(GLenum mode, GLint i1, GLint i2)\n        {\n            glEvalMesh1(mode, i1, i2);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glEvalMesh2\n        extern \"C\" { GLAPI void GLAPIENTRY glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); }\n        void OVR::GLEContext::glEvalMesh2_Hook(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)\n        {\n            glEvalMesh2(mode, i1, i2, j1, j2);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glEvalPoint1\n        extern \"C\" { GLAPI void GLAPIENTRY glEvalPoint1(GLint i); }\n        void OVR::GLEContext::glEvalPoint1_Hook(GLint i)\n        {\n            glEvalPoint1(i);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glEvalPoint2\n        extern \"C\" { GLAPI void GLAPIENTRY glEvalPoint2(GLint i, GLint j); }\n        void OVR::GLEContext::glEvalPoint2_Hook(GLint i, GLint j)\n        {\n            glEvalPoint2(i, j);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glFeedbackBuffer\n        extern \"C\" { GLAPI void GLAPIENTRY glFeedbackBuffer(GLsizei size, GLenum type, GLfloat *buffer); }\n        void OVR::GLEContext::glFeedbackBuffer_Hook(GLsizei size, GLenum type, GLfloat *buffer)\n        {\n            glFeedbackBuffer(size, type, buffer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glFinish\n        extern \"C\" { GLAPI void GLAPIENTRY glFinish(); }\n        void OVR::GLEContext::glFinish_Hook()\n        {\n            glFinish();\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glFlush\n        extern \"C\" { GLAPI void GLAPIENTRY glFlush(); }\n        void OVR::GLEContext::glFlush_Hook()\n        {\n            glFlush();\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glFogf\n        extern \"C\" { GLAPI void GLAPIENTRY glFogf(GLenum pname, GLfloat param); }\n        void OVR::GLEContext::glFogf_Hook(GLenum pname, GLfloat param)\n        {\n            glFogf(pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glFogfv\n        extern \"C\" { GLAPI void GLAPIENTRY glFogfv(GLenum pname, const GLfloat *params); }\n        void OVR::GLEContext::glFogfv_Hook(GLenum pname, const GLfloat *params)\n        {\n            glFogfv(pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glFogi\n        extern \"C\" { GLAPI void GLAPIENTRY glFogi(GLenum pname, GLint param); }\n        void OVR::GLEContext::glFogi_Hook(GLenum pname, GLint param)\n        {\n            glFogi(pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glFogiv\n        extern \"C\" { GLAPI void GLAPIENTRY glFogiv(GLenum pname, const GLint *params); }\n        void OVR::GLEContext::glFogiv_Hook(GLenum pname, const GLint *params)\n        {\n            glFogiv(pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glFrontFace\n        extern \"C\" { GLAPI void GLAPIENTRY glFrontFace(GLenum mode); }\n        void OVR::GLEContext::glFrontFace_Hook(GLenum mode)\n        {\n            glFrontFace(mode);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glFrustum\n        extern \"C\" { GLAPI void GLAPIENTRY glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); }\n        void OVR::GLEContext::glFrustum_Hook(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)\n        {\n            glFrustum(left, right, bottom, top, zNear, zFar);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGenLists\n        extern \"C\" { GLAPI GLuint GLAPIENTRY glGenLists(GLsizei range); }\n        GLuint OVR::GLEContext::glGenLists_Hook(GLsizei range)\n        {\n            GLuint u = glGenLists(range);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return u;\n        }\n\n        #undef glGenTextures\n        extern \"C\" { GLAPI void GLAPIENTRY glGenTextures(GLsizei n, GLuint *textures); }\n        void OVR::GLEContext::glGenTextures_Hook(GLsizei n, GLuint *textures)\n        {\n            glGenTextures(n, textures);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetBooleanv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetBooleanv(GLenum pname, GLboolean *params); }\n        void OVR::GLEContext::glGetBooleanv_Hook(GLenum pname, GLboolean *params)\n        {\n            glGetBooleanv(pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetClipPlane\n        extern \"C\" { GLAPI void GLAPIENTRY glGetClipPlane(GLenum plane, GLdouble *equation); }\n        void OVR::GLEContext::glGetClipPlane_Hook(GLenum plane, GLdouble *equation)\n        {\n            glGetClipPlane(plane, equation);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetDoublev\n        extern \"C\" { GLAPI void GLAPIENTRY glGetDoublev(GLenum pname, GLdouble *params); }\n        void OVR::GLEContext::glGetDoublev_Hook(GLenum pname, GLdouble *params)\n        {\n            glGetDoublev(pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        //#undef glGetError Not needed because we happen to do this above already.\n        //extern \"C\" { GLAPI GLenum GLAPIENTRY glGetError(); }\n        GLenum OVR::GLEContext::glGetError_Hook()\n        {\n            GLenum e = glGetError();\n            PostHook(GLE_CURRENT_FUNCTION);\n            return e;\n        }\n\n        #undef glGetFloatv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetFloatv(GLenum pname, GLfloat *params); }\n        void OVR::GLEContext::glGetFloatv_Hook(GLenum pname, GLfloat *params)\n        {\n            glGetFloatv(pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetIntegerv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetIntegerv(GLenum pname, GLint *params); }\n        void OVR::GLEContext::glGetIntegerv_Hook(GLenum pname, GLint *params)\n        {\n            glGetIntegerv(pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetLightfv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetLightfv(GLenum light, GLenum pname, GLfloat *params); }\n        void OVR::GLEContext::glGetLightfv_Hook(GLenum light, GLenum pname, GLfloat *params)\n        {\n            glGetLightfv(light, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetLightiv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetLightiv(GLenum light, GLenum pname, GLint *params); }\n        void OVR::GLEContext::glGetLightiv_Hook(GLenum light, GLenum pname, GLint *params)\n        {\n            glGetLightiv(light, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetMapdv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetMapdv(GLenum target, GLenum query, GLdouble *v); }\n        void OVR::GLEContext::glGetMapdv_Hook(GLenum target, GLenum query, GLdouble *v)\n        {\n            glGetMapdv(target, query, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetMapfv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetMapfv(GLenum target, GLenum query, GLfloat *v); }\n        void OVR::GLEContext::glGetMapfv_Hook(GLenum target, GLenum query, GLfloat *v)\n        {\n            glGetMapfv(target, query, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetMapiv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetMapiv(GLenum target, GLenum query, GLint *v); }\n        void OVR::GLEContext::glGetMapiv_Hook(GLenum target, GLenum query, GLint *v)\n        {\n            glGetMapiv(target, query, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetMaterialfv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params); }\n        void OVR::GLEContext::glGetMaterialfv_Hook(GLenum face, GLenum pname, GLfloat *params)\n        {\n            glGetMaterialfv(face, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetMaterialiv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetMaterialiv(GLenum face, GLenum pname, GLint *params); }\n        void OVR::GLEContext::glGetMaterialiv_Hook(GLenum face, GLenum pname, GLint *params)\n        {\n            glGetMaterialiv(face, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetPixelMapfv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetPixelMapfv(GLenum map, GLfloat *values); }\n        void OVR::GLEContext::glGetPixelMapfv_Hook(GLenum map, GLfloat *values)\n        {\n            glGetPixelMapfv(map, values);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetPixelMapuiv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetPixelMapuiv(GLenum map, GLuint *values); }\n        void OVR::GLEContext::glGetPixelMapuiv_Hook(GLenum map, GLuint *values)\n        {\n            glGetPixelMapuiv(map, values);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetPixelMapusv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetPixelMapusv(GLenum map, GLushort *values); }\n        void OVR::GLEContext::glGetPixelMapusv_Hook(GLenum map, GLushort *values)\n        {\n            glGetPixelMapusv(map, values);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetPointerv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetPointerv(GLenum pname, void* *params); }\n        void OVR::GLEContext::glGetPointerv_Hook(GLenum pname, void* *params)\n        {\n            glGetPointerv(pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetPolygonStipple\n        extern \"C\" { GLAPI void GLAPIENTRY glGetPolygonStipple(GLubyte *mask); }\n        void OVR::GLEContext::glGetPolygonStipple_Hook(GLubyte *mask)\n        {\n            glGetPolygonStipple(mask);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        // #undef glGetString // This was already disabled above.\n        // extern \"C\" { GLAPI const GLubyte * GLAPIENTRY glGetString(GLenum name); }\n        const GLubyte * OVR::GLEContext::glGetString_Hook(GLenum name)\n        {\n            const GLubyte * p = glGetString(name);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return p;\n        }\n\n        #undef glGetTexEnvfv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params); }\n        void OVR::GLEContext::glGetTexEnvfv_Hook(GLenum target, GLenum pname, GLfloat *params)\n        {\n            glGetTexEnvfv(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetTexEnviv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetTexEnviv(GLenum target, GLenum pname, GLint *params); }\n        void OVR::GLEContext::glGetTexEnviv_Hook(GLenum target, GLenum pname, GLint *params)\n        {\n            glGetTexEnviv(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetTexGendv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetTexGendv(GLenum coord, GLenum pname, GLdouble *params); }\n        void OVR::GLEContext::glGetTexGendv_Hook(GLenum coord, GLenum pname, GLdouble *params)\n        {\n            glGetTexGendv(coord, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetTexGenfv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params); }\n        void OVR::GLEContext::glGetTexGenfv_Hook(GLenum coord, GLenum pname, GLfloat *params)\n        {\n            glGetTexGenfv(coord, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetTexGeniv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetTexGeniv(GLenum coord, GLenum pname, GLint *params); }\n        void OVR::GLEContext::glGetTexGeniv_Hook(GLenum coord, GLenum pname, GLint *params)\n        {\n            glGetTexGeniv(coord, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetTexImage\n        extern \"C\" { GLAPI void GLAPIENTRY glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void *pixels); }\n        void OVR::GLEContext::glGetTexImage_Hook(GLenum target, GLint level, GLenum format, GLenum type, void *pixels)\n        {\n            glGetTexImage(target, level, format, type, pixels);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetTexLevelParameterfv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params); }\n        void OVR::GLEContext::glGetTexLevelParameterfv_Hook(GLenum target, GLint level, GLenum pname, GLfloat *params)\n        {\n            glGetTexLevelParameterfv(target, level, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetTexLevelParameteriv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params); }\n        void OVR::GLEContext::glGetTexLevelParameteriv_Hook(GLenum target, GLint level, GLenum pname, GLint *params)\n        {\n            glGetTexLevelParameteriv(target, level, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetTexParameterfv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params); }\n        void OVR::GLEContext::glGetTexParameterfv_Hook(GLenum target, GLenum pname, GLfloat *params)\n        {\n            glGetTexParameterfv(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glGetTexParameteriv\n        extern \"C\" { GLAPI void GLAPIENTRY glGetTexParameteriv(GLenum target, GLenum pname, GLint *params); }\n        void OVR::GLEContext::glGetTexParameteriv_Hook(GLenum target, GLenum pname, GLint *params)\n        {\n            glGetTexParameteriv(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glHint\n        extern \"C\" { GLAPI void GLAPIENTRY glHint(GLenum target, GLenum mode); }\n        void OVR::GLEContext::glHint_Hook(GLenum target, GLenum mode)\n        {\n            glHint(target, mode);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glIndexMask\n        extern \"C\" { GLAPI void GLAPIENTRY glIndexMask(GLuint mask); }\n        void OVR::GLEContext::glIndexMask_Hook(GLuint mask)\n        {\n            glIndexMask(mask);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glIndexPointer\n        extern \"C\" { GLAPI void GLAPIENTRY glIndexPointer(GLenum type, GLsizei stride, const void *pointer); }\n        void OVR::GLEContext::glIndexPointer_Hook(GLenum type, GLsizei stride, const void *pointer)\n        {\n            glIndexPointer(type, stride, pointer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glIndexd\n        extern \"C\" { GLAPI void GLAPIENTRY glIndexd(GLdouble c); }\n        void OVR::GLEContext::glIndexd_Hook(GLdouble c)\n        {\n            glIndexd(c);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glIndexdv\n        extern \"C\" { GLAPI void GLAPIENTRY glIndexdv(const GLdouble *c); }\n        void OVR::GLEContext::glIndexdv_Hook(const GLdouble *c)\n        {\n            glIndexdv(c);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glIndexf\n        extern \"C\" { GLAPI void GLAPIENTRY glIndexf(GLfloat c); }\n        void OVR::GLEContext::glIndexf_Hook(GLfloat c)\n        {\n            glIndexf(c);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glIndexfv\n        extern \"C\" { GLAPI void GLAPIENTRY glIndexfv(const GLfloat *c); }\n        void OVR::GLEContext::glIndexfv_Hook(const GLfloat *c)\n        {\n            glIndexfv(c);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glIndexi\n        extern \"C\" { GLAPI void GLAPIENTRY glIndexi(GLint c); }\n        void OVR::GLEContext::glIndexi_Hook(GLint c)\n        {\n            glIndexi(c);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glIndexiv\n        extern \"C\" { GLAPI void GLAPIENTRY glIndexiv(const GLint *c); }\n        void OVR::GLEContext::glIndexiv_Hook(const GLint *c)\n        {\n            glIndexiv(c);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glIndexs\n        extern \"C\" { GLAPI void GLAPIENTRY glIndexs(GLshort c); }\n        void OVR::GLEContext::glIndexs_Hook(GLshort c)\n        {\n            glIndexs(c);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glIndexsv\n        extern \"C\" { GLAPI void GLAPIENTRY glIndexsv(const GLshort *c); }\n        void OVR::GLEContext::glIndexsv_Hook(const GLshort *c)\n        {\n            glIndexsv(c);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glIndexub\n        extern \"C\" { GLAPI void GLAPIENTRY glIndexub(GLubyte c); }\n        void OVR::GLEContext::glIndexub_Hook(GLubyte c)\n        {\n            glIndexub(c);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glIndexubv\n        extern \"C\" { GLAPI void GLAPIENTRY glIndexubv(const GLubyte *c); }\n        void OVR::GLEContext::glIndexubv_Hook(const GLubyte *c)\n        {\n            glIndexubv(c);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glInitNames\n        extern \"C\" { GLAPI void GLAPIENTRY glInitNames(); }\n        void OVR::GLEContext::glInitNames_Hook()\n        {\n            glInitNames();\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glInterleavedArrays\n        extern \"C\" { GLAPI void GLAPIENTRY glInterleavedArrays(GLenum format, GLsizei stride, const void *pointer); }\n        void OVR::GLEContext::glInterleavedArrays_Hook(GLenum format, GLsizei stride, const void *pointer)\n        {\n            glInterleavedArrays(format, stride, pointer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glIsEnabled\n        extern \"C\" { GLAPI GLboolean GLAPIENTRY glIsEnabled(GLenum cap); }\n        GLboolean OVR::GLEContext::glIsEnabled_Hook(GLenum cap)\n        {\n            GLboolean b = glIsEnabled(cap);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n        #undef glIsList\n        extern \"C\" { GLAPI GLboolean GLAPIENTRY glIsList(GLuint list); }\n        GLboolean OVR::GLEContext::glIsList_Hook(GLuint list)\n        {\n            GLboolean b = glIsList(list);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n        #undef glIsTexture\n        extern \"C\" { GLAPI GLboolean GLAPIENTRY glIsTexture(GLuint texture); }\n        GLboolean OVR::GLEContext::glIsTexture_Hook(GLuint texture)\n        {\n            GLboolean b = glIsTexture(texture);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n        #undef glLightModelf\n        extern \"C\" { GLAPI void GLAPIENTRY glLightModelf(GLenum pname, GLfloat param); }\n        void OVR::GLEContext::glLightModelf_Hook(GLenum pname, GLfloat param)\n        {\n            glLightModelf(pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glLightModelfv\n        extern \"C\" { GLAPI void GLAPIENTRY glLightModelfv(GLenum pname, const GLfloat *params); }\n        void OVR::GLEContext::glLightModelfv_Hook(GLenum pname, const GLfloat *params)\n        {\n            glLightModelfv(pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glLightModeli\n        extern \"C\" { GLAPI void GLAPIENTRY glLightModeli(GLenum pname, GLint param); }\n        void OVR::GLEContext::glLightModeli_Hook(GLenum pname, GLint param)\n        {\n            glLightModeli(pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glLightModeliv\n        extern \"C\" { GLAPI void GLAPIENTRY glLightModeliv(GLenum pname, const GLint *params); }\n        void OVR::GLEContext::glLightModeliv_Hook(GLenum pname, const GLint *params)\n        {\n            glLightModeliv(pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glLightf\n        extern \"C\" { GLAPI void GLAPIENTRY glLightf(GLenum light, GLenum pname, GLfloat param); }\n        void OVR::GLEContext::glLightf_Hook(GLenum light, GLenum pname, GLfloat param)\n        {\n            glLightf(light, pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glLightfv\n        extern \"C\" { GLAPI void GLAPIENTRY glLightfv(GLenum light, GLenum pname, const GLfloat *params); }\n        void OVR::GLEContext::glLightfv_Hook(GLenum light, GLenum pname, const GLfloat *params)\n        {\n            glLightfv(light, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glLighti\n        extern \"C\" { GLAPI void GLAPIENTRY glLighti(GLenum light, GLenum pname, GLint param); }\n        void OVR::GLEContext::glLighti_Hook(GLenum light, GLenum pname, GLint param)\n        {\n            glLighti(light, pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glLightiv\n        extern \"C\" { GLAPI void GLAPIENTRY glLightiv(GLenum light, GLenum pname, const GLint *params); }\n        void OVR::GLEContext::glLightiv_Hook(GLenum light, GLenum pname, const GLint *params)\n        {\n            glLightiv(light, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glLineStipple\n        extern \"C\" { GLAPI void GLAPIENTRY glLineStipple(GLint factor, GLushort pattern); }\n        void OVR::GLEContext::glLineStipple_Hook(GLint factor, GLushort pattern)\n        {\n            glLineStipple(factor, pattern);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glLineWidth\n        extern \"C\" { GLAPI void GLAPIENTRY glLineWidth(GLfloat width); }\n        void OVR::GLEContext::glLineWidth_Hook(GLfloat width)\n        {\n            glLineWidth(width);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glListBase\n        extern \"C\" { GLAPI void GLAPIENTRY glListBase(GLuint base); }\n        void OVR::GLEContext::glListBase_Hook(GLuint base)\n        {\n            glListBase(base);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glLoadIdentity\n        extern \"C\" { GLAPI void GLAPIENTRY glLoadIdentity(); }\n        void OVR::GLEContext::glLoadIdentity_Hook()\n        {\n            glLoadIdentity();\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glLoadMatrixd\n        extern \"C\" { GLAPI void GLAPIENTRY glLoadMatrixd(const GLdouble *m); }\n        void OVR::GLEContext::glLoadMatrixd_Hook(const GLdouble *m)\n        {\n            glLoadMatrixd(m);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glLoadMatrixf\n        extern \"C\" { GLAPI void GLAPIENTRY glLoadMatrixf(const GLfloat *m); }\n        void OVR::GLEContext::glLoadMatrixf_Hook(const GLfloat *m)\n        {\n            glLoadMatrixf(m);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glLoadName\n        extern \"C\" { GLAPI void GLAPIENTRY glLoadName(GLuint name); }\n        void OVR::GLEContext::glLoadName_Hook(GLuint name)\n        {\n            glLoadName(name);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glLogicOp\n        extern \"C\" { GLAPI void GLAPIENTRY glLogicOp(GLenum opcode); }\n        void OVR::GLEContext::glLogicOp_Hook(GLenum opcode)\n        {\n            glLogicOp(opcode);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glMap1d\n        extern \"C\" { GLAPI void GLAPIENTRY glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); }\n        void OVR::GLEContext::glMap1d_Hook(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)\n        {\n            glMap1d(target, u1, u2, stride, order, points);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glMap1f\n        extern \"C\" { GLAPI void GLAPIENTRY glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); }\n        void OVR::GLEContext::glMap1f_Hook(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)\n        {\n            glMap1f(target, u1, u2, stride, order, points);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glMap2d\n        extern \"C\" { GLAPI void GLAPIENTRY glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); }\n        void OVR::GLEContext::glMap2d_Hook(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)\n        {\n            glMap2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glMap2f\n        extern \"C\" { GLAPI void GLAPIENTRY glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); }\n        void OVR::GLEContext::glMap2f_Hook(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)\n        {\n            glMap2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glMapGrid1d\n        extern \"C\" { GLAPI void GLAPIENTRY glMapGrid1d(GLint un, GLdouble u1, GLdouble u2); }\n        void OVR::GLEContext::glMapGrid1d_Hook(GLint un, GLdouble u1, GLdouble u2)\n        {\n            glMapGrid1d(un, u1, u2);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glMapGrid1f\n        extern \"C\" { GLAPI void GLAPIENTRY glMapGrid1f(GLint un, GLfloat u1, GLfloat u2); }\n        void OVR::GLEContext::glMapGrid1f_Hook(GLint un, GLfloat u1, GLfloat u2)\n        {\n            glMapGrid1f(un, u1, u2);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glMapGrid2d\n        extern \"C\" { GLAPI void GLAPIENTRY glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); }\n        void OVR::GLEContext::glMapGrid2d_Hook(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)\n        {\n            glMapGrid2d(un, u1, u2, vn, v1, v2);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glMapGrid2f\n        extern \"C\" { GLAPI void GLAPIENTRY glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); }\n        void OVR::GLEContext::glMapGrid2f_Hook(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)\n        {\n            glMapGrid2f(un, u1, u2, vn, v1, v2);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glMaterialf\n        extern \"C\" { GLAPI void GLAPIENTRY glMaterialf(GLenum face, GLenum pname, GLfloat param); }\n        void OVR::GLEContext::glMaterialf_Hook(GLenum face, GLenum pname, GLfloat param)\n        {\n            glMaterialf(face, pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glMaterialfv\n        extern \"C\" { GLAPI void GLAPIENTRY glMaterialfv(GLenum face, GLenum pname, const GLfloat *params); }\n        void OVR::GLEContext::glMaterialfv_Hook(GLenum face, GLenum pname, const GLfloat *params)\n        {\n            glMaterialfv(face, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glMateriali\n        extern \"C\" { GLAPI void GLAPIENTRY glMateriali(GLenum face, GLenum pname, GLint param); }\n        void OVR::GLEContext::glMateriali_Hook(GLenum face, GLenum pname, GLint param)\n        {\n            glMateriali(face, pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glMaterialiv\n        extern \"C\" { GLAPI void GLAPIENTRY glMaterialiv(GLenum face, GLenum pname, const GLint *params); }\n        void OVR::GLEContext::glMaterialiv_Hook(GLenum face, GLenum pname, const GLint *params)\n        {\n            glMaterialiv(face, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glMatrixMode\n        extern \"C\" { GLAPI void GLAPIENTRY glMatrixMode(GLenum mode); }\n        void OVR::GLEContext::glMatrixMode_Hook(GLenum mode)\n        {\n            glMatrixMode(mode);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glMultMatrixd\n        extern \"C\" { GLAPI void GLAPIENTRY glMultMatrixd(const GLdouble *m); }\n        void OVR::GLEContext::glMultMatrixd_Hook(const GLdouble *m)\n        {\n            glMultMatrixd(m);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glMultMatrixf\n        extern \"C\" { GLAPI void GLAPIENTRY glMultMatrixf(const GLfloat *m); }\n        void OVR::GLEContext::glMultMatrixf_Hook(const GLfloat *m)\n        {\n            glMultMatrixf(m);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glNewList\n        extern \"C\" { GLAPI void GLAPIENTRY glNewList(GLuint list, GLenum mode); }\n        void OVR::GLEContext::glNewList_Hook(GLuint list, GLenum mode)\n        {\n            glNewList(list, mode);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glNormal3b\n        extern \"C\" { GLAPI void GLAPIENTRY glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz); }\n        void OVR::GLEContext::glNormal3b_Hook(GLbyte nx, GLbyte ny, GLbyte nz)\n        {\n            glNormal3b(nx, ny, nz);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glNormal3bv\n        extern \"C\" { GLAPI void GLAPIENTRY glNormal3bv(const GLbyte *v); }\n        void OVR::GLEContext::glNormal3bv_Hook(const GLbyte *v)\n        {\n            glNormal3bv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glNormal3d\n        extern \"C\" { GLAPI void GLAPIENTRY glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz); }\n        void OVR::GLEContext::glNormal3d_Hook(GLdouble nx, GLdouble ny, GLdouble nz)\n        {\n            glNormal3d(nx, ny, nz);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glNormal3dv\n        extern \"C\" { GLAPI void GLAPIENTRY glNormal3dv(const GLdouble *v); }\n        void OVR::GLEContext::glNormal3dv_Hook(const GLdouble *v)\n        {\n            glNormal3dv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glNormal3f\n        extern \"C\" { GLAPI void GLAPIENTRY glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz); }\n        void OVR::GLEContext::glNormal3f_Hook(GLfloat nx, GLfloat ny, GLfloat nz)\n        {\n            glNormal3f(nx, ny, nz);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glNormal3fv\n        extern \"C\" { GLAPI void GLAPIENTRY glNormal3fv(const GLfloat *v); }\n        void OVR::GLEContext::glNormal3fv_Hook(const GLfloat *v)\n        {\n            glNormal3fv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glNormal3i\n        extern \"C\" { GLAPI void GLAPIENTRY glNormal3i(GLint nx, GLint ny, GLint nz); }\n        void OVR::GLEContext::glNormal3i_Hook(GLint nx, GLint ny, GLint nz)\n        {\n            glNormal3i(nx, ny, nz);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glNormal3iv\n        extern \"C\" { GLAPI void GLAPIENTRY glNormal3iv(const GLint *v); }\n        void OVR::GLEContext::glNormal3iv_Hook(const GLint *v)\n        {\n            glNormal3iv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glNormal3s\n        extern \"C\" { GLAPI void GLAPIENTRY glNormal3s(GLshort nx, GLshort ny, GLshort nz); }\n        void OVR::GLEContext::glNormal3s_Hook(GLshort nx, GLshort ny, GLshort nz)\n        {\n            glNormal3s(nx, ny, nz);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glNormal3sv\n        extern \"C\" { GLAPI void GLAPIENTRY glNormal3sv(const GLshort *v); }\n        void OVR::GLEContext::glNormal3sv_Hook(const GLshort *v)\n        {\n            glNormal3sv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glNormalPointer\n        extern \"C\" { GLAPI void GLAPIENTRY glNormalPointer(GLenum type, GLsizei stride, const void *pointer); }\n        void OVR::GLEContext::glNormalPointer_Hook(GLenum type, GLsizei stride, const void *pointer)\n        {\n            glNormalPointer(type, stride, pointer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glOrtho\n        extern \"C\" { GLAPI void GLAPIENTRY glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); }\n        void OVR::GLEContext::glOrtho_Hook(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)\n        {\n            glOrtho(left, right, bottom, top, zNear, zFar);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPassThrough\n        extern \"C\" { GLAPI void GLAPIENTRY glPassThrough(GLfloat token); }\n        void OVR::GLEContext::glPassThrough_Hook(GLfloat token)\n        {\n            glPassThrough(token);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPixelMapfv\n        extern \"C\" { GLAPI void GLAPIENTRY glPixelMapfv(GLenum map, GLsizei mapsize, const GLfloat *values); }\n        void OVR::GLEContext::glPixelMapfv_Hook(GLenum map, GLsizei mapsize, const GLfloat *values)\n        {\n            glPixelMapfv(map, mapsize, values);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPixelMapuiv\n        extern \"C\" { GLAPI void GLAPIENTRY glPixelMapuiv(GLenum map, GLsizei mapsize, const GLuint *values); }\n        void OVR::GLEContext::glPixelMapuiv_Hook(GLenum map, GLsizei mapsize, const GLuint *values)\n        {\n            glPixelMapuiv(map, mapsize, values);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPixelMapusv\n        extern \"C\" { GLAPI void GLAPIENTRY glPixelMapusv(GLenum map, GLsizei mapsize, const GLushort *values); }\n        void OVR::GLEContext::glPixelMapusv_Hook(GLenum map, GLsizei mapsize, const GLushort *values)\n        {\n            glPixelMapusv(map, mapsize, values);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPixelStoref\n        extern \"C\" { GLAPI void GLAPIENTRY glPixelStoref(GLenum pname, GLfloat param); }\n        void OVR::GLEContext::glPixelStoref_Hook(GLenum pname, GLfloat param)\n        {\n            glPixelStoref(pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPixelStorei\n        extern \"C\" { GLAPI void GLAPIENTRY glPixelStorei(GLenum pname, GLint param); }\n        void OVR::GLEContext::glPixelStorei_Hook(GLenum pname, GLint param)\n        {\n            glPixelStorei(pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPixelTransferf\n        extern \"C\" { GLAPI void GLAPIENTRY glPixelTransferf(GLenum pname, GLfloat param); }\n        void OVR::GLEContext::glPixelTransferf_Hook(GLenum pname, GLfloat param)\n        {\n            glPixelTransferf(pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPixelTransferi\n        extern \"C\" { GLAPI void GLAPIENTRY glPixelTransferi(GLenum pname, GLint param); }\n        void OVR::GLEContext::glPixelTransferi_Hook(GLenum pname, GLint param)\n        {\n            glPixelTransferi(pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPixelZoom\n        extern \"C\" { GLAPI void GLAPIENTRY glPixelZoom(GLfloat xfactor, GLfloat yfactor); }\n        void OVR::GLEContext::glPixelZoom_Hook(GLfloat xfactor, GLfloat yfactor)\n        {\n            glPixelZoom(xfactor, yfactor);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPointSize\n        extern \"C\" { GLAPI void GLAPIENTRY glPointSize(GLfloat size); }\n        void OVR::GLEContext::glPointSize_Hook(GLfloat size)\n        {\n            glPointSize(size);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPolygonMode\n        extern \"C\" { GLAPI void GLAPIENTRY glPolygonMode(GLenum face, GLenum mode); }\n        void OVR::GLEContext::glPolygonMode_Hook(GLenum face, GLenum mode)\n        {\n            glPolygonMode(face, mode);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPolygonOffset\n        extern \"C\" { GLAPI void GLAPIENTRY glPolygonOffset(GLfloat factor, GLfloat units); }\n        void OVR::GLEContext::glPolygonOffset_Hook(GLfloat factor, GLfloat units)\n        {\n            glPolygonOffset(factor, units);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPolygonStipple\n        extern \"C\" { GLAPI void GLAPIENTRY glPolygonStipple(const GLubyte *mask); }\n        void OVR::GLEContext::glPolygonStipple_Hook(const GLubyte *mask)\n        {\n            glPolygonStipple(mask);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPopAttrib\n        extern \"C\" { GLAPI void GLAPIENTRY glPopAttrib(); }\n        void OVR::GLEContext::glPopAttrib_Hook()\n        {\n            glPopAttrib();\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPopClientAttrib\n        extern \"C\" { GLAPI void GLAPIENTRY glPopClientAttrib(); }\n        void OVR::GLEContext::glPopClientAttrib_Hook()\n        {\n            glPopClientAttrib();\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPopMatrix\n        extern \"C\" { GLAPI void GLAPIENTRY glPopMatrix(); }\n        void OVR::GLEContext::glPopMatrix_Hook()\n        {\n            glPopMatrix();\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPopName\n        extern \"C\" { GLAPI void GLAPIENTRY glPopName(); }\n        void OVR::GLEContext::glPopName_Hook()\n        {\n            glPopName();\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPrioritizeTextures\n        extern \"C\" { GLAPI void GLAPIENTRY glPrioritizeTextures(GLsizei n, const GLuint *textures, const GLclampf *priorities); }\n        void OVR::GLEContext::glPrioritizeTextures_Hook(GLsizei n, const GLuint *textures, const GLclampf *priorities)\n        {\n            glPrioritizeTextures(n, textures, priorities);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPushAttrib\n        extern \"C\" { GLAPI void GLAPIENTRY glPushAttrib(GLbitfield mask); }\n        void OVR::GLEContext::glPushAttrib_Hook(GLbitfield mask)\n        {\n            glPushAttrib(mask);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPushClientAttrib\n        extern \"C\" { GLAPI void GLAPIENTRY glPushClientAttrib(GLbitfield mask); }\n        void OVR::GLEContext::glPushClientAttrib_Hook(GLbitfield mask)\n        {\n            glPushClientAttrib(mask);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPushMatrix\n        extern \"C\" { GLAPI void GLAPIENTRY glPushMatrix(); }\n        void OVR::GLEContext::glPushMatrix_Hook()\n        {\n            glPushMatrix();\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glPushName\n        extern \"C\" { GLAPI void GLAPIENTRY glPushName(GLuint name); }\n        void OVR::GLEContext::glPushName_Hook(GLuint name)\n        {\n            glPushName(name);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos2d\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos2d(GLdouble x, GLdouble y); }\n        void OVR::GLEContext::glRasterPos2d_Hook(GLdouble x, GLdouble y)\n        {\n            glRasterPos2d(x, y);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos2dv\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos2dv(const GLdouble *v); }\n        void OVR::GLEContext::glRasterPos2dv_Hook(const GLdouble *v)\n        {\n            glRasterPos2dv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos2f\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos2f(GLfloat x, GLfloat y); }\n        void OVR::GLEContext::glRasterPos2f_Hook(GLfloat x, GLfloat y)\n        {\n            glRasterPos2f(x, y);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos2fv\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos2fv(const GLfloat *v); }\n        void OVR::GLEContext::glRasterPos2fv_Hook(const GLfloat *v)\n        {\n            glRasterPos2fv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos2i\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos2i(GLint x, GLint y); }\n        void OVR::GLEContext::glRasterPos2i_Hook(GLint x, GLint y)\n        {\n            glRasterPos2i(x, y);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos2iv\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos2iv(const GLint *v); }\n        void OVR::GLEContext::glRasterPos2iv_Hook(const GLint *v)\n        {\n            glRasterPos2iv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos2s\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos2s(GLshort x, GLshort y); }\n        void OVR::GLEContext::glRasterPos2s_Hook(GLshort x, GLshort y)\n        {\n            glRasterPos2s(x, y);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos2sv\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos2sv(const GLshort *v); }\n        void OVR::GLEContext::glRasterPos2sv_Hook(const GLshort *v)\n        {\n            glRasterPos2sv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos3d\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos3d(GLdouble x, GLdouble y, GLdouble z); }\n        void OVR::GLEContext::glRasterPos3d_Hook(GLdouble x, GLdouble y, GLdouble z)\n        {\n            glRasterPos3d(x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos3dv\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos3dv(const GLdouble *v); }\n        void OVR::GLEContext::glRasterPos3dv_Hook(const GLdouble *v)\n        {\n            glRasterPos3dv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos3f\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos3f(GLfloat x, GLfloat y, GLfloat z); }\n        void OVR::GLEContext::glRasterPos3f_Hook(GLfloat x, GLfloat y, GLfloat z)\n        {\n            glRasterPos3f(x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos3fv\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos3fv(const GLfloat *v); }\n        void OVR::GLEContext::glRasterPos3fv_Hook(const GLfloat *v)\n        {\n            glRasterPos3fv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos3i\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos3i(GLint x, GLint y, GLint z); }\n        void OVR::GLEContext::glRasterPos3i_Hook(GLint x, GLint y, GLint z)\n        {\n            glRasterPos3i(x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos3iv\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos3iv(const GLint *v); }\n        void OVR::GLEContext::glRasterPos3iv_Hook(const GLint *v)\n        {\n            glRasterPos3iv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos3s\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos3s(GLshort x, GLshort y, GLshort z); }\n        void OVR::GLEContext::glRasterPos3s_Hook(GLshort x, GLshort y, GLshort z)\n        {\n            glRasterPos3s(x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos3sv\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos3sv(const GLshort *v); }\n        void OVR::GLEContext::glRasterPos3sv_Hook(const GLshort *v)\n        {\n            glRasterPos3sv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos4d\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w); }\n        void OVR::GLEContext::glRasterPos4d_Hook(GLdouble x, GLdouble y, GLdouble z, GLdouble w)\n        {\n            glRasterPos4d(x, y, z, w);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos4dv\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos4dv(const GLdouble *v); }\n        void OVR::GLEContext::glRasterPos4dv_Hook(const GLdouble *v)\n        {\n            glRasterPos4dv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos4f\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w); }\n        void OVR::GLEContext::glRasterPos4f_Hook(GLfloat x, GLfloat y, GLfloat z, GLfloat w)\n        {\n            glRasterPos4f(x, y, z, w);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos4fv\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos4fv(const GLfloat *v); }\n        void OVR::GLEContext::glRasterPos4fv_Hook(const GLfloat *v)\n        {\n            glRasterPos4fv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos4i\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos4i(GLint x, GLint y, GLint z, GLint w); }\n        void OVR::GLEContext::glRasterPos4i_Hook(GLint x, GLint y, GLint z, GLint w)\n        {\n            glRasterPos4i(x, y, z, w);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos4iv\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos4iv(const GLint *v); }\n        void OVR::GLEContext::glRasterPos4iv_Hook(const GLint *v)\n        {\n            glRasterPos4iv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos4s\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w); }\n        void OVR::GLEContext::glRasterPos4s_Hook(GLshort x, GLshort y, GLshort z, GLshort w)\n        {\n            glRasterPos4s(x, y, z, w);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRasterPos4sv\n        extern \"C\" { GLAPI void GLAPIENTRY glRasterPos4sv(const GLshort *v); }\n        void OVR::GLEContext::glRasterPos4sv_Hook(const GLshort *v)\n        {\n            glRasterPos4sv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glReadBuffer\n        extern \"C\" { GLAPI void GLAPIENTRY glReadBuffer(GLenum mode); }\n        void OVR::GLEContext::glReadBuffer_Hook(GLenum mode)\n        {\n            glReadBuffer(mode);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glReadPixels\n        extern \"C\" { GLAPI void GLAPIENTRY glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); }\n        void OVR::GLEContext::glReadPixels_Hook(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels)\n        {\n            glReadPixels(x, y, width, height, format, type, pixels);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRectd\n        extern \"C\" { GLAPI void GLAPIENTRY glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); }\n        void OVR::GLEContext::glRectd_Hook(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)\n        {\n            glRectd(x1, y1, x2, y2);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRectdv\n        extern \"C\" { GLAPI void GLAPIENTRY glRectdv(const GLdouble *v1, const GLdouble *v2); }\n        void OVR::GLEContext::glRectdv_Hook(const GLdouble *v1, const GLdouble *v2)\n        {\n            glRectdv(v1, v2);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRectf\n        extern \"C\" { GLAPI void GLAPIENTRY glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); }\n        void OVR::GLEContext::glRectf_Hook(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)\n        {\n            glRectf(x1, y1, x2, y2);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRectfv\n        extern \"C\" { GLAPI void GLAPIENTRY glRectfv(const GLfloat *v1, const GLfloat *v2); }\n        void OVR::GLEContext::glRectfv_Hook(const GLfloat *v1, const GLfloat *v2)\n        {\n            glRectfv(v1, v2);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRecti\n        extern \"C\" { GLAPI void GLAPIENTRY glRecti(GLint x1, GLint y1, GLint x2, GLint y2); }\n        void OVR::GLEContext::glRecti_Hook(GLint x1, GLint y1, GLint x2, GLint y2)\n        {\n            glRecti(x1, y1, x2, y2);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRectiv\n        extern \"C\" { GLAPI void GLAPIENTRY glRectiv(const GLint *v1, const GLint *v2); }\n        void OVR::GLEContext::glRectiv_Hook(const GLint *v1, const GLint *v2)\n        {\n            glRectiv(v1, v2);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRects\n        extern \"C\" { GLAPI void GLAPIENTRY glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2); }\n        void OVR::GLEContext::glRects_Hook(GLshort x1, GLshort y1, GLshort x2, GLshort y2)\n        {\n            glRects(x1, y1, x2, y2);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRectsv\n        extern \"C\" { GLAPI void GLAPIENTRY glRectsv(const GLshort *v1, const GLshort *v2); }\n        void OVR::GLEContext::glRectsv_Hook(const GLshort *v1, const GLshort *v2)\n        {\n            glRectsv(v1, v2);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRenderMode\n        extern \"C\" { GLAPI GLint GLAPIENTRY glRenderMode(GLenum mode); }\n        GLint OVR::GLEContext::glRenderMode_Hook(GLenum mode)\n        {\n            GLint  i = glRenderMode(mode);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return i;\n        }\n\n        #undef glRotated\n        extern \"C\" { GLAPI void GLAPIENTRY glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); }\n        void OVR::GLEContext::glRotated_Hook(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)\n        {\n            glRotated(angle, x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glRotatef\n        extern \"C\" { GLAPI void GLAPIENTRY glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); }\n        void OVR::GLEContext::glRotatef_Hook(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)\n        {\n            glRotatef(angle, x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glScaled\n        extern \"C\" { GLAPI void GLAPIENTRY glScaled(GLdouble x, GLdouble y, GLdouble z); }\n        void OVR::GLEContext::glScaled_Hook(GLdouble x, GLdouble y, GLdouble z)\n        {\n            glScaled(x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glScalef\n        extern \"C\" { GLAPI void GLAPIENTRY glScalef(GLfloat x, GLfloat y, GLfloat z); }\n        void OVR::GLEContext::glScalef_Hook(GLfloat x, GLfloat y, GLfloat z)\n        {\n            glScalef(x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glScissor\n        extern \"C\" { GLAPI void GLAPIENTRY glScissor(GLint x, GLint y, GLsizei width, GLsizei height); }\n        void OVR::GLEContext::glScissor_Hook(GLint x, GLint y, GLsizei width, GLsizei height)\n        {\n            glScissor(x, y, width, height);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glSelectBuffer\n        extern \"C\" { GLAPI void GLAPIENTRY glSelectBuffer(GLsizei size, GLuint *buffer); }\n        void OVR::GLEContext::glSelectBuffer_Hook(GLsizei size, GLuint *buffer)\n        {\n            glSelectBuffer(size, buffer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glShadeModel\n        extern \"C\" { GLAPI void GLAPIENTRY glShadeModel(GLenum mode); }\n        void OVR::GLEContext::glShadeModel_Hook(GLenum mode)\n        {\n            glShadeModel(mode);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glStencilFunc\n        extern \"C\" { GLAPI void GLAPIENTRY glStencilFunc(GLenum func, GLint ref, GLuint mask); }\n        void OVR::GLEContext::glStencilFunc_Hook(GLenum func, GLint ref, GLuint mask)\n        {\n            glStencilFunc(func, ref, mask);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glStencilMask\n        extern \"C\" { GLAPI void GLAPIENTRY glStencilMask(GLuint mask); }\n        void OVR::GLEContext::glStencilMask_Hook(GLuint mask)\n        {\n            glStencilMask(mask);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glStencilOp\n        extern \"C\" { GLAPI void GLAPIENTRY glStencilOp(GLenum fail, GLenum zfail, GLenum zpass); }\n        void OVR::GLEContext::glStencilOp_Hook(GLenum fail, GLenum zfail, GLenum zpass)\n        {\n            glStencilOp(fail, zfail, zpass);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord1d\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord1d(GLdouble s); }\n        void OVR::GLEContext::glTexCoord1d_Hook(GLdouble s)\n        {\n            glTexCoord1d(s);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord1dv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord1dv(const GLdouble *v); }\n        void OVR::GLEContext::glTexCoord1dv_Hook(const GLdouble *v)\n        {\n            glTexCoord1dv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord1f\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord1f(GLfloat s); }\n        void OVR::GLEContext::glTexCoord1f_Hook(GLfloat s)\n        {\n            glTexCoord1f(s);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord1fv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord1fv(const GLfloat *v); }\n        void OVR::GLEContext::glTexCoord1fv_Hook(const GLfloat *v)\n        {\n            glTexCoord1fv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord1i\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord1i(GLint s); }\n        void OVR::GLEContext::glTexCoord1i_Hook(GLint s)\n        {\n            glTexCoord1i(s);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord1iv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord1iv(const GLint *v); }\n        void OVR::GLEContext::glTexCoord1iv_Hook(const GLint *v)\n        {\n            glTexCoord1iv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord1s\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord1s(GLshort s); }\n        void OVR::GLEContext::glTexCoord1s_Hook(GLshort s)\n        {\n            glTexCoord1s(s);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord1sv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord1sv(const GLshort *v); }\n        void OVR::GLEContext::glTexCoord1sv_Hook(const GLshort *v)\n        {\n            glTexCoord1sv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord2d\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord2d(GLdouble s, GLdouble t); }\n        void OVR::GLEContext::glTexCoord2d_Hook(GLdouble s, GLdouble t)\n        {\n            glTexCoord2d(s, t);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord2dv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord2dv(const GLdouble *v); }\n        void OVR::GLEContext::glTexCoord2dv_Hook(const GLdouble *v)\n        {\n            glTexCoord2dv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord2f\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord2f(GLfloat s, GLfloat t); }\n        void OVR::GLEContext::glTexCoord2f_Hook(GLfloat s, GLfloat t)\n        {\n            glTexCoord2f(s, t);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord2fv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord2fv(const GLfloat *v); }\n        void OVR::GLEContext::glTexCoord2fv_Hook(const GLfloat *v)\n        {\n            glTexCoord2fv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord2i\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord2i(GLint s, GLint t); }\n        void OVR::GLEContext::glTexCoord2i_Hook(GLint s, GLint t)\n        {\n            glTexCoord2i(s, t);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord2iv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord2iv(const GLint *v); }\n        void OVR::GLEContext::glTexCoord2iv_Hook(const GLint *v)\n        {\n            glTexCoord2iv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord2s\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord2s(GLshort s, GLshort t); }\n        void OVR::GLEContext::glTexCoord2s_Hook(GLshort s, GLshort t)\n        {\n            glTexCoord2s(s, t);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord2sv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord2sv(const GLshort *v); }\n        void OVR::GLEContext::glTexCoord2sv_Hook(const GLshort *v)\n        {\n            glTexCoord2sv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord3d\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord3d(GLdouble s, GLdouble t, GLdouble r); }\n        void OVR::GLEContext::glTexCoord3d_Hook(GLdouble s, GLdouble t, GLdouble r)\n        {\n            glTexCoord3d(s, t, r);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord3dv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord3dv(const GLdouble *v); }\n        void OVR::GLEContext::glTexCoord3dv_Hook(const GLdouble *v)\n        {\n            glTexCoord3dv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord3f\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord3f(GLfloat s, GLfloat t, GLfloat r); }\n        void OVR::GLEContext::glTexCoord3f_Hook(GLfloat s, GLfloat t, GLfloat r)\n        {\n            glTexCoord3f(s, t, r);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord3fv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord3fv(const GLfloat *v); }\n        void OVR::GLEContext::glTexCoord3fv_Hook(const GLfloat *v)\n        {\n            glTexCoord3fv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord3i\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord3i(GLint s, GLint t, GLint r); }\n        void OVR::GLEContext::glTexCoord3i_Hook(GLint s, GLint t, GLint r)\n        {\n            glTexCoord3i(s, t, r);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord3iv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord3iv(const GLint *v); }\n        void OVR::GLEContext::glTexCoord3iv_Hook(const GLint *v)\n        {\n            glTexCoord3iv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord3s\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord3s(GLshort s, GLshort t, GLshort r); }\n        void OVR::GLEContext::glTexCoord3s_Hook(GLshort s, GLshort t, GLshort r)\n        {\n            glTexCoord3s(s, t, r);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord3sv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord3sv(const GLshort *v); }\n        void OVR::GLEContext::glTexCoord3sv_Hook(const GLshort *v)\n        {\n            glTexCoord3sv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord4d\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q); }\n        void OVR::GLEContext::glTexCoord4d_Hook(GLdouble s, GLdouble t, GLdouble r, GLdouble q)\n        {\n            glTexCoord4d(s, t, r, q);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord4dv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord4dv(const GLdouble *v); }\n        void OVR::GLEContext::glTexCoord4dv_Hook(const GLdouble *v)\n        {\n            glTexCoord4dv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord4f\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q); }\n        void OVR::GLEContext::glTexCoord4f_Hook(GLfloat s, GLfloat t, GLfloat r, GLfloat q)\n        {\n            glTexCoord4f(s, t, r, q);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord4fv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord4fv(const GLfloat *v); }\n        void OVR::GLEContext::glTexCoord4fv_Hook(const GLfloat *v)\n        {\n            glTexCoord4fv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord4i\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord4i(GLint s, GLint t, GLint r, GLint q); }\n        void OVR::GLEContext::glTexCoord4i_Hook(GLint s, GLint t, GLint r, GLint q)\n        {\n            glTexCoord4i(s, t, r, q);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord4iv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord4iv(const GLint *v); }\n        void OVR::GLEContext::glTexCoord4iv_Hook(const GLint *v)\n        {\n            glTexCoord4iv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord4s\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q); }\n        void OVR::GLEContext::glTexCoord4s_Hook(GLshort s, GLshort t, GLshort r, GLshort q)\n        {\n            glTexCoord4s(s, t, r, q);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoord4sv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoord4sv(const GLshort *v); }\n        void OVR::GLEContext::glTexCoord4sv_Hook(const GLshort *v)\n        {\n            glTexCoord4sv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexCoordPointer\n        extern \"C\" { GLAPI void GLAPIENTRY glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const void *pointer); }\n        void OVR::GLEContext::glTexCoordPointer_Hook(GLint size, GLenum type, GLsizei stride, const void *pointer)\n        {\n            glTexCoordPointer(size, type, stride, pointer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexEnvf\n        extern \"C\" { GLAPI void GLAPIENTRY glTexEnvf(GLenum target, GLenum pname, GLfloat param); }\n        void OVR::GLEContext::glTexEnvf_Hook(GLenum target, GLenum pname, GLfloat param)\n        {\n            glTexEnvf(target, pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexEnvfv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params); }\n        void OVR::GLEContext::glTexEnvfv_Hook(GLenum target, GLenum pname, const GLfloat *params)\n        {\n            glTexEnvfv(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexEnvi\n        extern \"C\" { GLAPI void GLAPIENTRY glTexEnvi(GLenum target, GLenum pname, GLint param); }\n        void OVR::GLEContext::glTexEnvi_Hook(GLenum target, GLenum pname, GLint param)\n        {\n            glTexEnvi(target, pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexEnviv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexEnviv(GLenum target, GLenum pname, const GLint *params); }\n        void OVR::GLEContext::glTexEnviv_Hook(GLenum target, GLenum pname, const GLint *params)\n        {\n            glTexEnviv(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexGend\n        extern \"C\" { GLAPI void GLAPIENTRY glTexGend(GLenum coord, GLenum pname, GLdouble param); }\n        void OVR::GLEContext::glTexGend_Hook(GLenum coord, GLenum pname, GLdouble param)\n        {\n            glTexGend(coord, pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexGendv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexGendv(GLenum coord, GLenum pname, const GLdouble *params); }\n        void OVR::GLEContext::glTexGendv_Hook(GLenum coord, GLenum pname, const GLdouble *params)\n        {\n            glTexGendv(coord, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexGenf\n        extern \"C\" { GLAPI void GLAPIENTRY glTexGenf(GLenum coord, GLenum pname, GLfloat param); }\n        void OVR::GLEContext::glTexGenf_Hook(GLenum coord, GLenum pname, GLfloat param)\n        {\n            glTexGenf(coord, pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexGenfv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params); }\n        void OVR::GLEContext::glTexGenfv_Hook(GLenum coord, GLenum pname, const GLfloat *params)\n        {\n            glTexGenfv(coord, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexGeni\n        extern \"C\" { GLAPI void GLAPIENTRY glTexGeni(GLenum coord, GLenum pname, GLint param); }\n        void OVR::GLEContext::glTexGeni_Hook(GLenum coord, GLenum pname, GLint param)\n        {\n            glTexGeni(coord, pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexGeniv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexGeniv(GLenum coord, GLenum pname, const GLint *params); }\n        void OVR::GLEContext::glTexGeniv_Hook(GLenum coord, GLenum pname, const GLint *params)\n        {\n            glTexGeniv(coord, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexImage1D\n        extern \"C\" { GLAPI void GLAPIENTRY glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); }\n        void OVR::GLEContext::glTexImage1D_Hook(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels)\n        {\n            glTexImage1D(target, level, internalformat, width, border, format, type, pixels);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexImage2D\n        extern \"C\" { GLAPI void GLAPIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); }\n        void OVR::GLEContext::glTexImage2D_Hook(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels)\n        {\n            glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexParameterf\n        extern \"C\" { GLAPI void GLAPIENTRY glTexParameterf(GLenum target, GLenum pname, GLfloat param); }\n        void OVR::GLEContext::glTexParameterf_Hook(GLenum target, GLenum pname, GLfloat param)\n        {\n            glTexParameterf(target, pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexParameterfv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params); }\n        void OVR::GLEContext::glTexParameterfv_Hook(GLenum target, GLenum pname, const GLfloat *params)\n        {\n            glTexParameterfv(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexParameteri\n        extern \"C\" { GLAPI void GLAPIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param); }\n        void OVR::GLEContext::glTexParameteri_Hook(GLenum target, GLenum pname, GLint param)\n        {\n            glTexParameteri(target, pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexParameteriv\n        extern \"C\" { GLAPI void GLAPIENTRY glTexParameteriv(GLenum target, GLenum pname, const GLint *params); }\n        void OVR::GLEContext::glTexParameteriv_Hook(GLenum target, GLenum pname, const GLint *params)\n        {\n            glTexParameteriv(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexSubImage1D\n        extern \"C\" { GLAPI void GLAPIENTRY glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); }\n        void OVR::GLEContext::glTexSubImage1D_Hook(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)\n        {\n            glTexSubImage1D(target, level, xoffset, width, format, type, pixels);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTexSubImage2D\n        extern \"C\" { GLAPI void GLAPIENTRY glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); }\n        void OVR::GLEContext::glTexSubImage2D_Hook(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)\n        {\n            glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTranslated\n        extern \"C\" { GLAPI void GLAPIENTRY glTranslated(GLdouble x, GLdouble y, GLdouble z); }\n        void OVR::GLEContext::glTranslated_Hook(GLdouble x, GLdouble y, GLdouble z)\n        {\n            glTranslated(x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glTranslatef\n        extern \"C\" { GLAPI void GLAPIENTRY glTranslatef(GLfloat x, GLfloat y, GLfloat z); }\n        void OVR::GLEContext::glTranslatef_Hook(GLfloat x, GLfloat y, GLfloat z)\n        {\n            glTranslatef(x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex2d\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex2d(GLdouble x, GLdouble y); }\n        void OVR::GLEContext::glVertex2d_Hook(GLdouble x, GLdouble y)\n        {\n            glVertex2d(x, y);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex2dv\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex2dv(const GLdouble *v); }\n        void OVR::GLEContext::glVertex2dv_Hook(const GLdouble *v)\n        {\n            glVertex2dv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex2f\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex2f(GLfloat x, GLfloat y); }\n        void OVR::GLEContext::glVertex2f_Hook(GLfloat x, GLfloat y)\n        {\n            glVertex2f(x, y);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex2fv\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex2fv(const GLfloat *v); }\n        void OVR::GLEContext::glVertex2fv_Hook(const GLfloat *v)\n        {\n            glVertex2fv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex2i\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex2i(GLint x, GLint y); }\n        void OVR::GLEContext::glVertex2i_Hook(GLint x, GLint y)\n        {\n            glVertex2i(x, y);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex2iv\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex2iv(const GLint *v); }\n        void OVR::GLEContext::glVertex2iv_Hook(const GLint *v)\n        {\n            glVertex2iv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex2s\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex2s(GLshort x, GLshort y); }\n        void OVR::GLEContext::glVertex2s_Hook(GLshort x, GLshort y)\n        {\n            glVertex2s(x, y);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex2sv\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex2sv(const GLshort *v); }\n        void OVR::GLEContext::glVertex2sv_Hook(const GLshort *v)\n        {\n            glVertex2sv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex3d\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex3d(GLdouble x, GLdouble y, GLdouble z); }\n        void OVR::GLEContext::glVertex3d_Hook(GLdouble x, GLdouble y, GLdouble z)\n        {\n            glVertex3d(x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex3dv\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex3dv(const GLdouble *v); }\n        void OVR::GLEContext::glVertex3dv_Hook(const GLdouble *v)\n        {\n            glVertex3dv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex3f\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex3f(GLfloat x, GLfloat y, GLfloat z); }\n        void OVR::GLEContext::glVertex3f_Hook(GLfloat x, GLfloat y, GLfloat z)\n        {\n            glVertex3f(x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex3fv\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex3fv(const GLfloat *v); }\n        void OVR::GLEContext::glVertex3fv_Hook(const GLfloat *v)\n        {\n            glVertex3fv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex3i\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex3i(GLint x, GLint y, GLint z); }\n        void OVR::GLEContext::glVertex3i_Hook(GLint x, GLint y, GLint z)\n        {\n            glVertex3i(x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex3iv\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex3iv(const GLint *v); }\n        void OVR::GLEContext::glVertex3iv_Hook(const GLint *v)\n        {\n            glVertex3iv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex3s\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex3s(GLshort x, GLshort y, GLshort z); }\n        void OVR::GLEContext::glVertex3s_Hook(GLshort x, GLshort y, GLshort z)\n        {\n            glVertex3s(x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex3sv\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex3sv(const GLshort *v); }\n        void OVR::GLEContext::glVertex3sv_Hook(const GLshort *v)\n        {\n            glVertex3sv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex4d\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w); }\n        void OVR::GLEContext::glVertex4d_Hook(GLdouble x, GLdouble y, GLdouble z, GLdouble w)\n        {\n            glVertex4d(x, y, z, w);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex4dv\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex4dv(const GLdouble *v); }\n        void OVR::GLEContext::glVertex4dv_Hook(const GLdouble *v)\n        {\n            glVertex4dv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex4f\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w); }\n        void OVR::GLEContext::glVertex4f_Hook(GLfloat x, GLfloat y, GLfloat z, GLfloat w)\n        {\n            glVertex4f(x, y, z, w);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex4fv\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex4fv(const GLfloat *v); }\n        void OVR::GLEContext::glVertex4fv_Hook(const GLfloat *v)\n        {\n            glVertex4fv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex4i\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex4i(GLint x, GLint y, GLint z, GLint w); }\n        void OVR::GLEContext::glVertex4i_Hook(GLint x, GLint y, GLint z, GLint w)\n        {\n            glVertex4i(x, y, z, w);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex4iv\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex4iv(const GLint *v); }\n        void OVR::GLEContext::glVertex4iv_Hook(const GLint *v)\n        {\n            glVertex4iv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex4s\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w); }\n        void OVR::GLEContext::glVertex4s_Hook(GLshort x, GLshort y, GLshort z, GLshort w)\n        {\n            glVertex4s(x, y, z, w);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertex4sv\n        extern \"C\" { GLAPI void GLAPIENTRY glVertex4sv(const GLshort *v); }\n        void OVR::GLEContext::glVertex4sv_Hook(const GLshort *v)\n        {\n            glVertex4sv(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glVertexPointer\n        extern \"C\" { GLAPI void GLAPIENTRY glVertexPointer(GLint size, GLenum type, GLsizei stride, const void *pointer); }\n        void OVR::GLEContext::glVertexPointer_Hook(GLint size, GLenum type, GLsizei stride, const void *pointer)\n        {\n            glVertexPointer(size, type, stride, pointer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        #undef glViewport\n        extern \"C\" { GLAPI void GLAPIENTRY glViewport(GLint x, GLint y, GLsizei width, GLsizei height); }\n        void OVR::GLEContext::glViewport_Hook(GLint x, GLint y, GLsizei width, GLsizei height)\n        {\n            glViewport(x, y, width, height);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n\n        // Pointer-based functions\n        void OVR::GLEContext::glBlendColor_Hook(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)\n        {\n            if(glBlendColor_Impl)\n                glBlendColor_Impl(red, green, blue, alpha);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glBlendEquation_Hook(GLenum mode)\n        {\n            if(glBlendEquation_Impl)\n                glBlendEquation_Impl(mode);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDrawRangeElements_Hook(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)\n        {\n            if(glDrawRangeElements_Impl)\n                glDrawRangeElements_Impl(mode, start, end, count, type, indices);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glTexImage3D_Hook(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)\n        {\n            if(glTexImage3D_Impl)\n                glTexImage3D_Impl(target, level, internalformat, width, height, depth, border, format, type, pixels);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glTexSubImage3D_Hook(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)\n        {\n            if(glTexSubImage3D_Impl)\n                glTexSubImage3D_Impl(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        void OVR::GLEContext::glCopyTexSubImage3D_Hook(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)\n        {\n            if(glCopyTexSubImage3D_Impl)\n                glCopyTexSubImage3D_Impl(target, level, xoffset, yoffset, zoffset, x, y, width, height);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        // GL_VERSION_1_2 deprecated functions\n        /* Not currently supported\n        void OVR::GLEContext::glColorTable_Hook(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table)\n        {\n            if(glColorTable_Impl)\n                glColorTable_Impl(target, internalformat, width, format, type, table);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glColorTableParameterfv_Hook(GLenum target, GLenum pname, const GLfloat *params)\n        {\n            if(glColorTableParameterfv_Impl)\n                glColorTableParameterfv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glColorTableParameteriv_Hook(GLenum target, GLenum pname, const GLint *params)\n        {\n            if(glColorTableParameteriv_Impl)\n                glColorTableParameteriv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glCopyColorTable_Hook(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)\n        {\n            if(glCopyColorTable_Impl)\n                glCopyColorTable_Impl(target, internalformat, x, y, width);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetColorTable_Hook(GLenum target, GLenum format, GLenum type, GLvoid *table)\n        {\n            if(glGetColorTable_Impl)\n                glGetColorTable_Impl(target, format, type, table);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetColorTableParameterfv_Hook(GLenum target, GLenum pname, GLfloat *params)\n        {\n            if(glGetColorTableParameterfv_Impl)\n                glGetColorTableParameterfv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetColorTableParameteriv_Hook(GLenum target, GLenum pname, GLint *params)\n        {\n            if(glGetColorTableParameteriv_Impl)\n                glGetColorTableParameteriv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glColorSubTable_Hook(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data)\n        {\n            if(glColorSubTable_Impl)\n                glColorSubTable_Impl(target, start, count, format, type, data);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glCopyColorSubTable_Hook(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width)\n        {\n            if(glCopyColorSubTable_Impl)\n                glCopyColorSubTable_Impl(target, start, x, y, width);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glConvolutionFilter1D_Hook(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image)\n        {\n            if(glConvolutionFilter1D_Impl)\n                glConvolutionFilter1D_Impl(target, internalformat, width, format, type, image);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glConvolutionFilter2D_Hook(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image)\n        {\n            if(glConvolutionFilter2D_Impl)\n                glConvolutionFilter2D_Impl(target, internalformat, width, height, format, type, image);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glConvolutionParameterf_Hook(GLenum target, GLenum pname, GLfloat params)\n        {\n            if(glConvolutionParameterf_Impl)\n                glConvolutionParameterf_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glConvolutionParameterfv_Hook(GLenum target, GLenum pname, const GLfloat *params)\n        {\n            if(glConvolutionParameterfv_Impl)\n                glConvolutionParameterfv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glConvolutionParameteri_Hook(GLenum target, GLenum pname, GLint params)\n        {\n            if(glConvolutionParameteri_Impl)\n                glConvolutionParameteri_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glConvolutionParameteriv_Hook(GLenum target, GLenum pname, const GLint *params)\n        {\n            if(glConvolutionParameteriv_Impl)\n                glConvolutionParameteriv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glCopyConvolutionFilter1D_Hook(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width)\n        {\n            if(glCopyConvolutionFilter1D_Impl)\n                glCopyConvolutionFilter1D_Impl(target, internalformat, x, y, width);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glCopyConvolutionFilter2D_Hook(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height)\n        {\n            if(glCopyConvolutionFilter2D_Impl)\n                glCopyConvolutionFilter2D_Impl(target, internalformat, x, y, width, height);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetConvolutionFilter_Hook(GLenum target, GLenum format, GLenum type, GLvoid *image)\n        {\n            if(glGetConvolutionFilter_Impl)\n                glGetConvolutionFilter_Impl(target, format, type, image);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetConvolutionParameterfv_Hook(GLenum target, GLenum pname, GLfloat *params)\n        {\n            if(glGetConvolutionParameterfv_Impl)\n                glGetConvolutionParameterfv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetConvolutionParameteriv_Hook(GLenum target, GLenum pname, GLint *params)\n        {\n            if(glGetConvolutionParameteriv_Impl)\n                glGetConvolutionParameteriv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetSeparableFilter_Hook(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)\n        {\n            if(glGetSeparableFilter_Impl)\n                glGetSeparableFilter_Impl(target, format, type, row, column, span);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSeparableFilter2D_Hook(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column)\n        {\n            if(glSeparableFilter2D_Impl)\n                glSeparableFilter2D_Impl(target, internalformat, width, height, format, type, row, column);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetHistogram_Hook(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)\n        {\n            if(glGetHistogram_Impl)\n                glGetHistogram_Impl(target, reset, format, type, values);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetHistogramParameterfv_Hook(GLenum target, GLenum pname, GLfloat *params)\n        {\n            if(glGetHistogramParameterfv_Impl)\n                glGetHistogramParameterfv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetHistogramParameteriv_Hook(GLenum target, GLenum pname, GLint *params)\n        {\n            if(glGetHistogramParameteriv_Impl)\n                glGetHistogramParameteriv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetMinmax_Hook(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values)\n        {\n            if(glGetMinmax_Impl)\n                glGetMinmax_Impl(target, reset, format, type, values);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetMinmaxParameterfv_Hook(GLenum target, GLenum pname, GLfloat *params)\n        {\n            if(glGetMinmaxParameterfv_Impl)\n                glGetMinmaxParameterfv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetMinmaxParameteriv_Hook(GLenum target, GLenum pname, GLint *params)\n        {\n            if(glGetMinmaxParameteriv_Impl)\n                glGetMinmaxParameteriv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glHistogram_Hook(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink)\n        {\n            if(glHistogram_Impl)\n                glHistogram_Impl(target, width, internalformat, sink);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMinmax_Hook(GLenum target, GLenum internalformat, GLboolean sink)\n        {\n            if(glMinmax_Impl)\n                glMinmax_Impl(target, internalformat, sink);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glResetHistogram_Hook(GLenum target)\n        {\n            if(glResetHistogram_Impl)\n                glResetHistogram_Impl(target);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glResetMinmax_Hook(GLenum target)\n        {\n            if(glResetMinmax_Impl)\n                glResetMinmax_Impl(target);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n        */\n\n        // GL_VERSION_1_3\n        void OVR::GLEContext::glActiveTexture_Hook(GLenum texture)\n        {\n            if(glActiveTexture_Impl)\n                glActiveTexture_Impl(texture);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSampleCoverage_Hook(GLclampf value, GLboolean invert)\n        {\n            if(glSampleCoverage_Impl)\n                glSampleCoverage_Impl(value, invert);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glCompressedTexImage3D_Hook(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)\n        {\n            if(glCompressedTexImage3D_Impl)\n                glCompressedTexImage3D_Impl(target, level, internalformat, width, height, depth, border, imageSize, data);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glCompressedTexImage2D_Hook(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)\n        {\n            if(glCompressedTexImage2D_Impl)\n                glCompressedTexImage2D_Impl(target, level, internalformat, width, height, border, imageSize, data);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glCompressedTexImage1D_Hook(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data)\n        {\n            if(glCompressedTexImage1D_Impl)\n                glCompressedTexImage1D_Impl(target, level, internalformat, width, border, imageSize, data);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glCompressedTexSubImage3D_Hook(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)\n        {\n            if(glCompressedTexSubImage3D_Impl)\n                glCompressedTexSubImage3D_Impl(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glCompressedTexSubImage2D_Hook(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)\n        {\n            if(glCompressedTexSubImage2D_Impl)\n                glCompressedTexSubImage2D_Impl(target, level, xoffset, yoffset, width, height, format, imageSize, data);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glCompressedTexSubImage1D_Hook(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data)\n        {\n            if(glCompressedTexSubImage1D_Impl)\n                glCompressedTexSubImage1D_Impl(target, level, xoffset, width, format, imageSize, data);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetCompressedTexImage_Hook(GLenum target, GLint level, GLvoid *img)\n        {\n            if(glGetCompressedTexImage_Impl)\n                glGetCompressedTexImage_Impl(target, level, img);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_VERSION_1_3 deprecated functions\n        void OVR::GLEContext::glClientActiveTexture_Hook(GLenum texture)\n        {\n            if(glClientActiveTexture_Impl)\n                glClientActiveTexture_Impl(texture);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord1d_Hook(GLenum target, GLdouble s)\n        {\n            if(glMultiTexCoord1d_Impl)\n                glMultiTexCoord1d_Impl(target, s);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord1dv_Hook(GLenum target, const GLdouble *v)\n        {\n            if(glMultiTexCoord1dv_Impl)\n                glMultiTexCoord1dv_Impl(target, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord1f_Hook(GLenum target, GLfloat s)\n        {\n            if(glMultiTexCoord1f_Impl)\n                glMultiTexCoord1f_Impl(target, s);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord1fv_Hook(GLenum target, const GLfloat *v)\n        {\n            if(glMultiTexCoord1fv_Impl)\n                glMultiTexCoord1fv_Impl(target, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord1i_Hook(GLenum target, GLint s)\n        {\n            if(glMultiTexCoord1i_Impl)\n                glMultiTexCoord1i_Impl(target, s);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord1iv_Hook(GLenum target, const GLint *v)\n        {\n            if(glMultiTexCoord1iv_Impl)\n                glMultiTexCoord1iv_Impl(target, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord1s_Hook(GLenum target, GLshort s)\n        {\n            if(glMultiTexCoord1s_Impl)\n                glMultiTexCoord1s_Impl(target, s);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord1sv_Hook(GLenum target, const GLshort *v)\n        {\n            if(glMultiTexCoord1sv_Impl)\n                glMultiTexCoord1sv_Impl(target, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord2d_Hook(GLenum target, GLdouble s, GLdouble t)\n        {\n            if(glMultiTexCoord2d_Impl)\n                glMultiTexCoord2d_Impl(target, s, t);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord2dv_Hook(GLenum target, const GLdouble *v)\n        {\n            if(glMultiTexCoord2dv_Impl)\n                glMultiTexCoord2dv_Impl(target, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord2f_Hook(GLenum target, GLfloat s, GLfloat t)\n        {\n            if(glMultiTexCoord2f_Impl)\n                glMultiTexCoord2f_Impl(target, s, t);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord2fv_Hook(GLenum target, const GLfloat *v)\n        {\n            if(glMultiTexCoord2fv_Impl)\n                glMultiTexCoord2fv_Impl(target, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord2i_Hook(GLenum target, GLint s, GLint t)\n        {\n            if(glMultiTexCoord2i_Impl)\n                glMultiTexCoord2i_Impl(target, s, t);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord2iv_Hook(GLenum target, const GLint *v)\n        {\n            if(glMultiTexCoord2iv_Impl)\n                glMultiTexCoord2iv_Impl(target, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord2s_Hook(GLenum target, GLshort s, GLshort t)\n        {\n            if(glMultiTexCoord2s_Impl)\n                glMultiTexCoord2s_Impl(target, s, t);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord2sv_Hook(GLenum target, const GLshort *v)\n        {\n            if(glMultiTexCoord2sv_Impl)\n                glMultiTexCoord2sv_Impl(target, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord3d_Hook(GLenum target, GLdouble s, GLdouble t, GLdouble r)\n        {\n            if(glMultiTexCoord3d_Impl)\n                glMultiTexCoord3d_Impl(target, s, t, r);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord3dv_Hook(GLenum target, const GLdouble *v)\n        {\n            if(glMultiTexCoord3dv_Impl)\n                glMultiTexCoord3dv_Impl(target, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord3f_Hook(GLenum target, GLfloat s, GLfloat t, GLfloat r)\n        {\n            if(glMultiTexCoord3f_Impl)\n                glMultiTexCoord3f_Impl(target, s, t, r);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord3fv_Hook(GLenum target, const GLfloat *v)\n        {\n            if(glMultiTexCoord3fv_Impl)\n                glMultiTexCoord3fv_Impl(target, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord3i_Hook(GLenum target, GLint s, GLint t, GLint r)\n        {\n            if(glMultiTexCoord3i_Impl)\n                glMultiTexCoord3i_Impl(target, s, t, r);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord3iv_Hook(GLenum target, const GLint *v)\n        {\n            if(glMultiTexCoord3iv_Impl)\n                glMultiTexCoord3iv_Impl(target, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord3s_Hook(GLenum target, GLshort s, GLshort t, GLshort r)\n        {\n            if(glMultiTexCoord3s_Impl)\n                glMultiTexCoord3s_Impl(target, s, t, r);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord3sv_Hook(GLenum target, const GLshort *v)\n        {\n            if(glMultiTexCoord3sv_Impl)\n                glMultiTexCoord3sv_Impl(target, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord4d_Hook(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)\n        {\n            if(glMultiTexCoord4d_Impl)\n                glMultiTexCoord4d_Impl(target, s, t, r, q);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord4dv_Hook(GLenum target, const GLdouble *v)\n        {\n            if(glMultiTexCoord4dv_Impl)\n                glMultiTexCoord4dv_Impl(target, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord4f_Hook(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)\n        {\n            if(glMultiTexCoord4f_Impl)\n                glMultiTexCoord4f_Impl(target, s, t, r, q);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord4fv_Hook(GLenum target, const GLfloat *v)\n        {\n            if(glMultiTexCoord4fv_Impl)\n                glMultiTexCoord4fv_Impl(target, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord4i_Hook(GLenum target, GLint s, GLint t, GLint r, GLint q)\n        {\n            if(glMultiTexCoord4i_Impl)\n                glMultiTexCoord4i_Impl(target, s, t, r, q);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord4iv_Hook(GLenum target, const GLint *v)\n        {\n            if(glMultiTexCoord4iv_Impl)\n                glMultiTexCoord4iv_Impl(target, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord4s_Hook(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)\n        {\n            if(glMultiTexCoord4s_Impl)\n                glMultiTexCoord4s_Impl(target, s, t, r, q);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiTexCoord4sv_Hook(GLenum target, const GLshort *v)\n        {\n            if(glMultiTexCoord4sv_Impl)\n                glMultiTexCoord4sv_Impl(target, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glLoadTransposeMatrixf_Hook(const GLfloat *m)\n        {\n            if(glLoadTransposeMatrixf_Impl)\n                glLoadTransposeMatrixf_Impl(m);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glLoadTransposeMatrixd_Hook(const GLdouble *m)\n        {\n            if(glLoadTransposeMatrixd_Impl)\n                glLoadTransposeMatrixd_Impl(m);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultTransposeMatrixf_Hook(const GLfloat *m)\n        {\n            if(glMultTransposeMatrixf_Impl)\n                glMultTransposeMatrixf_Impl(m);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultTransposeMatrixd_Hook(const GLdouble *m)\n        {\n            if(glMultTransposeMatrixd_Impl)\n                glMultTransposeMatrixd_Impl(m);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_VERSION_1_4\n        void OVR::GLEContext::glBlendFuncSeparate_Hook(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha)\n        {\n            if(glBlendFuncSeparate_Impl)\n                glBlendFuncSeparate_Impl(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiDrawArrays_Hook(GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount)\n        {\n            if(glMultiDrawArrays_Impl)\n                glMultiDrawArrays_Impl(mode, first, count, primcount);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiDrawElements_Hook(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount)\n        {\n            if(glMultiDrawElements_Impl)\n                glMultiDrawElements_Impl(mode, count, type, indices, primcount);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glPointParameterf_Hook(GLenum pname, GLfloat param)\n        {\n            if(glPointParameterf_Impl)\n                glPointParameterf_Impl(pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glPointParameterfv_Hook(GLenum pname, const GLfloat *params)\n        {\n            if(glPointParameterfv_Impl)\n                glPointParameterfv_Impl(pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glPointParameteri_Hook(GLenum pname, GLint param)\n        {\n            if(glPointParameteri_Impl)\n                glPointParameteri_Impl(pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glPointParameteriv_Hook(GLenum pname, const GLint *params)\n        {\n            if(glPointParameteriv_Impl)\n                glPointParameteriv_Impl(pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_VERSION_1_4 deprecated functions\n        void OVR::GLEContext::glFogCoordf_Hook(GLfloat coord)\n        {\n            if(glFogCoordf_Impl)\n                glFogCoordf_Impl(coord);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glFogCoordfv_Hook(const GLfloat *coord)\n        {\n            if(glFogCoordfv_Impl)\n                glFogCoordfv_Impl(coord);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glFogCoordd_Hook(GLdouble coord)\n        {\n            if(glFogCoordd_Impl)\n                glFogCoordd_Impl(coord);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glFogCoorddv_Hook(const GLdouble *coord)\n        {\n            if(glFogCoorddv_Impl)\n                glFogCoorddv_Impl(coord);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glFogCoordPointer_Hook(GLenum type, GLsizei stride, const GLvoid *pointer)\n        {\n            if(glFogCoordPointer_Impl)\n                glFogCoordPointer_Impl(type, stride, pointer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSecondaryColor3b_Hook(GLbyte red, GLbyte green, GLbyte blue)\n        {\n            if(glSecondaryColor3b_Impl)\n                glSecondaryColor3b_Impl(red, green, blue);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSecondaryColor3bv_Hook(const GLbyte *v)\n        {\n            if(glSecondaryColor3bv_Impl)\n                glSecondaryColor3bv_Impl(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSecondaryColor3d_Hook(GLdouble red, GLdouble green, GLdouble blue)\n        {\n            if(glSecondaryColor3d_Impl)\n                glSecondaryColor3d_Impl(red, green, blue);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSecondaryColor3dv_Hook(const GLdouble *v)\n        {\n            if(glSecondaryColor3dv_Impl)\n                glSecondaryColor3dv_Impl(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSecondaryColor3f_Hook(GLfloat red, GLfloat green, GLfloat blue)\n        {\n            if(glSecondaryColor3f_Impl)\n                glSecondaryColor3f_Impl(red, green, blue);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSecondaryColor3fv_Hook(const GLfloat *v)\n        {\n            if(glSecondaryColor3fv_Impl)\n                glSecondaryColor3fv_Impl(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSecondaryColor3i_Hook(GLint red, GLint green, GLint blue)\n        {\n            if(glSecondaryColor3i_Impl)\n                glSecondaryColor3i_Impl(red, green, blue);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSecondaryColor3iv_Hook(const GLint *v)\n        {\n            if(glSecondaryColor3iv_Impl)\n                glSecondaryColor3iv_Impl(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSecondaryColor3s_Hook(GLshort red, GLshort green, GLshort blue)\n        {\n            if(glSecondaryColor3s_Impl)\n                glSecondaryColor3s_Impl(red, green, blue);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSecondaryColor3sv_Hook(const GLshort *v)\n        {\n            if(glSecondaryColor3sv_Impl)\n                glSecondaryColor3sv_Impl(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSecondaryColor3ub_Hook(GLubyte red, GLubyte green, GLubyte blue)\n        {\n            if(glSecondaryColor3ub_Impl)\n                glSecondaryColor3ub_Impl(red, green, blue);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSecondaryColor3ubv_Hook(const GLubyte *v)\n        {\n            if(glSecondaryColor3ubv_Impl)\n                glSecondaryColor3ubv_Impl(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSecondaryColor3ui_Hook(GLuint red, GLuint green, GLuint blue)\n        {\n            if(glSecondaryColor3ui_Impl)\n                glSecondaryColor3ui_Impl(red, green, blue);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSecondaryColor3uiv_Hook(const GLuint *v)\n        {\n            if(glSecondaryColor3uiv_Impl)\n                glSecondaryColor3uiv_Impl(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSecondaryColor3us_Hook(GLushort red, GLushort green, GLushort blue)\n        {\n            if(glSecondaryColor3us_Impl)\n                glSecondaryColor3us_Impl(red, green, blue);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSecondaryColor3usv_Hook(const GLushort *v)\n        {\n            if(glSecondaryColor3usv_Impl)\n                glSecondaryColor3usv_Impl(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSecondaryColorPointer_Hook(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)\n        {\n            if(glSecondaryColorPointer_Impl)\n                glSecondaryColorPointer_Impl(size, type, stride, pointer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glWindowPos2d_Hook(GLdouble x, GLdouble y)\n        {\n            if(glWindowPos2d_Impl)\n                glWindowPos2d_Impl(x, y);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glWindowPos2dv_Hook(const GLdouble *v)\n        {\n            if(glWindowPos2dv_Impl)\n                glWindowPos2dv_Impl(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glWindowPos2f_Hook(GLfloat x, GLfloat y)\n        {\n            if(glWindowPos2f_Impl)\n                glWindowPos2f_Impl(x, y);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glWindowPos2fv_Hook(const GLfloat *v)\n        {\n            if(glWindowPos2fv_Impl)\n                glWindowPos2fv_Impl(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glWindowPos2i_Hook(GLint x, GLint y)\n        {\n            if(glWindowPos2i_Impl)\n                glWindowPos2i_Impl(x, y);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glWindowPos2iv_Hook(const GLint *v)\n        {\n            if(glWindowPos2iv_Impl)\n                glWindowPos2iv_Impl(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glWindowPos2s_Hook(GLshort x, GLshort y)\n        {\n            if(glWindowPos2s_Impl)\n                glWindowPos2s_Impl(x, y);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glWindowPos2sv_Hook(const GLshort *v)\n        {\n            if(glWindowPos2sv_Impl)\n                glWindowPos2sv_Impl(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glWindowPos3d_Hook(GLdouble x, GLdouble y, GLdouble z)\n        {\n            if(glWindowPos3d_Impl)\n                glWindowPos3d_Impl(x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glWindowPos3dv_Hook(const GLdouble *v)\n        {\n            if(glWindowPos3dv_Impl)\n                glWindowPos3dv_Impl(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glWindowPos3f_Hook(GLfloat x, GLfloat y, GLfloat z)\n        {\n            if(glWindowPos3f_Impl)\n                glWindowPos3f_Impl(x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glWindowPos3fv_Hook(const GLfloat *v)\n        {\n            if(glWindowPos3fv_Impl)\n                glWindowPos3fv_Impl(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glWindowPos3i_Hook(GLint x, GLint y, GLint z)\n        {\n            if(glWindowPos3i_Impl)\n                glWindowPos3i_Impl(x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glWindowPos3iv_Hook(const GLint *v)\n        {\n            if(glWindowPos3iv_Impl)\n                glWindowPos3iv_Impl(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glWindowPos3s_Hook(GLshort x, GLshort y, GLshort z)\n        {\n            if(glWindowPos3s_Impl)\n                glWindowPos3s_Impl(x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glWindowPos3sv_Hook(const GLshort *v)\n        {\n            if(glWindowPos3sv_Impl)\n                glWindowPos3sv_Impl(v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_VERSION_1_5\n        void OVR::GLEContext::glGenQueries_Hook(GLsizei n, GLuint *ids)\n        {\n            if(glGenQueries_Impl)\n                glGenQueries_Impl(n, ids);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDeleteQueries_Hook(GLsizei n, const GLuint *ids)\n        {\n            if(glDeleteQueries_Impl)\n                glDeleteQueries_Impl(n, ids);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLboolean OVR::GLEContext::glIsQuery_Hook(GLuint id)\n        {\n            GLboolean b = GL_FALSE;\n            if(glIsQuery_Impl)\n                b = glIsQuery_Impl(id);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n        void OVR::GLEContext::glBeginQuery_Hook(GLenum target, GLuint id)\n        {\n            if(glBeginQuery_Impl)\n                glBeginQuery_Impl(target, id);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glEndQuery_Hook(GLenum target)\n        {\n            if(glEndQuery_Impl)\n                glEndQuery_Impl(target);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetQueryiv_Hook(GLenum target, GLenum pname, GLint *params)\n        {\n            if(glGetQueryiv_Impl)\n                glGetQueryiv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetQueryObjectiv_Hook(GLuint id, GLenum pname, GLint *params)\n        {\n            if(glGetQueryObjectiv_Impl)\n                glGetQueryObjectiv_Impl(id, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetQueryObjectuiv_Hook(GLuint id, GLenum pname, GLuint *params)\n        {\n            if(glGetQueryObjectuiv_Impl)\n                glGetQueryObjectuiv_Impl(id, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glBindBuffer_Hook(GLenum target, GLuint buffer)\n        {\n            if(glBindBuffer_Impl)\n                glBindBuffer_Impl(target, buffer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDeleteBuffers_Hook(GLsizei n, const GLuint *buffers)\n        {\n            if(glDeleteBuffers_Impl)\n                glDeleteBuffers_Impl(n, buffers);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGenBuffers_Hook(GLsizei n, GLuint *buffers)\n        {\n            if(glGenBuffers_Impl)\n                glGenBuffers_Impl(n, buffers);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLboolean OVR::GLEContext::glIsBuffer_Hook(GLuint buffer)\n        {\n            GLboolean b = GL_FALSE;\n            if(glIsBuffer_Impl)\n                b = glIsBuffer_Impl(buffer);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n        void OVR::GLEContext::glBufferData_Hook(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)\n        {\n            if(glBufferData_Impl)\n                glBufferData_Impl(target, size, data, usage);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glBufferSubData_Hook(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)\n        {\n            if(glBufferSubData_Impl)\n                glBufferSubData_Impl(target, offset, size, data);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetBufferSubData_Hook(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data)\n        {\n            if(glGetBufferSubData_Impl)\n                glGetBufferSubData_Impl(target, offset, size, data);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLvoid* OVR::GLEContext::glMapBuffer_Hook(GLenum target, GLenum access)\n        {\n            GLvoid* p = NULL;\n            if(glMapBuffer_Impl)\n                p = glMapBuffer_Impl(target, access);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return p;\n        }\n\n        GLboolean OVR::GLEContext::glUnmapBuffer_Hook(GLenum target)\n        {\n            GLboolean b = GL_FALSE;\n            if(glUnmapBuffer_Impl)\n                b = glUnmapBuffer_Impl(target);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n        void OVR::GLEContext::glGetBufferParameteriv_Hook(GLenum target, GLenum pname, GLint *params)\n        {\n            if(glGetBufferParameteriv_Impl)\n                glGetBufferParameteriv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetBufferPointerv_Hook(GLenum target, GLenum pname, GLvoid* *params)\n        {\n            if(glGetBufferPointerv_Impl)\n                glGetBufferPointerv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_VERSION_2_0\n        void OVR::GLEContext::glBlendEquationSeparate_Hook(GLenum modeRGB, GLenum modeAlpha)\n        {\n            if(glBlendEquationSeparate_Impl)\n                glBlendEquationSeparate_Impl(modeRGB, modeAlpha);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDrawBuffers_Hook(GLsizei n, const GLenum *bufs)\n        {\n            if(glDrawBuffers_Impl)\n                glDrawBuffers_Impl(n, bufs);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glStencilOpSeparate_Hook(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass)\n        {\n            if(glStencilOpSeparate_Impl)\n                glStencilOpSeparate_Impl(face, sfail, dpfail, dppass);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glStencilFuncSeparate_Hook(GLenum face, GLenum func, GLint ref, GLuint mask)\n        {\n            if(glStencilFuncSeparate_Impl)\n                glStencilFuncSeparate_Impl(face, func, ref, mask);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glStencilMaskSeparate_Hook(GLenum face, GLuint mask)\n        {\n            if(glStencilMaskSeparate_Impl)\n                glStencilMaskSeparate_Impl(face, mask);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glAttachShader_Hook(GLuint program, GLuint shader)\n        {\n            if(glAttachShader_Impl)\n                glAttachShader_Impl(program, shader);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glBindAttribLocation_Hook(GLuint program, GLuint index, const GLchar *name)\n        {\n            if(glBindAttribLocation_Impl)\n                glBindAttribLocation_Impl(program, index, name);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glCompileShader_Hook(GLuint shader)\n        {\n            if(glCompileShader_Impl)\n                glCompileShader_Impl(shader);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLuint OVR::GLEContext::glCreateProgram_Hook()\n        {\n            GLuint u = 0;\n            if(glCreateProgram_Impl)\n                u = glCreateProgram_Impl();\n            PostHook(GLE_CURRENT_FUNCTION);\n            return u;\n        }\n\n        GLuint OVR::GLEContext::glCreateShader_Hook(GLenum type)\n        {\n            GLuint u = 0;\n            if(glCreateShader_Impl)\n                u = glCreateShader_Impl(type);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return u;\n        }\n\n        void OVR::GLEContext::glDeleteProgram_Hook(GLuint program)\n        {\n            if(glDeleteProgram_Impl)\n                glDeleteProgram_Impl(program);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDeleteShader_Hook(GLuint shader)\n        {\n            if(glDeleteShader_Impl)\n                glDeleteShader_Impl(shader);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDetachShader_Hook(GLuint program, GLuint shader)\n        {\n            if(glDetachShader_Impl)\n                glDetachShader_Impl(program, shader);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDisableVertexAttribArray_Hook(GLuint index)\n        {\n            if(glDisableVertexAttribArray_Impl)\n                glDisableVertexAttribArray_Impl(index);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glEnableVertexAttribArray_Hook(GLuint index)\n        {\n            if(glEnableVertexAttribArray_Impl)\n                glEnableVertexAttribArray_Impl(index);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetActiveAttrib_Hook(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)\n        {\n            if(glGetActiveAttrib_Impl)\n                glGetActiveAttrib_Impl(program, index, bufSize, length, size, type, name);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetActiveUniform_Hook(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)\n        {\n            if(glGetActiveUniform_Impl)\n                glGetActiveUniform_Impl(program, index, bufSize, length, size, type, name);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetAttachedShaders_Hook(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj)\n        {\n            if(glGetAttachedShaders_Impl)\n                glGetAttachedShaders_Impl(program, maxCount, count, obj);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLint OVR::GLEContext::glGetAttribLocation_Hook(GLuint program, const GLchar *name)\n        {\n            GLint i = 0;\n            if(glGetAttribLocation_Impl)\n                i = glGetAttribLocation_Impl(program, name);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return i;\n        }\n\n        void OVR::GLEContext::glGetProgramiv_Hook(GLuint program, GLenum pname, GLint *params)\n        {\n            if(glGetProgramiv_Impl)\n                glGetProgramiv_Impl(program, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetProgramInfoLog_Hook(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)\n        {\n            if(glGetProgramInfoLog_Impl)\n                glGetProgramInfoLog_Impl(program, bufSize, length, infoLog);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetShaderiv_Hook(GLuint shader, GLenum pname, GLint *params)\n        {\n            if(glGetShaderiv_Impl)\n                glGetShaderiv_Impl(shader, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetShaderInfoLog_Hook(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)\n        {\n            if(glGetShaderInfoLog_Impl)\n                glGetShaderInfoLog_Impl(shader, bufSize, length, infoLog);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetShaderSource_Hook(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source)\n        {\n            if(glGetShaderSource_Impl)\n                glGetShaderSource_Impl(shader, bufSize, length, source);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLint OVR::GLEContext::glGetUniformLocation_Hook(GLuint program, const GLchar *name)\n        {\n            GLint i = 0;\n            if(glGetUniformLocation_Impl)\n                i = glGetUniformLocation_Impl(program, name);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return i;\n        }\n\n        void OVR::GLEContext::glGetUniformfv_Hook(GLuint program, GLint location, GLfloat *params)\n        {\n            if(glGetUniformfv_Impl)\n                glGetUniformfv_Impl(program, location, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetUniformiv_Hook(GLuint program, GLint location, GLint *params)\n        {\n            if(glGetUniformiv_Impl)\n                glGetUniformiv_Impl(program, location, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetVertexAttribdv_Hook(GLuint index, GLenum pname, GLdouble *params)\n        {\n            if(glGetVertexAttribdv_Impl)\n                glGetVertexAttribdv_Impl(index, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetVertexAttribfv_Hook(GLuint index, GLenum pname, GLfloat *params)\n        {\n            if(glGetVertexAttribfv_Impl)\n                glGetVertexAttribfv_Impl(index, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetVertexAttribiv_Hook(GLuint index, GLenum pname, GLint *params)\n        {\n            if(glGetVertexAttribiv_Impl)\n                glGetVertexAttribiv_Impl(index, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetVertexAttribPointerv_Hook(GLuint index, GLenum pname, GLvoid* *pointer)\n        {\n            if(glGetVertexAttribPointerv_Impl)\n                glGetVertexAttribPointerv_Impl(index, pname, pointer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLboolean OVR::GLEContext::glIsProgram_Hook(GLuint program)\n        {\n            GLboolean b = GL_FALSE;\n            if(glIsProgram_Impl)\n                b = glIsProgram_Impl(program);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n        GLboolean OVR::GLEContext::glIsShader_Hook(GLuint shader)\n        {\n            GLboolean b = GL_FALSE;\n            if(glIsShader_Impl)\n                b = glIsShader_Impl(shader);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n        void OVR::GLEContext::glLinkProgram_Hook(GLuint program)\n        {\n            if(glLinkProgram_Impl)\n                glLinkProgram_Impl(program);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glShaderSource_Hook(GLuint shader, GLsizei count, const GLchar* *string, const GLint *length)\n        {\n            if(glShaderSource_Impl)\n                glShaderSource_Impl(shader, count, string, length);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUseProgram_Hook(GLuint program)\n        {\n            if(glUseProgram_Impl)\n                glUseProgram_Impl(program);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform1f_Hook(GLint location, GLfloat v0)\n        {\n            if(glUniform1f_Impl)\n                glUniform1f_Impl(location, v0);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform2f_Hook(GLint location, GLfloat v0, GLfloat v1)\n        {\n            if(glUniform2f_Impl)\n                glUniform2f_Impl(location, v0, v1);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform3f_Hook(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)\n        {\n            if(glUniform3f_Impl)\n                glUniform3f_Impl(location, v0, v1, v2);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform4f_Hook(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3)\n        {\n            if(glUniform4f_Impl)\n                glUniform4f_Impl(location, v0, v1, v2, v3);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform1i_Hook(GLint location, GLint v0)\n        {\n            if(glUniform1i_Impl)\n                glUniform1i_Impl(location, v0);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform2i_Hook(GLint location, GLint v0, GLint v1)\n        {\n            if(glUniform2i_Impl)\n                glUniform2i_Impl(location, v0, v1);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform3i_Hook(GLint location, GLint v0, GLint v1, GLint v2)\n        {\n            if(glUniform3i_Impl)\n                glUniform3i_Impl(location, v0, v1, v2);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform4i_Hook(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)\n        {\n            if(glUniform4i_Impl)\n                glUniform4i_Impl(location, v0, v1, v2, v3);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform1fv_Hook(GLint location, GLsizei count, const GLfloat *value)\n        {\n            if(glUniform1fv_Impl)\n                glUniform1fv_Impl(location, count, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform2fv_Hook(GLint location, GLsizei count, const GLfloat *value)\n        {\n            if(glUniform2fv_Impl)\n                glUniform2fv_Impl(location, count, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform3fv_Hook(GLint location, GLsizei count, const GLfloat *value)\n        {\n            if(glUniform3fv_Impl)\n                glUniform3fv_Impl(location, count, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform4fv_Hook(GLint location, GLsizei count, const GLfloat *value)\n        {\n            if(glUniform4fv_Impl)\n                glUniform4fv_Impl(location, count, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform1iv_Hook(GLint location, GLsizei count, const GLint *value)\n        {\n            if(glUniform1iv_Impl)\n                glUniform1iv_Impl(location, count, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform2iv_Hook(GLint location, GLsizei count, const GLint *value)\n        {\n            if(glUniform2iv_Impl)\n                glUniform2iv_Impl(location, count, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform3iv_Hook(GLint location, GLsizei count, const GLint *value)\n        {\n            if(glUniform3iv_Impl)\n                glUniform3iv_Impl(location, count, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform4iv_Hook(GLint location, GLsizei count, const GLint *value)\n        {\n            if(glUniform4iv_Impl)\n                glUniform4iv_Impl(location, count, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniformMatrix2fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\n        {\n            if(glUniformMatrix2fv_Impl)\n                glUniformMatrix2fv_Impl(location, count, transpose, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniformMatrix3fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\n        {\n            if(glUniformMatrix3fv_Impl)\n                glUniformMatrix3fv_Impl(location, count, transpose, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniformMatrix4fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\n        {\n            if(glUniformMatrix4fv_Impl)\n                glUniformMatrix4fv_Impl(location, count, transpose, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glValidateProgram_Hook(GLuint program)\n        {\n            if(glValidateProgram_Impl)\n                glValidateProgram_Impl(program);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib1d_Hook(GLuint index, GLdouble x)\n        {\n            if(glVertexAttrib1d_Impl)\n                glVertexAttrib1d_Impl(index, x);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib1dv_Hook(GLuint index, const GLdouble *v)\n        {\n            if(glVertexAttrib1dv_Impl)\n                glVertexAttrib1dv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib1f_Hook(GLuint index, GLfloat x)\n        {\n            if(glVertexAttrib1f_Impl)\n                glVertexAttrib1f_Impl(index, x);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib1fv_Hook(GLuint index, const GLfloat *v)\n        {\n            if(glVertexAttrib1fv_Impl)\n                glVertexAttrib1fv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib1s_Hook(GLuint index, GLshort x)\n        {\n            if(glVertexAttrib1s_Impl)\n                glVertexAttrib1s_Impl(index, x);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib1sv_Hook(GLuint index, const GLshort *v)\n        {\n            if(glVertexAttrib1sv_Impl)\n                glVertexAttrib1sv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib2d_Hook(GLuint index, GLdouble x, GLdouble y)\n        {\n            if(glVertexAttrib2d_Impl)\n                glVertexAttrib2d_Impl(index, x, y);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib2dv_Hook(GLuint index, const GLdouble *v)\n        {\n            if(glVertexAttrib2dv_Impl)\n                glVertexAttrib2dv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib2f_Hook(GLuint index, GLfloat x, GLfloat y)\n        {\n            if(glVertexAttrib2f_Impl)\n                glVertexAttrib2f_Impl(index, x, y);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib2fv_Hook(GLuint index, const GLfloat *v)\n        {\n            if(glVertexAttrib2fv_Impl)\n                glVertexAttrib2fv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib2s_Hook(GLuint index, GLshort x, GLshort y)\n        {\n            if(glVertexAttrib2s_Impl)\n                glVertexAttrib2s_Impl(index, x, y);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib2sv_Hook(GLuint index, const GLshort *v)\n        {\n            if(glVertexAttrib2sv_Impl)\n                glVertexAttrib2sv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib3d_Hook(GLuint index, GLdouble x, GLdouble y, GLdouble z)\n        {\n            if(glVertexAttrib3d_Impl)\n                glVertexAttrib3d_Impl(index, x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib3dv_Hook(GLuint index, const GLdouble *v)\n        {\n            if(glVertexAttrib3dv_Impl)\n                glVertexAttrib3dv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib3f_Hook(GLuint index, GLfloat x, GLfloat y, GLfloat z)\n        {\n            if(glVertexAttrib3f_Impl)\n                glVertexAttrib3f_Impl(index, x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib3fv_Hook(GLuint index, const GLfloat *v)\n        {\n            if(glVertexAttrib3fv_Impl)\n                glVertexAttrib3fv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib3s_Hook(GLuint index, GLshort x, GLshort y, GLshort z)\n        {\n            if(glVertexAttrib3s_Impl)\n                glVertexAttrib3s_Impl(index, x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib3sv_Hook(GLuint index, const GLshort *v)\n        {\n            if(glVertexAttrib3sv_Impl)\n                glVertexAttrib3sv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib4Nbv_Hook(GLuint index, const GLbyte *v)\n        {\n            if(glVertexAttrib4Nbv_Impl)\n                glVertexAttrib4Nbv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib4Niv_Hook(GLuint index, const GLint *v)\n        {\n            if(glVertexAttrib4Niv_Impl)\n                glVertexAttrib4Niv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib4Nsv_Hook(GLuint index, const GLshort *v)\n        {\n            if(glVertexAttrib4Nsv_Impl)\n                glVertexAttrib4Nsv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib4Nub_Hook(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)\n        {\n            if(glVertexAttrib4Nub_Impl)\n                glVertexAttrib4Nub_Impl(index, x, y, z, w);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib4Nubv_Hook(GLuint index, const GLubyte *v)\n        {\n            if(glVertexAttrib4Nubv_Impl)\n                glVertexAttrib4Nubv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib4Nuiv_Hook(GLuint index, const GLuint *v)\n        {\n            if(glVertexAttrib4Nuiv_Impl)\n                glVertexAttrib4Nuiv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib4Nusv_Hook(GLuint index, const GLushort *v)\n        {\n            if(glVertexAttrib4Nusv_Impl)\n                glVertexAttrib4Nusv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib4bv_Hook(GLuint index, const GLbyte *v)\n        {\n            if(glVertexAttrib4bv_Impl)\n                glVertexAttrib4bv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib4d_Hook(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)\n        {\n            if(glVertexAttrib4d_Impl)\n                glVertexAttrib4d_Impl(index, x, y, z, w);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib4dv_Hook(GLuint index, const GLdouble *v)\n        {\n            if(glVertexAttrib4dv_Impl)\n                glVertexAttrib4dv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib4f_Hook(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)\n        {\n            if(glVertexAttrib4f_Impl)\n                glVertexAttrib4f_Impl(index, x, y, z, w);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib4fv_Hook(GLuint index, const GLfloat *v)\n        {\n            if(glVertexAttrib4fv_Impl)\n                glVertexAttrib4fv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib4iv_Hook(GLuint index, const GLint *v)\n        {\n            if(glVertexAttrib4iv_Impl)\n                glVertexAttrib4iv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib4s_Hook(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)\n        {\n            if(glVertexAttrib4s_Impl)\n                glVertexAttrib4s_Impl(index, x, y, z, w);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib4sv_Hook(GLuint index, const GLshort *v)\n        {\n            if(glVertexAttrib4sv_Impl)\n                glVertexAttrib4sv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib4ubv_Hook(GLuint index, const GLubyte *v)\n        {\n            if(glVertexAttrib4ubv_Impl)\n                glVertexAttrib4ubv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib4uiv_Hook(GLuint index, const GLuint *v)\n        {\n            if(glVertexAttrib4uiv_Impl)\n                glVertexAttrib4uiv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttrib4usv_Hook(GLuint index, const GLushort *v)\n        {\n            if(glVertexAttrib4usv_Impl)\n                glVertexAttrib4usv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribPointer_Hook(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)\n        {\n            if(glVertexAttribPointer_Impl)\n                glVertexAttribPointer_Impl(index, size, type, normalized, stride, pointer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_VERSION_2_1\n        void OVR::GLEContext::glUniformMatrix2x3fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\n        {\n            if(glUniformMatrix2x3fv_Impl)\n                glUniformMatrix2x3fv_Impl(location, count, transpose, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniformMatrix3x2fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\n        {\n            if(glUniformMatrix3x2fv_Impl)\n                glUniformMatrix3x2fv_Impl(location, count, transpose, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniformMatrix2x4fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\n        {\n            if(glUniformMatrix2x4fv_Impl)\n                glUniformMatrix2x4fv_Impl(location, count, transpose, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniformMatrix4x2fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\n        {\n            if(glUniformMatrix4x2fv_Impl)\n                glUniformMatrix4x2fv_Impl(location, count, transpose, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniformMatrix3x4fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\n        {\n            if(glUniformMatrix3x4fv_Impl)\n                glUniformMatrix3x4fv_Impl(location, count, transpose, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniformMatrix4x3fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)\n        {\n            if(glUniformMatrix4x3fv_Impl)\n                glUniformMatrix4x3fv_Impl(location, count, transpose, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_VERSION_3_0\n        void OVR::GLEContext::glColorMaski_Hook(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)\n        {\n            if(glColorMaski_Impl)\n                glColorMaski_Impl(index, r, g, b, a);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetBooleani_v_Hook(GLenum target, GLuint index, GLboolean *data)\n        {\n            if(glGetBooleani_v_Impl)\n                glGetBooleani_v_Impl(target, index, data);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetIntegeri_v_Hook(GLenum target, GLuint index, GLint *data)\n        {\n            if(glGetIntegeri_v_Impl)\n                glGetIntegeri_v_Impl(target, index, data);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glEnablei_Hook(GLenum target, GLuint index)\n        {\n            if(glEnablei_Impl)\n                glEnablei_Impl(target, index);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDisablei_Hook(GLenum target, GLuint index)\n        {\n            if(glDisablei_Impl)\n                glDisablei_Impl(target, index);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLboolean OVR::GLEContext::glIsEnabledi_Hook(GLenum target, GLuint index)\n        {\n            GLboolean b = GL_FALSE;\n            if(glIsEnabledi_Impl)\n                b = glIsEnabledi_Impl(target, index);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n        void OVR::GLEContext::glBeginTransformFeedback_Hook(GLenum primitiveMode)\n        {\n            if(glBeginTransformFeedback_Impl)\n                glBeginTransformFeedback_Impl(primitiveMode);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glEndTransformFeedback_Hook()\n        {\n            if(glEndTransformFeedback_Impl)\n                glEndTransformFeedback_Impl();\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glBindBufferRange_Hook(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)\n        {\n            if(glBindBufferRange_Impl)\n                glBindBufferRange_Impl(target, index, buffer, offset, size);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glBindBufferBase_Hook(GLenum target, GLuint index, GLuint buffer)\n        {\n            if(glBindBufferBase_Impl)\n                glBindBufferBase_Impl(target, index, buffer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glTransformFeedbackVaryings_Hook(GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode)\n        {\n            if(glTransformFeedbackVaryings_Impl)\n                glTransformFeedbackVaryings_Impl(program, count, varyings, bufferMode);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetTransformFeedbackVarying_Hook(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)\n        {\n            if(glGetTransformFeedbackVarying_Impl)\n                glGetTransformFeedbackVarying_Impl(program, index, bufSize, length, size, type, name);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glClampColor_Hook(GLenum target, GLenum clamp)\n        {\n            if(glClampColor_Impl)\n                glClampColor_Impl(target, clamp);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glBeginConditionalRender_Hook(GLuint id, GLenum mode)\n        {\n            if(glBeginConditionalRender_Impl)\n                glBeginConditionalRender_Impl(id, mode);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glEndConditionalRender_Hook()\n        {\n            if(glEndConditionalRender_Impl)\n                glEndConditionalRender_Impl();\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribIPointer_Hook(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)\n        {\n            if(glVertexAttribIPointer_Impl)\n                glVertexAttribIPointer_Impl(index, size, type,  stride, pointer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetVertexAttribIiv_Hook(GLuint index, GLenum pname, GLint *params)\n        {\n            if(glGetVertexAttribIiv_Impl)\n                glGetVertexAttribIiv_Impl(index, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetVertexAttribIuiv_Hook(GLuint index, GLenum pname, GLuint *params)\n        {\n            if(glGetVertexAttribIuiv_Impl)\n                glGetVertexAttribIuiv_Impl(index, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI1i_Hook(GLuint index, GLint x)\n        {\n            if(glVertexAttribI1i_Impl)\n                glVertexAttribI1i_Impl(index, x);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI2i_Hook(GLuint index, GLint x, GLint y)\n        {\n            if(glVertexAttribI2i_Impl)\n                glVertexAttribI2i_Impl(index, x, y);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI3i_Hook(GLuint index, GLint x, GLint y, GLint z)\n        {\n            if(glVertexAttribI3i_Impl)\n                glVertexAttribI3i_Impl(index, x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI4i_Hook(GLuint index, GLint x, GLint y, GLint z, GLint w)\n        {\n            if(glVertexAttribI4i_Impl)\n                glVertexAttribI4i_Impl(index, x, y, z, w);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI1ui_Hook(GLuint index, GLuint x)\n        {\n            if(glVertexAttribI1ui_Impl)\n                glVertexAttribI1ui_Impl(index, x);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI2ui_Hook(GLuint index, GLuint x, GLuint y)\n        {\n            if(glVertexAttribI2ui_Impl)\n                glVertexAttribI2ui_Impl(index, x, y);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI3ui_Hook(GLuint index, GLuint x, GLuint y, GLuint z)\n        {\n            if(glVertexAttribI3ui_Impl)\n                glVertexAttribI3ui_Impl(index, x, y, z);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI4ui_Hook(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)\n        {\n            if(glVertexAttribI4ui_Impl)\n                glVertexAttribI4ui_Impl(index, x, y, z, w);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI1iv_Hook(GLuint index, const GLint *v)\n        {\n            if(glVertexAttribI1iv_Impl)\n                glVertexAttribI1iv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI2iv_Hook(GLuint index, const GLint *v)\n        {\n            if(glVertexAttribI2iv_Impl)\n                glVertexAttribI2iv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI3iv_Hook(GLuint index, const GLint *v)\n        {\n            if(glVertexAttribI3iv_Impl)\n                glVertexAttribI3iv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI4iv_Hook(GLuint index, const GLint *v)\n        {\n            if(glVertexAttribI4iv_Impl)\n                glVertexAttribI4iv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI1uiv_Hook(GLuint index, const GLuint *v)\n        {\n            if(glVertexAttribI1uiv_Impl)\n                glVertexAttribI1uiv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI2uiv_Hook(GLuint index, const GLuint *v)\n        {\n            if(glVertexAttribI2uiv_Impl)\n                glVertexAttribI2uiv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI3uiv_Hook(GLuint index, const GLuint *v)\n        {\n            if(glVertexAttribI3uiv_Impl)\n                glVertexAttribI3uiv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI4uiv_Hook(GLuint index, const GLuint *v)\n        {\n            if(glVertexAttribI4uiv_Impl)\n                glVertexAttribI4uiv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI4bv_Hook(GLuint index, const GLbyte *v)\n        {\n            if(glVertexAttribI4bv_Impl)\n                glVertexAttribI4bv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI4sv_Hook(GLuint index, const GLshort *v)\n        {\n            if(glVertexAttribI4sv_Impl)\n                glVertexAttribI4sv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI4ubv_Hook(GLuint index, const GLubyte *v)\n        {\n            if(glVertexAttribI4ubv_Impl)\n                glVertexAttribI4ubv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexAttribI4usv_Hook(GLuint index, const GLushort *v)\n        {\n            if(glVertexAttribI4usv_Impl)\n                glVertexAttribI4usv_Impl(index, v);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetUniformuiv_Hook(GLuint program, GLint location, GLuint *params)\n        {\n            if(glGetUniformuiv_Impl)\n                glGetUniformuiv_Impl(program, location, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glBindFragDataLocation_Hook(GLuint program, GLuint color, const GLchar *name)\n        {\n            if(glBindFragDataLocation_Impl)\n                glBindFragDataLocation_Impl(program, color, name);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLint OVR::GLEContext::glGetFragDataLocation_Hook(GLuint program, const GLchar *name)\n        {\n            GLint i = 0;\n            if(glGetFragDataLocation_Impl)\n                i = glGetFragDataLocation_Impl(program, name);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return i;\n        }\n\n        void OVR::GLEContext::glUniform1ui_Hook(GLint location, GLuint v0)\n        {\n            if(glUniform1ui_Impl)\n                glUniform1ui_Impl(location, v0);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform2ui_Hook(GLint location, GLuint v0, GLuint v1)\n        {\n            if(glUniform2ui_Impl)\n                glUniform2ui_Impl(location, v0, v1);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform3ui_Hook(GLint location, GLuint v0, GLuint v1, GLuint v2)\n        {\n            if(glUniform3ui_Impl)\n                glUniform3ui_Impl(location, v0, v1, v2);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform4ui_Hook(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)\n        {\n            if(glUniform4ui_Impl)\n                glUniform4ui_Impl(location, v0, v1, v2, v3);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform1uiv_Hook(GLint location, GLsizei count, const GLuint *value)\n        {\n            if(glUniform1uiv_Impl)\n                glUniform1uiv_Impl(location, count, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform2uiv_Hook(GLint location, GLsizei count, const GLuint *value)\n        {\n            if(glUniform2uiv_Impl)\n                glUniform2uiv_Impl(location, count, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform3uiv_Hook(GLint location, GLsizei count, const GLuint *value)\n        {\n            if(glUniform3uiv_Impl)\n                glUniform3uiv_Impl(location, count, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glUniform4uiv_Hook(GLint location, GLsizei count, const GLuint *value)\n        {\n            if(glUniform4uiv_Impl)\n                glUniform4uiv_Impl(location, count, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glTexParameterIiv_Hook(GLenum target, GLenum pname, const GLint *params)\n        {\n            if(glTexParameterIiv_Impl)\n                glTexParameterIiv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glTexParameterIuiv_Hook(GLenum target, GLenum pname, const GLuint *params)\n        {\n            if(glTexParameterIuiv_Impl)\n                glTexParameterIuiv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetTexParameterIiv_Hook(GLenum target, GLenum pname, GLint *params)\n        {\n            if(glGetTexParameterIiv_Impl)\n                glGetTexParameterIiv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetTexParameterIuiv_Hook(GLenum target, GLenum pname, GLuint *params)\n        {\n            if(glGetTexParameterIuiv_Impl)\n                glGetTexParameterIuiv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glClearBufferiv_Hook(GLenum buffer, GLint drawbuffer, const GLint *value)\n        {\n            if(glClearBufferiv_Impl)\n                glClearBufferiv_Impl(buffer, drawbuffer, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glClearBufferuiv_Hook(GLenum buffer, GLint drawbuffer, const GLuint *value)\n        {\n            if(glClearBufferuiv_Impl)\n                glClearBufferuiv_Impl(buffer, drawbuffer, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glClearBufferfv_Hook(GLenum buffer, GLint drawbuffer, const GLfloat *value)\n        {\n            if(glClearBufferfv_Impl)\n                glClearBufferfv_Impl(buffer, drawbuffer, value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glClearBufferfi_Hook(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)\n        {\n            if(glClearBufferfi_Impl)\n                glClearBufferfi_Impl(buffer, drawbuffer, depth, stencil);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        const GLubyte* OVR::GLEContext::glGetStringi_Hook(GLenum name, GLuint index)\n        {\n            const GLubyte* p = NULL;\n            if(glGetStringi_Impl)\n                p = glGetStringi_Impl(name, index);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return p;\n        }\n\n\n        // GL_VERSION_3_1\n        void OVR::GLEContext::glDrawArraysInstanced_Hook(GLenum mode, GLint first, GLsizei count, GLsizei primcount)\n        {\n            if(glDrawArraysInstanced_Impl)\n                glDrawArraysInstanced_Impl(mode, first, count, primcount);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDrawElementsInstanced_Hook(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)\n        {\n            if(glDrawElementsInstanced_Impl)\n                glDrawElementsInstanced_Impl(mode, count, type, indices, primcount);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glTexBuffer_Hook(GLenum target, GLenum internalformat, GLuint buffer)\n        {\n            if(glTexBuffer_Impl)\n                glTexBuffer_Impl(target, internalformat, buffer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glPrimitiveRestartIndex_Hook(GLuint index)\n        {\n            if(glPrimitiveRestartIndex_Impl)\n                glPrimitiveRestartIndex_Impl(index);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_VERSION_3_2\n        void OVR::GLEContext::glGetInteger64i_v_Hook(GLenum target, GLuint index, GLint64 *data)\n        {\n            if(glGetInteger64i_v_Impl)\n                glGetInteger64i_v_Impl(target, index, data);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetBufferParameteri64v_Hook(GLenum target, GLenum pname, GLint64 *params)\n        {\n            if(glGetBufferParameteri64v_Impl)\n                glGetBufferParameteri64v_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glFramebufferTexture_Hook(GLenum target, GLenum attachment, GLuint texture, GLint level)\n        {\n            if(glFramebufferTexture_Impl)\n                glFramebufferTexture_Impl(target, attachment, texture, level);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_VERSION_3_3\n        void OVR::GLEContext::glVertexAttribDivisor_Hook(GLuint index, GLuint divisor)\n        {\n            if(glVertexAttribDivisor_Impl)\n                glVertexAttribDivisor_Impl(index, divisor);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_VERSION_4_0\n        void OVR::GLEContext::glMinSampleShading_Hook(GLclampf value)\n        {\n            if(glMinSampleShading_Impl)\n                glMinSampleShading_Impl(value);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glBlendEquationi_Hook(GLuint buf, GLenum mode)\n        {\n            if(glBlendEquationi_Impl)\n                glBlendEquationi_Impl(buf, mode);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glBlendEquationSeparatei_Hook(GLuint buf, GLenum modeRGB, GLenum modeAlpha)\n        {\n            if(glBlendEquationSeparatei_Impl)\n                glBlendEquationSeparatei_Impl(buf, modeRGB, modeAlpha);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glBlendFunci_Hook(GLuint buf, GLenum src, GLenum dst)\n        {\n            if(glBlendFunci_Impl)\n                glBlendFunci_Impl(buf, src, dst);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glBlendFuncSeparatei_Hook(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)\n        {\n            if(glBlendFuncSeparatei_Impl)\n                glBlendFuncSeparatei_Impl(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_AMD_debug_output\n        void OVR::GLEContext::glDebugMessageEnableAMD_Hook(GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)\n        {\n            if(glDebugMessageEnableAMD_Impl)\n                glDebugMessageEnableAMD_Impl(category, severity, count, ids, enabled);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDebugMessageInsertAMD_Hook(GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf)\n        {\n            if(glDebugMessageInsertAMD_Impl)\n                glDebugMessageInsertAMD_Impl(category, severity, id, length, buf);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDebugMessageCallbackAMD_Hook(GLDEBUGPROCAMD callback, GLvoid *userParam)\n        {\n            if(glDebugMessageCallbackAMD_Impl)\n                glDebugMessageCallbackAMD_Impl(callback, userParam);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLuint OVR::GLEContext::glGetDebugMessageLogAMD_Hook(GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message)\n        {\n            GLuint u = 0;\n            if(glGetDebugMessageLogAMD_Impl)\n                u = glGetDebugMessageLogAMD_Impl(count, bufsize, categories, severities, ids, lengths, message);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return u;\n        }\n\n\n    #if defined(GLE_CGL_ENABLED)\n        // GL_APPLE_element_array\n        void OVR::GLEContext::glElementPointerAPPLE_Hook(GLenum type, const GLvoid *pointer)\n        {\n            if(glElementPointerAPPLE_Impl)\n                glElementPointerAPPLE_Impl(type, pointer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDrawElementArrayAPPLE_Hook(GLenum mode, GLint first, GLsizei count)\n        {\n            if(glDrawElementArrayAPPLE_Impl)\n                glDrawElementArrayAPPLE_Impl(mode, first, count);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDrawRangeElementArrayAPPLE_Hook(GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count)\n        {\n            if(glDrawRangeElementArrayAPPLE_Impl)\n                glDrawRangeElementArrayAPPLE_Impl(mode, start, end, first, count);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiDrawElementArrayAPPLE_Hook(GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount)\n        {\n            if(glMultiDrawElementArrayAPPLE_Impl)\n                glMultiDrawElementArrayAPPLE_Impl(mode, first, count, primcount);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMultiDrawRangeElementArrayAPPLE_Hook(GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount)\n        {\n            if(glMultiDrawRangeElementArrayAPPLE_Impl)\n                glMultiDrawRangeElementArrayAPPLE_Impl(mode, start, end, first, count, primcount);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_APPLE_fence\n        void OVR::GLEContext::glGenFencesAPPLE_Hook(GLsizei n, GLuint *fences)\n        {\n            if(glGenFencesAPPLE_Impl)\n                glGenFencesAPPLE_Impl(n, fences);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDeleteFencesAPPLE_Hook(GLsizei n, const GLuint *fences)\n        {\n            if(glDeleteFencesAPPLE_Impl)\n                glDeleteFencesAPPLE_Impl(n, fences);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSetFenceAPPLE_Hook(GLuint fence)\n        {\n            if(glSetFenceAPPLE_Impl)\n                glSetFenceAPPLE_Impl(fence);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLboolean OVR::GLEContext::glIsFenceAPPLE_Hook(GLuint fence)\n        {\n            GLboolean b = GL_FALSE;\n            if(glIsFenceAPPLE_Impl)\n                b = glIsFenceAPPLE_Impl(fence);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n        GLboolean OVR::GLEContext::glTestFenceAPPLE_Hook(GLuint fence)\n        {\n            GLboolean b = GL_FALSE;\n            if(glTestFenceAPPLE_Impl)\n                b = glTestFenceAPPLE_Impl(fence);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n        void OVR::GLEContext::glFinishFenceAPPLE_Hook(GLuint fence)\n        {\n            if(glFinishFenceAPPLE_Impl)\n                glFinishFenceAPPLE_Impl(fence);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLboolean OVR::GLEContext::glTestObjectAPPLE_Hook(GLenum object, GLuint name)\n        {\n            GLboolean b = GL_FALSE;\n            if(glTestObjectAPPLE_Impl)\n                b = glTestObjectAPPLE_Impl(object, name);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n        void OVR::GLEContext::glFinishObjectAPPLE_Hook(GLenum object, GLint name)\n        {\n            if(glFinishObjectAPPLE_Impl)\n                glFinishObjectAPPLE_Impl(object, name);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_APPLE_flush_buffer_range\n        void OVR::GLEContext::glBufferParameteriAPPLE_Hook(GLenum target, GLenum pname, GLint param)\n        {\n            if(glBufferParameteriAPPLE_Impl)\n                glBufferParameteriAPPLE_Impl(target, pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glFlushMappedBufferRangeAPPLE_Hook(GLenum target, GLintptr offset, GLsizeiptr size)\n        {\n            if(glFlushMappedBufferRangeAPPLE_Impl)\n                glFlushMappedBufferRangeAPPLE_Impl(target, offset, size);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_APPLE_object_purgeable\n        GLenum OVR::GLEContext::glObjectPurgeableAPPLE_Hook(GLenum objectType, GLuint name, GLenum option)\n        {\n            GLenum e = 0;\n            if(glObjectPurgeableAPPLE_Impl)\n                e = glObjectPurgeableAPPLE_Impl(objectType, name, option);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return e;\n        }\n\n        GLenum OVR::GLEContext::glObjectUnpurgeableAPPLE_Hook(GLenum objectType, GLuint name, GLenum option)\n        {\n            GLenum e = 0;\n            if(glObjectUnpurgeableAPPLE_Impl)\n                e =glObjectUnpurgeableAPPLE_Impl(objectType, name, option);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return e;\n        }\n\n        void OVR::GLEContext::glGetObjectParameterivAPPLE_Hook(GLenum objectType, GLuint name, GLenum pname, GLint *params)\n        {\n            if(glGetObjectParameterivAPPLE_Impl)\n                glGetObjectParameterivAPPLE_Impl(objectType, name, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_APPLE_texture_range\n        void OVR::GLEContext::glTextureRangeAPPLE_Hook(GLenum target, GLsizei length, const GLvoid *pointer)\n        {\n            if(glTextureRangeAPPLE_Impl)\n                glTextureRangeAPPLE_Impl(target, length, pointer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetTexParameterPointervAPPLE_Hook(GLenum target, GLenum pname, GLvoid **params)\n        {\n            if(glGetTexParameterPointervAPPLE_Impl)\n                glGetTexParameterPointervAPPLE_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_APPLE_vertex_array_object\n        void OVR::GLEContext::glBindVertexArrayAPPLE_Hook(GLuint array)\n        {\n            if(glBindVertexArrayAPPLE_Impl)\n                glBindVertexArrayAPPLE_Impl(array);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDeleteVertexArraysAPPLE_Hook(GLsizei n, const GLuint *arrays)\n        {\n            if(glDeleteVertexArraysAPPLE_Impl)\n                glDeleteVertexArraysAPPLE_Impl(n, arrays);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGenVertexArraysAPPLE_Hook(GLsizei n, GLuint *arrays)\n        {\n            if(glGenVertexArraysAPPLE_Impl)\n                glGenVertexArraysAPPLE_Impl(n, arrays);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLboolean OVR::GLEContext::glIsVertexArrayAPPLE_Hook(GLuint array)\n        {\n            GLboolean b = GL_FALSE;\n            if(glIsVertexArrayAPPLE_Impl)\n                b = glIsVertexArrayAPPLE_Impl(array);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n\n        // GL_APPLE_vertex_array_range\n        void OVR::GLEContext::glVertexArrayRangeAPPLE_Hook(GLsizei length, GLvoid *pointer)\n        {\n            if(glVertexArrayRangeAPPLE_Impl)\n                glVertexArrayRangeAPPLE_Impl(length, pointer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glFlushVertexArrayRangeAPPLE_Hook(GLsizei length, GLvoid *pointer)\n        {\n            if(glFlushVertexArrayRangeAPPLE_Impl)\n                glFlushVertexArrayRangeAPPLE_Impl(length, pointer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glVertexArrayParameteriAPPLE_Hook(GLenum pname, GLint param)\n        {\n            if(glVertexArrayParameteriAPPLE_Impl)\n                glVertexArrayParameteriAPPLE_Impl(pname, param);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_APPLE_vertex_program_evaluators\n        void OVR::GLEContext::glEnableVertexAttribAPPLE_Hook(GLuint index, GLenum pname)\n        {\n            if(glEnableVertexAttribAPPLE_Impl)\n                glEnableVertexAttribAPPLE_Impl(index, pname);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDisableVertexAttribAPPLE_Hook(GLuint index, GLenum pname)\n        {\n            if(glDisableVertexAttribAPPLE_Impl)\n                glDisableVertexAttribAPPLE_Impl(index, pname);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLboolean OVR::GLEContext::glIsVertexAttribEnabledAPPLE_Hook(GLuint index, GLenum pname)\n        {\n            GLboolean b = GL_FALSE;\n            if(glIsVertexAttribEnabledAPPLE_Impl)\n                b = glIsVertexAttribEnabledAPPLE_Impl(index, pname);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n        void OVR::GLEContext::glMapVertexAttrib1dAPPLE_Hook(GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)\n        {\n            if(glMapVertexAttrib1dAPPLE_Impl)\n                glMapVertexAttrib1dAPPLE_Impl(index, size, u1, u2, stride, order, points);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMapVertexAttrib1fAPPLE_Hook(GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)\n        {\n            if(glMapVertexAttrib1fAPPLE_Impl)\n                glMapVertexAttrib1fAPPLE_Impl(index, size, u1, u2, stride, order, points);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMapVertexAttrib2dAPPLE_Hook(GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)\n        {\n            if(glMapVertexAttrib2dAPPLE_Impl)\n                glMapVertexAttrib2dAPPLE_Impl(index, size, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glMapVertexAttrib2fAPPLE_Hook(GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)\n        {\n            if(glMapVertexAttrib2fAPPLE_Impl)\n                glMapVertexAttrib2fAPPLE_Impl(index, size, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n    #endif // GLE_CGL_ENABLED\n\n\n        // GL_ARB_debug_output\n        void OVR::GLEContext::glDebugMessageControlARB_Hook(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled)\n        {\n            if(glDebugMessageControlARB_Impl)\n                glDebugMessageControlARB_Impl(source, type, severity, count, ids, enabled);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDebugMessageInsertARB_Hook(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf)\n        {\n            if(glDebugMessageInsertARB_Impl)\n                glDebugMessageInsertARB_Impl(source, type, id, severity, length, buf);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDebugMessageCallbackARB_Hook(GLDEBUGPROCARB callback, const GLvoid *userParam)\n        {\n            if(glDebugMessageCallbackARB_Impl)\n                glDebugMessageCallbackARB_Impl(callback, userParam);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLuint OVR::GLEContext::glGetDebugMessageLogARB_Hook(GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog)\n        {\n            GLuint u = 0;\n            if(glGetDebugMessageLogARB_Impl)\n                u = glGetDebugMessageLogARB_Impl(count, bufsize, sources, types, ids, severities, lengths, messageLog);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return u;\n        }\n\n\n        // GL_ARB_ES2_compatibility\n        void OVR::GLEContext::glReleaseShaderCompiler_Hook()\n        {\n            if(glReleaseShaderCompiler_Impl)\n                glReleaseShaderCompiler_Impl();\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glShaderBinary_Hook(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length)\n        {\n            if(glShaderBinary_Impl)\n                glShaderBinary_Impl(count, shaders, binaryformat, binary, length);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetShaderPrecisionFormat_Hook(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision)\n        {\n            if(glGetShaderPrecisionFormat_Impl)\n                glGetShaderPrecisionFormat_Impl(shadertype, precisiontype, range, precision);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDepthRangef_Hook(GLclampf n, GLclampf f)\n        {\n            if(glDepthRangef_Impl)\n                glDepthRangef_Impl(n, f);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glClearDepthf_Hook(GLclampf d)\n        {\n            if(glClearDepthf_Impl)\n                glClearDepthf_Impl(d);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_ARB_framebuffer_object\n        GLboolean OVR::GLEContext::glIsRenderbuffer_Hook(GLuint renderbuffer)\n        {\n            GLboolean b = GL_FALSE;\n            if(glIsRenderbuffer_Impl)\n                b = glIsRenderbuffer_Impl(renderbuffer);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n        void OVR::GLEContext::glBindRenderbuffer_Hook(GLenum target, GLuint renderbuffer)\n        {\n            if(glBindRenderbuffer_Impl)\n                glBindRenderbuffer_Impl(target, renderbuffer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDeleteRenderbuffers_Hook(GLsizei n, const GLuint *renderbuffers)\n        {\n            if(glDeleteRenderbuffers_Impl)\n                glDeleteRenderbuffers_Impl(n, renderbuffers);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGenRenderbuffers_Hook(GLsizei n, GLuint *renderbuffers)\n        {\n            if(glGenRenderbuffers_Impl)\n                glGenRenderbuffers_Impl(n, renderbuffers);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glRenderbufferStorage_Hook(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)\n        {\n            if(glRenderbufferStorage_Impl)\n                glRenderbufferStorage_Impl(target, internalformat, width, height);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetRenderbufferParameteriv_Hook(GLenum target, GLenum pname, GLint *params)\n        {\n            if(glGetRenderbufferParameteriv_Impl)\n                glGetRenderbufferParameteriv_Impl(target, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLboolean OVR::GLEContext::glIsFramebuffer_Hook(GLuint framebuffer)\n        {\n            GLboolean b = GL_FALSE;\n            if(glIsFramebuffer_Impl)\n                b = glIsFramebuffer_Impl(framebuffer);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n        void OVR::GLEContext::glBindFramebuffer_Hook(GLenum target, GLuint framebuffer)\n        {\n            if(glBindFramebuffer_Impl)\n                glBindFramebuffer_Impl(target, framebuffer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDeleteFramebuffers_Hook(GLsizei n, const GLuint *framebuffers)\n        {\n            if(glDeleteFramebuffers_Impl)\n                glDeleteFramebuffers_Impl(n, framebuffers);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGenFramebuffers_Hook(GLsizei n, GLuint *framebuffers)\n        {\n            if(glGenFramebuffers_Impl)\n                glGenFramebuffers_Impl(n, framebuffers);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLenum OVR::GLEContext::glCheckFramebufferStatus_Hook(GLenum target)\n        {\n            GLenum e = 0;\n            if(glCheckFramebufferStatus_Impl)\n                e = glCheckFramebufferStatus_Impl(target);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return e;\n        }\n\n        void OVR::GLEContext::glFramebufferTexture1D_Hook(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)\n        {\n            if(glFramebufferTexture1D_Impl)\n                glFramebufferTexture1D_Impl(target, attachment, textarget, texture, level);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glFramebufferTexture2D_Hook(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)\n        {\n            if(glFramebufferTexture2D_Impl)\n                glFramebufferTexture2D_Impl(target, attachment, textarget, texture, level);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glFramebufferTexture3D_Hook(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)\n        {\n            if(glFramebufferTexture3D_Impl)\n                glFramebufferTexture3D_Impl(target, attachment, textarget, texture, level, zoffset);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glFramebufferRenderbuffer_Hook(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)\n        {\n            if(glFramebufferRenderbuffer_Impl)\n                glFramebufferRenderbuffer_Impl(target, attachment, renderbuffertarget, renderbuffer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetFramebufferAttachmentParameteriv_Hook(GLenum target, GLenum attachment, GLenum pname, GLint *params)\n        {\n            if(glGetFramebufferAttachmentParameteriv_Impl)\n                glGetFramebufferAttachmentParameteriv_Impl(target, attachment, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGenerateMipmap_Hook(GLenum target)\n        {\n            if(glGenerateMipmap_Impl)\n                glGenerateMipmap_Impl(target);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glBlitFramebuffer_Hook(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)\n        {\n            if(glBlitFramebuffer_Impl)\n                glBlitFramebuffer_Impl(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glRenderbufferStorageMultisample_Hook(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)\n        {\n            if(glRenderbufferStorageMultisample_Impl)\n                glRenderbufferStorageMultisample_Impl(target, samples, internalformat, width, height);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glFramebufferTextureLayer_Hook(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)\n        {\n            if(glFramebufferTextureLayer_Impl)\n                glFramebufferTextureLayer_Impl(target, attachment, texture, level, layer);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_ARB_texture_multisample\n        void OVR::GLEContext::glTexImage2DMultisample_Hook(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations)\n        {\n            if(glTexImage2DMultisample_Impl)\n                glTexImage2DMultisample_Impl(target, samples, internalformat, width, height, fixedsamplelocations);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glTexImage3DMultisample_Hook(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations)\n        {\n            if(glTexImage3DMultisample_Impl)\n                glTexImage3DMultisample_Impl(target, samples, internalformat, width, height, depth, fixedsamplelocations);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetMultisamplefv_Hook(GLenum pname, GLuint index, GLfloat *val)\n        {\n            if(glGetMultisamplefv_Impl)\n                glGetMultisamplefv_Impl(pname, index, val);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glSampleMaski_Hook(GLuint index, GLbitfield mask)\n        {\n            if(glSampleMaski_Impl)\n                glSampleMaski_Impl(index, mask);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_ARB_timer_query\n        void OVR::GLEContext::glQueryCounter_Hook(GLuint id, GLenum target)\n        {\n            if(glQueryCounter_Impl)\n                glQueryCounter_Impl(id, target);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetQueryObjecti64v_Hook(GLuint id, GLenum pname, GLint64 *params)\n        {\n            if(glGetQueryObjecti64v_Impl)\n                glGetQueryObjecti64v_Impl(id, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetQueryObjectui64v_Hook(GLuint id, GLenum pname, GLuint64 *params)\n        {\n            if(glGetQueryObjectui64v_Impl)\n                glGetQueryObjectui64v_Impl(id, pname, params);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_ARB_vertex_array_object\n        void OVR::GLEContext::glBindVertexArray_Hook(GLuint array)\n        {\n            if(glBindVertexArray_Impl)\n                glBindVertexArray_Impl(array);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDeleteVertexArrays_Hook(GLsizei n, const GLuint *arrays)\n        {\n            if(glDeleteVertexArrays_Impl)\n                glDeleteVertexArrays_Impl(n, arrays);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGenVertexArrays_Hook(GLsizei n, GLuint *arrays)\n        {\n            if(glGenVertexArrays_Impl)\n                glGenVertexArrays_Impl(n, arrays);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLboolean OVR::GLEContext::glIsVertexArray_Hook(GLuint array)\n        {\n            GLboolean b = GL_FALSE;\n            if(glIsVertexArray_Impl)\n                b = glIsVertexArray_Impl(array);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n\n        // GL_EXT_draw_buffers2\n        void OVR::GLEContext::glColorMaskIndexedEXT_Hook(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a)\n        {\n            if(glColorMaskIndexedEXT_Impl)\n                glColorMaskIndexedEXT_Impl(index, r, g, b, a);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetBooleanIndexedvEXT_Hook(GLenum target, GLuint index, GLboolean *data)\n        {\n            if(glGetBooleanIndexedvEXT_Impl)\n                glGetBooleanIndexedvEXT_Impl(target, index, data);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetIntegerIndexedvEXT_Hook(GLenum target, GLuint index, GLint *data)\n        {\n            if(glGetIntegerIndexedvEXT_Impl)\n                glGetIntegerIndexedvEXT_Impl(target, index, data);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glEnableIndexedEXT_Hook(GLenum target, GLuint index)\n        {\n            if(glEnableIndexedEXT_Impl)\n                glEnableIndexedEXT_Impl(target, index);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDisableIndexedEXT_Hook(GLenum target, GLuint index)\n        {\n            if(glDisableIndexedEXT_Impl)\n                glDisableIndexedEXT_Impl(target, index);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLboolean OVR::GLEContext::glIsEnabledIndexedEXT_Hook(GLenum target, GLuint index)\n        {\n            GLboolean b = GL_FALSE;\n            if(glIsEnabledIndexedEXT_Impl)\n                b = glIsEnabledIndexedEXT_Impl(target, index);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return b;\n        }\n\n\n        // GL_KHR_debug\n        void OVR::GLEContext::glDebugMessageControl_Hook(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled)\n        {\n            if(glDebugMessageControl_Impl)\n                glDebugMessageControl_Impl(source, type, severity, count, ids, enabled);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDebugMessageInsert_Hook(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const char* buf)\n        {\n            if(glDebugMessageInsert_Impl)\n                glDebugMessageInsert_Impl(source, type, id, severity, length, buf);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glDebugMessageCallback_Hook(GLDEBUGPROC callback, const void* userParam)\n        {\n            if(glDebugMessageCallback_Impl)\n                glDebugMessageCallback_Impl(callback, userParam);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        GLuint OVR::GLEContext::glGetDebugMessageLog_Hook(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths,  char* messageLog)\n        {\n            GLuint u = 0;\n            if(glGetDebugMessageLog_Impl)\n                u = glGetDebugMessageLog_Impl(count, bufSize, sources, types, ids, severities, lengths, messageLog);\n            PostHook(GLE_CURRENT_FUNCTION);\n            return u;\n        }\n\n        void OVR::GLEContext::glPushDebugGroup_Hook(GLenum source, GLuint id, GLsizei length, const char * message)\n        {\n            if(glPushDebugGroup_Impl)\n                glPushDebugGroup_Impl(source, id, length,  message);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glPopDebugGroup_Hook()\n        {\n            if(glPopDebugGroup_Impl)\n                glPopDebugGroup_Impl();\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glObjectLabel_Hook(GLenum identifier, GLuint name, GLsizei length, const char *label)\n        {\n            if(glObjectLabel_Impl)\n                glObjectLabel_Impl(identifier, name, length, label);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetObjectLabel_Hook(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, char *label)\n        {\n            if(glGetObjectLabel_Impl)\n                glGetObjectLabel_Impl(identifier, name, bufSize, length, label);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glObjectPtrLabel_Hook(void* ptr, GLsizei length, const char *label)\n        {\n            if(glObjectPtrLabel_Impl)\n                glObjectPtrLabel_Impl(ptr, length, label);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n        void OVR::GLEContext::glGetObjectPtrLabel_Hook(void* ptr, GLsizei bufSize, GLsizei *length, char *label)\n        {\n            if(glGetObjectPtrLabel_Impl)\n                glGetObjectPtrLabel_Impl(ptr, bufSize, length, label);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        // GL_WIN_swap_hint\n        void OVR::GLEContext::glAddSwapHintRectWIN_Hook(GLint x, GLint y, GLsizei width, GLsizei height)\n        {\n            if(glAddSwapHintRectWIN_Impl)\n                glAddSwapHintRectWIN_Impl(x, y, width, height);\n            PostHook(GLE_CURRENT_FUNCTION);\n        }\n\n\n        #if defined(GLE_WGL_ENABLED)\n\t\t\t// WGL\n\t\t\tvoid OVR::GLEContext::PostWGLHook(const char* /*function*/)\n\t\t\t{\n\t\t\t\t// Empty for now. WGL functions don't have a function like glGetError().\n\t\t\t}\n\n            /* We currently don't hook these\n\t\t\t#undef wglCopyContext\n\t\t\textern \"C\" { GLAPI BOOL GLAPIENTRY wglCopyContext(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask); }\n\t\t\tBOOL OVR::GLEContext::wglCopyContext_Hook(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask)\n\t\t\t{\n\t\t\t\tBOOL b = wglCopyContext(hglrcSrc, hglrcDst, mask);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t#undef wglCreateContext\n\t\t\textern \"C\" { GLAPI HGLRC GLAPIENTRY wglCreateContext(HDC hdc); }\n\t\t\tHGLRC OVR::GLEContext::wglCreateContext_Hook(HDC hdc)\n\t\t\t{\n\t\t\t\tHGLRC h = wglCreateContext(hdc);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn h;\n\t\t\t}\n\n\t\t\t#undef wglCreateLayerContext\n\t\t\textern \"C\" { GLAPI HGLRC GLAPIENTRY wglCreateLayerContext(HDC hdc, int iLayerPlane); }\n\t\t\tHGLRC OVR::GLEContext::wglCreateLayerContext_Hook(HDC hdc, int iLayerPlane)\n\t\t\t{\n\t\t\t\tHGLRC h = wglCreateLayerContext(hdc, iLayerPlane);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn h;\n\t\t\t}\n\n\t\t\t#undef wglDeleteContext\n\t\t\textern \"C\" { GLAPI BOOL GLAPIENTRY wglDeleteContext(HGLRC hglrc); }\n\t\t\tBOOL OVR::GLEContext::wglDeleteContext_Hook(HGLRC hglrc)\n\t\t\t{\n\t\t\t\tBOOL b = wglDeleteContext(hglrc);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t#undef wglGetCurrentContext\n\t\t\textern \"C\" { GLAPI HGLRC GLAPIENTRY wglGetCurrentContext(); }\n\t\t\tHGLRC OVR::GLEContext::wglGetCurrentContext_Hook()\n\t\t\t{\n\t\t\t\tHGLRC h = wglGetCurrentContext();\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn h;\n\t\t\t}\n\n\t\t\t#undef wglGetCurrentDC\n\t\t\textern \"C\" { GLAPI HDC GLAPIENTRY wglGetCurrentDC(); }\n\t\t\tHDC OVR::GLEContext::wglGetCurrentDC_Hook()\n\t\t\t{\n\t\t\t\tHDC h = wglGetCurrentDC();\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn h;\n\t\t\t}\n\n\t\t\t//#undef wglGetProcAddress Not needed because we happen to do it above already.\n\t\t\t//extern \"C\" { GLAPI PROC GLAPIENTRY wglGetProcAddress(LPCSTR lpszProc); }\n\t\t\tPROC OVR::GLEContext::wglGetProcAddress_Hook(LPCSTR lpszProc)\n\t\t\t{\n\t\t\t\tPROC p = wglGetProcAddress(lpszProc);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn p;\n\t\t\t}\n\n\t\t\t#undef wglMakeCurrent\n\t\t\textern \"C\" { GLAPI BOOL GLAPIENTRY wglMakeCurrent(HDC hdc, HGLRC hglrc); }\n\t\t\tBOOL OVR::GLEContext::wglMakeCurrent_Hook(HDC hdc, HGLRC hglrc)\n\t\t\t{\n\t\t\t\tBOOL b = wglMakeCurrent(hdc, hglrc);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t#undef wglShareLists\n\t\t\textern \"C\" { GLAPI BOOL GLAPIENTRY wglShareLists(HGLRC hglrc1, HGLRC hglrc2); }\n\t\t\tBOOL OVR::GLEContext::wglShareLists_Hook(HGLRC hglrc1, HGLRC hglrc2)\n\t\t\t{\n\t\t\t\tBOOL b = wglShareLists(hglrc1, hglrc2);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t#undef wglUseFontBitmapsA\n\t\t\textern \"C\" { GLAPI BOOL GLAPIENTRY wglUseFontBitmapsA(HDC hdc, DWORD first, DWORD count, DWORD listBase); }\n\t\t\tBOOL OVR::GLEContext::wglUseFontBitmapsA_Hook(HDC hdc, DWORD first, DWORD count, DWORD listBase)\n\t\t\t{\n\t\t\t\tBOOL b = wglUseFontBitmapsA(hdc, first, count, listBase);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t#undef wglUseFontBitmapsW\n\t\t\textern \"C\" { GLAPI BOOL GLAPIENTRY wglUseFontBitmapsW(HDC hdc, DWORD first, DWORD count, DWORD listBase); }\n\t\t\tBOOL OVR::GLEContext::wglUseFontBitmapsW_Hook(HDC hdc, DWORD first, DWORD count, DWORD listBase)\n\t\t\t{\n\t\t\t\tBOOL b = wglUseFontBitmapsW(hdc, first, count, listBase);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t#undef wglUseFontOutlinesA\n\t\t\textern \"C\" { GLAPI BOOL GLAPIENTRY wglUseFontOutlinesA(HDC hdc, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); }\n\t\t\tBOOL OVR::GLEContext::wglUseFontOutlinesA_Hook(HDC hdc, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf)\n\t\t\t{\n\t\t\t\tBOOL b = wglUseFontOutlinesA(hdc, first, count, listBase, deviation, extrusion, format, lpgmf);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t#undef wglUseFontOutlinesW\n\t\t\textern \"C\" { GLAPI BOOL GLAPIENTRY wglUseFontOutlinesW(HDC hdc, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); }\n\t\t\tBOOL OVR::GLEContext::wglUseFontOutlinesW_Hook(HDC hdc, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf)\n\t\t\t{\n\t\t\t\tBOOL b = wglUseFontOutlinesW(hdc, first, count, listBase, deviation, extrusion, format, lpgmf);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t#undef wglDescribeLayerPlane\n\t\t\textern \"C\" { GLAPI BOOL GLAPIENTRY wglDescribeLayerPlane(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nBytes, LPLAYERPLANEDESCRIPTOR plpd); }\n\t\t\tBOOL OVR::GLEContext::wglDescribeLayerPlane_Hook(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nBytes, LPLAYERPLANEDESCRIPTOR plpd)\n\t\t\t{\n\t\t\t\tBOOL b = wglDescribeLayerPlane(hdc, iPixelFormat, iLayerPlane, nBytes, plpd);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t#undef wglSetLayerPaletteEntries\n\t\t\textern \"C\" { GLAPI int GLAPIENTRY wglSetLayerPaletteEntries(HDC hdc, int iLayerPlane, int iStart, int cEntries, const COLORREF *pcr); }\n\t\t\tint OVR::GLEContext::wglSetLayerPaletteEntries_Hook(HDC hdc, int iLayerPlane, int iStart, int cEntries, const COLORREF *pcr)\n\t\t\t{\n\t\t\t\tint i = wglSetLayerPaletteEntries(hdc, iLayerPlane, iStart, cEntries, pcr);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn i;\n\t\t\t}\n\n\t\t\t#undef wglGetLayerPaletteEntries\n\t\t\textern \"C\" { GLAPI int GLAPIENTRY wglGetLayerPaletteEntries(HDC hdc, int iLayerPlane, int iStart, int cEntries, COLORREF *pcr); }\n\t\t\tint OVR::GLEContext::wglGetLayerPaletteEntries_Hook(HDC hdc, int iLayerPlane, int iStart, int cEntries, COLORREF *pcr)\n\t\t\t{\n\t\t\t\tint i = wglGetLayerPaletteEntries(hdc, iLayerPlane, iStart, cEntries, pcr);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn i;\n\t\t\t}\n\n\t\t\t#undef wglRealizeLayerPalette\n\t\t\textern \"C\" { GLAPI BOOL GLAPIENTRY wglRealizeLayerPalette(HDC hdc, int iLayerPlane, BOOL bRealize); }\n\t\t\tBOOL OVR::GLEContext::wglRealizeLayerPalette_Hook(HDC hdc, int iLayerPlane, BOOL bRealize)\n\t\t\t{\n\t\t\t\tBOOL b = wglRealizeLayerPalette(hdc, iLayerPlane, bRealize);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t#undef wglSwapLayerBuffers\n\t\t\textern \"C\" { GLAPI BOOL GLAPIENTRY wglSwapLayerBuffers(HDC hdc, UINT fuPlanes); }\n\t\t\tBOOL OVR::GLEContext::wglSwapLayerBuffers_Hook(HDC hdc, UINT fuPlanes)\n\t\t\t{\n\t\t\t\tBOOL b = wglSwapLayerBuffers(hdc, fuPlanes);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t#undef wglSwapMultipleBuffers\n\t\t\textern \"C\" { GLAPI DWORD GLAPIENTRY wglSwapMultipleBuffers(UINT i, CONST WGLSWAP* p); }\n\t\t\tDWORD OVR::GLEContext::wglSwapMultipleBuffers_Hook(UINT i, CONST WGLSWAP* p)\n\t\t\t{\n\t\t\t\tDWORD dw = wglSwapMultipleBuffers(i, p);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn dw;\n\t\t\t}\n            */\n\n\t\t\t// The rest of the functions are pointer-based.\n\n\t\t\t// WGL_ARB_buffer_region\n\t\t\tHANDLE OVR::GLEContext::wglCreateBufferRegionARB_Hook(HDC hDC, int iLayerPlane, UINT uType)\n\t\t\t{\n\t\t\t\tHANDLE h = NULL;\n\t\t\t\tif(wglCreateBufferRegionARB_Impl)\n\t\t\t\t\th = wglCreateBufferRegionARB_Impl(hDC, iLayerPlane, uType);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn h;\n\t\t\t}\n\n\t\t\tVOID OVR::GLEContext::wglDeleteBufferRegionARB_Hook(HANDLE hRegion)\n\t\t\t{\n\t\t\t\tif(wglDeleteBufferRegionARB_Impl)\n\t\t\t\t\twglDeleteBufferRegionARB_Impl(hRegion);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglSaveBufferRegionARB_Hook(HANDLE hRegion, int x, int y, int width, int height)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglSaveBufferRegionARB_Impl)\n\t\t\t\t\tb = wglSaveBufferRegionARB_Impl(hRegion, x, y, width, height);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglRestoreBufferRegionARB_Hook(HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglRestoreBufferRegionARB_Impl)\n\t\t\t\t\tb = wglRestoreBufferRegionARB_Impl(hRegion, x, y, width, height, xSrc, ySrc);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t// WGL_ARB_extensions_string\n\t\t\tconst char * OVR::GLEContext::wglGetExtensionsStringARB_Hook(HDC hdc)\n\t\t\t{\n\t\t\t\tconst char * p = NULL;\n\t\t\t\tif(wglGetExtensionsStringARB_Impl)\n\t\t\t\t\tp = wglGetExtensionsStringARB_Impl(hdc);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn p;\n\t\t\t}\n\n\t\t\t// WGL_ARB_pixel_format\n\t\t\tBOOL OVR::GLEContext::wglGetPixelFormatAttribivARB_Hook(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglGetPixelFormatAttribivARB_Impl)\n\t\t\t\t\tb = wglGetPixelFormatAttribivARB_Impl(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, piValues);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglGetPixelFormatAttribfvARB_Hook(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglGetPixelFormatAttribfvARB_Impl)\n\t\t\t\t\tb = wglGetPixelFormatAttribfvARB_Impl(hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, pfValues);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglChoosePixelFormatARB_Hook(HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglChoosePixelFormatARB_Impl)\n\t\t\t\t\tb = wglChoosePixelFormatARB_Impl(hdc, piAttribIList, pfAttribFList, nMaxFormats, piFormats, nNumFormats);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t// WGL_ARB_make_current_read\n\t\t\tBOOL OVR::GLEContext::wglMakeContextCurrentARB_Hook(HDC hDrawDC, HDC hReadDC, HGLRC hglrc)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglMakeContextCurrentARB_Impl)\n\t\t\t\t\tb = wglMakeContextCurrentARB_Impl(hDrawDC, hReadDC, hglrc);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tHDC OVR::GLEContext::wglGetCurrentReadDCARB_Hook()\n\t\t\t{\n\t\t\t\tHDC h = NULL;\n\t\t\t\tif(wglGetCurrentReadDCARB_Impl)\n\t\t\t\t\th = wglGetCurrentReadDCARB_Impl();\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn h;\n\t\t\t}\n\n\t\t\t// WGL_ARB_pbuffer\n\t\t\tHPBUFFERARB OVR::GLEContext::wglCreatePbufferARB_Hook(HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList)\n\t\t\t{\n\t\t\t\tHPBUFFERARB h = NULL;\n\t\t\t\tif(wglCreatePbufferARB_Impl)\n\t\t\t\t\th = wglCreatePbufferARB_Impl(hDC, iPixelFormat, iWidth, iHeight, piAttribList);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn h;\n\t\t\t}\n\n\t\t\tHDC OVR::GLEContext::wglGetPbufferDCARB_Hook(HPBUFFERARB hPbuffer)\n\t\t\t{\n\t\t\t\tHDC h = NULL;\n\t\t\t\tif(wglGetPbufferDCARB_Impl)\n\t\t\t\t\th = wglGetPbufferDCARB_Impl(hPbuffer);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn h;\n\t\t\t}\n\n\t\t\tint OVR::GLEContext::wglReleasePbufferDCARB_Hook(HPBUFFERARB hPbuffer, HDC hDC)\n\t\t\t{\n\t\t\t\tint i = 0;\n\t\t\t\tif(wglReleasePbufferDCARB_Impl)\n\t\t\t\t\ti = wglReleasePbufferDCARB_Impl(hPbuffer, hDC);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn i;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglDestroyPbufferARB_Hook(HPBUFFERARB hPbuffer)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglDestroyPbufferARB_Impl)\n\t\t\t\t\tb = wglDestroyPbufferARB_Impl(hPbuffer);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglQueryPbufferARB_Hook(HPBUFFERARB hPbuffer, int iAttribute, int *piValue)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglQueryPbufferARB_Impl)\n\t\t\t\t\tb = wglQueryPbufferARB_Impl(hPbuffer, iAttribute, piValue);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t// WGL_ARB_render_texture\n\t\t\tBOOL OVR::GLEContext::wglBindTexImageARB_Hook(HPBUFFERARB hPbuffer, int iBuffer)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglBindTexImageARB_Impl)\n\t\t\t\t\tb = wglBindTexImageARB_Impl(hPbuffer, iBuffer);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglReleaseTexImageARB_Hook(HPBUFFERARB hPbuffer, int iBuffer)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglReleaseTexImageARB_Impl)\n\t\t\t\t\tb = wglReleaseTexImageARB_Impl(hPbuffer, iBuffer);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglSetPbufferAttribARB_Hook(HPBUFFERARB hPbuffer, const int *piAttribList)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglSetPbufferAttribARB_Impl)\n\t\t\t\t\tb = wglSetPbufferAttribARB_Impl(hPbuffer, piAttribList);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t// WGL_NV_present_video\n\t\t\tint OVR::GLEContext::wglEnumerateVideoDevicesNV_Hook(HDC hDC, HVIDEOOUTPUTDEVICENV *phDeviceList)\n\t\t\t{\n\t\t\t\tint i = 0;\n\t\t\t\tif(wglEnumerateVideoDevicesNV_Impl)\n\t\t\t\t\ti = wglEnumerateVideoDevicesNV_Impl(hDC, phDeviceList);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn i;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglBindVideoDeviceNV_Hook(HDC hDC, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int *piAttribList)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglBindVideoDeviceNV_Impl)\n\t\t\t\t\tb = wglBindVideoDeviceNV_Impl(hDC, uVideoSlot, hVideoDevice, piAttribList);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglQueryCurrentContextNV_Hook(int iAttribute, int *piValue)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglQueryCurrentContextNV_Impl)\n\t\t\t\t\tb = wglQueryCurrentContextNV_Impl(iAttribute, piValue);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t// WGL_ARB_create_context\n\t\t\tHGLRC OVR::GLEContext::wglCreateContextAttribsARB_Hook(HDC hDC, HGLRC hShareContext, const int *attribList)\n\t\t\t{\n\t\t\t\tHGLRC h = NULL;\n\t\t\t\tif(wglCreateContextAttribsARB_Impl)\n\t\t\t\t\th = wglCreateContextAttribsARB_Impl(hDC, hShareContext, attribList);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn h;\n\t\t\t}\n\n\t\t\t// WGL_EXT_extensions_string\n\t\t\tconst char * OVR::GLEContext::wglGetExtensionsStringEXT_Hook()\n\t\t\t{\n\t\t\t\tconst char * p = NULL;\n\t\t\t\tif(wglGetExtensionsStringEXT_Impl)\n\t\t\t\t\tp = wglGetExtensionsStringEXT_Impl();\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn p;\n\t\t\t}\n\n\t\t\t// WGL_EXT_swap_control\n\t\t\tBOOL OVR::GLEContext::wglSwapIntervalEXT_Hook(int interval)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglSwapIntervalEXT_Impl)\n\t\t\t\t\tb = wglSwapIntervalEXT_Impl(interval);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tint OVR::GLEContext::wglGetSwapIntervalEXT_Hook()\n\t\t\t{\n\t\t\t\tint i = 0;\n\t\t\t\tif(wglGetSwapIntervalEXT_Impl)\n\t\t\t\t\ti = wglGetSwapIntervalEXT_Impl();\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn i;\n\t\t\t}\n\n\t\t\t// WGL_OML_sync_control\n\t\t\tBOOL  OVR::GLEContext::wglGetSyncValuesOML_Hook(HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglGetSyncValuesOML_Impl)\n\t\t\t\t\tb = wglGetSyncValuesOML_Impl(hdc, ust, msc, sbc);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL  OVR::GLEContext::wglGetMscRateOML_Hook(HDC hdc, INT32 *numerator, INT32 *denominator)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglGetMscRateOML_Impl)\n\t\t\t\t\tb = wglGetMscRateOML_Impl(hdc, numerator, denominator);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tINT64 OVR::GLEContext::wglSwapBuffersMscOML_Hook(HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder)\n\t\t\t{\n\t\t\t\tINT64 i = 0;\n\t\t\t\tif(wglSwapBuffersMscOML_Impl)\n\t\t\t\t\ti = wglSwapBuffersMscOML_Impl(hdc, target_msc, divisor, remainder);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn i;\n\t\t\t}\n\n\t\t\tINT64 OVR::GLEContext::wglSwapLayerBuffersMscOML_Hook(HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder)\n\t\t\t{\n\t\t\t\tINT64 i = 0;\n\t\t\t\tif(wglSwapLayerBuffersMscOML_Impl)\n\t\t\t\t\ti = wglSwapLayerBuffersMscOML_Impl(hdc, fuPlanes, target_msc, divisor, remainder);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn i;\n\t\t\t}\n\n\t\t\tBOOL  OVR::GLEContext::wglWaitForMscOML_Hook(HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 *ust, INT64 *msc, INT64 *sbc)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglWaitForMscOML_Impl)\n\t\t\t\t\tb = wglWaitForMscOML_Impl(hdc, target_msc, divisor, remainder, ust, msc, sbc);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL  OVR::GLEContext::wglWaitForSbcOML_Hook(HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglWaitForSbcOML_Impl)\n\t\t\t\t\tb = wglWaitForSbcOML_Impl(hdc, target_sbc, ust, msc, sbc);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t// WGL_NV_video_output\n\t\t\tBOOL OVR::GLEContext::wglGetVideoDeviceNV_Hook(HDC hDC, int numDevices, HPVIDEODEV *hVideoDevice)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglGetVideoDeviceNV_Impl)\n\t\t\t\t\tb = wglGetVideoDeviceNV_Impl(hDC, numDevices, hVideoDevice);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglReleaseVideoDeviceNV_Hook(HPVIDEODEV hVideoDevice)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglReleaseVideoDeviceNV_Impl)\n\t\t\t\t\tb = wglReleaseVideoDeviceNV_Impl(hVideoDevice);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglBindVideoImageNV_Hook(HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglBindVideoImageNV_Impl)\n\t\t\t\t\tb = wglBindVideoImageNV_Impl(hVideoDevice, hPbuffer, iVideoBuffer);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglReleaseVideoImageNV_Hook(HPBUFFERARB hPbuffer, int iVideoBuffer)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglReleaseVideoImageNV_Impl)\n\t\t\t\t\tb = wglReleaseVideoImageNV_Impl(hPbuffer, iVideoBuffer);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglSendPbufferToVideoNV_Hook(HPBUFFERARB hPbuffer, int iBufferType, unsigned long *pulCounterPbuffer, BOOL bBlock)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglSendPbufferToVideoNV_Impl)\n\t\t\t\t\tb = wglSendPbufferToVideoNV_Impl(hPbuffer, iBufferType, pulCounterPbuffer, bBlock);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglGetVideoInfoNV_Hook(HPVIDEODEV hpVideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglGetVideoInfoNV_Impl)\n\t\t\t\t\tb = wglGetVideoInfoNV_Impl(hpVideoDevice, pulCounterOutputPbuffer, pulCounterOutputVideo);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t// WGL_NV_swap_group\n\t\t\tBOOL OVR::GLEContext::wglJoinSwapGroupNV_Hook(HDC hDC, GLuint group)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglJoinSwapGroupNV_Impl)\n\t\t\t\t\tb = wglJoinSwapGroupNV_Impl(hDC, group);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglBindSwapBarrierNV_Hook(GLuint group, GLuint barrier)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglBindSwapBarrierNV_Impl)\n\t\t\t\t\tb = wglBindSwapBarrierNV_Impl(group, barrier);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglQuerySwapGroupNV_Hook(HDC hDC, GLuint *group, GLuint *barrier)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglQuerySwapGroupNV_Impl)\n\t\t\t\t\tb = wglQuerySwapGroupNV_Impl(hDC, group, barrier);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t   }\n\n\t\t\tBOOL OVR::GLEContext::wglQueryMaxSwapGroupsNV_Hook(HDC hDC, GLuint *maxGroups, GLuint *maxBarriers)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglQueryMaxSwapGroupsNV_Impl)\n\t\t\t\t\tb = wglQueryMaxSwapGroupsNV_Impl(hDC, maxGroups, maxBarriers);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglQueryFrameCountNV_Hook(HDC hDC, GLuint *count)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglQueryFrameCountNV_Impl)\n\t\t\t\t\tb = wglQueryFrameCountNV_Impl(hDC, count);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglResetFrameCountNV_Hook(HDC hDC)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglResetFrameCountNV_Impl)\n\t\t\t\t\tb = wglResetFrameCountNV_Impl(hDC);\n\t\t\t\tPostHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t   }\n\n\t\t\t// WGL_NV_video_capture\n\t\t\tBOOL OVR::GLEContext::wglBindVideoCaptureDeviceNV_Hook(UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglBindVideoCaptureDeviceNV_Impl)\n\t\t\t\t\tb = wglBindVideoCaptureDeviceNV_Impl(uVideoSlot, hDevice);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tUINT OVR::GLEContext::wglEnumerateVideoCaptureDevicesNV_Hook(HDC hDc, HVIDEOINPUTDEVICENV *phDeviceList)\n\t\t\t{\n\t\t\t\tUINT u = 0;\n\t\t\t\tif(wglEnumerateVideoCaptureDevicesNV_Impl)\n\t\t\t\t\tu = wglEnumerateVideoCaptureDevicesNV_Impl(hDc, phDeviceList);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn u;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglLockVideoCaptureDeviceNV_Hook(HDC hDc, HVIDEOINPUTDEVICENV hDevice)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglLockVideoCaptureDeviceNV_Impl)\n\t\t\t\t\tb = wglLockVideoCaptureDeviceNV_Impl(hDc, hDevice);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglQueryVideoCaptureDeviceNV_Hook(HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int *piValue)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglQueryVideoCaptureDeviceNV_Impl)\n\t\t\t\t\tb = wglQueryVideoCaptureDeviceNV_Impl(hDc, hDevice, iAttribute, piValue);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglReleaseVideoCaptureDeviceNV_Hook(HDC hDc, HVIDEOINPUTDEVICENV hDevice)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglReleaseVideoCaptureDeviceNV_Impl)\n\t\t\t\t\tb = wglReleaseVideoCaptureDeviceNV_Impl(hDc, hDevice);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t// WGL_NV_copy_image\n\t\t\tBOOL OVR::GLEContext::wglCopyImageSubDataNV_Hook(HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglCopyImageSubDataNV_Impl)\n\t\t\t\t\tb = wglCopyImageSubDataNV_Impl(hSrcRC, srcName, srcTarget, srcLevel, srcX, srcY, srcZ, hDstRC, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, width, height, depth);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\t// WGL_NV_DX_interop\n\t\t\tBOOL OVR::GLEContext::wglDXSetResourceShareHandleNV_Hook(void *dxObject, HANDLE shareHandle)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglDXSetResourceShareHandleNV_Impl)\n\t\t\t\t\tb = wglDXSetResourceShareHandleNV_Impl(dxObject, shareHandle);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tHANDLE OVR::GLEContext::wglDXOpenDeviceNV_Hook(void *dxDevice)\n\t\t\t{\n\t\t\t\tHANDLE h = NULL;\n\t\t\t\tif(wglDXOpenDeviceNV_Impl)\n\t\t\t\t\th = wglDXOpenDeviceNV_Impl(dxDevice);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn h;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglDXCloseDeviceNV_Hook(HANDLE hDevice)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglDXCloseDeviceNV_Impl)\n\t\t\t\t\tb = wglDXCloseDeviceNV_Impl(hDevice);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tHANDLE OVR::GLEContext::wglDXRegisterObjectNV_Hook(HANDLE hDevice, void *dxObject, GLuint name, GLenum type, GLenum access)\n\t\t\t{\n\t\t\t\tHANDLE h = NULL;\n\t\t\t\tif(wglDXRegisterObjectNV_Impl)\n\t\t\t\t\th = wglDXRegisterObjectNV_Impl(hDevice, dxObject, name, type, access);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn h;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglDXUnregisterObjectNV_Hook(HANDLE hDevice, HANDLE hObject)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglDXUnregisterObjectNV_Impl)\n\t\t\t\t\tb = wglDXUnregisterObjectNV_Impl(hDevice, hObject);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglDXObjectAccessNV_Hook(HANDLE hObject, GLenum access)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglDXObjectAccessNV_Impl)\n\t\t\t\t\tb = wglDXObjectAccessNV_Impl(hObject, access);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglDXLockObjectsNV_Hook(HANDLE hDevice, GLint count, HANDLE *hObjects)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglDXLockObjectsNV_Impl)\n\t\t\t\t\tb = wglDXLockObjectsNV_Impl(hDevice, count, hObjects);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n\t\t\tBOOL OVR::GLEContext::wglDXUnlockObjectsNV_Hook(HANDLE hDevice, GLint count, HANDLE *hObjects)\n\t\t\t{\n\t\t\t\tBOOL b = FALSE;\n\t\t\t\tif(wglDXUnlockObjectsNV_Impl)\n\t\t\t\t\tb = wglDXUnlockObjectsNV_Impl(hDevice, count, hObjects);\n\t\t\t\tPostWGLHook(GLE_CURRENT_FUNCTION);\n\t\t\t\treturn b;\n\t\t\t}\n\n        #endif // defined(GLE_WGL_ENABLED)\n\n        #if defined(GLE_GLX_ENABLED)\n\t\t\tvoid OVR::GLEContext::PostGLXHook(const char* /*function*/)\n\t\t\t{\n\t\t\t\t// Empty for now. GLX functions don't have a function like glGetError().\n\t\t\t}\n\n\t\t\t// GLX_VERSION_1_0\n\t\t\t// GLX_VERSION_1_1\n\t\t\t// We don't currently implement hooking of these.\n\n\t\t\t// GLX_VERSION_1_2\n\t\t\t::Display* OVR::GLEContext::glXGetCurrentDisplay_Hook(void)\n\t\t\t{\n\t\t\t\t::Display* p = NULL;\n\t\t\t\tif(glXGetCurrentDisplay_Impl)\n\t                p = glXGetCurrentDisplay_Impl();\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t            return p;\n\t\t\t}\n\n\t\t\t// GLX_VERSION_1_3\n\t\t    GLXFBConfig* OVR::GLEContext::glXChooseFBConfig_Hook(Display *dpy, int screen, const int *attrib_list, int *nelements)\n\t\t\t{\n\t\t\t\tGLXFBConfig* p = NULL;\n\t\t\t\tif(glXChooseFBConfig_Impl)\n\t                p = glXChooseFBConfig_Impl(dpy, screen, attrib_list, nelements);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t            return p;\n\t\t\t}\n\n\t\t    GLXContext OVR::GLEContext::glXCreateNewContext_Hook(Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct)\n\t\t\t{\n\t\t    \tGLXContext c = 0;\n\t\t\t\tif(glXCreateNewContext_Impl)\n\t                c = glXCreateNewContext_Impl(dpy, config, render_type, share_list, direct);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t            return c;\n\t\t\t}\n\n\t\t    GLXPbuffer OVR::GLEContext::glXCreatePbuffer_Hook(Display *dpy, GLXFBConfig config, const int *attrib_list)\n\t\t\t{\n\t\t    \tGLXPbuffer b = 0;\n\t            if(glXCreatePbuffer_Impl)\n\t            \tb = glXCreatePbuffer_Impl(dpy, config, attrib_list);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t            return b;\n\t\t\t}\n\n\t\t    GLXPixmap OVR::GLEContext::glXCreatePixmap_Hook(Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list)\n\t\t\t{\n\t\t    \tGLXPixmap m = 0;\n\t            if(glXCreatePixmap_Impl)\n\t            \tm = glXCreatePixmap_Impl(dpy, config, pixmap, attrib_list);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t            return m;\n\t\t\t}\n\n\t\t    GLXWindow OVR::GLEContext::glXCreateWindow_Hook(Display *dpy, GLXFBConfig config, Window win, const int *attrib_list)\n\t\t\t{\n\t\t    \tGLXWindow w = 0;\n\t            if(glXCreateWindow_Impl)\n\t            \tw = glXCreateWindow_Impl(dpy, config, win, attrib_list);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t            return w;\n\t\t\t}\n\n\t\t    void OVR::GLEContext::glXDestroyPbuffer_Hook(Display *dpy, GLXPbuffer pbuf)\n\t\t    {\n\t            if(glXDestroyPbuffer_Impl)\n\t                glXDestroyPbuffer_Impl(dpy, pbuf);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t\t    }\n\n\t\t    void OVR::GLEContext::glXDestroyPixmap_Hook(Display *dpy, GLXPixmap pixmap)\n\t\t\t{\n\t            if(glXDestroyPixmap_Impl)\n\t            \tglXDestroyPixmap_Impl(dpy, pixmap);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t\t\t}\n\n\t\t    void OVR::GLEContext::glXDestroyWindow_Hook(Display *dpy, GLXWindow win)\n\t\t\t{\n\t            if(glXDestroyWindow_Impl)\n\t            \tglXDestroyWindow_Impl(dpy, win);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t\t\t}\n\n\t\t    GLXDrawable OVR::GLEContext::glXGetCurrentReadDrawable_Hook(void)\n\t\t\t{\n\t\t    \tGLXDrawable d;\n\t            if(glXGetCurrentReadDrawable_Impl)\n\t            \td = glXGetCurrentReadDrawable_Impl();\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t            return d;\n\t\t\t}\n\n\t\t    int OVR::GLEContext::glXGetFBConfigAttrib_Hook(Display *dpy, GLXFBConfig config, int attribute, int *value)\n\t\t\t{\n\t            int i = -1;\n\t            if(glXGetFBConfigAttrib_Impl)\n\t            \ti = glXGetFBConfigAttrib_Impl(dpy, config, attribute, value);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t            return i;\n\t\t\t}\n\n\t\t    GLXFBConfig* OVR::GLEContext::glXGetFBConfigs_Hook(Display *dpy, int screen, int *nelements)\n\t\t    {\n\t\t    \tGLXFBConfig* p = NULL;\n\t            if(glXGetFBConfigs_Impl)\n\t            \tp = glXGetFBConfigs_Impl(dpy, screen, nelements);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t            return p;\n\t\t    }\n\n\t\t    void OVR::GLEContext::glXGetSelectedEvent_Hook(Display *dpy, GLXDrawable draw, unsigned long *event_mask)\n\t\t\t{\n\t            if(glXGetSelectedEvent_Impl)\n\t            \tglXGetSelectedEvent_Impl(dpy, draw, event_mask);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t\t\t}\n\n\t\t    XVisualInfo* OVR::GLEContext::glXGetVisualFromFBConfig_Hook(Display *dpy, GLXFBConfig config)\n\t\t\t{\n\t\t    \tXVisualInfo* p = NULL;\n\t            if(glXGetVisualFromFBConfig_Impl)\n\t            \tp = glXGetVisualFromFBConfig_Impl(dpy, config);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t            return p;\n\t\t\t}\n\n\t\t    Bool OVR::GLEContext::glXMakeContextCurrent_Hook(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx)\n\t\t\t{\n\t            Bool b = False;\n\t            if(glXMakeContextCurrent_Impl)\n\t            \tb = glXMakeContextCurrent_Impl(dpy, draw, read, ctx);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t            return b;\n\t\t\t}\n\n\t\t    int OVR::GLEContext::glXQueryContext_Hook(Display *dpy, GLXContext ctx, int attribute, int *value)\n\t\t    {\n\t            int i = GLX_BAD_ATTRIBUTE;\n\t            if(glXQueryContext_Impl)\n\t            \ti = glXQueryContext_Impl(dpy, ctx, attribute, value);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t            return i;\n\t\t    }\n\n\t\t    void OVR::GLEContext::glXQueryDrawable_Hook(Display *dpy, GLXDrawable draw, int attribute, unsigned int *value)\n\t\t\t{\n\t            if(glXQueryDrawable_Impl)\n\t            \tglXQueryDrawable_Impl(dpy, draw, attribute, value);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t\t\t}\n\n\t\t    void OVR::GLEContext::glXSelectEvent_Hook(Display *dpy, GLXDrawable draw, unsigned long event_mask)\n\t\t\t{\n\t            if(glXSelectEvent_Impl)\n\t            \tglXSelectEvent_Impl(dpy, draw, event_mask);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t\t\t}\n\n\t\t    // GLX_VERSION_1_4\n\t\t    // We don't do hooking of this.\n\n\t\t    // GLX_ARB_create_context\n\t        GLXContext OVR::GLEContext::glXCreateContextAttribsARB_Hook(Display* dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list)\n\t\t\t{\n\t        \tGLXContext c = 0;\n\t            if(glXCreateContextAttribsARB_Impl)\n\t            \tc = glXCreateContextAttribsARB_Impl(dpy,  config, share_context, direct, attrib_list);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t            return c;\n\t\t\t}\n\n\t\t    // GLX_EXT_swap_control\n\t\t    void OVR::GLEContext::glXSwapIntervalEXT_Hook(Display* dpy, GLXDrawable drawable, int interval)\n\t\t    {\n\t            if(glXSwapIntervalEXT_Impl)\n\t            \tglXSwapIntervalEXT_Impl(dpy, drawable, interval);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t\t    }\n\n            // GLX_OML_sync_control\n   \t\t\tBool OVR::GLEContext::glXGetMscRateOML_Hook(Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator)\n\t\t\t{\n\t            Bool b = False;\n\t            if(glXGetMscRateOML_Impl)\n\t            \tb = glXGetMscRateOML_Impl(dpy, drawable, numerator, denominator);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t            return b;\n\t\t\t}\n\n   \t\t\tBool OVR::GLEContext::glXGetSyncValuesOML_Hook(Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc)\n\t\t\t{\n\t            Bool b = False;\n\t            if(glXGetSyncValuesOML_Impl)\n\t            \tb = glXGetSyncValuesOML_Impl(dpy, drawable, ust, msc, sbc);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t            return b;\n\t\t\t}\n\n   \t\t\tint64_t OVR::GLEContext::glXSwapBuffersMscOML_Hook(Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder)\n\t\t\t{\n   \t\t\t\tint64_t i = 0;\n\t            if(glXSwapBuffersMscOML_Impl)\n\t            \ti = glXSwapBuffersMscOML_Impl(dpy, drawable, target_msc, divisor, remainder);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t            return i;\n\t\t\t}\n\n   \t\t\tBool OVR::GLEContext::glXWaitForMscOML_Hook(Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc)\n\t\t\t{\n\t            Bool b = False;\n\t            if(glXWaitForMscOML_Impl)\n\t            \tb = glXWaitForMscOML_Impl(dpy, drawable, target_msc, divisor, remainder, ust, msc, sbc);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t            return b;\n\t\t\t}\n\n   \t\t\tBool OVR::GLEContext::glXWaitForSbcOML_Hook(Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc)\n\t\t\t{\n\t            Bool b = False;\n\t            if(glXWaitForSbcOML_Impl)\n\t            \tb = glXWaitForSbcOML_Impl(dpy, drawable, target_sbc, ust, msc, sbc);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n\t            return b;\n\t\t\t}\n\n            // GLX_MESA_swap_control\n            int OVR::GLEContext::glXGetSwapIntervalMESA_Hook()\n\t\t    {\n\t            int i = 0;\n                if(glXGetSwapIntervalMESA_Impl)\n\t            \ti = glXGetSwapIntervalMESA_Impl();\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n                return i;\n\t\t    }\n\n\n            int OVR::GLEContext::glXSwapIntervalMESA_Hook(unsigned int interval)\n\t\t    {\n\t            int i = 0;\n                if(glXSwapIntervalMESA_Impl)\n\t            \ti = glXSwapIntervalMESA_Impl(interval);\n\t            PostGLXHook(GLE_CURRENT_FUNCTION);\n                return i;\n\t\t    }\n\n        #endif // defined(GLE_GLX_ENABLED)\n\n    #endif // GLE_HOOKING_ENABLED\n\n//} // namespace OVR\n\n\n\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/GL/CAPI_GLE.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_GLE.h\nContent     :   OpenGL extensions support. Implements a stripped down glew-like \n                interface with some additional functionality.\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n// This file provides functionality similar to a reduced version of GLEW, plus some\n// additional functionality that's useful to us, such as function hooking.\n\n#ifndef INC_OVR_CAPI_GLE_h\n#define INC_OVR_CAPI_GLE_h\n\n\n#include \"../../Kernel/OVR_Types.h\"\n#include \"CAPI_GLE_GL.h\"\n\n\n///////////////////////////////////////////////////////////////////////////////\n// How to use this functionality\n//\n// - You #include this header instead of gl.h, glext.h, wglext.h (Windows), gl3.h (Apple), gl3ext.h (Apple), glx.h (Unix), and glxext.h (Unix).\n//   Currently you still would #include <Windows.h> for the base wgl functions on Windows and OpenGL.h or NSOpenGL for the \n//   base Apple cgl functions.\n// \n// - You call OpenGL functions just like you would if you were directly using OpenGL \n//   headers and declarations. The difference is that this module automatically loads\n//   extensions on init and so you should never need to use GetProcAddress, wglGetProcAddress, etc.\n//\n// - OpenGL 1.1 functions can be called unilaterally without checking if they are present,\n//   as it's assumed they are always present.\n//\n// - In order to use an OpenGL 1.2 or later function you can check the GLEContext::WholeVersion\n//   variable to tell what version of OpenGL is present and active. Example usage:\n//       if(GLEContext::GetCurrentContext()->WholeVersion >= 302) // If OpenGL 3.2 or later...\n//\n// - In order to use an OpenGL extension, you can check the GLE_ helper macro that exists for each\n//   extension. For example, in order to check of the KHR_debug is present you could do this:\n//        if(GLE_KHR_debug) ... \n//   You cannot check for the presence of extensions by testing the function pointer, because\n//   when hooking is enabled then we aren't using function pointers and thus all functions will\n//   look like they are present. \n//\n// - You can test if the OpenGL implementation is OpenGL ES by checking the GLEContext IsGLES\n//   member variable. For example: if(GLEContext::GetCurrentContext()->IsGLES) ...\n//\n// - You can test if the OpenGL implementation is a core profile ES by checking the GLEContext IsCoreProfile\n//   member variable. For example: if(GLEContext::GetCurrentContext()->IsCoreProfile) ...\n//\n///////////////////////////////////////////////////////////////////////////////\n\n\n///////////////////////////////////////////////////////////////////////////////\n// How to add support for additional functions to this module.\n//\n// For an example of how to do this, search the source files for all cases of KHR_Debug and just copy\n// the things that it does but for your new extension.\n//\n//     1) Add the appropriate extension declaration to CAPI_GLE_GL.h, preferably by\n//        copying it from the standard header file it normally comes from. If it's\n//        platform-specific (e.g. a Windows wgl function) then make sure it's declared\n//        within the given platform section. Note that there are potentially #defines, typedefs, \n//        function typedefs, and function #defines. There is always a GLE_ macro declared which\n//        lets the user know at runtime whether the extension is present.\n//        e.g.  #ifndef GL_KHR_debug\n//                  #define GL_KHR_debug 1\n//                  #define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 etc.\n//                  typedef void (GLAPIENTRY * PFNGLPOPDEBUGGROUPPROC) ();\n//                  #define glPopDebugGroup GLEGetCurrentFunction(glPopDebugGroup)\n//                  #define GLE_KHR_debug GLEGetCurrentVariable(gl_KHR_debug)\n//              #endif etc.\n//\n//     2) Add a hook function for in the hook section of the GLEContext class in this header, \n//        ideally in the same order it's declared in the CAPI_GLE_GL.h so it's easily readable.\n//        e.g. void glDebugMessageControl_Hook(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); etc.\n//\n//     3) Add a declaration for each interface function to the GLEContext class in this header.\n//        e.g. PFNGLDEBUGMESSAGECALLBACKPROC glDebugMessageCallback_Impl; etc.\n//\n//     4) Add code to GLEContext::InitExtensionLoad to load the function pointer.\n//        e.g. GLELoadProc(glDebugMessageCallback_Impl, glDebugMessageCallback); etc.\n//\n//     5) Add code to GLEContext::InitExtensionSupport to detect the extension support.\n//        e.g. { gl_KHR_debug, \"GL_KHR_debug\" }, etc.\n//\n//     6) Implement the GLEContext hook function(s) you declared.\n//        e.g.  void OVR::GLEContext::glDebugMessageControl_Hook(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled)\n//              {\n//                 if(glDebugMessageControl_Impl)\n//                    glDebugMessageControl_Impl(source, type, severity, count, ids, enabled);\n//                 PostHook();\n//              }\n//\n// Note that if the extension is a WGL-, GLX-, or CGL-specific extension, they are handled like above \n// but are in their own section below the section for regular OpenGL extensions.\n// \n// In some cases the given interface may already be present by currently commented out,\n// in which case you can simply un-comment it to enable it.\n///////////////////////////////////////////////////////////////////////////////\n\n\nnamespace OVR\n{\n    // Generic OpenGL GetProcAddress function interface. Maps to platform-specific functionality\n    // internally. On Windows this is equivalent to wglGetProcAddress as opposed to global GetProcAddress.\n    void* GLEGetProcAddress(const char* name);\n\n\n    // GLEContext\n    //\n    // Manages a collection of OpenGL extension interfaces.\n    // If the application has multiple OpenGL unrelated contexts then you will want to create a\n    // different instance of this class for each one you intend to use it with. \n    //\n    // Example usage:\n    //     GLEContext gGLEContext;\n    //\n    //     GLEContext::SetCurrentContext(&gGLEContext);\n    //     gGLEContext.PlatformInit(); // Initializes WGL/GLX/etc. platform-specific OpenGL functionality\n    //\n    //     if(GLE_WGL_ARB_create_context) // If wglCreateContextAttribsARB is available...\n    //     {\n    //         int attribList[] = { WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 2, WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_DEBUG_BIT_ARB, None };\n    //         HGLRC h = wglCreateContextAttribsARB(hDC, 0, attribList);\n    //         [...]\n    //     }\n    //\n    //     gGLEContext.Init(); // Must be called after an OpenGL context has been created.\n    //\n    //     if(GLE_WHOLE_VERSION() >= 302) // If OpenGL 3.2 or later\n    //     {\n    //         glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, someTexture, 0); // This is an OpenGL 3.2 function.\n    //         [...]\n    //     }\n    //\n    //     if(GLE_GL_ARB_texture_multisample) // If the GL_ARB_texture_multisample extension is available...\n    //     {\n    //         glEnable(GL_SAMPLE_MASK);\n    //         glSampleMaski(0, 0x1);\n    //         [...]\n    //     }\n    //\n    //     [...]\n    //\n    //     gGLEContext.Shutdown();\n    //\n    GLE_CLASS_EXPORT class GLEContext\n    {\n    public:\n        GLEContext();\n       ~GLEContext();\n      \n        // Initializes platform-specific functionality (e.g. Windows WGL, Unix GLX, Android EGL, Apple CGL).\n        // You would typically call this before creating an OpenGL context and using platform-specific functions.\n        void PlatformInit();\n        bool IsPlatformInitialized() const;\n\n        // Loads all the extensions from the current OpenGL context. This must be called after an OpenGL context \n        // has been created and made current.\n        void Init();\n        bool IsInitialized() const;\n        \n        // Clears all the extensions initialized by PlatformInit and Init. \n        void Shutdown();\n\n        void SetEnableHookGetError(bool enabled)\n            { EnableHookGetError = enabled; }\n\n        // Returns the default instance of this class.\n        static GLEContext* GetCurrentContext();\n        \n        // Sets the default instance of this class. This should be called after enabling a new OpenGL context.\n        // This sets the current GLEContext; it does not set the underlying OpenGL context itself.\n        static void SetCurrentContext(GLEContext*);\n        \n    public:\n        // OpenGL version information\n        int   MajorVersion;             // Best guess at major version\n        int   MinorVersion;             // Best guess at minor version\n        int   WholeVersion;             // Equals ((MajorVersion * 100) + MinorVersion). Example usage: if(glv.WholeVersion >= 302) // If OpenGL v3.02+ ...\n        bool  IsGLES;                   // Open GL ES?\n        bool  IsCoreProfile;            // Is the current OpenGL context a core profile context? Its trueness may be a false positive but will never be a false negative.\n        bool  EnableHookGetError;       // If enabled then hook functions call glGetError after making the call.\n\n        int   PlatformMajorVersion;     // GLX/WGL/EGL/CGL version. Not the same as OpenGL version.\n        int   PlatformMinorVersion;\n        int   PlatformWholeVersion;\n\n        void InitVersion();             // Initializes the version information (e.g. MajorVersion). Called by the public Init function.\n        void InitExtensionLoad();       // Loads the function addresses into the function pointers.\n        void InitExtensionSupport();    // Loads the boolean extension support booleans.\n        \n        void InitPlatformVersion();\n        void InitPlatformExtensionLoad();\n        void InitPlatformExtensionSupport();\n\n    public:\n        // GL_VERSION_1_1\n        // Not normally included because all OpenGL 1.1 functionality is always present. But if we have \n        // hooking enabled then we implement our own version of each function.\n        #if defined(GLE_HOOKING_ENABLED)\n          //void PreHook(const char* functionName);             // Called at the beginning of a hook function.\n            void PostHook(const char* functionName);            // Called at the end of a hook function.\n\n            void            glAccum_Hook(GLenum op, GLfloat value);\n            void            glAlphaFunc_Hook(GLenum func, GLclampf ref);\n            GLboolean       glAreTexturesResident_Hook(GLsizei n, const GLuint *textures, GLboolean *residences);\n            void            glArrayElement_Hook(GLint i);\n            void            glBegin_Hook(GLenum mode);\n            void            glBindTexture_Hook(GLenum target, GLuint texture);\n            void            glBitmap_Hook(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);\n            void            glBlendFunc_Hook(GLenum sfactor, GLenum dfactor);\n            void            glCallList_Hook(GLuint list);\n            void            glCallLists_Hook(GLsizei n, GLenum type, const void *lists);\n            void            glClear_Hook(GLbitfield mask);\n            void            glClearAccum_Hook(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\n            void            glClearColor_Hook(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);\n            void            glClearDepth_Hook(GLclampd depth);\n            void            glClearIndex_Hook(GLfloat c);\n            void            glClearStencil_Hook(GLint s);\n            void            glClipPlane_Hook(GLenum plane, const GLdouble *equation);\n            void            glColor3b_Hook(GLbyte red, GLbyte green, GLbyte blue);\n            void            glColor3bv_Hook(const GLbyte *v);\n            void            glColor3d_Hook(GLdouble red, GLdouble green, GLdouble blue);\n            void            glColor3dv_Hook(const GLdouble *v);\n            void            glColor3f_Hook(GLfloat red, GLfloat green, GLfloat blue);\n            void            glColor3fv_Hook(const GLfloat *v);\n            void            glColor3i_Hook(GLint red, GLint green, GLint blue);\n            void            glColor3iv_Hook(const GLint *v);\n            void            glColor3s_Hook(GLshort red, GLshort green, GLshort blue);\n            void            glColor3sv_Hook(const GLshort *v);\n            void            glColor3ub_Hook(GLubyte red, GLubyte green, GLubyte blue);\n            void            glColor3ubv_Hook(const GLubyte *v);\n            void            glColor3ui_Hook(GLuint red, GLuint green, GLuint blue);\n            void            glColor3uiv_Hook(const GLuint *v);\n            void            glColor3us_Hook(GLushort red, GLushort green, GLushort blue);\n            void            glColor3usv_Hook(const GLushort *v);\n            void            glColor4b_Hook(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);\n            void            glColor4bv_Hook(const GLbyte *v);\n            void            glColor4d_Hook(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);\n            void            glColor4dv_Hook(const GLdouble *v);\n            void            glColor4f_Hook(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\n            void            glColor4fv_Hook(const GLfloat *v);\n            void            glColor4i_Hook(GLint red, GLint green, GLint blue, GLint alpha);\n            void            glColor4iv_Hook(const GLint *v);\n            void            glColor4s_Hook(GLshort red, GLshort green, GLshort blue, GLshort alpha);\n            void            glColor4sv_Hook(const GLshort *v);\n            void            glColor4ub_Hook(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);\n            void            glColor4ubv_Hook(const GLubyte *v);\n            void            glColor4ui_Hook(GLuint red, GLuint green, GLuint blue, GLuint alpha);\n            void            glColor4uiv_Hook(const GLuint *v);\n            void            glColor4us_Hook(GLushort red, GLushort green, GLushort blue, GLushort alpha);\n            void            glColor4usv_Hook(const GLushort *v);\n            void            glColorMask_Hook(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);\n            void            glColorMaterial_Hook(GLenum face, GLenum mode);\n            void            glColorPointer_Hook(GLint size, GLenum type, GLsizei stride, const void *pointer);\n            void            glCopyPixels_Hook(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);\n            void            glCopyTexImage1D_Hook(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border);\n            void            glCopyTexImage2D_Hook(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\n            void            glCopyTexSubImage1D_Hook(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\n            void            glCopyTexSubImage2D_Hook(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\n            void            glCullFace_Hook(GLenum mode);\n            void            glDeleteLists_Hook(GLuint list, GLsizei range);\n            void            glDeleteTextures_Hook(GLsizei n, const GLuint *textures);\n            void            glDepthFunc_Hook(GLenum func);\n            void            glDepthMask_Hook(GLboolean flag);\n            void            glDepthRange_Hook(GLclampd zNear, GLclampd zFar);\n            void            glDisable_Hook(GLenum cap);\n            void            glDisableClientState_Hook(GLenum array);\n            void            glDrawArrays_Hook(GLenum mode, GLint first, GLsizei count);\n            void            glDrawBuffer_Hook(GLenum mode);\n            void            glDrawElements_Hook(GLenum mode, GLsizei count, GLenum type, const void *indices);\n            void            glDrawPixels_Hook(GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);\n            void            glEdgeFlag_Hook(GLboolean flag);\n            void            glEdgeFlagPointer_Hook(GLsizei stride, const void *pointer);\n            void            glEdgeFlagv_Hook(const GLboolean *flag);\n            void            glEnable_Hook(GLenum cap);\n            void            glEnableClientState_Hook(GLenum array);\n            void            glEnd_Hook(void);\n            void            glEndList_Hook(void);\n            void            glEvalCoord1d_Hook(GLdouble u);\n            void            glEvalCoord1dv_Hook(const GLdouble *u);\n            void            glEvalCoord1f_Hook(GLfloat u);\n            void            glEvalCoord1fv_Hook(const GLfloat *u);\n            void            glEvalCoord2d_Hook(GLdouble u, GLdouble v);\n            void            glEvalCoord2dv_Hook(const GLdouble *u);\n            void            glEvalCoord2f_Hook(GLfloat u, GLfloat v);\n            void            glEvalCoord2fv_Hook(const GLfloat *u);\n            void            glEvalMesh1_Hook(GLenum mode, GLint i1, GLint i2);\n            void            glEvalMesh2_Hook(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);\n            void            glEvalPoint1_Hook(GLint i);\n            void            glEvalPoint2_Hook(GLint i, GLint j);\n            void            glFeedbackBuffer_Hook(GLsizei size, GLenum type, GLfloat *buffer);\n            void            glFinish_Hook(void);\n            void            glFlush_Hook(void);\n            void            glFogf_Hook(GLenum pname, GLfloat param);\n            void            glFogfv_Hook(GLenum pname, const GLfloat *params);\n            void            glFogi_Hook(GLenum pname, GLint param);\n            void            glFogiv_Hook(GLenum pname, const GLint *params);\n            void            glFrontFace_Hook(GLenum mode);\n            void            glFrustum_Hook(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);\n            GLuint          glGenLists_Hook(GLsizei range);\n            void            glGenTextures_Hook(GLsizei n, GLuint *textures);\n            void            glGetBooleanv_Hook(GLenum pname, GLboolean *params);\n            void            glGetClipPlane_Hook(GLenum plane, GLdouble *equation);\n            void            glGetDoublev_Hook(GLenum pname, GLdouble *params);\n            GLenum          glGetError_Hook(void);\n            void            glGetFloatv_Hook(GLenum pname, GLfloat *params);\n            void            glGetIntegerv_Hook(GLenum pname, GLint *params);\n            void            glGetLightfv_Hook(GLenum light, GLenum pname, GLfloat *params);\n            void            glGetLightiv_Hook(GLenum light, GLenum pname, GLint *params);\n            void            glGetMapdv_Hook(GLenum target, GLenum query, GLdouble *v);\n            void            glGetMapfv_Hook(GLenum target, GLenum query, GLfloat *v);\n            void            glGetMapiv_Hook(GLenum target, GLenum query, GLint *v);\n            void            glGetMaterialfv_Hook(GLenum face, GLenum pname, GLfloat *params);\n            void            glGetMaterialiv_Hook(GLenum face, GLenum pname, GLint *params);\n            void            glGetPixelMapfv_Hook(GLenum map, GLfloat *values);\n            void            glGetPixelMapuiv_Hook(GLenum map, GLuint *values);\n            void            glGetPixelMapusv_Hook(GLenum map, GLushort *values);\n            void            glGetPointerv_Hook(GLenum pname, void* *params);\n            void            glGetPolygonStipple_Hook(GLubyte *mask);\n            const GLubyte * glGetString_Hook(GLenum name);\n            void            glGetTexEnvfv_Hook(GLenum target, GLenum pname, GLfloat *params);\n            void            glGetTexEnviv_Hook(GLenum target, GLenum pname, GLint *params);\n            void            glGetTexGendv_Hook(GLenum coord, GLenum pname, GLdouble *params);\n            void            glGetTexGenfv_Hook(GLenum coord, GLenum pname, GLfloat *params);\n            void            glGetTexGeniv_Hook(GLenum coord, GLenum pname, GLint *params);\n            void            glGetTexImage_Hook(GLenum target, GLint level, GLenum format, GLenum type, void *pixels);\n            void            glGetTexLevelParameterfv_Hook(GLenum target, GLint level, GLenum pname, GLfloat *params);\n            void            glGetTexLevelParameteriv_Hook(GLenum target, GLint level, GLenum pname, GLint *params);\n            void            glGetTexParameterfv_Hook(GLenum target, GLenum pname, GLfloat *params);\n            void            glGetTexParameteriv_Hook(GLenum target, GLenum pname, GLint *params);\n            void            glHint_Hook(GLenum target, GLenum mode);\n            void            glIndexMask_Hook(GLuint mask);\n            void            glIndexPointer_Hook(GLenum type, GLsizei stride, const void *pointer);\n            void            glIndexd_Hook(GLdouble c);\n            void            glIndexdv_Hook(const GLdouble *c);\n            void            glIndexf_Hook(GLfloat c);\n            void            glIndexfv_Hook(const GLfloat *c);\n            void            glIndexi_Hook(GLint c);\n            void            glIndexiv_Hook(const GLint *c);\n            void            glIndexs_Hook(GLshort c);\n            void            glIndexsv_Hook(const GLshort *c);\n            void            glIndexub_Hook(GLubyte c);\n            void            glIndexubv_Hook(const GLubyte *c);\n            void            glInitNames_Hook(void);\n            void            glInterleavedArrays_Hook(GLenum format, GLsizei stride, const void *pointer);\n            GLboolean       glIsEnabled_Hook(GLenum cap);\n            GLboolean       glIsList_Hook(GLuint list);\n            GLboolean       glIsTexture_Hook(GLuint texture);\n            void            glLightModelf_Hook(GLenum pname, GLfloat param);\n            void            glLightModelfv_Hook(GLenum pname, const GLfloat *params);\n            void            glLightModeli_Hook(GLenum pname, GLint param);\n            void            glLightModeliv_Hook(GLenum pname, const GLint *params);\n            void            glLightf_Hook(GLenum light, GLenum pname, GLfloat param);\n            void            glLightfv_Hook(GLenum light, GLenum pname, const GLfloat *params);\n            void            glLighti_Hook(GLenum light, GLenum pname, GLint param);\n            void            glLightiv_Hook(GLenum light, GLenum pname, const GLint *params);\n            void            glLineStipple_Hook(GLint factor, GLushort pattern);\n            void            glLineWidth_Hook(GLfloat width);\n            void            glListBase_Hook(GLuint base);\n            void            glLoadIdentity_Hook(void);\n            void            glLoadMatrixd_Hook(const GLdouble *m);\n            void            glLoadMatrixf_Hook(const GLfloat *m);\n            void            glLoadName_Hook(GLuint name);\n            void            glLogicOp_Hook(GLenum opcode);\n            void            glMap1d_Hook(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);\n            void            glMap1f_Hook(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);\n            void            glMap2d_Hook(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);\n            void            glMap2f_Hook(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);\n            void            glMapGrid1d_Hook(GLint un, GLdouble u1, GLdouble u2);\n            void            glMapGrid1f_Hook(GLint un, GLfloat u1, GLfloat u2);\n            void            glMapGrid2d_Hook(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);\n            void            glMapGrid2f_Hook(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);\n            void            glMaterialf_Hook(GLenum face, GLenum pname, GLfloat param);\n            void            glMaterialfv_Hook(GLenum face, GLenum pname, const GLfloat *params);\n            void            glMateriali_Hook(GLenum face, GLenum pname, GLint param);\n            void            glMaterialiv_Hook(GLenum face, GLenum pname, const GLint *params);\n            void            glMatrixMode_Hook(GLenum mode);\n            void            glMultMatrixd_Hook(const GLdouble *m);\n            void            glMultMatrixf_Hook(const GLfloat *m);\n            void            glNewList_Hook(GLuint list, GLenum mode);\n            void            glNormal3b_Hook(GLbyte nx, GLbyte ny, GLbyte nz);\n            void            glNormal3bv_Hook(const GLbyte *v);\n            void            glNormal3d_Hook(GLdouble nx, GLdouble ny, GLdouble nz);\n            void            glNormal3dv_Hook(const GLdouble *v);\n            void            glNormal3f_Hook(GLfloat nx, GLfloat ny, GLfloat nz);\n            void            glNormal3fv_Hook(const GLfloat *v);\n            void            glNormal3i_Hook(GLint nx, GLint ny, GLint nz);\n            void            glNormal3iv_Hook(const GLint *v);\n            void            glNormal3s_Hook(GLshort nx, GLshort ny, GLshort nz);\n            void            glNormal3sv_Hook(const GLshort *v);\n            void            glNormalPointer_Hook(GLenum type, GLsizei stride, const void *pointer);\n            void            glOrtho_Hook(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);\n            void            glPassThrough_Hook(GLfloat token);\n            void            glPixelMapfv_Hook(GLenum map, GLsizei mapsize, const GLfloat *values);\n            void            glPixelMapuiv_Hook(GLenum map, GLsizei mapsize, const GLuint *values);\n            void            glPixelMapusv_Hook(GLenum map, GLsizei mapsize, const GLushort *values);\n            void            glPixelStoref_Hook(GLenum pname, GLfloat param);\n            void            glPixelStorei_Hook(GLenum pname, GLint param);\n            void            glPixelTransferf_Hook(GLenum pname, GLfloat param);\n            void            glPixelTransferi_Hook(GLenum pname, GLint param);\n            void            glPixelZoom_Hook(GLfloat xfactor, GLfloat yfactor);\n            void            glPointSize_Hook(GLfloat size);\n            void            glPolygonMode_Hook(GLenum face, GLenum mode);\n            void            glPolygonOffset_Hook(GLfloat factor, GLfloat units);\n            void            glPolygonStipple_Hook(const GLubyte *mask);\n            void            glPopAttrib_Hook(void);\n            void            glPopClientAttrib_Hook(void);\n            void            glPopMatrix_Hook(void);\n            void            glPopName_Hook(void);\n            void            glPrioritizeTextures_Hook(GLsizei n, const GLuint *textures, const GLclampf *priorities);\n            void            glPushAttrib_Hook(GLbitfield mask);\n            void            glPushClientAttrib_Hook(GLbitfield mask);\n            void            glPushMatrix_Hook(void);\n            void            glPushName_Hook(GLuint name);\n            void            glRasterPos2d_Hook(GLdouble x, GLdouble y);\n            void            glRasterPos2dv_Hook(const GLdouble *v);\n            void            glRasterPos2f_Hook(GLfloat x, GLfloat y);\n            void            glRasterPos2fv_Hook(const GLfloat *v);\n            void            glRasterPos2i_Hook(GLint x, GLint y);\n            void            glRasterPos2iv_Hook(const GLint *v);\n            void            glRasterPos2s_Hook(GLshort x, GLshort y);\n            void            glRasterPos2sv_Hook(const GLshort *v);\n            void            glRasterPos3d_Hook(GLdouble x, GLdouble y, GLdouble z);\n            void            glRasterPos3dv_Hook(const GLdouble *v);\n            void            glRasterPos3f_Hook(GLfloat x, GLfloat y, GLfloat z);\n            void            glRasterPos3fv_Hook(const GLfloat *v);\n            void            glRasterPos3i_Hook(GLint x, GLint y, GLint z);\n            void            glRasterPos3iv_Hook(const GLint *v);\n            void            glRasterPos3s_Hook(GLshort x, GLshort y, GLshort z);\n            void            glRasterPos3sv_Hook(const GLshort *v);\n            void            glRasterPos4d_Hook(GLdouble x, GLdouble y, GLdouble z, GLdouble w);\n            void            glRasterPos4dv_Hook(const GLdouble *v);\n            void            glRasterPos4f_Hook(GLfloat x, GLfloat y, GLfloat z, GLfloat w);\n            void            glRasterPos4fv_Hook(const GLfloat *v);\n            void            glRasterPos4i_Hook(GLint x, GLint y, GLint z, GLint w);\n            void            glRasterPos4iv_Hook(const GLint *v);\n            void            glRasterPos4s_Hook(GLshort x, GLshort y, GLshort z, GLshort w);\n            void            glRasterPos4sv_Hook(const GLshort *v);\n            void            glReadBuffer_Hook(GLenum mode);\n            void            glReadPixels_Hook(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);\n            void            glRectd_Hook(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);\n            void            glRectdv_Hook(const GLdouble *v1, const GLdouble *v2);\n            void            glRectf_Hook(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);\n            void            glRectfv_Hook(const GLfloat *v1, const GLfloat *v2);\n            void            glRecti_Hook(GLint x1, GLint y1, GLint x2, GLint y2);\n            void            glRectiv_Hook(const GLint *v1, const GLint *v2);\n            void            glRects_Hook(GLshort x1, GLshort y1, GLshort x2, GLshort y2);\n            void            glRectsv_Hook(const GLshort *v1, const GLshort *v2);\n            GLint           glRenderMode_Hook(GLenum mode);\n            void            glRotated_Hook(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);\n            void            glRotatef_Hook(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);\n            void            glScaled_Hook(GLdouble x, GLdouble y, GLdouble z);\n            void            glScalef_Hook(GLfloat x, GLfloat y, GLfloat z);\n            void            glScissor_Hook(GLint x, GLint y, GLsizei width, GLsizei height);\n            void            glSelectBuffer_Hook(GLsizei size, GLuint *buffer);\n            void            glShadeModel_Hook(GLenum mode);\n            void            glStencilFunc_Hook(GLenum func, GLint ref, GLuint mask);\n            void            glStencilMask_Hook(GLuint mask);\n            void            glStencilOp_Hook(GLenum fail, GLenum zfail, GLenum zpass);\n            void            glTexCoord1d_Hook(GLdouble s);\n            void            glTexCoord1dv_Hook(const GLdouble *v);\n            void            glTexCoord1f_Hook(GLfloat s);\n            void            glTexCoord1fv_Hook(const GLfloat *v);\n            void            glTexCoord1i_Hook(GLint s);\n            void            glTexCoord1iv_Hook(const GLint *v);\n            void            glTexCoord1s_Hook(GLshort s);\n            void            glTexCoord1sv_Hook(const GLshort *v);\n            void            glTexCoord2d_Hook(GLdouble s, GLdouble t);\n            void            glTexCoord2dv_Hook(const GLdouble *v);\n            void            glTexCoord2f_Hook(GLfloat s, GLfloat t);\n            void            glTexCoord2fv_Hook(const GLfloat *v);\n            void            glTexCoord2i_Hook(GLint s, GLint t);\n            void            glTexCoord2iv_Hook(const GLint *v);\n            void            glTexCoord2s_Hook(GLshort s, GLshort t);\n            void            glTexCoord2sv_Hook(const GLshort *v);\n            void            glTexCoord3d_Hook(GLdouble s, GLdouble t, GLdouble r);\n            void            glTexCoord3dv_Hook(const GLdouble *v);\n            void            glTexCoord3f_Hook(GLfloat s, GLfloat t, GLfloat r);\n            void            glTexCoord3fv_Hook(const GLfloat *v);\n            void            glTexCoord3i_Hook(GLint s, GLint t, GLint r);\n            void            glTexCoord3iv_Hook(const GLint *v);\n            void            glTexCoord3s_Hook(GLshort s, GLshort t, GLshort r);\n            void            glTexCoord3sv_Hook(const GLshort *v);\n            void            glTexCoord4d_Hook(GLdouble s, GLdouble t, GLdouble r, GLdouble q);\n            void            glTexCoord4dv_Hook(const GLdouble *v);\n            void            glTexCoord4f_Hook(GLfloat s, GLfloat t, GLfloat r, GLfloat q);\n            void            glTexCoord4fv_Hook(const GLfloat *v);\n            void            glTexCoord4i_Hook(GLint s, GLint t, GLint r, GLint q);\n            void            glTexCoord4iv_Hook(const GLint *v);\n            void            glTexCoord4s_Hook(GLshort s, GLshort t, GLshort r, GLshort q);\n            void            glTexCoord4sv_Hook(const GLshort *v);\n            void            glTexCoordPointer_Hook(GLint size, GLenum type, GLsizei stride, const void *pointer);\n            void            glTexEnvf_Hook(GLenum target, GLenum pname, GLfloat param);\n            void            glTexEnvfv_Hook(GLenum target, GLenum pname, const GLfloat *params);\n            void            glTexEnvi_Hook(GLenum target, GLenum pname, GLint param);\n            void            glTexEnviv_Hook(GLenum target, GLenum pname, const GLint *params);\n            void            glTexGend_Hook(GLenum coord, GLenum pname, GLdouble param);\n            void            glTexGendv_Hook(GLenum coord, GLenum pname, const GLdouble *params);\n            void            glTexGenf_Hook(GLenum coord, GLenum pname, GLfloat param);\n            void            glTexGenfv_Hook(GLenum coord, GLenum pname, const GLfloat *params);\n            void            glTexGeni_Hook(GLenum coord, GLenum pname, GLint param);\n            void            glTexGeniv_Hook(GLenum coord, GLenum pname, const GLint *params);\n            void            glTexImage1D_Hook(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);\n            void            glTexImage2D_Hook(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);\n            void            glTexParameterf_Hook(GLenum target, GLenum pname, GLfloat param);\n            void            glTexParameterfv_Hook(GLenum target, GLenum pname, const GLfloat *params);\n            void            glTexParameteri_Hook(GLenum target, GLenum pname, GLint param);\n            void            glTexParameteriv_Hook(GLenum target, GLenum pname, const GLint *params);\n            void            glTexSubImage1D_Hook(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);\n            void            glTexSubImage2D_Hook(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);\n            void            glTranslated_Hook(GLdouble x, GLdouble y, GLdouble z);\n            void            glTranslatef_Hook(GLfloat x, GLfloat y, GLfloat z);\n            void            glVertex2d_Hook(GLdouble x, GLdouble y);\n            void            glVertex2dv_Hook(const GLdouble *v);\n            void            glVertex2f_Hook(GLfloat x, GLfloat y);\n            void            glVertex2fv_Hook(const GLfloat *v);\n            void            glVertex2i_Hook(GLint x, GLint y);\n            void            glVertex2iv_Hook(const GLint *v);\n            void            glVertex2s_Hook(GLshort x, GLshort y);\n            void            glVertex2sv_Hook(const GLshort *v);\n            void            glVertex3d_Hook(GLdouble x, GLdouble y, GLdouble z);\n            void            glVertex3dv_Hook(const GLdouble *v);\n            void            glVertex3f_Hook(GLfloat x, GLfloat y, GLfloat z);\n            void            glVertex3fv_Hook(const GLfloat *v);\n            void            glVertex3i_Hook(GLint x, GLint y, GLint z);\n            void            glVertex3iv_Hook(const GLint *v);\n            void            glVertex3s_Hook(GLshort x, GLshort y, GLshort z);\n            void            glVertex3sv_Hook(const GLshort *v);\n            void            glVertex4d_Hook(GLdouble x, GLdouble y, GLdouble z, GLdouble w);\n            void            glVertex4dv_Hook(const GLdouble *v);\n            void            glVertex4f_Hook(GLfloat x, GLfloat y, GLfloat z, GLfloat w);\n            void            glVertex4fv_Hook(const GLfloat *v);\n            void            glVertex4i_Hook(GLint x, GLint y, GLint z, GLint w);\n            void            glVertex4iv_Hook(const GLint *v);\n            void            glVertex4s_Hook(GLshort x, GLshort y, GLshort z, GLshort w);\n            void            glVertex4sv_Hook(const GLshort *v);\n            void            glVertexPointer_Hook(GLint size, GLenum type, GLsizei stride, const void *pointer);\n            void            glViewport_Hook(GLint x, GLint y, GLsizei width, GLsizei height);\n\n            // GL_VERSION_1_2\n            void glBlendColor_Hook(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);\n            void glBlendEquation_Hook(GLenum mode);\n            void glDrawRangeElements_Hook(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);\n            void glTexImage3D_Hook(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels);\n            void glTexSubImage3D_Hook(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels);\n            void glCopyTexSubImage3D_Hook(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\n\n            // GL_VERSION_1_2 deprecated functions\n            /* Not currently supported\n            void glColorTable_Hook(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);\n            void glColorTableParameterfv_Hook(GLenum target, GLenum pname, const GLfloat *params);\n            void glColorTableParameteriv_Hook(GLenum target, GLenum pname, const GLint *params);\n            void glCopyColorTable_Hook(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\n            void glGetColorTable_Hook(GLenum target, GLenum format, GLenum type, GLvoid *table);\n            void glGetColorTableParameterfv_Hook(GLenum target, GLenum pname, GLfloat *params);\n            void glGetColorTableParameteriv_Hook(GLenum target, GLenum pname, GLint *params);\n            void glColorSubTable_Hook(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);\n            void glCopyColorSubTable_Hook(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);\n            void glConvolutionFilter1D_Hook(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);\n            void glConvolutionFilter2D_Hook(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);\n            void glConvolutionParameterf_Hook(GLenum target, GLenum pname, GLfloat params);\n            void glConvolutionParameterfv_Hook(GLenum target, GLenum pname, const GLfloat *params);\n            void glConvolutionParameteri_Hook(GLenum target, GLenum pname, GLint params);\n            void glConvolutionParameteriv_Hook(GLenum target, GLenum pname, const GLint *params);\n            void glCopyConvolutionFilter1D_Hook(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\n            void glCopyConvolutionFilter2D_Hook(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);\n            void glGetConvolutionFilter_Hook(GLenum target, GLenum format, GLenum type, GLvoid *image);\n            void glGetConvolutionParameterfv_Hook(GLenum target, GLenum pname, GLfloat *params);\n            void glGetConvolutionParameteriv_Hook(GLenum target, GLenum pname, GLint *params);\n            void glGetSeparableFilter_Hook(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);\n            void glSeparableFilter2D_Hook(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);\n            void glGetHistogram_Hook(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);\n            void glGetHistogramParameterfv_Hook(GLenum target, GLenum pname, GLfloat *params);\n            void glGetHistogramParameteriv_Hook(GLenum target, GLenum pname, GLint *params);\n            void glGetMinmax_Hook(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);\n            void glGetMinmaxParameterfv_Hook(GLenum target, GLenum pname, GLfloat *params);\n            void glGetMinmaxParameteriv_Hook(GLenum target, GLenum pname, GLint *params);\n            void glHistogram_Hook(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);\n            void glMinmax_Hook(GLenum target, GLenum internalformat, GLboolean sink);\n            void glResetHistogram_Hook(GLenum target);\n            void glResetMinmax_Hook(GLenum target);\n            */\n        \n            // GL_VERSION_1_3\n            void glActiveTexture_Hook(GLenum texture);\n            void glSampleCoverage_Hook(GLclampf value, GLboolean invert);\n            void glCompressedTexImage3D_Hook(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data);\n            void glCompressedTexImage2D_Hook(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);\n            void glCompressedTexImage1D_Hook(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data);\n            void glCompressedTexSubImage3D_Hook(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data);\n            void glCompressedTexSubImage2D_Hook(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);\n            void glCompressedTexSubImage1D_Hook(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data);\n            void glGetCompressedTexImage_Hook(GLenum target, GLint level, GLvoid *img);\n\n            // GL_VERSION_1_3 deprecated functions\n            void glClientActiveTexture_Hook(GLenum texture);\n            void glMultiTexCoord1d_Hook(GLenum target, GLdouble s);\n            void glMultiTexCoord1dv_Hook(GLenum target, const GLdouble *v);\n            void glMultiTexCoord1f_Hook(GLenum target, GLfloat s);\n            void glMultiTexCoord1fv_Hook(GLenum target, const GLfloat *v);\n            void glMultiTexCoord1i_Hook(GLenum target, GLint s);\n            void glMultiTexCoord1iv_Hook(GLenum target, const GLint *v);\n            void glMultiTexCoord1s_Hook(GLenum target, GLshort s);\n            void glMultiTexCoord1sv_Hook(GLenum target, const GLshort *v);\n            void glMultiTexCoord2d_Hook(GLenum target, GLdouble s, GLdouble t);\n            void glMultiTexCoord2dv_Hook(GLenum target, const GLdouble *v);\n            void glMultiTexCoord2f_Hook(GLenum target, GLfloat s, GLfloat t);\n            void glMultiTexCoord2fv_Hook(GLenum target, const GLfloat *v);\n            void glMultiTexCoord2i_Hook(GLenum target, GLint s, GLint t);\n            void glMultiTexCoord2iv_Hook(GLenum target, const GLint *v);\n            void glMultiTexCoord2s_Hook(GLenum target, GLshort s, GLshort t);\n            void glMultiTexCoord2sv_Hook(GLenum target, const GLshort *v);\n            void glMultiTexCoord3d_Hook(GLenum target, GLdouble s, GLdouble t, GLdouble r);\n            void glMultiTexCoord3dv_Hook(GLenum target, const GLdouble *v);\n            void glMultiTexCoord3f_Hook(GLenum target, GLfloat s, GLfloat t, GLfloat r);\n            void glMultiTexCoord3fv_Hook(GLenum target, const GLfloat *v);\n            void glMultiTexCoord3i_Hook(GLenum target, GLint s, GLint t, GLint r);\n            void glMultiTexCoord3iv_Hook(GLenum target, const GLint *v);\n            void glMultiTexCoord3s_Hook(GLenum target, GLshort s, GLshort t, GLshort r);\n            void glMultiTexCoord3sv_Hook(GLenum target, const GLshort *v);\n            void glMultiTexCoord4d_Hook(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);\n            void glMultiTexCoord4dv_Hook(GLenum target, const GLdouble *v);\n            void glMultiTexCoord4f_Hook(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);\n            void glMultiTexCoord4fv_Hook(GLenum target, const GLfloat *v);\n            void glMultiTexCoord4i_Hook(GLenum target, GLint s, GLint t, GLint r, GLint q);\n            void glMultiTexCoord4iv_Hook(GLenum target, const GLint *v);\n            void glMultiTexCoord4s_Hook(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);\n            void glMultiTexCoord4sv_Hook(GLenum target, const GLshort *v);\n            void glLoadTransposeMatrixf_Hook(const GLfloat *m);\n            void glLoadTransposeMatrixd_Hook(const GLdouble *m);\n            void glMultTransposeMatrixf_Hook(const GLfloat *m);\n            void glMultTransposeMatrixd_Hook(const GLdouble *m);\n\n            // GL_VERSION_1_4\n            void glBlendFuncSeparate_Hook(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\n            void glMultiDrawArrays_Hook(GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);\n            void glMultiDrawElements_Hook(GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount);\n            void glPointParameterf_Hook(GLenum pname, GLfloat param);\n            void glPointParameterfv_Hook(GLenum pname, const GLfloat *params);\n            void glPointParameteri_Hook(GLenum pname, GLint param);\n            void glPointParameteriv_Hook(GLenum pname, const GLint *params);\n\n            // GL_VERSION_1_4 deprecated functions\n            void glFogCoordf_Hook(GLfloat coord);\n            void glFogCoordfv_Hook(const GLfloat *coord);\n            void glFogCoordd_Hook(GLdouble coord);\n            void glFogCoorddv_Hook(const GLdouble *coord);\n            void glFogCoordPointer_Hook(GLenum type, GLsizei stride, const GLvoid *pointer);\n            void glSecondaryColor3b_Hook(GLbyte red, GLbyte green, GLbyte blue);\n            void glSecondaryColor3bv_Hook(const GLbyte *v);\n            void glSecondaryColor3d_Hook(GLdouble red, GLdouble green, GLdouble blue);\n            void glSecondaryColor3dv_Hook(const GLdouble *v);\n            void glSecondaryColor3f_Hook(GLfloat red, GLfloat green, GLfloat blue);\n            void glSecondaryColor3fv_Hook(const GLfloat *v);\n            void glSecondaryColor3i_Hook(GLint red, GLint green, GLint blue);\n            void glSecondaryColor3iv_Hook(const GLint *v);\n            void glSecondaryColor3s_Hook(GLshort red, GLshort green, GLshort blue);\n            void glSecondaryColor3sv_Hook(const GLshort *v);\n            void glSecondaryColor3ub_Hook(GLubyte red, GLubyte green, GLubyte blue);\n            void glSecondaryColor3ubv_Hook(const GLubyte *v);\n            void glSecondaryColor3ui_Hook(GLuint red, GLuint green, GLuint blue);\n            void glSecondaryColor3uiv_Hook(const GLuint *v);\n            void glSecondaryColor3us_Hook(GLushort red, GLushort green, GLushort blue);\n            void glSecondaryColor3usv_Hook(const GLushort *v);\n            void glSecondaryColorPointer_Hook(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);\n            void glWindowPos2d_Hook(GLdouble x, GLdouble y);\n            void glWindowPos2dv_Hook(const GLdouble *v);\n            void glWindowPos2f_Hook(GLfloat x, GLfloat y);\n            void glWindowPos2fv_Hook(const GLfloat *v);\n            void glWindowPos2i_Hook(GLint x, GLint y);\n            void glWindowPos2iv_Hook(const GLint *v);\n            void glWindowPos2s_Hook(GLshort x, GLshort y);\n            void glWindowPos2sv_Hook(const GLshort *v);\n            void glWindowPos3d_Hook(GLdouble x, GLdouble y, GLdouble z);\n            void glWindowPos3dv_Hook(const GLdouble *v);\n            void glWindowPos3f_Hook(GLfloat x, GLfloat y, GLfloat z);\n            void glWindowPos3fv_Hook(const GLfloat *v);\n            void glWindowPos3i_Hook(GLint x, GLint y, GLint z);\n            void glWindowPos3iv_Hook(const GLint *v);\n            void glWindowPos3s_Hook(GLshort x, GLshort y, GLshort z);\n            void glWindowPos3sv_Hook(const GLshort *v);\n\n            // GL_VERSION_1_5\n            void glGenQueries_Hook(GLsizei n, GLuint *ids);\n            void glDeleteQueries_Hook(GLsizei n, const GLuint *ids);\n            GLboolean glIsQuery_Hook(GLuint id);\n            void glBeginQuery_Hook(GLenum target, GLuint id);\n            void glEndQuery_Hook(GLenum target);\n            void glGetQueryiv_Hook(GLenum target, GLenum pname, GLint *params);\n            void glGetQueryObjectiv_Hook(GLuint id, GLenum pname, GLint *params);\n            void glGetQueryObjectuiv_Hook(GLuint id, GLenum pname, GLuint *params);\n            void glBindBuffer_Hook(GLenum target, GLuint buffer);\n            void glDeleteBuffers_Hook(GLsizei n, const GLuint *buffers);\n            void glGenBuffers_Hook(GLsizei n, GLuint *buffers);\n            GLboolean glIsBuffer_Hook(GLuint buffer);\n            void glBufferData_Hook(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);\n            void glBufferSubData_Hook(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);\n            void glGetBufferSubData_Hook(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data);\n            GLvoid* glMapBuffer_Hook(GLenum target, GLenum access);\n            GLboolean glUnmapBuffer_Hook(GLenum target);\n            void glGetBufferParameteriv_Hook(GLenum target, GLenum pname, GLint *params);\n            void glGetBufferPointerv_Hook(GLenum target, GLenum pname, GLvoid* *params);\n\n            // GL_VERSION_2_0\n            void glBlendEquationSeparate_Hook(GLenum modeRGB, GLenum modeAlpha);\n            void glDrawBuffers_Hook(GLsizei n, const GLenum *bufs);\n            void glStencilOpSeparate_Hook(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);\n            void glStencilFuncSeparate_Hook(GLenum face, GLenum func, GLint ref, GLuint mask);\n            void glStencilMaskSeparate_Hook(GLenum face, GLuint mask);\n            void glAttachShader_Hook(GLuint program, GLuint shader);\n            void glBindAttribLocation_Hook(GLuint program, GLuint index, const GLchar *name);\n            void glCompileShader_Hook(GLuint shader);\n            GLuint glCreateProgram_Hook(void);\n            GLuint glCreateShader_Hook(GLenum type);\n            void glDeleteProgram_Hook(GLuint program);\n            void glDeleteShader_Hook(GLuint shader);\n            void glDetachShader_Hook(GLuint program, GLuint shader);\n            void glDisableVertexAttribArray_Hook(GLuint index);\n            void glEnableVertexAttribArray_Hook(GLuint index);\n            void glGetActiveAttrib_Hook(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);\n            void glGetActiveUniform_Hook(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);\n            void glGetAttachedShaders_Hook(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj);\n            GLint glGetAttribLocation_Hook(GLuint program, const GLchar *name);\n            void glGetProgramiv_Hook(GLuint program, GLenum pname, GLint *params);\n            void glGetProgramInfoLog_Hook(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\n            void glGetShaderiv_Hook(GLuint shader, GLenum pname, GLint *params);\n            void glGetShaderInfoLog_Hook(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);\n            void glGetShaderSource_Hook(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);\n            GLint glGetUniformLocation_Hook(GLuint program, const GLchar *name);\n            void glGetUniformfv_Hook(GLuint program, GLint location, GLfloat *params);\n            void glGetUniformiv_Hook(GLuint program, GLint location, GLint *params);\n            void glGetVertexAttribdv_Hook(GLuint index, GLenum pname, GLdouble *params);\n            void glGetVertexAttribfv_Hook(GLuint index, GLenum pname, GLfloat *params);\n            void glGetVertexAttribiv_Hook(GLuint index, GLenum pname, GLint *params);\n            void glGetVertexAttribPointerv_Hook(GLuint index, GLenum pname, GLvoid* *pointer);\n            GLboolean glIsProgram_Hook(GLuint program);\n            GLboolean glIsShader_Hook(GLuint shader);\n            void glLinkProgram_Hook(GLuint program);\n            void glShaderSource_Hook(GLuint shader, GLsizei count, const GLchar* *string, const GLint *length);\n            void glUseProgram_Hook(GLuint program);\n            void glUniform1f_Hook(GLint location, GLfloat v0);\n            void glUniform2f_Hook(GLint location, GLfloat v0, GLfloat v1);\n            void glUniform3f_Hook(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\n            void glUniform4f_Hook(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\n            void glUniform1i_Hook(GLint location, GLint v0);\n            void glUniform2i_Hook(GLint location, GLint v0, GLint v1);\n            void glUniform3i_Hook(GLint location, GLint v0, GLint v1, GLint v2);\n            void glUniform4i_Hook(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\n            void glUniform1fv_Hook(GLint location, GLsizei count, const GLfloat *value);\n            void glUniform2fv_Hook(GLint location, GLsizei count, const GLfloat *value);\n            void glUniform3fv_Hook(GLint location, GLsizei count, const GLfloat *value);\n            void glUniform4fv_Hook(GLint location, GLsizei count, const GLfloat *value);\n            void glUniform1iv_Hook(GLint location, GLsizei count, const GLint *value);\n            void glUniform2iv_Hook(GLint location, GLsizei count, const GLint *value);\n            void glUniform3iv_Hook(GLint location, GLsizei count, const GLint *value);\n            void glUniform4iv_Hook(GLint location, GLsizei count, const GLint *value);\n            void glUniformMatrix2fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n            void glUniformMatrix3fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n            void glUniformMatrix4fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n            void glValidateProgram_Hook(GLuint program);\n            void glVertexAttrib1d_Hook(GLuint index, GLdouble x);\n            void glVertexAttrib1dv_Hook(GLuint index, const GLdouble *v);\n            void glVertexAttrib1f_Hook(GLuint index, GLfloat x);\n            void glVertexAttrib1fv_Hook(GLuint index, const GLfloat *v);\n            void glVertexAttrib1s_Hook(GLuint index, GLshort x);\n            void glVertexAttrib1sv_Hook(GLuint index, const GLshort *v);\n            void glVertexAttrib2d_Hook(GLuint index, GLdouble x, GLdouble y);\n            void glVertexAttrib2dv_Hook(GLuint index, const GLdouble *v);\n            void glVertexAttrib2f_Hook(GLuint index, GLfloat x, GLfloat y);\n            void glVertexAttrib2fv_Hook(GLuint index, const GLfloat *v);\n            void glVertexAttrib2s_Hook(GLuint index, GLshort x, GLshort y);\n            void glVertexAttrib2sv_Hook(GLuint index, const GLshort *v);\n            void glVertexAttrib3d_Hook(GLuint index, GLdouble x, GLdouble y, GLdouble z);\n            void glVertexAttrib3dv_Hook(GLuint index, const GLdouble *v);\n            void glVertexAttrib3f_Hook(GLuint index, GLfloat x, GLfloat y, GLfloat z);\n            void glVertexAttrib3fv_Hook(GLuint index, const GLfloat *v);\n            void glVertexAttrib3s_Hook(GLuint index, GLshort x, GLshort y, GLshort z);\n            void glVertexAttrib3sv_Hook(GLuint index, const GLshort *v);\n            void glVertexAttrib4Nbv_Hook(GLuint index, const GLbyte *v);\n            void glVertexAttrib4Niv_Hook(GLuint index, const GLint *v);\n            void glVertexAttrib4Nsv_Hook(GLuint index, const GLshort *v);\n            void glVertexAttrib4Nub_Hook(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\n            void glVertexAttrib4Nubv_Hook(GLuint index, const GLubyte *v);\n            void glVertexAttrib4Nuiv_Hook(GLuint index, const GLuint *v);\n            void glVertexAttrib4Nusv_Hook(GLuint index, const GLushort *v);\n            void glVertexAttrib4bv_Hook(GLuint index, const GLbyte *v);\n            void glVertexAttrib4d_Hook(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\n            void glVertexAttrib4dv_Hook(GLuint index, const GLdouble *v);\n            void glVertexAttrib4f_Hook(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\n            void glVertexAttrib4fv_Hook(GLuint index, const GLfloat *v);\n            void glVertexAttrib4iv_Hook(GLuint index, const GLint *v);\n            void glVertexAttrib4s_Hook(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\n            void glVertexAttrib4sv_Hook(GLuint index, const GLshort *v);\n            void glVertexAttrib4ubv_Hook(GLuint index, const GLubyte *v);\n            void glVertexAttrib4uiv_Hook(GLuint index, const GLuint *v);\n            void glVertexAttrib4usv_Hook(GLuint index, const GLushort *v);\n            void glVertexAttribPointer_Hook(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer);\n\n            // GL_VERSION_2_1\n            void glUniformMatrix2x3fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n            void glUniformMatrix3x2fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n            void glUniformMatrix2x4fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n            void glUniformMatrix4x2fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n            void glUniformMatrix3x4fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n            void glUniformMatrix4x3fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n\n            // GL_VERSION_3_0\n            void glColorMaski_Hook(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);\n            void glGetBooleani_v_Hook(GLenum target, GLuint index, GLboolean *data);\n            void  glGetIntegeri_v_Hook(GLenum target, GLuint index, GLint *data);\n            void   glEnablei_Hook(GLenum target, GLuint index);\n            void     glDisablei_Hook(GLenum target, GLuint index);\n            GLboolean glIsEnabledi_Hook(GLenum target, GLuint index);\n            void     glBeginTransformFeedback_Hook(GLenum primitiveMode);\n            void    glEndTransformFeedback_Hook(void);\n            void  glBindBufferRange_Hook(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\n            void glBindBufferBase_Hook(GLenum target, GLuint index, GLuint buffer);\n            void glTransformFeedbackVaryings_Hook(GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode);\n            void glGetTransformFeedbackVarying_Hook(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name);\n            void glClampColor_Hook(GLenum target, GLenum clamp);\n            void glBeginConditionalRender_Hook(GLuint id, GLenum mode);\n            void glEndConditionalRender_Hook(void);\n            void glVertexAttribIPointer_Hook(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);\n            void glGetVertexAttribIiv_Hook(GLuint index, GLenum pname, GLint *params);\n            void glGetVertexAttribIuiv_Hook(GLuint index, GLenum pname, GLuint *params);\n            void glVertexAttribI1i_Hook(GLuint index, GLint x);\n            void glVertexAttribI2i_Hook(GLuint index, GLint x, GLint y);\n            void glVertexAttribI3i_Hook(GLuint index, GLint x, GLint y, GLint z);\n            void glVertexAttribI4i_Hook(GLuint index, GLint x, GLint y, GLint z, GLint w);\n            void glVertexAttribI1ui_Hook(GLuint index, GLuint x);\n            void glVertexAttribI2ui_Hook(GLuint index, GLuint x, GLuint y);\n            void glVertexAttribI3ui_Hook(GLuint index, GLuint x, GLuint y, GLuint z);\n            void glVertexAttribI4ui_Hook(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);\n            void glVertexAttribI1iv_Hook(GLuint index, const GLint *v);\n            void glVertexAttribI2iv_Hook(GLuint index, const GLint *v);\n            void glVertexAttribI3iv_Hook(GLuint index, const GLint *v);\n            void glVertexAttribI4iv_Hook(GLuint index, const GLint *v);\n            void glVertexAttribI1uiv_Hook(GLuint index, const GLuint *v);\n            void glVertexAttribI2uiv_Hook(GLuint index, const GLuint *v);\n            void glVertexAttribI3uiv_Hook(GLuint index, const GLuint *v);\n            void glVertexAttribI4uiv_Hook(GLuint index, const GLuint *v);\n            void glVertexAttribI4bv_Hook(GLuint index, const GLbyte *v);\n            void glVertexAttribI4sv_Hook(GLuint index, const GLshort *v);\n            void glVertexAttribI4ubv_Hook(GLuint index, const GLubyte *v);\n            void glVertexAttribI4usv_Hook(GLuint index, const GLushort *v);\n            void glGetUniformuiv_Hook(GLuint program, GLint location, GLuint *params);\n            void  glBindFragDataLocation_Hook(GLuint program, GLuint color, const GLchar *name);\n            GLint glGetFragDataLocation_Hook(GLuint program, const GLchar *name);\n            void  glUniform1ui_Hook(GLint location, GLuint v0);\n            void glUniform2ui_Hook(GLint location, GLuint v0, GLuint v1);\n            void glUniform3ui_Hook(GLint location, GLuint v0, GLuint v1, GLuint v2);\n            void glUniform4ui_Hook(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\n            void glUniform1uiv_Hook(GLint location, GLsizei count, const GLuint *value);\n            void glUniform2uiv_Hook(GLint location, GLsizei count, const GLuint *value);\n            void glUniform3uiv_Hook(GLint location, GLsizei count, const GLuint *value);\n            void glUniform4uiv_Hook(GLint location, GLsizei count, const GLuint *value);\n            void glTexParameterIiv_Hook(GLenum target, GLenum pname, const GLint *params);\n            void glTexParameterIuiv_Hook(GLenum target, GLenum pname, const GLuint *params);\n            void glGetTexParameterIiv_Hook(GLenum target, GLenum pname, GLint *params);\n            void   glGetTexParameterIuiv_Hook(GLenum target, GLenum pname, GLuint *params);\n            void     glClearBufferiv_Hook(GLenum buffer, GLint drawbuffer, const GLint *value);\n            void      glClearBufferuiv_Hook(GLenum buffer, GLint drawbuffer, const GLuint *value);\n            void        glClearBufferfv_Hook(GLenum buffer, GLint drawbuffer, const GLfloat *value);\n            void          glClearBufferfi_Hook(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);\n            const GLubyte* glGetStringi_Hook(GLenum name, GLuint index);\n\n            // GL_VERSION_3_1\n            void glDrawArraysInstanced_Hook(GLenum mode, GLint first, GLsizei count, GLsizei primcount);\n            void glDrawElementsInstanced_Hook(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount);\n            void glTexBuffer_Hook(GLenum target, GLenum internalformat, GLuint buffer);\n            void glPrimitiveRestartIndex_Hook(GLuint index);\n\n            // GL_VERSION_3_2\n            void glGetInteger64i_v_Hook(GLenum target, GLuint index, GLint64 *data);\n            void glGetBufferParameteri64v_Hook(GLenum target, GLenum pname, GLint64 *params);\n            void glFramebufferTexture_Hook(GLenum target, GLenum attachment, GLuint texture, GLint level);\n\n            // GL_VERSION_3_3\n            void glVertexAttribDivisor_Hook(GLuint index, GLuint divisor);\n\n            // GL_VERSION_4_0\n            void glMinSampleShading_Hook(GLclampf value);\n            void glBlendEquationi_Hook(GLuint buf, GLenum mode);\n            void glBlendEquationSeparatei_Hook(GLuint buf, GLenum modeRGB, GLenum modeAlpha);\n            void glBlendFunci_Hook(GLuint buf, GLenum src, GLenum dst);\n            void glBlendFuncSeparatei_Hook(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\n\n            // GL_AMD_debug_output\n            void   glDebugMessageEnableAMD_Hook(GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);\n            void   glDebugMessageInsertAMD_Hook(GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf);\n            void   glDebugMessageCallbackAMD_Hook(GLDEBUGPROCAMD callback, GLvoid *userParam);\n            GLuint glGetDebugMessageLogAMD_Hook(GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message);\n\n        #if defined(GLE_CGL_ENABLED)\n            // GL_APPLE_element_array\n            void glElementPointerAPPLE_Hook(GLenum type, const GLvoid *pointer);\n            void glDrawElementArrayAPPLE_Hook(GLenum mode, GLint first, GLsizei count);\n            void glDrawRangeElementArrayAPPLE_Hook(GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count);\n            void glMultiDrawElementArrayAPPLE_Hook(GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount);\n            void glMultiDrawRangeElementArrayAPPLE_Hook(GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount);\n\n            // GL_APPLE_fence\n            void glGenFencesAPPLE_Hook(GLsizei n, GLuint *fences);\n            void glDeleteFencesAPPLE_Hook(GLsizei n, const GLuint *fences);\n            void glSetFenceAPPLE_Hook(GLuint fence);\n            GLboolean glIsFenceAPPLE_Hook(GLuint fence);\n            GLboolean glTestFenceAPPLE_Hook(GLuint fence);\n            void glFinishFenceAPPLE_Hook(GLuint fence);\n            GLboolean glTestObjectAPPLE_Hook(GLenum object, GLuint name);\n            void glFinishObjectAPPLE_Hook(GLenum object, GLint name);\n\n            // GL_APPLE_flush_buffer_range\n            void glBufferParameteriAPPLE_Hook(GLenum target, GLenum pname, GLint param);\n            void glFlushMappedBufferRangeAPPLE_Hook(GLenum target, GLintptr offset, GLsizeiptr size);\n\n            // GL_APPLE_object_purgeable\n            GLenum glObjectPurgeableAPPLE_Hook(GLenum objectType, GLuint name, GLenum option);\n            GLenum glObjectUnpurgeableAPPLE_Hook(GLenum objectType, GLuint name, GLenum option);\n            void glGetObjectParameterivAPPLE_Hook(GLenum objectType, GLuint name, GLenum pname, GLint *params);\n\n            // GL_APPLE_texture_range\n            void glTextureRangeAPPLE_Hook(GLenum target, GLsizei length, const GLvoid *pointer);\n            void glGetTexParameterPointervAPPLE_Hook(GLenum target, GLenum pname, GLvoid **params);\n\n            // GL_APPLE_vertex_array_object\n            void glBindVertexArrayAPPLE_Hook(GLuint array);\n            void glDeleteVertexArraysAPPLE_Hook(GLsizei n, const GLuint *arrays);\n            void glGenVertexArraysAPPLE_Hook(GLsizei n, GLuint *arrays);\n            GLboolean glIsVertexArrayAPPLE_Hook(GLuint array);\n\n            // GL_APPLE_vertex_array_range\n            void glVertexArrayRangeAPPLE_Hook(GLsizei length, GLvoid *pointer);\n            void glFlushVertexArrayRangeAPPLE_Hook(GLsizei length, GLvoid *pointer);\n            void glVertexArrayParameteriAPPLE_Hook(GLenum pname, GLint param);\n\n            // GL_APPLE_vertex_program_evaluators\n            void glEnableVertexAttribAPPLE_Hook(GLuint index, GLenum pname);\n            void glDisableVertexAttribAPPLE_Hook(GLuint index, GLenum pname);\n            GLboolean glIsVertexAttribEnabledAPPLE_Hook(GLuint index, GLenum pname);\n            void glMapVertexAttrib1dAPPLE_Hook(GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);\n            void glMapVertexAttrib1fAPPLE_Hook(GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);\n            void glMapVertexAttrib2dAPPLE_Hook(GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);\n            void glMapVertexAttrib2fAPPLE_Hook(GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);\n        #endif // GLE_CGL_ENABLED\n\n            // GL_ARB_debug_output\n            void   glDebugMessageControlARB_Hook(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);\n            void   glDebugMessageInsertARB_Hook(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);\n            void   glDebugMessageCallbackARB_Hook(GLDEBUGPROCARB callback, const GLvoid *userParam);\n            GLuint glGetDebugMessageLogARB_Hook(GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);\n\n            // GL_ARB_ES2_compatibility\n            void glReleaseShaderCompiler_Hook();\n            void glShaderBinary_Hook(GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length);\n            void glGetShaderPrecisionFormat_Hook(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);\n            void glDepthRangef_Hook(GLclampf n, GLclampf f);\n            void glClearDepthf_Hook(GLclampf d);\n\n            // GL_ARB_framebuffer_object\n            GLboolean glIsRenderbuffer_Hook(GLuint renderbuffer);\n            void glBindRenderbuffer_Hook(GLenum target, GLuint renderbuffer);\n            void glDeleteRenderbuffers_Hook(GLsizei n, const GLuint *renderbuffers);\n            void glGenRenderbuffers_Hook(GLsizei n, GLuint *renderbuffers);\n            void glRenderbufferStorage_Hook(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);\n            void glGetRenderbufferParameteriv_Hook(GLenum target, GLenum pname, GLint *params);\n            GLboolean glIsFramebuffer_Hook(GLuint framebuffer);\n            void glBindFramebuffer_Hook(GLenum target, GLuint framebuffer);\n            void glDeleteFramebuffers_Hook(GLsizei n, const GLuint *framebuffers);\n            void glGenFramebuffers_Hook(GLsizei n, GLuint *framebuffers);\n            GLenum glCheckFramebufferStatus_Hook(GLenum target);\n            void glFramebufferTexture1D_Hook(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\n            void glFramebufferTexture2D_Hook(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\n            void glFramebufferTexture3D_Hook(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);\n            void glFramebufferRenderbuffer_Hook(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\n            void glGetFramebufferAttachmentParameteriv_Hook(GLenum target, GLenum attachment, GLenum pname, GLint *params);\n            void glGenerateMipmap_Hook(GLenum target);\n            void glBlitFramebuffer_Hook(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\n            void glRenderbufferStorageMultisample_Hook(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\n            void glFramebufferTextureLayer_Hook(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);\n\n            // GL_ARB_texture_multisample\n            void glTexImage2DMultisample_Hook(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);\n            void glTexImage3DMultisample_Hook(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\n            void glGetMultisamplefv_Hook(GLenum pname, GLuint index, GLfloat *val);\n            void glSampleMaski_Hook(GLuint index, GLbitfield mask);\n\n            // GL_ARB_timer_query\n            void glQueryCounter_Hook(GLuint id, GLenum target);\n            void glGetQueryObjecti64v_Hook(GLuint id, GLenum pname, GLint64 *params);\n            void glGetQueryObjectui64v_Hook(GLuint id, GLenum pname, GLuint64 *params);\n\n            // GL_ARB_vertex_array_object\n            void      glBindVertexArray_Hook(GLuint array);\n            void      glDeleteVertexArrays_Hook(GLsizei n, const GLuint *arrays);\n            void      glGenVertexArrays_Hook(GLsizei n, GLuint *arrays);\n            GLboolean glIsVertexArray_Hook(GLuint array);\n\n            // GL_EXT_draw_buffers2\n            void      glColorMaskIndexedEXT_Hook(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);\n            void      glGetBooleanIndexedvEXT_Hook(GLenum target, GLuint index, GLboolean *data);\n            void      glGetIntegerIndexedvEXT_Hook(GLenum target, GLuint index, GLint *data);\n            void      glEnableIndexedEXT_Hook(GLenum target, GLuint index);\n            void      glDisableIndexedEXT_Hook(GLenum target, GLuint index);\n            GLboolean glIsEnabledIndexedEXT_Hook(GLenum target, GLuint index);\n\n            // GL_KHR_debug\n            void   glDebugMessageControl_Hook(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled);\n            void   glDebugMessageInsert_Hook(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const char* buf);\n            void   glDebugMessageCallback_Hook(GLDEBUGPROC callback, const void* userParam);\n            GLuint glGetDebugMessageLog_Hook(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths,  char* messageLog);\n            void   glPushDebugGroup_Hook(GLenum source, GLuint id, GLsizei length, const char * message);\n            void   glPopDebugGroup_Hook(void);\n            void   glObjectLabel_Hook(GLenum identifier, GLuint name, GLsizei length, const char *label);\n            void   glGetObjectLabel_Hook(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, char *label);\n            void   glObjectPtrLabel_Hook(void* ptr, GLsizei length, const char *label);\n            void   glGetObjectPtrLabel_Hook(void* ptr, GLsizei bufSize, GLsizei *length, char *label);\n\n            // GL_WIN_swap_hint\n            void glAddSwapHintRectWIN_Hook(GLint x, GLint y, GLsizei width, GLsizei height);\n\n          #if defined(GLE_WGL_ENABLED)\n            void PostWGLHook(const char* functionName);\n\n            // WGL\n            /* Hooking of these is currently disabled.\n            BOOL  wglCopyContext_Hook(HGLRC, HGLRC, UINT);\n            HGLRC wglCreateContext_Hook(HDC);\n            HGLRC wglCreateLayerContext_Hook(HDC, int);\n            BOOL  wglDeleteContext_Hook(HGLRC);\n            HGLRC wglGetCurrentContext_Hook(VOID);\n            HDC   wglGetCurrentDC_Hook(VOID);\n            PROC  wglGetProcAddress_Hook(LPCSTR);\n            BOOL  wglMakeCurrent_Hook(HDC, HGLRC);\n            BOOL  wglShareLists_Hook(HGLRC, HGLRC);\n            BOOL  wglUseFontBitmapsA_Hook(HDC, DWORD, DWORD, DWORD);\n            BOOL  wglUseFontBitmapsW_Hook(HDC, DWORD, DWORD, DWORD);\n            BOOL  wglUseFontOutlinesA_Hook(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT, int, LPGLYPHMETRICSFLOAT);\n            BOOL  wglUseFontOutlinesW_Hook(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT, int, LPGLYPHMETRICSFLOAT);\n            BOOL  wglDescribeLayerPlane_Hook(HDC, int, int, UINT, LPLAYERPLANEDESCRIPTOR);\n            int   wglSetLayerPaletteEntries_Hook(HDC, int, int, int, CONST COLORREF *);\n            int   wglGetLayerPaletteEntries_Hook(HDC, int, int, int, COLORREF *);\n            BOOL  wglRealizeLayerPalette_Hook(HDC, int, BOOL);\n            BOOL  wglSwapLayerBuffers_Hook(HDC, UINT);\n            DWORD wglSwapMultipleBuffers_Hook(UINT, CONST WGLSWAP *);\n            */\n\n            // WGL_ARB_buffer_region\n            HANDLE wglCreateBufferRegionARB_Hook (HDC hDC, int iLayerPlane, UINT uType);\n            VOID wglDeleteBufferRegionARB_Hook (HANDLE hRegion);\n            BOOL wglSaveBufferRegionARB_Hook (HANDLE hRegion, int x, int y, int width, int height);\n            BOOL wglRestoreBufferRegionARB_Hook (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc);\n\n            // WGL_ARB_extensions_string\n            const char * wglGetExtensionsStringARB_Hook (HDC hdc);\n\n            // WGL_ARB_pixel_format\n            BOOL wglGetPixelFormatAttribivARB_Hook (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues);\n            BOOL wglGetPixelFormatAttribfvARB_Hook (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues);\n            BOOL wglChoosePixelFormatARB_Hook (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);\n\n            // WGL_ARB_make_current_read\n            BOOL wglMakeContextCurrentARB_Hook (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);\n            HDC wglGetCurrentReadDCARB_Hook (void);\n\n            // WGL_ARB_pbuffer\n            HPBUFFERARB wglCreatePbufferARB_Hook (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList);\n            HDC wglGetPbufferDCARB_Hook (HPBUFFERARB hPbuffer);\n            int wglReleasePbufferDCARB_Hook (HPBUFFERARB hPbuffer, HDC hDC);\n            BOOL wglDestroyPbufferARB_Hook (HPBUFFERARB hPbuffer);\n            BOOL wglQueryPbufferARB_Hook (HPBUFFERARB hPbuffer, int iAttribute, int *piValue);\n\n            // WGL_ARB_render_texture\n            BOOL wglBindTexImageARB_Hook (HPBUFFERARB hPbuffer, int iBuffer);\n            BOOL wglReleaseTexImageARB_Hook (HPBUFFERARB hPbuffer, int iBuffer);\n            BOOL wglSetPbufferAttribARB_Hook (HPBUFFERARB hPbuffer, const int *piAttribList);\n\n            // WGL_NV_present_video\n            int wglEnumerateVideoDevicesNV_Hook (HDC hDC, HVIDEOOUTPUTDEVICENV *phDeviceList);\n            BOOL wglBindVideoDeviceNV_Hook (HDC hDC, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int *piAttribList);\n            BOOL wglQueryCurrentContextNV_Hook (int iAttribute, int *piValue);\n\n            // WGL_ARB_create_context\n            HGLRC wglCreateContextAttribsARB_Hook (HDC hDC, HGLRC hShareContext, const int *attribList);\n\n            // WGL_EXT_extensions_string\n            const char * wglGetExtensionsStringEXT_Hook ();\n\n            // WGL_EXT_swap_control\n            BOOL wglSwapIntervalEXT_Hook(int interval);\n            int  wglGetSwapIntervalEXT_Hook();\n\n            // WGL_OML_sync_control\n            BOOL  wglGetSyncValuesOML_Hook (HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc);\n            BOOL  wglGetMscRateOML_Hook (HDC hdc, INT32 *numerator, INT32 *denominator);\n            INT64 wglSwapBuffersMscOML_Hook (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder);\n            INT64 wglSwapLayerBuffersMscOML_Hook (HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder);\n            BOOL  wglWaitForMscOML_Hook (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 *ust, INT64 *msc, INT64 *sbc);\n            BOOL  wglWaitForSbcOML_Hook (HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc);\n\n             // WGL_NV_video_output\n            BOOL wglGetVideoDeviceNV_Hook (HDC hDC, int numDevices, HPVIDEODEV *hVideoDevice);\n            BOOL wglReleaseVideoDeviceNV_Hook (HPVIDEODEV hVideoDevice);\n            BOOL wglBindVideoImageNV_Hook (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer);\n            BOOL wglReleaseVideoImageNV_Hook (HPBUFFERARB hPbuffer, int iVideoBuffer);\n            BOOL wglSendPbufferToVideoNV_Hook (HPBUFFERARB hPbuffer, int iBufferType, unsigned long *pulCounterPbuffer, BOOL bBlock);\n            BOOL wglGetVideoInfoNV_Hook (HPVIDEODEV hpVideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo);\n\n             // WGL_NV_swap_group\n            BOOL wglJoinSwapGroupNV_Hook (HDC hDC, GLuint group);\n            BOOL wglBindSwapBarrierNV_Hook (GLuint group, GLuint barrier);\n            BOOL wglQuerySwapGroupNV_Hook (HDC hDC, GLuint *group, GLuint *barrier);\n            BOOL wglQueryMaxSwapGroupsNV_Hook (HDC hDC, GLuint *maxGroups, GLuint *maxBarriers);\n            BOOL wglQueryFrameCountNV_Hook (HDC hDC, GLuint *count);\n            BOOL wglResetFrameCountNV_Hook (HDC hDC);\n\n             // WGL_NV_video_capture\n            BOOL wglBindVideoCaptureDeviceNV_Hook (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice);\n            UINT wglEnumerateVideoCaptureDevicesNV_Hook (HDC hDc, HVIDEOINPUTDEVICENV *phDeviceList);\n            BOOL wglLockVideoCaptureDeviceNV_Hook (HDC hDc, HVIDEOINPUTDEVICENV hDevice);\n            BOOL wglQueryVideoCaptureDeviceNV_Hook (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int *piValue);\n            BOOL wglReleaseVideoCaptureDeviceNV_Hook (HDC hDc, HVIDEOINPUTDEVICENV hDevice);\n\n            // WGL_NV_copy_image\n            BOOL wglCopyImageSubDataNV_Hook (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);\n\n            // WGL_NV_DX_interop\n            BOOL   wglDXSetResourceShareHandleNV_Hook(void *dxObject, HANDLE shareHandle);\n            HANDLE wglDXOpenDeviceNV_Hook(void *dxDevice);\n            BOOL   wglDXCloseDeviceNV_Hook(HANDLE hDevice);\n            HANDLE wglDXRegisterObjectNV_Hook(HANDLE hDevice, void *dxObject, GLuint name, GLenum type, GLenum access);\n            BOOL   wglDXUnregisterObjectNV_Hook(HANDLE hDevice, HANDLE hObject);\n            BOOL   wglDXObjectAccessNV_Hook(HANDLE hObject, GLenum access);\n            BOOL   wglDXLockObjectsNV_Hook(HANDLE hDevice, GLint count, HANDLE *hObjects);\n            BOOL   wglDXUnlockObjectsNV_Hook(HANDLE hDevice, GLint count, HANDLE *hObjects);\n          #endif // GLE_WGL_ENABLED\n\n          #if defined(GLE_GLX_ENABLED)\n            void PostGLXHook(const char* functionName);\n\n            // GLX_VERSION_1_0\n            // GLX_VERSION_1_1\n            // We don't currently do hooking of these.\n\n            // GLX_VERSION_1_2\n            ::Display* glXGetCurrentDisplay_Hook(void);\n\n            // GLX_VERSION_1_3\n            GLXFBConfig* glXChooseFBConfig_Hook(::Display *dpy, int screen, const int *attrib_list, int *nelements);\n            GLXContext   glXCreateNewContext_Hook(::Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);\n            GLXPbuffer   glXCreatePbuffer_Hook(::Display *dpy, GLXFBConfig config, const int *attrib_list);\n            GLXPixmap    glXCreatePixmap_Hook(::Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list);\n            GLXWindow    glXCreateWindow_Hook(::Display *dpy, GLXFBConfig config, Window win, const int *attrib_list);\n            void         glXDestroyPbuffer_Hook(::Display *dpy, GLXPbuffer pbuf);\n            void         glXDestroyPixmap_Hook(::Display *dpy, GLXPixmap pixmap);\n            void         glXDestroyWindow_Hook(::Display *dpy, GLXWindow win);\n            GLXDrawable  glXGetCurrentReadDrawable_Hook(void);\n            int          glXGetFBConfigAttrib_Hook(::Display *dpy, GLXFBConfig config, int attribute, int *value);\n            GLXFBConfig* glXGetFBConfigs_Hook(::Display *dpy, int screen, int *nelements);\n            void         glXGetSelectedEvent_Hook(::Display *dpy, GLXDrawable draw, unsigned long *event_mask);\n            XVisualInfo* glXGetVisualFromFBConfig_Hook(::Display *dpy, GLXFBConfig config);\n            Bool         glXMakeContextCurrent_Hook(::Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx);\n            int          glXQueryContext_Hook(::Display *dpy, GLXContext ctx, int attribute, int *value);\n            void         glXQueryDrawable_Hook(::Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);\n            void         glXSelectEvent_Hook(::Display *dpy, GLXDrawable draw, unsigned long event_mask);\n\n            // GLX_VERSION_1_4\n            // We don't do hooking of this.\n\n            // GLX_ARB_create_context\n            GLXContext glXCreateContextAttribsARB_Hook(Display* dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list);\n\n            // GLX_EXT_swap_control\n            void glXSwapIntervalEXT_Hook(::Display* dpy, GLXDrawable drawable, int interval);\n\n            // GLX_OML_sync_control\n\t\t\tBool    glXGetMscRateOML_Hook(::Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator);\n\t\t\tBool    glXGetSyncValuesOML_Hook(::Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc);\n\t\t\tint64_t glXSwapBuffersMscOML_Hook(::Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder);\n\t\t\tBool    glXWaitForMscOML_Hook(::Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc);\n\t\t\tBool    glXWaitForSbcOML_Hook(::Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc);\n\n            // GLX_MESA_swap_control\n            int glXGetSwapIntervalMESA_Hook();\n            int glXSwapIntervalMESA_Hook(unsigned int interval);\n\n          #endif // GLE_GLX_ENABLED\n\n        #endif // #if defined(GLE_HOOKING_ENABLED)\n\n        // GL_VERSION_1_1\n        // These are not represented by function pointers.\n        \n        // GL_VERSION_1_2\n        PFNGLCOPYTEXSUBIMAGE3DPROC glCopyTexSubImage3D_Impl;\n        PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements_Impl;\n        PFNGLTEXIMAGE3DPROC glTexImage3D_Impl;\n        PFNGLTEXSUBIMAGE3DPROC glTexSubImage3D_Impl;\n\n        // GL_VERSION_1_2 deprecated functions\n        /* Not currently supported\n        PFNGLCOLORTABLEPROC glColorTable_Impl;\n        PFNGLCOLORTABLEPARAMETERFVPROC glColorTableParameterfv_Impl;\n        PFNGLCOLORTABLEPARAMETERIVPROC glColorTableParameteriv_Impl;\n        PFNGLCOPYCOLORTABLEPROC glCopyColorTable_Impl;\n        PFNGLGETCOLORTABLEPROC glGetColorTable_Impl;\n        PFNGLGETCOLORTABLEPARAMETERFVPROC glGetColorTableParameterfv_Impl;\n        PFNGLGETCOLORTABLEPARAMETERIVPROC glGetColorTableParameteriv_Impl;\n        PFNGLCOLORSUBTABLEPROC glColorSubTable_Impl;\n        PFNGLCOPYCOLORSUBTABLEPROC glCopyColorSubTable_Impl;\n        PFNGLCONVOLUTIONFILTER1DPROC glConvolutionFilter1D_Impl;\n        PFNGLCONVOLUTIONFILTER2DPROC glConvolutionFilter2D_Impl;\n        PFNGLCONVOLUTIONPARAMETERFPROC glConvolutionParameterf_Impl;\n        PFNGLCONVOLUTIONPARAMETERFVPROC glConvolutionParameterfv_Impl;\n        PFNGLCONVOLUTIONPARAMETERIPROC glConvolutionParameteri_Impl;\n        PFNGLCONVOLUTIONPARAMETERIVPROC glConvolutionParameteriv_Impl;\n        PFNGLCOPYCONVOLUTIONFILTER1DPROC glCopyConvolutionFilter1D_Impl;\n        PFNGLCOPYCONVOLUTIONFILTER2DPROC glCopyConvolutionFilter2D_Impl;\n        PFNGLGETCONVOLUTIONFILTERPROC glGetConvolutionFilter_Impl;\n        PFNGLGETCONVOLUTIONPARAMETERFVPROC glGetConvolutionParameterfv_Impl;\n        PFNGLGETCONVOLUTIONPARAMETERIVPROC glGetConvolutionParameteriv_Impl;\n        PFNGLGETSEPARABLEFILTERPROC glGetSeparableFilter_Impl;\n        PFNGLSEPARABLEFILTER2DPROC glSeparableFilter2D_Impl;\n        PFNGLGETHISTOGRAMPROC glGetHistogram_Impl;\n        PFNGLGETHISTOGRAMPARAMETERFVPROC glGetHistogramParameterfv_Impl;\n        PFNGLGETHISTOGRAMPARAMETERIVPROC glGetHistogramParameteriv_Impl;\n        PFNGLGETMINMAXPROC glGetMinmax_Impl;\n        PFNGLGETMINMAXPARAMETERFVPROC glGetMinmaxParameterfv_Impl;\n        PFNGLGETMINMAXPARAMETERIVPROC glGetMinmaxParameteriv_Impl;\n        PFNGLHISTOGRAMPROC glHistogram_Impl;\n        PFNGLMINMAXPROC glMinmax_Impl;\n        PFNGLRESETHISTOGRAMPROC glResetHistogram_Impl;\n        PFNGLRESETMINMAXPROC glResetMinmax_Impl;\n        */\n\n        // GL_VERSION_1_3\n        PFNGLACTIVETEXTUREPROC glActiveTexture_Impl;\n        PFNGLCLIENTACTIVETEXTUREPROC glClientActiveTexture_Impl;\n        PFNGLCOMPRESSEDTEXIMAGE1DPROC glCompressedTexImage1D_Impl;\n        PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D_Impl;\n        PFNGLCOMPRESSEDTEXIMAGE3DPROC glCompressedTexImage3D_Impl;\n        PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glCompressedTexSubImage1D_Impl;\n        PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glCompressedTexSubImage2D_Impl;\n        PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glCompressedTexSubImage3D_Impl;\n        PFNGLGETCOMPRESSEDTEXIMAGEPROC glGetCompressedTexImage_Impl;\n        PFNGLLOADTRANSPOSEMATRIXDPROC glLoadTransposeMatrixd_Impl;\n        PFNGLLOADTRANSPOSEMATRIXFPROC glLoadTransposeMatrixf_Impl;\n        PFNGLMULTTRANSPOSEMATRIXDPROC glMultTransposeMatrixd_Impl;\n        PFNGLMULTTRANSPOSEMATRIXFPROC glMultTransposeMatrixf_Impl;\n        PFNGLMULTITEXCOORD1DPROC glMultiTexCoord1d_Impl;\n        PFNGLMULTITEXCOORD1DVPROC glMultiTexCoord1dv_Impl;\n        PFNGLMULTITEXCOORD1FPROC glMultiTexCoord1f_Impl;\n        PFNGLMULTITEXCOORD1FVPROC glMultiTexCoord1fv_Impl;\n        PFNGLMULTITEXCOORD1IPROC glMultiTexCoord1i_Impl;\n        PFNGLMULTITEXCOORD1IVPROC glMultiTexCoord1iv_Impl;\n        PFNGLMULTITEXCOORD1SPROC glMultiTexCoord1s_Impl;\n        PFNGLMULTITEXCOORD1SVPROC glMultiTexCoord1sv_Impl;\n        PFNGLMULTITEXCOORD2DPROC glMultiTexCoord2d_Impl;\n        PFNGLMULTITEXCOORD2DVPROC glMultiTexCoord2dv_Impl;\n        PFNGLMULTITEXCOORD2FPROC glMultiTexCoord2f_Impl;\n        PFNGLMULTITEXCOORD2FVPROC glMultiTexCoord2fv_Impl;\n        PFNGLMULTITEXCOORD2IPROC glMultiTexCoord2i_Impl;\n        PFNGLMULTITEXCOORD2IVPROC glMultiTexCoord2iv_Impl;\n        PFNGLMULTITEXCOORD2SPROC glMultiTexCoord2s_Impl;\n        PFNGLMULTITEXCOORD2SVPROC glMultiTexCoord2sv_Impl;\n        PFNGLMULTITEXCOORD3DPROC glMultiTexCoord3d_Impl;\n        PFNGLMULTITEXCOORD3DVPROC glMultiTexCoord3dv_Impl;\n        PFNGLMULTITEXCOORD3FPROC glMultiTexCoord3f_Impl;\n        PFNGLMULTITEXCOORD3FVPROC glMultiTexCoord3fv_Impl;\n        PFNGLMULTITEXCOORD3IPROC glMultiTexCoord3i_Impl;\n        PFNGLMULTITEXCOORD3IVPROC glMultiTexCoord3iv_Impl;\n        PFNGLMULTITEXCOORD3SPROC glMultiTexCoord3s_Impl;\n        PFNGLMULTITEXCOORD3SVPROC glMultiTexCoord3sv_Impl;\n        PFNGLMULTITEXCOORD4DPROC glMultiTexCoord4d_Impl;\n        PFNGLMULTITEXCOORD4DVPROC glMultiTexCoord4dv_Impl;\n        PFNGLMULTITEXCOORD4FPROC glMultiTexCoord4f_Impl;\n        PFNGLMULTITEXCOORD4FVPROC glMultiTexCoord4fv_Impl;\n        PFNGLMULTITEXCOORD4IPROC glMultiTexCoord4i_Impl;\n        PFNGLMULTITEXCOORD4IVPROC glMultiTexCoord4iv_Impl;\n        PFNGLMULTITEXCOORD4SPROC glMultiTexCoord4s_Impl;\n        PFNGLMULTITEXCOORD4SVPROC glMultiTexCoord4sv_Impl;\n        PFNGLSAMPLECOVERAGEPROC glSampleCoverage_Impl;\n\n        // GL_VERSION_1_4\n        PFNGLBLENDCOLORPROC glBlendColor_Impl;\n        PFNGLBLENDEQUATIONPROC glBlendEquation_Impl;\n        PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate_Impl;\n        PFNGLFOGCOORDPOINTERPROC glFogCoordPointer_Impl;\n        PFNGLFOGCOORDDPROC glFogCoordd_Impl;\n        PFNGLFOGCOORDDVPROC glFogCoorddv_Impl;\n        PFNGLFOGCOORDFPROC glFogCoordf_Impl;\n        PFNGLFOGCOORDFVPROC glFogCoordfv_Impl;\n        PFNGLMULTIDRAWARRAYSPROC glMultiDrawArrays_Impl;\n        PFNGLMULTIDRAWELEMENTSPROC glMultiDrawElements_Impl;\n        PFNGLPOINTPARAMETERFPROC glPointParameterf_Impl;\n        PFNGLPOINTPARAMETERFVPROC glPointParameterfv_Impl;\n        PFNGLPOINTPARAMETERIPROC glPointParameteri_Impl;\n        PFNGLPOINTPARAMETERIVPROC glPointParameteriv_Impl;\n        PFNGLSECONDARYCOLOR3BPROC glSecondaryColor3b_Impl;\n        PFNGLSECONDARYCOLOR3BVPROC glSecondaryColor3bv_Impl;\n        PFNGLSECONDARYCOLOR3DPROC glSecondaryColor3d_Impl;\n        PFNGLSECONDARYCOLOR3DVPROC glSecondaryColor3dv_Impl;\n        PFNGLSECONDARYCOLOR3FPROC glSecondaryColor3f_Impl;\n        PFNGLSECONDARYCOLOR3FVPROC glSecondaryColor3fv_Impl;\n        PFNGLSECONDARYCOLOR3IPROC glSecondaryColor3i_Impl;\n        PFNGLSECONDARYCOLOR3IVPROC glSecondaryColor3iv_Impl;\n        PFNGLSECONDARYCOLOR3SPROC glSecondaryColor3s_Impl;\n        PFNGLSECONDARYCOLOR3SVPROC glSecondaryColor3sv_Impl;\n        PFNGLSECONDARYCOLOR3UBPROC glSecondaryColor3ub_Impl;\n        PFNGLSECONDARYCOLOR3UBVPROC glSecondaryColor3ubv_Impl;\n        PFNGLSECONDARYCOLOR3UIPROC glSecondaryColor3ui_Impl;\n        PFNGLSECONDARYCOLOR3UIVPROC glSecondaryColor3uiv_Impl;\n        PFNGLSECONDARYCOLOR3USPROC glSecondaryColor3us_Impl;\n        PFNGLSECONDARYCOLOR3USVPROC glSecondaryColor3usv_Impl;\n        PFNGLSECONDARYCOLORPOINTERPROC glSecondaryColorPointer_Impl;\n        PFNGLWINDOWPOS2DPROC glWindowPos2d_Impl;\n        PFNGLWINDOWPOS2DVPROC glWindowPos2dv_Impl;\n        PFNGLWINDOWPOS2FPROC glWindowPos2f_Impl;\n        PFNGLWINDOWPOS2FVPROC glWindowPos2fv_Impl;\n        PFNGLWINDOWPOS2IPROC glWindowPos2i_Impl;\n        PFNGLWINDOWPOS2IVPROC glWindowPos2iv_Impl;\n        PFNGLWINDOWPOS2SPROC glWindowPos2s_Impl;\n        PFNGLWINDOWPOS2SVPROC glWindowPos2sv_Impl;\n        PFNGLWINDOWPOS3DPROC glWindowPos3d_Impl;\n        PFNGLWINDOWPOS3DVPROC glWindowPos3dv_Impl;\n        PFNGLWINDOWPOS3FPROC glWindowPos3f_Impl;\n        PFNGLWINDOWPOS3FVPROC glWindowPos3fv_Impl;\n        PFNGLWINDOWPOS3IPROC glWindowPos3i_Impl;\n        PFNGLWINDOWPOS3IVPROC glWindowPos3iv_Impl;\n        PFNGLWINDOWPOS3SPROC glWindowPos3s_Impl;\n        PFNGLWINDOWPOS3SVPROC glWindowPos3sv_Impl;\n\n        // GL_VERSION_1_5\n        PFNGLBEGINQUERYPROC glBeginQuery_Impl;\n        PFNGLBINDBUFFERPROC glBindBuffer_Impl;\n        PFNGLBUFFERDATAPROC glBufferData_Impl;\n        PFNGLBUFFERSUBDATAPROC glBufferSubData_Impl;\n        PFNGLDELETEBUFFERSPROC glDeleteBuffers_Impl;\n        PFNGLDELETEQUERIESPROC glDeleteQueries_Impl;\n        PFNGLENDQUERYPROC glEndQuery_Impl;\n        PFNGLGENBUFFERSPROC glGenBuffers_Impl;\n        PFNGLGENQUERIESPROC glGenQueries_Impl;\n        PFNGLGETBUFFERPARAMETERIVPROC glGetBufferParameteriv_Impl;\n        PFNGLGETBUFFERPOINTERVPROC glGetBufferPointerv_Impl;\n        PFNGLGETBUFFERSUBDATAPROC glGetBufferSubData_Impl;\n        PFNGLGETQUERYOBJECTIVPROC glGetQueryObjectiv_Impl;\n        PFNGLGETQUERYOBJECTUIVPROC glGetQueryObjectuiv_Impl;\n        PFNGLGETQUERYIVPROC glGetQueryiv_Impl;\n        PFNGLISBUFFERPROC glIsBuffer_Impl;\n        PFNGLISQUERYPROC glIsQuery_Impl;\n        PFNGLMAPBUFFERPROC glMapBuffer_Impl;\n        PFNGLUNMAPBUFFERPROC glUnmapBuffer_Impl;\n\n        // GL_VERSION_2_0\n        PFNGLATTACHSHADERPROC glAttachShader_Impl;\n        PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation_Impl;\n        PFNGLBLENDEQUATIONSEPARATEPROC glBlendEquationSeparate_Impl;\n        PFNGLCOMPILESHADERPROC glCompileShader_Impl;\n        PFNGLCREATEPROGRAMPROC glCreateProgram_Impl;\n        PFNGLCREATESHADERPROC glCreateShader_Impl;\n        PFNGLDELETEPROGRAMPROC glDeleteProgram_Impl;\n        PFNGLDELETESHADERPROC glDeleteShader_Impl;\n        PFNGLDETACHSHADERPROC glDetachShader_Impl;\n        PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray_Impl;\n        PFNGLDRAWBUFFERSPROC glDrawBuffers_Impl;\n        PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray_Impl;\n        PFNGLGETACTIVEATTRIBPROC glGetActiveAttrib_Impl;\n        PFNGLGETACTIVEUNIFORMPROC glGetActiveUniform_Impl;\n        PFNGLGETATTACHEDSHADERSPROC glGetAttachedShaders_Impl;\n        PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation_Impl;\n        PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog_Impl;\n        PFNGLGETPROGRAMIVPROC glGetProgramiv_Impl;\n        PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog_Impl;\n        PFNGLGETSHADERSOURCEPROC glGetShaderSource_Impl;\n        PFNGLGETSHADERIVPROC glGetShaderiv_Impl;\n        PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation_Impl;\n        PFNGLGETUNIFORMFVPROC glGetUniformfv_Impl;\n        PFNGLGETUNIFORMIVPROC glGetUniformiv_Impl;\n        PFNGLGETVERTEXATTRIBPOINTERVPROC glGetVertexAttribPointerv_Impl;\n        PFNGLGETVERTEXATTRIBDVPROC glGetVertexAttribdv_Impl;\n        PFNGLGETVERTEXATTRIBFVPROC glGetVertexAttribfv_Impl;\n        PFNGLGETVERTEXATTRIBIVPROC glGetVertexAttribiv_Impl;\n        PFNGLISPROGRAMPROC glIsProgram_Impl;\n        PFNGLISSHADERPROC glIsShader_Impl;\n        PFNGLLINKPROGRAMPROC glLinkProgram_Impl;\n        PFNGLSHADERSOURCEPROC glShaderSource_Impl;\n        PFNGLSTENCILFUNCSEPARATEPROC glStencilFuncSeparate_Impl;\n        PFNGLSTENCILMASKSEPARATEPROC glStencilMaskSeparate_Impl;\n        PFNGLSTENCILOPSEPARATEPROC glStencilOpSeparate_Impl;\n        PFNGLUNIFORM1FPROC glUniform1f_Impl;\n        PFNGLUNIFORM1FVPROC glUniform1fv_Impl;\n        PFNGLUNIFORM1IPROC glUniform1i_Impl;\n        PFNGLUNIFORM1IVPROC glUniform1iv_Impl;\n        PFNGLUNIFORM2FPROC glUniform2f_Impl;\n        PFNGLUNIFORM2FVPROC glUniform2fv_Impl;\n        PFNGLUNIFORM2IPROC glUniform2i_Impl;\n        PFNGLUNIFORM2IVPROC glUniform2iv_Impl;\n        PFNGLUNIFORM3FPROC glUniform3f_Impl;\n        PFNGLUNIFORM3FVPROC glUniform3fv_Impl;\n        PFNGLUNIFORM3IPROC glUniform3i_Impl;\n        PFNGLUNIFORM3IVPROC glUniform3iv_Impl;\n        PFNGLUNIFORM4FPROC glUniform4f_Impl;\n        PFNGLUNIFORM4FVPROC glUniform4fv_Impl;\n        PFNGLUNIFORM4IPROC glUniform4i_Impl;\n        PFNGLUNIFORM4IVPROC glUniform4iv_Impl;\n        PFNGLUNIFORMMATRIX2FVPROC glUniformMatrix2fv_Impl;\n        PFNGLUNIFORMMATRIX3FVPROC glUniformMatrix3fv_Impl;\n        PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv_Impl;\n        PFNGLUSEPROGRAMPROC glUseProgram_Impl;\n        PFNGLVALIDATEPROGRAMPROC glValidateProgram_Impl;\n        PFNGLVERTEXATTRIB1DPROC glVertexAttrib1d_Impl;\n        PFNGLVERTEXATTRIB1DVPROC glVertexAttrib1dv_Impl;\n        PFNGLVERTEXATTRIB1FPROC glVertexAttrib1f_Impl;\n        PFNGLVERTEXATTRIB1FVPROC glVertexAttrib1fv_Impl;\n        PFNGLVERTEXATTRIB1SPROC glVertexAttrib1s_Impl;\n        PFNGLVERTEXATTRIB1SVPROC glVertexAttrib1sv_Impl;\n        PFNGLVERTEXATTRIB2DPROC glVertexAttrib2d_Impl;\n        PFNGLVERTEXATTRIB2DVPROC glVertexAttrib2dv_Impl;\n        PFNGLVERTEXATTRIB2FPROC glVertexAttrib2f_Impl;\n        PFNGLVERTEXATTRIB2FVPROC glVertexAttrib2fv_Impl;\n        PFNGLVERTEXATTRIB2SPROC glVertexAttrib2s_Impl;\n        PFNGLVERTEXATTRIB2SVPROC glVertexAttrib2sv_Impl;\n        PFNGLVERTEXATTRIB3DPROC glVertexAttrib3d_Impl;\n        PFNGLVERTEXATTRIB3DVPROC glVertexAttrib3dv_Impl;\n        PFNGLVERTEXATTRIB3FPROC glVertexAttrib3f_Impl;\n        PFNGLVERTEXATTRIB3FVPROC glVertexAttrib3fv_Impl;\n        PFNGLVERTEXATTRIB3SPROC glVertexAttrib3s_Impl;\n        PFNGLVERTEXATTRIB3SVPROC glVertexAttrib3sv_Impl;\n        PFNGLVERTEXATTRIB4NBVPROC glVertexAttrib4Nbv_Impl;\n        PFNGLVERTEXATTRIB4NIVPROC glVertexAttrib4Niv_Impl;\n        PFNGLVERTEXATTRIB4NSVPROC glVertexAttrib4Nsv_Impl;\n        PFNGLVERTEXATTRIB4NUBPROC glVertexAttrib4Nub_Impl;\n        PFNGLVERTEXATTRIB4NUBVPROC glVertexAttrib4Nubv_Impl;\n        PFNGLVERTEXATTRIB4NUIVPROC glVertexAttrib4Nuiv_Impl;\n        PFNGLVERTEXATTRIB4NUSVPROC glVertexAttrib4Nusv_Impl;\n        PFNGLVERTEXATTRIB4BVPROC glVertexAttrib4bv_Impl;\n        PFNGLVERTEXATTRIB4DPROC glVertexAttrib4d_Impl;\n        PFNGLVERTEXATTRIB4DVPROC glVertexAttrib4dv_Impl;\n        PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f_Impl;\n        PFNGLVERTEXATTRIB4FVPROC glVertexAttrib4fv_Impl;\n        PFNGLVERTEXATTRIB4IVPROC glVertexAttrib4iv_Impl;\n        PFNGLVERTEXATTRIB4SPROC glVertexAttrib4s_Impl;\n        PFNGLVERTEXATTRIB4SVPROC glVertexAttrib4sv_Impl;\n        PFNGLVERTEXATTRIB4UBVPROC glVertexAttrib4ubv_Impl;\n        PFNGLVERTEXATTRIB4UIVPROC glVertexAttrib4uiv_Impl;\n        PFNGLVERTEXATTRIB4USVPROC glVertexAttrib4usv_Impl;\n        PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer_Impl;\n\n        // GL_VERSION_2_1\n        PFNGLUNIFORMMATRIX2X3FVPROC glUniformMatrix2x3fv_Impl;\n        PFNGLUNIFORMMATRIX2X4FVPROC glUniformMatrix2x4fv_Impl;\n        PFNGLUNIFORMMATRIX3X2FVPROC glUniformMatrix3x2fv_Impl;\n        PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv_Impl;\n        PFNGLUNIFORMMATRIX4X2FVPROC glUniformMatrix4x2fv_Impl;\n        PFNGLUNIFORMMATRIX4X3FVPROC glUniformMatrix4x3fv_Impl;\n\n        // GL_VERSION_3_0\n        PFNGLBEGINCONDITIONALRENDERPROC glBeginConditionalRender_Impl;\n        PFNGLBEGINTRANSFORMFEEDBACKPROC glBeginTransformFeedback_Impl;\n        PFNGLBINDFRAGDATALOCATIONPROC glBindFragDataLocation_Impl;\n        PFNGLCLAMPCOLORPROC glClampColor_Impl;\n        PFNGLCLEARBUFFERFIPROC glClearBufferfi_Impl;\n        PFNGLCLEARBUFFERFVPROC glClearBufferfv_Impl;\n        PFNGLCLEARBUFFERIVPROC glClearBufferiv_Impl;\n        PFNGLCLEARBUFFERUIVPROC glClearBufferuiv_Impl;\n        PFNGLCOLORMASKIPROC glColorMaski_Impl;\n        PFNGLDISABLEIPROC glDisablei_Impl;\n        PFNGLENABLEIPROC glEnablei_Impl;\n        PFNGLENDCONDITIONALRENDERPROC glEndConditionalRender_Impl;\n        PFNGLENDTRANSFORMFEEDBACKPROC glEndTransformFeedback_Impl;\n        PFNGLBINDBUFFERRANGEPROC glBindBufferRange_Impl;\n        PFNGLBINDBUFFERBASEPROC glBindBufferBase_Impl;\n        PFNGLGETBOOLEANI_VPROC glGetBooleani_v_Impl;\n        PFNGLGETINTEGERI_VPROC glGetIntegeri_v_Impl;\n        PFNGLGETFRAGDATALOCATIONPROC glGetFragDataLocation_Impl;\n        PFNGLGETSTRINGIPROC glGetStringi_Impl;\n        PFNGLGETTEXPARAMETERIIVPROC glGetTexParameterIiv_Impl;\n        PFNGLGETTEXPARAMETERIUIVPROC glGetTexParameterIuiv_Impl;\n        PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glGetTransformFeedbackVarying_Impl;\n        PFNGLGETUNIFORMUIVPROC glGetUniformuiv_Impl;\n        PFNGLGETVERTEXATTRIBIIVPROC glGetVertexAttribIiv_Impl;\n        PFNGLGETVERTEXATTRIBIUIVPROC glGetVertexAttribIuiv_Impl;\n        PFNGLISENABLEDIPROC glIsEnabledi_Impl;\n        PFNGLTEXPARAMETERIIVPROC glTexParameterIiv_Impl;\n        PFNGLTEXPARAMETERIUIVPROC glTexParameterIuiv_Impl;\n        PFNGLTRANSFORMFEEDBACKVARYINGSPROC glTransformFeedbackVaryings_Impl;\n        PFNGLUNIFORM1UIPROC glUniform1ui_Impl;\n        PFNGLUNIFORM1UIVPROC glUniform1uiv_Impl;\n        PFNGLUNIFORM2UIPROC glUniform2ui_Impl;\n        PFNGLUNIFORM2UIVPROC glUniform2uiv_Impl;\n        PFNGLUNIFORM3UIPROC glUniform3ui_Impl;\n        PFNGLUNIFORM3UIVPROC glUniform3uiv_Impl;\n        PFNGLUNIFORM4UIPROC glUniform4ui_Impl;\n        PFNGLUNIFORM4UIVPROC glUniform4uiv_Impl;\n        PFNGLVERTEXATTRIBI1IPROC glVertexAttribI1i_Impl;\n        PFNGLVERTEXATTRIBI1IVPROC glVertexAttribI1iv_Impl;\n        PFNGLVERTEXATTRIBI1UIPROC glVertexAttribI1ui_Impl;\n        PFNGLVERTEXATTRIBI1UIVPROC glVertexAttribI1uiv_Impl;\n        PFNGLVERTEXATTRIBI2IPROC glVertexAttribI2i_Impl;\n        PFNGLVERTEXATTRIBI2IVPROC glVertexAttribI2iv_Impl;\n        PFNGLVERTEXATTRIBI2UIPROC glVertexAttribI2ui_Impl;\n        PFNGLVERTEXATTRIBI2UIVPROC glVertexAttribI2uiv_Impl;\n        PFNGLVERTEXATTRIBI3IPROC glVertexAttribI3i_Impl;\n        PFNGLVERTEXATTRIBI3IVPROC glVertexAttribI3iv_Impl;\n        PFNGLVERTEXATTRIBI3UIPROC glVertexAttribI3ui_Impl;\n        PFNGLVERTEXATTRIBI3UIVPROC glVertexAttribI3uiv_Impl;\n        PFNGLVERTEXATTRIBI4BVPROC glVertexAttribI4bv_Impl;\n        PFNGLVERTEXATTRIBI4IPROC glVertexAttribI4i_Impl;\n        PFNGLVERTEXATTRIBI4IVPROC glVertexAttribI4iv_Impl;\n        PFNGLVERTEXATTRIBI4SVPROC glVertexAttribI4sv_Impl;\n        PFNGLVERTEXATTRIBI4UBVPROC glVertexAttribI4ubv_Impl;\n        PFNGLVERTEXATTRIBI4UIPROC glVertexAttribI4ui_Impl;\n        PFNGLVERTEXATTRIBI4UIVPROC glVertexAttribI4uiv_Impl;\n        PFNGLVERTEXATTRIBI4USVPROC glVertexAttribI4usv_Impl;\n        PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer_Impl;\n\n        // GL_VERSION_3_1\n        PFNGLDRAWARRAYSINSTANCEDPROC glDrawArraysInstanced_Impl;\n        PFNGLDRAWELEMENTSINSTANCEDPROC glDrawElementsInstanced_Impl;\n        PFNGLPRIMITIVERESTARTINDEXPROC glPrimitiveRestartIndex_Impl;\n        PFNGLTEXBUFFERPROC glTexBuffer_Impl;\n\n        // GL_VERSION_3_2\n        PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture_Impl;\n        PFNGLGETBUFFERPARAMETERI64VPROC glGetBufferParameteri64v_Impl;\n        PFNGLGETINTEGER64I_VPROC glGetInteger64i_v_Impl;\n\n        // GL_VERSION_3_3\n        PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor_Impl;\n\n        // GL_VERSION_4_0\n        PFNGLBLENDEQUATIONSEPARATEIPROC glBlendEquationSeparatei_Impl;\n        PFNGLBLENDEQUATIONIPROC glBlendEquationi_Impl;\n        PFNGLBLENDFUNCSEPARATEIPROC glBlendFuncSeparatei_Impl;\n        PFNGLBLENDFUNCIPROC glBlendFunci_Impl;\n        PFNGLMINSAMPLESHADINGPROC glMinSampleShading_Impl;\n\n        // GL_AMD_debug_output\n        PFNGLDEBUGMESSAGECALLBACKAMDPROC glDebugMessageCallbackAMD_Impl;\n        PFNGLDEBUGMESSAGEENABLEAMDPROC glDebugMessageEnableAMD_Impl;\n        PFNGLDEBUGMESSAGEINSERTAMDPROC glDebugMessageInsertAMD_Impl;\n        PFNGLGETDEBUGMESSAGELOGAMDPROC glGetDebugMessageLogAMD_Impl;\n\n      #if defined(GLE_CGL_ENABLED)\n        // GL_APPLE_aux_depth_stencil\n        // (no functions)\n\n        // GL_APPLE_client_storage\n        // (no functions)\n\n        // GL_APPLE_element_array\n        PFNGLDRAWELEMENTARRAYAPPLEPROC glDrawElementArrayAPPLE_Impl;\n        PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC glDrawRangeElementArrayAPPLE_Impl;\n        PFNGLELEMENTPOINTERAPPLEPROC glElementPointerAPPLE_Impl;\n        PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC glMultiDrawElementArrayAPPLE_Impl;\n        PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC glMultiDrawRangeElementArrayAPPLE_Impl;\n\n        // GL_APPLE_fence\n        PFNGLDELETEFENCESAPPLEPROC glDeleteFencesAPPLE_Impl;\n        PFNGLFINISHFENCEAPPLEPROC glFinishFenceAPPLE_Impl;\n        PFNGLFINISHOBJECTAPPLEPROC glFinishObjectAPPLE_Impl;\n        PFNGLGENFENCESAPPLEPROC glGenFencesAPPLE_Impl;\n        PFNGLISFENCEAPPLEPROC glIsFenceAPPLE_Impl;\n        PFNGLSETFENCEAPPLEPROC glSetFenceAPPLE_Impl;\n        PFNGLTESTFENCEAPPLEPROC glTestFenceAPPLE_Impl;\n        PFNGLTESTOBJECTAPPLEPROC glTestObjectAPPLE_Impl;\n\n        // GL_APPLE_float_pixels\n        // (no functions)\n\n        // GL_APPLE_flush_buffer_range\n        PFNGLBUFFERPARAMETERIAPPLEPROC glBufferParameteriAPPLE_Impl;\n        PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glFlushMappedBufferRangeAPPLE_Impl;\n\n        // GL_APPLE_object_purgeable\n        PFNGLGETOBJECTPARAMETERIVAPPLEPROC glGetObjectParameterivAPPLE_Impl;\n        PFNGLOBJECTPURGEABLEAPPLEPROC glObjectPurgeableAPPLE_Impl;\n        PFNGLOBJECTUNPURGEABLEAPPLEPROC glObjectUnpurgeableAPPLE_Impl;\n\n        // GL_APPLE_pixel_buffer\n        // (no functions)\n\n        // GL_APPLE_rgb_422\n        // (no functions)\n\n        // GL_APPLE_row_bytes\n        // (no functions)\n\n        // GL_APPLE_specular_vector\n        // (no functions)\n\n        // GL_APPLE_texture_range\n        PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC glGetTexParameterPointervAPPLE_Impl;\n        PFNGLTEXTURERANGEAPPLEPROC glTextureRangeAPPLE_Impl;\n\n        // GL_APPLE_transform_hint\n        // (no functions)\n\n        // GL_APPLE_vertex_array_object\n        PFNGLBINDVERTEXARRAYAPPLEPROC glBindVertexArrayAPPLE_Impl;\n        PFNGLDELETEVERTEXARRAYSAPPLEPROC glDeleteVertexArraysAPPLE_Impl;\n        PFNGLGENVERTEXARRAYSAPPLEPROC glGenVertexArraysAPPLE_Impl;\n        PFNGLISVERTEXARRAYAPPLEPROC glIsVertexArrayAPPLE_Impl;\n\n        // GL_APPLE_vertex_array_range\n        PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC glFlushVertexArrayRangeAPPLE_Impl;\n        PFNGLVERTEXARRAYPARAMETERIAPPLEPROC glVertexArrayParameteriAPPLE_Impl;\n        PFNGLVERTEXARRAYRANGEAPPLEPROC glVertexArrayRangeAPPLE_Impl;\n\n        // GL_APPLE_vertex_program_evaluators\n        PFNGLDISABLEVERTEXATTRIBAPPLEPROC glDisableVertexAttribAPPLE_Impl;\n        PFNGLENABLEVERTEXATTRIBAPPLEPROC glEnableVertexAttribAPPLE_Impl;\n        PFNGLISVERTEXATTRIBENABLEDAPPLEPROC glIsVertexAttribEnabledAPPLE_Impl;\n        PFNGLMAPVERTEXATTRIB1DAPPLEPROC glMapVertexAttrib1dAPPLE_Impl;\n        PFNGLMAPVERTEXATTRIB1FAPPLEPROC glMapVertexAttrib1fAPPLE_Impl;\n        PFNGLMAPVERTEXATTRIB2DAPPLEPROC glMapVertexAttrib2dAPPLE_Impl;\n        PFNGLMAPVERTEXATTRIB2FAPPLEPROC glMapVertexAttrib2fAPPLE_Impl;\n      #endif // GLE_CGL_ENABLED\n      \n        // GL_ARB_debug_output\n        PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARB_Impl;\n        PFNGLDEBUGMESSAGECONTROLARBPROC glDebugMessageControlARB_Impl;\n        PFNGLDEBUGMESSAGEINSERTARBPROC glDebugMessageInsertARB_Impl;\n        PFNGLGETDEBUGMESSAGELOGARBPROC glGetDebugMessageLogARB_Impl;\n\n        // GL_ARB_ES2_compatibility\n        PFNGLCLEARDEPTHFPROC glClearDepthf_Impl;\n        PFNGLDEPTHRANGEFPROC glDepthRangef_Impl;\n        PFNGLGETSHADERPRECISIONFORMATPROC glGetShaderPrecisionFormat_Impl;\n        PFNGLRELEASESHADERCOMPILERPROC glReleaseShaderCompiler_Impl;\n        PFNGLSHADERBINARYPROC glShaderBinary_Impl;\n\n        // GL_ARB_framebuffer_object\n        PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer_Impl;\n        PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer_Impl;\n        PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer_Impl;\n        PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus_Impl;\n        PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers_Impl;\n        PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers_Impl;\n        PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer_Impl;\n        PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D_Impl;\n        PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D_Impl;\n        PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D_Impl;\n        PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer_Impl;\n        PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers_Impl;\n        PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers_Impl;\n        PFNGLGENERATEMIPMAPPROC glGenerateMipmap_Impl;\n        PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv_Impl;\n        PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv_Impl;\n        PFNGLISFRAMEBUFFERPROC glIsFramebuffer_Impl;\n        PFNGLISRENDERBUFFERPROC glIsRenderbuffer_Impl;\n        PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage_Impl;\n        PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample_Impl;\n    \n        // GL_ARB_framebuffer_sRGB\n        // (no functions)\n\n        // GL_ARB_texture_multisample\n        PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv_Impl;\n        PFNGLSAMPLEMASKIPROC glSampleMaski_Impl;\n        PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample_Impl;\n        PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample_Impl;\n\n        // GL_ARB_texture_non_power_of_two\n        // (no functions)\n\n        // GL_ARB_texture_rectangle\n        // (no functions)\n\n        // GL_ARB_timer_query\n        PFNGLGETQUERYOBJECTI64VPROC glGetQueryObjecti64v_Impl;\n        PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v_Impl;\n        PFNGLQUERYCOUNTERPROC glQueryCounter_Impl;\n\n        // GL_ARB_vertex_array_object\n        PFNGLBINDVERTEXARRAYPROC glBindVertexArray_Impl;\n        PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays_Impl;\n        PFNGLGENVERTEXARRAYSPROC glGenVertexArrays_Impl;\n        PFNGLISVERTEXARRAYPROC glIsVertexArray_Impl;\n\n        // GL_EXT_draw_buffers2\n        PFNGLCOLORMASKINDEXEDEXTPROC glColorMaskIndexedEXT_Impl;\n        PFNGLDISABLEINDEXEDEXTPROC glDisableIndexedEXT_Impl;\n        PFNGLENABLEINDEXEDEXTPROC glEnableIndexedEXT_Impl;\n        PFNGLGETBOOLEANINDEXEDVEXTPROC glGetBooleanIndexedvEXT_Impl;\n        PFNGLGETINTEGERINDEXEDVEXTPROC glGetIntegerIndexedvEXT_Impl;\n        PFNGLISENABLEDINDEXEDEXTPROC glIsEnabledIndexedEXT_Impl;\n\n        // GL_EXT_texture_filter_anisotropic\n        // (no functions)\n\n        // GL_KHR_debug\n        PFNGLDEBUGMESSAGECALLBACKPROC glDebugMessageCallback_Impl;\n        PFNGLDEBUGMESSAGECONTROLPROC glDebugMessageControl_Impl;\n        PFNGLDEBUGMESSAGEINSERTPROC glDebugMessageInsert_Impl;\n        PFNGLGETDEBUGMESSAGELOGPROC glGetDebugMessageLog_Impl;\n        PFNGLGETOBJECTLABELPROC glGetObjectLabel_Impl;\n        PFNGLGETOBJECTPTRLABELPROC glGetObjectPtrLabel_Impl;\n        PFNGLOBJECTLABELPROC glObjectLabel_Impl;\n        PFNGLOBJECTPTRLABELPROC glObjectPtrLabel_Impl;\n        PFNGLPOPDEBUGGROUPPROC glPopDebugGroup_Impl;\n        PFNGLPUSHDEBUGGROUPPROC glPushDebugGroup_Impl;\n\n        // GL_KHR_robust_buffer_access_behavior\n        \n        // GL_WIN_swap_hint\n        PFNGLADDSWAPHINTRECTWINPROC glAddSwapHintRectWIN_Impl;\n\n      #if defined(GLE_WGL_ENABLED)\n        // WGL\n        // We don't declare pointers for these because we statically link to the implementations, same as with the OpenGL 1.1 functions.\n        // BOOL  wglCopyContext_Hook(HGLRC, HGLRC, UINT);\n        // HGLRC wglCreateContext_Hook(HDC);\n        // HGLRC wglCreateLayerContext_Hook(HDC, int);\n        // BOOL  wglDeleteContext_Hook(HGLRC);\n        // HGLRC wglGetCurrentContext_Hook(VOID);\n        // HDC   wglGetCurrentDC_Hook(VOID);\n        // PROC  wglGetProcAddress_Hook(LPCSTR);\n        // BOOL  wglMakeCurrent_Hook(HDC, HGLRC);\n        // BOOL  wglShareLists_Hook(HGLRC, HGLRC);\n        // BOOL  wglUseFontBitmapsA_Hook(HDC, DWORD, DWORD, DWORD);\n        // BOOL  wglUseFontBitmapsW_Hook(HDC, DWORD, DWORD, DWORD);\n        // BOOL  wglUseFontOutlinesA_Hook(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT, int, LPGLYPHMETRICSFLOAT);\n        // BOOL  wglUseFontOutlinesW_Hook(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT, int, LPGLYPHMETRICSFLOAT);\n        // BOOL  wglDescribeLayerPlane_Hook(HDC, int, int, UINT, LPLAYERPLANEDESCRIPTOR);\n        // int   wglSetLayerPaletteEntries_Hook(HDC, int, int, int, CONST COLORREF *);\n        // int   wglGetLayerPaletteEntries_Hook(HDC, int, int, int, COLORREF *);\n        // BOOL  wglRealizeLayerPalette_Hook(HDC, int, BOOL);\n        // BOOL  wglSwapLayerBuffers_Hook(HDC, UINT);\n        // DWORD wglSwapMultipleBuffers_Hook(UINT, CONST WGLSWAP *);\n\n        #if 0\n        PFNWGLCOPYCONTEXTPROC            wglCopyContext_Impl;\n        PFNWGLCREATECONTEXTPROC          wglCreateContext_Impl;\n        PFNWGLCREATELAYERCONTEXTPROC     wglCreateLayerContext_Impl;\n        PFNWGLDELETECONTEXTPROC          wglDeleteContext_Impl;\n        PFNWGLGETCURRENTCONTEXTPROC      wglGetCurrentContext_Impl;\n        PFNWGLGETCURRENTDCPROC           wglGetCurrentDC_Impl;\n        PFNWGLGETPROCADDRESSPROC         wglGetProcAddress_Impl;\n        PFNWGLMAKECURRENTPROC            wglMakeCurrent_Impl;\n        PFNWGLSHARELISTSPROC             wglShareLists_Impl;\n        PFNWGLUSEFONTBITMAPSAPROC        wglUseFontBitmapsA_Impl;\n        PFNWGLUSEFONTBITMAPSWPROC        wglUseFontBitmapsW_Impl;\n        PFNWGLUSEFONTOUTLINESAPROC       wglUseFontOutlinesA_Impl;\n        PFNWGLUSEFONTOUTLINESWPROC       wglUseFontOutlinesW_Impl;\n        PFNWGLDESCRIBELAYERPLANEPROC     wglDescribeLayerPlane_Impl;\n        PFNWGLSETLAYERPALETTEENTRIESPROC wglSetLayerPaletteEntries_Impl;\n        PFNWGLGETLAYERPALETTEENTRIESPROC wglGetLayerPaletteEntries_Impl;\n        PFNWGLREALIZELAYERPALETTEPROC    wglRealizeLayerPalette_Impl;\n        PFNWGLSWAPLAYERBUFFERSPROC       wglSwapLayerBuffers_Impl;\n        PFNWGLSWAPMULTIPLEBUFFERSPROC    wglSwapMultipleBuffers_Impl;\n        #endif\n\n        // WGL_ARB_buffer_region\n        PFNWGLCREATEBUFFERREGIONARBPROC  wglCreateBufferRegionARB_Impl;\n        PFNWGLDELETEBUFFERREGIONARBPROC  wglDeleteBufferRegionARB_Impl;\n        PFNWGLSAVEBUFFERREGIONARBPROC    wglSaveBufferRegionARB_Impl;\n        PFNWGLRESTOREBUFFERREGIONARBPROC wglRestoreBufferRegionARB_Impl;\n\n        // WGL_ARB_extensions_string\n        PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB_Impl;\n\n        // WGL_ARB_pixel_format\n        PFNWGLGETPIXELFORMATATTRIBIVARBPROC wglGetPixelFormatAttribivARB_Impl;\n        PFNWGLGETPIXELFORMATATTRIBFVARBPROC wglGetPixelFormatAttribfvARB_Impl;\n        PFNWGLCHOOSEPIXELFORMATARBPROC      wglChoosePixelFormatARB_Impl;\n\n        // WGL_ARB_make_current_read\n        PFNWGLMAKECONTEXTCURRENTARBPROC wglMakeContextCurrentARB_Impl;\n        PFNWGLGETCURRENTREADDCARBPROC   wglGetCurrentReadDCARB_Impl;\n\n        // WGL_ARB_pbuffer\n        PFNWGLCREATEPBUFFERARBPROC    wglCreatePbufferARB_Impl;\n        PFNWGLGETPBUFFERDCARBPROC     wglGetPbufferDCARB_Impl;\n        PFNWGLRELEASEPBUFFERDCARBPROC wglReleasePbufferDCARB_Impl;\n        PFNWGLDESTROYPBUFFERARBPROC   wglDestroyPbufferARB_Impl;\n        PFNWGLQUERYPBUFFERARBPROC     wglQueryPbufferARB_Impl;\n\n        // WGL_ARB_render_texture\n        PFNWGLBINDTEXIMAGEARBPROC     wglBindTexImageARB_Impl;\n        PFNWGLRELEASETEXIMAGEARBPROC  wglReleaseTexImageARB_Impl;\n        PFNWGLSETPBUFFERATTRIBARBPROC wglSetPbufferAttribARB_Impl;\n\n        // WGL_ARB_pixel_format_float\n        // (no functions)\n        \n        // WGL_ARB_framebuffer_sRGB\n        // (no functions)\n\n        // WGL_NV_present_video\n        PFNWGLENUMERATEVIDEODEVICESNVPROC wglEnumerateVideoDevicesNV_Impl;\n        PFNWGLBINDVIDEODEVICENVPROC       wglBindVideoDeviceNV_Impl;\n        PFNWGLQUERYCURRENTCONTEXTNVPROC   wglQueryCurrentContextNV_Impl;\n\n        // WGL_ARB_create_context\n        PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB_Impl;\n\n        // WGL_ARB_create_context_profile\n        // (no functions)\n\n        // WGL_ARB_create_context_robustness\n        // (no functions)\n\n        // WGL_EXT_extensions_string\n        PFNWGLGETEXTENSIONSSTRINGEXTPROC wglGetExtensionsStringEXT_Impl;\n\n        // WGL_EXT_swap_control\n        PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT_Impl;\n        PFNWGLSWAPINTERVALEXTPROC    wglSwapIntervalEXT_Impl;\n\n        // WGL_OML_sync_control\n        PFNWGLGETSYNCVALUESOMLPROC       wglGetSyncValuesOML_Impl;\n        PFNWGLGETMSCRATEOMLPROC          wglGetMscRateOML_Impl;\n        PFNWGLSWAPBUFFERSMSCOMLPROC      wglSwapBuffersMscOML_Impl;\n        PFNWGLSWAPLAYERBUFFERSMSCOMLPROC wglSwapLayerBuffersMscOML_Impl;\n        PFNWGLWAITFORMSCOMLPROC          wglWaitForMscOML_Impl;\n        PFNWGLWAITFORSBCOMLPROC          wglWaitForSbcOML_Impl;\n\n        // WGL_NV_video_output\n        PFNWGLGETVIDEODEVICENVPROC     wglGetVideoDeviceNV_Impl;\n        PFNWGLRELEASEVIDEODEVICENVPROC wglReleaseVideoDeviceNV_Impl;\n        PFNWGLBINDVIDEOIMAGENVPROC     wglBindVideoImageNV_Impl;\n        PFNWGLRELEASEVIDEOIMAGENVPROC  wglReleaseVideoImageNV_Impl;\n        PFNWGLSENDPBUFFERTOVIDEONVPROC wglSendPbufferToVideoNV_Impl;\n        PFNWGLGETVIDEOINFONVPROC       wglGetVideoInfoNV_Impl;\n\n        // WGL_NV_swap_group\n        PFNWGLJOINSWAPGROUPNVPROC      wglJoinSwapGroupNV_Impl;\n        PFNWGLBINDSWAPBARRIERNVPROC    wglBindSwapBarrierNV_Impl;\n        PFNWGLQUERYSWAPGROUPNVPROC     wglQuerySwapGroupNV_Impl;\n        PFNWGLQUERYMAXSWAPGROUPSNVPROC wglQueryMaxSwapGroupsNV_Impl;\n        PFNWGLQUERYFRAMECOUNTNVPROC    wglQueryFrameCountNV_Impl;\n        PFNWGLRESETFRAMECOUNTNVPROC    wglResetFrameCountNV_Impl;\n\n        // WGL_NV_video_capture\n        PFNWGLBINDVIDEOCAPTUREDEVICENVPROC       wglBindVideoCaptureDeviceNV_Impl;\n        PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC wglEnumerateVideoCaptureDevicesNV_Impl;\n        PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC       wglLockVideoCaptureDeviceNV_Impl;\n        PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC      wglQueryVideoCaptureDeviceNV_Impl;\n        PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC    wglReleaseVideoCaptureDeviceNV_Impl;\n\n        // WGL_NV_copy_image\n        PFNWGLCOPYIMAGESUBDATANVPROC wglCopyImageSubDataNV_Impl;\n    \n        // WGL_NV_DX_interop\n        PFNWGLDXCLOSEDEVICENVPROC            wglDXCloseDeviceNV_Impl;\n        PFNWGLDXLOCKOBJECTSNVPROC            wglDXLockObjectsNV_Impl;\n        PFNWGLDXOBJECTACCESSNVPROC           wglDXObjectAccessNV_Impl;\n        PFNWGLDXOPENDEVICENVPROC             wglDXOpenDeviceNV_Impl;\n        PFNWGLDXREGISTEROBJECTNVPROC         wglDXRegisterObjectNV_Impl;\n        PFNWGLDXSETRESOURCESHAREHANDLENVPROC wglDXSetResourceShareHandleNV_Impl;\n        PFNWGLDXUNLOCKOBJECTSNVPROC          wglDXUnlockObjectsNV_Impl;\n        PFNWGLDXUNREGISTEROBJECTNVPROC       wglDXUnregisterObjectNV_Impl;\n\n      #endif // GLE_WGL_ENABLED\n      \n      #if defined(GLE_GLX_ENABLED)\n        // GLX_VERSION_1_1\n        // We don't create any pointers, because we assume these functions are always present.\n        \n        // GLX_VERSION_1_2\n        PFNGLXGETCURRENTDISPLAYPROC      glXGetCurrentDisplay_Impl;\n\n        // GLX_VERSION_1_3\n        PFNGLXCHOOSEFBCONFIGPROC         glXChooseFBConfig_Impl;\n        PFNGLXCREATENEWCONTEXTPROC       glXCreateNewContext_Impl;\n        PFNGLXCREATEPBUFFERPROC          glXCreatePbuffer_Impl;\n        PFNGLXCREATEPIXMAPPROC           glXCreatePixmap_Impl;\n        PFNGLXCREATEWINDOWPROC           glXCreateWindow_Impl;\n        PFNGLXDESTROYPBUFFERPROC         glXDestroyPbuffer_Impl;\n        PFNGLXDESTROYPIXMAPPROC          glXDestroyPixmap_Impl;\n        PFNGLXDESTROYWINDOWPROC          glXDestroyWindow_Impl;\n        PFNGLXGETCURRENTREADDRAWABLEPROC glXGetCurrentReadDrawable_Impl;\n        PFNGLXGETFBCONFIGATTRIBPROC      glXGetFBConfigAttrib_Impl;\n        PFNGLXGETFBCONFIGSPROC           glXGetFBConfigs_Impl;\n        PFNGLXGETSELECTEDEVENTPROC       glXGetSelectedEvent_Impl;\n        PFNGLXGETVISUALFROMFBCONFIGPROC  glXGetVisualFromFBConfig_Impl;\n        PFNGLXMAKECONTEXTCURRENTPROC     glXMakeContextCurrent_Impl;\n        PFNGLXQUERYCONTEXTPROC           glXQueryContext_Impl;\n        PFNGLXQUERYDRAWABLEPROC          glXQueryDrawable_Impl;\n        PFNGLXSELECTEVENTPROC            glXSelectEvent_Impl;\n\n        // GLX_VERSION_1_4\n        // Nothing to declare\n        \n        // GLX_ARB_create_context\n        PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB_Impl;\n\n        // GLX_EXT_swap_control\n        PFNGLXSWAPINTERVALEXTPROC glXSwapIntervalEXT_Impl;\n\n        // GLX_OML_sync_control\n        PFNGLXGETMSCRATEOMLPROC     glXGetMscRateOML_Impl;\n        PFNGLXGETSYNCVALUESOMLPROC  glXGetSyncValuesOML_Impl;\n        PFNGLXSWAPBUFFERSMSCOMLPROC glXSwapBuffersMscOML_Impl;\n        PFNGLXWAITFORMSCOMLPROC     glXWaitForMscOML_Impl;\n        PFNGLXWAITFORSBCOMLPROC     glXWaitForSbcOML_Impl;\n\n        // GLX_MESA_swap_control\n        PFNGLXGETSWAPINTERVALMESAPROC glXGetSwapIntervalMESA_Impl;\n        PFNGLXSWAPINTERVALMESAPROC    glXSwapIntervalMESA_Impl;\n\n      #endif // GLE_GLX_ENABLED\n\n        \n        // Boolean extension support indicators. Each of these identifies the\n        // presence or absence of the given extension. A better solution here\n        // might be to use an STL map<const char*, bool>.\n        bool gle_AMD_debug_output;\n      //bool gle_AMD_performance_monitor;\n        bool gle_APPLE_aux_depth_stencil;\n        bool gle_APPLE_client_storage;\n        bool gle_APPLE_element_array;\n        bool gle_APPLE_fence;\n        bool gle_APPLE_float_pixels;\n        bool gle_APPLE_flush_buffer_range;\n        bool gle_APPLE_object_purgeable;\n        bool gle_APPLE_pixel_buffer;\n        bool gle_APPLE_rgb_422;\n        bool gle_APPLE_row_bytes;\n        bool gle_APPLE_specular_vector;\n        bool gle_APPLE_texture_range;\n        bool gle_APPLE_transform_hint;\n        bool gle_APPLE_vertex_array_object;\n        bool gle_APPLE_vertex_array_range;\n        bool gle_APPLE_vertex_program_evaluators;\n        bool gle_APPLE_ycbcr_422;\n        bool gle_ARB_debug_output;\n        bool gle_ARB_depth_buffer_float;\n      //bool gle_ARB_direct_state_access;\n        bool gle_ARB_ES2_compatibility;\n        bool gle_ARB_framebuffer_object;\n        bool gle_ARB_framebuffer_sRGB;\n        bool gle_ARB_texture_multisample;\n        bool gle_ARB_texture_non_power_of_two;\n        bool gle_ARB_texture_rectangle;\n        bool gle_ARB_timer_query;\n        bool gle_ARB_vertex_array_object;\n      //bool gle_ARB_vertex_attrib_binding;\n        bool gle_EXT_draw_buffers2;\n        bool gle_EXT_texture_compression_s3tc;\n        bool gle_EXT_texture_filter_anisotropic;\n      //bool gle_KHR_context_flush_control;\n        bool gle_KHR_debug;\n      //bool gle_KHR_robust_buffer_access_behavior;\n      //bool gle_KHR_robustness;\n        bool gle_WIN_swap_hint;\n        \n      #if defined(GLE_WGL_ENABLED)\n        bool gle_WGL_ARB_buffer_region;\n        bool gle_WGL_ARB_create_context;\n        bool gle_WGL_ARB_create_context_profile;\n        bool gle_WGL_ARB_create_context_robustness;\n        bool gle_WGL_ARB_extensions_string;\n        bool gle_WGL_ARB_framebuffer_sRGB;\n        bool gle_WGL_ARB_make_current_read;\n        bool gle_WGL_ARB_pbuffer;\n        bool gle_WGL_ARB_pixel_format;\n        bool gle_WGL_ARB_pixel_format_float;\n        bool gle_WGL_ARB_render_texture;\n        bool gle_WGL_ATI_render_texture_rectangle;\n        bool gle_WGL_EXT_extensions_string;\n        bool gle_WGL_EXT_swap_control;\n        bool gle_WGL_NV_copy_image;\n        bool gle_WGL_NV_DX_interop;\n        bool gle_WGL_NV_DX_interop2;\n        bool gle_WGL_NV_present_video;\n        bool gle_WGL_NV_render_texture_rectangle;\n        bool gle_WGL_NV_swap_group;\n        bool gle_WGL_NV_video_capture;\n        bool gle_WGL_NV_video_output;\n        bool gle_WGL_OML_sync_control;\n      #elif defined(GLE_GLX_ENABLED)\n        bool gle_GLX_ARB_create_context;\n        bool gle_GLX_ARB_create_context_profile;\n\t\tbool gle_GLX_ARB_create_context_robustness;\n        bool gle_GLX_EXT_swap_control;\n        bool gle_GLX_OML_sync_control;\n        bool gle_MESA_swap_control;\n      #endif\n        \n    }; // class GLEContext\n\n\n} // namespace OVR\n\n\n#endif // Header include guard\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/GL/CAPI_GLE_GL.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_GLE_GL.h\nContent     :   GL extensions declarations.\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n\n#ifndef INC_OVR_CAPI_GLE_GL_h\n#define INC_OVR_CAPI_GLE_GL_h\n\n\n#include <stddef.h>\n\n\n// Windows headers\n//     <wingdi.h>            Windows-specific OpenGL 1.1 interfaces. Long ago this was <GL/wgl.h>.\n//     <GL/gl.h>             OpenGL 1.1 interface.\n//     <GL/glext.h>          OpenGL 1.2+ compatibility profile and extension interfaces. Not provided by Microsoft.\n//     <GL/wglext.h>         Windows-specific extension interfaces. Not provided by Microsoft.\n//     <GL/glcorearb.h>      OpenGL core profile and ARB extension interfaces. Doesn't include interfaces found only in the compatibility profile. Overlaps with gl.h and glext.h.\n//\n// Mac headers\n//     <OpenGL/gl.h>         OpenGL 1.1 interface.\n//     <OpenGL/glext.h>      OpenGL 1.2+ compatibility profile and extension interfaces.\n//     <OpenGL/gl3.h>        Includes only interfaces supported in a core OpenGL 3.1 implementations plus a few related extensions.\n//     <OpenGL/gl3ext.h>     Includes extensions supported in a core OpenGL 3.1 implementation.\n//     <OpenGL/OpenGL.h>     Apple-specific OpenGL interfaces.\n//     <OpenGL/NSOpenGL.h>   Apple-specific OpenGL interfaces.\n//\n// Linux headers\n//     <GL/gl.h>             OpenGL 1.1 interface.\n//     <GL/glext.h>          OpenGL 1.2+ compatibility profile and extension interfaces.\n//     <GL/glx.h>            X Windows-specific OpenGL interfaces.\n//     <GL/glxext.h>         X Windows 1.3+ API and GLX extension interfaces.\n//     <GL/glcorearb.h>      OpenGL core profile and ARB extension interfaces. Doesn't include interfaces found only in the compatibility profile. Overlaps with gl.h and glext.h.\n\n#if defined(__gl_h_) || defined(__GL_H__) || defined(__X_GL_H)\n    #error gl.h should be included after this, not before.\n#endif\n#if defined(__gl2_h_)\n    #error gl2.h should be included after this, not before.\n#endif\n#if defined(__gltypes_h_)\n    #error gltypes.h should be included after this, not before.\n#endif\n#if defined(__glext_h_) || defined(__GLEXT_H_)\n    #error glext.h should be included after this, not before.\n#endif\n\n// Prevent other GL versions from being included in the future.\n// We do not disable Microsoft's wingdi.h and redeclare its functions. That's a big header that includes many other things.\n// We do not currently disable Apple's OpenGL/OpenGL.h, though we could if we replicated its declarations in this header file.\n#define __gl_h_             // Disable future #includes of Apple's <OpenGL/gl.h>\n#define __GL_H__            // Disable future #includes of Microsoft's <GL/gl.h>\n#define __X_GL_H            // etc.\n#define __gl2_h_\n#define __gltypes_h_\n#define __glext_h_\n#define __GLEXT_H_\n\n\n// GLE platform identification\n#if defined(_WIN32)\n    #define GLE_WGL_ENABLED 1     // WGL interface\n#elif defined(__ANDROID__)\n    #define GLE_EGL_ENABLED 1     // EGL interface\n#elif defined(__IPHONE__)\n    #define GLE_EAGL_ENABLED 1    // EAGL interface\n#elif defined(__APPLE__)\n    #define GLE_CGL_ENABLED 1     // CGL interface\n#else\n    #define GLE_GLX_ENABLED 1     // GLX interface\n#endif\n\n\n// GLAPI / GLAPIENTRY\n//\n// GLAPI is a wrapper for Microsoft __declspec(dllimport).\n// GLAPIENTRY is the calling convention (__stdcall under Microsoft).\n//\n#if defined(GLE_WGL_ENABLED)\n    #if !defined(WINAPI)\n        #ifndef WIN32_LEAN_AND_MEAN\n            #define WIN32_LEAN_AND_MEAN 1\n        #endif\n        #include <windows.h>\n        #undef WIN32_LEAN_AND_MEAN\n    #endif\n\n    #ifndef WINGDIAPI // Normally defined via windows.h\n        #define WINGDIAPI __declspec(dllimport)\n        #define GLE_WINGDIAPI_DEFINED   // We define this so that we can know to undefine WINGDIAPI at the end of this file.\n    #endif\n\n    #if !defined(GLAPI)\n        #if defined(__MINGW32__) || defined(__CYGWIN__)\n            #define GLAPI extern\n        #else\n            #define GLAPI WINGDIAPI\n        #endif\n    #endif\n    #if !defined(GLAPIENTRY)\n        #define GLAPIENTRY __stdcall\n    #endif\n#else\n    #include <stdint.h>\n\n    #define GLAPI      extern\n    #define GLAPIENTRY /* empty */\n#endif\n\n\n// GLE_CLASS_EXPORT \n// Possibly maps to Microsoft __declspec(dllexport) or nothing on other platforms.\n#define GLE_CLASS_EXPORT // Currently defined to nothing. Could be defined to a dll export type.\n\n\n\n// GLE_HOOKING_ENABLED\n// When enabled, we intercept all OpenGL calls and do any useful internal processing before or after the call.\n// An example use case for this is to intercept OpenGL errors on platforms that don't support the OpenGL \n// debug functionality (e.g. KHR_Debug).\n#if !defined(GLE_WGL_ENABLED) && !defined(GLE_GLX_ENABLED) && defined(OVR_BUILD_DEBUG) // Windows and Unix don't need it because they have OpenGL debug extension support (e.g. KHR_Debug).\n    #define GLE_HOOKING_ENABLED 1\n#endif\n\n// When using hooking, we map all OpenGL function usage to our member functions that end with _Hook. \n// These member hook functions will internally call the actual OpenGL functions after doing some internal processing.\n#if defined(GLE_HOOKING_ENABLED)\n    #define GLEGetCurrentFunction(x) GLEContext::GetCurrentContext()->x##_Hook\n    #define GLEGetCurrentVariable(x) GLEContext::GetCurrentContext()->x\n#else\n    #define GLEGetCurrentFunction(x) GLEContext::GetCurrentContext()->x##_Impl\n    #define GLEGetCurrentVariable(x) GLEContext::GetCurrentContext()->x\n#endif\n\n// GLE_CURRENT_FUNCTION\n// Used by hooking in debug builds.\n#if defined(OVR_BUILD_DEBUG)\n    #define GLE_CURRENT_FUNCTION __FUNCTION__\n#else\n    #define GLE_CURRENT_FUNCTION NULL\n#endif\n\n\n// GLE_WHOLE_VERSION\n// Returns the major+minor version of the current GLEContext.\n// Example usage:\n//     if(GLE_WHOLE_VERSION() >= 302) // If OpenGL 3.2 or later...\n//         ...\n#define GLE_WHOLE_VERSION() GLEContext::GetCurrentContext()->WholeVersion()\n\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n// OpenGL 1.1 declarations are present in all versions of gl.h, including Microsoft's.\n// You don't need to dynamically link to these functions on any platform and can just assume\n// they are present. A number of these functions have been deprecated by OpenGL v3+, and\n// if an OpenGL v3+ core profile is enabled then usage of the deprecated functions is an error.\n\n#ifndef GL_VERSION_1_1\n    #define GL_VERSION_1_1 1\n\n    typedef unsigned int GLenum;\n    typedef unsigned int GLbitfield;\n    typedef unsigned int GLuint;\n    typedef int GLint;\n    typedef int GLsizei;\n    typedef unsigned char GLboolean;\n    typedef signed char GLbyte;\n    typedef short GLshort;\n    typedef unsigned char GLubyte;\n    typedef unsigned short GLushort;\n    typedef unsigned long GLulong;\n    typedef float GLfloat;\n    typedef float GLclampf;\n    typedef double GLdouble;\n    typedef double GLclampd;\n    typedef void GLvoid;\n    typedef int64_t GLint64EXT;\n    typedef uint64_t GLuint64EXT;\n    typedef GLint64EXT  GLint64;\n    typedef GLuint64EXT GLuint64;\n    typedef struct __GLsync *GLsync;\n    typedef char GLchar;\n\n    #define GL_ZERO 0\n    #define GL_FALSE 0\n    #define GL_LOGIC_OP 0x0BF1\n    #define GL_NONE 0\n    #define GL_TEXTURE_COMPONENTS 0x1003\n    #define GL_NO_ERROR 0\n    #define GL_POINTS 0x0000\n    #define GL_CURRENT_BIT 0x00000001\n    #define GL_TRUE 1\n    #define GL_ONE 1\n    #define GL_CLIENT_PIXEL_STORE_BIT 0x00000001\n    #define GL_LINES 0x0001\n    #define GL_LINE_LOOP 0x0002\n    #define GL_POINT_BIT 0x00000002\n    #define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002\n    #define GL_LINE_STRIP 0x0003\n    #define GL_LINE_BIT 0x00000004\n    #define GL_TRIANGLES 0x0004\n    #define GL_TRIANGLE_STRIP 0x0005\n    #define GL_TRIANGLE_FAN 0x0006\n    #define GL_QUADS 0x0007\n    #define GL_QUAD_STRIP 0x0008\n    #define GL_POLYGON_BIT 0x00000008\n    #define GL_POLYGON 0x0009\n    #define GL_POLYGON_STIPPLE_BIT 0x00000010\n    #define GL_PIXEL_MODE_BIT 0x00000020\n    #define GL_LIGHTING_BIT 0x00000040\n    #define GL_FOG_BIT 0x00000080\n    #define GL_DEPTH_BUFFER_BIT 0x00000100\n    #define GL_ACCUM 0x0100\n    #define GL_LOAD 0x0101\n    #define GL_RETURN 0x0102\n    #define GL_MULT 0x0103\n    #define GL_ADD 0x0104\n    #define GL_NEVER 0x0200\n    #define GL_ACCUM_BUFFER_BIT 0x00000200\n    #define GL_LESS 0x0201\n    #define GL_EQUAL 0x0202\n    #define GL_LEQUAL 0x0203\n    #define GL_GREATER 0x0204\n    #define GL_NOTEQUAL 0x0205\n    #define GL_GEQUAL 0x0206\n    #define GL_ALWAYS 0x0207\n    #define GL_SRC_COLOR 0x0300\n    #define GL_ONE_MINUS_SRC_COLOR 0x0301\n    #define GL_SRC_ALPHA 0x0302\n    #define GL_ONE_MINUS_SRC_ALPHA 0x0303\n    #define GL_DST_ALPHA 0x0304\n    #define GL_ONE_MINUS_DST_ALPHA 0x0305\n    #define GL_DST_COLOR 0x0306\n    #define GL_ONE_MINUS_DST_COLOR 0x0307\n    #define GL_SRC_ALPHA_SATURATE 0x0308\n    #define GL_STENCIL_BUFFER_BIT 0x00000400\n    #define GL_FRONT_LEFT 0x0400\n    #define GL_FRONT_RIGHT 0x0401\n    #define GL_BACK_LEFT 0x0402\n    #define GL_BACK_RIGHT 0x0403\n    #define GL_FRONT 0x0404\n    #define GL_BACK 0x0405\n    #define GL_LEFT 0x0406\n    #define GL_RIGHT 0x0407\n    #define GL_FRONT_AND_BACK 0x0408\n    #define GL_AUX0 0x0409\n    #define GL_AUX1 0x040A\n    #define GL_AUX2 0x040B\n    #define GL_AUX3 0x040C\n    #define GL_INVALID_ENUM 0x0500\n    #define GL_INVALID_VALUE 0x0501\n    #define GL_INVALID_OPERATION 0x0502\n    #define GL_STACK_OVERFLOW 0x0503\n    #define GL_STACK_UNDERFLOW 0x0504\n    #define GL_OUT_OF_MEMORY 0x0505\n    #define GL_2D 0x0600\n    #define GL_3D 0x0601\n    #define GL_3D_COLOR 0x0602\n    #define GL_3D_COLOR_TEXTURE 0x0603\n    #define GL_4D_COLOR_TEXTURE 0x0604\n    #define GL_PASS_THROUGH_TOKEN 0x0700\n    #define GL_POINT_TOKEN 0x0701\n    #define GL_LINE_TOKEN 0x0702\n    #define GL_POLYGON_TOKEN 0x0703\n    #define GL_BITMAP_TOKEN 0x0704\n    #define GL_DRAW_PIXEL_TOKEN 0x0705\n    #define GL_COPY_PIXEL_TOKEN 0x0706\n    #define GL_LINE_RESET_TOKEN 0x0707\n    #define GL_EXP 0x0800\n    #define GL_VIEWPORT_BIT 0x00000800\n    #define GL_EXP2 0x0801\n    #define GL_CW 0x0900\n    #define GL_CCW 0x0901\n    #define GL_COEFF 0x0A00\n    #define GL_ORDER 0x0A01\n    #define GL_DOMAIN 0x0A02\n    #define GL_CURRENT_COLOR 0x0B00\n    #define GL_CURRENT_INDEX 0x0B01\n    #define GL_CURRENT_NORMAL 0x0B02\n    #define GL_CURRENT_TEXTURE_COORDS 0x0B03\n    #define GL_CURRENT_RASTER_COLOR 0x0B04\n    #define GL_CURRENT_RASTER_INDEX 0x0B05\n    #define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06\n    #define GL_CURRENT_RASTER_POSITION 0x0B07\n    #define GL_CURRENT_RASTER_POSITION_VALID 0x0B08\n    #define GL_CURRENT_RASTER_DISTANCE 0x0B09\n    #define GL_POINT_SMOOTH 0x0B10\n    #define GL_POINT_SIZE 0x0B11\n    #define GL_POINT_SIZE_RANGE 0x0B12\n    #define GL_POINT_SIZE_GRANULARITY 0x0B13\n    #define GL_LINE_SMOOTH 0x0B20\n    #define GL_LINE_WIDTH 0x0B21\n    #define GL_LINE_WIDTH_RANGE 0x0B22\n    #define GL_LINE_WIDTH_GRANULARITY 0x0B23\n    #define GL_LINE_STIPPLE 0x0B24\n    #define GL_LINE_STIPPLE_PATTERN 0x0B25\n    #define GL_LINE_STIPPLE_REPEAT 0x0B26\n    #define GL_LIST_MODE 0x0B30\n    #define GL_MAX_LIST_NESTING 0x0B31\n    #define GL_LIST_BASE 0x0B32\n    #define GL_LIST_INDEX 0x0B33\n    #define GL_POLYGON_MODE 0x0B40\n    #define GL_POLYGON_SMOOTH 0x0B41\n    #define GL_POLYGON_STIPPLE 0x0B42\n    #define GL_EDGE_FLAG 0x0B43\n    #define GL_CULL_FACE 0x0B44\n    #define GL_CULL_FACE_MODE 0x0B45\n    #define GL_FRONT_FACE 0x0B46\n    #define GL_LIGHTING 0x0B50\n    #define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51\n    #define GL_LIGHT_MODEL_TWO_SIDE 0x0B52\n    #define GL_LIGHT_MODEL_AMBIENT 0x0B53\n    #define GL_SHADE_MODEL 0x0B54\n    #define GL_COLOR_MATERIAL_FACE 0x0B55\n    #define GL_COLOR_MATERIAL_PARAMETER 0x0B56\n    #define GL_COLOR_MATERIAL 0x0B57\n    #define GL_FOG 0x0B60\n    #define GL_FOG_INDEX 0x0B61\n    #define GL_FOG_DENSITY 0x0B62\n    #define GL_FOG_START 0x0B63\n    #define GL_FOG_END 0x0B64\n    #define GL_FOG_MODE 0x0B65\n    #define GL_FOG_COLOR 0x0B66\n    #define GL_DEPTH_RANGE 0x0B70\n    #define GL_DEPTH_TEST 0x0B71\n    #define GL_DEPTH_WRITEMASK 0x0B72\n    #define GL_DEPTH_CLEAR_VALUE 0x0B73\n    #define GL_DEPTH_FUNC 0x0B74\n    #define GL_ACCUM_CLEAR_VALUE 0x0B80\n    #define GL_STENCIL_TEST 0x0B90\n    #define GL_STENCIL_CLEAR_VALUE 0x0B91\n    #define GL_STENCIL_FUNC 0x0B92\n    #define GL_STENCIL_VALUE_MASK 0x0B93\n    #define GL_STENCIL_FAIL 0x0B94\n    #define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95\n    #define GL_STENCIL_PASS_DEPTH_PASS 0x0B96\n    #define GL_STENCIL_REF 0x0B97\n    #define GL_STENCIL_WRITEMASK 0x0B98\n    #define GL_MATRIX_MODE 0x0BA0\n    #define GL_NORMALIZE 0x0BA1\n    #define GL_VIEWPORT 0x0BA2\n    #define GL_MODELVIEW_STACK_DEPTH 0x0BA3\n    #define GL_PROJECTION_STACK_DEPTH 0x0BA4\n    #define GL_TEXTURE_STACK_DEPTH 0x0BA5\n    #define GL_MODELVIEW_MATRIX 0x0BA6\n    #define GL_PROJECTION_MATRIX 0x0BA7\n    #define GL_TEXTURE_MATRIX 0x0BA8\n    #define GL_ATTRIB_STACK_DEPTH 0x0BB0\n    #define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1\n    #define GL_ALPHA_TEST 0x0BC0\n    #define GL_ALPHA_TEST_FUNC 0x0BC1\n    #define GL_ALPHA_TEST_REF 0x0BC2\n    #define GL_DITHER 0x0BD0\n    #define GL_BLEND_DST 0x0BE0\n    #define GL_BLEND_SRC 0x0BE1\n    #define GL_BLEND 0x0BE2\n    #define GL_LOGIC_OP_MODE 0x0BF0\n    #define GL_INDEX_LOGIC_OP 0x0BF1\n    #define GL_COLOR_LOGIC_OP 0x0BF2\n    #define GL_AUX_BUFFERS 0x0C00\n    #define GL_DRAW_BUFFER 0x0C01\n    #define GL_READ_BUFFER 0x0C02\n    #define GL_SCISSOR_BOX 0x0C10\n    #define GL_SCISSOR_TEST 0x0C11\n    #define GL_INDEX_CLEAR_VALUE 0x0C20\n    #define GL_INDEX_WRITEMASK 0x0C21\n    #define GL_COLOR_CLEAR_VALUE 0x0C22\n    #define GL_COLOR_WRITEMASK 0x0C23\n    #define GL_INDEX_MODE 0x0C30\n    #define GL_RGBA_MODE 0x0C31\n    #define GL_DOUBLEBUFFER 0x0C32\n    #define GL_STEREO 0x0C33\n    #define GL_RENDER_MODE 0x0C40\n    #define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50\n    #define GL_POINT_SMOOTH_HINT 0x0C51\n    #define GL_LINE_SMOOTH_HINT 0x0C52\n    #define GL_POLYGON_SMOOTH_HINT 0x0C53\n    #define GL_FOG_HINT 0x0C54\n    #define GL_TEXTURE_GEN_S 0x0C60\n    #define GL_TEXTURE_GEN_T 0x0C61\n    #define GL_TEXTURE_GEN_R 0x0C62\n    #define GL_TEXTURE_GEN_Q 0x0C63\n    #define GL_PIXEL_MAP_I_TO_I 0x0C70\n    #define GL_PIXEL_MAP_S_TO_S 0x0C71\n    #define GL_PIXEL_MAP_I_TO_R 0x0C72\n    #define GL_PIXEL_MAP_I_TO_G 0x0C73\n    #define GL_PIXEL_MAP_I_TO_B 0x0C74\n    #define GL_PIXEL_MAP_I_TO_A 0x0C75\n    #define GL_PIXEL_MAP_R_TO_R 0x0C76\n    #define GL_PIXEL_MAP_G_TO_G 0x0C77\n    #define GL_PIXEL_MAP_B_TO_B 0x0C78\n    #define GL_PIXEL_MAP_A_TO_A 0x0C79\n    #define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0\n    #define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1\n    #define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2\n    #define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3\n    #define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4\n    #define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5\n    #define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6\n    #define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7\n    #define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8\n    #define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9\n    #define GL_UNPACK_SWAP_BYTES 0x0CF0\n    #define GL_UNPACK_LSB_FIRST 0x0CF1\n    #define GL_UNPACK_ROW_LENGTH 0x0CF2\n    #define GL_UNPACK_SKIP_ROWS 0x0CF3\n    #define GL_UNPACK_SKIP_PIXELS 0x0CF4\n    #define GL_UNPACK_ALIGNMENT 0x0CF5\n    #define GL_PACK_SWAP_BYTES 0x0D00\n    #define GL_PACK_LSB_FIRST 0x0D01\n    #define GL_PACK_ROW_LENGTH 0x0D02\n    #define GL_PACK_SKIP_ROWS 0x0D03\n    #define GL_PACK_SKIP_PIXELS 0x0D04\n    #define GL_PACK_ALIGNMENT 0x0D05\n    #define GL_MAP_COLOR 0x0D10\n    #define GL_MAP_STENCIL 0x0D11\n    #define GL_INDEX_SHIFT 0x0D12\n    #define GL_INDEX_OFFSET 0x0D13\n    #define GL_RED_SCALE 0x0D14\n    #define GL_RED_BIAS 0x0D15\n    #define GL_ZOOM_X 0x0D16\n    #define GL_ZOOM_Y 0x0D17\n    #define GL_GREEN_SCALE 0x0D18\n    #define GL_GREEN_BIAS 0x0D19\n    #define GL_BLUE_SCALE 0x0D1A\n    #define GL_BLUE_BIAS 0x0D1B\n    #define GL_ALPHA_SCALE 0x0D1C\n    #define GL_ALPHA_BIAS 0x0D1D\n    #define GL_DEPTH_SCALE 0x0D1E\n    #define GL_DEPTH_BIAS 0x0D1F\n    #define GL_MAX_EVAL_ORDER 0x0D30\n    #define GL_MAX_LIGHTS 0x0D31\n    #define GL_MAX_CLIP_PLANES 0x0D32\n    #define GL_MAX_TEXTURE_SIZE 0x0D33\n    #define GL_MAX_PIXEL_MAP_TABLE 0x0D34\n    #define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35\n    #define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36\n    #define GL_MAX_NAME_STACK_DEPTH 0x0D37\n    #define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38\n    #define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39\n    #define GL_MAX_VIEWPORT_DIMS 0x0D3A\n    #define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B\n    #define GL_SUBPIXEL_BITS 0x0D50\n    #define GL_INDEX_BITS 0x0D51\n    #define GL_RED_BITS 0x0D52\n    #define GL_GREEN_BITS 0x0D53\n    #define GL_BLUE_BITS 0x0D54\n    #define GL_ALPHA_BITS 0x0D55\n    #define GL_DEPTH_BITS 0x0D56\n    #define GL_STENCIL_BITS 0x0D57\n    #define GL_ACCUM_RED_BITS 0x0D58\n    #define GL_ACCUM_GREEN_BITS 0x0D59\n    #define GL_ACCUM_BLUE_BITS 0x0D5A\n    #define GL_ACCUM_ALPHA_BITS 0x0D5B\n    #define GL_NAME_STACK_DEPTH 0x0D70\n    #define GL_AUTO_NORMAL 0x0D80\n    #define GL_MAP1_COLOR_4 0x0D90\n    #define GL_MAP1_INDEX 0x0D91\n    #define GL_MAP1_NORMAL 0x0D92\n    #define GL_MAP1_TEXTURE_COORD_1 0x0D93\n    #define GL_MAP1_TEXTURE_COORD_2 0x0D94\n    #define GL_MAP1_TEXTURE_COORD_3 0x0D95\n    #define GL_MAP1_TEXTURE_COORD_4 0x0D96\n    #define GL_MAP1_VERTEX_3 0x0D97\n    #define GL_MAP1_VERTEX_4 0x0D98\n    #define GL_MAP2_COLOR_4 0x0DB0\n    #define GL_MAP2_INDEX 0x0DB1\n    #define GL_MAP2_NORMAL 0x0DB2\n    #define GL_MAP2_TEXTURE_COORD_1 0x0DB3\n    #define GL_MAP2_TEXTURE_COORD_2 0x0DB4\n    #define GL_MAP2_TEXTURE_COORD_3 0x0DB5\n    #define GL_MAP2_TEXTURE_COORD_4 0x0DB6\n    #define GL_MAP2_VERTEX_3 0x0DB7\n    #define GL_MAP2_VERTEX_4 0x0DB8\n    #define GL_MAP1_GRID_DOMAIN 0x0DD0\n    #define GL_MAP1_GRID_SEGMENTS 0x0DD1\n    #define GL_MAP2_GRID_DOMAIN 0x0DD2\n    #define GL_MAP2_GRID_SEGMENTS 0x0DD3\n    #define GL_TEXTURE_1D 0x0DE0\n    #define GL_TEXTURE_2D 0x0DE1\n    #define GL_FEEDBACK_BUFFER_POINTER 0x0DF0\n    #define GL_FEEDBACK_BUFFER_SIZE 0x0DF1\n    #define GL_FEEDBACK_BUFFER_TYPE 0x0DF2\n    #define GL_SELECTION_BUFFER_POINTER 0x0DF3\n    #define GL_SELECTION_BUFFER_SIZE 0x0DF4\n    #define GL_TEXTURE_WIDTH 0x1000\n    #define GL_TRANSFORM_BIT 0x00001000\n    #define GL_TEXTURE_HEIGHT 0x1001\n    #define GL_TEXTURE_INTERNAL_FORMAT 0x1003\n    #define GL_TEXTURE_BORDER_COLOR 0x1004\n    #define GL_TEXTURE_BORDER 0x1005\n    #define GL_DONT_CARE 0x1100\n    #define GL_FASTEST 0x1101\n    #define GL_NICEST 0x1102\n    #define GL_AMBIENT 0x1200\n    #define GL_DIFFUSE 0x1201\n    #define GL_SPECULAR 0x1202\n    #define GL_POSITION 0x1203\n    #define GL_SPOT_DIRECTION 0x1204\n    #define GL_SPOT_EXPONENT 0x1205\n    #define GL_SPOT_CUTOFF 0x1206\n    #define GL_CONSTANT_ATTENUATION 0x1207\n    #define GL_LINEAR_ATTENUATION 0x1208\n    #define GL_QUADRATIC_ATTENUATION 0x1209\n    #define GL_COMPILE 0x1300\n    #define GL_COMPILE_AND_EXECUTE 0x1301\n    #define GL_BYTE 0x1400\n    #define GL_UNSIGNED_BYTE 0x1401\n    #define GL_SHORT 0x1402\n    #define GL_UNSIGNED_SHORT 0x1403\n    #define GL_INT 0x1404\n    #define GL_UNSIGNED_INT 0x1405\n    #define GL_FLOAT 0x1406\n    #define GL_2_BYTES 0x1407\n    #define GL_3_BYTES 0x1408\n    #define GL_4_BYTES 0x1409\n    #define GL_DOUBLE 0x140A\n    #define GL_CLEAR 0x1500\n    #define GL_AND 0x1501\n    #define GL_AND_REVERSE 0x1502\n    #define GL_COPY 0x1503\n    #define GL_AND_INVERTED 0x1504\n    #define GL_NOOP 0x1505\n    #define GL_XOR 0x1506\n    #define GL_OR 0x1507\n    #define GL_NOR 0x1508\n    #define GL_EQUIV 0x1509\n    #define GL_INVERT 0x150A\n    #define GL_OR_REVERSE 0x150B\n    #define GL_COPY_INVERTED 0x150C\n    #define GL_OR_INVERTED 0x150D\n    #define GL_NAND 0x150E\n    #define GL_SET 0x150F\n    #define GL_EMISSION 0x1600\n    #define GL_SHININESS 0x1601\n    #define GL_AMBIENT_AND_DIFFUSE 0x1602\n    #define GL_COLOR_INDEXES 0x1603\n    #define GL_MODELVIEW 0x1700\n    #define GL_PROJECTION 0x1701\n    #define GL_TEXTURE 0x1702\n    #define GL_COLOR 0x1800\n    #define GL_DEPTH 0x1801\n    #define GL_STENCIL 0x1802\n    #define GL_COLOR_INDEX 0x1900\n    #define GL_STENCIL_INDEX 0x1901\n    #define GL_DEPTH_COMPONENT 0x1902\n    #define GL_RED 0x1903\n    #define GL_GREEN 0x1904\n    #define GL_BLUE 0x1905\n    #define GL_ALPHA 0x1906\n    #define GL_RGB 0x1907\n    #define GL_RGBA 0x1908\n    #define GL_LUMINANCE 0x1909\n    #define GL_LUMINANCE_ALPHA 0x190A\n    #define GL_BITMAP 0x1A00\n    #define GL_POINT 0x1B00\n    #define GL_LINE 0x1B01\n    #define GL_FILL 0x1B02\n    #define GL_RENDER 0x1C00\n    #define GL_FEEDBACK 0x1C01\n    #define GL_SELECT 0x1C02\n    #define GL_FLAT 0x1D00\n    #define GL_SMOOTH 0x1D01\n    #define GL_KEEP 0x1E00\n    #define GL_REPLACE 0x1E01\n    #define GL_INCR 0x1E02\n    #define GL_DECR 0x1E03\n    #define GL_VENDOR 0x1F00\n    #define GL_RENDERER 0x1F01\n    #define GL_VERSION 0x1F02\n    #define GL_EXTENSIONS 0x1F03\n    #define GL_S 0x2000\n    #define GL_ENABLE_BIT 0x00002000\n    #define GL_T 0x2001\n    #define GL_R 0x2002\n    #define GL_Q 0x2003\n    #define GL_MODULATE 0x2100\n    #define GL_DECAL 0x2101\n    #define GL_TEXTURE_ENV_MODE 0x2200\n    #define GL_TEXTURE_ENV_COLOR 0x2201\n    #define GL_TEXTURE_ENV 0x2300\n    #define GL_EYE_LINEAR 0x2400\n    #define GL_OBJECT_LINEAR 0x2401\n    #define GL_SPHERE_MAP 0x2402\n    #define GL_TEXTURE_GEN_MODE 0x2500\n    #define GL_OBJECT_PLANE 0x2501\n    #define GL_EYE_PLANE 0x2502\n    #define GL_NEAREST 0x2600\n    #define GL_LINEAR 0x2601\n    #define GL_NEAREST_MIPMAP_NEAREST 0x2700\n    #define GL_LINEAR_MIPMAP_NEAREST 0x2701\n    #define GL_NEAREST_MIPMAP_LINEAR 0x2702\n    #define GL_LINEAR_MIPMAP_LINEAR 0x2703\n    #define GL_TEXTURE_MAG_FILTER 0x2800\n    #define GL_TEXTURE_MIN_FILTER 0x2801\n    #define GL_TEXTURE_WRAP_S 0x2802\n    #define GL_TEXTURE_WRAP_T 0x2803\n    #define GL_CLAMP 0x2900\n    #define GL_REPEAT 0x2901\n    #define GL_POLYGON_OFFSET_UNITS 0x2A00\n    #define GL_POLYGON_OFFSET_POINT 0x2A01\n    #define GL_POLYGON_OFFSET_LINE 0x2A02\n    #define GL_R3_G3_B2 0x2A10\n    #define GL_V2F 0x2A20\n    #define GL_V3F 0x2A21\n    #define GL_C4UB_V2F 0x2A22\n    #define GL_C4UB_V3F 0x2A23\n    #define GL_C3F_V3F 0x2A24\n    #define GL_N3F_V3F 0x2A25\n    #define GL_C4F_N3F_V3F 0x2A26\n    #define GL_T2F_V3F 0x2A27\n    #define GL_T4F_V4F 0x2A28\n    #define GL_T2F_C4UB_V3F 0x2A29\n    #define GL_T2F_C3F_V3F 0x2A2A\n    #define GL_T2F_N3F_V3F 0x2A2B\n    #define GL_T2F_C4F_N3F_V3F 0x2A2C\n    #define GL_T4F_C4F_N3F_V4F 0x2A2D\n    #define GL_CLIP_PLANE0 0x3000\n    #define GL_CLIP_PLANE1 0x3001\n    #define GL_CLIP_PLANE2 0x3002\n    #define GL_CLIP_PLANE3 0x3003\n    #define GL_CLIP_PLANE4 0x3004\n    #define GL_CLIP_PLANE5 0x3005\n    #define GL_LIGHT0 0x4000\n    #define GL_COLOR_BUFFER_BIT 0x00004000\n    #define GL_LIGHT1 0x4001\n    #define GL_LIGHT2 0x4002\n    #define GL_LIGHT3 0x4003\n    #define GL_LIGHT4 0x4004\n    #define GL_LIGHT5 0x4005\n    #define GL_LIGHT6 0x4006\n    #define GL_LIGHT7 0x4007\n    #define GL_HINT_BIT 0x00008000\n    #define GL_POLYGON_OFFSET_FILL 0x8037\n    #define GL_POLYGON_OFFSET_FACTOR 0x8038\n    #define GL_ALPHA4 0x803B\n    #define GL_ALPHA8 0x803C\n    #define GL_ALPHA12 0x803D\n    #define GL_ALPHA16 0x803E\n    #define GL_LUMINANCE4 0x803F\n    #define GL_LUMINANCE8 0x8040\n    #define GL_LUMINANCE12 0x8041\n    #define GL_LUMINANCE16 0x8042\n    #define GL_LUMINANCE4_ALPHA4 0x8043\n    #define GL_LUMINANCE6_ALPHA2 0x8044\n    #define GL_LUMINANCE8_ALPHA8 0x8045\n    #define GL_LUMINANCE12_ALPHA4 0x8046\n    #define GL_LUMINANCE12_ALPHA12 0x8047\n    #define GL_LUMINANCE16_ALPHA16 0x8048\n    #define GL_INTENSITY 0x8049\n    #define GL_INTENSITY4 0x804A\n    #define GL_INTENSITY8 0x804B\n    #define GL_INTENSITY12 0x804C\n    #define GL_INTENSITY16 0x804D\n    #define GL_RGB4 0x804F\n    #define GL_RGB5 0x8050\n    #define GL_RGB8 0x8051\n    #define GL_RGB10 0x8052\n    #define GL_RGB12 0x8053\n    #define GL_RGB16 0x8054\n    #define GL_RGBA2 0x8055\n    #define GL_RGBA4 0x8056\n    #define GL_RGB5_A1 0x8057\n    #define GL_RGBA8 0x8058\n    #define GL_RGB10_A2 0x8059\n    #define GL_RGBA12 0x805A\n    #define GL_RGBA16 0x805B\n    #define GL_TEXTURE_RED_SIZE 0x805C\n    #define GL_TEXTURE_GREEN_SIZE 0x805D\n    #define GL_TEXTURE_BLUE_SIZE 0x805E\n    #define GL_TEXTURE_ALPHA_SIZE 0x805F\n    #define GL_TEXTURE_LUMINANCE_SIZE 0x8060\n    #define GL_TEXTURE_INTENSITY_SIZE 0x8061\n    #define GL_PROXY_TEXTURE_1D 0x8063\n    #define GL_PROXY_TEXTURE_2D 0x8064\n    #define GL_TEXTURE_PRIORITY 0x8066\n    #define GL_TEXTURE_RESIDENT 0x8067\n    #define GL_TEXTURE_BINDING_1D 0x8068\n    #define GL_TEXTURE_BINDING_2D 0x8069\n    #define GL_VERTEX_ARRAY 0x8074\n    #define GL_NORMAL_ARRAY 0x8075\n    #define GL_COLOR_ARRAY 0x8076\n    #define GL_INDEX_ARRAY 0x8077\n    #define GL_TEXTURE_COORD_ARRAY 0x8078\n    #define GL_EDGE_FLAG_ARRAY 0x8079\n    #define GL_VERTEX_ARRAY_SIZE 0x807A\n    #define GL_VERTEX_ARRAY_TYPE 0x807B\n    #define GL_VERTEX_ARRAY_STRIDE 0x807C\n    #define GL_NORMAL_ARRAY_TYPE 0x807E\n    #define GL_NORMAL_ARRAY_STRIDE 0x807F\n    #define GL_COLOR_ARRAY_SIZE 0x8081\n    #define GL_COLOR_ARRAY_TYPE 0x8082\n    #define GL_COLOR_ARRAY_STRIDE 0x8083\n    #define GL_INDEX_ARRAY_TYPE 0x8085\n    #define GL_INDEX_ARRAY_STRIDE 0x8086\n    #define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088\n    #define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089\n    #define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A\n    #define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C\n    #define GL_VERTEX_ARRAY_POINTER 0x808E\n    #define GL_NORMAL_ARRAY_POINTER 0x808F\n    #define GL_COLOR_ARRAY_POINTER 0x8090\n    #define GL_INDEX_ARRAY_POINTER 0x8091\n    #define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092\n    #define GL_EDGE_FLAG_ARRAY_POINTER 0x8093\n    #define GL_COLOR_INDEX1_EXT 0x80E2\n    #define GL_COLOR_INDEX2_EXT 0x80E3\n    #define GL_COLOR_INDEX4_EXT 0x80E4\n    #define GL_COLOR_INDEX8_EXT 0x80E5\n    #define GL_COLOR_INDEX12_EXT 0x80E6\n    #define GL_COLOR_INDEX16_EXT 0x80E7\n    #define GL_EVAL_BIT 0x00010000\n    #define GL_LIST_BIT 0x00020000\n    #define GL_TEXTURE_BIT 0x00040000\n    #define GL_SCISSOR_BIT 0x00080000\n    #define GL_ALL_ATTRIB_BITS 0x000fffff\n    #define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff\n\n    #if defined(GLE_HOOKING_ENABLED)\n        // In this case we map these functions to internal versions instead of the standard versions.\n        #define glAccum(...)                   GLEGetCurrentFunction(glAccum)(__VA_ARGS__)\n        #define glAlphaFunc(...)               GLEGetCurrentFunction(glAlphaFunc)(__VA_ARGS__)\n        #define glAreTexturesResident(...)     GLEGetCurrentFunction(glAreTexturesResident)(__VA_ARGS__)\n        #define glArrayElement(...)            GLEGetCurrentFunction(glArrayElement)(__VA_ARGS__)\n        #define glBegin(...)                   GLEGetCurrentFunction(glBegin)(__VA_ARGS__)\n        #define glBindTexture(...)             GLEGetCurrentFunction(glBindTexture)(__VA_ARGS__)\n        #define glBitmap(...)                  GLEGetCurrentFunction(glBitmap)(__VA_ARGS__)\n        #define glBlendFunc(...)               GLEGetCurrentFunction(glBlendFunc)(__VA_ARGS__)\n        #define glCallList(...)                GLEGetCurrentFunction(glCallList)(__VA_ARGS__)\n        #define glCallLists(...)               GLEGetCurrentFunction(glCallLists)(__VA_ARGS__)\n        #define glClear(...)                   GLEGetCurrentFunction(glClear)(__VA_ARGS__)\n        #define glClearAccum(...)              GLEGetCurrentFunction(glClearAccum)(__VA_ARGS__)\n        #define glClearColor(...)              GLEGetCurrentFunction(glClearColor)(__VA_ARGS__)\n        #define glClearDepth(...)              GLEGetCurrentFunction(glClearDepth)(__VA_ARGS__)\n        #define glClearIndex(...)              GLEGetCurrentFunction(glClearIndex)(__VA_ARGS__)\n        #define glClearStencil(...)            GLEGetCurrentFunction(glClearStencil)(__VA_ARGS__)\n        #define glClipPlane(...)               GLEGetCurrentFunction(glClipPlane)(__VA_ARGS__)\n        #define glColor3b(...)                 GLEGetCurrentFunction(glColor3b)(__VA_ARGS__)\n        #define glColor3bv(...)                GLEGetCurrentFunction(glColor3bv)(__VA_ARGS__)\n        #define glColor3d(...)                 GLEGetCurrentFunction(glColor3d)(__VA_ARGS__)\n        #define glColor3dv(...)                GLEGetCurrentFunction(glColor3dv)(__VA_ARGS__)\n        #define glColor3f(...)                 GLEGetCurrentFunction(glColor3f)(__VA_ARGS__)\n        #define glColor3fv(...)                GLEGetCurrentFunction(glColor3fv)(__VA_ARGS__)\n        #define glColor3i(...)                 GLEGetCurrentFunction(glColor3i)(__VA_ARGS__)\n        #define glColor3iv(...)                GLEGetCurrentFunction(glColor3iv)(__VA_ARGS__)\n        #define glColor3s(...)                 GLEGetCurrentFunction(glColor3s)(__VA_ARGS__)\n        #define glColor3sv(...)                GLEGetCurrentFunction(glColor3sv)(__VA_ARGS__)\n        #define glColor3ub(...)                GLEGetCurrentFunction(glColor3ub)(__VA_ARGS__)\n        #define glColor3ubv(...)               GLEGetCurrentFunction(glColor3ubv)(__VA_ARGS__)\n        #define glColor3ui(...)                GLEGetCurrentFunction(glColor3ui)(__VA_ARGS__)\n        #define glColor3uiv(...)               GLEGetCurrentFunction(glColor3uiv)(__VA_ARGS__)\n        #define glColor3us(...)                GLEGetCurrentFunction(glColor3us)(__VA_ARGS__)\n        #define glColor3usv(...)               GLEGetCurrentFunction(glColor3usv)(__VA_ARGS__)\n        #define glColor4b(...)                 GLEGetCurrentFunction(glColor4b)(__VA_ARGS__)\n        #define glColor4bv(...)                GLEGetCurrentFunction(glColor4bv)(__VA_ARGS__)\n        #define glColor4d(...)                 GLEGetCurrentFunction(glColor4d)(__VA_ARGS__)\n        #define glColor4dv(...)                GLEGetCurrentFunction(glColor4dv)(__VA_ARGS__)\n        #define glColor4f(...)                 GLEGetCurrentFunction(glColor4f)(__VA_ARGS__)\n        #define glColor4fv(...)                GLEGetCurrentFunction(glColor4fv)(__VA_ARGS__)\n        #define glColor4i(...)                 GLEGetCurrentFunction(glColor4i)(__VA_ARGS__)\n        #define glColor4iv(...)                GLEGetCurrentFunction(glColor4iv)(__VA_ARGS__)\n        #define glColor4s(...)                 GLEGetCurrentFunction(glColor4s)(__VA_ARGS__)\n        #define glColor4sv(...)                GLEGetCurrentFunction(glColor4sv)(__VA_ARGS__)\n        #define glColor4ub(...)                GLEGetCurrentFunction(glColor4ub)(__VA_ARGS__)\n        #define glColor4ubv(...)               GLEGetCurrentFunction(glColor4ubv)(__VA_ARGS__)\n        #define glColor4ui(...)                GLEGetCurrentFunction(glColor4ui)(__VA_ARGS__)\n        #define glColor4uiv(...)               GLEGetCurrentFunction(glColor4uiv)(__VA_ARGS__)\n        #define glColor4us(...)                GLEGetCurrentFunction(glColor4us)(__VA_ARGS__)\n        #define glColor4usv(...)               GLEGetCurrentFunction(glColor4usv)(__VA_ARGS__)\n        #define glColorMask(...)               GLEGetCurrentFunction(glColorMask)(__VA_ARGS__)\n        #define glColorMaterial(...)           GLEGetCurrentFunction(glColorMaterial)(__VA_ARGS__)\n        #define glColorPointer(...)            GLEGetCurrentFunction(glColorPointer)(__VA_ARGS__)\n        #define glCopyPixels(...)              GLEGetCurrentFunction(glCopyPixels)(__VA_ARGS__)\n        #define glCopyTexImage1D(...)          GLEGetCurrentFunction(glCopyTexImage1D)(__VA_ARGS__)\n        #define glCopyTexImage2D(...)          GLEGetCurrentFunction(glCopyTexImage2D)(__VA_ARGS__)\n        #define glCopyTexSubImage1D(...)       GLEGetCurrentFunction(glCopyTexSubImage1D)(__VA_ARGS__)\n        #define glCopyTexSubImage2D(...)       GLEGetCurrentFunction(glCopyTexSubImage2D)(__VA_ARGS__)\n        #define glCullFace(...)                GLEGetCurrentFunction(glCullFace)(__VA_ARGS__)\n        #define glDeleteLists(...)             GLEGetCurrentFunction(glDeleteLists)(__VA_ARGS__)\n        #define glDeleteTextures(...)          GLEGetCurrentFunction(glDeleteTextures)(__VA_ARGS__)\n        #define glDepthFunc(...)               GLEGetCurrentFunction(glDepthFunc)(__VA_ARGS__)\n        #define glDepthMask(...)               GLEGetCurrentFunction(glDepthMask)(__VA_ARGS__)\n        #define glDepthRange(...)              GLEGetCurrentFunction(glDepthRange)(__VA_ARGS__)\n        #define glDisable(...)                 GLEGetCurrentFunction(glDisable)(__VA_ARGS__)\n        #define glDisableClientState(...)      GLEGetCurrentFunction(glDisableClientState)(__VA_ARGS__)\n        #define glDrawArrays(...)              GLEGetCurrentFunction(glDrawArrays)(__VA_ARGS__)\n        #define glDrawBuffer(...)              GLEGetCurrentFunction(glDrawBuffer)(__VA_ARGS__)\n        #define glDrawElements(...)            GLEGetCurrentFunction(glDrawElements)(__VA_ARGS__)\n        #define glDrawPixels(...)              GLEGetCurrentFunction(glDrawPixels)(__VA_ARGS__)\n        #define glEdgeFlag(...)                GLEGetCurrentFunction(glEdgeFlag)(__VA_ARGS__)\n        #define glEdgeFlagPointer(...)         GLEGetCurrentFunction(glEdgeFlagPointer)(__VA_ARGS__)\n        #define glEdgeFlagv(...)               GLEGetCurrentFunction(glEdgeFlagv)(__VA_ARGS__)\n        #define glEnable(...)                  GLEGetCurrentFunction(glEnable)(__VA_ARGS__)\n        #define glEnableClientState(...)       GLEGetCurrentFunction(glEnableClientState)(__VA_ARGS__)\n        #define glEnd()                        GLEGetCurrentFunction(glEnd)()\n        #define glEndList()                    GLEGetCurrentFunction(glEndList)(_)\n        #define glEvalCoord1d(...)             GLEGetCurrentFunction(glEvalCoord1d)(__VA_ARGS__)\n        #define glEvalCoord1dv(...)            GLEGetCurrentFunction(glEvalCoord1dv)(__VA_ARGS__)\n        #define glEvalCoord1f(...)             GLEGetCurrentFunction(glEvalCoord1f)(__VA_ARGS__)\n        #define glEvalCoord1fv(...)            GLEGetCurrentFunction(glEvalCoord1fv)(__VA_ARGS__)\n        #define glEvalCoord2d(...)             GLEGetCurrentFunction(glEvalCoord2d)(__VA_ARGS__)\n        #define glEvalCoord2dv(...)            GLEGetCurrentFunction(glEvalCoord2dv)(__VA_ARGS__)\n        #define glEvalCoord2f(...)             GLEGetCurrentFunction(glEvalCoord2f)(__VA_ARGS__)\n        #define glEvalCoord2fv(...)            GLEGetCurrentFunction(glEvalCoord2fv)(__VA_ARGS__)\n        #define glEvalMesh1(...)               GLEGetCurrentFunction(glEvalMesh1)(__VA_ARGS__)\n        #define glEvalMesh2(...)               GLEGetCurrentFunction(glEvalMesh2)(__VA_ARGS__)\n        #define glEvalPoint1(...)              GLEGetCurrentFunction(glEvalPoint1)(__VA_ARGS__)\n        #define glEvalPoint2(...)              GLEGetCurrentFunction(glEvalPoint2)(__VA_ARGS__)\n        #define glFeedbackBuffer(...)          GLEGetCurrentFunction(glFeedbackBuffer)(__VA_ARGS__)\n        #define glFinish()                     GLEGetCurrentFunction(glFinish)()\n        #define glFlush()                      GLEGetCurrentFunction(glFlush)()\n        #define glFogf(...)                    GLEGetCurrentFunction(glFogf)(__VA_ARGS__)\n        #define glFogfv(...)                   GLEGetCurrentFunction(glFogfv)(__VA_ARGS__)\n        #define glFogi(...)                    GLEGetCurrentFunction(glFogi)(__VA_ARGS__)\n        #define glFogiv(...)                   GLEGetCurrentFunction(glFogiv)(__VA_ARGS__)\n        #define glFrontFace(...)               GLEGetCurrentFunction(glFrontFace)(__VA_ARGS__)\n        #define glFrustum(...)                 GLEGetCurrentFunction(glFrustum)(__VA_ARGS__)\n        #define glGenLists(...)                GLEGetCurrentFunction(glGenLists)(__VA_ARGS__)\n        #define glGenTextures(...)             GLEGetCurrentFunction(glGenTextures)(__VA_ARGS__)\n        #define glGetBooleanv(...)             GLEGetCurrentFunction(glGetBooleanv)(__VA_ARGS__)\n        #define glGetClipPlane(...)            GLEGetCurrentFunction(glGetClipPlane)(__VA_ARGS__)\n        #define glGetDoublev(...)              GLEGetCurrentFunction(glGetDoublev)(__VA_ARGS__)\n        #define glGetError()                   GLEGetCurrentFunction(glGetError)()\n        #define glGetFloatv(...)               GLEGetCurrentFunction(glGetFloatv)(__VA_ARGS__)\n        #define glGetIntegerv(...)             GLEGetCurrentFunction(glGetIntegerv)(__VA_ARGS__)\n        #define glGetLightfv(...)              GLEGetCurrentFunction(glGetLightfv)(__VA_ARGS__)\n        #define glGetLightiv(...)              GLEGetCurrentFunction(glGetLightiv)(__VA_ARGS__)\n        #define glGetMapdv(...)                GLEGetCurrentFunction(glGetMapdv)(__VA_ARGS__)\n        #define glGetMapfv(...)                GLEGetCurrentFunction(glGetMapfv)(__VA_ARGS__)\n        #define glGetMapiv(...)                GLEGetCurrentFunction(glGetMapiv)(__VA_ARGS__)\n        #define glGetMaterialfv(...)           GLEGetCurrentFunction(glGetMaterialfv)(__VA_ARGS__)\n        #define glGetMaterialiv(...)           GLEGetCurrentFunction(glGetMaterialiv)(__VA_ARGS__)\n        #define glGetPixelMapfv(...)           GLEGetCurrentFunction(glGetPixelMapfv)(__VA_ARGS__)\n        #define glGetPixelMapuiv(...)          GLEGetCurrentFunction(glGetPixelMapuiv)(__VA_ARGS__)\n        #define glGetPixelMapusv(...)          GLEGetCurrentFunction(glGetPixelMapusv)(__VA_ARGS__)\n        #define glGetPointerv(...)             GLEGetCurrentFunction(glGetPointerv)(__VA_ARGS__)\n        #define glGetPolygonStipple(...)       GLEGetCurrentFunction(glGetPolygonStipple)(__VA_ARGS__)\n        #define glGetString(...)               GLEGetCurrentFunction(glGetString)(__VA_ARGS__)\n        #define glGetTexEnvfv(...)             GLEGetCurrentFunction(glGetTexEnvfv)(__VA_ARGS__)\n        #define glGetTexEnviv(...)             GLEGetCurrentFunction(glGetTexEnviv)(__VA_ARGS__)\n        #define glGetTexGendv(...)             GLEGetCurrentFunction(glGetTexGendv)(__VA_ARGS__)\n        #define glGetTexGenfv(...)             GLEGetCurrentFunction(glGetTexGenfv)(__VA_ARGS__)\n        #define glGetTexGeniv(...)             GLEGetCurrentFunction(glGetTexGeniv)(__VA_ARGS__)\n        #define glGetTexImage(...)             GLEGetCurrentFunction(glGetTexImage)(__VA_ARGS__)\n        #define glGetTexLevelParameterfv(...)  GLEGetCurrentFunction(glGetTexLevelParameterfv)(__VA_ARGS__)\n        #define glGetTexLevelParameteriv(...)  GLEGetCurrentFunction(glGetTexLevelParameteriv)(__VA_ARGS__)\n        #define glGetTexParameterfv(...)       GLEGetCurrentFunction(glGetTexParameterfv)(__VA_ARGS__)\n        #define glGetTexParameteriv(...)       GLEGetCurrentFunction(glGetTexParameteriv)(__VA_ARGS__)\n        #define glHint(...)                    GLEGetCurrentFunction(glHint)(__VA_ARGS__)\n        #define glIndexMask(...)               GLEGetCurrentFunction(glIndexMask)(__VA_ARGS__)\n        #define glIndexPointer(...)            GLEGetCurrentFunction(glIndexPointer)(__VA_ARGS__)\n        #define glIndexd(...)                  GLEGetCurrentFunction(glIndexd)(__VA_ARGS__)\n        #define glIndexdv(...)                 GLEGetCurrentFunction(glIndexdv)(__VA_ARGS__)\n        #define glIndexf(...)                  GLEGetCurrentFunction(glIndexf)(__VA_ARGS__)\n        #define glIndexfv(...)                 GLEGetCurrentFunction(glIndexfv)(__VA_ARGS__)\n        #define glIndexi(...)                  GLEGetCurrentFunction(glIndexi)(__VA_ARGS__)\n        #define glIndexiv(...)                 GLEGetCurrentFunction(glIndexiv)(__VA_ARGS__)\n        #define glIndexs(...)                  GLEGetCurrentFunction(glIndexs)(__VA_ARGS__)\n        #define glIndexsv(...)                 GLEGetCurrentFunction(glIndexsv)(__VA_ARGS__)\n        #define glIndexub(...)                 GLEGetCurrentFunction(glIndexub)(__VA_ARGS__)\n        #define glIndexubv(...)                GLEGetCurrentFunction(glIndexubv)(__VA_ARGS__)\n        #define glInitNames()                  GLEGetCurrentFunction(glInitNames)()\n        #define glInterleavedArrays(...)       GLEGetCurrentFunction(glInterleavedArrays)(__VA_ARGS__)\n        #define glIsEnabled(...)               GLEGetCurrentFunction(glIsEnabled)(__VA_ARGS__)\n        #define glIsList(...)                  GLEGetCurrentFunction(glIsList)(__VA_ARGS__)\n        #define glIsTexture(...)               GLEGetCurrentFunction(glIsTexture)(__VA_ARGS__)\n        #define glLightModelf(...)             GLEGetCurrentFunction(glLightModelf)(__VA_ARGS__)\n        #define glLightModelfv(...)            GLEGetCurrentFunction(glLightModelfv)(__VA_ARGS__)\n        #define glLightModeli(...)             GLEGetCurrentFunction(glLightModeli)(__VA_ARGS__)\n        #define glLightModeliv(...)            GLEGetCurrentFunction(glLightModeliv)(__VA_ARGS__)\n        #define glLightf(...)                  GLEGetCurrentFunction(glLightf)(__VA_ARGS__)\n        #define glLightfv(...)                 GLEGetCurrentFunction(glLightfv)(__VA_ARGS__)\n        #define glLighti(...)                  GLEGetCurrentFunction(glLighti)(__VA_ARGS__)\n        #define glLightiv(...)                 GLEGetCurrentFunction(glLightiv)(__VA_ARGS__)\n        #define glLineStipple(...)             GLEGetCurrentFunction(glLineStipple)(__VA_ARGS__)\n        #define glLineWidth(...)               GLEGetCurrentFunction(glLineWidth)(__VA_ARGS__)\n        #define glListBase(...)                GLEGetCurrentFunction(glListBase)(__VA_ARGS__)\n        #define glLoadIdentity()               GLEGetCurrentFunction(glLoadIdentity)()\n        #define glLoadMatrixd(...)             GLEGetCurrentFunction(glLoadMatrixd)(__VA_ARGS__)\n        #define glLoadMatrixf(...)             GLEGetCurrentFunction(glLoadMatrixf)(__VA_ARGS__)\n        #define glLoadName(...)                GLEGetCurrentFunction(glLoadName)(__VA_ARGS__)\n        #define glLogicOp(...)                 GLEGetCurrentFunction(glLogicOp)(__VA_ARGS__)\n        #define glMap1d(...)                   GLEGetCurrentFunction(glMap1d)(__VA_ARGS__)\n        #define glMap1f(...)                   GLEGetCurrentFunction(glMap1f)(__VA_ARGS__)\n        #define glMap2d(...)                   GLEGetCurrentFunction(glMap2d)(__VA_ARGS__)\n        #define glMap2f(...)                   GLEGetCurrentFunction(glMap2f)(__VA_ARGS__)\n        #define glMapGrid1d(...)               GLEGetCurrentFunction(glMapGrid1d)(__VA_ARGS__)\n        #define glMapGrid1f(...)               GLEGetCurrentFunction(glMapGrid1f)(__VA_ARGS__)\n        #define glMapGrid2d(...)               GLEGetCurrentFunction(glMapGrid2d)(__VA_ARGS__)\n        #define glMapGrid2f(...)               GLEGetCurrentFunction(glMapGrid2f)(__VA_ARGS__)\n        #define glMaterialf(...)               GLEGetCurrentFunction(glMaterialf)(__VA_ARGS__)\n        #define glMaterialfv(...)              GLEGetCurrentFunction(glMaterialfv)(__VA_ARGS__)\n        #define glMateriali(...)               GLEGetCurrentFunction(glMateriali)(__VA_ARGS__)\n        #define glMaterialiv(...)              GLEGetCurrentFunction(glMaterialiv)(__VA_ARGS__)\n        #define glMatrixMode(...)              GLEGetCurrentFunction(glMatrixMode)(__VA_ARGS__)\n        #define glMultMatrixd(...)             GLEGetCurrentFunction(glMultMatrixd)(__VA_ARGS__)\n        #define glMultMatrixf(...)             GLEGetCurrentFunction(glMultMatrixf)(__VA_ARGS__)\n        #define glNewList(...)                 GLEGetCurrentFunction(glNewList)(__VA_ARGS__)\n        #define glNormal3b(...)                GLEGetCurrentFunction(glNormal3b)(__VA_ARGS__)\n        #define glNormal3bv(...)               GLEGetCurrentFunction(glNormal3bv)(__VA_ARGS__)\n        #define glNormal3d(...)                GLEGetCurrentFunction(glNormal3d)(__VA_ARGS__)\n        #define glNormal3dv(...)               GLEGetCurrentFunction(glNormal3dv)(__VA_ARGS__)\n        #define glNormal3f(...)                GLEGetCurrentFunction(glNormal3f)(__VA_ARGS__)\n        #define glNormal3fv(...)               GLEGetCurrentFunction(glNormal3fv)(__VA_ARGS__)\n        #define glNormal3i(...)                GLEGetCurrentFunction(glNormal3i)(__VA_ARGS__)\n        #define glNormal3iv(...)               GLEGetCurrentFunction(glNormal3iv)(__VA_ARGS__)\n        #define glNormal3s(...)                GLEGetCurrentFunction(glNormal3s)(__VA_ARGS__)\n        #define glNormal3sv(...)               GLEGetCurrentFunction(glNormal3sv)(__VA_ARGS__)\n        #define glNormalPointer(...)           GLEGetCurrentFunction(glNormalPointer)(__VA_ARGS__)\n        #define glOrtho(...)                   GLEGetCurrentFunction(glOrtho)(__VA_ARGS__)\n        #define glPassThrough(...)             GLEGetCurrentFunction(glPassThrough)(__VA_ARGS__)\n        #define glPixelMapfv(...)              GLEGetCurrentFunction(glPixelMapfv)(__VA_ARGS__)\n        #define glPixelMapuiv(...)             GLEGetCurrentFunction(glPixelMapuiv)(__VA_ARGS__)\n        #define glPixelMapusv(...)             GLEGetCurrentFunction(glPixelMapusv)(__VA_ARGS__)\n        #define glPixelStoref(...)             GLEGetCurrentFunction(glPixelStoref)(__VA_ARGS__)\n        #define glPixelStorei(...)             GLEGetCurrentFunction(glPixelStorei)(__VA_ARGS__)\n        #define glPixelTransferf(...)          GLEGetCurrentFunction(glPixelTransferf)(__VA_ARGS__)\n        #define glPixelTransferi(...)          GLEGetCurrentFunction(glPixelTransferi)(__VA_ARGS__)\n        #define glPixelZoom(...)               GLEGetCurrentFunction(glPixelZoom)(__VA_ARGS__)\n        #define glPointSize(...)               GLEGetCurrentFunction(glPointSize)(__VA_ARGS__)\n        #define glPolygonMode(...)             GLEGetCurrentFunction(glPolygonMode)(__VA_ARGS__)\n        #define glPolygonOffset(...)           GLEGetCurrentFunction(glPolygonOffset)(__VA_ARGS__)\n        #define glPolygonStipple(...)          GLEGetCurrentFunction(glPolygonStipple)(__VA_ARGS__)\n        #define glPopAttrib()                  GLEGetCurrentFunction(glPopAttrib)()\n        #define glPopClientAttrib()            GLEGetCurrentFunction(glPopClientAttrib)()\n        #define glPopMatrix()                  GLEGetCurrentFunction(glPopMatrix)()\n        #define glPopName()                    GLEGetCurrentFunction(glPopName)()\n        #define glPrioritizeTextures(...)      GLEGetCurrentFunction(glPrioritizeTextures)(__VA_ARGS__)\n        #define glPushAttrib(...)              GLEGetCurrentFunction(glPushAttrib)(__VA_ARGS__)\n        #define glPushClientAttrib(...)        GLEGetCurrentFunction(glPushClientAttrib)(__VA_ARGS__)\n        #define glPushMatrix()                 GLEGetCurrentFunction(glPushMatrix)()\n        #define glPushName(...)                GLEGetCurrentFunction(glPushName)(__VA_ARGS__)\n        #define glRasterPos2d(...)             GLEGetCurrentFunction(glRasterPos2d)(__VA_ARGS__)\n        #define glRasterPos2dv(...)            GLEGetCurrentFunction(glRasterPos2dv)(__VA_ARGS__)\n        #define glRasterPos2f(...)             GLEGetCurrentFunction(glRasterPos2f)(__VA_ARGS__)\n        #define glRasterPos2fv(...)            GLEGetCurrentFunction(glRasterPos2fv)(__VA_ARGS__)\n        #define glRasterPos2i(...)             GLEGetCurrentFunction(glRasterPos2i)(__VA_ARGS__)\n        #define glRasterPos2iv(...)            GLEGetCurrentFunction(glRasterPos2iv)(__VA_ARGS__)\n        #define glRasterPos2s(...)             GLEGetCurrentFunction(glRasterPos2s)(__VA_ARGS__)\n        #define glRasterPos2sv(...)            GLEGetCurrentFunction(glRasterPos2sv)(__VA_ARGS__)\n        #define glRasterPos3d(...)             GLEGetCurrentFunction(glRasterPos3d)(__VA_ARGS__)\n        #define glRasterPos3dv(...)            GLEGetCurrentFunction(glRasterPos3dv)(__VA_ARGS__)\n        #define glRasterPos3f(...)             GLEGetCurrentFunction(glRasterPos3f)(__VA_ARGS__)\n        #define glRasterPos3fv(...)            GLEGetCurrentFunction(glRasterPos3fv)(__VA_ARGS__)\n        #define glRasterPos3i(...)             GLEGetCurrentFunction(glRasterPos3i)(__VA_ARGS__)\n        #define glRasterPos3iv(...)            GLEGetCurrentFunction(glRasterPos3iv)(__VA_ARGS__)\n        #define glRasterPos3s(...)             GLEGetCurrentFunction(glRasterPos3s)(__VA_ARGS__)\n        #define glRasterPos3sv(...)            GLEGetCurrentFunction(glRasterPos3sv)(__VA_ARGS__)\n        #define glRasterPos4d(...)             GLEGetCurrentFunction(glRasterPos4d)(__VA_ARGS__)\n        #define glRasterPos4dv(...)            GLEGetCurrentFunction(glRasterPos4dv)(__VA_ARGS__)\n        #define glRasterPos4f(...)             GLEGetCurrentFunction(glRasterPos4f)(__VA_ARGS__)\n        #define glRasterPos4fv(...)            GLEGetCurrentFunction(glRasterPos4fv)(__VA_ARGS__)\n        #define glRasterPos4i(...)             GLEGetCurrentFunction(glRasterPos4i)(__VA_ARGS__)\n        #define glRasterPos4iv(...)            GLEGetCurrentFunction(glRasterPos4iv)(__VA_ARGS__)\n        #define glRasterPos4s(...)             GLEGetCurrentFunction(glRasterPos4s)(__VA_ARGS__)\n        #define glRasterPos4sv(...)            GLEGetCurrentFunction(glRasterPos4sv)(__VA_ARGS__)\n        #define glReadBuffer(...)              GLEGetCurrentFunction(glReadBuffer)(__VA_ARGS__)\n        #define glReadPixels(...)              GLEGetCurrentFunction(glReadPixels)(__VA_ARGS__)\n        #define glRectd(...)                   GLEGetCurrentFunction(glRectd)(__VA_ARGS__)\n        #define glRectdv(...)                  GLEGetCurrentFunction(glRectdv)(__VA_ARGS__)\n        #define glRectf(...)                   GLEGetCurrentFunction(glRectf)(__VA_ARGS__)\n        #define glRectfv(...)                  GLEGetCurrentFunction(glRectfv)(__VA_ARGS__)\n        #define glRecti(...)                   GLEGetCurrentFunction(glRecti)(__VA_ARGS__)\n        #define glRectiv(...)                  GLEGetCurrentFunction(glRectiv)(__VA_ARGS__)\n        #define glRects(...)                   GLEGetCurrentFunction(glRects)(__VA_ARGS__)\n        #define glRectsv(...)                  GLEGetCurrentFunction(glRectsv)(__VA_ARGS__)\n        #define glRenderMode(...)              GLEGetCurrentFunction(glRenderMode)(__VA_ARGS__)\n        #define glRotated(...)                 GLEGetCurrentFunction(glRotated)(__VA_ARGS__)\n        #define glRotatef(...)                 GLEGetCurrentFunction(glRotatef)(__VA_ARGS__)\n        #define glScaled(...)                  GLEGetCurrentFunction(glScaled)(__VA_ARGS__)\n        #define glScalef(...)                  GLEGetCurrentFunction(glScalef)(__VA_ARGS__)\n        #define glScissor(...)                 GLEGetCurrentFunction(glScissor)(__VA_ARGS__)\n        #define glSelectBuffer(...)            GLEGetCurrentFunction(glSelectBuffer)(__VA_ARGS__)\n        #define glShadeModel(...)              GLEGetCurrentFunction(glShadeModel)(__VA_ARGS__)\n        #define glStencilFunc(...)             GLEGetCurrentFunction(glStencilFunc)(__VA_ARGS__)\n        #define glStencilMask(...)             GLEGetCurrentFunction(glStencilMask)(__VA_ARGS__)\n        #define glStencilOp(...)               GLEGetCurrentFunction(glStencilOp)(__VA_ARGS__)\n        #define glTexCoord1d(...)              GLEGetCurrentFunction(glTexCoord1d)(__VA_ARGS__)\n        #define glTexCoord1dv(...)             GLEGetCurrentFunction(glTexCoord1dv)(__VA_ARGS__)\n        #define glTexCoord1f(...)              GLEGetCurrentFunction(glTexCoord1f)(__VA_ARGS__)\n        #define glTexCoord1fv(...)             GLEGetCurrentFunction(glTexCoord1fv)(__VA_ARGS__)\n        #define glTexCoord1i(...)              GLEGetCurrentFunction(glTexCoord1i)(__VA_ARGS__)\n        #define glTexCoord1iv(...)             GLEGetCurrentFunction(glTexCoord1iv)(__VA_ARGS__)\n        #define glTexCoord1s(...)              GLEGetCurrentFunction(glTexCoord1s)(__VA_ARGS__)\n        #define glTexCoord1sv(...)             GLEGetCurrentFunction(glTexCoord1sv)(__VA_ARGS__)\n        #define glTexCoord2d(...)              GLEGetCurrentFunction(glTexCoord2d)(__VA_ARGS__)\n        #define glTexCoord2dv(...)             GLEGetCurrentFunction(glTexCoord2dv)(__VA_ARGS__)\n        #define glTexCoord2f(...)              GLEGetCurrentFunction(glTexCoord2f)(__VA_ARGS__)\n        #define glTexCoord2fv(...)             GLEGetCurrentFunction(glTexCoord2fv)(__VA_ARGS__)\n        #define glTexCoord2i(...)              GLEGetCurrentFunction(glTexCoord2i)(__VA_ARGS__)\n        #define glTexCoord2iv(...)             GLEGetCurrentFunction(glTexCoord2iv)(__VA_ARGS__)\n        #define glTexCoord2s(...)              GLEGetCurrentFunction(glTexCoord2s)(__VA_ARGS__)\n        #define glTexCoord2sv(...)             GLEGetCurrentFunction(glTexCoord2sv)(__VA_ARGS__)\n        #define glTexCoord3d(...)              GLEGetCurrentFunction(glTexCoord3d)(__VA_ARGS__)\n        #define glTexCoord3dv(...)             GLEGetCurrentFunction(glTexCoord3dv)(__VA_ARGS__)\n        #define glTexCoord3f(...)              GLEGetCurrentFunction(glTexCoord3f)(__VA_ARGS__)\n        #define glTexCoord3fv(...)             GLEGetCurrentFunction(glTexCoord3fv)(__VA_ARGS__)\n        #define glTexCoord3i(...)              GLEGetCurrentFunction(glTexCoord3i)(__VA_ARGS__)\n        #define glTexCoord3iv(...)             GLEGetCurrentFunction(glTexCoord3iv)(__VA_ARGS__)\n        #define glTexCoord3s(...)              GLEGetCurrentFunction(glTexCoord3s)(__VA_ARGS__)\n        #define glTexCoord3sv(...)             GLEGetCurrentFunction(glTexCoord3sv)(__VA_ARGS__)\n        #define glTexCoord4d(...)              GLEGetCurrentFunction(glTexCoord4d)(__VA_ARGS__)\n        #define glTexCoord4dv(...)             GLEGetCurrentFunction(glTexCoord4dv)(__VA_ARGS__)\n        #define glTexCoord4f(...)              GLEGetCurrentFunction(glTexCoord4f)(__VA_ARGS__)\n        #define glTexCoord4fv(...)             GLEGetCurrentFunction(glTexCoord4fv)(__VA_ARGS__)\n        #define glTexCoord4i(...)              GLEGetCurrentFunction(glTexCoord4i)(__VA_ARGS__)\n        #define glTexCoord4iv(...)             GLEGetCurrentFunction(glTexCoord4iv)(__VA_ARGS__)\n        #define glTexCoord4s(...)              GLEGetCurrentFunction(glTexCoord4s)(__VA_ARGS__)\n        #define glTexCoord4sv(...)             GLEGetCurrentFunction(glTexCoord4sv)(__VA_ARGS__)\n        #define glTexCoordPointer(...)         GLEGetCurrentFunction(glTexCoordPointer)(__VA_ARGS__)\n        #define glTexEnvf(...)                 GLEGetCurrentFunction(glTexEnvf)(__VA_ARGS__)\n        #define glTexEnvfv(...)                GLEGetCurrentFunction(glTexEnvfv)(__VA_ARGS__)\n        #define glTexEnvi(...)                 GLEGetCurrentFunction(glTexEnvi)(__VA_ARGS__)\n        #define glTexEnviv(...)                GLEGetCurrentFunction(glTexEnviv)(__VA_ARGS__)\n        #define glTexGend(...)                 GLEGetCurrentFunction(glTexGend)(__VA_ARGS__)\n        #define glTexGendv(...)                GLEGetCurrentFunction(glTexGendv)(__VA_ARGS__)\n        #define glTexGenf(...)                 GLEGetCurrentFunction(glTexGenf)(__VA_ARGS__)\n        #define glTexGenfv(...)                GLEGetCurrentFunction(glTexGenfv)(__VA_ARGS__)\n        #define glTexGeni(...)                 GLEGetCurrentFunction(glTexGeni)(__VA_ARGS__)\n        #define glTexGeniv(...)                GLEGetCurrentFunction(glTexGeniv)(__VA_ARGS__)\n        #define glTexImage1D(...)              GLEGetCurrentFunction(glTexImage1D)(__VA_ARGS__)\n        #define glTexImage2D(...)              GLEGetCurrentFunction(glTexImage2D)(__VA_ARGS__)\n        #define glTexParameterf(...)           GLEGetCurrentFunction(glTexParameterf)(__VA_ARGS__)\n        #define glTexParameterfv(...)          GLEGetCurrentFunction(glTexParameterfv)(__VA_ARGS__)\n        #define glTexParameteri(...)           GLEGetCurrentFunction(glTexParameteri)(__VA_ARGS__)\n        #define glTexParameteriv(...)          GLEGetCurrentFunction(glTexParameteriv)(__VA_ARGS__)\n        #define glTexSubImage1D(...)           GLEGetCurrentFunction(glTexSubImage1D)(__VA_ARGS__)\n        #define glTexSubImage2D(...)           GLEGetCurrentFunction(glTexSubImage2D)(__VA_ARGS__)\n        #define glTranslated(...)              GLEGetCurrentFunction(glTranslated)(__VA_ARGS__)\n        #define glTranslatef(...)              GLEGetCurrentFunction(glTranslatef)(__VA_ARGS__)\n        #define glVertex2d(...)                GLEGetCurrentFunction(glVertex2d)(__VA_ARGS__)\n        #define glVertex2dv(...)               GLEGetCurrentFunction(glVertex2dv)(__VA_ARGS__)\n        #define glVertex2f(...)                GLEGetCurrentFunction(glVertex2f)(__VA_ARGS__)\n        #define glVertex2fv(...)               GLEGetCurrentFunction(glVertex2fv)(__VA_ARGS__)\n        #define glVertex2i(...)                GLEGetCurrentFunction(glVertex2i)(__VA_ARGS__)\n        #define glVertex2iv(...)               GLEGetCurrentFunction(glVertex2iv)(__VA_ARGS__)\n        #define glVertex2s(...)                GLEGetCurrentFunction(glVertex2s)(__VA_ARGS__)\n        #define glVertex2sv(...)               GLEGetCurrentFunction(glVertex2sv)(__VA_ARGS__)\n        #define glVertex3d(...)                GLEGetCurrentFunction(glVertex3d)(__VA_ARGS__)\n        #define glVertex3dv(...)               GLEGetCurrentFunction(glVertex3dv)(__VA_ARGS__)\n        #define glVertex3f(...)                GLEGetCurrentFunction(glVertex3f)(__VA_ARGS__)\n        #define glVertex3fv(...)               GLEGetCurrentFunction(glVertex3fv)(__VA_ARGS__)\n        #define glVertex3i(...)                GLEGetCurrentFunction(glVertex3i)(__VA_ARGS__)\n        #define glVertex3iv(...)               GLEGetCurrentFunction(glVertex3iv)(__VA_ARGS__)\n        #define glVertex3s(...)                GLEGetCurrentFunction(glVertex3s)(__VA_ARGS__)\n        #define glVertex3sv(...)               GLEGetCurrentFunction(glVertex3sv)(__VA_ARGS__)\n        #define glVertex4d(...)                GLEGetCurrentFunction(glVertex4d)(__VA_ARGS__)\n        #define glVertex4dv(...)               GLEGetCurrentFunction(glVertex4dv)(__VA_ARGS__)\n        #define glVertex4f(...)                GLEGetCurrentFunction(glVertex4f)(__VA_ARGS__)\n        #define glVertex4fv(...)               GLEGetCurrentFunction(glVertex4fv)(__VA_ARGS__)\n        #define glVertex4i(...)                GLEGetCurrentFunction(glVertex4i)(__VA_ARGS__)\n        #define glVertex4iv(...)               GLEGetCurrentFunction(glVertex4iv)(__VA_ARGS__)\n        #define glVertex4s(...)                GLEGetCurrentFunction(glVertex4s)(__VA_ARGS__)\n        #define glVertex4sv(...)               GLEGetCurrentFunction(glVertex4sv)(__VA_ARGS__)\n        #define glVertexPointer(...)           GLEGetCurrentFunction(glVertexPointer)(__VA_ARGS__)\n        #define glViewport(...)                GLEGetCurrentFunction(glViewport)(__VA_ARGS__)\n    #else\n        // There is no need to typedef OpenGL 1.1 function types because they are present in all\n        // OpenGL implementations and don't need to be treated dynamically like extensions.\n        GLAPI void            GLAPIENTRY glAccum (GLenum op, GLfloat value);\n        GLAPI void            GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref);\n        GLAPI GLboolean       GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences);\n        GLAPI void            GLAPIENTRY glArrayElement (GLint i);\n        GLAPI void            GLAPIENTRY glBegin (GLenum mode);\n        GLAPI void            GLAPIENTRY glBindTexture (GLenum target, GLuint texture);\n        GLAPI void            GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);\n        GLAPI void            GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);\n        GLAPI void            GLAPIENTRY glCallList (GLuint list);\n        GLAPI void            GLAPIENTRY glCallLists (GLsizei n, GLenum type, const void *lists);\n        GLAPI void            GLAPIENTRY glClear (GLbitfield mask);\n        GLAPI void            GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\n        GLAPI void            GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);\n        GLAPI void            GLAPIENTRY glClearDepth (GLclampd depth);\n        GLAPI void            GLAPIENTRY glClearIndex (GLfloat c);\n        GLAPI void            GLAPIENTRY glClearStencil (GLint s);\n        GLAPI void            GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation);\n        GLAPI void            GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue);\n        GLAPI void            GLAPIENTRY glColor3bv (const GLbyte *v);\n        GLAPI void            GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue);\n        GLAPI void            GLAPIENTRY glColor3dv (const GLdouble *v);\n        GLAPI void            GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue);\n        GLAPI void            GLAPIENTRY glColor3fv (const GLfloat *v);\n        GLAPI void            GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue);\n        GLAPI void            GLAPIENTRY glColor3iv (const GLint *v);\n        GLAPI void            GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue);\n        GLAPI void            GLAPIENTRY glColor3sv (const GLshort *v);\n        GLAPI void            GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue);\n        GLAPI void            GLAPIENTRY glColor3ubv (const GLubyte *v);\n        GLAPI void            GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue);\n        GLAPI void            GLAPIENTRY glColor3uiv (const GLuint *v);\n        GLAPI void            GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue);\n        GLAPI void            GLAPIENTRY glColor3usv (const GLushort *v);\n        GLAPI void            GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);\n        GLAPI void            GLAPIENTRY glColor4bv (const GLbyte *v);\n        GLAPI void            GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);\n        GLAPI void            GLAPIENTRY glColor4dv (const GLdouble *v);\n        GLAPI void            GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);\n        GLAPI void            GLAPIENTRY glColor4fv (const GLfloat *v);\n        GLAPI void            GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha);\n        GLAPI void            GLAPIENTRY glColor4iv (const GLint *v);\n        GLAPI void            GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha);\n        GLAPI void            GLAPIENTRY glColor4sv (const GLshort *v);\n        GLAPI void            GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);\n        GLAPI void            GLAPIENTRY glColor4ubv (const GLubyte *v);\n        GLAPI void            GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha);\n        GLAPI void            GLAPIENTRY glColor4uiv (const GLuint *v);\n        GLAPI void            GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha);\n        GLAPI void            GLAPIENTRY glColor4usv (const GLushort *v);\n        GLAPI void            GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);\n        GLAPI void            GLAPIENTRY glColorMaterial (GLenum face, GLenum mode);\n        GLAPI void            GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer);\n        GLAPI void            GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);\n        GLAPI void            GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border);\n        GLAPI void            GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);\n        GLAPI void            GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\n        GLAPI void            GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\n        GLAPI void            GLAPIENTRY glCullFace (GLenum mode);\n        GLAPI void            GLAPIENTRY glDeleteLists (GLuint list, GLsizei range);\n        GLAPI void            GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);\n        GLAPI void            GLAPIENTRY glDepthFunc (GLenum func);\n        GLAPI void            GLAPIENTRY glDepthMask (GLboolean flag);\n        GLAPI void            GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar);\n        GLAPI void            GLAPIENTRY glDisable (GLenum cap);\n        GLAPI void            GLAPIENTRY glDisableClientState (GLenum array);\n        GLAPI void            GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);\n        GLAPI void            GLAPIENTRY glDrawBuffer (GLenum mode);\n        GLAPI void            GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);\n        GLAPI void            GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);\n        GLAPI void            GLAPIENTRY glEdgeFlag (GLboolean flag);\n        GLAPI void            GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const void *pointer);\n        GLAPI void            GLAPIENTRY glEdgeFlagv (const GLboolean *flag);\n        GLAPI void            GLAPIENTRY glEnable (GLenum cap);\n        GLAPI void            GLAPIENTRY glEnableClientState (GLenum array);\n        GLAPI void            GLAPIENTRY glEnd (void);\n        GLAPI void            GLAPIENTRY glEndList (void);\n        GLAPI void            GLAPIENTRY glEvalCoord1d (GLdouble u);\n        GLAPI void            GLAPIENTRY glEvalCoord1dv (const GLdouble *u);\n        GLAPI void            GLAPIENTRY glEvalCoord1f (GLfloat u);\n        GLAPI void            GLAPIENTRY glEvalCoord1fv (const GLfloat *u);\n        GLAPI void            GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v);\n        GLAPI void            GLAPIENTRY glEvalCoord2dv (const GLdouble *u);\n        GLAPI void            GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v);\n        GLAPI void            GLAPIENTRY glEvalCoord2fv (const GLfloat *u);\n        GLAPI void            GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2);\n        GLAPI void            GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);\n        GLAPI void            GLAPIENTRY glEvalPoint1 (GLint i);\n        GLAPI void            GLAPIENTRY glEvalPoint2 (GLint i, GLint j);\n        GLAPI void            GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer);\n        GLAPI void            GLAPIENTRY glFinish (void);\n        GLAPI void            GLAPIENTRY glFlush (void);\n        GLAPI void            GLAPIENTRY glFogf (GLenum pname, GLfloat param);\n        GLAPI void            GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params);\n        GLAPI void            GLAPIENTRY glFogi (GLenum pname, GLint param);\n        GLAPI void            GLAPIENTRY glFogiv (GLenum pname, const GLint *params);\n        GLAPI void            GLAPIENTRY glFrontFace (GLenum mode);\n        GLAPI void            GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);\n        GLAPI GLuint          GLAPIENTRY glGenLists (GLsizei range);\n        GLAPI void            GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures);\n        GLAPI void            GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params);\n        GLAPI void            GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation);\n        GLAPI void            GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params);\n        GLAPI GLenum          GLAPIENTRY glGetError (void);\n        GLAPI void            GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params);\n        GLAPI void            GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params);\n        GLAPI void            GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params);\n        GLAPI void            GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params);\n        GLAPI void            GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v);\n        GLAPI void            GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v);\n        GLAPI void            GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v);\n        GLAPI void            GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params);\n        GLAPI void            GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params);\n        GLAPI void            GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values);\n        GLAPI void            GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values);\n        GLAPI void            GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values);\n        GLAPI void            GLAPIENTRY glGetPointerv (GLenum pname, void* *params);\n        GLAPI void            GLAPIENTRY glGetPolygonStipple (GLubyte *mask);\n        GLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name);\n        GLAPI void            GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params);\n        GLAPI void            GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params);\n        GLAPI void            GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params);\n        GLAPI void            GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params);\n        GLAPI void            GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params);\n        GLAPI void            GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, void *pixels);\n        GLAPI void            GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params);\n        GLAPI void            GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params);\n        GLAPI void            GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);\n        GLAPI void            GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);\n        GLAPI void            GLAPIENTRY glHint (GLenum target, GLenum mode);\n        GLAPI void            GLAPIENTRY glIndexMask (GLuint mask);\n        GLAPI void            GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const void *pointer);\n        GLAPI void            GLAPIENTRY glIndexd (GLdouble c);\n        GLAPI void            GLAPIENTRY glIndexdv (const GLdouble *c);\n        GLAPI void            GLAPIENTRY glIndexf (GLfloat c);\n        GLAPI void            GLAPIENTRY glIndexfv (const GLfloat *c);\n        GLAPI void            GLAPIENTRY glIndexi (GLint c);\n        GLAPI void            GLAPIENTRY glIndexiv (const GLint *c);\n        GLAPI void            GLAPIENTRY glIndexs (GLshort c);\n        GLAPI void            GLAPIENTRY glIndexsv (const GLshort *c);\n        GLAPI void            GLAPIENTRY glIndexub (GLubyte c);\n        GLAPI void            GLAPIENTRY glIndexubv (const GLubyte *c);\n        GLAPI void            GLAPIENTRY glInitNames (void);\n        GLAPI void            GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const void *pointer);\n        GLAPI GLboolean       GLAPIENTRY glIsEnabled (GLenum cap);\n        GLAPI GLboolean       GLAPIENTRY glIsList (GLuint list);\n        GLAPI GLboolean       GLAPIENTRY glIsTexture (GLuint texture);\n        GLAPI void            GLAPIENTRY glLightModelf (GLenum pname, GLfloat param);\n        GLAPI void            GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params);\n        GLAPI void            GLAPIENTRY glLightModeli (GLenum pname, GLint param);\n        GLAPI void            GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params);\n        GLAPI void            GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param);\n        GLAPI void            GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params);\n        GLAPI void            GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param);\n        GLAPI void            GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params);\n        GLAPI void            GLAPIENTRY glLineStipple (GLint factor, GLushort pattern);\n        GLAPI void            GLAPIENTRY glLineWidth (GLfloat width);\n        GLAPI void            GLAPIENTRY glListBase (GLuint base);\n        GLAPI void            GLAPIENTRY glLoadIdentity (void);\n        GLAPI void            GLAPIENTRY glLoadMatrixd (const GLdouble *m);\n        GLAPI void            GLAPIENTRY glLoadMatrixf (const GLfloat *m);\n        GLAPI void            GLAPIENTRY glLoadName (GLuint name);\n        GLAPI void            GLAPIENTRY glLogicOp (GLenum opcode);\n        GLAPI void            GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);\n        GLAPI void            GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);\n        GLAPI void            GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);\n        GLAPI void            GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);\n        GLAPI void            GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2);\n        GLAPI void            GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2);\n        GLAPI void            GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);\n        GLAPI void            GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);\n        GLAPI void            GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param);\n        GLAPI void            GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params);\n        GLAPI void            GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param);\n        GLAPI void            GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params);\n        GLAPI void            GLAPIENTRY glMatrixMode (GLenum mode);\n        GLAPI void            GLAPIENTRY glMultMatrixd (const GLdouble *m);\n        GLAPI void            GLAPIENTRY glMultMatrixf (const GLfloat *m);\n        GLAPI void            GLAPIENTRY glNewList (GLuint list, GLenum mode);\n        GLAPI void            GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz);\n        GLAPI void            GLAPIENTRY glNormal3bv (const GLbyte *v);\n        GLAPI void            GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz);\n        GLAPI void            GLAPIENTRY glNormal3dv (const GLdouble *v);\n        GLAPI void            GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz);\n        GLAPI void            GLAPIENTRY glNormal3fv (const GLfloat *v);\n        GLAPI void            GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz);\n        GLAPI void            GLAPIENTRY glNormal3iv (const GLint *v);\n        GLAPI void            GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz);\n        GLAPI void            GLAPIENTRY glNormal3sv (const GLshort *v);\n        GLAPI void            GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const void *pointer);\n        GLAPI void            GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);\n        GLAPI void            GLAPIENTRY glPassThrough (GLfloat token);\n        GLAPI void            GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values);\n        GLAPI void            GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values);\n        GLAPI void            GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values);\n        GLAPI void            GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param);\n        GLAPI void            GLAPIENTRY glPixelStorei (GLenum pname, GLint param);\n        GLAPI void            GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param);\n        GLAPI void            GLAPIENTRY glPixelTransferi (GLenum pname, GLint param);\n        GLAPI void            GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor);\n        GLAPI void            GLAPIENTRY glPointSize (GLfloat size);\n        GLAPI void            GLAPIENTRY glPolygonMode (GLenum face, GLenum mode);\n        GLAPI void            GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units);\n        GLAPI void            GLAPIENTRY glPolygonStipple (const GLubyte *mask);\n        GLAPI void            GLAPIENTRY glPopAttrib (void);\n        GLAPI void            GLAPIENTRY glPopClientAttrib (void);\n        GLAPI void            GLAPIENTRY glPopMatrix (void);\n        GLAPI void            GLAPIENTRY glPopName (void);\n        GLAPI void            GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities);\n        GLAPI void            GLAPIENTRY glPushAttrib (GLbitfield mask);\n        GLAPI void            GLAPIENTRY glPushClientAttrib (GLbitfield mask);\n        GLAPI void            GLAPIENTRY glPushMatrix (void);\n        GLAPI void            GLAPIENTRY glPushName (GLuint name);\n        GLAPI void            GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y);\n        GLAPI void            GLAPIENTRY glRasterPos2dv (const GLdouble *v);\n        GLAPI void            GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y);\n        GLAPI void            GLAPIENTRY glRasterPos2fv (const GLfloat *v);\n        GLAPI void            GLAPIENTRY glRasterPos2i (GLint x, GLint y);\n        GLAPI void            GLAPIENTRY glRasterPos2iv (const GLint *v);\n        GLAPI void            GLAPIENTRY glRasterPos2s (GLshort x, GLshort y);\n        GLAPI void            GLAPIENTRY glRasterPos2sv (const GLshort *v);\n        GLAPI void            GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z);\n        GLAPI void            GLAPIENTRY glRasterPos3dv (const GLdouble *v);\n        GLAPI void            GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z);\n        GLAPI void            GLAPIENTRY glRasterPos3fv (const GLfloat *v);\n        GLAPI void            GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z);\n        GLAPI void            GLAPIENTRY glRasterPos3iv (const GLint *v);\n        GLAPI void            GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z);\n        GLAPI void            GLAPIENTRY glRasterPos3sv (const GLshort *v);\n        GLAPI void            GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w);\n        GLAPI void            GLAPIENTRY glRasterPos4dv (const GLdouble *v);\n        GLAPI void            GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w);\n        GLAPI void            GLAPIENTRY glRasterPos4fv (const GLfloat *v);\n        GLAPI void            GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w);\n        GLAPI void            GLAPIENTRY glRasterPos4iv (const GLint *v);\n        GLAPI void            GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w);\n        GLAPI void            GLAPIENTRY glRasterPos4sv (const GLshort *v);\n        GLAPI void            GLAPIENTRY glReadBuffer (GLenum mode);\n        GLAPI void            GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);\n        GLAPI void            GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);\n        GLAPI void            GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2);\n        GLAPI void            GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);\n        GLAPI void            GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2);\n        GLAPI void            GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2);\n        GLAPI void            GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2);\n        GLAPI void            GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2);\n        GLAPI void            GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2);\n        GLAPI GLint           GLAPIENTRY glRenderMode (GLenum mode);\n        GLAPI void            GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z);\n        GLAPI void            GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);\n        GLAPI void            GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z);\n        GLAPI void            GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z);\n        GLAPI void            GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);\n        GLAPI void            GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer);\n        GLAPI void            GLAPIENTRY glShadeModel (GLenum mode);\n        GLAPI void            GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);\n        GLAPI void            GLAPIENTRY glStencilMask (GLuint mask);\n        GLAPI void            GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);\n        GLAPI void            GLAPIENTRY glTexCoord1d (GLdouble s);\n        GLAPI void            GLAPIENTRY glTexCoord1dv (const GLdouble *v);\n        GLAPI void            GLAPIENTRY glTexCoord1f (GLfloat s);\n        GLAPI void            GLAPIENTRY glTexCoord1fv (const GLfloat *v);\n        GLAPI void            GLAPIENTRY glTexCoord1i (GLint s);\n        GLAPI void            GLAPIENTRY glTexCoord1iv (const GLint *v);\n        GLAPI void            GLAPIENTRY glTexCoord1s (GLshort s);\n        GLAPI void            GLAPIENTRY glTexCoord1sv (const GLshort *v);\n        GLAPI void            GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t);\n        GLAPI void            GLAPIENTRY glTexCoord2dv (const GLdouble *v);\n        GLAPI void            GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t);\n        GLAPI void            GLAPIENTRY glTexCoord2fv (const GLfloat *v);\n        GLAPI void            GLAPIENTRY glTexCoord2i (GLint s, GLint t);\n        GLAPI void            GLAPIENTRY glTexCoord2iv (const GLint *v);\n        GLAPI void            GLAPIENTRY glTexCoord2s (GLshort s, GLshort t);\n        GLAPI void            GLAPIENTRY glTexCoord2sv (const GLshort *v);\n        GLAPI void            GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r);\n        GLAPI void            GLAPIENTRY glTexCoord3dv (const GLdouble *v);\n        GLAPI void            GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r);\n        GLAPI void            GLAPIENTRY glTexCoord3fv (const GLfloat *v);\n        GLAPI void            GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r);\n        GLAPI void            GLAPIENTRY glTexCoord3iv (const GLint *v);\n        GLAPI void            GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r);\n        GLAPI void            GLAPIENTRY glTexCoord3sv (const GLshort *v);\n        GLAPI void            GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q);\n        GLAPI void            GLAPIENTRY glTexCoord4dv (const GLdouble *v);\n        GLAPI void            GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q);\n        GLAPI void            GLAPIENTRY glTexCoord4fv (const GLfloat *v);\n        GLAPI void            GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q);\n        GLAPI void            GLAPIENTRY glTexCoord4iv (const GLint *v);\n        GLAPI void            GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q);\n        GLAPI void            GLAPIENTRY glTexCoord4sv (const GLshort *v);\n        GLAPI void            GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const void *pointer);\n        GLAPI void            GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param);\n        GLAPI void            GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params);\n        GLAPI void            GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param);\n        GLAPI void            GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params);\n        GLAPI void            GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param);\n        GLAPI void            GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params);\n        GLAPI void            GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param);\n        GLAPI void            GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params);\n        GLAPI void            GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param);\n        GLAPI void            GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params);\n        GLAPI void            GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels);\n        GLAPI void            GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);\n        GLAPI void            GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);\n        GLAPI void            GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);\n        GLAPI void            GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);\n        GLAPI void            GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);\n        GLAPI void            GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);\n        GLAPI void            GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);\n        GLAPI void            GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z);\n        GLAPI void            GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z);\n        GLAPI void            GLAPIENTRY glVertex2d (GLdouble x, GLdouble y);\n        GLAPI void            GLAPIENTRY glVertex2dv (const GLdouble *v);\n        GLAPI void            GLAPIENTRY glVertex2f (GLfloat x, GLfloat y);\n        GLAPI void            GLAPIENTRY glVertex2fv (const GLfloat *v);\n        GLAPI void            GLAPIENTRY glVertex2i (GLint x, GLint y);\n        GLAPI void            GLAPIENTRY glVertex2iv (const GLint *v);\n        GLAPI void            GLAPIENTRY glVertex2s (GLshort x, GLshort y);\n        GLAPI void            GLAPIENTRY glVertex2sv (const GLshort *v);\n        GLAPI void            GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z);\n        GLAPI void            GLAPIENTRY glVertex3dv (const GLdouble *v);\n        GLAPI void            GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z);\n        GLAPI void            GLAPIENTRY glVertex3fv (const GLfloat *v);\n        GLAPI void            GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z);\n        GLAPI void            GLAPIENTRY glVertex3iv (const GLint *v);\n        GLAPI void            GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z);\n        GLAPI void            GLAPIENTRY glVertex3sv (const GLshort *v);\n        GLAPI void            GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w);\n        GLAPI void            GLAPIENTRY glVertex4dv (const GLdouble *v);\n        GLAPI void            GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w);\n        GLAPI void            GLAPIENTRY glVertex4fv (const GLfloat *v);\n        GLAPI void            GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w);\n        GLAPI void            GLAPIENTRY glVertex4iv (const GLint *v);\n        GLAPI void            GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w);\n        GLAPI void            GLAPIENTRY glVertex4sv (const GLshort *v);\n        GLAPI void            GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const void *pointer);\n        GLAPI void            GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);\n    \n  #endif // GLE_HOOKING_ENABLED\n\n#endif // GL_VERSION_1_1\n\n\n\n\n// OpenGL 1.2+ functions are not declared in Microsoft's gl.h\n\n#ifndef GL_VERSION_1_2\n    #define GL_VERSION_1_2 1\n\n    #define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12\n    #define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13\n    #define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22\n    #define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23\n    #define GL_UNSIGNED_BYTE_3_3_2 0x8032\n    #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033\n    #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034\n    #define GL_UNSIGNED_INT_8_8_8_8 0x8035\n    #define GL_UNSIGNED_INT_10_10_10_2 0x8036\n    #define GL_RESCALE_NORMAL 0x803A\n    #define GL_TEXTURE_BINDING_3D 0x806A\n    #define GL_PACK_SKIP_IMAGES 0x806B\n    #define GL_PACK_IMAGE_HEIGHT 0x806C\n    #define GL_UNPACK_SKIP_IMAGES 0x806D\n    #define GL_UNPACK_IMAGE_HEIGHT 0x806E\n    #define GL_TEXTURE_3D 0x806F\n    #define GL_PROXY_TEXTURE_3D 0x8070\n    #define GL_TEXTURE_DEPTH 0x8071\n    #define GL_TEXTURE_WRAP_R 0x8072\n    #define GL_MAX_3D_TEXTURE_SIZE 0x8073\n    #define GL_BGR 0x80E0\n    #define GL_BGRA 0x80E1\n    #define GL_MAX_ELEMENTS_VERTICES 0x80E8\n    #define GL_MAX_ELEMENTS_INDICES 0x80E9\n    #define GL_CLAMP_TO_EDGE 0x812F\n    #define GL_TEXTURE_MIN_LOD 0x813A\n    #define GL_TEXTURE_MAX_LOD 0x813B\n    #define GL_TEXTURE_BASE_LEVEL 0x813C\n    #define GL_TEXTURE_MAX_LEVEL 0x813D\n    #define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8\n    #define GL_SINGLE_COLOR 0x81F9\n    #define GL_SEPARATE_SPECULAR_COLOR 0x81FA\n    #define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362\n    #define GL_UNSIGNED_SHORT_5_6_5 0x8363\n    #define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364\n    #define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365\n    #define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366\n    #define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367\n    #define GL_ALIASED_POINT_SIZE_RANGE 0x846D\n    #define GL_ALIASED_LINE_WIDTH_RANGE 0x846E\n\n    typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\n    typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices);\n    typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);\n    typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);\n\n    #define glCopyTexSubImage3D GLEGetCurrentFunction(glCopyTexSubImage3D)\n    #define glDrawRangeElements GLEGetCurrentFunction(glDrawRangeElements)\n    #define glTexImage3D        GLEGetCurrentFunction(glTexImage3D)\n    #define glTexSubImage3D     GLEGetCurrentFunction(glTexSubImage3D)\n\n    // OpenGL 2.1 deprecated functions\n    /*\n    typedef void (GLAPIENTRY PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);\n    typedef void (GLAPIENTRY PFNGLBLENDEQUATIONPROC) (GLenum mode);\n    typedef void (GLAPIENTRY PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table);\n    typedef void (GLAPIENTRY PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);\n    typedef void (GLAPIENTRY PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);\n    typedef void (GLAPIENTRY PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\n    typedef void (GLAPIENTRY PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table);\n    typedef void (GLAPIENTRY PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);\n    typedef void (GLAPIENTRY PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\n    typedef void (GLAPIENTRY PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);\n    typedef void (GLAPIENTRY PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);\n    typedef void (GLAPIENTRY PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);\n    typedef void (GLAPIENTRY PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image);\n    typedef void (GLAPIENTRY PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params);\n    typedef void (GLAPIENTRY PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params);\n    typedef void (GLAPIENTRY PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params);\n    typedef void (GLAPIENTRY PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);\n    typedef void (GLAPIENTRY PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);\n    typedef void (GLAPIENTRY PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height);\n    typedef void (GLAPIENTRY PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image);\n    typedef void (GLAPIENTRY PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);\n    typedef void (GLAPIENTRY PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\n    typedef void (GLAPIENTRY PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span);\n    typedef void (GLAPIENTRY PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);\n    typedef void (GLAPIENTRY PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);\n    typedef void (GLAPIENTRY PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);\n    typedef void (GLAPIENTRY PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\n    typedef void (GLAPIENTRY PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);\n    typedef void (GLAPIENTRY PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params);\n    typedef void (GLAPIENTRY PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params);\n    typedef void (GLAPIENTRY PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);\n    typedef void (GLAPIENTRY PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink);\n    typedef void (GLAPIENTRY PFNGLRESETHISTOGRAMPROC) (GLenum target);\n    typedef void (GLAPIENTRY PFNGLRESETMINMAXPROC) (GLenum target);\n    */\n#endif // GL_VERSION_1_2\n\n\n\n#ifndef GL_VERSION_1_3\n    #define GL_VERSION_1_3 1\n\n    #define GL_MULTISAMPLE 0x809D\n    #define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E\n    #define GL_SAMPLE_ALPHA_TO_ONE 0x809F\n    #define GL_SAMPLE_COVERAGE 0x80A0\n    #define GL_SAMPLE_BUFFERS 0x80A8\n    #define GL_SAMPLES 0x80A9\n    #define GL_SAMPLE_COVERAGE_VALUE 0x80AA\n    #define GL_SAMPLE_COVERAGE_INVERT 0x80AB\n    #define GL_CLAMP_TO_BORDER 0x812D\n    #define GL_TEXTURE0 0x84C0\n    #define GL_TEXTURE1 0x84C1\n    #define GL_TEXTURE2 0x84C2\n    #define GL_TEXTURE3 0x84C3\n    #define GL_TEXTURE4 0x84C4\n    #define GL_TEXTURE5 0x84C5\n    #define GL_TEXTURE6 0x84C6\n    #define GL_TEXTURE7 0x84C7\n    #define GL_TEXTURE8 0x84C8\n    #define GL_TEXTURE9 0x84C9\n    #define GL_TEXTURE10 0x84CA\n    #define GL_TEXTURE11 0x84CB\n    #define GL_TEXTURE12 0x84CC\n    #define GL_TEXTURE13 0x84CD\n    #define GL_TEXTURE14 0x84CE\n    #define GL_TEXTURE15 0x84CF\n    #define GL_TEXTURE16 0x84D0\n    #define GL_TEXTURE17 0x84D1\n    #define GL_TEXTURE18 0x84D2\n    #define GL_TEXTURE19 0x84D3\n    #define GL_TEXTURE20 0x84D4\n    #define GL_TEXTURE21 0x84D5\n    #define GL_TEXTURE22 0x84D6\n    #define GL_TEXTURE23 0x84D7\n    #define GL_TEXTURE24 0x84D8\n    #define GL_TEXTURE25 0x84D9\n    #define GL_TEXTURE26 0x84DA\n    #define GL_TEXTURE27 0x84DB\n    #define GL_TEXTURE28 0x84DC\n    #define GL_TEXTURE29 0x84DD\n    #define GL_TEXTURE30 0x84DE\n    #define GL_TEXTURE31 0x84DF\n    #define GL_ACTIVE_TEXTURE 0x84E0\n    #define GL_CLIENT_ACTIVE_TEXTURE 0x84E1\n    #define GL_MAX_TEXTURE_UNITS 0x84E2\n    #define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3\n    #define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4\n    #define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5\n    #define GL_TRANSPOSE_COLOR_MATRIX 0x84E6\n    #define GL_SUBTRACT 0x84E7\n    #define GL_COMPRESSED_ALPHA 0x84E9\n    #define GL_COMPRESSED_LUMINANCE 0x84EA\n    #define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB\n    #define GL_COMPRESSED_INTENSITY 0x84EC\n    #define GL_COMPRESSED_RGB 0x84ED\n    #define GL_COMPRESSED_RGBA 0x84EE\n    #define GL_TEXTURE_COMPRESSION_HINT 0x84EF\n    #define GL_NORMAL_MAP 0x8511\n    #define GL_REFLECTION_MAP 0x8512\n    #define GL_TEXTURE_CUBE_MAP 0x8513\n    #define GL_TEXTURE_BINDING_CUBE_MAP 0x8514\n    #define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515\n    #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516\n    #define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517\n    #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518\n    #define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519\n    #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A\n    #define GL_PROXY_TEXTURE_CUBE_MAP 0x851B\n    #define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C\n    #define GL_COMBINE 0x8570\n    #define GL_COMBINE_RGB 0x8571\n    #define GL_COMBINE_ALPHA 0x8572\n    #define GL_RGB_SCALE 0x8573\n    #define GL_ADD_SIGNED 0x8574\n    #define GL_INTERPOLATE 0x8575\n    #define GL_CONSTANT 0x8576\n    #define GL_PRIMARY_COLOR 0x8577\n    #define GL_PREVIOUS 0x8578\n    #define GL_SOURCE0_RGB 0x8580\n    #define GL_SOURCE1_RGB 0x8581\n    #define GL_SOURCE2_RGB 0x8582\n    #define GL_SOURCE0_ALPHA 0x8588\n    #define GL_SOURCE1_ALPHA 0x8589\n    #define GL_SOURCE2_ALPHA 0x858A\n    #define GL_OPERAND0_RGB 0x8590\n    #define GL_OPERAND1_RGB 0x8591\n    #define GL_OPERAND2_RGB 0x8592\n    #define GL_OPERAND0_ALPHA 0x8598\n    #define GL_OPERAND1_ALPHA 0x8599\n    #define GL_OPERAND2_ALPHA 0x859A\n    #define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0\n    #define GL_TEXTURE_COMPRESSED 0x86A1\n    #define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2\n    #define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3\n    #define GL_DOT3_RGB 0x86AE\n    #define GL_DOT3_RGBA 0x86AF\n    #define GL_MULTISAMPLE_BIT 0x20000000\n\n    typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture);\n    typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture);\n    typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data);\n    typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);\n    typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);\n    typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);\n    typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);\n    typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);\n    typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, void *img);\n    typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]);\n    typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]);\n    typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]);\n    typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);\n    typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v);\n    typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert);\n\n    #define glActiveTexture             GLEGetCurrentFunction(glActiveTexture)\n    #define glClientActiveTexture       GLEGetCurrentFunction(glClientActiveTexture)\n    #define glCompressedTexImage1D      GLEGetCurrentFunction(glCompressedTexImage1D)\n    #define glCompressedTexImage2D      GLEGetCurrentFunction(glCompressedTexImage2D)\n    #define glCompressedTexImage3D      GLEGetCurrentFunction(glCompressedTexImage3D)\n    #define glCompressedTexSubImage1D   GLEGetCurrentFunction(glCompressedTexSubImage1D)\n    #define glCompressedTexSubImage2D   GLEGetCurrentFunction(glCompressedTexSubImage2D)\n    #define glCompressedTexSubImage3D   GLEGetCurrentFunction(glCompressedTexSubImage3D)\n    #define glGetCompressedTexImage     GLEGetCurrentFunction(glGetCompressedTexImage)\n    #define glLoadTransposeMatrixd      GLEGetCurrentFunction(glLoadTransposeMatrixd)\n    #define glLoadTransposeMatrixf      GLEGetCurrentFunction(glLoadTransposeMatrixf)\n    #define glMultTransposeMatrixd      GLEGetCurrentFunction(glMultTransposeMatrixd)\n    #define glMultTransposeMatrixf      GLEGetCurrentFunction(glMultTransposeMatrixf)\n    #define glMultiTexCoord1d           GLEGetCurrentFunction(glMultiTexCoord1d)\n    #define glMultiTexCoord1dv          GLEGetCurrentFunction(glMultiTexCoord1dv)\n    #define glMultiTexCoord1f           GLEGetCurrentFunction(glMultiTexCoord1f)\n    #define glMultiTexCoord1fv          GLEGetCurrentFunction(glMultiTexCoord1fv)\n    #define glMultiTexCoord1i           GLEGetCurrentFunction(glMultiTexCoord1i)\n    #define glMultiTexCoord1iv          GLEGetCurrentFunction(glMultiTexCoord1iv)\n    #define glMultiTexCoord1s           GLEGetCurrentFunction(glMultiTexCoord1s)\n    #define glMultiTexCoord1sv          GLEGetCurrentFunction(glMultiTexCoord1sv)\n    #define glMultiTexCoord2d           GLEGetCurrentFunction(glMultiTexCoord2d)\n    #define glMultiTexCoord2dv          GLEGetCurrentFunction(glMultiTexCoord2dv)\n    #define glMultiTexCoord2f           GLEGetCurrentFunction(glMultiTexCoord2f)\n    #define glMultiTexCoord2fv          GLEGetCurrentFunction(glMultiTexCoord2fv)\n    #define glMultiTexCoord2i           GLEGetCurrentFunction(glMultiTexCoord2i)\n    #define glMultiTexCoord2iv          GLEGetCurrentFunction(glMultiTexCoord2iv)\n    #define glMultiTexCoord2s           GLEGetCurrentFunction(glMultiTexCoord2s)\n    #define glMultiTexCoord2sv          GLEGetCurrentFunction(glMultiTexCoord2sv)\n    #define glMultiTexCoord3d           GLEGetCurrentFunction(glMultiTexCoord3d)\n    #define glMultiTexCoord3dv          GLEGetCurrentFunction(glMultiTexCoord3dv)\n    #define glMultiTexCoord3f           GLEGetCurrentFunction(glMultiTexCoord3f)\n    #define glMultiTexCoord3fv          GLEGetCurrentFunction(glMultiTexCoord3fv)\n    #define glMultiTexCoord3i           GLEGetCurrentFunction(glMultiTexCoord3i)\n    #define glMultiTexCoord3iv          GLEGetCurrentFunction(glMultiTexCoord3iv)\n    #define glMultiTexCoord3s           GLEGetCurrentFunction(glMultiTexCoord3s)\n    #define glMultiTexCoord3sv          GLEGetCurrentFunction(glMultiTexCoord3sv)\n    #define glMultiTexCoord4d           GLEGetCurrentFunction(glMultiTexCoord4d)\n    #define glMultiTexCoord4dv          GLEGetCurrentFunction(glMultiTexCoord4dv)\n    #define glMultiTexCoord4f           GLEGetCurrentFunction(glMultiTexCoord4f)\n    #define glMultiTexCoord4fv          GLEGetCurrentFunction(glMultiTexCoord4fv)\n    #define glMultiTexCoord4i           GLEGetCurrentFunction(glMultiTexCoord4i)\n    #define glMultiTexCoord4iv          GLEGetCurrentFunction(glMultiTexCoord4iv)\n    #define glMultiTexCoord4s           GLEGetCurrentFunction(glMultiTexCoord4s)\n    #define glMultiTexCoord4sv          GLEGetCurrentFunction(glMultiTexCoord4sv)\n    #define glSampleCoverage            GLEGetCurrentFunction(glSampleCoverage)\n\n#endif // GL_VERSION_1_3\n\n\n\n#ifndef GL_VERSION_1_4\n    #define GL_VERSION_1_4 1\n\n    #define GL_BLEND_DST_RGB 0x80C8\n    #define GL_BLEND_SRC_RGB 0x80C9\n    #define GL_BLEND_DST_ALPHA 0x80CA\n    #define GL_BLEND_SRC_ALPHA 0x80CB\n    #define GL_POINT_SIZE_MIN 0x8126\n    #define GL_POINT_SIZE_MAX 0x8127\n    #define GL_POINT_FADE_THRESHOLD_SIZE 0x8128\n    #define GL_POINT_DISTANCE_ATTENUATION 0x8129\n    #define GL_GENERATE_MIPMAP 0x8191\n    #define GL_GENERATE_MIPMAP_HINT 0x8192\n    #define GL_DEPTH_COMPONENT16 0x81A5\n    #define GL_DEPTH_COMPONENT24 0x81A6\n    #define GL_DEPTH_COMPONENT32 0x81A7\n    #define GL_MIRRORED_REPEAT 0x8370\n    #define GL_FOG_COORDINATE_SOURCE 0x8450\n    #define GL_FOG_COORDINATE 0x8451\n    #define GL_FRAGMENT_DEPTH 0x8452\n    #define GL_CURRENT_FOG_COORDINATE 0x8453\n    #define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454\n    #define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455\n    #define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456\n    #define GL_FOG_COORDINATE_ARRAY 0x8457\n    #define GL_COLOR_SUM 0x8458\n    #define GL_CURRENT_SECONDARY_COLOR 0x8459\n    #define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A\n    #define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B\n    #define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C\n    #define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D\n    #define GL_SECONDARY_COLOR_ARRAY 0x845E\n    #define GL_MAX_TEXTURE_LOD_BIAS 0x84FD\n    #define GL_TEXTURE_FILTER_CONTROL 0x8500\n    #define GL_TEXTURE_LOD_BIAS 0x8501\n    #define GL_INCR_WRAP 0x8507\n    #define GL_DECR_WRAP 0x8508\n    #define GL_TEXTURE_DEPTH_SIZE 0x884A\n    #define GL_DEPTH_TEXTURE_MODE 0x884B\n    #define GL_TEXTURE_COMPARE_MODE 0x884C\n    #define GL_TEXTURE_COMPARE_FUNC 0x884D\n    #define GL_COMPARE_R_TO_TEXTURE 0x884E\n\n    typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);\n    typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode);\n    typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);\n    typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer);\n    typedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord);\n    typedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord);\n    typedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord);\n    typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord);\n    typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount);\n    typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const* indices, GLsizei drawcount);\n    typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param);\n    typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params);\n    typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param);\n    typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params);\n    typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue);\n    typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v);\n    typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue);\n    typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v);\n    typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue);\n    typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v);\n    typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue);\n    typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v);\n    typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue);\n    typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v);\n    typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue);\n    typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v);\n    typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue);\n    typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v);\n    typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue);\n    typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v);\n    typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer);\n    typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y);\n    typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p);\n    typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y);\n    typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p);\n    typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y);\n    typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p);\n    typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y);\n    typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p);\n    typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z);\n    typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p);\n    typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z);\n    typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p);\n    typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z);\n    typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p);\n    typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z);\n    typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p);\n\n    #define glBlendColor GLEGetCurrentFunction(glBlendColor)\n    #define glBlendEquation GLEGetCurrentFunction(glBlendEquation)\n    #define glBlendFuncSeparate GLEGetCurrentFunction(glBlendFuncSeparate)\n    #define glFogCoordPointer GLEGetCurrentFunction(glFogCoordPointer)\n    #define glFogCoordd GLEGetCurrentFunction(glFogCoordd)\n    #define glFogCoorddv GLEGetCurrentFunction(glFogCoorddv)\n    #define glFogCoordf GLEGetCurrentFunction(glFogCoordf)\n    #define glFogCoordfv GLEGetCurrentFunction(glFogCoordfv)\n    #define glMultiDrawArrays GLEGetCurrentFunction(glMultiDrawArrays)\n    #define glMultiDrawElements GLEGetCurrentFunction(glMultiDrawElements)\n    #define glPointParameterf GLEGetCurrentFunction(glPointParameterf)\n    #define glPointParameterfv GLEGetCurrentFunction(glPointParameterfv)\n    #define glPointParameteri GLEGetCurrentFunction(glPointParameteri)\n    #define glPointParameteriv GLEGetCurrentFunction(glPointParameteriv)\n    #define glSecondaryColor3b GLEGetCurrentFunction(glSecondaryColor3b)\n    #define glSecondaryColor3bv GLEGetCurrentFunction(glSecondaryColor3bv)\n    #define glSecondaryColor3d GLEGetCurrentFunction(glSecondaryColor3d)\n    #define glSecondaryColor3dv GLEGetCurrentFunction(glSecondaryColor3dv)\n    #define glSecondaryColor3f GLEGetCurrentFunction(glSecondaryColor3f)\n    #define glSecondaryColor3fv GLEGetCurrentFunction(glSecondaryColor3fv)\n    #define glSecondaryColor3i GLEGetCurrentFunction(glSecondaryColor3i)\n    #define glSecondaryColor3iv GLEGetCurrentFunction(glSecondaryColor3iv)\n    #define glSecondaryColor3s GLEGetCurrentFunction(glSecondaryColor3s)\n    #define glSecondaryColor3sv GLEGetCurrentFunction(glSecondaryColor3sv)\n    #define glSecondaryColor3ub GLEGetCurrentFunction(glSecondaryColor3ub)\n    #define glSecondaryColor3ubv GLEGetCurrentFunction(glSecondaryColor3ubv)\n    #define glSecondaryColor3ui GLEGetCurrentFunction(glSecondaryColor3ui)\n    #define glSecondaryColor3uiv GLEGetCurrentFunction(glSecondaryColor3uiv)\n    #define glSecondaryColor3us GLEGetCurrentFunction(glSecondaryColor3us)\n    #define glSecondaryColor3usv GLEGetCurrentFunction(glSecondaryColor3usv)\n    #define glSecondaryColorPointer GLEGetCurrentFunction(glSecondaryColorPointer)\n    #define glWindowPos2d GLEGetCurrentFunction(glWindowPos2d)\n    #define glWindowPos2dv GLEGetCurrentFunction(glWindowPos2dv)\n    #define glWindowPos2f GLEGetCurrentFunction(glWindowPos2f)\n    #define glWindowPos2fv GLEGetCurrentFunction(glWindowPos2fv)\n    #define glWindowPos2i GLEGetCurrentFunction(glWindowPos2i)\n    #define glWindowPos2iv GLEGetCurrentFunction(glWindowPos2iv)\n    #define glWindowPos2s GLEGetCurrentFunction(glWindowPos2s)\n    #define glWindowPos2sv GLEGetCurrentFunction(glWindowPos2sv)\n    #define glWindowPos3d GLEGetCurrentFunction(glWindowPos3d)\n    #define glWindowPos3dv GLEGetCurrentFunction(glWindowPos3dv)\n    #define glWindowPos3f GLEGetCurrentFunction(glWindowPos3f)\n    #define glWindowPos3fv GLEGetCurrentFunction(glWindowPos3fv)\n    #define glWindowPos3i GLEGetCurrentFunction(glWindowPos3i)\n    #define glWindowPos3iv GLEGetCurrentFunction(glWindowPos3iv)\n    #define glWindowPos3s GLEGetCurrentFunction(glWindowPos3s)\n    #define glWindowPos3sv GLEGetCurrentFunction(glWindowPos3sv)\n\n#endif // GL_VERSION_1_4\n\n\n\n#ifndef GL_VERSION_1_5\n    #define GL_VERSION_1_5 1\n\n    #define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE\n    #define GL_FOG_COORD GL_FOG_COORDINATE\n    #define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY\n    #define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING\n    #define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER\n    #define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE\n    #define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE\n    #define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE\n    #define GL_SRC0_ALPHA GL_SOURCE0_ALPHA\n    #define GL_SRC0_RGB GL_SOURCE0_RGB\n    #define GL_SRC1_ALPHA GL_SOURCE1_ALPHA\n    #define GL_SRC1_RGB GL_SOURCE1_RGB\n    #define GL_SRC2_ALPHA GL_SOURCE2_ALPHA\n    #define GL_SRC2_RGB GL_SOURCE2_RGB\n    #define GL_BUFFER_SIZE 0x8764\n    #define GL_BUFFER_USAGE 0x8765\n    #define GL_QUERY_COUNTER_BITS 0x8864\n    #define GL_CURRENT_QUERY 0x8865\n    #define GL_QUERY_RESULT 0x8866\n    #define GL_QUERY_RESULT_AVAILABLE 0x8867\n    #define GL_ARRAY_BUFFER 0x8892\n    #define GL_ELEMENT_ARRAY_BUFFER 0x8893\n    #define GL_ARRAY_BUFFER_BINDING 0x8894\n    #define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895\n    #define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896\n    #define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897\n    #define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898\n    #define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899\n    #define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A\n    #define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B\n    #define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C\n    #define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D\n    #define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E\n    #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F\n    #define GL_READ_ONLY 0x88B8\n    #define GL_WRITE_ONLY 0x88B9\n    #define GL_READ_WRITE 0x88BA\n    #define GL_BUFFER_ACCESS 0x88BB\n    #define GL_BUFFER_MAPPED 0x88BC\n    #define GL_BUFFER_MAP_POINTER 0x88BD\n    #define GL_STREAM_DRAW 0x88E0\n    #define GL_STREAM_READ 0x88E1\n    #define GL_STREAM_COPY 0x88E2\n    #define GL_STATIC_DRAW 0x88E4\n    #define GL_STATIC_READ 0x88E5\n    #define GL_STATIC_COPY 0x88E6\n    #define GL_DYNAMIC_DRAW 0x88E8\n    #define GL_DYNAMIC_READ 0x88E9\n    #define GL_DYNAMIC_COPY 0x88EA\n    #define GL_SAMPLES_PASSED 0x8914\n\n    typedef ptrdiff_t GLintptr;\n    typedef ptrdiff_t GLsizeiptr;\n\n    typedef void      (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id);\n    typedef void      (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);\n    typedef void      (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void* data, GLenum usage);\n    typedef void      (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void* data);\n    typedef void      (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers);\n    typedef void      (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids);\n    typedef void      (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target);\n    typedef void      (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers);\n    typedef void      (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids);\n    typedef void      (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params);\n    typedef void      (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void** params);\n    typedef void      (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void* data);\n    typedef void      (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params);\n    typedef void      (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params);\n    typedef void      (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params);\n    typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer);\n    typedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id);\n    typedef void*     (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access);\n    typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target);\n\n    #define glBeginQuery GLEGetCurrentFunction(glBeginQuery)\n    #define glBindBuffer GLEGetCurrentFunction(glBindBuffer)\n    #define glBufferData GLEGetCurrentFunction(glBufferData)\n    #define glBufferSubData GLEGetCurrentFunction(glBufferSubData)\n    #define glDeleteBuffers GLEGetCurrentFunction(glDeleteBuffers)\n    #define glDeleteQueries GLEGetCurrentFunction(glDeleteQueries)\n    #define glEndQuery GLEGetCurrentFunction(glEndQuery)\n    #define glGenBuffers GLEGetCurrentFunction(glGenBuffers)\n    #define glGenQueries GLEGetCurrentFunction(glGenQueries)\n    #define glGetBufferParameteriv GLEGetCurrentFunction(glGetBufferParameteriv)\n    #define glGetBufferPointerv GLEGetCurrentFunction(glGetBufferPointerv)\n    #define glGetBufferSubData GLEGetCurrentFunction(glGetBufferSubData)\n    #define glGetQueryObjectiv GLEGetCurrentFunction(glGetQueryObjectiv)\n    #define glGetQueryObjectuiv GLEGetCurrentFunction(glGetQueryObjectuiv)\n    #define glGetQueryiv GLEGetCurrentFunction(glGetQueryiv)\n    #define glIsBuffer GLEGetCurrentFunction(glIsBuffer)\n    #define glIsQuery GLEGetCurrentFunction(glIsQuery)\n    #define glMapBuffer GLEGetCurrentFunction(glMapBuffer)\n    #define glUnmapBuffer GLEGetCurrentFunction(glUnmapBuffer)\n\n#endif // GL_VERSION_1_5\n\n\n\n\n#ifndef GL_VERSION_2_0\n    #define GL_VERSION_2_0 1\n\n    #define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION\n    #define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622\n    #define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623\n    #define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624\n    #define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625\n    #define GL_CURRENT_VERTEX_ATTRIB 0x8626\n    #define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642\n    #define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643\n    #define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645\n    #define GL_STENCIL_BACK_FUNC 0x8800\n    #define GL_STENCIL_BACK_FAIL 0x8801\n    #define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802\n    #define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803\n    #define GL_MAX_DRAW_BUFFERS 0x8824\n    #define GL_DRAW_BUFFER0 0x8825\n    #define GL_DRAW_BUFFER1 0x8826\n    #define GL_DRAW_BUFFER2 0x8827\n    #define GL_DRAW_BUFFER3 0x8828\n    #define GL_DRAW_BUFFER4 0x8829\n    #define GL_DRAW_BUFFER5 0x882A\n    #define GL_DRAW_BUFFER6 0x882B\n    #define GL_DRAW_BUFFER7 0x882C\n    #define GL_DRAW_BUFFER8 0x882D\n    #define GL_DRAW_BUFFER9 0x882E\n    #define GL_DRAW_BUFFER10 0x882F\n    #define GL_DRAW_BUFFER11 0x8830\n    #define GL_DRAW_BUFFER12 0x8831\n    #define GL_DRAW_BUFFER13 0x8832\n    #define GL_DRAW_BUFFER14 0x8833\n    #define GL_DRAW_BUFFER15 0x8834\n    #define GL_BLEND_EQUATION_ALPHA 0x883D\n    #define GL_POINT_SPRITE 0x8861\n    #define GL_COORD_REPLACE 0x8862\n    #define GL_MAX_VERTEX_ATTRIBS 0x8869\n    #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A\n    #define GL_MAX_TEXTURE_COORDS 0x8871\n    #define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872\n    #define GL_FRAGMENT_SHADER 0x8B30\n    #define GL_VERTEX_SHADER 0x8B31\n    #define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49\n    #define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A\n    #define GL_MAX_VARYING_FLOATS 0x8B4B\n    #define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C\n    #define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D\n    #define GL_SHADER_TYPE 0x8B4F\n    #define GL_FLOAT_VEC2 0x8B50\n    #define GL_FLOAT_VEC3 0x8B51\n    #define GL_FLOAT_VEC4 0x8B52\n    #define GL_INT_VEC2 0x8B53\n    #define GL_INT_VEC3 0x8B54\n    #define GL_INT_VEC4 0x8B55\n    #define GL_BOOL 0x8B56\n    #define GL_BOOL_VEC2 0x8B57\n    #define GL_BOOL_VEC3 0x8B58\n    #define GL_BOOL_VEC4 0x8B59\n    #define GL_FLOAT_MAT2 0x8B5A\n    #define GL_FLOAT_MAT3 0x8B5B\n    #define GL_FLOAT_MAT4 0x8B5C\n    #define GL_SAMPLER_1D 0x8B5D\n    #define GL_SAMPLER_2D 0x8B5E\n    #define GL_SAMPLER_3D 0x8B5F\n    #define GL_SAMPLER_CUBE 0x8B60\n    #define GL_SAMPLER_1D_SHADOW 0x8B61\n    #define GL_SAMPLER_2D_SHADOW 0x8B62\n    #define GL_DELETE_STATUS 0x8B80\n    #define GL_COMPILE_STATUS 0x8B81\n    #define GL_LINK_STATUS 0x8B82\n    #define GL_VALIDATE_STATUS 0x8B83\n    #define GL_INFO_LOG_LENGTH 0x8B84\n    #define GL_ATTACHED_SHADERS 0x8B85\n    #define GL_ACTIVE_UNIFORMS 0x8B86\n    #define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87\n    #define GL_SHADER_SOURCE_LENGTH 0x8B88\n    #define GL_ACTIVE_ATTRIBUTES 0x8B89\n    #define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A\n    #define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B\n    #define GL_SHADING_LANGUAGE_VERSION 0x8B8C\n    #define GL_CURRENT_PROGRAM 0x8B8D\n    #define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0\n    #define GL_LOWER_LEFT 0x8CA1\n    #define GL_UPPER_LEFT 0x8CA2\n    #define GL_STENCIL_BACK_REF 0x8CA3\n    #define GL_STENCIL_BACK_VALUE_MASK 0x8CA4\n    #define GL_STENCIL_BACK_WRITEMASK 0x8CA5\n\n    typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);\n    typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name);\n    typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);\n    typedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader);\n    typedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void);\n    typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type);\n    typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program);\n    typedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader);\n    typedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);\n    typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);\n    typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs);\n    typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);\n    typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name);\n    typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name);\n    typedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders);\n    typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name);\n    typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog);\n    typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param);\n    typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog);\n    typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLuint obj, GLsizei maxLength, GLsizei* length, GLchar* source);\n    typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param);\n    typedef GLint     (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar* name);\n    typedef void      (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params);\n    typedef void      (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params);\n    typedef void      (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void** pointer);\n    typedef void      (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble* params);\n    typedef void      (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat* params);\n    typedef void      (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint* params);\n    typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program);\n    typedef GLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader);\n    typedef void      (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program);\n    typedef void      (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const* string, const GLint* length);\n    typedef void      (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask);\n    typedef void      (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask);\n    typedef void      (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);\n    typedef void      (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0);\n    typedef void      (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value);\n    typedef void      (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value);\n    typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\n    typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\n    typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);\n    typedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program);\n    typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort* v);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer);\n\n    #define glAttachShader GLEGetCurrentFunction(glAttachShader)\n    #define glBindAttribLocation GLEGetCurrentFunction(glBindAttribLocation)\n    #define glBlendEquationSeparate GLEGetCurrentFunction(glBlendEquationSeparate)\n    #define glCompileShader GLEGetCurrentFunction(glCompileShader)\n    #define glCreateProgram GLEGetCurrentFunction(glCreateProgram)\n    #define glCreateShader GLEGetCurrentFunction(glCreateShader)\n    #define glDeleteProgram GLEGetCurrentFunction(glDeleteProgram)\n    #define glDeleteShader GLEGetCurrentFunction(glDeleteShader)\n    #define glDetachShader GLEGetCurrentFunction(glDetachShader)\n    #define glDisableVertexAttribArray GLEGetCurrentFunction(glDisableVertexAttribArray)\n    #define glDrawBuffers GLEGetCurrentFunction(glDrawBuffers)\n    #define glEnableVertexAttribArray GLEGetCurrentFunction(glEnableVertexAttribArray)\n    #define glGetActiveAttrib GLEGetCurrentFunction(glGetActiveAttrib)\n    #define glGetActiveUniform GLEGetCurrentFunction(glGetActiveUniform)\n    #define glGetAttachedShaders GLEGetCurrentFunction(glGetAttachedShaders)\n    #define glGetAttribLocation GLEGetCurrentFunction(glGetAttribLocation)\n    #define glGetProgramInfoLog GLEGetCurrentFunction(glGetProgramInfoLog)\n    #define glGetProgramiv GLEGetCurrentFunction(glGetProgramiv)\n    #define glGetShaderInfoLog GLEGetCurrentFunction(glGetShaderInfoLog)\n    #define glGetShaderSource GLEGetCurrentFunction(glGetShaderSource)\n    #define glGetShaderiv GLEGetCurrentFunction(glGetShaderiv)\n    #define glGetUniformLocation GLEGetCurrentFunction(glGetUniformLocation)\n    #define glGetUniformfv GLEGetCurrentFunction(glGetUniformfv)\n    #define glGetUniformiv GLEGetCurrentFunction(glGetUniformiv)\n    #define glGetVertexAttribPointerv GLEGetCurrentFunction(glGetVertexAttribPointerv)\n    #define glGetVertexAttribdv GLEGetCurrentFunction(glGetVertexAttribdv)\n    #define glGetVertexAttribfv GLEGetCurrentFunction(glGetVertexAttribfv)\n    #define glGetVertexAttribiv GLEGetCurrentFunction(glGetVertexAttribiv)\n    #define glIsProgram GLEGetCurrentFunction(glIsProgram)\n    #define glIsShader GLEGetCurrentFunction(glIsShader)\n    #define glLinkProgram GLEGetCurrentFunction(glLinkProgram)\n    #define glShaderSource GLEGetCurrentFunction(glShaderSource)\n    #define glStencilFuncSeparate GLEGetCurrentFunction(glStencilFuncSeparate)\n    #define glStencilMaskSeparate GLEGetCurrentFunction(glStencilMaskSeparate)\n    #define glStencilOpSeparate GLEGetCurrentFunction(glStencilOpSeparate)\n    #define glUniform1f GLEGetCurrentFunction(glUniform1f)\n    #define glUniform1fv GLEGetCurrentFunction(glUniform1fv)\n    #define glUniform1i GLEGetCurrentFunction(glUniform1i)\n    #define glUniform1iv GLEGetCurrentFunction(glUniform1iv)\n    #define glUniform2f GLEGetCurrentFunction(glUniform2f)\n    #define glUniform2fv GLEGetCurrentFunction(glUniform2fv)\n    #define glUniform2i GLEGetCurrentFunction(glUniform2i)\n    #define glUniform2iv GLEGetCurrentFunction(glUniform2iv)\n    #define glUniform3f GLEGetCurrentFunction(glUniform3f)\n    #define glUniform3fv GLEGetCurrentFunction(glUniform3fv)\n    #define glUniform3i GLEGetCurrentFunction(glUniform3i)\n    #define glUniform3iv GLEGetCurrentFunction(glUniform3iv)\n    #define glUniform4f GLEGetCurrentFunction(glUniform4f)\n    #define glUniform4fv GLEGetCurrentFunction(glUniform4fv)\n    #define glUniform4i GLEGetCurrentFunction(glUniform4i)\n    #define glUniform4iv GLEGetCurrentFunction(glUniform4iv)\n    #define glUniformMatrix2fv GLEGetCurrentFunction(glUniformMatrix2fv)\n    #define glUniformMatrix3fv GLEGetCurrentFunction(glUniformMatrix3fv)\n    #define glUniformMatrix4fv GLEGetCurrentFunction(glUniformMatrix4fv)\n    #define glUseProgram GLEGetCurrentFunction(glUseProgram)\n    #define glValidateProgram GLEGetCurrentFunction(glValidateProgram)\n    #define glVertexAttrib1d GLEGetCurrentFunction(glVertexAttrib1d)\n    #define glVertexAttrib1dv GLEGetCurrentFunction(glVertexAttrib1dv)\n    #define glVertexAttrib1f GLEGetCurrentFunction(glVertexAttrib1f)\n    #define glVertexAttrib1fv GLEGetCurrentFunction(glVertexAttrib1fv)\n    #define glVertexAttrib1s GLEGetCurrentFunction(glVertexAttrib1s)\n    #define glVertexAttrib1sv GLEGetCurrentFunction(glVertexAttrib1sv)\n    #define glVertexAttrib2d GLEGetCurrentFunction(glVertexAttrib2d)\n    #define glVertexAttrib2dv GLEGetCurrentFunction(glVertexAttrib2dv)\n    #define glVertexAttrib2f GLEGetCurrentFunction(glVertexAttrib2f)\n    #define glVertexAttrib2fv GLEGetCurrentFunction(glVertexAttrib2fv)\n    #define glVertexAttrib2s GLEGetCurrentFunction(glVertexAttrib2s)\n    #define glVertexAttrib2sv GLEGetCurrentFunction(glVertexAttrib2sv)\n    #define glVertexAttrib3d GLEGetCurrentFunction(glVertexAttrib3d)\n    #define glVertexAttrib3dv GLEGetCurrentFunction(glVertexAttrib3dv)\n    #define glVertexAttrib3f GLEGetCurrentFunction(glVertexAttrib3f)\n    #define glVertexAttrib3fv GLEGetCurrentFunction(glVertexAttrib3fv)\n    #define glVertexAttrib3s GLEGetCurrentFunction(glVertexAttrib3s)\n    #define glVertexAttrib3sv GLEGetCurrentFunction(glVertexAttrib3sv)\n    #define glVertexAttrib4Nbv GLEGetCurrentFunction(glVertexAttrib4Nbv)\n    #define glVertexAttrib4Niv GLEGetCurrentFunction(glVertexAttrib4Niv)\n    #define glVertexAttrib4Nsv GLEGetCurrentFunction(glVertexAttrib4Nsv)\n    #define glVertexAttrib4Nub GLEGetCurrentFunction(glVertexAttrib4Nub)\n    #define glVertexAttrib4Nubv GLEGetCurrentFunction(glVertexAttrib4Nubv)\n    #define glVertexAttrib4Nuiv GLEGetCurrentFunction(glVertexAttrib4Nuiv)\n    #define glVertexAttrib4Nusv GLEGetCurrentFunction(glVertexAttrib4Nusv)\n    #define glVertexAttrib4bv GLEGetCurrentFunction(glVertexAttrib4bv)\n    #define glVertexAttrib4d GLEGetCurrentFunction(glVertexAttrib4d)\n    #define glVertexAttrib4dv GLEGetCurrentFunction(glVertexAttrib4dv)\n    #define glVertexAttrib4f GLEGetCurrentFunction(glVertexAttrib4f)\n    #define glVertexAttrib4fv GLEGetCurrentFunction(glVertexAttrib4fv)\n    #define glVertexAttrib4iv GLEGetCurrentFunction(glVertexAttrib4iv)\n    #define glVertexAttrib4s GLEGetCurrentFunction(glVertexAttrib4s)\n    #define glVertexAttrib4sv GLEGetCurrentFunction(glVertexAttrib4sv)\n    #define glVertexAttrib4ubv GLEGetCurrentFunction(glVertexAttrib4ubv)\n    #define glVertexAttrib4uiv GLEGetCurrentFunction(glVertexAttrib4uiv)\n    #define glVertexAttrib4usv GLEGetCurrentFunction(glVertexAttrib4usv)\n    #define glVertexAttribPointer GLEGetCurrentFunction(glVertexAttribPointer)\n\n#endif // GL_VERSION_2_0\n\n\n\n#ifndef GL_VERSION_2_1\n    #define GL_VERSION_2_1 1\n\n    #define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F\n    #define GL_PIXEL_PACK_BUFFER 0x88EB\n    #define GL_PIXEL_UNPACK_BUFFER 0x88EC\n    #define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED\n    #define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF\n    #define GL_FLOAT_MAT2x3 0x8B65\n    #define GL_FLOAT_MAT2x4 0x8B66\n    #define GL_FLOAT_MAT3x2 0x8B67\n    #define GL_FLOAT_MAT3x4 0x8B68\n    #define GL_FLOAT_MAT4x2 0x8B69\n    #define GL_FLOAT_MAT4x3 0x8B6A\n    #define GL_SRGB 0x8C40\n    #define GL_SRGB8 0x8C41\n    #define GL_SRGB_ALPHA 0x8C42\n    #define GL_SRGB8_ALPHA8 0x8C43\n    #define GL_SLUMINANCE_ALPHA 0x8C44\n    #define GL_SLUMINANCE8_ALPHA8 0x8C45\n    #define GL_SLUMINANCE 0x8C46\n    #define GL_SLUMINANCE8 0x8C47\n    #define GL_COMPRESSED_SRGB 0x8C48\n    #define GL_COMPRESSED_SRGB_ALPHA 0x8C49\n    #define GL_COMPRESSED_SLUMINANCE 0x8C4A\n    #define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B\n\n    typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n    typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n    typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n    typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n    typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n    typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);\n\n    #define glUniformMatrix2x3fv GLEGetCurrentFunction(glUniformMatrix2x3fv)\n    #define glUniformMatrix2x4fv GLEGetCurrentFunction(glUniformMatrix2x4fv)\n    #define glUniformMatrix3x2fv GLEGetCurrentFunction(glUniformMatrix3x2fv)\n    #define glUniformMatrix3x4fv GLEGetCurrentFunction(glUniformMatrix3x4fv)\n    #define glUniformMatrix4x2fv GLEGetCurrentFunction(glUniformMatrix4x2fv)\n    #define glUniformMatrix4x3fv GLEGetCurrentFunction(glUniformMatrix4x3fv)\n\n#endif // GL_VERSION_2_1\n\n\n\n\n#ifndef GL_VERSION_3_0\n    #define GL_VERSION_3_0 1\n\n    #define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0\n    #define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1\n    #define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2\n    #define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3\n    #define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4\n    #define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5\n    #define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB\n    #define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES\n    #define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS\n    #define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001\n    #define GL_MAJOR_VERSION 0x821B\n    #define GL_MINOR_VERSION 0x821C\n    #define GL_NUM_EXTENSIONS 0x821D\n    #define GL_CONTEXT_FLAGS 0x821E\n    #define GL_DEPTH_BUFFER 0x8223\n    #define GL_STENCIL_BUFFER 0x8224\n    #define GL_RGBA32F 0x8814\n    #define GL_RGB32F 0x8815\n    #define GL_RGBA16F 0x881A\n    #define GL_RGB16F 0x881B\n    #define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD\n    #define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF\n    #define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904\n    #define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905\n    #define GL_CLAMP_VERTEX_COLOR 0x891A\n    #define GL_CLAMP_FRAGMENT_COLOR 0x891B\n    #define GL_CLAMP_READ_COLOR 0x891C\n    #define GL_FIXED_ONLY 0x891D\n    #define GL_TEXTURE_RED_TYPE 0x8C10\n    #define GL_TEXTURE_GREEN_TYPE 0x8C11\n    #define GL_TEXTURE_BLUE_TYPE 0x8C12\n    #define GL_TEXTURE_ALPHA_TYPE 0x8C13\n    #define GL_TEXTURE_LUMINANCE_TYPE 0x8C14\n    #define GL_TEXTURE_INTENSITY_TYPE 0x8C15\n    #define GL_TEXTURE_DEPTH_TYPE 0x8C16\n    #define GL_TEXTURE_1D_ARRAY 0x8C18\n    #define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19\n    #define GL_TEXTURE_2D_ARRAY 0x8C1A\n    #define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B\n    #define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C\n    #define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D\n    #define GL_R11F_G11F_B10F 0x8C3A\n    #define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B\n    #define GL_RGB9_E5 0x8C3D\n    #define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E\n    #define GL_TEXTURE_SHARED_SIZE 0x8C3F\n    #define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76\n    #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F\n    #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80\n    #define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83\n    #define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84\n    #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85\n    #define GL_PRIMITIVES_GENERATED 0x8C87\n    #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88\n    #define GL_RASTERIZER_DISCARD 0x8C89\n    #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A\n    #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B\n    #define GL_INTERLEAVED_ATTRIBS 0x8C8C\n    #define GL_SEPARATE_ATTRIBS 0x8C8D\n    #define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E\n    #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F\n    #define GL_RGBA32UI 0x8D70\n    #define GL_RGB32UI 0x8D71\n    #define GL_RGBA16UI 0x8D76\n    #define GL_RGB16UI 0x8D77\n    #define GL_RGBA8UI 0x8D7C\n    #define GL_RGB8UI 0x8D7D\n    #define GL_RGBA32I 0x8D82\n    #define GL_RGB32I 0x8D83\n    #define GL_RGBA16I 0x8D88\n    #define GL_RGB16I 0x8D89\n    #define GL_RGBA8I 0x8D8E\n    #define GL_RGB8I 0x8D8F\n    #define GL_RED_INTEGER 0x8D94\n    #define GL_GREEN_INTEGER 0x8D95\n    #define GL_BLUE_INTEGER 0x8D96\n    #define GL_ALPHA_INTEGER 0x8D97\n    #define GL_RGB_INTEGER 0x8D98\n    #define GL_RGBA_INTEGER 0x8D99\n    #define GL_BGR_INTEGER 0x8D9A\n    #define GL_BGRA_INTEGER 0x8D9B\n    #define GL_SAMPLER_1D_ARRAY 0x8DC0\n    #define GL_SAMPLER_2D_ARRAY 0x8DC1\n    #define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3\n    #define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4\n    #define GL_SAMPLER_CUBE_SHADOW 0x8DC5\n    #define GL_UNSIGNED_INT_VEC2 0x8DC6\n    #define GL_UNSIGNED_INT_VEC3 0x8DC7\n    #define GL_UNSIGNED_INT_VEC4 0x8DC8\n    #define GL_INT_SAMPLER_1D 0x8DC9\n    #define GL_INT_SAMPLER_2D 0x8DCA\n    #define GL_INT_SAMPLER_3D 0x8DCB\n    #define GL_INT_SAMPLER_CUBE 0x8DCC\n    #define GL_INT_SAMPLER_1D_ARRAY 0x8DCE\n    #define GL_INT_SAMPLER_2D_ARRAY 0x8DCF\n    #define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1\n    #define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2\n    #define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3\n    #define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4\n    #define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6\n    #define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7\n    #define GL_QUERY_WAIT 0x8E13\n    #define GL_QUERY_NO_WAIT 0x8E14\n    #define GL_QUERY_BY_REGION_WAIT 0x8E15\n    #define GL_QUERY_BY_REGION_NO_WAIT 0x8E16\n\n    typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode);\n    typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode);\n    typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint colorNumber, const GLchar* name);\n    typedef void (GLAPIENTRY * PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp);\n    typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil);\n    typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawBuffer, const GLfloat* value);\n    typedef void (GLAPIENTRY * PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawBuffer, const GLint* value);\n    typedef void (GLAPIENTRY * PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawBuffer, const GLuint* value);\n    typedef void (GLAPIENTRY * PFNGLCOLORMASKIPROC) (GLuint buf, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);\n    typedef void (GLAPIENTRY * PFNGLDISABLEIPROC) (GLenum cap, GLuint index);\n    typedef void (GLAPIENTRY * PFNGLENABLEIPROC) (GLenum cap, GLuint index);\n    typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERPROC) (void);\n    typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKPROC) (void);\n    typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\n    typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer);\n    typedef void (GLAPIENTRY * PFNGLGETBOOLEANI_VPROC) (GLenum pname, GLuint index, GLboolean* data);\n    typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint* data);\n    typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar* name);\n    typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGIPROC) (GLenum name, GLuint index);\n    typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint* params);\n    typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint* params);\n    typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name);\n    typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint* params);\n    typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint* params);\n    typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint* params);\n    typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIPROC) (GLenum cap, GLuint index);\n    typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint* params);\n    typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint* params);\n    typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint* value);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint* value);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint* value);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\n    typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint* value);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint v0);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint* v0);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint v0);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint* v0);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint v0, GLint v1);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint* v0);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint v0, GLuint v1);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint* v0);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint v0, GLint v1, GLint v2);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint* v0);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint* v0);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte* v0);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint v0, GLint v1, GLint v2, GLint v3);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint* v0);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort* v0);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte* v0);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint* v0);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort* v0);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void*pointer);\n\n    #define glBeginConditionalRender GLEGetCurrentFunction(glBeginConditionalRender)\n    #define glBeginTransformFeedback GLEGetCurrentFunction(glBeginTransformFeedback)\n    #define glBindFragDataLocation GLEGetCurrentFunction(glBindFragDataLocation)\n    #define glClampColor GLEGetCurrentFunction(glClampColor)\n    #define glClearBufferfi GLEGetCurrentFunction(glClearBufferfi)\n    #define glClearBufferfv GLEGetCurrentFunction(glClearBufferfv)\n    #define glClearBufferiv GLEGetCurrentFunction(glClearBufferiv)\n    #define glClearBufferuiv GLEGetCurrentFunction(glClearBufferuiv)\n    #define glColorMaski GLEGetCurrentFunction(glColorMaski)\n    #define glDisablei GLEGetCurrentFunction(glDisablei)\n    #define glEnablei GLEGetCurrentFunction(glEnablei)\n    #define glEndConditionalRender GLEGetCurrentFunction(glEndConditionalRender)\n    #define glEndTransformFeedback GLEGetCurrentFunction(glEndTransformFeedback)\n    #define glGetBooleani_v GLEGetCurrentFunction(glGetBooleani_v)\n    #define glGetIntegeri_v GLEGetCurrentFunction(glGetIntegeri_v)\n    #define glGetFragDataLocation GLEGetCurrentFunction(glGetFragDataLocation)\n    #define glGetStringi GLEGetCurrentFunction(glGetStringi)\n    #define glGetTexParameterIiv GLEGetCurrentFunction(glGetTexParameterIiv)\n    #define glGetTexParameterIuiv GLEGetCurrentFunction(glGetTexParameterIuiv)\n    #define glGetTransformFeedbackVarying GLEGetCurrentFunction(glGetTransformFeedbackVarying)\n    #define glGetUniformuiv GLEGetCurrentFunction(glGetUniformuiv)\n    #define glGetVertexAttribIiv GLEGetCurrentFunction(glGetVertexAttribIiv)\n    #define glGetVertexAttribIuiv GLEGetCurrentFunction(glGetVertexAttribIuiv)\n    #define glIsEnabledi GLEGetCurrentFunction(glIsEnabledi)\n    #define glTexParameterIiv GLEGetCurrentFunction(glTexParameterIiv)\n    #define glTexParameterIuiv GLEGetCurrentFunction(glTexParameterIuiv)\n    #define glTransformFeedbackVaryings GLEGetCurrentFunction(glTransformFeedbackVaryings)\n    #define glUniform1ui GLEGetCurrentFunction(glUniform1ui)\n    #define glUniform1uiv GLEGetCurrentFunction(glUniform1uiv)\n    #define glUniform2ui GLEGetCurrentFunction(glUniform2ui)\n    #define glUniform2uiv GLEGetCurrentFunction(glUniform2uiv)\n    #define glUniform3ui GLEGetCurrentFunction(glUniform3ui)\n    #define glUniform3uiv GLEGetCurrentFunction(glUniform3uiv)\n    #define glUniform4ui GLEGetCurrentFunction(glUniform4ui)\n    #define glUniform4uiv GLEGetCurrentFunction(glUniform4uiv)\n    #define glVertexAttribI1i GLEGetCurrentFunction(glVertexAttribI1i)\n    #define glVertexAttribI1iv GLEGetCurrentFunction(glVertexAttribI1iv)\n    #define glVertexAttribI1ui GLEGetCurrentFunction(glVertexAttribI1ui)\n    #define glVertexAttribI1uiv GLEGetCurrentFunction(glVertexAttribI1uiv)\n    #define glVertexAttribI2i GLEGetCurrentFunction(glVertexAttribI2i)\n    #define glVertexAttribI2iv GLEGetCurrentFunction(glVertexAttribI2iv)\n    #define glVertexAttribI2ui GLEGetCurrentFunction(glVertexAttribI2ui)\n    #define glVertexAttribI2uiv GLEGetCurrentFunction(glVertexAttribI2uiv)\n    #define glVertexAttribI3i GLEGetCurrentFunction(glVertexAttribI3i)\n    #define glVertexAttribI3iv GLEGetCurrentFunction(glVertexAttribI3iv)\n    #define glVertexAttribI3ui GLEGetCurrentFunction(glVertexAttribI3ui)\n    #define glVertexAttribI3uiv GLEGetCurrentFunction(glVertexAttribI3uiv)\n    #define glVertexAttribI4bv GLEGetCurrentFunction(glVertexAttribI4bv)\n    #define glVertexAttribI4i GLEGetCurrentFunction(glVertexAttribI4i)\n    #define glVertexAttribI4iv GLEGetCurrentFunction(glVertexAttribI4iv)\n    #define glVertexAttribI4sv GLEGetCurrentFunction(glVertexAttribI4sv)\n    #define glVertexAttribI4ubv GLEGetCurrentFunction(glVertexAttribI4ubv)\n    #define glVertexAttribI4ui GLEGetCurrentFunction(glVertexAttribI4ui)\n    #define glVertexAttribI4uiv GLEGetCurrentFunction(glVertexAttribI4uiv)\n    #define glVertexAttribI4usv GLEGetCurrentFunction(glVertexAttribI4usv)\n    #define glVertexAttribIPointer GLEGetCurrentFunction(glVertexAttribIPointer)\n\n#endif // GL_VERSION_3_0\n\n\n\n\n#ifndef GL_VERSION_3_1\n    #define GL_VERSION_3_1 1\n\n    #define GL_TEXTURE_RECTANGLE 0x84F5\n    #define GL_TEXTURE_BINDING_RECTANGLE 0x84F6\n    #define GL_PROXY_TEXTURE_RECTANGLE 0x84F7\n    #define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8\n    #define GL_SAMPLER_2D_RECT 0x8B63\n    #define GL_SAMPLER_2D_RECT_SHADOW 0x8B64\n    #define GL_TEXTURE_BUFFER 0x8C2A\n    #define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B\n    #define GL_TEXTURE_BINDING_BUFFER 0x8C2C\n    #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D\n    #define GL_TEXTURE_BUFFER_FORMAT 0x8C2E\n    #define GL_SAMPLER_BUFFER 0x8DC2\n    #define GL_INT_SAMPLER_2D_RECT 0x8DCD\n    #define GL_INT_SAMPLER_BUFFER 0x8DD0\n    #define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5\n    #define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8\n    #define GL_RED_SNORM 0x8F90\n    #define GL_RG_SNORM 0x8F91\n    #define GL_RGB_SNORM 0x8F92\n    #define GL_RGBA_SNORM 0x8F93\n    #define GL_R8_SNORM 0x8F94\n    #define GL_RG8_SNORM 0x8F95\n    #define GL_RGB8_SNORM 0x8F96\n    #define GL_RGBA8_SNORM 0x8F97\n    #define GL_R16_SNORM 0x8F98\n    #define GL_RG16_SNORM 0x8F99\n    #define GL_RGB16_SNORM 0x8F9A\n    #define GL_RGBA16_SNORM 0x8F9B\n    #define GL_SIGNED_NORMALIZED 0x8F9C\n    #define GL_PRIMITIVE_RESTART 0x8F9D\n    #define GL_PRIMITIVE_RESTART_INDEX 0x8F9E\n    #define GL_BUFFER_ACCESS_FLAGS 0x911F\n    #define GL_BUFFER_MAP_LENGTH 0x9120\n    #define GL_BUFFER_MAP_OFFSET 0x9121\n\n    typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);\n    typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount);\n    typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint buffer);\n    typedef void (GLAPIENTRY * PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalFormat, GLuint buffer);\n\n    #define glDrawArraysInstanced GLEGetCurrentFunction(glDrawArraysInstanced)\n    #define glDrawElementsInstanced GLEGetCurrentFunction(glDrawElementsInstanced)\n    #define glPrimitiveRestartIndex GLEGetCurrentFunction(glPrimitiveRestartIndex)\n    #define glTexBuffer GLEGetCurrentFunction(glTexBuffer)\n\n#endif // GL_VERSION_3_1\n\n\n\n#ifndef GL_VERSION_3_2\n    #define GL_VERSION_3_2 1\n\n    #define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001\n    #define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002\n    #define GL_LINES_ADJACENCY 0x000A\n    #define GL_LINE_STRIP_ADJACENCY 0x000B\n    #define GL_TRIANGLES_ADJACENCY 0x000C\n    #define GL_TRIANGLE_STRIP_ADJACENCY 0x000D\n    #define GL_PROGRAM_POINT_SIZE 0x8642\n    #define GL_GEOMETRY_VERTICES_OUT 0x8916\n    #define GL_GEOMETRY_INPUT_TYPE 0x8917\n    #define GL_GEOMETRY_OUTPUT_TYPE 0x8918\n    #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29\n    #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7\n    #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8\n    #define GL_GEOMETRY_SHADER 0x8DD9\n    #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF\n    #define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0\n    #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1\n    #define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122\n    #define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123\n    #define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124\n    #define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125\n    #define GL_CONTEXT_PROFILE_MASK 0x9126\n\n    typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level);\n    typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum value, GLint64 * data);\n    typedef void (GLAPIENTRY * PFNGLGETINTEGER64I_VPROC) (GLenum pname, GLuint index, GLint64 * data);\n\n    #define glFramebufferTexture GLEGetCurrentFunction(glFramebufferTexture)\n    #define glGetBufferParameteri64v GLEGetCurrentFunction(glGetBufferParameteri64v)\n    #define glGetInteger64i_v GLEGetCurrentFunction(glGetInteger64i_v)\n    \n#endif // GL_VERSION_3_2\n\n\n\n#ifndef GL_VERSION_3_3\n    #define GL_VERSION_3_3 1\n\n    #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE\n    #define GL_RGB10_A2UI 0x906F\n\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor);\n\n    #define glVertexAttribDivisor GLEGetCurrentFunction(glVertexAttribDivisor)\n#endif\n\n\n\n#ifndef GL_VERSION_4_0\n    #define GL_VERSION_4_0 1\n\n    #define GL_SAMPLE_SHADING 0x8C36\n    #define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37\n    #define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E\n    #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F\n    #define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS 0x8F9F\n    #define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009\n    #define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A\n    #define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B\n    #define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C\n    #define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D\n    #define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E\n    #define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F\n\n    typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);\n    typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode);\n    typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);\n    typedef void (GLAPIENTRY * PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst);\n    typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGPROC) (GLclampf value);\n\n    #define glBlendEquationSeparatei GLEGetCurrentFunction(glBlendEquationSeparatei)\n    #define glBlendEquationi GLEGetCurrentFunction(glBlendEquationi)\n    #define glBlendFuncSeparatei GLEGetCurrentFunction(glBlendFuncSeparatei)\n    #define glBlendFunci GLEGetCurrentFunction(glBlendFunci)\n    #define glMinSampleShading GLEGetCurrentFunction(glMinSampleShading)\n\n#endif // GL_VERSION_4_0\n\n\n\n\n#ifndef GL_VERSION_4_1\n    #define GL_VERSION_4_1 1\n    // Empty\n#endif\n\n\n\n#ifndef GL_VERSION_4_2\n    #define GL_VERSION_4_2 1\n\n    #define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C\n    #define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D\n    #define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E\n    #define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F\n#endif\n\n\n\n#ifndef GL_VERSION_4_3\n    #define GL_VERSION_4_3 1\n    \n    #define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9\n    #define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E\n#endif\n\n\n\n#ifndef GL_VERSION_4_4\n    #define GL_VERSION_4_4 1\n    \n    #define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221\n    #define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5\n    #define GL_TEXTURE_BUFFER_BINDING 0x8C2A\n#endif\n\n\n\n#ifndef GL_VERSION_4_5\n    #define GL_VERSION_4_5 1\n    // Empty\n#endif\n\n\n\n#ifndef GL_AMD_debug_output\n    #define GL_AMD_debug_output 1\n\n    #define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143\n    #define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144\n    #define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145\n    #define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146\n    #define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147\n    #define GL_DEBUG_SEVERITY_LOW_AMD 0x9148\n    #define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149\n    #define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A\n    #define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B\n    #define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C\n    #define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D\n    #define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E\n    #define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F\n    #define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150\n\n    typedef void (GLAPIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, void* userParam);\n\n    typedef void   (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam);\n    typedef void   (GLAPIENTRY * PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled);\n    typedef void   (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar* buf);\n    typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, GLchar* message);\n\n    #define glDebugMessageCallbackAMD GLEGetCurrentFunction(glDebugMessageCallbackAMD)\n    #define glDebugMessageEnableAMD   GLEGetCurrentFunction(glDebugMessageEnableAMD)\n    #define glDebugMessageInsertAMD   GLEGetCurrentFunction(glDebugMessageInsertAMD)\n    #define glGetDebugMessageLogAMD   GLEGetCurrentFunction(glGetDebugMessageLogAMD)\n\n    #define GLE_AMD_debug_output GLEGetCurrentVariable(gle_AMD_debug_output)\n\n#endif // GL_AMD_debug_output\n\n\n\n/* Disabled until needed\n#ifndef GL_AMD_performance_monitor\n    #define GL_AMD_performance_monitor 1\n\n    #define GL_COUNTER_TYPE_AMD 0x8BC0\n    #define GL_COUNTER_RANGE_AMD 0x8BC1\n    #define GL_UNSIGNED_INT64_AMD 0x8BC2\n    #define GL_PERCENTAGE_AMD 0x8BC3\n    #define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4\n    #define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5\n    #define GL_PERFMON_RESULT_AMD 0x8BC6\n\n    typedef void (GLAPIENTRY * PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor);\n    typedef void (GLAPIENTRY * PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors);\n    typedef void (GLAPIENTRY * PFNGLENDPERFMONITORAMDPROC) (GLuint monitor);\n    typedef void (GLAPIENTRY * PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors);\n    typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint *bytesWritten);\n    typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data);\n    typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, GLchar *counterString);\n    typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint* numCounters, GLint *maxActiveCounters, GLsizei countersSize, GLuint *counters);\n    typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei* length, GLchar *groupString);\n    typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint* numGroups, GLsizei groupsSize, GLuint *groups);\n    typedef void (GLAPIENTRY * PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList);\n\n    #define glBeginPerfMonitorAMD GLEGetCurrentFunction(glBeginPerfMonitorAMD)\n    #define glDeletePerfMonitorsAMD GLEGetCurrentFunction(glDeletePerfMonitorsAMD)\n    #define glEndPerfMonitorAMD GLEGetCurrentFunction(glEndPerfMonitorAMD)\n    #define glGenPerfMonitorsAMD GLEGetCurrentFunction(glGenPerfMonitorsAMD)\n    #define glGetPerfMonitorCounterDataAMD GLEGetCurrentFunction(glGetPerfMonitorCounterDataAMD)\n    #define glGetPerfMonitorCounterInfoAMD GLEGetCurrentFunction(glGetPerfMonitorCounterInfoAMD)\n    #define glGetPerfMonitorCounterStringAMD GLEGetCurrentFunction(glGetPerfMonitorCounterStringAMD)\n    #define glGetPerfMonitorCountersAMD GLEGetCurrentFunction(glGetPerfMonitorCountersAMD)\n    #define glGetPerfMonitorGroupStringAMD GLEGetCurrentFunction(glGetPerfMonitorGroupStringAMD)\n    #define glGetPerfMonitorGroupsAMD GLEGetCurrentFunction(glGetPerfMonitorGroupsAMD)\n    #define glSelectPerfMonitorCountersAMD GLEGetCurrentFunction(glSelectPerfMonitorCountersAMD)\n\n    #define GLE_AMD_performance_monitor GLEGetCurrentVariable(gle_AMD_performance_monitor)\n\n#endif // GL_AMD_performance_monitor\n*/\n\n\n#if defined(GLE_CGL_ENABLED)\n    #ifndef GL_APPLE_aux_depth_stencil\n        #define GL_APPLE_aux_depth_stencil 1\n\n        #define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14g\n\n        #define GLE_APPLE_aux_depth_stencil GLEGetCurrentVariable(gle_APPLE_aux_depth_stencil)\n    #endif\n\n\n\n    #ifndef GL_APPLE_client_storage\n        #define GL_APPLE_client_storage 1\n\n        #define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2\n\n        #define GLE_APPLE_client_storage GLEGetCurrentVariable(gle_APPLE_client_storage)\n    #endif\n\n\n\n    #ifndef GL_APPLE_element_array\n        #define GL_APPLE_element_array 1\n\n        #define GL_ELEMENT_ARRAY_APPLE 0x8A0C\n        #define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D\n        #define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E\n\n        typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count);\n        typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count);\n        typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer);\n        typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount);\n        typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount);\n\n        #define glDrawElementArrayAPPLE GLEGetCurrentFunction(glDrawElementArrayAPPLE)\n        #define glDrawRangeElementArrayAPPLE GLEGetCurrentFunction(glDrawRangeElementArrayAPPLE)\n        #define glElementPointerAPPLE GLEGetCurrentFunction(glElementPointerAPPLE)\n        #define glMultiDrawElementArrayAPPLE GLEGetCurrentFunction(glMultiDrawElementArrayAPPLE)\n        #define glMultiDrawRangeElementArrayAPPLE GLEGetCurrentFunction(glMultiDrawRangeElementArrayAPPLE)\n\n        #define GLE_APPLE_element_array GLEGetCurrentVariable(gle_APPLE_element_array)\n    #endif\n\n\n\n    #ifndef GL_APPLE_fence\n        #define GL_APPLE_fence 1\n\n        #define GL_DRAW_PIXELS_APPLE 0x8A0A\n        #define GL_FENCE_APPLE 0x8A0B\n\n        typedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences);\n        typedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence);\n        typedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name);\n        typedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences);\n        typedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence);\n        typedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence);\n        typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence);\n        typedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name);\n\n        #define glDeleteFencesAPPLE GLEGetCurrentFunction(glDeleteFencesAPPLE)\n        #define glFinishFenceAPPLE GLEGetCurrentFunction(glFinishFenceAPPLE)\n        #define glFinishObjectAPPLE GLEGetCurrentFunction(glFinishObjectAPPLE)\n        #define glGenFencesAPPLE GLEGetCurrentFunction(glGenFencesAPPLE)\n        #define glIsFenceAPPLE GLEGetCurrentFunction(glIsFenceAPPLE)\n        #define glSetFenceAPPLE GLEGetCurrentFunction(glSetFenceAPPLE)\n        #define glTestFenceAPPLE GLEGetCurrentFunction(glTestFenceAPPLE)\n        #define glTestObjectAPPLE GLEGetCurrentFunction(glTestObjectAPPLE)\n\n        #define GLE_APPLE_fence GLEGetCurrentVariable(gle_APPLE_fence)\n\n    #endif\n\n\n\n    #ifndef GL_APPLE_float_pixels\n        #define GL_APPLE_float_pixels 1\n\n        #define GL_HALF_APPLE 0x140B\n        #define GL_RGBA_FLOAT32_APPLE 0x8814\n        #define GL_RGB_FLOAT32_APPLE 0x8815\n        #define GL_ALPHA_FLOAT32_APPLE 0x8816\n        #define GL_INTENSITY_FLOAT32_APPLE 0x8817\n        #define GL_LUMINANCE_FLOAT32_APPLE 0x8818\n        #define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819\n        #define GL_RGBA_FLOAT16_APPLE 0x881A\n        #define GL_RGB_FLOAT16_APPLE 0x881B\n        #define GL_ALPHA_FLOAT16_APPLE 0x881C\n        #define GL_INTENSITY_FLOAT16_APPLE 0x881D\n        #define GL_LUMINANCE_FLOAT16_APPLE 0x881E\n        #define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F\n        #define GL_COLOR_FLOAT_APPLE 0x8A0F\n\n        #define GLE_APPLE_float_pixels GLEGetCurrentVariable(gle_APPLE_float_pixels)\n    #endif\n\n\n\n    #ifndef GL_APPLE_flush_buffer_range\n        #define GL_APPLE_flush_buffer_range 1\n\n        #define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12\n        #define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13\n\n        typedef void (GLAPIENTRY * PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param);\n        typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size);\n\n        #define glBufferParameteriAPPLE GLEGetCurrentFunction(glBufferParameteriAPPLE)\n        #define glFlushMappedBufferRangeAPPLE GLEGetCurrentFunction(glFlushMappedBufferRangeAPPLE)\n\n        #define GLE_APPLE_flush_buffer_range GLEGetCurrentVariable(gle_APPLE_flush_buffer_range)\n    #endif\n\n\n\n    #ifndef GL_APPLE_object_purgeable\n        #define GL_APPLE_object_purgeable 1\n\n        #define GL_BUFFER_OBJECT_APPLE 0x85B3\n        #define GL_RELEASED_APPLE 0x8A19\n        #define GL_VOLATILE_APPLE 0x8A1A\n        #define GL_RETAINED_APPLE 0x8A1B\n        #define GL_UNDEFINED_APPLE 0x8A1C\n        #define GL_PURGEABLE_APPLE 0x8A1D\n\n        typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint* params);\n        typedef GLenum (GLAPIENTRY * PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option);\n        typedef GLenum (GLAPIENTRY * PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option);\n\n        #define glGetObjectParameterivAPPLE GLEGetCurrentFunction(glGetObjectParameterivAPPLE)\n        #define glObjectPurgeableAPPLE GLEGetCurrentFunction(glObjectPurgeableAPPLE)\n        #define glObjectUnpurgeableAPPLE GLEGetCurrentFunction(glObjectUnpurgeableAPPLE)\n\n        #define GLE_APPLE_object_purgeable GLEGetCurrentVariable(gle_APPLE_object_purgeable)\n    #endif\n\n\n\n    #ifndef GL_APPLE_pixel_buffer\n        #define GL_APPLE_pixel_buffer 1\n\n        #define GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10\n\n        #define GLE_APPLE_pixel_buffer GLEGetCurrentVariable(gle_APPLE_pixel_buffer)\n    #endif\n\n\n\n    #ifndef GL_APPLE_rgb_422\n        #define GL_APPLE_rgb_422 1\n\n        #define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA\n        #define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB\n        #define GL_RGB_422_APPLE 0x8A1F\n        #define GL_RGB_RAW_422_APPLE 0x8A51\n\n        #define GLE_APPLE_rgb_422 GLEGetCurrentVariable(gle_APPLE_rgb_422)\n    #endif\n\n\n\n    #ifndef GL_APPLE_row_bytes\n        #define GL_APPLE_row_bytes 1\n\n        #define GL_PACK_ROW_BYTES_APPLE 0x8A15\n        #define GL_UNPACK_ROW_BYTES_APPLE 0x8A16\n\n        #define GLE_APPLE_row_bytes GLEGetCurrentVariable(gle_APPLE_row_bytes)\n    #endif\n\n\n\n    #ifndef GL_APPLE_specular_vector\n        #define GL_APPLE_specular_vector 1\n\n        #define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0\n\n        #define GLE_APPLE_specular_vector GLEGetCurrentVariable(gle_APPLE_specular_vector)\n    #endif\n\n\n\n    #ifndef GL_APPLE_texture_range\n        #define GL_APPLE_texture_range 1\n\n        #define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7\n        #define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8\n        #define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC\n        #define GL_STORAGE_PRIVATE_APPLE 0x85BD\n        #define GL_STORAGE_CACHED_APPLE 0x85BE\n        #define GL_STORAGE_SHARED_APPLE 0x85BF\n\n        typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params);\n        typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, const void *pointer);\n\n        #define glGetTexParameterPointervAPPLE GLEGetCurrentFunction(glGetTexParameterPointervAPPLE)\n        #define glTextureRangeAPPLE GLEGetCurrentFunction(glTextureRangeAPPLE)\n\n        #define GLE_APPLE_texture_range GLEGetCurrentVariable(gle_APPLE_texture_range)\n    #endif\n\n\n    #ifndef GL_APPLE_transform_hint\n        #define GL_APPLE_transform_hint 1\n\n        #define GL_TRANSFORM_HINT_APPLE 0x85B1\n\n        #define GLE_APPLE_transform_hint GLEGetCurrentVariable(gle_APPLE_transform_hint)\n    #endif\n\n\n\n    #ifndef GL_APPLE_vertex_array_object\n        #define GL_APPLE_vertex_array_object 1\n        \n        // This has been superceded by GL_ARB_vertex_array_object, though if you are using Apple\n        // OpenGL prior to 3.x then only this interface will be available. However, we have made\n        // it so that glBindVertexArray maps to glBindVertexArrayApple when only the latter is present,\n        // thus allowing you to write cleaner code. You can always just call glBindVertexArray instead\n        // of glBindVertexArrayAPPLE, etc.\n        #define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5\n\n        typedef void      (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array);\n        typedef void      (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays);\n        typedef void      (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); // It's not clear whether arrays needs to be const or not.\n        typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array);\n\n        #define glBindVertexArrayAPPLE    GLEGetCurrentFunction(glBindVertexArrayAPPLE)\n        #define glDeleteVertexArraysAPPLE GLEGetCurrentFunction(glDeleteVertexArraysAPPLE)\n        #define glGenVertexArraysAPPLE    GLEGetCurrentFunction(glGenVertexArraysAPPLE)\n        #define glIsVertexArrayAPPLE      GLEGetCurrentFunction(glIsVertexArrayAPPLE)\n\n        #define GLE_APPLE_vertex_array_object GLEGetCurrentVariable(gle_APPLE_vertex_array_object)\n    #endif\n\n\n\n    #ifndef GL_APPLE_vertex_array_range\n        #define GL_APPLE_vertex_array_range 1\n\n        #define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D\n        #define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E\n        #define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F\n        #define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520\n        #define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521\n        #define GL_STORAGE_CLIENT_APPLE 0x85B4\n        #define GL_STORAGE_CACHED_APPLE 0x85BE\n        #define GL_STORAGE_SHARED_APPLE 0x85BF\n\n        typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer);\n        typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param);\n        typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer);\n\n        #define glFlushVertexArrayRangeAPPLE GLEGetCurrentFunction(glFlushVertexArrayRangeAPPLE)\n        #define glVertexArrayParameteriAPPLE GLEGetCurrentFunction(glVertexArrayParameteriAPPLE)\n        #define glVertexArrayRangeAPPLE GLEGetCurrentFunction(glVertexArrayRangeAPPLE)\n\n        #define GLE_APPLE_vertex_array_range GLEGetCurrentVariable(gle_APPLE_vertex_array_range)\n    #endif\n\n\n\n    #ifndef GL_APPLE_vertex_program_evaluators\n        #define GL_APPLE_vertex_program_evaluators 1\n\n        #define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00\n        #define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01\n        #define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02\n        #define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03\n        #define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04\n        #define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05\n        #define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06\n        #define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07\n        #define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08\n        #define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09\n\n        typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname);\n        typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname);\n        typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname);\n        typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points);\n        typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points);\n        typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points);\n        typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points);\n\n        #define glDisableVertexAttribAPPLE GLEGetCurrentFunction(glDisableVertexAttribAPPLE)\n        #define glEnableVertexAttribAPPLE GLEGetCurrentFunction(glEnableVertexAttribAPPLE)\n        #define glIsVertexAttribEnabledAPPLE GLEGetCurrentFunction(glIsVertexAttribEnabledAPPLE)\n        #define glMapVertexAttrib1dAPPLE GLEGetCurrentFunction(glMapVertexAttrib1dAPPLE)\n        #define glMapVertexAttrib1fAPPLE GLEGetCurrentFunction(glMapVertexAttrib1fAPPLE)\n        #define glMapVertexAttrib2dAPPLE GLEGetCurrentFunction(glMapVertexAttrib2dAPPLE)\n        #define glMapVertexAttrib2fAPPLE GLEGetCurrentFunction(glMapVertexAttrib2fAPPLE)\n\n        #define GLE_APPLE_vertex_program_evaluators GLEGetCurrentVariable(gle_APPLE_vertex_program_evaluators)\n    #endif\n\n#endif // GLE_CGL_ENABLED\n\n\n#ifndef GL_ARB_debug_output\n    #define GL_ARB_debug_output 1\n\n    #define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242\n    #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243\n    #define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244\n    #define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245\n    #define GL_DEBUG_SOURCE_API_ARB 0x8246\n    #define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247\n    #define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248\n    #define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249\n    #define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A\n    #define GL_DEBUG_SOURCE_OTHER_ARB 0x824B\n    #define GL_DEBUG_TYPE_ERROR_ARB 0x824C\n    #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D\n    #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E\n    #define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F\n    #define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250\n    #define GL_DEBUG_TYPE_OTHER_ARB 0x8251\n    #define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143\n    #define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144\n    #define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145\n    #define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146\n    #define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147\n    #define GL_DEBUG_SEVERITY_LOW_ARB 0x9148\n\n    typedef void (GLAPIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam);\n\n    typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam);\n    typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled);\n    typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf);\n    typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog);\n\n    #define glDebugMessageCallbackARB GLEGetCurrentFunction(glDebugMessageCallbackARB)\n    #define glDebugMessageControlARB GLEGetCurrentFunction(glDebugMessageControlARB)\n    #define glDebugMessageInsertARB GLEGetCurrentFunction(glDebugMessageInsertARB)\n    #define glGetDebugMessageLogARB GLEGetCurrentFunction(glGetDebugMessageLogARB)\n\n    #define GLE_ARB_debug_output GLEGetCurrentVariable(gle_ARB_debug_output)\n\n#endif // GL_ARB_debug_output\n\n\n\n#ifndef GL_ARB_depth_buffer_float\n    #define GL_ARB_depth_buffer_float 1\n\n    // Supercededs GL_NV_depth_buffer_float\n    #define GL_DEPTH_COMPONENT32F             0x8CAC\n    #define GL_DEPTH32F_STENCIL8              0x8CAD\n    #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD\n\n    #define GLE_ARB_depth_buffer_float GLEGetCurrentVariable(gle_ARB_depth_buffer_float)\n#endif\n\n\n/* Disabled until needed\n#ifndef GL_ARB_direct_state_access\n    #define GL_ARB_direct_state_access 1\n\n    #define GL_TEXTURE_TARGET 0x1006\n    #define GL_QUERY_TARGET 0x82EA\n    #define GL_TEXTURE_BINDING 0x82EB\n\n    typedef void (GLAPIENTRY * PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture);\n    typedef void (GLAPIENTRY * PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\n    typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target);\n    typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data);\n    typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data);\n    typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, GLfloat depth, GLint stencil);\n    typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat* value);\n    typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint* value);\n    typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint* value);\n    typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data);\n    typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);\n    typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);\n    typedef void (GLAPIENTRY * PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);\n    typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);\n    typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);\n    typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);\n    typedef void (GLAPIENTRY * PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint* buffers);\n    typedef void (GLAPIENTRY * PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers);\n    typedef void (GLAPIENTRY * PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines);\n    typedef void (GLAPIENTRY * PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint* ids);\n    typedef void (GLAPIENTRY * PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers);\n    typedef void (GLAPIENTRY * PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint* samplers);\n    typedef void (GLAPIENTRY * PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint* textures);\n    typedef void (GLAPIENTRY * PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids);\n    typedef void (GLAPIENTRY * PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays);\n    typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index);\n    typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index);\n    typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length);\n    typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture);\n    typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels);\n    typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64* params);\n    typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint* params);\n    typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void** params);\n    typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data);\n    typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params);\n    typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint* param);\n    typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint* params);\n    typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels);\n    typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat* params);\n    typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint* params);\n    typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint* params);\n    typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint* params);\n    typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat* params);\n    typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint* params);\n    typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64* param);\n    typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint* param);\n    typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint* param);\n    typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64* param);\n    typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param);\n    typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint* param);\n    typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments);\n    typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height);\n    typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access);\n    typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access);\n    typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage);\n    typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags);\n    typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data);\n    typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum mode);\n    typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs);\n    typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param);\n    typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum mode);\n    typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\n    typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level);\n    typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer);\n    typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height);\n    typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\n    typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer);\n    typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size);\n    typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint* params);\n    typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint* params);\n    typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param);\n    typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat* param);\n    typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param);\n    typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint* param);\n    typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width);\n    typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);\n    typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);\n    typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);\n    typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\n    typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels);\n    typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);\n    typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);\n    typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer);\n    typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);\n    typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer);\n    typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex);\n    typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);\n    typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\n    typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\n    typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor);\n    typedef void (GLAPIENTRY * PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer);\n    typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);\n    typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides);\n\n    #define glBindTextureUnit GLEGetCurrentFunction(glBindTextureUnit)\n    #define glBlitNamedFramebuffer GLEGetCurrentFunction(glBlitNamedFramebuffer)\n    #define glCheckNamedFramebufferStatus GLEGetCurrentFunction(glCheckNamedFramebufferStatus)\n    #define glClearNamedBufferData GLEGetCurrentFunction(glClearNamedBufferData)\n    #define glClearNamedBufferSubData GLEGetCurrentFunction(glClearNamedBufferSubData)\n    #define glClearNamedFramebufferfi GLEGetCurrentFunction(glClearNamedFramebufferfi)\n    #define glClearNamedFramebufferfv GLEGetCurrentFunction(glClearNamedFramebufferfv)\n    #define glClearNamedFramebufferiv GLEGetCurrentFunction(glClearNamedFramebufferiv)\n    #define glClearNamedFramebufferuiv GLEGetCurrentFunction(glClearNamedFramebufferuiv)\n    #define glCompressedTextureSubImage1D GLEGetCurrentFunction(glCompressedTextureSubImage1D)\n    #define glCompressedTextureSubImage2D GLEGetCurrentFunction(glCompressedTextureSubImage2D)\n    #define glCompressedTextureSubImage3D GLEGetCurrentFunction(glCompressedTextureSubImage3D)\n    #define glCopyNamedBufferSubData GLEGetCurrentFunction(glCopyNamedBufferSubData)\n    #define glCopyTextureSubImage1D GLEGetCurrentFunction(glCopyTextureSubImage1D)\n    #define glCopyTextureSubImage2D GLEGetCurrentFunction(glCopyTextureSubImage2D)\n    #define glCopyTextureSubImage3D GLEGetCurrentFunction(glCopyTextureSubImage3D)\n    #define glCreateBuffers GLEGetCurrentFunction(glCreateBuffers)\n    #define glCreateFramebuffers GLEGetCurrentFunction(glCreateFramebuffers)\n    #define glCreateProgramPipelines GLEGetCurrentFunction(glCreateProgramPipelines)\n    #define glCreateQueries GLEGetCurrentFunction(glCreateQueries)\n    #define glCreateRenderbuffers GLEGetCurrentFunction(glCreateRenderbuffers)\n    #define glCreateSamplers GLEGetCurrentFunction(glCreateSamplers)\n    #define glCreateTextures GLEGetCurrentFunction(glCreateTextures)\n    #define glCreateTransformFeedbacks GLEGetCurrentFunction(glCreateTransformFeedbacks)\n    #define glCreateVertexArrays GLEGetCurrentFunction(glCreateVertexArrays)\n    #define glDisableVertexArrayAttrib GLEGetCurrentFunction(glDisableVertexArrayAttrib)\n    #define glEnableVertexArrayAttrib GLEGetCurrentFunction(glEnableVertexArrayAttrib)\n    #define glFlushMappedNamedBufferRange GLEGetCurrentFunction(glFlushMappedNamedBufferRange)\n    #define glGenerateTextureMipmap GLEGetCurrentFunction(glGenerateTextureMipmap)\n    #define glGetCompressedTextureImage GLEGetCurrentFunction(glGetCompressedTextureImage)\n    #define glGetNamedBufferParameteri64v GLEGetCurrentFunction(glGetNamedBufferParameteri64v)\n    #define glGetNamedBufferParameteriv GLEGetCurrentFunction(glGetNamedBufferParameteriv)\n    #define glGetNamedBufferPointerv GLEGetCurrentFunction(glGetNamedBufferPointerv)\n    #define glGetNamedBufferSubData GLEGetCurrentFunction(glGetNamedBufferSubData)\n    #define glGetNamedFramebufferAttachmentParameteriv GLEGetCurrentFunction(glGetNamedFramebufferAttachmentParameteriv)\n    #define glGetNamedFramebufferParameteriv GLEGetCurrentFunction(glGetNamedFramebufferParameteriv)\n    #define glGetNamedRenderbufferParameteriv GLEGetCurrentFunction(glGetNamedRenderbufferParameteriv)\n    #define glGetTextureImage GLEGetCurrentFunction(glGetTextureImage)\n    #define glGetTextureLevelParameterfv GLEGetCurrentFunction(glGetTextureLevelParameterfv)\n    #define glGetTextureLevelParameteriv GLEGetCurrentFunction(glGetTextureLevelParameteriv)\n    #define glGetTextureParameterIiv GLEGetCurrentFunction(glGetTextureParameterIiv)\n    #define glGetTextureParameterIuiv GLEGetCurrentFunction(glGetTextureParameterIuiv)\n    #define glGetTextureParameterfv GLEGetCurrentFunction(glGetTextureParameterfv)\n    #define glGetTextureParameteriv GLEGetCurrentFunction(glGetTextureParameteriv)\n    #define glGetTransformFeedbacki64_v GLEGetCurrentFunction(glGetTransformFeedbacki64_v)\n    #define glGetTransformFeedbacki_v GLEGetCurrentFunction(glGetTransformFeedbacki_v)\n    #define glGetTransformFeedbackiv GLEGetCurrentFunction(glGetTransformFeedbackiv)\n    #define glGetVertexArrayIndexed64iv GLEGetCurrentFunction(glGetVertexArrayIndexed64iv)\n    #define glGetVertexArrayIndexediv GLEGetCurrentFunction(glGetVertexArrayIndexediv)\n    #define glGetVertexArrayiv GLEGetCurrentFunction(glGetVertexArrayiv)\n    #define glInvalidateNamedFramebufferData GLEGetCurrentFunction(glInvalidateNamedFramebufferData)\n    #define glInvalidateNamedFramebufferSubData GLEGetCurrentFunction(glInvalidateNamedFramebufferSubData)\n    #define glMapNamedBuffer GLEGetCurrentFunction(glMapNamedBuffer)\n    #define glMapNamedBufferRange GLEGetCurrentFunction(glMapNamedBufferRange)\n    #define glNamedBufferData GLEGetCurrentFunction(glNamedBufferData)\n    #define glNamedBufferStorage GLEGetCurrentFunction(glNamedBufferStorage)\n    #define glNamedBufferSubData GLEGetCurrentFunction(glNamedBufferSubData)\n    #define glNamedFramebufferDrawBuffer GLEGetCurrentFunction(glNamedFramebufferDrawBuffer)\n    #define glNamedFramebufferDrawBuffers GLEGetCurrentFunction(glNamedFramebufferDrawBuffers)\n    #define glNamedFramebufferParameteri GLEGetCurrentFunction(glNamedFramebufferParameteri)\n    #define glNamedFramebufferReadBuffer GLEGetCurrentFunction(glNamedFramebufferReadBuffer)\n    #define glNamedFramebufferRenderbuffer GLEGetCurrentFunction(glNamedFramebufferRenderbuffer)\n    #define glNamedFramebufferTexture GLEGetCurrentFunction(glNamedFramebufferTexture)\n    #define glNamedFramebufferTextureLayer GLEGetCurrentFunction(glNamedFramebufferTextureLayer)\n    #define glNamedRenderbufferStorage GLEGetCurrentFunction(glNamedRenderbufferStorage)\n    #define glNamedRenderbufferStorageMultisample GLEGetCurrentFunction(glNamedRenderbufferStorageMultisample)\n    #define glTextureBuffer GLEGetCurrentFunction(glTextureBuffer)\n    #define glTextureBufferRange GLEGetCurrentFunction(glTextureBufferRange)\n    #define glTextureParameterIiv GLEGetCurrentFunction(glTextureParameterIiv)\n    #define glTextureParameterIuiv GLEGetCurrentFunction(glTextureParameterIuiv)\n    #define glTextureParameterf GLEGetCurrentFunction(glTextureParameterf)\n    #define glTextureParameterfv GLEGetCurrentFunction(glTextureParameterfv)\n    #define glTextureParameteri GLEGetCurrentFunction(glTextureParameteri)\n    #define glTextureParameteriv GLEGetCurrentFunction(glTextureParameteriv)\n    #define glTextureStorage1D GLEGetCurrentFunction(glTextureStorage1D)\n    #define glTextureStorage2D GLEGetCurrentFunction(glTextureStorage2D)\n    #define glTextureStorage2DMultisample GLEGetCurrentFunction(glTextureStorage2DMultisample)\n    #define glTextureStorage3D GLEGetCurrentFunction(glTextureStorage3D)\n    #define glTextureStorage3DMultisample GLEGetCurrentFunction(glTextureStorage3DMultisample)\n    #define glTextureSubImage1D GLEGetCurrentFunction(glTextureSubImage1D)\n    #define glTextureSubImage2D GLEGetCurrentFunction(glTextureSubImage2D)\n    #define glTextureSubImage3D GLEGetCurrentFunction(glTextureSubImage3D)\n    #define glTransformFeedbackBufferBase GLEGetCurrentFunction(glTransformFeedbackBufferBase)\n    #define glTransformFeedbackBufferRange GLEGetCurrentFunction(glTransformFeedbackBufferRange)\n    #define glUnmapNamedBuffer GLEGetCurrentFunction(glUnmapNamedBuffer)\n    #define glVertexArrayAttribBinding GLEGetCurrentFunction(glVertexArrayAttribBinding)\n    #define glVertexArrayAttribFormat GLEGetCurrentFunction(glVertexArrayAttribFormat)\n    #define glVertexArrayAttribIFormat GLEGetCurrentFunction(glVertexArrayAttribIFormat)\n    #define glVertexArrayAttribLFormat GLEGetCurrentFunction(glVertexArrayAttribLFormat)\n    #define glVertexArrayBindingDivisor GLEGetCurrentFunction(glVertexArrayBindingDivisor)\n    #define glVertexArrayElementBuffer GLEGetCurrentFunction(glVertexArrayElementBuffer)\n    #define glVertexArrayVertexBuffer GLEGetCurrentFunction(glVertexArrayVertexBuffer)\n    #define glVertexArrayVertexBuffers GLEGetCurrentFunction(glVertexArrayVertexBuffers)\n\n    #define GLE_ARB_direct_state_access GLEGetCurrentVariable(gle_ARB_direct_state_access)\n#endif // GL_ARB_direct_state_access */\n\n\n\n#ifndef GL_ARB_ES2_compatibility\n    #define GL_ARB_ES2_compatibility 1\n\n    // This is for OpenGL ES compatibility.\n    #define GL_FIXED 0x140C\n    #define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A\n    #define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B\n    #define GL_RGB565 0x8D62\n    #define GL_LOW_FLOAT 0x8DF0\n    #define GL_MEDIUM_FLOAT 0x8DF1\n    #define GL_HIGH_FLOAT 0x8DF2\n    #define GL_LOW_INT 0x8DF3\n    #define GL_MEDIUM_INT 0x8DF4\n    #define GL_HIGH_INT 0x8DF5\n    #define GL_SHADER_BINARY_FORMATS 0x8DF8\n    #define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9\n    #define GL_SHADER_COMPILER 0x8DFA\n    #define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB\n    #define GL_MAX_VARYING_VECTORS 0x8DFC\n    #define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD\n\n    typedef int GLfixed;\n\n    typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFPROC) (GLclampf d);\n    typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f);\n    typedef void (GLAPIENTRY * PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint *precision);\n    typedef void (GLAPIENTRY * PFNGLRELEASESHADERCOMPILERPROC) (void);\n    typedef void (GLAPIENTRY * PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint* shaders, GLenum binaryformat, const void*binary, GLsizei length);\n\n    #define glClearDepthf              GLEGetCurrentFunction(glClearDepthf)\n    #define glDepthRangef              GLEGetCurrentFunction(glDepthRangef)\n    #define glGetShaderPrecisionFormat GLEGetCurrentFunction(glGetShaderPrecisionFormat)\n    #define glReleaseShaderCompiler    GLEGetCurrentFunction(glReleaseShaderCompiler)\n    #define glShaderBinary             GLEGetCurrentFunction(glShaderBinary)\n\n    #define GLE_ARB_ES2_compatibility GLEGetCurrentVariable(gle_ARB_ES2_compatibility)\n#endif\n\n\n\n#ifndef GL_ARB_framebuffer_object\n    #define GL_ARB_framebuffer_object 1\n\n    // GL_ARB_framebuffer_object is part of the OpenGL 4.4 core profile.\n    #define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506\n    #define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210\n    #define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211\n    #define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212\n    #define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213\n    #define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214\n    #define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215\n    #define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216\n    #define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217\n    #define GL_FRAMEBUFFER_DEFAULT 0x8218\n    #define GL_FRAMEBUFFER_UNDEFINED 0x8219\n    #define GL_DEPTH_STENCIL_ATTACHMENT 0x821A\n    #define GL_INDEX 0x8222\n    #define GL_MAX_RENDERBUFFER_SIZE 0x84E8\n    #define GL_DEPTH_STENCIL 0x84F9\n    #define GL_UNSIGNED_INT_24_8 0x84FA\n    #define GL_DEPTH24_STENCIL8 0x88F0\n    #define GL_TEXTURE_STENCIL_SIZE 0x88F1\n    #define GL_UNSIGNED_NORMALIZED 0x8C17\n    #define GL_SRGB 0x8C40\n    #define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6\n    #define GL_FRAMEBUFFER_BINDING 0x8CA6\n    #define GL_RENDERBUFFER_BINDING 0x8CA7\n    #define GL_READ_FRAMEBUFFER 0x8CA8\n    #define GL_DRAW_FRAMEBUFFER 0x8CA9\n    #define GL_READ_FRAMEBUFFER_BINDING 0x8CAA\n    #define GL_RENDERBUFFER_SAMPLES 0x8CAB\n    #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0\n    #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1\n    #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2\n    #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3\n    #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4\n    #define GL_FRAMEBUFFER_COMPLETE 0x8CD5\n    #define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6\n    #define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7\n    #define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB\n    #define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC\n    #define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD\n    #define GL_MAX_COLOR_ATTACHMENTS 0x8CDF\n    #define GL_COLOR_ATTACHMENT0 0x8CE0\n    #define GL_COLOR_ATTACHMENT1 0x8CE1\n    #define GL_COLOR_ATTACHMENT2 0x8CE2\n    #define GL_COLOR_ATTACHMENT3 0x8CE3\n    #define GL_COLOR_ATTACHMENT4 0x8CE4\n    #define GL_COLOR_ATTACHMENT5 0x8CE5\n    #define GL_COLOR_ATTACHMENT6 0x8CE6\n    #define GL_COLOR_ATTACHMENT7 0x8CE7\n    #define GL_COLOR_ATTACHMENT8 0x8CE8\n    #define GL_COLOR_ATTACHMENT9 0x8CE9\n    #define GL_COLOR_ATTACHMENT10 0x8CEA\n    #define GL_COLOR_ATTACHMENT11 0x8CEB\n    #define GL_COLOR_ATTACHMENT12 0x8CEC\n    #define GL_COLOR_ATTACHMENT13 0x8CED\n    #define GL_COLOR_ATTACHMENT14 0x8CEE\n    #define GL_COLOR_ATTACHMENT15 0x8CEF\n    #define GL_DEPTH_ATTACHMENT 0x8D00\n    #define GL_STENCIL_ATTACHMENT 0x8D20\n    #define GL_FRAMEBUFFER 0x8D40\n    #define GL_RENDERBUFFER 0x8D41\n    #define GL_RENDERBUFFER_WIDTH 0x8D42\n    #define GL_RENDERBUFFER_HEIGHT 0x8D43\n    #define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44\n    #define GL_STENCIL_INDEX1 0x8D46\n    #define GL_STENCIL_INDEX4 0x8D47\n    #define GL_STENCIL_INDEX8 0x8D48\n    #define GL_STENCIL_INDEX16 0x8D49\n    #define GL_RENDERBUFFER_RED_SIZE 0x8D50\n    #define GL_RENDERBUFFER_GREEN_SIZE 0x8D51\n    #define GL_RENDERBUFFER_BLUE_SIZE 0x8D52\n    #define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53\n    #define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54\n    #define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55\n    #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56\n    #define GL_MAX_SAMPLES 0x8D57\n\n    typedef void      (GLAPIENTRY * PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer);\n    typedef void      (GLAPIENTRY * PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer);\n    typedef void      (GLAPIENTRY * PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\n    typedef GLenum    (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);\n    typedef void      (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint* framebuffers);\n    typedef void      (GLAPIENTRY * PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint* renderbuffers);\n    typedef void      (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);\n    typedef void      (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\n    typedef void      (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);\n    typedef void      (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer);\n    typedef void      (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer);\n    typedef void      (GLAPIENTRY * PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers);\n    typedef void      (GLAPIENTRY * PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers);\n    typedef void      (GLAPIENTRY * PFNGLGENERATEMIPMAPPROC) (GLenum target);\n    typedef void      (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params);\n    typedef void      (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params);\n    typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer);\n    typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer);\n    typedef void      (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);\n    typedef void      (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);\n\n    #define glBindFramebuffer                     GLEGetCurrentFunction(glBindFramebuffer)\n    #define glBindRenderbuffer                    GLEGetCurrentFunction(glBindRenderbuffer)\n    #define glBlitFramebuffer                     GLEGetCurrentFunction(glBlitFramebuffer)\n    #define glCheckFramebufferStatus              GLEGetCurrentFunction(glCheckFramebufferStatus)\n    #define glDeleteFramebuffers                  GLEGetCurrentFunction(glDeleteFramebuffers)\n    #define glDeleteRenderbuffers                 GLEGetCurrentFunction(glDeleteRenderbuffers)\n    #define glFramebufferRenderbuffer             GLEGetCurrentFunction(glFramebufferRenderbuffer)\n    #define glFramebufferTexture1D                GLEGetCurrentFunction(glFramebufferTexture1D)\n    #define glFramebufferTexture2D                GLEGetCurrentFunction(glFramebufferTexture2D)\n    #define glFramebufferTexture3D                GLEGetCurrentFunction(glFramebufferTexture3D)\n    #define glFramebufferTextureLayer             GLEGetCurrentFunction(glFramebufferTextureLayer)\n    #define glGenFramebuffers                     GLEGetCurrentFunction(glGenFramebuffers)\n    #define glGenRenderbuffers                    GLEGetCurrentFunction(glGenRenderbuffers)\n    #define glGenerateMipmap                      GLEGetCurrentFunction(glGenerateMipmap)\n    #define glGetFramebufferAttachmentParameteriv GLEGetCurrentFunction(glGetFramebufferAttachmentParameteriv)\n    #define glGetRenderbufferParameteriv          GLEGetCurrentFunction(glGetRenderbufferParameteriv)\n    #define glIsFramebuffer                       GLEGetCurrentFunction(glIsFramebuffer)\n    #define glIsRenderbuffer                      GLEGetCurrentFunction(glIsRenderbuffer)\n    #define glRenderbufferStorage                 GLEGetCurrentFunction(glRenderbufferStorage)\n    #define glRenderbufferStorageMultisample      GLEGetCurrentFunction(glRenderbufferStorageMultisample)\n\n    #define GLE_ARB_framebuffer_object GLEGetCurrentVariable(gle_ARB_framebuffer_object)\n\n#endif // GL_ARB_framebuffer_object\n\n\n\n#ifndef GL_ARB_framebuffer_sRGB\n    #define GL_ARB_framebuffer_sRGB 1\n\n    // GL_ARB_framebuffer_sRGB is part of the OpenGL 4.4 core profile.\n    #define GL_FRAMEBUFFER_SRGB 0x8DB9\n\n    #define GLE_ARB_framebuffer_sRGB GLEGetCurrentVariable(gle_ARB_framebuffer_sRGB)\n#endif\n\n\n\n#ifndef GL_ARB_texture_multisample\n    #define GL_ARB_texture_multisample 1\n\n    #define GL_SAMPLE_POSITION 0x8E50\n    #define GL_SAMPLE_MASK 0x8E51\n    #define GL_SAMPLE_MASK_VALUE 0x8E52\n    #define GL_MAX_SAMPLE_MASK_WORDS 0x8E59\n    #define GL_TEXTURE_2D_MULTISAMPLE 0x9100\n    #define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101\n    #define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102\n    #define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103\n    #define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104\n    #define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105\n    #define GL_TEXTURE_SAMPLES 0x9106\n    #define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107\n    #define GL_SAMPLER_2D_MULTISAMPLE 0x9108\n    #define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109\n    #define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A\n    #define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B\n    #define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C\n    #define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D\n    #define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E\n    #define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F\n    #define GL_MAX_INTEGER_SAMPLES 0x9110\n\n    typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat* val);\n    typedef void (GLAPIENTRY * PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask);\n    typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);\n    typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);\n\n    #define glGetMultisamplefv      GLEGetCurrentFunction(glGetMultisamplefv)\n    #define glSampleMaski           GLEGetCurrentFunction(glSampleMaski)\n    #define glTexImage2DMultisample GLEGetCurrentFunction(glTexImage2DMultisample)\n    #define glTexImage3DMultisample GLEGetCurrentFunction(glTexImage3DMultisample)\n\n    #define GLE_ARB_texture_multisample GLEGetCurrentVariable(gle_ARB_texture_multisample)\n\n#endif // GL_ARB_texture_multisample\n\n\n\n#ifndef GL_ARB_texture_non_power_of_two\n    #define GL_ARB_texture_non_power_of_two 1\n\n    #define GLE_ARB_texture_non_power_of_two GLEGetCurrentVariable(gle_ARB_texture_non_power_of_two)\n#endif\n\n\n\n#ifndef GL_ARB_texture_rectangle\n    #define GL_ARB_texture_rectangle 1\n\n    // texture_rectangle was added to the OpenGL 3.1 core profile and so this extension is not needed\n    // unless using an earlier version of OpenGL.\n    // There are also the GL_EXT_texture_rectangle and GL_NV_texture_rectangle extensions. Apple reports\n    // the preseence of GL_EXT_texture_rectangle but not GL_ARB_texture_rectangle or GL_NV_texture_rectangle.\n    // You should check for GL_ARB_texture_rectangle instead of these other two.\n    #define GL_TEXTURE_RECTANGLE_ARB          0x84F5\n    #define GL_TEXTURE_BINDING_RECTANGLE_ARB  0x84F6\n    #define GL_PROXY_TEXTURE_RECTANGLE_ARB    0x84F7\n    #define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8\n    #define GL_SAMPLER_2D_RECT_ARB            0x8B63\n    #define GL_SAMPLER_2D_RECT_SHADOW_ARB     0x8B64\n\n    #define GLE_ARB_texture_rectangle GLEGetCurrentVariable(gle_ARB_texture_rectangle)\n#endif\n\n\n\n#ifndef GL_ARB_timer_query\n    #define GL_ARB_timer_query 1\n\n    #define GL_TIME_ELAPSED 0x88BF\n    #define GL_TIMESTAMP 0x8E28\n\n    typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64* params);\n    typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64* params);\n    typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target);\n\n    #define glGetQueryObjecti64v  GLEGetCurrentFunction(glGetQueryObjecti64v)\n    #define glGetQueryObjectui64v GLEGetCurrentFunction(glGetQueryObjectui64v)\n    #define glQueryCounter        GLEGetCurrentFunction(glQueryCounter)\n\n    #define GLE_ARB_timer_query GLEGetCurrentVariable(gle_ARB_timer_query)\n#endif\n\n\n\n#ifndef GL_ARB_vertex_array_object\n    #define GL_ARB_vertex_array_object 1\n\n    #define GL_VERTEX_ARRAY_BINDING 0x85B5\n\n    typedef void      (GLAPIENTRY * PFNGLBINDVERTEXARRAYPROC) (GLuint array);\n    typedef void      (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint* arrays);\n    typedef void      (GLAPIENTRY * PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays);\n    typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYPROC) (GLuint array);\n\n    #define glBindVertexArray    GLEGetCurrentFunction(glBindVertexArray)\n    #define glDeleteVertexArrays GLEGetCurrentFunction(glDeleteVertexArrays)\n    #define glGenVertexArrays    GLEGetCurrentFunction(glGenVertexArrays)\n    #define glIsVertexArray      GLEGetCurrentFunction(glIsVertexArray)\n\n    #define GLE_ARB_vertex_array_object GLEGetCurrentVariable(gle_ARB_vertex_array_object)\n#endif\n\n\n\n/* Disabled until needed\n#ifndef GL_ARB_vertex_attrib_binding\n    #define GL_ARB_vertex_attrib_binding 1\n\n    #define GL_VERTEX_ATTRIB_BINDING 0x82D4\n    #define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5\n    #define GL_VERTEX_BINDING_DIVISOR 0x82D6\n    #define GL_VERTEX_BINDING_OFFSET 0x82D7\n    #define GL_VERTEX_BINDING_STRIDE 0x82D8\n    #define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9\n    #define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA\n    #define GL_VERTEX_BINDING_BUFFER 0x8F4F\n\n    typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);\n    typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride);\n    typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex);\n    typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);\n    typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\n    typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\n    typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\n    typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);\n    typedef void (GLAPIENTRY * PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor);\n\n    #define glBindVertexBuffer GLEGetCurrentFunction(glBindVertexBuffer)\n    #define glVertexArrayBindVertexBufferEXT GLEGetCurrentFunction(glVertexArrayBindVertexBufferEXT)\n    #define glVertexArrayVertexAttribBindingEXT GLEGetCurrentFunction(glVertexArrayVertexAttribBindingEXT)\n    #define glVertexArrayVertexAttribFormatEXT GLEGetCurrentFunction(glVertexArrayVertexAttribFormatEXT)\n    #define glVertexArrayVertexAttribIFormatEXT GLEGetCurrentFunction(glVertexArrayVertexAttribIFormatEXT)\n    #define glVertexArrayVertexAttribLFormatEXT GLEGetCurrentFunction(glVertexArrayVertexAttribLFormatEXT)\n    #define glVertexArrayVertexBindingDivisorEXT GLEGetCurrentFunction(glVertexArrayVertexBindingDivisorEXT)\n    #define glVertexAttribBinding GLEGetCurrentFunction(glVertexAttribBinding)\n    #define glVertexAttribFormat GLEGetCurrentFunction(glVertexAttribFormat)\n    #define glVertexAttribIFormat GLEGetCurrentFunction(glVertexAttribIFormat)\n    #define glVertexAttribLFormat GLEGetCurrentFunction(glVertexAttribLFormat)\n    #define glVertexBindingDivisor GLEGetCurrentFunction(glVertexBindingDivisor)\n\n    #define GLE_ARB_vertex_attrib_binding GLEGetCurrentVariable(gle_ARB_vertex_attrib_binding)\n#endif\n*/\n\n\n#ifndef GL_EXT_draw_buffers2\n    #define GL_EXT_draw_buffers2 1\n\n    typedef void      (GLAPIENTRY * PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a);\n    typedef void      (GLAPIENTRY * PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index);\n    typedef void      (GLAPIENTRY * PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index);\n    typedef void      (GLAPIENTRY * PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum value, GLuint index, GLboolean* data);\n    typedef void      (GLAPIENTRY * PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum value, GLuint index, GLint* data);\n    typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index);\n\n    #define glColorMaskIndexedEXT   GLEGetCurrentFunction(glColorMaskIndexedEXT)\n    #define glDisableIndexedEXT     GLEGetCurrentFunction(glDisableIndexedEXT)\n    #define glEnableIndexedEXT      GLEGetCurrentFunction(glEnableIndexedEXT)\n    #define glGetBooleanIndexedvEXT GLEGetCurrentFunction(glGetBooleanIndexedvEXT)\n    #define glGetIntegerIndexedvEXT GLEGetCurrentFunction(glGetIntegerIndexedvEXT)\n    #define glIsEnabledIndexedEXT   GLEGetCurrentFunction(glIsEnabledIndexedEXT)\n\n    #define GLE_EXT_draw_buffers2 GLEGetCurrentVariable(gle_EXT_draw_buffers2)\n#endif\n\n\n\n#ifndef GL_EXT_texture_compression_s3tc\n    #define GL_EXT_texture_compression_s3tc 1\n\n    #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT  0x83F0\n    #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1\n    #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2\n    #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3\n\n    #define GLE_EXT_texture_compression_s3tc GLEGetCurrentVariable(gle_EXT_texture_compression_s3tc)\n#endif\n\n\n\n#ifndef GL_EXT_texture_filter_anisotropic\n    #define GL_EXT_texture_filter_anisotropic 1\n\n    #define GL_TEXTURE_MAX_ANISOTROPY_EXT     0x84FE\n    #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF\n\n    #define GLE_EXT_texture_filter_anisotropic GLEGetCurrentVariable(gle_EXT_texture_filter_anisotropic)\n#endif\n\n\n\n/* Disabled until needed\n#ifndef GL_KHR_context_flush_control\n    #define GL_KHR_context_flush_control 1\n\n    #define GLE_KHR_context_flush_control GLEGetCurrentVariable(gle_KHR_context_flush_control)\n#endif\n*/\n\n\n\n#ifndef GL_KHR_debug\n    #define GL_KHR_debug 1\n\n    #define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002\n    #define GL_STACK_OVERFLOW 0x0503\n    #define GL_STACK_UNDERFLOW 0x0504\n    #define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242\n    #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243\n    #define GL_DEBUG_CALLBACK_FUNCTION 0x8244\n    #define GL_DEBUG_CALLBACK_USER_PARAM 0x8245\n    #define GL_DEBUG_SOURCE_API 0x8246\n    #define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247\n    #define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248\n    #define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249\n    #define GL_DEBUG_SOURCE_APPLICATION 0x824A\n    #define GL_DEBUG_SOURCE_OTHER 0x824B\n    #define GL_DEBUG_TYPE_ERROR 0x824C\n    #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D\n    #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E\n    #define GL_DEBUG_TYPE_PORTABILITY 0x824F\n    #define GL_DEBUG_TYPE_PERFORMANCE 0x8250\n    #define GL_DEBUG_TYPE_OTHER 0x8251\n    #define GL_DEBUG_TYPE_MARKER 0x8268\n    #define GL_DEBUG_TYPE_PUSH_GROUP 0x8269\n    #define GL_DEBUG_TYPE_POP_GROUP 0x826A\n    #define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B\n    #define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C\n    #define GL_DEBUG_GROUP_STACK_DEPTH 0x826D\n    #define GL_BUFFER 0x82E0\n    #define GL_SHADER 0x82E1\n    #define GL_PROGRAM 0x82E2\n    #define GL_QUERY 0x82E3\n    #define GL_PROGRAM_PIPELINE 0x82E4\n    #define GL_SAMPLER 0x82E6\n    #define GL_DISPLAY_LIST 0x82E7\n    #define GL_MAX_LABEL_LENGTH 0x82E8\n    #define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143\n    #define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144\n    #define GL_DEBUG_LOGGED_MESSAGES 0x9145\n    #define GL_DEBUG_SEVERITY_HIGH 0x9146\n    #define GL_DEBUG_SEVERITY_MEDIUM 0x9147\n    #define GL_DEBUG_SEVERITY_LOW 0x9148\n    #define GL_DEBUG_OUTPUT 0x92E0\n\n    typedef void (GLAPIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam);\n\n    typedef void   (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam);\n    typedef void   (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled);\n    typedef void   (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf);\n    typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog);\n    typedef void   (GLAPIENTRY * PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar *label);\n    typedef void   (GLAPIENTRY * PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei* length, GLchar *label);\n    typedef void   (GLAPIENTRY * PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar* label);\n    typedef void   (GLAPIENTRY * PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar* label);\n    typedef void   (GLAPIENTRY * PFNGLPOPDEBUGGROUPPROC) (void);\n    typedef void   (GLAPIENTRY * PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar * message);\n\n    #define glDebugMessageCallback GLEGetCurrentFunction(glDebugMessageCallback)\n    #define glDebugMessageControl GLEGetCurrentFunction(glDebugMessageControl)\n    #define glDebugMessageInsert GLEGetCurrentFunction(glDebugMessageInsert)\n    #define glGetDebugMessageLog GLEGetCurrentFunction(glGetDebugMessageLog)\n    #define glGetObjectLabel GLEGetCurrentFunction(glGetObjectLabel)\n    #define glGetObjectPtrLabel GLEGetCurrentFunction(glGetObjectPtrLabel)\n    #define glObjectLabel GLEGetCurrentFunction(glObjectLabel)\n    #define glObjectPtrLabel GLEGetCurrentFunction(glObjectPtrLabel)\n    #define glPopDebugGroup GLEGetCurrentFunction(glPopDebugGroup)\n    #define glPushDebugGroup GLEGetCurrentFunction(glPushDebugGroup)\n\n    #define GLE_KHR_debug GLEGetCurrentVariable(gle_KHR_debug)\n#endif // GL_KHR_debug\n\n\n\n#ifndef GL_KHR_robust_buffer_access_behavior\n    #define GL_KHR_robust_buffer_access_behavior 1\n\n    #define GLE_KHR_robust_buffer_access_behavior GLEGetCurrentVariable(gle_KHR_robust_buffer_access_behavior)\n#endif\n\n\n\n/* Disabled until needed\n#ifndef GL_KHR_robustness\n    #define GL_KHR_robustness 1\n\n    #define GL_CONTEXT_LOST 0x0507\n    #define GL_LOSE_CONTEXT_ON_RESET 0x8252\n    #define GL_GUILTY_CONTEXT_RESET 0x8253\n    #define GL_INNOCENT_CONTEXT_RESET 0x8254\n    #define GL_UNKNOWN_CONTEXT_RESET 0x8255\n    #define GL_RESET_NOTIFICATION_STRATEGY 0x8256\n    #define GL_NO_RESET_NOTIFICATION 0x8261\n    #define GL_CONTEXT_ROBUST_ACCESS 0x90F3\n\n    typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params);\n    typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params);\n    typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params);\n    typedef void (GLAPIENTRY * PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data);\n\n    #define glGetnUniformfv  GLEGetCurrentFunction(glGetnUniformfv)\n    #define glGetnUniformiv  GLEGetCurrentFunction(glGetnUniformiv)\n    #define glGetnUniformuiv GLEGetCurrentFunction(glGetnUniformuiv)\n    #define glReadnPixels    GLEGetCurrentFunction(glReadnPixels)\n\n    #define GLE_KHR_robustness GLEGetCurrentVariable(gle_KHR_robustness)\n\n#endif // GL_KHR_robustness\n*/\n\n\n\n#ifndef GL_WIN_swap_hint\n    #define GL_WIN_swap_hint 1\n\n    typedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height);\n\n    #define glAddSwapHintRectWIN GLEGetCurrentFunction(glAddSwapHintRectWIN)\n\n    #define GLE_WIN_swap_hint GLEGetCurrentVariable(gle_WIN_swap_hint)\n#endif\n\n\n\n/************************************************************************************\n   Windows-specific (WGL) functionality\n************************************************************************************/\n\n#if defined(GLE_WGL_ENABLED)\n    #ifdef __wglext_h_\n        #error wglext.h was included before this header. This header needs to be inlcuded instead of or at least before wglext.h\n    #endif\n    #define __wglext_h_ // Prevent wglext.h from having any future effect if it's #included.\n\n    // Declare shared types and structs from wglext.h\n    DECLARE_HANDLE(HPBUFFERARB); // This type is used by a couple extensions.\n\n    // WGL functions from <wingdi.h>\n    #if 0 // defined(GLE_HOOKING_ENABLED) We currently don't hook these.\n        #define wglCopyContext(...)              GLEGetCurrentFunction(wglCopyContext)(__VA_ARGS__)\n        #define wglCreateContext(...)            GLEGetCurrentFunction(wglCreateContext)(__VA_ARGS__)\n        #define wglCreateLayerContext(...)       GLEGetCurrentFunction(wglCreateLayerContext)(__VA_ARGS__)\n        #define wglDeleteContext(...)            GLEGetCurrentFunction(wglDeleteContext)(__VA_ARGS__)\n        #define wglGetCurrentContext(...)        GLEGetCurrentFunction(wglGetCurrentContext)(__VA_ARGS__)\n        #define wglGetCurrentDC(...)             GLEGetCurrentFunction(wglGetCurrentDC)(__VA_ARGS__)\n        #define wglGetProcAddress(...)           GLEGetCurrentFunction(wglGetProcAddress)(__VA_ARGS__)\n        #define wglMakeCurrent(...)              GLEGetCurrentFunction(wglMakeCurrent)(__VA_ARGS__)\n        #define wglShareLists(...)               GLEGetCurrentFunction(wglShareLists)(__VA_ARGS__)\n        #define wglUseFontBitmapsA(...)          GLEGetCurrentFunction(wglUseFontBitmapsA)(__VA_ARGS__)\n        #define wglUseFontBitmapsW(...)          GLEGetCurrentFunction(wglUseFontBitmapsW)(__VA_ARGS__)\n        #define wglUseFontOutlinesA(...)         GLEGetCurrentFunction(wglUseFontOutlinesA)(__VA_ARGS__)\n        #define wglUseFontOutlinesW(...)         GLEGetCurrentFunction(wglUseFontOutlinesW)(__VA_ARGS__)\n        #define wglDescribeLayerPlane(...)       GLEGetCurrentFunction(wglDescribeLayerPlane)(__VA_ARGS__)\n        #define wglSetLayerPaletteEntries(...)   GLEGetCurrentFunction(wglSetLayerPaletteEntries)(__VA_ARGS__)\n        #define wglGetLayerPaletteEntries(...)   GLEGetCurrentFunction(wglGetLayerPaletteEntries)(__VA_ARGS__)\n        #define wglRealizeLayerPalette(...)      GLEGetCurrentFunction(wglRealizeLayerPalette)(__VA_ARGS__)\n        #define wglSwapLayerBuffers(...)         GLEGetCurrentFunction(wglSwapLayerBuffers)(__VA_ARGS__)\n        #define wglSwapMultipleBuffers(...)      GLEGetCurrentFunction(wglSwapMultipleBuffers)(__VA_ARGS__)\n    #else\n        // The following functions are directly declared in Microsoft's <wingdi.h> without associated typedefs, and are exported from Opengl32.dll.\n        // We can link to them directly through Opengl32.lib/dll (same as OpenGL 1.1 functions) or we can dynamically link them from OpenGL32.dll at runtime.\n        typedef BOOL  (WINAPI * PFNWGLCOPYCONTEXTPROC)(HGLRC, HGLRC, UINT);\n        typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTPROC)(HDC);\n        typedef HGLRC (WINAPI * PFNWGLCREATELAYERCONTEXTPROC)(HDC, int);\n        typedef BOOL  (WINAPI * PFNWGLDELETECONTEXTPROC)(HGLRC);\n        typedef HGLRC (WINAPI * PFNWGLGETCURRENTCONTEXTPROC)(VOID);\n        typedef HDC   (WINAPI * PFNWGLGETCURRENTDCPROC)(VOID);\n        typedef PROC  (WINAPI * PFNWGLGETPROCADDRESSPROC)(LPCSTR);\n        typedef BOOL  (WINAPI * PFNWGLMAKECURRENTPROC)(HDC, HGLRC);\n        typedef BOOL  (WINAPI * PFNWGLSHARELISTSPROC)(HGLRC, HGLRC);\n        typedef BOOL  (WINAPI * PFNWGLUSEFONTBITMAPSAPROC)(HDC, DWORD, DWORD, DWORD);\n        typedef BOOL  (WINAPI * PFNWGLUSEFONTBITMAPSWPROC)(HDC, DWORD, DWORD, DWORD);\n        typedef BOOL  (WINAPI * PFNWGLUSEFONTOUTLINESAPROC)(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT, int, LPGLYPHMETRICSFLOAT);\n        typedef BOOL  (WINAPI * PFNWGLUSEFONTOUTLINESWPROC)(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT, int, LPGLYPHMETRICSFLOAT);\n        typedef BOOL  (WINAPI * PFNWGLDESCRIBELAYERPLANEPROC)(HDC, int, int, UINT, LPLAYERPLANEDESCRIPTOR);\n        typedef int   (WINAPI * PFNWGLSETLAYERPALETTEENTRIESPROC)(HDC, int, int, int, CONST COLORREF *);\n        typedef int   (WINAPI * PFNWGLGETLAYERPALETTEENTRIESPROC)(HDC, int, int, int, COLORREF *);\n        typedef BOOL  (WINAPI * PFNWGLREALIZELAYERPALETTEPROC)(HDC, int, BOOL);\n        typedef BOOL  (WINAPI * PFNWGLSWAPLAYERBUFFERSPROC)(HDC, UINT);\n        typedef DWORD (WINAPI * PFNWGLSWAPMULTIPLEBUFFERSPROC)(UINT, CONST WGLSWAP *);\n\n        #if 0\n        #define wglCopyContext             GLEContext::GetCurrentContext()->wglCopyContext_Impl\n        #define wglCreateContext           GLEContext::GetCurrentContext()->wglCreateContext_Impl\n        #define wglCreateLayerContext      GLEContext::GetCurrentContext()->wglCreateLayerContext_Impl\n        #define wglDeleteContext           GLEContext::GetCurrentContext()->wglDeleteContext_Impl\n        #define wglGetCurrentContext       GLEContext::GetCurrentContext()->wglGetCurrentContext_Impl\n        #define wglGetCurrentDC            GLEContext::GetCurrentContext()->wglGetCurrentDC_Impl\n        #define wglGetProcAddress          GLEContext::GetCurrentContext()->wglGetProcAddress_Impl\n        #define wglMakeCurrent             GLEContext::GetCurrentContext()->wglMakeCurrent_Impl\n        #define wglShareLists              GLEContext::GetCurrentContext()->wglShareLists_Impl\n        #define wglUseFontBitmapsA         GLEContext::GetCurrentContext()->wglUseFontBitmapsA_Impl\n        #define wglUseFontBitmapsW         GLEContext::GetCurrentContext()->wglUseFontBitmapsW_Impl\n        #define wglUseFontOutlinesA        GLEContext::GetCurrentContext()->wglUseFontOutlinesA_Impl\n        #define wglUseFontOutlinesW        GLEContext::GetCurrentContext()->wglUseFontOutlinesW_Impl\n        #define wglDescribeLayerPlane      GLEContext::GetCurrentContext()->wglDescribeLayerPlane_Impl\n        #define wglSetLayerPaletteEntries  GLEContext::GetCurrentContext()->wglSetLayerPaletteEntries_Impl\n        #define wglGetLayerPaletteEntries  GLEContext::GetCurrentContext()->wglGetLayerPaletteEntries_Impl\n        #define wglRealizeLayerPalette     GLEContext::GetCurrentContext()->wglRealizeLayerPalette_Impl\n        #define wglSwapLayerBuffers        GLEContext::GetCurrentContext()->wglSwapLayerBuffers_Impl\n        #define wglSwapMultipleBuffers     GLEContext::GetCurrentContext()->wglSwapMultipleBuffers_Impl\n        #endif\n    #endif\n\n    // Note: In order to detect the WGL extensions' availability, we need to call wglGetExtensionsStringARB or \n    // wglGetExtensionsStringEXT instead of glGetString(GL_EXTENSIONS).\n    #ifndef WGL_ARB_buffer_region\n        #define WGL_ARB_buffer_region 1\n\n        #define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001\n        #define WGL_BACK_COLOR_BUFFER_BIT_ARB  0x00000002\n        #define WGL_DEPTH_BUFFER_BIT_ARB       0x00000004\n        #define WGL_STENCIL_BUFFER_BIT_ARB     0x00000008\n\n        typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType);\n        typedef VOID   (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion);\n        typedef BOOL   (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height);\n        typedef BOOL   (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc);\n\n        #define wglCreateBufferRegionARB  GLEGetCurrentFunction(wglCreateBufferRegionARB)\n        #define wglDeleteBufferRegionARB  GLEGetCurrentFunction(wglDeleteBufferRegionARB)\n        #define wglSaveBufferRegionARB    GLEGetCurrentFunction(wglSaveBufferRegionARB)\n        #define wglRestoreBufferRegionARB GLEGetCurrentFunction(wglRestoreBufferRegionARB)\n\n        #define GLE_WGL_ARB_buffer_region GLEGetCurrentVariable(gle_WGL_ARB_buffer_region)\n    #endif\n\n\n    #ifndef WGL_ARB_extensions_string\n        #define WGL_ARB_extensions_string 1\n\n        typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);\n\n        #define wglGetExtensionsStringARB  GLEGetCurrentFunction(wglGetExtensionsStringARB)\n\n        #define GLE_WGL_ARB_extensions_string GLEGetCurrentVariable(gle_WGL_ARB_extensions_string)\n    #endif\n\n\n    #ifndef WGL_ARB_pixel_format\n        #define WGL_ARB_pixel_format 1\n\n        #define WGL_NUMBER_PIXEL_FORMATS_ARB   0x2000\n        #define WGL_DRAW_TO_WINDOW_ARB         0x2001\n        #define WGL_DRAW_TO_BITMAP_ARB         0x2002\n        #define WGL_ACCELERATION_ARB           0x2003\n        #define WGL_NEED_PALETTE_ARB           0x2004\n        #define WGL_NEED_SYSTEM_PALETTE_ARB    0x2005\n        #define WGL_SWAP_LAYER_BUFFERS_ARB     0x2006\n        #define WGL_SWAP_METHOD_ARB            0x2007\n        #define WGL_NUMBER_OVERLAYS_ARB        0x2008\n        #define WGL_NUMBER_UNDERLAYS_ARB       0x2009\n        #define WGL_TRANSPARENT_ARB            0x200A\n        #define WGL_TRANSPARENT_RED_VALUE_ARB  0x2037\n        #define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038\n        #define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039\n        #define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A\n        #define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B\n        #define WGL_SHARE_DEPTH_ARB            0x200C\n        #define WGL_SHARE_STENCIL_ARB          0x200D\n        #define WGL_SHARE_ACCUM_ARB            0x200E\n        #define WGL_SUPPORT_GDI_ARB            0x200F\n        #define WGL_SUPPORT_OPENGL_ARB         0x2010\n        #define WGL_DOUBLE_BUFFER_ARB          0x2011\n        #define WGL_STEREO_ARB                 0x2012\n        #define WGL_PIXEL_TYPE_ARB             0x2013\n        #define WGL_COLOR_BITS_ARB             0x2014\n        #define WGL_RED_BITS_ARB               0x2015\n        #define WGL_RED_SHIFT_ARB              0x2016\n        #define WGL_GREEN_BITS_ARB             0x2017\n        #define WGL_GREEN_SHIFT_ARB            0x2018\n        #define WGL_BLUE_BITS_ARB              0x2019\n        #define WGL_BLUE_SHIFT_ARB             0x201A\n        #define WGL_ALPHA_BITS_ARB             0x201B\n        #define WGL_ALPHA_SHIFT_ARB            0x201C\n        #define WGL_ACCUM_BITS_ARB             0x201D\n        #define WGL_ACCUM_RED_BITS_ARB         0x201E\n        #define WGL_ACCUM_GREEN_BITS_ARB       0x201F\n        #define WGL_ACCUM_BLUE_BITS_ARB        0x2020\n        #define WGL_ACCUM_ALPHA_BITS_ARB       0x2021\n        #define WGL_DEPTH_BITS_ARB             0x2022\n        #define WGL_STENCIL_BITS_ARB           0x2023\n        #define WGL_AUX_BUFFERS_ARB            0x2024\n        #define WGL_NO_ACCELERATION_ARB        0x2025\n        #define WGL_GENERIC_ACCELERATION_ARB   0x2026\n        #define WGL_FULL_ACCELERATION_ARB      0x2027\n        #define WGL_SWAP_EXCHANGE_ARB          0x2028\n        #define WGL_SWAP_COPY_ARB              0x2029\n        #define WGL_SWAP_UNDEFINED_ARB         0x202A\n        #define WGL_TYPE_RGBA_ARB              0x202B\n        #define WGL_TYPE_COLORINDEX_ARB        0x202C\n\n        typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues);\n        typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues);\n        typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);\n\n        #define wglGetPixelFormatAttribivARB  GLEGetCurrentFunction(wglGetPixelFormatAttribivARB)\n        #define wglGetPixelFormatAttribfvARB  GLEGetCurrentFunction(wglGetPixelFormatAttribfvARB)\n        #define wglChoosePixelFormatARB  GLEGetCurrentFunction(wglChoosePixelFormatARB)\n\n        #define GLE_WGL_ARB_pixel_format GLEGetCurrentVariable(gle_WGL_ARB_pixel_format)\n    #endif\n\n\n    #ifndef WGL_ARB_make_current_read\n        #define WGL_ARB_make_current_read 1\n\n        #define ERROR_INVALID_PIXEL_TYPE_ARB   0x2043\n        #define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054\n\n        typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);\n        typedef HDC  (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (void);\n\n        #define wglMakeContextCurrentARB  GLEGetCurrentFunction(wglMakeContextCurrentARB)\n        #define wglGetCurrentReadDCARB  GLEGetCurrentFunction(wglGetCurrentReadDCARB)\n\n        #define GLE_WGL_ARB_make_current_read GLEGetCurrentVariable(gle_WGL_ARB_make_current_read)\n    #endif\n\n\n    #ifndef WGL_ARB_pbuffer\n        #define WGL_ARB_pbuffer 1\n\n        #define WGL_DRAW_TO_PBUFFER_ARB        0x202D\n        #define WGL_MAX_PBUFFER_PIXELS_ARB     0x202E\n        #define WGL_MAX_PBUFFER_WIDTH_ARB      0x202F\n        #define WGL_MAX_PBUFFER_HEIGHT_ARB     0x2030\n        #define WGL_PBUFFER_LARGEST_ARB        0x2033\n        #define WGL_PBUFFER_WIDTH_ARB          0x2034\n        #define WGL_PBUFFER_HEIGHT_ARB         0x2035\n\n        typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList);\n        typedef HDC         (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer);\n        typedef int         (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC);\n        typedef BOOL        (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer);\n        typedef BOOL        (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue);\n\n        #define wglCreatePbufferARB  GLEGetCurrentFunction(wglCreatePbufferARB)\n        #define wglGetPbufferDCARB  GLEGetCurrentFunction(wglGetPbufferDCARB)\n        #define wglReleasePbufferDCARB  GLEGetCurrentFunction(wglReleasePbufferDCARB)\n        #define wglDestroyPbufferARB  GLEGetCurrentFunction(wglDestroyPbufferARB)\n        #define wglQueryPbufferARB  GLEGetCurrentFunction(wglQueryPbufferARB)\n\n        #define GLE_WGL_ARB_pbuffer GLEGetCurrentVariable(gle_WGL_ARB_pbuffer)\n    #endif\n\n\n    #ifndef WGL_ARB_render_texture\n        #define WGL_ARB_render_texture 1\n\n        #define WGL_BIND_TO_TEXTURE_RGB_ARB         0x2070\n        #define WGL_BIND_TO_TEXTURE_RGBA_ARB        0x2071\n        #define WGL_TEXTURE_FORMAT_ARB              0x2072\n        #define WGL_TEXTURE_TARGET_ARB              0x2073\n        #define WGL_MIPMAP_TEXTURE_ARB              0x2074\n        #define WGL_TEXTURE_RGB_ARB                 0x2075\n        #define WGL_TEXTURE_RGBA_ARB                0x2076\n        #define WGL_NO_TEXTURE_ARB                  0x2077\n        #define WGL_TEXTURE_CUBE_MAP_ARB            0x2078\n        #define WGL_TEXTURE_1D_ARB                  0x2079\n        #define WGL_TEXTURE_2D_ARB                  0x207A\n        #define WGL_MIPMAP_LEVEL_ARB                0x207B\n        #define WGL_CUBE_MAP_FACE_ARB               0x207C\n        #define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D\n        #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E\n        #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F\n        #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080\n        #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081\n        #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082\n        #define WGL_FRONT_LEFT_ARB                  0x2083\n        #define WGL_FRONT_RIGHT_ARB                 0x2084\n        #define WGL_BACK_LEFT_ARB                   0x2085\n        #define WGL_BACK_RIGHT_ARB                  0x2086\n        #define WGL_AUX0_ARB                        0x2087\n        #define WGL_AUX1_ARB                        0x2088\n        #define WGL_AUX2_ARB                        0x2089\n        #define WGL_AUX3_ARB                        0x208A\n        #define WGL_AUX4_ARB                        0x208B\n        #define WGL_AUX5_ARB                        0x208C\n        #define WGL_AUX6_ARB                        0x208D\n        #define WGL_AUX7_ARB                        0x208E\n        #define WGL_AUX8_ARB                        0x208F\n        #define WGL_AUX9_ARB                        0x2090\n\n        typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);\n        typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);\n        typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int *piAttribList);\n\n        #define wglBindTexImageARB     GLEGetCurrentFunction(wglBindTexImageARB)\n        #define wglReleaseTexImageARB  GLEGetCurrentFunction(wglReleaseTexImageARB)\n        #define wglSetPbufferAttribARB GLEGetCurrentFunction(wglSetPbufferAttribARB)\n\n        #define GLE_WGL_ARB_render_texture GLEGetCurrentVariable(gle_WGL_ARB_render_texture)\n    #endif\n\n\n    #ifndef WGL_ARB_pixel_format_float\n        #define WGL_ARB_pixel_format_float 1\n\n        #define WGL_TYPE_RGBA_FLOAT_ARB        0x21A0\n\n        #define GLE_WGL_ARB_pixel_format_float GLEGetCurrentVariable(gle_WGL_ARB_pixel_format_float)\n    #endif\n\n\n    #ifndef WGL_ARB_framebuffer_sRGB\n        #define WGL_ARB_framebuffer_sRGB 1\n\n        // There is also the WGL_EXT_framebuffer_sRGB extension, which is the\n        // same as this. So use this one instead of that for checking.\n        #define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9\n\n        #define GLE_WGL_ARB_framebuffer_sRGB GLEGetCurrentVariable(gle_WGL_ARB_framebuffer_sRGB)\n    #endif\n\n\n    #ifndef WGL_NV_present_video\n        #define WGL_NV_present_video 1\n\n        DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV);\n\n        typedef int  (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDC, HVIDEOOUTPUTDEVICENV *phDeviceList);\n        typedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDC, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int *piAttribList);\n        typedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int *piValue);\n\n        #define wglEnumerateVideoDevicesNV GLEGetCurrentFunction(wglEnumerateVideoDevicesNV)\n        #define wglBindVideoDeviceNV       GLEGetCurrentFunction(wglBindVideoDeviceNV)\n        #define wglQueryCurrentContextNV   GLEGetCurrentFunction(wglQueryCurrentContextNV)\n\n        #define GLE_WGL_NV_present_video GLEGetCurrentVariable(gle_WGL_NV_present_video)\n    #endif\n\n\n    #ifndef WGL_ARB_create_context\n        #define WGL_ARB_create_context 1\n\n        #define WGL_CONTEXT_DEBUG_BIT_ARB      0x00000001\n        #define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002\n        #define WGL_CONTEXT_MAJOR_VERSION_ARB  0x2091\n        #define WGL_CONTEXT_MINOR_VERSION_ARB  0x2092\n        #define WGL_CONTEXT_LAYER_PLANE_ARB    0x2093\n        #define WGL_CONTEXT_FLAGS_ARB          0x2094\n        #define ERROR_INVALID_VERSION_ARB      0x2095\n\n        typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int *attribList);\n\n        #define wglCreateContextAttribsARB  GLEGetCurrentFunction(wglCreateContextAttribsARB)\n\n        #define GLE_WGL_ARB_create_context GLEGetCurrentVariable(gle_WGL_ARB_create_context)\n    #endif\n\n\n    #ifndef WGL_ARB_create_context_profile\n        #define WGL_ARB_create_context_profile 1\n\n        #define WGL_CONTEXT_PROFILE_MASK_ARB   0x9126\n        #define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001\n        #define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002\n        #define ERROR_INVALID_PROFILE_ARB      0x2096\n\n        #define GLE_WGL_ARB_create_context_profile GLEGetCurrentVariable(gle_WGL_ARB_create_context_profile)\n    #endif\n\n\n    #ifndef WGL_ARB_create_context_robustness\n        #define WGL_ARB_create_context_robustness 1\n\n        #define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004\n        #define WGL_LOSE_CONTEXT_ON_RESET_ARB  0x8252\n        #define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256\n        #define WGL_NO_RESET_NOTIFICATION_ARB  0x8261\n\n        #define GLE_WGL_ARB_create_context_robustness GLEGetCurrentVariable(gle_WGL_ARB_create_context_robustness)\n    #endif\n\n\n\n    #ifndef WGL_ATI_render_texture_rectangle\n        #define WGL_ATI_render_texture_rectangle 1\n\n        #define WGL_TEXTURE_RECTANGLE_ATI 0x21A5\n\n        #define GLE_WGL_ATI_render_texture_rectangle GLEGetCurrentVariable(gle_WGL_ATI_render_texture_rectangle)\n    #endif\n\n\n    #ifndef WGL_EXT_extensions_string\n        #define WGL_EXT_extensions_string 1\n\n        typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void);\n\n        #define wglGetExtensionsStringEXT  GLEGetCurrentFunction(wglGetExtensionsStringEXT)\n\n        #define GLE_WGL_EXT_extensions_string GLEGetCurrentVariable(gle_WGL_EXT_extensions_string)\n    #endif\n\n\n    #ifndef WGL_NV_render_texture_rectangle\n        #define WGL_NV_render_texture_rectangle 1\n\n        #define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV  0x20A0\n        #define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1\n        #define WGL_TEXTURE_RECTANGLE_NV              0x20A2\n\n        #define GLE_WGL_NV_render_texture_rectangle GLEGetCurrentVariable(gle_WGL_NV_render_texture_rectangle)\n    #endif\n\n\n    #ifndef WGL_EXT_swap_control\n        #define WGL_EXT_swap_control 1\n\n        typedef int  (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void);\n        typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval);\n\n        #define wglGetSwapIntervalEXT GLEGetCurrentFunction(wglGetSwapIntervalEXT)\n        #define wglSwapIntervalEXT    GLEGetCurrentFunction(wglSwapIntervalEXT)\n\n        #define GLE_WGL_EXT_swap_control GLEGetCurrentVariable(gle_WGL_EXT_swap_control)\n    #endif\n\n\n    #ifndef WGL_OML_sync_control\n        #define WGL_OML_sync_control 1\n\n        typedef BOOL  (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc);\n        typedef BOOL  (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32 *numerator, INT32 *denominator);\n        typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder);\n        typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder);\n        typedef BOOL  (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 *ust, INT64 *msc, INT64 *sbc);\n        typedef BOOL  (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc);\n\n        #define wglGetSyncValuesOML       GLEGetCurrentFunction(wglGetSyncValuesOML)\n        #define wglGetMscRateOML          GLEGetCurrentFunction(wglGetMscRateOML)\n        #define wglSwapBuffersMscOML      GLEGetCurrentFunction(wglSwapBuffersMscOML)\n        #define wglSwapLayerBuffersMscOML GLEGetCurrentFunction(wglSwapLayerBuffersMscOML)\n        #define wglWaitForMscOML          GLEGetCurrentFunction(wglWaitForMscOML)\n        #define wglWaitForSbcOML          GLEGetCurrentFunction(wglWaitForSbcOML)\n\n        #define GLE_WGL_OML_sync_control GLEGetCurrentVariable(gle_WGL_OML_sync_control)\n    #endif\n\n\n    #ifndef WGL_NV_video_output\n        #define WGL_NV_video_output 1\n\n        DECLARE_HANDLE(HPVIDEODEV);\n\n        typedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV *hVideoDevice);\n        typedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice);\n        typedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer);\n        typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer);\n        typedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long *pulCounterPbuffer, BOOL bBlock);\n        typedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo);\n\n        #define wglGetVideoDeviceNV      GLEGetCurrentFunction(wglGetVideoDeviceNV)\n        #define wglReleaseVideoDeviceNV  GLEGetCurrentFunction(wglReleaseVideoDeviceNV)\n        #define wglBindVideoImageNV      GLEGetCurrentFunction(wglBindVideoImageNV)\n        #define wglReleaseVideoImageNV   GLEGetCurrentFunction(wglReleaseVideoImageNV)\n        #define wglSendPbufferToVideoNV  GLEGetCurrentFunction(wglSendPbufferToVideoNV)\n        #define wglGetVideoInfoNV        GLEGetCurrentFunction(wglGetVideoInfoNV)\n\n        #define GLE_WGL_NV_video_output GLEGetCurrentVariable(gle_WGL_NV_video_output)\n    #endif\n\n\n    #ifndef WGL_NV_swap_group\n        #define WGL_NV_swap_group 1\n\n        typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group);\n        typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier);\n        typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint *group, GLuint *barrier);\n        typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint *maxGroups, GLuint *maxBarriers);\n        typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint *count);\n        typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC);\n\n        #define wglJoinSwapGroupNV        GLEGetCurrentFunction(wglJoinSwapGroupNV)\n        #define wglBindSwapBarrierNV      GLEGetCurrentFunction(wglBindSwapBarrierNV)\n        #define wglQuerySwapGroupNV       GLEGetCurrentFunction(wglQuerySwapGroupNV)\n        #define wglQueryMaxSwapGroupsNV   GLEGetCurrentFunction(wglQueryMaxSwapGroupsNV)\n        #define wglQueryFrameCountNV      GLEGetCurrentFunction(wglQueryFrameCountNV)\n        #define wglResetFrameCountNV      GLEGetCurrentFunction(wglResetFrameCountNV)\n\n        #define GLE_WGL_NV_swap_group GLEGetCurrentVariable(gle_WGL_NV_swap_group)\n    #endif\n\n\n    #ifndef WGL_NV_video_capture\n        #define WGL_NV_video_capture 1\n\n        #define WGL_UNIQUE_ID_NV               0x20CE\n        #define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF\n\n        typedef struct _GPU_DEVICE {\n            DWORD  cb;\n            CHAR   DeviceName[32];\n            CHAR   DeviceString[128];\n            DWORD  Flags;\n            RECT   rcVirtualScreen;\n        } GPU_DEVICE, *PGPU_DEVICE;\n        DECLARE_HANDLE(HVIDEOINPUTDEVICENV);\n\n        typedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice);\n        typedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV *phDeviceList);\n        typedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice);\n        typedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int *piValue);\n        typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice);\n\n        #define wglBindVideoCaptureDeviceNV        GLEGetCurrentFunction(wglBindVideoCaptureDeviceNV)\n        #define wglEnumerateVideoCaptureDevicesNV  GLEGetCurrentFunction(wglEnumerateVideoCaptureDevicesNV)\n        #define wglLockVideoCaptureDeviceNV        GLEGetCurrentFunction(wglLockVideoCaptureDeviceNV)\n        #define wglQueryVideoCaptureDeviceNV       GLEGetCurrentFunction(wglQueryVideoCaptureDeviceNV)\n        #define wglReleaseVideoCaptureDeviceNV     GLEGetCurrentFunction(wglReleaseVideoCaptureDeviceNV)\n\n        #define GLE_WGL_NV_video_capture GLEGetCurrentVariable(gle_WGL_NV_video_capture)\n    #endif\n\n\n    #ifndef WGL_NV_copy_image\n        #define WGL_NV_copy_image 1\n\n        typedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);\n\n        #define wglCopyImageSubDataNV GLEGetCurrentFunction(wglCopyImageSubDataNV)\n\n        #define GLE_WGL_NV_copy_image GLEGetCurrentVariable(gle_WGL_NV_copy_image)\n    #endif\n\n\n    #ifndef WGL_NV_DX_interop\n        #define WGL_NV_DX_interop 1\n\n        // Note that modern AMD drivers support this NVidia extension.\n        #define WGL_ACCESS_READ_ONLY_NV     0x0000\n        #define WGL_ACCESS_READ_WRITE_NV    0x0001\n        #define WGL_ACCESS_WRITE_DISCARD_NV 0x0002\n\n        typedef BOOL   (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice);\n        typedef BOOL   (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects);\n        typedef BOOL   (WINAPI * PFNWGLDXOBJECTACCESSNVPROC) (HANDLE hObject, GLenum access);\n        typedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void* dxDevice);\n        typedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void* dxObject, GLuint name, GLenum type, GLenum access);\n        typedef BOOL   (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void* dxObject, HANDLE shareHandle);\n        typedef BOOL   (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects);\n        typedef BOOL   (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject);\n\n        #define wglDXCloseDeviceNV            GLEGetCurrentFunction(wglDXCloseDeviceNV)\n        #define wglDXLockObjectsNV            GLEGetCurrentFunction(wglDXLockObjectsNV)\n        #define wglDXObjectAccessNV           GLEGetCurrentFunction(wglDXObjectAccessNV)\n        #define wglDXOpenDeviceNV             GLEGetCurrentFunction(wglDXOpenDeviceNV)\n        #define wglDXRegisterObjectNV         GLEGetCurrentFunction(wglDXRegisterObjectNV)\n        #define wglDXSetResourceShareHandleNV GLEGetCurrentFunction(wglDXSetResourceShareHandleNV)\n        #define wglDXUnlockObjectsNV          GLEGetCurrentFunction(wglDXUnlockObjectsNV)\n        #define wglDXUnregisterObjectNV       GLEGetCurrentFunction(wglDXUnregisterObjectNV)\n\n        #define GLE_WGL_NV_DX_interop GLEGetCurrentVariable(gle_WGL_NV_DX_interop)\n    #endif\n    \n\n    #ifndef WGL_NV_DX_interop2\n        #define WGL_NV_DX_interop2 1\n\n        // This is an update to WGL_NV_DX_interop to support DX10/DX11.\n        // https://www.opengl.org/registry/specs/NV/DX_interop2.txt\n        #define GLE_WGL_NV_DX_interop2 GLEGetCurrentVariable(gle_WGL_NV_DX_interop2)\n\n        #endif\n\n#endif // GLE_WGL_ENABLED\n\n\n\n/************************************************************************************\n   Apple-specific (CGL) functionality\n************************************************************************************/\n\n#if defined(GLE_CGL_ENABLED)\n    // We don't currently disable Apple's OpenGL/OpenGL.h and replicate its declarations here.\n    // We might want to do that if we intended to support hooking its functions here like we do for wgl functions.\n    #include <OpenGL/OpenGL.h>\n#endif\n\n\n\n/************************************************************************************\n   Unix-specific (GLX) functionality\n************************************************************************************/\n\n#if defined(GLE_GLX_ENABLED)\n    #ifdef __glxext_h_\n        #error glxext.h was included before this header. This header needs to be inlcuded instead of or at least before glxext.h\n    #endif\n    #define __glxext_h_\n\n    #if defined(GLX_H) || defined(__GLX_glx_h__) || defined(__glx_h__)\n        #error glx.h was included before this header. This header needs to be inlcuded instead of or at least before glx.h\n    #endif\n    #define GLX_H\n    #define __GLX_glx_h__\n    #define __glx_h__\n\n    #include <X11/Xlib.h>\n    #include <X11/Xutil.h>\n    #include <X11/Xmd.h>\n\n    // GLX version 1.0 functions are assumed to always be present.\n    #ifndef GLX_VERSION_1_0\n        #define GLX_VERSION_1_0 1\n\n        #define GLX_USE_GL 1\n        #define GLX_BUFFER_SIZE 2\n        #define GLX_LEVEL 3\n        #define GLX_RGBA 4\n        #define GLX_DOUBLEBUFFER 5\n        #define GLX_STEREO 6\n        #define GLX_AUX_BUFFERS 7\n        #define GLX_RED_SIZE 8\n        #define GLX_GREEN_SIZE 9\n        #define GLX_BLUE_SIZE 10\n        #define GLX_ALPHA_SIZE 11\n        #define GLX_DEPTH_SIZE 12\n        #define GLX_STENCIL_SIZE 13\n        #define GLX_ACCUM_RED_SIZE 14\n        #define GLX_ACCUM_GREEN_SIZE 15\n        #define GLX_ACCUM_BLUE_SIZE 16\n        #define GLX_ACCUM_ALPHA_SIZE 17\n        #define GLX_BAD_SCREEN 1\n        #define GLX_BAD_ATTRIBUTE 2\n        #define GLX_NO_EXTENSION 3\n        #define GLX_BAD_VISUAL 4\n        #define GLX_BAD_CONTEXT 5\n        #define GLX_BAD_VALUE 6\n        #define GLX_BAD_ENUM 7\n\n        typedef XID GLXDrawable;\n        typedef XID GLXPixmap;\n        typedef unsigned int GLXVideoDeviceNV; \n        typedef struct __GLXcontextRec *GLXContext;\n\n        // GLE_HOOKING_ENABLED\n        // We don't currently support hooking the following GLX 1.0 functions like we do with the analagous windows wgl functions.\n        // However, we can do this if needed. We would just have something like this:\n        //     #define glXQueryExtension(...) GLEGetCurrentFunction(glXQueryExtension)(__VA_ARGS__)\n        // plus a member function like:\n        //      Bool glXQueryExtension_Hook(Display*, int*, int*);\n        // See wglCopyContext for an example.\n    \n        extern Bool         glXQueryExtension (Display *dpy, int *errorBase, int *eventBase);\n        extern Bool         glXQueryVersion (Display *dpy, int *major, int *minor);\n        extern int          glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value);\n        extern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList);\n        extern GLXPixmap    glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap);\n        extern void         glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix);\n        extern GLXContext   glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct);\n        extern void         glXDestroyContext (Display *dpy, GLXContext ctx);\n        extern Bool         glXIsDirect (Display *dpy, GLXContext ctx);\n        extern void         glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLulong mask);\n        extern Bool         glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx);\n        extern GLXContext   glXGetCurrentContext (void);\n        extern GLXDrawable  glXGetCurrentDrawable (void);\n        extern void         glXWaitGL (void);\n        extern void         glXWaitX (void);\n        extern void         glXSwapBuffers (Display *dpy, GLXDrawable drawable);\n        extern void         glXUseXFont (Font font, int first, int count, int listBase);\n\n    #endif // GLX_VERSION_1_0\n\n\n\n    #ifndef GLX_VERSION_1_1\n        #define GLX_VERSION_1_1\n\n        #define GLX_VENDOR 0x1\n        #define GLX_VERSION 0x2\n        #define GLX_EXTENSIONS 0x3\n\n        // These function pointers are assumed to always be present.\n        extern const char* glXQueryExtensionsString (Display *dpy, int screen);\n        extern const char* glXGetClientString (Display *dpy, int name);\n        extern const char* glXQueryServerString (Display *dpy, int screen, int name);\n    #endif\n\n\n    #ifndef GLX_VERSION_1_2\n        #define GLX_VERSION_1_2 1\n\n        typedef Display* (* PFNGLXGETCURRENTDISPLAYPROC) (void);\n\n        #define glXGetCurrentDisplay GLEGetCurrentFunction(glXGetCurrentDisplay)\n    #endif\n\n\n\n    #ifndef GLX_VERSION_1_3\n        #define GLX_VERSION_1_3 1\n\n        #define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001\n        #define GLX_RGBA_BIT 0x00000001\n        #define GLX_WINDOW_BIT 0x00000001\n        #define GLX_COLOR_INDEX_BIT 0x00000002\n        #define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002\n        #define GLX_PIXMAP_BIT 0x00000002\n        #define GLX_BACK_LEFT_BUFFER_BIT 0x00000004\n        #define GLX_PBUFFER_BIT 0x00000004\n        #define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008\n        #define GLX_AUX_BUFFERS_BIT 0x00000010\n        #define GLX_CONFIG_CAVEAT 0x20\n        #define GLX_DEPTH_BUFFER_BIT 0x00000020\n        #define GLX_X_VISUAL_TYPE 0x22\n        #define GLX_TRANSPARENT_TYPE 0x23\n        #define GLX_TRANSPARENT_INDEX_VALUE 0x24\n        #define GLX_TRANSPARENT_RED_VALUE 0x25\n        #define GLX_TRANSPARENT_GREEN_VALUE 0x26\n        #define GLX_TRANSPARENT_BLUE_VALUE 0x27\n        #define GLX_TRANSPARENT_ALPHA_VALUE 0x28\n        #define GLX_STENCIL_BUFFER_BIT 0x00000040\n        #define GLX_ACCUM_BUFFER_BIT 0x00000080\n        #define GLX_NONE 0x8000\n        #define GLX_SLOW_CONFIG 0x8001\n        #define GLX_TRUE_COLOR 0x8002\n        #define GLX_DIRECT_COLOR 0x8003\n        #define GLX_PSEUDO_COLOR 0x8004\n        #define GLX_STATIC_COLOR 0x8005\n        #define GLX_GRAY_SCALE 0x8006\n        #define GLX_STATIC_GRAY 0x8007\n        #define GLX_TRANSPARENT_RGB 0x8008\n        #define GLX_TRANSPARENT_INDEX 0x8009\n        #define GLX_VISUAL_ID 0x800B\n        #define GLX_SCREEN 0x800C\n        #define GLX_NON_CONFORMANT_CONFIG 0x800D\n        #define GLX_DRAWABLE_TYPE 0x8010\n        #define GLX_RENDER_TYPE 0x8011\n        #define GLX_X_RENDERABLE 0x8012\n        #define GLX_FBCONFIG_ID 0x8013\n        #define GLX_RGBA_TYPE 0x8014\n        #define GLX_COLOR_INDEX_TYPE 0x8015\n        #define GLX_MAX_PBUFFER_WIDTH 0x8016\n        #define GLX_MAX_PBUFFER_HEIGHT 0x8017\n        #define GLX_MAX_PBUFFER_PIXELS 0x8018\n        #define GLX_PRESERVED_CONTENTS 0x801B\n        #define GLX_LARGEST_PBUFFER 0x801C\n        #define GLX_WIDTH 0x801D\n        #define GLX_HEIGHT 0x801E\n        #define GLX_EVENT_MASK 0x801F\n        #define GLX_DAMAGED 0x8020\n        #define GLX_SAVED 0x8021\n        #define GLX_WINDOW 0x8022\n        #define GLX_PBUFFER 0x8023\n        #define GLX_PBUFFER_HEIGHT 0x8040\n        #define GLX_PBUFFER_WIDTH 0x8041\n        #define GLX_PBUFFER_CLOBBER_MASK 0x08000000\n        #define GLX_DONT_CARE 0xFFFFFFFF\n\n        typedef XID GLXFBConfigID;\n        typedef XID GLXPbuffer;\n        typedef XID GLXWindow;\n        typedef struct __GLXFBConfigRec *GLXFBConfig;\n\n        typedef struct {\n          int event_type; \n          int draw_type; \n          unsigned long serial; \n          Bool send_event; \n          Display *display; \n          GLXDrawable drawable; \n          unsigned int buffer_mask; \n          unsigned int aux_buffer; \n          int x, y; \n          int width, height; \n          int count; \n        } GLXPbufferClobberEvent;\n     \n        typedef union __GLXEvent {\n          GLXPbufferClobberEvent glxpbufferclobber; \n          long pad[24]; \n        } GLXEvent;\n\n        typedef GLXFBConfig* (* PFNGLXCHOOSEFBCONFIGPROC) (::Display *dpy, int screen, const int *attrib_list, int *nelements);\n        typedef GLXContext   (* PFNGLXCREATENEWCONTEXTPROC) (::Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);\n        typedef GLXPbuffer   (* PFNGLXCREATEPBUFFERPROC) (::Display *dpy, GLXFBConfig config, const int *attrib_list);\n        typedef GLXPixmap    (* PFNGLXCREATEPIXMAPPROC) (::Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list);\n        typedef GLXWindow    (* PFNGLXCREATEWINDOWPROC) (::Display *dpy, GLXFBConfig config, Window win, const int *attrib_list);\n        typedef void         (* PFNGLXDESTROYPBUFFERPROC) (::Display *dpy, GLXPbuffer pbuf);\n        typedef void         (* PFNGLXDESTROYPIXMAPPROC) (::Display *dpy, GLXPixmap pixmap);\n        typedef void         (* PFNGLXDESTROYWINDOWPROC) (::Display *dpy, GLXWindow win);\n        typedef GLXDrawable  (* PFNGLXGETCURRENTREADDRAWABLEPROC) (void);\n        typedef int          (* PFNGLXGETFBCONFIGATTRIBPROC) (::Display *dpy, GLXFBConfig config, int attribute, int *value);\n        typedef GLXFBConfig* (* PFNGLXGETFBCONFIGSPROC) (::Display *dpy, int screen, int *nelements);\n        typedef void         (* PFNGLXGETSELECTEDEVENTPROC) (::Display *dpy, GLXDrawable draw, unsigned long *event_mask);\n        typedef XVisualInfo* (* PFNGLXGETVISUALFROMFBCONFIGPROC) (::Display *dpy, GLXFBConfig config);\n        typedef Bool         (* PFNGLXMAKECONTEXTCURRENTPROC) (::Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx);\n        typedef int          (* PFNGLXQUERYCONTEXTPROC) (::Display *dpy, GLXContext ctx, int attribute, int *value);\n        typedef void         (* PFNGLXQUERYDRAWABLEPROC) (::Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);\n        typedef void         (* PFNGLXSELECTEVENTPROC) (::Display *dpy, GLXDrawable draw, unsigned long event_mask);\n    \n        #define glXChooseFBConfig         GLEGetCurrentFunction(glXChooseFBConfig)\n        #define glXCreateNewContext       GLEGetCurrentFunction(glXCreateNewContext)\n        #define glXCreatePbuffer          GLEGetCurrentFunction(glXCreatePbuffer)\n        #define glXCreatePixmap           GLEGetCurrentFunction(glXCreatePixmap)\n        #define glXCreateWindow           GLEGetCurrentFunction(glXCreateWindow)\n        #define glXDestroyPbuffer         GLEGetCurrentFunction(glXDestroyPbuffer)\n        #define glXDestroyPixmap          GLEGetCurrentFunction(glXDestroyPixmap)\n        #define glXDestroyWindow          GLEGetCurrentFunction(glXDestroyWindow)\n        #define glXGetCurrentReadDrawable GLEGetCurrentFunction(glXGetCurrentReadDrawable)\n        #define glXGetFBConfigAttrib      GLEGetCurrentFunction(glXGetFBConfigAttrib)\n        #define glXGetFBConfigs           GLEGetCurrentFunction(glXGetFBConfigs)\n        #define glXGetSelectedEvent       GLEGetCurrentFunction(glXGetSelectedEvent)\n        #define glXGetVisualFromFBConfig  GLEGetCurrentFunction(glXGetVisualFromFBConfig)\n        #define glXMakeContextCurrent     GLEGetCurrentFunction(glXMakeContextCurrent)\n        #define glXQueryContext           GLEGetCurrentFunction(glXQueryContext)\n        #define glXQueryDrawable          GLEGetCurrentFunction(glXQueryDrawable)\n        #define glXSelectEvent            GLEGetCurrentFunction(glXSelectEvent)\n\n    #endif // GLX_VERSION_1_3\n\n\n\n    #ifndef GLX_VERSION_1_4\n        #define GLX_VERSION_1_4 1\n\n        #define GLX_SAMPLE_BUFFERS 100000\n        #define GLX_SAMPLES 100001\n\n        // This was glXGetProcAddressARB in GLX versions prior to v1.4.\n        // This function pointer is assumed to always be present.\n        extern void (* glXGetProcAddress(const GLubyte *procName)) ();\n\n        // For backward compatibility\n        extern void (* glXGetProcAddressARB(const GLubyte *procName)) ();\n    #endif\n\n\n\n\t#ifndef GLX_ARB_create_context\n        #define GLX_ARB_create_context 1\n\n        #define GLX_CONTEXT_DEBUG_BIT_ARB              0x0001\n        #define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002\n        #define GLX_CONTEXT_MAJOR_VERSION_ARB          0x2091\n        #define GLX_CONTEXT_MINOR_VERSION_ARB          0x2092\n        #define GLX_CONTEXT_FLAGS_ARB                  0x2094\n\n        typedef GLXContext (* PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display* dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list);\n\n        #define glXCreateContextAttribsARB GLEGetCurrentFunction(glXCreateContextAttribsARB)\n\n        #define GLE_GLX_ARB_create_context GLEGetCurrentVariable(gle_GLX_ARB_create_context)\n    #endif\n\n\n    #ifndef GLX_ARB_create_context_profile\n        #define GLX_ARB_create_context_profile 1\n\n        #define GLX_CONTEXT_CORE_PROFILE_BIT_ARB \t\t  0x00000001\n        #define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002\n        #define GLX_CONTEXT_PROFILE_MASK_ARB \t\t0x9126\n\n        #define GLE_GLX_ARB_create_context_profile GLEGetCurrentVariable(gle_GLX_ARB_create_context_profile)\n    #endif\n\n\n    #ifndef GLX_ARB_create_context_robustness\n        #define GLX_ARB_create_context_robustness 1\n\n        #define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB \t\t0x00000004\n        #define GLX_LOSE_CONTEXT_ON_RESET_ARB               0x8252\n        #define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256\n        #define GLX_NO_RESET_NOTIFICATION_ARB       \t\t0x8261\n\n        #define GLE_GLX_ARB_create_context_robustness GLEGetCurrentVariable(gle_GLX_ARB_create_context_robustness)\n    #endif\n\n\n    // Note: In order to detect the GLX extensions' availability, we need to call glXQueryExtensionsString instead of glGetString(GL_EXTENSIONS).\n    #ifndef GLX_EXT_swap_control\n        #define GLX_EXT_swap_control 1\n\n        #define GLX_SWAP_INTERVAL_EXT 0x20F1\n        #define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2\n\n        typedef void (* PFNGLXSWAPINTERVALEXTPROC) (Display* dpy, GLXDrawable drawable, int interval);\n\n        #define glXSwapIntervalEXT GLEGetCurrentFunction(glXSwapIntervalEXT)\n\n        #define GLE_GLX_EXT_swap_control GLEGetCurrentVariable(gle_GLX_EXT_swap_control)\n    #endif\n    \n\n    #ifndef GLX_OML_sync_control\n        #define GLX_OML_sync_control 1\n\n        typedef Bool    (* PFNGLXGETMSCRATEOMLPROC) (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator);\n        typedef Bool    (* PFNGLXGETSYNCVALUESOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc);\n        typedef int64_t (* PFNGLXSWAPBUFFERSMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder);\n        typedef Bool    (* PFNGLXWAITFORMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc);\n        typedef Bool    (* PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc);\n\n        #define glXGetMscRateOML     GLEGetCurrentFunction(glXGetMscRateOML)\n        #define glXGetSyncValuesOML  GLEGetCurrentFunction(glXGetSyncValuesOML)\n        #define glXSwapBuffersMscOML GLEGetCurrentFunction(glXSwapBuffersMscOML)\n        #define glXWaitForMscOML     GLEGetCurrentFunction(glXWaitForMscOML)\n        #define glXWaitForSbcOML     GLEGetCurrentFunction(glXWaitForSbcOML)\n\n        #define GLE_GLX_OML_sync_control GLEGetCurrentVariable(gle_GLX_OML_sync_control)\n    #endif\n    \n    \n    #ifndef GLX_MESA_swap_control\n        #define GLX_MESA_swap_control 1\n\n        // GLX_MESA_swap_control has the same functionality as GLX_EXT_swap_control but with a different interface, so we have an independent entry for it here.\n        typedef int (* PFNGLXGETSWAPINTERVALMESAPROC) (void);\n        typedef int (* PFNGLXSWAPINTERVALMESAPROC) (unsigned int interval);\n\n        #define glXGetSwapIntervalMESA GLEGetCurrentFunction(glXGetSwapIntervalMESA)\n        #define glXSwapIntervalMESA    GLEGetCurrentFunction(glXSwapIntervalMESA)\n\n        #define GLE_MESA_swap_control GLEGetCurrentVariable(gle_MESA_swap_control)\n    #endif\n\n#endif // GLE_GLX_ENABLED\n\n\n// Undo some defines, because the user may include <Windows.h> after including this header.\n#if defined(GLE_WINGDIAPI_DEFINED)\n    #undef WINGDIAPI\n#endif\n\n\n#ifdef __cplusplus\n} // extern \"C\"\n#endif\n\n\n\n#endif // Header include guard\n\n\n\n\n\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/GL/CAPI_GL_DistortionRenderer.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_GL_DistortionRenderer.h\nContent     :   Distortion renderer header for GL\nCreated     :   November 11, 2013\nAuthors     :   David Borel, Lee Cooper\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_GL_DistortionRenderer.h\"\n\n#include \"CAPI_GL_DistortionShaders.h\"\n\n#include \"../../OVR_CAPI_GL.h\"\n#include \"../../Kernel/OVR_Color.h\"\n\n#if defined(OVR_OS_LINUX)\n    #include \"../../Displays/OVR_Linux_SDKWindow.h\"\n#elif defined(OVR_OS_MAC)\n    #include <CoreGraphics/CGDirectDisplay.h>\n    #include <OpenGL/OpenGL.h>\n#endif\n\nnamespace OVR { namespace CAPI { namespace GL {\n\n\n// Distortion pixel shader lookup.\n//  Bit 0: Chroma Correction\n//  Bit 1: Timewarp\n\nenum {\n    DistortionVertexShaderBitMask = 3,\n    DistortionVertexShaderCount   = DistortionVertexShaderBitMask + 1,\n    DistortionPixelShaderBitMask  = 1,\n    DistortionPixelShaderCount    = DistortionPixelShaderBitMask + 1\n};\n\nstruct ShaderInfo\n{\n    const char* ShaderData;\n    size_t ShaderSize;\n    const ShaderBase::Uniform* ReflectionData;\n    size_t ReflectionSize;\n};\n\n// Do add a new distortion shader use these macros (with or w/o reflection)\n#define SI_NOREFL(shader) { shader, sizeof(shader), NULL, 0 }\n#define SI_REFL__(shader) { shader, sizeof(shader), shader ## _refl, sizeof( shader ## _refl )/sizeof(*(shader ## _refl)) }\n\n\nstatic ShaderInfo DistortionVertexShaderLookup[DistortionVertexShaderCount] =\n{\n    SI_REFL__(Distortion_vs),\n    SI_REFL__(DistortionChroma_vs),\n    SI_REFL__(DistortionTimewarp_vs),\n    SI_REFL__(DistortionTimewarpChroma_vs)\n};\n\nstatic ShaderInfo DistortionPixelShaderLookup[DistortionPixelShaderCount] =\n{\n    SI_NOREFL(Distortion_fs),\n    SI_NOREFL(DistortionChroma_fs)\n};\n\nvoid DistortionShaderBitIndexCheck()\n{\n    OVR_COMPILER_ASSERT(ovrDistortionCap_Chromatic == 1);\n    OVR_COMPILER_ASSERT(ovrDistortionCap_TimeWarp  == 2);\n}\n\n\n\nstruct DistortionVertex\n{\n    Vector2f ScreenPosNDC;\n    Vector2f TanEyeAnglesR;\n    Vector2f TanEyeAnglesG;\n    Vector2f TanEyeAnglesB;\n    Color    Col;\n};\n\n\n// Vertex type; same format is used for all shapes for simplicity.\n// Shapes are built by adding vertices to Model.\nstruct LatencyVertex\n{\n    Vector3f  Pos;\n    LatencyVertex (const Vector3f& p) : Pos(p) {}\n};\n\n\n//----------------------------------------------------------------------------\n// ***** GL::DistortionRenderer\n\nDistortionRenderer::DistortionRenderer(ovrHmd hmd, FrameTimeManager& timeManager,\n                                       const HMDRenderState& renderState)\n    : CAPI::DistortionRenderer(ovrRenderAPI_OpenGL, hmd, timeManager, renderState)\n    , RotateCCW90(false)\n\t, LatencyVAO(0)\n    , OverdriveFbo(0)\n{\n\tDistortionMeshVAOs[0] = 0;\n\tDistortionMeshVAOs[1] = 0;\n\n    // Initialize render params.\n    memset(&RParams, 0, sizeof(RParams));\n}\n\nDistortionRenderer::~DistortionRenderer()\n{\n    destroy();\n}\n\n// static\nCAPI::DistortionRenderer* DistortionRenderer::Create(ovrHmd hmd,\n                                                     FrameTimeManager& timeManager,\n                                                     const HMDRenderState& renderState)\n{\n    InitGLExtensions();\n\n    return new DistortionRenderer(hmd, timeManager, renderState);\n}\n\n\nbool DistortionRenderer::Initialize(const ovrRenderAPIConfig* apiConfig)\n{\n    const ovrGLConfig* config = (const ovrGLConfig*)apiConfig;\n\n    if (!config)\n    {\n        // Cleanup\n        pEyeTextures[0].Clear();\n        pEyeTextures[1].Clear();\n        memset(&RParams, 0, sizeof(RParams));\n        return true;\n    }\n\n\tRParams.Multisample = config->OGL.Header.Multisample;\n\tRParams.BackBufferSize      = config->OGL.Header.BackBufferSize;\n#if defined(OVR_OS_WIN32)\n\tRParams.Window      = (config->OGL.Window) ? config->OGL.Window : GetActiveWindow();\n    RParams.DC          = config->OGL.DC;\n#elif defined(OVR_OS_LINUX)\n    RotateCCW90 = false;\n    if (   RState.DistortionCaps & ovrDistortionCap_LinuxDevFullscreen\n        && SDKWindow::getRotation(HMD) == DistRotateCCW90)\n    {\n        RotateCCW90 = true;\n    }\n    if (config->OGL.Disp)\n    {\n        RParams.Disp = config->OGL.Disp;\n    }\n    if (!RParams.Disp)\n    {\n        RParams.Disp = glXGetCurrentDisplay();\n    }\n    if (!RParams.Disp)\n    {\n        OVR_DEBUG_LOG((\"glXGetCurrentDisplay failed.\"));\n        return false;\n    }\n#endif\n\t\n    DistortionMeshVAOs[0] = 0;\n    DistortionMeshVAOs[1] = 0;\n\n    LatencyVAO = 0;\n\n    GL::AutoContext autoGLContext(distortionContext); // Initializes distortionContext if not already, saves the current GL context, binds distortionContext, then at the end of scope re-binds the current GL context.\n\n    pEyeTextures[0] = *new Texture(&RParams, 0, 0);\n    pEyeTextures[1] = *new Texture(&RParams, 0, 0);\n\n    initBuffersAndShaders();\n\n    initOverdrive();\n\n    return true;\n}\n\n\nvoid DistortionRenderer::initOverdrive()\n{\n\tif(RState.DistortionCaps & ovrDistortionCap_Overdrive)\n\t{\n\t\tLastUsedOverdriveTextureIndex = 0;\n        \n        glGenFramebuffers(1, &OverdriveFbo);\n        \n        GLint internalFormat = (RState.DistortionCaps & ovrDistortionCap_SRGB) ? GL_SRGB_ALPHA : GL_RGBA;\n        \n\t\tfor (int i = 0; i < NumOverdriveTextures ; i++)\n\t\t{\n            pOverdriveTextures[i] = *new Texture(&RParams, RParams.BackBufferSize.w, RParams.BackBufferSize.h);\n            \n            glBindTexture(GL_TEXTURE_2D, pOverdriveTextures[i]->TexId);\n            glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, RParams.BackBufferSize.w, RParams.BackBufferSize.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);\n            OVR_ASSERT( glGetError() == GL_NO_ERROR );\n\n            pOverdriveTextures[i]->SetSampleMode(Sample_ClampBorder | Sample_Linear);\n            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);\n            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);\n            OVR_ASSERT(glGetError() == 0);\n\n            // clear the new buffer\n            glBindFramebuffer(GL_FRAMEBUFFER, OverdriveFbo );\n            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, pOverdriveTextures[i]->TexId, 0);\n            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);\n            OVR_ASSERT(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);\n            GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0};\n            glDrawBuffers(OVR_ARRAY_COUNT(drawBuffers), drawBuffers);\n            glClearColor(0,0,0,1);\n            glClear(GL_COLOR_BUFFER_BIT);\n        }\n\n        {\n            OverdriveBackBufferTexture = *new Texture(&RParams, RParams.BackBufferSize.w, RParams.BackBufferSize.h);\n\n            glBindTexture(GL_TEXTURE_2D, OverdriveBackBufferTexture->TexId);\n            glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, RParams.BackBufferSize.w, RParams.BackBufferSize.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);\n            OVR_ASSERT(glGetError() == 0);\n\n            OverdriveBackBufferTexture->SetSampleMode(Sample_ClampBorder | Sample_Linear);\n            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);\n            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);\n            OVR_ASSERT(glGetError() == 0);\n\n            // clear the new buffer\n            glBindFramebuffer(GL_FRAMEBUFFER, OverdriveFbo );\n            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, OverdriveBackBufferTexture->TexId, 0);\n            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);\n            OVR_ASSERT(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);\n            GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0};\n            glDrawBuffers(OVR_ARRAY_COUNT(drawBuffers), drawBuffers);\n            glClearColor(0,0,0,1);\n            glClear(GL_COLOR_BUFFER_BIT);\n        }\n\n        glBindFramebuffer(GL_FRAMEBUFFER, 0);\n\t}\n\telse\n\t{\n\t\tLastUsedOverdriveTextureIndex = -1;\n\t}\n}\n\nvoid DistortionRenderer::SubmitEye(int eyeId, const ovrTexture* eyeTexture)\n{\n    // Doesn't do a lot in here??\n\tconst ovrGLTexture* tex = (const ovrGLTexture*)eyeTexture;\n\n\tif (tex)\n\t{\n        // Write in values\n        eachEye[eyeId].texture = tex->OGL.TexId;\n\n        // Its only at this point we discover what the viewport of the texture is.\n\t    // because presumably we allow users to realtime adjust the resolution.\n        eachEye[eyeId].TextureSize    = tex->OGL.Header.TextureSize;\n        eachEye[eyeId].RenderViewport = tex->OGL.Header.RenderViewport;\n\n        const ovrEyeRenderDesc& erd = RState.EyeRenderDesc[eyeId];\n    \n        ovrHmd_GetRenderScaleAndOffset( erd.Fov,\n                                        eachEye[eyeId].TextureSize, eachEye[eyeId].RenderViewport,\n                                        eachEye[eyeId].UVScaleOffset );\n\n\t\tif (!(RState.DistortionCaps & ovrDistortionCap_FlipInput))\n\t\t{\n\t\t\teachEye[eyeId].UVScaleOffset[0].y = -eachEye[eyeId].UVScaleOffset[0].y;\n\t\t\teachEye[eyeId].UVScaleOffset[1].y = 1.0f - eachEye[eyeId].UVScaleOffset[1].y;\n\t\t}\n\n        pEyeTextures[eyeId]->UpdatePlaceholderTexture(tex->OGL.TexId,\n                                                      tex->OGL.Header.TextureSize);\n\t}\n}\n\nvoid DistortionRenderer::renderEndFrame()\n{\n    renderDistortion(pEyeTextures[0], pEyeTextures[1]);\n\n    // TODO: Add rendering context to callback.\n    if(RegisteredPostDistortionCallback)\n       RegisteredPostDistortionCallback(NULL);\n\n    if(LatencyTest2Active)\n    {\n        renderLatencyPixel(LatencyTest2DrawColor);\n    }\n}\n\nvoid DistortionRenderer::EndFrame(bool swapBuffers)\n{\n    Context currContext;\n    currContext.InitFromCurrent();\n#if defined(OVR_OS_MAC)\n    distortionContext.SetSurface( currContext );\n#endif\n\n    // Don't spin if we are explicitly asked not to\n    if ((RState.DistortionCaps & ovrDistortionCap_TimeWarp) &&\n        !(RState.DistortionCaps & ovrDistortionCap_ProfileNoTimewarpSpinWaits))\n    {\n        if (!TimeManager.NeedDistortionTimeMeasurement())\n        {\n            // Wait for timewarp distortion if it is time and Gpu idle\n            FlushGpuAndWaitTillTime(TimeManager.GetFrameTiming().TimewarpPointTime);\n\n            distortionContext.Bind();\n            renderEndFrame();\n        }\n        else\n        {\n            // If needed, measure distortion time so that TimeManager can better estimate\n            // latency-reducing time-warp wait timing.\n            WaitUntilGpuIdle();\n            double  distortionStartTime = ovr_GetTimeInSeconds();\n\n            distortionContext.Bind();\n            renderEndFrame();\n\n            WaitUntilGpuIdle();\n            TimeManager.AddDistortionTimeMeasurement(ovr_GetTimeInSeconds() - distortionStartTime);\n        }\n    }\n    else\n    {\n        distortionContext.Bind();\n        renderEndFrame();\n    }\n\n    if(LatencyTestActive)\n    {\n        renderLatencyQuad(LatencyTestDrawColor);\n    }\n\n    if (swapBuffers)\n    {\n\t\tbool useVsync = ((RState.EnabledHmdCaps & ovrHmdCap_NoVSync) == 0);\n        int ourSwapInterval = (useVsync) ? 1 : 0;\n        int originalSwapInterval;\n        \n#if defined(OVR_OS_WIN32)\n        originalSwapInterval = wglGetSwapIntervalEXT();\n        \n        if (ourSwapInterval != originalSwapInterval)\n            wglSwapIntervalEXT(ourSwapInterval);\n\n        HDC dc = (RParams.DC != NULL) ? RParams.DC : GetDC(RParams.Window);\n\t\tBOOL success = SwapBuffers(dc);\n        OVR_ASSERT_AND_UNUSED(success, success);\n\n        if (RParams.DC == NULL)\n            ReleaseDC(RParams.Window, dc);\n        \n#elif defined(OVR_OS_MAC)\n        originalSwapInterval = 0;\n        CGLContextObj context = CGLGetCurrentContext();\n        CGLError err = CGLGetParameter(context, kCGLCPSwapInterval, &originalSwapInterval);\n        OVR_ASSERT_AND_UNUSED(err == kCGLNoError, err);\n        \n        if (ourSwapInterval != originalSwapInterval)\n            CGLSetParameter(context, kCGLCPSwapInterval, &ourSwapInterval);\n        \n        CGLFlushDrawable(context);\n        \n#elif defined(OVR_OS_LINUX)\n        originalSwapInterval = 0;\n        GLXDrawable drawable = glXGetCurrentDrawable();\n        struct _XDisplay* x11Display = RParams.Disp;\n\n        if(GLE_GLX_EXT_swap_control)\n        {\n            static_assert(sizeof(GLuint) == sizeof(originalSwapInterval), \"size mismatch\");\n            glXQueryDrawable(x11Display, drawable, GLX_SWAP_INTERVAL_EXT, (GLuint*)&originalSwapInterval);\n\n            if (ourSwapInterval != originalSwapInterval)\n                glXSwapIntervalEXT(x11Display, drawable, ourSwapInterval);\n        }\n        else if (GLE_MESA_swap_control) // There is also GLX_SGI_swap_control\n        {\n            originalSwapInterval = glXGetSwapIntervalMESA();\n\n            if (ourSwapInterval != originalSwapInterval)\n                glXSwapIntervalMESA(ourSwapInterval);\n        }\n\n        glXSwapBuffers(x11Display, drawable);\n#endif\n\n        // Force GPU to flush the scene, resulting in the lowest possible latency.\n        // It's critical that this flush is *after* present, because it results in the wait\n        // below completing after the vsync.\n        // With the display driver (direct mode) this flush is obsolete and theoretically\n        // should be a no-op and so doesn't need to be done if running in direct mode.\n        if (RState.OurHMDInfo.InCompatibilityMode &&\n            !(RState.DistortionCaps & ovrDistortionCap_ProfileNoTimewarpSpinWaits))\n            WaitUntilGpuIdle();\n        \n        // Restore the original swap interval if we changed it above.\n        if (originalSwapInterval != ourSwapInterval)\n        {\n#if defined(OVR_OS_WIN32)\n            wglSwapIntervalEXT(originalSwapInterval);\n#elif defined(OVR_OS_MAC)\n            CGLSetParameter(context, kCGLCPSwapInterval, &originalSwapInterval);\n#elif defined(OVR_OS_LINUX)\n            if(GLE_GLX_EXT_swap_control)\n                glXSwapIntervalEXT(x11Display, drawable, (GLuint)originalSwapInterval);\n            else if(GLE_MESA_swap_control)\n                glXSwapIntervalMESA(originalSwapInterval);\n#endif\n        }\n    }\n\n    currContext.Bind();\n}\n\nvoid DistortionRenderer::WaitUntilGpuIdle()\n{\n\tglFinish(); // Block until current OpenGL commands (including swap) are complete.\n}\n\ndouble DistortionRenderer::FlushGpuAndWaitTillTime(double absTime)\n{\n    // because glFlush() is not strict enough certain GL drivers\n    // we do a glFinish(), but before doing so, we make sure we're not\n    // running late\n    double initialTime = ovr_GetTimeInSeconds();\n    if (initialTime >= absTime)\n        return 0.0;\n\n    glFinish();\n\n    return WaitTillTime(absTime);\n}\n\nvoid DistortionRenderer::initBuffersAndShaders()\n{\n    for ( int eyeNum = 0; eyeNum < 2; eyeNum++ )\n    {\n        // Allocate & generate distortion mesh vertices.\n        ovrDistortionMesh meshData;\n\n        if (!ovrHmd_CreateDistortionMesh( HMD,\n                                          RState.EyeRenderDesc[eyeNum].Eye,\n                                          RState.EyeRenderDesc[eyeNum].Fov,\n                                          RState.DistortionCaps,\n                                          &meshData) )\n        {\n            OVR_ASSERT(false);\n            continue;\n        }\n\n        // Now parse the vertex data and create a render ready vertex buffer from it\n        DistortionVertex *   pVBVerts    = (DistortionVertex*)OVR_ALLOC ( sizeof(DistortionVertex) * meshData.VertexCount );\n        DistortionVertex *   pCurVBVert  = pVBVerts;\n        ovrDistortionVertex* pCurOvrVert = meshData.pVertexData;\n\n        for ( unsigned vertNum = 0; vertNum < meshData.VertexCount; vertNum++ )\n        {\n            pCurVBVert->ScreenPosNDC.x = pCurOvrVert->ScreenPosNDC.x;\n            pCurVBVert->ScreenPosNDC.y = pCurOvrVert->ScreenPosNDC.y;\n\n            if (RotateCCW90)\n            {\n                OVR::Alg::Swap(pCurVBVert->ScreenPosNDC.x, pCurVBVert->ScreenPosNDC.y);\n                pCurVBVert->ScreenPosNDC.x = -pCurVBVert->ScreenPosNDC.x;\n            }\n\n            // Previous code here did this: pCurVBVert->TanEyeAnglesR = (*(Vector2f*)&pCurOvrVert->TanEyeAnglesR); However that's an usafe\n            // cast of unrelated types which can result in undefined behavior by a conforming compiler. A safe equivalent is simply memcpy.\n            static_assert(sizeof(OVR::Vector2f) == sizeof(ovrVector2f), \"Mismatch of structs that are presumed binary equivalents.\");\n            memcpy(&pCurVBVert->TanEyeAnglesR, &pCurOvrVert->TanEyeAnglesR, sizeof(pCurVBVert->TanEyeAnglesR));\n            memcpy(&pCurVBVert->TanEyeAnglesG, &pCurOvrVert->TanEyeAnglesG, sizeof(pCurVBVert->TanEyeAnglesG));\n            memcpy(&pCurVBVert->TanEyeAnglesB, &pCurOvrVert->TanEyeAnglesB, sizeof(pCurVBVert->TanEyeAnglesB));\n\n            // Convert [0.0f,1.0f] to [0,255]\n\t\t\tif (RState.DistortionCaps & ovrDistortionCap_Vignette)\n            {\n                if(RState.DistortionCaps & ovrDistortionCap_SRGB)\n                    pCurOvrVert->VignetteFactor = pow(pCurOvrVert->VignetteFactor, 2.1f);\n\n                pCurVBVert->Col.R = (uint8_t)( Alg::Max ( pCurOvrVert->VignetteFactor, 0.0f ) * 255.99f );\n            }\n\t\t\telse\n\t\t\t\tpCurVBVert->Col.R = 255;\n\n            pCurVBVert->Col.G = pCurVBVert->Col.R;\n            pCurVBVert->Col.B = pCurVBVert->Col.R;\n            pCurVBVert->Col.A = (uint8_t)( pCurOvrVert->TimeWarpFactor * 255.99f );;\n            pCurOvrVert++;\n            pCurVBVert++;\n        }\n\n        DistortionMeshVBs[eyeNum] = *new Buffer(&RParams);\n        DistortionMeshVBs[eyeNum]->Data ( Buffer_Vertex | Buffer_ReadOnly, pVBVerts, sizeof(DistortionVertex) * meshData.VertexCount );\n        DistortionMeshIBs[eyeNum] = *new Buffer(&RParams);\n        DistortionMeshIBs[eyeNum]->Data ( Buffer_Index | Buffer_ReadOnly, meshData.pIndexData, ( sizeof(int16_t) * meshData.IndexCount ) );\n\n        OVR_FREE ( pVBVerts );\n        ovrHmd_DestroyDistortionMesh( &meshData );\n    }\n\n    initShaders();\n}\n\nvoid DistortionRenderer::renderDistortion(Texture* leftEyeTexture, Texture* rightEyeTexture)\n{\n    bool overdriveActive = IsOverdriveActive();\n    int currOverdriveTextureIndex = -1;\n\n    if(overdriveActive)\n    {\n        currOverdriveTextureIndex = (LastUsedOverdriveTextureIndex + 1) % NumOverdriveTextures;\n\n        //glBindFramebuffer(GL_FRAMEBUFFER, 0);\n        glBindFramebuffer(GL_FRAMEBUFFER, OverdriveFbo );\n        \n        GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};\n        glDrawBuffers(OVR_ARRAY_COUNT(drawBuffers), drawBuffers);\n\n        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, pOverdriveTextures[currOverdriveTextureIndex]->TexId, 0);\n        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, OverdriveBackBufferTexture->TexId, 0);\n        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);\n        OVR_ASSERT(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);\n    }\n    else\n    {\n        glBindFramebuffer(GL_FRAMEBUFFER, 0);\n    }\n\n    setViewport( Recti(0,0, RParams.BackBufferSize.w, RParams.BackBufferSize.h) );\n\n\tif (RState.DistortionCaps & ovrDistortionCap_SRGB)\n\t\tglEnable(GL_FRAMEBUFFER_SRGB);\n    else\n        glDisable(GL_FRAMEBUFFER_SRGB);\n\n\tglDisable(GL_CULL_FACE);\n\tglDisable(GL_DEPTH_TEST);\n    \n    if (GLE_EXT_draw_buffers2)\n    {\n        glDisablei(GL_BLEND, 0);\n        glColorMaski(0, GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);\n    }\n    else\n    {\n        glDisable(GL_BLEND);\n        glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);\n    }\n    \n    glDisable(GL_DITHER);\n    glDisable(GL_RASTERIZER_DISCARD);\n    if (GLEContext::GetCurrentContext()->WholeVersion >= 302)\n    {\n        glDisable(GL_SAMPLE_MASK);\n    }\n        \n\tglClearColor(\n\t\tRState.ClearColor[0],\n\t\tRState.ClearColor[1],\n\t\tRState.ClearColor[2],\n\t\tRState.ClearColor[3] );\n\n    glClear(GL_COLOR_BUFFER_BIT);\n\n    for (int eyeNum = 0; eyeNum < 2; eyeNum++)\n    {\n\t\tShaderFill distortionShaderFill(DistortionShader);\n        distortionShaderFill.SetTexture(0, eyeNum == 0 ? leftEyeTexture : rightEyeTexture);\n\n        if(overdriveActive)\n        {\n            distortionShaderFill.SetTexture(1, pOverdriveTextures[LastUsedOverdriveTextureIndex]);\n\n            float overdriveScaleRegularRise;\n            float overdriveScaleRegularFall;\n            GetOverdriveScales(overdriveScaleRegularRise, overdriveScaleRegularFall);\n            DistortionShader->SetUniform3f(\"OverdriveScales_IsSrgb\", overdriveScaleRegularRise, overdriveScaleRegularFall,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(RState.DistortionCaps & ovrDistortionCap_SRGB) ? 1.0f : -1.0f);\n        }\n        else\n        {\n            // -1.0f disables PLO            \n            DistortionShader->SetUniform3f(\"OverdriveScales_IsSrgb\", -1.0f, -1.0f, -1.0f);\n        }\n\n\t\tDistortionShader->SetUniform2f(\"EyeToSourceUVScale\",  eachEye[eyeNum].UVScaleOffset[0].x, eachEye[eyeNum].UVScaleOffset[0].y);\n        // Convert Y to 1-Y as OpenGL is inverse of D3D\n\t\tDistortionShader->SetUniform2f(\"EyeToSourceUVOffset\", eachEye[eyeNum].UVScaleOffset[1].x, 1.0f - eachEye[eyeNum].UVScaleOffset[1].y);\n        \n\t\tif (RState.DistortionCaps & ovrDistortionCap_TimeWarp)\n\t\t{                       \n            ovrMatrix4f timeWarpMatrices[2];            \n            ovrHmd_GetEyeTimewarpMatrices(HMD, (ovrEyeType)eyeNum,\n                                          RState.EyeRenderPoses[eyeNum], timeWarpMatrices);\n\n            // Feed identity like matrices in until we get proper timewarp calculation going on\n\t\t\tDistortionShader->SetUniform4x4f(\"EyeRotationStart\", Matrix4f(timeWarpMatrices[0]).Transposed());\n\t\t\tDistortionShader->SetUniform4x4f(\"EyeRotationEnd\",   Matrix4f(timeWarpMatrices[1]).Transposed());\n\n            renderPrimitives(&distortionShaderFill, DistortionMeshVBs[eyeNum], DistortionMeshIBs[eyeNum],\n                            0, (int)DistortionMeshIBs[eyeNum]->GetSize()/2, Prim_Triangles, &DistortionMeshVAOs[eyeNum], true);\n\t\t}\n        else\n        {\n            renderPrimitives(&distortionShaderFill, DistortionMeshVBs[eyeNum], DistortionMeshIBs[eyeNum],\n                            0, (int)DistortionMeshIBs[eyeNum]->GetSize()/2, Prim_Triangles, &DistortionMeshVAOs[eyeNum], true);\n        }\n    }\n\n    LastUsedOverdriveTextureIndex = currOverdriveTextureIndex;\n\n    // Re-activate to only draw on back buffer\n    if(overdriveActive)\n    {\n        GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0};\n        glDrawBuffers(OVR_ARRAY_COUNT(drawBuffers), drawBuffers);\n\n        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);\n        //glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);\n        //glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, 0, 0);\n        OVR_ASSERT(glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);\n\n        glBindFramebuffer( GL_READ_FRAMEBUFFER, OverdriveFbo );\n        glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, OverdriveBackBufferTexture->TexId, 0);\n        glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);\n        OVR_ASSERT(glCheckFramebufferStatus(GL_READ_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);\n\n        glBlitFramebuffer( 0, 0, OverdriveBackBufferTexture->GetWidth(), OverdriveBackBufferTexture->GetHeight(),\n                           0, 0, OverdriveBackBufferTexture->GetWidth(), OverdriveBackBufferTexture->GetHeight(),\n                           GL_COLOR_BUFFER_BIT, GL_NEAREST );\n\n        glBindFramebuffer( GL_FRAMEBUFFER, 0 );\n        GLint err = glGetError();\n        OVR_ASSERT(!err); OVR_UNUSED(err);\n    }\n}\n\n\nvoid DistortionRenderer::createDrawQuad()\n{\n    const int numQuadVerts = 4;\n    LatencyTesterQuadVB = *new Buffer(&RParams);\n    if(!LatencyTesterQuadVB)\n    {\n        return;\n    }\n\n    LatencyTesterQuadVB->Data(Buffer_Vertex, NULL, numQuadVerts * sizeof(LatencyVertex));\n    LatencyVertex* vertices = (LatencyVertex*)LatencyTesterQuadVB->Map(0, numQuadVerts * sizeof(LatencyVertex), Map_Discard);\n    if(!vertices)\n    {\n        OVR_ASSERT(false); // failed to lock vertex buffer\n        return;\n    }\n\n    const float left   = -1.0f;\n    const float top    = -1.0f;\n    const float right  =  1.0f;\n    const float bottom =  1.0f;\n\n    vertices[0] = LatencyVertex(Vector3f(left,  top,    0.0f));\n    vertices[1] = LatencyVertex(Vector3f(left,  bottom, 0.0f));\n    vertices[2] = LatencyVertex(Vector3f(right, top,    0.0f));\n    vertices[3] = LatencyVertex(Vector3f(right, bottom, 0.0f));\n\n    LatencyTesterQuadVB->Unmap(vertices);\n}\n\nvoid DistortionRenderer::renderLatencyQuad(unsigned char* latencyTesterDrawColor)\n{\n    const int numQuadVerts = 4;\n\n    if(!LatencyTesterQuadVB)\n    {\n        createDrawQuad();\n    }\n       \n    Ptr<ShaderSet> quadShader = (RState.DistortionCaps & ovrDistortionCap_SRGB) ? SimpleQuadGammaShader : SimpleQuadShader;\n    ShaderFill quadFill(quadShader);\n    //quadFill.SetInputLayout(SimpleQuadVertexIL);\n\n    setViewport(Recti(0,0, RParams.BackBufferSize.w, RParams.BackBufferSize.h));\n\n    quadShader->SetUniform2f(\"Scale\", 0.3f, 0.3f);\n    quadShader->SetUniform4f(\"Color\", (float)latencyTesterDrawColor[0] / 255.99f,\n                                      (float)latencyTesterDrawColor[0] / 255.99f,\n                                      (float)latencyTesterDrawColor[0] / 255.99f,\n                                      1.0f);\n\n    for(int eyeNum = 0; eyeNum < 2; eyeNum++)\n    {\n        quadShader->SetUniform2f(\"PositionOffset\", eyeNum == 0 ? -0.5f : 0.5f, 0.0f);    \n        renderPrimitives(&quadFill, LatencyTesterQuadVB, NULL, 0, numQuadVerts, Prim_TriangleStrip, &LatencyVAO, false);\n    }\n}\n\nvoid DistortionRenderer::renderLatencyPixel(unsigned char* latencyTesterPixelColor)\n{\n    const int numQuadVerts = 4;\n\n    if(!LatencyTesterQuadVB)\n    {\n        createDrawQuad();\n    }\n\n    Ptr<ShaderSet> quadShader = (RState.DistortionCaps & ovrDistortionCap_SRGB) ? SimpleQuadGammaShader : SimpleQuadShader;\n    ShaderFill quadFill(quadShader);\n\n    setViewport(Recti(0,0, RParams.BackBufferSize.w, RParams.BackBufferSize.h));\n\n#ifdef OVR_BUILD_DEBUG\n    quadShader->SetUniform4f(\"Color\", (float)latencyTesterPixelColor[0] / 255.99f,\n                                      (float)latencyTesterPixelColor[1] / 255.99f,\n                                      (float)latencyTesterPixelColor[2] / 255.99f,\n                                      1.0f);\n\n    Vector2f scale(20.0f / RParams.BackBufferSize.w, 20.0f / RParams.BackBufferSize.h); \n#else\n    quadShader->SetUniform4f(\"Color\", (float)latencyTesterPixelColor[0] / 255.99f,\n                                      (float)latencyTesterPixelColor[0] / 255.99f,\n                                      (float)latencyTesterPixelColor[0] / 255.99f,\n                                      1.0f);\n\n    Vector2f scale(1.0f / RParams.BackBufferSize.w, 1.0f / RParams.BackBufferSize.h); \n#endif\n    quadShader->SetUniform2f(\"Scale\", scale.x, scale.y);\n    if (!RotateCCW90)\n        quadShader->SetUniform2f(\"PositionOffset\", 1.0f-scale.x, 1.0f-scale.y);\n    else\n        quadShader->SetUniform2f(\"PositionOffset\", -(1.0f-scale.x), 1.0f-scale.y);\n\trenderPrimitives(&quadFill, LatencyTesterQuadVB, NULL, 0, numQuadVerts, Prim_TriangleStrip, &LatencyVAO, false);\n}\n\nvoid DistortionRenderer::renderPrimitives(\n                          const ShaderFill* fill,\n                          Buffer* vertices, Buffer* indices,\n                          int offset, int count,\n                          PrimitiveType rprim, GLuint* vao, bool isDistortionMesh)\n{\n    GLenum prim;\n    switch (rprim)\n    {\n    case Prim_Triangles:\n        prim = GL_TRIANGLES;\n        break;\n    case Prim_Lines:\n        prim = GL_LINES;\n        break;\n    case Prim_TriangleStrip:\n        prim = GL_TRIANGLE_STRIP;\n        break;\n    default:\n        OVR_ASSERT(false);\n        return;\n    }\n\n    fill->Set();\n    \n    GLuint prog = fill->GetShaders()->Prog;\n\n\tif (vao != NULL)\n\t{\n\t\tif (*vao != 0)\n\t\t{\n            glBindVertexArray(*vao);\n\n\t\t\tif (isDistortionMesh)\n\t\t\t\tglDrawElements(prim, count, GL_UNSIGNED_SHORT, NULL);\n\t\t\telse\n\t\t\t\tglDrawArrays(prim, 0, count);\n\n            glBindVertexArray(0);\n\t\t}\n\t\telse\n\t\t{\n            if (GL_ARB_vertex_array_object)\n            {\n                glGenVertexArrays(1, vao);\n                glBindVertexArray(*vao);\n            }\n\n\t\t\tint attributeCount = (isDistortionMesh) ? 5 : 1;\n\t\t\tint* locs = new int[attributeCount];\n\n\t\t\tglBindBuffer(GL_ARRAY_BUFFER, ((Buffer*)vertices)->GLBuffer);\n\n\t\t\tif (isDistortionMesh)\n\t\t\t{\n\t\t\t\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ((Buffer*)indices)->GLBuffer);\n\n\t\t\t\tlocs[0] = glGetAttribLocation(prog, \"Position\");\n\t\t\t\tlocs[1] = glGetAttribLocation(prog, \"Color\");\n\t\t\t\tlocs[2] = glGetAttribLocation(prog, \"TexCoord0\");\n\t\t\t\tlocs[3] = glGetAttribLocation(prog, \"TexCoord1\");\n\t\t\t\tlocs[4] = glGetAttribLocation(prog, \"TexCoord2\");\n\n\t\t\t\tglVertexAttribPointer(locs[0], 2, GL_FLOAT, false, sizeof(DistortionVertex), reinterpret_cast<char*>(offset)+offsetof(DistortionVertex, ScreenPosNDC));\n\t\t\t\tglVertexAttribPointer(locs[1], 4, GL_UNSIGNED_BYTE, true, sizeof(DistortionVertex), reinterpret_cast<char*>(offset)+offsetof(DistortionVertex, Col));\n\t\t\t\tglVertexAttribPointer(locs[2], 2, GL_FLOAT, false, sizeof(DistortionVertex), reinterpret_cast<char*>(offset)+offsetof(DistortionVertex, TanEyeAnglesR));\n\t\t\t\tglVertexAttribPointer(locs[3], 2, GL_FLOAT, false, sizeof(DistortionVertex), reinterpret_cast<char*>(offset)+offsetof(DistortionVertex, TanEyeAnglesG));\n\t\t\t\tglVertexAttribPointer(locs[4], 2, GL_FLOAT, false, sizeof(DistortionVertex), reinterpret_cast<char*>(offset)+offsetof(DistortionVertex, TanEyeAnglesB));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tlocs[0] = glGetAttribLocation(prog, \"Position\");\n\n\t\t\t\tglVertexAttribPointer(locs[0], 3, GL_FLOAT, false, sizeof(LatencyVertex), reinterpret_cast<char*>(offset)+offsetof(LatencyVertex, Pos));\n\t\t\t}\n\n            for (int i = 0; i < attributeCount; ++i)\n                glEnableVertexAttribArray(locs[i]);\n            \n\t\t\tif (isDistortionMesh)\n\t\t\t\tglDrawElements(prim, count, GL_UNSIGNED_SHORT, NULL);\n\t\t\telse\n\t\t\t\tglDrawArrays(prim, 0, count);\n\n\n            if (!GL_ARB_vertex_array_object)\n            {\n\t\t\t\tfor (int i = 0; i < attributeCount; ++i)\n                    glDisableVertexAttribArray(locs[i]);\n            }\n\n\t\t\tdelete[] locs;\n\n            if (GL_ARB_vertex_array_object)\n            {\n                glBindVertexArray(0);\n            }\n\t\t}\n\t}\n}\n\nvoid DistortionRenderer::setViewport(const Recti& vp)\n{\n    glViewport(vp.x, vp.y, vp.w, vp.h);\n}\n\n\nvoid DistortionRenderer::initShaders()\n{\n    const char* shaderPrefix = (GLEContext::GetCurrentContext()->WholeVersion >= 302) ? glsl3Prefix : glsl2Prefix;\n\n    {\n\t\tShaderInfo vsInfo = DistortionVertexShaderLookup[DistortionVertexShaderBitMask & RState.DistortionCaps];\n\n\t\tsize_t vsSize = strlen(shaderPrefix)+vsInfo.ShaderSize;\n\t\tchar* vsSource = new char[vsSize];\n\t\tOVR_strcpy(vsSource, vsSize, shaderPrefix);\n\t\tOVR_strcat(vsSource, vsSize, vsInfo.ShaderData);\n\n        Ptr<GL::VertexShader> vs = *new GL::VertexShader(\n            &RParams,\n\t\t\t(void*)vsSource, vsSize,\n\t\t\tvsInfo.ReflectionData, vsInfo.ReflectionSize);\n\n        DistortionShader = *new ShaderSet;\n        DistortionShader->SetShader(vs);\n\n\t\tdelete[](vsSource);\n\n\t\tShaderInfo psInfo = DistortionPixelShaderLookup[DistortionPixelShaderBitMask & RState.DistortionCaps];\n\n\t\tsize_t psSize = strlen(shaderPrefix)+psInfo.ShaderSize;\n\t\tchar* psSource = new char[psSize];\n\t\tOVR_strcpy(psSource, psSize, shaderPrefix);\n\t\tOVR_strcat(psSource, psSize, psInfo.ShaderData);\n\n        Ptr<GL::FragmentShader> ps  = *new GL::FragmentShader(\n            &RParams,\n\t\t\t(void*)psSource, psSize,\n\t\t\tpsInfo.ReflectionData, psInfo.ReflectionSize);\n\n        DistortionShader->SetShader(ps);\n\n\t\tdelete[](psSource);\n    }\n\t{\n\t\tsize_t vsSize = strlen(shaderPrefix)+sizeof(SimpleQuad_vs);\n\t\tchar* vsSource = new char[vsSize];\n\t\tOVR_strcpy(vsSource, vsSize, shaderPrefix);\n\t\tOVR_strcat(vsSource, vsSize, SimpleQuad_vs);\n\n        Ptr<GL::VertexShader> vs = *new GL::VertexShader(\n            &RParams,\n            (void*)vsSource, vsSize,\n\t\t\tSimpleQuad_vs_refl, sizeof(SimpleQuad_vs_refl) / sizeof(SimpleQuad_vs_refl[0]));\n\n        SimpleQuadShader = *new ShaderSet;\n\t\tSimpleQuadShader->SetShader(vs);\n\n\t\tdelete[](vsSource);\n\n\t\tsize_t psSize = strlen(shaderPrefix)+sizeof(SimpleQuad_fs);\n\t\tchar* psSource = new char[psSize];\n\t\tOVR_strcpy(psSource, psSize, shaderPrefix);\n\t\tOVR_strcat(psSource, psSize, SimpleQuad_fs);\n\n        Ptr<GL::FragmentShader> ps  = *new GL::FragmentShader(\n            &RParams,\n            (void*)psSource, psSize,\n            SimpleQuad_fs_refl, sizeof(SimpleQuad_fs_refl) / sizeof(SimpleQuad_fs_refl[0]));\n\n\t\tSimpleQuadShader->SetShader(ps);\n\n\t\tdelete[](psSource);\n    }\n    {\n        size_t vsSize = strlen(shaderPrefix)+sizeof(SimpleQuad_vs);\n        char* vsSource = new char[vsSize];\n        OVR_strcpy(vsSource, vsSize, shaderPrefix);\n        OVR_strcat(vsSource, vsSize, SimpleQuad_vs);\n\n        Ptr<GL::VertexShader> vs = *new GL::VertexShader(\n            &RParams,\n            (void*)vsSource, vsSize,\n            SimpleQuad_vs_refl, sizeof(SimpleQuad_vs_refl) / sizeof(SimpleQuad_vs_refl[0]));\n\n        SimpleQuadGammaShader = *new ShaderSet;\n        SimpleQuadGammaShader->SetShader(vs);\n\n        delete[](vsSource);\n\n        size_t psSize = strlen(shaderPrefix)+sizeof(SimpleQuadGamma_fs);\n        char* psSource = new char[psSize];\n        OVR_strcpy(psSource, psSize, shaderPrefix);\n        OVR_strcat(psSource, psSize, SimpleQuadGamma_fs);\n\n        Ptr<GL::FragmentShader> ps  = *new GL::FragmentShader(\n            &RParams,\n            (void*)psSource, psSize,\n            SimpleQuadGamma_fs_refl, sizeof(SimpleQuadGamma_fs_refl) / sizeof(SimpleQuadGamma_fs_refl[0]));\n\n        SimpleQuadGammaShader->SetShader(ps);\n\n        delete[](psSource);\n    }\n}\n\n\nvoid DistortionRenderer::destroy()\n{\n    Context currContext;\n    currContext.InitFromCurrent();\n    \n    distortionContext.Bind();\n\n\tfor(int eyeNum = 0; eyeNum < 2; eyeNum++)\n\t{\n        if (GL_ARB_vertex_array_object)\n        {\n            glDeleteVertexArrays(1, &DistortionMeshVAOs[eyeNum]);\n        }\n\n\t\tDistortionMeshVAOs[eyeNum] = 0;\n\n\t\tDistortionMeshVBs[eyeNum].Clear();\n\t\tDistortionMeshIBs[eyeNum].Clear();\n\t}\n\n\tif (DistortionShader)\n    {\n        DistortionShader->UnsetShader(Shader_Vertex);\n\t    DistortionShader->UnsetShader(Shader_Pixel);\n\t    DistortionShader.Clear();\n    }\n\n    LatencyTesterQuadVB.Clear();\n\n    if(LatencyVAO != 0)\n    {\n        glDeleteVertexArrays(1, &LatencyVAO);\n\t    LatencyVAO = 0;\n    }\n\n    if(OverdriveFbo != 0)\n    {\n        glDeleteFramebuffers(1, &OverdriveFbo);\n    }\n\n    currContext.Bind();\n    distortionContext.Destroy();\n    // Who is responsible for destroying the app's context?\n}\n\n\n}}} // OVR::CAPI::GL\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/GL/CAPI_GL_DistortionRenderer.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_GL_DistortionRenderer.h\nContent     :   Distortion renderer header for GL\nCreated     :   November 11, 2013\nAuthors     :   David Borel, Lee Cooper\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_GL_DistortionRenderer_h\n#define OVR_CAPI_GL_DistortionRenderer_h\n\n#include \"../CAPI_DistortionRenderer.h\"\n\n#include \"../../Kernel/OVR_Log.h\"\n#include \"CAPI_GL_Util.h\"\n\nnamespace OVR { namespace CAPI { namespace GL {\n\n// ***** GL::DistortionRenderer\n\n// Implementation of DistortionRenderer for GL.\n\nclass DistortionRenderer : public CAPI::DistortionRenderer\n{\npublic:    \n    DistortionRenderer(ovrHmd hmd,\n                       FrameTimeManager& timeManager,\n                       const HMDRenderState& renderState);\n    virtual ~DistortionRenderer();\n\n    \n    // Creation function for the device.    \n    static CAPI::DistortionRenderer* Create(ovrHmd hmd,\n                                            FrameTimeManager& timeManager,\n                                            const HMDRenderState& renderState);\n\n\n    // ***** Public DistortionRenderer interface\n\t\n    virtual bool Initialize(const ovrRenderAPIConfig* apiConfig) OVR_OVERRIDE;\n\n    virtual void SubmitEye(int eyeId, const ovrTexture* eyeTexture);\n\n    virtual void EndFrame(bool swapBuffers);\n\n    void         WaitUntilGpuIdle();\n\n\t// Similar to ovr_WaitTillTime but it also flushes GPU.\n\t// Note, it exits when time expires, even if GPU is not in idle state yet.\n\tdouble       FlushGpuAndWaitTillTime(double absTime);\n\nprotected:\n\n\tstruct FOR_EACH_EYE\n\t{\n        FOR_EACH_EYE() : numVerts(0), numIndices(0), texture(0), /*UVScaleOffset[],*/ TextureSize(0, 0), RenderViewport(0, 0, 0, 0) { }\n\n\t\tint                       numVerts;\n\t\tint                       numIndices;\n\n\t\tGLuint                    texture;\n\n\t\tovrVector2f\t\t\t \t  UVScaleOffset[2];\n        Sizei                     TextureSize;\n        Recti                     RenderViewport;\n\t} eachEye[2];\n\n    Ptr<Texture>    pOverdriveTextures[NumOverdriveTextures];\n    Ptr<Texture>    OverdriveBackBufferTexture;\n\n    // GL context and utility variables.\n    RenderParams        RParams;\n    Context             distortionContext;  // We are currently using this private OpenGL context instead of using the CAPI SaveGraphicsState/RestoreGraphicsState mechanism. To consider: Move this Context into SaveGraphicsState/RestoreGraphicState so there's consistency between DirectX and OpenGL.\n\n\t// Helpers\n    void initOverdrive();\n    void initBuffersAndShaders();\n    void initShaders();\n    void initFullscreenQuad();\n    void destroy();\n\t\n    void setViewport(const Recti& vp);\n\n    void renderDistortion(Texture* leftEyeTexture, Texture* rightEyeTexture);\n\n    void renderPrimitives(const ShaderFill* fill, Buffer* vertices, Buffer* indices,\n                          int offset, int count,\n\t\t\t\t\t\t  PrimitiveType rprim, GLuint* vao, bool isDistortionMesh);\n\n\tvoid createDrawQuad();\n    void renderLatencyQuad(unsigned char* latencyTesterDrawColor);\n    void renderLatencyPixel(unsigned char* latencyTesterPixelColor);\n\t\n    void renderEndFrame();\n\n    Ptr<Texture>        pEyeTextures[2];\n\n\tPtr<Buffer>         DistortionMeshVBs[2];    // one per-eye\n\tPtr<Buffer>         DistortionMeshIBs[2];    // one per-eye\n\tGLuint              DistortionMeshVAOs[2];   // one per-eye\n\n\tPtr<ShaderSet>      DistortionShader;\n\n    bool                RotateCCW90;\n\n    struct StandardUniformData\n    {\n        Matrix4f  Proj;\n        Matrix4f  View;\n    }                   StdUniforms;\n\t\n\tGLuint              LatencyVAO;\n    Ptr<Buffer>         LatencyTesterQuadVB;\n    Ptr<ShaderSet>      SimpleQuadShader;\n    Ptr<ShaderSet>      SimpleQuadGammaShader;\n\n    GLuint              OverdriveFbo;\n\n\tGLint SavedViewport[4];\n\tGLfloat SavedClearColor[4];\n\tGLint SavedDepthTest;\n\tGLint SavedCullFace;\n\tGLint SavedProgram;\n\tGLint SavedActiveTexture;\n\tGLint SavedBoundTexture;\n\tGLint SavedVertexArray;\n    GLint SavedBoundFrameBuffer;\n};\n\n}}} // OVR::CAPI::GL\n\n#endif // OVR_CAPI_GL_DistortionRenderer_h\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/GL/CAPI_GL_DistortionShaders.h",
    "content": "/************************************************************************************\n \n Filename    :   CAPI_GL_Shaders.h\n Content     :   Distortion shader header for GL\n Created     :   November 11, 2013\n Authors     :   David Borel, Volga Aksoy\n \n Copyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n \n ************************************************************************************/\n\n\n#ifndef OVR_CAPI_GL_Shaders_h\n#define OVR_CAPI_GL_Shaders_h\n\n\n#include \"CAPI_GL_Util.h\"\n\nnamespace OVR { namespace CAPI { namespace GL {\n    \n    static const char glsl2Prefix[] =\n    \"#version 110\\n\"\n    \"#extension GL_ARB_shader_texture_lod : enable\\n\"\n    \"#extension GL_ARB_draw_buffers : enable\\n\"\n    \"#extension GL_EXT_gpu_shader4 : enable\\n\"\n    \"#define _FRAGCOLOR_DECLARATION\\n\"\n    \"#define _MRTFRAGCOLOR0_DECLARATION\\n\"\n    \"#define _MRTFRAGCOLOR1_DECLARATION\\n\"\n    \"#define _GLFRAGCOORD_DECLARATION\\n\"\n    \"#define _VS_IN attribute\\n\"\n    \"#define _VS_OUT varying\\n\"\n    \"#define _FS_IN varying\\n\"\n    \"#define _TEXTURELOD texture2DLod\\n\"\n    \"#define _TEXTURE texture2D\\n\"\n    \"#define _FRAGCOLOR gl_FragColor\\n\"\n    \"#define _MRTFRAGCOLOR0 gl_FragData[0]\\n\"\n    \"#define _MRTFRAGCOLOR1 gl_FragData[1]\\n\"       // The texture coordinate [0.0,1.0] for texel i of a texture of size N is: (2i + 1)/2N\n    \"#ifdef GL_EXT_gpu_shader4\\n\"\n    \"  #define _TEXELFETCHDECL vec4 texelFetch(sampler2D tex, ivec2 coord, int lod){ ivec2 size = textureSize2D(tex, lod); return texture2D(tex, vec2(float((coord.x * 2) + 1) / float(size.x * 2), float((coord.y * 2) + 1) / float(size.y * 2))); }\\n\"\n    \"#endif\\n\";\n    \n    static const char glsl3Prefix[] =\n    \"#version 150\\n\"\n    \"#define _FRAGCOLOR_DECLARATION out vec4 FragColor;\\n\"\n    \"#define _MRTFRAGCOLOR0_DECLARATION out vec4 FragData0;\\n\"\n    \"#define _MRTFRAGCOLOR1_DECLARATION out vec4 FragData1;\\n\"\n    \"#define _GLFRAGCOORD_DECLARATION in vec4 gl_FragCoord;\\n\"\n    \"#define _VS_IN in\\n\"\n    \"#define _VS_OUT out\\n\"\n    \"#define _FS_IN in\\n\"\n    \"#define _TEXTURELOD textureLod\\n\"\n    \"#define _TEXTURE texture\\n\"\n    \"#define _FRAGCOLOR FragColor\\n\"\n    \"#define _MRTFRAGCOLOR0 FragData0\\n\"\n    \"#define _MRTFRAGCOLOR1 FragData1\\n\"\n    \"#define _TEXELFETCHDECL\\n\";\n    \n    static const char SimpleQuad_vs[] =\n    \"uniform vec2 PositionOffset;\\n\"\n    \"uniform vec2 Scale;\\n\"\n    \n    \"_VS_IN vec3 Position;\\n\"\n    \n\t\"void main()\\n\"\n\t\"{\\n\"\n\t\"\tgl_Position = vec4(Position.xy * Scale + PositionOffset, 0.5, 1.0);\\n\"\n\t\"}\\n\";\n    \n    const OVR::CAPI::GL::ShaderBase::Uniform SimpleQuad_vs_refl[] =\n    {\n        { \"PositionOffset\", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 8 },\n        { \"Scale\",          OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 8, 8 },\n    };\n    \n    static const char SimpleQuad_fs[] =\n    \"uniform vec4 Color;\\n\"\n    \n    \"_FRAGCOLOR_DECLARATION\\n\"\n    \n\t\"void main()\\n\"\n\t\"{\\n\"\n\t\"    _FRAGCOLOR = Color;\\n\"\n\t\"}\\n\";\n    \n    const OVR::CAPI::GL::ShaderBase::Uniform SimpleQuad_fs_refl[] =\n    {\n        { \"Color\", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 16 },\n    };\n\n    static const char SimpleQuadGamma_fs[] =\n        \"uniform vec4 Color;\\n\"\n\n        \"_FRAGCOLOR_DECLARATION\\n\"\n\n        \"void main()\\n\"\n        \"{\\n\"\n        \"    _FRAGCOLOR.rgb = pow(Color.rgb, vec3(2.2));\\n\"\n        \"    _FRAGCOLOR.a = Color.a;\\n\"\n        \"}\\n\";\n\n    const OVR::CAPI::GL::ShaderBase::Uniform SimpleQuadGamma_fs_refl[] =\n    {\n        { \"Color\", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 16 },\n    };\n\n    // This must be prefixed with glsl2Prefix or glsl3Prefix before being compiled.\n    static const char SimpleTexturedQuad_vs[] =\n        \"uniform vec2 PositionOffset;\\n\"\n        \"uniform vec2 Scale;\\n\"\n\n        \"_VS_IN vec3 Position;\\n\"\n        \"_VS_IN vec4 Color;\\n\"\n        \"_VS_IN vec2 TexCoord;\\n\"\n  \n        \"_VS_OUT vec4 oColor;\\n\"\n        \"_VS_OUT vec2 oTexCoord;\\n\"\n\n        \"void main()\\n\"\n        \"{\\n\"\n\t    \"\tgl_Position = vec4(Position.xy * Scale + PositionOffset, 0.5, 1.0);\\n\"\n        \"   oColor = Color;\\n\"\n        \"   oTexCoord = TexCoord;\\n\"\n        \"}\\n\";\n\n    // The following declaration is copied from the generated D3D SimpleTexturedQuad_vs_refl.h file, with D3D_NS renamed to GL.\n    const OVR::CAPI::GL::ShaderBase::Uniform SimpleTexturedQuad_vs_refl[] =\n    {\n\t    { \"PositionOffset\", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 8 },\n\t    { \"Scale\",          OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 8, 8 },\n    };\n\n\n    // This must be prefixed with glsl2Prefix or glsl3Prefix before being compiled.\n    static const char SimpleTexturedQuad_ps[] =\n        \"uniform sampler2D Texture0;\\n\"\n    \n        \"_FS_IN vec4 oColor;\\n\"\n        \"_FS_IN vec2 oTexCoord;\\n\"\n    \n        \"_FRAGCOLOR_DECLARATION\\n\"\n\n        \"void main()\\n\"\n        \"{\\n\"\n        \"   _FRAGCOLOR = oColor * _TEXTURE(Texture0, oTexCoord);\\n\"\n        \"}\\n\";\n\n    // The following is copied from the generated D3D SimpleTexturedQuad_ps_refl.h file, with D3D_NS renamed to GL.\n    const OVR::CAPI::GL::ShaderBase::Uniform SimpleTexturedQuad_ps_refl[] =\n    {\n\t    { \"Color\", \tOVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 16 },\n    };\n\n    \n    static const char Distortion_vs[] =\n    \"uniform vec2 EyeToSourceUVScale;\\n\"\n    \"uniform vec2 EyeToSourceUVOffset;\\n\"\n    \n    \"_VS_IN vec2 Position;\\n\"\n    \"_VS_IN vec4 Color;\\n\"\n    \"_VS_IN vec2 TexCoord0;\\n\"\n    \n    \"_VS_OUT vec4 oColor;\\n\"\n    \"_VS_OUT vec2 oTexCoord0;\\n\"\n    \n    \"void main()\\n\"\n    \"{\\n\"\n    \"   gl_Position.x = Position.x;\\n\"\n    \"   gl_Position.y = Position.y;\\n\"\n    \"   gl_Position.z = 0.5;\\n\"\n    \"   gl_Position.w = 1.0;\\n\"\n    // Vertex inputs are in TanEyeAngle space for the R,G,B channels (i.e. after chromatic aberration and distortion).\n    // Scale them into the correct [0-1],[0-1] UV lookup space (depending on eye)\n    \"   oTexCoord0 = TexCoord0 * EyeToSourceUVScale + EyeToSourceUVOffset;\\n\"\n    \"   oColor = Color;\\n\"              // Used for vignette fade.\n    \"}\\n\";\n    \n    const OVR::CAPI::GL::ShaderBase::Uniform Distortion_vs_refl[] =\n    {\n        { \"EyeToSourceUVScale\",  OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 8 },\n        { \"EyeToSourceUVOffset\", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 8, 8 },\n    };\n    \n    static const char Distortion_fs[] =\n    \"uniform sampler2D Texture0;\\n\"\n    \n    \"_FS_IN vec4 oColor;\\n\"\n    \"_FS_IN vec2 oTexCoord0;\\n\"\n    \n    \"_FRAGCOLOR_DECLARATION\\n\"\n    \n    \"void main()\\n\"\n    \"{\\n\"\n    \"   _FRAGCOLOR = _TEXTURE(Texture0, oTexCoord0, 0.0);\\n\"\n    \"   _FRAGCOLOR.a = 1.0;\\n\"\n    \"}\\n\";\n    \n    \n    static const char DistortionTimewarp_vs[] =\n    \"uniform vec2 EyeToSourceUVScale;\\n\"\n    \"uniform vec2 EyeToSourceUVOffset;\\n\"\n    \"uniform mat4 EyeRotationStart;\\n\"\n    \"uniform mat4 EyeRotationEnd;\\n\"\n    \n    \"_VS_IN vec2 Position;\\n\"\n    \"_VS_IN vec4 Color;\\n\"\n    \"_VS_IN vec2 TexCoord0;\\n\"\n    \n    \"_VS_OUT vec4 oColor;\\n\"\n    \"_VS_OUT vec2 oTexCoord0;\\n\"\n    \n    \"void main()\\n\"\n    \"{\\n\"\n    \"   gl_Position.x = Position.x;\\n\"\n    \"   gl_Position.y = Position.y;\\n\"\n    \"   gl_Position.z = 0.0;\\n\"\n    \"   gl_Position.w = 1.0;\\n\"\n    \n    // Vertex inputs are in TanEyeAngle space for the R,G,B channels (i.e. after chromatic aberration and distortion).\n    // These are now \"real world\" vectors in direction (x,y,1) relative to the eye of the HMD.\n    \"   vec3 TanEyeAngle = vec3 ( TexCoord0.x, TexCoord0.y, 1.0 );\\n\"\n    \n    // Accurate time warp lerp vs. faster\n#if 1\n    // Apply the two 3x3 timewarp rotations to these vectors.\n\t\"   vec3 TransformedStart = (EyeRotationStart * vec4(TanEyeAngle, 0)).xyz;\\n\"\n\t\"   vec3 TransformedEnd   = (EyeRotationEnd * vec4(TanEyeAngle, 0)).xyz;\\n\"\n    // And blend between them.\n    \"   vec3 Transformed = mix ( TransformedStart, TransformedEnd, Color.a );\\n\"\n#else\n    \"   mat4 EyeRotation = mix ( EyeRotationStart, EyeRotationEnd, Color.a );\\n\"\n    \"   vec3 Transformed   = EyeRotation * TanEyeAngle;\\n\"\n#endif\n    \n    // Project them back onto the Z=1 plane of the rendered images.\n    \"   float RecipZ = 1.0 / Transformed.z;\\n\"\n    \"   vec2 Flattened = vec2 ( Transformed.x * RecipZ, Transformed.y * RecipZ );\\n\"\n    \n    // These are now still in TanEyeAngle space.\n    // Scale them into the correct [0-1],[0-1] UV lookup space (depending on eye)\n    \"   vec2 SrcCoord = Flattened * EyeToSourceUVScale + EyeToSourceUVOffset;\\n\"\n    \"   oTexCoord0 = SrcCoord;\\n\"\n    \"   oColor = vec4(Color.r, Color.r, Color.r, Color.r);\\n\"              // Used for vignette fade.\n    \"}\\n\";\n\n    \n    const OVR::CAPI::GL::ShaderBase::Uniform DistortionTimewarp_vs_refl[] =\n    {\n        { \"EyeToSourceUVScale\",  OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 8 },\n        { \"EyeToSourceUVOffset\", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 8, 8 },\n    };\n    \n    static const char DistortionChroma_vs[] =\n    \"uniform vec2 EyeToSourceUVScale;\\n\"\n    \"uniform vec2 EyeToSourceUVOffset;\\n\"\n    \n    \"_VS_IN vec2 Position;\\n\"\n    \"_VS_IN vec4 Color;\\n\"\n    \"_VS_IN vec2 TexCoord0;\\n\"\n    \"_VS_IN vec2 TexCoord1;\\n\"\n    \"_VS_IN vec2 TexCoord2;\\n\"\n    \n    \"_VS_OUT vec4 oColor;\\n\"\n    \"_VS_OUT vec2 oTexCoord0;\\n\"\n    \"_VS_OUT vec2 oTexCoord1;\\n\"\n    \"_VS_OUT vec2 oTexCoord2;\\n\"\n    \n    \"void main()\\n\"\n    \"{\\n\"\n    \"   gl_Position.x = Position.x;\\n\"\n    \"   gl_Position.y = Position.y;\\n\"\n    \"   gl_Position.z = 0.5;\\n\"\n    \"   gl_Position.w = 1.0;\\n\"\n    \n    // Vertex inputs are in TanEyeAngle space for the R,G,B channels (i.e. after chromatic aberration and distortion).\n    // Scale them into the correct [0-1],[0-1] UV lookup space (depending on eye)\n    \"   oTexCoord0 = TexCoord0 * EyeToSourceUVScale + EyeToSourceUVOffset;\\n\"\n    \"   oTexCoord1 = TexCoord1 * EyeToSourceUVScale + EyeToSourceUVOffset;\\n\"\n    \"   oTexCoord2 = TexCoord2 * EyeToSourceUVScale + EyeToSourceUVOffset;\\n\"\n    \n    \"   oColor = Color;\\n\" // Used for vignette fade.\n    \"}\\n\";\n    \n    const OVR::CAPI::GL::ShaderBase::Uniform DistortionChroma_vs_refl[] =\n    {\n        { \"EyeToSourceUVScale\",  OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 8 },\n        { \"EyeToSourceUVOffset\", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 8, 8 },\n    };\n    \n    static const char DistortionChroma_fs[] =\n    \"uniform sampler2D Texture0;\\n\"\n    \"uniform sampler2D Texture1;\\n\"\n    \"uniform vec3 OverdriveScales_IsSrgb;\\n\"\n\n    \"_FS_IN vec4 oColor;\\n\"\n    \"_FS_IN vec2 oTexCoord0;\\n\"\n    \"_FS_IN vec2 oTexCoord1;\\n\"\n    \"_FS_IN vec2 oTexCoord2;\\n\"\n    \n    \"_MRTFRAGCOLOR0_DECLARATION\\n\"   // Desired color (next frame's \"PrevTexture\")\n    \"_MRTFRAGCOLOR1_DECLARATION\\n\"   // Overdriven color (Back-buffer)\n    \"_GLFRAGCOORD_DECLARATION\\n\"\n\n    \"#ifdef _TEXELFETCHDECL\\n\"\n    \"_TEXELFETCHDECL\\n\"\n    \"#endif\\n\"\n    \n    \"void main()\\n\"\n    \"{\\n\"\n    \"   float ResultR = _TEXTURE(Texture0, oTexCoord0, 0.0).r;\\n\"\n    \"   float ResultG = _TEXTURE(Texture0, oTexCoord1, 0.0).g;\\n\"\n    \"   float ResultB = _TEXTURE(Texture0, oTexCoord2, 0.0).b;\\n\"\n    \"   vec3 newColor = vec3(ResultR * oColor.r, ResultG * oColor.g, ResultB * oColor.b);\\n\"\n\n    \"   _MRTFRAGCOLOR0 = vec4(newColor, 1);\\n\"\n    \"   _MRTFRAGCOLOR1 = _MRTFRAGCOLOR0;\\n\"\n\n    \"   #ifdef _TEXELFETCHDECL\\n\"\n    // pixel luminance overdrive\n    \"   if(OverdriveScales_IsSrgb.x > 0.0)\\n\"\n    \"   {\\n\"\n    \"       ivec2 pixelCoord = ivec2(gl_FragCoord.x, gl_FragCoord.y);\\n\"\n    \"       vec3 oldColor = texelFetch(Texture1, pixelCoord, 0).rgb;\\n\"\n\n    \"       vec3 adjustedScales;\\n\"\n    \"       adjustedScales.x = newColor.x > oldColor.x ? OverdriveScales_IsSrgb.x : OverdriveScales_IsSrgb.y;\\n\"\n    \"       adjustedScales.y = newColor.y > oldColor.y ? OverdriveScales_IsSrgb.x : OverdriveScales_IsSrgb.y;\\n\"\n    \"       adjustedScales.z = newColor.z > oldColor.z ? OverdriveScales_IsSrgb.x : OverdriveScales_IsSrgb.y;\\n\"\n\n\t// overdrive is tuned for gamma space so if we're in linear space fix gamma before doing the calculation\n\t\"\t\tvec3 overdriveColor;\\n\"\n\t\"       if(OverdriveScales_IsSrgb.z > 0.0)\\n\"\n\t\"\t\t{\\n\"\n\t\"           oldColor = pow(oldColor, vec3(1.0/2.2, 1.0/2.2, 1.0/2.2));\\n\"\n\t\"\t\t\tnewColor = pow(newColor, vec3(1.0/2.2, 1.0/2.2, 1.0/2.2));\\n\"\n    \"\t\t\toverdriveColor = clamp(newColor + (newColor - oldColor) * adjustedScales, 0.0, 1.0);\\n\"\n    \"           overdriveColor = pow(overdriveColor, vec3(2.2, 2.2, 2.2));\\n\"\n\t\"\t\t}\\n\"\n\t\"\t\telse\\n\"\n\t\"\t\t\toverdriveColor = clamp(newColor + (newColor - oldColor) * adjustedScales, 0.0, 1.0);\\n\"\n\n    \"       _MRTFRAGCOLOR1 = vec4(overdriveColor, 1.0);\\n\"\n    \"   }\\n\"\n    \"   #else\\n\"\n    // If statement to keep OverdriveScales_IsSrgb from being optimized out.\n    \"   if(OverdriveScales_IsSrgb.x > 0.0)\\n\"\n    \"     _MRTFRAGCOLOR1 = vec4(newColor, 1);\\n\"\n    \"   #endif\\n\"\n    \"}\\n\";\n\n    const OVR::CAPI::GL::ShaderBase::Uniform DistortionChroma_ps_refl[] =\n    {\n        { \"OverdriveScales_IsSrgb\", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 12 },\n    };\n    \n    static const char DistortionTimewarpChroma_vs[] =\n    \"uniform vec2 EyeToSourceUVScale;\\n\"\n    \"uniform vec2 EyeToSourceUVOffset;\\n\"\n    \"uniform mat4 EyeRotationStart;\\n\"\n    \"uniform mat4 EyeRotationEnd;\\n\"\n    \n    \"_VS_IN vec2 Position;\\n\"\n    \"_VS_IN vec4 Color;\\n\"\n    \"_VS_IN vec2 TexCoord0;\\n\"\n    \"_VS_IN vec2 TexCoord1;\\n\"\n    \"_VS_IN vec2 TexCoord2;\\n\"\n    \n    \"_VS_OUT vec4 oColor;\\n\"\n    \"_VS_OUT vec2 oTexCoord0;\\n\"\n    \"_VS_OUT vec2 oTexCoord1;\\n\"\n    \"_VS_OUT vec2 oTexCoord2;\\n\"\n    \n    \"void main()\\n\"\n    \"{\\n\"\n    \"   gl_Position.x = Position.x;\\n\"\n    \"   gl_Position.y = Position.y;\\n\"\n    \"   gl_Position.z = 0.0;\\n\"\n    \"   gl_Position.w = 1.0;\\n\"\n    \n    // Vertex inputs are in TanEyeAngle space for the R,G,B channels (i.e. after chromatic aberration and distortion).\n    // These are now \"real world\" vectors in direction (x,y,1) relative to the eye of the HMD.\n    \"   vec3 TanEyeAngleR = vec3 ( TexCoord0.x, TexCoord0.y, 1.0 );\\n\"\n    \"   vec3 TanEyeAngleG = vec3 ( TexCoord1.x, TexCoord1.y, 1.0 );\\n\"\n    \"   vec3 TanEyeAngleB = vec3 ( TexCoord2.x, TexCoord2.y, 1.0 );\\n\"\n    \n    // Accurate time warp lerp vs. faster\n#if 1\n    // Apply the two 3x3 timewarp rotations to these vectors.\n\t\"   vec3 TransformedRStart = (EyeRotationStart * vec4(TanEyeAngleR, 0)).xyz;\\n\"\n\t\"   vec3 TransformedGStart = (EyeRotationStart * vec4(TanEyeAngleG, 0)).xyz;\\n\"\n\t\"   vec3 TransformedBStart = (EyeRotationStart * vec4(TanEyeAngleB, 0)).xyz;\\n\"\n\t\"   vec3 TransformedREnd   = (EyeRotationEnd * vec4(TanEyeAngleR, 0)).xyz;\\n\"\n\t\"   vec3 TransformedGEnd   = (EyeRotationEnd * vec4(TanEyeAngleG, 0)).xyz;\\n\"\n\t\"   vec3 TransformedBEnd   = (EyeRotationEnd * vec4(TanEyeAngleB, 0)).xyz;\\n\"\n    \n    // And blend between them.\n    \"   vec3 TransformedR = mix ( TransformedRStart, TransformedREnd, Color.a );\\n\"\n    \"   vec3 TransformedG = mix ( TransformedGStart, TransformedGEnd, Color.a );\\n\"\n    \"   vec3 TransformedB = mix ( TransformedBStart, TransformedBEnd, Color.a );\\n\"\n#else\n    \"   mat3 EyeRotation;\\n\"\n    \"   EyeRotation[0] = mix ( EyeRotationStart[0], EyeRotationEnd[0], Color.a ).xyz;\\n\"\n    \"   EyeRotation[1] = mix ( EyeRotationStart[1], EyeRotationEnd[1], Color.a ).xyz;\\n\"\n    \"   EyeRotation[2] = mix ( EyeRotationStart[2], EyeRotationEnd[2], Color.a ).xyz;\\n\"\n    \"   vec3 TransformedR   = EyeRotation * TanEyeAngleR;\\n\"\n    \"   vec3 TransformedG   = EyeRotation * TanEyeAngleG;\\n\"\n    \"   vec3 TransformedB   = EyeRotation * TanEyeAngleB;\\n\"\n#endif\n    \n    // Project them back onto the Z=1 plane of the rendered images.\n    \"   float RecipZR = 1.0 / TransformedR.z;\\n\"\n    \"   float RecipZG = 1.0 / TransformedG.z;\\n\"\n    \"   float RecipZB = 1.0 / TransformedB.z;\\n\"\n    \"   vec2 FlattenedR = vec2 ( TransformedR.x * RecipZR, TransformedR.y * RecipZR );\\n\"\n    \"   vec2 FlattenedG = vec2 ( TransformedG.x * RecipZG, TransformedG.y * RecipZG );\\n\"\n    \"   vec2 FlattenedB = vec2 ( TransformedB.x * RecipZB, TransformedB.y * RecipZB );\\n\"\n    \n    // These are now still in TanEyeAngle space.\n    // Scale them into the correct [0-1],[0-1] UV lookup space (depending on eye)\n    \"   vec2 SrcCoordR = FlattenedR * EyeToSourceUVScale + EyeToSourceUVOffset;\\n\"\n    \"   vec2 SrcCoordG = FlattenedG * EyeToSourceUVScale + EyeToSourceUVOffset;\\n\"\n    \"   vec2 SrcCoordB = FlattenedB * EyeToSourceUVScale + EyeToSourceUVOffset;\\n\"\n    \n    \"   oTexCoord0 = SrcCoordR;\\n\"\n    \"   oTexCoord1 = SrcCoordG;\\n\"\n    \"   oTexCoord2 = SrcCoordB;\\n\"\n    \n    \"   oColor = vec4(Color.r, Color.r, Color.r, Color.r);\\n\"              // Used for vignette fade.\n    \"}\\n\";\n    \n\n    const OVR::CAPI::GL::ShaderBase::Uniform DistortionTimewarpChroma_vs_refl[] =\n    {\n        { \"EyeToSourceUVScale\",  OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 8 },\n        { \"EyeToSourceUVOffset\", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 8, 8 },\n        { \"EyeRotationStart\",    OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 16, 64 },\n        { \"EyeRotationEnd\",      OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 80, 64 },\n    };\n    \n}}} // OVR::CAPI::GL\n\n#endif // OVR_CAPI_GL_Shaders_h\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/GL/CAPI_GL_HSWDisplay.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_GL_HSWDisplay.cpp\nContent     :   Implements Health and Safety Warning system.\nCreated     :   July 7, 2014\nAuthors     :   Paul Pedriana\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n\n#include \"CAPI_GL_HSWDisplay.h\"\n#include \"CAPI_GL_DistortionShaders.h\"\n#include \"../../OVR_CAPI_GL.h\"\n#include \"../../Kernel/OVR_File.h\"\n#include \"../../Kernel/OVR_Math.h\"\n#include \"../../Kernel/OVR_Allocator.h\"\n#include \"../../Kernel/OVR_Color.h\"\n\n\nOVR_DISABLE_MSVC_WARNING(4996) // \"This function or variable may be unsafe...\"\n\n\nnamespace OVR { namespace CAPI { \n\n\n// Loads the TGA data from the File as an array of width * height 32 bit Texture_RGBA values.\n// Returned pointer must be freed with OVR_FREE.\nuint8_t* LoadTextureTgaData(OVR::File* f, uint8_t alpha, int& width, int& height)\n{\n    // See http://www.fileformat.info/format/tga/egff.htm for format details.\n    // TGA files are stored with little-endian data.\n    uint8_t* pRGBA  = NULL;\n\n    f->SeekToBegin();\n    \n    const int desclen = f->ReadUByte();\n    const int palette = f->ReadUByte();\n    OVR_UNUSED(palette);\n    const int imgtype = f->ReadUByte();\n    f->ReadUInt16(); // Skip bytes\n    int palCount = f->ReadUInt16();\n    int palSize = f->ReadUByte();\n    f->ReadUInt16();\n    f->ReadUInt16();\n    width = f->ReadUInt16();\n    height = f->ReadUInt16();\n    int bpp = f->ReadUByte();\n    f->ReadUByte();\n\n    const int ImgTypeBGRAUncompressed = 2;\n    const int ImgTypeBGRARLECompressed = 10;\n\n    OVR_ASSERT(((imgtype == ImgTypeBGRAUncompressed) || (imgtype == ImgTypeBGRARLECompressed)) && ((bpp == 24) || (bpp == 32)));\n\n    // imgType 2 is uncompressed true-color image.\n    // imgType 10 is run-length encoded true-color image.\n    if(((imgtype == ImgTypeBGRAUncompressed) || (imgtype == ImgTypeBGRARLECompressed)) && ((bpp == 24) || (bpp == 32)))\n    {\n        int imgsize = width * height * 4;\n        pRGBA = (uint8_t*) OVR_ALLOC(imgsize);\n        f->Skip(desclen);\n        f->Skip(palCount * (palSize + 7) >> 3);\n        int strideBytes = width * 4; // This is the number of bytes between successive rows.\n\n        unsigned char buf[4] = { 0, 0, 0, alpha }; // If bpp is 24 then this alpha will be unmodified below.\n\n        switch (imgtype)\n        {\n        case ImgTypeBGRAUncompressed:\n            switch (bpp)\n            {\n            case 24:\n            case 32:\n                for (int y = 0; y < height; y++)\n                {\n                    for (int x = 0; x < width; x++)\n                    {\n                        f->Read(buf, bpp / 8); // Data is stored as B, G, R\n                        pRGBA[y*strideBytes + x*4 + 0] = buf[2];\n                        pRGBA[y*strideBytes + x*4 + 1] = buf[1];\n                        pRGBA[y*strideBytes + x*4 + 2] = buf[0];\n                        pRGBA[y*strideBytes + x*4 + 3] = buf[3];\n                    }\n                }\n                break;\n            }\n            break;\n\n        case ImgTypeBGRARLECompressed:\n            switch (bpp)\n            {\n            case 24:\n            case 32:\n                for (int y = 0; y < height; y++) // RLE spans don't cross successive rows.\n                {\n                    int x = 0;\n\n                    while(x < width)\n                    {\n                        uint8_t rleByte;\n                        f->Read(&rleByte, 1);\n\n                        if(rleByte & 0x80) // If the high byte is set then what follows are RLE bytes.\n                        {\n                            size_t rleCount = ((rleByte & 0x7f) + 1);\n                            f->Read(buf, bpp / 8); // Data is stored as B, G, R, A\n\n                            for (; rleCount; --rleCount, ++x)\n                            {\n                                pRGBA[y*strideBytes + x*4 + 0] = buf[2];\n                                pRGBA[y*strideBytes + x*4 + 1] = buf[1];\n                                pRGBA[y*strideBytes + x*4 + 2] = buf[0];\n                                pRGBA[y*strideBytes + x*4 + 3] = buf[3];\n                            }   \n                        }\n                        else // Else what follows are regular bytes of a count indicated by rleByte\n                        {\n                            for (size_t rleCount = (rleByte + 1); rleCount; --rleCount, ++x)\n                            {\n                                f->Read(buf, bpp / 8); // Data is stored as B, G, R, A\n                                pRGBA[y*strideBytes + x*4 + 0] = buf[2];\n                                pRGBA[y*strideBytes + x*4 + 1] = buf[1];\n                                pRGBA[y*strideBytes + x*4 + 2] = buf[0];\n                                pRGBA[y*strideBytes + x*4 + 3] = buf[3];\n                            }\n                        }\n                    }\n                }\n                break;\n            }\n            break;\n        }\n    }\n\n    return pRGBA;\n} // LoadTextureTgaData\n\n\n\nnamespace GL {\n\n\n// To do: This needs to be promoted to a central version, possibly in CAPI_HSWDisplay.h\nstruct HASWVertex\n{\n    Vector3f  Pos;\n    Color     C;\n    float     U, V;    \n\n    HASWVertex(const Vector3f& p, const Color& c = Color(64,0,0,255), float u = 0, float v = 0)\n        : Pos(p), C(c), U(u), V(v)\n    {}\n\n    HASWVertex(float x, float y, float z, const Color& c = Color(64,0,0,255), float u = 0, float v = 0) \n        : Pos(x,y,z), C(c), U(u), V(v)\n    {}\n\n    bool operator==(const HASWVertex& b) const\n    {\n        return (Pos == b.Pos) && (C == b.C) && (U == b.U) && (V == b.V);\n    }\n};\n\n\n\n// This is a temporary function implementation, and it functionality needs to be implemented in a more generic way.\nTexture* LoadTextureTga(RenderParams& rParams, int samplerMode, OVR::File* f, uint8_t alpha)\n{\n    OVR::CAPI::GL::Texture* pTexture = NULL;\n\n    int width, height;\n    const uint8_t* pRGBA = LoadTextureTgaData(f, alpha, width, height);\n\n    if (pRGBA)\n    {\n        pTexture = new OVR::CAPI::GL::Texture(&rParams, width, height);\n\n        // SetSampleMode forces the use of mipmaps through GL_LINEAR_MIPMAP_LINEAR.\n        pTexture->SetSampleMode(samplerMode); // Calls glBindTexture internally.\n\n        // We are intentionally not using mipmaps. We need to use this because Texture::SetSampleMode unilaterally uses GL_LINEAR_MIPMAP_LINEAR.\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);\n        OVR_ASSERT(glGetError() == 0);\n\n        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pRGBA);\n        OVR_ASSERT(glGetError() == 0);\n\n        // With OpenGL 4.2+ we can use this instead of glTexImage2D:\n        // glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, width, height);\n        // glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pRGBA);\n\n        OVR_FREE(const_cast<uint8_t*>(pRGBA));\n    }\n\n    return pTexture;\n}\n\n\n// Loads a texture from a memory image of a TGA file.\nTexture* LoadTextureTga(RenderParams& rParams, int samplerMode, const uint8_t* pData, int dataSize, uint8_t alpha)\n{\n    MemoryFile memoryFile(\"\", pData, dataSize);\n\n    return LoadTextureTga(rParams, samplerMode, &memoryFile, alpha);\n}\n\n\n\n\n// The texture below may conceivably be shared between HSWDisplay instances. However,  \n// beware that sharing may not be possible if two HMDs are using different locales  \n// simultaneously. As of this writing it's not clear if that can occur in practice.\n\nHSWDisplay::HSWDisplay(ovrRenderAPIType api, ovrHmd hmd, const HMDRenderState& renderState)\n  : OVR::CAPI::HSWDisplay(api, hmd, renderState)\n  , RenderParams()\n  , GLContext()\n  , FrameBuffer(0)\n  , pTexture()\n  , pShaderSet()\n  , pVertexShader()\n  , pFragmentShader()\n  , pVB()\n  , VAO(0)\n  , VAOInitialized(false)\n  , OrthoProjection()\n{\n}\n\n\nbool HSWDisplay::Initialize(const ovrRenderAPIConfig* apiConfig)\n{\n    const ovrGLConfig* config = (const ovrGLConfig*)apiConfig;\n\n    if(config)\n    {\n        // The following is essentially copied from CAPI_GL_DistortionRender.cpp's \n        // Initialize function. To do: Merge this to a central location.\n        RenderParams.Multisample = config->OGL.Header.Multisample;\n        RenderParams.BackBufferSize     = config->OGL.Header.BackBufferSize;\n\n        #if defined(OVR_OS_WIN32)\n            RenderParams.Window = (config->OGL.Window) ? config->OGL.Window : GetActiveWindow();\n            RenderParams.DC     = config->OGL.DC;\n        #elif defined(OVR_OS_LINUX)\n            if (config->OGL.Disp)\n            {\n                RenderParams.Disp = config->OGL.Disp;\n            }\n            if (!RenderParams.Disp)\n            {\n                RenderParams.Disp = glXGetCurrentDisplay();\n            }\n            if (!RenderParams.Disp)\n            {\n                OVR_DEBUG_LOG((\"glXGetCurrentDisplay failed.\"));\n                return false;\n            }\n        #endif\n    }\n    else\n    {\n        UnloadGraphics();\n    }\n\n    return true;\n}\n\n\nvoid HSWDisplay::Shutdown()\n{\n    UnloadGraphics();\n}\n\n\nvoid HSWDisplay::DisplayInternal()\n{\n    HSWDISPLAY_LOG((\"[HSWDisplay GL] DisplayInternal()\"));\n    // We may want to call LoadGraphics here instead of within Render.\n}\n\n\nvoid HSWDisplay::DismissInternal()\n{\n    HSWDISPLAY_LOG((\"[HSWDisplay GL] DismissInternal()\"));\n    UnloadGraphicsRequested = true; // We don't directly call UnloadGraphics here because this may be executed within a different thread.\n}\n\n\nvoid HSWDisplay::UnloadGraphics()\n{\n    if(pTexture) // If initialized...\n    {\n        Context currentGLContext;\n        currentGLContext.InitFromCurrent();\n        GLContext.Bind();\n\n    // RenderParams: No need to clear.\n    if(FrameBuffer != 0)\n    {\n        glDeleteFramebuffers(1, &FrameBuffer);\n        FrameBuffer = 0;\n    }\n    pTexture.Clear();\n    pShaderSet.Clear();\n    pVertexShader.Clear();\n    pFragmentShader.Clear();\n    pVB.Clear();\n    if(VAO)\n    {\n            glDeleteVertexArrays(1, &VAO);\n        currentGLContext.Bind();\n        GLContext.Destroy();\n    }\n}\n}\n\n\nvoid HSWDisplay::LoadGraphics()\n{\n    // We assume here that the current GL context is the one our resources will be associated with.\n\n    if (FrameBuffer == 0)\n    {\n        glGenFramebuffers(1, &FrameBuffer);\n    }\n\n    if (!pTexture) // To do: Add support for .dds files, which would be significantly smaller than the size of the tga.\n    {\n        size_t textureSize;\n        const uint8_t* TextureData = GetDefaultTexture(textureSize);\n        pTexture = *LoadTextureTga(RenderParams, Sample_Linear | Sample_Clamp, TextureData, (int)textureSize, 255);\n    }\n\n    if (!pShaderSet)\n    {\n        pShaderSet = *new ShaderSet();\n    }\n\n    if(!pVertexShader)\n    {\n        OVR::String strShader((GLEContext::GetCurrentContext()->WholeVersion >= 302) ? glsl3Prefix : glsl2Prefix);\n        strShader += SimpleTexturedQuad_vs;\n\n        pVertexShader = *new VertexShader(&RenderParams, const_cast<char*>(strShader.ToCStr()), strShader.GetLength(), SimpleTexturedQuad_vs_refl, OVR_ARRAY_COUNT(SimpleTexturedQuad_vs_refl));\n        pShaderSet->SetShader(pVertexShader);\n    }\n\n    if(!pFragmentShader)\n    {\n        OVR::String strShader((GLEContext::GetCurrentContext()->WholeVersion >= 302) ? glsl3Prefix : glsl2Prefix);\n        strShader += SimpleTexturedQuad_ps;\n\n        pFragmentShader = *new FragmentShader(&RenderParams, const_cast<char*>(strShader.ToCStr()), strShader.GetLength(), SimpleTexturedQuad_ps_refl, OVR_ARRAY_COUNT(SimpleTexturedQuad_ps_refl));\n        pShaderSet->SetShader(pFragmentShader);\n    }\n\n    if(!pVB)\n    {\n        pVB = *new Buffer(&RenderParams);\n\n        pVB->Data(Buffer_Vertex, NULL, 4 * sizeof(HASWVertex));\n        HASWVertex* pVertices = (HASWVertex*)pVB->Map(0, 4 * sizeof(HASWVertex), Map_Discard);\n        OVR_ASSERT(pVertices);\n\n        if(pVertices)\n        {\n            const bool  flip   = ((RenderState.DistortionCaps & ovrDistortionCap_FlipInput) != 0);\n            const float left   = -1.0f; // We currently draw this in normalized device coordinates with an stereo translation\n            const float top    = -1.1f; // applied as a vertex shader uniform. In the future when we have a more formal graphics\n            const float right  =  1.0f; // API abstraction we may move this draw to an overlay layer or to a more formal \n            const float bottom =  0.9f; // model/mesh scheme with a perspective projection.\n\n            pVertices[0] = HASWVertex(left,  top,    0.f, Color(255, 255, 255, 255), 0.f, flip ? 1.f : 0.f);\n            pVertices[1] = HASWVertex(left,  bottom, 0.f, Color(255, 255, 255, 255), 0.f, flip ? 0.f : 1.f);\n            pVertices[2] = HASWVertex(right, top,    0.f, Color(255, 255, 255, 255), 1.f, flip ? 1.f : 0.f); \n            pVertices[3] = HASWVertex(right, bottom, 0.f, Color(255, 255, 255, 255), 1.f, flip ? 0.f : 1.f);\n\n            pVB->Unmap(pVertices);\n        }\n    }\n\n    // We don't bind or initialize the vertex arrays here.\n    if (!VAO && GLE_ARB_vertex_array_object)\n    {\n        OVR_ASSERT(!VAOInitialized);\n            glGenVertexArrays(1, &VAO);\n    }\n}\n\n\nvoid HSWDisplay::RenderInternal(ovrEyeType eye, const ovrTexture* eyeTexture)\n{\n    if(RenderEnabled && eyeTexture)\n    {        \n        // We need to render to the eyeTexture with the texture viewport.\n        // Setup rendering to the texture.\n        ovrGLTexture* eyeTextureGL = const_cast<ovrGLTexture*>(reinterpret_cast<const ovrGLTexture*>(eyeTexture));\n        OVR_ASSERT(eyeTextureGL->Texture.Header.API == ovrRenderAPI_OpenGL);\n\n        GL::AutoContext autoGLContext(GLContext); // Saves the current GL context, binds our GLContext, then at the end of scope re-binds the current GL context.\n\n        // Load the graphics if not loaded already.\n        if (!pTexture)\n            LoadGraphics();\n\n        // Calculate ortho projection.\n        GetOrthoProjection(RenderState, OrthoProjection);\n\n        // Set the rendering to be to the eye texture.\n        glBindFramebuffer(GL_FRAMEBUFFER, FrameBuffer);\n        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, eyeTextureGL->OGL.TexId, 0);\n        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0); // We aren't using depth, as we currently want this to overwrite everything.\n        GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);\n        OVR_ASSERT(status == GL_FRAMEBUFFER_COMPLETE); OVR_UNUSED(status);\n\n        // Set up the viewport\n        const GLint   x = (GLint)eyeTextureGL->Texture.Header.RenderViewport.Pos.x;\n        const GLint   y = (GLint)eyeTextureGL->Texture.Header.RenderViewport.Pos.y; // Note that GL uses bottom-up coordinates.\n        const GLsizei w = (GLsizei)eyeTextureGL->Texture.Header.RenderViewport.Size.w;\n        const GLsizei h = (GLsizei)eyeTextureGL->Texture.Header.RenderViewport.Size.h;\n        glViewport(x, y, w, h);\n\n        // Set fixed-function render states.\n        //glDepthRange(0.0,  1.0); // This is the default\n        glDepthMask(GL_FALSE);\n        glDisable(GL_DEPTH_TEST);\n        glFrontFace(GL_CW);\n        glEnable(GL_BLEND);\n        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n\n        // Enable the buffer and shaders we use.\n        ShaderFill fill(pShaderSet);\n        if (pTexture)\n            fill.SetTexture(0, pTexture);\n\n        // Set shader uniforms.\n        const float scale  = HSWDISPLAY_SCALE * ((RenderState.OurHMDInfo.HmdType == HmdType_DK1) ? 0.70f : 1.f);\n        pShaderSet->SetUniform2f(\"Scale\", scale, scale / 2.f); // X and Y scale. Y is a fixed proportion to X in order to give a certain aspect ratio.\n        pShaderSet->SetUniform2f(\"PositionOffset\", OrthoProjection[eye].GetTranslation().x, 0.0f);\n\n        // Set vertex attributes\n        if (GLE_ARB_vertex_array_object)\n        {\n            OVR_ASSERT(VAO != 0);\n            glBindVertexArray(VAO);\n        }\n\n        if(!VAOInitialized) // This executes for the case that VAO isn't supported.\n        {\n            glBindBuffer(GL_ARRAY_BUFFER, pVB->GLBuffer); // This must be called before glVertexAttribPointer is called below.\n\n            const GLuint shaderProgram = pShaderSet->Prog;\n            GLint attributeLocationArray[3];\n\n            attributeLocationArray[0] = glGetAttribLocation(shaderProgram, \"Position\");\n            glVertexAttribPointer(attributeLocationArray[0], sizeof(Vector3f)/sizeof(float), GL_FLOAT,         false, sizeof(HASWVertex), reinterpret_cast<char*>(offsetof(HASWVertex, Pos)));\n\n            attributeLocationArray[1] = glGetAttribLocation(shaderProgram, \"Color\");\n            glVertexAttribPointer(attributeLocationArray[1], sizeof(Color)/sizeof(uint8_t),  GL_UNSIGNED_BYTE,  true, sizeof(HASWVertex), reinterpret_cast<char*>(offsetof(HASWVertex, C)));  // True because we want it to convert [0,255] to [0,1] for us.\n\n            attributeLocationArray[2] = glGetAttribLocation(shaderProgram, \"TexCoord\");\n            glVertexAttribPointer(attributeLocationArray[2], sizeof(float[2])/sizeof(float), GL_FLOAT,         false, sizeof(HASWVertex), reinterpret_cast<char*>(offsetof(HASWVertex, U)));\n\n            for (size_t i = 0; i < OVR_ARRAY_COUNT(attributeLocationArray); i++)\n                glEnableVertexAttribArray((GLuint)i);\n        }\n\n        fill.Set(Prim_TriangleStrip);\n\n        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\n\n        if (GLE_ARB_vertex_array_object)\n        {\n            VAOInitialized = true;\n            glBindVertexArray(0);\n        }\n    }\n}\n\n \n}}} // namespace OVR::CAPI::GL\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/GL/CAPI_GL_HSWDisplay.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_GL_HSWDisplay.h\nContent     :   Implements Health and Safety Warning system.\nCreated     :   July 7, 2014\nAuthors     :   Paul Pedriana\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_GL_HSWDisplay_h\n#define OVR_CAPI_GL_HSWDisplay_h\n\n\n#include \"../CAPI_HSWDisplay.h\"\n#include \"CAPI_GL_Util.h\"\n\n\nnamespace OVR { namespace CAPI { namespace GL {\n\n    class HSWDisplay : public CAPI::HSWDisplay\n    {\n    public:\n        HSWDisplay(ovrRenderAPIType api, ovrHmd hmd, const HMDRenderState& renderState);\n\n        // Must be called before use. apiConfig is such that:\n        //   const ovrGLConfig* config = (const ovrGLConfig*)apiConfig; or\n        bool Initialize(const ovrRenderAPIConfig* apiConfig);\n        void Shutdown();\n        void DisplayInternal();\n        void DismissInternal();\n\n        // Draws the warning to the eye texture(s). This must be done at the end of a \n        // frame but prior to executing the distortion rendering of the eye textures. \n        void RenderInternal(ovrEyeType eye, const ovrTexture* eyeTexture);\n\n    protected:\n        void UnloadGraphics();\n        void LoadGraphics();\n\n        OVR::CAPI::GL::RenderParams        RenderParams;\n        OVR::CAPI::GL::Context             GLContext;           // Our prive OpenGL context for drawing.\n        GLuint                             FrameBuffer;         // This is a container for a texture, depth buffer, stencil buffer to be rendered to. To consider: Make a wrapper class, like the OculusWorldDemo RBuffer class. \n        Ptr<OVR::CAPI::GL::Texture>        pTexture;\n        Ptr<OVR::CAPI::GL::ShaderSet>      pShaderSet;\n        Ptr<OVR::CAPI::GL::VertexShader>   pVertexShader;\n        Ptr<OVR::CAPI::GL::FragmentShader> pFragmentShader;\n        Ptr<OVR::CAPI::GL::Buffer>         pVB;\n        GLuint                             VAO;                 // Vertex Array Object.\n        bool                               VAOInitialized;      // True if the VAO was initialized with vertex buffer data.\n        Matrix4f                           OrthoProjection[2];  // Projection for 2D.\n\n    private:\n        OVR_NON_COPYABLE(HSWDisplay)\n    };\n\n}}} // namespace OVR::CAPI::GL\n\n\n#endif // OVR_CAPI_GL_HSWDisplay_h\n\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/GL/CAPI_GL_Util.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_GL_Util.cpp\nContent     :   RenderDevice implementation for OpenGL\nCreated     :   September 10, 2012\nAuthors     :   David Borel, Andrew Reisse\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_GL_Util.h\"\n#include \"../../Kernel/OVR_Log.h\"\n#include <string.h>\n\n#if defined(OVR_OS_LINUX)\n #include \"../../Displays/OVR_Linux_SDKWindow.h\"\n#endif\n\n#if defined(OVR_OS_MAC)\n    #include <CoreGraphics/CGDirectDisplay.h>\n    #include <OpenGL/OpenGL.h>\n\ntypedef void *CGSConnectionID;\ntypedef int32_t CGSWindowID;\ntypedef int32_t CGSSurfaceID;\n\nextern \"C\" CGLError CGLGetSurface(CGLContextObj ctx, CGSConnectionID *cid, CGSWindowID *wid, CGSSurfaceID *sid);\nextern \"C\" CGLError CGLSetSurface(CGLContextObj ctx, CGSConnectionID cid, CGSWindowID wid, CGSSurfaceID sid);\n#endif\n\n\n\n\nnamespace OVR {\n\n\nOVR::GLEContext gleContext;\n\n\nOVR::GLEContext* GetGLEContext()\n{\n    return &gleContext;\n}\n\n\nnamespace CAPI { namespace GL {\n\n\nvoid InitGLExtensions()\n{\n    if(!gleContext.IsInitialized())\n    {\n        gleContext.SetCurrentContext(&gleContext);\n        gleContext.Init();\n    }\n}\n    \n    \nBuffer::Buffer(RenderParams* rp) : pParams(rp), Size(0), Use(0), GLBuffer(0)\n{\n}\n\nBuffer::~Buffer()\n{\n    if (GLBuffer)\n        glDeleteBuffers(1, &GLBuffer);\n}\n\nbool Buffer::Data(int use, const void* buffer, size_t size)\n{\n    Size = size;\n\n    switch (use & Buffer_TypeMask)\n    {\n    case Buffer_Index:     Use = GL_ELEMENT_ARRAY_BUFFER; break;\n    default:               Use = GL_ARRAY_BUFFER; break;\n    }\n\n    if (!GLBuffer)\n        glGenBuffers(1, &GLBuffer);\n\n    int mode = GL_DYNAMIC_DRAW;\n    if (use & Buffer_ReadOnly)\n        mode = GL_STATIC_DRAW;\n\n    glBindBuffer(Use, GLBuffer);\n    glBufferData(Use, size, buffer, mode);\n    return 1;\n}\n\nvoid* Buffer::Map(size_t, size_t, int)\n{\n    int mode = GL_WRITE_ONLY;\n    //if (flags & Map_Unsynchronized)\n    //    mode |= GL_MAP_UNSYNCHRONIZED;\n    \n    glBindBuffer(Use, GLBuffer);\n    void* v = glMapBuffer(Use, mode);\n    return v;\n}\n\nbool Buffer::Unmap(void*)\n{\n    glBindBuffer(Use, GLBuffer);\n    int r = glUnmapBuffer(Use);\n    return r != 0;\n}\n\nShaderSet::ShaderSet() : \n  //Shaders[],\n    UniformInfo(),\n  //Prog(0)\n    ProjLoc(0),\n    ViewLoc(0),\n  //TexLoc[],\n    UsesLighting(false),\n    LightingVer(0)\n{\n    memset(TexLoc, 0, sizeof(TexLoc));\n    Prog = glCreateProgram();\n}\nShaderSet::~ShaderSet()\n{\n    glDeleteProgram(Prog);\n}\n\nGLint ShaderSet::GetGLShader(Shader* s)\n{\n    switch (s->Stage)\n    {\n    case Shader_Vertex: {\n        ShaderImpl<Shader_Vertex, GL_VERTEX_SHADER>* gls = (ShaderImpl<Shader_Vertex, GL_VERTEX_SHADER>*)s;\n        return gls->GLShader;\n    } break;\n    case Shader_Fragment: {\n        ShaderImpl<Shader_Fragment, GL_FRAGMENT_SHADER>* gls = (ShaderImpl<Shader_Fragment, GL_FRAGMENT_SHADER>*)s;\n        return gls->GLShader;\n    } break;\n    default: break;\n    }\n\n    return -1;\n}\n\nvoid ShaderSet::SetShader(Shader *s)\n{\n    Shaders[s->Stage] = s;\n    GLint GLShader = GetGLShader(s);\n    glAttachShader(Prog, GLShader);\n    if (Shaders[Shader_Vertex] && Shaders[Shader_Fragment])\n        Link();\n}\n\nvoid ShaderSet::UnsetShader(int stage)\n{\n    if (Shaders[stage] == NULL)\n        return;\n\n    GLint GLShader = GetGLShader(Shaders[stage]);\n    glDetachShader(Prog, GLShader);\n\n    Shaders[stage] = NULL;\n}\n\nbool ShaderSet::SetUniform(const char* name, int n, const float* v)\n{\n    for (unsigned int i = 0; i < UniformInfo.GetSize(); i++)\n        if (!strcmp(UniformInfo[i].Name.ToCStr(), name))\n        {\n            OVR_ASSERT(UniformInfo[i].Location >= 0);\n            glUseProgram(Prog);\n            switch (UniformInfo[i].Type)\n            {\n            case 1:   glUniform1fv(UniformInfo[i].Location, n, v); break;\n            case 2:   glUniform2fv(UniformInfo[i].Location, n/2, v); break;\n            case 3:   glUniform3fv(UniformInfo[i].Location, n/3, v); break;\n            case 4:   glUniform4fv(UniformInfo[i].Location, n/4, v); break;\n            case 12:  glUniformMatrix3fv(UniformInfo[i].Location, 1, 1, v); break;\n            case 16:  glUniformMatrix4fv(UniformInfo[i].Location, 1, 1, v); break;\n            default: OVR_ASSERT(0);\n            }\n            return 1;\n        }\n\n    OVR_DEBUG_LOG((\"Warning: uniform %s not present in selected shader\", name));\n    return 0;\n}\n\nbool ShaderSet::Link()\n{\n    glLinkProgram(Prog);\n    GLint r;\n    glGetProgramiv(Prog, GL_LINK_STATUS, &r);\n    if (!r)\n    {\n        GLchar msg[1024];\n        glGetProgramInfoLog(Prog, sizeof(msg), 0, msg);\n        OVR_DEBUG_LOG((\"Linking shaders failed: %s\\n\", msg));\n        if (!r)\n            return 0;\n    }\n    glUseProgram(Prog);\n\n    UniformInfo.Clear();\n    LightingVer = 0;\n    UsesLighting = 0;\n\n    GLint uniformCount = 0;\n    glGetProgramiv(Prog, GL_ACTIVE_UNIFORMS, &uniformCount);\n    OVR_ASSERT(uniformCount >= 0);\n\n    for(GLuint i = 0; i < (GLuint)uniformCount; i++)\n    {\n        GLsizei namelen;\n        GLint size = 0;\n        GLenum type;\n        GLchar name[32];\n        glGetActiveUniform(Prog, i, sizeof(name), &namelen, &size, &type, name);\n\n        if (size)\n        {\n            int l = glGetUniformLocation(Prog, name);\n            char *np = name;\n            while (*np)\n            {\n                if (*np == '[')\n                    *np = 0;\n                np++;\n            }\n            Uniform u;\n            u.Name = name;\n            u.Location = l;\n            u.Size = size;\n            switch (type)\n            {\n            case GL_FLOAT:      u.Type = 1; break;\n            case GL_FLOAT_VEC2: u.Type = 2; break;\n            case GL_FLOAT_VEC3: u.Type = 3; break;\n            case GL_FLOAT_VEC4: u.Type = 4; break;\n            case GL_FLOAT_MAT3: u.Type = 12; break;\n            case GL_FLOAT_MAT4: u.Type = 16; break;\n            default:\n                continue;\n            }\n            UniformInfo.PushBack(u);\n            if (!strcmp(name, \"LightCount\"))\n                UsesLighting = 1;\n        }\n        else\n            break;\n    }\n\n    ProjLoc = glGetUniformLocation(Prog, \"Proj\");\n    ViewLoc = glGetUniformLocation(Prog, \"View\");\n    for (int i = 0; i < 8; i++)\n    {\n        char texv[32];\n        OVR_sprintf(texv, 10, \"Texture%d\", i);\n        TexLoc[i] = glGetUniformLocation(Prog, texv);\n        if (TexLoc[i] < 0)\n            break;\n\n        glUniform1i(TexLoc[i], i);\n    }\n    if (UsesLighting)\n        OVR_ASSERT(ProjLoc >= 0 && ViewLoc >= 0);\n    return 1;\n}\n\nbool ShaderBase::SetUniform(const char* name, int n, const float* v)\n{\n    for(unsigned i = 0; i < UniformReflSize; i++)\n    {\n        if (!strcmp(UniformRefl[i].Name, name))\n        {\n            memcpy(UniformData + UniformRefl[i].Offset, v, n * sizeof(float));\n            return 1;\n        }\n    }\n    return 0;\n}\n\nbool ShaderBase::SetUniformBool(const char* name, int n, const bool* v) \n{\n    OVR_UNUSED(n);\n    for(unsigned i = 0; i < UniformReflSize; i++)\n    {\n        if (!strcmp(UniformRefl[i].Name, name))\n        {\n            memcpy(UniformData + UniformRefl[i].Offset, v, UniformRefl[i].Size);\n            return 1;\n        }\n    }\n    return 0;\n}\n\nvoid ShaderBase::InitUniforms(const Uniform* refl, size_t reflSize)\n{\n    if(!refl)\n    {\n        UniformRefl = NULL;\n        UniformReflSize = 0;\n\n        UniformsSize = 0;\n        if (UniformData)\n        {\n            OVR_FREE(UniformData);\n            UniformData = 0;\n        }\n        return; // no reflection data\n    }\n\n    UniformRefl = refl;\n    UniformReflSize = reflSize;\n    \n    UniformsSize = UniformRefl[UniformReflSize-1].Offset + UniformRefl[UniformReflSize-1].Size;\n    UniformData = (unsigned char*)OVR_ALLOC(UniformsSize);\n}\n\nTexture::Texture(RenderParams* rp, int w, int h) : IsUserAllocated(false), pParams(rp), TexId(0), Width(w), Height(h)\n{\n    if (w && h)\n        glGenTextures(1, &TexId);\n}\n\nTexture::~Texture()\n{\n    if (TexId && !IsUserAllocated)\n        glDeleteTextures(1, &TexId);\n}\n\nvoid Texture::Set(int slot, ShaderStage) const\n{\n    glActiveTexture(GL_TEXTURE0 + slot);\n    glBindTexture(GL_TEXTURE_2D, TexId);\n}\n\nvoid Texture::SetSampleMode(int sm)\n{\n    glBindTexture(GL_TEXTURE_2D, TexId);\n    switch (sm & Sample_FilterMask)\n    {\n    case Sample_Linear:\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n        if(GLE_EXT_texture_filter_anisotropic)\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);\n        break;\n\n    case Sample_Anisotropic:\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n        if(GLE_EXT_texture_filter_anisotropic)\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 8);\n        break;\n\n    case Sample_Nearest:\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n        if(GLE_EXT_texture_filter_anisotropic)\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);\n        break;\n    }\n\n    switch (sm & Sample_AddressMask)\n    {\n    case Sample_Repeat:\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n        break;\n\n    case Sample_Clamp:\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\n        break;\n\n    case Sample_ClampBorder:\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);\n        break;\n    }\n}\n\nvoid Texture::UpdatePlaceholderTexture(GLuint texId, const Sizei& textureSize)\n{\n    if (!IsUserAllocated && TexId && texId != TexId)\n        glDeleteTextures(1, &TexId);\n\n    TexId = texId;\n    Width = textureSize.w;\n    Height = textureSize.h;\n\n    IsUserAllocated = true;\n}\n\n\n\n\n\nContext::Context() : initialized(false), ownsContext(true), incarnation(0)\n{\n#if defined(OVR_OS_MAC)\n    systemContext = 0;\n#elif defined(OVR_OS_WIN32)\n    hdc = 0;\n    systemContext = 0;\n#elif defined(OVR_OS_LINUX)\n    x11Display = NULL;\n    x11Drawable = 0;\n    systemContext = 0;\n    memset(&x11Visual, 0, sizeof(x11Visual));\n#endif\n\n}\n\nvoid Context::InitFromCurrent()\n{\n    Destroy();\n\n    initialized = true;\n    ownsContext = false;\n    incarnation++;\n    \n#if defined(OVR_OS_MAC)\n    systemContext = CGLGetCurrentContext();\n    {\n        CGSConnectionID cid;\n        CGSWindowID wid;\n        CGSSurfaceID sid;\n        CGLError e  = kCGLNoError;\n        e = CGLGetSurface(systemContext, &cid, &wid, &sid);\n        OVR_ASSERT(e == kCGLNoError); OVR_UNUSED(e);\n    }\n\n#elif defined(OVR_OS_WIN32)\n    hdc = wglGetCurrentDC();\n    systemContext = wglGetCurrentContext();\n#elif defined(OVR_OS_LINUX)\n    x11Display = glXGetCurrentDisplay();\n    x11Drawable = glXGetCurrentDrawable();\n    systemContext = glXGetCurrentContext();\n    if (!SDKWindow::getVisualFromDrawable(x11Drawable, &x11Visual))\n    {\n        OVR::LogError(\"[Context] Unable to obtain x11 visual from context\");\n        memset(&x11Visual, 0, sizeof(x11Visual));\n    }\n#endif\n}\n\n\nvoid Context::CreateShared( Context & ctx )\n{\n    Destroy();\n    OVR_ASSERT( ctx.initialized == true );\n    if( ctx.initialized == false )\n    {\n        return;\n    }\n\n    initialized = true;\n    ownsContext = true;\n    incarnation++;\n    \n#if defined(OVR_OS_MAC)\n    CGLPixelFormatObj pixelFormat = CGLGetPixelFormat( ctx.systemContext );\n    CGLError e = CGLCreateContext( pixelFormat, ctx.systemContext, &systemContext );\n    OVR_ASSERT(e == kCGLNoError); OVR_UNUSED(e);\n    SetSurface(ctx);\n#elif defined(OVR_OS_WIN32)\n    hdc = ctx.hdc;\n    systemContext = wglCreateContext( ctx.hdc );\n    BOOL success = wglShareLists(ctx.systemContext, systemContext );\n    OVR_ASSERT( success == TRUE );\n    OVR_UNUSED(success);\n#elif defined(OVR_OS_LINUX)\n    x11Display = ctx.x11Display;\n    x11Drawable = ctx.x11Drawable;\n    x11Visual = ctx.x11Visual;\n        systemContext = glXCreateContext( ctx.x11Display, &x11Visual, ctx.systemContext, True );\n        OVR_ASSERT( systemContext != NULL );\n#endif\n}\n\n#if defined(OVR_OS_MAC)\nvoid Context::SetSurface( Context & ctx ) {\n    CGLError e = kCGLNoError;\n    CGSConnectionID cid, cid2;\n    CGSWindowID wid, wid2;\n    CGSSurfaceID sid, sid2;\n\n    e = CGLGetSurface(ctx.systemContext, &cid, &wid, &sid);\n    OVR_ASSERT(e == kCGLNoError); OVR_UNUSED(e);\n    e = CGLGetSurface(systemContext, &cid2, &wid2, &sid2);\n    OVR_ASSERT(e == kCGLNoError); OVR_UNUSED(e);\n    if( sid && sid != sid2 ) {\n        e = CGLSetSurface(systemContext, cid, wid, sid);\n        OVR_ASSERT(e == kCGLNoError); OVR_UNUSED(e);\n    }\n}\n#endif\n\nvoid Context::Destroy()\n{\n    if( initialized == false )\n    {\n        return;\n    }\n  \n    if (systemContext)\n    {\n#if defined(OVR_OS_MAC)\n        CGLDestroyContext( systemContext );\n#elif defined(OVR_OS_WIN32)\n        BOOL success = wglDeleteContext( systemContext );\n        OVR_ASSERT( success == TRUE );\n        OVR_UNUSED( success );\n#elif defined(OVR_OS_LINUX)\n        glXDestroyContext( x11Display, systemContext );\n#endif\n\n        systemContext = NULL;\n    }\n  \n    initialized = false;\n    ownsContext = true;\n}\n\nvoid Context::Bind()\n{\n    if(systemContext)\n    {\n#if defined(OVR_OS_MAC)\n        glFlush(); //Apple doesn't automatically flush within CGLSetCurrentContext, unlike other platforms.\n        CGLSetCurrentContext( systemContext );\n#elif defined(OVR_OS_WIN32)\n        wglMakeCurrent( hdc, systemContext );\n#elif defined(OVR_OS_LINUX)\n        glXMakeCurrent( x11Display, x11Drawable, systemContext );\n#endif\n    }\n}\n\nvoid Context::Unbind()\n{\n#if defined(OVR_OS_MAC)\n    glFlush(); //Apple doesn't automatically flush within CGLSetCurrentContext, unlike other platforms.\n    CGLSetCurrentContext( NULL );\n#elif defined(OVR_OS_WIN32)\n    wglMakeCurrent( hdc, NULL );\n#elif defined(OVR_OS_LINUX)\n    glXMakeCurrent( x11Display, None, NULL );\n#endif\n}\n\n}}} // namespace OVR::CAPI::GL\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/GL/CAPI_GL_Util.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_GL_Util.h\nContent     :   Utility header for OpenGL\nCreated     :   March 27, 2014\nAuthors     :   Andrew Reisse, David Borel\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef INC_OVR_CAPI_GL_Util_h\n#define INC_OVR_CAPI_GL_Util_h\n\n#include \"../../OVR_CAPI.h\"  \n#include \"../../Kernel/OVR_Array.h\"\n#include \"../../Kernel/OVR_Math.h\"\n#include \"../../Kernel/OVR_RefCount.h\"\n#include \"../../Kernel/OVR_String.h\"\n#include \"../../Kernel/OVR_Types.h\"\n#include \"../../Kernel/OVR_Log.h\"\n\n#if defined(OVR_OS_WIN32)\n#define WIN32_LEAN_AND_MEAN\n#include <Windows.h>\n#endif\n\n#if !defined(OVR_DISABLE_GLE)   // By default we use the GLE module in order to link to OpenGL functions. However, if an external user \n#include \"CAPI_GLE.h\"           // wants to use an alternative mechanism to connect to OpenGL functions, they can #define OVR_DISABLE_GLE.\n#endif\n\n\n#if defined(OVR_OS_MAC)\n    #include <CoreGraphics/CGDirectDisplay.h>\n    #include <OpenGL/CGLTypes.h>\n#endif\n\n\nnamespace OVR\n{\n    // Get the shared LibOVR GLEContext instance.\n    class GLEContext;\n    GLEContext* GetGLEContext();\n}\n\nnamespace OVR { namespace CAPI { namespace GL {\nvoid InitGLExtensions();\n\n\n// Rendering primitive type used to render Model.\nenum PrimitiveType\n{\n    Prim_Triangles,\n    Prim_Lines,\n    Prim_TriangleStrip,\n    Prim_Unknown,\n    Prim_Count\n};\n\n// Types of shaders that can be stored together in a ShaderSet.\nenum ShaderStage\n{\n    Shader_Vertex   = 0,\n    Shader_Fragment = 2,\n    Shader_Pixel    = 2,\n    Shader_Count    = 3,\n};\n\nenum MapFlags\n{\n    Map_Discard        = 1,\n    Map_Read           = 2, // do not use\n    Map_Unsynchronized = 4, // like D3D11_MAP_NO_OVERWRITE\n};\n\n\n// Buffer types used for uploading geometry & constants.\nenum BufferUsage\n{\n    Buffer_Unknown  = 0,\n    Buffer_Vertex   = 1,\n    Buffer_Index    = 2,\n    Buffer_Uniform  = 4,\n    Buffer_TypeMask = 0xff,\n    Buffer_ReadOnly = 0x100, // Buffer must be created with Data().\n};\n\nenum TextureFormat\n{\n    Texture_RGBA            = 0x0100,\n    Texture_Depth           = 0x8000,\n    Texture_TypeMask        = 0xff00,\n    Texture_SamplesMask     = 0x00ff,\n    Texture_RenderTarget    = 0x10000,\n    Texture_GenMipmaps      = 0x20000,\n};\n\n// Texture sampling modes.\nenum SampleMode\n{\n    Sample_Linear       = 0,\n    Sample_Nearest      = 1,\n    Sample_Anisotropic  = 2,\n    Sample_FilterMask   = 3,\n\n    Sample_Repeat       = 0,\n    Sample_Clamp        = 4,\n    Sample_ClampBorder  = 8, // If unsupported Clamp is used instead.\n    Sample_AddressMask  =12,\n\n    Sample_Count        =13,\n};\n\n\n// Rendering parameters/pointers describing GL rendering setup.\nstruct RenderParams\n{\n#if defined(OVR_OS_WIN32)\n    HWND   Window;\n    HDC    DC;\n#elif defined(OVR_OS_LINUX)\n    struct _XDisplay* Disp;\n#endif\n\n    ovrSizei    BackBufferSize;\n    int    Multisample;\n};\n\n\nclass Buffer : public RefCountBase<Buffer>\n{\npublic:\n    RenderParams* pParams;\n    size_t        Size;\n    GLenum        Use;\n    GLuint        GLBuffer;\n\npublic:\n    Buffer(RenderParams* r);\n    ~Buffer();\n\n    GLuint         GetBuffer() { return GLBuffer; }\n\n    virtual size_t GetSize() { return Size; }\n    virtual void*  Map(size_t start, size_t size, int flags = 0);\n    virtual bool   Unmap(void *m);\n    virtual bool   Data(int use, const void* buffer, size_t size);\n};\n\nclass Texture : public RefCountBase<Texture>\n{\n\tbool IsUserAllocated;\n\npublic:\n    RenderParams* pParams;\n    GLuint        TexId;\n    int           Width, Height;\n\n    Texture(RenderParams* rp, int w, int h);\n    ~Texture();\n\n    virtual int GetWidth() const { return Width; }\n    virtual int GetHeight() const { return Height; }\n\n    virtual void SetSampleMode(int sm);\n\n    // Updates texture to point to specified resources\n    //  - used for slave rendering.\n    void UpdatePlaceholderTexture(GLuint texId,\n                                  const Sizei& textureSize);\n\n    virtual void Set(int slot, ShaderStage stage = Shader_Fragment) const;\n};\n\n// Base class for vertex and pixel shaders. Stored in ShaderSet.\nclass Shader : public RefCountBase<Shader>\n{\n    friend class ShaderSet;\n\nprotected:\n    ShaderStage Stage;\n\npublic:\n    Shader(ShaderStage s) : Stage(s) {}\n    virtual ~Shader() {}\n\n    ShaderStage GetStage() const { return Stage; }\n\n    virtual void Set(PrimitiveType) const { }\n    virtual void SetUniformBuffer(class Buffer* buffers, int i = 0) { OVR_UNUSED2(buffers, i); }\n\nprotected:\n    virtual bool SetUniform(const char* name, int n, const float* v) { OVR_UNUSED3(name, n, v); return false; }\n    virtual bool SetUniformBool(const char* name, int n, const bool* v) { OVR_UNUSED3(name, n, v); return false; }\n};\n\n\n\n// A group of shaders, one per stage.\n// A ShaderSet is applied for rendering with a given fill.\nclass ShaderSet : public RefCountBase<ShaderSet>\n{\nprotected:\n    Ptr<Shader> Shaders[Shader_Count];\n\n    struct Uniform\n    {\n        String Name;\n        int    Location, Size;\n        int    Type; // currently number of floats in vector\n\n        Uniform() : Name(), Location(0), Size(0), Type(0){}\n    };\n    Array<Uniform> UniformInfo;\n\t\npublic:\n\tGLuint    Prog;\n    GLint     ProjLoc, ViewLoc;\n    GLint     TexLoc[8];\n    bool      UsesLighting;\n    int       LightingVer;\n\n    ShaderSet();\n    ~ShaderSet();\n\n    virtual void SetShader(Shader *s);\n    virtual void UnsetShader(int stage);\n    Shader* GetShader(int stage) { return Shaders[stage]; }\n\n    virtual void Set(PrimitiveType prim) const\n    {\n\t\tglUseProgram(Prog);\n\n        for (int i = 0; i < Shader_Count; i++)\n            if (Shaders[i])\n                Shaders[i]->Set(prim);\n    }\n\n    // Set a uniform (other than the standard matrices). It is undefined whether the\n    // uniforms from one shader occupy the same space as those in other shaders\n    // (unless a buffer is used, then each buffer is independent).     \n    virtual bool SetUniform(const char* name, int n, const float* v);\n    bool SetUniform1f(const char* name, float x)\n    {\n        const float v[] = {x};\n        return SetUniform(name, 1, v);\n    }\n    bool SetUniform2f(const char* name, float x, float y)\n    {\n        const float v[] = {x,y};\n        return SetUniform(name, 2, v);\n    }\n    bool SetUniform3f(const char* name, float x, float y, float z)\n    {\n        const float v[] = {x,y,z};\n        return SetUniform(name, 3, v);\n    }\n    bool SetUniform4f(const char* name, float x, float y, float z, float w = 1)\n    {\n        const float v[] = {x,y,z,w};\n        return SetUniform(name, 4, v);\n    }\n\n    bool SetUniformv(const char* name, const Vector3f& v)\n    {\n        const float a[] = {v.x,v.y,v.z,1};\n        return SetUniform(name, 4, a);\n    }\n \n    virtual bool SetUniform4x4f(const char* name, const Matrix4f& m)\n    {\n        Matrix4f mt = m.Transposed();\n        return SetUniform(name, 16, &mt.M[0][0]);\n    }\n\n    virtual bool SetUniform3x3f(const char* name, const Matrix4f& m)\n    {\n        Matrix4f mt = m.Transposed();\n        // float3x3 is actually stored the same way as float4x3, with the last items ignored by the code.\n        return SetUniform(name, 12, &mt.M[0][0]);\n    }\n\n\nprotected:\n\tGLint GetGLShader(Shader* s);\n    bool Link();\n};\n\n\n// Fill combines a ShaderSet (vertex, pixel) with textures, if any.\n// Every model has a fill.\nclass ShaderFill : public RefCountBase<ShaderFill>\n{\n    Ptr<ShaderSet>     Shaders;\n    Ptr<class Texture> Textures[8];\n    void*              InputLayout; // HACK this should be abstracted\n\npublic:\n    ShaderFill(ShaderSet* sh) : Shaders(sh) { InputLayout = NULL; }\n    ShaderFill(ShaderSet& sh) : Shaders(sh) { InputLayout = NULL; }    \n\n    ShaderSet*  GetShaders() const      { return Shaders; }\n    void*       GetInputLayout() const  { return InputLayout; }\n\n    virtual void Set(PrimitiveType prim = Prim_Unknown) const {\n\t\tShaders->Set(prim);\n\t\tfor(int i = 0; i < 8; i++)\n\t\t{\n\t\t\tif(Textures[i])\n\t\t\t{\n\t\t\t\tTextures[i]->Set(i);\n\t\t\t}\n\t\t}\n\t}\n\n    virtual void SetTexture(int i, class Texture* tex) { if (i < 8) Textures[i] = tex; }\n};\n\n    \nstruct DisplayId\n{\n    // Windows\n    String MonitorName; // Monitor name for fullscreen mode\n    \n    // MacOS\n    long   CgDisplayId; // CGDirectDisplayID\n    \n    DisplayId() : CgDisplayId(0) {}\n    DisplayId(long id) : CgDisplayId(id) {}\n    DisplayId(String m, long id=0) : MonitorName(m), CgDisplayId(id) {}\n    \n    operator bool () const\n    {\n        return MonitorName.GetLength() || CgDisplayId;\n    }\n    \n    bool operator== (const DisplayId& b) const\n    {\n        return CgDisplayId == b.CgDisplayId &&\n            (strstr(MonitorName.ToCStr(), b.MonitorName.ToCStr()) ||\n             strstr(b.MonitorName.ToCStr(), MonitorName.ToCStr()));\n    }\n};\n\n\nclass ShaderBase : public Shader\n{\npublic:    \n    RenderParams*   pParams;\n    unsigned char*  UniformData;\n    int             UniformsSize;\n\n\tenum VarType\n\t{\n\t\tVARTYPE_FLOAT,\n\t\tVARTYPE_INT,\n\t\tVARTYPE_BOOL,\n\t};\n\n\tstruct Uniform\n\t{\n\t\tconst char* Name;\n\t\tVarType     Type;\n        int         Offset;\n        int         Size;\n\t};\n\n    const Uniform*  UniformRefl;\n    size_t          UniformReflSize;\n\n\tShaderBase(RenderParams* rp, ShaderStage stage) :\n        Shader(stage),\n        pParams(rp),\n        UniformData(NULL),\n        UniformsSize(0),\n        UniformRefl(NULL),\n        UniformReflSize(0)\n    {\n    }\n\t~ShaderBase()\n\t{\n        if (UniformData)\n        {\n            OVR_FREE(UniformData);\n            UniformData = NULL;\n        }\n\n        // Do not need to free UniformRefl\n        UniformRefl = NULL;\n\t}\n\n    void InitUniforms(const Uniform* refl, size_t reflSize);\n\tbool SetUniform(const char* name, int n, const float* v);\n\tbool SetUniformBool(const char* name, int n, const bool* v);\n};\n\n\ntemplate<ShaderStage SStage, GLenum SType>\nclass ShaderImpl : public ShaderBase\n{\n    friend class ShaderSet;\n\npublic:\n    ShaderImpl(RenderParams* rp, void* s, size_t size, const Uniform* refl, size_t reflSize)\n\t\t: ShaderBase(rp, SStage)\n\t\t, GLShader(0)\n    {\n\t\tbool success;\n        OVR_UNUSED(size);\n        success = Compile((const char*) s);\n        OVR_ASSERT(success);\n        OVR_UNUSED(success);\n\t\tInitUniforms(refl, reflSize);\n    }\n    ~ShaderImpl()\n    {      \n\t\tif (GLShader)\n\t\t{\n\t\t\tglDeleteShader(GLShader);\n\t\t\tGLShader = 0;\n\t\t}\n    }\n    bool Compile(const char* src)\n\t{\n\t\tif (!GLShader)\n\t\t\tGLShader = glCreateShader(GLStage());\n\n\t\tglShaderSource(GLShader, 1, &src, 0);\n\t\tglCompileShader(GLShader);\n\t\tGLint r;\n\t\tglGetShaderiv(GLShader, GL_COMPILE_STATUS, &r);\n\t\tif (!r)\n\t\t{\n\t\t\tGLchar msg[1024];\n\t\t\tglGetShaderInfoLog(GLShader, sizeof(msg), 0, msg);\n\t\t\tif (msg[0])\n\t\t\t\tOVR_DEBUG_LOG((\"Compiling shader\\n%s\\nfailed: %s\\n\", src, msg));\n\n\t\t\treturn 0;\n\t\t}\n\t\treturn 1;\n\t}\n\t\n    GLenum GLStage() const\n    {\n\t\treturn SType;\n\t}\n\nprivate:\n\tGLuint GLShader;\n};\n\ntypedef ShaderImpl<Shader_Vertex,  GL_VERTEX_SHADER> VertexShader;\ntypedef ShaderImpl<Shader_Fragment, GL_FRAGMENT_SHADER> FragmentShader;\n\n\n\n// Allows us to have independent OpenGL contexts for our systems.\nclass Context\n{\n    bool                initialized;\n    bool                ownsContext;\n    int                 incarnation;\n#if defined(OVR_OS_WIN32)\n    HDC                 hdc;\n    HGLRC               systemContext;\n#elif defined(OVR_OS_LINUX)\n    Display            *x11Display;\n    GLXDrawable         x11Drawable;\n    GLXContext          systemContext;\n    XVisualInfo         x11Visual;\n#elif defined(OVR_OS_MAC)\n    CGLContextObj       systemContext;\n#endif\n        \npublic:\n\n    Context();\n    void InitFromCurrent();\n    void CreateShared( Context & ctx );\n#if defined(OVR_OS_MAC)\n    void SetSurface( Context & ctx );\n#endif\n    void Destroy();\n    void Bind();\n    void Unbind();\n    int  GetIncarnation() const { return incarnation; }\n\n};\n\n\n// AutoContext\n//\n// Implements a common sequence of function calls with the Context class.\n// See the AutoContext constructor below for what it does. \n//\n// Example usage:\n//     void SomeClass::Draw()\n//     {\n//         AutoContext autoContext(someClassContext);\n//\n//         <draw calls>\n//     }\n\nstruct AutoContext\n{\n    Context  savedCurrentContext;\n    Context& ourContext;\n\n    AutoContext(Context& context) :\n        savedCurrentContext(), ourContext(context)\n    {\n        // We use a member savedCurrentContext which is initialized here, as opposed to having the user pass in a \n        // pre-existing Context (which the user could declare as a global or C++ member variable). We have to do this\n        // because if we were to use some pre-existing Context the app might delete its underlying GL context behind our back\n        // or associate it with another thread, which would cause our bind of it in our dtor to be a bad operation.\n        savedCurrentContext.InitFromCurrent();\n        if(ourContext.GetIncarnation() == 0) // If not yet initialized...\n            ourContext.CreateShared(savedCurrentContext);\n        ourContext.Bind();\n        #if defined(OVR_OS_MAC) // To consider: merge the following into the Bind function.\n            ourContext.SetSurface(savedCurrentContext);\n        #endif\n    }\n\n   ~AutoContext()\n    {\n        savedCurrentContext.Bind();\n    }\n\n    OVR_NON_COPYABLE(AutoContext)\n};\n\n\n}}} // namespace OVR::CAPI::GL\n\n\n#endif // INC_OVR_CAPI_GL_Util_h\n"
  },
  {
    "path": "externals/ovr/Src/CAPI/Textures/healthAndSafety.tga.h",
    "content": "const uint8_t healthAndSafety_tga[107525] = {\n   0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x20,0x08,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc7,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x52,0x52,0x52,0xbd,\n   0x9f,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x00,0xb3,0x82,0x7e,\n   0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x8c,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xc6,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0x9d,0x00,\n   0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0xfc,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,\n   0x84,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x8a,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc6,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x9d,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xfb,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,\n   0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x89,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc6,0x00,0x00,0x00,0xb3,0x05,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xe6,0xe6,\n   0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x9d,0x00,0x00,0x00,0xb3,0x05,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,\n   0xff,0xff,0xff,0xff,0xd2,0xd2,0xd2,0xe6,0xfc,0x00,0x00,0x00,0xb3,0x05,0xef,0xef,0xef,0xf5,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,\n   0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x88,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x96,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,\n   0xc7,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,\n   0x7e,0x7e,0xc7,0x00,0x52,0x52,0x52,0xbd,0x89,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x91,0x00,0x00,0x00,0xb3,0x00,\n   0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x95,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,\n   0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x8a,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,\n   0x00,0x33,0x33,0x33,0xb8,0x83,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x8b,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,\n   0x7e,0xc7,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x99,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,\n   0x7e,0x7e,0x7e,0xc7,0x9b,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,\n   0x86,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,\n   0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x00,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x01,\n   0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x04,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0xef,0xef,\n   0xef,0xf5,0x83,0xff,0xff,0xff,0xff,0x03,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0x83,0xff,0xff,0xff,0xff,0x01,0xef,0xef,\n   0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0x86,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xd2,0xd2,0xd2,0xe6,0x81,0xff,\n   0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x88,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x04,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,\n   0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x89,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x81,0x00,0x00,\n   0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x01,0x6a,\n   0x6a,0x6a,0xc2,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,\n   0x01,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,\n   0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,\n   0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,\n   0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,\n   0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,\n   0xaf,0xd6,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x6a,\n   0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x05,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xd2,\n   0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x84,0x00,0x00,\n   0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0x00,\n   0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x87,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x33,0x33,\n   0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,\n   0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x88,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,\n   0x84,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x85,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x86,0x00,0x00,0x00,\n   0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,\n   0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,0xc7,0x00,0x00,\n   0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x85,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x86,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xfe,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0xbb,0xbb,0xbb,0xdc,0x33,0x33,\n   0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x03,0xa0,0xa0,0xa0,0xd1,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x03,0xdc,0xdc,\n   0xdc,0xeb,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,\n   0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,\n   0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xd2,0xd2,\n   0xd2,0xe6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,\n   0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x85,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,\n   0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,\n   0xdc,0xeb,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,\n   0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,\n   0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xd2,\n   0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,\n   0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x02,0x6a,\n   0x6a,0x6a,0xc2,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x84,0xaf,0xaf,0xaf,0xd6,0x05,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,\n   0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x02,0x7e,0x7e,0x7e,0xc7,0xbb,0xbb,0xbb,0xdc,0xe6,0xe6,0xe6,0xf0,0x82,0xff,\n   0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x90,0x90,0x90,0xcc,\n   0x7e,0x7e,0x7e,0xc7,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,\n   0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x87,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0xaf,0xaf,0xaf,0xd6,\n   0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x01,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x01,0xff,0xff,0xff,0xff,0xc7,0xc7,0xc7,\n   0xe1,0x87,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,\n   0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,\n   0x03,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xaf,0xaf,0xaf,0xd6,\n   0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x85,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xbb,\n   0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,\n   0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x06,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,\n   0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0xaf,0xaf,0xaf,0xd6,0x01,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,\n   0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,\n   0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,\n   0x03,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x84,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x86,0x00,0x00,0x00,0xb3,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,\n   0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,\n   0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,\n   0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xe6,0xe6,\n   0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,\n   0x81,0xff,0xff,0xff,0xff,0x09,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xbb,0xbb,\n   0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,\n   0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x87,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,\n   0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x04,\n   0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x87,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,\n   0xb3,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x7e,0x7e,0x7e,0xc7,\n   0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,\n   0xdc,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x52,0x52,0x52,\n   0xbd,0x88,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,\n   0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,\n   0xd2,0xd2,0xd2,0xe6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,\n   0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,\n   0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x04,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,\n   0x03,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xa0,0xa0,0xa0,0xd1,0x87,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x05,0xaf,0xaf,\n   0xaf,0xd6,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,\n   0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x04,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x82,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x05,0x7e,0x7e,\n   0x7e,0xc7,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0x52,0x52,0x52,0xbd,0xbb,0xbb,0xbb,0xdc,\n   0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0x6a,0x6a,0x6a,0xc2,\n   0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x05,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,\n   0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,\n   0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,\n   0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0xc7,0xc7,0xc7,0xe1,\n   0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0x7e,\n   0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x0a,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xe6,\n   0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x03,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x03,0x52,0x52,0x52,0xbd,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x08,0xaf,0xaf,0xaf,0xd6,0x52,\n   0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,\n   0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x05,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,\n   0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0x33,0x33,0x33,0xb8,0x85,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,\n   0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x02,0xe6,\n   0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x85,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,\n   0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xaf,0xaf,0xaf,0xd6,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x05,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,\n   0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x01,\n   0xd2,0xd2,0xd2,0xe6,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x09,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,\n   0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x03,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x81,\n   0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,\n   0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x0a,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,\n   0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x85,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x84,0xff,0xff,0xff,\n   0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,\n   0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,\n   0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x08,0x00,0x00,\n   0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xe6,0xe6,\n   0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x84,0x00,0x00,0x00,0xb3,0x86,0xff,0xff,0xff,0xff,0x02,0x00,\n   0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x86,0x00,0x00,0x00,0xb3,0x04,0x33,0x33,0x33,0xb8,0xf7,\n   0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0xe6,\n   0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xa0,\n   0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,\n   0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,\n   0xd1,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,\n   0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,\n   0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,\n   0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,\n   0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x03,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0x81,0x00,\n   0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x06,\n   0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,\n   0xb3,0x01,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x86,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,\n   0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,\n   0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0xa0,0xa0,0xa0,0xd1,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x03,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x00,0x00,\n   0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x02,0xd2,0xd2,0xd2,0xe6,0xdc,0xdc,0xdc,0xeb,0xc7,0xc7,\n   0xc7,0xe1,0x85,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,\n   0x0b,0xd2,0xd2,0xd2,0xe6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,\n   0xfa,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,0x00,0xb3,\n   0x00,0x52,0x52,0x52,0xbd,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x01,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,\n   0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x06,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,\n   0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xd2,0xd2,0xd2,0xe6,0x52,0x52,0x52,0xbd,0x83,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,\n   0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x05,0xbb,0xbb,0xbb,0xdc,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,\n   0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,\n   0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x52,0x52,\n   0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,\n   0x81,0xdc,0xdc,0xdc,0xeb,0x01,0x52,0x52,0x52,0xbd,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,\n   0xe6,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x83,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,\n   0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xc7,\n   0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,\n   0x01,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,\n   0xca,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa0,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0xa5,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xaa,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x91,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0x93,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0xcb,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa0,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,\n   0xaf,0xd6,0xa5,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xaa,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x91,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0x93,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,\n   0x87,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0xcb,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa0,0x00,0x00,0x00,0xb3,0x00,0x33,\n   0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x52,0x52,0x52,0xbd,0xa5,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xaa,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x91,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x93,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x85,0xdc,0xdc,0xdc,0xeb,0x01,0xaf,0xaf,0xaf,0xd6,0x52,0x52,0x52,0xbd,0xcc,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xca,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xaa,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x91,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x93,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd6,0x00,0x00,\n   0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0xca,0x00,0x00,0x00,0xb3,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0xaa,0x00,0x00,0x00,0xb3,\n   0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x91,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x93,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x8f,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb4,0xf1,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd6,0x00,0x00,0x00,0xb3,0xc3,0x00,0x00,0x00,0xb4,0xff,0x01,0x00,0x00,0xb4,\n   0xdb,0x01,0x00,0x00,0xb4,0xc3,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xb5,0x00,0x00,0x00,0xb3,0x82,0x00,0x00,0x00,0xb4,0x8b,0x00,0x00,0x00,0xb3,0x97,0x00,0x00,0x00,0xb4,0x92,0x01,0x00,0x00,0xb4,0x91,0x01,0x00,0x00,\n   0xb5,0x8c,0x01,0x01,0x00,0xb5,0xff,0x01,0x01,0x01,0xb6,0xf3,0x01,0x01,0x01,0xb6,0x8c,0x01,0x01,0x00,0xb5,0x91,0x01,0x00,0x00,0xb5,0x92,0x01,0x00,0x00,0xb4,0x97,\n   0x00,0x00,0x00,0xb4,0x8b,0x00,0x00,0x00,0xb3,0x82,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa3,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa8,0x00,0x00,0x00,0xb3,0x9b,0x00,0x00,0x00,0xb4,0x8e,0x01,0x00,0x00,0xb4,0x88,0x01,0x00,0x00,0xb5,0x81,0x01,0x01,0x00,0xb5,\n   0x8f,0x01,0x01,0x01,0xb6,0x00,0x01,0x01,0x01,0xb7,0x8b,0x02,0x01,0x01,0xb7,0xa8,0x02,0x01,0x01,0xb8,0x00,0x02,0x02,0x01,0xb9,0x81,0x03,0x02,0x01,0xb9,0x82,0x02,\n   0x02,0x01,0xb9,0x82,0x03,0x02,0x01,0xb9,0x83,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,\n   0xb9,0x00,0x03,0x02,0x01,0xb9,0x85,0x02,0x02,0x01,0xb9,0x02,0x03,0x02,0x01,0xb9,0x02,0x02,0x01,0xb9,0x03,0x02,0x01,0xb9,0x82,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,\n   0x01,0xb9,0x82,0x02,0x02,0x01,0xb9,0x81,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x04,0x03,0x02,0x01,0xb9,0x02,0x02,0x01,0xb9,0x03,0x02,0x01,0xb9,0x02,0x02,\n   0x01,0xb9,0x03,0x02,0x01,0xb9,0x84,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x83,0x02,0x02,0x01,0xb9,0x00,\n   0x03,0x02,0x01,0xb9,0x85,0x02,0x02,0x01,0xb9,0x81,0x03,0x02,0x01,0xb9,0x82,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x83,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,\n   0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x81,0x03,0x02,0x01,0xb9,0x02,0x02,0x02,0x01,0xb9,0x03,0x02,0x01,0xb9,0x02,0x02,0x01,0xb9,0x81,0x03,0x02,0x01,0xb9,0x81,0x02,\n   0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x8d,0x02,0x02,0x01,0xb9,0x01,0x03,0x02,0x01,0xb9,0x02,0x02,0x01,0xb9,\n   0x81,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x82,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x87,0x02,0x02,0x01,0xb9,0x81,0x03,\n   0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x83,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x87,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,\n   0xb9,0x85,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x85,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x84,\n   0x02,0x02,0x01,0xb9,0x82,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x82,0x02,0x02,0x01,0xb9,0x01,0x03,0x02,0x01,0xb9,0x02,0x02,0x01,\n   0xb9,0x82,0x03,0x02,0x01,0xb9,0x83,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x8b,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x82,0x02,0x02,0x01,0xb9,0x8d,\n   0x02,0x01,0x01,0xb8,0x00,0x02,0x02,0x01,0xb8,0x90,0x02,0x01,0x01,0xb8,0x00,0x02,0x02,0x01,0xb8,0x87,0x02,0x01,0x01,0xb8,0x8b,0x02,0x01,0x01,0xb7,0x00,0x01,0x01,\n   0x01,0xb7,0x8f,0x01,0x01,0x01,0xb6,0x81,0x01,0x01,0x00,0xb5,0x88,0x01,0x00,0x00,0xb5,0x8e,0x01,0x00,0x00,0xb4,0x9b,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0x96,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa6,0x00,0x00,0x00,0xb3,0x91,0x00,0x00,0x00,0xb4,0x87,0x01,\n   0x00,0x00,0xb4,0x85,0x01,0x00,0x00,0xb5,0x88,0x01,0x01,0x00,0xb5,0x86,0x01,0x01,0x01,0xb6,0x81,0x01,0x01,0x01,0xb7,0x86,0x02,0x01,0x01,0xb7,0x83,0x02,0x01,0x01,\n   0xb8,0x00,0x02,0x02,0x01,0xb8,0x86,0x02,0x01,0x01,0xb8,0x83,0x02,0x02,0x01,0xb9,0x81,0x03,0x02,0x01,0xb9,0x89,0x03,0x02,0x01,0xba,0x82,0x03,0x02,0x02,0xbb,0x00,\n   0x03,0x02,0x01,0xbb,0x8c,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x02,0xbc,0x8d,0x04,0x02,0x02,0xbc,0xff,0x04,0x03,0x02,0xbd,0xd9,0x04,0x03,0x02,0xbd,0x85,0x04,0x02,\n   0x02,0xbc,0x00,0x04,0x03,0x02,0xbc,0x86,0x04,0x02,0x02,0xbc,0x00,0x03,0x02,0x02,0xbc,0x87,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x01,0xbb,0x87,0x03,0x02,0x02,0xbb,\n   0x89,0x03,0x02,0x01,0xba,0x00,0x03,0x02,0x01,0xb9,0x84,0x02,0x02,0x01,0xb9,0x8b,0x02,0x01,0x01,0xb8,0x86,0x02,0x01,0x01,0xb7,0x81,0x01,0x01,0x01,0xb7,0x86,0x01,\n   0x01,0x01,0xb6,0x88,0x01,0x01,0x00,0xb5,0x85,0x01,0x00,0x00,0xb5,0x87,0x01,0x00,0x00,0xb4,0x91,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0x94,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x9d,0x00,0x00,0x00,0xb3,0x92,0x00,0x00,0x00,0xb4,0x88,0x01,0x00,0x00,0xb4,0x84,\n   0x01,0x00,0x00,0xb5,0x86,0x01,0x01,0x00,0xb5,0x83,0x01,0x01,0x01,0xb6,0x01,0x02,0x01,0x01,0xb7,0x01,0x01,0x01,0xb7,0x85,0x02,0x01,0x01,0xb7,0x86,0x02,0x01,0x01,\n   0xb8,0x82,0x02,0x02,0x01,0xb9,0x82,0x03,0x02,0x01,0xb9,0x83,0x03,0x02,0x01,0xba,0x00,0x03,0x02,0x01,0xbb,0x82,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x01,0xbb,0x83,\n   0x03,0x02,0x02,0xbb,0x81,0x03,0x02,0x02,0xbc,0x01,0x04,0x02,0x02,0xbc,0x03,0x02,0x02,0xbc,0x84,0x04,0x02,0x02,0xbc,0x88,0x04,0x03,0x02,0xbd,0x01,0x04,0x03,0x02,\n   0xbe,0x05,0x03,0x02,0xbe,0x85,0x04,0x03,0x02,0xbe,0x00,0x04,0x03,0x02,0xbf,0x85,0x05,0x03,0x02,0xbf,0x85,0x05,0x03,0x02,0xc0,0x00,0x05,0x04,0x01,0xc0,0x81,0x05,\n   0x03,0x02,0xc0,0x00,0x05,0x03,0x03,0xc0,0x8d,0x05,0x04,0x03,0xc0,0x00,0x06,0x04,0x03,0xc1,0x83,0x05,0x04,0x03,0xc1,0x02,0x06,0x04,0x03,0xc1,0x05,0x04,0x03,0xc1,\n   0x05,0x04,0x01,0xc1,0x81,0x05,0x04,0x03,0xc1,0x81,0x06,0x04,0x03,0xc1,0x05,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x05,\n   0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x82,0x05,0x04,0x03,0xc1,0x00,0x05,0x04,0x01,0xc1,0x81,0x05,0x04,0x03,0xc1,0x00,0x06,0x04,0x03,0xc1,0x83,0x05,0x04,0x03,0xc1,\n   0x00,0x06,0x04,0x03,0xc1,0x83,0x05,0x04,0x03,0xc1,0x00,0x05,0x04,0x01,0xc1,0x81,0x05,0x04,0x03,0xc1,0x00,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,0xc1,0x02,0x06,\n   0x04,0x03,0xc1,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,0xc1,0x02,0x06,0x04,0x03,0xc1,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x82,0x05,0x04,\n   0x03,0xc1,0x00,0x06,0x04,0x03,0xc1,0x82,0x05,0x04,0x03,0xc1,0xd9,0x06,0x04,0x03,0xc2,0x05,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x05,0x04,0x03,0xc1,0x06,0x04,\n   0x03,0xc1,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x83,0x05,0x04,0x03,0xc1,0x02,0x06,0x04,0x03,0xc1,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,\n   0xc1,0x00,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,0xc1,0x00,0x06,0x04,0x03,0xc1,0x82,0x05,0x04,0x03,0xc1,0x00,0x06,0x04,0x03,0xc1,0x82,0x05,0x04,0x03,0xc1,0x01,\n   0x05,0x04,0x01,0xc1,0x05,0x04,0x03,0xc1,0x82,0x06,0x04,0x03,0xc1,0x00,0x05,0x04,0x03,0xc1,0x81,0x06,0x04,0x03,0xc1,0x03,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,\n   0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x85,0x05,0x04,0x03,0xc1,0x00,0x05,0x04,0x01,0xc1,0x81,0x05,0x04,0x03,0xc1,0x01,0x06,0x04,0x03,0xc1,0x05,0x04,0x03,0xc1,\n   0x81,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,0xc1,0x81,0x06,0x04,0x03,0xc1,0x8d,0x05,0x04,0x03,0xc0,0x00,0x05,0x03,0x03,0xc0,0x81,0x05,0x03,0x02,0xc0,0x00,0x05,\n   0x04,0x01,0xc0,0x85,0x05,0x03,0x02,0xc0,0x85,0x05,0x03,0x02,0xbf,0x00,0x04,0x03,0x02,0xbf,0x81,0x04,0x03,0x02,0xbe,0x82,0x05,0x03,0x02,0xbe,0x02,0x04,0x03,0x02,\n   0xbe,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x88,0x04,0x03,0x02,0xbd,0x84,0x04,0x02,0x02,0xbc,0x82,0x03,0x02,0x02,0xbc,0x00,0x04,0x02,0x02,0xbc,0x88,0x03,0x02,\n   0x02,0xbb,0x83,0x03,0x02,0x01,0xba,0x82,0x03,0x02,0x01,0xb9,0x82,0x02,0x02,0x01,0xb9,0x86,0x02,0x01,0x01,0xb8,0x85,0x02,0x01,0x01,0xb7,0x81,0x01,0x01,0x01,0xb7,\n   0x83,0x01,0x01,0x01,0xb6,0x86,0x01,0x01,0x00,0xb5,0x84,0x01,0x00,0x00,0xb5,0x88,0x01,0x00,0x00,0xb4,0x92,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0x8b,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x9b,0x00,0x00,0x00,0xb3,0x91,0x00,0x00,0x00,0xb4,0x87,0x01,0x00,0x00,\n   0xb4,0x82,0x01,0x00,0x00,0xb5,0x81,0x01,0x01,0x00,0xb5,0x89,0x01,0x01,0x01,0xb6,0x81,0x02,0x01,0x01,0xb7,0x8a,0x02,0x01,0x01,0xb8,0x81,0x02,0x02,0x01,0xb9,0x81,\n   0x03,0x02,0x01,0xb9,0x84,0x03,0x02,0x01,0xba,0x83,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x02,0xbc,0x85,0x04,0x02,0x02,0xbc,0x84,0x04,0x03,0x02,0xbd,0x01,0x04,0x03,\n   0x02,0xbe,0x05,0x03,0x02,0xbe,0x81,0x04,0x03,0x02,0xbe,0x81,0x05,0x03,0x02,0xbe,0x82,0x04,0x03,0x02,0xbe,0x00,0x04,0x03,0x02,0xbf,0x81,0x05,0x03,0x02,0xbf,0x82,\n   0x05,0x03,0x02,0xc0,0x00,0x05,0x04,0x03,0xc0,0x81,0x05,0x04,0x03,0xc1,0x02,0x06,0x04,0x03,0xc1,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x85,0x05,0x04,0x03,0xc1,\n   0x87,0x06,0x04,0x03,0xc2,0x86,0x06,0x04,0x03,0xc3,0x86,0x06,0x04,0x03,0xc4,0x81,0x07,0x04,0x03,0xc5,0x97,0x07,0x05,0x02,0xc5,0xa4,0x07,0x05,0x02,0xc6,0x8b,0x07,\n   0x05,0x04,0xc6,0x00,0x07,0x05,0x02,0xc6,0x96,0x07,0x05,0x04,0xc6,0x00,0x07,0x05,0x02,0xc6,0x98,0x07,0x05,0x04,0xc6,0x00,0x07,0x05,0x02,0xc6,0x8b,0x07,0x05,0x04,\n   0xc6,0x00,0x07,0x05,0x02,0xc6,0x88,0x07,0x05,0x04,0xc6,0x00,0x07,0x05,0x02,0xc6,0x85,0x07,0x05,0x04,0xc6,0xa4,0x07,0x05,0x02,0xc6,0x98,0x07,0x05,0x02,0xc5,0x00,\n   0x07,0x04,0x03,0xc5,0x81,0x06,0x04,0x03,0xc4,0x81,0x07,0x04,0x03,0xc4,0x82,0x06,0x04,0x03,0xc4,0x86,0x06,0x04,0x03,0xc3,0x87,0x06,0x04,0x03,0xc2,0x82,0x06,0x04,\n   0x03,0xc1,0x01,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,0xc1,0x00,0x05,0x04,0x01,0xc1,0x82,0x05,0x04,0x03,0xc1,0x01,0x05,0x04,0x03,0xc0,0x05,\n   0x03,0x03,0xc0,0x81,0x05,0x03,0x02,0xc0,0x82,0x05,0x03,0x02,0xbf,0x00,0x05,0x03,0x02,0xbe,0x85,0x04,0x03,0x02,0xbe,0x01,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,\n   0x84,0x04,0x03,0x02,0xbd,0x82,0x04,0x02,0x02,0xbc,0x00,0x04,0x03,0x02,0xbc,0x82,0x04,0x02,0x02,0xbc,0x83,0x03,0x02,0x02,0xbb,0x84,0x03,0x02,0x01,0xba,0x82,0x03,\n   0x02,0x01,0xb9,0x00,0x02,0x02,0x01,0xb9,0x8a,0x02,0x01,0x01,0xb8,0x81,0x02,0x01,0x01,0xb7,0x89,0x01,0x01,0x01,0xb6,0x81,0x01,0x01,0x00,0xb5,0x82,0x01,0x00,0x00,\n   0xb5,0x87,0x01,0x00,0x00,0xb4,0x91,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x89,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0x99,0x00,0x00,0x00,0xb3,0x91,0x00,0x00,0x00,0xb4,0x81,0x01,0x00,0x00,0xb4,0x87,0x01,0x00,0x00,0xb5,0x82,0x01,0x01,0x00,0xb5,0x83,0x01,0x01,\n   0x01,0xb6,0x03,0x02,0x01,0x01,0xb7,0x01,0x01,0x01,0xb7,0x02,0x01,0x01,0xb7,0x01,0x01,0x01,0xb7,0x83,0x02,0x01,0x01,0xb7,0x82,0x02,0x01,0x01,0xb8,0x85,0x02,0x02,\n   0x01,0xb9,0x85,0x03,0x02,0x01,0xba,0x82,0x03,0x02,0x02,0xbb,0x83,0x03,0x02,0x02,0xbc,0x82,0x04,0x02,0x02,0xbc,0x85,0x04,0x03,0x02,0xbd,0x81,0x04,0x03,0x02,0xbe,\n   0x83,0x04,0x03,0x02,0xbf,0x00,0x05,0x03,0x02,0xbf,0x81,0x05,0x03,0x02,0xc0,0x01,0x05,0x03,0x03,0xc0,0x05,0x04,0x03,0xc0,0x86,0x05,0x04,0x03,0xc1,0x83,0x06,0x04,\n   0x03,0xc2,0x81,0x06,0x04,0x03,0xc3,0x00,0x06,0x05,0x02,0xc3,0x83,0x06,0x04,0x03,0xc3,0x82,0x06,0x04,0x03,0xc4,0x81,0x07,0x04,0x03,0xc5,0x89,0x07,0x05,0x02,0xc5,\n   0x04,0x07,0x05,0x02,0xc6,0x07,0x05,0x04,0xc6,0x07,0x05,0x02,0xc6,0x07,0x05,0x02,0xc7,0x07,0x05,0x04,0xc7,0x82,0x08,0x05,0x04,0xc7,0x00,0x08,0x05,0x02,0xc7,0x86,\n   0x08,0x05,0x04,0xc7,0x86,0x08,0x05,0x04,0xc8,0x00,0x08,0x05,0x02,0xc8,0x8f,0x08,0x05,0x04,0xc8,0x81,0x08,0x05,0x04,0xc9,0xff,0x08,0x06,0x03,0xc9,0x9d,0x08,0x06,\n   0x03,0xc9,0x81,0x08,0x05,0x04,0xc9,0x84,0x08,0x05,0x04,0xc8,0x00,0x08,0x06,0x03,0xc8,0x91,0x08,0x05,0x04,0xc8,0x89,0x08,0x05,0x04,0xc7,0x82,0x07,0x05,0x04,0xc7,\n   0x02,0x07,0x05,0x02,0xc6,0x07,0x05,0x04,0xc6,0x07,0x05,0x02,0xc6,0x89,0x07,0x05,0x02,0xc5,0x81,0x07,0x04,0x03,0xc5,0x82,0x06,0x04,0x03,0xc4,0x86,0x06,0x04,0x03,\n   0xc3,0x83,0x06,0x04,0x03,0xc2,0x00,0x05,0x04,0x03,0xc1,0x81,0x06,0x04,0x03,0xc1,0x01,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,0xc1,0x01,0x05,\n   0x04,0x03,0xc0,0x05,0x03,0x03,0xc0,0x81,0x05,0x03,0x02,0xc0,0x83,0x05,0x03,0x02,0xbf,0x00,0x04,0x03,0x02,0xbf,0x81,0x04,0x03,0x02,0xbe,0x85,0x04,0x03,0x02,0xbd,\n   0x82,0x04,0x02,0x02,0xbc,0x81,0x03,0x02,0x02,0xbc,0x01,0x04,0x02,0x02,0xbc,0x03,0x02,0x02,0xbc,0x82,0x03,0x02,0x02,0xbb,0x85,0x03,0x02,0x01,0xba,0x85,0x02,0x02,\n   0x01,0xb9,0x82,0x02,0x01,0x01,0xb8,0x84,0x02,0x01,0x01,0xb7,0x82,0x01,0x01,0x01,0xb7,0x83,0x01,0x01,0x01,0xb6,0x82,0x01,0x01,0x00,0xb5,0x87,0x01,0x00,0x00,0xb5,\n   0x81,0x01,0x00,0x00,0xb4,0x91,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x87,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0x99,0x00,0x00,0x00,0xb3,0x8d,0x00,0x00,0x00,0xb4,0x85,0x01,0x00,0x00,0xb4,0x87,0x01,0x00,0x00,0xb5,0x00,0x01,0x01,0x00,0xb5,0x87,0x01,0x01,0x01,\n   0xb6,0x00,0x01,0x01,0x01,0xb7,0x82,0x02,0x01,0x01,0xb7,0x83,0x02,0x01,0x01,0xb8,0x00,0x02,0x02,0x01,0xb9,0x84,0x03,0x02,0x01,0xb9,0x84,0x03,0x02,0x01,0xba,0x02,\n   0x03,0x02,0x02,0xbb,0x03,0x02,0x01,0xbb,0x03,0x02,0x02,0xbb,0x81,0x04,0x02,0x02,0xbc,0x01,0x04,0x03,0x02,0xbc,0x04,0x02,0x02,0xbc,0x85,0x04,0x03,0x02,0xbd,0x02,\n   0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbf,0x83,0x05,0x03,0x02,0xbf,0x81,0x05,0x03,0x02,0xc0,0x81,0x05,0x03,0x03,0xc0,0x81,0x05,0x04,0x03,0xc0,\n   0x81,0x05,0x04,0x03,0xc1,0x86,0x06,0x04,0x03,0xc2,0x81,0x06,0x04,0x03,0xc3,0x00,0x07,0x04,0x03,0xc4,0x81,0x06,0x04,0x03,0xc4,0x81,0x07,0x04,0x03,0xc4,0x82,0x06,\n   0x04,0x03,0xc4,0x00,0x07,0x04,0x03,0xc5,0x84,0x07,0x05,0x02,0xc5,0x81,0x07,0x05,0x04,0xc6,0x02,0x07,0x05,0x04,0xc7,0x08,0x05,0x04,0xc7,0x07,0x05,0x02,0xc7,0x81,\n   0x08,0x05,0x04,0xc7,0x81,0x07,0x05,0x04,0xc7,0x82,0x08,0x05,0x04,0xc7,0x87,0x08,0x05,0x04,0xc8,0x00,0x08,0x05,0x04,0xc9,0x89,0x08,0x06,0x03,0xc9,0x00,0x09,0x06,\n   0x03,0xca,0x88,0x08,0x06,0x03,0xca,0x02,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x85,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0xff,0x09,\n   0x06,0x03,0xcb,0xa1,0x09,0x06,0x03,0xcb,0x01,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x86,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x82,0x08,0x06,0x03,0xca,\n   0x02,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x83,0x08,0x06,0x03,0xca,0x89,0x08,0x06,0x03,0xc9,0x00,0x08,0x05,0x04,0xc9,0x83,0x08,0x05,0x04,\n   0xc8,0x00,0x08,0x06,0x03,0xc8,0x82,0x08,0x05,0x04,0xc8,0x81,0x08,0x05,0x04,0xc7,0x81,0x07,0x05,0x04,0xc7,0x02,0x08,0x05,0x04,0xc7,0x07,0x05,0x04,0xc7,0x08,0x05,\n   0x04,0xc7,0x82,0x07,0x05,0x04,0xc7,0x81,0x07,0x05,0x04,0xc6,0x84,0x07,0x05,0x02,0xc5,0x00,0x07,0x04,0x03,0xc5,0x81,0x06,0x04,0x03,0xc4,0x03,0x07,0x04,0x03,0xc4,\n   0x06,0x04,0x03,0xc4,0x07,0x05,0x02,0xc4,0x07,0x04,0x03,0xc4,0x81,0x06,0x04,0x03,0xc4,0x81,0x06,0x04,0x03,0xc3,0x86,0x06,0x04,0x03,0xc2,0x81,0x05,0x04,0x03,0xc1,\n   0x81,0x05,0x04,0x03,0xc0,0x81,0x05,0x03,0x03,0xc0,0x81,0x05,0x03,0x02,0xc0,0x83,0x05,0x03,0x02,0xbf,0x02,0x04,0x03,0x02,0xbf,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,\n   0xbe,0x85,0x04,0x03,0x02,0xbd,0x82,0x04,0x02,0x02,0xbc,0x00,0x03,0x02,0x02,0xbc,0x82,0x03,0x02,0x02,0xbb,0x84,0x03,0x02,0x01,0xba,0x83,0x03,0x02,0x01,0xb9,0x81,\n   0x02,0x02,0x01,0xb9,0x83,0x02,0x01,0x01,0xb8,0x82,0x02,0x01,0x01,0xb7,0x00,0x01,0x01,0x01,0xb7,0x87,0x01,0x01,0x01,0xb6,0x00,0x01,0x01,0x00,0xb5,0x87,0x01,0x00,\n   0x00,0xb5,0x85,0x01,0x00,0x00,0xb4,0x8d,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x87,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0x99,0x00,0x00,0x00,0xb3,0x91,0x00,0x00,0x00,0xb4,0x81,0x01,0x00,0x00,0xb4,0x87,0x01,0x00,0x00,0xb5,0x00,0x01,0x01,0x00,0xb5,0x87,0x01,\n   0x01,0x01,0xb6,0x00,0x01,0x01,0x01,0xb7,0x82,0x02,0x01,0x01,0xb7,0x83,0x02,0x01,0x01,0xb8,0x00,0x02,0x02,0x01,0xb9,0x84,0x03,0x02,0x01,0xb9,0x84,0x03,0x02,0x01,\n   0xba,0x82,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x02,0xbc,0x82,0x04,0x02,0x02,0xbc,0x85,0x04,0x03,0x02,0xbd,0x01,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x82,0x04,\n   0x03,0x02,0xbf,0x81,0x05,0x03,0x02,0xbf,0x02,0x05,0x04,0x01,0xc0,0x05,0x03,0x02,0xc0,0x05,0x03,0x03,0xc0,0x82,0x05,0x04,0x03,0xc0,0x81,0x06,0x04,0x03,0xc1,0x86,\n   0x06,0x04,0x03,0xc2,0x81,0x06,0x04,0x03,0xc3,0x84,0x06,0x04,0x03,0xc4,0x03,0x07,0x04,0x03,0xc4,0x06,0x04,0x03,0xc4,0x07,0x04,0x03,0xc4,0x07,0x05,0x02,0xc4,0x82,\n   0x07,0x05,0x02,0xc5,0x00,0x07,0x05,0x02,0xc6,0x81,0x07,0x05,0x04,0xc6,0x00,0x08,0x05,0x04,0xc6,0x81,0x07,0x05,0x04,0xc7,0x87,0x08,0x05,0x04,0xc7,0x83,0x08,0x05,\n   0x04,0xc8,0x8b,0x08,0x06,0x03,0xc9,0x01,0x09,0x06,0x03,0xc9,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x84,0x08,0x06,0x03,0xca,0x81,\n   0x09,0x06,0x03,0xca,0x85,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,0xff,0x09,0x06,0x03,0xcb,0xa7,0x09,0x06,0x03,0xcb,0x81,0x09,0x06,0x03,0xca,0x81,0x08,0x06,\n   0x03,0xca,0x06,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x81,\n   0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,0x02,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x8c,0x08,0x06,0x03,0xc9,\n   0x83,0x08,0x05,0x04,0xc8,0x87,0x08,0x05,0x04,0xc7,0x81,0x07,0x05,0x04,0xc7,0x82,0x07,0x05,0x04,0xc6,0x00,0x07,0x05,0x02,0xc6,0x82,0x07,0x05,0x02,0xc5,0x83,0x06,\n   0x04,0x03,0xc4,0x02,0x07,0x05,0x02,0xc4,0x07,0x04,0x03,0xc4,0x06,0x04,0x03,0xc4,0x81,0x07,0x04,0x03,0xc4,0x81,0x06,0x04,0x03,0xc3,0x86,0x06,0x04,0x03,0xc2,0x81,\n   0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,0xc0,0x81,0x05,0x03,0x03,0xc0,0x81,0x05,0x03,0x02,0xc0,0x81,0x05,0x03,0x02,0xbf,0x82,0x04,0x03,0x02,0xbf,0x01,0x04,0x03,\n   0x02,0xbe,0x05,0x03,0x02,0xbe,0x85,0x04,0x03,0x02,0xbd,0x82,0x04,0x02,0x02,0xbc,0x00,0x03,0x02,0x02,0xbc,0x81,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x01,0xbb,0x84,\n   0x03,0x02,0x01,0xba,0x83,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x83,0x02,0x01,0x01,0xb8,0x82,0x02,0x01,0x01,0xb7,0x00,0x01,0x01,0x01,0xb7,0x87,0x01,0x01,\n   0x01,0xb6,0x00,0x01,0x01,0x00,0xb5,0x87,0x01,0x00,0x00,0xb5,0x81,0x01,0x00,0x00,0xb4,0x91,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0x87,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x9b,0x00,0x00,0x00,0xb3,0x8f,0x00,0x00,0x00,0xb4,0x81,0x01,0x00,0x00,0xb4,0x85,0x01,\n   0x00,0x00,0xb5,0x01,0x01,0x01,0x00,0xb5,0x01,0x00,0x00,0xb5,0x82,0x01,0x01,0x00,0xb5,0x86,0x01,0x01,0x01,0xb6,0x00,0x01,0x01,0x01,0xb7,0x84,0x02,0x01,0x01,0xb7,\n   0x81,0x02,0x01,0x01,0xb8,0x86,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x83,0x03,0x02,0x01,0xba,0x81,0x03,0x02,0x02,0xbb,0x86,0x04,0x02,0x02,0xbc,0x82,0x04,\n   0x03,0x02,0xbd,0x00,0x04,0x03,0x02,0xbe,0x82,0x05,0x03,0x02,0xbe,0x00,0x04,0x03,0x02,0xbf,0x81,0x05,0x03,0x02,0xbf,0x84,0x05,0x03,0x02,0xc0,0x01,0x05,0x03,0x03,\n   0xc0,0x05,0x04,0x03,0xc0,0x81,0x05,0x04,0x03,0xc1,0x87,0x06,0x04,0x03,0xc2,0x82,0x06,0x04,0x03,0xc3,0x81,0x07,0x04,0x03,0xc4,0x00,0x06,0x04,0x03,0xc4,0x84,0x07,\n   0x04,0x03,0xc5,0x81,0x07,0x05,0x02,0xc5,0x82,0x07,0x05,0x02,0xc6,0x83,0x07,0x05,0x04,0xc6,0x00,0x08,0x05,0x04,0xc6,0x81,0x07,0x05,0x04,0xc7,0x00,0x08,0x05,0x04,\n   0xc7,0x83,0x07,0x05,0x04,0xc7,0x00,0x08,0x05,0x04,0xc7,0x8e,0x08,0x05,0x04,0xc8,0x02,0x08,0x06,0x03,0xc8,0x08,0x05,0x04,0xc8,0x08,0x05,0x04,0xc9,0x87,0x08,0x06,\n   0x03,0xc9,0x00,0x08,0x06,0x03,0xca,0x82,0x09,0x06,0x03,0xca,0x04,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x08,0x06,0x03,\n   0xca,0x81,0x09,0x06,0x03,0xca,0x85,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,0x03,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,\n   0x03,0xca,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,0x84,0x08,0x06,0x03,0xca,0x06,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x08,0x06,0x03,\n   0xca,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x87,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,0x82,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,\n   0xca,0x81,0x08,0x06,0x03,0xca,0x02,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x84,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,0x88,0x08,0x06,\n   0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,\n   0x81,0x09,0x06,0x03,0xca,0x84,0x08,0x06,0x03,0xca,0x01,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,0x00,0x09,0x06,\n   0x03,0xca,0x81,0x08,0x06,0x03,0xca,0x82,0x09,0x06,0x03,0xca,0x84,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,\n   0x81,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,0x01,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x82,0x08,0x06,\n   0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x84,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x85,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,\n   0x00,0x09,0x06,0x03,0xca,0x8a,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x83,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x84,0x08,0x06,0x03,0xca,0x01,0x09,\n   0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,0x82,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x83,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,\n   0x82,0x08,0x06,0x03,0xca,0x01,0x08,0x06,0x03,0xc9,0x09,0x06,0x03,0xc9,0x85,0x08,0x06,0x03,0xc9,0x00,0x08,0x05,0x04,0xc9,0x90,0x08,0x05,0x04,0xc8,0x05,0x08,0x05,\n   0x04,0xc7,0x07,0x05,0x04,0xc7,0x08,0x05,0x04,0xc7,0x07,0x05,0x04,0xc7,0x07,0x05,0x02,0xc7,0x07,0x05,0x04,0xc7,0x81,0x08,0x05,0x04,0xc7,0x00,0x08,0x05,0x04,0xc6,\n   0x83,0x07,0x05,0x04,0xc6,0x82,0x07,0x05,0x02,0xc6,0x81,0x07,0x05,0x02,0xc5,0x84,0x07,0x04,0x03,0xc5,0x00,0x07,0x04,0x03,0xc4,0x81,0x06,0x04,0x03,0xc4,0x82,0x06,\n   0x04,0x03,0xc3,0x87,0x06,0x04,0x03,0xc2,0x03,0x06,0x04,0x03,0xc1,0x05,0x04,0x03,0xc1,0x05,0x04,0x03,0xc0,0x05,0x03,0x03,0xc0,0x84,0x05,0x03,0x02,0xc0,0x81,0x05,\n   0x03,0x02,0xbf,0x00,0x04,0x03,0x02,0xbf,0x81,0x04,0x03,0x02,0xbe,0x01,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x82,0x04,0x03,0x02,0xbd,0x84,0x04,0x02,0x02,0xbc,\n   0x01,0x04,0x03,0x02,0xbc,0x03,0x02,0x02,0xbc,0x81,0x03,0x02,0x02,0xbb,0x83,0x03,0x02,0x01,0xba,0x81,0x03,0x02,0x01,0xb9,0x85,0x02,0x02,0x01,0xb9,0x81,0x02,0x01,\n   0x01,0xb8,0x85,0x02,0x01,0x01,0xb7,0x86,0x01,0x01,0x01,0xb6,0x82,0x01,0x01,0x00,0xb5,0x87,0x01,0x00,0x00,0xb5,0x81,0x01,0x00,0x00,0xb4,0x8f,0x00,0x00,0x00,0xb4,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x89,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x9b,0x00,0x00,0x00,0xb3,0x91,0x00,\n   0x00,0x00,0xb4,0x81,0x01,0x00,0x00,0xb4,0x85,0x01,0x00,0x00,0xb5,0x85,0x01,0x01,0x00,0xb5,0x83,0x01,0x01,0x01,0xb6,0x00,0x01,0x01,0x01,0xb7,0x84,0x02,0x01,0x01,\n   0xb7,0x87,0x02,0x01,0x01,0xb8,0x81,0x02,0x02,0x01,0xb9,0x81,0x03,0x02,0x01,0xb9,0x83,0x03,0x02,0x01,0xba,0x84,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x02,0xbc,0x84,\n   0x04,0x02,0x02,0xbc,0x82,0x04,0x03,0x02,0xbd,0x83,0x04,0x03,0x02,0xbe,0x01,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x82,0x05,0x03,0x02,0xbf,0x83,0x05,0x03,0x02,\n   0xc0,0x81,0x05,0x03,0x03,0xc0,0x82,0x05,0x04,0x03,0xc0,0x81,0x05,0x04,0x03,0xc1,0x86,0x06,0x04,0x03,0xc2,0x81,0x06,0x04,0x03,0xc3,0x00,0x07,0x05,0x02,0xc4,0x82,\n   0x06,0x04,0x03,0xc4,0x02,0x07,0x04,0x03,0xc4,0x06,0x04,0x03,0xc4,0x07,0x04,0x03,0xc4,0x81,0x06,0x04,0x03,0xc4,0x89,0x07,0x05,0x02,0xc5,0x00,0x07,0x05,0x02,0xc6,\n   0x89,0x07,0x05,0x04,0xc6,0x00,0x07,0x05,0x02,0xc7,0x81,0x07,0x05,0x04,0xc7,0x02,0x07,0x05,0x02,0xc7,0x08,0x05,0x04,0xc7,0x07,0x05,0x02,0xc7,0x81,0x07,0x05,0x04,\n   0xc7,0x85,0x08,0x05,0x04,0xc7,0x88,0x08,0x05,0x04,0xc8,0x00,0x08,0x05,0x02,0xc8,0xb5,0x08,0x05,0x04,0xc8,0x00,0x08,0x06,0x03,0xc8,0x81,0x08,0x05,0x04,0xc8,0x00,\n   0x08,0x06,0x03,0xc8,0xbd,0x08,0x05,0x04,0xc8,0x00,0x08,0x06,0x03,0xc8,0xa7,0x08,0x05,0x04,0xc8,0x00,0x08,0x05,0x02,0xc8,0x83,0x08,0x05,0x04,0xc8,0x00,0x08,0x05,\n   0x02,0xc8,0x84,0x08,0x05,0x04,0xc8,0x01,0x08,0x05,0x02,0xc8,0x08,0x05,0x04,0xc8,0x85,0x08,0x05,0x04,0xc7,0x85,0x07,0x05,0x04,0xc7,0x81,0x08,0x05,0x04,0xc7,0x81,\n   0x07,0x05,0x04,0xc6,0x00,0x07,0x05,0x02,0xc6,0x86,0x07,0x05,0x04,0xc6,0x00,0x07,0x05,0x02,0xc6,0x88,0x07,0x05,0x02,0xc5,0x01,0x07,0x04,0x03,0xc5,0x07,0x04,0x03,\n   0xc4,0x87,0x06,0x04,0x03,0xc4,0x81,0x06,0x04,0x03,0xc3,0x86,0x06,0x04,0x03,0xc2,0x81,0x05,0x04,0x03,0xc1,0x82,0x05,0x04,0x03,0xc0,0x81,0x05,0x03,0x03,0xc0,0x83,\n   0x05,0x03,0x02,0xc0,0x81,0x05,0x03,0x02,0xbf,0x00,0x04,0x03,0x02,0xbf,0x85,0x04,0x03,0x02,0xbe,0x82,0x04,0x03,0x02,0xbd,0x83,0x04,0x02,0x02,0xbc,0x01,0x03,0x02,\n   0x02,0xbc,0x04,0x02,0x02,0xbc,0x84,0x03,0x02,0x02,0xbb,0x83,0x03,0x02,0x01,0xba,0x00,0x03,0x02,0x01,0xb9,0x82,0x02,0x02,0x01,0xb9,0x87,0x02,0x01,0x01,0xb8,0x85,\n   0x02,0x01,0x01,0xb7,0x83,0x01,0x01,0x01,0xb6,0x85,0x01,0x01,0x00,0xb5,0x85,0x01,0x00,0x00,0xb5,0x81,0x01,0x00,0x00,0xb4,0x91,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x89,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x9d,0x00,0x00,0x00,0xb3,0x8f,0x00,0x00,0x00,0xb4,\n   0x87,0x01,0x00,0x00,0xb4,0x83,0x01,0x00,0x00,0xb5,0x86,0x01,0x01,0x00,0xb5,0x84,0x01,0x01,0x01,0xb6,0x00,0x01,0x01,0x01,0xb7,0x86,0x02,0x01,0x01,0xb7,0x84,0x02,\n   0x01,0x01,0xb8,0x01,0x02,0x02,0x01,0xb9,0x03,0x02,0x01,0xb9,0x83,0x03,0x02,0x01,0xba,0x85,0x03,0x02,0x02,0xbb,0x01,0x03,0x02,0x02,0xbc,0x04,0x03,0x02,0xbc,0x81,\n   0x04,0x02,0x02,0xbc,0x01,0x04,0x03,0x02,0xbc,0x04,0x02,0x02,0xbc,0x85,0x04,0x03,0x02,0xbd,0x88,0x04,0x03,0x02,0xbe,0x82,0x05,0x03,0x02,0xbf,0x81,0x05,0x03,0x02,\n   0xc0,0x03,0x05,0x03,0x03,0xc0,0x05,0x04,0x03,0xc0,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,0xc1,0x00,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,\n   0xc1,0x8a,0x06,0x04,0x03,0xc2,0x87,0x06,0x04,0x03,0xc3,0x84,0x06,0x04,0x03,0xc4,0x00,0x07,0x04,0x03,0xc4,0x81,0x06,0x04,0x03,0xc4,0x89,0x07,0x04,0x03,0xc5,0x9f,\n   0x07,0x05,0x02,0xc5,0xff,0x07,0x05,0x02,0xc6,0x83,0x07,0x05,0x02,0xc6,0x9f,0x07,0x05,0x02,0xc5,0x83,0x07,0x04,0x03,0xc5,0x00,0x07,0x05,0x02,0xc5,0x84,0x07,0x04,\n   0x03,0xc5,0x87,0x06,0x04,0x03,0xc4,0x00,0x06,0x05,0x02,0xc3,0x86,0x06,0x04,0x03,0xc3,0x8a,0x06,0x04,0x03,0xc2,0x00,0x06,0x04,0x03,0xc1,0x83,0x05,0x04,0x03,0xc1,\n   0x81,0x06,0x04,0x03,0xc1,0x01,0x05,0x04,0x03,0xc0,0x05,0x03,0x03,0xc0,0x81,0x05,0x03,0x02,0xc0,0x81,0x05,0x03,0x02,0xbf,0x00,0x04,0x03,0x02,0xbf,0x83,0x04,0x03,\n   0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,0x83,0x04,0x03,0x02,0xbe,0x85,0x04,0x03,0x02,0xbd,0x85,0x04,0x02,0x02,0xbc,0x85,0x03,0x02,0x02,0xbb,0x83,0x03,0x02,0x01,0xba,\n   0x01,0x03,0x02,0x01,0xb9,0x02,0x02,0x01,0xb9,0x84,0x02,0x01,0x01,0xb8,0x86,0x02,0x01,0x01,0xb7,0x00,0x01,0x01,0x01,0xb7,0x84,0x01,0x01,0x01,0xb6,0x86,0x01,0x01,\n   0x00,0xb5,0x83,0x01,0x00,0x00,0xb5,0x87,0x01,0x00,0x00,0xb4,0x8f,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x8b,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa2,0x00,0x00,0x00,0xb3,0x92,0x00,0x00,0x00,0xb4,0x83,0x01,0x00,0x00,0xb4,0x00,0x01,0x00,0x00,0xb5,0x85,0x01,\n   0x01,0x00,0xb5,0x88,0x01,0x01,0x01,0xb6,0x83,0x01,0x01,0x01,0xb7,0x85,0x02,0x01,0x01,0xb7,0x82,0x02,0x01,0x01,0xb8,0x82,0x02,0x02,0x01,0xb9,0x82,0x03,0x02,0x01,\n   0xb9,0x82,0x03,0x02,0x01,0xba,0x88,0x03,0x02,0x02,0xbb,0x83,0x04,0x02,0x02,0xbc,0x8a,0x04,0x03,0x02,0xbd,0x00,0x04,0x03,0x02,0xbe,0x81,0x05,0x03,0x02,0xbe,0x00,\n   0x04,0x03,0x02,0xbe,0x87,0x05,0x03,0x02,0xbf,0x81,0x05,0x03,0x02,0xc0,0x86,0x05,0x03,0x03,0xc0,0x00,0x05,0x04,0x03,0xc0,0x81,0x05,0x04,0x03,0xc1,0x00,0x05,0x04,\n   0x01,0xc1,0x82,0x05,0x04,0x03,0xc1,0x00,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,0xc1,0xa0,0x06,0x04,0x03,0xc2,0xcf,0x06,0x04,0x03,0xc3,0x00,0x06,0x05,0x02,0xc3,\n   0xd0,0x06,0x04,0x03,0xc3,0xa0,0x06,0x04,0x03,0xc2,0x83,0x05,0x04,0x03,0xc1,0x00,0x06,0x04,0x03,0xc1,0x83,0x05,0x04,0x03,0xc1,0x00,0x05,0x04,0x01,0xc0,0x86,0x05,\n   0x03,0x03,0xc0,0x81,0x05,0x03,0x02,0xc0,0x86,0x05,0x03,0x02,0xbf,0x00,0x04,0x03,0x02,0xbf,0x83,0x04,0x03,0x02,0xbe,0x8a,0x04,0x03,0x02,0xbd,0x82,0x04,0x02,0x02,\n   0xbc,0x00,0x03,0x02,0x02,0xbc,0x85,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x01,0xbb,0x81,0x03,0x02,0x02,0xbb,0x82,0x03,0x02,0x01,0xba,0x83,0x03,0x02,0x01,0xb9,0x81,\n   0x02,0x02,0x01,0xb9,0x82,0x02,0x01,0x01,0xb8,0x86,0x02,0x01,0x01,0xb7,0x82,0x01,0x01,0x01,0xb7,0x88,0x01,0x01,0x01,0xb6,0x85,0x01,0x01,0x00,0xb5,0x00,0x01,0x00,\n   0x00,0xb5,0x83,0x01,0x00,0x00,0xb4,0x92,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x90,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xa6,0x00,0x00,0x00,0xb3,0x8e,0x00,0x00,0x00,0xb4,0x82,0x01,0x00,0x00,0xb4,0x87,0x01,0x00,0x00,0xb5,0x86,0x01,0x01,0x00,0xb5,0x87,0x01,\n   0x01,0x01,0xb6,0x86,0x02,0x01,0x01,0xb7,0x86,0x02,0x01,0x01,0xb8,0x01,0x02,0x02,0x01,0xb8,0x02,0x01,0x01,0xb8,0x81,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,\n   0x88,0x03,0x02,0x01,0xba,0x85,0x03,0x02,0x02,0xbb,0x02,0x03,0x02,0x01,0xbb,0x04,0x02,0x02,0xbc,0x03,0x02,0x02,0xbc,0x85,0x04,0x02,0x02,0xbc,0x89,0x04,0x03,0x02,\n   0xbd,0x8d,0x04,0x03,0x02,0xbe,0x00,0x04,0x03,0x02,0xbf,0x89,0x05,0x03,0x02,0xbf,0x8c,0x05,0x03,0x02,0xc0,0x90,0x05,0x03,0x03,0xc0,0x00,0x05,0x04,0x03,0xc0,0x87,\n   0x05,0x03,0x03,0xc0,0x83,0x05,0x04,0x03,0xc0,0x02,0x05,0x04,0x01,0xc0,0x05,0x04,0x03,0xc0,0x05,0x04,0x01,0xc0,0x88,0x05,0x04,0x03,0xc0,0x00,0x05,0x04,0x01,0xc0,\n   0x86,0x05,0x04,0x03,0xc0,0x00,0x05,0x04,0x01,0xc0,0x8e,0x05,0x04,0x03,0xc0,0x00,0x05,0x04,0x01,0xc0,0xa1,0x05,0x04,0x03,0xc0,0x00,0x05,0x04,0x01,0xc0,0x98,0x05,\n   0x04,0x03,0xc0,0x00,0x05,0x04,0x01,0xc0,0x92,0x05,0x04,0x03,0xc0,0x00,0x05,0x04,0x01,0xc0,0x8d,0x05,0x04,0x03,0xc0,0x99,0x05,0x03,0x03,0xc0,0x8c,0x05,0x03,0x02,\n   0xc0,0x8a,0x05,0x03,0x02,0xbf,0x02,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x81,0x05,0x03,0x02,0xbe,0x00,0x04,0x03,0x02,0xbe,0x83,0x05,0x03,\n   0x02,0xbe,0x01,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x81,0x04,0x03,0x02,0xbe,0x89,0x04,0x03,0x02,0xbd,0x85,0x04,0x02,0x02,0xbc,0x81,0x03,0x02,0x02,0xbc,0x86,\n   0x03,0x02,0x02,0xbb,0x88,0x03,0x02,0x01,0xba,0x81,0x03,0x02,0x01,0xb9,0x00,0x02,0x02,0x01,0xb9,0x88,0x02,0x01,0x01,0xb8,0x85,0x02,0x01,0x01,0xb7,0x00,0x01,0x01,\n   0x01,0xb7,0x87,0x01,0x01,0x01,0xb6,0x86,0x01,0x01,0x00,0xb5,0x87,0x01,0x00,0x00,0xb5,0x82,0x01,0x00,0x00,0xb4,0x8e,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0x94,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa6,0x00,0x00,0x00,0xb3,0x91,0x00,0x00,0x00,0xb4,0x85,0x01,\n   0x00,0x00,0xb4,0x88,0x01,0x00,0x00,0xb5,0x81,0x01,0x01,0x00,0xb5,0x8c,0x01,0x01,0x01,0xb6,0x00,0x01,0x01,0x01,0xb7,0x87,0x02,0x01,0x01,0xb7,0x89,0x02,0x01,0x01,\n   0xb8,0x85,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x8b,0x03,0x02,0x01,0xba,0x89,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x02,0xbc,0x8c,0x04,0x02,0x02,0xbc,0xaf,\n   0x04,0x03,0x02,0xbd,0x83,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,0x88,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,0x83,0x04,0x03,0x02,0xbe,0x02,0x05,0x03,\n   0x02,0xbe,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x84,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,0x81,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,0x83,0x04,\n   0x03,0x02,0xbe,0x04,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x88,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,\n   0x02,0xbe,0x82,0x04,0x03,0x02,0xbe,0x04,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x81,0x04,0x03,0x02,\n   0xbe,0x00,0x05,0x03,0x02,0xbe,0x82,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,0x82,0x04,0x03,0x02,0xbe,0x81,0x05,0x03,0x02,0xbe,0x82,0x04,0x03,0x02,0xbe,0x81,\n   0x05,0x03,0x02,0xbe,0x81,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,0x82,0x04,0x03,0x02,0xbe,0x81,0x05,0x03,0x02,0xbe,0x81,0x04,0x03,0x02,0xbe,0x81,0x05,0x03,\n   0x02,0xbe,0x85,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,0x82,0x04,0x03,0x02,0xbe,0x81,0x05,0x03,0x02,0xbe,0x85,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,\n   0x86,0x04,0x03,0x02,0xbe,0x02,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x81,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,0x85,0x04,0x03,0x02,\n   0xbe,0x81,0x05,0x03,0x02,0xbe,0x03,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x84,0x04,0x03,0x02,0xbe,0xaf,0x04,0x03,0x02,\n   0xbd,0x8a,0x04,0x02,0x02,0xbc,0x00,0x04,0x03,0x02,0xbc,0x81,0x04,0x02,0x02,0xbc,0x86,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x01,0xbb,0x81,0x03,0x02,0x02,0xbb,0x8b,\n   0x03,0x02,0x01,0xba,0x00,0x03,0x02,0x01,0xb9,0x85,0x02,0x02,0x01,0xb9,0x89,0x02,0x01,0x01,0xb8,0x87,0x02,0x01,0x01,0xb7,0x00,0x01,0x01,0x01,0xb7,0x8c,0x01,0x01,\n   0x01,0xb6,0x81,0x01,0x01,0x00,0xb5,0x88,0x01,0x00,0x00,0xb5,0x85,0x01,0x00,0x00,0xb4,0x91,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0x94,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa8,0x00,0x00,0x00,0xb3,0x95,0x00,0x00,0x00,0xb4,0x83,0x01,0x00,0x00,0xb4,0x81,0x00,\n   0x00,0x00,0xb4,0x81,0x01,0x00,0x00,0xb4,0x00,0x01,0x00,0x00,0xb5,0x8c,0x01,0x01,0x00,0xb5,0x87,0x01,0x01,0x01,0xb6,0x01,0x02,0x01,0x01,0xb7,0x01,0x01,0x01,0xb7,\n   0x8c,0x02,0x01,0x01,0xb7,0x83,0x02,0x01,0x01,0xb8,0x00,0x02,0x02,0x01,0xb8,0x87,0x02,0x01,0x01,0xb8,0x83,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x9b,0x03,\n   0x02,0x01,0xba,0xa0,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x01,0xbb,0x8f,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x01,0xbb,0x8c,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x02,\n   0xbc,0x96,0x04,0x02,0x02,0xbc,0x00,0x04,0x03,0x02,0xbc,0xb0,0x04,0x02,0x02,0xbc,0x00,0x04,0x03,0x02,0xbc,0x92,0x04,0x02,0x02,0xbc,0x82,0x03,0x02,0x02,0xbb,0x00,\n   0x03,0x02,0x01,0xbb,0x8e,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x01,0xbb,0x82,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x01,0xbb,0xa2,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,\n   0x01,0xbb,0x83,0x03,0x02,0x02,0xbb,0x9b,0x03,0x02,0x01,0xba,0x00,0x03,0x02,0x01,0xb9,0x83,0x02,0x02,0x01,0xb9,0x8c,0x02,0x01,0x01,0xb8,0x8e,0x02,0x01,0x01,0xb7,\n   0x87,0x01,0x01,0x01,0xb6,0x8c,0x01,0x01,0x00,0xb5,0x00,0x01,0x00,0x00,0xb5,0x81,0x01,0x00,0x00,0xb4,0x81,0x00,0x00,0x00,0xb4,0x83,0x01,0x00,0x00,0xb4,0x95,0x00,\n   0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x96,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb1,0x00,0x00,0x00,\n   0xb3,0x99,0x00,0x00,0x00,0xb4,0x87,0x01,0x00,0x00,0xb4,0x86,0x01,0x00,0x00,0xb5,0x81,0x01,0x01,0x00,0xb5,0x8e,0x01,0x01,0x01,0xb6,0x81,0x01,0x01,0x01,0xb7,0x01,\n   0x02,0x01,0x01,0xb7,0x01,0x01,0x01,0xb7,0x8a,0x02,0x01,0x01,0xb7,0x92,0x02,0x01,0x01,0xb8,0x02,0x02,0x02,0x01,0xb8,0x02,0x01,0x01,0xb8,0x02,0x02,0x01,0xb8,0x89,\n   0x02,0x01,0x01,0xb8,0x82,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x89,0x02,0x02,0x01,0xb9,0x81,0x03,0x02,0x01,0xb9,0xff,0x03,0x02,0x01,0xba,0xbb,0x03,0x02,\n   0x01,0xba,0x81,0x03,0x02,0x01,0xb9,0x82,0x02,0x02,0x01,0xb9,0x81,0x03,0x02,0x01,0xb9,0x01,0x02,0x02,0x01,0xb9,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x82,\n   0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x9f,0x02,0x01,0x01,0xb8,0x8a,0x02,0x01,0x01,0xb7,0x03,0x01,0x01,0x01,0xb7,0x02,0x01,0x01,0xb7,0x01,0x01,0x01,0xb7,\n   0x02,0x01,0x01,0xb7,0x8e,0x01,0x01,0x01,0xb6,0x81,0x01,0x01,0x00,0xb5,0x86,0x01,0x00,0x00,0xb5,0x87,0x01,0x00,0x00,0xb4,0x99,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x9f,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb9,0x00,0x00,0x00,0xb3,0x99,0x00,0x00,0x00,0xb4,\n   0x88,0x01,0x00,0x00,0xb4,0x87,0x01,0x00,0x00,0xb5,0x89,0x01,0x01,0x00,0xb5,0x96,0x01,0x01,0x01,0xb6,0x01,0x02,0x01,0x01,0xb7,0x01,0x01,0x01,0xb7,0x9f,0x02,0x01,\n   0x01,0xb7,0xff,0x02,0x01,0x01,0xb8,0xc1,0x02,0x01,0x01,0xb8,0x9f,0x02,0x01,0x01,0xb7,0x01,0x01,0x01,0x01,0xb7,0x02,0x01,0x01,0xb7,0x96,0x01,0x01,0x01,0xb6,0x89,\n   0x01,0x01,0x00,0xb5,0x87,0x01,0x00,0x00,0xb5,0x88,0x01,0x00,0x00,0xb4,0x99,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa7,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x9c,0x00,0x00,0x00,0xb4,0x8c,0x01,0x00,0x00,0xb4,0x8f,0x01,0x00,0x00,0xb5,\n   0x89,0x01,0x01,0x00,0xb5,0xd1,0x01,0x01,0x01,0xb6,0x81,0x01,0x01,0x01,0xb7,0xe1,0x02,0x01,0x01,0xb7,0x81,0x01,0x01,0x01,0xb7,0xd1,0x01,0x01,0x01,0xb6,0x89,0x01,\n   0x01,0x00,0xb5,0x88,0x01,0x00,0x00,0xb5,0x02,0x01,0x01,0x00,0xb5,0x01,0x00,0x00,0xb5,0x01,0x01,0x00,0xb5,0x83,0x01,0x00,0x00,0xb5,0x8c,0x01,0x00,0x00,0xb4,0x9c,\n   0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xad,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc7,0x00,0x00,\n   0x00,0xb3,0xa1,0x00,0x00,0x00,0xb4,0x93,0x01,0x00,0x00,0xb4,0x86,0x01,0x00,0x00,0xb5,0x00,0x01,0x01,0x00,0xb5,0x9e,0x01,0x00,0x00,0xb5,0xff,0x01,0x01,0x00,0xb5,\n   0xc7,0x01,0x01,0x00,0xb5,0x87,0x01,0x00,0x00,0xb5,0x00,0x01,0x01,0x00,0xb5,0x81,0x01,0x00,0x00,0xb5,0x00,0x01,0x01,0x00,0xb5,0x9a,0x01,0x00,0x00,0xb5,0x93,0x01,\n   0x00,0x00,0xb4,0xa1,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb5,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xd2,0x00,0x00,0x00,0xb3,0x87,0x00,0x00,0x00,0xb4,0x83,0x00,0x00,0x00,0xb3,0x9e,0x00,0x00,0x00,0xb4,0x91,0x01,0x00,0x00,0xb4,0x94,0x00,0x00,0x00,0xb4,0x8e,\n   0x01,0x00,0x00,0xb4,0x87,0x01,0x00,0x00,0xb5,0x00,0x01,0x01,0x00,0xb5,0x9a,0x01,0x00,0x00,0xb5,0xe1,0x01,0x00,0x00,0xb4,0x01,0x01,0x00,0x00,0xb5,0x01,0x01,0x00,\n   0xb5,0x9b,0x01,0x00,0x00,0xb5,0x00,0x01,0x01,0x00,0xb5,0x84,0x01,0x00,0x00,0xb5,0x8e,0x01,0x00,0x00,0xb4,0x94,0x00,0x00,0x00,0xb4,0x91,0x01,0x00,0x00,0xb4,0x9e,\n   0x00,0x00,0x00,0xb4,0x83,0x00,0x00,0x00,0xb3,0x87,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc0,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xeb,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb4,0xb9,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xd9,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb4,0xff,0x00,\n   0x00,0x00,0xb4,0x93,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xec,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfc,0x00,0x00,0x00,0xb3,\n   0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfa,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,\n   0x83,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf9,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x85,\n   0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfb,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfa,0x00,0x00,0x00,0xb3,0x02,0xa0,0xa0,0xa0,0xd1,0xff,0xff,0xff,0xff,0xbb,0xbb,\n   0xbb,0xdc,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xfb,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x86,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,\n   0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x8d,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0xc2,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,\n   0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,\n   0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x8b,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x86,0x00,0x00,0x00,0xb3,0x00,0x52,\n   0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x8b,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x84,\n   0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x92,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,\n   0xeb,0x52,0x52,0x52,0xbd,0x95,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0xa7,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,0x02,0xef,\n   0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x82,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xc7,0xc7,\n   0xc7,0xe1,0x83,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,\n   0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,\n   0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x88,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,\n   0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,\n   0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0x00,0x00,\n   0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,\n   0xc2,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,\n   0xe6,0x82,0xff,0xff,0xff,0xff,0x04,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,\n   0x01,0xc7,0xc7,0xc7,0xe1,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,\n   0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x00,\n   0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0x83,0xff,0xff,0xff,0xff,0x06,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,\n   0xbd,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,\n   0x04,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0x83,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,\n   0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,0xc7,0xdc,0xdc,0xdc,0xeb,0xff,0xff,\n   0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,\n   0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x05,0x90,0x90,0x90,0xcc,0xe6,\n   0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,\n   0xc2,0xdc,0xdc,0xdc,0xeb,0x83,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,\n   0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x87,0x00,\n   0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,\n   0x03,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x85,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,\n   0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,0x03,0x00,\n   0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,\n   0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0xff,0xff,0xff,0xff,0x03,\n   0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x85,0x00,0x00,\n   0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,\n   0xe1,0x82,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,\n   0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x87,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0xb3,\n   0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,\n   0xe6,0xf0,0x81,0x90,0x90,0x90,0xcc,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,\n   0xdc,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,\n   0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,\n   0xbd,0x82,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,\n   0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x6a,\n   0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x07,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,\n   0xb8,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,\n   0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x05,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xa0,\n   0xa0,0xa0,0xd1,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,0xaf,0xaf,0xaf,\n   0xd6,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,\n   0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xa0,\n   0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x06,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xd2,\n   0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x90,0x90,0x90,0xcc,0x00,0xe6,\n   0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0x7e,0x7e,\n   0x7e,0xc7,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0x90,0x90,0x90,0xcc,0x84,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,\n   0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x83,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x83,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0xaf,0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,\n   0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x06,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x82,\n   0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x06,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xff,\n   0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,\n   0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x06,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0xff,\n   0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,\n   0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x04,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xf7,\n   0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x82,\n   0x00,0x00,0x00,0xb3,0x02,0xa0,0xa0,0xa0,0xd1,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,\n   0x01,0x52,0x52,0x52,0xbd,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0x00,0x00,\n   0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xc7,0xc7,\n   0xc7,0xe1,0xff,0xff,0xff,0xff,0xd2,0xd2,0xd2,0xe6,0x84,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x0e,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,\n   0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x02,0xa0,0xa0,0xa0,0xd1,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,\n   0x81,0xf7,0xf7,0xf7,0xfa,0x03,0xff,0xff,0xff,0xff,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,\n   0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8b,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,\n   0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x09,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,\n   0xbb,0xbb,0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x09,\n   0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,\n   0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x09,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,\n   0xff,0xff,0xff,0xff,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,\n   0x85,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,\n   0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x83,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x85,0x00,0x00,\n   0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,\n   0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,\n   0x81,0xff,0xff,0xff,0xff,0x09,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xbb,0xbb,\n   0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xf7,0xf7,0xf7,0xfa,0x85,0xff,0xff,0xff,\n   0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x83,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,\n   0xd1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x81,0xc7,0xc7,0xc7,0xe1,0x03,0xff,0xff,0xff,\n   0xff,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,\n   0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,\n   0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,\n   0xf5,0x82,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x87,0x00,\n   0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0x52,0x52,0x52,0xbd,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,\n   0xff,0xff,0xff,0x03,0x52,0x52,0x52,0xbd,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,\n   0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0x52,0x52,0x52,0xbd,0xbb,0xbb,\n   0xbb,0xdc,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,\n   0x6a,0xc2,0x84,0x00,0x00,0x00,0xb3,0x03,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x05,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,\n   0x81,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,\n   0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,\n   0xb3,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xa0,0xa0,0xa0,0xd1,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x02,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xaf,\n   0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0x52,0x52,0x52,0xbd,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,\n   0xff,0xff,0x00,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x6a,\n   0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,\n   0xb3,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xa0,0xa0,0xa0,0xd1,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf3,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,\n   0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xbb,0xbb,0xbb,\n   0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x04,0xf7,0xf7,\n   0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x05,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,\n   0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,\n   0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x81,0xff,\n   0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0x33,0x33,\n   0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,\n   0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,\n   0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x05,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,\n   0xc7,0xe1,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,\n   0xfa,0x81,0xff,0xff,0xff,0xff,0x05,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,\n   0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,\n   0xeb,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,\n   0xff,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,\n   0xc7,0x82,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,\n   0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xaf,0xaf,0xaf,0xd6,0x01,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,\n   0xdc,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xf3,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x03,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,\n   0xff,0xd2,0xd2,0xd2,0xe6,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x85,0xff,0xff,\n   0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x82,0xff,0xff,0xff,0xff,0x85,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x03,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xa0,0xa0,0xa0,0xd1,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x03,0xe6,0xe6,\n   0xe6,0xf0,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,\n   0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x02,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0x00,0x00,0x00,0xb3,0x01,0x33,\n   0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,\n   0x01,0xe6,0xe6,0xe6,0xf0,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0xff,0xff,\n   0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x86,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x85,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0xc7,\n   0xc7,0xc7,0xe1,0x85,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,\n   0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,\n   0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,\n   0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x84,0xff,\n   0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,\n   0xe1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,\n   0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,\n   0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,\n   0xeb,0x0b,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,\n   0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,\n   0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,\n   0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,\n   0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,\n   0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,\n   0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,\n   0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x06,0x6a,0x6a,0x6a,0xc2,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,\n   0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,\n   0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x06,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,\n   0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,\n   0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,0x04,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,\n   0xeb,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x03,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xef,0xef,0xef,0xf5,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x05,0xbb,0xbb,0xbb,0xdc,0x90,0x90,0x90,0xcc,0xef,\n   0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0xa0,0xa0,0xa0,0xd1,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,\n   0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0x6a,0x6a,\n   0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0xa0,0xa0,0xa0,0xd1,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x82,0x00,\n   0x00,0x00,0xb3,0x05,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,\n   0xeb,0x82,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xf6,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0xbe,0x00,0x00,0x00,0xb3,0x03,0x90,0x90,0x90,0xcc,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0xab,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,\n   0xb8,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x91,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,\n   0xf0,0x83,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xf6,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xbf,0x00,0x00,0x00,0xb3,0x02,\n   0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xa0,0xa0,0xa0,0xd1,0xaa,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,\n   0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x90,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xf6,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xbf,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,\n   0xd6,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0xaa,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x90,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,\n   0x83,0xdc,0xdc,0xdc,0xeb,0x00,0x52,0x52,0x52,0xbd,0x83,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x83,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0xf6,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xbf,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0xaa,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0x90,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf9,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,\n   0x81,0xaf,0xaf,0xaf,0xd6,0xc0,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0x90,0x90,0x90,0xcc,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x03,0x00,\n   0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x8a,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x52,\n   0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,\n   0x7e,0x7e,0x7e,0xc7,0x9e,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x52,0x52,0x52,0xbd,0x8d,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,\n   0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x88,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x9e,0x00,0x00,0x00,0xb3,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x84,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x8b,0x00,0x00,0x00,\n   0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x9a,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,\n   0x6a,0xc2,0x85,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,\n   0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x84,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,\n   0x52,0x52,0x52,0xbd,0x8f,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0x85,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xe6,0xe6,0xe6,0xf0,0x81,\n   0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0x83,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0x82,\n   0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x04,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x6a,\n   0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,\n   0x01,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x01,\n   0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0x83,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x82,\n   0xff,0xff,0xff,0xff,0x04,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x05,0xdc,\n   0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x84,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,\n   0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,\n   0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,\n   0xb3,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x83,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x03,0x90,0x90,0x90,0xcc,0xf7,0xf7,0xf7,\n   0xfa,0xef,0xef,0xef,0xf5,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,0x7e,\n   0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x05,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x84,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,\n   0x6a,0x6a,0x6a,0xc2,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x85,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x85,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,\n   0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x84,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x85,\n   0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,\n   0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x84,0xff,0xff,0xff,\n   0xff,0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x09,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xef,0xef,\n   0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x83,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,\n   0xdc,0xeb,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x85,0xff,0xff,0xff,0xff,0x03,\n   0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,\n   0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x06,0xf7,0xf7,0xf7,0xfa,0xa0,\n   0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,\n   0xe6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x90,0x90,0x90,0xcc,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,\n   0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,\n   0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x07,0xef,0xef,0xef,0xf5,0xff,0xff,\n   0xff,0xff,0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xbb,0xbb,0xbb,0xdc,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xd2,\n   0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x03,0xa0,0xa0,0xa0,0xd1,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,\n   0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x04,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,\n   0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0x7e,0x7e,0x7e,0xc7,0xbb,0xbb,0xbb,0xdc,0xe6,\n   0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0x00,0x00,0x00,0xb3,\n   0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,\n   0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x04,0xef,\n   0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,\n   0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,\n   0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x85,0xaf,0xaf,0xaf,0xd6,\n   0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x7e,0x7e,0x7e,0xc7,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,\n   0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,\n   0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0xaf,0xaf,0xaf,0xd6,0x05,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,\n   0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x6a,0x6a,0x6a,0xc2,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,\n   0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,\n   0x00,0x00,0x00,0xb3,0x04,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,\n   0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0x52,0x52,0x52,0xbd,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x04,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,0x7e,\n   0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x84,0xff,0xff,0xff,0xff,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,\n   0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x87,0xff,0xff,0xff,\n   0xff,0x02,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x85,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,\n   0xaf,0xd6,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,\n   0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x82,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,\n   0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,\n   0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x03,0xef,0xef,0xef,0xf5,\n   0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,\n   0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x05,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,\n   0xbb,0xbb,0xdc,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,\n   0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x88,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,\n   0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x7e,0x7e,0x7e,0xc7,0x02,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x82,0x00,0x00,0x00,0xb3,\n   0x01,0x52,0x52,0x52,0xbd,0x90,0x90,0x90,0xcc,0x81,0xaf,0xaf,0xaf,0xd6,0x04,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,\n   0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,\n   0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0x90,0x90,0x90,0xcc,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x84,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,\n   0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,\n   0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x06,\n   0x52,0x52,0x52,0xbd,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,\n   0xff,0x05,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xbb,0xbb,\n   0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x03,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x04,0xdc,0xdc,\n   0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,\n   0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x04,0xc7,0xc7,0xc7,0xe1,\n   0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x85,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,\n   0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,\n   0xd1,0x85,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x09,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,\n   0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,\n   0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x01,0x00,0x00,0x00,0xb3,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x86,\n   0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xaf,0xaf,0xaf,0xd6,0x06,0x52,0x52,0x52,0xbd,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,\n   0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x01,\n   0x6a,0x6a,0x6a,0xc2,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x06,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0xaf,0xaf,\n   0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x03,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x03,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,\n   0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xdc,\n   0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xc7,0xc7,0xc7,0xe1,\n   0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x83,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x84,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,\n   0xe6,0xf0,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x85,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,\n   0x85,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x82,0xff,\n   0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x85,0xff,0xff,0xff,0xff,0x02,\n   0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x85,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xaf,0xaf,\n   0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,\n   0x00,0xc7,0xc7,0xc7,0xe1,0x85,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,\n   0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,\n   0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,\n   0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x04,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,\n   0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0xff,0xff,0xff,0xff,0x01,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x86,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,\n   0x84,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x04,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,\n   0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,\n   0xff,0x00,0xa0,0xa0,0xa0,0xd1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x82,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xfe,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,\n   0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,\n   0x00,0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x0a,\n   0x6a,0x6a,0x6a,0xc2,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,\n   0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,\n   0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x06,0x6a,0x6a,0x6a,0xc2,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x33,0x33,\n   0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x04,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,\n   0xeb,0x02,0x7e,0x7e,0x7e,0xc7,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,\n   0xef,0xf5,0x81,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xa0,\n   0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x03,0x7e,0x7e,0x7e,0xc7,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xdc,\n   0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x04,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,\n   0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x83,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,\n   0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x7e,\n   0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0xaf,0xaf,0xaf,\n   0xd6,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x0b,0xbb,0xbb,0xbb,0xdc,\n   0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,\n   0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x06,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,\n   0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xd2,0xd2,0xd2,0xe6,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x08,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,\n   0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,\n   0xe6,0xf0,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,\n   0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,\n   0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0xa0,0xa0,0xa0,0xd1,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x81,0x00,\n   0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x82,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,\n   0xbd,0x6a,0x6a,0x6a,0xc2,0xad,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x94,0x00,0x00,0x00,0xb3,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x9f,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x9a,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xaf,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa1,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x83,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0xac,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x94,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x9f,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x9a,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xaf,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,\n   0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa0,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x83,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0xac,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xaf,0xaf,0xaf,0xd6,0x92,0x00,\n   0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x52,0x52,0x52,0xbd,0x9f,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x9a,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,\n   0x7e,0xc7,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xaf,0x00,0x00,0x00,0xb3,\n   0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa0,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x05,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,\n   0xf5,0xf7,0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,0xad,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xb6,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x9a,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x87,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xb6,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,\n   0xff,0xff,0xaf,0xaf,0xaf,0xd6,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa0,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x83,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x7e,0x7e,0x7e,0xc7,0xb2,0x00,0x00,\n   0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xbb,0xbb,0xbb,0xdc,0xb6,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,\n   0xaf,0xaf,0xaf,0xd6,0x9a,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0x87,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xda,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa7,0x00,0x00,0x00,\n   0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0x97,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,\n   0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb8,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xe4,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xbe,0x00,0x00,0x00,0xb3,0x00,0xf7,\n   0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0xb4,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xdd,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb6,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xe4,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,\n   0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xbe,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xb3,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xdd,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xe4,0x00,0x00,0x00,0xb3,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xbe,0x00,0x00,0x00,0xb3,0x05,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,\n   0xc2,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xd2,0xd2,0xd2,0xe6,0xb3,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xdd,0x00,0x00,0x00,\n   0xb3,0x81,0x33,0x33,0x33,0xb8,0x01,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xb5,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xaa,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,\n   0x52,0x52,0x52,0xbd,0x97,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x90,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,\n   0x00,0x33,0x33,0x33,0xb8,0x94,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x91,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,\n   0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x88,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x9c,0x00,0x00,0x00,0xb3,0x04,0x21,0x21,\n   0x21,0xba,0x43,0x43,0x43,0xc2,0x4d,0x4d,0x4d,0xc5,0x41,0x41,0x41,0xc2,0x13,0x13,0x13,0xb7,0x91,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,\n   0xc7,0x00,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x83,0x00,0x00,0x00,0xb3,0x00,\n   0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,\n   0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x8a,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x86,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,\n   0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x9b,0x00,0x00,0x00,0xb3,\n   0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x52,0x52,0x52,0xbd,0x85,0x00,\n   0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x8d,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x8e,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x04,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x86,0x00,\n   0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x92,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x91,\n   0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x85,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,\n   0x8a,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x91,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb5,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa8,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,\n   0xd6,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,\n   0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,\n   0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x03,0xc7,0xc7,0xc7,\n   0xe1,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x87,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,\n   0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xd7,0xd7,0xd7,0xf0,0x86,0xff,0xff,0xff,\n   0xff,0x00,0x89,0x89,0x89,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0x9e,0x9e,0x9e,0xdc,0xec,0xec,0xec,0xf8,0x83,0xff,0xff,0xff,0xff,0x02,0xfd,0xfd,0xfd,0xff,0xca,0xca,\n   0xca,0xeb,0x3c,0x3c,0x3c,0xc1,0x83,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,\n   0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0x83,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,\n   0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x82,\n   0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,\n   0xf5,0x6a,0x6a,0x6a,0xc2,0x87,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0x83,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,\n   0xb8,0x81,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,\n   0xb8,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,\n   0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,\n   0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x87,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,\n   0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x07,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,\n   0xff,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,\n   0xb3,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x83,0x00,0x00,0x00,0xb3,0x01,0x7e,\n   0x7e,0x7e,0xc7,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,\n   0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,\n   0xc7,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x05,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,\n   0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,\n   0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0x52,\n   0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb5,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xa7,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0xaf,0xaf,\n   0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,\n   0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x87,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x86,\n   0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x86,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0xff,\n   0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,\n   0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,\n   0x00,0xd7,0xd7,0xd7,0xf0,0x86,0xff,0xff,0xff,0xff,0x00,0x89,0x89,0x89,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xe1,0xe1,0xe1,0xf3,0x86,0xff,0xff,0xff,0xff,0x01,0xf6,\n   0xf6,0xf6,0xfc,0x41,0x41,0x41,0xc2,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,\n   0xe6,0xe6,0xe6,0xf0,0x86,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x84,0xff,0xff,0xff,0xff,0x02,0x00,0x00,\n   0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x85,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,\n   0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0xb3,\n   0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,\n   0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x83,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x85,0xff,\n   0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,\n   0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,\n   0xc7,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x07,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,\n   0xc7,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa6,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x06,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x7e,\n   0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,\n   0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,\n   0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,\n   0x7e,0x7e,0x7e,0xc7,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,\n   0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,\n   0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x02,0x28,0x28,0x28,0xbc,0x34,0x34,0x34,0xbf,0x63,0x63,0x63,0xcb,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf9,0x81,0x34,0x34,0x34,0xbf,0x00,0x17,0x17,0x17,0xb8,0x81,0x00,0x00,0x00,0xb3,0x06,0xe0,0xe0,0xe0,0xf3,0xce,0xce,\n   0xce,0xec,0x7d,0x7d,0x7d,0xd2,0x46,0x46,0x46,0xc3,0x44,0x44,0x44,0xc3,0x7e,0x7e,0x7e,0xd2,0xef,0xef,0xef,0xf9,0x81,0xff,0xff,0xff,0xff,0x00,0xc3,0xc3,0xc3,0xe8,\n   0x82,0x00,0x00,0x00,0xb3,0x03,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x05,0x52,0x52,0x52,0xbd,\n   0xf7,0xf7,0xf7,0xfa,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xc7,0xc7,\n   0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,\n   0x52,0xbd,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x90,0x90,\n   0x90,0xcc,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,\n   0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,\n   0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,\n   0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x04,0xbb,0xbb,0xbb,0xdc,0xef,\n   0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,\n   0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0x00,0x00,0x00,0xb3,0x07,0xef,0xef,0xef,0xf5,0xff,0xff,\n   0xff,0xff,0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x05,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xbb,0xbb,0xbb,0xdc,0xa0,0xa0,0xa0,0xd1,\n   0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,\n   0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa6,0x00,0x00,0x00,0xb3,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x85,0xaf,0xaf,0xaf,0xd6,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,\n   0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,\n   0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0xaf,0xaf,0xaf,0xd6,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x89,0x00,0x00,0x00,0xb3,0x00,0x3e,0x3e,0x3e,0xc1,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xed,0xed,0xed,0xf8,0x84,0x00,0x00,0x00,0xb3,0x00,0x2b,0x2b,0x2b,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0x7c,0x7c,0x7c,0xd2,0x81,0xff,0xff,0xff,0xff,0x00,0xe9,0xe9,\n   0xe9,0xf7,0x83,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0x33,0x33,0x33,0xb8,0x82,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x82,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,\n   0xff,0xff,0x04,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,\n   0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x02,0xa0,0xa0,0xa0,0xd1,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x85,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,\n   0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,\n   0x00,0x00,0x00,0xb3,0x01,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x01,0xff,0xff,0xff,0xff,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x04,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,\n   0xfa,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,\n   0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0xaf,0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,\n   0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,\n   0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x81,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,\n   0xaf,0xaf,0xaf,0xd6,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x04,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0xaf,0xaf,0xaf,0xd6,0x02,\n   0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,\n   0xe6,0x81,0xff,0xff,0xff,0xff,0x85,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,\n   0xf0,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xb3,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa6,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x87,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x89,0x00,0x00,0x00,0xb3,0x00,0x3e,0x3e,0x3e,0xc1,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xed,0xed,0xed,0xf8,0x8a,0x00,0x00,0x00,0xb3,0x00,0x92,0x92,0x92,0xd8,0x81,0xff,0xff,0xff,0xff,0x00,0xdb,0xdb,0xdb,0xf1,0x91,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,\n   0x90,0xcc,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,\n   0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x83,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,\n   0x87,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x02,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0x52,0x52,0x52,0xbd,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,\n   0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x81,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,\n   0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xf7,0xf7,0xf7,0xfa,0x85,0xff,0xff,0xff,\n   0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x06,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0xf7,0xf7,\n   0xf7,0xfa,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,0xdc,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb3,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xa6,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,\n   0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x7e,0x7e,0x7e,0xc7,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,\n   0xf7,0xfa,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,\n   0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,\n   0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x89,0x00,0x00,0x00,\n   0xb3,0x00,0x3e,0x3e,0x3e,0xc1,0x81,0xff,0xff,0xff,0xff,0x00,0xed,0xed,0xed,0xf8,0x87,0x00,0x00,0x00,0xb3,0x02,0xb0,0xb0,0xb0,0xe1,0xba,0xba,0xba,0xe5,0xd2,0xd2,\n   0xd2,0xee,0x81,0xff,0xff,0xff,0xff,0x01,0xf8,0xf8,0xf8,0xfd,0x58,0x58,0x58,0xc8,0x8e,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0xbb,0xbb,0xbb,0xdc,0xef,0xef,\n   0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0x00,0x00,0x00,0xb3,0x03,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x05,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x02,\n   0xc7,0xc7,0xc7,0xe1,0xa0,0xa0,0xa0,0xd1,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x02,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x04,0xdc,0xdc,0xdc,0xeb,0xff,\n   0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,\n   0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,\n   0xf5,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,\n   0xd2,0xd2,0xe6,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x6a,0x6a,0x6a,0xc2,0x52,0x52,\n   0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,\n   0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x04,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x7e,0x7e,0x7e,0xc7,0x02,0xe6,\n   0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x88,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xc7,0xc7,0xc7,0xe1,0x81,\n   0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,\n   0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb3,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xa6,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x05,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,\n   0xaf,0xd6,0xef,0xef,0xef,0xf5,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,\n   0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,\n   0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,\n   0x03,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,\n   0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xdc,0xd2,\n   0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,\n   0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x3e,0x3e,0x3e,0xc1,0x81,0xff,0xff,0xff,0xff,0x00,0xed,0xed,\n   0xed,0xf8,0x87,0x00,0x00,0x00,0xb3,0x00,0xf5,0xf5,0xf5,0xfc,0x82,0xff,0xff,0xff,0xff,0x01,0xca,0xca,0xca,0xeb,0x2b,0x2b,0x2b,0xbd,0x8e,0x00,0x00,0x00,0xb3,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,0xff,0x04,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,\n   0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x03,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,\n   0xc7,0xe1,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,\n   0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x05,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,\n   0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x86,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,\n   0xe6,0xe6,0xe6,0xf0,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x05,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x33,0x33,0x33,0xb8,0xd2,\n   0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xbb,\n   0xbb,0xbb,0xdc,0xaf,0xaf,0xaf,0xd6,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,\n   0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x05,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0xc7,0xc7,0xc7,0xe1,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,\n   0xc7,0xe1,0x87,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa7,0x00,0x00,0x00,0xb3,0x00,0x90,\n   0x90,0x90,0xcc,0x85,0xff,0xff,0xff,0xff,0x01,0x90,0x90,0x90,0xcc,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,\n   0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,\n   0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,\n   0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,\n   0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xe6,0xe6,\n   0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,\n   0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x3e,0x3e,0x3e,0xc1,0x81,0xff,0xff,0xff,0xff,0x00,0xed,0xed,0xed,0xf8,0x87,0x00,0x00,0x00,0xb3,0x02,0xa2,\n   0xa2,0xa2,0xdd,0xac,0xac,0xac,0xe1,0xcf,0xcf,0xcf,0xed,0x81,0xff,0xff,0xff,0xff,0x01,0xc5,0xc5,0xc5,0xe9,0x04,0x04,0x04,0xb4,0x8c,0x00,0x00,0x00,0xb3,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xbb,0xbb,0xbb,0xdc,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x86,0xff,0xff,0xff,0xff,0x02,\n   0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,\n   0xdc,0x84,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,\n   0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x84,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x02,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x85,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x86,\n   0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,\n   0xb8,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0x6a,0x6a,0x6a,0xc2,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,\n   0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,\n   0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,\n   0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,\n   0xff,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xd2,0xd2,0xd2,0xe6,0x82,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xd2,0xd2,0xd2,0xe6,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xb2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa8,0x00,0x00,0x00,0xb3,0x07,0x6a,0x6a,0x6a,0xc2,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,\n   0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0xaf,0xaf,0xaf,0xd6,\n   0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x02,\n   0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x05,0x90,0x90,0x90,0xcc,\n   0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x03,0x7e,0x7e,0x7e,0xc7,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x01,0xa0,\n   0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,\n   0xdc,0xdc,0xdc,0xeb,0x01,0xa0,0xa0,0xa0,0xd1,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,\n   0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,\n   0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0xa0,0xa0,0xa0,0xd1,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,\n   0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x05,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,\n   0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x03,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0xf7,\n   0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x02,0x50,0x50,0x50,0xc6,0x63,0x63,0x63,0xcb,0x86,0x86,0x86,0xd5,0x81,0xff,0xff,0xff,0xff,0x00,0xed,\n   0xed,0xed,0xf8,0x8a,0x00,0x00,0x00,0xb3,0x00,0xba,0xba,0xba,0xe5,0x81,0xff,0xff,0xff,0xff,0x00,0x72,0x72,0x72,0xcf,0x8c,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x85,0x00,0x00,0x00,0xb3,0x01,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xef,\n   0xef,0xef,0xf5,0x81,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,\n   0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x05,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,\n   0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,\n   0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,\n   0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,\n   0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x87,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x03,0xbb,0xbb,0xbb,0xdc,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,\n   0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,\n   0x33,0xb8,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,\n   0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,\n   0xe1,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,\n   0xc7,0xc7,0xe1,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x05,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0xf7,\n   0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x05,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,\n   0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x04,0x6a,0x6a,0x6a,\n   0xc2,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,\n   0x06,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x04,0x7e,0x7e,0x7e,0xc7,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,\n   0xd6,0x83,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,\n   0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x88,\n   0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x81,\n   0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x07,0xbb,0xbb,0xbb,0xdc,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,\n   0x6a,0xc2,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,\n   0xdc,0xdc,0xeb,0x00,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb1,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xaf,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0x6a,\n   0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0xbd,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x97,0x00,0x00,0x00,0xb3,0x00,0xd7,0xd7,0xd7,0xf0,0x83,\n   0xff,0xff,0xff,0xff,0x00,0xed,0xed,0xed,0xf8,0x84,0x00,0x00,0x00,0xb3,0x02,0x7b,0x7b,0x7b,0xd1,0xa2,0xa2,0xa2,0xdd,0x2c,0x2c,0x2c,0xbd,0x81,0x00,0x00,0x00,0xb3,\n   0x01,0x07,0x07,0x07,0xb5,0xcd,0xcd,0xcd,0xec,0x81,0xff,0xff,0xff,0xff,0x00,0xa3,0xa3,0xa3,0xdd,0x8c,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0xc0,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,\n   0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xdd,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xaf,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xbd,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x97,0x00,0x00,0x00,0xb3,0x01,0xa7,0xa7,0xa7,0xdf,0xdc,0xdc,0xdc,0xf2,0x82,0xff,0xff,0xff,0xff,0x00,0xed,0xed,0xed,0xf8,0x84,0x00,\n   0x00,0x00,0xb3,0x00,0x91,0x91,0x91,0xd8,0x81,0xff,0xff,0xff,0xff,0x02,0xe8,0xe8,0xe8,0xf6,0xdc,0xdc,0xdc,0xf1,0xf4,0xf4,0xf4,0xfb,0x82,0xff,0xff,0xff,0xff,0x00,\n   0x79,0x79,0x79,0xd1,0x8c,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x05,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0xaf,0xaf,0xaf,0xd6,\n   0xef,0xef,0xef,0xf5,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0xbf,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xdc,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xaf,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0xbd,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x99,0x00,0x00,0x00,0xb3,0x00,0x53,0x53,0x53,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xed,\n   0xed,0xed,0xf8,0x84,0x00,0x00,0x00,0xb3,0x00,0x87,0x87,0x87,0xd5,0x86,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xe5,0x03,0x03,0x03,0xb4,0x8d,0x00,0x00,0x00,0xb3,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x85,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x52,\n   0x52,0x52,0xbd,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0x90,0x90,0x90,0xcc,0xda,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xaf,0x00,0x00,0x00,0xb3,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0x00,0x00,0x00,0xb3,0x05,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,\n   0xfa,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0xbd,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x9a,0x00,0x00,0x00,0xb3,0x02,0x6e,0x6e,0x6e,0xce,0x79,\n   0x79,0x79,0xd1,0x6e,0x6e,0x6e,0xce,0x85,0x00,0x00,0x00,0xb3,0x06,0x2f,0x2f,0x2f,0xbe,0x74,0x74,0x74,0xcf,0x9e,0x9e,0x9e,0xdc,0xae,0xae,0xae,0xe1,0xa9,0xa9,0xa9,\n   0xdf,0x89,0x89,0x89,0xd6,0x3c,0x3c,0x3c,0xc1,0x90,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,\n   0xf5,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0xc6,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0xda,0x00,0x00,0x00,0xb3,0x03,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,\n   0xf5,0xf7,0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xaf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0x8a,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0xbd,0x00,0x00,0x00,0xb3,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0xff,0x00,0x00,0x00,0xb3,0x8f,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,\n   0x00,0xa0,0xa0,0xa0,0xd1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xdc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc9,0x00,0x00,0x00,0xb3,0x02,\n   0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc8,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,\n   0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb0,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc8,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,\n   0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb0,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc8,0x00,0x00,0x00,0xb3,0x81,0x33,0x33,0x33,0xb8,0x01,0x00,0x00,0x00,0xb3,0xc7,\n   0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xaf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xae,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x6a,0x6a,0x6a,0xc2,0x90,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,\n   0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x8c,0x00,0x00,0x00,0xb3,\n   0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x8e,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x87,\n   0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x8b,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,\n   0x83,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x92,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,\n   0x33,0x33,0x33,0xb8,0x8c,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,\n   0x33,0xb8,0x83,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,\n   0x52,0x52,0xbd,0x94,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x94,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,\n   0x33,0x33,0x33,0xb8,0x84,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x88,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,\n   0x00,0x33,0x33,0x33,0xb8,0x92,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x86,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,\n   0xc2,0x81,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0xa5,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,\n   0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x90,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,\n   0xc7,0x6a,0x6a,0x6a,0xc2,0x92,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,\n   0xc2,0x81,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x8d,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,\n   0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xaf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xac,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,\n   0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,\n   0xe1,0x83,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x03,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,\n   0x01,0xd2,0xd2,0xd2,0xe6,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,\n   0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x03,0xef,0xef,0xef,\n   0xf5,0x90,0x90,0x90,0xcc,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x05,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xdc,\n   0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xdc,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,\n   0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,\n   0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,\n   0xb3,0x01,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x03,0xbb,0xbb,0xbb,0xdc,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,\n   0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,\n   0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,0x00,0xb3,0x02,\n   0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x04,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,\n   0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,\n   0xb3,0x02,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x01,0xa0,\n   0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x90,\n   0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x83,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,\n   0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x03,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x03,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,\n   0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,\n   0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,\n   0x01,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x03,\n   0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x83,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x01,\n   0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x01,0xbb,0xbb,0xbb,0xdc,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xaf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xac,0x00,0x00,0x00,0xb3,0x04,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,\n   0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,\n   0x6a,0x6a,0xc2,0x86,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,\n   0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x86,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x01,0xa0,0xa0,0xa0,0xd1,0xc7,0xc7,0xc7,0xe1,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x52,\n   0x52,0x52,0xbd,0x84,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,\n   0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x86,0xff,0xff,0xff,0xff,0x00,\n   0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,\n   0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x84,\n   0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x6a,0x6a,\n   0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x85,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x83,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0x90,0x90,0x90,0xcc,0x86,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x88,\n   0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x86,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,\n   0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,\n   0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xae,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xad,0x00,0x00,0x00,0xb3,0x03,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,\n   0xb8,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x90,0x90,0x90,0xcc,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,\n   0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x7e,0x7e,0x7e,0xc7,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,\n   0xe6,0xf0,0x90,0x90,0x90,0xcc,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0x6a,0x6a,\n   0x6a,0xc2,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,\n   0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x07,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xbb,0xbb,0xbb,0xdc,0xa0,0xa0,\n   0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,\n   0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,\n   0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xc7,0xc7,\n   0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x88,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,\n   0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,\n   0xb3,0x05,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xe6,0xe6,0xe6,0xf0,0x81,0x90,0x90,0x90,0xcc,0x03,0xd2,0xd2,0xd2,0xe6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x03,0xa0,0xa0,0xa0,0xd1,0x6a,0x6a,\n   0x6a,0xc2,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,\n   0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,\n   0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x88,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x7e,0x7e,0x7e,0xc7,0xc7,\n   0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x03,0xa0,0xa0,0xa0,0xd1,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x33,\n   0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,\n   0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,\n   0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x82,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xae,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xad,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,\n   0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,\n   0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,\n   0x86,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x85,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,\n   0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,\n   0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,\n   0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,\n   0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0xaf,0xaf,0xaf,0xd6,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x02,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x88,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x85,0xaf,0xaf,0xaf,0xd6,0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x7e,0x7e,0x7e,0xc7,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xd2,\n   0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,\n   0xd6,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,\n   0x85,0xaf,0xaf,0xaf,0xd6,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,\n   0x52,0xbd,0x6a,0x6a,0x6a,0xc2,0x87,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x84,\n   0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,\n   0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x88,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x88,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0x33,0x33,\n   0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,\n   0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x04,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0xaf,0xaf,0xaf,\n   0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,\n   0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,\n   0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xad,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xac,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,\n   0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x02,0xdc,\n   0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,\n   0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x87,0xff,0xff,0xff,0xff,0x85,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,\n   0x85,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x01,0x90,0x90,0x90,\n   0xcc,0xf7,0xf7,0xf7,0xfa,0x85,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x82,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x88,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x87,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x85,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,\n   0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x85,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,\n   0xff,0x03,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x87,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8c,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x52,\n   0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,\n   0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x88,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,\n   0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,\n   0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0x00,0x00,0x00,0xb3,0x06,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xbb,\n   0xbb,0xbb,0xdc,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xad,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xac,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,\n   0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x86,\n   0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x7e,0x7e,0x7e,0xc7,0x02,0xe6,0xe6,0xe6,\n   0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x85,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x83,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0x90,0x90,0x90,0xcc,0x81,0xaf,0xaf,0xaf,0xd6,0x04,0xef,0xef,0xef,0xf5,0xff,\n   0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x01,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0x33,0x33,0x33,0xb8,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xaf,\n   0xaf,0xaf,0xd6,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,\n   0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,\n   0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x52,0x52,0x52,0xbd,\n   0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,\n   0x90,0xcc,0x81,0x7e,0x7e,0x7e,0xc7,0x02,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x82,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0x90,0x90,\n   0x90,0xcc,0x81,0xaf,0xaf,0xaf,0xd6,0x04,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,\n   0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,\n   0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,\n   0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x7e,0x7e,0x7e,0xc7,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0x7e,0x7e,\n   0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x8c,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,\n   0xff,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0x33,0x33,0x33,0xb8,0x87,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,\n   0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,\n   0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x86,0x00,0x00,0x00,\n   0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,\n   0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,\n   0xfa,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xad,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xac,0x00,0x00,0x00,0xb3,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,\n   0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,\n   0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,\n   0xcc,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,\n   0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0xaf,\n   0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x09,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,\n   0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,\n   0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xaf,0xaf,\n   0xaf,0xd6,0x03,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,\n   0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x01,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,\n   0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0xef,0xef,0xef,0xf5,0xaf,\n   0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xaf,0xaf,0xaf,0xd6,0x00,\n   0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x09,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,\n   0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,\n   0xf7,0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x03,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,\n   0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x03,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,\n   0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,\n   0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x84,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x04,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,\n   0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,\n   0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,\n   0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xc7,0xc7,0xc7,0xe1,0x00,\n   0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x86,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,\n   0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xac,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xac,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x83,\n   0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,\n   0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x85,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,\n   0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,\n   0x84,0xff,0xff,0xff,0xff,0x06,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,\n   0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x01,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,\n   0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x86,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x84,0xff,\n   0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0xff,0xff,0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,\n   0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,\n   0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x81,\n   0x00,0x00,0x00,0xb3,0x04,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x52,\n   0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,\n   0x84,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x52,0x52,\n   0x52,0xbd,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,\n   0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,\n   0xf0,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0xff,0xff,\n   0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,\n   0xc2,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x03,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,\n   0xf0,0x84,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x87,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x52,0x52,\n   0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xd2,0xd2,0xd2,0xe6,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xac,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xad,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,\n   0xc2,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x04,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x04,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x83,0x00,0x00,0x00,0xb3,0x01,0xa0,\n   0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,\n   0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,\n   0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x04,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,\n   0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x88,0x00,0x00,0x00,0xb3,0x0a,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,\n   0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,\n   0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x05,0xdc,0xdc,0xdc,0xeb,0xaf,\n   0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x07,0xbb,0xbb,\n   0xbb,0xdc,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x05,0xef,0xef,0xef,0xf5,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,\n   0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x83,0x00,0x00,0x00,0xb3,0x04,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,\n   0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x06,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xf7,\n   0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x04,0xbb,0xbb,\n   0xbb,0xdc,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,\n   0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,\n   0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x03,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x04,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,\n   0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x86,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,\n   0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,\n   0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x03,0xa0,0xa0,0xa0,\n   0xd1,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,\n   0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,\n   0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x06,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,\n   0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,\n   0xdc,0x84,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,\n   0xdc,0x81,0x00,0x00,0x00,0xb3,0x06,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,\n   0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x04,0xbb,0xbb,0xbb,0xdc,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x7e,0x7e,\n   0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,\n   0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,\n   0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,\n   0xfa,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x05,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,\n   0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xab,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb5,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x9b,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa9,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x98,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x93,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xb6,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0xb9,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8c,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,\n   0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xbc,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xbd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb5,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x9b,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa9,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x04,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x98,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x93,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xb6,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xb9,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,\n   0xdc,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8c,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xbc,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xb5,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x9b,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0xa9,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,\n   0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x98,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,\n   0xc7,0x00,0x52,0x52,0x52,0xbd,0x93,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,\n   0xff,0xff,0xff,0xff,0x81,0xbb,0xbb,0xbb,0xdc,0xb4,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xb9,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x8c,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x88,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,\n   0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x81,0xbb,0xbb,0xbb,0xdc,0xba,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xbd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb5,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x9b,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa9,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xb0,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0xb4,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xb9,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,\n   0xdc,0x82,0xdc,0xdc,0xdc,0xeb,0x00,0x90,0x90,0x90,0xcc,0x83,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x99,\n   0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0xba,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb5,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,\n   0x81,0xaf,0xaf,0xaf,0xd6,0x9b,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x00,0x52,\n   0x52,0x52,0xbd,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0xa9,0x00,0x00,0x00,\n   0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0xb0,0x00,0x00,0x00,0xb3,0x81,\n   0xaf,0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0x88,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xd2,0xd2,0xd2,0xe6,0x81,0xdc,0xdc,0xdc,0xeb,0xb4,0x00,0x00,0x00,\n   0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0xe1,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xd2,0xd2,0xd2,0xe6,0x81,0xdc,0xdc,0xdc,0xeb,0xba,0x00,\n   0x00,0x00,0xb3,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc9,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,\n   0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x87,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,\n   0xc2,0x88,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x33,0x33,\n   0x33,0xb8,0xa0,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x92,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x8f,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x99,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,\n   0x7e,0xc7,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x87,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,\n   0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x00,0x33,\n   0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x8a,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,\n   0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x87,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x8c,0x00,0x00,0x00,0xb3,\n   0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x8e,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x8a,0x00,\n   0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,\n   0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x9f,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,\n   0x00,0x33,0x33,0x33,0xb8,0x84,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x87,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,\n   0xc2,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x6a,0x6a,0x6a,0xc2,0x86,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,\n   0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x86,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,\n   0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xaf,\n   0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,\n   0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,\n   0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,\n   0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,\n   0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x88,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,\n   0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,\n   0x82,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,\n   0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,\n   0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xd2,0xd2,\n   0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x06,0xbb,0xbb,0xbb,0xdc,0xdc,\n   0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x83,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,\n   0xdc,0x82,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,\n   0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x01,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x6a,0x6a,0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,\n   0xd6,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0x83,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,\n   0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,\n   0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,\n   0xb8,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,\n   0xb8,0xc7,0xc7,0xc7,0xe1,0x83,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,\n   0xf5,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x03,0x90,0x90,0x90,0xcc,0xf7,0xf7,0xf7,0xfa,0xef,0xef,0xef,\n   0xf5,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x04,\n   0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,\n   0xe6,0xf0,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,\n   0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,\n   0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,\n   0xef,0xf5,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x00,\n   0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x86,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,\n   0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,\n   0x86,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x84,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x83,0xff,0xff,0xff,\n   0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,\n   0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,\n   0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x83,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,\n   0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,\n   0xf5,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,0xff,0xff,0xff,0x05,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,\n   0xf7,0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,0x06,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,\n   0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x05,0xf7,0xf7,\n   0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,\n   0x83,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,\n   0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,\n   0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x7e,0x7e,0x7e,0xc7,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,\n   0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,\n   0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,\n   0xf0,0x90,0x90,0x90,0xcc,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,\n   0xdc,0x82,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xd2,0xd2,0xd2,0xe6,\n   0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,\n   0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,\n   0x04,0x6a,0x6a,0x6a,0xc2,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,\n   0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,\n   0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x03,0xa0,0xa0,0xa0,0xd1,0x6a,0x6a,0x6a,0xc2,\n   0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,\n   0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,\n   0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xe6,0xe6,0xe6,0xf0,0x81,0x90,0x90,0x90,0xcc,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,\n   0x7e,0x7e,0x7e,0xc7,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,\n   0x81,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,\n   0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,\n   0x05,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xe6,\n   0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x03,0xaf,\n   0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x09,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,\n   0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xb6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,\n   0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x85,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,\n   0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0xaf,0xaf,0xaf,0xd6,0x02,\n   0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,\n   0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x06,\n   0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,\n   0xe6,0x81,0xff,0xff,0xff,0xff,0x85,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,\n   0x84,0xaf,0xaf,0xaf,0xd6,0x01,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x90,0x90,0x90,0xcc,0x7e,0x7e,0x7e,0xc7,\n   0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,\n   0xb3,0x02,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xd2,0xd2,0xd2,0xe6,\n   0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x04,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0xaf,\n   0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,\n   0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,\n   0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0xaf,0xaf,0xaf,0xd6,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,\n   0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x85,0xaf,0xaf,0xaf,0xd6,0x86,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0x7e,0x7e,0x7e,0xc7,0xbb,0xbb,0xbb,0xdc,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0x52,0x52,0x52,0xbd,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,\n   0x6a,0xc2,0x52,0x52,0x52,0xbd,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x85,0xaf,0xaf,0xaf,0xd6,0x01,0x00,0x00,0x00,0xb3,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x7e,0x7e,0x7e,0xc7,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,\n   0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,\n   0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0xa0,0xa0,0xa0,0xd1,\n   0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0xaf,0xaf,0xaf,0xd6,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb9,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xb7,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x85,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,\n   0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x86,\n   0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x09,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0x90,0x90,0x90,0xcc,0xef,\n   0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,\n   0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x87,0xff,0xff,0xff,\n   0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x87,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x86,0xff,\n   0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,\n   0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,\n   0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,\n   0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x87,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x87,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x84,0xff,0xff,0xff,0xff,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0xaf,\n   0xaf,0xaf,0xd6,0x87,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x8b,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x87,0xff,0xff,0xff,0xff,0x02,0x00,0x00,\n   0x00,0xb3,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x85,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x83,0x00,0x00,0x00,0xb3,0x05,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x83,\n   0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb9,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,\n   0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x05,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,\n   0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,\n   0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,\n   0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,\n   0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0x52,0x52,0x52,\n   0xbd,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,\n   0x02,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,\n   0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x7e,0x7e,0x7e,0xc7,0x02,0xe6,0xe6,\n   0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0xaf,0xaf,0xaf,0xd6,0x00,0xc7,\n   0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0x7e,0x7e,0x7e,0xc7,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x04,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,\n   0xf5,0x82,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x03,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x7e,0x7e,0x7e,0xc7,0x02,0xe6,0xe6,0xe6,0xf0,0xff,0xff,\n   0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x52,\n   0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0xc7,0xc7,0xc7,\n   0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x8b,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x84,0xaf,0xaf,0xaf,0xd6,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x02,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x82,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0x90,0x90,0x90,0xcc,\n   0x81,0xaf,0xaf,0xaf,0xd6,0x04,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,\n   0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb9,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,\n   0xd2,0xe6,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x05,0xef,0xef,\n   0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,\n   0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,\n   0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0xaf,0xaf,\n   0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,\n   0xff,0xff,0xff,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,\n   0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x01,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,\n   0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x04,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,\n   0xc7,0xe1,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0xff,0xff,0xff,0xff,0x0a,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,\n   0xf7,0xfa,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x00,\n   0x00,0x00,0xb3,0x08,0xaf,0xaf,0xaf,0xd6,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,\n   0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,\n   0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x03,0xa0,0xa0,0xa0,0xd1,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,\n   0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xbb,0xbb,\n   0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x0d,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,\n   0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,\n   0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,\n   0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,\n   0xff,0xff,0x03,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,\n   0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x0d,\n   0x52,0x52,0x52,0xbd,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,\n   0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x8c,0x00,0x00,0x00,0xb3,0x8a,0xff,0xff,\n   0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x09,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,\n   0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,\n   0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x05,0xdc,0xdc,0xdc,\n   0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x03,0x52,0x52,0x52,0xbd,0x7e,\n   0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xb6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,\n   0x00,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,\n   0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,\n   0x00,0xe6,0xe6,0xe6,0xf0,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,\n   0xb3,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xb3,\n   0x86,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,\n   0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,\n   0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,\n   0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,\n   0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x03,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,\n   0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,\n   0xa0,0xd1,0x85,0xff,0xff,0xff,0xff,0x01,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0x85,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xc7,0xc7,\n   0xc7,0xe1,0x85,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,\n   0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,\n   0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x84,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,\n   0xd1,0x85,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x8c,0x00,0x00,0x00,0xb3,0x8a,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x04,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,\n   0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x86,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x04,0xf7,0xf7,0xf7,0xfa,\n   0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0xaf,0xaf,\n   0xaf,0xd6,0x85,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x05,0xbb,\n   0xbb,0xbb,0xdc,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,\n   0xd6,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,\n   0xeb,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xbb,0xbb,\n   0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x05,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,\n   0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,\n   0xeb,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x52,\n   0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,\n   0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0x52,0x52,0x52,0xbd,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x02,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,\n   0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x04,0x90,\n   0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x85,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,\n   0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x04,0xe6,0xe6,0xe6,0xf0,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x04,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x83,0x00,0x00,0x00,0xb3,0x01,0xa0,\n   0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x87,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,\n   0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xaf,0xaf,\n   0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x04,0xaf,0xaf,0xaf,0xd6,0xef,0xef,\n   0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,\n   0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x0a,\n   0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,\n   0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x85,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x05,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,\n   0xc7,0xe1,0x33,0x33,0x33,0xb8,0x83,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x90,0x90,\n   0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x01,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0xa0,0xa0,\n   0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x82,0x00,\n   0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x03,0x7e,0x7e,0x7e,0xc7,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,\n   0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x87,0x00,0x00,0x00,0xb3,0x00,\n   0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,\n   0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x01,0x7e,\n   0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x8d,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,\n   0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0xc7,0xc7,\n   0xc7,0xe1,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xc7,0xc7,\n   0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,\n   0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,\n   0xb3,0x05,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,\n   0xa0,0xa0,0xa0,0xd1,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xb6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb8,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0x33,0x33,\n   0x33,0xb8,0x94,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x91,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x91,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x96,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0x33,0x33,\n   0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x8c,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x96,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x9b,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x94,0x00,0x00,0x00,0xb3,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x91,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0xcb,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x9a,0x00,0x00,0x00,0xb3,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x94,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xb9,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x03,0xdc,0xdc,0xdc,0xeb,0xff,\n   0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x93,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x91,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x91,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x95,0x00,0x00,\n   0x00,0xb3,0x05,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x8c,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x96,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x9b,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x94,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,\n   0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x91,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0xcb,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x9a,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x94,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb9,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x93,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x91,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x91,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x95,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,\n   0xc7,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x8c,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,\n   0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x96,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x9b,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x94,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x87,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x91,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xaf,0xaf,0xaf,0xd6,0xc9,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x9a,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x94,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb9,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x94,0x00,0x00,0x00,\n   0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x91,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x91,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x95,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,\n   0x88,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x93,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x96,0x00,\n   0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,\n   0xd1,0x9b,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xa0,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x92,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xc9,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,\n   0xdc,0xeb,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x9a,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd1,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcf,0x00,0x00,0x00,0xb3,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0x91,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,\n   0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x91,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x7e,0x7e,0x7e,0xc7,0xa1,0x00,0x00,0x00,0xb3,0x00,\n   0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x93,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0xbe,0x00,0x00,0x00,0xb3,0x81,0xaf,0xaf,\n   0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0xa0,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0x92,0x00,0x00,0x00,0xb3,\n   0x01,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xbb,0xbb,0xbb,0xdc,0xf0,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xaf,0xaf,\n   0xaf,0xd6,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd1,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa3,0x00,0x00,0x00,0xb3,0x82,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd8,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xa0,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x84,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xa0,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd5,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xa1,0x00,0x00,0x00,0xb3,0x05,0xef,0xef,0xef,0xf5,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xce,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x85,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,\n   0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x8c,0x00,0x00,0x00,\n   0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x91,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,\n   0x94,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x90,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,\n   0xc7,0x9a,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0xa3,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,\n   0xc7,0x52,0x52,0x52,0xbd,0xa6,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x6a,0x6a,0x6a,0xc2,0x8a,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,\n   0x33,0x33,0x33,0xb8,0x91,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x9a,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x52,0x52,0x52,0xbd,0x8a,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x88,0x00,\n   0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,\n   0xb8,0x88,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x8f,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,\n   0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc1,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,\n   0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x81,0xff,\n   0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x05,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0xff,\n   0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x03,0xbb,0xbb,0xbb,0xdc,\n   0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,\n   0x01,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,\n   0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x87,0x00,0x00,0x00,\n   0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x00,\n   0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,\n   0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x05,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0xff,0xff,\n   0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,\n   0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,\n   0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x86,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xef,0xef,0xef,0xf5,0x82,0xff,\n   0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xe6,0xe6,\n   0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x83,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,\n   0xdc,0x82,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xbb,0xbb,0xbb,0xdc,0x81,\n   0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,\n   0xfa,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x82,0x00,\n   0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,\n   0xc7,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0x83,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xbf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x09,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,\n   0x33,0xb8,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x87,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,\n   0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x86,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,\n   0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x85,0xff,\n   0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,\n   0xf7,0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,\n   0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,\n   0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x86,0xff,0xff,0xff,0xff,0x06,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xff,\n   0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0x00,0x00,0x00,0xb3,0x02,0xef,\n   0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x00,\n   0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,\n   0xc7,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x83,0xff,0xff,0xff,0xff,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x86,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x33,0x33,\n   0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x84,0xff,0xff,0xff,0xff,0x01,0x00,0x00,\n   0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x86,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,\n   0x7e,0xc7,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,\n   0x00,0x00,0xb3,0x07,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,\n   0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,\n   0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,\n   0xb3,0x05,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,\n   0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,\n   0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,\n   0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,\n   0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x86,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,\n   0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,\n   0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x83,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,\n   0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,\n   0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,\n   0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x03,0xaf,0xaf,\n   0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,\n   0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x03,0xa0,0xa0,0xa0,0xd1,0x6a,\n   0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x04,\n   0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,\n   0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x90,0x90,0x90,0xcc,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,\n   0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xc7,0xc7,\n   0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x00,0x00,\n   0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x7e,\n   0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xa0,0xa0,0xa0,0xd1,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,\n   0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x84,0xaf,0xaf,0xaf,0xd6,0x05,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,\n   0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x02,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,0x00,0xb3,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x00,\n   0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x06,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0xff,0xff,\n   0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x03,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x81,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xbb,\n   0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x7e,0x7e,0x7e,0xc7,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,\n   0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,\n   0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,\n   0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0x00,0x00,0x00,0xb3,0x03,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,\n   0xd6,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,\n   0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,\n   0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x04,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x85,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,\n   0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,\n   0xff,0x01,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x02,0xa0,0xa0,0xa0,0xd1,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xef,0xef,0xef,0xf5,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,\n   0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,\n   0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xe6,\n   0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x85,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,\n   0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,\n   0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,\n   0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,\n   0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x09,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0x90,0x90,0x90,0xcc,0xef,0xef,\n   0xef,0xf5,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x86,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,\n   0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x06,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,\n   0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0x90,0x90,0x90,0xcc,\n   0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x85,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,\n   0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x05,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,\n   0xc2,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,\n   0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,\n   0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xbb,0xbb,0xbb,0xdc,\n   0x83,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,\n   0xaf,0xaf,0xaf,0xd6,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,\n   0xff,0x88,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0x90,0x90,0x90,0xcc,0x81,0xaf,0xaf,0xaf,0xd6,0x04,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,\n   0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,\n   0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,\n   0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x52,0x52,0x52,0xbd,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x05,0x7e,0x7e,0x7e,0xc7,\n   0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0x52,0x52,0x52,0xbd,0xbb,0xbb,0xbb,0xdc,0xff,0xff,\n   0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x87,0x00,\n   0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,\n   0xbd,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x06,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,\n   0xeb,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xd2,0xd2,0xd2,0xe6,0x82,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0x90,0x90,0x90,0xcc,0x81,\n   0xaf,0xaf,0xaf,0xd6,0x04,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,\n   0xbb,0xbb,0xdc,0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,\n   0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,\n   0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x6a,0x6a,0x6a,\n   0xc2,0x89,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,\n   0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,\n   0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0x90,0x90,0x90,0xcc,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x05,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,\n   0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x52,\n   0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x52,0x52,0x52,\n   0xbd,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,\n   0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xa0,0xa0,0xa0,0xd1,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xc0,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x05,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x33,0x33,0x33,0xb8,\n   0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,\n   0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x87,0x00,0x00,0x00,0xb3,0x09,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,\n   0xb8,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,\n   0xb8,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,\n   0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,\n   0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,\n   0x7e,0xc7,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,\n   0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x86,0x00,0x00,0x00,0xb3,0x01,0x6a,\n   0x6a,0x6a,0xc2,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,\n   0xdc,0x81,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x0b,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,\n   0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,\n   0x04,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xaf,\n   0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,\n   0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,\n   0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,\n   0xb3,0xaf,0xaf,0xaf,0xd6,0x6a,0x6a,0x6a,0xc2,0x87,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,\n   0xcc,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,\n   0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0xaf,0xaf,0xaf,\n   0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x06,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,\n   0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xaf,0xaf,0xaf,0xd6,0x01,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x06,\n   0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x01,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x01,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xc0,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x03,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xf7,\n   0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x04,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,\n   0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,\n   0x87,0x00,0x00,0x00,0xb3,0x04,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,\n   0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0xff,\n   0xff,0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,\n   0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,\n   0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,\n   0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x02,\n   0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x85,0x00,0x00,0x00,0xb3,0x04,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,\n   0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x02,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,\n   0xff,0x06,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0x81,0xff,\n   0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,\n   0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,\n   0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,\n   0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x85,0x00,0x00,0x00,0xb3,0x04,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xef,\n   0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,\n   0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x01,0xa0,0xa0,0xa0,0xd1,0xdc,0xdc,0xdc,0xeb,0x85,0xff,0xff,0xff,0xff,0x81,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,\n   0x84,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x86,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,\n   0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0xff,0xff,0xff,\n   0xff,0x00,0xc7,0xc7,0xc7,0xe1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x05,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,\n   0xf5,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x06,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xd2,\n   0xd2,0xd2,0xe6,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x05,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,\n   0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x87,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,\n   0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x04,0x6a,0x6a,0x6a,0xc2,0xef,0xef,\n   0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x83,0x00,0x00,0x00,0xb3,0x04,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,\n   0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x06,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,\n   0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,\n   0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xaf,\n   0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xdc,0xdc,0xdc,0xeb,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x52,0x52,0x52,0xbd,0x85,0x00,0x00,0x00,0xb3,0x06,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0xf7,\n   0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xd2,0xd2,0xd2,0xe6,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xdc,0xdc,0xdc,0xeb,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0x00,0x00,0x00,0xb3,0x81,0xdc,\n   0xdc,0xdc,0xeb,0x04,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,\n   0xdc,0xeb,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x05,0x7e,0x7e,0x7e,0xc7,0xc7,0xc7,0xc7,0xe1,0xff,0xff,\n   0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x04,0x6a,0x6a,0x6a,0xc2,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,\n   0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x02,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,\n   0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x04,0x6a,0x6a,0x6a,0xc2,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x82,0x00,\n   0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,\n   0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,\n   0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x06,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xd2,0xd2,\n   0xd2,0xe6,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x05,0xbb,0xbb,0xbb,0xdc,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,\n   0xff,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,\n   0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x02,0xbb,0xbb,0xbb,0xdc,\n   0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0xa0,0xa0,0xa0,0xd1,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,\n   0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x08,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,\n   0xc7,0xe1,0x52,0x52,0x52,0xbd,0xbb,0xbb,0xbb,0xdc,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xdc,0xdc,0xdc,0xeb,0x81,0x6a,0x6a,\n   0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x04,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,\n   0xeb,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x01,\n   0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0x00,0x00,0x00,0xb3,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,\n   0x06,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,\n   0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x05,0xbb,0xbb,0xbb,0xdc,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,\n   0x82,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x9a,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa1,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xa9,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xb1,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0x52,0x52,0x52,0xbd,0xbe,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x95,0x00,0x00,0x00,0xb3,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x9d,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,\n   0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xdd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xef,0xef,0xef,\n   0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x9a,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa1,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xa9,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xb0,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xbd,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,\n   0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x94,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x9d,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x03,0xdc,0xdc,\n   0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xdc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x9b,0x00,0x00,0x00,0xb3,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa1,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x00,0xef,\n   0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x81,0xbb,0xbb,0xbb,0xdc,0x8b,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xa9,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xb0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0xbd,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,\n   0xff,0xff,0xff,0x94,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x6a,0x6a,0x6a,0xc2,0x9d,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,\n   0xc7,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xdc,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x85,0xdc,0xdc,0xdc,0xeb,0x01,0xbb,0xbb,\n   0xbb,0xdc,0x7e,0x7e,0x7e,0xc7,0x9c,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa1,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x8b,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,\n   0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xa9,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xb0,0x00,0x00,0x00,0xb3,0x03,0x90,0x90,0x90,0xcc,0xf7,0xf7,0xf7,0xfa,\n   0xef,0xef,0xef,0xf5,0x52,0x52,0x52,0xbd,0xbd,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,\n   0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0xbc,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xdd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xe5,0x00,0x00,0x00,0xb3,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0xa1,0x00,0x00,0x00,0xb3,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0x88,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,\n   0xd1,0xd2,0xd2,0xd2,0xe6,0x81,0xdc,0xdc,0xdc,0xeb,0x8b,0x00,0x00,0x00,0xb3,0x81,0xaf,0xaf,0xaf,0xd6,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0xa9,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x81,\n   0xaf,0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0xf2,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa7,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbb,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,\n   0x6a,0xc2,0x82,0xaf,0xaf,0xaf,0xd6,0x01,0x90,0x90,0x90,0xcc,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x89,0x00,0x00,0x00,0xb3,0x01,\n   0x6a,0x6a,0x6a,0xc2,0xa0,0xa0,0xa0,0xd1,0x82,0xaf,0xaf,0xaf,0xd6,0x00,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xcb,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,\n   0xb8,0x7e,0x7e,0x7e,0xc7,0x83,0xaf,0xaf,0xaf,0xd6,0x01,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x8b,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,\n   0x00,0xb3,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x01,\n   0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x8a,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,\n   0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xef,0xef,0xef,0xf5,0x84,0xff,0xff,0xff,0xff,0x04,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x6a,\n   0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x88,0x00,0x00,0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,0x85,\n   0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,\n   0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x8b,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x91,0x00,0x00,0x00,0xb3,0x82,0xff,\n   0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x86,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0x00,0x00,0x00,\n   0xb3,0x00,0x90,0x90,0x90,0xcc,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x88,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x02,\n   0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,\n   0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x85,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x84,0xff,0xff,0xff,0xff,0x85,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0x87,0xff,0xff,0xff,0xff,0x02,0xef,0xef,\n   0xef,0xf5,0xbb,0xbb,0xbb,0xdc,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x8b,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,\n   0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x87,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,\n   0x8a,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,\n   0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x89,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,\n   0xcc,0x88,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x88,0x00,0x00,0x00,0xb3,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x89,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,\n   0xf0,0x87,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,\n   0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x8b,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x90,0x00,0x00,0x00,0xb3,\n   0x00,0x90,0x90,0x90,0xcc,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x85,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x00,0x52,\n   0x52,0x52,0xbd,0x83,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x86,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,\n   0xbd,0x83,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,\n   0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x85,0x00,\n   0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x8c,0xff,0xff,0xff,0xff,\n   0x00,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x82,0x00,0x00,0x00,0xb3,0x8b,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,\n   0x6a,0x6a,0x6a,0xc2,0x85,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,\n   0xb3,0x8a,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,\n   0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x88,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,\n   0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0x86,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x33,0x33,\n   0x33,0xb8,0x88,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x88,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x85,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,\n   0x82,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0x00,\n   0x00,0x00,0xb3,0x8b,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x90,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x83,0xff,0xff,0xff,0xff,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x83,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x83,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,\n   0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x85,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x85,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x85,0xff,0xff,\n   0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x8d,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xcc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,\n   0xf5,0x87,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x85,\n   0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,\n   0xef,0xf5,0x86,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x88,0x00,0x00,0x00,0xb3,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xef,0xef,0xef,0xf5,0x83,\n   0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x8a,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xf7,0xf7,0xf7,0xfa,0x04,0xa0,0xa0,0xa0,\n   0xd1,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x85,0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xef,\n   0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,\n   0xff,0x00,0xef,0xef,0xef,0xf5,0x87,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x90,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x83,0xff,0xff,\n   0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x83,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x83,0x00,0x00,0x00,0xb3,\n   0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x85,0x7e,0x7e,0x7e,0xc7,0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,\n   0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,\n   0x00,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,\n   0x90,0x90,0x90,0xcc,0x86,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,\n   0xd6,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,\n   0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8a,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x8d,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x88,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xe6,\n   0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8c,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,\n   0x00,0x33,0x33,0x33,0xb8,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x8d,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x8f,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x84,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x83,0x00,0x00,\n   0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x84,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x84,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x8c,0xff,0xff,0xff,0xff,\n   0x00,0xf7,0xf7,0xf7,0xfa,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,\n   0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,\n   0x33,0xb8,0xef,0xef,0xef,0xf5,0x86,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x33,\n   0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xcc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x8b,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x8b,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x88,0x00,0x00,0x00,0xb3,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x85,0xff,0xff,0xff,0xff,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x91,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,\n   0xe1,0x8b,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x8f,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x85,\n   0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,\n   0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x8c,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,\n   0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,\n   0xff,0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x86,\n   0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcc,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8b,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x8b,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x83,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x88,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,\n   0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,\n   0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x8f,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,\n   0xd2,0xd2,0xe6,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x8b,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x8f,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,\n   0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x8b,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,\n   0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x83,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,\n   0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x83,0xff,\n   0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,\n   0x00,0xc7,0xc7,0xc7,0xe1,0x87,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xcc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,\n   0xff,0x86,0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,\n   0xf7,0xf7,0xf7,0xfa,0x86,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x84,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0x52,0x52,\n   0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x83,0x00,0x00,0x00,0xb3,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x89,0x00,0x00,0x00,0xb3,\n   0x00,0xd2,0xd2,0xd2,0xe6,0x83,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x01,0xa0,0xa0,0xa0,0xd1,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,\n   0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x8c,0x00,0x00,0x00,0xb3,0x02,0x90,0x90,0x90,0xcc,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x83,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,\n   0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x89,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x86,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x85,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,\n   0x33,0x33,0x33,0xb8,0x8d,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x82,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x82,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0xd2,0xd2,0xd2,0xe6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x84,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0xff,0xff,0xff,0xff,0x01,\n   0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,\n   0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,\n   0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x85,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x8a,0xff,0xff,0xff,\n   0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x84,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x89,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x86,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,\n   0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x89,0x00,0x00,0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x86,0xff,0xff,0xff,0xff,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x84,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,\n   0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x89,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0x00,0x00,0x00,0xb3,0x8a,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x89,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x83,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x8d,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,\n   0xd1,0x82,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x90,0x90,0x90,0xcc,0x82,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,\n   0xd6,0x82,0xff,0xff,0xff,0xff,0x01,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0xef,\n   0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,\n   0x00,0x6a,0x6a,0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x8a,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,\n   0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0xff,0xff,0xff,0xff,\n   0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x8a,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x84,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,\n   0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8b,\n   0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,\n   0xbd,0x83,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x85,0x00,\n   0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,\n   0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x89,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,\n   0x00,0x00,0xb3,0x8a,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x88,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x8c,0x00,0x00,0x00,0xb3,0x00,0xc7,\n   0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x02,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,\n   0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x8b,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x02,0x6a,\n   0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,\n   0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0xff,0xff,0xff,\n   0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,\n   0xf7,0xfa,0x86,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x85,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,\n   0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x85,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x8b,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x8d,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x84,0xff,\n   0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x90,0x90,0x90,0xcc,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,\n   0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x85,0xaf,0xaf,0xaf,0xd6,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,\n   0xf7,0xf7,0xfa,0x86,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x88,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x85,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0x8b,0x00,0x00,0x00,0xb3,0x00,0xf7,\n   0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,\n   0xf0,0x33,0x33,0x33,0xb8,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,\n   0xd2,0xd2,0xe6,0x84,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x82,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0x7e,0x7e,\n   0x7e,0xc7,0x01,0x90,0x90,0x90,0xcc,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,\n   0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x52,0x52,0x52,0xbd,0x83,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,\n   0xfa,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xcc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,\n   0xff,0xff,0xff,0xff,0x86,0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,\n   0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x82,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xbb,0xbb,0xbb,0xdc,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,\n   0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x8c,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,\n   0xaf,0xaf,0xaf,0xd6,0x8b,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x82,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,\n   0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,\n   0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,\n   0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,\n   0x85,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x85,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,\n   0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,\n   0xff,0x01,0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,\n   0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd9,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8e,0x00,\n   0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,\n   0x85,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,\n   0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x8c,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x8d,\n   0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,\n   0xb8,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x8d,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,\n   0x33,0xb8,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,\n   0x6a,0xc2,0x89,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,\n   0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x84,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,\n   0x83,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,\n   0xff,0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x83,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd8,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8e,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x86,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,\n   0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x8c,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,\n   0x00,0xc7,0xc7,0xc7,0xe1,0x83,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,\n   0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,\n   0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,\n   0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x89,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x00,\n   0xd2,0xd2,0xd2,0xe6,0x84,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,\n   0xbb,0xdc,0x85,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0xff,0xff,0xff,0xff,0x00,0x33,0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x02,0x6a,0x6a,\n   0x6a,0xc2,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x86,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x82,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x7e,0x7e,0x7e,0xc7,0x85,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,\n   0xdc,0xa0,0xa0,0xa0,0xd1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x86,0xdc,0xdc,0xdc,0xeb,0x00,0xbb,0xbb,0xbb,0xdc,0x87,0x00,0x00,0x00,0xb3,0x00,\n   0xef,0xef,0xef,0xf5,0x84,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,\n   0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x83,0xdc,0xdc,0xdc,0xeb,0x00,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x84,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,\n   0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,\n   0xff,0x8c,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x83,0xff,0xff,0xff,0xff,0x06,0xc7,0xc7,0xc7,0xe1,0x90,0x90,0x90,0xcc,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,\n   0xd6,0xef,0xef,0xef,0xf5,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x84,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,\n   0xbd,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x86,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x81,\n   0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x86,0xdc,0xdc,0xdc,0xeb,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,\n   0x83,0xdc,0xdc,0xdc,0xeb,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x83,0xdc,0xdc,0xdc,0xeb,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,\n   0xa0,0xd1,0x84,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x83,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,\n   0x85,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,\n   0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xaf,0xaf,0xaf,0xd6,0x01,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,\n   0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xa0,0xa0,0xa0,0xd1,0x81,\n   0x7e,0x7e,0x7e,0xc7,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xce,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x8a,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x83,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x87,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x8c,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,\n   0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,\n   0xd1,0x83,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x8d,0x00,0x00,0x00,0xb3,0x00,0xbb,\n   0xbb,0xbb,0xdc,0x88,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x83,0xff,0xff,0xff,0xff,\n   0x00,0xd2,0xd2,0xd2,0xe6,0x87,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x8a,0xff,\n   0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x8c,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xef,0xef,\n   0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,\n   0x86,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x83,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x83,0xff,\n   0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x84,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x85,0x00,0x00,0x00,\n   0xb3,0x00,0xef,0xef,0xef,0xf5,0x83,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x8b,0xff,0xff,0xff,0xff,0x00,\n   0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x8b,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x7e,0x7e,0x7e,0xc7,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,\n   0x8a,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x8c,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x8b,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x86,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x8e,0x00,0x00,0x00,0xb3,\n   0x00,0xd2,0xd2,0xd2,0xe6,0x88,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,\n   0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,\n   0x8a,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x8c,0xff,0xff,0xff,0xff,0x81,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,\n   0xff,0x00,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x00,\n   0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,\n   0xc7,0xe1,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,\n   0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,\n   0xff,0x84,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xef,0xef,0xef,0xf5,0x89,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,\n   0x82,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x8a,0xdc,\n   0xdc,0xdc,0xeb,0x00,0xbb,0xbb,0xbb,0xdc,0x88,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xd2,0xd2,0xd2,0xe6,0x88,0x00,0x00,0x00,\n   0xb3,0x82,0xdc,0xdc,0xdc,0xeb,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x8c,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xbb,0xbb,0xbb,0xdc,0x82,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x8b,0x00,0x00,\n   0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x90,0x00,0x00,\n   0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xd2,0xd2,0xd2,0xe6,0x88,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x8a,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,\n   0xc2,0x81,0x00,0x00,0x00,0xb3,0x8a,0xdc,0xdc,0xdc,0xeb,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x8c,0xdc,0xdc,0xdc,0xeb,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x83,0xdc,0xdc,0xdc,0xeb,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x83,0xdc,0xdc,0xdc,0xeb,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x85,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x84,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x82,0xdc,\n   0xdc,0xdc,0xeb,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xdc,0xdc,0xdc,0xeb,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,\n   0xb3,0x00,0x33,0x33,0x33,0xb8,0x82,0xdc,0xdc,0xdc,0xeb,0x00,0x90,0x90,0x90,0xcc,0x87,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x87,0xdc,0xdc,0xdc,0xeb,0x02,\n   0xbb,0xbb,0xbb,0xdc,0xa0,0xa0,0xa0,0xd1,0x33,0x33,0x33,0xb8,0x83,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x84,0xdc,0xdc,0xdc,0xeb,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x85,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xdc,\n   0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x83,0xdc,0xdc,0xdc,0xeb,0x00,0xc7,0xc7,0xc7,0xe1,0x86,0x00,0x00,0x00,\n   0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,\n   0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xa0,0xa0,0xa0,0xd1,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xce,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbd,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,\n   0xb8,0x94,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x82,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xcd,0x00,0x00,0x00,0xb3,0x82,0x7e,0x7e,0x7e,0xc7,0x00,\n   0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x02,0x04,0x04,0x13,0xb7,0x20,0x24,0xa9,0xdf,0x26,0x2e,0xd7,0xef,0x91,0x28,0x2f,0xd9,0xf0,0x02,0x26,0x2e,0xd7,0xef,0x1f,0x25,\n   0xa8,0xde,0x04,0x04,0x13,0xb7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x23,0x28,0xbb,0xe5,0x95,0x2e,0x37,0xff,0xff,0x00,0x22,0x27,0xb6,0xe4,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xf2,0x00,0x00,0x00,0xb3,0x00,0x2d,0x35,0xf7,0xfb,0x88,0x2e,0x37,0xff,0xff,0x00,0x26,0x2b,0xcb,0xea,0x81,0x20,0x25,0xad,0xe1,0x00,0x26,0x2b,0xcc,0xea,0x88,0x2e,\n   0x37,0xff,0xff,0x00,0x2c,0x34,0xf2,0xf9,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x28,0x30,0xde,0xf1,0x87,0x2e,0x37,0xff,0xff,0x00,0x24,0x2b,0xc4,0xe8,0x83,\n   0x00,0x00,0x00,0xb3,0x00,0x25,0x2a,0xc7,0xea,0x87,0x2e,0x37,0xff,0xff,0x00,0x26,0x2e,0xd7,0xef,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xf4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x13,0x17,0x68,0xcb,\n   0x87,0x2e,0x37,0xff,0xff,0x00,0x1f,0x25,0xab,0xe0,0x83,0x00,0x00,0x00,0xb3,0x00,0x1f,0x25,0xab,0xe0,0x87,0x2e,0x37,0xff,0xff,0x00,0x13,0x16,0x61,0xca,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xf3,0x00,0x00,0x00,0xb3,0x00,0x25,0x2c,0xcd,0xec,0x86,0x2e,0x37,0xff,0xff,0x01,0x26,0x2d,0xd2,0xed,0x01,0x01,0x05,0xb4,0x81,0x00,0x00,0x00,0xb3,0x01,0x01,\n   0x01,0x06,0xb4,0x27,0x2e,0xd6,0xef,0x86,0x2e,0x37,0xff,0xff,0x00,0x26,0x2b,0xcb,0xea,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xf5,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf3,0x00,0x00,0x00,0xb3,0x01,0x0d,0x0e,0x40,0xc1,0x2e,0x37,\n   0xfd,0xfe,0x86,0x2e,0x37,0xff,0xff,0x00,0x2b,0x31,0xe9,0xf5,0x81,0x28,0x2f,0xd9,0xf0,0x00,0x2b,0x31,0xe9,0xf6,0x86,0x2e,0x37,0xff,0xff,0x01,0x2d,0x36,0xfc,0xfe,\n   0x0c,0x0d,0x3b,0xc0,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf5,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf4,0x00,0x00,0x00,0xb3,0x00,0x20,0x26,0xb0,0xe1,0x91,0x2e,0x37,0xff,0xff,0x00,0x20,0x24,0xa9,0xdf,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf4,0x00,\n   0x00,0x00,0xb3,0x01,0x06,0x07,0x1e,0xb9,0x2c,0x34,0xf4,0xfb,0x84,0x2e,0x37,0xff,0xff,0x01,0x2e,0x37,0xfe,0xff,0x24,0x2b,0xc5,0xe8,0x81,0x20,0x25,0xad,0xe1,0x00,\n   0x25,0x2a,0xc6,0xe9,0x85,0x2e,0x37,0xff,0xff,0x01,0x2c,0x34,0xf2,0xfa,0x05,0x06,0x1b,0xb9,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xf6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf5,0x00,0x00,0x00,0xb3,0x00,0x19,0x1f,0x8b,0xd5,0x84,\n   0x2e,0x37,0xff,0xff,0x00,0x24,0x2a,0xc4,0xe8,0x83,0x00,0x00,0x00,0xb3,0x00,0x25,0x2a,0xc7,0xe9,0x84,0x2e,0x37,0xff,0xff,0x00,0x19,0x1d,0x85,0xd4,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf7,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xf5,0x00,0x00,0x00,0xb3,0x01,0x02,0x02,0x09,0xb5,0x2a,0x30,0xe4,0xf4,0x83,0x2e,0x37,0xff,0xff,0x00,0x1f,0x25,0xab,0xe0,0x83,0x00,0x00,0x00,0xb3,0x00,0x1f,0x25,\n   0xab,0xe0,0x83,0x2e,0x37,0xff,0xff,0x01,0x29,0x31,0xe2,0xf3,0x01,0x01,0x06,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf7,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf6,0x00,0x00,0x00,0xb3,0x00,0x13,0x16,0x62,0xca,0x83,0x2e,0x37,\n   0xff,0xff,0x00,0x1f,0x25,0xab,0xe0,0x83,0x00,0x00,0x00,0xb3,0x00,0x1f,0x25,0xab,0xe0,0x83,0x2e,0x37,0xff,0xff,0x00,0x11,0x14,0x5c,0xc8,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf8,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf7,0x00,\n   0x00,0x00,0xb3,0x00,0x26,0x2b,0xcc,0xea,0x82,0x2e,0x37,0xff,0xff,0x00,0x1f,0x25,0xab,0xe0,0x83,0x00,0x00,0x00,0xb3,0x00,0x1f,0x25,0xab,0xe0,0x82,0x2e,0x37,0xff,\n   0xff,0x00,0x24,0x2b,0xc5,0xe9,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf9,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf7,0x00,0x00,0x00,0xb3,0x01,0x0c,0x0d,0x3b,0xc0,0x2d,0x36,0xfc,0xfe,0x81,0x2e,0x37,0xff,0xff,0x00,0x1f,0x25,0xab,\n   0xe0,0x83,0x00,0x00,0x00,0xb3,0x00,0x1f,0x25,0xab,0xe0,0x81,0x2e,0x37,0xff,0xff,0x01,0x2d,0x36,0xfb,0xfe,0x0a,0x0c,0x36,0xbf,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf9,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf8,0x00,0x00,0x00,\n   0xb3,0x00,0x20,0x24,0xa9,0xdf,0x81,0x2e,0x37,0xff,0xff,0x00,0x21,0x26,0xb2,0xe2,0x83,0x00,0x00,0x00,0xb3,0x00,0x21,0x26,0xb2,0xe2,0x81,0x2e,0x37,0xff,0xff,0x00,\n   0x1f,0x24,0xa4,0xde,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfa,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf8,0x00,0x00,0x00,0xb3,0x04,0x05,0x06,0x1b,0xb9,0x2c,0x34,0xf3,0xfa,0x2e,0x37,0xff,0xff,0x2c,0x34,0xf3,0xfa,0x14,0x16,0x65,\n   0xcb,0x81,0x0d,0x0f,0x44,0xc2,0x04,0x14,0x17,0x67,0xcb,0x2c,0x34,0xf4,0xfb,0x2e,0x37,0xff,0xff,0x2b,0x33,0xf1,0xf9,0x05,0x05,0x17,0xb8,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfa,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf9,0x00,\n   0x00,0x00,0xb3,0x00,0x19,0x1d,0x85,0xd4,0x87,0x2e,0x37,0xff,0xff,0x00,0x18,0x1c,0x81,0xd2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xfb,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf9,0x00,0x00,0x00,0xb3,0x01,0x02,0x02,0x07,0xb4,0x29,\n   0x31,0xe2,0xf3,0x85,0x2e,0x37,0xff,0xff,0x01,0x28,0x30,0xdf,0xf2,0x01,0x01,0x05,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xfb,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfa,0x00,0x00,0x00,0xb3,0x00,0x12,0x14,0x5d,0xc8,0x85,0x2e,\n   0x37,0xff,0xff,0x00,0x10,0x13,0x56,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfb,0x00,0x00,0x00,0xb3,0x00,0x25,0x2a,0xc6,0xe9,0x83,0x2e,0x37,0xff,0xff,0x00,0x23,0x2a,0xc2,0xe7,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xfb,0x00,0x00,0x00,0xb3,0x01,0x0a,0x0c,0x36,0xbf,0x2e,0x36,0xf9,0xfc,0x81,0x2e,0x37,0xff,0xff,0x01,0x2c,0x35,0xf8,0xfc,0x09,0x0a,0x30,0xbd,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xfc,0x00,0x00,0x00,0xb3,0x03,0x10,0x12,0x52,0xc6,0x25,0x2a,0xc7,0xe9,0x25,0x2a,0xc6,0xe9,0x0f,0x10,0x4d,0xc5,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x52,0x55,0x45,0x56,0x49,0x53,0x49,0x4f,0x4e,0x2d,0x58,0x46,\n   0x49,0x4c,0x45,0x2e,0x00\n};\n"
  },
  {
    "path": "externals/ovr/Src/Displays/OVR_Display.cpp",
    "content": "/************************************************************************************\n\nPublicHeader:   None\nFilename    :   OVR_Display.cpp\nContent     :   Common implementation for display device\nCreated     :   May 6, 2014\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_Display.h\"\n\nnamespace OVR {\n\n\n// Place platform-independent code here\n\n\n} // namespace OVR\n"
  },
  {
    "path": "externals/ovr/Src/Displays/OVR_Display.h",
    "content": "/************************************************************************************\n\nPublicHeader:   None\nFilename    :   OVR_Display.h\nContent     :   Contains platform independent display management\nCreated     :   May 6, 2014\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Display_h\n#define OVR_Display_h\n\n#include \"../Sensors/OVR_DeviceConstants.h\" // Required for HmdTypeEnum\n\n#include \"../Kernel/OVR_Types.h\"\n#include \"../Kernel/OVR_Atomic.h\"\n#include \"../Kernel/OVR_RefCount.h\"\n#include \"../Kernel/OVR_Array.h\"\n#include \"../Kernel/OVR_String.h\"\n#include \"../Kernel/OVR_Math.h\"\n\nnamespace OVR {\n\n\nclass DisplaySearchHandle : virtual public RefCountBaseV<DisplaySearchHandle>\n{\npublic:\n\tDisplaySearchHandle() {}\n\n\tvirtual ~DisplaySearchHandle() {}\n\n\tvoid operator= (const DisplaySearchHandle&) {}\n};\n\n//-------------------------------------------------------------------------------------\n// ***** Display\n\n// Display object describes an Oculus HMD screen in LibOVR, providing information such\n// as EDID serial number and resolution in platform-independent manner.\n//\n// Display is an abstract base class to support OS and driver specific implementations.\n// It support HMD screen enumeration through GetDisplayCount/GetDisplay static functions.\n//\n// Examples of implementations of Display are the following:\n// Display_Win32_Generic - Compatibly mode implementation that maintains operation on\n//\t\t\t\t\t\t   systems without drivers.\n// Display_Win32_Driver  - Driver-Based display\n// Display_OSX_Generic   - Additional compatibility mode implementation for OS X\n\nclass Display : public RefCountBase<Display>\n{\nprotected:\n\tenum MirrorMode\n\t{\n\t\tMirrorEnabled = 0,\n\t\tMirrorDisabled = 1\n\t};\n\n\tMirrorMode mirrorMode;\n\n\tDisplay(\n            HmdTypeEnum deviceTypeGuess,\n#ifdef OVR_OS_MAC\n            uint32_t displayID,\n#else\n\t\t\tconst String& displayID,\n#endif\n\t\t\tconst String& modelName,\n\t\t\tconst String& editSerial,\n            const Sizei& logicalRes,\n\t\t\tconst Sizei& nativeRes,\n\t\t\tconst Vector2i& displayOffset, \n\t\t\tconst uint64_t devNumber,\n\t\t\tconst uint32_t rotation,\n\t\t\tconst bool appExclusive):\n\t\tmirrorMode(MirrorDisabled),\n\t\tDeviceTypeGuess(deviceTypeGuess),\n        DisplayID(displayID),\n\t\tModelName(modelName),\n\t\tEdidSerialNumber(editSerial),\n\t\tLogicalResolutionInPixels(logicalRes),\n\t\tNativeResolutionInPixels(nativeRes),\n\t\tDesktopDisplayOffset(displayOffset),\n\t\tDeviceNumber(devNumber),\n\t\tRotation(rotation),\n\t\tApplicationExclusive(appExclusive)\n    {\n\t}\n\n    void operator = (const Display&) { } // Quiet warning.\n\npublic:\n\tvirtual ~Display() { }\n\n\t// ----- Platform specific static Display functionality -----\n\n\t// Mandatory function that sets up the display environment with\n\t// any necessary shimming and function hooks. This should be one\n\t// of the very first things your application does when it\n\t// initializes LibOVR\n\tstatic bool         Initialize();\n\n\t// Returns a count of the detected displays. These are Rift displays\n\t// attached directly to an active display port\n\tstatic int          GetDisplayCount( DisplaySearchHandle* handle = NULL, bool extended = true, bool applicationOnly = true, bool extendedEDIDSerials = false );\n\t// Returns a specific index of a display. Displays are sorted in no particular order.\n\tstatic Ptr<Display> GetDisplay( int index = 0, DisplaySearchHandle* handle = NULL ); \n\n\n    // Returns true if we are referencing the same display; useful for matching display\n    // objects with the ones already detected.\n    bool MatchDisplay(const Display* other)\n    {\n\t\t// Note this is not checking the DeviceName, which corresponds to which monitor the device is.\n\t\t// This allows matching to match a display that has changed how it is plugged in.\n\t\treturn (DisplayID == other->DisplayID) &&\n               (EdidSerialNumber == other->EdidSerialNumber) &&\n               (NativeResolutionInPixels == other->NativeResolutionInPixels) &&\n               (DesktopDisplayOffset == other->DesktopDisplayOffset) &&\n               (ApplicationExclusive == other->ApplicationExclusive);\n    }\n\n\n\t// ----- Device independent instance based Display functionality -----\n\n    // Device type guess based on display info.\n    const HmdTypeEnum   DeviceTypeGuess;\n#if defined(OVR_OS_MAC)\n    // CGDirectDisplayID for the rift.\n    const uint32_t      DisplayID; \n#else\n\t// A string denoting the display device name so that apps can recognize the monitor\n\tconst String        DisplayID;\n#endif\n    // A literal string containing the name of the model, i.e. Rift DK2\n    const String        ModelName;\n    // Part of the serial number encoded in Edid, used for monitor <-> sensor matching.\n    const String        EdidSerialNumber;\n    // Logical resolution is the display resolution in presentation terms.\n    // That is to say, the resolution that represents the orientation the\n    // display is projected to the user. For DK2, while being a portrait display\n    // the display is held in landscape and therefore the logical resolution\n    // is 1920x1080\n    const Sizei         LogicalResolutionInPixels;\n    // Native resolution is the resolution reported by the EDID and represents the\n    // exact hardware resolution of the Rift. For example, on DK2\n    // this is 1080x1920\n    // In theory, an OS rotated Rift's native and logical resolutions should match\n    const Sizei         NativeResolutionInPixels;\n    // For displays that are attached to the desktop, this return value has meaning.\n    // Otherwise it should always return origin\n    const Vector2i      DesktopDisplayOffset;\n\t// For Windows machines this value stores the ChildUid used to identify this display\n\tconst uint64_t\t    DeviceNumber;\n\t// Stores the device specific default rotation of the screen\n\t// E.g. DK2 is rotated 90 degrees as it is a portrait display\n\tconst uint32_t\t    Rotation;\n\t// Is set if the Display is capable in Application-Only mode\n\tconst bool\t\t\tApplicationExclusive;\n\n\t// Functionality for rendering within the window\n\tvirtual MirrorMode SetMirrorMode( MirrorMode newMode ) = 0;\n\n\t// Functionality for enabling/disabling display\n    virtual bool SetDisplaySleep(bool off)\n    {\n        // Override to implement if supported\n        OVR_UNUSED(off);\n        return false;\n    }\n\n    // Check if right now the current rendering application should be in compatibility mode\n    static bool InCompatibilityMode( bool displaySearch = true );\n\n    // Get/set the mode for all applications\n    static bool GetDriverMode(bool& driverInstalled, bool& compatMode, bool& hideDK1Mode);\n    static bool SetDriverMode(bool compatMode, bool hideDK1Mode);\n\n    static DisplaySearchHandle* GetDisplaySearchHandle();\n};\n\n\n} // namespace OVR\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Displays/OVR_OSX_Display.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_OSX_Display.cpp\nContent     :   OSX-specific Display declarations\nCreated     :   July 2, 2014\nAuthors     :   James Hughes\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include \"OVR_OSX_Display.h\"\n#include \"../Kernel/OVR_Log.h\"\n\n#include <ApplicationServices/ApplicationServices.h>\n#include <CoreFoundation/CoreFoundation.h>\n#include <CoreFoundation/CFString.h>\n#include <IOKit/graphics/IOGraphicsLib.h>\n\n//-------------------------------------------------------------------------------------\n// ***** Display enumeration Helpers\n\nnamespace OVR { \n\n// FIXME Code duplication with windows.\n#define EDID_LENGTH                             0x80\n\n#define EDID_HEADER                             0x00\n#define EDID_HEADER_END                         0x07\n\n#define ID_MANUFACTURER_NAME                    0x08\n#define ID_MANUFACTURER_NAME_END                0x09\n\n#define EDID_STRUCT_VERSION                     0x12\n#define EDID_STRUCT_REVISION                    0x13\n\n#define ESTABLISHED_TIMING_1                    0x23\n#define ESTABLISHED_TIMING_2                    0x24\n#define MANUFACTURERS_TIMINGS                   0x25\n\n#define DETAILED_TIMING_DESCRIPTIONS_START      0x36\n#define DETAILED_TIMING_DESCRIPTION_SIZE        18\n#define NO_DETAILED_TIMING_DESCRIPTIONS         4\n\n#define DETAILED_TIMING_DESCRIPTION_1           0x36\n#define DETAILED_TIMING_DESCRIPTION_2           0x48\n#define DETAILED_TIMING_DESCRIPTION_3           0x5a\n#define DETAILED_TIMING_DESCRIPTION_4           0x6c\n\n#define MONITOR_NAME            0xfc\n#define MONITOR_LIMITS          0xfd\n#define MONITOR_SERIAL\t\t\t0xff\n\n#define UNKNOWN_DESCRIPTOR      -1\n#define DETAILED_TIMING_BLOCK   -2\n\n#define DESCRIPTOR_DATA         5\n\nconst UByte edid_v1_header[] = { 0x00, 0xff, 0xff, 0xff,\n\t                            0xff, 0xff, 0xff, 0x00 };\n\nconst UByte edid_v1_descriptor_flag[] = { 0x00, 0x00 };\n\n// FIXME Code duplication with windows. Refactor.\nstatic int blockType( UByte* block )\n{\n\tif ( !strncmp( (const char*)edid_v1_descriptor_flag, (const char*)block, 2 ) )\n\t{\n\t\t// descriptor\n\t\tif ( block[ 2 ] != 0 )\n\t\t\treturn UNKNOWN_DESCRIPTOR;\n\t\treturn block[ 3 ];\n\t}\n    else\n    {\t\t\n\t\treturn DETAILED_TIMING_BLOCK;\n\t}\n}\n\nstatic char* getMonitorName( UByte const* block )\n{\n\tstatic char name[ 13 ];\n\tunsigned    i;\n\tUByte const* ptr = block + DESCRIPTOR_DATA;\n\n\tfor( i = 0; i < 13; i++, ptr++ )\n\t{\n\t\tif ( *ptr == 0xa )\n\t\t{\n\t\t\tname[ i ] = 0;\n\t\t\treturn name;\n\t\t}\n\n\t\tname[ i ] = *ptr;\n\t}\n\n\treturn name;\n}\n\n// FIXME Code duplication with windows. Refactor.\nstatic bool parseEdid( UByte* edid, OVR::OSX::DisplayEDID& edidResult )\n{\n    unsigned i;\n    UByte* block;\n    const char* monitor_name = \"Unknown\";\n    UByte checksum = 0;\n\n    for( i = 0; i < EDID_LENGTH; i++ )\n        checksum += edid[ i ];\n\n    // Bad checksum, fail EDID\n    if (  checksum != 0  )\n        return false;\n\n    if ( strncmp( (const char*)edid+EDID_HEADER, (const char*)edid_v1_header, EDID_HEADER_END+1 ) )\n    {\n        // First bytes don't match EDID version 1 header\n        return false;\n    }\n\n\n    // OVR_DEBUG_LOG_TEXT(( \"\\n# EDID version %d revision %d\\n\",\n    //                     (int)edid[EDID_STRUCT_VERSION],(int)edid[EDID_STRUCT_REVISION] ));\n\n    // Monitor name and timings \n\n    char serialNumber[14];\n    memset( serialNumber, 0, 14 );\n\n    block = edid + DETAILED_TIMING_DESCRIPTIONS_START;\n\n    for( i = 0; i < NO_DETAILED_TIMING_DESCRIPTIONS; i++,\n        block += DETAILED_TIMING_DESCRIPTION_SIZE )\n    {\n\n        if ( blockType( block ) == MONITOR_NAME )\n        {\n            monitor_name = getMonitorName( block );\n        }\n\n        if( blockType( block ) == MONITOR_SERIAL )\n        {\n            memcpy( serialNumber, block + 5, 13 );\n            break;\n        }\n    }\n\n    UByte vendorString[4] = {0};\n\n    vendorString[0] = (edid[8] >> 2 & 31) + 64;\n    vendorString[1] = ((edid[8] & 3) << 3) | (edid[9] >> 5) + 64;\n    vendorString[2] = (edid[9] & 31) + 64;\n\n    edidResult.ModelNumber  = *(UInt16*)&edid[10];\n    edidResult.MonitorName  = OVR::String(monitor_name);\n    edidResult.VendorName   = OVR::String((const char*)vendorString);\n    edidResult.SerialNumber = OVR::String(serialNumber);\n    \n    // printf( \"\\tIdentifier \\\"%s\\\"\\n\", monitor_name );\n    // printf( \"\\tVendorName \\\"%s\\\"\\n\", vendorString );\n    // printf( \"\\tModelName \\\"%s\\\"\\n\", monitor_name );\n    // printf( \"\\tModelNumber %d\\n\", edidResult.ModelNumber );\n    // printf( \"\\tSerialNumber \\\"%s\\\"\\n\", edidResult.SerialNumber.ToCStr() );\n\n    // FIXME: Get timings as well, though they aren't very useful here\n    // except for the vertical refresh rate, presumably\n\n    return true;\n}\n\nstatic int discoverExtendedRifts(OVR::OSX::DisplayDesc* descriptorArray, int inputArraySize, bool edidInfo)\n{\n    OVR_UNUSED(edidInfo);\n    int result = 0;\n\n    static bool reportDiscovery = true;\n    OVR_UNUSED(reportDiscovery);\n\n    CGDirectDisplayID Displays[32];\n    uint32_t NDisplays = 0;\n    CGGetOnlineDisplayList(32, Displays, &NDisplays);\n\n    for (unsigned int i = 0; i < NDisplays; i++)\n    {\n        io_service_t port = CGDisplayIOServicePort(Displays[i]);\n        CFDictionaryRef DispInfo = IODisplayCreateInfoDictionary(port, kNilOptions);\n\n        // Display[i]\n\n        uint32_t vendor = CGDisplayVendorNumber(Displays[i]);\n        uint32_t product = CGDisplayModelNumber(Displays[i]);\n\n        CGRect desktop = CGDisplayBounds(Displays[i]);\n        Vector2i desktopOffset(desktop.origin.x, desktop.origin.y);\n        \n        if (vendor == 16082 && ( (product == 1)||(product == 2)||(product == 3) ) ) // 7\" or HD\n        {\n            if( result >= inputArraySize )\n            {\n                CFRelease(DispInfo);\n                return result;\n            }\n\n            Sizei    monitorResolution(1280, 800);                \n            \n            // Obtain and parse EDID data.\n            CFDataRef data = \n                (CFDataRef)CFDictionaryGetValue(DispInfo, CFSTR(kIODisplayEDIDKey));\n            if (!data)\n            {\n                CFRelease(DispInfo);\n                OVR::LogError(\"[OSX Display] Unable to obtain EDID for Oculus product %d\", product);\n                continue;\n            }\n            UByte* edid = (UByte*)CFDataGetBytePtr(data);\n            OSX::DisplayEDID edidResult;\n            parseEdid( edid, edidResult );\n\n            OVR::OSX::DisplayDesc& desc = descriptorArray[result++];\n            desc.DisplayID          = Displays[i];\n            desc.ModelName          = edidResult.MonitorName;   // User friendly string.\n            desc.EdidSerialNumber   = edidResult.SerialNumber;\n            desc.LogicalResolutionInPixels  = monitorResolution;\n            desc.DesktopDisplayOffset       = desktopOffset;\n\n            switch (product)\n            {\n                case 3: desc.DeviceTypeGuess = HmdType_DK2;       break;\n                case 2: desc.DeviceTypeGuess = HmdType_DKHDProto; break;\n                case 1: desc.DeviceTypeGuess = HmdType_DK1;       break;\n\n                default:\n                case 0: desc.DeviceTypeGuess = HmdType_Unknown;   break;\n            }\n\n            // Hard-coded defaults in case the device doesn't have the data itself.\n            // DK2 prototypes (0003) or DK HD Prototypes (0002)                \n            if (product == 3 || product == 2)\n            {\n                desc.LogicalResolutionInPixels  = Sizei(1920, 1080);\n                desc.NativeResolutionInPixels   = Sizei(1080, 1920);\n            }\n            else\n            {\n                desc.LogicalResolutionInPixels  = monitorResolution;\n                desc.NativeResolutionInPixels   = monitorResolution;\n            }\n\n            //OVR_DEBUG_LOG_TEXT((\"Display Found %x:%x\\n\", vendor, product));\n        }\n        CFRelease(DispInfo);\n    }\n\n    return result;\n}\n\n\n//-------------------------------------------------------------------------------------\n// ***** Display \n\nbool Display::Initialize()\n{\n    // Nothing to initialize. OS X only supports compatibility mode.\n    return true;\n}\n\n\nbool Display::GetDriverMode(bool& driverInstalled, bool& compatMode, bool& hideDK1Mode)\n{\n    driverInstalled = false;\n    compatMode = true;\n    hideDK1Mode = false;\n    return true;\n}\n\nbool Display::SetDriverMode(bool /*compatMode*/, bool /*hideDK1Mode*/)\n{\n    return false;\n}\n\nDisplaySearchHandle* Display::GetDisplaySearchHandle()\n{\n\treturn new OSX::OSXDisplaySearchHandle();\n}\n\nbool Display::InCompatibilityMode( bool displaySearch )\n{\n\tOVR_UNUSED( displaySearch );\n    return true;\n}\n\nint Display::GetDisplayCount( DisplaySearchHandle* handle, bool extended, bool applicationOnly, bool edidInfo )\n{\n    OVR_UNUSED(applicationOnly);\n\n\tstatic int extendedCount = -1;\n\n\tOSX::OSXDisplaySearchHandle* localHandle = (OSX::OSXDisplaySearchHandle*)handle;\n    if (localHandle == NULL)\n    {\n        OVR::LogError(\"[OSX Display] No search handle passed into GetDisplayCount. Return 0 rifts.\");\n        return 0;\n    }\n\n    if (extendedCount == -1 || extended)\n    {\n        extendedCount = discoverExtendedRifts(localHandle->cachedDescriptorArray, OSX::OSXDisplaySearchHandle::DescArraySize, edidInfo);\n    }\n\n\tlocalHandle->extended = true;\n\tlocalHandle->extendedDisplayCount = extendedCount;\n\tint totalCount = extendedCount;\n\n    /// FIXME: Implement application mode for OS X.\n    localHandle->application = false;\n    localHandle->applicationDisplayCount = 0;\n\n    localHandle->displayCount = totalCount;\n\n    return totalCount;\n}\n\nPtr<Display> Display::GetDisplay( int index, DisplaySearchHandle* handle )\n{\n    Ptr<Display> result = NULL;\n\n    if (index < 0)\n    {\n        OVR::LogError(\"[OSX Display] Invalid index given to GetDisplay.\");\n        return NULL;\n    }\n\n\tOSX::OSXDisplaySearchHandle* localHandle = (OSX::OSXDisplaySearchHandle*)handle;\n    if (localHandle == NULL)\n    {\n        OVR::LogError(\"[OSX Display] No search handle passed into GetDisplay. Return 0 rifts.\");\n        return NULL;\n    }\n\n    if (localHandle->extended)\n    {\n        if (index >= 0 && index < (int)localHandle->extendedDisplayCount)\n        {\n            return *new OSX::OSXDisplayGeneric(localHandle->cachedDescriptorArray[index]);\n        }\n\n        // index -= localHandle->extendedDisplayCount;\n    }\n\n    if (localHandle->application)\n    {\n        OVR::LogError(\"[OSX Display] Mac does not support application displays.\");\n    }\n\n    return result;\n}\n} // namespace OVR\n"
  },
  {
    "path": "externals/ovr/Src/Displays/OVR_OSX_Display.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_OSX_Display.h\nContent     :   OSX-specific Display declarations\nCreated     :   July 2, 2014\nAuthors     :   James Hughes\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_OSX_Display_h\n#define OVR_OSX_Display_h\n\n#include \"OVR_Display.h\"\n\nnamespace OVR { namespace OSX {\n\n\n//-------------------------------------------------------------------------------------\n// DisplayDesc\n\n// Display information enumerable through OS .\n// TBD: Should we just move this to public header, so it's a const member of Display?\nstruct DisplayDesc\n{\n    DisplayDesc() :\n        DeviceTypeGuess(HmdType_None),\n        DisplayID(0),\n        LogicalResolutionInPixels(0),\n        NativeResolutionInPixels(0)\n    {}\n\n    HmdTypeEnum DeviceTypeGuess;\n    uint32_t    DisplayID; // This is the device identifier string from MONITORINFO (for app usage)\n    String      ModelName; // This is a \"DK2\" type string\n    String      EdidSerialNumber;\n    Sizei       LogicalResolutionInPixels;\n    Sizei       NativeResolutionInPixels;\n    Vector2i    DesktopDisplayOffset;\n};\n\n\n//-------------------------------------------------------------------------------------\n// DisplayEDID\n\n// Describes EDID information as reported from our display driver.\nstruct DisplayEDID\n{\n    DisplayEDID() :\n        ModelNumber(0)\n    {}\n\n    String MonitorName;\n    UInt16 ModelNumber;\n    String VendorName;\n    String SerialNumber;\n};\n\n//-------------------------------------------------------------------------------------\n// OSX Display Search Handle\nclass OSXDisplaySearchHandle : public DisplaySearchHandle\n{\npublic:\n    OSXDisplaySearchHandle() :\n        extended(false),\n        application(false),\n        extendedDisplayCount(0),\n        applicationDisplayCount(0),\n        displayCount(0)\n    {}\n    virtual ~OSXDisplaySearchHandle()   {}\n\n    static const int DescArraySize = 16;\n\n    OSX::DisplayDesc    cachedDescriptorArray[DescArraySize];\n    bool                extended;\n    bool                application;\n    int                 extendedDisplayCount;\n    int                 applicationDisplayCount;\n    int                 displayCount;\n};\n\n//-------------------------------------------------------------------------------------\n// OSXDisplayGeneric\n\n// Describes OSX display in Compatibility mode, containing basic data\nclass OSXDisplayGeneric : public Display\n{\npublic:\n    OSXDisplayGeneric( const DisplayDesc& dd ) :\n        Display(dd.DeviceTypeGuess,\n                dd.DisplayID,\n                dd.ModelName,\n                dd.EdidSerialNumber,\n                dd.LogicalResolutionInPixels,\n                dd.NativeResolutionInPixels,\n                dd.DesktopDisplayOffset,\n                0,\n                0,\n\t\t\t\tfalse)\n    {\n    }\n\n    virtual ~OSXDisplayGeneric()\n    {\n    }\n\n    virtual bool InCompatibilityMode() const\n    {\n        return true;\n    }\n\n    // Generic displays are not capable of mirroring\n    virtual MirrorMode SetMirrorMode( MirrorMode newMode ) \n    { \n        OVR_UNUSED( newMode ); \n        return MirrorDisabled; \n    } \n};\n\n}} // namespace OVR::OSX\n\n#endif // OVR_OSX_Display_h\n"
  },
  {
    "path": "externals/ovr/Src/Displays/OVR_OSX_FocusObserver.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_OSX_FocusObserver.h\nContent     :   Observer for app focus on OSX\nCreated     :   August 5, 2014\nAuthors     :   Jordan Tritell\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\nOVR_PRIVATE_FILE\n\n#ifndef OVR_OSX_FocusObserver_h\n#define OVR_OSX_FocusObserver_h\n\n#include \"../Kernel/OVR_Threads.h\"\n#include \"../Kernel/OVR_System.h\"\n#include \"../Kernel/OVR_Lockless.h\"\n\n#include \"../Service/Service_NetServer.h\"\n\nnamespace OVR { namespace OSX{\n\n    struct FocusNotifierImpl;\n    \nclass AppFocusObserver : public SystemSingletonBase<AppFocusObserver>    \n{\n    OVR_DECLARE_SINGLETON(AppFocusObserver);\n    \npublic:\n    Lock ListLock;\n    Array<pid_t> AppList;\n    Service::NetServerListener *listener;\n    FocusNotifierImpl* impl;\n    \n    void OnProcessFocus(pid_t pid);\n    void SetListener(Service::NetServerListener *_listener);\n    \n    pid_t LastProcessId;\n    pid_t ActiveProcessId;\n    void AddProcess(pid_t pid);\n    void nextProcess();\n    void RemoveProcess(pid_t pid);\n    \n    \nprotected:\n    void onAppFocus(pid_t pid);\n    \n    pid_t LastAppFocus;\n    \n};\n    \n    \n \n}} // namespace OVR, OSX\n\n\n#endif /* OVR_OSX_FocusObserver_h */\n\n"
  },
  {
    "path": "externals/ovr/Src/Displays/OVR_OSX_FocusObserver.mm",
    "content": "/************************************************************************************\r\n\r\nFilename    :   OVR_OSX_FocusObserver.mm\r\nContent     :   Observer for app focus on OSX\r\nCreated     :   August 5, 2014\r\nAuthors     :   Jordan Tritell\r\n\r\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\r\n\r\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\r\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\r\nwhich is provided at the time of installation or download, or which\r\notherwise accompanies this software in either electronic or hard copy form.\r\n\r\nYou may obtain a copy of the License at\r\n\r\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\r\n\r\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n\r\n*************************************************************************************/\r\n\r\nOVR_PRIVATE_FILE\r\n\r\n#include \"OVR_OSX_FocusObserver.h\"\r\n\r\n#include \"../Service/Service_NetServer.h\"\r\n#include \"OVR_DisplayEnumerator.h\"\r\n\r\n#include <Cocoa/Cocoa.h>\r\n\r\nOVR_DEFINE_SINGLETON(OVR::OSX::AppFocusObserver);\r\n\r\nextern bool ServiceRunningFlag;\r\n\r\n@interface FocusNotifier : NSObject <NSApplicationDelegate>{\r\n    NSWindow *window;\r\n}\r\n\r\n- (void)start;\r\n\r\n@property (assign) IBOutlet NSWindow *window;\r\n\r\n@end\r\n\r\n\r\n@implementation FocusNotifier\r\n\r\n@synthesize window;\r\n\r\n- (void) addActivationObserver\r\n{\r\n    //subscribe to focus notifications from the workspace\r\n\t[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self\r\n                                                           selector:@selector(activated:)\r\n                                                               name:NSWorkspaceDidActivateApplicationNotification\r\n                                                             object:nil];\r\n    \r\n    //subscribe to termination notifications from the workspace\r\n\t[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self\r\n                                                           selector:@selector(terminated:)\r\n                                                               name:NSWorkspaceDidTerminateApplicationNotification\r\n                                                             object:nil];\r\n}\r\n\r\n-(void) activated:(NSNotification *)notification\r\n{\r\n    NSRunningApplication *app = [[notification userInfo] objectForKey:@\"NSWorkspaceApplicationKey\"];\r\n    pid_t pid = [app processIdentifier];\r\n    OVR::OSX::AppFocusObserver::GetInstance()->OnProcessFocus(pid);\r\n    //    NSLog(@\"Activated: %@\", [activatedApp bundleIdentifier]);\r\n}\r\n\r\n-(void) terminated:(NSNotification *)notification\r\n{\r\n    NSRunningApplication *app = [[notification userInfo] objectForKey:@\"NSWorkspaceApplicationKey\"];\r\n    pid_t pid = [app processIdentifier];\r\n    OVR::OSX::AppFocusObserver::GetInstance()->RemoveProcess(pid);\r\n    //    NSLog(@\"Activated: %@\", [activatedApp bundleIdentifier]);\r\n}\r\n\r\n- (void)start\r\n{\r\n    //initialize with relevant variables\r\n    [self addActivationObserver];\r\n}\r\n\r\n@end\r\n\r\n\r\nnamespace OVR { namespace OSX{\r\n\r\nstruct FocusNotifierImpl\r\n{\r\n    FocusNotifier* wrapped;\r\n};\r\n    \r\nAppFocusObserver::AppFocusObserver():\r\n    impl(new FocusNotifierImpl),\r\n    listener(NULL)\r\n{\r\n    //initialize with correct values\r\n    impl->wrapped = [[FocusNotifier alloc] init];\r\n    [impl->wrapped start];\r\n    ActiveProcessId = 0;\r\n}\r\n\r\nAppFocusObserver::~AppFocusObserver()\r\n{\r\n    [impl->wrapped dealloc];\r\n    delete impl;\r\n}\r\n\r\nvoid AppFocusObserver::SetListener(Service::NetServerListener *_listener)\r\n{\r\n    listener = _listener;\r\n}\r\n\r\nvoid AppFocusObserver::OnSystemDestroy()\r\n{\r\n}\r\n\r\nvoid AppFocusObserver::OnProcessFocus(pid_t pid)\r\n{\r\n    // If the process changed,\r\n    if (pid != LastProcessId)\r\n    {\r\n        LastProcessId = pid;\r\n        \r\n        Lock::Locker locker(&ListLock);\r\n        \r\n        // Find the process id in the list\r\n        const int count = AppList.GetSizeI();\r\n        for (int i = 0; i < count; ++i)\r\n        {\r\n            // If it is a rift process,\r\n            if (AppList[i] == pid)\r\n            {\r\n                onAppFocus(pid);\r\n                OVR_DEBUG_LOG((\"[AppFocusObserver] Oculus Process getting focus: pid=%d\", pid));\r\n                return;\r\n           }\r\n        }\r\n        \r\n        OVR_DEBUG_LOG((\"[AppFocusObserver] Focus change: %d (non-Oculus process)\", pid));\r\n    }\r\n}\r\n\r\nvoid AppFocusObserver::AddProcess(pid_t pid)\r\n{\r\n    Lock::Locker locker(&ListLock);\r\n    \r\n    // If it already exists in the array,\r\n    const int count = AppList.GetSizeI();\r\n    for (int i = 0; i < count; ++i)\r\n    {\r\n        // If we found it,\r\n        if (AppList[i] == pid)\r\n        {\r\n            return;\r\n        }\r\n    }\r\n    \r\n    // If the process being added is already in focus,\r\n    if (pid == LastProcessId)\r\n    {\r\n        // Set the active process\r\n        OVR_DEBUG_LOG((\"[AppFocusObserver] AddProcess: Recognizing the newly added process as in-focus pid=%d\", pid));\r\n    }\r\n    \r\n    // Add it to the list\r\n    AppList.PushBack(pid);\r\n}\r\n\r\nvoid AppFocusObserver::nextProcess()\r\n{\r\n    Lock::Locker locker(&ListLock);\r\n    \r\n    int count = AppList.GetSizeI();\r\n    \r\n    // Pick the next available rift process\r\n    if (count > 0)\r\n    {\r\n        ActiveProcessId = AppList[0];\r\n        OVR_DEBUG_LOG((\"[AppFocusObserver] NextProcess: Switching active rift process to pid=%d\", ActiveProcessId));\r\n        onAppFocus(ActiveProcessId);\r\n        return;\r\n    }\r\n    \r\n    // No process to use\r\n    onAppFocus(ActiveProcessId);\r\n    OVR_DEBUG_LOG((\"[AppFocusObserver] NextProcess: No remaining rift processes\"));\r\n}\r\n\r\n\r\nvoid AppFocusObserver::onAppFocus(pid_t pid)\r\n{\r\n    // Note: This is not necessarily the same as the FocusState->ActiveProcessId.\r\n    \r\n    ActiveProcessId = pid;\r\n    \r\n    if (ActiveProcessId == 0) return;\r\n    \r\n    if (pid != LastAppFocus)\r\n    {\r\n        LastAppFocus = pid;\r\n        if(listener){\r\n            listener->onFocusChange(pid);\r\n        }\r\n//        FocusSubject->Call(pid);\r\n    }\r\n}\r\n\r\nvoid AppFocusObserver::RemoveProcess(pid_t pid)\r\n{\r\n    Lock::Locker locker(&ListLock);\r\n    \r\n    // Find the pid in the app list:\r\n    const int count = AppList.GetSizeI();\r\n    for (int i = 0; i < count; ++i)\r\n    {\r\n        // If the app was found,\r\n        if (AppList[i] == pid)\r\n        {            \r\n            // Remove from list here\r\n            AppList.RemoveAtUnordered(i);\r\n            \r\n            // If the removed process is the active one,\r\n            if (ActiveProcessId == pid)\r\n            {\r\n                OVR_DEBUG_LOG((\"[AppFocusObserver] RemoveProcess: Active process going away\"));\r\n                // Find a new active process\r\n                nextProcess();\r\n            }\r\n            \r\n            break;\r\n        }\r\n    }\r\n}\r\n}} //namespace OVR::OSX\r\n\r\n"
  },
  {
    "path": "externals/ovr/Src/Displays/OVR_OSX_FocusReader.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_OSX_FocusReader.h\nContent     :   Reader for current app with focus on OSX\nCreated     :   August 5, 2014\nAuthors     :   Jordan Tritell\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\nOVR_PRIVATE_FILE\n\n#ifndef OVR_OSX_FocusReader_h\n#define OVR_OSX_FocusReader_h\n\n#import <Cocoa/Cocoa.h>\n\n@interface FocusReader : NSObject <NSApplicationDelegate>{\n    NSWindow *window;\n}\n\n- (void)start;\n\n@property (assign) IBOutlet NSWindow *window;\n\n@end\n\n#endif /* OVR_OSX_FocusReader_h */\n\n"
  },
  {
    "path": "externals/ovr/Src/Displays/OVR_OSX_FocusReader.mm",
    "content": "/************************************************************************************\r\n\r\nFilename    :   OVR_OSX_FocusReader.mm\r\nContent     :   Reader for current app with focus on OSX\r\nCreated     :   August 5, 2014\r\nAuthors     :   Jordan Tritell\r\n\r\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\r\n\r\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\r\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\r\nwhich is provided at the time of installation or download, or which\r\notherwise accompanies this software in either electronic or hard copy form.\r\n\r\nYou may obtain a copy of the License at\r\n\r\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\r\n\r\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n\r\n*************************************************************************************/\r\n\r\nOVR_PRIVATE_FILE\r\n\r\n#import \"OVR_OSX_FocusReader.h\"\r\n#import \"OVR_OSX_FocusObserver.h\"\r\n\r\n@implementation FocusReader\r\n\r\n@synthesize window;\r\n\r\n- (void) addActivationObserver\r\n{\r\n    //subscribe to focus notifications from the workspace\r\n\t[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self\r\n                                                           selector:@selector(activated:)\r\n                                                               name:NSWorkspaceDidActivateApplicationNotification\r\n                                                             object:nil];\r\n    \r\n    //subscribe to focus notifications from the workspace\r\n\t[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self\r\n                                                           selector:@selector(terminated:)\r\n                                                               name:NSWorkspaceDidTerminateApplicationNotification\r\n                                                             object:nil];\r\n}\r\n\r\n-(void) activated:(NSNotification *)notification\r\n{\r\n    NSRunningApplication *app = [[notification userInfo] objectForKey:@\"NSWorkspaceApplicationKey\"];\r\n    pid_t pid = [app processIdentifier];\r\n    OVR::OSX::AppFocusObserver::GetInstance()->OnProcessFocus(pid);\r\n    //    NSLog(@\"Activated: %@\", [activatedApp bundleIdentifier]);\r\n}\r\n\r\n-(void) terminated:(NSNotification *)notification\r\n{\r\n    NSRunningApplication *app = [[notification userInfo] objectForKey:@\"NSWorkspaceApplicationKey\"];\r\n    pid_t pid = [app processIdentifier];\r\n    OVR::OSX::AppFocusObserver::GetInstance()->RemoveProcess(pid);\r\n    //    NSLog(@\"Activated: %@\", [activatedApp bundleIdentifier]);\r\n}\r\n\r\n- (void)start\r\n{\r\n    //initialize with relevant variables\r\n    [self addActivationObserver];\r\n}\r\n\r\n@end\r\n\r\n\r\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Alg.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Alg.cpp\nContent     :   Static lookup tables for Alg functions\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_Types.h\"\n\nnamespace OVR { namespace Alg {\n\n//------------------------------------------------------------------------\nextern const uint8_t UpperBitTable[256] =\n{\n    0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\n    5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,\n    6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,\n    6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,\n    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,\n    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7\n};\n\nextern const uint8_t LowerBitTable[256] =\n{\n    8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,\n    5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,\n    6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,\n    5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,\n    7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,\n    5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,\n    6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,\n    5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0\n};\n\n\n}} // OVE::Alg\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Alg.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR_Kernel.h\nFilename    :   OVR_Alg.h\nContent     :   Simple general purpose algorithms: Sort, Binary Search, etc.\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Alg_h\n#define OVR_Alg_h\n\n#include \"OVR_Types.h\"\n#include <string.h>\n\nnamespace OVR { namespace Alg {\n\n\n//-----------------------------------------------------------------------------------\n// ***** Operator extensions\n\ntemplate <typename T> OVR_FORCE_INLINE void Swap(T &a, T &b) \n{  T temp(a); a = b; b = temp; }\n\n\n// ***** min/max are not implemented in Visual Studio 6 standard STL\n\ntemplate <typename T> OVR_FORCE_INLINE const T Min(const T a, const T b)\n{ return (a < b) ? a : b; }\n\ntemplate <typename T> OVR_FORCE_INLINE const T Max(const T a, const T b)\n{ return (b < a) ? a : b; }\n\ntemplate <typename T> OVR_FORCE_INLINE const T Clamp(const T v, const T minVal, const T maxVal)\n{ return Max<T>(minVal, Min<T>(v, maxVal)); }\n\ntemplate <typename T> OVR_FORCE_INLINE int     Chop(T f)\n{ return (int)f; }\n\ntemplate <typename T> OVR_FORCE_INLINE T       Lerp(T a, T b, T f) \n{ return (b - a) * f + a; }\n\n\n// These functions stand to fix a stupid VC++ warning (with /Wp64 on):\n// \"warning C4267: 'argument' : conversion from 'size_t' to 'const unsigned', possible loss of data\"\n// Use these functions instead of gmin/gmax if the argument has size\n// of the pointer to avoid the warning. Though, functionally they are\n// absolutelly the same as regular gmin/gmax.\ntemplate <typename T>   OVR_FORCE_INLINE const T PMin(const T a, const T b)\n{\n    OVR_COMPILER_ASSERT(sizeof(T) == sizeof(size_t));\n    return (a < b) ? a : b;\n}\ntemplate <typename T>   OVR_FORCE_INLINE const T PMax(const T a, const T b)\n{\n    OVR_COMPILER_ASSERT(sizeof(T) == sizeof(size_t));\n    return (b < a) ? a : b;\n}\n\n\ntemplate <typename T>   OVR_FORCE_INLINE const T Abs(const T v)\n{ return (v>=0) ? v : -v; }\n\n\n//-----------------------------------------------------------------------------------\n// ***** OperatorLess\n//\ntemplate<class T> struct OperatorLess\n{\n    static bool Compare(const T& a, const T& b)\n    {\n        return a < b;\n    }\n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** QuickSortSliced\n//\n// Sort any part of any array: plain, Array, ArrayPaged, ArrayUnsafe.\n// The range is specified with start, end, where \"end\" is exclusive!\n// The comparison predicate must be specified.\ntemplate<class Array, class Less> \nvoid QuickSortSliced(Array& arr, size_t start, size_t end, Less less)\n{\n    enum \n    {\n        Threshold = 9\n    };\n\n    if(end - start <  2) return;\n\n    intptr_t  stack[80];\n    intptr_t* top   = stack; \n    intptr_t  base  = (intptr_t)start;\n    intptr_t  limit = (intptr_t)end;\n\n    for(;;)\n    {\n        intptr_t len = limit - base;\n        intptr_t i, j, pivot;\n\n        if(len > Threshold)\n        {\n            // we use base + len/2 as the pivot\n            pivot = base + len / 2;\n            Swap(arr[base], arr[pivot]);\n\n            i = base + 1;\n            j = limit - 1;\n\n            // now ensure that *i <= *base <= *j \n            if(less(arr[j],    arr[i])) Swap(arr[j],    arr[i]);\n            if(less(arr[base], arr[i])) Swap(arr[base], arr[i]);\n            if(less(arr[j], arr[base])) Swap(arr[j], arr[base]);\n\n            for(;;)\n            {\n                do i++; while( less(arr[i], arr[base]) );\n                do j--; while( less(arr[base], arr[j]) );\n\n                if( i > j )\n                {\n                    break;\n                }\n\n                Swap(arr[i], arr[j]);\n            }\n\n            Swap(arr[base], arr[j]);\n\n            // now, push the largest sub-array\n            if(j - base > limit - i)\n            {\n                top[0] = base;\n                top[1] = j;\n                base   = i;\n            }\n            else\n            {\n                top[0] = i;\n                top[1] = limit;\n                limit  = j;\n            }\n            top += 2;\n        }\n        else\n        {\n            // the sub-array is small, perform insertion sort\n            j = base;\n            i = j + 1;\n\n            for(; i < limit; j = i, i++)\n            {\n                for(; less(arr[j + 1], arr[j]); j--)\n                {\n                    Swap(arr[j + 1], arr[j]);\n                    if(j == base)\n                    {\n                        break;\n                    }\n                }\n            }\n            if(top > stack)\n            {\n                top  -= 2;\n                base  = top[0];\n                limit = top[1];\n            }\n            else\n            {\n                break;\n            }\n        }\n    }\n}\n\n\n//-----------------------------------------------------------------------------------\n// ***** QuickSortSliced\n//\n// Sort any part of any array: plain, Array, ArrayPaged, ArrayUnsafe.\n// The range is specified with start, end, where \"end\" is exclusive!\n// The data type must have a defined \"<\" operator.\ntemplate<class Array> \nvoid QuickSortSliced(Array& arr, size_t start, size_t end)\n{\n    typedef typename Array::ValueType ValueType;\n    QuickSortSliced(arr, start, end, OperatorLess<ValueType>::Compare);\n}\n\n// Same as corresponding G_QuickSortSliced but with checking array limits to avoid\n// crash in the case of wrong comparator functor.\ntemplate<class Array, class Less> \nbool QuickSortSlicedSafe(Array& arr, size_t start, size_t end, Less less)\n{\n    enum \n    {\n        Threshold = 9\n    };\n\n    if(end - start <  2) return true;\n\n    intptr_t  stack[80];\n    intptr_t* top   = stack; \n    intptr_t  base  = (intptr_t)start;\n    intptr_t  limit = (intptr_t)end;\n\n    for(;;)\n    {\n        intptr_t len = limit - base;\n        intptr_t i, j, pivot;\n\n        if(len > Threshold)\n        {\n            // we use base + len/2 as the pivot\n            pivot = base + len / 2;\n            Swap(arr[base], arr[pivot]);\n\n            i = base + 1;\n            j = limit - 1;\n\n            // now ensure that *i <= *base <= *j \n            if(less(arr[j],    arr[i])) Swap(arr[j],    arr[i]);\n            if(less(arr[base], arr[i])) Swap(arr[base], arr[i]);\n            if(less(arr[j], arr[base])) Swap(arr[j], arr[base]);\n\n            for(;;)\n            {\n                do \n                {   \n                    i++; \n                    if (i >= limit)\n                        return false;\n                } while( less(arr[i], arr[base]) );\n                do \n                {\n                    j--; \n                    if (j < 0)\n                        return false;\n                } while( less(arr[base], arr[j]) );\n\n                if( i > j )\n                {\n                    break;\n                }\n\n                Swap(arr[i], arr[j]);\n            }\n\n            Swap(arr[base], arr[j]);\n\n            // now, push the largest sub-array\n            if(j - base > limit - i)\n            {\n                top[0] = base;\n                top[1] = j;\n                base   = i;\n            }\n            else\n            {\n                top[0] = i;\n                top[1] = limit;\n                limit  = j;\n            }\n            top += 2;\n        }\n        else\n        {\n            // the sub-array is small, perform insertion sort\n            j = base;\n            i = j + 1;\n\n            for(; i < limit; j = i, i++)\n            {\n                for(; less(arr[j + 1], arr[j]); j--)\n                {\n                    Swap(arr[j + 1], arr[j]);\n                    if(j == base)\n                    {\n                        break;\n                    }\n                }\n            }\n            if(top > stack)\n            {\n                top  -= 2;\n                base  = top[0];\n                limit = top[1];\n            }\n            else\n            {\n                break;\n            }\n        }\n    }\n    return true;\n}\n\ntemplate<class Array> \nbool QuickSortSlicedSafe(Array& arr, size_t start, size_t end)\n{\n    typedef typename Array::ValueType ValueType;\n    return QuickSortSlicedSafe(arr, start, end, OperatorLess<ValueType>::Compare);\n}\n\n//-----------------------------------------------------------------------------------\n// ***** QuickSort\n//\n// Sort an array Array, ArrayPaged, ArrayUnsafe.\n// The array must have GetSize() function.\n// The comparison predicate must be specified.\ntemplate<class Array, class Less> \nvoid QuickSort(Array& arr, Less less)\n{\n    QuickSortSliced(arr, 0, arr.GetSize(), less);\n}\n\n// checks for boundaries\ntemplate<class Array, class Less> \nbool QuickSortSafe(Array& arr, Less less)\n{\n    return QuickSortSlicedSafe(arr, 0, arr.GetSize(), less);\n}\n\n\n//-----------------------------------------------------------------------------------\n// ***** QuickSort\n//\n// Sort an array Array, ArrayPaged, ArrayUnsafe.\n// The array must have GetSize() function.\n// The data type must have a defined \"<\" operator.\ntemplate<class Array> \nvoid QuickSort(Array& arr)\n{\n    typedef typename Array::ValueType ValueType;\n    QuickSortSliced(arr, 0, arr.GetSize(), OperatorLess<ValueType>::Compare);\n}\n\ntemplate<class Array> \nbool QuickSortSafe(Array& arr)\n{\n    typedef typename Array::ValueType ValueType;\n    return QuickSortSlicedSafe(arr, 0, arr.GetSize(), OperatorLess<ValueType>::Compare);\n}\n\n//-----------------------------------------------------------------------------------\n// ***** InsertionSortSliced\n//\n// Sort any part of any array: plain, Array, ArrayPaged, ArrayUnsafe.\n// The range is specified with start, end, where \"end\" is exclusive!\n// The comparison predicate must be specified.\n// Unlike Quick Sort, the Insertion Sort works much slower in average, \n// but may be much faster on almost sorted arrays. Besides, it guarantees\n// that the elements will not be swapped if not necessary. For example, \n// an array with all equal elements will remain \"untouched\", while \n// Quick Sort will considerably shuffle the elements in this case.\ntemplate<class Array, class Less> \nvoid InsertionSortSliced(Array& arr, size_t start, size_t end, Less less)\n{\n    size_t j = start;\n    size_t i = j + 1;\n    size_t limit = end;\n\n    for(; i < limit; j = i, i++)\n    {\n        for(; less(arr[j + 1], arr[j]); j--)\n        {\n            Swap(arr[j + 1], arr[j]);\n            if(j <= start)\n            {\n                break;\n            }\n        }\n    }\n}\n\n\n//-----------------------------------------------------------------------------------\n// ***** InsertionSortSliced\n//\n// Sort any part of any array: plain, Array, ArrayPaged, ArrayUnsafe.\n// The range is specified with start, end, where \"end\" is exclusive!\n// The data type must have a defined \"<\" operator.\ntemplate<class Array> \nvoid InsertionSortSliced(Array& arr, size_t start, size_t end)\n{\n    typedef typename Array::ValueType ValueType;\n    InsertionSortSliced(arr, start, end, OperatorLess<ValueType>::Compare);\n}\n\n//-----------------------------------------------------------------------------------\n// ***** InsertionSort\n//\n// Sort an array Array, ArrayPaged, ArrayUnsafe.\n// The array must have GetSize() function.\n// The comparison predicate must be specified.\n\ntemplate<class Array, class Less> \nvoid InsertionSort(Array& arr, Less less)\n{\n    InsertionSortSliced(arr, 0, arr.GetSize(), less);\n}\n\n//-----------------------------------------------------------------------------------\n// ***** InsertionSort\n//\n// Sort an array Array, ArrayPaged, ArrayUnsafe.\n// The array must have GetSize() function.\n// The data type must have a defined \"<\" operator.\ntemplate<class Array> \nvoid InsertionSort(Array& arr)\n{\n    typedef typename Array::ValueType ValueType;\n    InsertionSortSliced(arr, 0, arr.GetSize(), OperatorLess<ValueType>::Compare);\n}\n\n//-----------------------------------------------------------------------------------\n// ***** Median\n// Returns a median value of the input array.\n// Caveats: partially sorts the array, returns a reference to the array element\n// TBD: This needs to be optimized and generalized\n//\ntemplate<class Array> \ntypename Array::ValueType& Median(Array& arr)\n{\n    size_t count = arr.GetSize();\n    size_t mid = (count - 1) / 2;\n    OVR_ASSERT(count > 0);\n\n\tfor (size_t j = 0; j <= mid; j++)\n    {\n\t\tsize_t min = j;\n\t\tfor (size_t k = j + 1; k < count; k++)\n            if (arr[k] < arr[min]) \n                min = k;\n        Swap(arr[j], arr[min]);\n    }\n    return arr[mid];\n}\n\n//-----------------------------------------------------------------------------------\n// ***** LowerBoundSliced\n//\ntemplate<class Array, class Value, class Less>\nsize_t LowerBoundSliced(const Array& arr, size_t start, size_t end, const Value& val, Less less)\n{\n    intptr_t first = (intptr_t)start;\n    intptr_t len   = (intptr_t)(end - start);\n    intptr_t half;\n    intptr_t middle;\n    \n    while(len > 0) \n    {\n        half = len >> 1;\n        middle = first + half;\n        if(less(arr[middle], val)) \n        {\n            first = middle + 1;\n            len   = len - half - 1;\n        }\n        else\n        {\n            len = half;\n        }\n    }\n    return (size_t)first;\n}\n\n\n//-----------------------------------------------------------------------------------\n// ***** LowerBoundSliced\n//\ntemplate<class Array, class Value>\nsize_t LowerBoundSliced(const Array& arr, size_t start, size_t end, const Value& val)\n{\n    return LowerBoundSliced(arr, start, end, val, OperatorLess<Value>::Compare);\n}\n\n//-----------------------------------------------------------------------------------\n// ***** LowerBoundSized\n//\ntemplate<class Array, class Value>\nsize_t LowerBoundSized(const Array& arr, size_t size, const Value& val)\n{\n    return LowerBoundSliced(arr, 0, size, val, OperatorLess<Value>::Compare);\n}\n\n//-----------------------------------------------------------------------------------\n// ***** LowerBound\n//\ntemplate<class Array, class Value, class Less>\nsize_t LowerBound(const Array& arr, const Value& val, Less less)\n{\n    return LowerBoundSliced(arr, 0, arr.GetSize(), val, less);\n}\n\n\n//-----------------------------------------------------------------------------------\n// ***** LowerBound\n//\ntemplate<class Array, class Value>\nsize_t LowerBound(const Array& arr, const Value& val)\n{\n    return LowerBoundSliced(arr, 0, arr.GetSize(), val, OperatorLess<Value>::Compare);\n}\n\n\n\n//-----------------------------------------------------------------------------------\n// ***** UpperBoundSliced\n//\ntemplate<class Array, class Value, class Less>\nsize_t UpperBoundSliced(const Array& arr, size_t start, size_t end, const Value& val, Less less)\n{\n    intptr_t first = (intptr_t)start;\n    intptr_t len   = (intptr_t)(end - start);\n    intptr_t half;\n    intptr_t middle;\n    \n    while(len > 0) \n    {\n        half = len >> 1;\n        middle = first + half;\n        if(less(val, arr[middle]))\n        {\n            len = half;\n        }\n        else \n        {\n            first = middle + 1;\n            len   = len - half - 1;\n        }\n    }\n    return (size_t)first;\n}\n\n\n//-----------------------------------------------------------------------------------\n// ***** UpperBoundSliced\n//\ntemplate<class Array, class Value>\nsize_t UpperBoundSliced(const Array& arr, size_t start, size_t end, const Value& val)\n{\n    return UpperBoundSliced(arr, start, end, val, OperatorLess<Value>::Compare);\n}\n\n\n//-----------------------------------------------------------------------------------\n// ***** UpperBoundSized\n//\ntemplate<class Array, class Value>\nsize_t UpperBoundSized(const Array& arr, size_t size, const Value& val)\n{\n    return UpperBoundSliced(arr, 0, size, val, OperatorLess<Value>::Compare);\n}\n\n\n//-----------------------------------------------------------------------------------\n// ***** UpperBound\n//\ntemplate<class Array, class Value, class Less>\nsize_t UpperBound(const Array& arr, const Value& val, Less less)\n{\n    return UpperBoundSliced(arr, 0, arr.GetSize(), val, less);\n}\n\n\n//-----------------------------------------------------------------------------------\n// ***** UpperBound\n//\ntemplate<class Array, class Value>\nsize_t UpperBound(const Array& arr, const Value& val)\n{\n    return UpperBoundSliced(arr, 0, arr.GetSize(), val, OperatorLess<Value>::Compare);\n}\n\n\n//-----------------------------------------------------------------------------------\n// ***** ReverseArray\n//\ntemplate<class Array> void ReverseArray(Array& arr)\n{\n    intptr_t from = 0;\n    intptr_t to   = arr.GetSize() - 1;\n    while(from < to)\n    {\n        Swap(arr[from], arr[to]);\n        ++from;\n        --to;\n    }\n}\n\n\n// ***** AppendArray\n//\ntemplate<class CDst, class CSrc> \nvoid AppendArray(CDst& dst, const CSrc& src)\n{\n    size_t i;\n    for(i = 0; i < src.GetSize(); i++) \n        dst.PushBack(src[i]);\n}\n\n//-----------------------------------------------------------------------------------\n// ***** ArrayAdaptor\n//\n// A simple adapter that provides the GetSize() method and overloads \n// operator []. Used to wrap plain arrays in QuickSort and such.\ntemplate<class T> class ArrayAdaptor\n{\npublic:\n    typedef T ValueType;\n    ArrayAdaptor() : Data(0), Size(0) {}\n    ArrayAdaptor(T* ptr, size_t size) : Data(ptr), Size(size) {}\n    size_t GetSize() const { return Size; }\n\tint GetSizeI() const { return (int)GetSize(); }\n    const T& operator [] (size_t i) const { return Data[i]; }\n          T& operator [] (size_t i)       { return Data[i]; }\nprivate:\n    T*      Data;\n    size_t  Size;\n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** GConstArrayAdaptor\n//\n// A simple const adapter that provides the GetSize() method and overloads \n// operator []. Used to wrap plain arrays in LowerBound and such.\ntemplate<class T> class ConstArrayAdaptor\n{\npublic:\n    typedef T ValueType;\n    ConstArrayAdaptor() : Data(0), Size(0) {}\n    ConstArrayAdaptor(const T* ptr, size_t size) : Data(ptr), Size(size) {}\n    size_t GetSize() const { return Size; }\n\tint GetSizeI() const { return (int)GetSize(); }\n\tconst T& operator [] (size_t i) const { return Data[i]; }\nprivate:\n    const T* Data;\n    size_t   Size;\n};\n\n\n\n//-----------------------------------------------------------------------------------\nextern const uint8_t UpperBitTable[256];\nextern const uint8_t LowerBitTable[256];\n\n\n\n//-----------------------------------------------------------------------------------\ninline uint8_t UpperBit(size_t val)\n{\n#ifndef OVR_64BIT_POINTERS\n\n    if (val & 0xFFFF0000)\n    {\n        return (val & 0xFF000000) ? \n            UpperBitTable[(val >> 24)       ] + 24: \n            UpperBitTable[(val >> 16) & 0xFF] + 16;\n    }\n    return (val & 0xFF00) ?\n        UpperBitTable[(val >> 8) & 0xFF] + 8:\n        UpperBitTable[(val     ) & 0xFF];\n\n#else\n\n    if (val & 0xFFFFFFFF00000000)\n    {\n        if (val & 0xFFFF000000000000)\n        {\n            return (val & 0xFF00000000000000) ?\n                UpperBitTable[(val >> 56)       ] + 56: \n                UpperBitTable[(val >> 48) & 0xFF] + 48;\n        }\n        return (val & 0xFF0000000000) ?\n            UpperBitTable[(val >> 40) & 0xFF] + 40:\n            UpperBitTable[(val >> 32) & 0xFF] + 32;\n    }\n    else\n    {\n        if (val & 0xFFFF0000)\n        {\n            return (val & 0xFF000000) ? \n                UpperBitTable[(val >> 24)       ] + 24: \n                UpperBitTable[(val >> 16) & 0xFF] + 16;\n        }\n        return (val & 0xFF00) ?\n            UpperBitTable[(val >> 8) & 0xFF] + 8:\n            UpperBitTable[(val     ) & 0xFF];\n    }\n\n#endif\n}\n\n//-----------------------------------------------------------------------------------\ninline uint8_t LowerBit(size_t val)\n{\n#ifndef OVR_64BIT_POINTERS\n\n    if (val & 0xFFFF)\n    {\n        return (val & 0xFF) ?\n            LowerBitTable[ val & 0xFF]:\n            LowerBitTable[(val >> 8) & 0xFF] + 8;\n    }\n    return (val & 0xFF0000) ?\n            LowerBitTable[(val >> 16) & 0xFF] + 16:\n            LowerBitTable[(val >> 24) & 0xFF] + 24;\n\n#else\n\n    if (val & 0xFFFFFFFF)\n    {\n        if (val & 0xFFFF)\n        {\n            return (val & 0xFF) ?\n                LowerBitTable[ val & 0xFF]:\n                LowerBitTable[(val >> 8) & 0xFF] + 8;\n        }\n        return (val & 0xFF0000) ?\n                LowerBitTable[(val >> 16) & 0xFF] + 16:\n                LowerBitTable[(val >> 24) & 0xFF] + 24;\n    }\n    else\n    {\n        if (val & 0xFFFF00000000)\n        {\n             return (val & 0xFF00000000) ?\n                LowerBitTable[(val >> 32) & 0xFF] + 32:\n                LowerBitTable[(val >> 40) & 0xFF] + 40;\n        }\n        return (val & 0xFF000000000000) ?\n            LowerBitTable[(val >> 48) & 0xFF] + 48:\n            LowerBitTable[(val >> 56) & 0xFF] + 56;\n    }\n\n#endif\n}\n\n\n\n// ******* Special (optimized) memory routines\n// Note: null (bad) pointer is not tested\nclass MemUtil\n{\npublic:\n                                    \n    // Memory compare\n    static int      Cmp  (const void* p1, const void* p2, size_t byteCount)      { return memcmp(p1, p2, byteCount); }\n    static int      Cmp16(const void* p1, const void* p2, size_t int16Count);\n    static int      Cmp32(const void* p1, const void* p2, size_t int32Count);\n    static int      Cmp64(const void* p1, const void* p2, size_t int64Count); \n};\n\n// ** Inline Implementation\n\ninline int MemUtil::Cmp16(const void* p1, const void* p2, size_t int16Count)\n{\n    int16_t*  pa  = (int16_t*)p1; \n    int16_t*  pb  = (int16_t*)p2;\n    unsigned ic  = 0;\n    if (int16Count == 0)\n        return 0;\n    while (pa[ic] == pb[ic])\n        if (++ic==int16Count)\n            return 0;\n    return pa[ic] > pb[ic] ? 1 : -1;\n}\ninline int MemUtil::Cmp32(const void* p1, const void* p2, size_t int32Count)\n{\n    int32_t*  pa  = (int32_t*)p1;\n    int32_t*  pb  = (int32_t*)p2;\n    unsigned ic  = 0;\n    if (int32Count == 0)\n        return 0;\n    while (pa[ic] == pb[ic])\n        if (++ic==int32Count)\n            return 0;\n    return pa[ic] > pb[ic] ? 1 : -1;\n}\ninline int MemUtil::Cmp64(const void* p1, const void* p2, size_t int64Count)\n{\n    int64_t*  pa  = (int64_t*)p1;\n    int64_t*  pb  = (int64_t*)p2;\n    unsigned ic  = 0;\n    if (int64Count == 0)\n        return 0;\n    while (pa[ic] == pb[ic])\n        if (++ic==int64Count)\n            return 0;\n    return pa[ic] > pb[ic] ? 1 : -1;\n}\n\n// ** End Inline Implementation\n\n\n//-----------------------------------------------------------------------------------\n// ******* Byte Order Conversions\nnamespace ByteUtil {\n\n    // *** Swap Byte Order\n\n    // Swap the byte order of a byte array\n    inline void     SwapOrder(void* pv, int size)\n    {\n        uint8_t*  pb = (uint8_t*)pv;\n        uint8_t temp;\n        for (int i = 0; i < size>>1; i++)\n        { \n            temp            = pb[size-1-i];\n            pb[size-1-i]    = pb[i];\n            pb[i]           = temp; \n        }\n    }\n\n    // Swap the byte order of primitive types\n    inline uint8_t  SwapOrder(uint8_t v)    { return v; }\n    inline int8_t   SwapOrder(int8_t v)     { return v; }\n    inline uint16_t SwapOrder(uint16_t v)   { return uint16_t(v>>8)|uint16_t(v<<8); }\n    inline int16_t  SwapOrder(int16_t v)    { return int16_t((uint16_t(v)>>8)|(v<<8)); }\n    inline uint32_t SwapOrder(uint32_t v)   { return (v>>24)|((v&0x00FF0000)>>8)|((v&0x0000FF00)<<8)|(v<<24); }\n    inline int32_t  SwapOrder(int32_t p)    { return (int32_t)SwapOrder(uint32_t(p)); }\n    inline uint64_t SwapOrder(uint64_t v)\n    { \n        return   (v>>56) |\n                 ((v&uint64_t(0x00FF000000000000ULL))>>40) |\n                 ((v&uint64_t(0x0000FF0000000000ULL))>>24) |\n                 ((v&uint64_t(0x000000FF00000000ULL))>>8)  |\n                 ((v&uint64_t(0x00000000FF000000ULL))<<8)  |\n                 ((v&uint64_t(0x0000000000FF0000ULL))<<24) |\n                 ((v&uint64_t(0x000000000000FF00ULL))<<40) |\n                 (v<<56); \n    }\n    inline int64_t  SwapOrder(int64_t v)     { return (int64_t)SwapOrder(uint64_t(v)); }\n    inline float    SwapOrder(float p)      \n    { \n        union {\n            float p;\n            uint32_t v;\n        } u;\n        u.p = p;\n        u.v = SwapOrder(u.v);\n        return u.p;\n    }\n\n    inline double   SwapOrder(double p)\n    { \n        union {\n            double p;\n            uint64_t v;\n        } u;\n        u.p = p;\n        u.v = SwapOrder(u.v);\n        return u.p;\n    }\n    \n    // *** Byte-order conversion\n\n#if (OVR_BYTE_ORDER == OVR_LITTLE_ENDIAN)\n    // Little Endian to System (LE)\n    inline uint8_t  LEToSystem(uint8_t v)   { return v; }\n    inline int8_t   LEToSystem(int8_t v)    { return v; }\n    inline uint16_t LEToSystem(uint16_t v)  { return v; }\n    inline int16_t  LEToSystem(int16_t v)   { return v; }\n    inline uint32_t LEToSystem(uint32_t v)  { return v; }\n    inline int32_t  LEToSystem(int32_t v)   { return v; }\n    inline uint64_t LEToSystem(uint64_t v)  { return v; }\n    inline int64_t  LEToSystem(int64_t v)    { return v; }\n    inline float    LEToSystem(float  v)    { return v; }\n    inline double   LEToSystem(double v)    { return v; }\n\n    // Big Endian to System (LE)\n    inline uint8_t  BEToSystem(uint8_t v)   { return SwapOrder(v); }\n    inline int8_t   BEToSystem(int8_t v)    { return SwapOrder(v); }\n    inline uint16_t BEToSystem(uint16_t v)  { return SwapOrder(v); }\n    inline int16_t  BEToSystem(int16_t v)   { return SwapOrder(v); }\n    inline uint32_t BEToSystem(uint32_t v)  { return SwapOrder(v); }\n    inline int32_t  BEToSystem(int32_t v)   { return SwapOrder(v); }\n    inline uint64_t BEToSystem(uint64_t v)  { return SwapOrder(v); }\n    inline int64_t  BEToSystem(int64_t v)    { return SwapOrder(v); }\n    inline float    BEToSystem(float  v)    { return SwapOrder(v); }\n    inline double   BEToSystem(double v)    { return SwapOrder(v); }\n\n    // System (LE) to Little Endian\n    inline uint8_t  SystemToLE(uint8_t v)   { return v; }\n    inline int8_t   SystemToLE(int8_t v)    { return v; }\n    inline uint16_t SystemToLE(uint16_t v)  { return v; }\n    inline int16_t  SystemToLE(int16_t v)   { return v; }\n    inline uint32_t SystemToLE(uint32_t v)  { return v; }\n    inline int32_t  SystemToLE(int32_t v)   { return v; }\n    inline uint64_t SystemToLE(uint64_t v)  { return v; }\n    inline int64_t  SystemToLE(int64_t v)    { return v; }\n    inline float    SystemToLE(float  v)    { return v; }\n    inline double   SystemToLE(double v)    { return v; }   \n\n    // System (LE) to Big Endian\n    inline uint8_t  SystemToBE(uint8_t v)   { return SwapOrder(v); }\n    inline int8_t   SystemToBE(int8_t v)    { return SwapOrder(v); }\n    inline uint16_t SystemToBE(uint16_t v)  { return SwapOrder(v); }\n    inline int16_t  SystemToBE(int16_t v)   { return SwapOrder(v); }\n    inline uint32_t SystemToBE(uint32_t v)  { return SwapOrder(v); }\n    inline int32_t  SystemToBE(int32_t v)   { return SwapOrder(v); }\n    inline uint64_t SystemToBE(uint64_t v)  { return SwapOrder(v); }\n    inline int64_t  SystemToBE(int64_t v)    { return SwapOrder(v); }\n    inline float    SystemToBE(float  v)    { return SwapOrder(v); }\n    inline double   SystemToBE(double v)    { return SwapOrder(v); }\n\n#elif (OVR_BYTE_ORDER == OVR_BIG_ENDIAN)\n    // Little Endian to System (BE)\n    inline uint8_t  LEToSystem(uint8_t  v)  { return SwapOrder(v); }\n    inline int8_t   LEToSystem(int8_t v)    { return SwapOrder(v); }\n    inline uint16_t LEToSystem(uint16_t v)  { return SwapOrder(v); }\n    inline int16_t  LEToSystem(int16_t v)   { return SwapOrder(v); }\n    inline uint32_t LEToSystem(uint32_t v)  { return SwapOrder(v); }\n    inline int32_t  LEToSystem(int32_t v)   { return SwapOrder(v); }\n    inline uint64_t LEToSystem(uint64_t v)  { return SwapOrder(v); }\n    inline int64_t  LEToSystem(int64_t v)    { return SwapOrder(v); }\n    inline float    LEToSystem(float  v)    { return SwapOrder(v); }\n    inline double   LEToSystem(double v)    { return SwapOrder(v); }\n\n    // Big Endian to System (BE)\n    inline uint8_t  BEToSystem(uint8_t v)   { return v; }\n    inline int8_t   BEToSystem(int8_t v)    { return v; }\n    inline uint16_t BEToSystem(uint16_t v)  { return v; }\n    inline int16_t  BEToSystem(int16_t v)   { return v; }\n    inline uint32_t BEToSystem(uint32_t v)  { return v; }\n    inline int32_t  BEToSystem(int32_t v)   { return v; }\n    inline uint64_t BEToSystem(uint64_t v)  { return v; }\n    inline int64_t  BEToSystem(int64_t v)    { return v; }\n    inline float    BEToSystem(float  v)    { return v; }\n    inline double   BEToSystem(double v)    { return v; }\n\n    // System (BE) to Little Endian\n    inline uint8_t  SystemToLE(uint8_t v)   { return SwapOrder(v); }\n    inline int8_t   SystemToLE(int8_t v)    { return SwapOrder(v); }\n    inline uint16_t SystemToLE(uint16_t v)  { return SwapOrder(v); }\n    inline int16_t  SystemToLE(int16_t v)   { return SwapOrder(v); }\n    inline uint32_t SystemToLE(uint32_t v)  { return SwapOrder(v); }\n    inline int32_t  SystemToLE(int32_t v)   { return SwapOrder(v); }\n    inline uint64_t SystemToLE(uint64_t v)  { return SwapOrder(v); }\n    inline int64_t  SystemToLE(int64_t v)    { return SwapOrder(v); }\n    inline float    SystemToLE(float  v)    { return SwapOrder(v); }\n    inline double   SystemToLE(double v)    { return SwapOrder(v); }\n\n    // System (BE) to Big Endian\n    inline uint8_t  SystemToBE(uint8_t v)   { return v; }\n    inline int8_t   SystemToBE(int8_t v)    { return v; }\n    inline uint16_t SystemToBE(uint16_t v)  { return v; }\n    inline int16_t  SystemToBE(int16_t v)   { return v; }\n    inline uint32_t SystemToBE(uint32_t v)  { return v; }\n    inline int32_t  SystemToBE(int32_t v)   { return v; }\n    inline uint64_t SystemToBE(uint64_t v)  { return v; }\n    inline int64_t  SystemToBE(int64_t v)    { return v; }\n    inline float    SystemToBE(float  v)    { return v; }\n    inline double   SystemToBE(double v)    { return v; }\n\n#else\n    #error \"OVR_BYTE_ORDER must be defined to OVR_LITTLE_ENDIAN or OVR_BIG_ENDIAN\"\n#endif\n\n} // namespace ByteUtil\n\n\n\n// Used primarily for hardware interfacing such as sensor reports, firmware, etc.\n// Reported data is all little-endian.\ninline uint16_t DecodeUInt16(const uint8_t* buffer)\n{\n    return ByteUtil::LEToSystem ( *(const uint16_t*)buffer );\n}\n\ninline int16_t DecodeSInt16(const uint8_t* buffer)\n{\n    return ByteUtil::LEToSystem ( *(const int16_t*)buffer );\n}\n\ninline uint32_t DecodeUInt32(const uint8_t* buffer)\n{    \n    return ByteUtil::LEToSystem ( *(const uint32_t*)buffer );\n}\n\ninline int32_t DecodeSInt32(const uint8_t* buffer)\n{    \n    return ByteUtil::LEToSystem ( *(const int32_t*)buffer );\n}\n\ninline float DecodeFloat(const uint8_t* buffer)\n{\n    union {\n        uint32_t U;\n        float  F;\n    };\n\n    U = DecodeUInt32(buffer);\n    return F;\n}\n\ninline void EncodeUInt16(uint8_t* buffer, uint16_t val)\n{\n    *(uint16_t*)buffer = ByteUtil::SystemToLE ( val );\n}\n\ninline void EncodeSInt16(uint8_t* buffer, int16_t val)\n{\n    *(int16_t*)buffer = ByteUtil::SystemToLE ( val );\n}\n\ninline void EncodeUInt32(uint8_t* buffer, uint32_t val)\n{\n    *(uint32_t*)buffer = ByteUtil::SystemToLE ( val );\n}\n\ninline void EncodeSInt32(uint8_t* buffer, int32_t val)\n{\n    *(int32_t*)buffer = ByteUtil::SystemToLE ( val );\n}\n\ninline void EncodeFloat(uint8_t* buffer, float val)\n{\n    union {\n        uint32_t U;\n        float  F;\n    };\n\n    F = val;\n    EncodeUInt32(buffer, U);\n}\n\n// Converts an 8-bit binary-coded decimal\ninline int8_t DecodeBCD(uint8_t byte)\n{\n    uint8_t digit1 = (byte >> 4) & 0x0f;\n    uint8_t digit2 = byte & 0x0f;\n    int decimal = digit1 * 10 + digit2;   // maximum value = 99\n    return (int8_t)decimal;\n}\n\n\n}} // OVR::Alg\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Allocator.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Allocator.cpp\nContent     :   Installable memory allocator implementation\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_Allocator.h\"\n#ifdef OVR_OS_MAC\n #include <stdlib.h>\n#else\n #include <malloc.h>\n#endif\n\n#if defined(OVR_OS_MS)\n #include <Windows.h>\n#elif defined(OVR_OS_MAC) || defined(OVR_OS_UNIX)\n #include <unistd.h>\n #include <sys/mman.h>\n#endif\n\n\nnamespace OVR {\n\n//-----------------------------------------------------------------------------------\n// ***** Allocator\n\nAllocator* Allocator::pInstance = 0;\n\n// Default AlignedAlloc implementation will delegate to Alloc/Free after doing rounding.\nvoid* Allocator::AllocAligned(size_t size, size_t align)\n{\n    OVR_ASSERT((align & (align-1)) == 0);\n    align = (align > sizeof(size_t)) ? align : sizeof(size_t);\n    size_t p = (size_t)Alloc(size+align);\n    size_t aligned = 0;\n    if (p)\n    {\n        aligned = (size_t(p) + align-1) & ~(align-1);\n        if (aligned == p) \n            aligned += align;\n        *(((size_t*)aligned)-1) = aligned-p;\n    }\n    return (void*)aligned;\n}\n\nvoid Allocator::FreeAligned(void* p)\n{\n    size_t src = size_t(p) - *(((size_t*)p)-1);\n    Free((void*)src);\n}\n\n\n//------------------------------------------------------------------------\n// ***** Default Allocator\n\n// This allocator is created and used if no other allocator is installed.\n// Default allocator delegates to system malloc.\n\nvoid* DefaultAllocator::Alloc(size_t size)\n{\n    return malloc(size);\n}\nvoid* DefaultAllocator::AllocDebug(size_t size, const char* file, unsigned line)\n{\n\tOVR_UNUSED2(file, line); // should be here for debugopt config\n#if defined(OVR_CC_MSVC) && defined(_CRTDBG_MAP_ALLOC)\n    return _malloc_dbg(size, _NORMAL_BLOCK, file, line);\n#else\n    return malloc(size);\n#endif\n}\n\nvoid* DefaultAllocator::Realloc(void* p, size_t newSize)\n{\n    return realloc(p, newSize);\n}\nvoid DefaultAllocator::Free(void *p)\n{\n    return free(p);\n}\n\n\n\n\nvoid* MMapAlloc(size_t size)\n{\n    #if defined(OVR_OS_MS)\n        return VirtualAlloc(NULL, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); // size is rounded up to a page. // Returned memory is 0-filled.\n\n    #elif defined(OVR_OS_MAC) || defined(OVR_OS_UNIX)\n        #if !defined(MAP_FAILED)\n            #define MAP_FAILED ((void*)-1)\n        #endif\n\n        void* result = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); // Returned memory is 0-filled.\n        if(result == MAP_FAILED) // mmap returns MAP_FAILED (-1) upon failure.\n            result = NULL;\n        return result;\n    #endif\n}\n\n\n\n\nvoid MMapFree(void* memory, size_t size)\n{\n    #if defined(OVR_OS_MS)\n        OVR_UNUSED(size);\n        VirtualFree(memory, 0, MEM_RELEASE);\n\n    #elif defined(OVR_OS_MAC) || defined(OVR_OS_UNIX)\n        size_t pageSize = getpagesize();\n        size = (((size + (pageSize - 1)) / pageSize) * pageSize);\n        munmap(memory, size); // Must supply the size to munmap.\n    #endif\n}\n\n\n\n\n} // OVR\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Allocator.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR_Kernel.h\nFilename    :   OVR_Allocator.h\nContent     :   Installable memory allocator\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Allocator_h\n#define OVR_Allocator_h\n\n#include \"OVR_Types.h\"\n\n//-----------------------------------------------------------------------------------\n\n// ***** Disable template-unfriendly MS VC++ warnings\n#if defined(OVR_CC_MSVC)\n// Pragma to prevent long name warnings in in VC++\n#pragma warning(disable : 4503)\n#pragma warning(disable : 4786)\n// In MSVC 7.1, warning about placement new POD default initializer\n#pragma warning(disable : 4345)\n#endif\n\n// Un-define new so that placement constructors work\n#undef new\n\n\n//-----------------------------------------------------------------------------------\n// ***** Placement new overrides\n\n// Calls constructor on own memory created with \"new(ptr) type\"\n#ifndef __PLACEMENT_NEW_INLINE\n#define __PLACEMENT_NEW_INLINE\n\n#   if defined(OVR_CC_MWERKS) || defined(OVR_CC_BORLAND) || defined(OVR_CC_GNU)\n#      include <new>\n#   else\n    // Useful on MSVC\n    OVR_FORCE_INLINE void* operator new     (size_t n, void *ptr) { OVR_UNUSED(n); return ptr; }\n    OVR_FORCE_INLINE void  operator delete  (void *, void *)     { }\n#   endif\n\n#endif // __PLACEMENT_NEW_INLINE\n\n\n\n//------------------------------------------------------------------------\n// ***** Macros to redefine class new/delete operators\n\n// Types specifically declared to allow disambiguation of address in\n// class member operator new.\n\n#define OVR_MEMORY_REDEFINE_NEW_IMPL(class_name, check_delete)                          \\\n    void*   operator new(size_t sz)                                                      \\\n    { void *p = OVR_ALLOC_DEBUG(sz, __FILE__, __LINE__); return p; }                                              \\\n    void*   operator new(size_t sz, const char* file, int line)                          \\\n    { void* p = OVR_ALLOC_DEBUG(sz, file, line); OVR_UNUSED2(file, line); return p; }   \\\n    void    operator delete(void *p)                                                    \\\n    { check_delete(class_name, p); OVR_FREE(p); }                                       \\\n    void    operator delete(void *p, const char*, int)                                  \\\n    { check_delete(class_name, p); OVR_FREE(p); }                          \n\n#define OVR_MEMORY_DEFINE_PLACEMENT_NEW                                                 \\\n    void*   operator new        (size_t n, void *ptr)    { OVR_UNUSED(n); return ptr; }  \\\n    void    operator delete     (void *ptr, void *ptr2) { OVR_UNUSED2(ptr,ptr2); }\n\n\n#define OVR_MEMORY_CHECK_DELETE_NONE(class_name, p)\n\n// Redefined all delete/new operators in a class without custom memory initialization\n#define OVR_MEMORY_REDEFINE_NEW(class_name) \\\n    OVR_MEMORY_REDEFINE_NEW_IMPL(class_name, OVR_MEMORY_CHECK_DELETE_NONE)\n\n\nnamespace OVR {\n\n//-----------------------------------------------------------------------------------\n// ***** Construct / Destruct\n\n// Construct/Destruct functions are useful when new is redefined, as they can\n// be called instead of placement new constructors.\n\n\ntemplate <class T>\nOVR_FORCE_INLINE T*  Construct(void *p)\n{\n    return ::new(p) T();\n}\n\ntemplate <class T>\nOVR_FORCE_INLINE T*  Construct(void *p, const T& source)\n{\n    return ::new(p) T(source);\n}\n\n// Same as above, but allows for a different type of constructor.\ntemplate <class T, class S>\nOVR_FORCE_INLINE T*  ConstructAlt(void *p, const S& source)\n{\n    return ::new(p) T(source);\n}\n\ntemplate <class T, class S1, class S2>\nOVR_FORCE_INLINE T*  ConstructAlt(void *p, const S1& src1, const S2& src2)\n{\n    return ::new(p) T(src1, src2);\n}\n\ntemplate <class T>\nOVR_FORCE_INLINE void ConstructArray(void *p, size_t count)\n{\n    uint8_t *pdata = (uint8_t*)p;\n    for (size_t i=0; i< count; ++i, pdata += sizeof(T))\n    {\n        Construct<T>(pdata);\n    }\n}\n\ntemplate <class T>\nOVR_FORCE_INLINE void ConstructArray(void *p, size_t count, const T& source)\n{\n    uint8_t *pdata = (uint8_t*)p;\n    for (size_t i=0; i< count; ++i, pdata += sizeof(T))\n    {\n        Construct<T>(pdata, source);\n    }\n}\n\ntemplate <class T>\nOVR_FORCE_INLINE void Destruct(T *pobj)\n{\n    pobj->~T();\n    OVR_UNUSED1(pobj); // Fix incorrect 'unused variable' MSVC warning.\n}\n\ntemplate <class T>\nOVR_FORCE_INLINE void DestructArray(T *pobj, size_t count)\n{   \n    for (size_t i=0; i<count; ++i, ++pobj)\n        pobj->~T();\n}\n\n\n//-----------------------------------------------------------------------------------\n// ***** Allocator\n\n// Allocator defines a memory allocation interface that developers can override\n// to to provide memory for OVR; an instance of this class is typically created on\n// application startup and passed into System or OVR::System constructor.\n// \n//\n// Users implementing this interface must provide three functions: Alloc, Free,\n// and Realloc. Implementations of these functions must honor the requested alignment.\n// Although arbitrary alignment requests are possible, requested alignment will\n// typically be small, such as 16 bytes or less.\n\nclass Allocator\n{\n    friend class System;\npublic:\n    virtual ~Allocator(){}\n\n    // *** Standard Alignment Alloc/Free\n\n    // Allocate memory of specified size with default alignment.\n    // Alloc of size==0 will allocate a tiny block & return a valid pointer;\n    // this makes it suitable for new operator.\n    virtual void*   Alloc(size_t size) = 0;\n    // Same as Alloc, but provides an option of passing debug data.\n    virtual void*   AllocDebug(size_t size, const char* file, unsigned line)\n    { OVR_UNUSED2(file, line); return Alloc(size); }\n\n    // Reallocate memory block to a new size, copying data if necessary. Returns the pointer to\n    // new memory block, which may be the same as original pointer. Will return 0 if reallocation\n    // failed, in which case previous memory is still valid.\n    // Realloc to decrease size will never fail.\n    // Realloc of pointer == 0 is equivalent to Alloc\n    // Realloc to size == 0, shrinks to the minimal size, pointer remains valid and requires Free().\n    virtual void*   Realloc(void* p, size_t newSize) = 0;\n\n    // Frees memory allocated by Alloc/Realloc.\n    // Free of null pointer is valid and will do nothing.\n    virtual void    Free(void *p) = 0;\n\n\n    // *** Standard Alignment Alloc/Free\n\n    // Allocate memory of specified alignment.\n    // Memory allocated with AllocAligned MUST be freed with FreeAligned.\n    // Default implementation will delegate to Alloc/Free after doing rounding.\n    virtual void*   AllocAligned(size_t size, size_t align);    \n    // Frees memory allocated with AllocAligned.\n    virtual void    FreeAligned(void* p);\n    \n    // Returns the pointer to the current globally installed Allocator instance.\n    // This pointer is used for most of the memory allocations.\n    static Allocator* GetInstance() { return pInstance; }\n\n\nprotected:\n    // onSystemShutdown is called on the allocator during System::Shutdown.\n    // At this point, all allocations should've been freed.\n    virtual void    onSystemShutdown() { }\n\npublic:\n    static  void    setInstance(Allocator* palloc)    \n    {\n        OVR_ASSERT((pInstance == 0) || (palloc == 0));\n        pInstance = palloc;\n    }\n\nprivate:\n\n    static Allocator* pInstance;\n};\n\n\n\n//------------------------------------------------------------------------\n// ***** Allocator_SingletonSupport\n\n// Allocator_SingletonSupport is a Allocator wrapper class that implements\n// the InitSystemSingleton static function, used to create a global singleton\n// used for the OVR::System default argument initialization.\n//\n// End users implementing custom Allocator interface don't need to make use of this base\n// class; they can just create an instance of their own class on stack and pass it to System.\n\ntemplate<class D>\nclass Allocator_SingletonSupport : public Allocator\n{\n    struct AllocContainer\n    {        \n        size_t Data[(sizeof(D) + sizeof(size_t)-1) / sizeof(size_t)];\n        bool  Initialized;\n        AllocContainer() : Initialized(0) { }\n    };\n\n    AllocContainer* pContainer;\n\npublic:\n    Allocator_SingletonSupport() : pContainer(0) { }\n\n    // Creates a singleton instance of this Allocator class used\n    // on OVR_DEFAULT_ALLOCATOR during System initialization.\n    static  D*  InitSystemSingleton()\n    {\n        static AllocContainer Container;\n        OVR_ASSERT(Container.Initialized == false);\n\n        Allocator_SingletonSupport<D> *presult = Construct<D>((void*)Container.Data);\n        presult->pContainer   = &Container;\n        Container.Initialized = true;\n        return (D*)presult;\n    }\n\nprotected:\n    virtual void onSystemShutdown()\n    {\n        Allocator::onSystemShutdown();\n        if (pContainer)\n        {\n            pContainer->Initialized = false;\n            Destruct((D*)this);\n            pContainer = 0;\n        }\n    }\n};\n\n//------------------------------------------------------------------------\n// ***** Default Allocator\n\n// This allocator is created and used if no other allocator is installed.\n// Default allocator delegates to system malloc.\n\nclass DefaultAllocator : public Allocator_SingletonSupport<DefaultAllocator>\n{\npublic:\n    virtual void*   Alloc(size_t size);\n    virtual void*   AllocDebug(size_t size, const char* file, unsigned line);\n    virtual void*   Realloc(void* p, size_t newSize);\n    virtual void    Free(void *p);\n};\n\n\n//------------------------------------------------------------------------\n// ***** Memory Allocation Macros\n\n// These macros should be used for global allocation. In the future, these\n// macros will allows allocation to be extended with debug file/line information\n// if necessary.\n\n#define OVR_REALLOC(p,s)        OVR::Allocator::GetInstance()->Realloc((p),(s))\n#define OVR_FREE(p)             OVR::Allocator::GetInstance()->Free((p))\n#define OVR_ALLOC_ALIGNED(s,a)  OVR::Allocator::GetInstance()->AllocAligned((s),(a))\n#define OVR_FREE_ALIGNED(p)     OVR::Allocator::GetInstance()->FreeAligned((p))\n\n#ifdef OVR_BUILD_DEBUG\n#define OVR_ALLOC(s)            OVR::Allocator::GetInstance()->AllocDebug((s), __FILE__, __LINE__)\n#define OVR_ALLOC_DEBUG(s,f,l)  OVR::Allocator::GetInstance()->AllocDebug((s), f, l)\n#else\n#define OVR_ALLOC(s)            OVR::Allocator::GetInstance()->Alloc((s))\n#define OVR_ALLOC_DEBUG(s,f,l)  OVR::Allocator::GetInstance()->Alloc((s))\n#endif\n\n//------------------------------------------------------------------------\n\n// Base class that overrides the new and delete operators.\n// Deriving from this class, even as a multiple base, incurs no space overhead.\nclass NewOverrideBase\n{\npublic:\n\n    // Redefine all new & delete operators.\n    OVR_MEMORY_REDEFINE_NEW(NewOverrideBase)\n};\n\n\n//------------------------------------------------------------------------\n// ***** Mapped memory allocation\n//\n// Equates to VirtualAlloc/VirtualFree on Windows, mmap/munmap on Unix.\n// These are useful for when you need system-supplied memory pages. \n// These are also useful for when you need to allocate memory in a way \n// that doesn't affect the application heap.\n\nvoid* MMapAlloc(size_t size);\nvoid  MMapFree(void* memory, size_t size);\n\n\n} // OVR\n\n\n// Redefine operator 'new' if necessary.\n#if defined(OVR_DEFINE_NEW)\n#define new OVR_DEFINE_NEW\n#endif\n\n\n#endif // OVR_Memory\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Array.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR_Kernel.h\nFilename    :   OVR_Array.h\nContent     :   Template implementation for Array\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Array_h\n#define OVR_Array_h\n\n#include \"OVR_ContainerAllocator.h\"\n\nnamespace OVR {\n\n//-----------------------------------------------------------------------------------\n// ***** ArrayDefaultPolicy\n//\n// Default resize behavior. No minimal capacity, Granularity=4, \n// Shrinking as needed. ArrayConstPolicy actually is the same as \n// ArrayDefaultPolicy, but parametrized with constants. \n// This struct is used only in order to reduce the template \"matroska\".\nstruct ArrayDefaultPolicy\n{\n    ArrayDefaultPolicy() : Capacity(0) {}\n    ArrayDefaultPolicy(const ArrayDefaultPolicy&) : Capacity(0) {}\n\n    size_t GetMinCapacity() const { return 0; }\n    size_t GetGranularity() const { return 4; }\n    bool  NeverShrinking() const { return 0; }\n\n    size_t GetCapacity()    const      { return Capacity; }\n    void  SetCapacity(size_t capacity) { Capacity = capacity; }\nprivate:\n    size_t Capacity;\n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** ArrayConstPolicy\n//\n// Statically parametrized resizing behavior:\n// MinCapacity, Granularity, and Shrinking flag.\ntemplate<int MinCapacity=0, int Granularity=4, bool NeverShrink=false>\nstruct ArrayConstPolicy\n{\n    typedef ArrayConstPolicy<MinCapacity, Granularity, NeverShrink> SelfType;\n\n    ArrayConstPolicy() : Capacity(0) {}\n    ArrayConstPolicy(const SelfType&) : Capacity(0) {}\n\n    size_t GetMinCapacity() const { return MinCapacity; }\n    size_t GetGranularity() const { return Granularity; }\n    bool  NeverShrinking() const { return NeverShrink; }\n\n    size_t GetCapacity()    const      { return Capacity; }\n    void  SetCapacity(size_t capacity) { Capacity = capacity; }\nprivate:\n    size_t Capacity;\n};\n\n//-----------------------------------------------------------------------------------\n// ***** ArrayDataBase\n//\n// Basic operations with array data: Reserve, Resize, Free, ArrayPolicy.\n// For internal use only: ArrayData,ArrayDataCC and others.\ntemplate<class T, class Allocator, class SizePolicy>\nstruct ArrayDataBase\n{\n    typedef T                                           ValueType;\n    typedef Allocator                                   AllocatorType;\n    typedef SizePolicy                                  SizePolicyType;\n    typedef ArrayDataBase<T, Allocator, SizePolicy>     SelfType;\n\n    ArrayDataBase()\n        : Data(0), Size(0), Policy() {}\n\n    ArrayDataBase(const SizePolicy& p)\n        : Data(0), Size(0), Policy(p) {}\n\n    ~ArrayDataBase() \n    {\n        Allocator::DestructArray(Data, Size);\n        Allocator::Free(Data);\n    }\n\n    size_t GetCapacity() const \n    { \n        return Policy.GetCapacity(); \n    }\n\n    void ClearAndRelease()\n    {\n        Allocator::DestructArray(Data, Size);\n        Allocator::Free(Data);\n        Data = 0;\n        Size = 0;\n        Policy.SetCapacity(0);\n    }\n\n    void Reserve(size_t newCapacity)\n    {\n        if (Policy.NeverShrinking() && newCapacity < GetCapacity())\n            return;\n\n        if (newCapacity < Policy.GetMinCapacity())\n            newCapacity = Policy.GetMinCapacity();\n\n        // Resize the buffer.\n        if (newCapacity == 0)\n        {\n            if (Data)\n            {\n                Allocator::Free(Data);\n                Data = 0;\n            }\n            Policy.SetCapacity(0);\n        }\n        else\n        {\n            size_t gran = Policy.GetGranularity();\n            newCapacity = (newCapacity + gran - 1) / gran * gran;\n            if (Data)\n            {\n                if (Allocator::IsMovable())\n                {\n                    Data = (T*)Allocator::Realloc(Data, sizeof(T) * newCapacity);\n                }\n                else\n                {\n                    T* newData = (T*)Allocator::Alloc(sizeof(T) * newCapacity);\n                    size_t i, s;\n                    s = (Size < newCapacity) ? Size : newCapacity;\n                    for (i = 0; i < s; ++i)\n                    {\n                        Allocator::Construct(&newData[i], Data[i]);\n                        Allocator::Destruct(&Data[i]);\n                    }\n                    for (i = s; i < Size; ++i)\n                    {\n                        Allocator::Destruct(&Data[i]);\n                    }\n                    Allocator::Free(Data);\n                    Data = newData;\n                }\n            }\n            else\n            {\n                Data = (T*)Allocator::Alloc(sizeof(T) * newCapacity);\n                //memset(Buffer, 0, (sizeof(ValueType) * newSize)); // Do we need this?\n            }\n            Policy.SetCapacity(newCapacity);\n            // OVR_ASSERT(Data); // need to throw (or something) on alloc failure!\n        }\n    }\n\n    // This version of Resize DOES NOT construct the elements.\n    // It's done to optimize PushBack, which uses a copy constructor \n    // instead of the default constructor and assignment\n    void ResizeNoConstruct(size_t newSize)\n    {\n        size_t oldSize = Size;\n\n        if (newSize < oldSize)\n        {\n            Allocator::DestructArray(Data + newSize, oldSize - newSize);\n            if (newSize < (Policy.GetCapacity() >> 1))\n            {\n                Reserve(newSize);\n            }\n        }\n        else if(newSize >= Policy.GetCapacity())\n        {\n            Reserve(newSize + (newSize >> 2));\n        }\n        //! IMPORTANT to modify Size only after Reserve completes, because garbage collectable\n        // array may use this array and may traverse it during Reserve (in the case, if \n        // collection occurs because of heap limit exceeded).\n        Size = newSize;\n    }\n\n    ValueType*  Data;\n    size_t      Size;\n    SizePolicy  Policy;\n};\n\n\n\n//-----------------------------------------------------------------------------------\n// ***** ArrayData\n//\n// General purpose array data.\n// For internal use only in Array, ArrayLH, ArrayPOD and so on.\ntemplate<class T, class Allocator, class SizePolicy>\nstruct ArrayData : ArrayDataBase<T, Allocator, SizePolicy>\n{\n    typedef T ValueType;\n    typedef Allocator                                   AllocatorType;\n    typedef SizePolicy                                  SizePolicyType;\n    typedef ArrayDataBase<T, Allocator, SizePolicy>     BaseType;\n    typedef ArrayData    <T, Allocator, SizePolicy>     SelfType;\n\n    ArrayData()\n        : BaseType() { }\n\n    ArrayData(size_t size)\n        : BaseType() { Resize(size); }\n\n    ArrayData(const SelfType& a)\n        : BaseType(a.Policy) { Append(a.Data, a.Size); }\n\n\n    void Resize(size_t newSize)\n    {\n        size_t oldSize = this->Size;\n        BaseType::ResizeNoConstruct(newSize);\n        if(newSize > oldSize)\n            Allocator::ConstructArray(this->Data + oldSize, newSize - oldSize);\n    }\n\n    void PushBack(const ValueType& val)\n    {\n        BaseType::ResizeNoConstruct(this->Size + 1);\n        OVR_ASSERT(this->Data != NULL);\n        Allocator::Construct(this->Data + this->Size - 1, val);\n    }\n\n    template<class S>\n    void PushBackAlt(const S& val)\n    {\n        BaseType::ResizeNoConstruct(this->Size + 1);\n        Allocator::ConstructAlt(this->Data + this->Size - 1, val);\n    }\n\n    // Append the given data to the array.\n    void Append(const ValueType other[], size_t count)\n    {\n        if (count)\n        {\n            size_t oldSize = this->Size;\n            BaseType::ResizeNoConstruct(this->Size + count);\n            Allocator::ConstructArray(this->Data + oldSize, count, other);\n        }\n    }\n};\n\n\n\n//-----------------------------------------------------------------------------------\n// ***** ArrayDataCC\n//\n// A modification of ArrayData that always copy-constructs new elements\n// using a specified DefaultValue. For internal use only in ArrayCC.\ntemplate<class T, class Allocator, class SizePolicy>\nstruct ArrayDataCC : ArrayDataBase<T, Allocator, SizePolicy>\n{\n    typedef T                                           ValueType;\n    typedef Allocator                                   AllocatorType;\n    typedef SizePolicy                                  SizePolicyType;\n    typedef ArrayDataBase<T, Allocator, SizePolicy>     BaseType;\n    typedef ArrayDataCC  <T, Allocator, SizePolicy>     SelfType;\n\n    ArrayDataCC(const ValueType& defval)\n        : BaseType(), DefaultValue(defval) { }\n\n    ArrayDataCC(const ValueType& defval, size_t size)\n        : BaseType(), DefaultValue(defval) { Resize(size); }\n\n    ArrayDataCC(const SelfType& a)\n        : BaseType(a.Policy), DefaultValue(a.DefaultValue) { Append(a.Data, a.Size); }\n\n\n    void Resize(size_t newSize)\n    {\n        size_t oldSize = this->Size;\n        BaseType::ResizeNoConstruct(newSize);\n        if(newSize > oldSize)\n            Allocator::ConstructArray(this->Data + oldSize, newSize - oldSize, DefaultValue);\n    }\n\n    void PushBack(const ValueType& val)\n    {\n        BaseType::ResizeNoConstruct(this->Size + 1);\n        Allocator::Construct(this->Data + this->Size - 1, val);\n    }\n\n    template<class S>\n    void PushBackAlt(const S& val)\n    {\n        BaseType::ResizeNoConstruct(this->Size + 1);\n        Allocator::ConstructAlt(this->Data + this->Size - 1, val);\n    }\n\n    // Append the given data to the array.\n    void Append(const ValueType other[], size_t count)\n    {\n        if (count)\n        {\n            size_t oldSize = this->Size;\n            BaseType::ResizeNoConstruct(this->Size + count);\n            Allocator::ConstructArray(this->Data + oldSize, count, other);\n        }\n    }\n\n    ValueType   DefaultValue;\n};\n\n\n\n\n\n//-----------------------------------------------------------------------------------\n// ***** ArrayBase\n//\n// Resizable array. The behavior can be POD (suffix _POD) and \n// Movable (no suffix) depending on the allocator policy.\n// In case of _POD the constructors and destructors are not called.\n// \n// Arrays can't handle non-movable objects! Don't put anything in here \n// that can't be moved around by bitwise copy. \n// \n// The addresses of elements are not persistent! Don't keep the address \n// of an element; the array contents will move around as it gets resized.\ntemplate<class ArrayData>\nclass ArrayBase\n{\npublic:\n    typedef typename ArrayData::ValueType       ValueType;\n    typedef typename ArrayData::AllocatorType   AllocatorType;\n    typedef typename ArrayData::SizePolicyType  SizePolicyType;\n    typedef ArrayBase<ArrayData>                SelfType;\n\n\n#undef new\n    OVR_MEMORY_REDEFINE_NEW(ArrayBase)\n// Redefine operator 'new' if necessary.\n#if defined(OVR_DEFINE_NEW)\n#define new OVR_DEFINE_NEW\n#endif\n\n\n    ArrayBase()\n        : Data() {}\n    ArrayBase(size_t size)\n        : Data(size) {}\n    ArrayBase(const SelfType& a)\n        : Data(a.Data) {}\n\n    ArrayBase(const ValueType& defval)\n        : Data(defval) {}\n    ArrayBase(const ValueType& defval, size_t size)\n        : Data(defval, size) {}\n  \n    SizePolicyType* GetSizePolicy() const                  { return Data.Policy; }\n    void            SetSizePolicy(const SizePolicyType& p) { Data.Policy = p; }\n\n    bool    NeverShrinking()const       { return Data.Policy.NeverShrinking(); }\n\tsize_t  GetSize()       const       { return Data.Size; }\n\tint     GetSizeI()      const       { return (int)Data.Size; }\n\tbool    IsEmpty()       const       { return Data.Size == 0; }\n    size_t  GetCapacity()   const       { return Data.GetCapacity(); }\n    size_t  GetNumBytes()   const       { return Data.GetCapacity() * sizeof(ValueType); }\n\n    void    ClearAndRelease()           { Data.ClearAndRelease(); }\n    void    Clear()                     { Data.Resize(0); }\n    void    Resize(size_t newSize)       { Data.Resize(newSize); }\n\n    // Reserve can only increase the capacity\n    void    Reserve(size_t newCapacity)  \n    { \n        if (newCapacity > Data.GetCapacity())\n            Data.Reserve(newCapacity); \n    }\n\n    // Basic access.\n    ValueType& At(size_t index)\n    {\n        OVR_ASSERT((Data.Data) && (index < Data.Size)); // Asserting that Data.Data is valid helps static analysis tools.\n        return Data.Data[index];\n    }\n    const ValueType& At(size_t index) const\n    {\n        OVR_ASSERT((Data.Data) && (index < Data.Size));\n        return Data.Data[index];\n    }\n\n    ValueType ValueAt(size_t index) const\n    {\n        OVR_ASSERT((Data.Data) && (index < Data.Size));\n        return Data.Data[index];\n    }\n\n    // Basic access.\n    ValueType& operator [] (size_t index)\n    {\n        OVR_ASSERT((Data.Data) && (index < Data.Size));\n        return Data.Data[index]; \n    }\n    const ValueType& operator [] (size_t index) const\n    {\n        OVR_ASSERT((Data.Data) && (index < Data.Size));\n        return Data.Data[index];\n    }\n\n    // Raw pointer to the data. Use with caution!\n    const ValueType* GetDataPtr() const { return Data.Data; }\n          ValueType* GetDataPtr()       { return Data.Data; }\n\n    // Insert the given element at the end of the array.\n    void    PushBack(const ValueType& val)\n    {\n        // DO NOT pass elements of your own vector into\n        // push_back()!  Since we're using references,\n        // resize() may munge the element storage!\n        // OVR_ASSERT(&val < &Buffer[0] || &val > &Buffer[BufferSize]);\n        Data.PushBack(val);\n    }\n\n    template<class S>\n    void PushBackAlt(const S& val)\n    {\n        Data.PushBackAlt(val);\n    }\n\n    // Remove the last element.\n    void    PopBack(size_t count = 1)\n    {\n        OVR_ASSERT(Data.Size >= count);\n        Data.Resize(Data.Size - count);\n    }\n\n    ValueType& PushDefault()\n    {\n        Data.PushBack(ValueType());\n        return Back();\n    }\n\n    ValueType Pop()\n    {\n        OVR_ASSERT((Data.Data) && (Data.Size > 0));\n        ValueType t = Back();\n        PopBack();\n        return t;\n    }\n\n\n    // Access the first element.\n    ValueType&          Front()         { return At(0); }\n    const ValueType&    Front() const   { return At(0); }\n\n    // Access the last element.\n    ValueType&          Back()          { return At(Data.Size - 1); }\n    const ValueType&    Back() const    { return At(Data.Size - 1); }\n\n    // Array copy.  Copies the contents of a into this array.\n    const SelfType& operator = (const SelfType& a)   \n    {\n        Resize(a.GetSize());\n        OVR_ASSERT((Data.Data != NULL) || (Data.Size == 0));\n        for (size_t i = 0; i < Data.Size; i++) {\n            *(Data.Data + i) = a[i];\n        }\n        return *this;\n    }\n\n    // Removing multiple elements from the array.\n    void    RemoveMultipleAt(size_t index, size_t num)\n    {\n        OVR_ASSERT(index + num <= Data.Size);\n        if (Data.Size == num)\n        {\n            Clear();\n        }\n        else\n        {\n            AllocatorType::DestructArray(Data.Data + index, num);\n            AllocatorType::CopyArrayForward(\n                Data.Data + index, \n                Data.Data + index + num,\n                Data.Size - num - index);\n            Data.Size -= num;\n        }\n    }\n\n    // Removing an element from the array is an expensive operation!\n    // It compacts only after removing the last element.\n    // If order of elements in the array is not important then use \n    // RemoveAtUnordered, that could be much faster than the regular\n    // RemoveAt.\n    void    RemoveAt(size_t index)\n    {\n        OVR_ASSERT((Data.Data) && (index < Data.Size));\n        if (Data.Size == 1)\n        {\n            Clear();\n        }\n        else\n        {\n            AllocatorType::Destruct(Data.Data + index);\n            AllocatorType::CopyArrayForward(\n                Data.Data + index, \n                Data.Data + index + 1,\n                Data.Size - 1 - index);\n            --Data.Size;\n        }\n    }\n\n    // Removes an element from the array without respecting of original order of \n    // elements for better performance. Do not use on array where order of elements\n    // is important, otherwise use it instead of regular RemoveAt().\n    void    RemoveAtUnordered(size_t index)\n    {\n        OVR_ASSERT((Data.Data) && (index < Data.Size));\n        if (Data.Size == 1)\n        {\n            Clear();\n        }\n        else\n        {\n            // copy the last element into the 'index' position \n            // and decrement the size (instead of moving all elements\n            // in [index + 1 .. size - 1] range).\n            const size_t lastElemIndex = Data.Size - 1;\n            if (index < lastElemIndex)\n            {\n                AllocatorType::Destruct(Data.Data + index);\n                AllocatorType::Construct(Data.Data + index, Data.Data[lastElemIndex]);\n            }\n            AllocatorType::Destruct(Data.Data + lastElemIndex);\n            --Data.Size;\n        }\n    }\n\n    // Insert the given object at the given index shifting all the elements up.\n    void    InsertAt(size_t index, const ValueType& val = ValueType())\n    {\n        OVR_ASSERT(index <= Data.Size);\n\n        Data.Resize(Data.Size + 1);\n        if (index < Data.Size - 1)\n        {\n            AllocatorType::CopyArrayBackward(\n                Data.Data + index + 1, \n                Data.Data + index, \n                Data.Size - 1 - index);\n        }\n        AllocatorType::Construct(Data.Data + index, val);\n    }\n\n    // Insert the given object at the given index shifting all the elements up.\n    void    InsertMultipleAt(size_t index, size_t num, const ValueType& val = ValueType())\n    {\n        OVR_ASSERT(index <= Data.Size);\n\n        Data.Resize(Data.Size + num);\n        if (index < Data.Size - num)\n        {\n            AllocatorType::CopyArrayBackward(\n                Data.Data + index + num,\n                Data.Data + index,\n                Data.Size - num - index);\n        }\n        for (size_t i = 0; i < num; ++i)\n            AllocatorType::Construct(Data.Data + index + i, val);\n    }\n\n    // Append the given data to the array.\n    void    Append(const SelfType& other)\n    {\n        Append(other.Data.Data, other.GetSize());\n    }\n\n    // Append the given data to the array.\n    void    Append(const ValueType other[], size_t count)\n    {\n        Data.Append(other, count);\n    }\n\n    class Iterator\n    {\n        SelfType*       pArray;\n        intptr_t        CurIndex;\n\n    public:\n        Iterator() : pArray(0), CurIndex(-1) {}\n        Iterator(SelfType* parr, intptr_t idx = 0) : pArray(parr), CurIndex(idx) {}\n\n        bool operator==(const Iterator& it) const { return pArray == it.pArray && CurIndex == it.CurIndex; }\n        bool operator!=(const Iterator& it) const { return pArray != it.pArray || CurIndex != it.CurIndex; }\n\n        Iterator& operator++()\n        {\n            if (pArray)\n            {\n                if (CurIndex < (intptr_t)pArray->GetSize())\n                    ++CurIndex;\n            }\n            return *this;\n        }\n        Iterator operator++(int)\n        {\n            Iterator it(*this);\n            operator++();\n            return it;\n        }\n        Iterator& operator--()\n        {\n            if (pArray)\n            {\n                if (CurIndex >= 0)\n                    --CurIndex;\n            }\n            return *this;\n        }\n        Iterator operator--(int)\n        {\n            Iterator it(*this);\n            operator--();\n            return it;\n        }\n        Iterator operator+(int delta) const\n        {\n            return Iterator(pArray, CurIndex + delta);\n        }\n        Iterator operator-(int delta) const\n        {\n            return Iterator(pArray, CurIndex - delta);\n        }\n        intptr_t operator-(const Iterator& right) const\n        {\n            OVR_ASSERT(pArray == right.pArray);\n            return CurIndex - right.CurIndex;\n        }\n        ValueType& operator*() const    { OVR_ASSERT(pArray); return  (*pArray)[CurIndex]; }\n        ValueType* operator->() const   { OVR_ASSERT(pArray); return &(*pArray)[CurIndex]; }\n        ValueType* GetPtr() const       { OVR_ASSERT(pArray); return &(*pArray)[CurIndex]; }\n\n        bool IsFinished() const { return !pArray || CurIndex < 0 || CurIndex >= (int)pArray->GetSize(); }\n\n        void Remove()\n        {\n            if (!IsFinished())\n                pArray->RemoveAt(CurIndex);\n        }\n\n        intptr_t GetIndex() const { return CurIndex; }\n    };\n\n    Iterator Begin() { return Iterator(this); }\n    Iterator End()   { return Iterator(this, (intptr_t)GetSize()); }\n    Iterator Last()  { return Iterator(this, (intptr_t)GetSize() - 1); }\n\n    class ConstIterator\n    {\n        const SelfType* pArray;\n        intptr_t        CurIndex;\n\n    public:\n        ConstIterator() : pArray(0), CurIndex(-1) {}\n        ConstIterator(const SelfType* parr, intptr_t idx = 0) : pArray(parr), CurIndex(idx) {}\n\n        bool operator==(const ConstIterator& it) const { return pArray == it.pArray && CurIndex == it.CurIndex; }\n        bool operator!=(const ConstIterator& it) const { return pArray != it.pArray || CurIndex != it.CurIndex; }\n\n        ConstIterator& operator++()\n        {\n            if (pArray)\n            {\n                if (CurIndex < (int)pArray->GetSize())\n                    ++CurIndex;\n            }\n            return *this;\n        }\n        ConstIterator operator++(int)\n        {\n            ConstIterator it(*this);\n            operator++();\n            return it;\n        }\n        ConstIterator& operator--()\n        {\n            if (pArray)\n            {\n                if (CurIndex >= 0)\n                    --CurIndex;\n            }\n            return *this;\n        }\n        ConstIterator operator--(int)\n        {\n            ConstIterator it(*this);\n            operator--();\n            return it;\n        }\n        ConstIterator operator+(int delta) const\n        {\n            return ConstIterator(pArray, CurIndex + delta);\n        }\n        ConstIterator operator-(int delta) const\n        {\n            return ConstIterator(pArray, CurIndex - delta);\n        }\n        intptr_t operator-(const ConstIterator& right) const\n        {\n            OVR_ASSERT(pArray == right.pArray);\n            return CurIndex - right.CurIndex;\n        }\n        const ValueType& operator*() const  { OVR_ASSERT(pArray); return  (*pArray)[CurIndex]; }\n        const ValueType* operator->() const { OVR_ASSERT(pArray); return &(*pArray)[CurIndex]; }\n        const ValueType* GetPtr() const     { OVR_ASSERT(pArray); return &(*pArray)[CurIndex]; }\n\n        bool IsFinished() const { return !pArray || CurIndex < 0 || CurIndex >= (int)pArray->GetSize(); }\n\n        intptr_t GetIndex()  const { return CurIndex; }\n    };\n    ConstIterator Begin() const { return ConstIterator(this); }\n    ConstIterator End() const   { return ConstIterator(this, (intptr_t)GetSize()); }\n    ConstIterator Last() const  { return ConstIterator(this, (intptr_t)GetSize() - 1); }\n\nprotected:\n    ArrayData   Data;\n};\n\n\n\n//-----------------------------------------------------------------------------------\n// ***** Array\n//\n// General purpose array for movable objects that require explicit \n// construction/destruction.\ntemplate<class T, class SizePolicy=ArrayDefaultPolicy>\nclass Array : public ArrayBase<ArrayData<T, ContainerAllocator<T>, SizePolicy> >\n{\npublic:\n    typedef T                                                           ValueType;\n    typedef ContainerAllocator<T>                                       AllocatorType;\n    typedef SizePolicy                                                  SizePolicyType;\n    typedef Array<T, SizePolicy>                                        SelfType;\n    typedef ArrayBase<ArrayData<T, ContainerAllocator<T>, SizePolicy> > BaseType;\n\n    Array() : BaseType() {}\n    Array(size_t size) : BaseType(size) {}\n    Array(const SizePolicyType& p) : BaseType() { SetSizePolicy(p); }\n    Array(const SelfType& a) : BaseType(a) {}\n    const SelfType& operator=(const SelfType& a) { BaseType::operator=(a); return *this; }\n};\n\n// ***** ArrayPOD\n//\n// General purpose array for movable objects that DOES NOT require  \n// construction/destruction. Constructors and destructors are not called! \n// Global heap is in use.\ntemplate<class T, class SizePolicy=ArrayDefaultPolicy>\nclass ArrayPOD : public ArrayBase<ArrayData<T, ContainerAllocator_POD<T>, SizePolicy> >\n{\npublic:\n    typedef T                                                               ValueType;\n    typedef ContainerAllocator_POD<T>                                       AllocatorType;\n    typedef SizePolicy                                                      SizePolicyType;\n    typedef ArrayPOD<T, SizePolicy>                                         SelfType;\n    typedef ArrayBase<ArrayData<T, ContainerAllocator_POD<T>, SizePolicy> > BaseType;\n\n    ArrayPOD() : BaseType() {}\n    ArrayPOD(size_t size) : BaseType(size) {}\n    ArrayPOD(const SizePolicyType& p) : BaseType() { SetSizePolicy(p); }\n    ArrayPOD(const SelfType& a) : BaseType(a) {}\n    const SelfType& operator=(const SelfType& a) { BaseType::operator=(a); return *this; }\n};\n\n\n// ***** ArrayCPP\n//\n// General purpose, fully C++ compliant array. Can be used with non-movable data.\n// Global heap is in use.\ntemplate<class T, class SizePolicy=ArrayDefaultPolicy>\nclass ArrayCPP : public ArrayBase<ArrayData<T, ContainerAllocator_CPP<T>, SizePolicy> >\n{\npublic:\n    typedef T                                                               ValueType;\n    typedef ContainerAllocator_CPP<T>                                       AllocatorType;\n    typedef SizePolicy                                                      SizePolicyType;\n    typedef ArrayCPP<T, SizePolicy>                                         SelfType;\n    typedef ArrayBase<ArrayData<T, ContainerAllocator_CPP<T>, SizePolicy> > BaseType;\n\n    ArrayCPP() : BaseType() {}\n    ArrayCPP(size_t size) : BaseType(size) {}\n    ArrayCPP(const SizePolicyType& p) : BaseType() { SetSizePolicy(p); }\n    ArrayCPP(const SelfType& a) : BaseType(a) {}\n    const SelfType& operator=(const SelfType& a) { BaseType::operator=(a); return *this; }\n};\n\n\n// ***** ArrayCC\n//\n// A modification of the array that uses the given default value to\n// construct the elements. The constructors and destructors are \n// properly called, the objects must be movable.\n\ntemplate<class T, class SizePolicy=ArrayDefaultPolicy>\nclass ArrayCC : public ArrayBase<ArrayDataCC<T, ContainerAllocator<T>, SizePolicy> >\n{\npublic:\n    typedef T                                                               ValueType;\n    typedef ContainerAllocator<T>                                           AllocatorType;\n    typedef SizePolicy                                                      SizePolicyType;\n    typedef ArrayCC<T, SizePolicy>                                          SelfType;\n    typedef ArrayBase<ArrayDataCC<T, ContainerAllocator<T>, SizePolicy> >   BaseType;\n\n    ArrayCC(const ValueType& defval) : BaseType(defval) {}\n    ArrayCC(const ValueType& defval, size_t size) : BaseType(defval, size) {}\n    ArrayCC(const ValueType& defval, const SizePolicyType& p) : BaseType(defval) { SetSizePolicy(p); }\n    ArrayCC(const SelfType& a) : BaseType(a) {}\n    const SelfType& operator=(const SelfType& a) { BaseType::operator=(a); return *this; }\n};\n\n} // OVR\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Atomic.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Atomic.cpp\nContent     :   Contains atomic operations and inline fastest locking\n                functionality. Will contain #ifdefs for OS efficiency.\n                Have non-thread-safe implementation if not available.\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_Atomic.h\"\n#include \"OVR_Allocator.h\"\n\n#ifdef OVR_ENABLE_THREADS\n\n// Include Windows 8-Metro compatible Synchronization API\n#if defined(OVR_OS_MS) && defined(NTDDI_WIN8) && (NTDDI_VERSION >= NTDDI_WIN8)\n#include <synchapi.h>\n#endif\n\n\nnamespace OVR {\n\n// ***** Windows Lock implementation\n\n#if defined(OVR_OS_MS)\n\n// ***** Standard Win32 Lock implementation\n\n// Constructors\nLock::Lock(unsigned spinCount)\n{\n    #if defined(NTDDI_WIN8) && (NTDDI_VERSION >= NTDDI_WIN8)\n       // On Windows 8 we use InitializeCriticalSectionEx due to Metro-Compatibility\n       InitializeCriticalSectionEx(&cs, (DWORD)spinCount,\n                                   OVR_DEBUG_SELECT(NULL, CRITICAL_SECTION_NO_DEBUG_INFO));\n    #else\n        ::InitializeCriticalSectionAndSpinCount(&cs, (DWORD)spinCount); // This is available with WindowsXP+.\n    #endif\n}\n\n\nLock::~Lock()\n{\n    DeleteCriticalSection(&cs);\n}\n\n\n#endif\n\n\n//-------------------------------------------------------------------------------------\n// ***** SharedLock\n\n// This is a general purpose globally shared Lock implementation that should probably be\n// moved to Kernel.\n// May in theory busy spin-wait if we hit contention on first lock creation,\n// but this shouldn't matter in practice since Lock* should be cached.\n\n\nenum { LockInitMarker = 0xFFFFFFFF };\n\nLock* SharedLock::GetLockAddRef()\n{\n    int oldUseCount;\n\n    do {\n        oldUseCount = UseCount;\n        if (oldUseCount == (int)LockInitMarker)\n            continue;\n\n        if (oldUseCount == 0)\n        {\n            // Initialize marker\n            if (AtomicOps<int>::CompareAndSet_Sync(&UseCount, 0, LockInitMarker))\n            {\n                Construct<Lock>(Buffer);\n                do { }\n                while (!AtomicOps<int>::CompareAndSet_Sync(&UseCount, LockInitMarker, 1));\n                return toLock();\n            }\n            continue;\n        }\n\n    } while (!AtomicOps<int>::CompareAndSet_NoSync(&UseCount, oldUseCount, oldUseCount + 1));\n\n    return toLock();\n}\n\nvoid SharedLock::ReleaseLock(Lock* plock)\n{\n    OVR_UNUSED(plock);\n    OVR_ASSERT(plock == toLock());\n\n    int oldUseCount;\n\n    do {\n        oldUseCount = UseCount;\n        OVR_ASSERT(oldUseCount != (int)LockInitMarker);\n\n        if (oldUseCount == 1)\n        {\n            // Initialize marker\n            if (AtomicOps<int>::CompareAndSet_Sync(&UseCount, 1, LockInitMarker))\n            {\n                Destruct<Lock>(toLock());\n\n                do { }\n                while (!AtomicOps<int>::CompareAndSet_Sync(&UseCount, LockInitMarker, 0));\n\n                return;\n            }\n            continue;\n        }\n\n    } while (!AtomicOps<int>::CompareAndSet_NoSync(&UseCount, oldUseCount, oldUseCount - 1));\n}\n\n} // OVR\n\n#endif // OVR_ENABLE_THREADS\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Atomic.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR_Kernel.h\nFilename    :   OVR_Atomic.h\nContent     :   Contains atomic operations and inline fastest locking\n                functionality. Will contain #ifdefs for OS efficiency.\n                Have non-thread-safe implementaion if not available.\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Atomic_h\n#define OVR_Atomic_h\n\n#include \"OVR_Types.h\"\n\n// Include System thread functionality.\n#if defined(OVR_OS_MS) && !defined(OVR_OS_MS_MOBILE)\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n#include <Windows.h>\n#else\n#include <pthread.h>\n#endif\n\n#ifdef OVR_CC_MSVC\n#include <intrin.h>\n#pragma intrinsic(_ReadBarrier, _WriteBarrier, _ReadWriteBarrier)\n#endif\n\nnamespace OVR {\n\n\n// ****** Declared classes\n\n// If there is NO thread support we implement AtomicOps and\n// Lock objects as no-ops. The other classes are not defined.\ntemplate<class C> class AtomicOps;\ntemplate<class T> class AtomicInt;\ntemplate<class T> class AtomicPtr;\n\nclass Lock;\n\n\n//-----------------------------------------------------------------------------------\n// ***** AtomicOps\n\n// Atomic operations are provided by the AtomicOps templates class,\n// implemented through system-specific AtomicOpsRaw specializations.\n// It provides several fundamental operations such as Exchange, ExchangeAdd\n// CompareAndSet, and Store_Release. Each function includes several memory\n// synchronization versions, important for multiprocessing CPUs with weak\n// memory consistency. The following memory fencing strategies are supported:\n//\n//  - NoSync.  No memory synchronization is done for atomic op.\n//  - Release. All other memory writes are completed before atomic op\n//             writes its results.\n//  - Acquire. Further memory reads are forced to wait until atomic op\n//             executes, guaranteeing that the right values will be seen.\n//  - Sync.    A combination of Release and Acquire.\n\n\n// *** AtomicOpsRaw\n\n// AtomicOpsRaw is a specialized template that provides atomic operations \n// used by AtomicOps. This class has two fundamental qualities: (1) it\n// defines a type T of correct size, and (2) provides operations that work\n// atomically, such as Exchange_Sync and CompareAndSet_Release.\n\n// AtomicOpsRawBase class contains shared constants/classes for AtomicOpsRaw.\n// The primary thing is does is define sync class objects, whose destructor and\n// constructor provide places to insert appropriate synchronization calls, on \n// systems where such calls are necessary. So far, the breakdown is as follows:\n// \n//  - X86 systems don't need custom syncs, since their exchange/atomic\n//    instructions are implicitly synchronized.\n//  - PowerPC requires lwsync/isync instructions that can use this mechanism.\n//  - If some other systems require a mechanism where syncing type is associated\n//    with a particular instruction, the default implementation (which implements\n//    all Sync, Acquire, and Release modes in terms of NoSync and fence) may not\n//    work. Ii that case it will need to be #ifdef-ed conditionally.\n\nstruct AtomicOpsRawBase\n{\n#if !defined(OVR_ENABLE_THREADS) || defined(OVR_CPU_X86) || defined(OVR_CPU_X86_64)\n    // Need to have empty constructor to avoid class 'unused' variable warning.\n    struct FullSync { inline FullSync() { } };\n    struct AcquireSync { inline AcquireSync() { } };\n    struct ReleaseSync { inline ReleaseSync() { } };\n\n#elif defined(OVR_CPU_PPC64) || defined(OVR_CPU_PPC)\n    struct FullSync { inline FullSync() { asm volatile(\"sync\\n\"); } ~FullSync() { asm volatile(\"isync\\n\"); } };\n    struct AcquireSync { inline AcquireSync() { } ~AcquireSync() { asm volatile(\"isync\\n\"); } };\n    struct ReleaseSync { inline ReleaseSync() { asm volatile(\"sync\\n\"); } };\n\n#elif defined(OVR_CPU_MIPS)\n    struct FullSync { inline FullSync() { asm volatile(\"sync\\n\"); } ~FullSync() { asm volatile(\"sync\\n\"); } };\n    struct AcquireSync { inline AcquireSync() { } ~AcquireSync() { asm volatile(\"sync\\n\"); } };\n    struct ReleaseSync { inline ReleaseSync() { asm volatile(\"sync\\n\"); } };\n\n#elif defined(OVR_CPU_ARM) // Includes Android and iOS.\n    struct FullSync { inline FullSync() { asm volatile(\"dmb\\n\"); } ~FullSync() { asm volatile(\"dmb\\n\"); } };\n    struct AcquireSync { inline AcquireSync() { } ~AcquireSync() { asm volatile(\"dmb\\n\"); } };\n    struct ReleaseSync { inline ReleaseSync() { asm volatile(\"dmb\\n\"); } };\n\n#elif defined(OVR_CC_GNU) && (__GNUC__ >= 4)\n    // __sync functions are already full sync\n    struct FullSync { inline FullSync() { } };\n    struct AcquireSync { inline AcquireSync() { } };\n    struct ReleaseSync { inline ReleaseSync() { } };\n#endif\n};\n\n\n// 4-Byte raw data atomic op implementation class.\nstruct AtomicOpsRaw_4ByteImpl : public AtomicOpsRawBase\n{\n#if !defined(OVR_ENABLE_THREADS)\n\n    // Provide a type for no-thread-support cases. Used by AtomicOpsRaw_DefImpl.\n    typedef uint32_t T;   \n\n    // *** Thread - Safe Atomic Versions.\n\n#elif defined(OVR_OS_MS) \n\n    // Use special defined for VC6, where volatile is not used and\n    // InterlockedCompareExchange is declared incorrectly.\n    typedef LONG T;      \n#if defined(OVR_CC_MSVC) && (OVR_CC_MSVC < 1300)\n    typedef T* InterlockTPtr;\n    typedef LPVOID ET;\n    typedef ET* InterlockETPtr;\n#else\n    typedef volatile T* InterlockTPtr;\n    typedef T ET;\n    typedef InterlockTPtr InterlockETPtr;\n#endif\n    inline static T     Exchange_NoSync(volatile T* p, T val)            { return InterlockedExchange((InterlockTPtr)p, val); }\n    inline static T     ExchangeAdd_NoSync(volatile T* p, T val)         { return InterlockedExchangeAdd((InterlockTPtr)p, val); }\n    inline static bool  CompareAndSet_NoSync(volatile T* p, T c, T val)  { return InterlockedCompareExchange((InterlockETPtr)p, (ET)val, (ET)c) == (ET)c; }\n\n#elif defined(OVR_CPU_PPC64) || defined(OVR_CPU_PPC)\n    typedef uint32_t T;\n    static inline uint32_t Exchange_NoSync(volatile uint32_t *i, uint32_t j)\n    {\n        uint32_t ret;\n\n        asm volatile(\"1:\\n\\t\"\n                     \"lwarx  %[r],0,%[i]\\n\\t\"\n                     \"stwcx. %[j],0,%[i]\\n\\t\"\n                     \"bne-   1b\\n\"\n                     : \"+m\" (*i), [r] \"=&b\" (ret) : [i] \"b\" (i), [j] \"b\" (j) : \"cc\", \"memory\");\n\n        return ret;\n    }\n\n    static inline uint32_t ExchangeAdd_NoSync(volatile uint32_t *i, uint32_t j)\n    {\n        uint32_t dummy, ret;\n\n        asm volatile(\"1:\\n\\t\"\n                     \"lwarx  %[r],0,%[i]\\n\\t\"\n                     \"add    %[o],%[r],%[j]\\n\\t\"\n                     \"stwcx. %[o],0,%[i]\\n\\t\"\n                     \"bne-   1b\\n\"\n                     : \"+m\" (*i), [r] \"=&b\" (ret), [o] \"=&r\" (dummy) : [i] \"b\" (i), [j] \"b\" (j) : \"cc\", \"memory\");\n\n        return ret;\n    }\n\n    static inline bool     CompareAndSet_NoSync(volatile uint32_t *i, uint32_t c, uint32_t value)\n    {\n        uint32_t ret;\n\n        asm volatile(\"1:\\n\\t\"\n                     \"lwarx  %[r],0,%[i]\\n\\t\"\n                     \"cmpw   0,%[r],%[cmp]\\n\\t\"\n                     \"mfcr   %[r]\\n\\t\"\n                     \"bne-   2f\\n\\t\"\n                     \"stwcx. %[val],0,%[i]\\n\\t\"\n                     \"bne-   1b\\n\\t\"\n                     \"2:\\n\"\n                     : \"+m\" (*i), [r] \"=&b\" (ret) : [i] \"b\" (i), [cmp] \"b\" (c), [val] \"b\" (value) : \"cc\", \"memory\");\n\n        return (ret & 0x20000000) ? 1 : 0;\n    }\n\n#elif defined(OVR_CPU_MIPS)\n    typedef uint32_t T;\n\n    static inline uint32_t Exchange_NoSync(volatile uint32_t *i, uint32_t j)\n    {\n        uint32_t ret;\n\n        asm volatile(\"1:\\n\\t\"\n                     \"ll     %[r],0(%[i])\\n\\t\"\n                     \"sc     %[j],0(%[i])\\n\\t\"\n                     \"beq    %[j],$0,1b\\n\\t\"\n                     \"nop    \\n\"\n                     : \"+m\" (*i), [r] \"=&d\" (ret) : [i] \"d\" (i), [j] \"d\" (j) : \"cc\", \"memory\");\n\n        return ret;\n    }\n\n    static inline uint32_t ExchangeAdd_NoSync(volatile uint32_t *i, uint32_t j)\n    {\n        uint32_t ret;\n\n        asm volatile(\"1:\\n\\t\"\n                     \"ll     %[r],0(%[i])\\n\\t\"\n                     \"addu   %[j],%[r],%[j]\\n\\t\"\n                     \"sc     %[j],0(%[i])\\n\\t\"\n                     \"beq    %[j],$0,1b\\n\\t\"\n                     \"nop    \\n\"\n                     : \"+m\" (*i), [r] \"=&d\" (ret) : [i] \"d\" (i), [j] \"d\" (j) : \"cc\", \"memory\");\n\n        return ret;\n    }\n\n    static inline bool     CompareAndSet_NoSync(volatile uint32_t *i, uint32_t c, uint32_t value)\n    {\n        uint32_t ret, dummy;\n\n        asm volatile(\"1:\\n\\t\"\n                     \"move   %[r],$0\\n\\t\"\n                     \"ll     %[o],0(%[i])\\n\\t\"\n                     \"bne    %[o],%[c],2f\\n\\t\"\n                     \"move   %[r],%[v]\\n\\t\"\n                     \"sc     %[r],0(%[i])\\n\\t\"\n                     \"beq    %[r],$0,1b\\n\\t\"\n                     \"nop    \\n\\t\"\n                     \"2:\\n\"\n                     : \"+m\" (*i),[r] \"=&d\" (ret), [o] \"=&d\" (dummy) : [i] \"d\" (i), [c] \"d\" (c), [v] \"d\" (value)\n                     : \"cc\", \"memory\");\n\n        return ret;\n    }\n\n#elif defined(OVR_CPU_ARM) && defined(OVR_CC_ARM)\n    typedef uint32_t T;\n\n    static inline uint32_t Exchange_NoSync(volatile uint32_t *i, uint32_t j)\n    {\n        for(;;)\n        {\n            T r = __ldrex(i);\n            if (__strex(j, i) == 0)\n                return r;\n        }\n    }\n    static inline uint32_t ExchangeAdd_NoSync(volatile uint32_t *i, uint32_t j)\n    {\n        for(;;)\n        {\n            T r = __ldrex(i);\n            if (__strex(r + j, i) == 0)\n                return r;\n        }\n    }\n\n    static inline bool     CompareAndSet_NoSync(volatile uint32_t *i, uint32_t c, uint32_t value)\n    {\n        for(;;)\n        {\n            T r = __ldrex(i);\n            if (r != c)\n                return 0;\n            if (__strex(value, i) == 0)\n                return 1;\n        }\n    }\n\n#elif defined(OVR_CPU_ARM)\n    typedef uint32_t T;\n\n    static inline uint32_t Exchange_NoSync(volatile uint32_t *i, uint32_t j)\n    {\n        uint32_t ret, dummy;\n\n        asm volatile(\"1:\\n\\t\"\n            \"ldrex  %[r],[%[i]]\\n\\t\"\n            \"strex  %[t],%[j],[%[i]]\\n\\t\"\n            \"cmp    %[t],#0\\n\\t\"\n            \"bne    1b\\n\\t\"\n            : \"+m\" (*i), [r] \"=&r\" (ret), [t] \"=&r\" (dummy) : [i] \"r\" (i), [j] \"r\" (j) : \"cc\", \"memory\");\n\n        return ret;\n    }\n\n    static inline uint32_t ExchangeAdd_NoSync(volatile uint32_t *i, uint32_t j)\n    {\n        uint32_t ret, dummy, test;\n\n        asm volatile(\"1:\\n\\t\"\n            \"ldrex  %[r],[%[i]]\\n\\t\"\n            \"add    %[o],%[r],%[j]\\n\\t\"\n            \"strex  %[t],%[o],[%[i]]\\n\\t\"\n            \"cmp    %[t],#0\\n\\t\"\n            \"bne    1b\\n\\t\"\n            : \"+m\" (*i), [r] \"=&r\" (ret), [o] \"=&r\" (dummy), [t] \"=&r\" (test)  : [i] \"r\" (i), [j] \"r\" (j) : \"cc\", \"memory\");\n\n        return ret;\n    }\n\n    static inline bool     CompareAndSet_NoSync(volatile uint32_t *i, uint32_t c, uint32_t value)\n    {\n        uint32_t ret = 1, dummy, test;\n\n        asm volatile(\"1:\\n\\t\"\n            \"ldrex  %[o],[%[i]]\\n\\t\"\n            \"cmp    %[o],%[c]\\n\\t\"\n            \"bne    2f\\n\\t\"\n            \"strex  %[r],%[v],[%[i]]\\n\\t\"\n            \"cmp    %[r],#0\\n\\t\"\n            \"bne    1b\\n\\t\"\n            \"2:\\n\"\n            : \"+m\" (*i),[r] \"=&r\" (ret), [o] \"=&r\" (dummy), [t] \"=&r\" (test) : [i] \"r\" (i), [c] \"r\" (c), [v] \"r\" (value)\n            : \"cc\", \"memory\");\n\n        return !ret;\n    }\n\n#elif defined(OVR_CPU_X86)\n    typedef uint32_t T;\n\n    static inline uint32_t Exchange_NoSync(volatile uint32_t *i, uint32_t j)\n    {\n        asm volatile(\"xchgl %1,%[i]\\n\"\n                     : \"+m\" (*i), \"=q\" (j) : [i] \"m\" (*i), \"1\" (j) : \"cc\", \"memory\");\n\n        return j;\n    }\n\n    static inline uint32_t ExchangeAdd_NoSync(volatile uint32_t *i, uint32_t j)\n    {\n        asm volatile(\"lock; xaddl %1,%[i]\\n\"\n                     : \"+m\" (*i), \"+q\" (j) : [i] \"m\" (*i) : \"cc\", \"memory\");\n\n        return j;\n    }\n\n    static inline bool     CompareAndSet_NoSync(volatile uint32_t *i, uint32_t c, uint32_t value)\n    {\n        uint32_t ret;\n\n        asm volatile(\"lock; cmpxchgl %[v],%[i]\\n\"\n                     : \"+m\" (*i), \"=a\" (ret) : [i] \"m\" (*i), \"1\" (c), [v] \"q\" (value) : \"cc\", \"memory\");\n\n        return (ret == c);\n    }\n\n#elif defined(OVR_CC_GNU) && (__GNUC__ >= 4 && __GNUC_MINOR__ >= 1)\n\n    typedef uint32_t T;\n\n    static inline T   Exchange_NoSync(volatile T *i, T j)\n    {\n        T v;\n        do {\n            v = *i;\n        } while (!__sync_bool_compare_and_swap(i, v, j));\n        return v;\n    }\n\n    static inline T   ExchangeAdd_NoSync(volatile T *i, T j)\n    {\n        return __sync_fetch_and_add(i, j);\n    }\n\n    static inline bool     CompareAndSet_NoSync(volatile T *i, T c, T value)\n    {\n        return __sync_bool_compare_and_swap(i, c, value);\n    }\n\n#endif // OS\n};\n\n\n// 8-Byte raw data data atomic op implementation class.\n// Currently implementation is provided only on systems with 64-bit pointers.\nstruct AtomicOpsRaw_8ByteImpl : public AtomicOpsRawBase\n{    \n#if !defined(OVR_64BIT_POINTERS) || !defined(OVR_ENABLE_THREADS)\n\n    // Provide a type for no-thread-support cases. Used by AtomicOpsRaw_DefImpl.\n    typedef uint64_t T;\n\n    // *** Thread - Safe OS specific versions.\n#elif defined(OVR_OS_MS)\n\n    // This is only for 64-bit systems.\n    typedef LONG64      T;\n    typedef volatile T* InterlockTPtr;    \n    inline static T     Exchange_NoSync(volatile T* p, T val)            { return InterlockedExchange64((InterlockTPtr)p, val); }\n    inline static T     ExchangeAdd_NoSync(volatile T* p, T val)         { return InterlockedExchangeAdd64((InterlockTPtr)p, val); }\n    inline static bool  CompareAndSet_NoSync(volatile T* p, T c, T val)  { return InterlockedCompareExchange64((InterlockTPtr)p, val, c) == c; }\n\n#elif defined(OVR_CPU_PPC64)\n \n    typedef uint64_t T;\n\n    static inline uint64_t Exchange_NoSync(volatile uint64_t *i, uint64_t j)\n    {\n        uint64_t dummy, ret;\n\n        asm volatile(\"1:\\n\\t\"\n                     \"ldarx  %[r],0,%[i]\\n\\t\"\n                     \"mr     %[o],%[j]\\n\\t\"\n                     \"stdcx. %[o],0,%[i]\\n\\t\"\n                     \"bne-   1b\\n\"\n                     : \"+m\" (*i), [r] \"=&b\" (ret), [o] \"=&r\" (dummy) : [i] \"b\" (i), [j] \"b\" (j) : \"cc\");\n\n        return ret;\n    }\n\n    static inline uint64_t ExchangeAdd_NoSync(volatile uint64_t *i, uint64_t j)\n    {\n        uint64_t dummy, ret;\n\n        asm volatile(\"1:\\n\\t\"\n                     \"ldarx  %[r],0,%[i]\\n\\t\"\n                     \"add    %[o],%[r],%[j]\\n\\t\"\n                     \"stdcx. %[o],0,%[i]\\n\\t\"\n                     \"bne-   1b\\n\"\n                     : \"+m\" (*i), [r] \"=&b\" (ret), [o] \"=&r\" (dummy) : [i] \"b\" (i), [j] \"b\" (j) : \"cc\");\n\n        return ret;\n    }\n\n    static inline bool     CompareAndSet_NoSync(volatile uint64_t *i, uint64_t c, uint64_t value)\n    {\n        uint64_t ret, dummy;\n\n        asm volatile(\"1:\\n\\t\"\n                     \"ldarx  %[r],0,%[i]\\n\\t\"\n                     \"cmpw   0,%[r],%[cmp]\\n\\t\"\n                     \"mfcr   %[r]\\n\\t\"\n                     \"bne-   2f\\n\\t\"\n                     \"stdcx. %[val],0,%[i]\\n\\t\"\n                     \"bne-   1b\\n\\t\"\n                     \"2:\\n\"\n                     : \"+m\" (*i), [r] \"=&b\" (ret), [o] \"=&r\" (dummy) : [i] \"b\" (i), [cmp] \"b\" (c), [val] \"b\" (value) : \"cc\");\n\n        return (ret & 0x20000000) ? 1 : 0;\n    }\n\n#elif defined(OVR_CC_GNU) && (__GNUC__ >= 4 && __GNUC_MINOR__ >= 1)\n\n    typedef uint64_t T;\n\n    static inline T   Exchange_NoSync(volatile T *i, T j)\n    {\n        T v;\n        do {\n            v = *i;\n        } while (!__sync_bool_compare_and_swap(i, v, j));\n        return v;\n    }\n\n    static inline T   ExchangeAdd_NoSync(volatile T *i, T j)\n    {\n        return __sync_fetch_and_add(i, j);\n    }\n\n    static inline bool     CompareAndSet_NoSync(volatile T *i, T c, T value)\n    {\n        return __sync_bool_compare_and_swap(i, c, value);\n    }\n\n#endif // OS\n};\n\n\n// Default implementation for AtomicOpsRaw; provides implementation of mem-fenced\n// atomic operations where fencing is done with a sync object wrapped around a NoSync\n// operation implemented in the base class. If such implementation is not possible\n// on a given platform, #ifdefs can be used to disable it and then op functions can be\n// implemented individually in the appropriate AtomicOpsRaw<size> class.\n\ntemplate<class O>\nstruct AtomicOpsRaw_DefImpl : public O\n{\n    typedef typename O::T O_T;\n    typedef typename O::FullSync    O_FullSync;\n    typedef typename O::AcquireSync O_AcquireSync;\n    typedef typename O::ReleaseSync O_ReleaseSync;\n\n    // If there is no thread support, provide the default implementation. In this case,\n    // the base class (0) must still provide the T declaration.\n#ifndef OVR_ENABLE_THREADS\n\n    // Atomic exchange of val with argument. Returns old val.\n    inline static O_T   Exchange_NoSync(volatile O_T* p, O_T val)           { O_T old = *p; *p = val; return old; }\n    // Adds a new val to argument; returns its old val.\n    inline static O_T   ExchangeAdd_NoSync(volatile O_T* p, O_T val)        { O_T old = *p; *p += val; return old; }\n    // Compares the argument data with 'c' val.\n    // If succeeded, stores val int '*p' and returns true; otherwise returns false.\n    inline static bool  CompareAndSet_NoSync(volatile O_T* p, O_T c, O_T val) { if (*p==c) { *p = val; return 1; } return 0; }\n\n#endif\n\n    // If NoSync wrapped implementation may not be possible, it this block should be\n    //  replaced with per-function implementation in O.\n    // \"AtomicOpsRaw_DefImpl<O>::\" prefix in calls below.\n    inline static O_T   Exchange_Sync(volatile O_T* p, O_T val)                { O_FullSync    sync; OVR_UNUSED(sync); return AtomicOpsRaw_DefImpl<O>::Exchange_NoSync(p, val); }\n    inline static O_T   Exchange_Release(volatile O_T* p, O_T val)             { O_ReleaseSync sync; OVR_UNUSED(sync); return AtomicOpsRaw_DefImpl<O>::Exchange_NoSync(p, val); }\n    inline static O_T   Exchange_Acquire(volatile O_T* p, O_T val)             { O_AcquireSync sync; OVR_UNUSED(sync); return AtomicOpsRaw_DefImpl<O>::Exchange_NoSync(p, val); }  \n    inline static O_T   ExchangeAdd_Sync(volatile O_T* p, O_T val)             { O_FullSync    sync; OVR_UNUSED(sync); return AtomicOpsRaw_DefImpl<O>::ExchangeAdd_NoSync(p, val); }\n    inline static O_T   ExchangeAdd_Release(volatile O_T* p, O_T val)          { O_ReleaseSync sync; OVR_UNUSED(sync); return AtomicOpsRaw_DefImpl<O>::ExchangeAdd_NoSync(p, val); }\n    inline static O_T   ExchangeAdd_Acquire(volatile O_T* p, O_T val)          { O_AcquireSync sync; OVR_UNUSED(sync); return AtomicOpsRaw_DefImpl<O>::ExchangeAdd_NoSync(p, val); }\n    inline static bool  CompareAndSet_Sync(volatile O_T* p, O_T c, O_T val)    { O_FullSync    sync; OVR_UNUSED(sync); return AtomicOpsRaw_DefImpl<O>::CompareAndSet_NoSync(p,c,val); }\n    inline static bool  CompareAndSet_Release(volatile O_T* p, O_T c, O_T val) { O_ReleaseSync sync; OVR_UNUSED(sync); return AtomicOpsRaw_DefImpl<O>::CompareAndSet_NoSync(p,c,val); }\n    inline static bool  CompareAndSet_Acquire(volatile O_T* p, O_T c, O_T val) { O_AcquireSync sync; OVR_UNUSED(sync); return AtomicOpsRaw_DefImpl<O>::CompareAndSet_NoSync(p,c,val); }\n\n    // Loads and stores with memory fence. These have only the relevant versions.\n#ifdef OVR_CPU_X86\n    // On X86, Store_Release is implemented as exchange. Note that we can also\n    // consider 'sfence' in the future, although it is not as compatible with older CPUs.\n    inline static void  Store_Release(volatile O_T* p, O_T val)  { Exchange_Release(p, val); }\n#else\n    inline static void  Store_Release(volatile O_T* p, O_T val)  { O_ReleaseSync sync; OVR_UNUSED(sync); *p = val; }\n#endif\n    inline static O_T   Load_Acquire(const volatile O_T* p)\n    {\n        O_AcquireSync sync;\n        OVR_UNUSED(sync);\n\n#if defined(OVR_CC_MSVC)\n        _ReadBarrier(); // Compiler fence and load barrier\n#elif defined(OVR_CC_INTEL)\n        __memory_barrier(); // Compiler fence\n#else\n        // GCC-compatible:\n        asm volatile (\"\" : : : \"memory\"); // Compiler fence\n#endif\n\n        return *p;\n    }\n};\n\n\ntemplate<int size>\nstruct AtomicOpsRaw : public AtomicOpsRawBase { };\n\ntemplate<>\nstruct AtomicOpsRaw<4> : public AtomicOpsRaw_DefImpl<AtomicOpsRaw_4ByteImpl>\n{   \n    // Ensure that assigned type size is correct.\n    AtomicOpsRaw()\n    { OVR_COMPILER_ASSERT(sizeof(AtomicOpsRaw_DefImpl<AtomicOpsRaw_4ByteImpl>::T) == 4); }\n};\ntemplate<>\nstruct AtomicOpsRaw<8> : public AtomicOpsRaw_DefImpl<AtomicOpsRaw_8ByteImpl>\n{\n    AtomicOpsRaw()\n    { OVR_COMPILER_ASSERT(sizeof(AtomicOpsRaw_DefImpl<AtomicOpsRaw_8ByteImpl>::T) == 8); }\n};\n\n\n// *** AtomicOps - implementation of atomic Ops for specified class\n\n// Implements atomic ops on a class, provided that the object is either\n// 4 or 8 bytes in size (depending on the AtomicOpsRaw specializations\n// available). Relies on AtomicOpsRaw for much of implementation.\n\ntemplate<class C>\nclass AtomicOps\n{\n    typedef AtomicOpsRaw<sizeof(C)>       Ops;\n    typedef typename Ops::T               T;\n    typedef volatile typename Ops::T*     PT;\n    // We cast through unions to (1) avoid pointer size compiler warnings\n    // and (2) ensure that there are no problems with strict pointer aliasing.\n    union C2T_union { C c; T t; };\n\npublic:\n    // General purpose implementation for standard syncs.    \n    inline static C     Exchange_Sync(volatile C* p, C val)             { C2T_union u; u.c = val; u.t = Ops::Exchange_Sync((PT)p, u.t); return u.c; }\n    inline static C     Exchange_Release(volatile C* p, C val)          { C2T_union u; u.c = val; u.t = Ops::Exchange_Release((PT)p, u.t); return u.c; }\n    inline static C     Exchange_Acquire(volatile C* p, C val)          { C2T_union u; u.c = val; u.t = Ops::Exchange_Acquire((PT)p, u.t); return u.c; }\n    inline static C     Exchange_NoSync(volatile C* p, C val)           { C2T_union u; u.c = val; u.t = Ops::Exchange_NoSync((PT)p, u.t); return u.c; }\n    inline static C     ExchangeAdd_Sync(volatile C* p, C val)          { C2T_union u; u.c = val; u.t = Ops::ExchangeAdd_Sync((PT)p, u.t); return u.c; }\n    inline static C     ExchangeAdd_Release(volatile C* p, C val)       { C2T_union u; u.c = val; u.t = Ops::ExchangeAdd_Release((PT)p, u.t); return u.c; }\n    inline static C     ExchangeAdd_Acquire(volatile C* p, C val)       { C2T_union u; u.c = val; u.t = Ops::ExchangeAdd_Acquire((PT)p, u.t); return u.c; }\n    inline static C     ExchangeAdd_NoSync(volatile C* p, C val)        { C2T_union u; u.c = val; u.t = Ops::ExchangeAdd_NoSync((PT)p, u.t); return u.c; }\n    inline static bool  CompareAndSet_Sync(volatile C* p, C c, C val)   { C2T_union u,cu; u.c = val; cu.c = c; return Ops::CompareAndSet_Sync((PT)p, cu.t, u.t); }\n    inline static bool  CompareAndSet_Release(volatile C* p, C c, C val){ C2T_union u,cu; u.c = val; cu.c = c; return Ops::CompareAndSet_Release((PT)p, cu.t, u.t); }\n    inline static bool  CompareAndSet_Acquire(volatile C* p, C c, C val){ C2T_union u,cu; u.c = val; cu.c = c; return Ops::CompareAndSet_Acquire((PT)p, cu.t, u.t); }\n    inline static bool  CompareAndSet_NoSync(volatile C* p, C c, C val) { C2T_union u,cu; u.c = val; cu.c = c; return Ops::CompareAndSet_NoSync((PT)p, cu.t, u.t); }\n\n    // Loads and stores with memory fence. These have only the relevant versions.    \n    inline static void  Store_Release(volatile C* p, C val)             { C2T_union u; u.c = val; Ops::Store_Release((PT)p, u.t); }    \n    inline static C     Load_Acquire(const volatile C* p)               { C2T_union u; u.t = Ops::Load_Acquire((PT)p); return u.c; }\n\n    // Deprecated typo error:\n    inline static bool  CompareAndSet_Relse(volatile C* p, C c, C val){ C2T_union u,cu; u.c = val; cu.c = c; return Ops::CompareAndSet_Acquire((PT)p, cu.t, u.t); }\n};\n\n\n\n// Atomic value base class - implements operations shared for integers and pointers.\ntemplate<class T>\nclass AtomicValueBase\n{\nprotected:\n    typedef AtomicOps<T> Ops;\npublic:\n\n    volatile T  Value;\n\n    inline AtomicValueBase()                  { }\n    explicit inline AtomicValueBase(T val)    { Ops::Store_Release(&Value, val); }\n\n    // Most libraries (TBB and Joshua Scholar's) library do not do Load_Acquire\n    // here, since most algorithms do not require atomic loads. Needs some research.    \n    inline operator T() const { return Value; }\n\n    // *** Standard Atomic inlines\n    inline T     Exchange_Sync(T val)               { return Ops::Exchange_Sync(&Value,  val); }\n    inline T     Exchange_Release(T val)            { return Ops::Exchange_Release(&Value, val); }\n    inline T     Exchange_Acquire(T val)            { return Ops::Exchange_Acquire(&Value, val); }\n    inline T     Exchange_NoSync(T val)             { return Ops::Exchange_NoSync(&Value, val); }\n    inline bool  CompareAndSet_Sync(T c, T val)     { return Ops::CompareAndSet_Sync(&Value, c, val); }\n    inline bool  CompareAndSet_Release(T c, T val)  { return Ops::CompareAndSet_Release(&Value, c, val); }\n    inline bool  CompareAndSet_Acquire(T c, T val)  { return Ops::CompareAndSet_Acquire(&Value, c, val); }\n    inline bool  CompareAndSet_NoSync(T c, T val)   { return Ops::CompareAndSet_NoSync(&Value, c, val); }\n    // Load & Store.\n    inline void  Store_Release(T val)               { Ops::Store_Release(&Value, val); }\n    inline T     Load_Acquire() const               { return Ops::Load_Acquire(&Value);  }\n};\n\n\n// ***** AtomicPtr - Atomic pointer template\n\n// This pointer class supports atomic assignments with release,\n// increment / decrement operations, and conditional compare + set.\n\ntemplate<class T>\nclass AtomicPtr : public AtomicValueBase<T*>\n{\n    typedef typename AtomicValueBase<T*>::Ops Ops;\n\npublic:\n    // Initialize pointer value to 0 by default; use Store_Release only with explicit constructor.\n    inline AtomicPtr() : AtomicValueBase<T*>()                     { this->Value = 0; }\n    explicit inline AtomicPtr(T* val) : AtomicValueBase<T*>(val)   { }\n        \n    // Pointer access.\n    inline T* operator -> () const     { return this->Load_Acquire(); }\n\n    // It looks like it is convenient to have Load_Acquire characteristics\n    // for this, since that is convenient for algorithms such as linked\n    // list traversals that can be added to bu another thread.\n    inline operator T* () const        { return this->Load_Acquire(); }\n\n\n    // *** Standard Atomic inlines (applicable to pointers)\n\n    // ExhangeAdd considers pointer size for pointers.\n    template<class I>\n    inline T*     ExchangeAdd_Sync(I incr)      { return Ops::ExchangeAdd_Sync(&this->Value, ((T*)0) + incr); }\n    template<class I>\n    inline T*     ExchangeAdd_Release(I incr)   { return Ops::ExchangeAdd_Release(&this->Value, ((T*)0) + incr); }\n    template<class I>\n    inline T*     ExchangeAdd_Acquire(I incr)   { return Ops::ExchangeAdd_Acquire(&this->Value, ((T*)0) + incr); }\n    template<class I>\n    inline T*     ExchangeAdd_NoSync(I incr)    { return Ops::ExchangeAdd_NoSync(&this->Value, ((T*)0) + incr); }\n\n    // *** Atomic Operators\n\n    inline T* operator = (T* val)  { this->Store_Release(val); return val; }\n\n    template<class I>\n    inline T* operator += (I val) { return ExchangeAdd_Sync(val) + val; }\n    template<class I>\n    inline T* operator -= (I val) { return operator += (-val); }\n\n    inline T* operator ++ ()      { return ExchangeAdd_Sync(1) + 1; }\n    inline T* operator -- ()      { return ExchangeAdd_Sync(-1) - 1; }\n    inline T* operator ++ (int)   { return ExchangeAdd_Sync(1); }\n    inline T* operator -- (int)   { return ExchangeAdd_Sync(-1); }\n};\n\n\n// ***** AtomicInt - Atomic integer template\n\n// Implements an atomic integer type; the exact type to use is provided \n// as an argument. Supports atomic Acquire / Release semantics, atomic\n// arithmetic operations, and atomic conditional compare + set.\n\ntemplate<class T>\nclass AtomicInt : public AtomicValueBase<T>\n{\n    typedef typename AtomicValueBase<T>::Ops Ops;\n\npublic:\n    inline AtomicInt() : AtomicValueBase<T>()                     { }\n    explicit inline AtomicInt(T val) : AtomicValueBase<T>(val)    { }\n\n\n    // *** Standard Atomic inlines (applicable to int)   \n    inline T     ExchangeAdd_Sync(T val)            { return Ops::ExchangeAdd_Sync(&this->Value, val); }\n    inline T     ExchangeAdd_Release(T val)         { return Ops::ExchangeAdd_Release(&this->Value, val); }\n    inline T     ExchangeAdd_Acquire(T val)         { return Ops::ExchangeAdd_Acquire(&this->Value, val); }\n    inline T     ExchangeAdd_NoSync(T val)          { return Ops::ExchangeAdd_NoSync(&this->Value, val); }\n    // These increments could be more efficient because they don't return a value.\n    inline void  Increment_Sync()                   { ExchangeAdd_Sync((T)1); }\n    inline void  Increment_Release()                { ExchangeAdd_Release((T)1); }\n    inline void  Increment_Acquire()                { ExchangeAdd_Acquire((T)1); }    \n    inline void  Increment_NoSync()                 { ExchangeAdd_NoSync((T)1); }\n\n    // *** Atomic Operators\n\n    inline T operator = (T val)  { this->Store_Release(val); return val; }\n    inline T operator += (T val) { return ExchangeAdd_Sync(val) + val; }\n    inline T operator -= (T val) { return ExchangeAdd_Sync(0 - val) - val; }\n\n    inline T operator ++ ()      { return ExchangeAdd_Sync((T)1) + 1; }\n    inline T operator -- ()      { return ExchangeAdd_Sync(((T)0)-1) - 1; }\n    inline T operator ++ (int)   { return ExchangeAdd_Sync((T)1); }\n    inline T operator -- (int)   { return ExchangeAdd_Sync(((T)0)-1); }\n\n    // More complex atomic operations. Leave it to compiler whether to optimize them or not.\n    T operator &= (T arg)\n    {\n        T comp, newVal;\n        do {\n            comp   = this->Value;\n            newVal = comp & arg;\n        } while(!this->CompareAndSet_Sync(comp, newVal));\n        return newVal;\n    }\n\n    T operator |= (T arg)\n    {\n        T comp, newVal;\n        do {\n            comp   = this->Value;\n            newVal = comp | arg;\n        } while(!this->CompareAndSet_Sync(comp, newVal));\n        return newVal;\n    }\n\n    T operator ^= (T arg)\n    {\n        T comp, newVal;\n        do {\n            comp   = this->Value;\n            newVal = comp ^ arg;\n        } while(!this->CompareAndSet_Sync(comp, newVal));\n        return newVal;\n    }\n\n    T operator *= (T arg)\n    {\n        T comp, newVal;\n        do {\n            comp   = this->Value;\n            newVal = comp * arg;\n        } while(!this->CompareAndSet_Sync(comp, newVal));\n        return newVal;\n    }\n\n    T operator /= (T arg)\n    {\n        T comp, newVal;\n        do {\n            comp   = this->Value;\n            newVal = comp / arg;\n        } while(!CompareAndSet_Sync(comp, newVal));\n        return newVal;\n    }\n\n    T operator >>= (unsigned bits)\n    {\n        T comp, newVal;\n        do {\n            comp   = this->Value;\n            newVal = comp >> bits;\n        } while(!CompareAndSet_Sync(comp, newVal));\n        return newVal;\n    }\n\n    T operator <<= (unsigned bits)\n    {\n        T comp, newVal;\n        do {\n            comp   = this->Value;\n            newVal = comp << bits;\n        } while(!this->CompareAndSet_Sync(comp, newVal));\n        return newVal;\n    }\n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** Lock\n\n// Lock is a simplest and most efficient mutual-exclusion lock class.\n// Unlike Mutex, it cannot be waited on.\n\nclass Lock\n{\n    // NOTE: Locks are not allocatable and they themselves should not allocate \n    // memory by standard means. This is the case because StandardAllocator\n    // relies on this class.\n    // Make 'delete' private. Don't do this for 'new' since it can be redefined.  \n    void    operator delete(void*) {}\n\n\n    // *** Lock implementation for various platforms.\n    \n#if !defined(OVR_ENABLE_THREADS)\n\npublic:\n    // With no thread support, lock does nothing.\n    inline Lock() { }\n    inline Lock(unsigned) { }\n    inline ~Lock() { }    \n    inline void DoLock() { }\n    inline void Unlock() { }\n\n   // Windows.   \n#elif defined(OVR_OS_MS)\n\n    CRITICAL_SECTION cs;\npublic:   \n    Lock(unsigned spinCount = 10000);   // Mutexes with non-zero spin counts usually result in better performance.\n    ~Lock();\n    // Locking functions.\n    inline void DoLock()    { ::EnterCriticalSection(&cs); }\n    inline void Unlock()    { ::LeaveCriticalSection(&cs); }\n\n#else\n    pthread_mutex_t mutex;\n\npublic:\n    static pthread_mutexattr_t RecursiveAttr;\n    static bool                RecursiveAttrInit;\n\n    Lock (unsigned spinCount = 0) // To do: Support spin count, probably via a custom lock implementation.\n    {\n        OVR_UNUSED(spinCount);\n        if (!RecursiveAttrInit)\n        {\n            pthread_mutexattr_init(&RecursiveAttr);\n            pthread_mutexattr_settype(&RecursiveAttr, PTHREAD_MUTEX_RECURSIVE);\n            RecursiveAttrInit = 1;\n        }\n        pthread_mutex_init(&mutex,&RecursiveAttr);\n    }\n    ~Lock ()                { pthread_mutex_destroy(&mutex); }\n    inline void DoLock()    { pthread_mutex_lock(&mutex); }\n    inline void Unlock()    { pthread_mutex_unlock(&mutex); }\n\n#endif // OVR_ENABLE_THREDS\n\n\npublic:\n    // Locker class, used for automatic locking\n    class Locker\n    {\n    public:     \n        Lock *pLock;\n        inline Locker(Lock *plock)\n        { pLock = plock; pLock->DoLock(); }\n        inline ~Locker()\n        { pLock->Unlock();  }\n    };\n};\n\n\n//-------------------------------------------------------------------------------------\n// Globally shared Lock implementation used for MessageHandlers, etc.\n\nclass SharedLock\n{    \npublic:\n    SharedLock() : UseCount(0) {}\n\n    Lock* GetLockAddRef();\n    void  ReleaseLock(Lock* plock);\n   \nprivate:\n    Lock* toLock() { return (Lock*)Buffer; }\n\n    // UseCount and max alignment.\n    volatile int    UseCount;\n    uint64_t        Buffer[(sizeof(Lock)+sizeof(uint64_t)-1)/sizeof(uint64_t)];\n};\n\n\n} // OVR\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_CRC32.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_CRC32.cpp\nContent     :   CRC-32 with polynomial used for sensor devices\nCreated     :   June 20, 2014\nAuthor      :   Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_CRC32.h\"\n\nnamespace OVR {\n\n\nstatic const uint32_t CRC_Table[256] = {\n\t0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,\n\t0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,\n\t0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,\n\t0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,\n\t0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,\n\t0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,\n\t0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,\n\t0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,\n\t0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,\n\t0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,\n\t0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,\n\t0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,\n\t0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,\n\t0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,\n\t0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,\n\t0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,\n\t0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,\n\t0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,\n\t0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,\n\t0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,\n\t0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,\n\t0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,\n\t0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,\n\t0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,\n\t0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,\n\t0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,\n\t0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,\n\t0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,\n\t0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,\n\t0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,\n\t0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,\n\t0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4\n};\n\n\n//// CRC-32\n\nuint32_t CRC32_Calculate(const void* data, int bytes, uint32_t accumulator)\n{\n\tconst uint8_t* inputBytes = reinterpret_cast<const uint8_t*>( data );\n\n\tfor (int j = 0; j < bytes; ++j)\n\t{\n\t\tint i = ((uint32_t)(accumulator >> 24) ^ *inputBytes++) & 0xFF;\n\n\t\taccumulator = (accumulator << 8) ^ CRC_Table[i];\n\t}\n\n\treturn ~accumulator;\n}\n\n\n} // OVR\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_CRC32.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR\nFilename    :   OVR_CRC32.h\nContent     :   CRC-32 with polynomial used for sensor devices\nCreated     :   June 20, 2014\nAuthor      :   Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CRC32_h\n#define OVR_CRC32_h\n\n#include \"OVR_Types.h\"\n\nnamespace OVR {\n\n\n//-----------------------------------------------------------------------------------\n// ***** CRC-32\n\n// Polynomial used and algorithm details are proprietary to our sensor board\nuint32_t CRC32_Calculate(const void* data, int bytes, uint32_t prevCRC = 0);\n\n\n} // namespace OVR\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Color.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR_Kernel.h\nFilename    :   OVR_Color.h\nContent     :   Contains color struct.\nCreated     :   February 7, 2013\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n#ifndef OVR_Color_h\n#define OVR_Color_h\n\n#include \"OVR_Types.h\"\n\nnamespace OVR {\n\n\nstruct Color\n{\n    uint8_t R,G,B,A;\n\n    Color()\n    {\n        #if defined(OVR_BUILD_DEBUG)\n            R = G = B = A = 0;\n        #endif\n    }\n\n    // Constructs color by channel. Alpha is set to 0xFF (fully visible)\n    // if not specified.\n    Color(unsigned char r,unsigned char g,unsigned char b, unsigned char a = 0xFF)\n        : R(r), G(g), B(b), A(a) { }\n\n    // 0xAARRGGBB - Common HTML color Hex layout\n    Color(unsigned c)\n        : R((unsigned char)(c>>16)), G((unsigned char)(c>>8)),\n        B((unsigned char)c), A((unsigned char)(c>>24)) { }\n\n    bool operator==(const Color& b) const\n    {\n        return R == b.R && G == b.G && B == b.B && A == b.A;\n    }\n\n    void  GetRGBA(float *r, float *g, float *b, float* a) const\n    {\n        *r = R / 255.0f;\n        *g = G / 255.0f;\n        *b = B / 255.0f;\n        *a = A / 255.0f;\n    }\n};\n\n\n} // namespace OVR\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Compiler.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR.h\nFilename    :   OVR_Compiler.h\nContent     :   Compiler-specific feature identification and utilities\nCreated     :   June 19, 2014\nNotes       :\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n\n#ifndef OVR_Compiler_h\n#define OVR_Compiler_h\n\n#pragma once\n\n\n// References\n//    https://gcc.gnu.org/projects/cxx0x.html\n//    https://gcc.gnu.org/projects/cxx1y.html\n//    http://clang.llvm.org/cxx_status.html\n//    http://msdn.microsoft.com/en-us/library/hh567368.aspx\n//    https://docs.google.com/spreadsheet/pub?key=0AoBblDsbooe4dHZuVTRoSTFBejk5eFBfVk1GWlE5UlE&output=html\n//    http://nadeausoftware.com/articles/2012/10/c_c_tip_how_detect_compiler_name_and_version_using_compiler_predefined_macros\n\n\n//-----------------------------------------------------------------------------------\n// ***** Compiler\n//\n//  The following compilers are defined: (OVR_CC_x)\n//\n//     MSVC     - Microsoft Visual C/C++\n//     INTEL    - Intel C++ for Linux / Windows\n//     GNU      - GNU C++\n//     ARM      - ARM C/C++\n\n#if defined(__INTEL_COMPILER)\n// Intel 4.0                    = 400\n// Intel 5.0                    = 500\n// Intel 6.0                    = 600\n// Intel 8.0                    = 800\n// Intel 9.0                    = 900\n#  define OVR_CC_INTEL       __INTEL_COMPILER\n\n#elif defined(_MSC_VER)\n// MSVC 5.0                     = 1100\n// MSVC 6.0                     = 1200\n// MSVC 7.0 (VC2002)            = 1300\n// MSVC 7.1 (VC2003)            = 1310\n// MSVC 8.0 (VC2005)            = 1400\n// MSVC 9.0 (VC2008)            = 1500\n// MSVC 10.0 (VC2010)           = 1600\n// MSVC 11.0 (VC2012) = 1700\n// MSVC 12.0 (VC2013)           = 1800\n#  define OVR_CC_MSVC        _MSC_VER\n\n#if _MSC_VER == 0x1600\n#  if _MSC_FULL_VER < 160040219\n#     error \"Oculus does not support VS2010 without SP1 installed.\"\n#  endif\n#endif\n\n#elif defined(__GNUC__)\n#  define OVR_CC_GNU\n\n#elif defined(__clang__)\n#  define OVR_CC_CLANG\n\n#elif defined(__CC_ARM)\n#  define OVR_CC_ARM\n\n#else\n#  error \"Oculus does not support this Compiler\"\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CC_VERSION\n//\n//    M = major version\n//    m = minor version\n//    p = patch release\n//    b = build number\n//\n//    Compiler      Format   Example\n//    ----------------------------\n//    OVR_CC_GNU    Mmm      408 means GCC 4.8\n//    OVR_CC_CLANG  Mmm      305 means clang 3.5\n//    OVR_CC_MSVC   MMMM     1700 means VS2012\n//    OVR_CC_ARM    Mmpbbb   401677 means 4.0, patch 1, build 677\n//    OVR_CC_INTEL  MMmm     1210 means 12.10\n//    OVR_CC_EDG    Mmm      407 means EDG 4.7\n//\n#if defined(OVR_CC_GNU)\n    #define OVR_CC_VERSION ((__GNUC__ * 100) + __GNUC_MINOR__)\n#elif defined(OVR_CC_CLANG)\n    #define OVR_CC_VERSION ((__clang_major__ * 100) + __clang_minor__)\n#elif defined(OVR_CC_MSVC)\n    #define OVR_CC_VERSION _MSC_VER // Question: Should we recognize _MSC_FULL_VER?\n#elif defined(OVR_CC_ARM)\n    #define OVR_CC_VERSION __ARMCC_VERSION\n#elif defined(OVR_CC_INTEL)\n    #if defined(__INTEL_COMPILER)\n        #define OVR_CC_VERSION __INTEL_COMPILER\n    #elif defined(__ICL)\n        #define OVR_CC_VERSION __ICL\n    #elif defined(__ICC)\n        #define OVR_CC_VERSION __ICC\n    #elif defined(__ECC)\n        #define OVR_CC_VERSION __ECC\n    #endif\n#elif defined(OVR_CC_EDG)\n    #define OVR_CC_VERSION __EDG_VERSION__  // This is a generic fallback for EDG-based compilers which aren't specified above (e.g. as OVR_CC_ARM)\n#endif\n\n\n\n// -----------------------------------------------------------------------------------\n// ***** OVR_DISABLE_OPTIMIZATION / OVR_RESTORE_OPTIMIZATION\n//\n// Allows for the dynamic disabling and restoring of compiler optimizations in code.\n// This is useful for helping deal with potential compiler code generation problems.\n// With VC++ the usage must be outside of function bodies. This can be used only to\n// temporarily disable optimization for a block of code and not to temporarily enable\n// optimization for a block of code.\n//\n// Clang doesn't support this as of June 2014, though function __attribute__((optimize(0))\n// is supposedly supported by clang in addition to GCC. To consider: Make a wrapper for\n// this attribute-based functionality.\n//\n// Example usage:\n//     OVR_DISABLE_OPTIMIZATION()\n//     void Test() { ... }\n//     OVR_RESTORE_OPTIMIZATION()\n//\n#if !defined(OVR_DISABLE_OPTIMIZATION)\n    #if defined(OVR_CC_GNU) && (OVR_CC_VERSION > 404) && (defined(OVR_CPU_X86) || defined(OVR_CPU_X86_64))\n        #define OVR_DISABLE_OPTIMIZATION() \\\n            _Pragma(\"GCC push_options\")    \\\n            _Pragma(\"GCC optimize 0\")\n    #elif defined(OVR_CC_MSVC)\n        #define OVR_DISABLE_OPTIMIZATION() __pragma(optimize(\"\", off))\n    #else\n        #define OVR_DISABLE_OPTIMIZATION()\n    #endif\n#endif\n\n#if !defined(OVR_RESTORE_OPTIMIZATION)\n    #if defined(OVR_CC_GNU) && (OVR_CC_VERSION > 404) && (defined(OVR_CPU_X86) || defined(OVR_CPU_X86_64))\n        #define OVR_RESTORE_OPTIMIZATION() _Pragma(\"GCC pop_options\")\n    #elif defined(OVR_CC_MSVC)\n        #define OVR_RESTORE_OPTIMIZATION() __pragma(optimize(\"\", on))\n    #else\n        #define OVR_RESTORE_OPTIMIZATION()\n    #endif\n#endif\n\n\n// -----------------------------------------------------------------------------------\n// *****  OVR_DISABLE_GNU_WARNING / OVR_RESTORE_GNU_WARNING\n//\n// Portable wrapper for disabling GCC compiler warnings, one at a time. See example\n// usage for usage by example.\n//\n// Example usage:\n//     OVR_DISABLE_GNU_WARNING(-Wmissing-braces)  // Only one warning per usage.\n//     OVR_DISABLE_GNU_WARNING(-Wunused-variable)\n//     <code>\n//     OVR_RESTORE_GNU_WARNINGS()\n//     OVR_RESTORE_GNU_WARNINGS()                 // Must match each disable with a restore.\n//\n#if !defined(OVR_DISABLE_GNU_WARNING)\n    #if defined(OVR_CC_GNU)\n        #define ODGW1(x) #x\n        #define ODGW2(x) ODGW1(GCC diagnostic ignored x)\n        #define ODGW3(x) ODGW2(#x)\n    #endif\n\n    #if defined(OVR_CC_GNU) && (OVR_CC_VERSION >= 406)\n        #define OVR_DISABLE_GNU_WARNING(w)  \\\n            _Pragma(\"GCC diagnostic push\")  \\\n            _Pragma(ODGW3(w))\n    #elif defined(OVR_CC_GNU) && (OVR_CC_VERSION >= 404)  // GCC 4.4 doesn't support diagnostic push, but supports disabling warnings.\n        #define OVR_DISABLE_GNU_WARNING(w)  \\\n            _Pragma(ODGW3(w))\n    #else\n        #define OVR_DISABLE_GNU_WARNING(w)\n    #endif\n#endif\n\n#if !defined(OVR_RESTORE_GNU_WARNING)\n    #if defined(OVR_CC_GNU) && (OVR_CC_VERSION >= 4006)\n        #define OVR_RESTORE_GNU_WARNINGS()  \\\n            _Pragma(\"GCC diagnostic pop\")\n    #else\n        #define OVR_RESTORE_GNU_WARNING()\n    #endif\n#endif\n\n\n\n// -----------------------------------------------------------------------------------\n// *****  OVR_DISABLE_CLANG_WARNING / OVR_RESTORE_CLANG_WARNING\n//\n// Portable wrapper for disabling GCC compiler warnings, one at a time. See example\n// usage for usage by example.\n//\n// Example usage:\n//     OVR_DISABLE_CLANG_WARNING(-Wmissing-braces)  // Only one warning per usage.\n//     OVR_DISABLE_CLANG_WARNING(-Wunused-variable)\n//     <code>\n//     OVR_RESTORE_CLANG_WARNINGS()\n//     OVR_RESTORE_CLANG_WARNINGS()                 // Must match each disable with a restore.\n//\n//\n#if !defined(OVR_DISABLE_CLANG_WARNING)\n    #if defined(OVR_CC_CLANG)\n        #define ODCW1(x) #x\n        #define ODCW2(x) ODCW1(clang diagnostic ignored x)\n        #define ODCW3(x) ODCW2(#x)\n\n        #define OVR_DISABLE_CLANG_WARNING(w)   \\\n            _Pragma(\"clang diagnostic push\")  \\\n            _Pragma(ODCW3(w))\n    #else\n        #define OVR_DISABLE_CLANG_WARNING(w)\n    #endif\n#endif\n\n#if !defined(OVR_RESTORE_CLANG_WARNING)\n    #if defined(OVR_CC_CLANG)\n        #define OVR_RESTORE_CLANG_WARNING()    \\\n            _Pragma(\"clang diagnostic pop\")\n    #else\n        #define OVR_RESTORE_CLANG_WARNING()\n    #endif\n#endif\n\n\n// -----------------------------------------------------------------------------------\n// ***** OVR_DISABLE_MSVC_WARNING / OVR_RESTORE_MSVC_WARNING\n//\n// Portable wrapper for disabling VC++ compiler warnings. See example usage for usage\n// by example.\n//\n// Example usage:\n//     OVR_DISABLE_MSVC_WARNING(4556 4782 4422)\n//     <code>\n//     OVR_RESTORE_MSVC_WARNING()\n//\n#if !defined(OVR_DISABLE_MSVC_WARNING)\n    #if defined(OVR_CC_MSVC)\n        #define OVR_DISABLE_MSVC_WARNING(w) \\\n            __pragma(warning(push))         \\\n            __pragma(warning(disable:w))\n    #else\n        #define OVR_DISABLE_MSVC_WARNING(w)\n    #endif\n#endif\n\n#if !defined(OVR_RESTORE_MSVC_WARNING)\n    #if defined(OVR_CC_MSVC)\n        #define OVR_RESTORE_MSVC_WARNING() \\\n            __pragma(warning(pop))\n    #else\n        #define OVR_RESTORE_MSVC_WARNING()\n    #endif\n#endif\n\n\n// -----------------------------------------------------------------------------------\n// ***** OVR_DISABLE_ALL_MSVC_WARNINGS / OVR_RESTORE_ALL_MSVC_WARNINGS\n//\n// Portable wrapper for disabling all VC++ compiler warnings.\n// OVR_RESTORE_ALL_MSVC_WARNINGS restores warnings that were disabled by\n// OVR_DISABLE_ALL_MSVC_WARNINGS. Any previously enabled warnings will still be\n// enabled after OVR_RESTORE_ALL_MSVC_WARNINGS.\n//\n// Example usage:\n//     OVR_DISABLE_ALL_MSVC_WARNINGS()\n//     <code>\n//     OVR_RESTORE_ALL_MSVC_WARNINGS()\n\n#if !defined(OVR_DISABLE_ALL_MSVC_WARNINGS)\n    #if defined(OVR_CC_MSVC)\n        #define OVR_DISABLE_ALL_MSVC_WARNINGS() \\\n            __pragma(warning(push, 0))\n    #else\n        #define OVR_DISABLE_ALL_MSVC_WARNINGS()\n    #endif\n#endif\n\n#if !defined(OVR_RESTORE_ALL_MSVC_WARNINGS)\n    #if defined(OVR_CC_MSVC)\n        #define OVR_RESTORE_ALL_MSVC_WARNINGS() \\\n            __pragma(warning(pop))\n    #else\n        #define OVR_RESTORE_ALL_MSVC_WARNINGS()\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CC_HAS_FEATURE\n//\n// This is a portable way to use compile-time feature identification available\n// with some compilers in a clean way. Direct usage of __has_feature in preprocessing\n// statements of non-supporting compilers results in a preprocessing error.\n//\n// Example usage:\n//     #if OVR_CC_HAS_FEATURE(is_pod)\n//         if(__is_pod(T)) // If the type is plain data then we can safely memcpy it.\n//             memcpy(&destObject, &srcObject, sizeof(object));\n//     #endif\n//\n#if !defined(OVR_CC_HAS_FEATURE)\n    #if defined(__clang__) // http://clang.llvm.org/docs/LanguageExtensions.html#id2\n        #define OVR_CC_HAS_FEATURE(x) __has_feature(x)\n    #else\n        #define OVR_CC_HAS_FEATURE(x) 0\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CC_HAS_BUILTIN\n//\n//\n// This is a portable way to use compile-time builtin identification available\n// with some compilers in a clean way. Direct usage of __has_builtin in preprocessing\n// statements of non-supporting compilers results in a preprocessing error.\n//\n// Example usage:\n//     #if OVR_CC_HAS_BUILTIN(__builtin_trap)\n//         #define DEBUG_BREAK __builtin_trap\n//     #endif\n//\n#if !defined(OVR_CC_HAS_BUILTIN)\n    #if defined(__clang__)\n        #define OVR_CC_HAS_BUILTIN(x) __has_builtin(x) // http://clang.llvm.org/docs/LanguageExtensions.html#id2\n    #else\n        #define OVR_CC_HAS_BUILTIN(x) 0\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP11_ENABLED / OVR_CPP_CPP14_ENABLED\n//\n// Defined as 1 if the compiler has its available C++11 support enabled, else undefined.\n// This does not mean that all of C++11 or any particular feature of C++11 is supported\n// by the compiler. It means that whatever C++11 support the compiler has is enabled.\n// This also includes existing and older compilers that still identify C++11 as C++0x.\n//\n#if !defined(OVR_CPP11_ENABLED) && defined(__cplusplus)\n    #if defined(__GNUC__) && defined(__GXX_EXPERIMENTAL_CXX0X__)\n        #define OVR_CPP11_ENABLED 1\n    #elif defined(_MSC_VER) && (_MSC_VER >= 1500)   // VS2010+, the first version with any significant C++11 support.\n        #define OVR_CPP11_ENABLED 1\n    #elif (__cplusplus >= 201103L)                  // 201103 is the first C++11 version.\n        #define OVR_CPP11_ENABLED 1\n    #else\n        // Leave undefined\n    #endif\n#endif\n\n#if !defined(OVR_CPP_CPP14_ENABLED) && defined(__cplusplus)\n    #if defined(_MSC_VER) && (_MSC_VER >= 1800)     // VS2013+, the first version with any significant C++14 support.\n        #define OVR_CPP_CPP14_ENABLED 1\n    #elif (__cplusplus > 201103L)\n        #define OVR_CPP_CPP14_ENABLED 1\n    #else\n        // Leave undefined\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_EXCEPTIONS / OVR_CPP_NO_UNWIND\n//\n// OVR_CPP_NO_EXCEPTIONS is defined as 1 if the compiler doesn't support C++\n// exceptions or is configured to disable support for them. Else not defined.\n// If OVR_CPP_NO_EXCEPTIONS is defined then attempts to use try/catch\n// related C++ statements result in a compilation error with many\n// compilers.\n//\n// OVR_CPP_NO_UNWIND is defined as 1 if the compiler supports exceptions but\n// doesn't support stack unwinding in the presence of an exception. Else not defined.\n// For the Microsoft compiler, disabling exceptions means disabling stack unwinding\n// and not disabling exceptions themselves.\n//\n// Example usage:\n//     void Test() {\n//         #if !defined(OVR_CPP_NO_EXCEPTIONS)\n//             try {\n//         #endif\n//             void* ptr = new Object;\n//         #if !defined(OVR_CPP_NO_EXCEPTIONS)\n//             catch(...) { ... }\n//         #endif\n\n#if !defined(OVR_CPP_NO_EXCEPTIONS)\n    #if defined(OVR_CPP_GNUC) && defined(_NO_EX)\n        #define OVR_CPP_NO_EXCEPTIONS 1\n    #elif (defined(OVR_CC_GNU) || defined(OVR_CC_CLANG) || defined(OVR_CC_INTEL) || defined(OVR_CC_ARM)) && !defined(__EXCEPTIONS)\n        #define OVR_CPP_NO_EXCEPTIONS 1\n    #elif defined(OVR_CC_MSVC) && !defined(_CPPUNWIND)\n        #define OVR_CPP_NO_UNWIND 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_RTTI\n//\n// Defined as 1 if C++ run-time type information support is unavailable or disabled\n// by the compiler. Else undefined. Allows you to write portable code in the face\n// of the possibility that RTTI is disabled.\n//\n// Example usage:\n//     #if !OVR_CPP_NO_RTTI\n//         #include <typeinfo>\n//         int x = std::dynamic_cast<int>(3.4f);\n//     #endif\n\n#if defined(__clang__) && !OVR_CC_HAS_FEATURE(cxx_rtti)\n    #define OVR_CPP_NO_RTTI 1\n#elif defined(__GNUC__) && !defined(__GXX_RTTI)\n    #define OVR_CPP_NO_RTTI 1\n#elif defined(_MSC_VER) && !defined(_CPPRTTI)\n    #define OVR_CPP_NO_RTTI 1\n#elif defined(__CC_ARM) && defined(__TARGET_CPU_MPCORE) && !defined(__RTTI)\n    #define OVR_CPP_NO_RTTI 1\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_STATIC_ASSERT\n//\n// Defined as 1 if C++ run-time type information support is available and enabled\n// by the compiler. Else undefined.\n//\n// Example usage:\n//     #if OVR_CPP_NO_STATIC_ASSERT\n//         #define MY_ASSERT(x) { int zero = 0; switch(zero) {case 0: case (x):;} }\n//     #else\n//         #define MY_ASSERT(x) static_assert((x), #x)\n//     #endif\n\n#if !defined(OVR_CPP_NO_STATIC_ASSERT)\n    #if !(defined(__GNUC__) && (defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined(__cplusplus) && (__cplusplus >= 201103L)))) && \\\n        !(defined(__clang__) && defined(__cplusplus) && OVR_CC_HAS_FEATURE(cxx_static_assert)) &&                              \\\n        !(defined(_MSC_VER) && (_MSC_VER >= 1600) && defined(__cplusplus)) &&                 /* VS2010+  */                   \\\n        !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 401) && defined(OVR_CPP11_ENABLED)) /* EDG 4.1+ */\n\t    #define OVR_CPP_NO_STATIC_ASSERT 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_NULLPTR\n//\n// Defined as 1 if the compiler doesn't support C++11 nullptr built in type.\n// Otherwise undefined. Does not identify if the standard library defines\n// std::nullptr_t, as some standard libraries are further behind in standardization\n// than the compilers using them (e.g. Apple clang with the supplied libstdc++).\n//\n// OVR_Nullptr.h provides a portable nullptr and std::nullptr_t for when the\n// compiler or standard library do not.\n\n#if !defined(OVR_CPP_NO_NULLPTR)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_nullptr))  /* clang     */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 406))           /* GCC 4.6+  */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1600))                /* VS2010+   */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 403)))  /* EDG 4.3+  */\n        #define OVR_CPP_NO_NULLPTR 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_RVALUE_REFERENCES\n//\n// Defined as 1 if the compiler doesn't support C++11 rvalue references and move semantics.\n// Otherwise undefined.\n\n#if !defined(OVR_CPP_NO_RVALUE_REFERENCES)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_rvalue_references)) /* clang    */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 405))                    /* GCC 4.5+ */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1600))                         /* VS2010+  */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 403)))           /* EDG 4.3+ */\n        #define OVR_CPP_NO_RVALUE_REFERENCES 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_AUTO\n//\n// Defined as 1 if the compiler doesn't support C++11 auto keyword. Otherwise undefined.\n\n#if !defined(OVR_CPP_NO_AUTO)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_auto_type))  /* clang     */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 404))             /* GCC 4.4+  */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1600))                  /* VS2010+   */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 309)))    /* EDG 3.9+  */\n        #define OVR_CPP_NO_AUTO 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_RANGE_BASED_FOR_LOOP\n//\n// Defined as 1 if the compiler doesn't support C++11 range-based for loops.\n// Otherwise undefined.\n\n#if !defined(OVR_CPP_NO_RANGE_BASED_FOR_LOOP)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_range_for)) /* clang    */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 406))            /* GCC 4.6+ */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1700))                 /* VS2012+  */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 405)))   /* EDG 4.5+ */\n        #define OVR_CPP_NO_RANGE_BASED_FOR_LOOP 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_CONSTEXPR / OVR_CPP_NO_RELAXED_CONSTEXPR\n//\n// OVR_CPP_NO_CONSTEXPR is defined as 1 if the compiler doesn't support C++11 constexpr.\n// OVR_CPP_NO_RELAXED_CONSTEXPR is defined as 1 if the compiler doesn't support C++14 constexpr.\n// Otherwise undefined.\n// See the OVR_CONSTEXPR / OVR_CONSTEXPR_OR_CONST macros for portable wrappers of this functionality.\n\n#if !defined(OVR_CPP_NO_CONSTEXPR)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_constexpr))  /* clang    */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 406))             /* GCC 4.6+ */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 406)))    /* EDG 4.6+ */\n        // Not supported by VC++ through at least VS2013.\n        #define OVR_CPP_NO_CONSTEXPR 1\n    #endif\n#endif\n\n#if !defined(OVR_CPP_NO_RELAXED_CONSTEXPR)\n    #if !defined(OVR_CPP14_ENABLED) || \\\n        !(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_relaxed_constexpr)) /* clang */\n        // Supported only by clang as of this writing.\n        #define OVR_CPP_NO_RELAXED_CONSTEXPR 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_LAMBDA_EXPRESSIONS\n//\n// Defined as 1 if the compiler doesn't support C++11 lambda expressions. Otherwise undefined.\n// Some compilers have slightly crippled versions of this.\n\n#if !defined(OVR_CPP_NO_LAMBDA_EXPRESSIONS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_lambdas))  /* clang     */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 404))           /* GCC 4.4+  */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1600))                /* VS2010+   */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 401)))  /* EDG 4.1+  */\n        // Conversion of lambdas to function pointers is not supported until EDG 4.5.\n        #define OVR_CPP_NO_LAMBDA_EXPRESSIONS 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_ALIGNOF\n//\n// Defined as 1 if the compiler supports C++11 alignof. Otherwise undefined.\n// Some compilers support __alignof__ instead of alignof, so for portability you\n// should use OVR_ALIGNOF instead of directly using C++11 alignof.\n\n#if !defined(OVR_CPP_NO_ALIGNOF)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && !defined(__APPLE__) && (__clang__ >= 209))  /* clang 2.9+       */ && \\\n         !(defined(__clang__) &&  defined(__APPLE__) && (__clang__ >= 300))  /* Apple clang 3.0+ */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 401))                     /* GCC 4.1+         */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1900))                          /* VS2014+          */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 400)))            /* EDG 4.0+         */\n        #define OVR_CPP_NO_ALIGNOF 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_ALIGNAS\n//\n// Defined as 1 if the compiler supports C++11 alignas. Otherwise undefined.\n// See the OVR_ALIGNAS for a portable wrapper for alignas functionality.\n\n#if !defined(OVR_CPP_NO_ALIGNAS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && !defined(__APPLE__) && (__clang__ >= 300))  /* clang 3.0+       */ && \\\n         !(defined(__clang__) &&  defined(__APPLE__) && (__clang__ >= 401))  /* Apple clang 4.1+ */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 408))                     /* GCC 4.8+         */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1900))                          /* VS2014+          */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 408)))            /* EDG 4.8+         */\n        #define OVR_CPP_NO_ALIGNAS 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_OVERRIDE\n//\n// Defined as 1 if the compiler doesn't support C++11 override. Otherwise undefined.\n// See the OVR_OVERRIDE and OVR_FINALOVERRIDE macros for a portable wrapper.\n\n#if !defined(OOVR_CPP_NO_OVERRIDE)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && !defined(__APPLE__) && (__clang__ >= 209)) /* clang 2.9+       */ && \\\n         !(defined(__clang__) &&  defined(__APPLE__) && (__clang__ >= 400)) /* Apple clang 4.0+ */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 407))                    /* GCC 4.7+         */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1500))                         /* VS2008+          */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 408)))           /* EDG 4.8+         */\n        #define OVR_CPP_NO_OVERRIDE 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_FINAL\n//\n// Defined as 1 if the compiler doesn't support C++11 final attribute. Otherwise undefined.\n// See the OVR_FINAL and OVR_FINALOVERRIDE macros for a portable wrapper.\n\n#if !defined(OOVR_CPP_NO_FINAL)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && !defined(__APPLE__) && (__clang__ >= 209))  /* clang 2.9+       */ && \\\n         !(defined(__clang__) &&  defined(__APPLE__) && (__clang__ >= 400))  /* Apple clang 4.0+ */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 407))                     /* GCC 4.7+         */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1500))                          /* VS2008+          */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 408)))            /* EDG 4.8+         */\n        #define OVR_CPP_NO_FINAL 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_EXTERN_TEMPLATE\n//\n// Defined as 1 if the compiler doesn't support C++11 extern template.\n// Otherwise undefined. See OVR_EXTERN_TEMPLATE for wrapper macro.\n\n#if !defined(OVR_CPP_NO_EXTERN_TEMPLATE)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && !defined(__APPLE__) && (__clang__ >= 209))  /* clang 2.9+       */ && \\\n         !(defined(__clang__) &&  defined(__APPLE__) && (__clang__ >= 401))  /* Apple clang 4.1+ */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 406))                     /* GCC 4.6+         */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1700))                          /* VS2012+          */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 401)))            /* EDG 4.1+         */\n        #define OVR_CPP_NO_EXTERN_TEMPLATE 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_VARIADIC_TEMPLATES\n//\n// Defined as 1 if the compiler doesn't support C++11 variadic templates. Otherwise undefined.\n\n#if !defined(OVR_CPP_NO_VARIADIC_TEMPLATES)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_variadic_templates)) /* clang     */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 404))                     /* GCC 4.4+  */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1800))                          /* VS2013+   */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 403)))            /* EDG 4.3+  */\n        #define OVR_CPP_NO_VARIADIC_TEMPLATES 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_NOEXCEPT\n//\n// Defined as 1 if the compiler supports C++11 noexcept. Otherwise undefined.\n// http://en.cppreference.com/w/cpp/language/noexcept\n// See OVR_NOEXCEPT / OVR_NOEXCEPT_IF / OVR_NOEXCEPT_EXPR for a portable wrapper\n// for noexcept functionality.\n\n#if !defined(OVR_CPP_NO_NOEXCEPT)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_noexcept))  /* clang     */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 406))            /* GCC 4.6+  */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1900))                 /* VS2014+   */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 405)))   /* EDG 4.5+  */\n        #define OVR_CPP_NO_NOEXCEPT 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_DECLTYPE\n//\n// Defined as 1 if the compiler doesn't support C++11 decltype. Otherwise undefined.\n// Some compilers (e.g. VS2012) support most uses of decltype but don't support\n// decltype with incomplete types (which is an uncommon usage seen usually in\n// template metaprogramming).  We don't include this support as a requirement for\n// our definition of decltype support here.\n\n#if !defined(OVR_CPP_NO_DECLTYPE)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_decltype))  /* clang     */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 403))            /* GCC 4.3+  */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1600))                 /* VS2010+   */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 402)))   /* EDG 4.2+  */\n        // VC++ fails to support decltype for incomplete types until VS2013.\n        // EDG fails to support decltype for incomplete types until v4.8.\n        #define OVR_CPP_NO_DECLTYPE 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_DEFAULTED_FUNCTIONS\n//\n// Defined as 1 if the compiler doesn't support C++11 defaulted functions. Otherwise undefined.\n// Some compilers have slightly crippled versions of this.\n\n#if !defined(OVR_CPP_NO_DEFAULTED_FUNCTIONS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_defaulted_functions))/* clang    */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 404))                     /* GCC 4.4+ */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1800))                          /* VS2013+  */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 401)))            /* EDG 4.1+ */\n        // Up through at least VS2013 it's unsupported for defaulted move constructors and move assignment operators.\n        // Until EDG 4.8 it's unsupported for defaulted move constructors and move assigment operators.\n        #define OVR_CPP_NO_DEFAULTED_FUNCTIONS 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_DELETED_FUNCTIONS\n//\n// Defined as 1 if the compiler doesn't support C++11 deleted functions. Otherwise undefined.\n// Some compilers have slightly crippled versions of this.\n\n#if !defined(OVR_CPP_NO_DELETED_FUNCTIONS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_defaulted_functions)) /* clang    */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 404))                      /* GCC 4.4+ */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1800))                           /* VS2013+  */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 401)))             /* EDG 4.1+ */\n        // Up through at least VS2013 it's unsupported for defaulted move constructors and move assignment operators.\n        // Until EDG 4.8 it's unsupported for defaulted move constructors and move assigment operators.\n        #define OVR_CPP_NO_DELETED_FUNCTIONS 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_STANDARD_LAYOUT_TYPES\n//\n// Defined as 1 if the compiler doesn't support C++11 standard layout (relaxed POD). Otherwise undefined.\n// http://en.cppreference.com/w/cpp/types/is_standard_layout\n\n#if !defined(OVR_CPP_NO_STANDARD_LAYOUT_TYPES)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && !defined(__APPLE__) && (__clang__ >= 300)) /* clang 3.0+       */ && \\\n         !(defined(__clang__) &&  defined(__APPLE__) && (__clang__ >= 401)) /* Apple clang 4.1+ */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 405))                    /* GCC 4.5+         */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1700))                         /* VS2013+          */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 406)))           /* EDG 4.6+         */\n        #define OVR_CPP_NO_STANDARD_LAYOUT_TYPES 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_FORWARD_DECLARED_ENUMS\n//\n// Defined as 1 if the compiler doesn't support C++11 forward declared enums. Otherwise undefined.\n\n#if !defined(OVR_CPP_NO_FORWARD_DECLARED_ENUMS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && !defined(__APPLE__) && (__clang__ >= 301))  /* clang 3.1+       */ && \\\n         !(defined(__clang__) &&  defined(__APPLE__) && (__clang__ >= 401))  /* Apple clang 4.1+ */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 406))                     /* GCC 4.6+         */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1700))                          /* VS2012+          */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 405)))            /* EDG 4.5+         */\n        #define OVR_CPP_NO_FORWARD_DECLARED_ENUMS 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_STRONGLY_TYPED_ENUMS\n//\n// Defined as 1 if the compiler doesn't support C++11 strongly typed enums. Otherwise undefined.\n\n#if !defined(OVR_CPP_NO_STRONGLY_TYPED_ENUMS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_strong_enums))  /* clang     */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 404))                /* GCC 4.4+  */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1700))                     /* VS2012+   */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 400)))       /* EDG 4.0+ */\n        #define OVR_CPP_NO_STRONGLY_TYPED_ENUMS 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_TRAILING_RETURN_TYPES\n//\n// Defined as 1 if the compiler doesn't support C++11 trailing return types. Otherwise undefined.\n// http://en.wikipedia.org/wiki/C%2B%2B11#Alternative_function_syntax\n\n#if !defined(OVR_CPP_NO_TRAILING_RETURN_TYPES)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_trailing_return)) /* clang     */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 404))                  /* GCC 4.4+  */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1600))                       /* VS2010+   */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 401)))         /* EDG 4.1+ */\n        #define OVR_CPP_NO_TRAILING_RETURN_TYPES 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_TEMPLATE_ALIASES\n//\n// Defined as 1 if the compiler doesn't support C++11 template aliases. Otherwise undefined.\n\n#if !defined(OVR_CPP_NO_TEMPLATE_ALIASES)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_alias_templates)) /* clang     */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 407))                  /* GCC 4.7+  */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1800))                       /* VS2013+   */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 402)))         /* EDG 4.2+  */\n        #define OVR_CPP_NO_TEMPLATE_ALIASES 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_INITIALIZER_LISTS\n//\n// Defined as 1 if the compiler doesn't support C++11 initializer lists. Otherwise undefined.\n// This refers to the compiler support for this and not the Standard Library support for std::initializer_list,\n// as a new compiler with an old standard library (e.g. Apple clang with libstdc++) may not support std::initializer_list.\n\n#if !defined(OVR_CPP_NO_INITIALIZER_LISTS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_generalized_initializers)) /* clang     */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 404))                           /* GCC 4.4+  */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1800))                                /* VS2013+   */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 405)))                  /* EDG 4.5+  */\n        #define OVR_CPP_NO_INITIALIZER_LISTS 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_NORETURN\n//\n// Defined as 1 if the compiler doesn't support the C++11 noreturn attribute. Otherwise undefined.\n// http://en.cppreference.com/w/cpp/language/attributes\n//\n#if !defined(OVR_CPP_NO_NORETURN)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && !defined(__APPLE__) && (__clang__ >= 301))  /* clang 3.1+       */ && \\\n         !(defined(__clang__) &&  defined(__APPLE__) && (__clang__ >= 401))  /* Apple clang 4.1+ */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 408))                     /* GCC 4.8+         */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1500))                          /* VS2008+          */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 402)))            /* EDG 4.2+         */\n        // Supported with VC++ only via __declspec(noreturn) (see OVR_NORETURN).\n        #define OVR_CPP_NO_NORETURN 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_NONSTATIC_MEMBER_INITIALIZERS\n//\n// Defined as 1 if the compiler doesn't support C++11 in-class non-static member initializers. Otherwise undefined.\n// http://en.cppreference.com/w/cpp/language/data_members\n\n#if !defined(OVR_CPP_NO_NONSTATIC_MEMBER_INITIALIZERS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && !defined(__APPLE__) && (__clang__ >= 301))  /* clang 3.1+       */ && \\\n         !(defined(__clang__) &&  defined(__APPLE__) && (__clang__ >= 401))  /* Apple clang 4.1+ */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 407))                     /* GCC 4.7+         */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1800))                          /* VS2013+          */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 406)))            /* EDG 4.6+         */\n        #define OVR_CPP_NO_NONSTATIC_MEMBER_INITIALIZERS 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_DOUBLE_TEMPLATE_BRACKETS\n//\n// Defined as 1 if the compiler supports nested template declarations with >>,\n// as supported by C++11. Otherwise undefined.\n\n#if !defined(OVR_CPP_NO_DOUBLE_TEMPLATE_ANGLE_BRACKETS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && !defined(__APPLE__) && (__clang__ >= 209))  /* clang 2.9+       */ && \\\n         !(defined(__clang__) &&  defined(__APPLE__) && (__clang__ >= 400))  /* Apple clang 4.0+ */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 403))                     /* GCC 4.3+         */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1600))                          /* VS2010+          */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 401)))            /* EDG 4.1+         */\n        #define OVR_CPP_NO_DOUBLE_TEMPLATE_BRACKETS 1\n    #endif\n#endif\n\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_INHERITING_CONSTRUCTORS\n//\n// Defined as 1 if the compiler supports C++11 inheriting constructors. Otherwise undefined.\n// Example usage:\n//     struct A { explicit A(int x){} };\n//     struct B : public A { using A::A; }; // As if B redeclared A::A(int).\n\n#if !defined(OVR_CPP_NO_INHERITING_CONSTRUCTORS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_inheriting_constructors))  /* clang     */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 408))                           /* GCC 4.8+  */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1900))                                /* VS2014+   */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 408)))                  /* EDG 4.8+  */\n        #define OVR_CPP_NO_INHERITING_CONSTRUCTORS 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_DELEGATING_CONSTRUCTORS\n//\n// Defined as 1 if the compiler supports C++11 delegating constructors. Otherwise undefined.\n\n#if !defined(OVR_CPP_NO_DELEGATING_CONSTRUCTORS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && !defined(__APPLE__) && (__clang__ >= 300))  /* clang 3.0+       */ && \\\n         !(defined(__clang__) &&  defined(__APPLE__) && (__clang__ >= 401))  /* Apple clang 4.1+ */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 407))                     /* GCC 4.7+         */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1800))                          /* VS2013+          */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 407)))            /* EDG 4.7+         */\n        #define OVR_CPP_NO_DELEGATING_CONSTRUCTORS 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS\n//\n// Defined as 1 if the compiler supports C++11 function template default arguments. Otherwise undefined.\n\n#if !defined(OVR_CPP_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && !defined(__APPLE__) && (__clang__ >= 209))  /* clang 2.9+       */ && \\\n         !(defined(__clang__) &&  defined(__APPLE__) && (__clang__ >= 401))  /* Apple clang 4.0+ */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 403))                     /* GCC 4.3+         */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1800))                          /* VS2013+          */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 403)))            /* EDG 4.3+         */\n        #define OVR_CPP_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_UNRESTRICTED_UNIONS\n//\n// Defined as 1 if the compiler supports C++11 unrestricted unions. Otherwise undefined.\n\n#if !defined(OVR_CPP_NO_UNRESTRICTED_UNIONS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && !defined(__APPLE__) && (__clang__ >= 301))  /* clang 3.1+       */ && \\\n         !(defined(__clang__) &&  defined(__APPLE__) && (__clang__ >= 401))  /* Apple clang 4.1+ */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 406))                     /* GCC 4.6+         */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 406)))            /* EDG 4.6+         */\n        // Not supported by VC++ as of VS2013.\n        #define OVR_CPP_NO_UNRESTRICTED_UNIONS 1\n    #endif\n#endif\n\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_EXTENDED_SIZEOF\n//\n// Defined as 1 if the compiler supports C++11 class sizeof extensions (e.g. sizeof SomeClass::someMember).\n// Otherwise undefined.\n\n#if !defined(OVR_CPP_NO_EXTENDED_SIZEOF)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && !defined(__APPLE__) && (__clang__ >= 301))  /* clang 3.1+       */ && \\\n         !(defined(__clang__) &&  defined(__APPLE__) && (__clang__ >= 401))  /* Apple clang 4.1+ */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 405))                     /* GCC 4.5+         */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1900))                          /* VS2014+          */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 405)))            /* EDG 4.5+         */\n        #define OVR_CPP_NO_EXTENDED_SIZEOF 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_INLINE_NAMESPACES\n//\n// Defined as 1 if the compiler supports C++11 inlined namespaces. Otherwise undefined.\n// http://en.cppreference.com/w/cpp/language/namespace#Inline_namespaces\n\n#if !defined(OVR_CPP_NO_INLINE_NAMESPACES)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && !defined(__APPLE__) && (__clang__ >= 209))  /* clang 2.9+       */ && \\\n         !(defined(__clang__) &&  defined(__APPLE__) && (__clang__ >= 400))  /* Apple clang 4.0+ */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 404))                     /* GCC 4.4+         */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 405)))            /* EDG 4.5+         */\n        // Not supported by VC++ as of VS2013.\n        #define OVR_CPP_NO_INLINE_NAMESPACES 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_EXPLICIT_CONVERSION_OPERATORS\n//\n// Defined as 1 if the compiler supports C++11 explicit conversion operators. Otherwise undefined.\n// http://en.cppreference.com/w/cpp/language/explicit\n\n#if !defined(OVR_CPP_NO_EXPLICIT_CONVERSION_OPERATORS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_explicit_conversions))  /* clang     */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 405))                        /* GCC 4.5+  */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1800))                             /* VS2013+   */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 404)))               /* EDG 4.4+  */\n        #define OVR_CPP_NO_EXPLICIT_CONVERSION_OPERATORS 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS\n//\n// Defined as 1 if the compiler supports C++11 local class template parameters. Otherwise undefined.\n// Example:\n//     void Test() {\n//         struct LocalClass{ };\n//         SomeTemplateClass<LocalClass> t; // Allowed only in C++11\n//     }\n\n#if !defined(OVR_CPP_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_local_type_template_args))  /* clang     */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 405))                            /* GCC 4.5+  */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1600))                                 /* VS2010+   */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 402)))                   /* EDG 4.2+  */\n        #define OVR_CPP_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_NEW_CHARACTER_TYPES\n//\n// Defined as 1 if the compiler natively supports C++11 char16_t and char32_t. Otherwise undefined.\n// VC++ through at least VS2013 defines char16_t as unsigned short in its standard library,\n// but it is not a native type or unique type, nor can you for a string literal with it.\n\n#if !defined(OVR_CPP_NO_NEW_CHARACTER_TYPES)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_unicode_literals))  /* clang     */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 404))                    /* GCC 4.4+  */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 407)))           /* EDG 4.7+  */\n        // Not supported by VC++ as of VS2013.\n        #define OVR_CPP_NO_NEW_CHARACTER_TYPES 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_UNICODE_CHAR_NAME_LITERALS\n//\n// Defined as 1 if the compiler supports C++11 \\u and \\U character literals for\n// native char16_t and char32_t types.\n//\n#if !defined(OVR_CPP_NO_UNICODE_CHAR_NAME_LITERALS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && !defined(__APPLE__) && (__clang__ >= 301))  /* clang 3.1+       */ && \\\n         !(defined(__clang__) &&  defined(__APPLE__) && (__clang__ >= 401))  /* Apple clang 4.1+ */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 405))                     /* GCC 4.5+         */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 408)))            /* EDG 4.8+         */\n        // Not supported by VC++ as of VS2013. VC++'s existing \\U and \\u are non-conforming.\n        #define OVR_CPP_NO_UNICODE_CHAR_NAME_LITERALS 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_USER_DEFINED_LITERALS\n//\n// Defined as 1 if the compiler supports C++11 user-defined literals. Otherwise undefined.\n\n#if !defined(OVR_CPP_NO_USER_DEFINED_LITERALS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && !defined(__APPLE__) && (__clang__ >= 301))  /* clang 3.1+       */ && \\\n         !(defined(__clang__) &&  defined(__APPLE__) && (__clang__ >= 401))  /* Apple clang 4.1+ */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 407))                     /* GCC 4.7+         */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 408)))            /* EDG 4.8+         */\n        // Not supported by VC++ as of VS2013.\n        #define OVR_CPP_NO_USER_DEFINED_LITERALS 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_UNICODE_STRING_LITERALS\n//\n// Defined as 1 if the compiler supports C++11 Unicode string literals. Otherwise undefined.\n// http://en.wikipedia.org/wiki/C%2B%2B11#New_string_literals\n\n#if !defined(OVR_CPP_NO_UNICODE_STRING_LITERALS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_unicode_literals))  /* clang     */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 404))                    /* GCC 4.4+  */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 407)))           /* EDG 4.7+  */\n        // Not supported by VC++ as of VS2013.\n        #define OVR_CPP_NO_UNICODE_STRING_LITERALS 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_RAW_STRING_LITERALS\n//\n// Defined as 1 if the compiler supports C++11 raw literals. Otherwise undefined.\n// http://en.wikipedia.org/wiki/C%2B%2B11#New_string_literals\n\n#if !defined(OVR_CPP_NO_RAW_STRING_LITERALS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_raw_string_literals))  /* clang     */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 405))                       /* GCC 4.5+  */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 407)))              /* EDG 4.7+  */\n        // Not supported by VC++ as of VS2013.\n        #define OVR_CPP_NO_RAW_STRING_LITERALS 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_UNIFIED_INITIALIZATION_SYNTAX\n//\n// Defined as 1 if the compiler supports C++11 unified initialization.\n// http://en.wikipedia.org/wiki/C%2B%2B11#Uniform_initialization\n\n#if !defined(OVR_CPP_NO_UNIFIED_INITIALIZATION_SYNTAX)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_generalized_initializers))  /* clang     */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 404))                            /* GCC 4.4+  */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1800))                                 /* VS2013+   */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 406)))                   /* EDG 4.6+  */\n        #define OVR_CPP_NO_UNIFIED_INITIALIZATION_SYNTAX 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_EXTENDED_FRIEND_DECLARATIONS\n//\n// Defined as 1 if the compiler supports C++11 extended friends.\n\n#if !defined(OVR_CPP_NO_EXTENDED_FRIEND_DECLARATIONS)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && !defined(__APPLE__) && (__clang__ >= 209))  /* clang 2.9+       */ && \\\n         !(defined(__clang__) &&  defined(__APPLE__) && (__clang__ >= 400))  /* Apple clang 4.0+ */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 407))                     /* GCC 4.7+         */ && \\\n         !(defined(_MSC_VER) && (_MSC_VER >= 1600))                          /* VS2010+          */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 401)))            /* EDG 4.1+         */\n        #define OVR_CPP_NO_EXTENDED_FRIEND_DECLARATIONS 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_CPP_NO_THREAD_LOCAL\n//\n// Defined as 1 if the compiler supports C++11 thread_local. Else undefined. Does not\n// indicate if the compiler supports C thread-local compiler extensions such as __thread\n// and declspec(thread). Use OVR_THREAD_LOCAL if you want to declare a thread-local\n// variable that supports C++11 thread_local when available but the C extension when\n// it's available. The primary difference between C++11 thread_local and C extensions is\n// that C++11 thread_local supports non-PODs and calls their constructors and destructors.\n//\n// Note that thread_local requires both compiler and linker support, and so it's possible\n// that the compiler may support thread_local but the linker does not.\n\n#if !defined(OVR_CPP_NO_THREAD_LOCAL)\n    #if !defined(OVR_CPP11_ENABLED) || \\\n        (!(defined(__clang__) && OVR_CC_HAS_FEATURE(cxx_thread_local))  /* clang     */ && \\\n         !(defined(__GNUC__) && (OVR_CC_VERSION >= 408))                /* GCC 4.8+  */ && \\\n         !(defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 408)))       /* EDG 4.8+  */\n        #define OVR_CPP_NO_THREAD_LOCAL 1\n    #endif\n#endif\n\n\n// -----------------------------------------------------------------------------------\n// ***** OVR_ALIGNAS / OVR_ALIGNOF\n//\n//    OVR_ALIGNAS(n)        // Specifies a size_t power of two alignment for a type or instance.\n//    OVR_ALIGNOF(type)     // Returns the size_t alignment of a type or instance.\n//\n// Example usage:\n//    OVR_ALIGNAS(8) char c = 'c';                      // Specifies that the instance c be aligned to an 8 byte boundary.\n//    typedef OVR_ALIGNAS(8) char C;                    // Specifies that the type C be aligned to an 8 byte boundary.\n//    struct OVR_ALIGNAS(64) S{ char array[16]; };      // Specfies that the struct S have a natural alignment of 64.\n//    OVR_ALIGNAS(32) S s;                              // Specifies that the instance s of struct S be aligned to an 32 byte boundary.\n//    OVR_ALIGNAS(32) struct T{ char array[16]; } t;    // Specfies that the instance t of struct T have a natural alignment of 32.\n//    struct OVR_ALIGNAS(T) U{};                        // Specifes that U be aligned the same as T. Supported only by C++11 compilers (see OVR_CPP_NO_ALIGNAS).\n//\n//    size_t a = OVR_ALIGNOF(double);                   // Returns the natural alignment of the double type.\n//    size_t a = OVR_ALIGNOF(S);                        // Returns the natural alignment of the struct S type.\n//\n// Note: If C++11 alignas is supported, then alignas/OVR_ALIGNAS may take a const expression in addition to a constant.\n// Note: The C11 Standard species the _Alignas keyword and alignas as a macro for it in <stdalign.h>\n\n#if !defined(OVR_ALIGNAS)\n    #if defined(OVR_CC_GNU) && !defined(OVR_CPP_NO_ALIGNAS)     // If C++11 alignas is supported...\n        #define OVR_ALIGNAS(n) alignas(n)\n    #elif defined(__clang__) && !defined(OVR_CPP_NO_ALIGNAS)\n        #define OVR_ALIGNAS(n) alignas(n)\n    #elif defined(OVR_CC_GNU) || defined(__clang__)\n        #define OVR_ALIGNAS(n) __attribute__((aligned(n)))\n    #elif defined(OVR_CC_MSVC) || defined(OVR_CC_INTEL)\n        #define OVR_ALIGNAS(n) __declspec(align(n))             // For Microsoft the alignment must be a literal integer.\n    #elif defined(OVR_CC_ARM)\n        #define OVR_ALIGNAS(n) __align(n)\n    #else\n        #error Need to define OVR_ALIGNAS\n    #endif\n#endif\n\n#if !defined(OVR_ALIGNOF)\n    #if defined(OVR_CC_GNU) && !defined(OVR_CPP_NO_ALIGNOF)     // If C++11 alignof is supported...\n        #define OVR_ALIGNOF(type) alignof(type)\n    #elif defined(__clang__) && !defined(OVR_CPP_NO_ALIGNOF)\n        #define OVR_ALIGNOF(type) alignof(type)\n    #elif defined(OVR_CC_GNU) || defined(__clang__)\n        #define OVR_ALIGNOF(type) ((size_t)__alignof__(type))\n    #elif defined(OVR_CC_MSVC) || defined(OVR_CC_INTEL)\n        #define OVR_ALIGNOF(type) ((size_t)__alignof(type))\n    #elif defined(OVR_CC_ARM)\n        #define OVR_ALIGNOF(type) ((size_t)__ALIGNOF__(type))\n    #else\n        #error Need to define OVR_ALIGNOF\n    #endif\n#endif\n\n\n// -----------------------------------------------------------------------------------\n// ***** OVR_ASSUME / OVR_ANALYSIS_ASSUME\n//\n// This is a portable wrapper for VC++'s __assume and __analysis_assume.\n// __analysis_assume is typically used to quell VC++ static analysis warnings.\n//\n// Example usage:\n//    void Test(char c){\n//       switch(c){\n//          case 'a':\n//          case 'b':\n//          case 'c':\n//          case 'd':\n//             break;\n//          default:\n//             OVR_ASSUME(0); // Unreachable code.\n//       }\n//    }\n//\n//    size_t Test(char* str){\n//       OVR_ANALYSIS_ASSUME(str != nullptr);\n//       return strlen(str);\n//    }\n\n#if !defined(OVR_ASSUME)\n    #if defined(OVR_CC_MSVC)\n        #define OVR_ASSUME(x)          __assume(x)\n        #define OVR_ANALYSIS_ASSUME(x) __analysis_assume(!!(x))\n    #else\n        #define OVR_ASSUME(x)\n        #define OVR_ANALYSIS_ASSUME(x)\n    #endif\n#endif\n\n\n// -----------------------------------------------------------------------------------\n// ***** OVR_RESTRICT\n//\n// Wraps the C99 restrict keyword in a portable way.\n// C++11 and C++14 don't have restrict but this functionality is supported by\n// all C++ compilers.\n//\n// Example usage:\n//    void* memcpy(void* OVR_RESTRICT s1, const void* OVR_RESTRICT s2, size_t n);\n\n#if !defined(OVR_RESTRICT)\n    #define OVR_RESTRICT __restrict // Currently supported by all compilers of significance to us.\n#endif\n\n\n// -----------------------------------------------------------------------------------\n// ***** OVR_NOEXCEPT / OVR_NOEXCEPT_IF(predicate) / OVR_NOEXCEPT_EXPR(expression)\n//\n// Implements a portable wrapper for C++11 noexcept.\n// http://en.cppreference.com/w/cpp/language/noexcept\n//\n// Example usage:\n//     void Test() OVR_NOEXCEPT {} // This function doesn't throw.\n//\n//     template <typename T>\n//     void DoNothing() OVR_NOEXCEPT_IF(OVR_NOEXCEPT_EXPR(T())) // Throws an if and only if T::T(int) throws.\n//         { T t(3); }\n//\n#if !defined(OVR_NOEXCEPT)\n    #if defined(OVR_CPP_NOEXCEPT)\n        #define OVR_NOEXCEPT\n        #define OVR_NOEXCEPT_IF(predicate)\n        #define OVR_NOEXCEPT_EXPR(expression) false\n    #else\n        #define OVR_NOEXCEPT noexcept\n        #define OVR_NOEXCEPT_IF(predicate) noexcept((predicate))\n        #define OVR_NOEXCEPT_EXPR(expression) noexcept((expression))\n    #endif\n#endif\n\n\n// -----------------------------------------------------------------------------------\n// ***** OVR_FINAL\n//\n// Wraps the C++11 final keyword in a portable way.\n// http://en.cppreference.com/w/cpp/language/final\n//\n// Example usage:\n//     struct Test { virtual int GetValue() OVR_FINAL; };\n\n#if !defined(OVR_FINAL)\n    #if defined(OVR_CC_MSVC) && (OVR_CC_VERSION < 1700) // VC++ 2012 and earlier\n        #define OVR_FINAL sealed\n    #elif defined(OVR_CPP_INHERITANCE_FINAL)\n        #define OVR_FINAL\n    #else\n        #define OVR_FINAL final\n    #endif\n#endif\n\n\n// -----------------------------------------------------------------------------------\n// ***** OVR_OVERRIDE\n//\n// Wraps the C++11 override keyword in a portable way.\n// http://en.cppreference.com/w/cpp/language/override\n//\n// Example usage:\n//        struct Parent { virtual void Func(int); };\n//        struct Child : public Parent { void Func(int) OVR_OVERRIDE; };\n\n#if !defined(OVR_CPP11_ENABLED)\n#define OVR_OVERRIDE\n#elif !defined(OVR_OVERRIDE)\n    #if defined(OVR_CPP_OVERRIDE)\n        #define OVR_OVERRIDE\n    #else\n        #if (defined(_MSC_VER) && (_MSC_VER <= 1600))\n            #pragma warning(disable : 4481)\n        #endif\n        #define OVR_OVERRIDE override\n    #endif\n#endif\n\n\n// -----------------------------------------------------------------------------------\n// ***** OVR_FINAL_OVERRIDE\n//\n// Wraps the C++11 final+override keywords (a common combination) in a portable way.\n//\n// Example usage:\n//     struct Parent { virtual void Func(); };\n//     struct Child : public Parent { virtual void Func() OVR_FINAL_OVERRIDE; };\n\n#if !defined(OVR_FINAL_OVERRIDE)\n    #define OVR_FINAL_OVERRIDE OVR_FINAL OVR_OVERRIDE\n#endif\n\n\n// -----------------------------------------------------------------------------------\n// ***** OVR_EXTERN_TEMPLATE\n//\n// Portable wrapper for C++11 extern template. This tells the compiler to not instantiate\n// the template in the current translation unit, which can significantly speed up\n// compilation and avoid problems due to two translation units compiling code with\n// different settings.\n//\n// Example usage:\n//     OVR_EXTERN_TEMPLATE(class basic_string<char>); // Nothing to do for non-C++11 compilers.\n\n#if !defined(OVR_EXTERN_TEMPLATE)\n    #if defined(OVR_CPP_EXTERN_TEMPLATE)\n        #define OVR_EXTERN_TEMPLATE(decl)\n    #else\n        #define OVR_EXTERN_TEMPLATE(decl) extern template decl\n    #endif\n#endif\n\n\n// -----------------------------------------------------------------------------------\n// ***** OVR_CONSTEXPR  / OVR_CONSTEXPR_OR_CONST\n//\n// Portable wrapper for C++11 constexpr. Doesn't include C++14 relaxed constexpr,\n// for which a different wrapper name is reserved.\n//\n// Example usage:\n//     OVR_CONSTEXPR int Test() { return 15; }          // This can be optimized better by a C++11 compiler that supports constexpr.\n//     OVR_CONSTEXPR_OR_CONST float x = 3.14159f;       // This can be optimized better by a C++11 compiler, but if not then at least make it const.\n\n#if !defined(OVR_CONSTEXPR)\n    #if defined(OVR_CPP_NO_CONSTEXPR)\n        #define OVR_CONSTEXPR\n    #else\n        #define OVR_CONSTEXPR constexpr\n    #endif\n#endif\n\n#if !defined(OVR_CONSTEXPR_OR_CONST)\n    #if defined(OVR_CPP_NO_CONSTEXPR)\n        #define OVR_CONSTEXPR_OR_CONST const\n    #else\n        #define OVR_CONSTEXPR_OR_CONST constexpr\n    #endif\n#endif\n\n\n\n// -----------------------------------------------------------------------------------\n// ***** OVR_FUNCTION_DELETE / OVR_FUNCTION_DEFAULT\n//\n// Wraps the C++11 delete and default keywords in a way that allows for cleaner code\n// while making for a better version of uncallable or default functions.\n//\n// Example usage:\n//     struct Test{\n//         Test() OVR_FUNCTION_DEFAULT;            // Non-C++11 compilers will require a separate definition for Test().\n//     private:                                   // Users should put OVR_FUNCTION_DELETE usage in a private\n//         void Uncallable() OVR_FUNCTION_DELETE;  // area for compatibility with pre-C++11 compilers.\n//     };\n\n#if defined(OVR_CPP_NO_DELETED_FUNCTIONS)\n    #define OVR_FUNCTION_DELETE\n#else\n    #define OVR_FUNCTION_DELETE = delete\n#endif\n\n#if defined(OVR_CPP_NO_DEFAULTED_FUNCTIONS)\n    #define OVR_FUNCTION_DEFAULT\n#else\n    #define OVR_FUNCTION_DEFAULT = default\n#endif\n\n\n\n// -----------------------------------------------------------------------------------\n// ***** OVR_NON_COPYABLE\n//\n// Allows you to specify a class as being neither copy-constructible nor assignable,\n// which is a commonly needed pattern in C++ programming. Classes with this declaration\n// are required to be default constructible (as are most classes). For pre-C++11\n// compilers this macro declares a private section for the class, which will be\n// inherited by whatever code is directly below the macro invocation by default.\n//\n// Example usage:\n//    struct Test {\n//       Test();\n//       ...\n//       OVR_NON_COPYABLE(Test)\n//    };\n\n#if !defined(OVR_NON_COPYABLE)\n    #if defined(OVR_CPP_NO_DELETED_FUNCTIONS)\n        #define OVR_NON_COPYABLE(Type)   \\\n            private:                     \\\n            Type(const Type&);           \\\n            void operator=(const Type&);\n    #else\n        #define OVR_NON_COPYABLE(Type)   \\\n            Type(const Type&) = delete;  \\\n            void operator=(const Type&) = delete;\n    #endif\n#endif\n\n\n\n#endif  // header include guard\n\n\n\n\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_ContainerAllocator.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR_Kernel.h\nFilename    :   OVR_ContainerAllocator.h\nContent     :   Template allocators and constructors for containers.\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_ContainerAllocator_h\n#define OVR_ContainerAllocator_h\n\n#include \"OVR_Allocator.h\"\n#include <string.h>\n\n\nnamespace OVR {\n\n\n//-----------------------------------------------------------------------------------\n// ***** Container Allocator\n\n// ContainerAllocator serves as a template argument for allocations done by\n// containers, such as Array and Hash; replacing it could allow allocator\n// substitution in containers.\n\nclass ContainerAllocatorBase\n{\npublic:\n    static void* Alloc(size_t size)                { return OVR_ALLOC(size); }\n    static void* Realloc(void* p, size_t newSize)  { return OVR_REALLOC(p, newSize); }\n    static void  Free(void *p)                    { OVR_FREE(p); }\n};\n\n\n\n//-----------------------------------------------------------------------------------\n// ***** Constructors, Destructors, Copiers\n\n// Plain Old Data - movable, no special constructors/destructor.\ntemplate<class T> \nclass ConstructorPOD\n{\npublic:\n    static void Construct(void *) {}\n    static void Construct(void *p, const T& source) \n    { \n        *(T*)p = source;\n    }\n\n    // Same as above, but allows for a different type of constructor.\n    template <class S> \n    static void ConstructAlt(void *p, const S& source)\n    {\n        *(T*)p = source;\n    }\n\n    static void ConstructArray(void*, size_t) {}\n\n    static void ConstructArray(void* p, size_t count, const T& source)\n    {\n        uint8_t *pdata = (uint8_t*)p;\n        for (size_t i=0; i< count; ++i, pdata += sizeof(T))\n            *(T*)pdata = source;\n    }\n\n    static void ConstructArray(void* p, size_t count, const T* psource)\n    {\n        memcpy(p, psource, sizeof(T) * count);\n    }\n\n    static void Destruct(T*) {}\n    static void DestructArray(T*, size_t) {}\n\n    static void CopyArrayForward(T* dst, const T* src, size_t count)\n    {\n        memmove(dst, src, count * sizeof(T));\n    }\n\n    static void CopyArrayBackward(T* dst, const T* src, size_t count)\n    {\n        memmove(dst, src, count * sizeof(T));\n    }\n\n    static bool IsMovable() { return true; }\n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** ConstructorMov\n//\n// Correct C++ construction and destruction for movable objects\ntemplate<class T> \nclass ConstructorMov\n{\npublic:\n    static void Construct(void* p) \n    { \n        OVR::Construct<T>(p);\n    }\n\n    static void Construct(void* p, const T& source) \n    { \n        OVR::Construct<T>(p, source);\n    }\n\n    // Same as above, but allows for a different type of constructor.\n    template <class S> \n    static void ConstructAlt(void* p, const S& source)\n    {\n        OVR::ConstructAlt<T,S>(p, source);\n    }\n\n    static void ConstructArray(void* p, size_t count)\n    {\n        uint8_t* pdata = (uint8_t*)p;\n        for (size_t i=0; i< count; ++i, pdata += sizeof(T))\n            Construct(pdata);\n    }\n\n    static void ConstructArray(void* p, size_t count, const T& source)\n    {\n        uint8_t* pdata = (uint8_t*)p;\n        for (size_t i=0; i< count; ++i, pdata += sizeof(T))\n            Construct(pdata, source);\n    }\n\n    static void ConstructArray(void* p, size_t count, const T* psource)\n    {\n        uint8_t* pdata = (uint8_t*)p;\n        for (size_t i=0; i< count; ++i, pdata += sizeof(T))\n            Construct(pdata, *psource++);\n    }\n\n    static void Destruct(T* p)\n    {\n        p->~T();\n        OVR_UNUSED(p); // Suppress silly MSVC warning\n    }\n\n    static void DestructArray(T* p, size_t count)\n    {   \n        p += count - 1;\n        for (size_t i=0; i<count; ++i, --p)\n            p->~T();\n    }\n\n    static void CopyArrayForward(T* dst, const T* src, size_t count)\n    {\n        memmove(dst, src, count * sizeof(T));\n    }\n\n    static void CopyArrayBackward(T* dst, const T* src, size_t count)\n    {\n        memmove(dst, src, count * sizeof(T));\n    }\n\n    static bool IsMovable() { return true; }\n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** ConstructorCPP\n//\n// Correct C++ construction and destruction for movable objects\ntemplate<class T> \nclass ConstructorCPP\n{\npublic:\n    static void Construct(void* p) \n    { \n        OVR::Construct<T>(p);        \n    }\n\n    static void Construct(void* p, const T& source) \n    { \n        OVR::Construct<T>(p, source);        \n    }\n\n    // Same as above, but allows for a different type of constructor.\n    template <class S> \n    static void ConstructAlt(void* p, const S& source)\n    {\n        OVR::ConstructAlt<T,S>(p, source);        \n    }\n\n    static void ConstructArray(void* p, size_t count)\n    {\n        uint8_t* pdata = (uint8_t*)p;\n        for (size_t i=0; i< count; ++i, pdata += sizeof(T))\n            Construct(pdata);\n    }\n\n    static void ConstructArray(void* p, size_t count, const T& source)\n    {\n        uint8_t* pdata = (uint8_t*)p;\n        for (size_t i=0; i< count; ++i, pdata += sizeof(T))\n            Construct(pdata, source);\n    }\n\n    static void ConstructArray(void* p, size_t count, const T* psource)\n    {\n        uint8_t* pdata = (uint8_t*)p;\n        for (size_t i=0; i< count; ++i, pdata += sizeof(T))\n            Construct(pdata, *psource++);\n    }\n\n    static void Destruct(T* p)\n    {\n        p->~T();\n        OVR_UNUSED(p); // Suppress silly MSVC warning\n    }\n\n    static void DestructArray(T* p, size_t count)\n    {   \n        p += count - 1;\n        for (size_t i=0; i<count; ++i, --p)\n            p->~T();\n    }\n\n    static void CopyArrayForward(T* dst, const T* src, size_t count)\n    {\n        for(size_t i = 0; i < count; ++i)\n            dst[i] = src[i];\n    }\n\n    static void CopyArrayBackward(T* dst, const T* src, size_t count)\n    {\n        for(size_t i = count; i; --i)\n            dst[i-1] = src[i-1];\n    }\n\n    static bool IsMovable() { return false; }\n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** Container Allocator with movement policy\n//\n// Simple wraps as specialized allocators\ntemplate<class T> struct ContainerAllocator_POD : ContainerAllocatorBase, ConstructorPOD<T> {};\ntemplate<class T> struct ContainerAllocator     : ContainerAllocatorBase, ConstructorMov<T> {};\ntemplate<class T> struct ContainerAllocator_CPP : ContainerAllocatorBase, ConstructorCPP<T> {};\n\n\n} // OVR\n\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_DebugHelp.cpp",
    "content": "/************************************************************************************\n\nFilename    :   ExceptionHandler.cpp\nContent     :   Platform-independent exception handling interface\nCreated     :   October 6, 2014\n\nCopyright   :   Copyright 2014 Oculus VR, LLC. All Rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n\n#include \"OVR_DebugHelp.h\"\n#include \"OVR_Types.h\"\n#include \"OVR_UTF8Util.h\"\n#include \"../OVR_CAPI.h\"\n#include \"../OVR_CAPI_Keys.h\"\n#include \"../CAPI/CAPI_HMDState.h\"\n#include <stdlib.h>\n\n#if defined(OVR_OS_WIN32) || defined(OVR_OS_WIN64)\n    #pragma warning(push, 0)\n    #include <Windows.h>\n    #include <WinNT.h>\n    #include <DbgHelp.h>\n    #include <WinVer.h>\n    #include <share.h>\n    #include <Psapi.h>\n    #include <TlHelp32.h>\n    #include <comutil.h>\n    #include <Wbemcli.h>\n    #include <Wbemidl.h>\n    #include <ShlObj.h>\n    #include <ObjBase.h>\n    #pragma warning(pop)\n\n    #pragma comment(lib, \"Psapi.lib\")   // To consider: It may be a problem to statically link to these libraries if the application at runtime intends to dynamically\n    #pragma comment(lib, \"ole32.lib\")   // link to a different version of the same library, and we are statically linked into that application instead of being a DLL.\n    #pragma comment(lib, \"shell32.lib\")\n\n    // NtQueryInformation and THREAD_BASIC_INFORMATION are undocumented but frequently needed for digging into thread information.\n    typedef LONG (WINAPI *NtQueryInformationThreadFunc)(HANDLE, int, PVOID, ULONG, PULONG);\n\n    struct THREAD_BASIC_INFORMATION\n    {\n        LONG  ExitStatus;\n        PVOID TebBaseAddress;\n        PVOID UniqueProcessId;\n        PVOID UniqueThreadId;\n        PVOID Priority;\n        PVOID BasePriority;\n    };\n\n    #ifndef UNW_FLAG_NHANDLER // Older Windows SDKs don't support this.\n        #define UNW_FLAG_NHANDLER 0\n    #endif\n\n#elif defined(OVR_OS_MAC)\n    #include <unistd.h>\n    #include <sys/sysctl.h>\n    #include <sys/utsname.h>\n    #include <sys/types.h>\n    #include <sys/mman.h>\n    #include <stdlib.h>\n    #include <stdio.h>\n    #include <pthread.h>\n    #include <mach/mach.h>\n    #include <mach/mach_error.h>\n    #include <mach/thread_status.h>\n    #include <mach/exception.h>\n    #include <mach/task.h>\n    #include <mach/thread_act.h>\n    #include <mach-o/dyld.h>\n    #include <mach-o/dyld_images.h>\n    #include <libproc.h>\n    #include <libgen.h>\n    #include <execinfo.h>\n    #include <cxxabi.h>\n    #include \"OVR_mach_exc_OSX.h\"\n\n    #if defined(__LP64__)\n        typedef struct mach_header_64     MachHeader;\n        typedef struct segment_command_64 SegmentCommand;\n        typedef struct section_64         Section;\n        #define kLCSegment                LC_SEGMENT_64\n    #else\n        typedef struct mach_header        MachHeader;\n        typedef struct segment_command    SegmentCommand;\n        typedef struct section            Section;\n        #define kLCSegment                LC_SEGMENT\n    #endif\n\n    extern \"C\" const struct dyld_all_image_infos* _dyld_get_all_image_infos(); // From libdyld.dylib\n\n#elif defined(OVR_OS_UNIX)\n\t#include <unistd.h>\n\t#include <sys/sysctl.h>\n\t#include <sys/utsname.h>\n\t#include <sys/types.h>\n\t#include <sys/ptrace.h>\n\t#include <sys/wait.h>\n\t#include <sys/mman.h>\n\t#include <stdlib.h>\n\t#include <stdio.h>\n\t#include <pthread.h>\n\t#include <libgen.h>\n\t#include <execinfo.h>\n\t#include <cxxabi.h>\n  //#include <libunwind.h> // Can't use this until we can ensure that we have an installed version of it.\n#endif\n\n#if !defined(MIN)\n    #define MIN(X,Y) ((X) < (Y) ? (X) : (Y))\n    #define MAX(X,Y) ((X) > (Y) ? (X) : (Y))\n#endif\n\n\nOVR_DISABLE_MSVC_WARNING(4351) // new behavior: elements of array will be default initialized\nOVR_DISABLE_MSVC_WARNING(4996) // This function or variable may be unsafe\n\n\n\n\n#if defined(OVR_OS_APPLE)\n    static OVR::ExceptionHandler* sExceptionHandler = nullptr;\n    const uint32_t sMachCancelMessageType = 0x0ca9ce11;  // This is a made-up value of our own choice.\n\n    extern \"C\"\n    {\n        kern_return_t catch_mach_exception_raise_OVR(mach_port_t /*exceptionPort*/, mach_port_t /*threadSysId*/,\n                                        mach_port_t /*machTask*/, exception_type_t /*machExceptionType*/,\n                                        mach_exception_data_t /*machExceptionData*/, mach_msg_type_number_t /*machExceptionDataCount*/)\n        {    \n            return KERN_FAILURE;\n        }\n\n        kern_return_t catch_mach_exception_raise_state_OVR(mach_port_t /*exceptionPort*/, exception_type_t /*exceptionType*/,\n                                        const mach_exception_data_t /*machExceptionData*/, mach_msg_type_number_t /*machExceptionDataCount*/,\n                                        int* /*pMachExceptionFlavor*/, const thread_state_t /*threadStatePrev*/, mach_msg_type_number_t /*threaStatePrevCount*/,\n                                        thread_state_t /*threadStateNew*/, mach_msg_type_number_t* /*pThreadStateNewCount*/)\n        {    \n            return KERN_FAILURE;\n        }\n\n        kern_return_t catch_mach_exception_raise_state_identity_OVR(mach_port_t exceptionPort, mach_port_t threadSysId, mach_port_t machTask,\n                                            exception_type_t exceptionType, mach_exception_data_type_t* machExceptionData,\n                                            mach_msg_type_number_t machExceptionDataCount, int* pMachExceptionFlavor,\n                                            thread_state_t threadStatePrev, mach_msg_type_number_t threadStatePrevCount,\n                                            thread_state_t threadStateNew, mach_msg_type_number_t* pThreadStateNewCount)\n        {\n            return sExceptionHandler->HandleMachException(exceptionPort, threadSysId, machTask, exceptionType, machExceptionData,\n                                                machExceptionDataCount, pMachExceptionFlavor, threadStatePrev, threadStatePrevCount,\n                                                threadStateNew, pThreadStateNewCount);\n        }\n\n        void* MachHandlerThreadFunctionStatic(void* pExceptionHandlerVoid)\n        {\n            return static_cast<OVR::ExceptionHandler*>(pExceptionHandlerVoid)->MachHandlerThreadFunction();\n        }\n    \n    } // extern \"C\"\n#endif\n\n\n\n\nnamespace OVR {\n\n\nvoid GetInstructionPointer(void*& pInstruction)\n{\n    #if defined(OVR_CC_MSVC)\n        pInstruction = _ReturnAddress();\n    #else // GCC, clang\n        pInstruction = __builtin_return_address(0);\n    #endif\n}\n\n\nstatic size_t SprintfAddress(char* threadHandleStr, size_t threadHandleStrCapacity, const void* pAddress)\n{\n    #if defined(OVR_CC_MSVC)\n        #if (OVR_PTR_SIZE >= 8)\n            return OVR_snprintf(threadHandleStr, threadHandleStrCapacity, \"0x%016I64x\", pAddress);  // e.g. 0x0123456789abcdef\n        #else\n            return OVR_snprintf(threadHandleStr, threadHandleStrCapacity, \"0x%08x\", pAddress);      // e.g. 0x89abcdef\n        #endif\n    #else\n        #if (OVR_PTR_SIZE >= 8)\n            return OVR_snprintf(threadHandleStr, threadHandleStrCapacity, \"%016llx\", pAddress);     // e.g. 0x0123456789abcdef\n        #else\n            return OVR_snprintf(threadHandleStr, threadHandleStrCapacity, \"%08x\", pAddress);        // e.g. 0x89abcdef\n        #endif\n    #endif\n}\n\n\nstatic size_t SprintfThreadHandle(char* threadHandleStr, size_t threadHandleStrCapacity, const ThreadHandle& threadHandle)\n{\n    return SprintfAddress(threadHandleStr, threadHandleStrCapacity, threadHandle);\n}\n\n\nstatic size_t SprintfThreadSysId(char* threadSysIdStr, size_t threadSysIdStrCapacity, const ThreadSysId& threadSysId)\n{\n    #if defined(OVR_CC_MSVC) // Somebody could conceivably use VC++ with a different standard library that supports %ll. And VS2012+ also support %ll.\n        return OVR_snprintf(threadSysIdStr, threadSysIdStrCapacity, \"%I64u\", (uint64_t)threadSysId);        \n    #else\n        return OVR_snprintf(threadSysIdStr, threadSysIdStrCapacity, \"%llu\", (uint64_t)threadSysId);        \n    #endif\n}\n\n\n\n\n\nvoid GetThreadStackBounds(void*& pStackBase, void*& pStackLimit, ThreadHandle threadHandle)\n{\n    #if defined(OVR_OS_WIN64) || defined(OVR_OS_WIN32) || (defined(OVR_OS_MS) && defined(OVR_OS_CONSOLE))\n        ThreadSysId threadSysIdCurrent = (ThreadSysId)GetCurrentThreadId();\n        ThreadSysId threadSysId;\n        NT_TIB*     pTIB = nullptr;\n\n        if(threadHandle == OVR_THREADHANDLE_INVALID)\n            threadSysId = threadSysIdCurrent;\n        else\n            threadSysId = ConvertThreadHandleToThreadSysId(threadHandle);\n\n        if(threadSysId == threadSysIdCurrent)\n        {\n            #if (OVR_PTR_SIZE == 4)\n                // Need to use __asm__(\"movl %%fs:0x18, %0\" : \"=r\" (pTIB) : : ); under gcc/clang.\n                __asm {\n                    mov eax, fs:[18h]\n                    mov pTIB, eax\n                }\n            #else\n                pTIB = (NT_TIB*)NtCurrentTeb();\n            #endif\n        }\n        else\n        {\n            #if (OVR_PTR_SIZE == 4)\n                // It turns out we don't need to suspend the thread when getting SegFs/SegGS, as that's \n                // constant per thread and doesn't require the thread to be suspended.\n                //SuspendThread((HANDLE)threadHandle); \n                CONTEXT context;\n                memset(&context, 0, sizeof(context));\n                context.ContextFlags = CONTEXT_SEGMENTS;\n                GetThreadContext((HANDLE)threadHandle, &context); // Requires THREAD_QUERY_INFORMATION privileges.\n\n                LDT_ENTRY ldtEntry;\n                if(GetThreadSelectorEntry(threadHandle, context.SegFs, &ldtEntry)) // Requires THREAD_QUERY_INFORMATION\n                    pTIB = (NT_TIB*)((ldtEntry.HighWord.Bits.BaseHi << 24 ) | (ldtEntry.HighWord.Bits.BaseMid << 16) | ldtEntry.BaseLow);\n\n                //ResumeThread((HANDLE)threadHandle);\n            #else\n                // We cannot use GetThreadSelectorEntry or Wow64GetThreadSelectorEntry on Win64.\n                // We need to read the SegGs qword at offset 0x30. We can't use pTIB = (NT_TIB*)__readgsqword(0x30) because that reads only the current setGs offset.\n                //    mov rax, qword ptr gs:[30h]  \n                //    mov qword ptr [pTIB],rax\n                // In the meantime we rely on the NtQueryInformationThread function.\n\n                static NtQueryInformationThreadFunc spNtQueryInformationThread = nullptr;\n\n                if(!spNtQueryInformationThread)\n                {\n                    HMODULE hNTDLL = GetModuleHandleA(\"ntdll.dll\");\n                    spNtQueryInformationThread = (NtQueryInformationThreadFunc)(uintptr_t)GetProcAddress(hNTDLL, \"NtQueryInformationThread\");\n                }\n\n                if(spNtQueryInformationThread)\n                {\n                    THREAD_BASIC_INFORMATION tbi;\n\n                    memset(&tbi, 0, sizeof(tbi));\n                    LONG result = spNtQueryInformationThread(threadHandle, 0, &tbi, sizeof(tbi), nullptr); // Requires THREAD_QUERY_INFORMATION privileges\n                    if(result == 0)\n                        pTIB = (NT_TIB*)tbi.TebBaseAddress;\n                }\n            #endif\n        }\n\n        if(pTIB)\n        {\n            pStackBase  = (void*)pTIB->StackBase;\n            pStackLimit = (void*)pTIB->StackLimit;\n        }\n        else\n        {\n            pStackBase  = nullptr;\n            pStackLimit = nullptr;\n        }\n\n    #elif defined(OVR_OS_APPLE)\n        if(!threadHandle)\n            threadHandle = pthread_self();\n    \n        pStackBase = pthread_get_stackaddr_np((pthread_t)threadHandle);\n        size_t stackSize = pthread_get_stacksize_np((pthread_t)threadHandle);\n        pStackLimit = (void*)((size_t)pStackBase - stackSize);\n    \n    #elif defined(OVR_OS_UNIX)\n        pStackBase  = nullptr;\n        pStackLimit = nullptr;\n\n        pthread_attr_t threadAttr;\n        pthread_attr_init(&threadAttr);\n    \n        #if defined(OVR_OS_LINUX)\n            int result = pthread_getattr_np((pthread_t)threadHandle, &threadAttr);\n        #else\n            int result = pthread_attr_get_np((pthread_t)threadHandle, &threadAttr);\n        #endif\n    \n        if(result == 0)\n        {\n            size_t stackSize = 0;\n            result = pthread_attr_getstack(&threadAttr, &pStackLimit, &stackSize);\n            \n            if(result == 0)\n                pStackBase = (void*)((uintptr_t)pStackLimit + stackSize); // We assume the stack grows downward.\n        }\n\n    #endif\n}\n\n\nbool OVRIsDebuggerPresent()\n{\n    #if defined(OVR_OS_MS)\n        return ::IsDebuggerPresent() != 0;\n\n    #elif defined(OVR_OS_APPLE)\n        int               mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid() };\n        struct kinfo_proc info;\n        size_t            size = sizeof(info);\n\n        info.kp_proc.p_flag = 0;\n        sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, nullptr, 0);\n\n        return ((info.kp_proc.p_flag & P_TRACED) != 0);\n\n    #elif (defined(OVR_OS_LINUX) || defined(OVR_OS_BSD)) && !defined(OVR_OS_ANDROID)\n        // This works better than the PT_TRACE_ME approach.\n        // However, it presents a problem: \n        //     http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html\n        //     When the application calls fork() from a signal handler and any of the\n        //     fork handlers registered by pthread_atfork() calls a function that is\n        //     not asynch-signal-safe, the behavior is undefined.\n        // We may need to provide two pathways within this function, one of which \n        // doesn't fork and instead uses PT_TRACE_ME.\n        int  pid = fork();\n        int  status;\n        bool present = false;\n\n        if (pid == -1) // If fork failed...\n        {\n            // perror(\"fork\");\n        }\n        else if (pid == 0) // If we are the child process...\n        {\n            int ppid = getppid();\n\n          #if defined(OVR_OS_LINUX)\n            if (ptrace(PTRACE_ATTACH, ppid, nullptr, nullptr) == 0)\n          #else\n            if (ptrace(PT_ATTACH, ppid, nullptr, nullptr) == 0)\n          #endif\n            {\n                waitpid(ppid, nullptr, 0);\n\n              #if defined(OVR_OS_LINUX)\n                ptrace(PTRACE_CONT, getppid(), nullptr, nullptr);\n                ptrace(PTRACE_DETACH, getppid(), nullptr, nullptr);\n              #else\n                ptrace(PT_CONTINUE, getppid(), nullptr, nullptr);\n                ptrace(PT_DETACH, getppid(), nullptr, nullptr);\n              #endif\n            }\n            else\n            {\n                // ptrace failed so the debugger is present.\n                present = true;\n            }\n\n            exit(present ? 1 : 0); // The WEXITSTATUS call below will read this exit value.\n        }\n        else // Else we are the original process.\n        {\n            waitpid(pid, &status, 0);\n            present = WEXITSTATUS(status) ? true : false; // Read the exit value from the child's call to exit.\n        }\n\n        return present;\n\n    #elif defined(PT_TRACE_ME) && !defined(OVR_OS_ANDROID)\n        return (ptrace(PT_TRACE_ME, 0, 1, 0) < 0);\n\n    #else\n        return false;\n    #endif\n}\n\n\n// Exits the process with the given exit code.\nvoid ExitProcess(intptr_t processReturnValue)\n{\n    exit((int)processReturnValue);\n}\n\n\nvoid* SafeMMapAlloc(size_t size)\n{\n    #if defined(OVR_OS_MS)\n        return VirtualAlloc(nullptr, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); // size is rounded up to a page. // Returned memory is 0-filled.\n\n    #elif defined(OVR_OS_MAC) || defined(OVR_OS_UNIX)\n        #if !defined(MAP_FAILED)\n            #define MAP_FAILED ((void*)-1)\n        #endif\n\n        void* result = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); // Returned memory is 0-filled.\n        if(result == MAP_FAILED) // mmap returns MAP_FAILED (-1) upon failure.\n            result = nullptr;\n        return result;\n    #endif\n}\n\n\nvoid SafeMMapFree(const void* memory, size_t size)\n{\n    #if defined(OVR_OS_MS)\n        OVR_UNUSED(size);\n        VirtualFree(const_cast<void*>(memory), 0, MEM_RELEASE);\n\n    #elif defined(OVR_OS_MAC) || defined(OVR_OS_UNIX)\n        size_t pageSize = getpagesize();\n        size = (((size + (pageSize - 1)) / pageSize) * pageSize);\n        munmap(const_cast<void*>(memory), size); // Must supply the size to munmap.\n    #endif\n}\n\n\n// Note that we can't just return sizeof(void*) == 8, as we may have the case of a\n// 32 bit app running on a 64 bit operating system.\nstatic bool Is64BitOS()\n{\n    #if (OVR_PTR_SIZE >= 8)\n        return true;\n\n    #elif defined(OVR_OS_WIN32) || defined(OVR_OS_WIN64)\n        BOOL is64BitOS = FALSE;\n        bool IsWow64ProcessPresent = (GetProcAddress(GetModuleHandleW(L\"kernel32.dll\"), \"IsWow64Process\") != nullptr);\n        return (IsWow64ProcessPresent && IsWow64Process(GetCurrentProcess(), &is64BitOS) && is64BitOS);\n\n    #elif defined(OVR_OS_MAC) || defined(OVR_OS_UNIX)\n        utsname utsName;\n        memset(&utsName, 0, sizeof(utsName));\n        return (uname(&utsName) == 0) && (strcmp(utsName.machine, \"x86_64\") == 0);\n\n    #else\n        return false;\n    #endif\n}\n\n\n// The output will always be 0-terminated.\n// Returns the required strlen of the output.\n// Returns (size_t)-1 on failure.\nsize_t SpawnShellCommand(const char* shellCommand, char* output, size_t outputCapacity)\n{\n    #if defined(OVR_OS_UNIX) || defined(OVR_OS_APPLE)\n        FILE* pFile = popen(shellCommand, \"r\");\n    \n        if(pFile)\n        {\n            size_t requiredLength = 0;\n            char buffer[256];\n        \n            while(fgets(buffer, sizeof(buffer), pFile)) // fgets 0-terminates the buffer.\n            {\n                size_t length = OVR_strlen(buffer);\n                requiredLength += length;\n            \n                if(outputCapacity)\n                {\n                    OVR_strlcpy(output, buffer, outputCapacity);\n                    length = MIN(outputCapacity, length);\n                }\n\n                output         += length;\n                outputCapacity -= length;\n            }\n        \n            pclose(pFile);\n            return requiredLength;\n        }\n    #else\n        // To do. Properly solving this on Windows requires a bit of code.\n        OVR_UNUSED(shellCommand);\n        OVR_UNUSED(output);\n        OVR_UNUSED(outputCapacity);\n    #endif\n\n    return (size_t)-1;\n}\n\n\n// Retrieves a directory path which ends with a path separator.\n// Returns the required strlen of the path.\n// Guarantees the presence of the directory upon returning true.\nstatic size_t GetUserDocumentsDirectory(char* directoryPath, size_t directoryPathCapacity)\n{\n    #if defined(OVR_OS_MS)\n        wchar_t pathW[MAX_PATH + 1]; // +1 because we append a path separator.\n        HRESULT hr = SHGetFolderPathW(nullptr, CSIDL_APPDATA | CSIDL_FLAG_CREATE, nullptr, SHGFP_TYPE_CURRENT, pathW);\n\n        if(SUCCEEDED(hr))\n        {\n            OVR_UNUSED(directoryPathCapacity);\n\n            intptr_t requiredUTF8Length = OVR::UTF8Util::GetEncodeStringSize(pathW); // Returns required strlen.\n            if(requiredUTF8Length < MAX_PATH) // We need space for a trailing path separator.\n            {\n                OVR::UTF8Util::EncodeString(directoryPath, pathW, -1);\n                OVR::OVR_strlcat(directoryPath, \"\\\\\", directoryPathCapacity);\n            }        \n\n            return (requiredUTF8Length + 1);\n        }\n\n    #elif defined(OVR_OS_MAC)\n        // This is the same location that Apple puts its OS-generated .crash files.\n        const char* home = getenv(\"HOME\");\n        size_t requiredStrlen = OVR::OVR_snprintf(directoryPath, directoryPathCapacity, \"%s/Library/Logs/DiagnosticReports/\", home ? home : \"/Users/Shared/Logs/DiagnosticReports/\");\n        // To do: create the directory if it doesn't already exist.\n        return requiredStrlen;\n    \n    #elif defined(OVR_OS_UNIX) || defined(OVR_OS_MAC)\n        const char* home = getenv(\"HOME\");\n        size_t requiredStrlen = OVR::OVR_snprintf(directoryPath, directoryPathCapacity, \"%s/Library/\", home ? home : \"/Users/Shared/\");\n        // To do: create the directory if it doesn't already exist.\n        return requiredStrlen;\n    #endif\n\n    return 0;\n}\n\n\n// Retrieves the name of the given thread.\n// To do: Move this to OVR_Threads.h\nbool GetThreadName(OVR::ThreadHandle threadHandle, char* threadName, size_t threadNameCapacity)\n{\n    #if defined(OVR_OS_APPLE) || defined(OVR_OS_LINUX)\n        int result = pthread_getname_np((pthread_t)threadHandle, threadName, threadNameCapacity);\n        if(result == 0)\n            return true;\n    #else\n        // This is not currently possible on Windows, as only the debugger stores the thread name. We could potentially use a vectored \n        // exception handler to catch all thread name exceptions (0x406d1388) and record them in a static list at runtime. To detect\n        // thread exit we could use WMI Win32_ThreadStopTrace. Maintain a list of thread names between these two events.\n        OVR_UNUSED(threadHandle);\n        OVR_UNUSED(threadNameCapacity);\n    #endif\n\n    if(threadNameCapacity)\n        threadName[0] = 0;\n\n    return false;\n}\n\n\nOVR::ThreadSysId ConvertThreadHandleToThreadSysId(OVR::ThreadHandle threadHandle)\n{\n    #if defined(OVR_OS_WIN64)\n        return (OVR::ThreadSysId)::GetThreadId(threadHandle); // Requires THREAD_QUERY_INFORMATION privileges.\n\n    #elif defined(OVR_OS_WIN32)\n        typedef DWORD (WINAPI *GetThreadIdFunc)(HANDLE);\n\n        static volatile bool sInitialized = false;\n        static GetThreadIdFunc spGetThreadIdFunc = nullptr;\n        static NtQueryInformationThreadFunc spNtQueryInformationThread = nullptr;\n\n        if(!sInitialized)\n        {\n            HMODULE hKernel32 = GetModuleHandleA(\"kernel32.dll\");\n            if(hKernel32)\n                spGetThreadIdFunc = (GetThreadIdFunc)(uintptr_t)GetProcAddress(hKernel32, \"GetThreadId\");\n\n            if(!spGetThreadIdFunc)\n            {\n                HMODULE hNTDLL = GetModuleHandleA(\"ntdll.dll\");\n\n                if(hNTDLL)\n                    spNtQueryInformationThread = (NtQueryInformationThreadFunc)(uintptr_t)GetProcAddress(hNTDLL, \"NtQueryInformationThread\");\n            }\n\n            sInitialized = true;\n        }\n\n        if(spGetThreadIdFunc)\n            return (OVR::ThreadSysId)spGetThreadIdFunc(threadHandle);\n\n        if(spNtQueryInformationThread)\n        {\n            THREAD_BASIC_INFORMATION tbi;\n\n            if(spNtQueryInformationThread(threadHandle, 0, &tbi, sizeof(tbi), nullptr) == 0)\n                return (OVR::ThreadSysId)tbi.UniqueThreadId;\n        }\n\n        return OVR_THREADSYSID_INVALID;\n    \n    #elif defined(OVR_OS_APPLE)\n        mach_port_t threadSysId = pthread_mach_thread_np((pthread_t)threadHandle);  // OS 10.4 and later.\n        return (ThreadSysId)threadSysId;\n\n    #elif defined(OVR_OS_LINUX)\n\n        // I believe we can usually (though not portably) intepret the pthread_t as a pointer to a struct whose first member is a lwp id.\n        OVR_UNUSED(threadHandle);\n        return OVR_THREADSYSID_INVALID;\n\n    #else\n        OVR_UNUSED(threadHandle);\n        return OVR_THREADSYSID_INVALID;\n    #endif\n}\n\n\nOVR::ThreadHandle ConvertThreadSysIdToThreadHandle(OVR::ThreadSysId threadSysId)\n{\n    #if defined(OVR_OS_MS)\n        // We currently request the given rights because that's what users of this function typically need it for. Ideally there would \n        // be a way to specify the requested rights in order to avoid the problem if we need only a subset of them but can't get it.\n        // The solution we use below to try opening with successively reduced rights will work for our uses here but isn't a good general solution to this.\n        OVR::ThreadHandle threadHandle = ::OpenThread(THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION, TRUE, (DWORD)threadSysId);\n\n        if(threadHandle == OVR_THREADHANDLE_INVALID)\n        {\n            threadHandle = ::OpenThread(THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION, TRUE, (DWORD)threadSysId);\n\n            if(threadHandle == OVR_THREADHANDLE_INVALID)\n                threadHandle = ::OpenThread(THREAD_QUERY_INFORMATION, TRUE, (DWORD)threadSysId);\n        }\n\n        return threadHandle;\n    #elif defined(OVR_OS_MAC)\n        return (ThreadHandle)pthread_from_mach_thread_np((mach_port_t)threadSysId);\n    #else\n        return (ThreadHandle)threadSysId;\n    #endif\n}\n\n\nvoid FreeThreadHandle(OVR::ThreadHandle threadHandle)\n{\n    #if defined(OVR_OS_MS)\n        if(threadHandle != OVR_THREADHANDLE_INVALID)\n            ::CloseHandle(threadHandle);\n    #else\n        OVR_UNUSED(threadHandle);\n    #endif\n}\n\n\nOVR::ThreadSysId GetCurrentThreadSysId()\n{\n    #if defined(OVR_OS_MS)\n        return ::GetCurrentThreadId();\n    #elif defined(OVR_OS_APPLE)\n        return (ThreadSysId)mach_thread_self();\n    #else\n        return (ThreadSysId)pthread_self();\n    #endif\n}\n\n\n\nstatic void GetCurrentProcessFilePath(char* appPath, size_t appPathCapacity)\n{\n    appPath[0] = 0;\n\n    #if defined(OVR_OS_MS)\n        wchar_t pathW[MAX_PATH];\n        GetModuleFileNameW(0, pathW, (DWORD)OVR_ARRAY_COUNT(pathW));\n    \n        size_t requiredUTF8Length = (size_t)OVR::UTF8Util::GetEncodeStringSize(pathW); // Returns required strlen.\n    \n        if(requiredUTF8Length < appPathCapacity)\n        {\n            OVR::UTF8Util::EncodeString(appPath, pathW, -1);\n        }\n        else\n        {\n            appPath[0] = 0;\n        }\n    \n    #elif defined(OVR_OS_APPLE)\n        struct BunderFolder\n        {\n            // Returns true if pStr ends with pFind, case insensitively.\n            // To do: Move OVR_striend to OVRKernel/Std.h\n            static bool OVR_striend(const char* pStr, const char* pFind, size_t strLength = (size_t)-1, size_t findLength = (size_t)-1)\n            {\n                if(strLength == (size_t)-1)\n                    strLength = OVR_strlen(pStr);\n                if(findLength == (size_t)-1)\n                    findLength = OVR_strlen(pFind);\n                if(strLength >= findLength)\n                    return (OVR_stricmp(pStr + strLength - findLength, pFind) == 0);\n                return false;\n            }\n            \n            static bool IsBundleFolder(const char* filePath)\n            {\n                // https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/AboutBundles/AboutBundles.html#//apple_ref/doc/uid/10000123i-CH100-SW1\n                static const char* extensionArray[] = { \".app\", \".bundle\", \".framework\", \".plugin\", \".kext\" };\n                \n                for(size_t i = 0; i < OVR_ARRAY_COUNT(extensionArray); i++)\n                {\n                    if(OVR_striend(filePath, extensionArray[i]))\n                        return true;\n                }\n                \n                return false;\n            }\n        };\n    \n        char     appPathTemp[PATH_MAX];\n        uint32_t appPathTempCapacity32 = PATH_MAX;\n        size_t   requiredStrlen = appPathCapacity;\n    \n        if(_NSGetExecutablePath(appPathTemp, &appPathTempCapacity32) == 0)\n        {\n            char appPathTempReal[PATH_MAX];\n\n            if(realpath(appPathTemp, appPathTempReal))  // If the path is a symbolic link, this converts it to the real path.\n            {\n                // To consider: Enable reading the internal bundle executable path. An application on Mac may in\n                // fact be within a file bundle, which is an private file system within a file. With Objective C\n                // we could use: [[NSWorkspace sharedWorkspace] isFilePackageAtPath:fullPath];\n                bool shouldReadTheBunderPath = false;\n                \n                if(shouldReadTheBunderPath)\n                {\n                    // We recursively call dirname() until we find .app/.bundle/.plugin as a directory name.\n                    OVR_strlcpy(appPathTemp, appPathTempReal, OVR_ARRAY_COUNT(appPathTemp));\n                    bool found = BunderFolder::IsBundleFolder(appPathTemp);\n \n                    while(!found && OVR_strcmp(appPathTemp, \".\") && OVR_strcmp(appPathTemp, \"/\"))\n                    {\n                        OVR_strlcpy(appPathTemp, dirname(appPathTemp), OVR_ARRAY_COUNT(appPathTemp));\n                        found = BunderFolder::IsBundleFolder(appPathTemp);\n                    }\n\n                    if(found) // If somewhere above we found a parent bundle container...\n                        requiredStrlen = OVR_strlcpy(appPath, appPathTemp, appPathCapacity);\n                    else\n                        requiredStrlen = OVR_strlcpy(appPath, appPathTempReal, appPathCapacity);\n                }\n                else\n                {\n                    requiredStrlen = OVR_strlcpy(appPath, appPathTempReal, appPathCapacity);\n                }\n            }\n        }\n    \n        if(requiredStrlen >= appPathCapacity)\n            appPath[0] = '\\0';\n    \n    #elif defined(OVR_OS_LINUX)\n        ssize_t length = readlink(\"/proc/self/exe\", appPath, appPathCapacity);\n    \n        if((length != -1) && ((size_t)length < (appPathCapacity - 1)))\n        {\n            appPath[length] = '\\0';\n        }\n    #endif\n}\n\n\nstatic const char* GetFileNameFromPath(const char* filePath)\n{\n    #if defined(OVR_OS_MS)\n    const char* lastPathSeparator = max(strrchr(filePath, '\\\\'), strrchr(filePath, '/')); // Microsoft APIs are inconsistent with respect to allowing / as a path separator.\n    #else\n    const char* lastPathSeparator = strrchr(filePath, '/');\n    #endif\n    \n    if(lastPathSeparator)\n        return lastPathSeparator + 1;\n    \n    return filePath;\n}\n\n\n\nstatic void FormatDateTime(char* buffer, size_t bufferCapacity, time_t timeValue, bool getDate, bool getTime, bool localDateTime, bool fileNameSafeCharacters = false)\n{\n    char      temp[128];\n    const tm* pTime = localDateTime ? localtime(&timeValue) : gmtime(&timeValue);\n    \n    if(bufferCapacity)\n        buffer[0] = 0;\n\n    if(getDate)\n    {\n        const char* format = fileNameSafeCharacters ? \"%Y-%m-%d\" : \"%Y/%m/%d\";\n        strftime(temp, OVR_ARRAY_COUNT(temp), format, pTime);\n        OVR::OVR_strlcpy(buffer, temp, bufferCapacity);\n    }\n\n    if(getTime)\n    {\n        const char* format = fileNameSafeCharacters ? \" %H.%M.%S\" : \" %H:%M:%S\";\n        strftime(temp, OVR_ARRAY_COUNT(temp), (getDate ? format : format + 1), pTime);\n        OVR::OVR_strlcat(buffer, temp, bufferCapacity);\n    }\n}\n\n\nstatic void GetOSVersionName(char* versionName, size_t versionNameCapacity)\n{\n    #if defined(OVR_OS_MS)\n        const char* name = \"unknown\";\n\n        OSVERSIONINFOEXW vi;\n        memset(&vi, 0, sizeof(vi));\n        vi.dwOSVersionInfoSize = sizeof(vi);\n\n        if(GetVersionExW((LPOSVERSIONINFOW)&vi))\n        {\n            if(vi.dwMajorVersion >= 7)\n            {\n                // Unknown recent version.\n            }\n            if(vi.dwMajorVersion >= 6)\n            {\n                if(vi.dwMinorVersion >= 4)\n                    name = \"Windows 10\";\n                else if(vi.dwMinorVersion >= 3)\n                {\n                    if(vi.wProductType == VER_NT_WORKSTATION)\n\t\t\t\t\t\tname = \"Windows 8.1\";\n\t\t\t\t\telse\n\t\t\t\t\t\tname = \"Windows Server 2012 R2\";\n                }\n                else if(vi.dwMinorVersion >= 2)\n                {\n                    if(vi.wProductType == VER_NT_WORKSTATION)\n\t\t\t\t\t\tname = \"Windows 8\";\n\t\t\t\t\telse\n\t\t\t\t\t\tname = \"Windows Server 2012\";\n                }\n                else if(vi.dwMinorVersion >= 1)\n                {\n                    if(vi.wProductType == VER_NT_WORKSTATION)\n                        name = \"Windows 7\";\n                    else\n                        name = \"Windows Server 2008 R2\";\n                }\n                else\n                {\n                    if(vi.wProductType == VER_NT_WORKSTATION)\n                        name = \"Windows Vista\";\n                    else\n                        name = \"Windows Server 2008\";\n                }\n            }\n            else if(vi.dwMajorVersion >= 5)\n            {\n                if(vi.dwMinorVersion == 0)\n                    name = \"Windows 2000\";\n                else if(vi.dwMinorVersion == 1)\n                    name = \"Windows XP\";\n                else // vi.dwMinorVersion == 2\n                {\n                    if(GetSystemMetrics(SM_SERVERR2) != 0)\n                        name = \"Windows Server 2003 R2\";\n                    else if(vi.wSuiteMask & VER_SUITE_WH_SERVER)\n                        name = \"Windows Home Server\";\n                    if(GetSystemMetrics(SM_SERVERR2) == 0)\n                        name = \"Windows Server 2003\";\n                    else\n                        name = \"Windows XP Professional x64 Edition\";\n                }\n            }\n            else\n                name = \"Windows 98 or earlier\";\n        }\n\n        OVR_strlcpy(versionName, name, versionNameCapacity);\n\n    #elif defined(OVR_OS_UNIX) || defined(OVR_OS_APPLE)\n        utsname utsName;\n        memset(&utsName, 0, sizeof(utsName));\n\n        if(uname(&utsName) == 0)\n            OVR_snprintf(versionName, versionNameCapacity, \"%s %s %s %s\", utsName.sysname, utsName.release, utsName.version, utsName.machine);\n        else\n            OVR_snprintf(versionName, versionNameCapacity, \"Unix\");\n    #endif\n}\n\n\n\n\nvoid CreateException(CreateExceptionType exceptionType)\n{\n    char buffer[1024] = {};\n\n    switch(exceptionType)\n    {\n        case kCETAccessViolation:\n        {\n            int* pNullPtr = reinterpret_cast<int*>((rand() / 2) / RAND_MAX);\n            pNullPtr[0] = 0;    // This line should generate an exception.\n            sprintf(buffer, \"%p\", pNullPtr);\n            break;\n        }\n\n        case kCETDivideByZero:\n        {\n            int smallValue = 1;\n            int largeValue = (1000 * exceptionType);\n            int divByZero = (smallValue / largeValue); // This line should generate a div/0 exception.\n            sprintf(buffer, \"%d\", divByZero);\n            break;\n        }\n\n        case kCETIllegalInstruction:\n        {\n            #if defined(OVR_CPU_X86) || (defined(OVR_CPU_X86_64) && !defined(OVR_CC_MSVC)) // (if x86) or (if x64 and any computer but VC++)...\n                #if defined(OVR_CC_MSVC)\n                    __asm ud2\n                #else // e.g. GCC\n                    asm volatile(\"ud2\");\n                #endif\n\n            #elif defined(OVR_CPU_X86_64) && (defined(OVR_OS_MS) && defined(PAGE_EXECUTE_READWRITE))\n                // VC++ for x64 doesn't support inline asm.\n                void*   pVoid          = _AddressOfReturnAddress();\n                void**  ppVoid         = reinterpret_cast<void**>(pVoid);\n                void*   pReturnAddress = *ppVoid;\n                DWORD   dwProtectPrev  = 0;\n\n                if(VirtualProtect(pReturnAddress, 2, PAGE_EXECUTE_READWRITE, &dwProtectPrev)) // If we can set the memory to be executable...\n                {\n                    // Modify the code we return to.\n                    uint8_t asm_ud2[] = { 0x0f, 0x0b };\n                    memcpy(pReturnAddress, asm_ud2, sizeof(asm_ud2));\n                    VirtualProtect(pReturnAddress, 2, dwProtectPrev, &dwProtectPrev);\n                }\n                else\n                {\n                    // To do: Fix this.\n                }\n\n            #else\n                // To do: Fix this.\n            #endif\n\n            break;\n        }\n\n        case kCETStackCorruption:\n        {\n            size_t size = (sizeof(buffer) * 16) - (rand() % 16);\n            char*  pOutsizeStack = buffer - ((sizeof(buffer) * 16) + (rand() % 16));\n\n            memset(buffer, 0, size); \n            memset(pOutsizeStack, 0, size); // This line should generate an exception, or an exception will be generated upon return from this function.\n            break;\n        }\n\n        case kCETStackOverflow:\n        {\n            CreateException(exceptionType);             // Call ourselves recursively. This line should generate a div/0 exception.\n            sprintf(buffer, \"%d\", exceptionType);\n            break;\n        }\n\n        case kCETAlignment:\n        {\n            // Not all platforms generate alignment exceptions. Some internally handle it.\n            void*     pAligned      = malloc(16);\n            char*     pMisaligned   = (char*)pAligned + 1;\n            uint64_t* pMisaligned64 = reinterpret_cast<uint64_t*>(pMisaligned);\n\n            *pMisaligned64 = 0; // This line should generate an exception.\n            free(pAligned);\n            break;\n        }\n\n        case kCETFPU:\n            // Platforms usually have FPU exceptions disabled. In order to test FPU exceptions we will need to at least\n            // temporarily disable them before executing code here to generate such exceptions.\n            // To do.\n            break;\n\n        case kCETTrap:\n            // To do. This is hardware-specific.\n            break;\n    }\n}\n\n\n\n\n#if defined(OVR_OS_MS)\n    typedef BOOL    (WINAPI * StackWalk64Type)(DWORD MachineType, HANDLE hProcess, HANDLE hThread, LPSTACKFRAME64 StackFrame, PVOID ContextRecord, PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress);\n    typedef PVOID   (WINAPI * SymFunctionTableAccess64Type)(HANDLE hProcess, DWORD64 dwAddr);\n    typedef DWORD64 (WINAPI * SymGetModuleBase64Type)(HANDLE hProcess, DWORD64 dwAddr);\n    typedef DWORD   (WINAPI * SymSetOptionsType)(DWORD SymOptions);\n    typedef BOOL    (WINAPI * SymInitializeWType)(HANDLE hProcess, PCWSTR UserSearchPath, BOOL fInvadeProcess);\n    typedef BOOL    (WINAPI * SymCleanupType)(HANDLE hProcess);\n    typedef DWORD64 (WINAPI * SymLoadModule64Type)(HANDLE hProcess, HANDLE hFile, PCSTR ImageName, PCSTR ModuleName, DWORD64 BaseOfDll, DWORD SizeOfDll);\n    typedef BOOL    (WINAPI * SymFromAddrType)(HANDLE hProcess, DWORD64 Address, PDWORD64 Displacement, PSYMBOL_INFO Symbol);\n    typedef BOOL    (WINAPI * SymGetLineFromAddr64Type)(HANDLE hProcess, DWORD64 qwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINE64 Line64);\n\n    StackWalk64Type              pStackWalk64;\n    SymFunctionTableAccess64Type pSymFunctionTableAccess64;\n    SymGetModuleBase64Type       pSymGetModuleBase64;\n    SymSetOptionsType            pSymSetOptions;\n    SymInitializeWType           pSymInitializeW;\n    SymCleanupType               pSymCleanup;\n    SymLoadModule64Type          pSymLoadModule64;\n    SymFromAddrType              pSymFromAddr;\n    SymGetLineFromAddr64Type     pSymGetLineFromAddr64;\n#endif\n\n\n\nSymbolLookup::SymbolLookup()\n  : initialized(false),\n    allowMemoryAllocation(true),\n    moduleListUpdated(false),\n    moduleInfoArray(),\n    moduleInfoArraySize(0)\n{\n}\n\nSymbolLookup::~SymbolLookup()\n{\n    Shutdown();\n}\n\nvoid SymbolLookup::AddSourceCodeDirectory(const char* pDirectory)\n{\n    OVR_UNUSED(pDirectory);\n}\n\nbool SymbolLookup::Initialize()\n{\n    if(!initialized)\n    {\n        #if defined(OVR_OS_MS)\n            // http://msdn.microsoft.com/en-us/library/windows/desktop/ms679294%28v=vs.85%29.aspx\n            HANDLE  hProcess = GetCurrentProcess();\n            HMODULE hDbgHelp = LoadLibraryW(L\"DbgHelp.dll\"); // It's best if the application supplies a recent version of this.\n\n            if(hDbgHelp)\n            {\n                pStackWalk64              = (StackWalk64Type)(uintptr_t)::GetProcAddress(hDbgHelp, \"StackWalk64\");\n                pSymFunctionTableAccess64 = (SymFunctionTableAccess64Type)(uintptr_t)::GetProcAddress(hDbgHelp, \"SymFunctionTableAccess64\");\n                pSymGetModuleBase64       = (SymGetModuleBase64Type)(uintptr_t)::GetProcAddress(hDbgHelp, \"SymGetModuleBase64\");\n                pSymSetOptions            = (SymSetOptionsType)(uintptr_t)::GetProcAddress(hDbgHelp, \"SymSetOptions\");\n                pSymInitializeW           = (SymInitializeWType)(uintptr_t)::GetProcAddress(hDbgHelp, \"SymInitializeW\");\n                pSymCleanup               = (SymCleanupType)(uintptr_t)::GetProcAddress(hDbgHelp, \"SymCleanup\");\n                pSymLoadModule64          = (SymLoadModule64Type)(uintptr_t)::GetProcAddress(hDbgHelp, \"SymLoadModule64\");\n                pSymFromAddr              = (SymFromAddrType)(uintptr_t)::GetProcAddress(hDbgHelp, \"SymFromAddr\");\n                pSymGetLineFromAddr64     = (SymGetLineFromAddr64Type)(uintptr_t)::GetProcAddress(hDbgHelp, \"SymGetLineFromAddr64\");\n            }\n\n            pSymSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS);\n\n            // To consider: Use a manually created search path:\n            // wchar_t searchPathW[4096]; // Semicolon-separated strings.\n            //     The current working directory of the application.\n            //     The directory of the application itself (GetModuleFileName).\n            //     The _NT_SYMBOL_PATH environment variable.\n            //     The _NT_ALTERNATE_SYMBOL_PATH environment variable.\n\n            if(pSymInitializeW(hProcess, nullptr /*searchPathW*/, FALSE))\n            {\n                initialized = true;\n            }\n        #endif\n    }\n\n    return true;\n}\n\nvoid SymbolLookup::Shutdown()\n{\n    if(initialized)\n    {\n        initialized = false;\n\n        #if defined(OVR_OS_MS)\n            HANDLE hProcess = GetCurrentProcess();\n\n            // SymCleanup should handle this for us.\n            //if(moduleListUpdated)\n            //{\n            //    for(size_t i = 0; i < moduleInfoArraySize; i++)\n            //        pSymUnloadModule64(hProcess, moduleInfoArray[i].baseAddress);\n            //}\n\n            moduleInfoArraySize = 0;\n\n            pSymCleanup(hProcess);\n        #endif\n    }\n}\n\n\nvoid SymbolLookup::EnableMemoryAllocation(bool enabled)\n{\n    allowMemoryAllocation = enabled;\n}\n\n\nOVR_DISABLE_MSVC_WARNING(4740) // flow in or out of inline asm code suppresses global optimization\nOVR_DISABLE_MSVC_WARNING(4748) // /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function\n\n\nsize_t SymbolLookup::GetBacktrace(void* addressArray[], size_t addressArrayCapacity, size_t skipCount, void* platformThreadContext, OVR::ThreadSysId threadSysIdHelp)\n{\n    #if defined(OVR_OS_WIN64) || (defined(OVR_OS_MS) && defined(OVR_OS_CONSOLE))\n        OVR_UNUSED(threadSysIdHelp);\n    \n        if(platformThreadContext == nullptr)\n            return RtlCaptureStackBackTrace(1, (ULONG)addressArrayCapacity, addressArray, nullptr);\n\n        // We need to get the call stack of another thread.\n        size_t            frameIndex = 0;\n        CONTEXT           context;\n        PRUNTIME_FUNCTION pRuntimeFunction;\n        ULONG64           imageBase = 0;\n        ULONG64           imageBasePrev = 0;\n\n        memcpy(&context, (CONTEXT*)platformThreadContext, sizeof(CONTEXT));\n        context.ContextFlags = CONTEXT_CONTROL;\n\n        if(context.Rip && (frameIndex < addressArrayCapacity))\n            addressArray[frameIndex++] = (void*)(uintptr_t)context.Rip;\n\n        while(context.Rip && (frameIndex < addressArrayCapacity))\n        {\n            imageBasePrev = imageBase;\n            pRuntimeFunction = (PRUNTIME_FUNCTION)RtlLookupFunctionEntry(context.Rip, &imageBase, nullptr);\n\n            if(pRuntimeFunction)\n            {\n                VOID*   handlerData = nullptr;\n                ULONG64 establisherFramePointers[2] = { 0, 0 };\n                RtlVirtualUnwind(UNW_FLAG_NHANDLER, imageBase, context.Rip, pRuntimeFunction, &context, &handlerData,  establisherFramePointers, nullptr);                        \n            }\n            else\n            {\n                context.Rip  = (ULONG64)(*(PULONG64)context.Rsp);\n                context.Rsp += 8;\n            }\n\n            if(context.Rip && (frameIndex < addressArrayCapacity))\n            {\n                if(skipCount)\n                    --skipCount;\n                else\n                    addressArray[frameIndex++] = (void*)(uintptr_t)context.Rip;\n            }\n        }\n\n        return frameIndex;\n\n    #elif defined(OVR_OS_WIN32)\n        OVR_UNUSED(threadSysIdHelp);\n    \n        size_t frameIndex = 0;\n\n        if(pStackWalk64)\n        {\n            CONTEXT context;\n\n            if(platformThreadContext)\n            {\n                memcpy(&context, platformThreadContext, sizeof(context));\n                context.ContextFlags = CONTEXT_CONTROL;\n            }\n            else\n            {\n                memset(&context, 0, sizeof(context));\n                context.ContextFlags = CONTEXT_CONTROL;\n\n                __asm {\n                    mov context.Ebp, EBP\n                    mov context.Esp, ESP\n                    call GetEIP\n                    GetEIP:\n                    pop context.Eip\n                }\n            }\n\n            STACKFRAME64 sf;\n            memset(&sf, 0, sizeof(sf));\n            sf.AddrPC.Offset     = context.Eip;\n            sf.AddrPC.Mode       = AddrModeFlat;\n            sf.AddrStack.Offset  = context.Esp;\n            sf.AddrStack.Mode    = AddrModeFlat;\n            sf.AddrFrame.Offset  = context.Ebp;\n            sf.AddrFrame.Mode    = AddrModeFlat;\n\n            const HANDLE hCurrentProcess = ::GetCurrentProcess();\n            const HANDLE hCurrentThread  = ::GetCurrentThread();\n\n            if(!platformThreadContext) // If we are reading the current thread's call stack then we ignore this current function.\n                skipCount++;\n\n            while(frameIndex < addressArrayCapacity)\n            {\n                if(!pStackWalk64(IMAGE_FILE_MACHINE_I386, hCurrentProcess, hCurrentThread, &sf, &context, nullptr, pSymFunctionTableAccess64, pSymGetModuleBase64, nullptr))\n                    break;\n\n                if(sf.AddrFrame.Offset == 0)\n                    break;\n\n                if(skipCount)\n                    --skipCount;\n                else\n                    addressArray[frameIndex++] = ((void*)(uintptr_t)sf.AddrPC.Offset);\n            }\n        }\n\n        return frameIndex;\n\n    #elif defined(OVR_OS_APPLE)\n        struct StackFrame\n        {\n            StackFrame* pParentStackFrame;\n            void*       pReturnPC;\n        };\n        \n        void*       pInstruction;\n        StackFrame* pStackFrame;\n        size_t      frameIndex = 0;\n\n        if(platformThreadContext)\n        {\n            #if defined(OVR_CPU_ARM)\n                arm_thread_state_t* pThreadState = (arm_thread_state_t*)platformThreadContext;\n                pStackFrame  = (StackFrame*)pThreadState->__fp;\n                pInstruction = (void*)      pThreadState->__pc;\n                #define FrameIsAligned(pStackFrame) ((((uintptr_t)pStackFrame) & 0x1) == 0)\n            #elif defined(OVR_CPU_X86_64)\n                x86_thread_state_t* pThreadState = (x86_thread_state_t*)platformThreadContext;\n                pInstruction = (void*)      pThreadState->uts.ts64.__rip;\n                pStackFrame  = (StackFrame*)pThreadState->uts.ts64.__rbp;\n                #define FrameIsAligned(pStackFrame) ((((uintptr_t)pStackFrame) & 0xf) == 0)\n            #elif defined(OVR_CPU_X86)\n                x86_thread_state_t* pThreadState = (x86_thread_state_t*)platformThreadContext;\n                pInstruction = (void*)      pThreadState->uts.ts32.__eip;\n                pStackFrame  = (StackFrame*)pThreadState->uts.ts32.__ebp;\n                #define FrameIsAligned(pStackFrame) ((((uintptr_t)pStackFrame) & 0xf) == 8)\n            #endif\n\n            if(frameIndex < addressArrayCapacity)\n                addressArray[frameIndex++] = pInstruction;\n        }\n        else // Else get the current values...\n        {\n            pStackFrame = (StackFrame*)__builtin_frame_address(0);\n            GetInstructionPointer(pInstruction);\n        }\n\n        pthread_t   threadSelf         = pthread_self();\n        void*       pCurrentStackBase  = pthread_get_stackaddr_np(threadSelf);\n        void*       pCurrentStackLimit = (void*)((uintptr_t)pCurrentStackBase - pthread_get_stacksize_np(threadSelf));\n        bool        threadIsCurrent    = (platformThreadContext == nullptr) || (((void*)pStackFrame > pCurrentStackLimit) && ((void*)pStackFrame <= pCurrentStackBase));\n        StackFrame* pStackBase;\n        StackFrame* pStackLimit;\n    \n        if(threadIsCurrent)\n        {\n            pStackBase  = (StackFrame*)pCurrentStackBase;\n            pStackLimit = (StackFrame*)pCurrentStackLimit;\n        }\n        else if(threadSysIdHelp)\n        {\n            pthread_t threadHandle = pthread_from_mach_thread_np((mach_port_t)threadSysIdHelp);\n            pStackBase  = (StackFrame*)pthread_get_stackaddr_np(threadHandle);\n            pStackLimit = (StackFrame*)((uintptr_t)pStackBase - pthread_get_stacksize_np(threadHandle));\n        }\n        else\n        {   // We guess what the limits are.\n            pStackBase  = pStackFrame + ((384 * 1024) / sizeof(StackFrame));\n            pStackLimit = pStackFrame - ((384 * 1024) / sizeof(StackFrame));\n        }\n\n        if((frameIndex < addressArrayCapacity) && pStackFrame && FrameIsAligned(pStackFrame))\n        {\n            addressArray[frameIndex++] = pStackFrame->pReturnPC;\n\n            while(pStackFrame && pStackFrame->pReturnPC && (frameIndex < addressArrayCapacity))\n            {\n                pStackFrame = pStackFrame->pParentStackFrame;\n\n                if(pStackFrame && FrameIsAligned(pStackFrame) && pStackFrame->pReturnPC && (pStackFrame > pStackLimit) && (pStackFrame < pStackBase))\n                {\n                    if(skipCount)\n                        --skipCount;\n                    else\n                        addressArray[frameIndex++] = pStackFrame->pReturnPC;\n                }\n                else\n                    break;\n            }\n        }\n\n        return frameIndex;\n\n    #elif defined(OVR_OS_LINUX) && (defined( __LIBUNWIND__) || defined(LIBUNWIND_AVAIL))\n        // Libunwind-based solution. Requires installation of libunwind package.\n        // Libunwind isn't always safe for threads that are in signal handlers.\n        // An approach to get the callstack of another thread is to use signal injection into the target thread.\n    \n        OVR_UNUSED(platformThreadContext);\n        OVR_UNUSED(threadSysIdHelp);\n    \n        size_t        frameIndex = 0;\n        unw_cursor_t  cursor;\n        unw_context_t uc;\n        unw_word_t    ip, sp;\n\n        unw_getcontext(&uc);            // This gets the current thread's context. We could alternatively initialize another thread's context with it.\n        unw_init_local(&cursor, &uc);\n    \n        while((unw_step(&cursor) > 0) && (frameIndex < addressArrayCapacity))\n        {\n            // We can get the function name here too on some platforms with unw_get_proc_info() and unw_get_proc_name().\n            \n            if(skipCount)\n                --skipCount;\n            else\n            {\n                unw_get_reg(&cursor, UNW_REG_IP, &ip);\n                addressArray[frameIndex++] = (void*)ip;\n            }\n        }\n    \n        return frameIndex;\n\t#else\n        OVR_UNUSED(addressArray);\n        OVR_UNUSED(addressArrayCapacity);\n        OVR_UNUSED(skipCount);\n        OVR_UNUSED(platformThreadContext);\n        OVR_UNUSED(threadSysIdHelp);\n\n        return 0;\n    #endif\n}\n\n\nsize_t SymbolLookup::GetBacktraceFromThreadHandle(void* addressArray[], size_t addressArrayCapacity, size_t skipCount, OVR::ThreadHandle threadHandle)\n{\n    #if defined(OVR_OS_MS)\n        size_t count = 0;\n        DWORD  threadSysId = (DWORD)ConvertThreadHandleToThreadSysId(threadHandle);\n\n        // Compare to 0, compare to the self 'pseudohandle' and compare to the self id.\n        if((threadHandle == OVR_THREADHANDLE_INVALID) || (threadHandle == ::GetCurrentThread()) || (threadSysId == ::GetCurrentThreadId())) // If threadSysId refers to the current thread...\n            return GetBacktrace(addressArray, addressArrayCapacity, skipCount, nullptr);\n\n        // We are working with another thread. We need to suspend it and get its CONTEXT.\n        // Suspending other threads is risky, as they may be in some state that cannot be safely blocked.\n        BOOL  result = false;\n        DWORD suspendResult = ::SuspendThread(threadHandle); // Requires that the handle have THREAD_SUSPEND_RESUME rights.\n\n        if(suspendResult != (DWORD)-1) // Returns previous suspend count, or -1 if failed.\n        {\n            CONTEXT context;\n            context.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER; // Requires that the handle have THREAD_GET_CONTEXT rights.\n            result = ::GetThreadContext(threadHandle, &context);\n            count = GetBacktrace(addressArray, addressArrayCapacity, skipCount, &context);\n            suspendResult = ::ResumeThread(threadHandle);\n            OVR_ASSERT_AND_UNUSED(suspendResult != (DWORD)-1, suspendResult);\n        }\n\n        return count;\n\n    #elif defined(OVR_OS_APPLE)\n        mach_port_t threadSysID = pthread_mach_thread_np((pthread_t)threadHandle); // Convert pthread_t to mach thread id.\n        return GetBacktraceFromThreadSysId(addressArray, addressArrayCapacity, skipCount, (OVR::ThreadSysId)threadSysID);\n        \n    #elif defined(OVR_OS_LINUX)\n        // To do.\n        OVR_UNUSED(addressArray);\n        OVR_UNUSED(addressArrayCapacity);\n        OVR_UNUSED(skipCount);\n        OVR_UNUSED(threadHandle);\n        return 0;\n    #endif\n}\n\n\nsize_t SymbolLookup::GetBacktraceFromThreadSysId(void* addressArray[], size_t addressArrayCapacity, size_t skipCount, OVR::ThreadSysId threadSysId)\n{\n    #if defined(OVR_OS_MS)\n        OVR::ThreadHandle threadHandle = ConvertThreadSysIdToThreadHandle(threadSysId);\n        if(threadHandle)\n        {\n            size_t count = GetBacktraceFromThreadHandle(addressArray, addressArrayCapacity, skipCount, threadHandle);\n            FreeThreadHandle(threadHandle);\n            return count;\n        }\n        return 0;\n\n    #elif defined(OVR_OS_APPLE)\n        mach_port_t threadCurrent = pthread_mach_thread_np(pthread_self());\n        mach_port_t thread = (mach_port_t)threadSysId;\n    \n        if(thread == threadCurrent)\n        {\n            return GetBacktrace(addressArray, addressArrayCapacity, skipCount, nullptr);\n        }\n        else\n        {\n            kern_return_t result = thread_suspend(thread);    // Do we need to do this if it's an thread who exception is being handled?\n            size_t        count  = 0;\n\n            if(result == KERN_SUCCESS)\n            {\n                #if defined(OVR_CPU_X86) || defined(OVR_CPU_X86_64)\n                    x86_thread_state_t threadState;\n                #elif defined(OVR_CPU_ARM)\n                    arm_thread_state_t threadState;\n                #endif\n                mach_msg_type_number_t stateCount = MACHINE_THREAD_STATE_COUNT;\n\n                result = thread_get_state(thread, MACHINE_THREAD_STATE, (natural_t*)(uintptr_t)&threadState, &stateCount);\n\n                if(result == KERN_SUCCESS)\n                    count = GetBacktrace(addressArray, addressArrayCapacity, skipCount, &threadState, threadSysId);\n\n                thread_resume(thread);\n                \n                return count;\n            }\n        }\n    \n        return 0;\n    \n    #elif defined(OVR_OS_LINUX)\n        // To do.\n        OVR_UNUSED(addressArray);\n        OVR_UNUSED(addressArrayCapacity);\n        OVR_UNUSED(skipCount);\n        OVR_UNUSED(threadSysId);\n        return 0;\n    #endif\n}\n\n\n// We need to return the required moduleInfoArrayCapacity.\nsize_t SymbolLookup::GetModuleInfoArray(ModuleInfo* pModuleInfoArray, size_t moduleInfoArrayCapacity)\n{\n    #if defined(OVR_OS_MS)\n        size_t       moduleCountRequired = 0;         // The count we would copy to pModuleInfoArray if moduleInfoArrayCapacity was enough.\n        size_t       moduleCount = 0;                 // The count we actually copy to pModuleInfoArray. Will be <= moduleInfoArrayCapacity.\n        HANDLE       hProcess = GetCurrentProcess();\n        HMODULE      hModuleArray[200];\n        DWORD        cbNeeded = 0;\n        MODULEINFO   mi;\n\n        if(EnumProcessModules(hProcess, hModuleArray, sizeof(hModuleArray), &cbNeeded))\n        {\n            moduleCountRequired = ((cbNeeded / sizeof(HMODULE)) < OVR_ARRAY_COUNT(hModuleArray)) ? (cbNeeded / sizeof(HMODULE)) : OVR_ARRAY_COUNT(hModuleArray);\n            moduleCount         = MIN(moduleCountRequired, OVR_ARRAY_COUNT(hModuleArray));\n            moduleCount         = MIN(moduleCount, moduleInfoArrayCapacity);\n\n            for(size_t i = 0; i < moduleCount; i++)\n            {\n                ModuleInfo& moduleInfo = pModuleInfoArray[i];\n\n                memset(&mi, 0, sizeof(mi));\n                BOOL result = GetModuleInformation(hProcess, hModuleArray[i], &mi, sizeof(mi));\n\n                if(result)\n                {\n                    wchar_t pathW[MAX_PATH];\n                    char    pathA[MAX_PATH * 3]; // *3 to handle UTF8 multibyte encoding.\n\n                    moduleInfo.handle      = hModuleArray[i];\n                    moduleInfo.baseAddress = (uintptr_t)mi.lpBaseOfDll;\n                    moduleInfo.size        = mi.SizeOfImage;\n\n                    GetModuleFileNameW(hModuleArray[i], pathW, OVR_ARRAY_COUNT(pathW));\n                    OVR::UTF8Util::EncodeString(pathA, pathW, -1); // Problem: DecodeString provides no way to specify the destination capacity.\n                    OVR::OVR_strlcpy(moduleInfo.filePath, pathA, OVR_ARRAY_COUNT(moduleInfo.filePath));\n\n                    const char* fileName = GetFileNameFromPath(pathA);\n                    OVR::OVR_strlcpy(moduleInfo.name, fileName, OVR_ARRAY_COUNT(moduleInfo.name));\n                }\n                else\n                {\n                    moduleInfo.handle = 0;\n                    moduleInfo.baseAddress = 0;\n                    moduleInfo.size = 0;\n                    moduleInfo.filePath[0] = 0;\n                    moduleInfo.name[0] = 0;\n                }\n            }\n        }\n\n        return moduleCountRequired;\n    \n    #elif defined(OVR_OS_MAC)\n        size_t moduleCountRequired = 0;\n        size_t moduleCount = 0;\n    \n        struct MacModuleInfo // This struct exists solely so we can have a local function within this function..\n        {\n            static void AddMacModuleInfo(ModuleInfo* pModuleInfoArrayL, size_t& moduleCountRequiredL, size_t& moduleCountL, size_t moduleInfoArrayCapacityL,\n                                        const char* pTypeFilterL, const char* pModulePath, uintptr_t currentSegmentPos, const MachHeader* pMachHeader, uint64_t offset)\n            {\n                for(size_t i = 0; i < pMachHeader->ncmds; i++)\n                {\n                    const SegmentCommand* pSegmentCommand = reinterpret_cast<const SegmentCommand*>(currentSegmentPos);\n                    \n                    if(pSegmentCommand->cmd == kLCSegment)\n                    {\n                        const size_t segnameSize = (sizeof(pSegmentCommand->segname) + 1); // +1 so we can have a trailing '\\0'.\n                        char segname[segnameSize];\n                        \n                        memcpy(segname, pSegmentCommand->segname, sizeof(pSegmentCommand->segname));\n                        segname[segnameSize - 1] = '\\0';\n                        \n                        if(!pTypeFilterL || OVR_strncmp(segname, pTypeFilterL, sizeof(segname)))\n                        {\n                            moduleCountRequiredL++;\n                            \n                            if(moduleCountL < moduleInfoArrayCapacityL)\n                            {\n                                ModuleInfo& info = pModuleInfoArrayL[moduleCountL++];\n                                \n                                info.baseAddress = (uint64_t)(pSegmentCommand->vmaddr + offset);\n                                info.handle      = reinterpret_cast<ModuleHandle>((uintptr_t)info.baseAddress);\n                                info.size        = (uint64_t)pSegmentCommand->vmsize;\n                                OVR_strlcpy(info.filePath, pModulePath, OVR_ARRAY_COUNT(info.filePath));\n                                OVR_strlcpy(info.name, GetFileNameFromPath(pModulePath), OVR_ARRAY_COUNT(info.name));\n                                \n                                info.permissions[0] = (pSegmentCommand->initprot & VM_PROT_READ)    ? 'r' : '-';\n                                info.permissions[1] = (pSegmentCommand->initprot & VM_PROT_WRITE)   ? 'w' : '-';\n                                info.permissions[2] = (pSegmentCommand->initprot & VM_PROT_EXECUTE) ? 'x' : '-';\n                                info.permissions[3] = '/';\n                                info.permissions[4] = (pSegmentCommand->maxprot  & VM_PROT_READ)    ? 'r' : '-';\n                                info.permissions[5] = (pSegmentCommand->maxprot  & VM_PROT_WRITE)   ? 'w' : '-';\n                                info.permissions[6] = (pSegmentCommand->maxprot  & VM_PROT_EXECUTE) ? 'x' : '-';\n                                info.permissions[7] = '\\0';\n                                \n                                OVR_strlcpy(info.type, pSegmentCommand->segname, OVR_ARRAY_COUNT(info.type));\n                            }\n                        }\n                    }\n                    \n                    currentSegmentPos += pSegmentCommand->cmdsize;\n                }\n            }\n        };\n\n        // Iterate dyld_all_image_infos->infoArray\n        const struct dyld_all_image_infos* pAllImageInfos = _dyld_get_all_image_infos();\n        \n        for(uint32_t i = 0; i < pAllImageInfos->infoArrayCount; i++)\n        {\n            const char* pModulePath = pAllImageInfos->infoArray[i].imageFilePath;\n            \n            if(pModulePath && *pModulePath)\n            {\n                uintptr_t         currentSegmentPos = (uintptr_t)pAllImageInfos->infoArray[i].imageLoadAddress;\n                const MachHeader* pMachHeader       = reinterpret_cast<const MachHeader*>(currentSegmentPos);\n                uint64_t          offset            = (uint64_t)_dyld_get_image_vmaddr_slide(i);\n\n                currentSegmentPos += sizeof(*pMachHeader);\n\n                MacModuleInfo::AddMacModuleInfo(pModuleInfoArray, moduleCountRequired, moduleCount, moduleInfoArrayCapacity,\n                                                nullptr /*\"__TEXT\"*/, pModulePath, currentSegmentPos, pMachHeader, offset);\n            }\n        }\n\n        // In addition to iterating dyld_all_image_infos->infoArray we need to also iterate /usr/lib/dyld entries.\n        const MachHeader* pMachHeader = (const MachHeader*)pAllImageInfos->dyldImageLoadAddress;\n        uintptr_t         currentSegmentPos = (uintptr_t)pMachHeader + sizeof(*pMachHeader);\n        char              modulePath[OVR_MAX_PATH] = \"\";\n        pid_t             pid = getpid();\n        int               filenameLen = proc_regionfilename((int)pid, currentSegmentPos, modulePath, (uint32_t)sizeof(modulePath));\n    \n        if(filenameLen > 0)\n            MacModuleInfo::AddMacModuleInfo(pModuleInfoArray, moduleCountRequired, moduleCount, moduleInfoArrayCapacity,\n                                                \"__TEXT\", modulePath, currentSegmentPos, pMachHeader, 0);\n\n        return moduleCountRequired;\n    \n    #elif defined(EA_PLATFORM_LINUX)\n        // One approach is to read /proc/self/maps, which is supported by Linux (though not BSD).\n        // Linux glibc dladdr() can tell us what module an arbitrary function address comes from, but can't tell us the list of modules.\n        OVR_UNUSED(pModuleInfoArray);\n        OVR_UNUSED(moduleInfoArrayCapacity);\n        return 0;\n\n    #else\n        OVR_UNUSED(pModuleInfoArray);\n        OVR_UNUSED(moduleInfoArrayCapacity);\n        return 0;\n    #endif\n}\n\n\nsize_t SymbolLookup::GetThreadList(ThreadHandle* threadHandleArray, ThreadSysId* threadSysIdArray, size_t threadArrayCapacity)\n{\n    size_t countRequired = 0;\n    size_t count = 0;\n\n    #if defined(OVR_OS_MS)\n        // Print a list of threads.\n        DWORD  currentProcessId = GetCurrentProcessId();\n        HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, currentProcessId); // ICreateToolhelp32Snapshot actually ignores currentProcessId.\n\n        if(hThreadSnap != INVALID_HANDLE_VALUE) \n        {\n            THREADENTRY32 te32;\n            te32.dwSize = sizeof(THREADENTRY32); \n\n            if(Thread32First(hThreadSnap, &te32)) \n            {\n                do\n                {\n                    if(te32.th32OwnerProcessID == currentProcessId)\n                    {\n                        HANDLE hThread = ConvertThreadSysIdToThreadHandle(te32.th32ThreadID);\n\n                        if(hThread)\n                        {\n                            ++countRequired;\n\n                            if((threadHandleArray || threadSysIdArray) && (count < threadArrayCapacity))\n                            {\n                                if(threadHandleArray)\n                                    threadHandleArray[count] = hThread; // The caller must call CloseHandle on this thread, or call DoneThreadList on the returned array.\n                                if(threadSysIdArray)\n                                    threadSysIdArray[count] = ConvertThreadHandleToThreadSysId(hThread);\n                                ++count;\n                            }\n\n                            if(!threadHandleArray) // If we aren't giving this back to the user...\n                                FreeThreadHandle(hThread);\n                        }\n                    }\n                } while(Thread32Next(hThreadSnap, &te32));\n            }\n            \n            CloseHandle(hThreadSnap);\n        }\n\n    #elif defined(OVR_OS_APPLE)\n        mach_port_t             taskSelf   = mach_task_self();\n        thread_act_port_array_t threadArray;\n        mach_msg_type_number_t  threadCount;\n        \n        kern_return_t result = task_threads(taskSelf, &threadArray, &threadCount);\n        \n        if(result == KERN_SUCCESS)\n        {\n            for(mach_msg_type_number_t i = 0; i < threadCount; i++)\n            {\n                ++countRequired;\n\n                if((threadHandleArray || threadSysIdArray) && (count < threadArrayCapacity))\n                {\n                    if(threadHandleArray)\n                        threadHandleArray[count] = pthread_from_mach_thread_np(threadArray[i]);\n                    if(threadSysIdArray)\n                        threadSysIdArray[count] = threadArray[i];\n                    ++count;\n                }\n            }\n            \n            vm_deallocate(taskSelf, (vm_address_t)threadArray, threadCount * sizeof(thread_act_t));\n        }\n\n    #elif defined(OVR_OS_LINUX)\n        // To do.\n        OVR_UNUSED(count);\n        OVR_UNUSED(threadHandleArray);\n        OVR_UNUSED(threadSysIdArray);\n        OVR_UNUSED(threadArrayCapacity);\n    #endif\n\n    return countRequired;\n}\n\n\nvoid SymbolLookup::DoneThreadList(ThreadHandle* threadHandleArray, ThreadSysId* threadSysIdArray, size_t threadArrayCount)\n{\n    #if defined(OVR_OS_MS)\n        for(size_t i = 0; i != threadArrayCount; ++i)\n        {\n            if(threadHandleArray[i])\n            {\n                CloseHandle(threadHandleArray[i]);\n                threadHandleArray[i] = OVR_THREADHANDLE_INVALID;\n            }\n        }\n\n        OVR_UNUSED(threadSysIdArray);\n    #else\n        OVR_UNUSED(threadHandleArray);\n        OVR_UNUSED(threadSysIdArray);\n        OVR_UNUSED(threadArrayCount);\n    #endif\n}\n\n\n// Writes a given thread's callstack wity symbols to the given output.\n// It may not be safe to call this from an exception handler, as sOutput allocates memory.\nbool SymbolLookup::ReportThreadCallstack(OVR::String& sOutput, size_t skipCount, ThreadSysId threadSysId)\n{\n    if(!threadSysId)\n        threadSysId = GetCurrentThreadSysId();\n\n    void*  addressArray[64];\n    size_t addressCount = GetBacktraceFromThreadSysId(addressArray, OVR_ARRAY_COUNT(addressArray), skipCount, threadSysId);\n\n    // Print the header\n    char         headerBuffer[256];\n    char         threadName[32];\n    char         threadHandleStr[24];\n    char         threadSysIdStr[24];\n    char         stackBaseStr[24];\n    char         stackLimitStr[24];\n    void*        pStackBase;\n    void*        pStackLimit;\n  //void*        pStackCurrent;  // Current stack pointer. To do: support reporting this.\n    ThreadHandle threadHandle = ConvertThreadSysIdToThreadHandle(threadSysId);\n    OVR::GetThreadStackBounds(pStackBase, pStackLimit, threadHandle);\n\n    Thread::GetThreadName(threadName, OVR_ARRAY_COUNT(threadName), threadName);\n    SprintfThreadHandle(threadHandleStr, OVR_ARRAY_COUNT(threadHandleStr), threadHandle);\n    SprintfThreadSysId(threadSysIdStr, OVR_ARRAY_COUNT(threadSysIdStr), threadSysId);\n    SprintfAddress(stackBaseStr, OVR_ARRAY_COUNT(stackBaseStr), pStackBase);\n    SprintfAddress(stackLimitStr, OVR_ARRAY_COUNT(stackLimitStr), pStackLimit);\n\n    if(threadName[0])\n        OVR_snprintf(headerBuffer, OVR_ARRAY_COUNT(headerBuffer), \"Thread \\\"%s\\\" handle: %s, id: %s, stack base: %s, stack limit: %s\\r\\n\", threadName, threadHandleStr, threadSysIdStr, stackBaseStr, stackLimitStr);\n    else\n        OVR_snprintf(headerBuffer, OVR_ARRAY_COUNT(headerBuffer), \"Thread handle: %s, id: %s, stack base: %s, stack limit: %s\\r\\n\", threadHandleStr, threadSysIdStr, stackBaseStr, stackLimitStr);\n\n    sOutput += headerBuffer;\n\n    // Print the backtrace info\n    char        backtraceBuffer[1024];  // Sometimes function symbol names are very long.\n    SymbolInfo  symbolInfo;\n    const char* pModuleName;\n\n    if(addressCount == 0)\n    {\n        sOutput += \"<Unable to read backtrace>\\r\\n\";\n    }\n    else\n    {\n        for(size_t i = 0; i < addressCount; ++i)\n        {\n            LookupSymbol((uint64_t)addressArray[i], symbolInfo);\n\n            if(symbolInfo.pModuleInfo && symbolInfo.pModuleInfo->name[0])\n                pModuleName = symbolInfo.pModuleInfo->name;\n            else\n                pModuleName = \"(unknown module)\";\n\n            char addressStr[24];\n            SprintfAddress(addressStr, OVR_ARRAY_COUNT(addressStr), addressArray[i]);\n\n            if(symbolInfo.filePath[0])\n                OVR_snprintf(backtraceBuffer, OVR_ARRAY_COUNT(backtraceBuffer), \"%-2u %-24s %s %s+%d %s:%d\\r\\n\", (unsigned)i, pModuleName, addressStr, symbolInfo.function, symbolInfo.functionOffset, symbolInfo.filePath, symbolInfo.fileLineNumber);\n            else\n                OVR_snprintf(backtraceBuffer, OVR_ARRAY_COUNT(backtraceBuffer), \"%-2u %-24s %s %s+%d\\r\\n\", (unsigned)i, pModuleName, addressStr, symbolInfo.function, symbolInfo.functionOffset);\n\n            sOutput += backtraceBuffer;\n        }\n    }\n\n    FreeThreadHandle(threadHandle);\n\n    return (addressCount > 0);\n}\n\n\n// Writes all thread's callstacks with symbols to the given output.\n// It may not be safe to call this from an exception handler, as sOutput allocates memory.\nbool SymbolLookup::ReportThreadCallstacks(OVR::String& sOutput, size_t skipCount)\n{\n    ThreadSysId threadSysIdArray[64];\n    size_t      threadSysIdCount = GetThreadList(nullptr, threadSysIdArray, OVR_ARRAY_COUNT(threadSysIdArray));\n\n    if(threadSysIdCount > OVR_ARRAY_COUNT(threadSysIdArray))\n        threadSysIdCount = OVR_ARRAY_COUNT(threadSysIdArray);\n\n    for(size_t i = 0; i < threadSysIdCount; i++)\n    {\n        String sTemp;\n        ReportThreadCallstack(sTemp, skipCount, threadSysIdArray[i]);\n        if(i > 0)\n            sOutput += \"\\r\\n\";\n        sOutput += sTemp;\n    }\n\n    return (threadSysIdCount > 0);\n}\n\n\nbool SymbolLookup::RefreshModuleList()\n{\n    if(!moduleListUpdated)\n    {\n        #if defined(OVR_OS_MS)\n            // We can't rely on SymRefreshModuleList because it's present in DbgHelp 6.5, \n            // which doesn't distribute with Windows 7.\n\n            // Currently we support only refreshing the list once ever. With a little effort we could revise this code to \n            // support re-refreshing the list at runtime to account for the possibility that modules have recently been\n            // added or removed.\n            if(pSymLoadModule64)\n            {\n                const size_t requiredCount = GetModuleInfoArray(moduleInfoArray, OVR_ARRAY_COUNT(moduleInfoArray));\n                moduleInfoArraySize = MIN(requiredCount, OVR_ARRAY_COUNT(moduleInfoArray));\n\n                HANDLE hProcess = GetCurrentProcess();\n\n                for(size_t i = 0; i < moduleInfoArraySize; i++)\n                    pSymLoadModule64(hProcess, nullptr, moduleInfoArray[i].filePath, nullptr, moduleInfoArray[i].baseAddress, (DWORD)moduleInfoArray[i].size);\n\n                moduleListUpdated = true;\n            }\n        #else\n            const size_t requiredCount = GetModuleInfoArray(moduleInfoArray, OVR_ARRAY_COUNT(moduleInfoArray));\n            moduleInfoArraySize = MIN(requiredCount, OVR_ARRAY_COUNT(moduleInfoArray));\n            moduleListUpdated = true;\n        #endif\n    }\n    \n    return true;\n}\n\n\nbool SymbolLookup::LookupSymbol(uint64_t address, SymbolInfo& symbolInfo)\n{\n    return LookupSymbols(&address, &symbolInfo, 1);\n}\n\n\nbool SymbolLookup::LookupSymbols(uint64_t* addressArray, SymbolInfo* pSymbolInfoArray, size_t arraySize)\n{\n    if(!moduleListUpdated)\n    {\n        RefreshModuleList();\n    }\n\n    #if defined(OVR_OS_MS)\n        union SYMBOL_INFO_UNION\n        {\n            SYMBOL_INFO msSymbolInfo;\n            char        suffixPadding[sizeof(SYMBOL_INFO) + 1024];\n        };\n\n        for(size_t i = 0; i < arraySize; i++)\n        {\n            uint64_t&   address    = addressArray[i];\n            SymbolInfo& symbolInfo = pSymbolInfoArray[i];\n\n            // Copy the address and ModuleInfo\n            symbolInfo.address     = addressArray[i];\n            symbolInfo.pModuleInfo = GetModuleInfoForAddress(address); // We could also use siu.msSymbolInfo.ModBase to get the module slightly faster.\n\n            // Get the function/offset.\n            SYMBOL_INFO_UNION siu;\n            memset(&siu, 0, sizeof(siu));\n            siu.msSymbolInfo.SizeOfStruct = sizeof(siu.msSymbolInfo);\n            siu.msSymbolInfo.MaxNameLen   = sizeof(siu.suffixPadding) - sizeof(SYMBOL_INFO) + 1; // +1 because SYMBOL_INFO itself has Name[1].\n\n            HANDLE  hProcess = GetCurrentProcess();\n            DWORD64 displacement64 = 0;\n            bool    bResult = (pSymFromAddr != nullptr) && (pSymFromAddr(hProcess, address, &displacement64, &siu.msSymbolInfo) != FALSE);\n\n            if(bResult)\n            {\n                symbolInfo.size = siu.msSymbolInfo.Size;\n                OVR_strlcpy(symbolInfo.function, siu.msSymbolInfo.Name, OVR_ARRAY_COUNT(symbolInfo.function));\n                symbolInfo.functionOffset = (int32_t)displacement64;\n            }\n            else\n            {\n                symbolInfo.size = kMISizeInvalid;\n                symbolInfo.function[0] = 0;\n                symbolInfo.functionOffset = kMIFunctionOffsetInvalid;\n            }\n\n            // Get the file/line\n            IMAGEHLP_LINE64 iLine64;\n            DWORD displacement = 0;\n            memset(&iLine64, 0, sizeof(iLine64));\n            iLine64.SizeOfStruct = sizeof(iLine64);\n\n            bResult = (pSymGetLineFromAddr64 != nullptr) && (pSymGetLineFromAddr64(hProcess, address, &displacement, &iLine64) != FALSE);\n\n            if(bResult)\n            {\n                OVR_strlcpy(symbolInfo.filePath, iLine64.FileName, OVR_ARRAY_COUNT(symbolInfo.filePath));\n                symbolInfo.fileLineNumber = (int32_t)iLine64.LineNumber;\n            }\n            else\n            {\n                symbolInfo.filePath[0] = 0;\n                symbolInfo.fileLineNumber = kMILineNumberInvalid;\n            }\n\n            // To do: get the source code when possible. We need to use the user-registered directory paths and the symbolInfo.filePath\n            // and find the given file in the tree(s), then open the file and find the symbolInfo.fileLineNumber line (and surrounding lines).\n            // symbolInfo.sourceCode[1024]\n            symbolInfo.sourceCode[0] = '\\0';\n        }\n    \n    #elif defined(OVR_OS_APPLE)\n        // Apple has an internal CoreSymbolication library which could help with this.\n        // Third party implementations of the CoreSymbolication header are available and could be used\n        // to get file/line info better than other means. It used Objective C, so we'll need a .m or .mm file.\n    \n        memset(pSymbolInfoArray, 0, arraySize * sizeof(SymbolInfo));\n\n        for(size_t i = 0; i < arraySize; i++)\n        {\n            pSymbolInfoArray[i].address = addressArray[i];\n            pSymbolInfoArray[i].pModuleInfo = GetModuleInfoForAddress(addressArray[i]);\n        }\n\n        // Problem: backtrace_symbols allocates memory from malloc. If you got into a SIGSEGV due to\n        // malloc arena corruption (quite common) you will likely fault in backtrace_symbols.\n        // To do: Use allowMemoryAllocation here.\n    \n        #if (OVR_PTR_SIZE == 4)\n            // backtrace_symbols takes a void* array, but we have a uint64_t array. So for 32 bit we\n            // need to convert the 64 bit array to 32 bit temporarily for the backtrace_symbols call.\n            void* ptr32Array[256]; // To do: Remove this limit.\n            for(size_t i = 0, iEnd = MIN(arraySize, OVR_ARRAY_COUNT(ptr32Array)); i < iEnd; i++)\n                ptr32Array[i] = reinterpret_cast<void*>(addressArray[i]);\n            char** symbolArray = backtrace_symbols(reinterpret_cast<void**>(ptr32Array), (int)arraySize);\n        #else\n            char** symbolArray = backtrace_symbols(reinterpret_cast<void**>(addressArray), (int)arraySize);\n        #endif\n\n        if(symbolArray)\n        {\n            for(size_t i = 0; i < arraySize; i++)\n            {\n\n                // Generates a string like this: \"0 OculusWorldDemo 0x000000010000cfd5 _ZN18OculusWorldDemoApp9OnStartupEiPPKc + 213\"\n                static_assert(OVR_ARRAY_COUNT(pSymbolInfoArray[i].function) == 128, \"Need to change the string format size below\");\n                \n                sscanf(symbolArray[i], \"%*d %*s %*x %128s + %d\", pSymbolInfoArray[i].function, &pSymbolInfoArray[i].functionOffset);\n                \n                if(allowMemoryAllocation)\n                {\n                    int   status = 0;\n                    char* strDemangled = abi::__cxa_demangle(pSymbolInfoArray[i].function, nullptr, nullptr, &status);\n                    \n                    if(strDemangled)\n                    {\n                        OVR_strlcpy(pSymbolInfoArray[i].function, strDemangled, OVR_ARRAY_COUNT(pSymbolInfoArray[i].function));\n                        free(strDemangled);\n                    }\n                }\n            }\n\n            free(symbolArray);\n        }\n\n        // To consider: use CoreSybolication to get file/line info instead. atos is a bit slow and cumbersome.\n        // https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/atos.1.html\n        // atos -p <pid> <addr> <addr> ...\n        // atos -o <binary image path> -l <load-address> <addr> <addr> ...\n        // Generates output like this: \"OVR::CreateException(OVR::CreateExceptionType) (in OculusWorldDemo) (ExceptionHandler.cpp:598)\"\n        for(size_t i = 0; i < arraySize; i++)\n        {\n            struct stat statStruct;\n\n            if(pSymbolInfoArray[i].pModuleInfo && pSymbolInfoArray[i].pModuleInfo->filePath[0] && (stat(pSymbolInfoArray[i].pModuleInfo->filePath, &statStruct) == 0))\n            {\n                char command[PATH_MAX * 2];   // Problem: We can't unilaterally use pSymbolInfoArray[0] for all addresses. We need to match addresses to the corresponding modules.\n                OVR_snprintf(command, OVR_ARRAY_COUNT(command), \"atos -o %s -l 0x%llx 0x%llx\",\n                            pSymbolInfoArray[i].pModuleInfo->filePath, (int64_t)pSymbolInfoArray[i].pModuleInfo->baseAddress, (int64_t)pSymbolInfoArray[i].address);\n\n                char output[512];\n                if(SpawnShellCommand(command, output, OVR_ARRAY_COUNT(output)) != (size_t)-1)\n                {\n                    char* pLastOpenParen = strrchr(output, '(');\n                    char* pColon = strrchr(output, ':');\n                    \n                    if(pLastOpenParen && (pColon > pLastOpenParen))\n                    {\n                        *pColon = '\\0';\n                        OVR_strlcpy(pSymbolInfoArray[i].filePath, pLastOpenParen + 1, OVR_ARRAY_COUNT(pSymbolInfoArray[i].filePath));\n                    }\n                }\n            }\n        }\n\n    #elif defined(OVR_OS_LINUX)\n        // We can use libunwind's unw_get_proc_name to try to get function name info. It can work regardless of relocation.\n        // Use backtrace_symbols and addr2line. Need to watch out for module load-time relocation.\n        // Ned to pass the -rdynamic flag to the linker. It will cause the linker to out in the link\n        // tables the name of all the none static functions in your code, not just the exported ones.\n        OVR_UNUSED(addressArray);\n        OVR_UNUSED(pSymbolInfoArray);\n        OVR_UNUSED(arraySize);\n    #endif\n\n    return true; // To do: Return true only if something was found.\n}\n\n\nconst ModuleInfo* SymbolLookup::GetModuleInfoForAddress(uint64_t address)\n{\n    // This is a linear seach. To consider: it would be significantly faster to search by \n    // address if we ordered it by base address and did a binary search.\n    for(size_t i = 0; i < moduleInfoArraySize; ++i)\n    {\n        const ModuleInfo& mi = moduleInfoArray[i];\n\n        if((mi.baseAddress <= address) && (address < (mi.baseAddress + mi.size)))\n            return &mi;\n    }\n\n    return nullptr;\n}\n\n\n\n\nExceptionInfo::ExceptionInfo()\n  : time()\n  , timeVal(0)\n  , backtrace()\n  , backtraceCount(0)\n  , threadHandle(OVR_THREADHANDLE_INVALID)\n  , threadSysId(OVR_THREADSYSID_INVALID)\n  , threadName()\n  , pExceptionInstructionAddress(nullptr)\n  , pExceptionMemoryAddress(nullptr)\n  , cpuContext()\n  , exceptionDescription()\n  , symbolInfo()\n #if defined(OVR_OS_MS)\n  , exceptionRecord()\n #elif defined(OVR_OS_APPLE)\n  , exceptionType(0)\n  , cpuExceptionId(0)\n  , cpuExceptionIdError(0)\n  , machExceptionDetail()\n  , machExceptionDetailCount(0)\n #endif\n{\n}\n\n\n\nExceptionHandler::ExceptionHandler()\n  : enabled(false)\n  , reportPrivacyEnabled(true)\n  , exceptionResponse(kERHandle)\n  , exceptionListener(nullptr)\n  , exceptionListenerUserValue(0)\n  , appDescription()\n  , codeBasePathArray()\n  , reportFilePath()\n  , miniDumpFlags(0)\n  , miniDumpFilePath()\n  , file(nullptr)\n  , scratchBuffer()\n  , exceptionOccurred(false)\n  , handlingBusy(0)\n  , reportFilePathActual()\n  , minidumpFilePathActual()\n  , terminateReturnValue(0)\n  , exceptionInfo()\n #if defined(OVR_OS_MS)\n  , vectoredHandle(nullptr)\n  , previousFilter(nullptr)\n  , pExceptionPointers(nullptr)\n #elif defined(OVR_OS_MAC)\n  , machHandlerInitialized(false)\n  , machExceptionPort(0)\n  , machExceptionPortsSaved()\n  , machThreadShouldContinue(false)\n  , machThreadExecuting(false)\n  , machThread((pthread_t)OVR_THREADHANDLE_INVALID)\n #endif\n{\n\tSetExceptionPaths(\"default\", \"default\");\n}\n\n\nExceptionHandler::~ExceptionHandler()\n{\n    if(enabled)\n    {\n        Enable(false);\n    } \n}\n\n\n#if defined(OVR_OS_MS)\n    static ExceptionHandler* sExceptionHandler = nullptr;\n\n    LONG WINAPI Win32ExceptionFilter(LPEXCEPTION_POINTERS pExceptionPointers)\n    {\n        if(sExceptionHandler)\n            return (LONG)sExceptionHandler->ExceptionFilter(pExceptionPointers);\n        return EXCEPTION_CONTINUE_SEARCH;\n    }\n\n    LONG ExceptionHandler::ExceptionFilter(LPEXCEPTION_POINTERS pExceptionPointers)\n    {\n        // Exception codes < 0x80000000 are not true exceptions but rather are debugger notifications. They include DBG_TERMINATE_THREAD, \n        // DBG_TERMINATE_PROCESS, DBG_CONTROL_BREAK, DBG_COMMAND_EXCEPTION, DBG_CONTROL_C, DBG_PRINTEXCEPTION_C, DBG_RIPEXCEPTION, \n        // and 0x406d1388 (thread named, http://blogs.msdn.com/b/stevejs/archive/2005/12/19/505815.aspx).\n\n        if(pExceptionPointers->ExceptionRecord->ExceptionCode < 0x80000000)\n            return EXCEPTION_CONTINUE_SEARCH;\n\n        // VC++ C++ exceptions use code 0xe06d7363 ('Emsc')\n        // http://support.microsoft.com/kb/185294 \n        // http://blogs.msdn.com/b/oldnewthing/archive/2010/07/30/10044061.aspx\n        if(pExceptionPointers->ExceptionRecord->ExceptionCode == 0xe06d7363)\n            return EXCEPTION_CONTINUE_SEARCH;\n\n        if(handlingBusy.CompareAndSet_Acquire(0, 1)) // If we can successfully change it from 0 to 1.\n        {\n            exceptionOccurred = true;\n\n            this->pExceptionPointers = pExceptionPointers;\n\n            // Disable the handler while we do this processing.\n            ULONG result = RemoveVectoredExceptionHandler(vectoredHandle);\n            OVR_ASSERT_AND_UNUSED(result != 0, result);\n\n            // Time\n            exceptionInfo.timeVal = time(nullptr);\n            exceptionInfo.time = *gmtime(&exceptionInfo.timeVal);\n\n            // Thread id\n            // This is the thread id of the current thread and not the exception thread.\n            if(!DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &exceptionInfo.threadHandle, 0, true, DUPLICATE_SAME_ACCESS))\n                exceptionInfo.threadHandle = 0;\n            exceptionInfo.threadSysId = ConvertThreadHandleToThreadSysId(exceptionInfo.threadHandle);\n\n            OVR::GetThreadName(exceptionInfo.threadHandle, exceptionInfo.threadName, OVR_ARRAY_COUNT(exceptionInfo.threadName));\n\n            // Backtraces\n            exceptionInfo.backtraceCount = symbolLookup.GetBacktrace(exceptionInfo.backtrace, OVR_ARRAY_COUNT(exceptionInfo.backtrace));\n\n            // Context\n            exceptionInfo.cpuContext = *pExceptionPointers->ContextRecord;\n            exceptionInfo.exceptionRecord = *pExceptionPointers->ExceptionRecord;\n            exceptionInfo.pExceptionInstructionAddress  = exceptionInfo.exceptionRecord.ExceptionAddress;\n            if((exceptionInfo.exceptionRecord.ExceptionCode == EXCEPTION_ACCESS_VIOLATION) || (exceptionInfo.exceptionRecord.ExceptionCode == EXCEPTION_IN_PAGE_ERROR))\n                exceptionInfo.pExceptionMemoryAddress = (void*)exceptionInfo.exceptionRecord.ExceptionInformation[1]; // ExceptionInformation[0] indicates if it was a read (0), write (1), or data execution attempt (8).\n            else\n                exceptionInfo.pExceptionMemoryAddress = pExceptionPointers->ExceptionRecord->ExceptionAddress;\n\n            WriteExceptionDescription();\n\n            if(miniDumpFilePath[0])\n                WriteMiniDump();\n\n            if(reportFilePath[0])\n                WriteReport();\n\n            if(exceptionListener)\n                exceptionListener->HandleException(exceptionListenerUserValue, this, &exceptionInfo, reportFilePathActual);\n\n            if(exceptionInfo.threadHandle)\n            {\n                CloseHandle(exceptionInfo.threadHandle);\n                exceptionInfo.threadHandle = 0;\n            }\n\n            // Restore the handler that we temporarily disabled above.\n            vectoredHandle = AddVectoredExceptionHandler(1, Win32ExceptionFilter);\n\n            handlingBusy.Store_Release(0);\n        }\n\n        if(exceptionResponse == ExceptionHandler::kERTerminate)\n        {\n            TerminateProcess(GetCurrentProcess(), (UINT)terminateReturnValue);\n            return terminateReturnValue;\n        }\n        else if(exceptionResponse == ExceptionHandler::kERThrow)\n            return EXCEPTION_CONTINUE_SEARCH;\n        else if(exceptionResponse == ExceptionHandler::kERContinue)\n            return EXCEPTION_CONTINUE_EXECUTION;\n        return EXCEPTION_EXECUTE_HANDLER;\n    }\n\n#endif // defined(OVR_OS_MS)\n\n\n#if defined(OVR_OS_APPLE)\n    // http://www.opensource.apple.com/source/xnu/xnu-2050.22.13/\n    // http://www.opensource.apple.com/source/xnu/xnu-2050.22.13/osfmk/man/\n    // http://www.opensource.apple.com/source/Libc/Libc-825.26/\n    // https://mikeash.com/pyblog/friday-qa-2013-01-11-mach-exception-handlers.html\n    \n    void* ExceptionHandler::MachHandlerThreadFunction()\n    {\n        __Request__mach_exception_raise_state_identity_t msg;\n        __Reply__mach_exception_raise_state_identity_t reply;\n        mach_msg_return_t result;\n\n        machThreadExecuting = true;\n        pthread_setname_np(\"ExceptionHandler\");\n        \n        while(machThreadShouldContinue)\n        {\n            mach_msg_option_t options = MACH_RCV_MSG | MACH_RCV_LARGE;\n            natural_t         timeout = 0; // Would be better to support a non-zero time.\n\n            if(timeout)\n                options |= MACH_RCV_TIMEOUT;\n            \n            result = mach_msg(&msg.Head, options, 0, sizeof(msg), machExceptionPort, timeout, MACH_PORT_NULL);\n\n            if(msg.Head.msgh_id != sMachCancelMessageType)\n            {\n                if(result == MACH_MSG_SUCCESS)\n                {\n                    if(mach_exc_server_OVR(&msg.Head, &reply.Head) == 0)  //This will call our HandleMachException function.\n                        result = ~MACH_MSG_SUCCESS;\n                }\n\n                // Send the reply\n                if(result == MACH_MSG_SUCCESS)\n                {\n                    result = mach_msg(&reply.Head, MACH_SEND_MSG, reply.Head.msgh_size, 0, MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);\n                    \n                    if(result != MACH_MSG_SUCCESS)\n                    {\n                        // Failure.\n                    }\n                }\n            }\n        }\n\n        machThreadExecuting = false;\n\n        return nullptr;\n    }\n\n    \n    kern_return_t ExceptionHandler::HandleMachException(mach_port_t /*machPort*/, mach_port_t threadSysId, mach_port_t machTask,\n                                            exception_type_t machExceptionType, mach_exception_data_type_t* pExceptionDetail,\n                                            mach_msg_type_number_t exceptionDetailCount, int* /*pMachExceptionFlavor*/, thread_state_t threadStatePrev,\n                                            mach_msg_type_number_t /*threadStatePrevCount*/, thread_state_t /*threadStateNew*/,\n                                            mach_msg_type_number_t* /*pThreadStateNewCount*/)\n    {\n        // We don't want to handle exceptions for other processes.\n        if(machTask != mach_task_self())\n            return ForwardMachException(threadSysId, machTask, machExceptionType, pExceptionDetail, exceptionDetailCount);\n\n        if(handlingBusy.CompareAndSet_Acquire(0, 1)) // If we can successfully change it from 0 to 1.\n        {\n            exceptionOccurred = true;\n\n            // Disable the handler while we do this processing.\n            // To do.\n\n            // Time\n            exceptionInfo.timeVal = time(nullptr);\n            exceptionInfo.time = *gmtime(&exceptionInfo.timeVal);\n\n            // Thread id\n            exceptionInfo.threadHandle = pthread_from_mach_thread_np(threadSysId);\n            exceptionInfo.threadSysId  = threadSysId;\n            pthread_getname_np((pthread_t)exceptionInfo.threadHandle, exceptionInfo.threadName, sizeof(exceptionInfo.threadName));\n\n            // Backtraces\n            exceptionInfo.backtraceCount = symbolLookup.GetBacktraceFromThreadSysId(exceptionInfo.backtrace, OVR_ARRAY_COUNT(exceptionInfo.backtrace), 0, threadSysId);\n\n            // Context\n            #if defined(OVR_CPU_X86) || defined(OVR_CPU_X86_64)\n                // We can read x86_THREAD_STATE directly fromk threadStatePrev.\n                exceptionInfo.cpuContext.threadState = *reinterpret_cast<x86_thread_state_t*>(threadStatePrev);\n            \n                mach_msg_type_number_t stateCount = x86_FLOAT_STATE_COUNT;\n                thread_get_state(threadSysId, x86_FLOAT_STATE, (natural_t*)&exceptionInfo.cpuContext.floatState, &stateCount);\n            \n                stateCount = x86_DEBUG_STATE_COUNT;\n                thread_get_state(threadSysId, x86_DEBUG_STATE, (natural_t*)&exceptionInfo.cpuContext.debugState, &stateCount);\n            \n                stateCount = x86_AVX_STATE_COUNT;\n                thread_get_state(threadSysId, x86_AVX_STATE, (natural_t*)&exceptionInfo.cpuContext.avxState, &stateCount);\n            \n                stateCount = x86_EXCEPTION_STATE_COUNT;\n                thread_get_state(threadSysId, x86_EXCEPTION_STATE, (natural_t*)&exceptionInfo.cpuContext.exceptionState, &stateCount);\n\n                #if defined(OVR_CPU_X86)\n                    exceptionInfo.pExceptionInstructionAddress = (void*)exceptionInfo.cpuContext.threadState.uts.ts32.__eip;\n                    exceptionInfo.pExceptionMemoryAddress      = (void*)exceptionInfo.cpuContext.exceptionState.ues.es32.__faultvaddr;\n                    exceptionInfo.cpuExceptionId               = exceptionInfo.cpuContext.exceptionState.ues.es32.__trapno;\n                    exceptionInfo.cpuExceptionIdError          = exceptionInfo.cpuContext.exceptionState.ues.es32.__err;\n                #else\n                    exceptionInfo.pExceptionInstructionAddress = (void*)exceptionInfo.cpuContext.threadState.uts.ts64.__rip;\n                    exceptionInfo.pExceptionMemoryAddress      = (void*)exceptionInfo.cpuContext.exceptionState.ues.es64.__faultvaddr;\n                    exceptionInfo.cpuExceptionId               = exceptionInfo.cpuContext.exceptionState.ues.es64.__trapno;\n                    exceptionInfo.cpuExceptionIdError          = exceptionInfo.cpuContext.exceptionState.ues.es64.__err;\n                #endif\n            #endif\n            \n            exceptionInfo.exceptionType = machExceptionType;\n\n            exceptionInfo.machExceptionDetailCount = MIN(exceptionDetailCount, OVR_ARRAY_COUNT(exceptionInfo.machExceptionDetail));\n            for(int i = 0; i < exceptionInfo.machExceptionDetailCount; i++)\n                exceptionInfo.machExceptionDetail[i] = pExceptionDetail[i];\n\n            WriteExceptionDescription();\n\n            if(reportFilePath[0])\n                WriteReport();\n\n            if(miniDumpFilePath[0])\n                WriteMiniDump();\n \n            if(exceptionListener)\n                exceptionListener->HandleException(exceptionListenerUserValue, this, &exceptionInfo, reportFilePathActual);\n\n            // Re-restore the handler.\n            // To do.\n\n            handlingBusy.Store_Release(0);\n        }\n\n        kern_return_t result = KERN_FAILURE; // By default pass on the exception to another handler after we are done here.\n\n        if(exceptionResponse == ExceptionHandler::kERTerminate)\n            ::exit(terminateReturnValue);\n        else if(exceptionResponse == ExceptionHandler::kERThrow)\n            ForwardMachException(threadSysId, machTask, machExceptionType, pExceptionDetail, exceptionDetailCount);\n        else if(exceptionResponse == ExceptionHandler::kERDefault)\n            ::exit(terminateReturnValue);\n        else if(exceptionResponse == ExceptionHandler::kERContinue)\n            result = KERN_SUCCESS; // This will trigger a re-execution of the function.\n\n        return result;\n    }\n\n\n    bool ExceptionHandler::InitMachExceptionHandler()\n    {\n        if(!machHandlerInitialized)\n        {\n            mach_port_t      machTaskSelf = mach_task_self();\n            kern_return_t    result = MACH_MSG_SUCCESS;\n            exception_mask_t mask = EXC_MASK_BAD_ACCESS | EXC_MASK_BAD_INSTRUCTION | EXC_MASK_ARITHMETIC | EXC_MASK_CRASH;\n            \n            if(machExceptionPort == MACH_PORT_NULL)\n            {\n                result = mach_port_allocate(machTaskSelf, MACH_PORT_RIGHT_RECEIVE, &machExceptionPort);\n                \n                if(result == MACH_MSG_SUCCESS)\n                {\n                    result = mach_port_insert_right(machTaskSelf, machExceptionPort, machExceptionPort, MACH_MSG_TYPE_MAKE_SEND);\n\n                    if(result == MACH_MSG_SUCCESS)\n                        result = task_get_exception_ports(machTaskSelf, mask, machExceptionPortsSaved.masks, &machExceptionPortsSaved.count,\n                                                          machExceptionPortsSaved.ports, machExceptionPortsSaved.behaviors, machExceptionPortsSaved.flavors);\n                }\n            }\n            \n            if(result == MACH_MSG_SUCCESS)\n            {\n                result = task_set_exception_ports(machTaskSelf, mask, machExceptionPort, EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES, MACHINE_THREAD_STATE);\n\n                if(result == MACH_MSG_SUCCESS)\n                {\n                    machThreadShouldContinue = true;\n\n                    pthread_attr_t attr;\n                    pthread_attr_init(&attr);\n                    \n                    result = pthread_create(&machThread, &attr, MachHandlerThreadFunctionStatic, (void*)this);\n                    pthread_attr_destroy(&attr);\n                    \n                    machHandlerInitialized = (result == 0);\n                }\n            }\n            \n            if(!machHandlerInitialized)\n                ShutdownMachExceptionHandler();\n        }\n        \n        return machHandlerInitialized;\n    }\n\n\n    void ExceptionHandler::ShutdownMachExceptionHandler()\n    {\n        if(machThreadExecuting)\n        {\n            machThreadShouldContinue = false; // Tell it to stop.\n\n            // Cancel the current exception handler thread (which is probably blocking in a call to mach_msg) by sending it a cencel message.\n            struct CancelMessage\n            {\n                mach_msg_header_t msgHeader;\n            };\n            \n            CancelMessage msg;\n            memset(&msg.msgHeader, 0, sizeof(CancelMessage));\n            msg.msgHeader.msgh_id          = sMachCancelMessageType;\n            msg.msgHeader.msgh_size        = sizeof(CancelMessage);\n            msg.msgHeader.msgh_bits        = MACH_MSGH_BITS_REMOTE(MACH_MSG_TYPE_MAKE_SEND);\n            msg.msgHeader.msgh_remote_port = machExceptionPort;\n            msg.msgHeader.msgh_local_port  = MACH_PORT_NULL;\n            \n            mach_msg_return_t result = mach_msg(&msg.msgHeader, MACH_SEND_MSG, msg.msgHeader.msgh_size, 0, MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);\n            \n            if(result == MACH_MSG_SUCCESS)\n            {\n                const double threeSecondsLater = ovr_GetTimeInSeconds() + 3.f;\n                \n                while(machThreadExecuting && (ovr_GetTimeInSeconds() < threeSecondsLater))\n                {\n                    timespec ts = { 0, 1000000000 };\n                    nanosleep(&ts, nullptr);\n                }\n            }\n\n            void* joinResult = nullptr;\n            pthread_join(machThread, &joinResult);\n            machThread = 0;\n        }\n\n        if(machExceptionPort != MACH_PORT_NULL)\n        {\n            // Restore the previous ports\n            kern_return_t result = KERN_SUCCESS;\n            mach_port_t   machTaskSelf = mach_task_self();\n            \n            for(unsigned i = 0; (i < machExceptionPortsSaved.count) && (result == KERN_SUCCESS); i++)\n            {\n                result = task_set_exception_ports(machTaskSelf, machExceptionPortsSaved.masks[i], machExceptionPortsSaved.ports[i],\n                              machExceptionPortsSaved.behaviors[i], machExceptionPortsSaved.flavors[i]);\n            }\n\n            mach_port_deallocate(machTaskSelf, machExceptionPort);\n            machExceptionPort = MACH_PORT_NULL;\n        }\n        \n        machHandlerInitialized = false;\n    }\n\n\n    kern_return_t ExceptionHandler::ForwardMachException(mach_port_t thread, mach_port_t task, exception_type_t exceptionType,\n                                                mach_exception_data_t pExceptionDetail, mach_msg_type_number_t exceptionDetailCount)\n    {\n        kern_return_t result = KERN_FAILURE;\n        mach_msg_type_number_t i;\n\n        for(i = 0; i < machExceptionPortsSaved.count; i++)\n        {\n            if(machExceptionPortsSaved.masks[i] & (1 << exceptionType))\n                break;\n        }\n        \n        if(i < machExceptionPortsSaved.count)\n        {\n            mach_port_t            port             = machExceptionPortsSaved.ports[i];\n            exception_behavior_t   behavior         = machExceptionPortsSaved.behaviors[i];\n            thread_state_flavor_t  flavor           = machExceptionPortsSaved.flavors[i];\n            mach_msg_type_number_t threadStateCount = THREAD_STATE_MAX;\n            thread_state_data_t    threadState;\n\n            if(behavior != EXCEPTION_DEFAULT)\n                thread_get_state(thread, flavor, threadState, &threadStateCount);\n            \n            switch(behavior)\n            {\n                case EXCEPTION_DEFAULT:\n                    result = mach_exception_raise_OVR(port, thread, task, exceptionType, pExceptionDetail, exceptionDetailCount);\n                    break;\n                    \n                case EXCEPTION_STATE:\n                    result = mach_exception_raise_state_OVR(port, exceptionType, pExceptionDetail, exceptionDetailCount,\n                                       &flavor, threadState, threadStateCount, threadState, &threadStateCount);\n                    break;\n\n                case EXCEPTION_STATE_IDENTITY:\n                    result = mach_exception_raise_state_identity_OVR(port, thread, task, exceptionType, pExceptionDetail,\n                                    exceptionDetailCount, &flavor, threadState, threadStateCount, threadState, &threadStateCount);\n                    break;\n                    \n                default:\n                    result = KERN_FAILURE;\n                    break;\n            }\n            \n            if(behavior != EXCEPTION_DEFAULT)\n                result = thread_set_state(thread, flavor, threadState, threadStateCount);\n        }\n        \n        return result;\n    }\n\n\n#endif // OVR_OS_APPLE\n\n\nbool ExceptionHandler::Enable(bool enable)\n{\n    #if defined(OVR_OS_MS)\n        if(enable && !enabled)\n        {\n            OVR_ASSERT(vectoredHandle == nullptr);\n            vectoredHandle = AddVectoredExceptionHandler(1, Win32ExceptionFilter); // Windows call.\n            enabled = (vectoredHandle != nullptr);\n            OVR_ASSERT(enabled);\n            sExceptionHandler = this;\n            return enabled;\n        }\n        else if(!enable && enabled)\n        {\n            if(sExceptionHandler == this)\n                sExceptionHandler = nullptr;\n            OVR_ASSERT(vectoredHandle != nullptr);\n            ULONG result = RemoveVectoredExceptionHandler(vectoredHandle); // Windows call.\n            OVR_ASSERT_AND_UNUSED(result != 0, result);\n            vectoredHandle = nullptr;\n            enabled = false;\n            return true;\n        }\n    \n    #elif defined(OVR_OS_APPLE)\n    \n        if(enable && !enabled)\n        {\n            enabled = InitMachExceptionHandler();\n            OVR_ASSERT(enabled);\n            sExceptionHandler = this;\n            return enabled;\n        }\n        else if(!enable && enabled)\n        {\n            if(sExceptionHandler == this)\n                sExceptionHandler = nullptr;\n            ShutdownMachExceptionHandler();\n            enabled = false;\n            return true;\n        }\n\t#else\n        OVR_UNUSED(enable);\n    #endif\n\n    return true;\n}\n\n\nvoid ExceptionHandler::EnableReportPrivacy(bool enable)\n{\n    reportPrivacyEnabled = enable;\n}\n\nvoid ExceptionHandler::WriteExceptionDescription()\n{\n    #if defined(OVR_OS_MS)\n        // There is some extra information available for AV exception.\n        if(exceptionInfo.exceptionRecord.ExceptionCode == EXCEPTION_ACCESS_VIOLATION)\n        {\n            const char* error = (exceptionInfo.exceptionRecord.ExceptionInformation[0] == 0) ? \"reading\" : \n                               ((exceptionInfo.exceptionRecord.ExceptionInformation[0] == 1) ? \"writing\" : \"executing\");\n\n            char addressStr[24];\n            SprintfAddress(addressStr, OVR_ARRAY_COUNT(addressStr), exceptionInfo.pExceptionMemoryAddress);\n            OVR::OVR_snprintf(exceptionInfo.exceptionDescription, OVR_ARRAY_COUNT(exceptionInfo.exceptionDescription), \"ACCESS_VIOLATION %s address %s\", error, addressStr);\n        }\n        else\n        {\n            exceptionInfo.exceptionDescription[0] = 0;\n\n            // Process \"standard\" exceptions, other than 'access violation'\n            #define FORMAT_EXCEPTION(x)           \\\n                case EXCEPTION_##x:               \\\n                    OVR::OVR_strlcpy(exceptionInfo.exceptionDescription, #x, OVR_ARRAY_COUNT(exceptionInfo.exceptionDescription)); \\\n                    break;\n\n            switch(exceptionInfo.exceptionRecord.ExceptionCode)\n            {\n              //FORMAT_EXCEPTION(ACCESS_VIOLATION) Already handled above.\n                FORMAT_EXCEPTION(DATATYPE_MISALIGNMENT)\n                FORMAT_EXCEPTION(BREAKPOINT)\n                FORMAT_EXCEPTION(SINGLE_STEP)\n                FORMAT_EXCEPTION(ARRAY_BOUNDS_EXCEEDED)\n                FORMAT_EXCEPTION(FLT_DENORMAL_OPERAND)\n                FORMAT_EXCEPTION(FLT_DIVIDE_BY_ZERO)\n                FORMAT_EXCEPTION(FLT_INEXACT_RESULT)\n                FORMAT_EXCEPTION(FLT_INVALID_OPERATION)\n                FORMAT_EXCEPTION(FLT_OVERFLOW)\n                FORMAT_EXCEPTION(FLT_STACK_CHECK)\n                FORMAT_EXCEPTION(FLT_UNDERFLOW)\n                FORMAT_EXCEPTION(INT_DIVIDE_BY_ZERO)\n                FORMAT_EXCEPTION(INT_OVERFLOW)\n                FORMAT_EXCEPTION(PRIV_INSTRUCTION)\n                FORMAT_EXCEPTION(IN_PAGE_ERROR)\n                FORMAT_EXCEPTION(ILLEGAL_INSTRUCTION)\n                FORMAT_EXCEPTION(NONCONTINUABLE_EXCEPTION)\n                FORMAT_EXCEPTION(STACK_OVERFLOW)\n                FORMAT_EXCEPTION(INVALID_DISPOSITION)\n                FORMAT_EXCEPTION(GUARD_PAGE)\n                FORMAT_EXCEPTION(INVALID_HANDLE)\n              #if defined(EXCEPTION_POSSIBLE_DEADLOCK) && defined(STATUS_POSSIBLE_DEADLOCK) // This type seems to be non-existant in practice.\n                FORMAT_EXCEPTION(POSSIBLE_DEADLOCK)\n              #endif\n            }\n\n            // If not one of the \"known\" exceptions, try to get the string from NTDLL.DLL's message table.\n            if(exceptionInfo.exceptionDescription[0] == 0)\n            {\n                char addressStr[24];\n                SprintfAddress(addressStr, OVR_ARRAY_COUNT(addressStr), exceptionInfo.pExceptionMemoryAddress);\n\n                #if !defined(OVR_OS_CONSOLE) // If FormatMessage is supported...\n                    char  buffer[384];\n                    DWORD capacity = OVR_ARRAY_COUNT(buffer);\n\n                    const size_t length = (size_t)FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_HMODULE, \n                                                       GetModuleHandleW(L\"NTDLL.DLL\"), exceptionInfo.exceptionRecord.ExceptionCode, 0, buffer, capacity, nullptr);\n                    if(length)\n                        OVR::OVR_snprintf(exceptionInfo.exceptionDescription, OVR_ARRAY_COUNT(exceptionInfo.exceptionDescription),\n                                          \"%s at instruction %s\", buffer, addressStr);\n                #endif\n\n                // If everything else failed just show the hex code.\n                if(exceptionInfo.exceptionDescription[0] == 0)\n                    OVR::OVR_snprintf(exceptionInfo.exceptionDescription, OVR_ARRAY_COUNT(exceptionInfo.exceptionDescription), \n                                      \"Unknown exception 0x%08x at instruction %s\", exceptionInfo.exceptionRecord.ExceptionCode, addressStr);\n            }\n        }\n\n    #elif defined(OVR_OS_APPLE)\n        struct MachExceptionInfo\n        {\n            static const char* GetCPUExceptionIdString(uint32_t cpuExceptionId)\n            {\n                const char* id;\n\n                #if defined(OVR_CPU_X86) || defined(OVR_CPU_X86_64)\n                    switch (cpuExceptionId)\n                    {\n                        case  0: id = \"integer div/0\";               break;\n                        case  1: id = \"breakpoint fault\";            break;\n                        case  2: id = \"non-maskable interrupt\";      break;\n                        case  3: id = \"int 3\";                       break;\n                        case  4: id = \"overflow\";                    break;\n                        case  5: id = \"bounds check failure\";        break;\n                        case  6: id = \"invalid instruction\";         break;\n                        case  7: id = \"coprocessor unavailable\";     break;\n                        case  8: id = \"exception within exception\";  break;\n                        case  9: id = \"coprocessor segment overrun\"; break;\n                        case 10: id = \"invalid task switch\";         break;\n                        case 11: id = \"segment not present\";         break;\n                        case 12: id = \"stack exception\";             break;\n                        case 13: id = \"general protection fault\";    break;\n                        case 14: id = \"page fault\";                  break;\n                        case 16: id = \"coprocessor error\";           break;\n                        default: id = \"<unknown>\";                   break;\n                    }\n                #else\n                    // To do: Support ARM or others.\n                #endif\n                \n                return id;\n            }\n\n            static const char* GetMachExceptionTypeString(uint64_t exceptionCause)\n            {\n                switch (exceptionCause)\n                {\n                    case EXC_ARITHMETIC:      return \"EXC_ARITHMETIC\";\n                    case EXC_BAD_ACCESS:      return \"EXC_BAD_ACCESS\";\n                    case EXC_BAD_INSTRUCTION: return \"EXC_BAD_INSTRUCTION\";\n                    case EXC_BREAKPOINT:      return \"EXC_BREAKPOINT\";\n                    case EXC_CRASH:           return \"EXC_CRASH\";\n                    case EXC_EMULATION:       return \"EXC_EMULATION\";\n                    case EXC_MACH_SYSCALL:    return \"EXC_MACH_SYSCALL\";\n                    case EXC_RPC_ALERT:       return \"EXC_RPC_ALERT\";\n                    case EXC_SOFTWARE:        return \"EXC_SOFTWARE\";\n                    case EXC_SYSCALL:         return \"EXC_SYSCALL\";\n                };\n\n                return \"EXC_<unknown>\";\n            }\n            \n            static const char* GetMachExceptionIdString(uint64_t machExceptionId, uint64_t code0)\n            {\n                const char* id = \"<unknown>\";\n\n                #if defined(OVR_CPU_X86) || defined(OVR_CPU_X86_64)\n                    switch (machExceptionId)\n                    {\n                        case EXC_ARITHMETIC:\n                            switch (code0)\n                            {\n                                case EXC_I386_BOUND:     id = \"EXC_I386_BOUND\";     break;\n                                case EXC_I386_DIV:       id = \"EXC_I386_DIV\";       break;\n                                case EXC_I386_EMERR:     id = \"EXC_I386_EMERR\";     break;\n                                case EXC_I386_EXTERR:    id = \"EXC_I386_EXTERR\";    break;\n                                case EXC_I386_EXTOVR:    id = \"EXC_I386_EXTOVR\";    break;\n                                case EXC_I386_INTO:      id = \"EXC_I386_INTO\";      break;\n                                case EXC_I386_NOEXT:     id = \"EXC_I386_NOEXT\";     break;\n                                case EXC_I386_SSEEXTERR: id = \"EXC_I386_SSEEXTERR\"; break;\n                            }\n                            break;\n                            \n                        case EXC_BAD_INSTRUCTION:\n                            if(code0 == EXC_I386_INVOP)\n                                id = \"EXC_I386_INVOP\";\n                            break;\n                            \n                        case EXC_BREAKPOINT:\n                            if(code0 == EXC_I386_BPT)\n                                id = \"EXC_I386_BPT\";\n                            else if(code0 == EXC_I386_SGL)\n                                id = \"EXC_I386_SGL\";\n                            break;\n                    };\n                #else\n                    // To do.\n                #endif\n\n                return id;\n            }\n        };\n    \n        OVR::OVR_snprintf(exceptionInfo.exceptionDescription, OVR_ARRAY_COUNT(exceptionInfo.exceptionDescription), \n                            \"Mach exception type: %llu (%s)\\r\\n\", exceptionInfo.exceptionType, MachExceptionInfo::GetMachExceptionTypeString(exceptionInfo.exceptionType));\n    \n        OVR::OVR_snprintf(scratchBuffer, OVR_ARRAY_COUNT(scratchBuffer), \"CPU exception info: exception id: %u (%s), exception id error: %u, fault memory address: %p\\r\\n\",\n                            exceptionInfo.cpuExceptionId, MachExceptionInfo::GetCPUExceptionIdString(exceptionInfo.cpuExceptionId), exceptionInfo.cpuExceptionIdError, exceptionInfo.pExceptionMemoryAddress);\n        OVR::OVR_strlcat(exceptionInfo.exceptionDescription, scratchBuffer, OVR_ARRAY_COUNT(exceptionInfo.exceptionDescription));\n\n\n        OVR::OVR_snprintf(scratchBuffer, OVR_ARRAY_COUNT(scratchBuffer), \"Mach exception info: exception id: %llu (%s), 0x%llx (%llu)\\r\\n\", (uint64_t)exceptionInfo.machExceptionDetail[0],\n                           MachExceptionInfo::GetMachExceptionIdString(exceptionInfo.exceptionType, exceptionInfo.machExceptionDetail[0]),\n                           (uint64_t)exceptionInfo.machExceptionDetail[1], (uint64_t)exceptionInfo.machExceptionDetail[1]);\n        OVR::OVR_strlcat(exceptionInfo.exceptionDescription, scratchBuffer, OVR_ARRAY_COUNT(exceptionInfo.exceptionDescription));\n    #else\n        // To do.\n        exceptionInfo.exceptionDescription[0] = 0;\n    #endif\n}\n\n\nvoid ExceptionHandler::WriteReportLine(const char* pLine)\n{\n    fwrite(pLine, strlen(pLine), 1, file);\n}\n\n\nvoid ExceptionHandler::WriteReportLineF(const char* format, ...)\n{\n    va_list args;\n    va_start(args, format);\n    int length = OVR_vsnprintf(scratchBuffer, OVR_ARRAY_COUNT(scratchBuffer), format, args);\n    if(length >= (int)OVR_ARRAY_COUNT(scratchBuffer))     // If we didn't have enough space...\n        length = (OVR_ARRAY_COUNT(scratchBuffer) - 1);    // ... use what we have.\n    va_end(args);\n    \n    fwrite(scratchBuffer, length, 1, file);\n}\n\n\n// Thread <name> <handle> <id>\n// 0   <module> <address> <function> <file>:<line>\n// 1   <module> <address> <function> <file>:<line>\n// . . .\n//\nvoid ExceptionHandler::WriteThreadCallstack(ThreadHandle threadHandle, ThreadSysId threadSysId, const char* additionalInfo)\n{\n    // We intentionally do not directly use the SymbolInfo::ReportThreadCallstack function because that function allocates memory, \n    // which we cannot do due to possibly being within an exception handler.\n\n    // Print the header\n    char    threadName[32];\n    char    threadHandleStr[32];\n    char    threadSysIdStr[32];\n    char    stackBaseStr[24];\n    char    stackLimitStr[24];\n    char    stackCurrentStr[24];\n    void*   pStackBase;\n    void*   pStackLimit;\n    bool    isExceptionThread = (threadSysId == exceptionInfo.threadSysId);\n\n    #if defined(OVR_OS_MS) && (OVR_PTR_SIZE == 8)\n      void* pStackCurrent = (threadSysId == exceptionInfo.threadSysId) ? (void*)exceptionInfo.cpuContext.Rsp : nullptr; // We would need to suspend the thread, get its context, resume it, then read the rsp register. It turns out we are already doing that suspend/resume below in the backtrace call. \n    #elif defined(OVR_OS_MS)\n      void* pStackCurrent = (threadSysId == exceptionInfo.threadSysId) ? (void*)exceptionInfo.cpuContext.Esp : nullptr;\n    #elif defined(OVR_OS_MAC) && (OVR_PTR_SIZE == 8)\n      void* pStackCurrent = (threadSysId == exceptionInfo.threadSysId) ? (void*)exceptionInfo.cpuContext.threadState.uts.ts64.__rsp : nullptr;\n    #elif defined(OVR_OS_MAC)\n      void* pStackCurrent = (threadSysId == exceptionInfo.threadSysId) ? (void*)exceptionInfo.cpuContext.threadState.uts.ts32.__esp : nullptr;\n    #elif defined(OVR_OS_LINUX)\n      void* pStackCurrent = nullptr; // To do.\n    #endif\n\n    OVR::GetThreadStackBounds(pStackBase, pStackLimit, threadHandle);\n\n    OVR::Thread::GetThreadName(threadName, OVR_ARRAY_COUNT(threadName), threadName);\n    SprintfThreadHandle(threadHandleStr,  OVR_ARRAY_COUNT(threadHandleStr), threadHandle);\n    SprintfThreadSysId(threadSysIdStr, OVR_ARRAY_COUNT(threadSysIdStr), threadSysId);\n    SprintfAddress(stackBaseStr, OVR_ARRAY_COUNT(stackBaseStr), pStackBase);\n    SprintfAddress(stackLimitStr, OVR_ARRAY_COUNT(stackLimitStr), pStackLimit);\n    SprintfAddress(stackCurrentStr, OVR_ARRAY_COUNT(stackCurrentStr), pStackCurrent);\n\n    if(threadName[0])\n        WriteReportLineF(\"Thread \\\"%s\\\" handle: %s, id: %s, stack base: %s, stack limit: %s, stack current: %s, %s\\r\\n\", threadName, threadHandleStr, threadSysIdStr, stackBaseStr, stackLimitStr, stackCurrentStr, additionalInfo ? additionalInfo : \"\");\n    else\n        WriteReportLineF(\"Thread handle: %s, id: %s, stack base: %s, stack limit: %s, stack current: %s, %s\\r\\n\", threadHandleStr, threadSysIdStr, stackBaseStr, stackLimitStr, stackCurrentStr, additionalInfo ? additionalInfo : \"\");\n\n    // Print the backtrace info\n    void*       addressArray[64];\n    size_t      addressCount = symbolLookup.GetBacktraceFromThreadSysId(addressArray, OVR_ARRAY_COUNT(addressArray), 0, threadSysId);\n    SymbolInfo  symbolInfo;\n    const char* pModuleName;\n    size_t      backtraceSkipCount = 0;\n\n    if(isExceptionThread)\n    {\n        // If this thread is the exception thread, skip some frames.\n        #if defined(OVR_OS_MS)\n            size_t i, iEnd = MIN(16, addressCount);\n\n            for(i = 0; i < iEnd; i++)\n            {\n                symbolLookup.LookupSymbol((uint64_t)addressArray[i], symbolInfo);\n                if(strstr(symbolInfo.function, \"UserExceptionDispatcher\") != nullptr)\n                    break;\n            }\n\n            if(i < iEnd) // If found...\n                backtraceSkipCount = i;\n            else if(addressCount >= 9)      // Else default to 9, which is coincidentally what works.\n                backtraceSkipCount = 9;\n            else\n                backtraceSkipCount = 0;\n\n            addressArray[backtraceSkipCount] = exceptionInfo.pExceptionInstructionAddress;\n        #endif\n    }\n\n    if(addressCount == 0)\n    {\n        WriteReportLine(\"<Unable to read backtrace>\\r\\n\\r\\n\");\n    }\n    else\n    {\n        for(size_t i = backtraceSkipCount; i < addressCount; ++i)\n        {\n            symbolLookup.LookupSymbol((uint64_t)addressArray[i], symbolInfo);\n\n            if(symbolInfo.pModuleInfo && symbolInfo.pModuleInfo->name[0])\n                pModuleName = symbolInfo.pModuleInfo->name;\n            else\n                pModuleName = \"(unknown module)\";\n\n            char addressStr[24];\n            SprintfAddress(addressStr, OVR_ARRAY_COUNT(addressStr), addressArray[i]);\n\n            if(symbolInfo.filePath[0])\n                WriteReportLineF(\"%-2u %-24s %s %s+%d %s:%d\\r\\n%s\", (unsigned)i, pModuleName, addressStr,\n                                    symbolInfo.function, symbolInfo.functionOffset, symbolInfo.filePath,\n                                    symbolInfo.fileLineNumber, (i + 1) == addressCount ? \"\\r\\n\" : \"\");\n            else\n                WriteReportLineF(\"%-2u %-24s %s %s+%d\\r\\n%s\", (unsigned)i, pModuleName, addressStr,\n                                    symbolInfo.function, symbolInfo.functionOffset, (i + 1) == addressCount ? \"\\r\\n\" : \"\"); // If this is the last line, append another \\r\\n.\n        }\n    }\n}\n\n\nvoid ExceptionHandler::WriteReport()\n{\n    // It's important that we don't allocate any memory here if we can help it.\n    using namespace OVR;\n\n    if(strstr(reportFilePath, \"%s\")) // If the user-specified file path includes a date/time component...\n    {\n        char dateTimeBuffer[64];\n        FormatDateTime(dateTimeBuffer, OVR_ARRAY_COUNT(dateTimeBuffer), exceptionInfo.timeVal, true, true, false, true);\n        OVR_snprintf(reportFilePathActual, OVR_ARRAY_COUNT(reportFilePathActual), reportFilePath, dateTimeBuffer);\n    }\n    else\n    {\n        OVR_strlcpy(reportFilePathActual, reportFilePath, OVR_ARRAY_COUNT(reportFilePathActual));\n    }\n\n    file = fopen(reportFilePathActual, \"w\");\n    OVR_ASSERT(file != nullptr);\n    if(!file)\n        return;\n\n    symbolLookup.Initialize();\n\n    {\n        // Exception information\n        WriteReportLine(\"Exception Info\\r\\n\");\n\n        WriteReportLineF(\"Exception report file: %s\\r\\n\", reportFilePathActual);\n\n        #if defined(OVR_OS_MS)\n            if(miniDumpFilePath[0])\n                WriteReportLineF(\"Exception minidump file: %s\\r\\n\", minidumpFilePathActual);\n        #endif\n\n        char dateTimeBuffer[64];\n        FormatDateTime(dateTimeBuffer, OVR_ARRAY_COUNT(dateTimeBuffer), exceptionInfo.timeVal, true, true, false, false);\n        WriteReportLineF(\"Time (GMT): %s\\r\\n\", dateTimeBuffer);\n\n        FormatDateTime(dateTimeBuffer, OVR_ARRAY_COUNT(scratchBuffer), exceptionInfo.timeVal, true, true, true, false);\n        WriteReportLineF(\"Time (local): %s\\r\\n\", dateTimeBuffer);\n        WriteReportLineF(\"Thread name: %s\\r\\n\", exceptionInfo.threadName[0] ? exceptionInfo.threadName : \"(not available)\"); // It's never possible on Windows to get thread names, as they are stored in the debugger at runtime.\n\n        SprintfThreadHandle(scratchBuffer, OVR_ARRAY_COUNT(scratchBuffer), exceptionInfo.threadHandle);\n        OVR_strlcat(scratchBuffer, \"\\r\\n\", OVR_ARRAY_COUNT(scratchBuffer));\n        WriteReportLine(\"Thread handle: \");\n        WriteReportLine(scratchBuffer);\n\n        SprintfThreadSysId(scratchBuffer, OVR_ARRAY_COUNT(scratchBuffer), exceptionInfo.threadSysId);\n        OVR_strlcat(scratchBuffer, \"\\r\\n\", OVR_ARRAY_COUNT(scratchBuffer));\n        WriteReportLine(\"Thread sys id: \");\n        WriteReportLine(scratchBuffer);\n\n        char addressStr[24];\n        SprintfAddress(addressStr, OVR_ARRAY_COUNT(addressStr), exceptionInfo.pExceptionInstructionAddress);\n        WriteReportLineF(\"Exception instruction address: %s (see callstack below)\\r\\n\", addressStr);\n        WriteReportLineF(\"Exception description: %s\\r\\n\", exceptionInfo.exceptionDescription);\n\n        if(symbolLookup.LookupSymbol((uint64_t)exceptionInfo.pExceptionInstructionAddress, exceptionInfo.symbolInfo))\n        {\n            if(exceptionInfo.symbolInfo.filePath[0])\n                WriteReportLineF(\"Exception location: %s (%d)\\r\\n\", exceptionInfo.symbolInfo.filePath, exceptionInfo.symbolInfo.fileLineNumber);\n            else\n                WriteReportLineF(\"Exception location: %s (%d)\\r\\n\", exceptionInfo.symbolInfo.function, exceptionInfo.symbolInfo.functionOffset);\n        }\n\n        // To consider: print exceptionInfo.cpuContext registers \n    }\n\n    // OVR information\n    WriteReportLine(\"\\r\\nOVR Info\\r\\n\");\n    WriteReportLineF(\"OVR time: %f\\r\\n\", ovr_GetTimeInSeconds());\n    WriteReportLineF(\"OVR version: %s\\r\\n\", ovr_GetVersionString());\n\n    // OVR util information\n    // The following would be useful to use if they didn't allocate memory, which we can't do.\n    // To do: see if we can have versions of the functions below which don't allocate memory\n    // or allocate it safely (e.g. use an alternative heap).\n    // String OVR::GetDisplayDriverVersion();\n    // String OVR::GetCameraDriverVersion();\n\n    // OVR HMD information\n    WriteReportLine(\"\\r\\nOVR HMD Info\\r\\n\");\n\n    const OVR::List<OVR::CAPI::HMDState>& hmdStateList = OVR::CAPI::HMDState::GetHMDStateList();\n    const OVR::CAPI::HMDState* pHMDState = hmdStateList.GetFirst();\n    \n    if(hmdStateList.IsNull(pHMDState))\n    {\n        WriteReportLine(\"No HMDs found.\\r\\n\");\n    }\n\n    while(!hmdStateList.IsNull(pHMDState))\n    {\n        if(pHMDState->pProfile)\n        {\n            const char* user = pHMDState->pProfile->GetValue(OVR_KEY_USER);\n            \n            if(user)\n                WriteReportLineF(\"Profile user: %s\\r\\n\", reportPrivacyEnabled ? \"<disabled by report privacy settings>\" : user);\n            else\n                WriteReportLine(\"Null profile user\\r\\n\");\n\n            float NeckEyeDistance[2];\n            float EyeToNoseDistance[2];\n            float MaxEyeToPlateDist[2];\n            pHMDState->pProfile->GetFloatValues(OVR_KEY_NECK_TO_EYE_DISTANCE, NeckEyeDistance, 2);\n            pHMDState->pProfile->GetFloatValues(OVR_KEY_EYE_TO_NOSE_DISTANCE, EyeToNoseDistance, 2);\n            pHMDState->pProfile->GetFloatValues(OVR_KEY_MAX_EYE_TO_PLATE_DISTANCE, MaxEyeToPlateDist, 2);\n            \n            WriteReportLineF(\"Player height: %f, eye height: %f, IPD: %f, Neck eye distance: %f,%f, eye relief dial: %d, eye to nose distance: %f,%f, max eye to plate distance: %f,%f, custom eye render: %s\\r\\n\",\n                        pHMDState->pProfile->GetFloatValue(OVR_KEY_PLAYER_HEIGHT, 0.f),\n                        pHMDState->pProfile->GetFloatValue(OVR_KEY_EYE_HEIGHT, 0.f),\n                        pHMDState->pProfile->GetFloatValue(OVR_KEY_IPD, 0.f),\n                        NeckEyeDistance[0], NeckEyeDistance[1],\n                        pHMDState->pProfile->GetIntValue(OVR_KEY_EYE_RELIEF_DIAL, 0),\n                        EyeToNoseDistance[0], EyeToNoseDistance[1],\n                        MaxEyeToPlateDist[0], MaxEyeToPlateDist[1],\n                        pHMDState->pProfile->GetBoolValue(OVR_KEY_CUSTOM_EYE_RENDER, false) ? \"yes\" : \"no\");\n            \n            // Not currently used:\n            // OVR_KEY_NAME\n            // OVR_KEY_GENDER\n            // OVR_KEY_EYE_CUP\n            // OVR_KEY_CAMERA_POSITION\n        }\n        else\n        {\n            WriteReportLine(\"Null HMD profile\\r\\n\");\n        }\n        \n        if(pHMDState->pHmdDesc) // This should usually be true.\n        {\n            WriteReportLineF(\"HMD %d: Type: %u ProductName: %s, Manufacturer: %s VendorId: %d, ProductId: %d, SerialNumber: %s, FirmwareMajor: %d, FirmwareMinor: %d, Resolution: %dx%d, DisplayDeviceName: %s, DisplayId: %d\\r\\n\",\n                            0, (unsigned)pHMDState->pHmdDesc->Type, pHMDState->pHmdDesc->ProductName, pHMDState->pHmdDesc->Manufacturer, pHMDState->pHmdDesc->VendorId, \n                            pHMDState->pHmdDesc->ProductId, pHMDState->pHmdDesc->SerialNumber, pHMDState->pHmdDesc->FirmwareMajor, pHMDState->pHmdDesc->FirmwareMinor, \n                            pHMDState->pHmdDesc->Resolution.w, pHMDState->pHmdDesc->Resolution.h, pHMDState->pHmdDesc->DisplayDeviceName, pHMDState->pHmdDesc->DisplayId);\n\n            // HSW display state\n            ovrHSWDisplayState hswDS;\n            ovrHmd_GetHSWDisplayState(pHMDState->pHmdDesc, &hswDS);\n            WriteReportLineF(\"HSW displayed for hmd: %s\\r\\n\", hswDS.Displayed ? \"yes\" : \"no\");\n        }\n\n        char threadIdStr[24];\n        SprintfAddress(threadIdStr, OVR_ARRAY_COUNT(threadIdStr), pHMDState->BeginFrameThreadId);\n\n        WriteReportLineF(\"Hmd Caps: %x, Hmd Service Caps: %x, Latency test active: %s, Last frame time: %f, Last get frame time: %f, Rendering configred: %s, Begin frame called: %s, Begin frame thread id: %s\\r\\n\",\n                    pHMDState->EnabledHmdCaps, pHMDState->EnabledServiceHmdCaps, pHMDState->LatencyTestActive ? \"yes\" : \"no\", pHMDState->LastFrameTimeSeconds, pHMDState->LastGetFrameTimeSeconds, pHMDState->RenderingConfigured ? \"yes\" : \"no\",\n                    pHMDState->BeginFrameCalled ? \"yes\" : \"no\", threadIdStr);\n\n        if(pHMDState->pLastError)\n        {\n            WriteReportLineF(\"OVR last error for hmd: %s\\r\\n\", pHMDState->pLastError);\n        }\n\n        pHMDState = hmdStateList.GetNext(pHMDState);\n    }\n\n    #if defined(OVR_OS_WIN32)\n        {\n            WriteReportLine(\"\\r\\nApp Info\\r\\n\");\n\n            // Print the app path.\n            char appPath[MAX_PATH];\n            GetCurrentProcessFilePath(appPath, OVR_ARRAY_COUNT(appPath));\n            WriteReportLineF(\"Process path: %s\\r\\n\", appPath);\n\n            #if (OVR_PTR_SIZE == 4)\n                WriteReportLine(\"App format: 32 bit\\r\\n\");\n            #else\n                WriteReportLine(\"App format: 64 bit\\r\\n\");\n            #endif\n            \n            // Print the app version\n            wchar_t pathW[MAX_PATH] = {};\n            GetModuleFileNameW(0, pathW, (DWORD)OVR_ARRAY_COUNT(pathW));\n            DWORD dwUnused;\n            DWORD dwSize = GetFileVersionInfoSizeW(pathW, &dwUnused);\n            scratchBuffer[0] = 0;\n\n            if(dwSize > 0)\n            {\n                void* const pVersionData = SafeMMapAlloc(dwSize);\n\n                if(pVersionData)\n                {\n                    if(GetFileVersionInfoW(pathW, 0, dwSize, pVersionData))\n                    {\n                        VS_FIXEDFILEINFO* pFFI;\n                        UINT size;\n\n                        if(VerQueryValueA(pVersionData, \"\\\\\", (void**)&pFFI, &size))\n                        {\n                            WriteReportLineF(\"App version: %u.%u.%u.%u\\r\\n\",\n                                            HIWORD(pFFI->dwFileVersionMS), LOWORD(pFFI->dwFileVersionMS), \n                                            HIWORD(pFFI->dwFileVersionLS), LOWORD(pFFI->dwFileVersionLS));\n                        }\n                    }\n\n                    SafeMMapFree(pVersionData, dwSize);\n                }\n            }\n\n            if(!scratchBuffer[0]) // If version info couldn't be found or read...\n                WriteReportLine(\"App version info not present\\r\\n\");\n        }\n\n        {\n            WriteReportLine(\"\\r\\nSystem Info\\r\\n\");\n\n            OSVERSIONINFOEXW vi;\n            memset(&vi, 0, sizeof(vi));\n            vi.dwOSVersionInfoSize = sizeof(vi);\n            GetVersionExW((LPOSVERSIONINFOW)&vi); // Cast to the older type.\n\n            char osVersionName[256];\n            GetOSVersionName(osVersionName, OVR_ARRAY_COUNT(osVersionName));\n            WriteReportLineF(\"OS name: %s, version: %u.%u build %u, %s, platform id: %u, service pack: %ls\\r\\n\",\n                            osVersionName, vi.dwMajorVersion, vi.dwMinorVersion, vi.dwBuildNumber, Is64BitOS() ? \"64 bit\" : \"32 bit\",\n                            vi.dwPlatformId, vi.szCSDVersion[0] ? vi.szCSDVersion : L\"<none>\");\n\n            WriteReportLineF(\"Debugger present: %s\\r\\n\", OVRIsDebuggerPresent() ? \"yes\" : \"no\");\n\n            // System info\n            SYSTEM_INFO systemInfo;\n            GetNativeSystemInfo(&systemInfo);\n            \n            WriteReportLineF(\"Processor count: %u\\r\\n\", systemInfo.dwNumberOfProcessors);\n\n            // Windows Vista and later:\n            // BOOL WINAPI GetLogicalProcessorInformation(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer, PDWORD ReturnLength);\n\n            if(systemInfo.wProcessorArchitecture == 0)\n                WriteReportLineF(\"Processor type: x86\\r\\n\");\n            else if(systemInfo.wProcessorArchitecture == 9)\n                WriteReportLineF(\"Processor type: x86-64\\r\\n\");\n            else if(systemInfo.wProcessorArchitecture == 10)\n                WriteReportLineF(\"Processor type: x86 on x86-64\\r\\n\");\n\n            WriteReportLineF(\"Processor level: %u\\r\\n\", systemInfo.wProcessorLevel);\n            WriteReportLineF(\"Processor revision: %u\\r\\n\", systemInfo.wProcessorRevision);\n\n            // Memory information\n            MEMORYSTATUSEX memoryStatusEx;\n            memset(&memoryStatusEx, 0, sizeof(memoryStatusEx));\n            memoryStatusEx.dwLength = sizeof(memoryStatusEx);\n            GlobalMemoryStatusEx(&memoryStatusEx);\n\n            WriteReportLineF(\"Memory load: %d%%\\r\\n\", memoryStatusEx.dwMemoryLoad);\n            WriteReportLineF(\"Total physical memory: %I64d MiB\\r\\n\", memoryStatusEx.ullTotalPhys / (1024 * 1024)); // Or are Mebibytes equal to (1024 * 1000)\n            WriteReportLineF(\"Available physical memory: %I64d MiB\\r\\n\", memoryStatusEx.ullAvailPhys / (1024 * 1024));\n            WriteReportLineF(\"Total page file memory: %I64d MiB\\r\\n\", memoryStatusEx.ullTotalPageFile / (1024 * 1024));\n            WriteReportLineF(\"Available page file memory: %I64d MiB\\r\\n\", memoryStatusEx.ullAvailPageFile / (1024 * 1024));\n            WriteReportLineF(\"Total virtual memory: %I64d MiB\\r\\n\", memoryStatusEx.ullTotalVirtual / (1024 * 1024));\n            WriteReportLineF(\"Free virtual memory: %I64d MiB\\r\\n\", memoryStatusEx.ullAvailVirtual / (1024 * 1024));\n\n            DISPLAY_DEVICE dd; \n            memset(&dd, 0, sizeof(DISPLAY_DEVICE));\n            dd.cb = sizeof(DISPLAY_DEVICE);\n\n            for(int i = 0; EnumDisplayDevicesW(nullptr, (DWORD)i, &dd, EDD_GET_DEVICE_INTERFACE_NAME); ++i)\n            {\n                WriteReportLineF(\"Display Device %d name: %ls, context: %ls, primary: %s, mirroring: %s\\r\\n\",\n                             i, dd.DeviceName, dd.DeviceString, (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) ? \"yes\" : \"no\", (dd.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) ? \"yes\" : \"no\");\n            }\n        }\n\n        // Print video card information\n        // http://msdn.microsoft.com/en-us/library/aa394512%28v=vs.85%29.aspx\n        {\n            IWbemLocator*         pIWbemLocator = nullptr;\n            BSTR                  bstrServer = nullptr;\n            IWbemServices*        pIWbemServices = nullptr;\n            BSTR                  bstrWQL  = nullptr;\n            BSTR                  bstrPath = nullptr;\n            IEnumWbemClassObject* pEnum = nullptr;\n\n            CoInitializeEx(nullptr, COINIT_MULTITHREADED);\n\n            HRESULT hr = CoCreateInstance(__uuidof(WbemLocator), nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWbemLocator), (LPVOID*)&pIWbemLocator);\n            if(FAILED(hr))\n                goto End;\n\n            bstrServer = SysAllocString(L\"\\\\\\\\.\\\\root\\\\cimv2\");\n            hr = pIWbemLocator->ConnectServer(bstrServer, nullptr, nullptr, 0L, 0L, nullptr, nullptr, &pIWbemServices);\n            if(FAILED(hr))\n                goto End;\n\n            hr = CoSetProxyBlanket(pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, nullptr, RPC_C_AUTHN_LEVEL_CALL,\n                                    RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, EOAC_DEFAULT);\n            if(FAILED(hr))\n                goto End;\n\n            bstrWQL  = SysAllocString(L\"WQL\");\n            bstrPath = SysAllocString(L\"select * from Win32_VideoController\");\n            hr = pIWbemServices->ExecQuery(bstrWQL, bstrPath, WBEM_FLAG_FORWARD_ONLY, nullptr, &pEnum);\n            if(FAILED(hr))\n                goto End;\n\n            ULONG uReturned;\n            IWbemClassObject* pObj = nullptr;\n            hr = pEnum->Next(WBEM_INFINITE, 1, &pObj, &uReturned);\n            if(FAILED(hr))\n                goto End;\n\n            WriteReportLine(\"\\r\\nDisplay adapter list\\r\\n\");\n\n            for(unsigned i = 0; SUCCEEDED(hr) && uReturned; i++)\n            {\n                char    sString[256];\n                VARIANT var;\n\n                if(i > 0)\n                    WriteReportLine(\"\\r\\n\");\n\n                WriteReportLineF(\"Info for display adapter %u\\r\\n\", i);\n\n                hr = pObj->Get(L\"Name\", 0, &var, nullptr, nullptr);\n                if(SUCCEEDED(hr))\n                {\n                    WideCharToMultiByte(CP_ACP, 0, var.bstrVal, -1, sString, sizeof(sString), nullptr, nullptr);\n                    WriteReportLineF(\"Display Adapter Name: %s\\r\\n\", sString);\n                }\n\n                hr = pObj->Get(L\"AdapterRAM\", 0, &var, nullptr, nullptr);\n                if(SUCCEEDED(hr))\n                {\n                    WriteReportLineF(\"Display Adapter RAM: %u %s\\r\\n\",\n                            ((uint32_t)var.lVal > (1024*1024*1024) ? (uint32_t)var.lVal/(1024*1024*1024) : (uint32_t)var.lVal/(1024*1024)), ((uint32_t)var.lVal > (1024*1024*1024) ? \"GiB\" : \"MiB\"));\n                }\n\n                hr = pObj->Get(L\"DeviceID\", 0, &var, nullptr, nullptr);\n                if(SUCCEEDED(hr))\n                {\n                    WideCharToMultiByte(CP_ACP, 0, var.bstrVal, -1, sString, sizeof(sString), nullptr, nullptr);\n                    WriteReportLineF(\"Display Adapter DeviceID: %s\\r\\n\", sString);\n                }\n\n                hr = pObj->Get(L\"DriverVersion\", 0, &var, nullptr, nullptr);\n                if(SUCCEEDED(hr))\n                {\n                    WideCharToMultiByte(CP_ACP, 0, var.bstrVal, -1, sString, sizeof(sString), nullptr, nullptr);\n                    WriteReportLineF(\"Display Adapter DriverVersion: %s\\r\\n\", sString);\n                }\n\n                hr = pObj->Get(L\"DriverDate\", 0, &var, nullptr, nullptr);\n                if(SUCCEEDED(hr))\n                {\n                    // http://technet.microsoft.com/en-us/library/ee156576.aspx\n                    wchar_t year[5] = { var.bstrVal[0], var.bstrVal[1], var.bstrVal[2], var.bstrVal[3], 0 };\n                    wchar_t month[3] = { var.bstrVal[4], var.bstrVal[5], 0 };\n                    wchar_t monthDay[3] = { var.bstrVal[6], var.bstrVal[7], 0 };\n                    \n                    WriteReportLineF(\"Display Adapter DriverDate (US format): %ls/%ls/%ls\\r\\n\", month, monthDay, year);\n                }\n\n                // VideoProcessor\n                hr = pObj->Get(L\"VideoProcessor\", 0, &var, nullptr, nullptr);\n                if(SUCCEEDED(hr))\n                {\n                    WideCharToMultiByte(CP_ACP, 0, var.bstrVal, -1, sString, sizeof(sString), nullptr, nullptr);\n                    WriteReportLineF(\"Display Adapter VideoProcessor %s\\r\\n\", sString);\n                }\n\n                hr = pObj->Get(L\"VideoModeDescription\", 0, &var, nullptr, nullptr);\n                if(SUCCEEDED(hr))\n                {\n                    WideCharToMultiByte(CP_ACP, 0, var.bstrVal, -1, sString, sizeof(sString), nullptr, nullptr);\n                    WriteReportLineF(\"Display Adapter VideoModeDescription: %s\\r\\n\", sString);\n                }\n\n                pObj->Release();\n\n                hr = pEnum->Next(WBEM_INFINITE, 1, &pObj, &uReturned);\n            }\n\n            End:\n            if(pEnum)\n                pEnum->Release();\n            if(bstrPath)\n                SysFreeString(bstrPath);\n            if(bstrWQL)\n                SysFreeString(bstrWQL);\n            if(pIWbemServices)\n                pIWbemServices->Release();\n            if(bstrServer)\n                SysFreeString(bstrServer);\n            if(pIWbemLocator)\n                pIWbemLocator->Release();\n\n            CoUninitialize();\n        }\n\n        {\n            // Print a list of threads.\n            DWORD  currentProcessId = GetCurrentProcessId();\n            HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, currentProcessId); // ICreateToolhelp32Snapshot actually ignores currentProcessId.\n        \n            if(hThreadSnap != INVALID_HANDLE_VALUE) \n            {\n                THREADENTRY32 te32;\n                te32.dwSize = sizeof(THREADENTRY32); \n\n                if(Thread32First(hThreadSnap, &te32)) \n                {\n                    WriteReportLine(\"\\r\\nThread list\\r\\n\");\n\n                    do {\n                        if(te32.th32OwnerProcessID == currentProcessId)\n                        {\n                            HANDLE hThread = ConvertThreadSysIdToThreadHandle(te32.th32ThreadID);\n\n                            if(hThread)\n                            {\n                                char buffer[96]; // Can't use scratchBuffer, because it's used by WriteThreadCallstack.\n                                OVR_snprintf(buffer, OVR_ARRAY_COUNT(buffer), \"base priority: %ld, delta priority: %ld\", te32.tpBasePri, te32.tpDeltaPri);\n \n                                bool threadIsExceptionThread = (te32.th32ThreadID == (DWORD)exceptionInfo.threadSysId);\n                                if(threadIsExceptionThread)\n                                    OVR_strlcat(buffer, \", exception thread\", OVR_ARRAY_COUNT(buffer));\n\n                                WriteThreadCallstack(hThread, (OVR::ThreadSysId)te32.th32ThreadID, buffer);\n                                FreeThreadHandle(hThread);\n                            }\n                        }\n                    } while(Thread32Next(hThreadSnap, &te32));\n                }\n            \n                CloseHandle(hThreadSnap);\n            }\n        }\n\n        {\n            // Print a list of the current modules within this process.\n            // DbgHelp.dll also provides a EnumerateLoadedModules64 function.\n            // To do: Convert the code below to use the GetModuleInfoArray function which we now have.\n            #if defined(OVR_OS_CONSOLE)\n                struct MODULEINFO {\n                    LPVOID lpBaseOfDll;\n                    DWORD  SizeOfImage;\n                    LPVOID EntryPoint;\n                };\n                HMODULE hModule = LoadLibraryW(L\"toolhelpx.dll\");\n            #else\n                HMODULE hModule = LoadLibraryW(L\"psapi.dll\");\n            #endif\n\n            if(hModule)\n            {\n                typedef BOOL  (WINAPI * ENUMPROCESSMODULES)  (HANDLE hProcess, HMODULE* phModule, DWORD cb, LPDWORD lpcbNeeded);\n                typedef DWORD (WINAPI * GETMODULEBASENAME)   (HANDLE hProcess, HMODULE hModule, LPWSTR lpFilename, DWORD nSize);\n                typedef DWORD (WINAPI * GETMODULEFILENAMEEX) (HANDLE hProcess, HMODULE hModule, LPWSTR lpFilename, DWORD nSize);\n                typedef BOOL  (WINAPI * GETMODULEINFORMATION)(HANDLE hProcess, HMODULE hModule, MODULEINFO* pmi, DWORD nSize);\n\n                #if defined(OVR_OS_CONSOLE)\n                    ENUMPROCESSMODULES   pEnumProcessModules   = (ENUMPROCESSMODULES)  (uintptr_t)GetProcAddress(hModule, \"K32EnumProcessModules\");\n                    GETMODULEBASENAME    pGetModuleBaseName    = (GETMODULEBASENAME)   (uintptr_t)GetProcAddress(hModule, \"K32GetModuleBaseNameW\");\n                    GETMODULEFILENAMEEX  pGetModuleFileNameEx  = (GETMODULEFILENAMEEX) (uintptr_t)GetProcAddress(hModule, \"K32GetModuleFileNameExW\");\n                    GETMODULEINFORMATION pGetModuleInformation = (GETMODULEINFORMATION)(uintptr_t)GetProcAddress(hModule, \"K32GetModuleInformation\");\n                #else\n                    ENUMPROCESSMODULES   pEnumProcessModules   = (ENUMPROCESSMODULES)  (uintptr_t)GetProcAddress(hModule, \"EnumProcessModules\");\n                    GETMODULEBASENAME    pGetModuleBaseName    = (GETMODULEBASENAME)   (uintptr_t)GetProcAddress(hModule, \"GetModuleBaseNameW\");\n                    GETMODULEFILENAMEEX  pGetModuleFileNameEx  = (GETMODULEFILENAMEEX) (uintptr_t)GetProcAddress(hModule, \"GetModuleFileNameExW\");\n                    GETMODULEINFORMATION pGetModuleInformation = (GETMODULEINFORMATION)(uintptr_t)GetProcAddress(hModule, \"GetModuleInformation\");\n                #endif\n\n                HANDLE  hProcess = GetCurrentProcess();\n                HMODULE hModuleArray[200];\n                DWORD   cbNeeded;\n\n                if(pEnumProcessModules(hProcess, hModuleArray, sizeof(hModuleArray), &cbNeeded))\n                {\n                    size_t actualModuleCount = (cbNeeded / sizeof(HMODULE));\n\n                    if(actualModuleCount > OVR_ARRAY_COUNT(hModuleArray))  //If hModuleArray's capacity was not enough...\n                        actualModuleCount = OVR_ARRAY_COUNT(hModuleArray);\n\n                    // Print a header\n                    WriteReportLine(\"\\r\\nModule list\\r\\n\");\n\n                    #if (OVR_PTR_SIZE == 4)\n                        WriteReportLine(\"Base        Size       Entrypoint Name                     Path\\r\\n\");\n                    #else\n                        WriteReportLine(\"Base                Size               Entrypoint         Name                     Path\\r\\n\");\n                    #endif\n\n                    // And go through the list one by one\n                    for(size_t i = 0; i < actualModuleCount; i++)\n                    {\n                        MODULEINFO mi;\n                        size_t     length;\n\n                        if(!pGetModuleInformation(hProcess, hModuleArray[i], &mi, sizeof(mi)))\n                        {\n                            mi.EntryPoint  = nullptr;\n                            mi.lpBaseOfDll = nullptr;\n                            mi.SizeOfImage = 0;\n                        }\n\n                        // Write the base name.\n                        wchar_t name[MAX_PATH + 3];\n                        name[0] = '\"';\n                        if(pGetModuleBaseName(hProcess, hModuleArray[i], name + 1, MAX_PATH))\n                            length = wcslen(name);\n                        else\n                        {\n                            wcscpy(name + 1, L\"(unknown)\");\n                            length = 10;\n                        }\n\n                        name[length] = '\"';\n                        name[length + 1] = '\\0';\n\n                        // Write the path\n                        wchar_t path[MAX_PATH + 3];\n                        path[0] = '\"';\n                        if(pGetModuleFileNameEx(hProcess, hModuleArray[i], path + 1, MAX_PATH))\n                            length = wcslen(path);\n                        else\n                        {\n                            wcscpy(path + 1, L\"(unknown)\");\n                            length = 10;\n                        }\n                        path[length]     = '\"';\n                        path[length + 1] = '\\0';\n\n                        #if (OVR_PTR_SIZE == 4)\n                            WriteReportLineF(\"0x%08x, 0x%08x 0x%08x %-24ls %ls\\r\\n\", (uint32_t)mi.lpBaseOfDll, (uint32_t)mi.SizeOfImage, (uint32_t)mi.EntryPoint, name, path);\n                        #else\n                            WriteReportLineF(\"0x%016I64x 0x%016I64x 0x%016I64x %-24ls %ls\\r\\n\", (uint64_t)mi.lpBaseOfDll, (uint64_t)mi.SizeOfImage, (uint64_t)mi.EntryPoint, name, path);\n                        #endif\n                    }\n                }\n            }\n        }\n\n        {\n            // Print a list of processes.\n            // DbgHelp.dll provides a SymEnumProcesses function, but it's available with DbgHelp.dll v6.2 which doesn't ship with Windows until Windows 8.\n            WriteReportLine(\"\\r\\nProcess list\\r\\n\");\n            \n            if(reportPrivacyEnabled)\n                WriteReportLine(\"Disabled by report privacy settings\\r\\n\");\n            else\n            {\n                HANDLE hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);\n\n                if(hProcessSnapshot != INVALID_HANDLE_VALUE)\n                {\n                    PROCESSENTRY32W pe32;\n                    memset(&pe32, 0, sizeof(pe32));\n                    pe32.dwSize = sizeof(pe32);\n\n                    if(Process32FirstW(hProcessSnapshot, &pe32))\n                    {\n                        WriteReportLine(\"Process Id File\\r\\n\");\n\n                        do {\n                            // Try to get the full path to the process, as pe32.szExeFile holds only the process file name.\n                            // This will typically fail with a privilege error unless this process has debug privileges: http://support.microsoft.com/kb/131065/en-us\n                            wchar_t filePathW[MAX_PATH];\n                            const wchar_t* pFilePathW = pe32.szExeFile;\n                            HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pe32.th32ProcessID); // With Windows Vista+ we can use PROCESS_QUERY_LIMITED_INFORMATION.\n                            if(hProcess)\n                            {\n                                if(GetProcessImageFileName(hProcess, filePathW, (DWORD)OVR_ARRAY_COUNT(filePathW)))\n                                    pFilePathW = filePathW;\n                            }\n\n                            WriteReportLineF(\"0x%08x %ls\\r\\n\", pe32.th32ProcessID, pFilePathW);\n                        } while(Process32NextW(hProcessSnapshot, &pe32));\n                    }\n\n                    CloseHandle(hProcessSnapshot);\n                }\n                else\n                {\n                    WriteReportLine(\"Unable to read process list\\r\\n\");\n                }\n            }\n        }\n\n    #elif defined(OVR_OS_APPLE)    \n\n        WriteReportLine(\"\\r\\nApp Info\\r\\n\");\n    \n        // App path\n        const pid_t processId = getpid();\n        WriteReportLineF(\"Process id: \", \"%lld (0x%llx)\\r\\n\", (int64_t)processId, (int64_t)processId);\n\n        char appPath[PATH_MAX];\n        GetCurrentProcessFilePath(appPath, OVR_ARRAY_COUNT(appPath));\n        WriteReportLineF(\"Process path: %s\\r\\n\", appPath);\n\n        #if (OVR_PTR_SIZE == 4)\n            WriteReportLine(\"App format: 32 bit\\r\\n\");\n        #else\n            WriteReportLine(\"App format: 64 bit\\r\\n\");\n        #endif\n            \n        // App version\n        // To do.\n\n        // System Info\n        WriteReportLine(\"\\r\\nSystem Info\\r\\n\");\n\n        char osVersionName[256];\n        GetOSVersionName(osVersionName, OVR_ARRAY_COUNT(osVersionName));\n        WriteReportLineF(\"OS name: %s, %s\\r\\n\", osVersionName, Is64BitOS() ? \"64 bit\" : \"32 bit\");\n\n        int     name[2];\n        int     intValue;\n        size_t  length;\n        char    tempBuffer[256];\n\n        name[0] = CTL_KERN;\n        name[1] = KERN_OSTYPE;\n        length = sizeof(tempBuffer);\n        tempBuffer[0] = 0;\n        if(sysctl(name, 2, tempBuffer, &length, nullptr, 0) == 0)\n        {\n            WriteReportLineF(\"KERN_OSTYPE: %s\\r\\n\", tempBuffer);\n        }\n    \n        name[0] = CTL_KERN;\n        name[1] = KERN_OSREV;\n        length = sizeof(intValue);\n        intValue = 0;\n        if(sysctl(name, 2, &intValue, &length, nullptr, 0) == 0)\n        {\n            WriteReportLineF(\"KERN_OSREV: %d\\r\\n\", intValue);\n        }\n    \n        name[0] = CTL_KERN;\n        name[1] = KERN_OSRELEASE;\n        length = sizeof(tempBuffer);\n        tempBuffer[0] = 0;\n        if(sysctl(name, 2, tempBuffer, &length, nullptr, 0) == 0)\n            WriteReportLineF(\"KERN_OSRELEASE: %s\\r\\n\", tempBuffer);\n\n        name[0] = CTL_HW;\n        name[1] = HW_MACHINE;\n        length = sizeof(tempBuffer);\n        tempBuffer[0] = 0;\n        if(sysctl(name, 2, tempBuffer, &length, nullptr, 0) == 0)\n            WriteReportLineF(\"HW_MACHINE: %s\\r\\n\", tempBuffer);\n\n        name[0] = CTL_HW;\n        name[1] = HW_MODEL;\n        length = sizeof(tempBuffer);\n        tempBuffer[0] = 0;\n        if(sysctl(name, 2, tempBuffer, &length, nullptr, 0) == 0)\n            WriteReportLineF(\"sHW_MODEL: %s\\r\\n\", tempBuffer);\n\n        name[0] = CTL_HW;\n        name[1] = HW_NCPU;\n        length = sizeof(intValue);\n        intValue = 0;\n        if(sysctl(name, 2, &intValue, &length, nullptr, 0) == 0)\n            WriteReportLineF(\"HW_NCPU: %d\\r\\n\", intValue);\n\n        length = sizeof(tempBuffer);\n        tempBuffer[0] = 0;\n        if(sysctlbyname(\"machdep.cpu.brand_string\", &tempBuffer, &length, nullptr, 0) == 0)\n            WriteReportLineF(\"machdep.cpu.brand_string: %s\\r\\n\", tempBuffer);\n\n        length = sizeof(tempBuffer);\n        tempBuffer[0] = 0;\n        if(sysctlbyname(\"hw.acpi.thermal.tz0.temperature\", &tempBuffer, &length, nullptr, 0) == 0)\n            WriteReportLineF(\"hw.acpi.thermal.tz0.temperature: %s\\r\\n\", tempBuffer);\n\n        host_basic_info_data_t hostinfo;\n        mach_msg_type_number_t count = HOST_BASIC_INFO_COUNT;\n        kern_return_t          kr = host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostinfo, &count);\n\n        if(kr == KERN_SUCCESS)\n        {\n            const uint64_t memoryMib = (uint64_t)hostinfo.max_mem / (1024 * 1024);\n            WriteReportLineF(\"System memory: %lld Mib (%.1f Gib)\\r\\n\", memoryMib, (double)memoryMib / 1024);\n        }\n    \n        // Video card info\n        // To do.\n    \n        // Thread list\n        mach_port_t             taskSelf   = mach_task_self();\n        thread_act_port_array_t threadArray;\n        mach_msg_type_number_t  threadCount;\n        \n        kern_return_t result = task_threads(taskSelf, &threadArray, &threadCount);\n        \n        if(result == KERN_SUCCESS)\n        {\n            WriteReportLine(\"\\r\\nThread list\\r\\n\");\n\n            for(mach_msg_type_number_t i = 0; i < threadCount; i++)\n            {\n                union TBIUnion{\n                    natural_t words[THREAD_INFO_MAX];\n                    thread_basic_info tbi;\n                };\n\n                TBIUnion    tbiUnion;\n                mach_port_t thread = threadArray[i];\n                pthread_t   pthread = pthread_from_mach_thread_np(thread); // We assume the thread was created through pthreads.\n\n                char threadState[32] = \"unknown\";\n                mach_msg_type_number_t threadInfoCount = THREAD_INFO_MAX;\n                result = thread_info(thread, THREAD_BASIC_INFO, (thread_info_t)&tbiUnion, &threadInfoCount);\n\n                if(result == KERN_SUCCESS)\n                {\n                    const char* state;\n                    \n                    switch (tbiUnion.tbi.run_state)\n                    {\n                        case TH_STATE_HALTED:          state = \"halted\";          break;\n                        case TH_STATE_RUNNING:         state = \"running\";         break;\n                        case TH_STATE_STOPPED:         state = \"stopped\";         break;\n                        case TH_STATE_UNINTERRUPTIBLE: state = \"uninterruptible\"; break;\n                        case TH_STATE_WAITING:         state = \"waiting\";         break;\n                        default:                       state = \"<unknown>\";       break;\n                    }\n                    \n                    OVR_snprintf(threadState, OVR_ARRAY_COUNT(threadState), \"%s\", state);\n                    if(tbiUnion.tbi.flags & TH_FLAGS_IDLE)\n                        OVR_strlcat(threadState, \", idle\", sizeof(threadState));\n                    if(tbiUnion.tbi.flags & TH_FLAGS_SWAPPED)\n                        OVR_strlcat(threadState, \", swapped\", sizeof(threadState));\n                }\n\n                thread_identifier_info threadIdentifierInfo; \n                memset(&threadIdentifierInfo, 0, sizeof(threadIdentifierInfo));\n\n                mach_msg_type_number_t threadIdentifierInfoCount = THREAD_IDENTIFIER_INFO_COUNT;\n                thread_info(thread, THREAD_IDENTIFIER_INFO, (thread_info_t)&threadIdentifierInfo, &threadIdentifierInfoCount);\n\n                proc_threadinfo procThreadInfo; \n                memset(&procThreadInfo, 0, sizeof(procThreadInfo));\n                result = proc_pidinfo(processId, PROC_PIDTHREADINFO, threadIdentifierInfo.thread_handle, &procThreadInfo, sizeof(procThreadInfo));\n                OVR_UNUSED(result);\n                \n                char buffer[256]; // Can't use scratchBuffer, because it's used by WriteThreadCallstack.\n                OVR_snprintf(buffer, OVR_ARRAY_COUNT(buffer), \"state: %s, suspend count: %d, kernel priority: %d\", threadState, (int)tbiUnion.tbi.suspend_count, (int)procThreadInfo.pth_curpri);\n                \n                bool threadIsExceptionThread = (thread == exceptionInfo.threadSysId);\n                if(threadIsExceptionThread)\n                    OVR_strlcat(buffer, \", exception thread\", OVR_ARRAY_COUNT(buffer));\n                \n                WriteThreadCallstack(pthread, thread, buffer);\n            }\n            \n            vm_deallocate(taskSelf, (vm_address_t)threadArray, threadCount * sizeof(thread_act_t));\n        }\n    \n    \n        WriteReportLine(\"\\r\\nModule list\\r\\n\");\n\n        const size_t mifCapacity  = 256;\n        const size_t mifAllocSize = mifCapacity * sizeof(ModuleInfo);\n        ModuleInfo* moduleInfoArray = (ModuleInfo*)SafeMMapAlloc(mifAllocSize);\n    \n        if(moduleInfoArray)\n        {\n            #if (OVR_PTR_SIZE == 4)\n                WriteReportLine(\"Base        Size       Name                     Path\\r\\n\");\n            #else\n                WriteReportLine(\"Base                Size               Name                     Path\\r\\n\");\n            #endif\n\n            size_t moduleCount = symbolLookup.GetModuleInfoArray(moduleInfoArray, mifCapacity);\n            if(moduleCount > mifCapacity)\n                moduleCount = mifCapacity;\n            \n            for(size_t i = 0; i < moduleCount; i++)\n            {\n                const ModuleInfo& mi = moduleInfoArray[i];\n                \n                #if (OVR_PTR_SIZE == 4)\n                    WriteReportLineF(\"0x%08x, 0x%08x %-24s %s\\r\\n\", (uint32_t)mi.baseAddress, (uint32_t)mi.size, mi.name, mi.filePath);\n                #else\n                    WriteReportLineF(\"0x%016llx 0x%016llx %-24s %s\\r\\n\", (uint64_t)mi.baseAddress, (uint64_t)mi.size, mi.name, mi.filePath);\n                #endif\n            }\n            \n            SafeMMapFree(moduleInfoArray, mifAllocSize);\n        }\n    \n    \n        WriteReportLine(\"\\r\\nProcess list\\r\\n\");\n    \n        if(reportPrivacyEnabled)\n            WriteReportLine(\"Disabled by report privacy settings\\r\\n\");\n        else\n        {\n            WriteReportLine(\"Process Id File\\r\\n\");\n\n            pid_t pidArray[1024];\n            int   processCount = proc_listpids(PROC_ALL_PIDS, 0, pidArray, sizeof(pidArray)); // Important that we use sizeof not OVR_ARRAY_COUNT.\n            char  processFilePath[PATH_MAX];\n\n            for(int i = 0; i < processCount; i++)\n            {\n                if(proc_pidpath(pidArray[i], processFilePath, sizeof(processFilePath)) > 0)\n                    WriteReportLineF(\"%-10d %s\\r\\n\", pidArray[i], processFilePath);\n            }\n            \n            if(!processCount)\n                WriteReportLine(\"Unable to read process list\\r\\n\");\n        }\n\n\t#elif defined(OVR_OS_UNIX)\n         Is64BitOS();\n         GetCurrentProcessFilePath(nullptr, 0);\n         GetFileNameFromPath(nullptr);\n         GetOSVersionName(nullptr, 0);\n\n    #endif // OVR_OS_MS\n\n    symbolLookup.Shutdown();\n\n    fclose(file);\n    file = nullptr;\n}\n\n\nvoid ExceptionHandler::WriteMiniDump()\n{\n    if(strstr(miniDumpFilePath, \"%s\")) // If the user-specified file path includes a date/time component...\n    {\n        char dateTimeBuffer[64];\n        FormatDateTime(dateTimeBuffer, OVR_ARRAY_COUNT(dateTimeBuffer), exceptionInfo.timeVal, true, true, false, true);\n        OVR_snprintf(minidumpFilePathActual, OVR_ARRAY_COUNT(minidumpFilePathActual), miniDumpFilePath, dateTimeBuffer);\n    }\n    else\n    {\n        OVR_strlcpy(minidumpFilePathActual, miniDumpFilePath, OVR_ARRAY_COUNT(minidumpFilePathActual));\n    }\n\n    #if defined(OVR_OS_WIN32) || defined(OVR_OS_WIN64) || (defined(OVR_OS_MS) && defined(OVR_OS_CONSOLE))\n        #if defined(OVR_OS_CONSOLE)\n            typedef BOOL (WINAPI * MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD ProcessId, HANDLE hFile, MINIDUMP_TYPE dumpType, CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, CONST PVOID                          CallbackParam);\n            HMODULE hModuleDbgHelp = LoadLibraryW(L\"toolhelpx.dll\");\n        #else\n            typedef BOOL (WINAPI * MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD ProcessId, HANDLE hFile, MINIDUMP_TYPE dumpType, CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);\n            HMODULE hModuleDbgHelp = LoadLibraryW(L\"DbgHelp.dll\");\n        #endif\n\n        MINIDUMPWRITEDUMP pMiniDumpWriteDump = hModuleDbgHelp ? (MINIDUMPWRITEDUMP)(void*)GetProcAddress(hModuleDbgHelp, \"MiniDumpWriteDump\") : nullptr;\n\n        if(pMiniDumpWriteDump)\n        {\n            wchar_t miniDumpFilePathW[OVR_MAX_PATH];\n            OVR::UTF8Util::DecodeString(miniDumpFilePathW, minidumpFilePathActual, -1); // Problem: DecodeString provides no way to specify the destination capacity.\n\n            HANDLE hFile = CreateFileW(miniDumpFilePathW, GENERIC_READ | GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH, 0);\n\n            if(hFile != INVALID_HANDLE_VALUE)\n            {\n                MINIDUMP_EXCEPTION_INFORMATION minidumpExceptionInfo = { ::GetCurrentThreadId(), pExceptionPointers, TRUE };\n\n                #if defined(OVR_OS_CONSOLE)\n                    BOOL result = pMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile,\n                                                     (MINIDUMP_TYPE)miniDumpType, &exceptionInfo, \n                                                     (CONST PMINIDUMP_USER_STREAM_INFORMATION)nullptr, nullptr);\n                #else\n                    BOOL result = pMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile,\n                                                     (MINIDUMP_TYPE)miniDumpFlags, &minidumpExceptionInfo, \n                                                     (CONST PMINIDUMP_USER_STREAM_INFORMATION)nullptr, (CONST PMINIDUMP_CALLBACK_INFORMATION)nullptr);\n                #endif\n\n                OVR_ASSERT_AND_UNUSED(result, result);\n                CloseHandle(hFile);\n                hFile = 0;\n            }\n            else\n            {\n                OVR_ASSERT(pMiniDumpWriteDump);  // OVR_FAIL_F((\"ExceptionHandler::WriteMiniDump: Failed to create minidump file at %s\", minidumpFilePathActual));\n            } \n        }\n\n        FreeLibrary(hModuleDbgHelp);\n    #else\n        // Some platforms support various forms or exception reports and core dumps which are automatically generated upon us\n        // returning from our own exception handling. We might want to put something here if we are using a custom version of\n        // this, such as Google Breakpad.\n    #endif\n}\n\n\nvoid ExceptionHandler::SetExceptionListener(ExceptionListener* pExceptionListener, uintptr_t userValue)\n{\n    exceptionListener = pExceptionListener;\n    exceptionListenerUserValue = userValue;\n}\n\n\nvoid ExceptionHandler::SetAppDescription(const char* pAppDescription)\n{\n    appDescription = pAppDescription;\n}\n\n\nvoid ExceptionHandler::SetExceptionPaths(const char* exceptionReportPath, const char* exceptionMiniDumpFilePath)\n{\n    char tempPath[OVR_MAX_PATH];\n\n    if(exceptionReportPath)\n    {\n        if(OVR_stricmp(exceptionReportPath, \"default\") == 0)\n        {\n            GetUserDocumentsDirectory(tempPath, OVR_ARRAY_COUNT(tempPath));\n            OVR::OVR_strlcat(tempPath, \"Exception Report (%s).txt\", OVR_ARRAY_COUNT(tempPath));\n            exceptionReportPath = tempPath;\n        }\n\n        OVR_strlcpy(reportFilePath, exceptionReportPath, OVR_ARRAY_COUNT(reportFilePath));\n    }\n    else\n    {\n        reportFilePath[0] = '\\0';\n    }\n    \n    if(exceptionMiniDumpFilePath)\n    {\n        if(OVR_stricmp(exceptionMiniDumpFilePath, \"default\") == 0)\n        {\n            GetUserDocumentsDirectory(tempPath, OVR_ARRAY_COUNT(tempPath));\n            OVR::OVR_strlcat(tempPath, \"Exception Minidump (%s).mdmp\", OVR_ARRAY_COUNT(tempPath));\n            exceptionMiniDumpFilePath = tempPath;\n        }\n\n        OVR_strlcpy(miniDumpFilePath, exceptionMiniDumpFilePath, OVR_ARRAY_COUNT(miniDumpFilePath));\n    }\n    else\n    {\n        miniDumpFilePath[0] = '\\0';\n    }\n}\n\n\nvoid ExceptionHandler::SetCodeBaseDirectoryPaths(const char* codeBaseDirectoryPathArray[], size_t codeBaseDirectoryPathCount)\n{\n    for(size_t i = 0, iCount = OVR::Alg::Min<size_t>(codeBaseDirectoryPathCount, OVR_ARRAY_COUNT(codeBasePathArray)); i != iCount; ++i)\n    {\n        codeBasePathArray[i] = codeBaseDirectoryPathArray[i];\n    }\n}\n\nconst char* ExceptionHandler::GetExceptionUIText(const char* exceptionReportPath)\n{\n\tchar* uiText = nullptr;\n    OVR::SysFile file(exceptionReportPath, SysFile::Open_Read, SysFile::Mode_ReadWrite);\n\n    if(file.IsValid())\n    {\n        size_t length = (size_t)file.GetLength();\n        uiText = (char*)OVR::SafeMMapAlloc(length + 1);\n\n        if(uiText)\n        {\n            file.Read((uint8_t*)uiText, (int)length);\n            uiText[length] = '\\0';\n            file.Close();\n            \n            // Currently on Mac our message box implementation is unable to display arbitrarily large amounts of text.\n            // So we reduce its size to a more summary version before presenting.\n            #if defined(OVR_OS_MAC)\n                struct Find { static char* PreviousChar(char* p, char c){ while(*p != c) p--; return p; } }; // Assumes the given c is present prior to p.\n            \n                // Print that the full report is at <file path>\n                // Exception Info section\n                // Exception thread callstack.\n                char  empty[]               = \"\";\n                char* pExceptionInfoBegin   = strstr(uiText, \"Exception Info\") ? strstr(uiText, \"Exception Info\") : empty;\n                char* pExceptionInfoEnd     = (pExceptionInfoBegin == empty) ? (empty + 1) : strstr(uiText, \"\\r\\n\\r\\n\");\n                char* pExceptionThreadArea  = strstr(uiText, \", exception thread\");\n                char* pExceptionThreadBegin = pExceptionThreadArea ? Find::PreviousChar(pExceptionThreadArea, '\\n') + 1 : empty;\n                char* pExceptionThreadEnd   = (pExceptionThreadBegin == empty) ? (empty + 1) : strstr(pExceptionThreadArea, \"\\r\\n\\r\\n\");\n            \n                if(!pExceptionInfoEnd)\n                    pExceptionInfoEnd = pExceptionInfoBegin;\n                *pExceptionInfoEnd = '\\0';\n\n                if(!pExceptionThreadEnd)\n                    pExceptionThreadEnd = pExceptionThreadBegin;\n                *pExceptionThreadEnd = '\\0';\n            \n                size_t uiTextBriefLength = OVR_snprintf(nullptr, 0, \"Full report:%s\\n\\nSummary report:\\n%s\\n\\n%s\", exceptionReportPath, pExceptionInfoBegin, pExceptionThreadBegin);\n                char* uiTextBrief = (char*)OVR::SafeMMapAlloc(uiTextBriefLength + 1);\n\n                if(uiTextBrief)\n                {\n                    OVR_snprintf(uiTextBrief, uiTextBriefLength + 1, \"Full report:%s\\n\\nSummary report:\\n%s\\n\\n%s\", exceptionReportPath, pExceptionInfoBegin, pExceptionThreadBegin);\n                    OVR::SafeMMapFree(uiText, length);\n\t\t\t\t\tuiText = uiTextBrief;\n                }\n           #endif\n        }\n    }\n\n    return uiText;\n}\n\nvoid ExceptionHandler::FreeExceptionUIText(const char* messageBoxText)\n{\n\tOVR::SafeMMapFree(messageBoxText, OVR_strlen(messageBoxText));\n}\n\n\n} // namespace OVR\n\n\nOVR_RESTORE_MSVC_WARNING()\n\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_DebugHelp.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_DebugHelp.h\nContent     :   Platform-independent exception handling interface\nCreated     :   October 6, 2014\n\nCopyright   :   Copyright 2014 Oculus VR, LLC. All Rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_ExceptionHandler_h\n#define OVR_ExceptionHandler_h\n\n\n#include \"OVR_Types.h\"\n#include \"OVR_String.h\"\n#include \"OVR_Threads.h\"\n#include \"OVR_Atomic.h\"\n#include \"OVR_Nullptr.h\"\n#include <stdio.h>\n#include <time.h>\n\n#if defined(OVR_OS_WIN32) || defined(OVR_OS_WIN64)\n    #include <Windows.h>\n\n#elif defined(OVR_OS_APPLE)\n    #include <pthread.h>\n    #include <mach/thread_status.h>\n    #include <mach/mach_types.h>\n\n    extern \"C\" void* MachHandlerThreadFunctionStatic(void*);\n    extern \"C\" int   catch_mach_exception_raise_state_identity_OVR(mach_port_t, mach_port_t, mach_port_t, exception_type_t, mach_exception_data_type_t*,\n                                       mach_msg_type_number_t, int*, thread_state_t, mach_msg_type_number_t, thread_state_t, mach_msg_type_number_t*);\n#elif defined(OVR_OS_LINUX)\n    #include <pthread.h>\n#endif\n\n\nOVR_DISABLE_MSVC_WARNING(4351) // new behavior: elements of array will be default initialized\n\n\nnamespace OVR { \n\n    // Thread identifiers\n    //typedef void*     ThreadHandle;  // Already defined by OVR Threads. Same as Windows thread handle, Unix pthread_t.\n    //typedef void*     ThreadId;      // Already defined by OVR Threads. Used by Windows as DWORD thread id, by Unix as pthread_t. \n    typedef uintptr_t   ThreadSysId;   // System thread identifier. Used by Windows the same as ThreadId (DWORD), thread_act_t on Mac/BSD, lwp id on Linux.\n\n    // Thread constants\n    // To do: Move to OVR Threads\n    #define OVR_THREADHANDLE_INVALID ((ThreadHandle*)nullptr)\n    #define OVR_THREADID_INVALID     ((ThreadId*)nullptr)\n    #define OVR_THREADSYSID_INVALID  ((uintptr_t)0)\n\n    OVR::ThreadSysId  ConvertThreadHandleToThreadSysId(OVR::ThreadHandle threadHandle);\n    OVR::ThreadHandle ConvertThreadSysIdToThreadHandle(OVR::ThreadSysId threadSysId);   // The returned handle must be freed with FreeThreadHandle.\n    void              FreeThreadHandle(OVR::ThreadHandle threadHandle);                 // Frees the handle returned by ConvertThreadSysIdToThreadHandle.\n    OVR::ThreadSysId  GetCurrentThreadSysId();\n\n    // CPUContext\n    #if defined(OVR_OS_MS)\n        typedef CONTEXT CPUContext; \n    #elif defined(OVR_OS_MAC)\n        struct CPUContext\n        {\n            x86_thread_state_t  threadState; // This works for both x86 and x64.\n            x86_float_state_t   floatState;\n            x86_debug_state_t   debugState;\n            x86_avx_state_t     avxState;\n            x86_exception_state exceptionState;\n            \n            CPUContext() { memset(this, 0, sizeof(CPUContext)); }\n        };\n    #elif defined(OVR_OS_LINUX)\n        typedef int CPUContext; // To do.\n    #endif\n\n\n    // Tells if the current process appears to be running under a debugger. Does not attempt to \n    // detect the case of sleath debuggers (malware-related for example).\n    bool OVRIsDebuggerPresent();\n\n    // Exits the process with the given exit code.\n    #if !defined(OVR_NORETURN)\n        #if defined(OVR_CC_MSVC)\n            #define OVR_NORETURN __declspec(noreturn)\n        #else\n            #define OVR_NORETURN __attribute__((noreturn))\n        #endif\n    #endif\n    OVR_NORETURN void ExitProcess(intptr_t processReturnValue);\n\n    // Returns the instruction pointer of the caller for the position right after the call.\n    OVR_NO_INLINE void GetInstructionPointer(void*& pInstruction);\n\n    // Returns the stack base and limit addresses for the given thread, or for the current thread if the threadHandle is default.\n    // The stack limit is a value less than the stack base on most platforms, as stacks usually grow downward.\n    // Some platforms (e.g. Microsoft) have dynamically resizing stacks, in which case the stack limit reflects the current limit.\n    void GetThreadStackBounds(void*& pStackBase, void*& pStackLimit, ThreadHandle threadHandle = OVR_THREADHANDLE_INVALID);\n\n\n    // Equates to VirtualAlloc/VirtualFree on Windows, mmap/munmap on Unix.\n    // These are useful for when you need system-supplied memory pages. \n    // These are also useful for when you need to allocate memory in a way \n    // that doesn't affect the application heap.\n    void* SafeMMapAlloc(size_t size);\n    void  SafeMMapFree(const void* memory, size_t size);\n\n\n    // OVR_MAX_PATH\n    // Max file path length (for most uses).\n    // To do: move this to OVR_File.\n    #if defined(OVR_OS_MS)         // http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx\n        #define OVR_MAX_PATH  260  // Windows can use paths longer than this in some cases (network paths, UNC paths).\n    #else\n        #define OVR_MAX_PATH 1024  // This isn't a strict limit on all Unix-based platforms.\n    #endif\n\n\n    // ModuleHandle\n    #if defined(OVR_OS_MS)\n        typedef void* ModuleHandle;  // from LoadLibrary()\n    #elif defined(OVR_OS_APPLE) || defined(OVR_OS_UNIX)\n        typedef void* ModuleHandle;  // from dlopen()\n    #endif\n\n    #define OVR_MODULEHANDLE_INVALID ((ModuleHandle*)nullptr)\n\n\n\n    // Module info constants\n    static const ModuleHandle kMIHandleInvalid          = OVR_MODULEHANDLE_INVALID;\n    static const uint64_t     kMIAddressInvalid         = 0xffffffffffffffffull;\n    static const uint64_t     kMISizeInvalid            = 0xffffffffffffffffull;\n    static const int32_t      kMILineNumberInvalid      = -1;\n    static const int32_t      kMIFunctionOffsetInvalid  = -1;\n    static const uint64_t     kMIBaseAddressInvalid     = 0xffffffffffffffffull;\n    static const uint64_t     kMIBaseAddressUnspecified = 0xffffffffffffffffull;\n\n    struct ModuleInfo\n    {\n        ModuleHandle handle;\n        uint64_t     baseAddress;           // The actual runtime base address of the module. May be different from the base address specified in the debug symbol file.\n        uint64_t     size;\n        char         filePath[OVR_MAX_PATH];\n        char         name[32];\n        char         type[8];               // Unix-specific. e.g. __TEXT\n        char         permissions[8];        // Unix specific. e.g. \"drwxr-xr-x\"\n\n        ModuleInfo() : handle(kMIHandleInvalid), baseAddress(kMIBaseAddressInvalid), size(0), filePath(), name(){}\n    };\n\n\n    // Refers to symbol info for an instruction address. \n    // Info includes function name, source code file/line, and source code itself.\n    struct SymbolInfo\n    {\n        uint64_t          address;\n        uint64_t          size;\n        const ModuleInfo* pModuleInfo;\n        char              filePath[OVR_MAX_PATH];\n        int32_t           fileLineNumber;\n        char              function[128];            // This is a fixed size because we need to use it during application exceptions.\n        int32_t           functionOffset;\n        char              sourceCode[1024];         // This is a string representing the code itself and not a file path to the code.\n\n        SymbolInfo() : address(kMIAddressInvalid), size(kMISizeInvalid), pModuleInfo(nullptr), filePath(), \n                        fileLineNumber(kMILineNumberInvalid), function(), functionOffset(kMIFunctionOffsetInvalid), sourceCode() {}\n    };\n\n\n    // Implements support for reading thread lists, module lists, backtraces, and backtrace symbols.\n    class SymbolLookup\n    {\n    public:\n        SymbolLookup();\n       ~SymbolLookup();\n\n        void AddSourceCodeDirectory(const char* pDirectory);\n\n        bool Initialize();\n        void Shutdown();\n\n        // Should be disabled when within an exception handler.\n        void EnableMemoryAllocation(bool enabled);\n        \n        // Retrieves the backtrace (call stack) of the given thread. There may be some per-platform restrictions on this.\n        // Returns the number written, which will be <= addressArrayCapacity.\n        // This may not work on some platforms unless stack frames are enabled.\n        // For Microsoft platforms the platformThreadContext is CONTEXT*.\n        // For Apple platforms the platformThreadContext is x86_thread_state_t* or arm_thread_state_t*.\n        // If threadSysIdHelp is non-zero, it may be used by the implementation to help produce a better backtrace.\n        size_t GetBacktrace(void* addressArray[], size_t addressArrayCapacity, size_t skipCount = 0, void* platformThreadContext = nullptr, OVR::ThreadSysId threadSysIdHelp = OVR_THREADSYSID_INVALID);\n\n        // Retrieves the backtrace for the given ThreadHandle.\n        // Returns the number written, which will be <= addressArrayCapacity.\n        size_t GetBacktraceFromThreadHandle(void* addressArray[], size_t addressArrayCapacity, size_t skipCount = 0, OVR::ThreadHandle threadHandle = OVR_THREADHANDLE_INVALID);\n\n        // Retrieves the backtrace for the given ThreadSysId.\n        // Returns the number written, which will be <= addressArrayCapacity.\n        size_t GetBacktraceFromThreadSysId(void* addressArray[], size_t addressArrayCapacity, size_t skipCount = 0, OVR::ThreadSysId threadSysId = OVR_THREADSYSID_INVALID);\n\n        // Gets a list of the modules (e.g. DLLs) present in the current process.\n        // Writes as many ModuleInfos as possible to pModuleInfoArray.\n        // Returns the required count of ModuleInfos, which will be > moduleInfoArrayCapacity if the capacity needs to be larger.\n        size_t GetModuleInfoArray(ModuleInfo* pModuleInfoArray, size_t moduleInfoArrayCapacity);\n\n        // Retrieves a list of the current threads. Unless the process is paused the list is volatile.\n        // Returns the required capacity, which may be larger than threadArrayCapacity.\n        // Either array can be NULL to specify that it's not written to.\n        // For Windows the caller needs to CloseHandle the returned ThreadHandles. This can be done by calling DoneThreadList.\n        size_t GetThreadList(ThreadHandle* threadHandleArray, ThreadSysId* threadSysIdArray, size_t threadArrayCapacity);\n\n        // Frees any references to thread handles or ids returned by GetThreadList;\n        void DoneThreadList(ThreadHandle* threadHandleArray, ThreadSysId* threadSysIdArray, size_t threadArrayCount);\n\n        // Writes a given thread's callstack with symbols to the given output.\n        // It may not be safe to call this from an exception handler, as sOutput allocates memory.\n        bool ReportThreadCallstack(OVR::String& sOutput, size_t skipCount = 0, ThreadSysId threadSysId = OVR_THREADSYSID_INVALID);\n\n        // Writes all thread's callstacks with symbols to the given output.\n        // It may not be safe to call this from an exception handler, as sOutput allocates memory.\n        bool ReportThreadCallstacks(OVR::String& sOutput, size_t skipCount = 0);\n\n        // Retrieves symbol info for the given address. \n        bool LookupSymbol(uint64_t address, SymbolInfo& symbolInfo);\n        bool LookupSymbols(uint64_t* addressArray, SymbolInfo* pSymbolInfoArray, size_t arraySize);\n\n        const ModuleInfo* GetModuleInfoForAddress(uint64_t address);  // The returned ModuleInfo points to an internal structure.\n\n    protected:\n        bool RefreshModuleList();\n\n    protected:\n        bool       initialized;\n        bool       allowMemoryAllocation;   // True by default. If true then we allow allocating memory (and as a result provide less information). This is useful for when in an exception handler.\n        bool       moduleListUpdated;\n        ModuleInfo moduleInfoArray[96];     // Cached list of modules we use. This is a fixed size because we need to use it during application exceptions.\n        size_t     moduleInfoArraySize;\n    };\n\n\n\n    // ExceptionInfo\n    // We need to be careful to avoid data types that can allocate memory while we are \n    // handling an exception, as the memory system may be corrupted at that point in time.\n    struct ExceptionInfo\n    {\n        tm            time;                             // GM time.\n        time_t        timeVal;                          // GM time_t (seconds since 1970).\n        void*         backtrace[64];\n        size_t        backtraceCount;\n        ThreadHandle  threadHandle;                     // \n        ThreadSysId   threadSysId;                      // \n        char          threadName[32];                   // Cannot be an allocating String object.\n        void*         pExceptionInstructionAddress;\n        void*         pExceptionMemoryAddress;\n        CPUContext    cpuContext;\n        char          exceptionDescription[1024];       // Cannot be an allocating String object.\n        SymbolInfo    symbolInfo;                       // SymbolInfo for the exception location.\n\n        #if defined(OVR_OS_MS)\n            EXCEPTION_RECORD exceptionRecord;           // This is a Windows SDK struct.\n        #elif defined(OVR_OS_APPLE)\n            uint64_t         exceptionType;             // e.g. EXC_BAD_INSTRUCTION, EXC_BAD_ACCESS, etc.\n            uint32_t         cpuExceptionId;            // The x86/x64 CPU trap id.\n            uint32_t         cpuExceptionIdError;       // The x86/x64 CPU trap id extra info.\n            int64_t          machExceptionDetail[4];    // Kernel exception code info.\n            int              machExceptionDetailCount;  // Count of valid entries.\n        #endif\n\n        ExceptionInfo();\n    };\n\n\n    // Implments support for asynchronous exception handling and basic exception report generation.\n    // If you are implementing exception handling for a commercial application and want auto-uploading\n    // functionality you may want to consider using something like Google Breakpad. This exception handler\n    // is for in-application debug/diagnostic services, though it can write a report that has similar\n    // information to Breakpad or OS-provided reports such as Apple .crash files.\n    //\n    // Example usage:\n    //     ExceptionHandler exceptionHandler;\n    //\n    //     int main(int, char**)\n    //     {\n    //          exceptionHandler.Enable(true);\n    //          exceptionHandler.SetExceptionListener(pSomeListener, 0);  // Optional listener hook.\n    //     }\n    // \n    class ExceptionHandler\n    {\n    public:\n        ExceptionHandler();\n       ~ExceptionHandler();\n\n        bool Enable(bool enable);\n        \n        // Some report info can be considered private information of the user, such as the current process list,\n        // computer name, IP address or other identifying info, etc. We should not report this information for\n        // external users unless they agree to this.\n        void EnableReportPrivacy(bool enable);\n\n        struct ExceptionListener\n        {\n            virtual ~ExceptionListener(){}\n            virtual int HandleException(uintptr_t userValue, ExceptionHandler* pExceptionHandler, ExceptionInfo* pExceptionInfo, const char* reportFilePath) = 0;\n        };\n\n        void SetExceptionListener(ExceptionListener* pExceptionListener, uintptr_t userValue);\n\n        // What we do after handling the exception.\n        enum ExceptionResponse\n        {\n            kERContinue,    // Continue execution. Will result in the exception being re-generated unless the application has fixed the cause. Similar to Windows EXCEPTION_CONTINUE_EXECUTION.\n            kERHandle,      // Causes the OS to handle the exception as it normally would. Similar to Windows EXCEPTION_EXECUTE_HANDLER.\n            kERTerminate,   // Exit the application.\n            kERThrow,       // Re-throw the exception. Other handlers may catch it. Similar to Windows EXCEPTION_CONTINUE_SEARCH.\n            kERDefault      // Usually set to kERTerminate.\n        };\n\n        void SetExceptionResponse(ExceptionResponse er)\n            { exceptionResponse = er; }\n\n        // Allws you to add an arbitrary description of the current application, which will be added to exception reports.\n        void SetAppDescription(const char* appDescription);\n\n        // If the report path has a \"%s\" in its name, then assume the path is a sprintf format and write it \n        // with the %s specified as a date/time string.\n        // The report path can be \"default\" to signify that you want to use the default user location.\n        // Example usage:\n        //     handler.SetExceptionPaths(\"/Users/Current/Exceptions/Exception %s.txt\");\n        void SetExceptionPaths(const char* exceptionReportPath, const char* exceptionMinidumpPath = nullptr);\n\n        // Allows you to specify base directories for code paths, which can be used to associate exception addresses to lines \n        // of code as opposed to just file names and line numbers, or function names plus binary offsets.\n        void SetCodeBaseDirectoryPaths(const char* codeBaseDirectoryPathArray[], size_t codeBaseDirectoryPathCount);\n\n\t\t// Given an exception report at a given file path, returns a string suitable for displaying in a message\n\t\t// box or similar user interface during the handling of an exception. The returned string must be passed\n\t\t// to FreeMessageBoxText when complete.\n\t\tstatic const char* GetExceptionUIText(const char* exceptionReportPath);\n\t\tstatic void FreeExceptionUIText(const char* messageBoxText);\n\n    protected:\n        void WriteExceptionDescription();\n        void WriteReport();\n        void WriteReportLine(const char* pLine);\n        void WriteReportLineF(const char* format, ...);\n        void WriteThreadCallstack(ThreadHandle threadHandle, ThreadSysId threadSysId, const char* additionalInfo);\n        void WriteMiniDump();\n\n        // Runtime constants\n        bool               enabled;\n        bool               reportPrivacyEnabled;        // Defaults to true.\n        ExceptionResponse  exceptionResponse;           // Defaults to kERHandle\n        ExceptionListener* exceptionListener;\n        uintptr_t          exceptionListenerUserValue;\n        String             appDescription;\n        String             codeBasePathArray[6];        // 6 is arbitrary.\n        char               reportFilePath[OVR_MAX_PATH];// May be an encoded path, in that it has \"%s\" in it or is named \"default\". See reporFiletPathActual for the runtime actual report path.\n        int                miniDumpFlags;\n        char               miniDumpFilePath[OVR_MAX_PATH];\n        FILE*              file;                        // Can/should we use OVR Files for this?\n        char               scratchBuffer[4096];\n        SymbolLookup       symbolLookup;\n\n        // Runtime variables\n        bool                     exceptionOccurred;\n        OVR::AtomicInt<uint32_t> handlingBusy;\n        char                     reportFilePathActual[OVR_MAX_PATH];\n        char                     minidumpFilePathActual[OVR_MAX_PATH];\n        int                      terminateReturnValue;\n        ExceptionInfo            exceptionInfo;\n\n        #if defined(OVR_OS_MS)\n            void*                        vectoredHandle;\n            LPTOP_LEVEL_EXCEPTION_FILTER previousFilter;\n            LPEXCEPTION_POINTERS         pExceptionPointers;\n\n            friend LONG WINAPI Win32ExceptionFilter(LPEXCEPTION_POINTERS pExceptionPointers);\n            LONG ExceptionFilter(LPEXCEPTION_POINTERS pExceptionPointers);\n\n        #elif defined(OVR_OS_APPLE)\n            struct SavedExceptionPorts\n            {\n                SavedExceptionPorts() : count(0) { memset(this, 0, sizeof(SavedExceptionPorts)); }\n\n                mach_msg_type_number_t count;\n                exception_mask_t       masks[6];\n                exception_handler_t    ports[6];\n                exception_behavior_t   behaviors[6];\n                thread_state_flavor_t  flavors[6];\n            };\n\n            friend void* ::MachHandlerThreadFunctionStatic(void*);\n            friend int ::catch_mach_exception_raise_state_identity_OVR(mach_port_t, mach_port_t, mach_port_t, exception_type_t,\n                                        mach_exception_data_type_t*, mach_msg_type_number_t, int*, thread_state_t,\n                                        mach_msg_type_number_t, thread_state_t, mach_msg_type_number_t*);\n        \n            bool          InitMachExceptionHandler();\n            void          ShutdownMachExceptionHandler();\n            void*         MachHandlerThreadFunction();\n            kern_return_t HandleMachException(mach_port_t port, mach_port_t thread, mach_port_t task, exception_type_t exceptionType,\n                                              mach_exception_data_type_t* pExceptionDetail, mach_msg_type_number_t exceptionDetailCount, \n                                              int* pFlavor, thread_state_t pOldState, mach_msg_type_number_t oldStateCount, thread_state_t pNewState,\n                                              mach_msg_type_number_t* pNewStateCount);\n            kern_return_t ForwardMachException(mach_port_t thread, mach_port_t task, exception_type_t exceptionType,\n                                               mach_exception_data_t pExceptionDetail, mach_msg_type_number_t exceptionDetailCount);\n\n            bool                machHandlerInitialized;\n            mach_port_t         machExceptionPort;\n            SavedExceptionPorts machExceptionPortsSaved;\n            volatile bool       machThreadShouldContinue;\n            volatile bool       machThreadExecuting;\n            pthread_t           machThread;\n\n        #elif defined(OVR_OS_LINUX)\n            // To do.\n        #endif\n    };\n\n\n    // Identifies basic exception types for the CreateException function.\n    enum CreateExceptionType\n    {\n        kCETAccessViolation,      // Read or write to inaccessable memory.\n        kCETAlignment,            // Misaligned read or write.\n        kCETDivideByZero,         // Integer divide by zero.\n        kCETFPU,                  // Floating point / VPU exception.\n        kCETIllegalInstruction,   // Illegal opcode.\n        kCETStackCorruption,      // Stack frame was corrupted.\n        kCETStackOverflow,        // Stack ran out of space, often due to infinite recursion.\n        kCETTrap                  // System/OS trap (system call).\n    };\n\n\n    // Creates an exception of the given type, primarily for testing.\n    void CreateException(CreateExceptionType exceptionType);\n\n\n\n} // namespace OVR\n\n\nOVR_RESTORE_MSVC_WARNING()\n\n\n#endif // Header include guard\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Delegates.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Delegates.h\nContent     :   C++ Delegates\nCreated     :   June 15, 2014\nAuthors     :   Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n/*\n\tBased on The Impossibly Fast C++ Delegates by Sergey Ryazanov from\n\thttp://www.codeproject.com/KB/cpp/ImpossiblyFastCppDelegate.aspx (2005)\n*/\n\n/*\n\tUsage:\n\n\tDeclare a delegate with a void (int) signature, also known as a\n\tfunction that returns void and has one parameter that is an int:\n\t\ttypedef Delegate1<void, int> MyDelegate;\n\t\tMyDelegate d;\n\n\tPoint the delegate to a member function:\n\t\td.SetMember<A, &A::TestFunctionA>(&a);\n\t\td = MyDelegate::FromMember<A, &A::TestFunctionA>(&a);\n\n\tPoint the delegate to a const member function:\n\t\td.SetConstMember<C, &C::TestFunctionA>(&c);\n\t\td = MyDelegate::FromConstMember<C, &C::TestFunctionA>(&c);\n\n\tPoint the delegate to a free function:\n\t\td.SetFree<&FreeFunctionX>();\n\t\td = MyDelegate::FromFree<&FreeFunctionX>();\n\n\tInvoke the function via the delegate (works for all 3 cases):\n\t\td(1000);\n\n\tBy default the delegates are uninitialized.\n\tTo clear an array of delegates quickly just zero the memory.\n\n\tThis implementation is nicer than FastDelegates in my opinion\n\tbecause it is simple and easy to read.  It is a little slower\n\tfor virtual functions, but the size of the delegate is small,\n\tand it will only get better as compilers improve.\n*/\n\n#ifndef OVR_Delegates_h\n#define OVR_Delegates_h\n\n#include \"OVR_Types.h\"\n\nnamespace OVR {\n\n\ntemplate <class ret_type>\nclass Delegate0\n{\n\ttypedef ret_type (*StubPointer)(void *);\n\ttypedef Delegate0<ret_type> this_type;\n\n\tvoid *_object;\n\tStubPointer _stub;\n\n\tOVR_FORCE_INLINE Delegate0(void *object, StubPointer stub)\n\t{\n\t\t_object = object;\n\t\t_stub = stub;\n\t}\n\n\t// Stubs\n\n\ttemplate <ret_type (*F)()>\n\tstatic OVR_FORCE_INLINE ret_type FreeStub(void * /*object*/)\n\t{\n\t\treturn (F)();\n\t}\n\n\ttemplate <class T, ret_type (T::*F)()>\n\tstatic OVR_FORCE_INLINE ret_type MemberStub(void *object)\n\t{\n\t\tT *p = static_cast<T*>(object);\n\t\treturn (p->*F)();\n\t}\n\n\ttemplate <class T, ret_type (T::*F)() const>\n\tstatic OVR_FORCE_INLINE ret_type ConstMemberStub(void *object)\n\t{\n\t\tT *p = static_cast<T*>(object);\n\t\treturn (p->*F)();\n\t}\n\npublic:\n\tOVR_FORCE_INLINE Delegate0() : _object(0), _stub(0){}\n\n\t// Function invocation\n\n\tOVR_FORCE_INLINE ret_type operator()() const\n\t{\n\t\treturn (*_stub)(_object);\n\t}\n\n\t// Use stub pointer as a validity flag and equality checker\n\n\tOVR_FORCE_INLINE bool operator==(const this_type &rhs) const\n\t{\n\t\treturn _object == rhs._object && _stub == rhs._stub;\n\t}\n\n\tOVR_FORCE_INLINE bool operator!=(const this_type &rhs) const\n\t{\n\t\treturn _object != rhs._object || _stub != rhs._stub;\n\t}\n\n\tOVR_FORCE_INLINE bool IsValid() const\n\t{\n\t\treturn _stub != 0;\n\t}\n\n\tOVR_FORCE_INLINE bool operator!() const\n\t{\n\t\treturn _stub == 0;\n\t}\n\n\tOVR_FORCE_INLINE void Invalidate()\n\t{\n\t\t_stub = 0;\n\t}\n\n\t// Delegate creation from a function\n\n\ttemplate <ret_type (*F)()>\n\tstatic OVR_FORCE_INLINE this_type FromFree()\n\t{\n\t\treturn this_type(0, &FreeStub<F>);\n\t}\n\n\ttemplate <class T, ret_type (T::*F)()>\n\tstatic OVR_FORCE_INLINE this_type FromMember(T *object)\n\t{\n\t\treturn this_type(object, &MemberStub<T, F>);\n\t}\n\n\ttemplate <class T, ret_type (T::*F)() const>\n\tstatic OVR_FORCE_INLINE this_type FromConstMember(T const *object)\n\t{\n\t\treturn this_type(const_cast<T*>( object ), &ConstMemberStub<T, F>);\n\t}\n\n\t// In-place assignment to a different function\n\n\ttemplate <ret_type (*F)()>\n\tOVR_FORCE_INLINE void SetFree()\n\t{\n\t\t*this = FromFree<F>();\n\t}\n\n\ttemplate <class T, ret_type (T::*F)()>\n\tOVR_FORCE_INLINE void SetMember(T *object)\n\t{\n\t\t*this = FromMember<T, F>(object);\n\t}\n\n\ttemplate <class T, ret_type (T::*F)() const>\n\tOVR_FORCE_INLINE void SetConstMember(T const *object)\n\t{\n\t\t*this = FromConstMember<T, F>(object);\n\t}\n};\n\n\ntemplate <class ret_type, class arg1_type>\nclass Delegate1\n{\n\ttypedef ret_type (*StubPointer)(void *, arg1_type);\n\ttypedef Delegate1<ret_type, arg1_type> this_type;\n\n\tvoid *_object;\n\tStubPointer _stub;\n\n\tOVR_FORCE_INLINE Delegate1(void *object, StubPointer stub)\n\t{\n\t\t_object = object;\n\t\t_stub = stub;\n\t}\n\n\t// Stubs\n\n\ttemplate <ret_type (*F)(arg1_type)>\n\tstatic OVR_FORCE_INLINE ret_type FreeStub(void * /*object*/, arg1_type a1)\n\t{\n\t\treturn (F)(a1);\n\t}\n\n\ttemplate <class T, ret_type (T::*F)(arg1_type)>\n\tstatic OVR_FORCE_INLINE ret_type MemberStub(void *object, arg1_type a1)\n\t{\n\t\tT *p = static_cast<T*>(object);\n\t\treturn (p->*F)(a1);\n\t}\n\n\ttemplate <class T, ret_type (T::*F)(arg1_type) const>\n\tstatic OVR_FORCE_INLINE ret_type ConstMemberStub(void *object, arg1_type a1)\n\t{\n\t\tT *p = static_cast<T*>(object);\n\t\treturn (p->*F)(a1);\n\t}\n\npublic:\n\tOVR_FORCE_INLINE Delegate1() : _object(0), _stub(0){}\n\n\t// Function invocation\n\n\tOVR_FORCE_INLINE ret_type operator()(arg1_type a1) const\n\t{\n\t\treturn (*_stub)(_object, a1);\n\t}\n\n\t// Use stub pointer as a validity flag and equality checker\n\n\tOVR_FORCE_INLINE bool operator==(const this_type &rhs) const\n\t{\n\t\treturn _object == rhs._object && _stub == rhs._stub;\n\t}\n\n\tOVR_FORCE_INLINE bool operator!=(const this_type &rhs) const\n\t{\n\t\treturn _object != rhs._object || _stub != rhs._stub;\n\t}\n\n\tOVR_FORCE_INLINE bool IsValid() const\n\t{\n\t\treturn _stub != 0;\n\t}\n\n\tOVR_FORCE_INLINE bool operator!() const\n\t{\n\t\treturn _stub == 0;\n\t}\n\n\tOVR_FORCE_INLINE void Invalidate()\n\t{\n\t\t_stub = 0;\n\t}\n\n\t// Delegate creation from a function\n\n\ttemplate <ret_type (*F)(arg1_type)>\n\tstatic OVR_FORCE_INLINE this_type FromFree()\n\t{\n\t\treturn this_type(0, &FreeStub<F>);\n\t}\n\n\ttemplate <class T, ret_type (T::*F)(arg1_type)>\n\tstatic OVR_FORCE_INLINE this_type FromMember(T *object)\n\t{\n\t\treturn this_type(object, &MemberStub<T, F>);\n\t}\n\n\ttemplate <class T, ret_type (T::*F)(arg1_type) const>\n\tstatic OVR_FORCE_INLINE this_type FromConstMember(T const *object)\n\t{\n\t\treturn this_type(const_cast<T*>( object ), &ConstMemberStub<T, F>);\n\t}\n\n\t// In-place assignment to a different function\n\n\ttemplate <ret_type (*F)(arg1_type)>\n\tOVR_FORCE_INLINE void SetFree()\n\t{\n\t\t*this = FromFree<F>();\n\t}\n\n\ttemplate <class T, ret_type (T::*F)(arg1_type)>\n\tOVR_FORCE_INLINE void SetMember(T *object)\n\t{\n\t\t*this = FromMember<T, F>(object);\n\t}\n\n\ttemplate <class T, ret_type (T::*F)(arg1_type) const>\n\tOVR_FORCE_INLINE void SetConstMember(T const *object)\n\t{\n\t\t*this = FromConstMember<T, F>(object);\n\t}\n};\n\n\ntemplate <class ret_type, class arg1_type, class arg2_type>\nclass Delegate2\n{\n\ttypedef ret_type (*StubPointer)(void *, arg1_type, arg2_type);\n\ttypedef Delegate2<ret_type, arg1_type, arg2_type> this_type;\n\n\tvoid *_object;\n\tStubPointer _stub;\n\n\tOVR_FORCE_INLINE Delegate2(void *object, StubPointer stub)\n\t{\n\t\t_object = object;\n\t\t_stub = stub;\n\t}\n\n\t// Stubs\n\n\ttemplate <ret_type (*F)(arg1_type, arg2_type)>\n\tstatic OVR_FORCE_INLINE ret_type FreeStub(void * /*object*/, arg1_type a1, arg2_type a2)\n\t{\n\t\treturn (F)(a1, a2);\n\t}\n\n\ttemplate <class T, ret_type (T::*F)(arg1_type, arg2_type)>\n\tstatic OVR_FORCE_INLINE ret_type MemberStub(void *object, arg1_type a1, arg2_type a2)\n\t{\n\t\tT *p = static_cast<T*>(object);\n\t\treturn (p->*F)(a1, a2);\n\t}\n\n\ttemplate <class T, ret_type (T::*F)(arg1_type, arg2_type) const>\n\tstatic OVR_FORCE_INLINE ret_type ConstMemberStub(void *object, arg1_type a1, arg2_type a2)\n\t{\n\t\tT *p = static_cast<T*>(object);\n\t\treturn (p->*F)(a1, a2);\n\t}\n\npublic:\n\tOVR_FORCE_INLINE Delegate2() : _object(0), _stub(0){}\n\n\t// Function invocation\n\n\tOVR_FORCE_INLINE ret_type operator()(arg1_type a1, arg2_type a2) const\n\t{\n\t\treturn (*_stub)(_object, a1, a2);\n\t}\n\n\t// Use stub pointer as a validity flag and equality checker\n\n\tOVR_FORCE_INLINE bool operator==(const this_type &rhs) const\n\t{\n\t\treturn _object == rhs._object && _stub == rhs._stub;\n\t}\n\n\tOVR_FORCE_INLINE bool operator!=(const this_type &rhs) const\n\t{\n\t\treturn _object != rhs._object || _stub != rhs._stub;\n\t}\n\n\tOVR_FORCE_INLINE bool IsValid() const\n\t{\n\t\treturn _stub != 0;\n\t}\n\n\tOVR_FORCE_INLINE bool operator!() const\n\t{\n\t\treturn _stub == 0;\n\t}\n\n\tOVR_FORCE_INLINE void Invalidate()\n\t{\n\t\t_stub = 0;\n\t}\n\n\t// Delegate creation from a function\n\n\ttemplate <ret_type (*F)(arg1_type, arg2_type)>\n\tstatic OVR_FORCE_INLINE this_type FromFree()\n\t{\n\t\treturn this_type(0, &FreeStub<F>);\n\t}\n\n\ttemplate <class T, ret_type (T::*F)(arg1_type, arg2_type)>\n\tstatic OVR_FORCE_INLINE this_type FromMember(T *object)\n\t{\n\t\treturn this_type(object, &MemberStub<T, F>);\n\t}\n\n\ttemplate <class T, ret_type (T::*F)(arg1_type, arg2_type) const>\n\tstatic OVR_FORCE_INLINE this_type FromConstMember(T const *object)\n\t{\n\t\treturn this_type(const_cast<T*>( object ), &ConstMemberStub<T, F>);\n\t}\n\n\t// In-place assignment to a different function\n\n\ttemplate <ret_type (*F)(arg1_type, arg2_type)>\n\tOVR_FORCE_INLINE void SetFree()\n\t{\n\t\t*this = FromFree<F>();\n\t}\n\n\ttemplate <class T, ret_type (T::*F)(arg1_type, arg2_type)>\n\tOVR_FORCE_INLINE void SetMember(T *object)\n\t{\n\t\t*this = FromMember<T, F>(object);\n\t}\n\n\ttemplate <class T, ret_type (T::*F)(arg1_type, arg2_type) const>\n\tOVR_FORCE_INLINE void SetConstMember(T const *object)\n\t{\n\t\t*this = FromConstMember<T, F>(object);\n\t}\n};\n\n\ntemplate <class ret_type, class arg1_type, class arg2_type, class arg3_type>\nclass Delegate3\n{\n\ttypedef ret_type (*StubPointer)(void *, arg1_type, arg2_type, arg3_type);\n\ttypedef Delegate3<ret_type, arg1_type, arg2_type, arg3_type> this_type;\n\n\tvoid *_object;\n\tStubPointer _stub;\n\n\tOVR_FORCE_INLINE Delegate3(void *object, StubPointer stub)\n\t{\n\t\t_object = object;\n\t\t_stub = stub;\n\t}\n\n\t// Stubs\n\n\ttemplate <ret_type (*F)(arg1_type, arg2_type, arg3_type)>\n\tstatic OVR_FORCE_INLINE ret_type FreeStub(void * /*object*/, arg1_type a1, arg2_type a2, arg3_type a3)\n\t{\n\t\treturn (F)(a1, a2, a3);\n\t}\n\n\ttemplate <class T, ret_type (T::*F)(arg1_type, arg2_type, arg3_type)>\n\tstatic OVR_FORCE_INLINE ret_type MemberStub(void *object, arg1_type a1, arg2_type a2, arg3_type a3)\n\t{\n\t\tT *p = static_cast<T*>(object);\n\t\treturn (p->*F)(a1, a2, a3);\n\t}\n\n\ttemplate <class T, ret_type (T::*F)(arg1_type, arg2_type, arg3_type) const>\n\tstatic OVR_FORCE_INLINE ret_type ConstMemberStub(void *object, arg1_type a1, arg2_type a2, arg3_type a3)\n\t{\n\t\tT *p = static_cast<T*>(object);\n\t\treturn (p->*F)(a1, a2, a3);\n\t}\n\npublic:\n\tOVR_FORCE_INLINE Delegate3() : _object(0), _stub(0){}\n\n\t// Function invocation\n\n\tOVR_FORCE_INLINE ret_type operator()(arg1_type a1, arg2_type a2, arg3_type a3) const\n\t{\n\t\treturn (*_stub)(_object, a1, a2, a3);\n\t}\n\n\t// Use stub pointer as a validity flag and equality checker\n\n\tOVR_FORCE_INLINE bool operator==(const this_type &rhs) const\n\t{\n\t\treturn _object == rhs._object && _stub == rhs._stub;\n\t}\n\n\tOVR_FORCE_INLINE bool operator!=(const this_type &rhs) const\n\t{\n\t\treturn _object != rhs._object || _stub != rhs._stub;\n\t}\n\n\tOVR_FORCE_INLINE bool IsValid() const\n\t{\n\t\treturn _stub != 0;\n\t}\n\n\tOVR_FORCE_INLINE bool operator!() const\n\t{\n\t\treturn _stub == 0;\n\t}\n\n\tOVR_FORCE_INLINE void Invalidate()\n\t{\n\t\t_stub = 0;\n\t}\n\n\t// Delegate creation from a function\n\n\ttemplate <ret_type (*F)(arg1_type, arg2_type, arg3_type)>\n\tstatic OVR_FORCE_INLINE this_type FromFree()\n\t{\n\t\treturn this_type(0, &FreeStub<F>);\n\t}\n\n\ttemplate <class T, ret_type (T::*F)(arg1_type, arg2_type, arg3_type)>\n\tstatic OVR_FORCE_INLINE this_type FromMember(T *object)\n\t{\n\t\treturn this_type(object, &MemberStub<T, F>);\n\t}\n\n\ttemplate <class T, ret_type (T::*F)(arg1_type, arg2_type, arg3_type) const>\n\tstatic OVR_FORCE_INLINE this_type FromConstMember(T const *object)\n\t{\n\t\treturn this_type(const_cast<T*>( object ), &ConstMemberStub<T, F>);\n\t}\n\n\t// In-place assignment to a different function\n\n\ttemplate <ret_type (*F)(arg1_type, arg2_type, arg3_type)>\n\tOVR_FORCE_INLINE void SetFree()\n\t{\n\t\t*this = FromFree<F>();\n\t}\n\n\ttemplate <class T, ret_type (T::*F)(arg1_type, arg2_type, arg3_type)>\n\tOVR_FORCE_INLINE void SetMember(T *object)\n\t{\n\t\t*this = FromMember<T, F>(object);\n\t}\n\n\ttemplate <class T, ret_type (T::*F)(arg1_type, arg2_type, arg3_type) const>\n\tOVR_FORCE_INLINE void SetConstMember(T const *object)\n\t{\n\t\t*this = FromConstMember<T, F>(object);\n\t}\n};\n\n// Add more here if needed, but keep in mind that a short, simple interface\n// is rewarded by making the delegates faster...\n\n\n} // namespace OVR\n\n#endif // OVR_Delegates_h\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Deque.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Deque.h\nContent     :   Deque container\nCreated     :   Nov. 15, 2013\nAuthors     :   Dov Katz\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Deque_h\n#define OVR_Deque_h\n\n#include \"OVR_ContainerAllocator.h\"\n\nnamespace OVR{ \n\ntemplate <class Elem, class Allocator = ContainerAllocator<Elem> >\nclass Deque\n{\npublic:\n    enum\n    {\n        DefaultCapacity = 500\n    };\n\n    Deque(int capacity = DefaultCapacity);\n    virtual ~Deque(void);\n\n    virtual void         PushBack   (const Elem &Item);    // Adds Item to the end\n    virtual void         PushFront  (const Elem &Item);    // Adds Item to the beginning\n    virtual Elem         PopBack    (void);                // Removes Item from the end\n    virtual Elem         PopFront   (void);                // Removes Item from the beginning\n    virtual const Elem&  PeekBack   (int count = 0) const; // Returns count-th Item from the end\n    virtual const Elem&  PeekFront  (int count = 0) const; // Returns count-th Item from the beginning\n\n\tvirtual inline size_t GetSize    (void)          const; // Returns Number of Elements\n\tOVR_FORCE_INLINE int GetSizeI   (void)          const\n\t{\n\t\treturn (int)GetSize();\n\t}\n    virtual inline size_t GetCapacity(void)          const; // Returns the maximum possible number of elements\n    virtual void         Clear      (void);\t\t\t\t   // Remove all elements\n    virtual inline bool  IsEmpty    ()              const;\n    virtual inline bool  IsFull     ()              const;\n\nprotected:\n    Elem        *Data;          // The actual Data array\n    const int   Capacity;       // Deque capacity\n    int         Beginning;      // Index of the first element\n    int         End;            // Index of the next after last element\n\n    // Instead of calculating the number of elements, using this variable\n    // is much more convenient.\n    int         ElemCount;\n\nprivate:\n    OVR_NON_COPYABLE(Deque);\n};\n\ntemplate <class Elem, class Allocator = ContainerAllocator<Elem> >\nclass InPlaceMutableDeque : public Deque<Elem, Allocator>\n{\n    typedef Deque<Elem, Allocator> BaseType;\n\npublic:\n    InPlaceMutableDeque( int capacity = BaseType::DefaultCapacity ) : BaseType( capacity ) {}\n\tvirtual ~InPlaceMutableDeque() {};\n\n    using BaseType::PeekBack;\n    using BaseType::PeekFront;\n\tvirtual Elem& PeekBack  (int count = 0); // Returns count-th Item from the end\n\tvirtual Elem& PeekFront (int count = 0); // Returns count-th Item from the beginning\n};\n\n// Same as Deque, but allows to write more elements than maximum capacity\n// Old elements are lost as they are overwritten with the new ones\ntemplate <class Elem, class Allocator = ContainerAllocator<Elem> >\nclass CircularBuffer : public InPlaceMutableDeque<Elem, Allocator>\n{\n    typedef InPlaceMutableDeque<Elem, Allocator> BaseType;\n\npublic:\n    CircularBuffer(int MaxSize = BaseType::DefaultCapacity) : BaseType(MaxSize) { };\n    virtual ~CircularBuffer(){}\n\n    // The following methods are inline as a workaround for a VS bug causing erroneous C4505 warnings\n    // See: http://stackoverflow.com/questions/3051992/compiler-warning-at-c-template-base-class\n    inline virtual void PushBack  (const Elem &Item);    // Adds Item to the end, overwriting the oldest element at the beginning if necessary\n    inline virtual void PushFront (const Elem &Item);    // Adds Item to the beginning, overwriting the oldest element at the end if necessary\n};\n\n//----------------------------------------------------------------------------------\n\n// Deque Constructor function\ntemplate <class Elem, class Allocator>\nDeque<Elem, Allocator>::Deque(int capacity) :\nCapacity( capacity ), Beginning(0), End(0), ElemCount(0)\n{\n    Data = (Elem*) Allocator::Alloc(Capacity * sizeof(Elem));\n}\n\n// Deque Destructor function\ntemplate <class Elem, class Allocator>\nDeque<Elem, Allocator>::~Deque(void)\n{\n    Clear();\n    Allocator::Free(Data);\n}\n\ntemplate <class Elem, class Allocator>\nvoid Deque<Elem, Allocator>::Clear()\n{\n    if (!IsEmpty())\n    {\n        if (Beginning < End)\n        {\n            // no wrap-around\n            Allocator::DestructArray(Data + Beginning, End - Beginning);\n        }\n        else\n        {\n            // wrap-around\n            Allocator::DestructArray(Data + Beginning, Capacity - Beginning);\n            Allocator::DestructArray(Data, End);\n        }\n    }\n    \n    Beginning = 0;\n    End       = 0;\n    ElemCount = 0;\n}\n\n// Push functions\ntemplate <class Elem, class Allocator>\nvoid Deque<Elem, Allocator>::PushBack(const Elem &Item)\n{\n    // Error Check: Make sure we aren't  \n    // exceeding our maximum storage space\n    OVR_ASSERT( ElemCount < Capacity );\n\n    Allocator::Construct(Data + End, Item);\n    ++End;\n    ++ElemCount;\n\n    // Check for wrap-around\n    if (End >= Capacity)\n        End -= Capacity;\n}\n\ntemplate <class Elem, class Allocator>\nvoid Deque<Elem, Allocator>::PushFront(const Elem &Item)\n{\n    // Error Check: Make sure we aren't  \n    // exceeding our maximum storage space\n    OVR_ASSERT( ElemCount < Capacity );\n\n    --Beginning;\n    // Check for wrap-around\n    if (Beginning < 0)\n        Beginning += Capacity;\n\n    Allocator::Construct(Data + Beginning, Item);\n    ++ElemCount;\n}\n\n// Pop functions\ntemplate <class Elem, class Allocator>\nElem Deque<Elem, Allocator>::PopFront(void)\n{\n    // Error Check: Make sure we aren't reading from an empty Deque\n    OVR_ASSERT( ElemCount > 0 );\n\n\tElem ReturnValue = Data[ Beginning ];\n    Allocator::Destruct(Data + Beginning);\n\n\t++Beginning;\n    --ElemCount;\n\n    // Check for wrap-around\n    if (Beginning >= Capacity)\n        Beginning -= Capacity;\n\n    return ReturnValue;\n}\n\ntemplate <class Elem, class Allocator>\nElem Deque<Elem, Allocator>::PopBack(void)\n{\n    // Error Check: Make sure we aren't reading from an empty Deque\n    OVR_ASSERT( ElemCount > 0 );\n\n    --End;\n    --ElemCount;\n\n    // Check for wrap-around\n    if (End < 0)\n        End += Capacity;\n\n    Elem ReturnValue = Data[ End ];\n    Allocator::Destruct(Data + End);\n\n    return ReturnValue;\n}\n\n// Peek functions\ntemplate <class Elem, class Allocator>\nconst Elem& Deque<Elem, Allocator>::PeekFront(int count) const\n{\n    // Error Check: Make sure we aren't reading from an empty Deque\n    OVR_ASSERT( ElemCount > count );\n\n    int idx = Beginning + count;\n    if (idx >= Capacity)\n        idx -= Capacity;\n    return Data[ idx ];\n}\n\ntemplate <class Elem, class Allocator>\nconst Elem& Deque<Elem, Allocator>::PeekBack(int count) const\n{\n    // Error Check: Make sure we aren't reading from an empty Deque\n    OVR_ASSERT( ElemCount > count );\n\n    int idx = End - count - 1;\n    if (idx < 0)\n        idx += Capacity;\n    return Data[ idx ];\n}\n\n// Mutable Peek functions\ntemplate <class Elem, class Allocator>\nElem& InPlaceMutableDeque<Elem, Allocator>::PeekFront(int count)\n{\n    // Error Check: Make sure we aren't reading from an empty Deque\n    OVR_ASSERT( BaseType::ElemCount > count );\n\n    int idx = BaseType::Beginning + count;\n    if (idx >= BaseType::Capacity)\n        idx -= BaseType::Capacity;\n    return BaseType::Data[ idx ];\n}\n\ntemplate <class Elem, class Allocator>\nElem& InPlaceMutableDeque<Elem, Allocator>::PeekBack(int count)\n{\n    // Error Check: Make sure we aren't reading from an empty Deque\n    OVR_ASSERT( BaseType::ElemCount > count );\n\n    int idx = BaseType::End - count - 1;\n    if (idx < 0)\n        idx += BaseType::Capacity;\n    return BaseType::Data[ idx ];\n}\n\ntemplate <class Elem, class Allocator>\ninline size_t Deque<Elem, Allocator>::GetCapacity(void) const\n{\n    return Capacity;\n}\n\ntemplate <class Elem, class Allocator>\ninline size_t Deque<Elem, Allocator>::GetSize(void) const\n{\n    return ElemCount;\n}\n\ntemplate <class Elem, class Allocator>\ninline bool Deque<Elem, Allocator>::IsEmpty(void) const\n{\n    return ElemCount == 0;\n}\n\ntemplate <class Elem, class Allocator>\ninline bool Deque<Elem, Allocator>::IsFull(void) const\n{\n    return ElemCount == Capacity;\n}\n\n// ******* CircularBuffer<Elem> *******\n// Push functions\ntemplate <class Elem, class Allocator>\nvoid CircularBuffer<Elem, Allocator>::PushBack(const Elem &Item)\n{\n    if (this->IsFull())\n        this->PopFront();\n    BaseType::PushBack(Item);\n}\n\ntemplate <class Elem, class Allocator>\nvoid CircularBuffer<Elem, Allocator>::PushFront(const Elem &Item)\n{\n    if (this->IsFull())\n        this->PopBack();\n    BaseType::PushFront(Item);\n}\n\n};   \n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_File.cpp",
    "content": "/**************************************************************************\n\nFilename    :   OVR_File.cpp\nContent     :   File wrapper class implementation (Win32)\n\nCreated     :   April 5, 1999\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n**************************************************************************/\n\n#define  GFILE_CXX\n\n// Standard C library (Captain Obvious guarantees!)\n#include <stdio.h>\n\n#include \"OVR_File.h\"\n\nnamespace OVR {\n\n// Buffered file adds buffering to an existing file\n// FILEBUFFER_SIZE defines the size of internal buffer, while\n// FILEBUFFER_TOLERANCE controls the amount of data we'll effectively try to buffer\n#define FILEBUFFER_SIZE         (8192-8)\n#define FILEBUFFER_TOLERANCE    4096\n\n// ** Constructor/Destructor\n\n// Hidden constructor\n// Not supposed to be used\nBufferedFile::BufferedFile() : DelegatedFile(0)\n{\n    pBuffer     = (uint8_t*)OVR_ALLOC(FILEBUFFER_SIZE);\n    BufferMode  = NoBuffer;\n    FilePos     = 0;\n    Pos         = 0;\n    DataSize    = 0;\n}\n\n// Takes another file as source\nBufferedFile::BufferedFile(File *pfile) : DelegatedFile(pfile)\n{\n    pBuffer     = (uint8_t*)OVR_ALLOC(FILEBUFFER_SIZE);\n    BufferMode  = NoBuffer;\n    FilePos     = pfile->LTell();\n    Pos         = 0;\n    DataSize    = 0;\n}\n\n\n// Destructor\nBufferedFile::~BufferedFile()\n{\n    // Flush in case there's data\n    if (pFile)\n        FlushBuffer();\n    // Get rid of buffer\n    if (pBuffer)\n        OVR_FREE(pBuffer);\n}\n\n/*\nbool    BufferedFile::VCopy(const Object &source)\n{\n    if (!DelegatedFile::VCopy(source))\n        return 0;\n\n    // Data members\n    BufferedFile *psource = (BufferedFile*)&source;\n\n    // Buffer & the mode it's in\n    pBuffer         = psource->pBuffer;\n    BufferMode      = psource->BufferMode;\n    Pos             = psource->Pos;\n    DataSize        = psource->DataSize;\n    return 1;\n}\n*/\n\n// Initializes buffering to a certain mode\nbool    BufferedFile::SetBufferMode(BufferModeType mode)\n{\n    if (!pBuffer)\n        return false;\n    if (mode == BufferMode)\n        return true;\n     \n    FlushBuffer();\n\n    // Can't set write mode if we can't write\n    if ((mode==WriteBuffer) && (!pFile || !pFile->IsWritable()) )\n        return 0;\n\n    // And SetMode\n    BufferMode = mode;\n    Pos        = 0;\n    DataSize   = 0;\n    return 1;\n}\n\n// Flushes buffer\nvoid    BufferedFile::FlushBuffer()\n{\n    switch(BufferMode)\n    {\n        case WriteBuffer:\n            // Write data in buffer\n            FilePos += pFile->Write(pBuffer,Pos);\n            Pos = 0;\n            break;\n\n        case ReadBuffer:\n            // Seek back & reset buffer data\n            if ((DataSize-Pos)>0)\n                FilePos = pFile->LSeek(-(int)(DataSize-Pos), Seek_Cur);\n            DataSize = 0;\n            Pos      = 0;\n            break;\n        default:\n            // not handled!\n            break;\n    }\n}\n\n// Reloads data for ReadBuffer\nvoid    BufferedFile::LoadBuffer()\n{\n    if (BufferMode == ReadBuffer)\n    {\n        // We should only reload once all of pre-loaded buffer is consumed.\n        OVR_ASSERT(Pos == DataSize);\n\n        // WARNING: Right now LoadBuffer() assumes the buffer's empty\n        int sz   = pFile->Read(pBuffer,FILEBUFFER_SIZE);\n        DataSize = sz<0 ? 0 : (unsigned)sz;\n        Pos      = 0;\n        FilePos  += DataSize;\n    }\n}\n\n\n// ** Overridden functions\n\n// We override all the functions that can possibly\n// require buffer mode switch, flush, or extra calculations\n\n// Tell() requires buffer adjustment\nint     BufferedFile::Tell()\n{\n    if (BufferMode == ReadBuffer)\n        return int (FilePos - DataSize + Pos);\n\n    int pos = pFile->Tell();\n    // Adjust position based on buffer mode & data\n    if (pos!=-1)\n    {\n        OVR_ASSERT(BufferMode != ReadBuffer);\n        if (BufferMode == WriteBuffer)\n            pos += Pos;\n    }\n    return pos;\n}\n\nint64_t BufferedFile::LTell()\n{\n    if (BufferMode == ReadBuffer)\n        return FilePos - DataSize + Pos;\n\n    int64_t pos = pFile->LTell();\n    if (pos!=-1)\n    {\n        OVR_ASSERT(BufferMode != ReadBuffer);\n        if (BufferMode == WriteBuffer)\n            pos += Pos;\n    }\n    return pos;\n}\n\nint     BufferedFile::GetLength()\n{\n    int len = pFile->GetLength();\n    // If writing through buffer, file length may actually be bigger\n    if ((len!=-1) && (BufferMode==WriteBuffer))\n    {\n        int currPos = pFile->Tell() + Pos;\n        if (currPos>len)\n            len = currPos;\n    }\n    return len;\n}\nint64_t BufferedFile::LGetLength()\n{\n    int64_t len = pFile->LGetLength();\n    // If writing through buffer, file length may actually be bigger\n    if ((len!=-1) && (BufferMode==WriteBuffer))\n    {\n        int64_t currPos = pFile->LTell() + Pos;\n        if (currPos>len)\n            len = currPos;\n    }\n    return len;\n}\n\n/*\nbool    BufferedFile::Stat(FileStats *pfs)\n{\n    // Have to fix up length is stat\n    if (pFile->Stat(pfs))\n    {\n        if (BufferMode==WriteBuffer)\n        {\n            int64_t currPos = pFile->LTell() + Pos;\n            if (currPos > pfs->Size)\n            {\n                pfs->Size   = currPos;\n                // ??\n                pfs->Blocks = (pfs->Size+511) >> 9;\n            }\n        }\n        return 1;\n    }\n    return 0;\n}\n*/\n\nint     BufferedFile::Write(const uint8_t *psourceBuffer, int numBytes)\n{\n    if ( (BufferMode==WriteBuffer) || SetBufferMode(WriteBuffer))\n    {\n        // If not data space in buffer, flush\n        if ((FILEBUFFER_SIZE-(int)Pos)<numBytes)\n        {\n            FlushBuffer();\n            // If bigger then tolerance, just write directly\n            if (numBytes>FILEBUFFER_TOLERANCE)\n            {\n                int sz = pFile->Write(psourceBuffer,numBytes);\n                if (sz > 0)\n                    FilePos += sz;\n                return sz;\n            }\n        }\n\n        // Enough space in buffer.. so copy to it\n        memcpy(pBuffer+Pos, psourceBuffer, numBytes);\n        Pos += numBytes;\n        return numBytes;\n    }\n    int sz = pFile->Write(psourceBuffer,numBytes);\n    if (sz > 0)\n        FilePos += sz;\n    return sz;\n}\n\nint     BufferedFile::Read(uint8_t *pdestBuffer, int numBytes)\n{\n    if ( (BufferMode==ReadBuffer) || SetBufferMode(ReadBuffer))\n    {\n        // Data in buffer... copy it\n        if ((int)(DataSize-Pos) >= numBytes)\n        {\n            memcpy(pdestBuffer, pBuffer+Pos, numBytes);\n            Pos += numBytes;\n            return numBytes;\n        }\n\n        // Not enough data in buffer, copy buffer\n        int     readBytes = DataSize-Pos;\n        memcpy(pdestBuffer, pBuffer+Pos, readBytes);\n        numBytes    -= readBytes;\n        pdestBuffer += readBytes;\n        Pos = DataSize;\n\n        // Don't reload buffer if more then tolerance\n        // (No major advantage, and we don't want to write a loop)\n        if (numBytes>FILEBUFFER_TOLERANCE)\n        {\n            numBytes = pFile->Read(pdestBuffer,numBytes);\n            if (numBytes > 0)\n            {\n                FilePos += numBytes;\n                Pos = DataSize = 0;\n            }\n            return readBytes + ((numBytes==-1) ? 0 : numBytes);\n        }\n\n        // Reload the buffer\n        // WARNING: Right now LoadBuffer() assumes the buffer's empty\n        LoadBuffer();\n        if ((int)(DataSize-Pos) < numBytes)\n            numBytes = (int)DataSize-Pos;\n\n        memcpy(pdestBuffer, pBuffer+Pos, numBytes);\n        Pos += numBytes;\n        return numBytes + readBytes;\n        \n        /*\n        // Alternative Read implementation. The one above is probably better\n        // due to FILEBUFFER_TOLERANCE.\n        int     total = 0;\n\n        do {\n            int     bufferBytes = (int)(DataSize-Pos);\n            int     copyBytes = (bufferBytes > numBytes) ? numBytes : bufferBytes;\n\n            memcpy(pdestBuffer, pBuffer+Pos, copyBytes);\n            numBytes    -= copyBytes;\n            pdestBuffer += copyBytes;\n            Pos         += copyBytes;\n            total       += copyBytes;\n\n            if (numBytes == 0)\n                break;\n            LoadBuffer();\n\n        } while (DataSize > 0);\n\n        return total;\n        */     \n    }\n    int sz = pFile->Read(pdestBuffer,numBytes);\n    if (sz > 0)\n        FilePos += sz;\n    return sz;\n}\n\n\nint     BufferedFile::SkipBytes(int numBytes)\n{\n    int skippedBytes = 0;\n\n    // Special case for skipping a little data in read buffer\n    if (BufferMode==ReadBuffer)\n    {\n        skippedBytes = (((int)DataSize-(int)Pos) >= numBytes) ? numBytes : (DataSize-Pos);\n        Pos          += skippedBytes;\n        numBytes     -= skippedBytes;\n    }\n\n    if (numBytes)\n    {\n        numBytes = pFile->SkipBytes(numBytes);\n        // Make sure we return the actual number skipped, or error\n        if (numBytes!=-1)\n        {\n            skippedBytes += numBytes;\n            FilePos += numBytes;\n            Pos = DataSize = 0;\n        }\n        else if (skippedBytes <= 0)\n            skippedBytes = -1;\n    }\n    return skippedBytes;\n}\n\nint     BufferedFile::BytesAvailable()\n{\n    int available = pFile->BytesAvailable();\n    // Adjust available size based on buffers\n    switch(BufferMode)\n    {\n        case ReadBuffer:\n            available += DataSize-Pos;\n            break;\n        case WriteBuffer:\n            available -= Pos;\n            if (available<0)\n                available= 0;\n            break;\n        default:\n            break;\n    }\n    return available;\n}\n\nbool    BufferedFile::Flush()\n{\n    FlushBuffer();\n    return pFile->Flush();\n}\n\n// Seeking could be optimized better..\nint     BufferedFile::Seek(int offset, int origin)\n{    \n    if (BufferMode == ReadBuffer)\n    {\n        if (origin == Seek_Cur)\n        {\n            // Seek can fall either before or after Pos in the buffer,\n            // but it must be within bounds.\n            if (((unsigned(offset) + Pos)) <= DataSize)\n            {\n                Pos += offset;\n                return int (FilePos - DataSize + Pos);\n            }\n\n            // Lightweight buffer \"Flush\". We do this to avoid an extra seek\n            // back operation which would take place if we called FlushBuffer directly.\n            origin = Seek_Set;\n            OVR_ASSERT(((FilePos - DataSize + Pos) + (uint64_t)offset) < ~(uint64_t)0);\n            offset = (int)(FilePos - DataSize + Pos) + offset;\n            Pos = DataSize = 0;\n        }\n        else if (origin == Seek_Set)\n        {\n            if (((unsigned)offset - (FilePos-DataSize)) <= DataSize)\n            {\n                OVR_ASSERT((FilePos-DataSize) < ~(uint64_t)0);\n                Pos = (unsigned)offset - (unsigned)(FilePos-DataSize);\n                return offset;\n            }\n            Pos = DataSize = 0;\n        }\n        else\n        {\n            FlushBuffer();\n        }\n    }\n    else\n    {\n        FlushBuffer();\n    }    \n\n    /*\n    // Old Seek Logic\n    if (origin == Seek_Cur && offset + Pos < DataSize)\n    {\n        //OVR_ASSERT((FilePos - DataSize) >= (FilePos - DataSize + Pos + offset));\n        Pos += offset;\n        OVR_ASSERT(int (Pos) >= 0);\n        return int (FilePos - DataSize + Pos);\n    }\n    else if (origin == Seek_Set && unsigned(offset) >= FilePos - DataSize && unsigned(offset) < FilePos)\n    {\n        Pos = unsigned(offset - FilePos + DataSize);\n        OVR_ASSERT(int (Pos) >= 0);\n        return int (FilePos - DataSize + Pos);\n    }   \n    \n    FlushBuffer();\n    */\n\n\n    FilePos = pFile->Seek(offset,origin);\n    return int (FilePos);\n}\n\nint64_t BufferedFile::LSeek(int64_t offset, int origin)\n{\n    if (BufferMode == ReadBuffer)\n    {\n        if (origin == Seek_Cur)\n        {\n            // Seek can fall either before or after Pos in the buffer,\n            // but it must be within bounds.\n            if (((unsigned(offset) + Pos)) <= DataSize)\n            {\n                Pos += (unsigned)offset;\n                return int64_t(FilePos - DataSize + Pos);\n            }\n\n            // Lightweight buffer \"Flush\". We do this to avoid an extra seek\n            // back operation which would take place if we called FlushBuffer directly.\n            origin = Seek_Set;            \n            offset = (int64_t)(FilePos - DataSize + Pos) + offset;\n            Pos = DataSize = 0;\n        }\n        else if (origin == Seek_Set)\n        {\n            if (((uint64_t)offset - (FilePos-DataSize)) <= DataSize)\n            {                \n                Pos = (unsigned)((uint64_t)offset - (FilePos-DataSize));\n                return offset;\n            }\n            Pos = DataSize = 0;\n        }\n        else\n        {\n            FlushBuffer();\n        }\n    }\n    else\n    {\n        FlushBuffer();\n    }\n\n/*\n    OVR_ASSERT(BufferMode != NoBuffer);\n\n    if (origin == Seek_Cur && offset + Pos < DataSize)\n    {\n        Pos += int (offset);\n        return FilePos - DataSize + Pos;\n    }\n    else if (origin == Seek_Set && offset >= int64_t(FilePos - DataSize) && offset < int64_t(FilePos))\n    {\n        Pos = unsigned(offset - FilePos + DataSize);\n        return FilePos - DataSize + Pos;\n    }\n\n    FlushBuffer();\n    */\n\n    FilePos = pFile->LSeek(offset,origin);\n    return FilePos;\n}\n\nint     BufferedFile::CopyFromStream(File *pstream, int byteSize)\n{\n    // We can't rely on overridden Write()\n    // because delegation doesn't override virtual pointers\n    // So, just re-implement\n    uint8_t*  buff = new uint8_t[0x4000];\n    int     count = 0;\n    int     szRequest, szRead, szWritten;\n\n    while(byteSize)\n    {\n        szRequest = (byteSize > int(sizeof(buff))) ? int(sizeof(buff)) : byteSize;\n\n        szRead    = pstream->Read(buff,szRequest);\n        szWritten = 0;\n        if (szRead > 0)\n            szWritten = Write(buff,szRead);\n\n        count   +=szWritten;\n        byteSize-=szWritten;\n        if (szWritten < szRequest)\n            break;\n    }\n\n\tdelete[] buff;\n\n    return count;\n}\n\n// Closing files\nbool    BufferedFile::Close()\n{\n    switch(BufferMode)\n    {\n        case WriteBuffer:\n            FlushBuffer();\n            break;\n        case ReadBuffer:\n            // No need to seek back on close\n            BufferMode = NoBuffer;\n            break;\n        default:\n            break;\n    }\n    return pFile->Close();\n}\n\n\n// ***** Global path helpers\n\n// Find trailing short filename in a path.\nconst char* OVR_CDECL GetShortFilename(const char* purl)\n{    \n    size_t len = OVR_strlen(purl);\n    for (size_t i=len; i>0; i--) \n        if (purl[i]=='\\\\' || purl[i]=='/')\n            return purl+i+1;\n    return purl;\n}\n\n} // OVR\n\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_File.h",
    "content": "/************************************************************************************\n\nPublicHeader:   Kernel\nFilename    :   OVR_File.h\nContent     :   Header for all internal file management - functions and structures\n                to be inherited by OS specific subclasses.\nCreated     :   September 19, 2012\nNotes       : \n\nNotes       :   errno may not be preserved across use of BaseFile member functions\n            :   Directories cannot be deleted while files opened from them are in use\n                (For the GetFullName function)\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_File_h\n#define OVR_File_h\n\n#include \"OVR_RefCount.h\"\n#include \"OVR_Std.h\"\n#include \"OVR_Alg.h\"\n\n#include <stdio.h>\n#include \"OVR_String.h\"\n\nnamespace OVR {\n\n// ***** Declared classes\nclass   FileConstants;\nclass   File;\nclass   DelegatedFile;\nclass   BufferedFile;\n\n\n// ***** Flags for File & Directory accesses\n\nclass FileConstants\n{\npublic:\n\n    // *** File open flags\n    enum OpenFlags\n    {\n        Open_Read       = 1,\n        Open_Write      = 2,\n        Open_ReadWrite  = 3,\n\n        // Opens file and truncates it to zero length\n        // - file must have write permission\n        // - when used with Create, it opens an existing \n        //   file and empties it or creates a new file\n        Open_Truncate   = 4,\n\n        // Creates and opens new file \n        // - does not erase contents if file already\n        //   exists unless combined with Truncate\n        Open_Create     = 8,\n\n         // Returns an error value if the file already exists\n        Open_CreateOnly = 24,\n\n        // Open file with buffering\n        Open_Buffered    = 32\n    };\n\n    // *** File Mode flags\n    enum Modes\n    {\n        Mode_Read       = 0444,\n        Mode_Write      = 0222,\n        Mode_Execute    = 0111,\n\n        Mode_ReadWrite  = 0666\n    };\n\n    // *** Seek operations\n    enum SeekOps\n    {\n        Seek_Set        = 0,\n        Seek_Cur        = 1,\n        Seek_End        = 2\n    };\n\n    // *** Errors\n    enum Errors\n    {\n        Error_FileNotFound  = 0x1001,\n        Error_Access        = 0x1002,\n        Error_IOError       = 0x1003,\n        Error_DiskFull      = 0x1004\n    };\n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** File Class\n\n// The pure virtual base random-access file\n// This is a base class to all files\n\nclass File : public RefCountBase<File>, public FileConstants\n{   \npublic:\n    File() { }\n    // ** Location Information\n\n    // Returns a file name path relative to the 'reference' directory\n    // This is often a path that was used to create a file\n    // (this is not a global path, global path can be obtained with help of directory)\n    virtual const char* GetFilePath() = 0;\n                                                                                        \n\n    // ** File Information\n\n    // Return 1 if file's usable (open)\n    virtual bool        IsValid() = 0;\n    // Return 1 if file's writable, otherwise 0                                         \n    virtual bool        IsWritable() = 0;\n                                                                                        \n    // Return position\n    virtual int         Tell() = 0;\n    virtual int64_t     LTell() = 0;\n    \n    // File size                                                                        \n    virtual int         GetLength() = 0;\n    virtual int64_t     LGetLength() = 0;\n                                                                                        \n    // Returns file stats                                                               \n    // 0 for failure                                                                    \n    //virtual bool      Stat(FileStats *pfs) = 0;\n                                                                                        \n    // Return errno-based error code                                                    \n    // Useful if any other function failed                                              \n    virtual int         GetErrorCode() = 0;\n                                                                                        \n                                                                                        \n    // ** Stream implementation & I/O\n\n    // Blocking write, will write in the given number of bytes to the stream\n    // Returns : -1 for error\n    //           Otherwise number of bytes read \n    virtual int         Write(const uint8_t *pbufer, int numBytes) = 0;\n    // Blocking read, will read in the given number of bytes or less from the stream\n    // Returns : -1 for error\n    //           Otherwise number of bytes read,\n    //           if 0 or < numBytes, no more bytes available; end of file or the other side of stream is closed\n    virtual int         Read(uint8_t *pbufer, int numBytes) = 0;\n\n    // Skips (ignores) a given # of bytes\n    // Same return values as Read\n    virtual int         SkipBytes(int numBytes) = 0;\n        \n    // Returns the number of bytes available to read from a stream without blocking\n    // For a file, this should generally be number of bytes to the end\n    virtual int         BytesAvailable() = 0;\n\n    // Causes any implementation's buffered data to be delivered to destination\n    // Return 0 for error\n    virtual bool        Flush() = 0;\n                                                                                            \n\n    // Need to provide a more optimized implementation that doe snot necessarily involve a lot of seeking\n    inline bool         IsEOF() { return !BytesAvailable(); }\n    \n\n    // Seeking                                                                              \n    // Returns new position, -1 for error                                                   \n    virtual int         Seek(int offset, int origin=Seek_Set) = 0;\n    virtual int64_t     LSeek(int64_t offset, int origin=Seek_Set) = 0;\n    // Seek simplification\n    int                 SeekToBegin()           {return Seek(0); }\n    int                 SeekToEnd()             {return Seek(0,Seek_End); }\n    int                 Skip(int numBytes)     {return Seek(numBytes,Seek_Cur); }\n                        \n\n    // Appends other file data from a stream\n    // Return -1 for error, else # of bytes written\n    virtual int         CopyFromStream(File *pstream, int byteSize) = 0;\n\n    // Closes the file\n    // After close, file cannot be accessed \n    virtual bool        Close() = 0;\n\n\n    // ***** Inlines for convenient primitive type serialization\n\n    // Read/Write helpers\nprivate:\n    uint64_t  PRead64()           { uint64_t v = 0; Read((uint8_t*)&v, 8); return v; }\n    uint32_t  PRead32()           { uint32_t v = 0; Read((uint8_t*)&v, 4); return v; }\n    uint16_t  PRead16()           { uint16_t v = 0; Read((uint8_t*)&v, 2); return v; }\n    uint8_t PRead8()            { uint8_t  v = 0; Read((uint8_t*)&v, 1); return v; }\n    void    PWrite64(uint64_t v)  { Write((uint8_t*)&v, 8); }\n    void    PWrite32(uint32_t v)  { Write((uint8_t*)&v, 4); }\n    void    PWrite16(uint16_t v)  { Write((uint8_t*)&v, 2); }\n    void    PWrite8(uint8_t v)  { Write((uint8_t*)&v, 1); }\n\npublic:\n\n    // Writing primitive types - Little Endian\n    inline void    WriteUByte(uint8_t v)       { PWrite8((uint8_t)Alg::ByteUtil::SystemToLE(v));     }\n    inline void    WriteSByte(int8_t v)        { PWrite8((uint8_t)Alg::ByteUtil::SystemToLE(v));     }\n    inline void    WriteUInt8(uint8_t v)       { PWrite8((uint8_t)Alg::ByteUtil::SystemToLE(v));     }\n    inline void    WriteSInt8(int8_t v)        { PWrite8((uint8_t)Alg::ByteUtil::SystemToLE(v));     }\n    inline void    WriteUInt16(uint16_t v)       { PWrite16((uint16_t)Alg::ByteUtil::SystemToLE(v));   }\n    inline void    WriteSInt16(int16_t v)       { PWrite16((uint16_t)Alg::ByteUtil::SystemToLE(v));   }\n    inline void    WriteUInt32(uint32_t v)       { PWrite32((uint32_t)Alg::ByteUtil::SystemToLE(v));   }\n    inline void    WriteSInt32(int32_t v)       { PWrite32((uint32_t)Alg::ByteUtil::SystemToLE(v));   }\n    inline void    WriteUInt64(uint64_t v)       { PWrite64((uint64_t)Alg::ByteUtil::SystemToLE(v));   }\n    inline void    WriteSInt64(int64_t v)       { PWrite64((uint64_t)Alg::ByteUtil::SystemToLE(v));   }\n    inline void    WriteFloat(float v)         { v = Alg::ByteUtil::SystemToLE(v); Write((uint8_t*)&v, 4); } \n    inline void    WriteDouble(double v)       { v = Alg::ByteUtil::SystemToLE(v); Write((uint8_t*)&v, 8); }\n    // Writing primitive types - Big Endian\n    inline void    WriteUByteBE(uint8_t v)     { PWrite8((uint8_t)Alg::ByteUtil::SystemToBE(v));     }\n    inline void    WriteSByteBE(int8_t v)      { PWrite8((uint8_t)Alg::ByteUtil::SystemToBE(v));     }\n    inline void    WriteUInt8BE(uint16_t v)      { PWrite8((uint8_t)Alg::ByteUtil::SystemToBE(v));     }\n    inline void    WriteSInt8BE(int16_t v)      { PWrite8((uint8_t)Alg::ByteUtil::SystemToBE(v));     }\n    inline void    WriteUInt16BE(uint16_t v)     { PWrite16((uint16_t)Alg::ByteUtil::SystemToBE(v));   }\n    inline void    WriteSInt16BE(uint16_t v)     { PWrite16((uint16_t)Alg::ByteUtil::SystemToBE(v));   }\n    inline void    WriteUInt32BE(uint32_t v)     { PWrite32((uint32_t)Alg::ByteUtil::SystemToBE(v));   }\n    inline void    WriteSInt32BE(uint32_t v)     { PWrite32((uint32_t)Alg::ByteUtil::SystemToBE(v));   }\n    inline void    WriteUInt64BE(uint64_t v)     { PWrite64((uint64_t)Alg::ByteUtil::SystemToBE(v));   }\n    inline void    WriteSInt64BE(uint64_t v)     { PWrite64((uint64_t)Alg::ByteUtil::SystemToBE(v));   }\n    inline void    WriteFloatBE(float v)       { v = Alg::ByteUtil::SystemToBE(v); Write((uint8_t*)&v, 4); }\n    inline void    WriteDoubleBE(double v)     { v = Alg::ByteUtil::SystemToBE(v); Write((uint8_t*)&v, 8); }\n        \n    // Reading primitive types - Little Endian\n    inline uint8_t ReadUByte()                 { return (uint8_t)Alg::ByteUtil::LEToSystem(PRead8());    }\n    inline int8_t  ReadSByte()                 { return (int8_t)Alg::ByteUtil::LEToSystem(PRead8());    }\n    inline uint8_t ReadUInt8()                 { return (uint8_t)Alg::ByteUtil::LEToSystem(PRead8());    }\n    inline int8_t  ReadSInt8()                 { return (int8_t)Alg::ByteUtil::LEToSystem(PRead8());    }\n    inline uint16_t  ReadUInt16()                { return (uint16_t)Alg::ByteUtil::LEToSystem(PRead16());  }\n    inline int16_t ReadSInt16()                { return (int16_t)Alg::ByteUtil::LEToSystem(PRead16());  }\n    inline uint32_t  ReadUInt32()                { return (uint32_t)Alg::ByteUtil::LEToSystem(PRead32());  }\n    inline int32_t ReadSInt32()                { return (int32_t)Alg::ByteUtil::LEToSystem(PRead32());  }\n    inline uint64_t  ReadUInt64()                { return (uint64_t)Alg::ByteUtil::LEToSystem(PRead64());  }\n    inline int64_t ReadSInt64()                { return (int64_t)Alg::ByteUtil::LEToSystem(PRead64());  }\n    inline float   ReadFloat()                 { float v = 0.0f; Read((uint8_t*)&v, 4); return Alg::ByteUtil::LEToSystem(v); }\n    inline double  ReadDouble()                { double v = 0.0; Read((uint8_t*)&v, 8); return Alg::ByteUtil::LEToSystem(v); }\n    // Reading primitive types - Big Endian\n    inline uint8_t ReadUByteBE()               { return (uint8_t)Alg::ByteUtil::BEToSystem(PRead8());    }\n    inline int8_t  ReadSByteBE()               { return (int8_t)Alg::ByteUtil::BEToSystem(PRead8());    }\n    inline uint8_t ReadUInt8BE()               { return (uint8_t)Alg::ByteUtil::BEToSystem(PRead8());    }\n    inline int8_t  ReadSInt8BE()               { return (int8_t)Alg::ByteUtil::BEToSystem(PRead8());    }\n    inline uint16_t  ReadUInt16BE()              { return (uint16_t)Alg::ByteUtil::BEToSystem(PRead16());  }\n    inline int16_t ReadSInt16BE()              { return (int16_t)Alg::ByteUtil::BEToSystem(PRead16());  }\n    inline uint32_t  ReadUInt32BE()              { return (uint32_t)Alg::ByteUtil::BEToSystem(PRead32());  }\n    inline int32_t ReadSInt32BE()              { return (int32_t)Alg::ByteUtil::BEToSystem(PRead32());  }\n    inline uint64_t  ReadUInt64BE()              { return (uint64_t)Alg::ByteUtil::BEToSystem(PRead64());  }\n    inline int64_t ReadSInt64BE()              { return (int64_t)Alg::ByteUtil::BEToSystem(PRead64());  }\n    inline float   ReadFloatBE()               { float v = 0.0f; Read((uint8_t*)&v, 4); return Alg::ByteUtil::BEToSystem(v); }\n    inline double  ReadDoubleBE()              { double v = 0.0; Read((uint8_t*)&v, 8); return Alg::ByteUtil::BEToSystem(v); }\n};\n\n\n// *** Delegated File\n\nclass DelegatedFile : public File\n{\nprotected:\n    // Delegating file pointer\n    Ptr<File>     pFile;\n\n    // Hidden default constructor\n    DelegatedFile() : pFile(0)                             { }\n    DelegatedFile(const DelegatedFile &source) : File()    { OVR_UNUSED(source); }\npublic:\n    // Constructors\n    DelegatedFile(File *pfile) : pFile(pfile)     { }\n\n    // ** Location Information  \n    virtual const char* GetFilePath()                               { return pFile->GetFilePath(); }    \n\n    // ** File Information                                                      \n    virtual bool        IsValid()                                   { return pFile && pFile->IsValid(); }   \n    virtual bool        IsWritable()                                { return pFile->IsWritable(); }\n//  virtual bool        IsRecoverable()                             { return pFile->IsRecoverable(); }          \n                                                                    \n    virtual int         Tell()                                      { return pFile->Tell(); }\n    virtual int64_t     LTell()                                     { return pFile->LTell(); }\n    \n    virtual int         GetLength()                                 { return pFile->GetLength(); }\n    virtual int64_t     LGetLength()                                { return pFile->LGetLength(); }\n    \n    //virtual bool      Stat(FileStats *pfs)                        { return pFile->Stat(pfs); }\n    \n    virtual int         GetErrorCode()                              { return pFile->GetErrorCode(); }\n    \n    // ** Stream implementation & I/O\n    virtual int         Write(const uint8_t *pbuffer, int numBytes)   { return pFile->Write(pbuffer,numBytes); }  \n    virtual int         Read(uint8_t *pbuffer, int numBytes)          { return pFile->Read(pbuffer,numBytes); }   \n    \n    virtual int         SkipBytes(int numBytes)                     { return pFile->SkipBytes(numBytes); }      \n    \n    virtual int         BytesAvailable()                            { return pFile->BytesAvailable(); } \n    \n    virtual bool        Flush()                                     { return pFile->Flush(); }\n                                                                    \n    // Seeking                                                      \n    virtual int         Seek(int offset, int origin=Seek_Set)       { return pFile->Seek(offset,origin); }\n    virtual int64_t     LSeek(int64_t offset, int origin=Seek_Set)   { return pFile->LSeek(offset,origin); }\n\n    virtual int         CopyFromStream(File *pstream, int byteSize) { return pFile->CopyFromStream(pstream,byteSize); }\n                        \n    // Closing the file \n    virtual bool        Close()                                     { return pFile->Close(); }    \n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** Buffered File\n\n// This file class adds buffering to an existing file\n// Buffered file never fails by itself; if there's not\n// enough memory for buffer, no buffer's used\n\nclass BufferedFile : public DelegatedFile\n{   \nprotected:  \n    enum BufferModeType\n    {\n        NoBuffer,\n        ReadBuffer,\n        WriteBuffer\n    };\n\n    // Buffer & the mode it's in\n    uint8_t*        pBuffer;\n    BufferModeType  BufferMode;\n    // Position in buffer\n    unsigned        Pos;\n    // Data in buffer if reading\n    unsigned        DataSize;\n    // Underlying file position \n    uint64_t        FilePos;\n\n    // Initializes buffering to a certain mode\n    bool    SetBufferMode(BufferModeType mode);\n    // Flushes buffer\n    // WriteBuffer - write data to disk, ReadBuffer - reset buffer & fix file position  \n    void    FlushBuffer();\n    // Loads data into ReadBuffer\n    // WARNING: Right now LoadBuffer() assumes the buffer's empty\n    void    LoadBuffer();\n\n    // Hidden constructor\n    BufferedFile();\n    BufferedFile(const BufferedFile &) : DelegatedFile(), pBuffer(NULL), BufferMode(NoBuffer), Pos(0), DataSize(0), FilePos(0) { }\n\npublic:\n\n    // Constructor\n    // - takes another file as source\n    BufferedFile(File *pfile);\n    ~BufferedFile();\n    \n    \n    // ** Overridden functions\n\n    // We override all the functions that can possibly\n    // require buffer mode switch, flush, or extra calculations\n    virtual int         Tell();\n    virtual int64_t     LTell();\n\n    virtual int         GetLength();\n    virtual int64_t     LGetLength();\n\n//  virtual bool        Stat(GFileStats *pfs);  \n\n    virtual int         Write(const uint8_t *pbufer, int numBytes);\n    virtual int         Read(uint8_t *pbufer, int numBytes);\n\n    virtual int         SkipBytes(int numBytes);\n\n    virtual int         BytesAvailable();\n\n    virtual bool        Flush();\n\n    virtual int         Seek(int offset, int origin=Seek_Set);\n    virtual int64_t     LSeek(int64_t offset, int origin=Seek_Set);\n\n    virtual int         CopyFromStream(File *pstream, int byteSize);\n    \n    virtual bool        Close();    \n};                          \n\n\n//-----------------------------------------------------------------------------------\n// ***** Memory File\n\nclass MemoryFile : public File\n{\npublic:\n\n    const char* GetFilePath()       { return FilePath.ToCStr(); }\n\n    bool        IsValid()           { return Valid; }\n    bool        IsWritable()        { return false; }\n\n    bool        Flush()             { return true; }\n    int         GetErrorCode()      { return 0; }\n\n    int         Tell()              { return FileIndex; }\n    int64_t     LTell()             { return (int64_t) FileIndex; }\n\n    int         GetLength()         { return FileSize; }\n    int64_t     LGetLength()        { return (int64_t) FileSize; }\n\n    bool        Close()\n    {\n        Valid = false;\n        return false;\n    }\n\n    int         CopyFromStream(File *pstream, int byteSize)\n    {   OVR_UNUSED2(pstream, byteSize);\n        return 0;\n    }\n\n    int         Write(const uint8_t *pbuffer, int numBytes)\n    {   OVR_UNUSED2(pbuffer, numBytes);\n        return 0;\n    }\n\n    int         Read(uint8_t *pbufer, int numBytes)\n    {\n        if (FileIndex + numBytes > FileSize)\n        {\n            numBytes = FileSize - FileIndex;\n        }\n\n        if (numBytes > 0)\n        {\n            ::memcpy (pbufer, &FileData [FileIndex], numBytes);\n\n            FileIndex += numBytes;\n        }\n\n        return numBytes;\n    }\n\n    int         SkipBytes(int numBytes)\n    {\n        if (FileIndex + numBytes > FileSize)\n        {\n            numBytes = FileSize - FileIndex;\n        }\n\n        FileIndex += numBytes;\n\n        return numBytes;\n    }\n\n    int         BytesAvailable()\n    {\n        return (FileSize - FileIndex);\n    }\n\n    int         Seek(int offset, int origin = Seek_Set)\n    {\n        switch (origin)\n        {\n        case Seek_Set : FileIndex  = offset;               break;\n        case Seek_Cur : FileIndex += offset;               break;\n        case Seek_End : FileIndex  = FileSize - offset;  break;\n        }\n\n        return FileIndex;\n    }\n\n    int64_t     LSeek(int64_t offset, int origin = Seek_Set)\n    {\n        return (int64_t) Seek((int) offset, origin);\n    }\n\npublic:\n\n    MemoryFile (const String& fileName, const uint8_t *pBuffer, int buffSize)\n        : FilePath(fileName)\n    {\n        FileData  = pBuffer;\n        FileSize  = buffSize;\n        FileIndex = 0;\n        Valid     = (!fileName.IsEmpty() && pBuffer && buffSize > 0) ? true : false;\n    }\n\n    // pfileName should be encoded as UTF-8 to support international file names.\n    MemoryFile (const char* pfileName, const uint8_t *pBuffer, int buffSize)\n        : FilePath(pfileName)\n    {\n        FileData  = pBuffer;\n        FileSize  = buffSize;\n        FileIndex = 0;\n        Valid     = (pfileName && pBuffer && buffSize > 0) ? true : false;\n    }\nprivate:\n\n    String       FilePath;\n    const uint8_t *FileData;\n    int          FileSize;\n    int          FileIndex;\n    bool         Valid;\n};\n\n\n// ***** Global path helpers\n\n// Find trailing short filename in a path.\nconst char* OVR_CDECL GetShortFilename(const char* purl);\n\n} // OVR\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_FileFILE.cpp",
    "content": "/**************************************************************************\n\nFilename    :   OVR_FileFILE.cpp\nContent     :   File wrapper class implementation (Win32)\n\nCreated     :   April 5, 1999\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n**************************************************************************/\n\n#define  GFILE_CXX\n\n#include \"OVR_Types.h\"\n#include \"OVR_Log.h\"\n\n// Standard C library (Captain Obvious guarantees!)\n#include <stdio.h>\n#ifndef OVR_OS_WINCE\n#include <sys/stat.h>\n#endif\n\n#include \"OVR_SysFile.h\"\n\n#ifndef OVR_OS_WINCE\n#include <errno.h>\n#endif\n\nnamespace OVR {\n\n// ***** File interface\n\n// ***** FILEFile - C streams file\n\nstatic int SFerror ()\n{\n    if (errno == ENOENT)\n        return FileConstants::Error_FileNotFound;\n    else if (errno == EACCES || errno == EPERM)\n        return FileConstants::Error_Access;\n    else if (errno == ENOSPC)\n        return FileConstants::Error_DiskFull;\n    else\n        return FileConstants::Error_IOError;\n};\n\n#if defined(OVR_OS_WIN32)\n#define WIN32_LEAN_AND_MEAN\n#include \"windows.h\"\n// A simple helper class to disable/enable system error mode, if necessary\n// Disabling happens conditionally only if a drive name is involved\nclass SysErrorModeDisabler\n{\n    BOOL    Disabled;\n    UINT    OldMode;\npublic:\n    SysErrorModeDisabler(const char* pfileName)\n    {\n        if (pfileName && (pfileName[0]!=0) && pfileName[1]==':')\n        {\n            Disabled = TRUE;\n            OldMode = ::SetErrorMode(SEM_FAILCRITICALERRORS);\n        }\n        else\n        {\n            Disabled = 0;\n            OldMode = 0;\n        }\n    }\n\n    ~SysErrorModeDisabler()\n    {\n        if (Disabled) \n            ::SetErrorMode(OldMode);\n    }\n};\n#else\nclass SysErrorModeDisabler\n{\npublic:\n    SysErrorModeDisabler(const char* pfileName) { OVR_UNUSED(pfileName); }\n};\n#endif // OVR_OS_WIN32\n\n\n// This macro enables verification of I/O results after seeks against a pre-loaded\n// full file buffer copy. This is generally not necessary, but can been used to debug\n// memory corruptions; we've seen this fail due to EAX2/DirectSound corrupting memory\n// under FMOD with XP64 (32-bit) and Realtek HA Audio driver.\n//#define GFILE_VERIFY_SEEK_ERRORS\n\n\n// This is the simplest possible file implementation, it wraps around the descriptor\n// This file is delegated to by SysFile.\n\nclass FILEFile : public File\n{\nprotected:\n\n    // Allocated filename\n    String      FileName;\n\n    // File handle & open mode\n    bool        Opened;\n    FILE*       fs;\n    int         OpenFlags;\n    // Error code for last request\n    int         ErrorCode;\n\n    int         LastOp;\n\n#ifdef OVR_FILE_VERIFY_SEEK_ERRORS\n    uint8_t*      pFileTestBuffer;\n    unsigned    FileTestLength;\n    unsigned    TestPos; // File pointer position during tests.\n#endif\n\npublic:\n\n    FILEFile() :\n        FileName(),\n        Opened(false),\n        fs(NULL),\n        OpenFlags(0),\n        ErrorCode(0),\n        LastOp(0)\n    #ifdef OVR_FILE_VERIFY_SEEK_ERRORS\n       ,pFileTestBuffer(NULL)\n       ,FileTestLength(0)\n       ,TestPos(0)\n    #endif\n    {\n    }\n\n    // Initialize file by opening it\n    FILEFile(const String& fileName, int flags, int Mode);\n\n    // The 'pfileName' should be encoded as UTF-8 to support international file names.\n    FILEFile(const char* pfileName, int flags, int Mode);\n\n    ~FILEFile()\n    {\n        if (Opened)\n            Close();\n    }\n\n    virtual const char* GetFilePath();\n\n    // ** File Information\n    virtual bool        IsValid();\n    virtual bool        IsWritable();\n\n    // Return position / file size\n    virtual int         Tell();\n    virtual int64_t     LTell();\n    virtual int         GetLength();\n    virtual int64_t     LGetLength();\n\n//  virtual bool        Stat(FileStats *pfs);\n    virtual int         GetErrorCode();\n\n    // ** Stream implementation & I/O\n    virtual int         Write(const uint8_t *pbuffer, int numBytes);\n    virtual int         Read(uint8_t *pbuffer, int numBytes);\n    virtual int         SkipBytes(int numBytes);\n    virtual int         BytesAvailable();\n    virtual bool        Flush();\n    virtual int         Seek(int offset, int origin);\n    virtual int64_t     LSeek(int64_t offset, int origin);\n    \n    virtual int         CopyFromStream(File *pStream, int byteSize);\n    virtual bool        Close();    \nprivate:\n    void                init();\n};\n\n\n// Initialize file by opening it\nFILEFile::FILEFile(const String& fileName, int flags, int mode)\n  : FileName(fileName), OpenFlags(flags)\n{\n    OVR_UNUSED(mode);\n    init();\n}\n\n// The 'pfileName' should be encoded as UTF-8 to support international file names.\nFILEFile::FILEFile(const char* pfileName, int flags, int mode)\n  : FileName(pfileName), OpenFlags(flags)\n{\n    OVR_UNUSED(mode);\n    init();\n}\n\nvoid FILEFile::init()\n{\n    // Open mode for file's open\n    const char *omode = \"rb\";\n\n    if (OpenFlags & Open_Truncate)\n    {\n        if (OpenFlags & Open_Read)\n            omode = \"w+b\";\n        else\n            omode = \"wb\";\n    }\n    else if (OpenFlags & Open_Create)\n    {\n        if (OpenFlags & Open_Read)\n            omode = \"a+b\";\n        else\n            omode = \"ab\";\n    }\n    else if (OpenFlags & Open_Write)\n        omode = \"r+b\";\n\n#if defined(OVR_OS_MS)\n    SysErrorModeDisabler disabler(FileName.ToCStr());\n#endif\n\n#if defined(OVR_CC_MSVC) && (OVR_CC_MSVC >= 1400)\n    wchar_t womode[16];\n    wchar_t *pwFileName = (wchar_t*)OVR_ALLOC((UTF8Util::GetLength(FileName.ToCStr())+1) * sizeof(wchar_t));\n    UTF8Util::DecodeString(pwFileName, FileName.ToCStr());\n    OVR_ASSERT(strlen(omode) < sizeof(womode)/sizeof(womode[0]));\n    UTF8Util::DecodeString(womode, omode);\n    _wfopen_s(&fs, pwFileName, womode);\n    OVR_FREE(pwFileName);\n#else\n    fs = fopen(FileName.ToCStr(), omode);\n#endif\n    if (fs)\n        rewind (fs);\n    Opened = (fs != NULL);\n    // Set error code\n    if (!Opened)\n        ErrorCode = SFerror();\n    else\n    {\n        // If we are testing file seek correctness, pre-load the entire file so\n        // that we can do comparison tests later.\n#ifdef OVR_FILE_VERIFY_SEEK_ERRORS        \n        TestPos         = 0;\n        fseek(fs, 0, SEEK_END);\n        FileTestLength  = ftell(fs);\n        fseek(fs, 0, SEEK_SET);\n        pFileTestBuffer = (uint8_t*)OVR_ALLOC(FileTestLength);\n        if (pFileTestBuffer)\n        {\n            OVR_ASSERT(FileTestLength == (unsigned)Read(pFileTestBuffer, FileTestLength));\n            Seek(0, Seek_Set);\n        }        \n#endif\n\n        ErrorCode = 0;\n    }\n    LastOp = 0;\n}\n\n\nconst char* FILEFile::GetFilePath()\n{\n    return FileName.ToCStr();\n}\n\n\n// ** File Information\nbool    FILEFile::IsValid()\n{\n    return Opened;\n}\nbool    FILEFile::IsWritable()\n{\n    return IsValid() && (OpenFlags&Open_Write);\n}\n/*\nbool    FILEFile::IsRecoverable()\n{\n    return IsValid() && ((OpenFlags&OVR_FO_SAFETRUNC) == OVR_FO_SAFETRUNC);\n}\n*/\n\n// Return position / file size\nint     FILEFile::Tell()\n{\n    int pos = (int)ftell (fs);\n    if (pos < 0)\n        ErrorCode = SFerror();\n    return pos;\n}\n\nint64_t FILEFile::LTell()\n{\n    int64_t pos = ftell(fs);\n    if (pos < 0)\n        ErrorCode = SFerror();\n    return pos;\n}\n\nint     FILEFile::GetLength()\n{\n    int pos = Tell();\n    if (pos >= 0)\n    {\n        Seek (0, Seek_End);\n        int size = Tell();\n        Seek (pos, Seek_Set);\n        return size;\n    }\n    return -1;\n}\nint64_t FILEFile::LGetLength()\n{\n    int64_t pos = LTell();\n    if (pos >= 0)\n    {\n        LSeek (0, Seek_End);\n        int64_t size = LTell();\n        LSeek (pos, Seek_Set);\n        return size;\n    }\n    return -1;\n}\n\nint     FILEFile::GetErrorCode()\n{\n    return ErrorCode;\n}\n\n// ** Stream implementation & I/O\nint     FILEFile::Write(const uint8_t *pbuffer, int numBytes)\n{\n    if (LastOp && LastOp != Open_Write)\n        fflush(fs);\n    LastOp = Open_Write;\n    int written = (int) fwrite(pbuffer, 1, numBytes, fs);\n    if (written < numBytes)\n        ErrorCode = SFerror();\n\n#ifdef OVR_FILE_VERIFY_SEEK_ERRORS\n    if (written > 0)\n        TestPos += written;\n#endif\n\n    return written;\n}\n\nint     FILEFile::Read(uint8_t *pbuffer, int numBytes)\n{\n    if (LastOp && LastOp != Open_Read)\n        fflush(fs);\n    LastOp = Open_Read;\n    int read = (int) fread(pbuffer, 1, numBytes, fs);\n    if (read < numBytes)\n        ErrorCode = SFerror();\n\n#ifdef OVR_FILE_VERIFY_SEEK_ERRORS\n    if (read > 0)\n    {\n        // Read-in data must match our pre-loaded buffer data!\n        uint8_t* pcompareBuffer = pFileTestBuffer + TestPos;\n        for (int i=0; i< read; i++)\n        {\n            OVR_ASSERT(pcompareBuffer[i] == pbuffer[i]);\n        }\n\n        //OVR_ASSERT(!memcmp(pFileTestBuffer + TestPos, pbuffer, read));\n        TestPos += read;\n        OVR_ASSERT(ftell(fs) == (int)TestPos);\n    }\n#endif\n\n    return read;\n}\n\n// Seeks ahead to skip bytes\nint     FILEFile::SkipBytes(int numBytes)\n{\n    int64_t pos    = LTell();\n    int64_t newPos = LSeek(numBytes, Seek_Cur);\n\n    // Return -1 for major error\n    if ((pos==-1) || (newPos==-1))\n    {\n        return -1;\n    }\n    //ErrorCode = ((NewPos-Pos)<numBytes) ? errno : 0;\n\n    return int (newPos-(int)pos);\n}\n\n// Return # of bytes till EOF\nint     FILEFile::BytesAvailable()\n{\n    int64_t pos    = LTell();\n    int64_t endPos = LGetLength();\n\n    // Return -1 for major error\n    if ((pos==-1) || (endPos==-1))\n    {\n        ErrorCode = SFerror();\n        return 0;\n    }\n    else\n        ErrorCode = 0;\n\n    return int (endPos-(int)pos);\n}\n\n// Flush file contents\nbool    FILEFile::Flush()\n{\n    return !fflush(fs);\n}\n\nint     FILEFile::Seek(int offset, int origin)\n{\n    int newOrigin = 0;\n    switch(origin)\n    {\n    case Seek_Set: newOrigin = SEEK_SET; break;\n    case Seek_Cur: newOrigin = SEEK_CUR; break;\n    case Seek_End: newOrigin = SEEK_END; break;\n    }\n\n    if (newOrigin == SEEK_SET && offset == Tell())\n        return Tell();\n\n    if (fseek (fs, offset, newOrigin))\n    {\n#ifdef OVR_FILE_VERIFY_SEEK_ERRORS\n        OVR_ASSERT(0);\n#endif\n        return -1;\n    }\n    \n#ifdef OVR_FILE_VERIFY_SEEK_ERRORS\n    // Track file position after seeks for read verification later.\n    switch(origin)\n    {\n    case Seek_Set:  TestPos = offset;       break;\n    case Seek_Cur:  TestPos += offset;      break;    \n    case Seek_End:  TestPos = FileTestLength + offset; break;\n    }\n    OVR_ASSERT((int)TestPos == Tell());\n#endif\n\n    return (int)Tell();\n}\n\nint64_t FILEFile::LSeek(int64_t offset, int origin)\n{\n    return Seek((int)offset,origin);\n}\n\nint FILEFile::CopyFromStream(File *pstream, int byteSize)\n{\n    uint8_t*  buff = new uint8_t[0x4000];\n    int     count = 0;\n    int     szRequest, szRead, szWritten;\n\n    while (byteSize)\n    {\n        szRequest = (byteSize > int(sizeof(buff))) ? int(sizeof(buff)) : byteSize;\n\n        szRead    = pstream->Read(buff, szRequest);\n        szWritten = 0;\n        if (szRead > 0)\n            szWritten = Write(buff, szRead);\n\n        count    += szWritten;\n        byteSize -= szWritten;\n        if (szWritten < szRequest)\n            break;\n    }\n\n\tdelete[] buff;\n\n    return count;\n}\n\n\nbool FILEFile::Close()\n{\n#ifdef OVR_FILE_VERIFY_SEEK_ERRORS\n    if (pFileTestBuffer)\n    {\n        OVR_FREE(pFileTestBuffer);\n        pFileTestBuffer = 0;\n        FileTestLength  = 0;\n    }\n#endif\n\n    bool closeRet = !fclose(fs);\n\n    if (!closeRet)\n    {\n        ErrorCode = SFerror();\n        return 0;\n    }\n    else\n    {\n        Opened    = 0;\n        fs        = 0;\n        ErrorCode = 0;\n    }\n\n    // Handle safe truncate\n    /*\n    if ((OpenFlags & OVR_FO_SAFETRUNC) == OVR_FO_SAFETRUNC)\n    {\n        // Delete original file (if it existed)\n        DWORD oldAttributes = FileUtilWin32::GetFileAttributes(FileName);\n        if (oldAttributes!=0xFFFFFFFF)\n            if (!FileUtilWin32::DeleteFile(FileName))\n            {\n                // Try to remove the readonly attribute\n                FileUtilWin32::SetFileAttributes(FileName, oldAttributes & (~FILE_ATTRIBUTE_READONLY) );\n                // And delete the file again\n                if (!FileUtilWin32::DeleteFile(FileName))\n                    return 0;\n            }\n\n        // Rename temp file to real filename\n        if (!FileUtilWin32::MoveFile(TempName, FileName))\n        {\n            //ErrorCode = errno;\n            return 0;\n        }\n    }\n    */\n    return 1;\n}\n\n/*\nbool    FILEFile::CloseCancel()\n{\n    bool closeRet = (bool)::CloseHandle(fd);\n\n    if (!closeRet)\n    {\n        //ErrorCode = errno;\n        return 0;\n    }\n    else\n    {\n        Opened    = 0;\n        fd        = INVALID_HANDLE_VALUE;\n        ErrorCode = 0;\n    }\n\n    // Handle safe truncate (delete tmp file, leave original unchanged)\n    if ((OpenFlags&OVR_FO_SAFETRUNC) == OVR_FO_SAFETRUNC)\n        if (!FileUtilWin32::DeleteFile(TempName))\n        {\n            //ErrorCode = errno;\n            return 0;\n        }\n    return 1;\n}\n*/\n\nPtr<File> FileFILEOpen(const String& path, int flags, int mode)\n{\n    Ptr<File> result = *new FILEFile(path, flags, mode);\n\treturn result;\n}\n\n// Helper function: obtain file information time.\nbool    SysFile::GetFileStat(FileStat* pfileStat, const String& path)\n{\n#if defined(OVR_OS_MS)\n    // 64-bit implementation on Windows.\n    struct __stat64 fileStat;\n    // Stat returns 0 for success.\n    wchar_t *pwpath = (wchar_t*)OVR_ALLOC((UTF8Util::GetLength(path.ToCStr())+1)*sizeof(wchar_t));\n    UTF8Util::DecodeString(pwpath, path.ToCStr());\n\n    int ret = _wstat64(pwpath, &fileStat);\n    OVR_FREE(pwpath);\n    if (ret) return false;\n#else\n    struct stat fileStat;\n    // Stat returns 0 for success.\n    if (stat(path, &fileStat) != 0)\n        return false;\n#endif\n    pfileStat->AccessTime = fileStat.st_atime;\n    pfileStat->ModifyTime = fileStat.st_mtime;\n    pfileStat->FileSize   = fileStat.st_size;\n    return true;\n}\n\n} // Namespace OVR\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Hash.h",
    "content": "/************************************************************************************\n\nPublicHeader:   None\nFilename    :   OVR_Hash.h\nContent     :   Template hash-table/set implementation\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Hash_h\n#define OVR_Hash_h\n\n#include \"OVR_ContainerAllocator.h\"\n#include \"OVR_Alg.h\"\n\n// 'new' operator is redefined/used in this file.\n#undef new\n\nnamespace OVR {\n\n//-----------------------------------------------------------------------------------\n// ***** Hash Table Implementation\n\n// HastSet and Hash.\n//\n// Hash table, linear probing, internal chaining.  One  interesting/nice thing\n// about this implementation is that the table itself is a flat chunk of memory\n// containing no pointers, only relative indices. If the key and value types\n// of the Hash contain no pointers, then the Hash can be serialized using raw IO.\n//\n// Never shrinks, unless you explicitly Clear() it.  Expands on\n// demand, though.  For best results, if you know roughly how big your\n// table will be, default it to that size when you create it.\n//\n// Key usability feature:\n//\n//   1. Allows node hash values to either be cached or not.\n//\n//   2. Allows for alternative keys with methods such as GetAlt(). Handy\n//      if you need to search nodes by their components; no need to create\n//      temporary nodes.\n//\n\n\n// *** Hash functors:\n//\n//  IdentityHash  - use when the key is already a good hash\n//  HFixedSizeHash - general hash based on object's in-memory representation.\n\n\n// Hash is just the input value; can use this for integer-indexed hash tables.\ntemplate<class C>\nclass IdentityHash\n{\npublic:\n    size_t operator()(const C& data) const\n    { return (size_t) data; }\n};\n\n// Computes a hash of an object's representation.\ntemplate<class C>\nclass FixedSizeHash\n{\npublic:\n    // Alternative: \"sdbm\" hash function, suggested at same web page\n    // above, http::/www.cs.yorku.ca/~oz/hash.html\n    // This is somewhat slower then Bernstein, but it works way better than the above\n    // hash function for hashing large numbers of 32-bit ints.\n    static OVR_FORCE_INLINE size_t SDBM_Hash(const void* data_in, size_t size, size_t seed = 5381)     \n    {\n        const uint8_t* data = (const uint8_t*) data_in;\n        size_t       h = seed;\n        while (size-- > 0)\n        {\n            #ifndef __clang_analyzer__ // It mistakenly thinks data is garbage.\n            h = (h << 16) + (h << 6) - h + (size_t)data[size];\n            #endif\n        }   \n        return h;\n    }\n\n    size_t operator()(const C& data) const\n    {\n        const unsigned char*  p = (const unsigned char*) &data;\n        const size_t size = sizeof(C);\n\n        return SDBM_Hash(p, size);\n    }\n};\n\n\n\n// *** HashsetEntry Entry types. \n\n// Compact hash table Entry type that re-computes hash keys during hash traversal.\n// Good to use if the hash function is cheap or the hash value is already cached in C.\ntemplate<class C, class HashF>\nclass HashsetEntry\n{\npublic:\n    // Internal chaining for collisions.\n    intptr_t    NextInChain;\n    C           Value;\n\n    HashsetEntry()\n        : NextInChain(-2) { }\n    HashsetEntry(const HashsetEntry& e)\n        : NextInChain(e.NextInChain), Value(e.Value) { }\n    HashsetEntry(const C& key, intptr_t next)\n        : NextInChain(next), Value(key) { }\n\n    bool    IsEmpty() const          { return NextInChain == -2;  }\n    bool    IsEndOfChain() const     { return NextInChain == -1;  }\n\n    // Cached hash value access - can be optimized bu storing hash locally.\n    // Mask value only needs to be used if SetCachedHash is not implemented.\n    size_t  GetCachedHash(size_t maskValue) const  { return HashF()(Value) & maskValue; }\n    void    SetCachedHash(size_t)                  {}\n\n    void    Clear()\n    {        \n        Value.~C(); // placement delete\n        NextInChain = -2;\n    }\n    // Free is only used from dtor of hash; Clear is used during regular operations:\n    // assignment, hash reallocations, value reassignments, so on.\n    void    Free() { Clear(); }\n};\n\n// Hash table Entry type that caches the Entry hash value for nodes, so that it\n// does not need to be re-computed during access.\ntemplate<class C, class HashF>\nclass HashsetCachedEntry\n{\npublic:\n    // Internal chaining for collisions.\n    intptr_t    NextInChain;\n    size_t      HashValue;\n    C           Value;\n\n    HashsetCachedEntry()\n        : NextInChain(-2) { }\n    HashsetCachedEntry(const HashsetCachedEntry& e)\n        : NextInChain(e.NextInChain), HashValue(e.HashValue), Value(e.Value) { }\n    HashsetCachedEntry(const C& key, intptr_t next)\n        : NextInChain(next), Value(key) { }\n\n    bool    IsEmpty() const          { return NextInChain == -2;  }\n    bool    IsEndOfChain() const     { return NextInChain == -1;  }\n\n    // Cached hash value access - can be optimized bu storing hash locally.\n    // Mask value only needs to be used if SetCachedHash is not implemented.\n    size_t  GetCachedHash(size_t maskValue) const  { OVR_UNUSED(maskValue); return HashValue; }\n    void    SetCachedHash(size_t hashValue)        { HashValue = hashValue; }\n\n    void    Clear()\n    {\n        Value.~C();\n        NextInChain = -2;\n    }\n    // Free is only used from dtor of hash; Clear is used during regular operations:\n    // assignment, hash reallocations, value reassignments, so on.\n    void    Free() { Clear(); }\n};\n\n\n//-----------------------------------------------------------------------------------\n// *** HashSet implementation - relies on either cached or regular entries.\n//\n// Use: Entry = HashsetCachedEntry<C, HashF> if hashes are expensive to\n//              compute and thus need caching in entries.\n//      Entry = HashsetEntry<C, HashF> if hashes are already externally cached.\n//\ntemplate<class C, class HashF = FixedSizeHash<C>,\n         class AltHashF = HashF, \n         class Allocator = ContainerAllocator<C>,\n         class Entry = HashsetCachedEntry<C, HashF> >\nclass HashSetBase\n{\n    enum { HashMinSize = 8 };\n\npublic:\n    OVR_MEMORY_REDEFINE_NEW(HashSetBase)\n\n    typedef HashSetBase<C, HashF, AltHashF, Allocator, Entry>    SelfType;\n\n    HashSetBase() : pTable(NULL)                       {   }\n    HashSetBase(int sizeHint) : pTable(NULL)           { SetCapacity(this, sizeHint);  }\n    HashSetBase(const SelfType& src) : pTable(NULL)    { Assign(this, src); }\n\n    ~HashSetBase()                                     \n    { \n        if (pTable)\n        {\n            // Delete the entries.\n            for (size_t i = 0, n = pTable->SizeMask; i <= n; i++)\n            {\n                Entry*  e = &E(i);\n                if (!e->IsEmpty())             \n                    e->Free();\n            }            \n\n            Allocator::Free(pTable);\n            pTable = NULL;\n        }\n    }\n\n\n    void Assign(const SelfType& src)\n    {\n        Clear();\n        if (src.IsEmpty() == false)\n        {\n            SetCapacity(src.GetSize());\n\n            for (ConstIterator it = src.Begin(); it != src.End(); ++it)\n            {\n                Add(*it);\n            }\n        }\n    }\n\n\n    // Remove all entries from the HashSet table.\n    void Clear() \n    {\n        if (pTable)\n        {\n            // Delete the entries.\n            for (size_t i = 0, n = pTable->SizeMask; i <= n; i++)\n            {\n                Entry*  e = &E(i);\n                if (!e->IsEmpty())             \n                    e->Clear();\n            }            \n                \n            Allocator::Free(pTable);\n            pTable = NULL;\n        }\n    }\n\n    // Returns true if the HashSet is empty.\n    bool IsEmpty() const\n    {\n        return pTable == NULL || pTable->EntryCount == 0;\n    }\n\n\n    // Set a new or existing value under the key, to the value.\n    // Pass a different class of 'key' so that assignment reference object\n    // can be passed instead of the actual object.\n    template<class CRef>\n    void Set(const CRef& key)\n    {\n        size_t hashValue = HashF()(key);\n        intptr_t  index     = (intptr_t)-1;\n\n        if (pTable != NULL)\n            index = findIndexCore(key, hashValue & pTable->SizeMask);\n\n        if (index >= 0)\n        {            \n            E(index).Value = key;\n        }\n        else\n        {\n            // Entry under key doesn't exist.\n            add(key, hashValue);\n        }\n    }\n\n    template<class CRef>\n    inline void Add(const CRef& key)\n    {\n        size_t hashValue = HashF()(key);\n        add(key, hashValue);\n    }\n\n    // Remove by alternative key.\n    template<class K>\n    void RemoveAlt(const K& key)\n    {   \n        if (pTable == NULL)\n            return;\n\n        size_t   hashValue = AltHashF()(key);\n        intptr_t index     = hashValue & pTable->SizeMask;\n\n        Entry*  e = &E(index);\n\n        // If empty node or occupied by collider, we have nothing to remove.\n        if (e->IsEmpty() || (e->GetCachedHash(pTable->SizeMask) != (size_t)index))\n            return;        \n\n        // Save index\n        intptr_t naturalIndex = index;\n        intptr_t prevIndex    = -1;\n\n        while ((e->GetCachedHash(pTable->SizeMask) != (size_t)naturalIndex) || !(e->Value == key))\n        {\n            // Keep looking through the chain.\n            prevIndex   = index;\n            index       = e->NextInChain;\n            if (index == -1)\n                return; // End of chain, item not found\n            e = &E(index);\n        }\n\n        // Found it - our item is at index\n        if (naturalIndex == index)\n        {\n            // If we have a follower, move it to us\n            if (!e->IsEndOfChain())\n            {               \n                Entry*  enext = &E(e->NextInChain);\n                e->Clear();\n                new (e) Entry(*enext);\n                // Point us to the follower's cell that will be cleared\n                e = enext;\n            }\n        }\n        else\n        {\n            // We are not at natural index, so deal with the prev items next index\n            E(prevIndex).NextInChain = e->NextInChain;\n        }\n\n        // Clear us, of the follower cell that was moved.\n        e->Clear();\n        pTable->EntryCount --;\n        // Should we check the size to condense hash? ...\n    }\n\n    // Remove by main key.\n    template<class CRef>\n    void Remove(const CRef& key)\n    {\n        RemoveAlt(key);\n    }\n\n    // Retrieve the pointer to a value under the given key.\n    //  - If there's no value under the key, then return NULL.    \n    //  - If there is a value, return the pointer.    \n    template<class K>\n    C* Get(const K& key)\n    {\n        intptr_t index = findIndex(key);\n        if (index >= 0)        \n            return &E(index).Value;        \n        return 0;\n    }   \n\n    template<class K>\n    const C* Get(const K& key) const\n    {\n        intptr_t index = findIndex(key);\n        if (index >= 0)        \n            return &E(index).Value;        \n        return 0;\n    }\n\n    // Alternative key versions of Get. Used by Hash.\n    template<class K>\n    const C* GetAlt(const K& key) const\n    {\n        intptr_t index = findIndexAlt(key);\n        if (index >= 0)        \n            return &E(index).Value;\n        return 0;\n    }\n\n    template<class K>\n    C* GetAlt(const K& key)\n    {\n        intptr_t index = findIndexAlt(key);\n        if (index >= 0)        \n            return &E(index).Value;\n        return 0;\n    }   \n\n    template<class K>\n    bool GetAlt(const K& key, C* pval) const\n    {\n        intptr_t index = findIndexAlt(key);\n        if (index >= 0)\n        {\n            if (pval)\n                *pval = E(index).Value;\n            return true;\n        }\n        return false;\n    }\n\n\n    size_t GetSize() const\n    {\n        return pTable == NULL ? 0 : (size_t)pTable->EntryCount;\n    }\n\tint GetSizeI() const { return (int)GetSize(); }\n\n\n    // Resize the HashSet table to fit one more Entry.  Often this\n    // doesn't involve any action.\n    void CheckExpand()\n    {\n        if (pTable == NULL)\n        {\n            // Initial creation of table.  Make a minimum-sized table.\n            setRawCapacity(HashMinSize);\n        }\n        else if (pTable->EntryCount * 5 > (pTable->SizeMask + 1) * 4)\n        {\n            // pTable is more than 5/4 ths full.  Expand.\n            setRawCapacity((pTable->SizeMask + 1) * 2);\n        }\n    }\n\n    // Hint the bucket count to >= n.\n    void Resize(size_t n)    \n    {\n        // Not really sure what this means in relation to\n        // STLport's hash_map... they say they \"increase the\n        // bucket count to at least n\" -- but does that mean\n        // their real capacity after Resize(n) is more like\n        // n*2 (since they do linked-list chaining within\n        // buckets?).\n        SetCapacity(n);\n    }\n\n    // Size the HashSet so that it can comfortably contain the given\n    // number of elements.  If the HashSet already contains more\n    // elements than newSize, then this may be a no-op.\n    void SetCapacity(size_t newSize)\n    {\n        size_t newRawSize = (newSize * 5) / 4;\n        if (newRawSize <= GetSize())\n            return;\n        setRawCapacity(newRawSize);\n    }\n\n    // Disable inappropriate 'operator ->' warning on MSVC6.\n#ifdef OVR_CC_MSVC\n#if (OVR_CC_MSVC < 1300)\n# pragma warning(disable : 4284)\n#endif\n#endif\n\n    // Iterator API, like STL.\n    struct ConstIterator\n    {   \n        const C&    operator * () const\n        {            \n            OVR_ASSERT(Index >= 0 && Index <= (intptr_t)pHash->pTable->SizeMask);\n            return pHash->E(Index).Value;\n        }\n\n        const C*    operator -> () const\n        {\n            OVR_ASSERT(Index >= 0 && Index <= (intptr_t)pHash->pTable->SizeMask);\n            return &pHash->E(Index).Value;\n        }\n\n        void    operator ++ ()\n        {\n            // Find next non-empty Entry.\n            if (Index <= (intptr_t)pHash->pTable->SizeMask)\n            {\n                Index++;\n                while ((size_t)Index <= pHash->pTable->SizeMask &&\n                    pHash->E(Index).IsEmpty())\n                {\n                    Index++;\n                }\n            }\n        }\n\n        bool    operator == (const ConstIterator& it) const\n        {\n            if (IsEnd() && it.IsEnd())\n            {\n                return true;\n            }\n            else\n            {\n                return (pHash == it.pHash) && (Index == it.Index);\n            }\n        }\n\n        bool    operator != (const ConstIterator& it) const\n        {\n            return ! (*this == it);\n        }\n\n\n        bool    IsEnd() const\n        {\n            return (pHash == NULL) || \n                (pHash->pTable == NULL) || \n                (Index > (intptr_t)pHash->pTable->SizeMask);\n        }\n\n        ConstIterator()\n            : pHash(NULL), Index(0)\n        { }\n\n    public:\n        // Constructor was intentionally made public to allow create\n        // iterator with arbitrary index.\n        ConstIterator(const SelfType* h, intptr_t index)\n            : pHash(h), Index(index)\n        { }\n\n        const SelfType* GetContainer() const\n        {\n            return pHash;\n        }\n        intptr_t GetIndex() const\n        {\n            return Index;\n        }\n\n    protected:\n        friend class HashSetBase<C, HashF, AltHashF, Allocator, Entry>;\n\n        const SelfType* pHash;\n        intptr_t        Index;\n    };\n\n    friend struct ConstIterator;\n\n\n    // Non-const Iterator; Get most of it from ConstIterator.\n    struct Iterator : public ConstIterator\n    {      \n        // Allow non-const access to entries.\n        C&  operator*() const\n        {            \n            OVR_ASSERT((ConstIterator::pHash) && ConstIterator::pHash->pTable && (ConstIterator::Index >= 0) && (ConstIterator::Index <= (intptr_t)ConstIterator::pHash->pTable->SizeMask));\n            return const_cast<SelfType*>(ConstIterator::pHash)->E(ConstIterator::Index).Value;\n        }    \n\n        C*  operator->() const \n        {\n            return &(operator*());\n        }\n\n        Iterator()\n            : ConstIterator(NULL, 0)\n        { }\n\n        // Removes current element from Hash\n        void Remove()\n        {\n            RemoveAlt(operator*());\n        }\n\n        template <class K>\n        void RemoveAlt(const K& key)\n        {\n            SelfType*   phash = const_cast<SelfType*>(ConstIterator::pHash);\n            //Entry*      ee = &phash->E(ConstIterator::Index);\n            //const C&    key = ee->Value;\n\n            size_t      hashValue = AltHashF()(key);\n            intptr_t    index     = hashValue & phash->pTable->SizeMask;\n\n            Entry*      e = &phash->E(index);\n\n            // If empty node or occupied by collider, we have nothing to remove.\n            if (e->IsEmpty() || (e->GetCachedHash(phash->pTable->SizeMask) != (size_t)index))\n                return;        \n\n            // Save index\n            intptr_t   naturalIndex = index;\n            intptr_t   prevIndex    = -1;\n\n            while ((e->GetCachedHash(phash->pTable->SizeMask) != (size_t)naturalIndex) || !(e->Value == key))\n            {\n                // Keep looking through the chain.\n                prevIndex   = index;\n                index       = e->NextInChain;\n                if (index == -1)\n                    return; // End of chain, item not found\n                e = &phash->E(index);\n            }\n\n            if (index == (intptr_t)ConstIterator::Index)\n            {\n                // Found it - our item is at index\n                if (naturalIndex == index)\n                {\n                    // If we have a follower, move it to us\n                    if (!e->IsEndOfChain())\n                    {               \n                        Entry*  enext = &phash->E(e->NextInChain);\n                        e->Clear();\n                        new (e) Entry(*enext);\n                        // Point us to the follower's cell that will be cleared\n                        e = enext;\n                        --ConstIterator::Index;\n                    }\n                }\n                else\n                {\n                    // We are not at natural index, so deal with the prev items next index\n                    phash->E(prevIndex).NextInChain = e->NextInChain;\n                }\n\n                // Clear us, of the follower cell that was moved.\n                e->Clear();\n                phash->pTable->EntryCount --;\n            }\n            else \n                OVR_ASSERT(0); //?\n        }\n\n    private:\n        friend class HashSetBase<C, HashF, AltHashF, Allocator, Entry>;\n\n        Iterator(SelfType* h, intptr_t i0)\n            : ConstIterator(h, i0)\n        { }\n    };\n\n    friend struct Iterator;\n\n    Iterator    Begin()\n    {\n        if (pTable == 0)\n            return Iterator(NULL, 0);\n\n        // Scan till we hit the First valid Entry.\n        size_t i0 = 0;\n        while (i0 <= pTable->SizeMask && E(i0).IsEmpty())\n        {\n            i0++;\n        }\n        return Iterator(this, i0);\n    }\n    Iterator        End()           { return Iterator(NULL, 0); }\n\n    ConstIterator   Begin() const   { return const_cast<SelfType*>(this)->Begin();     }\n    ConstIterator   End() const     { return const_cast<SelfType*>(this)->End();   }\n\n    template<class K>\n    Iterator Find(const K& key)\n    {\n        intptr_t index = findIndex(key);\n        if (index >= 0)        \n            return Iterator(this, index);        \n        return Iterator(NULL, 0);\n    }\n\n    template<class K>\n    Iterator FindAlt(const K& key)\n    {\n        intptr_t index = findIndexAlt(key);\n        if (index >= 0)        \n            return Iterator(this, index);        \n        return Iterator(NULL, 0);\n    }\n\n    template<class K>\n    ConstIterator Find(const K& key) const       { return const_cast<SelfType*>(this)->Find(key); }\n\n    template<class K>\n    ConstIterator FindAlt(const K& key) const    { return const_cast<SelfType*>(this)->FindAlt(key); }\n\nprivate:\n    // Find the index of the matching Entry.  If no match, then return -1.\n    template<class K>\n    intptr_t findIndex(const K& key) const\n    {\n        if (pTable == NULL)\n            return -1;\n        size_t hashValue = HashF()(key) & pTable->SizeMask;\n        return findIndexCore(key, hashValue);\n    }\n\n    template<class K>\n    intptr_t findIndexAlt(const K& key) const\n    {\n        if (pTable == NULL)\n            return -1;\n        size_t hashValue = AltHashF()(key) & pTable->SizeMask;\n        return findIndexCore(key, hashValue);\n    }\n\n    // Find the index of the matching Entry.  If no match, then return -1.\n    template<class K>\n    intptr_t findIndexCore(const K& key, size_t hashValue) const\n    {\n        // Table must exist.\n        OVR_ASSERT(pTable != 0);\n        // Hash key must be 'and-ed' by the caller.\n        OVR_ASSERT((hashValue & ~pTable->SizeMask) == 0);\n\n        size_t          index = hashValue;\n        const Entry*    e     = &E(index);\n\n        // If empty or occupied by a collider, not found.\n        if (e->IsEmpty() || (e->GetCachedHash(pTable->SizeMask) != index))\n            return -1;\n\n        while(1)\n        {\n            OVR_ASSERT(e->GetCachedHash(pTable->SizeMask) == hashValue);\n\n            if (e->GetCachedHash(pTable->SizeMask) == hashValue && e->Value == key)\n            {\n                // Found it.\n                return index;\n            }\n            // Values can not be equal at this point.\n            // That would mean that the hash key for the same value differs.\n            OVR_ASSERT(!(e->Value == key));\n\n            // Keep looking through the chain.\n            index = e->NextInChain;\n            if (index == (size_t)-1)\n                break; // end of chain\n\n            e = &E(index);\n            OVR_ASSERT(!e->IsEmpty());\n        }\n        return -1;\n    }\n\n\n    // Add a new value to the HashSet table, under the specified key.\n    template<class CRef>\n    void add(const CRef& key, size_t hashValue)\n    {\n        CheckExpand();\n        hashValue &= pTable->SizeMask;\n\n        pTable->EntryCount++;\n\n        intptr_t   index        = hashValue;\n        Entry*  naturalEntry = &(E(index));\n\n        if (naturalEntry->IsEmpty())\n        {\n            // Put the new Entry in.\n            new (naturalEntry) Entry(key, -1);\n        }\n        else\n        {\n            // Find a blank spot.\n            intptr_t blankIndex = index;\n            do {\n                blankIndex = (blankIndex + 1) & pTable->SizeMask;\n            } while(!E(blankIndex).IsEmpty());\n\n            Entry*  blankEntry = &E(blankIndex);\n\n            if (naturalEntry->GetCachedHash(pTable->SizeMask) == (size_t)index)\n            {\n                // Collision.  Link into this chain.\n\n                // Move existing list head.\n                new (blankEntry) Entry(*naturalEntry);    // placement new, copy ctor\n\n                // Put the new info in the natural Entry.\n                naturalEntry->Value       = key;\n                naturalEntry->NextInChain = blankIndex;\n            }\n            else\n            {\n                // Existing Entry does not naturally\n                // belong in this slot.  Existing\n                // Entry must be moved.\n\n                // Find natural location of collided element (i.e. root of chain)\n                intptr_t collidedIndex = naturalEntry->GetCachedHash(pTable->SizeMask);\n                OVR_ASSERT(collidedIndex >= 0 && collidedIndex <= (intptr_t)pTable->SizeMask);\n                for (;;)\n                {\n                    Entry*  e = &E(collidedIndex);\n                    if (e->NextInChain == index)\n                    {\n                        // Here's where we need to splice.\n                        new (blankEntry) Entry(*naturalEntry);\n                        e->NextInChain = blankIndex;\n                        break;\n                    }\n                    collidedIndex = e->NextInChain;\n                    OVR_ASSERT(collidedIndex >= 0 && collidedIndex <= (intptr_t)pTable->SizeMask);\n                }\n\n                // Put the new data in the natural Entry.\n                naturalEntry->Value       = key;\n                naturalEntry->NextInChain = -1;                \n            }            \n        }\n\n        // Record hash value: has effect only if cached node is used.\n        naturalEntry->SetCachedHash(hashValue);\n    }\n\n    // Index access helpers.\n    Entry& E(size_t index)\n    {\n        // Must have pTable and access needs to be within bounds.\n        OVR_ASSERT(index <= pTable->SizeMask);\n        return *(((Entry*) (pTable + 1)) + index);\n    }\n    const Entry& E(size_t index) const\n    {        \n        OVR_ASSERT(index <= pTable->SizeMask);\n        return *(((Entry*) (pTable + 1)) + index);\n    }\n\n\n    // Resize the HashSet table to the given size (Rehash the\n    // contents of the current table).  The arg is the number of\n    // HashSet table entries, not the number of elements we should\n    // actually contain (which will be less than this).\n    void    setRawCapacity(size_t newSize)    \n    {\n        if (newSize == 0)\n        {\n            // Special case.\n            Clear();\n            return;\n        }\n\n        // Minimum size; don't incur rehashing cost when expanding\n        // very small tables. Not that we perform this check before \n        // 'log2f' call to avoid fp exception with newSize == 1.\n        if (newSize < HashMinSize)        \n            newSize = HashMinSize;       \n        else\n        {\n            // Force newSize to be a power of two.\n            int bits = Alg::UpperBit(newSize-1) + 1; // Chop( Log2f((float)(newSize-1)) + 1);\n            OVR_ASSERT((size_t(1) << bits) >= newSize);\n            newSize = size_t(1) << bits;\n        }\n\n        SelfType  newHash;\n        newHash.pTable = (TableType*)\n            Allocator::Alloc(                \n                sizeof(TableType) + sizeof(Entry) * newSize);\n        // Need to do something on alloc failure!\n        OVR_ASSERT(newHash.pTable);\n\n        newHash.pTable->EntryCount = 0;\n        newHash.pTable->SizeMask = newSize - 1;\n        size_t i, n;\n\n        // Mark all entries as empty.\n        for (i = 0; i < newSize; i++)\n            newHash.E(i).NextInChain = -2;\n\n        // Copy stuff to newHash\n        if (pTable)\n        {            \n            for (i = 0, n = pTable->SizeMask; i <= n; i++)\n            {\n                Entry*  e = &E(i);\n                if (e->IsEmpty() == false)\n                {\n                    // Insert old Entry into new HashSet.\n                    newHash.Add(e->Value);\n                    // placement delete of old element\n                    e->Clear();\n                }\n            }\n\n            // Delete our old data buffer.\n            Allocator::Free(pTable);\n        }\n\n        // Steal newHash's data.\n        pTable = newHash.pTable;\n        newHash.pTable = NULL;\n    }\n\n    struct TableType\n    {\n        size_t EntryCount;\n        size_t SizeMask;\n        // Entry array follows this structure\n        // in memory.\n    };\n    TableType*  pTable;\n};\n\n\n\n//-----------------------------------------------------------------------------------\ntemplate<class C, class HashF = FixedSizeHash<C>,\n         class AltHashF = HashF, \n         class Allocator = ContainerAllocator<C>,\n         class Entry = HashsetCachedEntry<C, HashF> >\nclass HashSet : public HashSetBase<C, HashF, AltHashF, Allocator, Entry>\n{\npublic:\n    typedef HashSetBase<C, HashF, AltHashF, Allocator, Entry> BaseType;\n    typedef HashSet<C, HashF, AltHashF, Allocator, Entry>     SelfType;\n\n    HashSet()                                      {   }\n    HashSet(int sizeHint) : BaseType(sizeHint)     {   }\n    HashSet(const SelfType& src) : BaseType(src)   {   }\n    ~HashSet()                                     {   }\n\n    void operator = (const SelfType& src)   { BaseType::Assign(src); }\n\n    // Set a new or existing value under the key, to the value.\n    // Pass a different class of 'key' so that assignment reference object\n    // can be passed instead of the actual object.\n    template<class CRef>\n    void Set(const CRef& key)\n    {\n        BaseType::Set(key);\n    }\n\n    template<class CRef>\n    inline void Add(const CRef& key)\n    {\n        BaseType::Add(key);\n    }\n\n    // Hint the bucket count to >= n.\n    void Resize(size_t n)    \n    {\n        BaseType::SetCapacity(n);\n    }\n\n    // Size the HashSet so that it can comfortably contain the given\n    // number of elements.  If the HashSet already contains more\n    // elements than newSize, then this may be a no-op.\n    void SetCapacity(size_t newSize)\n    {\n        BaseType::SetCapacity(newSize);\n    }\n\n};\n\n// HashSet with uncached hash code; declared for convenience.\ntemplate<class C, class HashF = FixedSizeHash<C>,\n                  class AltHashF = HashF,\n                  class Allocator = ContainerAllocator<C> >\nclass HashSetUncached : public HashSet<C, HashF, AltHashF, Allocator, HashsetEntry<C, HashF> >\n{\npublic:\n    \n    typedef HashSetUncached<C, HashF, AltHashF, Allocator>                  SelfType;\n    typedef HashSet<C, HashF, AltHashF, Allocator, HashsetEntry<C, HashF> > BaseType;\n\n    // Delegated constructors.\n    HashSetUncached()                                        { }\n    HashSetUncached(int sizeHint) : BaseType(sizeHint)       { }\n    HashSetUncached(const SelfType& src) : BaseType(src)     { }\n    ~HashSetUncached()                                       { }\n    \n    void    operator = (const SelfType& src)\n    {\n        BaseType::operator = (src);\n    }\n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** Hash hash table implementation\n\n// Node for Hash - necessary so that Hash can delegate its implementation\n// to HashSet.\ntemplate<class C, class U, class HashF>\nstruct HashNode\n{\n    typedef HashNode<C, U, HashF>   SelfType;\n    typedef C                       FirstType;\n    typedef U                       SecondType;\n\n    C   First;\n    U   Second;\n\n    // NodeRef is used to allow passing of elements into HashSet\n    // without using a temporary object.\n    struct NodeRef\n    {\n        const C*   pFirst;\n        const U*   pSecond;\n\n        NodeRef(const C& f, const U& s) : pFirst(&f), pSecond(&s) { }\n        NodeRef(const NodeRef& src)     : pFirst(src.pFirst), pSecond(src.pSecond) { }\n\n        // Enable computation of ghash_node_hashf.\n        inline size_t GetHash() const            { return HashF()(*pFirst); } \n        // Necessary conversion to allow HashNode::operator == to work.\n        operator const C& () const              { return *pFirst; }\n    };\n\n    // Note: No default constructor is necessary.\n     HashNode(const HashNode& src) : First(src.First), Second(src.Second)    { }\n     HashNode(const NodeRef& src) : First(*src.pFirst), Second(*src.pSecond)  { }\n    void operator = (const NodeRef& src)  { First  = *src.pFirst; Second = *src.pSecond; }\n\n    template<class K>\n    bool operator == (const K& src) const   { return (First == src); }\n\n    template<class K>\n    static size_t CalcHash(const K& data)   { return HashF()(data); }\n    inline size_t GetHash() const           { return HashF()(First); }\n\n    // Hash functors used with this node. A separate functor is used for alternative\n    // key lookup so that it does not need to access the '.First' element.    \n    struct NodeHashF\n    {    \n        template<class K>\n        size_t operator()(const K& data) const { return data.GetHash(); } \n    };    \n    struct NodeAltHashF\n    {\n        template<class K>\n        size_t operator()(const K& data) const { return HashNode<C,U,HashF>::CalcHash(data); }\n    };\n};\n\n\n\n// **** Extra hashset_entry types to allow NodeRef construction.\n\n// The big difference between the below types and the ones used in hash_set is that\n// these allow initializing the node with 'typename C::NodeRef& keyRef', which\n// is critical to avoid temporary node allocation on stack when using placement new.\n\n// Compact hash table Entry type that re-computes hash keys during hash traversal.\n// Good to use if the hash function is cheap or the hash value is already cached in C.\ntemplate<class C, class HashF>\nclass HashsetNodeEntry\n{\npublic:\n    // Internal chaining for collisions.\n    intptr_t NextInChain;\n    C     Value;\n\n    HashsetNodeEntry()\n        : NextInChain(-2) { }\n    HashsetNodeEntry(const HashsetNodeEntry& e)\n        : NextInChain(e.NextInChain), Value(e.Value) { }\n    HashsetNodeEntry(const C& key, intptr_t next)\n        : NextInChain(next), Value(key) { }    \n    HashsetNodeEntry(const typename C::NodeRef& keyRef, intptr_t next)\n        : NextInChain(next), Value(keyRef) { }\n\n    bool    IsEmpty() const             { return NextInChain == -2;  }\n    bool    IsEndOfChain() const        { return NextInChain == -1;  }\n    size_t  GetCachedHash(size_t maskValue) const  { return HashF()(Value) & maskValue; }\n    void    SetCachedHash(size_t hashValue)        { OVR_UNUSED(hashValue); }\n\n    void    Clear()\n    {        \n        Value.~C(); // placement delete\n        NextInChain = -2;\n    }\n    // Free is only used from dtor of hash; Clear is used during regular operations:\n    // assignment, hash reallocations, value reassignments, so on.\n    void    Free() { Clear(); }\n};\n\n// Hash table Entry type that caches the Entry hash value for nodes, so that it\n// does not need to be re-computed during access.\ntemplate<class C, class HashF>\nclass HashsetCachedNodeEntry\n{\npublic:\n    // Internal chaining for collisions.\n    intptr_t NextInChain;\n    size_t HashValue;\n    C     Value;\n\n    HashsetCachedNodeEntry()\n        : NextInChain(-2) { }\n    HashsetCachedNodeEntry(const HashsetCachedNodeEntry& e)\n        : NextInChain(e.NextInChain), HashValue(e.HashValue), Value(e.Value) { }\n    HashsetCachedNodeEntry(const C& key, intptr_t next)\n        : NextInChain(next), Value(key) { }\n    HashsetCachedNodeEntry(const typename C::NodeRef& keyRef, intptr_t next)\n        : NextInChain(next), Value(keyRef) { }\n\n    bool    IsEmpty() const            { return NextInChain == -2;  }\n    bool    IsEndOfChain() const       { return NextInChain == -1;  }\n    size_t  GetCachedHash(size_t maskValue) const  { OVR_UNUSED(maskValue); return HashValue; }\n    void    SetCachedHash(size_t hashValue)        { HashValue = hashValue; }\n\n    void    Clear()\n    {\n        Value.~C();\n        NextInChain = -2;\n    }\n    // Free is only used from dtor of hash; Clear is used during regular operations:\n    // assignment, hash reallocations, value reassignments, so on.\n    void    Free() { Clear(); }\n};\n\n\n//-----------------------------------------------------------------------------------\ntemplate<class C, class U,\n         class HashF = FixedSizeHash<C>,\n         class Allocator = ContainerAllocator<C>,\n         class HashNode = OVR::HashNode<C,U,HashF>,\n         class Entry = HashsetCachedNodeEntry<HashNode, typename HashNode::NodeHashF>,\n         class Container =  HashSet<HashNode, typename HashNode::NodeHashF,\n             typename HashNode::NodeAltHashF, Allocator,\n             Entry> >\nclass Hash\n{\npublic:\n    OVR_MEMORY_REDEFINE_NEW(Hash)\n\n    // Types used for hash_set.\n    typedef U                                                           ValueType;\n    typedef Hash<C, U, HashF, Allocator, HashNode, Entry, Container>    SelfType;\n\n    // Actual hash table itself, implemented as hash_set.\n    Container   mHash;\n\npublic:\n    Hash()     {  }\n    Hash(int sizeHint) : mHash(sizeHint)                        { }\n    Hash(const SelfType& src) : mHash(src.mHash)                { }\n    ~Hash()                                                     { }\n\n    void    operator = (const SelfType& src)    { mHash = src.mHash; }\n\n    // Remove all entries from the Hash table.\n    inline void    Clear() { mHash.Clear(); }\n    // Returns true if the Hash is empty.\n    inline bool    IsEmpty() const { return mHash.IsEmpty(); }\n\n    // Access (set).\n    inline void    Set(const C& key, const U& value)\n    {\n        typename HashNode::NodeRef e(key, value);\n        mHash.Set(e);\n    }\n    inline void    Add(const C& key, const U& value)\n    {\n        typename HashNode::NodeRef e(key, value);\n        mHash.Add(e);\n    }\n\n    // Removes an element by clearing its Entry.\n    inline void     Remove(const C& key)\n    {   \n        mHash.RemoveAlt(key);\n    }\n    template<class K>\n    inline void     RemoveAlt(const K& key)\n    {   \n        mHash.RemoveAlt(key);\n    }\n\n    // Retrieve the value under the given key.    \n    //  - If there's no value under the key, then return false and leave *pvalue alone.\n    //  - If there is a value, return true, and Set *Pvalue to the Entry's value.\n    //  - If value == NULL, return true or false according to the presence of the key.    \n    bool    Get(const C& key, U* pvalue) const   \n    {\n        const HashNode* p = mHash.GetAlt(key);\n        if (p)\n        {\n            if (pvalue)\n                *pvalue = p->Second;\n            return true;\n        }\n        return false;\n    }\n\n    template<class K>\n    bool    GetAlt(const K& key, U* pvalue) const   \n    {\n        const HashNode* p = mHash.GetAlt(key);\n        if (p)\n        {\n            if (pvalue)\n                *pvalue = p->Second;\n            return true;\n        }\n        return false;\n    }\n\n    // Retrieve the pointer to a value under the given key.    \n    //  - If there's no value under the key, then return NULL.    \n    //  - If there is a value, return the pointer.    \n    inline U*  Get(const C& key)\n    {\n        HashNode* p = mHash.GetAlt(key);\n        return p ? &p->Second : 0;\n    }\n    inline const U* Get(const C& key) const\n    {\n        const HashNode* p = mHash.GetAlt(key);\n        return p ? &p->Second : 0;\n    }\n\n    template<class K>\n    inline U*  GetAlt(const K& key)\n    {\n        HashNode* p = mHash.GetAlt(key);\n        return p ? &p->Second : 0;\n    }\n    template<class K>\n    inline const U* GetAlt(const K& key) const\n    {\n        const HashNode* p = mHash.GetAlt(key);\n        return p ? &p->Second : 0;\n    }\n\n    // Sizing methods - delegate to Hash.\n    inline size_t  GetSize() const              { return mHash.GetSize(); }    \n\tinline int     GetSizeI() const             { return (int)GetSize(); }\n\tinline void    Resize(size_t n)              { mHash.Resize(n); }\n    inline void    SetCapacity(size_t newSize)   { mHash.SetCapacity(newSize); }\n\n    // Iterator API, like STL.\n    typedef typename Container::ConstIterator   ConstIterator;\n    typedef typename Container::Iterator        Iterator;\n\n    inline Iterator        Begin()              { return mHash.Begin(); }\n    inline Iterator        End()                { return mHash.End(); }\n    inline ConstIterator   Begin() const        { return mHash.Begin(); }\n    inline ConstIterator   End() const          { return mHash.End();   }\n\n    Iterator        Find(const C& key)          { return mHash.FindAlt(key);  }\n    ConstIterator   Find(const C& key) const    { return mHash.FindAlt(key);  }\n\n    template<class K>\n    Iterator        FindAlt(const K& key)       { return mHash.FindAlt(key);  }\n    template<class K>\n    ConstIterator   FindAlt(const K& key) const { return mHash.FindAlt(key);  }\n};\n\n\n\n// Hash with uncached hash code; declared for convenience.\ntemplate<class C, class U, class HashF = FixedSizeHash<C>, class Allocator = ContainerAllocator<C> >\nclass HashUncached\n    : public Hash<C, U, HashF, Allocator, HashNode<C,U,HashF>,\n                   HashsetNodeEntry<HashNode<C,U,HashF>, typename HashNode<C,U,HashF>::NodeHashF> >\n{\npublic:\n    typedef HashUncached<C, U, HashF, Allocator>                SelfType;\n    typedef Hash<C, U, HashF, Allocator, HashNode<C,U,HashF>,\n                 HashsetNodeEntry<HashNode<C,U,HashF>,\n                 typename HashNode<C,U,HashF>::NodeHashF> >     BaseType;\n\n    // Delegated constructors.\n    HashUncached()                                        { }\n    HashUncached(int sizeHint) : BaseType(sizeHint)       { }\n    HashUncached(const SelfType& src) : BaseType(src)     { }\n    ~HashUncached()                                       { }\n    void operator = (const SelfType& src)                 { BaseType::operator = (src); }\n};\n\n\n\n// And identity hash in which keys serve as hash value. Can be uncached,\n// since hash computation is assumed cheap.\ntemplate<class C, class U, class Allocator = ContainerAllocator<C>, class HashF = IdentityHash<C> >\nclass HashIdentity\n    : public HashUncached<C, U, HashF, Allocator>\n{\npublic:\n    typedef HashIdentity<C, U, Allocator, HashF> SelfType;\n    typedef HashUncached<C, U, HashF, Allocator> BaseType;\n\n    // Delegated constructors.\n    HashIdentity()                                        { }\n    HashIdentity(int sizeHint) : BaseType(sizeHint)       { }\n    HashIdentity(const SelfType& src) : BaseType(src)     { }\n    ~HashIdentity()                                       { }\n    void operator = (const SelfType& src)                 { BaseType::operator = (src); }\n};\n\n\n} // OVR\n\n\n#ifdef OVR_DEFINE_NEW\n#define new OVR_DEFINE_NEW\n#endif\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_KeyCodes.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR_Kernel.h\nFilename    :   OVR_KeyCodes.h\nContent     :   Common keyboard constants\nCreated     :   September 19, 2012\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_KeyCodes_h\n#define OVR_KeyCodes_h\n\nnamespace OVR {\n\n//-----------------------------------------------------------------------------------\n// ***** KeyCode\n\n// KeyCode enumeration defines platform-independent keyboard key constants.\n// Note that Key_A through Key_Z are mapped to capital ascii constants.\n\nenum KeyCode\n{\n    // Key_None indicates that no key was specified.\n    Key_None            = 0, \n\n    // A through Z and numbers 0 through 9.\n    Key_A               = 65,\n    Key_B,\n    Key_C,\n    Key_D,\n    Key_E,\n    Key_F,\n    Key_G,\n    Key_H,\n    Key_I,\n    Key_J,\n    Key_K,\n    Key_L,\n    Key_M,\n    Key_N,\n    Key_O,\n    Key_P,\n    Key_Q,\n    Key_R,\n    Key_S,\n    Key_T,\n    Key_U,\n    Key_V,\n    Key_W,\n    Key_X,\n    Key_Y,\n    Key_Z,\n    Key_Num0            = 48,\n    Key_Num1,\n    Key_Num2,\n    Key_Num3,\n    Key_Num4,\n    Key_Num5,\n    Key_Num6,\n    Key_Num7,\n    Key_Num8,\n    Key_Num9,\n\n    // Numeric keypad.\n    Key_KP_0            = 0xa0,\n    Key_KP_1,\n    Key_KP_2,\n    Key_KP_3,\n    Key_KP_4,\n    Key_KP_5,\n    Key_KP_6,\n    Key_KP_7,\n    Key_KP_8,\n    Key_KP_9,\n    Key_KP_Multiply,\n    Key_KP_Add,\n    Key_KP_Enter,\n    Key_KP_Subtract,\n    Key_KP_Decimal,\n    Key_KP_Divide,\n    \n    // Function keys.\n    Key_F1              = 0xb0,\n    Key_F2,\n    Key_F3,\n    Key_F4,\n    Key_F5,\n    Key_F6,\n    Key_F7,\n    Key_F8,\n    Key_F9,\n    Key_F10,\n    Key_F11,\n    Key_F12,\n    Key_F13,\n    Key_F14,\n    Key_F15,\n    \n    // Other keys.\n    Key_Backspace       = 8,\n    Key_Tab,\n    Key_Clear           = 12,\n    Key_Return,\n    Key_Shift           = 16,\n    Key_Control,\n    Key_Alt,\n    Key_Pause,\n    Key_CapsLock        = 20, // Toggle\n    Key_Escape          = 27,\n    Key_Space           = 32,\n    Key_Quote           = 39,\n    Key_PageUp          = 0xc0,\n    Key_PageDown,\n    Key_End,\n    Key_Home,\n    Key_Left,\n    Key_Up,\n    Key_Right,\n    Key_Down,\n    Key_Insert,\n    Key_Delete,\n    Key_Help,\n    \n    Key_Comma           = 44,\n    Key_Minus,\n    Key_Slash           = 47,\n    Key_Period,\n    Key_NumLock         = 144, // Toggle\n    Key_ScrollLock      = 145, // Toggle\n    \n    Key_Semicolon       = 59,\n    Key_Equal           = 61,\n    Key_Backtick        = 96,   // ` and tilda~ when shifted (US keyboard)\n    Key_BracketLeft     = 91,\n    Key_Backslash,\n    Key_BracketRight,\n\n    Key_OEM_AX          = 0xE1,  //  'AX' key on Japanese AX keyboard\n    Key_OEM_102         = 0xE2,  //  \"<>\" or \"\\|\" on RT 102-key keyboard.\n    Key_ICO_HELP        = 0xE3,  //  Help key on ICO\n    Key_ICO_00          = 0xE4,  //  00 key on ICO\n\n    Key_Meta,\n\n    // Total number of keys.\n    Key_CodeCount\n};\n\n\n//-----------------------------------------------------------------------------------\n\nclass KeyModifiers \n{\npublic:\n    enum\n    {\n        Key_ShiftPressed    = 0x01,\n        Key_CtrlPressed     = 0x02,\n        Key_AltPressed      = 0x04,\n        Key_MetaPressed     = 0x08,\n        Key_CapsToggled     = 0x10,\n        Key_NumToggled      = 0x20,\n        Key_ScrollToggled   = 0x40,\n\n        Initialized_Bit     = 0x80,\n        Initialized_Mask    = 0xFF\n    };\n    unsigned char States;\n\n    KeyModifiers() : States(0) { }\n        KeyModifiers(unsigned char st) : States((unsigned char)(st | Initialized_Bit)) { }\n\n    void Reset() { States = 0; }\n\n    bool IsShiftPressed() const { return (States & Key_ShiftPressed) != 0; }\n    bool IsCtrlPressed() const  { return (States & Key_CtrlPressed) != 0; }\n    bool IsAltPressed() const   { return (States & Key_AltPressed) != 0; }\n    bool IsMetaPressed() const  { return (States & Key_MetaPressed) != 0; }\n    bool IsCapsToggled() const  { return (States & Key_CapsToggled) != 0; }\n    bool IsNumToggled() const   { return (States & Key_NumToggled) != 0; }\n    bool IsScrollToggled() const{ return (States & Key_ScrollToggled) != 0; }\n\n    void SetShiftPressed(bool v = true)  { (v) ? States |= Key_ShiftPressed : States &= ~Key_ShiftPressed; }\n    void SetCtrlPressed(bool v = true)   { (v) ? States |= Key_CtrlPressed  : States &= ~Key_CtrlPressed; }\n    void SetAltPressed(bool v = true)    { (v) ? States |= Key_AltPressed   : States &= ~Key_AltPressed; }\n    void SetMetaPressed(bool v = true)   { (v) ? States |= Key_MetaPressed  : States &= ~Key_MetaPressed; }\n    void SetCapsToggled(bool v = true)   { (v) ? States |= Key_CapsToggled  : States &= ~Key_CapsToggled; }\n    void SetNumToggled(bool v = true)    { (v) ? States |= Key_NumToggled   : States &= ~Key_NumToggled; }\n    void SetScrollToggled(bool v = true) { (v) ? States |= Key_ScrollToggled: States &= ~Key_ScrollToggled; }\n\n    bool IsInitialized() const { return (States & Initialized_Mask) != 0; }\n};\n\n\n//-----------------------------------------------------------------------------------\n\n/*\nenum PadKeyCode\n{\n    Pad_None, // Indicates absence of key code.\n    Pad_Back,\n    Pad_Start,\n    Pad_A,\n    Pad_B,\n    Pad_X,\n    Pad_Y,\n    Pad_R1,  // RightShoulder;\n    Pad_L1,  // LeftShoulder;\n    Pad_R2,  // RightTrigger;\n    Pad_L2,  // LeftTrigger;\n    Pad_Up,\n    Pad_Down,\n    Pad_Right,\n    Pad_Left,\n    Pad_Plus,\n    Pad_Minus,\n    Pad_1,\n    Pad_2,\n    Pad_H,\n    Pad_C,\n    Pad_Z,\n    Pad_O,\n    Pad_T,\n    Pad_S,\n    Pad_Select,\n    Pad_Home,\n    Pad_RT,  // RightThumb;\n    Pad_LT   // LeftThumb;\n};\n*/\n\n} // OVR\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_List.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR\nFilename    :   OVR_List.h\nContent     :   Template implementation for doubly-connected linked List\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_List_h\n#define OVR_List_h\n\n#include \"OVR_Types.h\"\n\nnamespace OVR {\n\n//-----------------------------------------------------------------------------------\n// ***** ListNode\n//\n// Base class for the elements of the intrusive linked list.\n// To store elements in the List do:\n//\n// struct MyData : ListNode<MyData>\n// {\n//     . . .\n// };\n\ntemplate<class T>\nstruct ListNode\n{\n    union {\n        T*    pPrev;\n        void* pVoidPrev;\n    };\n    union {\n        T*    pNext;\n        void* pVoidNext;\n    };\n\n    ListNode()\n    {\n        pPrev = NULL;\n        pNext = NULL;\n    }\n\n    void    RemoveNode()\n    {\n        pPrev->pNext = pNext;\n        pNext->pPrev = pPrev;\n    }\n\n    // Removes us from the list and inserts pnew there instead.\n    void    ReplaceNodeWith(T* pnew)\n    {\n        pPrev->pNext = pnew;\n        pNext->pPrev = pnew;\n        pnew->pPrev = pPrev;\n        pnew->pNext = pNext;\n    }\n       \n    // Inserts the argument linked list node after us in the list.\n    void    InsertNodeAfter(T* p)\n    {\n        p->pPrev          = pNext->pPrev; // this\n        p->pNext          = pNext;\n        pNext->pPrev      = p;\n        pNext             = p;\n    }\n    // Inserts the argument linked list node before us in the list.\n    void    InsertNodeBefore(T* p)\n    {\n        p->pNext          = pNext->pPrev; // this\n        p->pPrev          = pPrev;\n        pPrev->pNext      = p;\n        pPrev             = p;\n    }\n\n    void    Alloc_MoveTo(ListNode<T>* pdest)\n    {\n        pdest->pNext = pNext;\n        pdest->pPrev = pPrev;\n        pPrev->pNext = (T*)pdest;\n        pNext->pPrev = (T*)pdest;\n    }\n};\n\n\n//------------------------------------------------------------------------\n// ***** List\n//\n// Doubly linked intrusive list. \n// The data type must be derived from ListNode.\n// \n// Adding:   PushFront(), PushBack().\n// Removing: Remove() - the element must be in the list!\n// Moving:   BringToFront(), SendToBack() - the element must be in the list!\n//\n// Iterating:\n//    MyData* data = MyList.GetFirst();\n//    while (!MyList.IsNull(data))\n//    {\n//        . . .\n//        data = MyList.GetNext(data);\n//    }\n//\n// Removing:\n//    MyData* data = MyList.GetFirst();\n//    while (!MyList.IsNull(data))\n//    {\n//        MyData* next = MyList.GetNext(data);\n//        if (ToBeRemoved(data))\n//             MyList.Remove(data);\n//        data = next;\n//    }\n//\n\n// List<> represents a doubly-linked list of T, where each T must derive\n// from ListNode<B>. B specifies the base class that was directly\n// derived from ListNode, and is only necessary if there is an intermediate\n// inheritance chain.\n\ntemplate<class T, class B = T> class List\n{\npublic:\n    typedef T ValueType;\n\n    List()\n    {\n        Root.pNext = Root.pPrev = (ValueType*)&Root;\n    }\n\n    void Clear()\n    {\n        Root.pNext = Root.pPrev = (ValueType*)&Root;\n    }\n\n    const ValueType* GetFirst() const { return (const ValueType*)Root.pNext; }\n    const ValueType* GetLast () const { return (const ValueType*)Root.pPrev; }\n          ValueType* GetFirst()       { return (ValueType*)Root.pNext; }\n          ValueType* GetLast ()       { return (ValueType*)Root.pPrev; }\n\n    // Determine if list is empty (i.e.) points to itself.\n    // Go through void* access to avoid issues with strict-aliasing optimizing out the\n    // access after RemoveNode(), etc.\n    bool IsEmpty()                   const { return Root.pVoidNext == (const T*)(const B*)&Root; }\n    bool IsFirst(const ValueType* p) const { return p == Root.pNext; }\n    bool IsLast (const ValueType* p) const { return p == Root.pPrev; }\n    bool IsNull (const ValueType* p) const { return p == (const T*)(const B*)&Root; }\n\n    inline static const ValueType* GetPrev(const ValueType* p) { return (const ValueType*)p->pPrev; }\n    inline static const ValueType* GetNext(const ValueType* p) { return (const ValueType*)p->pNext; }\n    inline static       ValueType* GetPrev(      ValueType* p) { return (ValueType*)p->pPrev; }\n    inline static       ValueType* GetNext(      ValueType* p) { return (ValueType*)p->pNext; }\n\n    void PushFront(ValueType* p)\n    {\n        p->pNext          =  Root.pNext;\n        p->pPrev          = (ValueType*)&Root;\n        Root.pNext->pPrev =  p;\n        Root.pNext        =  p;\n    }\n\n    void PushBack(ValueType* p)\n    {\n        p->pPrev          =  Root.pPrev;\n        p->pNext          = (ValueType*)&Root;\n        Root.pPrev->pNext =  p;\n        Root.pPrev        =  p;\n    }\n\n    static void Remove(ValueType* p)\n    {\n        p->pPrev->pNext = p->pNext;\n        p->pNext->pPrev = p->pPrev;\n    }\n\n    void BringToFront(ValueType* p)\n    {\n        Remove(p);\n        PushFront(p);\n    }\n\n    void SendToBack(ValueType* p)\n    {\n        Remove(p);\n        PushBack(p);\n    }\n\n    // Appends the contents of the argument list to the front of this list;\n    // items are removed from the argument list.\n    void PushListToFront(List<T>& src)\n    {\n        if (!src.IsEmpty())\n        {\n            ValueType* pfirst = src.GetFirst();\n            ValueType* plast  = src.GetLast();\n            src.Clear();\n            plast->pNext   = Root.pNext;\n            pfirst->pPrev  = (ValueType*)&Root;\n            Root.pNext->pPrev = plast;\n            Root.pNext        = pfirst;\n        }\n    }\n\n    void PushListToBack(List<T>& src)\n    {\n        if (!src.IsEmpty())\n        {\n            ValueType* pfirst = src.GetFirst();\n            ValueType* plast  = src.GetLast();\n            src.Clear();\n            plast->pNext   = (ValueType*)&Root;\n            pfirst->pPrev  = Root.pPrev;\n            Root.pPrev->pNext = pfirst;\n            Root.pPrev        = plast;\n        }\n    }\n\n    // Removes all source list items after (and including) the 'pfirst' node from the \n    // source list and adds them to out list.\n    void    PushFollowingListItemsToFront(List<T>& src, ValueType *pfirst)\n    {\n        if (pfirst != &src.Root)\n        {\n            ValueType *plast = src.Root.pPrev;\n\n            // Remove list remainder from source.\n            pfirst->pPrev->pNext = (ValueType*)&src.Root;\n            src.Root.pPrev      = pfirst->pPrev;\n            // Add the rest of the items to list.\n            plast->pNext      = Root.pNext;\n            pfirst->pPrev     = (ValueType*)&Root;\n            Root.pNext->pPrev = plast;\n            Root.pNext        = pfirst;\n        }\n    }\n\n    // Removes all source list items up to but NOT including the 'pend' node from the \n    // source list and adds them to out list.\n    void    PushPrecedingListItemsToFront(List<T>& src, ValueType *ptail)\n    {\n        if (src.GetFirst() != ptail)\n        {\n            ValueType *pfirst = src.Root.pNext;\n            ValueType *plast  = ptail->pPrev;\n\n            // Remove list remainder from source.\n            ptail->pPrev      = (ValueType*)&src.Root;\n            src.Root.pNext    = ptail;            \n\n            // Add the rest of the items to list.\n            plast->pNext      = Root.pNext;\n            pfirst->pPrev     = (ValueType*)&Root;\n            Root.pNext->pPrev = plast;\n            Root.pNext        = pfirst;\n        }\n    }\n\n\n    // Removes a range of source list items starting at 'pfirst' and up to, but not including 'pend',\n    // and adds them to out list. Note that source items MUST already be in the list.\n    void    PushListItemsToFront(ValueType *pfirst, ValueType *pend)\n    {\n        if (pfirst != pend)\n        {\n            ValueType *plast = pend->pPrev;\n\n            // Remove list remainder from source.\n            pfirst->pPrev->pNext = pend;\n            pend->pPrev          = pfirst->pPrev;\n            // Add the rest of the items to list.\n            plast->pNext      = Root.pNext;\n            pfirst->pPrev     = (ValueType*)&Root;\n            Root.pNext->pPrev = plast;\n            Root.pNext        = pfirst;\n        }\n    }\n\n\n    void    Alloc_MoveTo(List<T>* pdest)\n    {\n        if (IsEmpty())\n            pdest->Clear();\n        else\n        {\n            pdest->Root.pNext = Root.pNext;\n            pdest->Root.pPrev = Root.pPrev;\n\n            Root.pNext->pPrev = (ValueType*)&pdest->Root;\n            Root.pPrev->pNext = (ValueType*)&pdest->Root;\n        }        \n    }\n\n\nprivate:\n    // Copying is prohibited\n    List(const List<T>&);\n    const List<T>& operator = (const List<T>&);\n\n    ListNode<B> Root;\n};\n\n\n//------------------------------------------------------------------------\n// ***** FreeListElements\n//\n// Remove all elements in the list and free them in the allocator\n\ntemplate<class List, class Allocator>\nvoid FreeListElements(List& list, Allocator& allocator)\n{\n    typename List::ValueType* self = list.GetFirst();\n    while(!list.IsNull(self))\n    {\n        typename List::ValueType* next = list.GetNext(self);\n        allocator.Free(self);\n        self = next;\n    }\n    list.Clear();\n}\n\n} // OVR\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Lockless.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Lockless.cpp\nContent     :   Test logic for lock-less classes\nCreated     :   December 27, 2013\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include \"OVR_Lockless.h\"\n\n#ifdef OVR_LOCKLESS_TEST\n\n#include \"OVR_Threads.h\"\n#include \"OVR_Timer.h\"\n#include \"OVR_Log.h\"\n\nnamespace OVR { namespace LocklessTest {\n\n\nconst int TestIterations = 10000000;\n\n// Use volatile dummies to force compiler to do spinning.\nvolatile int Dummy1;\nint          Unused1[32];\nvolatile int Dummy2;\nint          Unused2[32];\nvolatile int Dummy3;\nint          Unused3[32];\n\n\n// Data block out of 20 consecutive integers, should be internally consistent.\nstruct TestData\n{\n    enum { ItemCount = 20 };\n\n    int Data[ItemCount];\n\n\n    void Set(int val)\n    {\n        for (int i=0; i<ItemCount; i++)\n        {\n            Data[i] = val*100 + i;\n        }\n    }\n\n    int ReadAndCheckConsistency(int prevValue) const\n    {\n        int val = Data[0];\n\n        for (int i=1; i<ItemCount; i++)\n        {\n            \n            if (Data[i] != (val + i))\n            {\n                // Only complain once per same-value entry\n                if (prevValue != val / 100) \n                {\n                    LogText(\"LocklessTest Fail - corruption at %d inside block %d\\n\",\n                            i, val/100);\n                    // OVR_ASSERT(Data[i] == val + i);\n                }\n                break;\n            }\n        }\n\n        return val / 100;\n    }\n};\n\n\n\nvolatile bool              FirstItemWritten = false;\nLocklessUpdater<TestData, TestData>  TestDataUpdater;\n\n// Use this lock to verify that testing algorithm is otherwise correct...\nLock                       TestLock;   \n\n\n//-------------------------------------------------------------------------------------\n\n// Consumer thread reads values from TestDataUpdater and\n// ensures that each one is internally consistent.\n\nclass Consumer : public Thread\n{\n    virtual int Run()\n    {\n        LogText(\"LocklessTest::Consumer::Run started.\\n\");\n        \n        while (!FirstItemWritten)\n        {\n            // spin until producer wrote first value...\n        }\n\n        TestData d;\n        int      oldValue = 0;\n        int      newValue;\n\n        do \n        {\n            {\n                //Lock::Locker scope(&TestLock);\n                d = TestDataUpdater.GetState();\n            }\n            \n            newValue = d.ReadAndCheckConsistency(oldValue);\n            \n            // Values should increase or stay the same!\n            if (newValue < oldValue)\n            {\n                LogText(\"LocklessTest Fail - %d after %d;  delta = %d\\n\",\n                        newValue, oldValue, newValue - oldValue);\n         //       OVR_ASSERT(0);\n            }\n            \n\n            if (oldValue != newValue)\n            {\n                oldValue = newValue;\n\n                if (oldValue % (TestIterations/30) == 0)\n                {\n                    LogText(\"LocklessTest::Consumer - %5.2f%% done\\n\",\n                            100.0f * (float)oldValue/(float)TestIterations);\n                }\n            }            \n\n            // Spin a while\n            for (int j = 0; j< 300; j++)\n            {\n                Dummy3 = j;\n            }\n\n\n        } while (oldValue < (TestIterations * 99 / 100));\n\n        LogText(\"LocklessTest::Consumer::Run exiting.\\n\");\n        return 0;\n    }\n\n};\n\n\n//-------------------------------------------------------------------------------------\n\nclass Producer : public Thread\n{\n\n    virtual int Run()\n    {\n        LogText(\"LocklessTest::Producer::Run started.\\n\");        \n\n        for (int testVal = 0; testVal < TestIterations; testVal++)\n        {\n            TestData d;\n            d.Set(testVal);\n\n            {\n                //Lock::Locker scope(&TestLock);\n                TestDataUpdater.SetState(d);\n            }\n\n            FirstItemWritten = true;\n\n            // Spin a bit\n            for(int j = 0; j < 1000; j++)\n            {\n                Dummy2 = j;\n            }\n\n            if (testVal % (TestIterations/30) == 0)\n            {\n                LogText(\"LocklessTest::Producer - %5.2f%% done\\n\",\n                        100.0f * (float)testVal/(float)TestIterations);\n            }\n        }\n\n        LogText(\"LocklessTest::Producer::Run exiting.\\n\");\n        return 0;\n    }\n};\n\n\n} // namespace LocklessTest\n\n\n\nvoid StartLocklessTest()\n{\n    // These threads will release themselves once done\n    Ptr<LocklessTest::Producer> producerThread = *new LocklessTest::Producer;\n    Ptr<LocklessTest::Consumer> consumerThread = *new LocklessTest::Consumer;\n\n    producerThread->Start();\n    consumerThread->Start();\n\n    while (!producerThread->IsFinished() && consumerThread->IsFinished())\n    {\n        Thread::MSleep(500);\n    }\n}\n\n\n} // namespace OVR\n\n#endif // OVR_LOCKLESS_TEST\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Lockless.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR_Kernel.h\nFilename    :   OVR_Lockless.h\nContent     :   Lock-less classes for producer/consumer communication\nCreated     :   November 9, 2013\nAuthors     :   John Carmack\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Lockless_h\n#define OVR_Lockless_h\n\n#include \"OVR_Atomic.h\"\n\n// Define this to compile-in Lockless test logic\n//#define OVR_LOCKLESS_TEST\n\nnamespace OVR {\n\n\n// ***** LocklessUpdater\n\n// For single producer cases where you only care about the most recent update, not\n// necessarily getting every one that happens (vsync timing, SensorFusion updates).\n//\n// This is multiple consumer safe, but is currently only used with a single consumer.\n//\n// The SlotType can be the same as T, but should probably be a larger fixed size.\n// This allows for forward compatibility when the updater is shared between processes.\n\n// FIXME: ExchangeAdd_Sync() should be replaced with a portable read-only primitive,\n// so that the lockless pose state can be read-only on remote processes and to reduce\n// false sharing between processes and improve performance.\n\ntemplate<class T, class SlotType>\nclass LocklessUpdater\n{\npublic:\n\tLocklessUpdater() : UpdateBegin( 0 ), UpdateEnd( 0 )\n    {\n        OVR_COMPILER_ASSERT(sizeof(T) <= sizeof(SlotType));\n    }\n\n\tT GetState() const\n\t{\n\t\t// Copy the state out, then retry with the alternate slot\n\t\t// if we determine that our copy may have been partially\n\t\t// stepped on by a new update.\n\t\tT\tstate;\n\t\tint\tbegin, end, final;\n\n\t\tfor(;;)\n\t\t{\n\t\t\t// We are adding 0, only using these as atomic memory barriers, so it\n\t\t\t// is ok to cast off the const, allowing GetState() to remain const.\n            end   = UpdateEnd.Load_Acquire();\n            state = Slots[ end & 1 ];\n            begin = UpdateBegin.Load_Acquire();\n\t\t\tif ( begin == end ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// The producer is potentially blocked while only having partially\n\t\t\t// written the update, so copy out the other slot.\n            state = Slots[ (begin & 1) ^ 1 ];\n            final = UpdateBegin.Load_Acquire();\n\t\t\tif ( final == begin ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// The producer completed the last update and started a new one before\n\t\t\t// we got it copied out, so try fetching the current buffer again.\n\t\t}\n\t\treturn state;\n\t}\n\n\tvoid\tSetState( const T& state )\n\t{\n        const int slot = UpdateBegin.ExchangeAdd_Sync(1) & 1;\n        // Write to (slot ^ 1) because ExchangeAdd returns 'previous' value before add.\n        Slots[slot ^ 1] = state;\n        UpdateEnd.ExchangeAdd_Sync(1);\n\t}\n\n    AtomicInt<int> UpdateBegin;\n    AtomicInt<int> UpdateEnd;\n    SlotType       Slots[2];\n};\n\n\n#ifdef OVR_LOCKLESS_TEST\nvoid StartLocklessTest();\n#endif\n\n\n} // namespace OVR\n\n#endif // OVR_Lockless_h\n\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Log.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Log.cpp\nContent     :   Logging support\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_Log.h\"\n#include \"OVR_Std.h\"\n#include <stdarg.h>\n#include <stdio.h>\n#include <time.h>\n#include \"../Kernel/OVR_System.h\"\n#include \"../Kernel/OVR_DebugHelp.h\"\n#include \"../Util/Util_SystemGUI.h\"\n\n#if defined(OVR_OS_MS) && !defined(OVR_OS_MS_MOBILE)\n#define WIN32_LEAN_AND_MEAN\n#include <windows.h>\n#elif defined(OVR_OS_ANDROID)\n#include <android/log.h>\n#elif defined(OVR_OS_LINUX) || defined(OVR_OS_MAC) || defined(OVR_OS_UNIX)\n#include <syslog.h>\n#endif\n\n\nclass LogSubject : public OVR::SystemSingletonBase<LogSubject>\n{\n    static bool isShuttingDown;\n\npublic:\n\n    LogSubject(){\n        isShuttingDown = false;\n        // Must be at end of function\n        PushDestroyCallbacks();\n    }\n    \n    virtual ~LogSubject(){} // Required because we use delete this below.\n    \n    virtual void OnThreadDestroy()\n    {\n        isShuttingDown = true;\n    }\n\n    virtual void OnSystemDestroy()\n    {\n        delete this;\n    }\n\n    static bool IsValid() {\n        return isShuttingDown == false;\n    }\n\n    OVR::Lock logSubjectLock;\n    OVR::ObserverScope<OVR::Log::LogHandler> logSubject;\n};\n\nbool LogSubject::isShuttingDown;\n\nOVR_DEFINE_SINGLETON(LogSubject);\n\nnamespace OVR {\n\n    // Global Log pointer.\n    Log* volatile OVR_GlobalLog = 0;\n\n//-----------------------------------------------------------------------------------\n// ***** Log Implementation\n\nLog::Log(unsigned logMask) :\n    LoggingMask(logMask)\n{\n#ifdef OVR_OS_WIN32\n    hEventSource = RegisterEventSourceA(NULL, \"OculusVR\");\n    OVR_ASSERT(hEventSource != NULL);\n#endif\n}\n\nLog::~Log()\n{\n#ifdef OVR_OS_WIN32\n    if (hEventSource)\n    {\n        DeregisterEventSource(hEventSource);\n    }\n#endif\n\n    // Clear out global log\n    if (this == OVR_GlobalLog)\n    {\n        // TBD: perhaps we should ASSERT if this happens before system shutdown?\n        OVR_GlobalLog = 0;\n    }\n}\nvoid Log::AddLogObserver(ObserverScope<LogHandler> *logObserver)\n{\n    if (OVR::System::IsInitialized() && LogSubject::GetInstance()->IsValid())\n    {\n        Lock::Locker locker(&LogSubject::GetInstance()->logSubjectLock);\n        logObserver->GetPtr()->Observe(LogSubject::GetInstance()->logSubject);\n    }\n}\nvoid Log::LogMessageVargInt(LogMessageType messageType, const char* fmt, va_list argList)\n{\n    if (OVR::System::IsInitialized() && LogSubject::GetInstance()->IsValid())\n    {\n        // Invoke subject\n        char  buffer[MaxLogBufferMessageSize];\n        char* pBuffer = buffer;\n        char* pAllocated = NULL;\n\n        #if !defined(OVR_CC_MSVC) // Non-Microsoft compilers require you to save a copy of the va_list.\n            va_list argListSaved;\n            va_copy(argListSaved, argList);\n        #endif\n\n        int result = FormatLog(pBuffer, MaxLogBufferMessageSize, Log_Text, fmt, argList);\n\n        if(result >= MaxLogBufferMessageSize) // If there was insufficient capacity...\n        {\n            pAllocated = (char*)OVR_ALLOC(result + 1); // We assume C++ exceptions are disabled. FormatLog will handle the case that pAllocated is NULL.\n            pBuffer = pAllocated;\n\n            #if !defined(OVR_CC_MSVC)\n                va_end(argList); // The caller owns argList and will call va_end on it.\n                va_copy(argList, argListSaved);\n            #endif\n\n            FormatLog(pBuffer, (size_t)result + 1, Log_Text, fmt, argList);\n        }\n\n        Lock::Locker locker(&LogSubject::GetInstance()->logSubjectLock);\n        LogSubject::GetInstance()->logSubject.GetPtr()->Call(pBuffer, messageType);\n\n        delete[] pAllocated;\n    }\n}\n\nvoid Log::LogMessageVarg(LogMessageType messageType, const char* fmt, va_list argList)\n{\n    if ((messageType & LoggingMask) == 0)\n        return;\n#ifndef OVR_BUILD_DEBUG\n    if (IsDebugMessage(messageType))\n        return;\n#endif\n\n    char  buffer[MaxLogBufferMessageSize];\n    char* pBuffer = buffer;\n    char* pAllocated = NULL;\n\n    #if !defined(OVR_CC_MSVC) // Non-Microsoft compilers require you to save a copy of the va_list.\n        va_list argListSaved;\n        va_copy(argListSaved, argList);\n    #endif\n\n    int result = FormatLog(pBuffer, MaxLogBufferMessageSize, messageType, fmt, argList);\n\n    if(result >= MaxLogBufferMessageSize) // If there was insufficient capacity...\n    {\n        pAllocated = (char*)OVR_ALLOC(result + 1); // We assume C++ exceptions are disabled. FormatLog will handle the case that pAllocated is NULL.\n        pBuffer = pAllocated;\n\n        #if !defined(OVR_CC_MSVC)\n            va_end(argList); // The caller owns argList and will call va_end on it.\n            va_copy(argList, argListSaved);\n        #endif\n\n        FormatLog(pBuffer, (size_t)result + 1, messageType, fmt, argList);\n    }\n\n    DefaultLogOutput(pBuffer, messageType, result);\n    delete[] pAllocated;\n}\n\nvoid OVR::Log::LogMessage(LogMessageType messageType, const char* pfmt, ...)\n{\n    va_list argList;\n    va_start(argList, pfmt);\n    LogMessageVarg(messageType, pfmt, argList);\n    va_end(argList);\n}\n\n\n// Return behavior is the same as ISO C vsnprintf: returns the required strlen of buffer (which will \n// be >= bufferSize if bufferSize is insufficient) or returns a negative value because the input was bad.\nint Log::FormatLog(char* buffer, size_t bufferSize, LogMessageType messageType,\n                    const char* fmt, va_list argList)\n{\n    OVR_ASSERT(buffer && (bufferSize >= 10)); // Need to be able to at least print \"Assert: \\n\" to it.\n    if(!buffer || (bufferSize < 10))\n        return -1;\n\n    int addNewline = 1;\n    int prefixLength = 0;\n\n    switch(messageType)\n    {\n    case Log_Error:      OVR_strcpy(buffer, bufferSize, \"Error: \");  prefixLength = 7; break;\n    case Log_Debug:      OVR_strcpy(buffer, bufferSize, \"Debug: \");  prefixLength = 7; break;\n    case Log_Assert:     OVR_strcpy(buffer, bufferSize, \"Assert: \"); prefixLength = 8; break;\n    case Log_Text:       buffer[0] = 0; addNewline = 0; break;\n    case Log_DebugText:  buffer[0] = 0; addNewline = 0; break;\n    default:             buffer[0] = 0; addNewline = 0; break;\n    }\n\n    char*  buffer2       = buffer + prefixLength;\n    size_t size2         = bufferSize - (size_t)prefixLength;\n    int    messageLength = OVR_vsnprintf(buffer2, size2, fmt, argList);\n\n    if (addNewline)\n    {\n        if (messageLength < 0) // If there was a format error... \n        {\n            // To consider: append <format error> to the buffer here.\n            buffer2[0] = '\\n'; // We are guaranteed to have capacity for this.\n            buffer2[1] = '\\0';\n        }\n        else\n        {\n            // If the printed string used all of the capacity or required more than the capacity,\n            // Chop the output by one character so we can append the \\n safely.\n            int messageEnd = (messageLength >= (int)(size2 - 1)) ? (int)(size2 - 2) : messageLength;\n            buffer2[messageEnd + 0] = '\\n';\n            buffer2[messageEnd + 1] = '\\0';\n        }\n    }\n\n    if (messageLength >= 0) // If the format was OK...\n        return prefixLength + messageLength + addNewline; // Return the required strlen of buffer.\n\n    return messageLength; // Else we cannot know what the required strlen is and return the error to the caller.\n}\n\nvoid Log::DefaultLogOutput(const char* formattedText, LogMessageType messageType, int bufferSize)\n{\n    bool debug = IsDebugMessage(messageType);\n    OVR_UNUSED(bufferSize);\n\n#if defined(OVR_OS_WIN32)\n    // Under Win32, output regular messages to console if it exists; debug window otherwise.\n    static DWORD dummyMode;\n    static bool  hasConsole = (GetStdHandle(STD_OUTPUT_HANDLE) != INVALID_HANDLE_VALUE) &&\n                              (GetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), &dummyMode));\n\n    if (!hasConsole || debug)\n    {\n        ::OutputDebugStringA(formattedText);\n    }\n\n    fputs(formattedText, stdout);\n\n#elif defined(OVR_OS_MS) // Any other Microsoft OSs\n\n    ::OutputDebugStringA(formattedText);\n\n#elif defined(OVR_OS_ANDROID)\n    // To do: use bufferSize to deal with the case that Android has a limited output length.\n    __android_log_write(ANDROID_LOG_INFO, \"OVR\", formattedText);\n\n#else\n    fputs(formattedText, stdout);\n\n#endif\n\n    if (messageType == Log_Error)\n    {\n#if defined(OVR_OS_WIN32)\n        if (!ReportEventA(hEventSource, EVENTLOG_ERROR_TYPE, 0, 0, NULL, 1, 0, &formattedText, NULL))\n        {\n            OVR_ASSERT(false);\n        }\n#elif defined(OVR_OS_MS) // Any other Microsoft OSs\n        // TBD\n#elif defined(OVR_OS_ANDROID)\n        // TBD\n#elif defined(OVR_OS_MAC) || defined(OVR_OS_LINUX)\n        syslog(LOG_ERR, \"%s\", formattedText);\n#else\n        // TBD\n#endif\n    }\n\n    // Just in case.\n    OVR_UNUSED2(formattedText, debug);\n}\n\n\n//static\nvoid Log::SetGlobalLog(Log *log)\n{\n    OVR_GlobalLog = log;\n}\n//static\nLog* Log::GetGlobalLog()\n{\n// No global log by default?\n//    if (!OVR_GlobalLog)\n//        OVR_GlobalLog = GetDefaultLog();\n    return OVR_GlobalLog;\n}\n\n//static\nLog* Log::GetDefaultLog()\n{\n    // Create default log pointer statically so that it can be used\n    // even during startup.\n    static Log defaultLog;\n    return &defaultLog;\n}\n\n\n//-----------------------------------------------------------------------------------\n// ***** Global Logging functions\n\n#if !defined(OVR_CC_MSVC)\n// The reason for va_copy is because you can't use va_start twice on Linux\n#define OVR_LOG_FUNCTION_IMPL(Name)  \\\n    void Log##Name(const char* fmt, ...) \\\n    {                                                                    \\\n        if (OVR_GlobalLog)                                               \\\n        {                                                                \\\n            va_list argList1;                                             \\\n            va_start(argList1, fmt);                                     \\\n            va_list argList2;                                             \\\n            va_copy(argList2, argList1);                                 \\\n            OVR_GlobalLog->LogMessageVargInt(Log_##Name, fmt, argList2); \\\n            va_end(argList2);                                             \\\n            OVR_GlobalLog->LogMessageVarg(Log_##Name, fmt, argList1);    \\\n            va_end(argList1);                                            \\\n        }                                                                \\\n    }\n#else\n#define OVR_LOG_FUNCTION_IMPL(Name)  \\\n    void Log##Name(const char* fmt, ...) \\\n    {                                                                    \\\n        if (OVR_GlobalLog)                                               \\\n        {                                                                \\\n            va_list argList1;                                             \\\n            va_start(argList1, fmt);                                     \\\n            OVR_GlobalLog->LogMessageVargInt(Log_##Name, fmt, argList1); \\\n            OVR_GlobalLog->LogMessageVarg(Log_##Name, fmt, argList1);    \\\n            va_end(argList1);                                            \\\n        }                                                                \\\n    }\n#endif // #if !defined(OVR_OS_WIN32)\n\nOVR_LOG_FUNCTION_IMPL(Text)\nOVR_LOG_FUNCTION_IMPL(Error)\n\n#ifdef OVR_BUILD_DEBUG\nOVR_LOG_FUNCTION_IMPL(DebugText)\nOVR_LOG_FUNCTION_IMPL(Debug)\nOVR_LOG_FUNCTION_IMPL(Assert)\n#endif\n\n\n\n// Assertion handler support\n// To consider: Move this to an OVR_Types.cpp or OVR_Assert.cpp source file.\n\nstatic OVRAssertionHandler sOVRAssertionHandler = OVR::DefaultAssertionHandler;\nstatic intptr_t sOVRAssertionHandlerUserParameter = 0;\n\nOVRAssertionHandler GetAssertionHandler(intptr_t* userParameter)\n{\n    if(userParameter)\n        *userParameter = sOVRAssertionHandlerUserParameter;\n    return sOVRAssertionHandler;\n}\n\nvoid SetAssertionHandler(OVRAssertionHandler assertionHandler, intptr_t userParameter)\n{\n    sOVRAssertionHandler = assertionHandler;\n    sOVRAssertionHandlerUserParameter = userParameter;\n}\n\nintptr_t DefaultAssertionHandler(intptr_t /*userParameter*/, const char* title, const char* message)\n{\n    if(OVRIsDebuggerPresent())\n    {\n        OVR_DEBUG_BREAK;\n    }\n    else\n    {\n        #if defined(OVR_BUILD_DEBUG)\n            // Print a stack trace of all threads.\n            OVR::String s;\n            OVR::String threadListOutput;\n            static OVR::SymbolLookup symbolLookup;\n\n            s = \"Failure: \"; \n            s += message;\n\n            if(symbolLookup.Initialize() && symbolLookup.ReportThreadCallstack(threadListOutput, 4)) // This '4' is there to skip our internal handling and retrieve starting at the assertion location (our caller) only.\n            {\n                s += \"\\r\\n\\r\\n\";\n                s += threadListOutput;\n            }\n\n            OVR::Util::DisplayMessageBox(title, s.ToCStr());\n        #else\n            OVR::Util::DisplayMessageBox(title, message);\n        #endif\n    }\n    \n    return 0;\n}\n\n\n\n} // OVR\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Log.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR\nFilename    :   OVR_Log.h\nContent     :   Logging support\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Log_h\n#define OVR_Log_h\n\n#include \"OVR_Types.h\"\n#include \"../Kernel/OVR_Delegates.h\"\n#include \"../Kernel//OVR_Observer.h\"\n#include <stdarg.h>\n\nnamespace OVR {\n\n//-----------------------------------------------------------------------------------\n// ***** Logging Constants\n\n// LogMaskConstants defined bit mask constants that describe what log messages\n// should be displayed.\nenum LogMaskConstants\n{\n    LogMask_Regular = 0x100,\n    LogMask_Debug   = 0x200,\n    LogMask_None    = 0,\n    LogMask_All     = LogMask_Regular|LogMask_Debug\n};\n\n\n// LogMessageType describes the type of the log message, controls when it is\n// displayed and what prefix/suffix is given to it. Messages are subdivided into\n// regular and debug logging types. Debug logging is only generated in debug builds.\n//\n// Log_Text         - General output text displayed without prefix or new-line.\n//                    Used in OVR libraries for general log flow messages\n//                    such as \"Device Initialized\".\n//\n// Log_Error        - Error message output with \"Error: %s\\n\", intended for\n//                    application/sample-level use only, in cases where an expected\n//                    operation failed. OVR libraries should not use this internally,\n//                    reporting status codes instead.\n//\n// Log_DebugText    - Message without prefix or new lines; output in Debug build only.\n//\n// Log_Debug        - Debug-build only message, formatted with \"Debug: %s\\n\".\n//                    Intended to comment on incorrect API usage that doesn't lead\n//                    to crashes but can be avoided with proper use.\n//                    There is no Debug Error on purpose, since real errors should\n//                    be handled by API user.\n//\n// Log_Assert      -  Debug-build only message, formatted with \"Assert: %s\\n\".\n//                    Intended for severe unrecoverable conditions in library\n//                    source code. Generated though OVR_ASSERT_MSG(c, \"Text\").\n\nenum LogMessageType\n{    \n    // General Logging\n    Log_Text        = LogMask_Regular | 0,    \n    Log_Error       = LogMask_Regular | 1, // \"Error: %s\\n\".\n    \n    // Debug-only messages (not generated in release build)\n    Log_DebugText   = LogMask_Debug | 0,\n    Log_Debug       = LogMask_Debug | 1,   // \"Debug: %s\\n\".\n    Log_Assert      = LogMask_Debug | 2,   // \"Assert: %s\\n\".\n};\n\n\n// LOG_VAARG_ATTRIBUTE macro, enforces printf-style fromatting for message types\n#ifdef __GNUC__\n#  define OVR_LOG_VAARG_ATTRIBUTE(a,b) __attribute__((format (printf, a, b)))\n#else\n#  define OVR_LOG_VAARG_ATTRIBUTE(a,b)\n#endif\n\n//-----------------------------------------------------------------------------------\n// ***** Log\n\n// Log defines a base class interface that can be implemented to catch both\n// debug and runtime messages.\n// Debug logging can be overridden by calling Log::SetGlobalLog.\n\nclass Log\n{\n\tfriend class System;\n\n#ifdef OVR_OS_WIN32\n    void* hEventSource;\n#endif\n\npublic: \n    Log(unsigned logMask = LogMask_Debug);\n    virtual ~Log();\n\n\ttypedef Delegate2<void, const char*, LogMessageType> LogHandler;\n\n    // The following is deprecated, as there is no longer a max log buffer message size.\n    enum { MaxLogBufferMessageSize = 4096 };\n\n    unsigned        GetLoggingMask() const            { return LoggingMask; }\n    void            SetLoggingMask(unsigned logMask)  { LoggingMask = logMask; }\n\n\t// Internal\n\t// Invokes observers, then calls LogMessageVarg()\n\tstatic void    LogMessageVargInt(LogMessageType messageType, const char* fmt, va_list argList);\n\n    // This virtual function receives all the messages,\n    // developers should override this function in order to do custom logging\n    virtual void    LogMessageVarg(LogMessageType messageType, const char* fmt, va_list argList);\n\n\tstatic void\t\tAddLogObserver(ObserverScope<LogHandler> *logObserver);\n\n    // Call the logging function with specific message type, with no type filtering.\n    void            LogMessage(LogMessageType messageType,\n                               const char* fmt, ...) OVR_LOG_VAARG_ATTRIBUTE(3,4);\n\n\n    // Helper used by LogMessageVarg to format the log message, writing the resulting\n    // string into buffer. It formats text based on fmt and appends prefix/new line\n    // based on LogMessageType. Return behavior is the same as ISO C vsnprintf: returns the \n    // required strlen of buffer (which will be >= bufferSize if bufferSize is insufficient)\n    // or returns a negative value because the input was bad.\n    static int     FormatLog(char* buffer, size_t bufferSize, LogMessageType messageType,\n                              const char* fmt, va_list argList);\n\n    // Default log output implementation used by by LogMessageVarg.\n    // Debug flag may be used to re-direct output on some platforms, but doesn't\n    // necessarily disable it in release builds; that is the job of the called.    \n    void            DefaultLogOutput(const char* textBuffer, LogMessageType messageType, int bufferSize = -1);\n\n    // Determines if the specified message type is for debugging only.\n    static bool     IsDebugMessage(LogMessageType messageType)\n    {\n        return (messageType & LogMask_Debug) != 0;\n    }\n\n    // *** Global APIs\n\n    // Global Log registration APIs.\n    //  - Global log is used for OVR_DEBUG messages. Set global log to null (0)\n    //    to disable all logging.\n    static void     SetGlobalLog(Log *log);\n    static Log*     GetGlobalLog();\n\n    // Returns default log singleton instance.\n    static Log*     GetDefaultLog();\n\n    // Applies logMask to the default log and returns a pointer to it.\n    // By default, only Debug logging is enabled, so to avoid SDK generating console\n    // messages in user app (those are always disabled in release build,\n    // even if the flag is set). This function is useful in System constructor.\n    static Log*     ConfigureDefaultLog(unsigned logMask = LogMask_Debug)\n    {\n        Log* log = GetDefaultLog();\n        log->SetLoggingMask(logMask);\n        return log;\n    }\n\nprivate:\n    // Logging mask described by LogMaskConstants.\n    unsigned    LoggingMask;\n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** Global Logging Functions and Debug Macros\n\n// These functions will output text to global log with semantics described by\n// their LogMessageType.\nvoid LogText(const char* fmt, ...) OVR_LOG_VAARG_ATTRIBUTE(1,2);\nvoid LogError(const char* fmt, ...) OVR_LOG_VAARG_ATTRIBUTE(1,2);\n\n#ifdef OVR_BUILD_DEBUG\n\n    // Debug build only logging.\n    void LogDebugText(const char* fmt, ...) OVR_LOG_VAARG_ATTRIBUTE(1,2);\n    void LogDebug(const char* fmt, ...) OVR_LOG_VAARG_ATTRIBUTE(1,2);\n    void LogAssert(const char* fmt, ...) OVR_LOG_VAARG_ATTRIBUTE(1,2);\n\n    // Macro to do debug logging, printf-style.\n    // An extra set of set of parenthesis must be used around arguments,\n    // as in: OVR_DEBUG_LOG((\"Value %d\", 2)).\n    #define OVR_DEBUG_LOG(args)       do { OVR::LogDebug args; } while(0)\n    #define OVR_DEBUG_LOG_TEXT(args)  do { OVR::LogDebugText args; } while(0)\n\n\t// Conditional logging. It logs when the condition 'c' is true.\n\t#define OVR_DEBUG_LOG_COND(c, args)\t\t\tdo { if ((c)) { OVR::LogDebug args; } } while(0)\n\t#define OVR_DEBUG_LOG_TEXT_COND(c, args)\tdo { if ((c)) { OVR::LogDebugText args; } } while(0)\n\n\t// Conditional logging & asserting. It asserts/logs when the condition 'c' is NOT true.\n    #define OVR_ASSERT_LOG(c, args)\t  do { if (!(c)) { OVR::LogAssert args; OVR_DEBUG_BREAK; } } while(0)\n\n#else\n\n    // If not in debug build, macros do nothing.\n    #define OVR_DEBUG_LOG(args)\t\t\t\t((void)0)\n    #define OVR_DEBUG_LOG_TEXT(args)\t\t((void)0)\n\t#define OVR_DEBUG_LOG_COND(c, args)\t\t((void)0)\n\t#define OVR_DEBUG_LOG_TEXT_COND(args)\t((void)0)\n    #define OVR_ASSERT_LOG(c, args)\t\t\t((void)0)\n\n#endif\n\n} // OVR \n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Math.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Math.h\nContent     :   Implementation of 3D primitives such as vectors, matrices.\nCreated     :   September 4, 2012\nAuthors     :   Andrew Reisse, Michael Antonov, Anna Yershova\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include \"OVR_Math.h\"\n#include \"OVR_Log.h\"\n\n#include <float.h>\n\n\nnamespace OVR {\n\n\n//-------------------------------------------------------------------------------------\n// ***** Constants\n\ntemplate<>\nconst Vector3<float> Vector3<float>::ZERO = Vector3<float>();\n\ntemplate<>\nconst Vector3<double> Vector3<double>::ZERO = Vector3<double>();\n\ntemplate<>\nconst Matrix4<float> Matrix4<float>::IdentityValue = Matrix4<float>(1.0f, 0.0f, 0.0f, 0.0f, \n                                                                    0.0f, 1.0f, 0.0f, 0.0f, \n                                                                    0.0f, 0.0f, 1.0f, 0.0f,\n                                                                    0.0f, 0.0f, 0.0f, 1.0f);\n\ntemplate<>\nconst Matrix4<double> Matrix4<double>::IdentityValue = Matrix4<double>(1.0, 0.0, 0.0, 0.0, \n                                                                       0.0, 1.0, 0.0, 0.0, \n                                                                       0.0, 0.0, 1.0, 0.0,\n                                                                       0.0, 0.0, 0.0, 1.0);\n\n\n} // Namespace OVR\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Math.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR_Kernel.h\nFilename    :   OVR_Math.h\nContent     :   Implementation of 3D primitives such as vectors, matrices.\nCreated     :   September 4, 2012\nAuthors     :   Andrew Reisse, Michael Antonov, Steve LaValle, \n\t\t\t\tAnna Yershova, Max Katsev, Dov Katz\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Math_h\n#define OVR_Math_h\n\n#include <assert.h>\n#include <stdlib.h>\n#include <math.h>\n\n#include \"OVR_Types.h\"\n#include \"OVR_RefCount.h\"\n#include \"OVR_Std.h\"\n#include \"OVR_Alg.h\"\n\n\nnamespace OVR {\n\n//-------------------------------------------------------------------------------------\n// ***** Constants for 3D world/axis definitions.\n\n// Definitions of axes for coordinate and rotation conversions.\nenum Axis\n{\n    Axis_X = 0, Axis_Y = 1, Axis_Z = 2\n};\n\n// RotateDirection describes the rotation direction around an axis, interpreted as follows:\n//  CW  - Clockwise while looking \"down\" from positive axis towards the origin.\n//  CCW - Counter-clockwise while looking from the positive axis towards the origin,\n//        which is in the negative axis direction.\n//  CCW is the default for the RHS coordinate system. Oculus standard RHS coordinate\n//  system defines Y up, X right, and Z back (pointing out from the screen). In this\n//  system Rotate_CCW around Z will specifies counter-clockwise rotation in XY plane.\nenum RotateDirection\n{\n    Rotate_CCW = 1,\n    Rotate_CW  = -1 \n};\n\n// Constants for right handed and left handed coordinate systems\nenum HandedSystem\n{\n    Handed_R = 1, Handed_L = -1\n};\n\n// AxisDirection describes which way the coordinate axis points. Used by WorldAxes.\nenum AxisDirection\n{\n    Axis_Up    =  2,\n    Axis_Down  = -2,\n    Axis_Right =  1,\n    Axis_Left  = -1,\n    Axis_In    =  3,\n    Axis_Out   = -3\n};\n\nstruct WorldAxes\n{\n    AxisDirection XAxis, YAxis, ZAxis;\n\n    WorldAxes(AxisDirection x, AxisDirection y, AxisDirection z)\n        : XAxis(x), YAxis(y), ZAxis(z) \n    { OVR_ASSERT(abs(x) != abs(y) && abs(y) != abs(z) && abs(z) != abs(x));}\n};\n\n} // namespace OVR\n\n\n//------------------------------------------------------------------------------------//\n// ***** C Compatibility Types\n\n// These declarations are used to support conversion between C types used in\n// LibOVR C interfaces and their C++ versions. As an example, they allow passing\n// Vector3f into a function that expects ovrVector3f.\n\ntypedef struct ovrQuatf_ ovrQuatf;\ntypedef struct ovrQuatd_ ovrQuatd;\ntypedef struct ovrSizei_ ovrSizei;\ntypedef struct ovrSizef_ ovrSizef;\ntypedef struct ovrRecti_ ovrRecti;\ntypedef struct ovrVector2i_ ovrVector2i;\ntypedef struct ovrVector2f_ ovrVector2f;\ntypedef struct ovrVector3f_ ovrVector3f;\ntypedef struct ovrVector3d_ ovrVector3d;\ntypedef struct ovrMatrix3d_ ovrMatrix3d;\ntypedef struct ovrMatrix4f_ ovrMatrix4f;\ntypedef struct ovrPosef_ ovrPosef;\ntypedef struct ovrPosed_ ovrPosed;\ntypedef struct ovrPoseStatef_ ovrPoseStatef;\ntypedef struct ovrPoseStated_ ovrPoseStated;\n\nnamespace OVR {\n\n// Forward-declare our templates.\ntemplate<class T> class Quat;\ntemplate<class T> class Size;\ntemplate<class T> class Rect;\ntemplate<class T> class Vector2;\ntemplate<class T> class Vector3;\ntemplate<class T> class Matrix3;\ntemplate<class T> class Matrix4;\ntemplate<class T> class Pose;\ntemplate<class T> class PoseState;\n\n// CompatibleTypes::Type is used to lookup a compatible C-version of a C++ class.\ntemplate<class C>\nstruct CompatibleTypes\n{    \n    // Declaration here seems necessary for MSVC; specializations are\n    // used instead.\n    typedef struct {} Type;\n};\n\n// Specializations providing CompatibleTypes::Type value.\ntemplate<> struct CompatibleTypes<Quat<float> >     { typedef ovrQuatf Type; };\ntemplate<> struct CompatibleTypes<Quat<double> >    { typedef ovrQuatd Type; };\ntemplate<> struct CompatibleTypes<Matrix3<double> > { typedef ovrMatrix3d Type; };\ntemplate<> struct CompatibleTypes<Matrix4<float> >  { typedef ovrMatrix4f Type; };\ntemplate<> struct CompatibleTypes<Size<int> >       { typedef ovrSizei Type; };\ntemplate<> struct CompatibleTypes<Size<float> >     { typedef ovrSizef Type; };\ntemplate<> struct CompatibleTypes<Rect<int> >       { typedef ovrRecti Type; };\ntemplate<> struct CompatibleTypes<Vector2<int> >    { typedef ovrVector2i Type; };\ntemplate<> struct CompatibleTypes<Vector2<float> >  { typedef ovrVector2f Type; };\ntemplate<> struct CompatibleTypes<Vector3<float> >  { typedef ovrVector3f Type; };\ntemplate<> struct CompatibleTypes<Vector3<double> > { typedef ovrVector3d Type; };\n\ntemplate<> struct CompatibleTypes<Pose<float> > { typedef ovrPosef Type; };\ntemplate<> struct CompatibleTypes<Pose<double> > { typedef ovrPosed Type; };\n\n//------------------------------------------------------------------------------------//\n// ***** Math\n//\n// Math class contains constants and functions. This class is a template specialized\n// per type, with Math<float> and Math<double> being distinct.\ntemplate<class Type>\nclass Math\n{  \npublic:\n    // By default, support explicit conversion to float. This allows Vector2<int> to\n    // compile, for example.\n    typedef float OtherFloatType;\n};\n\n\n#define MATH_FLOAT_PI                (3.1415926f)\n#define MATH_FLOAT_TWOPI             (2.0f *MATH_FLOAT_PI)\n#define MATH_FLOAT_PIOVER2           (0.5f *MATH_FLOAT_PI)\n#define MATH_FLOAT_PIOVER4           (0.25f*MATH_FLOAT_PI)\n#define MATH_FLOAT_E                 (2.7182818f)\n#define MATH_FLOAT_MAXVALUE\t\t\t (FLT_MAX) \n#define MATH_FLOAT MINPOSITIVEVALUE  (FLT_MIN)  \n#define MATH_FLOAT_RADTODEGREEFACTOR (360.0f / MATH_FLOAT_TWOPI)\n#define MATH_FLOAT_DEGREETORADFACTOR (MATH_FLOAT_TWOPI / 360.0f)\n#define MATH_FLOAT_TOLERANCE\t\t (0.00001f)\n#define MATH_FLOAT_SINGULARITYRADIUS (0.0000001f) // Use for Gimbal lock numerical problems\n\n#define MATH_DOUBLE_PI                (3.14159265358979)\n#define MATH_DOUBLE_TWOPI             (2.0f *MATH_DOUBLE_PI)\n#define MATH_DOUBLE_PIOVER2           (0.5f *MATH_DOUBLE_PI)\n#define MATH_DOUBLE_PIOVER4           (0.25f*MATH_DOUBLE_PI)\n#define MATH_DOUBLE_E                 (2.71828182845905)\n#define MATH_DOUBLE_MAXVALUE\t\t  (DBL_MAX)\n#define MATH_DOUBLE MINPOSITIVEVALUE  (DBL_MIN)\n#define MATH_DOUBLE_RADTODEGREEFACTOR (360.0f / MATH_DOUBLE_TWOPI)\n#define MATH_DOUBLE_DEGREETORADFACTOR (MATH_DOUBLE_TWOPI / 360.0f)\n#define MATH_DOUBLE_TOLERANCE\t\t  (0.00001)\n#define MATH_DOUBLE_SINGULARITYRADIUS (0.000000000001) // Use for Gimbal lock numerical problems\n\n\n\n\n// Single-precision Math constants class.\ntemplate<>\nclass Math<float>\n{\npublic:\n     typedef double OtherFloatType;\n};\n\n// Double-precision Math constants class.\ntemplate<>\nclass Math<double>\n{\npublic:\n    typedef float OtherFloatType;\n};\n\n\ntypedef Math<float>  Mathf;\ntypedef Math<double> Mathd;\n\n// Conversion functions between degrees and radians\ntemplate<class T>\nT RadToDegree(T rads) { return rads * ((T)MATH_DOUBLE_RADTODEGREEFACTOR); }\ntemplate<class T>\nT DegreeToRad(T rads) { return rads * ((T)MATH_DOUBLE_DEGREETORADFACTOR); }\n\n// Numerically stable acos function\ntemplate<class T>\nT Acos(T val) { \n\t\tif (val > T(1))\t\t\t\treturn T(0);\n\t\telse if (val < T(-1))\t\treturn ((T)MATH_DOUBLE_PI);\n\t\telse\t\t\t\t\t\treturn acos(val); \n};\n\n// Numerically stable asin function\ntemplate<class T>\nT Asin(T val) { \n\tif (val > T(1))\t\t\t\treturn ((T)MATH_DOUBLE_PIOVER2);\n\telse if (val < T(-1))\t\treturn ((T)MATH_DOUBLE_PIOVER2) * T(3);\n\telse\t\t\t\t\t\treturn asin(val); \n};\n\n#ifdef OVR_CC_MSVC\ninline int isnan(double x) { return _isnan(x); };\n#endif\n\ntemplate<class T>\nclass Quat;\n\n\n//-------------------------------------------------------------------------------------\n// ***** Vector2<>\n\n// Vector2f (Vector2d) represents a 2-dimensional vector or point in space,\n// consisting of coordinates x and y\n\ntemplate<class T>\nclass Vector2\n{\npublic:\n    T x, y;\n\n    Vector2() : x(0), y(0) { }\n    Vector2(T x_, T y_) : x(x_), y(y_) { }\n    explicit Vector2(T s) : x(s), y(s) { }\n    explicit Vector2(const Vector2<typename Math<T>::OtherFloatType> &src)\n        : x((T)src.x), y((T)src.y) { }\n\n\n    // C-interop support.\n    typedef  typename CompatibleTypes<Vector2<T> >::Type CompatibleType;\n\n    Vector2(const CompatibleType& s) : x(s.x), y(s.y) {  }\n\n    operator const CompatibleType& () const\n    {\n        static_assert(sizeof(Vector2<T>) == sizeof(CompatibleType), \"sizeof(Vector2<T>) failure\");\n        return reinterpret_cast<const CompatibleType&>(*this);\n    }\n\n        \n    bool     operator== (const Vector2& b) const  { return x == b.x && y == b.y; }\n    bool     operator!= (const Vector2& b) const  { return x != b.x || y != b.y; }\n             \n    Vector2  operator+  (const Vector2& b) const  { return Vector2(x + b.x, y + b.y); }\n    Vector2& operator+= (const Vector2& b)        { x += b.x; y += b.y; return *this; }\n    Vector2  operator-  (const Vector2& b) const  { return Vector2(x - b.x, y - b.y); }\n    Vector2& operator-= (const Vector2& b)        { x -= b.x; y -= b.y; return *this; }\n    Vector2  operator- () const                   { return Vector2(-x, -y); }\n\n    // Scalar multiplication/division scales vector.\n    Vector2  operator*  (T s) const               { return Vector2(x*s, y*s); }\n    Vector2& operator*= (T s)                     { x *= s; y *= s; return *this; }\n\n    Vector2  operator/  (T s) const               { T rcp = T(1)/s;\n                                                    return Vector2(x*rcp, y*rcp); }\n    Vector2& operator/= (T s)                     { T rcp = T(1)/s;\n                                                    x *= rcp; y *= rcp;\n                                                    return *this; }\n\n    static Vector2  Min(const Vector2& a, const Vector2& b) { return Vector2((a.x < b.x) ? a.x : b.x,\n                                                                             (a.y < b.y) ? a.y : b.y); }\n    static Vector2  Max(const Vector2& a, const Vector2& b) { return Vector2((a.x > b.x) ? a.x : b.x,\n                                                                             (a.y > b.y) ? a.y : b.y); }\n\n    // Compare two vectors for equality with tolerance. Returns true if vectors match withing tolerance.\n    bool\tCompare(const Vector2&b, T tolerance = ((T)MATH_DOUBLE_TOLERANCE))  \n    {\n        return (fabs(b.x-x) < tolerance) && (fabs(b.y-y) < tolerance);\n    }\n    \n\t// Access element by index\n\tT& operator[] (int idx)\n\t{\n\t\tOVR_ASSERT(0 <= idx && idx < 2);\n\t\treturn *(&x + idx);\n\t}\n\tconst T& operator[] (int idx) const\n\t{\n\t\tOVR_ASSERT(0 <= idx && idx < 2);\n\t\treturn *(&x + idx);\n\t}\n\n    // Entry-wise product of two vectors\n    Vector2\tEntrywiseMultiply(const Vector2& b) const\t{ return Vector2(x * b.x, y * b.y);}\n\n\n    // Multiply and divide operators do entry-wise math. Used Dot() for dot product.\n    Vector2  operator*  (const Vector2& b) const        { return Vector2(x * b.x,  y * b.y); }\n    Vector2  operator/  (const Vector2& b) const        { return Vector2(x / b.x,  y / b.y); }\n\n\t// Dot product\n    // Used to calculate angle q between two vectors among other things,\n    // as (A dot B) = |a||b|cos(q).\n    T\t\tDot(const Vector2& b) const                 { return x*b.x + y*b.y; }\n\n    // Returns the angle from this vector to b, in radians.\n    T       Angle(const Vector2& b) const        \n\t{ \n\t\tT div = LengthSq()*b.LengthSq();\n\t\tOVR_ASSERT(div != T(0));\n\t\tT result = Acos((this->Dot(b))/sqrt(div));\n\t\treturn result;\n\t}\n\n    // Return Length of the vector squared.\n    T       LengthSq() const                     { return (x * x + y * y); }\n\n    // Return vector length.\n    T       Length() const                       { return sqrt(LengthSq()); }\n\n    // Returns squared distance between two points represented by vectors.\n    T       DistanceSq(const Vector2& b) const   { return (*this - b).LengthSq(); }\n\n\t// Returns distance between two points represented by vectors.\n    T       Distance(const Vector2& b) const     { return (*this - b).Length(); }\n\n\t// Determine if this a unit vector.\n    bool    IsNormalized() const                 { return fabs(LengthSq() - T(1)) < ((T)MATH_DOUBLE_TOLERANCE); }\n\n    // Normalize, convention vector length to 1.    \n    void    Normalize()                          \n\t{\n\t\tT l = Length();\n\t\tOVR_ASSERT(l != T(0));\n\t\t*this /= l; \n\t}\n    // Returns normalized (unit) version of the vector without modifying itself.\n    Vector2 Normalized() const                   \n\t{ \n\t\tT l = Length();\n\t\tOVR_ASSERT(l != T(0));\n\t\treturn *this / l; \n\t}\n\n    // Linearly interpolates from this vector to another.\n    // Factor should be between 0.0 and 1.0, with 0 giving full value to this.\n    Vector2 Lerp(const Vector2& b, T f) const    { return *this*(T(1) - f) + b*f; }\n\n    // Projects this vector onto the argument; in other words,\n    // A.Project(B) returns projection of vector A onto B.\n    Vector2 ProjectTo(const Vector2& b) const    \n\t{ \n\t\tT l2 = b.LengthSq();\n\t\tOVR_ASSERT(l2 != T(0));\n\t\treturn b * ( Dot(b) / l2 ); \n\t}\n};\n\n\ntypedef Vector2<float>  Vector2f;\ntypedef Vector2<double> Vector2d;\ntypedef Vector2<int>    Vector2i;\n\ntypedef Vector2<float>  Point2f;\ntypedef Vector2<double> Point2d;\ntypedef Vector2<int>    Point2i;\n\n//-------------------------------------------------------------------------------------\n// ***** Vector3<> - 3D vector of {x, y, z}\n\n//\n// Vector3f (Vector3d) represents a 3-dimensional vector or point in space,\n// consisting of coordinates x, y and z.\n\ntemplate<class T>\nclass Vector3\n{\npublic:\n    T x, y, z;\n\n    // FIXME: default initialization of a vector class can be very expensive in a full-blown\n    // application.  A few hundred thousand vector constructions is not unlikely and can add\n    // up to milliseconds of time on processors like the PS3 PPU.\n    Vector3() : x(0), y(0), z(0) { }\n    Vector3(T x_, T y_, T z_ = 0) : x(x_), y(y_), z(z_) { }\n    explicit Vector3(T s) : x(s), y(s), z(s) { }\n    explicit Vector3(const Vector3<typename Math<T>::OtherFloatType> &src)\n        : x((T)src.x), y((T)src.y), z((T)src.z) { }\n\n    static const Vector3 ZERO;\n\n    // C-interop support.\n    typedef  typename CompatibleTypes<Vector3<T> >::Type CompatibleType;\n\n    Vector3(const CompatibleType& s) : x(s.x), y(s.y), z(s.z) {  }\n\n    operator const CompatibleType& () const\n    {\n        static_assert(sizeof(Vector3<T>) == sizeof(CompatibleType), \"sizeof(Vector3<T>) failure\");\n        return reinterpret_cast<const CompatibleType&>(*this);\n    }\n\n    bool     operator== (const Vector3& b) const  { return x == b.x && y == b.y && z == b.z; }\n    bool     operator!= (const Vector3& b) const  { return x != b.x || y != b.y || z != b.z; }\n             \n    Vector3  operator+  (const Vector3& b) const  { return Vector3(x + b.x, y + b.y, z + b.z); }\n    Vector3& operator+= (const Vector3& b)        { x += b.x; y += b.y; z += b.z; return *this; }\n    Vector3  operator-  (const Vector3& b) const  { return Vector3(x - b.x, y - b.y, z - b.z); }\n    Vector3& operator-= (const Vector3& b)        { x -= b.x; y -= b.y; z -= b.z; return *this; }\n    Vector3  operator- () const                   { return Vector3(-x, -y, -z); }\n\n    // Scalar multiplication/division scales vector.\n    Vector3  operator*  (T s) const               { return Vector3(x*s, y*s, z*s); }\n    Vector3& operator*= (T s)                     { x *= s; y *= s; z *= s; return *this; }\n\n    Vector3  operator/  (T s) const               { T rcp = T(1)/s;\n                                                    return Vector3(x*rcp, y*rcp, z*rcp); }\n    Vector3& operator/= (T s)                     { T rcp = T(1)/s;\n                                                    x *= rcp; y *= rcp; z *= rcp;\n                                                    return *this; }\n\n    static Vector3  Min(const Vector3& a, const Vector3& b)\n    {\n        return Vector3((a.x < b.x) ? a.x : b.x,\n                       (a.y < b.y) ? a.y : b.y,\n                       (a.z < b.z) ? a.z : b.z);\n    }\n    static Vector3  Max(const Vector3& a, const Vector3& b)\n    { \n        return Vector3((a.x > b.x) ? a.x : b.x,\n                       (a.y > b.y) ? a.y : b.y,\n                       (a.z > b.z) ? a.z : b.z);\n    }        \n\n    // Compare two vectors for equality with tolerance. Returns true if vectors match withing tolerance.\n    bool      Compare(const Vector3&b, T tolerance = ((T)MATH_DOUBLE_TOLERANCE)) \n    {\n        return (fabs(b.x-x) < tolerance) && \n\t\t\t   (fabs(b.y-y) < tolerance) && \n\t\t\t   (fabs(b.z-z) < tolerance);\n    }\n    \n    T& operator[] (int idx)\n    {\n        OVR_ASSERT(0 <= idx && idx < 3);\n        return *(&x + idx);\n    }\n\n    const T& operator[] (int idx) const\n    {\n        OVR_ASSERT(0 <= idx && idx < 3);\n        return *(&x + idx);\n    }\n\n    // Entrywise product of two vectors\n    Vector3\tEntrywiseMultiply(const Vector3& b) const\t{ return Vector3(x * b.x, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t y * b.y, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t z * b.z);}\n\n    // Multiply and divide operators do entry-wise math\n    Vector3  operator*  (const Vector3& b) const        { return Vector3(x * b.x, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t y * b.y, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t z * b.z); }\n\n    Vector3  operator/  (const Vector3& b) const        { return Vector3(x / b.x, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t y / b.y, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t z / b.z); }\n\n\n\t// Dot product\n    // Used to calculate angle q between two vectors among other things,\n    // as (A dot B) = |a||b|cos(q).\n     T      Dot(const Vector3& b) const          { return x*b.x + y*b.y + z*b.z; }\n\n    // Compute cross product, which generates a normal vector.\n    // Direction vector can be determined by right-hand rule: Pointing index finder in\n    // direction a and middle finger in direction b, thumb will point in a.Cross(b).\n    Vector3 Cross(const Vector3& b) const        { return Vector3(y*b.z - z*b.y,\n                                                                  z*b.x - x*b.z,\n                                                                  x*b.y - y*b.x); }\n\n    // Returns the angle from this vector to b, in radians.\n    T       Angle(const Vector3& b) const \n\t{\n\t\tT div = LengthSq()*b.LengthSq();\n\t\tOVR_ASSERT(div != T(0));\n\t\tT result = Acos((this->Dot(b))/sqrt(div));\n\t\treturn result;\n\t}\n\n    // Return Length of the vector squared.\n    T       LengthSq() const                     { return (x * x + y * y + z * z); }\n\n    // Return vector length.\n    T       Length() const                       { return sqrt(LengthSq()); }\n\n    // Returns squared distance between two points represented by vectors.\n    T       DistanceSq(Vector3 const& b) const         { return (*this - b).LengthSq(); }\n\n    // Returns distance between two points represented by vectors.\n    T       Distance(Vector3 const& b) const     { return (*this - b).Length(); }\n    \n    // Determine if this a unit vector.\n    bool    IsNormalized() const                 { return fabs(LengthSq() - T(1)) < ((T)MATH_DOUBLE_TOLERANCE); }\n\n    // Normalize, convention vector length to 1.    \n    void    Normalize()                          \n\t{\n\t\tT l = Length();\n\t\tOVR_ASSERT(l != T(0));\n\t\t*this /= l; \n\t}\n\n    // Returns normalized (unit) version of the vector without modifying itself.\n    Vector3 Normalized() const                   \n\t{ \n\t\tT l = Length();\n\t\tOVR_ASSERT(l != T(0));\n\t\treturn *this / l; \n\t}\n\n    // Linearly interpolates from this vector to another.\n    // Factor should be between 0.0 and 1.0, with 0 giving full value to this.\n    Vector3 Lerp(const Vector3& b, T f) const    { return *this*(T(1) - f) + b*f; }\n\n    // Projects this vector onto the argument; in other words,\n    // A.Project(B) returns projection of vector A onto B.\n    Vector3 ProjectTo(const Vector3& b) const    \n\t{ \n\t\tT l2 = b.LengthSq();\n\t\tOVR_ASSERT(l2 != T(0));\n\t\treturn b * ( Dot(b) / l2 ); \n\t}\n\n    // Projects this vector onto a plane defined by a normal vector\n    Vector3 ProjectToPlane(const Vector3& normal) const { return *this - this->ProjectTo(normal); }\n};\n\ntypedef Vector3<float>  Vector3f;\ntypedef Vector3<double> Vector3d;\ntypedef Vector3<int32_t>  Vector3i;\n    \nstatic_assert((sizeof(Vector3f) == 3*sizeof(float)), \"sizeof(Vector3f) failure\");\nstatic_assert((sizeof(Vector3d) == 3*sizeof(double)), \"sizeof(Vector3d) failure\");\nstatic_assert((sizeof(Vector3i) == 3*sizeof(int32_t)), \"sizeof(Vector3i) failure\");\n\ntypedef Vector3<float>   Point3f;\ntypedef Vector3<double>  Point3d;\ntypedef Vector3<int32_t>  Point3i;\n\n\n//-------------------------------------------------------------------------------------\n// ***** Vector4<> - 4D vector of {x, y, z, w}\n\n//\n// Vector4f (Vector4d) represents a 3-dimensional vector or point in space,\n// consisting of coordinates x, y, z and w.\n\ntemplate<class T>\nclass Vector4\n{\npublic:\n    T x, y, z, w;\n\n\t// FIXME: default initialization of a vector class can be very expensive in a full-blown\n\t// application.  A few hundred thousand vector constructions is not unlikely and can add\n\t// up to milliseconds of time on processors like the PS3 PPU.\n    Vector4() : x(0), y(0), z(0), w(0) { }\n    Vector4(T x_, T y_, T z_, T w_) : x(x_), y(y_), z(z_), w(w_) { }\n    explicit Vector4(T s) : x(s), y(s), z(s), w(s) { }\n\texplicit Vector4(const Vector3<T>& v, const float w_=1) : x(v.x), y(v.y), z(v.z), w(w_) { }\n    explicit Vector4(const Vector4<typename Math<T>::OtherFloatType> &src)\n        : x((T)src.x), y((T)src.y), z((T)src.z), w((T)src.w) { }\n\n    static const Vector4 ZERO;\n\n    // C-interop support.\n    typedef  typename CompatibleTypes< Vector4<T> >::Type CompatibleType;\n\n    Vector4(const CompatibleType& s) : x(s.x), y(s.y), z(s.z), w(s.w) {  }\n\n    operator const CompatibleType& () const\n    {\n        static_assert(sizeof(Vector4<T>) == sizeof(CompatibleType), \"sizeof(Vector4<T>) failure\");\n        return reinterpret_cast<const CompatibleType&>(*this);\n    }\n\n\tVector4& operator= (const Vector3<T>& other)  { x=other.x; y=other.y; z=other.z; w=1; return *this; }\n    bool     operator== (const Vector4& b) const  { return x == b.x && y == b.y && z == b.z && w == b.w; }\n    bool     operator!= (const Vector4& b) const  { return x != b.x || y != b.y || z != b.z || w != b.w; }\n             \n    Vector4  operator+  (const Vector4& b) const  { return Vector4(x + b.x, y + b.y, z + b.z, w + b.w); }\n    Vector4& operator+= (const Vector4& b)        { x += b.x; y += b.y; z += b.z; w += b.w; return *this; }\n    Vector4  operator-  (const Vector4& b) const  { return Vector4(x - b.x, y - b.y, z - b.z, w - b.w); }\n    Vector4& operator-= (const Vector4& b)        { x -= b.x; y -= b.y; z -= b.z; w -= b.w; return *this; }\n    Vector4  operator- () const                   { return Vector4(-x, -y, -z, -w); }\n\n    // Scalar multiplication/division scales vector.\n    Vector4  operator*  (T s) const               { return Vector4(x*s, y*s, z*s, w*s); }\n    Vector4& operator*= (T s)                     { x *= s; y *= s; z *= s; w *= s;return *this; }\n\n    Vector4  operator/  (T s) const               { T rcp = T(1)/s;\n                                                    return Vector4(x*rcp, y*rcp, z*rcp, w*rcp); }\n    Vector4& operator/= (T s)                     { T rcp = T(1)/s;\n                                                    x *= rcp; y *= rcp; z *= rcp; w *= rcp;\n                                                    return *this; }\n\n    static Vector4  Min(const Vector4& a, const Vector4& b)\n    {\n        return Vector4((a.x < b.x) ? a.x : b.x,\n                       (a.y < b.y) ? a.y : b.y,\n                       (a.z < b.z) ? a.z : b.z,\n\t\t\t\t\t   (a.w < b.w) ? a.w : b.w);\n    }\n    static Vector4  Max(const Vector4& a, const Vector4& b)\n    { \n        return Vector4((a.x > b.x) ? a.x : b.x,\n                       (a.y > b.y) ? a.y : b.y,\n                       (a.z > b.z) ? a.z : b.z,\n\t\t\t\t\t   (a.w > b.w) ? a.w : b.w);\n    }        \n\n    // Compare two vectors for equality with tolerance. Returns true if vectors match withing tolerance.\n    bool      Compare(const Vector4&b, T tolerance = ((T)MATH_DOUBLE_TOLERANCE))\n    {\n        return (fabs(b.x-x) < tolerance) && \n\t\t\t   (fabs(b.y-y) < tolerance) && \n\t\t\t   (fabs(b.z-z) < tolerance) &&\n\t\t\t   (fabs(b.w-w) < tolerance);\n    }\n    \n    T& operator[] (int idx)\n    {\n        OVR_ASSERT(0 <= idx && idx < 4);\n        return *(&x + idx);\n    }\n\n    const T& operator[] (int idx) const\n    {\n        OVR_ASSERT(0 <= idx && idx < 4);\n        return *(&x + idx);\n    }\n\n    // Entry wise product of two vectors\n    Vector4\tEntrywiseMultiply(const Vector4& b) const\t{ return Vector4(x * b.x, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t y * b.y, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t z * b.z);}\n\n    // Multiply and divide operators do entry-wise math\n    Vector4  operator*  (const Vector4& b) const        { return Vector4(x * b.x, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t y * b.y, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t z * b.z,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t w * b.w); }\n\n    Vector4  operator/  (const Vector4& b) const        { return Vector4(x / b.x, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t y / b.y, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t z / b.z,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t w / b.w); }\n\n\n\t// Dot product\n    T       Dot(const Vector4& b) const          { return x*b.x + y*b.y + z*b.z + w*b.w; }\n\n    // Return Length of the vector squared.\n    T       LengthSq() const                     { return (x * x + y * y + z * z + w * w); }\n\n    // Return vector length.\n    T       Length() const                       { return sqrt(LengthSq()); }\n    \n    // Determine if this a unit vector.\n    bool    IsNormalized() const                 { return fabs(LengthSq() - T(1)) < Math<T>::Tolerance; }\n\n    // Normalize, convention vector length to 1.    \n    void    Normalize()                          \n\t{\n\t\tT l = Length();\n\t\tOVR_ASSERT(l != T(0));\n\t\t*this /= l; \n\t}\n\n    // Returns normalized (unit) version of the vector without modifying itself.\n    Vector4 Normalized() const                   \n\t{ \n\t\tT l = Length();\n\t\tOVR_ASSERT(l != T(0));\n\t\treturn *this / l; \n\t}\n};\n\ntypedef Vector4<float>  Vector4f;\ntypedef Vector4<double> Vector4d;\ntypedef Vector4<int>    Vector4i;\n\n\n//-------------------------------------------------------------------------------------\n// ***** Bounds3\n\n// Bounds class used to describe a 3D axis aligned bounding box.\n\ntemplate<class T>\nclass Bounds3\n{\npublic:\n\tVector3<T>\tb[2];\n\n\tBounds3()\n\t{\n\t}\n\n\tBounds3( const Vector3<T> & mins, const Vector3<T> & maxs )\n{\n\t\tb[0] = mins;\n\t\tb[1] = maxs;\n\t}\n\n\tvoid Clear()\n\t{\n\t\tb[0].x = b[0].y = b[0].z = Math<T>::MaxValue;\n\t\tb[1].x = b[1].y = b[1].z = -Math<T>::MaxValue;\n\t}\n\n\tvoid AddPoint( const Vector3<T> & v )\n\t{\n\t\tb[0].x = Alg::Min( b[0].x, v.x );\n\t\tb[0].y = Alg::Min( b[0].y, v.y );\n\t\tb[0].z = Alg::Min( b[0].z, v.z );\n\t\tb[1].x = Alg::Max( b[1].x, v.x );\n\t\tb[1].y = Alg::Max( b[1].y, v.y );\n\t\tb[1].z = Alg::Max( b[1].z, v.z );\n\t}\n\n\tconst Vector3<T> & GetMins() const { return b[0]; }\n\tconst Vector3<T> & GetMaxs() const { return b[1]; }\n\n\tVector3<T> & GetMins() { return b[0]; }\n\tVector3<T> & GetMaxs() { return b[1]; }\n};\n\ntypedef Bounds3<float>\tBounds3f;\ntypedef Bounds3<double>\tBounds3d;\n\n\n//-------------------------------------------------------------------------------------\n// ***** Size\n\n// Size class represents 2D size with Width, Height components.\n// Used to describe distentions of render targets, etc.\n\ntemplate<class T>\nclass Size\n{\npublic:\n    T   w, h;\n\n    Size()              : w(0), h(0)   { }\n    Size(T w_, T h_)    : w(w_), h(h_) { }\n    explicit Size(T s)  : w(s), h(s)   { }\n    explicit Size(const Size<typename Math<T>::OtherFloatType> &src)\n        : w((T)src.w), h((T)src.h) { }\n\n    // C-interop support.\n    typedef  typename CompatibleTypes<Size<T> >::Type CompatibleType;\n\n    Size(const CompatibleType& s) : w(s.w), h(s.h) {  }\n\n    operator const CompatibleType& () const\n    {\n        static_assert(sizeof(Size<T>) == sizeof(CompatibleType), \"sizeof(Size<T>) failure\");\n        return reinterpret_cast<const CompatibleType&>(*this);\n    }\n\n    bool     operator== (const Size& b) const  { return w == b.w && h == b.h; }\n    bool     operator!= (const Size& b) const  { return w != b.w || h != b.h; }\n             \n    Size  operator+  (const Size& b) const  { return Size(w + b.w, h + b.h); }\n    Size& operator+= (const Size& b)        { w += b.w; h += b.h; return *this; }\n    Size  operator-  (const Size& b) const  { return Size(w - b.w, h - b.h); }\n    Size& operator-= (const Size& b)        { w -= b.w; h -= b.h; return *this; }\n    Size  operator- () const                { return Size(-w, -h); }\n    Size  operator*  (const Size& b) const  { return Size(w * b.w, h * b.h); }\n    Size& operator*= (const Size& b)        { w *= b.w; h *= b.h; return *this; }\n    Size  operator/  (const Size& b) const  { return Size(w / b.w, h / b.h); }\n    Size& operator/= (const Size& b)        { w /= b.w; h /= b.h; return *this; }\n\n    // Scalar multiplication/division scales both components.\n    Size  operator*  (T s) const            { return Size(w*s, h*s); }\n    Size& operator*= (T s)                  { w *= s; h *= s; return *this; }    \n    Size  operator/  (T s) const            { return Size(w/s, h/s); }\n    Size& operator/= (T s)                  { w /= s; h /= s; return *this; }\n\n    static Size Min(const Size& a, const Size& b)  { return Size((a.w  < b.w)  ? a.w  : b.w,\n                                                                 (a.h < b.h) ? a.h : b.h); }\n    static Size Max(const Size& a, const Size& b)  { return Size((a.w  > b.w)  ? a.w  : b.w,\n                                                                 (a.h > b.h) ? a.h : b.h); }\n    \n    T       Area() const                    { return w * h; }\n\n    inline  Vector2<T> ToVector() const     { return Vector2<T>(w, h); }\n};\n\n\ntypedef Size<int>       Sizei;\ntypedef Size<unsigned>  Sizeu;\ntypedef Size<float>     Sizef;\ntypedef Size<double>    Sized;\n\n\n\n//-----------------------------------------------------------------------------------\n// ***** Rect\n\n// Rect describes a rectangular area for rendering, that includes position and size.\ntemplate<class T>\nclass Rect\n{\npublic:\n    T x, y;\n    T w, h;\n\n    Rect() { }\n    Rect(T x1, T y1, T w1, T h1)                   : x(x1), y(y1), w(w1), h(h1) { }    \n    Rect(const Vector2<T>& pos, const Size<T>& sz) : x(pos.x), y(pos.y), w(sz.w), h(sz.h) { }\n    Rect(const Size<T>& sz)                        : x(0), y(0), w(sz.w), h(sz.h) { }\n    \n    // C-interop support.\n    typedef  typename CompatibleTypes<Rect<T> >::Type CompatibleType;\n\n    Rect(const CompatibleType& s) : x(s.Pos.x), y(s.Pos.y), w(s.Size.w), h(s.Size.h) {  }\n\n    operator const CompatibleType& () const\n    {\n        static_assert(sizeof(Rect<T>) == sizeof(CompatibleType), \"sizeof(Rect<T>) failure\");\n        return reinterpret_cast<const CompatibleType&>(*this);\n    }\n\n    Vector2<T> GetPos() const                { return Vector2<T>(x, y); }\n    Size<T>    GetSize() const               { return Size<T>(w, h); }\n    void       SetPos(const Vector2<T>& pos) { x = pos.x; y = pos.y; }\n    void       SetSize(const Size<T>& sz)    { w = sz.w; h = sz.h; }\n\n    bool operator == (const Rect& vp) const\n    { return (x == vp.x) && (y == vp.y) && (w == vp.w) && (h == vp.h); }\n    bool operator != (const Rect& vp) const\n    { return !operator == (vp); }\n};\n\ntypedef Rect<int> Recti;\n\n\n//-------------------------------------------------------------------------------------//\n// ***** Quat\n//\n// Quatf represents a quaternion class used for rotations.\n// \n// Quaternion multiplications are done in right-to-left order, to match the\n// behavior of matrices.\n\n\ntemplate<class T>\nclass Quat\n{\npublic:\n    // w + Xi + Yj + Zk\n    T x, y, z, w;    \n\n    Quat() : x(0), y(0), z(0), w(1) { }\n    Quat(T x_, T y_, T z_, T w_) : x(x_), y(y_), z(z_), w(w_) { }\n    explicit Quat(const Quat<typename Math<T>::OtherFloatType> &src)\n        : x((T)src.x), y((T)src.y), z((T)src.z), w((T)src.w) { }\n\n    typedef  typename CompatibleTypes<Quat<T> >::Type CompatibleType;\n\n    // C-interop support.\n    Quat(const CompatibleType& s) : x(s.x), y(s.y), z(s.z), w(s.w) { }\n\n    operator CompatibleType () const\n    {\n        CompatibleType result;\n        result.x = x;\n        result.y = y;\n        result.z = z;\n        result.w = w;\n        return result;\n    }\n\n    // Constructs quaternion for rotation around the axis by an angle.\n    Quat(const Vector3<T>& axis, T angle)\n    {\n        // Make sure we don't divide by zero. \n        if (axis.LengthSq() == 0)\n        {\n            // Assert if the axis is zero, but the angle isn't\n            OVR_ASSERT(angle == 0);\n            x = 0; y = 0; z = 0; w = 1;\n            return;\n        }\n\n\t\tVector3<T> unitAxis = axis.Normalized();\n\t\tT          sinHalfAngle = sin(angle * T(0.5));\n\n\t\tw = cos(angle * T(0.5));\n\t\tx = unitAxis.x * sinHalfAngle;\n\t\ty = unitAxis.y * sinHalfAngle;\n\t\tz = unitAxis.z * sinHalfAngle;\n    }\n\n    // Constructs quaternion for rotation around one of the coordinate axis by an angle.\n    Quat(Axis A, T angle, RotateDirection d = Rotate_CCW, HandedSystem s = Handed_R)\n    {\n        T sinHalfAngle = s * d *sin(angle * T(0.5));\n        T v[3];\n        v[0] = v[1] = v[2] = T(0);\n        v[A] = sinHalfAngle;\n\n        w = cos(angle * T(0.5));\n        x = v[0];\n        y = v[1];\n        z = v[2];\n    }\n\n    // Compute axis and angle from quaternion\n    void GetAxisAngle(Vector3<T>* axis, T* angle) const\n    {\n\t\tif ( x*x + y*y + z*z > ((T)MATH_DOUBLE_TOLERANCE) * ((T)MATH_DOUBLE_TOLERANCE) ) {\n\t\t\t*axis  = Vector3<T>(x, y, z).Normalized();\n\t\t\t*angle = 2 * Acos(w);\n\t\t\tif (*angle > ((T)MATH_DOUBLE_PI)) // Reduce the magnitude of the angle, if necessary\n\t\t\t{\n\t\t\t\t*angle = ((T)MATH_DOUBLE_TWOPI) - *angle;\n\t\t\t\t*axis = *axis * (-1);\n\t\t\t}\n\t\t}\n\t\telse \n\t\t{\n\t\t\t*axis = Vector3<T>(1, 0, 0);\n\t\t\t*angle= 0;\n\t\t}\n    }\n\n    // Constructs the quaternion from a rotation matrix\n    explicit Quat(const Matrix4<T>& m)\n    {\n        T trace = m.M[0][0] + m.M[1][1] + m.M[2][2];\n\n        // In almost all cases, the first part is executed.\n        // However, if the trace is not positive, the other\n        // cases arise.\n        if (trace > T(0)) \n        {\n            T s = sqrt(trace + T(1)) * T(2); // s=4*qw\n            w = T(0.25) * s;\n            x = (m.M[2][1] - m.M[1][2]) / s;\n            y = (m.M[0][2] - m.M[2][0]) / s;\n            z = (m.M[1][0] - m.M[0][1]) / s; \n        } \n        else if ((m.M[0][0] > m.M[1][1])&&(m.M[0][0] > m.M[2][2])) \n        {\n            T s = sqrt(T(1) + m.M[0][0] - m.M[1][1] - m.M[2][2]) * T(2);\n            w = (m.M[2][1] - m.M[1][2]) / s;\n            x = T(0.25) * s;\n            y = (m.M[0][1] + m.M[1][0]) / s;\n            z = (m.M[2][0] + m.M[0][2]) / s;\n        } \n        else if (m.M[1][1] > m.M[2][2]) \n        {\n            T s = sqrt(T(1) + m.M[1][1] - m.M[0][0] - m.M[2][2]) * T(2); // S=4*qy\n            w = (m.M[0][2] - m.M[2][0]) / s;\n            x = (m.M[0][1] + m.M[1][0]) / s;\n            y = T(0.25) * s;\n            z = (m.M[1][2] + m.M[2][1]) / s;\n        } \n        else \n        {\n            T s = sqrt(T(1) + m.M[2][2] - m.M[0][0] - m.M[1][1]) * T(2); // S=4*qz\n            w = (m.M[1][0] - m.M[0][1]) / s;\n            x = (m.M[0][2] + m.M[2][0]) / s;\n            y = (m.M[1][2] + m.M[2][1]) / s;\n            z = T(0.25) * s;\n        }\n    }\n\n\t// Constructs the quaternion from a rotation matrix\n\texplicit Quat(const Matrix3<T>& m)\n\t{\n\t\tT trace = m.M[0][0] + m.M[1][1] + m.M[2][2];\n\n\t\t// In almost all cases, the first part is executed.\n\t\t// However, if the trace is not positive, the other\n\t\t// cases arise.\n\t\tif (trace > T(0)) \n\t\t{\n\t\t\tT s = sqrt(trace + T(1)) * T(2); // s=4*qw\n\t\t\tw = T(0.25) * s;\n\t\t\tx = (m.M[2][1] - m.M[1][2]) / s;\n\t\t\ty = (m.M[0][2] - m.M[2][0]) / s;\n\t\t\tz = (m.M[1][0] - m.M[0][1]) / s; \n\t\t} \n\t\telse if ((m.M[0][0] > m.M[1][1])&&(m.M[0][0] > m.M[2][2])) \n\t\t{\n\t\t\tT s = sqrt(T(1) + m.M[0][0] - m.M[1][1] - m.M[2][2]) * T(2);\n\t\t\tw = (m.M[2][1] - m.M[1][2]) / s;\n\t\t\tx = T(0.25) * s;\n\t\t\ty = (m.M[0][1] + m.M[1][0]) / s;\n\t\t\tz = (m.M[2][0] + m.M[0][2]) / s;\n\t\t} \n\t\telse if (m.M[1][1] > m.M[2][2]) \n\t\t{\n\t\t\tT s = sqrt(T(1) + m.M[1][1] - m.M[0][0] - m.M[2][2]) * T(2); // S=4*qy\n\t\t\tw = (m.M[0][2] - m.M[2][0]) / s;\n\t\t\tx = (m.M[0][1] + m.M[1][0]) / s;\n\t\t\ty = T(0.25) * s;\n\t\t\tz = (m.M[1][2] + m.M[2][1]) / s;\n\t\t} \n\t\telse \n\t\t{\n\t\t\tT s = sqrt(T(1) + m.M[2][2] - m.M[0][0] - m.M[1][1]) * T(2); // S=4*qz\n\t\t\tw = (m.M[1][0] - m.M[0][1]) / s;\n\t\t\tx = (m.M[0][2] + m.M[2][0]) / s;\n\t\t\ty = (m.M[1][2] + m.M[2][1]) / s;\n\t\t\tz = T(0.25) * s;\n\t\t}\n\t}\n\n    bool operator== (const Quat& b) const   { return x == b.x && y == b.y && z == b.z && w == b.w; }\n    bool operator!= (const Quat& b) const   { return x != b.x || y != b.y || z != b.z || w != b.w; }\n\n    Quat  operator+  (const Quat& b) const  { return Quat(x + b.x, y + b.y, z + b.z, w + b.w); }\n    Quat& operator+= (const Quat& b)        { w += b.w; x += b.x; y += b.y; z += b.z; return *this; }\n    Quat  operator-  (const Quat& b) const  { return Quat(x - b.x, y - b.y, z - b.z, w - b.w); }\n    Quat& operator-= (const Quat& b)        { w -= b.w; x -= b.x; y -= b.y; z -= b.z; return *this; }\n\n    Quat  operator*  (T s) const            { return Quat(x * s, y * s, z * s, w * s); }\n    Quat& operator*= (T s)                  { w *= s; x *= s; y *= s; z *= s; return *this; }\n    Quat  operator/  (T s) const            { T rcp = T(1)/s; return Quat(x * rcp, y * rcp, z * rcp, w *rcp); }\n    Quat& operator/= (T s)                  { T rcp = T(1)/s; w *= rcp; x *= rcp; y *= rcp; z *= rcp; return *this; }\n\n\n    // Get Imaginary part vector\n    Vector3<T> Imag() const                 { return Vector3<T>(x,y,z); }\n\n    // Get quaternion length.\n    T       Length() const                  { return sqrt(LengthSq()); }\n\n    // Get quaternion length squared.\n    T       LengthSq() const                { return (x * x + y * y + z * z + w * w); }\n\n    // Simple Euclidean distance in R^4 (not SLERP distance, but at least respects Haar measure)\n    T       Distance(const Quat& q) const\t\n\t{ \n        T d1 = (*this - q).Length();\n        T d2 = (*this + q).Length(); // Antipodal point check\n        return (d1 < d2) ? d1 : d2;\n\t}\n\n    T       DistanceSq(const Quat& q) const\n    {\n        T d1 = (*this - q).LengthSq();\n        T d2 = (*this + q).LengthSq(); // Antipodal point check\n        return (d1 < d2) ? d1 : d2;\n    }\n\n    T       Dot(const Quat& q) const\n    {\n        return x * q.x + y * q.y + z * q.z + w * q.w;\n    }\n\n\t// Angle between two quaternions in radians\n    T       Angle(const Quat& q) const\n\t{\n\t\treturn 2 * Acos(Alg::Abs(Dot(q)));\n\t}\n\n    // Normalize\n    bool    IsNormalized() const            { return fabs(LengthSq() - T(1)) < ((T)MATH_DOUBLE_TOLERANCE); }\n\n    void    Normalize()                     \n\t{\n \t\tT l = Length();\n\t\tOVR_ASSERT(l != T(0));\n\t\t*this /= l; \n\t}\n\n\tQuat    Normalized() const              \n\t{ \n\t\tT l = Length();\n\t\tOVR_ASSERT(l != T(0));\n\t\treturn *this / l; \n\t}\n\n    // Returns conjugate of the quaternion. Produces inverse rotation if quaternion is normalized.\n    Quat    Conj() const                    { return Quat(-x, -y, -z, w); }\n\n    // Quaternion multiplication. Combines quaternion rotations, performing the one on the \n    // right hand side first.\n    Quat  operator* (const Quat& b) const   { return Quat(w * b.x + x * b.w + y * b.z - z * b.y,\n                                                          w * b.y - x * b.z + y * b.w + z * b.x,\n                                                          w * b.z + x * b.y - y * b.x + z * b.w,\n                                                          w * b.w - x * b.x - y * b.y - z * b.z); }\n\n    // \n    // this^p normalized; same as rotating by this p times.\n    Quat PowNormalized(T p) const\n    {\n        Vector3<T> v;\n        T          a;\n        GetAxisAngle(&v, &a);\n        return Quat(v, a * p);\n    }\n\n    // Normalized linear interpolation of quaternions\n    Quat Nlerp(const Quat& other, T a)\n    {\n        T sign = (Dot(other) >= 0) ? 1 : -1;\n        return (*this * sign * a + other * (1-a)).Normalized();\n    }\n    \n    // Rotate transforms vector in a manner that matches Matrix rotations (counter-clockwise,\n    // assuming negative direction of the axis). Standard formula: q(t) * V * q(t)^-1. \n    Vector3<T> Rotate(const Vector3<T>& v) const\n    {\n        return ((*this * Quat<T>(v.x, v.y, v.z, T(0))) * Inverted()).Imag();\n    }\n    \n    // Inversed quaternion rotates in the opposite direction.\n    Quat        Inverted() const\n    {\n        return Quat(-x, -y, -z, w);\n    }\n\n    // Sets this quaternion to the one rotates in the opposite direction.\n    void        Invert()\n    {\n        *this = Quat(-x, -y, -z, w);\n    }\n    \n    // GetEulerAngles extracts Euler angles from the quaternion, in the specified order of\n    // axis rotations and the specified coordinate system. Right-handed coordinate system\n    // is the default, with CCW rotations while looking in the negative axis direction.\n    // Here a,b,c, are the Yaw/Pitch/Roll angles to be returned.\n    // rotation a around axis A1\n    // is followed by rotation b around axis A2\n    // is followed by rotation c around axis A3\n    // rotations are CCW or CW (D) in LH or RH coordinate system (S)\n\ttemplate <Axis A1, Axis A2, Axis A3, RotateDirection D, HandedSystem S>\n    void GetEulerAngles(T *a, T *b, T *c) const \n    {\n        static_assert((A1 != A2) && (A2 != A3) && (A1 != A3), \"(A1 != A2) && (A2 != A3) && (A1 != A3)\");\n\n        T Q[3] = { x, y, z };  //Quaternion components x,y,z\n\n        T ww  = w*w;\n        T Q11 = Q[A1]*Q[A1];\n        T Q22 = Q[A2]*Q[A2];\n        T Q33 = Q[A3]*Q[A3];\n\n        T psign = T(-1);\n        // Determine whether even permutation\n        if (((A1 + 1) % 3 == A2) && ((A2 + 1) % 3 == A3))\n            psign = T(1);\n        \n        T s2 = psign * T(2) * (psign*w*Q[A2] + Q[A1]*Q[A3]);\n\n        if (s2 < T(-1) + ((T)MATH_DOUBLE_SINGULARITYRADIUS))\n        { // South pole singularity\n            *a = T(0);\n            *b = -S*D*((T)MATH_DOUBLE_PIOVER2);\n            *c = S*D*atan2(T(2)*(psign*Q[A1]*Q[A2] + w*Q[A3]),\n\t\t                   ww + Q22 - Q11 - Q33 );\n        }\n        else if (s2 > T(1) - ((T)MATH_DOUBLE_SINGULARITYRADIUS))\n        {  // North pole singularity\n            *a = T(0);\n            *b = S*D*((T)MATH_DOUBLE_PIOVER2);\n            *c = S*D*atan2(T(2)*(psign*Q[A1]*Q[A2] + w*Q[A3]),\n\t\t                   ww + Q22 - Q11 - Q33);\n        }\n        else\n        {\n            *a = -S*D*atan2(T(-2)*(w*Q[A1] - psign*Q[A2]*Q[A3]),\n\t\t                    ww + Q33 - Q11 - Q22);\n            *b = S*D*asin(s2);\n            *c = S*D*atan2(T(2)*(w*Q[A3] - psign*Q[A1]*Q[A2]),\n\t\t                   ww + Q11 - Q22 - Q33);\n        }      \n        return;\n    }\n\n    template <Axis A1, Axis A2, Axis A3, RotateDirection D>\n    void GetEulerAngles(T *a, T *b, T *c) const\n    { GetEulerAngles<A1, A2, A3, D, Handed_R>(a, b, c); }\n\n    template <Axis A1, Axis A2, Axis A3>\n    void GetEulerAngles(T *a, T *b, T *c) const\n    { GetEulerAngles<A1, A2, A3, Rotate_CCW, Handed_R>(a, b, c); }\n\n    // GetEulerAnglesABA extracts Euler angles from the quaternion, in the specified order of\n    // axis rotations and the specified coordinate system. Right-handed coordinate system\n    // is the default, with CCW rotations while looking in the negative axis direction.\n    // Here a,b,c, are the Yaw/Pitch/Roll angles to be returned.\n    // rotation a around axis A1\n    // is followed by rotation b around axis A2\n    // is followed by rotation c around axis A1\n    // Rotations are CCW or CW (D) in LH or RH coordinate system (S)\n    template <Axis A1, Axis A2, RotateDirection D, HandedSystem S>\n    void GetEulerAnglesABA(T *a, T *b, T *c) const\n    {\n        static_assert(A1 != A2, \"A1 != A2\");\n\n        T Q[3] = {x, y, z}; // Quaternion components\n\n        // Determine the missing axis that was not supplied\n        int m = 3 - A1 - A2;\n\n        T ww = w*w;\n        T Q11 = Q[A1]*Q[A1];\n        T Q22 = Q[A2]*Q[A2];\n        T Qmm = Q[m]*Q[m];\n\n        T psign = T(-1);\n        if ((A1 + 1) % 3 == A2) // Determine whether even permutation\n        {\n            psign = T(1);\n        }\n\n        T c2 = ww + Q11 - Q22 - Qmm;\n        if (c2 < T(-1) + Math<T>::SingularityRadius)\n        { // South pole singularity\n            *a = T(0);\n            *b = S*D*((T)MATH_DOUBLE_PI);\n            *c = S*D*atan2( T(2)*(w*Q[A1] - psign*Q[A2]*Q[m]),\n\t\t                    ww + Q22 - Q11 - Qmm);\n        }\n        else if (c2 > T(1) - Math<T>::SingularityRadius)\n        {  // North pole singularity\n            *a = T(0);\n            *b = T(0);\n            *c = S*D*atan2( T(2)*(w*Q[A1] - psign*Q[A2]*Q[m]),\n\t\t                   ww + Q22 - Q11 - Qmm);\n        }\n        else\n        {\n            *a = S*D*atan2( psign*w*Q[m] + Q[A1]*Q[A2],\n\t\t                   w*Q[A2] -psign*Q[A1]*Q[m]);\n            *b = S*D*acos(c2);\n            *c = S*D*atan2( -psign*w*Q[m] + Q[A1]*Q[A2],\n\t\t                   w*Q[A2] + psign*Q[A1]*Q[m]);\n        }\n        return;\n    }\n};\n\ntypedef Quat<float>  Quatf;\ntypedef Quat<double> Quatd;\n\nstatic_assert((sizeof(Quatf) == 4*sizeof(float)), \"sizeof(Quatf) failure\");\nstatic_assert((sizeof(Quatd) == 4*sizeof(double)), \"sizeof(Quatd) failure\");\n\n//-------------------------------------------------------------------------------------\n// ***** Pose\n\n// Position and orientation combined.\n\ntemplate<class T>\nclass Pose\n{\npublic:\n    typedef typename CompatibleTypes<Pose<T> >::Type CompatibleType;\n\n    Pose() { }\n    Pose(const Quat<T>& orientation, const Vector3<T>& pos)\n        : Rotation(orientation), Translation(pos) {  }\n    Pose(const Pose& s)\n        : Rotation(s.Rotation), Translation(s.Translation) {  }\n    Pose(const CompatibleType& s)\n        : Rotation(s.Orientation), Translation(s.Position) {  }\n    explicit Pose(const Pose<typename Math<T>::OtherFloatType> &s)\n        : Rotation(s.Rotation), Translation(s.Translation) {  }\n\n    operator typename CompatibleTypes<Pose<T> >::Type () const\n    {\n        typename CompatibleTypes<Pose<T> >::Type result;\n        result.Orientation = Rotation;\n        result.Position = Translation;\n        return result;\n    }\n\n    Quat<T>    Rotation;\n    Vector3<T> Translation;\n    \n    static_assert((sizeof(T) == sizeof(double) || sizeof(T) == sizeof(float)), \"(sizeof(T) == sizeof(double) || sizeof(T) == sizeof(float))\");\n\n    void ToArray(T* arr) const\n    {\n        T temp[7] =  { Rotation.x, Rotation.y, Rotation.z, Rotation.w, Translation.x, Translation.y, Translation.z };\n        for (int i = 0; i < 7; i++) arr[i] = temp[i];\n    }\n\n    static Pose<T> FromArray(const T* v)\n    {\n        Quat<T> rotation(v[0], v[1], v[2], v[3]);\n        Vector3<T> translation(v[4], v[5], v[6]);\n        return Pose<T>(rotation, translation);\n    }\n\n    Vector3<T> Rotate(const Vector3<T>& v) const\n    {\n        return Rotation.Rotate(v);\n    }\n\n    Vector3<T> Translate(const Vector3<T>& v) const\n    {\n        return v + Translation;\n    }\n\n    Vector3<T> Apply(const Vector3<T>& v) const\n    {\n        return Translate(Rotate(v));\n    }\n\n    Pose operator*(const Pose& other) const   \n    {\n        return Pose(Rotation * other.Rotation, Apply(other.Translation));\n    }\n\n    Pose Inverted() const   \n    {\n        Quat<T> inv = Rotation.Inverted();\n        return Pose(inv, inv.Rotate(-Translation));\n    }\n};\n\ntypedef Pose<float>  Posef;\ntypedef Pose<double> Posed;\n\nstatic_assert((sizeof(Posed) == sizeof(Quatd) + sizeof(Vector3d)), \"sizeof(Posed) failure\");\nstatic_assert((sizeof(Posef) == sizeof(Quatf) + sizeof(Vector3f)), \"sizeof(Posef) failure\");\n    \n\n//-------------------------------------------------------------------------------------\n// ***** Matrix4\n//\n// Matrix4 is a 4x4 matrix used for 3d transformations and projections.\n// Translation stored in the last column.\n// The matrix is stored in row-major order in memory, meaning that values\n// of the first row are stored before the next one.\n//\n// The arrangement of the matrix is chosen to be in Right-Handed \n// coordinate system and counterclockwise rotations when looking down\n// the axis\n//\n// Transformation Order:\n//   - Transformations are applied from right to left, so the expression\n//     M1 * M2 * M3 * V means that the vector V is transformed by M3 first,\n//     followed by M2 and M1. \n//\n// Coordinate system: Right Handed\n//\n// Rotations: Counterclockwise when looking down the axis. All angles are in radians.\n//    \n//  | sx   01   02   tx |    // First column  (sx, 10, 20): Axis X basis vector.\n//  | 10   sy   12   ty |    // Second column (01, sy, 21): Axis Y basis vector.\n//  | 20   21   sz   tz |    // Third columnt (02, 12, sz): Axis Z basis vector.\n//  | 30   31   32   33 |\n//\n//  The basis vectors are first three columns.\n\ntemplate<class T>\nclass Matrix4\n{\n    static const Matrix4 IdentityValue;\n\npublic:\n    T M[4][4];    \n\n    enum NoInitType { NoInit };\n\n    // Construct with no memory initialization.\n    Matrix4(NoInitType) { }\n\n    // By default, we construct identity matrix.\n    Matrix4()\n    {\n        SetIdentity();        \n    }\n\n    Matrix4(T m11, T m12, T m13, T m14,\n            T m21, T m22, T m23, T m24,\n            T m31, T m32, T m33, T m34,\n            T m41, T m42, T m43, T m44)\n    {\n        M[0][0] = m11; M[0][1] = m12; M[0][2] = m13; M[0][3] = m14;\n        M[1][0] = m21; M[1][1] = m22; M[1][2] = m23; M[1][3] = m24;\n        M[2][0] = m31; M[2][1] = m32; M[2][2] = m33; M[2][3] = m34;\n        M[3][0] = m41; M[3][1] = m42; M[3][2] = m43; M[3][3] = m44;\n    }\n\n    Matrix4(T m11, T m12, T m13,\n            T m21, T m22, T m23,\n            T m31, T m32, T m33)\n    {\n        M[0][0] = m11; M[0][1] = m12; M[0][2] = m13; M[0][3] = 0;\n        M[1][0] = m21; M[1][1] = m22; M[1][2] = m23; M[1][3] = 0;\n        M[2][0] = m31; M[2][1] = m32; M[2][2] = m33; M[2][3] = 0;\n        M[3][0] = 0;   M[3][1] = 0;   M[3][2] = 0;   M[3][3] = 1;\n    }\n\n    explicit Matrix4(const Quat<T>& q)\n    {\n        T ww = q.w*q.w;\n        T xx = q.x*q.x;\n        T yy = q.y*q.y;\n        T zz = q.z*q.z;\n\n        M[0][0] = ww + xx - yy - zz;       M[0][1] = 2 * (q.x*q.y - q.w*q.z); M[0][2] = 2 * (q.x*q.z + q.w*q.y); M[0][3] = 0;\n        M[1][0] = 2 * (q.x*q.y + q.w*q.z); M[1][1] = ww - xx + yy - zz;       M[1][2] = 2 * (q.y*q.z - q.w*q.x); M[1][3] = 0;\n        M[2][0] = 2 * (q.x*q.z - q.w*q.y); M[2][1] = 2 * (q.y*q.z + q.w*q.x); M[2][2] = ww - xx - yy + zz;       M[2][3] = 0;\n        M[3][0] = 0;                       M[3][1] = 0;                       M[3][2] = 0;                       M[3][3] = 1;\n    }\n\n    explicit Matrix4(const Pose<T>& p)\n    {\n        Matrix4 result(p.Rotation);\n        result.SetTranslation(p.Translation);\n        *this = result;\n    }\n\n    // C-interop support\n    explicit Matrix4(const Matrix4<typename Math<T>::OtherFloatType> &src)\n    {\n        for (int i = 0; i < 4; i++)\n            for (int j = 0; j < 4; j++)\n                M[i][j] = (T)src.M[i][j];\n    }\n\n    // C-interop support.\n    Matrix4(const typename CompatibleTypes<Matrix4<T> >::Type& s) \n    {\n        static_assert(sizeof(s) == sizeof(Matrix4), \"sizeof(s) == sizeof(Matrix4)\");\n        memcpy(M, s.M, sizeof(M));\n    }\n\n    operator typename CompatibleTypes<Matrix4<T> >::Type () const\n    {\n        typename CompatibleTypes<Matrix4<T> >::Type result;\n        static_assert(sizeof(result) == sizeof(Matrix4), \"sizeof(result) == sizeof(Matrix4)\");\n        memcpy(result.M, M, sizeof(M));\n        return result;\n    }\n\n    void ToString(char* dest, size_t destsize) const\n    {\n        size_t pos = 0;\n        for (int r=0; r<4; r++)\n            for (int c=0; c<4; c++)\n                pos += OVR_sprintf(dest+pos, destsize-pos, \"%g \", M[r][c]);\n    }\n\n    static Matrix4 FromString(const char* src)\n    {\n        Matrix4 result;\n\t\tif (src)\n\t\t{\n        for (int r=0; r<4; r++)\n\t\t\t{\n            for (int c=0; c<4; c++)\n            {\n                result.M[r][c] = (T)atof(src);\n                while (src && *src != ' ')\n\t\t\t\t\t{\n                    src++;\n\t\t\t\t\t}\n                while (src && *src == ' ')\n\t\t\t\t\t{\n                    src++;\n            }\n\t\t\t\t}\n\t\t\t}\n\t\t}\n        return result;\n    }\n\n    static const Matrix4& Identity()  { return IdentityValue; }\n\n    void SetIdentity()\n    {\n        M[0][0] = M[1][1] = M[2][2] = M[3][3] = 1;\n        M[0][1] = M[1][0] = M[2][3] = M[3][1] = 0;\n        M[0][2] = M[1][2] = M[2][0] = M[3][2] = 0;\n        M[0][3] = M[1][3] = M[2][1] = M[3][0] = 0;\n    }\n\n\tvoid SetXBasis(const Vector3f & v)\n\t{\n\t\tM[0][0] = v.x;\n\t\tM[1][0] = v.y;\n\t\tM[2][0] = v.z;\n\t}\n\tVector3f GetXBasis() const\n\t{\n\t\treturn Vector3f(M[0][0], M[1][0], M[2][0]);\n\t}\n\n\tvoid SetYBasis(const Vector3f & v)\n\t{\n\t\tM[0][1] = v.x;\n\t\tM[1][1] = v.y;\n\t\tM[2][1] = v.z;\n\t}\n\tVector3f GetYBasis() const\n\t{\n\t\treturn Vector3f(M[0][1], M[1][1], M[2][1]);\n\t}\n\n\tvoid SetZBasis(const Vector3f & v)\n\t{\n\t\tM[0][2] = v.x;\n\t\tM[1][2] = v.y;\n\t\tM[2][2] = v.z;\n\t}\n\tVector3f GetZBasis() const\n\t{\n\t\treturn Vector3f(M[0][2], M[1][2], M[2][2]);\n\t}\n\n\tbool operator== (const Matrix4& b) const\n\t{\n\t\tbool isEqual = true;\n        for (int i = 0; i < 4; i++)\n            for (int j = 0; j < 4; j++)\n                isEqual &= (M[i][j] == b.M[i][j]);\n\n\t\treturn isEqual;\n\t}\n\n    Matrix4 operator+ (const Matrix4& b) const\n    {\n        Matrix4 result(*this);\n        result += b;\n        return result;\n    }\n\n    Matrix4& operator+= (const Matrix4& b)\n    {\n        for (int i = 0; i < 4; i++)\n            for (int j = 0; j < 4; j++)\n                M[i][j] += b.M[i][j];\n        return *this;\n    }\n\n    Matrix4 operator- (const Matrix4& b) const\n    {\n        Matrix4 result(*this);\n        result -= b;\n        return result;\n    }\n\n    Matrix4& operator-= (const Matrix4& b)\n    {\n        for (int i = 0; i < 4; i++)\n            for (int j = 0; j < 4; j++)\n                M[i][j] -= b.M[i][j];\n        return *this;\n    }\n\n    // Multiplies two matrices into destination with minimum copying.\n    static Matrix4& Multiply(Matrix4* d, const Matrix4& a, const Matrix4& b)\n    {\n        OVR_ASSERT((d != &a) && (d != &b));\n        int i = 0;\n        do {\n            d->M[i][0] = a.M[i][0] * b.M[0][0] + a.M[i][1] * b.M[1][0] + a.M[i][2] * b.M[2][0] + a.M[i][3] * b.M[3][0];\n            d->M[i][1] = a.M[i][0] * b.M[0][1] + a.M[i][1] * b.M[1][1] + a.M[i][2] * b.M[2][1] + a.M[i][3] * b.M[3][1];\n            d->M[i][2] = a.M[i][0] * b.M[0][2] + a.M[i][1] * b.M[1][2] + a.M[i][2] * b.M[2][2] + a.M[i][3] * b.M[3][2];\n            d->M[i][3] = a.M[i][0] * b.M[0][3] + a.M[i][1] * b.M[1][3] + a.M[i][2] * b.M[2][3] + a.M[i][3] * b.M[3][3];\n        } while((++i) < 4);\n\n        return *d;\n    }\n\n    Matrix4 operator* (const Matrix4& b) const\n    {\n        Matrix4 result(Matrix4::NoInit);\n        Multiply(&result, *this, b);\n        return result;\n    }\n\n    Matrix4& operator*= (const Matrix4& b)\n    {\n        return Multiply(this, Matrix4(*this), b);\n    }\n\n    Matrix4 operator* (T s) const\n    {\n        Matrix4 result(*this);\n        result *= s;\n        return result;\n    }\n\n    Matrix4& operator*= (T s)\n    {\n        for (int i = 0; i < 4; i++)\n            for (int j = 0; j < 4; j++)\n                M[i][j] *= s;\n        return *this;\n    }\n\n\n    Matrix4 operator/ (T s) const\n    {\n        Matrix4 result(*this);\n        result /= s;\n        return result;\n    }\n\n    Matrix4& operator/= (T s)\n    {\n        for (int i = 0; i < 4; i++)\n            for (int j = 0; j < 4; j++)\n                M[i][j] /= s;\n        return *this;\n    }\n\n    Vector3<T> Transform(const Vector3<T>& v) const\n    {\n\t\tconst T rcpW = 1.0f / (M[3][0] * v.x + M[3][1] * v.y + M[3][2] * v.z + M[3][3]);\n\t\treturn Vector3<T>((M[0][0] * v.x + M[0][1] * v.y + M[0][2] * v.z + M[0][3]) * rcpW,\n\t\t\t\t\t\t  (M[1][0] * v.x + M[1][1] * v.y + M[1][2] * v.z + M[1][3]) * rcpW,\n\t\t\t\t\t\t  (M[2][0] * v.x + M[2][1] * v.y + M[2][2] * v.z + M[2][3]) * rcpW);\n\t}\n\n\tVector4<T> Transform(const Vector4<T>& v) const\n\t{\n\t\treturn Vector4<T>(M[0][0] * v.x + M[0][1] * v.y + M[0][2] * v.z + M[0][3] * v.w,\n\t\t\t\t\t\t  M[1][0] * v.x + M[1][1] * v.y + M[1][2] * v.z + M[1][3] * v.w,\n\t\t\t\t\t\t  M[2][0] * v.x + M[2][1] * v.y + M[2][2] * v.z + M[2][3] * v.w,\n\t\t\t\t\t\t  M[3][0] * v.x + M[3][1] * v.y + M[3][2] * v.z + M[3][3] * v.w);\n    }\n\n    Matrix4 Transposed() const\n    {\n        return Matrix4(M[0][0], M[1][0], M[2][0], M[3][0],\n                        M[0][1], M[1][1], M[2][1], M[3][1],\n                        M[0][2], M[1][2], M[2][2], M[3][2],\n                        M[0][3], M[1][3], M[2][3], M[3][3]);\n    }\n\n    void     Transpose()\n    {\n        *this = Transposed();\n    }\n\n\n    T SubDet (const size_t* rows, const size_t* cols) const\n    {\n        return M[rows[0]][cols[0]] * (M[rows[1]][cols[1]] * M[rows[2]][cols[2]] - M[rows[1]][cols[2]] * M[rows[2]][cols[1]])\n             - M[rows[0]][cols[1]] * (M[rows[1]][cols[0]] * M[rows[2]][cols[2]] - M[rows[1]][cols[2]] * M[rows[2]][cols[0]])\n             + M[rows[0]][cols[2]] * (M[rows[1]][cols[0]] * M[rows[2]][cols[1]] - M[rows[1]][cols[1]] * M[rows[2]][cols[0]]);\n    }\n\n    T Cofactor(size_t I, size_t J) const\n    {\n        const size_t indices[4][3] = {{1,2,3},{0,2,3},{0,1,3},{0,1,2}};\n        return ((I+J)&1) ? -SubDet(indices[I],indices[J]) : SubDet(indices[I],indices[J]);\n    }\n\n    T    Determinant() const\n    {\n        return M[0][0] * Cofactor(0,0) + M[0][1] * Cofactor(0,1) + M[0][2] * Cofactor(0,2) + M[0][3] * Cofactor(0,3);\n    }\n\n    Matrix4 Adjugated() const\n    {\n        return Matrix4(Cofactor(0,0), Cofactor(1,0), Cofactor(2,0), Cofactor(3,0), \n                        Cofactor(0,1), Cofactor(1,1), Cofactor(2,1), Cofactor(3,1), \n                        Cofactor(0,2), Cofactor(1,2), Cofactor(2,2), Cofactor(3,2),\n                        Cofactor(0,3), Cofactor(1,3), Cofactor(2,3), Cofactor(3,3));\n    }\n\n    Matrix4 Inverted() const\n    {\n        T det = Determinant();\n        assert(det != 0);\n        return Adjugated() * (1.0f/det);\n    }\n\n    void Invert()\n    {\n        *this = Inverted();\n    }\n\n\t// This is more efficient than general inverse, but ONLY works\n\t// correctly if it is a homogeneous transform matrix (rot + trans)\n\tMatrix4 InvertedHomogeneousTransform() const\n\t{\n\t\t// Make the inverse rotation matrix\n\t\tMatrix4 rinv = this->Transposed();\n\t\trinv.M[3][0] = rinv.M[3][1] = rinv.M[3][2] = 0.0f;\n\t\t// Make the inverse translation matrix\n\t\tVector3<T> tvinv(-M[0][3],-M[1][3],-M[2][3]);\n\t\tMatrix4 tinv = Matrix4::Translation(tvinv);\n\t\treturn rinv * tinv;  // \"untranslate\", then \"unrotate\"\n\t}\n\n\t// This is more efficient than general inverse, but ONLY works\n\t// correctly if it is a homogeneous transform matrix (rot + trans)\n\tvoid InvertHomogeneousTransform()\n\t{\n        *this = InvertedHomogeneousTransform();\n\t}\n\n\t// Matrix to Euler Angles conversion\n    // a,b,c, are the YawPitchRoll angles to be returned\n    // rotation a around axis A1\n    // is followed by rotation b around axis A2\n    // is followed by rotation c around axis A3\n    // rotations are CCW or CW (D) in LH or RH coordinate system (S)\n    template <Axis A1, Axis A2, Axis A3, RotateDirection D, HandedSystem S>\n    void ToEulerAngles(T *a, T *b, T *c) const\n    {\n        static_assert((A1 != A2) && (A2 != A3) && (A1 != A3), \"(A1 != A2) && (A2 != A3) && (A1 != A3)\");\n\n        T psign = -1;\n        if (((A1 + 1) % 3 == A2) && ((A2 + 1) % 3 == A3)) // Determine whether even permutation\n        psign = 1;\n        \n        T pm = psign*M[A1][A3];\n        if (pm < -1.0f + Math<T>::SingularityRadius)\n        { // South pole singularity\n            *a = 0;\n            *b = -S*D*((T)MATH_DOUBLE_PIOVER2);\n            *c = S*D*atan2( psign*M[A2][A1], M[A2][A2] );\n        }\n        else if (pm > 1.0f - Math<T>::SingularityRadius)\n        { // North pole singularity\n            *a = 0;\n            *b = S*D*((T)MATH_DOUBLE_PIOVER2);\n            *c = S*D*atan2( psign*M[A2][A1], M[A2][A2] );\n        }\n        else\n        { // Normal case (nonsingular)\n            *a = S*D*atan2( -psign*M[A2][A3], M[A3][A3] );\n            *b = S*D*asin(pm);\n            *c = S*D*atan2( -psign*M[A1][A2], M[A1][A1] );\n        }\n\n        return;\n    }\n\n\t// Matrix to Euler Angles conversion\n    // a,b,c, are the YawPitchRoll angles to be returned\n    // rotation a around axis A1\n    // is followed by rotation b around axis A2\n    // is followed by rotation c around axis A1\n    // rotations are CCW or CW (D) in LH or RH coordinate system (S)\n    template <Axis A1, Axis A2, RotateDirection D, HandedSystem S>\n    void ToEulerAnglesABA(T *a, T *b, T *c) const\n    {        \n         static_assert(A1 != A2, \"A1 != A2\");\n  \n        // Determine the axis that was not supplied\n        int m = 3 - A1 - A2;\n\n        T psign = -1;\n        if ((A1 + 1) % 3 == A2) // Determine whether even permutation\n            psign = 1.0f;\n\n        T c2 = M[A1][A1];\n        if (c2 < -1 + Math<T>::SingularityRadius)\n        { // South pole singularity\n            *a = 0;\n            *b = S*D*((T)MATH_DOUBLE_PI);\n            *c = S*D*atan2( -psign*M[A2][m],M[A2][A2]);\n        }\n        else if (c2 > 1.0f - Math<T>::SingularityRadius)\n        { // North pole singularity\n            *a = 0;\n            *b = 0;\n            *c = S*D*atan2( -psign*M[A2][m],M[A2][A2]);\n        }\n        else\n        { // Normal case (nonsingular)\n            *a = S*D*atan2( M[A2][A1],-psign*M[m][A1]);\n            *b = S*D*acos(c2);\n            *c = S*D*atan2( M[A1][A2],psign*M[A1][m]);\n        }\n        return;\n    }\n  \n    // Creates a matrix that converts the vertices from one coordinate system\n    // to another.\n    static Matrix4 AxisConversion(const WorldAxes& to, const WorldAxes& from)\n    {        \n        // Holds axis values from the 'to' structure\n        int toArray[3] = { to.XAxis, to.YAxis, to.ZAxis };\n\n        // The inverse of the toArray\n        int inv[4]; \n        inv[0] = inv[abs(to.XAxis)] = 0;\n        inv[abs(to.YAxis)] = 1;\n        inv[abs(to.ZAxis)] = 2;\n\n        Matrix4 m(0,  0,  0, \n                  0,  0,  0,\n                  0,  0,  0);\n\n        // Only three values in the matrix need to be changed to 1 or -1.\n        m.M[inv[abs(from.XAxis)]][0] = T(from.XAxis/toArray[inv[abs(from.XAxis)]]);\n        m.M[inv[abs(from.YAxis)]][1] = T(from.YAxis/toArray[inv[abs(from.YAxis)]]);\n        m.M[inv[abs(from.ZAxis)]][2] = T(from.ZAxis/toArray[inv[abs(from.ZAxis)]]);\n        return m;\n    } \n\n\n\t// Creates a matrix for translation by vector\n    static Matrix4 Translation(const Vector3<T>& v)\n    {\n        Matrix4 t;\n        t.M[0][3] = v.x;\n        t.M[1][3] = v.y;\n        t.M[2][3] = v.z;\n        return t;\n    }\n\n\t// Creates a matrix for translation by vector\n    static Matrix4 Translation(T x, T y, T z = 0.0f)\n    {\n        Matrix4 t;\n        t.M[0][3] = x;\n        t.M[1][3] = y;\n        t.M[2][3] = z;\n        return t;\n    }\n\n\t// Sets the translation part\n    void SetTranslation(const Vector3<T>& v)\n    {\n        M[0][3] = v.x;\n        M[1][3] = v.y;\n        M[2][3] = v.z;\n    }\n\n    Vector3<T> GetTranslation() const\n    {\n        return Vector3<T>( M[0][3], M[1][3], M[2][3] );\n    }\n\n\t// Creates a matrix for scaling by vector\n    static Matrix4 Scaling(const Vector3<T>& v)\n    {\n        Matrix4 t;\n        t.M[0][0] = v.x;\n        t.M[1][1] = v.y;\n        t.M[2][2] = v.z;\n        return t;\n    }\n\n\t// Creates a matrix for scaling by vector\n    static Matrix4 Scaling(T x, T y, T z)\n    {\n        Matrix4 t;\n        t.M[0][0] = x;\n        t.M[1][1] = y;\n        t.M[2][2] = z;\n        return t;\n    }\n\n\t// Creates a matrix for scaling by constant\n    static Matrix4 Scaling(T s)\n    {\n        Matrix4 t;\n        t.M[0][0] = s;\n        t.M[1][1] = s;\n        t.M[2][2] = s;\n        return t;\n    }\n\n    // Simple L1 distance in R^12\n\tT Distance(const Matrix4& m2) const           \n\t{ \n\t\tT d = fabs(M[0][0] - m2.M[0][0]) + fabs(M[0][1] - m2.M[0][1]);\n\t\td += fabs(M[0][2] - m2.M[0][2]) + fabs(M[0][3] - m2.M[0][3]);\n\t\td += fabs(M[1][0] - m2.M[1][0]) + fabs(M[1][1] - m2.M[1][1]);\n\t\td += fabs(M[1][2] - m2.M[1][2]) + fabs(M[1][3] - m2.M[1][3]);\n\t\td += fabs(M[2][0] - m2.M[2][0]) + fabs(M[2][1] - m2.M[2][1]);\n\t\td += fabs(M[2][2] - m2.M[2][2]) + fabs(M[2][3] - m2.M[2][3]);\n\t\td += fabs(M[3][0] - m2.M[3][0]) + fabs(M[3][1] - m2.M[3][1]);\n\t\td += fabs(M[3][2] - m2.M[3][2]) + fabs(M[3][3] - m2.M[3][3]);\n\t\treturn d; \n\t}\n\n    // Creates a rotation matrix rotating around the X axis by 'angle' radians.\n    // Just for quick testing.  Not for final API.  Need to remove case.\n    static Matrix4 RotationAxis(Axis A, T angle, RotateDirection d, HandedSystem s)\n    {\n        T sina = s * d *sin(angle);\n        T cosa = cos(angle);\n        \n        switch(A)\n        {\n        case Axis_X:\n            return Matrix4(1,  0,     0, \n                           0,  cosa,  -sina,\n                           0,  sina,  cosa);\n        case Axis_Y:\n            return Matrix4(cosa,  0,   sina, \n                           0,     1,   0,\n                           -sina, 0,   cosa);\n        case Axis_Z:\n            return Matrix4(cosa,  -sina,  0, \n                           sina,  cosa,   0,\n                           0,     0,      1);\n        }\n    }\n\n\n    // Creates a rotation matrix rotating around the X axis by 'angle' radians.\n    // Rotation direction is depends on the coordinate system:\n    // RHS (Oculus default): Positive angle values rotate Counter-clockwise (CCW),\n    //                        while looking in the negative axis direction. This is the\n    //                        same as looking down from positive axis values towards origin.\n    // LHS: Positive angle values rotate clock-wise (CW), while looking in the\n    //       negative axis direction.\n    static Matrix4 RotationX(T angle)\n    {\n        T sina = sin(angle);\n        T cosa = cos(angle);\n        return Matrix4(1,  0,     0, \n                       0,  cosa,  -sina,\n                       0,  sina,  cosa);\n    }\n\n    // Creates a rotation matrix rotating around the Y axis by 'angle' radians.\n    // Rotation direction is depends on the coordinate system:\n    //  RHS (Oculus default): Positive angle values rotate Counter-clockwise (CCW),\n    //                        while looking in the negative axis direction. This is the\n    //                        same as looking down from positive axis values towards origin.\n    //  LHS: Positive angle values rotate clock-wise (CW), while looking in the\n    //       negative axis direction.\n    static Matrix4 RotationY(T angle)\n    {\n        T sina = sin(angle);\n        T cosa = cos(angle);\n        return Matrix4(cosa,  0,   sina, \n                       0,     1,   0,\n                       -sina, 0,   cosa);\n    }\n\n    // Creates a rotation matrix rotating around the Z axis by 'angle' radians.\n    // Rotation direction is depends on the coordinate system:\n    //  RHS (Oculus default): Positive angle values rotate Counter-clockwise (CCW),\n    //                        while looking in the negative axis direction. This is the\n    //                        same as looking down from positive axis values towards origin.\n    //  LHS: Positive angle values rotate clock-wise (CW), while looking in the\n    //       negative axis direction.\n    static Matrix4 RotationZ(T angle)\n    {\n        T sina = sin(angle);\n        T cosa = cos(angle);\n        return Matrix4(cosa,  -sina,  0, \n                       sina,  cosa,   0,\n                       0,     0,      1);\n    }\n\n    // LookAtRH creates a View transformation matrix for right-handed coordinate system.\n    // The resulting matrix points camera from 'eye' towards 'at' direction, with 'up'\n    // specifying the up vector. The resulting matrix should be used with PerspectiveRH\n    // projection.\n    static Matrix4 LookAtRH(const Vector3<T>& eye, const Vector3<T>& at, const Vector3<T>& up)\n    {\n        Vector3<T> z = (eye - at).Normalized();  // Forward\n        Vector3<T> x = up.Cross(z).Normalized(); // Right\n        Vector3<T> y = z.Cross(x);\n\n        Matrix4 m(x.x,  x.y,  x.z,  -(x.Dot(eye)),\n                  y.x,  y.y,  y.z,  -(y.Dot(eye)),\n                  z.x,  z.y,  z.z,  -(z.Dot(eye)),\n                  0,    0,    0,    1 );\n        return m;\n    }\n    \n    // LookAtLH creates a View transformation matrix for left-handed coordinate system.\n    // The resulting matrix points camera from 'eye' towards 'at' direction, with 'up'\n    // specifying the up vector. \n    static Matrix4 LookAtLH(const Vector3<T>& eye, const Vector3<T>& at, const Vector3<T>& up)\n    {\n        Vector3<T> z = (at - eye).Normalized();  // Forward\n        Vector3<T> x = up.Cross(z).Normalized(); // Right\n        Vector3<T> y = z.Cross(x);\n\n        Matrix4 m(x.x,  x.y,  x.z,  -(x.Dot(eye)),\n                  y.x,  y.y,  y.z,  -(y.Dot(eye)),\n                  z.x,  z.y,  z.z,  -(z.Dot(eye)),\n                  0,    0,    0,    1 ); \n        return m;\n    }\n    \n    // PerspectiveRH creates a right-handed perspective projection matrix that can be\n    // used with the Oculus sample renderer. \n    //  yfov   - Specifies vertical field of view in radians.\n    //  aspect - Screen aspect ration, which is usually width/height for square pixels.\n    //           Note that xfov = yfov * aspect.\n    //  znear  - Absolute value of near Z clipping clipping range.\n    //  zfar   - Absolute value of far  Z clipping clipping range (larger then near).\n    // Even though RHS usually looks in the direction of negative Z, positive values\n    // are expected for znear and zfar.\n    static Matrix4 PerspectiveRH(T yfov, T aspect, T znear, T zfar)\n    {\n        Matrix4 m;\n        T tanHalfFov = tan(yfov * 0.5f);\n\n        m.M[0][0] = 1. / (aspect * tanHalfFov);\n        m.M[1][1] = 1. / tanHalfFov;\n        m.M[2][2] = zfar / (znear - zfar);\n        m.M[3][2] = -1.;\n        m.M[2][3] = (zfar * znear) / (znear - zfar);\n        m.M[3][3] = 0.;\n\n        // Note: Post-projection matrix result assumes Left-Handed coordinate system,\n        //       with Y up, X right and Z forward. This supports positive z-buffer values.\n\t\t// This is the case even for RHS coordinate input.\n        return m;\n    }\n    \n    // PerspectiveLH creates a left-handed perspective projection matrix that can be\n    // used with the Oculus sample renderer. \n    //  yfov   - Specifies vertical field of view in radians.\n    //  aspect - Screen aspect ration, which is usually width/height for square pixels.\n    //           Note that xfov = yfov * aspect.\n    //  znear  - Absolute value of near Z clipping clipping range.\n    //  zfar   - Absolute value of far  Z clipping clipping range (larger then near).\n    static Matrix4 PerspectiveLH(T yfov, T aspect, T znear, T zfar)\n    {\n        Matrix4 m;\n        T tanHalfFov = tan(yfov * 0.5f);\n\n        m.M[0][0] = 1. / (aspect * tanHalfFov);\n        m.M[1][1] = 1. / tanHalfFov;\n        //m.M[2][2] = zfar / (znear - zfar);\n         m.M[2][2] = zfar / (zfar - znear);\n        m.M[3][2] = -1.;\n        m.M[2][3] = (zfar * znear) / (znear - zfar);\n        m.M[3][3] = 0.;\n\n        // Note: Post-projection matrix result assumes Left-Handed coordinate system,    \n        //       with Y up, X right and Z forward. This supports positive z-buffer values.\n        // This is the case even for RHS coordinate input. \n        return m;\n    }\n\n    static Matrix4 Ortho2D(T w, T h)\n    {\n        Matrix4 m;\n        m.M[0][0] = 2.0/w;\n        m.M[1][1] = -2.0/h;\n        m.M[0][3] = -1.0;\n        m.M[1][3] = 1.0;\n        m.M[2][2] = 0;\n        return m;\n    }\n};\n\ntypedef Matrix4<float>  Matrix4f;\ntypedef Matrix4<double> Matrix4d;\n\n//-------------------------------------------------------------------------------------\n// ***** Matrix3\n//\n// Matrix3 is a 3x3 matrix used for representing a rotation matrix.\n// The matrix is stored in row-major order in memory, meaning that values\n// of the first row are stored before the next one.\n//\n// The arrangement of the matrix is chosen to be in Right-Handed \n// coordinate system and counterclockwise rotations when looking down\n// the axis\n//\n// Transformation Order:\n//   - Transformations are applied from right to left, so the expression\n//     M1 * M2 * M3 * V means that the vector V is transformed by M3 first,\n//     followed by M2 and M1. \n//\n// Coordinate system: Right Handed\n//\n// Rotations: Counterclockwise when looking down the axis. All angles are in radians.\n\ntemplate<typename T>\nclass SymMat3;\n\ntemplate<class T>\nclass Matrix3\n{\n\tstatic const Matrix3 IdentityValue;\n\npublic:\n\tT M[3][3];    \n\n\tenum NoInitType { NoInit };\n\n\t// Construct with no memory initialization.\n\tMatrix3(NoInitType) { }\n\n\t// By default, we construct identity matrix.\n\tMatrix3()\n\t{\n\t\tSetIdentity();        \n\t}\n\n\tMatrix3(T m11, T m12, T m13,\n\t\t\tT m21, T m22, T m23,\n\t\t\tT m31, T m32, T m33)\n\t{\n\t\tM[0][0] = m11; M[0][1] = m12; M[0][2] = m13;\n\t\tM[1][0] = m21; M[1][1] = m22; M[1][2] = m23;\n\t\tM[2][0] = m31; M[2][1] = m32; M[2][2] = m33;\n\t}\n\t\n\t/*\n\texplicit Matrix3(const Quat<T>& q)\n\t{\n\t\tT ww = q.w*q.w;\n\t\tT xx = q.x*q.x;\n\t\tT yy = q.y*q.y;\n\t\tT zz = q.z*q.z;\n\n\t\tM[0][0] = ww + xx - yy - zz;       M[0][1] = 2 * (q.x*q.y - q.w*q.z); M[0][2] = 2 * (q.x*q.z + q.w*q.y);\n\t\tM[1][0] = 2 * (q.x*q.y + q.w*q.z); M[1][1] = ww - xx + yy - zz;       M[1][2] = 2 * (q.y*q.z - q.w*q.x);\n\t\tM[2][0] = 2 * (q.x*q.z - q.w*q.y); M[2][1] = 2 * (q.y*q.z + q.w*q.x); M[2][2] = ww - xx - yy + zz;      \n\t}\n\t*/\n\t\n\texplicit Matrix3(const Quat<T>& q)\n\t{\n\t\tconst T tx  = q.x+q.x,  ty  = q.y+q.y,  tz  = q.z+q.z;\n\t\tconst T twx = q.w*tx,   twy = q.w*ty,   twz = q.w*tz;\n\t\tconst T txx = q.x*tx,   txy = q.x*ty,   txz = q.x*tz;\n\t\tconst T tyy = q.y*ty,   tyz = q.y*tz,   tzz = q.z*tz;\n\t\tM[0][0] = T(1) - (tyy + tzz);\tM[0][1] = txy - twz;\t\t\tM[0][2] = txz + twy;\n\t\tM[1][0] = txy + twz;\t\t\tM[1][1] = T(1) - (txx + tzz);\tM[1][2] = tyz - twx;\n\t\tM[2][0] = txz - twy;\t\t\tM[2][1] = tyz + twx;\t\t\tM[2][2] = T(1) - (txx + tyy);\n\t}\n\t\n\tinline explicit Matrix3(T s)\n    {\n        M[0][0] = M[1][1] = M[2][2] = s;\n        M[0][1] = M[0][2] = M[1][0] = M[1][2] = M[2][0] = M[2][1] = 0;\n    }\n\n\texplicit Matrix3(const Pose<T>& p)\n\t{\n\t\tMatrix3 result(p.Rotation);\n\t\tresult.SetTranslation(p.Translation);\n\t\t*this = result;\n\t}\n\n\t// C-interop support\n\texplicit Matrix3(const Matrix4<typename Math<T>::OtherFloatType> &src)\n\t{\n\t\tfor (int i = 0; i < 3; i++)\n\t\t\tfor (int j = 0; j < 3; j++)\n\t\t\t\tM[i][j] = (T)src.M[i][j];\n\t}\n\n\t// C-interop support.\n\tMatrix3(const typename CompatibleTypes<Matrix3<T> >::Type& s) \n\t{\n\t\tstatic_assert(sizeof(s) == sizeof(Matrix3), \"sizeof(s) == sizeof(Matrix3)\");\n\t\tmemcpy(M, s.M, sizeof(M));\n\t}\n\n\toperator const typename CompatibleTypes<Matrix3<T> >::Type () const\n\t{\n\t\ttypename CompatibleTypes<Matrix3<T> >::Type result;\n\t\tstatic_assert(sizeof(result) == sizeof(Matrix3), \"sizeof(result) == sizeof(Matrix3)\");\n\t\tmemcpy(result.M, M, sizeof(M));\n\t\treturn result;\n\t}\n\n\tvoid ToString(char* dest, size_t destsize) const\n\t{\n\t\tsize_t pos = 0;\n\t\tfor (int r=0; r<3; r++)\n\t\t\tfor (int c=0; c<3; c++)\n\t\t\t\tpos += OVR_sprintf(dest+pos, destsize-pos, \"%g \", M[r][c]);\n\t}\n\n\tstatic Matrix3 FromString(const char* src)\n\t{\n\t\tMatrix3 result;\n\t\tfor (int r=0; r<3; r++)\n\t\t\tfor (int c=0; c<3; c++)\n\t\t\t{\n\t\t\t\tresult.M[r][c] = (T)atof(src);\n\t\t\t\twhile (src && *src != ' ')\n\t\t\t\t\tsrc++;\n\t\t\t\twhile (src && *src == ' ')\n\t\t\t\t\tsrc++;\n\t\t\t}\n\t\t\treturn result;\n\t}\n\n\tstatic const Matrix3& Identity()  { return IdentityValue; }\n\n\tvoid SetIdentity()\n\t{\n\t\tM[0][0] = M[1][1] = M[2][2] = 1;\n\t\tM[0][1] = M[1][0] = M[2][0] = 0;\n\t\tM[0][2] = M[1][2] = M[2][1] = 0;\n\t}\n\n\tbool operator== (const Matrix3& b) const\n\t{\n\t\tbool isEqual = true;\n\t\tfor (int i = 0; i < 3; i++)\n\t\t\tfor (int j = 0; j < 3; j++)\n\t\t\t\tisEqual &= (M[i][j] == b.M[i][j]);\n\n\t\treturn isEqual;\n\t}\n\n\tMatrix3 operator+ (const Matrix3& b) const\n\t{\n        Matrix4<T> result(*this);\n\t\tresult += b;\n\t\treturn result;\n\t}\n\n\tMatrix3& operator+= (const Matrix3& b)\n\t{\n\t\tfor (int i = 0; i < 3; i++)\n\t\t\tfor (int j = 0; j < 3; j++)\n\t\t\t\tM[i][j] += b.M[i][j];\n\t\treturn *this;\n\t}\n\n\tvoid operator= (const Matrix3& b)\n\t{\n\t\tfor (int i = 0; i < 3; i++)\n\t\t\tfor (int j = 0; j < 3; j++)\n\t\t\t\tM[i][j] = b.M[i][j];\n\t\treturn;\n\t}\n\n\tvoid operator= (const SymMat3<T>& b)\n\t{\n\t\tfor (int i = 0; i < 3; i++)\n\t\t\tfor (int j = 0; j < 3; j++)\n\t\t\t\tM[i][j] = 0;\n\n\t\tM[0][0] = b.v[0];\n\t\tM[0][1] = b.v[1];\n\t\tM[0][2] = b.v[2];\n\t\tM[1][1] = b.v[3];\n\t\tM[1][2] = b.v[4];\n\t\tM[2][2] = b.v[5];\n\n\t\treturn;\n\t}\n\n\tMatrix3 operator- (const Matrix3& b) const\n\t{\n\t\tMatrix3 result(*this);\n\t\tresult -= b;\n\t\treturn result;\n\t}\n\n\tMatrix3& operator-= (const Matrix3& b)\n\t{\n\t\tfor (int i = 0; i < 3; i++)\n\t\t\tfor (int j = 0; j < 3; j++)\n\t\t\t\tM[i][j] -= b.M[i][j];\n\t\treturn *this;\n\t}\n\n\t// Multiplies two matrices into destination with minimum copying.\n\tstatic Matrix3& Multiply(Matrix3* d, const Matrix3& a, const Matrix3& b)\n\t{\n\t\tOVR_ASSERT((d != &a) && (d != &b));\n\t\tint i = 0;\n\t\tdo {\n\t\t\td->M[i][0] = a.M[i][0] * b.M[0][0] + a.M[i][1] * b.M[1][0] + a.M[i][2] * b.M[2][0];\n\t\t\td->M[i][1] = a.M[i][0] * b.M[0][1] + a.M[i][1] * b.M[1][1] + a.M[i][2] * b.M[2][1];\n\t\t\td->M[i][2] = a.M[i][0] * b.M[0][2] + a.M[i][1] * b.M[1][2] + a.M[i][2] * b.M[2][2];\n\t\t} while((++i) < 3);\n\n\t\treturn *d;\n\t}\n\n\tMatrix3 operator* (const Matrix3& b) const\n\t{\n\t\tMatrix3 result(Matrix3::NoInit);\n\t\tMultiply(&result, *this, b);\n\t\treturn result;\n\t}\n\n\tMatrix3& operator*= (const Matrix3& b)\n\t{\n\t\treturn Multiply(this, Matrix3(*this), b);\n\t}\n\n\tMatrix3 operator* (T s) const\n\t{\n\t\tMatrix3 result(*this);\n\t\tresult *= s;\n\t\treturn result;\n\t}\n\n\tMatrix3& operator*= (T s)\n\t{\n\t\tfor (int i = 0; i < 3; i++)\n\t\t\tfor (int j = 0; j < 3; j++)\n\t\t\t\tM[i][j] *= s;\n\t\treturn *this;\n\t}\n\n\tVector3<T> operator* (const Vector3<T> &b) const\n\t{\n\t\tVector3<T> result;\n\t\tresult.x = M[0][0]*b.x + M[0][1]*b.y + M[0][2]*b.z;\n\t\tresult.y = M[1][0]*b.x + M[1][1]*b.y + M[1][2]*b.z;\n\t\tresult.z = M[2][0]*b.x + M[2][1]*b.y + M[2][2]*b.z;\n\n\t\treturn result;\n\t}\n\n\tMatrix3 operator/ (T s) const\n\t{\n\t\tMatrix3 result(*this);\n\t\tresult /= s;\n\t\treturn result;\n\t}\n\n\tMatrix3& operator/= (T s)\n\t{\n\t\tfor (int i = 0; i < 3; i++)\n\t\t\tfor (int j = 0; j < 3; j++)\n\t\t\t\tM[i][j] /= s;\n\t\treturn *this;\n\t}\n\n\tVector2<T> Transform(const Vector2<T>& v) const\n\t{\n\t\tconst float rcpZ = 1.0f / (M[2][0] * v.x + M[2][1] * v.y + M[2][2]);\n\t\treturn Vector2<T>((M[0][0] * v.x + M[0][1] * v.y + M[0][2]) * rcpZ,\n\t\t\t\t\t\t  (M[1][0] * v.x + M[1][1] * v.y + M[1][2]) * rcpZ);\n\t}\n\n\tVector3<T> Transform(const Vector3<T>& v) const\n\t{\n\t\treturn Vector3<T>(M[0][0] * v.x + M[0][1] * v.y + M[0][2] * v.z,\n\t\t\t\t\t\t  M[1][0] * v.x + M[1][1] * v.y + M[1][2] * v.z,\n\t\t\t\t\t\t  M[2][0] * v.x + M[2][1] * v.y + M[2][2] * v.z);\n\t}\n\n\tMatrix3 Transposed() const\n\t{\n\t\treturn Matrix3(M[0][0], M[1][0], M[2][0],\n\t\t\t\t\t   M[0][1], M[1][1], M[2][1],\n\t\t\t\t\t   M[0][2], M[1][2], M[2][2]);\n\t}\n\n\tvoid     Transpose()\n\t{\n\t\t*this = Transposed();\n\t}\n\n\n\tT SubDet (const size_t* rows, const size_t* cols) const\n\t{\n\t\treturn M[rows[0]][cols[0]] * (M[rows[1]][cols[1]] * M[rows[2]][cols[2]] - M[rows[1]][cols[2]] * M[rows[2]][cols[1]])\n\t\t\t - M[rows[0]][cols[1]] * (M[rows[1]][cols[0]] * M[rows[2]][cols[2]] - M[rows[1]][cols[2]] * M[rows[2]][cols[0]])\n\t\t\t + M[rows[0]][cols[2]] * (M[rows[1]][cols[0]] * M[rows[2]][cols[1]] - M[rows[1]][cols[1]] * M[rows[2]][cols[0]]);\n\t}\n\n\t// M += a*b.t()\n\tinline void Rank1Add(const Vector3<T> &a, const Vector3<T> &b)\n\t{\n\t\tM[0][0] += a.x*b.x;\t\tM[0][1] += a.x*b.y;\t\tM[0][2] += a.x*b.z;\n\t\tM[1][0] += a.y*b.x;\t\tM[1][1] += a.y*b.y;\t\tM[1][2] += a.y*b.z;\n\t\tM[2][0] += a.z*b.x;\t\tM[2][1] += a.z*b.y;\t\tM[2][2] += a.z*b.z;\n\t}\n\n\t// M -= a*b.t()\n\tinline void Rank1Sub(const Vector3<T> &a, const Vector3<T> &b)\n\t{\n\t\tM[0][0] -= a.x*b.x;\t\tM[0][1] -= a.x*b.y;\t\tM[0][2] -= a.x*b.z;\n\t\tM[1][0] -= a.y*b.x;\t\tM[1][1] -= a.y*b.y;\t\tM[1][2] -= a.y*b.z;\n\t\tM[2][0] -= a.z*b.x;\t\tM[2][1] -= a.z*b.y;\t\tM[2][2] -= a.z*b.z;\n\t}\n\n\tinline Vector3<T> Col(int c) const\n\t{\n\t\treturn Vector3<T>(M[0][c], M[1][c], M[2][c]);\n\t}\n\n\tinline Vector3<T> Row(int r) const\n\t{\n        return Vector3<T>(M[r][0], M[r][1], M[r][2]);\n\t}\n\n\tinline T Determinant() const\n\t{\n\t\tconst Matrix3<T>& m = *this;\n\t\tT d; \n\n\t\td  = m.M[0][0] * (m.M[1][1]*m.M[2][2] - m.M[1][2] * m.M[2][1]);\n\t\td -= m.M[0][1] * (m.M[1][0]*m.M[2][2] - m.M[1][2] * m.M[2][0]);\n\t\td += m.M[0][2] * (m.M[1][0]*m.M[2][1] - m.M[1][1] * m.M[2][0]);\n\n\t\treturn d;\n\t}\n\t\n\tinline Matrix3<T> Inverse() const\n    {\n        Matrix3<T> a;\n        const  Matrix3<T>& m = *this;\n        T d = Determinant();\n\n        assert(d != 0);\n        T s = T(1)/d;\n\n        a.M[0][0] = s * (m.M[1][1] * m.M[2][2] - m.M[1][2] * m.M[2][1]);   \n        a.M[1][0] = s * (m.M[1][2] * m.M[2][0] - m.M[1][0] * m.M[2][2]);   \n        a.M[2][0] = s * (m.M[1][0] * m.M[2][1] - m.M[1][1] * m.M[2][0]);   \n\n\t\ta.M[0][1] = s * (m.M[0][2] * m.M[2][1] - m.M[0][1] * m.M[2][2]);   \n\t\ta.M[1][1] = s * (m.M[0][0] * m.M[2][2] - m.M[0][2] * m.M[2][0]);   \n\t\ta.M[2][1] = s * (m.M[0][1] * m.M[2][0] - m.M[0][0] * m.M[2][1]);   \n        \n\t\ta.M[0][2] = s * (m.M[0][1] * m.M[1][2] - m.M[0][2] * m.M[1][1]);   \n\t\ta.M[1][2] = s * (m.M[0][2] * m.M[1][0] - m.M[0][0] * m.M[1][2]);   \n\t\ta.M[2][2] = s * (m.M[0][0] * m.M[1][1] - m.M[0][1] * m.M[1][0]);   \n        \n        return a;\n    }\n\t\n};\n\ntypedef Matrix3<float>  Matrix3f;\ntypedef Matrix3<double> Matrix3d;\n\n//-------------------------------------------------------------------------------------\n\ntemplate<typename T>\nclass SymMat3\n{\nprivate:\n\ttypedef SymMat3<T> this_type;\n\npublic:\n\ttypedef T Value_t;\n\t// Upper symmetric\n\tT v[6]; // _00 _01 _02 _11 _12 _22\n\n\tinline SymMat3() {}\n\n\tinline explicit SymMat3(T s)\n\t{\n\t\tv[0] = v[3] = v[5] = s;\n\t\tv[1] = v[2] = v[4] = 0;\n\t}\n\n\tinline explicit SymMat3(T a00, T a01, T a02, T a11, T a12, T a22)\n\t{\n\t\tv[0] = a00; v[1] = a01; v[2] = a02;\n\t\tv[3] = a11; v[4] = a12;\n\t\tv[5] = a22;\n\t}\n\n\tstatic inline int Index(unsigned int i, unsigned int j)\n\t{\n\t\treturn (i <= j) ? (3*i - i*(i+1)/2 + j) : (3*j - j*(j+1)/2 + i);\n\t}\n\n\tinline T operator()(int i, int j) const { return v[Index(i,j)]; }\n\t\n\tinline T &operator()(int i, int j) { return v[Index(i,j)]; }\n\n\ttemplate<typename U>\n\tinline SymMat3<U> CastTo() const\n\t{\n\t\treturn SymMat3<U>(static_cast<U>(v[0]), static_cast<U>(v[1]), static_cast<U>(v[2]),\n\t\t\t\t\t\t  static_cast<U>(v[3]), static_cast<U>(v[4]), static_cast<U>(v[5]));\n\t}\n\n\tinline this_type& operator+=(const this_type& b)\n\t{\n\t\tv[0]+=b.v[0];\n\t\tv[1]+=b.v[1];\n\t\tv[2]+=b.v[2];\n\t\tv[3]+=b.v[3];\n\t\tv[4]+=b.v[4];\n\t\tv[5]+=b.v[5];\n\t\treturn *this;\n\t}\n\n\tinline this_type& operator-=(const this_type& b)\n\t{\n\t\tv[0]-=b.v[0];\n\t\tv[1]-=b.v[1];\n\t\tv[2]-=b.v[2];\n\t\tv[3]-=b.v[3];\n\t\tv[4]-=b.v[4];\n\t\tv[5]-=b.v[5];\n\n\t\treturn *this;\n\t}\n\n\tinline this_type& operator*=(T s)\n\t{\n\t\tv[0]*=s;\n\t\tv[1]*=s;\n\t\tv[2]*=s;\n\t\tv[3]*=s;\n\t\tv[4]*=s;\n\t\tv[5]*=s;\n\n\t\treturn *this;\n\t}\n\t\t\n\tinline SymMat3 operator*(T s) const\n\t{\n\t\tSymMat3 d;\n\t\td.v[0] = v[0]*s; \n\t\td.v[1] = v[1]*s; \n\t\td.v[2] = v[2]*s; \n\t\td.v[3] = v[3]*s; \n\t\td.v[4] = v[4]*s; \n\t\td.v[5] = v[5]*s; \n\t\t\t\t\t\t\n\t\treturn d;\n\t}\n\n\t// Multiplies two matrices into destination with minimum copying.\n\tstatic SymMat3& Multiply(SymMat3* d, const SymMat3& a, const SymMat3& b)\n\t{\t\t\n\t\t// _00 _01 _02 _11 _12 _22\n\n\t\td->v[0] = a.v[0] * b.v[0];\n\t\td->v[1] = a.v[0] * b.v[1] + a.v[1] * b.v[3];\n\t\td->v[2] = a.v[0] * b.v[2] + a.v[1] * b.v[4];\n\t\t\t\t\t\n\t\td->v[3] = a.v[3] * b.v[3];\n\t\td->v[4] = a.v[3] * b.v[4] + a.v[4] * b.v[5];\n\t\t\t\t\n\t\td->v[5] = a.v[5] * b.v[5];\n\t\n\t\treturn *d;\n\t}\n\t\n\tinline T Determinant() const\n\t{\n\t\tconst this_type& m = *this;\n\t\tT d; \n\n\t\td  = m(0,0) * (m(1,1)*m(2,2) - m(1,2) * m(2,1));\n\t\td -= m(0,1) * (m(1,0)*m(2,2) - m(1,2) * m(2,0));\n\t\td += m(0,2) * (m(1,0)*m(2,1) - m(1,1) * m(2,0));\n\n\t\treturn d;\n\t}\n\n\tinline this_type Inverse() const\n\t{\n\t\tthis_type a;\n\t\tconst this_type& m = *this;\n\t\tT d = Determinant();\n\n\t\tassert(d != 0);\n\t\tT s = T(1)/d;\n\n\t\ta(0,0) = s * (m(1,1) * m(2,2) - m(1,2) * m(2,1));   \n\n\t\ta(0,1) = s * (m(0,2) * m(2,1) - m(0,1) * m(2,2));   \n\t\ta(1,1) = s * (m(0,0) * m(2,2) - m(0,2) * m(2,0));   \n\n\t\ta(0,2) = s * (m(0,1) * m(1,2) - m(0,2) * m(1,1));   \n\t\ta(1,2) = s * (m(0,2) * m(1,0) - m(0,0) * m(1,2));   \n\t\ta(2,2) = s * (m(0,0) * m(1,1) - m(0,1) * m(1,0));   \n\n\t\treturn a;\n\t}\n\n\tinline T Trace() const { return v[0] + v[3] + v[5]; }\n\n\t// M = a*a.t()\n\tinline void Rank1(const Vector3<T> &a)\n\t{\n\t\tv[0] = a.x*a.x; v[1] = a.x*a.y; v[2] = a.x*a.z;\n\t\tv[3] = a.y*a.y; v[4] = a.y*a.z;\n\t\tv[5] = a.z*a.z;\n\t}\n\n\t// M += a*a.t()\n\tinline void Rank1Add(const Vector3<T> &a)\n\t{\n\t\tv[0] += a.x*a.x; v[1] += a.x*a.y; v[2] += a.x*a.z;\n\t\tv[3] += a.y*a.y; v[4] += a.y*a.z;\n\t\tv[5] += a.z*a.z;\n\t}\n\n\t// M -= a*a.t()\n\tinline void Rank1Sub(const Vector3<T> &a)\n\t{\n\t\tv[0] -= a.x*a.x; v[1] -= a.x*a.y; v[2] -= a.x*a.z;\n\t\tv[3] -= a.y*a.y; v[4] -= a.y*a.z;\n\t\tv[5] -= a.z*a.z;\n\t}\n};\n\ntypedef SymMat3<float>  SymMat3f;\ntypedef SymMat3<double> SymMat3d;\n\ntemplate<typename T>\ninline Matrix3<T> operator*(const SymMat3<T>& a, const SymMat3<T>& b)\n{\n\t#define AJB_ARBC(r,c) (a(r,0)*b(0,c)+a(r,1)*b(1,c)+a(r,2)*b(2,c))\n    return Matrix3<T>(\n\t\tAJB_ARBC(0,0), AJB_ARBC(0,1), AJB_ARBC(0,2),\n\t\tAJB_ARBC(1,0), AJB_ARBC(1,1), AJB_ARBC(1,2),\n\t\tAJB_ARBC(2,0), AJB_ARBC(2,1), AJB_ARBC(2,2));\n\t#undef AJB_ARBC\n}\n\ntemplate<typename T>\ninline Matrix3<T> operator*(const Matrix3<T>& a, const SymMat3<T>& b)\n{\n\t#define AJB_ARBC(r,c) (a(r,0)*b(0,c)+a(r,1)*b(1,c)+a(r,2)*b(2,c))\n\treturn Matrix3<T>(\n\t\tAJB_ARBC(0,0), AJB_ARBC(0,1), AJB_ARBC(0,2),\n\t\tAJB_ARBC(1,0), AJB_ARBC(1,1), AJB_ARBC(1,2),\n\t\tAJB_ARBC(2,0), AJB_ARBC(2,1), AJB_ARBC(2,2));\n\t#undef AJB_ARBC\n}\n\n//-------------------------------------------------------------------------------------\n// ***** Angle\n\n// Cleanly representing the algebra of 2D rotations.\n// The operations maintain the angle between -Pi and Pi, the same range as atan2.\n\ntemplate<class T>\nclass Angle\n{\npublic:\n\tenum AngularUnits\n\t{\n\t\tRadians = 0,\n\t\tDegrees = 1\n\t};\n\n    Angle() : a(0) {}\n    \n\t// Fix the range to be between -Pi and Pi\n\tAngle(T a_, AngularUnits u = Radians) : a((u == Radians) ? a_ : a_*((T)MATH_DOUBLE_DEGREETORADFACTOR)) { FixRange(); }\n\n\tT    Get(AngularUnits u = Radians) const       { return (u == Radians) ? a : a*((T)MATH_DOUBLE_RADTODEGREEFACTOR); }\n\tvoid Set(const T& x, AngularUnits u = Radians) { a = (u == Radians) ? x : x*((T)MATH_DOUBLE_DEGREETORADFACTOR); FixRange(); }\n\tint Sign() const                               { if (a == 0) return 0; else return (a > 0) ? 1 : -1; }\n\tT   Abs() const                                { return (a > 0) ? a : -a; }\n\n    bool operator== (const Angle& b) const    { return a == b.a; }\n    bool operator!= (const Angle& b) const    { return a != b.a; }\n//\tbool operator<  (const Angle& b) const    { return a < a.b; } \n//\tbool operator>  (const Angle& b) const    { return a > a.b; } \n//\tbool operator<= (const Angle& b) const    { return a <= a.b; } \n//\tbool operator>= (const Angle& b) const    { return a >= a.b; } \n//\tbool operator= (const T& x)               { a = x; FixRange(); }\n\n\t// These operations assume a is already between -Pi and Pi.\n\tAngle& operator+= (const Angle& b)        { a = a + b.a; FastFixRange(); return *this; }\n\tAngle& operator+= (const T& x)            { a = a + x; FixRange(); return *this; }\n    Angle  operator+  (const Angle& b) const  { Angle res = *this; res += b; return res; }\n\tAngle  operator+  (const T& x) const      { Angle res = *this; res += x; return res; }\n\tAngle& operator-= (const Angle& b)        { a = a - b.a; FastFixRange(); return *this; }\n\tAngle& operator-= (const T& x)            { a = a - x; FixRange(); return *this; }\n\tAngle  operator-  (const Angle& b) const  { Angle res = *this; res -= b; return res; }\n\tAngle  operator-  (const T& x) const      { Angle res = *this; res -= x; return res; }\n\t\n\tT   Distance(const Angle& b)              { T c = fabs(a - b.a); return (c <= ((T)MATH_DOUBLE_PI)) ? c : ((T)MATH_DOUBLE_TWOPI) - c; }\n\nprivate:\n\n\t// The stored angle, which should be maintained between -Pi and Pi\n\tT a;\n\n\t// Fixes the angle range to [-Pi,Pi], but assumes no more than 2Pi away on either side \n\tinline void FastFixRange()\n\t{\n\t\tif (a < -((T)MATH_DOUBLE_PI))\n\t\t\ta += ((T)MATH_DOUBLE_TWOPI);\n\t\telse if (a > ((T)MATH_DOUBLE_PI))\n\t\t\ta -= ((T)MATH_DOUBLE_TWOPI);\n\t}\n\n\t// Fixes the angle range to [-Pi,Pi] for any given range, but slower then the fast method\n\tinline void FixRange()\n\t{\n        // do nothing if the value is already in the correct range, since fmod call is expensive\n        if (a >= -((T)MATH_DOUBLE_PI) && a <= ((T)MATH_DOUBLE_PI))\n            return;\n\t\ta = fmod(a,((T)MATH_DOUBLE_TWOPI));\n\t\tif (a < -((T)MATH_DOUBLE_PI))\n\t\t\ta += ((T)MATH_DOUBLE_TWOPI);\n\t\telse if (a > ((T)MATH_DOUBLE_PI))\n\t\t\ta -= ((T)MATH_DOUBLE_TWOPI);\n\t}\n};\n\n\ntypedef Angle<float>  Anglef;\ntypedef Angle<double> Angled;\n\n\n//-------------------------------------------------------------------------------------\n// ***** Plane\n\n// Consists of a normal vector and distance from the origin where the plane is located.\n\ntemplate<class T>\nclass Plane\n{\npublic:\n    Vector3<T> N;\n    T          D;\n\n    Plane() : D(0) {}\n\n    // Normals must already be normalized\n    Plane(const Vector3<T>& n, T d) : N(n), D(d) {}\n    Plane(T x, T y, T z, T d) : N(x,y,z), D(d) {}\n\n    // construct from a point on the plane and the normal\n    Plane(const Vector3<T>& p, const Vector3<T>& n) : N(n), D(-(p * n)) {}\n\n    // Find the point to plane distance. The sign indicates what side of the plane the point is on (0 = point on plane).\n    T TestSide(const Vector3<T>& p) const\n    {\n        return (N.Dot(p)) + D;\n    }\n\n    Plane<T> Flipped() const\n    {\n        return Plane(-N, -D);\n    }\n\n    void Flip()\n    {\n        N = -N;\n        D = -D;\n    }\n\n\tbool operator==(const Plane<T>& rhs) const\n\t{\n\t\treturn (this->D == rhs.D && this->N == rhs.N);\n\t}\n};\n\ntypedef Plane<float> Planef;\ntypedef Plane<double> Planed;\n\n\n} // Namespace OVR\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Nullptr.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR_Kernel.h\nFilename    :   OVR_Nullptr.h\nContent     :   Implements C++11 nullptr for the case that the compiler doesn't.\nCreated     :   June 19, 2014\nNotes       :\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Nullptr_h\n#define OVR_Nullptr_h\n\n#pragma once\n\n#include \"OVR_Types.h\"\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_HAVE_std_nullptr_t\n//\n// Identifies if <cstddef.h> includes std::nullptr_t.\n//\n#if !defined(OVR_HAVE_std_nullptr_t) && defined(OVR_CPP11_ENABLED)\n    #if defined(OVR_STDLIB_LIBCPP)\n        #define OVR_HAVE_std_nullptr_t 1\n    #elif defined(OVR_STDLIB_LIBSTDCPP)\n        #if (__GLIBCXX__ >= 20110325) && (__GLIBCXX__ != 20110428) && (__GLIBCXX__ != 20120702)\n            #define OVR_HAVE_std_nullptr_t 1\n        #endif\n    #elif defined(_MSC_VER) && (_MSC_VER >= 1600) // VS2010+\n        #define OVR_HAVE_std_nullptr_t 1\n    #elif defined(__clang__)\n        #define OVR_HAVE_std_nullptr_t 1\n    #elif defined(OVR_CPP_GNUC) && (OVR_CC_VERSION >= 406) // GCC 4.6+\n        #define OVR_HAVE_std_nullptr_t 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** nullptr / std::nullptr_t\n//\n// Declares and defines nullptr and related types.\n//\n#if !defined(OVR_CPP_NO_NULLPTR)\n    namespace std\n    {\n        class nullptr_t\n        {\n        public:\n            template <typename T>\n            operator T*() const\n                { return 0; }\n\n            template <typename C, typename T>\n            operator T C::*() const\n                { return 0; }\n\n            #if OVR_CPP_NO_EXPLICIT_CONVERSION_OPERATORS\n                typedef void* (nullptr_t::*bool_)() const;  // 4.12,p1. We can't portably use operator bool(){ return false; } because bool\n                operator bool_() const                      // is convertable to int which breaks other required functionality.\n                    { return false; }\n            #else\n                operator bool() const\n                    { return false; }\n            #endif\n\n        private:\n            void operator&() const; // 5.2.10,p9\n        };\n\n        inline nullptr_t nullptr_get()\n        {\n            nullptr_t n = { };\n            return n;\n        }\n\n        #if !defined(nullptr)\n            #define nullptr nullptr_get()\n        #endif\n\n    } // namespace std\n\n\n    // 5.9,p2 p4\n    // 13.6, p13\n    template <typename T>\n    inline bool operator==(T* pT, const std::nullptr_t)\n        { return pT == 0; }\n\n    template <typename T>\n    inline bool operator==(const std::nullptr_t, T* pT)\n        { return pT == 0; }\n\n    template <typename T, typename U>\n    inline bool operator==(const std::nullptr_t, T U::* pU)\n        { return pU == 0; }\n\n    template <typename T, typename U>\n    inline bool operator==(T U::* pTU, const std::nullptr_t)\n        { return pTU == 0; }\n\n    inline bool operator==(const std::nullptr_t, const std::nullptr_t)\n        { return true; }\n\n    inline bool operator!=(const std::nullptr_t, const std::nullptr_t)\n        { return false; }\n\n    inline bool operator<(const std::nullptr_t, const std::nullptr_t)\n        { return false; }\n\n    inline bool operator<=(const std::nullptr_t, const std::nullptr_t)\n        { return true; }\n\n    inline bool operator>(const std::nullptr_t, const std::nullptr_t)\n        { return false; }\n\n    inline bool operator>=(const std::nullptr_t, const std::nullptr_t)\n        { return true; }\n\n    using std::nullptr_t;\n    using std::nullptr_get;\n\n// Some compilers natively support C++11 nullptr but the standard library being used\n// doesn't declare std::nullptr_t, in which case we provide one ourselves.\n#elif !defined(OVR_HAVE_std_nullptr_t) && !defined(OVR_CPP_NO_DECLTYPE)\n    namespace std { typedef decltype(nullptr) nullptr_t; }\n#endif\n\n\n#endif\n\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Observer.h",
    "content": "/************************************************************************************\n\nPublicHeader:   Kernel\nFilename    :   OVR_Observer.h\nContent     :   Observer pattern\nCreated     :   June 20, 2014\nAuthor      :   Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Observer_h\n#define OVR_Observer_h\n\n#include \"OVR_Types.h\"\n#include \"OVR_Atomic.h\"\n#include \"OVR_RefCount.h\"\n#include \"OVR_Delegates.h\"\n#include \"OVR_Array.h\"\n#include \"OVR_String.h\"\n#include \"OVR_Hash.h\"\n\nnamespace OVR {\n\ntemplate<class DelegateT> class Observer;\ntemplate<class DelegateT> class ObserverScope;\ntemplate<class DelegateT> class ObserverHash;\n\n\n//-----------------------------------------------------------------------------\n// Observer pattern\n\n// An Observer will observe a Subject.  The Subject can emit callbacks that get\n// serviced by the Observers.\n\n// The trickiest part of this is the shutdown code.\n// To simplify shutdown, the Observer is a reference-counted object divorced\n// from the handler that is called.  To avoid misuse, the ObserverScope object\n// is provided to ensure that the Shutdown() method is called when it goes out\n// of scope.\n\n// The Observer<> class doubles as the subject class.\n// To avoid misuse, assertions are added if a subject tries to observe, or if\n// an observer tries to be watched.\n\n/*\n    Usage example:\n\n    Say we want to invoke a handler with the signature:\n\n        void MyHandler(int i, bool b);\n\n    The corresponding delegate type is:\n\n        typedef Delegate2<void, int, bool> Handler;\n\n    Note: The return value will be ignored for the Observer pattern.\n\n    For this example there are two classes, one that emits events and another\n    that listens for events:\n*/\n\n/*\n    Event emitter example:\n\n    class MyEmitter\n    {\n        ObserverScope<Handler> TheSubject;\n\n    public:\n        void ClearAllListeners()\n        {\n            TheSubject.ReleaseAll();\n        }\n\n        void CallListeners(int x, bool y)\n        {\n            TheSubject->Call(x, y);\n        }\n\n        Observer<Handler>* GetSubject()\n        {\n            return TheSubject;\n        }\n    };\n*/\n\n/*\n    Event listener example:\n\n    class MyListener\n    {\n        ObserverScope<Handler> TheObserver;\n\n        void OnEvent(int x, bool y)\n        {\n            // Handle event here\n        }\n\n    public:\n        MyListener()\n        {\n            TheObserver.SetHandler(\n                Handler::FromMember<MyListener, &MyListener::OnEvent>(this)\n                );\n        }\n\n        void ClearListener()\n        {\n            TheObserver.ReleaseAll();\n        }\n\n        void ListenTo(Observer<Handler>* emitter)\n        {\n            TheObserver->Observe(emitter);\n        }\n    };\n*/\n\n/*\n    Usage example:\n\n    MyListener listener;\n    MyEmitter emitter;\n\n    // To listen to an emitter,\n    listener.ListenTo(emitter.GetSubject());\n\n    // To call the listeners,\n    emitter.CallListeners(22, true);\n*/\n\ntemplate<class DelegateT>\nclass Observer : public RefCountBase< Observer<DelegateT> >\n{\n\tfriend class ObserverScope<DelegateT>;\n\tfriend class ObserverHash<DelegateT>;\n\npublic:\n    typedef Observer<DelegateT> ThisType;\n    typedef DelegateT Handler;\n\nprotected:\n\tbool                     IsShutdown; // Flag to indicate that the object went out of scope\n\tmutable Lock             TheLock;    // Lock to synchronize calls and shutdown\n\tArray< Ptr< ThisType > > References; // List of observed or observing objects\n\tHandler                  TheHandler; // Observer-only: Handler for callbacks\n\n\tObserver() :\n\t\tIsShutdown(false)\n\t{\n\t\tTheHandler.Invalidate();\n\t}\n\tObserver(Handler handler) :\n\t\tIsShutdown(false),\n\t\tTheHandler(handler)\n\t{\n\t}\n\t~Observer()\n\t{\n\t\tOVR_ASSERT(References.GetSizeI() == 0);\n\t}\n\npublic:\n\tvoid SetHandler(Handler handler)\n\t{\n\t\tOVR_ASSERT(References.GetSizeI() == 0);\n\t\tTheHandler = handler;\n\t}\n\n\t// Release references and prevent further actions\n\tvoid Shutdown()\n\t{\n\t\tLock::Locker locker(&TheLock);\n\t\tIsShutdown = true;\n\t\tReferences.ClearAndRelease();\n\t}\n\n\t// Get count of references held\n\tint GetSizeI() const\n\t{\n\t\tLock::Locker locker(&TheLock);\n\t\treturn References.GetSizeI();\n\t}\n\n\t// Observe a subject\n\tbool Observe(ThisType *subject)\n\t{\n\t\tOVR_ASSERT(TheHandler.IsValid());\n\n\t\tif (!subject)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tLock::Locker locker(&TheLock);\n\n\t\tif (IsShutdown)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!subject->SubjectAddObserver(this))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tReferences.PushBack(subject);\n\t\treturn true;\n\t}\n\nprotected:\n\t// Subject function: AddObserver()\n\t// Returns true if the observer was added\n\tbool SubjectAddObserver(ThisType* observer)\n\t{\n\t\tOVR_ASSERT(!TheHandler.IsValid());\n\n\t\tif (!observer)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\tLock::Locker locker(&TheLock);\n\n\t\tif (IsShutdown)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tconst int count = References.GetSizeI();\n\t\tfor (int i = 0; i < count; ++i)\n\t\t{\n\t\t\tif (References[i] == observer)\n\t\t\t{\n\t\t\t\t// Already watched\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tReferences.PushBack(observer);\n\n\t\treturn true;\n\t}\n\npublic:\n    // Subject function: Call()\n#define OVR_OBSERVER_CALL_BODY(params) \\\n    bool callSuccess = false; \\\n\tLock::Locker locker(&TheLock); \\\n\tint count = References.GetSizeI(); \\\n\tfor (int i = 0; i < count; ++i) \\\n\t{ \\\n\t\tif (!References[i]->IsShutdown) \\\n\t\t{ \\\n\t\t\tOVR_ASSERT(References[i]->TheHandler.IsValid()); \\\n\t\t\tReferences[i]->TheHandler params; \\\n            callSuccess = true; \\\n\t\t} \\\n\t\tif (References[i]->IsShutdown) \\\n\t\t{ \\\n\t\t\tReferences.RemoveAt(i); \\\n\t\t\t--i; --count; \\\n\t\t} \\\n\t} \\\n    return callSuccess;\n\n\t// Call: Various parameter counts\n    // Returns true if a call was made\n\tbool Call()\n\t{\n\t\tOVR_OBSERVER_CALL_BODY(())\n\t}\n\ttemplate<class Param1>\n    bool Call(Param1& p1)\n\t{\n\t\tOVR_OBSERVER_CALL_BODY((p1))\n\t}\n\ttemplate<class Param1>\n    bool Call(Param1* p1)\n\t{\n\t\tOVR_OBSERVER_CALL_BODY((p1))\n\t}\n\ttemplate<class Param1, class Param2>\n    bool Call(Param1& p1, Param2& p2)\n\t{\n\t\tOVR_OBSERVER_CALL_BODY((p1, p2))\n\t}\n\ttemplate<class Param1, class Param2>\n    bool Call(Param1* p1, Param2* p2)\n\t{\n\t\tOVR_OBSERVER_CALL_BODY((p1, p2))\n\t}\n\ttemplate<class Param1, class Param2, class Param3>\n    bool Call(Param1& p1, Param2& p2, Param3& p3)\n\t{\n\t\tOVR_OBSERVER_CALL_BODY((p1, p2, p3))\n\t}\n\ttemplate<class Param1, class Param2, class Param3>\n    bool Call(Param1* p1, Param2* p2, Param3* p3)\n\t{\n\t\tOVR_OBSERVER_CALL_BODY((p1, p2, p3))\n\t}\n\n#undef OVR_OBSERVER_CALL_BODY\n};\n\n\n//-----------------------------------------------------------------------------\n// ObserverScope\n\n// Scoped shutdown of the Observer object\ntemplate<class DelegateT>\nclass ObserverScope : public NewOverrideBase\n{\n\tPtr< Observer<DelegateT> > TheObserver;\n\tDelegateT TheHandler;\n\n\tvoid Shutdown()\n\t{\n\t\tif (TheObserver)\n\t\t{\n\t\t\tTheObserver->Shutdown();\n\t\t\tTheObserver.Clear();\n\t\t}\n\t}\n\npublic:\n\tObserverScope()\n\t{\n\t\tTheObserver = *new Observer<DelegateT>;\n\t}\n\t~ObserverScope()\n\t{\n\t\tShutdown();\n\t}\n\n\t// Release all references and recreate it\n\tvoid ReleaseAll()\n\t{\n\t\tShutdown();\n\t\tTheObserver = *new Observer<DelegateT>;\n\t\tif (TheHandler.IsValid())\n\t\t{\n\t\t\tTheObserver->SetHandler(TheHandler);\n\t\t}\n\t}\n\n\tvoid SetHandler(DelegateT handler)\n\t{\n\t\tTheHandler = handler;\n\t\tTheObserver->SetHandler(handler);\n\t}\n\n\tObserver<DelegateT>* GetPtr()\n\t{\n\t\treturn TheObserver.GetPtr();\n\t}\n\tObserver<DelegateT>* operator->()\n\t{\n\t\treturn TheObserver.GetPtr();\n\t}\n\tconst Observer<DelegateT>* operator->() const\n\t{\n\t\treturn TheObserver.GetPtr();\n\t}\n\toperator Observer<DelegateT>*()\n\t{\n\t\treturn TheObserver.GetPtr();\n\t}\n};\n\n\n//-----------------------------------------------------------------------------\n// ObserverHash\n\n// A hash containing Observers\ntemplate<class DelegateT>\nclass ObserverHash : public NewOverrideBase\n{\npublic:\n\tObserverHash() {}\n\t~ObserverHash() {Clear();}\n\tvoid Clear()\n\t{\n\t\tLock::Locker locker(&TheLock);\n\t\ttypename OVR::Hash< String, Ptr<Observer<DelegateT> >, OVR::String::HashFunctor >::Iterator it = _Hash.Begin();\n\t\tfor( it = _Hash.Begin(); it != _Hash.End(); ++it )\n\t\t{\n\t\t\tPtr<Observer<DelegateT> > o = it->Second;\n\t\t\to->Shutdown();\n\t\t}\n\t}\n\n\tPtr<Observer<DelegateT> > GetSubject(OVR::String key)\n\t{\n\t\tLock::Locker locker(&TheLock);\n\t\tPtr<Observer<DelegateT> > *o = _Hash.Get(key);\n\t\tif (o)\n\t\t\treturn (*o);\n\t\treturn NULL;\n\t}\n\n\t// Add handler to new observer with implicit creation of subject.\n\tvoid AddObserverToSubject(OVR::String key, Observer<DelegateT> *observer)\n\t{\n\t\tLock::Locker locker(&TheLock);\n\t\tPtr<Observer<DelegateT> > *subjectPtr = _Hash.Get(key);\n\n\t\tif (subjectPtr==NULL)\n\t\t{\n\t\t\tPtr<Observer<DelegateT> > subject = *new Observer<DelegateT>();\n\t\t\t_Hash.Add(key, subject);\n\t\t\tobserver->Observe(subject);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tobserver->Observe(*subjectPtr);\n\t\t}\n\t}\n\n\tvoid RemoveSubject(OVR::String key)\n\t{\n\t\tLock::Locker locker(&TheLock);\n\t\tPtr<Observer<DelegateT> > *subjectPtr = _Hash.Get(key);\n\t\tif (subjectPtr!=NULL)\n\t\t{\n\t\t\t(*subjectPtr)->Shutdown();\n\t\t\t_Hash.Remove(key);\n\t\t}\n\t}\n\nprotected:\n\tOVR::Hash< OVR::String, Ptr<Observer<DelegateT> >, OVR::String::HashFunctor > _Hash;\n\tLock                     TheLock;      // Lock to synchronize calls and shutdown\n};\n\n\n} // namespace OVR\n\n#endif // OVR_Observer_h\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_RefCount.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_RefCount.cpp\nContent     :   Reference counting implementation\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_RefCount.h\"\n#include \"OVR_Atomic.h\"\n#include \"OVR_Log.h\"\n\nnamespace OVR {\n\n#ifdef OVR_CC_ARM\nvoid* ReturnArg0(void* p)\n{\n    return p;\n}\n#endif\n\n// ***** Reference Count Base implementation\n\nRefCountImplCore::~RefCountImplCore()\n{\n    // RefCount can be either 1 or 0 here.\n    //  0 if Release() was properly called.\n    //  1 if the object was declared on stack or as an aggregate.\n    OVR_ASSERT(RefCount <= 1);\n}\n\n#ifdef OVR_BUILD_DEBUG\nvoid RefCountImplCore::reportInvalidDelete(void *pmem)\n{\n    OVR_DEBUG_LOG(\n        (\"Invalid delete call on ref-counted object at %p. Please use Release()\", pmem));\n    OVR_ASSERT(0);\n}\n#endif\n\nRefCountNTSImplCore::~RefCountNTSImplCore()\n{\n    // RefCount can be either 1 or 0 here.\n    //  0 if Release() was properly called.\n    //  1 if the object was declared on stack or as an aggregate.\n    OVR_ASSERT(RefCount <= 1);\n}\n\n#ifdef OVR_BUILD_DEBUG\nvoid RefCountNTSImplCore::reportInvalidDelete(void *pmem)\n{\n    OVR_DEBUG_LOG(\n        (\"Invalid delete call on ref-counted object at %p. Please use Release()\", pmem));\n    OVR_ASSERT(0);\n}\n#endif\n\n\n// *** Thread-Safe RefCountImpl\n\nvoid    RefCountImpl::AddRef()\n{\n    AtomicOps<int>::ExchangeAdd_NoSync(&RefCount, 1);\n}\nvoid    RefCountImpl::Release()\n{\n    if ((AtomicOps<int>::ExchangeAdd_NoSync(&RefCount, -1) - 1) == 0)\n        delete this;\n}\n\n// *** Thread-Safe RefCountVImpl w/virtual AddRef/Release\n\nvoid    RefCountVImpl::AddRef()\n{\n    AtomicOps<int>::ExchangeAdd_NoSync(&RefCount, 1);\n}\nvoid    RefCountVImpl::Release()\n{\n    if ((AtomicOps<int>::ExchangeAdd_NoSync(&RefCount, -1) - 1) == 0)\n        delete this;\n}\n\n// *** NON-Thread-Safe RefCountImpl\n\nvoid    RefCountNTSImpl::Release() const\n{\n    RefCount--;\n    if (RefCount == 0)\n        delete this;\n}\n\n\n} // OVR\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_RefCount.h",
    "content": "/************************************************************************************\n\nPublicHeader:   Kernel\nFilename    :   OVR_RefCount.h\nContent     :   Reference counting implementation headers\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_RefCount_h\n#define OVR_RefCount_h\n\n#include \"OVR_Types.h\"\n#include \"OVR_Allocator.h\"\n\nnamespace OVR {\n\n//-----------------------------------------------------------------------------------\n// ***** Reference Counting\n\n// There are three types of reference counting base classes:\n//\n//  RefCountBase     - Provides thread-safe reference counting (Default).\n//  RefCountBaseNTS  - Non Thread Safe version of reference counting.\n\n\n// ***** Declared classes\n\ntemplate<class C>\nclass   RefCountBase;\ntemplate<class C>\nclass   RefCountBaseNTS;\n\nclass   RefCountImpl;\nclass   RefCountNTSImpl;\n\n\n//-----------------------------------------------------------------------------------\n// ***** Implementation For Reference Counting\n\n// RefCountImplCore holds RefCount value and defines a few utility\n// functions shared by all implementations.\n\nclass RefCountImplCore\n{\nprotected:\n   volatile int RefCount;\n\npublic:\n    // RefCountImpl constructor always initializes RefCount to 1 by default.\n    OVR_FORCE_INLINE RefCountImplCore() : RefCount(1) { }\n\n    // Need virtual destructor\n    // This:    1. Makes sure the right destructor's called.\n    //          2. Makes us have VTable, necessary if we are going to have format needed by InitNewMem()\n    virtual ~RefCountImplCore();\n\n    // Debug method only.\n    int GetRefCount() const { return RefCount;  }\n\n    // This logic is used to detect invalid 'delete' calls of reference counted\n    // objects. Direct delete calls are not allowed on them unless they come in\n    // internally from Release.\n#ifdef OVR_BUILD_DEBUG    \n    static void   OVR_CDECL  reportInvalidDelete(void *pmem);\n    inline static void checkInvalidDelete(RefCountImplCore *pmem)\n    {\n        if (pmem->RefCount != 0)\n            reportInvalidDelete(pmem);\n    }\n#else\n    inline static void checkInvalidDelete(RefCountImplCore *) { }\n#endif\n\n    // Base class ref-count content should not be copied.\n    void operator = (const RefCountImplCore &) { }  \n};\n\nclass RefCountNTSImplCore\n{\nprotected:\n    mutable int RefCount;\n\npublic:\n    // RefCountImpl constructor always initializes RefCount to 1 by default.\n    OVR_FORCE_INLINE RefCountNTSImplCore() : RefCount(1) { }\n\n    // Need virtual destructor\n    // This:    1. Makes sure the right destructor's called.\n    //          2. Makes us have VTable, necessary if we are going to have format needed by InitNewMem()\n    virtual ~RefCountNTSImplCore();\n\n    // Debug method only.\n    int             GetRefCount() const { return RefCount;  }\n\n    // This logic is used to detect invalid 'delete' calls of reference counted\n    // objects. Direct delete calls are not allowed on them unless they come in\n    // internally from Release.\n#ifdef OVR_BUILD_DEBUG    \n    static void   OVR_CDECL  reportInvalidDelete(void *pmem);\n    OVR_FORCE_INLINE static void checkInvalidDelete(RefCountNTSImplCore *pmem)\n    {\n        if (pmem->RefCount != 0)\n            reportInvalidDelete(pmem);\n    }\n#else\n    OVR_FORCE_INLINE static void checkInvalidDelete(RefCountNTSImplCore *) { }\n#endif\n\n    // Base class ref-count content should not be copied.\n    void operator = (const RefCountNTSImplCore &) { }  \n};\n\n\n\n// RefCountImpl provides Thread-Safe implementation of reference counting, so\n// it should be used by default in most places.\n\nclass RefCountImpl : public RefCountImplCore\n{\npublic:\n    // Thread-Safe Ref-Count Implementation.\n    void    AddRef();\n    void    Release();   \n};\n\n// RefCountVImpl provides Thread-Safe implementation of reference counting, plus,\n// virtual AddRef and Release.\n\nclass RefCountVImpl : virtual public RefCountImplCore\n{\npublic:\n    // Thread-Safe Ref-Count Implementation.\n    virtual void      AddRef();\n    virtual void      Release();   \n};\n\n\n// RefCountImplNTS provides Non-Thread-Safe implementation of reference counting,\n// which is slightly more efficient since it doesn't use atomics.\n\nclass RefCountNTSImpl : public RefCountNTSImplCore\n{\npublic:\n    OVR_FORCE_INLINE void    AddRef() const { RefCount++; }\n    void    Release() const;   \n};\n\n\n\n// RefCountBaseStatImpl<> is a common class that adds new/delete override with Stat tracking\n// to the reference counting implementation. Base must be one of the RefCountImpl classes.\n\ntemplate<class Base>\nclass RefCountBaseStatImpl : public Base\n{\npublic:\n    RefCountBaseStatImpl() { }\n     \n    // *** Override New and Delete\n\n    // DOM-IGNORE-BEGIN\n    // Undef new temporarily if it is being redefined\n#ifdef OVR_DEFINE_NEW\n#undef new\n#endif\n\n#ifdef OVR_BUILD_DEBUG\n    // Custom check used to detect incorrect calls of 'delete' on ref-counted objects.\n    #define OVR_REFCOUNTALLOC_CHECK_DELETE(class_name, p)   \\\n        do {if (p) Base::checkInvalidDelete((class_name*)p); } while(0)\n#else\n    #define OVR_REFCOUNTALLOC_CHECK_DELETE(class_name, p)\n#endif\n\n    // Redefine all new & delete operators.\n    OVR_MEMORY_REDEFINE_NEW_IMPL(Base, OVR_REFCOUNTALLOC_CHECK_DELETE)\n\n#undef OVR_REFCOUNTALLOC_CHECK_DELETE\n\n#ifdef OVR_DEFINE_NEW\n#define new OVR_DEFINE_NEW\n#endif\n        // OVR_BUILD_DEFINE_NEW\n        // DOM-IGNORE-END\n};\n\n\ntemplate<class Base>\nclass RefCountBaseStatVImpl : virtual public Base\n{\npublic:\n\tRefCountBaseStatVImpl() { }\n\n\t// *** Override New and Delete\n\n\t// DOM-IGNORE-BEGIN\n\t// Undef new temporarily if it is being redefined\n#ifdef OVR_DEFINE_NEW\n#undef new\n#endif\n\n#define OVR_REFCOUNTALLOC_CHECK_DELETE(class_name, p)\n\n\t// Redefine all new & delete operators.\n\tOVR_MEMORY_REDEFINE_NEW_IMPL(Base, OVR_REFCOUNTALLOC_CHECK_DELETE)\n\n#undef OVR_REFCOUNTALLOC_CHECK_DELETE\n\n#ifdef OVR_DEFINE_NEW\n#define new OVR_DEFINE_NEW\n#endif\n\t\t// OVR_BUILD_DEFINE_NEW\n\t\t// DOM-IGNORE-END\n};\n\n\n\n//-----------------------------------------------------------------------------------\n// *** End user RefCountBase<> classes\n\n\n// RefCountBase is a base class for classes that require thread-safe reference\n// counting; it also overrides the new and delete operators to use MemoryHeap.\n//\n// Reference counted objects start out with RefCount value of 1. Further lifetime\n// management is done through the AddRef() and Release() methods, typically\n// hidden by Ptr<>.\n\ntemplate<class C>\nclass RefCountBase : public RefCountBaseStatImpl<RefCountImpl>\n{\npublic:    \n    // Constructor.\n    OVR_FORCE_INLINE RefCountBase() : RefCountBaseStatImpl<RefCountImpl>() { }    \n};\n\n// RefCountBaseV is the same as RefCountBase but with virtual AddRef/Release\n\ntemplate<class C>\nclass RefCountBaseV : virtual public RefCountBaseStatVImpl<RefCountVImpl>\n{\npublic:    \n    // Constructor.\n    OVR_FORCE_INLINE RefCountBaseV() : RefCountBaseStatVImpl<RefCountVImpl>() { }    \n};\n\n\n// RefCountBaseNTS is a base class for classes that require Non-Thread-Safe reference\n// counting; it also overrides the new and delete operators to use MemoryHeap.\n// This class should only be used if all pointers to it are known to be assigned,\n// destroyed and manipulated within one thread.\n//\n// Reference counted objects start out with RefCount value of 1. Further lifetime\n// management is done through the AddRef() and Release() methods, typically\n// hidden by Ptr<>.\n\ntemplate<class C>\nclass RefCountBaseNTS : public RefCountBaseStatImpl<RefCountNTSImpl>\n{\npublic:    \n    // Constructor.\n    OVR_FORCE_INLINE RefCountBaseNTS() : RefCountBaseStatImpl<RefCountNTSImpl>() { }    \n};\n\n//-----------------------------------------------------------------------------------\n// ***** Pickable template pointer\nenum PickType { PickValue };\n\ntemplate <typename T>\nclass Pickable\n{\npublic:\n    Pickable() : pV(NULL) {}\n    explicit Pickable(T* p) : pV(p) {}\n    Pickable(T* p, PickType) : pV(p) \n    {\n        OVR_ASSERT(pV);\n        if (pV)\n            pV->AddRef();\n    }\n    template <typename OT>\n    Pickable(const Pickable<OT>& other) : pV(other.GetPtr()) {}\n\npublic:\n    Pickable& operator =(const Pickable& other)\n    {\n        OVR_ASSERT(pV == NULL);\n        pV = other.pV;\n        // Extra check.\n        //other.pV = NULL;\n        return *this;\n    }\n\npublic:\n    T* GetPtr() const { return pV; }\n    T* operator->() const\n    {\n        return pV;\n    }\n    T& operator*() const\n    {\n        OVR_ASSERT(pV);\n        return *pV;\n    }\n\nprivate:\n    T* pV;\n};\n\ntemplate <typename T>\nOVR_FORCE_INLINE\nPickable<T> MakePickable(T* p)\n{\n    return Pickable<T>(p);\n}\n\n//-----------------------------------------------------------------------------------\n// ***** Ref-Counted template pointer\n\n// Automatically AddRefs and Releases interfaces\n\nvoid* ReturnArg0(void* p);\n\ntemplate<class C>\nclass Ptr\n{\n#ifdef OVR_CC_ARM\n    static C* ReturnArg(void* p) { return (C*)ReturnArg0(p); }\n#endif\n\nprotected:\n    C   *pObject;\n\npublic:\n\n    // Constructors\n    OVR_FORCE_INLINE Ptr() : pObject(0)\n    { }\n#ifdef OVR_CC_ARM\n    OVR_FORCE_INLINE Ptr(C &robj) : pObject(ReturnArg(&robj))\n#else\n    OVR_FORCE_INLINE Ptr(C &robj) : pObject(&robj)\n#endif\n    { }\n    OVR_FORCE_INLINE Ptr(Pickable<C> v) : pObject(v.GetPtr())\n    {\n        // No AddRef() on purpose.\n    }\n    OVR_FORCE_INLINE Ptr(Ptr<C>& other, PickType) : pObject(other.pObject)\n    {\n        other.pObject = NULL;\n        // No AddRef() on purpose.\n    }\n    OVR_FORCE_INLINE Ptr(C *pobj)\n    {\n        if (pobj) pobj->AddRef();   \n        pObject = pobj;\n    }\n    OVR_FORCE_INLINE Ptr(const Ptr<C> &src)\n    {\n        if (src.pObject) src.pObject->AddRef();     \n        pObject = src.pObject;\n    }\n\n    template<class R>\n    OVR_FORCE_INLINE Ptr(Ptr<R> &src)\n    {\n        if (src) src->AddRef();\n        pObject = src;\n    }\n    template<class R>\n    OVR_FORCE_INLINE Ptr(Pickable<R> v) : pObject(v.GetPtr())\n    {\n        // No AddRef() on purpose.\n    }\n\n    // Destructor\n    OVR_FORCE_INLINE ~Ptr()\n    {\n        if (pObject) pObject->Release();        \n    }\n\n    // Compares\n    OVR_FORCE_INLINE bool operator == (const Ptr &other) const       { return pObject == other.pObject; }\n    OVR_FORCE_INLINE bool operator != (const Ptr &other) const       { return pObject != other.pObject; }\n\n    OVR_FORCE_INLINE bool operator == (C *pother) const              { return pObject == pother; }\n    OVR_FORCE_INLINE bool operator != (C *pother) const              { return pObject != pother; }\n\n\n    OVR_FORCE_INLINE bool operator < (const Ptr &other) const       { return pObject < other.pObject; }\n\n    // Assignment\n    template<class R>\n    OVR_FORCE_INLINE const Ptr<C>& operator = (const Ptr<R> &src)\n    {\n        // By design we don't check for src == pObject, as we don't expect that to be the case the large majority of the time.\n        if (src) src->AddRef();\n        if (pObject) pObject->Release();        \n        pObject = src;\n        return *this;\n    }   \n    // Specialization\n    OVR_FORCE_INLINE const Ptr<C>& operator = (const Ptr<C> &src)\n    {\n        if (src) src->AddRef();\n        if (pObject) pObject->Release();        \n        pObject = src;\n        return *this;\n    }   \n    \n    OVR_FORCE_INLINE const Ptr<C>& operator = (C *psrc)\n    {\n        if (psrc) psrc->AddRef();\n        if (pObject) pObject->Release();        \n        pObject = psrc;\n        return *this;\n    }   \n    OVR_FORCE_INLINE const Ptr<C>& operator = (C &src)\n    {       \n        if (pObject) pObject->Release();        \n        pObject = &src;\n        return *this;\n    }\n    OVR_FORCE_INLINE Ptr<C>& operator = (Pickable<C> src)\n    {\n        return Pick(src);\n    }\n    template<class R>\n    OVR_FORCE_INLINE Ptr<C>& operator = (Pickable<R> src)\n    {\n        return Pick(src);\n    }\n    \n    // Set Assignment\n    template<class R>\n    OVR_FORCE_INLINE Ptr<C>& SetPtr(const Ptr<R> &src)\n    {\n        if (src) src->AddRef();\n        if (pObject) pObject->Release();\n        pObject = src;\n        return *this;\n    }\n    // Specialization\n    OVR_FORCE_INLINE Ptr<C>& SetPtr(const Ptr<C> &src)\n    {\n        if (src) src->AddRef();\n        if (pObject) pObject->Release();\n        pObject = src;\n        return *this;\n    }   \n    \n    OVR_FORCE_INLINE Ptr<C>& SetPtr(C *psrc)\n    {\n        if (psrc) psrc->AddRef();\n        if (pObject) pObject->Release();\n        pObject = psrc;\n        return *this;\n    }   \n    OVR_FORCE_INLINE Ptr<C>& SetPtr(C &src)\n    {       \n        if (pObject) pObject->Release();\n        pObject = &src;\n        return *this;\n    }\n    OVR_FORCE_INLINE Ptr<C>& SetPtr(Pickable<C> src)\n    {       \n        return Pick(src);\n    }\n\n    // Nulls ref-counted pointer without decrement\n    OVR_FORCE_INLINE void    NullWithoutRelease()    \n    { \n        pObject = 0;    \n    }\n\n    // Clears the pointer to the object\n    OVR_FORCE_INLINE void    Clear()\n    {\n        if (pObject) pObject->Release();\n        pObject = 0;\n    }\n\n    // Obtain pointer reference directly, for D3D interfaces\n    OVR_FORCE_INLINE C*& GetRawRef()                 { return pObject; }\n\n    // Access Operators\n    OVR_FORCE_INLINE C* GetPtr() const               { return pObject; }\n    OVR_FORCE_INLINE C& operator * () const          { return *pObject; }\n    OVR_FORCE_INLINE C* operator -> ()  const        { return pObject; }\n    // Conversion                   \n    OVR_FORCE_INLINE operator C* () const            { return pObject; }\n\n    // Pickers.\n\n    // Pick a value.\n    OVR_FORCE_INLINE Ptr<C>& Pick(Ptr<C>& other)\n    {\n        if (&other != this)\n        {\n            if (pObject) pObject->Release();\n            pObject = other.pObject;\n            other.pObject = 0;\n        }\n\n        return *this;\n    }\n\n    OVR_FORCE_INLINE Ptr<C>& Pick(Pickable<C> v)\n    {\n        if (v.GetPtr() != pObject)\n        {\n            if (pObject) pObject->Release();\n            pObject = v.GetPtr();\n        }\n\n        return *this;\n    }\n\n    template<class R>\n    OVR_FORCE_INLINE Ptr<C>& Pick(Pickable<R> v)\n    {\n        if (v.GetPtr() != pObject)\n        {\n            if (pObject) pObject->Release();\n            pObject = v.GetPtr();\n        }\n\n        return *this;\n    }\n\n    OVR_FORCE_INLINE Ptr<C>& Pick(C* p)\n    {\n        if (p != pObject)\n        {\n            if (pObject) pObject->Release();\n            pObject = p;\n        }\n\n        return *this;\n    }\n};\n\n} // OVR\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_SharedMemory.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_SharedMemory.cpp\nContent     :   Inter-process shared memory subsystem\nCreated     :   June 1, 2014\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_SharedMemory.h\"\n#include \"OVR_Atomic.h\"\n#include \"OVR_Log.h\"\n#include \"OVR_String.h\"\n#include \"OVR_Array.h\"\n\n#if defined(OVR_OS_WIN32) && !defined(OVR_FAKE_SHAREDMEMORY)\n#include <Sddl.h> // ConvertStringSecurityDescriptorToSecurityDescriptor\n#endif // OVR_OS_WIN32\n\n#if (defined(OVR_OS_LINUX) || defined(OVR_OS_MAC)) && !defined(OVR_FAKE_SHAREDMEMORY)\n#include <sys/mman.h> // shm_open(), mmap()\n#include <errno.h> // error results for mmap\n#include <sys/stat.h> // mode constants\n#include <fcntl.h> // O_ constants\n#include <unistd.h> // close()\n#endif // OVR_OS_LINUX\n\nOVR_DEFINE_SINGLETON(OVR::SharedMemoryFactory);\n\nnamespace OVR {\n\n\n    //// Fake version\n\n#if defined(OVR_FAKE_SHAREDMEMORY)\n\n    class FakeMemoryBlock : public RefCountBase<FakeMemoryBlock>\n    {\n        String Name;\n        char*  Data;\n        int    SizeBytes;\n        int    References;\n\n    public:\n        FakeMemoryBlock(const String& name, int size) :\n            Name(name),\n            Data(NULL),\n            SizeBytes(size),\n            References(1)\n        {\n            Data = new char[SizeBytes];\n        }\n        ~FakeMemoryBlock()\n        {\n            delete[] Data;\n        }\n\n        bool IsNamed(const String& name)\n        {\n            return Name.CompareNoCase(name) == 0;\n        }\n        void* GetData()\n        {\n            return Data;\n        }\n        int GetSizeI()\n        {\n            return SizeBytes;\n        }\n        void IncrementReferences()\n        {\n            ++References;\n        }\n        bool DecrementReferences()\n        {\n            return --References <= 0;\n        }\n    };\n\n    class SharedMemoryInternal : public NewOverrideBase\n    {\n    public:\n        void* FileView;\n        Ptr<FakeMemoryBlock> Block;\n\n        void Close();\n\n        SharedMemoryInternal(FakeMemoryBlock* block) :\n            Block(block)\n        {\n            FileView = Block->GetData();\n        }\n        ~SharedMemoryInternal()\n        {\n            Close();\n        }\n\n        static SharedMemoryInternal* CreateSharedMemory(const SharedMemory::OpenParameters& params);\n    };\n\n\n    //// FakeMemoryManager\n\n    class FakeMemoryManager : public NewOverrideBase, public SystemSingletonBase<FakeMemoryManager>\n    {\n        OVR_DECLARE_SINGLETON(FakeMemoryManager);\n\n        Lock FakeLock;\n        Array< Ptr<FakeMemoryBlock> > FakeArray;\n\n    public:\n        SharedMemoryInternal* Open(const char *name, int bytes, bool openOnly)\n        {\n            Lock::Locker locker(&FakeLock);\n\n            const int count = FakeArray.GetSizeI();\n            for (int ii = 0; ii < count; ++ii)\n            {\n                if (FakeArray[ii]->IsNamed(name))\n                {\n                    FakeArray[ii]->IncrementReferences();\n                    return new SharedMemoryInternal(FakeArray[ii]);\n                }\n            }\n\n            if (openOnly)\n            {\n                return NULL;\n            }\n\n            Ptr<FakeMemoryBlock> data = *new FakeMemoryBlock(name, bytes);\n            FakeArray.PushBack(data);\n            return new SharedMemoryInternal(data);\n        }\n\n        void Free(FakeMemoryBlock* block)\n        {\n            Lock::Locker locker(&FakeLock);\n\n            const int count = FakeArray.GetSizeI();\n            for (int ii = 0; ii < count; ++ii)\n            {\n                if (FakeArray[ii].GetPtr() == block)\n                {\n                    // If the reference count hit zero,\n                    if (FakeArray[ii]->DecrementReferences())\n                    {\n                        // Toast\n                        FakeArray.RemoveAtUnordered(ii);\n                    }\n                    break;\n                }\n            }\n        }\n    };\n\n    FakeMemoryManager::FakeMemoryManager()\n    {\n        PushDestroyCallbacks();\n    }\n\n    FakeMemoryManager::~FakeMemoryManager()\n    {\n        OVR_ASSERT(FakeArray.GetSizeI() == 0);\n    }\n\n    void FakeMemoryManager::OnSystemDestroy()\n    {\n        delete this;\n    }\n\n\n} // namespace OVR\n\nOVR_DEFINE_SINGLETON(FakeMemoryManager);\n\nnamespace OVR {\n\n\nvoid SharedMemoryInternal::Close()\n{\n\tFakeMemoryManager::GetInstance()->Free(Block);\n\tBlock.Clear();\n}\n\nSharedMemoryInternal* SharedMemoryInternal::CreateSharedMemory(const SharedMemory::OpenParameters& params)\n{\n\treturn FakeMemoryManager::GetInstance()->Open(params.globalName, params.minSizeBytes, params.openMode == SharedMemory::OpenMode_OpenOnly);\n}\n\n#endif\n\n\n//// Windows version\n\n#if defined(OVR_OS_WIN32) && !defined(OVR_FAKE_SHAREDMEMORY)\n\n#pragma comment(lib, \"advapi32.lib\")\n\n// Hidden implementation class for OS-specific behavior\nclass SharedMemoryInternal : public NewOverrideBase\n{\npublic:\n\tHANDLE FileMapping;\n\tvoid* FileView;\n\n\tSharedMemoryInternal(HANDLE fileMapping, void* fileView) :\n\t\tFileMapping(fileMapping),\n\t\tFileView(fileView)\n\t{\n\t}\n\n\t~SharedMemoryInternal()\n\t{\n\t\t// If file view is set,\n\t\tif (FileView)\n\t\t{\n\t\t\tUnmapViewOfFile(FileView);\n\t\t\tFileView = NULL;\n\t\t}\n\n\t\t// If file mapping is set,\n\t\tif (FileMapping != NULL)\n\t\t{\n\t\t\tCloseHandle(FileMapping);\n\t\t\tFileMapping = NULL;\n\t\t}\n\t}\n\n\tstatic SharedMemoryInternal* DoFileMap(HANDLE hFileMapping, const char* fileName, bool openReadOnly, int minSize);\n\tstatic SharedMemoryInternal* AttemptOpenSharedMemory(const char* fileName, int minSize, bool openReadOnly);\n\tstatic SharedMemoryInternal* AttemptCreateSharedMemory(const char* fileName, int minSize, bool openReadOnly, bool allowRemoteWrite);\n\tstatic SharedMemoryInternal* CreateSharedMemory(const SharedMemory::OpenParameters& params);\n};\n\nSharedMemoryInternal* SharedMemoryInternal::DoFileMap(HANDLE hFileMapping, const char* fileName, bool openReadOnly, int minSize)\n{\n\t// Interpret the access mode as a map desired access code\n\tDWORD mapDesiredAccess = openReadOnly ? FILE_MAP_READ : FILE_MAP_WRITE;\n\n\t// Map view of the file to this process\n\tvoid* pFileView = MapViewOfFile(hFileMapping, mapDesiredAccess, 0, 0, minSize);\n\n\t// If mapping could not be created,\n\tif (!pFileView)\n\t{\n\t\tCloseHandle(hFileMapping);\n\n\t\tOVR_DEBUG_LOG((\"[SharedMemory] FAILURE: Unable to map view of file for %s error code = %d\", fileName, GetLastError()));\n        OVR_UNUSED(fileName);\n\t\treturn NULL;\n\t}\n\n\t// Create internal representation\n\tSharedMemoryInternal* pimple = new SharedMemoryInternal(hFileMapping, pFileView);\n\n\t// If memory allocation fails,\n\tif (!pimple)\n\t{\n\t\tUnmapViewOfFile(pFileView);\n\t\tCloseHandle(hFileMapping);\n\n\t\tOVR_DEBUG_LOG((\"[SharedMemory] FAILURE: Out of memory\"));\n\t\treturn NULL;\n\t}\n\n\treturn pimple;\n}\n\nSharedMemoryInternal* SharedMemoryInternal::AttemptOpenSharedMemory(const char* fileName, int minSize, bool openReadOnly)\n{\n\t// Interpret the access mode as a map desired access code\n\tDWORD mapDesiredAccess = openReadOnly ? FILE_MAP_READ : FILE_MAP_WRITE;\n\n\t// Open file mapping\n\tHANDLE hFileMapping = OpenFileMappingA(mapDesiredAccess, TRUE, fileName);\n\n\t// If file was mapped unsuccessfully,\n\tif (NULL == hFileMapping)\n\t{\n\t\tOVR_DEBUG_LOG((\"[SharedMemory] WARNING: Unable to open file mapping for %s error code = %d (not necessarily bad)\", fileName, GetLastError()));\n\t\treturn NULL;\n\t}\n\n\t// Map the file\n\treturn DoFileMap(hFileMapping, fileName, openReadOnly, minSize);\n}\n\nSharedMemoryInternal* SharedMemoryInternal::AttemptCreateSharedMemory(const char* fileName, int minSize, bool openReadOnly, bool allowRemoteWrite)\n{\n\t// Prepare a SECURITY_ATTRIBUTES object\n\tSECURITY_ATTRIBUTES security;\n\tZeroMemory(&security, sizeof(security));\n\tsecurity.nLength = sizeof(security);\n\n\t// Security descriptor by DACL strings:\n\t// ACE strings grant Allow(A), Object/Contains Inheritance (OICI) of:\n\t// + Grant All (GA) to System (SY)\n\t// + Grant All (GA) to Built-in Administrators (BA)\n\t// + Grant Read-Only (GR) or Read-Write (GWGR) to Interactive Users (IU) - ie. games\n\tstatic const char* DACLString_ReadOnly = \"D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GR;;;IU)\";\n\tstatic const char* DACLString_ReadWrite = \"D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GWGR;;;IU)\";\n\n\t// Select the remote process access mode\n\tconst char* remoteAccessString =\n\t\tallowRemoteWrite ? DACLString_ReadWrite : DACLString_ReadOnly;\n\n\t// Attempt to convert access string to security attributes\n\t// Note: This will allocate the security descriptor with LocalAlloc() and must be freed later\n\tBOOL bConvertOkay = ConvertStringSecurityDescriptorToSecurityDescriptorA(\n\t\tremoteAccessString, SDDL_REVISION_1, &security.lpSecurityDescriptor, NULL);\n\n\t// If conversion fails,\n\tif (!bConvertOkay)\n\t{\n\t\tOVR_DEBUG_LOG((\"[SharedMemory] FAILURE: Unable to convert access string, error code = %d\", GetLastError()));\n\t\treturn NULL;\n\t}\n\n\t// Interpret the access mode as a page protection code\n\tint pageProtectCode = openReadOnly ? PAGE_READONLY : PAGE_READWRITE;\n\n\t// Attempt to create a file mapping\n\tHANDLE hFileMapping = CreateFileMappingA(INVALID_HANDLE_VALUE,\t// From page file\n\t\t\t\t\t\t\t\t\t\t\t &security,\t\t\t\t// Security attributes\n\t\t\t\t\t\t\t\t\t\t\t pageProtectCode,\t\t// Read-only?\n\t\t\t\t\t\t\t\t\t\t\t 0,\t\t\t\t\t\t// High word for size = 0\n\t\t\t\t\t\t\t\t\t\t\t minSize,\t\t\t\t// Low word for size\n\t\t\t\t\t\t\t\t\t\t\t fileName);\t\t\t\t// Name of global shared memory file\n\n\t// Free the security descriptor buffer\n\tLocalFree(security.lpSecurityDescriptor);\n\n\t// If mapping could not be created,\n\tif (NULL == hFileMapping)\n\t{\n\t\tOVR_DEBUG_LOG((\"[SharedMemory] FAILURE: Unable to create file mapping for %s error code = %d\", fileName, GetLastError()));\n\t\treturn NULL;\n\t}\n\n#ifndef OVR_ALLOW_CREATE_FILE_MAPPING_IF_EXISTS\n\t// If the file mapping already exists,\n\tif (GetLastError() == ERROR_ALREADY_EXISTS)\n\t{\n\t\tCloseHandle(hFileMapping);\n\n\t\tOVR_DEBUG_LOG((\"[SharedMemory] FAILURE: File mapping at %s already exists\", fileName));\n\t\treturn NULL;\n\t}\n#endif\n\n\t// Map the file\n\treturn DoFileMap(hFileMapping, fileName, openReadOnly, minSize);\n}\n\nSharedMemoryInternal* SharedMemoryInternal::CreateSharedMemory(const SharedMemory::OpenParameters& params)\n{\n\tSharedMemoryInternal* retval = NULL;\n\n\t// Construct the file mapping name in a Windows-specific way\n\tOVR::String fileMappingName = params.globalName;\n\tconst char *fileName = fileMappingName.ToCStr();\n\n\t// Is being opened read-only?\n\tconst bool openReadOnly = (params.accessMode == SharedMemory::AccessMode_ReadOnly);\n\n\t// Try up to 3 times to reduce low-probability failures:\n\tstatic const int ATTEMPTS_MAX = 3;\n\tfor (int attempts = 0; attempts < ATTEMPTS_MAX; ++attempts)\n\t{\n\t\t// If opening should be attempted first,\n\t\tif (params.openMode != SharedMemory::OpenMode_CreateOnly)\n\t\t{\n\t\t\t// Attempt to open a shared memory map\n\t\t\tretval = AttemptOpenSharedMemory(fileName, params.minSizeBytes, openReadOnly);\n\n\t\t\t// If successful,\n\t\t\tif (retval)\n\t\t\t{\n\t\t\t\t// Done!\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// If creating the shared memory is also acceptable,\n\t\tif (params.openMode != SharedMemory::OpenMode_OpenOnly)\n\t\t{\n\t\t\t// Interpret create mode\n\t\t\tconst bool allowRemoteWrite = (params.remoteMode == SharedMemory::RemoteMode_ReadWrite);\n\n\t\t\t// Attempt to create a shared memory map\n\t\t\tretval = AttemptCreateSharedMemory(fileName, params.minSizeBytes, openReadOnly, allowRemoteWrite);\n\n\t\t\t// If successful,\n\t\t\tif (retval)\n\t\t\t{\n\t\t\t\t// Done!\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} // Re-attempt create/open\n\n\t// Note: On Windows the initial contents of the region are guaranteed to be zero.\n\treturn retval;\n}\n\n#endif // OVR_OS_WIN32\n\n\n#if (defined(OVR_OS_LINUX) || defined(OVR_OS_MAC)) && !defined(OVR_FAKE_SHAREDMEMORY)\n\n// Hidden implementation class for OS-specific behavior\nclass SharedMemoryInternal\n{\npublic:\n\tint   FileMapping;\n\tvoid* FileView;\n    int   FileSize;\n\n\tSharedMemoryInternal(int fileMapping, void* fileView, int fileSize) :\n\t\tFileMapping(fileMapping),\n\t\tFileView(fileView),\n        FileSize(fileSize)\n\t{\n\t}\n\n\t~SharedMemoryInternal()\n\t{\n\t\t// If file view is set,\n\t\tif (FileView)\n\t\t{\n            munmap(FileView, FileSize);\n\t\t\tFileView = MAP_FAILED;\n\t\t}\n\n\t\t// If file mapping is set,\n\t\tif (FileMapping >= 0)\n\t\t{\n            close(FileMapping);\n\t\t\tFileMapping = -1;\n\t\t}\n\t}\n\n\tstatic SharedMemoryInternal* DoFileMap(int hFileMapping, const char* fileName, bool openReadOnly, int minSize);\n\tstatic SharedMemoryInternal* AttemptOpenSharedMemory(const char* fileName, int minSize, bool openReadOnly);\n\tstatic SharedMemoryInternal* AttemptCreateSharedMemory(const char* fileName, int minSize, bool openReadOnly, bool allowRemoteWrite);\n\tstatic SharedMemoryInternal* CreateSharedMemory(const SharedMemory::OpenParameters& params);\n};\n\nSharedMemoryInternal* SharedMemoryInternal::DoFileMap(int hFileMapping, const char* fileName, bool openReadOnly, int minSize)\n{\n    // Calculate the required flags based on read/write mode\n    int prot = openReadOnly ? PROT_READ : (PROT_READ|PROT_WRITE);\n\n    // Map the file view\n    void* pFileView = mmap(NULL, minSize, prot, MAP_SHARED, hFileMapping, 0);\n\n    if (pFileView == MAP_FAILED)\n    {\n        close(hFileMapping);\n\n\t\tOVR_DEBUG_LOG((\"[SharedMemory] FAILURE: Unable to map view of file for %s error code = %d\", fileName, errno));\n        OVR_UNUSED(fileName);\n\t\treturn NULL;\n    }\n\n\t// Create internal representation\n\tSharedMemoryInternal* pimple = new SharedMemoryInternal(hFileMapping, pFileView, minSize);\n\n\t// If memory allocation fails,\n\tif (!pimple)\n\t{\n        munmap(pFileView, minSize);\n        close(hFileMapping);\n\n\t\tOVR_DEBUG_LOG((\"[SharedMemory] FAILURE: Out of memory\"));\n\t\treturn NULL;\n\t}\n\n\treturn pimple;\n}\n\nSharedMemoryInternal* SharedMemoryInternal::AttemptOpenSharedMemory(const char* fileName, int minSize, bool openReadOnly)\n{\n    // Calculate permissions and flags based on read/write mode\n    int flags = openReadOnly ? O_RDONLY : O_RDWR;\n    int perms = openReadOnly ? S_IRUSR : (S_IRUSR | S_IWUSR);\n\n    // Attempt to open the shared memory file\n    int hFileMapping = shm_open(fileName, flags, perms);\n\n    // If file was not opened successfully,\n    if (hFileMapping < 0)\n    {\n\t\tOVR_DEBUG_LOG((\"[SharedMemory] WARNING: Unable to open file mapping for %s error code = %d (not necessarily bad)\", fileName, errno));\n\t\treturn NULL;\n    }\n\n\t// Map the file\n\treturn DoFileMap(hFileMapping, fileName, openReadOnly, minSize);\n}\n\nSharedMemoryInternal* SharedMemoryInternal::AttemptCreateSharedMemory(const char* fileName, int minSize, bool openReadOnly, bool allowRemoteWrite)\n{\n    // Create mode\n    // Note: Cannot create the shared memory file read-only because then ftruncate() will fail.\n    int flags = O_CREAT | O_RDWR;\n\n#ifndef OVR_ALLOW_CREATE_FILE_MAPPING_IF_EXISTS\n    // Require exclusive access when creating (seems like a good idea without trying it yet..)\n    if (shm_unlink(fileName) < 0)\n    {\n\t\tOVR_DEBUG_LOG((\"[SharedMemory] WARNING: Unable to unlink shared memory file %s error code = %d\", fileName, errno));\n    }\n    flags |= O_EXCL;\n#endif\n\n    // Set own read/write permissions\n    int perms = openReadOnly ? S_IRUSR : (S_IRUSR|S_IWUSR);\n\n    // Allow other users to read/write the shared memory file\n    perms |= allowRemoteWrite ? (S_IWGRP|S_IWOTH|S_IRGRP|S_IROTH) : (S_IRGRP|S_IROTH);\n\n    // Attempt to open the shared memory file\n    int hFileMapping = shm_open(fileName, flags, perms);\n\n    // If file was not opened successfully,\n    if (hFileMapping < 0)\n    {\n\t\tOVR_DEBUG_LOG((\"[SharedMemory] FAILURE: Unable to create file mapping for %s error code = %d\", fileName, errno));\n\t\treturn NULL;\n    }\n\n    int truncRes = ftruncate(hFileMapping, minSize);\n\n    // If file was not opened successfully,\n    if (truncRes < 0)\n    {\n        close(hFileMapping);\n\t\tOVR_DEBUG_LOG((\"[SharedMemory] FAILURE: Unable to truncate file for %s to %d error code = %d\", fileName, minSize, errno));\n\t\treturn NULL;\n    }\n\n\t// Map the file\n\treturn DoFileMap(hFileMapping, fileName, openReadOnly, minSize);\n}\n\nSharedMemoryInternal* SharedMemoryInternal::CreateSharedMemory(const SharedMemory::OpenParameters& params)\n{\n\tSharedMemoryInternal* retval = NULL;\n\n\t// Construct the file mapping name in a Linux-specific way\n\tOVR::String fileMappingName = \"/\";\n\tfileMappingName += params.globalName;\n\tconst char *fileName = fileMappingName.ToCStr();\n\n\t// Is being opened read-only?\n\tconst bool openReadOnly = (params.accessMode == SharedMemory::AccessMode_ReadOnly);\n\n\t// Try up to 3 times to reduce low-probability failures:\n\tstatic const int ATTEMPTS_MAX = 3;\n\tfor (int attempts = 0; attempts < ATTEMPTS_MAX; ++attempts)\n\t{\n\t\t// If opening should be attempted first,\n\t\tif (params.openMode != SharedMemory::OpenMode_CreateOnly)\n\t\t{\n\t\t\t// Attempt to open a shared memory map\n\t\t\tretval = AttemptOpenSharedMemory(fileName, params.minSizeBytes, openReadOnly);\n\n\t\t\t// If successful,\n\t\t\tif (retval)\n\t\t\t{\n\t\t\t\t// Done!\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// If creating the shared memory is also acceptable,\n\t\tif (params.openMode != SharedMemory::OpenMode_OpenOnly)\n\t\t{\n            // Interpret create mode\n            const bool allowRemoteWrite = (params.remoteMode == SharedMemory::RemoteMode_ReadWrite);\n\n            // Attempt to create a shared memory map\n            retval = AttemptCreateSharedMemory(fileName, params.minSizeBytes, openReadOnly, allowRemoteWrite);\n\n            // If successful,\n            if (retval)\n            {\n                // Done!\n                break;\n            }\n\t\t}\n\t} // Re-attempt create/open\n\n\t// Note: On Windows the initial contents of the region are guaranteed to be zero.\n\treturn retval;\n}\n\n#endif // OVR_OS_LINUX\n\n\n//// SharedMemory\n\nSharedMemory::SharedMemory(int size, void* data, SharedMemoryInternal* pInternal) :\n\tSize(size),\n\tData(data),\n\tInternal(pInternal)\n{\n}\n// Call close when it goes out of scope\nSharedMemory::~SharedMemory()\n{\n\tClose();\n    delete Internal;\n}\n\nvoid SharedMemory::Close()\n{\n\tif (Internal)\n\t{\n\t\tdelete Internal;\n\t\tInternal = NULL;\n\t}\n}\n\n\n//// SharedMemoryFactory\n\nPtr<SharedMemory> SharedMemoryFactory::Open(const SharedMemory::OpenParameters& params)\n{\n\tPtr<SharedMemory> retval;\n\n\t// If no name specified or no size requested,\n\tif (!params.globalName || (params.minSizeBytes <= 0))\n\t{\n\t\tOVR_DEBUG_LOG((\"[SharedMemory] FAILURE: Invalid parameters to Create()\"));\n\t\treturn NULL;\n\t}\n\n\tOVR_DEBUG_LOG((\"[SharedMemory] Creating shared memory region: %s > %d bytes\",\n\t\tparams.globalName, params.minSizeBytes));\n\n\t// Attempt to create a shared memory region from the parameters\n\tSharedMemoryInternal* pInternal = SharedMemoryInternal::CreateSharedMemory(params);\n\n\tif (pInternal)\n\t{\n\t\t// Create the wrapper object\n\t\tretval = *new SharedMemory(params.minSizeBytes, pInternal->FileView, pInternal);\n\t}\n\n\treturn retval;\n}\n\nSharedMemoryFactory::SharedMemoryFactory()\n{\n\tOVR_DEBUG_LOG((\"[SharedMemory] Creating factory\"));\n\n    PushDestroyCallbacks();\n}\n\nSharedMemoryFactory::~SharedMemoryFactory()\n{\n\tOVR_DEBUG_LOG((\"[SharedMemory] Destroying factory\"));\n}\n\nvoid SharedMemoryFactory::OnSystemDestroy()\n{\n    delete this;\n}\n\n\n} // namespace OVR\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_SharedMemory.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR\nFilename    :   OVR_SharedMemory.h\nContent     :   Inter-process shared memory subsystem\nCreated     :   June 1, 2014\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_SharedMemory_h\n#define OVR_SharedMemory_h\n\n#include \"OVR_Types.h\"\n#include \"OVR_RefCount.h\"\n#include \"OVR_Allocator.h\"\n#include \"OVR_System.h\"\n\n#ifdef OVR_SINGLE_PROCESS /* Everything running in one process usually for debugging */\n#define OVR_FAKE_SHAREDMEMORY /* Single-process version to avoid admin privs */\n#endif\n\nnamespace OVR {\n\nclass SharedMemoryInternal; // Opaque\n\n\n// SharedMemory\n// Note: Safe when used between 32-bit and 64-bit processes\nclass SharedMemory : public RefCountBase<SharedMemory>\n{\n\tfriend class SharedMemoryFactory;\n\n\tOVR_NON_COPYABLE(SharedMemory);\n\npublic:\n\t// Only constructed by the SharedMemory Factory\n    SharedMemory(int size, void* data, SharedMemoryInternal* pInternal);\n\t// Call close when it goes out of scope\n    ~SharedMemory();\n\n\t// Modes for opening a new shared memory region\n\tenum OpenMode\n\t{\n\t\t// Note: On Windows, Create* requires Administrator priviledges or running as a Service.\n\t\tOpenMode_CreateOnly,\t\t// Must not already exist\n\t\tOpenMode_OpenOnly,\t\t\t// Must already exist\n\t\tOpenMode_CreateOrOpen\t\t// May exist or not\n\t};\n\n\t// Local access restrictions\n\tenum AccessMode\n\t{\n\t\tAccessMode_ReadOnly,\t\t// Acquire read-only access\n\t\tAccessMode_ReadWrite,\t\t// Acquire read or write access\n\t};\n\n\t// Remote access restrictions\n\tenum RemoteMode\n\t{\n\t\tRemoteMode_ReadOnly,\t\t// Other processes will need to open in read-only mode\n\t\tRemoteMode_ReadWrite\t\t// Other processes can open in read-write mode\n\t};\n\n\t// Modes for opening a new shared memory region\n\tstruct OpenParameters\n\t{\n\t\tOpenParameters() :\n\t\t\tglobalName(NULL),\n\t\t\tminSizeBytes(0),\n\t\t\topenMode(SharedMemory::OpenMode_CreateOrOpen),\n\t\t\tremoteMode(SharedMemory::RemoteMode_ReadWrite),\n\t\t\taccessMode(SharedMemory::AccessMode_ReadWrite)\n\t\t{\n\t\t}\n\n\t\t// Creation parameters\n\t\tconst char*\t\t\t\t\tglobalName;\t\t// Name of the shared memory region\n\t\tint\t\t\t\t\t\t\tminSizeBytes;\t// Minimum number of bytes to request\n\t\tSharedMemory::OpenMode\t\topenMode;\t\t// Creating the file or opening the file?\n\t\tSharedMemory::RemoteMode\tremoteMode;\t\t// When creating, what access should other processes get?\n\t\tSharedMemory::AccessMode\taccessMode;\t\t// When opening/creating, what access should this process get?\n\t};\n\npublic:\n\t// Returns the size of the shared memory region\n\tint GetSizeI() const\n\t{\n\t\treturn Size;\n\t}\n\n\t// Returns the process-local pointer to the shared memory region\n\t// Note: This may be different on different processes\n\tvoid* GetData() const\n\t{\n\t\treturn Data;\n\t}\n\nprotected:\n\tint Size;\t\t// How many shared bytes are shared at the pointer address?\n\tvoid* Data;\t\t// Pointer to the shared memory region.\n\n\t// Hidden implementation class for OS-specific behavior\n\tSharedMemoryInternal* Internal;\n\n\t// Close and cleanup the shared memory region\n\t// Note: This is called on destruction\n\tvoid Close();\n};\n\n\n// SharedMemoryFactory\nclass SharedMemoryFactory : public NewOverrideBase, public SystemSingletonBase<SharedMemoryFactory>\n{\n    OVR_DECLARE_SINGLETON(SharedMemoryFactory);\n\npublic:\n    // Construct a SharedMemory object.\n\t// Note: The new object is reference-counted so it should be stored with Ptr<>.  Initial reference count is 1.\n\tPtr<SharedMemory> Open(const SharedMemory::OpenParameters&);\n};\n\n\n// A shared object\n// Its constructor will be called when creating a writer\n// Its destructor will not be called\ntemplate<class SharedType>\nclass ISharedObject : public NewOverrideBase\n{\npublic:\n\tstatic const int RegionSize = (int)sizeof(SharedType);\n\nprotected:\n\tPtr<SharedMemory> pSharedMemory;\n\n\tbool Open(const char* name, bool readOnly)\n\t{\n\t\t// Configure open parameters based on read-only mode\n\t\tSharedMemory::OpenParameters params;\n\n        // FIXME: This is a hack.  We currently need to allow clients to open this for read-write even\n        // though they only need read-only access.  This is because in the first 0.4 release the\n        // LocklessUpdater class technically writes to it (increments by 0) to read from the space.\n        // This was quickly corrected in 0.4.1 and we are waiting for the right time to disallow write\n        // access when everyone upgrades to 0.4.1+.\n        //params.remoteMode = SharedMemory::RemoteMode_ReadOnly;\n        params.remoteMode = SharedMemory::RemoteMode_ReadWrite;\n\n        params.globalName = name;\n        params.accessMode = readOnly ? SharedMemory::AccessMode_ReadOnly : SharedMemory::AccessMode_ReadWrite;\n        params.minSizeBytes = RegionSize;\n\t\tparams.openMode = readOnly ? SharedMemory::OpenMode_OpenOnly : SharedMemory::OpenMode_CreateOrOpen;\n\n\t\t// Attempt to open the shared memory file\n\t\tpSharedMemory = SharedMemoryFactory::GetInstance()->Open(params);\n\n\t\t// If it was not able to be opened,\n\t\tif (pSharedMemory && pSharedMemory->GetSizeI() >= RegionSize && pSharedMemory->GetData())\n\t\t{\n\t\t\t// If writing,\n\t\t\tif (!readOnly)\n\t\t\t{\n\t\t\t\t// Construct the object also\n\t\t\t\tConstruct<SharedType>(pSharedMemory->GetData());\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tSharedType* Get() const\n\t{\n\t\tif (!pSharedMemory)\n\t\t{\n\t\t\treturn NULL;\n\t\t}\n\n\t\tvoid* data = pSharedMemory->GetData();\n\t\tif (!data)\n\t\t{\n\t\t\treturn NULL;\n\t\t}\n\n\t\treturn reinterpret_cast<SharedType*>(data);\n\t}\n};\n\n// Writer specialized shared object: Ctor will be called on Open()\ntemplate<class SharedType>\nclass SharedObjectWriter : public ISharedObject<SharedType>\n{\npublic:\n\tOVR_FORCE_INLINE bool Open(const char* name)\n\t{\n\t\treturn ISharedObject<SharedType>::Open(name, false);\n\t}\n\tOVR_FORCE_INLINE SharedType* Get()\n\t{\n\t\treturn ISharedObject<SharedType>::Get();\n\t}\n};\n\n// Reader specialized shared object: Ctor will not be called\ntemplate<class SharedType>\nclass SharedObjectReader : public ISharedObject<SharedType>\n{\npublic:\n\tOVR_FORCE_INLINE bool Open(const char* name)\n\t{\n\t\treturn ISharedObject<SharedType>::Open(name, true);\n\t}\n\tOVR_FORCE_INLINE const SharedType* Get() const\n\t{\n\t\treturn ISharedObject<SharedType>::Get();\n\t}\n};\n\n\n} // namespace OVR\n\n#endif // OVR_SharedMemory_h\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Std.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Std.cpp\nContent     :   Standard C function implementation\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_Std.h\"\n#include \"OVR_Alg.h\"\n\n// localeconv() call in OVR_strtod()\n#include <locale.h>\n\nnamespace OVR {\n\n// Source for functions not available on all platforms is included here.\n\nsize_t OVR_CDECL OVR_strlcpy(char* dest, const char* src, size_t destsize)\n{\n    const char* s = src;\n    size_t      n = destsize;\n\n    if(n && --n)\n    {\n        do{\n            if((*dest++ = *s++) == 0)\n                break;\n        } while(--n);\n    }\n\n    if(!n)\n    {\n        if(destsize)\n            *dest = 0;\n        while(*s++)\n            { }\n    }\n\n    return (size_t)((s - src) - 1);\n}\n\n\nsize_t OVR_CDECL OVR_strlcat(char* dest, const char* src, size_t destsize)\n{\n    const size_t d = destsize ? OVR_strlen(dest) : 0;\n    const size_t s = OVR_strlen(src);\n    const size_t t = s + d;\n\n    OVR_ASSERT((destsize == 0) || (d < destsize));\n\n    if(t < destsize)\n        memcpy(dest + d, src, (s + 1) * sizeof(*src));\n    else\n    {\n        if(destsize)\n        {\n            memcpy(dest + d, src, ((destsize - d) - 1) * sizeof(*src));\n            dest[destsize - 1] = 0;\n        }\n    }\n\n    return t;\n}\n\n\n// Case insensitive compare implemented in platform-specific way.\nint OVR_CDECL OVR_stricmp(const char* a, const char* b)\n{\n#if defined(OVR_OS_MS)\n    #if defined(OVR_CC_MSVC) && (OVR_CC_MSVC >= 1400)\n        return ::_stricmp(a, b);\n    #else\n        return ::stricmp(a, b);\n    #endif\n\n#else\n    return strcasecmp(a, b);\n#endif\n}\n\nint OVR_CDECL OVR_strnicmp(const char* a, const char* b, size_t count)\n{\n#if defined(OVR_OS_MS)\n    #if defined(OVR_CC_MSVC) && (OVR_CC_MSVC >= 1400)\n        return ::_strnicmp(a, b, count);\n    #else\n        return ::strnicmp(a, b, count);\n    #endif\n\n#else\n    return strncasecmp(a, b, count);\n#endif\n}\n\nwchar_t* OVR_CDECL OVR_wcscpy(wchar_t* dest, size_t destsize, const wchar_t* src)\n{\n#if defined(OVR_MSVC_SAFESTRING)\n    wcscpy_s(dest, destsize, src);\n    return dest;\n#elif defined(OVR_OS_MS)\n    OVR_UNUSED(destsize);\n    wcscpy(dest, src);\n    return dest;\n#else\n    size_t l = OVR_wcslen(src) + 1; // incl term null\n    l = (l < destsize) ? l : destsize;\n    memcpy(dest, src, l * sizeof(wchar_t));\n    return dest;\n#endif\n}\n\nwchar_t* OVR_CDECL OVR_wcsncpy(wchar_t* dest, size_t destsize, const wchar_t* src, size_t count)\n{\n#if defined(OVR_MSVC_SAFESTRING)\n    wcsncpy_s(dest, destsize, src, count);\n    return dest;\n#else\n    size_t srclen = OVR_wcslen(src);\n    size_t l = Alg::Min(srclen, count);\n    l = (l < destsize) ? l : destsize;\n    memcpy(dest, src, l * sizeof(wchar_t));\n    if (count > srclen)\n    {\n        size_t remLen = Alg::Min(destsize - l, (count - srclen));\n        memset(&dest[l], 0, sizeof(wchar_t)*remLen);\n    }\n    else if (l < destsize)\n        dest[l] = 0;\n    return dest;\n#endif\n}\n\n\nwchar_t* OVR_CDECL OVR_wcscat(wchar_t* dest, size_t destsize, const wchar_t* src)\n{\n#if defined(OVR_MSVC_SAFESTRING)\n    wcscat_s(dest, destsize, src);\n    return dest;\n#elif defined(OVR_OS_MS)\n    OVR_UNUSED(destsize);\n    wcscat(dest, src);\n    return dest;\n#else\n    size_t dstlen = OVR_wcslen(dest); // do not incl term null\n    size_t srclen = OVR_wcslen(src) + 1; // incl term null\n    size_t copylen = (dstlen + srclen < destsize) ? srclen : destsize - dstlen;\n    memcpy(dest + dstlen, src, copylen * sizeof(wchar_t));\n    return dest;\n#endif\n}\n\nsize_t  OVR_CDECL OVR_wcslen(const wchar_t* str)\n{\n#if defined(OVR_OS_MS)\n    return wcslen(str);\n#else\n    size_t i = 0;\n    while(str[i] != '\\0')\n        ++i;\n    return i;\n#endif\n}\n\nint OVR_CDECL OVR_wcscmp(const wchar_t* a, const wchar_t* b)\n{\n#if defined(OVR_OS_MS) || defined(OVR_OS_LINUX)\n    return wcscmp(a, b);\n#else\n    // not supported, use custom implementation\n    const wchar_t *pa = a, *pb = b;\n    while (*pa && *pb)\n    {\n        wchar_t ca = *pa;\n        wchar_t cb = *pb;\n        if (ca < cb)\n            return -1;\n        else if (ca > cb)\n            return 1;\n        pa++;\n        pb++;\n    }\n    if (*pa)\n        return 1;\n    else if (*pb)\n        return -1;\n    else\n        return 0;\n#endif\n}\n\nint OVR_CDECL OVR_wcsicmp(const wchar_t* a, const wchar_t* b)\n{\n#if defined(OVR_OS_MS)\n    #if defined(OVR_CC_MSVC) && (OVR_CC_MSVC >= 1400)\n        return ::_wcsicmp(a, b);\n    #else\n        return ::wcsicmp(a, b);\n    #endif\n#elif defined(OVR_OS_MAC) || defined(__CYGWIN__) || defined(OVR_OS_ANDROID) || defined(OVR_OS_IPHONE)\n    // not supported, use custom implementation\n    const wchar_t *pa = a, *pb = b;\n    while (*pa && *pb)\n    {\n        wchar_t ca = OVR_towlower(*pa);\n        wchar_t cb = OVR_towlower(*pb);\n        if (ca < cb)\n            return -1;\n        else if (ca > cb)\n            return 1;\n        pa++;\n        pb++;\n    }\n    if (*pa)\n        return 1;\n    else if (*pb)\n        return -1;\n    else\n        return 0;\n#else\n    return wcscasecmp(a, b);\n#endif\n}\n\n// This function is not inline because of dependency on <locale.h>\ndouble OVR_CDECL OVR_strtod(const char* str, char** tailptr)\n{\n#if !defined(OVR_OS_ANDROID) // The Android C library doesn't have localeconv.\n    const char s = *localeconv()->decimal_point;\n\n    if (s != '.') // If the C library is using a locale that is not using '.' as a decimal point, we convert the input str's '.' chars to the char that the C library expects (e.g. ',' or ' ').\n    {\n        char buffer[347 + 1];\n\n        OVR_strcpy(buffer, sizeof(buffer), str);\n\n        // Ensure null-termination of string\n        buffer[sizeof(buffer)-1] = '\\0';\n\n        for (char* c = buffer; *c != '\\0'; ++c)\n        {\n            if (*c == '.')\n            {\n                *c = s;\n                break;\n            }\n        }\n\n        char *nextPtr = NULL;\n        double retval = strtod(buffer, &nextPtr);\n\n        // If a tail pointer is requested,\n        if (tailptr)\n        {\n            // Return a tail pointer that points to the same offset as nextPtr, in the orig string\n            *tailptr = !nextPtr ? NULL : (char*)str + (int)(nextPtr - buffer);\n        }\n\n        return retval;\n    }\n#endif\n\n    return strtod(str, tailptr);\n}\n\n\n#ifndef OVR_NO_WCTYPE\n\n//// Use this class to generate Unicode bitsets. For example:\n////\n//// UnicodeBitSet bitSet;\n//// for(unsigned i = 0; i < 65536; ++i)\n//// {\n////     if (iswalpha(i))\n////         bitSet.Set(i);\n//// }\n//// bitSet.Dump();\n////\n////---------------------------------------------------------------\n//class UnicodeBitSet\n//{\n//public:\n//    UnicodeBitSet()\n//    {\n//        memset(Offsets, 0, sizeof(Offsets));\n//        memset(Bits,    0, sizeof(Bits));\n//    }\n//\n//    void Set(unsigned bit) { Bits[bit >> 8][(bit >> 4) & 15] |= 1 << (bit & 15); }\n//\n//    void Dump()\n//    {\n//        unsigned i, j;\n//        unsigned offsetCount = 0;\n//        for(i = 0; i < 256; ++i)\n//        {\n//            if (isNull(i)) Offsets[i] = 0;\n//            else\n//            if (isFull(i)) Offsets[i] = 1;\n//            else           Offsets[i] = uint16_t(offsetCount++ * 16 + 256);\n//        }\n//        for(i = 0; i < 16; ++i)\n//        {\n//            for(j = 0; j < 16; ++j)\n//            {\n//                printf(\"%5u,\", Offsets[i*16+j]);\n//            }\n//            printf(\"\\n\");\n//        }\n//        for(i = 0; i < 256; ++i)\n//        {\n//            if (Offsets[i] > 255)\n//            {\n//                for(j = 0; j < 16; j++)\n//                {\n//                    printf(\"%5u,\", Bits[i][j]);\n//                }\n//                printf(\"\\n\");\n//            }\n//        }\n//    }\n//\n//private:\n//    bool isNull(unsigned n) const\n//    {\n//        const uint16_t* p = Bits[n];\n//        for(unsigned i = 0; i < 16; ++i)\n//            if (p[i] != 0) return false;\n//        return true;\n//    }\n//\n//    bool isFull(unsigned n) const\n//    {\n//        const uint16_t* p = Bits[n];\n//        for(unsigned i = 0; i < 16; ++i)\n//            if (p[i] != 0xFFFF) return false;\n//        return true;\n//    }\n//\n//    uint16_t Offsets[256];\n//    uint16_t Bits[256][16];\n//};\n\n\nconst uint16_t UnicodeAlnumBits[] = {\n  256,    1,  272,  288,  304,  320,  336,  352,    0,  368,  384,  400,  416,  432,  448,  464,\n  480,  496,  512,  528,  544,    1,  560,  576,  592,    0,    0,    0,    0,    0,  608,  624,\n  640,  656,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n  672,  688,    0,    0,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,  704,    1,    1,\n    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,  720,\n    1,    1,    1,    1,  736,    0,    0,    0,    0,    0,    0,    0,    1,    1,    1,    1,\n    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n    1,    1,    1,    1,    1,    1,    1,  752,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    1,  768,  784,    1,  800,  816,  832,\n    0,    0,    0, 1023,65534, 2047,65534, 2047,    0,    0,    0,  524,65535,65407,65535,65407,\n65535,65535,65532,   15,    0,65535,65535,65535,65535,65535,16383,63999,    3,    0,16415,    0,\n    0,    0,    0,    0,   32,    0,    0, 1024,55104,65535,65531,65535,32767,64767,65535,   15,\n65535,65535,65535,65535,65535,65535,65535,65535,61443,65535,65535,65535, 6559,65535,65535,  831,\n    0,    0,    0,65534,65535,  639,65534,65535,  255,    0,    0,    0,    0,65535, 2047,    7,\n    0,    0,65534, 2047,65534,   63, 1023,65535,65535,65535,65535,65535,65535, 8175, 8702, 8191,\n    0,65535, 8191,65535,    0,    0,    0,    0,65535,65535,65535,    1,    0,    0,    0,    0,\n65518,65535,65535,58367, 8191,65281,65487,    0,40942,65529,65023,50117, 6559,45184,65487,    3,\n34788,65529,65023,50029, 6535,24064,65472,   31,45038,65531,65023,58349, 7103,    1,65473,    0,\n40942,65529,65023,58317, 6543,45248,65475,    0,51180,54845,50968,50111, 7623,  128,65408,    0,\n57326,65533,65023,50159, 7647,   96,65475,    0,57324,65533,65023,50159, 7647,16480,65475,    0,\n57324,65533,65023,50175, 7631,  128,65475,    0,65516,64639,65535,12283,32895,65375,    0,   12,\n65534,65535,65535, 2047,32767, 1023,    0,    0, 9622,65264,60590,15359, 8223,13311,    0,    0,\n    1,    0, 1023,    0,65279,65535, 2047,65534, 3843,65279,65535, 8191,    0,    0,    0,    0,\n65535,65535,63227,  327, 1023, 1023,    0,    0,    0,    0,65535,65535,   63,65535,65535,  127,\n65535,65535,65535,65535,65535,33791,65535,65535,65535,65535,65287,65535,65535,65535,65535, 1023,\n65407,65535,65535,65535,15743,15743,65535,65535,15743,65535,32767,32573,32573,65407,32767,65535,\n32767,32573,65535,65535,65407, 2047,65024,    3,    0,    0,65535,65535,65535,65535,65535,   31,\n65534,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,\n65535,65535,65535,65535,65535,65535,40959,  127,65534, 2047,65535,65535,65535,65535, 2047,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,65535,65535,65535,65535,  511,    0, 1023,    0,\n    0, 1023,65535,65535,65527,65535,65535,  255,65535,65535, 1023,    0,    0,    0,    0,    0,\n65535,65535,65535,65535,65535,65535,65535,65535,65535, 4095,65535,65535,65535,65535,65535, 1023,\n65535,16191,65535,65535,16191,43775,65535,16383,65535,65535,65535,24543, 8156, 4047, 8191, 8156,\n    0,    0,    0,    0,    0,    0,    0,32768,    0,    0,    0,    0,    0,    0,    0,    0,\n64644,15919,48464, 1019,    0,    0,65535,65535,   15,    0,    0,    0,    0,    0,    0,    0,\n  192,    0, 1022, 1792,65534,65535,65535,65535,65535,   31,65534,65535,65535,65535,65535, 2047,\n65504,65535, 8191,65534,65535,65535,65535,65535,32767,    0,65535,  255,    0,    0,    0,    0,\n65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,   63,    0,    0,    0,    0,\n65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,   63,    0,    0,    0,    0,    0,\n65535,65535,65535,65535,65535,65535,65535,65535, 8191,    0,    0,    0,    0,    0,    0,    0,\n65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,   15,    0,    0,    0,    0,    0,\n65535,65535,16383,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n  127,41208,65023,24447,65499,65535,65535,65535,65535,65535,65535,    3,    0,65528,65535,65535,\n65535,65535,65535,16383,    0,65535,65535,65535,65535,65532,65535,65535,  255,    0,    0, 4095,\n    0,    0,    0,    0,    0,    0,    0,65495,65535,65535,65535,65535,65535,65535,65535, 8191,\n    0, 1023,65534, 2047,65534, 2047,65472,65534,65535,16383,65535,32767,64764, 7420,    0,    0};\n\nconst uint16_t UnicodeAlphaBits[] = {\n  256,    1,  272,  288,  304,  320,  336,  352,    0,  368,  384,  400,  416,  432,  448,  464,\n  480,  496,  512,  528,  544,    1,  560,  576,  592,    0,    0,    0,    0,    0,  608,  624,\n  640,  656,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n  672,  688,    0,    0,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,  704,    1,    1,\n    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,  720,\n    1,    1,    1,    1,  736,    0,    0,    0,    0,    0,    0,    0,    1,    1,    1,    1,\n    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n    1,    1,    1,    1,    1,    1,    1,  752,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    1,  768,  784,    1,  800,  816,  832,\n    0,    0,    0,    0,65534, 2047,65534, 2047,    0,    0,    0,    0,65535,65407,65535,65407,\n65535,65535,65532,   15,    0,65535,65535,65535,65535,65535,16383,63999,    3,    0,16415,    0,\n    0,    0,    0,    0,   32,    0,    0, 1024,55104,65535,65531,65535,32767,64767,65535,   15,\n65535,65535,65535,65535,65535,65535,65535,65535,61443,65535,65535,65535, 6559,65535,65535,  831,\n    0,    0,    0,65534,65535,  639,65534,65535,  255,    0,    0,    0,    0,65535, 2047,    7,\n    0,    0,65534, 2047,65534,   63,    0,65535,65535,65535,65535,65535,65535, 8175, 8702, 7168,\n    0,65535, 8191,65535,    0,    0,    0,    0,65535,65535,65535,    1,    0,    0,    0,    0,\n65518,65535,65535,58367, 8191,65281,   15,    0,40942,65529,65023,50117, 6559,45184,   15,    3,\n34788,65529,65023,50029, 6535,24064,    0,   31,45038,65531,65023,58349, 7103,    1,    1,    0,\n40942,65529,65023,58317, 6543,45248,    3,    0,51180,54845,50968,50111, 7623,  128,    0,    0,\n57326,65533,65023,50159, 7647,   96,    3,    0,57324,65533,65023,50159, 7647,16480,    3,    0,\n57324,65533,65023,50175, 7631,  128,    3,    0,65516,64639,65535,12283,32895,65375,    0,   12,\n65534,65535,65535, 2047,32767,    0,    0,    0, 9622,65264,60590,15359, 8223,12288,    0,    0,\n    1,    0,    0,    0,65279,65535, 2047,65534, 3843,65279,65535, 8191,    0,    0,    0,    0,\n65535,65535,63227,  327,    0, 1023,    0,    0,    0,    0,65535,65535,   63,65535,65535,  127,\n65535,65535,65535,65535,65535,33791,65535,65535,65535,65535,65287,65535,65535,65535,65535, 1023,\n65407,65535,65535,65535,15743,15743,65535,65535,15743,65535,32767,32573,32573,65407,32767,65535,\n32767,32573,65535,65535,65407, 2047,    0,    0,    0,    0,65535,65535,65535,65535,65535,   31,\n65534,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,\n65535,65535,65535,65535,65535,65535,40959,  127,65534, 2047,65535,65535,65535,65535, 2047,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,65535,65535,65535,65535,  511,    0,    0,    0,\n    0,    0,65535,65535,65527,65535,65535,  255,65535,65535, 1023,    0,    0,    0,    0,    0,\n65535,65535,65535,65535,65535,65535,65535,65535,65535, 4095,65535,65535,65535,65535,65535, 1023,\n65535,16191,65535,65535,16191,43775,65535,16383,65535,65535,65535,24543, 8156, 4047, 8191, 8156,\n    0,    0,    0,    0,    0,    0,    0,32768,    0,    0,    0,    0,    0,    0,    0,    0,\n64644,15919,48464, 1019,    0,    0,65535,65535,   15,    0,    0,    0,    0,    0,    0,    0,\n  192,    0, 1022, 1792,65534,65535,65535,65535,65535,   31,65534,65535,65535,65535,65535, 2047,\n65504,65535, 8191,65534,65535,65535,65535,65535,32767,    0,65535,  255,    0,    0,    0,    0,\n65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,   63,    0,    0,    0,    0,\n65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,   63,    0,    0,    0,    0,    0,\n65535,65535,65535,65535,65535,65535,65535,65535, 8191,    0,    0,    0,    0,    0,    0,    0,\n65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,   15,    0,    0,    0,    0,    0,\n65535,65535,16383,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n  127,41208,65023,24447,65499,65535,65535,65535,65535,65535,65535,    3,    0,65528,65535,65535,\n65535,65535,65535,16383,    0,65535,65535,65535,65535,65532,65535,65535,  255,    0,    0, 4095,\n    0,    0,    0,    0,    0,    0,    0,65495,65535,65535,65535,65535,65535,65535,65535, 8191,\n    0,    0,65534, 2047,65534, 2047,65472,65534,65535,16383,65535,32767,64764, 7420,    0,    0};\n\nconst uint16_t UnicodeDigitBits[] = {\n  256,    0,    0,    0,    0,    0,  272,    0,    0,  288,  304,  320,  336,  352,  368,  384,\n  400,    0,    0,  416,    0,    0,    0,  432,  448,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,  464,\n    0,    0,    0, 1023,    0,    0,    0,    0,    0,    0,    0,  524,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0, 1023,    0,    0,    0,    0,    0,    0,    0,    0, 1023,\n    0,    0,    0,    0,    0,    0,65472,    0,    0,    0,    0,    0,    0,    0,65472,    0,\n    0,    0,    0,    0,    0,    0,65472,    0,    0,    0,    0,    0,    0,    0,65472,    0,\n    0,    0,    0,    0,    0,    0,65472,    0,    0,    0,    0,    0,    0,    0,65408,    0,\n    0,    0,    0,    0,    0,    0,65472,    0,    0,    0,    0,    0,    0,    0,65472,    0,\n    0,    0,    0,    0,    0,    0,65472,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0, 1023,    0,    0,    0,    0,    0,    0,    0, 1023,    0,    0,\n    0,    0, 1023,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0, 1023,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,65024,    3,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 1023,    0,\n    0, 1023,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0, 1023,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0};\n\nconst uint16_t UnicodeSpaceBits[] = {\n  256,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,  272,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n  288,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n  304,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n15872,    0,    1,    0,    0,    0,    0,    0,    0,    0,    1,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    1,    0,    0,    0,    0,    0,    0,    0,\n 4095,    0,33536,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    1,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0};\n\nconst uint16_t UnicodeXDigitBits[] = {\n  256,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,  272,\n    0,    0,    0, 1023,  126,    0,  126,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0, 1023,  126,    0,  126,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0};\n\n// Uncomment if necessary\n//const uint16_t UnicodeCntrlBits[] = {\n//  256,    0,    0,    0,    0,    0,    0,  272,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,  288,    0,    0,    0,    0,    0,    0,    0,\n//  304,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,  320,  336,\n//65535,65535,    0,    0,    0,    0,    0,32768,65535,65535,    0,    0,    0,    0,    0,    0,\n//32768,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//30720,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//61440,    0,31744,    0,    0,    0,64512,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,32768,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 3584};\n//\n//const uint16_t UnicodeGraphBits[] = {\n//  256,    1,  272,  288,  304,  320,  336,  352,    0,  368,  384,  400,  416,  432,  448,  464,\n//  480,  496,  512,  528,  544,    1,  560,  576,  592,    0,    0,    0,    0,    0,  608,  624,\n//  640,  656,    0,  672,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//  688,  704,    0,    0,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n//    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,  720,    1,    1,\n//    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n//    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n//    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n//    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n//    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,  736,\n//    1,    1,    1,    1,  752,    0,    0,    0,    0,    0,    0,    0,    1,    1,    1,    1,\n//    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n//    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n//    1,    1,    1,    1,    1,    1,    1,  768,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    1,  784,  800,    1,  816,  832,  848,\n//    0,    0,65534,65535,65535,65535,65535,32767,    0,    0,65534,65535,65535,65535,65535,65535,\n//65535,65535,65532,   15,    0,65535,65535,65535,65535,65535,16383,63999,    3,    0,16415,    0,\n//    0,    0,    0,    0,   32,    0,    0,17408,55232,65535,65531,65535,32767,64767,65535,   15,\n//65535,65535,65535,65535,65535,65535,65535,65535,61443,65535,65535,65535, 6559,65535,65535,  831,\n//    0,    0,    0,65534,65535,65151,65534,65535, 1791,    0,    0,16384,    9,65535, 2047,   31,\n// 4096,34816,65534, 2047,65534,   63,16383,65535,65535,65535,65535,65535,65535, 8191, 8702, 8191,\n//16383,65535, 8191,65535,    0,    0,    0,    0,65535,65535,65535,    1,    0,    0,    0,    0,\n//65518,65535,65535,58367, 8191,65281,65535,    1,40942,65529,65023,50117, 6559,45184,65487,    3,\n//34788,65529,65023,50029, 6535,24064,65472,   31,45038,65531,65023,58349, 7103,    1,65473,    0,\n//40942,65529,65023,58317, 6543,45248,65475,    0,51180,54845,50968,50111, 7623,  128,65408,    0,\n//57326,65533,65023,50159, 7647,   96,65475,    0,57324,65533,65023,50159, 7647,16480,65475,    0,\n//57324,65533,65023,50175, 7631,  128,65475,    0,65516,64639,65535,12283,32895,65375,    0,   28,\n//65534,65535,65535, 2047,65535, 4095,    0,    0, 9622,65264,60590,15359, 8223,13311,    0,    0,\n//65521,    7, 1023,15360,65279,65535, 2047,65534, 3875,65279,65535, 8191,    0,    0,    0,    0,\n//65535,65535,63227,  327,65535, 1023,    0,    0,    0,    0,65535,65535,   63,65535,65535, 2175,\n//65535,65535,65535,65535,65535,33791,65535,65535,65535,65535,65287,65535,65535,65535,65535, 1023,\n//65407,65535,65535,65535,15743,15743,65535,65535,15743,65535,32767,32573,32573,65407,32767,65535,\n//32767,32573,65535,65535,65407, 2047,65534,    3,    0,    0,65535,65535,65535,65535,65535,   31,\n//65534,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,\n//65535,65535,65535,65535,65535,65535,65535,  127,65534, 8191,65535,65535,65535,65535,16383,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,65535,65535,65535,65535,  511, 6128, 1023,    0,\n// 2047, 1023,65535,65535,65527,65535,65535,  255,65535,65535, 1023,    0,    0,    0,    0,    0,\n//65535,65535,65535,65535,65535,65535,65535,65535,65535, 4095,65535,65535,65535,65535,65535, 1023,\n//65535,16191,65535,65535,16191,43775,65535,16383,65535,65535,65535,24543, 8156, 4047, 8191, 8156,\n//    0,65535,  255,65535,16239,    0,    0,57344,24576,    0,    0,    0,    0,    0,    0,    0,\n//64644,15919,48464, 1019,    0,    0,65535,65535,   15,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0, 1536,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//65486,65523, 1022, 1793,65534,65535,65535,65535,65535,   31,65534,65535,65535,65535,65535, 4095,\n//65504,65535, 8191,65534,65535,65535,65535,65535,32767,    0,65535,  255,    0,    0,    0,    0,\n//65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,   63,    0,    0,    0,    0,\n//65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,   63,    0,    0,    0,    0,    0,\n//65535,65535,65535,65535,65535,65535,65535,65535, 8191,    0,    0,    0,    0,    0,    0,    0,\n//65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,   15,    0,    0,    0,    0,    0,\n//65535,65535,16383,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//  127,41208,65023,24447,65499,65535,65535,65535,65535,65535,65535,    3,    0,65528,65535,65535,\n//65535,65535,65535,65535,    0,65535,65535,65535,65535,65532,65535,65535,  255,    0,    0, 4095,\n//    0,    0,    0,65535,65055,65527, 3339,65495,65535,65535,65535,65535,65535,65535,65535, 8191,\n//63470,36863,65535,49151,65534,12287,65534,65534,65535,16383,65535,32767,64764, 7420,    0,    0};\n//\n//const uint16_t UnicodePrintBits[] = {\n//  256,    1,  272,  288,  304,  320,  336,  352,    0,  368,  384,  400,  416,  432,  448,  464,\n//  480,  496,  512,  528,  544,    1,  560,  576,  592,    0,    0,    0,    0,    0,  608,  624,\n//  640,  656,    0,  672,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//  688,  704,    0,    0,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n//    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,  720,    1,    1,\n//    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n//    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n//    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n//    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n//    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,  736,\n//    1,    1,    1,    1,  752,    0,    0,    0,    0,    0,    0,    0,    1,    1,    1,    1,\n//    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n//    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n//    1,    1,    1,    1,    1,    1,    1,  768,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    1,  784,  800,    1,  816,  832,  848,\n//  512,    0,65535,65535,65535,65535,65535,32767,    0,    0,65535,65535,65535,65535,65535,65535,\n//65535,65535,65532,   15,    0,65535,65535,65535,65535,65535,16383,63999,    3,    0,16415,    0,\n//    0,    0,    0,    0,   32,    0,    0,17408,55232,65535,65531,65535,32767,64767,65535,   15,\n//65535,65535,65535,65535,65535,65535,65535,65535,61443,65535,65535,65535, 6559,65535,65535,  831,\n//    0,    0,    0,65534,65535,65151,65534,65535, 1791,    0,    0,16384,    9,65535, 2047,   31,\n// 4096,34816,65534, 2047,65534,   63,16383,65535,65535,65535,65535,65535,65535, 8191, 8702, 8191,\n//16383,65535, 8191,65535,    0,    0,    0,    0,65535,65535,65535,    1,    0,    0,    0,    0,\n//65518,65535,65535,58367, 8191,65281,65535,    1,40942,65529,65023,50117, 6559,45184,65487,    3,\n//34788,65529,65023,50029, 6535,24064,65472,   31,45038,65531,65023,58349, 7103,    1,65473,    0,\n//40942,65529,65023,58317, 6543,45248,65475,    0,51180,54845,50968,50111, 7623,  128,65408,    0,\n//57326,65533,65023,50159, 7647,   96,65475,    0,57324,65533,65023,50159, 7647,16480,65475,    0,\n//57324,65533,65023,50175, 7631,  128,65475,    0,65516,64639,65535,12283,32895,65375,    0,   28,\n//65534,65535,65535, 2047,65535, 4095,    0,    0, 9622,65264,60590,15359, 8223,13311,    0,    0,\n//65521,    7, 1023,15360,65279,65535, 2047,65534, 3875,65279,65535, 8191,    0,    0,    0,    0,\n//65535,65535,63227,  327,65535, 1023,    0,    0,    0,    0,65535,65535,   63,65535,65535, 2175,\n//65535,65535,65535,65535,65535,33791,65535,65535,65535,65535,65287,65535,65535,65535,65535, 1023,\n//65407,65535,65535,65535,15743,15743,65535,65535,15743,65535,32767,32573,32573,65407,32767,65535,\n//32767,32573,65535,65535,65407, 2047,65534,    3,    0,    0,65535,65535,65535,65535,65535,   31,\n//65534,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,\n//65535,65535,65535,65535,65535,65535,65535,  127,65534, 8191,65535,65535,65535,65535,16383,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,65535,65535,65535,65535,  511, 6128, 1023,    0,\n// 2047, 1023,65535,65535,65527,65535,65535,  255,65535,65535, 1023,    0,    0,    0,    0,    0,\n//65535,65535,65535,65535,65535,65535,65535,65535,65535, 4095,65535,65535,65535,65535,65535, 1023,\n//65535,16191,65535,65535,16191,43775,65535,16383,65535,65535,65535,24543, 8156, 4047, 8191, 8156,\n//    0,65535,  255,65535,16239,    0,    0,57344,24576,    0,    0,    0,    0,    0,    0,    0,\n//64644,15919,48464, 1019,    0,    0,65535,65535,   15,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0, 1536,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//65487,65523, 1022, 1793,65534,65535,65535,65535,65535,   31,65534,65535,65535,65535,65535, 4095,\n//65504,65535, 8191,65534,65535,65535,65535,65535,32767,    0,65535,  255,    0,    0,    0,    0,\n//65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,   63,    0,    0,    0,    0,\n//65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,   63,    0,    0,    0,    0,    0,\n//65535,65535,65535,65535,65535,65535,65535,65535, 8191,    0,    0,    0,    0,    0,    0,    0,\n//65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,   15,    0,    0,    0,    0,    0,\n//65535,65535,16383,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//  127,41208,65023,24447,65499,65535,65535,65535,65535,65535,65535,    3,    0,65528,65535,65535,\n//65535,65535,65535,65535,    0,65535,65535,65535,65535,65532,65535,65535,  255,    0,    0, 4095,\n//    0,    0,    0,65535,65055,65527, 3339,65495,65535,65535,65535,65535,65535,65535,65535,40959,\n//63470,36863,65535,49151,65534,12287,65534,65534,65535,16383,65535,32767,64764, 7420,    0,    0};\n//\n//const uint16_t UnicodePunctBits[] = {\n//  256,    0,    0,  272,    0,  288,  304,  320,    0,  336,    0,    0,    0,  352,  368,  384,\n//  400,    0,    0,  416,    0,    0,  432,  448,  464,    0,    0,    0,    0,    0,    0,    0,\n//  480,    0,    0,  496,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//  512,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,  528,  544,  560,\n//    0,    0,65534,64512,    1,63488,    1,30720,    0,    0,65534,65535,    0,  128,    0,  128,\n//    0,    0,    0,    0,    0,    0,    0,16384,  128,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,64512,    0,    0, 1536,    0,    0,16384,    9,    0,    0,   24,\n// 4096,34816,    0,    0,    0,    0,15360,    0,    0,    0,    0,    0,    0,   16,    0,    0,\n//16383,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,   48,    1,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,   16,\n//    0,    0,    0,    0,32768, 3072,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//65520,    7,    0,15360,    0,    0,    0,    0,   32,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,64512,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 2048,\n//    0,    0,    0,    0,    0,    0,  510,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,24576,    0,    0, 6144,    0,    0,    0,    0,14336,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 6128,    0,    0,\n// 2047,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,65535,  255,65535,16239,    0,    0,24576,24576,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0, 1536,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//65294,65523,    0,    1,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 2048,\n//    0,    0,    0,49152,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,65535,65055,65527, 3339,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//63470,35840,    1,47104,    0,10240,   62,    0,    0,    0,    0,    0,    0,    0,    0,    0};\n//\n//const uint16_t UnicodeLowerBits[] = {\n//  256,  272,  288,  304,  320,  336,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,  352,  368,\n//  384,  400,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,  416,    0,    0,    0,  432,\n//    0,    0,    0,    0,    0,    0,65534, 2047,    0,    0,    0,    0,    0,32768,65535,65407,\n//43690,43690,43690,21930,43861,43690,43690,54442,12585,20004,11562,58961,23392,46421,43690,43565,\n//43690,43690,43688,   10,    0,65535,65535,65535,65535,65535,16383,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    1,61440,65535,32767,43235,43690,   15,\n//    0,    0,    0,65535,65535,65535,43690,43690,40962,43690,43690,43690, 4372,43690,43690,  554,\n//    0,    0,    0,    0,    0,    0,65534,65535,  255,    0,    0,    0,    0,    0,    0,    0,\n//43690,43690,43690,43690,43690,43690,43690,43690,43690, 4074,43690,43690,43690,43690,43690,  682,\n//  255,   63,  255,  255,   63,  255,  255,16383,65535,65535,65535,20703, 4316,  207,  255, 4316,\n//    0,    0,    0,    0,    0,    0,    0,32768,    0,    0,    0,    0,    0,    0,    0,    0,\n//50176,    8,32768,  528,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//  127,  248,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,65534, 2047,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0};\n//\n//const uint16_t UnicodeUpperBits[] = {\n//  256,  272,  288,  304,  320,  336,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//  352,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,  368,  384,\n//    0,  400,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,  416,\n//    0,    0,    0,    0,65534, 2047,    0,    0,    0,    0,    0,    0,65535,32639,    0,    0,\n//21845,21845,21845,43605,21674,21845,21845,11093,52950,45531,53973, 4526,44464,19114,21845,21974,\n//21845,21845,21844,    5,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,55104,65534, 4091,    0,    0,21532,21845,    0,\n//65535,65535,65535,    0,    0,    0,21845,21845,20481,21845,21845,21845, 2187,21845,21845,  277,\n//    0,    0,    0,65534,65535,  127,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,65535,65535,   63,    0,    0,    0,\n//21845,21845,21845,21845,21845,21845,21845,21845,21845,   21,21845,21845,21845,21845,21845,  341,\n//65280,16128,65280,65280,16128,43520,65280,    0,65280,65280,65280, 7936, 7936, 3840, 7936, 7936,\n//14468,15911,15696,   11,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n//    0,    0,65534, 2047,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0};\n\n\n// MA: March 19, 2010\n// Modified ToUpper and ToLower tables to match values expected by AS3 tests.\n// ToLower modifications:\n//    304 ->  105\n//   1024 -> 1104 *\n//   1037 -> 1117 * \n// UoUpper modifications:\n//    255 ->  376\n//    305 ->   73\n//    383 ->   83\n//   1104 -> 1024 *\n//   1117 -> 1037 *\n// Entries marked with a '*' don't make complete sense based on Unicode manual, although\n// they match AS3.\n\n\nstatic const uint16_t UnicodeToUpperBits[] = {\n  256,  272,  288,  304,  320,  336,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,  352,  368,\n    0,  384,    0,    0,  400,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,  416,\n    0,    0,    0,    0,    0,    0,65534, 2047,    0,    0,    0,    0,    0,    0,65535,65407,\n43690,43690,43690,21674,43349,43690,43690,54442, 4392,  516, 8490, 8785,21056,46421,43690,43048, // MA: Modified for AS3.\n43690,  170,    0,    0,    0, 2776,33545,   36, 3336,    4,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,61440,65534,32767,    0,43688,    0,\n    0,    0,    0,65535,65535,65535,43690,43690,    2,43690,43690,43690, 4372,43690,35498,  554, // MA: Modified for AS3.\n    0,    0,    0,    0,    0,    0,65534,65535,  127,    0,    0,    0,    0,    0,    0,    0,\n43690,43690,43690,43690,43690,43690,43690,43690,43690,   42,43690,43690,43690,43690,43690,  682,\n  255,   63,  255,  255,   63,  170,  255,16383,    0,    0,    0,    3,    0,    3,   35,    0,\n    0,    0,    0,    0,    0,    0,    0,65535,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,65535, 1023,    0,\n    0,    0,    0,    0,65534, 2047,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0};\n\nstatic const uint16_t UnicodeToLowerBits[] = {\n  256,  272,  288,  304,  320,  336,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n  352,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,  368,  384,\n    0,  400,    0,    0,  416,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,  432,\n    0,    0,    0,    0,65534, 2047,    0,    0,    0,    0,    0,    0,65535,32639,    0,    0,\n21845,21845,21845,43605,21674,21845,21845,11093,52950,45531,53909, 4526,42128,19114,21845,21522,// MA: Modidied for AS3.\n21845,   85,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,55104,65534, 4091,    0,    0,    0,21844,    0,\n65535,65535,65535,    0,    0,    0,21845,21845,    1,21845,21845,21845, 2186,21845,17749,  277,\n    0,    0,    0,65534,65535,  127,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,65535,65535,   63,    0,    0,    0,\n21845,21845,21845,21845,21845,21845,21845,21845,21845,   21,21845,21845,21845,21845,21845,  341,\n65280,16128,65280,65280,16128,43520,65280,    0,    0,    0,    0, 3840, 3840, 3840, 7936, 3840,\n    0,    0,    0,    0,    0,    0,65535,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,65472,65535,    0,    0,    0,\n    0,    0,65534, 2047,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0};\n\nstruct GUnicodePairType\n{\n    uint16_t Key, Value;\n};\n\nstatic inline bool CmpUnicodeKey(const GUnicodePairType& a, uint16_t key)\n{\n    return a.Key < key;\n}\n\nstatic const GUnicodePairType UnicodeToUpperTable[] = {\n{   97,   65}, {   98,   66}, {   99,   67}, {  100,   68}, {  101,   69}, {  102,   70}, {  103,   71},\n{  104,   72}, {  105,   73}, {  106,   74}, {  107,   75}, {  108,   76}, {  109,   77}, {  110,   78},\n{  111,   79}, {  112,   80}, {  113,   81}, {  114,   82}, {  115,   83}, {  116,   84}, {  117,   85},\n{  118,   86}, {  119,   87}, {  120,   88}, {  121,   89}, {  122,   90}, {  224,  192}, {  225,  193},\n{  226,  194}, {  227,  195}, {  228,  196}, {  229,  197}, {  230,  198}, {  231,  199}, {  232,  200},\n{  233,  201}, {  234,  202}, {  235,  203}, {  236,  204}, {  237,  205}, {  238,  206}, {  239,  207},\n{  240,  208}, {  241,  209}, {  242,  210}, {  243,  211}, {  244,  212}, {  245,  213}, {  246,  214},\n{  248,  216}, {  249,  217}, {  250,  218}, {  251,  219}, {  252,  220}, {  253,  221}, {  254,  222},\n{  255,  376}, {  257,  256}, {  259,  258}, {  261,  260}, {  263,  262}, {  265,  264}, {  267,  266},\n{  269,  268}, {  271,  270}, {  273,  272}, {  275,  274}, {  277,  276}, {  279,  278}, {  281,  280},\n{  283,  282}, {  285,  284}, {  287,  286}, {  289,  288}, {  291,  290}, {  293,  292}, {  295,  294},\n{  297,  296}, {  299,  298}, {  301,  300}, {  303,  302}, {  305,   73}, {  307,  306}, {  309,  308}, {  311,  310},\n{  314,  313}, {  316,  315}, {  318,  317}, {  320,  319}, {  322,  321}, {  324,  323}, {  326,  325},\n{  328,  327}, {  331,  330}, {  333,  332}, {  335,  334}, {  337,  336}, {  339,  338}, {  341,  340},\n{  343,  342}, {  345,  344}, {  347,  346}, {  349,  348}, {  351,  350}, {  353,  352}, {  355,  354},\n{  357,  356}, {  359,  358}, {  361,  360}, {  363,  362}, {  365,  364}, {  367,  366}, {  369,  368},\n{  371,  370}, {  373,  372}, {  375,  374}, {  378,  377}, {  380,  379}, {  382,  381}, {  383,   83}, {  387,  386},\n{  389,  388}, {  392,  391}, {  396,  395}, {  402,  401}, {  409,  408}, {  417,  416}, {  419,  418},\n{  421,  420}, {  424,  423}, {  429,  428}, {  432,  431}, {  436,  435}, {  438,  437}, {  441,  440},\n{  445,  444}, {  454,  452}, {  457,  455}, {  460,  458}, {  462,  461}, {  464,  463}, {  466,  465},\n{  468,  467}, {  470,  469}, {  472,  471}, {  474,  473}, {  476,  475}, {  477,  398}, {  479,  478},\n{  481,  480}, {  483,  482}, {  485,  484}, {  487,  486}, {  489,  488}, {  491,  490}, {  493,  492},\n{  495,  494}, {  499,  497}, {  501,  500}, {  507,  506}, {  509,  508}, {  511,  510}, {  513,  512},\n{  515,  514}, {  517,  516}, {  519,  518}, {  521,  520}, {  523,  522}, {  525,  524}, {  527,  526},\n{  529,  528}, {  531,  530}, {  533,  532}, {  535,  534}, {  595,  385}, {  596,  390}, {  598,  393},\n{  599,  394}, {  601,  399}, {  603,  400}, {  608,  403}, {  611,  404}, {  616,  407}, {  617,  406},\n{  623,  412}, {  626,  413}, {  629,  415}, {  643,  425}, {  648,  430}, {  650,  433}, {  651,  434},\n{  658,  439}, {  940,  902}, {  941,  904}, {  942,  905}, {  943,  906}, {  945,  913}, {  946,  914},\n{  947,  915}, {  948,  916}, {  949,  917}, {  950,  918}, {  951,  919}, {  952,  920}, {  953,  921},\n{  954,  922}, {  955,  923}, {  956,  924}, {  957,  925}, {  958,  926}, {  959,  927}, {  960,  928},\n{  961,  929}, {  962,  931}, {  963,  931}, {  964,  932}, {  965,  933}, {  966,  934}, {  967,  935},\n{  968,  936}, {  969,  937}, {  970,  938}, {  971,  939}, {  972,  908}, {  973,  910}, {  974,  911},\n{  995,  994}, {  997,  996}, {  999,  998}, { 1001, 1000}, { 1003, 1002}, { 1005, 1004}, { 1007, 1006},\n{ 1072, 1040}, { 1073, 1041}, { 1074, 1042}, { 1075, 1043}, { 1076, 1044}, { 1077, 1045}, { 1078, 1046},\n{ 1079, 1047}, { 1080, 1048}, { 1081, 1049}, { 1082, 1050}, { 1083, 1051}, { 1084, 1052}, { 1085, 1053},\n{ 1086, 1054}, { 1087, 1055}, { 1088, 1056}, { 1089, 1057}, { 1090, 1058}, { 1091, 1059}, { 1092, 1060},\n{ 1093, 1061}, { 1094, 1062}, { 1095, 1063}, { 1096, 1064}, { 1097, 1065}, { 1098, 1066}, { 1099, 1067},\n{ 1100, 1068}, { 1101, 1069}, { 1102, 1070}, { 1103, 1071}, { 1104, 1024}, { 1105, 1025}, { 1106, 1026}, { 1107, 1027},\n{ 1108, 1028}, { 1109, 1029}, { 1110, 1030}, { 1111, 1031}, { 1112, 1032}, { 1113, 1033}, { 1114, 1034},\n{ 1115, 1035}, { 1116, 1036}, { 1117, 1037}, { 1118, 1038}, { 1119, 1039}, { 1121, 1120}, { 1123, 1122}, { 1125, 1124},\n{ 1127, 1126}, { 1129, 1128}, { 1131, 1130}, { 1133, 1132}, { 1135, 1134}, { 1137, 1136}, { 1139, 1138},\n{ 1141, 1140}, { 1143, 1142}, { 1145, 1144}, { 1147, 1146}, { 1149, 1148}, { 1151, 1150}, { 1153, 1152},\n{ 1169, 1168}, { 1171, 1170}, { 1173, 1172}, { 1175, 1174}, { 1177, 1176}, { 1179, 1178}, { 1181, 1180},\n{ 1183, 1182}, { 1185, 1184}, { 1187, 1186}, { 1189, 1188}, { 1191, 1190}, { 1193, 1192}, { 1195, 1194},\n{ 1197, 1196}, { 1199, 1198}, { 1201, 1200}, { 1203, 1202}, { 1205, 1204}, { 1207, 1206}, { 1209, 1208},\n{ 1211, 1210}, { 1213, 1212}, { 1215, 1214}, { 1218, 1217}, { 1220, 1219}, { 1224, 1223}, { 1228, 1227},\n{ 1233, 1232}, { 1235, 1234}, { 1237, 1236}, { 1239, 1238}, { 1241, 1240}, { 1243, 1242}, { 1245, 1244},\n{ 1247, 1246}, { 1249, 1248}, { 1251, 1250}, { 1253, 1252}, { 1255, 1254}, { 1257, 1256}, { 1259, 1258},\n{ 1263, 1262}, { 1265, 1264}, { 1267, 1266}, { 1269, 1268}, { 1273, 1272}, { 1377, 1329}, { 1378, 1330},\n{ 1379, 1331}, { 1380, 1332}, { 1381, 1333}, { 1382, 1334}, { 1383, 1335}, { 1384, 1336}, { 1385, 1337},\n{ 1386, 1338}, { 1387, 1339}, { 1388, 1340}, { 1389, 1341}, { 1390, 1342}, { 1391, 1343}, { 1392, 1344},\n{ 1393, 1345}, { 1394, 1346}, { 1395, 1347}, { 1396, 1348}, { 1397, 1349}, { 1398, 1350}, { 1399, 1351},\n{ 1400, 1352}, { 1401, 1353}, { 1402, 1354}, { 1403, 1355}, { 1404, 1356}, { 1405, 1357}, { 1406, 1358},\n{ 1407, 1359}, { 1408, 1360}, { 1409, 1361}, { 1410, 1362}, { 1411, 1363}, { 1412, 1364}, { 1413, 1365},\n{ 1414, 1366}, { 7681, 7680}, { 7683, 7682}, { 7685, 7684}, { 7687, 7686}, { 7689, 7688}, { 7691, 7690},\n{ 7693, 7692}, { 7695, 7694}, { 7697, 7696}, { 7699, 7698}, { 7701, 7700}, { 7703, 7702}, { 7705, 7704},\n{ 7707, 7706}, { 7709, 7708}, { 7711, 7710}, { 7713, 7712}, { 7715, 7714}, { 7717, 7716}, { 7719, 7718},\n{ 7721, 7720}, { 7723, 7722}, { 7725, 7724}, { 7727, 7726}, { 7729, 7728}, { 7731, 7730}, { 7733, 7732},\n{ 7735, 7734}, { 7737, 7736}, { 7739, 7738}, { 7741, 7740}, { 7743, 7742}, { 7745, 7744}, { 7747, 7746},\n{ 7749, 7748}, { 7751, 7750}, { 7753, 7752}, { 7755, 7754}, { 7757, 7756}, { 7759, 7758}, { 7761, 7760},\n{ 7763, 7762}, { 7765, 7764}, { 7767, 7766}, { 7769, 7768}, { 7771, 7770}, { 7773, 7772}, { 7775, 7774},\n{ 7777, 7776}, { 7779, 7778}, { 7781, 7780}, { 7783, 7782}, { 7785, 7784}, { 7787, 7786}, { 7789, 7788},\n{ 7791, 7790}, { 7793, 7792}, { 7795, 7794}, { 7797, 7796}, { 7799, 7798}, { 7801, 7800}, { 7803, 7802},\n{ 7805, 7804}, { 7807, 7806}, { 7809, 7808}, { 7811, 7810}, { 7813, 7812}, { 7815, 7814}, { 7817, 7816},\n{ 7819, 7818}, { 7821, 7820}, { 7823, 7822}, { 7825, 7824}, { 7827, 7826}, { 7829, 7828}, { 7841, 7840},\n{ 7843, 7842}, { 7845, 7844}, { 7847, 7846}, { 7849, 7848}, { 7851, 7850}, { 7853, 7852}, { 7855, 7854},\n{ 7857, 7856}, { 7859, 7858}, { 7861, 7860}, { 7863, 7862}, { 7865, 7864}, { 7867, 7866}, { 7869, 7868},\n{ 7871, 7870}, { 7873, 7872}, { 7875, 7874}, { 7877, 7876}, { 7879, 7878}, { 7881, 7880}, { 7883, 7882},\n{ 7885, 7884}, { 7887, 7886}, { 7889, 7888}, { 7891, 7890}, { 7893, 7892}, { 7895, 7894}, { 7897, 7896},\n{ 7899, 7898}, { 7901, 7900}, { 7903, 7902}, { 7905, 7904}, { 7907, 7906}, { 7909, 7908}, { 7911, 7910},\n{ 7913, 7912}, { 7915, 7914}, { 7917, 7916}, { 7919, 7918}, { 7921, 7920}, { 7923, 7922}, { 7925, 7924},\n{ 7927, 7926}, { 7929, 7928}, { 7936, 7944}, { 7937, 7945}, { 7938, 7946}, { 7939, 7947}, { 7940, 7948},\n{ 7941, 7949}, { 7942, 7950}, { 7943, 7951}, { 7952, 7960}, { 7953, 7961}, { 7954, 7962}, { 7955, 7963},\n{ 7956, 7964}, { 7957, 7965}, { 7968, 7976}, { 7969, 7977}, { 7970, 7978}, { 7971, 7979}, { 7972, 7980},\n{ 7973, 7981}, { 7974, 7982}, { 7975, 7983}, { 7984, 7992}, { 7985, 7993}, { 7986, 7994}, { 7987, 7995},\n{ 7988, 7996}, { 7989, 7997}, { 7990, 7998}, { 7991, 7999}, { 8000, 8008}, { 8001, 8009}, { 8002, 8010},\n{ 8003, 8011}, { 8004, 8012}, { 8005, 8013}, { 8017, 8025}, { 8019, 8027}, { 8021, 8029}, { 8023, 8031},\n{ 8032, 8040}, { 8033, 8041}, { 8034, 8042}, { 8035, 8043}, { 8036, 8044}, { 8037, 8045}, { 8038, 8046},\n{ 8039, 8047}, { 8048, 8122}, { 8049, 8123}, { 8050, 8136}, { 8051, 8137}, { 8052, 8138}, { 8053, 8139},\n{ 8054, 8154}, { 8055, 8155}, { 8056, 8184}, { 8057, 8185}, { 8058, 8170}, { 8059, 8171}, { 8060, 8186},\n{ 8061, 8187}, { 8112, 8120}, { 8113, 8121}, { 8144, 8152}, { 8145, 8153}, { 8160, 8168}, { 8161, 8169},\n{ 8165, 8172}, { 8560, 8544}, { 8561, 8545}, { 8562, 8546}, { 8563, 8547}, { 8564, 8548}, { 8565, 8549},\n{ 8566, 8550}, { 8567, 8551}, { 8568, 8552}, { 8569, 8553}, { 8570, 8554}, { 8571, 8555}, { 8572, 8556},\n{ 8573, 8557}, { 8574, 8558}, { 8575, 8559}, { 9424, 9398}, { 9425, 9399}, { 9426, 9400}, { 9427, 9401},\n{ 9428, 9402}, { 9429, 9403}, { 9430, 9404}, { 9431, 9405}, { 9432, 9406}, { 9433, 9407}, { 9434, 9408},\n{ 9435, 9409}, { 9436, 9410}, { 9437, 9411}, { 9438, 9412}, { 9439, 9413}, { 9440, 9414}, { 9441, 9415},\n{ 9442, 9416}, { 9443, 9417}, { 9444, 9418}, { 9445, 9419}, { 9446, 9420}, { 9447, 9421}, { 9448, 9422},\n{ 9449, 9423}, {65345,65313}, {65346,65314}, {65347,65315}, {65348,65316}, {65349,65317}, {65350,65318},\n{65351,65319}, {65352,65320}, {65353,65321}, {65354,65322}, {65355,65323}, {65356,65324}, {65357,65325},\n{65358,65326}, {65359,65327}, {65360,65328}, {65361,65329}, {65362,65330}, {65363,65331}, {65364,65332},\n{65365,65333}, {65366,65334}, {65367,65335}, {65368,65336}, {65369,65337}, {65370,65338}, {65535,    0}};\n\nstatic const GUnicodePairType UnicodeToLowerTable[] = {\n{   65,   97}, {   66,   98}, {   67,   99}, {   68,  100}, {   69,  101}, {   70,  102}, {   71,  103},\n{   72,  104}, {   73,  105}, {   74,  106}, {   75,  107}, {   76,  108}, {   77,  109}, {   78,  110},\n{   79,  111}, {   80,  112}, {   81,  113}, {   82,  114}, {   83,  115}, {   84,  116}, {   85,  117},\n{   86,  118}, {   87,  119}, {   88,  120}, {   89,  121}, {   90,  122}, {  192,  224}, {  193,  225},\n{  194,  226}, {  195,  227}, {  196,  228}, {  197,  229}, {  198,  230}, {  199,  231}, {  200,  232},\n{  201,  233}, {  202,  234}, {  203,  235}, {  204,  236}, {  205,  237}, {  206,  238}, {  207,  239},\n{  208,  240}, {  209,  241}, {  210,  242}, {  211,  243}, {  212,  244}, {  213,  245}, {  214,  246},\n{  216,  248}, {  217,  249}, {  218,  250}, {  219,  251}, {  220,  252}, {  221,  253}, {  222,  254},\n{  256,  257}, {  258,  259}, {  260,  261}, {  262,  263}, {  264,  265}, {  266,  267}, {  268,  269},\n{  270,  271}, {  272,  273}, {  274,  275}, {  276,  277}, {  278,  279}, {  280,  281}, {  282,  283},\n{  284,  285}, {  286,  287}, {  288,  289}, {  290,  291}, {  292,  293}, {  294,  295}, {  296,  297},\n{  298,  299}, {  300,  301}, {  302,  303}, {  304,  105}, {  306,  307}, {  308,  309}, {  310,  311}, {  313,  314},\n{  315,  316}, {  317,  318}, {  319,  320}, {  321,  322}, {  323,  324}, {  325,  326}, {  327,  328},\n{  330,  331}, {  332,  333}, {  334,  335}, {  336,  337}, {  338,  339}, {  340,  341}, {  342,  343},\n{  344,  345}, {  346,  347}, {  348,  349}, {  350,  351}, {  352,  353}, {  354,  355}, {  356,  357},\n{  358,  359}, {  360,  361}, {  362,  363}, {  364,  365}, {  366,  367}, {  368,  369}, {  370,  371},\n{  372,  373}, {  374,  375}, {  376,  255}, {  377,  378}, {  379,  380}, {  381,  382}, {  385,  595},\n{  386,  387}, {  388,  389}, {  390,  596}, {  391,  392}, {  393,  598}, {  394,  599}, {  395,  396},\n{  398,  477}, {  399,  601}, {  400,  603}, {  401,  402}, {  403,  608}, {  404,  611}, {  406,  617},\n{  407,  616}, {  408,  409}, {  412,  623}, {  413,  626}, {  415,  629}, {  416,  417}, {  418,  419},\n{  420,  421}, {  423,  424}, {  425,  643}, {  428,  429}, {  430,  648}, {  431,  432}, {  433,  650},\n{  434,  651}, {  435,  436}, {  437,  438}, {  439,  658}, {  440,  441}, {  444,  445}, {  452,  454},\n{  455,  457}, {  458,  460}, {  461,  462}, {  463,  464}, {  465,  466}, {  467,  468}, {  469,  470},\n{  471,  472}, {  473,  474}, {  475,  476}, {  478,  479}, {  480,  481}, {  482,  483}, {  484,  485},\n{  486,  487}, {  488,  489}, {  490,  491}, {  492,  493}, {  494,  495}, {  497,  499}, {  500,  501},\n{  506,  507}, {  508,  509}, {  510,  511}, {  512,  513}, {  514,  515}, {  516,  517}, {  518,  519},\n{  520,  521}, {  522,  523}, {  524,  525}, {  526,  527}, {  528,  529}, {  530,  531}, {  532,  533},\n{  534,  535}, {  902,  940}, {  904,  941}, {  905,  942}, {  906,  943}, {  908,  972}, {  910,  973},\n{  911,  974}, {  913,  945}, {  914,  946}, {  915,  947}, {  916,  948}, {  917,  949}, {  918,  950},\n{  919,  951}, {  920,  952}, {  921,  953}, {  922,  954}, {  923,  955}, {  924,  956}, {  925,  957},\n{  926,  958}, {  927,  959}, {  928,  960}, {  929,  961}, {  931,  963}, {  932,  964}, {  933,  965},\n{  934,  966}, {  935,  967}, {  936,  968}, {  937,  969}, {  938,  970}, {  939,  971}, {  994,  995},\n{  996,  997}, {  998,  999}, { 1000, 1001}, { 1002, 1003}, { 1004, 1005}, { 1006, 1007}, { 1024, 1104}, { 1025, 1105},\n{ 1026, 1106}, { 1027, 1107}, { 1028, 1108}, { 1029, 1109}, { 1030, 1110}, { 1031, 1111}, { 1032, 1112},\n{ 1033, 1113}, { 1034, 1114}, { 1035, 1115}, { 1036, 1116}, { 1037, 1117}, { 1038, 1118}, { 1039, 1119}, { 1040, 1072},\n{ 1041, 1073}, { 1042, 1074}, { 1043, 1075}, { 1044, 1076}, { 1045, 1077}, { 1046, 1078}, { 1047, 1079},\n{ 1048, 1080}, { 1049, 1081}, { 1050, 1082}, { 1051, 1083}, { 1052, 1084}, { 1053, 1085}, { 1054, 1086},\n{ 1055, 1087}, { 1056, 1088}, { 1057, 1089}, { 1058, 1090}, { 1059, 1091}, { 1060, 1092}, { 1061, 1093},\n{ 1062, 1094}, { 1063, 1095}, { 1064, 1096}, { 1065, 1097}, { 1066, 1098}, { 1067, 1099}, { 1068, 1100},\n{ 1069, 1101}, { 1070, 1102}, { 1071, 1103}, { 1120, 1121}, { 1122, 1123}, { 1124, 1125}, { 1126, 1127},\n{ 1128, 1129}, { 1130, 1131}, { 1132, 1133}, { 1134, 1135}, { 1136, 1137}, { 1138, 1139}, { 1140, 1141},\n{ 1142, 1143}, { 1144, 1145}, { 1146, 1147}, { 1148, 1149}, { 1150, 1151}, { 1152, 1153}, { 1168, 1169},\n{ 1170, 1171}, { 1172, 1173}, { 1174, 1175}, { 1176, 1177}, { 1178, 1179}, { 1180, 1181}, { 1182, 1183},\n{ 1184, 1185}, { 1186, 1187}, { 1188, 1189}, { 1190, 1191}, { 1192, 1193}, { 1194, 1195}, { 1196, 1197},\n{ 1198, 1199}, { 1200, 1201}, { 1202, 1203}, { 1204, 1205}, { 1206, 1207}, { 1208, 1209}, { 1210, 1211},\n{ 1212, 1213}, { 1214, 1215}, { 1217, 1218}, { 1219, 1220}, { 1223, 1224}, { 1227, 1228}, { 1232, 1233},\n{ 1234, 1235}, { 1236, 1237}, { 1238, 1239}, { 1240, 1241}, { 1242, 1243}, { 1244, 1245}, { 1246, 1247},\n{ 1248, 1249}, { 1250, 1251}, { 1252, 1253}, { 1254, 1255}, { 1256, 1257}, { 1258, 1259}, { 1262, 1263},\n{ 1264, 1265}, { 1266, 1267}, { 1268, 1269}, { 1272, 1273}, { 1329, 1377}, { 1330, 1378}, { 1331, 1379},\n{ 1332, 1380}, { 1333, 1381}, { 1334, 1382}, { 1335, 1383}, { 1336, 1384}, { 1337, 1385}, { 1338, 1386},\n{ 1339, 1387}, { 1340, 1388}, { 1341, 1389}, { 1342, 1390}, { 1343, 1391}, { 1344, 1392}, { 1345, 1393},\n{ 1346, 1394}, { 1347, 1395}, { 1348, 1396}, { 1349, 1397}, { 1350, 1398}, { 1351, 1399}, { 1352, 1400},\n{ 1353, 1401}, { 1354, 1402}, { 1355, 1403}, { 1356, 1404}, { 1357, 1405}, { 1358, 1406}, { 1359, 1407},\n{ 1360, 1408}, { 1361, 1409}, { 1362, 1410}, { 1363, 1411}, { 1364, 1412}, { 1365, 1413}, { 1366, 1414},\n{ 4256, 4304}, { 4257, 4305}, { 4258, 4306}, { 4259, 4307}, { 4260, 4308}, { 4261, 4309}, { 4262, 4310},\n{ 4263, 4311}, { 4264, 4312}, { 4265, 4313}, { 4266, 4314}, { 4267, 4315}, { 4268, 4316}, { 4269, 4317},\n{ 4270, 4318}, { 4271, 4319}, { 4272, 4320}, { 4273, 4321}, { 4274, 4322}, { 4275, 4323}, { 4276, 4324},\n{ 4277, 4325}, { 4278, 4326}, { 4279, 4327}, { 4280, 4328}, { 4281, 4329}, { 4282, 4330}, { 4283, 4331},\n{ 4284, 4332}, { 4285, 4333}, { 4286, 4334}, { 4287, 4335}, { 4288, 4336}, { 4289, 4337}, { 4290, 4338},\n{ 4291, 4339}, { 4292, 4340}, { 4293, 4341}, { 7680, 7681}, { 7682, 7683}, { 7684, 7685}, { 7686, 7687},\n{ 7688, 7689}, { 7690, 7691}, { 7692, 7693}, { 7694, 7695}, { 7696, 7697}, { 7698, 7699}, { 7700, 7701},\n{ 7702, 7703}, { 7704, 7705}, { 7706, 7707}, { 7708, 7709}, { 7710, 7711}, { 7712, 7713}, { 7714, 7715},\n{ 7716, 7717}, { 7718, 7719}, { 7720, 7721}, { 7722, 7723}, { 7724, 7725}, { 7726, 7727}, { 7728, 7729},\n{ 7730, 7731}, { 7732, 7733}, { 7734, 7735}, { 7736, 7737}, { 7738, 7739}, { 7740, 7741}, { 7742, 7743},\n{ 7744, 7745}, { 7746, 7747}, { 7748, 7749}, { 7750, 7751}, { 7752, 7753}, { 7754, 7755}, { 7756, 7757},\n{ 7758, 7759}, { 7760, 7761}, { 7762, 7763}, { 7764, 7765}, { 7766, 7767}, { 7768, 7769}, { 7770, 7771},\n{ 7772, 7773}, { 7774, 7775}, { 7776, 7777}, { 7778, 7779}, { 7780, 7781}, { 7782, 7783}, { 7784, 7785},\n{ 7786, 7787}, { 7788, 7789}, { 7790, 7791}, { 7792, 7793}, { 7794, 7795}, { 7796, 7797}, { 7798, 7799},\n{ 7800, 7801}, { 7802, 7803}, { 7804, 7805}, { 7806, 7807}, { 7808, 7809}, { 7810, 7811}, { 7812, 7813},\n{ 7814, 7815}, { 7816, 7817}, { 7818, 7819}, { 7820, 7821}, { 7822, 7823}, { 7824, 7825}, { 7826, 7827},\n{ 7828, 7829}, { 7840, 7841}, { 7842, 7843}, { 7844, 7845}, { 7846, 7847}, { 7848, 7849}, { 7850, 7851},\n{ 7852, 7853}, { 7854, 7855}, { 7856, 7857}, { 7858, 7859}, { 7860, 7861}, { 7862, 7863}, { 7864, 7865},\n{ 7866, 7867}, { 7868, 7869}, { 7870, 7871}, { 7872, 7873}, { 7874, 7875}, { 7876, 7877}, { 7878, 7879},\n{ 7880, 7881}, { 7882, 7883}, { 7884, 7885}, { 7886, 7887}, { 7888, 7889}, { 7890, 7891}, { 7892, 7893},\n{ 7894, 7895}, { 7896, 7897}, { 7898, 7899}, { 7900, 7901}, { 7902, 7903}, { 7904, 7905}, { 7906, 7907},\n{ 7908, 7909}, { 7910, 7911}, { 7912, 7913}, { 7914, 7915}, { 7916, 7917}, { 7918, 7919}, { 7920, 7921},\n{ 7922, 7923}, { 7924, 7925}, { 7926, 7927}, { 7928, 7929}, { 7944, 7936}, { 7945, 7937}, { 7946, 7938},\n{ 7947, 7939}, { 7948, 7940}, { 7949, 7941}, { 7950, 7942}, { 7951, 7943}, { 7960, 7952}, { 7961, 7953},\n{ 7962, 7954}, { 7963, 7955}, { 7964, 7956}, { 7965, 7957}, { 7976, 7968}, { 7977, 7969}, { 7978, 7970},\n{ 7979, 7971}, { 7980, 7972}, { 7981, 7973}, { 7982, 7974}, { 7983, 7975}, { 7992, 7984}, { 7993, 7985},\n{ 7994, 7986}, { 7995, 7987}, { 7996, 7988}, { 7997, 7989}, { 7998, 7990}, { 7999, 7991}, { 8008, 8000},\n{ 8009, 8001}, { 8010, 8002}, { 8011, 8003}, { 8012, 8004}, { 8013, 8005}, { 8025, 8017}, { 8027, 8019},\n{ 8029, 8021}, { 8031, 8023}, { 8040, 8032}, { 8041, 8033}, { 8042, 8034}, { 8043, 8035}, { 8044, 8036},\n{ 8045, 8037}, { 8046, 8038}, { 8047, 8039}, { 8120, 8112}, { 8121, 8113}, { 8122, 8048}, { 8123, 8049},\n{ 8136, 8050}, { 8137, 8051}, { 8138, 8052}, { 8139, 8053}, { 8152, 8144}, { 8153, 8145}, { 8154, 8054},\n{ 8155, 8055}, { 8168, 8160}, { 8169, 8161}, { 8170, 8058}, { 8171, 8059}, { 8172, 8165}, { 8184, 8056},\n{ 8185, 8057}, { 8186, 8060}, { 8187, 8061}, { 8544, 8560}, { 8545, 8561}, { 8546, 8562}, { 8547, 8563},\n{ 8548, 8564}, { 8549, 8565}, { 8550, 8566}, { 8551, 8567}, { 8552, 8568}, { 8553, 8569}, { 8554, 8570},\n{ 8555, 8571}, { 8556, 8572}, { 8557, 8573}, { 8558, 8574}, { 8559, 8575}, { 9398, 9424}, { 9399, 9425},\n{ 9400, 9426}, { 9401, 9427}, { 9402, 9428}, { 9403, 9429}, { 9404, 9430}, { 9405, 9431}, { 9406, 9432},\n{ 9407, 9433}, { 9408, 9434}, { 9409, 9435}, { 9410, 9436}, { 9411, 9437}, { 9412, 9438}, { 9413, 9439},\n{ 9414, 9440}, { 9415, 9441}, { 9416, 9442}, { 9417, 9443}, { 9418, 9444}, { 9419, 9445}, { 9420, 9446},\n{ 9421, 9447}, { 9422, 9448}, { 9423, 9449}, {65313,65345}, {65314,65346}, {65315,65347}, {65316,65348},\n{65317,65349}, {65318,65350}, {65319,65351}, {65320,65352}, {65321,65353}, {65322,65354}, {65323,65355},\n{65324,65356}, {65325,65357}, {65326,65358}, {65327,65359}, {65328,65360}, {65329,65361}, {65330,65362},\n{65331,65363}, {65332,65364}, {65333,65365}, {65334,65366}, {65335,65367}, {65336,65368}, {65337,65369},\n{65338,65370}, {65535,    0}};\n\nint OVR_CDECL OVR_towupper(wchar_t charCode)\n{\n    // Don't use UnicodeUpperBits! It differs from UnicodeToUpperBits.\n    if (UnicodeCharIs(UnicodeToUpperBits, charCode))\n    {\n        // To protect from memory overrun in case the character is not found\n        // we use one extra fake element in the table {65536, 0}.\n        size_t idx = Alg::LowerBoundSliced(\n            UnicodeToUpperTable,\n            0,\n            sizeof(UnicodeToUpperTable) / sizeof(UnicodeToUpperTable[0]) - 1,\n            (uint16_t)charCode,\n            CmpUnicodeKey);\n        return UnicodeToUpperTable[idx].Value;\n    }\n    return charCode;\n}\n\nint OVR_CDECL OVR_towlower(wchar_t charCode)\n{\n    // Don't use UnicodeLowerBits! It differs from UnicodeToLowerBits.\n    if (UnicodeCharIs(UnicodeToLowerBits, charCode))\n    {\n        // To protect from memory overrun in case the character is not found\n        // we use one extra fake element in the table {65536, 0}.\n        size_t idx = Alg::LowerBoundSliced(\n            UnicodeToLowerTable,\n            0,\n            sizeof(UnicodeToLowerTable) / sizeof(UnicodeToLowerTable[0]) - 1,\n            (uint16_t)charCode,\n            CmpUnicodeKey);\n        return UnicodeToLowerTable[idx].Value;\n    }\n    return charCode;\n}\n\n#endif //OVR_NO_WCTYPE\n\n} // OVR\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Std.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR_Kernel.h\nFilename    :   OVR_Std.h\nContent     :   Standard C function interface\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Std_h\n#define OVR_Std_h\n\n#include \"OVR_Types.h\"\n#include <stdarg.h> // for va_list args\n#include <string.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <ctype.h>\n\n#if defined(OVR_CC_MSVC) && (OVR_CC_MSVC >= 1400)\n#define OVR_MSVC_SAFESTRING\n#include <errno.h>\n#endif\n\n// Wide-char funcs\n#include <wchar.h>\n#include <wctype.h>\n\nnamespace OVR {\n\n// Has the same behavior as itoa aside from also having a dest size argument.\n// Return value: Pointer to the resulting null-terminated string, same as parameter str.\n#if defined(OVR_OS_MS)\ninline char* OVR_CDECL OVR_itoa(int val, char *dest, size_t destsize, int radix)\n{\n#if defined(OVR_MSVC_SAFESTRING)\n    _itoa_s(val, dest, destsize, radix);\n    return dest;\n#else\n    OVR_UNUSED(destsize);\n    return itoa(val, dest, radix);\n#endif\n}\n#else // OVR_OS_MS\ninline char* OVR_itoa(int val, char* dest, size_t len, int radix)\n{\n    if (val == 0)\n    {\n        if (len > 1)\n        {\n            dest[0] = '0';\n            dest[1] = '\\0';  \n        }\n        else if(len > 0)\n            dest[0] = '\\0';  \n        return dest;\n    }\n\n    // FIXME: Fix the following code to avoid memory write overruns when len is in sufficient.\n    int cur = val;\n    size_t i    = 0; \n    size_t sign = 0;\n\n    if (val < 0)\n    {\n        val = -val;\n        sign = 1;\n    }\n\n    while ((val != 0) && (i < (len - 1 - sign)))        \n    {\n        cur    = val % radix;\n        val   /= radix;\n\n        if (radix == 16)\n        {\n            switch(cur)\n            {\n            case 10:\n                dest[i] = 'a';\n                break;\n            case 11:\n                dest[i] = 'b';\n                break;\n            case 12:\n                dest[i] = 'c';\n                break;\n            case 13:\n                dest[i] = 'd';\n                break;\n            case 14:\n                dest[i] = 'e';\n                break;\n            case 15:\n                dest[i] = 'f';\n                break;\n            default:\n                dest[i] = (char)('0' + cur);\n                break;\n            }\n        } \n        else\n        {\n            dest[i] = (char)('0' + cur);\n        }\n        ++i;\n    }\n\n    if (sign)\n    {\n        dest[i++] = '-';\n    }\n\n    for (size_t j = 0; j < i / 2; ++j)\n    {\n        char tmp        = dest[j];\n        dest[j]         = dest[i - 1 - j];\n        dest[i - 1 - j] = tmp;\n    }\n    dest[i] = '\\0';\n\n    return dest;\n}\n\n#endif\n\n\n// String functions\n\ninline size_t OVR_CDECL OVR_strlen(const char* str)\n{\n    return strlen(str);\n}\n\ninline char* OVR_CDECL OVR_strcpy(char* dest, size_t destsize, const char* src)\n{\n#if defined(OVR_MSVC_SAFESTRING)\n    strcpy_s(dest, destsize, src);\n    return dest;\n#else\n    // FIXME: This should be a safer implementation\n    OVR_UNUSED(destsize);\n    return strcpy(dest, src);\n#endif\n}\n\n\n// Acts the same as the strlcpy function. \n// Copies src to dest, 0-terminating even if it involves truncating the write.\n// Returns the required strlen of dest (which is one less than the required size of dest).\n// strlcpy is a safer alternative to strcpy and strncpy and provides size information.\n// However, it still may result in an incomplete copy. \n//\n// Example usage:\n//     char buffer[256];\n//     if(OVR_strlcpy(buffer, \"hello world\", sizeof(buffer)) < sizeof(buffer))\n//         { there was enough space }\n//     else\n//         { need a larger buffer }\n//\nsize_t OVR_CDECL OVR_strlcpy(char* dest, const char* src, size_t destsize);\n\n// Acts the same as the strlcat function.\n// Appends src to dest, 0-terminating even if it involves an incomplete write.\n// Doesn't 0-terminate in the case that destsize is 0.\n// Returns the required strlen of dest (which is one less than the required size of dest).\n// The terminating 0 char of dest is overwritten by the first \n// character of src, and a new 0 char is appended to dest. The required capacity \n// of the destination is (strlen(src) + strlen(dest) + 1).\n// strlcat is a safer alternative to strcat and provides size information.\n// However, it still may result in an incomplete copy. \n//\n// Example usage:\n//     char buffer[256] = \"hello \";\n//     if(OVR_strlcat(buffer, \"world\", sizeof(buffer)) < sizeof(buffer))\n//         { there was enough space }\n//     else\n//         { need a larger buffer }\n//\nsize_t OVR_CDECL OVR_strlcat(char* dest, const char* src, size_t destsize);\n\n\ninline char* OVR_CDECL OVR_strncpy(char* dest, size_t destsize, const char* src, size_t count)\n{\n#if defined(OVR_MSVC_SAFESTRING)\n    strncpy_s(dest, destsize, src, count);\n    return dest;\n#else\n    // FIXME: This should be a safer implementation\n    OVR_UNUSED(destsize);\n    return strncpy(dest, src, count);\n#endif\n}\n\ninline char * OVR_CDECL OVR_strcat(char* dest, size_t destsize, const char* src)\n{\n#if defined(OVR_MSVC_SAFESTRING)\n    strcat_s(dest, destsize, src);\n    return dest;\n#else\n    // FIXME: This should be a safer implementation\n    OVR_UNUSED(destsize);\n    return strcat(dest, src);\n#endif\n}\n\ninline int OVR_CDECL OVR_strcmp(const char* dest, const char* src)\n{\n    return strcmp(dest, src);\n}\n\ninline const char* OVR_CDECL OVR_strchr(const char* str, char c)\n{\n    return strchr(str, c);\n}\n\ninline char* OVR_CDECL OVR_strchr(char* str, char c)\n{\n    return strchr(str, c);\n}\n\ninline const char* OVR_strrchr(const char* str, char c)\n{\n    size_t len = OVR_strlen(str);\n    for (size_t i=len; i>0; i--)     \n        if (str[i]==c) \n            return str+i;\n    return 0;\n}\n\ninline const uint8_t* OVR_CDECL OVR_memrchr(const uint8_t* str, size_t size, uint8_t c)\n{\n    for (intptr_t i = (intptr_t)size - 1; i >= 0; i--)     \n    {\n        if (str[i] == c) \n            return str + i;\n    }\n    return 0;\n}\n\ninline char* OVR_CDECL OVR_strrchr(char* str, char c)\n{\n    size_t len = OVR_strlen(str);\n    for (size_t i=len; i>0; i--)     \n        if (str[i]==c) \n            return str+i;\n    return 0;\n}\n\n\ndouble OVR_CDECL OVR_strtod(const char* string, char** tailptr);\n\ninline long OVR_CDECL OVR_strtol(const char* string, char** tailptr, int radix)\n{\n    return strtol(string, tailptr, radix);\n}\n\ninline long OVR_CDECL OVR_strtoul(const char* string, char** tailptr, int radix)\n{\n    return strtoul(string, tailptr, radix);\n}\n\ninline int OVR_CDECL OVR_strncmp(const char* ws1, const char* ws2, size_t size)\n{\n    return strncmp(ws1, ws2, size);\n}\n\ninline uint64_t OVR_CDECL OVR_strtouq(const char *nptr, char **endptr, int base)\n{\n#if defined(OVR_CC_MSVC)\n    return _strtoui64(nptr, endptr, base);\n#else\n    return strtoull(nptr, endptr, base);\n#endif\n}\n\ninline int64_t OVR_CDECL OVR_strtoq(const char *nptr, char **endptr, int base)\n{\n#if defined(OVR_CC_MSVC)\n    return _strtoi64(nptr, endptr, base);\n#else\n    return strtoll(nptr, endptr, base);\n#endif\n}\n\n\ninline int64_t OVR_CDECL OVR_atoq(const char* string)\n{\n#if defined(OVR_CC_MSVC)\n    return _atoi64(string);\n#else\n    return atoll(string);\n#endif\n}\n\ninline uint64_t OVR_CDECL OVR_atouq(const char* string)\n{\n  return OVR_strtouq(string, NULL, 10);\n}\n\n\n// Implemented in OVR_Std.cpp in platform-specific manner.\nint OVR_CDECL OVR_stricmp(const char* dest, const char* src);\nint OVR_CDECL OVR_strnicmp(const char* dest, const char* src, size_t count);\n\n\n// This is like sprintf but with a destination buffer size argument. However, the behavior is different\n// from vsnprintf in that the return value semantics are like sprintf (which returns -1 on capacity overflow) and \n// not like snprintf (which returns intended strlen on capacity overflow).\ninline size_t OVR_CDECL OVR_sprintf(char *dest, size_t destsize, const char* format, ...)\n{\n    va_list argList;\n    va_start(argList,format);\n    size_t ret;\n#if defined(OVR_CC_MSVC)\n    #if defined(OVR_MSVC_SAFESTRING)\n        ret = _vsnprintf_s(dest, destsize, _TRUNCATE, format, argList);\n        OVR_ASSERT(ret != -1);\n    #else\n        OVR_UNUSED(destsize);\n        ret = _vsnprintf(dest, destsize - 1, format, argList); // -1 for space for the null character\n        OVR_ASSERT(ret != -1);\n        dest[destsize-1] = 0;\n    #endif\n#else\n    OVR_UNUSED(destsize);\n    ret = vsprintf(dest, format, argList);\n    OVR_ASSERT(ret < destsize);\n#endif\n    va_end(argList);\n    return ret;\n}\n\n\n// This is like vsprintf but with a destination buffer size argument. However, the behavior is different\n// from vsnprintf in that the return value semantics are like vsprintf (which returns -1 on capacity overflow) and \n// not like vsnprintf (which returns intended strlen on capacity overflow).\n// Return value:\n//    On success, the total number of characters written is returned.\n//    On failure, a negative number is returned.\ninline size_t OVR_CDECL OVR_vsprintf(char *dest, size_t destsize, const char * format, va_list argList)\n{\n    size_t ret;\n#if defined(OVR_CC_MSVC)\n    #if defined(OVR_MSVC_SAFESTRING)\n        dest[0] = '\\0';\n        int rv = vsnprintf_s(dest, destsize, _TRUNCATE, format, argList);\n        if (rv == -1)\n        {\n            dest[destsize - 1] = '\\0';\n            ret = destsize - 1;\n        }\n        else\n            ret = (size_t)rv;\n    #else\n        OVR_UNUSED(destsize);\n        int rv = _vsnprintf(dest, destsize - 1, format, argList);\n        OVR_ASSERT(rv != -1);\n        ret = (size_t)rv;\n        dest[destsize-1] = 0;\n    #endif\n#else\n    // FIXME: This should be a safer implementation\n    OVR_UNUSED(destsize);\n    ret = (size_t)vsprintf(dest, format, argList);\n    OVR_ASSERT(ret < destsize);\n#endif\n    return ret;\n}\n\n// Same behavior as ISO C99 vsnprintf.\n// Returns the strlen of the resulting formatted string, or a negative value if the format is invalid.\n// destsize specifies the capacity of the input buffer.\n//\n// Example usage:\n//     void Log(char *dest, size_t destsize, const char * format, ...)\n//     {\n//         char buffer[1024];\n//         va_list argList;\n//         va_start(argList,format);\n//         int result = OVR_vsnprintf(dest, destsize, format, argList);\n//         assert(result < destsize); // Else we'd have to retry with a dynamically allocated buffer (of size=result+1) and new argList copy.\n//         va_end(argList);\n//     }\n\ninline int OVR_CDECL OVR_vsnprintf(char *dest, size_t destsize, const char * format, va_list argList)\n{\n    int ret;\n#if defined(OVR_CC_MSVC)\n    OVR_DISABLE_MSVC_WARNING(4996) // 'vsnprintf': This function or variable may be unsafe.\n    ret = vsnprintf(dest, destsize, format, argList); // Microsoft vsnprintf is non-conforming; it returns -1 if destsize is insufficient.\n    if (ret < 0) // If there was a format error or if destsize was insufficient...\n    {\n        ret = _vscprintf(format, argList); // Get the expected dest strlen. If the return value is still -1 then there was a format error.\n\n        if (destsize) // If we can 0-terminate the output...\n        {\n            if (ret < 0)\n                dest[0] = 0;\n            else\n                dest[destsize-1] = 0;\n        }\n    }\n    // Else the string was written OK and ret is its strlen.\n    OVR_RESTORE_MSVC_WARNING()\n#else\n    ret = vsnprintf(dest, destsize, format, argList);\n#endif\n    return ret;\n}\n\n\n// Same behavior as ISO C99 snprintf.\n// Returns the strlen of the resulting formatted string, or a negative value if the format is invalid.\n// destsize specifies the capacity of the input buffer.\n//\n// Example usage:\n//     char buffer[16];\n//     int result = OVR_snprintf(buffer, sizeof(buffer), \"%d\", 37);\n//     if (result >= sizeof(buffer)) // If there was insufficient capacity...\n//     {\n//         char* p = new char[result + 1]; // Or char* p = (char*)OVR_ALLOC(result + 1);\n//         OVR_snprintf(p, (size_t)result, \"%d\", 37);\n//         delete[] p;\n//     }\n//\ninline int OVR_CDECL OVR_snprintf(char *dest, size_t destsize, const char * format, ...)\n{\n    va_list argList;\n    va_start(argList,format);\n    int ret = OVR_vsnprintf(dest, destsize, format, argList);\n    va_end(argList);\n    return ret;\n}\n\n\n// Returns the strlen of the resulting formatted string, or a negative value if the format is invalid.\n// Note: If you are planning on printing a string then it's more efficient to just use OVR_vsnprintf and \n// look at the return value and handle the uncommon case that there wasn't enough space.\ninline int OVR_CDECL OVR_vscprintf(const char * format, va_list argList)\n{\n    int ret;\n#if defined(OVR_CC_MSVC)\n    ret = _vscprintf(format, argList);\n#else    \n    ret = vsnprintf(NULL, 0, format, argList);\n#endif\n    return ret;       \n}\n\n\nwchar_t* OVR_CDECL OVR_wcscpy(wchar_t* dest, size_t destsize, const wchar_t* src);\nwchar_t* OVR_CDECL OVR_wcsncpy(wchar_t* dest, size_t destsize, const wchar_t* src, size_t count);\nwchar_t* OVR_CDECL OVR_wcscat(wchar_t* dest, size_t destsize, const wchar_t* src);\nsize_t   OVR_CDECL OVR_wcslen(const wchar_t* str);\nint      OVR_CDECL OVR_wcscmp(const wchar_t* a, const wchar_t* b);\nint      OVR_CDECL OVR_wcsicmp(const wchar_t* a, const wchar_t* b);\n\ninline int OVR_CDECL OVR_wcsicoll(const wchar_t* a, const wchar_t* b)\n{\n#if defined(OVR_OS_MS)\n    #if defined(OVR_CC_MSVC) && (OVR_CC_MSVC >= 1400)\n        return ::_wcsicoll(a, b);\n    #else\n        return ::wcsicoll(a, b);\n    #endif\n#else\n    // not supported, use regular wcsicmp\n    return OVR_wcsicmp(a, b);\n#endif\n}\n\ninline int OVR_CDECL OVR_wcscoll(const wchar_t* a, const wchar_t* b)\n{\n#if defined(OVR_OS_MS) || defined(OVR_OS_LINUX)\n    return wcscoll(a, b);\n#else\n    // not supported, use regular wcscmp\n    return OVR_wcscmp(a, b);\n#endif\n}\n\n#ifndef OVR_NO_WCTYPE\n\ninline int OVR_CDECL UnicodeCharIs(const uint16_t* table, wchar_t charCode)\n{\n    unsigned offset = table[charCode >> 8];\n    if (offset == 0) return 0;\n    if (offset == 1) return 1;\n    return (table[offset + ((charCode >> 4) & 15)] & (1 << (charCode & 15))) != 0;\n}\n\nextern const uint16_t UnicodeAlnumBits[];\nextern const uint16_t UnicodeAlphaBits[];\nextern const uint16_t UnicodeDigitBits[];\nextern const uint16_t UnicodeSpaceBits[];\nextern const uint16_t UnicodeXDigitBits[];\n\n// Uncomment if necessary\n//extern const uint16_t UnicodeCntrlBits[];\n//extern const uint16_t UnicodeGraphBits[];\n//extern const uint16_t UnicodeLowerBits[];\n//extern const uint16_t UnicodePrintBits[];\n//extern const uint16_t UnicodePunctBits[];\n//extern const uint16_t UnicodeUpperBits[];\n\ninline int OVR_CDECL OVR_iswalnum (wchar_t charCode) { return UnicodeCharIs(UnicodeAlnumBits,  charCode); }\ninline int OVR_CDECL OVR_iswalpha (wchar_t charCode) { return UnicodeCharIs(UnicodeAlphaBits,  charCode); }\ninline int OVR_CDECL OVR_iswdigit (wchar_t charCode) { return UnicodeCharIs(UnicodeDigitBits,  charCode); }\ninline int OVR_CDECL OVR_iswspace (wchar_t charCode) { return UnicodeCharIs(UnicodeSpaceBits,  charCode); }\ninline int OVR_CDECL OVR_iswxdigit(wchar_t charCode) { return UnicodeCharIs(UnicodeXDigitBits, charCode); }\n\n// Uncomment if necessary\n//inline int OVR_CDECL OVR_iswcntrl (wchar_t charCode) { return UnicodeCharIs(UnicodeCntrlBits,  charCode); }\n//inline int OVR_CDECL OVR_iswgraph (wchar_t charCode) { return UnicodeCharIs(UnicodeGraphBits,  charCode); }\n//inline int OVR_CDECL OVR_iswlower (wchar_t charCode) { return UnicodeCharIs(UnicodeLowerBits,  charCode); }\n//inline int OVR_CDECL OVR_iswprint (wchar_t charCode) { return UnicodeCharIs(UnicodePrintBits,  charCode); }\n//inline int OVR_CDECL OVR_iswpunct (wchar_t charCode) { return UnicodeCharIs(UnicodePunctBits,  charCode); }\n//inline int OVR_CDECL OVR_iswupper (wchar_t charCode) { return UnicodeCharIs(UnicodeUpperBits,  charCode); }\n\nint OVR_CDECL OVR_towupper(wchar_t charCode);\nint OVR_CDECL OVR_towlower(wchar_t charCode);\n\n#else // OVR_NO_WCTYPE\n\ninline int OVR_CDECL OVR_iswspace(wchar_t c)\n{\n    return iswspace(c);\n}\n\ninline int OVR_CDECL OVR_iswdigit(wchar_t c)\n{\n    return iswdigit(c);\n}\n\ninline int OVR_CDECL OVR_iswxdigit(wchar_t c)\n{\n    return iswxdigit(c);\n}\n\ninline int OVR_CDECL OVR_iswalpha(wchar_t c)\n{\n    return iswalpha(c);\n}\n\ninline int OVR_CDECL OVR_iswalnum(wchar_t c)\n{\n    return iswalnum(c);\n}\n\ninline wchar_t OVR_CDECL OVR_towlower(wchar_t c)\n{\n    return (wchar_t)towlower(c);\n}\n\ninline wchar_t OVR_towupper(wchar_t c)\n{\n    return (wchar_t)towupper(c);\n}\n\n#endif // OVR_NO_WCTYPE\n\n// ASCII versions of tolower and toupper. Don't use \"char\"\ninline int OVR_CDECL OVR_tolower(int c)\n{\n    return (c >= 'A' && c <= 'Z') ? c - 'A' + 'a' : c;\n}\n\ninline int OVR_CDECL OVR_toupper(int c)\n{\n    return (c >= 'a' && c <= 'z') ? c - 'a' + 'A' : c;\n}\n\n\n\ninline double OVR_CDECL OVR_wcstod(const wchar_t* string, wchar_t** tailptr)\n{\n#if defined(OVR_OS_OTHER)\n    OVR_UNUSED(tailptr);\n    char buffer[64];\n    char* tp = NULL;\n    size_t max = OVR_wcslen(string);\n    if (max > 63) max = 63;\n    unsigned char c = 0;\n    for (size_t i=0; i < max; i++)\n    {\n        c = (unsigned char)string[i];\n        buffer[i] = ((c) < 128 ? (char)c : '!');\n    }\n    buffer[max] = 0;\n    return OVR_strtod(buffer, &tp);\n#else\n    return wcstod(string, tailptr);\n#endif\n}\n\ninline long OVR_CDECL OVR_wcstol(const wchar_t* string, wchar_t** tailptr, int radix)\n{\n#if defined(OVR_OS_OTHER)\n    OVR_UNUSED(tailptr);\n    char buffer[64];\n    char* tp = NULL;\n    size_t max = OVR_wcslen(string);\n    if (max > 63) max = 63;\n    unsigned char c = 0;\n    for (size_t i=0; i < max; i++)\n    {\n        c = (unsigned char)string[i];\n        buffer[i] = ((c) < 128 ? (char)c : '!');\n    }\n    buffer[max] = 0;\n    return strtol(buffer, &tp, radix);\n#else\n    return wcstol(string, tailptr, radix);\n#endif\n}\n\n} // OVR\n\n#endif // OVR_Std_h\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_String.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_String.cpp\nContent     :   String UTF8 string implementation with copy-on-write semantics\n                (thread-safe for assignment but not modification).\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_String.h\"\n\n#include <stdlib.h>\n#include <ctype.h>\n\n#ifdef OVR_OS_QNX\n# include <strings.h>\n#endif\n\nnamespace OVR {\n\n#define String_LengthIsSize (size_t(1) << String::Flag_LengthIsSizeShift)\n\nString::DataDesc String::NullData = {String_LengthIsSize, 1, {0} };\n\n\nString::String()\n{\n    pData = &NullData;\n    pData->AddRef();\n};\n\nString::String(const char* pdata)\n{\n    // Obtain length in bytes; it doesn't matter if _data is UTF8.\n    size_t size = pdata ? OVR_strlen(pdata) : 0; \n    pData = AllocDataCopy1(size, 0, pdata, size);\n};\n\nString::String(const char* pdata1, const char* pdata2, const char* pdata3)\n{\n    // Obtain length in bytes; it doesn't matter if _data is UTF8.\n    size_t size1 = pdata1 ? OVR_strlen(pdata1) : 0; \n    size_t size2 = pdata2 ? OVR_strlen(pdata2) : 0; \n    size_t size3 = pdata3 ? OVR_strlen(pdata3) : 0; \n\n    DataDesc *pdataDesc = AllocDataCopy2(size1 + size2 + size3, 0,\n                                         pdata1, size1, pdata2, size2);\n    memcpy(pdataDesc->Data + size1 + size2, pdata3, size3);   \n    pData = pdataDesc;    \n}\n\nString::String(const char* pdata, size_t size)\n{\n    OVR_ASSERT((size == 0) || (pdata != 0));\n    pData = AllocDataCopy1(size, 0, pdata, size);\n};\n\n\nString::String(const InitStruct& src, size_t size)\n{\n    pData = AllocData(size, 0);\n    src.InitString(GetData()->Data, size);\n}\n\nString::String(const String& src)\n{    \n    pData = src.GetData();\n    pData->AddRef();\n}\n\nString::String(const StringBuffer& src)\n{\n    pData = AllocDataCopy1(src.GetSize(), 0, src.ToCStr(), src.GetSize());\n}\n\nString::String(const wchar_t* data)\n{\n    pData = &NullData;\n    pData->AddRef();\n    // Simplified logic for wchar_t constructor.\n    if (data)    \n        *this = data;    \n}\n\n\nString::DataDesc* String::AllocData(size_t size, size_t lengthIsSize)\n{\n    String::DataDesc* pdesc;\n\n    if (size == 0)\n    {\n        pdesc = &NullData;\n        pdesc->AddRef();\n        return pdesc;\n    }\n\n    pdesc = (DataDesc*)OVR_ALLOC(sizeof(DataDesc)+ size);\n    pdesc->Data[size] = 0;\n    pdesc->RefCount = 1;\n    pdesc->Size     = size | lengthIsSize;  \n    return pdesc;\n}\n\n\nString::DataDesc* String::AllocDataCopy1(size_t size, size_t lengthIsSize,\n                                         const char* pdata, size_t copySize)\n{\n    String::DataDesc* pdesc = AllocData(size, lengthIsSize);\n    memcpy(pdesc->Data, pdata, copySize);\n    return pdesc;\n}\n\nString::DataDesc* String::AllocDataCopy2(size_t size, size_t lengthIsSize,\n                                         const char* pdata1, size_t copySize1,\n                                         const char* pdata2, size_t copySize2)\n{\n    String::DataDesc* pdesc = AllocData(size, lengthIsSize);\n    memcpy(pdesc->Data, pdata1, copySize1);\n    memcpy(pdesc->Data + copySize1, pdata2, copySize2);\n    return pdesc;\n}\n\n\nsize_t String::GetLength() const \n{\n    // Optimize length accesses for non-UTF8 character strings. \n    DataDesc* pdata = GetData();\n    size_t    length, size = pdata->GetSize();\n    \n    if (pdata->LengthIsSize())\n        return size;    \n    \n    length = (size_t)UTF8Util::GetLength(pdata->Data, (size_t)size);\n    \n    if (length == size)\n        pdata->Size |= String_LengthIsSize;\n    \n    return length;\n}\n\n\n//static uint32_t String_CharSearch(const char* buf, )\n\n\nuint32_t String::GetCharAt(size_t index) const \n{  \n    intptr_t    i = (intptr_t) index;\n    DataDesc*   pdata = GetData();\n    const char* buf = pdata->Data;\n    uint32_t    c;\n    \n    if (pdata->LengthIsSize())\n    {\n        OVR_ASSERT(index < pdata->GetSize());\n        buf += i;\n        return UTF8Util::DecodeNextChar_Advance0(&buf);\n    }\n\n    c = UTF8Util::GetCharAt(index, buf, pdata->GetSize());\n    return c;\n}\n\nuint32_t String::GetFirstCharAt(size_t index, const char** offset) const\n{\n    DataDesc*   pdata = GetData();\n    intptr_t    i = (intptr_t) index;\n    const char* buf = pdata->Data;\n    const char* end = buf + pdata->GetSize();\n    uint32_t    c;\n\n    do \n    {\n        c = UTF8Util::DecodeNextChar_Advance0(&buf);\n        i--;\n\n        if (buf >= end)\n        {\n            // We've hit the end of the string; don't go further.\n            OVR_ASSERT(i == 0);\n            return c;\n        }\n    } while (i >= 0);\n\n    *offset = buf;\n\n    return c;\n}\n\nuint32_t String::GetNextChar(const char** offset) const\n{\n    return UTF8Util::DecodeNextChar(offset);\n}\n\n\n\nvoid String::AppendChar(uint32_t ch)\n{\n    DataDesc*   pdata = GetData();\n    size_t      size = pdata->GetSize();\n    char        buff[8];\n    intptr_t    encodeSize = 0;\n\n    // Converts ch into UTF8 string and fills it into buff.   \n    UTF8Util::EncodeChar(buff, &encodeSize, ch);\n    OVR_ASSERT(encodeSize >= 0);\n\n    SetData(AllocDataCopy2(size + (size_t)encodeSize, 0,\n                           pdata->Data, size, buff, (size_t)encodeSize));\n    pdata->Release();\n}\n\n\nvoid String::AppendString(const wchar_t* pstr, intptr_t len)\n{\n    if (!pstr)\n        return;\n\n    DataDesc*   pdata = GetData();\n    size_t      oldSize = pdata->GetSize();    \n    size_t      encodeSize = (size_t)UTF8Util::GetEncodeStringSize(pstr, len);\n\n    DataDesc*   pnewData = AllocDataCopy1(oldSize + (size_t)encodeSize, 0,\n                                          pdata->Data, oldSize);\n    UTF8Util::EncodeString(pnewData->Data + oldSize,  pstr, len);\n\n    SetData(pnewData);\n    pdata->Release();\n}\n\n\nvoid String::AppendString(const char* putf8str, intptr_t utf8StrSz)\n{\n    if (!putf8str || !utf8StrSz)\n        return;\n    if (utf8StrSz == -1)\n        utf8StrSz = (intptr_t)OVR_strlen(putf8str);\n\n    DataDesc*   pdata = GetData();\n    size_t      oldSize = pdata->GetSize();\n\n    SetData(AllocDataCopy2(oldSize + (size_t)utf8StrSz, 0,\n                           pdata->Data, oldSize, putf8str, (size_t)utf8StrSz));\n    pdata->Release();\n}\n\nvoid    String::AssignString(const InitStruct& src, size_t size)\n{\n    DataDesc*   poldData = GetData();\n    DataDesc*   pnewData = AllocData(size, 0);\n    src.InitString(pnewData->Data, size);\n    SetData(pnewData);\n    poldData->Release();\n}\n\nvoid    String::AssignString(const char* putf8str, size_t size)\n{\n    DataDesc* poldData = GetData();\n    SetData(AllocDataCopy1(size, 0, putf8str, size));\n    poldData->Release();\n}\n\nvoid    String::operator = (const char* pstr)\n{\n    AssignString(pstr, pstr ? OVR_strlen(pstr) : 0);\n}\n\nvoid    String::operator = (const wchar_t* pwstr)\n{\n    pwstr = pwstr ? pwstr : L\"\";\n\n    DataDesc*   poldData = GetData();\n    size_t      size = (size_t)UTF8Util::GetEncodeStringSize(pwstr);\n\n    DataDesc*   pnewData = AllocData(size, 0);\n    UTF8Util::EncodeString(pnewData->Data, pwstr);\n    SetData(pnewData);\n    poldData->Release();\n}\n\n\nvoid    String::operator = (const String& src)\n{     \n    DataDesc*    psdata = src.GetData();\n    DataDesc*    pdata = GetData();    \n\n    SetData(psdata);\n    psdata->AddRef();\n    pdata->Release();\n}\n\n\nvoid    String::operator = (const StringBuffer& src)\n{ \n    DataDesc* polddata = GetData();    \n    SetData(AllocDataCopy1(src.GetSize(), 0, src.ToCStr(), src.GetSize()));\n    polddata->Release();\n}\n\nvoid    String::operator += (const String& src)\n{\n    DataDesc   *pourData = GetData(),\n               *psrcData = src.GetData();\n    size_t      ourSize  = pourData->GetSize(),\n                srcSize  = psrcData->GetSize();\n    size_t      lflag    = pourData->GetLengthFlag() & psrcData->GetLengthFlag();\n\n    SetData(AllocDataCopy2(ourSize + srcSize, lflag,\n                           pourData->Data, ourSize, psrcData->Data, srcSize));\n    pourData->Release();\n}\n\n\nString   String::operator + (const char* str) const\n{   \n    String tmp1(*this);\n    tmp1 += (str ? str : \"\");\n    return tmp1;\n}\n\nString   String::operator + (const String& src) const\n{ \n    String tmp1(*this);\n    tmp1 += src;\n    return tmp1;\n}\n\nvoid    String::Remove(size_t posAt, intptr_t removeLength)\n{\n    DataDesc*   pdata = GetData();\n    size_t      oldSize = pdata->GetSize();    \n    // Length indicates the number of characters to remove. \n    size_t      length = GetLength();\n\n    // If index is past the string, nothing to remove.\n    if (posAt >= length)\n        return;\n    // Otherwise, cap removeLength to the length of the string.\n    if ((posAt + removeLength) > length)\n        removeLength = length - posAt;\n\n    // Get the byte position of the UTF8 char at position posAt.\n    intptr_t bytePos    = UTF8Util::GetByteIndex(posAt, pdata->Data, oldSize);\n    intptr_t removeSize = UTF8Util::GetByteIndex(removeLength, pdata->Data + bytePos, oldSize-bytePos);\n\n    SetData(AllocDataCopy2(oldSize - removeSize, pdata->GetLengthFlag(),\n                           pdata->Data, bytePos,\n                           pData->Data + bytePos + removeSize, (oldSize - bytePos - removeSize)));\n    pdata->Release();\n}\n\n\nString   String::Substring(size_t start, size_t end) const\n{\n    size_t length = GetLength();\n    if ((start >= length) || (start >= end))\n        return String();   \n\n    DataDesc* pdata = GetData();\n    \n    // If size matches, we know the exact index range.\n    if (pdata->LengthIsSize())\n        return String(pdata->Data + start, end - start);\n    \n    // Get position of starting character.\n    intptr_t byteStart = UTF8Util::GetByteIndex(start, pdata->Data, pdata->GetSize());\n    intptr_t byteSize  = UTF8Util::GetByteIndex(end - start, pdata->Data + byteStart, pdata->GetSize()-byteStart);\n    return String(pdata->Data + byteStart, (size_t)byteSize);\n}\n\nvoid String::Clear()\n{   \n    NullData.AddRef();\n    GetData()->Release();\n    SetData(&NullData);\n}\n\n\nString   String::ToUpper() const \n{       \n    uint32_t    c;\n    const char* psource = GetData()->Data;\n    const char* pend = psource + GetData()->GetSize();\n    String      str;\n    intptr_t    bufferOffset = 0;\n    char        buffer[512];\n    \n    while(psource < pend)\n    {\n        do {            \n            c = UTF8Util::DecodeNextChar_Advance0(&psource);\n            UTF8Util::EncodeChar(buffer, &bufferOffset, OVR_towupper(wchar_t(c)));\n        } while ((psource < pend) && (bufferOffset < intptr_t(sizeof(buffer)-8)));\n\n        // Append string a piece at a time.\n        str.AppendString(buffer, bufferOffset);\n        bufferOffset = 0;\n    }\n\n    return str;\n}\n\nString   String::ToLower() const \n{\n    uint32_t    c;\n    const char* psource = GetData()->Data;\n    const char* pend = psource + GetData()->GetSize();\n    String      str;\n    intptr_t    bufferOffset = 0;\n    char        buffer[512];\n\n    while(psource < pend)\n    {\n        do {\n            c = UTF8Util::DecodeNextChar_Advance0(&psource);\n            UTF8Util::EncodeChar(buffer, &bufferOffset, OVR_towlower(wchar_t(c)));\n        } while ((psource < pend) && (bufferOffset < intptr_t(sizeof(buffer)-8)));\n\n        // Append string a piece at a time.\n        str.AppendString(buffer, bufferOffset);\n        bufferOffset = 0;\n    }\n\n    return str;\n}\n\n\n\nString& String::Insert(const char* substr, size_t posAt, intptr_t strSize)\n{\n    DataDesc* poldData   = GetData();\n    size_t    oldSize    = poldData->GetSize();\n    size_t    insertSize = (strSize < 0) ? OVR_strlen(substr) : (size_t)strSize;    \n    size_t    byteIndex  =  (poldData->LengthIsSize()) ?\n                            posAt : (size_t)UTF8Util::GetByteIndex(posAt, poldData->Data, oldSize);\n\n    OVR_ASSERT(byteIndex <= oldSize);\n    \n    DataDesc* pnewData = AllocDataCopy2(oldSize + insertSize, 0,\n                                        poldData->Data, byteIndex, substr, insertSize);\n    memcpy(pnewData->Data + byteIndex + insertSize,\n           poldData->Data + byteIndex, oldSize - byteIndex);\n    SetData(pnewData);\n    poldData->Release();\n    return *this;\n}\n\n/*\nString& String::Insert(const uint32_t* substr, size_t posAt, intptr_t len)\n{\n    for (intptr_t i = 0; i < len; ++i)\n    {\n        size_t charw = InsertCharAt(substr[i], posAt);\n        posAt += charw;\n    }\n    return *this;\n}\n*/\n\nsize_t String::InsertCharAt(uint32_t c, size_t posAt)\n{\n    char      buf[8];\n    intptr_t  index = 0;\n    UTF8Util::EncodeChar(buf, &index, c);\n    OVR_ASSERT(index >= 0);\n    buf[(size_t)index] = 0;\n\n    Insert(buf, posAt, index);\n    return (size_t)index;\n}\n\n\nint String::CompareNoCase(const char* a, const char* b)\n{\n    return OVR_stricmp(a, b);\n}\n\nint String::CompareNoCase(const char* a, const char* b, intptr_t len)\n{\n    if (len)\n    {\n        intptr_t f,l;\n        intptr_t slen = len;\n        const char *s = b;\n        do {\n            f = (intptr_t)OVR_tolower((int)(*(a++)));\n            l = (intptr_t)OVR_tolower((int)(*(b++)));\n        } while (--len && f && (f == l) && *b != 0);\n\n        if (f == l && (len != 0 || *b != 0))\n        {\n            f = (intptr_t)slen;\n            l = (intptr_t)OVR_strlen(s);\n            return int(f - l);\n        }\n\n        return int(f - l);\n    }\n    else\n        return (0-(int)OVR_strlen(b));\n}\n\n// ***** Implement hash static functions\n\n// Hash function\nsize_t String::BernsteinHashFunction(const void* pdataIn, size_t size, size_t seed)\n{\n    const uint8_t*    pdata   = (const uint8_t*) pdataIn;\n    size_t          h       = seed;\n    while (size > 0)\n    {\n        size--;\n        h = ((h << 5) + h) ^ (unsigned) pdata[size];\n    }\n\n    return h;\n}\n\n// Hash function, case-insensitive\nsize_t String::BernsteinHashFunctionCIS(const void* pdataIn, size_t size, size_t seed)\n{\n    const uint8_t*    pdata = (const uint8_t*) pdataIn;\n    size_t          h = seed;\n    while (size > 0)\n    {\n        size--;\n        h = ((h << 5) + h) ^ OVR_tolower(pdata[size]);\n    }\n\n    // Alternative: \"sdbm\" hash function, suggested at same web page above.\n    // h = 0;\n    // for bytes { h = (h << 16) + (h << 6) - hash + *p; }\n    return h;\n}\n\n\n\n// ***** String Buffer used for Building Strings\n\n\n#define OVR_SBUFF_DEFAULT_GROW_SIZE 512\n// Constructors / Destructor.\nStringBuffer::StringBuffer()\n    : pData(NULL), Size(0), BufferSize(0), GrowSize(OVR_SBUFF_DEFAULT_GROW_SIZE), LengthIsSize(false)\n{\n}\n\nStringBuffer::StringBuffer(size_t growSize)\n    : pData(NULL), Size(0), BufferSize(0), GrowSize(OVR_SBUFF_DEFAULT_GROW_SIZE), LengthIsSize(false)\n{\n    SetGrowSize(growSize);\n}\n\nStringBuffer::StringBuffer(const char* data)\n    : pData(NULL), Size(0), BufferSize(0), GrowSize(OVR_SBUFF_DEFAULT_GROW_SIZE), LengthIsSize(false)\n{\n    AppendString(data);\n}\n\nStringBuffer::StringBuffer(const char* data, size_t dataSize)\n    : pData(NULL), Size(0), BufferSize(0), GrowSize(OVR_SBUFF_DEFAULT_GROW_SIZE), LengthIsSize(false)\n{\n    AppendString(data, dataSize);\n}\n\nStringBuffer::StringBuffer(const String& src)\n    : pData(NULL), Size(0), BufferSize(0), GrowSize(OVR_SBUFF_DEFAULT_GROW_SIZE), LengthIsSize(false)\n{\n    AppendString(src.ToCStr(), src.GetSize());\n}\n\nStringBuffer::StringBuffer(const StringBuffer& src)\n    : pData(NULL), Size(0), BufferSize(0), GrowSize(OVR_SBUFF_DEFAULT_GROW_SIZE), LengthIsSize(false)\n{\n    AppendString(src.ToCStr(), src.GetSize());\n}\n\nStringBuffer::StringBuffer(const wchar_t* data)\n    : pData(NULL), Size(0), BufferSize(0), GrowSize(OVR_SBUFF_DEFAULT_GROW_SIZE), LengthIsSize(false)\n{\n    *this = data;\n}\n\nStringBuffer::~StringBuffer()\n{\n    if (pData)\n        OVR_FREE(pData);\n}\nvoid StringBuffer::SetGrowSize(size_t growSize) \n{ \n    if (growSize <= 16)\n        GrowSize = 16;\n    else\n    {\n        uint8_t bits = Alg::UpperBit(uint32_t(growSize-1));\n\t\tsize_t size = (size_t)1 << bits;\n        GrowSize = size == growSize ? growSize : size;\n    }\n}\n\nsize_t StringBuffer::GetLength() const\n{\n    size_t length, size = GetSize();\n    if (LengthIsSize)\n        return size;\n\n    length = (size_t)UTF8Util::GetLength(pData, (size_t)GetSize());\n\n    if (length == GetSize())\n        LengthIsSize = true;\n    return length;\n}\n\nvoid    StringBuffer::Reserve(size_t _size)\n{\n    if (_size >= BufferSize) // >= because of trailing zero! (!AB)\n    {\n        BufferSize = (_size + 1 + GrowSize - 1)& ~(GrowSize-1);\n        if (!pData)\n            pData = (char*)OVR_ALLOC(BufferSize);\n        else \n            pData = (char*)OVR_REALLOC(pData, BufferSize);\n    }\n}\nvoid    StringBuffer::Resize(size_t _size)\n{\n    Reserve(_size);\n    LengthIsSize = false;\n    Size = _size;\n    if (pData)\n        pData[Size] = 0;\n}\n\nvoid StringBuffer::Clear()\n{\n    Resize(0);\n    /*\n    if (pData != pEmptyNullData)\n    {\n        OVR_FREE(pHeap, pData);\n        pData = pEmptyNullData;\n        Size = BufferSize = 0;\n        LengthIsSize = false;\n    }\n    */\n}\n// Appends a character\nvoid     StringBuffer::AppendChar(uint32_t ch)\n{\n    char    buff[8];\n    size_t  origSize = GetSize();\n\n    // Converts ch into UTF8 string and fills it into buff. Also increments index according to the number of bytes\n    // in the UTF8 string.\n    intptr_t   srcSize = 0;\n    UTF8Util::EncodeChar(buff, &srcSize, ch);\n    OVR_ASSERT(srcSize >= 0);\n    \n    size_t size = origSize + srcSize;\n    Resize(size);\n    OVR_ASSERT(pData != NULL);\n    memcpy(pData + origSize, buff, srcSize);\n}\n\n// Append a string\nvoid     StringBuffer::AppendString(const wchar_t* pstr, intptr_t len)\n{\n    if (!pstr || !len)\n        return;\n\n    intptr_t srcSize  = UTF8Util::GetEncodeStringSize(pstr, len);\n    size_t   origSize = GetSize();\n    size_t   size     = srcSize + origSize;\n\n    Resize(size);\n    OVR_ASSERT(pData != NULL);\n    UTF8Util::EncodeString(pData + origSize,  pstr, len);\n}\n\nvoid      StringBuffer::AppendString(const char* putf8str, intptr_t utf8StrSz)\n{\n    if (!putf8str || !utf8StrSz)\n        return;\n    if (utf8StrSz == -1)\n        utf8StrSz = (intptr_t)OVR_strlen(putf8str);\n\n    size_t  origSize = GetSize();\n    size_t  size     = utf8StrSz + origSize;\n\n    Resize(size);\n    OVR_ASSERT(pData != NULL);\n    memcpy(pData + origSize, putf8str, utf8StrSz);\n}\n\n// If pstr is NULL then the StringBuffer is cleared.\nvoid      StringBuffer::operator = (const char* pstr)\n{\n    pstr = pstr ? pstr : \"\";\n    size_t size = OVR_strlen(pstr);\n    Resize(size);\n    OVR_ASSERT((pData != NULL) || (size == 0));\n    memcpy(pData, pstr, size);\n}\n\n// If pstr is NULL then the StringBuffer is cleared.\nvoid      StringBuffer::operator = (const wchar_t* pstr)\n{\n    pstr = pstr ? pstr : L\"\";\n    size_t size = (size_t)UTF8Util::GetEncodeStringSize(pstr);\n    Resize(size);\n    OVR_ASSERT((pData != NULL) || (size == 0));\n    UTF8Util::EncodeString(pData, pstr);\n}\n\nvoid      StringBuffer::operator = (const String& src)\n{\n    const size_t size = src.GetSize();\n    Resize(size);\n    OVR_ASSERT((pData != NULL) || (size == 0));\n    memcpy(pData, src.ToCStr(), size);\n}\n\nvoid      StringBuffer::operator = (const StringBuffer& src)\n{\n\tClear();\n\tAppendString(src.ToCStr(), src.GetSize());\n}\n\n\n// Inserts substr at posAt\nvoid      StringBuffer::Insert(const char* substr, size_t posAt, intptr_t len)\n{\n    size_t    oldSize    = Size;\n    size_t    insertSize = (len < 0) ? OVR_strlen(substr) : (size_t)len;    \n    size_t    byteIndex  = LengthIsSize ? posAt : \n                           (size_t)UTF8Util::GetByteIndex(posAt, pData, (intptr_t)Size);\n\n    OVR_ASSERT(byteIndex <= oldSize);\n    Reserve(oldSize + insertSize);\n\n    OVR_ASSERT(pData != NULL); // pData is unilaterally written to below.\n    memmove(pData + byteIndex + insertSize, pData + byteIndex, oldSize - byteIndex + 1);\n    memcpy (pData + byteIndex, substr, insertSize);\n    LengthIsSize = false;\n    Size = oldSize + insertSize;\n    pData[Size] = 0;\n}\n\n// Inserts character at posAt\nsize_t    StringBuffer::InsertCharAt(uint32_t c, size_t posAt)\n{\n    char    buf[8];\n    intptr_t   len = 0;\n    UTF8Util::EncodeChar(buf, &len, c);\n    OVR_ASSERT(len >= 0);\n    buf[(size_t)len] = 0;\n\n    Insert(buf, posAt, len);\n    return (size_t)len;\n}\n\n} // OVR\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_String.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR_Kernel.h\nFilename    :   OVR_String.h\nContent     :   String UTF8 string implementation with copy-on-write semantics\n                (thread-safe for assignment but not modification).\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_String_h\n#define OVR_String_h\n\n#include \"OVR_Types.h\"\n#include \"OVR_Allocator.h\"\n#include \"OVR_UTF8Util.h\"\n#include \"OVR_Atomic.h\"\n#include \"OVR_Std.h\"\n#include \"OVR_Alg.h\"\n\nnamespace OVR {\n\n// ***** Classes\n\nclass String;\nclass StringBuffer;\n\n\n//-----------------------------------------------------------------------------------\n// ***** String Class \n\n// String is UTF8 based string class with copy-on-write implementation\n// for assignment.\n\nclass String\n{\nprotected:\n\n    enum FlagConstants\n    {\n        //Flag_GetLength      = 0x7FFFFFFF,\n        // This flag is set if GetLength() == GetSize() for a string.\n        // Avoid extra scanning is Substring and indexing logic.\n        Flag_LengthIsSizeShift   = (sizeof(size_t)*8 - 1)\n    };\n\n\n    // Internal structure to hold string data\n    struct DataDesc\n    {\n        // Number of bytes. Will be the same as the number of chars if the characters\n        // are ascii, may not be equal to number of chars in case string data is UTF8.\n        size_t  Size;       \n        volatile int32_t RefCount;\n        char    Data[1];\n\n        void    AddRef()\n        {\n            AtomicOps<int32_t>::ExchangeAdd_NoSync(&RefCount, 1);\n        }\n        // Decrement ref count. This needs to be thread-safe, since\n        // a different thread could have also decremented the ref count.\n        // For example, if u start off with a ref count = 2. Now if u\n        // decrement the ref count and check against 0 in different\n        // statements, a different thread can also decrement the ref count\n        // in between our decrement and checking against 0 and will find\n        // the ref count = 0 and delete the object. This will lead to a crash\n        // when context switches to our thread and we'll be trying to delete\n        // an already deleted object. Hence decrementing the ref count and\n        // checking against 0 needs to made an atomic operation.\n        void    Release()\n        {\n            if ((AtomicOps<int32_t>::ExchangeAdd_NoSync(&RefCount, -1) - 1) == 0)\n                OVR_FREE(this);\n        }\n\n        static size_t GetLengthFlagBit()     { return size_t(1) << Flag_LengthIsSizeShift; }\n        size_t      GetSize() const         { return Size & ~GetLengthFlagBit() ; }\n        size_t      GetLengthFlag()  const  { return Size & GetLengthFlagBit(); }\n        bool        LengthIsSize() const    { return GetLengthFlag() != 0; }\n    };\n\n    // Heap type of the string is encoded in the lower bits.\n    enum HeapType\n    {\n        HT_Global   = 0,    // Heap is global.\n        HT_Local    = 1,    // SF::String_loc: Heap is determined based on string's address.\n        HT_Dynamic  = 2,    // SF::String_temp: Heap is stored as a part of the class.\n        HT_Mask     = 3\n    };\n\n    union {\n        DataDesc* pData;\n        size_t    HeapTypeBits;\n    };\n    typedef union {\n        DataDesc* pData;\n        size_t    HeapTypeBits;\n    } DataDescUnion;\n\n    inline HeapType    GetHeapType() const { return (HeapType) (HeapTypeBits & HT_Mask); }\n\n    inline DataDesc*   GetData() const\n    {\n        DataDescUnion u;\n        u.pData    = pData;\n        u.HeapTypeBits = (u.HeapTypeBits & ~(size_t)HT_Mask);\n        return u.pData;\n    }\n    \n    inline void        SetData(DataDesc* pdesc)\n    {\n        HeapType ht = GetHeapType();\n        pData = pdesc;\n        OVR_ASSERT((HeapTypeBits & HT_Mask) == 0);\n        HeapTypeBits |= ht;        \n    }\n\n    \n    DataDesc*   AllocData(size_t size, size_t lengthIsSize);\n    DataDesc*   AllocDataCopy1(size_t size, size_t lengthIsSize,\n                               const char* pdata, size_t copySize);\n    DataDesc*   AllocDataCopy2(size_t size, size_t lengthIsSize,\n                               const char* pdata1, size_t copySize1,\n                               const char* pdata2, size_t copySize2);\n\n    // Special constructor to avoid data initalization when used in derived class.\n    struct NoConstructor { };\n    String(const NoConstructor&) { }\n\npublic:\n\n    // For initializing string with dynamic buffer\n    struct InitStruct\n    {\n        virtual ~InitStruct() { }\n        virtual void InitString(char* pbuffer, size_t size) const = 0;\n    };\n\n\n    // Constructors / Destructors.\n    String();\n    String(const char* data);\n    String(const char* data1, const char* pdata2, const char* pdata3 = 0);\n    String(const char* data, size_t buflen);\n    String(const String& src);\n    String(const StringBuffer& src);\n    String(const InitStruct& src, size_t size);\n    explicit String(const wchar_t* data);      \n\n    // Destructor (Captain Obvious guarantees!)\n    ~String()\n    {\n        GetData()->Release();\n    }\n\n    // Declaration of NullString\n    static DataDesc NullData;\n\n\n    // *** General Functions\n\n    void        Clear();\n\n    // For casting to a pointer to char.\n    operator const char*() const        { return GetData()->Data; }\n    // Pointer to raw buffer.\n    const char* ToCStr() const          { return GetData()->Data; }\n\n    // Returns number of bytes\n    size_t      GetSize() const         { return GetData()->GetSize() ; }\n    // Tells whether or not the string is empty\n    bool        IsEmpty() const         { return GetSize() == 0; }\n\n    // Returns  number of characters\n    size_t      GetLength() const;\n    int         GetLengthI() const      { return (int)GetLength(); }\n\n    // Returns  character at the specified index\n    uint32_t    GetCharAt(size_t index) const;\n    uint32_t    GetFirstCharAt(size_t index, const char** offset) const;\n    uint32_t    GetNextChar(const char** offset) const;\n\n    // Appends a character\n    void        AppendChar(uint32_t ch);\n\n    // Append a string\n    void        AppendString(const wchar_t* pstr, intptr_t len = -1);\n    void        AppendString(const char* putf8str, intptr_t utf8StrSz = -1);\n\n    // Assigned a string with dynamic data (copied through initializer).\n    void        AssignString(const InitStruct& src, size_t size);\n    // Assigns string with known size.\n    void        AssignString(const char* putf8str, size_t size);\n\n    //  Resize the string to the new size\n//  void        Resize(size_t _size);\n\n    // Removes the character at posAt\n    void        Remove(size_t posAt, intptr_t len = 1);\n\n    // Returns a String that's a substring of this.\n    //  -start is the index of the first UTF8 character you want to include.\n    //  -end is the index one past the last UTF8 character you want to include.\n    String   Substring(size_t start, size_t end) const;\n\n    // Case-conversion\n    String   ToUpper() const;\n    String   ToLower() const;\n\n    // Inserts substr at posAt\n    String&    Insert (const char* substr, size_t posAt, intptr_t len = -1);\n\n    // Inserts character at posAt\n    size_t      InsertCharAt(uint32_t c, size_t posAt);\n\n    // Inserts substr at posAt, which is an index of a character (not byte).\n    // Of size is specified, it is in bytes.\n//  String&    Insert(const uint32_t* substr, size_t posAt, intptr_t size = -1);\n\n    // Get Byte index of the character at position = index\n    size_t      GetByteIndex(size_t index) const { return (size_t)UTF8Util::GetByteIndex(index, GetData()->Data); }\n\n    // Utility: case-insensitive string compare.  stricmp() & strnicmp() are not\n    // ANSI or POSIX, do not seem to appear in Linux.\n    static int OVR_STDCALL   CompareNoCase(const char* a, const char* b);\n    static int OVR_STDCALL   CompareNoCase(const char* a, const char* b, intptr_t len);\n\n    // Hash function, case-insensitive\n    static size_t OVR_STDCALL BernsteinHashFunctionCIS(const void* pdataIn, size_t size, size_t seed = 5381);\n\n    // Hash function, case-sensitive\n    static size_t OVR_STDCALL BernsteinHashFunction(const void* pdataIn, size_t size, size_t seed = 5381);\n\n\n    // ***** File path parsing helper functions.\n    // Implemented in OVR_String_FilePath.cpp.\n\n    // Absolute paths can star with:\n    //  - protocols:        'file://', 'http://'\n    //  - windows drive:    'c:\\'\n    //  - UNC share name:   '\\\\share'\n    //  - unix root         '/'\n    static bool HasAbsolutePath(const char* path);\n    static bool HasExtension(const char* path);\n    static bool HasProtocol(const char* path);\n\n    bool    HasAbsolutePath() const { return HasAbsolutePath(ToCStr()); }\n    bool    HasExtension() const    { return HasExtension(ToCStr()); }\n    bool    HasProtocol() const     { return HasProtocol(ToCStr()); }\n\n    String  GetProtocol() const;    // Returns protocol, if any, with trailing '://'.\n    String  GetPath() const;        // Returns path with trailing '/'.\n    String  GetFilename() const;    // Returns filename, including extension.\n    String  GetExtension() const;   // Returns extension with a dot.\n\n    void    StripProtocol();        // Strips front protocol, if any, from the string.\n    void    StripExtension();       // Strips off trailing extension.\n    \n\n    // Operators\n    // Assignment\n    void        operator =  (const char* str);\n    void        operator =  (const wchar_t* str);\n    void        operator =  (const String& src);\n    void        operator =  (const StringBuffer& src);\n\n    // Addition\n    void        operator += (const String& src);\n    void        operator += (const char* psrc)       { AppendString(psrc); }\n    void        operator += (const wchar_t* psrc)    { AppendString(psrc); }\n    void        operator += (char  ch)               { AppendChar(ch); }\n    String      operator +  (const char* str) const;\n    String      operator +  (const String& src)  const;\n\n    // Comparison\n    bool        operator == (const String& str) const\n    {\n        return (OVR_strcmp(GetData()->Data, str.GetData()->Data)== 0);\n    }\n\n    bool        operator != (const String& str) const\n    {\n        return !operator == (str);\n    }\n\n    bool        operator == (const char* str) const\n    {\n        return OVR_strcmp(GetData()->Data, str) == 0;\n    }\n\n    bool        operator != (const char* str) const\n    {\n        return !operator == (str);\n    }\n\n    bool        operator <  (const char* pstr) const\n    {\n        return OVR_strcmp(GetData()->Data, pstr) < 0;\n    }\n\n    bool        operator <  (const String& str) const\n    {\n        return *this < str.GetData()->Data;\n    }\n\n    bool        operator >  (const char* pstr) const\n    {\n        return OVR_strcmp(GetData()->Data, pstr) > 0;\n    }\n\n    bool        operator >  (const String& str) const\n    {\n        return *this > str.GetData()->Data;\n    }\n\n    int CompareNoCase(const char* pstr) const\n    {\n        return CompareNoCase(GetData()->Data, pstr);\n    }\n    int CompareNoCase(const String& str) const\n    {\n        return CompareNoCase(GetData()->Data, str.ToCStr());\n    }\n\n    // Accesses raw bytes\n    const char&     operator [] (int index) const\n    {\n        OVR_ASSERT(index >= 0 && (size_t)index < GetSize());\n        return GetData()->Data[index];\n    }\n    const char&     operator [] (size_t index) const\n    {\n        OVR_ASSERT(index < GetSize());\n        return GetData()->Data[index];\n    }\n\n\n    // Case insensitive keys are used to look up insensitive string in hash tables\n    // for SWF files with version before SWF 7.\n    struct NoCaseKey\n    {   \n        const String* pStr;\n        NoCaseKey(const String &str) : pStr(&str){};\n    };\n\n    bool    operator == (const NoCaseKey& strKey) const\n    {\n        return (CompareNoCase(ToCStr(), strKey.pStr->ToCStr()) == 0);\n    }\n    bool    operator != (const NoCaseKey& strKey) const\n    {\n        return !(CompareNoCase(ToCStr(), strKey.pStr->ToCStr()) == 0);\n    }\n\n    // Hash functor used for strings.\n    struct HashFunctor\n    {    \n        size_t operator()(const String& data) const\n        {\n            size_t size = data.GetSize();\n            return String::BernsteinHashFunction((const char*)data, size);\n        }        \n    };\n    // Case-insensitive hash functor used for strings. Supports additional\n    // lookup based on NoCaseKey.\n    struct NoCaseHashFunctor\n    {    \n        size_t operator()(const String& data) const\n        {\n            size_t size = data.GetSize();\n            return String::BernsteinHashFunctionCIS((const char*)data, size);\n        }\n        size_t operator()(const NoCaseKey& data) const\n        {       \n            size_t size = data.pStr->GetSize();\n            return String::BernsteinHashFunctionCIS((const char*)data.pStr->ToCStr(), size);\n        }\n    };\n\n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** String Buffer used for Building Strings\n\nclass StringBuffer\n{\n    char*           pData;\n    size_t          Size;\n    size_t          BufferSize;\n    size_t          GrowSize;    \n    mutable bool    LengthIsSize;    \n\npublic:\n\n    // Constructors / Destructor.    \n    StringBuffer();\n    explicit StringBuffer(size_t growSize);\n    StringBuffer(const char* data);\n    StringBuffer(const char* data, size_t buflen);\n    StringBuffer(const String& src);\n    StringBuffer(const StringBuffer& src);\n    explicit StringBuffer(const wchar_t* data);\n    ~StringBuffer();\n    \n\n    // Modify grow size used for growing/shrinking the buffer.\n    size_t      GetGrowSize() const         { return GrowSize; }\n    void        SetGrowSize(size_t growSize);\n    \n\n    // *** General Functions\n    // Does not release memory, just sets Size to 0\n    void        Clear();\n\n    // For casting to a pointer to char.\n    operator const char*() const        { return (pData) ? pData : \"\"; }\n    // Pointer to raw buffer.\n    const char* ToCStr() const          { return (pData) ? pData : \"\"; }\n\n    // Returns number of bytes.\n    size_t      GetSize() const         { return Size ; }\n    // Tells whether or not the string is empty.\n    bool        IsEmpty() const         { return GetSize() == 0; }\n\n    // Returns  number of characters\n    size_t      GetLength() const;\n\n    // Returns  character at the specified index\n    uint32_t    GetCharAt(size_t index) const;\n    uint32_t    GetFirstCharAt(size_t index, const char** offset) const;\n    uint32_t    GetNextChar(const char** offset) const;\n\n\n    //  Resize the string to the new size\n    void        Resize(size_t _size);\n    void        Reserve(size_t _size);\n\n    // Appends a character\n    void        AppendChar(uint32_t ch);\n\n    // Append a string\n    void        AppendString(const wchar_t* pstr, intptr_t len = -1);\n    void        AppendString(const char* putf8str, intptr_t utf8StrSz = -1);\n    void        AppendFormat(const char* format, ...);\n\n    // Assigned a string with dynamic data (copied through initializer).\n    //void        AssignString(const InitStruct& src, size_t size);\n\n    // Inserts substr at posAt\n    void        Insert (const char* substr, size_t posAt, intptr_t len = -1);\n    // Inserts character at posAt\n    size_t      InsertCharAt(uint32_t c, size_t posAt);\n\n    // Assignment\n    void        operator =  (const char* str);\n    void        operator =  (const wchar_t* str);\n    void        operator =  (const String& src);\n    void        operator =  (const StringBuffer& src);\n\n    // Addition\n    void        operator += (const String& src)      { AppendString(src.ToCStr(),src.GetSize()); }\n    void        operator += (const char* psrc)       { AppendString(psrc); }\n    void        operator += (const wchar_t* psrc)    { AppendString(psrc); }\n    void        operator += (char  ch)               { AppendChar(ch); }\n    //String   operator +  (const char* str) const ;\n    //String   operator +  (const String& src)  const ;\n\n    // Accesses raw bytes\n    char&       operator [] (int index)\n    {\n        OVR_ASSERT(((size_t)index) < GetSize());\n        return pData[index];\n    }\n    char&       operator [] (size_t index)\n    {\n        OVR_ASSERT(index < GetSize());\n        return pData[index];\n    }\n\n    const char&     operator [] (int index) const \n    {\n        OVR_ASSERT(((size_t)index) < GetSize());\n        return pData[index];\n    }\n    const char&     operator [] (size_t index) const\n    {\n        OVR_ASSERT(index < GetSize());\n        return pData[index];\n    }\n};\n\n\n//\n// Wrapper for string data. The data must have a guaranteed \n// lifespan throughout the usage of the wrapper. Not intended for \n// cached usage. Not thread safe.\n//\nclass StringDataPtr\n{\npublic:\n    StringDataPtr() : pStr(NULL), Size(0) {}\n    StringDataPtr(const StringDataPtr& p)\n        : pStr(p.pStr), Size(p.Size) {}\n    StringDataPtr(const char* pstr, size_t sz)\n        : pStr(pstr), Size(sz) {}\n    StringDataPtr(const char* pstr)\n        : pStr(pstr), Size((pstr != NULL) ? OVR_strlen(pstr) : 0) {}\n    explicit StringDataPtr(const String& str)\n        : pStr(str.ToCStr()), Size(str.GetSize()) {}\n    template <typename T, int N> \n    StringDataPtr(const T (&v)[N])\n        : pStr(v), Size(N) {}\n\npublic:\n    const char* ToCStr() const { return pStr; }\n    size_t      GetSize() const { return Size; }\n    bool        IsEmpty() const { return GetSize() == 0; }\n\n    // value is a prefix of this string\n    // Character's values are not compared.\n    bool        IsPrefix(const StringDataPtr& value) const\n    {\n        return ToCStr() == value.ToCStr() && GetSize() >= value.GetSize();\n    }\n    // value is a suffix of this string\n    // Character's values are not compared.\n    bool        IsSuffix(const StringDataPtr& value) const\n    {\n        return ToCStr() <= value.ToCStr() && (End()) == (value.End());\n    }\n\n    // Find first character.\n    // init_ind - initial index.\n    intptr_t    FindChar(char c, size_t init_ind = 0) const \n    {\n        for (size_t i = init_ind; i < GetSize(); ++i)\n            if (pStr[i] == c)\n                return static_cast<intptr_t>(i);\n\n        return -1; \n    }\n\n    // Find last character.\n    // init_ind - initial index.\n    intptr_t    FindLastChar(char c, size_t init_ind = ~0) const \n    {\n        if (init_ind == (size_t)~0 || init_ind > GetSize())\n            init_ind = GetSize();\n        else\n            ++init_ind;\n\n        for (size_t i = init_ind; i > 0; --i)\n            if (pStr[i - 1] == c)\n                return static_cast<intptr_t>(i - 1);\n\n        return -1; \n    }\n\n    // Create new object and trim size bytes from the left.\n    StringDataPtr  GetTrimLeft(size_t size) const\n    {\n        // Limit trim size to the size of the string.\n        size = Alg::PMin(GetSize(), size);\n\n        return StringDataPtr(ToCStr() + size, GetSize() - size);\n    }\n    // Create new object and trim size bytes from the right.\n    StringDataPtr  GetTrimRight(size_t size) const\n    {\n        // Limit trim to the size of the string.\n        size = Alg::PMin(GetSize(), size);\n\n        return StringDataPtr(ToCStr(), GetSize() - size);\n    }\n\n    // Create new object, which contains next token.\n    // Useful for parsing.\n    StringDataPtr GetNextToken(char separator = ':') const\n    {\n        size_t cur_pos = 0;\n        const char* cur_str = ToCStr();\n\n        for (; cur_pos < GetSize() && cur_str[cur_pos]; ++cur_pos)\n        {\n            if (cur_str[cur_pos] == separator)\n            {\n                break;\n            }\n        }\n\n        return StringDataPtr(ToCStr(), cur_pos);\n    }\n\n    // Trim size bytes from the left.\n    StringDataPtr& TrimLeft(size_t size)\n    {\n        // Limit trim size to the size of the string.\n        size = Alg::PMin(GetSize(), size);\n        pStr += size;\n        Size -= size;\n\n        return *this;\n    }\n    // Trim size bytes from the right.\n    StringDataPtr& TrimRight(size_t size)\n    {\n        // Limit trim to the size of the string.\n        size = Alg::PMin(GetSize(), size);\n        Size -= size;\n\n        return *this;\n    }\n\n    const char* Begin() const { return ToCStr(); }\n    const char* End() const { return ToCStr() + GetSize(); }\n\n    // Hash functor used string data pointers\n    struct HashFunctor\n    {    \n        size_t operator()(const StringDataPtr& data) const\n        {\n            return String::BernsteinHashFunction(data.ToCStr(), data.GetSize());\n        }        \n    };\n\n    bool operator== (const StringDataPtr& data) const \n    {\n        return (OVR_strncmp(pStr, data.pStr, data.Size) == 0);\n    }\n\nprotected:\n    const char* pStr;\n    size_t      Size;\n};\n\n} // OVR\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_StringHash.h",
    "content": "/************************************************************************************\n\nPublicHeader:   None\nFilename    :   OVR_StringHash.h\nContent     :   String hash table used when optional case-insensitive\n                lookup is required.\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_StringHash_h\n#define OVR_StringHash_h\n\n#include \"OVR_String.h\"\n#include \"OVR_Hash.h\"\n\nnamespace OVR {\n\n//-----------------------------------------------------------------------------------\n// *** StringHash\n\n// This is a custom string hash table that supports case-insensitive\n// searches through special functions such as GetCaseInsensitive, etc.\n// This class is used for Flash labels, exports and other case-insensitive tables.\n\ntemplate<class U, class Allocator = ContainerAllocator<U> >\nclass StringHash : public Hash<String, U, String::NoCaseHashFunctor, Allocator>\n{\npublic:\n    typedef U                                                        ValueType;\n    typedef StringHash<U, Allocator>                                 SelfType;\n    typedef Hash<String, U, String::NoCaseHashFunctor, Allocator>    BaseType;\n\npublic:    \n\n    void    operator = (const SelfType& src) { BaseType::operator = (src); }\n\n    bool    GetCaseInsensitive(const String& key, U* pvalue) const\n    {\n        String::NoCaseKey ikey(key);\n        return BaseType::GetAlt(ikey, pvalue);\n    }\n    // Pointer-returning get variety.\n    const U* GetCaseInsensitive(const String& key) const   \n    {\n        String::NoCaseKey ikey(key);\n        return BaseType::GetAlt(ikey);\n    }\n    U*  GetCaseInsensitive(const String& key)\n    {\n        String::NoCaseKey ikey(key);\n        return BaseType::GetAlt(ikey);\n    }\n\n    \n    typedef typename BaseType::Iterator base_iterator;\n\n    base_iterator    FindCaseInsensitive(const String& key)\n    {\n        String::NoCaseKey ikey(key);\n        return BaseType::FindAlt(ikey);\n    }\n\n    // Set just uses a find and assigns value if found. The key is not modified;\n    // this behavior is identical to Flash string variable assignment.    \n    void    SetCaseInsensitive(const String& key, const U& value)\n    {\n        base_iterator it = FindCaseInsensitive(key);\n        if (it != BaseType::End())\n        {\n            it->Second = value;\n        }\n        else\n        {\n            BaseType::Add(key, value);\n        }\n    } \n};\n\n} // OVR \n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_String_FormatUtil.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_String_FormatUtil.cpp\nContent     :   String format functions.\nCreated     :   February 27, 2013\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_String.h\"\n#include \"OVR_Log.h\"\n\nnamespace OVR {\n\nvoid StringBuffer::AppendFormat(const char* format, ...)\n{       \n    va_list argList;\n    char    buffer[512];\n    char*   bufferUsed = buffer;\n    char*   bufferAllocated = NULL;\n\n    va_start(argList, format);\n\n    #if !defined(OVR_CC_MSVC) // Non-Microsoft compilers require you to save a copy of the va_list.\n        va_list argListSaved;\n        va_copy(argListSaved, argList);\n    #endif\n\n    int requiredStrlen = OVR_vsnprintf(bufferUsed, OVR_ARRAY_COUNT(buffer), format, argList); // The large majority of the time this will succeed.\n\n    if(requiredStrlen >= (int)sizeof(buffer)) // If the initial capacity wasn't enough...\n    {\n        bufferAllocated = (char*)OVR_ALLOC(sizeof(char) * (requiredStrlen + 1));\n        bufferUsed = bufferAllocated;\n        if(bufferAllocated)\n        {\n            #if !defined(OVR_CC_MSVC)\n                va_end(argList);\n                va_copy(argList, argListSaved);\n            #endif\n            requiredStrlen = OVR_vsnprintf(bufferAllocated, (requiredStrlen + 1), format, argList);\n        }\n    }\n\n    if(requiredStrlen < 0) // If there was a printf format error...\n    {\n        bufferUsed = NULL;\n    }\n\n    va_end(argList);\n\n    if(bufferUsed)\n        AppendString(bufferUsed);\n\n    if(bufferAllocated)\n        OVR_FREE(bufferAllocated);\n}\n\n} // OVR\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_String_PathUtil.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_String_PathUtil.cpp\nContent     :   String filename/url helper function\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_String.h\"\n#include \"OVR_UTF8Util.h\"\n\nnamespace OVR {\n\n//--------------------------------------------------------------------\n// ***** Path-Scanner helper function \n\n// Scans file path finding filename start and extension start, fills in their addess.\nvoid ScanFilePath(const char* url, const char** pfilename, const char** pext)\n{ \n    const char* urlStart = url;\n    const char *filename = 0;\n    const char *lastDot = 0;\n\n    uint32_t charVal = UTF8Util::DecodeNextChar(&url);\n\n    while (charVal != 0)\n    {\n        if ((charVal == '/') || (charVal == '\\\\'))\n        {\n            filename = url;\n            lastDot  = 0;\n        }\n        else if (charVal == '.')\n        {\n            lastDot = url - 1;\n        }\n        \n        charVal = UTF8Util::DecodeNextChar(&url);\n    }\n\n    if (pfilename)\n    {\n        // It was a naked filename\n        if (urlStart && (*urlStart != '.') && *urlStart)\n            *pfilename = urlStart;\n        else\n            *pfilename = filename;\n    }\n\n    if (pext)\n    {\n        *pext = lastDot;\n    }\n}\n\n// Scans till the end of protocol. Returns first character past protocol,\n// 0 if not found.\n//  - protocol: 'file://', 'http://'\nconst char* ScanPathProtocol(const char* url)\n{    \n    uint32_t charVal = UTF8Util::DecodeNextChar(&url);\n    uint32_t charVal2;\n   \n    while (charVal != 0)\n    {\n        // Treat a colon followed by a slash as absolute.\n        if (charVal == ':')\n        {\n            charVal2 = UTF8Util::DecodeNextChar(&url);\n            charVal  = UTF8Util::DecodeNextChar(&url);\n            if ((charVal == '/') && (charVal2 == '\\\\'))\n                return url;\n        }\n        charVal = UTF8Util::DecodeNextChar(&url);\n    }\n    return 0;\n}\n\n\n//--------------------------------------------------------------------\n// ***** String Path API implementation\n\nbool String::HasAbsolutePath(const char* url)\n{\n    // Absolute paths can star with:\n    //  - protocols:        'file://', 'http://'\n    //  - windows drive:    'c:\\'\n    //  - UNC share name:   '\\\\share'\n    //  - unix root         '/'\n\n    // On the other hand, relative paths are:\n    //  - directory:        'directory/file'\n    //  - this directory:   './file'\n    //  - parent directory: '../file'\n    // \n    // For now, we don't parse '.' or '..' out, but instead let it be concatenated\n    // to string and let the OS figure it out. This, however, is not good for file\n    // name matching in library/etc, so it should be improved.\n\n    if (!url || !*url)\n        return true; // Treat empty strings as absolute.    \n\n    uint32_t charVal = UTF8Util::DecodeNextChar(&url);\n\n    // Fist character of '/' or '\\\\' means absolute url.\n    if ((charVal == '/') || (charVal == '\\\\'))\n        return true;\n\n    while (charVal != 0)\n    {\n        // Treat a colon followed by a slash as absolute.\n        if (charVal == ':')\n        {\n            charVal = UTF8Util::DecodeNextChar(&url);\n            // Protocol or windows drive. Absolute.\n            if ((charVal == '/') || (charVal == '\\\\'))\n                return true;\n        }\n        else if ((charVal == '/') || (charVal == '\\\\'))\n        {\n            // Not a first character (else 'if' above the loop would have caught it).\n            // Must be a relative url.\n            break;\n        }\n\n        charVal = UTF8Util::DecodeNextChar(&url);\n    }\n\n    // We get here for relative paths.\n    return false;    \n}\n\n\nbool String::HasExtension(const char* path)\n{\n    const char* ext = 0;\n    ScanFilePath(path, 0, &ext);\n    return ext != 0;\n}\nbool String::HasProtocol(const char* path)\n{\n    return ScanPathProtocol(path) != 0;\n}\n\n\nString  String::GetPath() const\n{\n    const char* filename = 0;\n    ScanFilePath(ToCStr(), &filename, 0);\n\n    // Technically we can have extra logic somewhere for paths,\n    // such as enforcing protocol and '/' only based on flags,\n    // but we keep it simple for now.\n    return String(ToCStr(), filename ? (filename-ToCStr()) : GetSize());\n}\n\nString  String::GetProtocol() const\n{\n    const char* protocolEnd = ScanPathProtocol(ToCStr());\n    return String(ToCStr(), protocolEnd ? (protocolEnd-ToCStr()) : 0);\n}\n\nString  String::GetFilename() const\n{\n    const char* filename = 0;\n    ScanFilePath(ToCStr(), &filename, 0);\n    return String(filename);\n}\nString  String::GetExtension() const\n{\n    const char* ext = 0;\n    ScanFilePath(ToCStr(), 0, &ext);\n    return String(ext);\n}\n\nvoid    String::StripExtension()\n{\n    const char* ext = 0;\n    ScanFilePath(ToCStr(), 0, &ext);    \n    if (ext)\n    {\n        *this = String(ToCStr(), ext-ToCStr());\n    }\n}\n\nvoid    String::StripProtocol()\n{\n    const char* protocol = ScanPathProtocol(ToCStr());\n    if (protocol)\n        AssignString(protocol, OVR_strlen(protocol));\n}\n\n} // OVR\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_SysFile.cpp",
    "content": "/**************************************************************************\n\nFilename    :   OVR_SysFile.cpp\nContent     :   File wrapper class implementation (Win32)\n\nCreated     :   April 5, 1999\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n**************************************************************************/\n\n#define  GFILE_CXX\n\n// Standard C library (Captain Obvious guarantees!)\n#include <stdio.h>\n\n#include \"OVR_SysFile.h\"\n#include \"OVR_Log.h\"\n\nnamespace OVR {\n\n// This is - a dummy file that fails on all calls.\n\nclass UnopenedFile : public File\n{\npublic:\n    UnopenedFile()  { }\n    ~UnopenedFile() { }\n\n    virtual const char* GetFilePath()               { return 0; }\n\n    // ** File Information\n    virtual bool        IsValid()                   { return 0; }\n    virtual bool        IsWritable()                { return 0; }\n\n    // Return position / file size\n    virtual int         Tell()                      { return 0; }\n    virtual int64_t     LTell()                     { return 0; }\n    virtual int         GetLength()                 { return 0; }\n    virtual int64_t     LGetLength()                { return 0; }\n\n//  virtual bool        Stat(FileStats *pfs)        { return 0; }\n    virtual int         GetErrorCode()              { return Error_FileNotFound; }\n\n    // ** Stream implementation & I/O\n    virtual int         Write(const uint8_t * /*pbuffer*/, int /*numBytes*/) { return -1; }\n    virtual int         Read(uint8_t * /*pbuffer*/, int /*numBytes*/)         { return -1; }\n    virtual int         SkipBytes(int /*numBytes*/)                          { return  0; }\n    virtual int         BytesAvailable()                                     { return  0; }\n    virtual bool        Flush()                                              { return  0; }\n    virtual int         Seek(int /*offset*/, int /*origin*/)                 { return -1; }\n    virtual int64_t     LSeek(int64_t /*offset*/, int /*origin*/)            { return -1; }\n    \n    virtual int         CopyFromStream(File * /*pstream*/, int /*byteSize*/)  { return -1; }\n    virtual bool        Close()                                              { return  0; }\n};\n\n\n\n// ***** System File\n\n// System file is created to access objects on file system directly\n// This file can refer directly to path\n\n// ** Constructor\nSysFile::SysFile() : DelegatedFile(0)\n{\n    pFile = *new UnopenedFile;\n}\n\nPtr<File> FileFILEOpen(const String& path, int flags, int mode);\n\n// Opens a file\nSysFile::SysFile(const String& path, int flags, int mode) : DelegatedFile(0)\n{\n    Open(path, flags, mode);\n}\n\n\n// ** Open & management\n// Will fail if file's already open\nbool SysFile::Open(const String& path, int flags, int mode)\n{\n    pFile = FileFILEOpen(path, flags, mode);\n    if ((!pFile) || (!pFile->IsValid()))\n    {\n        pFile = *new UnopenedFile;\n        OVR_DEBUG_LOG((\"Failed to open file: %s\", path.ToCStr()));\n        return 0;\n    }\n    //pFile = *OVR_NEW DelegatedFile(pFile); // MA Testing\n    if (flags & Open_Buffered)\n        pFile = *new BufferedFile(pFile);\n    return 1;\n}\n\n\n// ** Overrides\n\nint SysFile::GetErrorCode()\n{\n    return pFile ? pFile->GetErrorCode() : Error_FileNotFound;\n}\n\n\n// Overrides to provide re-open support\nbool SysFile::IsValid()\n{\n    return pFile && pFile->IsValid();\n}\nbool SysFile::Close()\n{\n    if (IsValid())\n    {\n        DelegatedFile::Close();\n        pFile = *new UnopenedFile;\n        return 1;\n    }\n    return 0;\n}\n\n} // OVR\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_SysFile.h",
    "content": "/************************************************************************************\n\nPublicHeader:   Kernel\nFilename    :   OVR_SysFile.h\nContent     :   Header for all internal file management - functions and structures\n                to be inherited by OS specific subclasses.\nCreated     :   September 19, 2012\nNotes       : \n\nNotes       :   errno may not be preserved across use of GBaseFile member functions\n            :   Directories cannot be deleted while files opened from them are in use\n                (For the GetFullName function)\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_SysFile_h\n#define OVR_SysFile_h\n\n#include \"OVR_File.h\"\n\nnamespace OVR {\n\n// ***** Declared classes\nclass   SysFile;\n\n//-----------------------------------------------------------------------------------\n// *** File Statistics\n\n// This class contents are similar to _stat, providing\n// creation, modify and other information about the file.\nstruct FileStat\n{\n    // No change or create time because they are not available on most systems\n    int64_t ModifyTime;\n    int64_t AccessTime;\n    int64_t FileSize;\n\n    bool operator== (const FileStat& stat) const\n    {\n        return ( (ModifyTime == stat.ModifyTime) &&\n                 (AccessTime == stat.AccessTime) &&\n                 (FileSize == stat.FileSize) );\n    }\n};\n\n//-----------------------------------------------------------------------------------\n// *** System File\n\n// System file is created to access objects on file system directly\n// This file can refer directly to path.\n// System file can be open & closed several times; however, such use is not recommended\n// This class is realy a wrapper around an implementation of File interface for a \n// particular platform.\n\nclass SysFile : public DelegatedFile\n{\nprotected:\n  SysFile(const SysFile &source) : DelegatedFile () { OVR_UNUSED(source); }\npublic:\n\n    // ** Constructor\n    SysFile();\n    // Opens a file\n    SysFile(const String& path, int flags = Open_Read|Open_Buffered, int mode = Mode_ReadWrite); \n\n    // ** Open & management \n    bool  Open(const String& path, int flags = Open_Read|Open_Buffered, int mode = Mode_ReadWrite);\n        \n    OVR_FORCE_INLINE bool  Create(const String& path, int mode = Mode_ReadWrite)\n    { return Open(path, Open_ReadWrite|Open_Create, mode); }\n\n    // Helper function: obtain file statistics information. In OVR, this is used to detect file changes.\n    // Return 0 if function failed, most likely because the file doesn't exist.\n    static bool OVR_CDECL GetFileStat(FileStat* pfileStats, const String& path);\n    \n    // ** Overrides\n    // Overridden to provide re-open support\n    virtual int   GetErrorCode();\n\n    virtual bool  IsValid();\n\n    virtual bool  Close();    \n};\n\n} // Namespace OVR\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_System.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_System.cpp\nContent     :   General kernel initialization/cleanup, including that\n                of the memory allocator.\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_System.h\"\n#include \"OVR_Threads.h\"\n#include \"OVR_Timer.h\"\n#include \"../Displays/OVR_Display.h\"\n#ifdef OVR_OS_WIN32\n#include \"../Displays/OVR_Win32_ShimFunctions.h\"\n#endif\n\nnamespace OVR {\n\n#ifdef OVR_OS_WIN32\nextern bool anyRiftsInExtendedMode();\n#endif\n\n// Stack of destroy listeners (push/pop semantics)\nstatic SystemSingletonInternal *SystemShutdownListenerStack = 0;\nstatic Lock stackLock;\nstatic bool DisplayShimInitialized = false;\n\nvoid SystemSingletonInternal::PushDestroyCallbacks()\n{\n    Lock::Locker locker(&stackLock);\n\n    // Push listener onto the stack\n    NextSingleton = SystemShutdownListenerStack;\n    SystemShutdownListenerStack = this;\n}\n\nvoid System::DirectDisplayInitialize()\n{\n#ifdef OVR_OS_WIN32\n\t// Set up display code for Windows\n\tWin32::DisplayShim::GetInstance();\n\n\t// This code will look for the first display. If it's a display\n\t// that's extending the destkop, the code will assume we're in\n\t// compatibility mode. Compatibility mode prevents shim loading\n\t// and renders only to extended Rifts.\n\t// If we find a display and it's application exclusive,\n\t// we load the shim so we can render to it.\n\t// If no display is available, we revert to whatever the\n\t// driver tells us we're in\n\n\tbool anyExtendedRifts = anyRiftsInExtendedMode() || Display::InCompatibilityMode( false );\n\t\n    DisplayShimInitialized = Win32::DisplayShim::GetInstance().Initialize(anyExtendedRifts);\n#endif\n}\n\nbool System::DirectDisplayEnabled()\n{\n    return DisplayShimInitialized;\n}\n\n// Initializes System core, installing allocator.\nvoid System::Init(Log* log, Allocator *palloc)\n{    \n    if (!Allocator::GetInstance())\n    {\n        Log::SetGlobalLog(log);\n        Timer::initializeTimerSystem();\n        Allocator::setInstance(palloc);\n\t\tDisplay::Initialize();\n\t\tDirectDisplayInitialize();\n    }\n    else\n    {\n        OVR_DEBUG_LOG((\"System::Init failed - duplicate call.\"));\n    }\n}\n\nvoid System::Destroy()\n{    \n    if (Allocator::GetInstance())\n    {\n#ifdef OVR_OS_WIN32\n\t\tWin32::DisplayShim::GetInstance().Shutdown();\n#endif\n\n\t\t// Invoke all of the post-finish callbacks (normal case)\n        for (SystemSingletonInternal *listener = SystemShutdownListenerStack; listener; listener = listener->NextSingleton)\n\t\t{\n\t\t\tlistener->OnThreadDestroy();\n\t\t}\n\n#ifdef OVR_ENABLE_THREADS\n\t\t// Wait for all threads to finish; this must be done so that memory\n\t\t// allocator and all destructors finalize correctly.\n\t\tThread::FinishAllThreads();\n#endif\n\n\t\t// Invoke all of the post-finish callbacks (normal case)\n        for (SystemSingletonInternal *next, *listener = SystemShutdownListenerStack; listener; listener = next)\n\t\t{\n            next = listener->NextSingleton;\n\n\t\t\tlistener->OnSystemDestroy();\n\t\t}\n\n        SystemShutdownListenerStack = 0;\n\n\t\t// Shutdown heap and destroy SysAlloc singleton, if any.\n        Allocator::GetInstance()->onSystemShutdown();\n        Allocator::setInstance(0);\n\n        Timer::shutdownTimerSystem();\n        Log::SetGlobalLog(Log::GetDefaultLog());\n    }\n    else\n    {\n        OVR_DEBUG_LOG((\"System::Destroy failed - System not initialized.\"));\n    }\n}\n\n// Returns 'true' if system was properly initialized.\nbool System::IsInitialized()\n{\n    return Allocator::GetInstance() != 0;\n}\n\n\n} // namespace OVR\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_System.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR\nFilename    :   OVR_System.h\nContent     :   General kernel initialization/cleanup, including that\n                of the memory allocator.\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_System_h\n#define OVR_System_h\n\n#include \"OVR_Allocator.h\"\n#include \"OVR_Log.h\"\n#include \"OVR_Atomic.h\"\n\nnamespace OVR {\n\n\n//-----------------------------------------------------------------------------\n// SystemSingleton\n\n// Subsystems are implemented using the Singleton pattern.\n// To avoid code duplication in all the places where Singletons are defined,\n// The pattern is defined once here and used everywhere.\n\nclass SystemSingletonInternal\n{\n    friend class System;\n\n    SystemSingletonInternal* NextSingleton;\n\n    // No copying allowed\n    OVR_NON_COPYABLE(SystemSingletonInternal);\n\nprotected:\n    SystemSingletonInternal() :\n        NextSingleton(0)\n    {\n    }\n\n    virtual ~SystemSingletonInternal(){}\n\n    // Call this to register the destroy events\n    // Destroy callbacks will be called in the reverse order they were registered\n    // Note: As a rule of thumb, call this at the end of the singleton class constructor.\n    void PushDestroyCallbacks();\n\n    // Required: Invoked when the System object is shutting down\n    // Called after threads are stopped\n    // Called before Log, Allocator, and Timer subsystems are stopped\n    // Listeners are called in the opposite order they were registered\n    virtual void OnSystemDestroy() = 0;\n\n    // Called just before waiting for threads to die\n    // Listeners are called in the opposite order they were registered\n    // Useful to start terminating threads at the right time\n    // Note: The singleton must not delete itself here.\n    virtual void OnThreadDestroy() {}\n};\n\n// Singletons derive from this class\ntemplate<class T>\nclass SystemSingletonBase : public SystemSingletonInternal\n{\n    static AtomicPtr<T> SingletonInstance;\n    static T* SlowGetInstance();\n\nprotected:\n    ~SystemSingletonBase()\n    {\n        // Make sure the instance gets set to zero on dtor\n        if (SingletonInstance == this)\n            SingletonInstance = 0;\n    }\n\npublic:\n    static OVR_FORCE_INLINE T* GetInstance()\n    {\n        // Fast version\n        // Note: The singleton instance is stored in an AtomicPtr<> to allow it to be accessed\n        // atomically from multiple threads without locks.\n        T* instance = SingletonInstance;\n        return instance ? instance : SlowGetInstance();\n    }\n};\n\n// For reference, see N3337 14.5.1.3 (Static data members of class templates):\ntemplate<class T> OVR::AtomicPtr<T> OVR::SystemSingletonBase<T>::SingletonInstance;\n\n// Place this in the singleton class in the header file\n#define OVR_DECLARE_SINGLETON(T) \\\n    friend class OVR::SystemSingletonBase<T>; \\\nprivate: \\\n    T(); \\\n    virtual ~T(); \\\n    virtual void OnSystemDestroy();\n\n// Place this in the singleton class source file\n#define OVR_DEFINE_SINGLETON(T) \\\n    namespace OVR { \\\n    template<> T* SystemSingletonBase<T>::SlowGetInstance() \\\n    { \\\n        static OVR::Lock lock; \\\n        OVR::Lock::Locker locker(&lock); \\\n        if (!SingletonInstance) SingletonInstance = new T; \\\n        return SingletonInstance; \\\n    } \\\n    }\n\n\n// ***** System Core Initialization class\n\n// System initialization must take place before any other OVR_Kernel objects are used;\n// this is done my calling System::Init(). Among other things, this is necessary to\n// initialize the memory allocator. Similarly, System::Destroy must be\n// called before program exist for proper cleanup. Both of these tasks can be achieved by\n// simply creating System object first, allowing its constructor/destructor do the work.\n\n// TBD: Require additional System class for Oculus Rift API?\n\nclass System\n{\npublic:\n    // System constructor expects allocator to be specified, if it is being substituted.\n    System(Log* log = Log::ConfigureDefaultLog(LogMask_Debug),\n           Allocator* palloc = DefaultAllocator::InitSystemSingleton())\n    {\n        Init(log, palloc);\n    }\n    ~System()\n    {\n        Destroy();\n    }\n\n\tstatic void OVR_CDECL DirectDisplayInitialize();\n    static bool OVR_CDECL DirectDisplayEnabled();\n\n    // Returns 'true' if system was properly initialized.\n    static bool OVR_CDECL IsInitialized();\n\n    // Initializes System core.  Users can override memory implementation by passing\n    // a different Allocator here.\n    static void OVR_CDECL Init(Log* log = Log::ConfigureDefaultLog(LogMask_Debug),\n                               Allocator *palloc = DefaultAllocator::InitSystemSingleton());\n\n\t// De-initializes System more, finalizing the threading system and destroying\n    // the global memory allocator.\n    static void OVR_CDECL Destroy();\n};\n\n\n} // namespace OVR\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_ThreadCommandQueue.cpp",
    "content": "/************************************************************************************\n\nPublicHeader:   None\nFilename    :   OVR_ThreadCommandQueue.cpp\nContent     :   Command queue for operations executed on a thread\nCreated     :   October 29, 2012\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_ThreadCommandQueue.h\"\n\nnamespace OVR {\n\n\n//------------------------------------------------------------------------\n// ***** CircularBuffer\n\n// CircularBuffer is a FIFO buffer implemented in a single block of memory,\n// which allows writing and reading variable-size data chucks. Write fails\n// if buffer is full.\n\nclass CircularBuffer\n{\n    enum {\n        AlignSize = 16,\n        AlignMask = AlignSize - 1\n    };\n\n    uint8_t*  pBuffer;\n    size_t  Size;\n    size_t  Tail;   // Byte offset of next item to be popped.\n    size_t  Head;   // Byte offset of where next push will take place.\n    size_t  End;    // When Head < Tail, this is used instead of Size.    \n\n    inline size_t roundUpSize(size_t size)\n    { return (size + AlignMask) & ~(size_t)AlignMask; }\n\npublic:\n\n    CircularBuffer(size_t size)\n        : Size(size), Tail(0), Head(0), End(0)\n    {\n        pBuffer = (uint8_t*)OVR_ALLOC_ALIGNED(roundUpSize(size), AlignSize);\n    }\n    ~CircularBuffer()\n    {\n        // For ThreadCommands, we must consume everything before shutdown.\n        OVR_ASSERT(IsEmpty());\n        OVR_FREE_ALIGNED(pBuffer);\n    }\n\n    bool    IsEmpty() const { return (Head == Tail); }\n\n    // Allocates a state block of specified size and advances pointers,\n    // returning 0 if buffer is full.\n    uint8_t*  Write(size_t size);\n\n    // Returns a pointer to next available data block; 0 if none available.\n    uint8_t*  ReadBegin()\n    { return (Head != Tail) ? (pBuffer + Tail) : 0; }\n    // Consumes data of specified size; this must match size passed to Write.\n    void    ReadEnd(size_t size);\n};\n\n\n// Allocates a state block of specified size and advances pointers,\n// returning 0 if buffer is full.\nuint8_t* CircularBuffer::Write(size_t size)\n{\n    uint8_t* p = 0;\n\n    size = roundUpSize(size);\n    // Since this is circular buffer, always allow at least one item.\n    OVR_ASSERT(size < Size/2);\n\n    if (Head >= Tail)\n    {\n        OVR_ASSERT(End == 0);\n        \n        if (size <= (Size - Head))\n        {\n            p    = pBuffer + Head;\n            Head += size;\n        }\n        else if (size < Tail)\n        {\n            p    = pBuffer;\n            End  = Head;\n            Head = size;\n            OVR_ASSERT(Head != Tail);\n        }\n    }\n    else\n    {\n        OVR_ASSERT(End != 0);\n\n        if ((Tail - Head) > size)\n        {\n            p    = pBuffer + Head;\n            Head += size;\n            OVR_ASSERT(Head != Tail);\n        }\n    }\n\n    return p;\n}\n\nvoid CircularBuffer::ReadEnd(size_t size)\n{\n    OVR_ASSERT(Head != Tail);\n    size = roundUpSize(size);\n    \n    Tail += size;        \n    if (Tail == End)\n    {\n        Tail = End = 0;\n    }\n    else if (Tail == Head)\n    {        \n        OVR_ASSERT(End == 0);\n        Tail = Head = 0;\n    }\n}\n\n\n//-------------------------------------------------------------------------------------\n// ***** ThreadCommand\n\nThreadCommand::PopBuffer::~PopBuffer()\n{\n\tif (Size) {\n\t\tDestruct<ThreadCommand>(toCommand());\n\t}\n}\n\nvoid ThreadCommand::PopBuffer::InitFromBuffer(void* data)\n{\n    ThreadCommand* cmd = (ThreadCommand*)data;\n    OVR_ASSERT(cmd->Size <= MaxSize);\n\n\tif (Size) {\n\t\tDestruct<ThreadCommand>(toCommand());\n\t}\n    Size = cmd->Size;    \n    memcpy(Buffer, (void*)cmd, Size);\n}\n\nvoid ThreadCommand::PopBuffer::Execute()\n{\n    ThreadCommand* command = toCommand();\n    OVR_ASSERT(command);\n    command->Execute();\n\tif (NeedsWait()) {\n\t\tGetEvent()->PulseEvent();\n\t}\n}\n\n//-------------------------------------------------------------------------------------\n\nclass ThreadCommandQueueImpl : public NewOverrideBase\n{\n    typedef ThreadCommand::NotifyEvent NotifyEvent;\n    friend class ThreadCommandQueue;\n    \npublic:\n\n    ThreadCommandQueueImpl(ThreadCommandQueue* queue) :\n\t\tpQueue(queue),\n\t\tExitEnqueued(false),\n\t\tExitProcessed(false),\n\t\tCommandBuffer(2048),\n\t\tPullThreadId(0)\n    {\n    }\n    ~ThreadCommandQueueImpl();\n\n\n    bool PushCommand(const ThreadCommand& command);\n    bool PopCommand(ThreadCommand::PopBuffer* popBuffer);\n\n\n    // ExitCommand is used by notify us that Thread is shutting down.\n    struct ExitCommand : public ThreadCommand\n    {\n        ThreadCommandQueueImpl* pImpl;\n        \n        ExitCommand(ThreadCommandQueueImpl* impl, bool wait)\n            : ThreadCommand(sizeof(ExitCommand), wait, true), pImpl(impl) { }\n\n        virtual void Execute() const\n        {\n            Lock::Locker lock(&pImpl->QueueLock);\n            pImpl->ExitProcessed = true;\n        }\n        virtual ThreadCommand* CopyConstruct(void* p) const \n        { return Construct<ExitCommand>(p, *this); }\n    };\n\n\n    NotifyEvent* AllocNotifyEvent_NTS()\n    {\n        NotifyEvent* p = AvailableEvents.GetFirst();\n\n        if (!AvailableEvents.IsNull(p))\n            p->RemoveNode();        \n        else\n            p = new NotifyEvent;\n        return p;\n    }\n\n    void         FreeNotifyEvent_NTS(NotifyEvent* p)\n    {\n        AvailableEvents.PushBack(p);\n    }\n\n    void        FreeNotifyEvents_NTS()\n    {\n        while(!AvailableEvents.IsEmpty())\n        {\n            NotifyEvent* p = AvailableEvents.GetFirst();\n            p->RemoveNode();\n            delete p;\n        }\n    }\n\n    ThreadCommandQueue* pQueue;\n    Lock                QueueLock;\n    volatile bool       ExitEnqueued;\n    volatile bool       ExitProcessed;\n    List<NotifyEvent>   AvailableEvents;\n    List<NotifyEvent>   BlockedProducers;\n    CircularBuffer      CommandBuffer;\n\n\t// The pull thread id is set to the last thread that pulled commands.\n\t// Since this thread command queue is designed for a single thread,\n\t// reentrant behavior that would cause a dead-lock for messages that\n\t// wait for completion can be avoided by simply comparing the\n\t// thread id of the last pull.\n\tOVR::ThreadId\t\tPullThreadId;\n};\n\nThreadCommandQueueImpl::~ThreadCommandQueueImpl()\n{\n    Lock::Locker lock(&QueueLock);\n    OVR_ASSERT(BlockedProducers.IsEmpty());\n    FreeNotifyEvents_NTS();\n}\n\nbool ThreadCommandQueueImpl::PushCommand(const ThreadCommand& command)\n{\n\tif (command.NeedsWait() && PullThreadId == OVR::GetCurrentThreadId())\n\t{\n\t\tcommand.Execute();\n\t\treturn true;\n\t}\n\n    ThreadCommand::NotifyEvent* completeEvent = 0;\n    ThreadCommand::NotifyEvent* queueAvailableEvent = 0;\n\n    // Repeat  writing command into buffer until it is available.    \n\tfor (;;) {\n        { // Lock Scope\n            Lock::Locker lock(&QueueLock);\n\n            if (queueAvailableEvent) {\n                FreeNotifyEvent_NTS(queueAvailableEvent);\n                queueAvailableEvent = 0;\n            }\n\n            // Don't allow any commands after PushExitCommand() is called.\n\t\t\tif (ExitEnqueued && !command.ExitFlag) {\n\t\t\t\treturn false;\n\t\t\t}\n\n            bool bufferWasEmpty = CommandBuffer.IsEmpty();\n            uint8_t* buffer = CommandBuffer.Write(command.GetSize());\n\n\t\t\tif (buffer) {\n                ThreadCommand* c = command.CopyConstruct(buffer);\n\n\t\t\t\tif (c->NeedsWait()) {\n\t\t\t\t\tcompleteEvent = c->pEvent = AllocNotifyEvent_NTS();\n\t\t\t\t}\n\n\t\t\t\t// Signal-waker consumer when we add data to buffer.\n\t\t\t\tif (bufferWasEmpty) {\n\t\t\t\t\tpQueue->OnPushNonEmpty_Locked();\n\t\t\t\t}\n\n\t\t\t\tbreak;\n            }\n\n            queueAvailableEvent = AllocNotifyEvent_NTS();\n            BlockedProducers.PushBack(queueAvailableEvent);\n        } // Lock Scope\n\n        queueAvailableEvent->Wait();\n    } // Intentional infinite loop\n\n    // Command was enqueued, wait if necessary.\n    if (completeEvent) {\n        completeEvent->Wait();\n        Lock::Locker lock(&QueueLock);\n        FreeNotifyEvent_NTS(completeEvent);\n    }\n\n    return true;\n}\n\n\n// Pops the next command from the thread queue, if any is available.\nbool ThreadCommandQueueImpl::PopCommand(ThreadCommand::PopBuffer* popBuffer)\n{    \n\tPullThreadId = OVR::GetCurrentThreadId();\n\n\tLock::Locker lock(&QueueLock);\n\n    uint8_t* buffer = CommandBuffer.ReadBegin();\n    if (!buffer)\n    {\n        // Notify thread while in lock scope, enabling initialization of wait.\n        pQueue->OnPopEmpty_Locked();\n        return false;\n    }\n\n    popBuffer->InitFromBuffer(buffer);\n    CommandBuffer.ReadEnd(popBuffer->GetSize());\n\n    if (!BlockedProducers.IsEmpty())\n    {\n        ThreadCommand::NotifyEvent* queueAvailableEvent = BlockedProducers.GetFirst();\n        queueAvailableEvent->RemoveNode();\n        queueAvailableEvent->PulseEvent();\n        // Event is freed later by waiter.\n    }    \n    return true;\n}\n\n\n//-------------------------------------------------------------------------------------\n\nThreadCommandQueue::ThreadCommandQueue()\n{\n    pImpl = new ThreadCommandQueueImpl(this);\n}\nThreadCommandQueue::~ThreadCommandQueue()\n{\n    delete pImpl;\n}\n\nbool ThreadCommandQueue::PushCommand(const ThreadCommand& command)\n{\n    return pImpl->PushCommand(command);\n}\n\nbool ThreadCommandQueue::PopCommand(ThreadCommand::PopBuffer* popBuffer)\n{    \n    return pImpl->PopCommand(popBuffer);\n}\n\nvoid ThreadCommandQueue::PushExitCommand(bool wait)\n{\n    // Exit is processed in two stages:\n    //  - First, ExitEnqueued flag is set to block further commands from queuing up.\n    //  - Second, the actual exit call is processed on the consumer thread, flushing\n    //    any prior commands.\n    //    IsExiting() only returns true after exit has flushed.\n    {\n        Lock::Locker lock(&pImpl->QueueLock);\n        if (pImpl->ExitEnqueued)\n            return;\n        pImpl->ExitEnqueued = true;\n    }\n\n    PushCommand(ThreadCommandQueueImpl::ExitCommand(pImpl, wait));\n}\n\nbool ThreadCommandQueue::IsExiting() const\n{\n    return pImpl->ExitProcessed;\n}\n\n\n} // namespace OVR\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_ThreadCommandQueue.h",
    "content": "/************************************************************************************\n\nPublicHeader:   None\nFilename    :   OVR_ThreadCommandQueue.h\nContent     :   Command queue for operations executed on a thread\nCreated     :   October 29, 2012\nAuthor      :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_ThreadCommandQueue_h\n#define OVR_ThreadCommandQueue_h\n\n#include \"../Kernel/OVR_Types.h\"\n#include \"../Kernel/OVR_List.h\"\n#include \"../Kernel/OVR_Atomic.h\"\n#include \"../Kernel/OVR_Threads.h\"\n\nnamespace OVR {\n\nclass ThreadCommand;\nclass ThreadCommandQueue;\n\n\n//-------------------------------------------------------------------------------------\n// ***** ThreadCommand\n\n// ThreadCommand is a base class implementation for commands stored in ThreadCommandQueue.\nclass ThreadCommand\n{\npublic:    \n    // NotifyEvent is used by ThreadCommandQueue::PushCallAndWait to notify the\n    // calling (producer)  thread when command is completed or queue slot is available.\n    class NotifyEvent : public ListNode<NotifyEvent>, public NewOverrideBase\n    {\n        Event E;\n    public:   \n        NotifyEvent() { }\n\n        void Wait()        { E.Wait(); }\n        void PulseEvent()  { E.PulseEvent(); }\n    };\n\n    // ThreadCommand::PopBuffer is temporary storage for a command popped off\n    // by ThreadCommandQueue::PopCommand. \n    class PopBuffer\n    {\n        enum { MaxSize = 256 };\n\n        size_t Size;\n        union {            \n            uint8_t Buffer[MaxSize];\n            size_t Align;\n        };\n\n        ThreadCommand* toCommand() const { return (ThreadCommand*)Buffer; }\n\n    public:\n        PopBuffer() : Size(0) { }\n        ~PopBuffer();\n\n        void        InitFromBuffer(void* data);\n\n        bool        HasCommand() const  { return Size != 0; }\n        size_t      GetSize() const     { return Size; }\n        bool        NeedsWait() const   { return toCommand()->NeedsWait(); }\n        NotifyEvent* GetEvent() const   { return toCommand()->pEvent; }\n\n        // Execute the command and also notifies caller to finish waiting,\n        // if necessary.\n        void        Execute();\n    };\n    \n    uint16_t     Size;\n    bool         WaitFlag; \n    bool         ExitFlag; // Marks the last exit command. \n    NotifyEvent* pEvent;\n\n    ThreadCommand(size_t size, bool waitFlag, bool exitFlag = false)\n        : Size((uint16_t)size), WaitFlag(waitFlag), ExitFlag(exitFlag), pEvent(0) { }\n    virtual ~ThreadCommand() { }\n\n    bool          NeedsWait() const { return WaitFlag; }\n    size_t        GetSize() const   { return Size; }\n\n    virtual void            Execute() const = 0;\n    // Copy constructor used for serializing this to memory buffer.\n    virtual ThreadCommand*  CopyConstruct(void* p) const = 0;\n};\n\n\n//-------------------------------------------------------------------------------------\n\n// CleanType is a template that strips 'const' and '&' modifiers from the argument type;\n// for example, typename CleanType<A&>::Type is equivalent to A.\ntemplate<class T> struct CleanType           { typedef T Type; };\ntemplate<class T> struct CleanType<T&>       { typedef T Type; };\ntemplate<class T> struct CleanType<const T>  { typedef T Type; };\ntemplate<class T> struct CleanType<const T&> { typedef T Type; };\n\n// SelfType is a template that yields the argument type. This helps avoid conflicts with\n// automatic template argument deduction for function calls when identical argument\n// is already defined.\ntemplate<class T> struct SelfType { typedef T Type; };\n\n\n\n//-------------------------------------------------------------------------------------\n// ThreadCommand specializations for member functions with different number of\n// arguments and argument types.\n\n// Used to return nothing from a ThreadCommand, to avoid problems with 'void'.\nstruct Void\n{\n    Void() {}\n    Void(int) {}\n};\n\n// ThreadCommand for member function with 0 arguments.\ntemplate<class C, class R>\nclass ThreadCommandMF0 : public ThreadCommand\n{   \n    typedef R (C::*FnPtr)();\n    C*      pClass;\n    FnPtr   pFn;\n    R*      pRet;\n\n    void executeImpl() const\n    {\n        pRet ? (void)(*pRet = (pClass->*pFn)()) :\n\t           (void)(pClass->*pFn)();\n    }\n\npublic:    \n    ThreadCommandMF0(C* pclass, FnPtr fn, R* ret, bool needsWait)\n        : ThreadCommand(sizeof(ThreadCommandMF0), needsWait),\n          pClass(pclass), pFn(fn), pRet(ret) { }\n\n    virtual void           Execute() const { executeImpl(); }\n    virtual ThreadCommand* CopyConstruct(void* p) const\n    { return Construct<ThreadCommandMF0>(p, *this); }\n};\n\n\n// ThreadCommand for member function with 1 argument.\ntemplate<class C, class R, class A0>\nclass ThreadCommandMF1 : public ThreadCommand\n{   \n    typedef R (C::*FnPtr)(A0);\n    C*                           pClass;\n    FnPtr                        pFn;\n    R*                           pRet;\n    typename CleanType<A0>::Type AVal0;\n\n    void executeImpl() const\n    {\n      pRet ? (void)(*pRet = (pClass->*pFn)(AVal0)) :\n\t         (void)(pClass->*pFn)(AVal0);\n    }\n\npublic:    \n    ThreadCommandMF1(C* pclass, FnPtr fn, R* ret, A0 a0, bool needsWait)\n        : ThreadCommand(sizeof(ThreadCommandMF1), needsWait),\n          pClass(pclass), pFn(fn), pRet(ret), AVal0(a0) { }\n\n    virtual void           Execute() const { executeImpl(); }\n    virtual ThreadCommand* CopyConstruct(void* p) const\n    { return Construct<ThreadCommandMF1>(p, *this); }\n};\n\n// ThreadCommand for member function with 2 arguments.\ntemplate<class C, class R, class A0, class A1>\nclass ThreadCommandMF2 : public ThreadCommand\n{   \n    typedef R (C::*FnPtr)(A0, A1);\n    C*                            pClass;\n    FnPtr                         pFn;\n    R*                            pRet;\n    typename CleanType<A0>::Type  AVal0;\n    typename CleanType<A1>::Type  AVal1;\n\n    void executeImpl() const\n    {\n        pRet ? (void)(*pRet = (pClass->*pFn)(AVal0, AVal1)) :\n\t           (void)(pClass->*pFn)(AVal0, AVal1);\n    }\n\npublic:    \n    ThreadCommandMF2(C* pclass, FnPtr fn, R* ret, A0 a0, A1 a1, bool needsWait)\n        : ThreadCommand(sizeof(ThreadCommandMF2), needsWait),\n          pClass(pclass), pFn(fn), pRet(ret), AVal0(a0), AVal1(a1) { }\n    \n    virtual void           Execute() const { executeImpl(); }\n    virtual ThreadCommand* CopyConstruct(void* p) const \n    { return Construct<ThreadCommandMF2>(p, *this); }\n};\n\n\n//-------------------------------------------------------------------------------------\n// ***** ThreadCommandQueue\n\n// ThreadCommandQueue is a queue of executable function-call commands intended to be\n// serviced by a single consumer thread. Commands are added to the queue with PushCall\n// and removed with PopCall; they are processed in FIFO order. Multiple producer threads\n// are supported and will be blocked if internal data buffer is full.\n\nclass ThreadCommandQueue\n{\npublic:\n\n    ThreadCommandQueue();\n    virtual ~ThreadCommandQueue();\n\n\n    // Pops the next command from the thread queue, if any is available.\n    // The command should be executed by calling popBuffer->Execute().\n    // Returns 'false' if no command is available at the time of the call.\n    bool PopCommand(ThreadCommand::PopBuffer* popBuffer);\n\n    // Generic implementaion of PushCommand; enqueues a command for execution.\n    // Returns 'false' if push failed, usually indicating thread shutdown.\n    bool PushCommand(const ThreadCommand& command);\n\n    // \n    void PushExitCommand(bool wait);\n\n    // Returns 'true' once ExitCommand has been processed, so the thread can shut down.\n    bool IsExiting() const;\n\n\n    // These two virtual functions serve as notifications for derived\n    // thread waiting.    \n    virtual void OnPushNonEmpty_Locked() { }\n    virtual void OnPopEmpty_Locked()     { }\n\n\n    // *** PushCall with no result\n    \n    // Enqueue a member function of 'this' class to be called on consumer thread.\n    // By default the function returns immediately; set 'wait' argument to 'true' to\n    // wait for completion.\n    template<class C, class R>\n    bool PushCall(R (C::*fn)(), bool wait = false)\n    { return PushCommand(ThreadCommandMF0<C,R>(static_cast<C*>(this), fn, 0, wait)); }       \n    template<class C, class R, class A0>\n    bool PushCall(R (C::*fn)(A0), typename SelfType<A0>::Type a0, bool wait = false)\n    { return PushCommand(ThreadCommandMF1<C,R,A0>(static_cast<C*>(this), fn, 0, a0, wait)); }\n    template<class C, class R, class A0, class A1>\n    bool PushCall(R (C::*fn)(A0, A1),\n                  typename SelfType<A0>::Type a0, typename SelfType<A1>::Type a1, bool wait = false)\n    { return PushCommand(ThreadCommandMF2<C,R,A0,A1>(static_cast<C*>(this), fn, 0, a0, a1, wait)); }\n    // Enqueue a specified member function call of class C.\n    // By default the function returns immediately; set 'wait' argument to 'true' to\n    // wait for completion.\n    template<class C, class R>\n    bool PushCall(C* p, R (C::*fn)(), bool wait = false)\n    { return PushCommand(ThreadCommandMF0<C,R>(p, fn, 0, wait)); }\n    template<class C, class R, class A0>\n    bool PushCall(C* p, R (C::*fn)(A0), typename SelfType<A0>::Type a0, bool wait = false)\n    { return PushCommand(ThreadCommandMF1<C,R,A0>(p, fn, 0, a0, wait)); }\n    template<class C, class R, class A0, class A1>\n    bool PushCall(C* p, R (C::*fn)(A0, A1),\n                  typename SelfType<A0>::Type a0, typename SelfType<A1>::Type a1, bool wait = false)\n    { return PushCommand(ThreadCommandMF2<C,R,A0,A1>(p, fn, 0, a0, a1, wait)); }\n    \n    \n    // *** PushCall with Result\n\n    // Enqueue a member function of 'this' class call and wait for call to complete\n    // on consumer thread before returning.\n    template<class C, class R>\n    bool PushCallAndWaitResult(R (C::*fn)(), R* ret)\n    { return PushCommand(ThreadCommandMF0<C,R>(static_cast<C*>(this), fn, ret, true)); }       \n    template<class C, class R, class A0>\n    bool PushCallAndWaitResult(R (C::*fn)(A0), R* ret, typename SelfType<A0>::Type a0)\n    { return PushCommand(ThreadCommandMF1<C,R,A0>(static_cast<C*>(this), fn, ret, a0, true)); }\n    template<class C, class R, class A0, class A1>\n    bool PushCallAndWaitResult(R (C::*fn)(A0, A1), R* ret,\n                               typename SelfType<A0>::Type a0, typename SelfType<A1>::Type a1)\n    { return PushCommand(ThreadCommandMF2<C,R,A0,A1>(static_cast<C*>(this), fn, ret, a0, a1, true)); }\n    // Enqueue a member function call for class C and wait for the call to complete\n    // on consumer thread before returning.\n    template<class C, class R>\n    bool PushCallAndWaitResult(C* p, R (C::*fn)(), R* ret)\n    { return PushCommand(ThreadCommandMF0<C,R>(p, fn, ret, true)); }\n    template<class C, class R, class A0>\n    bool PushCallAndWaitResult(C* p, R (C::*fn)(A0), R* ret, typename SelfType<A0>::Type a0)\n    { return PushCommand(ThreadCommandMF1<C,R,A0>(p, fn, ret, a0, true)); }\n    template<class C, class R, class A0, class A1>\n    bool PushCallAndWaitResult(C* p, R (C::*fn)(A0, A1), R* ret,\n                               typename SelfType<A0>::Type a0, typename SelfType<A1>::Type a1)\n    { return PushCommand(ThreadCommandMF2<C,R,A0,A1>(p, fn, ret, a0, a1, true)); }\n\nprivate:\n    class ThreadCommandQueueImpl* pImpl;\n};\n\n\n} // namespace OVR\n\n#endif // OVR_ThreadCommandQueue_h\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Threads.h",
    "content": "/************************************************************************************\n\nPublicHeader:   None\nFilename    :   OVR_Threads.h\nContent     :   Contains thread-related (safe) functionality\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n#ifndef OVR_Threads_h\n#define OVR_Threads_h\n\n#include \"OVR_Types.h\"\n#include \"OVR_Atomic.h\"\n#include \"OVR_RefCount.h\"\n#include \"OVR_Array.h\"\n\n// Defines the infinite wait delay timeout\n#define OVR_WAIT_INFINITE 0xFFFFFFFF\n\n// To be defined in the project configuration options\n#ifdef OVR_ENABLE_THREADS\n\n\nnamespace OVR {\n\n//-----------------------------------------------------------------------------------\n// ****** Declared classes\n\n// Declared with thread support only\nclass   Mutex;\nclass   WaitCondition;\nclass   Event;\n// Implementation forward declarations\nclass MutexImpl;\nclass WaitConditionImpl;\n\n\n\n//-----------------------------------------------------------------------------------\n// ***** Mutex\n\n// Mutex class represents a system Mutex synchronization object that provides access \n// serialization between different threads, allowing one thread mutually exclusive access \n// to a resource. Mutex is more heavy-weight then Lock, but supports WaitCondition.\n\nclass Mutex\n{\n    friend class WaitConditionImpl;    \n    friend class MutexImpl;\n\n    MutexImpl  *pImpl; \n\npublic:\n    // Constructor/destructor\n    Mutex(bool recursive = 1);\n    ~Mutex();\n\n    // Locking functions\n    void  DoLock();\n    bool  TryLock();\n    void  Unlock();\n\n    // Returns 1 if the mutes is currently locked by another thread\n    // Returns 0 if the mutex is not locked by another thread, and can therefore be acquired. \n    bool  IsLockedByAnotherThread();\n    \n    // Locker class; Used for automatic locking of a mutex withing scope    \n    class Locker\n    {\n    public:\n        Mutex *pMutex;\n        Locker(Mutex *pmutex)\n            { pMutex = pmutex; pMutex->DoLock(); }\n        ~Locker()\n            { pMutex->Unlock(); }\n    };\n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** WaitCondition\n\n/*\n    WaitCondition is a synchronization primitive that can be used to implement what is known as a monitor.\n    Dependent threads wait on a wait condition by calling Wait(), and get woken up by other threads that\n    call Notify() or NotifyAll().\n\n    The unique feature of this class is that it provides an atomic way of first releasing a Mutex, and then \n    starting a wait on a wait condition. If both the mutex and the wait condition are associated with the same\n    resource, this ensures that any condition checked for while the mutex was locked does not change before\n    the wait on the condition is actually initiated.\n*/\n\nclass WaitCondition\n{\n    friend class WaitConditionImpl;\n    // Internal implementation structure\n    WaitConditionImpl *pImpl;\n\npublic:\n    // Constructor/destructor\n    WaitCondition();\n    ~WaitCondition();\n\n    // Release mutex and wait for condition. The mutex is re-aquired after the wait.\n    // Delay is specified in milliseconds (1/1000 of a second).\n    bool    Wait(Mutex *pmutex, unsigned delay = OVR_WAIT_INFINITE);\n\n    // Notify a condition, releasing at one object waiting\n    void    Notify();\n    // Notify a condition, releasing all objects waiting\n    void    NotifyAll();\n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** Event\n\n// Event is a wait-able synchronization object similar to Windows event.\n// Event can be waited on until it's signaled by another thread calling\n// either SetEvent or PulseEvent.\n\nclass Event\n{\n    // Event state, its mutex and the wait condition\n    volatile bool   State;\n    volatile bool   Temporary;  \n    mutable Mutex   StateMutex;\n    WaitCondition   StateWaitCondition;\n\n    void updateState(bool newState, bool newTemp, bool mustNotify);\n\npublic:    \n    Event(bool setInitially = 0) : State(setInitially), Temporary(false) { }\n    ~Event() { }\n\n    // Wait on an event condition until it is set\n    // Delay is specified in milliseconds (1/1000 of a second).\n    bool  Wait(unsigned delay = OVR_WAIT_INFINITE);\n    \n    // Set an event, releasing objects waiting on it\n    void  SetEvent()\n    { updateState(true, false, true); }\n\n    // Reset an event, un-signaling it\n    void  ResetEvent()\n    { updateState(false, false, false); }\n\n    // Set and then reset an event once a waiter is released.\n    // If threads are already waiting, they will be notified and released\n    // If threads are not waiting, the event is set until the first thread comes in\n    void  PulseEvent()\n    { updateState(true, true, true); }\n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** Thread class\n\n// ThreadHandle is a handle to a thread, which on some platforms (e.g. Windows) is \n// different from ThreadId. On Unix platforms, a ThreadHandle is the same as a \n// ThreadId and is pthread_t.\ntypedef void* ThreadHandle;\n\n// ThreadId uniquely identifies a thread; returned by Windows GetCurrentThreadId(), \n// Unix pthread_self() and Thread::GetThreadId.\ntypedef void* ThreadId;\n\n\n// *** Thread flags\n\n// Indicates that the thread is has been started, i.e. Start method has been called, and threads\n// OnExit() method has not yet been called/returned.\n#define OVR_THREAD_STARTED               0x01\n// This flag is set once the thread has ran, and finished.\n#define OVR_THREAD_FINISHED              0x02\n// This flag is set temporarily if this thread was started suspended. It is used internally.\n#define OVR_THREAD_START_SUSPENDED       0x08\n// This flag is used to ask a thread to exit. Message driven threads will usually check this flag\n// and finish once it is set.\n#define OVR_THREAD_EXIT                  0x10\n\n\nclass Thread : public RefCountBase<Thread>\n{ // NOTE: Waitable must be the first base since it implements RefCountImpl.    \npublic:\n    // *** Callback functions, can be used instead of overriding Run\n\n    // Run function prototypes.    \n    // Thread function and user handle passed to it, executed by the default\n    // Thread::Run implementation if not null.\n    typedef int (*ThreadFn)(Thread *pthread, void* h);\n    \n    // Thread ThreadFunction1 is executed if not 0, otherwise ThreadFunction2 is tried\n    ThreadFn    ThreadFunction;    \n    // User handle passes to a thread\n    void*       UserHandle;\n\n    // Thread state to start a thread with\n    enum ThreadState\n    {\n        NotRunning  = 0,\n        Running     = 1,\n        Suspended   = 2\n    };\n\n    // Thread priority\n    enum ThreadPriority\n    {\n        CriticalPriority,\n        HighestPriority,\n        AboveNormalPriority,\n        NormalPriority,\n        BelowNormalPriority,\n        LowestPriority,\n        IdlePriority,\n    };\n\n    // Thread constructor parameters\n    struct CreateParams\n    {\n        CreateParams(ThreadFn func = 0, void* hand = 0, size_t ssize = 128 * 1024, \n                     int proc = -1, ThreadState state = NotRunning, ThreadPriority prior = NormalPriority)\n                     : threadFunction(func), userHandle(hand), stackSize(ssize), \n                       processor(proc), initialState(state), priority(prior) {}\n        ThreadFn       threadFunction;   // Thread function\n        void*          userHandle;       // User handle passes to a thread\n        size_t         stackSize;        // Thread stack size\n        int            processor;        // Thread hardware processor\n        ThreadState    initialState;     // \n        ThreadPriority priority;         // Thread priority\n    };\n\n\n    // *** Constructors\n\n    // A default constructor always creates a thread in NotRunning state, because\n    // the derived class has not yet been initialized. The derived class can call Start explicitly.\n    // \"processor\" parameter specifies which hardware processor this thread will be run on. \n    // -1 means OS decides this. Implemented only on Win32\n    Thread(size_t stackSize = 128 * 1024, int processor = -1);\n    // Constructors that initialize the thread with a pointer to function.\n    // An option to start a thread is available, but it should not be used if classes are derived from Thread.\n    // \"processor\" parameter specifies which hardware processor this thread will be run on. \n    // -1 means OS decides this. Implemented only on Win32\n    Thread(ThreadFn threadFunction, void*  userHandle = 0, size_t stackSize = 128 * 1024,\n           int processor = -1, ThreadState initialState = NotRunning);\n    // Constructors that initialize the thread with a create parameters structure.\n    explicit Thread(const CreateParams& params);\n\n    // Destructor.\n    virtual ~Thread();\n\n    // Waits for all Threads to finish; should be called only from the root\n    // application thread. Once this function returns, we know that all other\n    // thread's references to Thread object have been released.\n    static  void OVR_CDECL FinishAllThreads();\n\n\n    // *** Overridable Run function for thread processing\n\n    // - returning from this method will end the execution of the thread\n    // - return value is usually 0 for success \n    virtual int   Run();\n    // Called after return/exit function\n    virtual void  OnExit();\n\n\n    // *** Thread management\n\n    // Starts the thread if its not already running\n    // - internally sets up the threading and calls Run()\n    // - initial state can either be Running or Suspended, NotRunning will just fail and do nothing\n    // - returns the exit code\n    virtual bool  Start(ThreadState initialState = Running);\n\n    // Quits with an exit code\n    virtual void  Exit(int exitCode=0);\n\n    // Suspend the thread until resumed\n    // Returns 1 for success, 0 for failure.\n    bool  Suspend();\n    // Resumes currently suspended thread\n    // Returns 1 for success, 0 for failure.\n    bool  Resume();\n\n    // Static function to return a pointer to the current thread\n    //static Thread* GetThread();\n\n\n    // *** Thread status query functions\n\n    bool          GetExitFlag() const;\n    void          SetExitFlag(bool exitFlag);\n\n    // Determines whether the thread was running and is now finished\n    bool          IsFinished() const;\n    // Determines if the thread is currently suspended\n    bool          IsSuspended() const;\n    // Returns current thread state\n    ThreadState   GetThreadState() const;\n\n    // Wait for thread to finish for a maxmimum number of milliseconds\n    // For maxWaitMs = 0 it simply polls and then returns if the thread is not finished\n    // For maxWaitMs < 0 it will wait forever\n    bool          Join(int maxWaitMs = -1) const;\n\n    // Returns the number of available CPUs on the system \n    static int    GetCPUCount();\n\n    // Returns the thread exit code. Exit code is initialized to 0,\n    // and set to the return value if Run function after the thread is finished.\n    inline int    GetExitCode() const { return ExitCode; }\n    // Returns an OS handle \n#if defined(OVR_OS_MS)\n    void*          GetOSHandle() const { return ThreadHandle; }\n#else\n    pthread_t      GetOSHandle() const { return ThreadHandle; }\n#endif\n\n#if defined(OVR_OS_MS)\n    ThreadId       GetThreadId() const { return IdValue; }\n#else\n    ThreadId       GetThreadId() const { return (ThreadId)GetOSHandle(); }\n#endif\n\n    // Returns the platform-specific equivalent const that corresponds to the given ThreadPriority. \n    static int            GetOSPriority(ThreadPriority);\n    static ThreadPriority GetOVRPriority(int osPriority); // May return a value outside the ThreadPriority enum range in unusual cases.\n\n    // Gets this instance's priority.\n    ThreadPriority GetPriority();\n\n    // Gets the current thread's priority.\n    static ThreadPriority GetCurrentPriority();\n\n    // Sets this instance's thread's priority.\n    // Some platforms (e.g. Unix) don't let you set thread priorities unless you have root privileges/\n    bool SetPriority(ThreadPriority);\n\n    // Sets the current thread's priority.\n    static bool SetCurrentPriority(ThreadPriority);\n\n    // *** Sleep\n\n    // Sleep secs seconds\n    static bool    Sleep(unsigned secs);\n    // Sleep msecs milliseconds\n    static bool    MSleep(unsigned msecs);\n\n\n    // *** Debugging functionality\n    virtual void    SetThreadName(const char* name);\n    static void     SetThreadName(const char* name, ThreadId threadId);\n    static void     SetCurrentThreadName(const char* name);\n\n    static void     GetThreadName(char* name, size_t nameCapacity, ThreadId threadId);\n    static void     GetCurrentThreadName(char* name, size_t nameCapacity);\n\nprivate:\n#if defined(OVR_OS_WIN32)\n    friend unsigned WINAPI Thread_Win32StartFn(void *phandle);\n#elif defined(OVR_OS_MS) // Any other Microsoft OS...\n    friend DWORD WINAPI Thread_Win32StartFn(void *phandle);\n#else\n    friend void *Thread_PthreadStartFn(void * phandle);\n\n    static int            InitAttr;\n    static pthread_attr_t Attr;\n#endif\n\nprotected:    \n    // Thread state flags\n    AtomicInt<uint32_t>   ThreadFlags;\n    AtomicInt<int32_t>   SuspendCount;\n    size_t              StackSize;\n\n    // Hardware processor which this thread is running on.\n    int            Processor;\n    ThreadPriority Priority;\n\n#if defined(OVR_OS_MS)\n    void*               ThreadHandle;\n    volatile ThreadId   IdValue;\n\n    // System-specific cleanup function called from destructor\n    void                CleanupSystemThread();\n\n#else\n    pthread_t           ThreadHandle;\n#endif\n\n    // Exit code of the thread, as returned by Run.\n    int                 ExitCode;\n\n    // Internal run function.\n    int                 PRun();    \n    // Finishes the thread and releases internal reference to it.\n    void                FinishAndRelease();\n\n    void                Init(const CreateParams& params);\n\n    // Protected copy constructor\n    Thread(const Thread &source) : RefCountBase<Thread>() { OVR_UNUSED(source); }\n\n};\n\n// Returns the unique Id of a thread it is called on, intended for\n// comparison purposes.\nThreadId GetCurrentThreadId();\n\n\n} // OVR\n\n#endif // OVR_ENABLE_THREADS\n#endif // OVR_Threads_h\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_ThreadsPthread.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_ThreadsPthread.cpp\nContent     :   \nCreated     :   \nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_Threads.h\"\n#include \"OVR_Hash.h\"\n\n#ifdef OVR_ENABLE_THREADS\n\n#include \"OVR_Timer.h\"\n#include \"OVR_Log.h\"\n\n#include <pthread.h>\n#include <sched.h>\n#include <time.h>\n#include <unistd.h>\n#include <sys/time.h>\n#include <errno.h>\n\n#if defined(OVR_OS_MAC) || defined(OVR_OS_BSD)\n    #include <sys/sysctl.h>\n    #include <sys/param.h>\n    #if !defined(OVR_OS_MAC)\n        #include <pthread_np.h>\n    #endif\n#endif\n    \n\n\nnamespace OVR {\n\n// ***** Mutex implementation\n\n\n// *** Internal Mutex implementation structure\n\nclass MutexImpl : public NewOverrideBase\n{\n    // System mutex or semaphore\n    pthread_mutex_t   SMutex;\n    bool          Recursive;\n    unsigned      LockCount;\n    pthread_t     LockedBy;\n\n    friend class WaitConditionImpl;\n\npublic:\n    // Constructor/destructor\n    MutexImpl(Mutex* pmutex, bool recursive = 1);\n    ~MutexImpl();\n\n    // Locking functions\n    void                DoLock();\n    bool                TryLock();\n    void                Unlock(Mutex* pmutex);\n    // Returns 1 if the mutes is currently locked\n    bool                IsLockedByAnotherThread(Mutex* pmutex);        \n    bool                IsSignaled() const;\n};\n\npthread_mutexattr_t Lock::RecursiveAttr;\nbool Lock::RecursiveAttrInit = 0;\n\n// *** Constructor/destructor\nMutexImpl::MutexImpl(Mutex* pmutex, bool recursive)\n{   \n    OVR_UNUSED(pmutex);\n    Recursive           = recursive;\n    LockCount           = 0;\n\n    if (Recursive)\n    {\n        if (!Lock::RecursiveAttrInit)\n        {\n            pthread_mutexattr_init(&Lock::RecursiveAttr);\n            pthread_mutexattr_settype(&Lock::RecursiveAttr, PTHREAD_MUTEX_RECURSIVE);\n            Lock::RecursiveAttrInit = 1;\n        }\n\n        pthread_mutex_init(&SMutex, &Lock::RecursiveAttr);\n    }\n    else\n        pthread_mutex_init(&SMutex, 0);\n}\n\nMutexImpl::~MutexImpl()\n{\n    pthread_mutex_destroy(&SMutex);\n}\n\n\n// Lock and try lock\nvoid MutexImpl::DoLock()\n{\n    while (pthread_mutex_lock(&SMutex))\n        ;\n    LockCount++;\n    LockedBy = pthread_self();\n}\n\nbool MutexImpl::TryLock()\n{\n    if (!pthread_mutex_trylock(&SMutex))\n    {\n        LockCount++;\n        LockedBy = pthread_self();\n        return 1;\n    }\n    \n    return 0;\n}\n\nvoid MutexImpl::Unlock(Mutex* pmutex)\n{\n    OVR_UNUSED(pmutex);\n    OVR_ASSERT(pthread_self() == LockedBy && LockCount > 0);\n\n    //unsigned lockCount;\n    LockCount--;\n    //lockCount = LockCount;\n\n    pthread_mutex_unlock(&SMutex);\n}\n\nbool    MutexImpl::IsLockedByAnotherThread(Mutex* pmutex)\n{\n    OVR_UNUSED(pmutex);\n    // There could be multiple interpretations of IsLocked with respect to current thread\n    if (LockCount == 0)\n        return 0;\n    if (pthread_self() != LockedBy)\n        return 1;\n    return 0;\n}\n\nbool    MutexImpl::IsSignaled() const\n{\n    // An mutex is signaled if it is not locked ANYWHERE\n    // Note that this is different from IsLockedByAnotherThread function,\n    // that takes current thread into account\n    return LockCount == 0;\n}\n\n\n// *** Actual Mutex class implementation\n\nMutex::Mutex(bool recursive)\n{\n    // NOTE: RefCount mode already thread-safe for all waitables.\n    pImpl = new MutexImpl(this, recursive);\n}\n\nMutex::~Mutex()\n{\n    delete pImpl;\n}\n\n// Lock and try lock\nvoid Mutex::DoLock()\n{\n    pImpl->DoLock();\n}\nbool Mutex::TryLock()\n{\n    return pImpl->TryLock();\n}\nvoid Mutex::Unlock()\n{\n    pImpl->Unlock(this);\n}\nbool    Mutex::IsLockedByAnotherThread()\n{\n    return pImpl->IsLockedByAnotherThread(this);\n}\n\n\n\n//-----------------------------------------------------------------------------------\n// ***** Event\n\nbool Event::Wait(unsigned delay)\n{\n    Mutex::Locker lock(&StateMutex);\n\n    // Do the correct amount of waiting\n    if (delay == OVR_WAIT_INFINITE)\n    {\n        while(!State)\n            StateWaitCondition.Wait(&StateMutex);\n    }\n    else if (delay)\n    {\n        if (!State)\n            StateWaitCondition.Wait(&StateMutex, delay);\n    }\n\n    bool state = State;\n    // Take care of temporary 'pulsing' of a state\n    if (Temporary)\n    {\n        Temporary   = false;\n        State       = false;\n    }\n    return state;\n}\n\nvoid Event::updateState(bool newState, bool newTemp, bool mustNotify)\n{\n    Mutex::Locker lock(&StateMutex);\n    State       = newState;\n    Temporary   = newTemp;\n    if (mustNotify)\n        StateWaitCondition.NotifyAll();    \n}\n\n\n\n// ***** Wait Condition Implementation\n\n// Internal implementation class\nclass WaitConditionImpl : public NewOverrideBase\n{\n    pthread_mutex_t     SMutex;\n    pthread_cond_t      Condv;\n\npublic:\n\n    // Constructor/destructor\n    WaitConditionImpl();\n    ~WaitConditionImpl();\n\n    // Release mutex and wait for condition. The mutex is re-aqured after the wait.\n    bool    Wait(Mutex *pmutex, unsigned delay = OVR_WAIT_INFINITE);\n\n    // Notify a condition, releasing at one object waiting\n    void    Notify();\n    // Notify a condition, releasing all objects waiting\n    void    NotifyAll();\n};\n\n\nWaitConditionImpl::WaitConditionImpl()\n{\n    pthread_mutex_init(&SMutex, 0);\n    pthread_cond_init(&Condv, 0);\n}\n\nWaitConditionImpl::~WaitConditionImpl()\n{\n    pthread_mutex_destroy(&SMutex);\n    pthread_cond_destroy(&Condv);\n}    \n\nbool    WaitConditionImpl::Wait(Mutex *pmutex, unsigned delay)\n{\n    bool            result = 1;\n    unsigned            lockCount = pmutex->pImpl->LockCount;\n\n    // Mutex must have been locked\n    if (lockCount == 0)\n        return 0;\n\n    pthread_mutex_lock(&SMutex);\n\n    // Finally, release a mutex or semaphore\n    if (pmutex->pImpl->Recursive)\n    {\n        // Release the recursive mutex N times\n        pmutex->pImpl->LockCount = 0;\n        for(unsigned i=0; i<lockCount; i++)\n            pthread_mutex_unlock(&pmutex->pImpl->SMutex);\n    }\n    else\n    {\n        pmutex->pImpl->LockCount = 0;\n        pthread_mutex_unlock(&pmutex->pImpl->SMutex);\n    }\n\n    // Note that there is a gap here between mutex.Unlock() and Wait().\n    // The other mutex protects this gap.\n\n    if (delay == OVR_WAIT_INFINITE)\n        pthread_cond_wait(&Condv,&SMutex);\n    else\n    {\n        timespec ts;\n\n        struct timeval tv;\n        gettimeofday(&tv, 0);\n\n        ts.tv_sec = tv.tv_sec + (delay / 1000);\n        ts.tv_nsec = (tv.tv_usec + (delay % 1000) * 1000) * 1000;\n\n        if (ts.tv_nsec > 999999999)\n        {\n            ts.tv_sec++;\n            ts.tv_nsec -= 1000000000;\n        }\n        int r = pthread_cond_timedwait(&Condv,&SMutex, &ts);\n        OVR_ASSERT(r == 0 || r == ETIMEDOUT);\n        if (r)\n            result = 0;\n    }\n\n    pthread_mutex_unlock(&SMutex);\n\n    // Re-aquire the mutex\n    for(unsigned i=0; i<lockCount; i++)\n        pmutex->DoLock(); \n\n    // Return the result\n    return result;\n}\n\n// Notify a condition, releasing the least object in a queue\nvoid    WaitConditionImpl::Notify()\n{\n    pthread_mutex_lock(&SMutex);\n    pthread_cond_signal(&Condv);\n    pthread_mutex_unlock(&SMutex);\n}\n\n// Notify a condition, releasing all objects waiting\nvoid    WaitConditionImpl::NotifyAll()\n{\n    pthread_mutex_lock(&SMutex);\n    pthread_cond_broadcast(&Condv);\n    pthread_mutex_unlock(&SMutex);\n}\n\n\n\n// *** Actual implementation of WaitCondition\n\nWaitCondition::WaitCondition()\n{\n    pImpl = new WaitConditionImpl;\n}\nWaitCondition::~WaitCondition()\n{\n    delete pImpl;\n}\n    \nbool    WaitCondition::Wait(Mutex *pmutex, unsigned delay)\n{\n    return pImpl->Wait(pmutex, delay);\n}\n// Notification\nvoid    WaitCondition::Notify()\n{\n    pImpl->Notify();\n}\nvoid    WaitCondition::NotifyAll()\n{\n    pImpl->NotifyAll();\n}\n\n\n// ***** Current thread\n\n// Per-thread variable\n/*\nstatic __thread Thread* pCurrentThread = 0;\n\n// Static function to return a pointer to the current thread\nvoid    Thread::InitCurrentThread(Thread *pthread)\n{\n    pCurrentThread = pthread;\n}\n\n// Static function to return a pointer to the current thread\nThread*    Thread::GetThread()\n{\n    return pCurrentThread;\n}\n*/\n\n\n// *** Thread constructors.\n\nThread::Thread(UPInt stackSize, int processor)\n{\n    // NOTE: RefCount mode already thread-safe for all Waitable objects.\n    CreateParams params;\n    params.stackSize = stackSize;\n    params.processor = processor;\n    Init(params);\n}\n\nThread::Thread(Thread::ThreadFn threadFunction, void*  userHandle, UPInt stackSize,\n                 int processor, Thread::ThreadState initialState)\n{\n    CreateParams params(threadFunction, userHandle, stackSize, processor, initialState);\n    Init(params);\n}\n\nThread::Thread(const CreateParams& params)\n{\n    Init(params);\n}\n\nvoid Thread::Init(const CreateParams& params)\n{\n    // Clear the variables    \n    ThreadFlags     = 0;\n    ThreadHandle    = 0;\n    ExitCode        = 0;\n    SuspendCount    = 0;\n    StackSize       = params.stackSize;\n    Processor       = params.processor;\n    Priority        = params.priority;\n\n    // Clear Function pointers\n    ThreadFunction  = params.threadFunction;\n    UserHandle      = params.userHandle;\n    if (params.initialState != NotRunning)\n        Start(params.initialState);\n}\n\nThread::~Thread()\n{\n    // Thread should not running while object is being destroyed,\n    // this would indicate ref-counting issue.\n    //OVR_ASSERT(IsRunning() == 0);\n\n    // Clean up thread.    \n    ThreadHandle = 0;\n}\n\n\n\n// *** Overridable User functions.\n\n// Default Run implementation\nint    Thread::Run()\n{\n    // Call pointer to function, if available.    \n    return (ThreadFunction) ? ThreadFunction(this, UserHandle) : 0;\n}\nvoid    Thread::OnExit()\n{   \n}\n\n\n// Finishes the thread and releases internal reference to it.\nvoid    Thread::FinishAndRelease()\n{\n    // Note: thread must be US.\n    ThreadFlags &= (UInt32)~(OVR_THREAD_STARTED);\n    ThreadFlags |= OVR_THREAD_FINISHED;\n\n    // Release our reference; this is equivalent to 'delete this'\n    // from the point of view of our thread.\n    Release();\n}\n\n\n\n// *** ThreadList - used to track all created threads\n\nclass ThreadList : public NewOverrideBase\n{\n    //------------------------------------------------------------------------\n    struct ThreadHashOp\n    {\n        size_t operator()(const Thread* ptr)\n        {\n            return (((size_t)ptr) >> 6) ^ (size_t)ptr;\n        }\n    };\n\n    HashSet<Thread*, ThreadHashOp>        ThreadSet;\n    Mutex                                 ThreadMutex;\n    WaitCondition                         ThreadsEmpty;\n    // Track the root thread that created us.\n    pthread_t                             RootThreadId;\n\n    static ThreadList* volatile pRunningThreads;\n\n    void addThread(Thread *pthread)\n    {\n        Mutex::Locker lock(&ThreadMutex);\n        ThreadSet.Add(pthread);\n    }\n\n    void removeThread(Thread *pthread)\n    {\n        Mutex::Locker lock(&ThreadMutex);\n        ThreadSet.Remove(pthread);\n        if (ThreadSet.GetSize() == 0)\n            ThreadsEmpty.Notify();\n    }\n\n    void finishAllThreads()\n    {\n        // Only original root thread can call this.\n        OVR_ASSERT(pthread_self() == RootThreadId);\n\n        Mutex::Locker lock(&ThreadMutex);\n        while (ThreadSet.GetSize() != 0)\n            ThreadsEmpty.Wait(&ThreadMutex);\n    }\n\npublic:\n\n    ThreadList()\n    {\n        RootThreadId = pthread_self();\n    }\n    ~ThreadList() { }\n\n\n    static void AddRunningThread(Thread *pthread)\n    {\n        // Non-atomic creation ok since only the root thread\n        if (!pRunningThreads)\n        {\n            pRunningThreads = new ThreadList;\n            OVR_ASSERT(pRunningThreads);\n        }\n        pRunningThreads->addThread(pthread);\n    }\n\n    // NOTE: 'pthread' might be a dead pointer when this is\n    // called so it should not be accessed; it is only used\n    // for removal.\n    static void RemoveRunningThread(Thread *pthread)\n    {\n        OVR_ASSERT(pRunningThreads);        \n        pRunningThreads->removeThread(pthread);\n    }\n\n    static void FinishAllThreads()\n    {\n        // This is ok because only root thread can wait for other thread finish.\n        if (pRunningThreads)\n        {           \n            pRunningThreads->finishAllThreads();\n            delete pRunningThreads;\n            pRunningThreads = 0;\n        }        \n    }\n};\n\n// By default, we have no thread list.\nThreadList* volatile ThreadList::pRunningThreads = 0;\n\n\n// FinishAllThreads - exposed publicly in Thread.\nvoid Thread::FinishAllThreads()\n{\n    ThreadList::FinishAllThreads();\n}\n\n// *** Run override\n\nint    Thread::PRun()\n{\n    // Suspend us on start, if requested\n    if (ThreadFlags & OVR_THREAD_START_SUSPENDED)\n    {\n        Suspend();\n        ThreadFlags &= (UInt32)~OVR_THREAD_START_SUSPENDED;\n    }\n\n    // Call the virtual run function\n    ExitCode = Run();    \n    return ExitCode;\n}\n\n\n\n\n// *** User overridables\n\nbool    Thread::GetExitFlag() const\n{\n    return (ThreadFlags & OVR_THREAD_EXIT) != 0;\n}       \n\nvoid    Thread::SetExitFlag(bool exitFlag)\n{\n    // The below is atomic since ThreadFlags is AtomicInt.\n    if (exitFlag)\n        ThreadFlags |= OVR_THREAD_EXIT;\n    else\n        ThreadFlags &= (UInt32) ~OVR_THREAD_EXIT;\n}\n\n\n// Determines whether the thread was running and is now finished\nbool    Thread::IsFinished() const\n{\n    return (ThreadFlags & OVR_THREAD_FINISHED) != 0;\n}\n// Determines whether the thread is suspended\nbool    Thread::IsSuspended() const\n{   \n    return SuspendCount > 0;\n}\n// Returns current thread state\nThread::ThreadState Thread::GetThreadState() const\n{\n    if (IsSuspended())\n        return Suspended;    \n    if (ThreadFlags & OVR_THREAD_STARTED)\n        return Running;    \n    return NotRunning;\n}\n\n// Join thread\nbool Thread::Join(int maxWaitMs) const\n{\n    // If polling,\n    if (maxWaitMs == 0)\n    {\n        // Just return if finished\n        return IsFinished();\n    }\n    // If waiting forever,\n    else if (maxWaitMs > 0)\n    {\n        UInt32 t0 = Timer::GetTicksMs();\n\n        while (!IsFinished())\n        {\n            UInt32 t1 = Timer::GetTicksMs();\n\n            // If the wait has expired,\n            int delta = (int)(t1 - t0);\n            if (delta >= maxWaitMs)\n            {\n                return false;\n            }\n\n            Thread::MSleep(10);\n        }\n\n        return true;\n    }\n    else\n    {\n        while (!IsFinished())\n        {\n            pthread_join(ThreadHandle, NULL);\n        }\n    }\n\n    return true;\n}\n\n/*\nstatic const char* mapsched_policy(int policy)\n{\n    switch(policy)\n    {\n    case SCHED_OTHER:\n        return \"SCHED_OTHER\";\n    case SCHED_RR:\n        return \"SCHED_RR\";\n    case SCHED_FIFO:\n        return \"SCHED_FIFO\";\n\n    }\n    return \"UNKNOWN\";\n}\n    int policy;\n    sched_param sparam;\n    pthread_getschedparam(pthread_self(), &policy, &sparam);\n    int max_prior = sched_get_priority_max(policy);\n    int min_prior = sched_get_priority_min(policy);\n    printf(\" !!!! policy: %s, priority: %d, max priority: %d, min priority: %d\\n\", mapsched_policy(policy), sparam.sched_priority, max_prior, min_prior);\n#include <stdio.h>\n*/\n// ***** Thread management\n\n// The actual first function called on thread start\nvoid* Thread_PthreadStartFn(void* phandle)\n{\n    Thread* pthread = (Thread*)phandle;\n    int     result = pthread->PRun();\n    // Signal the thread as done and release it atomically.\n    pthread->FinishAndRelease();\n    // At this point Thread object might be dead; however we can still pass\n    // it to RemoveRunningThread since it is only used as a key there.   \n    ThreadList::RemoveRunningThread(pthread);\n    return reinterpret_cast<void*>(result);\n}\n\nint Thread::InitAttr = 0;\npthread_attr_t Thread::Attr; \n\n/* static */\nint Thread::GetOSPriority(ThreadPriority p)\n{\n    OVR_UNUSED(p);\n    return -1;\n}\n\n/* static */\nThread::ThreadPriority Thread::GetOVRPriority(int osPriority)\n{\n    #if defined(OVR_OS_LINUX)\n        return (ThreadPriority)(Thread::NormalPriority - osPriority); // This works for both SCHED_OTHER, SCHED_RR, and SCHED_FIFO.\n    #else\n        // Apple priorities are such that the min is a value less than the max.\n        static int minPriority = sched_get_priority_min(SCHED_FIFO); // We don't have a means to pass a policy type to this function.\n        static int maxPriority = sched_get_priority_max(SCHED_FIFO);\n\n        return (ThreadPriority)(Thread::NormalPriority - (osPriority - ((minPriority + maxPriority) / 2)));\n    #endif\n}\n\n\nThread::ThreadPriority Thread::GetPriority()\n{\n    int         policy;\n    sched_param param;\n\n    int result = pthread_getschedparam(ThreadHandle, &policy, &param);\n\n    if(result == 0)\n    {\n        #if !defined(OVR_OS_LINUX)\n            if(policy == SCHED_OTHER)\n            {\n                return Thread::NormalPriority; //SCHED_OTHER allows only normal priority on BSD-style Unix and Mac OS X.\n            }\n        #endif\n\n        return GetOVRPriority(param.sched_priority);\n    }\n\n    return Thread::NormalPriority;\n}\n\n/* static */\nThread::ThreadPriority Thread::GetCurrentPriority()\n{\n    int         policy;\n    sched_param param;\n    pthread_t   currentThreadId = pthread_self();\n\n    int result = pthread_getschedparam(currentThreadId, &policy, &param);\n\n    if(result == 0)\n    {\n        #if !defined(OVR_OS_LINUX)\n            if(policy == SCHED_OTHER)\n            {\n                return Thread::NormalPriority; //SCHED_OTHER allows only normal priority on BSD-style Unix and Mac OS X.\n            }\n        #endif\n\n        return GetOVRPriority(param.sched_priority);\n    }\n\n    return Thread::NormalPriority;\n}\n\n\nbool Thread::SetPriority(ThreadPriority)\n{\n    // We currently fail. To do: add code to support this via pthread_getschedparam/pthread_attr_setschedparam\n    // This won't work unless using SCHED_FIFO or SCHED_RR anyway, which require root privileges.\n    return false;\n}\n\n/* static */\nbool Thread::SetCurrentPriority(ThreadPriority)\n{\n    // We currently fail. To do: add code to support this via pthread_getschedparam/pthread_attr_setschedparam\n    // This won't work unless using SCHED_FIFO or SCHED_RR anyway, which require root privileges.\n    return false;\n}\n\nbool    Thread::Start(ThreadState initialState)\n{\n    if (initialState == NotRunning)\n        return 0;\n    if (GetThreadState() != NotRunning)\n    {\n        OVR_DEBUG_LOG((\"Thread::Start failed - thread %p already running\", this));\n        return 0;\n    }\n\n    if (!InitAttr)\n    {\n        pthread_attr_init(&Attr);\n        pthread_attr_setdetachstate(&Attr, PTHREAD_CREATE_DETACHED);\n        pthread_attr_setstacksize(&Attr, 128 * 1024);\n        sched_param sparam;\n        sparam.sched_priority = Thread::GetOSPriority(NormalPriority);\n        pthread_attr_setschedparam(&Attr, &sparam);\n        InitAttr = 1;\n    }\n\n    ExitCode        = 0;\n    SuspendCount    = 0;\n    ThreadFlags     = (initialState == Running) ? 0 : OVR_THREAD_START_SUSPENDED;\n\n    // AddRef to us until the thread is finished\n    AddRef();\n    ThreadList::AddRunningThread(this);\n\n    int result;\n    if (StackSize != 128 * 1024 || Priority != NormalPriority)\n    {\n        pthread_attr_t attr;\n\n        pthread_attr_init(&attr);\n        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n        pthread_attr_setstacksize(&attr, StackSize);\n        sched_param sparam;\n        sparam.sched_priority = Thread::GetOSPriority(Priority);\n        pthread_attr_setschedparam(&attr, &sparam);\n        result = pthread_create(&ThreadHandle, &attr, Thread_PthreadStartFn, this);\n        pthread_attr_destroy(&attr);\n    }\n    else\n        result = pthread_create(&ThreadHandle, &Attr, Thread_PthreadStartFn, this);\n\n    if (result)\n    {\n        ThreadFlags = 0;\n        Release();\n        ThreadList::RemoveRunningThread(this);\n        return 0;\n    }\n    return 1;\n}\n\n\n// Suspend the thread until resumed\nbool    Thread::Suspend()\n{\n    OVR_DEBUG_LOG((\"Thread::Suspend - cannot suspend threads on this system\"));\n    return 0;\n}\n\n// Resumes currently suspended thread\nbool    Thread::Resume()\n{\n    return 0;\n}\n\n\n// Quits with an exit code  \nvoid    Thread::Exit(int exitCode)\n{\n    // Can only exist the current thread\n   // if (GetThread() != this)\n   //     return;\n\n    // Call the virtual OnExit function\n    OnExit();   \n\n    // Signal this thread object as done and release it's references.\n    FinishAndRelease();\n    ThreadList::RemoveRunningThread(this);\n\n    pthread_exit(reinterpret_cast<void*>(exitCode));\n}\n\nThreadId GetCurrentThreadId()\n{\n    return (void*)pthread_self();\n}\n\n// *** Sleep functions\n\n/* static */\nbool    Thread::Sleep(unsigned secs)\n{\n    sleep(secs);\n    return 1;\n}\n/* static */\nbool    Thread::MSleep(unsigned msecs)\n{\n    usleep(msecs*1000);\n    return 1;\n}\n\n/* static */\nint     Thread::GetCPUCount()\n{\n    #if defined(OVR_OS_MAC) || defined(OVR_OS_BSD)\n        // http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man3/sysctlbyname.3.html\n        int    cpuCount = 0;\n        size_t len = sizeof(cpuCount);\n\n        if(sysctlbyname(\"hw.logicalcpu\", &cpuCount, &len, NULL, 0) != 0) \n            cpuCount = 1;\n\n        return cpuCount;\n\n    #else // Linux, Android\n\n        // Alternative: read /proc/cpuinfo\n        #ifdef _SC_NPROCESSORS_ONLN\n            return (int)sysconf(_SC_NPROCESSORS_ONLN);\n        #else\n            return 1;\n        #endif\n    #endif\n}\n\n\nvoid Thread::SetThreadName( const char* name )\n{\n    #if defined (OVR_OS_APPLE)\n        if(ThreadHandle == pthread_self())\n            pthread_setname_np(name);\n        // Else there's nothing we can do.\n    #else\n        if(ThreadHandle != 0)\n            pthread_setname_np(ThreadHandle, name);\n        // Else we can possibly save this name and set it later when the thread starts.\n    #endif\n}\n\n\nvoid Thread::SetThreadName(const char* name, ThreadId threadId)\n{\n    #if defined (OVR_OS_APPLE)\n        if(pthread_equal((pthread_t)threadId, pthread_self()))\n            pthread_setname_np(name);\n        // Else there's no way to set the name of another thread.\n    #else\n        pthread_setname_np((pthread_t)threadId, name);\n    #endif\n}\n\n\nvoid Thread::SetCurrentThreadName(const char* name)\n{\n    #if defined (OVR_OS_APPLE)\n        pthread_setname_np(name);\n    #else\n        pthread_setname_np(pthread_self(), name);\n    #endif\n}\n\n\nvoid Thread::GetThreadName(char* name, size_t nameCapacity, ThreadId threadId)\n{\n    name[0] = 0;\n    pthread_getname_np((pthread_t)threadId, name, nameCapacity);\n}\n\n\nvoid Thread::GetCurrentThreadName(char* name, size_t nameCapacity)\n{\n    name[0] = 0;\n    pthread_getname_np(pthread_self(), name, nameCapacity);\n}\n\n\n} // namespace OVR\n\n#endif  // OVR_ENABLE_THREADS\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Timer.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Timer.cpp\nContent     :   Provides static functions for precise timing\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_Timer.h\"\n#include \"OVR_Log.h\"\n\n#if defined(OVR_OS_MS) && !defined(OVR_OS_MS_MOBILE)\n#define WIN32_LEAN_AND_MEAN\n#include <windows.h>\n#include <MMSystem.h>\n#elif defined(OVR_OS_ANDROID)\n#include <time.h>\n#include <android/log.h>\n#elif defined(OVR_OS_MAC)\n#include <mach/mach_time.h>\n#else\n#include <time.h>\n#include <sys/time.h>\n#include <errno.h>\n#endif\n\n\n#if defined(OVR_BUILD_DEBUG) && defined(OVR_OS_WIN32)\n    #ifndef NTSTATUS\n        #define NTSTATUS DWORD\n    #endif\n\n    typedef NTSTATUS (NTAPI* NtQueryTimerResolutionType)(PULONG MaximumTime, PULONG MinimumTime, PULONG CurrentTime);\n    NtQueryTimerResolutionType pNtQueryTimerResolution;\n#endif\n\n\n\n#if defined(OVR_OS_MS) && !defined(OVR_OS_WIN32) // Non-desktop Microsoft platforms...\n\n// Add this alias here because we're not going to include OVR_CAPI.cpp\nextern \"C\" {\n    double ovr_GetTimeInSeconds()\n    {\n        return Timer::GetSeconds();\n    }\n}\n\n#endif\n\n\n\n\nnamespace OVR {\n\n// For recorded data playback\nbool   Timer::useFakeSeconds = false;\ndouble Timer::FakeSeconds    = 0;\n\n\n\n\n//------------------------------------------------------------------------\n// *** Android Specific Timer\n\n#if defined(OVR_OS_ANDROID) // To consider: This implementation can also work on most Linux distributions\n\n//------------------------------------------------------------------------\n// *** Timer - Platform Independent functions\n\n// Returns global high-resolution application timer in seconds.\ndouble Timer::GetSeconds()\n{\n\tif(useFakeSeconds)\n\t\treturn FakeSeconds;\n\n    // Choreographer vsync timestamp is based on.\n    struct timespec tp;\n    const int       status = clock_gettime(CLOCK_MONOTONIC, &tp);\n\n#ifdef OVR_BUILD_DEBUG\n    if (status != 0)\n    {\n        OVR_DEBUG_LOG((\"clock_gettime status=%i\", status ));\n    }\n#else\n    OVR_UNUSED(status);\n#endif\n\n    return (double)tp.tv_sec;\n}\n\n\n\nuint64_t Timer::GetTicksNanos()\n{\n    if (useFakeSeconds)\n        return (uint64_t) (FakeSeconds * NanosPerSecond);\n\n    // Choreographer vsync timestamp is based on.\n    struct timespec tp;\n    const int       status = clock_gettime(CLOCK_MONOTONIC, &tp);\n\n#ifdef OVR_BUILD_DEBUG\n    if (status != 0)\n    {\n        OVR_DEBUG_LOG((\"clock_gettime status=%i\", status ));\n    }\n#else\n    OVR_UNUSED(status);\n#endif\n\n    const uint64_t result = (uint64_t)tp.tv_sec * (uint64_t)(1000 * 1000 * 1000) + uint64_t(tp.tv_nsec);\n    return result;\n}\n\n\nvoid Timer::initializeTimerSystem()\n{\n    // Empty for this platform.\n}\n\nvoid Timer::shutdownTimerSystem()\n{\n    // Empty for this platform.\n}\n\n\n\n\n\n//------------------------------------------------------------------------\n// *** Win32 Specific Timer\n\n#elif defined (OVR_OS_MS)\n\n\n// This helper class implements high-resolution wrapper that combines timeGetTime() output\n// with QueryPerformanceCounter.  timeGetTime() is lower precision but drives the high bits,\n// as it's tied to the system clock.\nstruct PerformanceTimer\n{\n    PerformanceTimer()\n        : UsingVistaOrLater(false),\n          TimeCS(),\n          OldMMTimeMs(0), \n          MMTimeWrapCounter(0), \n          PerfFrequency(0),\n          PerfFrequencyInverse(0),\n          PerfFrequencyInverseNanos(0),\n          PerfMinusTicksDeltaNanos(0),\n          LastResultNanos(0)\n    { }\n    \n    enum {\n        MMTimerResolutionNanos = 1000000\n    };\n   \n    void    Initialize();\n    void    Shutdown();\n\n    uint64_t  GetTimeSeconds();\n    double    GetTimeSecondsDouble();\n    uint64_t  GetTimeNanos();\n\n    UINT64 getFrequency()\n    {\n        if (PerfFrequency == 0)\n        {\n            LARGE_INTEGER freq;\n            QueryPerformanceFrequency(&freq);\n            PerfFrequency = freq.QuadPart;\n            PerfFrequencyInverse = 1.0 / (double)PerfFrequency;\n            PerfFrequencyInverseNanos = 1000000000.0 / (double)PerfFrequency;\n        }        \n        return PerfFrequency;\n    }\n    \n    double GetFrequencyInverse()\n    {\n        OVR_ASSERT(PerfFrequencyInverse != 0.0); // Assert that the frequency has been initialized.\n        return PerfFrequencyInverse;\n    }\n\n\tbool            UsingVistaOrLater;\n\n    CRITICAL_SECTION TimeCS;\n    // timeGetTime() support with wrap.\n    uint32_t        OldMMTimeMs;\n    uint32_t        MMTimeWrapCounter;\n    // Cached performance frequency result.\n    uint64_t        PerfFrequency;              // cycles per second, typically a large value like 3000000, but usually not the same as the CPU clock rate.\n    double          PerfFrequencyInverse;       // seconds per cycle (will be a small fractional value).\n    double          PerfFrequencyInverseNanos;  // nanoseconds per cycle.\n    \n    // Computed as (perfCounterNanos - ticksCounterNanos) initially,\n    // and used to adjust timing.\n    uint64_t        PerfMinusTicksDeltaNanos;\n    // Last returned value in nanoseconds, to ensure we don't back-step in time.\n    uint64_t        LastResultNanos;\n};\n\nstatic PerformanceTimer Win32_PerfTimer;\n\n\nvoid PerformanceTimer::Initialize()\n{\n    #if defined(OVR_OS_WIN32) // Desktop Windows only\n        // The following has the effect of setting the NT timer resolution (NtSetTimerResolution) to 1 millisecond.\n        MMRESULT mmr = timeBeginPeriod(1);\n        OVR_ASSERT(TIMERR_NOERROR == mmr);\n        OVR_UNUSED(mmr);\n    #endif\n\n    InitializeCriticalSection(&TimeCS);\n    MMTimeWrapCounter = 0;\n    getFrequency();\n\n    #if defined(OVR_OS_WIN32) // Desktop Windows only\n\t    // Set Vista flag.  On Vista, we can just use QPC() without all the extra work\n        OSVERSIONINFOEX ver;\n\t    ZeroMemory(&ver, sizeof(OSVERSIONINFOEX));\n\t    ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);\n\t    ver.dwMajorVersion = 6; // Vista+\n\n        DWORDLONG condMask = 0;\n        VER_SET_CONDITION(condMask, VER_MAJORVERSION, VER_GREATER_EQUAL);\n\n\t    // VerifyVersionInfo returns true if the OS meets the conditions set above\n\t    UsingVistaOrLater = VerifyVersionInfo(&ver, VER_MAJORVERSION, condMask) != 0;\n    #else\n        UsingVistaOrLater = true;\n    #endif\n\n\tOVR_DEBUG_LOG((\"PerformanceTimer UsingVistaOrLater = %d\", (int)UsingVistaOrLater));\n\n    #if defined(OVR_BUILD_DEBUG) && defined(OVR_OS_WIN32)\n        HMODULE hNtDll = LoadLibrary(L\"NtDll.dll\");\n        if (hNtDll)\n        {\n            pNtQueryTimerResolution = (NtQueryTimerResolutionType)GetProcAddress(hNtDll, \"NtQueryTimerResolution\");\n          //pNtSetTimerResolution = (NtSetTimerResolutionType)GetProcAddress(hNtDll, \"NtSetTimerResolution\");\n\n            if(pNtQueryTimerResolution)\n            {\n                ULONG MinimumResolution; // in 100-ns units\n                ULONG MaximumResolution;\n                ULONG ActualResolution;\n                pNtQueryTimerResolution(&MinimumResolution, &MaximumResolution, &ActualResolution);\n\t            OVR_DEBUG_LOG((\"NtQueryTimerResolution = Min %ld us, Max %ld us, Current %ld us\", MinimumResolution / 10, MaximumResolution / 10, ActualResolution / 10));\n            }\n\n            FreeLibrary(hNtDll);\n        }\n    #endif\n}\n\nvoid PerformanceTimer::Shutdown()\n{\n    DeleteCriticalSection(&TimeCS);\n\n    #if defined(OVR_OS_WIN32) // Desktop Windows only\n        MMRESULT mmr = timeEndPeriod(1);\n        OVR_ASSERT(TIMERR_NOERROR == mmr);\n        OVR_UNUSED(mmr);\n    #endif\n}\n\n\nuint64_t PerformanceTimer::GetTimeSeconds()\n{\n\tif (UsingVistaOrLater)\n\t{\n        LARGE_INTEGER li;\n\t\tQueryPerformanceCounter(&li);\n        OVR_ASSERT(PerfFrequencyInverse != 0); // Initialize should have been called earlier.\n        return (uint64_t)(li.QuadPart * PerfFrequencyInverse);\n    }\n\n    return (uint64_t)(GetTimeNanos() * .0000000001);\n}\n\n\ndouble PerformanceTimer::GetTimeSecondsDouble()\n{\n\tif (UsingVistaOrLater)\n\t{\n        LARGE_INTEGER li;\n\t\tQueryPerformanceCounter(&li);\n        OVR_ASSERT(PerfFrequencyInverse != 0);\n        return (li.QuadPart * PerfFrequencyInverse);\n    }\n\n    return (GetTimeNanos() * .0000000001);\n}\n\n\nuint64_t PerformanceTimer::GetTimeNanos()\n{\n    uint64_t      resultNanos;\n    LARGE_INTEGER li;\n\n    OVR_ASSERT(PerfFrequencyInverseNanos != 0); // Initialize should have been called earlier.\n\n    if (UsingVistaOrLater) // Includes non-desktop platforms\n\t{\n\t\t// Then we can use QPC() directly without all that extra work\n\t\tQueryPerformanceCounter(&li);\n        resultNanos = (uint64_t)(li.QuadPart * PerfFrequencyInverseNanos);\n\t}\n\telse\n\t{\n        // On Win32 QueryPerformanceFrequency is unreliable due to SMP and\n        // performance levels, so use this logic to detect wrapping and track\n        // high bits.\n        ::EnterCriticalSection(&TimeCS);\n\n        // Get raw value and perf counter \"At the same time\".\n        QueryPerformanceCounter(&li);\n\n        DWORD mmTimeMs = timeGetTime();\n        if (OldMMTimeMs > mmTimeMs)\n            MMTimeWrapCounter++;\n        OldMMTimeMs = mmTimeMs;\n\n        // Normalize to nanoseconds.\n        uint64_t  perfCounterNanos   = (uint64_t)(li.QuadPart * PerfFrequencyInverseNanos);\n        uint64_t  mmCounterNanos     = ((uint64_t(MMTimeWrapCounter) << 32) | mmTimeMs) * 1000000;\n        if (PerfMinusTicksDeltaNanos == 0)\n            PerfMinusTicksDeltaNanos = perfCounterNanos - mmCounterNanos;\n \n        // Compute result before snapping. \n        //\n        // On first call, this evaluates to:\n        //          resultNanos = mmCounterNanos.    \n        // Next call, assuming no wrap:\n        //          resultNanos = prev_mmCounterNanos + (perfCounterNanos - prev_perfCounterNanos).        \n        // After wrap, this would be:\n        //          resultNanos = snapped(prev_mmCounterNanos +/- 1ms) + (perfCounterNanos - prev_perfCounterNanos).\n        //\n        resultNanos = perfCounterNanos - PerfMinusTicksDeltaNanos;    \n\n        // Snap the range so that resultNanos never moves further apart then its target resolution.\n        // It's better to allow more slack on the high side as timeGetTime() may be updated at sporadically \n        // larger then 1 ms intervals even when 1 ms resolution is requested.\n        if (resultNanos > (mmCounterNanos + MMTimerResolutionNanos*2))\n        {\n            resultNanos = mmCounterNanos + MMTimerResolutionNanos*2;\n            if (resultNanos < LastResultNanos)\n                resultNanos = LastResultNanos;\n            PerfMinusTicksDeltaNanos = perfCounterNanos - resultNanos;\n        }\n        else if (resultNanos < (mmCounterNanos - MMTimerResolutionNanos))\n        {\n            resultNanos = mmCounterNanos - MMTimerResolutionNanos;\n            if (resultNanos < LastResultNanos)\n                resultNanos = LastResultNanos;\n            PerfMinusTicksDeltaNanos = perfCounterNanos - resultNanos;\n        }\n\n        LastResultNanos = resultNanos;\n        ::LeaveCriticalSection(&TimeCS);\n\t}\n\n\t//Tom's addition, to keep precision\n\t//static uint64_t    initial_time = 0;\n\t//if (!initial_time) initial_time = resultNanos;\n\t//resultNanos -= initial_time;\n\t// FIXME: This cannot be used for cross-process timestamps\n\n    return resultNanos;\n}\n\n\n//------------------------------------------------------------------------\n// *** Timer - Platform Independent functions\n\n// Returns global high-resolution application timer in seconds.\ndouble Timer::GetSeconds()\n{\n\tif(useFakeSeconds)\n\t\treturn FakeSeconds;\n\n    return Win32_PerfTimer.GetTimeSecondsDouble();\n}\n\n\n\n// Delegate to PerformanceTimer.\nuint64_t Timer::GetTicksNanos()\n{\n    if (useFakeSeconds)\n        return (uint64_t) (FakeSeconds * NanosPerSecond);\n\n    return Win32_PerfTimer.GetTimeNanos();\n}\nvoid Timer::initializeTimerSystem()\n{\n    Win32_PerfTimer.Initialize();\n}\nvoid Timer::shutdownTimerSystem()\n{\n    Win32_PerfTimer.Shutdown();\n}\n\n\n\n#elif defined(OVR_OS_MAC)\n\n\ndouble Timer::TimeConvertFactorNanos   = 0.0;\ndouble Timer::TimeConvertFactorSeconds = 0.0;\n\n\n//------------------------------------------------------------------------\n// *** Standard OS Timer     \n\n// Returns global high-resolution application timer in seconds.\ndouble Timer::GetSeconds()\n{\n\tif(useFakeSeconds)\n\t\treturn FakeSeconds;\n    \n    OVR_ASSERT(TimeConvertFactorNanos != 0.0);\n    return (double)mach_absolute_time() * TimeConvertFactorNanos;\n}\n\n\nuint64_t Timer::GetTicksNanos()\n{\n    if (useFakeSeconds)\n        return (uint64_t) (FakeSeconds * NanosPerSecond);\n    \n    OVR_ASSERT(TimeConvertFactorSeconds != 0.0);\n    return (uint64_t)(mach_absolute_time() * TimeConvertFactorSeconds);\n}\n\nvoid Timer::initializeTimerSystem()\n{\n    mach_timebase_info_data_t timeBase;\n    mach_timebase_info(&timeBase);\n    TimeConvertFactorSeconds = ((double)timeBase.numer / (double)timeBase.denom);\n    TimeConvertFactorNanos   = TimeConvertFactorSeconds / 1000000000.0;\n}\n\nvoid Timer::shutdownTimerSystem()\n{\n    // Empty for this platform.\n}\n\n\n#else // Posix platforms (e.g. Linux, BSD Unix)\n\n\nbool Timer::MonotonicClockAvailable = false;\n\n\n// Returns global high-resolution application timer in seconds.\ndouble Timer::GetSeconds()\n{\n\tif(useFakeSeconds)\n\t\treturn FakeSeconds;\n\n    // http://linux/die/netman3/clock_gettime\n    #if defined(CLOCK_MONOTONIC) // If we can use clock_gettime, which has nanosecond precision...\n        if(MonotonicClockAvailable)\n        {\n            timespec ts;\n            clock_gettime(CLOCK_MONOTONIC, &ts); // Better to use CLOCK_MONOTONIC than CLOCK_REALTIME.\n            return static_cast<double>(ts.tv_sec) + static_cast<double>(ts.tv_nsec) / 1E9;\n        }\n    #endif\n\n    // We cannot use rdtsc because its frequency changes at runtime.\n    struct timeval tv;\n    gettimeofday(&tv, 0);\n\n    return static_cast<double>(tv.tv_sec) + static_cast<double>(tv.tv_usec) / 1E6;\n}\n\n\nuint64_t Timer::GetTicksNanos()\n{\n    if (useFakeSeconds)\n        return (uint64_t) (FakeSeconds * NanosPerSecond);\n\n    #if defined(CLOCK_MONOTONIC) // If we can use clock_gettime, which has nanosecond precision...\n        if(MonotonicClockAvailable)\n        {\n            timespec ts;\n            clock_gettime(CLOCK_MONOTONIC, &ts);\n            return ((uint64_t)ts.tv_sec * 1000000000ULL) + (uint64_t)ts.tv_nsec;\n        }\n    #endif\n\n\n    // We cannot use rdtsc because its frequency changes at runtime.\n\tuint64_t result;\n\n    // Return microseconds.\n    struct timeval tv;\n\n    gettimeofday(&tv, 0);\n\n    result = (uint64_t)tv.tv_sec * 1000000;\n    result += tv.tv_usec;\n\n    return result * 1000;\n}\n\n\nvoid Timer::initializeTimerSystem()\n{\n    #if defined(CLOCK_MONOTONIC)\n        timespec ts; // We could also check for the availability of CLOCK_MONOTONIC with sysconf(_SC_MONOTONIC_CLOCK)\n        int result = clock_gettime(CLOCK_MONOTONIC, &ts);\n        MonotonicClockAvailable = (result == 0);\n    #endif\n}\n\nvoid Timer::shutdownTimerSystem()\n{\n    // Empty for this platform.\n}\n\n\n\n#endif  // OS-specific\n\n\n\n} // OVR\n\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Timer.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR\nFilename    :   OVR_Timer.h\nContent     :   Provides static functions for precise timing\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Timer_h\n#define OVR_Timer_h\n\n#include \"OVR_Types.h\"\n\nnamespace OVR {\n    \n//-----------------------------------------------------------------------------------\n// ***** Timer\n\n// Timer class defines a family of static functions used for application\n// timing and profiling.\n\nclass Timer\n{\npublic:\n    enum {\n        MsPerSecond     = 1000,                  // Milliseconds in one second.\n        MksPerSecond    = 1000 * 1000,           // Microseconds in one second.\n        NanosPerSecond  = 1000 * 1000 * 1000,    // Nanoseconds in one second.\n    };\n\n    // ***** Timing APIs for Application    \n\n    // These APIs should be used to guide animation and other program functions\n    // that require precision.\n\n    // Returns global high-resolution application timer in seconds.\n    static double  OVR_STDCALL GetSeconds();    \n\n    // Returns time in Nanoseconds, using highest possible system resolution.\n    static uint64_t  OVR_STDCALL GetTicksNanos();\n\n    // Kept for compatibility.\n    // Returns ticks in milliseconds, as a 32-bit number. May wrap around every 49.2 days.\n    // Use either time difference of two values of GetTicks to avoid wrap-around.\n    static uint32_t  OVR_STDCALL GetTicksMs()\n    { return  uint32_t(GetTicksNanos() / 1000000); }\n\n    // for recorded data playback\n    static void SetFakeSeconds(double fakeSeconds, bool enable = true) \n    { \n        FakeSeconds = fakeSeconds; \n        useFakeSeconds = enable; \n    }\n\nprivate:\n    friend class System;\n    // System called during program startup/shutdown.\n    static void initializeTimerSystem();\n    static void shutdownTimerSystem();\n\n    // for recorded data playback\n    static double FakeSeconds;\n    static bool   useFakeSeconds;\n    \n    #if defined(OVR_OS_ANDROID)\n        // Android-specific data\n    #elif defined (OVR_OS_MS)\n        // Microsoft-specific data\n    #elif defined(OVR_OS_MAC)\n        static double TimeConvertFactorNanos;     // Conversion factor for GetTicksNanos\n        static double TimeConvertFactorSeconds;   // Conversion factor for GetSeconds.\n    #else\n        static bool MonotonicClockAvailable;      // True if clock_gettime supports CLOCK_MONOTONIC\n    #endif\n};\n\n\n} // OVR::Timer\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_Types.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR_Kernel.h\nFilename    :   OVR_Types.h\nContent     :   Standard library defines and simple types\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Types_H\n#define OVR_Types_H\n\n#include \"OVR_Compiler.h\"\n\n\n// Unsupported compiler configurations\n#if _MSC_VER == 0x1600\n#  if _MSC_FULL_VER < 160040219\n#     error \"Oculus does not support VS2010 without SP1 installed: It will crash in Release mode\"\n#  endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ****** Operating system identification\n//\n// Try to use the most generic version of these defines as possible in order to achieve\n// the simplest portable code. For example, instead of using #if (defined(OVR_OS_IPHONE) || defined(OVR_OS_MAC)),\n// consider using #if defined(OVR_OS_APPLE).\n//\n// Type definitions exist for the following operating systems: (OVR_OS_x)\n//\n//    WIN32      - Win32 and Win64 (Windows XP and later) Does not include Microsoft phone and console platforms, despite that Microsoft's _WIN32 may be defined by the compiler for them.\n//    WIN64      - Win64 (Windows XP and later)\n//    MAC        - Mac OS X (may be defined in addition to BSD)\n//    LINUX      - Linux\n//    BSD        - BSD Unix\n//    ANDROID    - Android (may be defined in addition to LINUX)\n//    IPHONE     - iPhone\n//    MS_MOBILE  - Microsoft mobile OS.\n//\n//  Meta platforms\n//    MS        - Any OS by Microsoft (e.g. Win32, Win64, phone, console)\n//    APPLE     - Any OS by Apple (e.g. iOS, OS X)\n//    UNIX      - Linux, BSD, Mac OS X.\n//    MOBILE    - iOS, Android, Microsoft phone\n//    CONSOLE   - Console platforms\n//\n\n#if (defined(__APPLE__) && (defined(__GNUC__) ||\\\n     defined(__xlC__) || defined(__xlc__))) || defined(__MACOS__)\n#  if (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) || defined(__IPHONE_OS_VERSION_MIN_REQUIRED))\n#    define OVR_OS_IPHONE\n#  else\n#    define OVR_OS_DARWIN\n#    define OVR_OS_MAC\n#    define OVR_OS_BSD\n#  endif\n#elif (defined(WIN64) || defined(_WIN64) || defined(__WIN64__))\n#  define OVR_OS_WIN64\n#  define OVR_OS_WIN32   // Defined for compatibility and because the Win64 API supports the Win32 API.\n#elif (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__))\n#  define OVR_OS_WIN32\n#elif defined(ANDROID) || defined(__ANDROID__)\n#  define OVR_OS_ANDROID\n#  define OVR_OS_LINUX\n#elif defined(__linux__) || defined(__linux)\n#  define OVR_OS_LINUX\n#elif defined(_BSD_) || defined(__FreeBSD__)\n#  define OVR_OS_BSD\n#else\n#  define OVR_OS_OTHER\n#endif\n\n#if !defined(OVR_OS_MS_MOBILE)\n#   if (defined(_M_ARM) || defined(_M_IX86) || defined(_M_AMD64)) && !defined(OVR_OS_WIN32) && !defined(OVR_OS_CONSOLE)\n#       define OVR_OS_MS_MOBILE\n#   endif\n#endif\n\n#if !defined(OVR_OS_MS)\n#   if defined(OVR_OS_WIN32) || defined(OVR_OS_WIN64) || defined(OVR_OS_MS_MOBILE)\n#       define OVR_OS_MS\n#   endif\n#endif\n\n#if !defined(OVR_OS_APPLE)\n#   if defined(OVR_OS_MAC) || defined(OVR_OS_IPHONE)\n#       define OVR_OS_APPLE\n#   endif\n#endif\n\n#if !defined(OVR_OS_UNIX)\n#   if defined(OVR_OS_ANDROID) || defined(OVR_OS_BSD) || defined(OVR_OS_LINUX) || defined(OVR_OS_MAC)\n#       define OVR_OS_UNIX\n#   endif\n#endif\n\n#if !defined(OVR_OS_MOBILE)\n#   if defined(OVR_OS_ANDROID) || defined(OVR_OS_IPHONE) || defined(OVR_OS_MS_MOBILE)\n#       define OVR_OS_MOBILE\n#   endif\n#endif\n\n\n\n\n//-----------------------------------------------------------------------------------\n// ***** CPU Architecture\n//\n// The following CPUs are defined: (OVR_CPU_x)\n//\n//    X86        - x86 (IA-32)\n//    X86_64     - x86_64 (amd64)\n//    PPC        - PowerPC\n//    PPC64      - PowerPC64\n//    MIPS       - MIPS\n//    OTHER      - CPU for which no special support is present or needed\n\n\n#if defined(__x86_64__) || defined(WIN64) || defined(_WIN64) || defined(__WIN64__) || defined(_M_AMD64)\n#  define OVR_CPU_X86_64\n#  define OVR_64BIT_POINTERS\n#elif defined(__i386__) || defined(OVR_OS_WIN32)\n#  define OVR_CPU_X86\n#elif defined(__powerpc64__)\n#  define OVR_CPU_PPC64\n#elif defined(__ppc__)\n#  define OVR_CPU_PPC\n#elif defined(__mips__) || defined(__MIPSEL__)\n#  define OVR_CPU_MIPS\n#elif defined(__arm__)\n#  define OVR_CPU_ARM\n#else\n#  define OVR_CPU_OTHER\n#endif\n\n//-----------------------------------------------------------------------------------\n// ***** Co-Processor Architecture\n//\n// The following co-processors are defined: (OVR_CPU_x)\n//\n//    SSE        - Available on all modern x86 processors.\n//    Altivec    - Available on all modern ppc processors.\n//    Neon       - Available on some armv7+ processors.\n\n#if defined(__SSE__) || defined(_M_IX86) || defined(_M_AMD64) // _M_IX86 and _M_AMD64 are Microsoft identifiers for Intel-based platforms.\n#  define  OVR_CPU_SSE\n#endif // __SSE__\n\n#if defined( __ALTIVEC__ )\n#  define OVR_CPU_ALTIVEC\n#endif // __ALTIVEC__\n\n#if defined(__ARM_NEON__)\n#  define OVR_CPU_ARM_NEON\n#endif // __ARM_NEON__\n\n\n//-----------------------------------------------------------------------------------\n// ***** Compiler Warnings\n\n// Disable MSVC warnings\n#if defined(OVR_CC_MSVC)\n#  pragma warning(disable : 4127)    // Inconsistent dll linkage\n#  pragma warning(disable : 4530)    // Exception handling\n#  if (OVR_CC_MSVC<1300)\n#    pragma warning(disable : 4514)  // Unreferenced inline function has been removed\n#    pragma warning(disable : 4710)  // Function not inlined\n#    pragma warning(disable : 4714)  // _force_inline not inlined\n#    pragma warning(disable : 4786)  // Debug variable name longer than 255 chars\n#  endif // (OVR_CC_MSVC<1300)\n#endif // (OVR_CC_MSVC)\n\n\n\n// *** Linux Unicode - must come before Standard Includes\n\n#ifdef OVR_OS_LINUX\n// Use glibc unicode functions on linux.\n#  ifndef  _GNU_SOURCE\n#    define _GNU_SOURCE\n#  endif\n#endif\n\n//-----------------------------------------------------------------------------------\n// ***** Standard Includes\n//\n#include    <stddef.h>\n#include    <limits.h>\n#include    <float.h>\n\n\n// MSVC Based Memory Leak checking - for now\n#if defined(OVR_CC_MSVC) && defined(OVR_BUILD_DEBUG)\n#  define _CRTDBG_MAP_ALLOC\n#  include <stdlib.h>\n#  include <crtdbg.h>\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** int8_t, int16_t, etc.\n\n#if defined(OVR_CC_MSVC) && (OVR_CC_VER <= 1500) // VS2008 and earlier\n    typedef signed char        int8_t; \n    typedef unsigned char     uint8_t;\n    typedef signed short      int16_t;\n    typedef unsigned short   uint16_t;\n    typedef signed int        int32_t;\n    typedef unsigned int     uint32_t;\n    typedef signed __int64    int64_t;\n    typedef unsigned __int64 uint64_t;\n#else\n    #include <stdint.h>\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** Type definitions for Common Systems\n\nnamespace OVR {\n\ntypedef char            Char;\n\n// Pointer-sized integer\ntypedef size_t          UPInt;\ntypedef ptrdiff_t       SPInt;\n\n\n#if defined(OVR_OS_MS)\n\ntypedef char            SByte;  // 8 bit Integer (Byte)\ntypedef unsigned char   UByte;\ntypedef short           SInt16; // 16 bit Integer (Word)\ntypedef unsigned short  UInt16;\ntypedef long            SInt32; // 32 bit Integer\ntypedef unsigned long   UInt32;\ntypedef __int64         SInt64; // 64 bit Integer (QWord)\ntypedef unsigned __int64 UInt64;\n\n \n#elif defined(OVR_OS_MAC) || defined(OVR_OS_IPHONE) || defined(OVR_CC_GNU)\n\ntypedef int             SByte  __attribute__((__mode__ (__QI__)));\ntypedef unsigned int    UByte  __attribute__((__mode__ (__QI__)));\ntypedef int             SInt16 __attribute__((__mode__ (__HI__)));\ntypedef unsigned int    UInt16 __attribute__((__mode__ (__HI__)));\ntypedef int             SInt32 __attribute__((__mode__ (__SI__)));\ntypedef unsigned int    UInt32 __attribute__((__mode__ (__SI__)));\ntypedef int             SInt64 __attribute__((__mode__ (__DI__)));\ntypedef unsigned int    UInt64 __attribute__((__mode__ (__DI__)));\n\n#else\n\n#include <sys/types.h>\ntypedef int8_t          SByte;\ntypedef uint8_t         UByte;\ntypedef int16_t         SInt16;\ntypedef uint16_t        UInt16;\ntypedef int32_t         SInt32;\ntypedef uint32_t        UInt32;\ntypedef int64_t         SInt64;\ntypedef uint64_t        UInt64;\n\n#endif\n    \n    \n//osx PID is a signed int32 (already defined to pid_t in OSX framework)\n//linux PID is a signed int32 (already defined)\n//win32 PID is an unsigned int64\n#ifdef OVR_OS_WIN32\n//process ID representation\ntypedef unsigned long pid_t;\n#endif\n\nstruct OVR_GUID\n{\n\tuint32_t Data1;\n\tuint16_t Data2;\n\tuint16_t Data3;\n\tuint8_t  Data4[8];\n};\n\n\n\n} // OVR\n\n\n\n//-----------------------------------------------------------------------------------\n// ****** Standard C/C++ Library\n//\n// Identifies which standard library is currently being used. \n//\n//    LIBSTDCPP   - GNU libstdc++, used by GCC.\n//    LIBCPP      - LLVM libc++, typically used by clang and GCC.\n//    DINKUMWARE  - Used by Microsoft and various non-Microsoft compilers (e.g. Sony clang).\n\n#if !defined(OVR_STDLIB_LIBSTDCPP)\n    #if defined(__GLIBCXX__)\n        #define OVR_STDLIB_LIBSTDCPP 1\n    #endif\n#endif\n\n#if !defined(OVR_STDLIB_LIBCPP)\n    #if defined(__clang__)\n        #if defined(__cplusplus) && __has_include(<__config>)\n            #define OVR_STDLIB_LIBCPP 1\n        #endif\n    #endif \n#endif\n\n#if !defined(OVR_STDLIB_DINKUMWARE)\n    #if defined(_YVALS) // Dinkumware globally #defines _YVALS from the #includes above.\n        #define OVR_STDLIB_DINKUMWARE 1\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** Macro Definitions\n//\n// We define the following:\n//\n//  OVR_BYTE_ORDER      - Defined to either OVR_LITTLE_ENDIAN or OVR_BIG_ENDIAN\n//  OVR_FORCE_INLINE    - Forces inline expansion of function\n//  OVR_ASM             - Assembly language prefix\n//  OVR_STR             - Prefixes string with L\"\" if building unicode\n// \n//  OVR_STDCALL         - Use stdcall calling convention (Pascal arg order)\n//  OVR_CDECL           - Use cdecl calling convention (C argument order)\n//  OVR_FASTCALL        - Use fastcall calling convention (registers)\n//\n\n// Byte order constants, OVR_BYTE_ORDER is defined to be one of these.\n#define OVR_LITTLE_ENDIAN       1\n#define OVR_BIG_ENDIAN          2\n\n\n#if defined(OVR_OS_MS)\n    \n    // ***** Windows and non-desktop platforms\n\n    // Byte order\n    #define OVR_BYTE_ORDER    OVR_LITTLE_ENDIAN\n\n    // Calling convention - goes after function return type but before function name\n    #ifdef __cplusplus_cli\n    #  define OVR_FASTCALL      __stdcall\n    #else\n    #  define OVR_FASTCALL      __fastcall\n    #endif\n\n    #define OVR_STDCALL         __stdcall\n    #define OVR_CDECL           __cdecl\n\n\n    // Assembly macros\n    #if defined(OVR_CC_MSVC)\n    #  define OVR_ASM           _asm\n    #else\n    #  define OVR_ASM           asm\n    #endif // (OVR_CC_MSVC)\n\n    #ifdef UNICODE\n    #  define OVR_STR(str)      L##str\n    #else\n    #  define OVR_STR(str)      str\n    #endif // UNICODE\n\n#else\n\n    // **** Standard systems\n\n    #if (defined(BYTE_ORDER) && (BYTE_ORDER == BIG_ENDIAN))|| \\\n        (defined(_BYTE_ORDER) && (_BYTE_ORDER == _BIG_ENDIAN))\n    #  define OVR_BYTE_ORDER    OVR_BIG_ENDIAN\n    #elif (defined(__ARMEB__) || defined(OVR_CPU_PPC) || defined(OVR_CPU_PPC64))\n    #  define OVR_BYTE_ORDER    OVR_BIG_ENDIAN\n    #else\n    #  define OVR_BYTE_ORDER    OVR_LITTLE_ENDIAN\n    #endif\n    \n    // Assembly macros\n    #define OVR_ASM                  __asm__\n    #define OVR_ASM_PROC(procname)   OVR_ASM\n    #define OVR_ASM_END              OVR_ASM\n    \n    // Calling convention - goes after function return type but before function name\n    #define OVR_FASTCALL\n    #define OVR_STDCALL\n    #define OVR_CDECL\n\n#endif // defined(OVR_OS_WIN32)\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_PTR_SIZE\n// \n// Specifies the byte size of pointers (same as sizeof void*).\n\n#if !defined(OVR_PTR_SIZE)\n    #if defined(__WORDSIZE)\n        #define OVR_PTR_SIZE ((__WORDSIZE) / 8)\n    #elif defined(_WIN64) || defined(__LP64__) || defined(_LP64) || defined(_M_IA64) || defined(__ia64__) || defined(__arch64__) || defined(__64BIT__) || defined(__Ptr_Is_64)\n        #define OVR_PTR_SIZE 8\n    #elif defined(__CC_ARM) && (__sizeof_ptr == 8)\n        #define OVR_PTR_SIZE 8\n    #else\n        #define OVR_PTR_SIZE 4\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_WORD_SIZE\n// \n// Specifies the byte size of a machine word/register. Not necessarily the same as\n// the size of pointers, but usually >= the size of pointers.\n\n#if !defined(OVR_WORD_SIZE)\n   #define OVR_WORD_SIZE OVR_PTR_SIZE // For our currently supported platforms these are equal.\n#endif\n\n\n// ------------------------------------------------------------------------\n// ***** OVR_FORCE_INLINE\n//\n// Force inline substitute - goes before function declaration\n// Example usage:\n//     OVR_FORCE_INLINE void Test();\n\n#if !defined(OVR_FORCE_INLINE)\n    #if defined(OVR_CC_MSVC)\n        #define OVR_FORCE_INLINE  __forceinline\n    #elif defined(OVR_CC_GNU)\n        #define OVR_FORCE_INLINE  __attribute__((always_inline)) inline\n    #else\n        #define OVR_FORCE_INLINE  inline\n    #endif  // OVR_CC_MSVC\n#endif\n\n\n// ------------------------------------------------------------------------\n// ***** OVR_NO_INLINE\n//\n// Cannot be used with inline or OVR_FORCE_INLINE.\n// Example usage:\n//     OVR_NO_INLINE void Test();\n\n#if !defined(OVR_NO_INLINE)\n    #if defined(OVR_CC_MSVC) && (_MSC_VER >= 1500) // VS2008+\n        #define OVR_NO_INLINE __declspec(noinline)\n    #elif !defined(OVR_CC_MSVC)\n        #define OVR_NO_INLINE __attribute__((noinline))\n    #endif\n#endif\n\n\n// -----------------------------------------------------------------------------------\n// ***** OVR_STRINGIZE\n//\n// Converts a preprocessor symbol to a string.\n//\n// Example usage:\n//     printf(\"Line: %s\", OVR_STRINGIZE(__LINE__));\n//\n#if !defined(OVR_STRINGIFY)\n    #define OVR_STRINGIZEIMPL(x) #x\n    #define OVR_STRINGIZE(x)     OVR_STRINGIZEIMPL(x)\n#endif\n\n\n// -----------------------------------------------------------------------------------\n// ***** OVR_JOIN\n//\n// Joins two preprocessing symbols together. Supports the case when either or the\n// the symbols are macros themselves.\n//\n// Example usage:\n//    char OVR_JOIN(unique_, __LINE__);  // Results in (e.g.) char unique_123;\n//\n#if !defined(OVR_JOIN)\n    #define OVR_JOIN(a, b)  OVR_JOIN1(a, b)\n    #define OVR_JOIN1(a, b) OVR_JOIN2(a, b)\n    #define OVR_JOIN2(a, b) a##b\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_OFFSETOF\n// \n// Portable implementation of offsetof for structs and classes. offsetof and GCC's \n// __builtin_offsetof work only with POD types (standard-layout types under C++11), \n// despite that it can safely work with a number of types that aren't POD. This \n// version works with more types without generating compiler warnings or errors.\n// Returns the offset as a size_t, as per offsetof.\n//\n// Example usage:\n//     struct Test{ int i; float f; };\n//     size_t fPos = OVR_OFFSETOF(Test, f);\n\n#if defined(OVR_CC_GNU)\n    #define OVR_OFFSETOF(class_, member_) ((size_t)(((uintptr_t)&reinterpret_cast<const volatile char&>((((class_*)65536)->member_))) - 65536))\n#else\n    #define OVR_OFFSETOF(class_, member_) offsetof(class_, member_)\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_SIZEOF_MEMBER\n//\n// Implements a portable way to determine the size of struct or class data member. \n// C++11 allows this directly via sizeof (see OVR_CPP_NO_EXTENDED_SIZEOF), and this \n// macro exists to handle pre-C++11 compilers.\n// Returns the offset as a size_t, as per sizeof.\n//\n// Example usage:\n//     struct Test{ int i; float f; };\n//     size_t fSize = OVR_SIZEOF_MEMBER(Test, f);\n//\n#if defined(OVR_CPP_NO_EXTENDED_SIZEOF)\n    #define OVR_SIZEOF_MEMBER(class_, member_) (sizeof(((class_*)0)->member_))\n#else\n    #define OVR_SIZEOF_MEMBER(class_, member_) (sizeof(class_::member_))\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_DEBUG_BREAK, OVR_DEBUG_CODE, \n//       OVR_ASSERT, OVR_ASSERT_M, OVR_ASSERT_AND_UNUSED\n//\n// Macros have effect only in debug builds.\n//\n// Example OVR_DEBUG_BREAK usage (note the lack of parentheses):\n//     #define MY_ASSERT(expression) do { if (!(expression)) { OVR_DEBUG_BREAK; } } while(0)\n//\n// Example OVR_DEBUG_CODE usage:\n//     OVR_DEBUG_CODE(printf(\"debug test\\n\");)\n//       or\n//     OVR_DEBUG_CODE(printf(\"debug test\\n\"));\n//\n// Example OVR_ASSERT usage:\n//     OVR_ASSERT(count < 100);\n//     OVR_ASSERT_M(count < 100, \"count is too high\");\n//\n#if defined(OVR_BUILD_DEBUG)\n\t// Causes a debugger breakpoint in debug builds. Has no effect in release builds.\n\t// Microsoft Win32 specific debugging support\n\t#if defined(OVR_CC_MSVC)\n\t\t#define OVR_DEBUG_BREAK __debugbreak()\n\t#elif defined(OVR_CC_GNU) || defined(OVR_CC_CLANG)\n\t\t#if defined(OVR_CPU_X86) || defined(OVR_CPU_X86_64)\n\t\t\t#define OVR_DEBUG_BREAK do { OVR_ASM(\"int $3\\n\\t\"); } while(0)\n\t\t#else\n\t\t\t#define OVR_DEBUG_BREAK __builtin_trap()\n\t\t#endif\n\t#else\n\t\t#define OVR_DEBUG_BREAK do { *((int *) 0) = 1; } while(0)\n\t#endif\n\n\t// The expresssion is defined only in debug builds. It is defined away in release builds.\n\t#define OVR_DEBUG_CODE(c) c\n\n\t// In debug builds this tests the given expression; if false then executes OVR_DEBUG_BREAK,\n\t// if true then no action. Has no effect in release builds.\n\t#if defined(__clang_analyzer__) // During static analysis, make it so the analyzer thinks that failed asserts result in program exit. Reduced false positives.\n\t\t#include <stdlib.h>\n\t\t#define OVR_ASSERT_M(p, message) do { if (!(p))  { OVR_DEBUG_BREAK; exit(0); } } while(0)\n\t\t#define OVR_ASSERT(p)            do { if (!(p))  { OVR_DEBUG_BREAK; exit(0); } } while(0)\n\t#else\n\t\t// void OVR_ASSERT_M(bool expression, const char message);\n\t\t// Note: The expresion below is expanded into all usage of this assertion macro. \n\t\t// We should try to minimize the size of the expanded code to the extent possible.\n\t\t#define OVR_ASSERT_M(p, message) do                                                               \\\n\t\t{                                                                                                 \\\n\t\t\tif (!(p))                                                                                     \\\n\t\t\t{                                                                                             \\\n\t\t\t\tintptr_t ovrAssertUserParam;                                                              \\\n\t\t\t\tOVRAssertionHandler ovrAssertUserHandler = OVR::GetAssertionHandler(&ovrAssertUserParam); \\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t              \\\n\t\t\t\tif(ovrAssertUserHandler && !OVRIsDebuggerPresent())                                       \\\n\t\t\t\t{                                                                                         \\\n\t\t\t\t\tovrAssertUserHandler(ovrAssertUserParam, \"Assertion failure\", message);               \\\n\t\t\t\t}                                                                                         \\\n\t\t\t\telse                                                                                      \\\n\t\t\t\t{                                                                                         \\\n\t\t\t\t\tOVR_DEBUG_BREAK;                                                                      \\\n\t\t\t\t}                                                                                         \\\n\t\t\t}                                                                                             \\\n\t\t} while(0)\n\n\t\t// void OVR_ASSERT(bool expression);\n\t\t#define OVR_ASSERT(p) OVR_ASSERT_M((p), (#p))\n\t#endif\n\n\t// Acts the same as OVR_ASSERT in debug builds. Acts the same as OVR_UNUSED in release builds.\n\t// Example usage: OVR_ASSERT_AND_UNUSED(x < 30, x);\n\t#define OVR_ASSERT_AND_UNUSED(expression, value) OVR_ASSERT(expression); OVR_UNUSED(value)\n\n#else \n\n\t// The expresssion is defined only in debug builds. It is defined away in release builds.\n\t#define OVR_DEBUG_CODE(c)\n\n\t// Causes a debugger breakpoint in debug builds. Has no effect in release builds.\n\t#define OVR_DEBUG_BREAK  ((void)0)\n\n\t// In debug builds this tests the given expression; if false then executes OVR_DEBUG_BREAK,\n\t// if true then no action. Has no effect in release builds.\n\t#define OVR_ASSERT(p)      ((void)0)\n\t#define OVR_ASSERT_M(p, m) ((void)0)\n\n\t// Acts the same as OVR_ASSERT in debug builds. Acts the same as OVR_UNUSED in release builds.\n\t// Example usage: OVR_ASSERT_AND_UNUSED(x < 30, x);\n\t#define OVR_ASSERT_AND_UNUSED(expression, value) OVR_UNUSED(value)\n\n#endif // OVR_BUILD_DEBUG\n\n\n\n// Assert handler\n// The user of this library can override the default assertion handler and provide their own.\nnamespace OVR\n{\n    // The return value meaning is reserved for future definition and currently has no effect.\n    typedef intptr_t (*OVRAssertionHandler)(intptr_t userParameter, const char* title, const char* message);\n\n    // Returns the current assertion handler.\n    OVRAssertionHandler GetAssertionHandler(intptr_t* userParameter = NULL);\n\n    // Sets the current assertion handler.\n    // The default assertion handler if none is set simply issues a debug break.\n    // Example usage:\n    //     intptr_t CustomAssertionHandler(intptr_t /*userParameter*/, const char* title, const char* message)) { \n    //         MessageBox(title, message);\n    //         OVR_DEBUG_BREAK;\n    //     }\n    void SetAssertionHandler(OVRAssertionHandler assertionHandler, intptr_t userParameter = 0);\n\n    // Implements the default assertion handler.\n    intptr_t DefaultAssertionHandler(intptr_t userParameter, const char* title, const char* message);\n\n    // Currently defined in OVR_DebugHelp.cpp\n    bool OVRIsDebuggerPresent();\n}\n\n\n// ------------------------------------------------------------------------\n// ***** static_assert\n//\n// Portable support for C++11 static_assert.\n// Acts as if the following were declared:\n//     void static_assert(bool const_expression, const char* msg);\n//\n// Example usage:\n//     static_assert(sizeof(int32_t) == 4, \"int32_t expected to be 4 bytes.\");\n\n#if defined(OVR_CPP_NO_STATIC_ASSERT) // If the compiler doesn't provide it intrinsically...\n    #if !defined(OVR_SA_UNUSED)\n        #if defined(OVR_CC_GNU) || defined(OVR_CC_CLANG)\n            #define OVR_SA_UNUSED __attribute__((unused))\n        #else\n            #define OVR_SA_UNUSED\n        #endif\n        #define OVR_SA_PASTE(a,b) a##b\n        #define OVR_SA_HELP(a,b)  OVR_SA_PASTE(a,b)\n    #endif\n\n    #if defined(__COUNTER__)\n        #define static_assert(expression, msg) typedef char OVR_SA_HELP(compileTimeAssert, __COUNTER__) [((expression) != 0) ? 1 : -1] OVR_SA_UNUSED\n    #else\n        #define static_assert(expression, msg) typedef char OVR_SA_HELP(compileTimeAssert, __LINE__) [((expression) != 0) ? 1 : -1] OVR_SA_UNUSED\n    #endif\n#endif\n\n\n// ------------------------------------------------------------------------\n// ***** OVR_COMPILER_ASSERT\n//\n// Compile-time assert; produces compiler error if condition is false.\n// The expression must be a compile-time constant expression.\n// This macro is deprecated in favor of static_assert, which provides better\n// compiler output and works in a broader range of contexts.\n// \n// Example usage:\n//     OVR_COMPILER_ASSERT(sizeof(int32_t == 4));\n\n#if !defined(OVR_COMPILER_ASSERT)\n    #define OVR_COMPILER_ASSERT(expression)        static_assert(expression, #expression)\n    #define OVR_COMPILER_ASSERT_M(expression, msg) static_assert(expression, msg)\n#endif\n\n\n// ***** OVR_PROCESSOR_PAUSE\n//\n// Yields the processor for other hyperthreads, usually for the purpose of implementing spins and spin locks. \n//\n// Example usage:\n//     while(!finished())\n//         OVR_PROCESSOR_PAUSE();\n\n#if defined(OVR_CPU_X86) || defined(OVR_CPU_X86_64)\n    #if defined(OVR_CC_GNU) || defined(OVR_CC_CLANG)\n        #define OVR_PROCESSOR_PAUSE() asm volatile(\"pause\" ::: \"memory\") // Consumes 38-40 clocks on current Intel x86 and x64 hardware.\n    #elif defined(OVR_CC_MSVC)\n        #include <emmintrin.h>\n        #pragma intrinsic(_mm_pause) // Maps to asm pause.\n        #define OVR_PROCESSOR_PAUSE _mm_pause\n    #else\n        #define OVR_PROCESSOR_PAUSE()\n    #endif\n#else\n    #define OVR_PROCESSOR_PAUSE()\n#endif\n\n\n// ------------------------------------------------------------------------\n// ***** OVR_ARRAY_COUNT\n//\n// Returns the element count of a C array. \n//\n// Example usage:\n//     float itemArray[16];\n//     for(size_t i = 0; i < OVR_ARRAY_COUNT(itemArray); i++) { ... }\n\n#if defined(OVR_CPP_NO_CONSTEXPR)\n    #ifndef OVR_ARRAY_COUNT\n        #define OVR_ARRAY_COUNT(x) (sizeof(x) / sizeof(x[0]))\n    #endif\n#else\n    // Smarter C++11 version which knows the difference between arrays and pointers. \n    template <typename T, size_t N>\n    char (&OVRArrayCountHelper(T (&x)[N]))[N];\n    #define OVR_ARRAY_COUNT(x) (sizeof(OVRArrayCountHelper(x)))\n#endif\n\n\n// ------------------------------------------------------------------------\n// ***** OVR_CURRENT_FUNCTION\n//\n// Portable wrapper for __PRETTY_FUNCTION__, C99 __func__, __FUNCTION__.\n// This represents the most expressive version available.\n// Acts as if the following were declared:\n//     static const char OVR_CURRENT_FUNCTION[] = \"function-name\";\n//\n// Example usage:\n//     void Test() { printf(\"%s\", OVR_CURRENT_FUNCTION); }\n\n#if defined(OVR_CC_GNU) || defined(OVR_CC_CLANG) || (defined(__ICC) && (__ICC >= 600)) // GCC, clang, Intel\n    #define OVR_CURRENT_FUNCTION __PRETTY_FUNCTION__\n#elif defined(__FUNCSIG__) // VC++\n    #define OVR_CURRENT_FUNCTION __FUNCSIG__\n#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901) // C99 compilers\n    #define OVR_CURRENT_FUNCTION __func__\n#else\n    #define OVR_CURRENT_FUNCTION __FUNCTION__\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_DEPRECATED / OVR_DEPRECATED_MSG\n// \n// Portably annotates a function or struct as deprecated.\n// Note that clang supports __deprecated_enum_msg, which may be useful to support.\n//\n// Example usage:\n//    OVR_DEPRECATED void Test();       // Use on the function declaration, as opposed to definition.\n//\n//    struct OVR_DEPRECATED Test{ ... };\n//\n//    OVR_DEPRECATED_MSG(\"Test is deprecated\")\n//    void Test();\n\n#if !defined(OVR_DEPRECATED)\n    #if defined(OVR_CC_MSVC) && (OVR_CC_VERSION > 1400) // VS2005+\n        #define OVR_DEPRECATED          __declspec(deprecated)\n        #define OVR_DEPRECATED_MSG(msg) __declspec(deprecated(msg))\n    #elif defined(OVR_CC_CLANG) && OVR_CC_HAS_FEATURE(attribute_deprecated_with_message)\n        #define OVR_DEPRECATED          __declspec(deprecated)\n        #define OVR_DEPRECATED_MSG(msg) __attribute__((deprecated(msg)))\n    #elif defined(OVR_CC_GNU) && (OVR_CC_VERSION >= 405)\n        #define OVR_DEPRECATED          __declspec(deprecated)\n        #define OVR_DEPRECATED_MSG(msg) __attribute__((deprecated(msg)))\n    #elif !defined(OVR_CC_MSVC)\n        #define OVR_DEPRECATED          __attribute__((deprecated))\n        #define OVR_DEPRECATED_MSG(msg) __attribute__((deprecated))\n    #else\n        #define OVR_DEPRECATED\n        #define OVR_DEPRECATED_MSG(msg)\n    #endif\n#endif\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_UNUSED - Unused Argument handling\n// Macro to quiet compiler warnings about unused parameters/variables.\n//\n// Example usage:\n//     void Test() {\n//         int x = SomeFunction();\n//         OVR_UNUSED(x);\n//     }\n//\n\n#if defined(OVR_CC_GNU)\n#  define   OVR_UNUSED(a)   do {__typeof__ (&a) __attribute__ ((unused)) __tmp = &a; } while(0)\n#else\n#  define   OVR_UNUSED(a)   (a)\n#endif\n\n#define     OVR_UNUSED1(a1) OVR_UNUSED(a1)\n#define     OVR_UNUSED2(a1,a2) OVR_UNUSED(a1); OVR_UNUSED(a2)\n#define     OVR_UNUSED3(a1,a2,a3) OVR_UNUSED2(a1,a2); OVR_UNUSED(a3)\n#define     OVR_UNUSED4(a1,a2,a3,a4) OVR_UNUSED3(a1,a2,a3); OVR_UNUSED(a4)\n#define     OVR_UNUSED5(a1,a2,a3,a4,a5) OVR_UNUSED4(a1,a2,a3,a4); OVR_UNUSED(a5)\n#define     OVR_UNUSED6(a1,a2,a3,a4,a5,a6) OVR_UNUSED4(a1,a2,a3,a4); OVR_UNUSED2(a5,a6)\n#define     OVR_UNUSED7(a1,a2,a3,a4,a5,a6,a7) OVR_UNUSED4(a1,a2,a3,a4); OVR_UNUSED3(a5,a6,a7)\n#define     OVR_UNUSED8(a1,a2,a3,a4,a5,a6,a7,a8) OVR_UNUSED4(a1,a2,a3,a4); OVR_UNUSED4(a5,a6,a7,a8)\n#define     OVR_UNUSED9(a1,a2,a3,a4,a5,a6,a7,a8,a9) OVR_UNUSED4(a1,a2,a3,a4); OVR_UNUSED5(a5,a6,a7,a8,a9)\n\n\n//-----------------------------------------------------------------------------------\n// ***** Configuration Macros\n//\n// Expands to the current build type as a const char string literal.\n// Acts as the following declaration: const char OVR_BUILD_STRING[];\n\n#ifdef OVR_BUILD_DEBUG\n#  define OVR_BUILD_STRING  \"Debug\"\n#else\n#  define OVR_BUILD_STRING  \"Release\"\n#endif\n\n\n//// Enables SF Debugging information\n//# define OVR_BUILD_DEBUG\n\n// OVR_DEBUG_STATEMENT injects a statement only in debug builds.\n// OVR_DEBUG_SELECT injects first argument in debug builds, second argument otherwise.\n#ifdef OVR_BUILD_DEBUG\n#define OVR_DEBUG_STATEMENT(s)   s\n#define OVR_DEBUG_SELECT(d, nd)  d\n#else\n#define OVR_DEBUG_STATEMENT(s)\n#define OVR_DEBUG_SELECT(d, nd)  nd\n#endif\n\n\n#define OVR_ENABLE_THREADS\n//\n// Prevents OVR from defining new within\n// type macros, so developers can override\n// new using the #define new new(...) trick\n// - used with OVR_DEFINE_NEW macro\n//# define OVR_BUILD_DEFINE_NEW\n//\n\n\n//-----------------------------------------------------------------------------------\n// ***** Find normal allocations\n//\n// Our allocations are all supposed to go through the OVR System Allocator, so that\n// they can be run through a game's own preferred allocator.  Occasionally we will\n// accidentally introduce new code that doesn't adhere to this contract.  And it\n// then becomes difficult to track down these normal allocations.  This piece of\n// code makes it easy to check for normal allocations by asserting whenever they\n// happen in our code.\n\n//#define OVR_FIND_NORMAL_ALLOCATIONS\n#ifdef OVR_FIND_NORMAL_ALLOCATIONS\n\ninline void* operator new (size_t size, const char* filename, int line)\n{\n    void* ptr = new char[size];\n    OVR_ASSERT(false);\n    return ptr;\n}\n\n#define new new(__FILE__, __LINE__)\n\n#endif // OVR_FIND_NORMAL_ALLOCATIONS\n\n\n#include \"OVR_Nullptr.h\"\n\n\n\n\n#endif  // OVR_Types_h\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_UTF8Util.cpp",
    "content": "/**************************************************************************\n\nFilename    :   OVR_UTF8Util.cpp\nContent     :   UTF8 Unicode character encoding/decoding support\nCreated     :   September 19, 2012\nNotes       : \nNotes       :   Much useful info at \"UTF-8 and Unicode FAQ\"\n                http://www.cl.cam.ac.uk/~mgk25/unicode.html\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_UTF8Util.h\"\n\nnamespace OVR { namespace UTF8Util {\n\nintptr_t OVR_STDCALL GetLength(const char* buf, intptr_t buflen)\n{\n    const char* p = buf;\n    intptr_t length = 0;\n\n    if (buflen != -1)\n    {\n        while (p - buf < buflen)\n        {\n            // We should be able to have ASStrings with 0 in the middle.\n            UTF8Util::DecodeNextChar_Advance0(&p);\n            length++;\n        }\n    }\n    else\n    {\n        while (UTF8Util::DecodeNextChar_Advance0(&p))\n            length++;\n    }\n    \n    return length;\n}\n\nuint32_t OVR_STDCALL GetCharAt(intptr_t index, const char* putf8str, intptr_t length)\n{\n    const char* buf = putf8str;\n    uint32_t  c = 0;\n\n    if (length != -1)\n    {\n        while (buf - putf8str < length)\n        {           \n            c = UTF8Util::DecodeNextChar_Advance0(&buf);\n            if (index == 0)\n                return c;\n            index--;\n        }\n\n        return c;\n    }\n\n    do \n    {\n        c = UTF8Util::DecodeNextChar_Advance0(&buf);\n        index--;\n\n        if (c == 0)\n        {\n            // We've hit the end of the string; don't go further.\n            OVR_ASSERT(index == 0);\n            return c;\n        }\n    } while (index >= 0);\n\n    return c;\n}\n\nintptr_t OVR_STDCALL GetByteIndex(intptr_t index, const char *putf8str, intptr_t length)\n{\n    const char* buf = putf8str;\n\n    if (length != -1)\n    {\n        while ((buf - putf8str) < length && index > 0)\n        {\n            UTF8Util::DecodeNextChar_Advance0(&buf);\n            index--;\n        }\n\n        return buf-putf8str;\n    }\n\n    while (index > 0) \n    {\n        uint32_t c = UTF8Util::DecodeNextChar_Advance0(&buf);\n        index--;\n\n        if (c == 0)\n            return buf-putf8str;\n    };\n\n    return buf-putf8str;\n}\n\nint OVR_STDCALL GetEncodeCharSize(uint32_t ucs_character)\n{\n    if (ucs_character <= 0x7F)\n        return 1;\n    else if (ucs_character <= 0x7FF)\n        return 2;\n    else if (ucs_character <= 0xFFFF)\n        return 3;\n    else if (ucs_character <= 0x1FFFFF)\n        return 4;\n    else if (ucs_character <= 0x3FFFFFF)\n        return 5;\n    else if (ucs_character <= 0x7FFFFFFF)\n        return 6;\n    else\n        return 0;\n}\n\nuint32_t OVR_STDCALL DecodeNextChar_Advance0(const char** putf8Buffer)\n{\n    uint32_t  uc;\n    char    c;\n    \n    // Security considerations:\n    //\n    // Changed, this is now only the case for DecodeNextChar:\n    //  - If we hit a zero byte, we want to return 0 without stepping\n    //    the buffer pointer past the 0. th\n    //\n    // If we hit an \"overlong sequence\"; i.e. a character encoded\n    // in a longer multibyte string than is necessary, then we\n    // need to discard the character.  This is so attackers can't\n    // disguise dangerous characters or character sequences --\n    // there is only one valid encoding for each character.\n    //\n    // If we decode characters { 0xD800 .. 0xDFFF } or { 0xFFFE,\n    // 0xFFFF } then we ignore them; they are not valid in UTF-8.\n    \n    // This isn't actually an invalid character; it's a valid char that\n    // looks like an inverted question mark.\n#define INVALID_CHAR 0x0FFFD\n    \n#define FIRST_BYTE(mask, shift)     \\\n    uc = (c & (mask)) << (shift);\n    \n#define NEXT_BYTE(shift) \\\n    c = **putf8Buffer;   \\\n    if (c == 0) return 0; /* end of buffer, do not advance */   \\\n    if ((c & 0xC0) != 0x80) return INVALID_CHAR; /* standard check */  \\\n    (*putf8Buffer)++;    \\\n    uc |= (c & 0x3F) << shift;\n    \n    c = **putf8Buffer;\n    (*putf8Buffer)++;\n    if (c == 0)\n        return 0;   // End of buffer.\n    \n    if ((c & 0x80) == 0) return (uint32_t) c; // Conventional 7-bit ASCII.\n    \n    // Multi-byte sequences.\n    if ((c & 0xE0) == 0xC0)\n    {\n        // Two-byte sequence.\n        FIRST_BYTE(0x1F, 6);\n        NEXT_BYTE(0);\n        if (uc < 0x80) return INVALID_CHAR;  // overlong\n        return uc;\n    }\n    else if ((c & 0xF0) == 0xE0)\n    {\n        // Three-byte sequence.\n        FIRST_BYTE(0x0F, 12);\n        NEXT_BYTE(6);\n        NEXT_BYTE(0);\n        if (uc < 0x800) return INVALID_CHAR; // overlong\n        // Not valid ISO 10646, but Flash requires these to work\n        // see AS3 test e15_5_3_2_3 for String.fromCharCode().charCodeAt(0)\n        // if (uc >= 0x0D800 && uc <= 0x0DFFF) return INVALID_CHAR;\n        // if (uc == 0x0FFFE || uc == 0x0FFFF) return INVALID_CHAR; // not valid ISO 10646\n        return uc;\n    }\n    else if ((c & 0xF8) == 0xF0)\n    {\n        // Four-byte sequence.\n        FIRST_BYTE(0x07, 18);\n        NEXT_BYTE(12);\n        NEXT_BYTE(6);\n        NEXT_BYTE(0);\n        if (uc < 0x010000) return INVALID_CHAR;  // overlong\n        return uc;\n    }\n    else if ((c & 0xFC) == 0xF8)\n    {\n        // Five-byte sequence.\n        FIRST_BYTE(0x03, 24);\n        NEXT_BYTE(18);\n        NEXT_BYTE(12);\n        NEXT_BYTE(6);\n        NEXT_BYTE(0);\n        if (uc < 0x0200000) return INVALID_CHAR; // overlong\n        return uc;\n    }\n    else if ((c & 0xFE) == 0xFC)\n    {\n        // Six-byte sequence.\n        FIRST_BYTE(0x01, 30);\n        NEXT_BYTE(24);\n        NEXT_BYTE(18);\n        NEXT_BYTE(12);\n        NEXT_BYTE(6);\n        NEXT_BYTE(0);\n        if (uc < 0x04000000) return INVALID_CHAR;    // overlong\n        return uc;\n    }\n    else\n    {\n        // Invalid.\n        return INVALID_CHAR;\n    }\n}\n\n\nvoid OVR_STDCALL EncodeChar(char* pbuffer, intptr_t* pindex, uint32_t ucs_character)\n{\n    if (ucs_character <= 0x7F)\n    {\n        // Plain single-byte ASCII.\n        pbuffer[(*pindex)++] = (char) ucs_character;\n    }\n    else if (ucs_character <= 0x7FF)\n    {\n        // Two bytes.\n        pbuffer[(*pindex)++] = 0xC0 | (char)(ucs_character >> 6);\n        pbuffer[(*pindex)++] = 0x80 | (char)((ucs_character >> 0) & 0x3F);\n    }\n    else if (ucs_character <= 0xFFFF)\n    {\n        // Three bytes.\n        pbuffer[(*pindex)++] = 0xE0 | (char)(ucs_character >> 12);\n        pbuffer[(*pindex)++] = 0x80 | (char)((ucs_character >> 6) & 0x3F);\n        pbuffer[(*pindex)++] = 0x80 | (char)((ucs_character >> 0) & 0x3F);\n    }\n    else if (ucs_character <= 0x1FFFFF)\n    {\n        // Four bytes.\n        pbuffer[(*pindex)++] = 0xF0 | (char)(ucs_character >> 18);\n        pbuffer[(*pindex)++] = 0x80 | (char)((ucs_character >> 12) & 0x3F);\n        pbuffer[(*pindex)++] = 0x80 | (char)((ucs_character >> 6) & 0x3F);\n        pbuffer[(*pindex)++] = 0x80 | (char)((ucs_character >> 0) & 0x3F);\n    }\n    else if (ucs_character <= 0x3FFFFFF)\n    {\n        // Five bytes.\n        pbuffer[(*pindex)++] = 0xF8 | (char)(ucs_character >> 24);\n        pbuffer[(*pindex)++] = 0x80 | (char)((ucs_character >> 18) & 0x3F);\n        pbuffer[(*pindex)++] = 0x80 | (char)((ucs_character >> 12) & 0x3F);\n        pbuffer[(*pindex)++] = 0x80 | (char)((ucs_character >> 6) & 0x3F);\n        pbuffer[(*pindex)++] = 0x80 | (char)((ucs_character >> 0) & 0x3F);\n    }\n    else if (ucs_character <= 0x7FFFFFFF)\n    {\n        // Six bytes.\n        pbuffer[(*pindex)++] = 0xFC | (char)(ucs_character >> 30);\n        pbuffer[(*pindex)++] = 0x80 | (char)((ucs_character >> 24) & 0x3F);\n        pbuffer[(*pindex)++] = 0x80 | (char)((ucs_character >> 18) & 0x3F);\n        pbuffer[(*pindex)++] = 0x80 | (char)((ucs_character >> 12) & 0x3F);\n        pbuffer[(*pindex)++] = 0x80 | (char)((ucs_character >> 6) & 0x3F);\n        pbuffer[(*pindex)++] = 0x80 | (char)((ucs_character >> 0) & 0x3F);\n    }\n    else\n    {\n        // Invalid char; don't encode anything.\n    }\n}\n\nintptr_t OVR_STDCALL GetEncodeStringSize(const wchar_t* pchar, intptr_t length)\n{\n    intptr_t len = 0;\n    if (length != -1)\n        for (int i = 0; i < length; i++)\n        {\n            len += GetEncodeCharSize(pchar[i]);\n        }\n    else\n        for (int i = 0;; i++)\n        {\n            if (pchar[i] == 0)\n                return len;\n            len += GetEncodeCharSize(pchar[i]);\n        }\n    return len;\n}\n\nvoid OVR_STDCALL EncodeString(char *pbuff, const wchar_t* pchar, intptr_t length)\n{\n    intptr_t ofs = 0;\n    if (length != -1)\n    {\n        for (int i = 0; i < length; i++)\n        {            \n            EncodeChar(pbuff, &ofs, pchar[i]);\n        }\n    }\n    else\n    {\n        for (int i = 0;; i++)\n        {\n            if (pchar[i] == 0)\n                break;\n            EncodeChar(pbuff, &ofs, pchar[i]);\n        }\n    }\n    pbuff[ofs] = 0;\n}\n\nsize_t OVR_STDCALL DecodeString(wchar_t *pbuff, const char* putf8str, intptr_t bytesLen)\n{\n    wchar_t *pbegin = pbuff;\n    if (bytesLen == -1)\n    {\n        while (1)\n        {\n            uint32_t ch = DecodeNextChar_Advance0(&putf8str);\n            if (ch == 0)\n                break;\n            else if (ch >= 0xFFFF)\n                ch = 0xFFFD;\n            *pbuff++ = wchar_t(ch);\n        }\n    }\n    else\n    {\n        const char* p = putf8str;\n        while ((p - putf8str) < bytesLen)\n        {\n            uint32_t ch = DecodeNextChar_Advance0(&p);\n            if (ch >= 0xFFFF)\n                ch = 0xFFFD;\n            *pbuff++ = wchar_t(ch);\n        }\n    }\n\n    *pbuff = 0;\n    return pbuff - pbegin;\n}\n\n\n#ifdef UTF8_UNIT_TEST\n\n// Compile this test case with something like:\n//\n// gcc utf8.cpp -g -I.. -DUTF8_UNIT_TEST -lstdc++ -o utf8_test\n//\n//    or\n//\n// cl utf8.cpp -Zi -Od -DUTF8_UNIT_TEST -I..\n//\n// If possible, try running the test program with the first arg\n// pointing at the file:\n//\n// http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt\n// \n// and examine the results by eye to make sure they are acceptable to\n// you.\n\n\n#include \"base/utility.h\"\n#include <stdio.h>\n\n\nbool    check_equal(const char* utf8_in, const uint32_t* ucs_in)\n{\n    for (;;)\n    {\n        uint32_t  next_ucs = *ucs_in++;\n        uint32_t  next_ucs_from_utf8 = utf8::decode_next_unicode_character(&utf8_in);\n        if (next_ucs != next_ucs_from_utf8)\n        {\n            return false;\n        }\n        if (next_ucs == 0)\n        {\n            OVR_ASSERT(next_ucs_from_utf8 == 0);\n            break;\n        }\n    }\n    \n    return true;\n}\n\n\nvoid    log_ascii(const char* line)\n{\n    for (;;)\n    {\n        unsigned char   c = (unsigned char) *line++;\n        if (c == 0)\n        {\n            // End of line.\n            return;\n        }\n        else if (c != '\\n'\n            && (c < 32 || c > 127))\n        {\n            // Non-printable as plain ASCII.\n            printf(\"<0x%02X>\", (int) c);\n        }\n        else\n        {\n            printf(\"%c\", c);\n        }\n    }\n}\n\n\nvoid    log_ucs(const uint32_t* line)\n{\n    for (;;)\n    {\n        uint32_t  uc = *line++;\n        if (uc == 0)\n        {\n            // End of line.\n            return;\n        }\n        else if (uc != '\\n'\n            && (uc < 32 || uc > 127))\n        {\n            // Non-printable as plain ASCII.\n            printf(\"<U-%04X>\", uc);\n        }\n        else\n        {\n            printf(\"%c\", (char) uc);\n        }\n    }\n}\n\n\n// Simple canned test.\nint main(int argc, const char* argv[])\n{\n    {\n        const char* test8 = \"Ignacio Castaño\";\n        const uint32_t  test32[] =\n        {\n            0x49, 0x67, 0x6E, 0x61, 0x63,\n                0x69, 0x6F, 0x20, 0x43, 0x61,\n                0x73, 0x74, 0x61, 0xF1, 0x6F,\n                0x00\n        };\n        \n        OVR_ASSERT(check_equal(test8, test32));\n    }\n        \n        // If user passed an arg, try reading the file as UTF-8 encoded text.\n        if (argc > 1)\n        {\n            const char* filename = argv[1];\n            FILE*   fp = fopen(filename, \"rb\");\n            if (fp == NULL)\n            {\n                printf(\"Can't open file '%s'\\n\", filename);\n                return 1;\n            }\n            \n            // Read lines from the file, encode/decode them, and highlight discrepancies.\n            const int LINE_SIZE = 200;  // max line size\n            char    line_buffer_utf8[LINE_SIZE];\n            char    reencoded_utf8[6 * LINE_SIZE];\n            uint32_t  line_buffer_ucs[LINE_SIZE];\n            \n            int byte_counter = 0;\n            for (;;)\n            {\n                int c = fgetc(fp);\n                if (c == EOF)\n                {\n                    // Done.\n                    break;\n                }\n                line_buffer_utf8[byte_counter++] = c;\n                if (c == '\\n' || byte_counter >= LINE_SIZE - 2)\n                {\n                    // End of line.  Process the line.\n                    line_buffer_utf8[byte_counter++] = 0;   // terminate.\n                    \n                    // Decode into UCS.\n                    const char* p = line_buffer_utf8;\n                    uint32_t* q = line_buffer_ucs;\n                    for (;;)\n                    {\n                        uint32_t  uc = UTF8Util::DecodeNextChar(&p);\n                        *q++ = uc;\n                        \n                        OVR_ASSERT(q < line_buffer_ucs + LINE_SIZE);\n                        OVR_ASSERT(p < line_buffer_utf8 + LINE_SIZE);\n                        \n                        if (uc == 0) break;\n                    }\n                    \n                    // Encode back into UTF-8.\n                    q = line_buffer_ucs;\n                    int index = 0;\n                    for (;;)\n                    {\n                        uint32_t  uc = *q++;\n                        OVR_ASSERT(index < LINE_SIZE * 6 - 6);\n                        int last_index = index;\n                        UTF8Util::EncodeChar(reencoded_utf8, &index, uc);\n                        OVR_ASSERT(index <= last_index + 6);\n                        if (uc == 0) break;\n                    }\n                    \n                    // This can be useful for debugging.\n#if 0\n                    // Show the UCS and the re-encoded UTF-8.\n                    log_ucs(line_buffer_ucs);\n                    log_ascii(reencoded_utf8);\n#endif // 0\n                    \n                    OVR_ASSERT(check_equal(line_buffer_utf8, line_buffer_ucs));\n                    OVR_ASSERT(check_equal(reencoded_utf8, line_buffer_ucs));\n                    \n                    // Start next line.\n                    byte_counter = 0;\n                }\n            }\n            \n            fclose(fp);\n        }\n        \n        return 0;\n}\n\n\n#endif // UTF8_UNIT_TEST\n\n}} // namespace UTF8Util::OVR\n\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_UTF8Util.h",
    "content": "/************************************************************************************\n\nPublicHeader:   OVR_Kernel.h\nFilename    :   OVR_UTF8Util.h\nContent     :   UTF8 Unicode character encoding/decoding support\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_UTF8Util_h\n#define OVR_UTF8Util_h\n\n#include \"OVR_Types.h\"\n\nnamespace OVR { namespace UTF8Util {\n\n//-----------------------------------------------------------------------------------\n\n// *** UTF8 string length and indexing.\n\n// Determines the length of UTF8 string in characters.\n// If source length is specified (in bytes), null 0 character is counted properly.\nintptr_t OVR_STDCALL GetLength(const char* putf8str, intptr_t length = -1);\n\n// Gets a decoded UTF8 character at index; you can access up to the index returned\n// by GetLength. 0 will be returned for out of bounds access.\nuint32_t OVR_STDCALL GetCharAt(intptr_t index, const char* putf8str, intptr_t length = -1);\n\n// Converts UTF8 character index into byte offset.\n// -1 is returned if index was out of bounds.\nintptr_t OVR_STDCALL GetByteIndex(intptr_t index, const char* putf8str, intptr_t length = -1);\n\n\n// *** 16-bit Unicode string Encoding/Decoding routines.\n\n// Determines the number of bytes necessary to encode a string.\n// Does not count the terminating 0 (null) character.\nintptr_t OVR_STDCALL GetEncodeStringSize(const wchar_t* pchar, intptr_t length = -1);\n\n// Encodes a unicode (UCS-2 only) string into a buffer. The size of buffer must be at\n// least GetEncodeStringSize() + 1.\nvoid     OVR_STDCALL EncodeString(char *pbuff, const wchar_t* pchar, intptr_t length = -1);\n\n// Decode UTF8 into a wchar_t buffer. Must have GetLength()+1 characters available.\n// Characters over 0xFFFF are replaced with 0xFFFD.\n// Returns the length of resulting string (number of characters)\nsize_t   OVR_STDCALL DecodeString(wchar_t *pbuff, const char* putf8str, intptr_t bytesLen = -1);\n\n\n// *** Individual character Encoding/Decoding.\n\n// Determined the number of bytes necessary to encode a UCS character.\nint      OVR_STDCALL GetEncodeCharSize(uint32_t ucsCharacter);\n\n// Encodes the given UCS character into the given UTF-8 buffer.\n// Writes the data starting at buffer[offset], and \n// increments offset by the number of bytes written.\n// May write up to 6 bytes, so make sure there's room in the buffer\nvoid     OVR_STDCALL EncodeChar(char* pbuffer, intptr_t* poffset, uint32_t ucsCharacter);\n\n// Return the next Unicode character in the UTF-8 encoded buffer.\n// Invalid UTF-8 sequences produce a U+FFFD character as output.\n// Advances *utf8_buffer past the character returned. Pointer advance\n// occurs even if the terminating 0 character is hit, since that allows\n// strings with middle '\\0' characters to be supported.\nuint32_t OVR_STDCALL DecodeNextChar_Advance0(const char** putf8Buffer);\n\n// Safer version of DecodeNextChar, which doesn't advance pointer if\n// null character is hit.\ninline uint32_t DecodeNextChar(const char** putf8Buffer)\n{\n    uint32_t ch = DecodeNextChar_Advance0(putf8Buffer);\n    if (ch == 0)\n        (*putf8Buffer)--;\n    return ch;\n}\n\n\n}} // OVR::UTF8Util\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_mach_exc_OSX.c",
    "content": "/* This file was generated by the MIG utility with:\n       mig /usr/include/mach/mach_exc.defs\n   We pre-generate them instead of generate them at compile-time because we\n   need to rename some of the functions to append _OVR so we don't get conflicts\n   with any other versions of these functions the application may have.\n*/\n\n/* Begin mach_excUser.c */\n\n#define\t__MIG_check__Reply__mach_exc_subsystem__ 1\n#define\t__NDR_convert__Reply__mach_exc_subsystem__ 1\n#define\t__NDR_convert__mig_reply_error_subsystem__ 1\n\n#include \"OVR_mach_exc_OSX.h\"\n\n#if defined(__cplusplus)\n    extern \"C\" {\n#endif\n\n#ifndef\tmig_internal\n#define\tmig_internal\tstatic __inline__\n#endif\t/* mig_internal */\n\n#ifndef\tmig_external\n#define mig_external\n#endif\t/* mig_external */\n\n#if\t!defined(__MigTypeCheck) && defined(TypeCheck)\n#define\t__MigTypeCheck\t\tTypeCheck\t/* Legacy setting */\n#endif\t/* !defined(__MigTypeCheck) */\n\n#if\t!defined(__MigKernelSpecificCode) && defined(_MIG_KERNEL_SPECIFIC_CODE_)\n#define\t__MigKernelSpecificCode\t_MIG_KERNEL_SPECIFIC_CODE_\t/* Legacy setting */\n#endif\t/* !defined(__MigKernelSpecificCode) */\n\n#ifndef\tLimitCheck\n#define\tLimitCheck 0\n#endif\t/* LimitCheck */\n\n#ifndef\tmin\n#define\tmin(a,b)  ( ((a) < (b))? (a): (b) )\n#endif\t/* min */\n\n#if !defined(_WALIGN_)\n#define _WALIGN_(x) (((x) + 3) & ~3)\n#endif /* !defined(_WALIGN_) */\n\n#if !defined(_WALIGNSZ_)\n#define _WALIGNSZ_(x) _WALIGN_(sizeof(x))\n#endif /* !defined(_WALIGNSZ_) */\n\n#ifndef\tUseStaticTemplates\n#define\tUseStaticTemplates\t0\n#endif\t/* UseStaticTemplates */\n\n#ifndef\t__MachMsgErrorWithTimeout\n#define\t__MachMsgErrorWithTimeout(_R_) { \\\n\tswitch (_R_) { \\\n\tcase MACH_SEND_INVALID_DATA: \\\n\tcase MACH_SEND_INVALID_DEST: \\\n\tcase MACH_SEND_INVALID_HEADER: \\\n\t\tmig_put_reply_port(InP->Head.msgh_reply_port); \\\n\t\tbreak; \\\n\tcase MACH_SEND_TIMED_OUT: \\\n\tcase MACH_RCV_TIMED_OUT: \\\n\tdefault: \\\n\t\tmig_dealloc_reply_port(InP->Head.msgh_reply_port); \\\n\t} \\\n}\n#endif\t/* __MachMsgErrorWithTimeout */\n\n#ifndef\t__MachMsgErrorWithoutTimeout\n#define\t__MachMsgErrorWithoutTimeout(_R_) { \\\n\tswitch (_R_) { \\\n\tcase MACH_SEND_INVALID_DATA: \\\n\tcase MACH_SEND_INVALID_DEST: \\\n\tcase MACH_SEND_INVALID_HEADER: \\\n\t\tmig_put_reply_port(InP->Head.msgh_reply_port); \\\n\t\tbreak; \\\n\tdefault: \\\n\t\tmig_dealloc_reply_port(InP->Head.msgh_reply_port); \\\n\t} \\\n}\n#endif\t/* __MachMsgErrorWithoutTimeout */\n\n#ifndef\t__DeclareSendRpc\n#define\t__DeclareSendRpc(_NUM_, _NAME_)\n#endif\t/* __DeclareSendRpc */\n\n#ifndef\t__BeforeSendRpc\n#define\t__BeforeSendRpc(_NUM_, _NAME_)\n#endif\t/* __BeforeSendRpc */\n\n#ifndef\t__AfterSendRpc\n#define\t__AfterSendRpc(_NUM_, _NAME_)\n#endif\t/* __AfterSendRpc */\n\n#ifndef\t__DeclareSendSimple\n#define\t__DeclareSendSimple(_NUM_, _NAME_)\n#endif\t/* __DeclareSendSimple */\n\n#ifndef\t__BeforeSendSimple\n#define\t__BeforeSendSimple(_NUM_, _NAME_)\n#endif\t/* __BeforeSendSimple */\n\n#ifndef\t__AfterSendSimple\n#define\t__AfterSendSimple(_NUM_, _NAME_)\n#endif\t/* __AfterSendSimple */\n\n#ifndef msgh_request_port\n    #define msgh_request_port\tmsgh_remote_port\n#endif\n\n#ifndef msgh_reply_port\n    #define msgh_reply_port\t\tmsgh_local_port\n#endif\n\n\n#if ( __MigTypeCheck || __NDR_convert__ )\n#if __MIG_check__Reply__mach_exc_subsystem__\n#if !defined(__MIG_check__Reply__mach_exception_raise_t__defined)\n#define __MIG_check__Reply__mach_exception_raise_t__defined\n#ifndef __NDR_convert__int_rep__Reply__mach_exception_raise_t__RetCode__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__kern_return_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_t__RetCode__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_t__RetCode(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__kern_return_t((kern_return_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__kern_return_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_t__RetCode__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_t__RetCode(a, f) \\\n\t__NDR_convert__int_rep__kern_return_t((kern_return_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Reply__mach_exception_raise_t__RetCode__defined */\n\n\n\n\n\nmig_internal kern_return_t __MIG_check__Reply__mach_exception_raise_t_OVR(__Reply__mach_exception_raise_t *Out0P)\n{\n\n\ttypedef __Reply__mach_exception_raise_t __Reply;\n\tif (Out0P->Head.msgh_id != 2505) {\n\t    if (Out0P->Head.msgh_id == MACH_NOTIFY_SEND_ONCE)\n\t\t{ return MIG_SERVER_DIED; }\n\t    else\n\t\t{ return MIG_REPLY_MISMATCH; }\n\t}\n\n    #if\t__MigTypeCheck\n        if ((Out0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) ||\n            (Out0P->Head.msgh_size != (mach_msg_size_t)sizeof(__Reply)))\n            { return MIG_TYPE_ERROR ; }\n    #endif\t/* __MigTypeCheck */\n\n    #if defined(__NDR_convert__int_rep__Reply__mach_exception_raise_t__RetCode__defined)\n        if (Out0P->NDR.int_rep != NDR_record.int_rep)\n            __NDR_convert__int_rep__Reply__mach_exception_raise_t__RetCode(&Out0P->RetCode, Out0P->NDR.int_rep);\n    #endif\t/* __NDR_convert__int_rep__Reply__mach_exception_raise_t__RetCode__defined */\n\t{\n\t\treturn Out0P->RetCode;\n\t}\n}\n#endif /* !defined(__MIG_check__Reply__mach_exception_raise_t__defined) */\n#endif /* __MIG_check__Reply__mach_exc_subsystem__ */\n#endif /* ( __MigTypeCheck || __NDR_convert__ ) */\n\n\n/* Routine mach_exception_raise_OVR */\nmig_external kern_return_t mach_exception_raise_OVR\n(\n\tmach_port_t exception_port,\n\tmach_port_t thread,\n\tmach_port_t task,\n\texception_type_t exception,\n\tmach_exception_data_t code,\n\tmach_msg_type_number_t codeCnt\n)\n{\n\n    #ifdef  __MigPackStructs\n    #pragma pack(4)\n    #endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\t/* start of the kernel processed data */\n\t\tmach_msg_body_t msgh_body;\n\t\tmach_msg_port_descriptor_t thread;\n\t\tmach_msg_port_descriptor_t task;\n\t\t/* end of the kernel processed data */\n\t\tNDR_record_t NDR;\n\t\texception_type_t exception;\n\t\tmach_msg_type_number_t codeCnt;\n\t\tint64_t code[2];\n\t} Request;\n    #ifdef  __MigPackStructs\n    #pragma pack()\n    #endif\n\n    #ifdef  __MigPackStructs\n    #pragma pack(4)\n    #endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\tNDR_record_t NDR;\n\t\tkern_return_t RetCode;\n\t\tmach_msg_trailer_t trailer;\n\t} Reply;\n    #ifdef  __MigPackStructs\n    #pragma pack()\n    #endif\n\n    #ifdef  __MigPackStructs\n    #pragma pack(4)\n    #endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\tNDR_record_t NDR;\n\t\tkern_return_t RetCode;\n\t} __Reply;\n    #ifdef  __MigPackStructs\n    #pragma pack()\n    #endif\n\t/*\n\t * typedef struct {\n\t * \tmach_msg_header_t Head;\n\t * \tNDR_record_t NDR;\n\t * \tkern_return_t RetCode;\n\t * } mig_reply_error_t;\n\t */\n\n\tunion {\n\t\tRequest In;\n\t\tReply Out;\n\t} Mess;\n\n\tRequest *InP = &Mess.In;\n\tReply *Out0P = &Mess.Out;\n\n\tmach_msg_return_t msg_result;\n\tunsigned int msgh_size;\n\n    #ifdef\t__MIG_check__Reply__mach_exception_raise_t__defined\n        kern_return_t check_result;\n    #endif\t/* __MIG_check__Reply__mach_exception_raise_t__defined */\n\n\t__DeclareSendRpc(2405, \"mach_exception_raise_OVR\")\n\n    #if\tUseStaticTemplates\n        const static mach_msg_port_descriptor_t threadTemplate = {\n            /* name = */\t\tMACH_PORT_NULL,\n            /* pad1 = */\t\t0,\n            /* pad2 = */\t\t0,\n            /* disp = */\t\t19,\n            /* type = */\t\tMACH_MSG_PORT_DESCRIPTOR,\n        };\n    #endif\t/* UseStaticTemplates */\n\n    #if\tUseStaticTemplates\n        const static mach_msg_port_descriptor_t taskTemplate = {\n            /* name = */\t\tMACH_PORT_NULL,\n            /* pad1 = */\t\t0,\n            /* pad2 = */\t\t0,\n            /* disp = */\t\t19,\n            /* type = */\t\tMACH_MSG_PORT_DESCRIPTOR,\n        };\n    #endif\t/* UseStaticTemplates */\n\n\tInP->msgh_body.msgh_descriptor_count = 2;\n    #if\tUseStaticTemplates\n        InP->thread = threadTemplate;\n        InP->thread.name = thread;\n    #else\t/* UseStaticTemplates */\n        InP->thread.name = thread;\n        InP->thread.disposition = 19;\n        InP->thread.type = MACH_MSG_PORT_DESCRIPTOR;\n    #endif\t/* UseStaticTemplates */\n\n    #if\tUseStaticTemplates\n        InP->task = taskTemplate;\n        InP->task.name = task;\n    #else\t/* UseStaticTemplates */\n        InP->task.name = task;\n        InP->task.disposition = 19;\n        InP->task.type = MACH_MSG_PORT_DESCRIPTOR;\n    #endif\t/* UseStaticTemplates */\n\n\tInP->NDR = NDR_record;\n\n\tInP->exception = exception;\n\n\tif (codeCnt > 2) {\n\t\t{ return MIG_ARRAY_TOO_LARGE; }\n\t}\n\t(void)memcpy((char *) InP->code, (const char *) code, 8 * codeCnt);\n\n\tInP->codeCnt = codeCnt;\n\n\tmsgh_size = (mach_msg_size_t)(sizeof(Request) - 16) + ((8 * codeCnt));\n\tInP->Head.msgh_bits = MACH_MSGH_BITS_COMPLEX|\n\t\tMACH_MSGH_BITS(19, MACH_MSG_TYPE_MAKE_SEND_ONCE);\n\t/* msgh_size passed as argument */\n\tInP->Head.msgh_request_port = exception_port;\n\tInP->Head.msgh_reply_port = mig_get_reply_port();\n\tInP->Head.msgh_id = 2405;\n\n\t__BeforeSendRpc(2405, \"mach_exception_raise_OVR\")\n\tmsg_result = mach_msg(&InP->Head, MACH_SEND_MSG|MACH_RCV_MSG|MACH_MSG_OPTION_NONE, msgh_size, (mach_msg_size_t)sizeof(Reply), InP->Head.msgh_reply_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);\n\t__AfterSendRpc(2405, \"mach_exception_raise_OVR\")\n\tif (msg_result != MACH_MSG_SUCCESS) {\n\t\t__MachMsgErrorWithoutTimeout(msg_result);\n\t\t{ return msg_result; }\n\t}\n\n\n    #if\tdefined(__MIG_check__Reply__mach_exception_raise_t__defined)\n        check_result = __MIG_check__Reply__mach_exception_raise_t_OVR((__Reply__mach_exception_raise_t *)Out0P);\n        if (check_result != MACH_MSG_SUCCESS)\n            { return check_result; }\n    #endif\t/* defined(__MIG_check__Reply__mach_exception_raise_t__defined) */\n\n\treturn KERN_SUCCESS;\n}\n\n#if ( __MigTypeCheck || __NDR_convert__ )\n#if __MIG_check__Reply__mach_exc_subsystem__\n#if !defined(__MIG_check__Reply__mach_exception_raise_state_t__defined)\n#define __MIG_check__Reply__mach_exception_raise_state_t__defined\n#ifndef __NDR_convert__int_rep__Reply__mach_exception_raise_state_t__RetCode__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__kern_return_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__RetCode__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__RetCode(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__kern_return_t((kern_return_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__kern_return_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__RetCode__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__RetCode(a, f) \\\n\t__NDR_convert__int_rep__kern_return_t((kern_return_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Reply__mach_exception_raise_state_t__RetCode__defined */\n\n\n#ifndef __NDR_convert__int_rep__Reply__mach_exception_raise_state_t__flavor__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__int__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__int__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__int_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__int32_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__int_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Reply__mach_exception_raise_state_t__flavor__defined */\n\n\n#ifndef __NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__thread_state_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_state(a, f, c) \\\n\t__NDR_convert__int_rep__mach_exc__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__int_rep__thread_state_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_state(a, f, c) \\\n\t__NDR_convert__int_rep__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__natural_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__int_rep__mach_exc__natural_t)\n#elif\tdefined(__NDR_convert__int_rep__natural_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__int_rep__natural_t)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__uint32_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__int_rep__mach_exc__uint32_t)\n#elif\tdefined(__NDR_convert__int_rep__uint32_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__int_rep__uint32_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_state__defined */\n\n\n#ifndef __NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_stateCnt__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__mach_msg_type_number_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_stateCnt__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_stateCnt(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__mach_msg_type_number_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_stateCnt__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_stateCnt(a, f) \\\n\t__NDR_convert__int_rep__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_stateCnt__defined */\n\n\n\n#ifndef __NDR_convert__char_rep__Reply__mach_exception_raise_state_t__flavor__defined\n#if\tdefined(__NDR_convert__char_rep__mach_exc__int__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__char_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__int__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__char_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__char_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__int32_t__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__char_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__char_rep__Reply__mach_exception_raise_state_t__flavor__defined */\n\n\n#ifndef __NDR_convert__char_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#if\tdefined(__NDR_convert__char_rep__mach_exc__thread_state_t__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__new_state(a, f, c) \\\n\t__NDR_convert__char_rep__mach_exc__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__char_rep__thread_state_t__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__new_state(a, f, c) \\\n\t__NDR_convert__char_rep__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__natural_t__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__char_rep__mach_exc__natural_t)\n#elif\tdefined(__NDR_convert__char_rep__natural_t__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__char_rep__natural_t)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__uint32_t__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__char_rep__mach_exc__uint32_t)\n#elif\tdefined(__NDR_convert__char_rep__uint32_t__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__char_rep__uint32_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__char_rep__Reply__mach_exception_raise_state_t__new_state__defined */\n\n\n\n\n#ifndef __NDR_convert__float_rep__Reply__mach_exception_raise_state_t__flavor__defined\n#if\tdefined(__NDR_convert__float_rep__mach_exc__int__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__float_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__int__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__float_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__float_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__int32_t__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__float_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__float_rep__Reply__mach_exception_raise_state_t__flavor__defined */\n\n\n#ifndef __NDR_convert__float_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#if\tdefined(__NDR_convert__float_rep__mach_exc__thread_state_t__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__new_state(a, f, c) \\\n\t__NDR_convert__float_rep__mach_exc__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__float_rep__thread_state_t__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__new_state(a, f, c) \\\n\t__NDR_convert__float_rep__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__natural_t__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__float_rep__mach_exc__natural_t)\n#elif\tdefined(__NDR_convert__float_rep__natural_t__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__float_rep__natural_t)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__uint32_t__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__float_rep__mach_exc__uint32_t)\n#elif\tdefined(__NDR_convert__float_rep__uint32_t__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__new_state__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__float_rep__uint32_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__float_rep__Reply__mach_exception_raise_state_t__new_state__defined */\n\n\n\n\nmig_internal kern_return_t __MIG_check__Reply__mach_exception_raise_state_t_OVR(__Reply__mach_exception_raise_state_t *Out0P)\n{\n\n\ttypedef __Reply__mach_exception_raise_state_t __Reply;\n    #if\t__MigTypeCheck\n        unsigned int msgh_size;\n    #endif\t/* __MigTypeCheck */\n\n        if (Out0P->Head.msgh_id != 2506) {\n            if (Out0P->Head.msgh_id == MACH_NOTIFY_SEND_ONCE)\n            { return MIG_SERVER_DIED; }\n            else\n            { return MIG_REPLY_MISMATCH; }\n        }\n\n    #if\t__MigTypeCheck\n        msgh_size = Out0P->Head.msgh_size;\n\n        if ((Out0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) ||\n            ((msgh_size > (mach_msg_size_t)sizeof(__Reply) || msgh_size < (mach_msg_size_t)(sizeof(__Reply) - 576)) &&\n             (msgh_size != (mach_msg_size_t)sizeof(mig_reply_error_t) ||\n              Out0P->RetCode == KERN_SUCCESS)))\n            { return MIG_TYPE_ERROR ; }\n    #endif\t/* __MigTypeCheck */\n\n        if (Out0P->RetCode != KERN_SUCCESS) {\n    #ifdef\t__NDR_convert__mig_reply_error_t__defined\n            __NDR_convert__mig_reply_error_t((mig_reply_error_t *)Out0P);\n    #endif\t/* __NDR_convert__mig_reply_error_t__defined */\n            return ((mig_reply_error_t *)Out0P)->RetCode;\n        }\n\n    #if defined(__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_stateCnt__defined)\n        if (Out0P->NDR.int_rep != NDR_record.int_rep)\n            __NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_stateCnt(&Out0P->new_stateCnt, Out0P->NDR.int_rep);\n    #endif\t/* __NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_stateCnt__defined */\n    #if\t__MigTypeCheck\n        if ( Out0P->new_stateCnt > 144 )\n            return MIG_TYPE_ERROR;\n        if (((msgh_size - (mach_msg_size_t)(sizeof(__Reply) - 576)) / 4 != Out0P->new_stateCnt) || \n            (msgh_size != (mach_msg_size_t)(sizeof(__Reply) - 576) + Out0P->new_stateCnt * 4))\n            { return MIG_TYPE_ERROR ; }\n    #endif\t/* __MigTypeCheck */\n\n    #if\tdefined(__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__RetCode__defined) || \\\n        defined(__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__flavor__defined) || \\\n        defined(__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_state__defined) || \\\n        defined(__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_stateCnt__defined)\n        if (Out0P->NDR.int_rep != NDR_record.int_rep) {\n    #if defined(__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__RetCode__defined)\n            __NDR_convert__int_rep__Reply__mach_exception_raise_state_t__RetCode(&Out0P->RetCode, Out0P->NDR.int_rep);\n    #endif /* __NDR_convert__int_rep__Reply__mach_exception_raise_state_t__RetCode__defined */\n    #if defined(__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__flavor__defined)\n            __NDR_convert__int_rep__Reply__mach_exception_raise_state_t__flavor(&Out0P->flavor, Out0P->NDR.int_rep);\n    #endif /* __NDR_convert__int_rep__Reply__mach_exception_raise_state_t__flavor__defined */\n    #if defined(__NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_state__defined)\n            __NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_state(&Out0P->new_state, Out0P->NDR.int_rep, Out0P->new_stateCnt);\n    #endif /* __NDR_convert__int_rep__Reply__mach_exception_raise_state_t__new_state__defined */\n        }\n    #endif\t/* defined(__NDR_convert__int_rep...) */\n\n    #if\t0 || \\\n        defined(__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__flavor__defined) || \\\n        defined(__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__new_state__defined) || \\\n        0\n        if (Out0P->NDR.char_rep != NDR_record.char_rep) {\n    #if defined(__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__flavor__defined)\n            __NDR_convert__char_rep__Reply__mach_exception_raise_state_t__flavor(&Out0P->flavor, Out0P->NDR.char_rep);\n    #endif /* __NDR_convert__char_rep__Reply__mach_exception_raise_state_t__flavor__defined */\n    #if defined(__NDR_convert__char_rep__Reply__mach_exception_raise_state_t__new_state__defined)\n            __NDR_convert__char_rep__Reply__mach_exception_raise_state_t__new_state(&Out0P->new_state, Out0P->NDR.char_rep, Out0P->new_stateCnt);\n    #endif /* __NDR_convert__char_rep__Reply__mach_exception_raise_state_t__new_state__defined */\n        }\n    #endif\t/* defined(__NDR_convert__char_rep...) */\n\n    #if\t0 || \\\n        defined(__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__flavor__defined) || \\\n        defined(__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__new_state__defined) || \\\n        0\n        if (Out0P->NDR.float_rep != NDR_record.float_rep) {\n    #if defined(__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__flavor__defined)\n            __NDR_convert__float_rep__Reply__mach_exception_raise_state_t__flavor(&Out0P->flavor, Out0P->NDR.float_rep);\n    #endif /* __NDR_convert__float_rep__Reply__mach_exception_raise_state_t__flavor__defined */\n    #if defined(__NDR_convert__float_rep__Reply__mach_exception_raise_state_t__new_state__defined)\n            __NDR_convert__float_rep__Reply__mach_exception_raise_state_t__new_state(&Out0P->new_state, Out0P->NDR.float_rep, Out0P->new_stateCnt);\n    #endif /* __NDR_convert__float_rep__Reply__mach_exception_raise_state_t__new_state__defined */\n        }\n    #endif\t/* defined(__NDR_convert__float_rep...) */\n\n\treturn MACH_MSG_SUCCESS;\n}\n#endif /* !defined(__MIG_check__Reply__mach_exception_raise_state_t__defined) */\n#endif /* __MIG_check__Reply__mach_exc_subsystem__ */\n#endif /* ( __MigTypeCheck || __NDR_convert__ ) */\n\n\n/* Routine mach_exception_raise_state_OVR */\nmig_external kern_return_t mach_exception_raise_state_OVR\n(\n\tmach_port_t exception_port,\n\texception_type_t exception,\n\tconst mach_exception_data_t code,\n\tmach_msg_type_number_t codeCnt,\n\tint *flavor,\n\tconst thread_state_t old_state,\n\tmach_msg_type_number_t old_stateCnt,\n\tthread_state_t new_state,\n\tmach_msg_type_number_t *new_stateCnt\n)\n{\n\n    #ifdef  __MigPackStructs\n    #pragma pack(4)\n    #endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\tNDR_record_t NDR;\n\t\texception_type_t exception;\n\t\tmach_msg_type_number_t codeCnt;\n\t\tint64_t code[2];\n\t\tint flavor;\n\t\tmach_msg_type_number_t old_stateCnt;\n\t\tnatural_t old_state[144];\n\t} Request;\n    #ifdef  __MigPackStructs\n    #pragma pack()\n    #endif\n\n    #ifdef  __MigPackStructs\n    #pragma pack(4)\n    #endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\tNDR_record_t NDR;\n\t\tkern_return_t RetCode;\n\t\tint flavor;\n\t\tmach_msg_type_number_t new_stateCnt;\n\t\tnatural_t new_state[144];\n\t\tmach_msg_trailer_t trailer;\n\t} Reply;\n    #ifdef  __MigPackStructs\n    #pragma pack()\n    #endif\n\n    #ifdef  __MigPackStructs\n    #pragma pack(4)\n    #endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\tNDR_record_t NDR;\n\t\tkern_return_t RetCode;\n\t\tint flavor;\n\t\tmach_msg_type_number_t new_stateCnt;\n\t\tnatural_t new_state[144];\n\t} __Reply;\n    #ifdef  __MigPackStructs\n    #pragma pack()\n    #endif\n\t/*\n\t * typedef struct {\n\t * \tmach_msg_header_t Head;\n\t * \tNDR_record_t NDR;\n\t * \tkern_return_t RetCode;\n\t * } mig_reply_error_t;\n\t */\n\n\tunion {\n\t\tRequest In;\n\t\tReply Out;\n\t} Mess;\n\n\tRequest *InP = &Mess.In;\n\tReply *Out0P = &Mess.Out;\n\n\tmach_msg_return_t msg_result;\n\tunsigned int msgh_size;\n\tunsigned int msgh_size_delta;\n\n\n    #ifdef\t__MIG_check__Reply__mach_exception_raise_state_t__defined\n        kern_return_t check_result;\n    #endif\t/* __MIG_check__Reply__mach_exception_raise_state_t__defined */\n\n\t__DeclareSendRpc(2406, \"mach_exception_raise_state_OVR\")\n\n\tInP->NDR = NDR_record;\n\n\tInP->exception = exception;\n\n\tif (codeCnt > 2) {\n\t\t{ return MIG_ARRAY_TOO_LARGE; }\n\t}\n\t(void)memcpy((char *) InP->code, (const char *) code, 8 * codeCnt);\n\n\tInP->codeCnt = codeCnt;\n\n\tmsgh_size_delta = (8 * codeCnt);\n\tmsgh_size = (mach_msg_size_t)(sizeof(Request) - 592) + msgh_size_delta;\n\tInP = (Request *) ((pointer_t) InP + msgh_size_delta - 16);\n\n\tInP->flavor = *flavor;\n\n\tif (old_stateCnt > 144) {\n\t\t{ return MIG_ARRAY_TOO_LARGE; }\n\t}\n\t(void)memcpy((char *) InP->old_state, (const char *) old_state, 4 * old_stateCnt);\n\n\tInP->old_stateCnt = old_stateCnt;\n\n\tmsgh_size += (4 * old_stateCnt);\n\tInP = &Mess.In;\n\tInP->Head.msgh_bits =\n\t\tMACH_MSGH_BITS(19, MACH_MSG_TYPE_MAKE_SEND_ONCE);\n\t/* msgh_size passed as argument */\n\tInP->Head.msgh_request_port = exception_port;\n\tInP->Head.msgh_reply_port = mig_get_reply_port();\n\tInP->Head.msgh_id = 2406;\n\n\t__BeforeSendRpc(2406, \"mach_exception_raise_state_OVR\")\n\tmsg_result = mach_msg(&InP->Head, MACH_SEND_MSG|MACH_RCV_MSG|MACH_MSG_OPTION_NONE, msgh_size, (mach_msg_size_t)sizeof(Reply), InP->Head.msgh_reply_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);\n\t__AfterSendRpc(2406, \"mach_exception_raise_state_OVR\")\n\tif (msg_result != MACH_MSG_SUCCESS) {\n\t\t__MachMsgErrorWithoutTimeout(msg_result);\n\t\t{ return msg_result; }\n\t}\n\n\n    #if\tdefined(__MIG_check__Reply__mach_exception_raise_state_t__defined)\n        check_result = __MIG_check__Reply__mach_exception_raise_state_t_OVR((__Reply__mach_exception_raise_state_t *)Out0P);\n        if (check_result != MACH_MSG_SUCCESS)\n            { return check_result; }\n    #endif\t/* defined(__MIG_check__Reply__mach_exception_raise_state_t__defined) */\n\n\t*flavor = Out0P->flavor;\n\n\tif (Out0P->new_stateCnt > 144) {\n\t\t(void)memcpy((char *) new_state, (const char *) Out0P->new_state, 4 *  144);\n\t\t*new_stateCnt = Out0P->new_stateCnt;\n\t\t{ return MIG_ARRAY_TOO_LARGE; }\n\t}\n\t(void)memcpy((char *) new_state, (const char *) Out0P->new_state, 4 * Out0P->new_stateCnt);\n\n\t*new_stateCnt = Out0P->new_stateCnt;\n\n\treturn KERN_SUCCESS;\n}\n\n#if ( __MigTypeCheck || __NDR_convert__ )\n#if __MIG_check__Reply__mach_exc_subsystem__\n#if !defined(__MIG_check__Reply__mach_exception_raise_state_identity_t__defined)\n#define __MIG_check__Reply__mach_exception_raise_state_identity_t__defined\n#ifndef __NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__RetCode__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__kern_return_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__RetCode__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__RetCode(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__kern_return_t((kern_return_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__kern_return_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__RetCode__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__RetCode(a, f) \\\n\t__NDR_convert__int_rep__kern_return_t((kern_return_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__RetCode__defined */\n\n\n#ifndef __NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__int__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__int__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__int_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__int32_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__int_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined */\n\n\n#ifndef __NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__thread_state_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_state(a, f, c) \\\n\t__NDR_convert__int_rep__mach_exc__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__int_rep__thread_state_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_state(a, f, c) \\\n\t__NDR_convert__int_rep__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__natural_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__int_rep__mach_exc__natural_t)\n#elif\tdefined(__NDR_convert__int_rep__natural_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__int_rep__natural_t)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__uint32_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__int_rep__mach_exc__uint32_t)\n#elif\tdefined(__NDR_convert__int_rep__uint32_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__int_rep__uint32_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined */\n\n\n#ifndef __NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_stateCnt__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__mach_msg_type_number_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_stateCnt__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_stateCnt(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__mach_msg_type_number_t__defined)\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_stateCnt__defined\n#define\t__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_stateCnt(a, f) \\\n\t__NDR_convert__int_rep__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_stateCnt__defined */\n\n\n\n#ifndef __NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined\n#if\tdefined(__NDR_convert__char_rep__mach_exc__int__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__char_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__int__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__char_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__char_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__int32_t__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__char_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined */\n\n\n#ifndef __NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#if\tdefined(__NDR_convert__char_rep__mach_exc__thread_state_t__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__new_state(a, f, c) \\\n\t__NDR_convert__char_rep__mach_exc__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__char_rep__thread_state_t__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__new_state(a, f, c) \\\n\t__NDR_convert__char_rep__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__natural_t__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__char_rep__mach_exc__natural_t)\n#elif\tdefined(__NDR_convert__char_rep__natural_t__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__char_rep__natural_t)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__uint32_t__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__char_rep__mach_exc__uint32_t)\n#elif\tdefined(__NDR_convert__char_rep__uint32_t__defined)\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#define\t__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__char_rep__uint32_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined */\n\n\n\n\n#ifndef __NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined\n#if\tdefined(__NDR_convert__float_rep__mach_exc__int__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__float_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__int__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__float_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__float_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__int32_t__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__float_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined */\n\n\n#ifndef __NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#if\tdefined(__NDR_convert__float_rep__mach_exc__thread_state_t__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__new_state(a, f, c) \\\n\t__NDR_convert__float_rep__mach_exc__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__float_rep__thread_state_t__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__new_state(a, f, c) \\\n\t__NDR_convert__float_rep__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__natural_t__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__float_rep__mach_exc__natural_t)\n#elif\tdefined(__NDR_convert__float_rep__natural_t__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__float_rep__natural_t)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__uint32_t__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__float_rep__mach_exc__uint32_t)\n#elif\tdefined(__NDR_convert__float_rep__uint32_t__defined)\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined\n#define\t__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__new_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__float_rep__uint32_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined */\n\n\n\n\nmig_internal kern_return_t __MIG_check__Reply__mach_exception_raise_state_identity_t(__Reply__mach_exception_raise_state_identity_t *Out0P)\n{\n\n\ttypedef __Reply__mach_exception_raise_state_identity_t __Reply;\n    #if\t__MigTypeCheck\n        unsigned int msgh_size;\n    #endif\t/* __MigTypeCheck */\n\n\tif (Out0P->Head.msgh_id != 2507) {\n\t    if (Out0P->Head.msgh_id == MACH_NOTIFY_SEND_ONCE)\n\t\t{ return MIG_SERVER_DIED; }\n\t    else\n\t\t{ return MIG_REPLY_MISMATCH; }\n\t}\n\n    #if\t__MigTypeCheck\n        msgh_size = Out0P->Head.msgh_size;\n\n        if ((Out0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) ||\n            ((msgh_size > (mach_msg_size_t)sizeof(__Reply) || msgh_size < (mach_msg_size_t)(sizeof(__Reply) - 576)) &&\n             (msgh_size != (mach_msg_size_t)sizeof(mig_reply_error_t) ||\n              Out0P->RetCode == KERN_SUCCESS)))\n            { return MIG_TYPE_ERROR ; }\n    #endif\t/* __MigTypeCheck */\n\n\tif (Out0P->RetCode != KERN_SUCCESS) {\n        #ifdef\t__NDR_convert__mig_reply_error_t__defined\n                __NDR_convert__mig_reply_error_t((mig_reply_error_t *)Out0P);\n        #endif\t/* __NDR_convert__mig_reply_error_t__defined */\n\t\treturn ((mig_reply_error_t *)Out0P)->RetCode;\n\t}\n\n    #if defined(__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_stateCnt__defined)\n        if (Out0P->NDR.int_rep != NDR_record.int_rep)\n            __NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_stateCnt(&Out0P->new_stateCnt, Out0P->NDR.int_rep);\n    #endif\t/* __NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_stateCnt__defined */\n    #if\t__MigTypeCheck\n        if ( Out0P->new_stateCnt > 144 )\n            return MIG_TYPE_ERROR;\n        if (((msgh_size - (mach_msg_size_t)(sizeof(__Reply) - 576)) / 4 != Out0P->new_stateCnt) || \n            (msgh_size != (mach_msg_size_t)(sizeof(__Reply) - 576) + Out0P->new_stateCnt * 4))\n            { return MIG_TYPE_ERROR ; }\n    #endif\t/* __MigTypeCheck */\n\n    #if\tdefined(__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__RetCode__defined) || \\\n        defined(__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined) || \\\n        defined(__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined) || \\\n        defined(__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_stateCnt__defined)\n        if (Out0P->NDR.int_rep != NDR_record.int_rep) {\n    #if defined(__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__RetCode__defined)\n            __NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__RetCode(&Out0P->RetCode, Out0P->NDR.int_rep);\n    #endif /* __NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__RetCode__defined */\n    #if defined(__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined)\n            __NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__flavor(&Out0P->flavor, Out0P->NDR.int_rep);\n    #endif /* __NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined */\n    #if defined(__NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined)\n            __NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_state(&Out0P->new_state, Out0P->NDR.int_rep, Out0P->new_stateCnt);\n    #endif /* __NDR_convert__int_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined */\n        }\n    #endif\t/* defined(__NDR_convert__int_rep...) */\n\n    #if\t0 || \\\n        defined(__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined) || \\\n        defined(__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined) || \\\n        0\n        if (Out0P->NDR.char_rep != NDR_record.char_rep) {\n    #if defined(__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined)\n            __NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__flavor(&Out0P->flavor, Out0P->NDR.char_rep);\n    #endif /* __NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined */\n    #if defined(__NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined)\n            __NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__new_state(&Out0P->new_state, Out0P->NDR.char_rep, Out0P->new_stateCnt);\n    #endif /* __NDR_convert__char_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined */\n        }\n    #endif\t/* defined(__NDR_convert__char_rep...) */\n\n    #if\t0 || \\\n        defined(__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined) || \\\n        defined(__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined) || \\\n        0\n        if (Out0P->NDR.float_rep != NDR_record.float_rep) {\n    #if defined(__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined)\n            __NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__flavor(&Out0P->flavor, Out0P->NDR.float_rep);\n    #endif /* __NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__flavor__defined */\n    #if defined(__NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined)\n            __NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__new_state(&Out0P->new_state, Out0P->NDR.float_rep, Out0P->new_stateCnt);\n    #endif /* __NDR_convert__float_rep__Reply__mach_exception_raise_state_identity_t__new_state__defined */\n        }\n    #endif\t/* defined(__NDR_convert__float_rep...) */\n\n\treturn MACH_MSG_SUCCESS;\n}\n#endif /* !defined(__MIG_check__Reply__mach_exception_raise_state_identity_t__defined) */\n#endif /* __MIG_check__Reply__mach_exc_subsystem__ */\n#endif /* ( __MigTypeCheck || __NDR_convert__ ) */\n\n\n/* Routine mach_exception_raise_state_identity_OVR */\nmig_external kern_return_t mach_exception_raise_state_identity_OVR\n(\n\tmach_port_t exception_port,\n\tmach_port_t thread,\n\tmach_port_t task,\n\texception_type_t exception,\n\tmach_exception_data_t code,\n\tmach_msg_type_number_t codeCnt,\n\tint *flavor,\n\tthread_state_t old_state,\n\tmach_msg_type_number_t old_stateCnt,\n\tthread_state_t new_state,\n\tmach_msg_type_number_t *new_stateCnt\n)\n{\n\n    #ifdef  __MigPackStructs\n    #pragma pack(4)\n    #endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\t/* start of the kernel processed data */\n\t\tmach_msg_body_t msgh_body;\n\t\tmach_msg_port_descriptor_t thread;\n\t\tmach_msg_port_descriptor_t task;\n\t\t/* end of the kernel processed data */\n\t\tNDR_record_t NDR;\n\t\texception_type_t exception;\n\t\tmach_msg_type_number_t codeCnt;\n\t\tint64_t code[2];\n\t\tint flavor;\n\t\tmach_msg_type_number_t old_stateCnt;\n\t\tnatural_t old_state[144];\n\t} Request;\n    #ifdef  __MigPackStructs\n    #pragma pack()\n    #endif\n\n    #ifdef  __MigPackStructs\n    #pragma pack(4)\n    #endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\tNDR_record_t NDR;\n\t\tkern_return_t RetCode;\n\t\tint flavor;\n\t\tmach_msg_type_number_t new_stateCnt;\n\t\tnatural_t new_state[144];\n\t\tmach_msg_trailer_t trailer;\n\t} Reply;\n    #ifdef  __MigPackStructs\n    #pragma pack()\n    #endif\n\n    #ifdef  __MigPackStructs\n    #pragma pack(4)\n    #endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\tNDR_record_t NDR;\n\t\tkern_return_t RetCode;\n\t\tint flavor;\n\t\tmach_msg_type_number_t new_stateCnt;\n\t\tnatural_t new_state[144];\n\t} __Reply;\n    #ifdef  __MigPackStructs\n    #pragma pack()\n    #endif\n\t/*\n\t * typedef struct {\n\t * \tmach_msg_header_t Head;\n\t * \tNDR_record_t NDR;\n\t * \tkern_return_t RetCode;\n\t * } mig_reply_error_t;\n\t */\n\n\tunion {\n\t\tRequest In;\n\t\tReply Out;\n\t} Mess;\n\n\tRequest *InP = &Mess.In;\n\tReply *Out0P = &Mess.Out;\n\n\tmach_msg_return_t msg_result;\n\tunsigned int msgh_size;\n\tunsigned int msgh_size_delta;\n\n\n    #ifdef\t__MIG_check__Reply__mach_exception_raise_state_identity_t__defined\n        kern_return_t check_result;\n    #endif\t/* __MIG_check__Reply__mach_exception_raise_state_identity_t__defined */\n\n\t__DeclareSendRpc(2407, \"mach_exception_raise_state_identity_OVR\")\n\n    #if\tUseStaticTemplates\n        const static mach_msg_port_descriptor_t threadTemplate = {\n            /* name = */\t\tMACH_PORT_NULL,\n            /* pad1 = */\t\t0,\n            /* pad2 = */\t\t0,\n            /* disp = */\t\t19,\n            /* type = */\t\tMACH_MSG_PORT_DESCRIPTOR,\n        };\n    #endif\t/* UseStaticTemplates */\n\n    #if\tUseStaticTemplates\n        const static mach_msg_port_descriptor_t taskTemplate = {\n            /* name = */\t\tMACH_PORT_NULL,\n            /* pad1 = */\t\t0,\n            /* pad2 = */\t\t0,\n            /* disp = */\t\t19,\n            /* type = */\t\tMACH_MSG_PORT_DESCRIPTOR,\n        };\n    #endif\t/* UseStaticTemplates */\n\n\tInP->msgh_body.msgh_descriptor_count = 2;\n    #if\tUseStaticTemplates\n        InP->thread = threadTemplate;\n        InP->thread.name = thread;\n    #else\t/* UseStaticTemplates */\n        InP->thread.name = thread;\n        InP->thread.disposition = 19;\n        InP->thread.type = MACH_MSG_PORT_DESCRIPTOR;\n    #endif\t/* UseStaticTemplates */\n\n    #if\tUseStaticTemplates\n        InP->task = taskTemplate;\n        InP->task.name = task;\n    #else\t/* UseStaticTemplates */\n        InP->task.name = task;\n        InP->task.disposition = 19;\n        InP->task.type = MACH_MSG_PORT_DESCRIPTOR;\n    #endif\t/* UseStaticTemplates */\n\n\tInP->NDR = NDR_record;\n\n\tInP->exception = exception;\n\n\tif (codeCnt > 2) {\n\t\t{ return MIG_ARRAY_TOO_LARGE; }\n\t}\n\t(void)memcpy((char *) InP->code, (const char *) code, 8 * codeCnt);\n\n\tInP->codeCnt = codeCnt;\n\n\tmsgh_size_delta = (8 * codeCnt);\n\tmsgh_size = (mach_msg_size_t)(sizeof(Request) - 592) + msgh_size_delta;\n\tInP = (Request *) ((pointer_t) InP + msgh_size_delta - 16);\n\n\tInP->flavor = *flavor;\n\n\tif (old_stateCnt > 144) {\n\t\t{ return MIG_ARRAY_TOO_LARGE; }\n\t}\n\t(void)memcpy((char *) InP->old_state, (const char *) old_state, 4 * old_stateCnt);\n\n\tInP->old_stateCnt = old_stateCnt;\n\n\tmsgh_size += (4 * old_stateCnt);\n\tInP = &Mess.In;\n\tInP->Head.msgh_bits = MACH_MSGH_BITS_COMPLEX|\n\t\tMACH_MSGH_BITS(19, MACH_MSG_TYPE_MAKE_SEND_ONCE);\n\t/* msgh_size passed as argument */\n\tInP->Head.msgh_request_port = exception_port;\n\tInP->Head.msgh_reply_port = mig_get_reply_port();\n\tInP->Head.msgh_id = 2407;\n\n\t__BeforeSendRpc(2407, \"mach_exception_raise_state_identity_OVR\")\n\tmsg_result = mach_msg(&InP->Head, MACH_SEND_MSG|MACH_RCV_MSG|MACH_MSG_OPTION_NONE, msgh_size, (mach_msg_size_t)sizeof(Reply), InP->Head.msgh_reply_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);\n\t__AfterSendRpc(2407, \"mach_exception_raise_state_identity_OVR\")\n\tif (msg_result != MACH_MSG_SUCCESS) {\n\t\t__MachMsgErrorWithoutTimeout(msg_result);\n\t\t{ return msg_result; }\n\t}\n\n\n    #if\tdefined(__MIG_check__Reply__mach_exception_raise_state_identity_t__defined)\n        check_result = __MIG_check__Reply__mach_exception_raise_state_identity_t((__Reply__mach_exception_raise_state_identity_t *)Out0P);\n        if (check_result != MACH_MSG_SUCCESS)\n            { return check_result; }\n    #endif\t/* defined(__MIG_check__Reply__mach_exception_raise_state_identity_t__defined) */\n\n\t*flavor = Out0P->flavor;\n\n\tif (Out0P->new_stateCnt > 144) {\n\t\t(void)memcpy((char *) new_state, (const char *) Out0P->new_state, 4 *  144);\n\t\t*new_stateCnt = Out0P->new_stateCnt;\n\t\t{ return MIG_ARRAY_TOO_LARGE; }\n\t}\n\t(void)memcpy((char *) new_state, (const char *) Out0P->new_state, 4 * Out0P->new_stateCnt);\n\n\t*new_stateCnt = Out0P->new_stateCnt;\n\n\treturn KERN_SUCCESS;\n}\n\n#if defined(__cplusplus)\n    } /* extern \"C\" */\n#endif\n\n/* End mach_excUser.c */\n\n\n\n\n/* Begin mach_excServer.c */\n\n/* Module mach_exc */\n\n#define\t__MIG_check__Request__mach_exc_subsystem__ 1\n#define\t__NDR_convert__Request__mach_exc_subsystem__ 1\n\n#include <string.h>\n#include <mach/ndr.h>\n#include <mach/boolean.h>\n#include <mach/kern_return.h>\n#include <mach/notify.h>\n#include <mach/mach_types.h>\n#include <mach/message.h>\n#include <mach/mig_errors.h>\n#include <mach/port.h>\n\n#include <mach/std_types.h>\n#include <mach/mig.h>\n#include <mach/mig.h>\n#include <mach/mach_types.h>\n\n#if defined(__cplusplus)\n    extern \"C\" {\n#endif\n\n#ifndef\tmig_internal\n#define\tmig_internal\tstatic __inline__\n#endif\t/* mig_internal */\n\n#ifndef\tmig_external\n#define mig_external\n#endif\t/* mig_external */\n\n#if\t!defined(__MigTypeCheck) && defined(TypeCheck)\n#define\t__MigTypeCheck\t\tTypeCheck\t/* Legacy setting */\n#endif\t/* !defined(__MigTypeCheck) */\n\n#if\t!defined(__MigKernelSpecificCode) && defined(_MIG_KERNEL_SPECIFIC_CODE_)\n#define\t__MigKernelSpecificCode\t_MIG_KERNEL_SPECIFIC_CODE_\t/* Legacy setting */\n#endif\t/* !defined(__MigKernelSpecificCode) */\n\n#ifndef\tLimitCheck\n#define\tLimitCheck 0\n#endif\t/* LimitCheck */\n\n#ifndef\tmin\n#define\tmin(a,b)  ( ((a) < (b))? (a): (b) )\n#endif\t/* min */\n\n#if !defined(_WALIGN_)\n#define _WALIGN_(x) (((x) + 3) & ~3)\n#endif /* !defined(_WALIGN_) */\n\n#if !defined(_WALIGNSZ_)\n#define _WALIGNSZ_(x) _WALIGN_(sizeof(x))\n#endif /* !defined(_WALIGNSZ_) */\n\n#ifndef\tUseStaticTemplates\n#define\tUseStaticTemplates\t0\n#endif\t/* UseStaticTemplates */\n\n#ifndef\t__DeclareRcvRpc\n#define\t__DeclareRcvRpc(_NUM_, _NAME_)\n#endif\t/* __DeclareRcvRpc */\n\n#ifndef\t__BeforeRcvRpc\n#define\t__BeforeRcvRpc(_NUM_, _NAME_)\n#endif\t/* __BeforeRcvRpc */\n\n#ifndef\t__AfterRcvRpc\n#define\t__AfterRcvRpc(_NUM_, _NAME_)\n#endif\t/* __AfterRcvRpc */\n\n#ifndef\t__DeclareRcvSimple\n#define\t__DeclareRcvSimple(_NUM_, _NAME_)\n#endif\t/* __DeclareRcvSimple */\n\n#ifndef\t__BeforeRcvSimple\n#define\t__BeforeRcvSimple(_NUM_, _NAME_)\n#endif\t/* __BeforeRcvSimple */\n\n#ifndef\t__AfterRcvSimple\n#define\t__AfterRcvSimple(_NUM_, _NAME_)\n#endif\t/* __AfterRcvSimple */\n\n#define novalue void\n\n#ifndef msgh_request_port\n    #define msgh_request_port\tmsgh_local_port\n#endif\n#define MACH_MSGH_BITS_REQUEST(bits)\tMACH_MSGH_BITS_LOCAL(bits)\n#ifndef msgh_reply_port\n    #define msgh_reply_port\t\tmsgh_remote_port\n#endif\n#define MACH_MSGH_BITS_REPLY(bits)\tMACH_MSGH_BITS_REMOTE(bits)\n\n#define MIG_RETURN_ERROR(X, code)\t{\\\n\t\t\t\t((mig_reply_error_t *)X)->RetCode = code;\\\n\t\t\t\t((mig_reply_error_t *)X)->NDR = NDR_record;\\\n\t\t\t\treturn;\\\n\t\t\t\t}\n\n/* typedefs for all requests */\n\n#ifndef __Request__mach_exc_subsystem__defined\n#define __Request__mach_exc_subsystem__defined\n\n#ifdef  __MigPackStructs\n#pragma pack(4)\n#endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\t/* start of the kernel processed data */\n\t\tmach_msg_body_t msgh_body;\n\t\tmach_msg_port_descriptor_t thread;\n\t\tmach_msg_port_descriptor_t task;\n\t\t/* end of the kernel processed data */\n\t\tNDR_record_t NDR;\n\t\texception_type_t exception;\n\t\tmach_msg_type_number_t codeCnt;\n\t\tint64_t code[2];\n\t} __Request__mach_exception_raise_t;\n#ifdef  __MigPackStructs\n#pragma pack()\n#endif\n\n#ifdef  __MigPackStructs\n#pragma pack(4)\n#endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\tNDR_record_t NDR;\n\t\texception_type_t exception;\n\t\tmach_msg_type_number_t codeCnt;\n\t\tint64_t code[2];\n\t\tint flavor;\n\t\tmach_msg_type_number_t old_stateCnt;\n\t\tnatural_t old_state[144];\n\t} __Request__mach_exception_raise_state_t;\n#ifdef  __MigPackStructs\n#pragma pack()\n#endif\n\n#ifdef  __MigPackStructs\n#pragma pack(4)\n#endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\t/* start of the kernel processed data */\n\t\tmach_msg_body_t msgh_body;\n\t\tmach_msg_port_descriptor_t thread;\n\t\tmach_msg_port_descriptor_t task;\n\t\t/* end of the kernel processed data */\n\t\tNDR_record_t NDR;\n\t\texception_type_t exception;\n\t\tmach_msg_type_number_t codeCnt;\n\t\tint64_t code[2];\n\t\tint flavor;\n\t\tmach_msg_type_number_t old_stateCnt;\n\t\tnatural_t old_state[144];\n\t} __Request__mach_exception_raise_state_identity_t;\n#ifdef  __MigPackStructs\n#pragma pack()\n#endif\n#endif /* !__Request__mach_exc_subsystem__defined */\n\n/* typedefs for all replies */\n\n#ifndef __Reply__mach_exc_subsystem__defined\n#define __Reply__mach_exc_subsystem__defined\n\n#ifdef  __MigPackStructs\n#pragma pack(4)\n#endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\tNDR_record_t NDR;\n\t\tkern_return_t RetCode;\n\t} __Reply__mach_exception_raise_t;\n#ifdef  __MigPackStructs\n#pragma pack()\n#endif\n\n#ifdef  __MigPackStructs\n#pragma pack(4)\n#endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\tNDR_record_t NDR;\n\t\tkern_return_t RetCode;\n\t\tint flavor;\n\t\tmach_msg_type_number_t new_stateCnt;\n\t\tnatural_t new_state[144];\n\t} __Reply__mach_exception_raise_state_t;\n#ifdef  __MigPackStructs\n#pragma pack()\n#endif\n\n#ifdef  __MigPackStructs\n#pragma pack(4)\n#endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\tNDR_record_t NDR;\n\t\tkern_return_t RetCode;\n\t\tint flavor;\n\t\tmach_msg_type_number_t new_stateCnt;\n\t\tnatural_t new_state[144];\n\t} __Reply__mach_exception_raise_state_identity_t;\n#ifdef  __MigPackStructs\n#pragma pack()\n#endif\n#endif /* !__Reply__mach_exc_subsystem__defined */\n\n\n/* union of all replies */\n\n#ifndef __ReplyUnion__catch_mach_exc_subsystem__defined\n#define __ReplyUnion__catch_mach_exc_subsystem__defined\nunion __ReplyUnion__catch_mach_exc_subsystem {\n\t__Reply__mach_exception_raise_t Reply_mach_exception_raise;\n\t__Reply__mach_exception_raise_state_t Reply_mach_exception_raise_state;\n\t__Reply__mach_exception_raise_state_identity_t Reply_mach_exception_raise_state_identity;\n};\n#endif /* __RequestUnion__catch_mach_exc_subsystem__defined */\n/* Forward Declarations */\n\n\nmig_internal novalue _Xmach_exception_raise_OVR\n\t(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP);\n\nmig_internal novalue _Xmach_exception_raise_state_OVR\n\t(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP);\n\nmig_internal novalue _Xmach_exception_raise_state_identity_OVR\n\t(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP);\n\n\n#if ( __MigTypeCheck || __NDR_convert__ )\n#if __MIG_check__Request__mach_exc_subsystem__\n#if !defined(__MIG_check__Request__mach_exception_raise_t__defined)\n#define __MIG_check__Request__mach_exception_raise_t__defined\n#ifndef __NDR_convert__int_rep__Request__mach_exception_raise_t__exception__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__exception_type_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__exception__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__exception(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__exception_type_t((exception_type_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__exception_type_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__exception__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__exception(a, f) \\\n\t__NDR_convert__int_rep__exception_type_t((exception_type_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__int__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__exception__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__exception(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__int__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__exception__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__exception(a, f) \\\n\t__NDR_convert__int_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__exception__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__exception(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__int32_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__exception__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__exception(a, f) \\\n\t__NDR_convert__int_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_t__exception__defined */\n\n#ifndef __NDR_convert__int_rep__Request__mach_exception_raise_t__code__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__mach_exception_data_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__code__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__code(a, f, c) \\\n\t__NDR_convert__int_rep__mach_exc__mach_exception_data_t((mach_exception_data_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__int_rep__mach_exception_data_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__code__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__code(a, f, c) \\\n\t__NDR_convert__int_rep__mach_exception_data_t((mach_exception_data_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__int64_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__code__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__code(a, f, c) \\\n\t__NDR_convert__ARRAY((int64_t *)(a), f, c, __NDR_convert__int_rep__mach_exc__int64_t)\n#elif\tdefined(__NDR_convert__int_rep__int64_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__code__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__code(a, f, c) \\\n\t__NDR_convert__ARRAY((int64_t *)(a), f, c, __NDR_convert__int_rep__int64_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_t__code__defined */\n\n#ifndef __NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__mach_msg_type_number_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__mach_msg_type_number_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt(a, f) \\\n\t__NDR_convert__int_rep__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt__defined */\n\n#ifndef __NDR_convert__char_rep__Request__mach_exception_raise_t__exception__defined\n#if\tdefined(__NDR_convert__char_rep__mach_exc__exception_type_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__exception__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__exception(a, f) \\\n\t__NDR_convert__char_rep__mach_exc__exception_type_t((exception_type_t *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__exception_type_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__exception__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__exception(a, f) \\\n\t__NDR_convert__char_rep__exception_type_t((exception_type_t *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__int__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__exception__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__exception(a, f) \\\n\t__NDR_convert__char_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__int__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__exception__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__exception(a, f) \\\n\t__NDR_convert__char_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__exception__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__exception(a, f) \\\n\t__NDR_convert__char_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__int32_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__exception__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__exception(a, f) \\\n\t__NDR_convert__char_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__char_rep__Request__mach_exception_raise_t__exception__defined */\n\n#ifndef __NDR_convert__char_rep__Request__mach_exception_raise_t__code__defined\n#if\tdefined(__NDR_convert__char_rep__mach_exc__mach_exception_data_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__code__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__code(a, f, c) \\\n\t__NDR_convert__char_rep__mach_exc__mach_exception_data_t((mach_exception_data_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__char_rep__mach_exception_data_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__code__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__code(a, f, c) \\\n\t__NDR_convert__char_rep__mach_exception_data_t((mach_exception_data_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__int64_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__code__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__code(a, f, c) \\\n\t__NDR_convert__ARRAY((int64_t *)(a), f, c, __NDR_convert__char_rep__mach_exc__int64_t)\n#elif\tdefined(__NDR_convert__char_rep__int64_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__code__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_t__code(a, f, c) \\\n\t__NDR_convert__ARRAY((int64_t *)(a), f, c, __NDR_convert__char_rep__int64_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__char_rep__Request__mach_exception_raise_t__code__defined */\n\n#ifndef __NDR_convert__float_rep__Request__mach_exception_raise_t__exception__defined\n#if\tdefined(__NDR_convert__float_rep__mach_exc__exception_type_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__exception__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__exception(a, f) \\\n\t__NDR_convert__float_rep__mach_exc__exception_type_t((exception_type_t *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__exception_type_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__exception__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__exception(a, f) \\\n\t__NDR_convert__float_rep__exception_type_t((exception_type_t *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__int__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__exception__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__exception(a, f) \\\n\t__NDR_convert__float_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__int__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__exception__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__exception(a, f) \\\n\t__NDR_convert__float_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__exception__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__exception(a, f) \\\n\t__NDR_convert__float_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__int32_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__exception__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__exception(a, f) \\\n\t__NDR_convert__float_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__float_rep__Request__mach_exception_raise_t__exception__defined */\n\n#ifndef __NDR_convert__float_rep__Request__mach_exception_raise_t__code__defined\n#if\tdefined(__NDR_convert__float_rep__mach_exc__mach_exception_data_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__code__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__code(a, f, c) \\\n\t__NDR_convert__float_rep__mach_exc__mach_exception_data_t((mach_exception_data_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__float_rep__mach_exception_data_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__code__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__code(a, f, c) \\\n\t__NDR_convert__float_rep__mach_exception_data_t((mach_exception_data_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__int64_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__code__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__code(a, f, c) \\\n\t__NDR_convert__ARRAY((int64_t *)(a), f, c, __NDR_convert__float_rep__mach_exc__int64_t)\n#elif\tdefined(__NDR_convert__float_rep__int64_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__code__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_t__code(a, f, c) \\\n\t__NDR_convert__ARRAY((int64_t *)(a), f, c, __NDR_convert__float_rep__int64_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__float_rep__Request__mach_exception_raise_t__code__defined */\n\n\nmig_internal kern_return_t __MIG_check__Request__mach_exception_raise_t_OVR(__attribute__((__unused__)) __Request__mach_exception_raise_t *In0P)\n{\n    const size_t sizeofRequest = sizeof(__Request__mach_exception_raise_t);\n    \n\ttypedef __Request__mach_exception_raise_t __Request;\n    #if\t__MigTypeCheck\n        unsigned int msgh_size;\n    #endif\t/* __MigTypeCheck */\n\n    #if\t__MigTypeCheck\n        msgh_size = In0P->Head.msgh_size;\n        if (!(In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) ||\n            (In0P->msgh_body.msgh_descriptor_count != 2) ||\n            (msgh_size < (mach_msg_size_t)(sizeofRequest - 16)) ||  (msgh_size > (mach_msg_size_t)sizeofRequest))\n            return MIG_BAD_ARGUMENTS;\n    #endif\t/* __MigTypeCheck */\n\n    #if\t__MigTypeCheck\n        if (In0P->thread.type != MACH_MSG_PORT_DESCRIPTOR ||\n            In0P->thread.disposition != 17)\n            return MIG_TYPE_ERROR;\n    #endif\t/* __MigTypeCheck */\n\n    #if\t__MigTypeCheck\n        if (In0P->task.type != MACH_MSG_PORT_DESCRIPTOR ||\n            In0P->task.disposition != 17)\n            return MIG_TYPE_ERROR;\n    #endif\t/* __MigTypeCheck */\n\n    #if defined(__NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt__defined)\n        if (In0P->NDR.int_rep != NDR_record.int_rep)\n            __NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt(&In0P->codeCnt, In0P->NDR.int_rep);\n    #endif\t/* __NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt__defined */\n    #if\t__MigTypeCheck\n        if ( In0P->codeCnt > 2 )\n            return MIG_BAD_ARGUMENTS;\n        if (((msgh_size - (mach_msg_size_t)(sizeofRequest - 16)) / 8 != In0P->codeCnt) ||\n            (msgh_size != (mach_msg_size_t)(sizeofRequest - 16) + (8 * In0P->codeCnt)))\n            return MIG_BAD_ARGUMENTS;\n    #endif\t/* __MigTypeCheck */\n\n    #if\tdefined(__NDR_convert__int_rep__Request__mach_exception_raise_t__exception__defined) || \\\n        defined(__NDR_convert__int_rep__Request__mach_exception_raise_t__code__defined) || \\\n        defined(__NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt__defined)\n        if (In0P->NDR.int_rep != NDR_record.int_rep) {\n    #if defined(__NDR_convert__int_rep__Request__mach_exception_raise_t__exception__defined)\n            __NDR_convert__int_rep__Request__mach_exception_raise_t__exception(&In0P->exception, In0P->NDR.int_rep);\n    #endif\t/* __NDR_convert__int_rep__Request__mach_exception_raise_t__exception__defined */\n    #if defined(__NDR_convert__int_rep__Request__mach_exception_raise_t__code__defined)\n            __NDR_convert__int_rep__Request__mach_exception_raise_t__code(&In0P->code, In0P->NDR.int_rep, In0P->codeCnt);\n    #endif\t/* __NDR_convert__int_rep__Request__mach_exception_raise_t__code__defined */\n        }\n    #endif\t/* defined(__NDR_convert__int_rep...) */\n\n    #if\tdefined(__NDR_convert__char_rep__Request__mach_exception_raise_t__exception__defined) || \\\n        defined(__NDR_convert__char_rep__Request__mach_exception_raise_t__code__defined) || \\\n        0\n        if (In0P->NDR.char_rep != NDR_record.char_rep) {\n    #if defined(__NDR_convert__char_rep__Request__mach_exception_raise_t__exception__defined)\n            __NDR_convert__char_rep__Request__mach_exception_raise_t__exception(&In0P->exception, In0P->NDR.char_rep);\n    #endif\t/* __NDR_convert__char_rep__Request__mach_exception_raise_t__exception__defined */\n    #if defined(__NDR_convert__char_rep__Request__mach_exception_raise_t__code__defined)\n            __NDR_convert__char_rep__Request__mach_exception_raise_t__code(&In0P->code, In0P->NDR.char_rep, In0P->codeCnt);\n    #endif\t/* __NDR_convert__char_rep__Request__mach_exception_raise_t__code__defined */\n        }\n    #endif\t/* defined(__NDR_convert__char_rep...) */\n\n    #if\tdefined(__NDR_convert__float_rep__Request__mach_exception_raise_t__exception__defined) || \\\n        defined(__NDR_convert__float_rep__Request__mach_exception_raise_t__code__defined) || \\\n        0\n        if (In0P->NDR.float_rep != NDR_record.float_rep) {\n    #if defined(__NDR_convert__float_rep__Request__mach_exception_raise_t__exception__defined)\n            __NDR_convert__float_rep__Request__mach_exception_raise_t__exception(&In0P->exception, In0P->NDR.float_rep);\n    #endif\t/* __NDR_convert__float_rep__Request__mach_exception_raise_t__exception__defined */\n    #if defined(__NDR_convert__float_rep__Request__mach_exception_raise_t__code__defined)\n            __NDR_convert__float_rep__Request__mach_exception_raise_t__code(&In0P->code, In0P->NDR.float_rep, In0P->codeCnt);\n    #endif\t/* __NDR_convert__float_rep__Request__mach_exception_raise_t__code__defined */\n        }\n    #endif\t/* defined(__NDR_convert__float_rep...) */\n\n\treturn MACH_MSG_SUCCESS;\n}\n#endif /* !defined(__MIG_check__Request__mach_exception_raise_t__defined) */\n#endif /* __MIG_check__Request__mach_exc_subsystem__ */\n#endif /* ( __MigTypeCheck || __NDR_convert__ ) */\n\n\n/* Routine catch_mach_exception_raise_OVR */\n#ifdef\tmig_external\nmig_external\n#else\nextern\n#endif\t/* mig_external */\nkern_return_t catch_mach_exception_raise_OVR\n(\n\tmach_port_t exception_port,\n\tmach_port_t thread,\n\tmach_port_t task,\n\texception_type_t exception,\n\tmach_exception_data_t code,\n\tmach_msg_type_number_t codeCnt\n);\n\n/* Routine _Xmach_exception_raise_OVR */\nmig_internal novalue _Xmach_exception_raise_OVR\n\t(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)\n{\n\n    #ifdef  __MigPackStructs\n    #pragma pack(4)\n    #endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\t/* start of the kernel processed data */\n\t\tmach_msg_body_t msgh_body;\n\t\tmach_msg_port_descriptor_t thread;\n\t\tmach_msg_port_descriptor_t task;\n\t\t/* end of the kernel processed data */\n\t\tNDR_record_t NDR;\n\t\texception_type_t exception;\n\t\tmach_msg_type_number_t codeCnt;\n\t\tint64_t code[2];\n\t\tmach_msg_trailer_t trailer;\n\t} Request;\n    #ifdef  __MigPackStructs\n    #pragma pack()\n    #endif\n\ttypedef __Request__mach_exception_raise_t __Request;\n\ttypedef __Reply__mach_exception_raise_t Reply;\n\n\t/*\n\t * typedef struct {\n\t * \tmach_msg_header_t Head;\n\t * \tNDR_record_t NDR;\n\t * \tkern_return_t RetCode;\n\t * } mig_reply_error_t;\n\t */\n\n\tRequest *In0P = (Request *) InHeadP;\n\tReply *OutP = (Reply *) OutHeadP;\n    #ifdef\t__MIG_check__Request__mach_exception_raise_t__defined\n        kern_return_t check_result;\n    #endif\t/* __MIG_check__Request__mach_exception_raise_t__defined */\n\n\t__DeclareRcvRpc(2405, \"mach_exception_raise_OVR\")\n\t__BeforeRcvRpc(2405, \"mach_exception_raise_OVR\")\n\n    #if\tdefined(__MIG_check__Request__mach_exception_raise_t__defined)\n        check_result = __MIG_check__Request__mach_exception_raise_t_OVR((__Request *)In0P);\n        if (check_result != MACH_MSG_SUCCESS)\n            { MIG_RETURN_ERROR(OutP, check_result); }\n    #endif\t/* defined(__MIG_check__Request__mach_exception_raise_t__defined) */\n\n\tOutP->RetCode = catch_mach_exception_raise_OVR(In0P->Head.msgh_request_port, In0P->thread.name, In0P->task.name, In0P->exception, In0P->code, In0P->codeCnt);\n\n\tOutP->NDR = NDR_record;\n\n\n\t__AfterRcvRpc(2405, \"mach_exception_raise_OVR\")\n}\n\n#if ( __MigTypeCheck || __NDR_convert__ )\n#if __MIG_check__Request__mach_exc_subsystem__\n#if !defined(__MIG_check__Request__mach_exception_raise_state_t__defined)\n#define __MIG_check__Request__mach_exception_raise_state_t__defined\n#ifndef __NDR_convert__int_rep__Request__mach_exception_raise_state_t__exception__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__exception_type_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__exception__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__exception(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__exception_type_t((exception_type_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__exception_type_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__exception__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__exception(a, f) \\\n\t__NDR_convert__int_rep__exception_type_t((exception_type_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__int__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__exception__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__exception(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__int__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__exception__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__exception(a, f) \\\n\t__NDR_convert__int_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__exception__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__exception(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__int32_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__exception__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__exception(a, f) \\\n\t__NDR_convert__int_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_t__exception__defined */\n\n#ifndef __NDR_convert__int_rep__Request__mach_exception_raise_state_t__code__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__mach_exception_data_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__code__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__code(a, f, c) \\\n\t__NDR_convert__int_rep__mach_exc__mach_exception_data_t((mach_exception_data_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__int_rep__mach_exception_data_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__code__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__code(a, f, c) \\\n\t__NDR_convert__int_rep__mach_exception_data_t((mach_exception_data_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__int64_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__code__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__code(a, f, c) \\\n\t__NDR_convert__ARRAY((int64_t *)(a), f, c, __NDR_convert__int_rep__mach_exc__int64_t)\n#elif\tdefined(__NDR_convert__int_rep__int64_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__code__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__code(a, f, c) \\\n\t__NDR_convert__ARRAY((int64_t *)(a), f, c, __NDR_convert__int_rep__int64_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_t__code__defined */\n\n#ifndef __NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__mach_msg_type_number_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__mach_msg_type_number_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt(a, f) \\\n\t__NDR_convert__int_rep__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt__defined */\n\n#ifndef __NDR_convert__int_rep__Request__mach_exception_raise_state_t__flavor__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__int__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__int__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__int_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__int32_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__int_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_t__flavor__defined */\n\n#ifndef __NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_state__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__thread_state_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_state__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_state(a, f, c) \\\n\t__NDR_convert__int_rep__mach_exc__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__int_rep__thread_state_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_state__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_state(a, f, c) \\\n\t__NDR_convert__int_rep__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__natural_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_state__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__int_rep__mach_exc__natural_t)\n#elif\tdefined(__NDR_convert__int_rep__natural_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_state__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__int_rep__natural_t)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__uint32_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_state__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__int_rep__mach_exc__uint32_t)\n#elif\tdefined(__NDR_convert__int_rep__uint32_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_state__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__int_rep__uint32_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_state__defined */\n\n#ifndef __NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__mach_msg_type_number_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__mach_msg_type_number_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt(a, f) \\\n\t__NDR_convert__int_rep__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt__defined */\n\n#ifndef __NDR_convert__char_rep__Request__mach_exception_raise_state_t__exception__defined\n#if\tdefined(__NDR_convert__char_rep__mach_exc__exception_type_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__exception__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__exception(a, f) \\\n\t__NDR_convert__char_rep__mach_exc__exception_type_t((exception_type_t *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__exception_type_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__exception__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__exception(a, f) \\\n\t__NDR_convert__char_rep__exception_type_t((exception_type_t *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__int__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__exception__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__exception(a, f) \\\n\t__NDR_convert__char_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__int__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__exception__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__exception(a, f) \\\n\t__NDR_convert__char_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__exception__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__exception(a, f) \\\n\t__NDR_convert__char_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__int32_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__exception__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__exception(a, f) \\\n\t__NDR_convert__char_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__char_rep__Request__mach_exception_raise_state_t__exception__defined */\n\n#ifndef __NDR_convert__char_rep__Request__mach_exception_raise_state_t__code__defined\n#if\tdefined(__NDR_convert__char_rep__mach_exc__mach_exception_data_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__code__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__code(a, f, c) \\\n\t__NDR_convert__char_rep__mach_exc__mach_exception_data_t((mach_exception_data_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__char_rep__mach_exception_data_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__code__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__code(a, f, c) \\\n\t__NDR_convert__char_rep__mach_exception_data_t((mach_exception_data_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__int64_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__code__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__code(a, f, c) \\\n\t__NDR_convert__ARRAY((int64_t *)(a), f, c, __NDR_convert__char_rep__mach_exc__int64_t)\n#elif\tdefined(__NDR_convert__char_rep__int64_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__code__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__code(a, f, c) \\\n\t__NDR_convert__ARRAY((int64_t *)(a), f, c, __NDR_convert__char_rep__int64_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__char_rep__Request__mach_exception_raise_state_t__code__defined */\n\n#ifndef __NDR_convert__char_rep__Request__mach_exception_raise_state_t__flavor__defined\n#if\tdefined(__NDR_convert__char_rep__mach_exc__int__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__char_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__int__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__char_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__char_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__int32_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__char_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__char_rep__Request__mach_exception_raise_state_t__flavor__defined */\n\n#ifndef __NDR_convert__char_rep__Request__mach_exception_raise_state_t__old_state__defined\n#if\tdefined(__NDR_convert__char_rep__mach_exc__thread_state_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__old_state__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__old_state(a, f, c) \\\n\t__NDR_convert__char_rep__mach_exc__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__char_rep__thread_state_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__old_state__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__old_state(a, f, c) \\\n\t__NDR_convert__char_rep__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__natural_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__old_state__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__char_rep__mach_exc__natural_t)\n#elif\tdefined(__NDR_convert__char_rep__natural_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__old_state__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__char_rep__natural_t)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__uint32_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__old_state__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__char_rep__mach_exc__uint32_t)\n#elif\tdefined(__NDR_convert__char_rep__uint32_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__old_state__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__char_rep__uint32_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__char_rep__Request__mach_exception_raise_state_t__old_state__defined */\n\n#ifndef __NDR_convert__float_rep__Request__mach_exception_raise_state_t__exception__defined\n#if\tdefined(__NDR_convert__float_rep__mach_exc__exception_type_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__exception__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__exception(a, f) \\\n\t__NDR_convert__float_rep__mach_exc__exception_type_t((exception_type_t *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__exception_type_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__exception__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__exception(a, f) \\\n\t__NDR_convert__float_rep__exception_type_t((exception_type_t *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__int__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__exception__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__exception(a, f) \\\n\t__NDR_convert__float_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__int__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__exception__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__exception(a, f) \\\n\t__NDR_convert__float_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__exception__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__exception(a, f) \\\n\t__NDR_convert__float_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__int32_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__exception__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__exception(a, f) \\\n\t__NDR_convert__float_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__float_rep__Request__mach_exception_raise_state_t__exception__defined */\n\n#ifndef __NDR_convert__float_rep__Request__mach_exception_raise_state_t__code__defined\n#if\tdefined(__NDR_convert__float_rep__mach_exc__mach_exception_data_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__code__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__code(a, f, c) \\\n\t__NDR_convert__float_rep__mach_exc__mach_exception_data_t((mach_exception_data_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__float_rep__mach_exception_data_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__code__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__code(a, f, c) \\\n\t__NDR_convert__float_rep__mach_exception_data_t((mach_exception_data_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__int64_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__code__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__code(a, f, c) \\\n\t__NDR_convert__ARRAY((int64_t *)(a), f, c, __NDR_convert__float_rep__mach_exc__int64_t)\n#elif\tdefined(__NDR_convert__float_rep__int64_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__code__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__code(a, f, c) \\\n\t__NDR_convert__ARRAY((int64_t *)(a), f, c, __NDR_convert__float_rep__int64_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__float_rep__Request__mach_exception_raise_state_t__code__defined */\n\n#ifndef __NDR_convert__float_rep__Request__mach_exception_raise_state_t__flavor__defined\n#if\tdefined(__NDR_convert__float_rep__mach_exc__int__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__float_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__int__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__float_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__float_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__int32_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__flavor__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__flavor(a, f) \\\n\t__NDR_convert__float_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__float_rep__Request__mach_exception_raise_state_t__flavor__defined */\n\n#ifndef __NDR_convert__float_rep__Request__mach_exception_raise_state_t__old_state__defined\n#if\tdefined(__NDR_convert__float_rep__mach_exc__thread_state_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__old_state__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__old_state(a, f, c) \\\n\t__NDR_convert__float_rep__mach_exc__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__float_rep__thread_state_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__old_state__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__old_state(a, f, c) \\\n\t__NDR_convert__float_rep__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__natural_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__old_state__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__float_rep__mach_exc__natural_t)\n#elif\tdefined(__NDR_convert__float_rep__natural_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__old_state__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__float_rep__natural_t)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__uint32_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__old_state__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__float_rep__mach_exc__uint32_t)\n#elif\tdefined(__NDR_convert__float_rep__uint32_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__old_state__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__float_rep__uint32_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__float_rep__Request__mach_exception_raise_state_t__old_state__defined */\n\n\nmig_internal kern_return_t __MIG_check__Request__mach_exception_raise_state_t_OVR(__attribute__((__unused__)) __Request__mach_exception_raise_state_t *In0P, __attribute__((__unused__)) __Request__mach_exception_raise_state_t **In1PP)\n{\n\n\ttypedef __Request__mach_exception_raise_state_t __Request;\n\t__Request *In1P;\n    #if\t__MigTypeCheck\n        unsigned int msgh_size;\n    #endif\t/* __MigTypeCheck */\n\tunsigned int msgh_size_delta;\n\n    #if\t__MigTypeCheck\n        msgh_size = In0P->Head.msgh_size;\n        if ((In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) ||\n            (msgh_size < (mach_msg_size_t)(sizeof(__Request) - 592)) ||  (msgh_size > (mach_msg_size_t)sizeof(__Request)))\n            return MIG_BAD_ARGUMENTS;\n    #endif\t/* __MigTypeCheck */\n\n    #if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt__defined)\n        if (In0P->NDR.int_rep != NDR_record.int_rep)\n            __NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt(&In0P->codeCnt, In0P->NDR.int_rep);\n    #endif\t/* __NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt__defined */\n\tmsgh_size_delta = (8 * In0P->codeCnt);\n    #if\t__MigTypeCheck\n        if ( In0P->codeCnt > 2 )\n            return MIG_BAD_ARGUMENTS;\n        if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 592)) / 8 < In0P->codeCnt) ||\n            (msgh_size < (mach_msg_size_t)(sizeof(__Request) - 592) + (8 * In0P->codeCnt)))\n            return MIG_BAD_ARGUMENTS;\n        msgh_size -= msgh_size_delta;\n    #endif\t/* __MigTypeCheck */\n\n\t*In1PP = In1P = (__Request *) ((pointer_t) In0P + msgh_size_delta - 16);\n\n    #if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt__defined)\n        if (In0P->NDR.int_rep != NDR_record.int_rep)\n            __NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt(&In1P->old_stateCnt, In1P->NDR.int_rep);\n    #endif\t/* __NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt__defined */\n    #if\t__MigTypeCheck\n        if ( In1P->old_stateCnt > 144 )\n            return MIG_BAD_ARGUMENTS;\n        if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 592)) / 4 != In1P->old_stateCnt) ||\n            (msgh_size != (mach_msg_size_t)(sizeof(__Request) - 592) + (4 * In1P->old_stateCnt)))\n            return MIG_BAD_ARGUMENTS;\n    #endif\t/* __MigTypeCheck */\n\n    #if\tdefined(__NDR_convert__int_rep__Request__mach_exception_raise_state_t__exception__defined) || \\\n        defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_t__code__defined) || \\\n        defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt__defined) || \\\n        defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_t__flavor__defined) || \\\n        defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_state__defined) || \\\n        defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt__defined)\n        if (In0P->NDR.int_rep != NDR_record.int_rep) {\n    #if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_t__exception__defined)\n            __NDR_convert__int_rep__Request__mach_exception_raise_state_t__exception(&In0P->exception, In0P->NDR.int_rep);\n    #endif\t/* __NDR_convert__int_rep__Request__mach_exception_raise_state_t__exception__defined */\n    #if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_t__code__defined)\n            __NDR_convert__int_rep__Request__mach_exception_raise_state_t__code(&In0P->code, In0P->NDR.int_rep, In0P->codeCnt);\n    #endif\t/* __NDR_convert__int_rep__Request__mach_exception_raise_state_t__code__defined */\n    #if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_t__flavor__defined)\n            __NDR_convert__int_rep__Request__mach_exception_raise_state_t__flavor(&In1P->flavor, In0P->NDR.int_rep);\n    #endif\t/* __NDR_convert__int_rep__Request__mach_exception_raise_state_t__flavor__defined */\n    #if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_state__defined)\n            __NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_state(&In1P->old_state, In0P->NDR.int_rep, In1P->old_stateCnt);\n    #endif\t/* __NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_state__defined */\n        }\n    #endif\t/* defined(__NDR_convert__int_rep...) */\n\n    #if\tdefined(__NDR_convert__char_rep__Request__mach_exception_raise_state_t__exception__defined) || \\\n        defined(__NDR_convert__char_rep__Request__mach_exception_raise_state_t__code__defined) || \\\n        0 || \\\n        defined(__NDR_convert__char_rep__Request__mach_exception_raise_state_t__flavor__defined) || \\\n        defined(__NDR_convert__char_rep__Request__mach_exception_raise_state_t__old_state__defined) || \\\n        0\n        if (In0P->NDR.char_rep != NDR_record.char_rep) {\n    #if defined(__NDR_convert__char_rep__Request__mach_exception_raise_state_t__exception__defined)\n            __NDR_convert__char_rep__Request__mach_exception_raise_state_t__exception(&In0P->exception, In0P->NDR.char_rep);\n    #endif\t/* __NDR_convert__char_rep__Request__mach_exception_raise_state_t__exception__defined */\n    #if defined(__NDR_convert__char_rep__Request__mach_exception_raise_state_t__code__defined)\n            __NDR_convert__char_rep__Request__mach_exception_raise_state_t__code(&In0P->code, In0P->NDR.char_rep, In0P->codeCnt);\n    #endif\t/* __NDR_convert__char_rep__Request__mach_exception_raise_state_t__code__defined */\n    #if defined(__NDR_convert__char_rep__Request__mach_exception_raise_state_t__flavor__defined)\n            __NDR_convert__char_rep__Request__mach_exception_raise_state_t__flavor(&In1P->flavor, In0P->NDR.char_rep);\n    #endif\t/* __NDR_convert__char_rep__Request__mach_exception_raise_state_t__flavor__defined */\n    #if defined(__NDR_convert__char_rep__Request__mach_exception_raise_state_t__old_state__defined)\n            __NDR_convert__char_rep__Request__mach_exception_raise_state_t__old_state(&In1P->old_state, In0P->NDR.char_rep, In1P->old_stateCnt);\n    #endif\t/* __NDR_convert__char_rep__Request__mach_exception_raise_state_t__old_state__defined */\n        }\n    #endif\t/* defined(__NDR_convert__char_rep...) */\n\n    #if\tdefined(__NDR_convert__float_rep__Request__mach_exception_raise_state_t__exception__defined) || \\\n        defined(__NDR_convert__float_rep__Request__mach_exception_raise_state_t__code__defined) || \\\n        0 || \\\n        defined(__NDR_convert__float_rep__Request__mach_exception_raise_state_t__flavor__defined) || \\\n        defined(__NDR_convert__float_rep__Request__mach_exception_raise_state_t__old_state__defined) || \\\n        0\n        if (In0P->NDR.float_rep != NDR_record.float_rep) {\n    #if defined(__NDR_convert__float_rep__Request__mach_exception_raise_state_t__exception__defined)\n            __NDR_convert__float_rep__Request__mach_exception_raise_state_t__exception(&In0P->exception, In0P->NDR.float_rep);\n    #endif\t/* __NDR_convert__float_rep__Request__mach_exception_raise_state_t__exception__defined */\n    #if defined(__NDR_convert__float_rep__Request__mach_exception_raise_state_t__code__defined)\n            __NDR_convert__float_rep__Request__mach_exception_raise_state_t__code(&In0P->code, In0P->NDR.float_rep, In0P->codeCnt);\n    #endif\t/* __NDR_convert__float_rep__Request__mach_exception_raise_state_t__code__defined */\n    #if defined(__NDR_convert__float_rep__Request__mach_exception_raise_state_t__flavor__defined)\n            __NDR_convert__float_rep__Request__mach_exception_raise_state_t__flavor(&In1P->flavor, In0P->NDR.float_rep);\n    #endif\t/* __NDR_convert__float_rep__Request__mach_exception_raise_state_t__flavor__defined */\n    #if defined(__NDR_convert__float_rep__Request__mach_exception_raise_state_t__old_state__defined)\n            __NDR_convert__float_rep__Request__mach_exception_raise_state_t__old_state(&In1P->old_state, In0P->NDR.float_rep, In1P->old_stateCnt);\n    #endif\t/* __NDR_convert__float_rep__Request__mach_exception_raise_state_t__old_state__defined */\n        }\n    #endif\t/* defined(__NDR_convert__float_rep...) */\n\n\treturn MACH_MSG_SUCCESS;\n}\n#endif /* !defined(__MIG_check__Request__mach_exception_raise_state_t__defined) */\n#endif /* __MIG_check__Request__mach_exc_subsystem__ */\n#endif /* ( __MigTypeCheck || __NDR_convert__ ) */\n\n\n/* Routine mach_exception_raise_state_OVR */\n#ifdef\tmig_external\nmig_external\n#else\nextern\n#endif\t/* mig_external */\nkern_return_t catch_mach_exception_raise_state_OVR\n(\n\tmach_port_t exception_port,\n\texception_type_t exception,\n\tconst mach_exception_data_t code,\n\tmach_msg_type_number_t codeCnt,\n\tint *flavor,\n\tconst thread_state_t old_state,\n\tmach_msg_type_number_t old_stateCnt,\n\tthread_state_t new_state,\n\tmach_msg_type_number_t *new_stateCnt\n);\n\n/* Routine _Xmach_exception_raise_state_OVR */\nmig_internal novalue _Xmach_exception_raise_state_OVR\n\t(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)\n{\n\n    #ifdef  __MigPackStructs\n    #pragma pack(4)\n    #endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\tNDR_record_t NDR;\n\t\texception_type_t exception;\n\t\tmach_msg_type_number_t codeCnt;\n\t\tint64_t code[2];\n\t\tint flavor;\n\t\tmach_msg_type_number_t old_stateCnt;\n\t\tnatural_t old_state[144];\n\t\tmach_msg_trailer_t trailer;\n\t} Request;\n    #ifdef  __MigPackStructs\n    #pragma pack()\n    #endif\n\ttypedef __Request__mach_exception_raise_state_t __Request;\n\ttypedef __Reply__mach_exception_raise_state_t Reply;\n\n\t/*\n\t * typedef struct {\n\t * \tmach_msg_header_t Head;\n\t * \tNDR_record_t NDR;\n\t * \tkern_return_t RetCode;\n\t * } mig_reply_error_t;\n\t */\n\n\tRequest *In0P = (Request *) InHeadP;\n\tRequest *In1P;\n\tReply *OutP = (Reply *) OutHeadP;\n    #ifdef\t__MIG_check__Request__mach_exception_raise_state_t__defined\n        kern_return_t check_result;\n    #endif\t/* __MIG_check__Request__mach_exception_raise_state_t__defined */\n\n\t__DeclareRcvRpc(2406, \"mach_exception_raise_state_OVR\")\n\t__BeforeRcvRpc(2406, \"mach_exception_raise_state_OVR\")\n\n    #if\tdefined(__MIG_check__Request__mach_exception_raise_state_t__defined)\n        check_result = __MIG_check__Request__mach_exception_raise_state_t_OVR((__Request *)In0P, (__Request **)&In1P);\n        if (check_result != MACH_MSG_SUCCESS)\n            { MIG_RETURN_ERROR(OutP, check_result); }\n    #endif\t/* defined(__MIG_check__Request__mach_exception_raise_state_t__defined) */\n\n\tOutP->new_stateCnt = 144;\n\n\tOutP->RetCode = catch_mach_exception_raise_state_OVR(In0P->Head.msgh_request_port, In0P->exception, In0P->code, In0P->codeCnt, &In1P->flavor, In1P->old_state, In1P->old_stateCnt, OutP->new_state, &OutP->new_stateCnt);\n\tif (OutP->RetCode != KERN_SUCCESS) {\n\t\tMIG_RETURN_ERROR(OutP, OutP->RetCode);\n\t}\n\n\tOutP->NDR = NDR_record;\n\n\n\tOutP->flavor = In1P->flavor;\n\tOutP->Head.msgh_size = (mach_msg_size_t)(sizeof(Reply) - 576) + (((4 * OutP->new_stateCnt)));\n\n\t__AfterRcvRpc(2406, \"mach_exception_raise_state_OVR\")\n}\n\n#if ( __MigTypeCheck || __NDR_convert__ )\n#if __MIG_check__Request__mach_exc_subsystem__\n#if !defined(__MIG_check__Request__mach_exception_raise_state_identity_t__defined)\n#define __MIG_check__Request__mach_exception_raise_state_identity_t__defined\n#ifndef __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__exception_type_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__exception(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__exception_type_t((exception_type_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__exception_type_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__exception(a, f) \\\n\t__NDR_convert__int_rep__exception_type_t((exception_type_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__int__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__exception(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__int__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__exception(a, f) \\\n\t__NDR_convert__int_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__exception(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__int32_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__exception(a, f) \\\n\t__NDR_convert__int_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__exception__defined */\n\n#ifndef __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__code__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__mach_exception_data_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__code__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__code(a, f, c) \\\n\t__NDR_convert__int_rep__mach_exc__mach_exception_data_t((mach_exception_data_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__int_rep__mach_exception_data_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__code__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__code(a, f, c) \\\n\t__NDR_convert__int_rep__mach_exception_data_t((mach_exception_data_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__int64_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__code__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__code(a, f, c) \\\n\t__NDR_convert__ARRAY((int64_t *)(a), f, c, __NDR_convert__int_rep__mach_exc__int64_t)\n#elif\tdefined(__NDR_convert__int_rep__int64_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__code__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__code(a, f, c) \\\n\t__NDR_convert__ARRAY((int64_t *)(a), f, c, __NDR_convert__int_rep__int64_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__code__defined */\n\n#ifndef __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__mach_msg_type_number_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__mach_msg_type_number_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt(a, f) \\\n\t__NDR_convert__int_rep__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt__defined */\n\n#ifndef __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__flavor__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__int__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__int__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__int_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__int32_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__int_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__flavor__defined */\n\n#ifndef __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__thread_state_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_state(a, f, c) \\\n\t__NDR_convert__int_rep__mach_exc__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__int_rep__thread_state_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_state(a, f, c) \\\n\t__NDR_convert__int_rep__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__natural_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__int_rep__mach_exc__natural_t)\n#elif\tdefined(__NDR_convert__int_rep__natural_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__int_rep__natural_t)\n#elif\tdefined(__NDR_convert__int_rep__mach_exc__uint32_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__int_rep__mach_exc__uint32_t)\n#elif\tdefined(__NDR_convert__int_rep__uint32_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__int_rep__uint32_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_state__defined */\n\n#ifndef __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt__defined\n#if\tdefined(__NDR_convert__int_rep__mach_exc__mach_msg_type_number_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt(a, f) \\\n\t__NDR_convert__int_rep__mach_exc__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f)\n#elif\tdefined(__NDR_convert__int_rep__mach_msg_type_number_t__defined)\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt__defined\n#define\t__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt(a, f) \\\n\t__NDR_convert__int_rep__mach_msg_type_number_t((mach_msg_type_number_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt__defined */\n\n#ifndef __NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#if\tdefined(__NDR_convert__char_rep__mach_exc__exception_type_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__exception(a, f) \\\n\t__NDR_convert__char_rep__mach_exc__exception_type_t((exception_type_t *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__exception_type_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__exception(a, f) \\\n\t__NDR_convert__char_rep__exception_type_t((exception_type_t *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__int__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__exception(a, f) \\\n\t__NDR_convert__char_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__int__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__exception(a, f) \\\n\t__NDR_convert__char_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__exception(a, f) \\\n\t__NDR_convert__char_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__int32_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__exception(a, f) \\\n\t__NDR_convert__char_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__exception__defined */\n\n#ifndef __NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__code__defined\n#if\tdefined(__NDR_convert__char_rep__mach_exc__mach_exception_data_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__code__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__code(a, f, c) \\\n\t__NDR_convert__char_rep__mach_exc__mach_exception_data_t((mach_exception_data_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__char_rep__mach_exception_data_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__code__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__code(a, f, c) \\\n\t__NDR_convert__char_rep__mach_exception_data_t((mach_exception_data_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__int64_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__code__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__code(a, f, c) \\\n\t__NDR_convert__ARRAY((int64_t *)(a), f, c, __NDR_convert__char_rep__mach_exc__int64_t)\n#elif\tdefined(__NDR_convert__char_rep__int64_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__code__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__code(a, f, c) \\\n\t__NDR_convert__ARRAY((int64_t *)(a), f, c, __NDR_convert__char_rep__int64_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__code__defined */\n\n#ifndef __NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__flavor__defined\n#if\tdefined(__NDR_convert__char_rep__mach_exc__int__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__char_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__int__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__char_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__char_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__char_rep__int32_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__char_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__flavor__defined */\n\n#ifndef __NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#if\tdefined(__NDR_convert__char_rep__mach_exc__thread_state_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__old_state(a, f, c) \\\n\t__NDR_convert__char_rep__mach_exc__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__char_rep__thread_state_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__old_state(a, f, c) \\\n\t__NDR_convert__char_rep__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__natural_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__char_rep__mach_exc__natural_t)\n#elif\tdefined(__NDR_convert__char_rep__natural_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__char_rep__natural_t)\n#elif\tdefined(__NDR_convert__char_rep__mach_exc__uint32_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__char_rep__mach_exc__uint32_t)\n#elif\tdefined(__NDR_convert__char_rep__uint32_t__defined)\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#define\t__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__char_rep__uint32_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__old_state__defined */\n\n#ifndef __NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#if\tdefined(__NDR_convert__float_rep__mach_exc__exception_type_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__exception(a, f) \\\n\t__NDR_convert__float_rep__mach_exc__exception_type_t((exception_type_t *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__exception_type_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__exception(a, f) \\\n\t__NDR_convert__float_rep__exception_type_t((exception_type_t *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__int__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__exception(a, f) \\\n\t__NDR_convert__float_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__int__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__exception(a, f) \\\n\t__NDR_convert__float_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__exception(a, f) \\\n\t__NDR_convert__float_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__int32_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__exception__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__exception(a, f) \\\n\t__NDR_convert__float_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__exception__defined */\n\n#ifndef __NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__code__defined\n#if\tdefined(__NDR_convert__float_rep__mach_exc__mach_exception_data_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__code__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__code(a, f, c) \\\n\t__NDR_convert__float_rep__mach_exc__mach_exception_data_t((mach_exception_data_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__float_rep__mach_exception_data_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__code__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__code(a, f, c) \\\n\t__NDR_convert__float_rep__mach_exception_data_t((mach_exception_data_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__int64_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__code__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__code(a, f, c) \\\n\t__NDR_convert__ARRAY((int64_t *)(a), f, c, __NDR_convert__float_rep__mach_exc__int64_t)\n#elif\tdefined(__NDR_convert__float_rep__int64_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__code__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__code(a, f, c) \\\n\t__NDR_convert__ARRAY((int64_t *)(a), f, c, __NDR_convert__float_rep__int64_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__code__defined */\n\n#ifndef __NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__flavor__defined\n#if\tdefined(__NDR_convert__float_rep__mach_exc__int__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__float_rep__mach_exc__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__int__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__float_rep__int((int *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__int32_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__float_rep__mach_exc__int32_t((int32_t *)(a), f)\n#elif\tdefined(__NDR_convert__float_rep__int32_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__flavor__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__flavor(a, f) \\\n\t__NDR_convert__float_rep__int32_t((int32_t *)(a), f)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__flavor__defined */\n\n#ifndef __NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#if\tdefined(__NDR_convert__float_rep__mach_exc__thread_state_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__old_state(a, f, c) \\\n\t__NDR_convert__float_rep__mach_exc__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__float_rep__thread_state_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__old_state(a, f, c) \\\n\t__NDR_convert__float_rep__thread_state_t((thread_state_t *)(a), f, c)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__natural_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__float_rep__mach_exc__natural_t)\n#elif\tdefined(__NDR_convert__float_rep__natural_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((natural_t *)(a), f, c, __NDR_convert__float_rep__natural_t)\n#elif\tdefined(__NDR_convert__float_rep__mach_exc__uint32_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__float_rep__mach_exc__uint32_t)\n#elif\tdefined(__NDR_convert__float_rep__uint32_t__defined)\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__old_state__defined\n#define\t__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__old_state(a, f, c) \\\n\t__NDR_convert__ARRAY((uint32_t *)(a), f, c, __NDR_convert__float_rep__uint32_t)\n#endif /* defined(__NDR_convert__*__defined) */\n#endif /* __NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__old_state__defined */\n\n\nmig_internal kern_return_t __MIG_check__Request__mach_exception_raise_state_identity_t_OVR(__attribute__((__unused__)) __Request__mach_exception_raise_state_identity_t *In0P, __attribute__((__unused__)) __Request__mach_exception_raise_state_identity_t **In1PP)\n{\n    const size_t sizeofRequest = sizeof(__Request__mach_exception_raise_state_identity_t);\n    \n\ttypedef __Request__mach_exception_raise_state_identity_t __Request;\n\t__Request *In1P;\n    #if\t__MigTypeCheck\n        unsigned int msgh_size;\n    #endif\t/* __MigTypeCheck */\n\tunsigned int msgh_size_delta;\n\n    #if\t__MigTypeCheck\n        msgh_size = In0P->Head.msgh_size;\n        if (!(In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) ||\n            (In0P->msgh_body.msgh_descriptor_count != 2) ||\n            (msgh_size < (mach_msg_size_t)(sizeofRequest - 592)) ||  (msgh_size > (mach_msg_size_t)sizeofRequest))\n            return MIG_BAD_ARGUMENTS;\n    #endif\t/* __MigTypeCheck */\n\n    #if\t__MigTypeCheck\n        if (In0P->thread.type != MACH_MSG_PORT_DESCRIPTOR ||\n            In0P->thread.disposition != 17)\n            return MIG_TYPE_ERROR;\n    #endif\t/* __MigTypeCheck */\n\n    #if\t__MigTypeCheck\n        if (In0P->task.type != MACH_MSG_PORT_DESCRIPTOR ||\n            In0P->task.disposition != 17)\n            return MIG_TYPE_ERROR;\n    #endif\t/* __MigTypeCheck */\n\n    #if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt__defined)\n        if (In0P->NDR.int_rep != NDR_record.int_rep)\n            __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt(&In0P->codeCnt, In0P->NDR.int_rep);\n    #endif\t/* __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt__defined */\n\tmsgh_size_delta = (8 * In0P->codeCnt);\n    #if\t__MigTypeCheck\n        if ( In0P->codeCnt > 2 )\n            return MIG_BAD_ARGUMENTS;\n        if (((msgh_size - (mach_msg_size_t)(sizeofRequest - 592)) / 8 < In0P->codeCnt) ||\n            (msgh_size < (mach_msg_size_t)(sizeofRequest - 592) + (8 * In0P->codeCnt)))\n            return MIG_BAD_ARGUMENTS;\n        msgh_size -= msgh_size_delta;\n    #endif\t/* __MigTypeCheck */\n\n\t*In1PP = In1P = (__Request *) ((pointer_t) In0P + msgh_size_delta - 16);\n\n    #if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt__defined)\n        if (In0P->NDR.int_rep != NDR_record.int_rep)\n            __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt(&In1P->old_stateCnt, In1P->NDR.int_rep);\n    #endif\t/* __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt__defined */\n    #if\t__MigTypeCheck\n        if ( In1P->old_stateCnt > 144 )\n            return MIG_BAD_ARGUMENTS;\n        if (((msgh_size - (mach_msg_size_t)(sizeofRequest - 592)) / 4 != In1P->old_stateCnt) ||\n            (msgh_size != (mach_msg_size_t)(sizeofRequest - 592) + (4 * In1P->old_stateCnt)))\n            return MIG_BAD_ARGUMENTS;\n    #endif\t/* __MigTypeCheck */\n\n    #if\tdefined(__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__exception__defined) || \\\n        defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__code__defined) || \\\n        defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt__defined) || \\\n        defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__flavor__defined) || \\\n        defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_state__defined) || \\\n        defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt__defined)\n        if (In0P->NDR.int_rep != NDR_record.int_rep) {\n    #if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__exception__defined)\n            __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__exception(&In0P->exception, In0P->NDR.int_rep);\n    #endif\t/* __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__exception__defined */\n    #if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__code__defined)\n            __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__code(&In0P->code, In0P->NDR.int_rep, In0P->codeCnt);\n    #endif\t/* __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__code__defined */\n    #if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__flavor__defined)\n            __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__flavor(&In1P->flavor, In0P->NDR.int_rep);\n    #endif\t/* __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__flavor__defined */\n    #if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_state__defined)\n            __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_state(&In1P->old_state, In0P->NDR.int_rep, In1P->old_stateCnt);\n    #endif\t/* __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_state__defined */\n        }\n    #endif\t/* defined(__NDR_convert__int_rep...) */\n\n    #if\tdefined(__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__exception__defined) || \\\n        defined(__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__code__defined) || \\\n        0 || \\\n        defined(__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__flavor__defined) || \\\n        defined(__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__old_state__defined) || \\\n        0\n        if (In0P->NDR.char_rep != NDR_record.char_rep) {\n    #if defined(__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__exception__defined)\n            __NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__exception(&In0P->exception, In0P->NDR.char_rep);\n    #endif\t/* __NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__exception__defined */\n    #if defined(__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__code__defined)\n            __NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__code(&In0P->code, In0P->NDR.char_rep, In0P->codeCnt);\n    #endif\t/* __NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__code__defined */\n    #if defined(__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__flavor__defined)\n            __NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__flavor(&In1P->flavor, In0P->NDR.char_rep);\n    #endif\t/* __NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__flavor__defined */\n    #if defined(__NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__old_state__defined)\n            __NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__old_state(&In1P->old_state, In0P->NDR.char_rep, In1P->old_stateCnt);\n    #endif\t/* __NDR_convert__char_rep__Request__mach_exception_raise_state_identity_t__old_state__defined */\n        }\n    #endif\t/* defined(__NDR_convert__char_rep...) */\n\n    #if\tdefined(__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__exception__defined) || \\\n        defined(__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__code__defined) || \\\n        0 || \\\n        defined(__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__flavor__defined) || \\\n        defined(__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__old_state__defined) || \\\n        0\n        if (In0P->NDR.float_rep != NDR_record.float_rep) {\n    #if defined(__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__exception__defined)\n            __NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__exception(&In0P->exception, In0P->NDR.float_rep);\n    #endif\t/* __NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__exception__defined */\n    #if defined(__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__code__defined)\n            __NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__code(&In0P->code, In0P->NDR.float_rep, In0P->codeCnt);\n    #endif\t/* __NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__code__defined */\n    #if defined(__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__flavor__defined)\n            __NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__flavor(&In1P->flavor, In0P->NDR.float_rep);\n    #endif\t/* __NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__flavor__defined */\n    #if defined(__NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__old_state__defined)\n            __NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__old_state(&In1P->old_state, In0P->NDR.float_rep, In1P->old_stateCnt);\n    #endif\t/* __NDR_convert__float_rep__Request__mach_exception_raise_state_identity_t__old_state__defined */\n        }\n    #endif\t/* defined(__NDR_convert__float_rep...) */\n\n\treturn MACH_MSG_SUCCESS;\n}\n#endif /* !defined(__MIG_check__Request__mach_exception_raise_state_identity_t__defined) */\n#endif /* __MIG_check__Request__mach_exc_subsystem__ */\n#endif /* ( __MigTypeCheck || __NDR_convert__ ) */\n\n\n/* Routine catch_mach_exception_raise_state_identity_OVR */\n#ifdef\tmig_external\nmig_external\n#else\nextern\n#endif\t/* mig_external */\nkern_return_t catch_mach_exception_raise_state_identity_OVR\n(\n\tmach_port_t exception_port,\n\tmach_port_t thread,\n\tmach_port_t task,\n\texception_type_t exception,\n\tmach_exception_data_t code,\n\tmach_msg_type_number_t codeCnt,\n\tint *flavor,\n\tthread_state_t old_state,\n\tmach_msg_type_number_t old_stateCnt,\n\tthread_state_t new_state,\n\tmach_msg_type_number_t *new_stateCnt\n);\n\n/* Routine mach_exception_raise_state_identity_OVR */\nmig_internal novalue _Xmach_exception_raise_state_identity_OVR\n\t(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)\n{\n\n    #ifdef  __MigPackStructs\n    #pragma pack(4)\n    #endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\t/* start of the kernel processed data */\n\t\tmach_msg_body_t msgh_body;\n\t\tmach_msg_port_descriptor_t thread;\n\t\tmach_msg_port_descriptor_t task;\n\t\t/* end of the kernel processed data */\n\t\tNDR_record_t NDR;\n\t\texception_type_t exception;\n\t\tmach_msg_type_number_t codeCnt;\n\t\tint64_t code[2];\n\t\tint flavor;\n\t\tmach_msg_type_number_t old_stateCnt;\n\t\tnatural_t old_state[144];\n\t\tmach_msg_trailer_t trailer;\n\t} Request;\n    #ifdef  __MigPackStructs\n    #pragma pack()\n    #endif\n\ttypedef __Request__mach_exception_raise_state_identity_t __Request;\n\ttypedef __Reply__mach_exception_raise_state_identity_t Reply;\n\n\t/*\n\t * typedef struct {\n\t * \tmach_msg_header_t Head;\n\t * \tNDR_record_t NDR;\n\t * \tkern_return_t RetCode;\n\t * } mig_reply_error_t;\n\t */\n\n\tRequest *In0P = (Request *) InHeadP;\n\tRequest *In1P;\n\tReply *OutP = (Reply *) OutHeadP;\n    #ifdef\t__MIG_check__Request__mach_exception_raise_state_identity_t__defined\n        kern_return_t check_result;\n    #endif\t/* __MIG_check__Request__mach_exception_raise_state_identity_t__defined */\n\n\t__DeclareRcvRpc(2407, \"mach_exception_raise_state_identity_OVR\")\n\t__BeforeRcvRpc(2407, \"mach_exception_raise_state_identity_OVR\")\n\n    #if\tdefined(__MIG_check__Request__mach_exception_raise_state_identity_t__defined)\n        check_result = __MIG_check__Request__mach_exception_raise_state_identity_t_OVR((__Request *)In0P, (__Request **)&In1P);\n        if (check_result != MACH_MSG_SUCCESS)\n            { MIG_RETURN_ERROR(OutP, check_result); }\n    #endif\t/* defined(__MIG_check__Request__mach_exception_raise_state_identity_t__defined) */\n\n\tOutP->new_stateCnt = 144;\n\n\tOutP->RetCode = catch_mach_exception_raise_state_identity_OVR(In0P->Head.msgh_request_port, In0P->thread.name, In0P->task.name, In0P->exception, In0P->code, In0P->codeCnt, &In1P->flavor, In1P->old_state, In1P->old_stateCnt, OutP->new_state, &OutP->new_stateCnt);\n\tif (OutP->RetCode != KERN_SUCCESS) {\n\t\tMIG_RETURN_ERROR(OutP, OutP->RetCode);\n\t}\n\n\tOutP->NDR = NDR_record;\n\n\n\tOutP->flavor = In1P->flavor;\n\tOutP->Head.msgh_size = (mach_msg_size_t)(sizeof(Reply) - 576) + (((4 * OutP->new_stateCnt)));\n\n\t__AfterRcvRpc(2407, \"mach_exception_raise_state_identity_OVR\")\n}\n\n\n#ifdef\tmig_external\n    mig_external\n#else\n    extern\n#endif\t/* mig_external */\n    boolean_t mach_exc_server_OVR(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP);\n\n#ifdef\tmig_external\n    mig_external\n#else\n    extern\n#endif\t/* mig_external */\n    mig_routine_t mach_exc_server_routine_OVR(mach_msg_header_t *InHeadP);\n\n\n/* Description of this subsystem, for use in direct RPC */\nconst struct catch_mach_exc_subsystem_OVR {\n\tmig_server_routine_t \tserver;\t/* Server routine */\n\tmach_msg_id_t\tstart;\t/* Min routine number */\n\tmach_msg_id_t\tend;\t/* Max routine number + 1 */\n\tunsigned int\tmaxsize;\t/* Max msg size */\n\tvm_address_t\treserved;\t/* Reserved */\n\tstruct routine_descriptor\t/*Array of routine descriptors */\n\t\troutine[3];\n} catch_mach_exc_subsystem_OVR = {\n\tmach_exc_server_routine_OVR,\n\t2405,\n\t2408,\n\t(mach_msg_size_t)sizeof(union __ReplyUnion__catch_mach_exc_subsystem),\n\t(vm_address_t)0,\n\t{\n          { (mig_impl_routine_t) 0,\n          (mig_stub_routine_t) _Xmach_exception_raise_OVR, 6, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__mach_exception_raise_t)},\n          { (mig_impl_routine_t) 0,\n          (mig_stub_routine_t) _Xmach_exception_raise_state_OVR, 9, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__mach_exception_raise_state_t)},\n          { (mig_impl_routine_t) 0,\n          (mig_stub_routine_t) _Xmach_exception_raise_state_identity_OVR, 11, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__mach_exception_raise_state_identity_t)},\n\t}\n};\n\nmig_external boolean_t mach_exc_server_OVR\n\t(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)\n{\n\t/*\n\t * typedef struct {\n\t * \tmach_msg_header_t Head;\n\t * \tNDR_record_t NDR;\n\t * \tkern_return_t RetCode;\n\t * } mig_reply_error_t;\n\t */\n\n\tregister mig_routine_t routine;\n\n\tOutHeadP->msgh_bits = MACH_MSGH_BITS(MACH_MSGH_BITS_REPLY(InHeadP->msgh_bits), 0);\n\tOutHeadP->msgh_remote_port = InHeadP->msgh_reply_port;\n\t/* Minimal size: routine() will update it if different */\n\tOutHeadP->msgh_size = (mach_msg_size_t)sizeof(mig_reply_error_t);\n\tOutHeadP->msgh_local_port = MACH_PORT_NULL;\n\tOutHeadP->msgh_id = InHeadP->msgh_id + 100;\n\n\tif ((InHeadP->msgh_id > 2407) || (InHeadP->msgh_id < 2405) ||\n\t    ((routine = catch_mach_exc_subsystem_OVR.routine[InHeadP->msgh_id - 2405].stub_routine) == 0))\n    {\n\t\t((mig_reply_error_t *)OutHeadP)->NDR = NDR_record;\n\t\t((mig_reply_error_t *)OutHeadP)->RetCode = MIG_BAD_ID;\n\t\treturn FALSE;\n\t}\n\t(*routine) (InHeadP, OutHeadP);\n\treturn TRUE;\n}\n\nmig_external mig_routine_t mach_exc_server_routine_OVR\n\t(mach_msg_header_t *InHeadP)\n{\n\tregister int msgh_id;\n\n\tmsgh_id = InHeadP->msgh_id - 2405;\n\n\tif ((msgh_id > 2) || (msgh_id < 0))\n\t\treturn 0;\n\n\treturn catch_mach_exc_subsystem_OVR.routine[msgh_id].stub_routine;\n}\n\n#if defined(__cplusplus)\n    } /* extern \"C\" */\n#endif\n/* End mach_excServer.c */\n\n\n\n"
  },
  {
    "path": "externals/ovr/Src/Kernel/OVR_mach_exc_OSX.h",
    "content": "#ifndef\t_mach_exc_user_\n#define\t_mach_exc_user_\n\n/* Module mach_exc */\n\n#include <string.h>\n#include <mach/ndr.h>\n#include <mach/boolean.h>\n#include <mach/kern_return.h>\n#include <mach/notify.h>\n#include <mach/mach_types.h>\n#include <mach/message.h>\n#include <mach/mig_errors.h>\n#include <mach/port.h>\n\n#ifdef AUTOTEST\n#ifndef FUNCTION_PTR_T\n#define FUNCTION_PTR_T\ntypedef void (*function_ptr_t)(mach_port_t, char *, mach_msg_type_number_t);\ntypedef struct {\n        char            *name;\n        function_ptr_t  function;\n} function_table_entry;\ntypedef function_table_entry   *function_table_t;\n#endif /* FUNCTION_PTR_T */\n#endif /* AUTOTEST */\n\n#ifndef\tmach_exc_MSG_COUNT\n#define\tmach_exc_MSG_COUNT\t3\n#endif\t/* mach_exc_MSG_COUNT */\n\n#include <mach/std_types.h>\n#include <mach/mig.h>\n#include <mach/mig.h>\n#include <mach/mach_types.h>\n\n#ifdef __BeforeMigUserHeader\n__BeforeMigUserHeader\n#endif /* __BeforeMigUserHeader */\n\n#include <sys/cdefs.h>\n__BEGIN_DECLS\n\n#if defined(__cplusplus)\n    extern \"C\" {\n#endif\n\n/* Routine mach_exception_raise_OVR */\n#ifdef\tmig_external\nmig_external\n#else\nextern\n#endif\t/* mig_external */\nkern_return_t mach_exception_raise_OVR\n(\n\tmach_port_t exception_port,\n\tmach_port_t thread,\n\tmach_port_t task,\n\texception_type_t exception,\n\tmach_exception_data_t code,\n\tmach_msg_type_number_t codeCnt\n);\n\n/* Routine mach_exception_raise_state_OVR */\n#ifdef\tmig_external\nmig_external\n#else\nextern\n#endif\t/* mig_external */\nkern_return_t mach_exception_raise_state_OVR\n(\n\tmach_port_t exception_port,\n\texception_type_t exception,\n\tconst mach_exception_data_t code,\n\tmach_msg_type_number_t codeCnt,\n\tint *flavor,\n\tconst thread_state_t old_state,\n\tmach_msg_type_number_t old_stateCnt,\n\tthread_state_t new_state,\n\tmach_msg_type_number_t *new_stateCnt\n);\n\n/* Routine mach_exception_raise_state_identity_OVR */\n#ifdef\tmig_external\nmig_external\n#else\nextern\n#endif\t/* mig_external */\nkern_return_t mach_exception_raise_state_identity_OVR\n(\n\tmach_port_t exception_port,\n\tmach_port_t thread,\n\tmach_port_t task,\n\texception_type_t exception,\n\tmach_exception_data_t code,\n\tmach_msg_type_number_t codeCnt,\n\tint *flavor,\n\tthread_state_t old_state,\n\tmach_msg_type_number_t old_stateCnt,\n\tthread_state_t new_state,\n\tmach_msg_type_number_t *new_stateCnt\n);\n\n__END_DECLS\n\n/********************** Caution **************************/\n/* The following data types should be used to calculate  */\n/* maximum message sizes only. The actual message may be */\n/* smaller, and the position of the arguments within the */\n/* message layout may vary from what is presented here.  */\n/* For example, if any of the arguments are variable-    */\n/* sized, and less than the maximum is sent, the data    */\n/* will be packed tight in the actual message to reduce  */\n/* the presence of holes.                                */\n/********************** Caution **************************/\n\n/* typedefs for all requests */\n\n#ifndef __Request__mach_exc_subsystem__defined\n#define __Request__mach_exc_subsystem__defined\n\n#ifdef  __MigPackStructs\n#pragma pack(4)\n#endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\t/* start of the kernel processed data */\n\t\tmach_msg_body_t msgh_body;\n\t\tmach_msg_port_descriptor_t thread;\n\t\tmach_msg_port_descriptor_t task;\n\t\t/* end of the kernel processed data */\n\t\tNDR_record_t NDR;\n\t\texception_type_t exception;\n\t\tmach_msg_type_number_t codeCnt;\n\t\tint64_t code[2];\n\t} __Request__mach_exception_raise_t;\n#ifdef  __MigPackStructs\n#pragma pack()\n#endif\n\n#ifdef  __MigPackStructs\n#pragma pack(4)\n#endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\tNDR_record_t NDR;\n\t\texception_type_t exception;\n\t\tmach_msg_type_number_t codeCnt;\n\t\tint64_t code[2];\n\t\tint flavor;\n\t\tmach_msg_type_number_t old_stateCnt;\n\t\tnatural_t old_state[144];\n\t} __Request__mach_exception_raise_state_t;\n#ifdef  __MigPackStructs\n#pragma pack()\n#endif\n\n#ifdef  __MigPackStructs\n#pragma pack(4)\n#endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\t/* start of the kernel processed data */\n\t\tmach_msg_body_t msgh_body;\n\t\tmach_msg_port_descriptor_t thread;\n\t\tmach_msg_port_descriptor_t task;\n\t\t/* end of the kernel processed data */\n\t\tNDR_record_t NDR;\n\t\texception_type_t exception;\n\t\tmach_msg_type_number_t codeCnt;\n\t\tint64_t code[2];\n\t\tint flavor;\n\t\tmach_msg_type_number_t old_stateCnt;\n\t\tnatural_t old_state[144];\n\t} __Request__mach_exception_raise_state_identity_t;\n#ifdef  __MigPackStructs\n#pragma pack()\n#endif\n#endif /* !__Request__mach_exc_subsystem__defined */\n\n/* union of all requests */\n\n#ifndef __RequestUnion__mach_exc_subsystem__defined\n#define __RequestUnion__mach_exc_subsystem__defined\nunion __RequestUnion__mach_exc_subsystem {\n\t__Request__mach_exception_raise_t Request_mach_exception_raise;\n\t__Request__mach_exception_raise_state_t Request_mach_exception_raise_state;\n\t__Request__mach_exception_raise_state_identity_t Request_mach_exception_raise_state_identity;\n};\n#endif /* !__RequestUnion__mach_exc_subsystem__defined */\n/* typedefs for all replies */\n\n#ifndef __Reply__mach_exc_subsystem__defined\n#define __Reply__mach_exc_subsystem__defined\n\n#ifdef  __MigPackStructs\n#pragma pack(4)\n#endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\tNDR_record_t NDR;\n\t\tkern_return_t RetCode;\n\t} __Reply__mach_exception_raise_t;\n#ifdef  __MigPackStructs\n#pragma pack()\n#endif\n\n#ifdef  __MigPackStructs\n#pragma pack(4)\n#endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\tNDR_record_t NDR;\n\t\tkern_return_t RetCode;\n\t\tint flavor;\n\t\tmach_msg_type_number_t new_stateCnt;\n\t\tnatural_t new_state[144];\n\t} __Reply__mach_exception_raise_state_t;\n#ifdef  __MigPackStructs\n#pragma pack()\n#endif\n\n#ifdef  __MigPackStructs\n#pragma pack(4)\n#endif\n\ttypedef struct {\n\t\tmach_msg_header_t Head;\n\t\tNDR_record_t NDR;\n\t\tkern_return_t RetCode;\n\t\tint flavor;\n\t\tmach_msg_type_number_t new_stateCnt;\n\t\tnatural_t new_state[144];\n\t} __Reply__mach_exception_raise_state_identity_t;\n#ifdef  __MigPackStructs\n#pragma pack()\n#endif\n#endif /* !__Reply__mach_exc_subsystem__defined */\n\n/* union of all replies */\n\n#ifndef __ReplyUnion__mach_exc_subsystem__defined\n#define __ReplyUnion__mach_exc_subsystem__defined\nunion __ReplyUnion__mach_exc_subsystem {\n\t__Reply__mach_exception_raise_t Reply_mach_exception_raise;\n\t__Reply__mach_exception_raise_state_t Reply_mach_exception_raise_state;\n\t__Reply__mach_exception_raise_state_identity_t Reply_mach_exception_raise_state_identity;\n};\n#endif /* !__RequestUnion__mach_exc_subsystem__defined */\n\n#ifndef subsystem_to_name_map_mach_exc\n#define subsystem_to_name_map_mach_exc \\\n    { \"mach_exception_raise_OVR\", 2405 },\\\n    { \"mach_exception_raise_state_OVR\", 2406 },\\\n    { \"mach_exception_raise_state_identity_OVR\", 2407 }\n#endif\n\n#ifdef __AfterMigUserHeader\n__AfterMigUserHeader\n#endif /* __AfterMigUserHeader */\n\n\n#ifdef\tmig_external\nmig_external\n#else\nextern\n#endif\t/* mig_external */\nboolean_t mach_exc_server_OVR(\n\t\tmach_msg_header_t *InHeadP,\n\t\tmach_msg_header_t *OutHeadP);\n\n\n#if defined(__cplusplus)\n    } // extern\"C\"\n#endif\n\n\n#endif\t /* _mach_exc_user_ */\n"
  },
  {
    "path": "externals/ovr/Src/Net/OVR_BitStream.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_BitStream.cpp\nContent     :   A generic serialization toolkit for packing data to a binary stream.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_BitStream.h\"\n\n#ifdef OVR_OS_WIN32\n#include <WinSock2.h>\n#else\n#include <arpa/inet.h>\n#endif\n\nnamespace OVR { namespace Net {\n\n\n//-----------------------------------------------------------------------------\n// BitStream\n\t\nBitStream::BitStream()\n{\n\tnumberOfBitsUsed = 0;\n\t//numberOfBitsAllocated = 32 * 8;\n\tnumberOfBitsAllocated = BITSTREAM_STACK_ALLOCATION_SIZE * 8;\n\treadOffset = 0;\n\t//data = ( unsigned char* ) OVR_ALLOC( 32);\n\tdata = ( unsigned char* ) stackData;\n\n#ifdef _DEBUG\t\n\t//\tOVR_ASSERT( data );\n#endif\n\t//memset(data, 0, 32);\n\tcopyData = true;\n}\n\nBitStream::BitStream( const unsigned int initialBytesToAllocate )\n{\n\tnumberOfBitsUsed = 0;\n\treadOffset = 0;\n\tif (initialBytesToAllocate <= BITSTREAM_STACK_ALLOCATION_SIZE)\n\t{\n\t\tdata = ( unsigned char* ) stackData;\n\t\tnumberOfBitsAllocated = BITSTREAM_STACK_ALLOCATION_SIZE * 8;\n\t}\n\telse\n\t{\n\t\tdata = ( unsigned char* ) OVR_ALLOC( (size_t) initialBytesToAllocate);\n\t\tnumberOfBitsAllocated = initialBytesToAllocate << 3;\n\t}\n#ifdef _DEBUG\n\tOVR_ASSERT( data );\n#endif\n\t// memset(data, 0, initialBytesToAllocate);\n\tcopyData = true;\n}\n\nBitStream::BitStream( char* _data, const unsigned int lengthInBytes, bool _copyData )\n{\n\tnumberOfBitsUsed = lengthInBytes << 3;\n\treadOffset = 0;\n\tcopyData = _copyData;\n\tnumberOfBitsAllocated = lengthInBytes << 3;\n\n\tif ( copyData )\n\t{\n\t\tif ( lengthInBytes > 0 )\n\t\t{\n\t\t\tif (lengthInBytes < BITSTREAM_STACK_ALLOCATION_SIZE)\n\t\t\t{\n\t\t\t\tdata = ( unsigned char* ) stackData;\n\t\t\t\tnumberOfBitsAllocated = BITSTREAM_STACK_ALLOCATION_SIZE << 3;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdata = ( unsigned char* ) OVR_ALLOC( (size_t) lengthInBytes);\n\t\t\t}\n#ifdef _DEBUG\n\t\t\tOVR_ASSERT( data );\n#endif\n\t\t\tmemcpy( data, _data, (size_t) lengthInBytes );\n\t\t}\n\t\telse\n\t\t\tdata = 0;\n\t}\n\telse\n\t\tdata = ( unsigned char* ) _data;\n}\n\n// Use this if you pass a pointer copy to the constructor (_copyData==false) and want to overallocate to prevent reallocation\nvoid BitStream::SetNumberOfBitsAllocated( const BitSize_t lengthInBits )\n{\n#ifdef _DEBUG\n\tOVR_ASSERT( lengthInBits >= ( BitSize_t ) numberOfBitsAllocated );\n#endif\t\n\tnumberOfBitsAllocated = lengthInBits;\n}\n\nBitStream::~BitStream()\n{\n\tif ( copyData && numberOfBitsAllocated > (BITSTREAM_STACK_ALLOCATION_SIZE << 3))\n\t\tOVR_FREE( data );  // Use realloc and free so we are more efficient than delete and new for resizing\n}\n\nvoid BitStream::Reset( void )\n{\n\t// Note:  Do NOT reallocate memory because BitStream is used\n\t// in places to serialize/deserialize a buffer. Reallocation\n\t// is a dangerous operation (may result in leaks).\n\n\tif ( numberOfBitsUsed > 0 )\n\t{\n\t\t//  memset(data, 0, BITS_TO_BYTES(numberOfBitsUsed));\n\t}\n\n\t// Don't free memory here for speed efficiency\n\t//free(data);  // Use realloc and free so we are more efficient than delete and new for resizing\n\tnumberOfBitsUsed = 0;\n\n\t//numberOfBitsAllocated=8;\n\treadOffset = 0;\n\n\t//data=(unsigned char*)OVR_ALLOC(1, _FILE_AND_LINE_);\n\t// if (numberOfBitsAllocated>0)\n\t//  memset(data, 0, BITS_TO_BYTES(numberOfBitsAllocated));\n}\n\n// Write an array or casted stream\nvoid BitStream::Write( const char* inputByteArray, const unsigned int numberOfBytes )\n{\n\tif (numberOfBytes==0)\n\t\treturn;\n\n\t// Optimization:\n\tif ((numberOfBitsUsed & 7) == 0)\n\t{\n\t\tAddBitsAndReallocate( BYTES_TO_BITS(numberOfBytes) );\n\t\tmemcpy(data+BITS_TO_BYTES(numberOfBitsUsed), inputByteArray, (size_t) numberOfBytes);\n\t\tnumberOfBitsUsed+=BYTES_TO_BITS(numberOfBytes);\n\t}\n\telse\n\t{\n\t\tWriteBits( ( unsigned char* ) inputByteArray, numberOfBytes * 8, true );\n\t}\n\n}\nvoid BitStream::Write( BitStream *bitStream)\n{\n\tWrite(bitStream, bitStream->GetNumberOfBitsUsed()-bitStream->GetReadOffset());\n}\nvoid BitStream::Write( BitStream *bitStream, BitSize_t numberOfBits )\n{\n\tAddBitsAndReallocate( numberOfBits );\n\tBitSize_t numberOfBitsMod8;\n\n\tif ((bitStream->GetReadOffset()&7)==0 && (numberOfBitsUsed&7)==0)\n\t{\n\t\tint readOffsetBytes=bitStream->GetReadOffset()/8;\n\t\tint numBytes=numberOfBits/8;\n\t\tmemcpy(data + (numberOfBitsUsed >> 3), bitStream->GetData()+readOffsetBytes, numBytes);\n\t\tnumberOfBits-=BYTES_TO_BITS(numBytes);\n\t\tbitStream->SetReadOffset(BYTES_TO_BITS(numBytes+readOffsetBytes));\n\t\tnumberOfBitsUsed+=BYTES_TO_BITS(numBytes);\n\t}\n\n\twhile (numberOfBits-->0 && bitStream->readOffset + 1 <= bitStream->numberOfBitsUsed)\n\t{\n\t\tnumberOfBitsMod8 = numberOfBitsUsed & 7;\n\t\tif ( numberOfBitsMod8 == 0 )\n\t\t{\n\t\t\t// New byte\n\t\t\tif (bitStream->data[ bitStream->readOffset >> 3 ] & ( 0x80 >> ( bitStream->readOffset & 7 ) ) )\n\t\t\t{\n\t\t\t\t// Write 1\n\t\t\t\tdata[ numberOfBitsUsed >> 3 ] = 0x80;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Write 0\n\t\t\t\tdata[ numberOfBitsUsed >> 3 ] = 0;\n\t\t\t}\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Existing byte\n\t\t\tif (bitStream->data[ bitStream->readOffset >> 3 ] & ( 0x80 >> ( bitStream->readOffset & 7 ) ) )\n\t\t\t\tdata[ numberOfBitsUsed >> 3 ] |= 0x80 >> ( numberOfBitsMod8 ); // Set the bit to 1\n\t\t\t// else 0, do nothing\n\t\t}\n\n\t\tbitStream->readOffset++;\n\t\tnumberOfBitsUsed++;\n\t}\n}\nvoid BitStream::Write( BitStream &bitStream, BitSize_t numberOfBits )\n{\n\tWrite(&bitStream, numberOfBits);\n}\nvoid BitStream::Write( BitStream &bitStream )\n{\n\tWrite(&bitStream);\n}\nbool BitStream::Read( BitStream *bitStream, BitSize_t numberOfBits )\n{\n\tif (GetNumberOfUnreadBits() < numberOfBits)\n\t\treturn false;\n\tbitStream->Write(this, numberOfBits);\n\treturn true;\n}\nbool BitStream::Read( BitStream *bitStream )\n{\n\tbitStream->Write(this);\n\treturn true;\n}\nbool BitStream::Read( BitStream &bitStream, BitSize_t numberOfBits )\n{\n\tif (GetNumberOfUnreadBits() < numberOfBits)\n\t\treturn false;\n\tbitStream.Write(this, numberOfBits);\n\treturn true;\n}\nbool BitStream::Read( BitStream &bitStream )\n{\n\tbitStream.Write(this);\n\treturn true;\n}\n\n// Read an array or casted stream\nbool BitStream::Read( char* outByteArray, const unsigned int numberOfBytes )\n{\n\t// Optimization:\n\tif ((readOffset & 7) == 0)\n\t{\n\t\tif ( readOffset + ( numberOfBytes << 3 ) > numberOfBitsUsed )\n\t\t\treturn false;\n\n\t\t// Write the data\n\t\tmemcpy( outByteArray, data + ( readOffset >> 3 ), (size_t) numberOfBytes );\n\n\t\treadOffset += numberOfBytes << 3;\n\t\treturn true;\n\t}\n\telse\n\t{\n\t\treturn ReadBits( ( unsigned char* ) outByteArray, numberOfBytes * 8 );\n\t}\n}\n\n// Sets the read pointer back to the beginning of your data.\nvoid BitStream::ResetReadPointer( void )\n{\n\treadOffset = 0;\n}\n\n// Sets the write pointer back to the beginning of your data.\nvoid BitStream::ResetWritePointer( void )\n{\n\tnumberOfBitsUsed = 0;\n}\n\n// Write a 0\nvoid BitStream::Write0( void )\n{\n\tAddBitsAndReallocate( 1 );\n\n\t// New bytes need to be zeroed\n\tif ( ( numberOfBitsUsed & 7 ) == 0 )\n\t\tdata[ numberOfBitsUsed >> 3 ] = 0;\n\n\tnumberOfBitsUsed++;\n}\n\n// Write a 1\nvoid BitStream::Write1( void )\n{\n\tAddBitsAndReallocate( 1 );\n\n\tBitSize_t numberOfBitsMod8 = numberOfBitsUsed & 7;\n\n\tif ( numberOfBitsMod8 == 0 )\n\t\tdata[ numberOfBitsUsed >> 3 ] = 0x80;\n\telse\n\t\tdata[ numberOfBitsUsed >> 3 ] |= 0x80 >> ( numberOfBitsMod8 ); // Set the bit to 1\n\n\tnumberOfBitsUsed++;\n}\n\n// Returns true if the next data read is a 1, false if it is a 0\nbool BitStream::ReadBit( void )\n{\n\tbool result = ( data[ readOffset >> 3 ] & ( 0x80 >> ( readOffset & 7 ) ) ) !=0;\n\treadOffset++;\n\treturn result;\n}\n\n// Align the bitstream to the byte boundary and then write the specified number of bits.\n// This is faster than WriteBits but wastes the bits to do the alignment and requires you to call\n// SetReadToByteAlignment at the corresponding read position\nvoid BitStream::WriteAlignedBytes( const unsigned char* inByteArray, const unsigned int numberOfBytesToWrite )\n{\n\tAlignWriteToByteBoundary();\n\tWrite((const char*) inByteArray, numberOfBytesToWrite);\n}\nvoid BitStream::EndianSwapBytes( int byteOffset, int length )\n{\n\tif (DoEndianSwap())\n\t{\n\t\tReverseBytesInPlace(data+byteOffset, length);\n\t}\n}\n/// Aligns the bitstream, writes inputLength, and writes input. Won't write beyond maxBytesToWrite\nvoid BitStream::WriteAlignedBytesSafe( const char *inByteArray, const unsigned int inputLength, const unsigned int maxBytesToWrite )\n{\n\tif (inByteArray==0 || inputLength==0)\n\t{\n\t\tWriteCompressed((unsigned int)0);\n\t\treturn;\n\t}\n\tWriteCompressed(inputLength);\n\tWriteAlignedBytes((const unsigned char*) inByteArray, inputLength < maxBytesToWrite ? inputLength : maxBytesToWrite);\n}\n\n// Read bits, starting at the next aligned bits. Note that the modulus 8 starting offset of the\n// sequence must be the same as was used with WriteBits. This will be a problem with packet coalescence\n// unless you byte align the coalesced packets.\nbool BitStream::ReadAlignedBytes( unsigned char* inOutByteArray, const unsigned int numberOfBytesToRead )\n{\n#ifdef _DEBUG\n\tOVR_ASSERT( numberOfBytesToRead > 0 );\n#endif\n\n\tif ( numberOfBytesToRead <= 0 )\n\t\treturn false;\n\n\t// Byte align\n\tAlignReadToByteBoundary();\n\n\tif ( readOffset + ( numberOfBytesToRead << 3 ) > numberOfBitsUsed )\n\t\treturn false;\n\n\t// Write the data\n\tmemcpy( inOutByteArray, data + ( readOffset >> 3 ), (size_t) numberOfBytesToRead );\n\n\treadOffset += numberOfBytesToRead << 3;\n\n\treturn true;\n}\nbool BitStream::ReadAlignedBytesSafe( char *inOutByteArray, int &inputLength, const int maxBytesToRead )\n{\n\treturn ReadAlignedBytesSafe(inOutByteArray,(unsigned int&) inputLength,(unsigned int)maxBytesToRead);\n}\nbool BitStream::ReadAlignedBytesSafe( char *inOutByteArray, unsigned int &inputLength, const unsigned int maxBytesToRead )\n{\n\tif (ReadCompressed(inputLength)==false)\n\t\treturn false;\n\tif (inputLength > maxBytesToRead)\n\t\tinputLength=maxBytesToRead;\n\tif (inputLength==0)\n\t\treturn true;\n\treturn ReadAlignedBytes((unsigned char*) inOutByteArray, inputLength);\n}\nbool BitStream::ReadAlignedBytesSafeAlloc( char **outByteArray, int &inputLength, const unsigned int maxBytesToRead )\n{\n\treturn ReadAlignedBytesSafeAlloc(outByteArray,(unsigned int&) inputLength, maxBytesToRead);\n}\nbool BitStream::ReadAlignedBytesSafeAlloc( char ** outByteArray, unsigned int &inputLength, const unsigned int maxBytesToRead )\n{\n\tOVR_FREE(*outByteArray);\n\t*outByteArray=0;\n\tif (ReadCompressed(inputLength)==false)\n\t\treturn false;\n\tif (inputLength > maxBytesToRead)\n\t\tinputLength=maxBytesToRead;\n\tif (inputLength==0)\n\t\treturn true;\n\t*outByteArray = (char*) OVR_ALLOC( (size_t) inputLength);\n\treturn ReadAlignedBytes((unsigned char*) *outByteArray, inputLength);\n}\n\n// Write numberToWrite bits from the input source\nvoid BitStream::WriteBits( const unsigned char* inByteArray, BitSize_t numberOfBitsToWrite, const bool rightAlignedBits )\n{\n//\tif (numberOfBitsToWrite<=0)\n//\t\treturn;\n\n\tAddBitsAndReallocate( numberOfBitsToWrite );\n\n\tconst BitSize_t numberOfBitsUsedMod8 = numberOfBitsUsed & 7;\n\n\t// If currently aligned and numberOfBits is a multiple of 8, just memcpy for speed\n\tif (numberOfBitsUsedMod8==0 && (numberOfBitsToWrite&7)==0)\n\t{\n\t\tmemcpy( data + ( numberOfBitsUsed >> 3 ), inByteArray, numberOfBitsToWrite>>3);\n\t\tnumberOfBitsUsed+=numberOfBitsToWrite;\n\t\treturn;\n\t}\n\n\tunsigned char dataByte;\n\tconst unsigned char* inputPtr=inByteArray;\n\n\t// Faster to put the while at the top surprisingly enough\n\twhile ( numberOfBitsToWrite > 0 )\n\t\t//do\n\t{\n\t\tdataByte = *( inputPtr++ );\n\n\t\tif ( numberOfBitsToWrite < 8 && rightAlignedBits )   // rightAlignedBits means in the case of a partial byte, the bits are aligned from the right (bit 0) rather than the left (as in the normal internal representation)\n\t\t\tdataByte <<= 8 - numberOfBitsToWrite;  // shift left to get the bits on the left, as in our internal representation\n\n\t\t// Writing to a new byte each time\n\t\tif ( numberOfBitsUsedMod8 == 0 )\n\t\t\t* ( data + ( numberOfBitsUsed >> 3 ) ) = dataByte;\n\t\telse\n\t\t{\n\t\t\t// Copy over the new data.\n\t\t\t*( data + ( numberOfBitsUsed >> 3 ) ) |= dataByte >> ( numberOfBitsUsedMod8 ); // First half\n\n\t\t\tif ( 8 - ( numberOfBitsUsedMod8 ) < 8 && 8 - ( numberOfBitsUsedMod8 ) < numberOfBitsToWrite )   // If we didn't write it all out in the first half (8 - (numberOfBitsUsed%8) is the number we wrote in the first half)\n\t\t\t{\n\t\t\t\t*( data + ( numberOfBitsUsed >> 3 ) + 1 ) = (unsigned char) ( dataByte << ( 8 - ( numberOfBitsUsedMod8 ) ) ); // Second half (overlaps byte boundary)\n\t\t\t}\n\t\t}\n\n\t\tif ( numberOfBitsToWrite >= 8 )\n\t\t{\n\t\t\tnumberOfBitsUsed += 8;\n\t\t\tnumberOfBitsToWrite -= 8;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnumberOfBitsUsed += numberOfBitsToWrite;\n\t\t\tnumberOfBitsToWrite=0;\n\t\t}\n\t}\n\t// } while(numberOfBitsToWrite>0);\n}\n\n// Set the stream to some initial data.  For internal use\nvoid BitStream::SetData( unsigned char *inByteArray )\n{\n\tdata=inByteArray;\n\tcopyData=false;\n}\n\n// Assume the input source points to a native type, compress and write it\nvoid BitStream::WriteCompressed( const unsigned char* inByteArray,\n\t\t\t\t\t\t\t\tconst unsigned int size, const bool unsignedData )\n{\n\tBitSize_t currentByte = ( size >> 3 ) - 1; // PCs\n\n\tunsigned char byteMatch;\n\n\tif ( unsignedData )\n\t{\n\t\tbyteMatch = 0;\n\t}\n\n\telse\n\t{\n\t\tbyteMatch = 0xFF;\n\t}\n\n\t// Write upper bytes with a single 1\n\t// From high byte to low byte, if high byte is a byteMatch then write a 1 bit. Otherwise write a 0 bit and then write the remaining bytes\n\twhile ( currentByte > 0 )\n\t{\n\t\tif ( inByteArray[ currentByte ] == byteMatch )   // If high byte is byteMatch (0 of 0xff) then it would have the same value shifted\n\t\t{\n\t\t\tbool b = true;\n\t\t\tWrite( b );\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Write the remainder of the data after writing 0\n\t\t\tbool b = false;\n\t\t\tWrite( b );\n\n\t\t\tWriteBits( inByteArray, ( currentByte + 1 ) << 3, true );\n\t\t\t//  currentByte--;\n\n\n\t\t\treturn ;\n\t\t}\n\n\t\tcurrentByte--;\n\t}\n\n\t// If the upper half of the last byte is a 0 (positive) or 16 (negative) then write a 1 and the remaining 4 bits.  Otherwise write a 0 and the 8 bites.\n\tif ( ( unsignedData && ( ( *( inByteArray + currentByte ) ) & 0xF0 ) == 0x00 ) ||\n\t\t( unsignedData == false && ( ( *( inByteArray + currentByte ) ) & 0xF0 ) == 0xF0 ) )\n\t{\n\t\tbool b = true;\n\t\tWrite( b );\n\t\tWriteBits( inByteArray + currentByte, 4, true );\n\t}\n\n\telse\n\t{\n\t\tbool b = false;\n\t\tWrite( b );\n\t\tWriteBits( inByteArray + currentByte, 8, true );\n\t}\n}\n\n// Read numberOfBitsToRead bits to the output source\n// alignBitsToRight should be set to true to convert internal bitstream data to userdata\n// It should be false if you used WriteBits with rightAlignedBits false\nbool BitStream::ReadBits( unsigned char *inOutByteArray, BitSize_t numberOfBitsToRead, const bool alignBitsToRight )\n{\n#ifdef _DEBUG\n\t//\tOVR_ASSERT( numberOfBitsToRead > 0 );\n#endif\n\tif (numberOfBitsToRead<=0)\n\t\treturn false;\n\n\tif ( readOffset + numberOfBitsToRead > numberOfBitsUsed )\n\t\treturn false;\n\n\n\tconst BitSize_t readOffsetMod8 = readOffset & 7;\n\n\t// If currently aligned and numberOfBits is a multiple of 8, just memcpy for speed\n\tif (readOffsetMod8==0 && (numberOfBitsToRead&7)==0)\n\t{\n\t\tmemcpy( inOutByteArray, data + ( readOffset >> 3 ), numberOfBitsToRead>>3);\n\t\treadOffset+=numberOfBitsToRead;\n\t\treturn true;\n\t}\n\n\n\n\tBitSize_t offset = 0;\n\n\tmemset( inOutByteArray, 0, (size_t) BITS_TO_BYTES( numberOfBitsToRead ) );\n\n\twhile ( numberOfBitsToRead > 0 )\n\t{\n\t\t*( inOutByteArray + offset ) |= *( data + ( readOffset >> 3 ) ) << ( readOffsetMod8 ); // First half\n\n\t\tif ( readOffsetMod8 > 0 && numberOfBitsToRead > 8 - ( readOffsetMod8 ) )   // If we have a second half, we didn't read enough bytes in the first half\n\t\t\t*( inOutByteArray + offset ) |= *( data + ( readOffset >> 3 ) + 1 ) >> ( 8 - ( readOffsetMod8 ) ); // Second half (overlaps byte boundary)\n\n\t\tif (numberOfBitsToRead>=8)\n\t\t{\n\t\t\tnumberOfBitsToRead -= 8;\n\t\t\treadOffset += 8;\n\t\t\toffset++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tint neg = (int) numberOfBitsToRead - 8;\n\n\t\t\tif ( neg < 0 )   // Reading a partial byte for the last byte, shift right so the data is aligned on the right\n\t\t\t{\n\n\t\t\t\tif ( alignBitsToRight )\n\t\t\t\t\t* ( inOutByteArray + offset ) >>= -neg;\n\n\t\t\t\treadOffset += 8 + neg;\n\t\t\t}\n\t\t\telse\n\t\t\t\treadOffset += 8;\n\n\t\t\toffset++;\n\n\t\t\tnumberOfBitsToRead=0;\n\t\t}\t\t\n\t}\n\n\treturn true;\n}\n\n// Assume the input source points to a compressed native type. Decompress and read it\nbool BitStream::ReadCompressed( unsigned char* inOutByteArray,\n\t\t\t\t\t\t\t   const unsigned int size, const bool unsignedData )\n{\n\tunsigned int currentByte = ( size >> 3 ) - 1;\n\n\n\tunsigned char byteMatch, halfByteMatch;\n\n\tif ( unsignedData )\n\t{\n\t\tbyteMatch = 0;\n\t\thalfByteMatch = 0;\n\t}\n\n\telse\n\t{\n\t\tbyteMatch = 0xFF;\n\t\thalfByteMatch = 0xF0;\n\t}\n\n\t// Upper bytes are specified with a single 1 if they match byteMatch\n\t// From high byte to low byte, if high byte is a byteMatch then write a 1 bit. Otherwise write a 0 bit and then write the remaining bytes\n\twhile ( currentByte > 0 )\n\t{\n\t\t// If we read a 1 then the data is byteMatch.\n\n\t\tbool b;\n\n\t\tif ( Read( b ) == false )\n\t\t\treturn false;\n\n\t\tif ( b )   // Check that bit\n\t\t{\n\t\t\tinOutByteArray[ currentByte ] = byteMatch;\n\t\t\tcurrentByte--;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Read the rest of the bytes\n\n\t\t\tif ( ReadBits( inOutByteArray, ( currentByte + 1 ) << 3 ) == false )\n\t\t\t\treturn false;\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// All but the first bytes are byteMatch.  If the upper half of the last byte is a 0 (positive) or 16 (negative) then what we read will be a 1 and the remaining 4 bits.\n\t// Otherwise we read a 0 and the 8 bytes\n\t//OVR_ASSERT(readOffset+1 <=numberOfBitsUsed); // If this assert is hit the stream wasn't long enough to read from\n\tif ( readOffset + 1 > numberOfBitsUsed )\n\t\treturn false;\n\n\tbool b=false;\n\n\tif ( Read( b ) == false )\n\t\treturn false;\n\n\tif ( b )   // Check that bit\n\t{\n\n\t\tif ( ReadBits( inOutByteArray + currentByte, 4 ) == false )\n\t\t\treturn false;\n\n\t\tinOutByteArray[ currentByte ] |= halfByteMatch; // We have to set the high 4 bits since these are set to 0 by ReadBits\n\t}\n\telse\n\t{\n\t\tif ( ReadBits( inOutByteArray + currentByte, 8 ) == false )\n\t\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n// Reallocates (if necessary) in preparation of writing numberOfBitsToWrite\nvoid BitStream::AddBitsAndReallocate( const BitSize_t numberOfBitsToWrite )\n{\n\tBitSize_t newNumberOfBitsAllocated = numberOfBitsToWrite + numberOfBitsUsed;\n\n\tif ( numberOfBitsToWrite + numberOfBitsUsed > 0 && ( ( numberOfBitsAllocated - 1 ) >> 3 ) < ( ( newNumberOfBitsAllocated - 1 ) >> 3 ) )   // If we need to allocate 1 or more new bytes\n\t{\n#ifdef _DEBUG\n\t\t// If this assert hits then we need to specify true for the third parameter in the constructor\n\t\t// It needs to reallocate to hold all the data and can't do it unless we allocated to begin with\n\t\t// Often hits if you call Write or Serialize on a read-only bitstream\n\t\tOVR_ASSERT( copyData == true );\n#endif\n\n\t\t// Less memory efficient but saves on news and deletes\n\t\t/// Cap to 1 meg buffer to save on huge allocations\n\t\tnewNumberOfBitsAllocated = ( numberOfBitsToWrite + numberOfBitsUsed ) * 2;\n\t\tif (newNumberOfBitsAllocated - ( numberOfBitsToWrite + numberOfBitsUsed ) > 1048576 )\n\t\t\tnewNumberOfBitsAllocated = numberOfBitsToWrite + numberOfBitsUsed + 1048576;\n\n\t\t//\t\tBitSize_t newByteOffset = BITS_TO_BYTES( numberOfBitsAllocated );\n\t\t// Use realloc and free so we are more efficient than delete and new for resizing\n\t\tBitSize_t amountToAllocate = BITS_TO_BYTES( newNumberOfBitsAllocated );\n\t\tif (data==(unsigned char*)stackData)\n\t\t{\n\t\t\tif (amountToAllocate > BITSTREAM_STACK_ALLOCATION_SIZE)\n\t\t\t{\n\t\t\t\tdata = ( unsigned char* ) OVR_ALLOC( (size_t) amountToAllocate);\n\t\t\t\tOVR_ASSERT(data);\n                if (data)\n\t\t\t\t{\n                    // need to copy the stack data over to our new memory area too\n                    memcpy ((void *)data, (void *)stackData, (size_t) BITS_TO_BYTES( numberOfBitsAllocated ));\n                }\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdata = ( unsigned char* ) OVR_REALLOC( data, (size_t) amountToAllocate);\n\t\t}\n\n#ifdef _DEBUG\n\t\tOVR_ASSERT( data ); // Make sure realloc succeeded\n#endif\n\t\t//  memset(data+newByteOffset, 0,  ((newNumberOfBitsAllocated-1)>>3) - ((numberOfBitsAllocated-1)>>3)); // Set the new data block to 0\n\t}\n\n\tif ( newNumberOfBitsAllocated > numberOfBitsAllocated )\n\t\tnumberOfBitsAllocated = newNumberOfBitsAllocated;\n}\nBitSize_t BitStream::GetNumberOfBitsAllocated(void) const\n{\n\treturn numberOfBitsAllocated;\n}\nvoid BitStream::PadWithZeroToByteLength( unsigned int bytes )\n{\n\tif (GetNumberOfBytesUsed() < bytes)\n\t{\n\t\tAlignWriteToByteBoundary();\n\t\tunsigned int numToWrite = bytes - GetNumberOfBytesUsed();\n\t\tAddBitsAndReallocate( BYTES_TO_BITS(numToWrite) );\n\t\tmemset(data+BITS_TO_BYTES(numberOfBitsUsed), 0, (size_t) numToWrite);\n\t\tnumberOfBitsUsed+=BYTES_TO_BITS(numToWrite);\n\t}\n}\n\n/* \n// Julius Goryavsky's version of Harley's algorithm.\n// 17 elementary ops plus an indexed load, if the machine\n// has \"and not.\"\n\nint nlz10b(unsigned x) {\n\n   static char table[64] =\n     {32,20,19, u, u,18, u, 7,  10,17, u, u,14, u, 6, u,\n       u, 9, u,16, u, u, 1,26,   u,13, u, u,24, 5, u, u,\n       u,21, u, 8,11, u,15, u,   u, u, u, 2,27, 0,25, u,\n      22, u,12, u, u, 3,28, u,  23, u, 4,29, u, u,30,31};\n\n   x = x | (x >> 1);    // Propagate leftmost\n   x = x | (x >> 2);    // 1-bit to the right.\n   x = x | (x >> 4);\n   x = x | (x >> 8);\n   x = x & ~(x >> 16);\n   x = x*0xFD7049FF;    // Activate this line or the following 3.\n// x = (x << 9) - x;    // Multiply by 511.\n// x = (x << 11) - x;   // Multiply by 2047.\n// x = (x << 14) - x;   // Multiply by 16383.\n   return table[x >> 26];\n}\n*/\nint BitStream::NumberOfLeadingZeroes( int8_t x ) {return NumberOfLeadingZeroes((uint8_t)x);}\nint BitStream::NumberOfLeadingZeroes( uint8_t x )\n{\n\tuint8_t y;\n\tint n;\n\n\tn = 8;\n\ty = x >> 4;  if (y != 0) {n = n - 4;  x = y;}\n\ty = x >> 2;  if (y != 0) {n = n - 2;  x = y;}\n\ty = x >> 1;  if (y != 0) return n - 2;\n\treturn (int)(n - x);\n}\nint BitStream::NumberOfLeadingZeroes( int16_t x ) {return NumberOfLeadingZeroes((uint16_t)x);}\nint BitStream::NumberOfLeadingZeroes( uint16_t x )\n{\n\tuint16_t y;\n\tint n;\n\n\tn = 16;\n\ty = x >> 8;  if (y != 0) {n = n - 8;  x = y;}\n\ty = x >> 4;  if (y != 0) {n = n - 4;  x = y;}\n\ty = x >> 2;  if (y != 0) {n = n - 2;  x = y;}\n\ty = x >> 1;  if (y != 0) return n - 2;\n\treturn (int)(n - x);\n}\nint BitStream::NumberOfLeadingZeroes( int32_t x ) {return NumberOfLeadingZeroes((uint32_t)x);}\nint BitStream::NumberOfLeadingZeroes( uint32_t x )\n{\n\tuint32_t y;\n\tint n;\n\n\tn = 32;\n\ty = x >>16;  if (y != 0) {n = n -16;  x = y;}\n\ty = x >> 8;  if (y != 0) {n = n - 8;  x = y;}\n\ty = x >> 4;  if (y != 0) {n = n - 4;  x = y;}\n\ty = x >> 2;  if (y != 0) {n = n - 2;  x = y;}\n\ty = x >> 1;  if (y != 0) return n - 2;\n\treturn (int)(n - x);\n}\nint BitStream::NumberOfLeadingZeroes( int64_t x ) {return NumberOfLeadingZeroes((uint64_t)x);}\nint BitStream::NumberOfLeadingZeroes( uint64_t x )\n{\n\tuint64_t y;\n\tint n;\n\n\tn = 64;\n\ty = x >>32;  if (y != 0) {n = n -32;  x = y;}\n\ty = x >>16;  if (y != 0) {n = n -16;  x = y;}\n\ty = x >> 8;  if (y != 0) {n = n - 8;  x = y;}\n\ty = x >> 4;  if (y != 0) {n = n - 4;  x = y;}\n\ty = x >> 2;  if (y != 0) {n = n - 2;  x = y;}\n\ty = x >> 1;  if (y != 0) return n - 2;\n\treturn (int)(n - x);\n}\n\n// Should hit if reads didn't match writes\nvoid BitStream::AssertStreamEmpty( void )\n{\n\tOVR_ASSERT( readOffset == numberOfBitsUsed );\n}\nvoid BitStream::PrintBits( char *out ) const\n{\n\tif ( numberOfBitsUsed <= 0 )\n\t{\n\t\tOVR_strcpy(out, 128, \"No bits\\n\" );\n\t\treturn;\n\t}\n\n\tunsigned int strIndex=0;\n\tfor ( BitSize_t counter = 0; counter < BITS_TO_BYTES( numberOfBitsUsed ) && strIndex < 2000 ; counter++ )\n\t{\n\t\tBitSize_t stop;\n\n\t\tif ( counter == ( numberOfBitsUsed - 1 ) >> 3 )\n\t\t\tstop = 8 - ( ( ( numberOfBitsUsed - 1 ) & 7 ) + 1 );\n\t\telse\n\t\t\tstop = 0;\n\n\t\tfor ( BitSize_t counter2 = 7; counter2 >= stop; counter2-- )\n\t\t{\n\t\t\tif ( ( data[ counter ] >> counter2 ) & 1 )\n\t\t\t\tout[strIndex++]='1';\n\t\t\telse\n\t\t\t\tout[strIndex++]='0';\n\n\t\t\tif (counter2==0)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tout[strIndex++]=' ';\n\t}\n\n\tout[strIndex++]='\\n';\n\n\tout[strIndex++]=0;\n}\nvoid BitStream::PrintBits( void ) const\n{\n\tchar out[2048];\n\tPrintBits(out);\n\tprintf(\"%s\", out);\n}\nvoid BitStream::PrintHex( char *out ) const\n{\n\tBitSize_t i;\n\tfor ( i=0; i < GetNumberOfBytesUsed(); i++)\n\t{\n\t\tOVR_sprintf(out+i*3, 128, \"%02x \", data[i]);\n\t}\n}\nvoid BitStream::PrintHex( void ) const\n{\n\tchar out[2048];\n\tPrintHex(out);\n\tprintf(\"%s\", out);\n}\n\n// Exposes the data for you to look at, like PrintBits does.\n// Data will point to the stream.  Returns the length in bits of the stream.\nBitSize_t BitStream::CopyData( unsigned char** _data ) const\n{\n#ifdef _DEBUG\n\tOVR_ASSERT( numberOfBitsUsed > 0 );\n#endif\n\n\t*_data = (unsigned char*) OVR_ALLOC( (size_t) BITS_TO_BYTES( numberOfBitsUsed ));\n\tmemcpy( *_data, data, sizeof(unsigned char) * (size_t) ( BITS_TO_BYTES( numberOfBitsUsed ) ) );\n\treturn numberOfBitsUsed;\n}\n\n// Ignore data we don't intend to read\nvoid BitStream::IgnoreBits( const BitSize_t numberOfBits )\n{\n\treadOffset += numberOfBits;\n}\n\nvoid BitStream::IgnoreBytes( const unsigned int numberOfBytes )\n{\n\tIgnoreBits(BYTES_TO_BITS(numberOfBytes));\n}\n\n// Move the write pointer to a position on the array.  Dangerous if you don't know what you are doing!\n// Doesn't work with non-aligned data!\nvoid BitStream::SetWriteOffset( const BitSize_t offset )\n{\n\tnumberOfBitsUsed = offset;\n}\n\n/*\nBitSize_t BitStream::GetWriteOffset( void ) const\n{\nreturn numberOfBitsUsed;\n}\n\n// Returns the length in bits of the stream\nBitSize_t BitStream::GetNumberOfBitsUsed( void ) const\n{\nreturn GetWriteOffset();\n}\n\n// Returns the length in bytes of the stream\nBitSize_t BitStream::GetNumberOfBytesUsed( void ) const\n{\nreturn BITS_TO_BYTES( numberOfBitsUsed );\n}\n\n// Returns the number of bits into the stream that we have read\nBitSize_t BitStream::GetReadOffset( void ) const\n{\nreturn readOffset;\n}\n\n\n// Sets the read bit index\nvoid BitStream::SetReadOffset( const BitSize_t newReadOffset )\n{\nreadOffset=newReadOffset;\n}\n\n// Returns the number of bits left in the stream that haven't been read\nBitSize_t BitStream::GetNumberOfUnreadBits( void ) const\n{\nreturn numberOfBitsUsed - readOffset;\n}\n// Exposes the internal data\nunsigned char* BitStream::GetData( void ) const\n{\nreturn data;\n}\n\n*/\n// If we used the constructor version with copy data off, this makes sure it is set to on and the data pointed to is copied.\nvoid BitStream::AssertCopyData( void )\n{\n\tif ( copyData == false )\n\t{\n\t\tcopyData = true;\n\n\t\tif ( numberOfBitsAllocated > 0 )\n\t\t{\n\t\t\tunsigned char * newdata = ( unsigned char* ) OVR_ALLOC( (size_t) BITS_TO_BYTES( numberOfBitsAllocated ));\n#ifdef _DEBUG\n\n\t\t\tOVR_ASSERT( data );\n#endif\n\n\t\t\tmemcpy( newdata, data, (size_t) BITS_TO_BYTES( numberOfBitsAllocated ) );\n\t\t\tdata = newdata;\n\t\t}\n\n\t\telse\n\t\t\tdata = 0;\n\t}\n}\nbool BitStream::IsNetworkOrderInternal(void)\n{\n#if defined(_PS3) || defined(__PS3__) || defined(SN_TARGET_PS3)\n\treturn true;\n#elif defined(SN_TARGET_PSP2)\n\treturn false;\n#else\n\tstatic unsigned long htonlValue = htonl(12345);\n\treturn htonlValue == 12345;\n#endif\n}\nvoid BitStream::ReverseBytes(unsigned char *inByteArray, unsigned char *inOutByteArray, const unsigned int length)\n{\n\tfor (BitSize_t i=0; i < length; i++)\n\t\tinOutByteArray[i]=inByteArray[length-i-1];\n}\nvoid BitStream::ReverseBytesInPlace(unsigned char *inOutData,const unsigned int length)\n{\n\tunsigned char temp;\n\tBitSize_t i;\n\tfor (i=0; i < (length>>1); i++)\n\t{\n\t\ttemp = inOutData[i];\n\t\tinOutData[i]=inOutData[length-i-1];\n\t\tinOutData[length-i-1]=temp;\n\t}\n}\n\nvoid BitStream::WriteAlignedVar8(const char *inByteArray)\n{\n\tOVR_ASSERT((numberOfBitsUsed&7)==0);\n\tAddBitsAndReallocate(1*8);\n\tdata[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[0];\n\tnumberOfBitsUsed+=1*8;\n}\nbool BitStream::ReadAlignedVar8(char *inOutByteArray)\n{\n\tOVR_ASSERT((readOffset&7)==0);\n\tif ( readOffset + 1*8 > numberOfBitsUsed )\n\t\treturn false;\n\n\tinOutByteArray[0] = data[( readOffset >> 3 ) + 0];\n\treadOffset+=1*8;\n\treturn true;\n}\nvoid BitStream::WriteAlignedVar16(const char *inByteArray)\n{\n\tOVR_ASSERT((numberOfBitsUsed&7)==0);\n\tAddBitsAndReallocate(2*8);\n#ifndef __BITSTREAM_NATIVE_END\n\tif (DoEndianSwap())\n\t{\n\t\tdata[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[1];\n\t\tdata[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[0];\n\t}\n\telse\n#endif\n\t{\n\t\tdata[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[0];\n\t\tdata[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[1];\n\t}\n\n\tnumberOfBitsUsed+=2*8;\n}\nbool BitStream::ReadAlignedVar16(char *inOutByteArray)\n{\n\tOVR_ASSERT((readOffset&7)==0);\n\tif ( readOffset + 2*8 > numberOfBitsUsed )\n\t\treturn false;\n#ifndef __BITSTREAM_NATIVE_END\n\tif (DoEndianSwap())\n\t{\n\t\tinOutByteArray[0] = data[( readOffset >> 3 ) + 1];\n\t\tinOutByteArray[1] = data[( readOffset >> 3 ) + 0];\n\t}\n\telse\n#endif\n\t{\n\t\tinOutByteArray[0] = data[( readOffset >> 3 ) + 0];\n\t\tinOutByteArray[1] = data[( readOffset >> 3 ) + 1];\n\t}\n\n\treadOffset+=2*8;\n\treturn true;\n}\nvoid BitStream::WriteAlignedVar32(const char *inByteArray)\n{\n\tOVR_ASSERT((numberOfBitsUsed&7)==0);\n\tAddBitsAndReallocate(4*8);\n#ifndef __BITSTREAM_NATIVE_END\n\tif (DoEndianSwap())\n\t{\n\t\tdata[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[3];\n\t\tdata[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[2];\n\t\tdata[( numberOfBitsUsed >> 3 ) + 2] = inByteArray[1];\n\t\tdata[( numberOfBitsUsed >> 3 ) + 3] = inByteArray[0];\n\t}\n\telse\n#endif\n\t{\n\t\tdata[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[0];\n\t\tdata[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[1];\n\t\tdata[( numberOfBitsUsed >> 3 ) + 2] = inByteArray[2];\n\t\tdata[( numberOfBitsUsed >> 3 ) + 3] = inByteArray[3];\n\t}\n\n\tnumberOfBitsUsed+=4*8;\n}\nbool BitStream::ReadAlignedVar32(char *inOutByteArray)\n{\n\tOVR_ASSERT((readOffset&7)==0);\n\tif ( readOffset + 4*8 > numberOfBitsUsed )\n\t\treturn false;\n#ifndef __BITSTREAM_NATIVE_END\n\tif (DoEndianSwap())\n\t{\n\t\tinOutByteArray[0] = data[( readOffset >> 3 ) + 3];\n\t\tinOutByteArray[1] = data[( readOffset >> 3 ) + 2];\n\t\tinOutByteArray[2] = data[( readOffset >> 3 ) + 1];\n\t\tinOutByteArray[3] = data[( readOffset >> 3 ) + 0];\n\t}\n\telse\n#endif\n\t{\n\t\tinOutByteArray[0] = data[( readOffset >> 3 ) + 0];\n\t\tinOutByteArray[1] = data[( readOffset >> 3 ) + 1];\n\t\tinOutByteArray[2] = data[( readOffset >> 3 ) + 2];\n\t\tinOutByteArray[3] = data[( readOffset >> 3 ) + 3];\n\t}\n\n\treadOffset+=4*8;\n\treturn true;\n}\nbool BitStream::ReadFloat16( float &outFloat, float floatMin, float floatMax )\n{\n\tuint16_t percentile;\n\tif (Read(percentile))\n\t{\n\t\tOVR_ASSERT(floatMax>floatMin);\n\t\toutFloat = floatMin + ((float) percentile / 65535.0f) * (floatMax-floatMin);\n\t\tif (outFloat<floatMin)\n\t\t\toutFloat=floatMin;\n\t\telse if (outFloat>floatMax)\n\t\t\toutFloat=floatMax;\n\t\treturn true;\n\t}\n\treturn false;\n}\nbool BitStream::SerializeFloat16(bool writeToBitstream, float &inOutFloat, float floatMin, float floatMax)\n{\n\tif (writeToBitstream)\n\t\tWriteFloat16(inOutFloat, floatMin, floatMax);\n\telse\n\t\treturn ReadFloat16(inOutFloat, floatMin, floatMax);\n\treturn true;\n}\nvoid BitStream::WriteFloat16( float inOutFloat, float floatMin, float floatMax )\n{\n\tOVR_ASSERT(floatMax>floatMin);\n\tif (inOutFloat>floatMax+.001)\n\t{\n\t\tOVR_ASSERT(inOutFloat<=floatMax+.001);\n\t}\n\tif (inOutFloat<floatMin-.001)\n\t{\n\t\tOVR_ASSERT(inOutFloat>=floatMin-.001);\n\t}\n\tfloat percentile=65535.0f * (inOutFloat-floatMin)/(floatMax-floatMin);\n\tif (percentile<0.0)\n\t\tpercentile=0.0;\n\tif (percentile>65535.0f)\n\t\tpercentile=65535.0f;\n\tWrite((uint16_t)percentile);\n}\n\n\n}} // OVR::Net\n"
  },
  {
    "path": "externals/ovr/Src/Net/OVR_BitStream.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_BitStream.h\nContent     :   A generic serialization toolkit for packing data to a binary stream.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Bitstream_h\n#define OVR_Bitstream_h\n\n#include <math.h>\n#include \"../Kernel/OVR_Types.h\"\n#include \"../Kernel/OVR_Std.h\"\n#include \"../Kernel/OVR_String.h\"\n\nnamespace OVR { namespace Net {\n\ntypedef uint32_t BitSize_t;\n#define BITSTREAM_STACK_ALLOCATION_SIZE 256\n#define BITS_TO_BYTES(x) (((x)+7)>>3)\n#define BYTES_TO_BITS(x) ((x)<<3)\n\n\n//-----------------------------------------------------------------------------\n// BitStream\n\n// Generic serialization class to binary stream\nclass BitStream : public NewOverrideBase\n{\npublic:\n\t/// Default Constructor\n\tBitStream();\n\n\t/// \\brief Create the bitstream, with some number of bytes to immediately allocate.\n\t/// \\details There is no benefit to calling this, unless you know exactly how many bytes you need and it is greater than BITSTREAM_STACK_ALLOCATION_SIZE.\n\t/// In that case all it does is save you one or more realloc calls.\n\t/// \\param[in] initialBytesToAllocate the number of bytes to pre-allocate.\n\tBitStream( const unsigned int initialBytesToAllocate );\n\n\t/// \\brief Initialize the BitStream, immediately setting the data it contains to a predefined pointer.\n\t/// \\details Set \\a _copyData to true if you want to make an internal copy of the data you are passing. Set it to false to just save a pointer to the data.\n\t/// You shouldn't call Write functions with \\a _copyData as false, as this will write to unallocated memory\n\t/// 99% of the time you will use this function to cast Packet::data to a bitstream for reading, in which case you should write something as follows:\n\t/// \\code\n\t/// RakNet::BitStream bs(packet->data, packet->length, false);\n\t/// \\endcode\n\t/// \\param[in] _data An array of bytes.\n\t/// \\param[in] lengthInBytes Size of the \\a _data.\n\t/// \\param[in] _copyData true or false to make a copy of \\a _data or not.\n\tBitStream( char* _data, const unsigned int lengthInBytes, bool _copyData );\n\n\t// Destructor\n\t~BitStream();\n\npublic:\n\t/// Resets the bitstream for reuse.\n\tvoid Reset( void );\n\n\t/// \\brief Bidirectional serialize/deserialize any integral type to/from a bitstream.  \n\t/// \\details Undefine __BITSTREAM_NATIVE_END if you need endian swapping.\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] inOutTemplateVar The value to write\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\ttemplate <class templateType>\n\tbool Serialize(bool writeToBitstream, templateType &inOutTemplateVar);\n\n\t/// \\brief Bidirectional serialize/deserialize any integral type to/from a bitstream. \n\t/// \\details If the current value is different from the last value\n\t/// the current value will be written.  Otherwise, a single bit will be written\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] inOutCurrentValue The current value to write\n\t/// \\param[in] lastValue The last value to compare against.  Only used if \\a writeToBitstream is true.\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\ttemplate <class templateType>\n\tbool SerializeDelta(bool writeToBitstream, templateType &inOutCurrentValue, const templateType &lastValue);\n\n\t/// \\brief Bidirectional version of SerializeDelta when you don't know what the last value is, or there is no last value.\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] inOutCurrentValue The current value to write\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\ttemplate <class templateType>\n\tbool SerializeDelta(bool writeToBitstream, templateType &inOutCurrentValue);\n\n\t/// \\brief Bidirectional serialize/deserialize any integral type to/from a bitstream.\n\t/// \\details Undefine __BITSTREAM_NATIVE_END if you need endian swapping.\n\t/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n\t/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n\t/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] inOutTemplateVar The value to write\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\ttemplate <class templateType>\n\tbool SerializeCompressed(bool writeToBitstream, templateType &inOutTemplateVar);\n\n\t/// \\brief Bidirectional serialize/deserialize any integral type to/from a bitstream.  \n\t/// \\details If the current value is different from the last value\n\t/// the current value will be written.  Otherwise, a single bit will be written\n\t/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n\t/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n\t/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] inOutCurrentValue The current value to write\n\t/// \\param[in] lastValue The last value to compare against.  Only used if \\a writeToBitstream is true.\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\ttemplate <class templateType>\n\tbool SerializeCompressedDelta(bool writeToBitstream, templateType &inOutCurrentValue, const templateType &lastValue);\n\n\t/// \\brief Save as SerializeCompressedDelta(templateType &currentValue, const templateType &lastValue) when we have an unknown second parameter\n\t/// \\return true on data read. False on insufficient data in bitstream\n\ttemplate <class templateType>\n\tbool SerializeCompressedDelta(bool writeToBitstream, templateType &inOutTemplateVar);\n\n\t/// \\brief Bidirectional serialize/deserialize an array or casted stream or raw data.  This does NOT do endian swapping.\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] inOutByteArray a byte buffer\n\t/// \\param[in] numberOfBytes the size of \\a input in bytes\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\tbool Serialize(bool writeToBitstream,  char* inOutByteArray, const unsigned int numberOfBytes );\n\n\t/// \\brief Serialize a float into 2 bytes, spanning the range between \\a floatMin and \\a floatMax\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] inOutFloat The float to write\n\t/// \\param[in] floatMin Predetermined minimum value of f\n\t/// \\param[in] floatMax Predetermined maximum value of f\n\tbool SerializeFloat16(bool writeToBitstream, float &inOutFloat, float floatMin, float floatMax);\n\n\t/// Serialize one type casted to another (smaller) type, to save bandwidth\n\t/// serializationType should be uint8_t, uint16_t, uint24_t, or uint32_t\n\t/// Example: int num=53; SerializeCasted<uint8_t>(true, num); would use 1 byte to write what would otherwise be an integer (4 or 8 bytes)\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] value The value to serialize\n\ttemplate <class serializationType, class sourceType >\n\tbool SerializeCasted( bool writeToBitstream, sourceType &value );\n\n\t/// Given the minimum and maximum values for an integer type, figure out the minimum number of bits to represent the range\n\t/// Then serialize only those bits\n\t/// \\note A static is used so that the required number of bits for (maximum-minimum) is only calculated once. This does require that \\a minimum and \\maximum are fixed values for a given line of code for the life of the program\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] value Integer value to write, which should be between \\a minimum and \\a maximum\n\t/// \\param[in] minimum Minimum value of \\a value\n\t/// \\param[in] maximum Maximum value of \\a value\n\t/// \\param[in] allowOutsideRange If true, all sends will take an extra bit, however value can deviate from outside \\a minimum and \\a maximum. If false, will assert if the value deviates\n\ttemplate <class templateType>\n\tbool SerializeBitsFromIntegerRange( bool writeToBitstream, templateType &value, const templateType minimum, const templateType maximum, bool allowOutsideRange=false );\n\t/// \\param[in] requiredBits Primarily for internal use, called from above function() after calculating number of bits needed to represent maximum-minimum\n\ttemplate <class templateType>\n\tbool SerializeBitsFromIntegerRange( bool writeToBitstream, templateType &value, const templateType minimum, const templateType maximum, const int requiredBits, bool allowOutsideRange=false );\n\n\t/// \\brief Bidirectional serialize/deserialize a normalized 3D vector, using (at most) 4 bytes + 3 bits instead of 12-24 bytes.  \n\t/// \\details Will further compress y or z axis aligned vectors.\n\t/// Accurate to 1/32767.5.\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] x x\n\t/// \\param[in] y y\n\t/// \\param[in] z z\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tbool SerializeNormVector(bool writeToBitstream,  templateType &x, templateType &y, templateType &z );\n\n\t/// \\brief Bidirectional serialize/deserialize a vector, using 10 bytes instead of 12.\n\t/// \\details Loses accuracy to about 3/10ths and only saves 2 bytes, so only use if accuracy is not important.\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] x x\n\t/// \\param[in] y y\n\t/// \\param[in] z z\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tbool SerializeVector(bool writeToBitstream,  templateType &x, templateType &y, templateType &z );\n\n\t/// \\brief Bidirectional serialize/deserialize a normalized quaternion in 6 bytes + 4 bits instead of 16 bytes. Slightly lossy.\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] w w\n\t/// \\param[in] x x\n\t/// \\param[in] y y\n\t/// \\param[in] z z\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tbool SerializeNormQuat(bool writeToBitstream,  templateType &w, templateType &x, templateType &y, templateType &z);\n\n\t/// \\brief Bidirectional serialize/deserialize an orthogonal matrix by creating a quaternion, and writing 3 components of the quaternion in 2 bytes each.\n\t/// \\details Use 6 bytes instead of 36\n\t/// Lossy, although the result is renormalized\n\t/// \\return true on success, false on failure.\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tbool SerializeOrthMatrix(\n\t\tbool writeToBitstream,\n\t\ttemplateType &m00, templateType &m01, templateType &m02,\n\t\ttemplateType &m10, templateType &m11, templateType &m12,\n\t\ttemplateType &m20, templateType &m21, templateType &m22 );\n\n\t/// \\brief Bidirectional serialize/deserialize numberToSerialize bits to/from the input. \n\t/// \\details Right aligned data means in the case of a partial byte, the bits are aligned\n\t/// from the right (bit 0) rather than the left (as in the normal\n\t/// internal representation) You would set this to true when\n\t/// writing user data, and false when copying bitstream data, such\n\t/// as writing one bitstream to another\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] inOutByteArray The data\n\t/// \\param[in] numberOfBitsToSerialize The number of bits to write\n\t/// \\param[in] rightAlignedBits if true data will be right aligned\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\tbool SerializeBits(bool writeToBitstream, unsigned char* inOutByteArray, const BitSize_t numberOfBitsToSerialize, const bool rightAlignedBits = true );\n\n\t/// \\brief Write any integral type to a bitstream.  \n\t/// \\details Undefine __BITSTREAM_NATIVE_END if you need endian swapping.\n\t/// \\param[in] inTemplateVar The value to write\n\ttemplate <class templateType>\n\tvoid Write(const templateType &inTemplateVar);\n\n\t/// \\brief Write the dereferenced pointer to any integral type to a bitstream.  \n\t/// \\details Undefine __BITSTREAM_NATIVE_END if you need endian swapping.\n\t/// \\param[in] inTemplateVar The value to write\n\ttemplate <class templateType>\n\tvoid WritePtr(templateType *inTemplateVar);\n\n\t/// \\brief Write any integral type to a bitstream.  \n\t/// \\details If the current value is different from the last value\n\t/// the current value will be written.  Otherwise, a single bit will be written\n\t/// \\param[in] currentValue The current value to write\n\t/// \\param[in] lastValue The last value to compare against\n\ttemplate <class templateType>\n\tvoid WriteDelta(const templateType &currentValue, const templateType &lastValue);\n\n\t/// \\brief WriteDelta when you don't know what the last value is, or there is no last value.\n\t/// \\param[in] currentValue The current value to write\n\ttemplate <class templateType>\n\tvoid WriteDelta(const templateType &currentValue);\n\n\t/// \\brief Write any integral type to a bitstream.  \n\t/// \\details Undefine __BITSTREAM_NATIVE_END if you need endian swapping.\n\t/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n\t/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n\t/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n\t/// \\param[in] inTemplateVar The value to write\n\ttemplate <class templateType>\n\tvoid WriteCompressed(const templateType &inTemplateVar);\n\n\t/// \\brief Write any integral type to a bitstream.  \n\t/// \\details If the current value is different from the last value\n\t/// the current value will be written.  Otherwise, a single bit will be written\n\t/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n\t/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n\t/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n\t/// \\param[in] currentValue The current value to write\n\t/// \\param[in] lastValue The last value to compare against\n\ttemplate <class templateType>\n\tvoid WriteCompressedDelta(const templateType &currentValue, const templateType &lastValue);\n\n\t/// \\brief Save as WriteCompressedDelta(const templateType &currentValue, const templateType &lastValue) when we have an unknown second parameter\n\ttemplate <class templateType>\n\tvoid WriteCompressedDelta(const templateType &currentValue);\n\n\t/// \\brief Read any integral type from a bitstream.  \n\t/// \\details Define __BITSTREAM_NATIVE_END if you need endian swapping.\n\t/// \\param[in] outTemplateVar The value to read\n\t/// \\return true on success, false on failure.\n\ttemplate <class templateType>\n\tbool Read(templateType &outTemplateVar);\n\n\t/// \\brief Read any integral type from a bitstream.  \n\t/// \\details If the written value differed from the value compared against in the write function,\n\t/// var will be updated.  Otherwise it will retain the current value.\n\t/// ReadDelta is only valid from a previous call to WriteDelta\n\t/// \\param[in] outTemplateVar The value to read\n\t/// \\return true on success, false on failure.\n\ttemplate <class templateType>\n\tbool ReadDelta(templateType &outTemplateVar);\n\n\t/// \\brief Read any integral type from a bitstream.  \n\t/// \\details Undefine __BITSTREAM_NATIVE_END if you need endian swapping.\n\t/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n\t/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n\t/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n\t/// \\param[in] outTemplateVar The value to read\n\t/// \\return true on success, false on failure.\n\ttemplate <class templateType>\n\tbool ReadCompressed(templateType &outTemplateVar);\n\n\t/// \\brief Read any integral type from a bitstream.  \n\t/// \\details If the written value differed from the value compared against in the write function,\n\t/// var will be updated.  Otherwise it will retain the current value.\n\t/// the current value will be updated.\n\t/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n\t/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n\t/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n\t/// ReadCompressedDelta is only valid from a previous call to WriteDelta\n\t/// \\param[in] outTemplateVar The value to read\n\t/// \\return true on success, false on failure.\n\ttemplate <class templateType>\n\tbool ReadCompressedDelta(templateType &outTemplateVar);\n\n\t/// \\brief Read one bitstream to another.\n\t/// \\param[in] numberOfBits bits to read\n\t/// \\param bitStream the bitstream to read into from\n\t/// \\return true on success, false on failure.\n\tbool Read( BitStream *bitStream, BitSize_t numberOfBits );\n\tbool Read( BitStream *bitStream );\n\tbool Read( BitStream &bitStream, BitSize_t numberOfBits );\n\tbool Read( BitStream &bitStream );\n\n\t/// \\brief Write an array or casted stream or raw data.  This does NOT do endian swapping.\n\t/// \\param[in] inputByteArray a byte buffer\n\t/// \\param[in] numberOfBytes the size of \\a input in bytes\n\tvoid Write( const char* inputByteArray, const unsigned int numberOfBytes );\n\n\t/// \\brief Write one bitstream to another.\n\t/// \\param[in] numberOfBits bits to write\n\t/// \\param bitStream the bitstream to copy from\n\tvoid Write( BitStream *bitStream, BitSize_t numberOfBits );\n\tvoid Write( BitStream *bitStream );\n\tvoid Write( BitStream &bitStream, BitSize_t numberOfBits );\n\tvoid Write( BitStream &bitStream );\\\n\n\t/// \\brief Write a float into 2 bytes, spanning the range between \\a floatMin and \\a floatMax\n\t/// \\param[in] x The float to write\n\t/// \\param[in] floatMin Predetermined minimum value of f\n\t/// \\param[in] floatMax Predetermined maximum value of f\n\tvoid WriteFloat16( float x, float floatMin, float floatMax );\n\n\t/// Write one type serialized as another (smaller) type, to save bandwidth\n\t/// serializationType should be uint8_t, uint16_t, uint24_t, or uint32_t\n\t/// Example: int num=53; WriteCasted<uint8_t>(num); would use 1 byte to write what would otherwise be an integer (4 or 8 bytes)\n\t/// \\param[in] value The value to write\n\ttemplate <class serializationType, class sourceType >\n\tvoid WriteCasted( const sourceType &value );\n\n\t/// Given the minimum and maximum values for an integer type, figure out the minimum number of bits to represent the range\n\t/// Then write only those bits\n\t/// \\note A static is used so that the required number of bits for (maximum-minimum) is only calculated once. This does require that \\a minimum and \\maximum are fixed values for a given line of code for the life of the program\n\t/// \\param[in] value Integer value to write, which should be between \\a minimum and \\a maximum\n\t/// \\param[in] minimum Minimum value of \\a value\n\t/// \\param[in] maximum Maximum value of \\a value\n\t/// \\param[in] allowOutsideRange If true, all sends will take an extra bit, however value can deviate from outside \\a minimum and \\a maximum. If false, will assert if the value deviates. This should match the corresponding value passed to Read().\n\ttemplate <class templateType>\n\tvoid WriteBitsFromIntegerRange( const templateType value, const templateType minimum, const templateType maximum, bool allowOutsideRange=false );\n\t/// \\param[in] requiredBits Primarily for internal use, called from above function() after calculating number of bits needed to represent maximum-minimum\n\ttemplate <class templateType>\n\tvoid WriteBitsFromIntegerRange( const templateType value, const templateType minimum, const templateType maximum, const int requiredBits, bool allowOutsideRange=false );\n\n\t/// \\brief Write a normalized 3D vector, using (at most) 4 bytes + 3 bits instead of 12-24 bytes.  \n\t/// \\details Will further compress y or z axis aligned vectors.\n\t/// Accurate to 1/32767.5.\n\t/// \\param[in] x x\n\t/// \\param[in] y y\n\t/// \\param[in] z z\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tvoid WriteNormVector( templateType x, templateType y, templateType z );\n\n\t/// \\brief Write a vector, using 10 bytes instead of 12.\n\t/// \\details Loses accuracy to about 3/10ths and only saves 2 bytes, \n\t/// so only use if accuracy is not important.\n\t/// \\param[in] x x\n\t/// \\param[in] y y\n\t/// \\param[in] z z\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tvoid WriteVector( templateType x, templateType y, templateType z );\n\n\t/// \\brief Write a normalized quaternion in 6 bytes + 4 bits instead of 16 bytes.  Slightly lossy.\n\t/// \\param[in] w w\n\t/// \\param[in] x x\n\t/// \\param[in] y y\n\t/// \\param[in] z z\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tvoid WriteNormQuat( templateType w, templateType x, templateType y, templateType z);\n\n\t/// \\brief Write an orthogonal matrix by creating a quaternion, and writing 3 components of the quaternion in 2 bytes each.\n\t/// \\details Use 6 bytes instead of 36\n\t/// Lossy, although the result is renormalized\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tvoid WriteOrthMatrix(\n\t\ttemplateType m00, templateType m01, templateType m02,\n\t\ttemplateType m10, templateType m11, templateType m12,\n\t\ttemplateType m20, templateType m21, templateType m22 );\n\n\t/// \\brief Read an array or casted stream of byte.\n\t/// \\details The array is raw data. There is no automatic endian conversion with this function\n\t/// \\param[in] output The result byte array. It should be larger than @em numberOfBytes.\n\t/// \\param[in] numberOfBytes The number of byte to read\n\t/// \\return true on success false if there is some missing bytes.\n\tbool Read( char* output, const unsigned int numberOfBytes );\n\n\t/// \\brief Read a float into 2 bytes, spanning the range between \\a floatMin and \\a floatMax\n\t/// \\param[in] outFloat The float to read\n\t/// \\param[in] floatMin Predetermined minimum value of f\n\t/// \\param[in] floatMax Predetermined maximum value of f\n\tbool ReadFloat16( float &outFloat, float floatMin, float floatMax );\n\n\t/// Read one type serialized to another (smaller) type, to save bandwidth\n\t/// serializationType should be uint8_t, uint16_t, uint24_t, or uint32_t\n\t/// Example: int num; ReadCasted<uint8_t>(num); would read 1 bytefrom the stream, and put the value in an integer\n\t/// \\param[in] value The value to write\n\ttemplate <class serializationType, class sourceType >\n\tbool ReadCasted( sourceType &value );\n\n\t/// Given the minimum and maximum values for an integer type, figure out the minimum number of bits to represent the range\n\t/// Then read only those bits\n\t/// \\note A static is used so that the required number of bits for (maximum-minimum) is only calculated once. This does require that \\a minimum and \\maximum are fixed values for a given line of code for the life of the program\n\t/// \\param[in] value Integer value to read, which should be between \\a minimum and \\a maximum\n\t/// \\param[in] minimum Minimum value of \\a value\n\t/// \\param[in] maximum Maximum value of \\a value\n\t/// \\param[in] allowOutsideRange If true, all sends will take an extra bit, however value can deviate from outside \\a minimum and \\a maximum. If false, will assert if the value deviates. This should match the corresponding value passed to Write().\n\ttemplate <class templateType>\n\tbool ReadBitsFromIntegerRange( templateType &value, const templateType minimum, const templateType maximum, bool allowOutsideRange=false );\n\t/// \\param[in] requiredBits Primarily for internal use, called from above function() after calculating number of bits needed to represent maximum-minimum\n\ttemplate <class templateType>\n\tbool ReadBitsFromIntegerRange( templateType &value, const templateType minimum, const templateType maximum, const int requiredBits, bool allowOutsideRange=false );\n\n\t/// \\brief Read a normalized 3D vector, using (at most) 4 bytes + 3 bits instead of 12-24 bytes.  \n\t/// \\details Will further compress y or z axis aligned vectors.\n\t/// Accurate to 1/32767.5.\n\t/// \\param[in] x x\n\t/// \\param[in] y y\n\t/// \\param[in] z z\n\t/// \\return true on success, false on failure.\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tbool ReadNormVector( templateType &x, templateType &y, templateType &z );\n\n\t/// \\brief Read 3 floats or doubles, using 10 bytes, where those float or doubles comprise a vector.\n\t/// \\details Loses accuracy to about 3/10ths and only saves 2 bytes, \n\t/// so only use if accuracy is not important.\n\t/// \\param[in] x x\n\t/// \\param[in] y y\n\t/// \\param[in] z z\n\t/// \\return true on success, false on failure.\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tbool ReadVector( templateType &x, templateType &y, templateType &z );\n\n\t/// \\brief Read a normalized quaternion in 6 bytes + 4 bits instead of 16 bytes.\n\t/// \\param[in] w w\n\t/// \\param[in] x x\n\t/// \\param[in] y y\n\t/// \\param[in] z z\n\t/// \\return true on success, false on failure.\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tbool ReadNormQuat( templateType &w, templateType &x, templateType &y, templateType &z);\n\n\t/// \\brief Read an orthogonal matrix from a quaternion, reading 3 components of the quaternion in 2 bytes each and extrapolatig the 4th.\n\t/// \\details Use 6 bytes instead of 36\n\t/// Lossy, although the result is renormalized\n\t/// \\return true on success, false on failure.\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tbool ReadOrthMatrix(\n\t\ttemplateType &m00, templateType &m01, templateType &m02,\n\t\ttemplateType &m10, templateType &m11, templateType &m12,\n\t\ttemplateType &m20, templateType &m21, templateType &m22 );\n\n\t/// \\brief Sets the read pointer back to the beginning of your data.\n\tvoid ResetReadPointer( void );\n\n\t/// \\brief Sets the write pointer back to the beginning of your data.\n\tvoid ResetWritePointer( void );\n\n\t/// \\brief This is good to call when you are done with the stream to make\n\t/// sure you didn't leave any data left over void\n\tvoid AssertStreamEmpty( void );\n\n\t/// \\brief RAKNET_DEBUG_PRINTF the bits in the stream.  Great for debugging.\n\tvoid PrintBits( char *out ) const;\n\tvoid PrintBits( void ) const;\n\tvoid PrintHex( char *out ) const;\n\tvoid PrintHex( void ) const;\n\n\t/// \\brief Ignore data we don't intend to read\n\t/// \\param[in] numberOfBits The number of bits to ignore\n\tvoid IgnoreBits( const BitSize_t numberOfBits );\n\n\t/// \\brief Ignore data we don't intend to read\n\t/// \\param[in] numberOfBits The number of bytes to ignore\n\tvoid IgnoreBytes( const unsigned int numberOfBytes );\n\n\t/// \\brief Move the write pointer to a position on the array.\n\t/// \\param[in] offset the offset from the start of the array.\n\t/// \\attention\n\t/// \\details Dangerous if you don't know what you are doing!\n\t/// For efficiency reasons you can only write mid-stream if your data is byte aligned.\n\tvoid SetWriteOffset( const BitSize_t offset );\n\n\t/// \\brief Returns the length in bits of the stream\n\tinline BitSize_t GetNumberOfBitsUsed( void ) const {return GetWriteOffset();}\n\tinline BitSize_t GetWriteOffset( void ) const {return numberOfBitsUsed;}\n\n\t/// \\brief Returns the length in bytes of the stream\n\tinline BitSize_t GetNumberOfBytesUsed( void ) const {return BITS_TO_BYTES( numberOfBitsUsed );}\n\n\t/// \\brief Returns the number of bits into the stream that we have read\n\tinline BitSize_t GetReadOffset( void ) const {return readOffset;}\n\n\t/// \\brief Sets the read bit index\n\tvoid SetReadOffset( const BitSize_t newReadOffset ) {readOffset=newReadOffset;}\n\n\t/// \\brief Returns the number of bits left in the stream that haven't been read\n\tinline BitSize_t GetNumberOfUnreadBits( void ) const {return numberOfBitsUsed - readOffset;}\n\n\t/// \\brief Makes a copy of the internal data for you \\a _data will point to\n\t/// the stream. Partial bytes are left aligned.\n\t/// \\param[out] _data The allocated copy of GetData()\n\t/// \\return The length in bits of the stream.\n\tBitSize_t CopyData( unsigned char** _data ) const;\n\n\t/// \\internal\n\t/// Set the stream to some initial data.\n\tvoid SetData( unsigned char *inByteArray );\n\n\t/// Gets the data that BitStream is writing to / reading from.\n\t/// Partial bytes are left aligned.\n\t/// \\return A pointer to the internal state\n\tinline char* GetData( void ) const {return (char*) data;}\n\n\t/// \\brief Write numberToWrite bits from the input source.\n\t/// \\details Right aligned data means in the case of a partial byte, the bits are aligned\n\t/// from the right (bit 0) rather than the left (as in the normal\n\t/// internal representation) You would set this to true when\n\t/// writing user data, and false when copying bitstream data, such\n\t/// as writing one bitstream to another.\n\t/// \\param[in] inByteArray The data\n\t/// \\param[in] numberOfBitsToWrite The number of bits to write\n\t/// \\param[in] rightAlignedBits if true data will be right aligned\n\tvoid WriteBits( const unsigned char* inByteArray, BitSize_t numberOfBitsToWrite, const bool rightAlignedBits = true );\n\n\t/// \\brief Align the bitstream to the byte boundary and then write the\n\t/// specified number of bits.  \n\t/// \\details This is faster than WriteBits but\n\t/// wastes the bits to do the alignment and requires you to call\n\t/// ReadAlignedBits at the corresponding read position.\n\t/// \\param[in] inByteArray The data\n\t/// \\param[in] numberOfBytesToWrite The size of input.\n\tvoid WriteAlignedBytes( const unsigned char *inByteArray, const unsigned int numberOfBytesToWrite );\n\n\t// Endian swap bytes already in the bitstream\n\tvoid EndianSwapBytes( int byteOffset, int length );\n\n\t/// \\brief Aligns the bitstream, writes inputLength, and writes input. Won't write beyond maxBytesToWrite\n\t/// \\param[in] inByteArray The data\n\t/// \\param[in] inputLength The size of input.\n\t/// \\param[in] maxBytesToWrite Max bytes to write\n\tvoid WriteAlignedBytesSafe( const char *inByteArray, const unsigned int inputLength, const unsigned int maxBytesToWrite );\n\n\t/// \\brief Read bits, starting at the next aligned bits. \n\t/// \\details Note that the modulus 8 starting offset of the sequence must be the same as\n\t/// was used with WriteBits. This will be a problem with packet\n\t/// coalescence unless you byte align the coalesced packets.\n\t/// \\param[in] inOutByteArray The byte array larger than @em numberOfBytesToRead\n\t/// \\param[in] numberOfBytesToRead The number of byte to read from the internal state\n\t/// \\return true if there is enough byte.\n\tbool ReadAlignedBytes( unsigned char *inOutByteArray, const unsigned int numberOfBytesToRead );\n\n\t/// \\brief Reads what was written by WriteAlignedBytesSafe.\n\t/// \\param[in] inOutByteArray The data\n\t/// \\param[in] maxBytesToRead Maximum number of bytes to read\n\t/// \\return true on success, false on failure.\n\tbool ReadAlignedBytesSafe( char *inOutByteArray, int &inputLength, const int maxBytesToRead );\n\tbool ReadAlignedBytesSafe( char *inOutByteArray, unsigned int &inputLength, const unsigned int maxBytesToRead );\n\n\t/// \\brief Same as ReadAlignedBytesSafe() but allocates the memory for you using new, rather than assuming it is safe to write to\n\t/// \\param[in] outByteArray outByteArray will be deleted if it is not a pointer to 0\n\t/// \\return true on success, false on failure.\n\tbool ReadAlignedBytesSafeAlloc( char **outByteArray, int &inputLength, const unsigned int maxBytesToRead );\n\tbool ReadAlignedBytesSafeAlloc( char **outByteArray, unsigned int &inputLength, const unsigned int maxBytesToRead );\n\n\t/// \\brief Align the next write and/or read to a byte boundary.  \n\t/// \\details This can be used to 'waste' bits to byte align for efficiency reasons It\n\t/// can also be used to force coalesced bitstreams to start on byte\n\t/// boundaries so so WriteAlignedBits and ReadAlignedBits both\n\t/// calculate the same offset when aligning.\n\tinline void AlignWriteToByteBoundary( void ) {numberOfBitsUsed += 8 - ( (( numberOfBitsUsed - 1 ) & 7) + 1 );}\n\n\t/// \\brief Align the next write and/or read to a byte boundary.  \n\t/// \\details This can be used to 'waste' bits to byte align for efficiency reasons It\n\t/// can also be used to force coalesced bitstreams to start on byte\n\t/// boundaries so so WriteAlignedBits and ReadAlignedBits both\n\t/// calculate the same offset when aligning.\n\tinline void AlignReadToByteBoundary( void ) {readOffset += 8 - ( (( readOffset - 1 ) & 7 ) + 1 );}\n\n\t/// \\brief Read \\a numberOfBitsToRead bits to the output source.\n\t/// \\details alignBitsToRight should be set to true to convert internal\n\t/// bitstream data to userdata. It should be false if you used\n\t/// WriteBits with rightAlignedBits false\n\t/// \\param[in] inOutByteArray The resulting bits array\n\t/// \\param[in] numberOfBitsToRead The number of bits to read\n\t/// \\param[in] alignBitsToRight if true bits will be right aligned.\n\t/// \\return true if there is enough bits to read\n\tbool ReadBits( unsigned char *inOutByteArray, BitSize_t numberOfBitsToRead, const bool alignBitsToRight = true );\n\n\t/// \\brief Write a 0\n\tvoid Write0( void );\n\n\t/// \\brief Write a 1\n\tvoid Write1( void );\n\n\t/// \\brief Reads 1 bit and returns true if that bit is 1 and false if it is 0.\n\tbool ReadBit( void );\n\n\t/// \\brief If we used the constructor version with copy data off, this\n\t/// *makes sure it is set to on and the data pointed to is copied.\n\tvoid AssertCopyData( void );\n\n\t/// \\brief Use this if you pass a pointer copy to the constructor\n\t/// *(_copyData==false) and want to overallocate to prevent\n\t/// reallocation.\n\tvoid SetNumberOfBitsAllocated( const BitSize_t lengthInBits );\n\n\t/// \\brief Reallocates (if necessary) in preparation of writing numberOfBitsToWrite\n\tvoid AddBitsAndReallocate( const BitSize_t numberOfBitsToWrite );\n\n\t/// \\internal\n\t/// \\return How many bits have been allocated internally\n\tBitSize_t GetNumberOfBitsAllocated(void) const;\n\n\t/// Write zeros until the bitstream is filled up to \\a bytes\n\tvoid PadWithZeroToByteLength( unsigned int bytes );\n\n\t/// Get the number of leading zeros for a number\n\t/// \\param[in] x Number to test\n\tstatic int NumberOfLeadingZeroes( uint8_t x );\n\tstatic int NumberOfLeadingZeroes( uint16_t x );\n\tstatic int NumberOfLeadingZeroes( uint32_t x );\n\tstatic int NumberOfLeadingZeroes( uint64_t x );\n\tstatic int NumberOfLeadingZeroes( int8_t x );\n\tstatic int NumberOfLeadingZeroes( int16_t x );\n\tstatic int NumberOfLeadingZeroes( int32_t x );\n\tstatic int NumberOfLeadingZeroes( int64_t x );\n\n\t/// \\internal Unrolled inner loop, for when performance is critical\n\tvoid WriteAlignedVar8(const char *inByteArray);\n\t/// \\internal Unrolled inner loop, for when performance is critical\n\tbool ReadAlignedVar8(char *inOutByteArray);\n\t/// \\internal Unrolled inner loop, for when performance is critical\n\tvoid WriteAlignedVar16(const char *inByteArray);\n\t/// \\internal Unrolled inner loop, for when performance is critical\n\tbool ReadAlignedVar16(char *inOutByteArray);\n\t/// \\internal Unrolled inner loop, for when performance is critical\n\tvoid WriteAlignedVar32(const char *inByteArray);\n\t/// \\internal Unrolled inner loop, for when performance is critical\n\tbool ReadAlignedVar32(char *inOutByteArray);\n\n\tinline void Write(const char * const inStringVar)\n\t{\n\t\tuint16_t l = (uint16_t) OVR_strlen(inStringVar);\n\t\tWrite(l);\n\t\tWriteAlignedBytes((const unsigned char*) inStringVar, (const unsigned int) l);\n\t}\n\tinline void Write(const unsigned char * const inTemplateVar)\n\t{\n\t\tWrite((const char*)inTemplateVar);\n\t}\n\tinline void Write(char * const inTemplateVar)\n\t{\n\t\tWrite((const char*)inTemplateVar);\n\t}\n\tinline void Write(unsigned char * const inTemplateVar)\n\t{\n\t\tWrite((const char*)inTemplateVar);\n\t}\n\n\t/// ---- Member function template specialization declarations ----\n\t// Used for VC7\n#if defined(OVR_CC_MSVC) && _MSC_VER == 1300\n\t/// Write a bool to a bitstream.\n\t/// \\param[in] var The value to write\n\ttemplate <>\n\tvoid Write(const bool &var);\n\n\t/// Write a RakNetGUID to a bitsteam\n\t/// \\param[in] var The value to write\n\ttemplate <>\n\tvoid Write(const RakNetGuid &var);\n\n\t/// Write a string to a bitstream\n\t/// \\param[in] var The value to write\n\ttemplate <>\n\tvoid Write(const char* const &var);\n\ttemplate <>\n\tvoid Write(const unsigned char* const &var);\n\ttemplate <>\n\tvoid Write(char* const &var);\n\ttemplate <>\n\tvoid Write(unsigned char* const &var);\n\ttemplate <>\n\tvoid Write(const OVR::String &var);\n\n\t/// \\brief Write a bool delta.  \n\t/// \\details Same thing as just calling Write\n\t/// \\param[in] currentValue The current value to write\n\t/// \\param[in] lastValue The last value to compare against\n\ttemplate <>\n\tvoid WriteDelta(const bool &currentValue, const bool &lastValue);\n\n\ttemplate <>\n\tvoid WriteCompressed(const bool &var);\n\n\t/// For values between -1 and 1\n\ttemplate <>\n\tvoid WriteCompressed(const float &var);\n\n\t/// For values between -1 and 1\n\ttemplate <>\n\tvoid WriteCompressed(const double &var);\n\t\n\t/// \\brief Write a bool delta.  \n\t/// \\details Same thing as just calling Write\n\t/// \\param[in] currentValue The current value to write\n\t/// \\param[in] lastValue The last value to compare against\n\ttemplate <>\n\tvoid WriteCompressedDelta(const bool &currentValue, const bool &lastValue);\n\n\t/// \\brief Save as WriteCompressedDelta(bool currentValue, const templateType &lastValue) \n\t/// when we have an unknown second bool\n\ttemplate <>\n\tvoid WriteCompressedDelta(const bool &currentValue);\n\n\t/// \\brief Read a bool from a bitstream.\n\t/// \\param[in] var The value to read\n\t/// \\return true on success, false on failure.\n\ttemplate <>\n\tbool Read(bool &var);\n\n\t/// \\brief Read a String from a bitstream.\n\t/// \\param[in] var The value to read\n\t/// \\return true on success, false on failure.\n\ttemplate <>\n\tbool Read(char *&var);\n\ttemplate <>\n\tbool Read(wchar_t *&var);\n\ttemplate <>\n\tbool Read(unsigned char *&var);\n\n\t/// \\brief Read a bool from a bitstream.\n\t/// \\param[in] var The value to read\n\t/// \\return true on success, false on failure.\n\ttemplate <>\n\tbool ReadDelta(bool &var);\n\n\ttemplate <>\n\tbool ReadCompressed(bool &var);\n\n\ttemplate <>\n\tbool ReadCompressed(float &var);\n\n\t/// For values between -1 and 1\n\t/// \\return true on success, false on failure.\n\ttemplate <>\n\tbool ReadCompressed(double &var);\n\n\ttemplate <>\n\tbool ReadCompressed(char* &var);\n\ttemplate <>\n\tbool ReadCompressed(wchar_t* &var);\n\ttemplate <>\n\tbool ReadCompressed(unsigned char *&var);\n\ttemplate <>\n\tbool ReadCompressed(OVR::String &var);\n\n\t/// \\brief Read a bool from a bitstream.\n\t/// \\param[in] var The value to read\n\t/// \\return true on success, false on failure.\n\ttemplate <>\n\tbool ReadCompressedDelta(bool &var);\n#endif\n\n\tinline static bool DoEndianSwap(void) {\n#ifndef __BITSTREAM_NATIVE_END\n\t\treturn IsNetworkOrder()==false;\n#else\n\t\treturn false;\n#endif\n\t}\n\tinline static bool IsBigEndian(void)\n\t{\n\t\treturn IsNetworkOrder();\n\t}\n\tinline static bool IsNetworkOrder(void) {bool r = IsNetworkOrderInternal(); return r;}\n\t// Not inline, won't compile on PC due to winsock include errors\n\tstatic bool IsNetworkOrderInternal(void);\n\tstatic void ReverseBytes(unsigned char *inByteArray, unsigned char *inOutByteArray, const unsigned int length);\n\tstatic void ReverseBytesInPlace(unsigned char *inOutData,const unsigned int length);\n\nprivate:\n\n\tBitStream( const BitStream & /*invalid*/) : numberOfBitsUsed(0), numberOfBitsAllocated(0), readOffset(0),data(NULL), copyData(false) {\n\t\tOVR_ASSERT(0);\n\t}\n\n\tBitStream& operator = ( const BitStream& /*invalid*/ ) {\n\t\tOVR_ASSERT(0);\n\t\tstatic BitStream i;\n\t\treturn i;\n\t}\n\n\t/// \\brief Assume the input source points to a native type, compress and write it.\n\tvoid WriteCompressed( const unsigned char* inByteArray, const unsigned int size, const bool unsignedData );\n\n\t/// \\brief Assume the input source points to a compressed native type. Decompress and read it.\n\tbool ReadCompressed( unsigned char* inOutByteArray,\tconst unsigned int size, const bool unsignedData );\n\n\n\tBitSize_t numberOfBitsUsed;\n\n\tBitSize_t numberOfBitsAllocated;\n\n\tBitSize_t readOffset;\n\n\tunsigned char *data;\n\n\t/// true if the internal buffer is copy of the data passed to the constructor\n\tbool copyData;\n\n\t/// BitStreams that use less than BITSTREAM_STACK_ALLOCATION_SIZE use the stack, rather than the heap to store data.  It switches over if BITSTREAM_STACK_ALLOCATION_SIZE is exceeded\n\tunsigned char stackData[BITSTREAM_STACK_ALLOCATION_SIZE];\n};\n\ntemplate <class templateType>\ninline bool BitStream::Serialize(bool writeToBitstream, templateType &inOutTemplateVar)\n{\n\tif (writeToBitstream)\n\t\tWrite(inOutTemplateVar);\n\telse\n\t\treturn Read(inOutTemplateVar);\n\treturn true;\n}\n\ntemplate <class templateType>\ninline bool BitStream::SerializeDelta(bool writeToBitstream, templateType &inOutCurrentValue, const templateType &lastValue)\n{\n\tif (writeToBitstream)\n\t\tWriteDelta(inOutCurrentValue, lastValue);\n\telse\n\t\treturn ReadDelta(inOutCurrentValue);\n\treturn true;\n}\n\ntemplate <class templateType>\ninline bool BitStream::SerializeDelta(bool writeToBitstream, templateType &inOutCurrentValue)\n{\n\tif (writeToBitstream)\n\t\tWriteDelta(inOutCurrentValue);\n\telse\n\t\treturn ReadDelta(inOutCurrentValue);\n\treturn true;\n}\n\ntemplate <class templateType>\ninline bool BitStream::SerializeCompressed(bool writeToBitstream, templateType &inOutTemplateVar)\n{\n\tif (writeToBitstream)\n\t\tWriteCompressed(inOutTemplateVar);\n\telse\n\t\treturn ReadCompressed(inOutTemplateVar);\n\treturn true;\n}\n\ntemplate <class templateType>\ninline bool BitStream::SerializeCompressedDelta(bool writeToBitstream, templateType &inOutCurrentValue, const templateType &lastValue)\n{\n\tif (writeToBitstream)\n\t\tWriteCompressedDelta(inOutCurrentValue,lastValue);\n\telse\n\t\treturn ReadCompressedDelta(inOutCurrentValue);\n\treturn true;\n}\n//Stoppedhere\ntemplate <class templateType>\ninline bool BitStream::SerializeCompressedDelta(bool writeToBitstream, templateType &inOutCurrentValue)\n{\n\tif (writeToBitstream)\n\t\tWriteCompressedDelta(inOutCurrentValue);\n\telse\n\t\treturn ReadCompressedDelta(inOutCurrentValue);\n\treturn true;\n}\n\ninline bool BitStream::Serialize(bool writeToBitstream, char* inOutByteArray, const unsigned int numberOfBytes )\n{\n\tif (writeToBitstream)\n\t\tWrite(inOutByteArray, numberOfBytes);\n\telse\n\t\treturn Read(inOutByteArray, numberOfBytes);\n\treturn true;\n}\n\ntemplate <class serializationType, class sourceType >\nbool BitStream::SerializeCasted( bool writeToBitstream, sourceType &value )\n{\n\tif (writeToBitstream) WriteCasted<serializationType>(value);\n\telse return ReadCasted<serializationType>(value);\n\treturn true;\n}\n\ntemplate <class templateType>\nbool BitStream::SerializeBitsFromIntegerRange( bool writeToBitstream, templateType &value, const templateType minimum, const templateType maximum, bool allowOutsideRange )\n{\n\tint requiredBits=BYTES_TO_BITS(sizeof(templateType))-NumberOfLeadingZeroes(templateType(maximum-minimum));\n\treturn SerializeBitsFromIntegerRange(writeToBitstream,value,minimum,maximum,requiredBits,allowOutsideRange);\n}\ntemplate <class templateType>\nbool BitStream::SerializeBitsFromIntegerRange( bool writeToBitstream, templateType &value, const templateType minimum, const templateType maximum, const int requiredBits, bool allowOutsideRange )\n{\n\tif (writeToBitstream) WriteBitsFromIntegerRange(value,minimum,maximum,requiredBits,allowOutsideRange);\n\telse return ReadBitsFromIntegerRange(value,minimum,maximum,requiredBits,allowOutsideRange);\n\treturn true;\n}\n\ntemplate <class templateType>\ninline bool BitStream::SerializeNormVector(bool writeToBitstream, templateType &x, templateType &y, templateType &z )\n{\n\tif (writeToBitstream)\n\t\tWriteNormVector(x,y,z);\n\telse\n\t\treturn ReadNormVector(x,y,z);\n\treturn true;\n}\n\ntemplate <class templateType>\ninline bool BitStream::SerializeVector(bool writeToBitstream,  templateType &x, templateType &y, templateType &z )\n{\n\tif (writeToBitstream)\n\t\tWriteVector(x,y,z);\n\telse\n\t\treturn ReadVector(x,y,z);\n\treturn true;\n}\n\ntemplate <class templateType>\ninline bool BitStream::SerializeNormQuat(bool writeToBitstream,  templateType &w, templateType &x, templateType &y, templateType &z)\n{\n\tif (writeToBitstream)\n\t\tWriteNormQuat(w,x,y,z);\n\telse\n\t\treturn ReadNormQuat(w,x,y,z);\n\treturn true;\n}\n\ntemplate <class templateType>\ninline bool BitStream::SerializeOrthMatrix(\n\tbool writeToBitstream,\n\ttemplateType &m00, templateType &m01, templateType &m02,\n\ttemplateType &m10, templateType &m11, templateType &m12,\n\ttemplateType &m20, templateType &m21, templateType &m22 )\n{\n\tif (writeToBitstream)\n\t\tWriteOrthMatrix(m00,m01,m02,m10,m11,m12,m20,m21,m22);\n\telse\n\t\treturn ReadOrthMatrix(m00,m01,m02,m10,m11,m12,m20,m21,m22);\n\treturn true;\n}\n\ninline bool BitStream::SerializeBits(bool writeToBitstream, unsigned char* inOutByteArray, const BitSize_t numberOfBitsToSerialize, const bool rightAlignedBits )\n{\n\tif (writeToBitstream)\n\t\tWriteBits(inOutByteArray,numberOfBitsToSerialize,rightAlignedBits);\n\telse\n\t\treturn ReadBits(inOutByteArray,numberOfBitsToSerialize,rightAlignedBits);\n\treturn true;\n}\n\ntemplate <class templateType>\ninline void BitStream::Write(const templateType &inTemplateVar)\n{\n#ifdef OVR_CC_MSVC\n#pragma warning(disable:4127)   // conditional expression is constant\n#endif\n\tif (sizeof(inTemplateVar)==1)\n\t\tWriteBits( ( unsigned char* ) & inTemplateVar, sizeof( templateType ) * 8, true );\n\telse\n\t{\n#ifndef __BITSTREAM_NATIVE_END\n\t\tif (DoEndianSwap())\n\t\t{\n\t\t\tunsigned char output[sizeof(templateType)];\n\t\t\tReverseBytes((unsigned char*)&inTemplateVar, output, sizeof(templateType));\n\t\t\tWriteBits( ( unsigned char* ) output, sizeof(templateType) * 8, true );\n\t\t}\n\t\telse\n#endif\n\t\t\tWriteBits( ( unsigned char* ) & inTemplateVar, sizeof(templateType) * 8, true );\n\t}\n}\n\ntemplate <class templateType>\ninline void BitStream::WritePtr(templateType *inTemplateVar)\n{\n#ifdef OVR_CC_MSVC\n#pragma warning(disable:4127)   // conditional expression is constant\n#endif\n\tif (sizeof(templateType)==1)\n\t\tWriteBits( ( unsigned char* ) inTemplateVar, sizeof( templateType ) * 8, true );\n\telse\n\t{\n#ifndef __BITSTREAM_NATIVE_END\n\t\tif (DoEndianSwap())\n\t\t{\n\t\t\tunsigned char output[sizeof(templateType)];\n\t\t\tReverseBytes((unsigned char*) inTemplateVar, output, sizeof(templateType));\n\t\t\tWriteBits( ( unsigned char* ) output, sizeof(templateType) * 8, true );\n\t\t}\n\t\telse\n#endif\n\t\t\tWriteBits( ( unsigned char* ) inTemplateVar, sizeof(templateType) * 8, true );\n\t}\n}\n\n/// \\brief Write a bool to a bitstream.\n/// \\param[in] inTemplateVar The value to write\ntemplate <>\ninline void BitStream::Write(const bool &inTemplateVar)\n{\n\tif ( inTemplateVar )\n\t\tWrite1();\n\telse\n\t\tWrite0();\n}\n\n\n/// \\brief Write a string to a bitstream.\n/// \\param[in] var The value to write\ntemplate <>\ninline void BitStream::Write(const OVR::String &inTemplateVar)\n{\n\tuint16_t l = (uint16_t) inTemplateVar.GetLength();\n\tWrite(l);\n\tWriteAlignedBytes((const unsigned char*) inTemplateVar.ToCStr(), (const unsigned int) l);\n}\ntemplate <>\ninline void BitStream::Write(const char * const &inStringVar)\n{\n\tuint16_t l = (uint16_t) strlen(inStringVar);\n\tWrite(l);\n\tWriteAlignedBytes((const unsigned char*) inStringVar, (const unsigned int) l);\n}\ntemplate <>\ninline void BitStream::Write(const unsigned char * const &inTemplateVar)\n{\n\tWrite((const char*)inTemplateVar);\n}\ntemplate <>\ninline void BitStream::Write(char * const &inTemplateVar)\n{\n\tWrite((const char*)inTemplateVar);\n}\ntemplate <>\ninline void BitStream::Write(unsigned char * const &inTemplateVar)\n{\n\tWrite((const char*)inTemplateVar);\n}\n\n/// \\brief Write any integral type to a bitstream.  \n/// \\details If the current value is different from the last value\n/// the current value will be written.  Otherwise, a single bit will be written\n/// \\param[in] currentValue The current value to write\n/// \\param[in] lastValue The last value to compare against\ntemplate <class templateType>\ninline void BitStream::WriteDelta(const templateType &currentValue, const templateType &lastValue)\n{\n\tif (currentValue==lastValue)\n\t{\n\t\tWrite(false);\n\t}\n\telse\n\t{\n\t\tWrite(true);\n\t\tWrite(currentValue);\n\t}\n}\n\n/// \\brief Write a bool delta. Same thing as just calling Write\n/// \\param[in] currentValue The current value to write\n/// \\param[in] lastValue The last value to compare against\ntemplate <>\ninline void BitStream::WriteDelta(const bool &currentValue, const bool &lastValue)\n{\n\t(void) lastValue;\n\n\tWrite(currentValue);\n}\n\n/// \\brief WriteDelta when you don't know what the last value is, or there is no last value.\n/// \\param[in] currentValue The current value to write\ntemplate <class templateType>\ninline void BitStream::WriteDelta(const templateType &currentValue)\n{\n\tWrite(true);\n\tWrite(currentValue);\n}\n\n/// \\brief Write any integral type to a bitstream.  \n/// \\details Undefine __BITSTREAM_NATIVE_END if you need endian swapping.\n/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n/// \\param[in] inTemplateVar The value to write\ntemplate <class templateType>\ninline void BitStream::WriteCompressed(const templateType &inTemplateVar)\n{\n#ifdef OVR_CC_MSVC\n#pragma warning(disable:4127)   // conditional expression is constant\n#endif\n\tif (sizeof(inTemplateVar)==1)\n\t\tWriteCompressed( ( unsigned char* ) & inTemplateVar, sizeof( templateType ) * 8, true );\n\telse\n\t{\n#ifndef __BITSTREAM_NATIVE_END\n#ifdef OVR_CC_MSVC\n#pragma warning(disable:4244)   // '=' : conversion from 'unsigned long' to 'uint16_t', possible loss of data\n#endif\n\n\t\tif (DoEndianSwap())\n\t\t{\n\t\t\tunsigned char output[sizeof(templateType)];\n\t\t\tReverseBytes((unsigned char*)&inTemplateVar, output, sizeof(templateType));\n\t\t\tWriteCompressed( ( unsigned char* ) output, sizeof(templateType) * 8, true );\n\t\t}\n\t\telse\n#endif\n\t\t\tWriteCompressed( ( unsigned char* ) & inTemplateVar, sizeof(templateType) * 8, true );\n\t}\n}\n\ntemplate <>\ninline void BitStream::WriteCompressed(const bool &inTemplateVar)\n{\n\tWrite(inTemplateVar);\n}\n\n/// For values between -1 and 1\ntemplate <>\ninline void BitStream::WriteCompressed(const float &inTemplateVar)\n{\n\tOVR_ASSERT(inTemplateVar > -1.01f && inTemplateVar < 1.01f);\n\tfloat varCopy=inTemplateVar;\n\tif (varCopy < -1.0f)\n\t\tvarCopy=-1.0f;\n\tif (varCopy > 1.0f)\n\t\tvarCopy=1.0f;\n\tWrite((uint16_t)((varCopy+1.0f)*32767.5f));\n}\n\n/// For values between -1 and 1\ntemplate <>\ninline void BitStream::WriteCompressed(const double &inTemplateVar)\n{\n\tOVR_ASSERT(inTemplateVar > -1.01 && inTemplateVar < 1.01);\n\tdouble varCopy=inTemplateVar;\n\tif (varCopy < -1.0f)\n\t\tvarCopy=-1.0f;\n\tif (varCopy > 1.0f)\n\t\tvarCopy=1.0f;\n\tWrite((uint32_t)((varCopy+1.0)*2147483648.0));\n}\n\n/// \\brief Write any integral type to a bitstream.  \n/// \\details If the current value is different from the last value\n/// the current value will be written.  Otherwise, a single bit will be written\n/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n/// \\param[in] currentValue The current value to write\n/// \\param[in] lastValue The last value to compare against\ntemplate <class templateType>\ninline void BitStream::WriteCompressedDelta(const templateType &currentValue, const templateType &lastValue)\n{\n\tif (currentValue==lastValue)\n\t{\n\t\tWrite(false);\n\t}\n\telse\n\t{\n\t\tWrite(true);\n\t\tWriteCompressed(currentValue);\n\t}\n}\n\n/// \\brief Write a bool delta.  Same thing as just calling Write\n/// \\param[in] currentValue The current value to write\n/// \\param[in] lastValue The last value to compare against\ntemplate <>\ninline void BitStream::WriteCompressedDelta(const bool &currentValue, const bool &lastValue)\n{\n\t(void) lastValue;\n\n\tWrite(currentValue);\n}\n\n/// \\brief Save as WriteCompressedDelta(const templateType &currentValue, const templateType &lastValue) \n/// when we have an unknown second parameter\ntemplate <class templateType>\ninline void BitStream::WriteCompressedDelta(const templateType &currentValue)\n{\n\tWrite(true);\n\tWriteCompressed(currentValue);\n}\n\n/// \\brief Save as WriteCompressedDelta(bool currentValue, const templateType &lastValue) \n/// when we have an unknown second bool\ntemplate <>\ninline void BitStream::WriteCompressedDelta(const bool &currentValue)\n{\n\tWrite(currentValue);\n}\n\n/// \\brief Read any integral type from a bitstream.  Define __BITSTREAM_NATIVE_END if you need endian swapping.\n/// \\param[in] outTemplateVar The value to read\ntemplate <class templateType>\ninline bool BitStream::Read(templateType &outTemplateVar)\n{\n#ifdef OVR_CC_MSVC\n#pragma warning(disable:4127)   // conditional expression is constant\n#endif\n\tif (sizeof(outTemplateVar)==1)\n\t\treturn ReadBits( ( unsigned char* ) &outTemplateVar, sizeof(templateType) * 8, true );\n\telse\n\t{\n#ifndef __BITSTREAM_NATIVE_END\n#ifdef OVR_CC_MSVC\n#pragma warning(disable:4244)   // '=' : conversion from 'unsigned long' to 'uint16_t', possible loss of data\n#endif\n\t\tif (DoEndianSwap())\n\t\t{\n\t\t\tunsigned char output[sizeof(templateType)];\n\t\t\tif (ReadBits( ( unsigned char* ) output, sizeof(templateType) * 8, true ))\n\t\t\t{\n\t\t\t\tReverseBytes(output, (unsigned char*)&outTemplateVar, sizeof(templateType));\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\telse\n#endif\n\t\t\treturn ReadBits( ( unsigned char* ) & outTemplateVar, sizeof(templateType) * 8, true );\n\t}\n}\n\n/// \\brief Read a bool from a bitstream.\n/// \\param[in] outTemplateVar The value to read\ntemplate <>\ninline bool BitStream::Read(bool &outTemplateVar)\n{\n\tif ( readOffset + 1 > numberOfBitsUsed )\n\t\treturn false;\n\n\tif ( data[ readOffset >> 3 ] & ( 0x80 >> ( readOffset & 7 ) ) )   // Is it faster to just write it out here?\n\t\toutTemplateVar = true;\n\telse\n\t\toutTemplateVar = false;\n\n\t// Has to be on a different line for Mac\n\treadOffset++;\n\n\treturn true;\n}\n\ntemplate <>\ninline bool BitStream::Read(OVR::String &outTemplateVar)\n{\n\tbool b;\n\tuint16_t l;\n\tb=Read(l);\n\tif (b && l>0)\n\t{\n\t\tAlignReadToByteBoundary();\n\t\toutTemplateVar.AssignString((const char*) (data + ( readOffset >> 3 )), (size_t) l);\n\t\tIgnoreBytes(l);\n\t}\n\telse\n\t{\n\t\tAlignReadToByteBoundary();\n\t}\n\treturn b;\n}\ntemplate <>\ninline bool BitStream::Read(char *&varString)\n{\n\tbool b;\n\tuint16_t l;\n\tb=Read(l);\n\tif (b && l>0)\n\t{\n\t\tmemcpy(varString, data + ( readOffset >> 3 ), l);\n\t\tIgnoreBytes(l);\n\t}\n\telse\n\t{\n\t\tAlignReadToByteBoundary();\n\t}\n\treturn b;\n}\ntemplate <>\ninline bool BitStream::Read(unsigned char *&varString)\n{\n\tbool b;\n\tuint16_t l;\n\tb=Read(l);\n\tif (b && l>0)\n\t{\n\t\tmemcpy(varString, data + ( readOffset >> 3 ), l);\n\t\tIgnoreBytes(l);\n\t}\n\telse\n\t{\n\t\tAlignReadToByteBoundary();\n\t}\n\treturn b;\n}\n\n/// \\brief Read any integral type from a bitstream.  \n/// \\details If the written value differed from the value compared against in the write function,\n/// var will be updated.  Otherwise it will retain the current value.\n/// ReadDelta is only valid from a previous call to WriteDelta\n/// \\param[in] outTemplateVar The value to read\ntemplate <class templateType>\ninline bool BitStream::ReadDelta(templateType &outTemplateVar)\n{\n\tbool dataWritten;\n\tbool success;\n\tsuccess=Read(dataWritten);\n\tif (dataWritten)\n\t\tsuccess=Read(outTemplateVar);\n\treturn success;\n}\n\n/// \\brief Read a bool from a bitstream.\n/// \\param[in] outTemplateVar The value to read\ntemplate <>\ninline bool BitStream::ReadDelta(bool &outTemplateVar)\n{\n\treturn Read(outTemplateVar);\n}\n\n/// \\brief Read any integral type from a bitstream.  \n/// \\details Undefine __BITSTREAM_NATIVE_END if you need endian swapping.\n/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n/// \\param[in] outTemplateVar The value to read\ntemplate <class templateType>\ninline bool BitStream::ReadCompressed(templateType &outTemplateVar)\n{\n#ifdef OVR_CC_MSVC\n#pragma warning(disable:4127)   // conditional expression is constant\n#endif\n\tif (sizeof(outTemplateVar)==1)\n\t\treturn ReadCompressed( ( unsigned char* ) &outTemplateVar, sizeof(templateType) * 8, true );\n\telse\n\t{\n#ifndef __BITSTREAM_NATIVE_END\n\t\tif (DoEndianSwap())\n\t\t{\n\t\t\tunsigned char output[sizeof(templateType)];\n\t\t\tif (ReadCompressed( ( unsigned char* ) output, sizeof(templateType) * 8, true ))\n\t\t\t{\n\t\t\t\tReverseBytes(output, (unsigned char*)&outTemplateVar, sizeof(templateType));\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\telse\n#endif\n\t\t\treturn ReadCompressed( ( unsigned char* ) & outTemplateVar, sizeof(templateType) * 8, true );\n\t}\n}\n\ntemplate <>\ninline bool BitStream::ReadCompressed(bool &outTemplateVar)\n{\n\treturn Read(outTemplateVar);\n}\n\n/// For values between -1 and 1\ntemplate <>\ninline bool BitStream::ReadCompressed(float &outTemplateVar)\n{\n\tuint16_t compressedFloat;\n\tif (Read(compressedFloat))\n\t{\n\t\toutTemplateVar = ((float)compressedFloat / 32767.5f - 1.0f);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/// For values between -1 and 1\ntemplate <>\ninline bool BitStream::ReadCompressed(double &outTemplateVar)\n{\n\tuint32_t compressedFloat;\n\tif (Read(compressedFloat))\n\t{\n\t\toutTemplateVar = ((double)compressedFloat / 2147483648.0 - 1.0);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/// \\brief Read any integral type from a bitstream.  \n/// \\details If the written value differed from the value compared against in the write function,\n/// var will be updated.  Otherwise it will retain the current value.\n/// the current value will be updated.\n/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n/// ReadCompressedDelta is only valid from a previous call to WriteDelta\n/// \\param[in] outTemplateVar The value to read\ntemplate <class templateType>\ninline bool BitStream::ReadCompressedDelta(templateType &outTemplateVar)\n{\n\tbool dataWritten;\n\tbool success;\n\tsuccess=Read(dataWritten);\n\tif (dataWritten)\n\t\tsuccess=ReadCompressed(outTemplateVar);\n\treturn success;\n}\n\n/// \\brief Read a bool from a bitstream.\n/// \\param[in] outTemplateVar The value to read\ntemplate <>\ninline bool BitStream::ReadCompressedDelta(bool &outTemplateVar)\n{\n\treturn Read(outTemplateVar);\n}\n\ntemplate <class destinationType, class sourceType >\nvoid BitStream::WriteCasted( const sourceType &value )\n{\n\tdestinationType val = (destinationType) value;\n\tWrite(val);\n}\n\ntemplate <class templateType>\nvoid BitStream::WriteBitsFromIntegerRange( const templateType value, const templateType minimum,const templateType maximum, bool allowOutsideRange )\n{\n\tint requiredBits=BYTES_TO_BITS(sizeof(templateType))-NumberOfLeadingZeroes(templateType(maximum-minimum));\n\tWriteBitsFromIntegerRange(value,minimum,maximum,requiredBits,allowOutsideRange);\n}\ntemplate <class templateType>\nvoid BitStream::WriteBitsFromIntegerRange( const templateType value, const templateType minimum,const templateType maximum, const int requiredBits, bool allowOutsideRange )\n{\n\tOVR_ASSERT(maximum>=minimum);\n\tOVR_ASSERT(allowOutsideRange==true || (value>=minimum && value<=maximum));\n\tif (allowOutsideRange)\n\t{\n\t\tif (value<minimum || value>maximum)\n\t\t{\n\t\t\tWrite(true);\n\t\t\tWrite(value);\n\t\t\treturn;\n\t\t}\n\t\tWrite(false);\n\t}\n\ttemplateType valueOffMin=value-minimum;\n\tif (IsBigEndian()==true)\n\t{\n\t\tunsigned char output[sizeof(templateType)];\n\t\tReverseBytes((unsigned char*)&valueOffMin, output, sizeof(templateType));\n\t\tWriteBits(output,requiredBits);\n\t}\n\telse\n\t{\n\t\tWriteBits((unsigned char*) &valueOffMin,requiredBits);\n\t}\n}\n\ntemplate <class templateType> // templateType for this function must be a float or double\nvoid BitStream::WriteNormVector( templateType x, templateType y, templateType z )\n{\n#ifdef _DEBUG\n\tOVR_ASSERT(x <= 1.01 && y <= 1.01 && z <= 1.01 && x >= -1.01 && y >= -1.01 && z >= -1.01);\n#endif\n\n\tWriteFloat16((float)x,-1.0f,1.0f);\n\tWriteFloat16((float)y,-1.0f,1.0f);\n\tWriteFloat16((float)z,-1.0f,1.0f);\n}\n\ntemplate <class templateType> // templateType for this function must be a float or double\nvoid BitStream::WriteVector( templateType x, templateType y, templateType z )\n{\n\ttemplateType magnitude = sqrt(x * x + y * y + z * z);\n\tWrite((float)magnitude);\n\tif (magnitude > 0.00001f)\n\t{\n\t\tWriteCompressed((float)(x/magnitude));\n\t\tWriteCompressed((float)(y/magnitude));\n\t\tWriteCompressed((float)(z/magnitude));\n\t\t//\tWrite((uint16_t)((x/magnitude+1.0f)*32767.5f));\n\t\t//\tWrite((uint16_t)((y/magnitude+1.0f)*32767.5f));\n\t\t//\tWrite((uint16_t)((z/magnitude+1.0f)*32767.5f));\n\t}\n}\n\ntemplate <class templateType> // templateType for this function must be a float or double\nvoid BitStream::WriteNormQuat( templateType w, templateType x, templateType y, templateType z)\n{\n\tWrite((bool)(w<0.0));\n\tWrite((bool)(x<0.0));\n\tWrite((bool)(y<0.0));\n\tWrite((bool)(z<0.0));\n\tWrite((uint16_t)(fabs(x)*65535.0));\n\tWrite((uint16_t)(fabs(y)*65535.0));\n\tWrite((uint16_t)(fabs(z)*65535.0));\n\t// Leave out w and calculate it on the target\n}\n\ntemplate <class templateType> // templateType for this function must be a float or double\nvoid BitStream::WriteOrthMatrix(\n\ttemplateType m00, templateType m01, templateType m02,\n\ttemplateType m10, templateType m11, templateType m12,\n\ttemplateType m20, templateType m21, templateType m22 )\n{\n\n\tdouble qw;\n\tdouble qx;\n\tdouble qy;\n\tdouble qz;\n\n\t// Convert matrix to quat\n\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/\n\tfloat sum;\n\tsum = 1 + m00 + m11 + m22;\n\tif (sum < 0.0f) sum=0.0f;\n\tqw = sqrt( sum  ) / 2;\n\tsum = 1 + m00 - m11 - m22;\n\tif (sum < 0.0f) sum=0.0f;\n\tqx = sqrt( sum  ) / 2;\n\tsum = 1 - m00 + m11 - m22;\n\tif (sum < 0.0f) sum=0.0f;\n\tqy = sqrt( sum  ) / 2;\n\tsum = 1 - m00 - m11 + m22;\n\tif (sum < 0.0f) sum=0.0f;\n\tqz = sqrt( sum  ) / 2;\n\tif (qw < 0.0) qw=0.0;\n\tif (qx < 0.0) qx=0.0;\n\tif (qy < 0.0) qy=0.0;\n\tif (qz < 0.0) qz=0.0;\n#ifdef OVR_OS_WIN32\n\tqx = _copysign( (double) qx, (double) (m21 - m12) );\n\tqy = _copysign( (double) qy, (double) (m02 - m20) );\n\tqz = _copysign( (double) qz, (double) (m10 - m01) );\n#else\n\tqx = copysign( (double) qx, (double) (m21 - m12) );\n\tqy = copysign( (double) qy, (double) (m02 - m20) );\n\tqz = copysign( (double) qz, (double) (m10 - m01) );\n#endif\n\n\tWriteNormQuat(qw,qx,qy,qz);\n}\n\ntemplate <class serializationType, class sourceType >\nbool BitStream::ReadCasted( sourceType &value )\n{\n\tserializationType val;\n\tbool success = Read(val);\n\tvalue=(sourceType) val;\n\treturn success;\n}\n\ntemplate <class templateType>\nbool BitStream::ReadBitsFromIntegerRange( templateType &value, const templateType minimum, const templateType maximum, bool allowOutsideRange )\n{\n\tint requiredBits=BYTES_TO_BITS(sizeof(templateType))-NumberOfLeadingZeroes(templateType(maximum-minimum));\n\treturn ReadBitsFromIntegerRange(value,minimum,maximum,requiredBits,allowOutsideRange);\n}\ntemplate <class templateType>\nbool BitStream::ReadBitsFromIntegerRange( templateType &value, const templateType minimum, const templateType maximum, const int requiredBits, bool allowOutsideRange )\n{\n\tOVR_ASSERT_AND_UNUSED(maximum>=minimum, maximum);\n\tif (allowOutsideRange)\n\t{\n\t\tbool isOutsideRange;\n\t\tRead(isOutsideRange);\n\t\tif (isOutsideRange)\n\t\t\treturn Read(value);\n\t}\n\tunsigned char output[sizeof(templateType)];\n\tmemset(output,0,sizeof(output));\n\tbool success = ReadBits(output,requiredBits);\n\tif (success)\n\t{\n\t\tif (IsBigEndian()==true)\n\t\t\tReverseBytesInPlace(output,sizeof(output));\n\t\tmemcpy(&value,output,sizeof(output));\n\n\t\tvalue+=minimum;\n\t}\n\n\treturn success;\n}\n\ntemplate <class templateType> // templateType for this function must be a float or double\nbool BitStream::ReadNormVector( templateType &x, templateType &y, templateType &z )\n{\n\tfloat xIn,yIn,zIn;\n\tReadFloat16(xIn,-1.0f,1.0f);\n\tReadFloat16(yIn,-1.0f,1.0f);\n\tReadFloat16(zIn,-1.0f,1.0f);\n\tx=xIn;\n\ty=yIn;\n\tz=zIn;\n\treturn true;\n}\n\ntemplate <class templateType> // templateType for this function must be a float or double\nbool BitStream::ReadVector( templateType &x, templateType &y, templateType &z )\n{\n\tfloat magnitude;\n\t//uint16_t sx,sy,sz;\n\tif (!Read(magnitude))\n\t\treturn false;\n\tif (magnitude>0.00001f)\n\t{\n\t\t//\tRead(sx);\n\t\t//\tRead(sy);\n\t\t//\tif (!Read(sz))\n\t\t//\t\treturn false;\n\t\t//\tx=((float)sx / 32767.5f - 1.0f) * magnitude;\n\t\t//\ty=((float)sy / 32767.5f - 1.0f) * magnitude;\n\t\t//\tz=((float)sz / 32767.5f - 1.0f) * magnitude;\n\t\tfloat cx=0.0f,cy=0.0f,cz=0.0f;\n\t\tReadCompressed(cx);\n\t\tReadCompressed(cy);\n\t\tif (!ReadCompressed(cz))\n\t\t\treturn false;\n\t\tx=cx;\n\t\ty=cy;\n\t\tz=cz;\n\t\tx*=magnitude;\n\t\ty*=magnitude;\n\t\tz*=magnitude;\n\t}\n\telse\n\t{\n\t\tx=0.0;\n\t\ty=0.0;\n\t\tz=0.0;\n\t}\n\treturn true;\n}\n\ntemplate <class templateType> // templateType for this function must be a float or double\nbool BitStream::ReadNormQuat( templateType &w, templateType &x, templateType &y, templateType &z)\n{\n\tbool cwNeg=false, cxNeg=false, cyNeg=false, czNeg=false;\n\tuint16_t cx,cy,cz;\n\tRead(cwNeg);\n\tRead(cxNeg);\n\tRead(cyNeg);\n\tRead(czNeg);\n\tRead(cx);\n\tRead(cy);\n\tif (!Read(cz))\n\t\treturn false;\n\n\t// Calculate w from x,y,z\n\tx=(templateType)(cx/65535.0);\n\ty=(templateType)(cy/65535.0);\n\tz=(templateType)(cz/65535.0);\n\tif (cxNeg) x=-x;\n\tif (cyNeg) y=-y;\n\tif (czNeg) z=-z;\n\tfloat difference = 1.0f - x*x - y*y - z*z;\n\tif (difference < 0.0f)\n\t\tdifference=0.0f;\n\tw = (templateType)(sqrt(difference));\n\tif (cwNeg)\n\t\tw=-w;\n\n\treturn true;\n}\n\ntemplate <class templateType> // templateType for this function must be a float or double\nbool BitStream::ReadOrthMatrix(\n\ttemplateType &m00, templateType &m01, templateType &m02,\n\ttemplateType &m10, templateType &m11, templateType &m12,\n\ttemplateType &m20, templateType &m21, templateType &m22 )\n{\n\tfloat qw,qx,qy,qz;\n\tif (!ReadNormQuat(qw,qx,qy,qz))\n\t\treturn false;\n\n\t// Quat to orthogonal rotation matrix\n\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/index.htm\n\tdouble sqw = (double)qw*(double)qw;\n\tdouble sqx = (double)qx*(double)qx;\n\tdouble sqy = (double)qy*(double)qy;\n\tdouble sqz = (double)qz*(double)qz;\n\tm00 =  (templateType)(sqx - sqy - sqz + sqw); // since sqw + sqx + sqy + sqz =1\n\tm11 = (templateType)(-sqx + sqy - sqz + sqw);\n\tm22 = (templateType)(-sqx - sqy + sqz + sqw);\n\n\tdouble tmp1 = (double)qx*(double)qy;\n\tdouble tmp2 = (double)qz*(double)qw;\n\tm10 = (templateType)(2.0 * (tmp1 + tmp2));\n\tm01 = (templateType)(2.0 * (tmp1 - tmp2));\n\n\ttmp1 = (double)qx*(double)qz;\n\ttmp2 = (double)qy*(double)qw;\n\tm20 =(templateType)(2.0 * (tmp1 - tmp2));\n\tm02 = (templateType)(2.0 * (tmp1 + tmp2));\n\ttmp1 = (double)qy*(double)qz;\n\ttmp2 = (double)qx*(double)qw;\n\tm21 = (templateType)(2.0 * (tmp1 + tmp2));\n\tm12 = (templateType)(2.0 * (tmp1 - tmp2));\n\n\treturn true;\n}\n\ntemplate <class templateType>\nBitStream& operator<<(BitStream& out, templateType& c)\n{\n\tout.Write(c);\n\treturn out;\n}\ntemplate <class templateType>\nBitStream& operator>>(BitStream& in, templateType& c)\n{\n\tbool success = in.Read(c);\n\t(void)success;\n\n\tOVR_ASSERT(success);\n\treturn in;\n}\n\n\n}} // OVR::Net\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Net/OVR_MessageIDTypes.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_MessageIDTypes.h\nContent     :   Enumeration list indicating what type of message is being sent\nCreated     :   July 3, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\nnamespace OVR { namespace Net {\n\n/// First byte of a network message\ntypedef unsigned char MessageID;\n\nenum DefaultMessageIDTypes\n{\n    OVRID_RPC1,\n    OVRID_END = 128,\n    OVRID_LATENCY_TESTER_1,\n};\n\n}} // namespace OVR::Net\n"
  },
  {
    "path": "externals/ovr/Src/Net/OVR_NetworkPlugin.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_NetworkPlugin.cpp\nContent     :   Base class for an extension to the network objects.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_NetworkPlugin.h\"\n\nnamespace OVR { namespace Net { namespace Plugins {\n\n\n//-----------------------------------------------------------------------------\n// Plugin identifier to assign next\n\n//static uint8_t pluginIdNext = 0;\n\n\n//-----------------------------------------------------------------------------\n// NetworkPlugin\n\nNetworkPlugin::NetworkPlugin()\n{\n\tpSession = 0;\n\t//PluginId = pluginIdNext++;\n}\n\nNetworkPlugin::~NetworkPlugin()\n{\n}\n\nvoid NetworkPlugin::OnAddedToSession(Session* _pSession)\n{\n\tif (pSession != 0)\n\t{\n\t\tpSession->RemoveSessionListener(this);\n\t}\n\n\tpSession = _pSession;\n}\n\nvoid NetworkPlugin::OnRemovedFromSession(Session* _pSession)\n{\n\tOVR_UNUSED(_pSession);\n\tOVR_ASSERT(_pSession == pSession);\n\n\tpSession = 0;\n}\n\n\n}}} // OVR::Net::Plugins\n"
  },
  {
    "path": "externals/ovr/Src/Net/OVR_NetworkPlugin.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_NetworkPlugin.h\nContent     :   Base class for an extension to the network objects.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_NetworkPlugin_h\n#define OVR_NetworkPlugin_h\n\n#include \"OVR_Session.h\"\n\nnamespace OVR { namespace Net { namespace Plugins {\n\n\n//-----------------------------------------------------------------------------\n// NetworkPlugin\n\n// NetworkPlugins use Session and SessionListener to provide network functionality\n// independent of the transport medium.\n// Uses the chain of command design pattern such that plugins can invoke or intercept\n// network events via the Session.\nclass NetworkPlugin : public SessionListener\n{\npublic:\n\tNetworkPlugin();\n\tvirtual ~NetworkPlugin();\n\nprotected:\n\tvirtual void OnAddedToSession(Session* _pSession);\n\tvirtual void OnRemovedFromSession(Session* _pSession);\n\n\tSession *pSession;\n\t//uint8_t PluginId;\n};\n\n\n}}} // OVR::Net::Plugins\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Net/OVR_NetworkTypes.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_NetworkTypes.h\nContent     :   Shared header for network types\nCreated     :   June 12, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_NetworkTypes_h\n#define OVR_NetworkTypes_h\n\n#include \"../Kernel/OVR_Types.h\"\n\nnamespace OVR {\tnamespace Net {\n\n\ntypedef uint64_t NetworkID;\nconst NetworkID InvalidNetworkID = ~((NetworkID)0);\n\n\n} } // OVR::Net\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Net/OVR_PacketizedTCPSocket.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_PacketizedTCPSocket.cpp\nContent     :   TCP with automated message framing.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_PacketizedTCPSocket.h\"\n\nnamespace OVR { namespace Net {\n\n\n//-----------------------------------------------------------------------------\n// Constants\n\nstatic const int LENGTH_FIELD_BYTES = 4;\n\n\n//-----------------------------------------------------------------------------\n// PacketizedTCPSocket\n\nPacketizedTCPSocket::PacketizedTCPSocket()\n{\n\tpRecvBuff = 0;\n\tpRecvBuffSize = 0;\n\tTransport = TransportType_PacketizedTCP;\n}\n\nPacketizedTCPSocket::PacketizedTCPSocket(SocketHandle _sock, bool isListenSocket) : PacketizedTCPSocketBase(_sock, isListenSocket)\n{\n\tpRecvBuff = 0;\n\tpRecvBuffSize = 0;\n\tTransport = TransportType_PacketizedTCP;\n}\n\nPacketizedTCPSocket::~PacketizedTCPSocket()\n{\n\tOVR_FREE(pRecvBuff);\n}\n\nint PacketizedTCPSocket::Send(const void* pData, int bytes)\n{\n    Lock::Locker locker(&sendLock);\n\n\tif (bytes <= 0)\n\t{\n\t\treturn -1;\n\t}\n\n\t// Convert length to 4 endian-neutral bytes\n\tuint32_t lengthWord = bytes;\n\tuint8_t lengthBytes[LENGTH_FIELD_BYTES] = {\n\t\t(uint8_t)lengthWord,\n\t\t(uint8_t)(lengthWord >> 8),\n\t\t(uint8_t)(lengthWord >> 16),\n\t\t(uint8_t)(lengthWord >> 24)\n\t};\n\n\tint s = PacketizedTCPSocketBase::Send(lengthBytes, LENGTH_FIELD_BYTES);\n\tif (s > 0)\n\t{\n\t\treturn PacketizedTCPSocketBase::Send(pData,bytes);\n\t}\n\telse\n\t{\n\t\treturn s;\n\t}\n}\n\nint PacketizedTCPSocket::SendAndConcatenate(const void** pDataArray, int* dataLengthArray, int arrayCount)\n{\n    Lock::Locker locker(&sendLock);\n\n    if (arrayCount == 0)\n\t\treturn 0;\n\n\tint totalBytes = 0;\n\tfor (int i = 0; i < arrayCount; i++)\n\t\ttotalBytes += dataLengthArray[i];\n\n\t// Convert length to 4 endian-neutral bytes\n\tuint32_t lengthWord = totalBytes;\n\tuint8_t lengthBytes[LENGTH_FIELD_BYTES] = {\n\t\t(uint8_t)lengthWord,\n\t\t(uint8_t)(lengthWord >> 8),\n\t\t(uint8_t)(lengthWord >> 16),\n\t\t(uint8_t)(lengthWord >> 24)\n\t};\n\n\tint s = PacketizedTCPSocketBase::Send(lengthBytes, LENGTH_FIELD_BYTES);\n\tif (s > 0)\n\t{\n\t\tfor (int i = 0; i < arrayCount; i++)\n\t\t{\n\t\t\tPacketizedTCPSocketBase::Send(pDataArray[i], dataLengthArray[i]);\n\t\t}\n\t}\n\n\treturn s;\n}\n\nvoid PacketizedTCPSocket::OnRecv(SocketEvent_TCP* eventHandler, uint8_t* pData, int bytesRead)\n{\n\tuint8_t* dataSource = NULL;\n\tint dataSourceSize = 0;\n\n\trecvBuffLock.DoLock();\n\n\tif (pRecvBuff == NULL)\n\t{\n\t\tdataSource = pData;\n\t\tdataSourceSize = bytesRead;\n\t}\n\telse\n\t{\n\t\tuint8_t* pRecvBuffNew = (uint8_t*)OVR_REALLOC(pRecvBuff, bytesRead + pRecvBuffSize);\n\t\tif (!pRecvBuffNew)\n\t\t{\n\t\t\tOVR_FREE(pRecvBuff);\n\t\t\tpRecvBuff = NULL;\n\t\t\tpRecvBuffSize = 0;\n\t\t\trecvBuffLock.Unlock();\n\t\t\treturn;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpRecvBuff = pRecvBuffNew;\n\n\t\t\tmemcpy(pRecvBuff + pRecvBuffSize, pData, bytesRead);\n\n\t\t\tdataSourceSize = pRecvBuffSize + bytesRead;\n\t\t\tdataSource = pRecvBuff;\n\t\t}\n\t}\n\n\tint bytesReadFromStream;\n\twhile (bytesReadFromStream = BytesFromStream(dataSource, dataSourceSize),\n\t\t   LENGTH_FIELD_BYTES + bytesReadFromStream <= dataSourceSize)\n\t{\n\t\tdataSource += LENGTH_FIELD_BYTES;\n\t\tdataSourceSize -= LENGTH_FIELD_BYTES;\n\n\t\tTCPSocket::OnRecv(eventHandler, dataSource, bytesReadFromStream);\n\n\t\tdataSource += bytesReadFromStream;\n\t\tdataSourceSize -= bytesReadFromStream;\n\t}\n\n\tif (dataSourceSize > 0)\n\t{\n        if (dataSource != NULL)\n        {\n            if (pRecvBuff == NULL)\n            {\n                pRecvBuff = (uint8_t*)OVR_ALLOC(dataSourceSize);\n                if (!pRecvBuff)\n                {\n                    pRecvBuffSize = 0;\n                    recvBuffLock.Unlock();\n                    return;\n                }\n                else\n                {\n                    memcpy(pRecvBuff, dataSource, dataSourceSize);\n                }\n            }\n            else\n            {\n                memmove(pRecvBuff, dataSource, dataSourceSize);\n            }\n        }\n\t}\n\telse\n\t{\n\t\tif (pRecvBuff != NULL)\n\t\t\tOVR_FREE(pRecvBuff);\n\n\t\tpRecvBuff = NULL;\n\t}\n\tpRecvBuffSize = dataSourceSize;\n\n\trecvBuffLock.Unlock();\n}\n\nint PacketizedTCPSocket::BytesFromStream(uint8_t* pData, int bytesRead)\n{\n\tif (pData != 0 && bytesRead >= LENGTH_FIELD_BYTES)\n\t{\n\t\treturn pData[0] | ((uint32_t)pData[1] << 8) | ((uint32_t)pData[2] << 16) | ((uint32_t)pData[3] << 24);\n\t}\n\n\treturn 0;\n}\n\n\n}} // OVR::Net\n"
  },
  {
    "path": "externals/ovr/Src/Net/OVR_PacketizedTCPSocket.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_PacketizedTCPSocket.cpp\nContent     :   TCP with automated message framing.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_PacketizedTCPSocket_h\n#define OVR_PacketizedTCPSocket_h\n\n#include \"OVR_Socket.h\"\n#include \"../Kernel/OVR_Allocator.h\"\n#include \"../Kernel/OVR_Atomic.h\"\n\n#ifdef OVR_OS_WIN32\n#include \"OVR_Win32_Socket.h\"\n#else\n#include \"OVR_Unix_Socket.h\"\n#endif\n\nnamespace OVR { namespace Net {\n\n\n//-----------------------------------------------------------------------------\n// NetworkPlugin\n\n// Packetized TCP base socket\nclass PacketizedTCPSocketBase : public TCPSocket\n{\npublic:\n\tPacketizedTCPSocketBase() {}\n\tPacketizedTCPSocketBase(SocketHandle _sock, bool isListenSocket) : TCPSocket(_sock, isListenSocket) {}\n};\n\n\n//-----------------------------------------------------------------------------\n// PacketizedTCPSocket\n\n// Uses TCP but is message aligned rather than stream aligned\n// Alternative to reliable UDP\nclass PacketizedTCPSocket : public PacketizedTCPSocketBase\n{\npublic:\n\tPacketizedTCPSocket();\n\tPacketizedTCPSocket(SocketHandle _sock, bool isListenSocket);\n\tvirtual ~PacketizedTCPSocket();\n\npublic:\n\tvirtual int Send(const void* pData, int bytes);\n\tvirtual int SendAndConcatenate(const void** pDataArray, int *dataLengthArray, int arrayCount);\n\nprotected:\n\tvirtual void OnRecv(SocketEvent_TCP* eventHandler, uint8_t* pData, int bytesRead);\n\n\tint BytesFromStream(uint8_t* pData, int bytesRead);\n\n    Lock   sendLock;\n    Lock   recvBuffLock;\n\n\tuint8_t* pRecvBuff;     // Queued receive buffered data\n\tint    pRecvBuffSize; // Size of receive queue in bytes\n};\n\n\n}} // OVR::Net\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Net/OVR_RPC1.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_RPC1.cpp\nContent     :   A network plugin that provides remote procedure call functionality.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_RPC1.h\"\n#include \"OVR_BitStream.h\"\n#include \"../Kernel/OVR_Threads.h\" // Thread::MSleep\n#include \"OVR_MessageIDTypes.h\"\n\nnamespace OVR { namespace Net { namespace Plugins {\n\n\n//-----------------------------------------------------------------------------\n// Types\n\nenum {\n\tID_RPC4_SIGNAL,\n\tCALL_BLOCKING,\n\tRPC_ERROR_FUNCTION_NOT_REGISTERED,\n\tID_RPC4_RETURN,\n};\n\n\n//-----------------------------------------------------------------------------\n// RPC1\n\nRPC1::RPC1()\n{\n\tblockingOnThisConnection = 0;\n\tblockingReturnValue = new BitStream();\n}\n\nRPC1::~RPC1()\n{\n\tslotHash.Clear();\n\tdelete blockingReturnValue;\n}\n\nvoid RPC1::RegisterSlot(OVR::String sharedIdentifier,  OVR::Observer<RPCSlot>* rpcSlotObserver )\n{\n\tslotHash.AddObserverToSubject(sharedIdentifier, rpcSlotObserver);\n}\n\nbool RPC1::RegisterBlockingFunction(OVR::String uniqueID, RPCDelegate blockingFunction)\n{\n\tif (registeredBlockingFunctions.Get(uniqueID))\n\t\treturn false;\n\n\tregisteredBlockingFunctions.Set(uniqueID, blockingFunction);\n\treturn true;\n}\n\nvoid RPC1::UnregisterBlockingFunction(OVR::String uniqueID)\n{\n\tregisteredBlockingFunctions.Remove(uniqueID);\n}\n\nbool RPC1::CallBlocking( OVR::String uniqueID, OVR::Net::BitStream* bitStream, Ptr<Connection> pConnection, OVR::Net::BitStream* returnData )\n{\n    // If invalid parameters,\n    if (!pConnection)\n    {\n        // Note: This may happen if the endpoint disconnects just before the call\n        return false;\n    }\n\n\tOVR::Net::BitStream out;\n\tout.Write((MessageID) OVRID_RPC1);\n\tout.Write((MessageID) CALL_BLOCKING);\n\tout.Write(uniqueID);\n\tif (bitStream)\n\t{\n\t\tbitStream->ResetReadPointer();\n\t\tout.AlignWriteToByteBoundary();\n\t\tout.Write(bitStream);\n\t}\n\n\tSendParameters sp(pConnection, out.GetData(), out.GetNumberOfBytesUsed());\n\n    if (returnData)\n    {\n        returnData->Reset();\n    }\n\n    // Only one thread call at a time\n    Lock::Locker singleRPCLocker(&singleRPCLock);\n\n    // Note this does not prevent multiple calls at a time because .Wait will unlock it below.\n    // The purpose of this mutex is to synchronize the polling thread and this one, not prevent\n    // multiple threads from invoking RPC.\n    Mutex::Locker locker(&callBlockingMutex);\n\n    blockingReturnValue->Reset();\n    blockingOnThisConnection = pConnection;\n\n    int bytesSent = pSession->Send(&sp);\n    if (bytesSent == sp.Bytes)\n    {\n        while (blockingOnThisConnection == pConnection)\n        {\n            callBlockingWait.Wait(&callBlockingMutex);\n        }\n    }\n\telse\n\t{\n\t\treturn false;\n\t}\n\n    if (returnData)\n    {\n        returnData->Write(blockingReturnValue);\n        returnData->ResetReadPointer();\n    }\n\n\treturn true;\n}\n\nbool RPC1::Signal(OVR::String sharedIdentifier, OVR::Net::BitStream* bitStream, Ptr<Connection> pConnection)\n{\n\tOVR::Net::BitStream out;\n\tout.Write((MessageID) OVRID_RPC1);\n\tout.Write((MessageID) ID_RPC4_SIGNAL);\n\t//out.Write(PluginId);\n\tout.Write(sharedIdentifier);\n\tif (bitStream)\n\t{\n\t\tbitStream->ResetReadPointer();\n\t\tout.AlignWriteToByteBoundary();\n\t\tout.Write(bitStream);\n\t}\n\tSendParameters sp(pConnection, out.GetData(), out.GetNumberOfBytesUsed());\n\tint32_t bytesSent = pSession->Send(&sp);\n\treturn bytesSent == sp.Bytes;\n}\nvoid RPC1::BroadcastSignal(OVR::String sharedIdentifier, OVR::Net::BitStream* bitStream)\n{\n    OVR::Net::BitStream out;\n    out.Write((MessageID) OVRID_RPC1);\n    out.Write((MessageID) ID_RPC4_SIGNAL);\n    //out.Write(PluginId);\n    out.Write(sharedIdentifier);\n    if (bitStream)\n    {\n        bitStream->ResetReadPointer();\n        out.AlignWriteToByteBoundary();\n        out.Write(bitStream);\n    }\n    BroadcastParameters p(out.GetData(), out.GetNumberOfBytesUsed());\n    pSession->Broadcast(&p);\n}\nvoid RPC1::OnReceive(ReceivePayload *pPayload, ListenerReceiveResult *lrrOut)\n{\n\tOVR_UNUSED(lrrOut);\n\n    if (pPayload->pData[0] == OVRID_RPC1)\n    {\n\t\tOVR_ASSERT(pPayload->Bytes >= 2);\n\n\t\tOVR::Net::BitStream bsIn((char*)pPayload->pData, pPayload->Bytes, false);\n\t\tbsIn.IgnoreBytes(2);\n\n        if (pPayload->pData[1] == RPC_ERROR_FUNCTION_NOT_REGISTERED)\n        {\n            Mutex::Locker locker(&callBlockingMutex);\n\n            blockingReturnValue->Reset();\n            blockingOnThisConnection = 0;\n            callBlockingWait.NotifyAll();\n        }\n        else if (pPayload->pData[1] == ID_RPC4_RETURN)\n        {\n            Mutex::Locker locker(&callBlockingMutex);\n\n            blockingReturnValue->Reset();\n\t\t\tblockingReturnValue->Write(bsIn);\n            blockingOnThisConnection = 0;\n            callBlockingWait.NotifyAll();\n\t\t}\n        else if (pPayload->pData[1] == CALL_BLOCKING)\n        {\n\t\t\tOVR::String uniqueId;\n\t\t\tbsIn.Read(uniqueId);\n\n\t\t\tRPCDelegate *bf = registeredBlockingFunctions.Get(uniqueId);\n\t\t\tif (bf==0)\n\t\t\t{\n\t\t\t\tOVR::Net::BitStream bsOut;\n\t\t\t\tbsOut.Write((unsigned char) OVRID_RPC1);\n\t\t\t\tbsOut.Write((unsigned char) RPC_ERROR_FUNCTION_NOT_REGISTERED);\n\n\t\t\t\tSendParameters sp(pPayload->pConnection, bsOut.GetData(), bsOut.GetNumberOfBytesUsed());\n\t\t\t\tpSession->Send(&sp);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tOVR::Net::BitStream returnData;\n\t\t\tbsIn.AlignReadToByteBoundary();\n\t\t\t(*bf)(&bsIn, &returnData, pPayload);\n\n\t\t\tOVR::Net::BitStream out;\n\t\t\tout.Write((MessageID) OVRID_RPC1);\n\t\t\tout.Write((MessageID) ID_RPC4_RETURN);\n\t\t\treturnData.ResetReadPointer();\n\t\t\tout.AlignWriteToByteBoundary();\n\t\t\tout.Write(returnData);\n\n\t\t\tSendParameters sp(pPayload->pConnection, out.GetData(), out.GetNumberOfBytesUsed());\n\t\t\tpSession->Send(&sp);\n\t\t}\n\t\telse if (pPayload->pData[1]==ID_RPC4_SIGNAL)\n\t\t{\n\t\t\tOVR::String sharedIdentifier;\n\t\t\tbsIn.Read(sharedIdentifier);\n\n\t\t\tObserver<RPCSlot> *o = slotHash.GetSubject(sharedIdentifier);\n\n\t\t\tif (o)\n\t\t\t{\n\t\t\t\tbsIn.AlignReadToByteBoundary();\n\n\t\t\t\tif (o)\n\t\t\t\t{\n\t\t\t\t\tOVR::Net::BitStream serializedParameters(bsIn.GetData() + bsIn.GetReadOffset()/8, bsIn.GetNumberOfUnreadBits()/8, false);\n\n\t\t\t\t\to->Call(&serializedParameters, pPayload);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid RPC1::OnDisconnected(Connection* conn)\n{\n    if (blockingOnThisConnection == conn)\n    {\n        blockingOnThisConnection = 0;\n        callBlockingWait.NotifyAll();\n    }\n}\n\nvoid RPC1::OnConnected(Connection* conn)\n{\n    OVR_UNUSED(conn);\n}\n\n\n}}} // OVR::Net::Plugins\n"
  },
  {
    "path": "externals/ovr/Src/Net/OVR_RPC1.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_RPC1.h\nContent     :   A network plugin that provides remote procedure call functionality.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Net_RPC_h\n#define OVR_Net_RPC_h\n\n#include \"OVR_NetworkPlugin.h\"\n#include \"../Kernel/OVR_Hash.h\"\n#include \"../Kernel/OVR_String.h\"\n#include \"OVR_BitStream.h\"\n#include \"../Kernel/OVR_Threads.h\"\n#include \"../Kernel/OVR_Delegates.h\"\n#include \"../Kernel//OVR_Observer.h\"\n\nnamespace OVR { namespace Net { namespace Plugins {\n\n\ntypedef Delegate3<void, BitStream*, BitStream*, ReceivePayload*> RPCDelegate;\ntypedef Delegate2<void, BitStream*, ReceivePayload*> RPCSlot;\n// typedef void ( *Slot ) ( OVR::Net::BitStream *userData, OVR::Net::ReceivePayload *pPayload );\n\n/// NetworkPlugin that maps strings to function pointers. Can invoke the functions using blocking calls with return values, or signal/slots. Networked parameters serialized with BitStream\nclass RPC1 : public NetworkPlugin, public NewOverrideBase\n{\npublic:\n\tRPC1();\n\tvirtual ~RPC1();\n\n\t/// Register a slot, which is a function pointer to one or more implementations that supports this function signature\n\t/// When a signal occurs, all slots with the same identifier are called.\n\t/// \\param[in] sharedIdentifier A string to identify the slot. Recommended to be the same as the name of the function.\n\t/// \\param[in] functionPtr Pointer to the function.\n\t/// \\param[in] callPriority Slots are called by order of the highest callPriority first. For slots with the same priority, they are called in the order they are registered\n\tvoid RegisterSlot(OVR::String sharedIdentifier,  OVR::Observer<RPCSlot> *rpcSlotObserver);\n\n\t/// \\brief Same as \\a RegisterFunction, but is called with CallBlocking() instead of Call() and returns a value to the caller\n\tbool RegisterBlockingFunction(OVR::String uniqueID, RPCDelegate blockingFunction);\n\n\t/// \\brief Same as UnregisterFunction, except for a blocking function\n\tvoid UnregisterBlockingFunction(OVR::String uniqueID);\n\n\t// \\brief Same as call, but don't return until the remote system replies.\n\t/// Broadcasting parameter does not exist, this can only call one remote system\n\t/// \\note This function does not return until the remote system responds, disconnects, or was never connected to begin with\n\t/// \\param[in] Identifier originally passed to RegisterBlockingFunction() on the remote system(s)\n\t/// \\param[in] bitStream bitStream encoded data to send to the function callback\n\t/// \\param[in] pConnection connection to send on\n\t/// \\param[out] returnData Written to by the function registered with RegisterBlockingFunction.\n\t/// \\return true if successfully called. False on disconnect, function not registered, or not connected to begin with\n\tbool CallBlocking( OVR::String uniqueID, OVR::Net::BitStream * bitStream, Ptr<Connection> pConnection, OVR::Net::BitStream *returnData = NULL );\n\n\t/// Calls zero or more functions identified by sharedIdentifier registered with RegisterSlot()\n\t/// \\param[in] sharedIdentifier parameter of the same name passed to RegisterSlot() on the remote system\n\t/// \\param[in] bitStream bitStream encoded data to send to the function callback\n\t/// \\param[in] pConnection connection to send on\n\tbool Signal(OVR::String sharedIdentifier, OVR::Net::BitStream * bitStream, Ptr<Connection> pConnection);\n    void BroadcastSignal(OVR::String sharedIdentifier, OVR::Net::BitStream * bitStream);\n\n\nprotected:\n\tvirtual void OnReceive(ReceivePayload *pPayload, ListenerReceiveResult *lrrOut);\n\n    virtual void OnDisconnected(Connection* conn);\n    virtual void OnConnected(Connection* conn);\n\n\tHash< String, RPCDelegate, String::HashFunctor > registeredBlockingFunctions;\n\tObserverHash< RPCSlot > slotHash;\n\n    // Synchronization for RPC caller\n    Lock            singleRPCLock;\n    Mutex           callBlockingMutex;\n    WaitCondition   callBlockingWait;\n\n    Net::BitStream* blockingReturnValue;\n\tPtr<Connection> blockingOnThisConnection;\n};\n\n\n}}} // OVR::Net::Plugins\n\n#endif // OVR_Net_RPC_h\n"
  },
  {
    "path": "externals/ovr/Src/Net/OVR_Session.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Session.h\nContent     :   One network session that provides connection/disconnection events.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_Session.h\"\n#include \"OVR_PacketizedTCPSocket.h\"\n#include \"../Kernel/OVR_Log.h\"\n#include \"../Service/Service_NetSessionCommon.h\"\n\nnamespace OVR { namespace Net {\n\n\n//-----------------------------------------------------------------------------\n// Protocol\n\nstatic const char* OfficialHelloString = \"OculusVR_Hello\";\nstatic const char* OfficialAuthorizedString = \"OculusVR_Authorized\";\n\nvoid RPC_C2S_Hello::Generate(Net::BitStream* bs)\n{\n    RPC_C2S_Hello hello;\n    hello.HelloString = OfficialHelloString;\n    hello.MajorVersion = RPCVersion_Major;\n    hello.MinorVersion = RPCVersion_Minor;\n    hello.PatchVersion = RPCVersion_Patch;\n    hello.Serialize(bs);\n}\n\nbool RPC_C2S_Hello::Validate()\n{\n    return MajorVersion == RPCVersion_Major &&\n           MinorVersion <= RPCVersion_Minor &&\n           HelloString.CompareNoCase(OfficialHelloString) == 0;\n}\n\nvoid RPC_S2C_Authorization::Generate(Net::BitStream* bs, String errorString)\n{\n    RPC_S2C_Authorization auth;\n    if (errorString.IsEmpty())\n    {\n        auth.AuthString = OfficialAuthorizedString;\n    }\n    else\n    {\n        auth.AuthString = errorString;\n    }\n    auth.MajorVersion = RPCVersion_Major;\n    auth.MinorVersion = RPCVersion_Minor;\n    auth.PatchVersion = RPCVersion_Patch;\n    auth.Serialize(bs);\n}\n\nbool RPC_S2C_Authorization::Validate()\n{\n    return AuthString.CompareNoCase(OfficialAuthorizedString) == 0;\n}\n\n\n//-----------------------------------------------------------------------------\n// Session\n\nvoid Session::Shutdown()\n{\n    {\n        Lock::Locker locker(&SocketListenersLock);\n\n        const int count = SocketListeners.GetSizeI();\n        for (int i = 0; i < count; ++i)\n        {\n            SocketListeners[i]->Close();\n        }\n    }\n\n    Lock::Locker locker(&ConnectionsLock);\n\n    const int count = AllConnections.GetSizeI();\n    for (int i = 0; i < count; ++i)\n    {\n        Connection* arrayItem = AllConnections[i].GetPtr();\n\n        if (arrayItem->Transport == TransportType_PacketizedTCP)\n        {\n            PacketizedTCPConnection* ptcp = (PacketizedTCPConnection*)arrayItem;\n\n            ptcp->pSocket->Close();\n        }\n    }\n}\n\nSessionResult Session::Listen(ListenerDescription* pListenerDescription)\n{\n\tif (pListenerDescription->Transport == TransportType_PacketizedTCP)\n\t{\n\t\tBerkleyListenerDescription* bld = (BerkleyListenerDescription*)pListenerDescription;\n\t\tTCPSocket* tcpSocket = (TCPSocket*)bld->BoundSocketToListenWith.GetPtr();\n\n        if (tcpSocket->Listen() < 0)\n        {\n            return SessionResult_ListenFailure;\n        }\n\n\t\tLock::Locker locker(&SocketListenersLock);\n        SocketListeners.PushBack(tcpSocket);\n\t}\n    else if (pListenerDescription->Transport == TransportType_Loopback)\n\t{\n\t\tHasLoopbackListener = true;\n\t}\n    else\n    {\n        OVR_ASSERT(false);\n    }\n\n\treturn SessionResult_OK;\n}\n\nSessionResult Session::Connect(ConnectParameters *cp)\n{\n    if (cp->Transport == TransportType_PacketizedTCP)\n    {\n        ConnectParametersBerkleySocket* cp2 = (ConnectParametersBerkleySocket*)cp;\n        Ptr<PacketizedTCPConnection> c;\n\n        {\n            Lock::Locker locker(&ConnectionsLock);\n\n            int connIndex;\n            Ptr<PacketizedTCPConnection> conn = findConnectionBySocket(AllConnections, cp2->BoundSocketToConnectWith, &connIndex);\n            if (conn)\n            {\n                return SessionResult_AlreadyConnected;\n            }\n\n            TCPSocketBase* tcpSock = (TCPSocketBase*)cp2->BoundSocketToConnectWith.GetPtr();\n\n            int ret = tcpSock->Connect(&cp2->RemoteAddress);\n            if (ret < 0)\n            {\n                return SessionResult_ConnectFailure;\n            }\n\n            Ptr<Connection> newConnection = AllocConnection(cp2->Transport);\n            if (!newConnection)\n            {\n                return SessionResult_ConnectFailure;\n            }\n\n            c = (PacketizedTCPConnection*)newConnection.GetPtr();\n            c->pSocket = (TCPSocket*) cp2->BoundSocketToConnectWith.GetPtr();\n            c->Address = cp2->RemoteAddress;\n            c->Transport = cp2->Transport;\n            c->SetState(Client_Connecting);\n\n            AllConnections.PushBack(c);\n\n        }\n\n        if (cp2->Blocking)\n        {\n            c->WaitOnConnecting();\n        }\n\n        if (c->State == State_Connected)\n        {\n            return SessionResult_OK;\n        }\n        else if (c->State == Client_Connecting)\n        {\n            return SessionResult_ConnectInProgress;\n        }\n        else\n        {\n            return SessionResult_ConnectFailure;\n        }\n    }\n    else if (cp->Transport == TransportType_Loopback)\n\t{\n\t\tif (HasLoopbackListener)\n\t\t{\n            Ptr<Connection> c = AllocConnection(cp->Transport);\n            if (!c)\n            {\n                return SessionResult_ConnectFailure;\n            }\n\n            c->Transport = cp->Transport;\n            c->SetState(State_Connected);\n\n            {\n                Lock::Locker locker(&ConnectionsLock);\n                AllConnections.PushBack(c);\n            }\n\n\t\t\tinvokeSessionEvent(&SessionListener::OnConnectionRequestAccepted, c);\n\t\t}\n\t\telse\n\t\t{\n            OVR_ASSERT(false);\n\t\t}\n\t}\n    else\n    {\n        OVR_ASSERT(false);\n    }\n\n\treturn SessionResult_OK;\n}\n\nSessionResult Session::ListenPTCP(OVR::Net::BerkleyBindParameters *bbp)\n{\n\tPtr<PacketizedTCPSocket> listenSocket = *new OVR::Net::PacketizedTCPSocket();\n    if (listenSocket->Bind(bbp) == INVALID_SOCKET)\n    {\n        return SessionResult_BindFailure;\n    }\n\n\tBerkleyListenerDescription bld;\n\tbld.BoundSocketToListenWith = listenSocket.GetPtr();\n    bld.Transport = TransportType_PacketizedTCP;\n\n    return Listen(&bld);\n}\n\nSessionResult Session::ConnectPTCP(OVR::Net::BerkleyBindParameters* bbp, SockAddr* remoteAddress, bool blocking)\n{\n    ConnectParametersBerkleySocket cp(NULL, remoteAddress, blocking, TransportType_PacketizedTCP);\n    Ptr<PacketizedTCPSocket> connectSocket = *new PacketizedTCPSocket();\n\n\tcp.BoundSocketToConnectWith = connectSocket.GetPtr();\n    if (connectSocket->Bind(bbp) == INVALID_SOCKET)\n    {\n        return SessionResult_BindFailure;\n    }\n\n\treturn Connect(&cp);\n}\n\nPtr<PacketizedTCPConnection> Session::findConnectionBySockAddr(SockAddr* address)\n{\n    const int count = AllConnections.GetSizeI();\n    for (int i = 0; i < count; ++i)\n    {\n        Connection* arrayItem = AllConnections[i].GetPtr();\n\n        if (arrayItem->Transport == TransportType_PacketizedTCP)\n        {\n            PacketizedTCPConnection* conn = (PacketizedTCPConnection*)arrayItem;\n\n            if (conn->Address == *address)\n            {\n                return conn;\n            }\n        }\n    }\n\n    return 0;\n}\n\nint Session::Send(SendParameters *payload)\n{\n\tif (payload->pConnection->Transport == TransportType_Loopback)\n\t{\n\t\tLock::Locker locker(&SessionListenersLock);\n\n        const int count = SessionListeners.GetSizeI();\n        for (int i = 0; i < count; ++i)\n\t\t{\n\t\t\tSessionListener* sl = SessionListeners[i];\n\n            // FIXME: This looks like it needs to be reviewed at some point..\n\t\t\tReceivePayload rp;\n\t\t\trp.Bytes = payload->Bytes;\n\t\t\trp.pConnection = payload->pConnection;\n\t\t\trp.pData = (uint8_t*)payload->pData; // FIXME\n\t\t\tListenerReceiveResult lrr = LRR_CONTINUE;\n\t\t\tsl->OnReceive(&rp, &lrr);\n            if (lrr == LRR_RETURN)\n            {\n                return payload->Bytes;\n            }\n\t\t\telse if (lrr == LRR_BREAK)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\t\n\t\t}\n\n\t\treturn payload->Bytes;\n\t}\n    else if (payload->pConnection->Transport == TransportType_PacketizedTCP)\n\t{\n\t\tPacketizedTCPConnection* conn = (PacketizedTCPConnection*)payload->pConnection.GetPtr();\n\n        return conn->pSocket->Send(payload->pData, payload->Bytes);\n\t}\n    else\n    {\n        OVR_ASSERT(false);\n    }\n\n    return 0;\n}\nvoid Session::Broadcast(BroadcastParameters *payload)\n{\n    SendParameters sp;\n    sp.Bytes=payload->Bytes;\n    sp.pData=payload->pData;\n\n    {\n        Lock::Locker locker(&ConnectionsLock);\n\n        const int connectionCount = FullConnections.GetSizeI();\n        for (int i = 0; i < connectionCount; ++i)\n        {\n            sp.pConnection = FullConnections[i];\n            Send(&sp);\n        }    \n    }\n}\n// DO NOT CALL Poll() FROM MULTIPLE THREADS due to allBlockingTcpSockets being a member\nvoid Session::Poll(bool listeners)\n{\n    allBlockingTcpSockets.Clear();\n\n\tif (listeners)\n\t{\n\t\tLock::Locker locker(&SocketListenersLock);\n\n        const int listenerCount = SocketListeners.GetSizeI();\n        for (int i = 0; i < listenerCount; ++i)\n\t\t{\n            allBlockingTcpSockets.PushBack(SocketListeners[i]);\n\t\t}\n\t}\n\n    {\n        Lock::Locker locker(&ConnectionsLock);\n\n        const int connectionCount = AllConnections.GetSizeI();\n        for (int i = 0; i < connectionCount; ++i)\n        {\n            Connection* arrayItem = AllConnections[i].GetPtr();\n\n            if (arrayItem->Transport == TransportType_PacketizedTCP)\n            {\n                PacketizedTCPConnection* ptcp = (PacketizedTCPConnection*)arrayItem;\n\n                allBlockingTcpSockets.PushBack(ptcp->pSocket);\n            }\n            else\n            {\n                OVR_ASSERT(false);\n            }\n        }\n    }\n\n    const int count = allBlockingTcpSockets.GetSizeI();\n\tif (count > 0)\n\t{\n        TCPSocketPollState state;\n\n        // Add all the sockets for polling,\n        for (int i = 0; i < count; ++i)\n        {\n            Net::TCPSocket* sock = allBlockingTcpSockets[i].GetPtr();\n\n            // If socket handle is invalid,\n            if (sock->GetSocketHandle() == INVALID_SOCKET)\n            {\n                OVR_DEBUG_LOG((\"[Session] Detected an invalid socket handle - Treating it as a disconnection.\"));\n                sock->IsConnecting = false;\n                TCP_OnClosed(sock);\n            }\n            else\n            {\n                state.Add(sock);\n            }\n        }\n\n        // If polling returns with an event,\n        if (state.Poll(allBlockingTcpSockets[0]->GetBlockingTimeoutUsec(), allBlockingTcpSockets[0]->GetBlockingTimeoutSec()))\n        {\n            // Handle any events for each socket\n            for (int i = 0; i < count; ++i)\n            {\n                state.HandleEvent(allBlockingTcpSockets[i], this);\n            }\n        }\n\t}\n}\n\nvoid Session::AddSessionListener(SessionListener* se)\n{\n\tLock::Locker locker(&SessionListenersLock);\n\n    const int count = SessionListeners.GetSizeI();\n    for (int i = 0; i < count; ++i)\n    {\n        if (SessionListeners[i] == se)\n        {\n            // Already added\n            return;\n        }\n    }\n\n    SessionListeners.PushBack(se);\n\tse->OnAddedToSession(this);\n}\n\nvoid Session::RemoveSessionListener(SessionListener* se)\n{\n\tLock::Locker locker(&SessionListenersLock);\n\n    const int count = SessionListeners.GetSizeI();\n\tfor (int i = 0; i < count; ++i)\n\t{\n        if (SessionListeners[i] == se)\n\t\t{\n            se->OnRemovedFromSession(this);\n\n            SessionListeners.RemoveAtUnordered(i);\n            break;\n\t\t}\n\t}\n}\nSInt32 Session::GetActiveSocketsCount()\n{\n    Lock::Locker locker1(&SocketListenersLock);\n    Lock::Locker locker2(&ConnectionsLock);\n    return SocketListeners.GetSize() + AllConnections.GetSize()>0;\n}\nPtr<Connection> Session::AllocConnection(TransportType transport)\n{\n    switch (transport)\n    {\n    case TransportType_Loopback:      return *new Connection();\n    case TransportType_TCP:           return *new TCPConnection();\n    case TransportType_PacketizedTCP: return *new PacketizedTCPConnection();\n    default:\n        OVR_ASSERT(false);\n        break;\n    }\n\n    return NULL;\n}\n\nPtr<PacketizedTCPConnection> Session::findConnectionBySocket(Array< Ptr<Connection> >& connectionArray, Socket* s, int *connectionIndex)\n{\n    const int count = connectionArray.GetSizeI();\n    for (int i = 0; i < count; ++i)\n    {\n        Connection* arrayItem = connectionArray[i].GetPtr();\n\n        if (arrayItem->Transport == TransportType_PacketizedTCP)\n        {\n            PacketizedTCPConnection* ptc = (PacketizedTCPConnection*)arrayItem;\n\n            if (ptc->pSocket == s)\n            {\n                if (connectionIndex)\n                {\n                    *connectionIndex = i;\n                }\n                return ptc;\n            }\n        }\n    }\n\n    return NULL;\n}\n\nint Session::invokeSessionListeners(ReceivePayload* rp)\n{\n    Lock::Locker locker(&SessionListenersLock);\n\n    const int count = SessionListeners.GetSizeI();\n    for (int j = 0; j < count; ++j)\n    {\n        ListenerReceiveResult lrr = LRR_CONTINUE;\n        SessionListeners[j]->OnReceive(rp, &lrr);\n\n        if (lrr == LRR_RETURN || lrr == LRR_BREAK)\n        {\n            break;\n        }\n    }\n\n    return rp->Bytes;\n}\n\nvoid Session::TCP_OnRecv(Socket* pSocket, uint8_t* pData, int bytesRead)\n{\n\t// KevinJ: 9/2/2014 Fix deadlock - Watchdog calls Broadcast(), which locks ConnectionsLock().\n\t// Lock::Locker locker(&ConnectionsLock);\n\n    // Look for the connection in the full connection list first\n    int connIndex;\n\tConnectionsLock.DoLock();\n    Ptr<PacketizedTCPConnection> conn = findConnectionBySocket(AllConnections, pSocket, &connIndex);\n\tConnectionsLock.Unlock();\n    if (conn)\n    {\n        if (conn->State == State_Connected)\n        {\n            ReceivePayload rp;\n            rp.Bytes = bytesRead;\n            rp.pConnection = conn;\n            rp.pData = pData;\n\n            // Call listeners\n            invokeSessionListeners(&rp);\n        }\n        else if (conn->State == Client_ConnectedWait)\n        {\n            // Check the version data from the message\n            BitStream bsIn((char*)pData, bytesRead, false);\n\n            RPC_S2C_Authorization auth;\n            if (!auth.Deserialize(&bsIn) ||\n                !auth.Validate())\n            {\n                LogError(\"{ERR-001} [Session] REJECTED: OVRService did not authorize us: %s\", auth.AuthString.ToCStr());\n\n                conn->SetState(State_Zombie);\n                invokeSessionEvent(&SessionListener::OnIncompatibleProtocol, conn);\n            }\n            else\n            {\n                // Read remote version\n                conn->RemoteMajorVersion = auth.MajorVersion;\n                conn->RemoteMinorVersion = auth.MinorVersion;\n                conn->RemotePatchVersion = auth.PatchVersion;\n\n                // Mark as connected\n                conn->SetState(State_Connected);\n\t\t\t\tConnectionsLock.DoLock();\n\t\t\t\tint connIndex2;\n\t\t\t\tif (findConnectionBySocket(AllConnections, pSocket, &connIndex2)==conn && findConnectionBySocket(FullConnections, pSocket, &connIndex2)==NULL)\n\t\t\t\t{\n\t\t\t\t\tFullConnections.PushBack(conn);\n\t\t\t\t}\n\t\t\t\tConnectionsLock.Unlock();\n                invokeSessionEvent(&SessionListener::OnConnectionRequestAccepted, conn);\n            }\n        }\n        else if (conn->State == Server_ConnectedWait)\n        {\n            // Check the version data from the message\n            BitStream bsIn((char*)pData, bytesRead, false);\n\n            RPC_C2S_Hello hello;\n            if (!hello.Deserialize(&bsIn) ||\n                !hello.Validate())\n            {\n                LogError(\"{ERR-002} [Session] REJECTED: Rift application is using an incompatible version %d.%d.%d (my version=%d.%d.%d)\",\n                         hello.MajorVersion, hello.MinorVersion, hello.PatchVersion,\n                         RPCVersion_Major, RPCVersion_Minor, RPCVersion_Patch);\n\n                conn->SetState(State_Zombie);\n\n                // Send auth response\n                BitStream bsOut;\n                RPC_S2C_Authorization::Generate(&bsOut, \"Incompatible protocol version.  Please make sure your OVRService and SDK are both up to date.\");\n                conn->pSocket->Send(bsOut.GetData(), bsOut.GetNumberOfBytesUsed());\n            }\n            else\n            {\n                // Read remote version\n                conn->RemoteMajorVersion = hello.MajorVersion;\n                conn->RemoteMinorVersion = hello.MinorVersion;\n                conn->RemotePatchVersion = hello.PatchVersion;\n\n                // Send auth response\n                BitStream bsOut;\n                RPC_S2C_Authorization::Generate(&bsOut);\n                conn->pSocket->Send(bsOut.GetData(), bsOut.GetNumberOfBytesUsed());\n\n                // Mark as connected\n                conn->SetState(State_Connected);\n\t\t\t\tConnectionsLock.DoLock();\n\t\t\t\tint connIndex2;\n\t\t\t\tif (findConnectionBySocket(AllConnections, pSocket, &connIndex2)==conn && findConnectionBySocket(FullConnections, pSocket, &connIndex2)==NULL)\n\t\t\t\t{\n\t\t\t\t\tFullConnections.PushBack(conn);\n\t\t\t\t}\n\t\t\t\tConnectionsLock.Unlock();\n                invokeSessionEvent(&SessionListener::OnNewIncomingConnection, conn);\n\n            }\n        }\n        else\n        {\n            OVR_ASSERT(false);\n        }\n    }\n}\n\nvoid Session::TCP_OnClosed(TCPSocket* s)\n{\n\tLock::Locker locker(&ConnectionsLock);\n\n    // If found in the full connection list,\n    int connIndex;\n    Ptr<PacketizedTCPConnection> conn = findConnectionBySocket(AllConnections, s, &connIndex);\n    if (conn)\n    {\n        AllConnections.RemoveAtUnordered(connIndex);\n\n        // If in the full connection list,\n        if (findConnectionBySocket(FullConnections, s, &connIndex))\n        {\n            FullConnections.RemoveAtUnordered(connIndex);\n        }\n\n        // Generate an appropriate event for the current state\n        switch (conn->State)\n        {\n        case Client_Connecting:\n            invokeSessionEvent(&SessionListener::OnConnectionAttemptFailed, conn);\n            break;\n        case Client_ConnectedWait:\n        case Server_ConnectedWait:\n            invokeSessionEvent(&SessionListener::OnHandshakeAttemptFailed, conn);\n            break;\n        case State_Connected:\n        case State_Zombie:\n            invokeSessionEvent(&SessionListener::OnDisconnected, conn);\n            break;\n        default:\n            OVR_ASSERT(false);\n            break;\n        }\n\n        conn->SetState(State_Zombie);\n    }\n}\n\nvoid Session::TCP_OnAccept(TCPSocket* pListener, SockAddr* pSockAddr, SocketHandle newSock)\n{\n    OVR_UNUSED(pListener);\n\tOVR_ASSERT(pListener->Transport == TransportType_PacketizedTCP);\n\n\n\tPtr<PacketizedTCPSocket> newSocket = *new PacketizedTCPSocket(newSock, false);\n    // If pSockAddr is not localhost, then close newSock\n    if (pSockAddr->IsLocalhost()==false)\n    {\n        newSocket->Close();\n        return;\n    }\n\n\tif (newSocket)\n\t{\n\t\tPtr<Connection> b = AllocConnection(TransportType_PacketizedTCP);\n\t\tPtr<PacketizedTCPConnection> c = (PacketizedTCPConnection*)b.GetPtr();\n\t\tc->pSocket = newSocket;\n\t\tc->Address = *pSockAddr;\n        c->State = Server_ConnectedWait;\n\n        {\n            Lock::Locker locker(&ConnectionsLock);\n            AllConnections.PushBack(c);\n        }\n\n        // Server does not send the first packet.  It waits for the client to send its version\n\t}\n}\n\nvoid Session::TCP_OnConnected(TCPSocket *s)\n{\n    Lock::Locker locker(&ConnectionsLock);\n\n    // If connection was found,\n    PacketizedTCPConnection* conn = findConnectionBySocket(AllConnections, s);\n    if (conn)\n    {\n        OVR_ASSERT(conn->State == Client_Connecting);\n\n        // Send hello message\n        BitStream bsOut;\n        RPC_C2S_Hello::Generate(&bsOut);\n        conn->pSocket->Send(bsOut.GetData(), bsOut.GetNumberOfBytesUsed());\n\n        // Just update state but do not generate any notifications yet\n        conn->State = Client_ConnectedWait;\n    }\n}\n\nvoid Session::invokeSessionEvent(void(SessionListener::*f)(Connection*), Connection* conn)\n{\n    Lock::Locker locker(&SessionListenersLock);\n\n    const int count = SessionListeners.GetSizeI();\n    for (int i = 0; i < count; ++i)\n    {\n        (SessionListeners[i]->*f)(conn);\n    }\n}\n\nPtr<Connection> Session::GetConnectionAtIndex(int index)\n{\n    Lock::Locker locker(&ConnectionsLock);\n\n    const int count = FullConnections.GetSizeI();\n\n    if (index < count)\n    {\n        return FullConnections[index];\n    }\n\n    return NULL;\n}\n\n\n}} // OVR::Net\n"
  },
  {
    "path": "externals/ovr/Src/Net/OVR_Session.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_Session.h\nContent     :   One network session that provides connection/disconnection events.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Session_h\n#define OVR_Session_h\n\n#include \"OVR_Socket.h\"\n#include \"OVR_PacketizedTCPSocket.h\"\n#include \"../Kernel/OVR_Array.h\"\n#include \"../Kernel/OVR_Threads.h\"\n#include \"../Kernel/OVR_Atomic.h\"\n#include \"../Kernel/OVR_RefCount.h\"\n\nnamespace OVR { namespace Net {\n\nclass Session;\n\n\n//-----------------------------------------------------------------------------\n// Based on Semantic Versioning ( http://semver.org/ )\n//\n// Please update changelog below:\n// 1.0.0 - [SDK 0.4.0] Initial version (July 21, 2014)\n// 1.1.0 - Add Get/SetDriverMode_1, HMDCountUpdate_1\n//         Version mismatch results (July 28, 2014)\n//-----------------------------------------------------------------------------\n\nstatic const uint16_t RPCVersion_Major = 1; // MAJOR version when you make incompatible API changes,\nstatic const uint16_t RPCVersion_Minor = 2; // MINOR version when you add functionality in a backwards-compatible manner, and\nstatic const uint16_t RPCVersion_Patch = 0; // PATCH version when you make backwards-compatible bug fixes.\n\n// Client starts communication by sending its version number.\nstruct RPC_C2S_Hello\n{\n    RPC_C2S_Hello() :\n        MajorVersion(0),\n        MinorVersion(0),\n        PatchVersion(0)\n    {\n    }\n\n    String HelloString;\n\n    // Client version info\n    uint16_t MajorVersion, MinorVersion, PatchVersion;\n\n    void Serialize(Net::BitStream* bs)\n    {\n        bs->Write(HelloString);\n        bs->Write(MajorVersion);\n        bs->Write(MinorVersion);\n        bs->Write(PatchVersion);\n    }\n\n    bool Deserialize(Net::BitStream* bs)\n    {\n        bs->Read(HelloString);\n        bs->Read(MajorVersion);\n        bs->Read(MinorVersion);\n        return bs->Read(PatchVersion);\n    }\n\n    static void Generate(Net::BitStream* bs);\n\n    bool Validate();\n};\n\n// Server responds with an authorization accepted message, including the server's version number\nstruct RPC_S2C_Authorization\n{\n    RPC_S2C_Authorization() :\n        MajorVersion(0),\n        MinorVersion(0),\n        PatchVersion(0)\n    {\n    }\n\n    String AuthString;\n\n    // Server version info\n    uint16_t MajorVersion, MinorVersion, PatchVersion;\n\n    void Serialize(Net::BitStream* bs)\n    {\n        bs->Write(AuthString);\n        bs->Write(MajorVersion);\n        bs->Write(MinorVersion);\n        bs->Write(PatchVersion);\n    }\n\n    bool Deserialize(Net::BitStream* bs)\n    {\n        bs->Read(AuthString);\n        bs->Read(MajorVersion);\n        bs->Read(MinorVersion);\n        return bs->Read(PatchVersion);\n    }\n\n    static void Generate(Net::BitStream* bs, String errorString = \"\");\n\n    bool Validate();\n};\n\n\n//-----------------------------------------------------------------------------\n// Result of a session function\nenum SessionResult\n{\n\tSessionResult_OK,\n\tSessionResult_BindFailure,\n\tSessionResult_ListenFailure,\n\tSessionResult_ConnectFailure,\n    SessionResult_ConnectInProgress,\n    SessionResult_AlreadyConnected,\n};\n\n\n//-----------------------------------------------------------------------------\n// Connection state\nenum EConnectionState\n{\n    State_Zombie,          // Disconnected\n\n    // Client-only:\n    Client_Connecting,     // Waiting for TCP connection\n    Client_ConnectedWait,  // Connected! Waiting for server to authorize\n\n    // Server-only:\n    Server_ConnectedWait,  // Connected! Waiting for client handshake\n\n    State_Connected        // Connected\n};\n\n\n//-----------------------------------------------------------------------------\n// Generic connection over any transport\nclass Connection : public RefCountBase<Connection>\n{\npublic:\n    Connection() :\n        Transport(TransportType_None),\n        State(State_Zombie),\n        RemoteMajorVersion(0),\n        RemoteMinorVersion(0),\n        RemotePatchVersion(0)\n    {\n    }\n\tvirtual ~Connection() // Allow delete from base\n    {\n    }\n\npublic:\n    virtual void SetState(EConnectionState s) {State = s;}\n\n    TransportType    Transport;\n    EConnectionState State;\n\n    // Version number read from remote host just before connection completes\n    int              RemoteMajorVersion;\n    int              RemoteMinorVersion;\n    int              RemotePatchVersion;\n};\n\n\n//-----------------------------------------------------------------------------\n// Generic network connection over any network transport\nclass NetworkConnection : public Connection\n{\nprotected:\n    NetworkConnection()\n\t{\n\t}\n    virtual ~NetworkConnection()\n    {\n    }\n\npublic:\n    virtual void SetState(EConnectionState s)\n    {\n        if (s != State)\n        {\n            Mutex::Locker locker(&StateMutex);\n\n            if (s != State)\n            {\n                State = s;\n\n                if (State != Client_Connecting)\n                {\n                    ConnectingWait.NotifyAll();\n                }\n            }\n        }\n    }\n\n    void WaitOnConnecting()\n    {\n        Mutex::Locker locker(&StateMutex);\n\n        while (State == Client_Connecting)\n        {\n            ConnectingWait.Wait(&StateMutex);\n        }\n    }\n\n\tSockAddr      Address;\n    Mutex         StateMutex;\n    WaitCondition ConnectingWait;\n};\n\n\n//-----------------------------------------------------------------------------\n// TCP Connection\nclass TCPConnection : public NetworkConnection\n{\npublic:\n    TCPConnection()\n    {\n    }\n    virtual ~TCPConnection()\n    {\n    }\n\npublic:\n\tPtr<TCPSocket> pSocket;\n};\n\n\n//-----------------------------------------------------------------------------\n// Packetized TCP Connection\nclass PacketizedTCPConnection : public TCPConnection\n{\npublic:\n\tPacketizedTCPConnection()\n    {\n        Transport = TransportType_PacketizedTCP;\n    }\n    virtual ~PacketizedTCPConnection()\n    {\n    }\n};\n\n\n//-----------------------------------------------------------------------------\n// Generic socket listener description\nclass ListenerDescription\n{\npublic:\n    ListenerDescription() :\n        Transport(TransportType_None)\n    {\n    }\n\n    TransportType Transport;\n};\n\n\n//-----------------------------------------------------------------------------\n// Description for a Berkley socket listener\nclass BerkleyListenerDescription : public ListenerDescription\n{\npublic:\n\tstatic const int DefaultMaxIncomingConnections =  64;\n\tstatic const int DefaultMaxConnections         = 128;\n\n\tBerkleyListenerDescription() :\n\t\tMaxIncomingConnections(DefaultMaxIncomingConnections),\n\t\tMaxConnections(DefaultMaxConnections)\n\t{\n\t}\n\n\tPtr<BerkleySocket> BoundSocketToListenWith;\n    int                MaxIncomingConnections;\n    int                MaxConnections;\n};\n\n\n//-----------------------------------------------------------------------------\n// Receive payload\nstruct ReceivePayload\n{\n\tConnection* pConnection; // Source connection\n\tuint8_t*    pData;       // Pointer to data received\n\tint         Bytes;       // Number of bytes of data received\n};\n\n//-----------------------------------------------------------------------------\n// Broadcast parameters\nclass BroadcastParameters\n{\npublic:\n    BroadcastParameters() :\n        pData(NULL),\n        Bytes(0)\n    {\n    }\n\n    BroadcastParameters(const void* _pData, int _bytes) :\n        pData(_pData),\n        Bytes(_bytes)\n    {\n    }\n\npublic:\n    const void*     pData;       // Pointer to data to send\n    int             Bytes;       // Number of bytes of data received\n};\n\n//-----------------------------------------------------------------------------\n// Send parameters\nclass SendParameters\n{\npublic:\n\tSendParameters() :\n\t\tpData(NULL),\n\t\tBytes(0)\n\t{\n\t}\n\tSendParameters(Ptr<Connection> _pConnection, const void* _pData, int _bytes) :\n\t\tpConnection(_pConnection),\n\t\tpData(_pData),\n\t\tBytes(_bytes)\n\t{\n\t}\n\npublic:\n\tPtr<Connection> pConnection; // Connection to use\n\tconst void*     pData;       // Pointer to data to send\n\tint             Bytes;       // Number of bytes of data received\n};\n\n\n//-----------------------------------------------------------------------------\n// Parameters to connect\nstruct ConnectParameters\n{\npublic:\n\tConnectParameters() :\n\t\tTransport(TransportType_None)\n\t{\n\t}\n\n\tTransportType Transport;\n};\n\nstruct ConnectParametersBerkleySocket : public ConnectParameters\n{\n\tSockAddr           RemoteAddress;\n\tPtr<BerkleySocket> BoundSocketToConnectWith;\n    bool               Blocking;\n\n    ConnectParametersBerkleySocket(BerkleySocket* s, SockAddr* addr, bool blocking,\n                                   TransportType transport) :\n        RemoteAddress(*addr),\n        BoundSocketToConnectWith(s),\n        Blocking(blocking)\n    {\n        Transport = transport;\n    }\n};\n\n\n//-----------------------------------------------------------------------------\n// Listener receive result\nenum ListenerReceiveResult\n{\n\t/// The SessionListener used this message and it shouldn't be given to the user.\n\tLRR_RETURN = 0,\n\n\t/// The SessionListener is going to hold on to this message.  Do not deallocate it but do not pass it to other plugins either.\n\tLRR_BREAK,\n\n    /// This message will be processed by other SessionListeners, and at last by the user.\n    LRR_CONTINUE,\n};\n\n\n//-----------------------------------------------------------------------------\n// SessionListener\n\n// Callback interface for network events such as connecting, disconnecting, getting data, independent of the transport medium\nclass SessionListener\n{\npublic:\n\tvirtual ~SessionListener(){}\n\n\t// Data events\n    virtual void OnReceive(ReceivePayload* pPayload, ListenerReceiveResult* lrrOut) { OVR_UNUSED2(pPayload, lrrOut);  }\n\n\t// Connection was closed\n    virtual void OnDisconnected(Connection* conn) = 0;\n\n\t// Connection was created (some data was exchanged to verify protocol compatibility too)\n    virtual void OnConnected(Connection* conn) = 0;\n\n    // Server accepted client\n    virtual void OnNewIncomingConnection(Connection* conn)     { OnConnected(conn); }\n    // Client was accepted\n    virtual void OnConnectionRequestAccepted(Connection* conn) { OnConnected(conn); }\n\n    // Connection attempt failed for some reason\n    virtual void OnConnectionAttemptFailed(Connection* conn)   { OnDisconnected(conn); }\n\n    // Incompatible protocol\n    virtual void OnIncompatibleProtocol(Connection* conn)      { OnConnectionAttemptFailed(conn); }\n    // Disconnected during initial handshake\n    virtual void OnHandshakeAttemptFailed(Connection* conn)    { OnConnectionAttemptFailed(conn); }\n\n\t// Other\n    virtual void OnAddedToSession(Session* session)            { OVR_UNUSED(session); }\n    virtual void OnRemovedFromSession(Session* session)        { OVR_UNUSED(session); }\n};\n\n\n//-----------------------------------------------------------------------------\n// Session\n\n//  Interface for network events such as listening on a socket, sending data, connecting, and disconnecting. Works independently of the transport medium and also implements loopback\nclass Session : public SocketEvent_TCP, public NewOverrideBase\n{\n    // Implement a policy to avoid releasing memory backing allBlockingTcpSockets\n\tstruct ArrayNoShrinkPolicy : ArrayDefaultPolicy\n\t{\n\t\tbool NeverShrinking() const { return 1; }\n\t};\n\npublic:\n    Session() :\n        HasLoopbackListener(false)\n    {\n    }\n    virtual ~Session()\n    {\n        // Ensure memory backing the sockets array is released\n\t\tallBlockingTcpSockets.ClearAndRelease();\n    }\n\n\tvirtual SessionResult Listen(ListenerDescription* pListenerDescription);\n\tvirtual SessionResult Connect(ConnectParameters* cp);\n\tvirtual int           Send(SendParameters* payload);\n    virtual void          Broadcast(BroadcastParameters* payload);\n    // DO NOT CALL Poll() FROM MULTIPLE THREADS due to allBlockingTcpSockets being a member\n    virtual void          Poll(bool listeners = true);\n\tvirtual void          AddSessionListener(SessionListener* se);\n\tvirtual void          RemoveSessionListener(SessionListener* se);\n    virtual SInt32        GetActiveSocketsCount();\n\n    // Packetized TCP convenience functions\n    virtual SessionResult ListenPTCP(BerkleyBindParameters* bbp);\n    virtual SessionResult ConnectPTCP(BerkleyBindParameters* bbp, SockAddr* RemoteAddress, bool blocking);\n\n    // Closes all the sockets; useful for interrupting the socket polling during shutdown\n    void            Shutdown();\n\n    // Get count of successful connections (past handshake point)\n    int             GetConnectionCount() const\n    {\n        return FullConnections.GetSizeI();\n    }\n    Ptr<Connection> GetConnectionAtIndex(int index);\n\nprotected:\n\tvirtual Ptr<Connection> AllocConnection(TransportType transportType);\n\n    Lock SocketListenersLock, ConnectionsLock, SessionListenersLock;\n    bool                      HasLoopbackListener; // Has loopback listener installed?\n\tArray< Ptr<TCPSocket> >   SocketListeners;     // List of active sockets\n    Array< Ptr<Connection> >  AllConnections;      // List of active connections stuck at the versioning handshake\n    Array< Ptr<Connection> >  FullConnections;     // List of active connections past the versioning handshake\n    Array< SessionListener* > SessionListeners;    // List of session listeners\n    Array< Ptr< Net::TCPSocket >, ArrayNoShrinkPolicy > allBlockingTcpSockets; // Preallocated blocking sockets array\n\n    // Tools\n    Ptr<PacketizedTCPConnection> findConnectionBySocket(Array< Ptr<Connection> >& connectionArray, Socket* s, int *connectionIndex = NULL); // Call with ConnectionsLock held\n    Ptr<PacketizedTCPConnection> findConnectionBySockAddr(SockAddr* address); // Call with ConnectionsLock held\n    int                   invokeSessionListeners(ReceivePayload*);\n    void                  invokeSessionEvent(void(SessionListener::*f)(Connection*), Connection* pConnection);\n\n\t// TCP\n\tvirtual void          TCP_OnRecv(Socket* pSocket, uint8_t* pData, int bytesRead);\n\tvirtual void          TCP_OnClosed(TCPSocket* pSocket);\n\tvirtual void          TCP_OnAccept(TCPSocket* pListener, SockAddr* pSockAddr, SocketHandle newSock);\n\tvirtual void          TCP_OnConnected(TCPSocket* pSocket);\n};\n\n\n}} // OVR::Net\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Net/OVR_Socket.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Socket.cpp\nContent     :   Socket common data shared between all platforms.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_Socket.h\"\n\nnamespace OVR { namespace Net {\n\n\n//-----------------------------------------------------------------------------\n// Socket\n\nSocket::Socket() :\n\tTransport(TransportType_None)\n{\n}\n\n\n//-----------------------------------------------------------------------------\n// BerkleyBindParameters\n\nBerkleyBindParameters::BerkleyBindParameters() :\n\tPort(0),\n    Address(),\n    blockingTimeout(0x7fffffff)\n{\n}\n\n//-----------------------------------------------------------------------------\n// BerkleySocket\n\nBerkleySocket::BerkleySocket() :\n\tTheSocket(INVALID_SOCKET)\n  //TimeoutUsec(0) // Initialized by SetBlockingTimeout\n  //TimeoutSec(0)  // \"\n{\n    SetBlockingTimeout(1000);\n}\n\nBerkleySocket::~BerkleySocket()\n{\n\t// Close socket on destruction\n\tClose();\n}\n\n\n//-----------------------------------------------------------------------------\n// UDPSocketBase\n\nUDPSocketBase::UDPSocketBase()\n{\n\tTransport = TransportType_UDP;\n}\n\n\n//-----------------------------------------------------------------------------\n// TCPSocketBase\n\nTCPSocketBase::TCPSocketBase()\n  : IsListenSocket(false)\n{\n\tTransport = TransportType_TCP;\n}\n\nTCPSocketBase::TCPSocketBase(SocketHandle handle)\n  : IsListenSocket(false)\n{\n\tTheSocket = handle;\n}\n\n\n}} // OVR::Net\n"
  },
  {
    "path": "externals/ovr/Src/Net/OVR_Socket.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_Socket.h\nContent     :   Socket common data shared between all platforms.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Socket_h\n#define OVR_Socket_h\n\n#include \"../Kernel/OVR_Types.h\"\n#include \"../Kernel/OVR_Timer.h\"\n#include \"../Kernel/OVR_Allocator.h\"\n#include \"../Kernel/OVR_RefCount.h\"\n#include \"../Kernel/OVR_String.h\"\n\n// OS-specific socket headers\n#if defined(OVR_OS_WIN32)\n#include <WinSock2.h>\n#include <WS2tcpip.h>\n#define WIN32_LEAN_AND_MEAN\n#include <windows.h>\n#else\n# include <unistd.h>\n# include <sys/types.h>\n# include <netinet/in.h>\n#ifdef OVR_OS_ANDROID\n#include <sys/socket.h>\n#endif\n#endif\n\nnamespace OVR { namespace Net {\n\nclass SockAddr;\nclass UDPSocket;\nclass TCPSocket;\n\n\n//-----------------------------------------------------------------------------\n// Portable numeric Socket handle\n#if defined(OVR_OS_WIN32)\ntypedef SOCKET SocketHandle;\n#else\ntypedef int SocketHandle;\nstatic const SocketHandle INVALID_SOCKET = -1;\nstatic const int SOCKET_ERROR = -1;\n#endif\n\n\n//-----------------------------------------------------------------------------\n// Types of network transport\nenum TransportType\n{\n\tTransportType_None,          // No transport (useful placeholder for invalid states)\n\tTransportType_Loopback,      // Loopback transport: Class talks to itself\n\tTransportType_TCP,           // TCP/IPv4/v6\n\tTransportType_UDP,           // UDP/IPv4/v6\n\tTransportType_PacketizedTCP  // Packetized TCP: Message framing is automatic\n};\n\n\n//-----------------------------------------------------------------------------\n// Abstraction for a network socket. Inheritance hierarchy\n// modeled after RakNet so that future support can be added\n// for Linux, Windows RT, consoles, etc.\nclass Socket : public RefCountBase<Socket>\n{\npublic:\n\tSocket();\n\tvirtual void Close() = 0;\n\npublic:\n\tTransportType Transport; // Type of transport\n};\n\n\n//-----------------------------------------------------------------------------\n// Bind parameters for Berkley sockets\nstruct BerkleyBindParameters\n{\npublic:\n\tBerkleyBindParameters();\n\npublic:\n\tuint16_t Port;     // Port\n\tString Address;\n    uint32_t blockingTimeout;\n};\n\n\n//-----------------------------------------------------------------------------\n// Berkley socket\nclass BerkleySocket : public Socket\n{\npublic:\n\tBerkleySocket();\n\tvirtual ~BerkleySocket();\n\n\tvirtual void   Close();\n\tvirtual int32_t GetSockname(SockAddr* pSockAddrOut);\n\tvirtual void   SetBlockingTimeout(int timeoutMs) // milliseconds\n\t{\n        TimeoutSec = timeoutMs / 1000;\n        TimeoutUsec = (timeoutMs % 1000) * 1000;\n\t}\n    int            GetBlockingTimeoutUsec() const\n    {\n        return TimeoutUsec;\n    }\n    int            GetBlockingTimeoutSec() const\n    {\n        return TimeoutSec;\n    }\n    SocketHandle   GetSocketHandle() const\n    {\n        return TheSocket;\n    }\n\nprotected:\n\tSocketHandle TheSocket;           // Socket handle\n    int TimeoutUsec, TimeoutSec;\n};\n\n\n//-----------------------------------------------------------------------------\n// UDP socket events\nclass SocketEvent_UDP\n{\npublic:\n\tvirtual ~SocketEvent_UDP(){}\n\n\tvirtual void UDP_OnRecv(Socket* pSocket, uint8_t* pData,\n\t\t\t\t\t\t\tuint32_t bytesRead, SockAddr* pSockAddr)\n\t{\n\t\tOVR_UNUSED4(pSocket, pData, bytesRead, pSockAddr);\n\t}\n};\n\n\n//-----------------------------------------------------------------------------\n// TCP socket events\nclass SocketEvent_TCP\n{\npublic:\n\tvirtual ~SocketEvent_TCP(){}\n\n\tvirtual void TCP_OnRecv     (Socket* pSocket,\n                                 uint8_t* pData,\n                                 int bytesRead)\n\t{\n\t\tOVR_UNUSED3(pSocket, pData, bytesRead);\n\t}\n\tvirtual void TCP_OnClosed   (TCPSocket* pSocket)\n\t{\n\t\tOVR_UNUSED(pSocket);\n\t}\n\tvirtual void TCP_OnAccept   (TCPSocket* pListener,\n                                 SockAddr* pSockAddr,\n\t\t\t\t\t\t\t\t SocketHandle newSock)\n\t{\n\t\tOVR_UNUSED3(pListener, pSockAddr, newSock);\n\t}\n\tvirtual void TCP_OnConnected(TCPSocket* pSocket)\n\t{\n\t\tOVR_UNUSED(pSocket);\n\t}\n};\n\n\n//-----------------------------------------------------------------------------\n// UDP Berkley socket\n\n// Base class for UDP sockets, code shared between platforms\nclass UDPSocketBase : public BerkleySocket\n{\npublic:\n\tUDPSocketBase();\n\npublic:\n\tvirtual SocketHandle Bind(BerkleyBindParameters* pBindParameters) = 0;\n\tvirtual int          Send(const void* pData,\n                              int bytes,\n                              SockAddr* pSockAddr) = 0;\n\tvirtual void         Poll(SocketEvent_UDP* eventHandler) = 0;\n\nprotected:\n\tvirtual void         OnRecv(SocketEvent_UDP* eventHandler,\n                                uint8_t* pData,\n\t\t\t\t\t\t\t\tint bytesRead,\n                                SockAddr* address) = 0;\n};\n\n\n//-----------------------------------------------------------------------------\n// TCP Berkley socket\n\n// Base class for TCP sockets, code shared between platforms\nclass TCPSocketBase : public BerkleySocket\n{\npublic:\n\tTCPSocketBase();\n\tTCPSocketBase(SocketHandle handle);\n\npublic:\n\tvirtual SocketHandle Bind(BerkleyBindParameters* pBindParameters) = 0;\n\tvirtual int          Listen() = 0;\n\tvirtual int          Connect(SockAddr* pSockAddr) = 0;\n\tvirtual int          Send(const void* pData,\n                              int bytes) = 0;\nprotected:\n\tvirtual void         OnRecv(SocketEvent_TCP* eventHandler,\n                                uint8_t* pData,\n                                int bytesRead) = 0;\n\nprotected:\n\tbool IsListenSocket; // Is the socket listening (acting as a server)?\n};\n\n\n}} // OVR::Net\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Net/OVR_Unix_Socket.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Unix_Socket.cpp\nContent     :   Berkley sockets networking implementation\nCreated     :   July 1, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_Unix_Socket.h\"\n#include \"../Kernel/OVR_Std.h\"\n#include \"../Kernel/OVR_Allocator.h\"\n#include \"../Kernel/OVR_Threads.h\" // Thread::MSleep\n#include \"../Kernel/OVR_Log.h\"\n\n#include <errno.h>\n\nnamespace OVR { namespace Net {\n\n//-----------------------------------------------------------------------------\n// BerkleySocket\n\nvoid BerkleySocket::Close()\n{\n\tif (TheSocket != INVALID_SOCKET)\n\t{\n\t\tclose(TheSocket);\n\t\tTheSocket = INVALID_SOCKET;\n\t}\n}\n\nSInt32 BerkleySocket::GetSockname(SockAddr *pSockAddrOut)\n{\n\tstruct sockaddr_in6 sa;\n\tmemset(&sa,0,sizeof(sa));\n\tsocklen_t size = sizeof(sa);\n\tSInt32 i = getsockname(TheSocket, (sockaddr*)&sa, &size);\n\tif (i>=0)\n\t{\n\t\tpSockAddrOut->Set(&sa);\n\t}\n\treturn i;\n}\n\n\n//-----------------------------------------------------------------------------\n// BitStream overloads for SockAddr\n\nBitStream& operator<<(BitStream& out, SockAddr& in)\n{\n\tout.WriteBits((const unsigned char*) &in.Addr6, sizeof(in.Addr6)*8, true);\n\treturn out;\n}\n\nBitStream& operator>>(BitStream& in, SockAddr& out)\n{\n\tbool success = in.ReadBits((unsigned char*) &out.Addr6, sizeof(out.Addr6)*8, true);\n\tOVR_ASSERT(success);\n\tOVR_UNUSED(success);\n\treturn in;\n}\n\n\n//-----------------------------------------------------------------------------\n// SockAddr\n\nSockAddr::SockAddr()\n{\n}\n\nSockAddr::SockAddr(SockAddr* address)\n{\n\tSet(&address->Addr6);\n}\n\nSockAddr::SockAddr(sockaddr_storage* storage)\n{\n\tSet(storage);\n}\n\nSockAddr::SockAddr(sockaddr_in6* address)\n{\n\tSet(address);\n}\n\nSockAddr::SockAddr(const char* hostAddress, UInt16 port, int sockType)\n{\n\tSet(hostAddress, port, sockType);\n}\n\nvoid SockAddr::Set(const sockaddr_storage* storage)\n{\n\tmemcpy(&Addr6, storage, sizeof(Addr6));\n}\n\nvoid SockAddr::Set(const sockaddr_in6* address)\n{\n\tmemcpy(&Addr6, address, sizeof(Addr6));\n}\n\nvoid SockAddr::Set(const char* hostAddress, UInt16 port, int sockType)\n{\n\tmemset(&Addr6, 0, sizeof(Addr6));\n\n\tstruct addrinfo hints;\n\n\t// make sure the struct is empty\n\tmemset(&hints, 0, sizeof (addrinfo));\n\n\thints.ai_socktype = sockType; // SOCK_DGRAM or SOCK_STREAM\n\thints.ai_flags = AI_PASSIVE;     // fill in my IP for me\n\thints.ai_family = AF_UNSPEC ;\n\n    if (SOCK_DGRAM == sockType)\n    {\n        hints.ai_protocol = IPPROTO_UDP;\n    }\n    else if (SOCK_STREAM == sockType)\n    {\n        hints.ai_protocol = IPPROTO_TCP;\n    }\n\n    struct addrinfo* servinfo = NULL;  // will point to the results\n\n\tchar portStr[32];\n\tOVR_itoa(port, portStr, sizeof(portStr), 10);\n\tint errcode = getaddrinfo(hostAddress, portStr, &hints, &servinfo);\n\n    if (0 != errcode)\n    {\n        OVR::LogError(\"getaddrinfo error: %s\", gai_strerror(errcode));\n    }\n\n    OVR_ASSERT(servinfo);\n\n    if (servinfo)\n    {\n        memcpy(&Addr6, servinfo->ai_addr, sizeof(Addr6));\n\n        freeaddrinfo(servinfo);\n    }\n}\n\nUInt16 SockAddr::GetPort()\n{\n\treturn htons(Addr6.sin6_port);\n}\n\nString SockAddr::ToString(bool writePort, char portDelineator) const\n{\n    char dest[INET6_ADDRSTRLEN + 1];\n\n\tint ret = getnameinfo((struct sockaddr*)&Addr6,\n\t\t\t\t\t\t  sizeof(struct sockaddr_in6),\n\t\t\t\t\t\t  dest,\n\t\t\t\t\t\t  INET6_ADDRSTRLEN,\n\t\t\t\t\t\t  NULL,\n\t\t\t\t\t\t  0,\n\t\t\t\t\t\t  NI_NUMERICHOST);\n\tif (ret != 0)\n\t{\n\t\tdest[0] = '\\0';\n\t}\n\n\tif (writePort)\n\t{\n\t\tunsigned char ch[2];\n\t\tch[0]=portDelineator;\n\t\tch[1]=0;\n\t\tOVR_strcat(dest, 16, (const char*) ch);\n\t\tOVR_itoa(ntohs(Addr6.sin6_port), dest+strlen(dest), 16, 10);\n\t}\n\n    return String(dest);\n}\nbool SockAddr::IsLocalhost() const\n{\n    static const unsigned char localhost_bytes[] =\n    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };\n\n    return memcmp(Addr6.sin6_addr.s6_addr, localhost_bytes, 16) == 0;\n}\nbool SockAddr::operator==( const SockAddr& right ) const\n{\n\treturn memcmp(&Addr6, &right.Addr6, sizeof(Addr6)) == 0;\n}\n\nbool SockAddr::operator!=( const SockAddr& right ) const\n{\n\treturn !(*this == right);\n}\n\nbool SockAddr::operator>( const SockAddr& right ) const\n{\n\treturn memcmp(&Addr6, &right.Addr6, sizeof(Addr6)) > 0;\n}\n\nbool SockAddr::operator<( const SockAddr& right ) const\n{\n\treturn memcmp(&Addr6, &right.Addr6, sizeof(Addr6)) < 0;\n}\n\n\n// Returns true on success\nstatic bool SetSocketOptions(SocketHandle sock)\n{\n    bool failed = false;\n    int sock_opt;\n    int sockError = 0;\n\n    // This doubles the max throughput rate\n    sock_opt=1024*256;\n    sockError = setsockopt(sock, SOL_SOCKET, SO_RCVBUF, ( char * ) & sock_opt, sizeof ( sock_opt ) );\n    if (sockError != 0)\n    {\n\t\tint errsv = errno;\n        OVR::LogError(\"[Socket] Failed SO_RCVBUF setsockopt, errno: %d\", errsv);\n        failed = true;\n    }\n    \n    // This doesn't make much difference: 10% maybe\n    // Not supported on console 2\n    sock_opt=1024*16;\n    sockError = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, ( char * ) & sock_opt, sizeof ( sock_opt ) );\n    if (sockError != 0)\n    {\n\t\tint errsv = errno;\n        OVR::LogError(\"[Socket] Failed SO_SNDBUF setsockopt, errno: %d\", errsv);\n        failed = true;\n    }\n\n    // NOTE: This should be OVR_OS_BSD, not Mac.\n#ifdef OVR_OS_MAC\n    int value = 1;\n    sockError = setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(value));\n    if (sockError != 0)\n    {\n        int errsv = errno;\n        OVR::LogError(\"[Socket] Failed SO_NOSIGPIPE setsockopt, errno: %d\", errsv);\n        failed = true;\n    }\n#endif\n\n    // Reuse address is only needed for posix platforms, as it is the default\n    // on Windows platforms.\n    int optval = 1;\n    sockError = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int));\n    if (sockError != 0)\n    {\n\t\tint errsv = errno;\n        OVR::LogError(\"[Socket] Failed SO_REUSEADDR setsockopt, errno: %d\", errsv);\n        failed = true;\n    }\n\n    return !failed;\n}\n\nvoid _Ioctlsocket(SocketHandle sock, unsigned long nonblocking)\n{\n\tint flags = fcntl(sock, F_GETFL, 0);\n\tif (flags < 0) return; // return false\n\tif (nonblocking == 0)\t{ flags &= ~O_NONBLOCK; }\n\telse\t\t\t\t\t{ flags |= O_NONBLOCK;  }\n\tfcntl(sock, F_SETFL, flags);\n}\n\nstatic SocketHandle BindShared(int ai_family, int ai_socktype, BerkleyBindParameters *pBindParameters)\n{\n\tSocketHandle sock;\n\n\tstruct addrinfo hints;\n\tmemset(&hints, 0, sizeof (addrinfo)); // make sure the struct is empty\n\thints.ai_family = ai_family;\n\thints.ai_socktype = ai_socktype;\n\thints.ai_flags = AI_PASSIVE;     // fill in my IP for me\n\tstruct addrinfo *servinfo=0, *aip;  // will point to the results\n\tchar portStr[32];\n\tOVR_itoa(pBindParameters->Port, portStr, sizeof(portStr), 10);\n\n    int errcode = 0;\n\tif (!pBindParameters->Address.IsEmpty())\n\t\terrcode = getaddrinfo(pBindParameters->Address.ToCStr(), portStr, &hints, &servinfo);\n\telse\n\t\terrcode = getaddrinfo(0, portStr, &hints, &servinfo);\n\n    if (0 != errcode)\n    {\n        OVR::LogError(\"getaddrinfo error: %s\", gai_strerror(errcode));\n    }\n\n\tfor (aip = servinfo; aip != NULL; aip = aip->ai_next)\n\t{\n\t\t// Open socket. The address type depends on what\n\t\t// getaddrinfo() gave us.\n\t\tsock = socket(aip->ai_family, aip->ai_socktype, aip->ai_protocol);\n\t\tif (sock != 0)\n\t\t{\n            SetSocketOptions(sock);\n\t\t\tint ret = bind( sock, aip->ai_addr, (int) aip->ai_addrlen );\n\t\t\tif (ret>=0)\n\t\t\t{\n\t\t\t\t// The actual socket is always non-blocking\n\t\t\t\t// I control blocking or not using WSAEventSelect\n\t\t\t\t_Ioctlsocket(sock, 1);\n                freeaddrinfo(servinfo);\n\t\t\t\treturn sock;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tclose(sock);\n\t\t\t}\n\t\t}\n\t}\n\n    if (servinfo) { freeaddrinfo(servinfo); }\n\treturn INVALID_SOCKET;\n}\n\n\n//-----------------------------------------------------------------------------\n// UDPSocket\n\nUDPSocket::UDPSocket()\n{\n\tRecvBuf = new UByte[RecvBufSize];\n}\n\nUDPSocket::~UDPSocket()\n{\n\tdelete[] RecvBuf;\n}\n\nSocketHandle UDPSocket::Bind(BerkleyBindParameters *pBindParameters)\n{\n\tSocketHandle s = BindShared(AF_INET6, SOCK_DGRAM, pBindParameters);\n\tif (s < 0)\n\t\treturn s;\n\n\tClose();\n\tTheSocket = s;\n\n\treturn TheSocket;\n}\n\nvoid UDPSocket::OnRecv(SocketEvent_UDP* eventHandler, UByte* pData, int bytesRead, SockAddr* address)\n{\n\teventHandler->UDP_OnRecv(this, pData, bytesRead, address);\n}\n\nint UDPSocket::Send(const void* pData, int bytes, SockAddr* address)\n{\n    // NOTE: This should be OVR_OS_BSD\n#ifdef OVR_OS_MAC\n    int flags = 0;\n#else\n    int flags = MSG_NOSIGNAL;\n#endif\n\n\treturn (int)sendto(TheSocket, (const char*)pData, bytes, flags, (const sockaddr*)&address->Addr6, sizeof(address->Addr6));\n}\n\nvoid UDPSocket::Poll(SocketEvent_UDP *eventHandler)\n{\n\tstruct sockaddr_storage win32_addr;\n\tsocklen_t fromlen;\n\tint bytesRead;\n\n    // FIXME: Implement blocking poll wait for UDP\n\n\t// While some bytes are read,\n\twhile (fromlen = sizeof(win32_addr), // Must set fromlen each time\n\t\t   bytesRead = (int)recvfrom(TheSocket, (char*)RecvBuf, RecvBufSize, 0, (sockaddr*)&win32_addr, &fromlen),\n\t\t   bytesRead > 0)\n\t{\n\t\tSockAddr address(&win32_addr); // Wrap address\n\n\t\tOnRecv(eventHandler, RecvBuf, bytesRead, &address);\n\t}\n}\n\n\n//-----------------------------------------------------------------------------\n// TCPSocket\n\nTCPSocket::TCPSocket()\n{\n\tIsConnecting = false;\n\tIsListenSocket = false;\n}\nTCPSocket::TCPSocket(SocketHandle boundHandle, bool isListenSocket)\n{\n\tTheSocket = boundHandle;\n\tIsListenSocket = isListenSocket;\n\tIsConnecting = false;\n\tSetSocketOptions(TheSocket);\n\n\t// The actual socket is always non-blocking\n\t_Ioctlsocket(TheSocket, 1);\n}\n\nTCPSocket::~TCPSocket()\n{\n}\n\nvoid TCPSocket::OnRecv(SocketEvent_TCP* eventHandler, UByte* pData, int bytesRead)\n{\n\teventHandler->TCP_OnRecv(this, pData, bytesRead);\n}\n\nSocketHandle TCPSocket::Bind(BerkleyBindParameters* pBindParameters)\n{\t\n\tSocketHandle s = BindShared(AF_INET6, SOCK_STREAM, pBindParameters);\n\tif (s < 0)\n\t\treturn s;\n\n\tClose();\n\n    SetBlockingTimeout(pBindParameters->blockingTimeout);\n    TheSocket = s;\n\n\treturn TheSocket;\n}\n\nint TCPSocket::Listen()\n{\n    if (IsListenSocket)\n    {\n        return 0;\n    }\n\n\tint i = listen(TheSocket, SOMAXCONN);\n\tif (i >= 0)\n\t{\n\t\tIsListenSocket = true;\n\t}\n\n\treturn i;\n}\n\nint TCPSocket::Connect(SockAddr* address)\n{\n\tint retval;\n\n\tretval = connect(TheSocket, (struct sockaddr *) &address->Addr6, sizeof(address->Addr6));\n\tif (retval < 0)\n\t{\n\t\tint errsv = errno;\n        // EINPROGRESS should not be checked on windows but should\n        // be checked on POSIX platforms.\n\t\tif (errsv == EWOULDBLOCK || errsv == EINPROGRESS)\n\t\t{\n            IsConnecting = true;\n            return 0;\n\t\t}\n\n\t\tOVR::LogText( \"TCPSocket::Connect failed:Error code - %d\\n\", errsv );\n\t}\n\n\treturn retval;\n}\n\nint TCPSocket::Send(const void* pData, int bytes)\n{\n\tif (bytes <= 0)\n\t{\n\t\treturn 0;\n\t}\n\telse\n\t{\n\t\treturn (int)send(TheSocket, (const char*)pData, bytes, 0);\n\t}\n}\n\n\n//// TCPSocketPollState\n\nTCPSocketPollState::TCPSocketPollState()\n{\n    FD_ZERO(&readFD);\n    FD_ZERO(&exceptionFD);\n    FD_ZERO(&writeFD);\n    largestDescriptor = INVALID_SOCKET;\n}\n\nbool TCPSocketPollState::IsValid() const\n{\n    return largestDescriptor != INVALID_SOCKET;\n}\n\nvoid TCPSocketPollState::Add(TCPSocket* tcpSocket)\n{\n    if (!tcpSocket)\n    {\n        return;\n    }\n\n    SocketHandle handle = tcpSocket->GetSocketHandle();\n\n    if (handle == INVALID_SOCKET)\n    {\n        return;\n    }\n\n    if (largestDescriptor == INVALID_SOCKET ||\n        largestDescriptor < handle)\n    {\n        largestDescriptor = handle;\n    }\n\n    FD_SET(handle, &readFD);\n    FD_SET(handle, &exceptionFD);\n\n    if (tcpSocket->IsConnecting)\n    {\n        FD_SET(handle, &writeFD);\n    }\n}\n\nbool TCPSocketPollState::Poll(long usec, long seconds)\n{\n    timeval tv;\n    tv.tv_sec = seconds;\n    tv.tv_usec = (int)usec;\n\n    return select(largestDescriptor + 1, &readFD, &writeFD, &exceptionFD, &tv) > 0;\n}\n\nvoid TCPSocketPollState::HandleEvent(TCPSocket* tcpSocket, SocketEvent_TCP* eventHandler)\n{\n    if (!tcpSocket || !eventHandler)\n    {\n        return;\n    }\n\n    SocketHandle handle = tcpSocket->GetSocketHandle();\n\n    if (tcpSocket->IsConnecting && FD_ISSET(handle, &writeFD))\n    {\n        tcpSocket->IsConnecting = false;\n        eventHandler->TCP_OnConnected(tcpSocket);\n    }\n\n    if (FD_ISSET(handle, &readFD))\n    {\n        if (!tcpSocket->IsListenSocket)\n        {\n            static const int BUFF_SIZE = 8096;\n            char data[BUFF_SIZE];\n\n            int bytesRead = (int)recv(handle, data, BUFF_SIZE, 0);\n            if (bytesRead > 0)\n            {\n                tcpSocket->OnRecv(eventHandler, (UByte*)data, bytesRead);\n            }\n            else // Disconnection event:\n            {\n                tcpSocket->IsConnecting = false;\n                eventHandler->TCP_OnClosed(tcpSocket);\n            }\n        }\n        else\n        {\n            struct sockaddr_storage sockAddr;\n            socklen_t sockAddrSize = sizeof(sockAddr);\n\n            SocketHandle newSock = accept(handle, (sockaddr*)&sockAddr, (socklen_t*)&sockAddrSize);\n            if (newSock > 0)\n            {\n                SockAddr sa(&sockAddr);\n                eventHandler->TCP_OnAccept(tcpSocket, &sa, newSock);\n            }\n        }\n    }\n\n    if (FD_ISSET(handle, &exceptionFD))\n    {\n        tcpSocket->IsConnecting = false;\n        eventHandler->TCP_OnClosed(tcpSocket);\n    }\n}\n\n\n}} // namespace OVR::Net\n"
  },
  {
    "path": "externals/ovr/Src/Net/OVR_Unix_Socket.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_Unix_Socket.h\nContent     :   Berkley sockets networking implementation\nCreated     :   July 1, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Unix_Socket_h\n#define OVR_Unix_Socket_h\n\n#include \"OVR_Socket.h\"\n#include \"OVR_BitStream.h\"\n\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <netdb.h>\n#include <fcntl.h>\n\nnamespace OVR { namespace Net { \n\n//-----------------------------------------------------------------------------\n// SockAddr\n\n// Abstraction for IPV6 socket address, with various convenience functions\nclass SockAddr\n{\npublic:\n\tSockAddr();\n\tSockAddr(SockAddr* sa);\n\tSockAddr(sockaddr_storage* sa);\n\tSockAddr(sockaddr_in6* sa);\n\tSockAddr(const char* hostAddress, UInt16 port, int sockType);\n\npublic:\n\tvoid   Set(const sockaddr_storage* sa);\n\tvoid   Set(const sockaddr_in6* sa);\n\tvoid   Set(const char* hostAddress, UInt16 port, int sockType); // SOCK_DGRAM or SOCK_STREAM\n\n\tUInt16 GetPort();\n\n    String ToString(bool writePort, char portDelineator) const;\n\n    bool   IsLocalhost() const;\n\n\tvoid   Serialize(BitStream* bs);\n\tbool   Deserialize(BitStream);\n\n\tbool   operator==( const SockAddr& right ) const;\n\tbool   operator!=( const SockAddr& right ) const;\n\tbool   operator >( const SockAddr& right ) const;\n\tbool   operator <( const SockAddr& right ) const;\n\npublic:\n\tsockaddr_in6 Addr6;\n};\n\n\n//-----------------------------------------------------------------------------\n// UDP Socket\n\n// Windows version of TCP socket\nclass UDPSocket : public UDPSocketBase\n{\npublic:\n\tUDPSocket();\n\tvirtual ~UDPSocket();\n\npublic:\n\tvirtual SocketHandle Bind(BerkleyBindParameters* pBindParameters);\n\tvirtual int          Send(const void* pData, int bytes, SockAddr* address);\n\tvirtual void         Poll(SocketEvent_UDP* eventHandler);\n\nprotected:\n\tstatic const int RecvBufSize = 1048576;\n\tUByte* RecvBuf;\n\n\tvirtual void         OnRecv(SocketEvent_UDP* eventHandler, UByte* pData,\n\t\t\t\t\t\t\t\tint bytesRead, SockAddr* address);\n};\n\n\n//-----------------------------------------------------------------------------\n// TCP Socket\n\n// Windows version of TCP socket\nclass TCPSocket : public TCPSocketBase\n{\n    friend class TCPSocketPollState;\n\npublic:\n\tTCPSocket();\n\tTCPSocket(SocketHandle boundHandle, bool isListenSocket);\n\tvirtual ~TCPSocket();\n\npublic:\n\tvirtual SocketHandle Bind(BerkleyBindParameters* pBindParameters);\n\tvirtual int          Listen();\n\tvirtual int          Connect(SockAddr* address);\n\tvirtual int          Send(const void* pData, int bytes);\n\nprotected:\n\tvirtual void         OnRecv(SocketEvent_TCP* eventHandler, UByte* pData,\n\t\t\t\t\t\t\t\tint bytesRead);\n\npublic:\n\tbool IsConnecting; // Is in the process of connecting?\n};\n\n\n//-----------------------------------------------------------------------------\n// TCPSocketPollState\n\n// Polls multiple blocking TCP sockets at once\nclass TCPSocketPollState\n{\n    fd_set readFD, exceptionFD, writeFD;\n    SocketHandle largestDescriptor;\n\npublic:\n    TCPSocketPollState();\n    bool IsValid() const;\n    void Add(TCPSocket* tcpSocket);\n    bool Poll(long usec = 30000, long seconds = 0);\n    void HandleEvent(TCPSocket* tcpSocket, SocketEvent_TCP* eventHandler);\n};\n\n\n}} // OVR::Net\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/OVR_CAPI.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_CAPI.cpp\nContent     :   Experimental simple C interface to the HMD - version 1.\nCreated     :   November 30, 2013\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_CAPI.h\"\n#include \"Kernel/OVR_Timer.h\"\n#include \"Kernel/OVR_Math.h\"\n#include \"Kernel/OVR_System.h\"\n#include \"OVR_Stereo.h\"\n#include \"OVR_Profile.h\"\n#include \"../Include/OVR_Version.h\"\n\n#include \"CAPI/CAPI_HMDState.h\"\n#include \"CAPI/CAPI_FrameTimeManager.h\"\n\n#include \"Service/Service_NetClient.h\"\n#ifdef OVR_SINGLE_PROCESS\n#include \"Service/Service_NetServer.h\"\n#endif\n\n#ifdef OVR_OS_WIN32\n#include \"Displays/OVR_Win32_ShimFunctions.h\"\n#endif\n\n\nusing namespace OVR;\nusing namespace OVR::Util::Render;\nusing namespace OVR::Tracking;\n\n//-------------------------------------------------------------------------------------\n// Math\nnamespace OVR {\n\n\n// ***** FovPort\n\n// C-interop support: FovPort <-> ovrFovPort\nFovPort::FovPort(const ovrFovPort &src)\n    : UpTan(src.UpTan), DownTan(src.DownTan), LeftTan(src.LeftTan), RightTan(src.RightTan)\n{ }    \n\nFovPort::operator ovrFovPort () const\n{\n    ovrFovPort result;\n    result.LeftTan  = LeftTan;\n    result.RightTan = RightTan;\n    result.UpTan    = UpTan;\n    result.DownTan  = DownTan;\n    return result;\n}\n\n// Converts Fov Tan angle units to [-1,1] render target NDC space\nVector2f FovPort::TanAngleToRendertargetNDC(Vector2f const &tanEyeAngle)\n{  \n    ScaleAndOffset2D eyeToSourceNDC = CreateNDCScaleAndOffsetFromFov(*this);\n    return tanEyeAngle * eyeToSourceNDC.Scale + eyeToSourceNDC.Offset;\n}\n\n// ***** SensorDataType\n\nSensorDataType::SensorDataType(const ovrSensorData& s)\n{\n    Acceleration = s.Accelerometer;\n    RotationRate = s.Gyro;\n    MagneticField = s.Magnetometer;\n    Temperature = s.Temperature;\n    AbsoluteTimeSeconds = s.TimeInSeconds;\n}\n\nSensorDataType::operator ovrSensorData () const\n{\n    ovrSensorData result;\n    result.Accelerometer = Acceleration;\n    result.Gyro = RotationRate;\n    result.Magnetometer = MagneticField;\n    result.Temperature = Temperature;\n    result.TimeInSeconds = (float) AbsoluteTimeSeconds;\n    return result;\n}\n\n\n// ***** SensorState\n\nTrackingState::TrackingState(const ovrTrackingState& s)\n{\n    HeadPose    = s.HeadPose;\n    CameraPose  = s.CameraPose;\n    LeveledCameraPose = s.LeveledCameraPose;\n    RawSensorData = s.RawSensorData;\n    StatusFlags = s.StatusFlags;\n    LastVisionProcessingTime = s.LastVisionProcessingTime;\n    LastVisionFrameLatency = s.LastVisionFrameLatency;\n    LastCameraFrameCounter = s.LastCameraFrameCounter;\n}\n\nTrackingState::operator ovrTrackingState() const\n{\n    ovrTrackingState result;\n    result.HeadPose     = HeadPose;\n    result.CameraPose   = CameraPose;\n    result.LeveledCameraPose = LeveledCameraPose;\n    result.RawSensorData  = RawSensorData;\n    result.StatusFlags  = StatusFlags;\n    result.LastVisionProcessingTime = LastVisionProcessingTime;\n    result.LastVisionFrameLatency = LastVisionFrameLatency;\n    result.LastCameraFrameCounter = LastCameraFrameCounter;\n    return result;\n}\n\n\n} // namespace OVR\n\n//-------------------------------------------------------------------------------------\n\nusing namespace OVR::CAPI;\n\n#ifdef __cplusplus \nextern \"C\" {\n#endif\n\n\n// Used to generate projection from ovrEyeDesc::Fov\nOVR_EXPORT ovrMatrix4f ovrMatrix4f_Projection(ovrFovPort fov, float znear, float zfar, ovrBool rightHanded)\n{\n    return CreateProjection(rightHanded ? true : false, fov, znear, zfar);\n}\n\n\nOVR_EXPORT ovrMatrix4f ovrMatrix4f_OrthoSubProjection(ovrMatrix4f projection, ovrVector2f orthoScale,\n                                                      float orthoDistance, float hmdToEyeViewOffsetX)\n{\n\n    float orthoHorizontalOffset = hmdToEyeViewOffsetX / orthoDistance;\n\n    // Current projection maps real-world vector (x,y,1) to the RT.\n    // We want to find the projection that maps the range [-FovPixels/2,FovPixels/2] to\n    // the physical [-orthoHalfFov,orthoHalfFov]\n    // Note moving the offset from M[0][2]+M[1][2] to M[0][3]+M[1][3] - this means\n    // we don't have to feed in Z=1 all the time.\n    // The horizontal offset math is a little hinky because the destination is\n    // actually [-orthoHalfFov+orthoHorizontalOffset,orthoHalfFov+orthoHorizontalOffset]\n    // So we need to first map [-FovPixels/2,FovPixels/2] to\n    //                         [-orthoHalfFov+orthoHorizontalOffset,orthoHalfFov+orthoHorizontalOffset]:\n    // x1 = x0 * orthoHalfFov/(FovPixels/2) + orthoHorizontalOffset;\n    //    = x0 * 2*orthoHalfFov/FovPixels + orthoHorizontalOffset;\n    // But then we need the same mapping as the existing projection matrix, i.e.\n    // x2 = x1 * Projection.M[0][0] + Projection.M[0][2];\n    //    = x0 * (2*orthoHalfFov/FovPixels + orthoHorizontalOffset) * Projection.M[0][0] + Projection.M[0][2];\n    //    = x0 * Projection.M[0][0]*2*orthoHalfFov/FovPixels +\n    //      orthoHorizontalOffset*Projection.M[0][0] + Projection.M[0][2];\n    // So in the new projection matrix we need to scale by Projection.M[0][0]*2*orthoHalfFov/FovPixels and\n    // offset by orthoHorizontalOffset*Projection.M[0][0] + Projection.M[0][2].\n\n    Matrix4f ortho;\n    ortho.M[0][0] = projection.M[0][0] * orthoScale.x;\n    ortho.M[0][1] = 0.0f;\n    ortho.M[0][2] = 0.0f;\n    ortho.M[0][3] = -projection.M[0][2] + ( orthoHorizontalOffset * projection.M[0][0] );\n\n    ortho.M[1][0] = 0.0f;\n    ortho.M[1][1] = -projection.M[1][1] * orthoScale.y;       // Note sign flip (text rendering uses Y=down).\n    ortho.M[1][2] = 0.0f;\n    ortho.M[1][3] = -projection.M[1][2];\n\n    /*\n    if ( fabsf ( zNear - zFar ) < 0.001f )\n    {\n        ortho.M[2][0] = 0.0f;\n        ortho.M[2][1] = 0.0f;\n        ortho.M[2][2] = 0.0f;\n        ortho.M[2][3] = zFar;\n    }\n    else\n    {\n        ortho.M[2][0] = 0.0f;\n        ortho.M[2][1] = 0.0f;\n        ortho.M[2][2] = zFar / (zNear - zFar);\n        ortho.M[2][3] = (zFar * zNear) / (zNear - zFar);\n    }\n    */\n\n    // MA: Undo effect of sign\n    ortho.M[2][0] = 0.0f;\n    ortho.M[2][1] = 0.0f;\n    //ortho.M[2][2] = projection.M[2][2] * projection.M[3][2] * -1.0f; // reverse right-handedness\n    ortho.M[2][2] = 0.0f;\n    ortho.M[2][3] = 0.0f;\n        //projection.M[2][3];\n\n    // No perspective correction for ortho.\n    ortho.M[3][0] = 0.0f;\n    ortho.M[3][1] = 0.0f;\n    ortho.M[3][2] = 0.0f;\n    ortho.M[3][3] = 1.0f;\n\n    return ortho;\n}\n\n\nOVR_EXPORT double ovr_GetTimeInSeconds()\n{\n    return Timer::GetSeconds();\n}\n\n// Waits until the specified absolute time.\nOVR_EXPORT double ovr_WaitTillTime(double absTime)\n{\n    double       initialTime = ovr_GetTimeInSeconds();\n    double       newTime     = initialTime;\n    \n    while(newTime < absTime)\n    {\n        for (int j = 0; j < 5; j++)\n            OVR_PROCESSOR_PAUSE();\n\n        newTime = ovr_GetTimeInSeconds();\n    }\n\n    // How long we waited\n    return newTime - initialTime;\n}\n\n\n//-------------------------------------------------------------------------------------\n\n// 1. Init/shutdown.\n\nstatic ovrBool CAPI_SystemInitCalled = 0;\nstatic ovrBool CAPI_ovrInitializeCalled = 0;\n\nstatic OVR::Service::NetClient* CAPI_pNetClient = 0;\n\nOVR_EXPORT ovrBool ovr_InitializeRenderingShim()\n{\n    OVR::System::DirectDisplayInitialize();\n    return OVR::System::DirectDisplayEnabled();\n}\n\nOVR_EXPORT ovrBool ovr_Initialize()\n{\n    if (CAPI_ovrInitializeCalled)\n        return 1;\n\n    // We must set up the system for the plugin to work\n    if (!OVR::System::IsInitialized())\n    {\n        OVR::System::Init(OVR::Log::ConfigureDefaultLog(OVR::LogMask_All));\n        CAPI_SystemInitCalled = 1;\n    }\n\n    if (!OVR::System::DirectDisplayEnabled() && !OVR::Display::InCompatibilityMode(false))\n    {\n        OVR_ASSERT(false);\n        return 0;\n    }\n\n    CAPI_pNetClient = NetClient::GetInstance();\n\n#ifdef OVR_SINGLE_PROCESS\n\n    // If the server could not start running,\n    if (Service::NetServer::GetInstance()->IsInitialized())\n    {\n        CAPI_pNetClient->Connect(true);\n    }\n    else\n    {\n        // This normally will happen if the OVRService is running in the background,\n        // or another SingleProcess-mode app is running in the background.\n        // In this case, it's using the hardware and we should not also attempt to use\n        // the hardware.\n        LogError(\"{ERR-079} [LibOVR] Server is already running\");\n    }\n#else\n    CAPI_pNetClient->Connect(true);\n#endif\n\n    CAPI_ovrInitializeCalled = 1;\n\n    return 1;\n}\n\nOVR_EXPORT void ovr_Shutdown()\n{  \n    // We should clean up the system to be complete\n    if (OVR::System::IsInitialized() && CAPI_SystemInitCalled)\n    {\n        OVR::System::Destroy();\n    }\n\n    CAPI_SystemInitCalled = 0;\n    CAPI_ovrInitializeCalled = 0;\n}\n\n\n// There is a thread safety issue with ovrHmd_Detect in that multiple calls from different\n// threads can corrupt the global array state. This would lead to two problems:\n//  a) Create(index) enumerator may miss or overshoot items. Probably not a big deal\n//     as game logic can easily be written to only do Detect(s)/Creates in one place.\n//     The alternative would be to return list handle.\n//  b) TBD: Un-mutexed Detect access from two threads could lead to crash. We should\n//         probably check this.\n//\n\nOVR_EXPORT int ovrHmd_Detect()\n{\n    if (!CAPI_ovrInitializeCalled)\n        return 0;\n\n    return CAPI_pNetClient->Hmd_Detect();\n}\n\n\n// ovrHmd_Create us explicitly separated from ConfigureTracking and ConfigureRendering to allow creation of \n// a relatively light-weight handle that would reference the device going forward and would \n// survive future ovrHmd_Detect calls. That is once ovrHMD is returned, index is no longer\n// necessary and can be changed by a ovrHmd_Detect call.\nOVR_EXPORT ovrHmd ovrHmd_Create(int index)\n{\n    if (!CAPI_ovrInitializeCalled)\n        return 0;\n\n    double t0 = Timer::GetSeconds();\n    HMDNetworkInfo netInfo;\n\n    // There may be some delay before the HMD is fully detected.\n    // Since we are also trying to create the HMD immediately it may lose this race and\n    // get \"NO HMD DETECTED.\"  Wait a bit longer to avoid this.\n    while (!CAPI_pNetClient->Hmd_Create(index, &netInfo) ||\n           netInfo.NetId == InvalidVirtualHmdId)\n    {\n        // If two seconds elapse and still no HMD detected,\n        if (Timer::GetSeconds() - t0 > 2.)\n        {\n            if (!NetClient::GetInstance()->IsConnected(false, false))\n            {\n                NetClient::GetInstance()->SetLastError(\"Not connected to service\");\n            }\n            else\n            {\n                NetClient::GetInstance()->SetLastError(\"No HMD Detected\");\n            }\n\n            return 0;\n        }\n    }\n\n    // Create HMD State object\n    HMDState* hmds = HMDState::CreateHMDState(CAPI_pNetClient, netInfo);\n    if (!hmds)\n    {\n        CAPI_pNetClient->Hmd_Release(netInfo.NetId);\n\n        NetClient::GetInstance()->SetLastError(\"Unable to create HMD state\");\n        return 0;\n    }\n\n    // Reset frame timing so that FrameTimeManager values are properly initialized in AppRendered mode.\n    ovrHmd_ResetFrameTiming(hmds->pHmdDesc, 0);\n\n    return hmds->pHmdDesc;\n}\n\n\nOVR_EXPORT ovrBool ovrHmd_AttachToWindow( ovrHmd hmd, void* window,\n                                         const ovrRecti* destMirrorRect,\n                                         const ovrRecti* sourceRenderTargetRect )\n{\n    OVR_UNUSED( destMirrorRect );\n    OVR_UNUSED( sourceRenderTargetRect );\n\n    if (!CAPI_ovrInitializeCalled)\n        return false;\n\n    if (!hmd || !hmd->Handle)\n        return false;\n#ifndef OVR_OS_MAC\n    HMDState* hmds = (HMDState*)hmd->Handle;\n    CAPI_pNetClient->Hmd_AttachToWindow(hmds->GetNetId(), window);\n    hmds->pWindow = window;\n#endif\n#ifdef OVR_OS_WIN32\n    Win32::DisplayShim::GetInstance().hWindow = (HWND)window;\n#endif\n#ifdef OVR_OS_MAC\n    OVR_UNUSED(window);\n#endif\n\n    return true;\n}\n\nOVR_EXPORT ovrHmd ovrHmd_CreateDebug(ovrHmdType type)\n{\n    if (!CAPI_ovrInitializeCalled)\n        return 0;\n\n    HMDState* hmds = HMDState::CreateHMDState(type);\n\n    return hmds->pHmdDesc;\n}\n\nOVR_EXPORT void ovrHmd_Destroy(ovrHmd hmddesc)\n{\n    if (!hmddesc || !hmddesc->Handle)\n        return;\n    \n    // TBD: Any extra shutdown?\n    HMDState* hmds = (HMDState*)hmddesc->Handle;\n        \n    {   // Thread checker in its own scope, to avoid access after 'delete'.\n        // Essentially just checks that no other RenderAPI function is executing.\n        ThreadChecker::Scope checkScope(&hmds->RenderAPIThreadChecker, \"ovrHmd_Destroy\");\n    }    \n\n#ifdef OVR_OS_WIN32\n    if (hmds->pWindow)\n    {\n        // ? ok to call\n        //CAPI_pNetClient->Hmd_AttachToWindow(hmds->GetNetId(), 0);\n        hmds->pWindow = 0;\n        Win32::DisplayShim::GetInstance().hWindow = (HWND)0;\n    }    \n#endif\n\n    delete (HMDState*)hmddesc->Handle;\n}\n\n\nOVR_EXPORT const char* ovrHmd_GetLastError(ovrHmd hmddesc)\n{\n    if (!CAPI_ovrInitializeCalled)\n    {\n        return \"System initialize not called\";\n    }\n\n    VirtualHmdId netId = InvalidVirtualHmdId;\n\n    if (hmddesc && hmddesc->Handle)\n    {\n        HMDState* p = (HMDState*)hmddesc->Handle;\n        netId = p->GetNetId();\n    }\n\n    return CAPI_pNetClient->Hmd_GetLastError(netId);\n}\n\n#define OVR_VERSION_LIBOVR_PFX \"libOVR:\"\n\n// Returns version string representing libOVR version. Static, so\n// string remains valid for app lifespan\nOVR_EXPORT const char* ovr_GetVersionString()\n{\n\tstatic const char* version = OVR_VERSION_LIBOVR_PFX OVR_VERSION_STRING;\n    return version + sizeof(OVR_VERSION_LIBOVR_PFX) - 1;\n}\n\n\n\n//-------------------------------------------------------------------------------------\n\n// Returns capability bits that are enabled at this time; described by ovrHmdCapBits.\n// Note that this value is different font ovrHmdDesc::Caps, which describes what\n// capabilities are available.\nOVR_EXPORT unsigned int ovrHmd_GetEnabledCaps(ovrHmd hmddesc)\n{\n    HMDState* p = (HMDState*)hmddesc->Handle;\n    return p ? p->EnabledHmdCaps : 0;\n}\n\n// Modifies capability bits described by ovrHmdCapBits that can be modified,\n// such as ovrHmdCap_LowPersistance.\nOVR_EXPORT void ovrHmd_SetEnabledCaps(ovrHmd hmddesc, unsigned int capsBits)\n{\n    HMDState* p = (HMDState*)hmddesc->Handle;\n    if (p)\n    {\n        p->SetEnabledHmdCaps(capsBits);\n    }\n}\n\n\n//-------------------------------------------------------------------------------------\n// *** Sensor\n\n// Sensor APIs are separated from Create & Configure for several reasons:\n//  - They need custom parameters that control allocation of heavy resources\n//    such as Vision tracking, which you don't want to create unless necessary.\n//  - A game may want to switch some sensor settings based on user input, \n//    or at lease enable/disable features such as Vision for debugging.\n//  - The same or syntactically similar sensor interface is likely to be used if we \n//    introduce controllers.\n//\n//  - Sensor interface functions are all Thread-safe, unlike the frame/render API\n//    functions that have different rules (all frame access functions\n//    must be on render thread)\n\nOVR_EXPORT ovrBool ovrHmd_ConfigureTracking(ovrHmd hmddesc, unsigned int supportedCaps,\n                                                            unsigned int requiredCaps)\n{\n    if (hmddesc)\n    {\n        HMDState* p = (HMDState*)hmddesc->Handle;\n        return p->ConfigureTracking(supportedCaps, requiredCaps);\n    }\n\n    return 0;\n}\n\nOVR_EXPORT void ovrHmd_RecenterPose(ovrHmd hmddesc)\n{\n    if (hmddesc)\n    {\n        HMDState* p = (HMDState*)hmddesc->Handle;\n        p->TheSensorStateReader.RecenterPose();\n    }\n}\n\nOVR_EXPORT ovrTrackingState ovrHmd_GetTrackingState(ovrHmd hmddesc, double absTime)\n{\n    ovrTrackingState result;\n\n    if (hmddesc)\n    {\n        HMDState* p = (HMDState*)hmddesc->Handle;\n        result = p->PredictedTrackingState(absTime);\n\n        // Instrument data from eye pose\n        p->LagStats.InstrumentEyePose(result);\n    }\n    else\n        memset(&result, 0, sizeof(result));\n\n#ifdef OVR_OS_WIN32\n        // Set up display code for Windows\n        Win32::DisplayShim::GetInstance().Active = (result.StatusFlags & ovrStatus_HmdConnected) != 0;\n#endif\n\n    return result;\n}\n\n\n//-------------------------------------------------------------------------------------\n// *** General Setup\n\n// Per HMD -> calculateIdealPixelSize\nOVR_EXPORT ovrSizei ovrHmd_GetFovTextureSize(ovrHmd hmddesc, ovrEyeType eye, ovrFovPort fov,\n                                             float pixelsPerDisplayPixel)\n{\n    ovrHmdStruct *  hmd = hmddesc->Handle;\n    if (!hmd) return Sizei(0);\n    \n    HMDState* hmds = (HMDState*)hmd;\n    return hmds->RenderState.GetFOVTextureSize(eye, fov, pixelsPerDisplayPixel);\n}\n\n\n//-------------------------------------------------------------------------------------\n\n\nOVR_EXPORT \novrBool ovrHmd_ConfigureRendering( ovrHmd hmddesc,\n                                   const ovrRenderAPIConfig* apiConfig,\n                                   unsigned int distortionCaps,\n                                   const ovrFovPort eyeFovIn[2],\n                                   ovrEyeRenderDesc eyeRenderDescOut[2] )\n{\n    ovrHmdStruct *  hmd = hmddesc->Handle;\n    if (!hmd) return 0;\n    return ((HMDState*)hmd)->ConfigureRendering(eyeRenderDescOut, eyeFovIn,\n                                                apiConfig, distortionCaps);\n}\n\n\n\n// TBD: MA - Deprecated, need alternative\nvoid ovrHmd_SetVsync(ovrHmd hmddesc, ovrBool vsync)\n{\n    ovrHmdStruct *  hmd = hmddesc->Handle;\n    if (!hmd) return;\n\n    return ((HMDState*)hmd)->TimeManager.SetVsync(vsync? true : false);\n}\n\n\nOVR_EXPORT ovrFrameTiming ovrHmd_BeginFrame(ovrHmd hmddesc, unsigned int frameIndex)\n{           \n    HMDState* hmds = (HMDState*)hmddesc->Handle;\n    if (!hmds)\n    {\n        ovrFrameTiming f;\n        memset(&f, 0, sizeof(f));\n        return f;\n    }\n\n    // Check: Proper configure and threading state for the call.\n    hmds->checkRenderingConfigured(\"ovrHmd_BeginFrame\");\n\tOVR_DEBUG_LOG_COND(hmds->BeginFrameCalled, (\"ovrHmd_BeginFrame called multiple times.\"));\n    ThreadChecker::Scope checkScope(&hmds->RenderAPIThreadChecker, \"ovrHmd_BeginFrame\");\n    \n    hmds->BeginFrameCalled   = true;\n    hmds->BeginFrameThreadId = OVR::GetCurrentThreadId();\n\n    return ovrHmd_BeginFrameTiming(hmddesc, frameIndex);\n}\n\n\n// Renders textures to frame buffer\nOVR_EXPORT void ovrHmd_EndFrame(ovrHmd hmddesc,\n                                const ovrPosef renderPose[2],\n                                const ovrTexture eyeTexture[2])\n{\n    HMDState* hmds = (HMDState*)hmddesc->Handle;\n    if (!hmds) return;\n\n    // Instrument when the EndFrame() call started\n    hmds->LagStats.InstrumentEndFrameStart(ovr_GetTimeInSeconds());\n\n    hmds->SubmitEyeTextures(renderPose, eyeTexture);\n\n    // Debug state checks: Must be in BeginFrame, on the same thread.\n    hmds->checkBeginFrameScope(\"ovrHmd_EndFrame\");\n    ThreadChecker::Scope checkScope(&hmds->RenderAPIThreadChecker, \"ovrHmd_EndFrame\");  \n    \n    hmds->pRenderer->SetLatencyTestColor(hmds->LatencyTestActive ? hmds->LatencyTestDrawColor : NULL);\n\n    ovrHmd_GetLatencyTest2DrawColor(hmddesc, NULL); // We don't actually need to draw color, so send NULL\n    \n    if (hmds->pRenderer)\n    {\n        hmds->pRenderer->SaveGraphicsState();\n\n        // See if we need to show the HSWDisplay.\n        if (hmds->pHSWDisplay) // Until we know that these are valid, assume any of them can't be.\n        {\n            ovrHSWDisplayState hswDisplayState;\n            hmds->pHSWDisplay->TickState(&hswDisplayState, true);  // This may internally call HASWarning::Display.\n\n            if (hswDisplayState.Displayed)\n            {\n                hmds->pHSWDisplay->Render(ovrEye_Left, &eyeTexture[ovrEye_Left]);\n                hmds->pHSWDisplay->Render(ovrEye_Right, &eyeTexture[ovrEye_Right]);\n            }\n        }\n\n        hmds->pRenderer->EndFrame(true);\n        hmds->pRenderer->RestoreGraphicsState();\n    }\n\n    // Call after present\n    ovrHmd_EndFrameTiming(hmddesc);\n\n    // Instrument latency tester\n    hmds->LagStats.InstrumentLatencyTimings(hmds->TimeManager);\n\n    // Instrument when the EndFrame() call ended\n    hmds->LagStats.InstrumentEndFrameEnd(ovr_GetTimeInSeconds());\n\n    // Out of BeginFrame\n    hmds->BeginFrameThreadId = 0;\n    hmds->BeginFrameCalled   = false;\n}\n\n\n// Not exposed as part of public API\nOVR_EXPORT void ovrHmd_RegisterPostDistortionCallback(ovrHmd hmddesc, PostDistortionCallback callback)\n{\n    HMDState* hmds = (HMDState*)hmddesc->Handle;\n    if (!hmds) return;\n\n    if (hmds->pRenderer)\n    {\n        hmds->pRenderer->RegisterPostDistortionCallback(callback);\n    }\n}\n\n\n\n//-------------------------------------------------------------------------------------\n// ***** Frame Timing logic\n\n\nOVR_EXPORT ovrFrameTiming ovrHmd_GetFrameTiming(ovrHmd hmddesc, unsigned int frameIndex)\n{\n    ovrHmdStruct *  hmd = hmddesc->Handle;\n    ovrFrameTiming f;\n    memset(&f, 0, sizeof(f));\n\n    HMDState* hmds = (HMDState*)hmd;\n    if (hmds)\n    {\n        FrameTimeManager::Timing frameTiming = hmds->TimeManager.GetFrameTiming(frameIndex);\n\n        f.ThisFrameSeconds       = frameTiming.ThisFrameTime;\n        f.NextFrameSeconds       = frameTiming.NextFrameTime;\n        f.TimewarpPointSeconds   = frameTiming.TimewarpPointTime;\n        f.ScanoutMidpointSeconds = frameTiming.MidpointTime;\n        f.EyeScanoutSeconds[0]   = frameTiming.EyeRenderTimes[0];\n        f.EyeScanoutSeconds[1]   = frameTiming.EyeRenderTimes[1];\n\n         // Compute DeltaSeconds.\n        f.DeltaSeconds = (hmds->LastGetFrameTimeSeconds == 0.0f) ? 0.0f :\n                         (float) (f.ThisFrameSeconds - hmds->LastFrameTimeSeconds);    \n        hmds->LastGetFrameTimeSeconds = f.ThisFrameSeconds;\n        if (f.DeltaSeconds > 1.0f)\n            f.DeltaSeconds = 1.0f;\n    }\n        \n    return f;\n}\n\nOVR_EXPORT ovrFrameTiming ovrHmd_BeginFrameTiming(ovrHmd hmddesc, unsigned int frameIndex)\n{\n    ovrHmdStruct *  hmd = hmddesc->Handle;\n    ovrFrameTiming f;\n    memset(&f, 0, sizeof(f));\n\n    HMDState* hmds = (HMDState*)hmd;\n    if (!hmds) return f;\n\n    // Check: Proper state for the call.    \n    OVR_DEBUG_LOG_COND(hmds->BeginFrameTimingCalled,\n                      (\"ovrHmd_BeginFrameTiming called multiple times.\"));    \n    hmds->BeginFrameTimingCalled = true;\n\n    double thisFrameTime = hmds->TimeManager.BeginFrame(frameIndex);        \n\n    const FrameTimeManager::Timing &frameTiming = hmds->TimeManager.GetFrameTiming();\n\n    f.ThisFrameSeconds      = thisFrameTime;\n    f.NextFrameSeconds      = frameTiming.NextFrameTime;\n    f.TimewarpPointSeconds  = frameTiming.TimewarpPointTime;\n    f.ScanoutMidpointSeconds= frameTiming.MidpointTime;\n    f.EyeScanoutSeconds[0]  = frameTiming.EyeRenderTimes[0];\n    f.EyeScanoutSeconds[1]  = frameTiming.EyeRenderTimes[1];\n\n    // Compute DeltaSeconds.\n    f.DeltaSeconds = (hmds->LastFrameTimeSeconds == 0.0f) ? 0.0f :\n                     (float) (thisFrameTime - hmds->LastFrameTimeSeconds);\n    hmds->LastFrameTimeSeconds = thisFrameTime;\n    if (f.DeltaSeconds > 1.0f)\n        f.DeltaSeconds = 1.0f;\n\n    return f;\n}\n\n\nOVR_EXPORT void ovrHmd_EndFrameTiming(ovrHmd hmddesc)\n{\n    HMDState* hmds = (HMDState*)hmddesc->Handle;\n    if (!hmds) return;\n\n    // Debug state checks: Must be in BeginFrameTiming, on the same thread.\n    hmds->checkBeginFrameTimingScope(\"ovrHmd_EndTiming\");\n   // MA TBD: Correct check or not?\n   // ThreadChecker::Scope checkScope(&hmds->RenderAPIThreadChecker, \"ovrHmd_EndFrame\");\n\n    hmds->TimeManager.EndFrame();   \n    hmds->BeginFrameTimingCalled = false;\n\n    bool dk2LatencyTest = (hmds->EnabledHmdCaps & ovrHmdCap_DynamicPrediction) != 0;\n    if (dk2LatencyTest)\n    {\n        Util::FrameTimeRecordSet recordset;\n        hmds->TheLatencyTestStateReader.GetRecordSet(recordset);\n        hmds->TimeManager.UpdateFrameLatencyTrackingAfterEndFrame( hmds->LatencyTest2DrawColor,\n            recordset);\n    }\n}\n\n\nOVR_EXPORT void ovrHmd_ResetFrameTiming(ovrHmd hmddesc,  unsigned int frameIndex) \n{\n    HMDState* hmds = (HMDState*)hmddesc->Handle;\n    if (!hmds) return;\n    \n    hmds->TimeManager.ResetFrameTiming(frameIndex, \n                                       false,\n                                       hmds->RenderingConfigured);\n    hmds->LastFrameTimeSeconds    = 0.0;\n    hmds->LastGetFrameTimeSeconds = 0.0;\n}\n\nOVR_EXPORT void ovrHmd_GetEyePoses(ovrHmd hmd, unsigned int frameIndex, ovrVector3f hmdToEyeViewOffset[2],\n                                   ovrPosef outEyePoses[2], ovrTrackingState* outHmdTrackingState)\n{\n    HMDState* hmds = (HMDState*)hmd->Handle;\n    if (!hmds) return;\n\n    hmds->LatencyTestActive = hmds->ProcessLatencyTest(hmds->LatencyTestDrawColor);\n    \n    ovrTrackingState hmdTrackingState = hmds->TimeManager.GetEyePredictionTracking(hmd, ovrEye_Count, frameIndex);\n    ovrPosef hmdPose = hmdTrackingState.HeadPose.ThePose;\n\n    // caller passed in a valid pointer, so copy to output\n    if(outHmdTrackingState)\n       *outHmdTrackingState = hmdTrackingState;\n\n    // Currently HmdToEyeViewOffset is only a 3D vector\n    // (Negate HmdToEyeViewOffset because offset is a view matrix offset and not a camera offset)\n    outEyePoses[0] = Posef(hmdPose.Orientation, ((Posef)hmdPose).Apply(-((Vector3f)hmdToEyeViewOffset[0])));\n    outEyePoses[1] = Posef(hmdPose.Orientation, ((Posef)hmdPose).Apply(-((Vector3f)hmdToEyeViewOffset[1])));\n\n \t// Instrument data from eye pose\n    hmds->LagStats.InstrumentEyePose(hmdTrackingState);\n}\n\novrPosef ovrHmd_GetHmdPosePerEye(ovrHmd hmd, ovrEyeType eye)\n{\n    HMDState* hmds = (HMDState*)hmd->Handle;\n    if (!hmds) return ovrPosef();    \n\n    // This isn't a great place, but since we removed ovrHmd_BeginEyeRender...\n    // Only process latency tester for drawing the left eye (assumes left eye is drawn first)\n    if (hmds->pRenderer && eye == 0)\n    {\n        hmds->LatencyTestActive = hmds->ProcessLatencyTest(hmds->LatencyTestDrawColor);\n    }\n\n    hmds->checkBeginFrameTimingScope(\"ovrHmd_GetEyePose\");\n    return hmds->TimeManager.GetEyePredictionPose(hmd, eye);\n}\n\nOVR_EXPORT void ovrHmd_AddDistortionTimeMeasurement(ovrHmd hmddesc, double distortionTimeSeconds)\n{\n    if (!hmddesc)\n        return;\n    HMDState* hmds = (HMDState*)hmddesc->Handle;\n\n    hmds->checkBeginFrameTimingScope(\"ovrHmd_GetTimewarpEyeMatrices\");   \n    hmds->TimeManager.AddDistortionTimeMeasurement(distortionTimeSeconds);\n}\n\n\n\nOVR_EXPORT void ovrHmd_GetEyeTimewarpMatricesDebug(ovrHmd hmddesc, ovrEyeType eye,\n                                              ovrPosef renderPose, ovrMatrix4f twmOut[2],double debugTimingOffsetInSeconds)\n{\n    if (!hmddesc)\n        return;\n    HMDState* hmds = (HMDState*)hmddesc->Handle;\n\n    // Debug checks: BeginFrame was called, on the same thread.\n    hmds->checkBeginFrameTimingScope(\"ovrHmd_GetTimewarpEyeMatrices\");   \n\n    hmds->TimeManager.GetTimewarpMatrices(hmddesc, eye, renderPose, twmOut, debugTimingOffsetInSeconds);\n\n    /*\n    // MA: Took this out because new latency test approach just sames\n    //     the sample times in FrameTimeManager.\n    // TODO: if no timewarp, then test latency in begin eye render\n    if (eye == 0)\n    {        \n        hmds->ProcessLatencyTest2(hmds->LatencyTest2DrawColor, -1.0f);\n    }\n    */\n}\n\n\nOVR_EXPORT void ovrHmd_GetEyeTimewarpMatrices(ovrHmd hmddesc, ovrEyeType eye,\n                                              ovrPosef renderPose, ovrMatrix4f twmOut[2])\n{\n    return(ovrHmd_GetEyeTimewarpMatricesDebug(hmddesc, eye, renderPose, twmOut, 0.0));\n}\n\n\n\nOVR_EXPORT ovrEyeRenderDesc ovrHmd_GetRenderDesc(ovrHmd hmddesc,\n                                                 ovrEyeType eyeType, ovrFovPort fov)\n{\n    HMDState* hmds = (HMDState*)hmddesc->Handle;\n    ovrEyeRenderDesc erd;\n   \n    if (!hmds)\n    {\n        memset(&erd, 0, sizeof(erd));\n        return erd;\n    }\n\n    return hmds->RenderState.CalcRenderDesc(eyeType, fov);\n}\n\n\n\n#define OVR_OFFSET_OF(s, field) ((size_t)&((s*)0)->field)\n\n\n\n\nOVR_EXPORT ovrBool ovrHmd_CreateDistortionMeshDebug( ovrHmd hmddesc,\n                                                ovrEyeType eyeType, ovrFovPort fov,\n                                                unsigned int distortionCaps,\n                                                ovrDistortionMesh *meshData,\n\t\t\t\t\t\t\t\t\t\t\t\tfloat debugEyeReliefOverrideInMetres)\n{\n    // The 'internal' function below can be found in CAPI_HMDState.\n    // Not ideal, but navigating the convolutions of what compiles\n    // where, meant they are in the few places which actually lets these compile.\n    // Please relocate (if you wish) to a more meaningful place if you can navigate the compiler gymnastics :)\n    return(ovrHmd_CreateDistortionMeshInternal( hmddesc->Handle,\n                                                eyeType, fov,\n                                                distortionCaps,\n                                                meshData,\n                                                debugEyeReliefOverrideInMetres));\n\n}\nOVR_EXPORT ovrBool ovrHmd_CreateDistortionMesh( ovrHmd hmddesc,\n                                                ovrEyeType eyeType, ovrFovPort fov,\n                                                unsigned int distortionCaps,\n                                                ovrDistortionMesh *meshData)\n{\n    return(ovrHmd_CreateDistortionMeshDebug( hmddesc, eyeType, fov, distortionCaps,meshData, 0));\n}\n\n\n\n// Frees distortion mesh allocated by ovrHmd_GenerateDistortionMesh. meshData elements\n// are set to null and 0s after the call.\nOVR_EXPORT void ovrHmd_DestroyDistortionMesh(ovrDistortionMesh* meshData)\n{\n    if (meshData->pVertexData)\n        DistortionMeshDestroy((DistortionMeshVertexData*)meshData->pVertexData,\n                              meshData->pIndexData);\n    meshData->pVertexData = 0;\n    meshData->pIndexData  = 0;\n    meshData->VertexCount = 0;\n    meshData->IndexCount  = 0;\n}\n\n\n\n// Computes updated 'uvScaleOffsetOut' to be used with a distortion if render target size or\n// viewport changes after the fact. This can be used to adjust render size every frame, if desired.\nOVR_EXPORT void ovrHmd_GetRenderScaleAndOffset( ovrFovPort fov,\n                                                ovrSizei textureSize, ovrRecti renderViewport,\n                                                ovrVector2f uvScaleOffsetOut[2] )\n{        \n    // Find the mapping from TanAngle space to target NDC space.\n    ScaleAndOffset2D  eyeToSourceNDC = CreateNDCScaleAndOffsetFromFov(fov);\n    // Find the mapping from TanAngle space to textureUV space.\n    ScaleAndOffset2D  eyeToSourceUV  = CreateUVScaleAndOffsetfromNDCScaleandOffset(\n                                         eyeToSourceNDC,\n                                         renderViewport, textureSize );\n\n    uvScaleOffsetOut[0] = eyeToSourceUV.Scale;\n    uvScaleOffsetOut[1] = eyeToSourceUV.Offset;\n}\n\n\n//-------------------------------------------------------------------------------------\n// ***** Latency Test interface\n\nOVR_EXPORT ovrBool ovrHmd_GetLatencyTestDrawColor(ovrHmd hmddesc, unsigned char rgbColorOut[3])\n{\n    HMDState* p = (HMDState*)hmddesc->Handle;\n    rgbColorOut[0] = p->LatencyTestDrawColor[0];\n    rgbColorOut[1] = p->LatencyTestDrawColor[1];\n    rgbColorOut[2] = p->LatencyTestDrawColor[2];\n    return p->LatencyTestActive;\n}\n\nOVR_EXPORT ovrBool ovrHmd_ProcessLatencyTest(ovrHmd hmddesc, unsigned char rgbColorOut[3])\n{\n    OVR_UNUSED(hmddesc);\n    return NetClient::GetInstance()->LatencyUtil_ProcessInputs(Timer::GetSeconds(), rgbColorOut);\n}\n\nOVR_EXPORT const char*  ovrHmd_GetLatencyTestResult(ovrHmd hmddesc)\n{\n    OVR_UNUSED(hmddesc);\n    return NetClient::GetInstance()->LatencyUtil_GetResultsString();\n}\n\nOVR_EXPORT ovrBool ovrHmd_GetLatencyTest2DrawColor(ovrHmd hmddesc, unsigned char rgbColorOut[3])\n{\n    HMDState* hmds = (HMDState*)hmddesc->Handle;\n    if (!hmds) return false;\n\n    // TBD: Move directly into renderer\n    bool dk2LatencyTest = (hmds->EnabledHmdCaps & ovrHmdCap_DynamicPrediction) != 0;\n    if (dk2LatencyTest)\n    {\n        hmds->TimeManager.GetFrameLatencyTestDrawColor(hmds->LatencyTest2DrawColor);\n        if(rgbColorOut != NULL)\n        {\n            rgbColorOut[0] = hmds->LatencyTest2DrawColor[0];\n            rgbColorOut[1] = hmds->LatencyTest2DrawColor[1];\n            rgbColorOut[2] = hmds->LatencyTest2DrawColor[2];\n        }\n\n        if(hmds->pRenderer != NULL)\n            hmds->pRenderer->SetLatencyTest2Color(hmds->LatencyTest2DrawColor);\n    }\n    else\n    {\n        if(hmds->pRenderer != NULL)\n            hmds->pRenderer->SetLatencyTest2Color(NULL);\n    }\n\n    return dk2LatencyTest;\n}\n\n\nOVR_EXPORT double ovrHmd_GetMeasuredLatencyTest2(ovrHmd hmddesc)\n{\n    HMDState* p = (HMDState*)hmddesc->Handle;\n\n    // MA Test\n    float latencyRender, latencyTimewarp, latencyPostPresent;\n\n    p->TimeManager.GetLatencyTimings(latencyRender, latencyTimewarp, latencyPostPresent);\n    return latencyPostPresent;\n}\n\n\n//-------------------------------------------------------------------------------------\n// ***** Health and Safety Warning Display interface\n//\n\nOVR_EXPORT void ovrHmd_GetHSWDisplayState(ovrHmd hmd, ovrHSWDisplayState *hswDisplayState)\n{\n    OVR::CAPI::HMDState* pHMDState = (OVR::CAPI::HMDState*)hmd->Handle;\n\n    if (pHMDState)\n    {\n        OVR::CAPI::HSWDisplay* pHSWDisplay = pHMDState->pHSWDisplay;\n\n        if(pHSWDisplay)\n            pHSWDisplay->TickState(hswDisplayState); // This may internally call HSWDisplay::Display.\n    }\n}\n\nOVR_EXPORT ovrBool ovrHmd_DismissHSWDisplay(ovrHmd hmd)\n{\n    OVR::CAPI::HMDState* pHMDState = (OVR::CAPI::HMDState*)hmd->Handle;\n\n    if (pHMDState)\n    {\n        OVR::CAPI::HSWDisplay* pHSWDisplay = pHMDState->pHSWDisplay;\n\n        if(pHSWDisplay)\n            return (pHSWDisplay->Dismiss() ? 1 : 0);\n    }\n\n    return false;\n}\n\n\n// -----------------------------------------------------------------------------------\n// ***** Property Access\nOVR_EXPORT ovrBool ovrHmd_GetBool(ovrHmd hmddesc,\n                                  const char* propertyName,\n                                  ovrBool defaultVal)\n{\n    OVR_ASSERT(propertyName);\n    if (hmddesc)\n    {\n        HMDState* hmds = (HMDState*)hmddesc->Handle;\n        OVR_ASSERT(hmds);\n        if (hmds)\n        {\n            return hmds->getBoolValue(propertyName, (defaultVal != 0));\n        }\n    }\n\n    return NetClient::GetInstance()->GetBoolValue(InvalidVirtualHmdId, propertyName, (defaultVal != 0)) ? 1 : 0;\n}\n\nOVR_EXPORT ovrBool ovrHmd_SetBool(ovrHmd hmddesc,\n                                  const char* propertyName,\n                                  ovrBool value)\n{\n    OVR_ASSERT(propertyName);\n    if (hmddesc)\n    {\n        HMDState* hmds = (HMDState*)hmddesc->Handle;\n        OVR_ASSERT(hmds);\n        if (hmds)\n        {\n            return hmds->setBoolValue(propertyName, value != 0) ? 1 : 0;\n        }\n    }\n\n    return NetClient::GetInstance()->SetBoolValue(InvalidVirtualHmdId, propertyName, (value != 0)) ? 1 : 0;\n}\n\nOVR_EXPORT int ovrHmd_GetInt(ovrHmd hmddesc,\n                             const char* propertyName,\n                             int defaultVal)\n{\n    OVR_ASSERT(propertyName);\n    if (hmddesc)\n    {\n        HMDState* hmds = (HMDState*)hmddesc->Handle;\n        OVR_ASSERT(hmds);\n        if (hmds)\n        {\n            return hmds->getIntValue(propertyName, defaultVal);\n        }\n    }\n\n    return NetClient::GetInstance()->GetIntValue(InvalidVirtualHmdId, propertyName, defaultVal);\n}\n\nOVR_EXPORT ovrBool ovrHmd_SetInt(ovrHmd hmddesc,\n                                 const char* propertyName,\n                                 int value)\n{\n    OVR_ASSERT(propertyName);\n    if (hmddesc)\n    {\n        HMDState* hmds = (HMDState*)hmddesc->Handle;\n        OVR_ASSERT(hmds);\n        if (hmds)\n        {\n            return hmds->setIntValue(propertyName, value) ? 1 : 0;\n        }\n    }\n\n    return NetClient::GetInstance()->SetIntValue(InvalidVirtualHmdId, propertyName, value) ? 1 : 0;\n}\n\nOVR_EXPORT float ovrHmd_GetFloat(ovrHmd hmddesc,\n                                 const char* propertyName,\n                                 float defaultVal)\n{\n    OVR_ASSERT(propertyName);\n    if (hmddesc)\n    {\n        HMDState* hmds = (HMDState*)hmddesc->Handle;\n        OVR_ASSERT(hmds);\n        if (hmds)\n        {\n            return hmds->getFloatValue(propertyName, defaultVal);\n        }\n    }\n\n    return (float)NetClient::GetInstance()->GetNumberValue(InvalidVirtualHmdId, propertyName, defaultVal);\n}\n\nOVR_EXPORT ovrBool ovrHmd_SetFloat(ovrHmd hmddesc,\n                                   const char* propertyName,\n                                   float value)\n{\n    OVR_ASSERT(propertyName);\n    if (hmddesc)\n    {\n        HMDState* hmds = (HMDState*)hmddesc->Handle;\n        OVR_ASSERT(hmds);\n        if (hmds)\n        {\n            return hmds->setFloatValue(propertyName, value) ? 1 : 0;\n        }\n    }\n\n    return NetClient::GetInstance()->SetNumberValue(InvalidVirtualHmdId, propertyName, value) ? 1 : 0;\n}\n\nOVR_EXPORT unsigned int ovrHmd_GetFloatArray(ovrHmd hmddesc,\n                                             const char* propertyName,\n                                             float values[],\n                                             unsigned int arraySize)\n{\n    OVR_ASSERT(propertyName);\n    OVR_ASSERT(hmddesc);\n    if (hmddesc)\n    {\n        HMDState* hmds = (HMDState*)hmddesc->Handle;\n        OVR_ASSERT(hmds);\n        if (hmds)\n        {\n            return hmds->getFloatArray(propertyName, values, arraySize);\n        }\n    }\n\n    // FIXME: Currently it takes a few lines of code to do this, so just not supported for now.\n    return 0;\n}\n\n// Modify float[] property; false if property doesn't exist or is readonly.\nOVR_EXPORT ovrBool ovrHmd_SetFloatArray(ovrHmd hmddesc,\n                                        const char* propertyName,\n                                        float values[],\n                                        unsigned int arraySize)\n{\n    OVR_ASSERT(propertyName);\n    OVR_ASSERT(hmddesc);\n    if (hmddesc)\n    {\n        HMDState* hmds = (HMDState*)hmddesc->Handle;\n        OVR_ASSERT(hmds);\n        if (hmds)\n        {\n            return hmds->setFloatArray(propertyName, values, arraySize) ? 1 : 0;\n        }\n    }\n\n    // FIXME: Currently it takes a few lines of code to do this, so just not supported for now.\n    return 0;\n}\n\nOVR_EXPORT const char* ovrHmd_GetString(ovrHmd hmddesc,\n                                        const char* propertyName,\n                                        const char* defaultVal)\n{\n    OVR_ASSERT(propertyName);\n    if (hmddesc)\n    {\n        HMDState* hmds = (HMDState*)hmddesc->Handle;\n        if (hmds)\n        {\n            return hmds->getString(propertyName, defaultVal);\n        }\n    }\n\n    return NetClient::GetInstance()->GetStringValue(InvalidVirtualHmdId, propertyName, defaultVal);\n}\n \nOVR_EXPORT ovrBool ovrHmd_SetString(ovrHmd hmddesc,\n                                    const char* propertyName,\n                                    const char* value)\n{\n    OVR_ASSERT(propertyName);\n    if (hmddesc)\n    {\n        HMDState* hmds = (HMDState*)hmddesc->Handle;\n        if (hmds)\n        {\n            return hmds->setString(propertyName, value) ? 1 : 0;\n        }\n    }\n\n    return NetClient::GetInstance()->SetStringValue(InvalidVirtualHmdId, propertyName, value) ? 1 : 0;\n}\n\n// -----------------------------------------------------------------------------------\n// ***** Logging\n\nOVR_EXPORT ovrBool ovrHmd_StartPerfLog(ovrHmd hmd, const char* fileName, const char* userData1)\n{\n    OVR_ASSERT(fileName && fileName[0]);\n\n    OVR::CAPI::HMDState* pHMDState = (OVR::CAPI::HMDState*)hmd->Handle;\n\n    if (pHMDState)\n    {\n        ovrBool started = pHMDState->LagStatsCSV.Start(fileName, userData1) ? 1 : 0;\n        if (started)\n            pHMDState->LagStats.AddResultsObserver(pHMDState->LagStatsCSV.GetObserver());\n        return started;\n    }\n    return 0;\n}\nOVR_EXPORT ovrBool ovrHmd_StopPerfLog(ovrHmd hmd)\n{\n    OVR::CAPI::HMDState* pHMDState = (OVR::CAPI::HMDState*)hmd->Handle;\n\n    if (pHMDState)\n    {\n        return pHMDState->LagStatsCSV.Stop() ? 1 : 0;\n    }\n    return false;\n}\n\n\n#ifdef __cplusplus \n} // extern \"C\"\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/OVR_CAPI.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_CAPI.h\nContent     :   C Interface to Oculus tracking and rendering.\nCreated     :   November 23, 2013\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n/// @file OVR_CAPI.h\n/// Exposes all general Rift functionality.\n\n#ifndef OVR_CAPI_h\n#define OVR_CAPI_h\n\n#include <stdint.h>\n\n#include \"OVR_CAPI_Keys.h\"\n\ntypedef char ovrBool;\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_EXPORT definition\n\n#if !defined(OVR_EXPORT)\n    #ifdef OVR_OS_WIN32\n        #define OVR_EXPORT __declspec(dllexport)\n    #else\n        #define OVR_EXPORT\n    #endif\n#endif\n\n\n\n//-----------------------------------------------------------------------------------\n// ***** OVR_ALIGNAS definition\n//\n#if !defined(OVR_ALIGNAS)\n    // C++11 alignas\n    #if defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 408) && (defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L))\n        #define OVR_ALIGNAS(n) alignas(n)\n    #elif defined(__clang__) && !defined(__APPLE__) && (((__clang_major__ * 100) + __clang_minor__) >= 300) && (__cplusplus >= 201103L)\n        #define OVR_ALIGNAS(n) alignas(n)\n    #elif defined(__clang__) && defined(__APPLE__) && (((__clang_major__ * 100) + __clang_minor__) >= 401) && (__cplusplus >= 201103L)\n        #define OVR_ALIGNAS(n) alignas(n)\n    #elif defined(_MSC_VER) && (_MSC_VER >= 1900)\n        #define OVR_ALIGNAS(n) alignas(n)\n    #elif defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 408)\n        #define OVR_ALIGNAS(n) alignas(n)\n\n    // Pre-C++11 alignas fallbacks\n    #elif defined(__GNUC__) || defined(__clang__)\n        #define OVR_ALIGNAS(n) __attribute__((aligned(n)))\n    #elif defined(_MSC_VER) || defined(__INTEL_COMPILER)\n        #define OVR_ALIGNAS(n) __declspec(align(n))             // For Microsoft the alignment must be a literal integer.\n    #elif defined(__CC_ARM)\n        #define OVR_ALIGNAS(n) __align(n)\n    #else\n        #error Need to define OVR_ALIGNAS\n    #endif\n#endif\n\n#if defined(_MSC_VER)\n    #pragma warning(push)\n    #pragma warning(disable: 4324) // structure was padded due to __declspec(align())\n#endif\n\n\n//#define ENABLE_LATENCY_TESTER\n\n//-----------------------------------------------------------------------------------\n// ***** Simple Math Structures\n\n/// A 2D vector with integer components.\ntypedef struct ovrVector2i_\n{\n    int x, y;\n} ovrVector2i;\n\n/// A 2D size with integer components.\ntypedef struct ovrSizei_\n{\n    int w, h;\n} ovrSizei;\n/// A 2D rectangle with a position and size.\n/// All components are integers.\ntypedef struct ovrRecti_\n{\n    ovrVector2i Pos;\n    ovrSizei    Size;\n} ovrRecti;\n\n/// A quaternion rotation.\ntypedef struct ovrQuatf_\n{\n    float x, y, z, w;\n} ovrQuatf;\n\n/// A 2D vector with float components.\ntypedef struct ovrVector2f_\n{\n    float x, y;\n} ovrVector2f;\n\n/// A 3D vector with float components.\ntypedef struct ovrVector3f_\n{\n    float x, y, z;\n} ovrVector3f;\n\n/// A 4x4 matrix with float elements.\ntypedef struct ovrMatrix4f_\n{\n    float M[4][4];\n} ovrMatrix4f;\n\n/// Position and orientation together.\ntypedef struct ovrPosef_\n{\n    ovrQuatf     Orientation;\n    ovrVector3f  Position;\n} ovrPosef;\n\n/// A full pose (rigid body) configuration with first and second derivatives.\ntypedef struct ovrPoseStatef_\n{\n    ovrPosef     ThePose;               ///< The body's position and orientation.\n    ovrVector3f  AngularVelocity;       ///< The body's angular velocity in radians per second.\n    ovrVector3f  LinearVelocity;        ///< The body's velocity in meters per second.\n    ovrVector3f  AngularAcceleration;   ///< The body's angular acceleration in radians per second per second.\n    ovrVector3f  LinearAcceleration;    ///< The body's acceleration in meters per second per second.\n    double       TimeInSeconds;         ///< Absolute time of this state sample.\n} ovrPoseStatef;\n\n/// Field Of View (FOV) in tangent of the angle units.\n/// As an example, for a standard 90 degree vertical FOV, we would\n/// have: { UpTan = tan(90 degrees / 2), DownTan = tan(90 degrees / 2) }.\ntypedef struct ovrFovPort_\n{\n    /// The tangent of the angle between the viewing vector and the top edge of the field of view.\n    float UpTan;\n    /// The tangent of the angle between the viewing vector and the bottom edge of the field of view.\n    float DownTan;\n    /// The tangent of the angle between the viewing vector and the left edge of the field of view.\n    float LeftTan;\n    /// The tangent of the angle between the viewing vector and the right edge of the field of view.\n    float RightTan;\n} ovrFovPort;\n\n//-----------------------------------------------------------------------------------\n// ***** HMD Types\n\n/// Enumerates all HMD types that we support.\ntypedef enum\n{\n    ovrHmd_None             = 0,\n    ovrHmd_DK1              = 3,\n    ovrHmd_DKHD             = 4,\n    ovrHmd_DK2              = 6,\n    ovrHmd_Other             // Some HMD other then the one in the enumeration.\n} ovrHmdType;\n\n/// HMD capability bits reported by device.\ntypedef enum\n{\n    // Read-only flags.\n    ovrHmdCap_Present           = 0x0001,   /// The HMD is plugged in and detected by the system.\n    ovrHmdCap_Available         = 0x0002,   /// The HMD and its sensor are available for ownership use.\n\t\t\t\t\t\t\t\t\t\t\t/// i.e. it is not already owned by another application.\n    ovrHmdCap_Captured          = 0x0004,   /// Set to 'true' if we captured ownership of this HMD.\n\n    // These flags are intended for use with the new driver display mode.\n    ovrHmdCap_ExtendDesktop     = 0x0008,   /// (read only) Means the display driver is in compatibility mode.\n\n    // Modifiable flags (through ovrHmd_SetEnabledCaps).\n    ovrHmdCap_NoMirrorToWindow  = 0x2000,   /// Disables mirroring of HMD output to the window. This may improve \n\t\t\t\t\t\t\t\t\t\t\t/// rendering performance slightly (only if 'ExtendDesktop' is off).\n    ovrHmdCap_DisplayOff        = 0x0040,   /// Turns off HMD screen and output (only if 'ExtendDesktop' is off).\n\n    ovrHmdCap_LowPersistence    = 0x0080,   /// HMD supports low persistence mode.\n    ovrHmdCap_DynamicPrediction = 0x0200,   /// Adjust prediction dynamically based on internally measured latency.\n    ovrHmdCap_DirectPentile     = 0x0400,   /// Write directly in pentile color mapping format\n    ovrHmdCap_NoVSync           = 0x1000,   /// Support rendering without VSync for debugging.\n\n    // These bits can be modified by ovrHmd_SetEnabledCaps.\n    ovrHmdCap_Writable_Mask     = 0x32F0,\n\n    /// These flags are currently passed into the service. May change without notice.\n    ovrHmdCap_Service_Mask      = 0x22F0\n} ovrHmdCaps;\n\n\n/// Tracking capability bits reported by the device.\n/// Used with ovrHmd_ConfigureTracking.\ntypedef enum\n{\n    ovrTrackingCap_Orientation      = 0x0010,   /// Supports orientation tracking (IMU).\n    ovrTrackingCap_MagYawCorrection = 0x0020,   /// Supports yaw drift correction via a magnetometer or other means.\n    ovrTrackingCap_Position         = 0x0040,   /// Supports positional tracking.\n    /// Overrides the other flags. Indicates that the application\n    /// doesn't care about tracking settings. This is the internal\n    /// default before ovrHmd_ConfigureTracking is called.\n    ovrTrackingCap_Idle             = 0x0100,\n} ovrTrackingCaps;\n\n/// Distortion capability bits reported by device.\n/// Used with ovrHmd_ConfigureRendering and ovrHmd_CreateDistortionMesh.\ntypedef enum\n{\n    ovrDistortionCap_Chromatic          =   0x01,     /// Supports chromatic aberration correction.\n    ovrDistortionCap_TimeWarp           =   0x02,     /// Supports timewarp.\n    // 0x04 unused\n    ovrDistortionCap_Vignette           =   0x08,     /// Supports vignetting around the edges of the view.\n    ovrDistortionCap_NoRestore          =   0x10,     /// Do not save and restore the graphics and compute state when rendering distortion.\n    ovrDistortionCap_FlipInput          =   0x20,     /// Flip the vertical texture coordinate of input images.\n    ovrDistortionCap_SRGB               =   0x40,     /// Assume input images are in sRGB gamma-corrected color space.\n    ovrDistortionCap_Overdrive          =   0x80,     /// Overdrive brightness transitions to reduce artifacts on DK2+ displays\n    ovrDistortionCap_HqDistortion       =  0x100,     /// High-quality sampling of distortion buffer for anti-aliasing\n    ovrDistortionCap_LinuxDevFullscreen =  0x200,     /// Indicates window is fullscreen on a device when set. The SDK will automatically apply distortion mesh rotation if needed.\n    ovrDistortionCap_ComputeShader      =  0x400,     /// Using compute shader (DX11+ only)\n\n    ovrDistortionCap_ProfileNoTimewarpSpinWaits = 0x10000,  /// Use when profiling with timewarp to remove false positives\n} ovrDistortionCaps;\n\n/// Specifies which eye is being used for rendering.\n/// This type explicitly does not include a third \"NoStereo\" option, as such is\n/// not required for an HMD-centered API.\ntypedef enum\n{\n    ovrEye_Left  = 0,\n    ovrEye_Right = 1,\n    ovrEye_Count = 2\n} ovrEyeType;\n\n/// This is a complete descriptor of the HMD.\ntypedef struct ovrHmdDesc_\n{\n    /// Internal handle of this HMD.\n    struct ovrHmdStruct* Handle;\n\n    /// This HMD's type.\n    ovrHmdType  Type;\n    \n    /// Name string describing the product: \"Oculus Rift DK1\", etc.\n    const char* ProductName;\n    const char* Manufacturer;\n    \n    /// HID Vendor and ProductId of the device.\n    short       VendorId;\n    short       ProductId;\n    /// Sensor (and display) serial number.\n    char        SerialNumber[24];\n    /// Sensor firmware version.\n    short       FirmwareMajor;\n    short       FirmwareMinor;\n    /// External tracking camera frustum dimensions (if present).\n    float       CameraFrustumHFovInRadians;\n    float       CameraFrustumVFovInRadians;\n    float       CameraFrustumNearZInMeters;\n    float       CameraFrustumFarZInMeters;\n\n    /// Capability bits described by ovrHmdCaps.\n    unsigned int HmdCaps;\n\t/// Capability bits described by ovrTrackingCaps.\n    unsigned int TrackingCaps;\n    /// Capability bits described by ovrDistortionCaps.\n    unsigned int DistortionCaps;\n\n    /// These define the recommended and maximum optical FOVs for the HMD.\n    ovrFovPort  DefaultEyeFov[ovrEye_Count];\n    ovrFovPort  MaxEyeFov[ovrEye_Count];\n\n    /// Preferred eye rendering order for best performance.\n    /// Can help reduce latency on sideways-scanned screens.\n    ovrEyeType  EyeRenderOrder[ovrEye_Count];\n\n    /// Resolution of the full HMD screen (both eyes) in pixels.\n    ovrSizei    Resolution;\n    /// Location of the application window on the desktop (or 0,0).\n    ovrVector2i WindowsPos;\n\n    /// Display that the HMD should present on.\n    /// TBD: It may be good to remove this information relying on WindowPos instead.\n    /// Ultimately, we may need to come up with a more convenient alternative,\n    /// such as API-specific functions that return adapter, or something that will\n    /// work with our monitor driver.\n    /// Windows: (e.g. \"\\\\\\\\.\\\\DISPLAY3\", can be used in EnumDisplaySettings/CreateDC).\n    const char* DisplayDeviceName;\n    /// MacOS:\n    int         DisplayId;\n\n} ovrHmdDesc;\n\n/// Simple type ovrHmd is used in ovrHmd_* calls.\ntypedef const ovrHmdDesc * ovrHmd;\n\n/// Bit flags describing the current status of sensor tracking.\ntypedef enum\n{\n    ovrStatus_OrientationTracked    = 0x0001,   /// Orientation is currently tracked (connected and in use).\n    ovrStatus_PositionTracked       = 0x0002,   /// Position is currently tracked (false if out of range).\n    ovrStatus_CameraPoseTracked     = 0x0004,   /// Camera pose is currently tracked.\n    ovrStatus_PositionConnected     = 0x0020,   /// Position tracking hardware is connected.\n    ovrStatus_HmdConnected          = 0x0080    /// HMD Display is available and connected.\n} ovrStatusBits;\n\n/// Specifies a reading we can query from the sensor.\ntypedef struct ovrSensorData_\n{\n    ovrVector3f    Accelerometer;    /// Acceleration reading in m/s^2.\n    ovrVector3f    Gyro;             /// Rotation rate in rad/s.\n    ovrVector3f    Magnetometer;     /// Magnetic field in Gauss.\n    float          Temperature;      /// Temperature of the sensor in degrees Celsius.\n    float          TimeInSeconds;    /// Time when the reported IMU reading took place, in seconds.\n} ovrSensorData;\n\n/// Tracking state at a given absolute time (describes predicted HMD pose etc).\n/// Returned by ovrHmd_GetTrackingState.\ntypedef struct ovrTrackingState_\n{\n    /// Predicted head pose (and derivatives) at the requested absolute time.\n    /// The look-ahead interval is equal to (HeadPose.TimeInSeconds - RawSensorData.TimeInSeconds).\n    ovrPoseStatef  HeadPose;\n\n    /// Current pose of the external camera (if present).\n    /// This pose includes camera tilt (roll and pitch). For a leveled coordinate\n    /// system use LeveledCameraPose.\n    ovrPosef       CameraPose;\n\n    /// Camera frame aligned with gravity.\n    /// This value includes position and yaw of the camera, but not roll and pitch.\n    /// It can be used as a reference point to render real-world objects in the correct location.\n    ovrPosef       LeveledCameraPose;\n\n    /// The most recent sensor data received from the HMD.\n    ovrSensorData  RawSensorData;\n\n    /// Tracking status described by ovrStatusBits.\n    unsigned int   StatusFlags;\n\n    //// 0.4.1\n\n    // Measures the time from receiving the camera frame until vision CPU processing completes.\n    double LastVisionProcessingTime;\n\n    //// 0.4.3\n\n    // Measures the time from exposure until the pose is available for the frame, including processing time.\n    double LastVisionFrameLatency;\n\n    /// Tag the vision processing results to a certain frame counter number.\n    uint32_t LastCameraFrameCounter;\n} ovrTrackingState;\n\n/// Frame timing data reported by ovrHmd_BeginFrameTiming() or ovrHmd_BeginFrame().\ntypedef struct ovrFrameTiming_\n{\n    /// The amount of time that has passed since the previous frame's\n\t/// ThisFrameSeconds value (usable for movement scaling).\n    /// This will be clamped to no more than 0.1 seconds to prevent\n    /// excessive movement after pauses due to loading or initialization.\n    float           DeltaSeconds;\n\n    /// It is generally expected that the following holds:\n    /// ThisFrameSeconds < TimewarpPointSeconds < NextFrameSeconds < \n    /// EyeScanoutSeconds[EyeOrder[0]] <= ScanoutMidpointSeconds <= EyeScanoutSeconds[EyeOrder[1]].\n\n    /// Absolute time value when rendering of this frame began or is expected to\n    /// begin. Generally equal to NextFrameSeconds of the previous frame. Can be used\n    /// for animation timing.\n    double          ThisFrameSeconds;\n    /// Absolute point when IMU expects to be sampled for this frame.\n    double          TimewarpPointSeconds;\n    /// Absolute time when frame Present followed by GPU Flush will finish and the next frame begins.\n    double          NextFrameSeconds;\n\n    /// Time when half of the screen will be scanned out. Can be passed as an absolute time\n\t/// to ovrHmd_GetTrackingState() to get the predicted general orientation.\n    double          ScanoutMidpointSeconds;\n    /// Timing points when each eye will be scanned out to display. Used when rendering each eye.\n    double          EyeScanoutSeconds[2];\n} ovrFrameTiming;\n\n/// Rendering information for each eye. Computed by either ovrHmd_ConfigureRendering()\n/// or ovrHmd_GetRenderDesc() based on the specified FOV. Note that the rendering viewport\n/// is not included here as it can be specified separately and modified per frame through:\n///    (a) ovrHmd_GetRenderScaleAndOffset in the case of client rendered distortion,\n/// or (b) passing different values via ovrTexture in the case of SDK rendered distortion.\ntypedef struct ovrEyeRenderDesc_\n{\n    ovrEyeType  Eye;                        ///< The eye index this instance corresponds to.\n    ovrFovPort  Fov;                        ///< The field of view.\n\tovrRecti    DistortedViewport;          ///< Distortion viewport.\n    ovrVector2f PixelsPerTanAngleAtCenter;  ///< How many display pixels will fit in tan(angle) = 1.\n    ovrVector3f HmdToEyeViewOffset;         ///< Translation to be applied to view matrix for each eye offset.\n} ovrEyeRenderDesc;\n\n//-----------------------------------------------------------------------------------\n// ***** Platform-independent Rendering Configuration\n\n/// These types are used to hide platform-specific details when passing\n/// render device, OS, and texture data to the API.\n///\n/// The benefit of having these wrappers versus platform-specific API functions is\n/// that they allow game glue code to be portable. A typical example is an\n/// engine that has multiple back ends, say GL and D3D. Portable code that calls\n/// these back ends may also use LibOVR. To do this, back ends can be modified\n/// to return portable types such as ovrTexture and ovrRenderAPIConfig.\ntypedef enum\n{\n    ovrRenderAPI_None,\n    ovrRenderAPI_OpenGL,\n    ovrRenderAPI_Android_GLES,  // May include extra native window pointers, etc.\n    ovrRenderAPI_D3D9,\n    ovrRenderAPI_D3D10,\n    ovrRenderAPI_D3D11,\n    ovrRenderAPI_Count\n} ovrRenderAPIType;\n\n/// Platform-independent part of rendering API-configuration data.\n/// It is a part of ovrRenderAPIConfig, passed to ovrHmd_Configure.\ntypedef struct OVR_ALIGNAS(8) ovrRenderAPIConfigHeader_\n{\n    ovrRenderAPIType API;\n    ovrSizei         BackBufferSize;    // Previously named RTSize.\n    int              Multisample;\n} ovrRenderAPIConfigHeader;\n\n/// Contains platform-specific information for rendering.\ntypedef struct OVR_ALIGNAS(8) ovrRenderAPIConfig_\n{\n    ovrRenderAPIConfigHeader Header;\n    uintptr_t                PlatformData[8];\n} ovrRenderAPIConfig;\n\n/// Platform-independent part of the eye texture descriptor.\n/// It is a part of ovrTexture, passed to ovrHmd_EndFrame.\n/// If RenderViewport is all zeros then the full texture will be used.\ntypedef struct OVR_ALIGNAS(8) ovrTextureHeader_\n{\n    ovrRenderAPIType API;\n    ovrSizei         TextureSize;\n    ovrRecti         RenderViewport;  // Pixel viewport in texture that holds eye image.\n    uint32_t         _PAD0_;\n} ovrTextureHeader;\n\n/// Contains platform-specific information about a texture.\ntypedef struct OVR_ALIGNAS(8) ovrTexture_\n{\n    ovrTextureHeader Header;\n    uintptr_t        PlatformData[8];\n} ovrTexture;\n\n\n// -----------------------------------------------------------------------------------\n// ***** API Interfaces\n\n// Basic steps to use the API:\n//\n// Setup:\n//  * ovrInitialize()\n//  * ovrHMD hmd = ovrHmd_Create(0)\n//  * Use hmd members and ovrHmd_GetFovTextureSize() to determine graphics configuration.\n//  * Call ovrHmd_ConfigureTracking() to configure and initialize tracking.\n//  * Call ovrHmd_ConfigureRendering() to setup graphics for SDK rendering,\n//    which is the preferred approach.\n//    Please refer to \"Client Distorton Rendering\" below if you prefer to do that instead.\n//  * If the ovrHmdCap_ExtendDesktop flag is not set, then use ovrHmd_AttachToWindow to\n//    associate the relevant application window with the hmd.\n//  * Allocate render target textures as needed.\n//\n// Game Loop:\n//  * Call ovrHmd_BeginFrame() to get the current frame timing information.\n//  * Render each eye using ovrHmd_GetEyePoses or ovrHmd_GetHmdPosePerEye to get\n//    the predicted hmd pose and each eye pose.\n//  * Call ovrHmd_EndFrame() to render the distorted textures to the back buffer\n//    and present them on the hmd.\n//\n// Shutdown:\n//  * ovrHmd_Destroy(hmd)\n//  * ovr_Shutdown()\n//\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// ovr_InitializeRenderingShim initializes the rendering shim appart from everything\n// else in LibOVR. This may be helpful if the application prefers to avoid\n// creating any OVR resources (allocations, service connections, etc) at this point.\n// ovr_InitializeRenderingShim does not bring up anything within LibOVR except the\n// necessary hooks to enable the Direct-to-Rift functionality.\n//\n// Either ovr_InitializeRenderingShim() or ovr_Initialize() must be called before any\n// Direct3D or OpenGL initilization is done by applictaion (creation of devices, etc).\n// ovr_Initialize() must still be called after to use the rest of LibOVR APIs.\nOVR_EXPORT ovrBool  ovr_InitializeRenderingShim();\n\n// Library init/shutdown, must be called around all other OVR code.\n// No other functions calls besides ovr_InitializeRenderingShim are allowed\n// before ovr_Initialize succeeds or after ovr_Shutdown.\n/// Initializes all Oculus functionality.\nOVR_EXPORT ovrBool  ovr_Initialize();\n/// Shuts down all Oculus functionality.\nOVR_EXPORT void     ovr_Shutdown();\n\n/// Returns version string representing libOVR version. Static, so\n/// string remains valid for app lifespan\nOVR_EXPORT const char* ovr_GetVersionString();\n\n/// Detects or re-detects HMDs and reports the total number detected.\n/// Users can get information about each HMD by calling ovrHmd_Create with an index.\nOVR_EXPORT int      ovrHmd_Detect();\n\n/// Creates a handle to an HMD which doubles as a description structure.\n/// Index can [0 .. ovrHmd_Detect()-1]. Index mappings can cange after each ovrHmd_Detect call.\n/// If not null, then the returned handle must be freed with ovrHmd_Destroy.\nOVR_EXPORT ovrHmd   ovrHmd_Create(int index);\nOVR_EXPORT void     ovrHmd_Destroy(ovrHmd hmd);\n\n/// Creates a 'fake' HMD used for debugging only. This is not tied to specific hardware,\n/// but may be used to debug some of the related rendering.\nOVR_EXPORT ovrHmd   ovrHmd_CreateDebug(ovrHmdType type);\n\n/// Returns last error for HMD state. Returns null for no error.\n/// String is valid until next call or GetLastError or HMD is destroyed.\n/// Pass null hmd to get global errors (during create etc).\nOVR_EXPORT const char* ovrHmd_GetLastError(ovrHmd hmd);\n\n/// Platform specific function to specify the application window whose output will be \n/// displayed on the HMD. Only used if the ovrHmdCap_ExtendDesktop flag is false.\n///   Windows: SwapChain associated with this window will be displayed on the HMD.\n///            Specify 'destMirrorRect' in window coordinates to indicate an area\n///            of the render target output that will be mirrored from 'sourceRenderTargetRect'.\n///            Null pointers mean \"full size\".\n/// @note Source and dest mirror rects are not yet implemented.\nOVR_EXPORT ovrBool ovrHmd_AttachToWindow(ovrHmd hmd, void* window,\n\t\t\t\t\t\t\t\t\t\t const ovrRecti* destMirrorRect,\n\t\t\t\t\t\t\t\t\t\t const ovrRecti* sourceRenderTargetRect);\n\n/// Returns capability bits that are enabled at this time as described by ovrHmdCaps.\n/// Note that this value is different font ovrHmdDesc::HmdCaps, which describes what\n/// capabilities are available for that HMD.\nOVR_EXPORT unsigned int ovrHmd_GetEnabledCaps(ovrHmd hmd);\n\n/// Modifies capability bits described by ovrHmdCaps that can be modified,\n/// such as ovrHmdCap_LowPersistance.\nOVR_EXPORT void         ovrHmd_SetEnabledCaps(ovrHmd hmd, unsigned int hmdCaps);\n\n//-------------------------------------------------------------------------------------\n// ***** Tracking Interface\n\n/// All tracking interface functions are thread-safe, allowing tracking state to be sampled\n/// from different threads.\n/// ConfigureTracking starts sensor sampling, enabling specified capabilities,\n///    described by ovrTrackingCaps.\n///  - supportedTrackingCaps specifies support that is requested. The function will succeed\n///   even if these caps are not available (i.e. sensor or camera is unplugged). Support\n///    will automatically be enabled if such device is plugged in later. Software should\n///    check ovrTrackingState.StatusFlags for real-time status.\n///  - requiredTrackingCaps specify sensor capabilities required at the time of the call.\n///    If they are not available, the function will fail. Pass 0 if only specifying\n///    supportedTrackingCaps.\n///  - Pass 0 for both supportedTrackingCaps and requiredTrackingCaps to disable tracking.\nOVR_EXPORT ovrBool  ovrHmd_ConfigureTracking(ovrHmd hmd, unsigned int supportedTrackingCaps,\n\t\t\t\t\t\t\t\t\t\t\t\t\t     unsigned int requiredTrackingCaps);\n\n/// Re-centers the sensor orientation.\n/// Normally this will recenter the (x,y,z) translational components and the yaw\n/// component of orientation.\nOVR_EXPORT void     ovrHmd_RecenterPose(ovrHmd hmd);\n\n/// Returns tracking state reading based on the specified absolute system time.\n/// Pass an absTime value of 0.0 to request the most recent sensor reading. In this case\n/// both PredictedPose and SamplePose will have the same value.\n/// ovrHmd_GetEyePoses relies on this function internally.\n/// This may also be used for more refined timing of FrontBuffer rendering logic, etc.\nOVR_EXPORT ovrTrackingState ovrHmd_GetTrackingState(ovrHmd hmd, double absTime);\n\n//-------------------------------------------------------------------------------------\n// ***** Graphics Setup\n\n/// Calculates the recommended texture size for rendering a given eye within the HMD\n/// with a given FOV cone. Higher FOV will generally require larger textures to\n/// maintain quality.\n///  - pixelsPerDisplayPixel specifies the ratio of the number of render target pixels\n///    to display pixels at the center of distortion. 1.0 is the default value. Lower\n///    values can improve performance.\nOVR_EXPORT ovrSizei ovrHmd_GetFovTextureSize(ovrHmd hmd, ovrEyeType eye, ovrFovPort fov,\n                                             float pixelsPerDisplayPixel);\n\n//-------------------------------------------------------------------------------------\n// *****  Rendering API Thread Safety\n\n//  All of rendering functions including the configure and frame functions\n// are *NOT thread safe*. It is ok to use ConfigureRendering on one thread and handle\n//  frames on another thread, but explicit synchronization must be done since\n//  functions that depend on configured state are not reentrant.\n//\n//  As an extra requirement, any of the following calls must be done on\n//  the render thread, which is the same thread that calls ovrHmd_BeginFrame\n//  or ovrHmd_BeginFrameTiming.\n//    - ovrHmd_EndFrame\n//    - ovrHmd_GetEyeTimewarpMatrices\n\n//-------------------------------------------------------------------------------------\n// *****  SDK Distortion Rendering Functions\n\n// These functions support rendering of distortion by the SDK through direct\n// access to the underlying rendering API, such as D3D or GL.\n// This is the recommended approach since it allows better support for future\n// Oculus hardware, and enables a range of low-level optimizations.\n\n/// Configures rendering and fills in computed render parameters.\n/// This function can be called multiple times to change rendering settings.\n/// eyeRenderDescOut is a pointer to an array of two ovrEyeRenderDesc structs\n/// that are used to return complete rendering information for each eye.\n///  - apiConfig provides D3D/OpenGL specific parameters. Pass null\n///    to shutdown rendering and release all resources.\n///  - distortionCaps describe desired distortion settings.\nOVR_EXPORT ovrBool ovrHmd_ConfigureRendering( ovrHmd hmd,\n                                              const ovrRenderAPIConfig* apiConfig,\n                                              unsigned int distortionCaps,\n                                              const ovrFovPort eyeFovIn[2],\n                                              ovrEyeRenderDesc eyeRenderDescOut[2] );\n\n\n/// Begins a frame, returning timing information.\n/// This should be called at the beginning of the game rendering loop (on the render thread).\n/// Pass 0 for the frame index if not using ovrHmd_GetFrameTiming.\nOVR_EXPORT ovrFrameTiming ovrHmd_BeginFrame(ovrHmd hmd, unsigned int frameIndex);\n\n/// Ends a frame, submitting the rendered textures to the frame buffer.\n/// - RenderViewport within each eyeTexture can change per frame if necessary.\n/// - 'renderPose' will typically be the value returned from ovrHmd_GetEyePoses,\n///   ovrHmd_GetHmdPosePerEye but can be different if a different head pose was\n///   used for rendering.\n/// - This may perform distortion and scaling internally, assuming is it not\n///   delegated to another thread.\n/// - Must be called on the same thread as BeginFrame.\n/// - *** This Function will call Present/SwapBuffers and potentially wait for GPU Sync ***.\nOVR_EXPORT void     ovrHmd_EndFrame(ovrHmd hmd,\n                                    const ovrPosef renderPose[2],\n                                    const ovrTexture eyeTexture[2]);\n\n/// Returns predicted head pose in outHmdTrackingState and offset eye poses in outEyePoses\n/// as an atomic operation. Caller need not worry about applying HmdToEyeViewOffset to the\n/// returned outEyePoses variables.\n/// - Thread-safe function where caller should increment frameIndex with every frame\n///   and pass the index where applicable to functions called on the  rendering thread.\n/// - hmdToEyeViewOffset[2] can be ovrEyeRenderDesc.HmdToEyeViewOffset returned from \n///   ovrHmd_ConfigureRendering or ovrHmd_GetRenderDesc. For monoscopic rendering,\n///   use a vector that is the average of the two vectors for both eyes.\n/// - If frameIndex is not being used, pass in 0.\n/// - Assuming outEyePoses are used for rendering, it should be passed into ovrHmd_EndFrame.\n/// - If called doesn't need outHmdTrackingState, it can be NULL\nOVR_EXPORT void ovrHmd_GetEyePoses(ovrHmd hmd, unsigned int frameIndex, ovrVector3f hmdToEyeViewOffset[2],\n                                   ovrPosef outEyePoses[2], ovrTrackingState* outHmdTrackingState);\n\n/// Function was previously called ovrHmd_GetEyePose\n/// Returns the predicted head pose to use when rendering the specified eye.\n/// - Important: Caller must apply HmdToEyeViewOffset before using ovrPosef for rendering\n/// - Must be called between ovrHmd_BeginFrameTiming and ovrHmd_EndFrameTiming.\n/// - If the pose is used for rendering the eye, it should be passed to ovrHmd_EndFrame.\n/// - Parameter 'eye' is used for prediction timing only\nOVR_EXPORT ovrPosef ovrHmd_GetHmdPosePerEye(ovrHmd hmd, ovrEyeType eye);\n\n\n//-------------------------------------------------------------------------------------\n// *****  Client Distortion Rendering Functions\n\n// These functions provide the distortion data and render timing support necessary to allow\n// client rendering of distortion. Client-side rendering involves the following steps:\n//\n//  1. Setup ovrEyeDesc based on the desired texture size and FOV.\n//     Call ovrHmd_GetRenderDesc to get the necessary rendering parameters for each eye.\n//\n//  2. Use ovrHmd_CreateDistortionMesh to generate the distortion mesh.\n//\n//  3. Use ovrHmd_BeginFrameTiming, ovrHmd_GetEyePoses, and ovrHmd_BeginFrameTiming in\n//     the rendering loop to obtain timing and predicted head orientation when rendering each eye.\n//      - When using timewarp, use ovr_WaitTillTime after the rendering and gpu flush, followed\n//        by ovrHmd_GetEyeTimewarpMatrices to obtain the timewarp matrices used\n//        by the distortion pixel shader. This will minimize latency.\n//\n\n/// Computes the distortion viewport, view adjust, and other rendering parameters for\n/// the specified eye. This can be used instead of ovrHmd_ConfigureRendering to do\n/// setup for client rendered distortion.\nOVR_EXPORT ovrEyeRenderDesc ovrHmd_GetRenderDesc(ovrHmd hmd,\n                                                 ovrEyeType eyeType, ovrFovPort fov);\n\n\n/// Describes a vertex used by the distortion mesh. This is intended to be converted into\n/// the engine-specific format. Some fields may be unused based on the ovrDistortionCaps\n/// flags selected. TexG and TexB, for example, are not used if chromatic correction is\n/// not requested.\ntypedef struct ovrDistortionVertex_\n{\n    ovrVector2f ScreenPosNDC;    ///< [-1,+1],[-1,+1] over the entire framebuffer.\n    float       TimeWarpFactor;  ///< Lerp factor between time-warp matrices. Can be encoded in Pos.z.\n    float       VignetteFactor;  ///< Vignette fade factor. Can be encoded in Pos.w.\n    ovrVector2f TanEyeAnglesR;   ///< The tangents of the horizontal and vertical eye angles for the red channel.\n\tovrVector2f TanEyeAnglesG;   ///< The tangents of the horizontal and vertical eye angles for the green channel.\n\tovrVector2f TanEyeAnglesB;   ///< The tangents of the horizontal and vertical eye angles for the blue channel.\n} ovrDistortionVertex;\n\n/// Describes a full set of distortion mesh data, filled in by ovrHmd_CreateDistortionMesh.\n/// Contents of this data structure, if not null, should be freed by ovrHmd_DestroyDistortionMesh.\ntypedef struct ovrDistortionMesh_\n{\n    ovrDistortionVertex* pVertexData; ///< The distortion vertices representing each point in the mesh.\n    unsigned short*      pIndexData;  ///< Indices for connecting the mesh vertices into polygons.\n    unsigned int         VertexCount; ///< The number of vertices in the mesh.\n    unsigned int         IndexCount;  ///< The number of indices in the mesh.\n} ovrDistortionMesh;\n\n/// Generate distortion mesh per eye.\n/// Distortion capabilities will depend on 'distortionCaps' flags. Users should \n/// render using the appropriate shaders based on their settings.\n/// Distortion mesh data will be allocated and written into the ovrDistortionMesh data structure,\n/// which should be explicitly freed with ovrHmd_DestroyDistortionMesh.\n/// Users should call ovrHmd_GetRenderScaleAndOffset to get uvScale and Offset values for rendering.\n/// The function shouldn't fail unless theres is a configuration or memory error, in which case\n/// ovrDistortionMesh values will be set to null.\n/// This is the only function in the SDK reliant on eye relief, currently imported from profiles,\n/// or overridden here.\nOVR_EXPORT ovrBool  ovrHmd_CreateDistortionMesh( ovrHmd hmd,\n                                                 ovrEyeType eyeType, ovrFovPort fov,\n                                                 unsigned int distortionCaps,\n                                                 ovrDistortionMesh *meshData);\nOVR_EXPORT ovrBool ovrHmd_CreateDistortionMeshDebug( ovrHmd hmddesc,\n                                                     ovrEyeType eyeType, ovrFovPort fov,\n                                                     unsigned int distortionCaps,\n                                                     ovrDistortionMesh *meshData,\n\t\t\t\t\t\t\t\t\t\t\t\t     float debugEyeReliefOverrideInMetres);\n\n\n/// Used to free the distortion mesh allocated by ovrHmd_GenerateDistortionMesh. meshData elements\n/// are set to null and zeroes after the call.\nOVR_EXPORT void     ovrHmd_DestroyDistortionMesh( ovrDistortionMesh* meshData );\n\n/// Computes updated 'uvScaleOffsetOut' to be used with a distortion if render target size or\n/// viewport changes after the fact. This can be used to adjust render size every frame if desired.\nOVR_EXPORT void     ovrHmd_GetRenderScaleAndOffset( ovrFovPort fov,\n                                                    ovrSizei textureSize, ovrRecti renderViewport,\n                                                    ovrVector2f uvScaleOffsetOut[2] );\n\n/// Thread-safe timing function for the main thread. Caller should increment frameIndex\n/// with every frame and pass the index where applicable to functions called on the\n/// rendering thread.\nOVR_EXPORT ovrFrameTiming ovrHmd_GetFrameTiming(ovrHmd hmd, unsigned int frameIndex);\n\n/// Called at the beginning of the frame on the rendering thread.\n/// Pass frameIndex == 0 if ovrHmd_GetFrameTiming isn't being used. Otherwise,\n/// pass the same frame index as was used for GetFrameTiming on the main thread.\nOVR_EXPORT ovrFrameTiming ovrHmd_BeginFrameTiming(ovrHmd hmd, unsigned int frameIndex);\n\n/// Marks the end of client distortion rendered frame, tracking the necessary timing information.\n/// This function must be called immediately after Present/SwapBuffers + GPU sync. GPU sync is\n/// important before this call to reduce latency and ensure proper timing.\nOVR_EXPORT void     ovrHmd_EndFrameTiming(ovrHmd hmd);\n\n/// Initializes and resets frame time tracking. This is typically not necessary, but\n/// is helpful if game changes vsync state or video mode. vsync is assumed to be on if this\n/// isn't called. Resets internal frame index to the specified number.\nOVR_EXPORT void     ovrHmd_ResetFrameTiming(ovrHmd hmd, unsigned int frameIndex);\n\n/// Computes timewarp matrices used by distortion mesh shader, these are used to adjust\n/// for head orientation change since the last call to ovrHmd_GetEyePoses\n/// when rendering this eye. The ovrDistortionVertex::TimeWarpFactor is used to blend between the\n/// matrices, usually representing two different sides of the screen.\n/// Must be called on the same thread as ovrHmd_BeginFrameTiming.\nOVR_EXPORT void     ovrHmd_GetEyeTimewarpMatrices     (ovrHmd hmd, ovrEyeType eye,\n                                                       ovrPosef renderPose, ovrMatrix4f twmOut[2]);\nOVR_EXPORT void     ovrHmd_GetEyeTimewarpMatricesDebug(ovrHmd hmd, ovrEyeType eye,\n                                                       ovrPosef renderPose, ovrMatrix4f twmOut[2],\n\t\t\t\t\t\t\t\t\t\t\t\t\t   double debugTimingOffsetInSeconds);\n\n\n\n\n//-------------------------------------------------------------------------------------\n// ***** Stateless math setup functions\n\n/// Used to generate projection from ovrEyeDesc::Fov.\nOVR_EXPORT ovrMatrix4f ovrMatrix4f_Projection( ovrFovPort fov,\n                                               float znear, float zfar, ovrBool rightHanded );\n\n/// Used for 2D rendering, Y is down\n/// orthoScale = 1.0f / pixelsPerTanAngleAtCenter\n/// orthoDistance = distance from camera, such as 0.8m\nOVR_EXPORT ovrMatrix4f ovrMatrix4f_OrthoSubProjection(ovrMatrix4f projection, ovrVector2f orthoScale,\n                                                      float orthoDistance, float hmdToEyeViewOffsetX);\n\n/// Returns global, absolute high-resolution time in seconds. This is the same\n/// value as used in sensor messages.\nOVR_EXPORT double   ovr_GetTimeInSeconds();\n\n/// Waits until the specified absolute time.\nOVR_EXPORT double   ovr_WaitTillTime(double absTime);\n\n// -----------------------------------------------------------------------------------\n// ***** Latency Test interface\n\n/// Does latency test processing and returns 'TRUE' if specified rgb color should\n/// be used to clear the screen.\nOVR_EXPORT ovrBool      ovrHmd_ProcessLatencyTest(ovrHmd hmd, unsigned char rgbColorOut[3]);\n\n/// Returns non-null string once with latency test result, when it is available.\n/// Buffer is valid until next call.\nOVR_EXPORT const char*  ovrHmd_GetLatencyTestResult(ovrHmd hmd);\n\n/// Returns the latency testing color in rgbColorOut to render when using a DK2\n/// Returns false if this feature is disabled or not-applicable (e.g. using a DK1)\nOVR_EXPORT ovrBool      ovrHmd_GetLatencyTest2DrawColor(ovrHmd hmddesc, unsigned char rgbColorOut[3]);\n\n//-------------------------------------------------------------------------------------\n// ***** Health and Safety Warning Display interface\n//\n\n/// Used by ovrhmd_GetHSWDisplayState to report the current display state.\ntypedef struct ovrHSWDisplayState_\n{\n    /// If true then the warning should be currently visible\n    /// and the following variables have meaning. Else there is no\n    /// warning being displayed for this application on the given HMD.\n    ovrBool Displayed;       ///< True if the Health&Safety Warning is currently displayed.\n    double  StartTime;       ///< Absolute time when the warning was first displayed. See ovr_GetTimeInSeconds().\n    double  DismissibleTime; ///< Earliest absolute time when the warning can be dismissed. May be a time in the past.\n} ovrHSWDisplayState;\n\n/// Returns the current state of the HSW display. If the application is doing the rendering of\n/// the HSW display then this function serves to indicate that the warning should be\n/// currently displayed. If the application is using SDK-based eye rendering then the SDK by\n/// default automatically handles the drawing of the HSW display. An application that uses\n/// application-based eye rendering should use this function to know when to start drawing the\n/// HSW display itself and can optionally use it in conjunction with ovrhmd_DismissHSWDisplay\n/// as described below.\n///\n/// Example usage for application-based rendering:\n///    bool HSWDisplayCurrentlyDisplayed = false; // global or class member variable\n///    ovrHSWDisplayState hswDisplayState;\n///    ovrhmd_GetHSWDisplayState(Hmd, &hswDisplayState);\n///\n///    if (hswDisplayState.Displayed && !HSWDisplayCurrentlyDisplayed) {\n///        <insert model into the scene that stays in front of the user>\n///        HSWDisplayCurrentlyDisplayed = true;\n///    }\nOVR_EXPORT void ovrHmd_GetHSWDisplayState(ovrHmd hmd, ovrHSWDisplayState *hasWarningState);\n\n/// Dismisses the HSW display if the warning is dismissible and the earliest dismissal time\n/// has occurred. Returns true if the display is valid and could be dismissed. The application\n/// should recognize that the HSW display is being displayed (via ovrhmd_GetHSWDisplayState)\n/// and if so then call this function when the appropriate user input to dismiss the warning\n/// occurs.\n///\n/// Example usage :\n///    void ProcessEvent(int key) {\n///        if (key == escape) {\n///            ovrHSWDisplayState hswDisplayState;\n///            ovrhmd_GetHSWDisplayState(hmd, &hswDisplayState);\n///\n///            if (hswDisplayState.Displayed && ovrhmd_DismissHSWDisplay(hmd)) {\n///                <remove model from the scene>\n///                HSWDisplayCurrentlyDisplayed = false;\n///            }\n///        }\n///    }\nOVR_EXPORT ovrBool ovrHmd_DismissHSWDisplay(ovrHmd hmd);\n\n/// Get boolean property. Returns first element if property is a boolean array.\n/// Returns defaultValue if property doesn't exist.\nOVR_EXPORT ovrBool      ovrHmd_GetBool(ovrHmd hmd, const char* propertyName, ovrBool defaultVal);\n\n/// Modify bool property; false if property doesn't exist or is readonly.\nOVR_EXPORT ovrBool      ovrHmd_SetBool(ovrHmd hmd, const char* propertyName, ovrBool value);\n\n/// Get integer property. Returns first element if property is an integer array.\n/// Returns defaultValue if property doesn't exist.\nOVR_EXPORT int          ovrHmd_GetInt(ovrHmd hmd, const char* propertyName, int defaultVal);\n\n/// Modify integer property; false if property doesn't exist or is readonly.\nOVR_EXPORT ovrBool      ovrHmd_SetInt(ovrHmd hmd, const char* propertyName, int value);\n\n/// Get float property. Returns first element if property is a float array.\n/// Returns defaultValue if property doesn't exist.\nOVR_EXPORT float        ovrHmd_GetFloat(ovrHmd hmd, const char* propertyName, float defaultVal);\n\n/// Modify float property; false if property doesn't exist or is readonly.\nOVR_EXPORT ovrBool      ovrHmd_SetFloat(ovrHmd hmd, const char* propertyName, float value);\n\n/// Get float[] property. Returns the number of elements filled in, 0 if property doesn't exist.\n/// Maximum of arraySize elements will be written.\nOVR_EXPORT unsigned int ovrHmd_GetFloatArray(ovrHmd hmd, const char* propertyName,\n                                            float values[], unsigned int arraySize);\n\n/// Modify float[] property; false if property doesn't exist or is readonly.\nOVR_EXPORT ovrBool      ovrHmd_SetFloatArray(ovrHmd hmd, const char* propertyName,\n                                             float values[], unsigned int arraySize);\n\n/// Get string property. Returns first element if property is a string array.\n/// Returns defaultValue if property doesn't exist.\n/// String memory is guaranteed to exist until next call to GetString or GetStringArray, or HMD is destroyed.\nOVR_EXPORT const char*  ovrHmd_GetString(ovrHmd hmd, const char* propertyName,\n                                        const char* defaultVal);\n\n/// Set string property\nOVR_EXPORT ovrBool ovrHmd_SetString(ovrHmd hmddesc, const char* propertyName,\n                                    const char* value);\n\n// -----------------------------------------------------------------------------------\n// ***** Logging\n\n/// Start performance logging. guid is optional and if included is written with each file entry.\n/// If called while logging is already active with the same filename, only the guid will be updated\n/// If called while logging is already active with a different filename, ovrHmd_StopPerfLog() will be called, followed by ovrHmd_StartPerfLog()\nOVR_EXPORT ovrBool ovrHmd_StartPerfLog(ovrHmd hmd, const char* fileName, const char* userData1);\n/// Stop performance logging.\nOVR_EXPORT ovrBool ovrHmd_StopPerfLog(ovrHmd hmd);\n\n\n#ifdef __cplusplus\n} // extern \"C\"\n#endif\n\n\n#if defined(_MSC_VER)\n    #pragma warning(pop)\n#endif\n\n\n#endif // OVR_CAPI_h\n"
  },
  {
    "path": "externals/ovr/Src/OVR_CAPI_GL.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_CAPI_GL.h\nContent     :   GL specific structures used by the CAPI interface.\nCreated     :   November 7, 2013\nAuthors     :   Lee Cooper\n\nCopyright   :   Copyright 2013 Oculus VR, LLC. All Rights reserved.\n\nUse of this software is subject to the terms of the Oculus Inc license\nagreement provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\n************************************************************************************/\n#ifndef OVR_CAPI_GL_h\n#define OVR_CAPI_GL_h\n\n/// @file OVR_CAPI_GL.h\n/// OpenGL rendering support.\n\n#include \"OVR_CAPI.h\"\n#if defined(__APPLE__)\n    #include <OpenGL/gl.h>\n#else\n    #include <GL/gl.h>\n#endif\n\n\n/// Used to configure slave GL rendering (i.e. for devices created externally).\ntypedef struct OVR_ALIGNAS(8) ovrGLConfigData_s\n{\n    /// General device settings.\n    ovrRenderAPIConfigHeader Header;\n\n#if defined(OVR_OS_WIN32)\n    /// The optional window handle. If unset, rendering will use the current window.\n    HWND Window;\n    /// The optional device context. If unset, rendering will use a new context.\n    HDC  DC;\n#elif defined (OVR_OS_LINUX)\n    /// Optional display. If unset, will issue glXGetCurrentDisplay when context\n    /// is current.\n    struct _XDisplay* Disp;\n#endif\n} ovrGLConfigData;\n\n/// Contains OpenGL-specific rendering information.\nunion ovrGLConfig\n{\n    /// General device settings.\n    ovrRenderAPIConfig Config;\n    /// OpenGL-specific settings.\n    ovrGLConfigData    OGL;\n};\n\n/// Used to pass GL eye texture data to ovrHmd_EndFrame.\ntypedef struct OVR_ALIGNAS(8) ovrGLTextureData_s\n{\n    /// General device settings.\n    ovrTextureHeader Header;\n    /// The OpenGL name for this texture.\n    GLuint           TexId;       \n} ovrGLTextureData;\n\nstatic_assert(offsetof(ovrGLTextureData, TexId) == offsetof(ovrTexture, PlatformData), \"Mismatch of structs that are presumed binary equivalents.\");\n\n/// Contains OpenGL-specific texture information.\ntypedef union ovrGLTexture_s\n{\n    /// General device settings.\n    ovrTexture       Texture;\n    /// OpenGL-specific settings.\n    ovrGLTextureData OGL;\n} ovrGLTexture;\n\n#endif\t// OVR_CAPI_GL_h\n"
  },
  {
    "path": "externals/ovr/Src/OVR_CAPI_Keys.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_CAPI.h\nContent     :   Keys for CAPI calls\nCreated     :   September 25, 2014\nAuthors     :   \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n\n\n#define OVR_KEY_USER                        \"User\"              // string\n#define OVR_KEY_NAME                        \"Name\"              // string\n#define OVR_KEY_GENDER                      \"Gender\"            // string\n#define OVR_KEY_PLAYER_HEIGHT               \"PlayerHeight\"      // float\n#define OVR_KEY_EYE_HEIGHT                  \"EyeHeight\"         // float\n#define OVR_KEY_IPD                         \"IPD\"               // float\n#define OVR_KEY_NECK_TO_EYE_DISTANCE        \"NeckEyeDistance\"   // float[2]\n#define OVR_KEY_EYE_RELIEF_DIAL             \"EyeReliefDial\"     // int\n#define OVR_KEY_EYE_TO_NOSE_DISTANCE        \"EyeToNoseDist\"     // float[2]\n#define OVR_KEY_MAX_EYE_TO_PLATE_DISTANCE   \"MaxEyeToPlateDist\" // float[2]\n#define OVR_KEY_EYE_CUP                     \"EyeCup\"            // char[16]\n#define OVR_KEY_CUSTOM_EYE_RENDER           \"CustomEyeRender\"   // bool\n#define OVR_KEY_CAMERA_POSITION\t\t\t\t\"CenteredFromWorld\" // double[7]\n\n// Default measurements empirically determined at Oculus to make us happy\n// The neck model numbers were derived as an average of the male and female averages from ANSUR-88\n// NECK_TO_EYE_HORIZONTAL = H22 - H43 = INFRAORBITALE_BACK_OF_HEAD - TRAGION_BACK_OF_HEAD\n// NECK_TO_EYE_VERTICAL = H21 - H15 = GONION_TOP_OF_HEAD - ECTOORBITALE_TOP_OF_HEAD\n// These were determined to be the best in a small user study, clearly beating out the previous default values\n#define OVR_DEFAULT_GENDER                  \"Unknown\"\n#define OVR_DEFAULT_PLAYER_HEIGHT           1.778f\n#define OVR_DEFAULT_EYE_HEIGHT              1.675f\n#define OVR_DEFAULT_IPD                     0.064f\n#define OVR_DEFAULT_NECK_TO_EYE_HORIZONTAL  0.0805f\n#define OVR_DEFAULT_NECK_TO_EYE_VERTICAL    0.075f\n#define OVR_DEFAULT_EYE_RELIEF_DIAL         3\n#define OVR_DEFAULT_CAMERA_POSITION\t\t\t{0,0,0,1,0,0,0}\n\n"
  },
  {
    "path": "externals/ovr/Src/OVR_JSON.cpp",
    "content": "/************************************************************************************\n\nPublicHeader:   None\nFilename    :   OVR_JSON.h\nContent     :   JSON format reader and writer\nCreated     :   April 9, 2013\nAuthor      :   Brant Lewis\nNotes       :\n  The code is a derivative of the cJSON library written by Dave Gamble and subject \n  to the following permissive copyright.\n\n  Copyright (c) 2009 Dave Gamble\n \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n \n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include <string.h>\n#include <stdio.h>\n#include <math.h>\n#include <stdlib.h>\n#include <float.h>\n#include <limits.h>\n#include <ctype.h>\n#include \"OVR_JSON.h\"\n#include \"Kernel/OVR_SysFile.h\"\n#include \"Kernel/OVR_Log.h\"\n\n#ifdef OVR_OS_LINUX\n#include <locale.h>\n#endif\n\nnamespace OVR {\n\n\n//-----------------------------------------------------------------------------\n// Create a new copy of a string\nstatic char* JSON_strdup(const char* str)\n{\n    size_t len  = OVR_strlen(str) + 1;\n    char* copy = (char*)OVR_ALLOC(len);\n    if (!copy)\n        return 0;\n    memcpy(copy, str, len);\n    return copy;\n}\n\n\n//-----------------------------------------------------------------------------\n// Render the number from the given item into a string.\nstatic char* PrintInt(int valueint)\n{\n    char *str;\n    str = (char*)OVR_ALLOC(21);\t// 2^64+1 can be represented in 21 chars.\n    if (str)\n    {\n        OVR_sprintf(str, 21, \"%d\", valueint);\n    }\n    return str;\n}\n\n\n//-----------------------------------------------------------------------------\n// Render the number from the given item into a string.\nstatic char* PrintNumber(double d)\n{\n    char *str;\n    int valueint = (int)d;\n\tif (fabs(((double)valueint)-d)<=DBL_EPSILON && d<=INT_MAX && d>=INT_MIN)\n\t{\n        return PrintInt(valueint);\n\t}\n\telse\n\t{\n\t\tstr=(char*)OVR_ALLOC(64);\t// This is a nice tradeoff.\n\t\tif (str)\n\t\t{\n\t\t\tif (fabs(floor(d)-d)<=DBL_EPSILON && fabs(d)<1.0e60)\n                OVR_sprintf(str, 64, \"%.0f\", d);\n\t\t\telse if (fabs(d)<1.0e-6 || fabs(d)>1.0e9)\n                OVR_sprintf(str, 64, \"%e\", d);\n\t\t\telse\n                OVR_sprintf(str, 64, \"%f\", d);\n\t\t}\n\t}\n\treturn str;\n}\n\n\n// Parse the input text into an un-escaped cstring, and populate item.\nstatic const unsigned char firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };\n\n// Helper to assign error sting and return 0.\nconst char* AssignError(const char** perror, const char *errorMessage)\n{\n    if (perror)\n        *perror = errorMessage;\n    return 0;\n}\n\n//-----------------------------------------------------------------------------\n// ***** JSON Node class\n\nJSON::JSON(JSONItemType itemType) :\n    Type(itemType), dValue(0.)\n{\n}\n\nJSON::~JSON()\n{\n    JSON* child = Children.GetFirst();\n    while (!Children.IsNull(child))\n    {\n        child->RemoveNode();\n        child->Release();\n        child = Children.GetFirst();\n    }\n}\n\n//-----------------------------------------------------------------------------\n// Parse the input text to generate a number, and populate the result into item\n// Returns the text position after the parsed number\nconst char* JSON::parseNumber(const char *num)\n{\n    const char* num_start = num;\n    double      n=0, scale=0;\n    int         subscale     = 0,\n                signsubscale = 1;\n    bool positiveSign = true;\n    char localeSeparator = '.';\n\n#ifdef OVR_OS_LINUX\n    // We should switch to a locale aware parsing function, such as atof. We\n    // will probably want to go farther and enforce the 'C' locale on all JSON\n    // output/input.\n    struct lconv* localeConv = localeconv();\n    localeSeparator = localeConv->decimal_point[0];\n#endif\n\n    // Could use sscanf for this?\n    if (*num == '-')\n    {\n        positiveSign = false;\n        num++;\t// Has sign?\n    }\n    if (*num == '0')\n    {\n        num++;\t\t\t// is zero\n    }\n\n    if (*num>='1' && *num<='9')\t\n    {\n        do\n        {\n            n = (n*10.0) + (*num++ - '0');\n        }\n        while (*num>='0' && *num<='9');\t// Number?\n    }\n\n    if ((*num=='.' || *num==localeSeparator) && num[1]>='0' && num[1]<='9')\n    {\n        num++;\n        do\n        {\n            n=(n*10.0)+(*num++ -'0');\n            scale--;\n        }\n        while (*num>='0' && *num<='9');  // Fractional part?\n    }\n\n\tif (*num=='e' || *num=='E')\t\t// Exponent?\n\t{\n        num++;\n        if (*num == '+')\n        {\n            num++;\n        }\n        else if (*num=='-')\n        {\n            signsubscale=-1;\n            num++;\t\t// With sign?\n        }\n\n        while (*num >= '0' && *num <= '9')\n        {\n            subscale = (subscale * 10) + (*num++ - '0');\t// Number?\n        }\n\t}\n\n    // Number = +/- number.fraction * 10^+/- exponent\n    n *= pow(10.0, (scale + subscale*signsubscale));\n\n    if (!positiveSign)\n    {\n        n = -n;\n    }\n\n    // Assign parsed value.\n    Type = JSON_Number;\n    dValue = n;\n    Value.AssignString(num_start, num - num_start);\n\n\treturn num;\n}\n\n// Parses a hex string up to the specified number of digits.\n// Returns the first character after the string.\nconst char* ParseHex(unsigned* val, unsigned digits, const char* str)\n{\n    *val = 0;\n\n    for(unsigned digitCount = 0; digitCount < digits; digitCount++, str++)\n    {\n        unsigned v = *str;\n\n        if ((v >= '0') && (v <= '9'))\n            v -= '0';\n        else if ((v >= 'a') && (v <= 'f'))\n            v = 10 + v - 'a';\n        else if ((v >= 'A') && (v <= 'F'))\n            v = 10 + v - 'A';\n        else\n            break;\n\n        *val = *val * 16 + v;\n    }\n\n    return str;\n}\n\n//-----------------------------------------------------------------------------\n// Parses the input text into a string item and returns the text position after\n// the parsed string\nconst char* JSON::parseString(const char* str, const char** perror)\n{\n\tconst char* ptr = str+1;\n    const char* p;\n    char*       ptr2;\n    char*       out;\n    int         len=0;\n    unsigned    uc, uc2;\n\t\n    if (*str!='\\\"')\n    {\n        return AssignError(perror, \"Syntax Error: Missing quote\");\n    }\n\t\n\twhile (*ptr!='\\\"' && *ptr && ++len)\n    {   \n        if (*ptr++ == '\\\\') ptr++;\t// Skip escaped quotes.\n    }\n\t\n    // This is how long we need for the string, roughly.\n\tout=(char*)OVR_ALLOC(len+1);\n\tif (!out)\n        return 0;\n\t\n\tptr = str+1;\n    ptr2= out;\n\n\twhile (*ptr!='\\\"' && *ptr)\n\t{\n\t\tif (*ptr!='\\\\')\n        {\n            *ptr2++ = *ptr++;\n        }\n\t\telse\n\t\t{\n\t\t\tptr++;\n\t\t\tswitch (*ptr)\n\t\t\t{\n\t\t\t\tcase 'b': *ptr2++ = '\\b';\tbreak;\n\t\t\t\tcase 'f': *ptr2++ = '\\f';\tbreak;\n\t\t\t\tcase 'n': *ptr2++ = '\\n';\tbreak;\n\t\t\t\tcase 'r': *ptr2++ = '\\r';\tbreak;\n\t\t\t\tcase 't': *ptr2++ = '\\t';\tbreak;\n\n                // Transcode utf16 to utf8.\n                case 'u':\n\n                    // Get the unicode char.\n                    p = ParseHex(&uc, 4, ptr + 1);\n                    if (ptr != p)\n                        ptr = p - 1;\n\n\t\t\t\t\tif ((uc>=0xDC00 && uc<=0xDFFF) || uc==0)\n                        break;\t// Check for invalid.\n\n                    // UTF16 surrogate pairs.\n\t\t\t\t\tif (uc>=0xD800 && uc<=0xDBFF)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (ptr[1]!='\\\\' || ptr[2]!='u')\n                            break;\t// Missing second-half of surrogate.\n\n                        p= ParseHex(&uc2, 4, ptr + 3);\n                        if (ptr != p)\n                            ptr = p - 1;\n                        \n\t\t\t\t\t\tif (uc2<0xDC00 || uc2>0xDFFF)\n                            break;\t// Invalid second-half of surrogate.\n\n\t\t\t\t\t\tuc = 0x10000 + (((uc&0x3FF)<<10) | (uc2&0x3FF));\n\t\t\t\t\t}\n\n\t\t\t\t\tlen=4;\n                    \n                    if (uc<0x80)\n                        len=1;\n                    else if (uc<0x800)\n                        len=2;\n                    else if (uc<0x10000)\n                        len=3;\n                    \n                    ptr2+=len;\n\t\t\t\t\t\n\t\t\t\t\tswitch (len)\n                    {\n\t\t\t\t\t\tcase 4: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;\n\t\t\t\t\t\t\t//no break, fall through\n\t\t\t\t\t\tcase 3: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;\n\t\t\t\t\t\t\t//no break\n\t\t\t\t\t\tcase 2: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;\n\t\t\t\t\t\t\t//no break\n\t\t\t\t\t\tcase 1: *--ptr2 = (char)(uc | firstByteMark[len]);\n\t\t\t\t\t\t\t//no break\n\t\t\t\t\t}\n\t\t\t\t\tptr2+=len;\n\t\t\t\t\tbreak;\n\n                default:\n                    *ptr2++ = *ptr;\n                    break;\n\t\t\t}\n\t\t\tptr++;\n\t\t}\n\t}\n\n\t*ptr2 = 0;\n\tif (*ptr=='\\\"')\n        ptr++;\n\t\n    // Make a copy of the string \n    Value=out;\n    OVR_FREE(out);\n\tType=JSON_String;\n\n\treturn ptr;\n}\n\n//-----------------------------------------------------------------------------\n// Render the string provided to an escaped version that can be printed.\nchar* PrintString(const char* str)\n{\n\tconst char *ptr;\n    char *ptr2,*out;\n    int len=0;\n    unsigned char token;\n\t\n\tif (!str)\n        return JSON_strdup(\"\");\n\tptr=str;\n    \n    token=*ptr;\n    while (token && ++len)\\\n    {\n        if (strchr(\"\\\"\\\\\\b\\f\\n\\r\\t\",token))\n            len++;\n        else if (token<32) \n            len+=5;\n        ptr++;\n        token=*ptr;\n    }\n\t\n\tint buff_size = len+3;\n    out=(char*)OVR_ALLOC(buff_size);\n\tif (!out)\n        return 0;\n\n\tptr2 = out;\n    ptr  = str;\n\t*ptr2++ = '\\\"';\n\n\twhile (*ptr)\n\t{\n\t\tif ((unsigned char)*ptr>31 && *ptr!='\\\"' && *ptr!='\\\\') \n            *ptr2++=*ptr++;\n\t\telse\n\t\t{\n\t\t\t*ptr2++='\\\\';\n\t\t\tswitch (token=*ptr++)\n\t\t\t{\n\t\t\t\tcase '\\\\':\t*ptr2++='\\\\';\tbreak;\n\t\t\t\tcase '\\\"':\t*ptr2++='\\\"';\tbreak;\n\t\t\t\tcase '\\b':\t*ptr2++='b';\tbreak;\n\t\t\t\tcase '\\f':\t*ptr2++='f';\tbreak;\n\t\t\t\tcase '\\n':\t*ptr2++='n';\tbreak;\n\t\t\t\tcase '\\r':\t*ptr2++='r';\tbreak;\n\t\t\t\tcase '\\t':\t*ptr2++='t';\tbreak;\n\t\t\t\tdefault: \n                    OVR_sprintf(ptr2, buff_size - (ptr2-out), \"u%04x\",token);\n                    ptr2+=5;\n                    break;\t// Escape and print.\n\t\t\t}\n\t\t}\n\t}\n\t*ptr2++='\\\"';\n    *ptr2++=0;\n\treturn out;\n}\n\n//-----------------------------------------------------------------------------\n// Utility to jump whitespace and cr/lf\nstatic const char* skip(const char* in)\n{\n    while (in && *in && (unsigned char)*in<=' ') \n        in++; \n    return in;\n}\n\n//-----------------------------------------------------------------------------\n// Parses the supplied buffer of JSON text and returns a JSON object tree\n// The returned object must be Released after use\nJSON* JSON::Parse(const char* buff, const char** perror)\n{\n    const char* end = 0;\n\tJSON*       json = new JSON();\n\t\n\tif (!json)\n    {\n        AssignError(perror, \"Error: Failed to allocate memory\");\n        return 0;\n    }\n \n\tend = json->parseValue(skip(buff), perror);\n\tif (!end)\n    {\n        json->Release();\n        return NULL;\n    }\t// parse failure. ep is set.\n\n    return json;\n}\n\n//-----------------------------------------------------------------------------\n// This version works for buffers that are not null terminated strings.\nJSON* JSON::ParseBuffer(const char *buff, int len, const char** perror)\n{\n\t// Our JSON parser does not support length-based parsing,\n\t// so ensure it is null-terminated.\n\tchar *termStr = new char[len + 1];\n\tmemcpy(termStr, buff, len);\n\ttermStr[len] = '\\0';\n\n\tJSON *objJson = Parse(termStr, perror);\n\n\tdelete[]termStr;\n\n\treturn objJson;\n}\n\n//-----------------------------------------------------------------------------\n// Parser core - when encountering text, process appropriately.\nconst char* JSON::parseValue(const char* buff, const char** perror)\n{\n    if (perror)\n        *perror = 0;\n\n\tif (!buff)\n        return NULL;\t// Fail on null.\n\n\tif (!strncmp(buff,\"null\",4))\n    {\n        Type = JSON_Null;\n        return buff+4;\n    }\n\tif (!strncmp(buff,\"false\",5))\n    { \n        Type   = JSON_Bool;\n        Value  = \"false\";\n        dValue = 0.;\n        return buff+5;\n    }\n\tif (!strncmp(buff,\"true\",4))\n    {\n        Type   = JSON_Bool;\n        Value  = \"true\";\n        dValue = 1.;\n        return buff + 4;\n    }\n\tif (*buff=='\\\"')\n    {\n        return parseString(buff, perror);\n    }\n\tif (*buff=='-' || (*buff>='0' && *buff<='9'))\n    { \n        return parseNumber(buff);\n    }\n\tif (*buff=='[')\n    { \n        return parseArray(buff, perror);\n    }\n\tif (*buff=='{')\n    {\n        return parseObject(buff, perror);\n    }\n\n    return AssignError(perror, \"Syntax Error: Invalid syntax\");\n}\n\n\n//-----------------------------------------------------------------------------\n// Render a value to text. \nchar* JSON::PrintValue(int depth, bool fmt)\n{\n\tchar *out=0;\n\n    switch (Type)\n\t{\n        case JSON_Null:\t    out = JSON_strdup(\"null\");\tbreak;\n        case JSON_Bool:\n            if ((int)dValue == 0)\n                out = JSON_strdup(\"false\");\n            else\n                out = JSON_strdup(\"true\");\n            break;\n        case JSON_Number:\tout = PrintNumber(dValue); break;\n        case JSON_String:\tout = PrintString(Value); break;\n        case JSON_Array:\tout = PrintArray(depth, fmt); break;\n        case JSON_Object:\tout = PrintObject(depth, fmt); break;\n        case JSON_None: OVR_ASSERT_LOG(false, (\"Bad JSON type.\")); break;\n\t}\n\treturn out;\n}\n\n//-----------------------------------------------------------------------------\n// Build an array object from input text and returns the text position after\n// the parsed array\nconst char* JSON::parseArray(const char* buff, const char** perror)\n{\n\tJSON *child;\n\tif (*buff!='[')\n    {\n        return AssignError(perror, \"Syntax Error: Missing opening bracket\");\n    }\n\n\tType=JSON_Array;\n\tbuff=skip(buff+1);\n\t\n    if (*buff==']')\n        return buff+1;\t// empty array.\n\n    child = new JSON();\n\tif (!child)\n        return 0;\t\t // memory fail\n    Children.PushBack(child);\n\t\n    buff=skip(child->parseValue(skip(buff), perror));\t// skip any spacing, get the buff. \n\tif (!buff)\n        return 0;\n\n\twhile (*buff==',')\n\t{\n\t\tJSON *new_item = new JSON();\n\t\tif (!new_item)\n            return AssignError(perror, \"Error: Failed to allocate memory\");\n\t\t\n        Children.PushBack(new_item);\n\n\t\tbuff=skip(new_item->parseValue(skip(buff+1), perror));\n\t\tif (!buff)\n            return AssignError(perror, \"Error: Failed to allocate memory\");\n\t}\n\n\tif (*buff==']')\n        return buff+1;\t// end of array\n\n    return AssignError(perror, \"Syntax Error: Missing ending bracket\");\n}\n\n//-----------------------------------------------------------------------------\n// Render an array to text.  The returned text must be freed\nchar* JSON::PrintArray(int depth, bool fmt)\n{\n\tchar **  entries;\n\tchar *   out = 0, *ptr,*ret;\n    intptr_t len = 5;\n\t\n    bool fail = false;\n\t\n\t// How many entries in the array? \n    int numentries = GetItemCount();\n\tif (!numentries)\n\t{\n\t\tout=(char*)OVR_ALLOC(3);\n\t\tif (out)\n            OVR_strcpy(out, 3, \"[]\");\n\t\treturn out;\n\t}\n\t// Allocate an array to hold the values for each\n\tentries=(char**)OVR_ALLOC(numentries*sizeof(char*));\n\tif (!entries)\n        return 0;\n\tmemset(entries,0,numentries*sizeof(char*));\n\n\t//// Retrieve all the results:\n    JSON* child = Children.GetFirst();\n    for (int i=0; i<numentries; i++)\n\t{\n\t\t//JSON* child = Children[i];\n        ret=child->PrintValue(depth+1, fmt);\n\t\tentries[i]=ret;\n\t\tif (ret)\n            len+=OVR_strlen(ret)+2+(fmt?1:0);\n        else\n        {\n            fail = true;\n            break;\n        }\n        child = Children.GetNext(child);\n\t}\n\t\n\t// If we didn't fail, try to malloc the output string \n\tif (!fail)\n        out=(char*)OVR_ALLOC(len);\n\t// If that fails, we fail. \n\tif (!out)\n        fail = true;\n\n\t// Handle failure.\n\tif (fail)\n\t{\n\t\tfor (int i=0; i<numentries; i++) \n        {\n            if (entries[i])\n                OVR_FREE(entries[i]);\n        }\n\t\tOVR_FREE(entries);\n\t\treturn 0;\n\t}\n\t\n\t// Compose the output array.\n\t*out='[';\n\tptr=out+1;\n    *ptr=0;\n\tfor (int i=0; i<numentries; i++)\n\t{\n\t\tOVR_strcpy(ptr, len - (ptr-out), entries[i]);\n        ptr+=OVR_strlen(entries[i]);\n\t\tif (i!=numentries-1)\n        {\n            *ptr++=',';\n            if (fmt)\n                *ptr++=' ';\n            *ptr=0;\n        }\n\t\tOVR_FREE(entries[i]);\n\t}\n\tOVR_FREE(entries);\n\t*ptr++=']';\n    *ptr++=0;\n\treturn out;\t\n}\n\n//-----------------------------------------------------------------------------\n// Build an object from the supplied text and returns the text position after\n// the parsed object\nconst char* JSON::parseObject(const char* buff, const char** perror)\n{\n\tif (*buff!='{')\n    {\n        return AssignError(perror, \"Syntax Error: Missing opening brace\");\n    }\n\t\n\tType=JSON_Object;\n\tbuff=skip(buff+1);\n\tif (*buff=='}')\n        return buff+1;\t// empty array.\n\t\n    JSON* child = new JSON();\n    Children.PushBack(child);\n\n\tbuff=skip(child->parseString(skip(buff), perror));\n\tif (!buff) \n        return 0;\n\tchild->Name = child->Value;\n    child->Value.Clear();\n\t\n    if (*buff!=':')\n    {\n        return AssignError(perror, \"Syntax Error: Missing colon\");\n    }\n\n\tbuff=skip(child->parseValue(skip(buff+1), perror));\t// skip any spacing, get the value.\n\tif (!buff)\n        return 0;\n\t\n\twhile (*buff==',')\n\t{\n        child = new JSON();\n\t\tif (!child)\n            return 0; // memory fail\n\t\t\n        Children.PushBack(child);\n\n\t\tbuff=skip(child->parseString(skip(buff+1), perror));\n\t\tif (!buff)\n            return 0;\n\t\t\n        child->Name=child->Value;\n        child->Value.Clear();\n\t\t\n        if (*buff!=':')\n        {\n            return AssignError(perror, \"Syntax Error: Missing colon\");\n        }\t// fail!\n\t\t\n        // Skip any spacing, get the value.\n        buff=skip(child->parseValue(skip(buff+1), perror));\n\t\tif (!buff)\n            return 0;\n\t}\n\t\n\tif (*buff=='}')\n        return buff+1;\t// end of array \n\t\n    return AssignError(perror, \"Syntax Error: Missing closing brace\");\n}\n\n//-----------------------------------------------------------------------------\n// Render an object to text.  The returned string must be freed\nchar* JSON::PrintObject(int depth, bool fmt)\n{\n\tchar**   entries = 0, **names = 0;\n\tchar*    out = 0;\n    char*    ptr, *ret, *str;\n    intptr_t len = 7, i = 0, j;\n    bool     fail = false;\n\t\n    // Count the number of entries.\n    int numentries = GetItemCount();\n    \n\t// Explicitly handle empty object case\n\tif (numentries == 0)\n\t{\n\t\tout=(char*)OVR_ALLOC(fmt?depth+4:4);\n\t\tif (!out)\n            return 0;\n\t\tptr=out;\n        *ptr++='{';\n\t\t\n        if (fmt)\n        {\n            *ptr++='\\n';\n            for (i=0;i<depth-1;i++)\n                *ptr++='\\t';\n        }\n\t\t*ptr++='}';\n        *ptr++=0;\n\t\treturn out;\n\t}\n\t// Allocate space for the names and the objects\n\tentries=(char**)OVR_ALLOC(numentries*sizeof(char*));\n\tif (!entries)\n        return 0;\n\tnames=(char**)OVR_ALLOC(numentries*sizeof(char*));\n\t\n    if (!names)\n    {\n        OVR_FREE(entries);\n        return 0;\n    }\n\tmemset(entries,0,sizeof(char*)*numentries);\n\tmemset(names,0,sizeof(char*)*numentries);\n\n\t// Collect all the results into our arrays:\n    depth++;\n    if (fmt)\n        len+=depth;\n\n    JSON* child = Children.GetFirst();\n    while (!Children.IsNull(child))\n\t{\n\t\tnames[i]     = str = PrintString(child->Name);\n\t\tentries[i++] = ret = child->PrintValue(depth, fmt);\n\n\t\tif (str && ret)\n        {\n            len += OVR_strlen(ret)+OVR_strlen(str)+2+(fmt?3+depth:0);\n        }\n        else\n        {\n            fail = true;\n            break;\n        }\n\t\t\n        child = Children.GetNext(child);\n\t}\n\t\n\t// Try to allocate the output string\n\tif (!fail)\n        out=(char*)OVR_ALLOC(len);\n\tif (!out)\n        fail=true;\n\n\t// Handle failure\n\tif (fail)\n\t{\n\t\tfor (i=0;i<numentries;i++)\n        {\n            if (names[i])\n                OVR_FREE(names[i]);\n            \n            if (entries[i])\n                OVR_FREE(entries[i]);}\n\t\t\n        OVR_FREE(names);\n        OVR_FREE(entries);\n\t\treturn 0;\n\t}\n\t\n\t// Compose the output:\n\t*out = '{';\n    ptr  = out+1;\n    if (fmt)\n    {\n#ifdef OVR_OS_WIN32\n        *ptr++ = '\\r';\n#endif\n        *ptr++ = '\\n';\n    }\n    *ptr = 0;\n\t\n    for (i=0; i<numentries; i++)\n\t{\n\t\tif (fmt)\n        {\n            for (j = 0; j < depth; j++)\n            {\n                *ptr++ = '\\t';\n            }\n        }\n\t\tOVR_strcpy(ptr, len - (ptr-out), names[i]);\n        ptr   += OVR_strlen(names[i]);\n\t\t*ptr++ =':';\n        \n        if (fmt)\n        {\n            *ptr++ = '\\t';\n        }\n\t\t\n        OVR_strcpy(ptr, len - (ptr-out), entries[i]);\n        ptr+=OVR_strlen(entries[i]);\n\t\t\n        if (i != numentries - 1)\n        {\n            *ptr++ = ',';\n        }\n\t\t\n        if (fmt)\n        {\n#ifdef OVR_OS_WIN32\n            *ptr++ = '\\r';\n#endif\n            *ptr++ = '\\n';\n        }\n        *ptr = 0;\n\t\t\n        OVR_FREE(names[i]);\n        OVR_FREE(entries[i]);\n\t}\n\t\n\tOVR_FREE(names);\n    OVR_FREE(entries);\n\t\n    if (fmt)\n    {\n        for (i = 0; i < depth - 1; i++)\n        {\n            *ptr++ = '\\t';\n        }\n    }\n\t*ptr++='}';\n    *ptr++=0;\n\t\n    return out;\t\n}\n\n\n\n// Returns the number of child items in the object\n// Counts the number of items in the object.\nunsigned JSON::GetItemCount() const\n{\n    unsigned count = 0;\n    for (const JSON* p = Children.GetFirst(); !Children.IsNull(p); p = p->pNext)\n    {\n        count++;\n    }\n    return count;\n}\n\nJSON* JSON::GetItemByIndex(unsigned index)\n{\n    unsigned i     = 0;\n    JSON*    child = 0;\n\n    if (!Children.IsEmpty())\n    {\n        child = Children.GetFirst();\n\n        while (i < index)\n        {   \n            if (Children.IsNull(child->pNext))\n            {\n                child = 0;\n                break;\n            }\n            child = child->pNext;\n            i++;\n        }\n    }\n  \n    return child;\n}\n\n// Returns the child item with the given name or NULL if not found\nJSON* JSON::GetItemByName(const char* name)\n{\n    JSON* child = 0;\n\n    if (!Children.IsEmpty())\n    {\n        child = Children.GetFirst();\n\n        while (OVR_strcmp(child->Name, name) != 0)\n        {   \n            if (Children.IsNull(child->pNext))\n            {\n                child = 0;\n                break;\n            }\n            child = child->pNext;\n        }\n    }\n\n    return child;\n}\n\n//-----------------------------------------------------------------------------\n// Adds a new item to the end of the child list\nvoid JSON::AddItem(const char *string, JSON *item)\n{\n    if (item)\n    {\n        item->Name = string;\n        Children.PushBack(item);\n    }\n}\n\n/*\n\n// Removes and frees the items at the given index\nvoid JSON::DeleteItem(unsigned int index)\n{\n    unsigned int num_items = 0;\n    JSON* child = Children.GetFirst();\n    while (!Children.IsNull(child) && num_items < index)\n    {   \n        num_items++;\n        child = Children.GetNext(child);\n    }\n\n    if (!Children.IsNull(child))\n    \n        child->RemoveNode();\n        child->Release();\n    }\n}\n\n// Replaces and frees the item at the give index with the new item\nvoid JSON::ReplaceItem(unsigned int index, JSON* new_item)\n{\n    unsigned int num_items = 0;\n    JSON* child = Children.GetFirst();\n    while (!Children.IsNull(child) && num_items < index)\n    {   \n        num_items++;\n        child = Children.GetNext(child);\n    }\n\n    if (!Children.IsNull(child))\n    {\n        child->ReplaceNodeWith(new_item);\n        child->Release();        \n    }\n}\n*/\n\n// Removes and frees the last child item\nvoid JSON::RemoveLast()\n{\n    JSON* child = Children.GetLast();\n    if (!Children.IsNull(child))\n    {\n        child->RemoveNode();\n        child->Release();\n    }\n}\n\nJSON* JSON::CreateBool(bool b)\n{\n    JSON *item = new JSON(JSON_Bool);\n    if (item)\n    {\n        item->dValue = b ? 1. : 0.;\n        item->Value = b ? \"true\" : \"false\";\n    }\n    return item;\n}\n\nJSON* JSON::CreateNumber(double num)\n{\n    JSON *item = new JSON(JSON_Number);\n    if (item)\n    {\n        item->dValue = num;\n    }\n    return item;\n}\n\nJSON* JSON::CreateInt(int num)\n{\n    JSON *item = new JSON(JSON_Number);\n    if (item)\n    {\n        item->dValue = num;\n    }\n    return item;\n}\n\nJSON* JSON::CreateString(const char *s)\n{\n    JSON *item = new JSON(JSON_String);\n    if (item && s)\n    {\n        item->Value = s;\n    }\n    return item;\n}\n\n\n//-----------------------------------------------------------------------------\n// Get elements by name\ndouble JSON::GetNumberByName(const char *name, double defValue)\n{\n\tJSON* item = GetItemByName(name);\n\tif (!item || item->Type != JSON_Number)\n    {\n\t\treturn defValue;\n\t}\n\telse\n    {\n\t\treturn item->dValue;\n\t}\n}\n\nint JSON::GetIntByName(const char *name, int defValue)\n{\n\tJSON* item = GetItemByName(name);\n\tif (!item || item->Type != JSON_Number)\n    {\n\t\treturn defValue;\n\t}\n\telse\n    {\n\t\treturn (int)item->dValue;\n\t}\n}\n\nbool JSON::GetBoolByName(const char *name, bool defValue)\n{\n\tJSON* item = GetItemByName(name);\n\tif (!item || item->Type != JSON_Bool)\n    {\n\t\treturn defValue;\n\t}\n\telse\n    {\n\t\treturn (int)item->dValue != 0;\n\t}\n}\n\nString JSON::GetStringByName(const char *name, const String &defValue)\n{\n\tJSON* item = GetItemByName(name);\n\tif (!item || item->Type != JSON_String)\n    {\n\t\treturn defValue;\n\t}\n\telse\n    {\n\t\treturn item->Value;\n\t}\n}\n\n//-----------------------------------------------------------------------------\n// Adds an element to an array object type\nvoid JSON::AddArrayElement(JSON *item)\n{\n    if (item)\n    {\n        Children.PushBack(item);\n    }\n}\n\n// Inserts an element into a valid array position\nvoid JSON::InsertArrayElement(int index, JSON *item)\n{\n    if (!item)\n    {\n        return;\n    }\n\n    if (index == 0)\n    {\n        Children.PushFront(item);\n        return;\n    }\n\n    JSON* iter = Children.GetFirst();\n    int i=0;\n    while (iter && i<index)\n    {\n        iter = Children.GetNext(iter);\n        i++;\n    }\n\n    if (iter)\n        iter->InsertNodeBefore(item);\n    else\n        Children.PushBack(item);\n}\n\n// Returns the size of an array\nint JSON::GetArraySize()\n{\n    if (Type == JSON_Array)\n    {\n        return GetItemCount();\n    }\n\n    return 0;\n}\n\n// Returns the number value an the give array index\ndouble JSON::GetArrayNumber(int index)\n{\n    if (Type == JSON_Array)\n    {\n        JSON* number = GetItemByIndex(index);\n        return number ? number->dValue : 0.0;\n    }\n\n    return 0;\n}\n\n// Returns the string value at the given array index\nconst char* JSON::GetArrayString(int index)\n{\n    if (Type == JSON_Array)\n    {\n        JSON* number = GetItemByIndex(index);\n        return number ? number->Value : 0;\n    }\n\n    return 0;\n}\n\nJSON* JSON::Copy()\n{\n    JSON* copy = new JSON(Type);\n    copy->Name = Name;\n    copy->Value = Value;\n    copy->dValue = dValue;\n\n    JSON* child = Children.GetFirst();\n    while (!Children.IsNull(child))\n    {\n        copy->Children.PushBack(child->Copy());\n        child = Children.GetNext(child);\n    }\n\n    return copy;\n}\n\n//-----------------------------------------------------------------------------\n// Loads and parses the given JSON file pathname and returns a JSON object tree.\n// The returned object must be Released after use.\nJSON* JSON::Load(const char* path, const char** perror)\n{\n    SysFile f;\n    if (!f.Open(path, File::Open_Read, File::Mode_Read))\n    {\n        AssignError(perror, \"Failed to open file\");\n        return NULL;\n    }\n\n    int    len   = f.GetLength();\n    uint8_t* buff  = (uint8_t*)OVR_ALLOC(len + 1);\n    int    bytes = f.Read(buff, len);\n    f.Close();\n\n    if (bytes == 0 || bytes != len)\n    {\n        OVR_FREE(buff);\n        return NULL;\n    }\n\n\t// Ensure the result is null-terminated since Parse() expects null-terminated input.\n\tbuff[len] = '\\0';\n\n    JSON* json = JSON::Parse((char*)buff, perror);\n    OVR_FREE(buff);\n    return json;\n}\n\n//-----------------------------------------------------------------------------\n// Serializes the JSON object and writes to the give file path\nbool JSON::Save(const char* path)\n{\n    SysFile f;\n    if (!f.Open(path, File::Open_Write | File::Open_Create | File::Open_Truncate, File::Mode_Write))\n        return false;\n\n    char* text = PrintValue(0, true);\n    if (text)\n    {\n        intptr_t len   = OVR_strlen(text);\n        OVR_ASSERT(len <= (intptr_t)(int)len);\n\n        int   bytes = f.Write((uint8_t*)text, (int)len);\n        f.Close();\n        OVR_FREE(text);\n        return (bytes == len);\n    }\n    else\n    {\n        return false;\n    }\n}\n\n\n} // namespace OVR\n"
  },
  {
    "path": "externals/ovr/Src/OVR_JSON.h",
    "content": "/************************************************************************************\n\nPublicHeader:   None\nFilename    :   OVR_JSON.h\nContent     :   JSON format reader and writer\nCreated     :   April 9, 2013\nAuthor      :   Brant Lewis\nNotes       :\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_JSON_H\n#define OVR_JSON_H\n\n#include \"Kernel/OVR_RefCount.h\"\n#include \"Kernel/OVR_String.h\"\n#include \"Kernel/OVR_List.h\"\n\nnamespace OVR {  \n\n// JSONItemType describes the type of JSON item, specifying the type of\n// data that can be obtained from it.\nenum JSONItemType\n{\n    JSON_None      = 0,\n    JSON_Null      = 1,\n    JSON_Bool      = 2,\n    JSON_Number    = 3,\n    JSON_String    = 4,\n    JSON_Array     = 5,\n    JSON_Object    = 6\n};\n\n//-----------------------------------------------------------------------------\n// ***** JSON\n\n// JSON object represents a JSON node that can be either a root of the JSON tree\n// or a child item. Every node has a type that describes what is is.\n// New JSON trees are typically loaded JSON::Load or created with JSON::Parse.\n\nclass JSON : public RefCountBase<JSON>, public ListNode<JSON>\n{\nprotected:\n    List<JSON>      Children;\n\npublic:\n    JSONItemType    Type;       // Type of this JSON node.\n    String          Name;       // Name part of the {Name, Value} pair in a parent object.\n    String          Value;\n    double          dValue;\n\npublic:\n    ~JSON();\n\n    // *** Creation of NEW JSON objects\n\n    static JSON*    CreateObject() { return new JSON(JSON_Object);}\n    static JSON*    CreateNull()   { return new JSON(JSON_Null); }\n    static JSON*    CreateArray()  { return new JSON(JSON_Array); }\n    static JSON*    CreateBool(bool b);\n    static JSON*    CreateNumber(double num);\n    static JSON*    CreateInt(int num);\n    static JSON*    CreateString(const char *s);\n\n    // Creates a new JSON object from parsing string.\n    // Returns null pointer and fills in *perror in case of parse error.\n    static JSON*    Parse(const char* buff, const char** perror = 0);\n\n\t// This version works for buffers that are not null terminated strings.\n\tstatic JSON*\tParseBuffer(const char *buff, int len, const char** perror = 0);\n\n    // Loads and parses a JSON object from a file.\n    // Returns 0 and assigns perror with error message on fail.\n    static JSON*    Load(const char* path, const char** perror = 0);\n\n    // Saves a JSON object to a file.\n    bool            Save(const char* path);\n\n    // *** Object Member Access\n\n    // These provide access to child items of the list.\n    bool            HasItems() const         { return Children.IsEmpty(); }\n    // Returns first/last child item, or null if child list is empty\n    JSON*           GetFirstItem()           { return (!Children.IsEmpty()) ? Children.GetFirst() : 0; }\n    JSON*           GetLastItem()            { return (!Children.IsEmpty()) ? Children.GetLast() : 0; }\n\n    // Counts the number of items in the object; these methods are inefficient.\n    unsigned        GetItemCount() const;\n    JSON*           GetItemByIndex(unsigned i);\n    JSON*           GetItemByName(const char* name);\n\n\t// Accessors by name\n\tdouble\t\t\tGetNumberByName(const char *name, double defValue = 0.0);\n\tint\t\t\t\tGetIntByName(const char *name, int defValue = 0);\n\tbool\t\t\tGetBoolByName(const char *name, bool defValue = false);\n\tString\t\t\tGetStringByName(const char *name, const String &defValue = \"\");\n\n    // Returns next item in a list of children; 0 if no more items exist.\n    JSON*           GetNextItem(JSON* item)  { return Children.IsNull(item->pNext) ? 0 : item->pNext; }\n    JSON*           GetPrevItem(JSON* item)  { return Children.IsNull(item->pPrev) ? 0 : item->pPrev; }\n\n\n    // Child item access functions\n    void            AddItem(const char *string, JSON* item);\n    void            AddNullItem(const char* name)                    { AddItem(name, CreateNull()); }\n    void            AddBoolItem(const char* name, bool b)            { AddItem(name, CreateBool(b)); }\n    void            AddIntItem(const char* name, int n)              { AddItem(name, CreateInt(n)); }\n    void            AddNumberItem(const char* name, double n)        { AddItem(name, CreateNumber(n)); }\n    void            AddStringItem(const char* name, const char* s)   { AddItem(name, CreateString(s)); }\n//    void            ReplaceItem(unsigned index, JSON* new_item);\n//    void            DeleteItem(unsigned index);\n    void            RemoveLast();\n\n    // *** Array Element Access\n\n    // Add new elements to the end of array.\n    void            AddArrayElement(JSON *item);\n    void            InsertArrayElement(int index, JSON* item);\n    void            AddArrayNumber(double n)        { AddArrayElement(CreateNumber(n)); }\n    void            AddArrayInt(int n)              { AddArrayElement(CreateInt(n)); }\n    void            AddArrayString(const char* s)   { AddArrayElement(CreateString(s)); }\n\n    // Accessed array elements; currently inefficient.\n    int             GetArraySize();\n    double          GetArrayNumber(int index);\n    const char*     GetArrayString(int index);\n\n    JSON*           Copy();  // Create a copy of this object\n\nprotected:\n    JSON(JSONItemType itemType = JSON_Object);\n\n    // JSON Parsing helper functions.\n    const char*     parseValue(const char *buff, const char** perror);\n    const char*     parseNumber(const char *num);\n    const char*     parseArray(const char* value, const char** perror);\n    const char*     parseObject(const char* value, const char** perror);\n    const char*     parseString(const char* str, const char** perror);\n\n    char*           PrintValue(int depth, bool fmt);\n    char*           PrintObject(int depth, bool fmt);\n    char*           PrintArray(int depth, bool fmt);\n};\n\n\n}\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/OVR_Profile.cpp",
    "content": "/************************************************************************************\n\nPublicHeader:   None\nFilename    :   OVR_Profile.cpp\nContent     :   Structs and functions for loading and storing device profile settings\nCreated     :   February 14, 2013\nNotes       :\n   \n   Profiles are used to store per-user settings that can be transferred and used\n   across multiple applications.  For example, player IPD can be configured once \n   and reused for a unified experience across games.  Configuration and saving of profiles\n   can be accomplished in game via the Profile API or by the official Oculus Configuration\n   Utility.\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_Profile.h\"\n#include \"OVR_JSON.h\"\n#include \"Kernel/OVR_SysFile.h\"\n#include \"Kernel/OVR_Allocator.h\"\n#include \"OVR_Stereo.h\"\n\n#ifdef OVR_OS_WIN32\n#define WIN32_LEAN_AND_MEAN\n#include <Windows.h>\n#include <Shlobj.h>\n#elif defined(OVR_OS_MS) // Other Microsoft OSs\n// Nothing, thanks.\n#else\n#include <dirent.h>\n#include <sys/stat.h>\n\n#ifdef OVR_OS_LINUX\n#include <unistd.h>\n#include <pwd.h>\n#endif\n\n#endif\n\n#define PROFILE_VERSION 2.0\n#define MAX_PROFILE_MAJOR_VERSION 2\n#define MAX_DEVICE_PROFILE_MAJOR_VERSION 1\n\n\nnamespace OVR {\n\n\n//-----------------------------------------------------------------------------\n// ProfileDeviceKey\n\nProfileDeviceKey::ProfileDeviceKey(const HMDInfo* info) :\n    Valid(false)\n{\n    if (info)\n    {\n        PrintedSerial = info->PrintedSerial;\n        ProductName = SanitizeProductName(info->ProductName);\n        ProductId = info->ProductId;\n        HmdType = info->HmdType;\n\n        if (ProductId != 0)\n        {\n            Valid = true;\n        }\n    }\n    else\n    {\n        ProductId = 0;\n        HmdType = HmdType_None;\n    }\n}\n\nString ProfileDeviceKey::SanitizeProductName(String productName)\n{\n    String result;\n\n    if (!productName.IsEmpty())\n    {\n        const char* product_name = productName.ToCStr();\n\n        // First strip off \"Oculus\"\n        const char* oculus = strstr(product_name, \"Oculus \");\n        if (oculus)\n        {\n            product_name = oculus + OVR_strlen(\"Oculus \");\n        }\n\n        // And remove spaces from the name\n        for (const char* s = product_name; *s != 0; s++)\n        {\n            if (*s != ' ')\n            {\n                result.AppendChar(*s);\n            }\n        }\n    }\n\n    return result;\n}\n\n\n\n//-----------------------------------------------------------------------------\n// Returns the pathname of the JSON file containing the stored profiles\nString GetBaseOVRPath(bool create_dir)\n{\n    String path;\n\n#if defined(OVR_OS_WIN32)\n\n    TCHAR data_path[MAX_PATH];\n    SHGetFolderPath(0, CSIDL_LOCAL_APPDATA, NULL, 0, data_path);\n    path = String(data_path);\n    \n    path += \"/Oculus\";\n\n    if (create_dir)\n    {   // Create the Oculus directory if it doesn't exist\n        WCHAR wpath[128];\n        OVR::UTF8Util::DecodeString(wpath, path.ToCStr());\n\n        DWORD attrib = GetFileAttributes(wpath);\n        bool exists = attrib != INVALID_FILE_ATTRIBUTES && (attrib & FILE_ATTRIBUTE_DIRECTORY);\n        if (!exists)\n        {   \n            CreateDirectory(wpath, NULL);\n        }\n    }\n\n#elif defined(OVR_OS_OS) // Other Microsoft OSs\n\n    // TODO: figure this out.\n    OVR_UNUSED ( create_dir );\n    path = \"\";\n        \n#elif defined(OVR_OS_MAC)\n\n    const char* home = getenv(\"HOME\");\n    path = home;\n    path += \"/Library/Preferences/Oculus\";\n\n    if (create_dir)\n    {   // Create the Oculus directory if it doesn't exist\n        DIR* dir = opendir(path);\n        if (dir == NULL)\n        {\n            mkdir(path, S_IRWXU | S_IRWXG | S_IRWXO);\n        }\n        else\n        {\n            closedir(dir);\n        }\n    }\n\n#else\n\n    const char* home = getenv(\"HOME\");\n    path = home;\n    path += \"/.config/Oculus\";\n\n    if (create_dir)\n    {   // Create the Oculus directory if it doesn't exist\n        DIR* dir = opendir(path);\n        if (dir == NULL)\n        {\n            mkdir(path, S_IRWXU | S_IRWXG | S_IRWXO);\n        }\n        else\n        {\n            closedir(dir);\n        }\n    }\n\n#endif\n\n    return path;\n}\n\nString ProfileManager::GetProfilePath()\n{\n    return BasePath + \"/ProfileDB.json\";\n}\n\nstatic JSON* FindTaggedData(JSON* data, const char** tag_names, const char** qtags, int num_qtags)\n{\n    if (data == NULL || !(data->Name == \"TaggedData\") || data->Type != JSON_Array)\n        return NULL;\n\n    JSON* tagged_item = data->GetFirstItem();\n    while (tagged_item)\n    {\n        JSON* tags = tagged_item->GetItemByName(\"tags\");\n        if (tags->Type == JSON_Array && num_qtags == tags->GetArraySize())\n        {   // Check for a full tag match on each item\n            int num_matches = 0;\n            \n            for (int k=0; k<num_qtags; k++)\n            {\n                JSON* tag = tags->GetFirstItem();\n                while (tag)\n                {\n                    JSON* tagval = tag->GetFirstItem();\n                    if (tagval && tagval->Name == tag_names[k])\n                    {\n                        if (tagval->Value == qtags[k])\n                            num_matches++;\n                        break;\n                    }\n                    tag = tags->GetNextItem(tag);\n                }\n            }\n\n            // if all tags were matched then copy the values into this Profile\n            if (num_matches == num_qtags)\n            {\n                JSON* vals = tagged_item->GetItemByName(\"vals\");\n                return vals;\n            }\n        }\n\n        tagged_item = data->GetNextItem(tagged_item);\n    }\n\n    return NULL;\n}\n\nstatic void FilterTaggedData(JSON* data, const char* tag_name, const char* qtag, Array<JSON*>& items)\n{\n    if (data == NULL || !(data->Name == \"TaggedData\") || data->Type != JSON_Array)\n        return;\n\n    JSON* tagged_item = data->GetFirstItem();\n    while (tagged_item)\n    {\n        JSON* tags = tagged_item->GetItemByName(\"tags\");\n        if (tags->Type == JSON_Array)\n        {   // Check for a tag match on the requested tag\n            \n            JSON* tag = tags->GetFirstItem();\n            while (tag)\n            {\n                JSON* tagval = tag->GetFirstItem();\n                if (tagval && tagval->Name == tag_name)\n                {\n                    if (tagval->Value == qtag)\n                    {   // Add this item to the output list\n                        items.PushBack(tagged_item);\n                    }\n                    break;\n                }\n                tag = tags->GetNextItem(tag);\n            }\n        }\n\n        tagged_item = data->GetNextItem(tagged_item);\n    }\n}\n\n\n//-----------------------------------------------------------------------------\n// ***** ProfileManager\n\ntemplate<> ProfileManager* OVR::SystemSingletonBase<ProfileManager>::SlowGetInstance()\n{\n    static OVR::Lock lock;\n    OVR::Lock::Locker locker(&lock);\n    if (!SingletonInstance) SingletonInstance = new ProfileManager(true);\n    return SingletonInstance;\n}\n\nProfileManager::ProfileManager(bool sys_register) :\n    Changed(false)\n{\n    // Attempt to get the base path automatically, but this may fail\n    BasePath = GetBaseOVRPath(false);\n\n    if (sys_register)\n        PushDestroyCallbacks();\n}\n\nProfileManager::~ProfileManager()\n{\n    ClearProfileData();\n}\n\nvoid ProfileManager::OnSystemDestroy()\n{\n    delete this;\n}\n\n// In the service process it is important to set the base path because this cannot be detected automatically\nvoid ProfileManager::SetBasePath(String basePath)\n{\n    if (basePath != BasePath)\n    {\n        BasePath = basePath;\n        LoadCache(false);\n    }\n}\n\n// Clear the local profile cache\nvoid ProfileManager::ClearProfileData()\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    ProfileCache.Clear();\n    Changed = false;\n}\n\n// Serializes the profiles to disk.\nvoid ProfileManager::Save()\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    if (ProfileCache == NULL)\n        return;\n\n    // Save the profile to disk\n    BasePath = GetBaseOVRPath(true);  // create the base directory if it doesn't exist\n    String path = GetProfilePath();\n    ProfileCache->Save(path);\n    Changed = false;\n}\n\n// Returns a profile with all system default values\nProfile* ProfileManager::GetDefaultProfile(HmdTypeEnum device)\n{\n    // In the absence of any data, set some reasonable profile defaults.\n    // However, this is not future proof and developers should still\n    // provide reasonable default values for queried fields.\n    \n    // Biometric data\n    Profile* profile = CreateProfile();\n    profile->SetValue(OVR_KEY_USER,               \"default\");\n    profile->SetValue(OVR_KEY_NAME,               \"Default\");\n    profile->SetValue(OVR_KEY_GENDER,             OVR_DEFAULT_GENDER);\n    profile->SetFloatValue(OVR_KEY_PLAYER_HEIGHT, OVR_DEFAULT_PLAYER_HEIGHT);\n    profile->SetFloatValue(OVR_KEY_EYE_HEIGHT,    OVR_DEFAULT_EYE_HEIGHT);\n    profile->SetFloatValue(OVR_KEY_IPD,           OVR_DEFAULT_IPD);\n    float half_ipd[2] = { OVR_DEFAULT_IPD / 2, OVR_DEFAULT_IPD / 2 };\n    profile->SetFloatValues(OVR_KEY_EYE_TO_NOSE_DISTANCE, half_ipd, 2);\n    float dist[2] = {OVR_DEFAULT_NECK_TO_EYE_HORIZONTAL, OVR_DEFAULT_NECK_TO_EYE_VERTICAL};\n    profile->SetFloatValues(OVR_KEY_NECK_TO_EYE_DISTANCE, dist, 2);\n    \n    // Device specific data\n    if (device != HmdType_None)\n    {\n        if (device == HmdType_CrystalCoveProto || device == HmdType_DK2)\n        {\n            profile->SetValue(\"EyeCup\", \"A\");\n            profile->SetIntValue(OVR_KEY_EYE_RELIEF_DIAL, OVR_DEFAULT_EYE_RELIEF_DIAL);\n\n            // TODO: These defaults are a little bogus and designed for continuity with 0.3\n            // eye-relief values.  We need better measurement-based numbers in future releases\n            float max_eye_plate[2] = { 0.01965f + 0.018f, 0.01965f + 0.018f };\n            profile->SetFloatValues(OVR_KEY_MAX_EYE_TO_PLATE_DISTANCE, max_eye_plate, 2);\n        }\n        else\n        {   // DK1 and DKHD variants\n            profile->SetValue(\"EyeCup\", \"A\");\n            profile->SetIntValue(OVR_KEY_EYE_RELIEF_DIAL, OVR_DEFAULT_EYE_RELIEF_DIAL);\n\n            // TODO: These defaults are a little bogus and designed for continuity with 0.3\n            // DK1 distortion.  We need better measurement-based numbers in future releases\n            float max_eye_plate[2] = { 0.02357f + 0.017f, 0.02357f + 0.017f };\n            profile->SetFloatValues(OVR_KEY_MAX_EYE_TO_PLATE_DISTANCE, max_eye_plate, 2);\n        }\n    }\n\n    return profile;\n}\n\n//------------------------------------------------------------------------------\nvoid ProfileManager::Read()\n{\n    LoadCache(false);\n}\n\n// Populates the local profile cache.  This occurs on the first access of the profile\n// data.  All profile operations are performed against the local cache until the\n// ProfileManager is released or goes out of scope at which time the cache is serialized\n// to disk.\nvoid ProfileManager::LoadCache(bool create)\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    ClearProfileData();\n\n    String path = GetProfilePath();\n\n    Ptr<JSON> root = *JSON::Load(path);\n    if (root == NULL)\n    {   \n        path = BasePath + \"/Profiles.json\";  // look for legacy profile\n        root = *JSON::Load(path);\n        \n        if (root == NULL)\n        {\n            if (create)\n            {   // Generate a skeleton profile database\n                root = *JSON::CreateObject();\n                root->AddNumberItem(\"Oculus Profile Version\", 2.0);\n                root->AddItem(\"Users\", JSON::CreateArray());\n                root->AddItem(\"TaggedData\", JSON::CreateArray());\n                ProfileCache = root;\n            }\n            \n            return;\n        }\n\n        // Verify the legacy version\n        JSON* version_item = root->GetFirstItem();\n        if (version_item->Name == \"Oculus Profile Version\")\n        {\n            int major = atoi(version_item->Value.ToCStr());\n            if (major != 1)\n                return;   // don't use the file on unsupported major version number\n        }\n        else\n        {\n            return;      // invalid file\n        }\n\n        // Convert the legacy format to the new database format\n        LoadV1Profiles(root);\n    }\n    else\n    {\n        // Verify the file format and version\n        JSON* version_item = root->GetFirstItem();\n        if (version_item && version_item->Name == \"Oculus Profile Version\")\n        {\n            int major = atoi(version_item->Value.ToCStr());\n            if (major != 2)\n                return;   // don't use the file on unsupported major version number\n        }\n        else\n        {\n            return;       // invalid file \n        }\n\n        ProfileCache = root;   // store the database contents for traversal\n    }\n}\n\nvoid ProfileManager::LoadV1Profiles(JSON* v1)\n{\n    JSON* item0 = v1->GetFirstItem();\n    JSON* item1 = v1->GetNextItem(item0);\n    JSON* item2 = v1->GetNextItem(item1);\n\n    OVR_ASSERT(item1 && item2);\n    if(!item1 || !item2)\n        return;\n\n    // Create the new profile database\n    Ptr<JSON> root = *JSON::CreateObject();\n    root->AddNumberItem(\"Oculus Profile Version\", 2.0);\n    root->AddItem(\"Users\", JSON::CreateArray());\n    root->AddItem(\"TaggedData\", JSON::CreateArray());\n    ProfileCache = root;\n\n    const char* default_dk1_user = item1->Value;\n    \n    // Read the number of profiles\n    int   profileCount = (int)item2->dValue;\n    JSON* profileItem  = item2;\n\n    for (int p=0; p<profileCount; p++)\n    {\n        profileItem = root->GetNextItem(profileItem);\n        if (profileItem == NULL)\n            break;\n\n        if (profileItem->Name == \"Profile\")\n        {\n            // Read the required Name field\n            const char* profileName;\n            JSON* item = profileItem->GetFirstItem();\n        \n            if (item && (item->Name == \"Name\"))\n            {   \n                profileName = item->Value;\n            }\n            else\n            {\n                return;   // invalid field\n            }\n            \n            // Read the user profile fields\n            if (CreateUser(profileName, profileName))\n            {\n                const char* tag_names[2] = {\"User\", \"Product\"};\n                const char* tags[2];\n                tags[0] = profileName;\n\n                Ptr<Profile> user_profile = *CreateProfile();\n                user_profile->SetValue(OVR_KEY_NAME, profileName);\n\n                float neckeye[2] = { 0, 0 };\n\n                item = profileItem->GetNextItem(item);\n                while (item)\n                {\n                    if (item->Type != JSON_Object)\n                    {\n                        if (item->Name == OVR_KEY_PLAYER_HEIGHT)\n                        {   // Add an explicit eye height\n\n                        }\n                        if (item->Name == \"NeckEyeHori\")\n                            neckeye[0] = (float)item->dValue;\n                        else if (item->Name == \"NeckEyeVert\")\n                            neckeye[1] = (float)item->dValue;\n                        else \n                            user_profile->SetValue(item);\n                    }\n                    else\n                    {   \n                        // Add the user/device tag values\n                        const char* device_name = item->Name.ToCStr();\n                        Ptr<Profile> device_profile = *CreateProfile();\n\n                        JSON* device_item = item->GetFirstItem();\n                        while (device_item)\n                        {\n                            device_profile->SetValue(device_item);\n                            device_item = item->GetNextItem(device_item);\n                        }\n\n                        tags[1] = device_name;\n                        SetTaggedProfile(tag_names, tags, 2, device_profile);\n                    }\n\n                    item = profileItem->GetNextItem(item);\n                }\n\n                // Add an explicit eye-height field\n                float player_height = user_profile->GetFloatValue(OVR_KEY_PLAYER_HEIGHT,\n                                                                  OVR_DEFAULT_PLAYER_HEIGHT);\n                if (player_height > 0)\n                {\n                    char gender[16];\n                    user_profile->GetValue(OVR_KEY_GENDER, gender, 16);\n        \n                    const float EYE_TO_HEADTOP_RATIO =   0.44538f;\n                    const float MALE_AVG_HEAD_HEIGHT =   0.232f;\n                    const float FEMALE_AVG_HEAD_HEIGHT = 0.218f;\n     \n                    // compute distance from top of skull to the eye\n                    float head_height;\n                    if (OVR_strcmp(gender, \"Female\") == 0)\n                        head_height = FEMALE_AVG_HEAD_HEIGHT;\n                    else\n                        head_height = MALE_AVG_HEAD_HEIGHT;\n\n                    float skull = EYE_TO_HEADTOP_RATIO * head_height;\n                    float eye_height = player_height - skull;\n\n                    user_profile->SetFloatValue(OVR_KEY_EYE_HEIGHT, eye_height);\n                }\n\n                // Convert NeckEye values to an array\n                if (neckeye[0] > 0 && neckeye[1] > 0)\n                    user_profile->SetFloatValues(OVR_KEY_NECK_TO_EYE_DISTANCE, neckeye, 2);\n\n                // Add the user tag values\n                SetTaggedProfile(tag_names, tags, 1, user_profile);\n            }\n        }\n    }\n\n    // since V1 profiles were only for DK1, the assign the user to all DK1's\n    const char* tag_names[1] = { \"Product\" };\n    const char* tags[1] = { \"RiftDK1\" };\n    Ptr<Profile> product_profile = *CreateProfile();\n    product_profile->SetValue(\"DefaultUser\", default_dk1_user);\n    SetTaggedProfile(tag_names, tags, 1, product_profile);\n}\n\n// Returns the number of stored profiles for this device type\nint ProfileManager::GetUserCount()\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    if (ProfileCache == NULL)\n    {   // Load the cache\n        LoadCache(false);\n        if (ProfileCache == NULL)\n            return 0;\n    }\n\n    JSON* users = ProfileCache->GetItemByName(\"Users\");\n    if (users == NULL)\n        return 0;\n\n    return users->GetItemCount();\n}\n\nbool ProfileManager::CreateUser(const char* user, const char* name)\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    if (ProfileCache == NULL)\n    {   // Load the cache\n        LoadCache(true);\n        if (ProfileCache == NULL)\n            return false;\n    }\n\n    JSON* users = ProfileCache->GetItemByName(\"Users\");\n    if (users == NULL)\n    {   // Generate the User section\n        users = JSON::CreateArray();\n        ProfileCache->AddItem(\"Users\", users);\n//TODO: Insert this before the TaggedData\n    }\n\n    // Search for the pre-existence of this user\n    JSON* user_item = users->GetFirstItem();\n    int index = 0;\n    while (user_item)\n    {\n        JSON* userid = user_item->GetItemByName(\"User\");\n        int compare = OVR_strcmp(user, userid->Value);\n        if (compare == 0)\n        {   // The user already exists so simply update the fields\n            JSON* name_item = user_item->GetItemByName(\"Name\");\n            if (name_item && OVR_strcmp(name, name_item->Value) != 0)\n            {\n                name_item->Value = name;\n                Changed = true;\n            }\n            return true;\n        }\n        else if (compare < 0)\n        {   // A new user should be placed before this item\n            break;\n        }\n        \n        user_item = users->GetNextItem(user_item);\n        index++;\n    }\n\n    // Create and fill the user struct\n    JSON* new_user = JSON::CreateObject();\n    new_user->AddStringItem(OVR_KEY_USER, user);\n    new_user->AddStringItem(OVR_KEY_NAME, name);\n    // user_item->AddStringItem(\"Password\", password);\n\n    if (user_item == NULL)\n        users->AddArrayElement(new_user);\n    else\n        users->InsertArrayElement(index, new_user);\n\n    Changed = true;\n    return true;\n}\n\nbool ProfileManager::HasUser(const char* user)\n{\n\tLock::Locker lockScope(&ProfileLock);\n\n\tif (ProfileCache == NULL)\n\t{   // Load the cache\n\t\tLoadCache(false);\n\t\tif (ProfileCache == NULL)\n\t\t\treturn false;\n\t}\n\n\tJSON* users = ProfileCache->GetItemByName(\"Users\");\n\tif (users == NULL)\n\t\treturn false;\n\n\t// Remove this user from the User table\n\tJSON* user_item = users->GetFirstItem();\n\twhile (user_item)\n\t{\n\t\tJSON* userid = user_item->GetItemByName(\"User\");\n\t\tif (OVR_strcmp(user, userid->Value) == 0)\n\t\t{   \n\t\t\treturn true;\n\t\t}\n\n\t\tuser_item = users->GetNextItem(user_item);\n\t}\n\n\treturn false;\n}\n\n// Returns the user id of a specific user in the list.  The returned \n// memory is locally allocated and should not be stored or deleted.  Returns NULL\n// if the index is invalid\nconst char* ProfileManager::GetUser(unsigned int index)\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    if (ProfileCache == NULL)\n    {   // Load the cache\n        LoadCache(false);\n        if (ProfileCache == NULL)\n            return NULL;\n    }\n\n    JSON* users = ProfileCache->GetItemByName(\"Users\");\n    \n    if (users && index < users->GetItemCount())\n    {\n        JSON* user_item = users->GetItemByIndex(index);\n        if (user_item)\n        {\n            JSON* user = user_item->GetFirstItem();\n            if (user)\n            {\n                JSON* userid = user_item->GetItemByName(OVR_KEY_USER);\n                if (userid)\n                    return userid->Value.ToCStr();\n            }\n        }\n    }\n    \n\n    return NULL;\n}\n\nbool ProfileManager::RemoveUser(const char* user)\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    if (ProfileCache == NULL)\n    {   // Load the cache\n        LoadCache(false);\n        if (ProfileCache == NULL)\n            return true;\n    }\n\n    JSON* users = ProfileCache->GetItemByName(\"Users\");\n    if (users == NULL)\n        return true;\n\n    // Remove this user from the User table\n    JSON* user_item = users->GetFirstItem();\n    while (user_item)\n    {\n        JSON* userid = user_item->GetItemByName(\"User\");\n        if (OVR_strcmp(user, userid->Value) == 0)\n        {   // Delete the user entry\n            user_item->RemoveNode();\n            user_item->Release();\n            Changed = true;\n            break;\n        }\n        \n        user_item = users->GetNextItem(user_item);\n    }\n\n    // Now remove all data entries with this user tag\n    JSON* tagged_data = ProfileCache->GetItemByName(\"TaggedData\");\n    Array<JSON*> user_items;\n    FilterTaggedData(tagged_data, \"User\", user, user_items);\n    for (unsigned int i=0; i<user_items.GetSize(); i++)\n    {\n        user_items[i]->RemoveNode();\n        user_items[i]->Release();\n        Changed = true;\n    }\n \n    return Changed;\n}\n\nProfile* ProfileManager::CreateProfile()\n{\n    Profile* profile = new Profile(BasePath);\n    return profile;\n}\n\nconst char* ProfileManager::GetDefaultUser(const ProfileDeviceKey& deviceKey)\n{\n    const char* product_str = deviceKey.ProductName.IsEmpty() ? NULL : deviceKey.ProductName.ToCStr();\n    const char* serial_str = deviceKey.PrintedSerial.IsEmpty() ? NULL : deviceKey.PrintedSerial.ToCStr();\n\n    return GetDefaultUser(product_str, serial_str);\n}\n\n// Returns the name of the profile that is marked as the current default user.\nconst char* ProfileManager::GetDefaultUser(const char* product, const char* serial)\n{\n    const char* tag_names[2] = {\"Product\", \"Serial\"};\n    const char* tags[2];\n\n    if (product && serial)\n    {\n        tags[0] = product;\n        tags[1] = serial;\n        // Look for a default user on this specific device\n        Ptr<Profile> p = *GetTaggedProfile(tag_names, tags, 2);\n        if (p == NULL)\n        {   // Look for a default user on this product\n            p = *GetTaggedProfile(tag_names, tags, 1);\n        }\n\n        if (p)\n        {   \n            const char* user = p->GetValue(\"DefaultUser\");\n            if (user != NULL && user[0] != 0)\n            {\n                TempBuff = user;\n                return TempBuff.ToCStr();\n            }\n        }\n    }\n\n    return NULL;\n}\n\n//-----------------------------------------------------------------------------\nbool ProfileManager::SetDefaultUser(const ProfileDeviceKey& deviceKey, const char* user)\n{\n    const char* tag_names[2] = {\"Product\", \"Serial\"};\n    const char* tags[2];\n\n    const char* product_str = deviceKey.ProductName.IsEmpty() ? NULL : deviceKey.ProductName.ToCStr();\n    const char* serial_str = deviceKey.PrintedSerial.IsEmpty() ? NULL : deviceKey.PrintedSerial.ToCStr();\n\n    if (product_str && serial_str)\n    {\n        tags[0] = product_str;\n        tags[1] = serial_str;\n\n        Ptr<Profile> p = *CreateProfile();\n        p->SetValue(\"DefaultUser\", user);\n        return SetTaggedProfile(tag_names, tags, 2, p);\n    }\n\n    return false;\n}\n\n//-----------------------------------------------------------------------------\nProfile* ProfileManager::GetTaggedProfile(const char** tag_names, const char** tags, int num_tags)\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    if (ProfileCache == NULL)\n    {   // Load the cache\n        LoadCache(false);\n        if (ProfileCache == NULL)\n            return NULL;\n    }\n\n    JSON* tagged_data = ProfileCache->GetItemByName(\"TaggedData\");\n    OVR_ASSERT(tagged_data);\n    if (tagged_data == NULL)\n        return NULL;\n    \n    Profile* profile = new Profile(BasePath);\n    \n    JSON* vals = FindTaggedData(tagged_data, tag_names, tags, num_tags);\n    if (vals)\n    {   \n        JSON* item = vals->GetFirstItem();\n        while (item)\n        {\n            //printf(\"Add %s, %s\\n\", item->Name.ToCStr(), item->Value.ToCStr());\n            //profile->Settings.Set(item->Name, item->Value);\n            profile->SetValue(item);\n            item = vals->GetNextItem(item);\n        }\n\n        return profile;\n    }\n    else\n    {\n        profile->Release();\n        return NULL;\n    }\n}\n\n//-----------------------------------------------------------------------------\nbool ProfileManager::SetTaggedProfile(const char** tag_names, const char** tags, int num_tags, Profile* profile)\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    if (ProfileCache == NULL)\n    {   // Load the cache\n        LoadCache(true);\n        if (ProfileCache == NULL)\n            return false;  // TODO: Generate a new profile DB\n    }\n\n    JSON* tagged_data = ProfileCache->GetItemByName(\"TaggedData\");\n    OVR_ASSERT(tagged_data);\n    if (tagged_data == NULL)\n        return false;\n\n    // Get the cached tagged data section\n    JSON* vals = FindTaggedData(tagged_data, tag_names, tags, num_tags);\n    if (vals == NULL)\n    {  \n        JSON* tagged_item = JSON::CreateObject();\n        JSON* taglist = JSON::CreateArray();\n        for (int i=0; i<num_tags; i++)\n        {\n            JSON* k = JSON::CreateObject();\n            k->AddStringItem(tag_names[i], tags[i]);\n            taglist->AddArrayElement(k);\n        }\n\n        vals = JSON::CreateObject();\n        \n        tagged_item->AddItem(\"tags\", taglist);\n        tagged_item->AddItem(\"vals\", vals);\n        tagged_data->AddArrayElement(tagged_item);\n    }\n\n    // Now add or update each profile setting in cache\n    for (unsigned int i=0; i<profile->Values.GetSize(); i++)\n    {\n        JSON* value = profile->Values[i];\n        \n        bool found = false;\n        JSON* item = vals->GetFirstItem();\n        while (item)\n        {\n            if (value->Name == item->Name)\n            {\n                // Don't allow a pre-existing type to be overridden\n                OVR_ASSERT(value->Type == item->Type);\n\n                if (value->Type == item->Type)\n                {   // Check for the same value\n                    if (value->Type == JSON_Array)\n                    {   // Update each array item\n                        if (item->GetArraySize() == value->GetArraySize())\n                        {   // Update each value (assumed to be basic types and not array of objects)\n                            JSON* value_element = value->GetFirstItem();\n                            JSON* item_element = item->GetFirstItem();\n                            while (item_element && value_element)\n                            {\n                                if (value_element->Type == JSON_String)\n                                {\n                                    if (item_element->Value != value_element->Value)\n                                    {   // Overwrite the changed value and mark for file update\n                                        item_element->Value = value_element->Value;\n                                        Changed = true;\n                                    }\n                                }\n                                else {\n                                    if (item_element->dValue != value_element->dValue)\n                                    {   // Overwrite the changed value and mark for file update\n                                        item_element->dValue = value_element->dValue;\n                                        Changed = true;\n                                    }\n                                }\n                                \n                                value_element = value->GetNextItem(value_element);\n                                item_element = item->GetNextItem(item_element);\n                            }\n                        }\n                        else\n                        {   // if the array size changed, simply create a new one                            \n// TODO: Create the new array\n                        }\n                    }\n                    else if (value->Type == JSON_String)\n                    {\n                        if (item->Value != value->Value)\n                        {   // Overwrite the changed value and mark for file update\n                            item->Value = value->Value;\n                            Changed = true;\n                        }\n                    }\n                    else {\n                        if (item->dValue != value->dValue)\n                        {   // Overwrite the changed value and mark for file update\n                            item->dValue = value->dValue;\n                            Changed = true;\n                        }\n                    }\n                }\n                else\n                {\n                    return false;\n                }\n\n                found = true;\n                break;\n            }\n            \n            item = vals->GetNextItem(item);\n        }\n\n        if (!found)\n        {   // Add the new value\n            Changed = true;\n\n            if (value->Type == JSON_String)\n                vals->AddStringItem(value->Name, value->Value);\n            else if (value->Type == JSON_Bool)\n                vals->AddBoolItem(value->Name, ((int)value->dValue != 0));\n            else if (value->Type == JSON_Number)\n                vals->AddNumberItem(value->Name, value->dValue);\n            else if (value->Type == JSON_Array)\n                vals->AddItem(value->Name, value->Copy());\n            else\n            {\n                OVR_ASSERT(false);\n                Changed = false;\n            }\n        }\n    }\n\n    return true;\n}\n\n//-----------------------------------------------------------------------------\nProfile* ProfileManager::GetDefaultUserProfile(const ProfileDeviceKey& deviceKey)\n{\n    const char* userName = GetDefaultUser(deviceKey);\n\n    Profile* profile = GetProfile(deviceKey, userName);\n\n    if (!profile)\n    {\n        profile = GetDefaultProfile(deviceKey.HmdType);\n    }\n\n    return profile;\n}\n\n//-----------------------------------------------------------------------------\nProfile* ProfileManager::GetProfile(const ProfileDeviceKey& deviceKey, const char* user)\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    if (ProfileCache == NULL)\n    {   // Load the cache\n        LoadCache(false);\n        if (ProfileCache == NULL)\n            return NULL;\n    }\n    \n    Profile* profile = new Profile(BasePath);\n\n    if (deviceKey.Valid)\n    {\n        if (!profile->LoadDeviceProfile(deviceKey) && (user == NULL))\n        {\n            profile->Release();\n            return NULL;\n        }\n    }\n    \n    if (user)\n    {\n        const char* product_str = deviceKey.ProductName.IsEmpty() ? NULL : deviceKey.ProductName.ToCStr();\n        const char* serial_str = deviceKey.PrintedSerial.IsEmpty() ? NULL : deviceKey.PrintedSerial.ToCStr();\n\n        if (!profile->LoadProfile(ProfileCache.GetPtr(), user, product_str, serial_str))\n        {\n            profile->Release();\n            return NULL;\n        }\n    }\n\n    return profile;\n}\n\n\n//-----------------------------------------------------------------------------\n// ***** Profile\n\nProfile::~Profile()\n{\n    ValMap.Clear();\n    for (unsigned int i=0; i<Values.GetSize(); i++)\n        Values[i]->Release();\n\n    Values.Clear();\n}\n\nbool Profile::Close()\n{\n    // TODO:\n    return true;\n}\n\n//-----------------------------------------------------------------------------\nvoid Profile::CopyItems(JSON* root, String prefix)\n{\n    JSON* item = root->GetFirstItem();\n    while (item)\n    {\n        String item_name;\n        if (prefix.IsEmpty())\n            item_name = item->Name;\n        else\n            item_name = prefix + \".\" + item->Name;\n\n        if (item->Type == JSON_Object)\n        {   // recursively copy the children\n            \n            CopyItems(item, item_name);\n        }\n        else\n        {\n            //Settings.Set(item_name, item->Value);\n            SetValue(item);\n        }\n\n        item = root->GetNextItem(item);\n    }\n}\n\n//-----------------------------------------------------------------------------\nbool Profile::LoadDeviceFile(unsigned int productId, const char* printedSerialNumber)\n{\n    if (printedSerialNumber[0] == 0)\n        return false;\n\n    String path = BasePath + \"/Devices.json\";\n\n    // Load the device profiles\n    Ptr<JSON> root = *JSON::Load(path);\n    if (root == NULL)\n        return false;\n\n    // Quick sanity check of the file type and format before we parse it\n    JSON* version = root->GetFirstItem();\n    if (version && version->Name == \"Oculus Device Profile Version\")\n    {   \n        int major = atoi(version->Value.ToCStr());\n        if (major > MAX_DEVICE_PROFILE_MAJOR_VERSION)\n            return false;   // don't parse the file on unsupported major version number\n    }\n    else\n    {\n        return false;\n    }   \n\n    JSON* device = root->GetNextItem(version);\n    while (device)\n    {   \n        if (device->Name == \"Device\")\n        {   \n            JSON* product_item = device->GetItemByName(\"ProductID\");\n            JSON* serial_item = device->GetItemByName(\"Serial\");\n            if (product_item && serial_item &&\n                (product_item->dValue == productId) && (serial_item->Value == printedSerialNumber))\n            {   \n                // found the entry for this device so recursively copy all the settings to the profile\n                CopyItems(device, \"\");\n                return true;   \n            }\n        }\n\n        device = root->GetNextItem(device);\n    }\n    \n    return false;\n}\n\n#if 0\n//-----------------------------------------------------------------------------\nstatic int BCDByte(unsigned int byte)\n{\n    int digit1 = (byte >> 4) & 0x000f;\n    int digit2 = byte & 0x000f;\n    int decimal = digit1 * 10 + digit2;\n    return decimal;\n}\n#endif\n\n//-----------------------------------------------------------------------------\nbool Profile::LoadDeviceProfile(const ProfileDeviceKey& deviceKey)\n{\n    bool success = false;\n    if (!deviceKey.Valid)\n            return false;\n\n#if 0\n        int dev_major = BCDByte((sinfo.Version >> 8) & 0x00ff);\n        OVR_UNUSED(dev_major);\n        //int dev_minor = BCDByte(sinfo.Version & 0xff);\n      \n        //if (dev_minor > 18)\n        //{   // If the firmware supports hardware stored profiles then grab the device profile\n            // from the sensor\n            // TBD:  Implement this\n        //}\n        //else\n        {\n#endif\n            // Grab the model and serial number from the device and use it to access the device\n            // profile file stored on the local machine\n        success = LoadDeviceFile(deviceKey.ProductId, deviceKey.PrintedSerial);\n    //}\n\n    return success;\n}\n\n//-----------------------------------------------------------------------------\nbool Profile::LoadUser(JSON* root, \n                         const char* user,\n                          const char* model_name,\n                          const char* device_serial)\n{\n    if (user == NULL)\n        return false;\n\n    // For legacy files, convert to old style names\n    //if (model_name && OVR_strcmp(model_name, \"Oculus Rift DK1\") == 0)\n    //    model_name = \"RiftDK1\";\n    \n    bool user_found = false;\n    JSON* data = root->GetItemByName(\"TaggedData\");\n    if (data)\n    {   \n        const char* tag_names[3];\n        const char* tags[3];\n        tag_names[0] = \"User\";\n        tags[0] = user;\n        int num_tags = 1;\n\n        if (model_name)\n        {\n            tag_names[num_tags] = \"Product\";\n            tags[num_tags] = model_name;\n            num_tags++;\n        }\n\n        if (device_serial)\n        {\n            tag_names[num_tags] = \"Serial\";\n            tags[num_tags] = device_serial;\n            num_tags++;\n        }\n\n        // Retrieve all tag permutations\n        for (int combos=1; combos<=num_tags; combos++)\n        {\n            for (int i=0; i<(num_tags - combos + 1); i++)\n            {\n                JSON* vals = FindTaggedData(data, tag_names+i, tags+i, combos);\n                if (vals)\n                {   \n                    if (i==0)   // This tag-combination contains a user match\n                        user_found = true;\n\n                    // Add the values to the Profile.  More specialized multi-tag values\n                    // will take precedence over and overwrite generalized ones \n                    // For example: (\"Me\",\"RiftDK1\").IPD would overwrite (\"Me\").IPD\n                    JSON* item = vals->GetFirstItem();\n                    while (item)\n                    {\n                        //printf(\"Add %s, %s\\n\", item->Name.ToCStr(), item->Value.ToCStr());\n                        //Settings.Set(item->Name, item->Value);\n                        SetValue(item);\n                        item = vals->GetNextItem(item);\n                    }\n                }\n            }\n        }\n    }\n\n    if (user_found)\n        SetValue(OVR_KEY_USER, user);\n\n    return user_found;\n}\n\n\n//-----------------------------------------------------------------------------\nbool Profile::LoadProfile(JSON* root,\n                          const char* user,\n                          const char* device_model,\n                          const char* device_serial)\n{\n    if (!LoadUser(root, user, device_model, device_serial))\n        return false;\n\n    return true;\n}\n\n\n//-----------------------------------------------------------------------------\nchar* Profile::GetValue(const char* key, char* val, int val_length) const\n{\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value))\n    {\n        OVR_strcpy(val, val_length, value->Value.ToCStr());\n        return val;\n    }\n    else\n    {\n        val[0] = 0;\n        return NULL;\n    }\n}\n\n//-----------------------------------------------------------------------------\nconst char* Profile::GetValue(const char* key)\n{\n    // Non-reentrant query.  The returned buffer can only be used until the next call\n    // to GetValue()\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value))\n    {\n        TempVal = value->Value;\n        return TempVal.ToCStr();\n    }\n    else\n    {\n        return NULL;\n    }\n}\n\n//-----------------------------------------------------------------------------\nint Profile::GetNumValues(const char* key) const\n{\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value))\n    {  \n        if (value->Type == JSON_Array)\n            return value->GetArraySize();\n        else\n            return 1;\n    }\n    else\n        return 0;        \n}\n\n//-----------------------------------------------------------------------------\nbool Profile::GetBoolValue(const char* key, bool default_val) const\n{\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value) && value->Type == JSON_Bool)\n        return (value->dValue != 0);\n    else\n        return default_val;\n}\n\n//-----------------------------------------------------------------------------\nint Profile::GetIntValue(const char* key, int default_val) const\n{\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value) && value->Type == JSON_Number)\n        return (int)(value->dValue);\n    else\n        return default_val;\n}\n\n//-----------------------------------------------------------------------------\nfloat Profile::GetFloatValue(const char* key, float default_val) const\n{\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value) && value->Type == JSON_Number)\n        return (float)(value->dValue);\n    else\n        return default_val;\n}\n\n//-----------------------------------------------------------------------------\nint Profile::GetFloatValues(const char* key, float* values, int num_vals) const\n{\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value) && value->Type == JSON_Array)\n    {\n        int val_count = Alg::Min(value->GetArraySize(), num_vals);\n        JSON* item = value->GetFirstItem();\n        int count=0;\n        while (item && count < val_count)\n        {\n            if (item->Type == JSON_Number)\n                values[count] = (float)item->dValue;\n            else\n                break;\n\n            count++;\n            item = value->GetNextItem(item);\n        }\n\n        return count;\n    }\n    else\n    {\n        return 0;\n    }\n}\n\n//-----------------------------------------------------------------------------\ndouble Profile::GetDoubleValue(const char* key, double default_val) const\n{\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value) && value->Type == JSON_Number)\n        return value->dValue;\n    else\n        return default_val;\n}\n\n//-----------------------------------------------------------------------------\nint Profile::GetDoubleValues(const char* key, double* values, int num_vals) const\n{\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value) && value->Type == JSON_Array)\n    {\n        int val_count = Alg::Min(value->GetArraySize(), num_vals);\n        JSON* item = value->GetFirstItem();\n        int count=0;\n        while (item && count < val_count)\n        {\n            if (item->Type == JSON_Number)\n                values[count] = item->dValue;\n            else\n                break;\n\n            count++;\n            item = value->GetNextItem(item);\n        }\n\n        return count;\n    }\n    return 0;\n}\n\n//-----------------------------------------------------------------------------\nvoid Profile::SetValue(JSON* val)\n{\n    if (val == NULL)\n        return;\n\n    if (val->Type == JSON_Number)\n        SetDoubleValue(val->Name, val->dValue);\n    else if (val->Type == JSON_Bool)\n        SetBoolValue(val->Name, (val->dValue != 0));\n    else if (val->Type == JSON_String)\n        SetValue(val->Name, val->Value);\n    else if (val->Type == JSON_Array)\n    {\n        // Create a copy of the array\n        JSON* value = val->Copy();\n        Values.PushBack(value);\n        ValMap.Set(value->Name, value);\n    }\n}\n\n//-----------------------------------------------------------------------------\nvoid Profile::SetValue(const char* key, const char* val)\n{\n    if (key == NULL || val == NULL)\n        return;\n\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value))\n    {\n        value->Value = val;\n    }\n    else\n    {\n        value = JSON::CreateString(val);\n        value->Name = key;\n\n        Values.PushBack(value);\n        ValMap.Set(key, value);\n    }\n}\n\n//-----------------------------------------------------------------------------\nvoid Profile::SetBoolValue(const char* key, bool val)\n{\n    if (key == NULL)\n        return;\n\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value))\n    {\n        value->dValue = val;\n    }\n    else\n    {\n        value = JSON::CreateBool(val);\n        value->Name = key;\n\n        Values.PushBack(value);\n        ValMap.Set(key, value);\n    }\n}\n\n//-----------------------------------------------------------------------------\nvoid Profile::SetIntValue(const char* key, int val)\n{\n    SetDoubleValue(key, val);\n}\n\n//-----------------------------------------------------------------------------\nvoid Profile::SetFloatValue(const char* key, float val)\n{\n    SetDoubleValue(key, val);\n}\n\n//-----------------------------------------------------------------------------\nvoid Profile::SetFloatValues(const char* key, const float* vals, int num_vals)\n{\n    JSON* value = NULL;\n    int val_count = 0;\n    if (ValMap.Get(key, &value))\n    {\n        if (value->Type == JSON_Array)\n        {\n            // truncate the existing array if fewer entries provided\n            int num_existing_vals = value->GetArraySize();\n            for (int i=num_vals; i<num_existing_vals; i++)\n                value->RemoveLast();\n            \n            JSON* item = value->GetFirstItem();\n            while (item && val_count < num_vals)\n            {\n                if (item->Type == JSON_Number)\n                    item->dValue = vals[val_count];\n\n                item = value->GetNextItem(item);\n                val_count++;\n            }\n        }\n        else\n        {\n            return;  // Maybe we should change the data type?\n        }\n    }\n    else\n    {\n        value = JSON::CreateArray();\n        value->Name = key;\n\n        Values.PushBack(value);\n        ValMap.Set(key, value);\n    }\n\n    for (; val_count < num_vals; val_count++)\n        value->AddArrayNumber(vals[val_count]);\n}\n\n//-----------------------------------------------------------------------------\nvoid Profile::SetDoubleValue(const char* key, double val)\n{\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value))\n    {\n        value->dValue = val;\n    }\n    else\n    {\n        value = JSON::CreateNumber(val);\n        value->Name = key;\n\n        Values.PushBack(value);\n        ValMap.Set(key, value);\n    }\n}\n\n//-----------------------------------------------------------------------------\nvoid Profile::SetDoubleValues(const char* key, const double* vals, int num_vals)\n{\n    JSON* value = NULL;\n    int val_count = 0;\n    if (ValMap.Get(key, &value))\n    {\n        if (value->Type == JSON_Array)\n        {\n            // truncate the existing array if fewer entries provided\n            int num_existing_vals = value->GetArraySize();\n            for (int i=num_vals; i<num_existing_vals; i++)\n                value->RemoveLast();\n            \n            JSON* item = value->GetFirstItem();\n            while (item && val_count < num_vals)\n            {\n                if (item->Type == JSON_Number)\n                    item->dValue = vals[val_count];\n\n                item = value->GetNextItem(item);\n                val_count++;\n            }\n        }\n        else\n        {\n            return;  // Maybe we should change the data type?\n        }\n    }\n    else\n    {\n        value = JSON::CreateArray();\n        value->Name = key;\n\n        Values.PushBack(value);\n        ValMap.Set(key, value);\n    }\n\n    for (; val_count < num_vals; val_count++)\n        value->AddArrayNumber(vals[val_count]);\n}\n\n//------------------------------------------------------------------------------\nbool Profile::IsDefaultProfile()\n{\n    return 0 == OVR::String::CompareNoCase(\"Default\", GetValue(OVR_KEY_NAME));\n}\n\n\n}  // namespace OVR\n"
  },
  {
    "path": "externals/ovr/Src/OVR_Profile.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Profile.h\nContent     :   Structs and functions for loading and storing device profile settings\nCreated     :   February 14, 2013\nNotes       :\n   Profiles are used to store per-user settings that can be transferred and used\n   across multiple applications.  For example, player IPD can be configured once \n   and reused for a unified experience across games.  Configuration and saving of profiles\n   can be accomplished in game via the Profile API or by the official Oculus Configuration\n   Utility.\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Profile_h\n#define OVR_Profile_h\n\n#include \"OVR_CAPI_Keys.h\"\n\n#include \"Sensors/OVR_DeviceConstants.h\"\n#include \"Kernel/OVR_String.h\"\n#include \"Kernel/OVR_RefCount.h\"\n#include \"Kernel/OVR_Array.h\"\n#include \"Kernel/OVR_StringHash.h\"\n#include \"Kernel/OVR_System.h\"\n\nnamespace OVR {\n\nclass HMDInfo; // Opaque forward declaration\nclass Profile;\nclass JSON;\n\n\n// Device key for looking up profiles\nstruct ProfileDeviceKey\n{\n    ProfileDeviceKey(const HMDInfo* info);\n\n\t// Initialized properly?\n\tbool Valid;\n\n    // The HMD type\n    HmdTypeEnum HmdType;\n\n\t// This is the 12 character serial number printed on the HMD\n\tString PrintedSerial;\n\n\t// This is the product name string of the USB sensor device\n\t// Note: It has been modified from the original to remove spaces and strip off \"Oculus\"\n\tString ProductName;\n\n\t// This is the product id from the HID info of the USB sensor device\n\tunsigned ProductId;\n\n    static String SanitizeProductName(String productName);\n};\n\n\n// -----------------------------------------------------------------------------\n// ***** ProfileManager\n\n// Profiles are interfaced through a ProfileManager object.  Applications should\n// create a ProfileManager each time they intend to read or write user profile data.\n// The scope of the ProfileManager object defines when disk I/O is performed.  Disk\n// reads are performed on the first profile access and disk writes are performed when\n// the ProfileManager goes out of scope.  All profile interactions between these times\n// are performed in local memory and are fast.  A typical profile interaction might\n// look like this:\n//\n// {\n//     Ptr<ProfileManager> pm      = *ProfileManager::Create();\n//     Ptr<Profile>        profile = pm->LoadProfile(Profile_RiftDK1,\n//                                                   pm->GetDefaultProfileName(Profile_RiftDK1));\n//     if (profile)\n//     {   // Retrieve the current profile settings\n//     }\n// }   // Profile will be destroyed and any disk I/O completed when going out of scope\nclass ProfileManager : public NewOverrideBase, public SystemSingletonBase<ProfileManager>\n{\n    friend class OVR::SystemSingletonBase<ProfileManager>;\n\nprotected:\n    ProfileManager(bool sys_register);\n    virtual ~ProfileManager();\n    virtual void OnSystemDestroy();\n\nprotected:\n    // Synchronize ProfileManager access since it may be accessed from multiple threads,\n    // as it's shared through DeviceManager.\n    Lock                ProfileLock;\n    Ptr<JSON>           ProfileCache;\n    bool                Changed;\n    String              TempBuff;\n    String              BasePath;\n    \npublic:\n    // In the service process it is important to set the base path because this cannot be detected automatically\n    void                SetBasePath(String basePath);\n\n    int                 GetUserCount();\n    const char*         GetUser(unsigned int index);\n    bool                CreateUser(const char* user, const char* name);\n\tbool\t\t\t\tHasUser(const char* user);\n    bool                RemoveUser(const char* user);\n    const char*         GetDefaultUser(const ProfileDeviceKey& deviceKey);\n    bool                SetDefaultUser(const ProfileDeviceKey& deviceKey, const char* user);\n\n    virtual Profile*    CreateProfile();\n    Profile*            GetProfile(const ProfileDeviceKey& deviceKey, const char* user);\n    Profile*            GetDefaultUserProfile(const ProfileDeviceKey& deviceKey);\n    Profile*            GetDefaultProfile(HmdTypeEnum device);\n    Profile*            GetTaggedProfile(const char** key_names, const char** keys, int num_keys);\n    bool                SetTaggedProfile(const char** key_names, const char** keys, int num_keys, Profile* profile);\n    \n    // Force re-reading the settings\n    void                Read();\n\nprotected:\n    // Force writing the settings\n    void                ClearProfileData();\n    void                Save();\n\n    String              GetProfilePath();\n    void                LoadCache(bool create);\n    void                LoadV1Profiles(JSON* v1);\n    const char*         GetDefaultUser(const char* product, const char* serial);\n};\n\n\n//-------------------------------------------------------------------\n// ***** Profile\n\n// The base profile for all users.  This object is not created directly.\n// Instead derived device objects provide add specific device members to \n// the base profile\nclass Profile : public RefCountBase<Profile>\n{\nprotected:\n    OVR::Hash<String, JSON*, String::HashFunctor>   ValMap;\n    OVR::Array<JSON*>   Values;  \n    OVR::String         TempVal;\n    String              BasePath;\n\npublic:\n    ~Profile();\n\n    int                 GetNumValues(const char* key) const;\n    const char*         GetValue(const char* key);\n    char*               GetValue(const char* key, char* val, int val_length) const;\n    bool                GetBoolValue(const char* key, bool default_val) const;\n    int                 GetIntValue(const char* key, int default_val) const;\n    float               GetFloatValue(const char* key, float default_val) const;\n    int                 GetFloatValues(const char* key, float* values, int num_vals) const;\n    double              GetDoubleValue(const char* key, double default_val) const;\n    int                 GetDoubleValues(const char* key, double* values, int num_vals) const;\n\n    void                SetValue(const char* key, const char* val);\n    void                SetBoolValue(const char* key, bool val);\n    void                SetIntValue(const char* key, int val);\n    void                SetFloatValue(const char* key, float val);\n    void                SetFloatValues(const char* key, const float* vals, int num_vals);\n    void                SetDoubleValue(const char* key, double val);\n    void                SetDoubleValues(const char* key, const double* vals, int num_vals);\n\n    bool                IsDefaultProfile();\n    \n    bool Close();\n\nprotected:\n\tProfile(String basePath) :\n\t\tBasePath(basePath)\n\t{\n\t}\n    \n    void                SetValue(JSON* val);\n\n\tstatic bool         LoadProfile(const ProfileDeviceKey& deviceKey,\n                                    const char* user,\n                                    Profile** profile);\n    void                CopyItems(JSON* root, String prefix);\n    \n    bool                LoadDeviceFile(unsigned int device_id, const char* serial);\n\tbool                LoadDeviceProfile(const ProfileDeviceKey& deviceKey);\n\n    bool                LoadProfile(JSON* root,\n                                    const char* user,\n                                    const char* device_model,\n                                    const char* device_serial);\n\n    bool                LoadUser(JSON* root,\n                                 const char* user,\n                                 const char* device_name,\n                                 const char* device_serial);\n\n    friend class ProfileManager;\n    friend class WProfileManager;\n};\n\n// This path should be passed into the ProfileManager\nString GetBaseOVRPath(bool create_dir);\n\n\n} // namespace OVR\n\n#endif // OVR_Profile_h\n"
  },
  {
    "path": "externals/ovr/Src/OVR_SerialFormat.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_System.cpp\nContent     :   General kernel initialization/cleanup, including that\n                of the memory allocator.\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_SerialFormat.h\"\n\n#ifdef SERIAL_FORMAT_UNIT_TEST\n#include \"Kernel/OVR_Log.h\"\n#endif\n\nnamespace OVR {\n\n\n//// Serial Format Detection\n\nSerialFormatType DetectBufferFormat(uint8_t firstByte, int sizeInBytes)\n{\n\tswitch (firstByte)\n\t{\n\tcase SerialFormatType_DK2:\n\t\tif (sizeInBytes == 12)\n\t\t{\n\t\t\treturn SerialFormatType_DK2;\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn SerialFormatType_Invalid;\n}\n\n\n//// DK2 Helpers\n\nstatic bool ValidDK2ProductId(int x)\n{\n\tswitch (x)\n\t{\n\tcase DK2ProductId_DK1:\n\tcase DK2ProductId_DK2:\n\tcase DK2ProductId_Refurb:\n\t\treturn true;\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn false;\n}\n\nstatic bool ValidDK2PartId(int x)\n{\n\tswitch (x)\n\t{\n\tcase DK2PartId_HMD:\n\tcase DK2PartId_PTC:\n\tcase DK2PartId_Carton:\n\t\treturn true;\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn false;\n}\n\n\n//// DK2BinarySerialFormat\n\nbool DK2BinarySerialFormat::FromBuffer(const uint8_t buffer[12], bool allowUnknownTypes)\n{\n\t// Format Type must be 0\n\t\n\tint formatType = buffer[0];\n\n\tif (formatType != SerialFormatType_DK2)\n\t{\n\t\treturn false;\n\t}\n\n\t// Product Id\n\n\tint productId = buffer[1] >> 4;\n\n\tif (!allowUnknownTypes && !ValidDK2ProductId(productId))\n\t{\n\t\treturn false;\n\t}\n\n\tProductId = (DK2ProductId)productId;\n\n\t// Part Id\n\n\tint partId = buffer[1] & 15;\n\n\tif (!allowUnknownTypes && !ValidDK2PartId(partId))\n\t{\n\t\treturn false;\n\t}\n\n\tPartId = (DK2PartId)partId;\n\n\t// Minutes Since Epoch (May 1, 2014)\n\n\tMinutesSinceEpoch = buffer[4] | ((uint32_t)buffer[3] << 8) | ((uint32_t)buffer[2] << 16);\n\n\t// Unit number on that day\n\n\tUnitNumber = buffer[6] | ((uint32_t)buffer[5] << 8);\n\n\t// Hash of MAC address\n\n\tMacHash[0] = buffer[7];\n\tMacHash[1] = buffer[8];\n\tMacHash[2] = buffer[9];\n\tMacHash[3] = buffer[10];\n\tMacHash[4] = buffer[11];\n\n\treturn true;\n}\n\nvoid DK2BinarySerialFormat::ToBuffer(uint8_t buffer[12])\n{\n\t// Serialize to buffer\n\tbuffer[0] = SerialFormatType_DK2;\n\tbuffer[1] = (uint8_t)((ProductId << 4) | (PartId));\n\tbuffer[2] = (uint8_t)(MinutesSinceEpoch >> 16);\n\tbuffer[3] = (uint8_t)(MinutesSinceEpoch >> 8);\n\tbuffer[4] = (uint8_t)MinutesSinceEpoch;\n\tbuffer[5] = (uint8_t)(UnitNumber >> 8);\n\tbuffer[6] = (uint8_t)UnitNumber;\n\n\tbuffer[7] = MacHash[0];\n\tbuffer[8] = MacHash[1];\n\tbuffer[9] = MacHash[2];\n\tbuffer[10] = MacHash[3];\n\tbuffer[11] = MacHash[4];\n}\n\nbool DK2BinarySerialFormat::operator==(const DK2BinarySerialFormat& rhs)\n{\n\tif (ProductId != rhs.ProductId)\n\t\treturn false;\n\tif (PartId != rhs.PartId)\n\t\treturn false;\n\tif (MinutesSinceEpoch != rhs.MinutesSinceEpoch)\n\t\treturn false;\n\tif (UnitNumber != rhs.UnitNumber)\n\t\treturn false;\n\tfor (int ii = 0; ii < 5; ++ii)\n\t{\n\t\tif (MacHash[ii] != rhs.MacHash[ii])\n\t\t\treturn false;\n\t}\n\treturn true;\n}\n\n\n//// DK2PrintedSerialFormat\n\n// Base-32 Crockford decoding rules:\n// 0 o O => 0\n// 1 i | I L l => 1\n// 2, 3, 4, 5, 6, 7, 8, 9 => 2 - 9\n// a, b, c, d, e, f, g, h => 10 - 17\n// j, k => 18, 19\n// m, n => 20, 21\n// p, q, r, s, t => 22, 23, 24, 25, 26\n// v, w, x, y, z => 27, 28, 29, 30, 31\nstatic const char Base32FromChar[256] = {\n\t// Null - Unit Separator\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\t// (sp)!\"#$%&'()*+,-./\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\t// 0123456789:;<=>?\n\t 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1,\n\t// @ - _ (upper case)\n\t-1, 10, 11, 12, 13, 14, 15, 16, 17,  1, 18, 19,  1, 20, 21,  0,\n\t22, 23, 24, 25, 26, -1, 27, 28, 29, 30, 31, -1, -1, -1, -1, -1,\n\t// ` - DEL (lower case)\n\t-1, 10, 11, 12, 13, 14, 15, 16, 17,  1, 18, 19,  1, 20, 21,  0,\n\t22, 23, 24, 25, 26, -1, 27, 28, 29, 30, 31, -1,  1, -1, -1, -1,\n\n\t// Extended ASCII:\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1\n};\n\n// Base-32 Crockford encoding rules:\n// 0-9 => 0-9\n// 10 - 17 => a, b, c, d, e, f, g, h\n// 18, 19 => j, k\n// 20, 21 => m, n\n// 22, 23, 24, 25, 26 => p, q, r, s, t\n// 27, 28, 29, 30, 31 => v, w, x, y, z\nstatic const char* CharFromBase32 = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\n\nbool DK2PrintedSerialFormat::FromBase32(const char* str, bool allowUnknownTypes)\n{\n\t// Note: Truncated strings get caught by returning negative values from the table like other invalid characters\n\n\t// Product Id\n\n\tint productId = Base32FromChar[(unsigned char)str[0]];\n\tif (productId < 0 || (!allowUnknownTypes && !ValidDK2ProductId(productId)))\n\t{\n\t\treturn false;\n\t}\n\n\tProductId = (DK2ProductId)productId;\n\n\t// Label Type\n\n\tint labelType = Base32FromChar[(unsigned char)str[1]];\n\tif (labelType < 0 || (!allowUnknownTypes && !ValidDK2PartId(labelType)))\n\t{\n\t\treturn false;\n\t}\n\n\tLabelType = (DK2LabelType)labelType;\n\n\tuint8_t dataBytes[7];\n\tfor (int ii = 0; ii < 7; ++ii)\n\t{\n\t\tint c = Base32FromChar[(unsigned char)str[2 + ii]];\n\t\tif (c < 0) return false;\n\t\tdataBytes[ii] = (uint8_t)c;\n\t}\n\n\t// Minutes Since Epoch\n\n\tMinutesSinceEpoch = dataBytes[3] | ((uint32_t)dataBytes[2] << 5) | ((uint32_t)dataBytes[1] << 10) | ((uint32_t)dataBytes[0] << 15);\n\n\t// Unit Number\n\n\tUnitNumber = dataBytes[6] | ((uint32_t)dataBytes[5] << 5) | ((uint32_t)dataBytes[4] << 10);\n\n\t// MAC Hash\n\n\tfor (int ii = 0; ii < 3; ++ii)\n\t{\n\t\tint c = Base32FromChar[(unsigned char)str[9 + ii]];\n\t\tif (c < 0)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tMacHashLow[ii] = (uint8_t)c;\n\t}\n\n\t// String must be exactly 12 characters\n\tif (str[12] != '\\0')\n\t{\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nString DK2PrintedSerialFormat::ToBase32()\n{\n\tString s;\n\n\ts += CharFromBase32[ProductId];\n\ts += CharFromBase32[LabelType];\n\ts += CharFromBase32[(MinutesSinceEpoch >> 15) & 31];\n\ts += CharFromBase32[(MinutesSinceEpoch >> 10) & 31];\n\ts += CharFromBase32[(MinutesSinceEpoch >> 5) & 31];\n\ts += CharFromBase32[MinutesSinceEpoch & 31];\n\ts += CharFromBase32[(UnitNumber >> 10) & 31];\n\ts += CharFromBase32[(UnitNumber >> 5) & 31];\n\ts += CharFromBase32[UnitNumber & 31];\n\ts += CharFromBase32[MacHashLow[0] & 31];\n\ts += CharFromBase32[MacHashLow[1] & 31];\n\ts += CharFromBase32[MacHashLow[2] & 31];\n\n\treturn s;\n}\n\nbool DK2PrintedSerialFormat::operator==(const DK2PrintedSerialFormat& rhs)\n{\n\tif (ProductId != rhs.ProductId)\n\t\treturn false;\n\tif (LabelType != rhs.LabelType)\n\t\treturn false;\n\tif (MinutesSinceEpoch != rhs.MinutesSinceEpoch)\n\t\treturn false;\n\tif (UnitNumber != rhs.UnitNumber)\n\t\treturn false;\n\tfor (int ii = 0; ii < 3; ++ii)\n\t{\n\t\tif (MacHashLow[ii] != rhs.MacHashLow[ii])\n\t\t\treturn false;\n\t}\n\treturn true;\n}\n\nbool DK2PrintedSerialFormat::operator==(const DK2BinarySerialFormat& rhs)\n{\n\tif (ProductId != rhs.ProductId)\n\t\treturn false;\n\tif (LabelType != rhs.PartId)\n\t\treturn false;\n\tif (MinutesSinceEpoch != rhs.MinutesSinceEpoch)\n\t\treturn false;\n\tif (UnitNumber != rhs.UnitNumber)\n\t\treturn false;\n\tfor (int ii = 0; ii < 3; ++ii)\n\t{\n\t\tif (MacHashLow[ii] != (rhs.MacHash[ii] & 31))\n\t\t\treturn false;\n\t}\n\treturn true;\n}\n\nvoid DK2PrintedSerialFormat::FromBinary(const DK2BinarySerialFormat& bin)\n{\n\tProductId = bin.ProductId;\n\tLabelType = bin.PartId;\n\tMinutesSinceEpoch = bin.MinutesSinceEpoch;\n\tUnitNumber = bin.UnitNumber;\n\tMacHashLow[0] = bin.MacHash[0] & 31;\n\tMacHashLow[1] = bin.MacHash[1] & 31;\n\tMacHashLow[2] = bin.MacHash[2] & 31;\n}\n\n\n//// Unit Tests\n\n#ifdef SERIAL_FORMAT_UNIT_TEST\n\nint DecodeBase32(char ch)\n{\n    if (ch >= '2' && ch <= '9')\n        return 2 + ch - '2';\n    if (ch >= 'a' && ch <= 'h')\n        return 10 + ch - 'a';\n    if (ch >= 'A' && ch <= 'H')\n        return 10 + ch - 'A';\n    if (ch >= 'j' && ch <= 'k')\n        return 18 + ch - 'j';\n    if (ch >= 'J' && ch <= 'K')\n        return 18 + ch - 'J';\n    if (ch >= 'm' && ch <= 'n')\n        return 20 + ch - 'm';\n    if (ch >= 'M' && ch <= 'N')\n        return 20 + ch - 'M';\n    if (ch >= 'p' && ch <= 't')\n        return 22 + ch - 'p';\n    if (ch >= 'P' && ch <= 'T')\n        return 22 + ch - 'P';\n    if (ch >= 'v' && ch <= 'z')\n        return 27 + ch - 'v';\n    if (ch >= 'V' && ch <= 'Z')\n        return 27 + ch - 'V';\n\n    switch (ch)\n    {\n    case '0':\n    case 'o':\n    case 'O':\n        return 0;\n    case '1':\n    case 'i':\n    case '|':\n    case 'I':\n    case 'L':\n    case 'l':\n        return 1;\n    }\n\n    return -1;\n}\n\nvoid TestSerialFormatStuff()\n{\n    for (int ii = 0; ii < 256; ++ii)\n    {\n        OVR_ASSERT(Base32FromChar[ii] == (char)DecodeBase32((char)ii));\n    }\n\n    DK2BinarySerialFormat sa;\n    sa.ProductId = DK2ProductId_DK2;\n    sa.PartId = DK2PartId_HMD;\n    sa.MinutesSinceEpoch = 65000;\n    sa.UnitNumber = 2;\n    sa.MacHash[0] = 0xa1;\n    sa.MacHash[1] = 0xb2;\n    sa.MacHash[2] = 0xc3;\n    sa.MacHash[3] = 0xd4;\n    sa.MacHash[4] = 0xe5;\n\n    uint8_t buffer[12];\n    sa.ToBuffer(buffer);\n\n    DK2BinarySerialFormat sb;\n    bool success = sb.FromBuffer(buffer);\n    OVR_ASSERT(success);\n    OVR_UNUSED(success);\n\n    OVR_ASSERT(sa == sb);\n\n    DK2PrintedSerialFormat psn;\n    psn.FromBinary(sb);\n\n    OVR_ASSERT(psn == sa);\n\n    String s = psn.ToBase32();\n\n    DK2PrintedSerialFormat psn2;\n    psn2.FromBase32(s.ToCStr());\n\n    OVR_ASSERT(psn == psn2);\n}\n\n#endif // SERIAL_FORMAT_UNIT_TEST\n\n\n} // OVR\n"
  },
  {
    "path": "externals/ovr/Src/OVR_SerialFormat.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_SerialFormat.h\nContent     :   Serial Number format tools\nCreated     :   June 12, 2014\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_SerialFormat_h\n#define OVR_SerialFormat_h\n\n#include \"Kernel/OVR_Types.h\"\n#include \"Kernel/OVR_String.h\"\n\nnamespace OVR {\n\n\n//-----------------------------------------------------------------------------\n// SerialFormatType enumeration\n\nenum SerialFormatType\n{\n\tSerialFormatType_Invalid = -1, // Invalid format\n\tSerialFormatType_DK2 = 0,\t   // Format used for DK2\n};\n\n// Returns the expected serial format based on the first byte of the buffer\nSerialFormatType DetectBufferFormat(uint8_t firstByte, int sizeInBytes);\n\n\n//-----------------------------------------------------------------------------\n// DK2 Serial Format\n\nenum DK2ProductId\n{\n\tDK2ProductId_DK1    = 1, // DK1\n\tDK2ProductId_DK2    = 2, // Product Id used for initial DK2 launch\n\tDK2ProductId_Refurb = 3, // Refurbished DK2\n};\n\nenum DK2PartId\n{\n\tDK2PartId_HMD    = 0, // HMD\n\tDK2PartId_PTC    = 1, // PTC(camera)\n\tDK2PartId_Carton = 2, // Carton: An HMD + PTC combo (should not be stamped on a component) AKA Overpack\n};\n\ntypedef DK2PartId DK2LabelType; // Printed Serial Number version\n\n\n// DK2 tool for reading/writing the binary serial format\nclass DK2BinarySerialFormat\n{\npublic:\n\tstatic const SerialFormatType FormatType = SerialFormatType_DK2; // first byte\n\n\tDK2ProductId ProductId;         // [4 bits] 2 = DK2\n\tDK2PartId    PartId;            // [4 bits] 0 means HMD, 1 means PTC(camera)\n\tint          MinutesSinceEpoch; // [3 bytes] Number of minutes that have elapsed since the epoch: May 1st, 2014\n\t// [0] = high byte, [1] = middle byte, [2] = low byte\n\tint          UnitNumber;        // [2 bytes] Value that increments each time a new serial number is created.  Resets to zero each day\n\t// [0] = high byte, [1] = low byte\n\tuint8_t      MacHash[5];        // [5 bytes] 5 most significant bytes of MD5 hash from first ethernet adapter mac address\n\n\tbool operator==(const DK2BinarySerialFormat& rhs);\n\npublic:\n\t// Returns false if the input is invalid in some way\n\tbool FromBuffer(const uint8_t buffer[12], bool allowUnknownTypes = false);\n\n\t// Fills the provided buffer with 12 bytes\n\tvoid ToBuffer(uint8_t buffer[12]);\n};\n\n\n// DK2 tool for reading/writing the printed serial format\nclass DK2PrintedSerialFormat\n{\npublic:\n\tDK2ProductId ProductId;         // [1 char] 2 = DK2, 3 = Reconditioned bundle\n\tDK2LabelType LabelType;         // [1 char] 0 means HMD, 1 means PTC(camera), 2 means Overpack(bundle)\n\tint          MinutesSinceEpoch; // [4 char] Number of minutes that have elapsed since the epoch: May 1st, 2014\n\tint          UnitNumber;        // [3 char] Value that increments each time a new serial number is created.  Resets to zero each day\n\tuint8_t      MacHashLow[3];     // [3 char] 3 least significant bytes of mac hash\n\n\tbool operator==(const DK2PrintedSerialFormat& rhs);\n\tbool operator==(const DK2BinarySerialFormat& rhs);\n\npublic:\n\t// Convert from binary to printed\n\tvoid FromBinary(const DK2BinarySerialFormat& bin);\n\n\t// Returns false if the input is invalid in some way\n\t// Convert from a 12 character printed serial number\n\tbool FromBase32(const char* str, bool allowUnknownTypes = false);\n\n\t// Returns a long human-readable base32 string (20 characters), NOT a printed serial number\n\tString ToBase32();\n};\n\n\n//#define SERIAL_FORMAT_UNIT_TEST\n#ifdef SERIAL_FORMAT_UNIT_TEST\nvoid TestSerialFormatStuff();\n#endif\n\n\n} // OVR\n\n#endif // OVR_SerialFormat_h\n"
  },
  {
    "path": "externals/ovr/Src/OVR_Stereo.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Stereo.cpp\nContent     :   Stereo rendering functions\nCreated     :   November 30, 2013\nAuthors     :   Tom Fosyth\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include \"OVR_Stereo.h\"\n#include \"OVR_Profile.h\"\n#include \"Kernel/OVR_Log.h\"\n#include \"Kernel/OVR_Alg.h\"\n\n//To allow custom distortion to be introduced to CatMulSpline.\nfloat (*CustomDistortion)(float) = NULL;\nfloat (*CustomDistortionInv)(float) = NULL;\n\n\nnamespace OVR {\n\n\nusing namespace Alg;\n\n//-----------------------------------------------------------------------------------\n\n// Inputs are 4 points (pFitX[0],pFitY[0]) through (pFitX[3],pFitY[3])\n// Result is four coefficients in pResults[0] through pResults[3] such that\n//      y = pResult[0] + x * ( pResult[1] + x * ( pResult[2] + x * ( pResult[3] ) ) );\n// passes through all four input points.\n// Return is true if it succeeded, false if it failed (because two control points\n// have the same pFitX value).\nbool FitCubicPolynomial ( float *pResult, const float *pFitX, const float *pFitY )\n{\n    float d0 = ( ( pFitX[0]-pFitX[1] ) * ( pFitX[0]-pFitX[2] ) * ( pFitX[0]-pFitX[3] ) );\n    float d1 = ( ( pFitX[1]-pFitX[2] ) * ( pFitX[1]-pFitX[3] ) * ( pFitX[1]-pFitX[0] ) );\n    float d2 = ( ( pFitX[2]-pFitX[3] ) * ( pFitX[2]-pFitX[0] ) * ( pFitX[2]-pFitX[1] ) );\n    float d3 = ( ( pFitX[3]-pFitX[0] ) * ( pFitX[3]-pFitX[1] ) * ( pFitX[3]-pFitX[2] ) );\n\n    if ( ( d0 == 0.0f ) || ( d1 == 0.0f ) || ( d2 == 0.0f ) || ( d3 == 0.0f ) )\n    {\n        return false;\n    }\n\n    float f0 = pFitY[0] / d0;\n    float f1 = pFitY[1] / d1;\n    float f2 = pFitY[2] / d2;\n    float f3 = pFitY[3] / d3;\n\n    pResult[0] = -( f0*pFitX[1]*pFitX[2]*pFitX[3]\n                  + f1*pFitX[0]*pFitX[2]*pFitX[3]\n                  + f2*pFitX[0]*pFitX[1]*pFitX[3]\n                  + f3*pFitX[0]*pFitX[1]*pFitX[2] );\n    pResult[1] = f0*(pFitX[1]*pFitX[2] + pFitX[2]*pFitX[3] + pFitX[3]*pFitX[1])\n               + f1*(pFitX[0]*pFitX[2] + pFitX[2]*pFitX[3] + pFitX[3]*pFitX[0])\n               + f2*(pFitX[0]*pFitX[1] + pFitX[1]*pFitX[3] + pFitX[3]*pFitX[0])\n               + f3*(pFitX[0]*pFitX[1] + pFitX[1]*pFitX[2] + pFitX[2]*pFitX[0]);\n    pResult[2] = -( f0*(pFitX[1]+pFitX[2]+pFitX[3])\n                  + f1*(pFitX[0]+pFitX[2]+pFitX[3])\n                  + f2*(pFitX[0]+pFitX[1]+pFitX[3])\n                  + f3*(pFitX[0]+pFitX[1]+pFitX[2]) );\n    pResult[3] = f0 + f1 + f2 + f3;\n\n    return true;\n}\n\n#define TPH_SPLINE_STATISTICS 0\n#if TPH_SPLINE_STATISTICS\nstatic float max_scaledVal = 0;\nstatic float average_total_out_of_range = 0;\nstatic float average_out_of_range;\nstatic int num_total = 0;\nstatic int num_out_of_range = 0;\nstatic int num_out_of_range_over_1 = 0;\nstatic int num_out_of_range_over_2 = 0;\nstatic int num_out_of_range_over_3 = 0;\nstatic float percent_out_of_range;\n#endif\n\nfloat EvalCatmullRom10Spline ( float const *K, float scaledVal )\n{\n    int const NumSegments = LensConfig::NumCoefficients;\n\n\t#if TPH_SPLINE_STATISTICS\n\t//Value should be in range of 0 to (NumSegments-1) (typically 10) if spline is valid. Right?\n\tif (scaledVal > (NumSegments-1))\n\t{\n\t\tnum_out_of_range++;\n\t\taverage_total_out_of_range+=scaledVal;\n\t\taverage_out_of_range = average_total_out_of_range / ((float) num_out_of_range); \n\t\tpercent_out_of_range = 100.0f*(num_out_of_range)/num_total;\n\t}\n\tif (scaledVal > (NumSegments-1+1)) num_out_of_range_over_1++;\n\tif (scaledVal > (NumSegments-1+2)) num_out_of_range_over_2++;\n\tif (scaledVal > (NumSegments-1+3)) num_out_of_range_over_3++;\n\tnum_total++;\n\tif (scaledVal > max_scaledVal)\n\t{\n\t\tmax_scaledVal = scaledVal;\n\t\tmax_scaledVal = scaledVal;\n\t}\n\t#endif\n\n    float scaledValFloor = floorf ( scaledVal );\n    scaledValFloor = Alg::Max ( 0.0f, Alg::Min ( (float)(NumSegments-1), scaledValFloor ) );\n    float t = scaledVal - scaledValFloor;\n    int k = (int)scaledValFloor;\n\n    float p0, p1;\n    float m0, m1;\n    switch ( k )\n    {\n    case 0:\n        // Curve starts at 1.0 with gradient K[1]-K[0]\n        p0 = 1.0f;\n        m0 =        ( K[1] - K[0] );    // general case would have been (K[1]-K[-1])/2\n        p1 = K[1];\n        m1 = 0.5f * ( K[2] - K[0] );\n        break;\n    default:\n        // General case\n        p0 = K[k  ];\n        m0 = 0.5f * ( K[k+1] - K[k-1] );\n        p1 = K[k+1];\n        m1 = 0.5f * ( K[k+2] - K[k  ] );\n        break;\n    case NumSegments-2:\n        // Last tangent is just the slope of the last two points.\n        p0 = K[NumSegments-2];\n        m0 = 0.5f * ( K[NumSegments-1] - K[NumSegments-2] );\n        p1 = K[NumSegments-1];\n        m1 = K[NumSegments-1] - K[NumSegments-2];\n        break;\n    case NumSegments-1:\n        // Beyond the last segment it's just a straight line\n        p0 = K[NumSegments-1];\n        m0 = K[NumSegments-1] - K[NumSegments-2];\n        p1 = p0 + m0;\n        m1 = m0;\n        break;\n    }\n\n    float omt = 1.0f - t;\n    float res  = ( p0 * ( 1.0f + 2.0f *   t ) + m0 *   t ) * omt * omt\n               + ( p1 * ( 1.0f + 2.0f * omt ) - m1 * omt ) *   t *   t;\n\n    return res;\n}\n\n\n\n\n// Converts a Profile eyecup string into an eyecup enumeration\nvoid SetEyeCup(HmdRenderInfo* renderInfo, const char* cup)\n{\n    if (OVR_strcmp(cup, \"A\") == 0)\n        renderInfo->EyeCups = EyeCup_DK1A;\n    else if (OVR_strcmp(cup, \"B\") == 0)\n        renderInfo->EyeCups = EyeCup_DK1B;\n    else if (OVR_strcmp(cup, \"C\") == 0)\n        renderInfo->EyeCups = EyeCup_DK1C;\n    else if (OVR_strcmp(cup, \"Orange A\") == 0)\n        renderInfo->EyeCups =  EyeCup_OrangeA;\n    else if (OVR_strcmp(cup, \"Red A\") == 0)\n        renderInfo->EyeCups = EyeCup_RedA;\n    else if (OVR_strcmp(cup, \"Pink A\") == 0)\n        renderInfo->EyeCups = EyeCup_PinkA;\n    else if (OVR_strcmp(cup, \"Blue A\") == 0)\n        renderInfo->EyeCups = EyeCup_BlueA;\n    else\n        renderInfo->EyeCups = EyeCup_DK1A;\n}\n\n\n\n//-----------------------------------------------------------------------------------\n\n\n// The result is a scaling applied to the distance.\nfloat LensConfig::DistortionFnScaleRadiusSquared (float rsq) const\n{\n    float scale = 1.0f;\n    switch ( Eqn )\n    {\n    case Distortion_Poly4:\n        // This version is deprecated! Prefer one of the other two.\n        scale = ( K[0] + rsq * ( K[1] + rsq * ( K[2] + rsq * K[3] ) ) );\n        break;\n    case Distortion_RecipPoly4:\n        scale = 1.0f / ( K[0] + rsq * ( K[1] + rsq * ( K[2] + rsq * K[3] ) ) );\n        break;\n    case Distortion_CatmullRom10:{\n        // A Catmull-Rom spline through the values 1.0, K[1], K[2] ... K[10]\n        // evenly spaced in R^2 from 0.0 to MaxR^2\n        // K[0] controls the slope at radius=0.0, rather than the actual value.\n        const int NumSegments = LensConfig::NumCoefficients;\n        OVR_ASSERT ( NumSegments <= NumCoefficients );\n        float scaledRsq = (float)(NumSegments-1) * rsq / ( MaxR * MaxR );\n        scale = EvalCatmullRom10Spline ( K, scaledRsq );\n\n\n\t\t//Intercept, and overrule if needed\n\t\tif (CustomDistortion)\n\t\t{\n\t\t\tscale = CustomDistortion(rsq);\n\t\t}\n\n        }break;\n    default:\n        OVR_ASSERT ( false );\n        break;\n    }\n    return scale;\n}\n\n// x,y,z components map to r,g,b\nVector3f LensConfig::DistortionFnScaleRadiusSquaredChroma (float rsq) const\n{\n    float scale = DistortionFnScaleRadiusSquared ( rsq );\n    Vector3f scaleRGB;\n    scaleRGB.x = scale * ( 1.0f + ChromaticAberration[0] + rsq * ChromaticAberration[1] );     // Red\n    scaleRGB.y = scale;                                                                        // Green\n    scaleRGB.z = scale * ( 1.0f + ChromaticAberration[2] + rsq * ChromaticAberration[3] );     // Blue\n    return scaleRGB;\n}\n\n// DistortionFnInverse computes the inverse of the distortion function on an argument.\nfloat LensConfig::DistortionFnInverse(float r) const\n{    \n    OVR_ASSERT((r <= 20.0f));\n\n    float s, d;\n    float delta = r * 0.25f;\n\n    // Better to start guessing too low & take longer to converge than too high\n    // and hit singularities. Empirically, r * 0.5f is too high in some cases.\n    s = r * 0.25f;\n    d = fabs(r - DistortionFn(s));\n\n    for (int i = 0; i < 20; i++)\n    {\n        float sUp   = s + delta;\n        float sDown = s - delta;\n        float dUp   = fabs(r - DistortionFn(sUp));\n        float dDown = fabs(r - DistortionFn(sDown));\n\n        if (dUp < d)\n        {\n            s = sUp;\n            d = dUp;\n        }\n        else if (dDown < d)\n        {\n            s = sDown;\n            d = dDown;\n        }\n        else\n        {\n            delta *= 0.5f;\n        }\n    }\n\n    return s;\n}\n\n\n\nfloat LensConfig::DistortionFnInverseApprox(float r) const\n{\n    float rsq = r * r;\n    float scale = 1.0f;\n    switch ( Eqn )\n    {\n    case Distortion_Poly4:\n        // Deprecated\n        OVR_ASSERT ( false );\n        break;\n    case Distortion_RecipPoly4:\n        scale = 1.0f / ( InvK[0] + rsq * ( InvK[1] + rsq * ( InvK[2] + rsq * InvK[3] ) ) );\n        break;\n    case Distortion_CatmullRom10:{\n        // A Catmull-Rom spline through the values 1.0, K[1], K[2] ... K[9]\n        // evenly spaced in R^2 from 0.0 to MaxR^2\n        // K[0] controls the slope at radius=0.0, rather than the actual value.\n        const int NumSegments = LensConfig::NumCoefficients;\n        OVR_ASSERT ( NumSegments <= NumCoefficients );\n        float scaledRsq = (float)(NumSegments-1) * rsq / ( MaxInvR * MaxInvR );\n        scale = EvalCatmullRom10Spline ( InvK, scaledRsq );\n\n\t\t//Intercept, and overrule if needed\n\t\tif (CustomDistortionInv)\n\t\t{\n\t\t\tscale = CustomDistortionInv(rsq);\n\t\t}\n\n        }break;\n    default:\n        OVR_ASSERT ( false );\n        break;\n    }\n    return r * scale;\n}\n\nvoid LensConfig::SetUpInverseApprox()\n{\n    float maxR = MaxInvR;\n\n    switch ( Eqn )\n    {\n    case Distortion_Poly4:\n        // Deprecated\n        OVR_ASSERT ( false );\n        break;\n    case Distortion_RecipPoly4:{\n\n        float sampleR[4];\n        float sampleRSq[4];\n        float sampleInv[4];\n        float sampleFit[4];\n\n        // Found heuristically...\n        sampleR[0] = 0.0f;\n        sampleR[1] = maxR * 0.4f;\n        sampleR[2] = maxR * 0.8f;\n        sampleR[3] = maxR * 1.5f;\n        for ( int i = 0; i < 4; i++ )\n        {\n            sampleRSq[i] = sampleR[i] * sampleR[i];\n            sampleInv[i] = DistortionFnInverse ( sampleR[i] );\n            sampleFit[i] = sampleR[i] / sampleInv[i];\n        }\n        sampleFit[0] = 1.0f;\n        FitCubicPolynomial ( InvK, sampleRSq, sampleFit );\n\n    #if 0\n        // Should be a nearly exact match on the chosen points.\n        OVR_ASSERT ( fabs ( DistortionFnInverse ( sampleR[0] ) - DistortionFnInverseApprox ( sampleR[0] ) ) / maxR < 0.0001f );\n        OVR_ASSERT ( fabs ( DistortionFnInverse ( sampleR[1] ) - DistortionFnInverseApprox ( sampleR[1] ) ) / maxR < 0.0001f );\n        OVR_ASSERT ( fabs ( DistortionFnInverse ( sampleR[2] ) - DistortionFnInverseApprox ( sampleR[2] ) ) / maxR < 0.0001f );\n        OVR_ASSERT ( fabs ( DistortionFnInverse ( sampleR[3] ) - DistortionFnInverseApprox ( sampleR[3] ) ) / maxR < 0.0001f );\n        // Should be a decent match on the rest of the range.\n        const int maxCheck = 20;\n        for ( int i = 0; i < maxCheck; i++ )\n        {\n            float checkR = (float)i * maxR / (float)maxCheck;\n            float realInv = DistortionFnInverse       ( checkR );\n            float testInv = DistortionFnInverseApprox ( checkR );\n            float error = fabsf ( realInv - testInv ) / maxR;\n            OVR_ASSERT ( error < 0.1f );\n        }\n    #endif\n\n        }break;\n    case Distortion_CatmullRom10:{\n\n        const int NumSegments = LensConfig::NumCoefficients;\n        OVR_ASSERT ( NumSegments <= NumCoefficients );\n        for ( int i = 1; i < NumSegments; i++ )\n        {\n            float scaledRsq = (float)i;\n            float rsq = scaledRsq * MaxInvR * MaxInvR / (float)( NumSegments - 1);\n            float r = sqrtf ( rsq );\n            float inv = DistortionFnInverse ( r );\n            InvK[i] = inv / r;\n            InvK[0] = 1.0f;     // TODO: fix this.\n        }\n\n#if 0\n        const int maxCheck = 20;\n        for ( int i = 0; i <= maxCheck; i++ )\n        {\n            float checkR = (float)i * MaxInvR / (float)maxCheck;\n            float realInv = DistortionFnInverse       ( checkR );\n            float testInv = DistortionFnInverseApprox ( checkR );\n            float error = fabsf ( realInv - testInv ) / MaxR;\n            OVR_ASSERT ( error < 0.01f );\n        }\n#endif\n\n        }break;\n\n    default:\n        break;\n    }\n}\n\n\nvoid LensConfig::SetToIdentity()\n{\n    for ( int i = 0; i < NumCoefficients; i++ )\n    {\n        K[i] = 0.0f;\n        InvK[i] = 0.0f;\n    }\n    Eqn = Distortion_RecipPoly4;\n    K[0] = 1.0f;\n    InvK[0] = 1.0f;\n    MaxR = 1.0f;\n    MaxInvR = 1.0f;\n    ChromaticAberration[0] = 0.0f;\n    ChromaticAberration[1] = 0.0f;\n    ChromaticAberration[2] = 0.0f;\n    ChromaticAberration[3] = 0.0f;\n    MetersPerTanAngleAtCenter = 0.05f;\n}\n\n\nenum LensConfigStoredVersion\n{\n    LCSV_CatmullRom10Version1 = 1\n};\n\n// DO NOT CHANGE THESE ONCE THEY HAVE BEEN BAKED INTO FIRMWARE.\n// If something needs to change, add a new one!\nstruct LensConfigStored_CatmullRom10Version1\n{\n    // All these items must be fixed-length integers - no \"float\", no \"int\", etc.\n    uint16_t    VersionNumber;      // Must be LCSV_CatmullRom10Version1\n\n    uint16_t    K[11];\n    uint16_t    MaxR;\n    uint16_t    MetersPerTanAngleAtCenter;\n    uint16_t    ChromaticAberration[4];\n    // InvK and MaxInvR are calculated on load.\n};\n\nuint16_t EncodeFixedPointUInt16 ( float val, uint16_t zeroVal, int fractionalBits )\n{\n    OVR_ASSERT ( ( fractionalBits >= 0 ) && ( fractionalBits < 31 ) );\n    float valWhole = val * (float)( 1 << fractionalBits );\n    valWhole += (float)zeroVal + 0.5f;\n    valWhole = floorf ( valWhole );\n    OVR_ASSERT ( ( valWhole >= 0.0f ) && ( valWhole < (float)( 1 << 16 ) ) );\n    return (uint16_t)valWhole;\n}\n\nfloat DecodeFixedPointUInt16 ( uint16_t val, uint16_t zeroVal, int fractionalBits )\n{\n    OVR_ASSERT ( ( fractionalBits >= 0 ) && ( fractionalBits < 31 ) );\n    float valFloat = (float)val;\n    valFloat -= (float)zeroVal;\n    valFloat *= 1.0f / (float)( 1 << fractionalBits );\n    return valFloat;\n}\n\n\n// Returns true on success.\nbool LoadLensConfig ( LensConfig *presult, uint8_t const *pbuffer, int bufferSizeInBytes )\n{\n    if ( bufferSizeInBytes < 2 )\n    {\n        // Can't even tell the version number!\n        return false;\n    }\n    uint16_t version = DecodeUInt16 ( pbuffer + 0 );\n    switch ( version )\n    {\n    case LCSV_CatmullRom10Version1:\n        {\n            if ( bufferSizeInBytes < (int)sizeof(LensConfigStored_CatmullRom10Version1) )\n            {\n                return false;\n            }\n            LensConfigStored_CatmullRom10Version1 lcs;\n            lcs.VersionNumber               = DecodeUInt16 ( pbuffer + 0 );\n            for ( int i = 0; i < 11; i++ )\n            {\n                lcs.K[i]                    = DecodeUInt16 ( pbuffer + 2 + 2*i );\n            }\n            lcs.MaxR                        = DecodeUInt16 ( pbuffer + 24 );\n            lcs.MetersPerTanAngleAtCenter   = DecodeUInt16 ( pbuffer + 26 );\n            for ( int i = 0; i < 4; i++ )\n            {\n                lcs.ChromaticAberration[i]  = DecodeUInt16 ( pbuffer + 28 + 2*i );\n            }\n            OVR_COMPILER_ASSERT ( sizeof(lcs) ==                       36 );\n\n            // Convert to the real thing.\n            LensConfig result;\n            result.Eqn = Distortion_CatmullRom10;\n            for ( int i = 0; i < 11; i++ )\n            {\n                // K[] are mostly 1.something. They may get significantly bigger, but they never hit 0.0.\n                result.K[i] = DecodeFixedPointUInt16 ( lcs.K[i], 0, 14 );\n            }\n            // MaxR is tan(angle), so always >0, typically just over 1.0 (45 degrees half-fov),\n            // but may get arbitrarily high. tan(76)=4 is a very reasonable limit!\n            result.MaxR = DecodeFixedPointUInt16 ( lcs.MaxR, 0, 14 );\n            // MetersPerTanAngleAtCenter is also known as focal length!\n            // Typically around 0.04 for our current screens, minimum of 0, sensible maximum of 0.125 (i.e. 3 \"extra\" bits of fraction)\n            result.MetersPerTanAngleAtCenter = DecodeFixedPointUInt16 ( lcs.MetersPerTanAngleAtCenter, 0, 16+3 );\n            for ( int i = 0; i < 4; i++ )\n            {\n                // ChromaticAberration[] are mostly 0.0something, centered on 0.0. Largest seen is 0.04, so set max to 0.125 (i.e. 3 \"extra\" bits of fraction)\n                result.ChromaticAberration[i] = DecodeFixedPointUInt16 ( lcs.ChromaticAberration[i], 0x8000, 16+3 );\n            }\n            result.MaxInvR = result.DistortionFn ( result.MaxR );\n            result.SetUpInverseApprox();\n\n            OVR_ASSERT ( version == lcs.VersionNumber );\n\n            *presult = result;\n        }\n        break;\n    default:\n        // Unknown format.\n        return false;\n        break;\n    }\n    return true;\n}\n\n// Returns number of bytes needed.\nint SaveLensConfigSizeInBytes ( LensConfig const &config )\n{\n    OVR_UNUSED ( config );\n    return sizeof ( LensConfigStored_CatmullRom10Version1 );\n}\n\n// Returns true on success.\nbool SaveLensConfig ( uint8_t *pbuffer, int bufferSizeInBytes, LensConfig const &config )\n{\n    if ( bufferSizeInBytes < (int)sizeof ( LensConfigStored_CatmullRom10Version1 ) )\n    {\n        return false;\n    }\n\n    // Construct the values.\n    LensConfigStored_CatmullRom10Version1 lcs;\n    lcs.VersionNumber = LCSV_CatmullRom10Version1;\n    for ( int i = 0; i < 11; i++ )\n    {\n        // K[] are mostly 1.something. They may get significantly bigger, but they never hit 0.0.\n        lcs.K[i] = EncodeFixedPointUInt16 ( config.K[i], 0, 14 );\n    }\n    // MaxR is tan(angle), so always >0, typically just over 1.0 (45 degrees half-fov),\n    // but may get arbitrarily high. tan(76)=4 is a very reasonable limit!\n    lcs.MaxR = EncodeFixedPointUInt16 ( config.MaxR, 0, 14 );\n    // MetersPerTanAngleAtCenter is also known as focal length!\n    // Typically around 0.04 for our current screens, minimum of 0, sensible maximum of 0.125 (i.e. 3 \"extra\" bits of fraction)\n    lcs.MetersPerTanAngleAtCenter = EncodeFixedPointUInt16 ( config.MetersPerTanAngleAtCenter, 0, 16+3 );\n    for ( int i = 0; i < 4; i++ )\n    {\n        // ChromaticAberration[] are mostly 0.0something, centered on 0.0. Largest seen is 0.04, so set max to 0.125 (i.e. 3 \"extra\" bits of fraction)\n        lcs.ChromaticAberration[i] = EncodeFixedPointUInt16 ( config.ChromaticAberration[i], 0x8000, 16+3 );\n    }\n\n\n    // Now store them out, sensitive to endianness.\n    EncodeUInt16 (      pbuffer + 0,        lcs.VersionNumber );\n    for ( int i = 0; i < 11; i++ )\n    {\n        EncodeUInt16 (  pbuffer + 2 + 2*i,  lcs.K[i] );\n    }\n    EncodeUInt16 (      pbuffer + 24,       lcs.MaxR );\n    EncodeUInt16 (      pbuffer + 26,       lcs.MetersPerTanAngleAtCenter );\n    for ( int i = 0; i < 4; i++ )\n    {\n        EncodeUInt16 (  pbuffer + 28 + 2*i, lcs.ChromaticAberration[i] );\n    }\n    OVR_COMPILER_ASSERT (         36        == sizeof(lcs) );\n\n    return true;\n}\n\n#ifdef OVR_BUILD_DEBUG\nvoid TestSaveLoadLensConfig ( LensConfig const &config )\n{\n    OVR_ASSERT ( config.Eqn == Distortion_CatmullRom10 );\n    // As a test, make sure this can be encoded and decoded correctly.\n    const int bufferSize = 256;\n    uint8_t buffer[bufferSize];\n    OVR_ASSERT ( SaveLensConfigSizeInBytes ( config ) < bufferSize );\n    bool success;\n    success = SaveLensConfig ( buffer, bufferSize, config );\n    OVR_ASSERT ( success );\n    LensConfig testConfig;\n    success = LoadLensConfig ( &testConfig, buffer, bufferSize );\n    OVR_ASSERT ( success );\n    OVR_ASSERT ( testConfig.Eqn == config.Eqn );\n    for ( int i = 0; i < 11; i++ )\n    {\n        OVR_ASSERT ( fabs ( testConfig.K[i] - config.K[i] ) < 0.0001f );\n    }\n    OVR_ASSERT ( fabsf ( testConfig.MaxR - config.MaxR ) < 0.0001f );\n    OVR_ASSERT ( fabsf ( testConfig.MetersPerTanAngleAtCenter - config.MetersPerTanAngleAtCenter ) < 0.00001f );\n    for ( int i = 0; i < 4; i++ )\n    {\n        OVR_ASSERT ( fabsf ( testConfig.ChromaticAberration[i] - config.ChromaticAberration[i] ) < 0.00001f );\n    }\n}\n#endif\n\n\n\n//-----------------------------------------------------------------------------------\n\n// TBD: There is a question of whether this is the best file for CreateDebugHMDInfo. As long as there are many\n// constants for HmdRenderInfo here as well it is ok. The alternative would be OVR_Common_HMDDevice.cpp, but\n// that's specialized per platform... should probably move it there onces the code is in the common base class.\n\nHMDInfo CreateDebugHMDInfo(HmdTypeEnum hmdType)\n{\n    HMDInfo info;    \n\n    if ((hmdType != HmdType_DK1) &&\n        (hmdType != HmdType_CrystalCoveProto) &&\n        (hmdType != HmdType_DK2))\n    {\n        LogText(\"Debug HMDInfo - HmdType not supported. Defaulting to DK1.\\n\");\n        hmdType = HmdType_DK1;\n    }\n\n    // The alternative would be to initialize info.HmdType to HmdType_None instead. If we did that,\n    // code wouldn't be \"maximally compatible\" and devs wouldn't know what device we are\n    // simulating... so if differentiation becomes necessary we better add Debug flag in the future.\n    info.HmdType      = hmdType;\n    info.Manufacturer = \"Oculus VR\";    \n\n    switch(hmdType)\n    {\n    case HmdType_DK1:\n        info.ProductName                            = \"Oculus Rift DK1\";\n        info.ResolutionInPixels                     = Sizei ( 1280, 800 );\n        info.ScreenSizeInMeters                     = Sizef ( 0.1498f, 0.0936f );\n        info.ScreenGapSizeInMeters                  = 0.0f;\n        info.CenterFromTopInMeters                  = 0.0468f;\n        info.LensSeparationInMeters                 = 0.0635f;\n        info.PelOffsetR                             = Vector2f ( 0.0f, 0.0f );\n        info.PelOffsetB                             = Vector2f ( 0.0f, 0.0f );\n        info.Shutter.Type                           = HmdShutter_RollingTopToBottom;\n        info.Shutter.VsyncToNextVsync               = ( 1.0f / 60.0f );\n        info.Shutter.VsyncToFirstScanline           = 0.000052f;\n        info.Shutter.FirstScanlineToLastScanline    = 0.016580f;\n        info.Shutter.PixelSettleTime                = 0.015f;\n        info.Shutter.PixelPersistence               = ( 1.0f / 60.0f );\n        break;\n\n    case HmdType_CrystalCoveProto:\n        info.ProductName                            = \"Oculus Rift Crystal Cove\";        \n        info.ResolutionInPixels                     = Sizei ( 1920, 1080 );\n        info.ScreenSizeInMeters                     = Sizef ( 0.12576f, 0.07074f );\n        info.ScreenGapSizeInMeters                  = 0.0f;\n        info.CenterFromTopInMeters                  = info.ScreenSizeInMeters.h * 0.5f;\n        info.LensSeparationInMeters                 = 0.0635f;\n        info.PelOffsetR                             = Vector2f ( 0.0f, 0.0f );\n        info.PelOffsetB                             = Vector2f ( 0.0f, 0.0f );\n        info.Shutter.Type                           = HmdShutter_RollingRightToLeft;\n        info.Shutter.VsyncToNextVsync               = ( 1.0f / 76.0f );\n        info.Shutter.VsyncToFirstScanline           = 0.0000273f;\n        info.Shutter.FirstScanlineToLastScanline    = 0.0131033f;\n        info.Shutter.PixelSettleTime                = 0.0f;\n        info.Shutter.PixelPersistence               = 0.18f * info.Shutter.VsyncToNextVsync;\n        break;\n\n    case HmdType_DK2:\n        info.ProductName                            = \"Oculus Rift DK2\";        \n        info.ResolutionInPixels                     = Sizei ( 1920, 1080 );\n        info.ScreenSizeInMeters                     = Sizef ( 0.12576f, 0.07074f );\n        info.ScreenGapSizeInMeters                  = 0.0f;\n        info.CenterFromTopInMeters                  = info.ScreenSizeInMeters.h * 0.5f;\n        info.LensSeparationInMeters                 = 0.0635f;\n        info.PelOffsetR                             = Vector2f ( 0.5f, 0.5f );\n        info.PelOffsetB                             = Vector2f ( 0.5f, 0.5f );\n        info.Shutter.Type                           = HmdShutter_RollingRightToLeft;\n        info.Shutter.VsyncToNextVsync               = ( 1.0f / 76.0f );\n        info.Shutter.VsyncToFirstScanline           = 0.0000273f;\n        info.Shutter.FirstScanlineToLastScanline    = 0.0131033f;\n        info.Shutter.PixelSettleTime                = 0.0f;\n        info.Shutter.PixelPersistence               = 0.18f * info.Shutter.VsyncToNextVsync;\n        break;\n\n    default:\n        break;\n    }\n\n    return info;\n}\n\n\nHmdRenderInfo GenerateHmdRenderInfoFromHmdInfo ( HMDInfo const &hmdInfo,\n                                                 Profile const *profile,\n                                                 DistortionEqnType distortionType /*= Distortion_CatmullRom10*/,\n                                                 EyeCupType eyeCupOverride /*= EyeCup_LAST*/ )\n{\n    HmdRenderInfo renderInfo;\n    \n    OVR_ASSERT(profile);  // profiles are required\n    if(!profile)\n        return renderInfo;\n\n    renderInfo.HmdType                              = hmdInfo.HmdType;\n    renderInfo.ResolutionInPixels                   = hmdInfo.ResolutionInPixels;\n    renderInfo.ScreenSizeInMeters                   = hmdInfo.ScreenSizeInMeters;\n    renderInfo.CenterFromTopInMeters                = hmdInfo.CenterFromTopInMeters;\n    renderInfo.ScreenGapSizeInMeters                = hmdInfo.ScreenGapSizeInMeters;\n    renderInfo.LensSeparationInMeters               = hmdInfo.LensSeparationInMeters;\n    renderInfo.PelOffsetR                           = hmdInfo.PelOffsetR;\n    renderInfo.PelOffsetB                           = hmdInfo.PelOffsetB;\n\n    OVR_ASSERT ( sizeof(renderInfo.Shutter) == sizeof(hmdInfo.Shutter) );   // Try to keep the files in sync!\n    renderInfo.Shutter.Type                         = hmdInfo.Shutter.Type;\n    renderInfo.Shutter.VsyncToNextVsync             = hmdInfo.Shutter.VsyncToNextVsync;\n    renderInfo.Shutter.VsyncToFirstScanline         = hmdInfo.Shutter.VsyncToFirstScanline;\n    renderInfo.Shutter.FirstScanlineToLastScanline  = hmdInfo.Shutter.FirstScanlineToLastScanline;\n    renderInfo.Shutter.PixelSettleTime              = hmdInfo.Shutter.PixelSettleTime;\n    renderInfo.Shutter.PixelPersistence             = hmdInfo.Shutter.PixelPersistence;\n\n    renderInfo.LensDiameterInMeters                 = 0.035f;\n    renderInfo.LensSurfaceToMidplateInMeters        = 0.025f;\n    renderInfo.EyeCups                              = EyeCup_DK1A;\n\n#if 0       // Device settings are out of date - don't use them.\n    if (Contents & Contents_Distortion)\n    {\n        memcpy(renderInfo.DistortionK, DistortionK, sizeof(float)*4);\n        renderInfo.DistortionEqn = Distortion_RecipPoly4;\n    }\n#endif\n\n    // Defaults in case of no user profile.\n    renderInfo.EyeLeft.NoseToPupilInMeters   = 0.032f;\n    renderInfo.EyeLeft.ReliefInMeters        = 0.012f;\n\n    // 10mm eye-relief laser numbers for DK1 lenses.\n    // These are a decent seed for finding eye-relief and IPD.\n    // These are NOT used for rendering!\n    // Rendering distortions are now in GenerateLensConfigFromEyeRelief()\n    // So, if you're hacking in new distortions, don't do it here!\n    renderInfo.EyeLeft.Distortion.SetToIdentity();\n    renderInfo.EyeLeft.Distortion.MetersPerTanAngleAtCenter = 0.0449f;\n    renderInfo.EyeLeft.Distortion.Eqn       = Distortion_RecipPoly4;\n    renderInfo.EyeLeft.Distortion.K[0]      =  1.0f;\n    renderInfo.EyeLeft.Distortion.K[1]      = -0.494165344f;\n    renderInfo.EyeLeft.Distortion.K[2]      = 0.587046423f;\n    renderInfo.EyeLeft.Distortion.K[3]      = -0.841887126f;\n    renderInfo.EyeLeft.Distortion.MaxR      = 1.0f;\n\n    renderInfo.EyeLeft.Distortion.ChromaticAberration[0] = -0.006f;\n    renderInfo.EyeLeft.Distortion.ChromaticAberration[1] =  0.0f;\n    renderInfo.EyeLeft.Distortion.ChromaticAberration[2] =  0.014f;\n    renderInfo.EyeLeft.Distortion.ChromaticAberration[3] =  0.0f;\n\n    renderInfo.EyeRight = renderInfo.EyeLeft;\n\n    // Obtain data from profile.\n    char eyecup[16];\n    if (profile->GetValue(OVR_KEY_EYE_CUP, eyecup, 16))\n    {\n        SetEyeCup(&renderInfo, eyecup);\n    }\n    \n    switch ( hmdInfo.HmdType )\n    {\n    case HmdType_None:\n    case HmdType_DKProto:\n    case HmdType_DK1:\n        // Slight hack to improve usability.\n        // If you have a DKHD-style lens profile enabled,\n        // but you plug in DK1 and forget to change the profile,\n        // obviously you don't want those lens numbers.\n        if ( ( renderInfo.EyeCups != EyeCup_DK1A ) &&\n             ( renderInfo.EyeCups != EyeCup_DK1B ) &&\n             ( renderInfo.EyeCups != EyeCup_DK1C ) )\n        {\n            renderInfo.EyeCups = EyeCup_DK1A;\n        }\n        break;\n\n    case HmdType_DKHD2Proto:\n        renderInfo.EyeCups = EyeCup_DKHD2A;\n        break;\n    case HmdType_CrystalCoveProto:\n        renderInfo.EyeCups = EyeCup_PinkA;\n        break;\n    case HmdType_DK2:\n        renderInfo.EyeCups = EyeCup_DK2A;\n        break;\n    default:\n        break;\n    }\n\n    if ( eyeCupOverride != EyeCup_LAST )\n    {\n        renderInfo.EyeCups = eyeCupOverride;\n    }\n\n    switch ( renderInfo.EyeCups )\n    {\n    case EyeCup_DK1A:\n    case EyeCup_DK1B:\n    case EyeCup_DK1C:\n        renderInfo.LensDiameterInMeters                   = 0.035f;\n        renderInfo.LensSurfaceToMidplateInMeters          = 0.02357f;\n        // Not strictly lens-specific, but still wise to set a reasonable default for relief.\n        renderInfo.EyeLeft.ReliefInMeters                 = 0.010f; \n        renderInfo.EyeRight.ReliefInMeters                = 0.010f; \n        break;\n    case EyeCup_DKHD2A:\n        renderInfo.LensDiameterInMeters                   = 0.035f;\n        renderInfo.LensSurfaceToMidplateInMeters          = 0.02357f;\n        // Not strictly lens-specific, but still wise to set a reasonable default for relief.\n        renderInfo.EyeLeft.ReliefInMeters                 = 0.010f; \n        renderInfo.EyeRight.ReliefInMeters                = 0.010f; \n        break;\n    case EyeCup_PinkA:\n    case EyeCup_DK2A:\n        renderInfo.LensDiameterInMeters                   = 0.04f;      // approximate\n        renderInfo.LensSurfaceToMidplateInMeters          = 0.01965f;\n        // Not strictly lens-specific, but still wise to set a reasonable default for relief.\n        renderInfo.EyeLeft.ReliefInMeters                 = 0.012f;\n        renderInfo.EyeRight.ReliefInMeters                = 0.012f;\n        break;\n    default: OVR_ASSERT ( false ); break;\n    }\n\n    Profile* def = ProfileManager::GetInstance()->GetDefaultProfile(hmdInfo.HmdType);\n\n    // Set the eye position\n    // Use the user profile value unless they have elected to use the defaults\n    if (!profile->GetBoolValue(OVR_KEY_CUSTOM_EYE_RENDER, true))\n        profile = def;  // use the default\n\n    char user[32];\n    profile->GetValue(OVR_KEY_USER, user, 32);   // for debugging purposes\n\n    // TBD: Maybe we should separate custom camera positioning from custom distortion rendering ??\n    float eye2nose[2] = { OVR_DEFAULT_IPD / 2, OVR_DEFAULT_IPD / 2 };\n    if (profile->GetFloatValues(OVR_KEY_EYE_TO_NOSE_DISTANCE, eye2nose, 2) == 2)\n    {   \n        renderInfo.EyeLeft.NoseToPupilInMeters = eye2nose[0];\n        renderInfo.EyeRight.NoseToPupilInMeters = eye2nose[1];\n    }\n    else\n    {   // Legacy profiles may not include half-ipd, so use the regular IPD value instead\n        float ipd = profile->GetFloatValue(OVR_KEY_IPD, OVR_DEFAULT_IPD);\n        renderInfo.EyeLeft.NoseToPupilInMeters = 0.5f * ipd;\n        renderInfo.EyeRight.NoseToPupilInMeters = 0.5f * ipd;\n    }\n        \n    float eye2plate[2];\n    if ((profile->GetFloatValues(OVR_KEY_MAX_EYE_TO_PLATE_DISTANCE, eye2plate, 2) == 2) ||\n        (def->GetFloatValues(OVR_KEY_MAX_EYE_TO_PLATE_DISTANCE, eye2plate, 2) == 2))\n    {   // Subtract the eye-cup height from the plate distance to get the eye-to-lens distance\n        // This measurement should be the the distance at maximum dial setting\n        // We still need to adjust with the dial offset\n        renderInfo.EyeLeft.ReliefInMeters = eye2plate[0] - renderInfo.LensSurfaceToMidplateInMeters;\n        renderInfo.EyeRight.ReliefInMeters = eye2plate[1] - renderInfo.LensSurfaceToMidplateInMeters;\n\n        // Adjust the eye relief with the dial setting (from the assumed max eye relief)\n        int dial = profile->GetIntValue(OVR_KEY_EYE_RELIEF_DIAL, OVR_DEFAULT_EYE_RELIEF_DIAL);\n        renderInfo.EyeLeft.ReliefInMeters -= ((10 - dial) * 0.001f);\n        renderInfo.EyeRight.ReliefInMeters -= ((10 - dial) * 0.001f);\n    }\n    else\n    {\n        // We shouldn't be here.  The user or default profile should have the eye relief\n        OVR_ASSERT(false);\n\n        // Set the eye relief with the user configured dial setting\n\t\t//int dial = profile->GetIntValue(OVR_KEY_EYE_RELIEF_DIAL, OVR_DEFAULT_EYE_RELIEF_DIAL);\n\n        // Assume a default of 7 to 17 mm eye relief based on the dial.  This corresponds\n        // to the sampled and tuned distortion range on the DK1.\n        //renderInfo.EyeLeft.ReliefInMeters = 0.007f + (dial * 0.001f);\n        //renderInfo.EyeRight.ReliefInMeters = 0.007f + (dial * 0.001f);\n    }\n\n    def->Release();\n\n\n    // Now we know where the eyes are relative to the lenses, we can compute a distortion for each.\n    // TODO: incorporate lateral offset in distortion generation.\n    // TODO: we used a distortion to calculate eye-relief, and now we're making a distortion from that eye-relief. Close the loop!\n\n    for ( int eyeNum = 0; eyeNum < 2; eyeNum++ )\n    {\n        HmdRenderInfo::EyeConfig *pHmdEyeConfig = ( eyeNum == 0 ) ? &(renderInfo.EyeLeft) : &(renderInfo.EyeRight);\n\n        float eye_relief = pHmdEyeConfig->ReliefInMeters;\n        LensConfig distortionConfig = GenerateLensConfigFromEyeRelief ( eye_relief, renderInfo, distortionType );\n        pHmdEyeConfig->Distortion = distortionConfig;\n    }\n\n    return renderInfo;\n}\n\n\nLensConfig GenerateLensConfigFromEyeRelief ( float eyeReliefInMeters, HmdRenderInfo const &hmd, DistortionEqnType distortionType /*= Distortion_CatmullRom10*/ )\n{\n    struct DistortionDescriptor\n    {\n        float EyeRelief;\n        // The three places we're going to sample & lerp the curve at.\n        // One sample is always at 0.0, and the distortion scale should be 1.0 or else!\n        // Only use for poly4 numbers - CR has an implicit scale.\n        float SampleRadius[3];\n        // Where the distortion has actually been measured/calibrated out to.\n        // Don't try to hallucinate data out beyond here.\n        float MaxRadius;\n        // The config itself.\n        LensConfig Config;\n    };\n\n\tstatic const int MaxDistortions = 10;\n\tDistortionDescriptor distortions[MaxDistortions];\n\tfor (int i = 0; i < MaxDistortions; i++)\n    {\n        distortions[i].EyeRelief = 0.0f;\n        memset(distortions[i].SampleRadius, 0, sizeof(distortions[i].SampleRadius));\n        distortions[i].MaxRadius = 1.0f;\n        distortions[i].Config.SetToIdentity(); // Note: This line causes a false Microsoft static analysis error -cat\n    }\n    int numDistortions = 0;\n    int defaultDistortion = 0;     // index of the default distortion curve to use if zero eye relief supplied\n\n    if ( ( hmd.EyeCups == EyeCup_DK1A ) ||\n         ( hmd.EyeCups == EyeCup_DK1B ) ||\n         ( hmd.EyeCups == EyeCup_DK1C ) )\n    {\n\n        numDistortions = 0;\n                \n        // Tuned at minimum dial setting - extended to r^2 == 1.8\n        distortions[numDistortions].Config.Eqn = Distortion_CatmullRom10;\n        distortions[numDistortions].EyeRelief                            = 0.012760465f - 0.005f;\n        distortions[numDistortions].Config.MetersPerTanAngleAtCenter     = 0.0425f;\n        distortions[numDistortions].Config.K[0]                          = 1.0000f;\n        distortions[numDistortions].Config.K[1]                          = 1.06505f;\n        distortions[numDistortions].Config.K[2]                          = 1.14725f;\n        distortions[numDistortions].Config.K[3]                          = 1.2705f;\n        distortions[numDistortions].Config.K[4]                          = 1.48f;\n        distortions[numDistortions].Config.K[5]                          = 1.87f;\n        distortions[numDistortions].Config.K[6]                          = 2.534f;\n        distortions[numDistortions].Config.K[7]                          = 3.6f;\n        distortions[numDistortions].Config.K[8]                          = 5.1f;\n        distortions[numDistortions].Config.K[9]                          = 7.4f;\n        distortions[numDistortions].Config.K[10]                         = 11.0f;\n        distortions[numDistortions].MaxRadius                            = sqrt(1.8f);\n        defaultDistortion = numDistortions;                      // this is the default\n        numDistortions++;\n        \n        // Tuned at middle dial setting\n        distortions[numDistortions].Config.Eqn = Distortion_CatmullRom10;\n        distortions[numDistortions].EyeRelief                            = 0.012760465f;  // my average eye-relief\n        distortions[numDistortions].Config.MetersPerTanAngleAtCenter     = 0.0425f;\n        distortions[numDistortions].Config.K[0]                          = 1.0f;\n        distortions[numDistortions].Config.K[1]                          = 1.032407264f;\n        distortions[numDistortions].Config.K[2]                          = 1.07160462f;\n        distortions[numDistortions].Config.K[3]                          = 1.11998388f;\n        distortions[numDistortions].Config.K[4]                          = 1.1808606f;\n        distortions[numDistortions].Config.K[5]                          = 1.2590494f;\n        distortions[numDistortions].Config.K[6]                          = 1.361915f;\n        distortions[numDistortions].Config.K[7]                          = 1.5014339f;\n        distortions[numDistortions].Config.K[8]                          = 1.6986004f;\n        distortions[numDistortions].Config.K[9]                          = 1.9940577f;\n        distortions[numDistortions].Config.K[10]                         = 2.4783147f;\n        distortions[numDistortions].MaxRadius                            = 1.0f;\n        numDistortions++;\n\n        // Tuned at maximum dial setting\n        distortions[numDistortions].Config.Eqn = Distortion_CatmullRom10;\n        distortions[numDistortions].EyeRelief                            = 0.012760465f + 0.005f;\n        distortions[numDistortions].Config.MetersPerTanAngleAtCenter     = 0.0425f;\n        distortions[numDistortions].Config.K[0]                          = 1.0102f;\n        distortions[numDistortions].Config.K[1]                          = 1.0371f;\n        distortions[numDistortions].Config.K[2]                          = 1.0831f;\n        distortions[numDistortions].Config.K[3]                          = 1.1353f;\n        distortions[numDistortions].Config.K[4]                          = 1.2f;\n        distortions[numDistortions].Config.K[5]                          = 1.2851f;\n        distortions[numDistortions].Config.K[6]                          = 1.3979f;\n        distortions[numDistortions].Config.K[7]                          = 1.56f;\n        distortions[numDistortions].Config.K[8]                          = 1.8f;\n        distortions[numDistortions].Config.K[9]                          = 2.25f;\n        distortions[numDistortions].Config.K[10]                         = 3.0f;\n        distortions[numDistortions].MaxRadius                            = 1.0f;\n        numDistortions++;\n        \n\n        \n        // Chromatic aberration doesn't seem to change with eye relief.\n        for ( int i = 0; i < numDistortions; i++ )\n        {\n            distortions[i].Config.ChromaticAberration[0]        = -0.006f;\n            distortions[i].Config.ChromaticAberration[1]        =  0.0f;\n            distortions[i].Config.ChromaticAberration[2]        =  0.014f;\n            distortions[i].Config.ChromaticAberration[3]        =  0.0f;\n        }\n    }\n    else if ( hmd.EyeCups == EyeCup_DKHD2A )\n    {\n        // Tuned DKHD2 lens\n        numDistortions = 0;\n       \n        distortions[numDistortions].Config.Eqn = Distortion_CatmullRom10;\n        distortions[numDistortions].EyeRelief                            = 0.010f;\n        distortions[numDistortions].Config.MetersPerTanAngleAtCenter     = 0.0425f;\n        distortions[numDistortions].Config.K[0]                          = 1.0f;\n        distortions[numDistortions].Config.K[1]                          = 1.0425f;\n        distortions[numDistortions].Config.K[2]                          = 1.0826f;\n        distortions[numDistortions].Config.K[3]                          = 1.130f;\n        distortions[numDistortions].Config.K[4]                          = 1.185f;\n        distortions[numDistortions].Config.K[5]                          = 1.250f;\n        distortions[numDistortions].Config.K[6]                          = 1.338f;\n        distortions[numDistortions].Config.K[7]                          = 1.455f;\n        distortions[numDistortions].Config.K[8]                          = 1.620f;\n        distortions[numDistortions].Config.K[9]                          = 1.840f;\n        distortions[numDistortions].Config.K[10]                         = 2.200f;\n        distortions[numDistortions].MaxRadius                            = 1.0f;\n        \n        defaultDistortion = numDistortions;   // this is the default\n        numDistortions++;\n\n        distortions[numDistortions] = distortions[0];\n        distortions[numDistortions].EyeRelief = 0.020f;\n        numDistortions++;\n\n        // Chromatic aberration doesn't seem to change with eye relief.\n        for ( int i = 0; i < numDistortions; i++ )\n        {\n            distortions[i].Config.ChromaticAberration[0]        = -0.006f;\n            distortions[i].Config.ChromaticAberration[1]        =  0.0f;\n            distortions[i].Config.ChromaticAberration[2]        =  0.014f;\n            distortions[i].Config.ChromaticAberration[3]        =  0.0f;\n        }\n    }\n    else if ( hmd.EyeCups == EyeCup_PinkA || hmd.EyeCups == EyeCup_DK2A )\n    {\n        // Tuned Crystal Cove & DK2 Lens (CES & GDC)\n        numDistortions = 0;\n       \n        \n        distortions[numDistortions].EyeRelief                            = 0.008f;\n        distortions[numDistortions].Config.MetersPerTanAngleAtCenter     = 0.036f;\n        // TODO: Need to retune this distortion for minimum eye relief\n        distortions[numDistortions].Config.Eqn = Distortion_CatmullRom10;\n        distortions[numDistortions].Config.K[0]                          = 1.003f;\n        distortions[numDistortions].Config.K[1]                          = 1.02f;\n        distortions[numDistortions].Config.K[2]                          = 1.042f;\n        distortions[numDistortions].Config.K[3]                          = 1.066f;\n        distortions[numDistortions].Config.K[4]                          = 1.094f;\n        distortions[numDistortions].Config.K[5]                          = 1.126f;\n        distortions[numDistortions].Config.K[6]                          = 1.162f;\n        distortions[numDistortions].Config.K[7]                          = 1.203f;\n        distortions[numDistortions].Config.K[8]                          = 1.25f;\n        distortions[numDistortions].Config.K[9]                          = 1.31f;\n        distortions[numDistortions].Config.K[10]                         = 1.38f;\n        distortions[numDistortions].MaxRadius                            = 1.0f;\n        \n        distortions[numDistortions].Config.ChromaticAberration[0]        = -0.0112f;\n        distortions[numDistortions].Config.ChromaticAberration[1]        = -0.015f;\n        distortions[numDistortions].Config.ChromaticAberration[2]        =  0.0187f;\n        distortions[numDistortions].Config.ChromaticAberration[3]        =  0.015f;\n        \n        numDistortions++;\n\n\n\n\n\n        distortions[numDistortions].EyeRelief                            = 0.018f;\n        distortions[numDistortions].Config.MetersPerTanAngleAtCenter     = 0.036f;\n\n        distortions[numDistortions].Config.Eqn = Distortion_CatmullRom10;\n        distortions[numDistortions].Config.K[0]                          = 1.003f;\n        distortions[numDistortions].Config.K[1]                          = 1.02f;\n        distortions[numDistortions].Config.K[2]                          = 1.042f;\n        distortions[numDistortions].Config.K[3]                          = 1.066f;\n        distortions[numDistortions].Config.K[4]                          = 1.094f;\n        distortions[numDistortions].Config.K[5]                          = 1.126f;\n        distortions[numDistortions].Config.K[6]                          = 1.162f;\n        distortions[numDistortions].Config.K[7]                          = 1.203f;\n        distortions[numDistortions].Config.K[8]                          = 1.25f;\n        distortions[numDistortions].Config.K[9]                          = 1.31f;\n        distortions[numDistortions].Config.K[10]                         = 1.38f;\n        distortions[numDistortions].MaxRadius                            = 1.0f;\n\n        distortions[numDistortions].Config.ChromaticAberration[0]        = -0.015f;\n        distortions[numDistortions].Config.ChromaticAberration[1]        = -0.02f;\n        distortions[numDistortions].Config.ChromaticAberration[2]        =  0.025f;\n        distortions[numDistortions].Config.ChromaticAberration[3]        =  0.02f;\n        \n        defaultDistortion = numDistortions;   // this is the default\n        numDistortions++;\n        \n        /*\n        // Orange Lens on DK2\n        distortions[numDistortions].EyeRelief                            = 0.010f;\n        distortions[numDistortions].Config.MetersPerTanAngleAtCenter     = 0.031f;\n\n        distortions[numDistortions].Config.Eqn = Distortion_CatmullRom10;\n        distortions[numDistortions].Config.K[0]                          = 1.00f;\n        distortions[numDistortions].Config.K[1]                          = 1.0169f;\n        distortions[numDistortions].Config.K[2]                          = 1.0378f;\n        distortions[numDistortions].Config.K[3]                          = 1.0648f;\n        distortions[numDistortions].Config.K[4]                          = 1.0990f;\n        distortions[numDistortions].Config.K[5]                          = 1.141f;\n        distortions[numDistortions].Config.K[6]                          = 1.192f;\n        distortions[numDistortions].Config.K[7]                          = 1.255f;\n        distortions[numDistortions].Config.K[8]                          = 1.335f;\n        distortions[numDistortions].Config.K[9]                          = 1.435f;\n        distortions[numDistortions].Config.K[10]                         = 1.56f;\n        distortions[numDistortions].MaxRadius                            = 1.0f;\n        */\n    }\n    else\n    {\n        // Unknown lens.\n        // Use DK1 black lens settings, just so we can continue to run with something.\n        distortions[0].EyeRelief = 0.005f;\n        distortions[0].Config.MetersPerTanAngleAtCenter = 0.043875f;\n        distortions[0].Config.Eqn = Distortion_RecipPoly4;\n        distortions[0].Config.K[0] = 1.0f;\n        distortions[0].Config.K[1] = -0.3999f;\n        distortions[0].Config.K[2] =  0.2408f;\n        distortions[0].Config.K[3] = -0.4589f;\n        distortions[0].SampleRadius[0] = 0.2f;\n        distortions[0].SampleRadius[1] = 0.4f;\n        distortions[0].SampleRadius[2] = 0.6f;\n\n        distortions[1] = distortions[0];\n        distortions[1].EyeRelief = 0.010f;\n        numDistortions = 2;\n\n        // Chromatic aberration doesn't seem to change with eye relief.\n        for ( int i = 0; i < numDistortions; i++ )\n        {\n            // These are placeholder, they have not been tuned!\n            distortions[i].Config.ChromaticAberration[0]        =  0.0f;\n            distortions[i].Config.ChromaticAberration[1]        =  0.0f;\n            distortions[i].Config.ChromaticAberration[2]        =  0.0f;\n            distortions[i].Config.ChromaticAberration[3]        =  0.0f;\n        }\n    }\n\n\tOVR_ASSERT(numDistortions < MaxDistortions);\n\n    DistortionDescriptor *pUpper = NULL;\n    DistortionDescriptor *pLower = NULL;\n    float lerpVal = 0.0f;\n    if (eyeReliefInMeters == 0)\n    {   // Use a constant default distortion if an invalid eye-relief is supplied\n        pLower = &(distortions[defaultDistortion]);\n        pUpper = &(distortions[defaultDistortion]);\n        lerpVal = 0.0f;\n    }\n    else\n    {\n        for ( int i = 0; i < numDistortions-1; i++ )\n        {\n            OVR_ASSERT ( distortions[i].EyeRelief < distortions[i+1].EyeRelief );\n            if ( ( distortions[i].EyeRelief <= eyeReliefInMeters ) && ( distortions[i+1].EyeRelief > eyeReliefInMeters ) )\n            {\n                pLower = &(distortions[i]);\n                pUpper = &(distortions[i+1]);\n                lerpVal = ( eyeReliefInMeters - pLower->EyeRelief ) / ( pUpper->EyeRelief - pLower->EyeRelief );\n                // No break here - I want the ASSERT to check everything every time!\n            }\n        }\n    }\n\n    if ( pUpper == NULL )\n    {\n#if 0\n        // Outside the range, so extrapolate rather than interpolate.\n        if ( distortions[0].EyeRelief > eyeReliefInMeters )\n        { \n            pLower = &(distortions[0]);\n            pUpper = &(distortions[1]);\n        }\n        else\n        {\n            OVR_ASSERT ( distortions[numDistortions-1].EyeRelief <= eyeReliefInMeters );\n            pLower = &(distortions[numDistortions-2]);\n            pUpper = &(distortions[numDistortions-1]);\n        }\n        lerpVal = ( eyeReliefInMeters - pLower->EyeRelief ) / ( pUpper->EyeRelief - pLower->EyeRelief );\n#else\n        // Do not extrapolate, just clamp - slightly worried about people putting in bogus settings.\n        if ( distortions[0].EyeRelief > eyeReliefInMeters )\n        {\n            pLower = &(distortions[0]);\n            pUpper = &(distortions[0]);\n        }\n        else\n        {\n            OVR_ASSERT ( distortions[numDistortions-1].EyeRelief <= eyeReliefInMeters );\n            pLower = &(distortions[numDistortions-1]);\n            pUpper = &(distortions[numDistortions-1]);\n        }\n        lerpVal = 0.0f;\n#endif\n    }\n    float invLerpVal = 1.0f - lerpVal;\n\n    pLower->Config.MaxR = pLower->MaxRadius;\n    pUpper->Config.MaxR = pUpper->MaxRadius;\n\n    LensConfig result;\n    // Where is the edge of the lens - no point modelling further than this.\n    float maxValidRadius = invLerpVal * pLower->MaxRadius + lerpVal * pUpper->MaxRadius;\n    result.MaxR = maxValidRadius;\n\n    switch ( distortionType )\n    {\n    case Distortion_Poly4:\n        // Deprecated\n        OVR_ASSERT ( false );\n        break;\n    case Distortion_RecipPoly4:{\n        // Lerp control points and fit an equation to them.\n        float fitX[4];\n        float fitY[4];\n        fitX[0] = 0.0f;\n        fitY[0] = 1.0f;\n        for ( int ctrlPt = 1; ctrlPt < 4; ctrlPt ++ )\n        {\n            // SampleRadius is not valid for Distortion_RecipPoly4 types.\n            float radiusLerp = ( invLerpVal * pLower->MaxRadius + lerpVal * pUpper->MaxRadius ) * ( (float)ctrlPt / 4.0f );\n            float radiusLerpSq = radiusLerp * radiusLerp;\n            float fitYLower = pLower->Config.DistortionFnScaleRadiusSquared ( radiusLerpSq );\n            float fitYUpper = pUpper->Config.DistortionFnScaleRadiusSquared ( radiusLerpSq );\n            fitX[ctrlPt] = radiusLerpSq;\n            fitY[ctrlPt] = 1.0f / ( invLerpVal * fitYLower + lerpVal * fitYUpper );\n        }\n\n        result.Eqn = Distortion_RecipPoly4;\n        bool bSuccess = FitCubicPolynomial ( result.K, fitX, fitY );\n        OVR_ASSERT ( bSuccess );\n        OVR_UNUSED ( bSuccess );\n\n        // Set up the fast inverse.\n        float maxRDist = result.DistortionFn ( maxValidRadius );\n        result.MaxInvR = maxRDist;\n        result.SetUpInverseApprox();\n\n        }break;\n\n    case Distortion_CatmullRom10:{\n\n        // Evenly sample & lerp points on the curve.\n        const int NumSegments = LensConfig::NumCoefficients;\n        result.MaxR = maxValidRadius;\n        // Directly interpolate the K0 values\n        result.K[0] = invLerpVal * pLower->Config.K[0] + lerpVal * pUpper->Config.K[0];\n\n        // Sample and interpolate the distortion curves to derive K[1] ... K[n]\n        for ( int ctrlPt = 1; ctrlPt < NumSegments; ctrlPt++ )\n        {\n            float radiusSq = ( (float)ctrlPt / (float)(NumSegments-1) ) * maxValidRadius * maxValidRadius;\n            float fitYLower = pLower->Config.DistortionFnScaleRadiusSquared ( radiusSq );\n            float fitYUpper = pUpper->Config.DistortionFnScaleRadiusSquared ( radiusSq );\n            float fitLerp = invLerpVal * fitYLower + lerpVal * fitYUpper;\n            result.K[ctrlPt] = fitLerp;\n        }\n\n        result.Eqn = Distortion_CatmullRom10;\n\n        for ( int ctrlPt = 1; ctrlPt < NumSegments; ctrlPt++ )\n        {\n            float radiusSq = ( (float)ctrlPt / (float)(NumSegments-1) ) * maxValidRadius * maxValidRadius;\n            float val = result.DistortionFnScaleRadiusSquared ( radiusSq );            \n            OVR_ASSERT ( Alg::Abs ( val - result.K[ctrlPt] ) < 0.0001f );\n            OVR_UNUSED1(val); // For release build.\n        }\n\n        // Set up the fast inverse.\n        float maxRDist = result.DistortionFn ( maxValidRadius );\n        result.MaxInvR = maxRDist;\n        result.SetUpInverseApprox();\n\n        }break;\n\n    default: OVR_ASSERT ( false ); break;\n    }\n\n\n    // Chromatic aberration.\n    result.ChromaticAberration[0] = invLerpVal * pLower->Config.ChromaticAberration[0] + lerpVal * pUpper->Config.ChromaticAberration[0];\n    result.ChromaticAberration[1] = invLerpVal * pLower->Config.ChromaticAberration[1] + lerpVal * pUpper->Config.ChromaticAberration[1];\n    result.ChromaticAberration[2] = invLerpVal * pLower->Config.ChromaticAberration[2] + lerpVal * pUpper->Config.ChromaticAberration[2];\n    result.ChromaticAberration[3] = invLerpVal * pLower->Config.ChromaticAberration[3] + lerpVal * pUpper->Config.ChromaticAberration[3];\n\n    // Scale.\n    result.MetersPerTanAngleAtCenter =  pLower->Config.MetersPerTanAngleAtCenter * invLerpVal +\n                                        pUpper->Config.MetersPerTanAngleAtCenter * lerpVal;\n    /*\n    // Commented out - Causes ASSERT with no HMD plugged in\n#ifdef OVR_BUILD_DEBUG\n    if ( distortionType == Distortion_CatmullRom10 )\n    {\n        TestSaveLoadLensConfig ( result );\n    }\n#endif\n    */\n    return result;\n}\n\n\nDistortionRenderDesc CalculateDistortionRenderDesc ( StereoEye eyeType, HmdRenderInfo const &hmd,\n                                                     const LensConfig *pLensOverride /*= NULL */ )\n{\n    // From eye relief, IPD and device characteristics, we get the distortion mapping.\n    // This distortion does the following things:\n    // 1. It undoes the distortion that happens at the edges of the lens.\n    // 2. It maps the undistorted field into \"retina\" space.\n    // So the input is a pixel coordinate - the physical pixel on the display itself.\n    // The output is the real-world direction of the ray from this pixel as it comes out of the lens and hits the eye.\n    // However we typically think of rays \"coming from\" the eye, so the direction (TanAngleX,TanAngleY,1) is the direction\n    //      that the pixel appears to be in real-world space, where AngleX and AngleY are relative to the straight-ahead vector.\n    // If your renderer is a raytracer, you can use this vector directly (normalize as appropriate).\n    // However in standard rasterisers, we have rendered a 2D image and are putting it in front of the eye,\n    //      so we then need a mapping from this space to the [-1,1] UV coordinate space, which depends on exactly\n    //      where \"in space\" the app wants to put that rendertarget.\n    //      Where in space, and how large this rendertarget is, is completely up to the app and/or user,\n    //      though of course we can provide some useful hints.\n\n    // TODO: Use IPD and eye relief to modify distortion (i.e. non-radial component)\n    // TODO: cope with lenses that don't produce collimated light.\n    //       This means that IPD relative to the lens separation changes the light vergence,\n    //       and so we actually need to change where the image is displayed.\n\n    const HmdRenderInfo::EyeConfig &hmdEyeConfig = ( eyeType == StereoEye_Left ) ? hmd.EyeLeft : hmd.EyeRight;\n\n    DistortionRenderDesc localDistortion;\n    localDistortion.Lens = hmdEyeConfig.Distortion;\n\n    if ( pLensOverride != NULL )\n    {\n        localDistortion.Lens = *pLensOverride;\n    }\n\n    Sizef pixelsPerMeter(hmd.ResolutionInPixels.w / ( hmd.ScreenSizeInMeters.w - hmd.ScreenGapSizeInMeters ),\n                         hmd.ResolutionInPixels.h / hmd.ScreenSizeInMeters.h);\n\n    localDistortion.PixelsPerTanAngleAtCenter = (pixelsPerMeter * localDistortion.Lens.MetersPerTanAngleAtCenter).ToVector();\n    // Same thing, scaled to [-1,1] for each eye, rather than pixels.\n\n    localDistortion.TanEyeAngleScale = Vector2f(0.25f, 0.5f).EntrywiseMultiply(\n                                       (hmd.ScreenSizeInMeters / localDistortion.Lens.MetersPerTanAngleAtCenter).ToVector());\n    \n    // <--------------left eye------------------><-ScreenGapSizeInMeters-><--------------right eye----------------->\n    // <------------------------------------------ScreenSizeInMeters.Width----------------------------------------->\n    //                            <----------------LensSeparationInMeters--------------->\n    // <--centerFromLeftInMeters->\n    //                            ^\n    //                      Center of lens\n\n    // Find the lens centers in scale of [-1,+1] (NDC) in left eye.\n    float visibleWidthOfOneEye = 0.5f * ( hmd.ScreenSizeInMeters.w - hmd.ScreenGapSizeInMeters );\n    float centerFromLeftInMeters = ( hmd.ScreenSizeInMeters.w - hmd.LensSeparationInMeters ) * 0.5f;\n    localDistortion.LensCenter.x = (     centerFromLeftInMeters / visibleWidthOfOneEye          ) * 2.0f - 1.0f;\n    localDistortion.LensCenter.y = ( hmd.CenterFromTopInMeters  / hmd.ScreenSizeInMeters.h ) * 2.0f - 1.0f;\n    if ( eyeType == StereoEye_Right )\n    {\n        localDistortion.LensCenter.x = -localDistortion.LensCenter.x;\n    }\n\n    return localDistortion;\n}\n\nFovPort CalculateFovFromEyePosition ( float eyeReliefInMeters,\n                                      float offsetToRightInMeters,\n                                      float offsetDownwardsInMeters,\n                                      float lensDiameterInMeters,\n                                      float extraEyeRotationInRadians /*= 0.0f*/ )\n{\n    // 2D view of things:\n    //       |-|            <--- offsetToRightInMeters (in this case, it is negative)\n    // |=======C=======|    <--- lens surface (C=center)\n    //  \\    |       _/\n    //   \\   R     _/\n    //    \\  |   _/\n    //     \\ | _/\n    //      \\|/\n    //       O  <--- center of pupil\n\n    // (technically the lens is round rather than square, so it's not correct to\n    // separate vertical and horizontal like this, but it's close enough)\n    float halfLensDiameter = lensDiameterInMeters * 0.5f;\n    FovPort fovPort;\n    fovPort.UpTan    = ( halfLensDiameter + offsetDownwardsInMeters ) / eyeReliefInMeters;\n    fovPort.DownTan  = ( halfLensDiameter - offsetDownwardsInMeters ) / eyeReliefInMeters;\n    fovPort.LeftTan  = ( halfLensDiameter + offsetToRightInMeters   ) / eyeReliefInMeters;\n    fovPort.RightTan = ( halfLensDiameter - offsetToRightInMeters   ) / eyeReliefInMeters;\n\n    if ( extraEyeRotationInRadians > 0.0f )\n    {\n        // That's the basic looking-straight-ahead eye position relative to the lens.\n        // But if you look left, the pupil moves left as the eyeball rotates, which\n        // means you can see more to the right than this geometry suggests.\n        // So add in the bounds for the extra movement of the pupil.\n\n        // Beyond 30 degrees does not increase FOV because the pupil starts moving backwards more than sideways.\n        extraEyeRotationInRadians = Alg::Min ( DegreeToRad ( 30.0f ), Alg::Max ( 0.0f, extraEyeRotationInRadians ) );\n        \n        // The rotation of the eye is a bit more complex than a simple circle.  The center of rotation\n        // at 13.5mm from cornea is slightly further back than the actual center of the eye.\n        // Additionally the rotation contains a small lateral component as the muscles pull the eye\n        const float eyeballCenterToPupil = 0.0135f;  // center of eye rotation\n        const float eyeballLateralPull = 0.001f * (extraEyeRotationInRadians / DegreeToRad ( 30.0f));  // lateral motion as linear function \n        float extraTranslation = eyeballCenterToPupil * sinf ( extraEyeRotationInRadians ) + eyeballLateralPull;\n        float extraRelief = eyeballCenterToPupil * ( 1.0f - cosf ( extraEyeRotationInRadians ) );\n\n        fovPort.UpTan    = Alg::Max ( fovPort.UpTan   , ( halfLensDiameter + offsetDownwardsInMeters + extraTranslation ) / ( eyeReliefInMeters + extraRelief ) );\n        fovPort.DownTan  = Alg::Max ( fovPort.DownTan , ( halfLensDiameter - offsetDownwardsInMeters + extraTranslation ) / ( eyeReliefInMeters + extraRelief ) );\n        fovPort.LeftTan  = Alg::Max ( fovPort.LeftTan , ( halfLensDiameter + offsetToRightInMeters   + extraTranslation ) / ( eyeReliefInMeters + extraRelief ) );\n        fovPort.RightTan = Alg::Max ( fovPort.RightTan, ( halfLensDiameter - offsetToRightInMeters   + extraTranslation ) / ( eyeReliefInMeters + extraRelief ) );\n    }\n\n    return fovPort;\n}\n\n\n\nFovPort CalculateFovFromHmdInfo ( StereoEye eyeType,\n                                  DistortionRenderDesc const &distortion,\n                                  HmdRenderInfo const &hmd,\n                                  float extraEyeRotationInRadians /*= 0.0f*/ )\n{\n    FovPort fovPort;\n    float eyeReliefInMeters;\n    float offsetToRightInMeters;\n    if ( eyeType == StereoEye_Right )\n    {\n        eyeReliefInMeters     = hmd.EyeRight.ReliefInMeters;\n        offsetToRightInMeters = hmd.EyeRight.NoseToPupilInMeters - 0.5f * hmd.LensSeparationInMeters;\n    }\n    else\n    {\n        eyeReliefInMeters     = hmd.EyeLeft.ReliefInMeters;\n        offsetToRightInMeters = -(hmd.EyeLeft.NoseToPupilInMeters - 0.5f * hmd.LensSeparationInMeters);\n    }\n\n    // Limit the eye-relief to 6 mm for FOV calculations since this just tends to spread off-screen\n    // and get clamped anyways on DK1 (but in Unity it continues to spreads and causes \n    // unnecessarily large render targets)\n    eyeReliefInMeters = Alg::Max(eyeReliefInMeters, 0.006f);\n\n    // Central view.\n    fovPort = CalculateFovFromEyePosition ( eyeReliefInMeters,\n                                            offsetToRightInMeters,\n                                            0.0f,\n                                            hmd.LensDiameterInMeters,\n                                            extraEyeRotationInRadians );\n\n    // clamp to the screen\n    fovPort = ClampToPhysicalScreenFov ( eyeType, distortion, fovPort );\n       \n    return fovPort;\n}\n\n\n\nFovPort GetPhysicalScreenFov ( StereoEye eyeType, DistortionRenderDesc const &distortion )\n{\n    OVR_UNUSED1 ( eyeType );\n\n    FovPort resultFovPort;\n\n    // Figure out the boundaries of the screen. We take the middle pixel of the screen,\n    // move to each of the four screen edges, and transform those back into TanAngle space.\n    Vector2f dmiddle = distortion.LensCenter;\n\n    // The gotcha is that for some distortion functions, the map will \"wrap around\"\n    // for screen pixels that are not actually visible to the user (especially on DK1,\n    // which has a lot of invisible pixels), and map to pixels that are close to the middle.\n    // This means the edges of the screen will actually be\n    // \"closer\" than the visible bounds, so we'll clip too aggressively.\n\n    // Solution - step gradually towards the boundary, noting the maximum distance.\n    struct FunctionHider\n    {\n        static FovPort FindRange ( Vector2f from, Vector2f to, int numSteps,\n                                          DistortionRenderDesc const &distortionL )\n        {\n            FovPort result;\n            result.UpTan    = 0.0f;\n            result.DownTan  = 0.0f;\n            result.LeftTan  = 0.0f;\n            result.RightTan = 0.0f;\n\n            float stepScale = 1.0f / ( numSteps - 1 );\n            for ( int step = 0; step < numSteps; step++ )\n            {\n                float    lerpFactor  = stepScale * (float)step;\n                Vector2f sample      = from + (to - from) * lerpFactor;\n                Vector2f tanEyeAngle = TransformScreenNDCToTanFovSpace ( distortionL, sample );\n\n                result.LeftTan  = Alg::Max ( result.LeftTan,  -tanEyeAngle.x );\n                result.RightTan = Alg::Max ( result.RightTan,  tanEyeAngle.x );\n                result.UpTan    = Alg::Max ( result.UpTan,    -tanEyeAngle.y );\n                result.DownTan  = Alg::Max ( result.DownTan,   tanEyeAngle.y );\n            }\n            return result;\n        }\n    };\n\n    FovPort leftFovPort  = FunctionHider::FindRange( dmiddle, Vector2f( -1.0f, dmiddle.y ), 10, distortion );\n    FovPort rightFovPort = FunctionHider::FindRange( dmiddle, Vector2f( 1.0f, dmiddle.y ),  10, distortion );\n    FovPort upFovPort    = FunctionHider::FindRange( dmiddle, Vector2f( dmiddle.x, -1.0f ), 10, distortion );\n    FovPort downFovPort  = FunctionHider::FindRange( dmiddle, Vector2f( dmiddle.x, 1.0f ),  10, distortion );\n    \n    resultFovPort.LeftTan  = leftFovPort.LeftTan;\n    resultFovPort.RightTan = rightFovPort.RightTan;\n    resultFovPort.UpTan    = upFovPort.UpTan;\n    resultFovPort.DownTan  = downFovPort.DownTan;\n\n    return resultFovPort;\n}\n\nFovPort ClampToPhysicalScreenFov( StereoEye eyeType, DistortionRenderDesc const &distortion,\n                                         FovPort inputFovPort )\n{\n    FovPort resultFovPort;\n    FovPort phsyicalFovPort = GetPhysicalScreenFov ( eyeType, distortion );\n    resultFovPort.LeftTan  = Alg::Min ( inputFovPort.LeftTan,  phsyicalFovPort.LeftTan );\n    resultFovPort.RightTan = Alg::Min ( inputFovPort.RightTan, phsyicalFovPort.RightTan );\n    resultFovPort.UpTan    = Alg::Min ( inputFovPort.UpTan,    phsyicalFovPort.UpTan );\n    resultFovPort.DownTan  = Alg::Min ( inputFovPort.DownTan,  phsyicalFovPort.DownTan );\n\n    return resultFovPort;\n}\n\nSizei CalculateIdealPixelSize ( StereoEye eyeType, DistortionRenderDesc const &distortion,\n                                FovPort tanHalfFov, float pixelsPerDisplayPixel )\n{\n    OVR_UNUSED(eyeType);   // might be useful in the future if we do overlapping fovs\n\n    Sizei result;    \n    // TODO: if the app passes in a FOV that doesn't cover the centre, use the distortion values for the nearest edge/corner to match pixel size.\n    result.w  = (int)(0.5f + pixelsPerDisplayPixel * distortion.PixelsPerTanAngleAtCenter.x * ( tanHalfFov.LeftTan + tanHalfFov.RightTan ) );\n    result.h = (int)(0.5f + pixelsPerDisplayPixel * distortion.PixelsPerTanAngleAtCenter.y * ( tanHalfFov.UpTan   + tanHalfFov.DownTan  ) );\n    return result;\n}\n\nRecti GetFramebufferViewport ( StereoEye eyeType, HmdRenderInfo const &hmd )\n{\n    Recti result;\n    result.w = hmd.ResolutionInPixels.w/2;\n    result.h = hmd.ResolutionInPixels.h;\n    result.x = 0;\n    result.y = 0;\n    if ( eyeType == StereoEye_Right )\n    {\n        result.x = (hmd.ResolutionInPixels.w+1)/2;      // Round up, not down.\n    }\n    return result;\n}\n\n\nScaleAndOffset2D CreateNDCScaleAndOffsetFromFov ( FovPort tanHalfFov )\n{\n    float projXScale = 2.0f / ( tanHalfFov.LeftTan + tanHalfFov.RightTan );\n    float projXOffset = ( tanHalfFov.LeftTan - tanHalfFov.RightTan ) * projXScale * 0.5f;\n    float projYScale = 2.0f / ( tanHalfFov.UpTan + tanHalfFov.DownTan );\n    float projYOffset = ( tanHalfFov.UpTan - tanHalfFov.DownTan ) * projYScale * 0.5f;\n\n    ScaleAndOffset2D result;\n    result.Scale    = Vector2f(projXScale, projYScale);\n    result.Offset   = Vector2f(projXOffset, projYOffset);\n    // Hey - why is that Y.Offset negated?\n    // It's because a projection matrix transforms from world coords with Y=up,\n    // whereas this is from NDC which is Y=down.\n\n    return result;\n}\n\n\nScaleAndOffset2D CreateUVScaleAndOffsetfromNDCScaleandOffset ( ScaleAndOffset2D scaleAndOffsetNDC,\n                                                               Recti renderedViewport,\n                                                               Sizei renderTargetSize )\n{\n    // scaleAndOffsetNDC takes you to NDC space [-1,+1] within the given viewport on the rendertarget.\n    // We want a scale to instead go to actual UV coordinates you can sample with,\n    // which need [0,1] and ignore the viewport.\n    ScaleAndOffset2D result;\n    // Scale [-1,1] to [0,1]\n    result.Scale  = scaleAndOffsetNDC.Scale * 0.5f;\n    result.Offset = scaleAndOffsetNDC.Offset * 0.5f + Vector2f(0.5f);\n    \n    // ...but we will have rendered to a subsection of the RT, so scale for that.\n    Vector2f scale(  (float)renderedViewport.w / (float)renderTargetSize.w,\n                     (float)renderedViewport.h / (float)renderTargetSize.h );\n    Vector2f offset( (float)renderedViewport.x / (float)renderTargetSize.w,\n                     (float)renderedViewport.y / (float)renderTargetSize.h );\n\n\tresult.Scale  = result.Scale.EntrywiseMultiply(scale);\n    result.Offset  = result.Offset.EntrywiseMultiply(scale) + offset;\n    return result;\n}\n\n\n\nMatrix4f CreateProjection( bool rightHanded, FovPort tanHalfFov,\n                           float zNear /*= 0.01f*/, float zFar /*= 10000.0f*/ )\n{\n    // A projection matrix is very like a scaling from NDC, so we can start with that.\n    ScaleAndOffset2D scaleAndOffset = CreateNDCScaleAndOffsetFromFov ( tanHalfFov );\n\n    float handednessScale = 1.0f;\n    if ( rightHanded )\n    {\n        handednessScale = -1.0f;\n    }\n\n    Matrix4f projection;\n    // Produces X result, mapping clip edges to [-w,+w]\n    projection.M[0][0] = scaleAndOffset.Scale.x;\n    projection.M[0][1] = 0.0f;\n    projection.M[0][2] = handednessScale * scaleAndOffset.Offset.x;\n    projection.M[0][3] = 0.0f;\n\n    // Produces Y result, mapping clip edges to [-w,+w]\n    // Hey - why is that YOffset negated?\n    // It's because a projection matrix transforms from world coords with Y=up,\n    // whereas this is derived from an NDC scaling, which is Y=down.\n    projection.M[1][0] = 0.0f;\n    projection.M[1][1] = scaleAndOffset.Scale.y;\n    projection.M[1][2] = handednessScale * -scaleAndOffset.Offset.y;\n    projection.M[1][3] = 0.0f;\n\n    // Produces Z-buffer result - app needs to fill this in with whatever Z range it wants.\n    // We'll just use some defaults for now.\n    projection.M[2][0] = 0.0f;\n    projection.M[2][1] = 0.0f;\n    projection.M[2][2] = -handednessScale * zFar / (zNear - zFar);\n    projection.M[2][3] = (zFar * zNear) / (zNear - zFar);\n\n    // Produces W result (= Z in)\n    projection.M[3][0] = 0.0f;\n    projection.M[3][1] = 0.0f;\n    projection.M[3][2] = handednessScale;\n    projection.M[3][3] = 0.0f;\n\n    return projection;\n}\n\n\nMatrix4f CreateOrthoSubProjection ( bool rightHanded, StereoEye eyeType,\n                                    float tanHalfFovX, float tanHalfFovY,\n                                    float unitsX, float unitsY,\n                                    float distanceFromCamera, float interpupillaryDistance,\n                                    Matrix4f const &projection,\n                                    float zNear /*= 0.0f*/, float zFar /*= 0.0f*/ )\n{\n    OVR_UNUSED1 ( rightHanded );\n\n    float orthoHorizontalOffset = interpupillaryDistance * 0.5f / distanceFromCamera;\n    switch ( eyeType )\n    {\n    case StereoEye_Center:\n        orthoHorizontalOffset = 0.0f;\n        break;\n    case StereoEye_Left:\n        break;\n    case StereoEye_Right:\n        orthoHorizontalOffset = -orthoHorizontalOffset;\n        break;\n    default: OVR_ASSERT ( false ); break;\n    }\n\n    // Current projection maps real-world vector (x,y,1) to the RT.\n    // We want to find the projection that maps the range [-FovPixels/2,FovPixels/2] to\n    // the physical [-orthoHalfFov,orthoHalfFov]\n    // Note moving the offset from M[0][2]+M[1][2] to M[0][3]+M[1][3] - this means\n    // we don't have to feed in Z=1 all the time.\n    // The horizontal offset math is a little hinky because the destination is\n    // actually [-orthoHalfFov+orthoHorizontalOffset,orthoHalfFov+orthoHorizontalOffset]\n    // So we need to first map [-FovPixels/2,FovPixels/2] to\n    //                         [-orthoHalfFov+orthoHorizontalOffset,orthoHalfFov+orthoHorizontalOffset]:\n    // x1 = x0 * orthoHalfFov/(FovPixels/2) + orthoHorizontalOffset;\n    //    = x0 * 2*orthoHalfFov/FovPixels + orthoHorizontalOffset;\n    // But then we need the sam mapping as the existing projection matrix, i.e.\n    // x2 = x1 * Projection.M[0][0] + Projection.M[0][2];\n    //    = x0 * (2*orthoHalfFov/FovPixels + orthoHorizontalOffset) * Projection.M[0][0] + Projection.M[0][2];\n    //    = x0 * Projection.M[0][0]*2*orthoHalfFov/FovPixels +\n    //      orthoHorizontalOffset*Projection.M[0][0] + Projection.M[0][2];\n    // So in the new projection matrix we need to scale by Projection.M[0][0]*2*orthoHalfFov/FovPixels and\n    // offset by orthoHorizontalOffset*Projection.M[0][0] + Projection.M[0][2].\n\n    float orthoScaleX = 2.0f * tanHalfFovX / unitsX;\n    float orthoScaleY = 2.0f * tanHalfFovY / unitsY;\n    Matrix4f ortho;\n    ortho.M[0][0] = projection.M[0][0] * orthoScaleX;\n    ortho.M[0][1] = 0.0f;\n    ortho.M[0][2] = 0.0f;\n    ortho.M[0][3] = -projection.M[0][2] + ( orthoHorizontalOffset * projection.M[0][0] );\n\n    ortho.M[1][0] = 0.0f;\n    ortho.M[1][1] = -projection.M[1][1] * orthoScaleY;       // Note sign flip (text rendering uses Y=down).\n    ortho.M[1][2] = 0.0f;\n    ortho.M[1][3] = -projection.M[1][2];\n\n    if ( fabsf ( zNear - zFar ) < 0.001f )\n    {\n        ortho.M[2][0] = 0.0f;\n        ortho.M[2][1] = 0.0f;\n        ortho.M[2][2] = 0.0f;\n        ortho.M[2][3] = zFar;\n    }\n    else\n    {\n        ortho.M[2][0] = 0.0f;\n        ortho.M[2][1] = 0.0f;\n        ortho.M[2][2] = zFar / (zNear - zFar);\n        ortho.M[2][3] = (zFar * zNear) / (zNear - zFar);\n    }\n\n    // No perspective correction for ortho.\n    ortho.M[3][0] = 0.0f;\n    ortho.M[3][1] = 0.0f;\n    ortho.M[3][2] = 0.0f;\n    ortho.M[3][3] = 1.0f;\n\n    return ortho;\n}\n\n\n//-----------------------------------------------------------------------------------\n// A set of \"forward-mapping\" functions, mapping from framebuffer space to real-world and/or texture space.\n\n// This mimics the first half of the distortion shader's function.\nVector2f TransformScreenNDCToTanFovSpace( DistortionRenderDesc const &distortion,\n                                          const Vector2f &framebufferNDC )\n{\n    // Scale to TanHalfFov space, but still distorted.\n    Vector2f tanEyeAngleDistorted;\n    tanEyeAngleDistorted.x = ( framebufferNDC.x - distortion.LensCenter.x ) * distortion.TanEyeAngleScale.x;\n    tanEyeAngleDistorted.y = ( framebufferNDC.y - distortion.LensCenter.y ) * distortion.TanEyeAngleScale.y;\n    // Distort.\n    float radiusSquared = ( tanEyeAngleDistorted.x * tanEyeAngleDistorted.x )\n                        + ( tanEyeAngleDistorted.y * tanEyeAngleDistorted.y );\n    float distortionScale = distortion.Lens.DistortionFnScaleRadiusSquared ( radiusSquared );\n    Vector2f tanEyeAngle;\n    tanEyeAngle.x = tanEyeAngleDistorted.x * distortionScale;\n    tanEyeAngle.y = tanEyeAngleDistorted.y * distortionScale;\n\n    return tanEyeAngle;\n}\n\n// Same, with chromatic aberration correction.\nvoid TransformScreenNDCToTanFovSpaceChroma ( Vector2f *resultR, Vector2f *resultG, Vector2f *resultB, \n                                             DistortionRenderDesc const &distortion,\n                                             const Vector2f &framebufferNDC )\n{\n    // Scale to TanHalfFov space, but still distorted.\n    Vector2f tanEyeAngleDistorted;\n    tanEyeAngleDistorted.x = ( framebufferNDC.x - distortion.LensCenter.x ) * distortion.TanEyeAngleScale.x;\n    tanEyeAngleDistorted.y = ( framebufferNDC.y - distortion.LensCenter.y ) * distortion.TanEyeAngleScale.y;\n    // Distort.\n    float radiusSquared = ( tanEyeAngleDistorted.x * tanEyeAngleDistorted.x )\n                        + ( tanEyeAngleDistorted.y * tanEyeAngleDistorted.y );\n    Vector3f distortionScales = distortion.Lens.DistortionFnScaleRadiusSquaredChroma ( radiusSquared );\n    *resultR = tanEyeAngleDistorted * distortionScales.x;\n    *resultG = tanEyeAngleDistorted * distortionScales.y;\n    *resultB = tanEyeAngleDistorted * distortionScales.z;\n}\n\n// This mimics the second half of the distortion shader's function.\nVector2f TransformTanFovSpaceToRendertargetTexUV( ScaleAndOffset2D const &eyeToSourceUV,\n                                                  Vector2f const &tanEyeAngle )\n{\n    Vector2f textureUV;\n    textureUV.x = tanEyeAngle.x * eyeToSourceUV.Scale.x + eyeToSourceUV.Offset.x;\n    textureUV.y = tanEyeAngle.y * eyeToSourceUV.Scale.y + eyeToSourceUV.Offset.y;\n    return textureUV;\n}\n\nVector2f TransformTanFovSpaceToRendertargetNDC( ScaleAndOffset2D const &eyeToSourceNDC,\n                                                Vector2f const &tanEyeAngle )\n{\n    Vector2f textureNDC;\n    textureNDC.x = tanEyeAngle.x * eyeToSourceNDC.Scale.x + eyeToSourceNDC.Offset.x;\n    textureNDC.y = tanEyeAngle.y * eyeToSourceNDC.Scale.y + eyeToSourceNDC.Offset.y;\n    return textureNDC;\n}\n\nVector2f TransformScreenPixelToScreenNDC( Recti const &distortionViewport,\n                                          Vector2f const &pixel )\n{\n    // Move to [-1,1] NDC coords.\n    Vector2f framebufferNDC;\n    framebufferNDC.x = -1.0f + 2.0f * ( ( pixel.x - (float)distortionViewport.x ) / (float)distortionViewport.w );\n    framebufferNDC.y = -1.0f + 2.0f * ( ( pixel.y - (float)distortionViewport.y ) / (float)distortionViewport.h );\n    return framebufferNDC;\n}\n\nVector2f TransformScreenPixelToTanFovSpace( Recti const &distortionViewport,\n                                            DistortionRenderDesc const &distortion,\n                                            Vector2f const &pixel )\n{\n    return TransformScreenNDCToTanFovSpace( distortion,\n                TransformScreenPixelToScreenNDC( distortionViewport, pixel ) );\n}\n\nVector2f TransformScreenNDCToRendertargetTexUV( DistortionRenderDesc const &distortion,\n                                                StereoEyeParams const &eyeParams,\n                                                Vector2f const &pixel )\n{\n    return TransformTanFovSpaceToRendertargetTexUV ( eyeParams,\n                TransformScreenNDCToTanFovSpace ( distortion, pixel ) );\n}\n\nVector2f TransformScreenPixelToRendertargetTexUV( Recti const &distortionViewport,\n                                                  DistortionRenderDesc const &distortion,\n                                                  StereoEyeParams const &eyeParams,\n                                                  Vector2f const &pixel )\n{\n    return TransformTanFovSpaceToRendertargetTexUV ( eyeParams,\n                TransformScreenPixelToTanFovSpace ( distortionViewport, distortion, pixel ) );\n}\n\n\n//-----------------------------------------------------------------------------------\n// A set of \"reverse-mapping\" functions, mapping from real-world and/or texture space back to the framebuffer.\n\nVector2f TransformTanFovSpaceToScreenNDC( DistortionRenderDesc const &distortion,\n                                          const Vector2f &tanEyeAngle, bool usePolyApprox /*= false*/ )\n{\n    float tanEyeAngleRadius = tanEyeAngle.Length();\n    float tanEyeAngleDistortedRadius = distortion.Lens.DistortionFnInverseApprox ( tanEyeAngleRadius );\n    if ( !usePolyApprox )\n    {\n        tanEyeAngleDistortedRadius = distortion.Lens.DistortionFnInverse ( tanEyeAngleRadius );\n    }\n    Vector2f tanEyeAngleDistorted = tanEyeAngle;\n    if ( tanEyeAngleRadius > 0.0f )\n    {   \n        tanEyeAngleDistorted = tanEyeAngle * ( tanEyeAngleDistortedRadius / tanEyeAngleRadius );\n    }\n\n    Vector2f framebufferNDC;\n    framebufferNDC.x = ( tanEyeAngleDistorted.x / distortion.TanEyeAngleScale.x ) + distortion.LensCenter.x;\n    framebufferNDC.y = ( tanEyeAngleDistorted.y / distortion.TanEyeAngleScale.y ) + distortion.LensCenter.y;\n\n    return framebufferNDC;\n}\n\nVector2f TransformRendertargetNDCToTanFovSpace( const ScaleAndOffset2D &eyeToSourceNDC,\n                                                const Vector2f &textureNDC )\n{\n    Vector2f tanEyeAngle = (textureNDC - eyeToSourceNDC.Offset) / eyeToSourceNDC.Scale;\n    return tanEyeAngle;\n}\n\n\n\n} //namespace OVR\n\n//Just want to make a copy disentangled from all these namespaces!\nfloat ExtEvalCatmullRom10Spline ( float const *K, float scaledVal )\n{\n\treturn(OVR::EvalCatmullRom10Spline ( K, scaledVal ));\n}\n\n\n"
  },
  {
    "path": "externals/ovr/Src/OVR_Stereo.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Stereo.h\nContent     :   Stereo rendering functions\nCreated     :   November 30, 2013\nAuthors     :   Tom Fosyth\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Stereo_h\n#define OVR_Stereo_h\n\n#include \"Sensors/OVR_DeviceConstants.h\"\n#include \"Displays/OVR_Display.h\"\n#include \"OVR_Profile.h\"\n\n// CAPI Forward declaration.\ntypedef struct ovrFovPort_ ovrFovPort;\ntypedef struct ovrRecti_ ovrRecti;\n\nnamespace OVR {\n\nclass SensorDevice; // Opaque forward declaration\n\n\n//-----------------------------------------------------------------------------------\n// ***** Stereo Enumerations\n\n// StereoEye specifies which eye we are rendering for; it is used to\n// retrieve StereoEyeParams.\nenum StereoEye\n{\n    StereoEye_Center,\n    StereoEye_Left,\n    StereoEye_Right    \n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** FovPort\n\n// FovPort describes Field Of View (FOV) of a viewport.\n// This class has values for up, down, left and right, stored in \n// tangent of the angle units to simplify calculations.\n//\n// As an example, for a standard 90 degree vertical FOV, we would \n// have: { UpTan = tan(90 degrees / 2), DownTan = tan(90 degrees / 2) }.\n//\n// CreateFromRadians/Degrees helper functions can be used to\n// access FOV in different units.\n\nstruct FovPort\n{\n    float UpTan;\n    float DownTan;\n    float LeftTan;\n    float RightTan;\n\n    FovPort ( float sideTan = 0.0f ) :\n        UpTan(sideTan), DownTan(sideTan), LeftTan(sideTan), RightTan(sideTan) { }\n    FovPort ( float u, float d, float l, float r ) :\n        UpTan(u), DownTan(d), LeftTan(l), RightTan(r) { }\n\n    // C-interop support: FovPort <-> ovrFovPort (implementation in OVR_CAPI.cpp).\n    FovPort(const ovrFovPort& src);\n    operator ovrFovPort () const;\n\n    static FovPort CreateFromRadians(float horizontalFov, float verticalFov)\n    {\n        FovPort result;\n        result.UpTan    = tanf (   verticalFov * 0.5f );\n        result.DownTan  = tanf (   verticalFov * 0.5f );\n        result.LeftTan  = tanf ( horizontalFov * 0.5f );\n        result.RightTan = tanf ( horizontalFov * 0.5f );\n        return result;\n    }\n\n    static FovPort CreateFromDegrees(float horizontalFovDegrees,\n                                     float verticalFovDegrees)\n    {\n        return CreateFromRadians(DegreeToRad(horizontalFovDegrees),\n                                 DegreeToRad(verticalFovDegrees));\n    }\n\n    //  Get Horizontal/Vertical components of Fov in radians.\n    float GetVerticalFovRadians() const     { return atanf(UpTan)    + atanf(DownTan); }\n    float GetHorizontalFovRadians() const   { return atanf(LeftTan)  + atanf(RightTan); }\n    //  Get Horizontal/Vertical components of Fov in degrees.\n    float GetVerticalFovDegrees() const     { return RadToDegree(GetVerticalFovRadians()); }\n    float GetHorizontalFovDegrees() const   { return RadToDegree(GetHorizontalFovRadians()); }\n\n    // Compute maximum tangent value among all four sides.\n    float GetMaxSideTan() const\n    {\n        return Alg::Max(Alg::Max(UpTan, DownTan), Alg::Max(LeftTan, RightTan));\n    }\n\n    // Converts Fov Tan angle units to [-1,1] render target NDC space\n    Vector2f TanAngleToRendertargetNDC(Vector2f const &tanEyeAngle);\n\n\n    // Compute per-channel minimum and maximum of Fov.\n    static FovPort Min(const FovPort& a, const FovPort& b)\n    {   \n        FovPort fov( Alg::Min( a.UpTan   , b.UpTan    ),   \n                     Alg::Min( a.DownTan , b.DownTan  ),\n                     Alg::Min( a.LeftTan , b.LeftTan  ),\n                     Alg::Min( a.RightTan, b.RightTan ) );\n        return fov;\n    }\n\n    static FovPort Max(const FovPort& a, const FovPort& b)\n    {   \n        FovPort fov( Alg::Max( a.UpTan   , b.UpTan    ),   \n                     Alg::Max( a.DownTan , b.DownTan  ),\n                     Alg::Max( a.LeftTan , b.LeftTan  ),\n                     Alg::Max( a.RightTan, b.RightTan ) );\n        return fov;\n    }\n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** ScaleAndOffset\n\nstruct ScaleAndOffset2D\n{\n    Vector2f Scale;\n    Vector2f Offset;\n\n    ScaleAndOffset2D(float sx = 0.0f, float sy = 0.0f, float ox = 0.0f, float oy = 0.0f)\n      : Scale(sx, sy), Offset(ox, oy)        \n    { }\n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** Misc. utility functions.\n\n// Inputs are 4 points (pFitX[0],pFitY[0]) through (pFitX[3],pFitY[3])\n// Result is four coefficients in pResults[0] through pResults[3] such that\n//      y = pResult[0] + x * ( pResult[1] + x * ( pResult[2] + x * ( pResult[3] ) ) );\n// passes through all four input points.\n// Return is true if it succeeded, false if it failed (because two control points\n// have the same pFitX value).\nbool FitCubicPolynomial ( float *pResult, const float *pFitX, const float *pFitY );\n\n//-----------------------------------------------------------------------------------\n// ***** LensConfig\n\n// LensConfig describes the configuration of a single lens in an HMD.\n// - Eqn and K[] describe a distortion function.\n// - MetersPerTanAngleAtCenter is the relationship between distance on a\n//   screen (at the center of the lens), and the angle variance of the light after it\n//   has passed through the lens.\n// - ChromaticAberration is an array of parameters for controlling\n//   additional Red and Blue scaling in order to reduce chromatic aberration\n//   caused by the Rift lenses.\nstruct LensConfig\n{\n    LensConfig()\n      : Eqn(Distortion_CatmullRom10)\n      //K()\n      , MaxR(0.0f)\n      , MetersPerTanAngleAtCenter(0.0f)\n      //ChromaticAberration()\n      //InvK()\n      , MaxInvR(0.0f)\n    {\n        memset(&K, 0, sizeof(K));\n        memset(&ChromaticAberration, 0, sizeof(ChromaticAberration));\n        memset(&InvK, 0, sizeof(InvK));\n    }\n    \n    // The result is a scaling applied to the distance from the center of the lens.\n    float    DistortionFnScaleRadiusSquared (float rsq) const;\n    // x,y,z components map to r,g,b scales.\n    Vector3f DistortionFnScaleRadiusSquaredChroma (float rsq) const;\n\n    // DistortionFn applies distortion to the argument.\n    // Input: the distance in TanAngle/NIC space from the optical center to the input pixel.\n    // Output: the resulting distance after distortion.\n    float DistortionFn(float r) const\n    {\n        return r * DistortionFnScaleRadiusSquared ( r * r );\n    }\n\n    // DistortionFnInverse computes the inverse of the distortion function on an argument.\n    float DistortionFnInverse(float r) const;\n\n    // Also computes the inverse, but using a polynomial approximation. Warning - it's just an approximation!\n    float DistortionFnInverseApprox(float r) const;\n    // Sets up InvK[].\n    void SetUpInverseApprox();\n\n    // Sets a bunch of sensible defaults.\n    void SetToIdentity();\n\n\n\n    enum { NumCoefficients = 11 };\n\n    DistortionEqnType   Eqn;\n    float               K[NumCoefficients];\n    float               MaxR;       // The highest R you're going to query for - the curve is unpredictable beyond it.\n\n    float               MetersPerTanAngleAtCenter;\n\n    // Additional per-channel scaling is applied after distortion:\n    //  Index [0] - Red channel constant coefficient.\n    //  Index [1] - Red channel r^2 coefficient.\n    //  Index [2] - Blue channel constant coefficient.\n    //  Index [3] - Blue channel r^2 coefficient.\n    float               ChromaticAberration[4];\n\n    float               InvK[NumCoefficients];\n    float               MaxInvR;\n};\n\n\n// For internal use - storing and loading lens config data\n\n// Returns true on success.\nbool LoadLensConfig ( LensConfig *presult, uint8_t const *pbuffer, int bufferSizeInBytes );\n\n// Returns number of bytes needed.\nint SaveLensConfigSizeInBytes ( LensConfig const &config );\n// Returns true on success.\nbool SaveLensConfig ( uint8_t *pbuffer, int bufferSizeInBytes, LensConfig const &config );\n\n\n//-----------------------------------------------------------------------------------\n// ***** DistortionRenderDesc\n\n// This describes distortion for a single eye in an HMD with a display, not just the lens by itself.\nstruct DistortionRenderDesc\n{\n    // The raw lens values.\n    LensConfig          Lens;\n\n    // These map from [-1,1] across the eye being rendered into TanEyeAngle space (but still distorted)\n    Vector2f            LensCenter;\n    Vector2f            TanEyeAngleScale;\n    // Computed from device characteristics, IPD and eye-relief.\n    // (not directly used for rendering, but very useful)\n    Vector2f            PixelsPerTanAngleAtCenter;\n};\n\n\n//-------------------------------------------------------------------------------------\n// ***** HMDInfo \n\n// This structure describes various aspects of the HMD allowing us to configure rendering.\n//\n//  Currently included data:\n//   - Physical screen dimensions, resolution, and eye distances.\n//     (some of these will be configurable with a tool in the future).\n//     These arguments allow us to properly setup projection across HMDs.\n//   - DisplayDeviceName for identifying HMD screen; system-specific interpretation.\n//\n// TBD:\n//  - Power on/ off?\n//  - Sensor rates and capabilities\n//  - Distortion radius/variables    \n//  - Screen update frequency\n//  - Distortion needed flag\n//  - Update modes:\n//      Set update mode: Stereo (both sides together), mono (same in both eyes),\n//                       Alternating, Alternating scan-lines.\n\n// Win32 Oculus VR Display Driver Shim Information\nstruct Win32ShimInfo\n{\n\tint DeviceNumber;\n\tint NativeWidth;\n\tint NativeHeight;\n\tint Rotation;\n\tint UseMirroring;\n\n\tWin32ShimInfo() :\n\t\tDeviceNumber(-1),\n\t\tNativeWidth(-1),\n\t\tNativeHeight(-1),\n\t\tRotation(-1),\n\t\tUseMirroring(1)\n\t{\n\t}\n};\n\nclass HMDInfo\n{\npublic:\n\t// Name string describing the product: \"Oculus Rift DK1\", etc.\n\tString      ProductName;\n\tString      Manufacturer;\n\n\tunsigned    Version;\n\n\t// Characteristics of the HMD screen and enclosure\n\tHmdTypeEnum HmdType;\n\tSize<int>   ResolutionInPixels;\n\tSize<float> ScreenSizeInMeters;\n\tfloat       ScreenGapSizeInMeters;\n\tfloat       CenterFromTopInMeters;\n\tfloat       LensSeparationInMeters;\n    Vector2f    PelOffsetR;                     // Offsets from the green pel in pixels (i.e. usual values are 0.5 or 0.333)\n    Vector2f    PelOffsetB;\n\n\n\t// Timing & shutter data. All values in seconds.\n\tstruct ShutterInfo\n\t{\n\t\tHmdShutterTypeEnum  Type;\n\t\tfloat   VsyncToNextVsync;                // 1/framerate\n\t\tfloat   VsyncToFirstScanline;            // for global shutter, vsync->shutter open.\n\t\tfloat   FirstScanlineToLastScanline;     // for global shutter, will be zero.\n\t\tfloat   PixelSettleTime;                 // estimated.\n\t\tfloat   PixelPersistence;                // Full persistence = 1/framerate.\n\t}           Shutter;\n\n\t// Desktop coordinate position of the screen (can be negative; may not be present on all platforms)\n\tint         DesktopX;\n\tint         DesktopY;\n\n\t// Windows:\n\t// \"\\\\\\\\.\\\\DISPLAY3\", etc. Can be used in EnumDisplaySettings/CreateDC.\n\tString      DisplayDeviceName;\n\tWin32ShimInfo ShimInfo;\n\n\t// MacOS:\n\tint         DisplayId;\n\n\tbool\t    InCompatibilityMode;\n\n\t// Printed serial number for the HMD; should match external sticker\n    String      PrintedSerial;\n\n    // Tracker descriptor information:\n    int         VendorId;\n    int         ProductId;\n    int         FirmwareMajor;\n    int         FirmwareMinor;\n\n    float   CameraFrustumHFovInRadians;\n    float   CameraFrustumVFovInRadians;\n    float   CameraFrustumNearZInMeters;\n    float   CameraFrustumFarZInMeters;\n\n\t// Constructor initializes all values to 0s.\n\t// To create a \"virtualized\" HMDInfo, use CreateDebugHMDInfo instead.\n\tHMDInfo() :\n\t\tProductName(),\n        Manufacturer(),\n        Version(0),\n\t\tHmdType(HmdType_None),\n\t\tResolutionInPixels(0),\n\t\tScreenSizeInMeters(0.0f),\n\t\tScreenGapSizeInMeters(0.0f),\n\t\tCenterFromTopInMeters(0),\n\t\tLensSeparationInMeters(0),\n        PelOffsetR(0.0f,0.0f),\n        PelOffsetB(0.0f,0.0f),\n      //Shutter (initialized below)\n\t\tDesktopX(0),\n\t\tDesktopY(0),\n        DisplayDeviceName(),\n        ShimInfo(),\n\t\tDisplayId(-1),\n\t\tInCompatibilityMode(false),\n        PrintedSerial(),\n        VendorId(-1),\n        ProductId(-1),\n        FirmwareMajor(-1),\n        FirmwareMinor(-1),\n        CameraFrustumHFovInRadians(0.0f),\n        CameraFrustumVFovInRadians(0.0f),\n        CameraFrustumNearZInMeters(0.0f),\n        CameraFrustumFarZInMeters(0.0f)\n\t{\n\t\tShutter.Type = HmdShutter_LAST;\n\t\tShutter.VsyncToNextVsync = 0.0f;\n\t\tShutter.VsyncToFirstScanline = 0.0f;\n\t\tShutter.FirstScanlineToLastScanline = 0.0f;\n\t\tShutter.PixelSettleTime = 0.0f;\n\t\tShutter.PixelPersistence = 0.0f;\n    }\n\n\t// Operator = copies local fields only (base class must be correct already)\n\tvoid operator=(const HMDInfo& src)\n\t{\n\t\tProductName = src.ProductName;\n\t\tManufacturer = src.Manufacturer;\n\t\tVersion = src.Version;\n\t\tHmdType = src.HmdType;\n\t\tResolutionInPixels = src.ResolutionInPixels;\n\t\tScreenSizeInMeters = src.ScreenSizeInMeters;\n\t\tScreenGapSizeInMeters = src.ScreenGapSizeInMeters;\n\t\tCenterFromTopInMeters = src.CenterFromTopInMeters;\n\t\tLensSeparationInMeters = src.LensSeparationInMeters;\n        PelOffsetR = src.PelOffsetR;\n        PelOffsetB = src.PelOffsetB;\n\t\tDesktopX = src.DesktopX;\n\t\tDesktopY = src.DesktopY;\n\t\tShutter = src.Shutter;\n\t\tDisplayDeviceName = src.DisplayDeviceName;\n\t\tShimInfo = src.ShimInfo;\n\t\tDisplayId = src.DisplayId;\n\t\tInCompatibilityMode = src.InCompatibilityMode;\n        VendorId = src.VendorId;\n        ProductId = src.ProductId;\n        FirmwareMajor = src.FirmwareMajor;\n        FirmwareMinor = src.FirmwareMinor;\n        PrintedSerial = src.PrintedSerial;\n        CameraFrustumHFovInRadians = src.CameraFrustumHFovInRadians;\n        CameraFrustumVFovInRadians = src.CameraFrustumVFovInRadians;\n        CameraFrustumNearZInMeters = src.CameraFrustumNearZInMeters;\n        CameraFrustumFarZInMeters = src.CameraFrustumFarZInMeters;\n    }\n\n\tvoid SetScreenParameters(int hres, int vres,\n\t\t\t\t\t\t\t float hsize, float vsize,\n\t\t\t\t\t\t\t float vCenterFromTopInMeters, float lensSeparationInMeters,\n\t\t\t\t\t\t\t bool compatibilityMode)\n\t{\n\t\tResolutionInPixels = Sizei(hres, vres);\n\t\tScreenSizeInMeters = Sizef(hsize, vsize);\n\t\tCenterFromTopInMeters = vCenterFromTopInMeters;\n\t\tLensSeparationInMeters = lensSeparationInMeters;\n\t\tInCompatibilityMode = compatibilityMode;\n\t}\n\n\tbool IsSameDisplay(const HMDInfo& o) const\n\t{\n\t\treturn DisplayId == o.DisplayId &&\n\t\t\tDisplayDeviceName.CompareNoCase(o.DisplayDeviceName) == 0;\n\t}\n\n\tstatic bool CreateFromSensorAndDisplay(SensorDevice* sensor, Display* display, HMDInfo* hmdi);\n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** HmdRenderInfo\n\n// All the parts of the HMD info that are needed to set up the rendering system.\n\nstruct HmdRenderInfo\n{\n    // The start of this structure is intentionally very similar to HMDInfo in OVER_Device.h\n    // However to reduce interdependencies, one does not simply #include the other.\n\n    HmdTypeEnum HmdType;\n\n    // Size of the entire screen\n    Size<int>   ResolutionInPixels;\n    Size<float> ScreenSizeInMeters;\n    float       ScreenGapSizeInMeters;\n    Vector2f    PelOffsetR;                     // Offsets from the green pel in pixels (i.e. usual values are 0.5 or 0.333)\n    Vector2f    PelOffsetB;\n\n    // Characteristics of the lenses.\n    float       CenterFromTopInMeters;\n    float       LensSeparationInMeters;\n    float       LensDiameterInMeters;\n    float       LensSurfaceToMidplateInMeters;\n    EyeCupType  EyeCups;\n\n    // Timing & shutter data. All values in seconds.\n    struct ShutterInfo\n    {\n        HmdShutterTypeEnum  Type;\n        float               VsyncToNextVsync;                // 1/framerate\n        float               VsyncToFirstScanline;            // for global shutter, vsync->shutter open.\n        float               FirstScanlineToLastScanline;     // for global shutter, will be zero.\n        float               PixelSettleTime;                 // estimated.\n        float               PixelPersistence;                // Full persistence = 1/framerate.\n    }           Shutter;\n\n\n    // These are all set from the user's profile.\n    struct EyeConfig\n    {\n        // Distance from center of eyeball to front plane of lens.\n        float               ReliefInMeters;\n        // Distance from nose (technically, center of Rift) to the middle of the eye.\n        float               NoseToPupilInMeters;\n\n        LensConfig          Distortion;\n    } EyeLeft, EyeRight;\n\n\n    HmdRenderInfo()\n    {\n        HmdType = HmdType_None;\n        ResolutionInPixels.w = 0;\n        ResolutionInPixels.h = 0;\n        ScreenSizeInMeters.w = 0.0f;\n        ScreenSizeInMeters.h = 0.0f;\n        ScreenGapSizeInMeters = 0.0f;\n        CenterFromTopInMeters = 0.0f;\n        LensSeparationInMeters = 0.0f;\n        LensDiameterInMeters = 0.0f;\n        LensSurfaceToMidplateInMeters = 0.0f;\n        PelOffsetR = Vector2f ( 0.0f, 0.0f );\n        PelOffsetB = Vector2f ( 0.0f, 0.0f );\n        Shutter.Type = HmdShutter_LAST;\n        Shutter.VsyncToNextVsync = 0.0f;\n        Shutter.VsyncToFirstScanline = 0.0f;\n        Shutter.FirstScanlineToLastScanline = 0.0f;\n        Shutter.PixelSettleTime = 0.0f;\n        Shutter.PixelPersistence = 0.0f;\n        EyeCups = EyeCup_DK1A;\n        EyeLeft.ReliefInMeters = 0.0f;\n        EyeLeft.NoseToPupilInMeters = 0.0f;\n        EyeLeft.Distortion.SetToIdentity();\n        EyeRight = EyeLeft;\n    }\n\n    // The \"center eye\" is the position the HMD tracking returns,\n    // and games will also usually use it for audio, aiming reticles, some line-of-sight tests, etc.\n    EyeConfig GetEyeCenter() const\n    {\n        EyeConfig result;\n        result.ReliefInMeters = 0.5f * ( EyeLeft.ReliefInMeters + EyeRight.ReliefInMeters );\n        result.NoseToPupilInMeters = 0.0f;\n        result.Distortion.SetToIdentity();\n        return result;\n    }\n\n};\n\n\n//-----------------------------------------------------------------------------------\n\n// Stateless computation functions, in somewhat recommended execution order.\n// For examples on how to use many of them, see the StereoConfig::UpdateComputedState function.\n\nconst float OVR_DEFAULT_EXTRA_EYE_ROTATION = 30.0f * MATH_FLOAT_DEGREETORADFACTOR;\n\n// Creates a dummy debug HMDInfo matching a particular HMD model.\n// Useful for development without an actual HMD attached.\nHMDInfo             CreateDebugHMDInfo(HmdTypeEnum hmdType);\n\n\n// profile may be NULL, in which case it uses the hard-coded defaults.\n// distortionType should be left at the default unless you require something specific for your distortion shaders.\n// eyeCupOverride can be EyeCup_LAST, in which case it uses the one in the profile.\nHmdRenderInfo       GenerateHmdRenderInfoFromHmdInfo ( HMDInfo const &hmdInfo,\n                                                       Profile const *profile = NULL,\n                                                       DistortionEqnType distortionType = Distortion_CatmullRom10,\n                                                       EyeCupType eyeCupOverride = EyeCup_LAST );\n\nLensConfig          GenerateLensConfigFromEyeRelief ( float eyeReliefInMeters, HmdRenderInfo const &hmd,\n                                                      DistortionEqnType distortionType = Distortion_CatmullRom10 );\n\nDistortionRenderDesc CalculateDistortionRenderDesc ( StereoEye eyeType, HmdRenderInfo const &hmd,\n                                                     LensConfig const *pLensOverride = NULL );\n\nFovPort             CalculateFovFromEyePosition ( float eyeReliefInMeters,\n                                                  float offsetToRightInMeters,\n                                                  float offsetDownwardsInMeters,\n                                                  float lensDiameterInMeters,\n                                                  float extraEyeRotationInRadians = OVR_DEFAULT_EXTRA_EYE_ROTATION);\n\nFovPort             CalculateFovFromHmdInfo ( StereoEye eyeType,\n                                              DistortionRenderDesc const &distortion,\n                                              HmdRenderInfo const &hmd,\n                                              float extraEyeRotationInRadians = OVR_DEFAULT_EXTRA_EYE_ROTATION );\n\nFovPort             GetPhysicalScreenFov ( StereoEye eyeType, DistortionRenderDesc const &distortion );\n\nFovPort             ClampToPhysicalScreenFov ( StereoEye eyeType, DistortionRenderDesc const &distortion,\n                                               FovPort inputFovPort );\n\nSizei               CalculateIdealPixelSize ( StereoEye eyeType, DistortionRenderDesc const &distortion,\n                                              FovPort fov, float pixelsPerDisplayPixel );\n\nRecti               GetFramebufferViewport ( StereoEye eyeType, HmdRenderInfo const &hmd );\n\nMatrix4f            CreateProjection ( bool rightHanded, FovPort fov,\n                                       float zNear = 0.01f, float zFar = 10000.0f );\n\nMatrix4f            CreateOrthoSubProjection ( bool rightHanded, StereoEye eyeType,\n                                               float tanHalfFovX, float tanHalfFovY,\n                                               float unitsX, float unitsY, float distanceFromCamera,\n                                               float interpupillaryDistance, Matrix4f const &projection,\n                                               float zNear = 0.0f, float zFar = 0.0f );\n\nScaleAndOffset2D    CreateNDCScaleAndOffsetFromFov ( FovPort fov );\n\nScaleAndOffset2D    CreateUVScaleAndOffsetfromNDCScaleandOffset ( ScaleAndOffset2D scaleAndOffsetNDC,\n                                                                  Recti renderedViewport,\n                                                                  Sizei renderTargetSize );\n\n\n//-----------------------------------------------------------------------------------\n// ***** StereoEyeParams\n\n// StereoEyeParams describes RenderDevice configuration needed to render\n// the scene for one eye. \nstruct StereoEyeParams\n{\n    StereoEye               Eye;\n    Matrix4f                HmdToEyeViewOffset;         // Translation to be applied to view matrix.\n\n    // Distortion and the VP on the physical display - the thing to run the distortion shader on.\n    DistortionRenderDesc    Distortion;\n    Recti                   DistortionViewport;\n\n    // Projection and VP of a particular view (you could have multiple of these).\n    Recti                   RenderedViewport;       // Viewport that we render the standard scene to.\n    FovPort                 Fov;                    // The FOVs of this scene.\n    Matrix4f                RenderedProjection;     // Projection matrix used with this eye.\n    ScaleAndOffset2D        EyeToSourceNDC;         // Mapping from TanEyeAngle space to [-1,+1] on the rendered image.\n    ScaleAndOffset2D        EyeToSourceUV;          // Mapping from TanEyeAngle space to actual texture UV coords.\n};\n\n\n//-----------------------------------------------------------------------------------\n// A set of \"forward-mapping\" functions, mapping from framebuffer space to real-world and/or texture space.\nVector2f TransformScreenNDCToTanFovSpace ( DistortionRenderDesc const &distortion,\n                                           const Vector2f &framebufferNDC );\nvoid TransformScreenNDCToTanFovSpaceChroma ( Vector2f *resultR, Vector2f *resultG, Vector2f *resultB, \n                                             DistortionRenderDesc const &distortion,\n                                             const Vector2f &framebufferNDC );\nVector2f TransformTanFovSpaceToRendertargetTexUV ( ScaleAndOffset2D const &eyeToSourceUV,\n                                                   Vector2f const &tanEyeAngle );\nVector2f TransformTanFovSpaceToRendertargetNDC ( ScaleAndOffset2D const &eyeToSourceNDC,\n                                                 Vector2f const &tanEyeAngle );\nVector2f TransformScreenPixelToScreenNDC( Recti const &distortionViewport,\n                                          Vector2f const &pixel );\nVector2f TransformScreenPixelToTanFovSpace ( Recti const &distortionViewport,\n                                             DistortionRenderDesc const &distortion,\n                                             Vector2f const &pixel );\nVector2f TransformScreenNDCToRendertargetTexUV( DistortionRenderDesc const &distortion,\n                                                StereoEyeParams const &eyeParams,\n                                                Vector2f const &pixel );\nVector2f TransformScreenPixelToRendertargetTexUV( Recti const &distortionViewport,\n                                                  DistortionRenderDesc const &distortion,\n                                                  StereoEyeParams const &eyeParams,\n                                                  Vector2f const &pixel );\n\n// A set of \"reverse-mapping\" functions, mapping from real-world and/or texture space back to the framebuffer.\n// Be aware that many of these are significantly slower than their forward-mapping counterparts.\nVector2f TransformTanFovSpaceToScreenNDC( DistortionRenderDesc const &distortion,\n                                          const Vector2f &tanEyeAngle, bool usePolyApprox = false );\nVector2f TransformRendertargetNDCToTanFovSpace( const ScaleAndOffset2D &eyeToSourceNDC,\n                                                const Vector2f &textureNDC );\n\n// Handy wrappers.\ninline Vector2f TransformTanFovSpaceToRendertargetTexUV ( StereoEyeParams const &eyeParams,\n                                                          Vector2f const &tanEyeAngle )\n{\n    return TransformTanFovSpaceToRendertargetTexUV ( eyeParams.EyeToSourceUV, tanEyeAngle );\n}\ninline Vector2f TransformTanFovSpaceToRendertargetNDC ( StereoEyeParams const &eyeParams,\n                                                        Vector2f const &tanEyeAngle )\n{\n    return TransformTanFovSpaceToRendertargetNDC ( eyeParams.EyeToSourceNDC, tanEyeAngle );\n}\n\n} //namespace OVR\n\n#endif // OVR_Stereo_h\n"
  },
  {
    "path": "externals/ovr/Src/Sensors/OVR_DeviceConstants.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_DeviceConstants.h\nContent     :   Device constants\nCreated     :   February 5, 2013\nAuthors     :   Lee Cooper\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_DeviceConstants_h\n#define OVR_DeviceConstants_h\n\n#include \"../Kernel/OVR_Math.h\"\n\n// CAPI forward declarations.\nstruct ovrSensorData_;\ntypedef struct ovrSensorData_ ovrSensorData;\n\nnamespace OVR {\n\n\n//-------------------------------------------------------------------------------------\n// Different device types supported by OVR; this type is reported by DeviceBase::GetType.\n// \nenum DeviceType\n{\n    Device_None,\n    Device_Manager,\n    Device_Sensor,\n    Device_LatencyTester,\n    Device_BootLoader,\n    Device_All              = 0xFF // Set for enumeration only, to enumerate all device types.\n};\n\n\n\n//-------------------------------------------------------------------------------------\n// Different lens distortion types supported by devices.\n// \nenum DistortionEqnType\n{\n    Distortion_No_Override  = -1,    \n\t// These two are leagcy and deprecated.\n    Distortion_Poly4        = 0,    // scale = (K0 + K1*r^2 + K2*r^4 + K3*r^6)\n    Distortion_RecipPoly4   = 1,    // scale = 1/(K0 + K1*r^2 + K2*r^4 + K3*r^6)\n\n    // CatmullRom10 is the preferred distortion format.\n    Distortion_CatmullRom10 = 2,    // scale = Catmull-Rom spline through points (1.0, K[1]...K[9])\n\n    Distortion_LAST                 // For ease of enumeration.\n};\n\n\n//-------------------------------------------------------------------------------------\n// HMD types.\n//\nenum HmdTypeEnum\n{\n    HmdType_None,\n\n    HmdType_DKProto,            // First duct-tape model, never sold.\n    HmdType_DK1,                // DevKit1 - on sale to developers.\n    HmdType_DKHDProto,          // DKHD - shown at various shows, never sold.\n    HmdType_DKHD2Proto,         // DKHD2, 5.85-inch panel, never sold.\n    HmdType_DKHDProto566Mi,     // DKHD, 5.66-inch panel, never sold.\n    HmdType_CrystalCoveProto,   // Crystal Cove, 5.66-inch panel, shown at shows but never sold.\n    HmdType_DK2,\n\n    // Reminder - this header file is public - codenames only!\n\n    HmdType_Unknown,            // Used for unnamed HW lab experiments.\n\n    HmdType_LAST\n};\n\n\n//-------------------------------------------------------------------------------------\n// HMD shutter types.\n//\nenum HmdShutterTypeEnum\n{\n    HmdShutter_Global,\n    HmdShutter_RollingTopToBottom,\n    HmdShutter_RollingLeftToRight,\n    HmdShutter_RollingRightToLeft,\n    // TODO:\n    // color-sequential e.g. LCOS?\n    // alternate eyes?\n    // alternate columns?\n    // outside-in?\n\n    HmdShutter_LAST\n};\n\n\n\n//-------------------------------------------------------------------------------------\n// For headsets that use eye cups\n//\nenum EyeCupType\n{\n    // Public lenses\n    EyeCup_DK1A = 0,\n    EyeCup_DK1B = 1,\n    EyeCup_DK1C = 2,\n\n    EyeCup_DK2A = 3,\n\n    // Internal R&D codenames.\n    // Reminder - this header file is public - codenames only!\n    EyeCup_DKHD2A,\n    EyeCup_OrangeA,\n    EyeCup_RedA,\n    EyeCup_PinkA,\n    EyeCup_BlueA,\n    EyeCup_Delilah1A,\n    EyeCup_Delilah2A,\n    EyeCup_JamesA,\n    EyeCup_SunMandalaA,\n\n    EyeCup_LAST\n};\n\n\n//-----------------------------------------------------------------------------\n// BodyFrameState\n//\n#pragma pack(push, 8)\n\nclass SensorDataType\n{\npublic:\n\n    SensorDataType() : Temperature(0.0f), AbsoluteTimeSeconds(0.0) { }\n\n    // C-interop support\n    SensorDataType(const ovrSensorData& s);\n    operator ovrSensorData () const;\n\n    Vector3f Acceleration;     // in m/s^2\n    Vector3f RotationRate;     // in rad/s\n    Vector3f MagneticField;    // in Gauss\n\n    float    Temperature;      // in degrees Celsius\n\n    // The absolute time from the host computers perspective that the message should be\n    // interpreted as. This is based on incoming timestamp and processed by a filter\n    // that syncs the clocks while attempting to keep the distance between messages\n    // device clock matching.\n    //\n    // Integration should use TimeDelta, but prediction into the future should derive\n    // the delta time from PredictToSeconds - AbsoluteTimeSeconds.\n    //\n    // This value will generally be <= the return from a call to ovr_GetTimeInSeconds(),\n    // but could be greater by under 1 ms due to system time update interrupt delays.\n    //\n    double   AbsoluteTimeSeconds;\n};\n\nstatic_assert((sizeof(SensorDataType) == 3*sizeof(Vector3f) + sizeof(float) + sizeof(double)), \"sizeof(SensorDataType) failure\");\n\n#pragma pack(pop)\n\n\n} // namespace OVR\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Service/Service_NetClient.cpp",
    "content": "/************************************************************************************\n\nFilename    :   Service_NetClient.cpp\nContent     :   Client for service interface\nCreated     :   June 12, 2014\nAuthors     :   Michael Antonov, Kevin Jenkins, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"Service_NetClient.h\"\n#include \"../Net/OVR_MessageIDTypes.h\"\n\n#if defined (OVR_OS_MAC) || defined(OVR_OS_LINUX)\n#define GetCurrentProcessId getpid\n#endif\nOVR_DEFINE_SINGLETON(OVR::Service::NetClient);\n\nnamespace OVR { namespace Service {\n\nusing namespace OVR::Net;\n\n\n//// NetClient\n\nNetClient::NetClient() :\n    LatencyTesterAvailable(false),\n    HMDCount(0),\n    EdgeTriggeredHMDCount(false)\n{\n    GetSession()->AddSessionListener(this);\n\n    // Register RPC functions\n    registerRPC();\n\n    Start();\n\n\t// Must be at end of function\n    PushDestroyCallbacks();\n}\n\nNetClient::~NetClient()\n{\n}\n\nvoid NetClient::OnSystemDestroy()\n{\n    onSystemDestroy();\n}\n\nvoid NetClient::OnThreadDestroy()\n{\n    onThreadDestroy();\n}\n\nint NetClient::Run()\n{\n    SetThreadName(\"NetClient\");\n\n    while (!Terminated)\n    {\n        // Note: There is no watchdog here because the watchdog is part of the private code\n\n        GetSession()->Poll(false);\n\n        if (GetSession()->GetActiveSocketsCount() == 0)\n        {\n            Thread::MSleep(10);\n        }\n    }\n\n    return 0;\n}\n\nvoid NetClient::OnReceive(ReceivePayload* pPayload, ListenerReceiveResult* lrrOut)\n{\n    OVR_UNUSED(lrrOut);\n    OVR_UNUSED(pPayload);\n}\n\nvoid NetClient::OnDisconnected(Connection* conn)\n{\n    OVR_UNUSED(conn);\n\n    OVR_DEBUG_LOG((\"[NetClient] Disconnected\"));\n\n    EdgeTriggeredHMDCount = false;\n}\n\nvoid NetClient::OnConnected(Connection* conn)\n{\n    OVR_UNUSED(conn);\n\n    OVR_DEBUG_LOG((\"[NetClient] Connected to a server running version %d.%d.%d (my version=%d.%d.%d)\",\n        conn->RemoteMajorVersion, conn->RemoteMinorVersion, conn->RemotePatchVersion,\n        RPCVersion_Major, RPCVersion_Minor, RPCVersion_Patch));\n\n    EdgeTriggeredHMDCount = false;\n}\n\nbool NetClient::Connect(bool blocking)\n{\n    // Set up bind parameters\n\tOVR::Net::BerkleyBindParameters bbp;\n\tbbp.Address = \"::1\"; // Bind to localhost only!\n    bbp.blockingTimeout = 5000;\n\tOVR::Net::SockAddr sa;\n\tsa.Set(\"::1\", VRServicePort, SOCK_STREAM);\n\n    // Attempt to connect\n    OVR::Net::SessionResult result = GetSession()->ConnectPTCP(&bbp, &sa, blocking);\n\n    // Already connected counts as success too\n    return result == Net::SessionResult_OK ||\n           result == Net::SessionResult_AlreadyConnected ||\n           result == Net::SessionResult_ConnectInProgress;\n}\n\nvoid NetClient::Disconnect()\n{\n    GetSession()->Shutdown();\n}\n\nbool NetClient::IsConnected(bool attemptReconnect, bool blockOnReconnect)\n{\n    // If it was able to connect,\n    if (GetSession()->GetConnectionCount() > 0)\n    {\n        return true;\n    }\n    else if (attemptReconnect)\n    {\n        // Attempt to connect here\n        Connect(blockOnReconnect);\n\n        // If it connected,\n        if (GetSession()->GetConnectionCount() > 0)\n        {\n            return true;\n        }\n    }\n\n    // No connections\n    return false;\n}\n\nvoid NetClient::GetLocalProtocolVersion(int& major, int& minor, int& patch)\n{\n    major = RPCVersion_Major;\n    minor = RPCVersion_Minor;\n    patch = RPCVersion_Patch;\n}\n\nbool NetClient::GetRemoteProtocolVersion(int& major, int& minor, int& patch)\n{\n    Ptr<Connection> conn = GetSession()->GetConnectionAtIndex(0);\n\n    if (conn)\n    {\n        major = conn->RemoteMajorVersion;\n        minor = conn->RemoteMinorVersion;\n        patch = conn->RemotePatchVersion;\n        return true;\n    }\n\n    return false;\n}\n\n\n//// NetClient API\n\nconst char* NetClient::GetStringValue(VirtualHmdId hmd, const char* key, const char* default_val)\n{\n    if (!IsConnected(true, true))\n    {\n        return \"\";\n    }\n\n\t// If a null value is provided,\n\tif (!default_val)\n\t{\n\t\tdefault_val = \"\";\n\t}\n\n    ProfileGetValue1_Str = default_val;\n\n    OVR::Net::BitStream bsOut, returnData;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n    bsOut.Write(default_val);\n    if (!GetRPC1()->CallBlocking(\"GetStringValue_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n\t\treturn \"\";\n    }\n    if (!returnData.Read(ProfileGetValue1_Str))\n    {\n        OVR_ASSERT(false);\n    }\n    return ProfileGetValue1_Str.ToCStr();\n}\nbool NetClient::GetBoolValue(VirtualHmdId hmd, const char* key, bool default_val)\n{\n    if (!IsConnected(true, true))\n    {\n        return default_val;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n    bsOut.Write(default_val);\n    if (!GetRPC1()->CallBlocking(\"GetBoolValue_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n\t\treturn default_val;\n    }\n    uint8_t out = 0;\n    if (!returnData.Read(out))\n    {\n        OVR_ASSERT(false);\n    }\n    return out != 0;\n}\nint NetClient::GetIntValue(VirtualHmdId hmd, const char* key, int default_val)\n{\n    if (!IsConnected(true, true))\n    {\n        return default_val;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n    bsOut.Write(default_val);\n    if (!GetRPC1()->CallBlocking(\"GetIntValue_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n\t\treturn default_val;\n    }\n    int32_t out = (int32_t)default_val;\n    if (!returnData.Read(out))\n    {\n        OVR_ASSERT(false);\n    }\n    return out;\n}\ndouble NetClient::GetNumberValue(VirtualHmdId hmd, const char* key, double default_val)\n{\n    if (!IsConnected(true, true))\n    {\n        return default_val;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n    bsOut.Write(default_val);\n    if (!GetRPC1()->CallBlocking(\"GetNumberValue_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n\t\treturn default_val;\n    }\n    double out = 0.;\n    returnData.Read(out);\n    return out;\n}\nint NetClient::GetNumberValues(VirtualHmdId hmd, const char* key, double* values, int num_vals)\n{\n    if (!IsConnected(true, true))\n    {\n        return 0;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n\n    int32_t w = (int32_t)num_vals;\n    bsOut.Write(w);\n\n    if (!GetRPC1()->CallBlocking(\"GetNumberValues_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n\t\treturn 0;\n    }\n\n    int32_t out = 0;\n    if (!returnData.Read(out))\n    {\n        OVR_ASSERT(false);\n    }\n    OVR_ASSERT(out >= 0 && out <= num_vals);\n    if (out < 0)\n    {\n        out = 0;\n    }\n    else if (out > num_vals)\n    {\n        out = num_vals;\n    }\n\n    for (int i = 0; i < out && i < num_vals; i++)\n    {\n        if (!returnData.Read(values[i]))\n        {\n            return i;\n        }\n    }\n\n    return out;\n}\n\nbool NetClient::SetStringValue(VirtualHmdId hmd, const char* key, const char* val)\n{\n    if (!IsConnected(true, true))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n\n    bsOut.Write(val);\n\n    if (!GetRPC1()->Signal(\"SetStringValue_1\", &bsOut, GetSession()->GetConnectionAtIndex(0)))\n    {\n        return false;\n    }\n\n    return true;\n}\n\nbool NetClient::SetBoolValue(VirtualHmdId hmd, const char* key, bool val)\n{\n    if (!IsConnected(true, true))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n\n    uint8_t b = val ? 1 : 0;\n    bsOut.Write(b);\n\n    if (!GetRPC1()->Signal(\"SetBoolValue_1\", &bsOut, GetSession()->GetConnectionAtIndex(0)))\n    {\n        return false;\n    }\n\n    return true;\n}\n\nbool NetClient::SetIntValue(VirtualHmdId hmd, const char* key, int val)\n{\n    if (!IsConnected(true, true))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n\n    int32_t w = (int32_t)val;\n    bsOut.Write(w);\n\n    if (!GetRPC1()->Signal(\"SetIntValue_1\", &bsOut, GetSession()->GetConnectionAtIndex(0)))\n    {\n        return false;\n    }\n\n    return true;\n}\n\nbool NetClient::SetNumberValue(VirtualHmdId hmd, const char* key, double val)\n{\n    if (!IsConnected(true, true))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n\n    bsOut.Write(val);\n\n    if (!GetRPC1()->Signal(\"SetNumberValue_1\", &bsOut, GetSession()->GetConnectionAtIndex(0)))\n    {\n        return false;\n    }\n\n    return true;\n}\n\nbool NetClient::SetNumberValues(VirtualHmdId hmd, const char* key, const double* vals, int num_vals)\n{\n    if (!IsConnected(true, true))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n\n    int32_t w_count = (int32_t)num_vals;\n    bsOut.Write(w_count);\n\n    for (int i = 0; i < num_vals; i++)\n    {\n        bsOut.Write(vals[i]);\n    }\n\n    if (!GetRPC1()->Signal(\"SetNumberValues_1\", &bsOut, GetSession()->GetConnectionAtIndex(0)))\n    {\n        return false;\n    }\n\n    return true;\n}\n\nint NetClient::Hmd_Detect()\n{\n    if (!IsConnected(true, false))\n    {\n        return 0;\n    }\n\n    // If using edge-triggered HMD counting,\n    if (EdgeTriggeredHMDCount)\n    {\n        // Return the last update from the server\n        return HMDCount;\n    }\n\n    // Otherwise: We need to ask the first time\n\n\tOVR::Net::BitStream bsOut, returnData;\n\n\tif (!GetRPC1()->CallBlocking(\"Hmd_Detect_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n\t{\n\t\treturn 0;\n\t}\n\n    int32_t out = 0;\n    if (!returnData.Read(out))\n    {\n        OVR_ASSERT(false);\n    }\n    HMDCount = out;\n    EdgeTriggeredHMDCount = true;\n\treturn out;\n}\n\nbool NetClient::Hmd_Create(int index, HMDNetworkInfo* netInfo)\n{\n    if (!IsConnected(true, true))\n    {\n        return false;\n    }\n\n\tOVR::Net::BitStream bsOut, returnData;\n\n    int32_t w = (int32_t)index;\n\tbsOut.Write(w);\n\n    // Need the Pid for driver mode\n    pid_t pid = GetCurrentProcessId();\n    bsOut.Write(pid);\n\n\tif (!GetRPC1()->CallBlocking(\"Hmd_Create_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n\t{\n\t\treturn false;\n\t}\n\n\treturn netInfo->Deserialize(&returnData);\n}\n\nbool NetClient::GetDriverMode(bool& driverInstalled, bool& compatMode, bool& hideDK1Mode)\n{\n    if (!IsConnected(true, true))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n\n    bsOut.Write(InvalidVirtualHmdId);\n\n    if (!GetRPC1()->CallBlocking(\"GetDriverMode_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return false;\n    }\n\n    int32_t w_driverInstalled = 0;\n    int32_t w_compatMode = 0;\n    int32_t w_hideDK1Mode = 0;\n    returnData.Read(w_driverInstalled);\n    returnData.Read(w_compatMode);\n    if (!returnData.Read(w_hideDK1Mode))\n    {\n        return false;\n    }\n\n    driverInstalled = w_driverInstalled != 0;\n    compatMode = w_compatMode != 0;\n    hideDK1Mode = w_hideDK1Mode != 0;\n    return true;\n}\n\nbool NetClient::SetDriverMode(bool compatMode, bool hideDK1Mode)\n{\n    if (!IsConnected(true, true))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n\n    bsOut.Write(InvalidVirtualHmdId);\n\n    int32_t w_compatMode, w_hideDK1Mode;\n    w_compatMode = compatMode ? 1 : 0;\n    w_hideDK1Mode = hideDK1Mode ? 1 : 0;\n    bsOut.Write(w_compatMode);\n    bsOut.Write(w_hideDK1Mode);\n\n    if (!GetRPC1()->CallBlocking(\"SetDriverMode_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return false;\n    }\n\n    int32_t out = 0;\n    if (!returnData.Read(out))\n    {\n        OVR_ASSERT(false);\n        return false;\n    }\n\n    return out != 0;\n}\n\nbool NetClient::Hmd_AttachToWindow(VirtualHmdId hmd, void* hWindow)\n{\n    if (!IsConnected(false, false))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut;\n    bsOut.Write(hmd);\n\n    #ifdef OVR_OS_LINUX\n    if (hWindow == NULL)\n    {\n        return false;\n    }\n    unsigned long hWinWord = *(unsigned long *)hWindow;\n    #else\n    UInt64 hWinWord = (UPInt)hWindow;\n    #endif\n    bsOut.Write(hWinWord);\n\n    if (!GetRPC1()->CallBlocking(\"Hmd_AttachToWindow_1\", &bsOut, GetSession()->GetConnectionAtIndex(0)))\n    {\n        return false;\n    }\n\n    return true;\n}\n\nvoid NetClient::Hmd_Release(VirtualHmdId hmd)\n{\n    if (!IsConnected(false, false))\n    {\n        return;\n    }\n\n\tOVR::Net::BitStream bsOut;\n\tbsOut.Write(hmd);\n\tbool result = GetRPC1()->CallBlocking(\"Hmd_Release_1\", &bsOut, GetSession()->GetConnectionAtIndex(0));\n    OVR_ASSERT_AND_UNUSED(result, result);\n}\n\nvoid NetClient::SetLastError(String str)\n{\n    Hmd_GetLastError_Str = str;\n}\n\n// Last string is cached locally.\nconst char* NetClient::Hmd_GetLastError(VirtualHmdId hmd)\n{\n    if (hmd == InvalidVirtualHmdId || !IsConnected(false, false))\n    {\n        return Hmd_GetLastError_Str.ToCStr();\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n\tbsOut.Write(hmd);\n    if (!GetRPC1()->CallBlocking(\"Hmd_GetLastError_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n\t{\n\t\treturn Hmd_GetLastError_Str.ToCStr();\n\t}\n    if (!returnData.Read(Hmd_GetLastError_Str))\n    {\n        OVR_ASSERT(false);\n    }\n\treturn Hmd_GetLastError_Str.ToCStr();\n}\n\n\n// Fills in description about HMD; this is the same as filled in by ovrHmd_Create.\n// The actual descriptor is a par\nbool NetClient::Hmd_GetHmdInfo(VirtualHmdId hmd, HMDInfo* hmdInfo)\n{\n    if (!IsConnected(false, false))\n    {\n        return false;\n    }\n\n\tOVR::Net::BitStream bsOut, returnData;\n\tbsOut.Write(hmd);\n\tif (!GetRPC1()->CallBlocking(\"Hmd_GetHmdInfo_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n\t{\n\t\treturn false;\n\t}\n\n    return NetSessionCommon::DeserializeHMDInfo(&returnData, hmdInfo);\n}\n\n\n//-------------------------------------------------------------------------------------\nunsigned int NetClient::Hmd_GetEnabledCaps(VirtualHmdId hmd)\n{\n    if (!IsConnected(false, false))\n    {\n        return 0;\n    }\n\n\tOVR::Net::BitStream bsOut, returnData;\n\tbsOut.Write(hmd);\n\tif (!GetRPC1()->CallBlocking(\"Hmd_GetEnabledCaps_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n\t{\n\t\treturn 0;\n\t}\n\n    uint32_t c = 0;\n    if (!returnData.Read(c))\n    {\n        OVR_ASSERT(false);\n    }\n\treturn c;\n}\n\n// Returns new caps after modification\nunsigned int NetClient::Hmd_SetEnabledCaps(VirtualHmdId hmd, unsigned int hmdCaps)\n{\n    if (!IsConnected(false, false))\n    {\n        return 0;\n    }\n\n\tOVR::Net::BitStream bsOut, returnData;\n\tbsOut.Write(hmd);\n\n    uint32_t c = (uint32_t)hmdCaps;\n\tbsOut.Write(c);\n\n\tif (!GetRPC1()->CallBlocking(\"Hmd_SetEnabledCaps_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n\t{\n\t\treturn 0;\n\t}\n\n    c = 0;\n    if (!returnData.Read(c))\n    {\n        OVR_ASSERT(false);\n    }\n    return c;\n}\n\n\n//-------------------------------------------------------------------------------------\n// *** Tracking Setup\n\nbool NetClient::Hmd_ConfigureTracking(VirtualHmdId hmd, unsigned supportedCaps, unsigned requiredCaps)\n{\n    if (!IsConnected(false, false))\n    {\n        return false;\n    }\n\n\tOVR::Net::BitStream bsOut, returnData;\n\tbsOut.Write(hmd);\n\n    uint32_t w_sc = supportedCaps;\n    bsOut.Write(w_sc);\n    uint32_t w_rc = requiredCaps;\n    bsOut.Write(w_rc);\n\n\tif (!GetRPC1()->CallBlocking(\"Hmd_ConfigureTracking_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n\t{\n\t\treturn false;\n\t}\n\n    uint8_t b;\n    if (!returnData.Read(b))\n    {\n        OVR_ASSERT(false);\n    }\n\n\treturn b != 0;\n}\n\n\nvoid NetClient::Hmd_ResetTracking(VirtualHmdId hmd)\n{\n    if (!IsConnected(false, false))\n    {\n        return;\n    }\n\n\tOVR::Net::BitStream bsOut;\n\tbsOut.Write(hmd);\n\tif (!GetRPC1()->CallBlocking(\"Hmd_ResetTracking_1\", &bsOut, GetSession()->GetConnectionAtIndex(0)))\n\t{\n\t\treturn;\n\t}\n}\n\nbool NetClient::LatencyUtil_ProcessInputs(double startTestSeconds, unsigned char rgbColorOut[3])\n{\n    if (!IsConnected(false, false))\n    {\n        return false;\n    }\n\n    if (!LatencyTesterAvailable)\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n    bsOut.Write(startTestSeconds);\n    if (!GetRPC1()->CallBlocking(\"LatencyUtil_ProcessInputs_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return false;\n    }\n\n    uint8_t u;\n    returnData.Read(u);\n    rgbColorOut[0] = u;\n    returnData.Read(u);\n    rgbColorOut[1] = u;\n    if (!returnData.Read(u))\n    {\n        return false;\n    }\n    rgbColorOut[2] = u;\n\n    return true;\n}\n\nconst char* NetClient::LatencyUtil_GetResultsString()\n{\n    if (!IsConnected(false, false))\n    {\n        return NULL;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n    if (!GetRPC1()->CallBlocking(\"LatencyUtil_GetResultsString_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return NULL;\n    }\n\n    if (!returnData.Read(LatencyUtil_GetResultsString_Str))\n    {\n        OVR_ASSERT(false);\n    }\n\n    return LatencyUtil_GetResultsString_Str.ToCStr();\n}\n\nbool NetClient::ShutdownServer()\n{\n    if (!IsConnected(false, false))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut;\n    GetRPC1()->BroadcastSignal(\"Shutdown_1\", &bsOut);\n\n    return true;\n}\n\n\n//// Push Notifications:\n\nvoid NetClient::registerRPC()\n{\n#define RPC_REGISTER_SLOT(observerScope, functionName) \\\n    observerScope.SetHandler(OVR::Net::Plugins::RPCSlot::FromMember<NetClient, &NetClient::functionName>(this)); pRPC->RegisterSlot(OVR_STRINGIZE(functionName), observerScope);\n\n    // Register RPC functions:\n    RPC_REGISTER_SLOT(InitialServerStateScope, InitialServerState_1);\n    RPC_REGISTER_SLOT(LatencyTesterAvailableScope, LatencyTesterAvailable_1);\n    RPC_REGISTER_SLOT(DefaultLogOutputScope, DefaultLogOutput_1);\n    RPC_REGISTER_SLOT(HMDCountUpdateScope, HMDCountUpdate_1);\n}\n\nvoid NetClient::InitialServerState_1(BitStream* userData, ReceivePayload* pPayload)\n{\n    LatencyTesterAvailable_1(userData, pPayload);\n}\n\nvoid NetClient::LatencyTesterAvailable_1(BitStream* userData, ReceivePayload* pPayload)\n{\n    OVR_UNUSED(pPayload);\n\n    uint8_t b = 0;\n    if (!userData->Read(b))\n    {\n        OVR_ASSERT(false);\n        return;\n    }\n\n    LatencyTesterAvailable = (b != 0);\n}\n\nvoid NetClient::DefaultLogOutput_1(BitStream* userData, ReceivePayload* pPayload)\n{\n    OVR_UNUSED(pPayload);\n\n    String formattedText;\n    LogMessageType messageType = Log_Text; // Will normally be overwritten below.\n    userData->Read(messageType);\n    if (userData->Read(formattedText))\n    {\n        if (OVR::Log::GetGlobalLog())\n        {\n            OVR::String logStr = \"[From Service] \";\n            logStr.AppendString(formattedText);\n            OVR::Log::GetGlobalLog()->LogMessage(messageType, \"%s\", logStr.ToCStr());\n        }\n    }\n}\n\nvoid NetClient::HMDCountUpdate_1(BitStream* userData, ReceivePayload* pPayload)\n{\n    OVR_UNUSED(pPayload);\n\n    int32_t hmdCount = 0;\n    if (!userData->Read(hmdCount))\n    {\n        OVR_ASSERT(false);\n        return;\n    }\n\n    HMDCount = hmdCount;\n    EdgeTriggeredHMDCount = true;\n}\n\n\n}} // namespace OVR::Service\n"
  },
  {
    "path": "externals/ovr/Src/Service/Service_NetClient.h",
    "content": "/************************************************************************************\n\nFilename    :   Service_NetClient.h\nContent     :   Client for service interface\nCreated     :   June 12, 2014\nAuthors     :   Michael Antonov, Kevin Jenkins, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Service_NetClient_h\n#define OVR_Service_NetClient_h\n\n#include \"../Net/OVR_NetworkTypes.h\"\n#include \"Service_NetSessionCommon.h\"\n#include \"../Kernel/OVR_System.h\"\n#include \"../OVR_CAPI.h\"\n#include \"../Util/Util_Render_Stereo.h\"\n\nnamespace OVR { namespace Service {\n\nusing namespace OVR::Net;\n\n\n//-------------------------------------------------------------------------------------\n// NetClient\n\nclass NetClient : public NetSessionCommon,\n                  public Net::Plugins::NetworkPlugin,\n                  public SystemSingletonBase<NetClient>\n{\n    OVR_DECLARE_SINGLETON(NetClient);\n    virtual void OnThreadDestroy();\n\n    // Status\n    bool          LatencyTesterAvailable;\n    int           HMDCount;\n    bool          EdgeTriggeredHMDCount;\n\n    virtual void OnReceive(Net::ReceivePayload* pPayload, Net::ListenerReceiveResult* lrrOut);\n    virtual void OnDisconnected(Net::Connection* conn);\n    virtual void OnConnected(Net::Connection* conn);\n\n    virtual int  Run();\n\npublic:\n    bool         Connect(bool blocking);\n    bool         IsConnected(bool attemptReconnect, bool blockOnReconnect);\n    void         Disconnect();\n\n    void         GetLocalProtocolVersion(int& major, int& minor, int& patch);\n    // This function may fail if it is not connected\n    bool         GetRemoteProtocolVersion(int& major, int& minor, int& patch);\n\n    void         SetLastError(String str);\n\npublic:\n    // Persistent key-value storage\n    const char*  GetStringValue(VirtualHmdId hmd, const char* key, const char* default_val);\n    bool         GetBoolValue(VirtualHmdId hmd, const char* key, bool default_val);\n    int          GetIntValue(VirtualHmdId hmd, const char* key, int default_val);\n    double       GetNumberValue(VirtualHmdId hmd, const char* key, double default_val);\n    int          GetNumberValues(VirtualHmdId hmd, const char* key, double* values, int num_vals);\n\n    bool         SetStringValue(VirtualHmdId hmd, const char* key, const char* val);\n    bool         SetBoolValue(VirtualHmdId hmd, const char* key, bool val);\n    bool         SetIntValue(VirtualHmdId hmd, const char* key, int val);\n    bool         SetNumberValue(VirtualHmdId hmd, const char* key, double val);\n    bool         SetNumberValues(VirtualHmdId hmd, const char* key, const double* vals, int num_vals);\n\n    bool         GetDriverMode(bool& driverInstalled, bool& compatMode, bool& hideDK1Mode);\n    bool         SetDriverMode(bool compatMode, bool hideDK1Mode);\n\n\tint          Hmd_Detect();\n\tbool         Hmd_Create(int index, HMDNetworkInfo* netInfo);\n\tvoid         Hmd_Release(VirtualHmdId hmd);\n\n\t// Last string is cached locally.\n\tconst char*  Hmd_GetLastError(VirtualHmdId hmd);\n\n\t// TBD: Replace with a function to return internal, original HMDInfo?\n\n\t// Fills in description about HMD; this is the same as filled in by ovrHmd_Create.\n\t// The actual descriptor is a par\n\tbool         Hmd_GetHmdInfo(VirtualHmdId hmd, HMDInfo* hmdInfo);\n\n\t//-------------------------------------------------------------------------------------\n\tunsigned int Hmd_GetEnabledCaps(VirtualHmdId hmd);\n\t// Returns new caps after modification\n\tunsigned int Hmd_SetEnabledCaps(VirtualHmdId hmd, unsigned int hmdCaps);\n\n    // Updates driver render target\n    bool         Hmd_AttachToWindow(VirtualHmdId hmd, void* hWindow);\n\n\t//-------------------------------------------------------------------------------------\n\t// *** Tracking Setup\n\n\tbool         Hmd_ConfigureTracking(VirtualHmdId hmd, unsigned supportedCaps, unsigned requiredCaps);\t\n\tvoid         Hmd_ResetTracking(VirtualHmdId hmd);\n\n\t// TBD: Camera frames\n    bool         LatencyUtil_ProcessInputs(double startTestSeconds, unsigned char rgbColorOut[3]);\n    const char*  LatencyUtil_GetResultsString();\n\n    bool         ShutdownServer();\n\nprotected:\n    String       Hmd_GetLastError_Str;\n    String       LatencyUtil_GetResultsString_Str;\n    String       ProfileGetValue1_Str, ProfileGetValue3_Str;\n\nprotected:\n    //// Push Notifications:\n\n    void registerRPC();\n\n    ObserverScope<Net::Plugins::RPCSlot> InitialServerStateScope;\n    void InitialServerState_1(BitStream* userData, ReceivePayload* pPayload);\n\n    ObserverScope<Net::Plugins::RPCSlot> LatencyTesterAvailableScope;\n    void LatencyTesterAvailable_1(BitStream* userData, ReceivePayload* pPayload);\n\n    ObserverScope<Net::Plugins::RPCSlot> DefaultLogOutputScope;\n    void DefaultLogOutput_1(BitStream* userData, ReceivePayload* pPayload);\n\n    ObserverScope<Net::Plugins::RPCSlot> HMDCountUpdateScope;\n    void HMDCountUpdate_1(BitStream* userData, ReceivePayload* pPayload);\n};\n\n\n}} // namespace OVR::Service\n\n#endif // OVR_Service_NetClient_h\n"
  },
  {
    "path": "externals/ovr/Src/Service/Service_NetSessionCommon.cpp",
    "content": "/************************************************************************************\n\nFilename    :   Service_NetSessionCommon.cpp\nContent     :   Server for service interface\nCreated     :   June 12, 2014\nAuthors     :   Kevin Jenkins, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"Service_NetSessionCommon.h\"\n#include \"../OVR_Stereo.h\"\n\nnamespace OVR { namespace Service {\n\n\n//// NetSessionCommon\n\nNetSessionCommon::NetSessionCommon() :\n    Terminated(false)\n{\n    pSession = new Net::Session;\n    OVR_ASSERT(pSession != NULL);\n\n    pRPC = new Net::Plugins::RPC1;\n    OVR_ASSERT(pRPC != NULL);\n\n    pSession->AddSessionListener(pRPC);\n}\n\nNetSessionCommon::~NetSessionCommon()\n{\n    if (pSession)\n    {\n        delete pSession;\n        pSession = NULL;\n    }\n    if (pRPC)\n    {\n        delete pRPC;\n        pRPC = NULL;\n    }\n\n    Terminated = true;\n\n    OVR_ASSERT(IsFinished());\n}\n\nvoid NetSessionCommon::onSystemDestroy()\n{\n    Terminated = true;\n\n    Join();\n\n    Release();\n}\n\nvoid NetSessionCommon::onThreadDestroy()\n{\n    Terminated = true;\n    if (pSession)\n    {\n        pSession->Shutdown();\n    }\n}\n\nvoid NetSessionCommon::SerializeHMDInfo(Net::BitStream *bitStream, HMDInfo* hmdInfo)\n{\n    bitStream->Write(hmdInfo->ProductName);\n    bitStream->Write(hmdInfo->Manufacturer);\n\n    int32_t w = hmdInfo->Version;\n    bitStream->Write(w);\n\n    w = hmdInfo->HmdType;\n    bitStream->Write(w);\n\n    w = hmdInfo->ResolutionInPixels.w;\n    bitStream->Write(w);\n\n    w = hmdInfo->ResolutionInPixels.h;\n    bitStream->Write(w);\n\n    w = hmdInfo->ShimInfo.DeviceNumber;\n    bitStream->Write(w);\n\n    w = hmdInfo->ShimInfo.NativeWidth;\n    bitStream->Write(w);\n\n    w = hmdInfo->ShimInfo.NativeHeight;\n    bitStream->Write(w);\n\n    w = hmdInfo->ShimInfo.Rotation;\n    bitStream->Write(w);\n\n    bitStream->Write(hmdInfo->ScreenSizeInMeters.w);\n    bitStream->Write(hmdInfo->ScreenSizeInMeters.h);\n    bitStream->Write(hmdInfo->ScreenGapSizeInMeters);\n    bitStream->Write(hmdInfo->CenterFromTopInMeters);\n    bitStream->Write(hmdInfo->LensSeparationInMeters);\n\n    w = hmdInfo->DesktopX;\n    bitStream->Write(w);\n\n    w = hmdInfo->DesktopY;\n    bitStream->Write(w);\n\n    w = hmdInfo->Shutter.Type;\n    bitStream->Write(w);\n\n    bitStream->Write(hmdInfo->Shutter.VsyncToNextVsync);\n    bitStream->Write(hmdInfo->Shutter.VsyncToFirstScanline);\n    bitStream->Write(hmdInfo->Shutter.FirstScanlineToLastScanline);\n    bitStream->Write(hmdInfo->Shutter.PixelSettleTime);\n    bitStream->Write(hmdInfo->Shutter.PixelPersistence);\n    bitStream->Write(hmdInfo->DisplayDeviceName);\n\n    w = hmdInfo->DisplayId;\n    bitStream->Write(w);\n\n    bitStream->Write(hmdInfo->PrintedSerial);\n\n    uint8_t b = hmdInfo->InCompatibilityMode ? 1 : 0;\n    bitStream->Write(b);\n\n    w = hmdInfo->VendorId;\n    bitStream->Write(w);\n\n    w = hmdInfo->ProductId;\n    bitStream->Write(w);\n\n    bitStream->Write(hmdInfo->CameraFrustumFarZInMeters);\n    bitStream->Write(hmdInfo->CameraFrustumHFovInRadians);\n    bitStream->Write(hmdInfo->CameraFrustumNearZInMeters);\n    bitStream->Write(hmdInfo->CameraFrustumVFovInRadians);\n\n    w = hmdInfo->FirmwareMajor;\n    bitStream->Write(w);\n\n    w = hmdInfo->FirmwareMinor;\n    bitStream->Write(w);\n\n    bitStream->Write(hmdInfo->PelOffsetR.x);\n    bitStream->Write(hmdInfo->PelOffsetR.y);\n    bitStream->Write(hmdInfo->PelOffsetB.x);\n    bitStream->Write(hmdInfo->PelOffsetB.y);\n\n    // Important please read before modifying!\n    // ----------------------------------------------------\n    // Please add new serialized data to the end, here.\n    // Otherwise we will break backwards compatibility\n    // and e.g. 0.4.4 runtime will not work with 0.4.3 SDK.\n\n    // Please also update the DeserializeHMDInfo() function\n    // below also and make sure that the members you added\n    // are initialized properly in the HMDInfo constructor.\n\n    // Note that whenever new fields are added here you\n    // should also update the minor version of the RPC\n    // protocol in OVR_Session.h so that clients fail at\n    // a version check instead of when this data is\n    // found to be truncated from the server.\n}\n\nbool NetSessionCommon::DeserializeHMDInfo(Net::BitStream *bitStream, HMDInfo* hmdInfo)\n{\n    bitStream->Read(hmdInfo->ProductName);\n    bitStream->Read(hmdInfo->Manufacturer);\n\n    int32_t w = 0;\n    if (!bitStream->Read(w))\n    {\n        // This indicates that no HMD could be found\n        return false;\n    }\n    hmdInfo->Version = w;\n\n    bitStream->Read(w);\n    hmdInfo->HmdType = (HmdTypeEnum)w;\n\n    bitStream->Read(w);\n    hmdInfo->ResolutionInPixels.w = w;\n\n    bitStream->Read(w);\n    hmdInfo->ResolutionInPixels.h = w;\n\n    bitStream->Read(w);\n    hmdInfo->ShimInfo.DeviceNumber = w;\n\n    bitStream->Read(w);\n    hmdInfo->ShimInfo.NativeWidth = w;\n\n    bitStream->Read(w);\n    hmdInfo->ShimInfo.NativeHeight = w;\n\n    bitStream->Read(w);\n    hmdInfo->ShimInfo.Rotation = w;\n\n    bitStream->Read(hmdInfo->ScreenSizeInMeters.w);\n    bitStream->Read(hmdInfo->ScreenSizeInMeters.h);\n    bitStream->Read(hmdInfo->ScreenGapSizeInMeters);\n    bitStream->Read(hmdInfo->CenterFromTopInMeters);\n    bitStream->Read(hmdInfo->LensSeparationInMeters);\n\n    bitStream->Read(w);\n    hmdInfo->DesktopX = w;\n\n    bitStream->Read(w);\n    hmdInfo->DesktopY = w;\n\n    bitStream->Read(w);\n    hmdInfo->Shutter.Type = (HmdShutterTypeEnum)w;\n\n    bitStream->Read(hmdInfo->Shutter.VsyncToNextVsync);\n    bitStream->Read(hmdInfo->Shutter.VsyncToFirstScanline);\n    bitStream->Read(hmdInfo->Shutter.FirstScanlineToLastScanline);\n    bitStream->Read(hmdInfo->Shutter.PixelSettleTime);\n    bitStream->Read(hmdInfo->Shutter.PixelPersistence);\n    bitStream->Read(hmdInfo->DisplayDeviceName);\n\n    bitStream->Read(w);\n    hmdInfo->DisplayId = w;\n\n    bitStream->Read(hmdInfo->PrintedSerial);\n\n    uint8_t b = 0;\n    bitStream->Read(b);\n    hmdInfo->InCompatibilityMode = (b != 0);\n\n    bitStream->Read(w);\n    hmdInfo->VendorId = w;\n\n    bitStream->Read(w);\n    hmdInfo->ProductId = w;\n\n    bitStream->Read(hmdInfo->CameraFrustumFarZInMeters);\n    bitStream->Read(hmdInfo->CameraFrustumHFovInRadians);\n    bitStream->Read(hmdInfo->CameraFrustumNearZInMeters);\n    bitStream->Read(hmdInfo->CameraFrustumVFovInRadians);\n\n    bitStream->Read(w);\n    hmdInfo->FirmwareMajor = w;\n\n    if (!bitStream->Read(w))\n    {\n        OVR_ASSERT(false);\n        return false;\n    }\n    hmdInfo->FirmwareMinor = w;\n\n    bitStream->Read(hmdInfo->PelOffsetR.x);\n    bitStream->Read(hmdInfo->PelOffsetR.y);\n    bitStream->Read(hmdInfo->PelOffsetB.x);\n    if (!bitStream->Read(hmdInfo->PelOffsetB.y))\n    {\n        OVR_ASSERT(false);\n        return false;\n    }\n\n    // Important please read before modifying!\n    // ----------------------------------------------------\n    // Please add new serialized data to the end, here.\n    // Otherwise we will break backwards compatibility\n    // and e.g. 0.4.4 runtime will not work with 0.4.3 SDK.\n\n    // Be sure to check that the very last one read properly\n    // since HMD Info truncation should be caught here.\n\n    return true;\n}\n\n// Prefix key names with this to pass through to server\nstatic const char* BypassPrefix = \"server:\";\n\nstatic const char* KeyNames[][NetSessionCommon::ENumTypes] = {\n    /* EGetStringValue */ { \"CameraSerial\", \"CameraUUID\", 0 },\n    /* EGetBoolValue */ { \"ReleaseDK2Sensors\", \"ReleaseLegacySensors\", 0 },\n    /* EGetIntValue */ { 0 },\n    /* EGetNumberValue */{ \"CenterPupilDepth\", \"LoggingMask\", 0 },\n    /* EGetNumberValues */{ \"NeckModelVector3f\", 0 },\n    /* ESetStringValue */ { 0 },\n    /* ESetBoolValue */ { \"ReleaseDK2Sensors\", \"ReleaseLegacySensors\", 0 },\n    /* ESetIntValue */ { 0 },\n    /* ESetNumberValue */{ \"CenterPupilDepth\", \"LoggingMask\", 0 },\n    /* ESetNumberValues */{ \"NeckModelVector3f\", 0 },\n};\n\nbool IsInStringArray(const char* a[], const char* key)\n{\n    for (int i = 0; a[i]; ++i)\n    {\n        if (OVR_strcmp(a[i], key) == 0)\n            return true;\n    }\n\n    return false;\n}\n\nconst char *NetSessionCommon::FilterKeyPrefix(const char* key)\n{\n    // If key starts with BypassPrefix,\n    if (strstr(key, BypassPrefix) == key)\n    {\n        key += strlen(BypassPrefix);\n    }\n\n    return key;\n}\n\nbool NetSessionCommon::IsServiceProperty(EGetterSetters e, const char* key)\n{\n    if ((e >= 0 && e < ENumTypes) && IsInStringArray(KeyNames[e], key))\n    {\n        return true;\n    }\n\n    // If key starts with BypassPrefix,\n    if (strstr(key, BypassPrefix) == key)\n    {\n        return true;\n    }\n\n    return false;\n}\n\n\n}} // namespace OVR::Service\n"
  },
  {
    "path": "externals/ovr/Src/Service/Service_NetSessionCommon.h",
    "content": "/************************************************************************************\n\nFilename    :   Service_NetSessionCommon.h\nContent     :   Shared networking for service\nCreated     :   June 12, 2014\nAuthors     :   Kevin Jenkins, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Service_NetSessionCommon_h\n#define OVR_Service_NetSessionCommon_h\n\n#include \"../OVR_CAPI.h\"\n#include \"../Net/OVR_RPC1.h\"\n#include \"../Kernel/OVR_Threads.h\"\n#include \"../Net/OVR_BitStream.h\"\n#include \"../Kernel/OVR_System.h\"\n\nnamespace OVR {\n\nclass HMDInfo;\n\nnamespace Service {\n\n\n//-----------------------------------------------------------------------------\n// VirtualHmdId\n\n// This is an identifier that is unique to each VirtualHmd object on the server\n// side.  The client side uses this to opaquely reference those objects.\n\ntypedef int32_t VirtualHmdId;\nstatic const int32_t InvalidVirtualHmdId = -1;\n\n// Localhost-bound TCP port that the service listens on for VR apps\nstatic const int VRServicePort = 30322; // 0x7672 = \"vr\" little-endian\n\n// HMDInfo section related to networking\nstruct HMDNetworkInfo\n{\n\tHMDNetworkInfo() :\n\t\tNetId(InvalidVirtualHmdId)\n\t{\n\t}\n\n\t// Network identifier for HMD\n\tVirtualHmdId NetId;\n\n\t// Name of the shared memory object\n\tString       SharedMemoryName;\n\n\tvoid Serialize(Net::BitStream* bs)\n\t{\n\t\tbs->Write(NetId);\n\t\tbs->Write(SharedMemoryName);\n\t}\n\tbool Deserialize(Net::BitStream* bs)\n\t{\n\t\tbs->Read(NetId);\n\t\treturn bs->Read(SharedMemoryName);\n\t}\n};\n\n\n//-------------------------------------------------------------------------------------\n// ***** NetSessionCommon\n\n// Common part networking session/RPC implementation shared between client and server.\n\nclass NetSessionCommon : public Thread\n{\nprotected:\n    virtual void onSystemDestroy();\n    virtual void onThreadDestroy();\n\npublic:\n    NetSessionCommon();\n    virtual ~NetSessionCommon();\n\n\tNet::Plugins::RPC1* GetRPC1() const\n    {\n        return pRPC;\n    }\n\tNet::Session* GetSession() const\n    {\n        return pSession;\n    }\n\n\tstatic void SerializeHMDInfo(Net::BitStream* bitStream, HMDInfo* hmdInfo);\n\tstatic bool DeserializeHMDInfo(Net::BitStream* bitStream, HMDInfo* hmdInfo);\n\npublic:\n    // Getter/setter tools\n    enum EGetterSetters\n    {\n        // Note: If this enumeration changes, then the Servce_NetSessionCommon.cpp\n        // IsServiceProperty() function should be updated.\n\n        EGetStringValue,\n        EGetBoolValue,\n        EGetIntValue,\n        EGetNumberValue,\n        EGetNumberValues,\n        ESetStringValue,\n        ESetBoolValue,\n        ESetIntValue,\n        ESetNumberValue,\n        ESetNumberValues,\n\n        ENumTypes\n    };\n\n    static const char* FilterKeyPrefix(const char* key);\n    static bool IsServiceProperty(EGetterSetters e, const char* key);\n\nprotected:\n    bool                Terminated; // Thread termination flag\n    Net::Session*       pSession;   // Networking session\n\tNet::Plugins::RPC1* pRPC;       // Remote procedure calls object\n};\n\n\n}} // namespace OVR::Service\n\n#endif // OVR_Service_NetSessionCommon_h\n"
  },
  {
    "path": "externals/ovr/Src/Tracking/Tracking_PoseState.h",
    "content": "/************************************************************************************\n\nFilename    :   Tracking_PoseState.h\nContent     :   Describes the complete pose at a point in time, including derivatives\nCreated     :   May 13, 2014\nAuthors     :   Dov Katz\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef Tracking_PoseState_h\n#define Tracking_PoseState_h\n\n#include \"../Kernel/OVR_Math.h\"\n\nnamespace OVR {\n\n// PoseState describes the complete pose, or a rigid body configuration, at a\n// point in time, including first and second derivatives. It is used to specify\n// instantaneous location and movement of the headset.\n// SensorState is returned as a part of the sensor state.\n\ntemplate<class T>\nclass PoseState\n{\npublic:\n\ttypedef typename CompatibleTypes<Pose<T> >::Type CompatibleType;\n\n\tPoseState() : TimeInSeconds(0.0) { }\n    PoseState(Pose<T> pose, double time) : ThePose(pose), TimeInSeconds(time) { }\n\n\t// float <-> double conversion constructor.\n\texplicit PoseState(const PoseState<typename Math<T>::OtherFloatType> &src)\n\t\t: ThePose(src.ThePose),\n\t\tAngularVelocity(src.AngularVelocity), LinearVelocity(src.LinearVelocity),\n\t\tAngularAcceleration(src.AngularAcceleration), LinearAcceleration(src.LinearAcceleration),\n\t\tTimeInSeconds(src.TimeInSeconds)\n\t{ }\n\n\t// C-interop support: PoseStatef <-> ovrPoseStatef\n\tPoseState(const typename CompatibleTypes<PoseState<T> >::Type& src)\n\t\t: ThePose(src.ThePose),\n\t\tAngularVelocity(src.AngularVelocity), LinearVelocity(src.LinearVelocity),\n\t\tAngularAcceleration(src.AngularAcceleration), LinearAcceleration(src.LinearAcceleration),\n\t\tTimeInSeconds(src.TimeInSeconds)\n\t{ }\n\n\toperator typename CompatibleTypes<PoseState<T> >::Type() const\n\t{\n\t\ttypename CompatibleTypes<PoseState<T> >::Type result;\n\t\tresult.ThePose = ThePose;\n\t\tresult.AngularVelocity = AngularVelocity;\n\t\tresult.LinearVelocity = LinearVelocity;\n\t\tresult.AngularAcceleration = AngularAcceleration;\n\t\tresult.LinearAcceleration = LinearAcceleration;\n\t\tresult.TimeInSeconds = TimeInSeconds;\n\t\treturn result;\n\t}\n\n\tPose<T> ThePose;\n\tVector3<T>  AngularVelocity;\n\tVector3<T>  LinearVelocity;\n\tVector3<T>  AngularAcceleration;\n\tVector3<T>  LinearAcceleration;\n\t// Absolute time of this state sample; always a double measured in seconds.\n\tdouble      TimeInSeconds;\n\n\t// ***** Helpers for Pose integration\n\n\t// Stores and integrates gyro angular velocity reading for a given time step.\n\tvoid StoreAndIntegrateGyro(Vector3d angVel, double dt);\n\t// Stores and integrates position/velocity from accelerometer reading for a given time step.\n\tvoid StoreAndIntegrateAccelerometer(Vector3d linearAccel, double dt);\n\n\t// Performs integration of state by adding next state delta to it\n\t// to produce a combined state change\n\tvoid AdvanceByDelta(const PoseState<T>& delta);\n};\n\n\ntemplate<class T>\nPoseState<T> operator*(const OVR::Pose<T>& trans, const PoseState<T>& poseState)\n{\n\tPoseState<T> result;\n\tresult.ThePose = trans * poseState.ThePose;\n\tresult.LinearVelocity = trans.Rotate(poseState.LinearVelocity);\n\tresult.LinearAcceleration = trans.Rotate(poseState.LinearAcceleration);\n\tresult.AngularVelocity = trans.Rotate(poseState.AngularVelocity);\n\tresult.AngularAcceleration = trans.Rotate(poseState.AngularAcceleration);\n\treturn result;\n}\n\n\n// External API returns pose as float, but uses doubles internally for quaternion precision.\ntypedef PoseState<float>  PoseStatef;\ntypedef PoseState<double> PoseStated;\n\n\n} // namespace OVR::Vision\n\n\nnamespace OVR {\n\n\ttemplate<> struct CompatibleTypes<OVR::PoseState<float> > { typedef ovrPoseStatef Type; };\n\ttemplate<> struct CompatibleTypes<OVR::PoseState<double> > { typedef ovrPoseStated Type; };\n\n    static_assert((sizeof(PoseState<double>) == sizeof(Pose<double>) + 4*sizeof(Vector3<double>) + sizeof(double)), \"sizeof(PoseState<double>) failure\");\n#ifdef OVR_CPU_X86_64\n    static_assert((sizeof(PoseState<float>) == sizeof(Pose<float>) + 4*sizeof(Vector3<float>) + sizeof(uint32_t) + sizeof(double)), \"sizeof(PoseState<float>) failure\"); //TODO: Manually pad template.\n#elif defined(OVR_OS_WIN32) // The Windows 32 bit ABI aligns 64 bit values on 64 bit boundaries\n    static_assert((sizeof(PoseState<float>) == sizeof(Pose<float>) + 4*sizeof(Vector3<float>) + sizeof(uint32_t) + sizeof(double)), \"sizeof(PoseState<float>) failure\");\n#else // Else Unix/Apple 32 bit ABI, which aligns 64 bit values on 32 bit boundaries.\n    static_assert((sizeof(PoseState<float>) == sizeof(Pose<float>) + 4*sizeof(Vector3<float>) +                    sizeof(double)), \"sizeof(PoseState<float>) failure\");\n#endif\n}\n\n#endif // Tracking_PoseState_h\n"
  },
  {
    "path": "externals/ovr/Src/Tracking/Tracking_SensorState.h",
    "content": "/************************************************************************************\n\nFilename    :   Tracking_SensorState.h\nContent     :   Sensor state information shared by tracking system with games\nCreated     :   May 13, 2014\nAuthors     :   Dov Katz, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef Tracking_SensorState_h\n#define Tracking_SensorState_h\n\n#include \"Tracking_PoseState.h\"\n#include \"../Kernel/OVR_SharedMemory.h\"\n#include \"../Kernel/OVR_Lockless.h\"\n#include \"../Kernel/OVR_String.h\"\n#include \"../Util/Util_LatencyTest2State.h\"\n#include \"../Sensors/OVR_DeviceConstants.h\"\n\n// CAPI forward declarations.\nstruct ovrTrackingState_;\ntypedef struct ovrTrackingState_ ovrTrackingState;\nstruct ovrPoseStatef_;\ntypedef struct ovrPoseStatef_ ovrPoseStatef;\n\nnamespace OVR { namespace Tracking {\n\n\n//-------------------------------------------------------------------------------------\n// ***** Sensor State\n// These values are reported as compatible with C API.\n\n// Bit flags describing the current status of sensor tracking.\nenum StatusBits\n{\n    // Tracked bits: Toggled by SensorFusion\n\tStatus_OrientationTracked = 0x0001, // Orientation is currently tracked (connected and in use)\n\tStatus_PositionTracked    = 0x0002, // Position is currently tracked (false if out of range)\n    Status_CameraPoseTracked  = 0x0004, // Camera pose is currently tracked\n\n    // Connected bits: Toggled by TrackingManager\n    Status_PositionConnected  = 0x0020, // Position tracking HW is connected\n\tStatus_HMDConnected       = 0x0080, // HMD is available & connected\n\n    // Masks\n    Status_AllMask = 0xffff,\n    Status_TrackingMask = Status_PositionTracked | Status_OrientationTracked | Status_CameraPoseTracked,\n    Status_ConnectedMask = Status_PositionConnected | Status_HMDConnected,\n};\n\n\n// Full state of of the sensor reported by GetSensorState() at a given absolute time.\nclass TrackingState\n{\npublic:\n\tTrackingState() : HeadPose(), CameraPose(), LeveledCameraPose(), RawSensorData(), StatusFlags(0), LastVisionProcessingTime(0.0) { }\n\n\t// C-interop support\n\tTrackingState(const ovrTrackingState& s);\n\toperator ovrTrackingState () const;\n\n\t// HMD pose information for the requested time.\n\tPoseStatef   HeadPose;\n\n    // Orientation and position of the external camera, if present.\n    Posef        CameraPose;\n    // Orientation and position of the camera after alignment with gravity \n    Posef        LeveledCameraPose;\n\n    // Most recent sensor data received from the HMD\n    SensorDataType RawSensorData;\n\n    // Sensor status described by ovrStatusBits.\n\tuint32_t     StatusFlags;\n\n    //// 0.4.1\n\n    // Measures the time from receiving the camera frame until vision CPU processing completes.\n    double LastVisionProcessingTime;\n\n    //// 0.4.3\n\n    // Measures the time from exposure until the pose is available for the frame, including processing time.\n    double LastVisionFrameLatency;\n\n    // Tag the vision processing results to a certain frame counter number.\n    uint32_t LastCameraFrameCounter;\n};\n\n\n// -----------------------------------------------\n\n#pragma pack(push, 8)\n\nstruct LocklessSensorStatePadding;\n\n// State version stored in lockless updater \"queue\" and used for \n// prediction by GetPoseAtTime/GetSensorStateAtTime\nstruct LocklessSensorState\n{\n\tPoseState<double> WorldFromImu;\n    SensorDataType    RawSensorData;\n    Pose<double>      WorldFromCamera;\n\tuint32_t          StatusFlags;\n    uint32_t          _PAD_0_;\n\n\t// ImuFromCpf for HMD pose tracking\n\tPosed             ImuFromCpf;\n\n    // Performance logging\n    double            LastVisionProcessingTime;\n    double            LastVisionFrameLatency;\n    uint32_t          LastCameraFrameCounter;\n    uint32_t          _PAD_1_;\n\n\t// Initialized to invalid state\n\tLocklessSensorState() :\n       WorldFromImu()\n     , RawSensorData()\n     , WorldFromCamera()\n\t , StatusFlags(0)\n     , _PAD_0_(0) // This assignment should be irrelevant, but it quells static/runtime analysis complaints.\n     , ImuFromCpf()\n     , LastVisionProcessingTime(0.0)\n     , LastVisionFrameLatency(0.0)\n     , LastCameraFrameCounter(0)\n     , _PAD_1_(0) // \"\n\t{\n\t}\n\n    LocklessSensorState& operator = (const LocklessSensorStatePadding& rhs);\n};\n    \nstatic_assert((sizeof(LocklessSensorState) == sizeof(PoseState<double>) + sizeof(SensorDataType) + sizeof(Pose<double>) + 2*sizeof(uint32_t) + sizeof(Posed) + sizeof(double)*2 + sizeof(uint32_t)*2), \"sizeof(LocklessSensorState) failure\");\n\n// Padded out version stored in the updater slots\n// Designed to be a larger fixed size to allow the data to grow in the future\n// without breaking older compiled code.\nstruct LocklessSensorStatePadding\n{\n    uint64_t words[64];\n\n    static const int DataWords = (sizeof(LocklessSensorState) + sizeof(uint64_t) - 1) / sizeof(uint64_t);\n\n    // Just copy the low data words\n    inline LocklessSensorStatePadding& operator=(const LocklessSensorState& rhs)\n    {\n        const uint64_t* src = (const uint64_t*)&rhs;\n\n        // if this fires off, then increase words' array size\n        OVR_ASSERT(sizeof(words) > sizeof(LocklessSensorState));\n\n        for (int i = 0; i < DataWords; ++i)\n        {\n            words[i] = src[i];\n        }\n\n        return *this;\n    }\n};\n\n// Just copy the low data words\ninline LocklessSensorState& LocklessSensorState::operator = (const LocklessSensorStatePadding& rhs)\n{\n    uint64_t* dest = (uint64_t*)this;\n\n    for (int i = 0; i < LocklessSensorStatePadding::DataWords; ++i)\n    {\n        dest[i] = rhs.words[i];\n    }\n\n    return *this;\n}\n\n#pragma pack(pop)\n\n// A lockless updater for sensor state\ntypedef LocklessUpdater<LocklessSensorState, LocklessSensorStatePadding> SensorStateUpdater;\n\n\n//// Combined state\n\nstruct CombinedSharedStateUpdater\n{\n    SensorStateUpdater         SharedSensorState;\n    Util::LockessRecordUpdater SharedLatencyTestState;\n};\n\ntypedef SharedObjectWriter< CombinedSharedStateUpdater > CombinedSharedStateWriter;\ntypedef SharedObjectReader< CombinedSharedStateUpdater > CombinedSharedStateReader;\n\n\n}} // namespace OVR::Tracking\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Tracking/Tracking_SensorStateReader.cpp",
    "content": "/************************************************************************************\n\nFilename    :   Tracking_SensorStateReader.cpp\nContent     :   Separate reader component that is able to recover sensor pose\nCreated     :   June 4, 2014\nAuthors     :   Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include \"Tracking_SensorStateReader.h\"\n#include \"Tracking_PoseState.h\"\n\nnamespace OVR { namespace Tracking {\n\n\n//-------------------------------------------------------------------------------------\n\n// This is a \"perceptually tuned predictive filter\", which means that it is optimized\n// for improvements in the VR experience, rather than pure error.  In particular,\n// jitter is more perceptible at lower speeds whereas latency is more perceptible\n// after a high-speed motion.  Therefore, the prediction interval is dynamically\n// adjusted based on speed.  Significant more research is needed to further improve\n// this family of filters.\nstatic Pose<double> calcPredictedPose(const PoseState<double>& poseState, double predictionDt)\n{\n\tPose<double> pose = poseState.ThePose;\n\tconst double linearCoef = 1.0;\n\tVector3d angularVelocity = poseState.AngularVelocity;\n\tdouble angularSpeed = angularVelocity.Length();\n\n\t// This could be tuned so that linear and angular are combined with different coefficients\n\tdouble speed = angularSpeed + linearCoef * poseState.LinearVelocity.Length();\n\n\tconst double slope = 0.2; // The rate at which the dynamic prediction interval varies\n\tdouble candidateDt = slope * speed; // TODO: Replace with smoothstep function\n\n\tdouble dynamicDt = predictionDt;\n\n\t// Choose the candidate if it is shorter, to improve stability\n\tif (candidateDt < predictionDt)\n\t{\n\t\tdynamicDt = candidateDt;\n\t}\n\n\tif (angularSpeed > 0.001)\n\t{\n\t\tpose.Rotation = pose.Rotation * Quatd(angularVelocity, angularSpeed * dynamicDt);\n\t}\n\n\tpose.Translation += poseState.LinearVelocity * dynamicDt;\n\n\treturn pose;\n}\n\n\n//// SensorStateReader\n\nSensorStateReader::SensorStateReader() :\n\tUpdater(NULL),\n    LastLatWarnTime(0.)\n{\n}\n\nvoid SensorStateReader::SetUpdater(const CombinedSharedStateUpdater* updater)\n{\n\tUpdater = updater;\n}\n\nvoid SensorStateReader::RecenterPose()\n{\n\tif (!Updater)\n\t{\n\t\treturn;\n\t}\n\n\t/*\n\t\tThis resets position to center in x, y, z, and resets yaw to center.\n\t\tOther rotation components are not affected.\n\t*/\n\n\tconst LocklessSensorState lstate = Updater->SharedSensorState.GetState();\n\n\tPosed worldFromCpf = lstate.WorldFromImu.ThePose * lstate.ImuFromCpf;\n\tdouble hmdYaw, hmdPitch, hmdRoll;\n\tworldFromCpf.Rotation.GetEulerAngles<Axis_Y, Axis_X, Axis_Z>(&hmdYaw, &hmdPitch, &hmdRoll);\n\n\tPosed worldFromCentered(Quatd(Axis_Y, hmdYaw), worldFromCpf.Translation);\n\n\tCenteredFromWorld = worldFromCentered.Inverted();\n}\n\nbool SensorStateReader::GetSensorStateAtTime(double absoluteTime, TrackingState& ss) const\n{\n\tif (!Updater)\n\t{\n        ss.StatusFlags = 0;\n        return false;\n\t}\n\n\tconst LocklessSensorState lstate = Updater->SharedSensorState.GetState();\n\n    // Update time\n\tss.HeadPose.TimeInSeconds = absoluteTime;\n\n\t// Update the status flags\n\tss.StatusFlags = lstate.StatusFlags;\n\t// If no hardware is connected, override the tracking flags\n\tif (0 == (ss.StatusFlags & Status_HMDConnected))\n\t{\n\t\tss.StatusFlags &= ~Status_TrackingMask;\n\t}\n\tif (0 == (ss.StatusFlags & Status_PositionConnected))\n\t{\n\t\tss.StatusFlags &= ~(Status_PositionTracked | Status_CameraPoseTracked);\n\t}\n\n\t// If tracking info is invalid,\n    if (0 == (ss.StatusFlags & Status_TrackingMask))\n\t{\n        return false;\n\t}\n    \n    // Delta time from the last available data\n\tdouble pdt = absoluteTime - lstate.WorldFromImu.TimeInSeconds;\n\tstatic const double maxPdt = 0.1;\n\n\t// If delta went negative due to synchronization problems between processes or just a lag spike,\n\tif (pdt < 0.)\n\t{\n\t\tpdt = 0.;\n\t}\n\telse if (pdt > maxPdt)\n\t{\n        if (LastLatWarnTime != lstate.WorldFromImu.TimeInSeconds)\n        {\n            LastLatWarnTime = lstate.WorldFromImu.TimeInSeconds;\n            LogText(\"[SensorStateReader] Prediction interval too high: %f s, clamping at %f s\\n\", pdt, maxPdt);\n        }\n\t\tpdt = maxPdt;\n\t}\n\n\tss.HeadPose = PoseStatef(lstate.WorldFromImu);\n\t// Do prediction logic and ImuFromCpf transformation\n\tss.HeadPose.ThePose = Posef(CenteredFromWorld * calcPredictedPose(lstate.WorldFromImu, pdt) * lstate.ImuFromCpf);\n\n    ss.CameraPose = Posef(CenteredFromWorld * lstate.WorldFromCamera);\n\n    Posed worldFromLeveledCamera = Posed(Quatd(), lstate.WorldFromCamera.Translation);\n    ss.LeveledCameraPose = Posef(CenteredFromWorld * worldFromLeveledCamera);\n\n    ss.RawSensorData = lstate.RawSensorData;\n    ss.LastVisionProcessingTime = lstate.LastVisionProcessingTime;\n    ss.LastVisionFrameLatency = lstate.LastVisionFrameLatency;\n\n\treturn true;\n}\n\nbool SensorStateReader::GetPoseAtTime(double absoluteTime, Posef& transform) const\n{\n\tTrackingState ss;\n\tif (!GetSensorStateAtTime(absoluteTime, ss))\n\t{\n\t\treturn false;\n\t}\n\n\ttransform = ss.HeadPose.ThePose;\n\n\treturn true;\n}\n\nuint32_t SensorStateReader::GetStatus() const\n{\n\tif (!Updater)\n\t{\n\t\treturn 0;\n\t}\n\n\tconst LocklessSensorState lstate = Updater->SharedSensorState.GetState();\n\n\t// If invalid,\n\tif (0 == (lstate.StatusFlags & Status_TrackingMask))\n\t{\n\t\t// Return 0 indicating no orientation nor position tracking\n\t\treturn 0;\n\t}\n\n\treturn lstate.StatusFlags;\n}\n\n}} // namespace OVR::Tracking\n"
  },
  {
    "path": "externals/ovr/Src/Tracking/Tracking_SensorStateReader.h",
    "content": "/************************************************************************************\n\nFilename    :   Tracking_SensorStateReader.h\nContent     :   Separate reader component that is able to recover sensor pose\nCreated     :   June 4, 2014\nAuthors     :   Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef Tracking_SensorStateReader_h\n#define Tracking_SensorStateReader_h\n\n#include \"../Kernel/OVR_Lockless.h\"\n#include \"Tracking_SensorState.h\"\n\n#include \"../OVR_Profile.h\"\n\nnamespace OVR { namespace Tracking {\n\n\n//-----------------------------------------------------------------------------\n// SensorStateReader\n\n// User interface to retrieve pose from the sensor fusion subsystem\nclass SensorStateReader : public NewOverrideBase\n{\nprotected:\n\tconst CombinedSharedStateUpdater *Updater;\n\n\n    // Last latency warning time\n    mutable double LastLatWarnTime;\n\n    // Transform from real-world coordinates to centered coordinates\n    Posed CenteredFromWorld; \n\npublic:\n\tSensorStateReader();\n\n\t// Initialize the updater\n    void         SetUpdater(const CombinedSharedStateUpdater *updater);\n\n\t// Re-centers on the current yaw (optionally pitch) and translation\n\tvoid\t\t RecenterPose();\n\n\t// Get the full dynamical system state of the CPF, which includes velocities and accelerations,\n\t// predicted at a specified absolute point in time.\n\tbool\t\t GetSensorStateAtTime(double absoluteTime, Tracking::TrackingState& state) const;\n\n\t// Get the predicted pose (orientation, position) of the center pupil frame (CPF) at a specific point in time.\n\tbool\t\t GetPoseAtTime(double absoluteTime, Posef& transform) const;\n\n\t// Get the sensor status (same as GetSensorStateAtTime(...).Status)\n\tuint32_t     GetStatus() const;\n\n    const Posed getCenteredFromWorld()\n    {\n        return CenteredFromWorld;\n    }\n\n    void setCenteredFromWorld(const Posed _CenteredFromWorld)\n    {\n        CenteredFromWorld = _CenteredFromWorld;\n    }\n};\n\n\n}} // namespace OVR::Tracking\n\n#endif // Tracking_SensorStateReader_h\n"
  },
  {
    "path": "externals/ovr/Src/Util/Util_ImageWindow.cpp",
    "content": "/************************************************************************************\n\nFilename    :   Util_ImageWindow.cpp\nContent     :   An output object for windows that can display raw images for testing\nCreated     :   March 13, 2014\nAuthors     :   Dean Beeler\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n#include \"../../Include/OVR_Kernel.h\"\n\n#include \"Util_ImageWindow.h\"\n\n#if defined(OVR_OS_WIN32)\n\n#define WIN32_LEAN_AND_MEAN\n#include <Windows.h>\n\n#include \"DWrite.h\"\n\ntypedef HRESULT (WINAPI *D2D1CreateFactoryFn)(\n\t_In_      D2D1_FACTORY_TYPE,\n\t_In_      REFIID,\n\t_In_opt_  const D2D1_FACTORY_OPTIONS*,\n\t_Out_     ID2D1Factory **\n\t);\n\ntypedef HRESULT (WINAPI *DWriteCreateFactoryFn)(\n\t_In_   DWRITE_FACTORY_TYPE factoryType,\n\t_In_   REFIID iid,\n\t_Out_  IUnknown **factory\n\t);\n\n\nnamespace OVR { namespace Util {\n\t\nID2D1Factory* ImageWindow::pD2DFactory = NULL;\nIDWriteFactory* ImageWindow::pDWriteFactory = NULL;\nHINSTANCE ImageWindow::hInstD2d1 = NULL;\nHINSTANCE ImageWindow::hInstDwrite = NULL;\n\n\n// TODO(review): This appears to be (at present) necessary, the global list is accessed by the\n// render loop in Samples.  In the current version, windows will just be lost when windowCount\n// exceeds MaxWindows; I've left that in place, since this is unfamiliar code. I'm not sure what\n// thread-safety guarantees this portion of the code needs to satisfy, so I don't want to\n// change it to a list or whatever.  Asserts added to catch the error.\nImageWindow* ImageWindow::globalWindow[ImageWindow::MaxWindows];\nint ImageWindow::windowCount = 0;\n\nLRESULT CALLBACK MainWndProc(\n\tHWND hwnd,\n\tUINT uMsg,\n\tWPARAM wParam,\n\tLPARAM lParam)\n{\n\tswitch (uMsg) \n\t{ \n\tcase WM_CREATE: \n\t\treturn 0; \n\n\tcase WM_PAINT: \n\t\t{\n\t\t\tLONG_PTR ptr = GetWindowLongPtr( hwnd, GWLP_USERDATA );\n\t\t\tif( ptr )\n\t\t\t{\n\t\t\t\tImageWindow* iw = (ImageWindow*)ptr;\n\t\t\t\tiw->OnPaint();\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn 0; \n\n\tcase WM_SIZE: \n\t\t// Set the size and position of the window. \n\t\treturn 0; \n\n\tcase WM_DESTROY: \n\t\t// Clean up window-specific data objects. \n\t\treturn 0; \n\n\t\t// \n\t\t// Process other messages. \n\t\t// \n\n\tdefault: \n\t\treturn DefWindowProc(hwnd, uMsg, wParam, lParam); \n\t} \n\t//return 0; \n}\n\n\nImageWindow::ImageWindow( uint32_t width, uint32_t height ) :\n\thWindow(NULL), \n    pRT(NULL), \n  //resolution(),\n    frontBufferMutex( new Mutex() ),\n    frames(),\n    greyBitmap(NULL),\n    colorBitmap(NULL)\n{\n\tD2D1CreateFactoryFn createFactory = NULL;\n\tDWriteCreateFactoryFn writeFactory = NULL;\n\n\tif (!hInstD2d1)\n    {\n        hInstD2d1 = LoadLibraryW( L\"d2d1.dll\" );\n    }\n\n\tif (!hInstD2d1)\n    {\n\t    hInstD2d1 = LoadLibraryW( L\"Dwrite.dll\" );\n    }\n\n\tif( hInstD2d1 )\n\t{\n\t\tcreateFactory = (D2D1CreateFactoryFn)GetProcAddress( hInstD2d1, \"D2D1CreateFactory\" );\n\t}\n\n\tif( hInstDwrite )\n\t{\n\t\twriteFactory = (DWriteCreateFactoryFn)GetProcAddress( hInstDwrite, \"DWriteCreateFactory\" );\n\t}\n\n    // TODO: see note where globalWindow is declared.\n\tglobalWindow[windowCount++ % MaxWindows] = this;\n    OVR_ASSERT(windowCount < MaxWindows);\n\n\tif( pD2DFactory == NULL && createFactory && writeFactory )\n\t{\n        // Create a Direct2D factory.\n\t\tHRESULT hResult = createFactory( \n\t\t\tD2D1_FACTORY_TYPE_MULTI_THREADED,\n\t\t\t__uuidof(ID2D1Factory),\n\t\t\tNULL,\n\t\t\t&pD2DFactory // This will be AddRef'd for us.\n\t\t\t);\n        OVR_ASSERT_AND_UNUSED(hResult == S_OK, hResult);\n\n\t\t// Create a DirectWrite factory.\n\t\thResult = writeFactory(\n\t\t\tDWRITE_FACTORY_TYPE_SHARED,\n\t\t\t__uuidof(pDWriteFactory), // This probably should instead be __uuidof(IDWriteFactory)\n\t\t\treinterpret_cast<IUnknown **>(&pDWriteFactory)  // This will be AddRef'd for us.\n\t\t\t);\n        OVR_ASSERT_AND_UNUSED(hResult == S_OK, hResult);\n\t}\n\n\tresolution = D2D1::SizeU( width, height );\n\n\tif (hWindow)\n    {\n        SetWindowLongPtr( hWindow, GWLP_USERDATA, (LONG_PTR)this );\n    }\n}\n\nImageWindow::~ImageWindow()\n{\n\tfor( int i = 0; i < MaxWindows; ++i )\n\t{\n\t\tif( globalWindow[i] == this )\n\t\t{\n\t\t\tglobalWindow[i] = NULL;\n\t\t\tbreak;\n\t\t}\n    }\n\n\tif( greyBitmap )\n\t\tgreyBitmap->Release();\n\n\tif( colorBitmap )\n\t\tcolorBitmap->Release();\n\n\tif( pRT )\n\t\tpRT->Release();\n\n\t{\n\t\tMutex::Locker locker( frontBufferMutex  );\n\n\t\twhile( frames.GetSize() )\n\t\t{\n\t\t\tPtr<Frame> aFrame = frames.PopBack();\n\t\t}\n\t}\n\n\tdelete frontBufferMutex;\n\n\tif (hWindow)\n    {\n\t    ShowWindow( hWindow, SW_HIDE );\n\t    DestroyWindow( hWindow );\n    }\n\n    if (pD2DFactory)\n    {\n        pD2DFactory->Release();\n        pD2DFactory = NULL;\n    }\n\n    if (pDWriteFactory)\n    {\n        pDWriteFactory->Release();\n        pDWriteFactory = NULL;\n    }\n\n\tif( hInstD2d1 )\n\t{\n\t\tFreeLibrary(hInstD2d1);\n        hInstD2d1 = NULL;\n\t}\n\n\tif( hInstDwrite )\n\t{\n\t\tFreeLibrary(hInstDwrite);\n        hInstDwrite = NULL;\n\t}\n}\n\nvoid ImageWindow::AssociateSurface( void* surface )\n{\n    if (pD2DFactory)\n    {\n\t    // Assume an IUnknown\n\t    IUnknown* unknown = (IUnknown*)surface;\n\n\t    IDXGISurface *pDxgiSurface = NULL;\n\t    HRESULT hr = unknown->QueryInterface(&pDxgiSurface);\n\t    if( hr == S_OK )\n\t    {\n\t\t    D2D1_RENDER_TARGET_PROPERTIES props =\n\t\t\t    D2D1::RenderTargetProperties(\n\t\t\t    D2D1_RENDER_TARGET_TYPE_DEFAULT,\n\t\t\t    D2D1::PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED),\n\t\t\t    96,\n\t\t\t    96\n\t\t\t    );\n\n\t\t    pRT = NULL;\t\t\t\n\t\t    ID2D1RenderTarget* tmpTarget;\n\n        \thr = pD2DFactory->CreateDxgiSurfaceRenderTarget( pDxgiSurface, &props, &tmpTarget );\n\n\t\t    if( hr == S_OK )\n\t\t    {\n\t\t\t    DXGI_SURFACE_DESC desc = {0};\n\t\t\t    pDxgiSurface->GetDesc( &desc );\n\t\t\t    int width = desc.Width;\n\t\t\t    int height = desc.Height;\n\n\t\t\t    D2D1_SIZE_U size = D2D1::SizeU( width, height );\n\n\t\t\t    D2D1_PIXEL_FORMAT pixelFormat = D2D1::PixelFormat(\n\t\t\t\t    DXGI_FORMAT_A8_UNORM,\n\t\t\t\t    D2D1_ALPHA_MODE_PREMULTIPLIED\n\t\t\t\t    );\n\n\t\t\t    D2D1_PIXEL_FORMAT colorPixelFormat = D2D1::PixelFormat(\n\t\t\t\t    DXGI_FORMAT_B8G8R8A8_UNORM,\n\t\t\t\t    D2D1_ALPHA_MODE_PREMULTIPLIED\n\t\t\t\t    );\n\n\t\t\t    D2D1_BITMAP_PROPERTIES bitmapProps;\n\t\t\t    bitmapProps.dpiX = 96;\n\t\t\t    bitmapProps.dpiY = 96;\n\t\t\t    bitmapProps.pixelFormat = pixelFormat;\n\n\t\t\t    D2D1_BITMAP_PROPERTIES colorBitmapProps;\n\t\t\t    colorBitmapProps.dpiX = 96;\n\t\t\t    colorBitmapProps.dpiY = 96;\n\t\t\t    colorBitmapProps.pixelFormat = colorPixelFormat;\n\n\t\t\t    HRESULT result = tmpTarget->CreateBitmap( size, bitmapProps, &greyBitmap );\n\t\t\t    if( result != S_OK )\n\t\t\t    {\n\t\t\t\t    tmpTarget->Release();\n\t\t\t\t    tmpTarget = NULL;\n\t\t\t    }\n\n\t\t\t    if (tmpTarget)\n\t\t\t    {\n\t\t\t\t    result = tmpTarget->CreateBitmap(size, colorBitmapProps, &colorBitmap);\n\t\t\t\t    if (result != S_OK)\n\t\t\t\t    {\n\t\t\t\t\t    tmpTarget->Release();\n\t\t\t\t\t    tmpTarget = NULL;\n\t\t\t\t    }\n\t\t\t    }\n\t\t\t    pRT = tmpTarget;\n\t\t    }\n\t    }\n    }\n}\n\nvoid ImageWindow::Process()\n{\n\tif( pRT && greyBitmap )\n\t{\n\t\tOnPaint();\n\n\t\tpRT->Flush();\n\t}\n}\n\nvoid ImageWindow::Complete()\n{\n\tMutex::Locker locker( frontBufferMutex  );\n\n\tif( frames.IsEmpty() )\n\t\treturn;\n\n\tif( frames.PeekBack(0)->ready )\n\t\treturn;\n\n\tPtr<Frame> frame = frames.PeekBack(0);\n\n\tframe->ready = true;\n}\n\nvoid ImageWindow::OnPaint()\n{\n\tMutex::Locker locker( frontBufferMutex  );\n\n\t// Nothing to do\n\tif( frames.IsEmpty() )\n\t\treturn;\n\n\tif( !frames.PeekFront(0)->ready )\n\t\treturn;\n\n\tPtr<Frame> currentFrame = frames.PopFront();\n\n\tPtr<Frame> nextFrame = NULL;\n\n\tif( !frames.IsEmpty() )\n\t\tnextFrame = frames.PeekFront(0);\n\t\n\twhile( nextFrame && nextFrame->ready )\n\t{\n\t\t// Free up the current frame since it's been removed from the deque\n\t\tcurrentFrame = frames.PopFront();\n\n\t\tif( frames.IsEmpty() )\n\t\t\tbreak;\n\n\t\tnextFrame = frames.PeekFront(0);\n\t}\n\n\tif( currentFrame->imageData )\n\t\tgreyBitmap->CopyFromMemory( NULL, currentFrame->imageData, currentFrame->width );\n\n\tif( currentFrame->colorImageData )\n\t\tcolorBitmap->CopyFromMemory( NULL, currentFrame->colorImageData, currentFrame->colorPitch );\n\n\tpRT->BeginDraw();\n\n\tpRT->SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED); \n\n\tpRT->Clear( D2D1::ColorF(D2D1::ColorF::Black) );\n\n\t// This will mirror our image\n\tD2D1_MATRIX_3X2_F m;\n\tm._11 = -1; m._12 = 0;\n\tm._21 = 0; m._22 = 1;\n\tm._31 = 0; m._32 = 0;\n\tpRT->SetTransform( m );\n\n\tID2D1SolidColorBrush* whiteBrush;\n\n\tpRT->CreateSolidColorBrush( D2D1::ColorF(D2D1::ColorF::White, 1.0f), &whiteBrush );\n\n\tif( currentFrame->imageData )\n\t{\n\t\tpRT->FillOpacityMask( greyBitmap, whiteBrush, \n\t\t\tD2D1_OPACITY_MASK_CONTENT_TEXT_NATURAL, \n\t\t\tD2D1::RectF( -(FLOAT)resolution.width, 0.0f, (FLOAT)0.0f, (FLOAT)resolution.height ), \n\t\t\t//D2D1::RectF( 0.0f, 0.0f, (FLOAT)0.0f, (FLOAT)resolution.height ), \n\t\t\tD2D1::RectF( 0.0f, 0.0f, (FLOAT)resolution.width, (FLOAT)resolution.height ) );\n\t}\n\telse if( currentFrame->colorImageData )\n\t{\n\t\tpRT->DrawBitmap( colorBitmap,\n\t\t\tD2D1::RectF( -(FLOAT)resolution.width, 0.0f, (FLOAT)0.0f, (FLOAT)resolution.height ) );\n\n\t}\n\n\tpRT->SetTransform(D2D1::Matrix3x2F::Identity());\n\n\twhiteBrush->Release();\n\n\tArray<CirclePlot>::Iterator it;\n\n\tfor( it = currentFrame->plots.Begin(); it != currentFrame->plots.End(); ++it )\n\t{\n\t\tID2D1SolidColorBrush* aBrush;\n\n\t\tpRT->CreateSolidColorBrush( D2D1::ColorF( it->r, it->g, it->b), &aBrush );\n\n\t\tD2D1_ELLIPSE ellipse;\n\t\tellipse.point.x = it->x;\n\t\tellipse.point.y = it->y;\n\t\tellipse.radiusX = it->radius;\n\t\tellipse.radiusY = it->radius;\n\n\t\tif( it->fill )\n\t\t\tpRT->FillEllipse( &ellipse, aBrush );\n\t\telse\n\t\t\tpRT->DrawEllipse( &ellipse, aBrush );\n\n\t\taBrush->Release();\n\t}\n\n\tstatic const WCHAR msc_fontName[] = L\"Verdana\";\n\tstatic const FLOAT msc_fontSize = 20;\n\n\tIDWriteTextFormat* textFormat = NULL;\n\n\t// Create a DirectWrite text format object.\n\tpDWriteFactory->CreateTextFormat(\n\t\tmsc_fontName,\n\t\tNULL,\n\t\tDWRITE_FONT_WEIGHT_NORMAL,\n\t\tDWRITE_FONT_STYLE_NORMAL,\n\t\tDWRITE_FONT_STRETCH_NORMAL,\n\t\tmsc_fontSize,\n\t\tL\"\", //locale\n\t\t&textFormat\n\t\t);\n\n\tD2D1_SIZE_F renderTargetSize = pRT->GetSize();\n\n\tArray<TextPlot>::Iterator textIt;\n\tfor( textIt = currentFrame->textLines.Begin(); textIt != currentFrame->textLines.End(); ++textIt )\n\t{\n\t\tID2D1SolidColorBrush* aBrush;\n\n\t\tpRT->CreateSolidColorBrush( D2D1::ColorF( textIt->r, textIt->g, textIt->b), &aBrush );\n\n\t\tWCHAR* tmpString = (WCHAR*)calloc( textIt->text.GetLength(),  sizeof( WCHAR ) );\n\t\tfor( unsigned i = 0; i < textIt->text.GetLength(); ++i )\n\t\t{\n\t\t\ttmpString[i] = (WCHAR)textIt->text.GetCharAt( i );\n\t\t}\n\t\t\t\t\t\n\t\tpRT->DrawTextW( tmpString, (UINT32)textIt->text.GetLength(), textFormat,\n\t\t\tD2D1::RectF(textIt->x, textIt->y, renderTargetSize.width, renderTargetSize.height), aBrush );\n\n\t\tfree( tmpString );\n\n\t\taBrush->Release();\n\t}\n\n\tif( textFormat )\n\t\ttextFormat->Release();\n\n\tpRT->EndDraw();\n\n\tpRT->Flush();\n}\n\nPtr<Frame> ImageWindow::lastUnreadyFrame()\n{\n\tstatic int framenumber = 0;\n\n\tif( frames.GetSize() && !frames.PeekBack( 0 )->ready )\n\t\treturn frames.PeekBack( 0 );\n\n\t// Create a new frame if an unready one doesn't already exist\n\tPtr<Frame> tmpFrame = *new Frame( framenumber );\n\tframes.PushBack( tmpFrame );\n\n\t++framenumber;\n\n\treturn tmpFrame;\n}\n\nvoid ImageWindow::UpdateImageBW( const uint8_t* imageData, uint32_t width, uint32_t height )\n{\n\tif( pRT && greyBitmap )\n\t{\n\t\tMutex::Locker locker( frontBufferMutex );\n\n\t\tPtr<Frame> frame = lastUnreadyFrame();\n\t\tframe->imageData = malloc( width * height );\n\t\tframe->width = width;\n\t\tframe->height = height;\n\t\tmemcpy( frame->imageData, imageData, width * height );\n\t}\n}\n\nvoid ImageWindow::UpdateImageRGBA( const uint8_t* imageData, uint32_t width, uint32_t height, uint32_t pitch )\n{\n\tif( pRT && colorBitmap )\n\t{\n\t\tMutex::Locker locker( frontBufferMutex );\n\n\t\tPtr<Frame> frame = lastUnreadyFrame();\n\t\tframe->colorImageData = malloc( pitch * height );\n\t\tframe->width = width;\n\t\tframe->height = height;\n\t\tframe->colorPitch = pitch;\n\t\tmemcpy( frame->colorImageData, imageData, pitch * height );\n\t}\n}\n\nvoid ImageWindow::addCircle( float x, float y, float radius, float r, float g, float b, bool fill )\n{\n\tif( pRT )\n\t{\n\t\tCirclePlot cp;\n\n\t\tcp.x = x;\n\t\tcp.y = y;\n\t\tcp.radius = radius;\n\t\tcp.r = r;\n\t\tcp.g = g;\n\t\tcp.b = b;\n\t\tcp.fill = fill;\n\n\t\tMutex::Locker locker( frontBufferMutex );\n\n\t\tPtr<Frame> frame = lastUnreadyFrame();\n\t\tframe->plots.PushBack( cp );\n\t}\n\n}\n\nvoid ImageWindow::addText( float x, float y, float r, float g, float b, OVR::String text )\n{\n\tif( pRT )\n\t{\n\t\tTextPlot tp;\n\n\t\ttp.x = x;\n\t\ttp.y = y;\n\t\ttp.r = r;\n\t\ttp.g = g;\n\t\ttp.b = b;\n\t\ttp.text = text;\n\n\t\tMutex::Locker locker( frontBufferMutex );\n\t\tPtr<Frame> frame = lastUnreadyFrame();\n\t\tframe->textLines.PushBack( tp );\n\t}\n}\n\n}}\n\n#else //defined(OVR_OS_WIN32)\n\nnamespace OVR { namespace Util {\n\nImageWindow* ImageWindow::globalWindow[4];\nint ImageWindow::windowCount = 0;\n\n}}\n\n#endif //#else //defined(OVR_OS_WIN32)\n\n"
  },
  {
    "path": "externals/ovr/Src/Util/Util_ImageWindow.h",
    "content": "/************************************************************************************\n\nFilename    :   Util_ImageWindow.h\nContent     :   An output object for windows that can display raw images for testing\nCreated     :   March 13, 2014\nAuthors     :   Dean Beeler\n\nCopyright   :   Copyright 2014 Oculus, Inc. All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef UTIL_IMAGEWINDOW_H\n#define UTIL_IMAGEWINDOW_H\n\n#if defined(OVR_OS_WIN32)\n#include <WinSock2.h>\n#include <WS2tcpip.h>\n#define WIN32_LEAN_AND_MEAN\n#include <Windows.h>\n#include <d2d1.h>\n#include <dwrite.h>\n#endif\n\n#include \"../Kernel/OVR_Hash.h\"\n#include \"../Kernel/OVR_Array.h\"\n#include \"../Kernel/OVR_Threads.h\"\n#include \"../Kernel/OVR_Deque.h\"\n\n#include <stdint.h>\n\nnamespace OVR { namespace Util {\n\n\ttypedef struct \n\t{\n\t\tfloat x;\n\t\tfloat y;\n\t\tfloat radius;\n\t\tfloat r;\n\t\tfloat g;\n\t\tfloat b;\n\t\tbool  fill;\n\t} CirclePlot;\n\n\ttypedef struct  \n\t{\n\t\tfloat x;\n\t\tfloat y;\n\t\tfloat r;\n\t\tfloat g;\n\t\tfloat b;\n\tOVR::String text;\n\t} TextPlot;\n\nclass Frame : virtual public RefCountBaseV<Frame>\n\t{\npublic:\n\n\tFrame( int frame ) :\n\t\tframeNumber( frame ),\n\t\timageData( NULL ),\n\t\tcolorImageData( NULL ),\n\t\tplots(),\n\t\ttextLines(),\n\t\twidth( 0 ),\n\t\theight( 0 ),\n\t\tcolorPitch( 0 ),\n\t\tready( false )\n\t{\n\n\t}\n\n\t~Frame()\n\t{\n\t\tif( imageData )\n\t\t\tfree( imageData );\n\t\tif( colorImageData )\n\t\t\tfree( colorImageData );\n\n\t\tplots.ClearAndRelease();\n\t\ttextLines.ClearAndRelease();\n\t}\n\n\tint\t\t\t\t\t\tframeNumber;\n\n\t\tArray<CirclePlot> plots;\n\tArray<TextPlot>\t\t\ttextLines;\n\t\tvoid*\t\t\t  imageData;\n\t\tvoid*\t\t\t  colorImageData;\n\t\tint\t\t\t\t  width;\n\t\tint\t\t\t\t  height;\n\t\tint\t\t\t\t  colorPitch;\n\t\tbool\t\t\t  ready;\n};\n\n#if defined(OVR_OS_WIN32)\nclass ImageWindow\n{\n\tHWND hWindow;\n\tID2D1RenderTarget* pRT;\n\tD2D1_SIZE_U resolution;\n\n\tMutex*\t\t\t\t\t\tfrontBufferMutex;\n\n\tInPlaceMutableDeque< Ptr<Frame> >\tframes;\n\n\tID2D1Bitmap*\t\t\t\tgreyBitmap;\n\tID2D1Bitmap*\t\t\t\tcolorBitmap;\n    \npublic:\n\t// constructors\n\tImageWindow();\n\tImageWindow( uint32_t width, uint32_t height );\n\tvirtual ~ImageWindow();\n\n\tvoid GetResolution( size_t& width, size_t& height ) { width = resolution.width; height = resolution.height; }\n\n\tvoid OnPaint(); // Called by Windows when it receives a WM_PAINT message\n\n\tvoid UpdateImage( const uint8_t* imageData, uint32_t width, uint32_t height ) { UpdateImageBW( imageData, width, height ); }\n\tvoid UpdateImageBW( const uint8_t* imageData, uint32_t width, uint32_t height );\n\tvoid UpdateImageRGBA( const uint8_t* imageData, uint32_t width, uint32_t height, uint32_t pitch );\n\tvoid Complete(); // Called by drawing thread to submit a frame\n\n\tvoid Process(); // Called by rendering thread to do window processing\n\n\tvoid AssociateSurface( void* surface );\n\n\tvoid addCircle( float x , float y, float radius, float r, float g, float b, bool fill );\n\tvoid addText( float x, float y, float r, float g, float b, OVR::String text );\n\n\tstatic ImageWindow*\t\t\tGlobalWindow( int window ) { return globalWindow[window]; }\n\tstatic int\t\t\t\t\tWindowCount() { return windowCount; }\n\nprivate:\n\n\tPtr<Frame>\t\t\t\t\tlastUnreadyFrame();\n\n\tstatic const int\t\t\tMaxWindows = 4;\n\tstatic ImageWindow*\t\t\tglobalWindow[MaxWindows];\n\tstatic int\t\t\t\t\twindowCount;\n\tstatic ID2D1Factory*\t\tpD2DFactory;\n\tstatic IDWriteFactory*\t\tpDWriteFactory;\n\tstatic HINSTANCE            hInstD2d1;\n\tstatic HINSTANCE            hInstDwrite;\n\n};\n\n#else\n\nclass ImageWindow\n{\npublic:\n\t// constructors\n\tImageWindow() {}\n\tImageWindow( uint32_t width, uint32_t height ) { OVR_UNUSED( width ); OVR_UNUSED( height ); }\n\tvirtual ~ImageWindow() { }\n\n\tvoid GetResolution( size_t& width, size_t& height ) { width = 0; height = 0; }\n\n\tvoid OnPaint() { }\n\n\tvoid UpdateImage( const uint8_t* imageData, uint32_t width, uint32_t height ) { UpdateImageBW( imageData, width, height ); }\n\tvoid UpdateImageBW( const uint8_t* imageData, uint32_t width, uint32_t height ) { OVR_UNUSED( imageData ); OVR_UNUSED( width ); OVR_UNUSED( height ); }\n\tvoid UpdateImageRGBA( const uint8_t* imageData, uint32_t width, uint32_t height, uint32_t pitch ) { OVR_UNUSED( imageData ); OVR_UNUSED( width ); OVR_UNUSED( height ); OVR_UNUSED( pitch ); }\n\tvoid Complete() { }\n\n\tvoid Process() { }\n\n\tvoid AssociateSurface( void* surface ) { OVR_UNUSED(surface); }\n\n\tvoid addCircle( float x , float y, float radius, float r, float g, float b, bool fill ) { OVR_UNUSED( x ); OVR_UNUSED( y ); OVR_UNUSED( radius ); OVR_UNUSED( r ); OVR_UNUSED( g ); OVR_UNUSED( b ); OVR_UNUSED( fill ); }\n\tvoid addText( float x, float y, float r, float g, float b, OVR::String text ) { OVR_UNUSED( x ); OVR_UNUSED( y ); OVR_UNUSED( r ); OVR_UNUSED( g ); OVR_UNUSED( b ); OVR_UNUSED( text ); }\n\n\tstatic ImageWindow*\t\t\tGlobalWindow( int window ) { return globalWindow[window]; }\n\tstatic int\t\t\t\t\tWindowCount() { return windowCount; }\n\nprivate:\n\n\tstatic const int\t\t\tMaxWindows = 4;\n\tstatic ImageWindow*\t\t\tglobalWindow[4];\n\tstatic int\t\t\t\t\twindowCount;\n};\n\n#endif\n\n}} // namespace OVR::Util\n\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Util/Util_Interface.cpp",
    "content": "/************************************************************************************\n\nFilename    :   Util_Interface.cpp\nContent     :   Simple interface, utilised by internal demos,\n\t\t\t\twith access to wider SDK as needed. \n\t\t\t\tLocated in the body of the SDK to ensure updated\n\t\t\t\twhen new SDK features are added.\nCreated     :   February 20, 2014\nAuthors     :   Tom Heath\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include \"Util_Interface.h\"\n\n\n\n//Files left in to ease its possible return......\n"
  },
  {
    "path": "externals/ovr/Src/Util/Util_Interface.h",
    "content": "/************************************************************************************\n\nFilename    :   Util_Interface.h\nContent     :   Simple interface, utilised by internal demos,\n\t\t\t\twith access to wider SDK as needed. \n\t\t\t\tLocated in the body of the SDK to ensure updated\n\t\t\t\twhen new SDK features are added.\nCreated     :   February 20, 2014\nAuthors     :   Tom Heath\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Util_Interface_h\n#define OVR_Util_Interface_h\n#include \"../OVR_CAPI.h\"\n\n//Files left in to ease its possible return......\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Util/Util_LatencyTest2Reader.cpp",
    "content": "/************************************************************************************\n\nFilename    :   Util_LatencyTest2Reader.cpp\nContent     :   Shared functionality for the DK2 latency tester\nCreated     :   July 8, 2014\nAuthors     :   Volga Aksoy, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include \"Util_LatencyTest2Reader.h\"\n\nnamespace OVR { namespace Util {\n\n\n//// FrameTimeRecord\n\nbool FrameTimeRecord::ColorToReadbackIndex(int *readbackIndex, unsigned char color)\n{\n    int compareColor = color - LT2_ColorIncrement/2;\n    int index        = color / LT2_ColorIncrement;  // Use color without subtraction due to rounding.\n    int delta        = compareColor - index * LT2_ColorIncrement;\n\n    if ((delta < LT2_PixelTestThreshold) && (delta > -LT2_PixelTestThreshold))\n    {\n        *readbackIndex = index;\n        return true;\n    }\n    return false;\n}\n\nunsigned char FrameTimeRecord::ReadbackIndexToColor(int readbackIndex)\n{\n    OVR_ASSERT(readbackIndex < LT2_IncrementCount);\n    return (unsigned char)(readbackIndex * LT2_ColorIncrement + LT2_ColorIncrement/2);\n}\n\n\n//// FrameTimeRecordSet\n\nFrameTimeRecordSet::FrameTimeRecordSet()\n{\n    NextWriteIndex = 0;\n    memset(this, 0, sizeof(FrameTimeRecordSet));\n}\n\nvoid FrameTimeRecordSet::AddValue(int readValue, double timeSeconds)\n{\n    Records[NextWriteIndex].ReadbackIndex = readValue;\n    Records[NextWriteIndex].TimeSeconds = timeSeconds;\n    NextWriteIndex++;\n    if (NextWriteIndex == RecordCount)\n        NextWriteIndex = 0;\n}\n// Matching should be done starting from NextWrite index \n// until wrap-around\n\nconst FrameTimeRecord& FrameTimeRecordSet::operator [] (int i) const\n{\n    return Records[(NextWriteIndex + i) & RecordMask];\n}\n\nconst FrameTimeRecord& FrameTimeRecordSet::GetMostRecentFrame()\n{\n    return Records[(NextWriteIndex - 1) & RecordMask];\n}\n\n// Advances I to  absolute color index\nbool FrameTimeRecordSet::FindReadbackIndex(int* i, int readbackIndex) const\n{\n    for (; *i < RecordCount; (*i)++)\n    {\n        if ((*this)[*i].ReadbackIndex == readbackIndex)\n            return true;\n    }\n    return false;\n}\n\nbool FrameTimeRecordSet::IsAllZeroes() const\n{\n    for (int i = 0; i < RecordCount; i++)\n        if (Records[i].ReadbackIndex != 0)\n            return false;\n    return true;\n}\n\n\n//// RecordStateReader\n\nvoid RecordStateReader::GetRecordSet(FrameTimeRecordSet& recordset)\n{\n    if(!Updater)\n    {\n        return;\n    }\n        \n    recordset = Updater->SharedLatencyTestState.GetState();\n    return;\n}\n\n\n}} // namespace OVR::Util\n"
  },
  {
    "path": "externals/ovr/Src/Util/Util_LatencyTest2Reader.h",
    "content": "/************************************************************************************\n\nFilename    :   Util_LatencyTest2Reader.h\nContent     :   Shared functionality for the DK2 latency tester\nCreated     :   July 8, 2014\nAuthors     :   Volga Aksoy, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Util_LatencyTest2Reader_h\n#define OVR_Util_LatencyTest2Reader_h\n\n#include \"../Tracking/Tracking_SensorState.h\"\n#include \"Util_LatencyTest2State.h\"\n\nnamespace OVR { namespace Util {\n\n\n//-----------------------------------------------------------------------------\n// RecordStateReader\n\n// User interface to retrieve pose from the sensor fusion subsystem\nclass RecordStateReader : public NewOverrideBase\n{\nprotected:\n    const Tracking::CombinedSharedStateUpdater* Updater;\n\npublic:\n    RecordStateReader()\n        : Updater(NULL)\n    {\n    }\n\n    // Initialize the updater\n    void SetUpdater(const Tracking::CombinedSharedStateUpdater *updater)\n    {\n        Updater = updater;\n    }\n\n    void GetRecordSet(FrameTimeRecordSet& recordset);\n};\n\n\n}} // namespace OVR::Util\n\n#endif // OVR_Util_LatencyTest2Reader_h\n"
  },
  {
    "path": "externals/ovr/Src/Util/Util_LatencyTest2State.h",
    "content": "/************************************************************************************\n\nFilename    :   Util_LatencyTest2Reader.h\nContent     :   Shared functionality for the DK2 latency tester\nCreated     :   July 8, 2014\nAuthors     :   Volga Aksoy, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Util_LatencyTest2_State_h\n#define OVR_Util_LatencyTest2_State_h\n\n#include \"../Kernel/OVR_Lockless.h\"\n\nnamespace OVR { namespace Util {\n\n\nenum LatencyTester2Constants\n{\n    LT2_ColorIncrement                  = 32,\n    LT2_PixelTestThreshold              = LT2_ColorIncrement / 3,\n    LT2_IncrementCount                  = 256 / LT2_ColorIncrement,\n    LT2_TimeoutWaitingForColorDetected  = 1000  // 1 second\n};\n\n\n//-------------------------------------------------------------------------------------\n// FrameTimeRecord\n\n// Describes frame scan-out time used for latency testing.\nstruct FrameTimeRecord\n{\n    int    ReadbackIndex;\n    double TimeSeconds;\n\n    // Utility functions to convert color to readBack indices and back.\n    // The purpose of ReadbackIndex is to allow direct comparison by value.\n\n    static bool ColorToReadbackIndex(int *readbackIndex, unsigned char color);\n    static unsigned char ReadbackIndexToColor(int readbackIndex);\n};\n\n\n//-----------------------------------------------------------------------------\n// FrameTimeRecordSet\n\n// FrameTimeRecordSet is a container holding multiple consecutive frame timing records\n// returned from the lock-less state. Used by FrameTimeManager. \nstruct FrameTimeRecordSet\n{\n    enum {\n        RecordCount = 4,\n        RecordMask  = RecordCount - 1\n    };\n    FrameTimeRecord Records[RecordCount];    \n    int             NextWriteIndex;\n\n    FrameTimeRecordSet();\n\n    void AddValue(int readValue, double timeSeconds);\n    // Matching should be done starting from NextWrite index \n    // until wrap-around\n\n    const FrameTimeRecord& operator [] (int i) const;\n\n    const FrameTimeRecord& GetMostRecentFrame();\n\n    // Advances I to  absolute color index\n    bool FindReadbackIndex(int* i, int readbackIndex) const;\n\n    bool IsAllZeroes() const;\n};\n\ntypedef LocklessUpdater<FrameTimeRecordSet, FrameTimeRecordSet> LockessRecordUpdater;\n\n\n}} // namespace OVR::Util\n\n#endif // OVR_Util_LatencyTest2_State_h\n"
  },
  {
    "path": "externals/ovr/Src/Util/Util_Render_Stereo.cpp",
    "content": "/************************************************************************************\n\nFilename    :   Util_Render_Stereo.cpp\nContent     :   Stereo rendering configuration implementation\nCreated     :   October 22, 2012\nAuthors     :   Michael Antonov, Andrew Reisse, Tom Forsyth\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include \"Util_Render_Stereo.h\"\n\nnamespace OVR { namespace Util { namespace Render {\n\nusing namespace OVR::Tracking;\n\n\n//-----------------------------------------------------------------------------------\n// **** Useful debug functions.\n\nchar const* GetDebugNameEyeCupType ( EyeCupType eyeCupType )\n{\n    switch ( eyeCupType )\n    {\n    case EyeCup_DK1A:           return \"DK1 A\";\n    case EyeCup_DK1B:           return \"DK1 B\";\n    case EyeCup_DK1C:           return \"DK1 C\";\n    case EyeCup_DKHD2A:         return \"DKHD2 A\";\n    case EyeCup_OrangeA:        return \"Orange A\";\n    case EyeCup_RedA:           return \"Red A\";\n    case EyeCup_PinkA:          return \"Pink A\";\n    case EyeCup_BlueA:          return \"Blue A\";\n    case EyeCup_Delilah1A:      return \"Delilah 1 A\";\n    case EyeCup_Delilah2A:      return \"Delilah 2 A\";\n    case EyeCup_JamesA:         return \"James A\";\n    case EyeCup_SunMandalaA:    return \"Sun Mandala A\";\n    case EyeCup_DK2A:           return \"DK2 A\";\n    case EyeCup_LAST:           return \"LAST\";\n    default: OVR_ASSERT ( false ); return \"Error\";\n    }\n}\n\nchar const* GetDebugNameHmdType ( HmdTypeEnum hmdType )\n{\n    switch ( hmdType )\n    {\n    case HmdType_None:              return \"None\";\n    case HmdType_DK1:               return \"DK1\";\n    case HmdType_DKProto:           return \"DK1 prototype\";\n    case HmdType_DKHDProto:         return \"DK HD prototype 1\";\n    case HmdType_DKHDProto566Mi:    return \"DK HD prototype 566 Mi\";\n    case HmdType_DKHD2Proto:        return \"DK HD prototype 585\";\n    case HmdType_CrystalCoveProto:  return \"Crystal Cove\";\n    case HmdType_DK2:               return \"DK2\";\n    case HmdType_Unknown:           return \"Unknown\";\n    case HmdType_LAST:              return \"LAST\";\n    default: OVR_ASSERT ( false ); return \"Error\";\n    }\n}\n\n\n//-----------------------------------------------------------------------------------\n// **** Internal pipeline functions.\n\nstruct DistortionAndFov\n{\n    DistortionRenderDesc    Distortion;\n    FovPort                 Fov;\n};\n\nstatic DistortionAndFov CalculateDistortionAndFovInternal ( StereoEye eyeType, HmdRenderInfo const &hmd,\n                                                            LensConfig const *pLensOverride = NULL,\n                                                            FovPort const *pTanHalfFovOverride = NULL,\n                                                            float extraEyeRotationInRadians = OVR_DEFAULT_EXTRA_EYE_ROTATION )\n{\n    // pLensOverride can be NULL, which means no override.\n\n    DistortionRenderDesc localDistortion  = CalculateDistortionRenderDesc ( eyeType, hmd, pLensOverride );\n    FovPort              fov              = CalculateFovFromHmdInfo ( eyeType, localDistortion, hmd, extraEyeRotationInRadians );\n    // Here the app or the user would optionally clamp this visible fov to a smaller number if\n    // they want more perf or resolution and are willing to give up FOV.\n    // They may also choose to clamp UDLR differently e.g. to get cinemascope-style views.\n    if ( pTanHalfFovOverride != NULL )\n    {\n        fov = *pTanHalfFovOverride;\n    }\n\n    // Here we could call ClampToPhysicalScreenFov(), but we do want people\n    // to be able to play with larger-than-screen views.\n    // The calling app can always do the clamping itself.\n    DistortionAndFov result;\n    result.Distortion = localDistortion;\n    result.Fov        = fov;\n\n    return result;\n}\n\n\nstatic Recti CalculateViewportInternal ( StereoEye eyeType,\n                                            Sizei const actualRendertargetSurfaceSize,\n                                            Sizei const requestedRenderedPixelSize,\n                                            bool bRendertargetSharedByBothEyes,\n                                            bool bMonoRenderingMode = false )\n{\n    Recti renderedViewport;\n    if ( bMonoRenderingMode || !bRendertargetSharedByBothEyes || (eyeType == StereoEye_Center) )\n    {\n        // One eye per RT.\n        renderedViewport.x = 0;\n        renderedViewport.y = 0;\n        renderedViewport.w = Alg::Min ( actualRendertargetSurfaceSize.w, requestedRenderedPixelSize.w );\n        renderedViewport.h = Alg::Min ( actualRendertargetSurfaceSize.h, requestedRenderedPixelSize.h );\n    }\n    else\n    {\n        // Both eyes share the RT.\n        renderedViewport.x = 0;\n        renderedViewport.y = 0;\n        renderedViewport.w = Alg::Min ( actualRendertargetSurfaceSize.w/2, requestedRenderedPixelSize.w );\n        renderedViewport.h = Alg::Min ( actualRendertargetSurfaceSize.h,  requestedRenderedPixelSize.h );\n        if ( eyeType == StereoEye_Right )\n        {\n            renderedViewport.x = (actualRendertargetSurfaceSize.w+1)/2;      // Round up, not down.\n        }\n    }\n    return renderedViewport;\n}\n\nstatic Recti CalculateViewportDensityInternal ( StereoEye eyeType,\n                                                   DistortionRenderDesc const &distortion,\n                                                   FovPort const &fov,\n                                                   Sizei const &actualRendertargetSurfaceSize,\n                                                   bool bRendertargetSharedByBothEyes,\n                                                   float desiredPixelDensity = 1.0f,\n                                                   bool bMonoRenderingMode = false )\n{\n    OVR_ASSERT ( actualRendertargetSurfaceSize.w > 0 );\n    OVR_ASSERT ( actualRendertargetSurfaceSize.h > 0 );\n\n    // What size RT do we need to get 1:1 mapping?\n    Sizei idealPixelSize = CalculateIdealPixelSize ( eyeType, distortion, fov, desiredPixelDensity );\n    // ...but we might not actually get that size.\n    return CalculateViewportInternal ( eyeType,\n                                       actualRendertargetSurfaceSize,\n                                       idealPixelSize,\n                                       bRendertargetSharedByBothEyes, bMonoRenderingMode );\n}\n\nstatic ViewportScaleAndOffset CalculateViewportScaleAndOffsetInternal (\n                                                          ScaleAndOffset2D const &eyeToSourceNDC,\n                                                          Recti const &renderedViewport,\n                                                          Sizei const &actualRendertargetSurfaceSize )\n{\n    ViewportScaleAndOffset result;\n    result.RenderedViewport = renderedViewport;\n    result.EyeToSourceUV = CreateUVScaleAndOffsetfromNDCScaleandOffset(\n                                            eyeToSourceNDC, renderedViewport, actualRendertargetSurfaceSize );\n    return result;\n}\n\n\nstatic StereoEyeParams CalculateStereoEyeParamsInternal ( StereoEye eyeType, HmdRenderInfo const &hmd,\n                                                          DistortionRenderDesc const &distortion,\n                                                          FovPort const &fov,\n                                                          Sizei const &actualRendertargetSurfaceSize,\n                                                          Recti const &renderedViewport,\n                                                          bool bRightHanded = true, float zNear = 0.01f, float zFar = 10000.0f,\n                                                          bool bMonoRenderingMode = false,\n                                                          float zoomFactor = 1.0f )\n{\n    // Generate the projection matrix for intermediate rendertarget.\n    // Z range can also be inserted later by the app (though not in this particular case)\n    float fovScale = 1.0f / zoomFactor;\n    FovPort zoomedFov = fov;\n    zoomedFov.LeftTan  *= fovScale;\n    zoomedFov.RightTan *= fovScale;\n    zoomedFov.UpTan    *= fovScale;\n    zoomedFov.DownTan  *= fovScale;\n    Matrix4f projection = CreateProjection ( bRightHanded, zoomedFov, zNear, zFar );\n\n    // Find the mapping from TanAngle space to target NDC space.\n    // Note this does NOT take the zoom factor into account because\n    // this is the mapping of actual physical eye FOV (and our eyes do not zoom!)\n    // to screen space.\n    ScaleAndOffset2D eyeToSourceNDC = CreateNDCScaleAndOffsetFromFov ( fov );\n\n    // The size of the final FB, which is fixed and determined by the physical size of the device display.\n    Recti distortedViewport   = GetFramebufferViewport ( eyeType, hmd );\n    Vector3f virtualCameraOffset = CalculateEyeVirtualCameraOffset(hmd, eyeType, bMonoRenderingMode);\n\n    StereoEyeParams result;\n    result.Eye                  = eyeType;\n    result.HmdToEyeViewOffset   = Matrix4f::Translation(virtualCameraOffset);\n    result.Distortion           = distortion;\n    result.DistortionViewport   = distortedViewport;\n    result.Fov                  = fov;\n    result.RenderedProjection   = projection;\n    result.EyeToSourceNDC       = eyeToSourceNDC;\n    ViewportScaleAndOffset vsao = CalculateViewportScaleAndOffsetInternal ( eyeToSourceNDC, renderedViewport, actualRendertargetSurfaceSize );\n    result.RenderedViewport     = vsao.RenderedViewport;\n    result.EyeToSourceUV        = vsao.EyeToSourceUV;\n\n    return result;\n}\n\n\nVector3f CalculateEyeVirtualCameraOffset(HmdRenderInfo const &hmd,\n                                         StereoEye eyeType, bool bmonoRenderingMode)\n{\n    Vector3f virtualCameraOffset(0);\n\n    if (!bmonoRenderingMode)\n    {\n        float eyeCenterRelief = hmd.GetEyeCenter().ReliefInMeters;\n\n        if (eyeType == StereoEye_Left)\n        {\n            virtualCameraOffset.x = hmd.EyeLeft.NoseToPupilInMeters;\n            virtualCameraOffset.z = eyeCenterRelief - hmd.EyeLeft.ReliefInMeters;\n        }\n        else if (eyeType == StereoEye_Right)\n        {\n            virtualCameraOffset.x = -hmd.EyeRight.NoseToPupilInMeters;\n            virtualCameraOffset.z = eyeCenterRelief - hmd.EyeRight.ReliefInMeters;\n        }\n    }\n\n    return virtualCameraOffset;\n}\n\n\n//-----------------------------------------------------------------------------------\n// **** Higher-level utility functions.\n\nSizei CalculateRecommendedTextureSize ( HmdRenderInfo const &hmd,\n                                        bool bRendertargetSharedByBothEyes,\n                                        float pixelDensityInCenter /*= 1.0f*/ )\n{\n    Sizei idealPixelSize[2];\n    for ( int eyeNum = 0; eyeNum < 2; eyeNum++ )\n    {\n        StereoEye eyeType = ( eyeNum == 0 ) ? StereoEye_Left : StereoEye_Right;\n\n        DistortionAndFov distortionAndFov = CalculateDistortionAndFovInternal ( eyeType, hmd, NULL, NULL, OVR_DEFAULT_EXTRA_EYE_ROTATION );\n\n        idealPixelSize[eyeNum] = CalculateIdealPixelSize ( eyeType,\n                                        distortionAndFov.Distortion,\n                                        distortionAndFov.Fov,\n                                        pixelDensityInCenter );\n    }\n\n    Sizei result;\n    result.w = Alg::Max ( idealPixelSize[0].w, idealPixelSize[1].w );\n    result.h = Alg::Max ( idealPixelSize[0].h, idealPixelSize[1].h );\n    if ( bRendertargetSharedByBothEyes )\n    {\n        result.w *= 2;\n    }\n    return result;\n}\n\nStereoEyeParams CalculateStereoEyeParams ( HmdRenderInfo const &hmd,\n                                           StereoEye eyeType,\n                                           Sizei const &actualRendertargetSurfaceSize,\n                                           bool bRendertargetSharedByBothEyes,\n                                           bool bRightHanded /*= true*/,\n                                           float zNear /*= 0.01f*/, float zFar /*= 10000.0f*/,\n\t\t\t\t\t\t\t\t\t\t   Sizei const *pOverrideRenderedPixelSize /* = NULL*/,\n                                           FovPort const *pOverrideFovport /*= NULL*/,\n                                           float zoomFactor /*= 1.0f*/ )\n{\n    DistortionAndFov distortionAndFov = CalculateDistortionAndFovInternal ( eyeType, hmd, NULL, NULL, OVR_DEFAULT_EXTRA_EYE_ROTATION );\n    if ( pOverrideFovport != NULL )\n    {\n        distortionAndFov.Fov = *pOverrideFovport;\n    }\n\n    Recti viewport;\n    if ( pOverrideRenderedPixelSize != NULL )\n    {\n        viewport = CalculateViewportInternal ( eyeType, actualRendertargetSurfaceSize, *pOverrideRenderedPixelSize, bRendertargetSharedByBothEyes, false );\n    }\n    else\n    {\n        viewport = CalculateViewportDensityInternal ( eyeType,\n                                                      distortionAndFov.Distortion,\n                                                      distortionAndFov.Fov,\n                                                      actualRendertargetSurfaceSize, bRendertargetSharedByBothEyes, 1.0f, false );\n    }\n\n    return CalculateStereoEyeParamsInternal (\n                                eyeType, hmd,\n                                distortionAndFov.Distortion,\n                                distortionAndFov.Fov,\n                                actualRendertargetSurfaceSize, viewport,\n                                bRightHanded, zNear, zFar, false, zoomFactor );\n}\n\n\nFovPort CalculateRecommendedFov ( HmdRenderInfo const &hmd,\n                                  StereoEye eyeType,\n                                  bool bMakeFovSymmetrical /* = false */ )\n{\n    DistortionAndFov distortionAndFov = CalculateDistortionAndFovInternal ( eyeType, hmd, NULL, NULL, OVR_DEFAULT_EXTRA_EYE_ROTATION );\n    FovPort fov = distortionAndFov.Fov;\n    if ( bMakeFovSymmetrical )\n    {\n        // Deal with engines that cannot support an off-center projection.\n        // Unfortunately this means they will be rendering pixels that the user can't actually see.\n        float fovTanH = Alg::Max ( fov.LeftTan, fov.RightTan );\n        float fovTanV = Alg::Max ( fov.UpTan, fov.DownTan );\n        fov.LeftTan = fovTanH;\n        fov.RightTan = fovTanH;\n        fov.UpTan = fovTanV;\n        fov.DownTan = fovTanV;\n    }\n    return fov;\n}\n\nViewportScaleAndOffset ModifyRenderViewport ( StereoEyeParams const &params,\n                                              Sizei const &actualRendertargetSurfaceSize,\n                                              Recti const &renderViewport )\n{\n    return CalculateViewportScaleAndOffsetInternal ( params.EyeToSourceNDC, renderViewport, actualRendertargetSurfaceSize );\n}\n\nViewportScaleAndOffset ModifyRenderSize ( StereoEyeParams const &params,\n                                          Sizei const &actualRendertargetSurfaceSize,\n                                          Sizei const &requestedRenderSize,\n                                          bool bRendertargetSharedByBothEyes /*= false*/ )\n{\n    Recti renderViewport = CalculateViewportInternal ( params.Eye, actualRendertargetSurfaceSize, requestedRenderSize, bRendertargetSharedByBothEyes, false );\n    return CalculateViewportScaleAndOffsetInternal ( params.EyeToSourceNDC, renderViewport, actualRendertargetSurfaceSize );\n}\n\nViewportScaleAndOffset ModifyRenderDensity ( StereoEyeParams const &params,\n                                             Sizei const &actualRendertargetSurfaceSize,\n                                             float pixelDensity /*= 1.0f*/,\n                                             bool bRendertargetSharedByBothEyes /*= false*/ )\n{\n    Recti renderViewport = CalculateViewportDensityInternal ( params.Eye, params.Distortion, params.Fov, actualRendertargetSurfaceSize, bRendertargetSharedByBothEyes, pixelDensity, false );\n    return CalculateViewportScaleAndOffsetInternal ( params.EyeToSourceNDC, renderViewport, actualRendertargetSurfaceSize );\n}\n\n\n//-----------------------------------------------------------------------------------\n// **** StereoConfig Implementation\n\nStereoConfig::StereoConfig(StereoMode mode)\n    : Mode(mode),\n      DirtyFlag(true)\n{\n    // Initialize \"fake\" default HMD values for testing without HMD plugged in.\n    // These default values match those returned by DK1\n    // (at least they did at time of writing - certainly good enough for debugging)\n    Hmd.HmdType                                         = HmdType_None;\n    Hmd.ResolutionInPixels                              = Sizei(1280, 800);\n    Hmd.ScreenSizeInMeters                              = Sizef(0.1498f, 0.0936f);\n    Hmd.ScreenGapSizeInMeters                           = 0.0f;\n    Hmd.PelOffsetR                                      = Vector2f ( 0.0f, 0.0f );\n    Hmd.PelOffsetB                                      = Vector2f ( 0.0f, 0.0f );\n    Hmd.CenterFromTopInMeters                           = 0.0468f;\n    Hmd.LensSeparationInMeters                          = 0.0635f;\n    Hmd.LensDiameterInMeters                            = 0.035f;\n    Hmd.LensSurfaceToMidplateInMeters                   = 0.025f;\n    Hmd.EyeCups                                         = EyeCup_DK1A;\n    Hmd.Shutter.Type                                    = HmdShutter_RollingTopToBottom;\n    Hmd.Shutter.VsyncToNextVsync                        = ( 1.0f / 60.0f );\n    Hmd.Shutter.VsyncToFirstScanline                    = 0.000052f;\n    Hmd.Shutter.FirstScanlineToLastScanline             = 0.016580f;\n    Hmd.Shutter.PixelSettleTime                         = 0.015f;\n    Hmd.Shutter.PixelPersistence                        = ( 1.0f / 60.0f );\n    Hmd.EyeLeft.Distortion.SetToIdentity();\n    Hmd.EyeLeft.Distortion.MetersPerTanAngleAtCenter    = 0.043875f;\n    Hmd.EyeLeft.Distortion.Eqn                          = Distortion_RecipPoly4;\n    Hmd.EyeLeft.Distortion.K[0]                         = 1.0f;\n    Hmd.EyeLeft.Distortion.K[1]                         = -0.3999f;\n    Hmd.EyeLeft.Distortion.K[2]                         = 0.2408f;\n    Hmd.EyeLeft.Distortion.K[3]                         = -0.4589f;\n    Hmd.EyeLeft.Distortion.MaxR                         = 1.0f;\n\tHmd.EyeLeft.Distortion.ChromaticAberration[0]\t\t= 0.006f;\n\tHmd.EyeLeft.Distortion.ChromaticAberration[1]\t\t= 0.0f;\n\tHmd.EyeLeft.Distortion.ChromaticAberration[2]\t\t= -0.014f;\n\tHmd.EyeLeft.Distortion.ChromaticAberration[3]\t\t= 0.0f;\n    Hmd.EyeLeft.NoseToPupilInMeters                     = 0.62f;\n    Hmd.EyeLeft.ReliefInMeters                          = 0.013f;\n    Hmd.EyeRight = Hmd.EyeLeft;\n\n    SetViewportMode = SVPM_Density;\n    SetViewportPixelsPerDisplayPixel = 1.0f;\n    // Not used in this mode, but init them anyway.\n    SetViewportSize[0] = Sizei(0,0);\n    SetViewportSize[1] = Sizei(0,0);\n    SetViewport[0] = Recti(0,0,0,0);\n    SetViewport[1] = Recti(0,0,0,0);\n\n    OverrideLens = false;\n    OverrideTanHalfFov = false;\n    OverrideZeroIpd = false;\n    ExtraEyeRotationInRadians = OVR_DEFAULT_EXTRA_EYE_ROTATION;\n    IsRendertargetSharedByBothEyes = true;\n    RightHandedProjection = true;\n\n    // This should cause an assert if the app does not call SetRendertargetSize()\n    RendertargetSize = Sizei ( 0, 0 );\n\n    ZNear = 0.01f;\n    ZFar = 10000.0f;\n\n    Set2DAreaFov(DegreeToRad(85.0f));\n}\n\nvoid StereoConfig::SetHmdRenderInfo(const HmdRenderInfo& hmd)\n{\n    Hmd = hmd;\n    DirtyFlag = true;\n}\n\nvoid StereoConfig::Set2DAreaFov(float fovRadians)\n{\n    Area2DFov = fovRadians;\n    DirtyFlag = true;\n}\n\nconst StereoEyeParamsWithOrtho& StereoConfig::GetEyeRenderParams(StereoEye eye)\n{\n    if ( DirtyFlag )\n    {\n        UpdateComputedState();\n    }\n\n    static const uint8_t eyeParamIndices[3] = { 0, 0, 1 };\n\n    OVR_ASSERT(eye < sizeof(eyeParamIndices));\n    return EyeRenderParams[eyeParamIndices[eye]];\n}\n\nvoid StereoConfig::SetLensOverride ( LensConfig const *pLensOverrideLeft  /*= NULL*/,\n                                     LensConfig const *pLensOverrideRight /*= NULL*/ )\n{\n    if ( pLensOverrideLeft == NULL )\n    {\n        OverrideLens = false;\n    }\n    else\n    {\n        OverrideLens = true;\n        LensOverrideLeft = *pLensOverrideLeft;\n        LensOverrideRight = *pLensOverrideLeft;\n        if ( pLensOverrideRight != NULL )\n        {\n            LensOverrideRight = *pLensOverrideRight;\n        }\n    }\n    DirtyFlag = true;\n}\n\nvoid StereoConfig::SetRendertargetSize (Size<int> const rendertargetSize,\n                                        bool rendertargetIsSharedByBothEyes )\n{\n    RendertargetSize = rendertargetSize;\n    IsRendertargetSharedByBothEyes = rendertargetIsSharedByBothEyes;\n    DirtyFlag = true;\n}\n\nvoid StereoConfig::SetFov ( FovPort const *pfovLeft  /*= NULL*/,\n                            FovPort const *pfovRight /*= NULL*/ )\n{\n    DirtyFlag = true;\n    if ( pfovLeft == NULL )\n    {\n        OverrideTanHalfFov = false;\n    }\n    else\n    {\n        OverrideTanHalfFov = true;\n        FovOverrideLeft  = *pfovLeft;\n        FovOverrideRight = *pfovLeft;\n        if ( pfovRight != NULL )\n        {\n            FovOverrideRight = *pfovRight;\n        }\n    }\n}\n\n\nvoid StereoConfig::SetZeroVirtualIpdOverride ( bool enableOverride )\n{\n    DirtyFlag = true;\n    OverrideZeroIpd = enableOverride;\n}\n\n\nvoid StereoConfig::SetZClipPlanesAndHandedness ( float zNear /*= 0.01f*/, float zFar /*= 10000.0f*/, bool rightHandedProjection /*= true*/ )\n{\n    DirtyFlag = true;\n    ZNear = zNear;\n    ZFar = zFar;\n    RightHandedProjection = rightHandedProjection;\n}\n\nvoid StereoConfig::SetExtraEyeRotation ( float extraEyeRotationInRadians )\n{\n    DirtyFlag = true;\n    ExtraEyeRotationInRadians = extraEyeRotationInRadians;\n}\n\nSizei StereoConfig::CalculateRecommendedTextureSize ( bool rendertargetSharedByBothEyes,\n                                                      float pixelDensityInCenter /*= 1.0f*/ )\n{\n    return Render::CalculateRecommendedTextureSize ( Hmd, rendertargetSharedByBothEyes, pixelDensityInCenter );\n}\n\n\n\nvoid StereoConfig::UpdateComputedState()\n{\n    int numEyes = 2;\n    StereoEye eyeTypes[2];\n\n    switch ( Mode )\n    {\n    case Stereo_None:\n        numEyes         = 1;\n        eyeTypes[0]     = StereoEye_Center;\n        break;\n\n    case Stereo_LeftRight_Multipass:\n        numEyes         = 2;\n        eyeTypes[0]     = StereoEye_Left;\n        eyeTypes[1]     = StereoEye_Right;\n        break;\n\n    default:\n        numEyes = 0;\n        OVR_ASSERT( false );\n        break;\n    }\n\n    // If either of these fire, you've probably forgotten to call SetRendertargetSize()\n    OVR_ASSERT ( RendertargetSize.w > 0 );\n    OVR_ASSERT ( RendertargetSize.h > 0 );\n\n    for ( int eyeNum = 0; eyeNum < numEyes; eyeNum++ )\n    {\n        StereoEye eyeType = eyeTypes[eyeNum];\n        LensConfig *pLensOverride = NULL;\n        if ( OverrideLens )\n        {\n            if ( eyeType == StereoEye_Right )\n            {\n                pLensOverride = &LensOverrideRight;\n            }\n            else\n            {\n                pLensOverride = &LensOverrideLeft;\n            }\n        }\n\n        FovPort *pTanHalfFovOverride = NULL;\n        if ( OverrideTanHalfFov )\n        {\n            if ( eyeType == StereoEye_Right )\n            {\n                pTanHalfFovOverride = &FovOverrideRight;\n            }\n            else\n            {\n                pTanHalfFovOverride = &FovOverrideLeft;\n            }\n        }\n\n        DistortionAndFov distortionAndFov =\n            CalculateDistortionAndFovInternal ( eyeType, Hmd,\n                                                pLensOverride, pTanHalfFovOverride,\n                                                ExtraEyeRotationInRadians );\n\n        EyeRenderParams[eyeNum].StereoEye.Distortion = distortionAndFov.Distortion;\n        EyeRenderParams[eyeNum].StereoEye.Fov        = distortionAndFov.Fov;\n    }\n\n    if ( OverrideZeroIpd )\n    {\n        // Take the union of the calculated eye FOVs.\n        FovPort fov;\n        fov.UpTan    = Alg::Max ( EyeRenderParams[0].StereoEye.Fov.UpTan   , EyeRenderParams[1].StereoEye.Fov.UpTan    );\n        fov.DownTan  = Alg::Max ( EyeRenderParams[0].StereoEye.Fov.DownTan , EyeRenderParams[1].StereoEye.Fov.DownTan  );\n        fov.LeftTan  = Alg::Max ( EyeRenderParams[0].StereoEye.Fov.LeftTan , EyeRenderParams[1].StereoEye.Fov.LeftTan  );\n        fov.RightTan = Alg::Max ( EyeRenderParams[0].StereoEye.Fov.RightTan, EyeRenderParams[1].StereoEye.Fov.RightTan );\n        EyeRenderParams[0].StereoEye.Fov = fov;\n        EyeRenderParams[1].StereoEye.Fov = fov;\n    }\n\n    for ( int eyeNum = 0; eyeNum < numEyes; eyeNum++ )\n    {\n        StereoEye eyeType = eyeTypes[eyeNum];\n\n        DistortionRenderDesc localDistortion = EyeRenderParams[eyeNum].StereoEye.Distortion;\n        FovPort              fov             = EyeRenderParams[eyeNum].StereoEye.Fov;\n\n        // Use a placeholder - will be overridden later.\n        Recti tempViewport = Recti ( 0, 0, 1, 1 );\n\n        EyeRenderParams[eyeNum].StereoEye = CalculateStereoEyeParamsInternal (\n                                        eyeType, Hmd, localDistortion, fov,\n                                        RendertargetSize, tempViewport,\n                                        RightHandedProjection, ZNear, ZFar,\n                                        OverrideZeroIpd );\n\n        // We want to create a virtual 2D surface we can draw debug text messages to.\n        // We'd like it to be a fixed distance (OrthoDistance) away,\n        // and to cover a specific FOV (Area2DFov). We need to find the projection matrix for this,\n        // and also to know how large it is in pixels to achieve a 1:1 mapping at the center of the screen.\n        float orthoDistance = 0.8f;\n        float orthoHalfFov = tanf ( Area2DFov * 0.5f );\n        Vector2f unityOrthoPixelSize = localDistortion.PixelsPerTanAngleAtCenter * ( orthoHalfFov * 2.0f );\n        float localInterpupillaryDistance = Hmd.EyeLeft.NoseToPupilInMeters + Hmd.EyeRight.NoseToPupilInMeters;\n        if ( OverrideZeroIpd )\n        {\n            localInterpupillaryDistance = 0.0f;\n        }\n        Matrix4f ortho = CreateOrthoSubProjection ( true, eyeType,\n                                                    orthoHalfFov, orthoHalfFov,\n                                                    unityOrthoPixelSize.x, unityOrthoPixelSize.y,\n                                                    orthoDistance, localInterpupillaryDistance,\n                                                    EyeRenderParams[eyeNum].StereoEye.RenderedProjection );\n        EyeRenderParams[eyeNum].OrthoProjection = ortho;\n    }\n\n    // ...and now set up the viewport, scale & offset the way the app wanted.\n    setupViewportScaleAndOffsets();\n\n    if ( OverrideZeroIpd )\n    {\n        // Monocular rendering has some fragile parts... don't break any by accident.\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.Fov.UpTan                   == EyeRenderParams[1].StereoEye.Fov.UpTan    );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.Fov.DownTan                 == EyeRenderParams[1].StereoEye.Fov.DownTan  );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.Fov.LeftTan                 == EyeRenderParams[1].StereoEye.Fov.LeftTan  );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.Fov.RightTan                == EyeRenderParams[1].StereoEye.Fov.RightTan );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.RenderedProjection.M[0][0]  == EyeRenderParams[1].StereoEye.RenderedProjection.M[0][0] );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.RenderedProjection.M[1][1]  == EyeRenderParams[1].StereoEye.RenderedProjection.M[1][1] );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.RenderedProjection.M[0][2]  == EyeRenderParams[1].StereoEye.RenderedProjection.M[0][2] );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.RenderedProjection.M[1][2]  == EyeRenderParams[1].StereoEye.RenderedProjection.M[1][2] );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.RenderedViewport            == EyeRenderParams[1].StereoEye.RenderedViewport      );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.EyeToSourceUV.Offset        == EyeRenderParams[1].StereoEye.EyeToSourceUV.Offset  );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.EyeToSourceUV.Scale         == EyeRenderParams[1].StereoEye.EyeToSourceUV.Scale   );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.EyeToSourceNDC.Offset       == EyeRenderParams[1].StereoEye.EyeToSourceNDC.Offset );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.EyeToSourceNDC.Scale        == EyeRenderParams[1].StereoEye.EyeToSourceNDC.Scale  );\n        OVR_ASSERT ( EyeRenderParams[0].OrthoProjection.M[0][0]               == EyeRenderParams[1].OrthoProjection.M[0][0] );\n        OVR_ASSERT ( EyeRenderParams[0].OrthoProjection.M[1][1]               == EyeRenderParams[1].OrthoProjection.M[1][1] );\n        OVR_ASSERT ( EyeRenderParams[0].OrthoProjection.M[0][2]               == EyeRenderParams[1].OrthoProjection.M[0][2] );\n        OVR_ASSERT ( EyeRenderParams[0].OrthoProjection.M[1][2]               == EyeRenderParams[1].OrthoProjection.M[1][2] );\n    }\n\n    DirtyFlag = false;\n}\n\n\n\nViewportScaleAndOffsetBothEyes StereoConfig::setupViewportScaleAndOffsets()\n{\n    for ( int eyeNum = 0; eyeNum < 2; eyeNum++ )\n    {\n        StereoEye eyeType = ( eyeNum == 0 ) ? StereoEye_Left : StereoEye_Right;\n\n        DistortionRenderDesc localDistortion = EyeRenderParams[eyeNum].StereoEye.Distortion;\n        FovPort              fov             = EyeRenderParams[eyeNum].StereoEye.Fov;\n\n        Recti renderedViewport;\n        switch ( SetViewportMode )\n        {\n        case SVPM_Density:\n            renderedViewport = CalculateViewportDensityInternal (\n                                    eyeType, localDistortion, fov,\n                                    RendertargetSize, IsRendertargetSharedByBothEyes,\n                                    SetViewportPixelsPerDisplayPixel, OverrideZeroIpd );\n            break;\n        case SVPM_Size:\n            if ( ( eyeType == StereoEye_Right ) && !OverrideZeroIpd )\n            {\n                renderedViewport = CalculateViewportInternal (\n                                        eyeType, RendertargetSize,\n                                        SetViewportSize[1],\n                                        IsRendertargetSharedByBothEyes, OverrideZeroIpd );\n            }\n            else\n            {\n                renderedViewport = CalculateViewportInternal (\n                                        eyeType, RendertargetSize,\n                                        SetViewportSize[0],\n                                        IsRendertargetSharedByBothEyes, OverrideZeroIpd );\n            }\n            break;\n        case SVPM_Viewport:\n            if ( ( eyeType == StereoEye_Right ) && !OverrideZeroIpd )\n            {\n                renderedViewport = SetViewport[1];\n            }\n            else\n            {\n                renderedViewport = SetViewport[0];\n            }\n            break;\n        default: OVR_ASSERT ( false ); break;\n        }\n\n        ViewportScaleAndOffset vpsao = CalculateViewportScaleAndOffsetInternal (\n                                                EyeRenderParams[eyeNum].StereoEye.EyeToSourceNDC,\n                                                renderedViewport,\n                                                RendertargetSize );\n        EyeRenderParams[eyeNum].StereoEye.RenderedViewport = vpsao.RenderedViewport;\n        EyeRenderParams[eyeNum].StereoEye.EyeToSourceUV    = vpsao.EyeToSourceUV;\n    }\n\n    ViewportScaleAndOffsetBothEyes result;\n    result.Left.EyeToSourceUV     = EyeRenderParams[0].StereoEye.EyeToSourceUV;\n    result.Left.RenderedViewport  = EyeRenderParams[0].StereoEye.RenderedViewport;\n    result.Right.EyeToSourceUV    = EyeRenderParams[1].StereoEye.EyeToSourceUV;\n    result.Right.RenderedViewport = EyeRenderParams[1].StereoEye.RenderedViewport;\n    return result;\n}\n\n// Specify a pixel density - how many rendered pixels per pixel in the physical display.\nViewportScaleAndOffsetBothEyes StereoConfig::SetRenderDensity ( float pixelsPerDisplayPixel )\n{\n    SetViewportMode  = SVPM_Density;\n    SetViewportPixelsPerDisplayPixel = pixelsPerDisplayPixel;\n    return setupViewportScaleAndOffsets();\n}\n\n// Supply the size directly. Will be clamped to the physical rendertarget size.\nViewportScaleAndOffsetBothEyes StereoConfig::SetRenderSize ( Sizei const &renderSizeLeft, Sizei const &renderSizeRight )\n{\n    SetViewportMode  = SVPM_Size;\n    SetViewportSize[0] = renderSizeLeft;\n    SetViewportSize[1] = renderSizeRight;\n    return setupViewportScaleAndOffsets();\n}\n\n// Supply the viewport directly. This is not clamped to the physical rendertarget - careful now!\nViewportScaleAndOffsetBothEyes StereoConfig::SetRenderViewport ( Recti const &renderViewportLeft, Recti const &renderViewportRight )\n{\n    SetViewportMode  = SVPM_Viewport;\n    SetViewport[0] = renderViewportLeft;\n    SetViewport[1] = renderViewportRight;\n    return setupViewportScaleAndOffsets();\n}\n\nMatrix4f StereoConfig::GetProjectionWithZoom ( StereoEye eye, float fovZoom ) const\n{\n    int eyeNum = ( eye == StereoEye_Right ) ? 1 : 0;\n    float fovScale = 1.0f / fovZoom;\n    FovPort fovPort = EyeRenderParams[eyeNum].StereoEye.Fov;\n    fovPort.LeftTan  *= fovScale;\n    fovPort.RightTan *= fovScale;\n    fovPort.UpTan    *= fovScale;\n    fovPort.DownTan  *= fovScale;\n    return CreateProjection ( RightHandedProjection, fovPort, ZNear, ZFar );\n}\n\n\n\n\n//-----------------------------------------------------------------------------------\n// *****  Distortion Mesh Rendering\n\n\n// Pow2 for the Morton order to work!\n// 4 is too low - it is easy to see the \"wobbles\" in the HMD.\n// 5 is realllly close but you can see pixel differences with even/odd frame checking.\n// 6 is indistinguishable on a monitor on even/odd frames.\nstatic const int DMA_GridSizeLog2   = 6;\nstatic const int DMA_GridSize       = 1<<DMA_GridSizeLog2;\nstatic const int DMA_NumVertsPerEye = (DMA_GridSize+1)*(DMA_GridSize+1);\nstatic const int DMA_NumTrisPerEye  = (DMA_GridSize)*(DMA_GridSize)*2;\n\n\n\nDistortionMeshVertexData DistortionMeshMakeVertex ( Vector2f screenNDC,\n                                                    bool rightEye,\n                                                    const HmdRenderInfo &hmdRenderInfo,\n                                                    const DistortionRenderDesc &distortion, const ScaleAndOffset2D &eyeToSourceNDC )\n{\n    DistortionMeshVertexData result;\n\n    float xOffset = 0.0f;\n    if (rightEye)\n    {\n        xOffset = 1.0f;\n    }\n\n    Vector2f tanEyeAnglesR, tanEyeAnglesG, tanEyeAnglesB;\n    TransformScreenNDCToTanFovSpaceChroma ( &tanEyeAnglesR, &tanEyeAnglesG, &tanEyeAnglesB,\n                                            distortion, screenNDC );\n\n\tresult.TanEyeAnglesR = tanEyeAnglesR;\n\tresult.TanEyeAnglesG = tanEyeAnglesG;\n\tresult.TanEyeAnglesB = tanEyeAnglesB;\n\n    HmdShutterTypeEnum shutterType = hmdRenderInfo.Shutter.Type;\n    switch ( shutterType )\n    {\n    case HmdShutter_Global:\n        result.TimewarpLerp = 0.0f;\n        break;\n    case HmdShutter_RollingLeftToRight:\n        // Retrace is left to right - left eye goes 0.0 -> 0.5, then right goes 0.5 -> 1.0\n        result.TimewarpLerp = screenNDC.x * 0.25f + 0.25f;\n        if (rightEye)\n        {\n            result.TimewarpLerp += 0.5f;\n        }\n        break;\n    case HmdShutter_RollingRightToLeft:\n        // Retrace is right to left - right eye goes 0.0 -> 0.5, then left goes 0.5 -> 1.0\n        result.TimewarpLerp = 0.75f - screenNDC.x * 0.25f;\n        if (rightEye)\n        {\n            result.TimewarpLerp -= 0.5f;\n        }\n        break;\n    case HmdShutter_RollingTopToBottom:\n        // Retrace is top to bottom on both eyes at the same time.\n        result.TimewarpLerp = screenNDC.y * 0.5f + 0.5f;\n        break;\n    default: OVR_ASSERT ( false ); break;\n    }\n\n    // When does the fade-to-black edge start? Chosen heuristically.\n    float fadeOutBorderFractionTexture = 0.1f;\n    float fadeOutBorderFractionTextureInnerEdge = 0.1f;\n    float fadeOutBorderFractionScreen = 0.1f;\n    float fadeOutFloor = 0.6f;        // the floor controls how much black is in the fade region\n\n    if (hmdRenderInfo.HmdType == HmdType_DK1)\n    {\n        fadeOutBorderFractionTexture = 0.3f;\n        fadeOutBorderFractionTextureInnerEdge = 0.075f;\n        fadeOutBorderFractionScreen = 0.075f;\n        fadeOutFloor = 0.25f;\n    }\n\n    // Fade out at texture edges.\n    // The furthest out will be the blue channel, because of chromatic aberration (true of any standard lens)\n    Vector2f sourceTexCoordBlueNDC = TransformTanFovSpaceToRendertargetNDC ( eyeToSourceNDC, tanEyeAnglesB );\n\tif (rightEye)\n\t{\n\t\t// The inner edge of the eye texture is usually much more magnified, because it's right against the middle of the screen, not the FOV edge.\n\t\t// So we want a different scaling factor for that. This code flips the texture NDC so that +1.0 is the inner edge\n\t\tsourceTexCoordBlueNDC.x = -sourceTexCoordBlueNDC.x;\n\t}\n    float edgeFadeIn               = ( 1.0f / fadeOutBorderFractionTextureInnerEdge ) * ( 1.0f - sourceTexCoordBlueNDC.x )  ;   // Inner\n    edgeFadeIn       = Alg::Min ( edgeFadeIn, ( 1.0f / fadeOutBorderFractionTexture ) * ( 1.0f + sourceTexCoordBlueNDC.x ) );   // Outer\n    edgeFadeIn       = Alg::Min ( edgeFadeIn, ( 1.0f / fadeOutBorderFractionTexture ) * ( 1.0f - sourceTexCoordBlueNDC.y ) );   // Upper\n    edgeFadeIn       = Alg::Min ( edgeFadeIn, ( 1.0f / fadeOutBorderFractionTexture ) * ( 1.0f + sourceTexCoordBlueNDC.y ) );   // Lower\n\n    // Also fade out at screen edges. Since this is in pixel space, no need to do inner specially.\n    float edgeFadeInScreen = ( 1.0f / fadeOutBorderFractionScreen ) *\n                             ( 1.0f - Alg::Max ( Alg::Abs ( screenNDC.x ), Alg::Abs ( screenNDC.y ) ) );\n    edgeFadeIn = Alg::Min ( edgeFadeInScreen, edgeFadeIn ) + fadeOutFloor;\n\n\t// Note - this is NOT clamped negatively.\n\t// For rendering methods that interpolate over a coarse grid, we need the values to go negative for correct intersection with zero.\n    result.Shade = Alg::Min ( edgeFadeIn, 1.0f );\n    result.ScreenPosNDC.x = 0.5f * screenNDC.x - 0.5f + xOffset;\n    result.ScreenPosNDC.y = -screenNDC.y;\n\n    return result;\n}\n\n\nvoid DistortionMeshDestroy ( DistortionMeshVertexData *pVertices, uint16_t *pTriangleMeshIndices )\n{\n    OVR_FREE ( pVertices );\n    OVR_FREE ( pTriangleMeshIndices );\n}\n\nvoid DistortionMeshCreate ( DistortionMeshVertexData **ppVertices, uint16_t **ppTriangleListIndices,\n                            int *pNumVertices, int *pNumTriangles,\n                            const StereoEyeParams &stereoParams, const HmdRenderInfo &hmdRenderInfo )\n{\n    bool    rightEye      = ( stereoParams.Eye == StereoEye_Right );\n    int     vertexCount   = 0;\n    int     triangleCount = 0;\n\n    // Generate mesh into allocated data and return result.\n    DistortionMeshCreate(ppVertices, ppTriangleListIndices, &vertexCount, &triangleCount,\n                         rightEye, hmdRenderInfo, stereoParams.Distortion, stereoParams.EyeToSourceNDC);\n\n    *pNumVertices  = vertexCount;\n    *pNumTriangles = triangleCount;\n}\n\n\n// Generate distortion mesh for a eye.\nvoid DistortionMeshCreate( DistortionMeshVertexData **ppVertices, uint16_t **ppTriangleListIndices,\n                           int *pNumVertices, int *pNumTriangles,\n                           bool rightEye,\n                           const HmdRenderInfo &hmdRenderInfo,\n                           const DistortionRenderDesc &distortion, const ScaleAndOffset2D &eyeToSourceNDC )\n{\n    *pNumVertices  = DMA_NumVertsPerEye;\n    *pNumTriangles = DMA_NumTrisPerEye;\n\n    *ppVertices = (DistortionMeshVertexData*)\n                      OVR_ALLOC( sizeof(DistortionMeshVertexData) * (*pNumVertices) );\n    *ppTriangleListIndices  = (uint16_t*) OVR_ALLOC( sizeof(uint16_t) * (*pNumTriangles) * 3 );\n\n    if (!*ppVertices || !*ppTriangleListIndices)\n    {\n        if (*ppVertices)\n        {\n            OVR_FREE(*ppVertices);\n        }\n        if (*ppTriangleListIndices)\n        {\n            OVR_FREE(*ppTriangleListIndices);\n        }\n        *ppVertices             = NULL;\n        *ppTriangleListIndices  = NULL;\n        *pNumTriangles          = 0;\n        *pNumVertices           = 0;\n        return;\n    }\n\n\n\n    // Populate vertex buffer info\n\n    // First pass - build up raw vertex data.\n    DistortionMeshVertexData* pcurVert = *ppVertices;\n\n    for ( int y = 0; y <= DMA_GridSize; y++ )\n    {\n        for ( int x = 0; x <= DMA_GridSize; x++ )\n        {\n\n            Vector2f sourceCoordNDC;\n            // NDC texture coords [-1,+1]\n            sourceCoordNDC.x = 2.0f * ( (float)x / (float)DMA_GridSize ) - 1.0f;\n            sourceCoordNDC.y = 2.0f * ( (float)y / (float)DMA_GridSize ) - 1.0f;\n            Vector2f tanEyeAngle = TransformRendertargetNDCToTanFovSpace ( eyeToSourceNDC, sourceCoordNDC );\n\n            // Find a corresponding screen position.\n            // Note - this function does not have to be precise - we're just trying to match the mesh tessellation\n            // with the shape of the distortion to minimise the number of trianlges needed.\n            Vector2f screenNDC = TransformTanFovSpaceToScreenNDC ( distortion, tanEyeAngle, false );\n            // ...but don't let verts overlap to the other eye.\n            screenNDC.x = Alg::Max ( -1.0f, Alg::Min ( screenNDC.x, 1.0f ) );\n            screenNDC.y = Alg::Max ( -1.0f, Alg::Min ( screenNDC.y, 1.0f ) );\n\n            // From those screen positions, generate the vertex.\n            *pcurVert = DistortionMeshMakeVertex ( screenNDC, rightEye, hmdRenderInfo, distortion, eyeToSourceNDC );\n            pcurVert++;\n        }\n    }\n\n\n    // Populate index buffer info\n    uint16_t *pcurIndex = *ppTriangleListIndices;\n\n    for ( int triNum = 0; triNum < DMA_GridSize * DMA_GridSize; triNum++ )\n    {\n        // Use a Morton order to help locality of FB, texture and vertex cache.\n        // (0.325ms raster order -> 0.257ms Morton order)\n        OVR_ASSERT ( DMA_GridSize <= 256 );\n        int x = ( ( triNum & 0x0001 ) >> 0 ) |\n                ( ( triNum & 0x0004 ) >> 1 ) |\n                ( ( triNum & 0x0010 ) >> 2 ) |\n                ( ( triNum & 0x0040 ) >> 3 ) |\n                ( ( triNum & 0x0100 ) >> 4 ) |\n                ( ( triNum & 0x0400 ) >> 5 ) |\n                ( ( triNum & 0x1000 ) >> 6 ) |\n                ( ( triNum & 0x4000 ) >> 7 );\n        int y = ( ( triNum & 0x0002 ) >> 1 ) |\n                ( ( triNum & 0x0008 ) >> 2 ) |\n                ( ( triNum & 0x0020 ) >> 3 ) |\n                ( ( triNum & 0x0080 ) >> 4 ) |\n                ( ( triNum & 0x0200 ) >> 5 ) |\n                ( ( triNum & 0x0800 ) >> 6 ) |\n                ( ( triNum & 0x2000 ) >> 7 ) |\n                ( ( triNum & 0x8000 ) >> 8 );\n        int FirstVertex = x * (DMA_GridSize+1) + y;\n        // Another twist - we want the top-left and bottom-right quadrants to\n        // have the triangles split one way, the other two split the other.\n        // +---+---+---+---+\n        // |  /|  /|\\  |\\  |\n        // | / | / | \\ | \\ |\n        // |/  |/  |  \\|  \\|\n        // +---+---+---+---+\n        // |  /|  /|\\  |\\  |\n        // | / | / | \\ | \\ |\n        // |/  |/  |  \\|  \\|\n        // +---+---+---+---+\n        // |\\  |\\  |  /|  /|\n        // | \\ | \\ | / | / |\n        // |  \\|  \\|/  |/  |\n        // +---+---+---+---+\n        // |\\  |\\  |  /|  /|\n        // | \\ | \\ | / | / |\n        // |  \\|  \\|/  |/  |\n        // +---+---+---+---+\n        // This way triangle edges don't span long distances over the distortion function,\n        // so linear interpolation works better & we can use fewer tris.\n        if ( ( x < DMA_GridSize/2 ) != ( y < DMA_GridSize/2 ) )       // != is logical XOR\n        {\n            *pcurIndex++ = (uint16_t)FirstVertex;\n            *pcurIndex++ = (uint16_t)FirstVertex+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(DMA_GridSize+1)+1;\n\n            *pcurIndex++ = (uint16_t)FirstVertex+(DMA_GridSize+1)+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(DMA_GridSize+1);\n            *pcurIndex++ = (uint16_t)FirstVertex;\n        }\n        else\n        {\n            *pcurIndex++ = (uint16_t)FirstVertex;\n            *pcurIndex++ = (uint16_t)FirstVertex+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(DMA_GridSize+1);\n\n            *pcurIndex++ = (uint16_t)FirstVertex+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(DMA_GridSize+1)+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(DMA_GridSize+1);\n        }\n    }\n}\n\n//-----------------------------------------------------------------------------------\n// *****  Heightmap Mesh Rendering\n\n\nstatic const int HMA_GridSizeLog2   = 7;\nstatic const int HMA_GridSize       = 1<<HMA_GridSizeLog2;\nstatic const int HMA_NumVertsPerEye = (HMA_GridSize+1)*(HMA_GridSize+1);\nstatic const int HMA_NumTrisPerEye  = (HMA_GridSize)*(HMA_GridSize)*2;\n\n\nvoid HeightmapMeshDestroy ( HeightmapMeshVertexData *pVertices, uint16_t *pTriangleMeshIndices )\n{\n    OVR_FREE ( pVertices );\n    OVR_FREE ( pTriangleMeshIndices );\n}\n\nvoid HeightmapMeshCreate ( HeightmapMeshVertexData **ppVertices, uint16_t **ppTriangleListIndices,\n    int *pNumVertices, int *pNumTriangles,\n    const StereoEyeParams &stereoParams, const HmdRenderInfo &hmdRenderInfo )\n{\n    bool    rightEye      = ( stereoParams.Eye == StereoEye_Right );\n    int     vertexCount   = 0;\n    int     triangleCount = 0;\n\n    // Generate mesh into allocated data and return result.\n    HeightmapMeshCreate(ppVertices, ppTriangleListIndices, &vertexCount, &triangleCount,\n        rightEye, hmdRenderInfo, stereoParams.EyeToSourceNDC);\n\n    *pNumVertices  = vertexCount;\n    *pNumTriangles = triangleCount;\n}\n\n\n// Generate heightmap mesh for one eye.\nvoid HeightmapMeshCreate( HeightmapMeshVertexData **ppVertices, uint16_t **ppTriangleListIndices,\n    int *pNumVertices, int *pNumTriangles, bool rightEye,\n    const HmdRenderInfo &hmdRenderInfo,\n    const ScaleAndOffset2D &eyeToSourceNDC )\n{\n    *pNumVertices  = HMA_NumVertsPerEye;\n    *pNumTriangles = HMA_NumTrisPerEye;\n\n    *ppVertices = (HeightmapMeshVertexData*) OVR_ALLOC( sizeof(HeightmapMeshVertexData) * (*pNumVertices) );\n    *ppTriangleListIndices  = (uint16_t*) OVR_ALLOC( sizeof(uint16_t) * (*pNumTriangles) * 3 );\n\n    if (!*ppVertices || !*ppTriangleListIndices)\n    {\n        if (*ppVertices)\n        {\n            OVR_FREE(*ppVertices);\n        }\n        if (*ppTriangleListIndices)\n        {\n            OVR_FREE(*ppTriangleListIndices);\n        }\n        *ppVertices             = NULL;\n        *ppTriangleListIndices  = NULL;\n        *pNumTriangles          = 0;\n        *pNumVertices           = 0;\n        return;\n    }\n\n    // Populate vertex buffer info\n    // float xOffset = (rightEye ? 1.0f : 0.0f);  Currently disabled because its usage is disabled below.\n\n    // First pass - build up raw vertex data.\n    HeightmapMeshVertexData* pcurVert = *ppVertices;\n\n    for ( int y = 0; y <= HMA_GridSize; y++ )\n    {\n        for ( int x = 0; x <= HMA_GridSize; x++ )\n        {\n            Vector2f sourceCoordNDC;\n            // NDC texture coords [-1,+1]\n            sourceCoordNDC.x = 2.0f * ( (float)x / (float)HMA_GridSize ) - 1.0f;\n            sourceCoordNDC.y = 2.0f * ( (float)y / (float)HMA_GridSize ) - 1.0f;\n            Vector2f tanEyeAngle = TransformRendertargetNDCToTanFovSpace ( eyeToSourceNDC, sourceCoordNDC );\n\n            pcurVert->TanEyeAngles = tanEyeAngle;\n\n            HmdShutterTypeEnum shutterType = hmdRenderInfo.Shutter.Type;\n            switch ( shutterType )\n            {\n            case HmdShutter_Global:\n                pcurVert->TimewarpLerp = 0.0f;\n                break;\n            case HmdShutter_RollingLeftToRight:\n                // Retrace is left to right - left eye goes 0.0 -> 0.5, then right goes 0.5 -> 1.0\n                pcurVert->TimewarpLerp = sourceCoordNDC.x * 0.25f + 0.25f;\n                if (rightEye)\n                {\n                    pcurVert->TimewarpLerp += 0.5f;\n                }\n                break;\n            case HmdShutter_RollingRightToLeft:\n                // Retrace is right to left - right eye goes 0.0 -> 0.5, then left goes 0.5 -> 1.0\n                pcurVert->TimewarpLerp = 0.75f - sourceCoordNDC.x * 0.25f;\n                if (rightEye)\n                {\n                    pcurVert->TimewarpLerp -= 0.5f;\n                }\n                break;\n            case HmdShutter_RollingTopToBottom:\n                // Retrace is top to bottom on both eyes at the same time.\n                pcurVert->TimewarpLerp = sourceCoordNDC.y * 0.5f + 0.5f;\n                break;\n            default: OVR_ASSERT ( false ); break;\n            }\n\n            // Don't let verts overlap to the other eye.\n            //sourceCoordNDC.x = Alg::Max ( -1.0f, Alg::Min ( sourceCoordNDC.x, 1.0f ) );\n            //sourceCoordNDC.y = Alg::Max ( -1.0f, Alg::Min ( sourceCoordNDC.y, 1.0f ) );\n\n            //pcurVert->ScreenPosNDC.x = 0.5f * sourceCoordNDC.x - 0.5f + xOffset;\n            pcurVert->ScreenPosNDC.x = sourceCoordNDC.x;\n            pcurVert->ScreenPosNDC.y = -sourceCoordNDC.y;\n\n            pcurVert++;\n        }\n    }\n\n\n    // Populate index buffer info\n    uint16_t *pcurIndex = *ppTriangleListIndices;\n\n    for ( int triNum = 0; triNum < HMA_GridSize * HMA_GridSize; triNum++ )\n    {\n        // Use a Morton order to help locality of FB, texture and vertex cache.\n        // (0.325ms raster order -> 0.257ms Morton order)\n        OVR_ASSERT ( HMA_GridSize < 256 );\n        int x = ( ( triNum & 0x0001 ) >> 0 ) |\n                ( ( triNum & 0x0004 ) >> 1 ) |\n                ( ( triNum & 0x0010 ) >> 2 ) |\n                ( ( triNum & 0x0040 ) >> 3 ) |\n                ( ( triNum & 0x0100 ) >> 4 ) |\n                ( ( triNum & 0x0400 ) >> 5 ) |\n                ( ( triNum & 0x1000 ) >> 6 ) |\n                ( ( triNum & 0x4000 ) >> 7 );\n        int y = ( ( triNum & 0x0002 ) >> 1 ) |\n                ( ( triNum & 0x0008 ) >> 2 ) |\n                ( ( triNum & 0x0020 ) >> 3 ) |\n                ( ( triNum & 0x0080 ) >> 4 ) |\n                ( ( triNum & 0x0200 ) >> 5 ) |\n                ( ( triNum & 0x0800 ) >> 6 ) |\n                ( ( triNum & 0x2000 ) >> 7 ) |\n                ( ( triNum & 0x8000 ) >> 8 );\n        int FirstVertex = x * (HMA_GridSize+1) + y;\n        // Another twist - we want the top-left and bottom-right quadrants to\n        // have the triangles split one way, the other two split the other.\n        // +---+---+---+---+\n        // |  /|  /|\\  |\\  |\n        // | / | / | \\ | \\ |\n        // |/  |/  |  \\|  \\|\n        // +---+---+---+---+\n        // |  /|  /|\\  |\\  |\n        // | / | / | \\ | \\ |\n        // |/  |/  |  \\|  \\|\n        // +---+---+---+---+\n        // |\\  |\\  |  /|  /|\n        // | \\ | \\ | / | / |\n        // |  \\|  \\|/  |/  |\n        // +---+---+---+---+\n        // |\\  |\\  |  /|  /|\n        // | \\ | \\ | / | / |\n        // |  \\|  \\|/  |/  |\n        // +---+---+---+---+\n        // This way triangle edges don't span long distances over the distortion function,\n        // so linear interpolation works better & we can use fewer tris.\n        if ( ( x < HMA_GridSize/2 ) != ( y < HMA_GridSize/2 ) )       // != is logical XOR\n        {\n            *pcurIndex++ = (uint16_t)FirstVertex;\n            *pcurIndex++ = (uint16_t)FirstVertex+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(HMA_GridSize+1)+1;\n\n            *pcurIndex++ = (uint16_t)FirstVertex+(HMA_GridSize+1)+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(HMA_GridSize+1);\n            *pcurIndex++ = (uint16_t)FirstVertex;\n        }\n        else\n        {\n            *pcurIndex++ = (uint16_t)FirstVertex;\n            *pcurIndex++ = (uint16_t)FirstVertex+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(HMA_GridSize+1);\n\n            *pcurIndex++ = (uint16_t)FirstVertex+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(HMA_GridSize+1)+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(HMA_GridSize+1);\n        }\n    }\n}\n\n//-----------------------------------------------------------------------------------\n// ***** Prediction and timewarp.\n//\n\n// Calculates the values from the HMD info.\nPredictionValues PredictionGetDeviceValues ( const HmdRenderInfo &hmdRenderInfo,\n                                             bool withTimewarp /*= true*/,\n                                             bool withVsync /*= true*/ )\n{\n    PredictionValues result;\n\n    result.WithTimewarp = withTimewarp;\n    result.WithVsync = withVsync;\n\n    // For unclear reasons, most graphics systems add an extra frame of latency\n    // somewhere along the way. In time we'll debug this and figure it out, but\n    // for now this gets prediction a little bit better.\n    const float extraFramesOfBufferingKludge = 1.0f;\n\n    if ( withVsync )\n    {\n        // These are the times from the Present+Flush to when the middle of the scene is \"averagely visible\" (without timewarp)\n        // So if you had no timewarp, this, plus the time until the next vsync, is how much to predict by.\n        result.PresentFlushToRenderedScene  = extraFramesOfBufferingKludge * hmdRenderInfo.Shutter.FirstScanlineToLastScanline;\n        // Predict to the middle of the screen being scanned out.\n        result.PresentFlushToRenderedScene += hmdRenderInfo.Shutter.VsyncToFirstScanline + 0.5f * hmdRenderInfo.Shutter.FirstScanlineToLastScanline;\n        // Time for pixels to get half-way to settling.\n        result.PresentFlushToRenderedScene += hmdRenderInfo.Shutter.PixelSettleTime * 0.5f;\n        // Predict to half-way through persistence\n        result.PresentFlushToRenderedScene += hmdRenderInfo.Shutter.PixelPersistence * 0.5f;\n\n        // The time from the Present+Flush to when the first scanline is \"averagely visible\".\n        result.PresentFlushToTimewarpStart  = extraFramesOfBufferingKludge * hmdRenderInfo.Shutter.FirstScanlineToLastScanline;\n        // Predict to the first line being scanned out.\n        result.PresentFlushToTimewarpStart += hmdRenderInfo.Shutter.VsyncToFirstScanline;\n        // Time for pixels to get half-way to settling.\n        result.PresentFlushToTimewarpStart += hmdRenderInfo.Shutter.PixelSettleTime * 0.5f;\n        // Predict to half-way through persistence\n        result.PresentFlushToTimewarpStart += hmdRenderInfo.Shutter.PixelPersistence * 0.5f;\n\n        // Time to the the last scanline.\n        result.PresentFlushToTimewarpEnd    = result.PresentFlushToTimewarpStart + hmdRenderInfo.Shutter.FirstScanlineToLastScanline;\n\n        // Ideal framerate.\n        result.PresentFlushToPresentFlush   = hmdRenderInfo.Shutter.VsyncToNextVsync;\n    }\n    else\n    {\n        // Timewarp without vsync is a little odd.\n        // Currently, we assume that without vsync, we have no idea which scanline\n        // is currently being sent to the display. So we can't do lerping timewarp,\n        // we can just do a full-screen late-stage fixup.\n\n        // \"PresentFlushToRenderedScene\" means the time from the Present+Flush to when the middle of the scene is \"averagely visible\" (without timewarp)\n        // So if you had no timewarp, this, plus the time until the next flush (which is usually the time to render the frame), is how much to predict by.\n        // Time for pixels to get half-way to settling.\n        result.PresentFlushToRenderedScene  = hmdRenderInfo.Shutter.PixelSettleTime * 0.5f;\n        // Predict to half-way through persistence\n        result.PresentFlushToRenderedScene += hmdRenderInfo.Shutter.PixelPersistence * 0.5f;\n\n        // Without vsync, you don't know timings, and so can't do anything useful with lerped warping.\n        result.PresentFlushToTimewarpStart  = result.PresentFlushToRenderedScene;\n        result.PresentFlushToTimewarpEnd    = result.PresentFlushToRenderedScene;\n\n        // There's no concept of \"ideal\" when vsync is off.\n        result.PresentFlushToPresentFlush   = 0.0f;\n    }\n\n    return result;\n}\n\nMatrix4f TimewarpComputePoseDelta ( Matrix4f const &renderedViewFromWorld, Matrix4f const &predictedViewFromWorld, Matrix4f const&hmdToEyeViewOffset )\n{\n    Matrix4f worldFromPredictedView = (hmdToEyeViewOffset * predictedViewFromWorld).InvertedHomogeneousTransform();\n    Matrix4f matRenderFromNowStart = (hmdToEyeViewOffset * renderedViewFromWorld) * worldFromPredictedView;\n\n    // The sensor-predicted orientations have:                           X=right, Y=up,   Z=backwards.\n    // The vectors inside the mesh are in NDC to keep the shader simple: X=right, Y=down, Z=forwards.\n    // So we need to perform a similarity transform on this delta matrix.\n    // The verbose code would look like this:\n    /*\n    Matrix4f matBasisChange;\n    matBasisChange.SetIdentity();\n    matBasisChange.M[0][0] =  1.0f;\n    matBasisChange.M[1][1] = -1.0f;\n    matBasisChange.M[2][2] = -1.0f;\n    Matrix4f matBasisChangeInv = matBasisChange.Inverted();\n    matRenderFromNow = matBasisChangeInv * matRenderFromNow * matBasisChange;\n    */\n    // ...but of course all the above is a constant transform and much more easily done.\n    // We flip the signs of the Y&Z row, then flip the signs of the Y&Z column,\n    // and of course most of the flips cancel:\n    // +++                        +--                     +--\n    // +++ -> flip Y&Z columns -> +-- -> flip Y&Z rows -> -++\n    // +++                        +--                     -++\n    matRenderFromNowStart.M[0][1] = -matRenderFromNowStart.M[0][1];\n    matRenderFromNowStart.M[0][2] = -matRenderFromNowStart.M[0][2];\n    matRenderFromNowStart.M[1][0] = -matRenderFromNowStart.M[1][0];\n    matRenderFromNowStart.M[2][0] = -matRenderFromNowStart.M[2][0];\n    matRenderFromNowStart.M[1][3] = -matRenderFromNowStart.M[1][3];\n    matRenderFromNowStart.M[2][3] = -matRenderFromNowStart.M[2][3];\n\n    return matRenderFromNowStart;\n}\n\nMatrix4f TimewarpComputePoseDeltaPosition ( Matrix4f const &renderedViewFromWorld, Matrix4f const &predictedViewFromWorld, Matrix4f const&hmdToEyeViewOffset )\n{\n    Matrix4f worldFromPredictedView = (hmdToEyeViewOffset * predictedViewFromWorld).InvertedHomogeneousTransform();\n    Matrix4f matRenderXform = (hmdToEyeViewOffset * renderedViewFromWorld) * worldFromPredictedView;\n\n    return matRenderXform.Inverted();\n}\n\nTimewarpMachine::TimewarpMachine()\n  : VsyncEnabled(false),\n    RenderInfo(),\n    CurrentPredictionValues(),\n    DistortionTimeCount(0),\n    DistortionTimeCurrentStart(0.0),\n  //DistortionTimes[],\n    DistortionTimeAverage(0.f),\n  //EyeRenderPoses[],\n    LastFramePresentFlushTime(0.0),\n    PresentFlushToPresentFlushSeconds(0.f),\n    NextFramePresentFlushTime(0.0)\n{\n    #if defined(OVR_BUILD_DEBUG)\n        memset(DistortionTimes, 0, sizeof(DistortionTimes));\n    #endif\n\n    for ( int i = 0; i < 2; i++ )\n    {\n        EyeRenderPoses[i] = Posef();\n    }\n}\n\nvoid TimewarpMachine::Reset(HmdRenderInfo& renderInfo, bool vsyncEnabled, double timeNow)\n{\n    RenderInfo = renderInfo;\n    VsyncEnabled = vsyncEnabled;\n    CurrentPredictionValues = PredictionGetDeviceValues ( renderInfo, true, VsyncEnabled );\n    PresentFlushToPresentFlushSeconds = 0.0f;\n    DistortionTimeCount = 0;\n    DistortionTimeAverage = 0.0f;\n    LastFramePresentFlushTime = timeNow;\n    AfterPresentAndFlush(timeNow);\n}\n\nvoid TimewarpMachine::AfterPresentAndFlush(double timeNow)\n{\n    AfterPresentWithoutFlush();\n    AfterPresentFinishes ( timeNow );\n}\n\nvoid TimewarpMachine::AfterPresentWithoutFlush()\n{\n    // We've only issued the Present - it hasn't actually finished (i.e. appeared)\n    // But we need to estimate when the next Present will appear, so extrapolate from previous data.\n    NextFramePresentFlushTime = LastFramePresentFlushTime + 2.0 * (double)PresentFlushToPresentFlushSeconds;\n}\n\nvoid TimewarpMachine::AfterPresentFinishes(double timeNow)\n{\n    // The present has now actually happened.\n    PresentFlushToPresentFlushSeconds = (float)(timeNow - LastFramePresentFlushTime);\n    LastFramePresentFlushTime = timeNow;\n    NextFramePresentFlushTime = timeNow + (double)PresentFlushToPresentFlushSeconds;\n}\n\n\n\ndouble TimewarpMachine::GetViewRenderPredictionTime()\n{\n    // Note that PredictionGetDeviceValues() did all the vsync-dependent thinking for us.\n    return NextFramePresentFlushTime + CurrentPredictionValues.PresentFlushToRenderedScene;\n}\n\nbool TimewarpMachine::GetViewRenderPredictionPose(SensorStateReader* reader, Posef& pose)\n{\n\treturn reader->GetPoseAtTime(GetViewRenderPredictionTime(), pose);\n}\n\ndouble TimewarpMachine::GetVisiblePixelTimeStart()\n{\n    // Note that PredictionGetDeviceValues() did all the vsync-dependent thinking for us.\n    return NextFramePresentFlushTime + CurrentPredictionValues.PresentFlushToTimewarpStart;\n}\ndouble TimewarpMachine::GetVisiblePixelTimeEnd()\n{\n    // Note that PredictionGetDeviceValues() did all the vsync-dependent thinking for us.\n    return NextFramePresentFlushTime + CurrentPredictionValues.PresentFlushToTimewarpEnd;\n}\nbool TimewarpMachine::GetPredictedVisiblePixelPoseStart(SensorStateReader* reader, Posef& pose)\n{\n\treturn reader->GetPoseAtTime(GetVisiblePixelTimeStart(), pose);\n}\nbool TimewarpMachine::GetPredictedVisiblePixelPoseEnd(SensorStateReader* reader, Posef& pose)\n{\n\treturn reader->GetPoseAtTime(GetVisiblePixelTimeEnd(), pose);\n}\nbool TimewarpMachine::GetTimewarpDeltaStart(SensorStateReader* reader, Posef const &renderedPose, Matrix4f& transform)\n{\n\tPosef visiblePose;\n\tif (!GetPredictedVisiblePixelPoseStart(reader, visiblePose))\n\t{\n\t\treturn false;\n\t}\n\n    Matrix4f visibleMatrix(visiblePose);\n    Matrix4f renderedMatrix(renderedPose);\n    Matrix4f identity;  // doesn't matter for orientation-only timewarp\n    transform = TimewarpComputePoseDelta ( renderedMatrix, visibleMatrix, identity );\n\n\treturn true;\n}\nbool TimewarpMachine::GetTimewarpDeltaEnd(SensorStateReader* reader, Posef const &renderedPose, Matrix4f& transform)\n{\n\tPosef visiblePose;\n\tif (!GetPredictedVisiblePixelPoseEnd(reader, visiblePose))\n\t{\n\t\treturn false;\n\t}\n\n    Matrix4f visibleMatrix(visiblePose);\n    Matrix4f renderedMatrix(renderedPose);\n    Matrix4f identity;  // doesn't matter for orientation-only timewarp\n    transform = TimewarpComputePoseDelta ( renderedMatrix, visibleMatrix, identity );\n\n\treturn true;\n}\n\n\n// What time should the app wait until before starting distortion?\ndouble  TimewarpMachine::JustInTime_GetDistortionWaitUntilTime()\n{\n    if ( !VsyncEnabled || ( DistortionTimeCount < NumDistortionTimes ) )\n    {\n        // Don't wait.\n        return LastFramePresentFlushTime;\n    }\n\n    // Note - 1-2ms fudge factor (because Windows timer granularity etc) is NOT added here,\n    // because otherwise you end up adding multiple fudge factors!\n    // So it's left for the calling app to add just one fudge factor.\n\n    float howLongBeforePresent = DistortionTimeAverage;\n    // Subtlety here. Technically, the correct time is NextFramePresentFlushTime - howLongBeforePresent.\n    // However, if the app drops a frame, this then perpetuates it,\n    // i.e. if the display is running at 60fps, but the last frame was slow,\n    // (e.g. because of swapping or whatever), then NextFramePresentFlushTime is\n    // 33ms in the future, not 16ms. Since this function supplies the\n    // time to wait until, the app will indeed wait until 32ms, so the framerate\n    // drops to 30fps and never comes back up!\n    // So we return the *ideal* framerate, not the *actual* framerate.\n    return LastFramePresentFlushTime + (float)( CurrentPredictionValues.PresentFlushToPresentFlush - howLongBeforePresent );\n}\n\ndouble TimewarpMachine::JustInTime_AverageDistortionTime()\n{\n    if ( JustInTime_NeedDistortionTimeMeasurement() )\n    {\n        return 0.0;\n    }\n    return DistortionTimeAverage;\n}\n\nbool    TimewarpMachine::JustInTime_NeedDistortionTimeMeasurement() const\n{\n    if (!VsyncEnabled)\n    {\n        return false;\n    }\n    return ( DistortionTimeCount < NumDistortionTimes );\n}\n\nvoid    TimewarpMachine::JustInTime_BeforeDistortionTimeMeasurement(double timeNow)\n{\n    DistortionTimeCurrentStart = timeNow;\n}\n\nvoid    TimewarpMachine::JustInTime_AfterDistortionTimeMeasurement(double timeNow)\n{\n    float timeDelta = (float)( timeNow - DistortionTimeCurrentStart );\n    if ( DistortionTimeCount < NumDistortionTimes )\n    {\n        DistortionTimes[DistortionTimeCount] = timeDelta;\n        DistortionTimeCount++;\n        if ( DistortionTimeCount == NumDistortionTimes )\n        {\n            // Median.\n            float distortionTimeMedian = 0.0f;\n            for ( int i = 0; i < NumDistortionTimes/2; i++ )\n            {\n                // Find the maximum time of those remaining.\n                float maxTime = DistortionTimes[0];\n                int maxIndex = 0;\n                for ( int j = 1; j < NumDistortionTimes; j++ )\n                {\n                    if ( maxTime < DistortionTimes[j] )\n                    {\n                        maxTime = DistortionTimes[j];\n                        maxIndex = j;\n                    }\n                }\n                // Zero that max time, so we'll find the next-highest time.\n                DistortionTimes[maxIndex] = 0.0f;\n                distortionTimeMedian = maxTime;\n            }\n            DistortionTimeAverage = distortionTimeMedian;\n        }\n    }\n    else\n    {\n        OVR_ASSERT ( !\"Really didn't need more measurements, thanks\" );\n    }\n}\n\n\n}}}  // OVR::Util::Render\n\n"
  },
  {
    "path": "externals/ovr/Src/Util/Util_Render_Stereo.h",
    "content": "/************************************************************************************\n\nFilename    :   Util_Render_Stereo.h\nContent     :   Sample stereo rendering configuration classes.\nCreated     :   October 22, 2012\nAuthors     :   Michael Antonov, Tom Forsyth\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Util_Render_Stereo_h\n#define OVR_Util_Render_Stereo_h\n\n#include \"../OVR_Stereo.h\"\n#include \"../Tracking/Tracking_SensorStateReader.h\"\n\nnamespace OVR { namespace Util { namespace Render {\n\n\n\n//-----------------------------------------------------------------------------------\n// **** Useful debug functions.\n//\n// Purely for debugging - the results are not very end-user-friendly.\nchar const* GetDebugNameEyeCupType ( EyeCupType eyeCupType );\nchar const* GetDebugNameHmdType ( HmdTypeEnum hmdType );\n\n\n\n//-----------------------------------------------------------------------------------\n// **** Higher-level utility functions.\n\nSizei CalculateRecommendedTextureSize    ( HmdRenderInfo const &hmd,\n                                           bool bRendertargetSharedByBothEyes,\n                                           float pixelDensityInCenter = 1.0f );\n\nFovPort CalculateRecommendedFov          ( HmdRenderInfo const &hmd,\n                                           StereoEye eyeType,\n                                           bool bMakeFovSymmetrical = false);\n\nStereoEyeParams CalculateStereoEyeParams ( HmdRenderInfo const &hmd,\n                                           StereoEye eyeType,\n                                           Sizei const &actualRendertargetSurfaceSize,\n                                           bool bRendertargetSharedByBothEyes,\n                                           bool bRightHanded = true,\n                                           float zNear = 0.01f, float zFar = 10000.0f,\n\t\t\t\t\t\t\t\t\t\t   Sizei const *pOverrideRenderedPixelSize = NULL,\n                                           FovPort const *pOverrideFovport = NULL,\n                                           float zoomFactor = 1.0f );\n\nVector3f CalculateEyeVirtualCameraOffset(HmdRenderInfo const &hmd,\n                                         StereoEye eyeType, bool bMonoRenderingMode );\n\n\n// These are two components from StereoEyeParams that can be changed\n// very easily without full recomputation of everything.\nstruct ViewportScaleAndOffset\n{\n    Recti               RenderedViewport;\n    ScaleAndOffset2D    EyeToSourceUV;\n};\n\n// Three ways to override the size of the render view dynamically.\n// None of these require changing the distortion parameters or the regenerating the distortion mesh,\n// and can be called every frame if desired.\nViewportScaleAndOffset ModifyRenderViewport ( StereoEyeParams const &params,\n                                              Sizei const &actualRendertargetSurfaceSize,\n                                              Recti const &renderViewport );\n\nViewportScaleAndOffset ModifyRenderSize ( StereoEyeParams const &params,\n                                          Sizei const &actualRendertargetSurfaceSize,\n                                          Sizei const &requestedRenderSize,\n                                          bool bRendertargetSharedByBothEyes = false );\n\nViewportScaleAndOffset ModifyRenderDensity ( StereoEyeParams const &params,\n                                             Sizei const &actualRendertargetSurfaceSize,\n                                             float pixelDensity = 1.0f,\n                                             bool bRendertargetSharedByBothEyes = false );\n\n\n//-----------------------------------------------------------------------------------\n// *****  StereoConfig\n\n// StereoConfig maintains a scene stereo state and allow switching between different\n// stereo rendering modes. To support rendering, StereoConfig keeps track of HMD\n// variables such as screen size, eye-to-screen distance and distortion, and computes\n// extra data such as FOV and distortion center offsets based on it. Rendering\n// parameters are returned though StereoEyeParams for each eye.\n//\n// Beyond regular 3D projection, this class supports rendering a 2D orthographic\n// surface for UI and text. The 2D surface will be defined by CreateOrthoSubProjection().\n// The (0,0) coordinate corresponds to eye center location.\n// \n// Applications are not required to use this class, but they should be doing very\n// similar sequences of operations, and it may be useful to start with this class\n// and modify it.\n\nstruct StereoEyeParamsWithOrtho\n{\n    StereoEyeParams         StereoEye;\n    Matrix4f                OrthoProjection;\n};\n\nstruct ViewportScaleAndOffsetBothEyes\n{\n    ViewportScaleAndOffset  Left;\n    ViewportScaleAndOffset  Right;\n};\n\nclass StereoConfig\n{\npublic:\n\n    // StereoMode describes rendering modes that can be used by StereoConfig.\n    // These modes control whether stereo rendering is used or not (Stereo_None),\n    // and how it is implemented.\n    enum StereoMode\n    {\n        Stereo_None                     = 0,        // Single eye\n        Stereo_LeftRight_Multipass      = 1,        // One frustum per eye\n    };\n\n\n    StereoConfig(StereoMode mode = Stereo_LeftRight_Multipass);\n \n    //---------------------------------------------------------------------------------------------\n    // *** Core functions - every app MUST call these functions at least once.\n\n    // Sets HMD parameters; also initializes distortion coefficients.\n    void        SetHmdRenderInfo(const HmdRenderInfo& hmd);\n\n    // Set the physical size of the rendertarget surface the app created,\n    // and whether one RT is shared by both eyes, or each eye has its own RT:\n    // true: both eyes are rendered to the same RT. Left eye starts at top-left, right eye starts at top-middle.\n    // false: each eye is rendered to its own RT. Some GPU architectures prefer this arrangement.\n    // Typically, the app would call CalculateRecommendedTextureSize() to suggest the choice of RT size.\n    // This setting must be exactly the size of the actual RT created, or the UVs produced will be incorrect.\n    // If the app wants to render to a subsection of the RT, it should use SetRenderSize()\n    void        SetRendertargetSize (Size<int> const rendertargetSize,\n                                     bool rendertargetIsSharedByBothEyes );\n\n    // Returns full set of Stereo rendering parameters for the specified eye.\n    const StereoEyeParamsWithOrtho& GetEyeRenderParams(StereoEye eye);\n\n\n\n    //---------------------------------------------------------------------------------------------\n    // *** Optional functions - an app may call these to override default behaviours.\n\n    const HmdRenderInfo& GetHmdRenderInfo() const { return Hmd; }\n\n    // Returns the recommended size of rendertargets.\n    // If rendertargetIsSharedByBothEyes is true, this is the size of the combined buffer.\n    // If rendertargetIsSharedByBothEyes is false, this is the size of each individual buffer.\n    // pixelDensityInCenter may be set to any number - by default it will match the HMD resolution in the center of the image.\n    // After creating the rendertargets, the application MUST call SetRendertargetSize() with the actual size created\n    // (which can be larger or smaller as the app wishes, but StereoConfig needs to know either way)\n    Sizei       CalculateRecommendedTextureSize ( bool rendertargetSharedByBothEyes,\n                                                  float pixelDensityInCenter = 1.0f );\n\n    // Sets a stereo rendering mode and updates internal cached\n    // state (matrices, per-eye view) based on it.\n    void        SetStereoMode(StereoMode mode)  { Mode = mode; DirtyFlag = true; }\n    StereoMode  GetStereoMode() const           { return Mode; }\n\n    // Sets the fieldOfView that the 2D coordinate area stretches to.\n    void        Set2DAreaFov(float fovRadians);\n\n    // Really only for science experiments - no normal app should ever need to override\n    // the HMD's lens descriptors. Passing NULL removes the override.\n    // Supply both = set left and right.\n    // Supply just left = set both to the same.\n    // Supply neither = remove override.\n    void        SetLensOverride ( LensConfig const *pLensOverrideLeft  = NULL,\n                                  LensConfig const *pLensOverrideRight = NULL );\n \n    // Override the rendered FOV in various ways. All angles in tangent units.\n    // This is not clamped to the physical FOV of the display - you'll need to do that yourself!\n    // Supply both = set left and right.\n    // Supply just left = set both to the same.\n    // Supply neither = remove override.\n    void        SetFov ( FovPort const *pfovLeft  = NULL,\n\t\t\t\t\t     FovPort const *pfovRight = NULL );\n    \n    void        SetFovPortRadians ( float horizontal, float vertical )\n    {\n        FovPort fov = FovPort::CreateFromRadians(horizontal, vertical);\n        SetFov( &fov, &fov );\n    }\n\n\n    // This forces a \"zero IPD\" mode where there is just a single render with an FOV that\n    //   is the union of the two calculated FOVs.\n    // The calculated render is for the left eye. Any size & FOV overrides for the right\n    //   eye will be ignored.\n    // If you query the right eye's size, you will get the same render\n    //   size & position as the left eye - you should not actually do the render of course!\n    //   The distortion values will be different, because it goes to a different place on the framebuffer.\n    // Note that if you do this, the rendertarget does not need to be twice the width of\n    //   the render size any more.\n    void        SetZeroVirtualIpdOverride ( bool enableOverride );\n\n    // Allows the app to specify near and far clip planes and the right/left-handedness of the projection matrix.\n    void        SetZClipPlanesAndHandedness ( float zNear = 0.01f, float zFar = 10000.0f,\n                                              bool rightHandedProjection = true );\n\n    // Allows the app to specify how much extra eye rotation to allow when determining the visible FOV.\n    void        SetExtraEyeRotation ( float extraEyeRotationInRadians = 0.0f );\n\n    // The dirty flag is set by any of the above calls. Just handy for the app to know\n    // if e.g. the distortion mesh needs regeneration.\n    void        SetDirty() { DirtyFlag = true; }\n    bool        IsDirty() { return DirtyFlag; }\n\n    // An app never needs to call this - GetEyeRenderParams will call it internally if\n    // the state is dirty. However apps can call this explicitly to control when and where\n    // computation is performed (e.g. not inside critical loops)\n    void        UpdateComputedState();\n\n    // This returns the projection matrix with a \"zoom\". Does not modify any internal state.\n    Matrix4f    GetProjectionWithZoom ( StereoEye eye, float fovZoom ) const;\n\n\n    //---------------------------------------------------------------------------------------------\n    // The SetRender* functions are special.\n    //\n    // They do not require a full recalculation of state, and they do not change anything but the\n    // ViewportScaleAndOffset data for the eyes (which they return), and do not set the dirty flag!\n    // This means they can be called without regenerating the distortion mesh, and thus \n    // can happily be called every frame without causing performance problems. Dynamic rescaling \n    // of the rendertarget can help keep framerate up in demanding VR applications.\n    // See the documentation for more details on their use.\n\n    // Specify a pixel density - how many rendered pixels per pixel in the physical display.\n    ViewportScaleAndOffsetBothEyes SetRenderDensity ( float pixelsPerDisplayPixel );\n\n    // Supply the size directly. Will be clamped to the physical rendertarget size.\n    ViewportScaleAndOffsetBothEyes SetRenderSize ( Sizei const &renderSizeLeft, Sizei const &renderSizeRight );\n\n    // Supply the viewport directly. This is not clamped to the physical rendertarget - careful now!\n    ViewportScaleAndOffsetBothEyes SetRenderViewport ( Recti const &renderViewportLeft, Recti const &renderViewportRight );\n\nprivate:\n\n    // *** Modifiable State\n\n    StereoMode         Mode;\n    HmdRenderInfo      Hmd;\n\n    float              Area2DFov;           // FOV range mapping to the 2D area.\n\n    // Only one of these three overrides can be true!\n    enum SetViewportModeEnum\n    {\n        SVPM_Density,\n        SVPM_Size,\n        SVPM_Viewport,\n    }                  SetViewportMode;\n    // ...and depending which it is, one of the following are used.\n    float              SetViewportPixelsPerDisplayPixel;\n    Sizei              SetViewportSize[2];\n    Recti           SetViewport[2];\n\n    // Other overrides.\n    bool               OverrideLens;\n    LensConfig         LensOverrideLeft;\n    LensConfig         LensOverrideRight;\n    Sizei              RendertargetSize;\n    bool               OverrideTanHalfFov;\n    FovPort            FovOverrideLeft;\n    FovPort            FovOverrideRight;\n    bool               OverrideZeroIpd;\n    float              ZNear;\n    float              ZFar;\n    float              ExtraEyeRotationInRadians;\n    bool               IsRendertargetSharedByBothEyes;\n    bool               RightHandedProjection;\n\n    bool               DirtyFlag;   // Set when any if the modifiable state changed. Does NOT get set by SetRender*()\n\n    // Utility function.\n    ViewportScaleAndOffsetBothEyes setupViewportScaleAndOffsets();\n\n    // *** Computed State\n\npublic:     // Small hack for the config tool. Normal code should never read EyeRenderParams directly - use GetEyeRenderParams() instead.\n    // 0/1 = left/right main views.\n    StereoEyeParamsWithOrtho    EyeRenderParams[2];\n};\n\n\n//-----------------------------------------------------------------------------------\n// *****  Distortion Mesh Rendering\n//\n\n// Stores both texture UV coords, or tan(angle) values.\n// Use whichever set of data the specific distortion algorithm requires.\n// This struct *must* be binary compatible with CAPI ovrDistortionVertex.\nstruct DistortionMeshVertexData\n{\n    // [-1,+1],[-1,+1] over the entire framebuffer.\n    Vector2f    ScreenPosNDC;\n    // [0.0-1.0] interpolation value for timewarping - see documentation for details.\n    float       TimewarpLerp;\n    // [0.0-1.0] fade-to-black at the edges to reduce peripheral vision noise.\n    float       Shade;        \n    // The red, green, and blue vectors in tan(angle) space.\n    // Scale and offset by the values in StereoEyeParams.EyeToSourceUV.Scale\n    // and StereoParams.EyeToSourceUV.Offset to get to real texture UV coords.\n    Vector2f    TanEyeAnglesR;\n    Vector2f    TanEyeAnglesG;\n    Vector2f    TanEyeAnglesB;    \n};\n\n// If you just want a single point on the screen transformed.\nDistortionMeshVertexData DistortionMeshMakeVertex ( Vector2f screenNDC,\n                                                    bool rightEye,\n                                                    const HmdRenderInfo &hmdRenderInfo, \n                                                    const DistortionRenderDesc &distortion, const ScaleAndOffset2D &eyeToSourceNDC );\n\nvoid DistortionMeshCreate ( DistortionMeshVertexData **ppVertices, uint16_t **ppTriangleListIndices,\n                            int *pNumVertices, int *pNumTriangles,\n                            const StereoEyeParams &stereoParams, const HmdRenderInfo &hmdRenderInfo );\n\n// Generate distortion mesh for a eye.\n// This version requires less data then stereoParms, supporting dynamic change in render target viewport.\nvoid DistortionMeshCreate( DistortionMeshVertexData **ppVertices, uint16_t **ppTriangleListIndices,\n                           int *pNumVertices, int *pNumTriangles,\n                           bool rightEye,\n                           const HmdRenderInfo &hmdRenderInfo, \n                           const DistortionRenderDesc &distortion, const ScaleAndOffset2D &eyeToSourceNDC );\n\nvoid DistortionMeshDestroy ( DistortionMeshVertexData *pVertices, uint16_t *pTriangleMeshIndices );\n\n\n//-----------------------------------------------------------------------------------\n// *****  Heightmap Mesh Rendering\n//\n\n// Stores both texture UV coords, or tan(angle) values.\n// This struct *must* be binary compatible with CAPI ovrHeightmapVertex.\nstruct HeightmapMeshVertexData\n{\n    // [-1,+1],[-1,+1] over the entire framebuffer.\n    Vector2f    ScreenPosNDC;\n    // [0.0-1.0] interpolation value for timewarping - see documentation for details.\n    float       TimewarpLerp;\n    // The vectors in tan(angle) space.\n    // Scale and offset by the values in StereoEyeParams.EyeToSourceUV.Scale\n    // and StereoParams.EyeToSourceUV.Offset to get to real texture UV coords.\n    Vector2f    TanEyeAngles;    \n};\n\n\nvoid HeightmapMeshCreate ( HeightmapMeshVertexData **ppVertices, uint16_t **ppTriangleListIndices,\n    int *pNumVertices, int *pNumTriangles,\n    const StereoEyeParams &stereoParams, const HmdRenderInfo &hmdRenderInfo );\n\n// Generate heightmap mesh for a eye. This version requires less data then stereoParms, supporting\n// dynamic change in render target viewport.\nvoid HeightmapMeshCreate( HeightmapMeshVertexData **ppVertices, uint16_t **ppTriangleListIndices,\n    int *pNumVertices, int *pNumTriangles, bool rightEye,\n    const HmdRenderInfo &hmdRenderInfo, const ScaleAndOffset2D &eyeToSourceNDC );\n\nvoid HeightmapMeshDestroy ( HeightmapMeshVertexData *pVertices, uint16_t *pTriangleMeshIndices );\n\n\n\n//-----------------------------------------------------------------------------------\n// ***** Prediction and timewarp.\n//\n\nstruct PredictionValues\n{\n    // All values in seconds.\n    // These are the times in seconds from a present+flush to the relevant display element.\n    // The time is measured to the middle of that element's visibility window,\n    // e.g. if the device is a full-persistence display, the element will be visible for\n    // an entire frame, so the time measures to the middle of that period, i.e. half the frame time.\n    float PresentFlushToRenderedScene;        // To the overall rendered 3D scene being visible.\n    float PresentFlushToTimewarpStart;        // To when the first timewarped scanline will be visible.\n    float PresentFlushToTimewarpEnd;          // To when the last timewarped scanline will be visible.\n    float PresentFlushToPresentFlush;         // To the next present+flush, i.e. the ideal framerate.\n\n    bool  WithTimewarp;\n    bool  WithVsync;\n};\n\n// Calculates the values from the HMD info.\nPredictionValues PredictionGetDeviceValues ( const HmdRenderInfo &hmdRenderInfo,\n                                             bool withTimewarp = true,\n                                             bool withVsync = true );\n\n// Pass in an orientation used to render the scene, and then the predicted orientation\n// (which may have been computed later on, and thus is more accurate), and this\n// will return the matrix to pass to the timewarp distortion shader.\n// TODO: deal with different handedness?\nMatrix4f TimewarpComputePoseDelta ( Matrix4f const &renderedViewFromWorld, Matrix4f const &predictedViewFromWorld, Matrix4f const&hmdToEyeViewOffset );\nMatrix4f TimewarpComputePoseDeltaPosition ( Matrix4f const &renderedViewFromWorld, Matrix4f const &predictedViewFromWorld, Matrix4f const&hmdToEyeViewOffset );\n\n\n\n// TimewarpMachine helps keep track of rendered frame timing and\n// handles predictions for time-warp rendering.\nclass TimewarpMachine\n{\npublic:\n    TimewarpMachine();\n   \n    // Call this on and every time something about the setup changes.\n    void        Reset ( HmdRenderInfo& renderInfo, bool vsyncEnabled, double timeNow );\n\n    // The only reliable time in most engines is directly after the frame-present and GPU flush-and-wait.\n    // This call should be done right after that to give this system the timing info it needs.\n    void        AfterPresentAndFlush(double timeNow);\n    // But some engines queue up the frame-present and only later find out when it actually happened.\n    // They should call these two at those times.\n    void        AfterPresentWithoutFlush();\n    void        AfterPresentFinishes(double timeNow);\n\n    // The \"average\" time the rendered frame will show up,\n    // and the predicted pose of the HMD at that time.\n    // You usually only need to call one of these functions.\n    double      GetViewRenderPredictionTime();\n    bool        GetViewRenderPredictionPose(Tracking::SensorStateReader* reader, Posef& transform);\n\n\n    // Timewarp prediction functions. You usually only need to call one of these three sets of functions.\n\n    // The predicted times that the first and last pixel will be visible on-screen.\n    double      GetVisiblePixelTimeStart();\n    double      GetVisiblePixelTimeEnd();\n    // Predicted poses of the HMD at those first and last pixels.\n\tbool        GetPredictedVisiblePixelPoseStart(Tracking::SensorStateReader* reader, Posef& transform);\n\tbool        GetPredictedVisiblePixelPoseEnd(Tracking::SensorStateReader* reader, Posef& transform);\n    // The delta matrices to feed to the timewarp distortion code,\n    // given the pose that was used for rendering.\n    // (usually the one returned by GetViewRenderPredictionPose() earlier)\n\tbool        GetTimewarpDeltaStart(Tracking::SensorStateReader* reader, Posef const &renderedPose, Matrix4f& transform);\n\tbool        GetTimewarpDeltaEnd(Tracking::SensorStateReader* reader, Posef const &renderedPose, Matrix4f& transform);\n\n    // Just-In-Time distortion aims to delay the second sensor reading & distortion\n    // until the very last moment to improve prediction. However, it is a little scary,\n    // since the delay might wait too long and miss the vsync completely!\n    // Use of the JustInTime_* functions is entirely optional, and we advise allowing\n    // users to turn it off in their video options to cope with odd machine configurations.\n\n    // What time should the app wait until before starting distortion?\n    double      JustInTime_GetDistortionWaitUntilTime();\n\n    // Used to time the distortion rendering\n    bool        JustInTime_NeedDistortionTimeMeasurement() const;\n    void        JustInTime_BeforeDistortionTimeMeasurement(double timeNow);\n    void        JustInTime_AfterDistortionTimeMeasurement(double timeNow);\n    double      JustInTime_AverageDistortionTime();     // Just for profiling - use JustInTime_GetDistortionWaitUntilTime() for functionality.\n\nprivate:\n    bool                VsyncEnabled;\n    HmdRenderInfo       RenderInfo;\n    PredictionValues    CurrentPredictionValues;\n\n    enum { NumDistortionTimes = 100 };\n    int                 DistortionTimeCount;\n    double              DistortionTimeCurrentStart;\n    float               DistortionTimes[NumDistortionTimes];\n    float               DistortionTimeAverage;\n\n    // Pose at which last time the eye was rendered.\n    Posef               EyeRenderPoses[2];\n\n    // Absolute time of the last present+flush\n    double              LastFramePresentFlushTime;\n    // Seconds between present+flushes\n    float               PresentFlushToPresentFlushSeconds;\n    // Predicted absolute time of the next present+flush\n    double              NextFramePresentFlushTime;\n\n};\n\n\n\n}}}  // OVR::Util::Render\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Util/Util_SystemGUI.cpp",
    "content": "/************************************************************************************\n\nFilename    :   Util_SystemGUI.cpp\nContent     :   OS GUI access, usually for diagnostics.\nCreated     :   October 20, 2014\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include \"Util_SystemGUI.h\"\n#include \"../Kernel/OVR_UTF8Util.h\"\n#include <stdio.h>\n\n#if defined(OVR_OS_MS)\n    #include <Windows.h>\n#endif\n\n\nnamespace OVR { namespace Util {\n\n\n#if defined(OVR_OS_MS)\n\n    // On Windows we implement a manual dialog message box. The reason for this is that there's no way to \n    // have a message box like this without either using MFC or WinForms or relying on Windows Vista+.\n\n    bool DisplayMessageBox(const char* pTitle, const char* pText)\n    {\n        #define ID_EDIT 100\n\n        struct Dialog\n        {\n            static size_t LineCount(const char* pText)\n            {\n                size_t count = 0;\n                while(*pText)\n                {\n                    if(*pText++ == '\\n')\n                        count++;\n                }\n                return count;\n            }\n\n            static WORD* WordUp(WORD* pIn){ return (WORD*)((((uintptr_t)pIn + 3) >> 2) << 2); }\n\n            static BOOL CALLBACK Proc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)\n            {\n                switch (iMsg)\n\t            {\n                    case WM_INITDIALOG:\n                    {\n                        HWND hWndEdit = GetDlgItem(hDlg, ID_EDIT);\n\n                        const char* pText = (const char*)lParam;\n                        SetWindowTextA(hWndEdit, pText);\n\n                        HFONT hFont = CreateFontW(-11, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, L\"Courier New\");\n                        if(hFont)\n                            SendMessage(hWndEdit, WM_SETFONT, WPARAM(hFont), TRUE);\n\n                        SendMessage(hWndEdit, EM_SETSEL, (WPARAM)0, (LPARAM)0);\n\n                        return TRUE;\n                    }\n\n                    case WM_COMMAND:\n                        switch (LOWORD(wParam))\n                        {\n\t\t\t\t            case ID_EDIT:\n                            {\n                                // Handle messages from the edit control here.\n                                HWND hWndEdit = GetDlgItem(hDlg, ID_EDIT);\n                                SendMessage(hWndEdit, EM_SETSEL, (WPARAM)0, (LPARAM)0);\n\t\t\t\t\t            return TRUE;\n                            }\n\n\t\t                    case IDOK:\n                                EndDialog(hDlg, 0);\n\t\t\t                    return TRUE;\n\t\t                }\n                        break;\n                }\n\n                return FALSE;\n            }\n        };\n\n\n        char dialogTemplateMemory[1024];\n        memset(dialogTemplateMemory, 0, sizeof(dialogTemplateMemory));\n        DLGTEMPLATE* pDlg = (LPDLGTEMPLATE)dialogTemplateMemory;\n\n        const size_t textLineCount = Dialog::LineCount(pText);\n\n        // Sizes are in Windows dialog units, which are relative to a character size. Depends on the font and environment settings. Often the pixel size will be ~3x the dialog unit x size. Often the pixel size will be ~3x the dialog unit y size.\n        const int    kGutterSize   =  6; // Empty border space around controls within the dialog\n        const int    kButtonWidth  = 24;\n        const int    kButtonHeight = 10;\n        const int    kDialogWidth  = 600; // To do: Clip this against screen bounds.\n        const int    kDialogHeight = ((textLineCount > 100) ? 400 : ((textLineCount > 25) ? 300 : 200));\n\n        // Define a dialog box.\n        pDlg->style = WS_POPUP | WS_BORDER | WS_SYSMENU | DS_MODALFRAME | WS_CAPTION;\n        pDlg->cdit  = 2;    // Control count\n        pDlg->x     = 10;   // X position To do: Center the dialog.\n        pDlg->y     = 10;\n        pDlg->cx    = (short)kDialogWidth;\n        pDlg->cy    = (short)kDialogHeight;\n        WORD* pWord = (WORD*)(pDlg + 1);\n        *pWord++ = 0;   // No menu\n        *pWord++ = 0;   // Default dialog box class\n\n        WCHAR* pWchar = (WCHAR*)pWord;\n        const size_t titleLength = strlen(pTitle);\n        size_t wcharCount = OVR::UTF8Util::DecodeString(pWchar, pTitle, (titleLength > 128) ? 128 : titleLength);\n        pWord += wcharCount + 1;\n\n        // Define an OK button.\n        pWord = Dialog::WordUp(pWord);\n\n        DLGITEMTEMPLATE* pDlgItem = (DLGITEMTEMPLATE*)pWord;\n        pDlgItem->x     = pDlg->cx - (kGutterSize + kButtonWidth);\n        pDlgItem->y     = pDlg->cy - (kGutterSize + kButtonHeight);\n        pDlgItem->cx    = kButtonWidth;\n        pDlgItem->cy    = kButtonHeight;\n        pDlgItem->id    = IDOK;\n        pDlgItem->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;\n\n        pWord   = (WORD*)(pDlgItem + 1);\n        *pWord++ = 0xFFFF;\n        *pWord++ = 0x0080; // button class\n\n        pWchar     = (WCHAR*)pWord;\n        pWchar[0] = 'O'; pWchar[1] = 'K'; pWchar[2] = '\\0'; // Not currently localized.\n        pWord     += 3; // OK\\0\n        *pWord++   = 0; // no creation data\n\n        // Define an EDIT contol.\n        pWord = Dialog::WordUp(pWord);\n\n        pDlgItem = (DLGITEMTEMPLATE*)pWord;\n        pDlgItem->x  = kGutterSize;\n        pDlgItem->y  = kGutterSize;\n        pDlgItem->cx = pDlg->cx - (kGutterSize + kGutterSize);\n        pDlgItem->cy = pDlg->cy - (kGutterSize + kButtonHeight + kGutterSize + (kGutterSize / 2));\n        pDlgItem->id = ID_EDIT;\n        pDlgItem->style = ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE;\n\n        pWord = (WORD*)(pDlgItem + 1);\n        *pWord++ = 0xFFFF;\n        *pWord++ = 0x0081;  // edit class atom\n        *pWord++ = 0;       // no creation data\n\n        LRESULT ret = DialogBoxIndirectParam(NULL, (LPDLGTEMPLATE)pDlg, NULL, (DLGPROC)Dialog::Proc, (LPARAM)pText);\n\n        return (ret != 0);\n    }\n#elif defined(OVR_OS_MAC)\n    // For Apple we use the Objective C implementation in Util_GUI.mm\n#else\n    // To do.\n    bool DisplayMessageBox(const char* pTitle, const char* pText)\n    {\n        printf(\"\\n\\nMessageBox\\n%s\\n\", pTitle);\n        printf(\"%s\\n\\n\", pText);\n        return false;\n    }\n#endif\n\n\n} } // namespace OVR::Util\n\n\n\n\n"
  },
  {
    "path": "externals/ovr/Src/Util/Util_SystemGUI.h",
    "content": "/************************************************************************************\n\nFilename    :   Util_SystemGUI.h\nContent     :   OS GUI access, usually for diagnostics.\nCreated     :   October 20, 2014\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Util_GUI_h\n#define OVR_Util_GUI_h\n\n\nnamespace OVR { namespace Util {\n\n    // Displays a modal message box on the default GUI display (not on a VR device). \n    // The message box interface (e.g. OK button) is not localized.\n    bool DisplayMessageBox(const char* pTitle, const char* pText);\n\n\n} } // namespace OVR::Util\n\n\n#endif\n"
  },
  {
    "path": "externals/ovr/Src/Util/Util_SystemGUI_OSX.mm",
    "content": "/************************************************************************************\r\n\r\nFilename    :   Util_SystemGUI.mm\r\nContent     :   OS GUI access, usually for diagnostics.\r\nCreated     :   October 20, 2014\r\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\r\n\r\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \r\nyou may not use the Oculus VR Rift SDK except in compliance with the License, \r\nwhich is provided at the time of installation or download, or which \r\notherwise accompanies this software in either electronic or hard copy form.\r\n\r\nYou may obtain a copy of the License at\r\n\r\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \r\n\r\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n\r\n*************************************************************************************/\r\n\r\n\r\n\r\n#include \"Util_SystemGUI.h\"\r\n\r\n#include <Cocoa/Cocoa.h>\r\n#include <CoreFoundation/CoreFoundation.h>\r\n\r\n\r\nnamespace OVR { namespace Util {\r\n\r\n\r\nbool DisplayMessageBox(const char* pTitle, const char* pText)\r\n{\r\n    // To consider: Replace usage of CFUserNotificationDisplayAlert with something a little smarter.\r\n    \r\n    size_t         titleLength = strlen(pTitle);\r\n    size_t         textLength = strlen(pText);\r\n    if(textLength > 1500)   // CFUserNotificationDisplayAlert isn't smart enough to handle large text sizes and screws up its size if so.\r\n        textLength = 1500;  // Problem: this can theoretically split a UTF8 multibyte sequence. Need to find a divisible boundary.\r\n    CFAllocatorRef allocator = NULL;  // To do: support alternative allocator.\r\n    CFStringRef    titleRef = CFStringCreateWithBytes(allocator, (const UInt8*)pTitle, (CFIndex)titleLength, kCFStringEncodingUTF8, false);\r\n    CFStringRef    textRef  = CFStringCreateWithBytes(allocator, (const UInt8*)pText,  (CFIndex)textLength,  kCFStringEncodingUTF8, false);\r\n    CFOptionFlags  result;\r\n\r\n    CFUserNotificationDisplayAlert(0,               // No timeout\r\n                                   kCFUserNotificationNoteAlertLevel,\r\n                                   NULL,            // Icon URL, use default.\r\n                                   NULL,            // Unused\r\n                                   NULL,            // Localization of strings\r\n                                   titleRef,        // Title text\r\n                                   textRef,         // Body text\r\n                                   CFSTR(\"OK\"),     // Default \"OK\" text in button\r\n                                   CFSTR(\"Cancel\"), // Other button title\r\n                                   NULL,            // Yet another button title, NULL means no other button.\r\n                                   &result);        // response flags\r\n    CFRelease(titleRef);\r\n    CFRelease(textRef);\r\n    \r\n    return (result == kCFUserNotificationDefaultResponse);\r\n}\r\n\r\n\r\n} } // namespace OVR { namespace Util {\r\n\r\n\r\n"
  },
  {
    "path": "externals/ovr/Src/Util/Util_SystemInfo.cpp",
    "content": "/************************************************************************************\n\nFilename    :   Util_SystemInfo.cpp\nContent     :   Various operations to get information about the system\nCreated     :   September 26, 2014\nAuthor      :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"Util_SystemInfo.h\"\n#include \"../Kernel/OVR_Timer.h\"\n#include \"../Kernel/OVR_Threads.h\"\n#include \"../Kernel/OVR_Log.h\"\n#include \"../Kernel/OVR_Array.h\"\n\n/*\n// Disabled, can't link RiftConfigUtil\n#ifdef OVR_OS_WIN32\n#define _WIN32_DCOM\n#include <comdef.h>\n#include <Wbemidl.h>\n\n# pragma comment(lib, \"wbemuuid.lib\")\n#endif\n*/\n\n\nnamespace OVR { namespace Util {\n\n// From http://blogs.msdn.com/b/oldnewthing/archive/2005/02/01/364563.aspx\n#if defined (OVR_OS_WIN64) || defined (OVR_OS_WIN32)\n\n#pragma comment(lib, \"version.lib\")\n\ntypedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);\nBOOL Is64BitWindows()\n{\n#if defined(_WIN64)\n    return TRUE;  // 64-bit programs run only on Win64\n#elif defined(_WIN32)\n    // 32-bit programs run on both 32-bit and 64-bit Windows\n    // so must sniff\n    BOOL f64 = FALSE;\n    LPFN_ISWOW64PROCESS fnIsWow64Process;\n\n    fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle(L\"kernel32\"), \"IsWow64Process\");\n    if (NULL != fnIsWow64Process)\n    {\n        return fnIsWow64Process(GetCurrentProcess(), &f64) && f64;\n    }\n    return FALSE;\n#else\n    return FALSE; // Win64 does not support Win16\n#endif\n}\n#endif\n\nconst char * OSAsString()\n{\n#if defined (OVR_OS_IPHONE)\n    return \"IPhone\";\n#elif defined (OVR_OS_DARWIN)\n    return \"Darwin\";\n#elif defined (OVR_OS_MAC)\n    return \"Mac\";\n#elif defined (OVR_OS_BSD)\n    return \"BSD\";\n#elif defined (OVR_OS_WIN64) || defined (OVR_OS_WIN32)\n    if (Is64BitWindows())\n        return \"Win64\";\n    else\n        return \"Win32\";\n#elif defined (OVR_OS_ANDROID)\n    return \"Android\";\n#elif defined (OVR_OS_LINUX)\n    return \"Linux\";\n#elif defined (OVR_OS_BSD)\n    return \"BSD\";\n#else\n    return \"Other\";\n#endif\n}\n\nuint64_t GetGuidInt()\n{\n    uint64_t g = Timer::GetTicksNanos();\n\n    uint64_t lastTime, thisTime;\n    int j;\n    // Sleep a small random time, then use the last 4 bits as a source of randomness\n    for (j = 0; j < 8; j++)\n    {\n        lastTime = Timer::GetTicksNanos();\n        Thread::MSleep(1);\n        Thread::MSleep(0);\n        thisTime = Timer::GetTicksNanos();\n        uint64_t diff = thisTime - lastTime;\n        unsigned int diff4Bits = (unsigned int)(diff & 15);\n        diff4Bits <<= 32 - 4;\n        diff4Bits >>= j * 4;\n        ((char*)&g)[j] ^= diff4Bits;\n    }\n\n    return g;\n}\nString GetGuidString()\n{\n    uint64_t guid = GetGuidInt();\n\n    char buff[64];\n#if defined(OVR_CC_MSVC)\n    OVR_sprintf(buff, sizeof(buff), \"%I64u\", guid);\n#else\n    OVR_sprintf(buff, sizeof(buff), \"%llu\", (unsigned long long) guid);\n#endif\n    return String(buff);\n}\n\nconst char * GetProcessInfo()\n{\n\t#if defined (OVR_CPU_X86_64\t)\n    return \"64 bit\";\n#elif defined (OVR_CPU_X86)\n    return \"32 bit\";\n#else\n    return \"TODO\";\n#endif\n}\n#ifdef OVR_OS_WIN32\n\n\nString OSVersionAsString()\n{\n    return GetSystemFileVersionString(\"\\\\kernel32.dll\");\n}\nString GetSystemFileVersionString(String filePath)\n{\n    char strFilePath[MAX_PATH]; // Local variable\n    UINT sysDirLen = GetSystemDirectoryA(strFilePath, ARRAYSIZE(strFilePath));\n    if (sysDirLen != 0)\n    {\n        OVR_strcat(strFilePath, MAX_PATH, filePath.ToCStr());\n        return GetFileVersionString(strFilePath);\n    }\n    else\n    {\n        return \"GetSystemDirectoryA failed\";\n    }\n}\n// See http://stackoverflow.com/questions/940707/how-do-i-programatically-get-the-version-of-a-dll-or-exe-file\nString GetFileVersionString(String filePath)\n{\n    String result;\n\n    DWORD dwSize = GetFileVersionInfoSizeA(filePath.ToCStr(), NULL);\n    if (dwSize == 0)\n    {\n        OVR_DEBUG_LOG((\"Error in GetFileVersionInfoSizeA: %d (for %s)\", GetLastError(), filePath.ToCStr()));\n        result = filePath + \" not found\";\n    }\n    else\n    {\n        BYTE* pVersionInfo = new BYTE[dwSize];\n        if (!pVersionInfo)\n        {\n            OVR_DEBUG_LOG((\"Out of memory allocating %d bytes (for %s)\", dwSize, filePath.ToCStr()));\n            result = \"Out of memory\";\n        }\n        else\n        {\n            if (!GetFileVersionInfoA(filePath.ToCStr(), 0, dwSize, pVersionInfo))\n            {\n                OVR_DEBUG_LOG((\"Error in GetFileVersionInfo: %d (for %s)\", GetLastError(), filePath.ToCStr()));\n                result = \"Cannot get version info\";\n            }\n            else\n            {\n                VS_FIXEDFILEINFO* pFileInfo = NULL;\n                UINT              pLenFileInfo = 0;\n                if (!VerQueryValue(pVersionInfo, TEXT(\"\\\\\"), (LPVOID*)&pFileInfo, &pLenFileInfo))\n                {\n                    OVR_DEBUG_LOG((\"Error in VerQueryValue: %d (for %s)\", GetLastError(), filePath.ToCStr()));\n                    result = \"File has no version info\";\n                }\n                else\n                {\n                    int major = (pFileInfo->dwFileVersionMS >> 16) & 0xffff;\n                    int minor = (pFileInfo->dwFileVersionMS) & 0xffff;\n                    int hotfix = (pFileInfo->dwFileVersionLS >> 16) & 0xffff;\n                    int other = (pFileInfo->dwFileVersionLS) & 0xffff;\n\n                    char str[128];\n                    OVR::OVR_sprintf(str, 128, \"%d.%d.%d.%d\", major, minor, hotfix, other);\n\n                    result = str;\n                }\n            }\n\n            delete[] pVersionInfo;\n        }\n    }\n\n    return result;\n}\n\n\nString GetDisplayDriverVersion()\n{\n    return GetSystemFileVersionString(\"\\\\OVRDisplay32.dll\");\n}\nString GetCameraDriverVersion()\n{\n    return GetSystemFileVersionString(\"\\\\drivers\\\\OCUSBVID.sys\");\n}\n\n// From http://stackoverflow.com/questions/9524309/enumdisplaydevices-function-not-working-for-me\nvoid GetGraphicsCardList( Array< String > &gpus)\n{\n\tgpus.Clear();\n\n\tDISPLAY_DEVICEA dd;\n\n\tdd.cb = sizeof(dd);\n\n\tDWORD deviceNum = 0;\n\twhile( EnumDisplayDevicesA(NULL, deviceNum, &dd, 0) ){\n        if (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)\n\t\t    gpus.PushBack(dd.DeviceString);\n\t\tdeviceNum++;\n\t}\n}\n#else\n\n// used for driver files\n\nString GetFileVersionString(String /*filePath*/)\n{\n\treturn String();\n}\n\nString GetSystemFileVersionString(String /*filePath*/)\n{\n\treturn String();\n}\n\nString GetDisplayDriverVersion()\n{\n\treturn String();\n}\n\nString GetCameraDriverVersion()\n{\n\treturn String();\n}\n\n#ifdef OVR_OS_MAC\n    //use objective c source\n#else\n    \n//todo linux, this requires searching /var/ files\nvoid GetGraphicsCardList(OVR::Array< OVR::String > &gpus)\n{\n\tgpus.Clear();\n}\nString OSVersionAsString()\n{\n    return String();\n}\n#endif //OVR_OS_MAC\n#endif // WIN32\n\n} } // namespace OVR { namespace Util {\n"
  },
  {
    "path": "externals/ovr/Src/Util/Util_SystemInfo.h",
    "content": "/************************************************************************************\n\nFilename    :   Util_SystemInfo.h\nContent     :   Various operations to get information about the system\nCreated     :   September 26, 2014\nAuthor      :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n\n#ifndef OVR_Util_SystemInfo_h\n#define OVR_Util_SystemInfo_h\n\n#include \"../Kernel/OVR_String.h\"\n#include \"../Kernel/OVR_Types.h\"\n#include \"../Kernel/OVR_Array.h\"\n\nnamespace OVR { namespace Util {\n\nconst char * OSAsString();\nString OSVersionAsString();\nuint64_t GetGuidInt();\nString GetGuidString();\nconst char * GetProcessInfo();\nString GetFileVersionString(String filePath);\nString GetSystemFileVersionString(String filePath);\nString GetDisplayDriverVersion();\nString GetCameraDriverVersion();\nvoid GetGraphicsCardList(OVR::Array< OVR::String > &gpus);\nString GetProcessorInfo(int* numcores = NULL);\n\n} } // namespace OVR { namespace Util {\n\n#endif // OVR_Util_SystemInfo_h\n"
  },
  {
    "path": "externals/ovr/Src/Util/Util_SystemInfo_OSX.mm",
    "content": "\t/************************************************************************************\r\n \r\n Filename    :   Util_SystemInfo_OSX.mm\r\n Content     :   Various operations to get information about the mac system\r\n Created     :   October 2, 2014\r\n \r\n Copyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\r\n \r\n Licensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\r\n you may not use the Oculus VR Rift SDK except in compliance with the License,\r\n which is provided at the time of installation or download, or which\r\n otherwise accompanies this software in either electronic or hard copy form.\r\n \r\n You may obtain a copy of the License at\r\n \r\n http://www.oculusvr.com/licenses/LICENSE-3.2\r\n \r\n Unless required by applicable law or agreed to in writing, the Oculus VR SDK\r\n distributed under the License is distributed on an \"AS IS\" BASIS,\r\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n See the License for the specific language governing permissions and\r\n limitations under the License.\r\n \r\n ************************************************************************************/\r\n\r\n#include \"Util_SystemInfo.h\"\r\n\r\n#include <Cocoa/Cocoa.h>\r\n\r\n#include <sys/sysctl.h>\r\n#include <sys/types.h>\r\n\r\n#include \"../Kernel/OVR_String.h\"\r\n#include \"../Kernel/OVR_System.h\"\r\n\r\nusing namespace OVR;\r\nnamespace OVR { namespace Util {\r\n\r\n//from http://opensource.apple.com/source/CF/CF-744/CFUtilities.c\r\nOVR::String OSVersionAsString(){\r\n\r\n    NSDictionary *systemVersionDictionary =\r\n    [NSDictionary dictionaryWithContentsOfFile:\r\n     @\"/System/Library/CoreServices/SystemVersion.plist\"];\r\n    \r\n    NSString *systemVersion =\r\n    [systemVersionDictionary objectForKey:@\"ProductVersion\"];\r\n    return OVR::String([systemVersion UTF8String]);\r\n}\r\n\r\n    \r\n//from http://www.starcoder.com/wordpress/2011/10/using-iokit-to-detect-graphics-hardware/\r\nvoid GetGraphicsCardList(Array< String > &gpus)\r\n{\r\n    // Check the PCI devices for video cards.\r\n    CFMutableDictionaryRef match_dictionary = IOServiceMatching(\"IOPCIDevice\");\r\n    \r\n    // Create a iterator to go through the found devices.\r\n    io_iterator_t entry_iterator;\r\n    \r\n    if (IOServiceGetMatchingServices(kIOMasterPortDefault,\r\n                                     match_dictionary,\r\n                                     &entry_iterator) == kIOReturnSuccess)\r\n    {\r\n        // Actually iterate through the found devices.\r\n        io_registry_entry_t serviceObject;\r\n        while ((serviceObject = IOIteratorNext(entry_iterator)))\r\n        {\r\n            // Put this services object into a dictionary object.\r\n            CFMutableDictionaryRef serviceDictionary;\r\n            if (IORegistryEntryCreateCFProperties(serviceObject,\r\n                                                  &serviceDictionary,\r\n                                                  kCFAllocatorDefault,\r\n                                                  kNilOptions) != kIOReturnSuccess)\r\n            {\r\n                // Failed to create a service dictionary, release and go on.\r\n                IOObjectRelease(serviceObject);\r\n                continue;\r\n            }\t\r\n            \r\n            // \t\t\r\n            // that points to a CFDataRef.\r\n            const void *modelarr = CFDictionaryGetValue(serviceDictionary, CFSTR(\"model\"));\r\n            if (modelarr != nil) {\r\n                if(CFGetTypeID(modelarr) == CFDataGetTypeID())\r\n                {\r\n                    NSData *data = (__bridge NSData*)(CFDataRef)modelarr;\r\n                    NSString *s = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];\r\n                    gpus.PushBack([s UTF8String]);\r\n                }\r\n            }\r\n            \r\n            // Release the dictionary created by IORegistryEntryCreateCFProperties.\r\n            CFRelease(serviceDictionary);\r\n            \r\n            // Release the serviceObject returned by IOIteratorNext.\r\n            IOObjectRelease(serviceObject);\r\n        }\r\n        \r\n        // Release the entry_iterator created by IOServiceGetMatchingServices.\r\n        IOObjectRelease(entry_iterator);\r\n    }\r\n}\r\n    \r\n} } // namespace OVR { namespace Util {\r\n\r\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/CAPI_DistortionRenderer.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_DistortionRenderer.cpp\nContent     :   Combines all of the rendering state associated with the HMD\nCreated     :   February 2, 2014\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_DistortionRenderer.h\"\n\n#if defined (OVR_OS_WIN32)\n\n// TBD: Move to separate config file that handles back-ends.\n#include \"D3D1X/CAPI_D3D11_DistortionRenderer.h\"\n#include \"D3D9/CAPI_D3D9_DistortionRenderer.h\"\n\n#endif\n\n#include \"GL/CAPI_GL_DistortionRenderer.h\"\n\nnamespace OVR { namespace CAPI {\n\n\n//-------------------------------------------------------------------------------------\n// ***** DistortionRenderer\n\n// TBD: Move to separate config file that handles back-ends.\n\nDistortionRenderer::CreateFunc DistortionRenderer::APICreateRegistry[ovrRenderAPI_Count] =\n{\n    0, // None\n    &GL::DistortionRenderer::Create,\n    0, // Android_GLES\n#if defined (OVR_OS_WIN32)\n    &D3D9::DistortionRenderer::Create,\n    0, // D3D10\n    &D3D11::DistortionRenderer::Create\n#else\n    0,\n    0,\n    0\n#endif\n};\n\nDistortionRenderer::DistortionRenderer() :\n\tLastUsedOverdriveTextureIndex(-1),\n    LatencyTestActive(false),\n    LatencyTest2Active(false),\n    RenderAPI(ovrRenderAPI_None),\n    Timing(nullptr),\n    RenderState(nullptr),\n    GfxState(),\n    RegisteredPostDistortionCallback(NULL)\n{\n#ifdef OVR_OS_WIN32\n    timer = CreateWaitableTimer(NULL, TRUE, NULL);\n    OVR_ASSERT(timer != NULL);\n#endif\n\n    // set to invalid values to catch uninit case\n    PositionTimewarpDesc.FarClip               = -1.0f;\n    PositionTimewarpDesc.NearClip              = -1.0f;\n    PositionTimewarpDesc.HmdToEyeViewOffset[0] = Vector3f(MATH_FLOAT_MAXVALUE, MATH_FLOAT_MAXVALUE, MATH_FLOAT_MAXVALUE);\n    PositionTimewarpDesc.HmdToEyeViewOffset[1] = Vector3f(MATH_FLOAT_MAXVALUE, MATH_FLOAT_MAXVALUE, MATH_FLOAT_MAXVALUE);\n}\n\nDistortionRenderer::~DistortionRenderer()\n{\n}\n\nbool DistortionRenderer::Initialize(ovrRenderAPIConfig const* apiConfig,\n                                    Vision::TrackingStateReader* stateReader,\n                                    DistortionTimer* timing,\n                                    HMDRenderState const* renderState)\n{\n    if (!apiConfig || !renderState || !timing || !stateReader)\n    {\n        OVR_ASSERT(false);\n        return false;\n    }\n\n    RenderAPI    = apiConfig->Header.API;\n    SensorReader = stateReader;\n    Timing       = timing;\n    RenderState  = renderState;\n\n    return initializeRenderer(apiConfig);\n}\n\nvoid DistortionRenderer::SetLatencyTestColor(unsigned char* color)\n{\n    if(color)\n    {\n        LatencyTestDrawColor[0] = color[0];\n        LatencyTestDrawColor[1] = color[1];\n        LatencyTestDrawColor[2] = color[2];\n    }\n\n    LatencyTestActive = color != NULL;\n}\n\nvoid DistortionRenderer::SetLatencyTest2Color(unsigned char* color)\n{\n    if(color)\n    {\n        LatencyTest2DrawColor[0] = color[0];\n        LatencyTest2DrawColor[1] = color[1];\n        LatencyTest2DrawColor[2] = color[2];\n    }\n\n    LatencyTest2Active = color != NULL;\n}\n\nvoid DistortionRenderer::GetOverdriveScales(float& outRiseScale, float& outFallScale)\n{\n    outRiseScale = 0.1f;\n    outFallScale = 0.05f;\t// falling issues are hardly visible\n}\n\ndouble DistortionRenderer::WaitTillTime(double absTime)\n{\n    double initialTime = ovr_GetTimeInSeconds();\n    if (initialTime >= absTime)\n        return 0.0;\n\n    double newTime = initialTime;\n\n    while (newTime < absTime)\n    {\n// TODO: Needs further testing before enabling it on all Windows configs\n#if 0 //def OVR_OS_WIN32\n        double remainingWaitTime = absTime - newTime;\n\n        // don't yield if <2ms\n        if(remainingWaitTime > 0.002)\n        {\n            // round down wait time to closest 1 ms\n            int roundedWaitTime = (remainingWaitTime * 1000);\n\n            waitableTimerInterval.QuadPart = -10000LL; // 10000 * 100 ns = 1 ms\n            waitableTimerInterval.QuadPart *= roundedWaitTime;\n\n            SetWaitableTimer(timer, &waitableTimerInterval, 0, NULL, NULL, TRUE);\n            DWORD waitResult = WaitForSingleObject(timer, roundedWaitTime + 3);   // give 3 ms extra time\n            OVR_UNUSED(waitResult);\n\n#ifdef OVR_BUILD_DEBUG\n            double sleptTime = ovr_GetTimeInSeconds() - newTime;\n            // Make sure we didn't sleep too long and it is reliable, otherwise we might miss v-sync causing a stutter\n            if (sleptTime > (roundedWaitTime + 2) * 0.001) \n            {\n                OVR_DEBUG_LOG_TEXT(\n                    (\"[DistortionRenderer::WaitTillTime] Sleep interval too long: %f\\n\", sleptTime));\n            }\n            else\n            {\n                OVR_ASSERT(WAIT_OBJECT_0 == waitResult);\n            }\n#endif\n        }\n        else\n#endif\n        {\n            for (int j = 0; j < 5; j++)\n                OVR_PROCESSOR_PAUSE();\n        }\n\n        newTime = ovr_GetTimeInSeconds();\n    }\n\n    // How long we waited\n    return newTime - initialTime;\n}\n\n\n}} // namespace OVR::CAPI\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/CAPI_DistortionRenderer.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_DistortionRenderer.h\nContent     :   Abstract interface for platform-specific rendering of distortion\nCreated     :   February 2, 2014\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_DistortionRenderer_h\n#define OVR_CAPI_DistortionRenderer_h\n\n#include \"CAPI_HMDRenderState.h\"\n#include \"CAPI_FrameLatencyTracker.h\"\n#include \"CAPI_FrameTimeManager3.h\"\n#include \"CAPI_DistortionTiming.h\"\n#include \"../Vision/SensorFusion/Vision_SensorStateReader.h\"\n\ntypedef void (*PostDistortionCallback)(void* pRenderContext);\n\nnamespace OVR { namespace CAPI {\n\n\n//-------------------------------------------------------------------------------------\n// ***** CAPI::DistortionRenderer\n\n// DistortionRenderer implements rendering of distortion and other overlay elements\n// in platform-independent way.\n// Platform-specific renderer back ends for CAPI are derived from this class.\n\nclass DistortionRenderer : public RefCountBase<DistortionRenderer>\n{\n    // Quiet assignment compiler warning.\n    void operator = (const DistortionRenderer&) { }\npublic:\n    DistortionRenderer();\n    virtual ~DistortionRenderer();\n\n    // Configures the Renderer based on externally passed API settings. Must be\n    // called before use.\n    // Under D3D, apiConfig includes D3D Device pointer, back buffer and other\n    // needed structures.\n    bool Initialize(ovrRenderAPIConfig const * apiConfig,\n                    Vision::TrackingStateReader* stateReader,\n                    DistortionTimer* distortionTiming,\n                    HMDRenderState const * renderState);\n\n    // Submits one eye texture for rendering. This is in the separate method to\n    // allow \"submit as you render\" scenarios on horizontal screens where one\n    // eye can be scanned out before the other.\n    virtual void SubmitEye(int eyeId, const ovrTexture* eyeTexture) = 0;\n    virtual void SubmitEyeWithDepth(int eyeId, const ovrTexture* eyeColorTexture, const ovrTexture* eyeDepthTexture) = 0;\n\n    // Finish the frame, optionally swapping buffers.\n    // Many implementations may actually apply the distortion here.\n    virtual void EndFrame(uint32_t frameIndex, bool swapBuffers) = 0;\n\n    void RegisterPostDistortionCallback(PostDistortionCallback postDistortionCallback)\n    {\n        RegisteredPostDistortionCallback = postDistortionCallback;\n    }\n\n\t// Stores the current graphics pipeline state so it can be restored later.\n\tvoid SaveGraphicsState() { if (GfxState && !(RenderState->DistortionCaps & ovrDistortionCap_NoRestore)) GfxState->Save(); }\n\n\t// Restores the saved graphics pipeline state.\n\tvoid RestoreGraphicsState() { if (GfxState && !(RenderState->DistortionCaps & ovrDistortionCap_NoRestore)) GfxState->Restore(); }\n\n    // *** Creation Factory logic\n\n    ovrRenderAPIType GetRenderAPI() const { return RenderAPI; }\n\n    // Creation function for this interface, registered for API.\n    typedef DistortionRenderer* (*CreateFunc)();\n\n    static CreateFunc APICreateRegistry[ovrRenderAPI_Count];\n\n    // Color is expected to be 3 byte RGB\n    void SetLatencyTestColor(unsigned char* color);\n    void SetLatencyTest2Color(unsigned char* color);\n\n    void SetPositionTimewarpDesc(const ovrPositionTimewarpDesc& posTimewarpDesc) { PositionTimewarpDesc = posTimewarpDesc; }\n\nprotected:\n    virtual bool initializeRenderer(const ovrRenderAPIConfig* apiConfig) = 0;\n\n\t// Used for pixel luminance overdrive on DK2 displays\n\t// A copy of back buffer images will be ping ponged\n\t// TODO: figure out 0 dynamically based on DK2 latency?\n\tstatic const int\tNumOverdriveTextures = 2;\n\tint\t\t\t\t\tLastUsedOverdriveTextureIndex;\n\n    bool                LatencyTestActive;\n    unsigned char       LatencyTestDrawColor[3];\n    bool                LatencyTest2Active;\n    unsigned char       LatencyTest2DrawColor[3];\n\n    bool IsOverdriveActive()\n\t{\n\t\t// doesn't make sense to use overdrive when vsync is disabled as we cannot guarantee\n\t\t// when the rendered frame will be displayed\n\t\treturn LastUsedOverdriveTextureIndex >= 0 && (RenderState->EnabledHmdCaps & ovrHmdCap_NoVSync) == 0;\n\t}\n\n    void GetOverdriveScales(float& outRiseScale, float& outFallScale);\n\n    double WaitTillTime(double absTime);\n\n#ifdef OVR_OS_WIN32\n    HANDLE timer;\n    LARGE_INTEGER waitableTimerInterval;\n#endif\n\n    class GraphicsState : public RefCountBase<GraphicsState>\n    {\n    public:\n        GraphicsState() : IsValid(false) {}\n        virtual ~GraphicsState() {}\n        virtual void Save() = 0;\n        virtual void Restore() = 0;\n        \n    protected:\n        bool IsValid;\n    };\n\n    ovrRenderAPIType        RenderAPI;\n    Vision::TrackingStateReader* SensorReader; // For reading head pose for timewarp\n    DistortionTimer*        Timing;\n    HMDRenderState const *  RenderState;\n\n    Ptr<GraphicsState>      GfxState;\n    ovrPositionTimewarpDesc PositionTimewarpDesc;\n    PostDistortionCallback  RegisteredPostDistortionCallback;\n};\n\n\n}} // namespace OVR::CAPI\n\n\n#endif // OVR_CAPI_DistortionRenderer_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/CAPI_DistortionTiming.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_DistortionTiming.cpp\nContent     :   Implements timing for the distortion renderer\nCreated     :   Dec 16, 2014\nAuthors     :   Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_DistortionRenderer.h\"\n\n#ifdef OVR_OS_WIN32\n#include \"../Displays/OVR_Win32_Dxgi_Display.h\" // Display driver timing info\n#endif\n\nnamespace OVR { namespace CAPI {\n\n\n//-----------------------------------------------------------------------------\n// Timing Constants\n\n// Number of milliseconds to pad on top of the timewarp draw call measured time\n// in order to account for random variations in execution time due to preemption.\n// If this is set too low the rendering will occasionally judder.\nstatic const double kJITPreemptBufferTime   = 0.004;    // 4 milliseconds\n\n// When validating measured frame intervals, the following constants\n// bound the acceptable measurements.\nstatic const double kMinFrameInterval       = 0.001;    // 1 millisecond\nstatic const double kMaxFrameInterval       = 0.020;    // 20 milliseconds\n\n// If the last known Vsync time is older than this age limit,\n// then we should not use it for extrapolating to current time.\nstatic const double kVsyncDataAgeLimit      = 10.;      // 10 seconds\n\n// When Vsync is off and we have no idea when the last frame started,\n// assume this amount of time has elapsed since the frame started.\nstatic const double kNoVsyncInfoFrameTime   = 0.002;    // 2 milliseconds\n\n#ifdef OVR_OS_WIN32\n// The latest driver provides a post-present vsync-to-scanout delay\n// that is roughly zero.  The actual measured latency should be\n// about the same as this.\nstatic const double kExpectedDriverLatency  = 0.0002f;  // 200 microseconds\n#endif\n\n// Number from a hat for post-present latency when Vsync is off.\nstatic const double kExpectedNoVSyncLatency = 0.003;    // 3 milliseconds\n\n// Number of timewarp render time samples to collect\nstatic const int kTimewarpRenderTimeSamples = 12;       // 12 samples\n\n// Adding a fuzz time because the last known Vsync time is sometimes fuzzy and\n// we don't want to predict behind a whole frame.  This is most often used in\n// app rendered and D3D9 renderers and on Win/Mac/Linux with OpenGL.\nstatic const double kFuzzyVsyncBufferTime   = kJITPreemptBufferTime;\n// Currently set to the same fuzz factor used for JIT preemption because the\n// same amount of error is accounted for by both constants.\n\n// Even when the Vsync timing data source is precise we should add some kind of\n// buffer in to avoid floating point rounding or unexpected sync problems.\nstatic const double kExactVsyncBufferTime   = 0.001;    // 1 millisecond\n\n\n//-----------------------------------------------------------------------------\n// Helper Functions\n\n// Based on LastKnownVsyncTime, predict time when the previous frame Vsync occurred.\n// If it has no data it will still provide a reasonable estimate of last Vsync time.\nstatic double calculateFrameStartTime(double now,\n                                      double lastKnownVsyncTime,\n                                      double lastKnownVsyncFuzzBuffer,\n                                      double frameInterval)\n{\n    // Calculate time since last known vsync\n    // Adding a fuzz time because the last known Vsync time is sometimes fuzzy and\n    // we don't want to predict behind a frame.\n    const double delta = now - lastKnownVsyncTime + lastKnownVsyncFuzzBuffer;\n\n    // If last known vsync time was too long ago,\n    if (delta < 0. ||\n        delta > kVsyncDataAgeLimit)\n    {\n        // We have no idea when Vsync will happen!\n\n        // Assume we are some time into the frame when this is called.\n        return now - kNoVsyncInfoFrameTime;\n    }\n\n    // Calculate number of Vsyncs since the last known Vsync time.\n    int numVsyncs = (int)(delta / frameInterval);\n\n    // Calculate the last Vsync time.\n    double lastFrameVsyncTime = lastKnownVsyncTime + numVsyncs * frameInterval;\n\n    // Sanity checking...\n    OVR_ASSERT(lastFrameVsyncTime - now > -0.16 && lastFrameVsyncTime - now < 0.30);\n\n    return lastFrameVsyncTime;\n}\n\n\n//-----------------------------------------------------------------------------\n// DistortionTiming : Initialization\n\nDistortionTimer::DistortionTimer() :\n    LastPresentTime(0),\n    LastKnownVsyncTime(0),\n    LastKnownVsyncFuzzBuffer(0),\n    AppFrameIndex(0),\n    DistortionRenderTimes(kTimewarpRenderTimeSamples),\n    EstimatedTimewarpRenderTime(0),\n  #ifdef OVR_OS_WIN32\n    DeviceHandle(nullptr),\n  #endif\n    LatencyTester(nullptr),\n    RenderState(nullptr),\n    ScreenSwitchingDelay(0),\n    TimeManager(true),\n    LastTimewarpFrameEndTime(0),\n    AlreadyInitialized(false),\n    CurrentFrameTimewarpTiming(),\n    LastTimewarpIMUTime(0)\n{\n    Reset();\n}\n\nvoid DistortionTimer::Reset()\n{\n    // Clear state\n    LastKnownVsyncTime       = 0.;\n    LastKnownVsyncFuzzBuffer = 0.;\n    LastPresentTime          = 0.;\n    LastTimewarpFrameEndTime = 0.;\n    AppFrameIndex            = 0;\n\n    ClearAppTimingUpdater();\n\n    // Does not clear the distortion render times because this data is still good\n    //DistortionRenderTimes.Clear();\n    //EstimatedTimewarpRenderTime = 0.;\n    //LatencyTester = nullptr;\n    //RenderState = nullptr;\n}\n\nDistortionTimer::~DistortionTimer()\n{\n    RenderState   = nullptr;\n    LatencyTester = nullptr;\n}\n\nbool DistortionTimer::Initialize(HMDRenderState const * renderState,\n                                 FrameLatencyTracker const * lagTester)\n{\n    if (AlreadyInitialized)\n    {\n        OVR_ASSERT(renderState == RenderState && lagTester == LatencyTester);\n        return true;\n    }\n\n    if (!renderState || !lagTester)\n    {\n        OVR_ASSERT(false);\n        return false;\n    }\n\n    // Store members\n    RenderState   = renderState;\n    LatencyTester = lagTester;\n\n#ifdef OVR_OS_WIN32\n    // If in direct mode,\n    if (!RenderState->OurHMDInfo.InCompatibilityMode)\n    {\n        // Attempt to open the driver\n        DeviceHandle = CreateFile(L\"\\\\\\\\.\\\\ovr_video\",\n            GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, nullptr);\n    }\n#endif\n\n    HmdRenderInfo::ShutterInfo const& shutter = RenderState->RenderInfo.Shutter;\n\n    // Calculate the screen switching delay from shutter info.\n    ScreenSwitchingDelay = shutter.PixelSettleTime * 0.5 + shutter.PixelPersistence * 0.5;\n\n    // Set default frame delta for the TimeManager.\n    TimeMan::Timing defaultTiming;\n    defaultTiming.FrameDelta = shutter.VsyncToNextVsync;\n    TimeManager.Initialize(defaultTiming);\n\n    AlreadyInitialized = true;\n    return true;\n}\n\n\n//-----------------------------------------------------------------------------\n// DistortionTiming : Helper Member Functions\n\ndouble DistortionTimer::getFrameInterval() const\n{\n    // Get the latest frame interval from the time manager.\n    double frameInterval = TimeManager.GetFrameDelta();\n\n    // If bad data is coming from the frame delta calculator,\n    if (frameInterval < kMinFrameInterval ||\n        frameInterval > kMaxFrameInterval)\n    {\n        // Use the shutter value by default.\n        HmdRenderInfo::ShutterInfo const& shutter = RenderState->RenderInfo.Shutter;\n        frameInterval = shutter.VsyncToNextVsync;\n    }\n\n    return frameInterval;\n}\n\ndouble DistortionTimer::getScanoutDelay()\n{\n    // If Vsync is off,\n    if ((RenderState->EnabledHmdCaps & ovrHmdCap_NoVSync) != 0)\n        return kExpectedNoVSyncLatency;\n\n    double vsyncToScanoutDelay = 0.;\n\n    // If latency tester results are not available,\n    if (!LatencyTester || !LatencyTester->GetVsyncToScanout(vsyncToScanoutDelay))\n    {\n        // Use a reasonable default post-present latency estimate.\n#ifdef OVR_OS_WIN32\n        vsyncToScanoutDelay = RenderState->OurHMDInfo.InCompatibilityMode ?\n            RenderState->RenderInfo.Shutter.VsyncToNextVsync : kExpectedDriverLatency;\n#else\n        // FIXME: This is a heuristic value that may need to be better tuned later\n        // as the Mac/Linux render architecture solidifies.\n        vsyncToScanoutDelay = 0.0007; // Observed as 0.7 ms on Linux\n#endif\n    }\n\n    // Clamp the result be zero or positive.\n    if (vsyncToScanoutDelay < 0.)\n        vsyncToScanoutDelay = 0;\n\n    return vsyncToScanoutDelay;\n}\n\n#ifdef OVR_OS_WIN32\n\nbool DistortionTimer::getDriverVsyncTime(double* previousKnownVsyncTime)\n{\n    // If using the driver,\n    if (!RenderState->OurHMDInfo.InCompatibilityMode)\n    {\n        ULONG riftId = (ULONG)RenderState->OurHMDInfo.ShimInfo.DeviceNumber;\n        UINT64 results[2];\n        ULONG bytesReturned = 0;\n\n        BOOL success = DeviceIoControl(DeviceHandle.Get(), IOCTL_RIFTMGR_GETCURRENTFRAMEINFO, &riftId,\n            sizeof(riftId), results, sizeof(results), &bytesReturned, nullptr);\n\n        if (success)\n        {\n            // Calculate Vsync time in seconds based on QPC from display driver.\n            *previousKnownVsyncTime = results[1] * Timer::GetPerfFrequencyInverse();\n            return true;\n        }\n    }\n\n    return false;\n}\n\n#endif // OVR_OS_WIN32\n\n\n//-----------------------------------------------------------------------------\n// DistortionTiming : Timewarp Timing\n\nvoid DistortionTimer::AddDistortionTimeMeasurement(double distortionTimeSeconds)\n{\n    // Accumulate the new measurement.\n    DistortionRenderTimes.Add(distortionTimeSeconds);\n\n    // If enough measurements are collected now,\n    if (!NeedDistortionTimeMeasurement())\n    {\n        EstimatedTimewarpRenderTime = DistortionRenderTimes.GetMedian();\n    }\n}\n\nvoid DistortionTimer::submitDisplayFrame(double frameEndTime, double frameInterval)\n{\n    // Get the last display frame index\n    uint32_t frameIndex = TimeManager.GetLastDisplayFrameIndex();\n    double lastTime     = TimeManager.GetLastDisplayFrameTime();\n\n    // If a previous submit time was recorded,\n    if (lastTime > 0.)\n    {\n        // Calculate number of elapsed frames since last submit\n        int elapsed = (int)((frameEndTime - lastTime + frameInterval * 0.5) / frameInterval);\n\n        frameIndex += elapsed;\n    }\n\n    // Submit this display frame to the TimeManager\n    TimeManager.SubmitDisplayFrame(frameIndex, AppFrameIndex, frameEndTime);\n}\n\nvoid DistortionTimer::updateLastKnownVsyncTime(double previousKnownVsyncTime)\n{\n    // Assume the data is exact.\n    LastKnownVsyncFuzzBuffer = kExactVsyncBufferTime;\n\n    // If previous vsync time was not provided,\n    if (previousKnownVsyncTime <= 0.)\n    {\n#ifdef OVR_OS_WIN32\n        // If the display driver was not helpful,\n        if (!getDriverVsyncTime(&previousKnownVsyncTime))\n#endif\n        {\n            // Use the last fuzzy vsync time and frame index\n            // Add in a fuzz factor to prevent from predicting behind a whole frame!\n            previousKnownVsyncTime   = LastPresentTime;\n\n            // The data is pretty fuzzy so increase the buffer time.\n            LastKnownVsyncFuzzBuffer = kFuzzyVsyncBufferTime;\n        }\n    }\n\n    // Update last known vsync time\n    LastKnownVsyncTime = previousKnownVsyncTime;\n}\n\ndouble DistortionTimer::getJITTimewarpTime(double frameEndTime)\n{\n    // If there is no timing information available for the timewarp draw call,\n    if (EstimatedTimewarpRenderTime <= 0.)\n    {\n        // Disable JIT until we have some idea how long timewarp draw call takes.\n        return 0.;\n    }\n\n    // Calculate Just-in-Time timewarp time\n    return frameEndTime - EstimatedTimewarpRenderTime - kJITPreemptBufferTime;\n}\n\n// Rolls the previous known vsync time forward and then checks queue-ahead conditions\nvoid DistortionTimer::CalculateTimewarpTiming(uint32_t frameIndex, double previousKnownVsyncTime)\n{\n    // Update LastKnownVsyncTime from previous known vsync time.\n    updateLastKnownVsyncTime(previousKnownVsyncTime);\n\n    // Calculate the frame start time from available information.\n    const double frameInterval  = getFrameInterval();\n    const double frameStartTime = calculateFrameStartTime(\n        Timer::GetSeconds(),\n        LastKnownVsyncTime,\n        LastKnownVsyncFuzzBuffer,\n        frameInterval);\n    const double scanoutDelay   = getScanoutDelay();\n\n    // If Vsync is off,\n    if ((RenderState->EnabledHmdCaps & ovrHmdCap_NoVSync) != 0)\n    {\n        // Always render for current frame start-end times.\n        CurrentFrameTimewarpTiming.ScanoutTime      = frameStartTime + scanoutDelay;\n        CurrentFrameTimewarpTiming.JIT_TimewarpTime = 0.; // JIT disabled when Vsync is off\n\n        // Reset the last timewarp frame end time when Vsync is turned off.\n        LastTimewarpFrameEndTime = 0.;\n\n        // Set the reference point for the scanout delay to the frame start time when Vsync\n        // is off.\n        LatencyTesterPresentTime = frameStartTime;\n    }\n    else // Vsync is on:\n    {\n        // Calculate frame end time with Vsync on.\n        double frameEndTime = frameStartTime + frameInterval;\n\n        // If JIT is turned off,\n        if (!(RenderState->DistortionCaps & ovrDistortionCap_TimewarpJitDelay))\n        {\n#ifdef OVR_SUPPORT_QUEUE_AHEAD\n            // Without JIT it can render ahead a frame.\n            // If Vsync is on and it targets the same end of frame time twice\n            // then the second timewarp render is queued ahead a frame, as two\n            // consecutive distortion renders cannot target the same frame twice.\n\n            // If the last frame end time is about the same as this one,\n            if (fabs(LastTimewarpFrameEndTime - frameEndTime) < frameInterval * 0.25)\n            {\n                // Skip ahead to the next frame time.\n                frameEndTime += frameInterval;\n            }\n#endif\n\n            // Set JIT time to zero so that if JIT is turned off after this,\n            // that the JIT wait code will be skipped and timing will be right\n            // for this frame.\n            CurrentFrameTimewarpTiming.JIT_TimewarpTime = 0.;\n        }\n        else\n        {\n            // JIT timewarp is enabled, so provide a time estimate.\n            CurrentFrameTimewarpTiming.JIT_TimewarpTime = getJITTimewarpTime(frameEndTime);\n        }\n\n        // Record the new frame end time.\n        LastTimewarpFrameEndTime = frameEndTime;\n\n        // Scanout is based on frame end time when Vsync is on due to potential queue-ahead.\n        CurrentFrameTimewarpTiming.ScanoutTime = frameEndTime + scanoutDelay;\n\n        // Update the TimeManager.\n        submitDisplayFrame(frameEndTime, frameInterval);\n\n        // Set the reference point for the scanout delay to the frame end time when Vsync\n        // is on.  This way our calculations will work out where we add scanout delay to\n        // get the actual scanout time from this reference point in the future.\n        LatencyTesterPresentTime = frameEndTime;\n    }\n\n    // Update lockless app timing base values\n    LocklessAppTimingBase appTimingBase;\n    appTimingBase.FrameInterval        = frameInterval;\n    appTimingBase.LastEndFrameIndex    = frameIndex;\n    appTimingBase.LastStartFrameTime   = frameStartTime;\n    appTimingBase.LastKnownVsyncTime   = LastKnownVsyncTime;\n    appTimingBase.ScanoutDelay         = scanoutDelay;\n    appTimingBase.ScreenSwitchingDelay = ScreenSwitchingDelay;\n    appTimingBase.VsyncFuzzFactor      = LastKnownVsyncFuzzBuffer;\n    appTimingBase.IsValid              = 1;\n    LocklessAppTimingBaseUpdater.SetState(appTimingBase);\n\n    // Get eye timewarp times\n    // NOTE: Approximating scanline start-end interval with Vsync-Vsync interval here.\n    CalculateEyeTimewarpTimes(\n        CurrentFrameTimewarpTiming.ScanoutTime + ScreenSwitchingDelay,\n        frameInterval,\n        RenderState->RenderInfo.Shutter.Type,\n        CurrentFrameTimewarpTiming.EyeStartEndTimes[0],\n        CurrentFrameTimewarpTiming.EyeStartEndTimes[1]);\n}\n\n\n//-----------------------------------------------------------------------------\n// AppDistortionTimer\n\nAppRenderTimer::AppRenderTimer() :\n    AppTimingBaseUpdater(nullptr)\n{\n}\n\nAppRenderTimer::~AppRenderTimer()\n{\n}\n\nvoid AppRenderTimer::GetAppTimingForIndex(AppTiming& result, bool vsyncOn, uint32_t frameIndex)\n{\n    /*\n        This code has to handle two big cases:\n\n            Queue-Ahead:\n\n        In this case the application is requesting poses for an upcoming frame, which is\n        very common.  We need to predict ahead potentially beyond the next frame scanout\n        time to a following scanout time.\n\n            Missed Frames:\n\n        In this case the rendering\n            (1) game physics/other code ate too much CPU time and delayed the frame, or\n            (2) the render command queuing took too long, or\n            (3) took too long to complete on the GPU.\n\n        Regarding (1):\n            Game code is pretty much out of the way in the case of Unity which has\n            two threads: A game code thread and a render thread.  So in a real game\n            engine it's mainly due to too much render complexity not CPU game logic.\n\n        Regarding (2):\n            Distortion is done after the game queues render commands, and so\n            the timewarp timing calculation can get pushed off into the next frame\n            and actually get timed correctly.\n\n        So as a result judder is mainly due to GPU performance, as other other sources\n        of frame drops are mitigated.\n    */\n\n    if (!IsValid())\n    {\n        OVR_ASSERT(false);\n        result.Clear();\n        return;\n    }\n\n    LocklessAppTimingBase base = AppTimingBaseUpdater->GetState();\n\n    // If no timing data is available,\n    if (!base.IsValid)\n    {\n        result.Clear();\n        return;\n    }\n\n    int32_t deltaIndex = (int32_t)(frameIndex - base.LastEndFrameIndex);\n\n    // Calculate the end frame time.\n    // Vsync on: This is the targeted Vsync for the provided frame index.\n    // Vsync off: This is the middle of the frame requested by index.\n    double endFrameTime;\n    if (vsyncOn)\n    {\n        endFrameTime = base.LastStartFrameTime + base.FrameInterval * (deltaIndex + 1);\n    }\n    else\n    {\n        endFrameTime = base.LastStartFrameTime + base.FrameInterval * 0.5;\n        endFrameTime += base.FrameInterval * deltaIndex;\n    }\n\n    // If targeted Vsync is now in the past,\n    const double now = Timer::GetSeconds();\n    if (now + base.VsyncFuzzFactor > endFrameTime)\n    {\n        // Assume there is no queue-ahead, so we should target the very\n        // next upcoming Vsync\n        double frameStartTime = calculateFrameStartTime(now, base.LastKnownVsyncTime,\n                                                        base.VsyncFuzzFactor,\n                                                        base.FrameInterval);\n        if (vsyncOn)\n        {\n            // End frame time is just one frame ahead of the frame start\n            endFrameTime = frameStartTime + base.FrameInterval;\n        }\n        else\n        {\n            // End frame time is half way through the current frame\n            endFrameTime = frameStartTime + base.FrameInterval * 0.5;\n        }\n    }\n\n    // Add Vsync-Scanout delay to get scanout time\n    double scanoutTime = endFrameTime + base.ScanoutDelay;\n\n    // Construct app frame information object\n    result.FrameInterval       = base.FrameInterval;\n    result.ScanoutStartTime    = scanoutTime;\n    // NOTE: Approximating scanline start-end interval with Vsync-Vsync interval here.\n    result.VisibleMidpointTime = scanoutTime + base.ScreenSwitchingDelay + base.FrameInterval * 0.5;\n}\n\n\n//-----------------------------------------------------------------------------\n// AppTimingHistory\n\nAppTimingHistory::AppTimingHistory()\n{\n    Clear();\n}\n\nAppTimingHistory::~AppTimingHistory()\n{\n}\n\nvoid AppTimingHistory::Clear()\n{\n    LastWriteIndex = 0;\n    memset(History, 0, sizeof(History));\n}\n\nvoid AppTimingHistory::SetScanoutTimeForFrame(uint32_t frameIndex, double scanoutTime)\n{\n    if (++LastWriteIndex >= kFramesMax)\n    {\n        LastWriteIndex = 0;\n    }\n\n    History[LastWriteIndex].FrameIndex = frameIndex;\n    History[LastWriteIndex].ScanoutTime = scanoutTime;\n}\n\ndouble AppTimingHistory::LookupScanoutTime(uint32_t frameIndex)\n{\n    // Check last written entry first\n    if (History[LastWriteIndex].FrameIndex == frameIndex)\n    {\n        return History[LastWriteIndex].ScanoutTime;\n    }\n\n    for (int i = 0; i < kFramesMax; ++i)\n    {\n        if (History[i].FrameIndex == frameIndex)\n        {\n            return History[i].ScanoutTime;\n        }\n    }\n\n    return 0.;\n}\n\n\n}} // namespace OVR::CAPI\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/CAPI_DistortionTiming.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_DistortionTiming.h\nContent     :   Implements timing for the distortion renderer\nCreated     :   Dec 16, 2014\nAuthors     :   Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_DistortionTiming_h\n#define OVR_CAPI_DistortionTiming_h\n\n#include \"CAPI_HMDRenderState.h\"\n#include \"CAPI_FrameLatencyTracker.h\"\n#include \"CAPI_FrameTimeManager3.h\"\n#include \"CAPI_HMDRenderState.h\"\n#include <Kernel/OVR_Lockless.h>\n#include <OVR_CAPI.h> // ovrFrameTiming\n\n/*\n    -----------------------------\n    Distortion Timing Terminology\n    -----------------------------\n\n    To fix on one set of terminology, a frame life-cycle is defined the following:\n\n    (1) Get prediction time for app left/right eye rendering.\n    (2) App renders left/right eyes.\n    (3) Get prediction time for timewarp.\n    (4) SDK renders distortion/timewarp/chroma, perhaps measuring the time it takes.\n    (5) SDK presents frame and waits for end of frame to occur.\n    (6) End of frame occurs at Vsync.\n    (7) App goes back to step 1 and starts rendering the next frame.\n    (8) Scanout starts some time later for frame from step 6.\n    (9) Display panel emits photons some time later for scanout from step 8.\n\n    \"Frame interval\" is the time interval between Vsyncs, whether or not Vsync is on.\n    \"Frame end\" time means the time at which the scanout starts at scanline 0.\n    \"Visible midpoint\" is when the middle scanline is half-visible to the user's eye.\n\n    \"Start of scanout\" is when the hardware begins scanout.  The pixels may not be fully\n    illuminated at this point.  A hardware-specific rise time on the order of a millisecond\n    or two must be added to get photons time.\n\n    All timing is done in units of seconds.\n\n    We approximate the scanline start-end interval with the frame interval.\n*/\n\nnamespace OVR { namespace CAPI {\n\n\n//-----------------------------------------------------------------------------\n// AppTiming\n//\n// This structure provides the measurements for the current app frame.\nstruct AppTiming\n{\n    // When half of the frame image data has been visible to the eye.\n    double VisibleMidpointTime;\n\n    // When the Rift starts scanning out, not including ScreenSwitchingDelay.\n    double ScanoutStartTime;\n\n    // Time between frames.\n    double FrameInterval;\n\n    void Clear()\n    {\n        FrameInterval       = 0.013; // A value that should not break anything.\n        ScanoutStartTime    = 0.; // Predict to current time.\n        VisibleMidpointTime = 0.; // Predict to current time.\n    }\n};\n\n\n//-----------------------------------------------------------------------------\n// TimewarpTiming\n//\n// This structure provides the measurements for the current frame timewarp.\nstruct TimewarpTiming\n{\n    // Time at which scanout is predicted to start.\n    double ScanoutTime;\n\n    // The time when Just-In-Time timewarp should be started.\n    // The app should busy/idle-wait until this time before doing timewarp.\n    double JIT_TimewarpTime;\n\n    // Left and right eye start and end render times, respectively.\n    double EyeStartEndTimes[2][2];\n};\n\n\n//-----------------------------------------------------------------------------\n// LocklessAppTimingBase\n//\n// Base timing info shared via lockless data structure.\n// The AppDistortionTimer can use a copy of this data to derive an AppTiming\n// object for a given frame index.\nstruct LocklessAppTimingBase\n{\n    // Is the data valid?\n    // 0 = Not valid.\n    uint32_t IsValid;\n\n    // Frame index of the last EndFrame() call to update timing.\n    uint32_t LastEndFrameIndex;\n\n    // Frame start time targetted by the last EndFrame() call to update timing.\n    double LastStartFrameTime;\n\n    // Last known Vsync time from distortion timer.\n    double LastKnownVsyncTime;\n\n    // Vsync fuzz factor used to measure uncertainty in timing.\n    double VsyncFuzzFactor;\n\n    // Most updated measurement of the frame interval.\n    double FrameInterval;\n\n    // Scanout delay measured by the builtin latency tester.\n    double ScanoutDelay;\n\n    // Screen switching delay calculated in distortion timer.\n    double ScreenSwitchingDelay;\n};\n\n\n//-----------------------------------------------------------------------------\n// DistortionTimer\n//\n// This is a calculator for the app and timewarp/distortion timing.\nclass DistortionTimer\n{\n    typedef OVR::CAPI::FTM3::FrameTimeManagerCore TimeMan;\n\npublic:\n    DistortionTimer();\n    ~DistortionTimer();\n\n    // Returns false if distortion timing could not be initialized.\n    bool Initialize(HMDRenderState const* renderState,\n                    FrameLatencyTracker const* lagTester);\n    void Reset();\n\n    //-------------------------------------------------------------------------\n    // Timewarp Timing\n\n    // Calculate timing for current frame timewarp.\n    // Result can be retrieved via GetTimewarpTiming().\n    void CalculateTimewarpTiming(uint32_t frameIndex, double previousKnownVsyncTime = 0.);\n\n    // Called after CalculateTimewarpTiming() will retrieve the timewarp\n    // timing for this frame.\n    TimewarpTiming const* GetTimewarpTiming()\n    {\n        return &CurrentFrameTimewarpTiming;\n    }\n\n    // Add a distortion draw call timing measurement.\n    void AddDistortionTimeMeasurement(double distortionTimeSeconds);\n\n    // Returns true if more distortion timing measurements are needed.\n    bool NeedDistortionTimeMeasurement() const\n    {\n        // NOTE: Even when Vsync is off this measurement is still valid and useful.\n        return !DistortionRenderTimes.AtCapacity();\n    }\n\n    // Insert right after spin-wait for Present query to finish for the renderer.\n    void SetLastPresentTime()\n    {\n        // Update vsync time.  This is the post-present time, which is expected to be\n        // after the Vsync has completed and our query event put in after the Present\n        // has indicated that it is signaled.  However this is not reliable.\n        LastPresentTime = Timer::GetSeconds();\n    }\n\n    // Returns the time to use for the current frame for latency tester present time,\n    // which is not the same as the LastPresentTime.\n    double GetLatencyTesterPresentTime() const\n    {\n        return LatencyTesterPresentTime;\n    }\n\n    // Set/get the Timewarp IMU time, which is the time at which the IMU was sampled.\n    void SetTimewarpIMUTime(double t)\n    {\n        LastTimewarpIMUTime = t;\n    }\n\n    double GetTimewarpIMUTime() const\n    {\n        return LastTimewarpIMUTime;\n    }\n\nprotected:\n    // Vsync/no-vsync versions split out for readability.\n    AppTiming getAppTimingWithVsync();\n    AppTiming getAppTimingNoVsync();\n\nprotected:\n    // Last time that Present() was called for post-present latency measurement.\n    // Provided by SetLastPresentTime() cooperatively with the distortion renderer.\n    double LastPresentTime;\n\n    // The time to use for the latency tester for present time, which is the reference\n    // time used for calculating present-scanout delay.\n    double LatencyTesterPresentTime;\n\n    // Last known Vsync time, provided cooperatively by the distortion renderer\n    // via the GetTimewarpTiming() call or internal estimation.\n    double LastKnownVsyncTime;\n\n    // Time in seconds that the Vsync measurement may be in error.\n    // It is assumed to be pretty tight for D3D11 and Display Driver data but for\n    // end frame -based timing we need to add some buffer to avoid misprediction.\n    double LastKnownVsyncFuzzBuffer;\n\n    // The current app frame index, initially zero.\n    uint32_t AppFrameIndex;\n    // Updated in getAppTiming()\n    // Read in CalculateTimewarpTiming()\n\nprotected:\n    // Calculator for the time it takes to render distortion.\n    mutable OVR::CAPI::FTM3::MedianCalculator DistortionRenderTimes;\n\n    // Current estimate for timewarp render time.\n    double EstimatedTimewarpRenderTime;\n\nprotected:\n#ifdef OVR_OS_WIN32\n    ScopedFileHANDLE DeviceHandle;\n\n    // Attempt to use the display driver for getting a previous vsync\n    bool getDriverVsyncTime(double* previousKnownVsyncTime);\n#endif\n\n    // Get Vsync to next Vsync interval.\n    // NOTE: Technically the Vsync-Vsync frame interval is not the same as the scanout\n    // start to end interval because there is a back porch that implies some blanking time\n    double getFrameInterval() const;\n\n    // Get Frame End to Scanout delay.  Measured by DK2 Latency Tester if available.\n    // This works for Vsync on or off.\n    double getScanoutDelay();\n\nprotected:\n    // Update the TimeManager during timewarp calculation\n    void submitDisplayFrame(double frameEndTime, double frameInterval);\n\n    // Update LastKnownVsyncTime.\n    // Pass zero if no Vsync timing information is available.\n    void updateLastKnownVsyncTime(double previousKnownVsyncTime = 0.);\n\n    double getJITTimewarpTime(double frameEndTime);\n\nprotected:\n    // DK2 Latency Tester object\n    FrameLatencyTracker const* LatencyTester;\n\n    // Render state parameters from HMD\n    HMDRenderState const* RenderState;\n\n    // Constant screen switching delay calculated from the shutter info.\n    // This is the time it takes between pixels starting to scan out and\n    // for the visible light to rise to half the expected brightness value.\n    // For OLEDs on the DK2 this is about 1 millisecond.\n    double ScreenSwitchingDelay;\n\n    // Time Manager\n    TimeMan TimeManager;\n\n    // The last predicted vsync time from the previous frame.\n    double LastTimewarpFrameEndTime;\n\n    // Has the timing object already been initialized?\n    bool AlreadyInitialized;\n\nprotected:\n    // Updated by CalculateTimewarpTiming(). \n    TimewarpTiming CurrentFrameTimewarpTiming;\n\n    // Time when sensor was sampled for timewarp pose.\n    double LastTimewarpIMUTime;\n\nprotected:\n    // Lockless data used by application for eye pose timing via the\n    // provided AppDistortionTimer class.\n    LocklessUpdater<LocklessAppTimingBase> LocklessAppTimingBaseUpdater;\n\n    void ClearAppTimingUpdater()\n    {\n        LocklessAppTimingBase cleared = LocklessAppTimingBase();\n        LocklessAppTimingBaseUpdater.SetState(cleared);\n    }\n\npublic:\n    LocklessUpdater<LocklessAppTimingBase>* GetUpdater()\n    {\n        return &LocklessAppTimingBaseUpdater;\n    }\n};\n\n\n// TODO: This header needs to be split up.\n\n\n//-----------------------------------------------------------------------------\n// AppRenderTimer\n//\n// This is an app-side calculator for predicted render times based on frame\n// indices provided by the app.\nclass AppRenderTimer\n{\npublic:\n    AppRenderTimer();\n    ~AppRenderTimer();\n\n    void SetUpdater(LocklessUpdater<LocklessAppTimingBase>* updater)\n    {\n        AppTimingBaseUpdater = updater;\n    }\n\n    bool IsValid() const\n    {\n        return AppTimingBaseUpdater != nullptr;\n    }\n\n    // Returns true on success.\n    // Pass in 0 for frameIndex to use the next scanout time,\n    // or a non-zero incrementing number for each frame to support queue ahead.\n    void GetAppTimingForIndex(AppTiming& result, bool vsyncOn, uint32_t frameIndex = 0);\n\nprotected:\n    LocklessUpdater<LocklessAppTimingBase>* AppTimingBaseUpdater;\n};\n\n\n//-----------------------------------------------------------------------------\n// AppTimingHistory\n//\n// Keep a history of recent application render timing data, to keep a record of\n// when frame indices are expected to scanout.  This is used later to compare\n// with when those frames scan out to self-test the timing code.\n//\n// This class is not thread-safe.\nclass AppTimingHistory\n{\npublic:\n    AppTimingHistory();\n    ~AppTimingHistory();\n\n    void Clear();\n    void SetScanoutTimeForFrame(uint32_t frameIndex, double scanoutTime);\n\n    // Returns 0.0 if not found.\n    double LookupScanoutTime(uint32_t frameIndex);\n\nprotected:\n    static const int kFramesMax = 8;\n\n    struct Record\n    {\n        uint32_t FrameIndex;\n        double   ScanoutTime;\n    };\n\n    int    LastWriteIndex;\n    Record History[kFramesMax];\n};\n\n\n}} // namespace OVR::CAPI\n\n#endif // OVR_CAPI_DistortionTiming_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/CAPI_FrameLatencyTracker.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_FrameLatencyTracker.cpp\nContent     :   DK2 Latency Tester implementation\nCreated     :   Dec 12, 2013\nAuthors     :   Volga Aksoy, Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_FrameLatencyTracker.h\"\n#include \"Kernel/OVR_Log.h\"\n\nnamespace OVR { namespace CAPI {\n\n\n// Number of frame delta samples to include in the median calculation.\nstatic const int kFrameDeltaSamples = 12;\n\n\n//-------------------------------------------------------------------------------------\n// ***** FrameLatencyTracker\n\nFrameLatencyTracker::FrameLatencyTracker() :\n    FrameDeltas(kFrameDeltaSamples)\n{\n    Reset();\n}\n\nvoid FrameLatencyTracker::Reset()\n{\n    TrackerEnabled         = true;\n    WaitMode               = SampleWait_Zeroes;\n    MatchCount             = 0;\n    memset(History, 0, sizeof(History));\n    FrameIndex             = 0;\n    LatencyRecordTime      = 0.0;\n\n    OutputTimings.Clear();\n\n    FrameDeltas.Clear();\n}\n\nunsigned char FrameLatencyTracker::GetNextDrawColor()\n{   \n    if (!TrackerEnabled || (WaitMode == SampleWait_Zeroes) ||\n        (FrameIndex >= FramesTracked))\n    {        \n        return (unsigned char)Util::FrameTimeRecord::ReadbackIndexToColor(0);\n    }\n\n    OVR_ASSERT(FrameIndex < FramesTracked);    \n    return (unsigned char)Util::FrameTimeRecord::ReadbackIndexToColor(FrameIndex+1);\n}\n\nvoid FrameLatencyTracker::SaveDrawColor(FrameLatencyData const & data)\n{\n    if (!TrackerEnabled || (WaitMode == SampleWait_Zeroes))\n        return;\n\n    if (FrameIndex < FramesTracked)\n    {\n        OVR_ASSERT(Util::FrameTimeRecord::ReadbackIndexToColor(FrameIndex + 1) == data.DrawColor);\n\n        // FrameTimeRecord data\n        History[FrameIndex].ReadbackIndex = FrameIndex + 1;\n        History[FrameIndex].TimeSeconds   = data.PresentTime;\n\n        // FrameTimeRecordEx data\n        History[FrameIndex].MatchedRecord = false;\n        History[FrameIndex].FrameData     = data;\n\n        FrameIndex++;\n    }\n    else\n    {\n        // If the request was outstanding for too long, switch to zero mode to restart.\n        if (data.PresentTime > (History[FrameIndex-1].TimeSeconds + 0.15))\n        {\n            if (MatchCount == 0)\n            {\n                OutputTimings.Clear();\n            }\n\n            WaitMode   = SampleWait_Zeroes;\n            MatchCount = 0;\n            FrameIndex = 0;\n        }\n    }\n}\n\nvoid FrameLatencyTracker::onRecordMatch(FrameTimeRecordEx& renderFrame,\n                                        Util::FrameTimeRecord const& scanoutFrame)\n{\n    MatchCount++;\n\n    double deltaSeconds = scanoutFrame.TimeSeconds - renderFrame.TimeSeconds;\n\n    // Reject latencies longer than 100 ms\n    // This can happen in transient situations like dragging the render window around,\n    // and since some critical systems depend on this latency data to provide steady-state\n    // statistics for prediction purposes these outliers should not dirty the data.\n    if (deltaSeconds < 0.1)\n    {\n        if (deltaSeconds < 0.)\n        {\n            deltaSeconds = 0.;\n        }\n\n        FrameDeltas.Add(deltaSeconds);\n    }\n\n    LatencyRecordTime = scanoutFrame.TimeSeconds;\n    OutputTimings.LatencyRender = scanoutFrame.TimeSeconds - renderFrame.FrameData.RenderIMUTime;\n    OutputTimings.LatencyTimewarp = (renderFrame.FrameData.TimewarpIMUTime == 0.0) ? 0.0 :\n        (scanoutFrame.TimeSeconds - renderFrame.FrameData.TimewarpIMUTime);\n    OutputTimings.ErrorRender = scanoutFrame.TimeSeconds - renderFrame.FrameData.RenderPredictedScanoutTime;\n    OutputTimings.ErrorTimewarp = scanoutFrame.TimeSeconds - renderFrame.FrameData.TimewarpPredictedScanoutTime;\n}\n\nvoid FrameLatencyTracker::MatchRecord(Util::FrameTimeRecordSet const & r)\n{\n    if (!TrackerEnabled)\n        return;\n\n    if (WaitMode == SampleWait_Zeroes)\n    {\n        // Do we have all zeros?\n        if (r.IsAllZeroes())\n        {\n            OVR_ASSERT(FrameIndex == 0);\n            WaitMode   = SampleWait_Match;\n            MatchCount = 0;\n        }\n        return;\n    }\n\n    // We are in Match Mode. Wait until all colors are matched or timeout,\n    // at which point we go back to zeros.\n\n    for (int i = 0; i < FrameIndex; i++)\n    {\n        int recordIndex      = 0;\n        int consecutiveMatch = 0;\n\n        OVR_ASSERT(History[i].ReadbackIndex != 0);\n\n        if (r.FindReadbackIndex(&recordIndex, History[i].ReadbackIndex))\n        {\n            // Advance forward to see that we have several more matches.\n            int  ri = recordIndex + 1;\n            int  j  = i + 1;\n\n            consecutiveMatch++;\n\n            for (; (j < FrameIndex) && (ri < Util::FrameTimeRecordSet::RecordCount); j++, ri++)\n            {\n                if (r[ri].ReadbackIndex != History[j].ReadbackIndex)\n                    break;\n                consecutiveMatch++;\n            }\n\n            // Match at least 2 items in the row, to avoid accidentally matching color.\n            if (consecutiveMatch > 1)\n            {\n                // Record latency values for all but last samples. Keep last 2 samples\n                // for the future to simplify matching.\n                for (int q = 0; q < consecutiveMatch; q++)\n                {\n                    const Util::FrameTimeRecord &scanoutFrame = r[recordIndex+q];\n                    FrameTimeRecordEx           &renderFrame  = History[i+q];\n                    \n                    if (!renderFrame.MatchedRecord)\n                    {\n                        renderFrame.MatchedRecord = true;\n\n                        onRecordMatch(renderFrame, scanoutFrame);\n                    }\n                }\n\n                // Exit for.\n                break;\n            }\n        }\n    } // for ( i => FrameIndex )\n\n    // If we matched all frames, start over.\n    if (MatchCount == FramesTracked)\n    {\n        WaitMode   = SampleWait_Zeroes;\n        MatchCount = 0;\n        FrameIndex = 0;\n    }\n}\n\nbool FrameLatencyTracker::IsLatencyTimingAvailable()\n{\n    return ovr_GetTimeInSeconds() < (LatencyRecordTime + 2.0);\n}\n\nvoid FrameLatencyTracker::GetLatencyTimings(OutputLatencyTimings& timings)\n{\n    if (!IsLatencyTimingAvailable())\n    {\n        timings.Clear();\n        return;\n    }\n\n    timings = OutputTimings;\n    timings.LatencyPostPresent = FrameDeltas.GetMedian();\n}\n\nbool FrameLatencyTracker::GetVsyncToScanout(double& vsyncToScanoutTime) const\n{\n    if (FrameDeltas.GetCount() <= 3)\n    {\n        return false;\n    }\n\n    double medianDelta = FrameDeltas.GetMedian();\n\n    // Sanity check the result\n    static const double SmallestAcceptedDelta = -0.0020; // -20 ms\n    static const double LargestAcceptedDelta  =  0.060;  // 60 ms\n\n    if ((medianDelta < SmallestAcceptedDelta) ||\n        (medianDelta > LargestAcceptedDelta))\n    {\n        return false;\n    }\n\n    vsyncToScanoutTime = medianDelta;\n    return true;\n}\n\n\n}} // namespace OVR::CAPI\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/CAPI_FrameLatencyTracker.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_FrameLatencyTracker.h\nContent     :   DK2 Latency Tester implementation\nCreated     :   Dec 12, 2013\nAuthors     :   Volga Aksoy, Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_FrameLatencyTracker_h\n#define OVR_CAPI_FrameLatencyTracker_h\n\n#include <OVR_CAPI.h>\n#include <Kernel/OVR_Timer.h>\n#include <Extras/OVR_Math.h>\n#include <Util/Util_Render_Stereo.h>\n#include \"CAPI_FrameTimeManager3.h\"\n\nnamespace OVR { namespace CAPI {\n\n\n//-------------------------------------------------------------------------------------\n// ***** FrameLatencyData\n\n// This structure contains the timing data for each frame that is tracked by the\n// latency tester.\n\nstruct FrameLatencyData\n{\n    uint8_t DrawColor;           // Red channel color value drawn for the latency tester quad for this frame\n    double PresentTime;          // (seconds) Time at which Vsync/Present occurred\n    double RenderIMUTime;        // (seconds) Time when hardware sensors were sampled for render pose\n    double TimewarpIMUTime;      // (seconds) Time when hardware sensors were sampled for timewarp pose\n\n    double TimewarpPredictedScanoutTime; // (seconds) Time at which we expected scanout to start at timewarp time\n    double RenderPredictedScanoutTime;   // (seconds) Time at which we expected scanout to start at render time\n};\n\n\n//-------------------------------------------------------------------------------------\n// ***** OutputLatencyTimings\n\n// Latency timings returned to the application.\n\nstruct OutputLatencyTimings\n{\n    double LatencyRender;       // (seconds) Last time between render IMU sample and scanout\n    double LatencyTimewarp;     // (seconds) Last time between timewarp IMU sample and scanout\n    double LatencyPostPresent;  // (seconds) Average time between Vsync and scanout\n    double ErrorRender;         // (seconds) Last error in render predicted scanout time\n    double ErrorTimewarp;       // (seconds) Last error in timewarp predicted scanout time\n\n    void Clear()\n    {\n        LatencyRender      = 0.;\n        LatencyTimewarp    = 0.;\n        LatencyPostPresent = 0.;\n        ErrorRender        = 0.;\n        ErrorTimewarp      = 0.;\n    }\n};\n\n\n//-------------------------------------------------------------------------------------\n// ***** FrameLatencyTracker\n\n// FrameLatencyTracker tracks frame Present to display Scan-out timing, as reported by\n// the DK2 internal latency tester pixel read-back. The computed value is used in\n// FrameTimeManager for prediction. View Render and TimeWarp to scan-out latencies are\n// also reported for debugging.\n//\n// The class operates by generating color values from GetNextDrawColor() that must\n// be rendered on the back end and then looking for matching values in FrameTimeRecordSet\n// structure as reported by HW.\n\nclass FrameLatencyTracker\n{\npublic:\n    enum { FramesTracked = Util::LT2_IncrementCount-1 };\n\n    FrameLatencyTracker();\n\n    // DrawColor == 0 is special in that it doesn't need saving of timestamp\n    unsigned char GetNextDrawColor();\n\n    void SaveDrawColor(FrameLatencyData const & data);\n\n    void MatchRecord(Util::FrameTimeRecordSet const & r);\n\n    bool IsLatencyTimingAvailable();\n    void GetLatencyTimings(OutputLatencyTimings& timings);\n\n    // Returns time between vsync and scanout in seconds as measured by DK2 latency tester.\n    // Returns false if measurements are unavailable.\n    bool GetVsyncToScanout(double& vsyncToScanoutTime) const;\n\n    void Reset();\n\nprotected:\n    struct FrameTimeRecordEx : public Util::FrameTimeRecord\n    {\n        bool             MatchedRecord;\n        FrameLatencyData FrameData;\n    };\n\n    void onRecordMatch(FrameTimeRecordEx& renderFrame,\n                       Util::FrameTimeRecord const& scanoutFrame);\n\n    // True if rendering read-back is enabled.\n    bool                  TrackerEnabled;\n\n    enum SampleWaitType\n    {\n        SampleWait_Zeroes, // We are waiting for a record with all zeros.\n        SampleWait_Match   // We are issuing & matching colors.\n    };\n    \n    SampleWaitType        WaitMode;\n    int                   MatchCount;\n    // Records of frame timings that we are trying to measure.\n    FrameTimeRecordEx     History[FramesTracked];\n    int                   FrameIndex;\n    // Median filter for (ScanoutTimeSeconds - PostPresent frame time)\n    mutable OVR::CAPI::FTM3::MedianCalculator FrameDeltas;\n    double                LatencyRecordTime;\n\n    // Latency reporting results\n    OutputLatencyTimings  OutputTimings;\n};\n\n\n}} // namespace OVR::CAPI\n\n#endif // OVR_CAPI_FrameLatencyTracker_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/CAPI_FrameTimeManager3.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_FrameTimeManager3.cpp\nContent     :   Manage frame timing and pose prediction for rendering\nCreated     :   November 30, 2013\nAuthors     :   Volga Aksoy, Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, Inc. All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_FrameTimeManager3.h\"\n\n#include \"Kernel/OVR_Log.h\"\n\n//#include <dxgi.h>\n\nnamespace OVR { namespace CAPI { namespace FTM3 {\n\n\n// Number of frame delta samples to include in the median calculation.\nstatic const int kFrameDeltaSamples = 12;\n\n\nvoid LogTime(const char* msg)\n{\n    static double lastTime = 0.0;\n    double now = ovr_GetTimeInSeconds();\n\n    LogText(\"t=%.3f, dt=%.3f: %s\\n\", now, now-lastTime, msg);\n    lastTime = now;\n}\n    \n\n//-------------------------------------------------------------------------------------\n\nFrameTimeManagerCore::FrameTimeManagerCore(bool vsyncEnabled) :\n    VsyncEnabled(vsyncEnabled),    \n    LastTiming(),\n    FrameTimeDeltas(kFrameDeltaSamples)\n{            \n}\n\nvoid FrameTimeManagerCore::Initialize(const Timing& defaultTiming)\n{\n    // Contains default frame delta and indices.\n    //   - TBD determine how those are initialized\n    //  \n    FrameTimeDeltas.Clear();\n    FrameIndices.Reset();\n\n    LastTiming        = defaultTiming;\n    DefaultFrameDelta = defaultTiming.FrameDelta;\n    \n    LocklessTiming.SetState(LastTiming);\n}\n\n\nFrameTimeManagerCore::Timing FrameTimeManagerCore::GetAppFrameTiming(unsigned appFrameIndex)\n{    \n    // Right now this is required for timing.\n\n    Timing timing = LocklessTiming.GetState();\n\n    // TBD: We need AppFrameIndex and DisplayIndex initialized before this is called.\n\n    OVR_ASSERT(appFrameIndex == 0 || appFrameIndex == timing.AppFrameIndex + 1);\n\n    if (appFrameIndex > timing.AppFrameIndex)\n    {\n        int      appFrameDelta = appFrameIndex - timing.AppFrameIndex;\n\n        // Don't run away too far into the future beyond rendering.\n     //   OVR_ASSERT(appFrameDelta < 6);\n\n        // Convert to display frames. If we have one-to-one frame sync, appFrameDelta\n        // will be 1.0, so this will give us a correct frame value.\n        int      displayFrame          = timing.DisplayFrameIndex +\n                                         (int) (appFrameDelta * ( 1.0 / timing.AppToDisplayFrameRatio));\n   \n        double  prevFrameSubmitSeconds = (timing.FrameSubmitSeconds == 0.0) ?\n                                         ovr_GetTimeInSeconds() : timing.FrameSubmitSeconds;\n\n        double  displayFrameSubmitTime = prevFrameSubmitSeconds +\n                                          double(displayFrame-timing.DisplayFrameIndex) *\n                                          timing.FrameDelta;\n\n        // Initialize to new values.\n        timing.AppFrameIndex      = appFrameIndex;\n        timing.DisplayFrameIndex  = displayFrame;\n        timing.FrameSubmitSeconds = displayFrameSubmitTime;\n    }    \n\n    return timing;\n}\n\n\n// Next:  GetDisplayFrameTiming - used for timewarp and late-latching\n//\nFrameTimeManagerCore::Timing FrameTimeManagerCore::GetDisplayFrameTiming(unsigned displayFrameIndex)\n{\n    // Thus assumes caller has checked the 'displayFrameIndex' agains the current\n    // clock/vsync and this is the actual desired value.\n        \n    // TBD: Should we use Lockless here? It depends if we plan to access this form different threads.\n    Timing timing = LastTiming;\n\n    if (displayFrameIndex > timing.DisplayFrameIndex)\n    {\n        double  prevFrameSubmitSeconds = (timing.FrameSubmitSeconds == 0.0) ?\n                                         ovr_GetTimeInSeconds() : timing.FrameSubmitSeconds;\n\n        // Initialize to new values.\n        timing.FrameSubmitSeconds =  prevFrameSubmitSeconds +\n                                          double(displayFrameIndex - timing.DisplayFrameIndex) *\n                                          timing.FrameDelta;\n        timing.DisplayFrameIndex  = displayFrameIndex;\n\n        // Last submitted AppFrameIndex is ok.\n    }\n\n    return timing;\n}\n\n\nvoid FrameTimeManagerCore::SubmitDisplayFrame( unsigned displayFrameIndex,\n                                               unsigned appFrameIndex,\n                                               double scanoutStartSeconds )\n{\n    int displayFrameDelta = (displayFrameIndex - LastTiming.DisplayFrameIndex);\n\n    // FIXME: Add queue ahead support here by detecting two frames targeting the same scanout.\n\n    // Update frameDelta tracking.\n    if ((LastTiming.FrameSubmitSeconds > 0.0) && (displayFrameDelta < 2))\n    {\n        if (displayFrameDelta > 0)\n        {\n            double thisFrameDelta = (scanoutStartSeconds - LastTiming.FrameSubmitSeconds) / displayFrameDelta;\n            FrameTimeDeltas.Add(thisFrameDelta);\n        }\n        LastTiming.FrameDelta = calcFrameDelta();\n    }\n\n    // Update indices mapping\n    FrameIndices.Add(displayFrameIndex, appFrameIndex);\n\n    LastTiming.AppFrameIndex          = appFrameIndex;\n    LastTiming.DisplayFrameIndex      = displayFrameIndex;\n    LastTiming.FrameSubmitSeconds     = scanoutStartSeconds;\n    LastTiming.AppToDisplayFrameRatio = FrameIndices.GetAppToDisplayFrameRatio();\n\n    // Update Lockless\n    LocklessTiming.SetState(LastTiming);\n}\n\n\n\ndouble  FrameTimeManagerCore::calcFrameDelta() const\n{\n    // Timing difference between frame is tracked by FrameTimeDeltas, or\n    // is a hard-coded value of 1/FrameRate.\n    double  frameDelta;    \n\n    if (!VsyncEnabled)\n    {\n        frameDelta = 0.0;\n    }\n    else if (FrameTimeDeltas.GetCount() > 3)\n    {\n        frameDelta = FrameTimeDeltas.GetMedian();\n        if (frameDelta > (DefaultFrameDelta + 0.001))\n            frameDelta = DefaultFrameDelta;\n    }\n    else\n    {\n        frameDelta = DefaultFrameDelta;\n    }\n\n    return frameDelta;\n}\n\n\n\n/*\n\n// *****  Support code\n\nstruct FrameStatisticsSampler\n{\n\n    FrameStatisticsSampler(IDXGISwapChain* swapChain, double frameDelta);\n\n    DXGI_FRAME_STATISTICS FStats;\n    double                LastReportedFrameSeconds;\n    unsigned              CurrentDisplayFrameIndex;\n    unsigned              CurrentFrameScanoutSeconds;\n};\n\nFrameStatisticsSampler::FrameStatisticsSampler(IDXGISwapChain* swapChain, double frameDelta)\n{\n    swapChain->GetFrameStatistics(&FStats);\n\n    UINT lastReportedFrameIndex = FStats.SyncRefreshCount;\n    LastReportedFrameSeconds    = Timer::GetSecondsFromOSTicks(FStats.SyncQPCTime.QuadPart);\n\n    double currentSeconds = ovr_GetTimeInSeconds();\n    \n    // Determine what frame we are currently scanning out and when it started.\n    // This will be a part of input for FrameTimeManager...\n    CurrentDisplayFrameIndex   = lastReportedFrameIndex +\n                                  (unsigned)((currentSeconds - LastReportedFrameSeconds) / frameDelta);\n    CurrentFrameScanoutSeconds = LastReportedFrameSeconds + \n                                  (CurrentDisplayFrameIndex - lastReportedFrameIndex) * frameDelta;\n}\n\n\n// Default, initial frame timing\nFrameTimeManagerCore::Timing GetDefaultTiming(unsigned appFrameIndex,\n                                              IDXGISwapChain* swapChain, const HmdRenderInfo& hri)\n{\n    FrameStatisticsSampler       fstats(swapChain, hri.Shutter.VsyncToNextVsync);\n    FrameTimeManagerCore::Timing t;\n\n    t.FrameDelta             = hri.Shutter.VsyncToNextVsync;\n    t.AppFrameIndex          = appFrameIndex;\n    t.DisplayFrameIndex      = fstats.CurrentDisplayFrameIndex;\n    t.FrameSubmitSeconds     = fstats.CurrentFrameScanoutSeconds;\n    t.AppToDisplayFrameRatio = 1.0;\n\n    return t;\n}\n\n\nvoid InitializeFrame()\n{\n    FrameStatisticsSampler  fstats(pswapChain, ftm->GetFrameDelta());\n\n    unsigned DisplayFrameIndex;\n    //= FI(clock) + 1;\n}\n\n\n\nvoid UpdateFrame()\n{\n    IDXGISwapChain*       pswapChain = 0; // TBD: Pass argument\n    FrameTimeManagerCore* ftm = 0;\n\n    FrameStatisticsSampler  fstats(pswapChain, ftm->GetFrameDelta());    \n\n    // Note that for rendering, there is actually a separate DisplayFrameIndex to think about.\n    \n    // Target 'Display FrameIndex' for next frame. Fix-up if the clock avanced too much.\n    DisplayFrameIndex++;\n    if (fstats.CurrentDisplayFrameIndex >= DisplayFrameIndex)\n        DisplayFrameIndex = fstats.CurrentDisplayFrameIndex + 1;\n\n    GetDisplayFrameTiming(DisplayFrameIndex);\n    \n}\n\nFrameTimeManagerCore::ScanoutTimes::ScanoutTimes(\n            const TimingInputs& inputs, \n            double frameSubmitSeconds, HmdShutterTypeEnum shutterType)\n{\n    double  frameDelta = inputs.FrameDelta;\n\n    ScanoutStartSeconds    = frameSubmitSeconds + inputs.ScreenDelay;\n    ScanoutMidpointSeconds = ScanoutStartSeconds + frameDelta * 0.5;\n\n    //...   \n}\n*/\n\n\n//-----------------------------------------------------------------------------------\n// MedianCalculator\n\nMedianCalculator::MedianCalculator(int capacity) :\n    Capacity(capacity)\n{\n    Data.Resize(Capacity);\n    SortBuffer.Resize(Capacity);\n\n    Clear();\n}\n\nvoid MedianCalculator::Clear()\n{\n    MinValue = 0.;\n    MaxValue = 0.;\n    MeanValue = 0.;\n    MedianValue = 0.;\n    Index = 0;\n    DataCount = 0;\n    Recalculate = false;\n}\n\nvoid MedianCalculator::Add(double datum)\n{\n    // Write next datum\n    Data[Index] = datum;\n\n    // Loop circular buffer index around\n    if (++Index >= Capacity)\n    {\n        Index = 0;\n    }\n\n    // Update data count\n    if (!AtCapacity())\n    {\n        // Limited to capacity\n        ++DataCount;\n    }\n\n    // Mark as dirty\n    Recalculate = true;\n}\n\ndouble MedianCalculator::GetMedian()\n{\n    if (Recalculate)\n    {\n        doRecalculate();\n    }\n\n    return MedianValue;\n}\n\nbool MedianCalculator::GetStats(double& minValue, double& maxValue,\n                                double& meanValue, double& medianValue)\n{\n    if (GetCount() <= 0)\n    {\n        // Cannot get statistics without one data point.\n        return false;\n    }\n\n    if (Recalculate)\n    {\n        doRecalculate();\n    }\n\n    minValue = MinValue;\n    maxValue = MaxValue;\n    meanValue = MeanValue;\n    medianValue = MedianValue;\n    return true;\n}\n\n/*\n    quick_select()\n\n    Calculates the median.\n\n    This Quickselect routine is based on the algorithm described in\n\t\"Numerical recipes in C\", Second Edition,\n\tCambridge University Press, 1992, Section 8.5, ISBN 0-521-43108-5\n\tThis code by Nicolas Devillard - 1998. Public domain.\n*/\n\n#define ELEM_SWAP(a,b) {double t=(a);(a)=(b);(b)=t; }\n\nstatic double quick_select(double arr[], int n)\n{\n\tint low, high ;\n\tint median;\n\tint middle, ll, hh;\n\tlow = 0 ; high = n-1 ; median = (low + high) / 2;\n\tfor (;;) {\n\t\tif (high <= low) /* One element only */\n\t\t\treturn arr[median] ;\n\t\tif (high == low + 1) { /* Two elements only */\n\t\t\tif (arr[low] > arr[high])\n\t\t\t\tELEM_SWAP(arr[low], arr[high]) ;\n\t\t\treturn arr[median] ;\n\t\t}\n\t\t/* Find median of low, middle and high items; swap into position low */\n\t\tmiddle = (low + high) / 2;\n\t\tif (arr[middle] > arr[high]) ELEM_SWAP(arr[middle], arr[high]) ;\n\t\tif (arr[low] > arr[high]) ELEM_SWAP(arr[low], arr[high]) ;\n\t\tif (arr[middle] > arr[low]) ELEM_SWAP(arr[middle], arr[low]) ;\n\t\t/* Swap low item (now in position middle) into position (low+1) */\n\t\tELEM_SWAP(arr[middle], arr[low+1]) ;\n\t\t/* Nibble from each end towards middle, swapping items when stuck */\n\t\tll = low + 1;\n\t\thh = high;\n\t\tfor (;;) {\n\t\t\tdo ll++; while (arr[low] > arr[ll]) ;\n\t\t\tdo hh--; while (arr[hh] > arr[low]) ;\n\t\t\tif (hh < ll)\n\t\t\t\tbreak;\n\t\t\tELEM_SWAP(arr[ll], arr[hh]) ;\n\t\t}\n\t\t/* Swap middle item (in position low) back into correct position */\n\t\tELEM_SWAP(arr[low], arr[hh]) ;\n\t\t/* Re-set active partition */\n\t\tif (hh <= median)\n\t\t\tlow = ll;\n\t\tif (hh >= median)\n\t\t\thigh = hh - 1;\n\t}\n}\n#undef ELEM_SWAP\n    \nvoid MedianCalculator::doRecalculate()\n{\n    Recalculate = false;\n\n    // Set default result\n    MinValue = 0.;\n    MaxValue = 0.;\n    MeanValue = 0.;\n    MedianValue = 0.;\n\n    // Calculate median\n    const int count = GetCount();\n    for (int i = 0; i < count; ++i)\n        SortBuffer[i] = Data[i];\n    MedianValue = quick_select(&SortBuffer[0], count);\n\n    double minValue = Data[0], maxValue = Data[0], sumValue = Data[0];\n\n    for (int i = 1; i < count; ++i)\n    {\n        double value = Data[i];\n\n        if (value < minValue)\n        {\n            minValue = value;\n        }\n\n        if (value > maxValue)\n        {\n            maxValue = value;\n        }\n\n        sumValue += value;\n    }\n\n    MinValue = minValue;\n    MaxValue = maxValue;\n    MeanValue = sumValue / count;\n\n    OVR_ASSERT(MinValue <= MeanValue && MeanValue <= MaxValue);\n    OVR_ASSERT(MinValue <= MedianValue && MedianValue <= MaxValue);\n}\n\n\n//-----------------------------------------------------------------------------------\n// ***** FrameIndexMapper\n\nvoid FrameIndexMapper::Add(unsigned displayFrameIndex, unsigned appFrameIndex)\n{\n    // Circular buffer; fill up then overwrite tail\n    if (Count == Capacity)\n    {\n        DisplayFrameIndices[StartIndex] = displayFrameIndex;\n        AppFrameIndices[StartIndex]     = appFrameIndex;\n        StartIndex++;\n        if (StartIndex == Count)\n            StartIndex = 0;\n    }\n    else\n    {\n        OVR_ASSERT(StartIndex == 0);\n        DisplayFrameIndices[Count] = displayFrameIndex;\n        AppFrameIndices[Count]     = appFrameIndex;\n        Count++;\n    }\n}\n\ndouble FrameIndexMapper::GetAppToDisplayFrameRatio() const\n{\n    // Default ratio is one-to-one. Do aggressive clamping since we\n    // don't want ratio to go too low since we can't predict that far anyway.\n    if (Count < 3)\n        return 1.0;\n\n    unsigned newestIndex = StartIndex + Count - 1;\n    if (newestIndex >= Capacity)\n        newestIndex -= Capacity;\n\n    unsigned displayDelta = DisplayFrameIndices[newestIndex] - DisplayFrameIndices[StartIndex];\n    unsigned appDelta     = AppFrameIndices[newestIndex] - AppFrameIndices[StartIndex];\n\n    if (displayDelta < 2)\n        return 1.0f;\n\n    double  frameRatio = double(appDelta) / double(displayDelta);\n    if (frameRatio < 0.33f)\n        return 0.33f;\n\n    return frameRatio;\n}\n\n\n\n}}} // namespace OVR::CAPI::FTM2\n\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/CAPI_FrameTimeManager3.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_FrameTimeManager3.h\nContent     :   Manage frame timing and pose prediction for rendering\nCreated     :   November 30, 2013\nAuthors     :   Volga Aksoy, Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, Inc. All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_FrameTimeManager3_h\n#define OVR_CAPI_FrameTimeManager3_h\n\n#include <OVR_CAPI.h>\n#include <Kernel/OVR_Timer.h>\n#include <Extras/OVR_Math.h>\n#include <Util/Util_Render_Stereo.h>\n\nnamespace OVR { namespace CAPI { namespace FTM3 {\n\nvoid LogTime(const char* msg);\n\n\n//-------------------------------------------------------------------------------------\n// MedianCalculator\n//\n// Helper class to calculate statistics\nclass MedianCalculator\n{\npublic:\n    MedianCalculator(int capacity);\n\n    void    Clear();\n\n    // This function throws away data larger than 100 milliseconds,\n    // and it sanitizes negative time deltas replacing them with zero milliseconds.\n    void    Add(double timeDelta);\n\n    int     GetCount() const\n    {\n        return DataCount;\n    }\n    int     GetCapacity() const\n    {\n        return Capacity;\n    }\n    bool    AtCapacity() const\n    {\n        return DataCount >= Capacity;\n    }\n\n    double  GetMedian();\n    bool    GetStats(double& minValue, double& maxValue,\n        double& meanValue, double& medianValue);\n\nprivate:\n    Array<double> Data;\n    Array<double> SortBuffer; // Buffer for quick select algorithm\n\n    double MinValue, MaxValue, MeanValue, MedianValue;\n\n    int    Index;\n    int    DataCount, Capacity;\n    bool   Recalculate;\n\n    // Precondition: Count > 0\n    void doRecalculate();\n};\n\n\n// Helper used to compute AddFrameIndex to DisplayFrameIndex ratio, by tracking\n// how much each has advanced over the recent frames.\nstruct FrameIndexMapper\n{\n    enum { Capacity = 12 };\n\n    // Circular buffer starting with StartIndex\n    unsigned    DisplayFrameIndices[Capacity];\n    unsigned    AppFrameIndices[Capacity];\n    unsigned    StartIndex;\n    unsigned    Count;\n\n    FrameIndexMapper() : StartIndex(0), Count(0) { }\n\n    void Reset()\n    { StartIndex = Count = 0; }\n\n    void    Add(unsigned displayFrameIndex, unsigned appFrameIndex);\n   \n    double  GetAppToDisplayFrameRatio() const;\n};\n\n\n//-------------------------------------------------------------------------------------\n// ***** FrameTimeManagerCore\n\n// FrameTimeManager keeps track of rendered frame timing needed for predictions for\n// orientations and time-warp.\n//\n//  The following items are not in Core for now\n//\n//      - TimewarpWaitDelta (how many seconds before EndFrame we start timewarp)\n//         this should be handled externally.\n//\n//      - ScreenDelay (Screen delay from present to scan-out, as potentially reported by ScreenLatencyTracker.)\n//           this si rendering setup and HW specific\n//\n//      - TimeWarpStartEndTimes  (move matrices logic outside for now)\n//\n//      - For now, always assume VSync on\n\n\nclass FrameTimeManagerCore\n{\npublic:\n\n    // Describes last presented frame data.\n    struct Timing\n    {\n        // Hard-coded value or dynamic as reported by FrameTimeDeltas.GetMedianTimeDelta().\n        double          FrameDelta;\n\n        // Application frame index for which we requested timing.\n        unsigned        AppFrameIndex;\n        // HW frame index that we expect this will hit, the specified\n        // frame will start scan-out at ScanoutStartSeconds. Monotonically increasing.\n        unsigned        DisplayFrameIndex;\n\n        // PostPresent & Flush (old approach) or reported scan-out time (new HW-reported approach).\n        double          FrameSubmitSeconds;\n\n        // Ratio of (AppFrames/DisplayFrames) in\n        double          AppToDisplayFrameRatio;\n\n        Timing()\n        {\n            memset(this, 0, sizeof(Timing));\n        }\n\n    };\n\npublic:\n\n    FrameTimeManagerCore(bool vsyncEnabled);\n\n    // Called on startup to provided data on HMD timing.  DefayltTiming should include FrameDelta\n    // and other default values. This can also be called to reset timing.\n    void    Initialize(const Timing& defaultTiming);\n\n    // Returns frame timing data for any thread to access, including\n    //   - Simulating thread that may be running ahead\n    //   - Rendering thread, which would treat as BeginFrame data\n    Timing GetAppFrameTiming(unsigned appFrameIndex);\n\n    // Returns frame timing values for a particular DisplayFrameIndex.\n    //  Maintaining DisplayFrameIndex is the job of the caller, as it may be fied to OS\n    //  VSync frame reporting functionality ad/or system clock.\n    Timing GetDisplayFrameTiming(unsigned displayFrameIndex);\n\n    // To be called from TW Thread when displayFrame has been submitted for present.\n    // This call is used to update lock-less timing frame basis. The provided\n    // values do the following:\n    //  - Establish relationship between App and Display frame index.\n    //  - Track the real frameDelta (difference between VSyncs)\n    void    SubmitDisplayFrame(unsigned displayFrameIndex, \n                               unsigned appFrameIndex, \n                               double scanoutStartSeconds);\n\n    unsigned GetLastDisplayFrameIndex() const\n    {\n        return LastTiming.DisplayFrameIndex;\n    }\n    double GetLastDisplayFrameTime() const\n    {\n        return LastTiming.FrameSubmitSeconds;\n    }\n\n    double  GetFrameDelta() const\n    {\n        return calcFrameDelta();\n    }\n\n    void    SetVsync(bool enabled) { VsyncEnabled = enabled; }\n\n    // ovrFrameTiming ovrFrameTimingFromTiming(const Timing& timing) const;\n   \nprivate:\n    \n    double      calcFrameDelta() const;\n    \n\n    // Timing changes if we have no Vsync (all prediction is reduced to fixed interval).\n    bool        VsyncEnabled;\n    // Default VsyncToVSync value, received in Initialize.\n    double      DefaultFrameDelta;    \n    // Last timing \n    Timing      LastTiming;\n\n    // Current (or last) frame timing info. Used as a source for LocklessTiming.\n    LocklessUpdater<Timing, Timing> LocklessTiming;\n\n    // Timings are collected through a median filter, to avoid outliers.\n    mutable MedianCalculator        FrameTimeDeltas;\n    // Associates AppFrameIndex <-> \n    FrameIndexMapper                FrameIndices;\n    \n};\n\n\n}}} // namespace OVR::CAPI::FTM3\n\n#endif // OVR_CAPI_FrameTimeManager_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/CAPI_HMDRenderState.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_CAPI_HMDRenderState.cpp\nContent     :   Combines all of the rendering state associated with the HMD\nCreated     :   February 2, 2014\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_HMDRenderState.h\"\n\n\nnamespace OVR { namespace CAPI {\n\n\n//-------------------------------------------------------------------------------------\n// ***** HMDRenderState\n\novrHmdDesc HMDRenderState::GetDesc() const\n{\n    ovrHmdDesc d;\n    memset(&d, 0, sizeof(d));\n    \n    d.Type = ovrHmd_Other;\n    \n    d.ProductName       = OurHMDInfo.ProductName;    \n    d.Manufacturer      = OurHMDInfo.Manufacturer;\n\n    d.Resolution.w      = OurHMDInfo.ResolutionInPixels.w;\n    d.Resolution.h      = OurHMDInfo.ResolutionInPixels.h;\n    d.WindowsPos.x      = OurHMDInfo.DesktopX;\n    d.WindowsPos.y      = OurHMDInfo.DesktopY;\n    d.DisplayDeviceName = OurHMDInfo.DisplayDeviceName;\n    d.DisplayId         = OurHMDInfo.DisplayId;\n    d.VendorId          = (short)OurHMDInfo.VendorId;\n    d.ProductId         = (short)OurHMDInfo.ProductId;\n    d.FirmwareMajor     = (short)OurHMDInfo.FirmwareMajor;\n    d.FirmwareMinor     = (short)OurHMDInfo.FirmwareMinor;\n    d.CameraFrustumFarZInMeters  = OurHMDInfo.CameraFrustumFarZInMeters;\n    d.CameraFrustumHFovInRadians = OurHMDInfo.CameraFrustumHFovInRadians;\n    d.CameraFrustumNearZInMeters = OurHMDInfo.CameraFrustumNearZInMeters;\n    d.CameraFrustumVFovInRadians = OurHMDInfo.CameraFrustumVFovInRadians;\n\n    OVR_strcpy(d.SerialNumber, sizeof(d.SerialNumber), OurHMDInfo.PrintedSerial.ToCStr());\n\n    d.HmdCaps           = ovrHmdCap_Present | ovrHmdCap_NoVSync;\n    d.TrackingCaps      = ovrTrackingCap_MagYawCorrection | ovrTrackingCap_Orientation;\n    d.DistortionCaps    = ovrDistortionCap_TimeWarp | //ovrDistortionCap_DepthProjectedTimeWarp |\n                          ovrDistortionCap_Vignette | ovrDistortionCap_SRGB | ovrDistortionCap_FlipInput |\n                          ovrDistortionCap_TimewarpJitDelay | ovrDistortionCap_ProfileNoSpinWaits |\n                          ovrDistortionCap_HqDistortion | ovrDistortionCap_LinuxDevFullscreen;\n\n#if defined(OVR_OS_WIN32) || defined(OVR_OS_WIN64)\n    // TODO: this gets enabled for everything, but is only applicable for DX11+\n    d.DistortionCaps   |= ovrDistortionCap_ComputeShader;\n#endif\n\n    if( OurHMDInfo.InCompatibilityMode )\n    {\n        d.HmdCaps |= ovrHmdCap_ExtendDesktop;\n    }\n\n    if (OurHMDInfo.HmdType == HmdType_DK1)\n    {\n        d.Type = ovrHmd_DK1;        \n    }\n    else if (OurHMDInfo.HmdType == HmdType_DK2)\n    {\n        d.Type = ovrHmd_DK2;\n        d.HmdCaps |= ovrHmdCap_LowPersistence | ovrHmdCap_DynamicPrediction;\n        d.TrackingCaps |= ovrTrackingCap_Position;\n        d.DistortionCaps |= ovrDistortionCap_Overdrive;\n    }\n\n    const DistortionRenderDesc& leftDistortion  = Distortion[0];\n    const DistortionRenderDesc& rightDistortion = Distortion[1];\n  \n    // The suggested FOV (assuming eye rotation)\n    d.DefaultEyeFov[0] = CalculateFovFromHmdInfo(StereoEye_Left, leftDistortion, RenderInfo, OVR_DEFAULT_EXTRA_EYE_ROTATION);\n    d.DefaultEyeFov[1] = CalculateFovFromHmdInfo(StereoEye_Right, rightDistortion, RenderInfo, OVR_DEFAULT_EXTRA_EYE_ROTATION);\n\n    // FOV extended across the entire screen\n    d.MaxEyeFov[0] = GetPhysicalScreenFov(StereoEye_Left, leftDistortion);\n    d.MaxEyeFov[1] = GetPhysicalScreenFov(StereoEye_Right, rightDistortion);\n    \n    if (OurHMDInfo.Shutter.Type == HmdShutter_RollingRightToLeft)\n    {\n        d.EyeRenderOrder[0] = ovrEye_Right;\n        d.EyeRenderOrder[1] = ovrEye_Left;\n    }\n    else\n    {\n        d.EyeRenderOrder[0] = ovrEye_Left;\n        d.EyeRenderOrder[1] = ovrEye_Right;\n    }    \n\n    // MA: Taking this out on purpose.\n    // Important information for those that are required to do their own timing,\n    // because of shortfalls in timing code.\n    //d.VsyncToNextVsync = OurHMDInfo.Shutter.VsyncToNextVsync;\n    //d.PixelPersistence = OurHMDInfo.Shutter.PixelPersistence;\n\n    if (OurHMDInfo.DebugDevice)\n    {\n        d.HmdCaps |= ovrHmdCap_DebugDevice;\n    }\n\n    return d;\n}\n\novrSizei HMDRenderState::GetFOVTextureSize(int eye, ovrFovPort fov, float pixelsPerDisplayPixel) const\n{\n    OVR_ASSERT((unsigned)eye < 2);\n    StereoEye seye = (eye == ovrEye_Left) ? StereoEye_Left : StereoEye_Right;\n    return CalculateIdealPixelSize(seye, Distortion[eye], fov, pixelsPerDisplayPixel);\n}\n\novrEyeRenderDesc HMDRenderState::CalcRenderDesc(ovrEyeType eyeType, const ovrFovPort& fov) const\n{    \n    const HmdRenderInfo&   hmdri = RenderInfo;\n    StereoEye        eye   = (eyeType == ovrEye_Left) ? StereoEye_Left : StereoEye_Right;\n    ovrEyeRenderDesc e0;\n    \n    e0.Eye                       = eyeType;\n    e0.Fov                       = fov;\n    e0.HmdToEyeViewOffset        = CalculateEyeVirtualCameraOffset(hmdri, eye, false);\n    e0.DistortedViewport         = GetFramebufferViewport(eye, hmdri);\n    e0.PixelsPerTanAngleAtCenter = Distortion[0].PixelsPerTanAngleAtCenter;\n\n    return e0;\n}\n\n}} // namespace OVR::CAPI\n\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/CAPI_HMDRenderState.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_HMDRenderState.h\nContent     :   Combines all of the rendering state associated with the HMD\nCreated     :   February 2, 2014\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_HMDRenderState_h\n#define OVR_CAPI_HMDRenderState_h\n\n#include \"OVR_CAPI.h\"\n#include \"Extras/OVR_Math.h\"\n#include \"Util/Util_Render_Stereo.h\"\n#include \"Service/Service_NetSessionCommon.h\"\n\nnamespace OVR { namespace CAPI {\n\nusing namespace OVR::Util::Render;\n\n\n//-------------------------------------------------------------------------------------\n// ***** HMDRenderState\n\n// Combines all of the rendering setup information about one HMD.\n// This structure only ever exists inside HMDState, but this \n// declaration is in a separate file to reduce #include dependencies.\n// All actual lifetime and update control is done by the surrounding HMDState.\nstruct HMDRenderState\n{\n    // Utility query functions.\n    ovrHmdDesc          GetDesc() const;\n    ovrSizei            GetFOVTextureSize(int eye, ovrFovPort fov, float pixelsPerDisplayPixel) const;\n    ovrEyeRenderDesc    CalcRenderDesc(ovrEyeType eyeType, const ovrFovPort& fov) const;\n\n    HMDInfo                 OurHMDInfo;\n    ProfileRenderInfo       OurProfileRenderInfo;\n    HmdRenderInfo           RenderInfo;\n    DistortionRenderDesc    Distortion[2];\n    ovrEyeRenderDesc        EyeRenderDesc[2]; \n\n    // Clear color used for distortion\n    float                   ClearColor[4];\n\n    // Pose at which last time the eye was rendered, as submitted by EndEyeRender.\n    ovrPosef                EyeRenderPoses[2];\n\n    // Capabilities passed to Configure.\n    unsigned                EnabledHmdCaps;     // enum ovrHmdCaps\n    unsigned                DistortionCaps;     // enum ovrDistortionCaps\n};\n\n\n}} // namespace OVR::CAPI\n\n#endif // OVR_CAPI_HMDState_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/CAPI_HMDState.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_HMDState.cpp\nContent     :   State associated with a single HMD\nCreated     :   January 24, 2014\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_HMDState.h\"\n#include \"../OVR_Profile.h\"\n#include \"../Service/Service_NetClient.h\"\n\n#ifdef OVR_OS_WIN32\n    #include \"../Displays/OVR_Win32_ShimFunctions.h\"\n\n    // For auto-detection of window handle for direct mode:\n    #include <OVR_CAPI_D3D.h>\n    #include <GL/CAPI_GLE.h>\n    #include <OVR_CAPI_GL.h>\n\n#elif defined(OVR_OS_LINUX)\n\n    #include \"../Displays/OVR_Linux_SDKWindow.h\" // For screen rotation\n\n#endif\n\n#include \"Tracing/Tracing.h\"\n\n\nnamespace OVR { namespace CAPI {\n\n\n// Accessed via HMDState::EnumerateHMDStateList()\nstatic OVR::Lock hmdStateListLock;\nstatic OVR::List<HMDState> hmdStateList; // List of all created HMDStates.\n\n\n//-------------------------------------------------------------------------------------\n// ***** HMDState\n\nHMDState::HMDState(HMDInfo const & hmdInfo,\n                   Profile* profile,\n                   Service::HMDNetworkInfo const * netInfo,\n                   Service::NetClient* client) :\n    TimewarpTimer(),\n    RenderTimer(),\n    RenderIMUTimeSeconds(0.),\n    pProfile(profile),\n    pHmdDesc(0),\n    pWindow(0),\n    pClient(client),\n    NetId(InvalidVirtualHmdId),\n    NetInfo(),\n    OurHMDInfo(hmdInfo),\n    pLastError(nullptr),\n    EnabledHmdCaps(0),\n    EnabledServiceHmdCaps(0),\n    CombinedHmdReader(),\n    TheTrackingStateReader(),\n    TheLatencyTestStateReader(),\n    LatencyTestActive(false),\n  //LatencyTestDrawColor(),\n    LatencyTest2Active(false),\n  //LatencyTest2DrawColor(),\n    ScreenLatencyTracker(),\n    RenderState(),\n    pRenderer(),\n    pHSWDisplay(),\n  //LastGetStringValue(),\n    RenderingConfigured(false),\n    BeginFrameCalled(false),\n    BeginFrameThreadId(),\n    BeginFrameIndex(0),\n    RenderAPIThreadChecker(),\n    BeginFrameTimingCalled(false)\n{\n    if (netInfo)\n    {\n        NetId = netInfo->NetId;\n        NetInfo = *netInfo;\n    }\n\n    // Hook up the app timing lockless updater\n    RenderTimer.SetUpdater(TimewarpTimer.GetUpdater());\n\n    // TBD: We should probably be looking up the default profile for the given\n    // device type + user if profile == 0.    \n    pLastError = 0;\n\n    RenderState.OurHMDInfo = OurHMDInfo;\n\n    UpdateRenderProfile(profile);\n\n    OVR_ASSERT(!pHmdDesc);\n    pHmdDesc         = (ovrHmdDesc*)OVR_ALLOC(sizeof(ovrHmdDesc));\n    *pHmdDesc        = RenderState.GetDesc();\n    pHmdDesc->Handle = this;\n\n    RenderState.ClearColor[0] = 0.0f;\n    RenderState.ClearColor[1] = 0.0f;\n    RenderState.ClearColor[2] = 0.0f;\n    RenderState.ClearColor[3] = 0.0f;\n    RenderState.EnabledHmdCaps = 0;\n\n    if (!TimewarpTimer.Initialize(&RenderState, &ScreenLatencyTracker))\n    {\n        OVR_ASSERT(false);\n    }\n\n    /*\n    LatencyTestDrawColor[0] = 0;\n    LatencyTestDrawColor[1] = 0;\n    LatencyTestDrawColor[2] = 0;\n    */\n\n    RenderingConfigured    = false;\n    BeginFrameCalled       = false;\n    BeginFrameThreadId     = 0;\n    BeginFrameTimingCalled = false;\n\n    // Construct the HSWDisplay. We will later reconstruct it with a specific ovrRenderAPI type if the application starts using SDK-based rendering.\n    if(!pHSWDisplay)\n    {\n        pHSWDisplay = *OVR::CAPI::HSWDisplay::Factory(ovrRenderAPI_None, pHmdDesc, RenderState);\n    }\n\n    RenderIMUTimeSeconds = 0.;\n\n    hmdStateListLock.DoLock();\n    hmdStateList.PushBack(this);\n    hmdStateListLock.Unlock();\n}\n\nHMDState::~HMDState()\n{\n    hmdStateListLock.DoLock();\n    hmdStateList.Remove(this);\n    hmdStateListLock.Unlock();\n\n    if (pClient)\n    {\n        pClient->Hmd_Release(NetId);\n        pClient = 0;\n    }\n\n    ConfigureRendering(0,0,0,0);\n\n    if (pHmdDesc)\n    {\n        OVR_FREE(pHmdDesc);\n        pHmdDesc = nullptr;\n    }\n}\n\nbool HMDState::InitializeSharedState()\n{\n    if (!CombinedHmdReader.Open(NetInfo.SharedMemoryName.Hmd.ToCStr()) ||\n        !CameraReader.Open(NetInfo.SharedMemoryName.Camera.ToCStr()))\n    {\n        return false;\n    }\n\n    TheTrackingStateReader.SetUpdaters(CombinedHmdReader.Get(), CameraReader.Get());\n    TheLatencyTestStateReader.SetUpdater(CombinedHmdReader.Get());\n\n\n    return true;\n}\n\nstatic Vector3f GetNeckModelFromProfile(Profile* profile)\n{\n    OVR_ASSERT(profile);\n\n    float neckeye[2] = { OVR_DEFAULT_NECK_TO_EYE_HORIZONTAL, OVR_DEFAULT_NECK_TO_EYE_VERTICAL };\n    profile->GetFloatValues(OVR_KEY_NECK_TO_EYE_DISTANCE, neckeye, 2);\n\n    // Make sure these are vaguely sensible values.\n    //OVR_ASSERT((neckeye[0] > 0.05f) && (neckeye[0] < 0.5f));\n    //OVR_ASSERT((neckeye[1] > 0.05f) && (neckeye[1] < 0.5f));\n\n    // Named for clarity\n    float NeckToEyeHorizontal = neckeye[0];\n    float NeckToEyeVertical = neckeye[1];\n\n    // Store the neck model\n    return Vector3f(0.0, NeckToEyeVertical, -NeckToEyeHorizontal);\n}\n\nstatic float GetCenterPupilDepthFromRenderInfo(HmdRenderInfo* hmdRenderInfo)\n{\n    OVR_ASSERT(hmdRenderInfo);\n\n    // Find the distance from the center of the screen to the \"center eye\"\n    // This center eye is used by systems like rendering & audio to represent the player,\n    // and they will handle the offsets needed from there to each actual eye.\n\n    // HACK HACK HACK\n    // We know for DK1 the screen->lens surface distance is roughly 0.049f, and that the faceplate->lens is 0.02357f.\n    // We're going to assume(!!!!) that all HMDs have the same screen->faceplate distance.\n    // Crystal Cove was measured to be roughly 0.025 screen->faceplate which agrees with this assumption.\n    // TODO: do this properly!  Update:  Measured this at 0.02733 with a CC prototype, CES era (PT7), on 2/19/14 -Steve\n    float screenCenterToMidplate = 0.02733f;\n    float centerEyeRelief = hmdRenderInfo->GetEyeCenter().ReliefInMeters;\n    float CenterPupilDepth = screenCenterToMidplate + hmdRenderInfo->LensSurfaceToMidplateInMeters + centerEyeRelief;\n\n    return CenterPupilDepth;\n}\n\nvoid HMDState::UpdateRenderProfile(Profile* profile)\n{\n    // Apply the given profile to generate a render context\n    RenderState.OurProfileRenderInfo = GenerateProfileRenderInfoFromProfile(RenderState.OurHMDInfo, profile);\n    RenderState.RenderInfo = GenerateHmdRenderInfoFromHmdInfo(RenderState.OurHMDInfo, RenderState.OurProfileRenderInfo);\n\n    RenderState.Distortion[0] = CalculateDistortionRenderDesc(StereoEye_Left, RenderState.RenderInfo, 0);\n    RenderState.Distortion[1] = CalculateDistortionRenderDesc(StereoEye_Right, RenderState.RenderInfo, 0);\n\n    if (pClient)\n    {\n        // Center pupil depth\n        float centerPupilDepth = GetCenterPupilDepthFromRenderInfo(&RenderState.RenderInfo);\n        pClient->SetNumberValue(GetNetId(), \"CenterPupilDepth\", centerPupilDepth);\n\n        // Neck model\n        Vector3f neckModel = GetNeckModelFromProfile(profile);\n        double neckModelArray[3] = {\n            neckModel.x,\n            neckModel.y,\n            neckModel.z\n        };\n        pClient->SetNumberValues(GetNetId(), \"NeckModelVector3f\", neckModelArray, 3);\n\n        // Camera position\n\n        // OVR_KEY_CAMERA_POSITION is actually the *inverse* of a camera position.\n        Posed centeredFromWorld;\n\n        double values[7];\n        if (profile->GetDoubleValues(OVR_KEY_CAMERA_POSITION, values, 7) == 7)\n        {\n            centeredFromWorld = Posed::FromArray(values);\n        }\n        else\n        {\n            centeredFromWorld = TheTrackingStateReader.GetDefaultCenteredFromWorld();\n        }\n\n        // ComputeCenteredFromWorld wants a worldFromCpf pose, so invert it.\n        // FIXME: The stored centeredFromWorld doesn't have a neck model offset applied, but probably should.\n        TheTrackingStateReader.ComputeCenteredFromWorld(centeredFromWorld.Inverted(), Vector3d(0, 0, 0));\n    }\n}\n\nHMDState* HMDState::CreateHMDState(NetClient* client, const HMDNetworkInfo& netInfo)\n{\n    // HMDState works through a handle to service HMD....\n    HMDInfo hinfo;\n    if (!client->Hmd_GetHmdInfo(netInfo.NetId, &hinfo))\n    {\n        OVR_DEBUG_LOG((\"[HMDState] Unable to get HMD info\"));\n        return nullptr;\n    }\n\n#ifdef OVR_OS_WIN32\n    OVR_DEBUG_LOG((\"[HMDState] Setting up display shim\"));\n\n    // Initialize the display shim before reporting the display to the user code\n    // so that this will happen before the D3D display object is created.\n    Win32::DisplayShim::GetInstance().Update(&hinfo.ShimInfo);\n#endif\n\n    Ptr<Profile> pDefaultProfile = *ProfileManager::GetInstance()->GetDefaultUserProfile(&hinfo);\n    OVR_DEBUG_LOG((\"[HMDState] Using profile %s\", pDefaultProfile->GetValue(OVR_KEY_USER)));\n\n    HMDState* hmds = new HMDState(hinfo, pDefaultProfile, &netInfo, client);\n\n    if (!hmds->InitializeSharedState())\n    {\n        delete hmds;\n        return nullptr;\n    }\n\n    return hmds;\n}\n\nHMDState* HMDState::CreateDebugHMDState(ovrHmdType hmdType)\n{\n    HmdTypeEnum t = HmdType_None;\n    if (hmdType == ovrHmd_DK1)\n        t = HmdType_DK1;    \n    else if (hmdType == ovrHmd_DK2)\n        t = HmdType_DK2;\n\n    // FIXME: This does not actually grab the right user..\n    Ptr<Profile> pDefaultProfile = *ProfileManager::GetInstance()->GetDefaultProfile(t);\n    \n    return new HMDState(CreateDebugHMDInfo(t), pDefaultProfile);\n}\n\n// Enumerate each open HMD\nunsigned HMDState::EnumerateHMDStateList(bool (*callback)(const HMDState *state))\n{\n    unsigned count = 0;\n    hmdStateListLock.DoLock();\n    for (const HMDState *hmds = hmdStateList.GetFirst(); !hmdStateList.IsNull(hmds); hmds = hmdStateList.GetNext(hmds))\n    {\n        if (callback && !callback(hmds))\n            break;\n        ++count;\n    }\n    hmdStateListLock.Unlock();\n    return count;\n}\n\n//-------------------------------------------------------------------------------------\n// *** Sensor \n\nbool HMDState::ConfigureTracking(unsigned supportedCaps, unsigned requiredCaps)\n{\n    return pClient ? pClient->Hmd_ConfigureTracking(NetId, supportedCaps, requiredCaps) : true;\n}\n\nvoid HMDState::ResetTracking(bool visionReset)\n{\n    if (pClient) pClient->Hmd_ResetTracking(NetId, visionReset);\n}        \n\n// Re-center the orientation.\nvoid HMDState::RecenterPose()\n{\n    float hnm[3];\n    getFloatArray(\"NeckModelVector3f\", hnm, 3);\n    TheTrackingStateReader.RecenterPose(Vector3d(hnm[0], hnm[1], hnm[2]));\n}\n\n// Returns prediction for time.\novrTrackingState HMDState::PredictedTrackingState(double absTime, void*)\n{\n    Vision::TrackingState ss;\n    TheTrackingStateReader.GetTrackingStateAtTime(absTime, ss);\n\n    // Zero out the status flags\n    if (!pClient || !pClient->IsConnected(false, false))\n    {\n        ss.StatusFlags = 0;\n    }\n\n#ifdef OVR_OS_WIN32\n    // Set up display code for Windows\n    Win32::DisplayShim::GetInstance().Active = (ss.StatusFlags & ovrStatus_HmdConnected) != 0;\n#endif\n\n\n    return ss;\n}\n\nvoid HMDState::SetEnabledHmdCaps(unsigned hmdCaps)\n{\n    if (OurHMDInfo.HmdType < HmdType_DK2)\n    {\n        // disable low persistence and pentile.\n        hmdCaps &= ~ovrHmdCap_LowPersistence;\n\n        // disable dynamic prediction using the internal latency tester\n        hmdCaps &= ~ovrHmdCap_DynamicPrediction;\n    }\n\n    if ((EnabledHmdCaps ^ hmdCaps) & ovrHmdCap_NoMirrorToWindow)\n    {\n#ifdef OVR_OS_WIN32\n        Win32::DisplayShim::GetInstance().UseMirroring = (hmdCaps & ovrHmdCap_NoMirrorToWindow)  ?\n                                                         false : true;\n        if (pWindow)\n        {   // Force window repaint so that stale mirrored image doesn't persist.\n            ::InvalidateRect((HWND)pWindow, 0, true);\n        }\n#endif\n    }\n\n    // TBD: Should this include be only the rendering flags? Otherwise, bits that failed\n    //      modification in Hmd_SetEnabledCaps may mis-match...\n    EnabledHmdCaps             = hmdCaps & ovrHmdCap_Writable_Mask;\n    RenderState.EnabledHmdCaps = EnabledHmdCaps;\n\n\n    // If any of the modifiable service caps changed, call on the service.\n    unsigned prevServiceCaps = EnabledServiceHmdCaps & ovrHmdCap_Writable_Mask;\n    unsigned newServiceCaps  = hmdCaps & ovrHmdCap_Writable_Mask & ovrHmdCap_Service_Mask;\n\n    if (prevServiceCaps ^ newServiceCaps)\n    {\n        EnabledServiceHmdCaps = pClient ? pClient->Hmd_SetEnabledCaps(NetId, newServiceCaps)\n                                : newServiceCaps;\n    }\n}\n\n\nunsigned HMDState::SetEnabledHmdCaps()\n{\n    unsigned serviceCaps = pClient ? pClient->Hmd_GetEnabledCaps(NetId) :\n                                      EnabledServiceHmdCaps;\n    \n    return serviceCaps & ((~ovrHmdCap_Service_Mask) | EnabledHmdCaps);    \n}\n\n\n//-------------------------------------------------------------------------------------\n// ***** Property Access\n\n// FIXME: Remove the EGetBoolValue stuff and do it with a \"Server:\" prefix, so we do not\n// need to keep a white-list of keys.  This is also way cool because it allows us to add\n// new settings keys from outside CAPI that can modify internal server data.\n\nbool HMDState::getBoolValue(const char* propertyName, bool defaultVal)\n{\n    if (NetSessionCommon::IsServiceProperty(NetSessionCommon::EGetBoolValue, propertyName))\n    {\n       return NetClient::GetInstance()->GetBoolValue(GetNetId(), propertyName, defaultVal);\n    }\n    else if (pProfile)\n    {\n        return pProfile->GetBoolValue(propertyName, defaultVal);\n    }\n    return defaultVal;\n}\n\nbool HMDState::setBoolValue(const char* propertyName, bool value)\n{\n    if (NetSessionCommon::IsServiceProperty(NetSessionCommon::ESetBoolValue, propertyName))\n    {\n        return NetClient::GetInstance()->SetBoolValue(GetNetId(), propertyName, value);\n    }\n\n    return false;\n}\n\nint HMDState::getIntValue(const char* propertyName, int defaultVal)\n{\n    if (NetSessionCommon::IsServiceProperty(NetSessionCommon::EGetIntValue, propertyName))\n    {\n        return NetClient::GetInstance()->GetIntValue(GetNetId(), propertyName, defaultVal);\n    }\n    else if (pProfile)\n    {\n        return pProfile->GetIntValue(propertyName, defaultVal);\n    }\n    return defaultVal;\n}\n\nbool HMDState::setIntValue(const char* propertyName, int value)\n{\n    if (NetSessionCommon::IsServiceProperty(NetSessionCommon::ESetIntValue, propertyName))\n    {\n        return NetClient::GetInstance()->SetIntValue(GetNetId(), propertyName, value);\n    }\n\n    return false;\n}\n\nfloat HMDState::getFloatValue(const char* propertyName, float defaultVal)\n{\n    if (OVR_strcmp(propertyName, \"LensSeparation\") == 0)\n    {\n        return OurHMDInfo.LensSeparationInMeters;\n    }\n    else if (OVR_strcmp(propertyName, \"VsyncToNextVsync\") == 0) \n    {\n        return OurHMDInfo.Shutter.VsyncToNextVsync;\n    }\n    else if (OVR_strcmp(propertyName, \"PixelPersistence\") == 0) \n    {\n        return OurHMDInfo.Shutter.PixelPersistence;\n    }\n    else if (NetSessionCommon::IsServiceProperty(NetSessionCommon::EGetNumberValue, propertyName))\n    {\n       return (float)NetClient::GetInstance()->GetNumberValue(GetNetId(), propertyName, defaultVal);\n    }\n    else if (pProfile)\n    {\n        return pProfile->GetFloatValue(propertyName, defaultVal);\n    }\n\n    return defaultVal;\n}\n\nbool HMDState::setFloatValue(const char* propertyName, float value)\n{\n    if (NetSessionCommon::IsServiceProperty(NetSessionCommon::ESetNumberValue, propertyName))\n    {\n        return NetClient::GetInstance()->SetNumberValue(GetNetId(), propertyName, value);\n    }\n\n    return false;\n}\n\nstatic unsigned CopyFloatArrayWithLimit(float dest[], unsigned destSize,\n                                        float source[], unsigned sourceSize)\n{\n    unsigned count = Alg::Min(destSize, sourceSize);\n    for (unsigned i = 0; i < count; i++)\n        dest[i] = source[i];\n    return count;\n}\n\nunsigned HMDState::getFloatArray(const char* propertyName, float values[], unsigned arraySize)\n{\n    if (arraySize)\n    {\n        if (OVR_strcmp(propertyName, \"ScreenSize\") == 0)\n        {\n            float data[2] = { OurHMDInfo.ScreenSizeInMeters.w, OurHMDInfo.ScreenSizeInMeters.h };\n\n            return CopyFloatArrayWithLimit(values, arraySize, data, 2);\n        }\n        else if (OVR_strcmp(propertyName, \"DistortionClearColor\") == 0)\n        {\n            return CopyFloatArrayWithLimit(values, arraySize, RenderState.ClearColor, 4);\n        }\n        else if (OVR_strcmp(propertyName, \"DK2Latency\") == 0)\n        {\n            if (OurHMDInfo.HmdType < HmdType_DK2)\n            {\n                return 0;\n            }\n\n            OutputLatencyTimings timings;\n            ScreenLatencyTracker.GetLatencyTimings(timings);\n\n            if (arraySize > 0)\n            {\n                switch (arraySize)\n                {\n                default: values[4] = (float)timings.ErrorTimewarp;      // Fall-thru\n                case 4:  values[3] = (float)timings.ErrorRender;        // Fall-thru\n                case 3:  values[2] = (float)timings.LatencyPostPresent; // Fall-thru\n                case 2:  values[1] = (float)timings.LatencyTimewarp;    // Fall-thru\n                case 1:  values[0] = (float)timings.LatencyRender;\n                }\n            }\n\n            return arraySize > 5 ? 5 : arraySize;\n        }\n        else if (OVR_strcmp(propertyName, \"NeckModelVector3f\") == 0)\n        {\n            // Query the service to grab the HNM.\n            double hnm[3] = {};\n            int count = NetClient::GetInstance()->GetNumberValues(GetNetId(), propertyName, hnm, (int)arraySize);\n\n            // If the service is unavailable or returns zero data,\n            if (count < 3 ||\n                (hnm[0] == 0.0 && hnm[1] == 0.0 && hnm[2] == 0.0))\n            {\n                // These are the default values used if the server does not return any data, due to not\n                // being reachable or other errors.\n                OVR_ASSERT(pProfile.GetPtr());\n                if (pProfile.GetPtr())\n                {\n                    Vector3f neckModel = GetNeckModelFromProfile(pProfile);\n                    hnm[0] = neckModel.x;\n                    hnm[1] = neckModel.y;\n                    hnm[2] = neckModel.z;\n                }\n            }\n\n            for (unsigned i = 0; i < 3 && i < arraySize; ++i)\n            {\n                values[i] = (float)hnm[i];\n            }\n\n            return arraySize > 3 ? 3 : arraySize;\n        }\n        else if (NetSessionCommon::IsServiceProperty(NetSessionCommon::EGetNumberValues, propertyName))\n        {\n            // Convert floats to doubles\n            double* da = new double[arraySize];\n            for (int i = 0; i < (int)arraySize; ++i)\n            {\n                da[i] = values[i];\n            }\n\n            int count = NetClient::GetInstance()->GetNumberValues(GetNetId(), propertyName, da, (int)arraySize);\n\n            for (int i = 0; i < count; ++i)\n            {\n                values[i] = (float)da[i];\n            }\n\n            delete[] da;\n\n            return count;\n        }\n        else if (pProfile)\n        {        \n            // TBD: Not quite right. Should update profile interface, so that\n            //      we can return 0 in all conditions if property doesn't exist.\n        \n            return pProfile->GetFloatValues(propertyName, values, arraySize);\n        }\n    }\n\n    return 0;\n}\n\nbool HMDState::setFloatArray(const char* propertyName, float values[], unsigned arraySize)\n{\n    if (!arraySize)\n    {\n        return false;\n    }\n    \n    if (OVR_strcmp(propertyName, \"DistortionClearColor\") == 0)\n    {\n        CopyFloatArrayWithLimit(RenderState.ClearColor, 4, values, arraySize);\n        return true;\n    }\n\n    if (NetSessionCommon::IsServiceProperty(NetSessionCommon::ESetNumberValues, propertyName))\n    {\n        double* da = new double[arraySize];\n        for (int i = 0; i < (int)arraySize; ++i)\n        {\n            da[i] = values[i];\n        }\n\n        bool result = NetClient::GetInstance()->SetNumberValues(GetNetId(), propertyName, da, arraySize);\n\n        delete[] da;\n\n        return result;\n    }\n\n    return false;\n}\n\nconst char* HMDState::getString(const char* propertyName, const char* defaultVal)\n{\n    if (NetSessionCommon::IsServiceProperty(NetSessionCommon::EGetStringValue, propertyName))\n    {\n        return NetClient::GetInstance()->GetStringValue(GetNetId(), propertyName, defaultVal);\n    }\n\n    if (pProfile)\n    {\n        LastGetStringValue[0] = 0;\n        if (pProfile->GetValue(propertyName, LastGetStringValue, sizeof(LastGetStringValue)))\n        {\n            return LastGetStringValue;\n        }\n    }\n\n    return defaultVal;\n}\n\nbool HMDState::setString(const char* propertyName, const char* value)\n{\n    if (NetSessionCommon::IsServiceProperty(NetSessionCommon::ESetStringValue, propertyName))\n    {\n        return NetClient::GetInstance()->SetStringValue(GetNetId(), propertyName, value);\n    }\n\n    return false;\n}\n\n\n//-------------------------------------------------------------------------------------\n// *** Latency Test\n\nbool HMDState::ProcessLatencyTest(unsigned char rgbColorOut[3])\n{    \n    return NetClient::GetInstance()->LatencyUtil_ProcessInputs(Timer::GetSeconds(), rgbColorOut);\n}\n\n\n//-------------------------------------------------------------------------------------\n// *** Timewarp\n\nAppTiming HMDState::GetAppTiming(uint32_t frameIndex)\n{\n    // Get prediction time for the requested frame index\n    AppTiming timing;\n    const bool VsyncOn = ((RenderState.EnabledHmdCaps & ovrHmdCap_NoVSync) == 0);\n    RenderTimer.GetAppTimingForIndex(timing, VsyncOn, frameIndex);\n\n    // Update the predicted scanout time for this frame index\n    TimingHistory.SetScanoutTimeForFrame(frameIndex, timing.ScanoutStartTime);\n\n    return timing;\n}\n\novrFrameTiming HMDState::GetFrameTiming(uint32_t frameIndex)\n{\n    AppTiming timing = GetAppTiming(frameIndex);\n\n    // Calculate eye render times based on shutter type\n    double eyePhotonsTimes[2];\n    CalculateEyeRenderTimes(timing.VisibleMidpointTime, timing.FrameInterval,\n                            RenderState.RenderInfo.Shutter.Type,\n                            eyePhotonsTimes[0], eyePhotonsTimes[1]);\n\n    RenderIMUTimeSeconds = Timer::GetSeconds(); // RenderPrediction.RawSensorData.TimeInSeconds;\n\n    // Construct a ovrFrameTiming object from the base app timing information\n    ovrFrameTiming result;\n    result.DeltaSeconds           = (float)timing.FrameInterval;\n    result.EyeScanoutSeconds[0]   = eyePhotonsTimes[0];\n    result.EyeScanoutSeconds[1]   = eyePhotonsTimes[1];\n    result.ScanoutMidpointSeconds = timing.VisibleMidpointTime;\n    result.ThisFrameSeconds       = timing.ScanoutStartTime - timing.FrameInterval;\n    result.NextFrameSeconds       = timing.ScanoutStartTime;\n    // Deprecated: This should be queried after render work completes.  Please delete me from CAPI.\n    result.TimewarpPointSeconds   = 0.;\n    return result;\n}\n\novrTrackingState HMDState::GetMidpointPredictionTracking(uint32_t frameIndex)\n{\n    AppTiming timing = GetAppTiming(frameIndex);\n    RenderIMUTimeSeconds = Timer::GetSeconds(); // RenderPrediction.RawSensorData.TimeInSeconds;\n    return PredictedTrackingState(timing.VisibleMidpointTime);\n}\n\nPosef HMDState::GetEyePredictionPose(ovrEyeType eye)\n{\n    // Note that this function does not get the frame index parameter and depends\n    // on whichever value is passed into the BeginFrame() function.\n    ovrTrackingState ts = GetMidpointPredictionTracking(BeginFrameIndex);\n    TraceTrackingState(ts);\n    Posef const & hmdPose = ts.HeadPose.ThePose;\n\n    // Currently HmdToEyeViewOffset is only a 3D vector\n    // (Negate HmdToEyeViewOffset because offset is a view matrix offset and not a camera offset)\n    if (eye == ovrEye_Left)\n    {\n        return Posef(hmdPose.Rotation, ((Posef)hmdPose).Apply(-((Vector3f)RenderState.EyeRenderDesc[0].HmdToEyeViewOffset)));\n    }\n    else\n    {\n        return Posef(hmdPose.Rotation, ((Posef)hmdPose).Apply(-((Vector3f)RenderState.EyeRenderDesc[1].HmdToEyeViewOffset)));\n    }\n}\n\nvoid HMDState::endFrameRenderTiming()\n{\n    TimewarpTimer.SetLastPresentTime(); // Record approximate vsync time\n\n    bool dk2LatencyTest = (EnabledHmdCaps & ovrHmdCap_DynamicPrediction) != 0;\n    if (dk2LatencyTest)\n    {\n        Util::FrameTimeRecordSet recordSet;\n        TheLatencyTestStateReader.GetRecordSet(recordSet);\n\n        FrameLatencyData data;\n        data.DrawColor                    = LatencyTest2DrawColor[0];\n        data.RenderIMUTime                = RenderIMUTimeSeconds;\n        data.RenderPredictedScanoutTime   = TimingHistory.LookupScanoutTime(BeginFrameIndex);\n        data.PresentTime                  = TimewarpTimer.GetLatencyTesterPresentTime();\n        data.TimewarpPredictedScanoutTime = TimewarpTimer.GetTimewarpTiming()->ScanoutTime;\n        data.TimewarpIMUTime              = TimewarpTimer.GetTimewarpIMUTime();\n\n        //OVR_ASSERT(data.TimewarpIMUTime == 0. || data.TimewarpIMUTime >= data.RenderIMUTime);\n\n        ScreenLatencyTracker.SaveDrawColor(data);\n        ScreenLatencyTracker.MatchRecord(recordSet);\n    }\n}\n\nvoid HMDState::getTimewarpStartEnd(ovrEyeType eyeId, double timewarpStartEnd[2])\n{\n    // Get eye start/end scanout times\n    TimewarpTiming const* timewarpTiming = TimewarpTimer.GetTimewarpTiming();\n\n    for (int i = 0; i < 2; ++i)\n    {\n        timewarpStartEnd[i] = timewarpTiming->EyeStartEndTimes[eyeId][i];\n    }\n}\n\nvoid HMDState::GetTimewarpMatricesEx(ovrEyeType eyeId,\n                                     ovrPosef renderPose, \n                                     bool calcPosition, const ovrVector3f hmdToEyeViewOffset[2], \n                                     ovrMatrix4f twmOut[2], double debugTimingOffsetInSeconds)\n{\n    // Get timewarp start/end timing\n    double timewarpStartEnd[2];\n    getTimewarpStartEnd(eyeId, timewarpStartEnd);\n\n    //TPH, to vary timing, to allow developers to debug, to shunt the predicted time forward \n    //and back, and see if the SDK is truly delivering the correct time.  Also to allow\n    //illustration of the detrimental effects when this is not done right. \n    timewarpStartEnd[0] += debugTimingOffsetInSeconds;\n    timewarpStartEnd[1] += debugTimingOffsetInSeconds;\n\n    ovrTrackingState startState = PredictedTrackingState(timewarpStartEnd[0]);\n    ovrTrackingState endState   = PredictedTrackingState(timewarpStartEnd[1]);\n\n    ovrPosef startHmdPose = startState.HeadPose.ThePose;\n    ovrPosef endHmdPose   = endState.HeadPose.ThePose;\n    Vector3f eyeOffset    = Vector3f(0.0f, 0.0f, 0.0f);\n    Matrix4f timewarpStart, timewarpEnd;\n    if (calcPosition)\n    {\n        if (!hmdToEyeViewOffset)\n        {\n            OVR_ASSERT(false);\n            LogError(\"{ERR-102} [FrameTime] No hmdToEyeViewOffset provided even though calcPosition is true.\");\n\n            // disable position to avoid positional issues\n            renderPose.Position = Vector3f::Zero();\n            startHmdPose.Position = Vector3f::Zero();\n            endHmdPose.Position = Vector3f::Zero();\n        }\n        else if (hmdToEyeViewOffset[eyeId].x >= MATH_FLOAT_MAXVALUE)\n        {\n            OVR_ASSERT(false);\n            LogError(\"{ERR-103} [FrameTime] Invalid hmdToEyeViewOffset provided by client.\");\n\n            // disable position to avoid positional issues\n            renderPose.Position = Vector3f::Zero();\n            startHmdPose.Position = Vector3f::Zero();\n            endHmdPose.Position = Vector3f::Zero();\n        }\n        else\n        {\n            // Currently HmdToEyeViewOffset is only a 3D vector\n            // (Negate HmdToEyeViewOffset because offset is a view matrix offset and not a camera offset)\n            eyeOffset = ((Posef)startHmdPose).Apply(-((Vector3f)hmdToEyeViewOffset[eyeId]));\n        }\n\n        Posef fromEye = Posef(renderPose).Inverted();   // because we need the view matrix, not the camera matrix\n        CalculatePositionalTimewarpMatrix(fromEye, startHmdPose, eyeOffset, timewarpStart);\n        CalculatePositionalTimewarpMatrix(fromEye,   endHmdPose, eyeOffset, timewarpEnd);\n    }\n    else\n    {\n        Quatf fromEye = Quatf(renderPose.Orientation).Inverted();   // because we need the view matrix, not the camera matrix\n        CalculateOrientationTimewarpMatrix(fromEye, startHmdPose.Orientation, timewarpStart);\n        CalculateOrientationTimewarpMatrix(fromEye,   endHmdPose.Orientation, timewarpEnd);\n    }\n    twmOut[0] = timewarpStart;\n    twmOut[1] = timewarpEnd;\n}\n\nvoid HMDState::GetTimewarpMatrices(ovrEyeType eyeId, ovrPosef renderPose,\n                                   ovrMatrix4f twmOut[2])\n{\n    // Get timewarp start/end timing\n    double timewarpStartEnd[2];\n    getTimewarpStartEnd(eyeId, timewarpStartEnd);\n\n    ovrTrackingState startState = PredictedTrackingState(timewarpStartEnd[0]);\n    ovrTrackingState endState   = PredictedTrackingState(timewarpStartEnd[1]);\n\n    Quatf quatFromEye = Quatf(renderPose.Orientation);\n    quatFromEye.Invert();   // because we need the view matrix, not the camera matrix\n\n    Matrix4f timewarpStart, timewarpEnd;\n    CalculateOrientationTimewarpMatrix(\n        quatFromEye, startState.HeadPose.ThePose.Orientation, timewarpStart);\n    CalculateOrientationTimewarpMatrix(\n        quatFromEye, endState.HeadPose.ThePose.Orientation, timewarpEnd);\n\n    twmOut[0] = timewarpStart;\n    twmOut[1] = timewarpEnd;\n}\n\n\n//-------------------------------------------------------------------------------------\n// *** Rendering\n\nbool HMDState::ConfigureRendering(ovrEyeRenderDesc eyeRenderDescOut[2],\n                                  const ovrFovPort eyeFovIn[2],\n                                  const ovrRenderAPIConfig* apiConfig,                                  \n                                  unsigned distortionCaps)\n{\n    ThreadChecker::Scope checkScope(&RenderAPIThreadChecker, \"ovrHmd_ConfigureRendering\");\n\n    // null -> shut down.\n    if (!apiConfig)\n    {\n        if (pHSWDisplay)\n        {\n            pHSWDisplay->Shutdown();\n            pHSWDisplay.Clear();\n        }\n\n        if (pRenderer)\n            pRenderer.Clear();        \n        RenderingConfigured = false; \n        return true;\n    }\n\n    if (pRenderer &&\n        (apiConfig->Header.API != pRenderer->GetRenderAPI()))\n    {\n        // Shutdown old renderer.\n        if (pHSWDisplay)\n        {\n            pHSWDisplay->Shutdown();\n            pHSWDisplay.Clear();\n        }\n\n        if (pRenderer)\n            pRenderer.Clear();\n    }\n\n    distortionCaps = distortionCaps & pHmdDesc->DistortionCaps;\n\n    // Step 1: do basic setup configuration\n    RenderState.EnabledHmdCaps = EnabledHmdCaps;     // This is a copy... Any cleaner way?\n    RenderState.DistortionCaps = distortionCaps;\n    RenderState.EyeRenderDesc[0] = RenderState.CalcRenderDesc(ovrEye_Left,  eyeFovIn[0]);\n    RenderState.EyeRenderDesc[1] = RenderState.CalcRenderDesc(ovrEye_Right, eyeFovIn[1]);\n    eyeRenderDescOut[0] = RenderState.EyeRenderDesc[0];\n    eyeRenderDescOut[1] = RenderState.EyeRenderDesc[1];\n\n    // Set RenderingConfigured early to avoid ASSERTs in renderer initialization.\n    RenderingConfigured = true;\n\n    if (!pRenderer)\n    {\n        pRenderer = *DistortionRenderer::APICreateRegistry\n                        [apiConfig->Header.API]();\n    }\n\n    if (!pRenderer ||\n        !pRenderer->Initialize(apiConfig, &TheTrackingStateReader,\n                               &TimewarpTimer, &RenderState))\n    {\n        RenderingConfigured = false;\n        return false;\n    }\n\n    // Setup the Health and Safety Warning display system.\n    if(pHSWDisplay && (pHSWDisplay->GetRenderAPIType() != apiConfig->Header.API)) // If we need to reconstruct the HSWDisplay for a different graphics API type, delete the existing display.\n    {\n        pHSWDisplay->Shutdown();\n        pHSWDisplay.Clear();\n    }\n\n    if(!pHSWDisplay) // Use * below because that for of operator= causes it to inherit the refcount the factory gave the object.\n    {\n        pHSWDisplay = *OVR::CAPI::HSWDisplay::Factory(apiConfig->Header.API, pHmdDesc, RenderState);\n    }\n\n    if (pHSWDisplay)\n    {\n        pHSWDisplay->Initialize(apiConfig); // This is potentially re-initializing it with a new config.\n    }\n\n#ifdef OVR_OS_WIN32\n    if (!pWindow)\n    {\n        // We can automatically populate the window to attach to by\n        // pulling that information off the swap chain that the\n        // application provides.  If the application later calls the\n        // ovrHmd_AttachToWindow() function these will get harmlessly\n        // overwritten.  The check above verifies that the window is\n        // not set yet, and it insures that this default doesn't\n        // overwrite the application setting.\n\n        if (apiConfig->Header.API == ovrRenderAPI_D3D11)\n        {\n            ovrD3D11Config* d3d11Config = (ovrD3D11Config*)apiConfig;\n            if (d3d11Config->D3D11.pSwapChain)\n            {\n                DXGI_SWAP_CHAIN_DESC desc = {};\n                HRESULT hr = d3d11Config->D3D11.pSwapChain->GetDesc(&desc);\n                if (SUCCEEDED(hr))\n                {\n                    pWindow = (void*)desc.OutputWindow;\n                }\n            }\n        }\n        else if (apiConfig->Header.API == ovrRenderAPI_OpenGL)\n        {\n            ovrGLConfig* glConfig = (ovrGLConfig*)apiConfig;\n            pWindow = (void*)glConfig->OGL.Window;\n        }\nOVR_DISABLE_MSVC_WARNING(4996) // Disable deprecation warning\n        else if (apiConfig->Header.API == ovrRenderAPI_D3D9)\n        {\n            ovrD3D9Config* dx9Config = (ovrD3D9Config*)apiConfig;\n            if (dx9Config->D3D9.pDevice)\n            {\n                D3DDEVICE_CREATION_PARAMETERS  params = {};\n                HRESULT hr = dx9Config->D3D9.pDevice->GetCreationParameters(&params);\n                if (SUCCEEDED(hr))\n                {\n                    pWindow = (void*)params.hFocusWindow;\n                }\n            }\n        }\nOVR_RESTORE_MSVC_WARNING()\n\n        // If a window handle was implied by render configuration,\n        if (pWindow)\n        {\n            // This is the same logic as ovrHmd_AttachToWindow() on Windows:\n            if (pClient)\n                pClient->Hmd_AttachToWindow(GetNetId(), pWindow);\n            Win32::DisplayShim::GetInstance().hWindow = (HWND)pWindow;\n            // On the server side it is updating the association of connection\n            // to window handle.  This is perfectly safe to update later to\n            // a new window handle (verified).  Also verified that if this\n            // handle is garbage that it doesn't crash anything.\n        }\n    }\n#endif\n\n    return true;\n}\n\n\nvoid  HMDState::SubmitEyeTextures(const ovrPosef renderPose[2],\n                                  const ovrTexture eyeTexture[2],\n                                  const ovrTexture eyeDepthTexture[2])\n{\n    RenderState.EyeRenderPoses[0] = renderPose[0];\n    RenderState.EyeRenderPoses[1] = renderPose[1];\n\n    if (pRenderer)\n    {\n        if(eyeDepthTexture)\n        {\n            pRenderer->SubmitEyeWithDepth(0, &eyeTexture[0], &eyeDepthTexture[0]);\n            pRenderer->SubmitEyeWithDepth(1, &eyeTexture[1], &eyeDepthTexture[1]);\n        }\n        else\n        {\n            //OVR_ASSERT(!(RenderState.DistortionCaps & ovrDistortionCap_DepthProjectedTimeWarp));\n            //LogError(\"{ERR-104} [HMDState] Even though ovrDistortionCap_DepthProjectedTimeWarp is enabled, no depth buffer was provided.\");\n\n        pRenderer->SubmitEye(0, &eyeTexture[0]);\n        pRenderer->SubmitEye(1, &eyeTexture[1]);\n    }\n}\n}\n\nbool  HMDState::CreateDistortionMesh(ovrEyeType eyeType, ovrFovPort fov,\n                                     unsigned int distortionCaps,\n                                     ovrDistortionMesh *meshData,\n                                     float overrideEyeReliefIfNonZero)\n{\n    const HmdRenderInfo& hmdri = RenderState.RenderInfo;\n\n    DistortionRenderDesc& distortion = RenderState.Distortion[eyeType];\n    if (overrideEyeReliefIfNonZero)\n    {\n        distortion.Lens = GenerateLensConfigFromEyeRelief(overrideEyeReliefIfNonZero, hmdri);\n    }\n\n    if (CalculateDistortionMeshFromFOV(\n            hmdri, distortion,\n            (eyeType == ovrEye_Left ? StereoEye_Left : StereoEye_Right),\n            fov, distortionCaps, meshData))\n    {\n        return 1;\n    }\n\n    return 0;\n}\n\n\n}} // namespace OVR::CAPI\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/CAPI_HMDState.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_HMDState.h\nContent     :   State associated with a single HMD\nCreated     :   January 24, 2014\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_HMDState_h\n#define OVR_CAPI_HMDState_h\n\n#include \"Extras/OVR_Math.h\"\n#include \"Kernel/OVR_List.h\"\n#include \"Kernel/OVR_Log.h\"\n#include \"OVR_CAPI.h\"\n\n#include \"CAPI_FrameTimeManager3.h\"\n#include \"CAPI_FrameLatencyTracker.h\"\n\n#include \"CAPI_HMDRenderState.h\"\n#include \"CAPI_DistortionRenderer.h\"\n#include \"CAPI_HSWDisplay.h\"\n\n#include \"Service/Service_NetClient.h\"\n#include \"Net/OVR_NetworkTypes.h\"\n#include \"Util/Util_LatencyTest2Reader.h\"\n\n\nstruct ovrHmdStruct { };\n\nnamespace OVR { namespace CAPI {\n\n\nusing namespace OVR::Util::Render;\nusing namespace OVR::Service;\nusing namespace OVR::Net;\n\n\n//-------------------------------------------------------------------------------------\n// ***** ThreadChecker\n\n// This helper class is used to verify that the API is used according to supported\n// thread safety constraints (is not re-entrant for this and related functions).\nclass ThreadChecker\n{\npublic:\n\n#ifndef OVR_BUILD_DEBUG\n\n    // In release build, thread checks are disabled.\n    ThreadChecker() { }\n    void Begin(const char* functionName)    { OVR_UNUSED1(functionName); }\n    void End()                              {  }\n\n    // Add thread-re-entrancy check for function scope\n    struct Scope\n    {\n        Scope(ThreadChecker*, const char *) { }\n        ~Scope() { }\n    };\n\n\n#else // OVR_BUILD_DEBUG\n    ThreadChecker() : pFunctionName(0), FirstThread(0)\n    { }\n\n    void Begin(const char* functionName)\n    {        \n        if (!pFunctionName)\n        {\n            pFunctionName = functionName;\n            FirstThread   = GetCurrentThreadId();\n        }\n        else\n        {\n            // pFunctionName may be not null here if function is called internally on the same thread.\n            OVR_ASSERT_LOG((FirstThread == GetCurrentThreadId()),\n                (\"%s (threadId=%p) called at the same times as %s (threadId=%p)\\n\",\n                functionName, GetCurrentThreadId(), pFunctionName, FirstThread) );\n        }        \n    }\n    void End()\n    {\n        pFunctionName = 0;\n        FirstThread   = 0;\n    }\n\n    // Add thread-reentrancy check for function scope.\n    struct Scope\n    {\n        Scope(ThreadChecker* threadChecker, const char *functionName) : pChecker(threadChecker)\n        { pChecker->Begin(functionName); }\n        ~Scope()\n        { pChecker->End(); }\n    private:\n        ThreadChecker* pChecker;\n    };\n\nprivate:\n    // If not 0, contains the name of the function that first entered the scope.\n    const char * pFunctionName;\n    ThreadId     FirstThread;\n\n#endif // OVR_BUILD_DEBUG\n};\n\n\n//-------------------------------------------------------------------------------------\n// ***** HMDState\n\n// Describes a single HMD.\nclass HMDState : public ListNode<HMDState>,\n                 public ovrHmdStruct, public NewOverrideBase \n{\n    void operator=(const HMDState&) { } // Quiet warning.\n\nprotected:   \n    HMDState(HMDInfo const & hmdInfo,\n             Profile* profile,\n             Service::HMDNetworkInfo const * netInfo = nullptr,\n             Service::NetClient* client = nullptr);\n\npublic:   \n    virtual ~HMDState();\n\n    static HMDState* CreateHMDState(Service::NetClient* client, const HMDNetworkInfo& netInfo);\n    static HMDState* CreateDebugHMDState(ovrHmdType hmdType); // Used for debug mode\n\n    // Call the optional provided callback for each open HMD, stopping when the callback returns false.\n    // Return a count of the enumerated HMDStates. Note that this may deadlock if ovrHmd_Create/Destroy\n    // are called from the callback.\n    static unsigned EnumerateHMDStateList(bool (*callback)(const HMDState *state));\n\n    bool InitializeSharedState();\n\n    // *** Sensor Setup\n\n    bool            ConfigureTracking(unsigned supportedCaps, unsigned requiredCaps);    \n    void            ResetTracking(bool visionReset);\n    void            RecenterPose();\n    ovrTrackingState PredictedTrackingState(double absTime, void* unused = nullptr);\n\n    // Changes HMD Caps.\n    // Capability bits that are not directly or logically tied to one system (such as sensor)\n    // are grouped here. ovrHmdCap_VSync, for example, affects rendering and timing.\n    void            SetEnabledHmdCaps(unsigned caps);\n    unsigned        SetEnabledHmdCaps();\n\n    bool            ProcessLatencyTest(unsigned char rgbColorOut[3]);\n\n    // *** Rendering Setup\n    bool        ConfigureRendering(ovrEyeRenderDesc eyeRenderDescOut[2],\n                                   const ovrFovPort eyeFovIn[2],\n                                   const ovrRenderAPIConfig* apiConfig,                                  \n                                   unsigned distortionCaps);  \n    \n    void        UpdateRenderProfile(Profile* profile);\n\n\n    void        SubmitEyeTextures(const ovrPosef renderPose[2],\n                                  const ovrTexture eyeTexture[2],\n                                  const ovrTexture eyeDepthTexture[2]);\n\n    void applyProfileToSensorFusion();\n\n    // INlines so that they can be easily compiled out.    \n    // Does debug ASSERT checks for functions that require BeginFrame.\n    // Also verifies that we are on the right thread.\n    void checkBeginFrameScope(const char* functionName)\n    {\n        OVR_UNUSED1(functionName); // for Release build.\n        OVR_ASSERT_LOG(BeginFrameCalled == true,\n                       (\"%s called outside ovrHmd_BeginFrame.\", functionName));\n        OVR_DEBUG_LOG_COND(BeginFrameThreadId != OVR::GetCurrentThreadId(),\n                       (\"%s called on a different thread then ovrHmd_BeginFrame.\", functionName));\n    }\n\n    void checkRenderingConfigured(const char* functionName)\n    {\n        OVR_UNUSED1(functionName); // for Release build.\n        OVR_ASSERT_LOG(RenderingConfigured == true,\n                       (\"%s called without ovrHmd_ConfigureRendering.\", functionName));\n    }\n\n    void checkBeginFrameTimingScope(const char* functionName)\n    {\n        OVR_UNUSED1(functionName); // for Release build.\n        OVR_ASSERT_LOG(BeginFrameTimingCalled == true,\n                       (\"%s called outside ovrHmd_BeginFrameTiming.\", functionName));\n    }\n\n    // Get properties by name.\n    bool     getBoolValue(const char* propertyName, bool defaultVal);\n    bool     setBoolValue(const char* propertyName, bool value);\n    int      getIntValue(const char* propertyName, int defaultVal);\n    bool     setIntValue(const char* propertyName, int value);\n    float    getFloatValue(const char* propertyName, float defaultVal);\n    bool     setFloatValue(const char* propertyName, float value);\n    unsigned getFloatArray(const char* propertyName, float values[], unsigned arraySize);\n    bool     setFloatArray(const char* propertyName, float values[], unsigned arraySize);\n    const char* getString(const char* propertyName, const char* defaultVal);\n    bool        setString(const char* propertyName, const char* value);\n\n    VirtualHmdId GetNetId() { return NetId; }\n\npublic:\n    // Distortion mesh creation\n    bool    CreateDistortionMesh(ovrEyeType eyeType, ovrFovPort fov,\n                                 unsigned int distortionCaps,\n                                 ovrDistortionMesh *meshData,\n                                 float overrideEyeReliefIfNonZero);\n\n    AppTiming        GetAppTiming(uint32_t frameIndex);\n    ovrFrameTiming   GetFrameTiming(uint32_t frameIndex);\n    ovrTrackingState GetMidpointPredictionTracking(uint32_t frameIndex);\n    Posef            GetEyePredictionPose(ovrEyeType eye);\n\n    void    GetTimewarpMatricesEx(ovrEyeType eye, ovrPosef renderPose,\n                                  bool usePosition, const ovrVector3f hmdToEyeViewOffset[2], ovrMatrix4f twmOut[2], \n                                  double debugTimingOffsetInSeconds = 0.0);\n    void    GetTimewarpMatrices(ovrEyeType eyeId, ovrPosef renderPose,\n                                ovrMatrix4f twmOut[2]);\n\n    // Render timing\n    void getTimewarpStartEnd(ovrEyeType eyeId, double timewarpStartEnd[2]);\n    void endFrameRenderTiming();\n\n    DistortionTimer         TimewarpTimer;         // Timing for timewarp rendering\n    AppRenderTimer          RenderTimer;           // Timing for eye rendering\n    AppTimingHistory        TimingHistory;         // History of predicted scanout times\n    double                  RenderIMUTimeSeconds;  // IMU Read timings\n\npublic:\n    Ptr<Profile>            pProfile;\n    // Descriptor that gets allocated and returned to the user as ovrHmd.\n    ovrHmdDesc*             pHmdDesc;\n    // Window handle passed in AttachWindow.\n    void*                   pWindow;\n\n    // Network\n    Service::NetClient*     pClient;\n    VirtualHmdId            NetId;\n    HMDNetworkInfo          NetInfo;\n\n    // HMDInfo shouldn't change, as its string pointers are passed out.    \n    HMDInfo                 OurHMDInfo;\n\n    const char*             pLastError;\n\n    // Caps enabled for the HMD.\n    unsigned                EnabledHmdCaps;\n    \n    // Caps actually sent to the Sensor Service\n    unsigned                EnabledServiceHmdCaps;\n    \n    // These are the flags actually applied to the Sensor device,\n    // used to track whether SetDisplayReport calls are necessary.\n    //unsigned                HmdCapsAppliedToSensor;\n    \n    // *** Sensor\n    SharedObjectReader<Vision::CombinedHmdUpdater> CombinedHmdReader;\n    SharedObjectReader<Vision::CameraStateUpdater> CameraReader;\n\n\n    Vision::TrackingStateReader       TheTrackingStateReader;\n    Util::RecordStateReader           TheLatencyTestStateReader;\n\n    bool                    LatencyTestActive;\n    unsigned char           LatencyTestDrawColor[3];\n\n    bool                    LatencyTest2Active;\n    unsigned char           LatencyTest2DrawColor[3];\n\n    // Rendering part\n    FrameLatencyTracker     ScreenLatencyTracker;\n    HMDRenderState          RenderState;\n    Ptr<DistortionRenderer> pRenderer;\n\n    // Health and Safety Warning display.\n    Ptr<HSWDisplay>         pHSWDisplay;\n\n    // Last cached value returned by ovrHmd_GetString/ovrHmd_GetStringArray.\n    char                    LastGetStringValue[256];\n   \n    // Debug flag set after ovrHmd_ConfigureRendering succeeds.\n    bool                    RenderingConfigured;\n    // Set after BeginFrame succeeds, and its corresponding thread id for debug checks.\n    bool                    BeginFrameCalled;\n    ThreadId                BeginFrameThreadId;\n    uint32_t                BeginFrameIndex;\n    // Graphics functions are not re-entrant from other threads.\n    ThreadChecker           RenderAPIThreadChecker;\n    // Has BeginFrameTiming() or BeginFrame() been called?\n    bool                    BeginFrameTimingCalled;\n};\n\n\n}} // namespace OVR::CAPI\n\n#endif // OVR_CAPI_HMDState_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/CAPI_HSWDisplay.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_HSWDisplay.cpp\nContent     :   Implements Health and Safety Warning system.\nCreated     :   July 3, 2014\nAuthors     :   Paul Pedriana\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_HSWDisplay.h\"\n#include \"CAPI_HMDState.h\"\n#include \"Kernel/OVR_Log.h\"\n#include \"Kernel/OVR_String.h\"\n#include \"Textures/healthAndSafety.tga.h\" // TGA file as a C array declaration.\n\n//-------------------------------------------------------------------------------------\n// ***** HSWDISPLAY_DEBUGGING\n//\n// Defined as 0 or 1. Enables debugging features of this module.\n\n#if !defined(HSWDISPLAY_DEBUGGING)\n    #if defined(AUTHOR_PPEDRIANA)\n        #define HSWDISPLAY_DEBUGGING 1\n    #else\n        #define HSWDISPLAY_DEBUGGING 0\n    #endif\n#endif\n\n#if HSWDISPLAY_DEBUGGING\n    OVR_DISABLE_ALL_MSVC_WARNINGS()\n    #include \"Kernel/OVR_Win32_IncludeWindows.h\"\n    OVR_RESTORE_ALL_MSVC_WARNINGS()\n#endif\n\nOVR_DISABLE_MSVC_WARNING(4996) // \"This function or variable may be unsafe...\"\n\n\n//-------------------------------------------------------------------------------------\n// ***** HSWDISPLAY_DEFAULT_ENABLED\n//\n// Defined as 0 or 1. 1 is default. If 0 then by default HSWDisplay is disabled.\n// Developers can set it to 0 to disable HSW display.\n//\n#if !defined(HSWDISPLAY_DEFAULT_ENABLED)\n    #define HSWDISPLAY_DEFAULT_ENABLED 1\n#endif\n\n\n\n\n//-------------------------------------------------------------------------------------\n// ***** HSWDisplay implementation\n//\n\nnamespace OVR { namespace CAPI {\n\n\nstatic const time_t HSWDisplayTimeNever = (time_t)0; // Constant which denotes the time of \"never\", as in the display has never been shown yet.\n\n#define HSWDISPLAY_POLL_INTERVAL            0.400 // Seconds between polling for whether the display should be shown.\n#define OVR_KEY_HSWDISPLAYLASTDISPLAYEDTIME \"HASWLastDisplayedTime\"\n\n\n#if defined(OVR_BUILD_DEBUG)\n    #define HSWDISPLAY_FIRST_DISMISSAL_TIME    4     // Earliest time in seconds until the user can dismiss the display.\n    #define HSWDISPLAY_REGULAR_DISMISSAL_TIME  2\n#else\n    #define HSWDISPLAY_FIRST_DISMISSAL_TIME   15\n    #define HSWDISPLAY_REGULAR_DISMISSAL_TIME  6\n#endif\n\n\nHSWDisplay::HSWDisplay(ovrRenderAPIType renderAPIType, ovrHmd hmd, const HMDRenderState& hmdRenderState)\n  : Enabled(HSWDISPLAY_DEFAULT_ENABLED ? true : false),\n    Displayed(false),\n    SDKRendered(false),\n    DismissRequested(false),\n    RenderEnabled(true),\n    UnloadGraphicsRequested(false),\n    StartTime(0.0),\n    DismissibleTime(0.0),\n    LastPollTime(0.0),\n    HMD(hmd), \n    HMDMounted(false),\n    HMDNewlyMounted(false),\n    RenderAPIType(renderAPIType), \n    RenderState(hmdRenderState),\n    LastProfileName(),\n    LastHSWTime(0)\n{\n    HMDState* pHMDState = (HMDState*)HMD->Handle;\n\n    if(pHMDState)\n    {\n        if(pHMDState->pHmdDesc->HmdCaps & ovrHmdCap_DebugDevice)\n            Enabled = false;\n        else if(pHMDState->pProfile)\n            Enable(pHMDState->pProfile->GetBoolValue(\"HSW\", true));\n    }\n}\n\n\nHSWDisplay::~HSWDisplay()\n{\n    // To consider: assert that we are already shut down.\n    HSWDisplay::Shutdown();\n}\n\n\nvoid HSWDisplay::Enable(bool enable)\n{\n    Enabled = enable;\n\n    if(!enable && Displayed) // If it's visible but should not be...\n        Dismiss();\n}\n\n\nvoid HSWDisplay::EnableRender(bool enable)\n{\n    RenderEnabled = enable;\n}\n\n\nvoid HSWDisplay::Display()\n{\n    HSWDISPLAY_LOG((\"[HSWDisplay] Display()\"));\n\n    DisplayInternal();\n\n    HMDNewlyMounted = false;\n    Displayed = true;\n    SDKRendered = RenderEnabled;\n    StartTime = ovr_GetTimeInSeconds();\n\n    const time_t lastDisplayedTime = HSWDisplay::GetCurrentProfileLastHSWTime();\n    DismissibleTime = StartTime + ((lastDisplayedTime == HSWDisplayTimeNever) ? HSWDISPLAY_FIRST_DISMISSAL_TIME : HSWDISPLAY_REGULAR_DISMISSAL_TIME);\n\n    SetCurrentProfileLastHSWTime(time(NULL));\n}\n\n\nbool HSWDisplay::IsDisplayViewable() const\n{\n    // This function is called IsDisplayViewable, but currently it refers only to whether the \n    // HMD is mounted on the user's head.\n\n    return HMDMounted;\n}\n\n\nbool HSWDisplay::Dismiss()\n{\n    #if HSWDISPLAY_DEBUGGING && defined(OVR_OS_WIN32)\n        if(GetKeyState(VK_SCROLL) & 0x0001) // If the scroll lock key is toggled on...\n            return false;                   // Make it so that the display doesn't dismiss, so we can debug this.\n    #endif\n\n    // If dismissal is not requested yet, mark it as such.\n    bool newlyRequested = false;\n\n    if(!DismissRequested)\n    {\n        DismissRequested = true;\n        newlyRequested = true;\n    }\n\n    // If displayed and time has elapsed, do the dismissal.\n    OVR_ASSERT(DismissibleTime <= (ovr_GetTimeInSeconds() + HSWDISPLAY_FIRST_DISMISSAL_TIME)); // Make sure the dismissal time is sane.\n    if (Displayed && (ovr_GetTimeInSeconds() >= DismissibleTime))\n    {\n        DismissInternal();\n        Displayed = false;\n        DismissRequested = false;\n        SDKRendered = false;\n        return true;\n    }\n\n    if(newlyRequested)\n        { HSWDISPLAY_LOG((\"[HSWDisplay] Dismiss(): Not permitted yet. Queued for timeout in %.1f seconds.\", DismissibleTime - ovr_GetTimeInSeconds())); }\n\n    return false; // Cannot dismiss yet.\n}\n\n\nbool HSWDisplay::TickState(ovrHSWDisplayState *hswDisplayState, bool graphicsContext)\n{\n    bool newlyDisplayed = false;\n    const double currentTime = ovr_GetTimeInSeconds();\n\n    // See if we need to be currently displayed. By design we automatically display but don't automatically dismiss.\n    if (Displayed)\n    {\n        if (DismissRequested) // If dismiss was previously requested, see if it can be executed.\n            Dismiss();\n\n        if (Displayed) // If not already dismissed above...\n        {\n            // We currently have the debug behavior that we permit dismiss very soon after launch.\n            #if defined(OVR_BUILD_DEBUG)\n                if(currentTime >= (StartTime + 2))\n                {\n                    DismissibleTime = StartTime;\n                    //Dismiss();\n                }\n            #endif\n        }\n\n        if (Displayed) // If not already dismissed above...\n        {\n            const ovrTrackingState ts = ((OVR::CAPI::HMDState*)HMD->Handle)->PredictedTrackingState(currentTime);\n\n            if (ts.StatusFlags & ovrStatus_OrientationTracked) // If the Accelerometer data is valid...\n            {\n\t\t\t\tconst OVR::Vector3f v(ts.HeadPose.LinearAcceleration.x, ts.HeadPose.LinearAcceleration.y, ts.HeadPose.LinearAcceleration.z);\n\n                const float minTapMagnitude = 350.0f; // Empirically determined by some testing.\n\n                if (v.LengthSq() > minTapMagnitude)\n                    Dismiss(); // This will do nothing if the display is not present.\n            }\n        }\n    }\n    else if (Enabled && (currentTime >= (LastPollTime + HSWDISPLAY_POLL_INTERVAL)))\n    {\n        LastPollTime = currentTime;\n\n        // We need to display if any of the following are true:\n        //     - The application is just started in Event Mode while the HMD is mounted (warning display would be viewable) and this app was not spawned from a launcher.\n        //     - The current user has never seen the display yet while the HMD is mounted (warning display would be viewable).\n        //     - The HMD is newly mounted (or the warning display is otherwise newly viewable).\n        //     - The warning display hasn't shown in 24 hours (need to verify this as a requirement).\n        // Event Mode refers to when the app is being run in a public demo event such as a trade show.\n\n        OVR::CAPI::HMDState* pHMDState = (OVR::CAPI::HMDState*)HMD->Handle;\n\n        if(pHMDState)\n        {\n            const time_t lastDisplayedTime = HSWDisplay::GetCurrentProfileLastHSWTime();\n\n            // We currently unilaterally set HMDMounted to true because we don't yet have the ability to detect this. To do: Implement this when possible.\n            const bool previouslyMounted = HMDMounted;\n            HMDMounted = true;\n            HMDNewlyMounted = (!previouslyMounted && HMDMounted); // We set this back to false in the Display function or if the HMD is unmounted before then.\n\n            if((lastDisplayedTime == HSWDisplayTimeNever) || HMDNewlyMounted)\n            {\n                if(IsDisplayViewable()) // If the HMD is mounted and otherwise being viewed by the user...\n                {\n                    Display();\n                    newlyDisplayed = true;\n                }\n            }\n        }\n    }\n    else if(graphicsContext && UnloadGraphicsRequested)\n    {\n        UnloadGraphics();\n        UnloadGraphicsRequested = false;\n    }\n\n    if(hswDisplayState)\n        GetState(hswDisplayState);\n\n    return newlyDisplayed;\n}\n\n\nvoid HSWDisplay::GetState(ovrHSWDisplayState *hswDisplayState) const\n{\n    // Return the state to the caller.\n    OVR_ASSERT(hswDisplayState != NULL);\n    if(hswDisplayState)\n    {\n        hswDisplayState->Displayed = Displayed;\n        hswDisplayState->StartTime = StartTime;\n        hswDisplayState->DismissibleTime = DismissibleTime;\n    }\n}\n\n\nvoid HSWDisplay::Render(ovrEyeType eye, const ovrTexture* eyeTexture)\n{\n    SDKRendered = true;\n    RenderInternal(eye, eyeTexture);\n}\n\n// Persist the HSW settings on the server, since it needs to be synchronized across all applications.\n// Note that the profile manager singleton cannot be used for this task because it overwrites the global\n// settings for which the rift config tool is supposed to be authoritative.  That also would step on the\n// settings generated by other rift apps.  The server settings, however, are synchronized for all apps\n// and so are appropriate for this task.\nstatic String getHSWTimeKey(const char* userName)\n{\n    String keyName = \"server:\";\n    keyName += OVR_KEY_HSWDISPLAYLASTDISPLAYEDTIME;\n    keyName += \":\";\n    if (userName)\n    {\n        keyName += userName;\n    }\n    return keyName;\n}\n\n// Returns HSWDisplayTimeNever (0) if there is no profile or this is the first time we are seeing this profile.\ntime_t HSWDisplay::GetCurrentProfileLastHSWTime() const\n{\n    // We store the timeout value in HMDState's pProfile.\n    HMDState* pHMDState = (HMDState*)HMD->Handle;\n\n    if (pHMDState)\n    {\n        const char* profileName = pHMDState->pProfile ? pHMDState->pProfile->GetValue(OVR_KEY_USER) : NULL;\n\n        if (profileName)\n        {\n            if (LastProfileName == profileName)\n            {\n                return LastHSWTime;\n            }\n\n            LastProfileName = profileName;\n            String timeKey = getHSWTimeKey(profileName);\n            int lastTime = pHMDState->getIntValue(timeKey.ToCStr(), (int)HSWDisplayTimeNever);\n\n            LastHSWTime = lastTime;\n            return lastTime;\n        }\n    }\n\n    return HSWDisplayTimeNever;\n}\n\nvoid HSWDisplay::SetCurrentProfileLastHSWTime(time_t t)\n{\n    // The timeout value is stored in HMDState's pProfile.\n    HMDState* pHMDState = (HMDState*)HMD->Handle;\n\n    if (pHMDState)\n    {\n        const char* profileName = pHMDState->pProfile ? pHMDState->pProfile->GetValue(OVR_KEY_USER) : NULL;\n\n        if (profileName)\n        {\n            LastProfileName = profileName;\n            LastHSWTime = (int)t;\n\n            String timeKey = getHSWTimeKey(profileName);\n            pHMDState->setIntValue(timeKey.ToCStr(), (int)t);\n        }\n    }\n}\n\n\n// Generates an appropriate stereo ortho projection matrix.\nvoid HSWDisplay::GetOrthoProjection(const HMDRenderState& renderState, Matrix4f orthoProjection[2])\n{\n    Matrix4f perspectiveProjection[2];\n    unsigned int projectionModifier = ovrProjection_RightHanded | ((RenderAPIType == ovrRenderAPI_OpenGL) ? ovrProjection_ClipRangeOpenGL : 0);\n    perspectiveProjection[0] = ovrMatrix4f_Projection(renderState.EyeRenderDesc[0].Fov, 0.01f, 10000.f, projectionModifier);\n    perspectiveProjection[1] = ovrMatrix4f_Projection(renderState.EyeRenderDesc[1].Fov, 0.01f, 10000.f, projectionModifier);\n\n    const float    orthoDistance = HSWDISPLAY_DISTANCE; // This is meters from the camera (viewer) that we place the ortho plane.\n    const Vector2f orthoScale0   = Vector2f(1.f) / Vector2f(renderState.EyeRenderDesc[0].PixelsPerTanAngleAtCenter);\n    const Vector2f orthoScale1   = Vector2f(1.f) / Vector2f(renderState.EyeRenderDesc[1].PixelsPerTanAngleAtCenter);\n    \n    orthoProjection[0] = ovrMatrix4f_OrthoSubProjection(perspectiveProjection[0], orthoScale0, orthoDistance, renderState.EyeRenderDesc[0].HmdToEyeViewOffset.x);\n    orthoProjection[1] = ovrMatrix4f_OrthoSubProjection(perspectiveProjection[1], orthoScale1, orthoDistance, renderState.EyeRenderDesc[1].HmdToEyeViewOffset.x);\n}\n\n\nconst uint8_t* HSWDisplay::GetDefaultTexture(size_t& TextureSize)\n{\n    TextureSize = sizeof(healthAndSafety_tga);\n    return healthAndSafety_tga;\n}\n\n\n\n}} // namespace OVR::CAPI\n\n\n\n\n//-------------------------------------------------------------------------------------\n// ***** HSWDisplay factory\n//\n\n#if defined (OVR_OS_WIN32)\n    #include \"D3D9/CAPI_D3D9_HSWDisplay.h\"\n    #include \"D3D1X/CAPI_D3D11_HSWDisplay.h\"\n#endif\n\n#include \"GL/CAPI_GL_HSWDisplay.h\"\n\n\nOVR::CAPI::HSWDisplay* OVR::CAPI::HSWDisplay::Factory(ovrRenderAPIType apiType, ovrHmd hmd, const OVR::CAPI::HMDRenderState& renderState)\n{\n    OVR::CAPI::HSWDisplay* pHSWDisplay = NULL;\n\n    switch (apiType)\n    {\n        case ovrRenderAPI_None:\n            pHSWDisplay = new OVR::CAPI::HSWDisplay(apiType, hmd, renderState);\n            break;\n\n        case ovrRenderAPI_OpenGL:\n            pHSWDisplay = new OVR::CAPI::GL::HSWDisplay(apiType, hmd, renderState);\n            break;\n\n    #if defined(OVR_OS_WIN32)\n        case ovrRenderAPI_D3D9:\n            pHSWDisplay = new OVR::CAPI::D3D9::HSWDisplay(apiType, hmd, renderState);\n            break;\n\n        case ovrRenderAPI_D3D11:\n            pHSWDisplay = new OVR::CAPI::D3D11::HSWDisplay(apiType, hmd, renderState);\n            break;\n    #else\n        case ovrRenderAPI_D3D9:\n        case ovrRenderAPI_D3D10:\n        case ovrRenderAPI_D3D11: // Fall through\n    #endif\n\n        // Handle unsupported cases.\n        case ovrRenderAPI_Android_GLES:\n        case ovrRenderAPI_Count: // This is not actually a type.\n        default:\n            break;\n    }\n\n    return pHSWDisplay;\n}\n\n\n\n\n\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/CAPI_HSWDisplay.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_HSWDisplay.h\nContent     :   Implements Health and Safety Warning system.\nCreated     :   July 3, 2014\nAuthors     :   Paul Pedriana\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_HSWDisplay_h\n#define OVR_CAPI_HSWDisplay_h\n\n#include \"OVR_CAPI.h\"\n#include \"CAPI_HMDRenderState.h\"\n#include <time.h>\n\n\n\n//-------------------------------------------------------------------------------------\n// ***** HSWDISPLAY_LOG\n//\n// Debug log wrapper.\n\n#if !defined(HSWDISPLAY_LOG_ENABLED)\n    #ifdef OVR_BUILD_DEBUG\n        #define HSWDISPLAY_LOG_ENABLED 1\n    #else\n        #define HSWDISPLAY_LOG_ENABLED 0\n    #endif\n#endif\n\n#if HSWDISPLAY_LOG_ENABLED\n    #define HSWDISPLAY_LOG(...) OVR_DEBUG_LOG(__VA_ARGS__)\n#else\n    #define HSWDISPLAY_LOG(...)\n#endif\n\n\n//-------------------------------------------------------------------------------------\n// ***** HSWDISPLAY_DISTANCE\n//\n// Floating point value in the range of ~0.75 to ~3.0 which controls the distance \n// (in meters) of the display from the viewer.\n\n#ifndef HSWDISPLAY_DISTANCE\n    #define HSWDISPLAY_DISTANCE 1.5f\n#endif\n\n\n//-------------------------------------------------------------------------------------\n// ***** HSWDISPLAY_SCALE\n//\n// Floating point value in the range of ~0.1 to ~2.0 which controls the size scale of the \n// SDK-rendered HSW display. The value is an arbitrary relative value, though this may \n// change in future SDK versions.\n\n#ifndef HSWDISPLAY_SCALE\n    #define HSWDISPLAY_SCALE 0.92f\n#endif\n\n\n\n\nnamespace OVR { namespace CAPI {\n\n\n//-------------------------------------------------------------------------------------\n// ***** CAPI::HSWDisplay\n//\n// Note: This will be renamed to HSWDisplay in the future.\n//\n// Implements the logic for the Health and Safety (HAS) warning display. Primarily this\n// is two things: providing information about whether the warning needs to be currently\n// displayed, and implementing the display itself. \n//\n// An HSWDisplay is associated 1:1 with an HMD. There can be at most one HSWDisplay \n// being displayed on an HMD at a time. If a warning needs to be displayed while an  \n// existing one is present, it replaces the existing one. \n//\n// Notes\n//    Warnings are displayed per HMD (head mounted display).\n//    The app can have multiple HMDs.\n//    There can be multiple users of a given HMD over time, with each identified by a different user profile.\n//    There can be multiple apps using HMDs.\n//\n//    Shows upon first entering a VR application (or VR mode in an application) when in Event Mode (e.g. trade show).\n//    Shows upon each wearing of the HMD.\n//    If the user profile is switched while display is active, the display must restart.\n//    Doesn't show in app when app was started by a launcher app.\n//\n//    First display ever (per profile): 15 seconds until the display can be dismissed.\n//    Subsequent displays: 6 seconds until the display can be dismissed. Per profile.\n//    Dismissing occurs via HMD tap, designated keypress, gaze detection on OK button for N seconds, \n//        and possibly via an input gesture in the future.\n//\n//    If the warning fades out upon completion, the fade out should begin after the full display time has elapsed, \n//        but it needs to avoid interfering (e.g. obscuring) with the application. This likely means the application \n//        would need to put in a couple seconds delay to allow the fade to complete.\n//    Ideally we'd handle the case of a user switching HMDs and not needing to see the warning again.\n\nclass HSWDisplay : public RefCountBase<HSWDisplay>\n{\npublic:\n    HSWDisplay(ovrRenderAPIType api, ovrHmd hmd, const HMDRenderState& renderState);\n\n    virtual ~HSWDisplay();\n\n    // Must be called after construction and before use.\n    virtual bool Initialize(const ovrRenderAPIConfig*)\n        { return true; }\n\n    // Must be called before destruction.\n    virtual void Shutdown() {}\n\n    // Enables or disables the HSW display system. It may be disabled only for development uses.\n    // It is enabled by default. \n    void Enable(bool enable);\n\n    // Enables or disables our internal rendering when Render is called. If set to false then the \n    // application is expected to implement drawing of the display when Displayed is true.\n    // It is enabled by default. \n    void EnableRender(bool enable);\n\n    // Triggers a display of the HSW display for the associated HMD. Restarts the display if \n    // the warning is already being displayed. \n    void Display();\n\n    // This function should be called per HMD every frame in order to give this class processing time. \n    // Writes the new state to newHSWDisplayState if it's non-NULL.\n    // The graphicsContext argument indicates if the Tick is occurring within a graphics context and\n    // thus if graphics operations are allowed during the TickState call.\n    // Returns true if the new state results in a required warning display (ovrHSWDisplayState::Displayed became true).\n    bool TickState(ovrHSWDisplayState *newHSWDisplayState = NULL, bool graphicsContext = false);\n\n    // Gets the current state of the HSW display. \n    // Corresponds to ovrhmd_GetHSWDisplayState.\n    void GetState(ovrHSWDisplayState *hasWarningState) const;\n\n    // Removes the HSW display display if the minimum dismissal time has occurred. \n    // Returns true if the warning display could be dissmissed or was not displayed at the time of the call.\n    // Corresponds to ovrhmd_DismissHSWDisplay.\n    bool Dismiss();\n\n    // Returns true if the HMD appears to be currently mounted and in a state that a \n    // warning display would be viewable.\n    bool IsDisplayViewable() const;\n\n    // Draws the warning to the eye texture(s). This must be done at the end of a \n    // frame but prior to executing the distortion rendering of the eye textures. \n    virtual void Render(ovrEyeType, const ovrTexture*);\n\n    // Resets the current profile's HAS settings (e.g. to act as if the user has never seen the HSW display before).\n    void ResetProfileData();\n\n    // Returns the ovrRenderAPIType. This is essentially the same as RTTI, as it's indicating what subclass\n    // is being used for this.\n    ovrRenderAPIType GetRenderAPIType() const // e.g. ovrRenderAPI_D3D11\n        { return RenderAPIType; }\n\n    // Returns the required HSW display text for the current profile's locale. \n    // Useful for implementing custom warning displays. Returns the required strlen \n    // of the text, and thus success is indicated by a return value < strCapacity.\n    // size_t GetText(char *str, size_t strCapacity);\n\n    // Creates and constructs an instance of an HSWDisplay subclass based on the API type.\n    static HSWDisplay* Factory(ovrRenderAPIType apiType, ovrHmd hmd, const HMDRenderState& renderState);\n\nprivate:\n    OVR_NON_COPYABLE(HSWDisplay)\n\nprotected:\n    virtual void DisplayInternal() {}\n    virtual void DismissInternal() {}\n    virtual void RenderInternal(ovrEyeType, const ovrTexture*) {}\n    virtual void UnloadGraphics() {}\n    virtual void LoadGraphics() {}\n\n    // Profile functionality\n    time_t GetCurrentProfileLastHSWTime() const;\n    void   SetCurrentProfileLastHSWTime(time_t t);\n\n    // Generates an appropriate stereo ortho projection matrix.\n    void GetOrthoProjection(const HMDRenderState& RenderState, Matrix4f OrthoProjection[2]);\n\n    // Returns the default HSW display texture data.\n    static const uint8_t* GetDefaultTexture(size_t& TextureSize);\n\nprotected:\n    bool                   Enabled;                 // If true then the HSW display system is enabled. True by default.\n    bool                   Displayed;               // If true then the warning is currently visible and the following variables have meaning. Else there is no warning being displayed for this application on the given HMD.\n    bool                   SDKRendered;             // If true then the display is being rendered by the SDK as opposed to the application.\n    bool                   DismissRequested;        // If true then the warning has been requested to be hidden.\n    bool                   RenderEnabled;           // If true then we handle rendering when Render is called. Else we skip it and assume the application is otherwise handling it itself.\n    bool                   UnloadGraphicsRequested; // If true then an unload of graphics was requested. This acts as a message from the main thread to the drawing thread so that the unload happens in the expected thread.\n    double                 StartTime;               // Absolute time when the warning was first displayed. See ovr_GetTimeInSeconds().\n    double                 DismissibleTime;         // Absolute time when the warning can be dismissed.\n    double                 LastPollTime;            // Used to prevent us from polling the required display state every frame but rather more like every 200 milliseconds.\n    const ovrHmd           HMD;                     // The HMDState this HSWDisplay instance corresponds to.\n    mutable bool           HMDMounted;              // True if the HMD was most recently found to be mounted. We need this in order to maintain HMDNewlyMounted.\n    mutable bool           HMDNewlyMounted;         // True if HMDMounted has transitioned from false to true. We need this in order to tell if the HMD was recently mounted so we can display the HSW display.\n    const ovrRenderAPIType RenderAPIType;           // e.g. ovrRenderAPI_D3D11\n    const HMDRenderState&  RenderState;             // Information about the rendering setup.\n\n    // Settings cache\n    mutable String         LastProfileName;\n    mutable int            LastHSWTime;\n\n}; // class HSWDisplay\n\n\n\n}} // namespace OVR::CAPI\n\n\n#endif // OVR_CAPI_HSWDisplay_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D1X/CAPI_D3D11_DistortionRenderer.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_D3D11_DistortionRenderer.cpp\nContent     :   Experimental distortion renderer\nCreated     :   November 11, 2013\nAuthors     :   Volga Aksoy, Michael Antonov, Shariq Hashme\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_D3D11_DistortionRenderer.h\"\n\n#include \"OVR_CAPI_D3D.h\"\n#include \"../CAPI_HMDState.h\"\n#include \"Kernel/OVR_Color.h\"\n#include \"../Textures/overdriveLut_dk2.h\"\n\n#include \"../../Displays/OVR_Win32_Dxgi_Display.h\" // Display driver timing info\n\n\nnamespace OVR { namespace CAPI { namespace D3D11 {\n\n#include \"Shaders/Distortion_ps.h\"\n#include \"Shaders/DistortionChroma_vs.h\"\n#include \"Shaders/DistortionChroma_ps.h\"\n#include \"Shaders/DistortionTimewarpChroma_vs.h\"\n#include \"Shaders/DistortionCS2x2.h\"\n\n#include \"Shaders/SimpleQuad_vs.h\"\n#include \"Shaders/SimpleQuad_ps.h\"\n\n#include \"Tracing/Tracing.h\"\n\n#include <initguid.h>\nDEFINE_GUID(IID_OVRDXGISwapchain, 0x868f9b4f, 0xe427, 0x46ed, 0xb0, 0x94, 0x66, 0xd1, 0x3b, 0xb, 0x48, 0xf7);\n\n[uuid(E741B60E-3AC8-418A-AB3C-26C1D4EDD33B)]\ninterface IOVRDXGISwapChain : IUnknown\n{\n    virtual HRESULT GetDirectBuffer(REFIID riid, void** ppv) = 0;\n};\n\n#include <VersionHelpers.h>\n\n// Distortion pixel shader lookup.\n//  Bit 0: Chroma Correction\n//  Bit 1: Timewarp\n\nenum {\n    DistortionVertexShaderBitMask = 3,\n    DistortionVertexShaderCount = DistortionVertexShaderBitMask + 1,\n    DistortionPixelShaderBitMask = 0,\n    DistortionPixelShaderCount = DistortionPixelShaderBitMask + 1,\n};\n\nstruct PrecompiledShader\n{\n    const unsigned char* ShaderData;\n    size_t ShaderSize;\n    const ShaderBase::Uniform* ReflectionData;\n    size_t ReflectionSize;\n};\n\n// To add a new distortion shader use these macros (with or w/o reflection)\n#define PCS_NOREFL(shader) { shader, sizeof(shader), NULL, 0 }\n#define PCS_REFL__(shader) { shader, sizeof(shader), shader ## _refl, sizeof( shader ## _refl )/sizeof(*(shader ## _refl)) }\n\n\nstatic PrecompiledShader DistortionVertexShaderLookup[DistortionVertexShaderCount] =\n{\n    PCS_REFL__(DistortionChroma_vs),\n    PCS_REFL__(DistortionTimewarpChroma_vs),\n    PCS_REFL__(DistortionTimewarpChroma_vs),\n    { NULL, 0, NULL, 0 },\n};\n\nstatic PrecompiledShader DistortionPixelShaderLookup[DistortionPixelShaderCount] =\n{\n    PCS_REFL__(DistortionChroma_ps)\n};\n\nenum\n{\n    DistortionComputeShader2x2 = 0,\n    DistortionComputeShaderCount\n};\nstatic PrecompiledShader DistortionComputeShaderLookup[DistortionComputeShaderCount] =\n{\n    PCS_REFL__(DistortionCS2x2)\n};\n\n\n\nvoid DistortionShaderBitIndexCheck()\n{\n    OVR_COMPILER_ASSERT(ovrDistortionCap_TimeWarp == 2);\n}\n\n\n\nstruct DistortionVertex         // Must match the VB description DistortionMeshVertexDesc\n{\n    Vector2f ScreenPosNDC;\n    Vector2f TanEyeAnglesR;\n    Vector2f TanEyeAnglesG;\n    Vector2f TanEyeAnglesB;\n    Color    Col;\n};\n\nstruct DistortionComputePin     // Must match the ones declared in DistortionCS*.csh\n{\n    Vector2f TanEyeAnglesR;\n    Vector2f TanEyeAnglesG;\n    Vector2f TanEyeAnglesB;\n    Color Col;\n    int padding[1];     // Aligns to power-of-two boundary, increases performance significantly.\n};\n\n\n// Vertex type; same format is used for all shapes for simplicity.\n// Shapes are built by adding vertices to Model.\nstruct Vertex\n{\n    Vector3f  Pos;\n    Color     C;\n    float     U, V;\n    Vector3f  Norm;\n\n    Vertex(const Vector3f& p, const Color& c = Color(64, 0, 0, 255),\n        float u = 0, float v = 0, Vector3f n = Vector3f(1, 0, 0))\n        : Pos(p), C(c), U(u), V(v), Norm(n)\n    {}\n    Vertex(float x, float y, float z, const Color& c = Color(64, 0, 0, 255),\n        float u = 0, float v = 0) : Pos(x, y, z), C(c), U(u), V(v)\n    { }\n\n    bool operator==(const Vertex& b) const\n    {\n        return Pos == b.Pos && C == b.C && U == b.U && V == b.V;\n    }\n};\n\n\n//----------------------------------------------------------------------------\n// ***** D3D11::DistortionRenderer\n\nDistortionRenderer::DistortionRenderer()\n{\n    SrgbBackBuffer = false;\n\n    EyeTextureSize[0] = Sizei(0);\n    EyeRenderViewport[0] = Recti();\n    EyeTextureSize[1] = Sizei(0);\n    EyeRenderViewport[1] = Recti();\n}\n\nDistortionRenderer::~DistortionRenderer()\n{\n    destroy();\n}\n\n// static\nCAPI::DistortionRenderer* DistortionRenderer::Create()\n{\n    return new DistortionRenderer;\n}\n\n\nbool DistortionRenderer::initializeRenderer(const ovrRenderAPIConfig* apiConfig)\n{\n    const ovrD3D11Config* config = (const ovrD3D11Config*)apiConfig;\n\n    // Reset the frame index read failure count, as this function is called when\n    // switching between windowed and fullscreen mode.\n    FrameIndexFailureCount = 0;\n\n    if (!config)\n    {\n        // Cleanup\n        pEyeTextures[0].Clear();\n        pEyeTextures[1].Clear();\n        pEyeDepthTextures[0].Clear();\n        pEyeDepthTextures[1].Clear();\n        memset(&RParams, 0, sizeof(RParams));\n        return true;\n    }\n\n    if (!config->D3D11.pDevice || !config->D3D11.pBackBufferRT)\n        return false;\n\n    if (Display::GetDirectDisplayInitialized())\n    {\n        Ptr<IUnknown> ovrSwapChain;\n        if (config->D3D11.pSwapChain->QueryInterface(IID_OVRDXGISwapchain, (void**)&ovrSwapChain.GetRawRef()) == E_NOINTERFACE)\n        {\n            OVR_DEBUG_LOG_TEXT((\"ovr_Initialize() or ovr_InitializeRenderingShim() wasn't called before DXGISwapChain was created.\"));\n        }\n    }\n\n    RParams.pDevice = config->D3D11.pDevice;\n    RParams.pContext = config->D3D11.pDeviceContext;\n    RParams.pBackBufferRT = config->D3D11.pBackBufferRT;\n    RParams.pBackBufferUAV = config->D3D11.pBackBufferUAV;\n    RParams.pSwapChain = config->D3D11.pSwapChain;\n    RParams.BackBufferSize = config->D3D11.Header.BackBufferSize;\n    RParams.Multisample = config->D3D11.Header.Multisample;\n    RParams.VidPnTargetId = 0;\n\n    // set RParams.VidPnTargetId to the display target id for ETW tracing in order\n    // to match Microsoft-Windows-DxgKrnl's VSync event\n    IDXGIOutput *pOutput = NULL;\n    RParams.pSwapChain->GetContainingOutput(&pOutput);\n    if (pOutput)\n    {\n        // get the swapchain's DeviceName\n        DXGI_OUTPUT_DESC desc;\n        pOutput->GetDesc(&desc);\n\n        // allocate the required buffers for QueryDisplayConfig (we don't need pModeInfoArray but it can't be NULL or less than needed)\n        UINT32 NumPathArrayElements = 0, NumModeInfoArrayElements = 0;\n        DISPLAYCONFIG_PATH_INFO *pPathInfoArray = NULL;\n        DISPLAYCONFIG_MODE_INFO *pModeInfoArray = NULL;\n        LONG st = ERROR_INSUFFICIENT_BUFFER;\n        while (ERROR_INSUFFICIENT_BUFFER == st)\n        {\n            st = GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &NumPathArrayElements, &NumModeInfoArrayElements);\n            if (ERROR_SUCCESS != st)\n            {\n                OVR_DEBUG_LOG_TEXT((\"Error: GetDisplayConfigBufferSizes failed with %ld\\n\", st));\n                break;\n            }\n\n            pPathInfoArray = new DISPLAYCONFIG_PATH_INFO[NumPathArrayElements];\n            pModeInfoArray = new DISPLAYCONFIG_MODE_INFO[NumModeInfoArrayElements];\n\n            st = QueryDisplayConfig(QDC_ONLY_ACTIVE_PATHS, &NumPathArrayElements, pPathInfoArray, &NumModeInfoArrayElements, pModeInfoArray, NULL);\n            if (ERROR_SUCCESS != st) OVR_DEBUG_LOG_TEXT((\"Error: QueryDisplayConfig failed with %ld\\n\", st));\n        }\n\n        // search for matching display targets for the SwapChain's display source\n        if (ERROR_SUCCESS == st)\n        {\n            for (UINT32 i = 0; i < NumPathArrayElements; ++i)\n            {\n                DISPLAYCONFIG_PATH_INFO *p = &pPathInfoArray[i];\n\n                DISPLAYCONFIG_SOURCE_DEVICE_NAME sdn;\n                sdn.header.size = sizeof(sdn);\n                sdn.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME;\n                sdn.header.adapterId = p->sourceInfo.adapterId;\n                sdn.header.id = p->sourceInfo.id;\n                st = DisplayConfigGetDeviceInfo(&sdn.header);\n\n                DISPLAYCONFIG_TARGET_DEVICE_NAME tdn;\n                tdn.header.size = sizeof(tdn);\n                tdn.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;\n                tdn.header.adapterId = p->targetInfo.adapterId;\n                tdn.header.id = p->targetInfo.id;\n                st = DisplayConfigGetDeviceInfo(&tdn.header);\n\n                if (wcsncmp(sdn.viewGdiDeviceName, desc.DeviceName, sizeof(desc.DeviceName)) == 0)\n                {\n                    // pick anything if nothing was found yet, else give precedence to \"Rift\" monitors on this display device\n                    static const wchar_t Rift[] = { L'R', L'i', L'f', L't' };\n                    if (!RParams.VidPnTargetId || (wcsncmp(tdn.monitorFriendlyDeviceName, Rift, sizeof(Rift)) == 0))\n                    {\n                        RParams.VidPnTargetId = p->targetInfo.id;\n                        OVR_DEBUG_LOG_TEXT((\"Debug: Found VidPnTargetId=%d for display %d name=\\\"%ls\\\"\\n\", RParams.VidPnTargetId, p->sourceInfo.id, tdn.monitorFriendlyDeviceName));\n                    }\n                }\n            }\n        }\n\n        delete [] pPathInfoArray;\n        delete [] pModeInfoArray;\n\n        pOutput->Release();\n    }\n\n    GfxState = *new GraphicsState(RParams.pContext);\n\n    D3D11_RENDER_TARGET_VIEW_DESC backBufferDesc;\n    RParams.pBackBufferRT->GetDesc(&backBufferDesc);\n    SrgbBackBuffer = (backBufferDesc.Format == DXGI_FORMAT_R8G8B8A8_UNORM_SRGB) ||\n        (backBufferDesc.Format == DXGI_FORMAT_B8G8R8A8_UNORM_SRGB) ||\n        (backBufferDesc.Format == DXGI_FORMAT_B8G8R8X8_UNORM_SRGB);\n\n\n#if 0   // enable related section in DistortionChroma.psh shader\n    // aniso requires proper sRGB sampling\n    SampleMode hqFilter = (RenderState->DistortionCaps & ovrDistortionCap_HqDistortion) ? Sample_Anisotropic : Sample_Linear;\n#else\n    SampleMode hqFilter = Sample_Linear;\n#endif\n\n    pEyeTextures[0] = *new Texture(&RParams, Texture_RGBA, Sizei(0),\n        getSamplerState(hqFilter | Sample_ClampBorder));\n    pEyeTextures[1] = *new Texture(&RParams, Texture_RGBA, Sizei(0),\n        getSamplerState(hqFilter | Sample_ClampBorder));\n\n    pEyeDepthTextures[0] = *new Texture(&RParams, Texture_Depth, Sizei(0),\n        getSamplerState(hqFilter | Sample_ClampBorder));\n    pEyeDepthTextures[1] = *new Texture(&RParams, Texture_Depth, Sizei(0),\n        getSamplerState(hqFilter | Sample_ClampBorder));\n\n    if (!initBuffersAndShaders())\n    {\n        return false;\n    }\n\n    // Rasterizer state\n    D3D11_RASTERIZER_DESC rs;\n    memset(&rs, 0, sizeof(rs));\n    rs.AntialiasedLineEnable = true;\n    rs.CullMode = D3D11_CULL_BACK;\n    rs.DepthClipEnable = true;\n    rs.FillMode = D3D11_FILL_SOLID;\n    Rasterizer = NULL;\n    RParams.pDevice->CreateRasterizerState(&rs, &Rasterizer.GetRawRef());\n\n    initOverdrive();\n\n    // TBD: Blend state.. not used?\n    // We'll want to turn off blending\n\n    GpuProfiler.Init(RParams.pDevice, RParams.pContext);\n\n    return true;\n}\n\nvoid DistortionRenderer::initOverdrive()\n{\n    if (RenderState->DistortionCaps & ovrDistortionCap_Overdrive)\n    {\n        LastUsedOverdriveTextureIndex = 0;\n\n        D3D11_RENDER_TARGET_VIEW_DESC backBufferDesc;\n        RParams.pBackBufferRT->GetDesc(&backBufferDesc);\n\n        for (int i = 0; i < NumOverdriveTextures; i++)\n        {\n            pOverdriveTextures[i] = *new Texture(&RParams, Texture_RGBA, RParams.BackBufferSize,\n                getSamplerState(Sample_Linear | Sample_ClampBorder));\n\n            D3D11_TEXTURE2D_DESC dsDesc;\n            dsDesc.Width = RParams.BackBufferSize.w;\n            dsDesc.Height = RParams.BackBufferSize.h;\n            dsDesc.MipLevels = 1;\n            dsDesc.ArraySize = 1;\n            dsDesc.Format = backBufferDesc.Format;\n            dsDesc.SampleDesc.Count = 1;\n            dsDesc.SampleDesc.Quality = 0;\n            dsDesc.Usage = D3D11_USAGE_DEFAULT;\n            dsDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;\n            dsDesc.CPUAccessFlags = 0;\n            dsDesc.MiscFlags = 0;\n\n            HRESULT hr = RParams.pDevice->CreateTexture2D(&dsDesc, NULL, &pOverdriveTextures[i]->Tex.GetRawRef());\n            if (FAILED(hr))\n            {\n                OVR_DEBUG_LOG_TEXT((\"Failed to create overdrive texture.\"));\n                // Remove overdrive flag since we failed to create the texture\n                LastUsedOverdriveTextureIndex = -1;\t// disables feature\n                break;\n            }\n\n            RParams.pDevice->CreateShaderResourceView(pOverdriveTextures[i]->Tex, NULL, &pOverdriveTextures[i]->TexSv.GetRawRef());\n            RParams.pDevice->CreateRenderTargetView(pOverdriveTextures[i]->Tex, NULL, &pOverdriveTextures[i]->TexRtv.GetRawRef());\n        }\n\n        const int dimSize = 256;\n        OVR_COMPILER_ASSERT(dimSize * dimSize * 4 == sizeof(overdriveLut_dk2));\n        OverdriveLutTexture = *new Texture(&RParams, Texture_RGBA, Sizei(dimSize, dimSize),\n                                           getSamplerState(Sample_Linear | Sample_Clamp), overdriveLut_dk2, 1);\n    }\n    else\n    {\n        LastUsedOverdriveTextureIndex = -1;\n    }\n}\n\nvoid DistortionRenderer::SubmitEye(int eyeId, const ovrTexture* eyeTexture)\n{\n    if (eyeTexture)\n    {\n        const ovrD3D11Texture* tex = (const ovrD3D11Texture*)eyeTexture;\n\n        // Use tex->D3D11.Header.RenderViewport to update UVs for rendering in case they changed.\n        // TBD: This may be optimized through some caching. \n        EyeTextureSize[eyeId] = tex->D3D11.Header.TextureSize;\n        EyeRenderViewport[eyeId] = tex->D3D11.Header.RenderViewport;\n\n        const ovrEyeRenderDesc& erd = RenderState->EyeRenderDesc[eyeId];\n\n        ovrHmd_GetRenderScaleAndOffset(erd.Fov,\n            EyeTextureSize[eyeId], EyeRenderViewport[eyeId],\n            UVScaleOffset[eyeId]);\n\n        if (RenderState->DistortionCaps & ovrDistortionCap_FlipInput)\n        {\n            UVScaleOffset[eyeId][0].y = -UVScaleOffset[eyeId][0].y;\n            UVScaleOffset[eyeId][1].y = 1.0f - UVScaleOffset[eyeId][1].y;\n        }\n\n        // Get multisample count from texture\n        D3D11_TEXTURE2D_DESC desc;\n        tex->D3D11.pTexture->GetDesc(&desc);\n\n        pEyeTextures[eyeId]->UpdatePlaceholderTexture(tex->D3D11.pTexture, tex->D3D11.pSRView,\n            tex->D3D11.Header.TextureSize, desc.SampleDesc.Count);\n    }\n}\n\nvoid DistortionRenderer::SubmitEyeWithDepth(int eyeId, const ovrTexture* eyeColorTexture, const ovrTexture* eyeDepthTexture)\n{\n    SubmitEye(eyeId, eyeColorTexture);\n\n    if (eyeDepthTexture)\n    {\n        const ovrD3D11Texture* depthTex = (const ovrD3D11Texture*)eyeDepthTexture;\n\n        // Use tex->D3D11.Header.RenderViewport to update UVs for rendering in case they changed.\n        // TBD: This may be optimized through some caching. \n        EyeTextureSize[eyeId] = depthTex->D3D11.Header.TextureSize;\n        EyeRenderViewport[eyeId] = depthTex->D3D11.Header.RenderViewport;\n\n        const ovrEyeRenderDesc& erd = RenderState->EyeRenderDesc[eyeId];\n\n        ovrHmd_GetRenderScaleAndOffset(erd.Fov,\n            EyeTextureSize[eyeId], EyeRenderViewport[eyeId],\n            UVScaleOffset[eyeId]);\n\n        if (RenderState->DistortionCaps & ovrDistortionCap_FlipInput)\n        {\n            UVScaleOffset[eyeId][0].y = -UVScaleOffset[eyeId][0].y;\n            UVScaleOffset[eyeId][1].y = 1.0f - UVScaleOffset[eyeId][1].y;\n        }\n\n        // Get multisample count from texture\n        D3D11_TEXTURE2D_DESC desc;\n        depthTex->D3D11.pTexture->GetDesc(&desc);\n\n        pEyeDepthTextures[eyeId]->UpdatePlaceholderTexture(depthTex->D3D11.pTexture, depthTex->D3D11.pSRView,\n            depthTex->D3D11.Header.TextureSize, desc.SampleDesc.Count);\n    }\n}\n\nvoid DistortionRenderer::renderEndFrame()\n{\n    renderDistortion();\n\n    if (RegisteredPostDistortionCallback)\n        RegisteredPostDistortionCallback(RParams.pContext);\n\n    if (LatencyTest2Active)\n    {\n        renderLatencyPixel(LatencyTest2DrawColor);\n    }\n}\n\n/******************************************************************/\n// Attempt to use DXGI for getting a previous vsync\ndouble DistortionRenderer::getDXGILastVsyncTime()\n{\n    OVR_ASSERT(RParams.pSwapChain != nullptr);\n\n    // If in driver mode,\n    if (!RenderState->OurHMDInfo.InCompatibilityMode)\n    {\n        // Prefer the driver mode\n        return 0.;\n    }\n\n    // If failure count is exceeded,\n    if (FrameIndexFailureCount >= FrameIndexFailureLimit)\n    {\n        if (FrameIndexFailureCount == FrameIndexFailureLimit)\n        {\n            LogError(\"[D3D11DistortionRenderer] Performance Warning: DXGI GetFrameStatistics could not get Vsync timing.  The game should be running in fullscreen mode on the Rift to get adequate timing information.\");\n            ++FrameIndexFailureCount;\n        }\n\n        return 0.;\n    }\n\n    // Get frame statistics from the D3D11 renderer\n    DXGI_FRAME_STATISTICS stats;\n    HRESULT hr = RParams.pSwapChain->GetFrameStatistics(&stats);\n    if (SUCCEEDED(hr))\n    {\n        FrameIndexFailureCount = 0; // Reset failure count\n\n        // Return Vsync time in seconds\n        return stats.SyncQPCTime.QuadPart * Timer::GetPerfFrequencyInverse();\n    }\n\n    FrameIndexFailureCount++; // Increment failure count\n    return 0.;\n}\n\nvoid DistortionRenderer::EndFrame(uint32_t frameIndex, bool swapBuffers)\n{\n    // Calculate the display frame index from the last known vsync time and\n    // corresponding display frame index\n    Timing->CalculateTimewarpTiming(frameIndex, getDXGILastVsyncTime());\n\n    // Don't spin if we are explicitly asked not to\n    if ( (RenderState->DistortionCaps & ovrDistortionCap_TimeWarp) &&\n         (RenderState->DistortionCaps & ovrDistortionCap_TimewarpJitDelay) &&\n        !(RenderState->DistortionCaps & ovrDistortionCap_ProfileNoSpinWaits))\n    {\n        if (!Timing->NeedDistortionTimeMeasurement())\n        {\n            // Wait for timewarp distortion if it is time and Gpu idle\n            FlushGpuAndWaitTillTime(Timing->GetTimewarpTiming()->JIT_TimewarpTime);\n\n            renderEndFrame();\n        }\n        else\n        {\n            // If needed, measure distortion time so that TimeManager can better estimate\n            // latency-reducing time-warp wait timing.\n            WaitUntilGpuIdle();\n            double distortionStartTime = ovr_GetTimeInSeconds();\n\n            renderEndFrame();\n\n            WaitUntilGpuIdle();\n            Timing->AddDistortionTimeMeasurement(ovr_GetTimeInSeconds() - distortionStartTime);\n        }\n    }\n    else\n    {\n        renderEndFrame();\n    }\n\n    if (LatencyTestActive)\n    {\n        renderLatencyQuad(LatencyTestDrawColor);\n    }\n\n    if (swapBuffers)\n    {\n        if (RParams.pSwapChain)\n        {\n            TraceDistortionPresent(RParams.VidPnTargetId, 0);\n\n            UINT swapInterval = (RenderState->EnabledHmdCaps & ovrHmdCap_NoVSync) ? 0 : 1;\n            RParams.pSwapChain->Present(swapInterval, 0);\n\n            // Force GPU to flush the scene, resulting in the lowest possible latency.\n            // It's critical that this flush is *after* present.\n            // With the display driver this flush is obsolete and theoretically should\n            // be a no-op.\n            // Doesn't need to be done if running through the Oculus driver.\n            if (RenderState->OurHMDInfo.InCompatibilityMode &&\n                !(RenderState->DistortionCaps & ovrDistortionCap_ProfileNoSpinWaits))\n            {\n                WaitUntilGpuIdle();\n            }\n        }\n        else\n        {\n            // TBD: Generate error - swapbuffer option used with null swapchain.\n        }\n    }\n\n    TraceDistortionEnd(RParams.VidPnTargetId, 0);\n}\n\n\nvoid DistortionRenderer::WaitUntilGpuIdle()\n{\n    HRESULT hr;\n\n    TraceDistortionWaitGPU(RParams.VidPnTargetId, 0);\n\n    // Flush and Stall CPU while waiting for GPU to complete rendering all of the queued draw calls\n    D3D11_QUERY_DESC queryDesc = { D3D11_QUERY_EVENT, 0 };\n    Ptr<ID3D11Query> query;\n    hr = RParams.pDevice->CreateQuery(&queryDesc, &query.GetRawRef());\n\n    if (SUCCEEDED(hr))\n    {\n        RParams.pContext->End(query);\n\n        // This flush is very important to measure Present() time in practice and prevent the\n        // GPU from allowing us to queue ahead unintentionally in extended mode.\n        RParams.pContext->Flush();\n\n        for (;;)\n        {\n            BOOL done = FALSE;\n            hr = RParams.pContext->GetData(query, &done, sizeof(done), 0);\n\n            // Exit on failure to avoid infinite loop.\n            if (FAILED(hr))\n            {\n                break;\n            }\n\n            // If event succeeded and it's done,\n            if (SUCCEEDED(hr) && done)\n            {\n                break;\n            }\n        }\n    }\n}\n\ndouble DistortionRenderer::FlushGpuAndWaitTillTime(double absTime)\n{\n    RParams.pContext->Flush();\n    return WaitTillTime(absTime);\n}\n\nbool DistortionRenderer::initBuffersAndShaders()\n{\n    if (RenderState->DistortionCaps & ovrDistortionCap_ComputeShader)\n    {\n        // Compute shader distortion grid.\n        // TODO - only do this if the CS is actually enabled?\n        for (int eyeNum = 0; eyeNum < 2; eyeNum++)\n        {\n            // Compute shader setup of regular grid.\n            DistortionMeshVBs[eyeNum] = NULL;\n            DistortionMeshIBs[eyeNum] = NULL;\n\n            // These constants need to match those declared in the shader in DistortionCS*.csh\n            const int gridSizeInPixels = 16;\n            const int pinsPerEdge = 128;\n\n\n            // TODO: clean up this mess!\n            ovrEyeType eyeType = RenderState->EyeRenderDesc[eyeNum].Eye;\n            ovrFovPort fov = RenderState->EyeRenderDesc[eyeNum].Fov;\n\n            HmdRenderInfo const &  hmdri = RenderState->RenderInfo;\n            DistortionRenderDesc const & distortion = RenderState->Distortion[eyeType];\n\n\n            // Find the mapping from TanAngle space to target NDC space.\n            ScaleAndOffset2D      eyeToSourceNDC = CreateNDCScaleAndOffsetFromFov(fov);\n\n            //const StereoEyeParams &stereoParams = ( eyeNum == 0 ) ? stereoParamsLeft : stereoParamsRight;\n            OVR_ASSERT(gridSizeInPixels * (pinsPerEdge - 1) > hmdri.ResolutionInPixels.w / 2);\n            OVR_ASSERT(gridSizeInPixels * (pinsPerEdge - 1) > hmdri.ResolutionInPixels.h);\n            DistortionComputePin Verts[pinsPerEdge*pinsPerEdge];\n            // Vertices are laid out in a vertical scanline pattern,\n            // scanning right to left, then within each scan going top to bottom, like DK2.\n            // If we move to a different panel orientation, we may need to flip this around.\n            int vertexNum = 0;\n            for (int x = 0; x < pinsPerEdge; x++)\n            {\n                for (int y = 0; y < pinsPerEdge; y++)\n                {\n                    int pixX = x * gridSizeInPixels;\n                    int pixY = y * gridSizeInPixels;\n#if 0\n                    // Simple version, ignoring pentile offsets\n                    Vector2f screenPosNdc;\n                    screenPosNdc.x = 2.0f * (0.5f - ((float)pixX / (hmdri.ResolutionInPixels.w / 2)));      // Note signs!\n                    screenPosNdc.y = 2.0f * (-0.5f + ((float)pixY / hmdri.ResolutionInPixels.h));      // Note signs!\n\n                    DistortionMeshVertexData vertex = DistortionMeshMakeVertex(screenPosNdc,\n                        (eyeNum == 1),\n                        hmdri,\n                        distortion,\n                        eyeToSourceNDC);\n                    DistortionComputePin *pCurVert = &(Verts[vertexNum]);\n                    pCurVert->TanEyeAnglesR = vertex.TanEyeAnglesR;\n                    pCurVert->TanEyeAnglesG = vertex.TanEyeAnglesG;\n                    pCurVert->TanEyeAnglesB = vertex.TanEyeAnglesB;\n#else\n                    // Pentile offsets are messy.\n                    Vector2f screenPos[3];      // R=0, G=1, B=2\n                    DistortionMeshVertexData vertexRGB[3];\n                    screenPos[1] = Vector2f((float)pixX, (float)pixY);\n                    screenPos[0] = screenPos[1];\n                    screenPos[2] = screenPos[1];\n\n\n                    for (int i = 0; i < 3; i++)\n                    {\n                        Vector2f screenPosNdc;\n                        screenPosNdc.x = 2.0f * (0.5f - (screenPos[i].x / (hmdri.ResolutionInPixels.w / 2)));      // Note signs!\n                        screenPosNdc.y = 2.0f * (-0.5f + (screenPos[i].y / hmdri.ResolutionInPixels.h));      // Note signs!\n                        vertexRGB[i] = DistortionMeshMakeVertex(screenPosNdc,\n                            (eyeNum == 1),\n                            hmdri,\n                            distortion,\n                            eyeToSourceNDC);\n                    }\n                    // Most data (fade, TW interpolate, etc) comes from the green channel.\n                    DistortionMeshVertexData vertex = vertexRGB[1];\n                    DistortionComputePin *pCurVert = &(Verts[vertexNum]);\n                    pCurVert->TanEyeAnglesR = vertexRGB[0].TanEyeAnglesR;\n                    pCurVert->TanEyeAnglesG = vertexRGB[1].TanEyeAnglesG;\n                    pCurVert->TanEyeAnglesB = vertexRGB[2].TanEyeAnglesB;\n#endif\n\n                    // vertex.Shade will go negative beyond the edges to produce correct intercept with the 0.0 plane.\n                    // We want to preserve this, so bias and offset to fit [-1,+1] in a byte.\n                    // The reverse wll be done in the shader.\n                    float shade = Alg::Clamp(vertex.Shade * 0.5f + 0.5f, 0.0f, 1.0f);\n                    pCurVert->Col.R = (OVR::UByte)(floorf(shade * 255.999f));\n                    pCurVert->Col.G = pCurVert->Col.R;\n                    pCurVert->Col.B = pCurVert->Col.R;\n                    pCurVert->Col.A = (OVR::UByte)(floorf(vertex.TimewarpLerp * 255.999f));\n\n                    vertexNum++;\n                }\n            }\n            DistortionPinBuffer[eyeNum] = *new Buffer(&RParams);\n            DistortionPinBuffer[eyeNum]->Data(Buffer_Compute, Verts, vertexNum * sizeof(Verts[0]), sizeof(Verts[0]));\n        }\n\n    }\n    else\n    {\n        for (int eyeNum = 0; eyeNum < 2; eyeNum++)\n        {\n            // Allocate & generate distortion mesh vertices.\n            DistortionPinBuffer[eyeNum] = NULL;\n\n            ovrDistortionMesh meshData;\n\n            //        double startT = ovr_GetTimeInSeconds();\n\n            if (!CalculateDistortionMeshFromFOV(RenderState->RenderInfo,\n                                       RenderState->Distortion[eyeNum],\n                                       (RenderState->EyeRenderDesc[eyeNum].Eye == ovrEye_Left ? StereoEye_Left : StereoEye_Right),\n                                       RenderState->EyeRenderDesc[eyeNum].Fov,\n                                       RenderState->DistortionCaps,\n                                       &meshData))\n            {\n                OVR_ASSERT(false);\n                return false;\n            }\n\n            //        double deltaT = ovr_GetTimeInSeconds() - startT;\n            //        LogText(\"GenerateDistortion time = %f\\n\", deltaT);\n\n            // Now parse the vertex data and create a render ready vertex buffer from it\n            DistortionVertex *   pVBVerts = (DistortionVertex*)OVR_ALLOC(sizeof(DistortionVertex) * meshData.VertexCount);\n            DistortionVertex *   pCurVBVert = pVBVerts;\n            ovrDistortionVertex* pCurOvrVert = meshData.pVertexData;\n\n            for (unsigned vertNum = 0; vertNum < meshData.VertexCount; vertNum++)\n            {\n                pCurVBVert->ScreenPosNDC.x = pCurOvrVert->ScreenPosNDC.x;\n                pCurVBVert->ScreenPosNDC.y = pCurOvrVert->ScreenPosNDC.y;\n                pCurVBVert->TanEyeAnglesR = (*(Vector2f*)&pCurOvrVert->TanEyeAnglesR);\n                pCurVBVert->TanEyeAnglesG = (*(Vector2f*)&pCurOvrVert->TanEyeAnglesG);\n                pCurVBVert->TanEyeAnglesB = (*(Vector2f*)&pCurOvrVert->TanEyeAnglesB);\n\n                // Convert [0.0f,1.0f] to [0,255]\n                if (RenderState->DistortionCaps & ovrDistortionCap_Vignette)\n                    pCurVBVert->Col.R = (uint8_t)(Alg::Max(pCurOvrVert->VignetteFactor, 0.0f) * 255.99f);\n                else\n                    pCurVBVert->Col.R = 255;\n\n                pCurVBVert->Col.G = pCurVBVert->Col.R;\n                pCurVBVert->Col.B = pCurVBVert->Col.R;\n                pCurVBVert->Col.A = (uint8_t)(pCurOvrVert->TimeWarpFactor * 255.99f);\n                pCurOvrVert++;\n                pCurVBVert++;\n            }\n\n            DistortionMeshVBs[eyeNum] = *new Buffer(&RParams);\n            DistortionMeshVBs[eyeNum]->Data(Buffer_Vertex | Buffer_ReadOnly, pVBVerts, sizeof(DistortionVertex)* meshData.VertexCount);\n            DistortionMeshIBs[eyeNum] = *new Buffer(&RParams);\n            DistortionMeshIBs[eyeNum]->Data(Buffer_Index | Buffer_ReadOnly, meshData.pIndexData, (sizeof(INT16)* meshData.IndexCount));\n\n            OVR_FREE(pVBVerts);\n            ovrHmd_DestroyDistortionMesh(&meshData);\n        }\n    }\n\n\n    // Uniform buffers\n    for (int i = 0; i < Shader_Count; i++)\n    {\n        UniformBuffers[i] = *new Buffer(&RParams);\n        //MaxTextureSet[i] = 0;\n    }\n\n    initShaders();\n\n    return true;\n}\n\n\n\nvoid DistortionRenderer::renderDistortion()\n{\n    // XXX takes a frameIndex second parameter, how do we get that here?\n    TraceDistortionBegin(RParams.VidPnTargetId, 0);\n\n    Ptr<IOVRDXGISwapChain> ovrSwap;\n    HRESULT hr = RParams.pSwapChain->QueryInterface(IID_PPV_ARGS(&ovrSwap.GetRawRef()));\n    if (SUCCEEDED(hr))\n    {\n        Ptr<ID3D11Texture2D> texture;\n        hr = ovrSwap->GetDirectBuffer(IID_PPV_ARGS(&texture.GetRawRef()));\n        if (SUCCEEDED(hr))\n        {\n            Ptr<ID3D11RenderTargetView> rtv;\n            auto it = RenderTargetMap.Find(texture.GetPtr());\n            if (it == RenderTargetMap.End())\n            {\n                hr = RParams.pDevice->CreateRenderTargetView(texture, nullptr, &rtv.GetRawRef());\n                if (SUCCEEDED(hr))\n                {\n                    RenderTargetMap.Add(texture.GetPtr(), rtv);\n                }\n            }\n            else\n            {\n                rtv = it->Second;\n            }\n\n            if (rtv)\n            {\n                // The RenderTargets map holds the ref count on this for us\n                RParams.pBackBufferRT = rtv;\n            }\n        }\n    }\n\n    RParams.pContext->HSSetShader(NULL, NULL, 0);\n    RParams.pContext->DSSetShader(NULL, NULL, 0);\n    RParams.pContext->GSSetShader(NULL, NULL, 0);\n\n    RParams.pContext->RSSetState(Rasterizer);\n\n    bool overdriveActive = IsOverdriveActive();\n    int currOverdriveTextureIndex = -1;\n\n    if (overdriveActive)\n    {\n        currOverdriveTextureIndex = (LastUsedOverdriveTextureIndex + 1) % NumOverdriveTextures;\n        ID3D11RenderTargetView* distortionRtv = pOverdriveTextures[currOverdriveTextureIndex]->TexRtv.GetRawRef();\n        ID3D11RenderTargetView* mrtRtv[2] = { distortionRtv, RParams.pBackBufferRT };\n        RParams.pContext->OMSetRenderTargets(2, mrtRtv, 0);\n\n        RParams.pContext->ClearRenderTargetView(distortionRtv, RenderState->ClearColor);\n    }\n    else\n    {\n        RParams.pContext->OMSetRenderTargets(1, &RParams.pBackBufferRT, 0);\n    }\n\n    // Not affected by viewport.\n    RParams.pContext->ClearRenderTargetView(RParams.pBackBufferRT, RenderState->ClearColor);\n\n    setViewport(Recti(0, 0, RParams.BackBufferSize.w, RParams.BackBufferSize.h));\n\n\n    for (int eyeNum = 0; eyeNum < 2; eyeNum++)\n    {\n        ShaderFill distortionShaderFill(DistortionShader);\n        distortionShaderFill.SetTexture(0, pEyeTextures[eyeNum], Shader_Pixel);\n\n        if (pEyeDepthTextures[eyeNum]->Tex != NULL)\n        {\n            OVR_ASSERT(pEyeDepthTextures[eyeNum]->GetSamples() <= 4);\n            DistortionShader->SetUniform1f(\"depthMsaaSamples\", (float)pEyeDepthTextures[eyeNum]->GetSamples());\n\n            // the shader will select the right version\n            distortionShaderFill.SetTexture(2, pEyeDepthTextures[eyeNum], Shader_Vertex);   // DepthTexture4x\n            switch (pEyeDepthTextures[eyeNum]->GetSamples())\n            {\n            case 1: distortionShaderFill.SetTexture(0, pEyeDepthTextures[eyeNum], Shader_Vertex);   break;  // Set DepthTexture1x\n            case 2: distortionShaderFill.SetTexture(1, pEyeDepthTextures[eyeNum], Shader_Vertex);   break;  // Set DepthTexture2x\n            case 4: distortionShaderFill.SetTexture(2, pEyeDepthTextures[eyeNum], Shader_Vertex);   break;  // Set DepthTexture4x\n\n            default:\n                OVR_ASSERT(false);  // unsupported MSAA sample count (requires shader update)\n                LogError(\"{ERR-105} [D3D1x] Unsupported MSAA sample count (requires D3D shader update)\");\n            }\n\n            if (PositionTimewarpDesc.NearClip >= 0.0f && PositionTimewarpDesc.FarClip >= 0.0f)\n            {\n                float NearClip = PositionTimewarpDesc.NearClip;\n                float FarClip = PositionTimewarpDesc.FarClip;\n\n                float DepthProjectorX = FarClip / (FarClip - NearClip);\n                float DepthProjectorY = (-FarClip * NearClip) / (FarClip - NearClip);\n                DistortionShader->SetUniform2f(\"DepthProjector\", DepthProjectorX, DepthProjectorY);\n            }\n            else\n            {\n                OVR_ASSERT(false);\n                LogError(\"{ERR-101} [D3D1x] Invalid ovrPositionTimewarpDesc data provided by client.\");\n\n                DistortionShader->SetUniform2f(\"DepthProjector\", 1.0f, 1.0f);\n            }\n\n            // DepthProjector values can also be calculated as:\n            //float DepthProjectorX = FarClip / (FarClip - NearClip);\n            //float DepthProjectorY = (-FarClip * NearClip) / (FarClip - NearClip);\n            //DistortionShader->SetUniform2f(\"DepthProjector\", -eyeProj[eyeNum].M[2][2], eyeProj[eyeNum].M[2][3]);\n            DistortionShader->SetUniform2f(\"DepthDimSize\", (float)pEyeDepthTextures[eyeNum]->TextureSize.w,\n                (float)pEyeDepthTextures[eyeNum]->TextureSize.h);\n        }\n        else\n        {\n            // -1.0 disables the use of the depth buffer\n            DistortionShader->SetUniform1f(\"depthMsaaSamples\", -1.0f);\n        }\n\n        if (RenderState->DistortionCaps & ovrDistortionCap_HqDistortion)\n        {\n            static float aaDerivMult = 1.0f;\n            DistortionShader->SetUniform1f(\"AaDerivativeMult\", aaDerivMult);\n        }\n        else\n        {\n            // 0.0 disables high quality anti-aliasing\n            DistortionShader->SetUniform1f(\"AaDerivativeMult\", -1.0f);\n        }\n\n        if (overdriveActive)\n        {\n            distortionShaderFill.SetTexture(1, pOverdriveTextures[LastUsedOverdriveTextureIndex], Shader_Pixel);\n            distortionShaderFill.SetTexture(2, OverdriveLutTexture, Shader_Pixel);\n\n            // Toggle this to compare LUTs vs analytical values for overdrive\n            static bool enableLut = false;\n\n            float overdriveScaleRegularRise;\n            float overdriveScaleRegularFall;\n            GetOverdriveScales(overdriveScaleRegularRise, overdriveScaleRegularFall);\n            DistortionShader->SetUniform3f(\"OverdriveScales\", enableLut ? 2.0f : 1.0f,\n                                            overdriveScaleRegularRise, overdriveScaleRegularFall);\n        }\n        else\n        {\n            // -1.0f disables PLO            \n            DistortionShader->SetUniform3f(\"OverdriveScales\", -1.0f, -1.0f, -1.0f);\n        }\n\n        distortionShaderFill.SetInputLayout(DistortionVertexIL);\n\n        DistortionShader->SetUniform2f(\"EyeToSourceUVScale\", UVScaleOffset[eyeNum][0].x, UVScaleOffset[eyeNum][0].y);\n        DistortionShader->SetUniform2f(\"EyeToSourceUVOffset\", UVScaleOffset[eyeNum][1].x, UVScaleOffset[eyeNum][1].y);\n\n\n        if (RenderState->DistortionCaps & ovrDistortionCap_TimeWarp)\n        {\n            Matrix4f startEndMatrices[2];\n            double timewarpIMUTime = 0.;\n            // TODO: if (pEyeDepthTextures[eyeNum]->Tex != NULL), need to use CalculateTimewarpFromSensors instead.\n            CalculateOrientationTimewarpFromSensors(\n                RenderState->EyeRenderPoses[eyeNum].Orientation,\n                SensorReader, Timing->GetTimewarpTiming()->EyeStartEndTimes[eyeNum],\n                startEndMatrices, timewarpIMUTime);\n            Timing->SetTimewarpIMUTime(timewarpIMUTime);\n\n            if (RenderState->DistortionCaps & ovrDistortionCap_ComputeShader)\n            {\n                DistortionShader->SetUniform3x3f(\"EyeRotationStart\", startEndMatrices[0]);\n                DistortionShader->SetUniform3x3f(\"EyeRotationEnd\", startEndMatrices[1]);\n            }\n            else\n            {\n                // Can feed identity like matrices incase of concern over timewarp calculations\n                DistortionShader->SetUniform4x4f(\"EyeRotationStart\", startEndMatrices[0]);\n                DistortionShader->SetUniform4x4f(\"EyeRotationEnd\", startEndMatrices[1]);\n            }\n        }\n\n\n        if (RenderState->DistortionCaps & ovrDistortionCap_ComputeShader)\n        {\n            //RParams.pContext->CSCSSetShaderResources\n            //RParams.pContext->CSSetUnorderedAccessViews\n            //RParams.pContext->CSSetShader\n            //RParams.pContext->CSSetSamplers\n            //RParams.pContext->CSSetConstantBuffers\n\n\n            // These need to match the values used in the compiled shader\n            //const int gridSizeInPixels = 16;        // GRID_SIZE_IN_PIXELS\n            //const int pinsPerEdge = 128;            // PINS_PER_EDGE\n            const int nxnBlockSizeInPixels = 2;\t\t// NXN_BLOCK_SIZE_PIXELS\n            const int simdSquareSize = 16;\t\t\t// SIMD_SQUARE_SIZE\n\n            const int invocationSizeInPixels = nxnBlockSizeInPixels * simdSquareSize;\n\n            distortionShaderFill.SetTexture(0, pEyeTextures[eyeNum], Shader_Compute);\n\n            DistortionShader->SetUniform1f(\"RightEye\", (float)eyeNum);\n            DistortionShader->SetUniform1f(\"UseOverlay\", 0.0f);             // No overlay supported here.\n            DistortionShader->SetUniform1f(\"FbSizePixelsX\", (float)RParams.BackBufferSize.w);\n\n\n            ShaderSet* shaders = distortionShaderFill.GetShaders();\n            ShaderBase* cshader = ((ShaderBase*)shaders->GetShader(Shader_Compute));\n\n            ID3D11UnorderedAccessView *uavRendertarget = RParams.pBackBufferUAV;\n            int SizeX = RParams.BackBufferSize.w / 2;\n            int SizeY = RParams.BackBufferSize.h;\n\n            int TileNumX = (SizeX + (invocationSizeInPixels - 1)) / invocationSizeInPixels;\n            int TileNumY = (SizeY + (invocationSizeInPixels - 1)) / invocationSizeInPixels;\n\n            RParams.pContext->CSSetUnorderedAccessViews(0, 1, &uavRendertarget, NULL);\n\n\n            // Incoming eye-buffer textures start at t0 onwards, so set this in slot #4\n            // Subtlety - can't put this in slot 0 because fill->Set stops at the first NULL texture.\n            ID3D11ShaderResourceView *d3dSrv = DistortionPinBuffer[eyeNum]->GetSrv();\n            RParams.pContext->CSSetShaderResources(4, 1, &d3dSrv);\n\n            // TODO: uniform/constant buffers\n            cshader->UpdateBuffer(UniformBuffers[Shader_Compute]);\n            cshader->SetUniformBuffer(UniformBuffers[Shader_Compute]);\n\n            // Primitive type is ignored for CS.\n            // This call actually sets the textures and does pContext->CSSetShader(). Primitive type is ignored.\n            distortionShaderFill.Set(Prim_Unknown);\n\n            RParams.pContext->Dispatch(TileNumX, TileNumY, 1);\n        }\n        else\n        {\n            renderPrimitives(&distortionShaderFill, DistortionMeshVBs[eyeNum], DistortionMeshIBs[eyeNum],\n                NULL, 0, (int)DistortionMeshIBs[eyeNum]->GetSize() / 2, Prim_Triangles);\n        }\n    }\n\n    LastUsedOverdriveTextureIndex = currOverdriveTextureIndex;\n\n    // Re-activate to only draw on back buffer\n    if (overdriveActive)\n    {\n        RParams.pContext->OMSetRenderTargets(1, &RParams.pBackBufferRT, 0);\n    }\n}\n\nvoid DistortionRenderer::createDrawQuad()\n{\n    const int numQuadVerts = 4;\n    LatencyTesterQuadVB = *new Buffer(&RParams);\n    if (!LatencyTesterQuadVB)\n    {\n        return;\n    }\n\n    LatencyTesterQuadVB->Data(Buffer_Vertex, NULL, numQuadVerts * sizeof(Vertex));\n    Vertex* vertices = (Vertex*)LatencyTesterQuadVB->Map(0, numQuadVerts * sizeof(Vertex), Map_Discard);\n    if (!vertices)\n    {\n        OVR_ASSERT(false); // failed to lock vertex buffer\n        return;\n    }\n\n    const float left = -1.0f;\n    const float top = -1.0f;\n    const float right = 1.0f;\n    const float bottom = 1.0f;\n\n    vertices[0] = Vertex(Vector3f(left, top, 0.0f), Color(255, 255, 255, 255));\n    vertices[1] = Vertex(Vector3f(left, bottom, 0.0f), Color(255, 255, 255, 255));\n    vertices[2] = Vertex(Vector3f(right, top, 0.0f), Color(255, 255, 255, 255));\n    vertices[3] = Vertex(Vector3f(right, bottom, 0.0f), Color(255, 255, 255, 255));\n\n    LatencyTesterQuadVB->Unmap(vertices);\n}\n\nvoid DistortionRenderer::renderLatencyQuad(unsigned char* latencyTesterDrawColor)\n{\n    const int numQuadVerts = 4;\n\n    if (!LatencyTesterQuadVB)\n    {\n        createDrawQuad();\n    }\n\n    ShaderFill quadFill(SimpleQuadShader);\n    quadFill.SetInputLayout(SimpleQuadVertexIL);\n\n    setViewport(Recti(0, 0, RParams.BackBufferSize.w, RParams.BackBufferSize.h));\n\n    float testerLuminance = (float)latencyTesterDrawColor[0] / 255.99f;\n    if (SrgbBackBuffer)\n    {\n        testerLuminance = pow(testerLuminance, 2.2f);\n    }\n\n    SimpleQuadShader->SetUniform2f(\"Scale\", 0.3f, 0.3f);\n    SimpleQuadShader->SetUniform4f(\"Color\", testerLuminance, testerLuminance, testerLuminance, 1.0f);\n\n    for (int eyeNum = 0; eyeNum < 2; eyeNum++)\n    {\n        SimpleQuadShader->SetUniform2f(\"PositionOffset\", eyeNum == 0 ? -0.5f : 0.5f, 0.0f);\n        renderPrimitives(&quadFill, LatencyTesterQuadVB, NULL, NULL, 0, numQuadVerts, Prim_TriangleStrip);\n    }\n}\n\nvoid DistortionRenderer::renderLatencyPixel(unsigned char* latencyTesterPixelColor)\n{\n    const int numQuadVerts = 4;\n\n    if (!LatencyTesterQuadVB)\n    {\n        createDrawQuad();\n    }\n\n    ShaderFill quadFill(SimpleQuadShader);\n    quadFill.SetInputLayout(SimpleQuadVertexIL);\n\n    setViewport(Recti(0, 0, RParams.BackBufferSize.w, RParams.BackBufferSize.h));\n\n    Vector3f testerColor = Vector3f((float)latencyTesterPixelColor[0] / 255.99f,\n        (float)latencyTesterPixelColor[1] / 255.99f,\n        (float)latencyTesterPixelColor[2] / 255.99f);\n    if (SrgbBackBuffer)\n    {\n        // 2.2 gamma is close enough for our purposes of matching sRGB\n        testerColor.x = pow(testerColor.x, 2.2f);\n        testerColor.y = pow(testerColor.y, 2.2f);\n        testerColor.z = pow(testerColor.z, 2.2f);\n    }\n\n#ifdef OVR_BUILD_DEBUG\n    SimpleQuadShader->SetUniform4f(\"Color\", testerColor.x, testerColor.y, testerColor.z, 1.0f);\n\n    Vector2f scale(20.0f / RParams.BackBufferSize.w, 20.0f / RParams.BackBufferSize.h);\n#else\n    // sending in as gray scale\n    SimpleQuadShader->SetUniform4f(\"Color\", testerColor.x, testerColor.x, testerColor.x, 1.0f);\n\n    Vector2f scale(1.0f / RParams.BackBufferSize.w, 1.0f / RParams.BackBufferSize.h);\n#endif\n    SimpleQuadShader->SetUniform2f(\"Scale\", scale.x, scale.y);\n\n    float xOffset = RenderState->RenderInfo.OffsetLatencyTester ? -0.5f * scale.x : 1.0f - scale.x;\n    float yOffset = 1.0f - scale.y;\n\n    // Render the latency tester quad in the correct location.\n    if (RenderState->RenderInfo.Rotation == 270)\n    {\n        xOffset = -xOffset;\n    }\n    else if (RenderState->RenderInfo.Rotation == 180)\n    {\n        xOffset = -xOffset;\n        yOffset = -yOffset;\n    }\n    else if (RenderState->RenderInfo.Rotation == 90)\n    {\n        yOffset = -yOffset;\n    }\n\n    SimpleQuadShader->SetUniform2f(\"PositionOffset\", xOffset, yOffset);\n\n    renderPrimitives(&quadFill, LatencyTesterQuadVB, NULL, NULL, 0, numQuadVerts, Prim_TriangleStrip);\n}\n\nvoid DistortionRenderer::renderPrimitives(\n    const ShaderFill* fill,\n    Buffer* vertices, Buffer* indices,\n    Matrix4f* viewMatrix, int offset, int count,\n    PrimitiveType rprim)\n{\n    OVR_ASSERT(fill->GetInputLayout() != 0);\n    RParams.pContext->IASetInputLayout((ID3D11InputLayout*)fill->GetInputLayout());\n\n    if (indices)\n    {\n        RParams.pContext->IASetIndexBuffer(indices->GetBuffer(), DXGI_FORMAT_R16_UINT, 0);\n    }\n\n    ID3D11Buffer* vertexBuffer = vertices->GetBuffer();\n    UINT          vertexStride = sizeof(Vertex);\n    UINT          vertexOffset = offset;\n    RParams.pContext->IASetVertexBuffers(0, 1, &vertexBuffer, &vertexStride, &vertexOffset);\n\n    ShaderSet* shaders = ((ShaderFill*)fill)->GetShaders();\n\n    ShaderBase*     vshader = ((ShaderBase*)shaders->GetShader(Shader_Vertex));\n    unsigned char*  vertexData = vshader->UniformData;\n    if (vertexData)\n    {\n        // TODO: some VSes don't start with StandardUniformData!\n        if (viewMatrix)\n        {\n            StandardUniformData* stdUniforms = (StandardUniformData*)vertexData;\n            stdUniforms->View = viewMatrix->Transposed();\n            stdUniforms->Proj = StdUniforms.Proj;\n        }\n        UniformBuffers[Shader_Vertex]->Data(Buffer_Uniform, vertexData, vshader->UniformsSize);\n        vshader->SetUniformBuffer(UniformBuffers[Shader_Vertex]);\n    }\n\n    for (int i = Shader_Vertex + 1; i < Shader_Count; i++)\n    {\n        if (shaders->GetShader(i))\n        {\n            ((ShaderBase*)shaders->GetShader(i))->UpdateBuffer(UniformBuffers[i]);\n            ((ShaderBase*)shaders->GetShader(i))->SetUniformBuffer(UniformBuffers[i]);\n        }\n    }\n\n    D3D11_PRIMITIVE_TOPOLOGY prim;\n    switch (rprim)\n    {\n    case Prim_Triangles:\n        prim = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST;\n        break;\n    case Prim_Lines:\n        prim = D3D11_PRIMITIVE_TOPOLOGY_LINELIST;\n        break;\n    case Prim_TriangleStrip:\n        prim = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP;\n        break;\n    default:\n        OVR_ASSERT(0);\n        return;\n    }\n    RParams.pContext->IASetPrimitiveTopology(prim);\n\n    fill->Set(rprim);\n\n    if (indices)\n    {\n        RParams.pContext->DrawIndexed(count, 0, 0);\n    }\n    else\n    {\n        RParams.pContext->Draw(count, 0);\n    }\n}\n\nvoid DistortionRenderer::setViewport(const Recti& vp)\n{\n    D3D11_VIEWPORT d3dvp;\n\n    d3dvp.Width = (float)vp.w;\n    d3dvp.Height = (float)vp.h;\n    d3dvp.TopLeftX = (float)vp.x;\n    d3dvp.TopLeftY = (float)vp.y;\n    d3dvp.MinDepth = 0;\n    d3dvp.MaxDepth = 1;\n    RParams.pContext->RSSetViewports(1, &d3dvp);\n}\n\n\n\n// Must match struct DistortionVertex\nstatic D3D11_INPUT_ELEMENT_DESC DistortionMeshVertexDesc[] =\n{\n    { \"Position\", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },\n    { \"TexCoord\", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 8, D3D11_INPUT_PER_VERTEX_DATA, 0 },\n    { \"TexCoord\", 1, DXGI_FORMAT_R32G32_FLOAT, 0, 16, D3D11_INPUT_PER_VERTEX_DATA, 0 },\n    { \"TexCoord\", 2, DXGI_FORMAT_R32G32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 },\n    { \"Color\", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 32, D3D11_INPUT_PER_VERTEX_DATA, 0 },\n};\n\nstatic D3D11_INPUT_ELEMENT_DESC SimpleQuadMeshVertexDesc[] =\n{\n    { \"Position\", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },\n};\n\n\nvoid DistortionRenderer::initShaders()\n{\n    if ((RenderState->DistortionCaps & ovrDistortionCap_ComputeShader) != 0)\n    {\n        // Compute shader\n        DistortionShader = *new ShaderSet;\n\n        int shaderNum = DistortionComputeShader2x2;        \n\n        PrecompiledShader psShaderByteCode = DistortionComputeShaderLookup[shaderNum];\n        Ptr<D3D11::ComputeShader> cs = *new D3D11::ComputeShader(\n            &RParams,\n            (void*)psShaderByteCode.ShaderData, psShaderByteCode.ShaderSize,\n            psShaderByteCode.ReflectionData, psShaderByteCode.ReflectionSize);\n\n        DistortionShader->SetShader(cs);\n    }\n    else\n    {\n        // Vertex + pixel distortion shader.\n        PrecompiledShader& vsShaderByteCode = DistortionVertexShaderLookup[DistortionVertexShaderBitMask & RenderState->DistortionCaps];\n        if (vsShaderByteCode.ShaderData != NULL)\n        {\n            Ptr<D3D11::VertexShader> vtxShader = *new D3D11::VertexShader(\n                &RParams,\n                (void*)vsShaderByteCode.ShaderData, vsShaderByteCode.ShaderSize,\n                vsShaderByteCode.ReflectionData, vsShaderByteCode.ReflectionSize);\n\n            DistortionVertexIL = NULL;\n            ID3D11InputLayout** objRef = &DistortionVertexIL.GetRawRef();\n\n            HRESULT validate = RParams.pDevice->CreateInputLayout(\n                DistortionMeshVertexDesc, sizeof(DistortionMeshVertexDesc) / sizeof(DistortionMeshVertexDesc[0]),\n                vsShaderByteCode.ShaderData, vsShaderByteCode.ShaderSize, objRef);\n            OVR_UNUSED(validate);\n\n            DistortionShader = *new ShaderSet;\n            DistortionShader->SetShader(vtxShader);\n        }\n        else\n        {\n            OVR_ASSERT_M(false, \"Unsupported distortion feature used\\n\");\n        }\n\n        PrecompiledShader& psShaderByteCode = DistortionPixelShaderLookup[DistortionPixelShaderBitMask & RenderState->DistortionCaps];\n        if (psShaderByteCode.ShaderData)\n        {\n            Ptr<D3D11::PixelShader> ps = *new D3D11::PixelShader(\n                &RParams,\n                (void*)psShaderByteCode.ShaderData, psShaderByteCode.ShaderSize,\n                psShaderByteCode.ReflectionData, psShaderByteCode.ReflectionSize);\n\n            DistortionShader->SetShader(ps);\n        }\n        else\n        {\n            OVR_ASSERT_M(false, \"Unsupported distortion feature used\\n\");\n        }\n    }\n\n    {\n        Ptr<D3D11::VertexShader> vtxShader = *new D3D11::VertexShader(\n            &RParams,\n            (void*)SimpleQuad_vs, sizeof(SimpleQuad_vs),\n            SimpleQuad_vs_refl, sizeof(SimpleQuad_vs_refl) / sizeof(SimpleQuad_vs_refl[0]));\n            //NULL, 0);\n\n        SimpleQuadVertexIL = NULL;\n        ID3D11InputLayout** objRef = &SimpleQuadVertexIL.GetRawRef();\n\n        HRESULT validate = RParams.pDevice->CreateInputLayout(\n            SimpleQuadMeshVertexDesc, sizeof(SimpleQuadMeshVertexDesc) / sizeof(SimpleQuadMeshVertexDesc[0]),\n            (void*)SimpleQuad_vs, sizeof(SimpleQuad_vs), objRef);\n        OVR_UNUSED(validate);\n\n        SimpleQuadShader = *new ShaderSet;\n        SimpleQuadShader->SetShader(vtxShader);\n\n        Ptr<D3D11::PixelShader> ps = *new D3D11::PixelShader(\n            &RParams,\n            (void*)SimpleQuad_ps, sizeof(SimpleQuad_ps),\n            SimpleQuad_ps_refl, sizeof(SimpleQuad_ps_refl) / sizeof(SimpleQuad_ps_refl[0]));\n\n        SimpleQuadShader->SetShader(ps);\n    }\n}\n\n\n\nID3D11SamplerState* DistortionRenderer::getSamplerState(int sm)\n{\n    if (SamplerStates[sm])\n        return SamplerStates[sm];\n\n    D3D11_SAMPLER_DESC ss;\n    memset(&ss, 0, sizeof(ss));\n    switch(sm & Sample_AddressMask)\n    {\n    case Sample_Clamp:          ss.AddressU = ss.AddressV = ss.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;  break;\n    case Sample_ClampBorder:    ss.AddressU = ss.AddressV = ss.AddressW = D3D11_TEXTURE_ADDRESS_BORDER; break;\n    case Sample_Repeat:         ss.AddressU = ss.AddressV = ss.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;   break;\n    case Sample_Mirror:         ss.AddressU = ss.AddressV = ss.AddressW = D3D11_TEXTURE_ADDRESS_MIRROR; break;\n    default:    OVR_ASSERT(false);\n    }\n\n    switch(sm & Sample_FilterMask)\n    {\n    case Sample_Linear:\n        ss.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;\n        break;\n\n    case Sample_Nearest:\n        ss.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;\n        break;\n\n    case Sample_Anisotropic:\n        ss.Filter = D3D11_FILTER_ANISOTROPIC;\n        ss.MaxAnisotropy = 4;\n        break;\n\n    default:    OVR_ASSERT(false);\n    }\n\n    ss.MaxLOD = 15;\n    RParams.pDevice->CreateSamplerState(&ss, &SamplerStates[sm].GetRawRef());\n    return SamplerStates[sm];\n}\n\n\nvoid DistortionRenderer::destroy()\n{\n    for (int eyeNum = 0; eyeNum < 2; eyeNum++)\n    {\n        DistortionMeshVBs[eyeNum].Clear();\n        DistortionMeshIBs[eyeNum].Clear();\n        DistortionPinBuffer[eyeNum].Clear();\n    }\n\n    DistortionVertexIL.Clear();\n\n    if (DistortionShader)\n    {\n        DistortionShader->UnsetShader(Shader_Vertex);\n        DistortionShader->UnsetShader(Shader_Pixel);\n        DistortionShader->UnsetShader(Shader_Compute);\n        DistortionShader.Clear();\n    }\n\n    LatencyTesterQuadVB.Clear();\n}\n\n\nDistortionRenderer::GraphicsState::GraphicsState(ID3D11DeviceContext* c)\n    : context(c)\n    , memoryCleared(TRUE)\n    , rasterizerState(NULL)\n    //samplerStates[]\n    , inputLayoutState(NULL)\n    //psShaderResourceState[]\n    //vsShaderResourceState[]\n    //psConstantBuffersState[]\n    //vsConstantBuffersState[]\n    //renderTargetViewState[]\n    , depthStencilViewState(NULL)\n    , omBlendState(NULL)\n    //omBlendFactorState[]\n    , omSampleMaskState(0xffffffff)\n    , primitiveTopologyState(D3D_PRIMITIVE_TOPOLOGY_UNDEFINED)\n    , iaIndexBufferPointerState(NULL)\n    , iaIndexBufferFormatState(DXGI_FORMAT_UNKNOWN)\n    , iaIndexBufferOffsetState(0)\n    //iaVertexBufferPointersState[]\n    //iaVertexBufferStridesState[]\n    //iaVertexBufferOffsetsState[]\n    , currentPixelShader(NULL)\n    , currentVertexShader(NULL)\n    , currentGeometryShader(NULL)\n    , currentHullShader(NULL)\n    , currentDomainShader(NULL)\n    , currentComputeShader(NULL)\n{\n    for (int i = 0; i < D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT; ++i)\n    {\n        psSamplerStates[i] = NULL;\n        vsSamplerStates[i] = NULL;\n        csSamplerStates[i] = NULL;\n    }\n\n    for (int i = 0; i < D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT; i++)\n    {\n        psShaderResourceState[i] = NULL;\n        vsShaderResourceState[i] = NULL;\n        csShaderResourceState[i] = NULL;\n    }\n\n    for (int i = 0; i < D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT; i++)\n    {\n        psConstantBuffersState[i] = NULL;\n        vsConstantBuffersState[i] = NULL;\n        csConstantBuffersState[i] = NULL;\n    }\n\n    for (int i = 0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; i++)\n    {\n        renderTargetViewState[i] = NULL;\n        csUnorderedAccessViewState[i] = NULL;\n    }\n\n    for (int i = 0; i < 4; i++)\n        omBlendFactorState[i] = NULL;\n\n    for (int i = 0; i < D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT; i++)\n    {\n        iaVertexBufferPointersState[i] = NULL;\n        iaVertexBufferStridesState[i] = NULL;\n        iaVertexBufferOffsetsState[i] = NULL;\n    }\n}\n\n#define SAFE_RELEASE(x) if ( (x) != NULL ) { (x)->Release(); (x)=NULL; }\n\nvoid DistortionRenderer::GraphicsState::clearMemory()\n{\n    SAFE_RELEASE(rasterizerState);\n\n    for (int i = 0; i < D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT; ++i)\n    {\n        SAFE_RELEASE(psSamplerStates[i]);\n        SAFE_RELEASE(vsSamplerStates[i]);\n        SAFE_RELEASE(csSamplerStates[i]);\n    }\n\n    SAFE_RELEASE(inputLayoutState);\n\n    for (int i = 0; i < D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT; i++)\n    {\n        SAFE_RELEASE(psShaderResourceState[i]);\n        SAFE_RELEASE(vsShaderResourceState[i]);\n        SAFE_RELEASE(csShaderResourceState[i]);\n    }\n\n    for (int i = 0; i < D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT; i++)\n    {\n        SAFE_RELEASE(psConstantBuffersState[i]);\n        SAFE_RELEASE(vsConstantBuffersState[i]);\n        SAFE_RELEASE(csConstantBuffersState[i]);\n    }\n\n    for (int i = 0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; i++)\n    {\n        SAFE_RELEASE(renderTargetViewState[i]);\n        SAFE_RELEASE(csUnorderedAccessViewState[i]);\n    }\n\n    SAFE_RELEASE(depthStencilViewState);\n    SAFE_RELEASE(omBlendState);\n    SAFE_RELEASE(iaIndexBufferPointerState);\n\n    for (int i = 0; i < D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT; i++)\n    {\n        SAFE_RELEASE(iaVertexBufferPointersState[i]);\n    }\n\n    SAFE_RELEASE(currentPixelShader);\n    SAFE_RELEASE(currentVertexShader);\n    SAFE_RELEASE(currentGeometryShader);\n\n    SAFE_RELEASE(currentHullShader);\n    SAFE_RELEASE(currentDomainShader);\n    SAFE_RELEASE(currentComputeShader);\n\n    memoryCleared = TRUE;\n}\n\n#undef SAFE_RELEASE\n\nDistortionRenderer::GraphicsState::~GraphicsState()\n{\n    clearMemory();\n}\n\n\nvoid DistortionRenderer::GraphicsState::Save()\n{\n    if (!memoryCleared)\n        clearMemory();\n\n    memoryCleared = FALSE;\n\n    context->RSGetState(&rasterizerState);\n    context->IAGetInputLayout(&inputLayoutState);\n\n    context->PSGetShaderResources(0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, psShaderResourceState);\n    context->PSGetSamplers(0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT, psSamplerStates);\n    context->PSGetConstantBuffers(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, psConstantBuffersState);\n\n    context->VSGetShaderResources(0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, vsShaderResourceState);\n    context->VSGetSamplers(0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT, vsSamplerStates);\n    context->VSGetConstantBuffers(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, vsConstantBuffersState);\n\n    context->CSGetShaderResources(0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, csShaderResourceState);\n    context->CSGetSamplers(0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT, csSamplerStates);\n    context->CSGetConstantBuffers(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, csConstantBuffersState);\n    context->CSGetUnorderedAccessViews(0, D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, csUnorderedAccessViewState);\n\n    context->OMGetRenderTargets(D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, renderTargetViewState, &depthStencilViewState);\n\n    context->OMGetBlendState(&omBlendState, omBlendFactorState, &omSampleMaskState);\n\n    context->IAGetPrimitiveTopology(&primitiveTopologyState);\n\n    context->IAGetIndexBuffer(&iaIndexBufferPointerState, &iaIndexBufferFormatState, &iaIndexBufferOffsetState);\n\n    context->IAGetVertexBuffers(0, D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT, iaVertexBufferPointersState, iaVertexBufferStridesState, iaVertexBufferOffsetsState);\n\n    context->PSGetShader(&currentPixelShader, NULL, NULL);\n    context->VSGetShader(&currentVertexShader, NULL, NULL);\n    context->GSGetShader(&currentGeometryShader, NULL, NULL);\n    context->HSGetShader(&currentHullShader, NULL, NULL);\n    context->DSGetShader(&currentDomainShader, NULL, NULL);\n    context->CSGetShader(&currentComputeShader, NULL, NULL);\n    /* maybe above doesn't work; then do something with this (must test on dx11)\n    ID3D11ClassInstance* blank_array[0];\n    UINT blank_uint = 0;\n    context->PSGetShader(&currentPixelShader, blank_array, blank_uint);\n    context->VSGetShader(&currentVertexShader, blank_array, blank_uint);\n    context->GSGetShader(&currentGeometryShader, blank_array, blank_uint);\n    context->HSGetShader(&currentHullShader, blank_array, blank_uint);\n    context->DSGetShader(&currentDomainShader, blank_array, blank_uint);\n    context->CSGetShader(&currentComputeShader, blank_array, blank_uint);\n    */\n}\n\n\nvoid DistortionRenderer::GraphicsState::Restore()\n{\n    if (rasterizerState != NULL)\n        context->RSSetState(rasterizerState);\n\n    if (inputLayoutState != NULL)\n        context->IASetInputLayout(inputLayoutState);\n\n    context->PSSetSamplers(0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT, psSamplerStates);\n    if (psShaderResourceState != NULL)\n        context->PSSetShaderResources(0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, psShaderResourceState);\n    if (psConstantBuffersState != NULL)\n        context->PSSetConstantBuffers(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, psConstantBuffersState);\n\n    context->VSSetSamplers(0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT, vsSamplerStates);\n    if (vsShaderResourceState != NULL)\n        context->VSSetShaderResources(0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, vsShaderResourceState);\n    if (vsConstantBuffersState != NULL)\n        context->VSSetConstantBuffers(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, vsConstantBuffersState);\n\n    context->CSSetSamplers(0, D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT, csSamplerStates);\n    if (csShaderResourceState != NULL)\n        context->CSSetShaderResources(0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, csShaderResourceState);\n    if (csConstantBuffersState != NULL)\n        context->CSSetConstantBuffers(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, csConstantBuffersState);\n    if (csUnorderedAccessViewState != NULL)\n        context->CSSetUnorderedAccessViews(0, D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, csUnorderedAccessViewState, NULL);\n\n    if (depthStencilViewState != NULL || renderTargetViewState != NULL)\n        context->OMSetRenderTargets(D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT, renderTargetViewState, depthStencilViewState);\n\n    if (omBlendState != NULL)\n        context->OMSetBlendState(omBlendState, omBlendFactorState, omSampleMaskState);\n\n    context->IASetPrimitiveTopology(primitiveTopologyState);\n\n    if (iaIndexBufferPointerState != NULL)\n        context->IASetIndexBuffer(iaIndexBufferPointerState, iaIndexBufferFormatState, iaIndexBufferOffsetState);\n\n    if (iaVertexBufferPointersState != NULL)\n        context->IASetVertexBuffers(0, D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT, iaVertexBufferPointersState, iaVertexBufferStridesState, iaVertexBufferOffsetsState);\n\n    if (currentPixelShader != NULL)\n        context->PSSetShader(currentPixelShader, NULL, 0);\n    if (currentVertexShader != NULL)\n        context->VSSetShader(currentVertexShader, NULL, 0);\n    if (currentGeometryShader != NULL)\n        context->GSSetShader(currentGeometryShader, NULL, 0);\n    if (currentHullShader != NULL)\n        context->HSSetShader(currentHullShader, NULL, 0);\n    if (currentDomainShader != NULL)\n        context->DSSetShader(currentDomainShader, NULL, 0);\n    if (currentComputeShader != NULL)\n        context->CSSetShader(currentComputeShader, NULL, 0);\n\n    clearMemory();\n}\n\n}}} // OVR::CAPI::D3D11\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D1X/CAPI_D3D11_DistortionRenderer.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_D3D11_DistortionRenderer.h\nContent     :   Experimental distortion renderer\nCreated     :   November 11, 2013\nAuthors     :   Volga Aksoy\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_D3D11_DistortionRenderer_h\n#define OVR_CAPI_D3D11_DistortionRenderer_h\n\n#include \"CAPI_D3D11_Util.h\"\n#include \"../CAPI_DistortionRenderer.h\"\n\n#include \"Kernel/OVR_Log.h\"\n\nnamespace OVR { namespace CAPI { namespace D3D11 {\n\n\n// ***** D3D11::DistortionRenderer\n\n// Implementation of DistortionRenderer for D3D11.\n\nclass DistortionRenderer : public CAPI::DistortionRenderer\n{\npublic:\n    DistortionRenderer();\n    ~DistortionRenderer();\n\n\n    // Creation function for the device.    \n    static CAPI::DistortionRenderer* Create();\n\n\n    // ***** Public DistortionRenderer interface\n\n    virtual void SubmitEye(int eyeId, const ovrTexture* eyeTexture) OVR_OVERRIDE;\n    virtual void SubmitEyeWithDepth(int eyeId, const ovrTexture* eyeColorTexture, const ovrTexture* eyeDepthTexture) OVR_OVERRIDE;\n\n    virtual void EndFrame(uint32_t frameIndex, bool swapBuffers);\n\n    // TBD: Make public?\n    void         WaitUntilGpuIdle();\n\n    // Similar to ovr_WaitTillTime but it also flushes GPU.\n    // Note, it exits when time expires, even if GPU is not in idle state yet.\n    double       FlushGpuAndWaitTillTime(double absTime);\n\nprotected:\n    virtual bool initializeRenderer(const ovrRenderAPIConfig* apiConfig) OVR_OVERRIDE;\n\n    class GraphicsState : public CAPI::DistortionRenderer::GraphicsState\n    {\n    public:\n        GraphicsState(ID3D11DeviceContext* context);\n        virtual ~GraphicsState();\n        virtual void clearMemory();\n        virtual void Save();\n        virtual void Restore();\n\n    protected:\n        ID3D11DeviceContext* context;\n        BOOL memoryCleared;\n\n        ID3D11RasterizerState* rasterizerState;\n        ID3D11InputLayout* inputLayoutState;\n\n        ID3D11ShaderResourceView*   psShaderResourceState[D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT];\n        ID3D11SamplerState*         psSamplerStates[D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT];\n        ID3D11Buffer*               psConstantBuffersState[D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT];\n\n        ID3D11ShaderResourceView*   vsShaderResourceState[D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT];\n        ID3D11SamplerState*         vsSamplerStates[D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT];\n        ID3D11Buffer*               vsConstantBuffersState[D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT];\n\n        ID3D11ShaderResourceView*   csShaderResourceState[D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT];\n        ID3D11SamplerState*         csSamplerStates[D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT];\n        ID3D11Buffer*               csConstantBuffersState[D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT];\n        ID3D11UnorderedAccessView*  csUnorderedAccessViewState[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT];\n\n        ID3D11RenderTargetView* renderTargetViewState[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT];\n        ID3D11DepthStencilView* depthStencilViewState;\n\n        ID3D11BlendState* omBlendState;\n        FLOAT omBlendFactorState[4];\n        UINT omSampleMaskState;\n\n        D3D11_PRIMITIVE_TOPOLOGY primitiveTopologyState;\n\n        ID3D11Buffer* iaIndexBufferPointerState;\n        DXGI_FORMAT iaIndexBufferFormatState;\n        UINT iaIndexBufferOffsetState;\n\n        ID3D11Buffer* iaVertexBufferPointersState[D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];\n        UINT iaVertexBufferStridesState[D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];\n        UINT iaVertexBufferOffsetsState[D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];\n\n        ID3D11PixelShader* currentPixelShader;\n        ID3D11VertexShader* currentVertexShader;\n        ID3D11GeometryShader* currentGeometryShader;\n        ID3D11HullShader* currentHullShader;\n        ID3D11DomainShader* currentDomainShader;\n        ID3D11ComputeShader* currentComputeShader;\n    };\n\nprivate:\n    // Helpers\n    bool initBuffersAndShaders();\n    void initShaders();\n    void initFullscreenQuad();\n    void initOverdrive();\n    void destroy();\n\n    void setViewport(const Recti& vp);\n\n    void renderDistortion();\n\n    void renderPrimitives(const ShaderFill* fill, Buffer* vertices, Buffer* indices,\n        Matrix4f* viewMatrix, int offset, int count,\n        PrimitiveType rprim);\n\n    void renderEndFrame();\n\n    void createDrawQuad();\n    void renderLatencyQuad(unsigned char* latencyTesterDrawColor);\n    void renderLatencyPixel(unsigned char* latencyTesterPixelColor);\n\n    // Attempt to use DXGI GetFrameStatistics for getting a previous vsync\n    // Returns 0 if no Vsync timing information is available.\n    double getDXGILastVsyncTime();\n\n    // Create or get cached D3D sampler based on flags.\n    ID3D11SamplerState* getSamplerState(int sm);\n\n\n    //// TBD: Should we be using oe from RState instead?\n    //unsigned            DistortionCaps;\n\n    // Back buffer is properly set as an SRGB format?\n    bool                SrgbBackBuffer;\n\n    // Failures retrieving the frame index from renderer\n    int                 FrameIndexFailureCount;\n    static const int    FrameIndexFailureLimit = 5; // After a few failures stop trying.\n\n    // D3DX device and utility variables.\n    RenderParams        RParams;\n    Ptr<Texture>        pEyeTextures[2];\n    Ptr<Texture>        pEyeDepthTextures[2];\n\n    // U,V scale and offset needed for timewarp.\n    ovrVector2f         UVScaleOffset[2][2];\n    ovrSizei            EyeTextureSize[2];\n    ovrRecti            EyeRenderViewport[2];\n\n    Ptr<Texture>        pOverdriveTextures[NumOverdriveTextures];\n    Ptr<Texture>        OverdriveLutTexture;\n\n    //Ptr<Buffer>         mpFullScreenVertexBuffer;\n\n    Ptr<Buffer>         DistortionMeshVBs[2];    // one per-eye\n    Ptr<Buffer>         DistortionMeshIBs[2];    // one per-eye\n    Ptr<Buffer>         DistortionPinBuffer[2];  // one per-eye\n\n    Ptr<ShaderSet>      DistortionShader;\n    Ptr<ID3D11InputLayout> DistortionVertexIL;\n\n    struct StandardUniformData\n    {\n        Matrix4f  Proj;\n        Matrix4f  View;\n    }                   StdUniforms;\n    Ptr<Buffer>         UniformBuffers[Shader_Count];\n\n    Ptr<ID3D11SamplerState>     SamplerStates[Sample_Count];\n    Ptr<ID3D11RasterizerState>  Rasterizer;\n\n    Ptr<Buffer>         LatencyTesterQuadVB;\n    Ptr<ShaderSet>      SimpleQuadShader;\n    Ptr<ID3D11InputLayout> SimpleQuadVertexIL;\n\n    GpuTimer GpuProfiler;\n    Hash<ID3D11Texture2D*, Ptr<ID3D11RenderTargetView>> RenderTargetMap;\n};\n\n}}} // OVR::CAPI::D3D11\n\n#endif // OVR_CAPI_D3D11_DistortionRenderer_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D1X/CAPI_D3D11_HSWDisplay.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_D3D11_HSWDisplay.cpp\nContent     :   Implements Health and Safety Warning system.\nCreated     :   July 7, 2014\nAuthors     :   Paul Pedriana\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"Util/Util_Direct3D.h\"\n#include \"OVR_CAPI_D3D.h\"\n#include \"CAPI_D3D11_HSWDisplay.h\"\n#include \"Kernel/OVR_File.h\"\n#include \"Kernel/OVR_SysFile.h\"\n#include \"Kernel/OVR_Allocator.h\"\n#include \"Kernel/OVR_Color.h\"\n#include \"Extras/OVR_Math.h\"\n\n// We currently borrow the SimpleQuad shaders\n#include \"Shaders/SimpleTexturedQuad_vs.h\"\n#include \"Shaders/SimpleTexturedQuad_ps.h\"\n\n// For a given DXGI format: if the format is a typeless one then this function returns a \n// suitable typed one. If the format is a typed one then this function returns it as-is.\nstatic DXGI_FORMAT GetFullyTypedDXGIFormat(DXGI_FORMAT textureFormat)\n{\n    // http://msdn.microsoft.com/en-us/library/windows/desktop/bb173059%28v=vs.85%29.aspx\n\n    DXGI_FORMAT fullyTypedFormat = textureFormat;\n\n    switch (textureFormat)\n    {\n    case DXGI_FORMAT_R32G32B32A32_TYPELESS:\n        return DXGI_FORMAT_R32G32B32A32_FLOAT;   // or DXGI_FORMAT_R32G32B32A32_UINT, DXGI_FORMAT_R32G32B32A32_SINT\n\n    case DXGI_FORMAT_R32G32B32_TYPELESS:\n        return DXGI_FORMAT_R32G32B32_FLOAT;      // or DXGI_FORMAT_R32G32B32_UINT, DXGI_FORMAT_R32G32B32_SINT\n\n    case DXGI_FORMAT_R16G16B16A16_TYPELESS:\n        return DXGI_FORMAT_R16G16B16A16_UNORM;   // or DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_UINT, DXGI_FORMAT_R16G16B16A16_SNORM, DXGI_FORMAT_R16G16B16A16_SINT\n\n    case DXGI_FORMAT_R8G8B8A8_TYPELESS:\n        return DXGI_FORMAT_R8G8B8A8_UNORM;      // or DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_R8G8B8A8_UINT, DXGI_FORMAT_R8G8B8A8_SNORM, DXGI_FORMAT_R8G8B8A8_SINT\n\n    case DXGI_FORMAT_B8G8R8A8_TYPELESS:\n        return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;\n\n    case DXGI_FORMAT_B8G8R8X8_TYPELESS:\n        return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB;\n\n        // Others which we don't currently support:\n        //case DXGI_FORMAT_R32G32_TYPELESS:\n        //case DXGI_FORMAT_R32G8X24_TYPELESS:\n        //case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:\n        //case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:\n        //case DXGI_FORMAT_R10G10B10A2_TYPELESS:\n        //case DXGI_FORMAT_R16G16_TYPELESS:\n        //case DXGI_FORMAT_R32_TYPELESS:\n        //case DXGI_FORMAT_R24G8_TYPELESS:\n        //case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:\n        //case DXGI_FORMAT_X24_TYPELESS_G8_UINT:\n        //case DXGI_FORMAT_R8G8_TYPELESS:\n        //case DXGI_FORMAT_R16_TYPELESS:\n        //case DXGI_FORMAT_R8_TYPELESS:\n        //case DXGI_FORMAT_BC1_TYPELESS:\n        //case DXGI_FORMAT_BC2_TYPELESS:\n        //case DXGI_FORMAT_BC3_TYPELESS:\n        //case DXGI_FORMAT_BC4_TYPELESS:\n        //case DXGI_FORMAT_BC5_TYPELESS:\n        //case DXGI_FORMAT_BC6H_TYPELESS:\n        //case DXGI_FORMAT_BC7_TYPELESS:\n    }\n\n    return fullyTypedFormat;\n}\n\n\n\nnamespace OVR { namespace CAPI {\n\n// To do Need to move LoadTextureTgaData to a shared location.\nuint8_t* LoadTextureTgaData(OVR::File* f, uint8_t alpha, int& width, int& height);\n\nnamespace D3D11 {\n\n// This is a temporary function implementation, and it functionality needs to be implemented in a more generic way.\nTexture* LoadTextureTga(RenderParams& rParams, ID3D11SamplerState* pSamplerState, OVR::File* f, uint8_t alpha)\n{\n    Texture* pTexture = NULL;\n\n    int width, height;\n    const uint8_t* pRGBA = LoadTextureTgaData(f, alpha, width, height);\n\n    if (pRGBA)\n    {\n        pTexture = new Texture(&rParams, Texture_RGBA, OVR::Sizei(0, 0), pSamplerState, 1);\n\n        // Create the D3D texture\n        D3D11_TEXTURE2D_DESC dsDesc;\n        dsDesc.Width = width;\n        dsDesc.Height = height;\n        dsDesc.MipLevels = 1;\n        dsDesc.ArraySize = 1;\n        dsDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;\n        dsDesc.SampleDesc.Count = 1;\n        dsDesc.SampleDesc.Quality = 0;\n        dsDesc.Usage = D3D11_USAGE_DEFAULT;\n        dsDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;\n        dsDesc.CPUAccessFlags = 0;\n        dsDesc.MiscFlags = 0;\n\n        HRESULT hr = rParams.pDevice->CreateTexture2D(&dsDesc, NULL, &pTexture->Tex.GetRawRef());\n\n        if (SUCCEEDED(hr))\n        {\n            if (dsDesc.BindFlags & D3D11_BIND_SHADER_RESOURCE)\n                rParams.pDevice->CreateShaderResourceView(pTexture->Tex, NULL, &pTexture->TexSv.GetRawRef());\n\n            rParams.pContext->UpdateSubresource(pTexture->Tex, 0, NULL, pRGBA, width * 4, width * height * 4);\n        }\n        else\n        {\n            OVR_DEBUG_LOG_TEXT((\"[LoadTextureTga] CreateTexture2D failed\"));\n            pTexture->Release();\n        }\n\n        OVR_FREE(const_cast<uint8_t*>(pRGBA));\n    }\n\n    return pTexture;\n}\n\n\n// Loads a texture from a memory image of a TGA file.\nTexture* LoadTextureTga(RenderParams& rParams, ID3D11SamplerState* pSamplerState, const uint8_t* pData, int dataSize, uint8_t alpha)\n{\n    MemoryFile memoryFile(\"\", pData, dataSize);\n\n    return LoadTextureTga(rParams, pSamplerState, &memoryFile, alpha);\n}\n\n\n// Loads a texture from a disk TGA file.\nTexture* LoadTextureTga(RenderParams& rParams, ID3D11SamplerState* pSamplerState, const char* pFilePath, uint8_t alpha)\n{\n    SysFile sysFile;\n\n    if (sysFile.Open(pFilePath, FileConstants::Open_Read | FileConstants::Open_Buffered))\n        return LoadTextureTga(rParams, pSamplerState, &sysFile, alpha);\n\n    return NULL;\n}\n\n\n\n// To do: This needs to be promoted to a central version, possibly in CAPI_HSWDisplay.h\nstruct HASWVertex\n{\n    Vector3f  Pos;\n    Color     C;\n    float     U, V;\n\n    HASWVertex(const Vector3f& p, const Color& c = Color(64, 0, 0, 255), float u = 0, float v = 0)\n        : Pos(p), C(c), U(u), V(v)\n    {}\n\n    HASWVertex(float x, float y, float z, const Color& c = Color(64, 0, 0, 255), float u = 0, float v = 0)\n        : Pos(x, y, z), C(c), U(u), V(v)\n    {}\n\n    bool operator==(const HASWVertex& b) const\n    {\n        return (Pos == b.Pos) && (C == b.C) && (U == b.U) && (V == b.V);\n    }\n};\n\n\n\n// The texture below may conceivably be shared between HSWDisplay instances. However,  \n// beware that sharing may not be possible if two HMDs are using different locales  \n// simultaneously. As of this writing it's not clear if that can occur in practice.\n\nHSWDisplay::HSWDisplay(ovrRenderAPIType api, ovrHmd hmd, const HMDRenderState& renderState)\n    : OVR::CAPI::HSWDisplay(api, hmd, renderState),\n    RenderParams()\n{\n}\n\nbool HSWDisplay::Initialize(const ovrRenderAPIConfig* apiConfig)\n{\n    const ovrD3D11Config* config = reinterpret_cast<const ovrD3D11Config*>(apiConfig);\n\n    if (config)\n    {\n        RenderParams.pDevice = config->D3D11.pDevice;\n        RenderParams.pContext = config->D3D11.pDeviceContext;\n        RenderParams.pBackBufferUAV = config->D3D11.pBackBufferUAV;\n        RenderParams.pBackBufferRT = config->D3D11.pBackBufferRT;\n        RenderParams.pSwapChain = config->D3D11.pSwapChain;\n        RenderParams.BackBufferSize = config->D3D11.Header.BackBufferSize;\n        RenderParams.Multisample = config->D3D11.Header.Multisample;\n        RenderParams.VidPnTargetId = 0;\n\n        // We may want to create RasterizerState, or alternatively let the DistortionRenderer handle it.\n    }\n    // else do any necessary cleanup\n\n    return true;\n}\n\nvoid HSWDisplay::Shutdown()\n{\n    UnloadGraphics();\n}\n\n\nvoid HSWDisplay::DisplayInternal()\n{\n    HSWDISPLAY_LOG((\"[HSWDisplay D3D11] DisplayInternal()\"));\n    // We may want to call LoadGraphics here instead of within Render.\n}\n\n\nvoid HSWDisplay::DismissInternal()\n{\n    HSWDISPLAY_LOG((\"[HSWDisplay D3D11] DismissInternal()\"));\n    UnloadGraphics();\n}\n\n\nvoid HSWDisplay::UnloadGraphics()\n{\n    //RenderParams: nothing to do.\n    pSamplerState.Clear();\n    pTexture.Clear();\n    pVB.Clear();\n    for (size_t i = 0; i < OVR_ARRAY_COUNT(UniformBufferArray); i++)\n        UniformBufferArray[i].Clear();\n    pShaderSet.Clear();\n    pVertexInputLayout.Clear();\n    pBlendState.Clear();\n    pRasterizerState.Clear();\n    // OrthoProjection: No need to clear.\n}\n\nvoid HSWDisplay::LoadGraphics()\n{\n    // Load the graphics if not loaded already.\n    if (!pSamplerState)\n    {\n        D3D11_SAMPLER_DESC sDesc;\n\n        memset(&sDesc, 0, sizeof(sDesc));\n        sDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;\n        sDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;\n        sDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;\n        sDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;\n\n        RenderParams.pDevice->CreateSamplerState(&sDesc, &pSamplerState.GetRawRef());\n    }\n\n#if defined(OVR_BUILD_DEBUG)\n    if (!pTexture)\n        pTexture = *LoadTextureTga(RenderParams, pSamplerState, \"C:\\\\TestPath\\\\TestFile.tga\", 255);\n#endif\n\n    if (!pTexture) // To do: Add support for .dds files, which would be significantly smaller than the size of the tga.\n    {\n        size_t textureSize;\n        const uint8_t* TextureData = GetDefaultTexture(textureSize);\n        pTexture = *LoadTextureTga(RenderParams, pSamplerState, TextureData, (int)textureSize, 255);\n    }\n\n    if (!UniformBufferArray[0])\n    {\n        for (size_t i = 0; i < OVR_ARRAY_COUNT(UniformBufferArray); i++)\n            UniformBufferArray[i] = *new Buffer(&RenderParams);\n    }\n\n    if (!pShaderSet)\n    {\n        pShaderSet = *new ShaderSet;\n\n        // Setup the vertex shader\n        const D3D11_INPUT_ELEMENT_DESC VertexDescription[] = {\n            { \"Position\", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, offsetof(HASWVertex, Pos), D3D11_INPUT_PER_VERTEX_DATA, 0 },\n            { \"Color\", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, offsetof(HASWVertex, C), D3D11_INPUT_PER_VERTEX_DATA, 0 },\n            { \"TexCoord\", 0, DXGI_FORMAT_R32G32_FLOAT, 0, offsetof(HASWVertex, U), D3D11_INPUT_PER_VERTEX_DATA, 0 }\n        };\n\n        Ptr<VertexShader> vs = *new VertexShader(&RenderParams, (void*)SimpleTexturedQuad_vs, sizeof(SimpleTexturedQuad_vs), SimpleTexturedQuad_vs_refl, OVR_ARRAY_COUNT(SimpleTexturedQuad_vs_refl));\n        pVertexInputLayout = NULL; // Make sure it's cleared in case it wasn't.\n        ID3D11InputLayout** ppD3DInputLayout = &pVertexInputLayout.GetRawRef();\n        HRESULT hResult = RenderParams.pDevice->CreateInputLayout(VertexDescription, OVR_ARRAY_COUNT(VertexDescription), SimpleTexturedQuad_vs, sizeof(SimpleTexturedQuad_vs), ppD3DInputLayout);\n        OVR_ASSERT(SUCCEEDED(hResult));\n        if (SUCCEEDED(hResult))\n            pShaderSet->SetShader(vs);\n\n        // Setup the pixel shader\n        Ptr<PixelShader> ps = *new PixelShader(&RenderParams, (void*)SimpleTexturedQuad_ps, sizeof(SimpleTexturedQuad_ps), SimpleTexturedQuad_ps_refl, OVR_ARRAY_COUNT(SimpleTexturedQuad_ps_refl));\n        pShaderSet->SetShader(ps);\n\n        if (!pBlendState)\n        {\n            D3D11_BLEND_DESC bm;\n            memset(&bm, 0, sizeof(bm));\n            bm.RenderTarget[0].BlendEnable = TRUE;\n            bm.RenderTarget[0].BlendOp = bm.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;\n            bm.RenderTarget[0].SrcBlend = bm.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA;\n            bm.RenderTarget[0].DestBlend = bm.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;\n            bm.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;\n\n            RenderParams.pDevice->CreateBlendState(&bm, &pBlendState.GetRawRef());\n        }\n\n        if (!pRasterizerState)\n        {\n            D3D11_RASTERIZER_DESC rs;\n            memset(&rs, 0, sizeof(rs));\n            rs.AntialiasedLineEnable = true;\n            rs.CullMode = D3D11_CULL_BACK;\n            rs.DepthClipEnable = true;\n            rs.FillMode = D3D11_FILL_SOLID;\n\n            RenderParams.pDevice->CreateRasterizerState(&rs, &pRasterizerState.GetRawRef());\n        }\n    }\n\n    if (!pVB)\n    {\n        pVB = *new Buffer(&RenderParams);\n\n        if (pVB)\n        {\n            const size_t vertexCount = 4;\n\n            pVB->Data(Buffer_Vertex, NULL, vertexCount * sizeof(HASWVertex));\n            HASWVertex* pVertices = (HASWVertex*)pVB->Map(0, vertexCount * sizeof(HASWVertex), Map_Discard);\n            OVR_ASSERT(pVertices);\n\n            if (pVertices)\n            {\n                const bool  flip = ((RenderState.DistortionCaps & ovrDistortionCap_FlipInput) != 0);\n                const float left = -1.0f; // We currently draw this in normalized device coordinates with an stereo translation\n                const float top = -1.1f; // applied as a vertex shader uniform. In the future when we have a more formal graphics\n                const float right = 1.0f; // API abstraction we may move this draw to an overlay layer or to a more formal \n                const float bottom = 0.9f; // model/mesh scheme with a perspective projection.\n\n                // See warning in LoadTextureTgaData() about this TGA being loaded \"upside down\", i.e. UV origin is at bottom-left.\n                pVertices[0] = HASWVertex(left, top, 0.f, Color(255, 255, 255, 255), 0.f, flip ? 1.f : 0.f);\n                pVertices[1] = HASWVertex(left, bottom, 0.f, Color(255, 255, 255, 255), 0.f, flip ? 0.f : 1.f);\n                pVertices[2] = HASWVertex(right, top, 0.f, Color(255, 255, 255, 255), 1.f, flip ? 1.f : 0.f);\n                pVertices[3] = HASWVertex(right, bottom, 0.f, Color(255, 255, 255, 255), 1.f, flip ? 0.f : 1.f);\n\n                pVB->Unmap(pVertices);\n            }\n        }\n    }\n}\n\n\n// Note: If we are drawing this warning onto the eye texture before distortion, the \"time warp\" functionality\n// will cause the warning to shake on the screen when the user moves their head. One solution is to disable\n// time warping while the warning or any screen-static GUI elements are present.\n\nvoid HSWDisplay::RenderInternal(ovrEyeType eye, const ovrTexture* eyeTexture)\n{\n    if (RenderEnabled && eyeTexture)\n    {\n        // We need to render to the eyeTexture with the texture viewport.\n        // Setup rendering to the texture.\n        ovrD3D11Texture* eyeTextureD3D = const_cast<ovrD3D11Texture*>(reinterpret_cast<const ovrD3D11Texture*>(eyeTexture));\n        OVR_ASSERT(eyeTextureD3D->Texture.Header.API == ovrRenderAPI_D3D11);\n\n        // Load the graphics if not loaded already.\n        if (!pVB)\n            LoadGraphics();\n\n        // Calculate ortho projection.\n        GetOrthoProjection(RenderState, OrthoProjection);\n\n        // Save settings\n        // To do: Merge this saved state with that done by DistortionRenderer::GraphicsState::Save(), and put them in a shared location.\n        Ptr<ID3D11BlendState> pBlendStateSaved;\n        FLOAT blendFactorSaved[4];\n        UINT blendSampleMaskSaved;\n        RenderParams.pContext->OMGetBlendState(&pBlendStateSaved.GetRawRef(), blendFactorSaved, &blendSampleMaskSaved);\n\n        Ptr<ID3D11RasterizerState> pRasterizerStateSaved;\n        RenderParams.pContext->RSGetState(&pRasterizerStateSaved.GetRawRef());\n\n        Ptr<ID3D11RenderTargetView> pTextureRenderTargetViewSaved;\n        Ptr<ID3D11DepthStencilView> pDepthStencilViewSaved;\n        RenderParams.pContext->OMGetRenderTargets(1, &pTextureRenderTargetViewSaved.GetRawRef(), &pDepthStencilViewSaved.GetRawRef());\n\n        D3D11_VIEWPORT d3dViewportSaved[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];\n        UINT viewportCountSaved = OVR_ARRAY_COUNT(d3dViewportSaved);\n        RenderParams.pContext->RSGetViewports(&viewportCountSaved, d3dViewportSaved);\n\n        UINT stencilRefSaved;\n        Ptr<ID3D11DepthStencilState> pDepthStencilStateSaved;\n        RenderParams.pContext->OMGetDepthStencilState(&pDepthStencilStateSaved.GetRawRef(), &stencilRefSaved);\n\n        Ptr<ID3D11InputLayout> pInputLayoutSaved;\n        RenderParams.pContext->IAGetInputLayout(&pInputLayoutSaved.GetRawRef());\n\n        Ptr<ID3D11Buffer> pVertexBufferSaved;\n        UINT vertexStrideSaved[1];\n        UINT vertexOffsetSaved[1];\n        RenderParams.pContext->IAGetVertexBuffers(0, 1, &pVertexBufferSaved.GetRawRef(), vertexStrideSaved, vertexOffsetSaved);\n\n        D3D11_PRIMITIVE_TOPOLOGY topologySaved;\n        RenderParams.pContext->IAGetPrimitiveTopology(&topologySaved);\n\n\n        // Set our settings\n        RenderParams.pContext->OMSetBlendState(pBlendState, NULL, 0xffffffff);\n        RenderParams.pContext->RSSetState(pRasterizerState);\n\n        // We can't necessarily use a NULL D3D11_RENDER_TARGET_VIEW_DESC argument to CreateRenderTargetView, because we are rendering to\n        // a texture that somebody else created and which may have been created in a typeless format (e.g. DXGI_FORMAT_R8G8B8A8_TYPELESS).\n        // So what we do is check to see if the texture format is a typeless format and if see we pass a suitable D3D11_RENDER_TARGET_VIEW_DESC\n        // to CreateRenderTargetView instead of NULL.\n        D3D11_TEXTURE2D_DESC texture2DDesc;\n        eyeTextureD3D->D3D11.pTexture->GetDesc(&texture2DDesc);\n\n        D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc;\n        memset(&renderTargetViewDesc, 0, sizeof(renderTargetViewDesc));\n        renderTargetViewDesc.Format = GetFullyTypedDXGIFormat(texture2DDesc.Format); // DXGI_FORMAT. If this is a typeless format then GetFullyTypedFormat converts it to a fully typed format. \n        renderTargetViewDesc.ViewDimension = (texture2DDesc.SampleDesc.Count > 1) ? D3D11_RTV_DIMENSION_TEXTURE2DMS : D3D11_RTV_DIMENSION_TEXTURE2D;\n        renderTargetViewDesc.Texture2D.MipSlice = 0;\n        Ptr<ID3D11RenderTargetView> pTextureRenderTargetView;\n        HRESULT hResult = RenderParams.pDevice->CreateRenderTargetView(eyeTextureD3D->D3D11.pTexture, (renderTargetViewDesc.Format == texture2DDesc.Format) ? NULL : &renderTargetViewDesc, &pTextureRenderTargetView.GetRawRef());\n\n        if (SUCCEEDED(hResult))\n        {\n            RenderParams.pContext->OMSetRenderTargets(1, &pTextureRenderTargetView.GetRawRef(), NULL); // We currently don't bind a depth buffer.\n\n            D3D11_VIEWPORT D3DViewport;\n\n            OVR_DISABLE_MSVC_WARNING(4244) // conversion from int to float\n            D3DViewport.TopLeftX = eyeTextureD3D->Texture.Header.RenderViewport.Pos.x;\n            D3DViewport.TopLeftY = eyeTextureD3D->Texture.Header.RenderViewport.Pos.y;\n            D3DViewport.Width = eyeTextureD3D->Texture.Header.RenderViewport.Size.w;\n            D3DViewport.Height = eyeTextureD3D->Texture.Header.RenderViewport.Size.h;\n            D3DViewport.MinDepth = 0;\n            D3DViewport.MaxDepth = 1;\n            RenderParams.pContext->RSSetViewports(1, &D3DViewport);\n            OVR_RESTORE_MSVC_WARNING()\n\n            // We don't set up a world/view/projection matrix because we are using \n            // normalized device coordinates below.\n\n            // We don't set the depth state because we aren't using it.\n            //     RenderParams.pContext->OMSetDepthStencilState(<depth state>, 0);\n\n            ShaderFill fill(pShaderSet);\n            fill.SetInputLayout(pVertexInputLayout);\n            if (pTexture)\n                fill.SetTexture(0, pTexture, Shader_Pixel);\n\n            const float scale = HSWDISPLAY_SCALE * ((RenderState.OurHMDInfo.HmdType == HmdType_DK1) ? 0.70f : 1.f);\n            pShaderSet->SetUniform2f(\"Scale\", scale, scale / 2.f); // X and Y scale. Y is a fixed proportion to X in order to give a certain aspect ratio.\n            pShaderSet->SetUniform4f(\"Color\", 1.f, 1.f, 1.f, 1.f);\n            pShaderSet->SetUniform2f(\"PositionOffset\", OrthoProjection[eye].GetTranslation().x, 0.0f);\n\n            RenderParams.pContext->IASetInputLayout((ID3D11InputLayout*)fill.GetInputLayout());\n\n            ID3D11Buffer* vertexBuffer = pVB->GetBuffer();\n            UINT          vertexStride = sizeof(HASWVertex);\n            UINT          vertexOffset = 0;\n            RenderParams.pContext->IASetVertexBuffers(0, 1, &vertexBuffer, &vertexStride, &vertexOffset);\n\n            ShaderBase*    vShaderBase = (ShaderBase*)pShaderSet->GetShader(OVR::CAPI::D3D11::Shader_Vertex);\n            unsigned char* vertexData = vShaderBase->UniformData;\n\n            if (vertexData)\n            {\n                UniformBufferArray[OVR::CAPI::D3D11::Shader_Vertex]->Data(OVR::CAPI::D3D11::Buffer_Uniform, vertexData, vShaderBase->UniformsSize);\n                vShaderBase->SetUniformBuffer(UniformBufferArray[OVR::CAPI::D3D11::Shader_Vertex]);\n            }\n\n            for (int i = (OVR::CAPI::D3D11::Shader_Vertex + 1); i < OVR::CAPI::D3D11::Shader_Count; i++)\n            {\n                if (pShaderSet->GetShader(i))\n                {\n                    ((ShaderBase*)pShaderSet->GetShader(i))->UpdateBuffer(UniformBufferArray[i]);\n                    ((ShaderBase*)pShaderSet->GetShader(i))->SetUniformBuffer(UniformBufferArray[i]);\n                }\n            }\n\n            RenderParams.pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);\n            fill.Set(Prim_TriangleStrip);\n\n            RenderParams.pContext->Draw(4, 0);\n        }\n        else\n        {\n            HSWDISPLAY_LOG((\"[HSWDisplay D3D11] CreateRenderTargetView() failed\"));\n        }\n\n\n        // Restore settings\n        RenderParams.pContext->IASetPrimitiveTopology(topologySaved);\n        RenderParams.pContext->IASetVertexBuffers(0, 1, &pVertexBufferSaved.GetRawRef(), &vertexStrideSaved[0], &vertexOffsetSaved[0]);\n        RenderParams.pContext->IASetInputLayout(pInputLayoutSaved);\n        RenderParams.pContext->OMSetDepthStencilState(pDepthStencilStateSaved, stencilRefSaved);\n        RenderParams.pContext->RSSetViewports(viewportCountSaved, d3dViewportSaved);\n        RenderParams.pContext->OMSetRenderTargets(1, &pTextureRenderTargetViewSaved.GetRawRef(), pDepthStencilViewSaved);\n        RenderParams.pContext->RSSetState(pRasterizerStateSaved);\n        RenderParams.pContext->OMSetBlendState(pBlendStateSaved, blendFactorSaved, blendSampleMaskSaved);\n    }\n}\n\n}}} // namespace OVR::CAPI::D3D11\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D1X/CAPI_D3D11_HSWDisplay.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_D3D11_HSWDisplay.h\nContent     :   Implements Health and Safety Warning system.\nCreated     :   July 7, 2014\nAuthors     :   Paul Pedriana\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_D3D11_HSWDisplay_h\n#define OVR_CAPI_D3D11_HSWDisplay_h\n\n#include \"../CAPI_HSWDisplay.h\"\n#include \"CAPI_D3D11_Util.h\"\n\nnamespace OVR { namespace CAPI { namespace D3D11 {\n\nclass HSWDisplay : public CAPI::HSWDisplay\n{\npublic:\n    HSWDisplay(ovrRenderAPIType api, ovrHmd hmd, const HMDRenderState& renderState);\n\n    // Must be called before use. apiConfig is such that:\n    //   const ovrD3D11Config* config = (const ovrD3D11Config*)apiConfig; or\n    bool Initialize(const ovrRenderAPIConfig* apiConfig);\n    void Shutdown();\n    void DisplayInternal();\n    void DismissInternal();\n\n    // Draws the warning to the eye texture(s). This must be done at the end of a \n    // frame but prior to executing the distortion rendering of the eye textures. \n    void RenderInternal(ovrEyeType eye, const ovrTexture* eyeTexture);\n\nprotected:\n    void LoadGraphics();\n    void UnloadGraphics();\n\n    RenderParams                      RenderParams;\n    Ptr<ID3D11SamplerState>           pSamplerState;\n    Ptr<Texture>                      pTexture;\n    Ptr<Buffer>                       pVB;\n    Ptr<Buffer>                       UniformBufferArray[Shader_Count];\n    Ptr<ShaderSet>                    pShaderSet;\n    Ptr<ID3D11InputLayout>            pVertexInputLayout;\n    Ptr<ID3D11BlendState>             pBlendState;\n    Ptr<ID3D11RasterizerState>        pRasterizerState;\n    Matrix4f                          OrthoProjection[ovrEye_Count];\n\nprivate:\n    OVR_NON_COPYABLE(HSWDisplay)\n};\n\n}}} // namespace OVR::CAPI::D3D11\n\n#endif // OVR_CAPI_D3D11_HSWDisplay_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D1X/CAPI_D3D11_Util.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_D3D11_Util.cpp\nContent     :   D3DX11 utility classes for rendering\nCreated     :   September 10, 2012\nAuthors     :   Andrew Reisse\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_D3D11_Util.h\"\n\nnamespace OVR { namespace CAPI { namespace D3D11 {\n\n\n//-------------------------------------------------------------------------------------\n// ***** ShaderFill\n\nvoid ShaderFill::Set(PrimitiveType prim) const\n{\n    Shaders->Set(prim);\n\n\tfor(int i = 0; i < 8; ++i)\n    {\n        if ( VsTextures[i] != NULL )\n        {\n\t\t    VsTextures[i]->Set(i, Shader_Vertex);\n        }\n    }\n\n\tfor(int i = 0; i < 8; ++i)\n    {\n        if ( CsTextures[i] != NULL )\n        {\n\t\t    CsTextures[i]->Set(i, Shader_Compute);\n        }\n    }\n\n\tfor(int i = 0; i < 8; ++i)\n    {\n        if ( PsTextures[i] != NULL )\n        {\n\t\t    PsTextures[i]->Set(i, Shader_Fragment);\n        }\n    }\n}\n\n\n//-------------------------------------------------------------------------------------\n// ***** Buffer\n\nBuffer::~Buffer()\n{\n}\n\nbool Buffer::Data(int use, const void *buffer, size_t size, int computeBufferStride /*=-1*/)\n{\n    HRESULT hr;\n\n    if (D3DBuffer && Size >= size)\n    {\n        if (Dynamic)\n        {\n            if (!buffer)\n                return true;\n\n            void* v = Map(0, size, Map_Discard);\n            if (v)\n            {\n                memcpy(v, buffer, size);\n                Unmap(v);\n                return true;\n            }\n        }\n        else\n        {\n            OVR_ASSERT (!(use & Buffer_ReadOnly));\n            pParams->pContext->UpdateSubresource(D3DBuffer, 0, NULL, buffer, 0, 0);\n            return true;\n        }\n    }\n    if (D3DBuffer)\n    {\n        D3DBuffer = NULL;\n        Size = 0;\n        Use = 0;\n        Dynamic = false;\n    }\n    D3DSrv = NULL;\n    D3DUav = NULL;\n\n    D3D11_BUFFER_DESC desc;\n    memset(&desc, 0, sizeof(desc));\n    if (use & Buffer_ReadOnly)\n    {\n        desc.Usage = D3D11_USAGE_IMMUTABLE;\n        desc.CPUAccessFlags = 0;\n    }\n    else\n    {\n        desc.Usage = D3D11_USAGE_DYNAMIC;\n        desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;\n        Dynamic = true;\n    }\n\n    switch(use & Buffer_TypeMask)\n    {\n    case Buffer_Vertex:  desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; break;\n    case Buffer_Index:   desc.BindFlags = D3D11_BIND_INDEX_BUFFER;  break;\n    case Buffer_Uniform:\n        desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;\n        size = ((size + 15) & ~15);\n        break;\n    case Buffer_Compute:\n        // There's actually a bunch of options for buffers bound to a CS.\n        // Right now this is the most appropriate general-purpose one. Add more as needed.\n\n        // NOTE - if you want D3D11_(CPU_ACCESS_WRITE), it MUST be either D3D11_(USAGE_DYNAMIC) or D3D11_(USAGE_STAGING).\n        // TODO: we want a resource that is rarely written to, in which case we'd need two surfaces - one a STAGING\n        // that the CPU writes to, and one a DEFAULT, and we CopyResource from one to the other. Hassle!\n        // Setting it as D3D11_(USAGE_DYNAMIC) will get the job done for now.\n        // Also for fun - you can't have a D3D11_(USAGE_DYNAMIC) buffer that is also a D3D11_(BIND_UNORDERED_ACCESS).\n        OVR_ASSERT ( !(use & Buffer_ReadOnly) );\n        desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;\n        desc.Usage     = D3D11_USAGE_DYNAMIC;\n        desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;\n        desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;\n        OVR_ASSERT ( computeBufferStride > 0 );\n        desc.StructureByteStride = computeBufferStride; // sizeof(DistortionComputePin);\n\n        Dynamic = true;\n        size = ((size + 15) & ~15);\n        break;\n    }\n\n    desc.ByteWidth = (unsigned)size;\n\n    D3D11_SUBRESOURCE_DATA sr;\n    sr.pSysMem = buffer;\n    sr.SysMemPitch = 0;\n    sr.SysMemSlicePitch = 0;\n\n    D3DBuffer = NULL;\n    hr = pParams->pDevice->CreateBuffer(&desc, buffer ? &sr : NULL, &D3DBuffer.GetRawRef());\n    OVR_D3D_CHECK_RET_FALSE(hr);\n\n    Use = 0;\n    Size = 0;\n\n    if ( ( use & Buffer_TypeMask ) == Buffer_Compute )\n    {\n        hr = pParams->pDevice->CreateShaderResourceView ( D3DBuffer, NULL, &D3DSrv.GetRawRef() );\n        OVR_D3D_CHECK_RET_FALSE(hr);\n\n#if 0           // Right now we do NOT ask for UAV access (see flags above).\n        hr = Ren->Device->CreateUnorderedAccessView ( D3DBuffer, NULL, &D3DUav.GetRawRef() );\n        OVR_D3D_CHECK_RET_FALSE(hr);\n#endif\n    }\n\n    Use = use;\n    Size = desc.ByteWidth;\n\n    return true;\n\n}\n\nvoid*  Buffer::Map(size_t start, size_t size, int flags)\n{\n    OVR_UNUSED(size);\n\n    D3D11_MAP mapFlags = D3D11_MAP_WRITE;\n    if (flags & Map_Discard)    \n        mapFlags = D3D11_MAP_WRITE_DISCARD;    \n    if (flags & Map_Unsynchronized)    \n        mapFlags = D3D11_MAP_WRITE_NO_OVERWRITE;\n\n    D3D11_MAPPED_SUBRESOURCE map;\n    if (SUCCEEDED(pParams->pContext->Map(D3DBuffer, 0, mapFlags, 0, &map)))\n        return ((char*)map.pData) + start;\n\n    return NULL;\n}\n\nbool   Buffer::Unmap(void *m)\n{\n    OVR_UNUSED(m);\n\n    pParams->pContext->Unmap(D3DBuffer, 0);\n    return true;\n}\n\n\n//-------------------------------------------------------------------------------------\n// Shaders\n\ntemplate<> bool ShaderImpl<Shader_Vertex, ID3D11VertexShader>::Load(void* shader, size_t size)\n{\n    HRESULT hr = pParams->pDevice->CreateVertexShader(shader, size, nullptr, &D3DShader);\n    OVR_D3D_CHECK_RET_FALSE(hr);\n    return true;\n}\ntemplate<> bool ShaderImpl<Shader_Pixel, ID3D11PixelShader>::Load(void* shader, size_t size)\n{\n    HRESULT hr = pParams->pDevice->CreatePixelShader(shader, size, nullptr, &D3DShader);\n    OVR_D3D_CHECK_RET_FALSE(hr);\n    return true;\n}\ntemplate<> bool ShaderImpl<Shader_Compute, ID3D11ComputeShader>::Load(void* shader, size_t size)\n{\n    HRESULT hr = pParams->pDevice->CreateComputeShader(shader, size, nullptr, &D3DShader);\n    OVR_D3D_CHECK_RET_FALSE(hr);\n    return true;\n}\n\ntemplate<> void ShaderImpl<Shader_Vertex, ID3D11VertexShader>::Set(PrimitiveType) const\n{\n    pParams->pContext->VSSetShader(D3DShader, nullptr, 0);\n}\ntemplate<> void ShaderImpl<Shader_Pixel, ID3D11PixelShader>::Set(PrimitiveType) const\n{\n    pParams->pContext->PSSetShader(D3DShader, nullptr, 0);\n}\ntemplate<> void ShaderImpl<Shader_Compute, ID3D11ComputeShader>::Set(PrimitiveType) const\n{\n    pParams->pContext->CSSetShader(D3DShader, nullptr, 0);\n}\n\ntemplate<> void ShaderImpl<Shader_Vertex, ID3D11VertexShader>::SetUniformBuffer(Buffer* buffer, int i)\n{\n    pParams->pContext->VSSetConstantBuffers(i, 1, &((Buffer*)buffer)->D3DBuffer.GetRawRef());\n}\ntemplate<> void ShaderImpl<Shader_Pixel, ID3D11PixelShader>::SetUniformBuffer(Buffer* buffer, int i)\n{\n    pParams->pContext->PSSetConstantBuffers(i, 1, &((Buffer*)buffer)->D3DBuffer.GetRawRef());\n}\ntemplate<> void ShaderImpl<Shader_Compute, ID3D11ComputeShader>::SetUniformBuffer(Buffer* buffer, int i)\n{\n    pParams->pContext->CSSetConstantBuffers(i, 1, &((Buffer*)buffer)->D3DBuffer.GetRawRef());\n}\n\n//-------------------------------------------------------------------------------------\n// ***** Shader Base\n\nShaderBase::ShaderBase(RenderParams* rp, ShaderStage stage) :\n    Shader(stage),\n    pParams(rp),\n    UniformData(NULL),\n    UniformsSize(0),\n    UniformRefl(NULL),\n    UniformReflSize(0)\n{\n}\n\nShaderBase::~ShaderBase()\n{\n    if (UniformData)\n    {\n        OVR_FREE(UniformData);\n        UniformData = NULL;\n    }\n\n    // UniformRefl does not need to be freed\n    UniformRefl = NULL;\n}\n\nbool ShaderBase::SetUniform(const char* name, int n, const float* v)\n{\n    for(unsigned i = 0; i < UniformReflSize; i++)\n    {\n        if (!strcmp(UniformRefl[i].Name, name))\n        {\n            memcpy(UniformData + UniformRefl[i].Offset, v, n * sizeof(float));\n            return 1;\n        }\n    }\n    return 0;\n}\n\nbool ShaderBase::SetUniformBool(const char* name, int n, const bool* v) \n{\n    OVR_UNUSED(n);\n    for(unsigned i = 0; i < UniformReflSize; i++)\n    {\n        if (!strcmp(UniformRefl[i].Name, name))\n        {\n            memcpy(UniformData + UniformRefl[i].Offset, v, UniformRefl[i].Size);\n            return 1;\n        }\n    }\n    return 0;\n}\n\nvoid ShaderBase::InitUniforms(const Uniform* refl, size_t reflSize)\n{\n    UniformsSize = 0;\n    if (UniformData)\n    {\n        OVR_FREE(UniformData);\n        UniformData = 0;\n    }\n\n    if (!refl)\n    {\n        UniformRefl = NULL;\n        UniformReflSize = 0;\n        return; // no reflection data\n    }\n\n    UniformRefl = refl;\n    UniformReflSize = reflSize;\n    \n    UniformsSize = UniformRefl[UniformReflSize-1].Offset + UniformRefl[UniformReflSize-1].Size;\n    UniformData = (unsigned char*)OVR_ALLOC(UniformsSize);\n}\n\nvoid ShaderBase::UpdateBuffer(Buffer* buf)\n{\n    if (UniformsSize)\n    {\n        buf->Data(Buffer_Uniform, UniformData, UniformsSize);\n    }\n}\n\n\n//-------------------------------------------------------------------------------------\n// ***** Texture\n// \nTexture::Texture(RenderParams* rp, int fmt, const Sizei texSize,\n                 ID3D11SamplerState* sampler, int samples)\n    : pParams(rp), Tex(NULL), TexSv(NULL), TexRtv(NULL), TexDsv(NULL),\n    TextureSize(texSize),\n    Sampler(sampler),\n    Samples(samples)\n{\n    OVR_UNUSED(fmt);    \n}\n\n\nTexture::Texture(RenderParams* rp, int format, const Sizei texSize,\n    ID3D11SamplerState* sampler, const void* data, int mipcount)\n    : pParams(rp), Tex(NULL), TexSv(NULL), TexRtv(NULL), TexDsv(NULL),\n    TextureSize(texSize),\n    Sampler(sampler),\n    Samples(1)\n{\n    OVR_ASSERT(rp->pDevice != NULL);\n\n    OVR_UNUSED(mipcount);\n\n    //if (format == Texture_DXT1 || format == Texture_DXT3 || format == Texture_DXT5)\n    //{\n    //    int convertedFormat;\n    //    switch (format)\n    //    {\n    //    case Texture_DXT1:  convertedFormat = DXGI_FORMAT_BC1_UNORM;    break;\n    //    case Texture_DXT3:  convertedFormat = DXGI_FORMAT_BC2_UNORM;    break;\n    //    case Texture_DXT5:\n    //    default:            convertedFormat = DXGI_FORMAT_BC3_UNORM;    break;\n    //    }\n    //    unsigned largestMipWidth   = 0;\n    //    unsigned largestMipHeight  = 0;\n    //    unsigned effectiveMipCount = mipcount;\n    //    unsigned textureSize       = 0;\n\n    //    D3D11_SUBRESOURCE_DATA* subresData =\n    //        (D3D11_SUBRESOURCE_DATA*) OVR_ALLOC(sizeof(D3D11_SUBRESOURCE_DATA) * mipcount);\n    //    GenerateSubresourceData(width, height, convertedFormat, imageDimUpperLimit, data, subresData, largestMipWidth,\n    //        largestMipHeight, textureSize, effectiveMipCount);\n    //    TotalTextureMemoryUsage += textureSize;\n\n    //    if (!Device || !subresData)\n    //    {\n    //        return NULL;\n    //    }\n\n    //    Texture* NewTex = new Texture(this, format, largestMipWidth, largestMipHeight);\n    //    // BCn/DXTn - no AA.\n    //    Samples = 1;\n\n    //    D3D11_TEXTURE2D_DESC desc;\n    //    desc.Width      = largestMipWidth;\n    //    desc.Height     = largestMipHeight;\n    //    desc.MipLevels  = effectiveMipCount;\n    //    desc.ArraySize  = 1;\n    //    desc.Format     = static_cast<DXGI_FORMAT>(convertedFormat);\n    //    desc.SampleDesc.Count = 1;\n    //    desc.SampleDesc.Quality = 0;\n    //    desc.Usage      = D3D11_USAGE_DEFAULT;\n    //    desc.BindFlags  = D3D11_BIND_SHADER_RESOURCE;\n    //    desc.CPUAccessFlags = 0;\n    //    desc.MiscFlags  = 0;\n\n    //    Tex = NULL;\n    //    HRESULT hr = Device->CreateTexture2D(&desc, static_cast<D3D11_SUBRESOURCE_DATA*>(subresData),\n    //        &Tex.GetRawRef());\n    //    OVR_FREE(subresData);\n    //    if (FAILED(hr))\n    //    {\n    //        OVR_LOG_COM_ERROR(hr);\n    //    }\n\n    //    if (SUCCEEDED(hr) && NewTex != 0)\n    //    {\n    //        D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc;\n    //        memset(&SRVDesc, 0, sizeof(SRVDesc));\n    //        SRVDesc.Format = static_cast<DXGI_FORMAT>(format);\n    //        SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2D;\n    //        SRVDesc.Texture2D.MipLevels = desc.MipLevels;\n\n    //        TexSv = NULL;\n    //        hr = Device->CreateShaderResourceView(Tex, NULL, &TexSv.GetRawRef());\n\n    //        if (FAILED(hr))\n    //        {\n    //            OVR_LOG_COM_ERROR(hr);\n    //            Release();\n    //            return NULL;\n    //        }\n    //        return NewTex;\n    //    }\n\n    //    return NULL;\n    //}\n    //else\n    {\n        int samples = (format & Texture_SamplesMask);\n        if (samples < 1)\n        {\n            samples = 1;\n        }\n\n        bool createDepthSrv = (format & Texture_SampleDepth) > 0;\n\n        DXGI_FORMAT d3dformat;\n        int         bpp;\n        switch(format & Texture_TypeMask)\n        {\n            //case Texture_BGRA:\n            //    bpp = 4;\n            //    d3dformat = (format & Texture_SRGB) ? DXGI_FORMAT_B8G8R8A8_UNORM_SRGB : DXGI_FORMAT_B8G8R8A8_UNORM;\n            //    break;\n        case Texture_RGBA:\n            bpp = 4;\n            //d3dformat = (format & Texture_SRGB) ? DXGI_FORMAT_R8G8B8A8_UNORM_SRGB : DXGI_FORMAT_R8G8B8A8_UNORM;\n            d3dformat = DXGI_FORMAT_R8G8B8A8_UNORM;\n            break;\n            //case Texture_R:\n            //    bpp = 1;\n            //    d3dformat = DXGI_FORMAT_R8_UNORM;\n            //    break;\n            //case Texture_A:\n            //    bpp = 1;\n            //    d3dformat = DXGI_FORMAT_A8_UNORM;\n            //    break;\n        case Texture_Depth:\n            bpp = 0;\n            d3dformat = createDepthSrv ? DXGI_FORMAT_R32_TYPELESS : DXGI_FORMAT_D32_FLOAT;\n            break;\n        default:\n            bpp = 4;\n            d3dformat = DXGI_FORMAT_R8G8B8A8_UNORM;\n            OVR_ASSERT(0);\n        }\n\n        D3D11_TEXTURE2D_DESC dsDesc;\n        dsDesc.Width     = texSize.w;\n        dsDesc.Height    = texSize.h;\n        dsDesc.MipLevels = (format == (Texture_RGBA | Texture_GenMipmaps) && data) ? GetNumMipLevels(texSize.w, texSize.h) : 1;\n        dsDesc.ArraySize = 1;\n        dsDesc.Format    = d3dformat;\n        dsDesc.SampleDesc.Count = samples;\n        dsDesc.SampleDesc.Quality = 0;\n        dsDesc.Usage     = D3D11_USAGE_DEFAULT;\n        dsDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;\n        dsDesc.CPUAccessFlags = 0;\n        dsDesc.MiscFlags      = 0;\n\n        if (format & Texture_RenderTarget)\n        {\n            if ((format & Texture_TypeMask) == Texture_Depth)\n            {\n                dsDesc.BindFlags = createDepthSrv ? (dsDesc.BindFlags | D3D11_BIND_DEPTH_STENCIL) : D3D11_BIND_DEPTH_STENCIL;\n            }\n            else\n            {\n                dsDesc.BindFlags |= D3D11_BIND_RENDER_TARGET;\n            }\n        }\n\n        Tex = NULL;\n        HRESULT hr = rp->pDevice->CreateTexture2D(&dsDesc, NULL, &Tex.GetRawRef());\n        if (FAILED(hr))\n        {\n            OVR_ASSERT(0);\n            //OVR_DEBUG_LOG_TEXT((\"Failed to create 2D D3D texture.\"));\n            Release();\n            return;\n        }\n        if (dsDesc.BindFlags & D3D11_BIND_SHADER_RESOURCE)\n        {\n            if((dsDesc.BindFlags & D3D11_BIND_DEPTH_STENCIL) > 0 && createDepthSrv)\n            {\n                D3D11_SHADER_RESOURCE_VIEW_DESC depthSrv;\n                depthSrv.Format = DXGI_FORMAT_R32_FLOAT;\n                depthSrv.ViewDimension = samples > 1 ? D3D11_SRV_DIMENSION_TEXTURE2DMS : D3D11_SRV_DIMENSION_TEXTURE2D;\n                depthSrv.Texture2D.MostDetailedMip = 0;\n                depthSrv.Texture2D.MipLevels = dsDesc.MipLevels;\n                TexSv = NULL;\n                hr = rp->pDevice->CreateShaderResourceView(Tex, &depthSrv, &TexSv.GetRawRef());\n                if (FAILED(hr))\n                {\n                    OVR_ASSERT(0);\n                }\n            }\n            else\n            {\n                TexSv = NULL;\n                hr = rp->pDevice->CreateShaderResourceView(Tex, NULL, &TexSv.GetRawRef());\n                if (FAILED(hr))\n                {\n                    OVR_ASSERT(0);\n                }\n            }\n        }\n\n        if (data)\n        {\n            rp->pContext->UpdateSubresource(Tex, 0, NULL, data, texSize.w * bpp, texSize.w * texSize.h * bpp);\n            if (format == (Texture_RGBA | Texture_GenMipmaps))\n            {\n                int srcw = texSize.w, srch = texSize.h;\n                int level = 0;\n                uint8_t* mipmaps = NULL;\n                do\n                {\n                    level++;\n                    int mipw = srcw >> 1;\n                    if (mipw < 1)\n                    {\n                        mipw = 1;\n                    }\n                    int miph = srch >> 1;\n                    if (miph < 1)\n                    {\n                        miph = 1;\n                    }\n                    if (mipmaps == NULL)\n                    {\n                        mipmaps = (uint8_t*)OVR_ALLOC(mipw * miph * 4);\n                    }\n                    FilterRgba2x2(level == 1 ? (const uint8_t*)data : mipmaps, srcw, srch, mipmaps);\n                    rp->pContext->UpdateSubresource(Tex, level, NULL, mipmaps, mipw * bpp, miph * bpp);\n                    srcw = mipw;\n                    srch = miph;\n                }\n                while(srcw > 1 || srch > 1);\n\n                if (mipmaps != NULL)\n                {\n                    OVR_FREE(mipmaps);\n                }\n            }\n        }\n\n        if (format & Texture_RenderTarget)\n        {\n            if ((format & Texture_TypeMask) == Texture_Depth)\n            {\n                D3D11_DEPTH_STENCIL_VIEW_DESC depthDsv;\n                ZeroMemory(&depthDsv, sizeof(depthDsv));\n                depthDsv.Format = DXGI_FORMAT_D32_FLOAT;\n                depthDsv.ViewDimension = samples > 1 ? D3D11_DSV_DIMENSION_TEXTURE2DMS : D3D11_DSV_DIMENSION_TEXTURE2D;\n                depthDsv.Texture2D.MipSlice = 0;\n                TexDsv = NULL;\n                hr = rp->pDevice->CreateDepthStencilView(Tex, createDepthSrv ? &depthDsv : NULL, &TexDsv.GetRawRef());\n                if (FAILED(hr))\n                {\n                    OVR_ASSERT(0);\n                }\n            }\n            else\n            {\n                TexRtv = NULL;\n                hr = rp->pDevice->CreateRenderTargetView(Tex, NULL, &TexRtv.GetRawRef());\n                if (FAILED(hr))\n                {\n                    OVR_ASSERT(0);\n                }\n            }\n        }\n    }\n}\n\nTexture::~Texture()\n{\n}\n\nvoid Texture::Set(int slot, ShaderStage stage) const\n{    \n    ID3D11ShaderResourceView* texSv = TexSv.GetPtr();\n\n    switch(stage)\n    {\n    case Shader_Fragment:\n        pParams->pContext->PSSetShaderResources(slot, 1, &texSv);\n        pParams->pContext->PSSetSamplers(slot, 1, &Sampler.GetRawRef());        \n        break;\n\n    case Shader_Vertex:\n        pParams->pContext->VSSetShaderResources(slot, 1, &texSv);\n        pParams->pContext->VSSetSamplers(slot, 1, &Sampler.GetRawRef());\n        break;\n\n    case Shader_Compute:\n        pParams->pContext->CSSetShaderResources(slot, 1, &texSv);\n        pParams->pContext->CSSetSamplers(slot, 1, &Sampler.GetRawRef());\n        break;\n\n    default: OVR_ASSERT ( false ); break;\n    }\n}\n\n\n//-------------------------------------------------------------------------------------\n// ***** GpuTimer\n// \n#define D3DQUERY_EXEC(_context_, _query_, _command_, ...)  _context_->_command_(_query_, __VA_ARGS__)\n\n\nvoid GpuTimer::Init(ID3D11Device* device, ID3D11DeviceContext* content)\n{\n    D3dDevice = device;\n    Context = content;    \n}\n\nvoid GpuTimer::BeginQuery()\n{\n    HRESULT hr;\n\n    if(GotoNextFrame(LastQueuedFrame) == LastTimedFrame)\n    {\n        OVR_ASSERT(false); // too many queries queued\n        return;\n    }\n\n    LastQueuedFrame = GotoNextFrame(LastQueuedFrame);\n\n    GpuQuerySets& newQuerySet = QuerySets[LastQueuedFrame];\n    if(newQuerySet.DisjointQuery == NULL)\n    {\n        // Create the queries\n        D3D11_QUERY_DESC desc;\n        desc.Query = D3D11_QUERY_TIMESTAMP_DISJOINT;\n        desc.MiscFlags = 0;\n        hr = D3dDevice->CreateQuery(&desc, &newQuerySet.DisjointQuery);\n        OVR_D3D_CHECK_RET(hr);\n\n        desc.Query = D3D11_QUERY_TIMESTAMP;\n        hr = D3dDevice->CreateQuery(&desc, &newQuerySet.TimeStartQuery);\n        OVR_D3D_CHECK_RET(hr);\n        hr = D3dDevice->CreateQuery(&desc, &newQuerySet.TimeEndQuery);\n        OVR_D3D_CHECK_RET(hr);\n    }\n\n    OVR_ASSERT(!newQuerySet.QueryStarted);\n    OVR_ASSERT(!newQuerySet.QueryAwaitingTiming);\n\n    \n    D3DQUERY_EXEC(Context, QuerySets[LastQueuedFrame].DisjointQuery, Begin, );  // First start a disjoint query\n    D3DQUERY_EXEC(Context, QuerySets[LastQueuedFrame].TimeStartQuery, End, );   // Insert start timestamp\n    \n    newQuerySet.QueryStarted = true;\n    newQuerySet.QueryAwaitingTiming = false;\n    //newQuerySet.QueryTimed = false;\n}\n\nvoid GpuTimer::EndQuery()\n{\n    if(LastQueuedFrame > 0 && !QuerySets[LastQueuedFrame].QueryStarted)\n        return;\n\n    GpuQuerySets& doneQuerySet = QuerySets[LastQueuedFrame];\n    OVR_ASSERT(doneQuerySet.QueryStarted);\n    OVR_ASSERT(!doneQuerySet.QueryAwaitingTiming);\n\n    // Insert the end timestamp\n    D3DQUERY_EXEC(Context, doneQuerySet.TimeEndQuery, End, );\n\n    // End the disjoint query\n    D3DQUERY_EXEC(Context, doneQuerySet.DisjointQuery, End, );\n\n    doneQuerySet.QueryStarted = false;\n    doneQuerySet.QueryAwaitingTiming = true;\n}\n\nfloat GpuTimer::GetTiming(bool blockUntilValid)\n{\n    float time = -1.0f;\n\n    // loop until we hit a query that is not ready yet, or we have read all queued queries\n    while(LastTimedFrame != LastQueuedFrame)\n    {\n        int timeTestFrame = GotoNextFrame(LastTimedFrame);\n\n        GpuQuerySets& querySet = QuerySets[timeTestFrame];\n\n        OVR_ASSERT(!querySet.QueryStarted && querySet.QueryAwaitingTiming);\n\n        UINT64 startTime = 0;\n        UINT64 endTime = 0;\n        D3D11_QUERY_DATA_TIMESTAMP_DISJOINT disjointData;\n\n        if(blockUntilValid)\n        {\n            while(D3DQUERY_EXEC(Context, querySet.TimeStartQuery, GetData, &startTime, sizeof(startTime), 0) != S_OK);\n            while(D3DQUERY_EXEC(Context, querySet.TimeEndQuery, GetData, &endTime, sizeof(endTime), 0) != S_OK);\n            while(D3DQUERY_EXEC(Context, querySet.DisjointQuery, GetData, &disjointData, sizeof(disjointData), 0) != S_OK);\n        }\n        else\n        {\n// Early return if we fail to get data for any of these\n            if(D3DQUERY_EXEC(Context, querySet.TimeStartQuery, GetData, &startTime, sizeof(startTime), 0) != S_OK)    return time;\n            if(D3DQUERY_EXEC(Context, querySet.TimeEndQuery, GetData, &endTime, sizeof(endTime), 0) != S_OK)          return time;\n            if(D3DQUERY_EXEC(Context, querySet.DisjointQuery, GetData, &disjointData, sizeof(disjointData), 0) != S_OK)    return time;\n        }\n\n        querySet.QueryAwaitingTiming = false;\n        LastTimedFrame = timeTestFrame; // successfully retrieved the timing data\n\n        if(disjointData.Disjoint == false)\n        {\n            UINT64 delta = endTime - startTime;\n            float frequency = (float)(disjointData.Frequency);\n            time = (delta / frequency);\n        }\n    }\n    \n    return time;\n}\n\n}}} // OVR::CAPI::D3D11\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D1X/CAPI_D3D11_Util.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_D3D11_Util.h\nContent     :   D3D11 utility classes for rendering\nCreated     :   September 10, 2012\nAuthors     :   Andrew Reisse\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_D3D11_Util_h\n#define OVR_CAPI_D3D11_Util_h\n\n#include \"Kernel/OVR_String.h\"\n#include \"Kernel/OVR_Array.h\"\n#include \"Kernel/OVR_RefCount.h\"\n#include \"Extras/OVR_Math.h\"\n#include \"Util/Util_Direct3D.h\"\n#include <comdef.h> // for _COM_SMARTPTR_TYPEDEF()\n\nnamespace OVR { namespace CAPI { namespace D3D11 {\n\nclass Buffer;\n\n// Rendering parameters/pointers describing D3DX rendering setup.\nstruct RenderParams\n{\n    ID3D11Device*\t\t\t    pDevice;\n    ID3D11DeviceContext*        pContext;\n    ID3D11RenderTargetView*     pBackBufferRT;\n    ID3D11UnorderedAccessView*  pBackBufferUAV;\n    IDXGISwapChain*             pSwapChain;\n    Sizei                       BackBufferSize;\n    int                         Multisample;\n    UINT32                      VidPnTargetId; // display miniport target id for tracing\n};\n\n\n// Rendering primitive type used to render Model.\nenum PrimitiveType\n{\n    Prim_Triangles,\n    Prim_Lines,\n    Prim_TriangleStrip,\n    Prim_Unknown,\n    Prim_Count\n};\n\n// Types of shaders that can be stored together in a ShaderSet.\nenum ShaderStage\n{\n    Shader_Vertex   = 0,\n    Shader_Fragment = 2,\n    Shader_Pixel    = 2,\n    Shader_Compute  = 3,        // DX11+ only\n    Shader_Count    = 4,\n};\n\nenum MapFlags\n{\n    Map_Discard        = 1,\n    Map_Read           = 2, // do not use\n    Map_Unsynchronized = 4, // like D3D11_MAP_NO_OVERWRITE\n};\n\n\n// Buffer types used for uploading geometry & constants.\nenum BufferUsage\n{\n    Buffer_Unknown  = 0,\n    Buffer_Vertex   = 1,\n    Buffer_Index    = 2,\n    Buffer_Uniform  = 4,\n    Buffer_Compute  = 8,\n    Buffer_TypeMask = 0xff,\n    Buffer_ReadOnly = 0x100, // Buffer must be created with Data().\n};\n\nenum TextureFormat\n{\n    Texture_RGBA            = 0x0100,\n    Texture_Depth           = 0x8000,\n    Texture_TypeMask        = 0xff00,\n    Texture_SamplesMask     = 0x00ff,\n    Texture_RenderTarget    = 0x10000,\n    Texture_SampleDepth\t\t= 0x20000,\n    Texture_GenMipmaps      = 0x40000,\n};\n\n// Texture sampling modes.\nenum SampleMode\n{\n    Sample_Linear       = 0,\n    Sample_Nearest      = 1,\n    Sample_Anisotropic  = 2,\n    Sample_FilterMask   = 3,\n\n    Sample_Repeat       = 0,\n    Sample_Clamp        = 4,\n    Sample_ClampBorder  = 8, // If unsupported Clamp is used instead.\n    Sample_Mirror       =12,\n    Sample_AddressMask  =12,\n\n    Sample_Count        =16,\n};\n\n// Base class for vertex and pixel shaders. Stored in ShaderSet.\nclass Shader : public RefCountBase<Shader>\n{\n    friend class ShaderSet;\n\nprotected:\n    ShaderStage Stage;\n\npublic:\n    Shader(ShaderStage s) : Stage(s) {}\n    virtual ~Shader() {}\n\n    ShaderStage GetStage() const { return Stage; }\n\n    virtual void Set(PrimitiveType) const { }\n    virtual void SetUniformBuffer(class Buffer* buffers, int i = 0) { OVR_UNUSED2(buffers, i); }\n\nprotected:\n    virtual bool SetUniform(const char* name, int n, const float* v) { OVR_UNUSED3(name, n, v); return false; }\n    virtual bool SetUniformBool(const char* name, int n, const bool* v) { OVR_UNUSED3(name, n, v); return false; }\n};\n\n\n\n// A group of shaders, one per stage.\n// A ShaderSet is applied to a RenderDevice for rendering with a given fill.\nclass ShaderSet : public RefCountBase<ShaderSet>\n{\nprotected:\n    Ptr<Shader> Shaders[Shader_Count];\n\npublic:\n    ShaderSet() { }\n    ~ShaderSet() { }\n\n    virtual void SetShader(Shader *s)\n    {\n        Shaders[s->GetStage()] = s;\n    }\n    virtual void UnsetShader(int stage)\n    {\n        Shaders[stage] = NULL;\n    }\n    Shader* GetShader(int stage) { return Shaders[stage]; }\n\n    virtual void Set(PrimitiveType prim) const\n    {\n        for (int i = 0; i < Shader_Count; i++)\n            if (Shaders[i])\n                Shaders[i]->Set(prim);\n    }\n\n    // Set a uniform (other than the standard matrices). It is undefined whether the\n    // uniforms from one shader occupy the same space as those in other shaders\n    // (unless a buffer is used, then each buffer is independent).     \n    virtual bool SetUniform(const char* name, int n, const float* v)\n    {\n        bool result = 0;\n        for (int i = 0; i < Shader_Count; i++)\n            if (Shaders[i])\n                result |= Shaders[i]->SetUniform(name, n, v);\n\n        return result;\n    }\n    bool SetUniform1f(const char* name, float x)\n    {\n        const float v[] = {x};\n        return SetUniform(name, 1, v);\n    }\n    bool SetUniform2f(const char* name, float x, float y)\n    {\n        const float v[] = {x,y};\n        return SetUniform(name, 2, v);\n    }\n    bool SetUniform3f(const char* name, float x, float y, float z)\n    {\n        const float v[] = {x,y,z};\n        return SetUniform(name, 3, v);\n    }\n    bool SetUniform4f(const char* name, float x, float y, float z, float w = 1)\n    {\n        const float v[] = {x,y,z,w};\n        return SetUniform(name, 4, v);\n    }\n\n    bool SetUniformv(const char* name, const Vector3f& v)\n    {\n        const float a[] = {v.x,v.y,v.z,1};\n        return SetUniform(name, 4, a);\n    }\n \n    virtual bool SetUniform4x4f(const char* name, const Matrix4f& m)\n    {\n        Matrix4f mt = m.Transposed();\n        return SetUniform(name, 16, &mt.M[0][0]);\n    }\n    virtual bool SetUniform3x3f(const char* name, const Matrix4f& m)\n    {\n        // float3x3 is actually stored the same way as float4x3, with the last items ignored by the code.\n        Matrix4f mt = m.Transposed();\n        return SetUniform(name, 12, &mt.M[0][0]);\n    }\n\n};\n\n\n// Fill combines a ShaderSet (vertex, pixel) with textures, if any.\n// Every model has a fill.\nclass ShaderFill : public RefCountBase<ShaderFill>\n{\n    Ptr<ShaderSet>     Shaders;\n    Ptr<class Texture> PsTextures[8];\n    Ptr<class Texture> VsTextures[8];\n    Ptr<class Texture> CsTextures[8];\n    void*              InputLayout; // HACK this should be abstracted\n\npublic:\n    ShaderFill(ShaderSet* sh) : Shaders(sh) { InputLayout = NULL; }\n    ShaderFill(ShaderSet& sh) : Shaders(sh) { InputLayout = NULL; }    \n\n    ShaderSet*  GetShaders() const      { return Shaders; }\n    void*       GetInputLayout() const  { return InputLayout; }\n\n    virtual void Set(PrimitiveType prim = Prim_Unknown) const;   \n\n    virtual void SetTexture(int i, class Texture* tex, ShaderStage stage)\n    {\n        if (i < 8)\n        {\n                 if(stage == Shader_Pixel)  PsTextures[i] = tex;\n            else if(stage == Shader_Vertex) VsTextures[i] = tex;\n            else if(stage == Shader_Compute) CsTextures[i] = tex;\n            else OVR_ASSERT(false);\n        }\n    }\n    void SetInputLayout(void* newIL) { InputLayout = (void*)newIL; }\n};\n\n\nclass ShaderBase : public Shader\n{\npublic:    \n    RenderParams*   pParams;\n    unsigned char*  UniformData;\n    int             UniformsSize;\n\n\tenum VarType\n\t{\n\t\tVARTYPE_FLOAT,\n\t\tVARTYPE_INT,\n\t\tVARTYPE_BOOL,\n\t};\n\n\tstruct Uniform\n\t{\n\t\tconst char* Name;\n\t\tVarType     Type;\n        int         Offset;\n        int         Size;\n\t};\n    const Uniform*  UniformRefl;\n    size_t          UniformReflSize;\n\n\tShaderBase(RenderParams* rp, ShaderStage stage);\n\t~ShaderBase();\n\n    ShaderStage GetStage() const { return Stage; }\n\n    void InitUniforms(const Uniform* refl, size_t reflSize);\n\tbool SetUniform(const char* name, int n, const float* v);\n\tbool SetUniformBool(const char* name, int n, const bool* v);\n \n    void UpdateBuffer(Buffer* b);\n};\n\n\ntemplate<ShaderStage SStage, class D3DShaderType>\nclass ShaderImpl : public ShaderBase\n{\npublic:\n    D3DShaderType*  D3DShader;\n\n    ShaderImpl(RenderParams* rp, void* s, size_t size, const Uniform* refl, size_t reflSize) : ShaderBase(rp, SStage)\n    {\n        Load(s, size);\n        InitUniforms(refl, reflSize);\n    }\n    ~ShaderImpl()\n    {\n        if (D3DShader)        \n            D3DShader->Release();        \n    }\n\n    // These functions have specializations.\n    bool Load(void* shader, size_t size);\n    void Set(PrimitiveType prim) const;\n    void SetUniformBuffer(Buffer* buffers, int i = 0);\n};\n\ntypedef ShaderImpl<Shader_Vertex,  ID3D11VertexShader> VertexShader;\ntypedef ShaderImpl<Shader_Fragment, ID3D11PixelShader> PixelShader;\ntypedef ShaderImpl<Shader_Compute, ID3D11ComputeShader> ComputeShader;\n\n\nclass Buffer : public RefCountBase<Buffer>\n{\npublic:\n    RenderParams*                   pParams;\n    Ptr<ID3D11Buffer>               D3DBuffer;\n    Ptr<ID3D11ShaderResourceView>   D3DSrv;\n    Ptr<ID3D11UnorderedAccessView>  D3DUav;\n    size_t            Size;\n    int               Use;\n    bool              Dynamic;\n\npublic:\n    Buffer(RenderParams* rp) : pParams(rp), D3DBuffer(), D3DSrv(),\n                               D3DUav(),\n                               Size(0), Use(0), Dynamic(false) {}\n    ~Buffer();\n\n    ID3D11Buffer* GetBuffer() const\n    {\n        return D3DBuffer;\n    }\n\n    ID3D11ShaderResourceView* GetSrv() const\n    {\n        return D3DSrv;\n    }\n\n    ID3D11UnorderedAccessView* GetUav() const\n    {\n        return D3DUav;\n    }\n\n    virtual size_t GetSize()        { return Size; }\n    virtual void*  Map(size_t start, size_t size, int flags = 0);\n    virtual bool   Unmap(void *m);\n    virtual bool   Data(int use, const void* buffer, size_t size, int computeBufferStride = -1);\n};\n\n\nclass Texture : public RefCountBase<Texture>\n{\npublic:\n    RenderParams*                   pParams;\n    Ptr<ID3D11Texture2D>            Tex;\n    Ptr<ID3D11ShaderResourceView>   TexSv;\n    Ptr<ID3D11RenderTargetView>     TexRtv;\n    Ptr<ID3D11DepthStencilView>     TexDsv;\n    // TODO: add UAV...\n    mutable Ptr<ID3D11SamplerState> Sampler;\n    Sizei                           TextureSize;\n    int                             Samples;\n\n    Texture(RenderParams* rp, int fmt, const Sizei texSize,\n            ID3D11SamplerState* sampler, int samples = 1);\n    Texture(RenderParams* rp, int fmt, const Sizei texSize,\n            ID3D11SamplerState* sampler, const void* data, int mipcount);\n    ~Texture();\n\n    void GenerateSubresourceData(\n        unsigned imageWidth, unsigned imageHeight, int format, unsigned imageDimUpperLimit,\n        const void* rawBytes, D3D11_SUBRESOURCE_DATA* subresData,\n        unsigned& largestMipWidth, unsigned& largestMipHeight, unsigned& byteSize, unsigned& effectiveMipCount);\n    \n    virtual Sizei GetSize() const     { return TextureSize; }    \n    virtual int   GetSamples() const  { return Samples; }\n\n  //  virtual void SetSampleMode(int sm);\n\n    // Updates texture to point to specified resources\n    //  - used for slave rendering.\n    void UpdatePlaceholderTexture(ID3D11Texture2D* texture,\n                                  ID3D11ShaderResourceView* psrv,\n                                  const Sizei& textureSize, const int sampleCount)\n    {\n        Tex     = texture;\n        TexSv   = psrv;\n        TexRtv.Clear();\n        TexDsv.Clear();\n\n        TextureSize = textureSize;\n        Samples = sampleCount;\n\n#ifdef OVR_BUILD_DEBUG\n        D3D11_TEXTURE2D_DESC desc;\n        texture->GetDesc(&desc);\n        OVR_ASSERT(TextureSize == Sizei(desc.Width, desc.Height));\n#endif\n    }\n\n\n    virtual void Set(int slot, ShaderStage stage = Shader_Fragment) const;\n\n    int GetNumMipLevels(int w, int h)\n    {\n        int n = 1;\n        while(w > 1 || h > 1)\n        {\n            w >>= 1;\n            h >>= 1;\n            n++;\n        }\n        return n;\n    }\n\n    void FilterRgba2x2(const uint8_t* src, int w, int h, uint8_t* dest)\n    {\n        for(int j = 0; j < (h & ~1); j += 2)\n        {\n            const uint8_t* psrc = src + (w * j * 4);\n            uint8_t*       pdest = dest + ((w >> 1) * (j >> 1) * 4);\n\n            for(int i = 0; i < w >> 1; i++, psrc += 8, pdest += 4)\n            {\n                pdest[0] = (((int)psrc[0]) + psrc[4] + psrc[w * 4 + 0] + psrc[w * 4 + 4]) >> 2;\n                pdest[1] = (((int)psrc[1]) + psrc[5] + psrc[w * 4 + 1] + psrc[w * 4 + 5]) >> 2;\n                pdest[2] = (((int)psrc[2]) + psrc[6] + psrc[w * 4 + 2] + psrc[w * 4 + 6]) >> 2;\n                pdest[3] = (((int)psrc[3]) + psrc[7] + psrc[w * 4 + 3] + psrc[w * 4 + 7]) >> 2;\n            }\n        }\n    }\n};\n\n\nclass GpuTimer : public RefCountBase<GpuTimer>\n{\npublic:\n    GpuTimer()\n        : QuerySets(MaxNumQueryFrames)\n        , D3dDevice(NULL)\n        , Context(NULL)\n        , LastQueuedFrame(-1)\n        , LastTimedFrame(-1)\n    { }\n\n    void Init(ID3D11Device* device, ID3D11DeviceContext* content);\n\n    void BeginQuery();\n    void EndQuery();\n\n    // Returns -1 if timing is invalid\n    float GetTiming(bool blockUntilValid);\n\nprotected:\n    static const unsigned MaxNumQueryFrames = 10;\n    \n    int GotoNextFrame(int frame)\n    {\n        return (frame + 1) % MaxNumQueryFrames;\n    }\n    \n    _COM_SMARTPTR_TYPEDEF(ID3D11Query, __uuidof(ID3D11Query));\n\n    struct GpuQuerySets\n    {\n        ID3D11QueryPtr DisjointQuery;\n        ID3D11QueryPtr TimeStartQuery;\n        ID3D11QueryPtr TimeEndQuery;\n        bool QueryStarted;\n        bool QueryAwaitingTiming;\n\n        GpuQuerySets() : QueryStarted(false), QueryAwaitingTiming(false) {}\n    };\n    Array<GpuQuerySets> QuerySets;\n    \n    int LastQueuedFrame;\n    int LastTimedFrame;\n\n    Ptr<ID3D11Device> D3dDevice;\n    Ptr<ID3D11DeviceContext> Context;\n};\n\n}}} // OVR::CAPI::D3D11\n\n#endif // OVR_CAPI_D3D11_Util_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D1X/Shaders/DistortionCS2x2.csh",
    "content": "/************************************************************************************\r\n\r\nFilename    :   DistortionCS2x2Pentile.vsh\r\n\r\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\r\n\r\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \r\nyou may not use the Oculus VR Rift SDK except in compliance with the License, \r\nwhich is provided at the time of installation or download, or which \r\notherwise accompanies this software in either electronic or hard copy form.\r\n\r\nYou may obtain a copy of the License at\r\n\r\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \r\n\r\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n\r\n************************************************************************************/\r\n\r\n\r\n// Note - the only difference between the various Distortion Compute Shaders is these #defines.\r\n// The code is otherwise identical, so if you change one, rememeber to change the others!\r\n#define PENTILE_MODE 0\r\n#define ENABLE_OVERLAY 0\r\n#define ENABLE_TIMEWARP 1\r\n\r\n\r\n#define GRID_SIZE_IN_PIXELS 16\r\n#define PINS_PER_EDGE 128\r\n#define NXN_BLOCK_SIZE_PIXELS 2\r\n#define SIMD_SQUARE_SIZE 16\r\n\r\n\r\nstruct DistortionComputePin\r\n{\r\n\tfloat2      TanEyeAnglesR;  \r\n\tfloat2      TanEyeAnglesG;  \r\n\tfloat2      TanEyeAnglesB;  \r\n\tint         Color;          \r\n\tint         Padding[1];        \r\n};\r\nstruct DistortionComputePinUnpacked\r\n{\r\n\tfloat2      TanEyeAnglesR;  \r\n\tfloat2      TanEyeAnglesG;  \r\n\tfloat2      TanEyeAnglesB;  \r\n\tfloat       TimewarpLerp;   \r\n\tfloat       Fade;           \r\n};\r\nstruct DistortionComputePinTimewarped\r\n{\r\n\tfloat2      HmdSpcTexCoordR;  \r\n\tfloat2      HmdSpcTexCoordG;  \r\n\tfloat2      HmdSpcTexCoordB;\r\n#if ENABLE_OVERLAY\r\n\tfloat2      OverlayTexCoordR;\r\n\tfloat2      OverlayTexCoordG;\r\n\tfloat2      OverlayTexCoordB;\r\n#endif\r\n};\r\n\r\n// Cut'n'pasted from D3DX_DXGIFormatConvert.inl. Obviously we should have #included it, but...\r\ntypedef float4 XMFLOAT4;                                                   \r\ntypedef uint UINT;                                                         \r\n#define D3DX11INLINE                                                       \r\n#define hlsl_precise precise                                               \r\nD3DX11INLINE XMFLOAT4 D3DX_R8G8B8A8_UNORM_to_FLOAT4(UINT packedInput)      \r\n{                                                                          \r\n\thlsl_precise XMFLOAT4 unpackedOutput;                                  \r\n\tunpackedOutput.x = (FLOAT)  (packedInput      & 0x000000ff)  / 255;    \r\n\tunpackedOutput.y = (FLOAT)(((packedInput>> 8) & 0x000000ff)) / 255;    \r\n\tunpackedOutput.z = (FLOAT)(((packedInput>>16) & 0x000000ff)) / 255;    \r\n\tunpackedOutput.w = (FLOAT)  (packedInput>>24)                / 255;    \r\n\treturn unpackedOutput;                                                 \r\n}                                                                          \r\n\r\nDistortionComputePinUnpacked UnpackPin ( DistortionComputePin src )       \r\n{                                                                                      \r\n\tDistortionComputePinUnpacked result;                                         \r\n\tresult.TanEyeAnglesR = src.TanEyeAnglesR;                                          \r\n\tresult.TanEyeAnglesG = src.TanEyeAnglesG;                                          \r\n\tresult.TanEyeAnglesB = src.TanEyeAnglesB;                                          \r\n\tfloat4 tempColor = D3DX_R8G8B8A8_UNORM_to_FLOAT4 ( src.Color );                    \r\n\tresult.Fade = tempColor.r * 2.0 - 1.0;                                             \r\n\tresult.TimewarpLerp = tempColor.a;                                                 \r\n\treturn result;                                                                     \r\n}                                                                                      \r\n\r\n\r\nfloat4x4 Padding1;\r\nfloat4x4 Padding2;\r\nfloat2 EyeToSourceUVScale;\r\nfloat2 EyeToSourceUVOffset;\r\nfloat3x3 EyeRotationStart;\r\nfloat3x3 EyeRotationEnd;\r\nfloat  UseOverlay = 1;\r\nfloat  RightEye = 1;\r\nfloat  FbSizePixelsX;\r\n\r\n\r\nRWTexture2D<float4> Framebuffer : register(u0);\r\nSamplerState Linear : register(s0);\r\n// Subtlety - fill->Set stops at the first NULL texture, so make sure you order them by priority!\r\nTexture2D HmdSpcTexture : register(t0);\r\nTexture2D OverlayTexture : register(t1);\r\n// t1, t2, t3 for layers in future.\r\n// This is set by other calls, so no problem putting it in t4.\r\nStructuredBuffer<DistortionComputePin> UntransformedGridPins : register(t4);\r\n\r\n// Each eye has a grid of \"pins\" - spaced every gridSizeInPixels apart in a square grid.\r\n// You can think of them as vertices in a mesh, but they are regularly\r\n// distributed in screen space, not pre-distorted.\r\n// Pins are laid out in a vertical scanline pattern,\r\n// scanning right to left, then within each scan going top to bottom, like DK2.\r\n// If we move to a different panel orientation, we may need to flip this around.\r\n// pinsPerEdge is the pitch of the buffer, and is fixed whatver the resolution\r\n// - it just needs to be large enough for the largest res we support.\r\n\r\n// The grid size remains fixed, but now each shader invocation does an NxN \"tile\" of output pixels.\r\n// This allows it to read, timewarp & project the input pins just once, then interpolate final UV over a number of pixels.\r\n// The \"SIMD square size\" is how large the square of dispatched pixels is - it's the\r\n// thing set in numthreads(N,N,1). For a SIMD size of 64-wide, it needs to be more than 8,\r\n// otherwise we'll starve the machine.\r\n\r\n// Summary:\r\n// Each SIMD lane does a tileBlockSizePixels^2 of pixels.\r\n// Each \"CS group\" (i.e. a virtualized SIMD thread) will cover a (simdSquareSize*tileBlockSizePixels)^2 block of pixels.\r\n// The pin grid is unaffected by any of these (except it has to be larger than tileBlockSizePixels).\r\nstatic const int gridSizeInPixels = GRID_SIZE_IN_PIXELS;\r\nstatic const int pinsPerEdge = PINS_PER_EDGE;\r\nstatic const int tileBlockSizePixels = NXN_BLOCK_SIZE_PIXELS;\r\nstatic const int simdSquareSize = SIMD_SQUARE_SIZE;\r\nstatic const int tilesPerGridSide = gridSizeInPixels / tileBlockSizePixels;\r\n\r\nDistortionComputePinTimewarped WarpAndDistort ( DistortionComputePinUnpacked inp )\r\n{\r\n\t// Pin inputs are in TanEyeAngle space for the R,G,B channels (i.e. after chromatic aberration and distortion).\r\n#if ENABLE_TIMEWARP\r\n\t// These are now \"real world\" vectors in direction (x,y,1) relative to the eye of the HMD.\r\n\tfloat3 TanEyeAngle3R = float3 ( inp.TanEyeAnglesR.x, inp.TanEyeAnglesR.y, 1.0 );\r\n\tfloat3 TanEyeAngle3G = float3 ( inp.TanEyeAnglesG.x, inp.TanEyeAnglesG.y, 1.0 );\r\n\tfloat3 TanEyeAngle3B = float3 ( inp.TanEyeAnglesB.x, inp.TanEyeAnglesB.y, 1.0 );\r\n\r\n\t// Apply the two 3x3 timewarp rotations to these vectors.\r\n\tfloat3 TransformedRStart = mul ( EyeRotationStart, TanEyeAngle3R );\r\n\tfloat3 TransformedGStart = mul ( EyeRotationStart, TanEyeAngle3G );\r\n\tfloat3 TransformedBStart = mul ( EyeRotationStart, TanEyeAngle3B );\r\n\tfloat3 TransformedREnd   = mul ( EyeRotationEnd,   TanEyeAngle3R );\r\n\tfloat3 TransformedGEnd   = mul ( EyeRotationEnd,   TanEyeAngle3G );\r\n\tfloat3 TransformedBEnd   = mul ( EyeRotationEnd,   TanEyeAngle3B );\r\n\t// And blend between them.\r\n\tfloat3 TransformedR = lerp ( TransformedRStart, TransformedREnd, inp.TimewarpLerp );\r\n\tfloat3 TransformedG = lerp ( TransformedGStart, TransformedGEnd, inp.TimewarpLerp );\r\n\tfloat3 TransformedB = lerp ( TransformedBStart, TransformedBEnd, inp.TimewarpLerp );\r\n\r\n\t// Project them back onto the Z=1 plane of the rendered images.\r\n\tfloat RecipZR = rcp ( TransformedR.z );\r\n\tfloat RecipZG = rcp ( TransformedG.z );\r\n\tfloat RecipZB = rcp ( TransformedB.z );\r\n\tfloat2 FlattenedR = float2 ( TransformedR.x * RecipZR, TransformedR.y * RecipZR );\r\n\tfloat2 FlattenedG = float2 ( TransformedG.x * RecipZG, TransformedG.y * RecipZG );\r\n\tfloat2 FlattenedB = float2 ( TransformedB.x * RecipZB, TransformedB.y * RecipZB );\r\n#else\r\n    float2 FlattenedR = inp.TanEyeAnglesR;\r\n    float2 FlattenedG = inp.TanEyeAnglesG;\r\n    float2 FlattenedB = inp.TanEyeAnglesB;\r\n#endif\r\n\r\n\tDistortionComputePinTimewarped result;\r\n\r\n\t// These are now still in TanEyeAngle space.\r\n\t// Scale them into the correct [0-1],[0-1] UV lookup space (depending on eye)\r\n\tresult.HmdSpcTexCoordR = FlattenedR * EyeToSourceUVScale + EyeToSourceUVOffset;\r\n\tresult.HmdSpcTexCoordG = FlattenedG * EyeToSourceUVScale + EyeToSourceUVOffset;\r\n\tresult.HmdSpcTexCoordB = FlattenedB * EyeToSourceUVScale + EyeToSourceUVOffset;\r\n\r\n#if ENABLE_OVERLAY\r\n\t// Static layer texcoords don't get any time warp offset\r\n\tresult.OverlayTexCoordR = inp.TanEyeAnglesR * EyeToSourceUVScale + EyeToSourceUVOffset;\r\n\tresult.OverlayTexCoordG = inp.TanEyeAnglesG * EyeToSourceUVScale + EyeToSourceUVOffset;\r\n\tresult.OverlayTexCoordB = inp.TanEyeAnglesB * EyeToSourceUVScale + EyeToSourceUVOffset;\r\n#endif\r\n\treturn result;\r\n}\r\n\r\nfloat3 FindPixelColour ( float2 pinFrac,\r\n                         DistortionComputePinUnpacked PinTL,\r\n                         DistortionComputePinUnpacked PinTR,\r\n                         DistortionComputePinUnpacked PinBL,\r\n                         DistortionComputePinUnpacked PinBR,\r\n                         DistortionComputePinTimewarped PinWarpTL,\r\n                         DistortionComputePinTimewarped PinWarpTR,\r\n                         DistortionComputePinTimewarped PinWarpBL,\r\n                         DistortionComputePinTimewarped PinWarpBR)\r\n{\r\n\tfloat pinWeightTL = (1.0-pinFrac.x) * (1.0-pinFrac.y);                                 \r\n\tfloat pinWeightTR = (    pinFrac.x) * (1.0-pinFrac.y);                                 \r\n\tfloat pinWeightBL = (1.0-pinFrac.x) * (    pinFrac.y);                                 \r\n\tfloat pinWeightBR = (    pinFrac.x) * (    pinFrac.y);                                 \r\n                                                                                                               \r\n\tfloat Fade = ( PinTL.Fade * pinWeightTL ) +                                                 \r\n\t\t\t\t ( PinTR.Fade * pinWeightTR ) +                                                 \r\n\t\t\t\t ( PinBL.Fade * pinWeightBL ) +                                                 \r\n\t\t\t\t ( PinBR.Fade * pinWeightBR );                                                  \r\n\tfloat2 HmdSpcTexCoordR = ( PinWarpTL.HmdSpcTexCoordR * pinWeightTL ) +                      \r\n\t\t\t\t\t\t\t ( PinWarpTR.HmdSpcTexCoordR * pinWeightTR ) +                      \r\n\t\t\t\t\t\t\t ( PinWarpBL.HmdSpcTexCoordR * pinWeightBL ) +                      \r\n\t\t\t\t\t\t\t ( PinWarpBR.HmdSpcTexCoordR * pinWeightBR );                       \r\n\tfloat2 HmdSpcTexCoordG = ( PinWarpTL.HmdSpcTexCoordG * pinWeightTL ) +                      \r\n\t\t\t\t\t\t\t ( PinWarpTR.HmdSpcTexCoordG * pinWeightTR ) +                      \r\n\t\t\t\t\t\t\t ( PinWarpBL.HmdSpcTexCoordG * pinWeightBL ) +                      \r\n\t\t\t\t\t\t\t ( PinWarpBR.HmdSpcTexCoordG * pinWeightBR );                       \r\n\tfloat2 HmdSpcTexCoordB = ( PinWarpTL.HmdSpcTexCoordB * pinWeightTL ) +                      \r\n\t\t\t\t\t\t\t ( PinWarpTR.HmdSpcTexCoordB * pinWeightTR ) +                      \r\n\t\t\t\t\t\t\t ( PinWarpBL.HmdSpcTexCoordB * pinWeightBL ) +                      \r\n\t\t\t\t\t\t\t ( PinWarpBR.HmdSpcTexCoordB * pinWeightBR );                       \r\n\r\n\tfloat3 finalColor;\r\n\r\n#if PENTILE_MODE > 0\r\n    // R & B channels have a 0.5 bias because of fewer pels.\r\n    const float mipBiasRB = 0.5;\r\n#else\r\n    const float mipBiasRB = 0.0;\r\n#endif\r\n\tfinalColor.r = HmdSpcTexture.SampleLevel(Linear, HmdSpcTexCoordR, mipBiasRB).r;\r\n\tfinalColor.g = HmdSpcTexture.SampleLevel(Linear, HmdSpcTexCoordG, 0        ).g;\r\n\tfinalColor.b = HmdSpcTexture.SampleLevel(Linear, HmdSpcTexCoordB, mipBiasRB).b;\r\n#if ENABLE_OVERLAY\r\n\tif(UseOverlay > 0)\r\n\t{\r\n\t\tfloat2 OverlayTexCoordR = ( PinWarpTL.OverlayTexCoordR * pinWeightTL ) +                \r\n\t\t\t\t\t\t\t\t  ( PinWarpTR.OverlayTexCoordR * pinWeightTR ) +                \r\n\t\t\t\t\t\t\t\t  ( PinWarpBL.OverlayTexCoordR * pinWeightBL ) +                \r\n\t\t\t\t\t\t\t\t  ( PinWarpBR.OverlayTexCoordR * pinWeightBR );                 \r\n\t\tfloat2 OverlayTexCoordG = ( PinWarpTL.OverlayTexCoordG * pinWeightTL ) +                \r\n\t\t\t\t\t\t\t\t  ( PinWarpTR.OverlayTexCoordG * pinWeightTR ) +                \r\n\t\t\t\t\t\t\t\t  ( PinWarpBL.OverlayTexCoordG * pinWeightBL ) +                \r\n\t\t\t\t\t\t\t\t  ( PinWarpBR.OverlayTexCoordG * pinWeightBR );                 \r\n\t\tfloat2 OverlayTexCoordB = ( PinWarpTL.OverlayTexCoordB * pinWeightTL ) +                \r\n\t\t\t\t\t\t\t\t  ( PinWarpTR.OverlayTexCoordB * pinWeightTR ) +                \r\n\t\t\t\t\t\t\t\t  ( PinWarpBL.OverlayTexCoordB * pinWeightBL ) +                \r\n\t\t\t\t\t\t\t\t  ( PinWarpBR.OverlayTexCoordB * pinWeightBR );                 \r\n\t\tfloat2 overlayColorR = OverlayTexture.SampleLevel(Linear, OverlayTexCoordR, mipBiasRB).ra;\r\n\t\tfloat2 overlayColorG = OverlayTexture.SampleLevel(Linear, OverlayTexCoordG, 0        ).ga;\r\n\t\tfloat2 overlayColorB = OverlayTexture.SampleLevel(Linear, OverlayTexCoordB, mipBiasRB).ba;\r\n\t\t// do premultiplied alpha blending - overlayColorX.x is color, overlayColorX.y is alpha\r\n\t\tfinalColor.r = finalColor.r * saturate(1-overlayColorR.y) + overlayColorR.x;\r\n\t\tfinalColor.g = finalColor.g * saturate(1-overlayColorG.y) + overlayColorG.x;\r\n\t\tfinalColor.b = finalColor.b * saturate(1-overlayColorB.y) + overlayColorB.x;\r\n\t}\r\n#endif\r\n\tfinalColor.rgb = saturate(finalColor.rgb * Fade);\r\n\treturn finalColor;\r\n}\r\n\r\n\r\n[numthreads(simdSquareSize, simdSquareSize, 1)]\r\nvoid main(uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint3 Gid : SV_GroupID)\r\n// Reminder:\r\n// GroupThreadID.xy will range from 0 to (simdSquareSize-1).\r\n// GroupID.xy will range from 0 to (screen_size.xy)/(simdSquareSize*tileBlockSizePixels)\r\n// DispatchThreadID.xy = GroupID.xy * simdSquareSize + GroupThreadID.xy\r\n{\r\n    int2 PixelPosTile = DTid.xy * tileBlockSizePixels;                                                          \r\n    float2 PixelPosFloat = (float2)PixelPosTile;                                                                \r\n    float2 pinFracTileStart = (float2)PixelPosTile * ( 1.0 / gridSizeInPixels );                             \r\n    float2 pinWholeTileStart = floor ( pinFracTileStart );                                                \r\n    pinFracTileStart -= pinWholeTileStart;                                                                \r\n    int2 pinInt = (int2)pinWholeTileStart;                                                                \r\n    pinInt.x = (0.5*FbSizePixelsX/gridSizeInPixels - 1) - pinInt.x;                                           \r\n    pinFracTileStart.x = 1.0 - pinFracTileStart.x;                                                        \r\n    if ( RightEye > 0.5 )\r\n    {\r\n        PixelPosTile.x += 0.5*FbSizePixelsX;\r\n    }\r\n\r\n    int pinIndexTL = pinInt.x*pinsPerEdge + pinInt.y;                                                 \r\n    int pinIndexTR = pinIndexTL + pinsPerEdge;                                                           \r\n    int pinIndexBL = pinIndexTL + 1;                                                                      \r\n    int pinIndexBR = pinIndexTR + 1;                                                                      \r\n    DistortionComputePinUnpacked PinTL = UnpackPin ( UntransformedGridPins[pinIndexTL] );        \r\n    DistortionComputePinUnpacked PinTR = UnpackPin ( UntransformedGridPins[pinIndexTR] );        \r\n    DistortionComputePinUnpacked PinBL = UnpackPin ( UntransformedGridPins[pinIndexBL] );        \r\n    DistortionComputePinUnpacked PinBR = UnpackPin ( UntransformedGridPins[pinIndexBR] );        \r\n    if ( ( PinTL.Fade > 0.0 ) ||                                                                               \r\n         ( PinTR.Fade > 0.0 ) ||                                                                               \r\n         ( PinBL.Fade > 0.0 ) ||                                                                               \r\n         ( PinBR.Fade > 0.0 ) )                                                                                \r\n    {\r\n        DistortionComputePinTimewarped PinWarpTL = WarpAndDistort ( PinTL );                            \r\n        DistortionComputePinTimewarped PinWarpTR = WarpAndDistort ( PinTR );                            \r\n        DistortionComputePinTimewarped PinWarpBL = WarpAndDistort ( PinBL );                            \r\n        DistortionComputePinTimewarped PinWarpBR = WarpAndDistort ( PinBR );                            \r\n\r\n        float2 pinFrac;                                                                          \r\n        int2 PixelPos;\r\n        pinFrac.x = pinFracTileStart.x;                                        \r\n        pinFrac.y = pinFracTileStart.y;                                        \r\n        float3 finalColor00 = FindPixelColour ( pinFrac,                                               \r\n                                                PinTL,\r\n                                                PinTR,\r\n                                                PinBL,\r\n                                                PinBR,\r\n                                                PinWarpTL,\r\n                                                PinWarpTR,\r\n                                                PinWarpBL,\r\n                                                PinWarpBR);\r\n        pinFrac.x = pinFracTileStart.x - (1.0 / gridSizeInPixels);                                        \r\n        pinFrac.y = pinFracTileStart.y;                                        \r\n        float3 finalColor01 = FindPixelColour ( pinFrac,                                               \r\n                                                PinTL,\r\n                                                PinTR,\r\n                                                PinBL,\r\n                                                PinBR,\r\n                                                PinWarpTL,\r\n                                                PinWarpTR,\r\n                                                PinWarpBL,\r\n                                                PinWarpBR);\r\n        pinFrac.x = pinFracTileStart.x;                                        \r\n        pinFrac.y = pinFracTileStart.y + (1.0 / gridSizeInPixels);                                        \r\n        float3 finalColor10 = FindPixelColour ( pinFrac,                                               \r\n                                                PinTL,\r\n                                                PinTR,\r\n                                                PinBL,\r\n                                                PinBR,\r\n                                                PinWarpTL,\r\n                                                PinWarpTR,\r\n                                                PinWarpBL,\r\n                                                PinWarpBR);\r\n        pinFrac.x = pinFracTileStart.x - (1.0 / gridSizeInPixels);                                        \r\n        pinFrac.y = pinFracTileStart.y + (1.0 / gridSizeInPixels);                                        \r\n        float3 finalColor11 = FindPixelColour ( pinFrac,                                               \r\n                                                PinTL,\r\n                                                PinTR,\r\n                                                PinBL,\r\n                                                PinBR,\r\n                                                PinWarpTL,\r\n                                                PinWarpTR,\r\n                                                PinWarpBL,\r\n                                                PinWarpBR);\r\n\r\n        float3 finalOut00;\r\n        float3 finalOut01;\r\n        float3 finalOut10;\r\n        float3 finalOut11;\r\n#if PENTILE_MODE==0\r\n        // No pentile, so it's easy.\r\n        finalOut00 = finalColor00;\r\n        finalOut01 = finalColor01;\r\n        finalOut10 = finalColor10;\r\n        finalOut11 = finalColor11;\r\n#elif PENTILE_MODE==1\r\n        // Now the DK2 pentile swizzle. Don't try to understand it; just rope, throw and brand it.\r\n        finalOut00.g = finalColor10.g;\r\n        finalOut01.g = finalColor01.g;\r\n        finalOut10.g = finalColor00.g;\r\n        finalOut11.g = finalColor11.g;\r\n        finalOut00.r = finalColor10.r;\r\n        finalOut01.r = finalColor01.r;\r\n        finalOut10.r = finalColor00.b;\r\n        finalOut11.r = finalColor11.b;\r\n        finalOut00.b = 0.0;\r\n        finalOut01.b = 0.0;\r\n        finalOut10.b = 0.0;\r\n        finalOut11.b = 0.0;\r\n#endif\r\n\r\n        PixelPos.x = PixelPosTile.x;\r\n        PixelPos.y = PixelPosTile.y;\r\n        Framebuffer[PixelPos.xy] = float4 ( finalOut00, 0.0 );\r\n        PixelPos.x = PixelPosTile.x + 1;\r\n        PixelPos.y = PixelPosTile.y;\r\n        Framebuffer[PixelPos.xy] = float4 ( finalOut01, 0.0 );\r\n        PixelPos.x = PixelPosTile.x;\r\n        PixelPos.y = PixelPosTile.y + 1;\r\n        Framebuffer[PixelPos.xy] = float4 ( finalOut10, 0.0 );\r\n        PixelPos.x = PixelPosTile.x + 1;\r\n        PixelPos.y = PixelPosTile.y + 1;\r\n        Framebuffer[PixelPos.xy] = float4 ( finalOut11, 0.0 );\r\n    }\r\n};\r\n\r\n\r\n\r\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D1X/Shaders/DistortionChroma_ps.psh",
    "content": "/************************************************************************************\r\n\r\nFilename    :   DistortionChroma_ps.psh\r\n\r\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\r\n\r\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \r\nyou may not use the Oculus VR Rift SDK except in compliance with the License, \r\nwhich is provided at the time of installation or download, or which \r\notherwise accompanies this software in either electronic or hard copy form.\r\n\r\nYou may obtain a copy of the License at\r\n\r\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \r\n\r\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n\r\n************************************************************************************/\r\n\r\nTexture2D Texture : register(t0);\r\nTexture2D LastTexture : register(t1);\r\nTexture2D OverdriveLut : register(t2);\r\nSamplerState Linear : register(s0);\r\n// unused - SamplerState Linear2 : register(s1);\r\nSamplerState OverdriveSampler : register(s2);\r\n\r\nfloat3 OverdriveScales;\r\nfloat AaDerivativeMult;\r\n\r\n// Fast approximate gamma to linear conversion when averaging colors\r\nfloat3 ToLinear(float3 inColor) { return inColor * inColor; }\r\nfloat3 ToGamma(float3 inColor)\t{ return sqrt(inColor); }\r\n\r\nvoid SampleStep(float2 oTexCoord0, float2 oTexCoord1, float2 oTexCoord2, float colorWeight, float2 texOffset,\r\n\t\t\t\tinout float3 totalColor, inout float totalWeight)\r\n{\r\n\tfloat3 newColor = 0;\r\n\tnewColor.r += Texture.Sample(Linear, oTexCoord0 + texOffset).r;\r\n\tnewColor.g += Texture.Sample(Linear, oTexCoord1 + texOffset).g;\r\n\tnewColor.b += Texture.Sample(Linear, oTexCoord2 + texOffset).b;\r\n\tnewColor = ToLinear(newColor);\r\n\r\n\ttotalColor += newColor * colorWeight;\r\n\ttotalWeight += colorWeight;\r\n}\r\n\r\nfloat3 ApplyHqAa(float2 oTexCoord0, float2 oTexCoord1, float2 oTexCoord2)\r\n{\r\n\tfloat2 texWidth = fwidth(oTexCoord1);\r\n\tfloat2 texStep = texWidth * AaDerivativeMult;\r\n\r\n\tfloat totalWeight = 0;\r\n\tfloat3 totalColor = 0;\r\n\r\n\t// center sample\r\n\tSampleStep(oTexCoord0, oTexCoord1, oTexCoord2, 4, 0, totalColor, totalWeight);\r\n\r\n\tfloat3 smplExp = 1.0 / 3.0;\r\n\tfloat3 smplWgt = 1.0;\r\n\r\n\tSampleStep(oTexCoord0, oTexCoord1, oTexCoord2, smplWgt.x, -1.000 * smplExp.x * texStep, totalColor, totalWeight);\r\n\t//SampleStep(oTexCoord0, oTexCoord1, oTexCoord2, smplWgt.y, -1.250 * smplExp.y * texStep, totalColor, totalWeight);\r\n\tSampleStep(oTexCoord0, oTexCoord1, oTexCoord2, smplWgt.z, -1.875 * smplExp.z * texStep, totalColor, totalWeight);\r\n\tSampleStep(oTexCoord0, oTexCoord1, oTexCoord2, smplWgt.z,  1.875 * smplExp.z * texStep, totalColor, totalWeight);\r\n\t//SampleStep(oTexCoord0, oTexCoord1, oTexCoord2, smplWgt.y,  1.250 * smplExp.y * texStep, totalColor, totalWeight);\r\n\tSampleStep(oTexCoord0, oTexCoord1, oTexCoord2, smplWgt.x,  1.000 * smplExp.x * texStep, totalColor, totalWeight);\r\n\r\n\treturn ToGamma(totalColor.rgb / totalWeight);\r\n}\r\n\r\nvoid   main(in float4 oPosition  : SV_Position,\r\n            in float  oColor     : COLOR,\r\n            in float2 oTexCoord0 : TEXCOORD0,\r\n            in float2 oTexCoord1 : TEXCOORD1,\r\n            in float2 oTexCoord2 : TEXCOORD2,\r\n\t\t\tout float4 outColor0 : SV_Target0,\r\n\t\t\tout float4 outColor1 : SV_Target1)\r\n{\r\n#define USE_ANISO 0\r\n\r\n#if USE_ANISO\t// enable \"SampleMode hqFilter = (distortionCaps ... \" in code\r\n\t\t\t\t// Using anisotropic sampling - requires sRGB sampling\r\n\r\n\t#if 1\t// feeding in proper ddx & ddy does not yield better visuals\r\n\t\tfloat2 uvDeriv = float2(ddx(oTexCoord1.x), ddy(oTexCoord1.y));\r\n\t\tfloat ResultR = Texture.SampleGrad(Linear, oTexCoord0, uvDeriv.x, uvDeriv.y).r;\r\n\t\tfloat ResultG = Texture.SampleGrad(Linear, oTexCoord1, uvDeriv.x, uvDeriv.y).g;\r\n\t\tfloat ResultB = Texture.SampleGrad(Linear, oTexCoord2, uvDeriv.x, uvDeriv.y).b;\r\n\t\tfloat3 newColor = float3(ResultR, ResultG, ResultB);\r\n\t#else\r\n\t\tfloat2 uvDerivX = ddx(oTexCoord1);\r\n\t\tfloat2 uvDerivY = ddy(oTexCoord1);\r\n\t\tfloat ResultR = Texture.SampleGrad(Linear, oTexCoord0, uvDerivX, uvDerivY).r;\r\n\t\tfloat ResultG = Texture.SampleGrad(Linear, oTexCoord1, uvDerivX, uvDerivY).g;\r\n\t\tfloat ResultB = Texture.SampleGrad(Linear, oTexCoord2, uvDerivX, uvDerivY).b;\r\n\t\tfloat3 newColor = float3(ResultR, ResultG, ResultB);\r\n\t#endif\r\n\r\n#else\r\n\r\n\tfloat3 newColor;\r\n\t// High quality anti-aliasing in distortion\r\n\tif(AaDerivativeMult > 0)\r\n\t{\r\n\t\tnewColor = ApplyHqAa(oTexCoord0, oTexCoord1, oTexCoord2);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tfloat ResultR = Texture.Sample(Linear, oTexCoord0).r;\r\n\t\tfloat ResultG = Texture.Sample(Linear, oTexCoord1).g;\r\n\t\tfloat ResultB = Texture.Sample(Linear, oTexCoord2).b;\r\n\t\tnewColor = float3(ResultR, ResultG, ResultB);\r\n\t}\r\n\r\n#endif\r\n\r\n\tnewColor = newColor * oColor.xxx;\r\n\toutColor0 = float4(newColor, 1.0);\r\n\toutColor1 = outColor0;\r\n\t\r\n\t// pixel luminance overdrive\r\n\tif(OverdriveScales.x > 0)\r\n\t{\r\n\t\tfloat3 oldColor = LastTexture.Load(int3(oPosition.xy, 0)).rgb;\r\n\t\t\r\n        float3 overdriveColor;\r\n\r\n        // x < 1.5 means \"use analytical model instead of LUT\"\r\n        if(OverdriveScales.x < 1.5)\r\n        {\r\n\t\t    float3 adjustedScales;\r\n\t\t    adjustedScales.x = newColor.x > oldColor.x ? OverdriveScales.y : OverdriveScales.z;\r\n    \t\tadjustedScales.y = newColor.y > oldColor.y ? OverdriveScales.y : OverdriveScales.z;\r\n\t\t    adjustedScales.z = newColor.z > oldColor.z ? OverdriveScales.y : OverdriveScales.z;\r\n\t\t    overdriveColor = saturate(newColor + (newColor - oldColor) * adjustedScales);\r\n        }\r\n\t\telse\r\n        {\r\n            overdriveColor.r = OverdriveLut.Sample(OverdriveSampler, float2(newColor.r, oldColor.r)).r;\r\n\t\t    overdriveColor.g = OverdriveLut.Sample(OverdriveSampler, float2(newColor.g, oldColor.g)).g;\r\n\t\t    overdriveColor.b = OverdriveLut.Sample(OverdriveSampler, float2(newColor.b, oldColor.b)).b;\r\n        }\r\n\r\n\t\toutColor1 = float4(overdriveColor, 1.0);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D1X/Shaders/DistortionChroma_vs.vsh",
    "content": "/************************************************************************************\r\n\r\nFilename    :   DistortionChroma_vs.vsh\r\n\r\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\r\n\r\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \r\nyou may not use the Oculus VR Rift SDK except in compliance with the License, \r\nwhich is provided at the time of installation or download, or which \r\notherwise accompanies this software in either electronic or hard copy form.\r\n\r\nYou may obtain a copy of the License at\r\n\r\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \r\n\r\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n\r\n************************************************************************************/\r\n\r\nfloat2   EyeToSourceUVScale;\r\nfloat2   EyeToSourceUVOffset;\r\n\r\nvoid main(in float2 Position    : POSITION,\r\n          in float4 Color       : COLOR0,\r\n          in float2 TexCoord0   : TEXCOORD0,\r\n          in float2 TexCoord1   : TEXCOORD1,\r\n          in float2 TexCoord2   : TEXCOORD2,\r\n          out float4 oPosition  : SV_Position,          \r\n          out float1 oColor     : COLOR,\r\n          out float2 oTexCoord0 : TEXCOORD0,\r\n          out float2 oTexCoord1 : TEXCOORD1,\r\n          out float2 oTexCoord2 : TEXCOORD2)\r\n{\r\n    oPosition.x = Position.x;\r\n    oPosition.y = Position.y;\r\n    oPosition.z = 0.5;\r\n    oPosition.w = 1.0;\r\n\r\n    // Scale them into  UV lookup space\r\n    float2 tc0scaled = EyeToSourceUVScale * TexCoord0 + EyeToSourceUVOffset;\r\n    float2 tc1scaled = EyeToSourceUVScale * TexCoord1 + EyeToSourceUVOffset;\r\n    float2 tc2scaled = EyeToSourceUVScale * TexCoord2 + EyeToSourceUVOffset;\r\n\r\n    oTexCoord0  = tc0scaled;        // R sample.\r\n    oTexCoord1  = tc1scaled;        // G sample.\r\n    oTexCoord2  = tc2scaled;        // B sample.\r\n    oColor      = Color.r;          // Used for vignette fade.\r\n}\r\n\r\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D1X/Shaders/DistortionTimewarpChroma_vs.vsh",
    "content": "/************************************************************************************\r\n\r\nFilename     :    DistortionPositionTimewarpChroma_vs.vsh\r\n\r\nCopyright    :    Copyright 2014 Oculus VR, LLC All Rights reserved.\r\n\r\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \r\nyou may not use the Oculus VR Rift SDK except in compliance with the License, \r\nwhich is provided at the time of installation or download, or which \r\notherwise accompanies this software in either electronic or hard copy form.\r\n\r\nYou may obtain a copy of the License at\r\n\r\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \r\n\r\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n\r\n************************************************************************************/\r\n\r\nTexture2DMS<float,1>  DepthTexture1x : register(t0);\r\nTexture2DMS<float,2>  DepthTexture2x : register(t1);\r\nTexture2DMS<float,4>  DepthTexture4x : register(t2);\r\n\r\nfloat depthMsaaSamples = -1.0;   // -1 means it's disabled\r\n\r\nfloat2 EyeToSourceUVScale;\r\nfloat2 EyeToSourceUVOffset;\r\nfloat4x4 EyeRotationStart;\r\nfloat4x4 EyeRotationEnd;\r\n\r\n// DepthProjector values can also be calculated as:\r\n// float DepthProjectorX = FarClip / (FarClip - NearClip);\r\n// float DepthProjectorY = (-FarClip * NearClip) / (FarClip - NearClip);\r\nfloat2 DepthProjector;\r\nfloat2 DepthDimSize;\r\n\r\nfloat4 PositionFromDepth(float2 inTexCoord)\r\n{\r\n    float2 eyeToSourceTexCoord = inTexCoord * EyeToSourceUVScale + EyeToSourceUVOffset;\r\n    float linearDepth = 1.0;\r\n\r\n    if(depthMsaaSamples > 0.0)\r\n    {\r\n        float depth;\r\n        if(depthMsaaSamples <= 1.5)\r\n            depth = DepthTexture1x.Load(int2(eyeToSourceTexCoord * DepthDimSize), 0).x;\r\n        else if(depthMsaaSamples <= 2.5)\r\n            depth = DepthTexture2x.Load(int2(eyeToSourceTexCoord * DepthDimSize), 0).x;\r\n        else\r\n            depth = DepthTexture4x.Load(int2(eyeToSourceTexCoord * DepthDimSize), 0).x;\r\n        \r\n        linearDepth = DepthProjector.y / (depth - DepthProjector.x);\r\n    }\r\n\r\n    float4 retVal = float4(inTexCoord, 1, 1);\r\n    retVal.xyz *= linearDepth;\r\n    return retVal;\r\n}\r\n\r\nfloat2 TimewarpTexCoordToWarpedPos(float2 inTexCoord, float4x4 rotMat)\r\n{\r\n\t// Vertex inputs are in TanEyeAngle space for the R,G,B channels (i.e. after chromatic aberration and distortion).\r\n\t// These are now \"real world\" vectors in direction (x,y,1) relative to the eye of the HMD.\t\r\n\t// Apply the 3x3 timewarp rotation to these vectors.\r\n    float4 inputPos = PositionFromDepth(inTexCoord);\r\n\tfloat3 transformed = float3( mul ( rotMat, inputPos ).xyz);\r\n\r\n\t// Project them back onto the Z=1 plane of the rendered images.\r\n\tfloat2 flattened = transformed.xy / transformed.z;\r\n\r\n\t// Scale them into ([0,0.5],[0,1]) or ([0.5,0],[0,1]) UV lookup space (depending on eye)\r\n\treturn flattened * EyeToSourceUVScale + EyeToSourceUVOffset;\r\n}\r\n\r\nvoid main(  in float2 Position      : POSITION,\r\n            in float4 Color         : COLOR0,\r\n            in float2 TexCoord0     : TEXCOORD0,\r\n            in float2 TexCoord1     : TEXCOORD1,\r\n            in float2 TexCoord2     : TEXCOORD2,\r\n            out float4 oPosition    : SV_Position,\r\n            out float1 oColor       : COLOR,\r\n            out float2 oTexCoord0   : TEXCOORD0,\r\n            out float2 oTexCoord1   : TEXCOORD1,\r\n            out float2 oTexCoord2   : TEXCOORD2)\r\n{\r\n    oPosition.x = Position.x;\r\n    oPosition.y = Position.y;\r\n    oPosition.z = 0.5;\r\n    oPosition.w = 1.0;\r\n      \t     \r\n    float timewarpLerpFactor = Color.a;\r\n    float4x4 lerpedEyeRot = lerp(EyeRotationStart, EyeRotationEnd, timewarpLerpFactor);\r\n\r\n    // warped positions are a bit more involved, hence a separate function\r\n    oTexCoord0 = TimewarpTexCoordToWarpedPos(TexCoord0, lerpedEyeRot);\r\n\toTexCoord1 = TimewarpTexCoordToWarpedPos(TexCoord1, lerpedEyeRot);\r\n\toTexCoord2 = TimewarpTexCoordToWarpedPos(TexCoord2, lerpedEyeRot);\r\n\r\n     oColor = Color.r;                  // Used for vignette fade.\r\n}\r\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D1X/Shaders/Distortion_ps.psh",
    "content": "/************************************************************************************\r\n\r\nFilename    :   Distortion_ps.psh\r\n\r\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\r\n\r\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \r\nyou may not use the Oculus VR Rift SDK except in compliance with the License, \r\nwhich is provided at the time of installation or download, or which \r\notherwise accompanies this software in either electronic or hard copy form.\r\n\r\nYou may obtain a copy of the License at\r\n\r\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \r\n\r\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n\r\n************************************************************************************/\r\n\r\n\r\nTexture2D    Texture : register(t0);\r\nSamplerState Linear  : register(s0);\r\n\r\nfloat4 main(in float4 oPosition  : SV_Position,\r\n            in float1 oColor     : COLOR,\r\n            in float2 oTexCoord0 : TEXCOORD0) : SV_Target\r\n{\r\n\tfloat3 Result = Texture.Sample(Linear, oTexCoord0).rgb;\r\n\treturn float4(Result * oColor, 1.0 );\r\n}\r\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D1X/Shaders/SimpleQuad_ps.psh",
    "content": "/************************************************************************************\r\n\r\nFilename    :   SimpleQuad_ps.psh\r\n\r\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\r\n\r\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \r\nyou may not use the Oculus VR Rift SDK except in compliance with the License, \r\nwhich is provided at the time of installation or download, or which \r\notherwise accompanies this software in either electronic or hard copy form.\r\n\r\nYou may obtain a copy of the License at\r\n\r\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \r\n\r\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n\r\n************************************************************************************/\r\n\r\nfloat4 Color;\r\n\r\nfloat4 main() : SV_Target\r\n{\r\n   return Color;\r\n}\r\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D1X/Shaders/SimpleQuad_vs.vsh",
    "content": "/************************************************************************************\r\n\r\nFilename    :   SimplaeQuad_vs.vsh\r\n\r\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\r\n\r\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \r\nyou may not use the Oculus VR Rift SDK except in compliance with the License, \r\nwhich is provided at the time of installation or download, or which \r\notherwise accompanies this software in either electronic or hard copy form.\r\n\r\nYou may obtain a copy of the License at\r\n\r\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \r\n\r\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n\r\n************************************************************************************/\r\n\r\nfloat2 PositionOffset = float2(0, 0);\r\nfloat2 Scale = float2(1, 1);\r\n\r\nvoid main(\tin  float3 Position\t\t: POSITION,\r\nout float4 oPosition\t: SV_Position)\r\n{\r\n\toPosition = float4(Position.xy * Scale + PositionOffset, 0.5, 1.0);\r\n}"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D1X/Shaders/SimpleTexturedQuad_ps.psh",
    "content": "/************************************************************************************\r\n\r\nFilename    :   SimpleTextureQuad_ps.psh\r\n\r\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\r\n\r\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \r\nyou may not use the Oculus VR Rift SDK except in compliance with the License, \r\nwhich is provided at the time of installation or download, or which \r\notherwise accompanies this software in either electronic or hard copy form.\r\n\r\nYou may obtain a copy of the License at\r\n\r\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \r\n\r\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n\r\n************************************************************************************/\r\n\r\nfloat4 Color;\r\n\r\nSamplerState LinearSampler : register(s0);\r\nTexture2D Texture : register(t0);\r\n\r\nstruct Values\r\n{\r\n   float4 Position : SV_Position;\r\n   float4 Color    : COLOR0;\r\n   float2 TexCoord : TEXCOORD0;\r\n};\r\n\r\nfloat4 main(in Values inputValues) : SV_Target\r\n{\r\n    return Color * inputValues.Color * Texture.Sample(LinearSampler, inputValues.TexCoord);\r\n}\r\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D1X/Shaders/SimpleTexturedQuad_vs.vsh",
    "content": "/************************************************************************************\r\n\r\nFilename    :   SimpleTextureQuad_vs.vsh\r\n\r\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\r\n\r\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \r\nyou may not use the Oculus VR Rift SDK except in compliance with the License, \r\nwhich is provided at the time of installation or download, or which \r\notherwise accompanies this software in either electronic or hard copy form.\r\n\r\nYou may obtain a copy of the License at\r\n\r\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \r\n\r\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n\r\n************************************************************************************/\r\n\r\nstruct Values\r\n{\r\n   float4 Position : SV_Position;\r\n   float4 Color    : COLOR0;\r\n   float2 TexCoord : TEXCOORD0;\r\n};\r\n\r\nfloat2 PositionOffset = float2(0, 0);\r\nfloat2 Scale = float2(1, 1);\r\n\r\nvoid main(in float3 Position : POSITION, in float4 Color : COLOR0, in float2 TexCoord : TEXCOORD0, out Values outputValues)\r\n{\r\n   outputValues.Position = float4(Position.xy * Scale + PositionOffset, 0.5, 1.0);\r\n   outputValues.Color    = Color;\r\n   outputValues.TexCoord = TexCoord;\r\n}\r\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D1X/Shaders/genComputeShaderHeader.bat",
    "content": "@echo off\r\npushd %~dp0\r\necho Compiling shader and packing into header: %~2\r\nsetlocal\r\n\r\nfxc.exe  /nologo /E main /T cs_5_0 /Fo \"%1\" %2\r\nbin2header.exe \"%1\"\r\n\r\necho Generating shader reflection data for %1\r\nShaderReflector \"%1\" \"%1_refl.h\"\r\n\r\necho /* Concatenating shader reflector output:*/ >> \"%1.h\"\r\ntype \"%1_refl.h\" >> \"%1.h\"\r\ndel \"%1_refl.h\"\r\n\r\ndel \"%1\"\r\nendlocal\r\npopd\r\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D1X/Shaders/genPixelShaderHeader.bat",
    "content": "@echo off\r\npushd %~dp0\r\necho Compiling shader and packing into header: %~2\r\nsetlocal\r\n\r\nfxc.exe  /nologo /E main /T ps_4_1 /Fo \"%1\" %2\r\nbin2header.exe \"%1\"\r\n\r\necho Generating shader reflection data for %1\r\nShaderReflector \"%1\" \"%1_refl.h\"\r\n\r\necho /* Concatenating shader reflector output:*/ >> \"%1.h\"\r\ntype \"%1_refl.h\" >> \"%1.h\"\r\ndel \"%1_refl.h\"\r\n\r\ndel \"%1\"\r\nendlocal\r\npopd\r\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D1X/Shaders/genVertexShaderHeader.bat",
    "content": "@echo off\r\npushd %~dp0\r\necho Compiling shader and packing into header: %~2\r\nsetlocal\r\n\r\nfxc.exe  /nologo /E main /T vs_4_1 /Fo \"%1\" %2\r\nbin2header.exe \"%1\"\r\n\r\necho Generating shader reflection data for %1\r\nShaderReflector \"%1\" \"%1_refl.h\"\r\n\r\necho /* Concatenating shader reflector output:*/ >> \"%1.h\"\r\ntype \"%1_refl.h\" >> \"%1.h\"\r\ndel \"%1_refl.h\"\r\n\r\ndel \"%1\"\r\nendlocal\r\npopd\r\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D9/CAPI_D3D9_DistortionRenderer.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_D3D11_DistortionRenderer.cpp\nContent     :   Experimental distortion renderer\nCreated     :   March 7th, 2014\nAuthors     :   Tom Heath\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_D3D9_DistortionRenderer.h\"\n#include \"OVR_CAPI_D3D.h\"\n\n#include <initguid.h>\nDEFINE_GUID(IID_OVRDirect3DDevice9EX, 0xe6d58f10, 0xffa1, 0x4748, 0x85, 0x9f, 0xbc, 0xd7, 0xea, 0xe8, 0xfc, 0x1);\n\nOVR_DISABLE_MSVC_WARNING(4996) // Disable deprecation warning\n\nnamespace OVR { namespace CAPI { namespace D3D9 {\n\n\n///QUESTION : Why not just a normal constructor?\nCAPI::DistortionRenderer* DistortionRenderer::Create()\n{\n    return new DistortionRenderer();\n}\n\nDistortionRenderer::DistortionRenderer() :\n    Device(NULL),\n    SwapChain(NULL),\n    VertexDecl(NULL),\n    PixelShader(NULL),\n    VertexShader(NULL),\n    VertexShaderTimewarp(NULL),\n   //screenSize(),\n    ResolutionInPixels(0,0)\n  //eachEye[]\n{\n    ScreenSize.w = 0;\n    ScreenSize.h = 0;\n\n    for (int i = 0; i < 2; ++i)\n    {\n        eachEye[i].dxIndices = nullptr;\n        eachEye[i].dxVerts = nullptr;\n    }\n}\n\n\n/**********************************************/\nDistortionRenderer::~DistortionRenderer()\n{\n\t//Release any memory\n    if (eachEye[0].dxIndices)\n    {\n        eachEye[0].dxIndices->Release();\n    }\n    if (eachEye[0].dxVerts)\n    {\n        eachEye[0].dxVerts->Release();\n    }\n    if (eachEye[1].dxIndices)\n    {\n        eachEye[1].dxIndices->Release();\n    }\n    if (eachEye[1].dxVerts)\n    {\n        eachEye[1].dxVerts->Release();\n    }\n}\n\n\n/******************************************************************************/\nbool DistortionRenderer::initializeRenderer(const ovrRenderAPIConfig* apiConfig)\n{\n    initLatencyTester();\n\n\t///QUESTION - what is returned bool for???  Are we happy with this true, if not config.\n    const ovrD3D9Config * config = (const ovrD3D9Config*)apiConfig;\n    if (!config)                return true; \n    if (!config->D3D9.pDevice)  return false;\n\n    if (Display::GetDirectDisplayInitialized())\n    {\n        Ptr<IUnknown> ovrDevice;\n        if (config->D3D9.pDevice->QueryInterface(IID_OVRDirect3DDevice9EX, (void**)&ovrDevice.GetRawRef()) == E_NOINTERFACE)\n        {\n            OVR_DEBUG_LOG_TEXT((\"ovr_Initialize() or ovr_InitializeRenderingShim() wasn't called before the D3D9 device was created.\"));\n        }\n    }\n\n\t//Glean all the required variables from the input structures\n\tDevice         = config->D3D9.pDevice;\n    SwapChain      = config->D3D9.pSwapChain;\n\tScreenSize     = config->D3D9.Header.BackBufferSize;\n\n\tGfxState = *new GraphicsState(Device, RenderState->DistortionCaps);\n\n\tCreateVertexDeclaration();\n\tCreateDistortionShaders();\n\treturn CreateDistortionModels();\n}\n\nvoid DistortionRenderer::initLatencyTester()\n{\n    ResolutionInPixels = RenderState->OurHMDInfo.ResolutionInPixels;\n}\n\n\n/**************************************************************/\nvoid DistortionRenderer::SubmitEye(int eyeId, const ovrTexture* eyeTexture)\n{\n    if (eyeTexture)\n    {\n        //Doesn't do a lot in here??\n        const ovrD3D9Texture* tex = (const ovrD3D9Texture*)eyeTexture;\n\n        //Write in values\n        eachEye[eyeId].texture = tex->D3D9.pTexture;\n\n        // Its only at this point we discover what the viewport of the texture is.\n        // because presumably we allow users to realtime adjust the resolution.\n        eachEye[eyeId].TextureSize = tex->D3D9.Header.TextureSize;\n        eachEye[eyeId].RenderViewport = tex->D3D9.Header.RenderViewport;\n\n        const ovrEyeRenderDesc& erd = RenderState->EyeRenderDesc[eyeId];\n\n        ovrHmd_GetRenderScaleAndOffset(erd.Fov,\n            eachEye[eyeId].TextureSize, eachEye[eyeId].RenderViewport,\n            eachEye[eyeId].UVScaleOffset);\n\n        if (RenderState->DistortionCaps & ovrDistortionCap_FlipInput)\n        {\n            eachEye[eyeId].UVScaleOffset[0].y = -eachEye[eyeId].UVScaleOffset[0].y;\n            eachEye[eyeId].UVScaleOffset[1].y = 1.0f - eachEye[eyeId].UVScaleOffset[1].y;\n        }\n    }\n}\n\nvoid DistortionRenderer::SubmitEyeWithDepth(int eyeId, const ovrTexture* eyeColorTexture, const ovrTexture* eyeDepthTexture)\n{\n    SubmitEye(eyeId, eyeColorTexture);\n\n    OVR_UNUSED(eyeDepthTexture);\n}\n\nvoid DistortionRenderer::renderEndFrame()\n{\n    RenderBothDistortionMeshes();\n\n    if(RegisteredPostDistortionCallback)\n        RegisteredPostDistortionCallback(Device);\n\n    if (LatencyTest2Active)\n    {\n        renderLatencyPixel(LatencyTest2DrawColor);\n    }\n}\n\n/******************************************************************/\nvoid DistortionRenderer::EndFrame(uint32_t frameIndex, bool swapBuffers)\n{\n\t///QUESTION : Clear the screen? \n\t///QUESTION : Ensure the screen is the render target\n\n    // D3D9 does not provide any frame timing information.\n    Timing->CalculateTimewarpTiming(frameIndex);\n\n    // Don't spin if we are explicitly asked not to\n    if ( (RenderState->DistortionCaps & ovrDistortionCap_TimeWarp) &&\n         (RenderState->DistortionCaps & ovrDistortionCap_TimewarpJitDelay) &&\n        !(RenderState->DistortionCaps & ovrDistortionCap_ProfileNoSpinWaits))\n    {\n        if (!Timing->NeedDistortionTimeMeasurement())\n        {\n            FlushGpuAndWaitTillTime(Timing->GetTimewarpTiming()->JIT_TimewarpTime);\n\n            renderEndFrame();\n        }\n        else\n        {\n            // If needed, measure distortion time so that TimeManager can better estimate\n            // latency-reducing time-warp wait timing.\n            WaitUntilGpuIdle();\n            double distortionStartTime = ovr_GetTimeInSeconds();\n\n            renderEndFrame();\n\n            WaitUntilGpuIdle();\n            Timing->AddDistortionTimeMeasurement(ovr_GetTimeInSeconds() - distortionStartTime);\n        }\n    }\n    else\n    {\n        renderEndFrame();\n    }\n\n    if (LatencyTestActive)\n    {\n        renderLatencyQuad(LatencyTestDrawColor);\n    }\n\n    if (swapBuffers)\n    {\n        if (SwapChain)\n        {\n            SwapChain->Present(NULL, NULL, NULL, NULL, 0);\n        }\n        else\n        {\n\t\t    Device->Present( NULL, NULL, NULL, NULL );\n        }\n\n        // Force GPU to flush the scene, resulting in the lowest possible latency.\n        // It's critical that this flush is *after* present.\n        // Doesn't need to be done if running through the Oculus driver.\n        if (RenderState->OurHMDInfo.InCompatibilityMode &&\n            !(RenderState->DistortionCaps & ovrDistortionCap_ProfileNoSpinWaits))\n        {\n            WaitUntilGpuIdle();\n       }\n    }\n}\n\n\nvoid DistortionRenderer::WaitUntilGpuIdle()\n{\n\tif(Device)\n    {\n         IDirect3DQuery9* pEventQuery=NULL ;\n         Device->CreateQuery(D3DQUERYTYPE_EVENT, &pEventQuery) ;\n\n         if(pEventQuery!=NULL)\n         {\n            pEventQuery->Issue(D3DISSUE_END) ;\n            while(S_FALSE == pEventQuery->GetData(NULL, 0, D3DGETDATA_FLUSH)){}\n            pEventQuery->Release();\n         }\n     }\n}\n\ndouble DistortionRenderer::FlushGpuAndWaitTillTime(double absTime)\n{\n\tdouble initialTime = ovr_GetTimeInSeconds();\n\tif (initialTime >= absTime)\n\t\treturn 0.0;\n\n\tWaitUntilGpuIdle();\n\n    return WaitTillTime(absTime);\n}\n\n\n//-----------------------------------------------------------------------------\n// Latency Tester Quad\n\nstatic void ConvertSRGB(unsigned char c[3])\n{\n    for (int i = 0; i < 3; ++i)\n    {\n        double d = (double)c[i];\n        double ds = d / 255.;\n\n        if (ds <= 0.04045)\n        {\n            d /= 12.92;\n        }\n        else\n        {\n            d = 255. * pow((ds + 0.055) / 1.055, 2.4);\n        }\n\n        int color = (int)d;\n        if (color < 0)\n        {\n            color = 0;\n        }\n        else if (color > 255)\n        {\n            color = 255;\n        }\n\n        c[i] = (unsigned char)color;\n    }\n}\n\nvoid DistortionRenderer::renderLatencyQuad(unsigned char* color)\n{\n    D3DRECT rect = { ResolutionInPixels.w / 4, ResolutionInPixels.h / 4, ResolutionInPixels.w * 3 / 4, ResolutionInPixels.h * 3 / 4 };\n    unsigned char c[3] = { color[0], color[1], color[2] };\n\n    if (RenderState->DistortionCaps & ovrDistortionCap_SRGB)\n    {\n        ConvertSRGB(c);\n    }\n\n    Device->Clear(1, &rect, D3DCLEAR_TARGET, D3DCOLOR_RGBA(c[0], c[1], c[2], 255), 1, 0);\n}\n\n#ifdef OVR_BUILD_DEBUG\n#define OVR_LATENCY_PIXEL_SIZE 20\n#else\n#define OVR_LATENCY_PIXEL_SIZE 5\n#endif\n\nvoid DistortionRenderer::renderLatencyPixel(unsigned char* color)\n{\n    D3DRECT rect;\n\n    if (RenderState->RenderInfo.OffsetLatencyTester)\n    {\n        // TBD: Is this correct?\n        rect.x1 = ResolutionInPixels.w / 2;\n        rect.y1 = 0;\n    }\n    else\n    {\n        rect.x1 = ResolutionInPixels.w - OVR_LATENCY_PIXEL_SIZE;\n        rect.y1 = 0;\n    }\n\n    rect.x2 = rect.x1 + OVR_LATENCY_PIXEL_SIZE;\n    rect.y2 = rect.y1 + OVR_LATENCY_PIXEL_SIZE;\n\n    // TBD: Does (RenderState->RenderInfo.RotateCCW90) affect this?\n\n    unsigned char c[3] = { color[0], color[1], color[2] };\n\n    if (RenderState->DistortionCaps & ovrDistortionCap_SRGB)\n    {\n        ConvertSRGB(c);\n    }\n\n    Device->Clear(1, &rect, D3DCLEAR_TARGET, D3DCOLOR_RGBA(c[0], c[1], c[2], 255), 1, 0);\n}\n\n\n//-----------------------------------------------------------------------------\n// GraphicsState\n\nDistortionRenderer::GraphicsState::GraphicsState(IDirect3DDevice9* d, unsigned distortionCaps)\n: Device(d)\n, NumSavedStates(0)\n, DistortionCaps(distortionCaps)\n{\n    #if defined(OVR_BUILD_DEBUG)\n        memset(SavedState, 0, sizeof(SavedState));\n    #endif\n}\n\nvoid DistortionRenderer::GraphicsState::RecordAndSetState(int which, int type, DWORD newValue)\n{\n\tSavedStateType * sst = &SavedState[NumSavedStates++];\n\tsst->which = which;\n\tsst->type = type;\n\tif (which == 0)\n\t{\n\t\tDevice->GetSamplerState(0, (D3DSAMPLERSTATETYPE)type, &sst->valueToRevertTo);\n\t\tDevice->SetSamplerState(0, (D3DSAMPLERSTATETYPE)type, newValue);\n\t}\n\telse\n\t{\n\t\tDevice->GetRenderState((D3DRENDERSTATETYPE)type, &sst->valueToRevertTo);\n\t\tDevice->SetRenderState((D3DRENDERSTATETYPE)type, newValue);\n\t}\n}\n\nvoid DistortionRenderer::GraphicsState::Save()\n{\n\t//Record and set rasterizer and sampler states.\n\n\tNumSavedStates=0;\n\n    RecordAndSetState(0, D3DSAMP_MINFILTER,          D3DTEXF_LINEAR );\n    RecordAndSetState(0, D3DSAMP_MAGFILTER,          D3DTEXF_LINEAR );\n    RecordAndSetState(0, D3DSAMP_MIPFILTER,          D3DTEXF_LINEAR );\n    RecordAndSetState(0, D3DSAMP_BORDERCOLOR,        0x000000 );\n    RecordAndSetState(0, D3DSAMP_ADDRESSU,           D3DTADDRESS_BORDER );\n    RecordAndSetState(0, D3DSAMP_ADDRESSV,           D3DTADDRESS_BORDER );\n    RecordAndSetState(0, D3DSAMP_SRGBTEXTURE,        (DistortionCaps & ovrDistortionCap_SRGB) ? TRUE : FALSE );\n\n\tRecordAndSetState(1, D3DRS_MULTISAMPLEANTIALIAS, FALSE );\n\tRecordAndSetState(1, D3DRS_DITHERENABLE,         FALSE );\n\tRecordAndSetState(1, D3DRS_ZENABLE,              FALSE );\n    RecordAndSetState(1, D3DRS_ZWRITEENABLE,         TRUE   );\n    RecordAndSetState(1, D3DRS_ZFUNC,                D3DCMP_LESSEQUAL   );\n    RecordAndSetState(1, D3DRS_CULLMODE ,            D3DCULL_CCW  );\n   \tRecordAndSetState(1, D3DRS_ALPHABLENDENABLE ,    FALSE );\n   \tRecordAndSetState(1, D3DRS_DEPTHBIAS ,           0 );\n    RecordAndSetState(1, D3DRS_SRCBLEND ,            D3DBLEND_SRCALPHA );\n    RecordAndSetState(1, D3DRS_DESTBLEND ,           D3DBLEND_INVSRCALPHA   );\n   \tRecordAndSetState(1, D3DRS_FILLMODE,             D3DFILL_SOLID );\n    RecordAndSetState(1, D3DRS_ALPHATESTENABLE,      FALSE);\n \tRecordAndSetState(1, D3DRS_DEPTHBIAS ,           0 );\n    RecordAndSetState(1, D3DRS_LIGHTING,             FALSE );\n   \tRecordAndSetState(1, D3DRS_FOGENABLE,            FALSE );\n    RecordAndSetState(1, D3DRS_SRGBWRITEENABLE,      (DistortionCaps & ovrDistortionCap_SRGB) ? TRUE : FALSE );\n}\n\n\nvoid DistortionRenderer::GraphicsState::Restore()\n{\n\tfor (int i = 0; i < NumSavedStates; i++)\n\t{\n\t\tSavedStateType * sst = &SavedState[i];\n\t\tif (sst->which == 0)\n\t\t{\n\t\t\tDevice->SetSamplerState(0, (D3DSAMPLERSTATETYPE)sst->type, sst->valueToRevertTo);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDevice->SetRenderState((D3DRENDERSTATETYPE)sst->type, sst->valueToRevertTo);\n\t\t}\n\t}\n}\n\n\n}}} // OVR::CAPI::D3D11\n\nOVR_RESTORE_MSVC_WARNING()\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D9/CAPI_D3D9_DistortionRenderer.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_D3D11_DistortionRenderer.h\nContent     :   Experimental distortion renderer\nCreated     :   March 7, 2014\nAuthors     :   Tom Heath\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"Kernel/OVR_Types.h\"\n#include \"Util/Util_Direct3D.h\"\n\n#if defined(OVR_DEFINE_NEW)\n#define new OVR_DEFINE_NEW\n#endif \n\n#include \"../CAPI_DistortionRenderer.h\"\n\n\nnamespace OVR { namespace CAPI { namespace D3D9 {\n\n\n//Implementation of DistortionRenderer for D3D9.\n/***************************************************/\nclass DistortionRenderer : public CAPI::DistortionRenderer\n{\npublic:    \n    DistortionRenderer();\n    ~DistortionRenderer();\n\n    // Creation function for the device.    \n    static CAPI::DistortionRenderer* Create();\n\n    // ***** Public DistortionRenderer interface\n    virtual void SubmitEye(int eyeId, const ovrTexture* eyeTexture) OVR_OVERRIDE;\n    virtual void SubmitEyeWithDepth(int eyeId, const ovrTexture* eyeColorTexture, const ovrTexture* eyeDepthTexture) OVR_OVERRIDE;\n\n    virtual void EndFrame(uint32_t frameIndex, bool swapBuffers);\n\n    // TBD: Make public?\n    void         WaitUntilGpuIdle();\n\n\t// Similar to ovr_WaitTillTime but it also flushes GPU.\n\t// Note, it exits when time expires, even if GPU is not in idle state yet.\n\tdouble       FlushGpuAndWaitTillTime(double absTime);\n\nprotected:\n    virtual bool initializeRenderer(const ovrRenderAPIConfig* apiConfig) OVR_OVERRIDE;\n\n    class GraphicsState : public CAPI::DistortionRenderer::GraphicsState\n\t{\n\tpublic:\n\t\tGraphicsState(IDirect3DDevice9* d, unsigned distortionCaps);\n\t\tvirtual void Save();\n\t\tvirtual void Restore();\n\n\tprotected:\n\t\tvoid RecordAndSetState(int which, int type, DWORD newValue);\n\n\t\t//Structure to store our state changes\n\t\tstatic const int MAX_SAVED_STATES=100;\n\t\tstruct SavedStateType\n\t\t{\n\t\t\tint which;  //0 for samplerstate, 1 for renderstate\n\t\t\tint type;\n\t\t\tDWORD valueToRevertTo;\n\t\t} SavedState[MAX_SAVED_STATES];\n\n\t\t//Keep track of how many we've done, for reverting\n\t\tint NumSavedStates;\n\t\tIDirect3DDevice9* Device;\n        unsigned DistortionCaps;\n\t};\n\nprivate:\n\n\t//Functions\n\tvoid         CreateDistortionShaders();\n\tbool         CreateDistortionModels();\n\tvoid         CreateVertexDeclaration();\n\tvoid         RenderBothDistortionMeshes();\n\tvoid         RecordAndSetState(int which, int type, DWORD newValue);\n\tvoid         RevertAllStates();\n\n    void         renderEndFrame();\n\n    // Latency tester\n    void initLatencyTester();\n    void renderLatencyQuad(unsigned char* latencyTesterDrawColor);\n    void renderLatencyPixel(unsigned char* latencyTesterPixelColor);\n\n\t//Data, structures and pointers\n\tIDirect3DDevice9            * Device;\n\tIDirect3DSwapChain9         * SwapChain;\n\tIDirect3DVertexDeclaration9 * VertexDecl;\n\tIDirect3DPixelShader9       * PixelShader;\n\tIDirect3DVertexShader9      * VertexShader;\n\tIDirect3DVertexShader9      * VertexShaderTimewarp;\n\tovrSizei                      ScreenSize;\n\n    // Latency tester\n    Size<int>                     ResolutionInPixels;\n\n\tstruct FOR_EACH_EYE\n\t{\n        FOR_EACH_EYE() : dxVerts(NULL), dxIndices(NULL), numVerts(0), numIndices(0), texture(NULL), /*UVScaleOffset[],*/ TextureSize(0, 0), RenderViewport(0, 0, 0, 0) { }\n\n\t\tIDirect3DVertexBuffer9  * dxVerts;\n\t\tIDirect3DIndexBuffer9   * dxIndices;\n\t\tint                       numVerts;\n\t\tint                       numIndices;\n\t\tIDirect3DTexture9       * texture;\n\t\tovrVector2f\t\t\t \t  UVScaleOffset[2]; \n        Sizei                     TextureSize;\n        Recti                     RenderViewport;\n\t} eachEye[2];\n};\n\n\n}}} // namespace OVR::CAPI::D3D9\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D9/CAPI_D3D9_HSWDisplay.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_D3D9_HSWDisplay.cpp\nContent     :   Implements Health and Safety Warning system.\nCreated     :   July 7, 2014\nAuthors     :   Paul Pedriana\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_D3D9_HSWDisplay.h\"\n#include \"OVR_CAPI_D3D.h\"\n#include \"Util/Util_Direct3D.h\"\n#include \"Kernel/OVR_File.h\"\n#include \"Kernel/OVR_SysFile.h\"\n#include \"Kernel/OVR_Allocator.h\"\n#include \"Kernel/OVR_Color.h\"\n#include \"Extras/OVR_Math.h\"\n\n\nOVR_DISABLE_MSVC_WARNING(4996) // Disable deprecation warning\n\nnamespace OVR { namespace CAPI { \n\n\n// To do Need to move LoadTextureTgaData to a shared location.\nuint8_t* LoadTextureTgaData(OVR::File* f, uint8_t alpha, int& width, int& height);\n\n\nnamespace D3D9 {\n\n// This is a temporary function implementation, and it functionality needs to be implemented in a more generic way.\nIDirect3DTexture9* LoadTextureTga(HSWRenderParams& rParams, OVR::File* f, uint8_t alpha)\n{\n    IDirect3DTexture9* pTexture = NULL;\n\n    int width, height;\n    const uint8_t* pRGBA = LoadTextureTgaData(f, alpha, width, height);\n\n    if (pRGBA)\n    {\n        // We don't have access to D3DX9 and so we currently have to do this manually instead of calling a D3DX9 utility function.\n        Ptr<IDirect3DTexture9> pTextureSysmem;\n        HRESULT hResult = rParams.Device->CreateTexture((UINT)width, (UINT)height, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &pTextureSysmem.GetRawRef(), NULL);\n\n        if(FAILED(hResult))\n            { HSWDISPLAY_LOG((\"CreateTexture(D3DPOOL_SYSTEMMEM) failed. %d (%x)\", hResult, hResult)); }\n        else\n        {\n            // Lock the texture so we can write this frame's texel data\n            D3DLOCKED_RECT lock;\n            hResult = pTextureSysmem->LockRect(0, &lock, NULL, D3DLOCK_NOSYSLOCK | D3DLOCK_NO_DIRTY_UPDATE);\n            if(FAILED(hResult))\n                { HSWDISPLAY_LOG((\"LockRect failed. %d (%x)\", hResult, hResult)); }\n            else\n            {\n                // Four bytes per pixel. Pitch bytes per row (will be >= w * 4).\n                uint8_t*       pRow = (uint8_t*)lock.pBits;\n                const uint8_t* pSource = pRGBA;\n\n                for(int y = 0; y < height; y++, pRow += lock.Pitch, pSource += (width * 4))\n                {\n                    uint8_t* pDest = pRow;\n\n                    for(int x = 0, xEnd = width * 4; x < xEnd; x += 4)\n                    {\n                        pDest[x + 0] = pSource[x + 2];\n                        pDest[x + 1] = pSource[x + 1];\n                        pDest[x + 2] = pSource[x + 0];\n                        pDest[x + 3] = pSource[x + 3];\n                    }\n                }\n\n                pTextureSysmem->UnlockRect(0);\n\n                hResult = rParams.Device->CreateTexture((UINT)width, (UINT)height, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pTexture, NULL);\n                if(FAILED(hResult))\n                    { HSWDISPLAY_LOG((\"CreateTexture(D3DPOOL_DEFAULT) failed. %d (%x)\", hResult, hResult)); }\n                else\n                {\n                    hResult = rParams.Device->UpdateTexture(pTextureSysmem, pTexture);\n                    if(FAILED(hResult))\n                    {\n                        HSWDISPLAY_LOG((\"UpdateTexture failed. %d (%x)\", hResult, hResult));\n                        pTexture->Release();\n                        pTexture = NULL;\n                    }\n                }\n            }\n        }\n\n        OVR_FREE(const_cast<uint8_t*>(pRGBA));\n    }\n\n    return pTexture;\n}\n\n\n// Loads a texture from a memory image of a TGA file.\nIDirect3DTexture9* LoadTextureTga(HSWRenderParams& rParams, const uint8_t* pData, int dataSize, uint8_t alpha)\n{\n    MemoryFile memoryFile(\"\", pData, dataSize);\n\n    return LoadTextureTga(rParams, &memoryFile, alpha);\n}\n\n\n// Loads a texture from a disk TGA file.\nIDirect3DTexture9* LoadTextureTga(HSWRenderParams& rParams, const char* pFilePath, uint8_t alpha)\n{\n    SysFile sysFile;\n\n    if(sysFile.Open(pFilePath, FileConstants::Open_Read | FileConstants::Open_Buffered))\n        return LoadTextureTga(rParams, &sysFile, alpha);\n\n    return NULL;\n}\n\n\n\n// To do: This needs to be promoted to a central version, possibly in CAPI_HSWDisplay.h\nstruct HASWVertex\n{\n    Vector3f  Pos;\n    Color     C;\n    float     U, V;\t\n\n    HASWVertex(const Vector3f& p, const Color& c = Color(64,0,0,255), float u = 0, float v = 0)\n        : Pos(p), C(c), U(u), V(v)\n    {}\n\n    HASWVertex(float x, float y, float z, const Color& c = Color(64,0,0,255), float u = 0, float v = 0) \n        : Pos(x,y,z), C(c), U(u), V(v)\n    {}\n\n    bool operator==(const HASWVertex& b) const\n    {\n        return (Pos == b.Pos) && (C == b.C) && (U == b.U) && (V == b.V);\n    }\n};\n\n#define HASWVertexD3D9Format (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)\n\n\n// The texture below may conceivably be shared between HSWDisplay instances. However,  \n// beware that sharing may not be possible if two HMDs are using different locales  \n// simultaneously. As of this writing it's not clear if that can occur in practice.\n\nHSWDisplay::HSWDisplay(ovrRenderAPIType api, ovrHmd hmd, const HMDRenderState& renderState)\n  : OVR::CAPI::HSWDisplay(api, hmd, renderState)\n  , RenderParams()\n{\n}\n    \nbool HSWDisplay::Initialize(const ovrRenderAPIConfig* apiConfig)\n{\n    const ovrD3D9Config* config = reinterpret_cast<const ovrD3D9Config*>(apiConfig);\n\n    if(config)\n    {\n\t    RenderParams.Device     = config->D3D9.pDevice;\n        RenderParams.SwapChain  = config->D3D9.pSwapChain;\n\t    RenderParams.ScreenSize = config->D3D9.Header.BackBufferSize;\n    }\n    else\n    {\n        UnloadGraphics();\n    }\n\n    return true;\n}\n\nvoid HSWDisplay::Shutdown()\n{\n    UnloadGraphics();\n}\n\nvoid HSWDisplay::DisplayInternal()\n{\n    HSWDISPLAY_LOG((\"[HSWDisplay D3D9] DisplayInternal()\"));\n    // We may want to call LoadGraphics here instead of within Render.\n}\n\nvoid HSWDisplay::DismissInternal()\n{\n    HSWDISPLAY_LOG((\"[HSWDisplay D3D9] DismissInternal()\"));\n    UnloadGraphics();\n}\n\n\nvoid HSWDisplay::UnloadGraphics()\n{\n    // RenderParams: No need to clear.\n    pTexture.Clear();\n    pVB.Clear();\n    // OrthoProjection: No need to clear.\n}\n\n\nvoid HSWDisplay::LoadGraphics()\n{\n    // As of this writing, we don't yet have an abstraction for Textures, Buffers, and Shaders like we do for D3D11, D3D11, and OpenGL.\n    #if defined(OVR_BUILD_DEBUG)\n        if(!pTexture)\n            pTexture = *LoadTextureTga(RenderParams, \"C:\\\\TestPath\\\\TestFile.tga\", 255);\n    #endif\n\n    if(!pTexture)\n    {\n        D3DCAPS9 caps;\n        RenderParams.Device->GetDeviceCaps(&caps);\n\n        if(caps.TextureCaps & (D3DPTEXTURECAPS_SQUAREONLY | D3DPTEXTURECAPS_POW2))\n            { HSWDISPLAY_LOG((\"[HSWDisplay D3D9] Square textures allowed only.\")); }\n\n        size_t textureSize;\n        const uint8_t* TextureData = GetDefaultTexture(textureSize);\n        pTexture = *LoadTextureTga(RenderParams, TextureData, (int)textureSize, 255);\n        OVR_ASSERT(pTexture);\n    }\n\n    if(!pVB)\n    {\n        HRESULT hResult = RenderParams.Device->CreateVertexBuffer(4 * sizeof(HASWVertex), NULL, HASWVertexD3D9Format, D3DPOOL_MANAGED, &pVB.GetRawRef(), NULL);\n\n        if(FAILED(hResult))\n            { HSWDISPLAY_LOG((\"[HSWDisplay D3D9] CreateVertexBuffer failed. %d (%x)\", hResult, hResult)); }\n        else\n        {\n            void* pVerticesVoid;\n            hResult = pVB->Lock(0, 0, (void**)&pVerticesVoid, 0);\n\n            if(FAILED(hResult))\n                { HSWDISPLAY_LOG((\"[HSWDisplay D3D9] Lock failed. %d (%x)\", hResult, hResult)); }\n            else\n            {\n                HASWVertex* pVertices = reinterpret_cast<HASWVertex*>(pVerticesVoid);\n\n                const bool  flip   = ((RenderState.DistortionCaps & ovrDistortionCap_FlipInput) != 0);\n                const float left   = -1.0f;\n                const float top    = -1.1f;\n                const float right  = +1.0f;\n                const float bottom = +0.9f;\n\n                // See warning in LoadTextureTgaData() about this TGA being loaded \"upside down\", i.e. UV origin is at bottom-left.\n                pVertices[0] = HASWVertex(left,  top,    0.f, Color(255, 255, 255, 255), 0.f, flip ? 1.f : 0.f); // To do: Make this branchless \n                pVertices[1] = HASWVertex(left,  bottom, 0.f, Color(255, 255, 255, 255), 0.f, flip ? 0.f : 1.f);\n                pVertices[2] = HASWVertex(right, top,    0.f, Color(255, 255, 255, 255), 1.f, flip ? 1.f : 0.f); \n                pVertices[3] = HASWVertex(right, bottom, 0.f, Color(255, 255, 255, 255), 1.f, flip ? 0.f : 1.f);\n\n                pVB->Unlock();\n            }\n        }\n    }\n}\n\n\nvoid HSWDisplay::RenderInternal(ovrEyeType eye, const ovrTexture* eyeTexture)\n{\n    if(RenderEnabled && eyeTexture)\n    {\n        // Note: The D3D9 implementation below is entirely fixed-function and isn't yet using shaders.\n        // For the time being this is sufficient, but future designs will likely necessitate moving\n        // to a system that uses programmable shaders.\n\n        // We need to render to the eyeTexture with the texture viewport.\n        // Setup rendering to the texture.\n        ovrD3D9Texture* eyeTextureD3D9 = const_cast<ovrD3D9Texture*>(reinterpret_cast<const ovrD3D9Texture*>(eyeTexture));\n        OVR_ASSERT(eyeTextureD3D9->Texture.Header.API == ovrRenderAPI_D3D9);\n\n\n        // Save previous state.\n        // To do: Merge this saved state with that done by DistortionRenderer::GraphicsState::Save(), and put them in a shared location.\n        DWORD fvfSaved;\n        RenderParams.Device->GetFVF(&fvfSaved);\n\n        Ptr<IDirect3DVertexBuffer9> pVBDSaved;\n        UINT vbOffsetSaved;\n        UINT vbStrideSaved;\n        RenderParams.Device->GetStreamSource(0, &pVBDSaved.GetRawRef(), &vbOffsetSaved, &vbStrideSaved);\n\n        Ptr<IDirect3DBaseTexture9> pTexture0Saved;\n        RenderParams.Device->GetTexture(0, &pTexture0Saved.GetRawRef());\n        Ptr<IDirect3DBaseTexture9> pTexture1Saved;\n        RenderParams.Device->GetTexture(1, &pTexture1Saved.GetRawRef());\n\n        D3DMATRIX worldMatrixSaved, viewMatrixSaved, projectionMatrixSaved, texture0MatrixSaved;\n        RenderParams.Device->GetTransform(D3DTS_WORLD, &worldMatrixSaved);\n        RenderParams.Device->GetTransform(D3DTS_VIEW, &viewMatrixSaved);\n        RenderParams.Device->GetTransform(D3DTS_PROJECTION, &projectionMatrixSaved);\n        RenderParams.Device->GetTransform(D3DTS_TEXTURE0, &texture0MatrixSaved);\n\n        Ptr<IDirect3DVertexShader9> pVertexShaderSaved;\n        RenderParams.Device->GetVertexShader(&pVertexShaderSaved.GetRawRef());\n\n        Ptr<IDirect3DPixelShader9> pPixelShaderSaved;\n        RenderParams.Device->GetPixelShader(&pPixelShaderSaved.GetRawRef());\n\n        D3DVIEWPORT9 viewportSaved;\n        RenderParams.Device->GetViewport(&viewportSaved);\n\n        Ptr<IDirect3DSurface9> pRenderTargetSaved;\n        RenderParams.Device->GetRenderTarget(0, &pRenderTargetSaved.GetRawRef());\n\n\n        // Load the graphics if not loaded already.\n        if(!pTexture)\n            LoadGraphics();\n\n        // Calculate ortho projection.\n        GetOrthoProjection(RenderState, OrthoProjection);\n\n        HRESULT hResult = RenderParams.Device->BeginScene();\n        if(FAILED(hResult))\n            { HSWDISPLAY_LOG((\"[HSWDisplay D3D9] BeginScene failed. %d (%x)\", hResult, hResult)); }\n\n        Ptr<IDirect3DSurface9> pDestSurface;\n        hResult = eyeTextureD3D9->D3D9.pTexture->GetSurfaceLevel(0, &pDestSurface.GetRawRef());\n        if(FAILED(hResult))\n            { HSWDISPLAY_LOG((\"[HSWDisplay D3D9] GetSurfaceLevel failed. %d (%x)\", hResult, hResult)); }\n\n        hResult = RenderParams.Device->SetRenderTarget(0, pDestSurface);\n        if(FAILED(hResult))\n            { HSWDISPLAY_LOG((\"[HSWDisplay D3D9] SetRenderTarget failed. %d (%x)\", hResult, hResult)); }\n\n        D3DVIEWPORT9 D3DViewport;\n        D3DViewport.X        = eyeTextureD3D9->Texture.Header.RenderViewport.Pos.x;\n        D3DViewport.Y        = eyeTextureD3D9->Texture.Header.RenderViewport.Pos.y;    \n        D3DViewport.Width    = eyeTextureD3D9->Texture.Header.RenderViewport.Size.w;\n        D3DViewport.Height   = eyeTextureD3D9->Texture.Header.RenderViewport.Size.h;\n        D3DViewport.MinZ     = 0;\n        D3DViewport.MaxZ     = 1;\n        hResult = RenderParams.Device->SetViewport(&D3DViewport);\n        if(FAILED(hResult))\n            { HSWDISPLAY_LOG((\"[HSWDisplay D3D9] SetViewport failed. %d (%x)\", hResult, hResult)); }\n\n        hResult = RenderParams.Device->SetTexture(0, pTexture);\n        if(FAILED(hResult))\n            { HSWDISPLAY_LOG((\"[HSWDisplay D3D9] SetTexture failed. %d (%x)\", hResult, hResult)); }\n\n        RenderParams.Device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);\n        RenderParams.Device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);\n        RenderParams.Device->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);\n\n        RenderParams.Device->SetVertexShader(NULL);\n        RenderParams.Device->SetPixelShader(NULL);\n\n        hResult = RenderParams.Device->SetStreamSource(0, pVB, 0, sizeof(HASWVertex));\n        if(FAILED(hResult))\n            { HSWDISPLAY_LOG((\"[HSWDisplay D3D9] SetStreamSource failed. %d (%x)\", hResult, hResult)); }\n\n        RenderParams.Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);\n        RenderParams.Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);\n\t\tRenderParams.Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);\n        RenderParams.Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);\n\t\tRenderParams.Device->SetRenderState(D3DRS_LIGHTING, FALSE);\n        RenderParams.Device->SetRenderState(D3DRS_ZENABLE, FALSE);\n        RenderParams.Device->SetRenderState(D3DRS_ZWRITEENABLE, FALSE);\n        RenderParams.Device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);\n        RenderParams.Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);\n        RenderParams.Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);\n\n        const float scale  = HSWDISPLAY_SCALE * ((RenderState.OurHMDInfo.HmdType == HmdType_DK1) ? 0.70f : 1.f);\n        Matrix4f identityMatrix = Matrix4f::Identity();\n        Vector3f translation = OrthoProjection[eye].GetTranslation();\n        Matrix4f orthoStereoMatrix(\n            scale, 0, 0, 0,\n            0, scale / 2, 0, 0,\n            0, 0, HSWDISPLAY_DISTANCE, 0,\n            translation.x, translation.y, translation.z, 1\n            );\n        RenderParams.Device->SetTransform(D3DTS_WORLD,      reinterpret_cast<const D3DMATRIX*>(&identityMatrix));\n        RenderParams.Device->SetTransform(D3DTS_VIEW,       reinterpret_cast<const D3DMATRIX*>(&identityMatrix));\n        RenderParams.Device->SetTransform(D3DTS_PROJECTION, reinterpret_cast<const D3DMATRIX*>(&orthoStereoMatrix));\n        RenderParams.Device->SetTransform(D3DTS_TEXTURE0,   reinterpret_cast<const D3DMATRIX*>(&identityMatrix));\n\n        hResult = RenderParams.Device->SetFVF(HASWVertexD3D9Format);\n        if(FAILED(hResult))\n            { HSWDISPLAY_LOG((\"[HSWDisplay D3D9] SetFVF failed. %d (%x)\", hResult, hResult)); }\n\n        hResult = RenderParams.Device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);\n        if(FAILED(hResult))\n            { HSWDISPLAY_LOG((\"[HSWDisplay D3D9] DrawPrimitive failed. %d (%x)\", hResult, hResult)); }\n\n        hResult = RenderParams.Device->EndScene();\n        if(FAILED(hResult))\n            { HSWDISPLAY_LOG((\"[HSWDisplay D3D9] EndScene failed. %d (%x)\", hResult, hResult)); }\n\n\n        // Restore previous state.\n        RenderParams.Device->SetRenderTarget(0, pRenderTargetSaved);\n        RenderParams.Device->SetViewport(&viewportSaved);\n        RenderParams.Device->SetPixelShader(pPixelShaderSaved);\n        RenderParams.Device->SetVertexShader(pVertexShaderSaved);\n        RenderParams.Device->SetTransform(D3DTS_TEXTURE0, &texture0MatrixSaved);\n        RenderParams.Device->SetTransform(D3DTS_PROJECTION, &projectionMatrixSaved);\n        RenderParams.Device->SetTransform(D3DTS_VIEW, &viewMatrixSaved);\n        RenderParams.Device->SetTransform(D3DTS_WORLD, &worldMatrixSaved);\n        RenderParams.Device->SetTexture(0, pTexture0Saved);\n        RenderParams.Device->SetTexture(1, pTexture1Saved);\n        RenderParams.Device->SetStreamSource(0, pVBDSaved, vbOffsetSaved, vbStrideSaved);\n        RenderParams.Device->SetFVF(fvfSaved);\n    }\n}\n\n\n}}} // namespace OVR::CAPI::D3D9\n\nOVR_RESTORE_MSVC_WARNING()\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D9/CAPI_D3D9_HSWDisplay.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_D3D9_HSWDisplay.h\nContent     :   Implements Health and Safety Warning system.\nCreated     :   July 7, 2014\nAuthors     :   Paul Pedriana\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_D3D9_HSWDisplay_h\n#define OVR_CAPI_D3D9_HSWDisplay_h\n\n#include \"../CAPI_HSWDisplay.h\"\n#include \"Util/Util_Direct3D.h\"\n\nnamespace OVR { namespace CAPI { namespace D3D9 {\n\n    // There currently isn't a D3D9::RenderParams, as D3D9 support is currently only very basic.\n    struct HSWRenderParams\n    {\n\t    IDirect3DDevice9*    Device;\n\t    IDirect3DSwapChain9* SwapChain;\n\t    ovrSizei             ScreenSize; \n    };\n\n    class HSWDisplay : public CAPI::HSWDisplay\n    {\n    public:\n        HSWDisplay(ovrRenderAPIType api, ovrHmd hmd, const HMDRenderState& renderState);\n\n        // Must be called before use. apiConfig is such that:\n        //   const ovrD3D9Config* config = (const ovrD3D9Config*)apiConfig; or\n        bool Initialize(const ovrRenderAPIConfig* apiConfig);\n        void Shutdown();\n        void DisplayInternal();\n        void DismissInternal();\n\n        // Draws the warning to the eye texture(s). This must be done at the end of a \n        // frame but prior to executing the distortion rendering of the eye textures. \n        void RenderInternal(ovrEyeType eye, const ovrTexture* eyeTexture);\n\n    protected:\n        void LoadGraphics();\n        void UnloadGraphics();\n\n        D3D9::HSWRenderParams       RenderParams;\n        Ptr<IDirect3DTexture9>      pTexture;\n        Ptr<IDirect3DVertexBuffer9> pVB;\n        Matrix4f                    OrthoProjection[2];     // Projection for 2D.\n\n    private:\n        OVR_NON_COPYABLE(HSWDisplay)\n    };\n\n}}} // namespace OVR::CAPI::D3D9\n\n\n#endif // OVR_CAPI_D3D9_HSWDisplay_h\n\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/D3D9/CAPI_D3D9_Util.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_D3D11_Util.cpp\nContent     :   D3D9 utility functions for rendering\nCreated     :   March 7 , 2014\nAuthors     :   Tom Heath\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_D3D9_DistortionRenderer.h\"\n#include \"OVR_CAPI_D3D.h\"\n\n\nnamespace OVR { namespace CAPI { namespace D3D9 {\n\n\n#define PRECOMPILE_FLAG 0\n#if !PRECOMPILE_FLAG\n//To make these, you need to run it with PRECOMPILE_FLAG, which also uses them, so good for debugging.\n//Then cut and paste these from the output window.\n//Then turn off the flag.\nDWORD precompiledVertexShaderSrc[96] = {4294836736,3080190,1111577667,28,130,4294836736,2,28,33024,123,68,131074,655361,88,0,104,2,131073,88,0,1415936325,1970230127,1432707954,1717981014,7628147,196609,131073,1,0,1415936325,1970230127,1432707954,1633899350,1979737452,1597136755,1766654000,1936683619,544499311,539578920,1280527432,1634226976,544367972,1886220099,1919249513,841890080,892939833,825437746,2868916529,83886161,2685337601,1065353216,0,1056964608,0,33554463,2147483648,2416902144,33554463,2147614720,2416902145,33554463,2147483653,2416902146,33554463,2147549189,2416902147,33554463,2147614725,2416902148,33554433,2147680256,2699296768,67108868,3758292992,2162425856,2430861314,2699296770,67108868,3758292993,2162425856,2430861315,2699296770,67108868,3758292994,2162425856,2430861316,2699296770,67108868,3222208512,2416181248,2689597441,2686779393,33554433,3758161923,2415919105,65535,};\nDWORD precompiledVertexShaderTimewarpSrc[310] = {4294836992,4587518,1111577667,28,222,4294836992,4,28,33024,215,108,1310722,5373956,124,0,140,262146,1179652,124,0,157,131074,655361,180,0,196,2,131073,180,0,1382381893,1952543855,1164865385,2868929646,196611,262148,1,0,1382381893,1952543855,1399746409,1953653108,1702446336,1867738964,1701016181,1716475477,1952805734,2880154368,196609,131073,1,0,1415936325,1970230127,1432707954,1633899350,1979737452,1597202291,1766654000,1936683619,544499311,539578920,1280527432,1634226976,544367972,1886220099,1919249513,841890080,892939833,825437746,2868916529,83886161,2685337601,1065353216,0,1056964608,0,33554463,2147483648,2416902144,33554463,2147549184,2416902145,33554463,2147614720,2416902146,33554463,2147483653,2416902147,33554463,2147549189,2416902148,33554463,2147614725,2416902149,33554463,2147483648,3759079424,33554463,2147483653,3758292993,33554463,2147549189,3758292994,33554463,2147614725,3758292995,33554463,2147680261,3758161924,33554433,2147549184,2695495684,50331650,2147549185,2164260864,2695495700,33554433,2147614720,2695495685,50331650,2147614721,2169831424,2695495701,33554433,2147745792,2695495686,50331650,2147745793,2175401984,2695495702,33554433,2148007936,2695495687,50331650,2148007937,2180972544,2695495703,67108868,2148466688,2415919105,2162425857,2162425856,67108868,2148466689,2416181251,2689597441,2684682241,50331657,2147549186,2162425856,2162425857,33554438,2147549186,2147483650,33554433,2147680259,2699296772,50331650,2147876866,2177892355,2697986068,67108868,2147549187,2415919105,2158624770,2689925124,67108868,2147549188,2415919105,2153054210,2684354564,33554433,2147680261,2699296773,50331650,2147876866,2177105925,2697199637,67108868,2147614723,2415919105,2153054210,2689925125,67108868,2147614724,2415919105,2158624770,2684354565,33554433,2147680261,2699296774,50331650,2147811333,2177171461,2697265174,67108868,2147745795,2415919105,2147483653,2689925126,67108868,2147745796,2415919105,2158624773,2684354566,33554433,2147680261,2699296775,50331650,2148073477,2166685701,2686779415,67108868,2148007939,2415919105,2147483653,2689925127,67108868,2148007940,2415919105,2164195333,2684354567,50331657,2147549189,2162425860,2162425857,50331657,2147614725,2162425859,2162425857,50331653,2147680257,2147483650,2162425861,33554433,2147680258,2699296768,67108868,3758292993,2162425858,2162425857,2699296770,67108868,2148466689,2416181252,2689597441,2684682241,50331657,2147549189,2162425860,2162425857,50331657,2147614725,2162425859,2162425857,50331657,2147549185,2162425856,2162425857,33554438,2147549185,2147483649,50331653,2147680257,2147483649,2162425861,67108868,3758292994,2162425858,2162425857,2699296770,67108868,2148466689,2416181253,2689597441,2684682241,50331657,2147549188,2162425860,2162425857,50331657,2147614724,2162425859,2162425857,50331657,2147549184,2162425856,2162425857,33554438,2147549184,2147483648,50331653,2147680256,2147483648,2162425860,67108868,3758292995,2162425858,2162425856,2699296770,67108868,3759079424,2416181248,2689597441,2686779393,33554433,3758161924,2415919106,65535,};\nDWORD precompiledPixelShaderSrc[84] = {4294902528,2228222,1111577667,28,79,4294902528,1,28,33024,72,48,3,131073,56,0,1954047316,6648437,786436,65537,1,0,861893488,1291858015,1869767529,1952870259,693250080,1397508128,1750278220,1919247457,1836008224,1701603696,775495794,959330610,858665525,3223857,83886161,2685337600,1065353216,0,0,0,33554463,2147483653,2416115712,33554463,2147549189,2416115713,33554463,2147614725,2416115714,33554463,2147680261,2415984643,33554463,2415919104,2685339648,50331714,2148466688,2430861312,2699298816,67108868,2148073472,2147483648,2690908160,2686779392,50331714,2148466689,2430861313,2699298816,33554433,2147614720,2153054209,50331714,2148466689,2430861314,2699298816,33554433,2147745792,2158624769,50331653,2148468736,2162425856,2415919107,65535,};\n\n#else\n#include \"d3dcompiler.h\"\n#pragma comment(lib, \"C:\\\\Program Files (x86)\\\\Microsoft DirectX SDK (June 2010)\\\\Lib\\\\x86\\\\D3DCompiler.lib\")\n/***************************************************************************/\nconst char* VertexShaderSrc = \n\t\n\t\"float2 EyeToSourceUVScale  : register(c0);                                           \\n\"\n\t\"float2 EyeToSourceUVOffset : register(c2);                                           \\n\"\n\t\n\t\"void main(in float2 Position    : POSITION,    in float  TimeWarp    : POSITION1, \\n\"\n\t\"          in float  Vignette    : POSITION2,   in float2 TexCoord0   : TEXCOORD0, \\n\"\n\t\"          in float2 TexCoord1   : TEXCOORD1,   in float2 TexCoord2   : TEXCOORD2, \\n\"\n\t\"          out float4 oPosition  : SV_Position, out float2 oTexCoord0 : TEXCOORD0, \\n\"\n\t\"          out float2 oTexCoord1 : TEXCOORD1,   out float2 oTexCoord2 : TEXCOORD2, \\n\"\n\t\"          out float oVignette   : TEXCOORD3)                                      \\n\"\n\t\"{                                                                                 \\n\"\n\t\"    oTexCoord0 = EyeToSourceUVScale * TexCoord0 + EyeToSourceUVOffset;                  \\n\"\n\t\"    oTexCoord1 = EyeToSourceUVScale * TexCoord1 + EyeToSourceUVOffset;                  \\n\"\n\t\"    oTexCoord2 = EyeToSourceUVScale * TexCoord2 + EyeToSourceUVOffset;                  \\n\"\n\t\"    oVignette  = Vignette;                                                        \\n\"\n\t\"    oPosition  = float4(Position.xy, 0.5, 1.0);                                   \\n\"\n\t\"}\";\n\n/***************************************************************************/\nconst char* VertexShaderTimewarpSrc = \n\t\n\t\"float2 EyeToSourceUVScale    : register(c0);                                         \\n\"\n\t\"float2 EyeToSourceUVOffset   : register(c2);                                         \\n\"\n\t\"float4x4 EyeRotationStart : register(c4);                                         \\n\"\n\t\"float4x4 EyeRotationEnd   : register(c20);                                        \\n\"\n\t\n\t\"float2 TimewarpTexCoord(float2 TexCoord, float4x4 rotMat)                         \\n\"\n\t\"{                                                                                 \\n\"\n\t\"    float3 transformed = float3( mul ( rotMat, float4(TexCoord.xy, 1, 1) ).xyz);  \\n\"\n\t\"    float2 flattened = (transformed.xy / transformed.z);                          \\n\"\n\t\"    return(EyeToSourceUVScale * flattened + EyeToSourceUVOffset);                       \\n\"\n\t\"}                                                                                 \\n\"\n\t\"void main(in float2 Position    : POSITION,    in float  TimeWarp    : POSITION1, \\n\"\n\t\"          in float  Vignette    : POSITION2,   in float2 TexCoord0   : TEXCOORD0, \\n\"\n\t\"          in float2 TexCoord1   : TEXCOORD1,   in float2 TexCoord2   : TEXCOORD2, \\n\"\n\t\"          out float4 oPosition  : SV_Position, out float2 oTexCoord0 : TEXCOORD0, \\n\"\n\t\"          out float2 oTexCoord1 : TEXCOORD1,   out float2 oTexCoord2 : TEXCOORD2, \\n\"\n\t\"          out float oVignette   : TEXCOORD3)                                      \\n\"\n\t\"{                                                                                 \\n\"\n\t\"    float4x4 lerpedEyeRot = lerp(EyeRotationStart, EyeRotationEnd, TimeWarp);     \\n\"\n\t\"    oTexCoord0  = TimewarpTexCoord(TexCoord0,lerpedEyeRot);                       \\n\"\n\t\"    oTexCoord1  = TimewarpTexCoord(TexCoord1,lerpedEyeRot);                       \\n\"\n\t\"    oTexCoord2  = TimewarpTexCoord(TexCoord2,lerpedEyeRot);                       \\n\"\n\t\"    oVignette  = Vignette;                                                        \\n\"\n\t\"    oPosition  = float4(Position.xy, 0.5, 1.0);                                   \\n\"\n\t\"}\";\n\n/***************************************************************************/\nconst char* PixelShaderSrc =\n\t\n\t\" sampler2D Texture : register(s0);\t\t                                           \\n\"\n\n\t\"float4 main(in float4 oPosition  : SV_Position, in float2 oTexCoord0 : TEXCOORD0, \\n\"\n\t\"            in float2 oTexCoord1 : TEXCOORD1,   in float2 oTexCoord2 : TEXCOORD2, \\n\"\n\t\"            in float  oVignette  : TEXCOORD3) \\n\"\n\t\"          : SV_Target                                                             \\n\" \n\t\"{                                                                                 \\n\"\n    \"\t float R = tex2D(Texture,oTexCoord0).r;\t\t                                   \\n\"\n    \"\t float G = tex2D(Texture,oTexCoord1).g;\t\t                                   \\n\"\n    \"\t float B = tex2D(Texture,oTexCoord2).b;\t\t                                   \\n\"\n\t\"    return (oVignette*float4(R,G,B,1));                                           \\n\"\n\t\"}\";\n\n/*************************************************************/\nID3DBlob* ShaderCompile(char * shaderName, const char * shaderSrcString, const char * profile)\n{\n    ID3DBlob* pShaderCode = NULL;\n    ID3DBlob* pErrorMsg = NULL;\n\n\tif (FAILED(D3DCompile(shaderSrcString, strlen(shaderSrcString),NULL,NULL,NULL,\n\t\t\t\t\t\t  \"main\",profile,D3DCOMPILE_OPTIMIZATION_LEVEL3,0,\n\t\t\t\t\t\t  &pShaderCode,&pErrorMsg)))\t\t\t\t\t\n \t\tMessageBoxA(NULL,(char *) pErrorMsg->GetBufferPointer(),\"\", MB_OK); \n\tif (pErrorMsg) pErrorMsg->Release();\n\n\t//Now write out blob\n\tchar tempString[1000];\n\tint numDWORDs = ((int)pShaderCode->GetBufferSize())/4;\n\tDWORD * ptr = (DWORD *)pShaderCode->GetBufferPointer();\n\tsprintf_s(tempString,\"DWORD %s[%d] = {\",shaderName,numDWORDs);\n\tOutputDebugStringA(tempString);\n\tfor (int i = 0;i < numDWORDs; i++)\n\t{\n\t\tsprintf_s(tempString,\"%lu,\",ptr[i]);\n\t\tOutputDebugStringA(tempString);\n\t}\n\tOutputDebugStringA(\"};\\n\");\n\n\treturn(pShaderCode);\n}\n#endif\n\n/***********************************************************/\nvoid DistortionRenderer::CreateDistortionShaders(void)\n{\n#if PRECOMPILE_FLAG\n\tID3DBlob * pShaderCode;\n\tpShaderCode = ShaderCompile(\"precompiledVertexShaderSrc\",VertexShaderSrc,\"vs_2_0\");\n\tDevice->CreateVertexShader( ( DWORD* )pShaderCode->GetBufferPointer(), &VertexShader );\n    pShaderCode->Release();\n\n\tpShaderCode = ShaderCompile(\"precompiledVertexShaderTimewarpSrc\",VertexShaderTimewarpSrc,\"vs_3_0\");\n\tDevice->CreateVertexShader( ( DWORD* )pShaderCode->GetBufferPointer(), &VertexShaderTimewarp );\n    pShaderCode->Release();\n\n\tpShaderCode = ShaderCompile(\"precompiledPixelShaderSrc\",PixelShaderSrc,\"ps_3_0\");\n\tDevice->CreatePixelShader( ( DWORD* )pShaderCode->GetBufferPointer(), &PixelShader );\n    pShaderCode->Release();\n#else\n\tDevice->CreateVertexShader( precompiledVertexShaderSrc, &VertexShader );\n\tDevice->CreateVertexShader( precompiledVertexShaderTimewarpSrc, &VertexShaderTimewarp );\n\tDevice->CreatePixelShader(  precompiledPixelShaderSrc, &PixelShader );\n#endif\n}\n\n\n/***************************************************/\nvoid DistortionRenderer::CreateVertexDeclaration()\n{\n\tstatic const D3DVERTEXELEMENT9 VertexElements[7] =\t{\n        { 0,  0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },\n        { 0,  8, D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 1 },\n        { 0, 12, D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 2 },\n        { 0, 16, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },\n        { 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1 },\n        { 0, 32, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 2 },\n\t\tD3DDECL_END()\t};\n    Device->CreateVertexDeclaration( VertexElements, &VertexDecl );\n}\n\n\n/******************************************************/\nbool DistortionRenderer::CreateDistortionModels()\n{\n\t//Make the distortion models\n\tfor (int eye=0;eye<2;eye++)\n\t{\t\t\n\t\tFOR_EACH_EYE * e = &eachEye[eye];\n\t\tovrDistortionMesh meshData;\n\n        if (!CalculateDistortionMeshFromFOV(\n            RenderState->RenderInfo,\n            RenderState->Distortion[eye],\n            (RenderState->EyeRenderDesc[eye].Eye == ovrEye_Left ? StereoEye_Left : StereoEye_Right),\n            RenderState->EyeRenderDesc[eye].Fov,\n            RenderState->DistortionCaps,\n            &meshData))\n        {\n            OVR_ASSERT(false);\n            return false;\n        }\n\n\t\te->numVerts = meshData.VertexCount;\n\t\te->numIndices = meshData.IndexCount;\n\n\t\tDevice->CreateVertexBuffer( (e->numVerts)*sizeof(ovrDistortionVertex),0, 0,\n                                    D3DPOOL_MANAGED, &e->dxVerts, NULL );\n\t\tovrDistortionVertex * dxv; \te->dxVerts->Lock( 0, 0, (void**)&dxv, 0 );\n\t\tfor (int v=0;v<e->numVerts;v++) dxv[v] = meshData.pVertexData[v];\n\t\te->dxVerts->Unlock();\n\n\t\tDevice->CreateIndexBuffer( (e->numIndices)*sizeof(u_short),0, D3DFMT_INDEX16,\n                                   D3DPOOL_MANAGED, &e->dxIndices, NULL );\n\t\tunsigned short* dxi; e->dxIndices->Lock( 0, 0, (void**)&dxi, 0 );\n\t\tfor (int i=0;i<e->numIndices;i++) dxi[i] = meshData.pIndexData[i];\n\t\te->dxIndices->Unlock();\n\n\t\tovrHmd_DestroyDistortionMesh( &meshData );\n\t}\n\n    return true;\n}\n\n/**********************************************************/\nvoid DistortionRenderer::RenderBothDistortionMeshes()\n{\n\tDevice->BeginScene();\n\n\tD3DCOLOR clearColor = D3DCOLOR_RGBA(\n\t\t(int)(RenderState->ClearColor[0] * 255.0f),\n\t\t(int)(RenderState->ClearColor[1] * 255.0f),\n\t\t(int)(RenderState->ClearColor[2] * 255.0f),\n\t\t(int)(RenderState->ClearColor[3] * 255.0f));\n\n\tDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_STENCIL | D3DCLEAR_ZBUFFER, clearColor, 0, 0);\n\n    for (int eyeNum = 0; eyeNum < 2; eyeNum++)\n    {\n\t\tFOR_EACH_EYE * e = &eachEye[eyeNum];\n\t\tD3DVIEWPORT9 vp;\n        vp.X=0; vp.Y=0;\n        vp.Width=ScreenSize.w;\tvp.Height=ScreenSize.h;\n        vp.MinZ=0; vp.MaxZ = 1;\n\n\t\tDevice->SetViewport(&vp);\n\t\tDevice->SetStreamSource( 0, e->dxVerts,0, sizeof(ovrDistortionVertex) );\n\t\tDevice->SetVertexDeclaration( VertexDecl ); \n\t\tDevice->SetIndices( e->dxIndices );\n\t\tDevice->SetPixelShader( PixelShader );\n\t\tDevice->SetTexture( 0, e->texture);\n\n\t\t//Choose which vertex shader, with associated additional inputs\n        if (RenderState->DistortionCaps & ovrDistortionCap_TimeWarp)\n\t\t{          \n\t\t\tDevice->SetVertexShader( VertexShaderTimewarp );  \n\n            Matrix4f startEndMatrices[2];\n            double timewarpIMUTime = 0.;\n            CalculateOrientationTimewarpFromSensors(\n                RenderState->EyeRenderPoses[eyeNum].Orientation,\n                SensorReader, Timing->GetTimewarpTiming()->EyeStartEndTimes[eyeNum],\n                startEndMatrices, timewarpIMUTime);\n            Timing->SetTimewarpIMUTime(timewarpIMUTime);\n\n\t\t\t//Need to transpose the matrices\n            startEndMatrices[0].Transpose();\n            startEndMatrices[1].Transpose();\n\n            // Feed identity like matrices in until we get proper timewarp calculation going on\n            Device->SetVertexShaderConstantF(4, (float *)&startEndMatrices[0], 4);\n            Device->SetVertexShaderConstantF(20, (float *)&startEndMatrices[1], 4);\n        }\n\t\telse\n\t\t{\n\t\t\tDevice->SetVertexShader( VertexShader );  \n\t\t}\n\n\t\t//Set up vertex shader constants\n\t\tDevice->SetVertexShaderConstantF( 0, ( FLOAT* )&(e->UVScaleOffset[0]), 1 );\n\t\tDevice->SetVertexShaderConstantF( 2, ( FLOAT* )&(e->UVScaleOffset[1]), 1 );\n\n\t\tDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST,0,0,e->numVerts,0,e->numIndices/3);\n\t}\n\n\tDevice->EndScene();\n}\n\n\n}}} // namespace OVR::CAPI::D3D9\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/GL/CAPI_GL_DistortionRenderer.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_GL_DistortionRenderer.h\nContent     :   Distortion renderer header for GL\nCreated     :   November 11, 2013\nAuthors     :   David Borel, Lee Cooper\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_GL_DistortionRenderer.h\"\n\n#include \"CAPI_GL_DistortionShaders.h\"\n\n#include \"OVR_CAPI_GL.h\"\n#include \"Kernel/OVR_Color.h\"\n\n#if defined(OVR_OS_MAC)\n    #include <CoreGraphics/CGDirectDisplay.h>\n    #include <OpenGL/OpenGL.h>\n#endif\n\nnamespace OVR { namespace CAPI { namespace GL {\n\n\n// Distortion pixel shader lookup.\n//  Bit 0: Orientation Timewarp\n//  Bit 1: Depth-based Timewarp\n\nenum {\n    DistortionVertexShaderBitMask = 3,\n    DistortionVertexShaderCount   = DistortionVertexShaderBitMask + 1,\n    DistortionPixelShaderBitMask  = 0,\n    DistortionPixelShaderCount    = DistortionPixelShaderBitMask + 1\n};\n\nstruct ShaderInfo\n{\n    const char* ShaderData;\n    size_t ShaderSize;\n    const ShaderBase::Uniform* ReflectionData;\n    size_t ReflectionSize;\n};\n\n// Do add a new distortion shader use these macros (with or w/o reflection)\n#define SI_NOREFL(shader) { shader, sizeof(shader), NULL, 0 }\n#define SI_REFL__(shader) { shader, sizeof(shader), shader ## _refl, sizeof( shader ## _refl )/sizeof(*(shader ## _refl)) }\n\n\nstatic ShaderInfo DistortionVertexShaderLookup[DistortionVertexShaderCount] =\n{\n    SI_REFL__(DistortionChroma_vs),\n    { NULL, 0, NULL, 0 },\n    SI_REFL__(DistortionTimewarpChroma_vs),\n    { NULL, 0, NULL, 0 },\n};\n\nstatic ShaderInfo DistortionPixelShaderLookup[DistortionPixelShaderCount] =\n{\n    SI_NOREFL(DistortionChroma_fs)\n};\n\nvoid DistortionShaderBitIndexCheck()\n{\n    OVR_COMPILER_ASSERT(ovrDistortionCap_TimeWarp  == 2);\n}\n\n\n\nstruct DistortionVertex\n{\n    Vector2f ScreenPosNDC;\n    Vector2f TanEyeAnglesR;\n    Vector2f TanEyeAnglesG;\n    Vector2f TanEyeAnglesB;\n    Color    Col;\n};\n\n\n// Vertex type; same format is used for all shapes for simplicity.\n// Shapes are built by adding vertices to Model.\nstruct LatencyVertex\n{\n    Vector3f  Pos;\n    LatencyVertex (const Vector3f& p) : Pos(p) {}\n};\n\n\n//----------------------------------------------------------------------------\n// ***** GL::DistortionRenderer\n\nDistortionRenderer::DistortionRenderer() :\n    LatencyVAO(0),\n    OverdriveFbo(0)\n{\n\tDistortionMeshVAOs[0] = 0;\n\tDistortionMeshVAOs[1] = 0;\n\n    // Initialize render params.\n    memset(&RParams, 0, sizeof(RParams));\n}\n\nDistortionRenderer::~DistortionRenderer()\n{\n    destroy();\n}\n\n// static\nCAPI::DistortionRenderer* DistortionRenderer::Create()\n{\n    InitGLExtensions();\n\n    return new DistortionRenderer;\n}\n\n\nbool DistortionRenderer::initializeRenderer(const ovrRenderAPIConfig* apiConfig)\n{\n    const ovrGLConfig* config = (const ovrGLConfig*)apiConfig;\n\n    if (!config)\n    {\n        // Cleanup\n        pEyeTextures[0].Clear();\n        pEyeTextures[1].Clear();\n        memset(&RParams, 0, sizeof(RParams));\n        return true;\n    }\n\n\tRParams.Multisample = config->OGL.Header.Multisample;\n\tRParams.BackBufferSize      = config->OGL.Header.BackBufferSize;\n#if defined(OVR_OS_WIN32)\n\tRParams.Window      = (config->OGL.Window) ? config->OGL.Window : GetActiveWindow();\n    RParams.DC          = config->OGL.DC;\n#elif defined(OVR_OS_LINUX)\n    if (config->OGL.Disp)\n    {\n        RParams.Disp = config->OGL.Disp;\n    }\n    if (!RParams.Disp)\n    {\n        RParams.Disp = glXGetCurrentDisplay();\n    }\n    if (!RParams.Disp)\n    {\n        OVR_DEBUG_LOG((\"glXGetCurrentDisplay failed.\"));\n        return false;\n    }\n#endif\n\t\n    DistortionMeshVAOs[0] = 0;\n    DistortionMeshVAOs[1] = 0;\n\n    LatencyVAO = 0;\n\n    GL::AutoContext autoGLContext(distortionContext); // Initializes distortionContext if not already, saves the current GL context, binds distortionContext, then at the end of scope re-binds the current GL context.\n\n    pEyeTextures[0] = *new Texture(&RParams, 0, 0);\n    pEyeTextures[1] = *new Texture(&RParams, 0, 0);\n\n    if (!initBuffersAndShaders())\n    {\n        return false;\n    }\n\n    initOverdrive();\n\n    return true;\n}\n\n\nvoid DistortionRenderer::initOverdrive()\n{\n\tif(RenderState->DistortionCaps & ovrDistortionCap_Overdrive)\n\t{\n\t\tLastUsedOverdriveTextureIndex = 0;\n        \n        glGenFramebuffers(1, &OverdriveFbo);\n        \n        GLint internalFormat = (RenderState->DistortionCaps & ovrDistortionCap_SRGB) ? GL_SRGB_ALPHA : GL_RGBA;\n        \n\t\tfor (int i = 0; i < NumOverdriveTextures ; i++)\n\t\t{\n            pOverdriveTextures[i] = *new Texture(&RParams, RParams.BackBufferSize.w, RParams.BackBufferSize.h);\n            \n            glBindTexture(GL_TEXTURE_2D, pOverdriveTextures[i]->TexId);\n            glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, RParams.BackBufferSize.w, RParams.BackBufferSize.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);\n            OVR_ASSERT( glGetError() == GL_NO_ERROR );\n\n            pOverdriveTextures[i]->SetSampleMode(Sample_ClampBorder | Sample_Linear);\n            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);\n            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);\n            OVR_ASSERT(glGetError() == 0);\n\n            // clear the new buffer\n            glBindFramebuffer(GL_FRAMEBUFFER, OverdriveFbo );\n            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, pOverdriveTextures[i]->TexId, 0);\n            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);\n            OVR_ASSERT(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);\n            GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0};\n            glDrawBuffers(OVR_ARRAY_COUNT(drawBuffers), drawBuffers);\n            glClearColor(0,0,0,1);\n            glClear(GL_COLOR_BUFFER_BIT);\n        }\n\n        {\n            OverdriveBackBufferTexture = *new Texture(&RParams, RParams.BackBufferSize.w, RParams.BackBufferSize.h);\n\n            glBindTexture(GL_TEXTURE_2D, OverdriveBackBufferTexture->TexId);\n            glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, RParams.BackBufferSize.w, RParams.BackBufferSize.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);\n            OVR_ASSERT(glGetError() == 0);\n\n            OverdriveBackBufferTexture->SetSampleMode(Sample_ClampBorder | Sample_Linear);\n            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);\n            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);\n            OVR_ASSERT(glGetError() == 0);\n\n            // clear the new buffer\n            glBindFramebuffer(GL_FRAMEBUFFER, OverdriveFbo );\n            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, OverdriveBackBufferTexture->TexId, 0);\n            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);\n            OVR_ASSERT(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);\n            GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0};\n            glDrawBuffers(OVR_ARRAY_COUNT(drawBuffers), drawBuffers);\n            glClearColor(0,0,0,1);\n            glClear(GL_COLOR_BUFFER_BIT);\n        }\n\n        glBindFramebuffer(GL_FRAMEBUFFER, 0);\n\t}\n\telse\n\t{\n\t\tLastUsedOverdriveTextureIndex = -1;\n\t}\n}\n\nvoid DistortionRenderer::SubmitEye(int eyeId, const ovrTexture* eyeTexture)\n{\n\tif (eyeTexture)\n\t{\n        // Doesn't do a lot in here??\n        const ovrGLTexture* tex = (const ovrGLTexture*)eyeTexture;\n\n        // Write in values\n        eachEye[eyeId].texture = tex->OGL.TexId;\n\n        // Its only at this point we discover what the viewport of the texture is.\n\t    // because presumably we allow users to realtime adjust the resolution.\n        eachEye[eyeId].TextureSize    = tex->OGL.Header.TextureSize;\n        eachEye[eyeId].RenderViewport = tex->OGL.Header.RenderViewport;\n\n        const ovrEyeRenderDesc& erd = RenderState->EyeRenderDesc[eyeId];\n    \n        // Modify viewport offset since OpenGL uses bottom left as the origin\n        eachEye[eyeId].RenderViewport.y = eachEye[eyeId].TextureSize.h - eachEye[eyeId].RenderViewport.h - eachEye[eyeId].RenderViewport.y;\n\n        ovrHmd_GetRenderScaleAndOffset( erd.Fov,\n                                        eachEye[eyeId].TextureSize, eachEye[eyeId].RenderViewport,\n                                        eachEye[eyeId].UVScaleOffset );\n\n\t\tif (!(RenderState->DistortionCaps & ovrDistortionCap_FlipInput))\n\t\t{\n\t\t\teachEye[eyeId].UVScaleOffset[0].y = -eachEye[eyeId].UVScaleOffset[0].y;\n\t\t\teachEye[eyeId].UVScaleOffset[1].y = 1.0f - eachEye[eyeId].UVScaleOffset[1].y;\n\t\t}\n\n        pEyeTextures[eyeId]->UpdatePlaceholderTexture(tex->OGL.TexId,\n                                                      tex->OGL.Header.TextureSize);\n\t}\n}\n\nvoid DistortionRenderer::SubmitEyeWithDepth(int eyeId, const ovrTexture* eyeColorTexture, const ovrTexture* eyeDepthTexture)\n{\n    SubmitEye(eyeId, eyeColorTexture);\n\n    OVR_UNUSED(eyeDepthTexture);\n}\n\nvoid DistortionRenderer::renderEndFrame()\n{\n    renderDistortion(pEyeTextures[0], pEyeTextures[1]);\n\n    // TODO: Add rendering context to callback.\n    if(RegisteredPostDistortionCallback)\n       RegisteredPostDistortionCallback(NULL);\n\n    if(LatencyTest2Active)\n    {\n        renderLatencyPixel(LatencyTest2DrawColor);\n    }\n}\n\nvoid DistortionRenderer::EndFrame(uint32_t frameIndex, bool swapBuffers)\n{\n    // OGL does not support frame timing statistics.\n    Timing->CalculateTimewarpTiming(frameIndex);\n\n    Context currContext;\n    currContext.InitFromCurrent();\n#if defined(OVR_OS_MAC)\n    distortionContext.SetSurface( currContext );\n#endif\n\n    // Don't spin if we are explicitly asked not to\n    if ( (RenderState->DistortionCaps & ovrDistortionCap_TimeWarp) &&\n         (RenderState->DistortionCaps & ovrDistortionCap_TimewarpJitDelay) &&\n        !(RenderState->DistortionCaps & ovrDistortionCap_ProfileNoSpinWaits))\n    {\n        if (!Timing->NeedDistortionTimeMeasurement())\n        {\n            // Wait for timewarp distortion if it is time and Gpu idle\n            FlushGpuAndWaitTillTime(Timing->GetTimewarpTiming()->JIT_TimewarpTime);\n\n            distortionContext.Bind();\n            renderEndFrame();\n        }\n        else\n        {\n            // If needed, measure distortion time so that TimeManager can better estimate\n            // latency-reducing time-warp wait timing.\n            WaitUntilGpuIdle();\n            double  distortionStartTime = ovr_GetTimeInSeconds();\n\n            distortionContext.Bind();\n            renderEndFrame();\n\n            WaitUntilGpuIdle();\n            Timing->AddDistortionTimeMeasurement(ovr_GetTimeInSeconds() - distortionStartTime);\n        }\n    }\n    else\n    {\n        distortionContext.Bind();\n        renderEndFrame();\n    }\n\n    if(LatencyTestActive)\n    {\n        renderLatencyQuad(LatencyTestDrawColor);\n    }\n\n    if (swapBuffers)\n    {\n\t\tbool useVsync = ((RenderState->EnabledHmdCaps & ovrHmdCap_NoVSync) == 0);\n        int ourSwapInterval = (useVsync) ? 1 : 0;\n        int originalSwapInterval;\n        \n#if defined(OVR_OS_WIN32)\n        originalSwapInterval = wglGetSwapIntervalEXT();\n        \n        if (ourSwapInterval != originalSwapInterval)\n            wglSwapIntervalEXT(ourSwapInterval);\n\n        HDC dc = (RParams.DC != NULL) ? RParams.DC : GetDC(RParams.Window);\n\t\tBOOL success = SwapBuffers(dc);\n        OVR_ASSERT_AND_UNUSED(success, success);\n\n        if (RParams.DC == NULL)\n            ReleaseDC(RParams.Window, dc);\n        \n#elif defined(OVR_OS_MAC)\n        originalSwapInterval = 0;\n        CGLContextObj context = CGLGetCurrentContext();\n        CGLError err = CGLGetParameter(context, kCGLCPSwapInterval, &originalSwapInterval);\n        OVR_ASSERT_AND_UNUSED(err == kCGLNoError, err);\n        \n        if (ourSwapInterval != originalSwapInterval)\n            CGLSetParameter(context, kCGLCPSwapInterval, &ourSwapInterval);\n        \n        CGLFlushDrawable(context);\n        \n#elif defined(OVR_OS_LINUX)\n        originalSwapInterval = 0;\n        GLXDrawable drawable = glXGetCurrentDrawable();\n        struct _XDisplay* x11Display = RParams.Disp;\n\n        if(GLE_GLX_EXT_swap_control)\n        {\n            static_assert(sizeof(GLuint) == sizeof(originalSwapInterval), \"size mismatch\");\n            glXQueryDrawable(x11Display, drawable, GLX_SWAP_INTERVAL_EXT, (GLuint*)&originalSwapInterval);\n\n            if (ourSwapInterval != originalSwapInterval)\n                glXSwapIntervalEXT(x11Display, drawable, ourSwapInterval);\n        }\n        else if (GLE_MESA_swap_control) // There is also GLX_SGI_swap_control\n        {\n            originalSwapInterval = glXGetSwapIntervalMESA();\n\n            if (ourSwapInterval != originalSwapInterval)\n                glXSwapIntervalMESA(ourSwapInterval);\n        }\n\n        glXSwapBuffers(x11Display, drawable);\n#endif\n\n        // Force GPU to flush the scene, resulting in the lowest possible latency.\n        // It's critical that this flush is *after* present, because it results in the wait\n        // below completing after the vsync.\n        // With the display driver (direct mode) this flush is obsolete and theoretically\n        // should be a no-op and so doesn't need to be done if running in direct mode.\n        if (RenderState->OurHMDInfo.InCompatibilityMode &&\n            !(RenderState->DistortionCaps & ovrDistortionCap_ProfileNoSpinWaits))\n        {\n            WaitUntilGpuIdle();\n        }\n\n        // Restore the original swap interval if we changed it above.\n        if (originalSwapInterval != ourSwapInterval)\n        {\n#if defined(OVR_OS_WIN32)\n            wglSwapIntervalEXT(originalSwapInterval);\n#elif defined(OVR_OS_MAC)\n            CGLSetParameter(context, kCGLCPSwapInterval, &originalSwapInterval);\n#elif defined(OVR_OS_LINUX)\n            if(GLE_GLX_EXT_swap_control)\n                glXSwapIntervalEXT(x11Display, drawable, (GLuint)originalSwapInterval);\n            else if(GLE_MESA_swap_control)\n                glXSwapIntervalMESA(originalSwapInterval);\n#endif\n        }\n    }\n\n    currContext.Bind();\n}\n\nvoid DistortionRenderer::WaitUntilGpuIdle()\n{\n\tglFinish(); // Block until current OpenGL commands (including swap) are complete.\n}\n\ndouble DistortionRenderer::FlushGpuAndWaitTillTime(double absTime)\n{\n    // because glFlush() is not strict enough certain GL drivers\n    // we do a glFinish(), but before doing so, we make sure we're not\n    // running late\n    double initialTime = ovr_GetTimeInSeconds();\n    if (initialTime >= absTime)\n        return 0.0;\n\n    glFinish();\n\n    return WaitTillTime(absTime);\n}\n\nbool DistortionRenderer::initBuffersAndShaders()\n{\n    for ( int eyeNum = 0; eyeNum < 2; eyeNum++ )\n    {\n        // Allocate & generate distortion mesh vertices.\n        ovrDistortionMesh meshData;\n\n        if (!CalculateDistortionMeshFromFOV(RenderState->RenderInfo,\n                                    RenderState->Distortion[eyeNum],\n                                    (RenderState->EyeRenderDesc[eyeNum].Eye == ovrEye_Left ? StereoEye_Left : StereoEye_Right),\n                                    RenderState->EyeRenderDesc[eyeNum].Fov,\n                                    RenderState->DistortionCaps,\n                                    &meshData))\n        {\n            OVR_ASSERT(false);\n            return false;\n        }\n\n        // Now parse the vertex data and create a render ready vertex buffer from it\n        DistortionVertex *   pVBVerts    = (DistortionVertex*)OVR_ALLOC ( sizeof(DistortionVertex) * meshData.VertexCount );\n        DistortionVertex *   pCurVBVert  = pVBVerts;\n        ovrDistortionVertex* pCurOvrVert = meshData.pVertexData;\n\n        for ( unsigned vertNum = 0; vertNum < meshData.VertexCount; vertNum++ )\n        {\n            pCurVBVert->ScreenPosNDC.x = pCurOvrVert->ScreenPosNDC.x;\n            pCurVBVert->ScreenPosNDC.y = pCurOvrVert->ScreenPosNDC.y;\n\n            // Previous code here did this: pCurVBVert->TanEyeAnglesR = (*(Vector2f*)&pCurOvrVert->TanEyeAnglesR); However that's an usafe\n            // cast of unrelated types which can result in undefined behavior by a conforming compiler. A safe equivalent is simply memcpy.\n            static_assert(sizeof(OVR::Vector2f) == sizeof(ovrVector2f), \"Mismatch of structs that are presumed binary equivalents.\");\n            memcpy(&pCurVBVert->TanEyeAnglesR, &pCurOvrVert->TanEyeAnglesR, sizeof(pCurVBVert->TanEyeAnglesR));\n            memcpy(&pCurVBVert->TanEyeAnglesG, &pCurOvrVert->TanEyeAnglesG, sizeof(pCurVBVert->TanEyeAnglesG));\n            memcpy(&pCurVBVert->TanEyeAnglesB, &pCurOvrVert->TanEyeAnglesB, sizeof(pCurVBVert->TanEyeAnglesB));\n\n            // Convert [0.0f,1.0f] to [0,255]\n\t\t\tif (RenderState->DistortionCaps & ovrDistortionCap_Vignette)\n            {\n                if(RenderState->DistortionCaps & ovrDistortionCap_SRGB)\n                    pCurOvrVert->VignetteFactor = pow(pCurOvrVert->VignetteFactor, 2.1f);\n\n                pCurVBVert->Col.R = (uint8_t)( Alg::Max ( pCurOvrVert->VignetteFactor, 0.0f ) * 255.99f );\n            }\n\t\t\telse\n\t\t\t\tpCurVBVert->Col.R = 255;\n\n            pCurVBVert->Col.G = pCurVBVert->Col.R;\n            pCurVBVert->Col.B = pCurVBVert->Col.R;\n            pCurVBVert->Col.A = (uint8_t)( pCurOvrVert->TimeWarpFactor * 255.99f );;\n            pCurOvrVert++;\n            pCurVBVert++;\n        }\n\n        DistortionMeshVBs[eyeNum] = *new Buffer(&RParams);\n        DistortionMeshVBs[eyeNum]->Data ( Buffer_Vertex | Buffer_ReadOnly, pVBVerts, sizeof(DistortionVertex) * meshData.VertexCount );\n        DistortionMeshIBs[eyeNum] = *new Buffer(&RParams);\n        DistortionMeshIBs[eyeNum]->Data ( Buffer_Index | Buffer_ReadOnly, meshData.pIndexData, ( sizeof(int16_t) * meshData.IndexCount ) );\n\n        OVR_FREE ( pVBVerts );\n        ovrHmd_DestroyDistortionMesh( &meshData );\n    }\n\n    initShaders();\n\n    return true;\n}\n\nvoid DistortionRenderer::renderDistortion(Texture* leftEyeTexture, Texture* rightEyeTexture)\n{\n    bool overdriveActive = IsOverdriveActive();\n    int currOverdriveTextureIndex = -1;\n\n    if(overdriveActive)\n    {\n        currOverdriveTextureIndex = (LastUsedOverdriveTextureIndex + 1) % NumOverdriveTextures;\n\n        //glBindFramebuffer(GL_FRAMEBUFFER, 0);\n        glBindFramebuffer(GL_FRAMEBUFFER, OverdriveFbo );\n        \n        GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};\n        glDrawBuffers(OVR_ARRAY_COUNT(drawBuffers), drawBuffers);\n\n        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, pOverdriveTextures[currOverdriveTextureIndex]->TexId, 0);\n        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, OverdriveBackBufferTexture->TexId, 0);\n        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);\n        OVR_ASSERT(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);\n    }\n    else\n    {\n        glBindFramebuffer(GL_FRAMEBUFFER, 0);\n    }\n\n    setViewport( Recti(0,0, RParams.BackBufferSize.w, RParams.BackBufferSize.h) );\n\n\tif (RenderState->DistortionCaps & ovrDistortionCap_SRGB)\n\t\tglEnable(GL_FRAMEBUFFER_SRGB);\n    else\n        glDisable(GL_FRAMEBUFFER_SRGB);\n\n\tglDisable(GL_CULL_FACE);\n\tglDisable(GL_DEPTH_TEST);\n    \n    if (GLE_EXT_draw_buffers2)\n    {\n        glDisablei(GL_BLEND, 0);\n        glColorMaski(0, GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);\n    }\n    else\n    {\n        glDisable(GL_BLEND);\n        glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);\n    }\n    \n    glDisable(GL_DITHER);\n    glDisable(GL_RASTERIZER_DISCARD);\n    if (GLEContext::GetCurrentContext()->WholeVersion >= 302)\n    {\n        glDisable(GL_SAMPLE_MASK);\n    }\n        \n\tglClearColor(\n\t\tRenderState->ClearColor[0],\n\t\tRenderState->ClearColor[1],\n\t\tRenderState->ClearColor[2],\n\t\tRenderState->ClearColor[3] );\n\n    glClear(GL_COLOR_BUFFER_BIT);\n\n    for (int eyeNum = 0; eyeNum < 2; eyeNum++)\n    {\n\t\tShaderFill distortionShaderFill(DistortionShader);\n        distortionShaderFill.SetTexture(0, eyeNum == 0 ? leftEyeTexture : rightEyeTexture);\n\n        if(overdriveActive)\n        {\n            distortionShaderFill.SetTexture(1, pOverdriveTextures[LastUsedOverdriveTextureIndex]);\n\n            float overdriveScaleRegularRise;\n            float overdriveScaleRegularFall;\n            GetOverdriveScales(overdriveScaleRegularRise, overdriveScaleRegularFall);\n            DistortionShader->SetUniform3f(\"OverdriveScales_IsSrgb\", overdriveScaleRegularRise, overdriveScaleRegularFall,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(RenderState->DistortionCaps & ovrDistortionCap_SRGB) ? 1.0f : -1.0f);\n        }\n        else\n        {\n            // -1.0f disables PLO            \n            DistortionShader->SetUniform3f(\"OverdriveScales_IsSrgb\", -1.0f, -1.0f, -1.0f);\n        }\n\n\t\tDistortionShader->SetUniform2f(\"EyeToSourceUVScale\",  eachEye[eyeNum].UVScaleOffset[0].x, eachEye[eyeNum].UVScaleOffset[0].y);\n\t\tDistortionShader->SetUniform2f(\"EyeToSourceUVOffset\", eachEye[eyeNum].UVScaleOffset[1].x, eachEye[eyeNum].UVScaleOffset[1].y);\n        \n        if (RenderState->DistortionCaps & ovrDistortionCap_TimeWarp)\n\t\t{                       \n            Matrix4f startEndMatrices[2];\n            double timewarpIMUTime = 0.;\n            CalculateOrientationTimewarpFromSensors(\n                RenderState->EyeRenderPoses[eyeNum].Orientation,\n                SensorReader, Timing->GetTimewarpTiming()->EyeStartEndTimes[eyeNum],\n                startEndMatrices, timewarpIMUTime);\n            Timing->SetTimewarpIMUTime(timewarpIMUTime);\n\n            // Feed identity like matrices in until we get proper timewarp calculation going on\n            DistortionShader->SetUniform4x4f(\"EyeRotationStart\", startEndMatrices[0].Transposed());\n            DistortionShader->SetUniform4x4f(\"EyeRotationEnd\", startEndMatrices[1].Transposed());\n\n            renderPrimitives(&distortionShaderFill, DistortionMeshVBs[eyeNum], DistortionMeshIBs[eyeNum],\n                            0, (int)DistortionMeshIBs[eyeNum]->GetSize()/2, Prim_Triangles, &DistortionMeshVAOs[eyeNum], true);\n\t\t}\n        else\n        {\n            renderPrimitives(&distortionShaderFill, DistortionMeshVBs[eyeNum], DistortionMeshIBs[eyeNum],\n                            0, (int)DistortionMeshIBs[eyeNum]->GetSize()/2, Prim_Triangles, &DistortionMeshVAOs[eyeNum], true);\n        }\n    }\n\n    LastUsedOverdriveTextureIndex = currOverdriveTextureIndex;\n\n    // Re-activate to only draw on back buffer\n    if(overdriveActive)\n    {\n        GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0};\n        glDrawBuffers(OVR_ARRAY_COUNT(drawBuffers), drawBuffers);\n\n        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);\n        //glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);\n        //glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, 0, 0);\n        OVR_ASSERT(glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);\n\n        glBindFramebuffer( GL_READ_FRAMEBUFFER, OverdriveFbo );\n        glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, OverdriveBackBufferTexture->TexId, 0);\n        glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);\n        OVR_ASSERT(glCheckFramebufferStatus(GL_READ_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);\n\n        glBlitFramebuffer( 0, 0, OverdriveBackBufferTexture->GetWidth(), OverdriveBackBufferTexture->GetHeight(),\n                           0, 0, OverdriveBackBufferTexture->GetWidth(), OverdriveBackBufferTexture->GetHeight(),\n                           GL_COLOR_BUFFER_BIT, GL_NEAREST );\n\n        glBindFramebuffer( GL_FRAMEBUFFER, 0 );\n        GLint err = glGetError();\n        OVR_ASSERT(!err); OVR_UNUSED(err);\n    }\n}\n\n\nvoid DistortionRenderer::createDrawQuad()\n{\n    const int numQuadVerts = 4;\n    LatencyTesterQuadVB = *new Buffer(&RParams);\n    if(!LatencyTesterQuadVB)\n    {\n        return;\n    }\n\n    LatencyTesterQuadVB->Data(Buffer_Vertex, NULL, numQuadVerts * sizeof(LatencyVertex));\n    LatencyVertex* vertices = (LatencyVertex*)LatencyTesterQuadVB->Map(0, numQuadVerts * sizeof(LatencyVertex), Map_Discard);\n    if(!vertices)\n    {\n        OVR_ASSERT(false); // failed to lock vertex buffer\n        return;\n    }\n\n    const float left   = -1.0f;\n    const float top    = -1.0f;\n    const float right  =  1.0f;\n    const float bottom =  1.0f;\n\n    vertices[0] = LatencyVertex(Vector3f(left,  top,    0.0f));\n    vertices[1] = LatencyVertex(Vector3f(left,  bottom, 0.0f));\n    vertices[2] = LatencyVertex(Vector3f(right, top,    0.0f));\n    vertices[3] = LatencyVertex(Vector3f(right, bottom, 0.0f));\n\n    LatencyTesterQuadVB->Unmap(vertices);\n}\n\nvoid DistortionRenderer::renderLatencyQuad(unsigned char* latencyTesterDrawColor)\n{\n    const int numQuadVerts = 4;\n\n    if(!LatencyTesterQuadVB)\n    {\n        createDrawQuad();\n    }\n       \n    Ptr<ShaderSet> quadShader = (RenderState->DistortionCaps & ovrDistortionCap_SRGB) ? SimpleQuadGammaShader : SimpleQuadShader;\n    ShaderFill quadFill(quadShader);\n    //quadFill.SetInputLayout(SimpleQuadVertexIL);\n\n    setViewport(Recti(0,0, RParams.BackBufferSize.w, RParams.BackBufferSize.h));\n\n    quadShader->SetUniform2f(\"Scale\", 0.3f, 0.3f);\n    quadShader->SetUniform4f(\"Color\", (float)latencyTesterDrawColor[0] / 255.99f,\n                                      (float)latencyTesterDrawColor[0] / 255.99f,\n                                      (float)latencyTesterDrawColor[0] / 255.99f,\n                                      1.0f);\n\n    for(int eyeNum = 0; eyeNum < 2; eyeNum++)\n    {\n        quadShader->SetUniform2f(\"PositionOffset\", eyeNum == 0 ? -0.5f : 0.5f, 0.0f);    \n        renderPrimitives(&quadFill, LatencyTesterQuadVB, NULL, 0, numQuadVerts, Prim_TriangleStrip, &LatencyVAO, false);\n    }\n}\n\nvoid DistortionRenderer::renderLatencyPixel(unsigned char* latencyTesterPixelColor)\n{\n    const int numQuadVerts = 4;\n\n    if(!LatencyTesterQuadVB)\n    {\n        createDrawQuad();\n    }\n\n    Ptr<ShaderSet> quadShader = (RenderState->DistortionCaps & ovrDistortionCap_SRGB) ? SimpleQuadGammaShader : SimpleQuadShader;\n    ShaderFill quadFill(quadShader);\n\n    setViewport(Recti(0,0, RParams.BackBufferSize.w, RParams.BackBufferSize.h));\n\n#ifdef OVR_BUILD_DEBUG\n    quadShader->SetUniform4f(\"Color\", (float)latencyTesterPixelColor[0] / 255.99f,\n                                      (float)latencyTesterPixelColor[1] / 255.99f,\n                                      (float)latencyTesterPixelColor[2] / 255.99f,\n                                      1.0f);\n\n    Vector2f scale(20.0f / RParams.BackBufferSize.w, 20.0f / RParams.BackBufferSize.h); \n#else\n    quadShader->SetUniform4f(\"Color\", (float)latencyTesterPixelColor[0] / 255.99f,\n                                      (float)latencyTesterPixelColor[0] / 255.99f,\n                                      (float)latencyTesterPixelColor[0] / 255.99f,\n                                      1.0f);\n\n    Vector2f scale(1.0f / RParams.BackBufferSize.w, 1.0f / RParams.BackBufferSize.h); \n#endif\n    quadShader->SetUniform2f(\"Scale\", scale.x, scale.y);\n\n    float xOffset = RenderState->RenderInfo.OffsetLatencyTester ? -0.5f * scale.x : 1.0f - scale.x;\n    float yOffset = 1.0f - scale.y;\n\n    // Render the latency tester quad in the correct location.\n    if (RenderState->RenderInfo.Rotation == 270)\n    {\n        xOffset = -xOffset;\n    }\n    else if (RenderState->RenderInfo.Rotation == 180)\n    {\n        xOffset = -xOffset;\n        yOffset = -yOffset;\n    }\n    else if (RenderState->RenderInfo.Rotation == 90)\n    {\n        yOffset = -yOffset;\n    }\n\n    quadShader->SetUniform2f(\"PositionOffset\", xOffset, yOffset);\n\n    renderPrimitives(&quadFill, LatencyTesterQuadVB, NULL, 0, numQuadVerts, Prim_TriangleStrip, &LatencyVAO, false);\n}\n\nvoid DistortionRenderer::renderPrimitives(\n                          const ShaderFill* fill,\n                          Buffer* vertices, Buffer* indices,\n                          int offset, int count,\n                          PrimitiveType rprim, GLuint* vao, bool isDistortionMesh)\n{\n    GLenum prim;\n    switch (rprim)\n    {\n    case Prim_Triangles:\n        prim = GL_TRIANGLES;\n        break;\n    case Prim_Lines:\n        prim = GL_LINES;\n        break;\n    case Prim_TriangleStrip:\n        prim = GL_TRIANGLE_STRIP;\n        break;\n    default:\n        OVR_ASSERT(false);\n        return;\n    }\n\n    fill->Set();\n    \n    GLuint prog = fill->GetShaders()->Prog;\n\n\tif (vao != NULL)\n\t{\n\t\tif (*vao != 0)\n\t\t{\n            glBindVertexArray(*vao);\n\n\t\t\tif (isDistortionMesh)\n\t\t\t\tglDrawElements(prim, count, GL_UNSIGNED_SHORT, NULL);\n\t\t\telse\n\t\t\t\tglDrawArrays(prim, 0, count);\n\n            glBindVertexArray(0);\n\t\t}\n\t\telse\n\t\t{\n            if (GL_ARB_vertex_array_object)\n            {\n                glGenVertexArrays(1, vao);\n                glBindVertexArray(*vao);\n            }\n\n\t\t\tint attributeCount = (isDistortionMesh) ? 5 : 1;\n\t\t\tint* locs = new int[attributeCount];\n\n\t\t\tglBindBuffer(GL_ARRAY_BUFFER, ((Buffer*)vertices)->GLBuffer);\n\n\t\t\tif (isDistortionMesh)\n\t\t\t{\n\t\t\t\tglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ((Buffer*)indices)->GLBuffer);\n\n\t\t\t\tlocs[0] = glGetAttribLocation(prog, \"Position\");\n\t\t\t\tlocs[1] = glGetAttribLocation(prog, \"Color\");\n\t\t\t\tlocs[2] = glGetAttribLocation(prog, \"TexCoord0\");\n\t\t\t\tlocs[3] = glGetAttribLocation(prog, \"TexCoord1\");\n\t\t\t\tlocs[4] = glGetAttribLocation(prog, \"TexCoord2\");\n\n\t\t\t\tglVertexAttribPointer(locs[0], 2, GL_FLOAT, false, sizeof(DistortionVertex), reinterpret_cast<char*>(offset)+offsetof(DistortionVertex, ScreenPosNDC));\n\t\t\t\tglVertexAttribPointer(locs[1], 4, GL_UNSIGNED_BYTE, true, sizeof(DistortionVertex), reinterpret_cast<char*>(offset)+offsetof(DistortionVertex, Col));\n\t\t\t\tglVertexAttribPointer(locs[2], 2, GL_FLOAT, false, sizeof(DistortionVertex), reinterpret_cast<char*>(offset)+offsetof(DistortionVertex, TanEyeAnglesR));\n\t\t\t\tglVertexAttribPointer(locs[3], 2, GL_FLOAT, false, sizeof(DistortionVertex), reinterpret_cast<char*>(offset)+offsetof(DistortionVertex, TanEyeAnglesG));\n\t\t\t\tglVertexAttribPointer(locs[4], 2, GL_FLOAT, false, sizeof(DistortionVertex), reinterpret_cast<char*>(offset)+offsetof(DistortionVertex, TanEyeAnglesB));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tlocs[0] = glGetAttribLocation(prog, \"Position\");\n\n\t\t\t\tglVertexAttribPointer(locs[0], 3, GL_FLOAT, false, sizeof(LatencyVertex), reinterpret_cast<char*>(offset)+offsetof(LatencyVertex, Pos));\n\t\t\t}\n\n            for (int i = 0; i < attributeCount; ++i)\n                glEnableVertexAttribArray(locs[i]);\n            \n\t\t\tif (isDistortionMesh)\n\t\t\t\tglDrawElements(prim, count, GL_UNSIGNED_SHORT, NULL);\n\t\t\telse\n\t\t\t\tglDrawArrays(prim, 0, count);\n\n\n            if (!GL_ARB_vertex_array_object)\n            {\n\t\t\t\tfor (int i = 0; i < attributeCount; ++i)\n                    glDisableVertexAttribArray(locs[i]);\n            }\n\n\t\t\tdelete[] locs;\n\n            if (GL_ARB_vertex_array_object)\n            {\n                glBindVertexArray(0);\n            }\n\t\t}\n\t}\n}\n\nvoid DistortionRenderer::setViewport(const Recti& vp)\n{\n    glViewport(vp.x, vp.y, vp.w, vp.h);\n}\n\n\nvoid DistortionRenderer::initShaders()\n{\n    const char* shaderPrefix = (GLEContext::GetCurrentContext()->WholeVersion >= 302) ? glsl3Prefix : glsl2Prefix;\n\n    {\n\t\tShaderInfo vsInfo = DistortionVertexShaderLookup[DistortionVertexShaderBitMask & RenderState->DistortionCaps];\n        if(vsInfo.ShaderData != NULL)\n        {\n            size_t vsSize = strlen(shaderPrefix)+vsInfo.ShaderSize;\n            char* vsSource = new char[vsSize];\n            OVR_strcpy(vsSource, vsSize, shaderPrefix);\n            OVR_strcat(vsSource, vsSize, vsInfo.ShaderData);\n\n            Ptr<GL::VertexShader> vs = *new GL::VertexShader(\n                &RParams,\n                (void*)vsSource, vsSize,\n                vsInfo.ReflectionData, vsInfo.ReflectionSize);\n\n            DistortionShader = *new ShaderSet;\n            DistortionShader->SetShader(vs);\n\n            delete[](vsSource);\n        }\n        else\n        {\n            OVR_ASSERT_M(false, \"Unsupported distortion feature used\\n\");\n        }\n\n\t\tShaderInfo psInfo = DistortionPixelShaderLookup[DistortionPixelShaderBitMask & RenderState->DistortionCaps];\n        if(psInfo.ShaderData != NULL)\n        {\n            size_t psSize = strlen(shaderPrefix)+psInfo.ShaderSize;\n            char* psSource = new char[psSize];\n            OVR_strcpy(psSource, psSize, shaderPrefix);\n            OVR_strcat(psSource, psSize, psInfo.ShaderData);\n\n            Ptr<GL::FragmentShader> ps  = *new GL::FragmentShader(\n                &RParams,\n                (void*)psSource, psSize,\n                psInfo.ReflectionData, psInfo.ReflectionSize);\n\n            DistortionShader->SetShader(ps);\n\n            delete[](psSource);\n        }\n        else\n        {\n            OVR_ASSERT_M(false, \"Unsupported distortion feature used\\n\");\n        }\n    }\n\t{\n\t\tsize_t vsSize = strlen(shaderPrefix)+sizeof(SimpleQuad_vs);\n\t\tchar* vsSource = new char[vsSize];\n\t\tOVR_strcpy(vsSource, vsSize, shaderPrefix);\n\t\tOVR_strcat(vsSource, vsSize, SimpleQuad_vs);\n\n        Ptr<GL::VertexShader> vs = *new GL::VertexShader(\n            &RParams,\n            (void*)vsSource, vsSize,\n\t\t\tSimpleQuad_vs_refl, sizeof(SimpleQuad_vs_refl) / sizeof(SimpleQuad_vs_refl[0]));\n\n        SimpleQuadShader = *new ShaderSet;\n\t\tSimpleQuadShader->SetShader(vs);\n\n\t\tdelete[](vsSource);\n\n\t\tsize_t psSize = strlen(shaderPrefix)+sizeof(SimpleQuad_fs);\n\t\tchar* psSource = new char[psSize];\n\t\tOVR_strcpy(psSource, psSize, shaderPrefix);\n\t\tOVR_strcat(psSource, psSize, SimpleQuad_fs);\n\n        Ptr<GL::FragmentShader> ps  = *new GL::FragmentShader(\n            &RParams,\n            (void*)psSource, psSize,\n            SimpleQuad_fs_refl, sizeof(SimpleQuad_fs_refl) / sizeof(SimpleQuad_fs_refl[0]));\n\n\t\tSimpleQuadShader->SetShader(ps);\n\n\t\tdelete[](psSource);\n    }\n    {\n        size_t vsSize = strlen(shaderPrefix)+sizeof(SimpleQuad_vs);\n        char* vsSource = new char[vsSize];\n        OVR_strcpy(vsSource, vsSize, shaderPrefix);\n        OVR_strcat(vsSource, vsSize, SimpleQuad_vs);\n\n        Ptr<GL::VertexShader> vs = *new GL::VertexShader(\n            &RParams,\n            (void*)vsSource, vsSize,\n            SimpleQuad_vs_refl, sizeof(SimpleQuad_vs_refl) / sizeof(SimpleQuad_vs_refl[0]));\n\n        SimpleQuadGammaShader = *new ShaderSet;\n        SimpleQuadGammaShader->SetShader(vs);\n\n        delete[](vsSource);\n\n        size_t psSize = strlen(shaderPrefix)+sizeof(SimpleQuadGamma_fs);\n        char* psSource = new char[psSize];\n        OVR_strcpy(psSource, psSize, shaderPrefix);\n        OVR_strcat(psSource, psSize, SimpleQuadGamma_fs);\n\n        Ptr<GL::FragmentShader> ps  = *new GL::FragmentShader(\n            &RParams,\n            (void*)psSource, psSize,\n            SimpleQuadGamma_fs_refl, sizeof(SimpleQuadGamma_fs_refl) / sizeof(SimpleQuadGamma_fs_refl[0]));\n\n        SimpleQuadGammaShader->SetShader(ps);\n\n        delete[](psSource);\n    }\n}\n\n\nvoid DistortionRenderer::destroy()\n{\n    Context currContext;\n    currContext.InitFromCurrent();\n    \n    distortionContext.Bind();\n\n\tfor(int eyeNum = 0; eyeNum < 2; eyeNum++)\n\t{\n        if (GL_ARB_vertex_array_object)\n        {\n            glDeleteVertexArrays(1, &DistortionMeshVAOs[eyeNum]);\n        }\n\n\t\tDistortionMeshVAOs[eyeNum] = 0;\n\n\t\tDistortionMeshVBs[eyeNum].Clear();\n\t\tDistortionMeshIBs[eyeNum].Clear();\n\t}\n\n\tif (DistortionShader)\n    {\n        DistortionShader->UnsetShader(Shader_Vertex);\n\t    DistortionShader->UnsetShader(Shader_Pixel);\n\t    DistortionShader.Clear();\n    }\n\n    LatencyTesterQuadVB.Clear();\n\n    if(LatencyVAO != 0)\n    {\n        glDeleteVertexArrays(1, &LatencyVAO);\n\t    LatencyVAO = 0;\n    }\n\n    if(OverdriveFbo != 0)\n    {\n        glDeleteFramebuffers(1, &OverdriveFbo);\n    }\n\n    currContext.Bind();\n    distortionContext.Destroy();\n    // Who is responsible for destroying the app's context?\n}\n\n\n}}} // OVR::CAPI::GL\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/GL/CAPI_GL_DistortionRenderer.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_GL_DistortionRenderer.h\nContent     :   Distortion renderer header for GL\nCreated     :   November 11, 2013\nAuthors     :   David Borel, Lee Cooper\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_GL_DistortionRenderer_h\n#define OVR_CAPI_GL_DistortionRenderer_h\n\n#include \"../CAPI_DistortionRenderer.h\"\n\n#include \"Kernel/OVR_Log.h\"\n#include \"CAPI_GL_Util.h\"\n\nnamespace OVR { namespace CAPI { namespace GL {\n\n\n// ***** GL::DistortionRenderer\n\n// Implementation of DistortionRenderer for GL.\n\nclass DistortionRenderer : public CAPI::DistortionRenderer\n{\npublic:    \n    DistortionRenderer();\n    virtual ~DistortionRenderer();\n\n    \n    // Creation function for the device.    \n    static CAPI::DistortionRenderer* Create();\n\n\n    // ***** Public DistortionRenderer interface\n\n    virtual void SubmitEye(int eyeId, const ovrTexture* eyeTexture) OVR_OVERRIDE;\n    virtual void SubmitEyeWithDepth(int eyeId, const ovrTexture* eyeColorTexture, const ovrTexture* eyeDepthTexture) OVR_OVERRIDE;\n\n    virtual void EndFrame(uint32_t frameIndex, bool swapBuffers);\n\n    void         WaitUntilGpuIdle();\n\n\t// Similar to ovr_WaitTillTime but it also flushes GPU.\n\t// Note, it exits when time expires, even if GPU is not in idle state yet.\n\tdouble       FlushGpuAndWaitTillTime(double absTime);\n\nprotected:\n\tstruct FOR_EACH_EYE\n\t{\n        FOR_EACH_EYE() : numVerts(0), numIndices(0), texture(0), /*UVScaleOffset[],*/ TextureSize(0, 0), RenderViewport(0, 0, 0, 0) { }\n\n\t\tint                       numVerts;\n\t\tint                       numIndices;\n\n\t\tGLuint                    texture;\n\n\t\tovrVector2f\t\t\t \t  UVScaleOffset[2];\n        Sizei                     TextureSize;\n        Recti                     RenderViewport;\n\t} eachEye[2];\n\n    Ptr<Texture>    pOverdriveTextures[NumOverdriveTextures];\n    Ptr<Texture>    OverdriveBackBufferTexture;\n\n    // GL context and utility variables.\n    RenderParams        RParams;\n    Context             distortionContext;  // We are currently using this private OpenGL context instead of using the CAPI SaveGraphicsState/RestoreGraphicsState mechanism. To consider: Move this Context into SaveGraphicsState/RestoreGraphicState so there's consistency between DirectX and OpenGL.\n\n    virtual bool initializeRenderer(const ovrRenderAPIConfig* apiConfig) OVR_OVERRIDE;\n\n\t// Helpers\n    void initOverdrive();\n    bool initBuffersAndShaders();\n    void initShaders();\n    void initFullscreenQuad();\n    void destroy();\n\t\n    void setViewport(const Recti& vp);\n\n    void renderDistortion(Texture* leftEyeTexture, Texture* rightEyeTexture);\n\n    void renderPrimitives(const ShaderFill* fill, Buffer* vertices, Buffer* indices,\n                          int offset, int count,\n\t\t\t\t\t\t  PrimitiveType rprim, GLuint* vao, bool isDistortionMesh);\n\n\tvoid createDrawQuad();\n    void renderLatencyQuad(unsigned char* latencyTesterDrawColor);\n    void renderLatencyPixel(unsigned char* latencyTesterPixelColor);\n\t\n    void renderEndFrame();\n\n    Ptr<Texture>        pEyeTextures[2];\n\n\tPtr<Buffer>         DistortionMeshVBs[2];    // one per-eye\n\tPtr<Buffer>         DistortionMeshIBs[2];    // one per-eye\n\tGLuint              DistortionMeshVAOs[2];   // one per-eye\n\n\tPtr<ShaderSet>      DistortionShader;\n\n    struct StandardUniformData\n    {\n        Matrix4f  Proj;\n        Matrix4f  View;\n    }                   StdUniforms;\n\t\n\tGLuint              LatencyVAO;\n    Ptr<Buffer>         LatencyTesterQuadVB;\n    Ptr<ShaderSet>      SimpleQuadShader;\n    Ptr<ShaderSet>      SimpleQuadGammaShader;\n\n    GLuint              OverdriveFbo;\n\n\tGLint SavedViewport[4];\n\tGLfloat SavedClearColor[4];\n\tGLint SavedDepthTest;\n\tGLint SavedCullFace;\n\tGLint SavedProgram;\n\tGLint SavedActiveTexture;\n\tGLint SavedBoundTexture;\n\tGLint SavedVertexArray;\n    GLint SavedBoundFrameBuffer;\n};\n\n\n}}} // OVR::CAPI::GL\n\n#endif // OVR_CAPI_GL_DistortionRenderer_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/GL/CAPI_GL_DistortionShaders.h",
    "content": "/************************************************************************************\n \n Filename    :   CAPI_GL_Shaders.h\n Content     :   Distortion shader header for GL\n Created     :   November 11, 2013\n Authors     :   David Borel, Volga Aksoy\n \n Copyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n \n ************************************************************************************/\n\n\n#ifndef OVR_CAPI_GL_Shaders_h\n#define OVR_CAPI_GL_Shaders_h\n\n\n#include \"CAPI_GL_Util.h\"\n\nnamespace OVR { namespace CAPI { namespace GL {\n    \n    static const char glsl2Prefix[] =\n    \"#version 110\\n\"\n    \"#extension GL_ARB_shader_texture_lod : enable\\n\"\n    \"#extension GL_ARB_draw_buffers : enable\\n\"\n    \"#extension GL_EXT_gpu_shader4 : enable\\n\"\n    \"#define _FRAGCOLOR_DECLARATION\\n\"\n    \"#define _MRTFRAGCOLOR0_DECLARATION\\n\"\n    \"#define _MRTFRAGCOLOR1_DECLARATION\\n\"\n    \"#define _GLFRAGCOORD_DECLARATION\\n\"\n    \"#define _VS_IN attribute\\n\"\n    \"#define _VS_OUT varying\\n\"\n    \"#define _FS_IN varying\\n\"\n    \"#define _TEXTURELOD texture2DLod\\n\"\n    \"#define _TEXTURE texture2D\\n\"\n    \"#define _FRAGCOLOR gl_FragColor\\n\"\n    \"#define _MRTFRAGCOLOR0 gl_FragData[0]\\n\"\n    \"#define _MRTFRAGCOLOR1 gl_FragData[1]\\n\"       // The texture coordinate [0.0,1.0] for texel i of a texture of size N is: (2i + 1)/2N\n    \"#ifdef GL_EXT_gpu_shader4\\n\"\n    \"  #define _TEXELFETCHDECL vec4 texelFetch(sampler2D tex, ivec2 coord, int lod){ ivec2 size = textureSize2D(tex, lod); return texture2D(tex, vec2(float((coord.x * 2) + 1) / float(size.x * 2), float((coord.y * 2) + 1) / float(size.y * 2))); }\\n\"\n    \"#endif\\n\";\n    \n    static const char glsl3Prefix[] =\n    \"#version 150\\n\"\n    \"#define _FRAGCOLOR_DECLARATION out vec4 FragColor;\\n\"\n    \"#define _MRTFRAGCOLOR0_DECLARATION out vec4 FragData0;\\n\"\n    \"#define _MRTFRAGCOLOR1_DECLARATION out vec4 FragData1;\\n\"\n    \"#define _GLFRAGCOORD_DECLARATION in vec4 gl_FragCoord;\\n\"\n    \"#define _VS_IN in\\n\"\n    \"#define _VS_OUT out\\n\"\n    \"#define _FS_IN in\\n\"\n    \"#define _TEXTURELOD textureLod\\n\"\n    \"#define _TEXTURE texture\\n\"\n    \"#define _FRAGCOLOR FragColor\\n\"\n    \"#define _MRTFRAGCOLOR0 FragData0\\n\"\n    \"#define _MRTFRAGCOLOR1 FragData1\\n\"\n    \"#define _TEXELFETCHDECL\\n\";\n    \n    static const char SimpleQuad_vs[] =\n    \"uniform vec2 PositionOffset;\\n\"\n    \"uniform vec2 Scale;\\n\"\n    \n    \"_VS_IN vec3 Position;\\n\"\n    \n\t\"void main()\\n\"\n\t\"{\\n\"\n\t\"\tgl_Position = vec4(Position.xy * Scale + PositionOffset, 0.5, 1.0);\\n\"\n\t\"}\\n\";\n    \n    const OVR::CAPI::GL::ShaderBase::Uniform SimpleQuad_vs_refl[] =\n    {\n        { \"PositionOffset\", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 8 },\n        { \"Scale\",          OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 8, 8 },\n    };\n    \n    static const char SimpleQuad_fs[] =\n    \"uniform vec4 Color;\\n\"\n    \n    \"_FRAGCOLOR_DECLARATION\\n\"\n    \n\t\"void main()\\n\"\n\t\"{\\n\"\n\t\"    _FRAGCOLOR = Color;\\n\"\n\t\"}\\n\";\n    \n    const OVR::CAPI::GL::ShaderBase::Uniform SimpleQuad_fs_refl[] =\n    {\n        { \"Color\", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 16 },\n    };\n\n    static const char SimpleQuadGamma_fs[] =\n        \"uniform vec4 Color;\\n\"\n\n        \"_FRAGCOLOR_DECLARATION\\n\"\n\n        \"void main()\\n\"\n        \"{\\n\"\n        \"    _FRAGCOLOR.rgb = pow(Color.rgb, vec3(2.2));\\n\"\n        \"    _FRAGCOLOR.a = Color.a;\\n\"\n        \"}\\n\";\n\n    const OVR::CAPI::GL::ShaderBase::Uniform SimpleQuadGamma_fs_refl[] =\n    {\n        { \"Color\", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 16 },\n    };\n\n    // This must be prefixed with glsl2Prefix or glsl3Prefix before being compiled.\n    static const char SimpleTexturedQuad_vs[] =\n        \"uniform vec2 PositionOffset;\\n\"\n        \"uniform vec2 Scale;\\n\"\n\n        \"_VS_IN vec3 Position;\\n\"\n        \"_VS_IN vec4 Color;\\n\"\n        \"_VS_IN vec2 TexCoord;\\n\"\n  \n        \"_VS_OUT vec4 oColor;\\n\"\n        \"_VS_OUT vec2 oTexCoord;\\n\"\n\n        \"void main()\\n\"\n        \"{\\n\"\n\t    \"\tgl_Position = vec4(Position.xy * Scale + PositionOffset, 0.5, 1.0);\\n\"\n        \"   oColor = Color;\\n\"\n        \"   oTexCoord = TexCoord;\\n\"\n        \"}\\n\";\n\n    // The following declaration is copied from the generated D3D SimpleTexturedQuad_vs_refl.h file, with D3D_NS renamed to GL.\n    const OVR::CAPI::GL::ShaderBase::Uniform SimpleTexturedQuad_vs_refl[] =\n    {\n\t    { \"PositionOffset\", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 8 },\n\t    { \"Scale\",          OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 8, 8 },\n    };\n\n\n    // This must be prefixed with glsl2Prefix or glsl3Prefix before being compiled.\n    static const char SimpleTexturedQuad_ps[] =\n        \"uniform sampler2D Texture0;\\n\"\n    \n        \"_FS_IN vec4 oColor;\\n\"\n        \"_FS_IN vec2 oTexCoord;\\n\"\n    \n        \"_FRAGCOLOR_DECLARATION\\n\"\n\n        \"void main()\\n\"\n        \"{\\n\"\n        \"   _FRAGCOLOR = oColor * _TEXTURE(Texture0, oTexCoord);\\n\"\n        \"}\\n\";\n\n    // The following is copied from the generated D3D SimpleTexturedQuad_ps_refl.h file, with D3D_NS renamed to GL.\n    const OVR::CAPI::GL::ShaderBase::Uniform SimpleTexturedQuad_ps_refl[] =\n    {\n\t    { \"Color\", \tOVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 16 },\n    };\n    \n    static const char DistortionChroma_vs[] =\n    \"uniform vec2 EyeToSourceUVScale;\\n\"\n    \"uniform vec2 EyeToSourceUVOffset;\\n\"\n    \n    \"_VS_IN vec2 Position;\\n\"\n    \"_VS_IN vec4 Color;\\n\"\n    \"_VS_IN vec2 TexCoord0;\\n\"\n    \"_VS_IN vec2 TexCoord1;\\n\"\n    \"_VS_IN vec2 TexCoord2;\\n\"\n    \n    \"_VS_OUT vec4 oColor;\\n\"\n    \"_VS_OUT vec2 oTexCoord0;\\n\"\n    \"_VS_OUT vec2 oTexCoord1;\\n\"\n    \"_VS_OUT vec2 oTexCoord2;\\n\"\n    \n    \"void main()\\n\"\n    \"{\\n\"\n    \"   gl_Position.x = Position.x;\\n\"\n    \"   gl_Position.y = Position.y;\\n\"\n    \"   gl_Position.z = 0.5;\\n\"\n    \"   gl_Position.w = 1.0;\\n\"\n    \n    // Vertex inputs are in TanEyeAngle space for the R,G,B channels (i.e. after chromatic aberration and distortion).\n    // Scale them into the correct [0-1],[0-1] UV lookup space (depending on eye)\n    \"   oTexCoord0 = TexCoord0 * EyeToSourceUVScale + EyeToSourceUVOffset;\\n\"\n    \"   oTexCoord1 = TexCoord1 * EyeToSourceUVScale + EyeToSourceUVOffset;\\n\"\n    \"   oTexCoord2 = TexCoord2 * EyeToSourceUVScale + EyeToSourceUVOffset;\\n\"\n    \n    \"   oColor = Color;\\n\" // Used for vignette fade.\n    \"}\\n\";\n    \n    const OVR::CAPI::GL::ShaderBase::Uniform DistortionChroma_vs_refl[] =\n    {\n        { \"EyeToSourceUVScale\",  OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 8 },\n        { \"EyeToSourceUVOffset\", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 8, 8 },\n    };\n    \n    static const char DistortionChroma_fs[] =\n    \"uniform sampler2D Texture0;\\n\"\n    \"uniform sampler2D Texture1;\\n\"\n    \"uniform vec3 OverdriveScales_IsSrgb;\\n\"\n\n    \"_FS_IN vec4 oColor;\\n\"\n    \"_FS_IN vec2 oTexCoord0;\\n\"\n    \"_FS_IN vec2 oTexCoord1;\\n\"\n    \"_FS_IN vec2 oTexCoord2;\\n\"\n    \n    \"_MRTFRAGCOLOR0_DECLARATION\\n\"   // Desired color (next frame's \"PrevTexture\")\n    \"_MRTFRAGCOLOR1_DECLARATION\\n\"   // Overdriven color (Back-buffer)\n    \"_GLFRAGCOORD_DECLARATION\\n\"\n\n    \"#ifdef _TEXELFETCHDECL\\n\"\n    \"_TEXELFETCHDECL\\n\"\n    \"#endif\\n\"\n    \n    \"void main()\\n\"\n    \"{\\n\"\n    \"   float ResultR = _TEXTURE(Texture0, oTexCoord0, 0.0).r;\\n\"\n    \"   float ResultG = _TEXTURE(Texture0, oTexCoord1, 0.0).g;\\n\"\n    \"   float ResultB = _TEXTURE(Texture0, oTexCoord2, 0.0).b;\\n\"\n    \"   vec3 newColor = vec3(ResultR * oColor.r, ResultG * oColor.g, ResultB * oColor.b);\\n\"\n\n    \"   _MRTFRAGCOLOR0 = vec4(newColor, 1);\\n\"\n    \"   _MRTFRAGCOLOR1 = _MRTFRAGCOLOR0;\\n\"\n\n    \"   #ifdef _TEXELFETCHDECL\\n\"\n    // pixel luminance overdrive\n    \"   if(OverdriveScales_IsSrgb.x > 0.0)\\n\"\n    \"   {\\n\"\n    \"       ivec2 pixelCoord = ivec2(gl_FragCoord.x, gl_FragCoord.y);\\n\"\n    \"       vec3 oldColor = texelFetch(Texture1, pixelCoord, 0).rgb;\\n\"\n\n    \"       vec3 adjustedScales;\\n\"\n    \"       adjustedScales.x = newColor.x > oldColor.x ? OverdriveScales_IsSrgb.x : OverdriveScales_IsSrgb.y;\\n\"\n    \"       adjustedScales.y = newColor.y > oldColor.y ? OverdriveScales_IsSrgb.x : OverdriveScales_IsSrgb.y;\\n\"\n    \"       adjustedScales.z = newColor.z > oldColor.z ? OverdriveScales_IsSrgb.x : OverdriveScales_IsSrgb.y;\\n\"\n\n\t// overdrive is tuned for gamma space so if we're in linear space fix gamma before doing the calculation\n\t\"\t\tvec3 overdriveColor;\\n\"\n\t\"       if(OverdriveScales_IsSrgb.z > 0.0)\\n\"\n\t\"\t\t{\\n\"\n\t\"           oldColor = pow(oldColor, vec3(1.0/2.2, 1.0/2.2, 1.0/2.2));\\n\"\n\t\"\t\t\tnewColor = pow(newColor, vec3(1.0/2.2, 1.0/2.2, 1.0/2.2));\\n\"\n    \"\t\t\toverdriveColor = clamp(newColor + (newColor - oldColor) * adjustedScales, 0.0, 1.0);\\n\"\n    \"           overdriveColor = pow(overdriveColor, vec3(2.2, 2.2, 2.2));\\n\"\n\t\"\t\t}\\n\"\n\t\"\t\telse\\n\"\n\t\"\t\t\toverdriveColor = clamp(newColor + (newColor - oldColor) * adjustedScales, 0.0, 1.0);\\n\"\n\n    \"       _MRTFRAGCOLOR1 = vec4(overdriveColor, 1.0);\\n\"\n    \"   }\\n\"\n    \"   #else\\n\"\n    // If statement to keep OverdriveScales_IsSrgb from being optimized out.\n    \"   if(OverdriveScales_IsSrgb.x > 0.0)\\n\"\n    \"     _MRTFRAGCOLOR1 = vec4(newColor, 1);\\n\"\n    \"   #endif\\n\"\n    \"}\\n\";\n\n    const OVR::CAPI::GL::ShaderBase::Uniform DistortionChroma_ps_refl[] =\n    {\n        { \"OverdriveScales_IsSrgb\", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 12 },\n    };\n    \n    static const char DistortionTimewarpChroma_vs[] =\n    \"uniform vec2 EyeToSourceUVScale;\\n\"\n    \"uniform vec2 EyeToSourceUVOffset;\\n\"\n    \"uniform mat4 EyeRotationStart;\\n\"\n    \"uniform mat4 EyeRotationEnd;\\n\"\n    \n    \"_VS_IN vec2 Position;\\n\"\n    \"_VS_IN vec4 Color;\\n\"\n    \"_VS_IN vec2 TexCoord0;\\n\"\n    \"_VS_IN vec2 TexCoord1;\\n\"\n    \"_VS_IN vec2 TexCoord2;\\n\"\n    \n    \"_VS_OUT vec4 oColor;\\n\"\n    \"_VS_OUT vec2 oTexCoord0;\\n\"\n    \"_VS_OUT vec2 oTexCoord1;\\n\"\n    \"_VS_OUT vec2 oTexCoord2;\\n\"\n    \n    \"void main()\\n\"\n    \"{\\n\"\n    \"   gl_Position.x = Position.x;\\n\"\n    \"   gl_Position.y = Position.y;\\n\"\n    \"   gl_Position.z = 0.0;\\n\"\n    \"   gl_Position.w = 1.0;\\n\"\n    \n    // Vertex inputs are in TanEyeAngle space for the R,G,B channels (i.e. after chromatic aberration and distortion).\n    // These are now \"real world\" vectors in direction (x,y,1) relative to the eye of the HMD.\n    \"   vec3 TanEyeAngleR = vec3 ( TexCoord0.x, TexCoord0.y, 1.0 );\\n\"\n    \"   vec3 TanEyeAngleG = vec3 ( TexCoord1.x, TexCoord1.y, 1.0 );\\n\"\n    \"   vec3 TanEyeAngleB = vec3 ( TexCoord2.x, TexCoord2.y, 1.0 );\\n\"\n    \n    // Accurate time warp lerp vs. faster\n#if 1\n    // Apply the two 3x3 timewarp rotations to these vectors.\n\t\"   vec3 TransformedRStart = (EyeRotationStart * vec4(TanEyeAngleR, 0)).xyz;\\n\"\n\t\"   vec3 TransformedGStart = (EyeRotationStart * vec4(TanEyeAngleG, 0)).xyz;\\n\"\n\t\"   vec3 TransformedBStart = (EyeRotationStart * vec4(TanEyeAngleB, 0)).xyz;\\n\"\n\t\"   vec3 TransformedREnd   = (EyeRotationEnd * vec4(TanEyeAngleR, 0)).xyz;\\n\"\n\t\"   vec3 TransformedGEnd   = (EyeRotationEnd * vec4(TanEyeAngleG, 0)).xyz;\\n\"\n\t\"   vec3 TransformedBEnd   = (EyeRotationEnd * vec4(TanEyeAngleB, 0)).xyz;\\n\"\n    \n    // And blend between them.\n    \"   vec3 TransformedR = mix ( TransformedRStart, TransformedREnd, Color.a );\\n\"\n    \"   vec3 TransformedG = mix ( TransformedGStart, TransformedGEnd, Color.a );\\n\"\n    \"   vec3 TransformedB = mix ( TransformedBStart, TransformedBEnd, Color.a );\\n\"\n#else\n    \"   mat3 EyeRotation;\\n\"\n    \"   EyeRotation[0] = mix ( EyeRotationStart[0], EyeRotationEnd[0], Color.a ).xyz;\\n\"\n    \"   EyeRotation[1] = mix ( EyeRotationStart[1], EyeRotationEnd[1], Color.a ).xyz;\\n\"\n    \"   EyeRotation[2] = mix ( EyeRotationStart[2], EyeRotationEnd[2], Color.a ).xyz;\\n\"\n    \"   vec3 TransformedR   = EyeRotation * TanEyeAngleR;\\n\"\n    \"   vec3 TransformedG   = EyeRotation * TanEyeAngleG;\\n\"\n    \"   vec3 TransformedB   = EyeRotation * TanEyeAngleB;\\n\"\n#endif\n    \n    // Project them back onto the Z=1 plane of the rendered images.\n    \"   float RecipZR = 1.0 / TransformedR.z;\\n\"\n    \"   float RecipZG = 1.0 / TransformedG.z;\\n\"\n    \"   float RecipZB = 1.0 / TransformedB.z;\\n\"\n    \"   vec2 FlattenedR = vec2 ( TransformedR.x * RecipZR, TransformedR.y * RecipZR );\\n\"\n    \"   vec2 FlattenedG = vec2 ( TransformedG.x * RecipZG, TransformedG.y * RecipZG );\\n\"\n    \"   vec2 FlattenedB = vec2 ( TransformedB.x * RecipZB, TransformedB.y * RecipZB );\\n\"\n    \n    // These are now still in TanEyeAngle space.\n    // Scale them into the correct [0-1],[0-1] UV lookup space (depending on eye)\n    \"   vec2 SrcCoordR = FlattenedR * EyeToSourceUVScale + EyeToSourceUVOffset;\\n\"\n    \"   vec2 SrcCoordG = FlattenedG * EyeToSourceUVScale + EyeToSourceUVOffset;\\n\"\n    \"   vec2 SrcCoordB = FlattenedB * EyeToSourceUVScale + EyeToSourceUVOffset;\\n\"\n    \n    \"   oTexCoord0 = SrcCoordR;\\n\"\n    \"   oTexCoord1 = SrcCoordG;\\n\"\n    \"   oTexCoord2 = SrcCoordB;\\n\"\n    \n    \"   oColor = vec4(Color.r, Color.r, Color.r, Color.r);\\n\"              // Used for vignette fade.\n    \"}\\n\";\n    \n\n    const OVR::CAPI::GL::ShaderBase::Uniform DistortionTimewarpChroma_vs_refl[] =\n    {\n        { \"EyeToSourceUVScale\",  OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 0, 8 },\n        { \"EyeToSourceUVOffset\", OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 8, 8 },\n        { \"EyeRotationStart\",    OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 16, 64 },\n        { \"EyeRotationEnd\",      OVR::CAPI::GL::ShaderBase::VARTYPE_FLOAT, 80, 64 },\n    };\n    \n}}} // OVR::CAPI::GL\n\n#endif // OVR_CAPI_GL_Shaders_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/GL/CAPI_GL_HSWDisplay.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_GL_HSWDisplay.cpp\nContent     :   Implements Health and Safety Warning system.\nCreated     :   July 7, 2014\nAuthors     :   Paul Pedriana\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n\n#include \"CAPI_GL_HSWDisplay.h\"\n#include \"CAPI_GL_DistortionShaders.h\"\n#include \"OVR_CAPI_GL.h\"\n#include \"Kernel/OVR_File.h\"\n#include \"Kernel/OVR_Allocator.h\"\n#include \"Kernel/OVR_Color.h\"\n#include \"Extras/OVR_Math.h\"\n\n\nOVR_DISABLE_MSVC_WARNING(4996) // \"This function or variable may be unsafe...\"\n\n\nnamespace OVR { namespace CAPI { \n\n\n// Loads the TGA data from the File as an array of width * height 32 bit Texture_RGBA values.\n// Returned pointer must be freed with OVR_FREE.\nuint8_t* LoadTextureTgaData(OVR::File* f, uint8_t alpha, int& width, int& height)\n{\n    // See http://www.fileformat.info/format/tga/egff.htm for format details.\n    // TGA files are stored with little-endian data.\n    uint8_t* pRGBA  = NULL;\n\n    f->SeekToBegin();\n    \n    const int desclen = f->ReadUByte();\n    const int palette = f->ReadUByte();\n    OVR_UNUSED(palette);\n    const int imgtype = f->ReadUByte();\n    f->ReadUInt16(); // Skip bytes\n    int palCount = f->ReadUInt16();\n    int palSize = f->ReadUByte();\n    f->ReadUInt16();\n    f->ReadUInt16();\n    width = f->ReadUInt16();\n    height = f->ReadUInt16();\n    int bpp = f->ReadUByte();\n    f->ReadUByte();\n\n    const int ImgTypeBGRAUncompressed = 2;\n    const int ImgTypeBGRARLECompressed = 10;\n\n    OVR_ASSERT(((imgtype == ImgTypeBGRAUncompressed) || (imgtype == ImgTypeBGRARLECompressed)) && ((bpp == 24) || (bpp == 32)));\n\n    // imgType 2 is uncompressed true-color image.\n    // imgType 10 is run-length encoded true-color image.\n\n    // WARNING - this loader is potentially incorrect. The default TGA origin is bottom-left.\n    // You can change the origin, but that is non-standard, and this loader ignores that bit in the header.\n    // So just be aware that this texture will have the UV origin at the bottom lef of the image, even in DirectX\n    // (I fixed the other TGA loader, but I'm not \"fixing\" this one because the thing works, so leave it alone!)\n\n    if(((imgtype == ImgTypeBGRAUncompressed) || (imgtype == ImgTypeBGRARLECompressed)) && ((bpp == 24) || (bpp == 32)))\n    {\n        int imgsize = width * height * 4;\n        pRGBA = (uint8_t*) OVR_ALLOC(imgsize);\n        f->Skip(desclen);\n        f->Skip(palCount * (palSize + 7) >> 3);\n        int strideBytes = width * 4; // This is the number of bytes between successive rows.\n\n        unsigned char buf[4] = { 0, 0, 0, alpha }; // If bpp is 24 then this alpha will be unmodified below.\n\n        switch (imgtype)\n        {\n        case ImgTypeBGRAUncompressed:\n            switch (bpp)\n            {\n            case 24:\n            case 32:\n                for (int y = 0; y < height; y++)\n                {\n                    for (int x = 0; x < width; x++)\n                    {\n                        f->Read(buf, bpp / 8); // Data is stored as B, G, R\n                        pRGBA[y*strideBytes + x*4 + 0] = buf[2];\n                        pRGBA[y*strideBytes + x*4 + 1] = buf[1];\n                        pRGBA[y*strideBytes + x*4 + 2] = buf[0];\n                        pRGBA[y*strideBytes + x*4 + 3] = buf[3];\n                    }\n                }\n                break;\n            }\n            break;\n\n        case ImgTypeBGRARLECompressed:\n            switch (bpp)\n            {\n            case 24:\n            case 32:\n                for (int y = 0; y < height; y++) // RLE spans don't cross successive rows.\n                {\n                    int x = 0;\n\n                    while(x < width)\n                    {\n                        uint8_t rleByte;\n                        f->Read(&rleByte, 1);\n\n                        if(rleByte & 0x80) // If the high byte is set then what follows are RLE bytes.\n                        {\n                            size_t rleCount = ((rleByte & 0x7f) + 1);\n                            f->Read(buf, bpp / 8); // Data is stored as B, G, R, A\n\n                            for (; rleCount; --rleCount, ++x)\n                            {\n                                pRGBA[y*strideBytes + x*4 + 0] = buf[2];\n                                pRGBA[y*strideBytes + x*4 + 1] = buf[1];\n                                pRGBA[y*strideBytes + x*4 + 2] = buf[0];\n                                pRGBA[y*strideBytes + x*4 + 3] = buf[3];\n                            }   \n                        }\n                        else // Else what follows are regular bytes of a count indicated by rleByte\n                        {\n                            for (size_t rleCount = (rleByte + 1); rleCount; --rleCount, ++x)\n                            {\n                                f->Read(buf, bpp / 8); // Data is stored as B, G, R, A\n                                pRGBA[y*strideBytes + x*4 + 0] = buf[2];\n                                pRGBA[y*strideBytes + x*4 + 1] = buf[1];\n                                pRGBA[y*strideBytes + x*4 + 2] = buf[0];\n                                pRGBA[y*strideBytes + x*4 + 3] = buf[3];\n                            }\n                        }\n                    }\n                }\n                break;\n            }\n            break;\n        }\n    }\n\n    return pRGBA;\n} // LoadTextureTgaData\n\n\n\nnamespace GL {\n\n\n// To do: This needs to be promoted to a central version, possibly in CAPI_HSWDisplay.h\nstruct HASWVertex\n{\n    Vector3f  Pos;\n    Color     C;\n    float     U, V;    \n\n    HASWVertex(const Vector3f& p, const Color& c = Color(64,0,0,255), float u = 0, float v = 0)\n        : Pos(p), C(c), U(u), V(v)\n    {}\n\n    HASWVertex(float x, float y, float z, const Color& c = Color(64,0,0,255), float u = 0, float v = 0) \n        : Pos(x,y,z), C(c), U(u), V(v)\n    {}\n\n    bool operator==(const HASWVertex& b) const\n    {\n        return (Pos == b.Pos) && (C == b.C) && (U == b.U) && (V == b.V);\n    }\n};\n\n\n\n// This is a temporary function implementation, and it functionality needs to be implemented in a more generic way.\nTexture* LoadTextureTga(RenderParams& rParams, int samplerMode, OVR::File* f, uint8_t alpha)\n{\n    OVR::CAPI::GL::Texture* pTexture = NULL;\n\n    int width, height;\n    const uint8_t* pRGBA = LoadTextureTgaData(f, alpha, width, height);\n\n    if (pRGBA)\n    {\n        pTexture = new OVR::CAPI::GL::Texture(&rParams, width, height);\n\n        // SetSampleMode forces the use of mipmaps through GL_LINEAR_MIPMAP_LINEAR.\n        pTexture->SetSampleMode(samplerMode); // Calls glBindTexture internally.\n\n        // We are intentionally not using mipmaps. We need to use this because Texture::SetSampleMode unilaterally uses GL_LINEAR_MIPMAP_LINEAR.\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);\n        OVR_ASSERT(glGetError() == 0);\n\n        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pRGBA);\n        OVR_ASSERT(glGetError() == 0);\n\n        // With OpenGL 4.2+ we can use this instead of glTexImage2D:\n        // glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, width, height);\n        // glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pRGBA);\n\n        OVR_FREE(const_cast<uint8_t*>(pRGBA));\n    }\n\n    return pTexture;\n}\n\n\n// Loads a texture from a memory image of a TGA file.\nTexture* LoadTextureTga(RenderParams& rParams, int samplerMode, const uint8_t* pData, int dataSize, uint8_t alpha)\n{\n    MemoryFile memoryFile(\"\", pData, dataSize);\n\n    return LoadTextureTga(rParams, samplerMode, &memoryFile, alpha);\n}\n\n\n\n\n// The texture below may conceivably be shared between HSWDisplay instances. However,  \n// beware that sharing may not be possible if two HMDs are using different locales  \n// simultaneously. As of this writing it's not clear if that can occur in practice.\n\nHSWDisplay::HSWDisplay(ovrRenderAPIType api, ovrHmd hmd, const HMDRenderState& renderState)\n  : OVR::CAPI::HSWDisplay(api, hmd, renderState)\n  , RenderParams()\n  , GLContext()\n  , FrameBuffer(0)\n  , pTexture()\n  , pShaderSet()\n  , pVertexShader()\n  , pFragmentShader()\n  , pVB()\n  , VAO(0)\n  , VAOInitialized(false)\n  , OrthoProjection()\n{\n}\n\n\nbool HSWDisplay::Initialize(const ovrRenderAPIConfig* apiConfig)\n{\n    const ovrGLConfig* config = (const ovrGLConfig*)apiConfig;\n\n    if(config)\n    {\n        // The following is essentially copied from CAPI_GL_DistortionRender.cpp's \n        // Initialize function. To do: Merge this to a central location.\n        RenderParams.Multisample = config->OGL.Header.Multisample;\n        RenderParams.BackBufferSize     = config->OGL.Header.BackBufferSize;\n\n        #if defined(OVR_OS_WIN32)\n            RenderParams.Window = (config->OGL.Window) ? config->OGL.Window : GetActiveWindow();\n            RenderParams.DC     = config->OGL.DC;\n        #elif defined(OVR_OS_LINUX)\n            if (config->OGL.Disp)\n            {\n                RenderParams.Disp = config->OGL.Disp;\n            }\n            if (!RenderParams.Disp)\n            {\n                RenderParams.Disp = glXGetCurrentDisplay();\n            }\n            if (!RenderParams.Disp)\n            {\n                OVR_DEBUG_LOG((\"glXGetCurrentDisplay failed.\"));\n                return false;\n            }\n        #endif\n    }\n    else\n    {\n        UnloadGraphics();\n    }\n\n    return true;\n}\n\n\nvoid HSWDisplay::Shutdown()\n{\n    UnloadGraphics();\n}\n\n\nvoid HSWDisplay::DisplayInternal()\n{\n    HSWDISPLAY_LOG((\"[HSWDisplay GL] DisplayInternal()\"));\n    // We may want to call LoadGraphics here instead of within Render.\n}\n\n\nvoid HSWDisplay::DismissInternal()\n{\n    HSWDISPLAY_LOG((\"[HSWDisplay GL] DismissInternal()\"));\n    UnloadGraphicsRequested = true; // We don't directly call UnloadGraphics here because this may be executed within a different thread.\n}\n\n\nvoid HSWDisplay::UnloadGraphics()\n{\n    if(pTexture) // If initialized...\n    {\n        Context currentGLContext;\n        currentGLContext.InitFromCurrent();\n        GLContext.Bind();\n\n        // RenderParams: No need to clear.\n        if(FrameBuffer != 0)\n        {\n            glDeleteFramebuffers(1, &FrameBuffer);\n            FrameBuffer = 0;\n        }\n        pTexture.Clear();\n        pShaderSet.Clear();\n        pVertexShader.Clear();\n        pFragmentShader.Clear();\n        pVB.Clear();\n        if(VAO)\n        {\n            glDeleteVertexArrays(1, &VAO);\n        }\n        currentGLContext.Bind();\n        GLContext.Destroy();\n    }\n}\n\n\nvoid HSWDisplay::LoadGraphics()\n{\n    // We assume here that the current GL context is the one our resources will be associated with.\n\n    if (FrameBuffer == 0)\n    {\n        glGenFramebuffers(1, &FrameBuffer);\n    }\n\n    if (!pTexture) // To do: Add support for .dds files, which would be significantly smaller than the size of the tga.\n    {\n        size_t textureSize;\n        const uint8_t* TextureData = GetDefaultTexture(textureSize);\n        pTexture = *LoadTextureTga(RenderParams, Sample_Linear | Sample_Clamp, TextureData, (int)textureSize, 255);\n    }\n\n    if (!pShaderSet)\n    {\n        pShaderSet = *new ShaderSet();\n    }\n\n    if(!pVertexShader)\n    {\n        OVR::String strShader((GLEContext::GetCurrentContext()->WholeVersion >= 302) ? glsl3Prefix : glsl2Prefix);\n        strShader += SimpleTexturedQuad_vs;\n\n        pVertexShader = *new VertexShader(&RenderParams, const_cast<char*>(strShader.ToCStr()), strShader.GetLength(), SimpleTexturedQuad_vs_refl, OVR_ARRAY_COUNT(SimpleTexturedQuad_vs_refl));\n        pShaderSet->SetShader(pVertexShader);\n    }\n\n    if(!pFragmentShader)\n    {\n        OVR::String strShader((GLEContext::GetCurrentContext()->WholeVersion >= 302) ? glsl3Prefix : glsl2Prefix);\n        strShader += SimpleTexturedQuad_ps;\n\n        pFragmentShader = *new FragmentShader(&RenderParams, const_cast<char*>(strShader.ToCStr()), strShader.GetLength(), SimpleTexturedQuad_ps_refl, OVR_ARRAY_COUNT(SimpleTexturedQuad_ps_refl));\n        pShaderSet->SetShader(pFragmentShader);\n    }\n\n    if(!pVB)\n    {\n        pVB = *new Buffer(&RenderParams);\n\n        pVB->Data(Buffer_Vertex, NULL, 4 * sizeof(HASWVertex));\n        HASWVertex* pVertices = (HASWVertex*)pVB->Map(0, 4 * sizeof(HASWVertex), Map_Discard);\n        OVR_ASSERT(pVertices);\n\n        if(pVertices)\n        {\n            const bool  flip   = ((RenderState.DistortionCaps & ovrDistortionCap_FlipInput) != 0);\n            const float left   = -1.0f; // We currently draw this in normalized device coordinates with an stereo translation\n            const float top    = -1.1f; // applied as a vertex shader uniform. In the future when we have a more formal graphics\n            const float right  =  1.0f; // API abstraction we may move this draw to an overlay layer or to a more formal \n            const float bottom =  0.9f; // model/mesh scheme with a perspective projection.\n\n            // See warning in LoadTextureTgaData() about this TGA being loaded \"upside down\", i.e. UV origin is at bottom-left.\n            pVertices[0] = HASWVertex(left,  top,    0.f, Color(255, 255, 255, 255), 0.f, flip ? 1.f : 0.f);\n            pVertices[1] = HASWVertex(left,  bottom, 0.f, Color(255, 255, 255, 255), 0.f, flip ? 0.f : 1.f);\n            pVertices[2] = HASWVertex(right, top,    0.f, Color(255, 255, 255, 255), 1.f, flip ? 1.f : 0.f); \n            pVertices[3] = HASWVertex(right, bottom, 0.f, Color(255, 255, 255, 255), 1.f, flip ? 0.f : 1.f);\n\n            pVB->Unmap(pVertices);\n        }\n    }\n\n    // We don't bind or initialize the vertex arrays here.\n    if (!VAO && GLE_ARB_vertex_array_object)\n    {\n        OVR_ASSERT(!VAOInitialized);\n            glGenVertexArrays(1, &VAO);\n    }\n}\n\n\nvoid HSWDisplay::RenderInternal(ovrEyeType eye, const ovrTexture* eyeTexture)\n{\n    if(RenderEnabled && eyeTexture)\n    {        \n        // We need to render to the eyeTexture with the texture viewport.\n        // Setup rendering to the texture.\n        ovrGLTexture* eyeTextureGL = const_cast<ovrGLTexture*>(reinterpret_cast<const ovrGLTexture*>(eyeTexture));\n        OVR_ASSERT(eyeTextureGL->Texture.Header.API == ovrRenderAPI_OpenGL);\n\n        GL::AutoContext autoGLContext(GLContext); // Saves the current GL context, binds our GLContext, then at the end of scope re-binds the current GL context.\n\n        // Load the graphics if not loaded already.\n        if (!pTexture)\n            LoadGraphics();\n\n        // Calculate ortho projection.\n        GetOrthoProjection(RenderState, OrthoProjection);\n\n        // Set the rendering to be to the eye texture.\n        glBindFramebuffer(GL_FRAMEBUFFER, FrameBuffer);\n        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, eyeTextureGL->OGL.TexId, 0);\n        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0); // We aren't using depth, as we currently want this to overwrite everything.\n        GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);\n        OVR_ASSERT(status == GL_FRAMEBUFFER_COMPLETE); OVR_UNUSED(status);\n\n        // Set up the viewport\n        const GLint   x = (GLint)eyeTextureGL->Texture.Header.RenderViewport.Pos.x;\n        const GLint   y = (GLint)eyeTextureGL->Texture.Header.RenderViewport.Pos.y; // Note that GL uses bottom-up coordinates.\n        const GLsizei w = (GLsizei)eyeTextureGL->Texture.Header.RenderViewport.Size.w;\n        const GLsizei h = (GLsizei)eyeTextureGL->Texture.Header.RenderViewport.Size.h;\n        glViewport(x, y, w, h);\n\n        // Set fixed-function render states.\n        //glDepthRange(0.0,  1.0); // This is the default\n        glDepthMask(GL_FALSE);\n        glDisable(GL_DEPTH_TEST);\n        glFrontFace(GL_CW);\n        glEnable(GL_BLEND);\n        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n\n        // Enable the buffer and shaders we use.\n        ShaderFill fill(pShaderSet);\n        if (pTexture)\n            fill.SetTexture(0, pTexture);\n\n        // Set shader uniforms.\n        const float scale  = HSWDISPLAY_SCALE * ((RenderState.OurHMDInfo.HmdType == HmdType_DK1) ? 0.70f : 1.f);\n        pShaderSet->SetUniform2f(\"Scale\", scale, scale / 2.f); // X and Y scale. Y is a fixed proportion to X in order to give a certain aspect ratio.\n        pShaderSet->SetUniform2f(\"PositionOffset\", OrthoProjection[eye].GetTranslation().x, 0.0f);\n\n        // Set vertex attributes\n        if (GLE_ARB_vertex_array_object)\n        {\n            OVR_ASSERT(VAO != 0);\n            glBindVertexArray(VAO);\n        }\n\n        if(!VAOInitialized) // This executes for the case that VAO isn't supported.\n        {\n            glBindBuffer(GL_ARRAY_BUFFER, pVB->GLBuffer); // This must be called before glVertexAttribPointer is called below.\n\n            const GLuint shaderProgram = pShaderSet->Prog;\n            GLint attributeLocationArray[3];\n\n            attributeLocationArray[0] = glGetAttribLocation(shaderProgram, \"Position\");\n            glVertexAttribPointer(attributeLocationArray[0], sizeof(Vector3f)/sizeof(float), GL_FLOAT,         false, sizeof(HASWVertex), reinterpret_cast<char*>(offsetof(HASWVertex, Pos)));\n\n            attributeLocationArray[1] = glGetAttribLocation(shaderProgram, \"Color\");\n            glVertexAttribPointer(attributeLocationArray[1], sizeof(Color)/sizeof(uint8_t),  GL_UNSIGNED_BYTE,  true, sizeof(HASWVertex), reinterpret_cast<char*>(offsetof(HASWVertex, C)));  // True because we want it to convert [0,255] to [0,1] for us.\n\n            attributeLocationArray[2] = glGetAttribLocation(shaderProgram, \"TexCoord\");\n            glVertexAttribPointer(attributeLocationArray[2], sizeof(float[2])/sizeof(float), GL_FLOAT,         false, sizeof(HASWVertex), reinterpret_cast<char*>(offsetof(HASWVertex, U)));\n\n            for (size_t i = 0; i < OVR_ARRAY_COUNT(attributeLocationArray); i++)\n                glEnableVertexAttribArray((GLuint)i);\n        }\n\n        fill.Set(Prim_TriangleStrip);\n\n        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\n\n        if (GLE_ARB_vertex_array_object)\n        {\n            VAOInitialized = true;\n            glBindVertexArray(0);\n        }\n    }\n}\n\n \n}}} // namespace OVR::CAPI::GL\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/GL/CAPI_GL_HSWDisplay.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_GL_HSWDisplay.h\nContent     :   Implements Health and Safety Warning system.\nCreated     :   July 7, 2014\nAuthors     :   Paul Pedriana\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_GL_HSWDisplay_h\n#define OVR_CAPI_GL_HSWDisplay_h\n\n\n#include \"../CAPI_HSWDisplay.h\"\n#include \"CAPI_GL_Util.h\"\n\n\nnamespace OVR { namespace CAPI { namespace GL {\n\n    class HSWDisplay : public CAPI::HSWDisplay\n    {\n    public:\n        HSWDisplay(ovrRenderAPIType api, ovrHmd hmd, const HMDRenderState& renderState);\n\n        // Must be called before use. apiConfig is such that:\n        //   const ovrGLConfig* config = (const ovrGLConfig*)apiConfig; or\n        bool Initialize(const ovrRenderAPIConfig* apiConfig);\n        void Shutdown();\n        void DisplayInternal();\n        void DismissInternal();\n\n        // Draws the warning to the eye texture(s). This must be done at the end of a \n        // frame but prior to executing the distortion rendering of the eye textures. \n        void RenderInternal(ovrEyeType eye, const ovrTexture* eyeTexture);\n\n    protected:\n        void UnloadGraphics();\n        void LoadGraphics();\n\n        OVR::CAPI::GL::RenderParams        RenderParams;\n        OVR::CAPI::GL::Context             GLContext;           // Our prive OpenGL context for drawing.\n        GLuint                             FrameBuffer;         // This is a container for a texture, depth buffer, stencil buffer to be rendered to. To consider: Make a wrapper class, like the OculusWorldDemo RBuffer class. \n        Ptr<OVR::CAPI::GL::Texture>        pTexture;\n        Ptr<OVR::CAPI::GL::ShaderSet>      pShaderSet;\n        Ptr<OVR::CAPI::GL::VertexShader>   pVertexShader;\n        Ptr<OVR::CAPI::GL::FragmentShader> pFragmentShader;\n        Ptr<OVR::CAPI::GL::Buffer>         pVB;\n        GLuint                             VAO;                 // Vertex Array Object.\n        bool                               VAOInitialized;      // True if the VAO was initialized with vertex buffer data.\n        Matrix4f                           OrthoProjection[2];  // Projection for 2D.\n\n    private:\n        OVR_NON_COPYABLE(HSWDisplay)\n    };\n\n}}} // namespace OVR::CAPI::GL\n\n\n#endif // OVR_CAPI_GL_HSWDisplay_h\n\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/GL/CAPI_GL_Util.cpp",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_GL_Util.cpp\nContent     :   RenderDevice implementation for OpenGL\nCreated     :   September 10, 2012\nAuthors     :   David Borel, Andrew Reisse\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"CAPI_GL_Util.h\"\n#include \"Kernel/OVR_Log.h\"\n#include <string.h>\n\n#if defined(OVR_OS_LINUX)\n #include \"Displays/OVR_Linux_SDKWindow.h\"\n#endif\n\n#if defined(OVR_OS_MAC)\n    #include <CoreGraphics/CGDirectDisplay.h>\n    #include <OpenGL/OpenGL.h>\n    #import <Cocoa/Cocoa.h>\n\n    // Hides Objective C NSOpenGLContext.\n    class MacContextImpl\n    {\n    public:\n        MacContextImpl(NSOpenGLContext* ctxIn, NSOpenGLPixelFormat* fmt) :\n            ctx(ctxIn),\n            pixelFormat(fmt)\n        { }\n        MacContextImpl(NSOpenGLContext* ctxIn) :\n          MacContextImpl(ctxIn, nil)\n        { }\n\n        ~MacContextImpl()\n        {\n#if !__has_feature(objc_arc)\n            if (pixelFormat != nil)\n            {\n                [pixelFormat release];\n                pixelFormat = nil;\n            }\n            [ctx release];\n            ctx = nil;\n#endif\n        }\n        // ARC will properly clean up NSOpenGLContext and NSOpenGLPixelFormat.\n        NSOpenGLPixelFormat* pixelFormat;\n        NSOpenGLContext*     ctx;\n    };\n\ntypedef void *CGSConnectionID;\ntypedef int32_t CGSWindowID;\ntypedef int32_t CGSSurfaceID;\n\nextern \"C\" CGLError CGLGetSurface(CGLContextObj ctx, CGSConnectionID *cid, CGSWindowID *wid, CGSSurfaceID *sid);\nextern \"C\" CGLError CGLSetSurface(CGLContextObj ctx, CGSConnectionID cid, CGSWindowID wid, CGSSurfaceID sid);\n#endif\n\n\n\n\nnamespace OVR {\n\n\nOVR::GLEContext gleContext;\n\n\nOVR::GLEContext* GetGLEContext()\n{\n    return &gleContext;\n}\n\n\nnamespace CAPI { namespace GL {\n\n\nvoid InitGLExtensions()\n{\n    if(!gleContext.IsInitialized())\n    {\n        gleContext.SetCurrentContext(&gleContext);\n        gleContext.Init();\n    }\n}\n    \n    \nBuffer::Buffer(RenderParams* rp) : pParams(rp), Size(0), Use(0), GLBuffer(0)\n{\n}\n\nBuffer::~Buffer()\n{\n    if (GLBuffer)\n        glDeleteBuffers(1, &GLBuffer);\n}\n\nbool Buffer::Data(int use, const void* buffer, size_t size)\n{\n    Size = size;\n\n    switch (use & Buffer_TypeMask)\n    {\n    case Buffer_Index:     Use = GL_ELEMENT_ARRAY_BUFFER; break;\n    default:               Use = GL_ARRAY_BUFFER; break;\n    }\n\n    if (!GLBuffer)\n        glGenBuffers(1, &GLBuffer);\n\n    int mode = GL_DYNAMIC_DRAW;\n    if (use & Buffer_ReadOnly)\n        mode = GL_STATIC_DRAW;\n\n    glBindBuffer(Use, GLBuffer);\n    glBufferData(Use, size, buffer, mode);\n    return 1;\n}\n\nvoid* Buffer::Map(size_t, size_t, int)\n{\n    int mode = GL_WRITE_ONLY;\n    //if (flags & Map_Unsynchronized)\n    //    mode |= GL_MAP_UNSYNCHRONIZED;\n    \n    glBindBuffer(Use, GLBuffer);\n    void* v = glMapBuffer(Use, mode);\n    return v;\n}\n\nbool Buffer::Unmap(void*)\n{\n    glBindBuffer(Use, GLBuffer);\n    int r = glUnmapBuffer(Use);\n    return r != 0;\n}\n\nShaderSet::ShaderSet() : \n  //Shaders[],\n    UniformInfo(),\n  //Prog(0)\n    ProjLoc(0),\n    ViewLoc(0),\n  //TexLoc[],\n    UsesLighting(false),\n    LightingVer(0)\n{\n    memset(TexLoc, 0, sizeof(TexLoc));\n    Prog = glCreateProgram();\n}\nShaderSet::~ShaderSet()\n{\n    glDeleteProgram(Prog);\n}\n\nGLint ShaderSet::GetGLShader(Shader* s)\n{\n    switch (s->Stage)\n    {\n    case Shader_Vertex: {\n        ShaderImpl<Shader_Vertex, GL_VERTEX_SHADER>* gls = (ShaderImpl<Shader_Vertex, GL_VERTEX_SHADER>*)s;\n        return gls->GLShader;\n    } break;\n    case Shader_Fragment: {\n        ShaderImpl<Shader_Fragment, GL_FRAGMENT_SHADER>* gls = (ShaderImpl<Shader_Fragment, GL_FRAGMENT_SHADER>*)s;\n        return gls->GLShader;\n    } break;\n    default: break;\n    }\n\n    return -1;\n}\n\nvoid ShaderSet::SetShader(Shader *s)\n{\n    Shaders[s->Stage] = s;\n    GLint GLShader = GetGLShader(s);\n    glAttachShader(Prog, GLShader);\n    if (Shaders[Shader_Vertex] && Shaders[Shader_Fragment])\n        Link();\n}\n\nvoid ShaderSet::UnsetShader(int stage)\n{\n    if (Shaders[stage] == NULL)\n        return;\n\n    GLint GLShader = GetGLShader(Shaders[stage]);\n    glDetachShader(Prog, GLShader);\n\n    Shaders[stage] = NULL;\n}\n\nbool ShaderSet::SetUniform(const char* name, int n, const float* v)\n{\n    for (unsigned int i = 0; i < UniformInfo.GetSize(); i++)\n        if (!strcmp(UniformInfo[i].Name.ToCStr(), name))\n        {\n            OVR_ASSERT(UniformInfo[i].Location >= 0);\n            glUseProgram(Prog);\n            switch (UniformInfo[i].Type)\n            {\n            case 1:   glUniform1fv(UniformInfo[i].Location, n, v); break;\n            case 2:   glUniform2fv(UniformInfo[i].Location, n/2, v); break;\n            case 3:   glUniform3fv(UniformInfo[i].Location, n/3, v); break;\n            case 4:   glUniform4fv(UniformInfo[i].Location, n/4, v); break;\n            case 12:  glUniformMatrix3fv(UniformInfo[i].Location, 1, 1, v); break;\n            case 16:  glUniformMatrix4fv(UniformInfo[i].Location, 1, 1, v); break;\n            default: OVR_ASSERT(0);\n            }\n            return 1;\n        }\n\n    OVR_DEBUG_LOG((\"Warning: uniform %s not present in selected shader\", name));\n    return 0;\n}\n\nbool ShaderSet::Link()\n{\n    glLinkProgram(Prog);\n    GLint r;\n    glGetProgramiv(Prog, GL_LINK_STATUS, &r);\n    if (!r)\n    {\n        GLchar msg[1024];\n        glGetProgramInfoLog(Prog, sizeof(msg), 0, msg);\n        OVR_DEBUG_LOG((\"Linking shaders failed: %s\\n\", msg));\n        if (!r)\n            return 0;\n    }\n    glUseProgram(Prog);\n\n    UniformInfo.Clear();\n    LightingVer = 0;\n    UsesLighting = 0;\n\n    GLint uniformCount = 0;\n    glGetProgramiv(Prog, GL_ACTIVE_UNIFORMS, &uniformCount);\n    OVR_ASSERT(uniformCount >= 0);\n\n    for(GLuint i = 0; i < (GLuint)uniformCount; i++)\n    {\n        GLsizei namelen;\n        GLint size = 0;\n        GLenum type;\n        GLchar name[32];\n        glGetActiveUniform(Prog, i, sizeof(name), &namelen, &size, &type, name);\n\n        if (size)\n        {\n            int l = glGetUniformLocation(Prog, name);\n            char *np = name;\n            while (*np)\n            {\n                if (*np == '[')\n                    *np = 0;\n                np++;\n            }\n            Uniform u;\n            u.Name = name;\n            u.Location = l;\n            u.Size = size;\n            switch (type)\n            {\n            case GL_FLOAT:      u.Type = 1; break;\n            case GL_FLOAT_VEC2: u.Type = 2; break;\n            case GL_FLOAT_VEC3: u.Type = 3; break;\n            case GL_FLOAT_VEC4: u.Type = 4; break;\n            case GL_FLOAT_MAT3: u.Type = 12; break;\n            case GL_FLOAT_MAT4: u.Type = 16; break;\n            default:\n                continue;\n            }\n            UniformInfo.PushBack(u);\n            if (!strcmp(name, \"LightCount\"))\n                UsesLighting = 1;\n        }\n        else\n            break;\n    }\n\n    ProjLoc = glGetUniformLocation(Prog, \"Proj\");\n    ViewLoc = glGetUniformLocation(Prog, \"View\");\n    for (int i = 0; i < 8; i++)\n    {\n        char texv[32];\n        OVR_sprintf(texv, 10, \"Texture%d\", i);\n        TexLoc[i] = glGetUniformLocation(Prog, texv);\n        if (TexLoc[i] < 0)\n            break;\n\n        glUniform1i(TexLoc[i], i);\n    }\n    if (UsesLighting)\n        OVR_ASSERT(ProjLoc >= 0 && ViewLoc >= 0);\n    return 1;\n}\n\nbool ShaderBase::SetUniform(const char* name, int n, const float* v)\n{\n    for(unsigned i = 0; i < UniformReflSize; i++)\n    {\n        if (!strcmp(UniformRefl[i].Name, name))\n        {\n            memcpy(UniformData + UniformRefl[i].Offset, v, n * sizeof(float));\n            return 1;\n        }\n    }\n    return 0;\n}\n\nbool ShaderBase::SetUniformBool(const char* name, int n, const bool* v) \n{\n    OVR_UNUSED(n);\n    for(unsigned i = 0; i < UniformReflSize; i++)\n    {\n        if (!strcmp(UniformRefl[i].Name, name))\n        {\n            memcpy(UniformData + UniformRefl[i].Offset, v, UniformRefl[i].Size);\n            return 1;\n        }\n    }\n    return 0;\n}\n\nvoid ShaderBase::InitUniforms(const Uniform* refl, size_t reflSize)\n{\n    UniformsSize = 0;\n    if (UniformData)\n    {\n        OVR_FREE(UniformData);\n        UniformData = 0;\n    }\n\n    if (!refl)\n    {\n        UniformRefl = NULL;\n        UniformReflSize = 0;\n        return; // no reflection data\n    }\n\n    UniformRefl = refl;\n    UniformReflSize = reflSize;\n    \n    UniformsSize = UniformRefl[UniformReflSize-1].Offset + UniformRefl[UniformReflSize-1].Size;\n    UniformData = (unsigned char*)OVR_ALLOC(UniformsSize);\n}\n\nTexture::Texture(RenderParams* rp, int w, int h) : IsUserAllocated(false), pParams(rp), TexId(0), Width(w), Height(h)\n{\n    if (w && h)\n        glGenTextures(1, &TexId);\n}\n\nTexture::~Texture()\n{\n    if (TexId && !IsUserAllocated)\n        glDeleteTextures(1, &TexId);\n}\n\nvoid Texture::Set(int slot, ShaderStage) const\n{\n    glActiveTexture(GL_TEXTURE0 + slot);\n    glBindTexture(GL_TEXTURE_2D, TexId);\n}\n\nvoid Texture::SetSampleMode(int sm)\n{\n    glBindTexture(GL_TEXTURE_2D, TexId);\n    switch (sm & Sample_FilterMask)\n    {\n    case Sample_Linear:\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n        if(GLE_EXT_texture_filter_anisotropic)\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);\n        break;\n\n    case Sample_Anisotropic:\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n        if(GLE_EXT_texture_filter_anisotropic)\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 8);\n        break;\n\n    case Sample_Nearest:\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n        if(GLE_EXT_texture_filter_anisotropic)\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);\n        break;\n    }\n\n    switch (sm & Sample_AddressMask)\n    {\n    case Sample_Repeat:\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n        break;\n\n    case Sample_Clamp:\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\n        break;\n\n    case Sample_ClampBorder:\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);\n        break;\n    }\n}\n\nvoid Texture::UpdatePlaceholderTexture(GLuint texId, const Sizei& textureSize)\n{\n    if (!IsUserAllocated && TexId && texId != TexId)\n        glDeleteTextures(1, &TexId);\n\n    TexId = texId;\n    Width = textureSize.w;\n    Height = textureSize.h;\n\n    IsUserAllocated = true;\n}\n\n\n\n\n\nContext::Context() : initialized(false), ownsContext(true), incarnation(0)\n{\n#if defined(OVR_OS_MAC)\n    systemContext = 0;\n#elif defined(OVR_OS_WIN32)\n    hdc = 0;\n    systemContext = 0;\n#elif defined(OVR_OS_LINUX)\n    x11Display = NULL;\n    x11Drawable = 0;\n    systemContext = 0;\n    memset(&x11Visual, 0, sizeof(x11Visual));\n#endif\n\n}\n\n// This destructor is mandatory for unique_ptr destruction on forward\n// declared MacContextImpl.\nContext::~Context() { }\n\nvoid Context::InitFromCurrent()\n{\n    Destroy();\n\n    initialized = true;\n    ownsContext = false;\n    incarnation++;\n\n#if defined(OVR_OS_MAC)\n    NSOpenGLContext* glctx = [NSOpenGLContext currentContext];\n#if !__has_feature(objc_arc)\n    // MacContextImpl *will* release all given resources. Retain reference.\n    [glctx retain];\n#endif\n    systemContext.reset(new MacContextImpl(glctx));\n#elif defined(OVR_OS_WIN32)\n    hdc = wglGetCurrentDC();\n    systemContext = wglGetCurrentContext();\n#elif defined(OVR_OS_LINUX)\n    x11Display = glXGetCurrentDisplay();\n    x11Drawable = glXGetCurrentDrawable();\n    systemContext = glXGetCurrentContext();\n    if (!SDKWindow::getVisualFromDrawable(x11Drawable, &x11Visual))\n    {\n        OVR::LogError(\"[Context] Unable to obtain x11 visual from context\");\n        memset(&x11Visual, 0, sizeof(x11Visual));\n    }\n#endif\n}\n\nvoid Context::CreateShared( Context & ctx )\n{\n    OVR_ASSERT( ctx.initialized == true );\n    if( ctx.initialized == false )\n    {\n        return;\n    }\n\n    Destroy();\n\n    initialized = true;\n    ownsContext = true;\n    incarnation++;\n\n#if defined(OVR_OS_MAC)\n    CGLContextObj shareCGL = (CGLContextObj)[ctx.systemContext->ctx CGLContextObj];\n    CGLPixelFormatObj sharePixelFormat = CGLGetPixelFormat(shareCGL);\n\n    NSOpenGLPixelFormat* nsOGLPixelFormat =\n        [[NSOpenGLPixelFormat alloc] initWithCGLPixelFormatObj:sharePixelFormat];\n    systemContext.reset(new MacContextImpl(\n        [[NSOpenGLContext alloc] initWithFormat:nsOGLPixelFormat shareContext:ctx.systemContext->ctx],\n        nsOGLPixelFormat));\n\n    SetSurface(ctx);\n#elif defined(OVR_OS_WIN32)\n    hdc = ctx.hdc;\n    systemContext = wglCreateContext( ctx.hdc );\n    BOOL success = wglShareLists(ctx.systemContext, systemContext );\n    OVR_ASSERT( success == TRUE );\n    OVR_UNUSED(success);\n#elif defined(OVR_OS_LINUX)\n    x11Display = ctx.x11Display;\n    x11Drawable = ctx.x11Drawable;\n    x11Visual = ctx.x11Visual;\n    systemContext = glXCreateContext( ctx.x11Display, &x11Visual, ctx.systemContext, True );\n    OVR_ASSERT( systemContext != NULL );\n#endif\n}\n\n#if defined(OVR_OS_MAC)\nvoid Context::SetSurface( Context & ctx )\n{\n    CGLContextObj cgl       = (CGLContextObj)[systemContext->ctx CGLContextObj];\n    CGLContextObj cglShared = (CGLContextObj)[ctx.systemContext->ctx CGLContextObj];\n\n    CGLError e = kCGLNoError;\n    CGSConnectionID cid, cid2;\n    CGSWindowID wid, wid2;\n    CGSSurfaceID sid, sid2;\n\n    e = CGLGetSurface(cglShared, &cid, &wid, &sid);\n    OVR_ASSERT(e == kCGLNoError); OVR_UNUSED(e);\n    e = CGLGetSurface(cgl, &cid2, &wid2, &sid2);\n    OVR_ASSERT(e == kCGLNoError); OVR_UNUSED(e);\n    if( sid && sid != sid2 )\n    {\n        e = CGLSetSurface(cgl, cid, wid, sid);\n        OVR_ASSERT(e == kCGLNoError); OVR_UNUSED(e);\n    }\n}\n#endif\n\nvoid Context::Destroy()\n{\n    if( initialized == false )\n    {\n        return;\n    }\n  \n    if (systemContext)\n    {\n#if defined(OVR_OS_MAC)\n        systemContext.reset();\n#elif defined(OVR_OS_WIN32)\n        BOOL success = wglDeleteContext( systemContext );\n        OVR_ASSERT( success == TRUE );\n        OVR_UNUSED( success );\n#elif defined(OVR_OS_LINUX)\n        glXDestroyContext( x11Display, systemContext );\n#endif\n\n        systemContext = NULL;\n    }\n  \n    initialized = false;\n    ownsContext = true;\n}\n\nvoid Context::Bind()\n{\n    if(systemContext)\n    {\n#if defined(OVR_OS_MAC)\n        glFlush(); //Apple doesn't automatically flush within CGLSetCurrentContext, unlike other platforms.\n        CGLContextObj cgl = (CGLContextObj)[systemContext->ctx CGLContextObj];\n        CGLSetCurrentContext(cgl);\n        // Consider the following instead of using CGLSetCurrentContext:\n        // [systemContext->ctx makeCurrentContext];\n#elif defined(OVR_OS_WIN32)\n        wglMakeCurrent( hdc, systemContext );\n#elif defined(OVR_OS_LINUX)\n        glXMakeCurrent( x11Display, x11Drawable, systemContext );\n#endif\n    }\n}\n\nvoid Context::Unbind()\n{\n#if defined(OVR_OS_MAC)\n    glFlush(); //Apple doesn't automatically flush within CGLSetCurrentContext, unlike other platforms.\n    CGLSetCurrentContext( NULL );\n#elif defined(OVR_OS_WIN32)\n    wglMakeCurrent( hdc, NULL );\n#elif defined(OVR_OS_LINUX)\n    glXMakeCurrent( x11Display, None, NULL );\n#endif\n}\n\n}}} // namespace OVR::CAPI::GL\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/GL/CAPI_GL_Util.h",
    "content": "/************************************************************************************\n\nFilename    :   CAPI_GL_Util.h\nContent     :   Utility header for OpenGL\nCreated     :   March 27, 2014\nAuthors     :   Andrew Reisse, David Borel\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_CAPI_GL_Util_h\n#define OVR_CAPI_GL_Util_h\n\n#include \"OVR_CAPI.h\"  \n#include \"Kernel/OVR_Array.h\"\n#include \"Kernel/OVR_RefCount.h\"\n#include \"Kernel/OVR_String.h\"\n#include \"Kernel/OVR_Types.h\"\n#include \"Kernel/OVR_Log.h\"\n#if defined(OVR_OS_WIN32)\n    #include \"Kernel/OVR_Win32_IncludeWindows.h\"\n#endif // OVR_OS_WIN32\n#include \"Extras/OVR_Math.h\"\n\n#if !defined(OVR_DISABLE_GLE)   // By default we use the GLE module in order to link to OpenGL functions. However, if an external user \n#include \"GL/CAPI_GLE.h\"           // wants to use an alternative mechanism to connect to OpenGL functions, they can #define OVR_DISABLE_GLE.\n#endif\n\n\n#if defined(OVR_OS_MAC)\n    #include <memory>\n    #include <CoreGraphics/CGDirectDisplay.h>\n    #include <OpenGL/CGLTypes.h>\n    class MacContextImpl;\n#endif\n\n\nnamespace OVR\n{\n    // Get the shared LibOVR GLEContext instance.\n    class GLEContext;\n    GLEContext* GetGLEContext();\n}\n\nnamespace OVR { namespace CAPI { namespace GL {\nvoid InitGLExtensions();\n\n\n// Rendering primitive type used to render Model.\nenum PrimitiveType\n{\n    Prim_Triangles,\n    Prim_Lines,\n    Prim_TriangleStrip,\n    Prim_Unknown,\n    Prim_Count\n};\n\n// Types of shaders that can be stored together in a ShaderSet.\nenum ShaderStage\n{\n    Shader_Vertex   = 0,\n    Shader_Fragment = 2,\n    Shader_Pixel    = 2,\n    Shader_Count    = 3,\n};\n\nenum MapFlags\n{\n    Map_Discard        = 1,\n    Map_Read           = 2, // do not use\n    Map_Unsynchronized = 4, // like D3D11_MAP_NO_OVERWRITE\n};\n\n\n// Buffer types used for uploading geometry & constants.\nenum BufferUsage\n{\n    Buffer_Unknown  = 0,\n    Buffer_Vertex   = 1,\n    Buffer_Index    = 2,\n    Buffer_Uniform  = 4,\n    Buffer_TypeMask = 0xff,\n    Buffer_ReadOnly = 0x100, // Buffer must be created with Data().\n};\n\nenum TextureFormat\n{\n    Texture_RGBA            = 0x0100,\n    Texture_Depth           = 0x8000,\n    Texture_TypeMask        = 0xff00,\n    Texture_SamplesMask     = 0x00ff,\n    Texture_RenderTarget    = 0x10000,\n    Texture_GenMipmaps      = 0x20000,\n};\n\n// Texture sampling modes.\nenum SampleMode\n{\n    Sample_Linear       = 0,\n    Sample_Nearest      = 1,\n    Sample_Anisotropic  = 2,\n    Sample_FilterMask   = 3,\n\n    Sample_Repeat       = 0,\n    Sample_Clamp        = 4,\n    Sample_ClampBorder  = 8, // If unsupported Clamp is used instead.\n    Sample_AddressMask  =12,\n\n    Sample_Count        =13,\n};\n\n\n// Rendering parameters/pointers describing GL rendering setup.\nstruct RenderParams\n{\n#if defined(OVR_OS_WIN32)\n    HWND   Window;\n    HDC    DC;\n#elif defined(OVR_OS_LINUX)\n    struct _XDisplay* Disp;\n#endif\n\n    ovrSizei    BackBufferSize;\n    int    Multisample;\n};\n\n\nclass Buffer : public RefCountBase<Buffer>\n{\npublic:\n    RenderParams* pParams;\n    size_t        Size;\n    GLenum        Use;\n    GLuint        GLBuffer;\n\npublic:\n    Buffer(RenderParams* r);\n    ~Buffer();\n\n    GLuint         GetBuffer() { return GLBuffer; }\n\n    virtual size_t GetSize() { return Size; }\n    virtual void*  Map(size_t start, size_t size, int flags = 0);\n    virtual bool   Unmap(void *m);\n    virtual bool   Data(int use, const void* buffer, size_t size);\n};\n\nclass Texture : public RefCountBase<Texture>\n{\n\tbool IsUserAllocated;\n\npublic:\n    RenderParams* pParams;\n    GLuint        TexId;\n    int           Width, Height;\n\n    Texture(RenderParams* rp, int w, int h);\n    ~Texture();\n\n    virtual int GetWidth() const { return Width; }\n    virtual int GetHeight() const { return Height; }\n\n    virtual void SetSampleMode(int sm);\n\n    // Updates texture to point to specified resources\n    //  - used for slave rendering.\n    void UpdatePlaceholderTexture(GLuint texId,\n                                  const Sizei& textureSize);\n\n    virtual void Set(int slot, ShaderStage stage = Shader_Fragment) const;\n};\n\n// Base class for vertex and pixel shaders. Stored in ShaderSet.\nclass Shader : public RefCountBase<Shader>\n{\n    friend class ShaderSet;\n\nprotected:\n    ShaderStage Stage;\n\npublic:\n    Shader(ShaderStage s) : Stage(s) {}\n    virtual ~Shader() {}\n\n    ShaderStage GetStage() const { return Stage; }\n\n    virtual void Set(PrimitiveType) const { }\n    virtual void SetUniformBuffer(class Buffer* buffers, int i = 0) { OVR_UNUSED2(buffers, i); }\n\nprotected:\n    virtual bool SetUniform(const char* name, int n, const float* v) { OVR_UNUSED3(name, n, v); return false; }\n    virtual bool SetUniformBool(const char* name, int n, const bool* v) { OVR_UNUSED3(name, n, v); return false; }\n};\n\n\n\n// A group of shaders, one per stage.\n// A ShaderSet is applied for rendering with a given fill.\nclass ShaderSet : public RefCountBase<ShaderSet>\n{\nprotected:\n    Ptr<Shader> Shaders[Shader_Count];\n\n    struct Uniform\n    {\n        String Name;\n        int    Location, Size;\n        int    Type; // currently number of floats in vector\n\n        Uniform() : Name(), Location(0), Size(0), Type(0){}\n    };\n    Array<Uniform> UniformInfo;\n\t\npublic:\n\tGLuint    Prog;\n    GLint     ProjLoc, ViewLoc;\n    GLint     TexLoc[8];\n    bool      UsesLighting;\n    int       LightingVer;\n\n    ShaderSet();\n    ~ShaderSet();\n\n    virtual void SetShader(Shader *s);\n    virtual void UnsetShader(int stage);\n    Shader* GetShader(int stage) { return Shaders[stage]; }\n\n    virtual void Set(PrimitiveType prim) const\n    {\n\t\tglUseProgram(Prog);\n\n        for (int i = 0; i < Shader_Count; i++)\n            if (Shaders[i])\n                Shaders[i]->Set(prim);\n    }\n\n    // Set a uniform (other than the standard matrices). It is undefined whether the\n    // uniforms from one shader occupy the same space as those in other shaders\n    // (unless a buffer is used, then each buffer is independent).     \n    virtual bool SetUniform(const char* name, int n, const float* v);\n    bool SetUniform1f(const char* name, float x)\n    {\n        const float v[] = {x};\n        return SetUniform(name, 1, v);\n    }\n    bool SetUniform2f(const char* name, float x, float y)\n    {\n        const float v[] = {x,y};\n        return SetUniform(name, 2, v);\n    }\n    bool SetUniform3f(const char* name, float x, float y, float z)\n    {\n        const float v[] = {x,y,z};\n        return SetUniform(name, 3, v);\n    }\n    bool SetUniform4f(const char* name, float x, float y, float z, float w = 1)\n    {\n        const float v[] = {x,y,z,w};\n        return SetUniform(name, 4, v);\n    }\n\n    bool SetUniformv(const char* name, const Vector3f& v)\n    {\n        const float a[] = {v.x,v.y,v.z,1};\n        return SetUniform(name, 4, a);\n    }\n \n    virtual bool SetUniform4x4f(const char* name, const Matrix4f& m)\n    {\n        Matrix4f mt = m.Transposed();\n        return SetUniform(name, 16, &mt.M[0][0]);\n    }\n\n    virtual bool SetUniform3x3f(const char* name, const Matrix4f& m)\n    {\n        Matrix4f mt = m.Transposed();\n        // float3x3 is actually stored the same way as float4x3, with the last items ignored by the code.\n        return SetUniform(name, 12, &mt.M[0][0]);\n    }\n\n\nprotected:\n\tGLint GetGLShader(Shader* s);\n    bool Link();\n};\n\n\n// Fill combines a ShaderSet (vertex, pixel) with textures, if any.\n// Every model has a fill.\nclass ShaderFill : public RefCountBase<ShaderFill>\n{\n    Ptr<ShaderSet>     Shaders;\n    Ptr<class Texture> Textures[8];\n    void*              InputLayout; // HACK this should be abstracted\n\npublic:\n    ShaderFill(ShaderSet* sh) : Shaders(sh) { InputLayout = NULL; }\n    ShaderFill(ShaderSet& sh) : Shaders(sh) { InputLayout = NULL; }    \n\n    ShaderSet*  GetShaders() const      { return Shaders; }\n    void*       GetInputLayout() const  { return InputLayout; }\n\n    virtual void Set(PrimitiveType prim = Prim_Unknown) const {\n\t\tShaders->Set(prim);\n\t\tfor(int i = 0; i < 8; i++)\n\t\t{\n\t\t\tif(Textures[i])\n\t\t\t{\n\t\t\t\tTextures[i]->Set(i);\n\t\t\t}\n\t\t}\n\t}\n\n    virtual void SetTexture(int i, class Texture* tex) { if (i < 8) Textures[i] = tex; }\n};\n\n    \nstruct DisplayId\n{\n    // Windows\n    String MonitorName; // Monitor name for fullscreen mode\n    \n    // MacOS\n    long   CgDisplayId; // CGDirectDisplayID\n    \n    DisplayId() : CgDisplayId(0) {}\n    DisplayId(long id) : CgDisplayId(id) {}\n    DisplayId(String m, long id=0) : MonitorName(m), CgDisplayId(id) {}\n    \n    operator bool () const\n    {\n        return MonitorName.GetLength() || CgDisplayId;\n    }\n    \n    bool operator== (const DisplayId& b) const\n    {\n        return CgDisplayId == b.CgDisplayId &&\n            (strstr(MonitorName.ToCStr(), b.MonitorName.ToCStr()) ||\n             strstr(b.MonitorName.ToCStr(), MonitorName.ToCStr()));\n    }\n};\n\n\nclass ShaderBase : public Shader\n{\npublic:    \n    RenderParams*   pParams;\n    unsigned char*  UniformData;\n    int             UniformsSize;\n\n\tenum VarType\n\t{\n\t\tVARTYPE_FLOAT,\n\t\tVARTYPE_INT,\n\t\tVARTYPE_BOOL,\n\t};\n\n\tstruct Uniform\n\t{\n\t\tconst char* Name;\n\t\tVarType     Type;\n        int         Offset;\n        int         Size;\n\t};\n\n    const Uniform*  UniformRefl;\n    size_t          UniformReflSize;\n\n\tShaderBase(RenderParams* rp, ShaderStage stage) :\n        Shader(stage),\n        pParams(rp),\n        UniformData(NULL),\n        UniformsSize(0),\n        UniformRefl(NULL),\n        UniformReflSize(0)\n    {\n    }\n\t~ShaderBase()\n\t{\n        if (UniformData)\n        {\n            OVR_FREE(UniformData);\n            UniformData = NULL;\n        }\n\n        // Do not need to free UniformRefl\n        UniformRefl = NULL;\n\t}\n\n    void InitUniforms(const Uniform* refl, size_t reflSize);\n\tbool SetUniform(const char* name, int n, const float* v);\n\tbool SetUniformBool(const char* name, int n, const bool* v);\n};\n\n\ntemplate<ShaderStage SStage, GLenum SType>\nclass ShaderImpl : public ShaderBase\n{\n    friend class ShaderSet;\n\npublic:\n    ShaderImpl(RenderParams* rp, void* s, size_t size, const Uniform* refl, size_t reflSize)\n\t\t: ShaderBase(rp, SStage)\n\t\t, GLShader(0)\n    {\n\t\tbool success;\n        OVR_UNUSED(size);\n        success = Compile((const char*) s);\n        OVR_ASSERT(success);\n        OVR_UNUSED(success);\n\t\tInitUniforms(refl, reflSize);\n    }\n    ~ShaderImpl()\n    {      \n\t\tif (GLShader)\n\t\t{\n\t\t\tglDeleteShader(GLShader);\n\t\t\tGLShader = 0;\n\t\t}\n    }\n    bool Compile(const char* src)\n\t{\n\t\tif (!GLShader)\n\t\t\tGLShader = glCreateShader(GLStage());\n\n\t\tglShaderSource(GLShader, 1, &src, 0);\n\t\tglCompileShader(GLShader);\n\t\tGLint r;\n\t\tglGetShaderiv(GLShader, GL_COMPILE_STATUS, &r);\n\t\tif (!r)\n\t\t{\n\t\t\tGLchar msg[1024];\n\t\t\tglGetShaderInfoLog(GLShader, sizeof(msg), 0, msg);\n\t\t\tif (msg[0])\n\t\t\t\tOVR_DEBUG_LOG((\"Compiling shader\\n%s\\nfailed: %s\\n\", src, msg));\n\n\t\t\treturn 0;\n\t\t}\n\t\treturn 1;\n\t}\n\t\n    GLenum GLStage() const\n    {\n\t\treturn SType;\n\t}\n\nprivate:\n\tGLuint GLShader;\n};\n\ntypedef ShaderImpl<Shader_Vertex,  GL_VERTEX_SHADER> VertexShader;\ntypedef ShaderImpl<Shader_Fragment, GL_FRAGMENT_SHADER> FragmentShader;\n\n\n\n// Allows us to have independent OpenGL contexts for our systems.\nclass Context\n{\n    bool                initialized;\n    bool                ownsContext;\n    int                 incarnation;\n#if defined(OVR_OS_WIN32)\n    HDC                 hdc;\n    HGLRC               systemContext;\n#elif defined(OVR_OS_LINUX)\n    Display            *x11Display;\n    GLXDrawable         x11Drawable;\n    GLXContext          systemContext;\n    XVisualInfo         x11Visual;\n#elif defined(OVR_OS_MAC)\n    std::unique_ptr<MacContextImpl>    systemContext;\n#endif\n\npublic:\n\n    Context();\n    ~Context();\n    void InitFromCurrent();\n    void CreateShared( Context & ctx );\n#if defined(OVR_OS_MAC)\n    void SetSurface( Context & ctx );\n#endif\n    void Destroy();\n    void Bind();\n    void Unbind();\n    int  GetIncarnation() const { return incarnation; }\n\n};\n\n\n// AutoContext\n//\n// Implements a common sequence of function calls with the Context class.\n// See the AutoContext constructor below for what it does. \n//\n// Example usage:\n//     void SomeClass::Draw()\n//     {\n//         AutoContext autoContext(someClassContext);\n//\n//         <draw calls>\n//     }\n\nstruct AutoContext\n{\n    Context  savedCurrentContext;\n    Context& ourContext;\n\n    AutoContext(Context& context) :\n        savedCurrentContext(), ourContext(context)\n    {\n        // We use a member savedCurrentContext which is initialized here, as opposed to having the user pass in a \n        // pre-existing Context (which the user could declare as a global or C++ member variable). We have to do this\n        // because if we were to use some pre-existing Context the app might delete its underlying GL context behind our back\n        // or associate it with another thread, which would cause our bind of it in our dtor to be a bad operation.\n        savedCurrentContext.InitFromCurrent();\n        if(ourContext.GetIncarnation() == 0) // If not yet initialized...\n            ourContext.CreateShared(savedCurrentContext);\n        ourContext.Bind();\n        #if defined(OVR_OS_MAC) // To consider: merge the following into the Bind function.\n            ourContext.SetSurface(savedCurrentContext);\n        #endif\n    }\n\n   ~AutoContext()\n    {\n        savedCurrentContext.Bind();\n    }\n\n    OVR_NON_COPYABLE(AutoContext)\n};\n\n\n}}} // namespace OVR::CAPI::GL\n\n\n#endif // OVR_CAPI_GL_Util_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/Textures/healthAndSafety.tga.h",
    "content": "const uint8_t healthAndSafety_tga[107525] = {\n   0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x20,0x08,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc7,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x52,0x52,0x52,0xbd,\n   0x9f,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x00,0xb3,0x82,0x7e,\n   0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x8c,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xc6,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0x9d,0x00,\n   0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0xfc,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,\n   0x84,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x8a,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc6,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x9d,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xfb,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,\n   0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x89,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc6,0x00,0x00,0x00,0xb3,0x05,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xe6,0xe6,\n   0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x9d,0x00,0x00,0x00,0xb3,0x05,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,\n   0xff,0xff,0xff,0xff,0xd2,0xd2,0xd2,0xe6,0xfc,0x00,0x00,0x00,0xb3,0x05,0xef,0xef,0xef,0xf5,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,\n   0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x88,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x96,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,\n   0xc7,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,\n   0x7e,0x7e,0xc7,0x00,0x52,0x52,0x52,0xbd,0x89,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x91,0x00,0x00,0x00,0xb3,0x00,\n   0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x95,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,\n   0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x8a,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,\n   0x00,0x33,0x33,0x33,0xb8,0x83,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x8b,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,\n   0x7e,0xc7,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x99,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,\n   0x7e,0x7e,0x7e,0xc7,0x9b,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,\n   0x86,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,\n   0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x00,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x01,\n   0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x04,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0xef,0xef,\n   0xef,0xf5,0x83,0xff,0xff,0xff,0xff,0x03,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0x83,0xff,0xff,0xff,0xff,0x01,0xef,0xef,\n   0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0x86,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xd2,0xd2,0xd2,0xe6,0x81,0xff,\n   0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x88,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x04,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,\n   0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x89,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x81,0x00,0x00,\n   0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x01,0x6a,\n   0x6a,0x6a,0xc2,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,\n   0x01,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,\n   0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,\n   0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,\n   0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,\n   0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,\n   0xaf,0xd6,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x6a,\n   0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x05,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xd2,\n   0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x84,0x00,0x00,\n   0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0x00,\n   0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x87,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x33,0x33,\n   0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,\n   0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x88,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,\n   0x84,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x85,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x86,0x00,0x00,0x00,\n   0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,\n   0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,0xc7,0x00,0x00,\n   0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x85,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x86,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xfe,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0xbb,0xbb,0xbb,0xdc,0x33,0x33,\n   0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x03,0xa0,0xa0,0xa0,0xd1,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x03,0xdc,0xdc,\n   0xdc,0xeb,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,\n   0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,\n   0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xd2,0xd2,\n   0xd2,0xe6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,\n   0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x85,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,\n   0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,\n   0xdc,0xeb,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,\n   0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,\n   0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xd2,\n   0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,\n   0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x02,0x6a,\n   0x6a,0x6a,0xc2,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x84,0xaf,0xaf,0xaf,0xd6,0x05,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,\n   0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x02,0x7e,0x7e,0x7e,0xc7,0xbb,0xbb,0xbb,0xdc,0xe6,0xe6,0xe6,0xf0,0x82,0xff,\n   0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x90,0x90,0x90,0xcc,\n   0x7e,0x7e,0x7e,0xc7,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,\n   0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x87,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0xaf,0xaf,0xaf,0xd6,\n   0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x01,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x01,0xff,0xff,0xff,0xff,0xc7,0xc7,0xc7,\n   0xe1,0x87,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,\n   0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,\n   0x03,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xaf,0xaf,0xaf,0xd6,\n   0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x85,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xbb,\n   0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,\n   0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x06,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,\n   0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0xaf,0xaf,0xaf,0xd6,0x01,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,\n   0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,\n   0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,\n   0x03,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x84,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x86,0x00,0x00,0x00,0xb3,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,\n   0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,\n   0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,\n   0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xe6,0xe6,\n   0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,\n   0x81,0xff,0xff,0xff,0xff,0x09,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xbb,0xbb,\n   0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,\n   0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x87,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,\n   0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x04,\n   0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x87,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,\n   0xb3,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x7e,0x7e,0x7e,0xc7,\n   0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,\n   0xdc,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x52,0x52,0x52,\n   0xbd,0x88,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,\n   0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,\n   0xd2,0xd2,0xd2,0xe6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,\n   0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,\n   0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x04,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,\n   0x03,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xa0,0xa0,0xa0,0xd1,0x87,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x05,0xaf,0xaf,\n   0xaf,0xd6,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,\n   0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x04,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x82,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x05,0x7e,0x7e,\n   0x7e,0xc7,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0x52,0x52,0x52,0xbd,0xbb,0xbb,0xbb,0xdc,\n   0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0x6a,0x6a,0x6a,0xc2,\n   0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x05,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,\n   0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,\n   0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,\n   0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0xc7,0xc7,0xc7,0xe1,\n   0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0x7e,\n   0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x0a,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xe6,\n   0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x03,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x03,0x52,0x52,0x52,0xbd,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x08,0xaf,0xaf,0xaf,0xd6,0x52,\n   0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,\n   0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x05,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,\n   0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0x33,0x33,0x33,0xb8,0x85,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,\n   0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x02,0xe6,\n   0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x85,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,\n   0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xaf,0xaf,0xaf,0xd6,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x05,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,\n   0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x01,\n   0xd2,0xd2,0xd2,0xe6,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x09,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,\n   0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x03,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x81,\n   0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,\n   0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x0a,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,\n   0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x85,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x84,0xff,0xff,0xff,\n   0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,\n   0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,\n   0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x08,0x00,0x00,\n   0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xe6,0xe6,\n   0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x84,0x00,0x00,0x00,0xb3,0x86,0xff,0xff,0xff,0xff,0x02,0x00,\n   0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x86,0x00,0x00,0x00,0xb3,0x04,0x33,0x33,0x33,0xb8,0xf7,\n   0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0xe6,\n   0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xa0,\n   0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,\n   0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,\n   0xd1,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,\n   0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,\n   0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,\n   0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,\n   0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x03,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0x81,0x00,\n   0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x06,\n   0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,\n   0xb3,0x01,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x86,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,\n   0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,\n   0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0xa0,0xa0,0xa0,0xd1,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x03,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x00,0x00,\n   0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x02,0xd2,0xd2,0xd2,0xe6,0xdc,0xdc,0xdc,0xeb,0xc7,0xc7,\n   0xc7,0xe1,0x85,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,\n   0x0b,0xd2,0xd2,0xd2,0xe6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,\n   0xfa,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,0x00,0xb3,\n   0x00,0x52,0x52,0x52,0xbd,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x01,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,\n   0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x06,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,\n   0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xd2,0xd2,0xd2,0xe6,0x52,0x52,0x52,0xbd,0x83,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,\n   0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x05,0xbb,0xbb,0xbb,0xdc,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,\n   0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,\n   0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x52,0x52,\n   0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,\n   0x81,0xdc,0xdc,0xdc,0xeb,0x01,0x52,0x52,0x52,0xbd,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,\n   0xe6,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x83,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,\n   0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xc7,\n   0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,\n   0x01,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,\n   0xca,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa0,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0xa5,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xaa,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x91,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0x93,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0xcb,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa0,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,\n   0xaf,0xd6,0xa5,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xaa,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x91,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0x93,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,\n   0x87,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0xcb,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa0,0x00,0x00,0x00,0xb3,0x00,0x33,\n   0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x52,0x52,0x52,0xbd,0xa5,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xaa,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x91,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x93,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0x01,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x85,0xdc,0xdc,0xdc,0xeb,0x01,0xaf,0xaf,0xaf,0xd6,0x52,0x52,0x52,0xbd,0xcc,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xca,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xaa,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x91,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x93,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd6,0x00,0x00,\n   0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0xca,0x00,0x00,0x00,0xb3,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0xaa,0x00,0x00,0x00,0xb3,\n   0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x91,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x93,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x8f,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb4,0xf1,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd6,0x00,0x00,0x00,0xb3,0xc3,0x00,0x00,0x00,0xb4,0xff,0x01,0x00,0x00,0xb4,\n   0xdb,0x01,0x00,0x00,0xb4,0xc3,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xb5,0x00,0x00,0x00,0xb3,0x82,0x00,0x00,0x00,0xb4,0x8b,0x00,0x00,0x00,0xb3,0x97,0x00,0x00,0x00,0xb4,0x92,0x01,0x00,0x00,0xb4,0x91,0x01,0x00,0x00,\n   0xb5,0x8c,0x01,0x01,0x00,0xb5,0xff,0x01,0x01,0x01,0xb6,0xf3,0x01,0x01,0x01,0xb6,0x8c,0x01,0x01,0x00,0xb5,0x91,0x01,0x00,0x00,0xb5,0x92,0x01,0x00,0x00,0xb4,0x97,\n   0x00,0x00,0x00,0xb4,0x8b,0x00,0x00,0x00,0xb3,0x82,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa3,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa8,0x00,0x00,0x00,0xb3,0x9b,0x00,0x00,0x00,0xb4,0x8e,0x01,0x00,0x00,0xb4,0x88,0x01,0x00,0x00,0xb5,0x81,0x01,0x01,0x00,0xb5,\n   0x8f,0x01,0x01,0x01,0xb6,0x00,0x01,0x01,0x01,0xb7,0x8b,0x02,0x01,0x01,0xb7,0xa8,0x02,0x01,0x01,0xb8,0x00,0x02,0x02,0x01,0xb9,0x81,0x03,0x02,0x01,0xb9,0x82,0x02,\n   0x02,0x01,0xb9,0x82,0x03,0x02,0x01,0xb9,0x83,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,\n   0xb9,0x00,0x03,0x02,0x01,0xb9,0x85,0x02,0x02,0x01,0xb9,0x02,0x03,0x02,0x01,0xb9,0x02,0x02,0x01,0xb9,0x03,0x02,0x01,0xb9,0x82,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,\n   0x01,0xb9,0x82,0x02,0x02,0x01,0xb9,0x81,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x04,0x03,0x02,0x01,0xb9,0x02,0x02,0x01,0xb9,0x03,0x02,0x01,0xb9,0x02,0x02,\n   0x01,0xb9,0x03,0x02,0x01,0xb9,0x84,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x83,0x02,0x02,0x01,0xb9,0x00,\n   0x03,0x02,0x01,0xb9,0x85,0x02,0x02,0x01,0xb9,0x81,0x03,0x02,0x01,0xb9,0x82,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x83,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,\n   0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x81,0x03,0x02,0x01,0xb9,0x02,0x02,0x02,0x01,0xb9,0x03,0x02,0x01,0xb9,0x02,0x02,0x01,0xb9,0x81,0x03,0x02,0x01,0xb9,0x81,0x02,\n   0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x8d,0x02,0x02,0x01,0xb9,0x01,0x03,0x02,0x01,0xb9,0x02,0x02,0x01,0xb9,\n   0x81,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x82,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x87,0x02,0x02,0x01,0xb9,0x81,0x03,\n   0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x83,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x87,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,\n   0xb9,0x85,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x85,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x84,\n   0x02,0x02,0x01,0xb9,0x82,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x82,0x02,0x02,0x01,0xb9,0x01,0x03,0x02,0x01,0xb9,0x02,0x02,0x01,\n   0xb9,0x82,0x03,0x02,0x01,0xb9,0x83,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x8b,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x82,0x02,0x02,0x01,0xb9,0x8d,\n   0x02,0x01,0x01,0xb8,0x00,0x02,0x02,0x01,0xb8,0x90,0x02,0x01,0x01,0xb8,0x00,0x02,0x02,0x01,0xb8,0x87,0x02,0x01,0x01,0xb8,0x8b,0x02,0x01,0x01,0xb7,0x00,0x01,0x01,\n   0x01,0xb7,0x8f,0x01,0x01,0x01,0xb6,0x81,0x01,0x01,0x00,0xb5,0x88,0x01,0x00,0x00,0xb5,0x8e,0x01,0x00,0x00,0xb4,0x9b,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0x96,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa6,0x00,0x00,0x00,0xb3,0x91,0x00,0x00,0x00,0xb4,0x87,0x01,\n   0x00,0x00,0xb4,0x85,0x01,0x00,0x00,0xb5,0x88,0x01,0x01,0x00,0xb5,0x86,0x01,0x01,0x01,0xb6,0x81,0x01,0x01,0x01,0xb7,0x86,0x02,0x01,0x01,0xb7,0x83,0x02,0x01,0x01,\n   0xb8,0x00,0x02,0x02,0x01,0xb8,0x86,0x02,0x01,0x01,0xb8,0x83,0x02,0x02,0x01,0xb9,0x81,0x03,0x02,0x01,0xb9,0x89,0x03,0x02,0x01,0xba,0x82,0x03,0x02,0x02,0xbb,0x00,\n   0x03,0x02,0x01,0xbb,0x8c,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x02,0xbc,0x8d,0x04,0x02,0x02,0xbc,0xff,0x04,0x03,0x02,0xbd,0xd9,0x04,0x03,0x02,0xbd,0x85,0x04,0x02,\n   0x02,0xbc,0x00,0x04,0x03,0x02,0xbc,0x86,0x04,0x02,0x02,0xbc,0x00,0x03,0x02,0x02,0xbc,0x87,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x01,0xbb,0x87,0x03,0x02,0x02,0xbb,\n   0x89,0x03,0x02,0x01,0xba,0x00,0x03,0x02,0x01,0xb9,0x84,0x02,0x02,0x01,0xb9,0x8b,0x02,0x01,0x01,0xb8,0x86,0x02,0x01,0x01,0xb7,0x81,0x01,0x01,0x01,0xb7,0x86,0x01,\n   0x01,0x01,0xb6,0x88,0x01,0x01,0x00,0xb5,0x85,0x01,0x00,0x00,0xb5,0x87,0x01,0x00,0x00,0xb4,0x91,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0x94,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x9d,0x00,0x00,0x00,0xb3,0x92,0x00,0x00,0x00,0xb4,0x88,0x01,0x00,0x00,0xb4,0x84,\n   0x01,0x00,0x00,0xb5,0x86,0x01,0x01,0x00,0xb5,0x83,0x01,0x01,0x01,0xb6,0x01,0x02,0x01,0x01,0xb7,0x01,0x01,0x01,0xb7,0x85,0x02,0x01,0x01,0xb7,0x86,0x02,0x01,0x01,\n   0xb8,0x82,0x02,0x02,0x01,0xb9,0x82,0x03,0x02,0x01,0xb9,0x83,0x03,0x02,0x01,0xba,0x00,0x03,0x02,0x01,0xbb,0x82,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x01,0xbb,0x83,\n   0x03,0x02,0x02,0xbb,0x81,0x03,0x02,0x02,0xbc,0x01,0x04,0x02,0x02,0xbc,0x03,0x02,0x02,0xbc,0x84,0x04,0x02,0x02,0xbc,0x88,0x04,0x03,0x02,0xbd,0x01,0x04,0x03,0x02,\n   0xbe,0x05,0x03,0x02,0xbe,0x85,0x04,0x03,0x02,0xbe,0x00,0x04,0x03,0x02,0xbf,0x85,0x05,0x03,0x02,0xbf,0x85,0x05,0x03,0x02,0xc0,0x00,0x05,0x04,0x01,0xc0,0x81,0x05,\n   0x03,0x02,0xc0,0x00,0x05,0x03,0x03,0xc0,0x8d,0x05,0x04,0x03,0xc0,0x00,0x06,0x04,0x03,0xc1,0x83,0x05,0x04,0x03,0xc1,0x02,0x06,0x04,0x03,0xc1,0x05,0x04,0x03,0xc1,\n   0x05,0x04,0x01,0xc1,0x81,0x05,0x04,0x03,0xc1,0x81,0x06,0x04,0x03,0xc1,0x05,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x05,\n   0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x82,0x05,0x04,0x03,0xc1,0x00,0x05,0x04,0x01,0xc1,0x81,0x05,0x04,0x03,0xc1,0x00,0x06,0x04,0x03,0xc1,0x83,0x05,0x04,0x03,0xc1,\n   0x00,0x06,0x04,0x03,0xc1,0x83,0x05,0x04,0x03,0xc1,0x00,0x05,0x04,0x01,0xc1,0x81,0x05,0x04,0x03,0xc1,0x00,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,0xc1,0x02,0x06,\n   0x04,0x03,0xc1,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,0xc1,0x02,0x06,0x04,0x03,0xc1,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x82,0x05,0x04,\n   0x03,0xc1,0x00,0x06,0x04,0x03,0xc1,0x82,0x05,0x04,0x03,0xc1,0xd9,0x06,0x04,0x03,0xc2,0x05,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x05,0x04,0x03,0xc1,0x06,0x04,\n   0x03,0xc1,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x83,0x05,0x04,0x03,0xc1,0x02,0x06,0x04,0x03,0xc1,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,\n   0xc1,0x00,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,0xc1,0x00,0x06,0x04,0x03,0xc1,0x82,0x05,0x04,0x03,0xc1,0x00,0x06,0x04,0x03,0xc1,0x82,0x05,0x04,0x03,0xc1,0x01,\n   0x05,0x04,0x01,0xc1,0x05,0x04,0x03,0xc1,0x82,0x06,0x04,0x03,0xc1,0x00,0x05,0x04,0x03,0xc1,0x81,0x06,0x04,0x03,0xc1,0x03,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,\n   0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x85,0x05,0x04,0x03,0xc1,0x00,0x05,0x04,0x01,0xc1,0x81,0x05,0x04,0x03,0xc1,0x01,0x06,0x04,0x03,0xc1,0x05,0x04,0x03,0xc1,\n   0x81,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,0xc1,0x81,0x06,0x04,0x03,0xc1,0x8d,0x05,0x04,0x03,0xc0,0x00,0x05,0x03,0x03,0xc0,0x81,0x05,0x03,0x02,0xc0,0x00,0x05,\n   0x04,0x01,0xc0,0x85,0x05,0x03,0x02,0xc0,0x85,0x05,0x03,0x02,0xbf,0x00,0x04,0x03,0x02,0xbf,0x81,0x04,0x03,0x02,0xbe,0x82,0x05,0x03,0x02,0xbe,0x02,0x04,0x03,0x02,\n   0xbe,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x88,0x04,0x03,0x02,0xbd,0x84,0x04,0x02,0x02,0xbc,0x82,0x03,0x02,0x02,0xbc,0x00,0x04,0x02,0x02,0xbc,0x88,0x03,0x02,\n   0x02,0xbb,0x83,0x03,0x02,0x01,0xba,0x82,0x03,0x02,0x01,0xb9,0x82,0x02,0x02,0x01,0xb9,0x86,0x02,0x01,0x01,0xb8,0x85,0x02,0x01,0x01,0xb7,0x81,0x01,0x01,0x01,0xb7,\n   0x83,0x01,0x01,0x01,0xb6,0x86,0x01,0x01,0x00,0xb5,0x84,0x01,0x00,0x00,0xb5,0x88,0x01,0x00,0x00,0xb4,0x92,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0x8b,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x9b,0x00,0x00,0x00,0xb3,0x91,0x00,0x00,0x00,0xb4,0x87,0x01,0x00,0x00,\n   0xb4,0x82,0x01,0x00,0x00,0xb5,0x81,0x01,0x01,0x00,0xb5,0x89,0x01,0x01,0x01,0xb6,0x81,0x02,0x01,0x01,0xb7,0x8a,0x02,0x01,0x01,0xb8,0x81,0x02,0x02,0x01,0xb9,0x81,\n   0x03,0x02,0x01,0xb9,0x84,0x03,0x02,0x01,0xba,0x83,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x02,0xbc,0x85,0x04,0x02,0x02,0xbc,0x84,0x04,0x03,0x02,0xbd,0x01,0x04,0x03,\n   0x02,0xbe,0x05,0x03,0x02,0xbe,0x81,0x04,0x03,0x02,0xbe,0x81,0x05,0x03,0x02,0xbe,0x82,0x04,0x03,0x02,0xbe,0x00,0x04,0x03,0x02,0xbf,0x81,0x05,0x03,0x02,0xbf,0x82,\n   0x05,0x03,0x02,0xc0,0x00,0x05,0x04,0x03,0xc0,0x81,0x05,0x04,0x03,0xc1,0x02,0x06,0x04,0x03,0xc1,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x85,0x05,0x04,0x03,0xc1,\n   0x87,0x06,0x04,0x03,0xc2,0x86,0x06,0x04,0x03,0xc3,0x86,0x06,0x04,0x03,0xc4,0x81,0x07,0x04,0x03,0xc5,0x97,0x07,0x05,0x02,0xc5,0xa4,0x07,0x05,0x02,0xc6,0x8b,0x07,\n   0x05,0x04,0xc6,0x00,0x07,0x05,0x02,0xc6,0x96,0x07,0x05,0x04,0xc6,0x00,0x07,0x05,0x02,0xc6,0x98,0x07,0x05,0x04,0xc6,0x00,0x07,0x05,0x02,0xc6,0x8b,0x07,0x05,0x04,\n   0xc6,0x00,0x07,0x05,0x02,0xc6,0x88,0x07,0x05,0x04,0xc6,0x00,0x07,0x05,0x02,0xc6,0x85,0x07,0x05,0x04,0xc6,0xa4,0x07,0x05,0x02,0xc6,0x98,0x07,0x05,0x02,0xc5,0x00,\n   0x07,0x04,0x03,0xc5,0x81,0x06,0x04,0x03,0xc4,0x81,0x07,0x04,0x03,0xc4,0x82,0x06,0x04,0x03,0xc4,0x86,0x06,0x04,0x03,0xc3,0x87,0x06,0x04,0x03,0xc2,0x82,0x06,0x04,\n   0x03,0xc1,0x01,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,0xc1,0x00,0x05,0x04,0x01,0xc1,0x82,0x05,0x04,0x03,0xc1,0x01,0x05,0x04,0x03,0xc0,0x05,\n   0x03,0x03,0xc0,0x81,0x05,0x03,0x02,0xc0,0x82,0x05,0x03,0x02,0xbf,0x00,0x05,0x03,0x02,0xbe,0x85,0x04,0x03,0x02,0xbe,0x01,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,\n   0x84,0x04,0x03,0x02,0xbd,0x82,0x04,0x02,0x02,0xbc,0x00,0x04,0x03,0x02,0xbc,0x82,0x04,0x02,0x02,0xbc,0x83,0x03,0x02,0x02,0xbb,0x84,0x03,0x02,0x01,0xba,0x82,0x03,\n   0x02,0x01,0xb9,0x00,0x02,0x02,0x01,0xb9,0x8a,0x02,0x01,0x01,0xb8,0x81,0x02,0x01,0x01,0xb7,0x89,0x01,0x01,0x01,0xb6,0x81,0x01,0x01,0x00,0xb5,0x82,0x01,0x00,0x00,\n   0xb5,0x87,0x01,0x00,0x00,0xb4,0x91,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x89,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0x99,0x00,0x00,0x00,0xb3,0x91,0x00,0x00,0x00,0xb4,0x81,0x01,0x00,0x00,0xb4,0x87,0x01,0x00,0x00,0xb5,0x82,0x01,0x01,0x00,0xb5,0x83,0x01,0x01,\n   0x01,0xb6,0x03,0x02,0x01,0x01,0xb7,0x01,0x01,0x01,0xb7,0x02,0x01,0x01,0xb7,0x01,0x01,0x01,0xb7,0x83,0x02,0x01,0x01,0xb7,0x82,0x02,0x01,0x01,0xb8,0x85,0x02,0x02,\n   0x01,0xb9,0x85,0x03,0x02,0x01,0xba,0x82,0x03,0x02,0x02,0xbb,0x83,0x03,0x02,0x02,0xbc,0x82,0x04,0x02,0x02,0xbc,0x85,0x04,0x03,0x02,0xbd,0x81,0x04,0x03,0x02,0xbe,\n   0x83,0x04,0x03,0x02,0xbf,0x00,0x05,0x03,0x02,0xbf,0x81,0x05,0x03,0x02,0xc0,0x01,0x05,0x03,0x03,0xc0,0x05,0x04,0x03,0xc0,0x86,0x05,0x04,0x03,0xc1,0x83,0x06,0x04,\n   0x03,0xc2,0x81,0x06,0x04,0x03,0xc3,0x00,0x06,0x05,0x02,0xc3,0x83,0x06,0x04,0x03,0xc3,0x82,0x06,0x04,0x03,0xc4,0x81,0x07,0x04,0x03,0xc5,0x89,0x07,0x05,0x02,0xc5,\n   0x04,0x07,0x05,0x02,0xc6,0x07,0x05,0x04,0xc6,0x07,0x05,0x02,0xc6,0x07,0x05,0x02,0xc7,0x07,0x05,0x04,0xc7,0x82,0x08,0x05,0x04,0xc7,0x00,0x08,0x05,0x02,0xc7,0x86,\n   0x08,0x05,0x04,0xc7,0x86,0x08,0x05,0x04,0xc8,0x00,0x08,0x05,0x02,0xc8,0x8f,0x08,0x05,0x04,0xc8,0x81,0x08,0x05,0x04,0xc9,0xff,0x08,0x06,0x03,0xc9,0x9d,0x08,0x06,\n   0x03,0xc9,0x81,0x08,0x05,0x04,0xc9,0x84,0x08,0x05,0x04,0xc8,0x00,0x08,0x06,0x03,0xc8,0x91,0x08,0x05,0x04,0xc8,0x89,0x08,0x05,0x04,0xc7,0x82,0x07,0x05,0x04,0xc7,\n   0x02,0x07,0x05,0x02,0xc6,0x07,0x05,0x04,0xc6,0x07,0x05,0x02,0xc6,0x89,0x07,0x05,0x02,0xc5,0x81,0x07,0x04,0x03,0xc5,0x82,0x06,0x04,0x03,0xc4,0x86,0x06,0x04,0x03,\n   0xc3,0x83,0x06,0x04,0x03,0xc2,0x00,0x05,0x04,0x03,0xc1,0x81,0x06,0x04,0x03,0xc1,0x01,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,0xc1,0x01,0x05,\n   0x04,0x03,0xc0,0x05,0x03,0x03,0xc0,0x81,0x05,0x03,0x02,0xc0,0x83,0x05,0x03,0x02,0xbf,0x00,0x04,0x03,0x02,0xbf,0x81,0x04,0x03,0x02,0xbe,0x85,0x04,0x03,0x02,0xbd,\n   0x82,0x04,0x02,0x02,0xbc,0x81,0x03,0x02,0x02,0xbc,0x01,0x04,0x02,0x02,0xbc,0x03,0x02,0x02,0xbc,0x82,0x03,0x02,0x02,0xbb,0x85,0x03,0x02,0x01,0xba,0x85,0x02,0x02,\n   0x01,0xb9,0x82,0x02,0x01,0x01,0xb8,0x84,0x02,0x01,0x01,0xb7,0x82,0x01,0x01,0x01,0xb7,0x83,0x01,0x01,0x01,0xb6,0x82,0x01,0x01,0x00,0xb5,0x87,0x01,0x00,0x00,0xb5,\n   0x81,0x01,0x00,0x00,0xb4,0x91,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x87,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0x99,0x00,0x00,0x00,0xb3,0x8d,0x00,0x00,0x00,0xb4,0x85,0x01,0x00,0x00,0xb4,0x87,0x01,0x00,0x00,0xb5,0x00,0x01,0x01,0x00,0xb5,0x87,0x01,0x01,0x01,\n   0xb6,0x00,0x01,0x01,0x01,0xb7,0x82,0x02,0x01,0x01,0xb7,0x83,0x02,0x01,0x01,0xb8,0x00,0x02,0x02,0x01,0xb9,0x84,0x03,0x02,0x01,0xb9,0x84,0x03,0x02,0x01,0xba,0x02,\n   0x03,0x02,0x02,0xbb,0x03,0x02,0x01,0xbb,0x03,0x02,0x02,0xbb,0x81,0x04,0x02,0x02,0xbc,0x01,0x04,0x03,0x02,0xbc,0x04,0x02,0x02,0xbc,0x85,0x04,0x03,0x02,0xbd,0x02,\n   0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbf,0x83,0x05,0x03,0x02,0xbf,0x81,0x05,0x03,0x02,0xc0,0x81,0x05,0x03,0x03,0xc0,0x81,0x05,0x04,0x03,0xc0,\n   0x81,0x05,0x04,0x03,0xc1,0x86,0x06,0x04,0x03,0xc2,0x81,0x06,0x04,0x03,0xc3,0x00,0x07,0x04,0x03,0xc4,0x81,0x06,0x04,0x03,0xc4,0x81,0x07,0x04,0x03,0xc4,0x82,0x06,\n   0x04,0x03,0xc4,0x00,0x07,0x04,0x03,0xc5,0x84,0x07,0x05,0x02,0xc5,0x81,0x07,0x05,0x04,0xc6,0x02,0x07,0x05,0x04,0xc7,0x08,0x05,0x04,0xc7,0x07,0x05,0x02,0xc7,0x81,\n   0x08,0x05,0x04,0xc7,0x81,0x07,0x05,0x04,0xc7,0x82,0x08,0x05,0x04,0xc7,0x87,0x08,0x05,0x04,0xc8,0x00,0x08,0x05,0x04,0xc9,0x89,0x08,0x06,0x03,0xc9,0x00,0x09,0x06,\n   0x03,0xca,0x88,0x08,0x06,0x03,0xca,0x02,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x85,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0xff,0x09,\n   0x06,0x03,0xcb,0xa1,0x09,0x06,0x03,0xcb,0x01,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x86,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x82,0x08,0x06,0x03,0xca,\n   0x02,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x83,0x08,0x06,0x03,0xca,0x89,0x08,0x06,0x03,0xc9,0x00,0x08,0x05,0x04,0xc9,0x83,0x08,0x05,0x04,\n   0xc8,0x00,0x08,0x06,0x03,0xc8,0x82,0x08,0x05,0x04,0xc8,0x81,0x08,0x05,0x04,0xc7,0x81,0x07,0x05,0x04,0xc7,0x02,0x08,0x05,0x04,0xc7,0x07,0x05,0x04,0xc7,0x08,0x05,\n   0x04,0xc7,0x82,0x07,0x05,0x04,0xc7,0x81,0x07,0x05,0x04,0xc6,0x84,0x07,0x05,0x02,0xc5,0x00,0x07,0x04,0x03,0xc5,0x81,0x06,0x04,0x03,0xc4,0x03,0x07,0x04,0x03,0xc4,\n   0x06,0x04,0x03,0xc4,0x07,0x05,0x02,0xc4,0x07,0x04,0x03,0xc4,0x81,0x06,0x04,0x03,0xc4,0x81,0x06,0x04,0x03,0xc3,0x86,0x06,0x04,0x03,0xc2,0x81,0x05,0x04,0x03,0xc1,\n   0x81,0x05,0x04,0x03,0xc0,0x81,0x05,0x03,0x03,0xc0,0x81,0x05,0x03,0x02,0xc0,0x83,0x05,0x03,0x02,0xbf,0x02,0x04,0x03,0x02,0xbf,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,\n   0xbe,0x85,0x04,0x03,0x02,0xbd,0x82,0x04,0x02,0x02,0xbc,0x00,0x03,0x02,0x02,0xbc,0x82,0x03,0x02,0x02,0xbb,0x84,0x03,0x02,0x01,0xba,0x83,0x03,0x02,0x01,0xb9,0x81,\n   0x02,0x02,0x01,0xb9,0x83,0x02,0x01,0x01,0xb8,0x82,0x02,0x01,0x01,0xb7,0x00,0x01,0x01,0x01,0xb7,0x87,0x01,0x01,0x01,0xb6,0x00,0x01,0x01,0x00,0xb5,0x87,0x01,0x00,\n   0x00,0xb5,0x85,0x01,0x00,0x00,0xb4,0x8d,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x87,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0x99,0x00,0x00,0x00,0xb3,0x91,0x00,0x00,0x00,0xb4,0x81,0x01,0x00,0x00,0xb4,0x87,0x01,0x00,0x00,0xb5,0x00,0x01,0x01,0x00,0xb5,0x87,0x01,\n   0x01,0x01,0xb6,0x00,0x01,0x01,0x01,0xb7,0x82,0x02,0x01,0x01,0xb7,0x83,0x02,0x01,0x01,0xb8,0x00,0x02,0x02,0x01,0xb9,0x84,0x03,0x02,0x01,0xb9,0x84,0x03,0x02,0x01,\n   0xba,0x82,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x02,0xbc,0x82,0x04,0x02,0x02,0xbc,0x85,0x04,0x03,0x02,0xbd,0x01,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x82,0x04,\n   0x03,0x02,0xbf,0x81,0x05,0x03,0x02,0xbf,0x02,0x05,0x04,0x01,0xc0,0x05,0x03,0x02,0xc0,0x05,0x03,0x03,0xc0,0x82,0x05,0x04,0x03,0xc0,0x81,0x06,0x04,0x03,0xc1,0x86,\n   0x06,0x04,0x03,0xc2,0x81,0x06,0x04,0x03,0xc3,0x84,0x06,0x04,0x03,0xc4,0x03,0x07,0x04,0x03,0xc4,0x06,0x04,0x03,0xc4,0x07,0x04,0x03,0xc4,0x07,0x05,0x02,0xc4,0x82,\n   0x07,0x05,0x02,0xc5,0x00,0x07,0x05,0x02,0xc6,0x81,0x07,0x05,0x04,0xc6,0x00,0x08,0x05,0x04,0xc6,0x81,0x07,0x05,0x04,0xc7,0x87,0x08,0x05,0x04,0xc7,0x83,0x08,0x05,\n   0x04,0xc8,0x8b,0x08,0x06,0x03,0xc9,0x01,0x09,0x06,0x03,0xc9,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x84,0x08,0x06,0x03,0xca,0x81,\n   0x09,0x06,0x03,0xca,0x85,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,0xff,0x09,0x06,0x03,0xcb,0xa7,0x09,0x06,0x03,0xcb,0x81,0x09,0x06,0x03,0xca,0x81,0x08,0x06,\n   0x03,0xca,0x06,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x81,\n   0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,0x02,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x8c,0x08,0x06,0x03,0xc9,\n   0x83,0x08,0x05,0x04,0xc8,0x87,0x08,0x05,0x04,0xc7,0x81,0x07,0x05,0x04,0xc7,0x82,0x07,0x05,0x04,0xc6,0x00,0x07,0x05,0x02,0xc6,0x82,0x07,0x05,0x02,0xc5,0x83,0x06,\n   0x04,0x03,0xc4,0x02,0x07,0x05,0x02,0xc4,0x07,0x04,0x03,0xc4,0x06,0x04,0x03,0xc4,0x81,0x07,0x04,0x03,0xc4,0x81,0x06,0x04,0x03,0xc3,0x86,0x06,0x04,0x03,0xc2,0x81,\n   0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,0xc0,0x81,0x05,0x03,0x03,0xc0,0x81,0x05,0x03,0x02,0xc0,0x81,0x05,0x03,0x02,0xbf,0x82,0x04,0x03,0x02,0xbf,0x01,0x04,0x03,\n   0x02,0xbe,0x05,0x03,0x02,0xbe,0x85,0x04,0x03,0x02,0xbd,0x82,0x04,0x02,0x02,0xbc,0x00,0x03,0x02,0x02,0xbc,0x81,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x01,0xbb,0x84,\n   0x03,0x02,0x01,0xba,0x83,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x83,0x02,0x01,0x01,0xb8,0x82,0x02,0x01,0x01,0xb7,0x00,0x01,0x01,0x01,0xb7,0x87,0x01,0x01,\n   0x01,0xb6,0x00,0x01,0x01,0x00,0xb5,0x87,0x01,0x00,0x00,0xb5,0x81,0x01,0x00,0x00,0xb4,0x91,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0x87,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x9b,0x00,0x00,0x00,0xb3,0x8f,0x00,0x00,0x00,0xb4,0x81,0x01,0x00,0x00,0xb4,0x85,0x01,\n   0x00,0x00,0xb5,0x01,0x01,0x01,0x00,0xb5,0x01,0x00,0x00,0xb5,0x82,0x01,0x01,0x00,0xb5,0x86,0x01,0x01,0x01,0xb6,0x00,0x01,0x01,0x01,0xb7,0x84,0x02,0x01,0x01,0xb7,\n   0x81,0x02,0x01,0x01,0xb8,0x86,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x83,0x03,0x02,0x01,0xba,0x81,0x03,0x02,0x02,0xbb,0x86,0x04,0x02,0x02,0xbc,0x82,0x04,\n   0x03,0x02,0xbd,0x00,0x04,0x03,0x02,0xbe,0x82,0x05,0x03,0x02,0xbe,0x00,0x04,0x03,0x02,0xbf,0x81,0x05,0x03,0x02,0xbf,0x84,0x05,0x03,0x02,0xc0,0x01,0x05,0x03,0x03,\n   0xc0,0x05,0x04,0x03,0xc0,0x81,0x05,0x04,0x03,0xc1,0x87,0x06,0x04,0x03,0xc2,0x82,0x06,0x04,0x03,0xc3,0x81,0x07,0x04,0x03,0xc4,0x00,0x06,0x04,0x03,0xc4,0x84,0x07,\n   0x04,0x03,0xc5,0x81,0x07,0x05,0x02,0xc5,0x82,0x07,0x05,0x02,0xc6,0x83,0x07,0x05,0x04,0xc6,0x00,0x08,0x05,0x04,0xc6,0x81,0x07,0x05,0x04,0xc7,0x00,0x08,0x05,0x04,\n   0xc7,0x83,0x07,0x05,0x04,0xc7,0x00,0x08,0x05,0x04,0xc7,0x8e,0x08,0x05,0x04,0xc8,0x02,0x08,0x06,0x03,0xc8,0x08,0x05,0x04,0xc8,0x08,0x05,0x04,0xc9,0x87,0x08,0x06,\n   0x03,0xc9,0x00,0x08,0x06,0x03,0xca,0x82,0x09,0x06,0x03,0xca,0x04,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x08,0x06,0x03,\n   0xca,0x81,0x09,0x06,0x03,0xca,0x85,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,0x03,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,\n   0x03,0xca,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,0x84,0x08,0x06,0x03,0xca,0x06,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x08,0x06,0x03,\n   0xca,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x87,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,0x82,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,\n   0xca,0x81,0x08,0x06,0x03,0xca,0x02,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x84,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,0x88,0x08,0x06,\n   0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,\n   0x81,0x09,0x06,0x03,0xca,0x84,0x08,0x06,0x03,0xca,0x01,0x09,0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,0x00,0x09,0x06,\n   0x03,0xca,0x81,0x08,0x06,0x03,0xca,0x82,0x09,0x06,0x03,0xca,0x84,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,\n   0x81,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,0x01,0x08,0x06,0x03,0xca,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x82,0x08,0x06,\n   0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x84,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x85,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x81,0x08,0x06,0x03,0xca,\n   0x00,0x09,0x06,0x03,0xca,0x8a,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x83,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x84,0x08,0x06,0x03,0xca,0x01,0x09,\n   0x06,0x03,0xca,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,0x82,0x08,0x06,0x03,0xca,0x00,0x09,0x06,0x03,0xca,0x83,0x08,0x06,0x03,0xca,0x81,0x09,0x06,0x03,0xca,\n   0x82,0x08,0x06,0x03,0xca,0x01,0x08,0x06,0x03,0xc9,0x09,0x06,0x03,0xc9,0x85,0x08,0x06,0x03,0xc9,0x00,0x08,0x05,0x04,0xc9,0x90,0x08,0x05,0x04,0xc8,0x05,0x08,0x05,\n   0x04,0xc7,0x07,0x05,0x04,0xc7,0x08,0x05,0x04,0xc7,0x07,0x05,0x04,0xc7,0x07,0x05,0x02,0xc7,0x07,0x05,0x04,0xc7,0x81,0x08,0x05,0x04,0xc7,0x00,0x08,0x05,0x04,0xc6,\n   0x83,0x07,0x05,0x04,0xc6,0x82,0x07,0x05,0x02,0xc6,0x81,0x07,0x05,0x02,0xc5,0x84,0x07,0x04,0x03,0xc5,0x00,0x07,0x04,0x03,0xc4,0x81,0x06,0x04,0x03,0xc4,0x82,0x06,\n   0x04,0x03,0xc3,0x87,0x06,0x04,0x03,0xc2,0x03,0x06,0x04,0x03,0xc1,0x05,0x04,0x03,0xc1,0x05,0x04,0x03,0xc0,0x05,0x03,0x03,0xc0,0x84,0x05,0x03,0x02,0xc0,0x81,0x05,\n   0x03,0x02,0xbf,0x00,0x04,0x03,0x02,0xbf,0x81,0x04,0x03,0x02,0xbe,0x01,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x82,0x04,0x03,0x02,0xbd,0x84,0x04,0x02,0x02,0xbc,\n   0x01,0x04,0x03,0x02,0xbc,0x03,0x02,0x02,0xbc,0x81,0x03,0x02,0x02,0xbb,0x83,0x03,0x02,0x01,0xba,0x81,0x03,0x02,0x01,0xb9,0x85,0x02,0x02,0x01,0xb9,0x81,0x02,0x01,\n   0x01,0xb8,0x85,0x02,0x01,0x01,0xb7,0x86,0x01,0x01,0x01,0xb6,0x82,0x01,0x01,0x00,0xb5,0x87,0x01,0x00,0x00,0xb5,0x81,0x01,0x00,0x00,0xb4,0x8f,0x00,0x00,0x00,0xb4,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x89,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x9b,0x00,0x00,0x00,0xb3,0x91,0x00,\n   0x00,0x00,0xb4,0x81,0x01,0x00,0x00,0xb4,0x85,0x01,0x00,0x00,0xb5,0x85,0x01,0x01,0x00,0xb5,0x83,0x01,0x01,0x01,0xb6,0x00,0x01,0x01,0x01,0xb7,0x84,0x02,0x01,0x01,\n   0xb7,0x87,0x02,0x01,0x01,0xb8,0x81,0x02,0x02,0x01,0xb9,0x81,0x03,0x02,0x01,0xb9,0x83,0x03,0x02,0x01,0xba,0x84,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x02,0xbc,0x84,\n   0x04,0x02,0x02,0xbc,0x82,0x04,0x03,0x02,0xbd,0x83,0x04,0x03,0x02,0xbe,0x01,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x82,0x05,0x03,0x02,0xbf,0x83,0x05,0x03,0x02,\n   0xc0,0x81,0x05,0x03,0x03,0xc0,0x82,0x05,0x04,0x03,0xc0,0x81,0x05,0x04,0x03,0xc1,0x86,0x06,0x04,0x03,0xc2,0x81,0x06,0x04,0x03,0xc3,0x00,0x07,0x05,0x02,0xc4,0x82,\n   0x06,0x04,0x03,0xc4,0x02,0x07,0x04,0x03,0xc4,0x06,0x04,0x03,0xc4,0x07,0x04,0x03,0xc4,0x81,0x06,0x04,0x03,0xc4,0x89,0x07,0x05,0x02,0xc5,0x00,0x07,0x05,0x02,0xc6,\n   0x89,0x07,0x05,0x04,0xc6,0x00,0x07,0x05,0x02,0xc7,0x81,0x07,0x05,0x04,0xc7,0x02,0x07,0x05,0x02,0xc7,0x08,0x05,0x04,0xc7,0x07,0x05,0x02,0xc7,0x81,0x07,0x05,0x04,\n   0xc7,0x85,0x08,0x05,0x04,0xc7,0x88,0x08,0x05,0x04,0xc8,0x00,0x08,0x05,0x02,0xc8,0xb5,0x08,0x05,0x04,0xc8,0x00,0x08,0x06,0x03,0xc8,0x81,0x08,0x05,0x04,0xc8,0x00,\n   0x08,0x06,0x03,0xc8,0xbd,0x08,0x05,0x04,0xc8,0x00,0x08,0x06,0x03,0xc8,0xa7,0x08,0x05,0x04,0xc8,0x00,0x08,0x05,0x02,0xc8,0x83,0x08,0x05,0x04,0xc8,0x00,0x08,0x05,\n   0x02,0xc8,0x84,0x08,0x05,0x04,0xc8,0x01,0x08,0x05,0x02,0xc8,0x08,0x05,0x04,0xc8,0x85,0x08,0x05,0x04,0xc7,0x85,0x07,0x05,0x04,0xc7,0x81,0x08,0x05,0x04,0xc7,0x81,\n   0x07,0x05,0x04,0xc6,0x00,0x07,0x05,0x02,0xc6,0x86,0x07,0x05,0x04,0xc6,0x00,0x07,0x05,0x02,0xc6,0x88,0x07,0x05,0x02,0xc5,0x01,0x07,0x04,0x03,0xc5,0x07,0x04,0x03,\n   0xc4,0x87,0x06,0x04,0x03,0xc4,0x81,0x06,0x04,0x03,0xc3,0x86,0x06,0x04,0x03,0xc2,0x81,0x05,0x04,0x03,0xc1,0x82,0x05,0x04,0x03,0xc0,0x81,0x05,0x03,0x03,0xc0,0x83,\n   0x05,0x03,0x02,0xc0,0x81,0x05,0x03,0x02,0xbf,0x00,0x04,0x03,0x02,0xbf,0x85,0x04,0x03,0x02,0xbe,0x82,0x04,0x03,0x02,0xbd,0x83,0x04,0x02,0x02,0xbc,0x01,0x03,0x02,\n   0x02,0xbc,0x04,0x02,0x02,0xbc,0x84,0x03,0x02,0x02,0xbb,0x83,0x03,0x02,0x01,0xba,0x00,0x03,0x02,0x01,0xb9,0x82,0x02,0x02,0x01,0xb9,0x87,0x02,0x01,0x01,0xb8,0x85,\n   0x02,0x01,0x01,0xb7,0x83,0x01,0x01,0x01,0xb6,0x85,0x01,0x01,0x00,0xb5,0x85,0x01,0x00,0x00,0xb5,0x81,0x01,0x00,0x00,0xb4,0x91,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x89,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x9d,0x00,0x00,0x00,0xb3,0x8f,0x00,0x00,0x00,0xb4,\n   0x87,0x01,0x00,0x00,0xb4,0x83,0x01,0x00,0x00,0xb5,0x86,0x01,0x01,0x00,0xb5,0x84,0x01,0x01,0x01,0xb6,0x00,0x01,0x01,0x01,0xb7,0x86,0x02,0x01,0x01,0xb7,0x84,0x02,\n   0x01,0x01,0xb8,0x01,0x02,0x02,0x01,0xb9,0x03,0x02,0x01,0xb9,0x83,0x03,0x02,0x01,0xba,0x85,0x03,0x02,0x02,0xbb,0x01,0x03,0x02,0x02,0xbc,0x04,0x03,0x02,0xbc,0x81,\n   0x04,0x02,0x02,0xbc,0x01,0x04,0x03,0x02,0xbc,0x04,0x02,0x02,0xbc,0x85,0x04,0x03,0x02,0xbd,0x88,0x04,0x03,0x02,0xbe,0x82,0x05,0x03,0x02,0xbf,0x81,0x05,0x03,0x02,\n   0xc0,0x03,0x05,0x03,0x03,0xc0,0x05,0x04,0x03,0xc0,0x05,0x04,0x03,0xc1,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,0xc1,0x00,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,\n   0xc1,0x8a,0x06,0x04,0x03,0xc2,0x87,0x06,0x04,0x03,0xc3,0x84,0x06,0x04,0x03,0xc4,0x00,0x07,0x04,0x03,0xc4,0x81,0x06,0x04,0x03,0xc4,0x89,0x07,0x04,0x03,0xc5,0x9f,\n   0x07,0x05,0x02,0xc5,0xff,0x07,0x05,0x02,0xc6,0x83,0x07,0x05,0x02,0xc6,0x9f,0x07,0x05,0x02,0xc5,0x83,0x07,0x04,0x03,0xc5,0x00,0x07,0x05,0x02,0xc5,0x84,0x07,0x04,\n   0x03,0xc5,0x87,0x06,0x04,0x03,0xc4,0x00,0x06,0x05,0x02,0xc3,0x86,0x06,0x04,0x03,0xc3,0x8a,0x06,0x04,0x03,0xc2,0x00,0x06,0x04,0x03,0xc1,0x83,0x05,0x04,0x03,0xc1,\n   0x81,0x06,0x04,0x03,0xc1,0x01,0x05,0x04,0x03,0xc0,0x05,0x03,0x03,0xc0,0x81,0x05,0x03,0x02,0xc0,0x81,0x05,0x03,0x02,0xbf,0x00,0x04,0x03,0x02,0xbf,0x83,0x04,0x03,\n   0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,0x83,0x04,0x03,0x02,0xbe,0x85,0x04,0x03,0x02,0xbd,0x85,0x04,0x02,0x02,0xbc,0x85,0x03,0x02,0x02,0xbb,0x83,0x03,0x02,0x01,0xba,\n   0x01,0x03,0x02,0x01,0xb9,0x02,0x02,0x01,0xb9,0x84,0x02,0x01,0x01,0xb8,0x86,0x02,0x01,0x01,0xb7,0x00,0x01,0x01,0x01,0xb7,0x84,0x01,0x01,0x01,0xb6,0x86,0x01,0x01,\n   0x00,0xb5,0x83,0x01,0x00,0x00,0xb5,0x87,0x01,0x00,0x00,0xb4,0x8f,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x8b,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa2,0x00,0x00,0x00,0xb3,0x92,0x00,0x00,0x00,0xb4,0x83,0x01,0x00,0x00,0xb4,0x00,0x01,0x00,0x00,0xb5,0x85,0x01,\n   0x01,0x00,0xb5,0x88,0x01,0x01,0x01,0xb6,0x83,0x01,0x01,0x01,0xb7,0x85,0x02,0x01,0x01,0xb7,0x82,0x02,0x01,0x01,0xb8,0x82,0x02,0x02,0x01,0xb9,0x82,0x03,0x02,0x01,\n   0xb9,0x82,0x03,0x02,0x01,0xba,0x88,0x03,0x02,0x02,0xbb,0x83,0x04,0x02,0x02,0xbc,0x8a,0x04,0x03,0x02,0xbd,0x00,0x04,0x03,0x02,0xbe,0x81,0x05,0x03,0x02,0xbe,0x00,\n   0x04,0x03,0x02,0xbe,0x87,0x05,0x03,0x02,0xbf,0x81,0x05,0x03,0x02,0xc0,0x86,0x05,0x03,0x03,0xc0,0x00,0x05,0x04,0x03,0xc0,0x81,0x05,0x04,0x03,0xc1,0x00,0x05,0x04,\n   0x01,0xc1,0x82,0x05,0x04,0x03,0xc1,0x00,0x06,0x04,0x03,0xc1,0x81,0x05,0x04,0x03,0xc1,0xa0,0x06,0x04,0x03,0xc2,0xcf,0x06,0x04,0x03,0xc3,0x00,0x06,0x05,0x02,0xc3,\n   0xd0,0x06,0x04,0x03,0xc3,0xa0,0x06,0x04,0x03,0xc2,0x83,0x05,0x04,0x03,0xc1,0x00,0x06,0x04,0x03,0xc1,0x83,0x05,0x04,0x03,0xc1,0x00,0x05,0x04,0x01,0xc0,0x86,0x05,\n   0x03,0x03,0xc0,0x81,0x05,0x03,0x02,0xc0,0x86,0x05,0x03,0x02,0xbf,0x00,0x04,0x03,0x02,0xbf,0x83,0x04,0x03,0x02,0xbe,0x8a,0x04,0x03,0x02,0xbd,0x82,0x04,0x02,0x02,\n   0xbc,0x00,0x03,0x02,0x02,0xbc,0x85,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x01,0xbb,0x81,0x03,0x02,0x02,0xbb,0x82,0x03,0x02,0x01,0xba,0x83,0x03,0x02,0x01,0xb9,0x81,\n   0x02,0x02,0x01,0xb9,0x82,0x02,0x01,0x01,0xb8,0x86,0x02,0x01,0x01,0xb7,0x82,0x01,0x01,0x01,0xb7,0x88,0x01,0x01,0x01,0xb6,0x85,0x01,0x01,0x00,0xb5,0x00,0x01,0x00,\n   0x00,0xb5,0x83,0x01,0x00,0x00,0xb4,0x92,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x90,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xa6,0x00,0x00,0x00,0xb3,0x8e,0x00,0x00,0x00,0xb4,0x82,0x01,0x00,0x00,0xb4,0x87,0x01,0x00,0x00,0xb5,0x86,0x01,0x01,0x00,0xb5,0x87,0x01,\n   0x01,0x01,0xb6,0x86,0x02,0x01,0x01,0xb7,0x86,0x02,0x01,0x01,0xb8,0x01,0x02,0x02,0x01,0xb8,0x02,0x01,0x01,0xb8,0x81,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,\n   0x88,0x03,0x02,0x01,0xba,0x85,0x03,0x02,0x02,0xbb,0x02,0x03,0x02,0x01,0xbb,0x04,0x02,0x02,0xbc,0x03,0x02,0x02,0xbc,0x85,0x04,0x02,0x02,0xbc,0x89,0x04,0x03,0x02,\n   0xbd,0x8d,0x04,0x03,0x02,0xbe,0x00,0x04,0x03,0x02,0xbf,0x89,0x05,0x03,0x02,0xbf,0x8c,0x05,0x03,0x02,0xc0,0x90,0x05,0x03,0x03,0xc0,0x00,0x05,0x04,0x03,0xc0,0x87,\n   0x05,0x03,0x03,0xc0,0x83,0x05,0x04,0x03,0xc0,0x02,0x05,0x04,0x01,0xc0,0x05,0x04,0x03,0xc0,0x05,0x04,0x01,0xc0,0x88,0x05,0x04,0x03,0xc0,0x00,0x05,0x04,0x01,0xc0,\n   0x86,0x05,0x04,0x03,0xc0,0x00,0x05,0x04,0x01,0xc0,0x8e,0x05,0x04,0x03,0xc0,0x00,0x05,0x04,0x01,0xc0,0xa1,0x05,0x04,0x03,0xc0,0x00,0x05,0x04,0x01,0xc0,0x98,0x05,\n   0x04,0x03,0xc0,0x00,0x05,0x04,0x01,0xc0,0x92,0x05,0x04,0x03,0xc0,0x00,0x05,0x04,0x01,0xc0,0x8d,0x05,0x04,0x03,0xc0,0x99,0x05,0x03,0x03,0xc0,0x8c,0x05,0x03,0x02,\n   0xc0,0x8a,0x05,0x03,0x02,0xbf,0x02,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x81,0x05,0x03,0x02,0xbe,0x00,0x04,0x03,0x02,0xbe,0x83,0x05,0x03,\n   0x02,0xbe,0x01,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x81,0x04,0x03,0x02,0xbe,0x89,0x04,0x03,0x02,0xbd,0x85,0x04,0x02,0x02,0xbc,0x81,0x03,0x02,0x02,0xbc,0x86,\n   0x03,0x02,0x02,0xbb,0x88,0x03,0x02,0x01,0xba,0x81,0x03,0x02,0x01,0xb9,0x00,0x02,0x02,0x01,0xb9,0x88,0x02,0x01,0x01,0xb8,0x85,0x02,0x01,0x01,0xb7,0x00,0x01,0x01,\n   0x01,0xb7,0x87,0x01,0x01,0x01,0xb6,0x86,0x01,0x01,0x00,0xb5,0x87,0x01,0x00,0x00,0xb5,0x82,0x01,0x00,0x00,0xb4,0x8e,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0x94,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa6,0x00,0x00,0x00,0xb3,0x91,0x00,0x00,0x00,0xb4,0x85,0x01,\n   0x00,0x00,0xb4,0x88,0x01,0x00,0x00,0xb5,0x81,0x01,0x01,0x00,0xb5,0x8c,0x01,0x01,0x01,0xb6,0x00,0x01,0x01,0x01,0xb7,0x87,0x02,0x01,0x01,0xb7,0x89,0x02,0x01,0x01,\n   0xb8,0x85,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x8b,0x03,0x02,0x01,0xba,0x89,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x02,0xbc,0x8c,0x04,0x02,0x02,0xbc,0xaf,\n   0x04,0x03,0x02,0xbd,0x83,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,0x88,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,0x83,0x04,0x03,0x02,0xbe,0x02,0x05,0x03,\n   0x02,0xbe,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x84,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,0x81,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,0x83,0x04,\n   0x03,0x02,0xbe,0x04,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x88,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,\n   0x02,0xbe,0x82,0x04,0x03,0x02,0xbe,0x04,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x81,0x04,0x03,0x02,\n   0xbe,0x00,0x05,0x03,0x02,0xbe,0x82,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,0x82,0x04,0x03,0x02,0xbe,0x81,0x05,0x03,0x02,0xbe,0x82,0x04,0x03,0x02,0xbe,0x81,\n   0x05,0x03,0x02,0xbe,0x81,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,0x82,0x04,0x03,0x02,0xbe,0x81,0x05,0x03,0x02,0xbe,0x81,0x04,0x03,0x02,0xbe,0x81,0x05,0x03,\n   0x02,0xbe,0x85,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,0x82,0x04,0x03,0x02,0xbe,0x81,0x05,0x03,0x02,0xbe,0x85,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,\n   0x86,0x04,0x03,0x02,0xbe,0x02,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x81,0x04,0x03,0x02,0xbe,0x00,0x05,0x03,0x02,0xbe,0x85,0x04,0x03,0x02,\n   0xbe,0x81,0x05,0x03,0x02,0xbe,0x03,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x04,0x03,0x02,0xbe,0x05,0x03,0x02,0xbe,0x84,0x04,0x03,0x02,0xbe,0xaf,0x04,0x03,0x02,\n   0xbd,0x8a,0x04,0x02,0x02,0xbc,0x00,0x04,0x03,0x02,0xbc,0x81,0x04,0x02,0x02,0xbc,0x86,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x01,0xbb,0x81,0x03,0x02,0x02,0xbb,0x8b,\n   0x03,0x02,0x01,0xba,0x00,0x03,0x02,0x01,0xb9,0x85,0x02,0x02,0x01,0xb9,0x89,0x02,0x01,0x01,0xb8,0x87,0x02,0x01,0x01,0xb7,0x00,0x01,0x01,0x01,0xb7,0x8c,0x01,0x01,\n   0x01,0xb6,0x81,0x01,0x01,0x00,0xb5,0x88,0x01,0x00,0x00,0xb5,0x85,0x01,0x00,0x00,0xb4,0x91,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0x94,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa8,0x00,0x00,0x00,0xb3,0x95,0x00,0x00,0x00,0xb4,0x83,0x01,0x00,0x00,0xb4,0x81,0x00,\n   0x00,0x00,0xb4,0x81,0x01,0x00,0x00,0xb4,0x00,0x01,0x00,0x00,0xb5,0x8c,0x01,0x01,0x00,0xb5,0x87,0x01,0x01,0x01,0xb6,0x01,0x02,0x01,0x01,0xb7,0x01,0x01,0x01,0xb7,\n   0x8c,0x02,0x01,0x01,0xb7,0x83,0x02,0x01,0x01,0xb8,0x00,0x02,0x02,0x01,0xb8,0x87,0x02,0x01,0x01,0xb8,0x83,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x9b,0x03,\n   0x02,0x01,0xba,0xa0,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x01,0xbb,0x8f,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x01,0xbb,0x8c,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x02,\n   0xbc,0x96,0x04,0x02,0x02,0xbc,0x00,0x04,0x03,0x02,0xbc,0xb0,0x04,0x02,0x02,0xbc,0x00,0x04,0x03,0x02,0xbc,0x92,0x04,0x02,0x02,0xbc,0x82,0x03,0x02,0x02,0xbb,0x00,\n   0x03,0x02,0x01,0xbb,0x8e,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x01,0xbb,0x82,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,0x01,0xbb,0xa2,0x03,0x02,0x02,0xbb,0x00,0x03,0x02,\n   0x01,0xbb,0x83,0x03,0x02,0x02,0xbb,0x9b,0x03,0x02,0x01,0xba,0x00,0x03,0x02,0x01,0xb9,0x83,0x02,0x02,0x01,0xb9,0x8c,0x02,0x01,0x01,0xb8,0x8e,0x02,0x01,0x01,0xb7,\n   0x87,0x01,0x01,0x01,0xb6,0x8c,0x01,0x01,0x00,0xb5,0x00,0x01,0x00,0x00,0xb5,0x81,0x01,0x00,0x00,0xb4,0x81,0x00,0x00,0x00,0xb4,0x83,0x01,0x00,0x00,0xb4,0x95,0x00,\n   0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x96,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb1,0x00,0x00,0x00,\n   0xb3,0x99,0x00,0x00,0x00,0xb4,0x87,0x01,0x00,0x00,0xb4,0x86,0x01,0x00,0x00,0xb5,0x81,0x01,0x01,0x00,0xb5,0x8e,0x01,0x01,0x01,0xb6,0x81,0x01,0x01,0x01,0xb7,0x01,\n   0x02,0x01,0x01,0xb7,0x01,0x01,0x01,0xb7,0x8a,0x02,0x01,0x01,0xb7,0x92,0x02,0x01,0x01,0xb8,0x02,0x02,0x02,0x01,0xb8,0x02,0x01,0x01,0xb8,0x02,0x02,0x01,0xb8,0x89,\n   0x02,0x01,0x01,0xb8,0x82,0x02,0x02,0x01,0xb9,0x00,0x03,0x02,0x01,0xb9,0x89,0x02,0x02,0x01,0xb9,0x81,0x03,0x02,0x01,0xb9,0xff,0x03,0x02,0x01,0xba,0xbb,0x03,0x02,\n   0x01,0xba,0x81,0x03,0x02,0x01,0xb9,0x82,0x02,0x02,0x01,0xb9,0x81,0x03,0x02,0x01,0xb9,0x01,0x02,0x02,0x01,0xb9,0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x82,\n   0x03,0x02,0x01,0xb9,0x81,0x02,0x02,0x01,0xb9,0x9f,0x02,0x01,0x01,0xb8,0x8a,0x02,0x01,0x01,0xb7,0x03,0x01,0x01,0x01,0xb7,0x02,0x01,0x01,0xb7,0x01,0x01,0x01,0xb7,\n   0x02,0x01,0x01,0xb7,0x8e,0x01,0x01,0x01,0xb6,0x81,0x01,0x01,0x00,0xb5,0x86,0x01,0x00,0x00,0xb5,0x87,0x01,0x00,0x00,0xb4,0x99,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x9f,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb9,0x00,0x00,0x00,0xb3,0x99,0x00,0x00,0x00,0xb4,\n   0x88,0x01,0x00,0x00,0xb4,0x87,0x01,0x00,0x00,0xb5,0x89,0x01,0x01,0x00,0xb5,0x96,0x01,0x01,0x01,0xb6,0x01,0x02,0x01,0x01,0xb7,0x01,0x01,0x01,0xb7,0x9f,0x02,0x01,\n   0x01,0xb7,0xff,0x02,0x01,0x01,0xb8,0xc1,0x02,0x01,0x01,0xb8,0x9f,0x02,0x01,0x01,0xb7,0x01,0x01,0x01,0x01,0xb7,0x02,0x01,0x01,0xb7,0x96,0x01,0x01,0x01,0xb6,0x89,\n   0x01,0x01,0x00,0xb5,0x87,0x01,0x00,0x00,0xb5,0x88,0x01,0x00,0x00,0xb4,0x99,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa7,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x9c,0x00,0x00,0x00,0xb4,0x8c,0x01,0x00,0x00,0xb4,0x8f,0x01,0x00,0x00,0xb5,\n   0x89,0x01,0x01,0x00,0xb5,0xd1,0x01,0x01,0x01,0xb6,0x81,0x01,0x01,0x01,0xb7,0xe1,0x02,0x01,0x01,0xb7,0x81,0x01,0x01,0x01,0xb7,0xd1,0x01,0x01,0x01,0xb6,0x89,0x01,\n   0x01,0x00,0xb5,0x88,0x01,0x00,0x00,0xb5,0x02,0x01,0x01,0x00,0xb5,0x01,0x00,0x00,0xb5,0x01,0x01,0x00,0xb5,0x83,0x01,0x00,0x00,0xb5,0x8c,0x01,0x00,0x00,0xb4,0x9c,\n   0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xad,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc7,0x00,0x00,\n   0x00,0xb3,0xa1,0x00,0x00,0x00,0xb4,0x93,0x01,0x00,0x00,0xb4,0x86,0x01,0x00,0x00,0xb5,0x00,0x01,0x01,0x00,0xb5,0x9e,0x01,0x00,0x00,0xb5,0xff,0x01,0x01,0x00,0xb5,\n   0xc7,0x01,0x01,0x00,0xb5,0x87,0x01,0x00,0x00,0xb5,0x00,0x01,0x01,0x00,0xb5,0x81,0x01,0x00,0x00,0xb5,0x00,0x01,0x01,0x00,0xb5,0x9a,0x01,0x00,0x00,0xb5,0x93,0x01,\n   0x00,0x00,0xb4,0xa1,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb5,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xd2,0x00,0x00,0x00,0xb3,0x87,0x00,0x00,0x00,0xb4,0x83,0x00,0x00,0x00,0xb3,0x9e,0x00,0x00,0x00,0xb4,0x91,0x01,0x00,0x00,0xb4,0x94,0x00,0x00,0x00,0xb4,0x8e,\n   0x01,0x00,0x00,0xb4,0x87,0x01,0x00,0x00,0xb5,0x00,0x01,0x01,0x00,0xb5,0x9a,0x01,0x00,0x00,0xb5,0xe1,0x01,0x00,0x00,0xb4,0x01,0x01,0x00,0x00,0xb5,0x01,0x01,0x00,\n   0xb5,0x9b,0x01,0x00,0x00,0xb5,0x00,0x01,0x01,0x00,0xb5,0x84,0x01,0x00,0x00,0xb5,0x8e,0x01,0x00,0x00,0xb4,0x94,0x00,0x00,0x00,0xb4,0x91,0x01,0x00,0x00,0xb4,0x9e,\n   0x00,0x00,0x00,0xb4,0x83,0x00,0x00,0x00,0xb3,0x87,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc0,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xeb,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb4,0xb9,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xd9,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb4,0xff,0x00,\n   0x00,0x00,0xb4,0x93,0x00,0x00,0x00,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xec,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfc,0x00,0x00,0x00,0xb3,\n   0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfa,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,\n   0x83,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf9,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x85,\n   0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfb,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfa,0x00,0x00,0x00,0xb3,0x02,0xa0,0xa0,0xa0,0xd1,0xff,0xff,0xff,0xff,0xbb,0xbb,\n   0xbb,0xdc,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xfb,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x86,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,\n   0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x8d,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0xc2,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,\n   0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,\n   0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x8b,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x86,0x00,0x00,0x00,0xb3,0x00,0x52,\n   0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x8b,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x84,\n   0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x92,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,\n   0xeb,0x52,0x52,0x52,0xbd,0x95,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0xa7,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,0x02,0xef,\n   0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x82,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xc7,0xc7,\n   0xc7,0xe1,0x83,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,\n   0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,\n   0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x88,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,\n   0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,\n   0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0x00,0x00,\n   0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,\n   0xc2,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,\n   0xe6,0x82,0xff,0xff,0xff,0xff,0x04,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,\n   0x01,0xc7,0xc7,0xc7,0xe1,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,\n   0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x00,\n   0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0x83,0xff,0xff,0xff,0xff,0x06,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,\n   0xbd,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,\n   0x04,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0x83,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,\n   0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,0xc7,0xdc,0xdc,0xdc,0xeb,0xff,0xff,\n   0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,\n   0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x05,0x90,0x90,0x90,0xcc,0xe6,\n   0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,\n   0xc2,0xdc,0xdc,0xdc,0xeb,0x83,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,\n   0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x87,0x00,\n   0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,\n   0x03,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x85,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,\n   0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,0x03,0x00,\n   0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,\n   0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0xff,0xff,0xff,0xff,0x03,\n   0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x85,0x00,0x00,\n   0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,\n   0xe1,0x82,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,\n   0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x87,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0xb3,\n   0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,\n   0xe6,0xf0,0x81,0x90,0x90,0x90,0xcc,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,\n   0xdc,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,\n   0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,\n   0xbd,0x82,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,\n   0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x6a,\n   0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x07,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,\n   0xb8,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,\n   0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x05,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xa0,\n   0xa0,0xa0,0xd1,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,0xaf,0xaf,0xaf,\n   0xd6,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,\n   0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xa0,\n   0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x06,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xd2,\n   0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x90,0x90,0x90,0xcc,0x00,0xe6,\n   0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0x7e,0x7e,\n   0x7e,0xc7,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0x90,0x90,0x90,0xcc,0x84,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,\n   0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x83,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x83,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0xaf,0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,\n   0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x06,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x82,\n   0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x06,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xff,\n   0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,\n   0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x06,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0xff,\n   0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,\n   0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x04,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xf7,\n   0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x82,\n   0x00,0x00,0x00,0xb3,0x02,0xa0,0xa0,0xa0,0xd1,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,\n   0x01,0x52,0x52,0x52,0xbd,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0x00,0x00,\n   0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xc7,0xc7,\n   0xc7,0xe1,0xff,0xff,0xff,0xff,0xd2,0xd2,0xd2,0xe6,0x84,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x0e,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,\n   0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x02,0xa0,0xa0,0xa0,0xd1,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,\n   0x81,0xf7,0xf7,0xf7,0xfa,0x03,0xff,0xff,0xff,0xff,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,\n   0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8b,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,\n   0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x09,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,\n   0xbb,0xbb,0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x09,\n   0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,\n   0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x09,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,\n   0xff,0xff,0xff,0xff,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,\n   0x85,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,\n   0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x83,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x85,0x00,0x00,\n   0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,\n   0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,\n   0x81,0xff,0xff,0xff,0xff,0x09,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xbb,0xbb,\n   0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xf7,0xf7,0xf7,0xfa,0x85,0xff,0xff,0xff,\n   0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x83,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,\n   0xd1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x81,0xc7,0xc7,0xc7,0xe1,0x03,0xff,0xff,0xff,\n   0xff,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,\n   0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,\n   0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,\n   0xf5,0x82,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x87,0x00,\n   0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0x52,0x52,0x52,0xbd,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,\n   0xff,0xff,0xff,0x03,0x52,0x52,0x52,0xbd,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,\n   0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0x52,0x52,0x52,0xbd,0xbb,0xbb,\n   0xbb,0xdc,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,\n   0x6a,0xc2,0x84,0x00,0x00,0x00,0xb3,0x03,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x05,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,\n   0x81,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,\n   0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,\n   0xb3,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xa0,0xa0,0xa0,0xd1,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x02,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xaf,\n   0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0x52,0x52,0x52,0xbd,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,\n   0xff,0xff,0x00,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x6a,\n   0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,\n   0xb3,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xa0,0xa0,0xa0,0xd1,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf3,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,\n   0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xbb,0xbb,0xbb,\n   0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x04,0xf7,0xf7,\n   0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x05,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,\n   0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,\n   0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x81,0xff,\n   0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0x33,0x33,\n   0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,\n   0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,\n   0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x05,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,\n   0xc7,0xe1,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,\n   0xfa,0x81,0xff,0xff,0xff,0xff,0x05,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,\n   0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,\n   0xeb,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,\n   0xff,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,\n   0xc7,0x82,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,\n   0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xaf,0xaf,0xaf,0xd6,0x01,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,\n   0xdc,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xf3,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x03,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,\n   0xff,0xd2,0xd2,0xd2,0xe6,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x85,0xff,0xff,\n   0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x82,0xff,0xff,0xff,0xff,0x85,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x03,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xa0,0xa0,0xa0,0xd1,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x03,0xe6,0xe6,\n   0xe6,0xf0,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,\n   0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x02,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0x00,0x00,0x00,0xb3,0x01,0x33,\n   0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,\n   0x01,0xe6,0xe6,0xe6,0xf0,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0xff,0xff,\n   0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x86,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x85,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0xc7,\n   0xc7,0xc7,0xe1,0x85,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,\n   0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,\n   0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,\n   0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x84,0xff,\n   0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,\n   0xe1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,\n   0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,\n   0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,\n   0xeb,0x0b,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,\n   0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,\n   0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,\n   0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,\n   0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,\n   0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,\n   0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,\n   0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x06,0x6a,0x6a,0x6a,0xc2,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,\n   0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,\n   0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x06,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,\n   0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,\n   0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,0x04,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,\n   0xeb,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x03,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xef,0xef,0xef,0xf5,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x05,0xbb,0xbb,0xbb,0xdc,0x90,0x90,0x90,0xcc,0xef,\n   0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0xa0,0xa0,0xa0,0xd1,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,\n   0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0x6a,0x6a,\n   0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0xa0,0xa0,0xa0,0xd1,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x82,0x00,\n   0x00,0x00,0xb3,0x05,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,\n   0xeb,0x82,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xf6,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0xbe,0x00,0x00,0x00,0xb3,0x03,0x90,0x90,0x90,0xcc,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0xab,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,\n   0xb8,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x91,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,\n   0xf0,0x83,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xf6,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xbf,0x00,0x00,0x00,0xb3,0x02,\n   0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xa0,0xa0,0xa0,0xd1,0xaa,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,\n   0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x90,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xf2,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xf6,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xbf,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,\n   0xd6,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0xaa,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x90,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,\n   0x83,0xdc,0xdc,0xdc,0xeb,0x00,0x52,0x52,0x52,0xbd,0x83,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x83,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0xf6,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xbf,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0xaa,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0x90,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf9,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,\n   0x81,0xaf,0xaf,0xaf,0xd6,0xc0,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0x90,0x90,0x90,0xcc,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x03,0x00,\n   0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x8a,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x52,\n   0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,\n   0x7e,0x7e,0x7e,0xc7,0x9e,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x52,0x52,0x52,0xbd,0x8d,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,\n   0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x88,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x9e,0x00,0x00,0x00,0xb3,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x84,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x8b,0x00,0x00,0x00,\n   0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x9a,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,\n   0x6a,0xc2,0x85,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,\n   0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x84,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,\n   0x52,0x52,0x52,0xbd,0x8f,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0x85,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xe6,0xe6,0xe6,0xf0,0x81,\n   0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0x83,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0x82,\n   0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x04,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x6a,\n   0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,\n   0x01,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x01,\n   0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0x83,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x82,\n   0xff,0xff,0xff,0xff,0x04,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x05,0xdc,\n   0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x84,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,\n   0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,\n   0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,\n   0xb3,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x83,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x03,0x90,0x90,0x90,0xcc,0xf7,0xf7,0xf7,\n   0xfa,0xef,0xef,0xef,0xf5,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,0x7e,\n   0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x05,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x84,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,\n   0x6a,0x6a,0x6a,0xc2,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x85,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x85,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,\n   0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x84,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x85,\n   0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,\n   0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x84,0xff,0xff,0xff,\n   0xff,0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x09,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xef,0xef,\n   0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x83,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,\n   0xdc,0xeb,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x85,0xff,0xff,0xff,0xff,0x03,\n   0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,\n   0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x06,0xf7,0xf7,0xf7,0xfa,0xa0,\n   0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,\n   0xe6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x90,0x90,0x90,0xcc,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,\n   0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,\n   0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x07,0xef,0xef,0xef,0xf5,0xff,0xff,\n   0xff,0xff,0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xbb,0xbb,0xbb,0xdc,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xd2,\n   0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x03,0xa0,0xa0,0xa0,0xd1,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,\n   0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x04,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,\n   0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0x7e,0x7e,0x7e,0xc7,0xbb,0xbb,0xbb,0xdc,0xe6,\n   0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0x00,0x00,0x00,0xb3,\n   0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,\n   0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x04,0xef,\n   0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,\n   0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,\n   0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x85,0xaf,0xaf,0xaf,0xd6,\n   0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x7e,0x7e,0x7e,0xc7,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,\n   0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,\n   0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0xaf,0xaf,0xaf,0xd6,0x05,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,\n   0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x6a,0x6a,0x6a,0xc2,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,\n   0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,\n   0x00,0x00,0x00,0xb3,0x04,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,\n   0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0x52,0x52,0x52,0xbd,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x04,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,0x7e,\n   0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x84,0xff,0xff,0xff,0xff,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,\n   0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x87,0xff,0xff,0xff,\n   0xff,0x02,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x85,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,\n   0xaf,0xd6,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,\n   0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x82,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,\n   0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,\n   0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x03,0xef,0xef,0xef,0xf5,\n   0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,\n   0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x05,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,\n   0xbb,0xbb,0xdc,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,\n   0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x88,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,\n   0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x7e,0x7e,0x7e,0xc7,0x02,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x82,0x00,0x00,0x00,0xb3,\n   0x01,0x52,0x52,0x52,0xbd,0x90,0x90,0x90,0xcc,0x81,0xaf,0xaf,0xaf,0xd6,0x04,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,\n   0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,\n   0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0x90,0x90,0x90,0xcc,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x84,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,\n   0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,\n   0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x06,\n   0x52,0x52,0x52,0xbd,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,\n   0xff,0x05,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xbb,0xbb,\n   0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x03,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x04,0xdc,0xdc,\n   0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,\n   0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x04,0xc7,0xc7,0xc7,0xe1,\n   0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x85,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,\n   0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,\n   0xd1,0x85,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x09,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,\n   0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,\n   0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x01,0x00,0x00,0x00,0xb3,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x86,\n   0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xaf,0xaf,0xaf,0xd6,0x06,0x52,0x52,0x52,0xbd,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,\n   0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x01,\n   0x6a,0x6a,0x6a,0xc2,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x06,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0xaf,0xaf,\n   0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x03,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x03,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,\n   0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xdc,\n   0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xc7,0xc7,0xc7,0xe1,\n   0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x83,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x84,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,\n   0xe6,0xf0,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x85,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,\n   0x85,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x82,0xff,\n   0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x85,0xff,0xff,0xff,0xff,0x02,\n   0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x85,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xaf,0xaf,\n   0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,\n   0x00,0xc7,0xc7,0xc7,0xe1,0x85,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,\n   0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,\n   0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,\n   0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x04,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,\n   0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0xff,0xff,0xff,0xff,0x01,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x86,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,\n   0x84,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x04,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,\n   0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,\n   0xff,0x00,0xa0,0xa0,0xa0,0xd1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x82,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xfe,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,\n   0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,\n   0x00,0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x0a,\n   0x6a,0x6a,0x6a,0xc2,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,\n   0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,\n   0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x06,0x6a,0x6a,0x6a,0xc2,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x33,0x33,\n   0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x04,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,\n   0xeb,0x02,0x7e,0x7e,0x7e,0xc7,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,\n   0xef,0xf5,0x81,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xa0,\n   0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x03,0x7e,0x7e,0x7e,0xc7,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xdc,\n   0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x04,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,\n   0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x83,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,\n   0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x7e,\n   0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0xaf,0xaf,0xaf,\n   0xd6,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x0b,0xbb,0xbb,0xbb,0xdc,\n   0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,\n   0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x06,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,\n   0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xd2,0xd2,0xd2,0xe6,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x08,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,\n   0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,\n   0xe6,0xf0,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,\n   0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,\n   0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0xa0,0xa0,0xa0,0xd1,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x81,0x00,\n   0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x82,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,\n   0xbd,0x6a,0x6a,0x6a,0xc2,0xad,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x94,0x00,0x00,0x00,0xb3,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x9f,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x9a,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xaf,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa1,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x83,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0xac,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x94,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x9f,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x9a,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xaf,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,\n   0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa0,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x83,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0xac,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xaf,0xaf,0xaf,0xd6,0x92,0x00,\n   0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x52,0x52,0x52,0xbd,0x9f,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x9a,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,\n   0x7e,0xc7,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xaf,0x00,0x00,0x00,0xb3,\n   0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa0,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x05,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,\n   0xf5,0xf7,0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,0xad,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xb6,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x9a,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x87,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xb6,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,\n   0xff,0xff,0xaf,0xaf,0xaf,0xd6,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa0,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x83,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x7e,0x7e,0x7e,0xc7,0xb2,0x00,0x00,\n   0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xbb,0xbb,0xbb,0xdc,0xb6,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,\n   0xaf,0xaf,0xaf,0xd6,0x9a,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0x87,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xda,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa7,0x00,0x00,0x00,\n   0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0x97,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,\n   0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb8,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xe4,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xbe,0x00,0x00,0x00,0xb3,0x00,0xf7,\n   0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0xb4,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xdd,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb6,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xe4,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,\n   0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xbe,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xb3,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xdd,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xe4,0x00,0x00,0x00,0xb3,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xbe,0x00,0x00,0x00,0xb3,0x05,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,\n   0xc2,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xd2,0xd2,0xd2,0xe6,0xb3,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xdd,0x00,0x00,0x00,\n   0xb3,0x81,0x33,0x33,0x33,0xb8,0x01,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xb5,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xaa,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,\n   0x52,0x52,0x52,0xbd,0x97,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x90,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,\n   0x00,0x33,0x33,0x33,0xb8,0x94,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x91,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,\n   0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x88,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x9c,0x00,0x00,0x00,0xb3,0x04,0x21,0x21,\n   0x21,0xba,0x43,0x43,0x43,0xc2,0x4d,0x4d,0x4d,0xc5,0x41,0x41,0x41,0xc2,0x13,0x13,0x13,0xb7,0x91,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,\n   0xc7,0x00,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x83,0x00,0x00,0x00,0xb3,0x00,\n   0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,\n   0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x8a,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x86,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,\n   0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x9b,0x00,0x00,0x00,0xb3,\n   0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x52,0x52,0x52,0xbd,0x85,0x00,\n   0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x8d,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x8e,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x04,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x86,0x00,\n   0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x92,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x91,\n   0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x85,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,\n   0x8a,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x91,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb5,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa8,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,\n   0xd6,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,\n   0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,\n   0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x03,0xc7,0xc7,0xc7,\n   0xe1,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x87,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,\n   0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xd7,0xd7,0xd7,0xf0,0x86,0xff,0xff,0xff,\n   0xff,0x00,0x89,0x89,0x89,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0x9e,0x9e,0x9e,0xdc,0xec,0xec,0xec,0xf8,0x83,0xff,0xff,0xff,0xff,0x02,0xfd,0xfd,0xfd,0xff,0xca,0xca,\n   0xca,0xeb,0x3c,0x3c,0x3c,0xc1,0x83,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,\n   0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0x83,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,\n   0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x82,\n   0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,\n   0xf5,0x6a,0x6a,0x6a,0xc2,0x87,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0x83,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,\n   0xb8,0x81,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,\n   0xb8,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,\n   0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,\n   0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x87,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,\n   0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x07,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,\n   0xff,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,\n   0xb3,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x83,0x00,0x00,0x00,0xb3,0x01,0x7e,\n   0x7e,0x7e,0xc7,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,\n   0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,\n   0xc7,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x05,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,\n   0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,\n   0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0x52,\n   0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb5,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xa7,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0xaf,0xaf,\n   0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,\n   0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x87,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x86,\n   0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x86,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0xff,\n   0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,\n   0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,\n   0x00,0xd7,0xd7,0xd7,0xf0,0x86,0xff,0xff,0xff,0xff,0x00,0x89,0x89,0x89,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xe1,0xe1,0xe1,0xf3,0x86,0xff,0xff,0xff,0xff,0x01,0xf6,\n   0xf6,0xf6,0xfc,0x41,0x41,0x41,0xc2,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,\n   0xe6,0xe6,0xe6,0xf0,0x86,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x84,0xff,0xff,0xff,0xff,0x02,0x00,0x00,\n   0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x85,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,\n   0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0xb3,\n   0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,\n   0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x83,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x85,0xff,\n   0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,\n   0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,\n   0xc7,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x07,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,\n   0xc7,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa6,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x06,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x7e,\n   0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,\n   0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,\n   0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,\n   0x7e,0x7e,0x7e,0xc7,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,\n   0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,\n   0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x02,0x28,0x28,0x28,0xbc,0x34,0x34,0x34,0xbf,0x63,0x63,0x63,0xcb,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf9,0x81,0x34,0x34,0x34,0xbf,0x00,0x17,0x17,0x17,0xb8,0x81,0x00,0x00,0x00,0xb3,0x06,0xe0,0xe0,0xe0,0xf3,0xce,0xce,\n   0xce,0xec,0x7d,0x7d,0x7d,0xd2,0x46,0x46,0x46,0xc3,0x44,0x44,0x44,0xc3,0x7e,0x7e,0x7e,0xd2,0xef,0xef,0xef,0xf9,0x81,0xff,0xff,0xff,0xff,0x00,0xc3,0xc3,0xc3,0xe8,\n   0x82,0x00,0x00,0x00,0xb3,0x03,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x05,0x52,0x52,0x52,0xbd,\n   0xf7,0xf7,0xf7,0xfa,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xc7,0xc7,\n   0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,\n   0x52,0xbd,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x90,0x90,\n   0x90,0xcc,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,\n   0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,\n   0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,\n   0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x04,0xbb,0xbb,0xbb,0xdc,0xef,\n   0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,\n   0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0x00,0x00,0x00,0xb3,0x07,0xef,0xef,0xef,0xf5,0xff,0xff,\n   0xff,0xff,0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x05,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xbb,0xbb,0xbb,0xdc,0xa0,0xa0,0xa0,0xd1,\n   0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,\n   0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa6,0x00,0x00,0x00,0xb3,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x85,0xaf,0xaf,0xaf,0xd6,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,\n   0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,\n   0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0xaf,0xaf,0xaf,0xd6,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x89,0x00,0x00,0x00,0xb3,0x00,0x3e,0x3e,0x3e,0xc1,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xed,0xed,0xed,0xf8,0x84,0x00,0x00,0x00,0xb3,0x00,0x2b,0x2b,0x2b,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0x7c,0x7c,0x7c,0xd2,0x81,0xff,0xff,0xff,0xff,0x00,0xe9,0xe9,\n   0xe9,0xf7,0x83,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0x33,0x33,0x33,0xb8,0x82,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x82,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,\n   0xff,0xff,0x04,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,\n   0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x02,0xa0,0xa0,0xa0,0xd1,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x85,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,\n   0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,\n   0x00,0x00,0x00,0xb3,0x01,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x01,0xff,0xff,0xff,0xff,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x04,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,\n   0xfa,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,\n   0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0xaf,0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,\n   0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,\n   0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x81,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,\n   0xaf,0xaf,0xaf,0xd6,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x04,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0xaf,0xaf,0xaf,0xd6,0x02,\n   0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,\n   0xe6,0x81,0xff,0xff,0xff,0xff,0x85,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,\n   0xf0,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xb3,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa6,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x87,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x89,0x00,0x00,0x00,0xb3,0x00,0x3e,0x3e,0x3e,0xc1,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xed,0xed,0xed,0xf8,0x8a,0x00,0x00,0x00,0xb3,0x00,0x92,0x92,0x92,0xd8,0x81,0xff,0xff,0xff,0xff,0x00,0xdb,0xdb,0xdb,0xf1,0x91,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,\n   0x90,0xcc,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,\n   0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x83,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,\n   0x87,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x02,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0x52,0x52,0x52,0xbd,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,\n   0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x81,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,\n   0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xf7,0xf7,0xf7,0xfa,0x85,0xff,0xff,0xff,\n   0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x06,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0xf7,0xf7,\n   0xf7,0xfa,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,0xdc,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb3,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xa6,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,\n   0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x7e,0x7e,0x7e,0xc7,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,\n   0xf7,0xfa,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,\n   0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,\n   0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x89,0x00,0x00,0x00,\n   0xb3,0x00,0x3e,0x3e,0x3e,0xc1,0x81,0xff,0xff,0xff,0xff,0x00,0xed,0xed,0xed,0xf8,0x87,0x00,0x00,0x00,0xb3,0x02,0xb0,0xb0,0xb0,0xe1,0xba,0xba,0xba,0xe5,0xd2,0xd2,\n   0xd2,0xee,0x81,0xff,0xff,0xff,0xff,0x01,0xf8,0xf8,0xf8,0xfd,0x58,0x58,0x58,0xc8,0x8e,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0xbb,0xbb,0xbb,0xdc,0xef,0xef,\n   0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0x00,0x00,0x00,0xb3,0x03,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x05,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x02,\n   0xc7,0xc7,0xc7,0xe1,0xa0,0xa0,0xa0,0xd1,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x02,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x04,0xdc,0xdc,0xdc,0xeb,0xff,\n   0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,\n   0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,\n   0xf5,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,\n   0xd2,0xd2,0xe6,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x6a,0x6a,0x6a,0xc2,0x52,0x52,\n   0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,\n   0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x04,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x7e,0x7e,0x7e,0xc7,0x02,0xe6,\n   0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x88,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xc7,0xc7,0xc7,0xe1,0x81,\n   0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,\n   0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb3,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xa6,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x05,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,\n   0xaf,0xd6,0xef,0xef,0xef,0xf5,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,\n   0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,\n   0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,\n   0x03,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,\n   0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xdc,0xd2,\n   0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,\n   0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x3e,0x3e,0x3e,0xc1,0x81,0xff,0xff,0xff,0xff,0x00,0xed,0xed,\n   0xed,0xf8,0x87,0x00,0x00,0x00,0xb3,0x00,0xf5,0xf5,0xf5,0xfc,0x82,0xff,0xff,0xff,0xff,0x01,0xca,0xca,0xca,0xeb,0x2b,0x2b,0x2b,0xbd,0x8e,0x00,0x00,0x00,0xb3,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,0xff,0x04,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,\n   0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x03,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,\n   0xc7,0xe1,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,\n   0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x05,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,\n   0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x86,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,\n   0xe6,0xe6,0xe6,0xf0,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x05,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x33,0x33,0x33,0xb8,0xd2,\n   0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xbb,\n   0xbb,0xbb,0xdc,0xaf,0xaf,0xaf,0xd6,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,\n   0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x05,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0xc7,0xc7,0xc7,0xe1,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,\n   0xc7,0xe1,0x87,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa7,0x00,0x00,0x00,0xb3,0x00,0x90,\n   0x90,0x90,0xcc,0x85,0xff,0xff,0xff,0xff,0x01,0x90,0x90,0x90,0xcc,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,\n   0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,\n   0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,\n   0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,\n   0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xe6,0xe6,\n   0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,\n   0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x3e,0x3e,0x3e,0xc1,0x81,0xff,0xff,0xff,0xff,0x00,0xed,0xed,0xed,0xf8,0x87,0x00,0x00,0x00,0xb3,0x02,0xa2,\n   0xa2,0xa2,0xdd,0xac,0xac,0xac,0xe1,0xcf,0xcf,0xcf,0xed,0x81,0xff,0xff,0xff,0xff,0x01,0xc5,0xc5,0xc5,0xe9,0x04,0x04,0x04,0xb4,0x8c,0x00,0x00,0x00,0xb3,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xbb,0xbb,0xbb,0xdc,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x86,0xff,0xff,0xff,0xff,0x02,\n   0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,\n   0xdc,0x84,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,\n   0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x84,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x02,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x85,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x86,\n   0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,\n   0xb8,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0x6a,0x6a,0x6a,0xc2,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,\n   0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,\n   0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,\n   0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,\n   0xff,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xd2,0xd2,0xd2,0xe6,0x82,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xd2,0xd2,0xd2,0xe6,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xb2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa8,0x00,0x00,0x00,0xb3,0x07,0x6a,0x6a,0x6a,0xc2,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,\n   0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0xaf,0xaf,0xaf,0xd6,\n   0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x02,\n   0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x05,0x90,0x90,0x90,0xcc,\n   0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x03,0x7e,0x7e,0x7e,0xc7,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x01,0xa0,\n   0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,\n   0xdc,0xdc,0xdc,0xeb,0x01,0xa0,0xa0,0xa0,0xd1,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,\n   0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,\n   0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0xa0,0xa0,0xa0,0xd1,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,\n   0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x05,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,\n   0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x03,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0xf7,\n   0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x02,0x50,0x50,0x50,0xc6,0x63,0x63,0x63,0xcb,0x86,0x86,0x86,0xd5,0x81,0xff,0xff,0xff,0xff,0x00,0xed,\n   0xed,0xed,0xf8,0x8a,0x00,0x00,0x00,0xb3,0x00,0xba,0xba,0xba,0xe5,0x81,0xff,0xff,0xff,0xff,0x00,0x72,0x72,0x72,0xcf,0x8c,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x85,0x00,0x00,0x00,0xb3,0x01,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xef,\n   0xef,0xef,0xf5,0x81,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,\n   0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x05,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,\n   0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,\n   0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,\n   0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,\n   0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x87,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x03,0xbb,0xbb,0xbb,0xdc,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,\n   0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,\n   0x33,0xb8,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,\n   0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,\n   0xe1,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,\n   0xc7,0xc7,0xe1,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x05,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0xf7,\n   0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x05,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,\n   0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x04,0x6a,0x6a,0x6a,\n   0xc2,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,\n   0x06,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x04,0x7e,0x7e,0x7e,0xc7,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,\n   0xd6,0x83,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,\n   0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x88,\n   0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x81,\n   0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x07,0xbb,0xbb,0xbb,0xdc,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,\n   0x6a,0xc2,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,\n   0xdc,0xdc,0xeb,0x00,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb1,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xaf,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0x6a,\n   0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0xbd,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x97,0x00,0x00,0x00,0xb3,0x00,0xd7,0xd7,0xd7,0xf0,0x83,\n   0xff,0xff,0xff,0xff,0x00,0xed,0xed,0xed,0xf8,0x84,0x00,0x00,0x00,0xb3,0x02,0x7b,0x7b,0x7b,0xd1,0xa2,0xa2,0xa2,0xdd,0x2c,0x2c,0x2c,0xbd,0x81,0x00,0x00,0x00,0xb3,\n   0x01,0x07,0x07,0x07,0xb5,0xcd,0xcd,0xcd,0xec,0x81,0xff,0xff,0xff,0xff,0x00,0xa3,0xa3,0xa3,0xdd,0x8c,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0xc0,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,\n   0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xdd,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xaf,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xbd,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x97,0x00,0x00,0x00,0xb3,0x01,0xa7,0xa7,0xa7,0xdf,0xdc,0xdc,0xdc,0xf2,0x82,0xff,0xff,0xff,0xff,0x00,0xed,0xed,0xed,0xf8,0x84,0x00,\n   0x00,0x00,0xb3,0x00,0x91,0x91,0x91,0xd8,0x81,0xff,0xff,0xff,0xff,0x02,0xe8,0xe8,0xe8,0xf6,0xdc,0xdc,0xdc,0xf1,0xf4,0xf4,0xf4,0xfb,0x82,0xff,0xff,0xff,0xff,0x00,\n   0x79,0x79,0x79,0xd1,0x8c,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x05,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0xaf,0xaf,0xaf,0xd6,\n   0xef,0xef,0xef,0xf5,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0xbf,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xdc,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xaf,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0xbd,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x99,0x00,0x00,0x00,0xb3,0x00,0x53,0x53,0x53,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xed,\n   0xed,0xed,0xf8,0x84,0x00,0x00,0x00,0xb3,0x00,0x87,0x87,0x87,0xd5,0x86,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xe5,0x03,0x03,0x03,0xb4,0x8d,0x00,0x00,0x00,0xb3,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x85,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x52,\n   0x52,0x52,0xbd,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0x90,0x90,0x90,0xcc,0xda,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xaf,0x00,0x00,0x00,0xb3,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0x00,0x00,0x00,0xb3,0x05,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,\n   0xfa,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0xbd,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x9a,0x00,0x00,0x00,0xb3,0x02,0x6e,0x6e,0x6e,0xce,0x79,\n   0x79,0x79,0xd1,0x6e,0x6e,0x6e,0xce,0x85,0x00,0x00,0x00,0xb3,0x06,0x2f,0x2f,0x2f,0xbe,0x74,0x74,0x74,0xcf,0x9e,0x9e,0x9e,0xdc,0xae,0xae,0xae,0xe1,0xa9,0xa9,0xa9,\n   0xdf,0x89,0x89,0x89,0xd6,0x3c,0x3c,0x3c,0xc1,0x90,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,\n   0xf5,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0xc6,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0xda,0x00,0x00,0x00,0xb3,0x03,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,\n   0xf5,0xf7,0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xaf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0x8a,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0xbd,0x00,0x00,0x00,0xb3,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0xff,0x00,0x00,0x00,0xb3,0x8f,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,\n   0x00,0xa0,0xa0,0xa0,0xd1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xdc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc9,0x00,0x00,0x00,0xb3,0x02,\n   0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc8,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,\n   0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb0,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc8,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,\n   0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb0,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc8,0x00,0x00,0x00,0xb3,0x81,0x33,0x33,0x33,0xb8,0x01,0x00,0x00,0x00,0xb3,0xc7,\n   0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xaf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xae,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x6a,0x6a,0x6a,0xc2,0x90,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,\n   0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x8c,0x00,0x00,0x00,0xb3,\n   0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x8e,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x87,\n   0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x8b,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,\n   0x83,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x92,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,\n   0x33,0x33,0x33,0xb8,0x8c,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,\n   0x33,0xb8,0x83,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,\n   0x52,0x52,0xbd,0x94,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x94,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,\n   0x33,0x33,0x33,0xb8,0x84,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x88,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,\n   0x00,0x33,0x33,0x33,0xb8,0x92,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x86,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,\n   0xc2,0x81,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0xa5,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,\n   0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x90,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,\n   0xc7,0x6a,0x6a,0x6a,0xc2,0x92,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,\n   0xc2,0x81,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x8d,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,\n   0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xaf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xac,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,\n   0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,\n   0xe1,0x83,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x03,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,\n   0x01,0xd2,0xd2,0xd2,0xe6,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,\n   0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x03,0xef,0xef,0xef,\n   0xf5,0x90,0x90,0x90,0xcc,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x05,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xdc,\n   0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xdc,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,\n   0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,\n   0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,\n   0xb3,0x01,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x03,0xbb,0xbb,0xbb,0xdc,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,\n   0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,\n   0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,0x00,0xb3,0x02,\n   0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x04,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,\n   0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,\n   0xb3,0x02,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x01,0xa0,\n   0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x90,\n   0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x83,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,\n   0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x03,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x03,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,\n   0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,\n   0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,\n   0x01,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x03,\n   0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x83,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x01,\n   0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x01,0xbb,0xbb,0xbb,0xdc,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xaf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xac,0x00,0x00,0x00,0xb3,0x04,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,\n   0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,\n   0x6a,0x6a,0xc2,0x86,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,\n   0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x86,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x01,0xa0,0xa0,0xa0,0xd1,0xc7,0xc7,0xc7,0xe1,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x52,\n   0x52,0x52,0xbd,0x84,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,\n   0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x86,0xff,0xff,0xff,0xff,0x00,\n   0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,\n   0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x84,\n   0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x6a,0x6a,\n   0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x85,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x83,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0x90,0x90,0x90,0xcc,0x86,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x88,\n   0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x86,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,\n   0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,\n   0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xae,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xad,0x00,0x00,0x00,0xb3,0x03,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,\n   0xb8,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x90,0x90,0x90,0xcc,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,\n   0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x7e,0x7e,0x7e,0xc7,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,\n   0xe6,0xf0,0x90,0x90,0x90,0xcc,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0x6a,0x6a,\n   0x6a,0xc2,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,\n   0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x07,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xbb,0xbb,0xbb,0xdc,0xa0,0xa0,\n   0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,\n   0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,\n   0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xc7,0xc7,\n   0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x88,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,\n   0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,\n   0xb3,0x05,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xe6,0xe6,0xe6,0xf0,0x81,0x90,0x90,0x90,0xcc,0x03,0xd2,0xd2,0xd2,0xe6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x03,0xa0,0xa0,0xa0,0xd1,0x6a,0x6a,\n   0x6a,0xc2,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,\n   0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,\n   0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x88,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x7e,0x7e,0x7e,0xc7,0xc7,\n   0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x03,0xa0,0xa0,0xa0,0xd1,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x33,\n   0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,\n   0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,\n   0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x82,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xae,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xad,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,\n   0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,\n   0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,\n   0x86,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x85,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,\n   0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,\n   0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,\n   0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,\n   0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0xaf,0xaf,0xaf,0xd6,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x02,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x88,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x85,0xaf,0xaf,0xaf,0xd6,0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x7e,0x7e,0x7e,0xc7,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xd2,\n   0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,\n   0xd6,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,\n   0x85,0xaf,0xaf,0xaf,0xd6,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,\n   0x52,0xbd,0x6a,0x6a,0x6a,0xc2,0x87,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x84,\n   0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,\n   0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x88,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x88,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0x33,0x33,\n   0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,\n   0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x04,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0xaf,0xaf,0xaf,\n   0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,\n   0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,\n   0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xad,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xac,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,\n   0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x02,0xdc,\n   0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,\n   0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x87,0xff,0xff,0xff,0xff,0x85,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,\n   0x85,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x01,0x90,0x90,0x90,\n   0xcc,0xf7,0xf7,0xf7,0xfa,0x85,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x82,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x88,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x87,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x85,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,\n   0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x85,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,\n   0xff,0x03,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x87,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8c,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x52,\n   0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,\n   0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x88,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,\n   0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,\n   0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0x00,0x00,0x00,0xb3,0x06,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xbb,\n   0xbb,0xbb,0xdc,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xad,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xac,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,\n   0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x86,\n   0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x7e,0x7e,0x7e,0xc7,0x02,0xe6,0xe6,0xe6,\n   0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x85,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x83,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0x90,0x90,0x90,0xcc,0x81,0xaf,0xaf,0xaf,0xd6,0x04,0xef,0xef,0xef,0xf5,0xff,\n   0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x01,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0x33,0x33,0x33,0xb8,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xaf,\n   0xaf,0xaf,0xd6,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,\n   0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,\n   0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x52,0x52,0x52,0xbd,\n   0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,\n   0x90,0xcc,0x81,0x7e,0x7e,0x7e,0xc7,0x02,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x82,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0x90,0x90,\n   0x90,0xcc,0x81,0xaf,0xaf,0xaf,0xd6,0x04,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,\n   0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,\n   0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,\n   0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x7e,0x7e,0x7e,0xc7,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0x7e,0x7e,\n   0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x8c,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,\n   0xff,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0x33,0x33,0x33,0xb8,0x87,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,\n   0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,\n   0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x86,0x00,0x00,0x00,\n   0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,\n   0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,\n   0xfa,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xad,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xac,0x00,0x00,0x00,0xb3,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,\n   0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,\n   0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,\n   0xcc,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,\n   0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0xaf,\n   0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x09,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,\n   0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,\n   0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xaf,0xaf,\n   0xaf,0xd6,0x03,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,\n   0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x01,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,\n   0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0xef,0xef,0xef,0xf5,0xaf,\n   0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xaf,0xaf,0xaf,0xd6,0x00,\n   0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x09,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,\n   0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,\n   0xf7,0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x03,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,\n   0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x03,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,\n   0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,\n   0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x84,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x04,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,\n   0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,\n   0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,\n   0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xc7,0xc7,0xc7,0xe1,0x00,\n   0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x86,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,\n   0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xac,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xac,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x83,\n   0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,\n   0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x85,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,\n   0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,\n   0x84,0xff,0xff,0xff,0xff,0x06,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,\n   0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x01,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,\n   0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x86,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x84,0xff,\n   0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0xff,0xff,0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,\n   0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,\n   0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x81,\n   0x00,0x00,0x00,0xb3,0x04,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x52,\n   0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,\n   0x84,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x52,0x52,\n   0x52,0xbd,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,\n   0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,\n   0xf0,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0xff,0xff,\n   0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,\n   0xc2,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x03,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,\n   0xf0,0x84,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x87,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x52,0x52,\n   0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xd2,0xd2,0xd2,0xe6,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xac,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xad,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,\n   0xc2,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x04,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x04,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x83,0x00,0x00,0x00,0xb3,0x01,0xa0,\n   0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,\n   0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,\n   0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x04,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,\n   0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x88,0x00,0x00,0x00,0xb3,0x0a,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,\n   0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,\n   0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x05,0xdc,0xdc,0xdc,0xeb,0xaf,\n   0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x07,0xbb,0xbb,\n   0xbb,0xdc,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x05,0xef,0xef,0xef,0xf5,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,\n   0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x83,0x00,0x00,0x00,0xb3,0x04,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,\n   0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x06,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xf7,\n   0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x04,0xbb,0xbb,\n   0xbb,0xdc,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,\n   0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,\n   0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x03,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x04,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,\n   0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x86,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,\n   0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,\n   0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x03,0xa0,0xa0,0xa0,\n   0xd1,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,\n   0xdc,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,\n   0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x06,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,\n   0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,\n   0xdc,0x84,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,\n   0xdc,0x81,0x00,0x00,0x00,0xb3,0x06,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,\n   0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x04,0xbb,0xbb,0xbb,0xdc,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x7e,0x7e,\n   0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,\n   0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,\n   0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,\n   0xfa,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x05,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,\n   0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xab,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb5,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x9b,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa9,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x98,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x93,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xb6,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0xb9,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8c,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,\n   0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xbc,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xbd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb5,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x9b,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa9,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x04,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x98,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x93,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xb6,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xb9,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,\n   0xdc,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8c,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xbc,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xb5,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x9b,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0xa9,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,\n   0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x98,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,\n   0xc7,0x00,0x52,0x52,0x52,0xbd,0x93,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,\n   0xff,0xff,0xff,0xff,0x81,0xbb,0xbb,0xbb,0xdc,0xb4,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xb9,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x8c,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x88,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,\n   0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x81,0xbb,0xbb,0xbb,0xdc,0xba,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xbd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb5,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x9b,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa9,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xb0,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0xb4,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xb9,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,\n   0xdc,0x82,0xdc,0xdc,0xdc,0xeb,0x00,0x90,0x90,0x90,0xcc,0x83,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x99,\n   0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0xba,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb5,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,\n   0x81,0xaf,0xaf,0xaf,0xd6,0x9b,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x00,0x52,\n   0x52,0x52,0xbd,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0xa9,0x00,0x00,0x00,\n   0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0xb0,0x00,0x00,0x00,0xb3,0x81,\n   0xaf,0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0x88,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xd2,0xd2,0xd2,0xe6,0x81,0xdc,0xdc,0xdc,0xeb,0xb4,0x00,0x00,0x00,\n   0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0xe1,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xd2,0xd2,0xd2,0xe6,0x81,0xdc,0xdc,0xdc,0xeb,0xba,0x00,\n   0x00,0x00,0xb3,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc9,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,\n   0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x87,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,\n   0xc2,0x88,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x33,0x33,\n   0x33,0xb8,0xa0,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x92,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x8f,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x99,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,\n   0x7e,0xc7,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x87,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,\n   0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x00,0x33,\n   0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x8a,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,\n   0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x87,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x8c,0x00,0x00,0x00,0xb3,\n   0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x8e,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x8a,0x00,\n   0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,\n   0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x9f,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,\n   0x00,0x33,0x33,0x33,0xb8,0x84,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x87,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,\n   0xc2,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x6a,0x6a,0x6a,0xc2,0x86,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,\n   0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x86,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,\n   0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xaf,\n   0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,\n   0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,\n   0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,\n   0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,\n   0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x88,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,\n   0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,\n   0x82,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,\n   0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,\n   0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xd2,0xd2,\n   0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x06,0xbb,0xbb,0xbb,0xdc,0xdc,\n   0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x83,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,\n   0xdc,0x82,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,\n   0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x01,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x6a,0x6a,0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,\n   0xd6,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0x83,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,\n   0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,\n   0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,\n   0xb8,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,\n   0xb8,0xc7,0xc7,0xc7,0xe1,0x83,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,\n   0xf5,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x03,0x90,0x90,0x90,0xcc,0xf7,0xf7,0xf7,0xfa,0xef,0xef,0xef,\n   0xf5,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x04,\n   0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,\n   0xe6,0xf0,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,\n   0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,\n   0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,\n   0xef,0xf5,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x00,\n   0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x86,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,\n   0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,\n   0x86,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x84,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x83,0xff,0xff,0xff,\n   0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,\n   0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,\n   0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x83,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,\n   0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,\n   0xf5,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,0xff,0xff,0xff,0x05,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,\n   0xf7,0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,0x06,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,\n   0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x05,0xf7,0xf7,\n   0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,\n   0x83,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,\n   0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,\n   0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x7e,0x7e,0x7e,0xc7,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,\n   0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,\n   0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,\n   0xf0,0x90,0x90,0x90,0xcc,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,\n   0xdc,0x82,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xd2,0xd2,0xd2,0xe6,\n   0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,\n   0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,\n   0x04,0x6a,0x6a,0x6a,0xc2,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,\n   0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,\n   0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x03,0xa0,0xa0,0xa0,0xd1,0x6a,0x6a,0x6a,0xc2,\n   0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,\n   0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,\n   0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xe6,0xe6,0xe6,0xf0,0x81,0x90,0x90,0x90,0xcc,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,\n   0x7e,0x7e,0x7e,0xc7,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,\n   0x81,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0xbb,0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,\n   0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,\n   0x05,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xe6,\n   0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x03,0xaf,\n   0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x09,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,\n   0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xb6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,\n   0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x85,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,\n   0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x02,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0xaf,0xaf,0xaf,0xd6,0x02,\n   0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,\n   0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x06,\n   0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,\n   0xe6,0x81,0xff,0xff,0xff,0xff,0x85,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,\n   0x84,0xaf,0xaf,0xaf,0xd6,0x01,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x90,0x90,0x90,0xcc,0x7e,0x7e,0x7e,0xc7,\n   0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,\n   0xb3,0x02,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xd2,0xd2,0xd2,0xe6,\n   0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x04,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x84,0xaf,\n   0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,\n   0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,\n   0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0xaf,0xaf,0xaf,0xd6,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,\n   0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,\n   0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x85,0xaf,0xaf,0xaf,0xd6,0x86,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0x7e,0x7e,0x7e,0xc7,0xbb,0xbb,0xbb,0xdc,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0x52,0x52,0x52,0xbd,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,\n   0x6a,0xc2,0x52,0x52,0x52,0xbd,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x85,0xaf,0xaf,0xaf,0xd6,0x01,0x00,0x00,0x00,0xb3,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x7e,0x7e,0x7e,0xc7,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,\n   0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,\n   0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0xa0,0xa0,0xa0,0xd1,\n   0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0xaf,0xaf,0xaf,0xd6,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb9,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xb7,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x85,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,\n   0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x86,\n   0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x09,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0x90,0x90,0x90,0xcc,0xef,\n   0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,\n   0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x87,0xff,0xff,0xff,\n   0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x87,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x86,0xff,\n   0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,\n   0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,\n   0x00,0x00,0x00,0xb3,0x87,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,\n   0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x87,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x87,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x84,0xff,0xff,0xff,0xff,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0xaf,\n   0xaf,0xaf,0xd6,0x87,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x8b,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x87,0xff,0xff,0xff,0xff,0x02,0x00,0x00,\n   0x00,0xb3,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x85,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,\n   0xff,0x83,0x00,0x00,0x00,0xb3,0x05,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x83,\n   0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb9,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,\n   0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x05,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,\n   0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,\n   0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,\n   0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,\n   0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0x52,0x52,0x52,\n   0xbd,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,\n   0x02,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,\n   0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x7e,0x7e,0x7e,0xc7,0x02,0xe6,0xe6,\n   0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0xaf,0xaf,0xaf,0xd6,0x00,0xc7,\n   0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0x7e,0x7e,0x7e,0xc7,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x04,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,\n   0xf5,0x82,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x03,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x7e,0x7e,0x7e,0xc7,0x02,0xe6,0xe6,0xe6,0xf0,0xff,0xff,\n   0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x52,\n   0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0xc7,0xc7,0xc7,\n   0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x8b,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x84,0xaf,0xaf,0xaf,0xd6,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x02,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x82,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0x90,0x90,0x90,0xcc,\n   0x81,0xaf,0xaf,0xaf,0xd6,0x04,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,\n   0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb9,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,\n   0xd2,0xe6,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x05,0xef,0xef,\n   0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,\n   0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,\n   0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0xaf,0xaf,\n   0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,\n   0xff,0xff,0xff,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,\n   0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x01,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,\n   0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x04,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,\n   0xc7,0xe1,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0xff,0xff,0xff,0xff,0x0a,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,\n   0xf7,0xfa,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x00,\n   0x00,0x00,0xb3,0x08,0xaf,0xaf,0xaf,0xd6,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,\n   0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,\n   0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x03,0xa0,0xa0,0xa0,0xd1,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,\n   0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xbb,0xbb,\n   0xbb,0xdc,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x0d,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,\n   0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,\n   0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,\n   0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,\n   0xff,0xff,0x03,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,\n   0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x0d,\n   0x52,0x52,0x52,0xbd,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,\n   0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x8c,0x00,0x00,0x00,0xb3,0x8a,0xff,0xff,\n   0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x09,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,\n   0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,\n   0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x05,0xdc,0xdc,0xdc,\n   0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x03,0x52,0x52,0x52,0xbd,0x7e,\n   0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xb6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,\n   0x00,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,\n   0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,\n   0x00,0xe6,0xe6,0xe6,0xf0,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,\n   0xb3,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xb3,\n   0x86,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,\n   0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,\n   0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,\n   0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,\n   0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x03,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,\n   0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,\n   0xa0,0xd1,0x85,0xff,0xff,0xff,0xff,0x01,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0x85,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xc7,0xc7,\n   0xc7,0xe1,0x85,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,\n   0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,\n   0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x84,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,\n   0xd1,0x85,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x8c,0x00,0x00,0x00,0xb3,0x8a,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x04,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,\n   0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x86,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x04,0xf7,0xf7,0xf7,0xfa,\n   0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0xaf,0xaf,\n   0xaf,0xd6,0x85,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x05,0xbb,\n   0xbb,0xbb,0xdc,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,\n   0xd6,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,\n   0xeb,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xbb,0xbb,\n   0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x05,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,\n   0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,\n   0xeb,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x52,\n   0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,\n   0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0x52,0x52,0x52,0xbd,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x02,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,\n   0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x04,0x90,\n   0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x85,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,\n   0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x04,0xe6,0xe6,0xe6,0xf0,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x04,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x83,0x00,0x00,0x00,0xb3,0x01,0xa0,\n   0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x87,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,\n   0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xaf,0xaf,\n   0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x04,0xaf,0xaf,0xaf,0xd6,0xef,0xef,\n   0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x06,0x33,0x33,\n   0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x0a,\n   0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,\n   0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x85,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x05,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,\n   0xc7,0xe1,0x33,0x33,0x33,0xb8,0x83,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x90,0x90,\n   0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x01,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0xa0,0xa0,\n   0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x82,0x00,\n   0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x03,0x7e,0x7e,0x7e,0xc7,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,\n   0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x87,0x00,0x00,0x00,0xb3,0x00,\n   0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,\n   0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x01,0x7e,\n   0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x8d,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,\n   0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0xc7,0xc7,\n   0xc7,0xe1,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xc7,0xc7,\n   0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,\n   0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,\n   0xb3,0x05,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,\n   0xa0,0xa0,0xa0,0xd1,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xb6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb8,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0x33,0x33,\n   0x33,0xb8,0x94,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x91,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x91,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x96,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0x33,0x33,\n   0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x8c,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x96,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x9b,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x94,0x00,0x00,0x00,0xb3,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x91,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0xcb,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x9a,0x00,0x00,0x00,0xb3,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x94,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xb9,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x03,0xdc,0xdc,0xdc,0xeb,0xff,\n   0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x93,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x91,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x91,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x95,0x00,0x00,\n   0x00,0xb3,0x05,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x8c,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x96,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x9b,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x94,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,\n   0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x91,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0xcb,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x9a,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x94,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb9,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x93,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x91,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x91,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x95,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,\n   0xc7,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x8c,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,\n   0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x96,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x9b,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x94,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0x87,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x91,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xaf,0xaf,0xaf,0xd6,0xc9,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x9a,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x94,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb9,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xb7,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x94,0x00,0x00,0x00,\n   0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x91,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x91,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x95,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,\n   0x88,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x93,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x96,0x00,\n   0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,\n   0xd1,0x9b,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xa0,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x92,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xc9,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,\n   0xdc,0xeb,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x9a,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd1,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcf,0x00,0x00,0x00,0xb3,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0x91,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,\n   0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x91,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x7e,0x7e,0x7e,0xc7,0xa1,0x00,0x00,0x00,0xb3,0x00,\n   0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x93,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0xbe,0x00,0x00,0x00,0xb3,0x81,0xaf,0xaf,\n   0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0xa0,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0x92,0x00,0x00,0x00,0xb3,\n   0x01,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xbb,0xbb,0xbb,0xdc,0xf0,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xaf,0xaf,\n   0xaf,0xd6,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd1,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa3,0x00,0x00,0x00,0xb3,0x82,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd8,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xa0,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x84,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xa0,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd5,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xa1,0x00,0x00,0x00,0xb3,0x05,0xef,0xef,0xef,0xf5,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xce,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x85,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,\n   0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x8c,0x00,0x00,0x00,\n   0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0x91,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,\n   0x94,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x90,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,0x7e,\n   0xc7,0x9a,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0xa3,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,\n   0xc7,0x52,0x52,0x52,0xbd,0xa6,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x6a,0x6a,0x6a,0xc2,0x8a,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,\n   0x33,0x33,0x33,0xb8,0x91,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0x9a,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x86,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x52,0x52,0x52,0xbd,0x8a,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x88,0x00,\n   0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,\n   0xb8,0x88,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x8f,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0x7e,0x7e,\n   0x7e,0xc7,0x00,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xc1,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,\n   0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x81,0xff,\n   0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x05,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0xff,\n   0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x03,0xbb,0xbb,0xbb,0xdc,\n   0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,\n   0x01,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,\n   0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x87,0x00,0x00,0x00,\n   0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x00,\n   0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,\n   0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x05,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0xff,0xff,\n   0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,\n   0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,\n   0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x86,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xef,0xef,0xef,0xf5,0x82,0xff,\n   0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xe6,0xe6,\n   0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x83,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,\n   0xdc,0x82,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xbb,0xbb,0xbb,0xdc,0x81,\n   0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,\n   0xfa,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x82,0x00,\n   0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,\n   0xc7,0x6a,0x6a,0x6a,0xc2,0xdc,0xdc,0xdc,0xeb,0x83,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xbf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x09,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,\n   0x33,0xb8,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x87,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,\n   0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x86,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,\n   0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x85,0xff,\n   0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,\n   0xf7,0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,\n   0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,\n   0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x86,0xff,0xff,0xff,0xff,0x06,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0xff,\n   0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0x00,0x00,0x00,0xb3,0x02,0xef,\n   0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x81,0xbb,0xbb,0xbb,0xdc,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x00,\n   0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,\n   0xc7,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x86,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x83,0xff,0xff,0xff,0xff,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x86,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x33,0x33,\n   0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0x84,0xff,0xff,0xff,0xff,0x01,0x00,0x00,\n   0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x86,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,\n   0x7e,0xc7,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0x81,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,\n   0x00,0x00,0xb3,0x07,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,\n   0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,\n   0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,\n   0xb3,0x05,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,\n   0x03,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,\n   0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,\n   0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,\n   0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x86,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,\n   0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,\n   0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x83,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,\n   0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,\n   0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,\n   0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x03,0xaf,0xaf,\n   0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,\n   0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x03,0xa0,0xa0,0xa0,0xd1,0x6a,\n   0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x04,\n   0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,\n   0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x90,0x90,0x90,0xcc,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,\n   0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0xc7,0xc7,\n   0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x04,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x00,0x00,\n   0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x7e,\n   0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xa0,0xa0,0xa0,0xd1,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,\n   0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x84,0xaf,0xaf,0xaf,0xd6,0x05,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,\n   0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,\n   0x81,0x7e,0x7e,0x7e,0xc7,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x02,0xc7,0xc7,0xc7,0xe1,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,0x00,0xb3,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x82,0x00,\n   0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,\n   0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x06,0x33,0x33,0x33,0xb8,0xbb,0xbb,0xbb,0xdc,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xf7,0xf7,0xf7,0xfa,0xff,0xff,\n   0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x03,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x81,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xbb,\n   0xbb,0xbb,0xdc,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x7e,0x7e,0x7e,0xc7,0x04,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,\n   0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,\n   0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,\n   0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,\n   0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0x00,0x00,0x00,0xb3,0x03,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,\n   0xd6,0x81,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,\n   0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,\n   0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x04,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x85,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,\n   0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,\n   0xff,0x01,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x02,0xa0,0xa0,0xa0,0xd1,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xef,0xef,0xef,0xf5,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,\n   0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,\n   0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xe6,\n   0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x85,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,\n   0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,\n   0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,\n   0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,\n   0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x09,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0x90,0x90,0x90,0xcc,0xef,0xef,\n   0xef,0xf5,0xff,0xff,0xff,0xff,0xbb,0xbb,0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0x86,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,\n   0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x06,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,\n   0xff,0xff,0xff,0xff,0xe6,0xe6,0xe6,0xf0,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x03,0x90,0x90,0x90,0xcc,\n   0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xd2,0xd2,0xd2,0xe6,0x85,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,\n   0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x05,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,\n   0xc2,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x83,0x00,\n   0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,\n   0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xbb,0xbb,0xbb,0xdc,\n   0x83,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,0xa0,0xd1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,\n   0xaf,0xaf,0xaf,0xd6,0x52,0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,\n   0xff,0x88,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0x90,0x90,0x90,0xcc,0x81,0xaf,0xaf,0xaf,0xd6,0x04,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,\n   0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,\n   0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x02,0xdc,0xdc,0xdc,\n   0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,\n   0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x52,0x52,0x52,0xbd,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x05,0x7e,0x7e,0x7e,0xc7,\n   0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,\n   0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x03,0x52,0x52,0x52,0xbd,0xbb,0xbb,0xbb,0xdc,0xff,0xff,\n   0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x87,0x00,\n   0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,\n   0xbd,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x06,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,\n   0xeb,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xd2,0xd2,0xd2,0xe6,0x82,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0x90,0x90,0x90,0xcc,0x81,\n   0xaf,0xaf,0xaf,0xd6,0x04,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,\n   0xbb,0xbb,0xdc,0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,\n   0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,\n   0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,\n   0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0x6a,0x6a,0x6a,\n   0xc2,0x89,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,\n   0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,\n   0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0x90,0x90,0x90,0xcc,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x05,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xef,0xef,0xef,\n   0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0x52,\n   0x52,0x52,0xbd,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x01,0x52,0x52,0x52,\n   0xbd,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,\n   0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xa0,0xa0,0xa0,0xd1,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xc0,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x05,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x33,0x33,0x33,0xb8,\n   0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,\n   0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x87,0x00,0x00,0x00,0xb3,0x09,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,\n   0xb8,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,\n   0xb8,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,\n   0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x04,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,\n   0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,\n   0x7e,0xc7,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,\n   0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x86,0x00,0x00,0x00,0xb3,0x01,0x6a,\n   0x6a,0x6a,0xc2,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,\n   0xdc,0x81,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,\n   0xb3,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x0b,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0x33,0x33,0x33,0xb8,0x00,\n   0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,\n   0x04,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xaf,\n   0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,\n   0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x02,0xc7,0xc7,0xc7,0xe1,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,\n   0xf5,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,\n   0xb3,0xaf,0xaf,0xaf,0xd6,0x6a,0x6a,0x6a,0xc2,0x87,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,\n   0xcc,0x81,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,\n   0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xbb,0xbb,0xbb,0xdc,0xaf,0xaf,0xaf,\n   0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xdc,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x06,0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,\n   0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xaf,0xaf,0xaf,0xd6,0x01,0x52,0x52,0x52,0xbd,0x7e,0x7e,0x7e,0xc7,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x06,\n   0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x01,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,\n   0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x01,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x03,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xc0,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x03,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xf7,\n   0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x04,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,\n   0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,\n   0x87,0x00,0x00,0x00,0xb3,0x04,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,\n   0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0xff,\n   0xff,0xff,0xff,0x03,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,\n   0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x03,0x7e,\n   0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,\n   0xd1,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x02,\n   0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x85,0x00,0x00,0x00,0xb3,0x04,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,\n   0xef,0xf5,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x02,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x02,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,\n   0xff,0x06,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xf7,0xf7,0xf7,0xfa,0x81,0xff,\n   0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x02,\n   0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,\n   0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,\n   0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,\n   0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x85,0x00,0x00,0x00,0xb3,0x04,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xef,\n   0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,\n   0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,\n   0xc7,0xe1,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x01,0xa0,0xa0,0xa0,0xd1,0xdc,0xdc,0xdc,0xeb,0x85,0xff,0xff,0xff,0xff,0x81,\n   0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,\n   0x84,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x86,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,\n   0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0xff,0xff,0xff,\n   0xff,0x00,0xc7,0xc7,0xc7,0xe1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x05,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xef,0xef,0xef,\n   0xf5,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x06,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xd2,\n   0xd2,0xd2,0xe6,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x05,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,\n   0xd6,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x87,0x00,0x00,0x00,0xb3,0x02,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,\n   0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x04,0x6a,0x6a,0x6a,0xc2,0xef,0xef,\n   0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x83,0x00,0x00,0x00,0xb3,0x04,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,\n   0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,0xdc,0xdc,0xdc,0xdc,0xeb,\n   0x81,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xdc,0xdc,0xdc,0xeb,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x06,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,\n   0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,\n   0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xaf,\n   0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,\n   0xdc,0xdc,0xdc,0xeb,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x52,0x52,0x52,0xbd,0x85,0x00,0x00,0x00,0xb3,0x06,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0xf7,\n   0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xd2,0xd2,0xd2,0xe6,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,\n   0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xdc,0xdc,0xdc,0xeb,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0x00,0x00,0x00,0xb3,0x81,0xdc,\n   0xdc,0xdc,0xeb,0x04,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,\n   0xdc,0xeb,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x05,0x7e,0x7e,0x7e,0xc7,0xc7,0xc7,0xc7,0xe1,0xff,0xff,\n   0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x04,0x6a,0x6a,0x6a,0xc2,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,\n   0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x02,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,\n   0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x04,0x6a,0x6a,0x6a,0xc2,0xef,0xef,0xef,0xf5,0xff,0xff,0xff,0xff,0xef,0xef,0xef,0xf5,0x90,0x90,0x90,0xcc,0x82,0x00,\n   0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x00,\n   0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0xaf,0xaf,0xaf,0xd6,\n   0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x06,0x7e,0x7e,0x7e,0xc7,0xd2,0xd2,0xd2,0xe6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xd2,0xd2,\n   0xd2,0xe6,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x05,0xbb,0xbb,0xbb,0xdc,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,\n   0xff,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x05,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,\n   0xdc,0xdc,0xeb,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x02,0xbb,0xbb,0xbb,0xdc,\n   0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0xa0,0xa0,0xa0,0xd1,0xbb,0xbb,0xbb,0xdc,0x81,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,\n   0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x08,0x33,0x33,0x33,0xb8,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,\n   0xc7,0xe1,0x52,0x52,0x52,0xbd,0xbb,0xbb,0xbb,0xdc,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xdc,0xdc,0xdc,0xeb,0x81,0x6a,0x6a,\n   0x6a,0xc2,0x81,0xdc,0xdc,0xdc,0xeb,0x04,0xa0,0xa0,0xa0,0xd1,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xb3,0x81,0xdc,0xdc,0xdc,\n   0xeb,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x01,\n   0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x03,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xdc,0xdc,0xdc,0xeb,0x01,0x00,0x00,0x00,0xb3,0xbb,0xbb,0xbb,0xdc,0x81,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,\n   0x06,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,\n   0x00,0xb3,0x81,0xdc,0xdc,0xdc,0xeb,0x05,0xbb,0xbb,0xbb,0xdc,0xa0,0xa0,0xa0,0xd1,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x6a,0x6a,0x6a,0xc2,\n   0x82,0x00,0x00,0x00,0xb3,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x9a,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa1,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,\n   0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xa9,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xb1,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0x52,0x52,0x52,0xbd,0xbe,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0x7e,0x7e,0x7e,0xc7,0x95,0x00,0x00,0x00,0xb3,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x9d,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,\n   0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xdd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xef,0xef,0xef,\n   0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x9a,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa1,0x00,0x00,0x00,0xb3,0x81,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,\n   0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xa9,0x00,0x00,0x00,0xb3,0x00,0xdc,\n   0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xb0,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xbd,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,\n   0x00,0x00,0x00,0xb3,0x03,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,0x94,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x9d,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x03,0xdc,0xdc,\n   0xdc,0xeb,0xff,0xff,0xff,0xff,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xdc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x9b,0x00,0x00,0x00,0xb3,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa1,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x00,0xef,\n   0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x81,0xbb,0xbb,0xbb,0xdc,0x8b,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,\n   0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xa9,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0x00,0x00,\n   0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xb0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0xbd,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,\n   0xff,0xff,0xff,0x94,0x00,0x00,0x00,0xb3,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x6a,0x6a,0x6a,0xc2,0x9d,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x81,0x7e,0x7e,0x7e,\n   0xc7,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xdc,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbf,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x85,0xdc,0xdc,0xdc,0xeb,0x01,0xbb,0xbb,\n   0xbb,0xdc,0x7e,0x7e,0x7e,0xc7,0x9c,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0xa1,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x8b,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,\n   0xdc,0xeb,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x81,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xa9,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,\n   0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x81,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xb0,0x00,0x00,0x00,0xb3,0x03,0x90,0x90,0x90,0xcc,0xf7,0xf7,0xf7,0xfa,\n   0xef,0xef,0xef,0xf5,0x52,0x52,0x52,0xbd,0xbd,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,\n   0xb3,0x02,0xdc,0xdc,0xdc,0xeb,0xff,0xff,0xff,0xff,0xaf,0xaf,0xaf,0xd6,0xbc,0x00,0x00,0x00,0xb3,0x02,0xaf,0xaf,0xaf,0xd6,0xff,0xff,0xff,0xff,0xdc,0xdc,0xdc,0xeb,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xdd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xe5,0x00,0x00,0x00,0xb3,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0xa1,0x00,0x00,0x00,0xb3,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0x88,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,\n   0xd1,0xd2,0xd2,0xd2,0xe6,0x81,0xdc,0xdc,0xdc,0xeb,0x8b,0x00,0x00,0x00,0xb3,0x81,0xaf,0xaf,0xaf,0xd6,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,\n   0xc7,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0xa9,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x81,\n   0xaf,0xaf,0xaf,0xd6,0x00,0xa0,0xa0,0xa0,0xd1,0xf2,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x81,0xaf,0xaf,0xaf,0xd6,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xa7,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbb,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,\n   0x6a,0xc2,0x82,0xaf,0xaf,0xaf,0xd6,0x01,0x90,0x90,0x90,0xcc,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x89,0x00,0x00,0x00,0xb3,0x01,\n   0x6a,0x6a,0x6a,0xc2,0xa0,0xa0,0xa0,0xd1,0x82,0xaf,0xaf,0xaf,0xd6,0x00,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xcb,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,\n   0xb8,0x7e,0x7e,0x7e,0xc7,0x83,0xaf,0xaf,0xaf,0xd6,0x01,0x7e,0x7e,0x7e,0xc7,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x8b,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,\n   0x00,0xb3,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x01,\n   0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0x8a,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,\n   0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xef,0xef,0xef,0xf5,0x84,0xff,0xff,0xff,0xff,0x04,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x6a,\n   0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x88,0x00,0x00,0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xe6,0xe6,0xe6,0xf0,0x85,\n   0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,\n   0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x8b,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x91,0x00,0x00,0x00,0xb3,0x82,0xff,\n   0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x86,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0x00,0x00,0x00,\n   0xb3,0x00,0x90,0x90,0x90,0xcc,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x88,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x02,\n   0xc7,0xc7,0xc7,0xe1,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,\n   0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x02,0xd2,0xd2,0xd2,0xe6,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x85,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x84,0xff,0xff,0xff,0xff,0x85,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xc7,0xc7,0xc7,0xe1,0x87,0xff,0xff,0xff,0xff,0x02,0xef,0xef,\n   0xef,0xf5,0xbb,0xbb,0xbb,0xdc,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x8b,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,\n   0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x87,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,\n   0x8a,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,\n   0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x89,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,\n   0xcc,0x88,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x88,0x00,0x00,0x00,0xb3,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x89,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,\n   0xf0,0x87,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,\n   0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x8b,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x90,0x00,0x00,0x00,0xb3,\n   0x00,0x90,0x90,0x90,0xcc,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x85,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x00,0x52,\n   0x52,0x52,0xbd,0x83,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x86,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,\n   0xbd,0x83,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,\n   0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x85,0x00,\n   0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x8c,0xff,0xff,0xff,0xff,\n   0x00,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x82,0x00,0x00,0x00,0xb3,0x8b,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,\n   0x6a,0x6a,0x6a,0xc2,0x85,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,\n   0xb3,0x8a,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,\n   0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x88,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,\n   0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xe6,0xe6,0xe6,0xf0,0x86,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x33,0x33,\n   0x33,0xb8,0x88,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x88,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x85,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,\n   0x82,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0x00,\n   0x00,0x00,0xb3,0x8b,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x90,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x83,0xff,0xff,0xff,0xff,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x83,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x83,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,\n   0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x85,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x85,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x85,0xff,0xff,\n   0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x8d,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xcc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,\n   0xf5,0x87,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x85,\n   0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,\n   0xef,0xf5,0x86,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x88,0x00,0x00,0x00,0xb3,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xef,0xef,0xef,0xf5,0x83,\n   0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x8a,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0xf7,0xf7,0xf7,0xfa,0x04,0xa0,0xa0,0xa0,\n   0xd1,0x33,0x33,0x33,0xb8,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x85,0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xef,\n   0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,\n   0xff,0x00,0xef,0xef,0xef,0xf5,0x87,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x90,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x83,0xff,0xff,\n   0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x83,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x83,0x00,0x00,0x00,0xb3,\n   0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x85,0x7e,0x7e,0x7e,0xc7,0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,\n   0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,\n   0x00,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x84,0x00,0x00,0x00,0xb3,0x00,\n   0x90,0x90,0x90,0xcc,0x86,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x02,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,\n   0xd6,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x02,0x6a,0x6a,0x6a,0xc2,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,\n   0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8a,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x8d,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x88,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xe6,\n   0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8c,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,\n   0x00,0x33,0x33,0x33,0xb8,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x8d,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,\n   0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x8f,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x84,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x83,0x00,0x00,\n   0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x84,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x84,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x8c,0xff,0xff,0xff,0xff,\n   0x00,0xf7,0xf7,0xf7,0xfa,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,\n   0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,\n   0x33,0xb8,0xef,0xef,0xef,0xf5,0x86,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x33,\n   0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xcc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x8b,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x8b,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x88,0x00,0x00,0x00,0xb3,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x85,0xff,0xff,0xff,0xff,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x91,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,\n   0xe1,0x8b,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x8f,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x85,\n   0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,\n   0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x8c,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,\n   0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,\n   0xff,0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x83,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x86,\n   0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcc,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8b,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x8b,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x83,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x88,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,\n   0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,\n   0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x8f,0x00,0x00,0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,\n   0xd2,0xd2,0xe6,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x8b,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0x00,0x00,0x00,0xb3,0x00,\n   0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x8f,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x81,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,\n   0x00,0xe6,0xe6,0xe6,0xf0,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x8b,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,\n   0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x83,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,\n   0xf7,0xf7,0xfa,0x90,0x90,0x90,0xcc,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,\n   0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x83,0xff,\n   0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,\n   0x00,0xc7,0xc7,0xc7,0xe1,0x87,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xcc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,\n   0xff,0x86,0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,\n   0xf7,0xf7,0xf7,0xfa,0x86,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x84,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0x52,0x52,\n   0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x83,0x00,0x00,0x00,0xb3,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x89,0x00,0x00,0x00,0xb3,\n   0x00,0xd2,0xd2,0xd2,0xe6,0x83,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0xff,0xff,0xff,0xff,0x01,0xa0,0xa0,0xa0,0xd1,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,\n   0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x8c,0x00,0x00,0x00,0xb3,0x02,0x90,0x90,0x90,0xcc,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x00,0xa0,\n   0xa0,0xa0,0xd1,0x83,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,\n   0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x83,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x89,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x86,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x85,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,\n   0x33,0x33,0x33,0xb8,0x8d,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x82,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0xc7,0xc7,0xc7,0xe1,0x81,0xff,0xff,0xff,\n   0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x82,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0xd2,0xd2,0xd2,0xe6,0x81,0xff,\n   0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x84,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x88,0xff,0xff,0xff,0xff,0x01,\n   0xe6,0xe6,0xe6,0xf0,0x90,0x90,0x90,0xcc,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,\n   0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x02,0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,\n   0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,\n   0x85,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x8a,0xff,0xff,0xff,\n   0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x84,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x89,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xe6,0xe6,0xe6,0xf0,0x86,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,\n   0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x89,0x00,0x00,0x00,0xb3,0x01,0x90,0x90,0x90,0xcc,0xef,0xef,0xef,0xf5,0x86,0xff,0xff,0xff,0xff,0x00,\n   0xc7,0xc7,0xc7,0xe1,0x84,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,\n   0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x89,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0x00,0x00,0x00,0xb3,0x8a,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x89,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x83,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x8d,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,\n   0xd1,0x82,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x90,0x90,0x90,0xcc,0x82,0xff,0xff,0xff,0xff,0x02,0x52,0x52,0x52,0xbd,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,\n   0xd6,0x82,0xff,0xff,0xff,0xff,0x01,0x52,0x52,0x52,0xbd,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0xef,\n   0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,\n   0x00,0x6a,0x6a,0x6a,0xc2,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x8a,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,0xb8,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,\n   0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,\n   0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,\n   0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x02,0x90,0x90,0x90,0xcc,0x00,0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0xff,0xff,0xff,0xff,\n   0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x8a,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x84,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,\n   0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8b,\n   0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,\n   0xbd,0x83,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xaf,0xaf,0xaf,0xd6,0x85,0x00,\n   0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x81,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,\n   0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x89,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,\n   0x00,0x00,0xb3,0x8a,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x88,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x84,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x8c,0x00,0x00,0x00,0xb3,0x00,0xc7,\n   0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x02,0x6a,0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,\n   0x00,0x00,0xb3,0xdc,0xdc,0xdc,0xeb,0x81,0xff,0xff,0xff,0xff,0x02,0xe6,0xe6,0xe6,0xf0,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,0x00,0xb3,0x90,0x90,0x90,0xcc,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x8b,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,\n   0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,0xff,0x02,0x6a,\n   0x6a,0x6a,0xc2,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x00,0xb3,0x33,0x33,0x33,\n   0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0xff,0xff,0xff,\n   0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,\n   0xf7,0xfa,0x86,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x85,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,\n   0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x85,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,\n   0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x8b,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x8d,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x84,0xff,\n   0xff,0xff,0xff,0x03,0xf7,0xf7,0xf7,0xfa,0xc7,0xc7,0xc7,0xe1,0x90,0x90,0x90,0xcc,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,\n   0xff,0xff,0xff,0x01,0x7e,0x7e,0x7e,0xc7,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x85,0xaf,0xaf,0xaf,0xd6,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,\n   0xf7,0xf7,0xfa,0x86,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x88,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x85,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0x8b,0x00,0x00,0x00,0xb3,0x00,0xf7,\n   0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,\n   0xf0,0x33,0x33,0x33,0xb8,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xd2,\n   0xd2,0xd2,0xe6,0x84,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x82,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0xd2,0xd2,0xd2,0xe6,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0x7e,0x7e,\n   0x7e,0xc7,0x01,0x90,0x90,0x90,0xcc,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,\n   0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0x52,0x52,0x52,0xbd,0x83,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,\n   0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xb3,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,\n   0xfa,0x52,0x52,0x52,0xbd,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0xaf,0xaf,0xaf,0xd6,0x00,0x52,0x52,0x52,0xbd,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xcc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,\n   0xff,0xff,0xff,0xff,0x86,0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,\n   0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x82,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xbb,0xbb,0xbb,0xdc,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x7e,0x7e,0x7e,0xc7,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x01,0xbb,0xbb,0xbb,0xdc,0xf7,0xf7,\n   0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x8c,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,\n   0xaf,0xaf,0xaf,0xd6,0x8b,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x82,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,\n   0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x82,\n   0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,\n   0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,\n   0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x81,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,\n   0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,\n   0x85,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x85,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,\n   0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x01,0xaf,0xaf,0xaf,0xd6,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,\n   0xff,0x01,0xef,0xef,0xef,0xf5,0x33,0x33,0x33,0xb8,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,\n   0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd9,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8e,0x00,\n   0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,\n   0x85,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xc7,0xc7,0xc7,0xe1,0x82,0xff,0xff,0xff,0xff,0x03,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,\n   0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x8c,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x8d,\n   0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,\n   0xb8,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x8d,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,\n   0x33,0xb8,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x02,0xa0,0xa0,0xa0,0xd1,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,\n   0x6a,0xc2,0x89,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,\n   0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x84,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,\n   0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,\n   0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x02,0x7e,0x7e,0x7e,0xc7,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,\n   0x83,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,\n   0xff,0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x81,\n   0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x83,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd8,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,\n   0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8e,0x00,\n   0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x86,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,\n   0xeb,0x89,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,\n   0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x8c,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,\n   0x00,0xc7,0xc7,0xc7,0xe1,0x83,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,\n   0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0x00,0x00,0x00,0xb3,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x8d,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,\n   0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,\n   0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x89,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0x00,0x00,0x00,0xb3,0x00,\n   0xd2,0xd2,0xd2,0xe6,0x84,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,\n   0xbb,0xdc,0x85,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0xff,0xff,0xff,0xff,0x00,0x33,0x33,0x33,0xb8,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x83,0x00,0x00,0x00,0xb3,0x01,0x6a,0x6a,0x6a,0xc2,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x02,0x6a,0x6a,\n   0x6a,0xc2,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x86,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,\n   0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,\n   0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x83,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x82,\n   0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x7e,0x7e,0x7e,0xc7,0x85,0x00,0x00,0x00,0xb3,0x01,0xbb,0xbb,0xbb,\n   0xdc,0xa0,0xa0,0xa0,0xd1,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcf,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,\n   0xd6,0x82,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x86,0xdc,0xdc,0xdc,0xeb,0x00,0xbb,0xbb,0xbb,0xdc,0x87,0x00,0x00,0x00,0xb3,0x00,\n   0xef,0xef,0xef,0xf5,0x84,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x86,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,\n   0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x83,0xdc,0xdc,0xdc,0xeb,0x00,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x84,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,\n   0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,\n   0xff,0x8c,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x83,0xff,0xff,0xff,0xff,0x06,0xc7,0xc7,0xc7,0xe1,0x90,0x90,0x90,0xcc,0x7e,0x7e,0x7e,0xc7,0xaf,0xaf,0xaf,\n   0xd6,0xef,0xef,0xef,0xf5,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x87,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x84,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,\n   0xbd,0x86,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xe6,0xe6,0xe6,0xf0,0x86,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x81,\n   0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x86,0xdc,0xdc,0xdc,0xeb,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,\n   0x83,0xdc,0xdc,0xdc,0xeb,0x00,0xe6,0xe6,0xe6,0xf0,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x83,0xdc,0xdc,0xdc,0xeb,0x02,0xa0,0xa0,0xa0,0xd1,0x00,0x00,\n   0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x83,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0x00,0x00,0x00,0xb3,0x00,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,\n   0xaf,0xaf,0xaf,0xd6,0x87,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x82,0xff,0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x83,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,\n   0xa0,0xd1,0x84,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0x83,0x00,0x00,0x00,0xb3,0x00,0xf7,0xf7,0xf7,0xfa,0x81,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,\n   0x85,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x84,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,0xc7,0xe1,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,\n   0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xaf,0xaf,0xaf,0xd6,0x01,0xc7,0xc7,0xc7,0xe1,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x52,0x52,0x52,0xbd,0x83,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x85,0xff,0xff,0xff,0xff,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,\n   0xff,0xff,0xff,0x82,0x00,0x00,0x00,0xb3,0x01,0x52,0x52,0x52,0xbd,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x01,0xc7,0xc7,0xc7,0xe1,0xa0,0xa0,0xa0,0xd1,0x81,\n   0x7e,0x7e,0x7e,0xc7,0x01,0xaf,0xaf,0xaf,0xd6,0xef,0xef,0xef,0xf5,0x81,0xff,0xff,0xff,0xff,0x00,0x90,0x90,0x90,0xcc,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xce,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,\n   0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,0x8a,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x83,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x87,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,\n   0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x8c,0xff,0xff,0xff,0xff,0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,\n   0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,\n   0xd1,0x83,0xff,0xff,0xff,0xff,0x01,0xdc,0xdc,0xdc,0xeb,0xef,0xef,0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x8d,0x00,0x00,0x00,0xb3,0x00,0xbb,\n   0xbb,0xbb,0xdc,0x88,0xff,0xff,0xff,0xff,0x01,0xe6,0xe6,0xe6,0xf0,0x33,0x33,0x33,0xb8,0x86,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x83,0xff,0xff,0xff,0xff,\n   0x00,0xd2,0xd2,0xd2,0xe6,0x87,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,0x8a,0xff,\n   0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x8c,0xff,0xff,0xff,0xff,0x02,0xaf,0xaf,0xaf,0xd6,0x00,0x00,0x00,0xb3,0xef,0xef,\n   0xef,0xf5,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x83,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x83,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,\n   0x86,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0xff,0xff,0xff,0xff,0x00,0xd2,0xd2,0xd2,0xe6,0x83,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x83,0xff,\n   0xff,0xff,0xff,0x00,0xf7,0xf7,0xf7,0xfa,0x84,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0x52,0x52,0x52,0xbd,0x85,0x00,0x00,0x00,\n   0xb3,0x00,0xef,0xef,0xef,0xf5,0x83,0xff,0xff,0xff,0xff,0x00,0x6a,0x6a,0x6a,0xc2,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x8b,0xff,0xff,0xff,0xff,0x00,\n   0x90,0x90,0x90,0xcc,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x85,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x33,0x33,0x33,0xb8,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x83,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x8b,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x7e,0x7e,0x7e,0xc7,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,\n   0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,0x00,0x00,0xb3,\n   0x8a,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,\n   0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x8c,0xff,0xff,0xff,0xff,\n   0x81,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x86,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x8b,0x00,0x00,0x00,0xb3,0x00,0xe6,0xe6,0xe6,0xf0,0x86,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0x6a,0x6a,0x6a,0xc2,0x8e,0x00,0x00,0x00,0xb3,\n   0x00,0xd2,0xd2,0xd2,0xe6,0x88,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x86,0x00,0x00,0x00,0xb3,0x01,0x33,0x33,0x33,0xb8,0xf7,0xf7,0xf7,0xfa,0x82,0xff,0xff,\n   0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x87,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x8a,0xff,0xff,0xff,0xff,0x00,0x7e,0x7e,0x7e,0xc7,0x81,0x00,0x00,0x00,0xb3,\n   0x8a,0xff,0xff,0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0x00,0x00,0x00,0xb3,0x7e,0x7e,0x7e,0xc7,0x8c,0xff,0xff,0xff,0xff,0x81,0xaf,0xaf,0xaf,0xd6,0x83,0xff,0xff,0xff,\n   0xff,0x00,0x52,0x52,0x52,0xbd,0x84,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x00,\n   0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x84,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xff,0xff,0xff,0xff,0x00,0xc7,0xc7,\n   0xc7,0xe1,0x84,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xdc,0xdc,0xdc,0xeb,0x87,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x89,0xff,0xff,0xff,0xff,0x01,0xf7,0xf7,0xf7,0xfa,0xa0,0xa0,\n   0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0xff,0xff,0xff,0xff,0x00,0xef,0xef,0xef,0xf5,0x85,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0x00,0x00,0x00,0xb3,0x00,0x7e,0x7e,0x7e,0xc7,0x82,0xff,0xff,0xff,0xff,0x00,0xaf,0xaf,0xaf,0xd6,0x82,0x00,\n   0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x84,0xff,0xff,0xff,0xff,0x00,0xa0,0xa0,0xa0,0xd1,0x85,0x00,0x00,0x00,0xb3,0x00,0xdc,0xdc,0xdc,0xeb,0x82,0xff,0xff,0xff,\n   0xff,0x84,0x00,0x00,0x00,0xb3,0x01,0x7e,0x7e,0x7e,0xc7,0xef,0xef,0xef,0xf5,0x89,0xff,0xff,0xff,0xff,0x01,0xef,0xef,0xef,0xf5,0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xcd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd0,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,\n   0x82,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x8a,0xdc,\n   0xdc,0xdc,0xeb,0x00,0xbb,0xbb,0xbb,0xdc,0x88,0x00,0x00,0x00,0xb3,0x00,0xaf,0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xd2,0xd2,0xd2,0xe6,0x88,0x00,0x00,0x00,\n   0xb3,0x82,0xdc,0xdc,0xdc,0xeb,0x00,0xbb,0xbb,0xbb,0xdc,0x84,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x8c,0xdc,0xdc,0xdc,0xeb,0x81,0x00,0x00,0x00,0xb3,0x00,\n   0xbb,0xbb,0xbb,0xdc,0x82,0xdc,0xdc,0xdc,0xeb,0x86,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x8b,0x00,0x00,\n   0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xf7,0xf7,0xf7,0xfa,0x83,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x6a,0x6a,0x6a,0xc2,0x90,0x00,0x00,\n   0x00,0xb3,0x01,0xa0,0xa0,0xa0,0xd1,0xe6,0xe6,0xe6,0xf0,0x84,0xff,0xff,0xff,0xff,0x01,0xd2,0xd2,0xd2,0xe6,0x7e,0x7e,0x7e,0xc7,0x88,0x00,0x00,0x00,0xb3,0x00,0xaf,\n   0xaf,0xaf,0xd6,0x81,0xdc,0xdc,0xdc,0xeb,0x00,0xd2,0xd2,0xd2,0xe6,0x88,0x00,0x00,0x00,0xb3,0x00,0xa0,0xa0,0xa0,0xd1,0x8a,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,\n   0xc2,0x81,0x00,0x00,0x00,0xb3,0x8a,0xdc,0xdc,0xdc,0xeb,0x02,0xbb,0xbb,0xbb,0xdc,0x00,0x00,0x00,0xb3,0x6a,0x6a,0x6a,0xc2,0x8c,0xdc,0xdc,0xdc,0xeb,0x00,0xaf,0xaf,\n   0xaf,0xd6,0x83,0xdc,0xdc,0xdc,0xeb,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,0xb3,0x00,0x52,0x52,0x52,0xbd,0x83,0xdc,0xdc,0xdc,0xeb,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x85,0x00,0x00,0x00,0xb3,0x00,0xd2,0xd2,0xd2,0xe6,0x82,0xdc,0xdc,0xdc,0xeb,0x00,0x6a,0x6a,0x6a,0xc2,0x84,0x00,0x00,0x00,0xb3,0x00,0x90,0x90,0x90,0xcc,0x82,0xdc,\n   0xdc,0xdc,0xeb,0x00,0x7e,0x7e,0x7e,0xc7,0x84,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xdc,0xdc,0xdc,0xeb,0x00,0xaf,0xaf,0xaf,0xd6,0x85,0x00,0x00,0x00,\n   0xb3,0x00,0x33,0x33,0x33,0xb8,0x82,0xdc,0xdc,0xdc,0xeb,0x00,0x90,0x90,0x90,0xcc,0x87,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x87,0xdc,0xdc,0xdc,0xeb,0x02,\n   0xbb,0xbb,0xbb,0xdc,0xa0,0xa0,0xa0,0xd1,0x33,0x33,0x33,0xb8,0x83,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x84,0xdc,0xdc,0xdc,0xeb,0x00,0x7e,0x7e,0x7e,0xc7,\n   0x85,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xdc,0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x81,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x82,0xdc,\n   0xdc,0xdc,0xeb,0x00,0xa0,0xa0,0xa0,0xd1,0x82,0x00,0x00,0x00,0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x83,0xdc,0xdc,0xdc,0xeb,0x00,0xc7,0xc7,0xc7,0xe1,0x86,0x00,0x00,0x00,\n   0xb3,0x00,0xbb,0xbb,0xbb,0xdc,0x82,0xdc,0xdc,0xdc,0xeb,0x85,0x00,0x00,0x00,0xb3,0x02,0x33,0x33,0x33,0xb8,0xaf,0xaf,0xaf,0xd6,0xe6,0xe6,0xe6,0xf0,0x85,0xff,0xff,\n   0xff,0xff,0x02,0xdc,0xdc,0xdc,0xeb,0xa0,0xa0,0xa0,0xd1,0x33,0x33,0x33,0xb8,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xce,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xbd,0x00,0x00,0x00,0xb3,0x00,0x6a,0x6a,0x6a,0xc2,0x81,0x7e,0x7e,0x7e,0xc7,0x00,0x33,0x33,0x33,\n   0xb8,0x94,0x00,0x00,0x00,0xb3,0x00,0x33,0x33,0x33,0xb8,0x82,0x7e,0x7e,0x7e,0xc7,0xff,0x00,0x00,0x00,0xb3,0xcd,0x00,0x00,0x00,0xb3,0x82,0x7e,0x7e,0x7e,0xc7,0x00,\n   0x6a,0x6a,0x6a,0xc2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xd2,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x02,0x04,0x04,0x13,0xb7,0x20,0x24,0xa9,0xdf,0x26,0x2e,0xd7,0xef,0x91,0x28,0x2f,0xd9,0xf0,0x02,0x26,0x2e,0xd7,0xef,0x1f,0x25,\n   0xa8,0xde,0x04,0x04,0x13,0xb7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x23,0x28,0xbb,0xe5,0x95,0x2e,0x37,0xff,0xff,0x00,0x22,0x27,0xb6,0xe4,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xf2,0x00,0x00,0x00,0xb3,0x00,0x2d,0x35,0xf7,0xfb,0x88,0x2e,0x37,0xff,0xff,0x00,0x26,0x2b,0xcb,0xea,0x81,0x20,0x25,0xad,0xe1,0x00,0x26,0x2b,0xcc,0xea,0x88,0x2e,\n   0x37,0xff,0xff,0x00,0x2c,0x34,0xf2,0xf9,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x28,0x30,0xde,0xf1,0x87,0x2e,0x37,0xff,0xff,0x00,0x24,0x2b,0xc4,0xe8,0x83,\n   0x00,0x00,0x00,0xb3,0x00,0x25,0x2a,0xc7,0xea,0x87,0x2e,0x37,0xff,0xff,0x00,0x26,0x2e,0xd7,0xef,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xf4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf2,0x00,0x00,0x00,0xb3,0x00,0x13,0x17,0x68,0xcb,\n   0x87,0x2e,0x37,0xff,0xff,0x00,0x1f,0x25,0xab,0xe0,0x83,0x00,0x00,0x00,0xb3,0x00,0x1f,0x25,0xab,0xe0,0x87,0x2e,0x37,0xff,0xff,0x00,0x13,0x16,0x61,0xca,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf4,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xf3,0x00,0x00,0x00,0xb3,0x00,0x25,0x2c,0xcd,0xec,0x86,0x2e,0x37,0xff,0xff,0x01,0x26,0x2d,0xd2,0xed,0x01,0x01,0x05,0xb4,0x81,0x00,0x00,0x00,0xb3,0x01,0x01,\n   0x01,0x06,0xb4,0x27,0x2e,0xd6,0xef,0x86,0x2e,0x37,0xff,0xff,0x00,0x26,0x2b,0xcb,0xea,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xf5,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf3,0x00,0x00,0x00,0xb3,0x01,0x0d,0x0e,0x40,0xc1,0x2e,0x37,\n   0xfd,0xfe,0x86,0x2e,0x37,0xff,0xff,0x00,0x2b,0x31,0xe9,0xf5,0x81,0x28,0x2f,0xd9,0xf0,0x00,0x2b,0x31,0xe9,0xf6,0x86,0x2e,0x37,0xff,0xff,0x01,0x2d,0x36,0xfc,0xfe,\n   0x0c,0x0d,0x3b,0xc0,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf5,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf4,0x00,0x00,0x00,0xb3,0x00,0x20,0x26,0xb0,0xe1,0x91,0x2e,0x37,0xff,0xff,0x00,0x20,0x24,0xa9,0xdf,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf4,0x00,\n   0x00,0x00,0xb3,0x01,0x06,0x07,0x1e,0xb9,0x2c,0x34,0xf4,0xfb,0x84,0x2e,0x37,0xff,0xff,0x01,0x2e,0x37,0xfe,0xff,0x24,0x2b,0xc5,0xe8,0x81,0x20,0x25,0xad,0xe1,0x00,\n   0x25,0x2a,0xc6,0xe9,0x85,0x2e,0x37,0xff,0xff,0x01,0x2c,0x34,0xf2,0xfa,0x05,0x06,0x1b,0xb9,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xf6,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf5,0x00,0x00,0x00,0xb3,0x00,0x19,0x1f,0x8b,0xd5,0x84,\n   0x2e,0x37,0xff,0xff,0x00,0x24,0x2a,0xc4,0xe8,0x83,0x00,0x00,0x00,0xb3,0x00,0x25,0x2a,0xc7,0xe9,0x84,0x2e,0x37,0xff,0xff,0x00,0x19,0x1d,0x85,0xd4,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf7,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xf5,0x00,0x00,0x00,0xb3,0x01,0x02,0x02,0x09,0xb5,0x2a,0x30,0xe4,0xf4,0x83,0x2e,0x37,0xff,0xff,0x00,0x1f,0x25,0xab,0xe0,0x83,0x00,0x00,0x00,0xb3,0x00,0x1f,0x25,\n   0xab,0xe0,0x83,0x2e,0x37,0xff,0xff,0x01,0x29,0x31,0xe2,0xf3,0x01,0x01,0x06,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf7,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf6,0x00,0x00,0x00,0xb3,0x00,0x13,0x16,0x62,0xca,0x83,0x2e,0x37,\n   0xff,0xff,0x00,0x1f,0x25,0xab,0xe0,0x83,0x00,0x00,0x00,0xb3,0x00,0x1f,0x25,0xab,0xe0,0x83,0x2e,0x37,0xff,0xff,0x00,0x11,0x14,0x5c,0xc8,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf8,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf7,0x00,\n   0x00,0x00,0xb3,0x00,0x26,0x2b,0xcc,0xea,0x82,0x2e,0x37,0xff,0xff,0x00,0x1f,0x25,0xab,0xe0,0x83,0x00,0x00,0x00,0xb3,0x00,0x1f,0x25,0xab,0xe0,0x82,0x2e,0x37,0xff,\n   0xff,0x00,0x24,0x2b,0xc5,0xe9,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf9,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf7,0x00,0x00,0x00,0xb3,0x01,0x0c,0x0d,0x3b,0xc0,0x2d,0x36,0xfc,0xfe,0x81,0x2e,0x37,0xff,0xff,0x00,0x1f,0x25,0xab,\n   0xe0,0x83,0x00,0x00,0x00,0xb3,0x00,0x1f,0x25,0xab,0xe0,0x81,0x2e,0x37,0xff,0xff,0x01,0x2d,0x36,0xfb,0xfe,0x0a,0x0c,0x36,0xbf,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf9,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf8,0x00,0x00,0x00,\n   0xb3,0x00,0x20,0x24,0xa9,0xdf,0x81,0x2e,0x37,0xff,0xff,0x00,0x21,0x26,0xb2,0xe2,0x83,0x00,0x00,0x00,0xb3,0x00,0x21,0x26,0xb2,0xe2,0x81,0x2e,0x37,0xff,0xff,0x00,\n   0x1f,0x24,0xa4,0xde,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfa,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf8,0x00,0x00,0x00,0xb3,0x04,0x05,0x06,0x1b,0xb9,0x2c,0x34,0xf3,0xfa,0x2e,0x37,0xff,0xff,0x2c,0x34,0xf3,0xfa,0x14,0x16,0x65,\n   0xcb,0x81,0x0d,0x0f,0x44,0xc2,0x04,0x14,0x17,0x67,0xcb,0x2c,0x34,0xf4,0xfb,0x2e,0x37,0xff,0xff,0x2b,0x33,0xf1,0xf9,0x05,0x05,0x17,0xb8,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfa,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf9,0x00,\n   0x00,0x00,0xb3,0x00,0x19,0x1d,0x85,0xd4,0x87,0x2e,0x37,0xff,0xff,0x00,0x18,0x1c,0x81,0xd2,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xfb,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xf9,0x00,0x00,0x00,0xb3,0x01,0x02,0x02,0x07,0xb4,0x29,\n   0x31,0xe2,0xf3,0x85,0x2e,0x37,0xff,0xff,0x01,0x28,0x30,0xdf,0xf2,0x01,0x01,0x05,0xb4,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xfb,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfa,0x00,0x00,0x00,0xb3,0x00,0x12,0x14,0x5d,0xc8,0x85,0x2e,\n   0x37,0xff,0xff,0x00,0x10,0x13,0x56,0xc7,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfc,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfb,0x00,0x00,0x00,0xb3,0x00,0x25,0x2a,0xc6,0xe9,0x83,0x2e,0x37,0xff,0xff,0x00,0x23,0x2a,0xc2,0xe7,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xfb,0x00,0x00,0x00,0xb3,0x01,0x0a,0x0c,0x36,0xbf,0x2e,0x36,0xf9,0xfc,0x81,0x2e,0x37,0xff,0xff,0x01,0x2c,0x35,0xf8,0xfc,0x09,0x0a,0x30,0xbd,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xfd,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xfc,0x00,0x00,0x00,0xb3,0x03,0x10,0x12,0x52,0xc6,0x25,0x2a,0xc7,0xe9,0x25,0x2a,0xc6,0xe9,0x0f,0x10,0x4d,0xc5,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xfe,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,\n   0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,\n   0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,\n   0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,\n   0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,\n   0xb3,0xff,0x00,0x00,0x00,0xb3,0xff,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x52,0x55,0x45,0x56,0x49,0x53,0x49,0x4f,0x4e,0x2d,0x58,0x46,\n   0x49,0x4c,0x45,0x2e,0x00\n};\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/Textures/overdriveLut_dk2.h",
    "content": "const uint8_t overdriveLut_dk2[256*256*4] = {\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x17,0x23,0x19,0x00,0x19,0x24,0x1a,0x00,0x1a,0x25,0x1c,0x00,0x1c,0x25,0x1d,0x00,\n\t0x1d,0x26,0x1e,0x00,0x1e,0x27,0x1f,0x00,0x20,0x28,0x20,0x00,0x21,0x29,0x21,0x00,0x22,0x2a,0x22,0x00,0x23,0x2b,0x24,0x00,0x25,0x2c,0x25,0x00,0x26,0x2d,0x27,0x00,\n\t0x27,0x2e,0x28,0x00,0x28,0x2f,0x29,0x00,0x29,0x30,0x2b,0x00,0x2a,0x31,0x2c,0x00,0x2b,0x32,0x2d,0x00,0x2c,0x33,0x2e,0x00,0x2e,0x35,0x30,0x00,0x2f,0x36,0x31,0x00,\n\t0x30,0x37,0x32,0x00,0x31,0x38,0x33,0x00,0x33,0x3a,0x35,0x00,0x34,0x3b,0x36,0x00,0x35,0x3c,0x37,0x00,0x36,0x3d,0x38,0x00,0x38,0x3f,0x3a,0x00,0x39,0x40,0x3b,0x00,\n\t0x3a,0x41,0x3c,0x00,0x3c,0x42,0x3d,0x00,0x3d,0x43,0x3f,0x00,0x3f,0x43,0x40,0x00,0x40,0x44,0x41,0x00,0x41,0x45,0x42,0x00,0x42,0x47,0x43,0x00,0x43,0x48,0x44,0x00,\n\t0x44,0x49,0x45,0x00,0x45,0x4a,0x46,0x00,0x46,0x4b,0x48,0x00,0x47,0x4c,0x49,0x00,0x48,0x4d,0x4a,0x00,0x49,0x4e,0x4b,0x00,0x4a,0x4f,0x4c,0x00,0x4b,0x50,0x4d,0x00,\n\t0x4c,0x51,0x4e,0x00,0x4d,0x52,0x4f,0x00,0x4f,0x54,0x50,0x00,0x50,0x55,0x51,0x00,0x51,0x56,0x52,0x00,0x52,0x57,0x53,0x00,0x53,0x59,0x55,0x00,0x54,0x5a,0x56,0x00,\n\t0x55,0x5b,0x57,0x00,0x57,0x5d,0x58,0x00,0x58,0x5e,0x5a,0x00,0x5a,0x60,0x5b,0x00,0x5b,0x61,0x5c,0x00,0x5d,0x63,0x5e,0x00,0x5e,0x64,0x60,0x00,0x60,0x66,0x61,0x00,\n\t0x61,0x67,0x63,0x00,0x61,0x68,0x64,0x00,0x63,0x6a,0x66,0x00,0x64,0x6b,0x67,0x00,0x65,0x6c,0x68,0x00,0x66,0x6d,0x69,0x00,0x68,0x6f,0x6b,0x00,0x69,0x70,0x6c,0x00,\n\t0x6a,0x71,0x6d,0x00,0x6b,0x72,0x6e,0x00,0x6d,0x74,0x70,0x00,0x6e,0x75,0x71,0x00,0x6f,0x76,0x72,0x00,0x70,0x77,0x73,0x00,0x72,0x79,0x75,0x00,0x73,0x7a,0x76,0x00,\n\t0x74,0x7b,0x77,0x00,0x75,0x7c,0x78,0x00,0x76,0x7d,0x79,0x00,0x77,0x7e,0x7a,0x00,0x79,0x7f,0x7c,0x00,0x7a,0x80,0x7d,0x00,0x7b,0x81,0x7e,0x00,0x7c,0x82,0x7f,0x00,\n\t0x7d,0x84,0x80,0x00,0x7e,0x85,0x81,0x00,0x7f,0x86,0x82,0x00,0x80,0x87,0x83,0x00,0x82,0x88,0x85,0x00,0x83,0x89,0x86,0x00,0x84,0x8a,0x87,0x00,0x85,0x8b,0x88,0x00,\n\t0x86,0x8c,0x89,0x00,0x87,0x8d,0x8a,0x00,0x89,0x8e,0x8b,0x00,0x8a,0x90,0x8d,0x00,0x8b,0x91,0x8e,0x00,0x8c,0x92,0x8f,0x00,0x8e,0x93,0x90,0x00,0x8f,0x94,0x91,0x00,\n\t0x90,0x96,0x93,0x00,0x91,0x97,0x94,0x00,0x93,0x98,0x95,0x00,0x94,0x99,0x96,0x00,0x95,0x9a,0x97,0x00,0x96,0x9b,0x98,0x00,0x98,0x9d,0x9a,0x00,0x99,0x9e,0x9b,0x00,\n\t0x9a,0x9f,0x9c,0x00,0x9b,0xa0,0x9d,0x00,0x9c,0xa1,0x9e,0x00,0x9d,0xa2,0xa0,0x00,0x9f,0xa4,0xa1,0x00,0xa0,0xa5,0xa2,0x00,0xa1,0xa6,0xa3,0x00,0xa2,0xa7,0xa4,0x00,\n\t0xa3,0xa8,0xa6,0x00,0xa4,0xa9,0xa7,0x00,0xa5,0xaa,0xa8,0x00,0xa6,0xab,0xa9,0x00,0xa8,0xad,0xaa,0x00,0xa9,0xae,0xab,0x00,0xaa,0xaf,0xad,0x00,0xab,0xb0,0xae,0x00,\n\t0xac,0xb1,0xaf,0x00,0xad,0xb2,0xb0,0x00,0xaf,0xb3,0xb2,0x00,0xb0,0xb5,0xb3,0x00,0xb1,0xb6,0xb4,0x00,0xb2,0xb7,0xb5,0x00,0xb4,0xb8,0xb7,0x00,0xb5,0xb9,0xb8,0x00,\n\t0xb6,0xbb,0xb9,0x00,0xb7,0xbc,0xba,0x00,0xb9,0xbd,0xbc,0x00,0xba,0xbe,0xbd,0x00,0xbb,0xbf,0xbe,0x00,0xbc,0xc0,0xbf,0x00,0xbe,0xc2,0xc1,0x00,0xbf,0xc3,0xc2,0x00,\n\t0xc0,0xc4,0xc3,0x00,0xc1,0xc5,0xc4,0x00,0xc2,0xc6,0xc5,0x00,0xc4,0xc7,0xc6,0x00,0xc5,0xc9,0xc7,0x00,0xc6,0xca,0xc8,0x00,0xc7,0xcb,0xc9,0x00,0xc8,0xcc,0xca,0x00,\n\t0xca,0xcd,0xcc,0x00,0xcb,0xce,0xcd,0x00,0xcc,0xcf,0xce,0x00,0xcd,0xd0,0xcf,0x00,0xce,0xd2,0xd0,0x00,0xcf,0xd3,0xd1,0x00,0xd1,0xd4,0xd2,0x00,0xd2,0xd5,0xd3,0x00,\n\t0xd3,0xd6,0xd4,0x00,0xd4,0xd7,0xd5,0x00,0xd5,0xd8,0xd6,0x00,0xd7,0xd9,0xd8,0x00,0xd8,0xda,0xd9,0x00,0xd9,0xdb,0xda,0x00,0xda,0xdc,0xdb,0x00,0xdb,0xdd,0xdc,0x00,\n\t0xdd,0xdf,0xde,0x00,0xde,0xe0,0xdf,0x00,0xdf,0xe1,0xe0,0x00,0xe0,0xe2,0xe1,0x00,0xe1,0xe3,0xe2,0x00,0xe2,0xe4,0xe3,0x00,0xe4,0xe5,0xe5,0x00,0xe5,0xe6,0xe6,0x00,\n\t0xe6,0xe7,0xe7,0x00,0xe7,0xe8,0xe8,0x00,0xe8,0xe9,0xe9,0x00,0xe9,0xea,0xea,0x00,0xeb,0xec,0xeb,0x00,0xec,0xed,0xec,0x00,0xed,0xee,0xed,0x00,0xee,0xef,0xee,0x00,\n\t0xef,0xf0,0xf0,0x00,0xf0,0xf1,0xf1,0x00,0xf1,0xf2,0xf2,0x00,0xf2,0xf3,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf5,0xf6,0xf5,0x00,0xf6,0xf7,0xf6,0x00,0xf7,0xf8,0xf7,0x00,\n\t0xf8,0xf9,0xf8,0x00,0xf8,0xf9,0xf8,0x00,0xf9,0xfa,0xf9,0x00,0xf9,0xfa,0xf9,0x00,0xfa,0xfb,0xfa,0x00,0xfa,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfb,0xfc,0xfb,0x00,\n\t0xfc,0xfc,0xfc,0x00,0xfc,0xfc,0xfc,0x00,0xfc,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfd,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x17,0x21,0x19,0x00,0x18,0x21,0x1a,0x00,0x1a,0x22,0x1b,0x00,0x1b,0x23,0x1c,0x00,\n\t0x1d,0x24,0x1d,0x00,0x1e,0x25,0x1e,0x00,0x1f,0x26,0x1f,0x00,0x20,0x27,0x20,0x00,0x22,0x28,0x22,0x00,0x23,0x29,0x23,0x00,0x24,0x2a,0x24,0x00,0x25,0x2b,0x26,0x00,\n\t0x27,0x2c,0x27,0x00,0x28,0x2d,0x28,0x00,0x29,0x2e,0x2a,0x00,0x2a,0x2f,0x2b,0x00,0x2b,0x30,0x2c,0x00,0x2c,0x31,0x2d,0x00,0x2d,0x32,0x2f,0x00,0x2e,0x34,0x30,0x00,\n\t0x30,0x35,0x31,0x00,0x31,0x36,0x32,0x00,0x32,0x37,0x34,0x00,0x33,0x39,0x35,0x00,0x35,0x3a,0x36,0x00,0x36,0x3b,0x37,0x00,0x37,0x3c,0x39,0x00,0x39,0x3e,0x3a,0x00,\n\t0x3a,0x3f,0x3b,0x00,0x3b,0x40,0x3c,0x00,0x3d,0x40,0x3d,0x00,0x3e,0x41,0x3f,0x00,0x3f,0x42,0x40,0x00,0x40,0x43,0x41,0x00,0x41,0x45,0x42,0x00,0x42,0x46,0x43,0x00,\n\t0x44,0x47,0x44,0x00,0x45,0x48,0x45,0x00,0x46,0x49,0x46,0x00,0x47,0x4a,0x48,0x00,0x48,0x4b,0x49,0x00,0x49,0x4c,0x4a,0x00,0x4a,0x4d,0x4b,0x00,0x4b,0x4e,0x4c,0x00,\n\t0x4c,0x4f,0x4d,0x00,0x4d,0x50,0x4e,0x00,0x4e,0x52,0x4f,0x00,0x4f,0x53,0x50,0x00,0x51,0x54,0x51,0x00,0x52,0x55,0x52,0x00,0x53,0x57,0x53,0x00,0x54,0x58,0x55,0x00,\n\t0x55,0x59,0x56,0x00,0x56,0x5a,0x57,0x00,0x57,0x5c,0x58,0x00,0x59,0x5d,0x5a,0x00,0x5a,0x5f,0x5b,0x00,0x5c,0x60,0x5c,0x00,0x5d,0x62,0x5e,0x00,0x5f,0x63,0x60,0x00,\n\t0x60,0x65,0x62,0x00,0x61,0x67,0x64,0x00,0x62,0x69,0x65,0x00,0x63,0x6a,0x66,0x00,0x65,0x6b,0x67,0x00,0x66,0x6c,0x69,0x00,0x67,0x6e,0x6a,0x00,0x68,0x6f,0x6b,0x00,\n\t0x6a,0x70,0x6c,0x00,0x6b,0x71,0x6e,0x00,0x6c,0x73,0x6f,0x00,0x6d,0x74,0x70,0x00,0x6f,0x75,0x71,0x00,0x70,0x76,0x73,0x00,0x71,0x78,0x74,0x00,0x72,0x79,0x75,0x00,\n\t0x74,0x7a,0x76,0x00,0x75,0x7b,0x77,0x00,0x76,0x7c,0x79,0x00,0x77,0x7d,0x7a,0x00,0x78,0x7e,0x7b,0x00,0x79,0x7f,0x7c,0x00,0x7a,0x81,0x7d,0x00,0x7b,0x82,0x7e,0x00,\n\t0x7d,0x83,0x7f,0x00,0x7e,0x84,0x80,0x00,0x7f,0x85,0x82,0x00,0x80,0x86,0x83,0x00,0x81,0x87,0x84,0x00,0x82,0x88,0x85,0x00,0x83,0x89,0x86,0x00,0x84,0x8a,0x87,0x00,\n\t0x86,0x8b,0x88,0x00,0x87,0x8c,0x89,0x00,0x88,0x8e,0x8b,0x00,0x89,0x8f,0x8c,0x00,0x8b,0x90,0x8d,0x00,0x8c,0x91,0x8e,0x00,0x8d,0x92,0x8f,0x00,0x8e,0x93,0x91,0x00,\n\t0x8f,0x95,0x92,0x00,0x91,0x96,0x93,0x00,0x92,0x97,0x94,0x00,0x93,0x98,0x95,0x00,0x94,0x99,0x96,0x00,0x96,0x9b,0x98,0x00,0x97,0x9c,0x99,0x00,0x98,0x9d,0x9a,0x00,\n\t0x99,0x9e,0x9b,0x00,0x9b,0x9f,0x9c,0x00,0x9c,0xa0,0x9e,0x00,0x9d,0xa2,0x9f,0x00,0x9e,0xa3,0xa0,0x00,0x9f,0xa4,0xa1,0x00,0xa0,0xa5,0xa2,0x00,0xa1,0xa6,0xa3,0x00,\n\t0xa2,0xa7,0xa5,0x00,0xa4,0xa8,0xa6,0x00,0xa5,0xa9,0xa7,0x00,0xa6,0xab,0xa8,0x00,0xa7,0xac,0xa9,0x00,0xa8,0xad,0xab,0x00,0xa9,0xae,0xac,0x00,0xaa,0xaf,0xad,0x00,\n\t0xac,0xb0,0xae,0x00,0xad,0xb1,0xaf,0x00,0xae,0xb2,0xb1,0x00,0xaf,0xb4,0xb2,0x00,0xb0,0xb5,0xb3,0x00,0xb2,0xb6,0xb4,0x00,0xb3,0xb7,0xb6,0x00,0xb4,0xb8,0xb7,0x00,\n\t0xb5,0xba,0xb8,0x00,0xb7,0xbb,0xb9,0x00,0xb8,0xbc,0xbb,0x00,0xb9,0xbd,0xbc,0x00,0xba,0xbe,0xbd,0x00,0xbc,0xc0,0xbe,0x00,0xbd,0xc1,0xc0,0x00,0xbe,0xc2,0xc1,0x00,\n\t0xbf,0xc3,0xc2,0x00,0xc1,0xc4,0xc3,0x00,0xc2,0xc5,0xc4,0x00,0xc3,0xc6,0xc5,0x00,0xc4,0xc8,0xc6,0x00,0xc5,0xc9,0xc7,0x00,0xc6,0xca,0xc8,0x00,0xc8,0xcb,0xc9,0x00,\n\t0xc9,0xcc,0xcb,0x00,0xca,0xcd,0xcc,0x00,0xcb,0xce,0xcd,0x00,0xcc,0xcf,0xce,0x00,0xce,0xd1,0xcf,0x00,0xcf,0xd2,0xd0,0x00,0xd0,0xd3,0xd1,0x00,0xd1,0xd4,0xd2,0x00,\n\t0xd2,0xd5,0xd3,0x00,0xd3,0xd6,0xd4,0x00,0xd5,0xd7,0xd5,0x00,0xd6,0xd8,0xd7,0x00,0xd7,0xd9,0xd8,0x00,0xd8,0xda,0xd9,0x00,0xd9,0xdb,0xda,0x00,0xdb,0xdd,0xdb,0x00,\n\t0xdc,0xde,0xdd,0x00,0xdd,0xdf,0xde,0x00,0xde,0xe0,0xdf,0x00,0xdf,0xe1,0xe0,0x00,0xe1,0xe2,0xe1,0x00,0xe2,0xe3,0xe2,0x00,0xe3,0xe4,0xe4,0x00,0xe4,0xe5,0xe5,0x00,\n\t0xe5,0xe6,0xe6,0x00,0xe6,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xeb,0xea,0x00,0xeb,0xec,0xeb,0x00,0xec,0xed,0xec,0x00,0xed,0xee,0xed,0x00,\n\t0xee,0xef,0xee,0x00,0xef,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf4,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf5,0xf6,0xf5,0x00,0xf6,0xf7,0xf6,0x00,\n\t0xf7,0xf8,0xf7,0x00,0xf8,0xf8,0xf7,0x00,0xf8,0xf9,0xf8,0x00,0xf9,0xf9,0xf8,0x00,0xf9,0xfa,0xf9,0x00,0xfa,0xfa,0xf9,0x00,0xfa,0xfb,0xfa,0x00,0xfb,0xfb,0xfa,0x00,\n\t0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x17,0x1e,0x18,0x00,0x18,0x1f,0x19,0x00,0x1a,0x20,0x1a,0x00,0x1b,0x21,0x1b,0x00,\n\t0x1d,0x22,0x1d,0x00,0x1e,0x23,0x1e,0x00,0x1f,0x24,0x1f,0x00,0x20,0x25,0x20,0x00,0x21,0x26,0x21,0x00,0x22,0x27,0x22,0x00,0x24,0x28,0x24,0x00,0x25,0x29,0x25,0x00,\n\t0x26,0x2a,0x26,0x00,0x27,0x2b,0x27,0x00,0x28,0x2c,0x29,0x00,0x29,0x2d,0x2a,0x00,0x2b,0x2e,0x2c,0x00,0x2c,0x2f,0x2d,0x00,0x2d,0x30,0x2e,0x00,0x2e,0x31,0x2f,0x00,\n\t0x2f,0x33,0x30,0x00,0x30,0x34,0x31,0x00,0x32,0x35,0x33,0x00,0x33,0x36,0x34,0x00,0x34,0x38,0x35,0x00,0x36,0x39,0x36,0x00,0x37,0x3a,0x38,0x00,0x39,0x3b,0x39,0x00,\n\t0x3a,0x3d,0x3a,0x00,0x3b,0x3d,0x3b,0x00,0x3c,0x3e,0x3c,0x00,0x3d,0x3f,0x3d,0x00,0x3f,0x40,0x3f,0x00,0x40,0x41,0x40,0x00,0x41,0x43,0x41,0x00,0x42,0x44,0x42,0x00,\n\t0x43,0x45,0x43,0x00,0x44,0x46,0x44,0x00,0x45,0x47,0x45,0x00,0x46,0x48,0x46,0x00,0x47,0x49,0x48,0x00,0x48,0x4a,0x49,0x00,0x49,0x4b,0x4a,0x00,0x4a,0x4c,0x4b,0x00,\n\t0x4b,0x4e,0x4c,0x00,0x4c,0x4f,0x4d,0x00,0x4e,0x50,0x4e,0x00,0x4f,0x51,0x4f,0x00,0x50,0x52,0x50,0x00,0x51,0x53,0x51,0x00,0x52,0x55,0x52,0x00,0x53,0x56,0x53,0x00,\n\t0x54,0x57,0x55,0x00,0x55,0x58,0x56,0x00,0x57,0x5a,0x57,0x00,0x58,0x5b,0x58,0x00,0x5a,0x5c,0x5a,0x00,0x5b,0x5e,0x5b,0x00,0x5d,0x5f,0x5d,0x00,0x5e,0x61,0x5e,0x00,\n\t0x60,0x62,0x60,0x00,0x60,0x67,0x63,0x00,0x62,0x68,0x64,0x00,0x63,0x69,0x65,0x00,0x64,0x6a,0x67,0x00,0x65,0x6c,0x68,0x00,0x67,0x6d,0x69,0x00,0x68,0x6e,0x6a,0x00,\n\t0x69,0x6f,0x6c,0x00,0x6a,0x71,0x6d,0x00,0x6c,0x72,0x6e,0x00,0x6d,0x73,0x6f,0x00,0x6e,0x74,0x71,0x00,0x6f,0x76,0x72,0x00,0x71,0x77,0x73,0x00,0x72,0x78,0x74,0x00,\n\t0x73,0x79,0x76,0x00,0x74,0x7a,0x77,0x00,0x75,0x7b,0x78,0x00,0x76,0x7c,0x79,0x00,0x78,0x7e,0x7a,0x00,0x79,0x7f,0x7b,0x00,0x7a,0x80,0x7c,0x00,0x7b,0x81,0x7d,0x00,\n\t0x7c,0x82,0x7f,0x00,0x7d,0x83,0x80,0x00,0x7e,0x84,0x81,0x00,0x7f,0x85,0x82,0x00,0x81,0x86,0x83,0x00,0x82,0x87,0x84,0x00,0x83,0x88,0x85,0x00,0x84,0x89,0x86,0x00,\n\t0x85,0x8a,0x88,0x00,0x86,0x8c,0x89,0x00,0x88,0x8d,0x8a,0x00,0x89,0x8e,0x8b,0x00,0x8a,0x8f,0x8c,0x00,0x8b,0x90,0x8d,0x00,0x8c,0x91,0x8f,0x00,0x8e,0x93,0x90,0x00,\n\t0x8f,0x94,0x91,0x00,0x90,0x95,0x92,0x00,0x91,0x96,0x93,0x00,0x93,0x97,0x94,0x00,0x94,0x99,0x96,0x00,0x95,0x9a,0x97,0x00,0x96,0x9b,0x98,0x00,0x98,0x9c,0x99,0x00,\n\t0x99,0x9d,0x9a,0x00,0x9a,0x9e,0x9c,0x00,0x9b,0xa0,0x9d,0x00,0x9c,0xa1,0x9e,0x00,0x9d,0xa2,0x9f,0x00,0x9e,0xa3,0xa0,0x00,0xa0,0xa4,0xa1,0x00,0xa1,0xa5,0xa3,0x00,\n\t0xa2,0xa6,0xa4,0x00,0xa3,0xa7,0xa5,0x00,0xa4,0xa9,0xa6,0x00,0xa5,0xaa,0xa7,0x00,0xa6,0xab,0xa8,0x00,0xa8,0xac,0xaa,0x00,0xa9,0xad,0xab,0x00,0xaa,0xae,0xac,0x00,\n\t0xab,0xaf,0xad,0x00,0xac,0xb0,0xae,0x00,0xad,0xb2,0xb0,0x00,0xaf,0xb3,0xb1,0x00,0xb0,0xb4,0xb2,0x00,0xb1,0xb5,0xb3,0x00,0xb2,0xb6,0xb5,0x00,0xb4,0xb8,0xb6,0x00,\n\t0xb5,0xb9,0xb7,0x00,0xb6,0xba,0xb8,0x00,0xb7,0xbb,0xba,0x00,0xb9,0xbc,0xbb,0x00,0xba,0xbd,0xbc,0x00,0xbb,0xbf,0xbd,0x00,0xbc,0xc0,0xbf,0x00,0xbe,0xc1,0xc0,0x00,\n\t0xbf,0xc2,0xc1,0x00,0xc0,0xc3,0xc2,0x00,0xc1,0xc4,0xc3,0x00,0xc2,0xc6,0xc4,0x00,0xc3,0xc7,0xc5,0x00,0xc5,0xc8,0xc6,0x00,0xc6,0xc9,0xc7,0x00,0xc7,0xca,0xc8,0x00,\n\t0xc8,0xcb,0xca,0x00,0xc9,0xcc,0xcb,0x00,0xcb,0xcd,0xcc,0x00,0xcc,0xcf,0xcd,0x00,0xcd,0xd0,0xce,0x00,0xce,0xd1,0xcf,0x00,0xcf,0xd2,0xd0,0x00,0xd0,0xd3,0xd1,0x00,\n\t0xd2,0xd4,0xd2,0x00,0xd3,0xd5,0xd3,0x00,0xd4,0xd6,0xd4,0x00,0xd5,0xd7,0xd6,0x00,0xd6,0xd8,0xd7,0x00,0xd8,0xd9,0xd8,0x00,0xd9,0xdb,0xd9,0x00,0xda,0xdc,0xda,0x00,\n\t0xdb,0xdd,0xdc,0x00,0xdc,0xde,0xdd,0x00,0xdd,0xdf,0xde,0x00,0xdf,0xe0,0xdf,0x00,0xe0,0xe1,0xe0,0x00,0xe1,0xe2,0xe1,0x00,0xe2,0xe3,0xe3,0x00,0xe3,0xe4,0xe4,0x00,\n\t0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe9,0xe8,0x00,0xe9,0xea,0xe9,0x00,0xea,0xeb,0xea,0x00,0xeb,0xec,0xeb,0x00,0xec,0xed,0xec,0x00,\n\t0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf2,0xf1,0x00,0xf2,0xf3,0xf2,0x00,0xf3,0xf4,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf5,0xf6,0xf5,0x00,\n\t0xf7,0xf7,0xf6,0x00,0xf7,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xf9,0x00,0xfa,0xfa,0xfa,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x1c,0x18,0x00,0x18,0x1c,0x19,0x00,0x19,0x1d,0x1a,0x00,0x1b,0x1e,0x1b,0x00,\n\t0x1c,0x1f,0x1c,0x00,0x1d,0x20,0x1d,0x00,0x1e,0x21,0x1e,0x00,0x1f,0x22,0x1f,0x00,0x21,0x23,0x21,0x00,0x22,0x24,0x22,0x00,0x23,0x25,0x23,0x00,0x24,0x26,0x24,0x00,\n\t0x26,0x27,0x25,0x00,0x27,0x28,0x26,0x00,0x28,0x2a,0x28,0x00,0x29,0x2b,0x29,0x00,0x2a,0x2c,0x2b,0x00,0x2b,0x2d,0x2c,0x00,0x2c,0x2e,0x2d,0x00,0x2d,0x2f,0x2e,0x00,\n\t0x2f,0x30,0x2f,0x00,0x30,0x32,0x30,0x00,0x31,0x33,0x32,0x00,0x32,0x34,0x33,0x00,0x34,0x35,0x34,0x00,0x35,0x37,0x35,0x00,0x37,0x38,0x37,0x00,0x38,0x39,0x38,0x00,\n\t0x3a,0x3a,0x39,0x00,0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x41,0x40,0x00,0x41,0x42,0x41,0x00,\n\t0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x49,0x00,0x4a,0x4b,0x4a,0x00,\n\t0x4b,0x4c,0x4b,0x00,0x4c,0x4d,0x4c,0x00,0x4d,0x4e,0x4d,0x00,0x4e,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x53,0x51,0x00,0x53,0x54,0x52,0x00,\n\t0x54,0x55,0x53,0x00,0x55,0x56,0x55,0x00,0x56,0x57,0x56,0x00,0x57,0x58,0x57,0x00,0x59,0x5a,0x58,0x00,0x5a,0x5b,0x5a,0x00,0x5c,0x5d,0x5b,0x00,0x5d,0x5e,0x5d,0x00,\n\t0x5f,0x60,0x5f,0x00,0x60,0x66,0x62,0x00,0x61,0x67,0x63,0x00,0x62,0x68,0x65,0x00,0x64,0x69,0x66,0x00,0x65,0x6b,0x67,0x00,0x66,0x6c,0x68,0x00,0x67,0x6d,0x6a,0x00,\n\t0x69,0x6e,0x6b,0x00,0x6a,0x70,0x6c,0x00,0x6b,0x71,0x6d,0x00,0x6c,0x72,0x6f,0x00,0x6e,0x73,0x70,0x00,0x6f,0x75,0x71,0x00,0x70,0x76,0x72,0x00,0x71,0x77,0x74,0x00,\n\t0x73,0x78,0x75,0x00,0x74,0x79,0x76,0x00,0x75,0x7b,0x77,0x00,0x76,0x7c,0x78,0x00,0x77,0x7d,0x79,0x00,0x78,0x7e,0x7a,0x00,0x79,0x7f,0x7c,0x00,0x7a,0x80,0x7d,0x00,\n\t0x7c,0x81,0x7e,0x00,0x7d,0x82,0x7f,0x00,0x7e,0x83,0x80,0x00,0x7f,0x84,0x81,0x00,0x80,0x85,0x82,0x00,0x81,0x86,0x83,0x00,0x82,0x87,0x85,0x00,0x84,0x88,0x86,0x00,\n\t0x85,0x8a,0x87,0x00,0x86,0x8b,0x88,0x00,0x87,0x8c,0x89,0x00,0x88,0x8d,0x8a,0x00,0x8a,0x8e,0x8b,0x00,0x8b,0x8f,0x8d,0x00,0x8c,0x91,0x8e,0x00,0x8d,0x92,0x8f,0x00,\n\t0x8e,0x93,0x90,0x00,0x90,0x94,0x91,0x00,0x91,0x95,0x93,0x00,0x92,0x96,0x94,0x00,0x93,0x98,0x95,0x00,0x94,0x99,0x96,0x00,0x96,0x9a,0x97,0x00,0x97,0x9b,0x98,0x00,\n\t0x98,0x9c,0x9a,0x00,0x99,0x9e,0x9b,0x00,0x9a,0x9f,0x9c,0x00,0x9c,0xa0,0x9d,0x00,0x9d,0xa1,0x9e,0x00,0x9e,0xa2,0x9f,0x00,0x9f,0xa3,0xa1,0x00,0xa0,0xa4,0xa2,0x00,\n\t0xa1,0xa5,0xa3,0x00,0xa2,0xa7,0xa4,0x00,0xa4,0xa8,0xa5,0x00,0xa5,0xa9,0xa6,0x00,0xa6,0xaa,0xa8,0x00,0xa7,0xab,0xa9,0x00,0xa8,0xac,0xaa,0x00,0xa9,0xad,0xab,0x00,\n\t0xab,0xae,0xac,0x00,0xac,0xb0,0xad,0x00,0xad,0xb1,0xaf,0x00,0xae,0xb2,0xb0,0x00,0xaf,0xb3,0xb1,0x00,0xb1,0xb4,0xb2,0x00,0xb2,0xb5,0xb4,0x00,0xb3,0xb7,0xb5,0x00,\n\t0xb4,0xb8,0xb6,0x00,0xb6,0xb9,0xb7,0x00,0xb7,0xba,0xb9,0x00,0xb8,0xbb,0xba,0x00,0xb9,0xbc,0xbb,0x00,0xba,0xbe,0xbc,0x00,0xbc,0xbf,0xbe,0x00,0xbd,0xc0,0xbf,0x00,\n\t0xbe,0xc1,0xc0,0x00,0xbf,0xc2,0xc1,0x00,0xc0,0xc3,0xc2,0x00,0xc2,0xc5,0xc3,0x00,0xc3,0xc6,0xc4,0x00,0xc4,0xc7,0xc5,0x00,0xc5,0xc8,0xc6,0x00,0xc6,0xc9,0xc8,0x00,\n\t0xc8,0xca,0xc9,0x00,0xc9,0xcb,0xca,0x00,0xca,0xcc,0xcb,0x00,0xcb,0xce,0xcc,0x00,0xcc,0xcf,0xcd,0x00,0xcd,0xd0,0xce,0x00,0xcf,0xd1,0xcf,0x00,0xd0,0xd2,0xd0,0x00,\n\t0xd1,0xd3,0xd1,0x00,0xd2,0xd4,0xd2,0x00,0xd3,0xd5,0xd4,0x00,0xd4,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd9,0xd7,0x00,0xd8,0xda,0xd8,0x00,0xd9,0xdb,0xd9,0x00,\n\t0xda,0xdc,0xdb,0x00,0xdc,0xdd,0xdc,0x00,0xdd,0xde,0xdd,0x00,0xde,0xdf,0xde,0x00,0xdf,0xe0,0xdf,0x00,0xe0,0xe1,0xe0,0x00,0xe1,0xe2,0xe1,0x00,0xe3,0xe3,0xe3,0x00,\n\t0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe8,0xe7,0x00,0xe8,0xe9,0xe8,0x00,0xe9,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,\n\t0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf1,0xf0,0x00,0xf1,0xf2,0xf1,0x00,0xf2,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,\n\t0xf6,0xf6,0xf5,0x00,0xf6,0xf7,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf7,0xf8,0xf7,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x15,0x15,0x15,0x00,0x16,0x19,0x17,0x00,0x18,0x1a,0x18,0x00,0x19,0x1b,0x19,0x00,0x1b,0x1c,0x1a,0x00,\n\t0x1c,0x1d,0x1b,0x00,0x1d,0x1e,0x1c,0x00,0x1e,0x1f,0x1e,0x00,0x1f,0x20,0x1f,0x00,0x20,0x21,0x20,0x00,0x21,0x22,0x21,0x00,0x23,0x23,0x22,0x00,0x24,0x24,0x23,0x00,\n\t0x25,0x25,0x24,0x00,0x26,0x26,0x26,0x00,0x28,0x28,0x27,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,\n\t0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x35,0x34,0x34,0x00,0x37,0x36,0x36,0x00,0x38,0x37,0x37,0x00,\n\t0x3a,0x38,0x38,0x00,0x3b,0x39,0x39,0x00,0x3c,0x3a,0x3a,0x00,0x3c,0x3b,0x3b,0x00,0x3d,0x3c,0x3c,0x00,0x3e,0x3d,0x3d,0x00,0x40,0x3f,0x3f,0x00,0x41,0x40,0x40,0x00,\n\t0x42,0x41,0x41,0x00,0x43,0x42,0x42,0x00,0x44,0x43,0x43,0x00,0x45,0x44,0x44,0x00,0x46,0x45,0x45,0x00,0x47,0x46,0x46,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4d,0x4c,0x4c,0x00,0x4e,0x4d,0x4d,0x00,0x4f,0x4e,0x4e,0x00,0x50,0x4f,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,\n\t0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x56,0x55,0x55,0x00,0x57,0x56,0x56,0x00,0x58,0x57,0x57,0x00,0x5a,0x59,0x59,0x00,0x5b,0x5a,0x5a,0x00,0x5d,0x5c,0x5c,0x00,\n\t0x5e,0x5d,0x5d,0x00,0x5f,0x65,0x61,0x00,0x61,0x66,0x63,0x00,0x62,0x67,0x64,0x00,0x63,0x69,0x65,0x00,0x64,0x6a,0x66,0x00,0x66,0x6b,0x68,0x00,0x67,0x6c,0x69,0x00,\n\t0x68,0x6e,0x6a,0x00,0x69,0x6f,0x6b,0x00,0x6b,0x70,0x6d,0x00,0x6c,0x71,0x6e,0x00,0x6d,0x73,0x6f,0x00,0x6e,0x74,0x70,0x00,0x70,0x75,0x72,0x00,0x71,0x76,0x73,0x00,\n\t0x72,0x78,0x74,0x00,0x73,0x79,0x75,0x00,0x74,0x7a,0x76,0x00,0x75,0x7b,0x77,0x00,0x77,0x7c,0x79,0x00,0x78,0x7d,0x7a,0x00,0x79,0x7e,0x7b,0x00,0x7a,0x7f,0x7c,0x00,\n\t0x7b,0x80,0x7d,0x00,0x7c,0x81,0x7e,0x00,0x7d,0x82,0x7f,0x00,0x7f,0x83,0x80,0x00,0x80,0x84,0x82,0x00,0x81,0x86,0x83,0x00,0x82,0x87,0x84,0x00,0x83,0x88,0x85,0x00,\n\t0x84,0x89,0x86,0x00,0x85,0x8a,0x87,0x00,0x87,0x8b,0x88,0x00,0x88,0x8c,0x8a,0x00,0x89,0x8d,0x8b,0x00,0x8a,0x8f,0x8c,0x00,0x8b,0x90,0x8d,0x00,0x8d,0x91,0x8e,0x00,\n\t0x8e,0x92,0x8f,0x00,0x8f,0x93,0x91,0x00,0x90,0x94,0x92,0x00,0x91,0x96,0x93,0x00,0x93,0x97,0x94,0x00,0x94,0x98,0x95,0x00,0x95,0x99,0x96,0x00,0x96,0x9a,0x98,0x00,\n\t0x98,0x9c,0x99,0x00,0x99,0x9d,0x9a,0x00,0x9a,0x9e,0x9b,0x00,0x9b,0x9f,0x9c,0x00,0x9c,0xa0,0x9d,0x00,0x9d,0xa1,0x9f,0x00,0x9e,0xa2,0xa0,0x00,0xa0,0xa3,0xa1,0x00,\n\t0xa1,0xa5,0xa2,0x00,0xa2,0xa6,0xa3,0x00,0xa3,0xa7,0xa4,0x00,0xa4,0xa8,0xa5,0x00,0xa5,0xa9,0xa7,0x00,0xa7,0xaa,0xa8,0x00,0xa8,0xab,0xa9,0x00,0xa9,0xac,0xaa,0x00,\n\t0xaa,0xae,0xab,0x00,0xab,0xaf,0xac,0x00,0xac,0xb0,0xae,0x00,0xae,0xb1,0xaf,0x00,0xaf,0xb2,0xb0,0x00,0xb0,0xb3,0xb1,0x00,0xb1,0xb5,0xb3,0x00,0xb3,0xb6,0xb4,0x00,\n\t0xb4,0xb7,0xb5,0x00,0xb5,0xb8,0xb6,0x00,0xb6,0xb9,0xb8,0x00,0xb7,0xba,0xb9,0x00,0xb9,0xbc,0xba,0x00,0xba,0xbd,0xbb,0x00,0xbb,0xbe,0xbd,0x00,0xbc,0xbf,0xbe,0x00,\n\t0xbe,0xc0,0xbf,0x00,0xbf,0xc1,0xc0,0x00,0xc0,0xc3,0xc1,0x00,0xc1,0xc4,0xc2,0x00,0xc2,0xc5,0xc3,0x00,0xc3,0xc6,0xc4,0x00,0xc5,0xc7,0xc5,0x00,0xc6,0xc8,0xc7,0x00,\n\t0xc7,0xc9,0xc8,0x00,0xc8,0xca,0xc9,0x00,0xc9,0xcc,0xca,0x00,0xca,0xcd,0xcb,0x00,0xcc,0xce,0xcc,0x00,0xcd,0xcf,0xcd,0x00,0xce,0xd0,0xce,0x00,0xcf,0xd1,0xcf,0x00,\n\t0xd0,0xd2,0xd0,0x00,0xd1,0xd3,0xd1,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd7,0xd5,0x00,0xd6,0xd8,0xd6,0x00,0xd7,0xd9,0xd7,0x00,0xd8,0xda,0xd8,0x00,\n\t0xda,0xdb,0xda,0x00,0xdb,0xdc,0xdb,0x00,0xdc,0xdd,0xdc,0x00,0xdd,0xde,0xdd,0x00,0xde,0xdf,0xde,0x00,0xdf,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe2,0x00,\n\t0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe6,0xe5,0x00,0xe6,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xef,0xed,0x00,0xef,0xf0,0xee,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,\n\t0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfb,0xfb,0x00,0xfd,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x16,0x19,0x17,0x00,0x17,0x1a,0x18,0x00,0x19,0x1b,0x19,0x00,0x1a,0x1c,0x1a,0x00,\n\t0x1c,0x1d,0x1b,0x00,0x1d,0x1e,0x1c,0x00,0x1e,0x1f,0x1d,0x00,0x1f,0x20,0x1e,0x00,0x20,0x21,0x20,0x00,0x21,0x22,0x21,0x00,0x22,0x23,0x22,0x00,0x24,0x24,0x23,0x00,\n\t0x25,0x25,0x24,0x00,0x26,0x26,0x25,0x00,0x27,0x27,0x27,0x00,0x29,0x29,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,\n\t0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x32,0x32,0x31,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x36,0x35,0x35,0x00,0x38,0x37,0x36,0x00,\n\t0x3a,0x38,0x38,0x00,0x3a,0x39,0x39,0x00,0x3b,0x3a,0x3a,0x00,0x3c,0x3b,0x3b,0x00,0x3d,0x3c,0x3c,0x00,0x3e,0x3d,0x3d,0x00,0x3f,0x3e,0x3e,0x00,0x41,0x40,0x3f,0x00,\n\t0x42,0x41,0x41,0x00,0x43,0x42,0x42,0x00,0x44,0x43,0x43,0x00,0x45,0x44,0x44,0x00,0x46,0x45,0x45,0x00,0x47,0x46,0x46,0x00,0x48,0x47,0x47,0x00,0x49,0x49,0x48,0x00,\n\t0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4e,0x4d,0x4c,0x00,0x4f,0x4e,0x4e,0x00,0x50,0x4f,0x4f,0x00,0x51,0x50,0x50,0x00,0x52,0x52,0x51,0x00,\n\t0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x57,0x56,0x55,0x00,0x58,0x57,0x57,0x00,0x59,0x58,0x58,0x00,0x5b,0x5a,0x59,0x00,0x5c,0x5b,0x5b,0x00,\n\t0x5e,0x5d,0x5c,0x00,0x5f,0x64,0x61,0x00,0x60,0x65,0x62,0x00,0x62,0x66,0x63,0x00,0x63,0x68,0x64,0x00,0x64,0x69,0x66,0x00,0x65,0x6a,0x67,0x00,0x66,0x6b,0x68,0x00,\n\t0x68,0x6d,0x69,0x00,0x69,0x6e,0x6b,0x00,0x6a,0x6f,0x6c,0x00,0x6b,0x70,0x6d,0x00,0x6d,0x72,0x6e,0x00,0x6e,0x73,0x70,0x00,0x6f,0x74,0x71,0x00,0x70,0x75,0x72,0x00,\n\t0x72,0x77,0x73,0x00,0x73,0x78,0x74,0x00,0x74,0x79,0x76,0x00,0x75,0x7a,0x77,0x00,0x76,0x7b,0x78,0x00,0x77,0x7c,0x79,0x00,0x78,0x7d,0x7a,0x00,0x7a,0x7e,0x7b,0x00,\n\t0x7b,0x7f,0x7c,0x00,0x7c,0x80,0x7d,0x00,0x7d,0x81,0x7f,0x00,0x7e,0x83,0x80,0x00,0x7f,0x84,0x81,0x00,0x80,0x85,0x82,0x00,0x82,0x86,0x83,0x00,0x83,0x87,0x84,0x00,\n\t0x84,0x88,0x85,0x00,0x85,0x89,0x86,0x00,0x86,0x8a,0x88,0x00,0x87,0x8b,0x89,0x00,0x89,0x8d,0x8a,0x00,0x8a,0x8e,0x8b,0x00,0x8b,0x8f,0x8c,0x00,0x8c,0x90,0x8d,0x00,\n\t0x8d,0x91,0x8f,0x00,0x8f,0x92,0x90,0x00,0x90,0x94,0x91,0x00,0x91,0x95,0x92,0x00,0x92,0x96,0x93,0x00,0x93,0x97,0x94,0x00,0x94,0x98,0x96,0x00,0x96,0x99,0x97,0x00,\n\t0x97,0x9b,0x98,0x00,0x98,0x9c,0x99,0x00,0x99,0x9d,0x9a,0x00,0x9a,0x9e,0x9b,0x00,0x9c,0x9f,0x9d,0x00,0x9d,0xa0,0x9e,0x00,0x9e,0xa1,0x9f,0x00,0x9f,0xa3,0xa0,0x00,\n\t0xa0,0xa4,0xa1,0x00,0xa1,0xa5,0xa2,0x00,0xa3,0xa6,0xa3,0x00,0xa4,0xa7,0xa5,0x00,0xa5,0xa8,0xa6,0x00,0xa6,0xa9,0xa7,0x00,0xa7,0xaa,0xa8,0x00,0xa8,0xac,0xa9,0x00,\n\t0xaa,0xad,0xaa,0x00,0xab,0xae,0xac,0x00,0xac,0xaf,0xad,0x00,0xad,0xb0,0xae,0x00,0xae,0xb1,0xaf,0x00,0xb0,0xb2,0xb0,0x00,0xb1,0xb4,0xb2,0x00,0xb2,0xb5,0xb3,0x00,\n\t0xb3,0xb6,0xb4,0x00,0xb4,0xb7,0xb5,0x00,0xb6,0xb8,0xb7,0x00,0xb7,0xb9,0xb8,0x00,0xb8,0xbb,0xb9,0x00,0xb9,0xbc,0xba,0x00,0xba,0xbd,0xbc,0x00,0xbc,0xbe,0xbd,0x00,\n\t0xbd,0xbf,0xbe,0x00,0xbe,0xc0,0xbf,0x00,0xbf,0xc2,0xc0,0x00,0xc0,0xc3,0xc1,0x00,0xc2,0xc4,0xc2,0x00,0xc3,0xc5,0xc3,0x00,0xc4,0xc6,0xc4,0x00,0xc5,0xc7,0xc6,0x00,\n\t0xc6,0xc8,0xc7,0x00,0xc7,0xc9,0xc8,0x00,0xc9,0xcb,0xc9,0x00,0xca,0xcc,0xca,0x00,0xcb,0xcd,0xcb,0x00,0xcc,0xce,0xcc,0x00,0xcd,0xcf,0xcd,0x00,0xce,0xd0,0xce,0x00,\n\t0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd2,0x00,0xd3,0xd5,0xd3,0x00,0xd4,0xd6,0xd4,0x00,0xd5,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,\n\t0xd9,0xda,0xd9,0x00,0xda,0xdb,0xda,0x00,0xdb,0xdc,0xdb,0x00,0xdc,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe1,0x00,\n\t0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf7,0x00,\n\t0xfa,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfa,0xf9,0x00,0xfc,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfc,0xfb,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfd,0xfd,0x00,\n\t0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x16,0x19,0x17,0x00,0x17,0x1a,0x18,0x00,0x19,0x1b,0x19,0x00,0x1a,0x1c,0x1a,0x00,\n\t0x1c,0x1d,0x1b,0x00,0x1d,0x1e,0x1c,0x00,0x1e,0x1f,0x1d,0x00,0x1f,0x20,0x1e,0x00,0x20,0x21,0x1f,0x00,0x21,0x22,0x20,0x00,0x22,0x23,0x21,0x00,0x23,0x24,0x22,0x00,\n\t0x25,0x25,0x24,0x00,0x26,0x26,0x25,0x00,0x27,0x27,0x26,0x00,0x28,0x28,0x28,0x00,0x2a,0x2a,0x29,0x00,0x2b,0x2b,0x2a,0x00,0x2c,0x2c,0x2b,0x00,0x2d,0x2d,0x2c,0x00,\n\t0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x33,0x33,0x32,0x00,0x34,0x34,0x33,0x00,0x36,0x35,0x35,0x00,0x37,0x36,0x36,0x00,\n\t0x39,0x38,0x37,0x00,0x3a,0x39,0x38,0x00,0x3b,0x3a,0x39,0x00,0x3c,0x3b,0x3a,0x00,0x3d,0x3c,0x3c,0x00,0x3e,0x3d,0x3d,0x00,0x3f,0x3e,0x3e,0x00,0x40,0x3f,0x3f,0x00,\n\t0x42,0x41,0x40,0x00,0x43,0x42,0x41,0x00,0x44,0x43,0x42,0x00,0x45,0x44,0x43,0x00,0x46,0x45,0x44,0x00,0x47,0x46,0x45,0x00,0x48,0x47,0x46,0x00,0x49,0x48,0x47,0x00,\n\t0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4f,0x4e,0x4d,0x00,0x50,0x4f,0x4e,0x00,0x51,0x50,0x4f,0x00,0x52,0x51,0x50,0x00,\n\t0x53,0x53,0x51,0x00,0x54,0x54,0x52,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x58,0x57,0x56,0x00,0x59,0x58,0x57,0x00,0x5b,0x5a,0x59,0x00,0x5c,0x5b,0x5a,0x00,\n\t0x5e,0x5d,0x5c,0x00,0x5f,0x63,0x60,0x00,0x60,0x64,0x61,0x00,0x61,0x66,0x62,0x00,0x62,0x67,0x64,0x00,0x64,0x68,0x65,0x00,0x65,0x69,0x66,0x00,0x66,0x6b,0x67,0x00,\n\t0x67,0x6c,0x69,0x00,0x68,0x6d,0x6a,0x00,0x6a,0x6e,0x6b,0x00,0x6b,0x70,0x6c,0x00,0x6c,0x71,0x6e,0x00,0x6d,0x72,0x6f,0x00,0x6f,0x73,0x70,0x00,0x70,0x75,0x71,0x00,\n\t0x71,0x76,0x73,0x00,0x72,0x77,0x74,0x00,0x73,0x78,0x75,0x00,0x74,0x79,0x76,0x00,0x76,0x7a,0x77,0x00,0x77,0x7b,0x78,0x00,0x78,0x7c,0x79,0x00,0x79,0x7d,0x7a,0x00,\n\t0x7a,0x7e,0x7c,0x00,0x7b,0x80,0x7d,0x00,0x7c,0x81,0x7e,0x00,0x7e,0x82,0x7f,0x00,0x7f,0x83,0x80,0x00,0x80,0x84,0x81,0x00,0x81,0x85,0x82,0x00,0x82,0x86,0x83,0x00,\n\t0x83,0x87,0x85,0x00,0x85,0x88,0x86,0x00,0x86,0x89,0x87,0x00,0x87,0x8b,0x88,0x00,0x88,0x8c,0x89,0x00,0x89,0x8d,0x8a,0x00,0x8a,0x8e,0x8b,0x00,0x8c,0x8f,0x8d,0x00,\n\t0x8d,0x90,0x8e,0x00,0x8e,0x92,0x8f,0x00,0x8f,0x93,0x90,0x00,0x90,0x94,0x91,0x00,0x92,0x95,0x92,0x00,0x93,0x96,0x94,0x00,0x94,0x97,0x95,0x00,0x95,0x99,0x96,0x00,\n\t0x96,0x9a,0x97,0x00,0x97,0x9b,0x98,0x00,0x99,0x9c,0x99,0x00,0x9a,0x9d,0x9b,0x00,0x9b,0x9e,0x9c,0x00,0x9c,0x9f,0x9d,0x00,0x9d,0xa1,0x9e,0x00,0x9e,0xa2,0x9f,0x00,\n\t0xa0,0xa3,0xa0,0x00,0xa1,0xa4,0xa1,0x00,0xa2,0xa5,0xa3,0x00,0xa3,0xa6,0xa4,0x00,0xa4,0xa7,0xa5,0x00,0xa5,0xa8,0xa6,0x00,0xa7,0xaa,0xa7,0x00,0xa8,0xab,0xa8,0x00,\n\t0xa9,0xac,0xa9,0x00,0xaa,0xad,0xab,0x00,0xab,0xae,0xac,0x00,0xad,0xaf,0xad,0x00,0xae,0xb0,0xae,0x00,0xaf,0xb2,0xb0,0x00,0xb0,0xb3,0xb1,0x00,0xb1,0xb4,0xb2,0x00,\n\t0xb3,0xb5,0xb3,0x00,0xb4,0xb6,0xb4,0x00,0xb5,0xb7,0xb6,0x00,0xb6,0xb9,0xb7,0x00,0xb7,0xba,0xb8,0x00,0xb9,0xbb,0xb9,0x00,0xba,0xbc,0xbb,0x00,0xbb,0xbd,0xbc,0x00,\n\t0xbc,0xbe,0xbd,0x00,0xbd,0xc0,0xbe,0x00,0xbf,0xc1,0xbf,0x00,0xc0,0xc2,0xc0,0x00,0xc1,0xc3,0xc1,0x00,0xc2,0xc4,0xc2,0x00,0xc3,0xc5,0xc4,0x00,0xc4,0xc6,0xc5,0x00,\n\t0xc6,0xc7,0xc6,0x00,0xc7,0xc9,0xc7,0x00,0xc8,0xca,0xc8,0x00,0xc9,0xcb,0xc9,0x00,0xca,0xcc,0xca,0x00,0xcb,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,\n\t0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xd0,0x00,0xd1,0xd3,0xd1,0x00,0xd2,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,\n\t0xd8,0xd9,0xd8,0x00,0xd9,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,\n\t0xe2,0xe1,0xe1,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,\n\t0xeb,0xea,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf4,0xf3,0xf2,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf7,0xf6,0x00,0xf9,0xf8,0xf7,0x00,\n\t0xf9,0xf9,0xf7,0x00,0xfa,0xf9,0xf8,0x00,0xfb,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfb,0xfa,0x00,0xfd,0xfc,0xfb,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfd,0xfc,0x00,\n\t0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,\n\t0xff,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x16,0x18,0x16,0x00,0x17,0x19,0x17,0x00,0x19,0x1a,0x18,0x00,0x1a,0x1b,0x19,0x00,\n\t0x1b,0x1c,0x1a,0x00,0x1c,0x1d,0x1b,0x00,0x1e,0x1e,0x1c,0x00,0x1f,0x1f,0x1d,0x00,0x20,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,0x22,0x22,0x21,0x00,0x23,0x23,0x22,0x00,\n\t0x24,0x24,0x23,0x00,0x26,0x26,0x25,0x00,0x27,0x27,0x26,0x00,0x28,0x28,0x27,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,\n\t0x2d,0x2d,0x2d,0x00,0x2f,0x2f,0x2e,0x00,0x30,0x30,0x2f,0x00,0x31,0x31,0x30,0x00,0x32,0x32,0x32,0x00,0x34,0x34,0x33,0x00,0x35,0x35,0x34,0x00,0x37,0x36,0x35,0x00,\n\t0x39,0x37,0x37,0x00,0x39,0x38,0x38,0x00,0x3a,0x39,0x39,0x00,0x3b,0x3a,0x3a,0x00,0x3c,0x3b,0x3b,0x00,0x3e,0x3d,0x3c,0x00,0x3f,0x3e,0x3d,0x00,0x40,0x3f,0x3e,0x00,\n\t0x41,0x40,0x40,0x00,0x42,0x41,0x41,0x00,0x43,0x42,0x42,0x00,0x44,0x43,0x43,0x00,0x45,0x44,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,\n\t0x49,0x49,0x48,0x00,0x4b,0x4a,0x49,0x00,0x4c,0x4b,0x4a,0x00,0x4d,0x4c,0x4b,0x00,0x4e,0x4d,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,\n\t0x52,0x52,0x51,0x00,0x54,0x53,0x52,0x00,0x55,0x54,0x53,0x00,0x56,0x55,0x54,0x00,0x57,0x56,0x56,0x00,0x59,0x58,0x57,0x00,0x5a,0x59,0x58,0x00,0x5c,0x5b,0x59,0x00,\n\t0x5d,0x5c,0x5b,0x00,0x5e,0x62,0x5f,0x00,0x5f,0x63,0x60,0x00,0x61,0x65,0x62,0x00,0x62,0x66,0x63,0x00,0x63,0x67,0x64,0x00,0x64,0x68,0x65,0x00,0x65,0x6a,0x67,0x00,\n\t0x67,0x6b,0x68,0x00,0x68,0x6c,0x69,0x00,0x69,0x6d,0x6a,0x00,0x6a,0x6f,0x6c,0x00,0x6c,0x70,0x6d,0x00,0x6d,0x71,0x6e,0x00,0x6e,0x72,0x6f,0x00,0x6f,0x74,0x71,0x00,\n\t0x71,0x75,0x72,0x00,0x72,0x76,0x73,0x00,0x73,0x77,0x74,0x00,0x74,0x78,0x75,0x00,0x75,0x79,0x76,0x00,0x76,0x7a,0x77,0x00,0x77,0x7b,0x79,0x00,0x79,0x7d,0x7a,0x00,\n\t0x7a,0x7e,0x7b,0x00,0x7b,0x7f,0x7c,0x00,0x7c,0x80,0x7d,0x00,0x7d,0x81,0x7e,0x00,0x7e,0x82,0x7f,0x00,0x7f,0x83,0x80,0x00,0x81,0x84,0x82,0x00,0x82,0x85,0x83,0x00,\n\t0x83,0x86,0x84,0x00,0x84,0x87,0x85,0x00,0x85,0x89,0x86,0x00,0x86,0x8a,0x87,0x00,0x88,0x8b,0x88,0x00,0x89,0x8c,0x8a,0x00,0x8a,0x8d,0x8b,0x00,0x8b,0x8e,0x8c,0x00,\n\t0x8c,0x90,0x8d,0x00,0x8d,0x91,0x8e,0x00,0x8f,0x92,0x8f,0x00,0x90,0x93,0x91,0x00,0x91,0x94,0x92,0x00,0x92,0x95,0x93,0x00,0x93,0x97,0x94,0x00,0x94,0x98,0x95,0x00,\n\t0x96,0x99,0x96,0x00,0x97,0x9a,0x97,0x00,0x98,0x9b,0x99,0x00,0x99,0x9c,0x9a,0x00,0x9a,0x9d,0x9b,0x00,0x9c,0x9f,0x9c,0x00,0x9d,0xa0,0x9d,0x00,0x9e,0xa1,0x9e,0x00,\n\t0x9f,0xa2,0x9f,0x00,0xa0,0xa3,0xa1,0x00,0xa1,0xa4,0xa2,0x00,0xa3,0xa5,0xa3,0x00,0xa4,0xa6,0xa4,0x00,0xa5,0xa8,0xa5,0x00,0xa6,0xa9,0xa6,0x00,0xa7,0xaa,0xa7,0x00,\n\t0xa9,0xab,0xa8,0x00,0xaa,0xac,0xaa,0x00,0xab,0xad,0xab,0x00,0xac,0xae,0xac,0x00,0xad,0xb0,0xad,0x00,0xae,0xb1,0xaf,0x00,0xb0,0xb2,0xb0,0x00,0xb1,0xb3,0xb1,0x00,\n\t0xb2,0xb4,0xb2,0x00,0xb3,0xb5,0xb3,0x00,0xb4,0xb6,0xb5,0x00,0xb6,0xb8,0xb6,0x00,0xb7,0xb9,0xb7,0x00,0xb8,0xba,0xb8,0x00,0xb9,0xbb,0xba,0x00,0xba,0xbc,0xbb,0x00,\n\t0xbc,0xbd,0xbc,0x00,0xbd,0xbf,0xbd,0x00,0xbe,0xc0,0xbe,0x00,0xbf,0xc1,0xbf,0x00,0xc0,0xc2,0xc0,0x00,0xc1,0xc3,0xc1,0x00,0xc3,0xc4,0xc3,0x00,0xc4,0xc5,0xc4,0x00,\n\t0xc5,0xc6,0xc5,0x00,0xc6,0xc8,0xc6,0x00,0xc7,0xc9,0xc7,0x00,0xc8,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,\n\t0xce,0xcf,0xcd,0x00,0xcf,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,0xd6,0xd7,0xd5,0x00,\n\t0xd7,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xe0,0xdf,0xde,0x00,\n\t0xe1,0xe0,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe8,0xe7,0xe6,0x00,0xe9,0xe8,0xe7,0x00,\n\t0xea,0xe9,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf1,0xf0,0xee,0x00,0xf2,0xf1,0xf0,0x00,\n\t0xf3,0xf2,0xf1,0x00,0xf4,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf5,0xf4,0x00,0xf7,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf7,0xf6,0x00,\n\t0xf9,0xf8,0xf7,0x00,0xfa,0xf9,0xf7,0x00,0xfa,0xf9,0xf8,0x00,0xfb,0xfa,0xf9,0x00,0xfc,0xfb,0xfa,0x00,0xfd,0xfc,0xfb,0x00,0xfd,0xfc,0xfb,0x00,0xfe,0xfd,0xfc,0x00,\n\t0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,\n\t0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x16,0x18,0x16,0x00,0x17,0x19,0x17,0x00,0x19,0x1a,0x18,0x00,0x1a,0x1b,0x19,0x00,\n\t0x1b,0x1c,0x1a,0x00,0x1c,0x1d,0x1b,0x00,0x1e,0x1e,0x1c,0x00,0x1f,0x1f,0x1d,0x00,0x20,0x20,0x1e,0x00,0x21,0x21,0x1f,0x00,0x22,0x22,0x21,0x00,0x23,0x23,0x22,0x00,\n\t0x24,0x24,0x23,0x00,0x25,0x25,0x24,0x00,0x27,0x27,0x26,0x00,0x28,0x28,0x27,0x00,0x29,0x29,0x28,0x00,0x2a,0x2a,0x29,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,\n\t0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x30,0x30,0x2f,0x00,0x31,0x31,0x30,0x00,0x32,0x32,0x31,0x00,0x34,0x33,0x32,0x00,0x35,0x35,0x34,0x00,0x37,0x36,0x35,0x00,\n\t0x38,0x37,0x36,0x00,0x39,0x38,0x37,0x00,0x3a,0x39,0x39,0x00,0x3b,0x3a,0x3a,0x00,0x3c,0x3b,0x3b,0x00,0x3d,0x3c,0x3c,0x00,0x3f,0x3e,0x3d,0x00,0x40,0x3f,0x3e,0x00,\n\t0x41,0x40,0x3f,0x00,0x42,0x41,0x40,0x00,0x43,0x42,0x41,0x00,0x44,0x43,0x42,0x00,0x45,0x44,0x43,0x00,0x46,0x45,0x44,0x00,0x47,0x47,0x45,0x00,0x48,0x48,0x46,0x00,\n\t0x49,0x49,0x47,0x00,0x4a,0x4a,0x48,0x00,0x4c,0x4b,0x4a,0x00,0x4d,0x4c,0x4b,0x00,0x4e,0x4d,0x4c,0x00,0x4f,0x4e,0x4d,0x00,0x50,0x50,0x4e,0x00,0x51,0x51,0x4f,0x00,\n\t0x52,0x52,0x50,0x00,0x53,0x53,0x51,0x00,0x55,0x54,0x53,0x00,0x56,0x55,0x54,0x00,0x57,0x56,0x55,0x00,0x59,0x58,0x56,0x00,0x5a,0x59,0x58,0x00,0x5c,0x5b,0x59,0x00,\n\t0x5d,0x5c,0x5a,0x00,0x5e,0x61,0x5e,0x00,0x5f,0x63,0x60,0x00,0x60,0x64,0x61,0x00,0x61,0x65,0x62,0x00,0x63,0x66,0x63,0x00,0x64,0x68,0x65,0x00,0x65,0x69,0x66,0x00,\n\t0x66,0x6a,0x67,0x00,0x67,0x6b,0x68,0x00,0x69,0x6d,0x6a,0x00,0x6a,0x6e,0x6b,0x00,0x6b,0x6f,0x6c,0x00,0x6c,0x70,0x6d,0x00,0x6e,0x72,0x6f,0x00,0x6f,0x73,0x70,0x00,\n\t0x70,0x74,0x71,0x00,0x71,0x75,0x72,0x00,0x72,0x76,0x73,0x00,0x73,0x77,0x74,0x00,0x75,0x78,0x76,0x00,0x76,0x79,0x77,0x00,0x77,0x7b,0x78,0x00,0x78,0x7c,0x79,0x00,\n\t0x79,0x7d,0x7a,0x00,0x7a,0x7e,0x7b,0x00,0x7c,0x7f,0x7c,0x00,0x7d,0x80,0x7d,0x00,0x7e,0x81,0x7f,0x00,0x7f,0x82,0x80,0x00,0x80,0x83,0x81,0x00,0x81,0x84,0x82,0x00,\n\t0x83,0x86,0x83,0x00,0x84,0x87,0x84,0x00,0x85,0x88,0x85,0x00,0x86,0x89,0x86,0x00,0x87,0x8a,0x88,0x00,0x88,0x8b,0x89,0x00,0x89,0x8c,0x8a,0x00,0x8b,0x8e,0x8b,0x00,\n\t0x8c,0x8f,0x8c,0x00,0x8d,0x90,0x8d,0x00,0x8e,0x91,0x8f,0x00,0x8f,0x92,0x90,0x00,0x90,0x93,0x91,0x00,0x92,0x95,0x92,0x00,0x93,0x96,0x93,0x00,0x94,0x97,0x94,0x00,\n\t0x95,0x98,0x96,0x00,0x96,0x99,0x97,0x00,0x97,0x9a,0x98,0x00,0x99,0x9b,0x99,0x00,0x9a,0x9d,0x9a,0x00,0x9b,0x9e,0x9b,0x00,0x9c,0x9f,0x9c,0x00,0x9d,0xa0,0x9d,0x00,\n\t0x9f,0xa1,0x9f,0x00,0xa0,0xa2,0xa0,0x00,0xa1,0xa3,0xa1,0x00,0xa2,0xa4,0xa2,0x00,0xa3,0xa6,0xa3,0x00,0xa4,0xa7,0xa4,0x00,0xa6,0xa8,0xa5,0x00,0xa7,0xa9,0xa6,0x00,\n\t0xa8,0xaa,0xa8,0x00,0xa9,0xab,0xa9,0x00,0xaa,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xaf,0xac,0x00,0xae,0xb0,0xae,0x00,0xaf,0xb1,0xaf,0x00,0xb0,0xb2,0xb0,0x00,\n\t0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb6,0xb4,0x00,0xb5,0xb7,0xb5,0x00,0xb6,0xb8,0xb6,0x00,0xb7,0xb9,0xb7,0x00,0xb9,0xba,0xb9,0x00,0xba,0xbb,0xba,0x00,\n\t0xbb,0xbd,0xbb,0x00,0xbc,0xbe,0xbc,0x00,0xbd,0xbf,0xbd,0x00,0xbe,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc2,0x00,0xc3,0xc4,0xc3,0x00,\n\t0xc4,0xc6,0xc4,0x00,0xc5,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,\n\t0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,\n\t0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdd,0xdc,0xdb,0x00,0xde,0xdd,0xdc,0x00,0xdf,0xde,0xdd,0x00,\n\t0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,0xe5,0xe4,0xe3,0x00,0xe6,0xe5,0xe4,0x00,0xe7,0xe6,0xe5,0x00,0xe8,0xe7,0xe6,0x00,\n\t0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xee,0xed,0xeb,0x00,0xef,0xee,0xec,0x00,0xf0,0xef,0xed,0x00,0xf1,0xf0,0xee,0x00,\n\t0xf2,0xf2,0xf0,0x00,0xf3,0xf2,0xf0,0x00,0xf4,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf5,0xf4,0x00,0xf7,0xf6,0xf4,0x00,0xf8,0xf7,0xf5,0x00,\n\t0xf9,0xf8,0xf6,0x00,0xf9,0xf8,0xf7,0x00,0xfa,0xf9,0xf8,0x00,0xfb,0xfa,0xf8,0x00,0xfc,0xfb,0xf9,0x00,0xfd,0xfb,0xfa,0x00,0xfd,0xfc,0xfb,0x00,0xfe,0xfd,0xfc,0x00,\n\t0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,\n\t0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x16,0x18,0x16,0x00,0x17,0x19,0x17,0x00,0x18,0x1a,0x18,0x00,0x1a,0x1b,0x19,0x00,\n\t0x1b,0x1c,0x1a,0x00,0x1c,0x1d,0x1b,0x00,0x1d,0x1e,0x1c,0x00,0x1f,0x1f,0x1d,0x00,0x20,0x20,0x1e,0x00,0x21,0x21,0x1f,0x00,0x22,0x22,0x20,0x00,0x23,0x23,0x22,0x00,\n\t0x24,0x24,0x23,0x00,0x25,0x25,0x24,0x00,0x26,0x26,0x25,0x00,0x28,0x28,0x27,0x00,0x29,0x29,0x28,0x00,0x2a,0x2a,0x29,0x00,0x2b,0x2b,0x2a,0x00,0x2c,0x2c,0x2b,0x00,\n\t0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x31,0x30,0x00,0x32,0x32,0x31,0x00,0x33,0x33,0x32,0x00,0x35,0x34,0x33,0x00,0x36,0x36,0x35,0x00,\n\t0x38,0x37,0x36,0x00,0x39,0x38,0x37,0x00,0x3a,0x39,0x38,0x00,0x3b,0x3a,0x39,0x00,0x3c,0x3b,0x3b,0x00,0x3d,0x3c,0x3c,0x00,0x3e,0x3d,0x3d,0x00,0x40,0x3f,0x3e,0x00,\n\t0x41,0x40,0x3f,0x00,0x42,0x41,0x40,0x00,0x43,0x42,0x41,0x00,0x44,0x43,0x42,0x00,0x45,0x44,0x43,0x00,0x46,0x45,0x44,0x00,0x47,0x46,0x45,0x00,0x48,0x47,0x46,0x00,\n\t0x49,0x49,0x47,0x00,0x4a,0x4a,0x48,0x00,0x4b,0x4b,0x49,0x00,0x4c,0x4c,0x4a,0x00,0x4e,0x4d,0x4c,0x00,0x4f,0x4e,0x4d,0x00,0x50,0x4f,0x4e,0x00,0x51,0x51,0x4f,0x00,\n\t0x52,0x52,0x50,0x00,0x53,0x53,0x51,0x00,0x54,0x54,0x52,0x00,0x55,0x55,0x53,0x00,0x57,0x56,0x55,0x00,0x58,0x57,0x56,0x00,0x5a,0x59,0x57,0x00,0x5b,0x5a,0x58,0x00,\n\t0x5d,0x5c,0x5a,0x00,0x5d,0x60,0x5e,0x00,0x5e,0x62,0x5f,0x00,0x60,0x63,0x60,0x00,0x61,0x64,0x61,0x00,0x62,0x65,0x63,0x00,0x63,0x67,0x64,0x00,0x65,0x68,0x65,0x00,\n\t0x66,0x69,0x66,0x00,0x67,0x6a,0x68,0x00,0x68,0x6c,0x69,0x00,0x69,0x6d,0x6a,0x00,0x6b,0x6e,0x6b,0x00,0x6c,0x6f,0x6d,0x00,0x6d,0x71,0x6e,0x00,0x6e,0x72,0x6f,0x00,\n\t0x70,0x73,0x70,0x00,0x71,0x74,0x71,0x00,0x72,0x75,0x73,0x00,0x73,0x76,0x74,0x00,0x74,0x78,0x75,0x00,0x75,0x79,0x76,0x00,0x76,0x7a,0x77,0x00,0x78,0x7b,0x78,0x00,\n\t0x79,0x7c,0x79,0x00,0x7a,0x7d,0x7a,0x00,0x7b,0x7e,0x7c,0x00,0x7c,0x7f,0x7d,0x00,0x7d,0x80,0x7e,0x00,0x7f,0x81,0x7f,0x00,0x80,0x82,0x80,0x00,0x81,0x84,0x81,0x00,\n\t0x82,0x85,0x82,0x00,0x83,0x86,0x83,0x00,0x84,0x87,0x85,0x00,0x85,0x88,0x86,0x00,0x87,0x89,0x87,0x00,0x88,0x8a,0x88,0x00,0x89,0x8c,0x89,0x00,0x8a,0x8d,0x8a,0x00,\n\t0x8b,0x8e,0x8b,0x00,0x8c,0x8f,0x8d,0x00,0x8e,0x90,0x8e,0x00,0x8f,0x91,0x8f,0x00,0x90,0x93,0x90,0x00,0x91,0x94,0x91,0x00,0x92,0x95,0x92,0x00,0x93,0x96,0x94,0x00,\n\t0x94,0x97,0x95,0x00,0x96,0x98,0x96,0x00,0x97,0x99,0x97,0x00,0x98,0x9b,0x98,0x00,0x99,0x9c,0x99,0x00,0x9a,0x9d,0x9a,0x00,0x9c,0x9e,0x9b,0x00,0x9d,0x9f,0x9d,0x00,\n\t0x9e,0xa0,0x9e,0x00,0x9f,0xa1,0x9f,0x00,0xa0,0xa2,0xa0,0x00,0xa2,0xa4,0xa1,0x00,0xa3,0xa5,0xa2,0x00,0xa4,0xa6,0xa3,0x00,0xa5,0xa7,0xa4,0x00,0xa6,0xa8,0xa5,0x00,\n\t0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xad,0xaa,0x00,0xac,0xae,0xab,0x00,0xad,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,\n\t0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb5,0xb3,0x00,0xb4,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb8,0x00,0xb9,0xba,0xb9,0x00,\n\t0xba,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc1,0x00,0xc2,0xc3,0xc2,0x00,\n\t0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,\n\t0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,\n\t0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xdb,0xda,0xd9,0x00,0xdc,0xdb,0xda,0x00,0xdd,0xdc,0xdb,0x00,0xde,0xde,0xdc,0x00,\n\t0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xdf,0x00,0xe2,0xe1,0xe0,0x00,0xe3,0xe2,0xe1,0x00,0xe4,0xe3,0xe2,0x00,0xe5,0xe4,0xe3,0x00,0xe6,0xe5,0xe4,0x00,0xe7,0xe6,0xe5,0x00,\n\t0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xeb,0xea,0xe8,0x00,0xec,0xeb,0xe9,0x00,0xed,0xec,0xea,0x00,0xee,0xed,0xeb,0x00,0xef,0xee,0xec,0x00,0xf0,0xef,0xed,0x00,\n\t0xf1,0xf1,0xee,0x00,0xf2,0xf1,0xef,0x00,0xf3,0xf2,0xf0,0x00,0xf4,0xf3,0xf1,0x00,0xf5,0xf4,0xf2,0x00,0xf6,0xf5,0xf3,0x00,0xf6,0xf5,0xf4,0x00,0xf7,0xf6,0xf4,0x00,\n\t0xf8,0xf7,0xf5,0x00,0xf9,0xf8,0xf6,0x00,0xfa,0xf9,0xf7,0x00,0xfb,0xf9,0xf8,0x00,0xfc,0xfa,0xf9,0x00,0xfc,0xfb,0xfa,0x00,0xfd,0xfc,0xfa,0x00,0xfe,0xfd,0xfb,0x00,\n\t0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,\n\t0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x16,0x17,0x16,0x00,0x17,0x18,0x17,0x00,0x18,0x19,0x18,0x00,0x19,0x1a,0x19,0x00,\n\t0x1b,0x1c,0x1a,0x00,0x1c,0x1d,0x1b,0x00,0x1d,0x1e,0x1c,0x00,0x1e,0x1f,0x1d,0x00,0x20,0x20,0x1e,0x00,0x21,0x21,0x1f,0x00,0x22,0x22,0x20,0x00,0x23,0x23,0x21,0x00,\n\t0x24,0x24,0x23,0x00,0x25,0x25,0x24,0x00,0x26,0x26,0x25,0x00,0x27,0x27,0x26,0x00,0x29,0x29,0x28,0x00,0x2a,0x2a,0x29,0x00,0x2b,0x2b,0x2a,0x00,0x2c,0x2c,0x2b,0x00,\n\t0x2d,0x2d,0x2c,0x00,0x2e,0x2e,0x2d,0x00,0x2f,0x2f,0x2e,0x00,0x31,0x30,0x2f,0x00,0x32,0x32,0x31,0x00,0x33,0x33,0x32,0x00,0x35,0x34,0x33,0x00,0x36,0x35,0x35,0x00,\n\t0x38,0x37,0x36,0x00,0x39,0x38,0x37,0x00,0x3a,0x39,0x38,0x00,0x3b,0x3a,0x39,0x00,0x3c,0x3b,0x3a,0x00,0x3d,0x3c,0x3b,0x00,0x3e,0x3d,0x3c,0x00,0x3f,0x3e,0x3d,0x00,\n\t0x41,0x40,0x3f,0x00,0x42,0x41,0x40,0x00,0x43,0x42,0x41,0x00,0x44,0x43,0x42,0x00,0x45,0x44,0x43,0x00,0x46,0x45,0x44,0x00,0x47,0x46,0x45,0x00,0x48,0x47,0x46,0x00,\n\t0x49,0x48,0x47,0x00,0x4a,0x49,0x48,0x00,0x4b,0x4a,0x49,0x00,0x4c,0x4b,0x4a,0x00,0x4d,0x4d,0x4b,0x00,0x4e,0x4e,0x4c,0x00,0x4f,0x4f,0x4d,0x00,0x50,0x50,0x4e,0x00,\n\t0x52,0x52,0x50,0x00,0x53,0x53,0x51,0x00,0x54,0x54,0x52,0x00,0x55,0x55,0x53,0x00,0x56,0x56,0x54,0x00,0x58,0x57,0x55,0x00,0x59,0x59,0x57,0x00,0x5b,0x5a,0x58,0x00,\n\t0x5c,0x5c,0x59,0x00,0x5d,0x60,0x5d,0x00,0x5e,0x61,0x5e,0x00,0x5f,0x62,0x5f,0x00,0x60,0x63,0x61,0x00,0x62,0x65,0x62,0x00,0x63,0x66,0x63,0x00,0x64,0x67,0x64,0x00,\n\t0x65,0x68,0x66,0x00,0x67,0x6a,0x67,0x00,0x68,0x6b,0x68,0x00,0x69,0x6c,0x69,0x00,0x6a,0x6d,0x6b,0x00,0x6b,0x6f,0x6c,0x00,0x6d,0x70,0x6d,0x00,0x6e,0x71,0x6e,0x00,\n\t0x6f,0x72,0x70,0x00,0x70,0x73,0x71,0x00,0x71,0x74,0x72,0x00,0x72,0x76,0x73,0x00,0x74,0x77,0x74,0x00,0x75,0x78,0x75,0x00,0x76,0x79,0x76,0x00,0x77,0x7a,0x77,0x00,\n\t0x78,0x7b,0x79,0x00,0x79,0x7c,0x7a,0x00,0x7b,0x7d,0x7b,0x00,0x7c,0x7e,0x7c,0x00,0x7d,0x7f,0x7d,0x00,0x7e,0x81,0x7e,0x00,0x7f,0x82,0x7f,0x00,0x80,0x83,0x80,0x00,\n\t0x82,0x84,0x82,0x00,0x83,0x85,0x83,0x00,0x84,0x86,0x84,0x00,0x85,0x87,0x85,0x00,0x86,0x88,0x86,0x00,0x87,0x8a,0x87,0x00,0x88,0x8b,0x88,0x00,0x8a,0x8c,0x8a,0x00,\n\t0x8b,0x8d,0x8b,0x00,0x8c,0x8e,0x8c,0x00,0x8d,0x8f,0x8d,0x00,0x8e,0x91,0x8e,0x00,0x8f,0x92,0x8f,0x00,0x90,0x93,0x90,0x00,0x91,0x94,0x92,0x00,0x93,0x95,0x93,0x00,\n\t0x94,0x96,0x94,0x00,0x95,0x97,0x95,0x00,0x96,0x99,0x96,0x00,0x97,0x9a,0x97,0x00,0x99,0x9b,0x98,0x00,0x9a,0x9c,0x99,0x00,0x9b,0x9d,0x9b,0x00,0x9c,0x9e,0x9c,0x00,\n\t0x9d,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa0,0xa2,0x9f,0x00,0xa1,0xa3,0xa0,0x00,0xa2,0xa4,0xa1,0x00,0xa3,0xa5,0xa2,0x00,0xa5,0xa6,0xa3,0x00,0xa6,0xa7,0xa5,0x00,\n\t0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,\n\t0xb0,0xb1,0xaf,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,\n\t0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc3,0xc1,0x00,\n\t0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcc,0xca,0x00,\n\t0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,\n\t0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd8,0xd7,0xd6,0x00,0xd9,0xd8,0xd7,0x00,0xda,0xd9,0xd8,0x00,0xdb,0xda,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,\n\t0xdf,0xde,0xdc,0x00,0xe0,0xdf,0xdd,0x00,0xe1,0xe0,0xdf,0x00,0xe2,0xe1,0xe0,0x00,0xe3,0xe2,0xe1,0x00,0xe4,0xe3,0xe2,0x00,0xe5,0xe4,0xe3,0x00,0xe6,0xe6,0xe4,0x00,\n\t0xe8,0xe7,0xe5,0x00,0xe9,0xe8,0xe6,0x00,0xea,0xe9,0xe7,0x00,0xeb,0xea,0xe8,0x00,0xec,0xeb,0xe9,0x00,0xed,0xec,0xea,0x00,0xee,0xed,0xeb,0x00,0xef,0xef,0xec,0x00,\n\t0xf1,0xf0,0xed,0x00,0xf1,0xf0,0xee,0x00,0xf2,0xf1,0xef,0x00,0xf3,0xf2,0xf0,0x00,0xf4,0xf3,0xf1,0x00,0xf5,0xf4,0xf2,0x00,0xf6,0xf5,0xf3,0x00,0xf7,0xf6,0xf4,0x00,\n\t0xf8,0xf6,0xf5,0x00,0xf9,0xf7,0xf6,0x00,0xfa,0xf8,0xf6,0x00,0xfa,0xf9,0xf7,0x00,0xfb,0xfa,0xf8,0x00,0xfc,0xfb,0xf9,0x00,0xfd,0xfb,0xfa,0x00,0xfe,0xfc,0xfb,0x00,\n\t0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,\n\t0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x17,0x15,0x00,0x17,0x18,0x16,0x00,0x18,0x19,0x17,0x00,0x19,0x1a,0x18,0x00,\n\t0x1a,0x1b,0x19,0x00,0x1c,0x1c,0x1a,0x00,0x1d,0x1d,0x1c,0x00,0x1e,0x1e,0x1d,0x00,0x1f,0x1f,0x1e,0x00,0x20,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,0x22,0x22,0x21,0x00,\n\t0x23,0x23,0x22,0x00,0x25,0x25,0x24,0x00,0x26,0x26,0x25,0x00,0x27,0x27,0x26,0x00,0x28,0x28,0x27,0x00,0x29,0x29,0x28,0x00,0x2a,0x2a,0x29,0x00,0x2b,0x2b,0x2a,0x00,\n\t0x2c,0x2c,0x2c,0x00,0x2e,0x2e,0x2d,0x00,0x2f,0x2f,0x2e,0x00,0x31,0x30,0x2f,0x00,0x32,0x31,0x30,0x00,0x33,0x33,0x32,0x00,0x35,0x34,0x33,0x00,0x36,0x35,0x35,0x00,\n\t0x37,0x36,0x36,0x00,0x38,0x37,0x37,0x00,0x39,0x38,0x38,0x00,0x3a,0x39,0x39,0x00,0x3b,0x3a,0x3a,0x00,0x3d,0x3c,0x3b,0x00,0x3e,0x3d,0x3c,0x00,0x3f,0x3e,0x3d,0x00,\n\t0x40,0x3f,0x3e,0x00,0x41,0x40,0x3f,0x00,0x42,0x42,0x40,0x00,0x43,0x43,0x41,0x00,0x44,0x44,0x42,0x00,0x45,0x45,0x43,0x00,0x46,0x46,0x44,0x00,0x47,0x47,0x45,0x00,\n\t0x48,0x48,0x46,0x00,0x49,0x49,0x47,0x00,0x4a,0x4a,0x48,0x00,0x4b,0x4b,0x49,0x00,0x4d,0x4c,0x4b,0x00,0x4e,0x4e,0x4c,0x00,0x4f,0x4f,0x4d,0x00,0x50,0x50,0x4e,0x00,\n\t0x51,0x51,0x4f,0x00,0x52,0x52,0x50,0x00,0x53,0x53,0x51,0x00,0x54,0x54,0x52,0x00,0x56,0x55,0x54,0x00,0x57,0x57,0x55,0x00,0x59,0x58,0x56,0x00,0x5a,0x5a,0x57,0x00,\n\t0x5c,0x5b,0x59,0x00,0x5c,0x5f,0x5c,0x00,0x5e,0x60,0x5d,0x00,0x5f,0x61,0x5f,0x00,0x60,0x62,0x60,0x00,0x61,0x64,0x61,0x00,0x62,0x65,0x62,0x00,0x64,0x66,0x64,0x00,\n\t0x65,0x67,0x65,0x00,0x66,0x69,0x66,0x00,0x67,0x6a,0x67,0x00,0x68,0x6b,0x69,0x00,0x6a,0x6c,0x6a,0x00,0x6b,0x6e,0x6b,0x00,0x6c,0x6f,0x6c,0x00,0x6d,0x70,0x6e,0x00,\n\t0x6f,0x71,0x6f,0x00,0x70,0x72,0x70,0x00,0x71,0x74,0x71,0x00,0x72,0x75,0x72,0x00,0x73,0x76,0x73,0x00,0x74,0x77,0x74,0x00,0x76,0x78,0x76,0x00,0x77,0x79,0x77,0x00,\n\t0x78,0x7a,0x78,0x00,0x79,0x7b,0x79,0x00,0x7a,0x7c,0x7a,0x00,0x7b,0x7e,0x7b,0x00,0x7d,0x7f,0x7c,0x00,0x7e,0x80,0x7d,0x00,0x7f,0x81,0x7f,0x00,0x80,0x82,0x80,0x00,\n\t0x81,0x83,0x81,0x00,0x82,0x84,0x82,0x00,0x83,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x88,0x85,0x00,0x87,0x89,0x86,0x00,0x88,0x8a,0x88,0x00,0x89,0x8b,0x89,0x00,\n\t0x8a,0x8c,0x8a,0x00,0x8b,0x8d,0x8b,0x00,0x8c,0x8f,0x8c,0x00,0x8e,0x90,0x8d,0x00,0x8f,0x91,0x8e,0x00,0x90,0x92,0x90,0x00,0x91,0x93,0x91,0x00,0x92,0x94,0x92,0x00,\n\t0x93,0x95,0x93,0x00,0x94,0x97,0x94,0x00,0x96,0x98,0x95,0x00,0x97,0x99,0x96,0x00,0x98,0x9a,0x97,0x00,0x99,0x9b,0x99,0x00,0x9a,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,\n\t0x9d,0x9e,0x9c,0x00,0x9e,0xa0,0x9d,0x00,0x9f,0xa1,0x9e,0x00,0xa0,0xa2,0x9f,0x00,0xa2,0xa3,0xa0,0x00,0xa3,0xa4,0xa1,0x00,0xa4,0xa5,0xa2,0x00,0xa5,0xa6,0xa4,0x00,\n\t0xa7,0xa7,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,\n\t0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb9,0xb7,0x00,\n\t0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc2,0xc0,0x00,\n\t0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xcb,0xc9,0x00,\n\t0xcb,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,\n\t0xd5,0xd4,0xd3,0x00,0xd6,0xd5,0xd4,0x00,0xd7,0xd6,0xd5,0x00,0xd8,0xd7,0xd6,0x00,0xd9,0xd8,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdd,0xdc,0xda,0x00,\n\t0xde,0xdd,0xdb,0x00,0xdf,0xde,0xdc,0x00,0xe0,0xdf,0xdd,0x00,0xe1,0xe0,0xdf,0x00,0xe2,0xe1,0xe0,0x00,0xe3,0xe2,0xe1,0x00,0xe5,0xe3,0xe2,0x00,0xe6,0xe5,0xe3,0x00,\n\t0xe7,0xe6,0xe4,0x00,0xe8,0xe7,0xe5,0x00,0xe9,0xe8,0xe6,0x00,0xea,0xe9,0xe7,0x00,0xeb,0xea,0xe8,0x00,0xec,0xeb,0xe9,0x00,0xee,0xec,0xea,0x00,0xef,0xee,0xeb,0x00,\n\t0xf0,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,0xf2,0xf0,0xee,0x00,0xf3,0xf1,0xef,0x00,0xf4,0xf2,0xf0,0x00,0xf5,0xf3,0xf1,0x00,0xf5,0xf4,0xf2,0x00,0xf6,0xf5,0xf3,0x00,\n\t0xf7,0xf6,0xf4,0x00,0xf8,0xf7,0xf5,0x00,0xf9,0xf8,0xf6,0x00,0xfa,0xf8,0xf7,0x00,0xfb,0xf9,0xf8,0x00,0xfc,0xfa,0xf9,0x00,0xfd,0xfb,0xfa,0x00,0xfe,0xfc,0xfb,0x00,\n\t0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,\n\t0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x16,0x15,0x00,0x16,0x17,0x16,0x00,0x18,0x19,0x17,0x00,0x19,0x1a,0x18,0x00,\n\t0x1a,0x1b,0x19,0x00,0x1b,0x1c,0x1a,0x00,0x1d,0x1d,0x1c,0x00,0x1e,0x1e,0x1d,0x00,0x1f,0x1f,0x1e,0x00,0x20,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,0x22,0x22,0x21,0x00,\n\t0x23,0x23,0x22,0x00,0x24,0x24,0x23,0x00,0x26,0x26,0x25,0x00,0x27,0x27,0x26,0x00,0x28,0x28,0x27,0x00,0x29,0x29,0x28,0x00,0x2a,0x2a,0x29,0x00,0x2b,0x2b,0x2a,0x00,\n\t0x2c,0x2c,0x2b,0x00,0x2e,0x2d,0x2c,0x00,0x2f,0x2f,0x2e,0x00,0x31,0x30,0x2f,0x00,0x32,0x31,0x30,0x00,0x33,0x32,0x32,0x00,0x35,0x34,0x33,0x00,0x36,0x35,0x35,0x00,\n\t0x37,0x36,0x36,0x00,0x38,0x37,0x37,0x00,0x39,0x38,0x38,0x00,0x3a,0x39,0x38,0x00,0x3b,0x3a,0x39,0x00,0x3c,0x3b,0x3a,0x00,0x3e,0x3d,0x3c,0x00,0x3f,0x3e,0x3d,0x00,\n\t0x40,0x3f,0x3e,0x00,0x41,0x40,0x3f,0x00,0x42,0x42,0x40,0x00,0x43,0x43,0x41,0x00,0x44,0x44,0x42,0x00,0x45,0x45,0x43,0x00,0x46,0x46,0x44,0x00,0x47,0x46,0x45,0x00,\n\t0x48,0x47,0x46,0x00,0x49,0x48,0x47,0x00,0x4a,0x4a,0x48,0x00,0x4b,0x4b,0x49,0x00,0x4c,0x4c,0x4a,0x00,0x4d,0x4d,0x4b,0x00,0x4f,0x4f,0x4d,0x00,0x50,0x50,0x4e,0x00,\n\t0x51,0x51,0x4f,0x00,0x52,0x52,0x50,0x00,0x53,0x53,0x51,0x00,0x54,0x54,0x52,0x00,0x55,0x55,0x53,0x00,0x57,0x57,0x54,0x00,0x58,0x58,0x56,0x00,0x5a,0x5a,0x57,0x00,\n\t0x5b,0x5b,0x58,0x00,0x5c,0x5e,0x5b,0x00,0x5d,0x5f,0x5d,0x00,0x5e,0x60,0x5e,0x00,0x60,0x62,0x5f,0x00,0x61,0x63,0x60,0x00,0x62,0x64,0x62,0x00,0x63,0x65,0x63,0x00,\n\t0x64,0x67,0x64,0x00,0x66,0x68,0x65,0x00,0x67,0x69,0x67,0x00,0x68,0x6a,0x68,0x00,0x69,0x6c,0x69,0x00,0x6a,0x6d,0x6a,0x00,0x6c,0x6e,0x6c,0x00,0x6d,0x6f,0x6d,0x00,\n\t0x6e,0x71,0x6e,0x00,0x6f,0x72,0x6f,0x00,0x70,0x73,0x70,0x00,0x72,0x74,0x71,0x00,0x73,0x75,0x73,0x00,0x74,0x76,0x74,0x00,0x75,0x77,0x75,0x00,0x76,0x78,0x76,0x00,\n\t0x77,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7c,0x79,0x00,0x7b,0x7d,0x7a,0x00,0x7c,0x7e,0x7c,0x00,0x7d,0x7f,0x7d,0x00,0x7e,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,\n\t0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x85,0x82,0x00,0x84,0x86,0x83,0x00,0x85,0x87,0x85,0x00,0x86,0x88,0x86,0x00,0x87,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,\n\t0x8a,0x8b,0x89,0x00,0x8b,0x8d,0x8a,0x00,0x8c,0x8e,0x8b,0x00,0x8d,0x8f,0x8d,0x00,0x8e,0x90,0x8e,0x00,0x8f,0x91,0x8f,0x00,0x90,0x92,0x90,0x00,0x91,0x93,0x91,0x00,\n\t0x93,0x95,0x92,0x00,0x94,0x96,0x93,0x00,0x95,0x97,0x94,0x00,0x96,0x98,0x96,0x00,0x97,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9a,0x9b,0x99,0x00,0x9b,0x9c,0x9a,0x00,\n\t0x9c,0x9e,0x9b,0x00,0x9d,0x9f,0x9c,0x00,0x9f,0xa0,0x9d,0x00,0xa0,0xa1,0x9e,0x00,0xa1,0xa2,0x9f,0x00,0xa2,0xa3,0xa0,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,\n\t0xa6,0xa7,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,\n\t0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb8,0xb6,0x00,\n\t0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,\n\t0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,\n\t0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd2,0xd1,0xcf,0x00,0xd3,0xd2,0xd0,0x00,\n\t0xd4,0xd3,0xd2,0x00,0xd5,0xd4,0xd3,0x00,0xd6,0xd5,0xd4,0x00,0xd7,0xd6,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xda,0xd9,0xd7,0x00,0xdb,0xda,0xd8,0x00,0xdc,0xdb,0xd9,0x00,\n\t0xdd,0xdc,0xda,0x00,0xde,0xdd,0xdb,0x00,0xdf,0xde,0xdc,0x00,0xe0,0xdf,0xdd,0x00,0xe2,0xe0,0xdf,0x00,0xe3,0xe1,0xe0,0x00,0xe4,0xe3,0xe1,0x00,0xe5,0xe4,0xe2,0x00,\n\t0xe6,0xe5,0xe3,0x00,0xe7,0xe6,0xe4,0x00,0xe8,0xe7,0xe5,0x00,0xe9,0xe8,0xe6,0x00,0xeb,0xe9,0xe7,0x00,0xec,0xea,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,\n\t0xef,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf2,0xf0,0x00,0xf5,0xf3,0xf1,0x00,0xf6,0xf4,0xf2,0x00,\n\t0xf7,0xf5,0xf3,0x00,0xf8,0xf6,0xf4,0x00,0xf9,0xf7,0xf5,0x00,0xfa,0xf8,0xf6,0x00,0xfb,0xf9,0xf7,0x00,0xfc,0xfa,0xf8,0x00,0xfd,0xfb,0xf9,0x00,0xfe,0xfc,0xfa,0x00,\n\t0xff,0xfd,0xfb,0x00,0xff,0xfd,0xfb,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,\n\t0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x16,0x15,0x00,0x16,0x17,0x16,0x00,0x17,0x18,0x17,0x00,0x19,0x19,0x18,0x00,\n\t0x1a,0x1b,0x19,0x00,0x1b,0x1c,0x1a,0x00,0x1c,0x1d,0x1b,0x00,0x1e,0x1e,0x1d,0x00,0x1f,0x1f,0x1e,0x00,0x20,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,0x22,0x22,0x21,0x00,\n\t0x23,0x23,0x22,0x00,0x24,0x24,0x23,0x00,0x25,0x25,0x24,0x00,0x27,0x27,0x26,0x00,0x28,0x28,0x27,0x00,0x29,0x29,0x28,0x00,0x2a,0x2a,0x29,0x00,0x2b,0x2b,0x2a,0x00,\n\t0x2c,0x2c,0x2b,0x00,0x2d,0x2d,0x2c,0x00,0x2f,0x2e,0x2e,0x00,0x30,0x30,0x2f,0x00,0x32,0x31,0x30,0x00,0x33,0x32,0x31,0x00,0x34,0x33,0x33,0x00,0x35,0x35,0x34,0x00,\n\t0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x38,0x37,0x00,0x3a,0x39,0x38,0x00,0x3b,0x3a,0x39,0x00,0x3c,0x3b,0x3a,0x00,0x3d,0x3c,0x3b,0x00,0x3e,0x3d,0x3d,0x00,\n\t0x40,0x3f,0x3e,0x00,0x41,0x40,0x3f,0x00,0x42,0x41,0x40,0x00,0x43,0x42,0x41,0x00,0x44,0x44,0x42,0x00,0x45,0x44,0x43,0x00,0x46,0x45,0x44,0x00,0x47,0x46,0x45,0x00,\n\t0x48,0x47,0x46,0x00,0x49,0x48,0x47,0x00,0x4a,0x49,0x48,0x00,0x4b,0x4b,0x49,0x00,0x4c,0x4c,0x4a,0x00,0x4d,0x4d,0x4b,0x00,0x4e,0x4e,0x4c,0x00,0x50,0x50,0x4e,0x00,\n\t0x51,0x51,0x4f,0x00,0x52,0x52,0x50,0x00,0x53,0x53,0x51,0x00,0x54,0x54,0x52,0x00,0x55,0x55,0x53,0x00,0x56,0x56,0x54,0x00,0x58,0x58,0x55,0x00,0x59,0x59,0x57,0x00,\n\t0x5b,0x5b,0x58,0x00,0x5c,0x5d,0x5b,0x00,0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x5f,0x61,0x5e,0x00,0x60,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,\n\t0x64,0x66,0x63,0x00,0x65,0x67,0x65,0x00,0x66,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6b,0x68,0x00,0x6a,0x6c,0x6a,0x00,0x6b,0x6d,0x6b,0x00,0x6c,0x6e,0x6c,0x00,\n\t0x6e,0x70,0x6d,0x00,0x6f,0x71,0x6e,0x00,0x70,0x72,0x70,0x00,0x71,0x73,0x71,0x00,0x72,0x74,0x72,0x00,0x73,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,\n\t0x77,0x79,0x76,0x00,0x78,0x7a,0x77,0x00,0x79,0x7b,0x79,0x00,0x7a,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,\n\t0x80,0x81,0x7f,0x00,0x81,0x83,0x80,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,\n\t0x89,0x8b,0x88,0x00,0x8a,0x8c,0x89,0x00,0x8b,0x8d,0x8b,0x00,0x8c,0x8e,0x8c,0x00,0x8d,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,\n\t0x92,0x94,0x91,0x00,0x93,0x95,0x93,0x00,0x94,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9a,0x9c,0x99,0x00,\n\t0x9c,0x9d,0x9a,0x00,0x9d,0x9e,0x9b,0x00,0x9e,0x9f,0x9c,0x00,0x9f,0xa0,0x9d,0x00,0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa5,0xa2,0x00,\n\t0xa6,0xa6,0xa3,0x00,0xa7,0xa7,0xa4,0x00,0xa8,0xa8,0xa5,0x00,0xa9,0xa9,0xa6,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xae,0xae,0xab,0x00,\n\t0xaf,0xaf,0xac,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,\n\t0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbe,0xbd,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,\n\t0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc6,0xc5,0xc3,0x00,0xc7,0xc6,0xc4,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,\n\t0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd1,0xd0,0xce,0x00,0xd2,0xd1,0xcf,0x00,\n\t0xd3,0xd2,0xd1,0x00,0xd4,0xd3,0xd2,0x00,0xd5,0xd4,0xd3,0x00,0xd7,0xd6,0xd4,0x00,0xd8,0xd7,0xd5,0x00,0xd9,0xd8,0xd6,0x00,0xda,0xd9,0xd7,0x00,0xdb,0xda,0xd8,0x00,\n\t0xdc,0xdb,0xd9,0x00,0xdd,0xdc,0xda,0x00,0xdf,0xdd,0xdb,0x00,0xe0,0xde,0xdc,0x00,0xe1,0xdf,0xdd,0x00,0xe2,0xe0,0xdf,0x00,0xe3,0xe2,0xe0,0x00,0xe4,0xe3,0xe1,0x00,\n\t0xe5,0xe4,0xe2,0x00,0xe6,0xe5,0xe3,0x00,0xe8,0xe6,0xe4,0x00,0xe9,0xe7,0xe5,0x00,0xea,0xe8,0xe6,0x00,0xeb,0xe9,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,\n\t0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf2,0x00,\n\t0xf7,0xf5,0xf3,0x00,0xf8,0xf6,0xf4,0x00,0xf9,0xf7,0xf5,0x00,0xfa,0xf8,0xf6,0x00,0xfb,0xf9,0xf7,0x00,0xfc,0xfa,0xf8,0x00,0xfd,0xfb,0xf9,0x00,0xfe,0xfc,0xfa,0x00,\n\t0xff,0xfd,0xfb,0x00,0xff,0xfd,0xfb,0x00,0xff,0xfd,0xfb,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfe,0xfd,0x00,\n\t0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x14,0x14,0x14,0x00,0x15,0x16,0x15,0x00,0x16,0x17,0x16,0x00,0x17,0x18,0x17,0x00,0x18,0x19,0x18,0x00,\n\t0x1a,0x1a,0x19,0x00,0x1b,0x1b,0x1a,0x00,0x1c,0x1c,0x1b,0x00,0x1d,0x1d,0x1c,0x00,0x1f,0x1f,0x1e,0x00,0x20,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,0x22,0x22,0x21,0x00,\n\t0x23,0x23,0x22,0x00,0x24,0x24,0x23,0x00,0x25,0x25,0x24,0x00,0x26,0x26,0x25,0x00,0x28,0x28,0x27,0x00,0x29,0x29,0x28,0x00,0x2a,0x2a,0x29,0x00,0x2b,0x2b,0x2a,0x00,\n\t0x2c,0x2c,0x2b,0x00,0x2d,0x2d,0x2c,0x00,0x2e,0x2e,0x2e,0x00,0x30,0x2f,0x2f,0x00,0x31,0x31,0x30,0x00,0x32,0x32,0x31,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,\n\t0x36,0x36,0x36,0x00,0x37,0x37,0x36,0x00,0x38,0x38,0x37,0x00,0x39,0x39,0x38,0x00,0x3b,0x3a,0x39,0x00,0x3c,0x3b,0x3a,0x00,0x3d,0x3c,0x3b,0x00,0x3e,0x3d,0x3c,0x00,\n\t0x3f,0x3e,0x3e,0x00,0x40,0x3f,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,\n\t0x48,0x47,0x46,0x00,0x49,0x48,0x47,0x00,0x4a,0x49,0x48,0x00,0x4b,0x4a,0x49,0x00,0x4c,0x4c,0x4a,0x00,0x4d,0x4d,0x4b,0x00,0x4e,0x4e,0x4c,0x00,0x4f,0x4f,0x4d,0x00,\n\t0x51,0x51,0x4f,0x00,0x52,0x52,0x50,0x00,0x53,0x53,0x51,0x00,0x54,0x54,0x52,0x00,0x55,0x55,0x53,0x00,0x56,0x56,0x54,0x00,0x57,0x57,0x55,0x00,0x59,0x59,0x56,0x00,\n\t0x5a,0x5a,0x58,0x00,0x5b,0x5c,0x5a,0x00,0x5c,0x5d,0x5b,0x00,0x5d,0x5f,0x5c,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x64,0x61,0x00,\n\t0x63,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x67,0x69,0x66,0x00,0x68,0x6a,0x68,0x00,0x69,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6e,0x6b,0x00,\n\t0x6d,0x6f,0x6d,0x00,0x6e,0x70,0x6e,0x00,0x6f,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x77,0x74,0x00,\n\t0x76,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7e,0x7e,0x7c,0x00,0x7f,0x80,0x7d,0x00,\n\t0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x89,0x86,0x00,\n\t0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x92,0x8f,0x00,\n\t0x91,0x93,0x91,0x00,0x92,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x99,0x9a,0x97,0x00,0x9a,0x9b,0x98,0x00,\n\t0x9b,0x9c,0x99,0x00,0x9c,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa3,0xa3,0xa0,0x00,0xa4,0xa4,0xa1,0x00,\n\t0xa5,0xa5,0xa2,0x00,0xa6,0xa6,0xa3,0x00,0xa7,0xa7,0xa4,0x00,0xa8,0xa8,0xa5,0x00,0xaa,0xa9,0xa7,0x00,0xab,0xaa,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,\n\t0xae,0xae,0xab,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb2,0xb1,0xaf,0x00,0xb3,0xb2,0xb0,0x00,0xb4,0xb3,0xb1,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,\n\t0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xba,0xb9,0xb7,0x00,0xbb,0xba,0xb8,0x00,0xbc,0xbb,0xb9,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,\n\t0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc3,0xc2,0xc0,0x00,0xc4,0xc3,0xc1,0x00,0xc5,0xc4,0xc2,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,\n\t0xc9,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,0xcd,0xcc,0xca,0x00,0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd1,0xd0,0xce,0x00,\n\t0xd2,0xd1,0xd0,0x00,0xd4,0xd2,0xd1,0x00,0xd5,0xd4,0xd2,0x00,0xd6,0xd5,0xd3,0x00,0xd7,0xd6,0xd4,0x00,0xd8,0xd7,0xd5,0x00,0xd9,0xd8,0xd6,0x00,0xda,0xd9,0xd7,0x00,\n\t0xdc,0xda,0xd8,0x00,0xdd,0xdb,0xd9,0x00,0xde,0xdc,0xda,0x00,0xdf,0xdd,0xdb,0x00,0xe0,0xde,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xdf,0x00,0xe3,0xe2,0xe0,0x00,\n\t0xe5,0xe3,0xe1,0x00,0xe6,0xe4,0xe2,0x00,0xe7,0xe5,0xe3,0x00,0xe8,0xe6,0xe4,0x00,0xe9,0xe7,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,\n\t0xee,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,0xf2,0xf0,0xee,0x00,0xf3,0xf1,0xef,0x00,0xf4,0xf2,0xf0,0x00,0xf5,0xf3,0xf1,0x00,\n\t0xf6,0xf4,0xf2,0x00,0xf7,0xf5,0xf3,0x00,0xf8,0xf6,0xf4,0x00,0xfa,0xf7,0xf5,0x00,0xfb,0xf8,0xf6,0x00,0xfc,0xf9,0xf7,0x00,0xfd,0xfa,0xf8,0x00,0xfe,0xfb,0xfa,0x00,\n\t0xff,0xfc,0xfb,0x00,0xff,0xfd,0xfb,0x00,0xff,0xfd,0xfb,0x00,0xff,0xfd,0xfb,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfe,0xfd,0x00,\n\t0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x19,0x1a,0x19,0x00,0x1b,0x1b,0x1a,0x00,0x1c,0x1c,0x1b,0x00,0x1d,0x1d,0x1c,0x00,0x1e,0x1e,0x1d,0x00,0x1f,0x1f,0x1e,0x00,0x20,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,\n\t0x22,0x22,0x21,0x00,0x24,0x24,0x23,0x00,0x25,0x25,0x24,0x00,0x26,0x26,0x25,0x00,0x27,0x27,0x26,0x00,0x28,0x28,0x27,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,\n\t0x2b,0x2b,0x2b,0x00,0x2d,0x2d,0x2c,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,0x32,0x32,0x31,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x38,0x37,0x37,0x00,0x39,0x38,0x38,0x00,0x3a,0x39,0x38,0x00,0x3b,0x3a,0x3a,0x00,0x3c,0x3b,0x3b,0x00,0x3d,0x3c,0x3c,0x00,\n\t0x3f,0x3e,0x3d,0x00,0x40,0x3f,0x3e,0x00,0x41,0x40,0x3f,0x00,0x42,0x41,0x40,0x00,0x43,0x43,0x41,0x00,0x44,0x43,0x42,0x00,0x45,0x44,0x43,0x00,0x46,0x45,0x44,0x00,\n\t0x47,0x46,0x45,0x00,0x48,0x48,0x46,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4d,0x4d,0x4b,0x00,0x4e,0x4e,0x4c,0x00,0x4f,0x4f,0x4d,0x00,\n\t0x50,0x50,0x4e,0x00,0x51,0x51,0x4f,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x56,0x56,0x54,0x00,0x57,0x57,0x55,0x00,0x58,0x58,0x56,0x00,\n\t0x5a,0x5a,0x57,0x00,0x5b,0x5b,0x59,0x00,0x5c,0x5c,0x5a,0x00,0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x61,0x61,0x5f,0x00,0x62,0x63,0x61,0x00,\n\t0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6d,0x6b,0x00,\n\t0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,\n\t0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x7a,0x7a,0x78,0x00,0x7b,0x7b,0x79,0x00,0x7c,0x7c,0x7a,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,\n\t0x7f,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x85,0x83,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,\n\t0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,\n\t0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x98,0x95,0x00,0x98,0x99,0x96,0x00,0x99,0x9a,0x97,0x00,\n\t0x9b,0x9b,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0xa0,0x9f,0x9d,0x00,0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0x9f,0x00,0xa3,0xa3,0xa0,0x00,\n\t0xa5,0xa4,0xa1,0x00,0xa6,0xa5,0xa2,0x00,0xa7,0xa6,0xa3,0x00,0xa8,0xa7,0xa5,0x00,0xa9,0xa8,0xa6,0x00,0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,\n\t0xae,0xad,0xaa,0x00,0xaf,0xae,0xac,0x00,0xb0,0xaf,0xad,0x00,0xb1,0xb0,0xae,0x00,0xb2,0xb1,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,\n\t0xb7,0xb6,0xb4,0x00,0xb8,0xb7,0xb5,0x00,0xb9,0xb8,0xb6,0x00,0xba,0xb9,0xb7,0x00,0xbb,0xba,0xb8,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbf,0xbe,0xbc,0x00,\n\t0xc0,0xbf,0xbd,0x00,0xc1,0xc0,0xbe,0x00,0xc2,0xc1,0xbf,0x00,0xc3,0xc2,0xc0,0x00,0xc4,0xc3,0xc1,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc8,0xc7,0xc5,0x00,\n\t0xc9,0xc8,0xc6,0x00,0xca,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,0xcd,0xcc,0xca,0x00,0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,0xd1,0xcf,0xcd,0x00,\n\t0xd2,0xd0,0xcf,0x00,0xd3,0xd2,0xd0,0x00,0xd4,0xd3,0xd1,0x00,0xd5,0xd4,0xd2,0x00,0xd6,0xd5,0xd3,0x00,0xd7,0xd6,0xd4,0x00,0xd8,0xd7,0xd5,0x00,0xda,0xd8,0xd6,0x00,\n\t0xdb,0xd9,0xd7,0x00,0xdc,0xda,0xd8,0x00,0xdd,0xdb,0xd9,0x00,0xde,0xdc,0xda,0x00,0xdf,0xdd,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe2,0xe0,0xdd,0x00,0xe3,0xe1,0xdf,0x00,\n\t0xe4,0xe2,0xe0,0x00,0xe5,0xe3,0xe1,0x00,0xe6,0xe4,0xe2,0x00,0xe7,0xe5,0xe3,0x00,0xe8,0xe6,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xeb,0xe9,0xe6,0x00,0xec,0xea,0xe7,0x00,\n\t0xed,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,0xf1,0xef,0xed,0x00,0xf2,0xf0,0xee,0x00,0xf4,0xf1,0xef,0x00,0xf5,0xf2,0xf0,0x00,\n\t0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf2,0x00,0xf8,0xf6,0xf3,0x00,0xf9,0xf7,0xf5,0x00,0xfa,0xf8,0xf6,0x00,0xfc,0xf9,0xf7,0x00,0xfd,0xfa,0xf8,0x00,0xfe,0xfb,0xf9,0x00,\n\t0xff,0xfc,0xfa,0x00,0xff,0xfc,0xfb,0x00,0xff,0xfd,0xfb,0x00,0xff,0xfd,0xfb,0x00,0xff,0xfd,0xfb,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,\n\t0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1c,0x1c,0x1b,0x00,0x1d,0x1d,0x1c,0x00,0x1e,0x1e,0x1d,0x00,0x1f,0x1f,0x1e,0x00,0x20,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,\n\t0x22,0x22,0x21,0x00,0x23,0x23,0x22,0x00,0x25,0x25,0x24,0x00,0x26,0x26,0x25,0x00,0x27,0x27,0x26,0x00,0x28,0x28,0x27,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,\n\t0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x33,0x33,0x00,0x33,0x34,0x34,0x00,\n\t0x34,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x38,0x37,0x00,0x3a,0x39,0x38,0x00,0x3b,0x3a,0x39,0x00,0x3c,0x3b,0x3b,0x00,0x3d,0x3c,0x3c,0x00,\n\t0x3e,0x3d,0x3d,0x00,0x3f,0x3e,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x45,0x44,0x43,0x00,0x46,0x45,0x44,0x00,\n\t0x47,0x46,0x45,0x00,0x48,0x47,0x46,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4e,0x4e,0x4c,0x00,0x4f,0x4f,0x4d,0x00,\n\t0x50,0x50,0x4e,0x00,0x51,0x51,0x4f,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x57,0x57,0x55,0x00,0x58,0x58,0x56,0x00,\n\t0x59,0x59,0x57,0x00,0x5a,0x5a,0x58,0x00,0x5b,0x5c,0x5a,0x00,0x5d,0x5d,0x5b,0x00,0x5e,0x5e,0x5c,0x00,0x5f,0x5f,0x5d,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,\n\t0x63,0x63,0x61,0x00,0x64,0x64,0x62,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,\n\t0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x70,0x70,0x6e,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,\n\t0x76,0x76,0x74,0x00,0x77,0x77,0x75,0x00,0x78,0x78,0x76,0x00,0x79,0x79,0x77,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7d,0x7d,0x7b,0x00,0x7e,0x7e,0x7c,0x00,\n\t0x7f,0x7f,0x7d,0x00,0x80,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,\n\t0x88,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,\n\t0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x96,0x93,0x00,0x96,0x97,0x94,0x00,0x98,0x98,0x95,0x00,0x99,0x99,0x96,0x00,\n\t0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9d,0x9c,0x9a,0x00,0x9e,0x9d,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9d,0x00,0xa2,0xa1,0x9e,0x00,0xa3,0xa2,0x9f,0x00,\n\t0xa4,0xa3,0xa0,0x00,0xa5,0xa4,0xa1,0x00,0xa6,0xa5,0xa2,0x00,0xa7,0xa6,0xa4,0x00,0xa9,0xa8,0xa5,0x00,0xaa,0xa9,0xa6,0x00,0xab,0xaa,0xa7,0x00,0xac,0xab,0xa8,0x00,\n\t0xad,0xac,0xaa,0x00,0xae,0xad,0xab,0x00,0xaf,0xae,0xac,0x00,0xb0,0xaf,0xad,0x00,0xb2,0xb1,0xae,0x00,0xb3,0xb2,0xaf,0x00,0xb4,0xb3,0xb1,0x00,0xb5,0xb4,0xb2,0x00,\n\t0xb6,0xb5,0xb3,0x00,0xb7,0xb6,0xb4,0x00,0xb8,0xb7,0xb5,0x00,0xb9,0xb8,0xb6,0x00,0xbb,0xba,0xb8,0x00,0xbc,0xbb,0xb9,0x00,0xbd,0xbc,0xba,0x00,0xbe,0xbd,0xbb,0x00,\n\t0xbf,0xbe,0xbc,0x00,0xc0,0xbf,0xbd,0x00,0xc1,0xc0,0xbe,0x00,0xc2,0xc1,0xbf,0x00,0xc4,0xc3,0xc1,0x00,0xc5,0xc4,0xc2,0x00,0xc6,0xc5,0xc3,0x00,0xc7,0xc6,0xc4,0x00,\n\t0xc8,0xc7,0xc5,0x00,0xc9,0xc8,0xc6,0x00,0xca,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcd,0xcb,0xc9,0x00,0xce,0xcc,0xca,0x00,0xcf,0xcd,0xcb,0x00,0xd0,0xce,0xcc,0x00,\n\t0xd1,0xd0,0xce,0x00,0xd2,0xd1,0xcf,0x00,0xd3,0xd2,0xd0,0x00,0xd4,0xd3,0xd1,0x00,0xd6,0xd4,0xd2,0x00,0xd7,0xd5,0xd3,0x00,0xd8,0xd6,0xd4,0x00,0xd9,0xd7,0xd5,0x00,\n\t0xda,0xd8,0xd6,0x00,0xdb,0xd9,0xd7,0x00,0xdc,0xda,0xd8,0x00,0xdd,0xdb,0xd9,0x00,0xdf,0xdd,0xda,0x00,0xe0,0xde,0xdb,0x00,0xe1,0xdf,0xdc,0x00,0xe2,0xe0,0xdd,0x00,\n\t0xe3,0xe1,0xdf,0x00,0xe4,0xe2,0xe0,0x00,0xe5,0xe3,0xe1,0x00,0xe6,0xe4,0xe2,0x00,0xe8,0xe6,0xe3,0x00,0xe9,0xe7,0xe4,0x00,0xea,0xe8,0xe5,0x00,0xeb,0xe9,0xe6,0x00,\n\t0xec,0xea,0xe7,0x00,0xed,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,0xf0,0xed,0xeb,0x00,0xf1,0xef,0xec,0x00,0xf2,0xf0,0xed,0x00,0xf3,0xf1,0xee,0x00,0xf4,0xf2,0xef,0x00,\n\t0xf6,0xf3,0xf1,0x00,0xf7,0xf4,0xf2,0x00,0xf8,0xf5,0xf3,0x00,0xf9,0xf6,0xf4,0x00,0xfa,0xf8,0xf5,0x00,0xfb,0xf9,0xf6,0x00,0xfd,0xfa,0xf8,0x00,0xfe,0xfb,0xf9,0x00,\n\t0xff,0xfc,0xfa,0x00,0xff,0xfc,0xfa,0x00,0xff,0xfc,0xfb,0x00,0xff,0xfd,0xfb,0x00,0xff,0xfd,0xfb,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,\n\t0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1d,0x1d,0x1c,0x00,0x1e,0x1e,0x1d,0x00,0x1f,0x1f,0x1e,0x00,0x20,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,\n\t0x22,0x22,0x21,0x00,0x23,0x23,0x22,0x00,0x24,0x24,0x23,0x00,0x26,0x26,0x25,0x00,0x27,0x27,0x26,0x00,0x28,0x28,0x27,0x00,0x29,0x29,0x28,0x00,0x2a,0x2a,0x2a,0x00,\n\t0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x34,0x34,0x00,\n\t0x34,0x35,0x35,0x00,0x35,0x36,0x36,0x00,0x37,0x37,0x36,0x00,0x38,0x38,0x37,0x00,0x3a,0x39,0x38,0x00,0x3b,0x3a,0x39,0x00,0x3c,0x3b,0x3a,0x00,0x3d,0x3c,0x3c,0x00,\n\t0x3e,0x3d,0x3d,0x00,0x3f,0x3e,0x3e,0x00,0x40,0x3f,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,\n\t0x47,0x46,0x45,0x00,0x48,0x47,0x46,0x00,0x49,0x48,0x47,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4f,0x4f,0x4d,0x00,\n\t0x50,0x50,0x4e,0x00,0x51,0x51,0x4f,0x00,0x52,0x52,0x50,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x58,0x56,0x00,\n\t0x59,0x59,0x57,0x00,0x5a,0x5a,0x58,0x00,0x5b,0x5b,0x59,0x00,0x5c,0x5d,0x5b,0x00,0x5e,0x5e,0x5c,0x00,0x5f,0x5f,0x5d,0x00,0x60,0x60,0x5e,0x00,0x61,0x62,0x60,0x00,\n\t0x62,0x63,0x61,0x00,0x64,0x64,0x62,0x00,0x65,0x65,0x63,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6b,0x6c,0x6a,0x00,\n\t0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x71,0x71,0x6f,0x00,0x72,0x72,0x70,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,\n\t0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x78,0x78,0x76,0x00,0x79,0x79,0x77,0x00,0x7a,0x7a,0x78,0x00,0x7b,0x7b,0x79,0x00,0x7c,0x7d,0x7b,0x00,0x7e,0x7e,0x7c,0x00,\n\t0x7f,0x7f,0x7d,0x00,0x80,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x86,0x83,0x00,0x86,0x87,0x85,0x00,\n\t0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8e,0x00,\n\t0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x98,0x95,0x00,0x98,0x99,0x96,0x00,\n\t0x9a,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9d,0x9d,0x9a,0x00,0x9f,0x9e,0x9b,0x00,0xa0,0x9f,0x9d,0x00,0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0x9f,0x00,\n\t0xa4,0xa3,0xa0,0x00,0xa5,0xa4,0xa1,0x00,0xa6,0xa5,0xa2,0x00,0xa7,0xa6,0xa3,0x00,0xa8,0xa7,0xa4,0x00,0xa9,0xa8,0xa6,0x00,0xaa,0xaa,0xa7,0x00,0xac,0xab,0xa8,0x00,\n\t0xad,0xac,0xa9,0x00,0xae,0xad,0xaa,0x00,0xaf,0xae,0xac,0x00,0xb0,0xaf,0xad,0x00,0xb1,0xb0,0xae,0x00,0xb2,0xb1,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb5,0xb4,0xb2,0x00,\n\t0xb6,0xb5,0xb3,0x00,0xb7,0xb6,0xb4,0x00,0xb8,0xb7,0xb5,0x00,0xb9,0xb8,0xb6,0x00,0xba,0xb9,0xb7,0x00,0xbb,0xba,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbe,0xbd,0xbb,0x00,\n\t0xbf,0xbe,0xbc,0x00,0xc0,0xbf,0xbd,0x00,0xc1,0xc0,0xbe,0x00,0xc2,0xc1,0xbf,0x00,0xc3,0xc2,0xc0,0x00,0xc4,0xc3,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc7,0xc6,0xc4,0x00,\n\t0xc8,0xc7,0xc5,0x00,0xc9,0xc8,0xc6,0x00,0xca,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,0xcd,0xcc,0xca,0x00,0xce,0xcd,0xcb,0x00,0xd0,0xce,0xcc,0x00,\n\t0xd1,0xcf,0xcd,0x00,0xd2,0xd0,0xce,0x00,0xd3,0xd1,0xcf,0x00,0xd4,0xd2,0xd0,0x00,0xd5,0xd4,0xd1,0x00,0xd6,0xd5,0xd3,0x00,0xd7,0xd6,0xd4,0x00,0xd9,0xd7,0xd5,0x00,\n\t0xda,0xd8,0xd6,0x00,0xdb,0xd9,0xd7,0x00,0xdc,0xda,0xd8,0x00,0xdd,0xdb,0xd9,0x00,0xde,0xdc,0xda,0x00,0xdf,0xdd,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe2,0xe0,0xdd,0x00,\n\t0xe3,0xe1,0xde,0x00,0xe4,0xe2,0xdf,0x00,0xe5,0xe3,0xe0,0x00,0xe6,0xe4,0xe1,0x00,0xe7,0xe5,0xe3,0x00,0xe8,0xe6,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xeb,0xe9,0xe6,0x00,\n\t0xec,0xea,0xe7,0x00,0xed,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,0xf2,0xef,0xed,0x00,0xf3,0xf0,0xee,0x00,0xf4,0xf2,0xef,0x00,\n\t0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf8,0xf5,0xf3,0x00,0xf9,0xf6,0xf4,0x00,0xfa,0xf7,0xf5,0x00,0xfb,0xf8,0xf6,0x00,0xfc,0xf9,0xf7,0x00,0xfd,0xfb,0xf8,0x00,\n\t0xff,0xfc,0xfa,0x00,0xff,0xfc,0xfa,0x00,0xff,0xfc,0xfa,0x00,0xff,0xfc,0xfb,0x00,0xff,0xfd,0xfb,0x00,0xff,0xfd,0xfb,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,\n\t0xff,0xfd,0xfc,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1e,0x1e,0x1d,0x00,0x1f,0x1f,0x1e,0x00,0x20,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,\n\t0x22,0x22,0x21,0x00,0x23,0x23,0x22,0x00,0x24,0x24,0x23,0x00,0x25,0x25,0x24,0x00,0x27,0x27,0x26,0x00,0x28,0x28,0x27,0x00,0x29,0x29,0x28,0x00,0x2a,0x2a,0x29,0x00,\n\t0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,\n\t0x34,0x35,0x35,0x00,0x35,0x36,0x35,0x00,0x37,0x37,0x36,0x00,0x38,0x38,0x37,0x00,0x39,0x39,0x38,0x00,0x3a,0x3a,0x39,0x00,0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,\n\t0x3e,0x3d,0x3d,0x00,0x3f,0x3e,0x3e,0x00,0x40,0x3f,0x3f,0x00,0x41,0x40,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,\n\t0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,\n\t0x50,0x50,0x4e,0x00,0x51,0x51,0x4f,0x00,0x52,0x52,0x50,0x00,0x53,0x53,0x51,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,\n\t0x58,0x59,0x57,0x00,0x5a,0x5a,0x58,0x00,0x5b,0x5b,0x59,0x00,0x5c,0x5c,0x5a,0x00,0x5d,0x5e,0x5c,0x00,0x5f,0x5f,0x5d,0x00,0x60,0x60,0x5e,0x00,0x61,0x61,0x5f,0x00,\n\t0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x65,0x65,0x63,0x00,0x66,0x66,0x64,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,\n\t0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x73,0x73,0x71,0x00,0x74,0x74,0x72,0x00,\n\t0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x79,0x79,0x77,0x00,0x7a,0x7a,0x78,0x00,0x7b,0x7b,0x79,0x00,0x7c,0x7c,0x7a,0x00,0x7d,0x7d,0x7b,0x00,\n\t0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x85,0x83,0x00,0x86,0x86,0x84,0x00,\n\t0x87,0x88,0x85,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,\n\t0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,\n\t0x99,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9d,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,0xa0,0x9f,0x9c,0x00,0xa1,0xa0,0x9d,0x00,0xa2,0xa1,0x9e,0x00,\n\t0xa3,0xa3,0xa0,0x00,0xa5,0xa4,0xa1,0x00,0xa6,0xa5,0xa2,0x00,0xa7,0xa6,0xa3,0x00,0xa8,0xa7,0xa4,0x00,0xa9,0xa8,0xa5,0x00,0xaa,0xa9,0xa7,0x00,0xab,0xaa,0xa8,0x00,\n\t0xac,0xac,0xa9,0x00,0xae,0xad,0xaa,0x00,0xaf,0xae,0xab,0x00,0xb0,0xaf,0xac,0x00,0xb1,0xb0,0xae,0x00,0xb2,0xb1,0xaf,0x00,0xb3,0xb2,0xb0,0x00,0xb4,0xb3,0xb1,0x00,\n\t0xb5,0xb5,0xb2,0x00,0xb7,0xb6,0xb4,0x00,0xb8,0xb7,0xb5,0x00,0xb9,0xb8,0xb6,0x00,0xba,0xb9,0xb7,0x00,0xbb,0xba,0xb8,0x00,0xbc,0xbb,0xb9,0x00,0xbd,0xbc,0xba,0x00,\n\t0xbe,0xbe,0xbb,0x00,0xc0,0xbf,0xbd,0x00,0xc1,0xc0,0xbe,0x00,0xc2,0xc1,0xbf,0x00,0xc3,0xc2,0xc0,0x00,0xc4,0xc3,0xc1,0x00,0xc5,0xc4,0xc2,0x00,0xc6,0xc5,0xc3,0x00,\n\t0xc7,0xc7,0xc4,0x00,0xc9,0xc8,0xc5,0x00,0xca,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,0xcd,0xcc,0xca,0x00,0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,\n\t0xd0,0xcf,0xcd,0x00,0xd2,0xd0,0xce,0x00,0xd3,0xd1,0xcf,0x00,0xd4,0xd2,0xd0,0x00,0xd5,0xd3,0xd1,0x00,0xd6,0xd4,0xd2,0x00,0xd7,0xd5,0xd3,0x00,0xd8,0xd6,0xd4,0x00,\n\t0xd9,0xd8,0xd6,0x00,0xdb,0xd9,0xd7,0x00,0xdc,0xda,0xd8,0x00,0xdd,0xdb,0xd9,0x00,0xde,0xdc,0xda,0x00,0xdf,0xdd,0xdb,0x00,0xe0,0xde,0xdc,0x00,0xe1,0xdf,0xdd,0x00,\n\t0xe2,0xe1,0xde,0x00,0xe4,0xe2,0xdf,0x00,0xe5,0xe3,0xe0,0x00,0xe6,0xe4,0xe1,0x00,0xe7,0xe5,0xe2,0x00,0xe8,0xe6,0xe3,0x00,0xe9,0xe7,0xe4,0x00,0xea,0xe8,0xe5,0x00,\n\t0xeb,0xea,0xe7,0x00,0xed,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,0xf2,0xf0,0xee,0x00,0xf4,0xf1,0xef,0x00,\n\t0xf5,0xf2,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf2,0x00,0xf8,0xf6,0xf3,0x00,0xfa,0xf7,0xf5,0x00,0xfb,0xf8,0xf6,0x00,0xfc,0xf9,0xf7,0x00,0xfd,0xfa,0xf8,0x00,\n\t0xfe,0xfb,0xf9,0x00,0xfe,0xfc,0xfa,0x00,0xfe,0xfc,0xfa,0x00,0xfe,0xfc,0xfa,0x00,0xfe,0xfc,0xfb,0x00,0xfe,0xfd,0xfb,0x00,0xff,0xfd,0xfb,0x00,0xff,0xfd,0xfc,0x00,\n\t0xff,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x17,0x16,0x00,0x17,0x18,0x17,0x00,\n\t0x18,0x19,0x18,0x00,0x1a,0x1a,0x19,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,\n\t0x21,0x21,0x21,0x00,0x23,0x23,0x22,0x00,0x24,0x24,0x23,0x00,0x25,0x25,0x24,0x00,0x26,0x26,0x25,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,\n\t0x2a,0x2a,0x2a,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,\n\t0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x38,0x38,0x00,0x3a,0x39,0x39,0x00,0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,\n\t0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x44,0x43,0x00,0x44,0x45,0x44,0x00,\n\t0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4c,0x4c,0x4a,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,\n\t0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x55,0x53,0x00,0x55,0x56,0x54,0x00,0x56,0x57,0x55,0x00,\n\t0x58,0x58,0x56,0x00,0x5a,0x5a,0x58,0x00,0x5b,0x5b,0x59,0x00,0x5c,0x5c,0x5a,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x60,0x60,0x5e,0x00,0x61,0x61,0x5f,0x00,\n\t0x62,0x62,0x60,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x66,0x66,0x64,0x00,0x67,0x67,0x65,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,\n\t0x6b,0x6c,0x6a,0x00,0x6d,0x6e,0x6b,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x74,0x74,0x72,0x00,\n\t0x75,0x75,0x73,0x00,0x76,0x76,0x74,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7b,0x7b,0x79,0x00,0x7c,0x7c,0x7a,0x00,0x7d,0x7d,0x7b,0x00,\n\t0x7e,0x7e,0x7c,0x00,0x7f,0x7f,0x7d,0x00,0x80,0x81,0x7e,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x85,0x85,0x83,0x00,0x86,0x86,0x84,0x00,\n\t0x87,0x87,0x85,0x00,0x88,0x88,0x86,0x00,0x89,0x8a,0x87,0x00,0x8a,0x8b,0x88,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,\n\t0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x92,0x93,0x90,0x00,0x93,0x94,0x91,0x00,0x94,0x95,0x92,0x00,0x95,0x96,0x93,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,\n\t0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9d,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0xa1,0xa0,0x9d,0x00,0xa2,0xa1,0x9e,0x00,\n\t0xa3,0xa2,0x9f,0x00,0xa4,0xa3,0xa0,0x00,0xa5,0xa5,0xa2,0x00,0xa6,0xa6,0xa3,0x00,0xa8,0xa7,0xa4,0x00,0xa9,0xa8,0xa5,0x00,0xaa,0xa9,0xa6,0x00,0xab,0xaa,0xa7,0x00,\n\t0xac,0xab,0xa9,0x00,0xad,0xac,0xaa,0x00,0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,0xb1,0xb0,0xad,0x00,0xb2,0xb1,0xaf,0x00,0xb3,0xb2,0xb0,0x00,0xb4,0xb3,0xb1,0x00,\n\t0xb5,0xb4,0xb2,0x00,0xb6,0xb5,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xba,0xb9,0xb7,0x00,0xbb,0xba,0xb8,0x00,0xbc,0xbb,0xb9,0x00,0xbd,0xbc,0xba,0x00,\n\t0xbe,0xbd,0xbb,0x00,0xbf,0xbe,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc3,0xc2,0xc0,0x00,0xc4,0xc3,0xc1,0x00,0xc5,0xc4,0xc2,0x00,0xc6,0xc5,0xc3,0x00,\n\t0xc7,0xc6,0xc4,0x00,0xc8,0xc7,0xc5,0x00,0xc9,0xc8,0xc6,0x00,0xca,0xc9,0xc7,0x00,0xcc,0xcb,0xc8,0x00,0xcd,0xcc,0xc9,0x00,0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,\n\t0xd0,0xcf,0xcd,0x00,0xd1,0xd0,0xce,0x00,0xd2,0xd1,0xcf,0x00,0xd3,0xd2,0xd0,0x00,0xd5,0xd3,0xd1,0x00,0xd6,0xd4,0xd2,0x00,0xd7,0xd5,0xd3,0x00,0xd8,0xd6,0xd4,0x00,\n\t0xd9,0xd7,0xd5,0x00,0xda,0xd8,0xd6,0x00,0xdb,0xda,0xd7,0x00,0xdc,0xdb,0xd8,0x00,0xde,0xdc,0xda,0x00,0xdf,0xdd,0xdb,0x00,0xe0,0xde,0xdc,0x00,0xe1,0xdf,0xdd,0x00,\n\t0xe2,0xe0,0xde,0x00,0xe3,0xe1,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe7,0xe5,0xe2,0x00,0xe8,0xe6,0xe3,0x00,0xe9,0xe7,0xe4,0x00,0xea,0xe8,0xe5,0x00,\n\t0xeb,0xe9,0xe6,0x00,0xec,0xea,0xe7,0x00,0xed,0xeb,0xe9,0x00,0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,0xf2,0xf0,0xed,0x00,0xf3,0xf1,0xee,0x00,\n\t0xf4,0xf2,0xf0,0x00,0xf6,0xf3,0xf1,0x00,0xf7,0xf4,0xf2,0x00,0xf8,0xf5,0xf3,0x00,0xf9,0xf7,0xf4,0x00,0xfa,0xf8,0xf5,0x00,0xfc,0xf9,0xf7,0x00,0xfd,0xfa,0xf8,0x00,\n\t0xfe,0xfb,0xf9,0x00,0xfe,0xfb,0xf9,0x00,0xfe,0xfc,0xfa,0x00,0xfe,0xfc,0xfa,0x00,0xfe,0xfc,0xfa,0x00,0xfe,0xfc,0xfb,0x00,0xfe,0xfd,0xfb,0x00,0xfe,0xfd,0xfc,0x00,\n\t0xfe,0xfd,0xfc,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x17,0x16,0x00,0x17,0x18,0x17,0x00,\n\t0x18,0x19,0x18,0x00,0x19,0x1a,0x19,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,\n\t0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x24,0x24,0x23,0x00,0x25,0x25,0x24,0x00,0x26,0x26,0x25,0x00,0x27,0x27,0x26,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,\n\t0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,\n\t0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,\n\t0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x44,0x43,0x00,0x44,0x45,0x44,0x00,\n\t0x45,0x46,0x45,0x00,0x46,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,\n\t0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x56,0x54,0x00,0x56,0x57,0x55,0x00,\n\t0x57,0x58,0x56,0x00,0x59,0x5a,0x58,0x00,0x5b,0x5b,0x59,0x00,0x5c,0x5c,0x5a,0x00,0x5d,0x5d,0x5b,0x00,0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x61,0x61,0x5f,0x00,\n\t0x62,0x62,0x60,0x00,0x63,0x64,0x61,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x67,0x67,0x65,0x00,0x68,0x69,0x66,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,\n\t0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6e,0x6e,0x6c,0x00,0x6f,0x70,0x6d,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,\n\t0x75,0x75,0x73,0x00,0x76,0x76,0x74,0x00,0x77,0x77,0x75,0x00,0x78,0x78,0x76,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7d,0x7d,0x7b,0x00,\n\t0x7e,0x7e,0x7c,0x00,0x7f,0x7f,0x7d,0x00,0x80,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x83,0x80,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,\n\t0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8c,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,\n\t0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x95,0x92,0x00,0x95,0x96,0x93,0x00,0x96,0x97,0x94,0x00,0x98,0x98,0x95,0x00,\n\t0x99,0x99,0x96,0x00,0x9a,0x9a,0x97,0x00,0x9b,0x9b,0x99,0x00,0x9d,0x9c,0x9a,0x00,0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9d,0x00,0xa2,0xa1,0x9e,0x00,\n\t0xa3,0xa2,0x9f,0x00,0xa4,0xa3,0xa0,0x00,0xa5,0xa4,0xa1,0x00,0xa6,0xa5,0xa3,0x00,0xa7,0xa7,0xa4,0x00,0xa8,0xa8,0xa5,0x00,0xaa,0xa9,0xa6,0x00,0xab,0xaa,0xa7,0x00,\n\t0xac,0xab,0xa8,0x00,0xad,0xac,0xaa,0x00,0xae,0xad,0xab,0x00,0xaf,0xae,0xac,0x00,0xb0,0xb0,0xad,0x00,0xb1,0xb1,0xae,0x00,0xb3,0xb2,0xaf,0x00,0xb4,0xb3,0xb1,0x00,\n\t0xb5,0xb4,0xb2,0x00,0xb6,0xb5,0xb3,0x00,0xb7,0xb6,0xb4,0x00,0xb8,0xb7,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbc,0xbb,0xb9,0x00,0xbd,0xbc,0xba,0x00,\n\t0xbe,0xbd,0xbb,0x00,0xbf,0xbe,0xbc,0x00,0xc0,0xbf,0xbd,0x00,0xc1,0xc0,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc5,0xc4,0xc2,0x00,0xc6,0xc5,0xc3,0x00,\n\t0xc7,0xc6,0xc4,0x00,0xc8,0xc7,0xc5,0x00,0xc9,0xc8,0xc6,0x00,0xca,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,0xce,0xcc,0xca,0x00,0xcf,0xcd,0xcb,0x00,\n\t0xd0,0xcf,0xcc,0x00,0xd1,0xd0,0xcd,0x00,0xd2,0xd1,0xcf,0x00,0xd3,0xd2,0xd0,0x00,0xd4,0xd3,0xd1,0x00,0xd5,0xd4,0xd2,0x00,0xd7,0xd5,0xd3,0x00,0xd8,0xd6,0xd4,0x00,\n\t0xd9,0xd7,0xd5,0x00,0xda,0xd8,0xd6,0x00,0xdb,0xd9,0xd7,0x00,0xdc,0xda,0xd8,0x00,0xdd,0xdc,0xd9,0x00,0xde,0xdd,0xda,0x00,0xe0,0xde,0xdb,0x00,0xe1,0xdf,0xdc,0x00,\n\t0xe2,0xe0,0xde,0x00,0xe3,0xe1,0xdf,0x00,0xe4,0xe2,0xe0,0x00,0xe5,0xe3,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,0xe9,0xe7,0xe4,0x00,0xea,0xe8,0xe5,0x00,\n\t0xeb,0xe9,0xe6,0x00,0xec,0xea,0xe7,0x00,0xed,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,0xef,0xed,0xeb,0x00,0xf1,0xef,0xec,0x00,0xf2,0xf0,0xed,0x00,0xf3,0xf1,0xee,0x00,\n\t0xf4,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf2,0x00,0xf8,0xf5,0xf3,0x00,0xf9,0xf6,0xf4,0x00,0xfa,0xf7,0xf5,0x00,0xfb,0xf9,0xf6,0x00,0xfc,0xfa,0xf7,0x00,\n\t0xfe,0xfb,0xf9,0x00,0xfe,0xfb,0xf9,0x00,0xfe,0xfb,0xf9,0x00,0xfe,0xfc,0xfa,0x00,0xfe,0xfc,0xfa,0x00,0xfe,0xfc,0xfb,0x00,0xfe,0xfc,0xfb,0x00,0xfe,0xfd,0xfb,0x00,\n\t0xfe,0xfd,0xfc,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x18,0x17,0x00,\n\t0x18,0x19,0x18,0x00,0x19,0x1a,0x19,0x00,0x1a,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,\n\t0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x25,0x25,0x24,0x00,0x26,0x26,0x25,0x00,0x27,0x27,0x26,0x00,0x28,0x28,0x27,0x00,0x29,0x29,0x29,0x00,\n\t0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x33,0x33,0x33,0x00,\n\t0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3c,0x3c,0x3b,0x00,\n\t0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x45,0x44,0x00,\n\t0x45,0x46,0x45,0x00,0x46,0x47,0x46,0x00,0x47,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4e,0x4e,0x4d,0x00,\n\t0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x57,0x55,0x00,\n\t0x57,0x58,0x56,0x00,0x59,0x59,0x58,0x00,0x5a,0x5b,0x59,0x00,0x5c,0x5c,0x5a,0x00,0x5d,0x5d,0x5b,0x00,0x5e,0x5e,0x5c,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,\n\t0x62,0x62,0x60,0x00,0x63,0x63,0x61,0x00,0x64,0x65,0x62,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x68,0x68,0x66,0x00,0x69,0x6a,0x67,0x00,0x6a,0x6b,0x69,0x00,\n\t0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6f,0x6f,0x6d,0x00,0x70,0x70,0x6e,0x00,0x71,0x72,0x6f,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,\n\t0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x77,0x77,0x75,0x00,0x78,0x78,0x76,0x00,0x79,0x79,0x77,0x00,0x7a,0x7a,0x78,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,\n\t0x7d,0x7e,0x7c,0x00,0x7f,0x7f,0x7d,0x00,0x80,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x85,0x82,0x00,0x85,0x86,0x83,0x00,\n\t0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8c,0x8c,0x8a,0x00,0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8c,0x00,\n\t0x8f,0x90,0x8d,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x97,0x94,0x00,0x97,0x98,0x95,0x00,\n\t0x99,0x99,0x96,0x00,0x9a,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9e,0x9d,0x9a,0x00,0x9f,0x9e,0x9c,0x00,0xa0,0xa0,0x9d,0x00,0xa1,0xa1,0x9e,0x00,\n\t0xa2,0xa2,0x9f,0x00,0xa4,0xa3,0xa0,0x00,0xa5,0xa4,0xa1,0x00,0xa6,0xa5,0xa2,0x00,0xa7,0xa6,0xa3,0x00,0xa8,0xa7,0xa5,0x00,0xa9,0xa9,0xa6,0x00,0xaa,0xaa,0xa7,0x00,\n\t0xab,0xab,0xa8,0x00,0xad,0xac,0xa9,0x00,0xae,0xad,0xaa,0x00,0xaf,0xae,0xac,0x00,0xb0,0xaf,0xad,0x00,0xb1,0xb0,0xae,0x00,0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,\n\t0xb4,0xb4,0xb1,0x00,0xb6,0xb5,0xb3,0x00,0xb7,0xb6,0xb4,0x00,0xb8,0xb7,0xb5,0x00,0xb9,0xb8,0xb6,0x00,0xba,0xb9,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,\n\t0xbd,0xbd,0xba,0x00,0xbf,0xbe,0xbc,0x00,0xc0,0xbf,0xbd,0x00,0xc1,0xc0,0xbe,0x00,0xc2,0xc1,0xbf,0x00,0xc3,0xc2,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,\n\t0xc6,0xc6,0xc3,0x00,0xc8,0xc7,0xc5,0x00,0xc9,0xc8,0xc6,0x00,0xca,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,0xcd,0xcc,0xca,0x00,0xce,0xcd,0xcb,0x00,\n\t0xcf,0xce,0xcc,0x00,0xd1,0xcf,0xcd,0x00,0xd2,0xd0,0xce,0x00,0xd3,0xd1,0xcf,0x00,0xd4,0xd3,0xd0,0x00,0xd5,0xd4,0xd2,0x00,0xd6,0xd5,0xd3,0x00,0xd7,0xd6,0xd4,0x00,\n\t0xd8,0xd7,0xd5,0x00,0xda,0xd8,0xd6,0x00,0xdb,0xd9,0xd7,0x00,0xdc,0xda,0xd8,0x00,0xdd,0xdb,0xd9,0x00,0xde,0xdc,0xda,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,\n\t0xe1,0xe0,0xdd,0x00,0xe3,0xe1,0xde,0x00,0xe4,0xe2,0xdf,0x00,0xe5,0xe3,0xe0,0x00,0xe6,0xe4,0xe2,0x00,0xe7,0xe5,0xe3,0x00,0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,\n\t0xea,0xe9,0xe6,0x00,0xec,0xea,0xe7,0x00,0xed,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,0xf1,0xef,0xed,0x00,0xf3,0xf0,0xee,0x00,\n\t0xf4,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf2,0x00,0xf8,0xf6,0xf4,0x00,0xfa,0xf7,0xf5,0x00,0xfb,0xf8,0xf6,0x00,0xfc,0xf9,0xf7,0x00,\n\t0xfd,0xfa,0xf8,0x00,0xfd,0xfb,0xf9,0x00,0xfd,0xfb,0xf9,0x00,0xfd,0xfb,0xf9,0x00,0xfe,0xfc,0xfa,0x00,0xfe,0xfc,0xfa,0x00,0xfe,0xfc,0xfb,0x00,0xfe,0xfc,0xfb,0x00,\n\t0xfe,0xfd,0xfc,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x18,0x19,0x18,0x00,0x19,0x1a,0x19,0x00,0x1a,0x1b,0x1b,0x00,0x1b,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,\n\t0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x26,0x26,0x25,0x00,0x27,0x27,0x26,0x00,0x28,0x28,0x27,0x00,0x29,0x29,0x28,0x00,\n\t0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x46,0x45,0x00,0x46,0x47,0x46,0x00,0x47,0x48,0x47,0x00,0x48,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,\n\t0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,\n\t0x57,0x58,0x56,0x00,0x59,0x59,0x57,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5c,0x5a,0x00,0x5d,0x5d,0x5b,0x00,0x5e,0x5e,0x5c,0x00,0x5f,0x5f,0x5d,0x00,0x60,0x61,0x5f,0x00,\n\t0x61,0x62,0x60,0x00,0x63,0x63,0x61,0x00,0x64,0x64,0x62,0x00,0x65,0x66,0x63,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x69,0x69,0x67,0x00,0x6a,0x6b,0x68,0x00,\n\t0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x71,0x71,0x6f,0x00,0x72,0x72,0x70,0x00,0x73,0x74,0x71,0x00,\n\t0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x79,0x79,0x77,0x00,0x7a,0x7a,0x78,0x00,0x7b,0x7b,0x79,0x00,0x7c,0x7c,0x7a,0x00,\n\t0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x85,0x83,0x00,\n\t0x86,0x87,0x84,0x00,0x87,0x88,0x85,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,\n\t0x8f,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x90,0x00,0x93,0x94,0x91,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,\n\t0x98,0x99,0x96,0x00,0x9a,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9d,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,0xa0,0x9f,0x9c,0x00,0xa1,0xa0,0x9d,0x00,\n\t0xa2,0xa2,0x9f,0x00,0xa3,0xa3,0xa0,0x00,0xa4,0xa4,0xa1,0x00,0xa6,0xa5,0xa2,0x00,0xa7,0xa6,0xa3,0x00,0xa8,0xa7,0xa4,0x00,0xa9,0xa8,0xa5,0x00,0xaa,0xa9,0xa7,0x00,\n\t0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xaf,0xae,0xab,0x00,0xb0,0xaf,0xac,0x00,0xb1,0xb0,0xae,0x00,0xb2,0xb1,0xaf,0x00,0xb3,0xb2,0xb0,0x00,\n\t0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb8,0xb7,0xb5,0x00,0xb9,0xb8,0xb6,0x00,0xba,0xb9,0xb7,0x00,0xbb,0xba,0xb8,0x00,0xbc,0xbb,0xb9,0x00,\n\t0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc1,0xc0,0xbe,0x00,0xc2,0xc1,0xbf,0x00,0xc3,0xc2,0xc0,0x00,0xc4,0xc3,0xc1,0x00,0xc5,0xc4,0xc2,0x00,\n\t0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xca,0xc9,0xc6,0x00,0xcb,0xca,0xc7,0x00,0xcc,0xcb,0xc9,0x00,0xcd,0xcc,0xca,0x00,0xce,0xcd,0xcb,0x00,\n\t0xcf,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd1,0xd0,0xce,0x00,0xd3,0xd1,0xcf,0x00,0xd4,0xd2,0xd0,0x00,0xd5,0xd3,0xd1,0x00,0xd6,0xd4,0xd2,0x00,0xd7,0xd5,0xd3,0x00,\n\t0xd8,0xd7,0xd5,0x00,0xd9,0xd8,0xd6,0x00,0xda,0xd9,0xd7,0x00,0xdc,0xda,0xd8,0x00,0xdd,0xdb,0xd9,0x00,0xde,0xdc,0xda,0x00,0xdf,0xdd,0xdb,0x00,0xe0,0xde,0xdc,0x00,\n\t0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe5,0xe3,0xe0,0x00,0xe6,0xe4,0xe1,0x00,0xe7,0xe5,0xe2,0x00,0xe8,0xe6,0xe3,0x00,0xe9,0xe7,0xe4,0x00,\n\t0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,0xf2,0xf0,0xed,0x00,\n\t0xf3,0xf1,0xef,0x00,0xf5,0xf2,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf2,0x00,0xf8,0xf6,0xf3,0x00,0xf9,0xf7,0xf4,0x00,0xfa,0xf8,0xf5,0x00,0xfc,0xf9,0xf7,0x00,\n\t0xfd,0xfa,0xf8,0x00,0xfd,0xfa,0xf8,0x00,0xfd,0xfb,0xf9,0x00,0xfd,0xfb,0xf9,0x00,0xfd,0xfb,0xfa,0x00,0xfd,0xfc,0xfa,0x00,0xfe,0xfc,0xfa,0x00,0xfe,0xfc,0xfb,0x00,\n\t0xfe,0xfd,0xfb,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,\n\t0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,\n\t0x29,0x29,0x29,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x39,0x38,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,\n\t0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,\n\t0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x54,0x52,0x00,0x54,0x55,0x54,0x00,0x55,0x56,0x55,0x00,\n\t0x56,0x57,0x56,0x00,0x59,0x59,0x57,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5d,0x5b,0x00,0x5e,0x5e,0x5c,0x00,0x5f,0x5f,0x5d,0x00,0x60,0x60,0x5e,0x00,\n\t0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x64,0x64,0x62,0x00,0x65,0x65,0x63,0x00,0x66,0x67,0x64,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x6a,0x6a,0x68,0x00,\n\t0x6b,0x6c,0x69,0x00,0x6c,0x6d,0x6a,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x73,0x73,0x71,0x00,\n\t0x74,0x74,0x72,0x00,0x75,0x76,0x73,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7b,0x7b,0x79,0x00,0x7c,0x7c,0x7a,0x00,\n\t0x7d,0x7d,0x7b,0x00,0x7e,0x7e,0x7c,0x00,0x7f,0x80,0x7d,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,\n\t0x86,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x88,0x89,0x86,0x00,0x89,0x8a,0x87,0x00,0x8a,0x8b,0x88,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,\n\t0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x90,0x00,0x93,0x94,0x91,0x00,0x94,0x95,0x92,0x00,0x96,0x96,0x93,0x00,0x97,0x97,0x94,0x00,\n\t0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9b,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9d,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0xa1,0xa0,0x9d,0x00,\n\t0xa2,0xa1,0x9e,0x00,0xa3,0xa2,0x9f,0x00,0xa4,0xa4,0xa1,0x00,0xa5,0xa5,0xa2,0x00,0xa6,0xa6,0xa3,0x00,0xa7,0xa7,0xa4,0x00,0xa9,0xa8,0xa5,0x00,0xaa,0xa9,0xa6,0x00,\n\t0xab,0xaa,0xa8,0x00,0xac,0xab,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,0xb0,0xb0,0xad,0x00,0xb2,0xb1,0xae,0x00,0xb3,0xb2,0xb0,0x00,\n\t0xb4,0xb3,0xb1,0x00,0xb5,0xb4,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xbb,0xba,0xb8,0x00,0xbc,0xbb,0xb9,0x00,\n\t0xbd,0xbc,0xba,0x00,0xbe,0xbd,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc4,0xc3,0xc1,0x00,0xc5,0xc4,0xc2,0x00,\n\t0xc6,0xc5,0xc3,0x00,0xc7,0xc6,0xc4,0x00,0xc8,0xc7,0xc5,0x00,0xc9,0xc8,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcd,0xcc,0xc9,0x00,0xce,0xcd,0xca,0x00,\n\t0xcf,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd1,0xd0,0xce,0x00,0xd2,0xd1,0xcf,0x00,0xd3,0xd2,0xd0,0x00,0xd4,0xd3,0xd1,0x00,0xd6,0xd4,0xd2,0x00,0xd7,0xd5,0xd3,0x00,\n\t0xd8,0xd6,0xd4,0x00,0xd9,0xd7,0xd5,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xda,0xd7,0x00,0xdc,0xdb,0xd9,0x00,0xdd,0xdc,0xda,0x00,0xdf,0xdd,0xdb,0x00,0xe0,0xde,0xdc,0x00,\n\t0xe1,0xdf,0xdd,0x00,0xe2,0xe0,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe8,0xe6,0xe3,0x00,0xe9,0xe7,0xe4,0x00,\n\t0xea,0xe8,0xe5,0x00,0xeb,0xe9,0xe6,0x00,0xec,0xea,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,0xf2,0xf0,0xed,0x00,\n\t0xf3,0xf1,0xee,0x00,0xf4,0xf2,0xef,0x00,0xf5,0xf3,0xf1,0x00,0xf7,0xf4,0xf2,0x00,0xf8,0xf5,0xf3,0x00,0xf9,0xf7,0xf4,0x00,0xfa,0xf8,0xf5,0x00,0xfb,0xf9,0xf6,0x00,\n\t0xfc,0xfa,0xf7,0x00,0xfd,0xfa,0xf8,0x00,0xfd,0xfa,0xf8,0x00,0xfd,0xfb,0xf9,0x00,0xfd,0xfb,0xf9,0x00,0xfd,0xfb,0xfa,0x00,0xfd,0xfc,0xfa,0x00,0xfe,0xfc,0xfb,0x00,\n\t0xfe,0xfc,0xfb,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,\n\t0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,\n\t0x29,0x29,0x29,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,\n\t0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,\n\t0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x55,0x54,0x00,0x55,0x56,0x55,0x00,\n\t0x56,0x57,0x56,0x00,0x59,0x59,0x57,0x00,0x5a,0x5a,0x58,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5d,0x5b,0x00,0x5d,0x5e,0x5c,0x00,0x5f,0x5f,0x5d,0x00,0x60,0x60,0x5e,0x00,\n\t0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x65,0x65,0x63,0x00,0x66,0x67,0x64,0x00,0x67,0x68,0x65,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,\n\t0x6b,0x6c,0x69,0x00,0x6c,0x6d,0x6a,0x00,0x6d,0x6e,0x6b,0x00,0x6e,0x6f,0x6c,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,\n\t0x74,0x74,0x72,0x00,0x75,0x75,0x73,0x00,0x76,0x76,0x74,0x00,0x77,0x78,0x75,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,\n\t0x7d,0x7d,0x7b,0x00,0x7e,0x7e,0x7c,0x00,0x7f,0x7f,0x7d,0x00,0x80,0x80,0x7e,0x00,0x81,0x82,0x7f,0x00,0x82,0x83,0x80,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,\n\t0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8b,0x88,0x00,0x8b,0x8c,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8b,0x00,\n\t0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x94,0x91,0x00,0x94,0x95,0x92,0x00,0x95,0x96,0x93,0x00,0x97,0x97,0x94,0x00,\n\t0x98,0x98,0x95,0x00,0x99,0x99,0x96,0x00,0x9a,0x9a,0x97,0x00,0x9b,0x9b,0x99,0x00,0x9d,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9d,0x00,\n\t0xa2,0xa1,0x9e,0x00,0xa3,0xa2,0x9f,0x00,0xa4,0xa3,0xa0,0x00,0xa5,0xa4,0xa1,0x00,0xa6,0xa6,0xa3,0x00,0xa7,0xa7,0xa4,0x00,0xa8,0xa8,0xa5,0x00,0xa9,0xa9,0xa6,0x00,\n\t0xab,0xaa,0xa7,0x00,0xac,0xab,0xa8,0x00,0xad,0xac,0xaa,0x00,0xae,0xad,0xab,0x00,0xaf,0xaf,0xac,0x00,0xb0,0xb0,0xad,0x00,0xb1,0xb1,0xae,0x00,0xb2,0xb2,0xaf,0x00,\n\t0xb4,0xb3,0xb1,0x00,0xb5,0xb4,0xb2,0x00,0xb6,0xb5,0xb3,0x00,0xb7,0xb6,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,\n\t0xbd,0xbc,0xba,0x00,0xbe,0xbd,0xbb,0x00,0xbf,0xbe,0xbc,0x00,0xc0,0xbf,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,\n\t0xc6,0xc5,0xc3,0x00,0xc7,0xc6,0xc4,0x00,0xc8,0xc7,0xc5,0x00,0xc9,0xc8,0xc6,0x00,0xca,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,0xcd,0xcc,0xca,0x00,\n\t0xcf,0xce,0xcb,0x00,0xd0,0xcf,0xcc,0x00,0xd1,0xd0,0xcd,0x00,0xd2,0xd1,0xcf,0x00,0xd3,0xd2,0xd0,0x00,0xd4,0xd3,0xd1,0x00,0xd5,0xd4,0xd2,0x00,0xd6,0xd5,0xd3,0x00,\n\t0xd8,0xd6,0xd4,0x00,0xd9,0xd7,0xd5,0x00,0xda,0xd8,0xd6,0x00,0xdb,0xd9,0xd7,0x00,0xdc,0xdb,0xd8,0x00,0xdd,0xdc,0xd9,0x00,0xde,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,\n\t0xe1,0xdf,0xdd,0x00,0xe2,0xe0,0xde,0x00,0xe3,0xe1,0xdf,0x00,0xe4,0xe2,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,\n\t0xea,0xe8,0xe5,0x00,0xeb,0xe9,0xe6,0x00,0xec,0xea,0xe7,0x00,0xed,0xeb,0xe8,0x00,0xee,0xec,0xea,0x00,0xef,0xed,0xeb,0x00,0xf0,0xef,0xec,0x00,0xf2,0xf0,0xed,0x00,\n\t0xf3,0xf1,0xee,0x00,0xf4,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf3,0x00,0xf9,0xf6,0xf4,0x00,0xfa,0xf7,0xf5,0x00,0xfb,0xf8,0xf6,0x00,\n\t0xfc,0xfa,0xf7,0x00,0xfc,0xfa,0xf8,0x00,0xfc,0xfa,0xf8,0x00,0xfd,0xfb,0xf9,0x00,0xfd,0xfb,0xf9,0x00,0xfd,0xfb,0xfa,0x00,0xfd,0xfc,0xfa,0x00,0xfd,0xfc,0xfb,0x00,\n\t0xfe,0xfc,0xfb,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x20,0x20,0x20,0x00,\n\t0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,\n\t0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x3a,0x3a,0x39,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,\n\t0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4d,0x4d,0x4c,0x00,\n\t0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x56,0x55,0x00,\n\t0x56,0x57,0x56,0x00,0x59,0x59,0x57,0x00,0x5a,0x5a,0x58,0x00,0x5b,0x5b,0x59,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x60,0x60,0x5e,0x00,\n\t0x61,0x61,0x5f,0x00,0x62,0x63,0x60,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x66,0x66,0x64,0x00,0x67,0x68,0x65,0x00,0x68,0x69,0x66,0x00,0x69,0x6a,0x68,0x00,\n\t0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6d,0x6d,0x6b,0x00,0x6e,0x6f,0x6c,0x00,0x6f,0x70,0x6d,0x00,0x70,0x71,0x6e,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,\n\t0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x77,0x77,0x75,0x00,0x78,0x78,0x76,0x00,0x79,0x79,0x77,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,\n\t0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,0x83,0x84,0x81,0x00,0x84,0x85,0x82,0x00,\n\t0x85,0x86,0x83,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8b,0x00,\n\t0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x96,0x93,0x00,0x96,0x97,0x94,0x00,\n\t0x97,0x98,0x95,0x00,0x99,0x99,0x96,0x00,0x9a,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9e,0x9d,0x9a,0x00,0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9d,0x00,\n\t0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0x9f,0x00,0xa3,0xa3,0xa0,0x00,0xa5,0xa4,0xa1,0x00,0xa6,0xa5,0xa2,0x00,0xa7,0xa6,0xa4,0x00,0xa8,0xa8,0xa5,0x00,0xa9,0xa9,0xa6,0x00,\n\t0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xae,0xad,0xaa,0x00,0xaf,0xae,0xac,0x00,0xb0,0xaf,0xad,0x00,0xb1,0xb1,0xae,0x00,0xb2,0xb2,0xaf,0x00,\n\t0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb7,0xb6,0xb4,0x00,0xb8,0xb7,0xb5,0x00,0xb9,0xb8,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,\n\t0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xc0,0xbf,0xbd,0x00,0xc1,0xc0,0xbe,0x00,0xc2,0xc1,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,\n\t0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc9,0xc8,0xc5,0x00,0xca,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,0xcd,0xcc,0xca,0x00,\n\t0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd2,0xd0,0xce,0x00,0xd3,0xd2,0xcf,0x00,0xd4,0xd3,0xd0,0x00,0xd5,0xd4,0xd2,0x00,0xd6,0xd5,0xd3,0x00,\n\t0xd7,0xd6,0xd4,0x00,0xd8,0xd7,0xd5,0x00,0xd9,0xd8,0xd6,0x00,0xdb,0xd9,0xd7,0x00,0xdc,0xda,0xd8,0x00,0xdd,0xdb,0xd9,0x00,0xde,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,\n\t0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe4,0xe2,0xdf,0x00,0xe5,0xe3,0xe1,0x00,0xe6,0xe4,0xe2,0x00,0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,\n\t0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xed,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,0xf1,0xef,0xed,0x00,\n\t0xf2,0xf0,0xee,0x00,0xf4,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf2,0x00,0xf8,0xf6,0xf3,0x00,0xf9,0xf7,0xf4,0x00,0xfa,0xf8,0xf6,0x00,\n\t0xfc,0xf9,0xf7,0x00,0xfc,0xfa,0xf7,0x00,0xfc,0xfa,0xf8,0x00,0xfc,0xfa,0xf8,0x00,0xfc,0xfb,0xf9,0x00,0xfd,0xfb,0xf9,0x00,0xfd,0xfb,0xfa,0x00,0xfd,0xfc,0xfa,0x00,\n\t0xfd,0xfc,0xfb,0x00,0xfe,0xfc,0xfb,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,\n\t0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,\n\t0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,\n\t0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x3a,0x3a,0x39,0x00,0x3b,0x3b,0x3a,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,\n\t0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,\n\t0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,\n\t0x56,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x5a,0x5a,0x58,0x00,0x5b,0x5b,0x59,0x00,0x5c,0x5c,0x5a,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,\n\t0x61,0x61,0x5f,0x00,0x62,0x62,0x60,0x00,0x63,0x64,0x61,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x67,0x67,0x65,0x00,0x68,0x69,0x66,0x00,0x69,0x6a,0x67,0x00,\n\t0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6f,0x6f,0x6d,0x00,0x70,0x71,0x6e,0x00,0x71,0x72,0x6f,0x00,0x72,0x73,0x70,0x00,\n\t0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x79,0x79,0x77,0x00,0x7a,0x7a,0x78,0x00,0x7b,0x7b,0x79,0x00,\n\t0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x84,0x84,0x82,0x00,\n\t0x85,0x86,0x83,0x00,0x86,0x87,0x84,0x00,0x87,0x88,0x85,0x00,0x88,0x89,0x86,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,\n\t0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x90,0x00,0x94,0x94,0x91,0x00,0x95,0x95,0x92,0x00,0x96,0x96,0x94,0x00,\n\t0x97,0x98,0x95,0x00,0x98,0x99,0x96,0x00,0x9a,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9d,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,0xa0,0x9f,0x9c,0x00,\n\t0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0x9f,0x00,0xa3,0xa3,0xa0,0x00,0xa4,0xa4,0xa1,0x00,0xa5,0xa5,0xa2,0x00,0xa7,0xa6,0xa3,0x00,0xa8,0xa7,0xa4,0x00,0xa9,0xa8,0xa6,0x00,\n\t0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,0xb0,0xaf,0xac,0x00,0xb1,0xb0,0xae,0x00,0xb2,0xb1,0xaf,0x00,\n\t0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb9,0xb8,0xb6,0x00,0xba,0xb9,0xb7,0x00,0xbb,0xba,0xb8,0x00,\n\t0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc2,0xc1,0xbf,0x00,0xc3,0xc2,0xc0,0x00,0xc4,0xc3,0xc1,0x00,\n\t0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xcb,0xca,0xc7,0x00,0xcc,0xcb,0xc8,0x00,0xcd,0xcc,0xca,0x00,\n\t0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd1,0xd0,0xce,0x00,0xd2,0xd1,0xcf,0x00,0xd4,0xd2,0xd0,0x00,0xd5,0xd3,0xd1,0x00,0xd6,0xd4,0xd2,0x00,\n\t0xd7,0xd6,0xd4,0x00,0xd8,0xd7,0xd5,0x00,0xd9,0xd8,0xd6,0x00,0xda,0xd9,0xd7,0x00,0xdb,0xda,0xd8,0x00,0xdd,0xdb,0xd9,0x00,0xde,0xdc,0xda,0x00,0xdf,0xdd,0xdb,0x00,\n\t0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe6,0xe4,0xe1,0x00,0xe7,0xe5,0xe2,0x00,0xe8,0xe6,0xe3,0x00,\n\t0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,\n\t0xf2,0xf0,0xed,0x00,0xf3,0xf1,0xee,0x00,0xf4,0xf2,0xf0,0x00,0xf6,0xf3,0xf1,0x00,0xf7,0xf5,0xf2,0x00,0xf8,0xf6,0xf3,0x00,0xf9,0xf7,0xf4,0x00,0xfa,0xf8,0xf5,0x00,\n\t0xfb,0xf9,0xf6,0x00,0xfb,0xf9,0xf7,0x00,0xfc,0xfa,0xf7,0x00,0xfc,0xfa,0xf8,0x00,0xfc,0xfa,0xf8,0x00,0xfc,0xfb,0xf9,0x00,0xfd,0xfb,0xfa,0x00,0xfd,0xfc,0xfa,0x00,\n\t0xfd,0xfc,0xfb,0x00,0xfd,0xfc,0xfb,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x13,0x13,0x14,0x00,0x14,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x16,0x00,\n\t0x18,0x17,0x17,0x00,0x19,0x18,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x23,0x22,0x00,0x23,0x24,0x23,0x00,0x24,0x25,0x24,0x00,0x25,0x26,0x25,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,\n\t0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x3a,0x3a,0x39,0x00,0x3b,0x3b,0x3a,0x00,\n\t0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x42,0x00,\n\t0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,\n\t0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x50,0x4f,0x00,0x50,0x51,0x50,0x00,0x51,0x52,0x51,0x00,0x52,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,\n\t0x56,0x56,0x55,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5b,0x5b,0x59,0x00,0x5c,0x5c,0x5a,0x00,0x5d,0x5d,0x5b,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x60,0x5e,0x00,\n\t0x60,0x61,0x5f,0x00,0x62,0x62,0x60,0x00,0x63,0x63,0x61,0x00,0x64,0x65,0x62,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x68,0x68,0x66,0x00,0x69,0x6a,0x67,0x00,\n\t0x6a,0x6b,0x68,0x00,0x6b,0x6c,0x69,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x71,0x71,0x6f,0x00,0x72,0x73,0x70,0x00,\n\t0x73,0x74,0x71,0x00,0x74,0x75,0x72,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,\n\t0x7c,0x7c,0x7a,0x00,0x7d,0x7d,0x7b,0x00,0x7e,0x7f,0x7c,0x00,0x7f,0x80,0x7d,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,\n\t0x84,0x85,0x83,0x00,0x86,0x86,0x84,0x00,0x87,0x88,0x85,0x00,0x88,0x89,0x86,0x00,0x89,0x8a,0x87,0x00,0x8a,0x8b,0x88,0x00,0x8b,0x8c,0x89,0x00,0x8c,0x8d,0x8a,0x00,\n\t0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x90,0x00,0x93,0x94,0x91,0x00,0x94,0x95,0x92,0x00,0x96,0x96,0x93,0x00,\n\t0x97,0x97,0x94,0x00,0x98,0x98,0x96,0x00,0x99,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9d,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9c,0x00,\n\t0xa1,0xa0,0x9d,0x00,0xa2,0xa1,0x9e,0x00,0xa3,0xa3,0xa0,0x00,0xa4,0xa4,0xa1,0x00,0xa5,0xa5,0xa2,0x00,0xa6,0xa6,0xa3,0x00,0xa7,0xa7,0xa4,0x00,0xa8,0xa8,0xa5,0x00,\n\t0xaa,0xa9,0xa6,0x00,0xab,0xaa,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,0xb0,0xb0,0xad,0x00,0xb1,0xb1,0xae,0x00,\n\t0xb3,0xb2,0xb0,0x00,0xb4,0xb3,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,\n\t0xbc,0xbb,0xb9,0x00,0xbd,0xbc,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,\n\t0xc5,0xc4,0xc2,0x00,0xc6,0xc5,0xc3,0x00,0xc7,0xc6,0xc4,0x00,0xc8,0xc7,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,\n\t0xce,0xcd,0xca,0x00,0xcf,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd1,0xd0,0xce,0x00,0xd2,0xd1,0xcf,0x00,0xd3,0xd2,0xd0,0x00,0xd4,0xd3,0xd1,0x00,0xd5,0xd4,0xd2,0x00,\n\t0xd7,0xd5,0xd3,0x00,0xd8,0xd6,0xd4,0x00,0xd9,0xd8,0xd5,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xda,0xd8,0x00,0xdc,0xdb,0xd9,0x00,0xdd,0xdc,0xda,0x00,0xde,0xdd,0xdb,0x00,\n\t0xe0,0xde,0xdc,0x00,0xe1,0xdf,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,\n\t0xe9,0xe7,0xe4,0x00,0xea,0xe8,0xe5,0x00,0xeb,0xe9,0xe6,0x00,0xec,0xea,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,\n\t0xf2,0xf0,0xed,0x00,0xf3,0xf1,0xee,0x00,0xf4,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf3,0x00,0xf9,0xf6,0xf4,0x00,0xfa,0xf7,0xf5,0x00,\n\t0xfb,0xf9,0xf6,0x00,0xfb,0xf9,0xf6,0x00,0xfb,0xf9,0xf7,0x00,0xfc,0xfa,0xf8,0x00,0xfc,0xfa,0xf8,0x00,0xfc,0xfb,0xf9,0x00,0xfc,0xfb,0xf9,0x00,0xfd,0xfb,0xfa,0x00,\n\t0xfd,0xfc,0xfa,0x00,0xfd,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x13,0x13,0x14,0x00,0x14,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x16,0x00,\n\t0x18,0x17,0x17,0x00,0x19,0x18,0x18,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x23,0x22,0x00,0x23,0x24,0x23,0x00,0x24,0x25,0x24,0x00,0x25,0x26,0x25,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,\n\t0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x3a,0x3a,0x39,0x00,0x3b,0x3b,0x3a,0x00,\n\t0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x42,0x00,\n\t0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,\n\t0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x50,0x4f,0x00,0x50,0x51,0x50,0x00,0x51,0x52,0x51,0x00,0x52,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,\n\t0x56,0x56,0x55,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5b,0x59,0x00,0x5c,0x5c,0x5a,0x00,0x5d,0x5d,0x5b,0x00,0x5e,0x5e,0x5c,0x00,0x5f,0x60,0x5e,0x00,\n\t0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x63,0x63,0x61,0x00,0x64,0x65,0x62,0x00,0x65,0x66,0x63,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x69,0x6a,0x67,0x00,\n\t0x6a,0x6b,0x68,0x00,0x6b,0x6c,0x69,0x00,0x6c,0x6d,0x6a,0x00,0x6d,0x6e,0x6b,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,\n\t0x73,0x73,0x71,0x00,0x74,0x74,0x72,0x00,0x75,0x76,0x73,0x00,0x76,0x77,0x74,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,\n\t0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7f,0x7f,0x7d,0x00,0x80,0x81,0x7e,0x00,0x81,0x82,0x7f,0x00,0x82,0x83,0x80,0x00,0x83,0x84,0x82,0x00,\n\t0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x89,0x8a,0x87,0x00,0x8a,0x8b,0x88,0x00,0x8b,0x8c,0x89,0x00,0x8c,0x8d,0x8a,0x00,\n\t0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x91,0x91,0x8f,0x00,0x92,0x93,0x90,0x00,0x93,0x94,0x91,0x00,0x94,0x95,0x92,0x00,0x95,0x96,0x93,0x00,\n\t0x97,0x97,0x94,0x00,0x98,0x98,0x95,0x00,0x99,0x99,0x96,0x00,0x9a,0x9a,0x97,0x00,0x9b,0x9c,0x99,0x00,0x9d,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9c,0x00,\n\t0xa0,0xa0,0x9d,0x00,0xa1,0xa1,0x9e,0x00,0xa3,0xa2,0x9f,0x00,0xa4,0xa3,0xa0,0x00,0xa5,0xa5,0xa2,0x00,0xa6,0xa6,0xa3,0x00,0xa7,0xa7,0xa4,0x00,0xa8,0xa8,0xa5,0x00,\n\t0xa9,0xa9,0xa6,0x00,0xaa,0xaa,0xa7,0x00,0xac,0xab,0xa8,0x00,0xad,0xac,0xaa,0x00,0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,0xb0,0xb0,0xad,0x00,0xb1,0xb1,0xae,0x00,\n\t0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb5,0xb4,0xb2,0x00,0xb6,0xb5,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,\n\t0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbe,0xbd,0xbb,0x00,0xbf,0xbe,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,\n\t0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc7,0xc6,0xc3,0x00,0xc8,0xc7,0xc5,0x00,0xc9,0xc8,0xc6,0x00,0xca,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,\n\t0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xd0,0xcf,0xcc,0x00,0xd1,0xd0,0xcd,0x00,0xd2,0xd1,0xcf,0x00,0xd3,0xd2,0xd0,0x00,0xd4,0xd3,0xd1,0x00,0xd5,0xd4,0xd2,0x00,\n\t0xd6,0xd5,0xd3,0x00,0xd7,0xd6,0xd4,0x00,0xd9,0xd7,0xd5,0x00,0xda,0xd8,0xd6,0x00,0xdb,0xda,0xd7,0x00,0xdc,0xdb,0xd8,0x00,0xdd,0xdc,0xd9,0x00,0xde,0xdd,0xda,0x00,\n\t0xdf,0xde,0xdc,0x00,0xe0,0xdf,0xdd,0x00,0xe2,0xe0,0xde,0x00,0xe3,0xe1,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,\n\t0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xeb,0xe9,0xe6,0x00,0xec,0xea,0xe7,0x00,0xed,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,0xef,0xed,0xeb,0x00,0xf0,0xef,0xec,0x00,\n\t0xf1,0xf0,0xed,0x00,0xf3,0xf1,0xee,0x00,0xf4,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf2,0x00,0xf8,0xf6,0xf3,0x00,0xf9,0xf7,0xf4,0x00,\n\t0xfb,0xf8,0xf6,0x00,0xfb,0xf9,0xf6,0x00,0xfb,0xf9,0xf7,0x00,0xfb,0xfa,0xf7,0x00,0xfc,0xfa,0xf8,0x00,0xfc,0xfa,0xf8,0x00,0xfc,0xfb,0xf9,0x00,0xfc,0xfb,0xfa,0x00,\n\t0xfd,0xfc,0xfa,0x00,0xfd,0xfc,0xfb,0x00,0xfd,0xfc,0xfb,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x13,0x13,0x13,0x00,0x13,0x13,0x14,0x00,0x14,0x14,0x15,0x00,0x15,0x15,0x15,0x00,0x17,0x16,0x16,0x00,\n\t0x18,0x17,0x17,0x00,0x19,0x18,0x18,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x24,0x23,0x00,0x24,0x25,0x24,0x00,0x25,0x26,0x25,0x00,0x26,0x27,0x26,0x00,0x28,0x28,0x28,0x00,\n\t0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3b,0x3b,0x3a,0x00,\n\t0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,\n\t0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,\n\t0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x51,0x50,0x00,0x51,0x52,0x51,0x00,0x52,0x53,0x52,0x00,0x53,0x54,0x53,0x00,0x55,0x55,0x54,0x00,\n\t0x56,0x56,0x55,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5c,0x5a,0x00,0x5d,0x5d,0x5b,0x00,0x5e,0x5e,0x5c,0x00,0x5f,0x5f,0x5d,0x00,\n\t0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x64,0x64,0x62,0x00,0x65,0x66,0x63,0x00,0x66,0x67,0x64,0x00,0x67,0x68,0x65,0x00,0x68,0x69,0x67,0x00,\n\t0x6a,0x6b,0x68,0x00,0x6b,0x6c,0x69,0x00,0x6c,0x6d,0x6a,0x00,0x6d,0x6e,0x6b,0x00,0x6e,0x6f,0x6c,0x00,0x6f,0x70,0x6d,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,\n\t0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x76,0x76,0x74,0x00,0x77,0x77,0x75,0x00,0x78,0x79,0x76,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,\n\t0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x83,0x80,0x00,0x83,0x84,0x81,0x00,\n\t0x84,0x85,0x82,0x00,0x85,0x86,0x83,0x00,0x86,0x87,0x84,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8b,0x8c,0x89,0x00,0x8c,0x8d,0x8a,0x00,\n\t0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x92,0x92,0x8f,0x00,0x93,0x93,0x91,0x00,0x94,0x95,0x92,0x00,0x95,0x96,0x93,0x00,\n\t0x96,0x97,0x94,0x00,0x98,0x98,0x95,0x00,0x99,0x99,0x96,0x00,0x9a,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9c,0x00,\n\t0xa0,0xa0,0x9d,0x00,0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0x9f,0x00,0xa3,0xa3,0xa0,0x00,0xa4,0xa4,0xa1,0x00,0xa6,0xa5,0xa2,0x00,0xa7,0xa7,0xa4,0x00,0xa8,0xa8,0xa5,0x00,\n\t0xa9,0xa9,0xa6,0x00,0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xaf,0xae,0xac,0x00,0xb0,0xb0,0xad,0x00,0xb1,0xb1,0xae,0x00,\n\t0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb8,0xb7,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,\n\t0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc1,0xc0,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,\n\t0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xca,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,\n\t0xcd,0xcc,0xca,0x00,0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd3,0xd2,0xcf,0x00,0xd4,0xd3,0xd1,0x00,0xd5,0xd4,0xd2,0x00,\n\t0xd6,0xd5,0xd3,0x00,0xd7,0xd6,0xd4,0x00,0xd8,0xd7,0xd5,0x00,0xd9,0xd8,0xd6,0x00,0xda,0xd9,0xd7,0x00,0xdc,0xda,0xd8,0x00,0xdd,0xdc,0xd9,0x00,0xde,0xdd,0xda,0x00,\n\t0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xe0,0x00,0xe5,0xe3,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,\n\t0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,\n\t0xf1,0xef,0xec,0x00,0xf2,0xf0,0xee,0x00,0xf3,0xf1,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf2,0x00,0xf8,0xf6,0xf3,0x00,0xf9,0xf7,0xf4,0x00,\n\t0xfa,0xf8,0xf5,0x00,0xfa,0xf8,0xf6,0x00,0xfb,0xf9,0xf6,0x00,0xfb,0xf9,0xf7,0x00,0xfb,0xfa,0xf8,0x00,0xfc,0xfa,0xf8,0x00,0xfc,0xfb,0xf9,0x00,0xfc,0xfb,0xf9,0x00,\n\t0xfd,0xfb,0xfa,0x00,0xfd,0xfc,0xfb,0x00,0xfd,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x14,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x18,0x17,0x17,0x00,0x19,0x18,0x18,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x25,0x24,0x00,0x25,0x26,0x25,0x00,0x26,0x27,0x26,0x00,0x27,0x28,0x27,0x00,\n\t0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,\n\t0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,\n\t0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x52,0x51,0x00,0x52,0x53,0x52,0x00,0x53,0x54,0x53,0x00,0x54,0x55,0x54,0x00,\n\t0x56,0x56,0x55,0x00,0x58,0x58,0x56,0x00,0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5d,0x5b,0x00,0x5e,0x5e,0x5c,0x00,0x5f,0x5f,0x5d,0x00,\n\t0x60,0x60,0x5e,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x65,0x65,0x63,0x00,0x66,0x67,0x64,0x00,0x67,0x68,0x65,0x00,0x68,0x69,0x66,0x00,\n\t0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6c,0x6d,0x6a,0x00,0x6d,0x6e,0x6b,0x00,0x6e,0x6f,0x6c,0x00,0x6f,0x70,0x6d,0x00,0x70,0x71,0x6e,0x00,0x71,0x72,0x6f,0x00,\n\t0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x7a,0x7a,0x78,0x00,\n\t0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,\n\t0x84,0x85,0x82,0x00,0x85,0x86,0x83,0x00,0x86,0x87,0x84,0x00,0x87,0x88,0x85,0x00,0x88,0x89,0x86,0x00,0x89,0x8a,0x87,0x00,0x8a,0x8b,0x88,0x00,0x8b,0x8c,0x8a,0x00,\n\t0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x90,0x00,0x94,0x94,0x91,0x00,0x95,0x95,0x92,0x00,\n\t0x96,0x97,0x94,0x00,0x97,0x98,0x95,0x00,0x98,0x99,0x96,0x00,0x9a,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9d,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,\n\t0xa0,0xa0,0x9d,0x00,0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0x9f,0x00,0xa3,0xa3,0xa0,0x00,0xa4,0xa4,0xa1,0x00,0xa5,0xa5,0xa2,0x00,0xa6,0xa6,0xa3,0x00,0xa8,0xa7,0xa4,0x00,\n\t0xa9,0xa9,0xa6,0x00,0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,0xb1,0xb0,0xad,0x00,\n\t0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xba,0xb9,0xb7,0x00,\n\t0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc3,0xc2,0xc0,0x00,\n\t0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcc,0xcb,0xc8,0x00,\n\t0xcd,0xcc,0xca,0x00,0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd1,0xd0,0xce,0x00,0xd2,0xd1,0xcf,0x00,0xd3,0xd2,0xd0,0x00,0xd5,0xd3,0xd1,0x00,\n\t0xd6,0xd5,0xd3,0x00,0xd7,0xd6,0xd4,0x00,0xd8,0xd7,0xd5,0x00,0xd9,0xd8,0xd6,0x00,0xda,0xd9,0xd7,0x00,0xdb,0xda,0xd8,0x00,0xdc,0xdb,0xd9,0x00,0xde,0xdc,0xda,0x00,\n\t0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe7,0xe5,0xe2,0x00,\n\t0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,\n\t0xf1,0xef,0xec,0x00,0xf2,0xf0,0xed,0x00,0xf3,0xf1,0xee,0x00,0xf4,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf2,0x00,0xf7,0xf5,0xf3,0x00,0xf9,0xf7,0xf4,0x00,\n\t0xfa,0xf8,0xf5,0x00,0xfa,0xf8,0xf5,0x00,0xfa,0xf9,0xf6,0x00,0xfb,0xf9,0xf7,0x00,0xfb,0xf9,0xf7,0x00,0xfb,0xfa,0xf8,0x00,0xfc,0xfa,0xf9,0x00,0xfc,0xfb,0xf9,0x00,\n\t0xfc,0xfb,0xfa,0x00,0xfd,0xfc,0xfb,0x00,0xfd,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x1a,0x1a,0x00,0x1a,0x1b,0x1b,0x00,0x1b,0x1c,0x1c,0x00,0x1c,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x27,0x26,0x00,0x27,0x28,0x27,0x00,\n\t0x28,0x29,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x35,0x00,0x37,0x36,0x36,0x00,0x38,0x38,0x37,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,\n\t0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,\n\t0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x54,0x52,0x00,0x54,0x55,0x53,0x00,\n\t0x55,0x56,0x54,0x00,0x57,0x57,0x56,0x00,0x59,0x59,0x57,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5e,0x5c,0x00,0x5f,0x5f,0x5d,0x00,\n\t0x60,0x60,0x5e,0x00,0x61,0x61,0x5f,0x00,0x62,0x63,0x60,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x66,0x66,0x64,0x00,0x67,0x68,0x65,0x00,0x68,0x69,0x66,0x00,\n\t0x69,0x6a,0x67,0x00,0x6a,0x6b,0x68,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6f,0x70,0x6d,0x00,0x70,0x71,0x6e,0x00,0x71,0x72,0x6f,0x00,\n\t0x72,0x73,0x70,0x00,0x73,0x74,0x71,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,\n\t0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7d,0x7e,0x7b,0x00,0x7e,0x7f,0x7c,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,\n\t0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x86,0x87,0x84,0x00,0x87,0x88,0x85,0x00,0x88,0x89,0x86,0x00,0x89,0x8a,0x87,0x00,0x8a,0x8b,0x88,0x00,0x8b,0x8c,0x89,0x00,\n\t0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8b,0x00,0x8f,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x90,0x00,0x93,0x94,0x91,0x00,0x95,0x95,0x92,0x00,\n\t0x96,0x96,0x93,0x00,0x97,0x97,0x94,0x00,0x98,0x99,0x96,0x00,0x99,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9d,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,\n\t0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9d,0x00,0xa2,0xa2,0x9f,0x00,0xa3,0xa3,0xa0,0x00,0xa4,0xa4,0xa1,0x00,0xa5,0xa5,0xa2,0x00,0xa6,0xa6,0xa3,0x00,0xa7,0xa7,0xa4,0x00,\n\t0xa8,0xa8,0xa5,0x00,0xa9,0xa9,0xa6,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,0xb0,0xb0,0xad,0x00,\n\t0xb1,0xb1,0xae,0x00,0xb2,0xb2,0xaf,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,\n\t0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,\n\t0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc6,0xc5,0xc3,0x00,0xc7,0xc6,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,\n\t0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xcf,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd1,0xd0,0xce,0x00,0xd2,0xd1,0xcf,0x00,0xd3,0xd2,0xd0,0x00,0xd4,0xd3,0xd1,0x00,\n\t0xd5,0xd4,0xd2,0x00,0xd6,0xd5,0xd3,0x00,0xd8,0xd7,0xd4,0x00,0xd9,0xd8,0xd5,0x00,0xda,0xd9,0xd7,0x00,0xdb,0xda,0xd8,0x00,0xdc,0xdb,0xd9,0x00,0xdd,0xdc,0xda,0x00,\n\t0xde,0xdd,0xdb,0x00,0xdf,0xde,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,\n\t0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,0xea,0xe8,0xe5,0x00,0xeb,0xe9,0xe6,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,\n\t0xf0,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,0xf3,0xf1,0xee,0x00,0xf4,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf2,0x00,0xf8,0xf6,0xf3,0x00,\n\t0xf9,0xf7,0xf4,0x00,0xfa,0xf8,0xf5,0x00,0xfa,0xf8,0xf6,0x00,0xfa,0xf9,0xf6,0x00,0xfb,0xf9,0xf7,0x00,0xfb,0xfa,0xf8,0x00,0xfb,0xfa,0xf8,0x00,0xfc,0xfb,0xf9,0x00,\n\t0xfc,0xfb,0xfa,0x00,0xfd,0xfc,0xfa,0x00,0xfd,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x1a,0x1a,0x00,0x1a,0x1b,0x1b,0x00,0x1b,0x1c,0x1c,0x00,0x1c,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x27,0x26,0x00,0x27,0x28,0x27,0x00,\n\t0x28,0x29,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x35,0x00,0x37,0x36,0x36,0x00,0x38,0x37,0x37,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,\n\t0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,\n\t0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x54,0x52,0x00,0x54,0x55,0x53,0x00,\n\t0x55,0x56,0x54,0x00,0x57,0x57,0x56,0x00,0x58,0x59,0x57,0x00,0x5a,0x5a,0x58,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,\n\t0x60,0x60,0x5e,0x00,0x61,0x61,0x5f,0x00,0x62,0x63,0x60,0x00,0x63,0x64,0x61,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x67,0x68,0x65,0x00,0x68,0x69,0x66,0x00,\n\t0x69,0x6a,0x67,0x00,0x6a,0x6b,0x68,0x00,0x6b,0x6c,0x69,0x00,0x6c,0x6d,0x6a,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,\n\t0x72,0x73,0x70,0x00,0x73,0x74,0x71,0x00,0x74,0x75,0x72,0x00,0x75,0x76,0x73,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,\n\t0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7f,0x80,0x7d,0x00,0x80,0x81,0x7e,0x00,0x81,0x82,0x7f,0x00,0x82,0x83,0x80,0x00,\n\t0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x88,0x89,0x86,0x00,0x89,0x8a,0x87,0x00,0x8a,0x8b,0x88,0x00,0x8b,0x8c,0x89,0x00,\n\t0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x90,0x90,0x8d,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x90,0x00,0x93,0x94,0x91,0x00,0x94,0x95,0x92,0x00,\n\t0x96,0x96,0x93,0x00,0x97,0x97,0x94,0x00,0x98,0x98,0x95,0x00,0x99,0x99,0x96,0x00,0x9a,0x9b,0x98,0x00,0x9b,0x9c,0x99,0x00,0x9d,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,\n\t0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9d,0x00,0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0x9f,0x00,0xa4,0xa4,0xa1,0x00,0xa5,0xa5,0xa2,0x00,0xa6,0xa6,0xa3,0x00,0xa7,0xa7,0xa4,0x00,\n\t0xa8,0xa8,0xa5,0x00,0xa9,0xa9,0xa6,0x00,0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa8,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,0xb0,0xb0,0xad,0x00,\n\t0xb1,0xb1,0xae,0x00,0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,\n\t0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,\n\t0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc8,0xc7,0xc5,0x00,0xc9,0xc8,0xc6,0x00,0xca,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,\n\t0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd1,0xd0,0xce,0x00,0xd2,0xd1,0xcf,0x00,0xd3,0xd2,0xd0,0x00,0xd4,0xd3,0xd1,0x00,\n\t0xd5,0xd4,0xd2,0x00,0xd6,0xd5,0xd3,0x00,0xd7,0xd6,0xd4,0x00,0xd8,0xd7,0xd5,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xda,0xd7,0x00,0xdc,0xdb,0xd8,0x00,0xdd,0xdc,0xd9,0x00,\n\t0xde,0xdd,0xdb,0x00,0xdf,0xde,0xdc,0x00,0xe0,0xdf,0xdd,0x00,0xe1,0xe0,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,\n\t0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xec,0xea,0xe7,0x00,0xed,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,\n\t0xf0,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf2,0x00,0xf8,0xf6,0xf3,0x00,\n\t0xf9,0xf7,0xf4,0x00,0xf9,0xf8,0xf5,0x00,0xfa,0xf8,0xf5,0x00,0xfa,0xf9,0xf6,0x00,0xfb,0xf9,0xf7,0x00,0xfb,0xfa,0xf7,0x00,0xfb,0xfa,0xf8,0x00,0xfc,0xfb,0xf9,0x00,\n\t0xfc,0xfb,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1b,0x1b,0x00,0x1b,0x1c,0x1c,0x00,0x1c,0x1d,0x1d,0x00,0x1d,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x28,0x27,0x00,\n\t0x28,0x29,0x28,0x00,0x29,0x2a,0x29,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x36,0x35,0x35,0x00,0x37,0x36,0x36,0x00,0x38,0x37,0x37,0x00,0x39,0x39,0x38,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,\n\t0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4c,0x4c,0x4b,0x00,\n\t0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x55,0x53,0x00,\n\t0x55,0x56,0x54,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x5a,0x58,0x00,0x5b,0x5b,0x59,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5f,0x5d,0x00,\n\t0x5f,0x60,0x5e,0x00,0x61,0x61,0x5f,0x00,0x62,0x62,0x60,0x00,0x63,0x64,0x61,0x00,0x64,0x65,0x62,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x68,0x69,0x66,0x00,\n\t0x69,0x6a,0x67,0x00,0x6a,0x6b,0x68,0x00,0x6b,0x6c,0x69,0x00,0x6c,0x6d,0x6a,0x00,0x6d,0x6e,0x6b,0x00,0x6e,0x6f,0x6c,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,\n\t0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x75,0x76,0x73,0x00,0x76,0x77,0x74,0x00,0x77,0x78,0x75,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,\n\t0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x81,0x82,0x7f,0x00,0x82,0x83,0x80,0x00,\n\t0x83,0x84,0x81,0x00,0x84,0x85,0x82,0x00,0x85,0x86,0x83,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x8a,0x8b,0x88,0x00,0x8b,0x8c,0x89,0x00,\n\t0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x91,0x91,0x8e,0x00,0x92,0x92,0x8f,0x00,0x93,0x94,0x91,0x00,0x94,0x95,0x92,0x00,\n\t0x95,0x96,0x93,0x00,0x96,0x97,0x94,0x00,0x98,0x98,0x95,0x00,0x99,0x99,0x96,0x00,0x9a,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9c,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,\n\t0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9d,0x00,0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0x9f,0x00,0xa3,0xa3,0xa0,0x00,0xa4,0xa4,0xa1,0x00,0xa6,0xa6,0xa3,0x00,0xa7,0xa7,0xa4,0x00,\n\t0xa8,0xa8,0xa5,0x00,0xa9,0xa9,0xa6,0x00,0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xaf,0xaf,0xac,0x00,0xb0,0xb0,0xad,0x00,\n\t0xb1,0xb1,0xae,0x00,0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,\n\t0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,\n\t0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xca,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,\n\t0xcc,0xcb,0xc9,0x00,0xcd,0xcc,0xca,0x00,0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd3,0xd2,0xd0,0x00,0xd4,0xd3,0xd1,0x00,\n\t0xd5,0xd4,0xd2,0x00,0xd6,0xd5,0xd3,0x00,0xd7,0xd6,0xd4,0x00,0xd8,0xd7,0xd5,0x00,0xd9,0xd8,0xd6,0x00,0xda,0xd9,0xd7,0x00,0xdc,0xdb,0xd8,0x00,0xdd,0xdc,0xd9,0x00,\n\t0xde,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xdf,0x00,0xe3,0xe2,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,\n\t0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,\n\t0xf0,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,0xf2,0xf0,0xed,0x00,0xf3,0xf2,0xee,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf4,0xf1,0x00,0xf6,0xf5,0xf2,0x00,0xf8,0xf6,0xf3,0x00,\n\t0xf9,0xf7,0xf4,0x00,0xf9,0xf7,0xf5,0x00,0xf9,0xf8,0xf5,0x00,0xfa,0xf8,0xf6,0x00,0xfa,0xf9,0xf7,0x00,0xfb,0xf9,0xf7,0x00,0xfb,0xfa,0xf8,0x00,0xfb,0xfa,0xf9,0x00,\n\t0xfc,0xfb,0xf9,0x00,0xfc,0xfb,0xfa,0x00,0xfd,0xfc,0xfb,0x00,0xfd,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1c,0x1c,0x00,0x1c,0x1d,0x1d,0x00,0x1d,0x1e,0x1e,0x00,0x1e,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,\n\t0x28,0x29,0x28,0x00,0x29,0x2a,0x29,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,\n\t0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x37,0x36,0x36,0x00,0x38,0x37,0x37,0x00,0x39,0x39,0x38,0x00,0x3a,0x3a,0x39,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,\n\t0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,\n\t0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,\n\t0x55,0x56,0x54,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5b,0x59,0x00,0x5c,0x5c,0x5a,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,\n\t0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x62,0x62,0x60,0x00,0x63,0x63,0x61,0x00,0x64,0x65,0x62,0x00,0x65,0x66,0x63,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,\n\t0x69,0x6a,0x67,0x00,0x6a,0x6b,0x68,0x00,0x6b,0x6c,0x69,0x00,0x6c,0x6d,0x6a,0x00,0x6d,0x6e,0x6b,0x00,0x6e,0x6f,0x6c,0x00,0x6f,0x70,0x6d,0x00,0x70,0x71,0x6f,0x00,\n\t0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x78,0x79,0x76,0x00,0x79,0x7a,0x78,0x00,\n\t0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x82,0x83,0x80,0x00,\n\t0x83,0x84,0x81,0x00,0x84,0x85,0x82,0x00,0x85,0x86,0x83,0x00,0x86,0x87,0x84,0x00,0x87,0x88,0x85,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8b,0x8c,0x89,0x00,\n\t0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x92,0x92,0x8f,0x00,0x93,0x93,0x90,0x00,0x94,0x94,0x92,0x00,\n\t0x95,0x96,0x93,0x00,0x96,0x97,0x94,0x00,0x97,0x98,0x95,0x00,0x99,0x99,0x96,0x00,0x9a,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9d,0x9d,0x9b,0x00,\n\t0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9d,0x00,0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0x9f,0x00,0xa3,0xa3,0xa0,0x00,0xa4,0xa4,0xa1,0x00,0xa5,0xa5,0xa2,0x00,0xa6,0xa6,0xa4,0x00,\n\t0xa8,0xa8,0xa5,0x00,0xa9,0xa9,0xa6,0x00,0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,0xaf,0xaf,0xad,0x00,\n\t0xb1,0xb1,0xae,0x00,0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb6,0x00,\n\t0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbf,0x00,\n\t0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,\n\t0xcc,0xcb,0xc9,0x00,0xcd,0xcc,0xca,0x00,0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd1,0xd0,0xce,0x00,0xd2,0xd1,0xcf,0x00,0xd3,0xd3,0xd0,0x00,\n\t0xd5,0xd4,0xd2,0x00,0xd6,0xd5,0xd3,0x00,0xd7,0xd6,0xd4,0x00,0xd8,0xd7,0xd5,0x00,0xd9,0xd8,0xd6,0x00,0xda,0xd9,0xd7,0x00,0xdb,0xda,0xd8,0x00,0xdc,0xdc,0xd9,0x00,\n\t0xde,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe5,0xe1,0x00,\n\t0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,\n\t0xef,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,0xf2,0xf0,0xed,0x00,0xf3,0xf1,0xee,0x00,0xf4,0xf2,0xef,0x00,0xf5,0xf4,0xf0,0x00,0xf6,0xf5,0xf1,0x00,0xf7,0xf6,0xf3,0x00,\n\t0xf8,0xf7,0xf4,0x00,0xf9,0xf7,0xf4,0x00,0xf9,0xf8,0xf5,0x00,0xfa,0xf8,0xf6,0x00,0xfa,0xf9,0xf6,0x00,0xfa,0xf9,0xf7,0x00,0xfb,0xfa,0xf8,0x00,0xfb,0xfa,0xf9,0x00,\n\t0xfc,0xfb,0xf9,0x00,0xfc,0xfb,0xfa,0x00,0xfd,0xfc,0xfb,0x00,0xfd,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1e,0x1e,0x00,0x1e,0x1f,0x1f,0x00,\n\t0x1f,0x20,0x20,0x00,0x20,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,\n\t0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x30,0x30,0x2f,0x00,0x31,0x31,0x30,0x00,\n\t0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x39,0x38,0x00,0x3a,0x3a,0x39,0x00,\n\t0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,\n\t0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,\n\t0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4f,0x4e,0x00,0x4f,0x50,0x4f,0x00,0x50,0x51,0x50,0x00,0x51,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,\n\t0x55,0x55,0x54,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5b,0x59,0x00,0x5b,0x5c,0x5a,0x00,0x5d,0x5d,0x5b,0x00,0x5e,0x5e,0x5d,0x00,\n\t0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x63,0x63,0x61,0x00,0x64,0x64,0x62,0x00,0x65,0x66,0x63,0x00,0x66,0x67,0x64,0x00,0x67,0x68,0x66,0x00,\n\t0x68,0x69,0x67,0x00,0x6a,0x6b,0x68,0x00,0x6b,0x6c,0x69,0x00,0x6c,0x6d,0x6a,0x00,0x6d,0x6e,0x6b,0x00,0x6e,0x6f,0x6c,0x00,0x6f,0x70,0x6d,0x00,0x70,0x71,0x6e,0x00,\n\t0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,\n\t0x79,0x7a,0x78,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,\n\t0x82,0x83,0x81,0x00,0x84,0x85,0x82,0x00,0x85,0x86,0x83,0x00,0x86,0x87,0x84,0x00,0x87,0x88,0x85,0x00,0x88,0x89,0x86,0x00,0x89,0x8a,0x87,0x00,0x8a,0x8b,0x89,0x00,\n\t0x8b,0x8c,0x8a,0x00,0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x90,0x00,0x94,0x94,0x91,0x00,\n\t0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x98,0x95,0x00,0x98,0x99,0x96,0x00,0x9a,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9d,0x9d,0x9a,0x00,\n\t0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9d,0x00,0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0x9f,0x00,0xa3,0xa3,0xa0,0x00,0xa4,0xa4,0xa1,0x00,0xa5,0xa5,0xa2,0x00,0xa6,0xa6,0xa3,0x00,\n\t0xa7,0xa7,0xa4,0x00,0xa8,0xa8,0xa6,0x00,0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,\n\t0xb0,0xb0,0xad,0x00,0xb1,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,\n\t0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,\n\t0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc1,0x00,0xc5,0xc4,0xc2,0x00,0xc6,0xc5,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,\n\t0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd1,0xd0,0xce,0x00,0xd2,0xd1,0xcf,0x00,0xd3,0xd2,0xd0,0x00,\n\t0xd4,0xd3,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd7,0xd6,0xd3,0x00,0xd8,0xd7,0xd4,0x00,0xd9,0xd8,0xd6,0x00,0xda,0xd9,0xd7,0x00,0xdb,0xda,0xd8,0x00,0xdc,0xdb,0xd9,0x00,\n\t0xdd,0xdc,0xda,0x00,0xde,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,\n\t0xe6,0xe5,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xea,0xe9,0xe5,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,\n\t0xef,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,0xf4,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf6,0xf2,0x00,\n\t0xf8,0xf7,0xf3,0x00,0xf8,0xf7,0xf4,0x00,0xf9,0xf8,0xf5,0x00,0xf9,0xf8,0xf6,0x00,0xfa,0xf9,0xf6,0x00,0xfa,0xf9,0xf7,0x00,0xfb,0xfa,0xf8,0x00,0xfb,0xfa,0xf8,0x00,\n\t0xfc,0xfb,0xf9,0x00,0xfc,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1e,0x1e,0x00,0x1e,0x1f,0x1f,0x00,\n\t0x1f,0x20,0x20,0x00,0x20,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,\n\t0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x30,0x30,0x2f,0x00,0x31,0x31,0x30,0x00,\n\t0x32,0x32,0x31,0x00,0x33,0x33,0x32,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x39,0x38,0x00,0x3a,0x3a,0x39,0x00,\n\t0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,\n\t0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,\n\t0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4f,0x4e,0x00,0x4f,0x50,0x4f,0x00,0x50,0x51,0x50,0x00,0x51,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,\n\t0x55,0x55,0x54,0x00,0x56,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5c,0x5a,0x00,0x5c,0x5d,0x5b,0x00,0x5e,0x5e,0x5c,0x00,\n\t0x5f,0x5f,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x64,0x64,0x62,0x00,0x65,0x66,0x63,0x00,0x66,0x67,0x64,0x00,0x67,0x68,0x65,0x00,\n\t0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6d,0x6e,0x6b,0x00,0x6e,0x6f,0x6c,0x00,0x6f,0x70,0x6d,0x00,0x70,0x71,0x6e,0x00,\n\t0x71,0x72,0x6f,0x00,0x72,0x73,0x70,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,\n\t0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7c,0x7d,0x7a,0x00,0x7d,0x7e,0x7b,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,\n\t0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x85,0x86,0x83,0x00,0x86,0x87,0x84,0x00,0x87,0x88,0x85,0x00,0x88,0x89,0x86,0x00,0x89,0x8a,0x87,0x00,0x8a,0x8b,0x88,0x00,\n\t0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x90,0x00,0x93,0x94,0x91,0x00,\n\t0x95,0x95,0x92,0x00,0x96,0x96,0x93,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x9a,0x97,0x00,0x9a,0x9b,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9d,0x9d,0x9a,0x00,\n\t0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa3,0xa3,0xa0,0x00,0xa4,0xa4,0xa1,0x00,0xa5,0xa5,0xa2,0x00,0xa6,0xa6,0xa3,0x00,\n\t0xa7,0xa7,0xa4,0x00,0xa8,0xa8,0xa5,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,\n\t0xb0,0xb0,0xad,0x00,0xb1,0xb1,0xae,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,\n\t0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,\n\t0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc3,0x00,0xc7,0xc6,0xc4,0x00,0xc8,0xc7,0xc5,0x00,0xc9,0xc8,0xc6,0x00,0xca,0xca,0xc7,0x00,\n\t0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xd0,0xcf,0xcd,0x00,0xd1,0xd0,0xce,0x00,0xd2,0xd1,0xcf,0x00,0xd3,0xd2,0xd0,0x00,\n\t0xd4,0xd3,0xd1,0x00,0xd5,0xd4,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd9,0xd8,0xd5,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xda,0xd7,0x00,0xdc,0xdb,0xd8,0x00,\n\t0xdd,0xdc,0xda,0x00,0xde,0xdd,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,\n\t0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xea,0xe6,0x00,0xec,0xeb,0xe7,0x00,0xed,0xec,0xe8,0x00,0xee,0xed,0xea,0x00,\n\t0xef,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf2,0x00,\n\t0xf8,0xf7,0xf3,0x00,0xf8,0xf7,0xf4,0x00,0xf9,0xf8,0xf5,0x00,0xf9,0xf8,0xf5,0x00,0xfa,0xf9,0xf6,0x00,0xfa,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfa,0xf8,0x00,\n\t0xfb,0xfb,0xf9,0x00,0xfc,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1f,0x1f,0x00,\n\t0x1f,0x20,0x20,0x00,0x20,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,\n\t0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x31,0x30,0x00,\n\t0x32,0x32,0x31,0x00,0x33,0x33,0x32,0x00,0x34,0x34,0x33,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x3a,0x3a,0x39,0x00,\n\t0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,\n\t0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,\n\t0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x50,0x4f,0x00,0x50,0x51,0x50,0x00,0x51,0x52,0x51,0x00,0x52,0x53,0x52,0x00,0x54,0x54,0x53,0x00,\n\t0x55,0x55,0x54,0x00,0x56,0x57,0x56,0x00,0x57,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5c,0x5a,0x00,0x5c,0x5d,0x5b,0x00,0x5d,0x5e,0x5c,0x00,\n\t0x5f,0x5f,0x5d,0x00,0x60,0x60,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x65,0x65,0x63,0x00,0x66,0x67,0x64,0x00,0x67,0x68,0x65,0x00,\n\t0x68,0x69,0x66,0x00,0x69,0x6a,0x67,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x70,0x71,0x6e,0x00,\n\t0x71,0x72,0x6f,0x00,0x72,0x73,0x70,0x00,0x73,0x74,0x71,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,\n\t0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7e,0x7f,0x7c,0x00,0x7f,0x80,0x7d,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,\n\t0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x87,0x88,0x85,0x00,0x88,0x89,0x86,0x00,0x89,0x8a,0x87,0x00,0x8a,0x8b,0x88,0x00,\n\t0x8b,0x8c,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x90,0x00,0x93,0x94,0x91,0x00,\n\t0x94,0x95,0x92,0x00,0x96,0x96,0x93,0x00,0x97,0x97,0x94,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9c,0x99,0x00,0x9d,0x9d,0x9a,0x00,\n\t0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9d,0x00,0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa5,0xa5,0xa2,0x00,0xa6,0xa6,0xa3,0x00,\n\t0xa7,0xa7,0xa4,0x00,0xa8,0xa8,0xa5,0x00,0xa9,0xa9,0xa6,0x00,0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa9,0x00,0xac,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,\n\t0xb0,0xb0,0xad,0x00,0xb1,0xb1,0xae,0x00,0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,\n\t0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,\n\t0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc5,0x00,0xc9,0xc8,0xc6,0x00,0xca,0xc9,0xc7,0x00,\n\t0xcb,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd2,0xd1,0xcf,0x00,0xd3,0xd2,0xd0,0x00,\n\t0xd4,0xd3,0xd1,0x00,0xd5,0xd4,0xd2,0x00,0xd6,0xd5,0xd3,0x00,0xd7,0xd6,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xdb,0xda,0xd7,0x00,0xdc,0xdb,0xd8,0x00,\n\t0xdd,0xdc,0xd9,0x00,0xde,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,\n\t0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,\n\t0xef,0xee,0xea,0x00,0xf0,0xef,0xeb,0x00,0xf1,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf4,0xf1,0x00,0xf6,0xf5,0xf2,0x00,\n\t0xf7,0xf6,0xf3,0x00,0xf8,0xf7,0xf4,0x00,0xf8,0xf7,0xf5,0x00,0xf9,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfa,0xf8,0x00,\n\t0xfb,0xfb,0xf9,0x00,0xfc,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,\n\t0x1f,0x20,0x20,0x00,0x20,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,\n\t0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2b,0x2b,0x00,0x2b,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,\n\t0x32,0x32,0x31,0x00,0x33,0x33,0x32,0x00,0x34,0x34,0x33,0x00,0x35,0x35,0x34,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,\n\t0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,\n\t0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,\n\t0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x51,0x50,0x00,0x51,0x52,0x51,0x00,0x52,0x53,0x52,0x00,0x53,0x54,0x53,0x00,\n\t0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x58,0x57,0x00,0x58,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5d,0x5b,0x00,0x5d,0x5e,0x5c,0x00,\n\t0x5e,0x5f,0x5d,0x00,0x60,0x60,0x5e,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x66,0x66,0x64,0x00,0x67,0x68,0x65,0x00,\n\t0x68,0x69,0x66,0x00,0x69,0x6a,0x67,0x00,0x6a,0x6b,0x68,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,\n\t0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x73,0x74,0x71,0x00,0x74,0x75,0x72,0x00,0x75,0x76,0x73,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,\n\t0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7f,0x80,0x7d,0x00,0x80,0x81,0x7e,0x00,0x81,0x82,0x7f,0x00,\n\t0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x88,0x89,0x86,0x00,0x89,0x8a,0x87,0x00,0x8a,0x8b,0x88,0x00,\n\t0x8b,0x8c,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x94,0x91,0x00,\n\t0x94,0x95,0x92,0x00,0x95,0x96,0x93,0x00,0x97,0x97,0x94,0x00,0x98,0x98,0x95,0x00,0x99,0x99,0x96,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,\n\t0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9d,0x00,0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0x9f,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa6,0xa3,0x00,\n\t0xa7,0xa7,0xa4,0x00,0xa8,0xa8,0xa5,0x00,0xa9,0xa9,0xa6,0x00,0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,\n\t0xb0,0xb0,0xad,0x00,0xb1,0xb1,0xae,0x00,0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb8,0xb5,0x00,\n\t0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,\n\t0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc7,0x00,\n\t0xcb,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,0xcd,0xcc,0xca,0x00,0xce,0xcd,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,\n\t0xd4,0xd3,0xd1,0x00,0xd5,0xd4,0xd2,0x00,0xd6,0xd5,0xd3,0x00,0xd7,0xd6,0xd4,0x00,0xd8,0xd7,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,\n\t0xdd,0xdc,0xd9,0x00,0xde,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,\n\t0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,\n\t0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf1,0xf0,0xec,0x00,0xf2,0xf1,0xed,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf4,0xf1,0x00,0xf6,0xf5,0xf2,0x00,\n\t0xf7,0xf6,0xf3,0x00,0xf8,0xf7,0xf4,0x00,0xf8,0xf7,0xf4,0x00,0xf9,0xf8,0xf5,0x00,0xf9,0xf8,0xf6,0x00,0xfa,0xf9,0xf7,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfa,0xf8,0x00,\n\t0xfb,0xfb,0xf9,0x00,0xfc,0xfb,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x22,0x21,0x21,0x00,0x23,0x22,0x22,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,\n\t0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2b,0x2b,0x00,0x2b,0x2c,0x2c,0x00,0x2c,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,\n\t0x32,0x31,0x31,0x00,0x33,0x32,0x32,0x00,0x34,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x37,0x37,0x36,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,\n\t0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,\n\t0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,\n\t0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x53,0x52,0x00,0x53,0x54,0x53,0x00,\n\t0x54,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x58,0x56,0x00,0x58,0x59,0x58,0x00,0x59,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5e,0x5c,0x00,\n\t0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x61,0x61,0x5f,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x67,0x67,0x65,0x00,\n\t0x68,0x69,0x66,0x00,0x69,0x6a,0x67,0x00,0x6a,0x6b,0x68,0x00,0x6b,0x6c,0x69,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,\n\t0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x76,0x77,0x74,0x00,0x77,0x78,0x75,0x00,0x78,0x79,0x77,0x00,\n\t0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x81,0x82,0x7f,0x00,\n\t0x82,0x83,0x80,0x00,0x83,0x84,0x81,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x8a,0x8b,0x88,0x00,\n\t0x8b,0x8c,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,\n\t0x94,0x94,0x92,0x00,0x95,0x96,0x93,0x00,0x96,0x97,0x94,0x00,0x97,0x98,0x95,0x00,0x99,0x99,0x96,0x00,0x9a,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9c,0x9c,0x9a,0x00,\n\t0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0xa0,0xa0,0x9d,0x00,0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0x9f,0x00,0xa3,0xa3,0xa0,0x00,0xa4,0xa4,0xa1,0x00,0xa5,0xa5,0xa3,0x00,\n\t0xa6,0xa6,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa9,0xa9,0xa6,0x00,0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xaf,0xac,0x00,\n\t0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb5,0x00,\n\t0xb8,0xb8,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbe,0x00,\n\t0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc4,0xc3,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,\n\t0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc9,0x00,0xcd,0xcc,0xca,0x00,0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,\n\t0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd6,0xd5,0xd2,0x00,0xd7,0xd6,0xd3,0x00,0xd8,0xd7,0xd5,0x00,0xd9,0xd8,0xd6,0x00,0xda,0xd9,0xd7,0x00,0xdb,0xdb,0xd8,0x00,\n\t0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe4,0xe0,0x00,\n\t0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,\n\t0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf4,0xf3,0xef,0x00,0xf5,0xf4,0xf1,0x00,0xf6,0xf5,0xf2,0x00,\n\t0xf7,0xf6,0xf3,0x00,0xf7,0xf7,0xf3,0x00,0xf8,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,\n\t0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x22,0x21,0x21,0x00,0x23,0x22,0x22,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,\n\t0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2b,0x2b,0x00,0x2b,0x2c,0x2c,0x00,0x2c,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,\n\t0x32,0x31,0x31,0x00,0x33,0x32,0x32,0x00,0x34,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,\n\t0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,\n\t0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,\n\t0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x53,0x52,0x00,0x53,0x54,0x53,0x00,\n\t0x54,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x59,0x57,0x00,0x59,0x5a,0x59,0x00,0x5a,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5e,0x5c,0x00,\n\t0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x62,0x62,0x60,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,\n\t0x68,0x69,0x66,0x00,0x69,0x6a,0x67,0x00,0x6a,0x6b,0x68,0x00,0x6b,0x6c,0x69,0x00,0x6c,0x6d,0x6a,0x00,0x6d,0x6e,0x6b,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,\n\t0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,\n\t0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,\n\t0x82,0x83,0x80,0x00,0x83,0x84,0x81,0x00,0x84,0x85,0x82,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,\n\t0x8b,0x8c,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x90,0x00,0x93,0x93,0x91,0x00,\n\t0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x98,0x95,0x00,0x98,0x99,0x96,0x00,0x9a,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9c,0x9c,0x99,0x00,\n\t0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa2,0xa2,0x9f,0x00,0xa3,0xa3,0xa0,0x00,0xa4,0xa4,0xa1,0x00,0xa5,0xa5,0xa2,0x00,\n\t0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,\n\t0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,\n\t0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,\n\t0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc6,0xc5,0xc3,0x00,0xc7,0xc6,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,\n\t0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd1,0xd0,0xce,0x00,0xd2,0xd1,0xcf,0x00,\n\t0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd8,0xd7,0xd4,0x00,0xd9,0xd8,0xd5,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xda,0xd7,0x00,\n\t0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,\n\t0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,\n\t0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf1,0x00,\n\t0xf7,0xf6,0xf3,0x00,0xf7,0xf7,0xf3,0x00,0xf8,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf8,0xf6,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,\n\t0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x23,0x22,0x22,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x27,0x27,0x00,\n\t0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2c,0x2c,0x00,0x2c,0x2d,0x2d,0x00,0x2d,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,\n\t0x32,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,\n\t0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,\n\t0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x49,0x00,0x4b,0x4b,0x4a,0x00,\n\t0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x54,0x53,0x00,\n\t0x54,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x59,0x57,0x00,0x59,0x5a,0x58,0x00,0x5a,0x5b,0x5a,0x00,0x5b,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,\n\t0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x63,0x63,0x61,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,\n\t0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6b,0x6c,0x69,0x00,0x6c,0x6d,0x6a,0x00,0x6d,0x6e,0x6b,0x00,0x6e,0x6f,0x6c,0x00,0x6f,0x70,0x6e,0x00,\n\t0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,\n\t0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,\n\t0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x84,0x85,0x82,0x00,0x85,0x86,0x83,0x00,0x86,0x87,0x84,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,\n\t0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x91,0x00,\n\t0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9b,0x98,0x00,0x9c,0x9c,0x99,0x00,\n\t0x9d,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa3,0xa0,0x00,0xa4,0xa4,0xa1,0x00,0xa5,0xa5,0xa2,0x00,\n\t0xa6,0xa6,0xa3,0x00,0xa7,0xa7,0xa4,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,\n\t0xaf,0xaf,0xac,0x00,0xb0,0xb0,0xad,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,\n\t0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,\n\t0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc8,0xc7,0xc5,0x00,0xc9,0xc8,0xc6,0x00,\n\t0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd1,0xd0,0xce,0x00,0xd2,0xd1,0xcf,0x00,\n\t0xd3,0xd2,0xd0,0x00,0xd4,0xd3,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xda,0xd7,0x00,\n\t0xdc,0xdb,0xd8,0x00,0xdd,0xdc,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,\n\t0xe5,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,\n\t0xed,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf1,0x00,\n\t0xf6,0xf6,0xf2,0x00,0xf7,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,\n\t0xfb,0xfa,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,\n\t0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2d,0x2d,0x00,0x2d,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,\n\t0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,\n\t0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,\n\t0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,\n\t0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,\n\t0x54,0x55,0x54,0x00,0x55,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x5a,0x58,0x00,0x5a,0x5b,0x59,0x00,0x5b,0x5c,0x5b,0x00,0x5c,0x5d,0x5c,0x00,\n\t0x5e,0x5e,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x64,0x64,0x62,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,\n\t0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6e,0x6f,0x6c,0x00,0x6f,0x70,0x6d,0x00,\n\t0x70,0x71,0x6e,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,\n\t0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7c,0x7d,0x7a,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,\n\t0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x85,0x86,0x83,0x00,0x86,0x87,0x84,0x00,0x87,0x88,0x85,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,\n\t0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x90,0x00,\n\t0x93,0x94,0x91,0x00,0x94,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,\n\t0x9d,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa5,0xa2,0x00,\n\t0xa6,0xa6,0xa3,0x00,0xa7,0xa7,0xa4,0x00,0xa8,0xa8,0xa5,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,\n\t0xaf,0xaf,0xac,0x00,0xb0,0xb0,0xad,0x00,0xb1,0xb1,0xae,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,\n\t0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,\n\t0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,\n\t0xca,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,\n\t0xd3,0xd2,0xd0,0x00,0xd4,0xd3,0xd1,0x00,0xd5,0xd4,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,\n\t0xdc,0xdb,0xd8,0x00,0xdd,0xdc,0xd9,0x00,0xde,0xdd,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,\n\t0xe5,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,\n\t0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf1,0x00,\n\t0xf6,0xf6,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf7,0xf5,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,\n\t0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x19,0x19,0x19,0x00,0x19,0x1a,0x1a,0x00,0x1a,0x1b,0x1b,0x00,0x1b,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,\n\t0x27,0x27,0x27,0x00,0x28,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2f,0x2f,0x00,0x2f,0x30,0x30,0x00,\n\t0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,\n\t0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,\n\t0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,\n\t0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,\n\t0x54,0x54,0x53,0x00,0x55,0x56,0x55,0x00,0x56,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5b,0x59,0x00,0x5b,0x5c,0x5a,0x00,0x5c,0x5d,0x5c,0x00,\n\t0x5d,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x65,0x66,0x63,0x00,0x66,0x67,0x65,0x00,\n\t0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,\n\t0x6f,0x70,0x6e,0x00,0x71,0x72,0x6f,0x00,0x72,0x73,0x70,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,\n\t0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7e,0x7f,0x7c,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,\n\t0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x87,0x88,0x85,0x00,0x88,0x89,0x86,0x00,0x89,0x8a,0x88,0x00,\n\t0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x93,0x90,0x00,\n\t0x93,0x94,0x91,0x00,0x94,0x95,0x92,0x00,0x95,0x96,0x93,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,\n\t0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9d,0x00,0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,\n\t0xa5,0xa6,0xa3,0x00,0xa6,0xa7,0xa4,0x00,0xa8,0xa8,0xa5,0x00,0xa9,0xa9,0xa6,0x00,0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,\n\t0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb1,0xb1,0xae,0x00,0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb7,0xb4,0x00,\n\t0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,\n\t0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc3,0xc2,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc6,0x00,\n\t0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,0xcd,0xcc,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,\n\t0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd5,0xd4,0xd1,0x00,0xd6,0xd5,0xd2,0x00,0xd7,0xd6,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,\n\t0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xde,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,\n\t0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,\n\t0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf5,0xf1,0x00,\n\t0xf6,0xf6,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,\n\t0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,\n\t0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x19,0x19,0x19,0x00,0x19,0x1a,0x1a,0x00,0x1a,0x1b,0x1b,0x00,0x1b,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,\n\t0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2f,0x2f,0x00,0x2f,0x30,0x30,0x00,\n\t0x30,0x31,0x31,0x00,0x31,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,\n\t0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,\n\t0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,\n\t0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,\n\t0x54,0x54,0x53,0x00,0x55,0x56,0x55,0x00,0x56,0x57,0x56,0x00,0x57,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5b,0x59,0x00,0x5b,0x5c,0x5a,0x00,0x5c,0x5d,0x5b,0x00,\n\t0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x66,0x67,0x64,0x00,\n\t0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,\n\t0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x74,0x75,0x72,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,\n\t0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7f,0x80,0x7d,0x00,0x80,0x81,0x7f,0x00,\n\t0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x88,0x89,0x86,0x00,0x89,0x8a,0x87,0x00,\n\t0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,\n\t0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x96,0x93,0x00,0x96,0x97,0x94,0x00,0x97,0x98,0x95,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,\n\t0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0xa0,0x9d,0x00,0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0x9f,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,\n\t0xa5,0xa5,0xa3,0x00,0xa6,0xa7,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xaa,0x00,0xad,0xae,0xab,0x00,\n\t0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,\n\t0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,\n\t0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc5,0xc4,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,\n\t0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,\n\t0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd7,0xd6,0xd3,0x00,0xd8,0xd7,0xd4,0x00,0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,\n\t0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,\n\t0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xec,0xec,0xe8,0x00,\n\t0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,\n\t0xf5,0xf6,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf6,0xf7,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,\n\t0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,\n\t0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x1a,0x1a,0x00,0x1a,0x1b,0x1b,0x00,0x1b,0x1c,0x1c,0x00,0x1c,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,\n\t0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x30,0x30,0x00,\n\t0x30,0x31,0x31,0x00,0x31,0x32,0x32,0x00,0x32,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x39,0x39,0x00,\n\t0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x41,0x00,\n\t0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x4a,0x00,\n\t0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x52,0x51,0x00,0x53,0x53,0x52,0x00,\n\t0x54,0x54,0x53,0x00,0x55,0x56,0x55,0x00,0x56,0x57,0x56,0x00,0x57,0x58,0x57,0x00,0x58,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5c,0x5a,0x00,0x5c,0x5d,0x5b,0x00,\n\t0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,\n\t0x67,0x68,0x65,0x00,0x68,0x69,0x66,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,\n\t0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x77,0x78,0x75,0x00,\n\t0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,\n\t0x81,0x82,0x7f,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,\n\t0x8a,0x8b,0x88,0x00,0x8b,0x8c,0x89,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,\n\t0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x99,0x96,0x00,0x99,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,\n\t0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa2,0x9f,0x00,0xa3,0xa3,0xa0,0x00,0xa4,0xa4,0xa1,0x00,\n\t0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,\n\t0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,\n\t0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,\n\t0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc7,0xc6,0xc4,0x00,0xc8,0xc8,0xc5,0x00,\n\t0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd1,0xd0,0xce,0x00,\n\t0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd9,0xd8,0xd5,0x00,0xda,0xd9,0xd6,0x00,\n\t0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,\n\t0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe8,0x00,\n\t0xec,0xec,0xe9,0x00,0xed,0xee,0xea,0x00,0xee,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,\n\t0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf2,0x00,0xf6,0xf7,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xfa,0xf7,0x00,\n\t0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,\n\t0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1b,0x1b,0x00,0x1b,0x1c,0x1c,0x00,0x1c,0x1d,0x1d,0x00,0x1d,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,\n\t0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x2a,0x2a,0x00,0x2a,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,\n\t0x30,0x31,0x31,0x00,0x31,0x32,0x32,0x00,0x32,0x33,0x33,0x00,0x33,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,\n\t0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,\n\t0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,\n\t0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x52,0x51,0x00,0x52,0x53,0x52,0x00,\n\t0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x57,0x56,0x00,0x57,0x58,0x57,0x00,0x58,0x59,0x58,0x00,0x59,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5d,0x5b,0x00,\n\t0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5f,0x00,0x60,0x61,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,\n\t0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x69,0x6a,0x67,0x00,0x6a,0x6b,0x68,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,\n\t0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,\n\t0x77,0x78,0x76,0x00,0x79,0x7a,0x77,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,\n\t0x80,0x81,0x7f,0x00,0x82,0x83,0x80,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,\n\t0x89,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,\n\t0x92,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,\n\t0x9c,0x9c,0x99,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa3,0xa0,0x00,0xa3,0xa4,0xa1,0x00,\n\t0xa5,0xa5,0xa2,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,\n\t0xae,0xae,0xab,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb3,0x00,\n\t0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,\n\t0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,\n\t0xc9,0xc8,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,\n\t0xd2,0xd1,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,\n\t0xdb,0xda,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,\n\t0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,\n\t0xec,0xec,0xe8,0x00,0xed,0xed,0xea,0x00,0xee,0xef,0xeb,0x00,0xef,0xf0,0xec,0x00,0xf0,0xf1,0xed,0x00,0xf1,0xf2,0xee,0x00,0xf2,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,\n\t0xf5,0xf5,0xf1,0x00,0xf5,0xf6,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf6,0x00,0xf9,0xfa,0xf7,0x00,\n\t0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,\n\t0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x2a,0x2a,0x00,0x2a,0x2b,0x2b,0x00,0x2b,0x2c,0x2c,0x00,0x2c,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,\n\t0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,\n\t0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x40,0x3f,0x00,0x40,0x41,0x40,0x00,\n\t0x41,0x42,0x41,0x00,0x42,0x43,0x42,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,\n\t0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x52,0x51,0x00,0x52,0x53,0x52,0x00,\n\t0x53,0x54,0x53,0x00,0x54,0x55,0x54,0x00,0x56,0x57,0x55,0x00,0x57,0x58,0x57,0x00,0x58,0x59,0x58,0x00,0x59,0x5a,0x59,0x00,0x5a,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,\n\t0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x60,0x00,0x61,0x62,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,\n\t0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6c,0x6d,0x6a,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,\n\t0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,\n\t0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,\n\t0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,\n\t0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,\n\t0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,\n\t0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa4,0xa1,0x00,\n\t0xa4,0xa5,0xa2,0x00,0xa5,0xa6,0xa3,0x00,0xa7,0xa7,0xa4,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,\n\t0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xb0,0xb0,0xad,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb3,0x00,\n\t0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,\n\t0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc2,0xc1,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,\n\t0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,\n\t0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd4,0xd3,0xd0,0x00,0xd5,0xd5,0xd1,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,\n\t0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdd,0xdc,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,\n\t0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,\n\t0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xf0,0xec,0x00,0xf0,0xf1,0xed,0x00,0xf1,0xf2,0xee,0x00,0xf2,0xf3,0xef,0x00,0xf3,0xf4,0xf0,0x00,\n\t0xf4,0xf5,0xf1,0x00,0xf5,0xf6,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf9,0xf6,0x00,0xf9,0xf9,0xf7,0x00,\n\t0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,\n\t0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x2a,0x2a,0x00,0x2a,0x2b,0x2b,0x00,0x2b,0x2c,0x2c,0x00,0x2c,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,\n\t0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,\n\t0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x40,0x3f,0x00,0x40,0x41,0x40,0x00,\n\t0x41,0x42,0x41,0x00,0x42,0x43,0x42,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,\n\t0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x52,0x51,0x00,0x52,0x53,0x52,0x00,\n\t0x53,0x54,0x53,0x00,0x54,0x55,0x54,0x00,0x55,0x56,0x55,0x00,0x57,0x58,0x56,0x00,0x58,0x59,0x58,0x00,0x59,0x5a,0x59,0x00,0x5a,0x5b,0x5a,0x00,0x5b,0x5c,0x5b,0x00,\n\t0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x61,0x00,0x62,0x63,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,\n\t0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,\n\t0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,\n\t0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,\n\t0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,\n\t0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,\n\t0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,\n\t0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9f,0x9c,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,\n\t0xa4,0xa5,0xa2,0x00,0xa5,0xa6,0xa3,0x00,0xa6,0xa7,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,\n\t0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,\n\t0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,\n\t0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,\n\t0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,\n\t0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd6,0xd6,0xd2,0x00,0xd7,0xd7,0xd3,0x00,0xd8,0xd8,0xd4,0x00,0xd9,0xd9,0xd5,0x00,\n\t0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,\n\t0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe8,0xe4,0x00,0xe8,0xe9,0xe5,0x00,0xe9,0xea,0xe6,0x00,0xea,0xeb,0xe7,0x00,\n\t0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf1,0xed,0x00,0xf1,0xf2,0xee,0x00,0xf2,0xf3,0xef,0x00,0xf3,0xf4,0xf0,0x00,\n\t0xf4,0xf5,0xf1,0x00,0xf5,0xf6,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf7,0xf8,0xf5,0x00,0xf8,0xf9,0xf6,0x00,0xf9,0xf9,0xf7,0x00,\n\t0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x14,0x14,0x15,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,\n\t0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2b,0x2b,0x00,0x2b,0x2c,0x2c,0x00,0x2c,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,\n\t0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,\n\t0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x41,0x40,0x00,\n\t0x41,0x42,0x41,0x00,0x42,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x4a,0x4a,0x49,0x00,\n\t0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x53,0x52,0x00,\n\t0x53,0x54,0x53,0x00,0x54,0x55,0x54,0x00,0x55,0x56,0x55,0x00,0x56,0x57,0x56,0x00,0x58,0x59,0x57,0x00,0x59,0x5a,0x59,0x00,0x5a,0x5b,0x5a,0x00,0x5b,0x5c,0x5b,0x00,\n\t0x5c,0x5d,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x66,0x64,0x00,\n\t0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,\n\t0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x71,0x71,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,\n\t0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,\n\t0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,\n\t0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,\n\t0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,\n\t0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0xa0,0x9d,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,\n\t0xa4,0xa4,0xa2,0x00,0xa5,0xa6,0xa3,0x00,0xa6,0xa7,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xad,0xaa,0x00,\n\t0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,\n\t0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,\n\t0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,\n\t0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,\n\t0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd8,0xd8,0xd4,0x00,0xd9,0xd9,0xd5,0x00,\n\t0xda,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,\n\t0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xea,0xe6,0x00,0xea,0xeb,0xe7,0x00,\n\t0xeb,0xec,0xe8,0x00,0xec,0xed,0xe9,0x00,0xed,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf3,0xef,0x00,0xf3,0xf4,0xf0,0x00,\n\t0xf4,0xf5,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf8,0xf9,0xf6,0x00,0xf9,0xf9,0xf7,0x00,\n\t0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x13,0x12,0x13,0x00,0x13,0x13,0x14,0x00,0x14,0x14,0x15,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,\n\t0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2c,0x2c,0x00,0x2c,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,\n\t0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,\n\t0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,\n\t0x41,0x42,0x41,0x00,0x42,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,\n\t0x53,0x54,0x53,0x00,0x54,0x55,0x54,0x00,0x55,0x56,0x55,0x00,0x56,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x5a,0x58,0x00,0x5a,0x5b,0x5a,0x00,0x5b,0x5c,0x5b,0x00,\n\t0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x63,0x00,0x65,0x65,0x64,0x00,\n\t0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,\n\t0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x71,0x00,0x73,0x73,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,\n\t0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,\n\t0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,\n\t0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,\n\t0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,\n\t0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa1,0x9e,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,\n\t0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa7,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,\n\t0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb5,0xb5,0xb3,0x00,\n\t0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbe,0xbe,0xbc,0x00,\n\t0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,\n\t0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,\n\t0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd9,0xd9,0xd5,0x00,\n\t0xda,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdd,0x00,0xe2,0xe2,0xde,0x00,\n\t0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe7,0x00,\n\t0xeb,0xec,0xe8,0x00,0xec,0xed,0xe9,0x00,0xed,0xee,0xea,0x00,0xee,0xef,0xeb,0x00,0xef,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xf0,0x00,\n\t0xf4,0xf5,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,\n\t0xf9,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x13,0x00,0x13,0x13,0x14,0x00,0x14,0x14,0x15,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x25,0x00,\n\t0x27,0x26,0x26,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,\n\t0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,\n\t0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,\n\t0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4d,0x4c,0x00,0x4d,0x4e,0x4d,0x00,0x4e,0x4f,0x4e,0x00,0x4f,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,\n\t0x53,0x53,0x52,0x00,0x54,0x55,0x54,0x00,0x55,0x56,0x55,0x00,0x56,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x5a,0x58,0x00,0x5a,0x5b,0x59,0x00,0x5b,0x5c,0x5b,0x00,\n\t0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x64,0x00,\n\t0x66,0x66,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,\n\t0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,0x75,0x75,0x74,0x00,0x76,0x77,0x75,0x00,\n\t0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7f,0x80,0x7e,0x00,\n\t0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x88,0x89,0x87,0x00,\n\t0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,\n\t0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,\n\t0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa1,0x9e,0x00,0xa1,0xa2,0x9f,0x00,0xa3,0xa3,0xa1,0x00,\n\t0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xac,0xac,0xaa,0x00,\n\t0xad,0xad,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,\n\t0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbe,0xbb,0x00,\n\t0xbe,0xbf,0xbc,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc7,0xc4,0x00,\n\t0xc7,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xd0,0xcd,0x00,\n\t0xd0,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,\n\t0xd9,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,\n\t0xe2,0xe2,0xde,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,\n\t0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe9,0x00,0xed,0xee,0xea,0x00,0xee,0xef,0xeb,0x00,0xef,0xf0,0xec,0x00,0xf0,0xf1,0xed,0x00,0xf1,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,\n\t0xf4,0xf4,0xf0,0x00,0xf4,0xf5,0xf1,0x00,0xf5,0xf6,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,\n\t0xf9,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x13,0x00,0x13,0x13,0x14,0x00,0x14,0x14,0x15,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x25,0x00,\n\t0x27,0x26,0x26,0x00,0x28,0x27,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,\n\t0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,\n\t0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,\n\t0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4d,0x4c,0x00,0x4d,0x4e,0x4d,0x00,0x4e,0x4f,0x4e,0x00,0x4f,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,\n\t0x53,0x53,0x52,0x00,0x54,0x55,0x54,0x00,0x55,0x56,0x55,0x00,0x56,0x57,0x56,0x00,0x57,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5b,0x59,0x00,0x5b,0x5c,0x5a,0x00,\n\t0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,\n\t0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,\n\t0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,\n\t0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7e,0x00,\n\t0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,\n\t0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,\n\t0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,\n\t0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa2,0x9f,0x00,0xa2,0xa3,0xa1,0x00,\n\t0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,\n\t0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,\n\t0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,\n\t0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,\n\t0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,\n\t0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,\n\t0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,\n\t0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,\n\t0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xf0,0xec,0x00,0xf0,0xf1,0xed,0x00,0xf1,0xf2,0xee,0x00,0xf2,0xf3,0xef,0x00,\n\t0xf4,0xf4,0xf0,0x00,0xf4,0xf5,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,\n\t0xf9,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x13,0x00,0x13,0x13,0x14,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x24,0x00,0x26,0x25,0x25,0x00,\n\t0x27,0x26,0x26,0x00,0x28,0x27,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2f,0x2f,0x00,\n\t0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x38,0x38,0x38,0x00,\n\t0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,\n\t0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4e,0x4d,0x00,0x4e,0x4f,0x4e,0x00,0x4f,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,\n\t0x53,0x53,0x52,0x00,0x54,0x55,0x54,0x00,0x55,0x56,0x55,0x00,0x56,0x57,0x56,0x00,0x57,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5c,0x5a,0x00,\n\t0x5c,0x5d,0x5b,0x00,0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,\n\t0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6b,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,\n\t0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,\n\t0x76,0x77,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,\n\t0x7f,0x80,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,\n\t0x88,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,\n\t0x91,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,\n\t0x9a,0x9a,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa3,0xa0,0x00,\n\t0xa3,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,\n\t0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,\n\t0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,\n\t0xbe,0xbe,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,\n\t0xc7,0xc7,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,\n\t0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd3,0xcf,0x00,0xd3,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,\n\t0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,\n\t0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,\n\t0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf2,0xee,0x00,0xf2,0xf3,0xef,0x00,\n\t0xf3,0xf4,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf9,0xf7,0x00,\n\t0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x13,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,\n\t0x27,0x26,0x26,0x00,0x28,0x27,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,\n\t0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,\n\t0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4f,0x4e,0x00,0x4f,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,\n\t0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x56,0x55,0x00,0x56,0x57,0x56,0x00,0x57,0x58,0x57,0x00,0x58,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,\n\t0x5c,0x5d,0x5b,0x00,0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,\n\t0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,\n\t0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x75,0x00,\n\t0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,\n\t0x7f,0x80,0x7e,0x00,0x80,0x81,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,\n\t0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,\n\t0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x98,0x00,\n\t0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,\n\t0xa3,0xa4,0xa1,0x00,0xa4,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,\n\t0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,\n\t0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,\n\t0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,\n\t0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,\n\t0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd4,0xd0,0x00,0xd4,0xd5,0xd1,0x00,0xd6,0xd6,0xd2,0x00,0xd7,0xd7,0xd3,0x00,0xd8,0xd8,0xd5,0x00,\n\t0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,\n\t0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xea,0xe6,0x00,\n\t0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,\n\t0xf3,0xf4,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf9,0xf6,0x00,\n\t0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,\n\t0x26,0x26,0x26,0x00,0x27,0x27,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x32,0x00,0x34,0x33,0x33,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,\n\t0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,\n\t0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,\n\t0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x57,0x56,0x00,0x57,0x58,0x57,0x00,0x58,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,\n\t0x5c,0x5c,0x5b,0x00,0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5f,0x00,0x60,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x65,0x63,0x00,\n\t0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,\n\t0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,\n\t0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,\n\t0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,\n\t0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8c,0x8c,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,\n\t0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,\n\t0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,\n\t0xa3,0xa3,0xa1,0x00,0xa4,0xa5,0xa2,0x00,0xa5,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xac,0xa9,0x00,\n\t0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,\n\t0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbd,0xbd,0xbb,0x00,\n\t0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,\n\t0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,\n\t0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd5,0xd1,0x00,0xd5,0xd6,0xd2,0x00,0xd6,0xd7,0xd3,0x00,0xd8,0xd8,0xd4,0x00,\n\t0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe1,0xe1,0xdd,0x00,\n\t0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe6,0x00,\n\t0xea,0xea,0xe7,0x00,0xeb,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xef,0x00,\n\t0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf8,0xf8,0xf6,0x00,\n\t0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,\n\t0x26,0x26,0x26,0x00,0x27,0x27,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x32,0x00,0x34,0x33,0x33,0x00,0x35,0x34,0x34,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,\n\t0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,\n\t0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,\n\t0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x58,0x57,0x00,0x58,0x59,0x58,0x00,0x59,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,\n\t0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,\n\t0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6b,0x00,0x6c,0x6d,0x6c,0x00,\n\t0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x70,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,\n\t0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,\n\t0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,\n\t0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,\n\t0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,\n\t0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,\n\t0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa6,0xa3,0x00,0xa6,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,\n\t0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,\n\t0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,\n\t0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,\n\t0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xce,0xcb,0x00,0xce,0xcf,0xcc,0x00,\n\t0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd7,0xd3,0x00,0xd7,0xd8,0xd4,0x00,\n\t0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,\n\t0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,\n\t0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,\n\t0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf8,0xf8,0xf6,0x00,\n\t0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,\n\t0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x31,0x00,0x33,0x32,0x32,0x00,0x34,0x33,0x33,0x00,0x35,0x34,0x34,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,\n\t0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3f,0x3e,0x00,0x40,0x40,0x40,0x00,\n\t0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x52,0x52,0x51,0x00,\n\t0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x59,0x58,0x00,0x59,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,\n\t0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,\n\t0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6c,0x00,\n\t0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x70,0x70,0x6f,0x00,0x71,0x71,0x70,0x00,0x72,0x72,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,\n\t0x76,0x77,0x75,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,\n\t0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,\n\t0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8f,0x00,\n\t0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,\n\t0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,\n\t0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa7,0xa4,0x00,0xa7,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,\n\t0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb4,0xb4,0xb2,0x00,\n\t0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,\n\t0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,\n\t0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xce,0xcb,0x00,0xce,0xcf,0xcc,0x00,\n\t0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd8,0xd4,0x00,\n\t0xd8,0xd9,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,\n\t0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,\n\t0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,\n\t0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,\n\t0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,\n\t0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x31,0x30,0x30,0x00,0x32,0x31,0x31,0x00,0x33,0x32,0x32,0x00,0x34,0x33,0x33,0x00,0x35,0x34,0x34,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,\n\t0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3f,0x3e,0x00,0x3f,0x40,0x3f,0x00,\n\t0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,\n\t0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x5a,0x59,0x00,0x5a,0x5b,0x5a,0x00,\n\t0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x62,0x00,0x64,0x64,0x63,0x00,\n\t0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,\n\t0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x72,0x72,0x71,0x00,0x73,0x73,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,\n\t0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7b,0x7c,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,\n\t0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,\n\t0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,\n\t0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,\n\t0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,\n\t0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,\n\t0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,\n\t0xb4,0xb5,0xb2,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,\n\t0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,\n\t0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xce,0xcb,0x00,0xce,0xcf,0xcc,0x00,\n\t0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,\n\t0xd8,0xd8,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xda,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,\n\t0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,\n\t0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,\n\t0xf3,0xf3,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,\n\t0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x18,0x19,0x19,0x00,0x19,0x1a,0x1a,0x00,0x1a,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,\n\t0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,\n\t0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,\n\t0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3f,0x3e,0x00,0x3f,0x40,0x3f,0x00,\n\t0x40,0x41,0x40,0x00,0x41,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,\n\t0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,\n\t0x52,0x52,0x52,0x00,0x53,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5b,0x5a,0x00,\n\t0x5b,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x63,0x00,\n\t0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,\n\t0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,0x74,0x74,0x73,0x00,0x75,0x76,0x74,0x00,\n\t0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7b,0x7c,0x7b,0x00,0x7c,0x7d,0x7c,0x00,0x7e,0x7f,0x7d,0x00,\n\t0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x87,0x88,0x86,0x00,\n\t0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,\n\t0x91,0x91,0x8f,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x98,0x96,0x00,0x99,0x99,0x97,0x00,\n\t0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa2,0xa2,0xa0,0x00,\n\t0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xab,0xab,0xa9,0x00,\n\t0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,\n\t0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbd,0xba,0x00,\n\t0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc6,0xc3,0x00,\n\t0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xcf,0xcc,0x00,\n\t0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,\n\t0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdc,0xd8,0x00,0xdc,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,\n\t0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,0xe9,0xe9,0xe5,0x00,\n\t0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,\n\t0xf3,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,\n\t0xf9,0xf9,0xf7,0x00,0xfa,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x18,0x19,0x19,0x00,0x19,0x1a,0x1a,0x00,0x1a,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,\n\t0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,\n\t0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,\n\t0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3f,0x3e,0x00,0x3f,0x40,0x3f,0x00,\n\t0x40,0x41,0x40,0x00,0x41,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,\n\t0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,\n\t0x52,0x52,0x52,0x00,0x53,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,\n\t0x5b,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x64,0x62,0x00,\n\t0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6b,0x6a,0x00,0x6c,0x6d,0x6b,0x00,\n\t0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,\n\t0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x7a,0x00,0x7b,0x7c,0x7b,0x00,0x7c,0x7d,0x7c,0x00,0x7d,0x7e,0x7d,0x00,\n\t0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,\n\t0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,\n\t0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,\n\t0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xab,0xa8,0x00,\n\t0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb4,0xb1,0x00,\n\t0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,\n\t0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc3,0x00,\n\t0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,\n\t0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,\n\t0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,\n\t0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,\n\t0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,\n\t0xf3,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf4,0xf2,0x00,0xf6,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,\n\t0xf9,0xf9,0xf7,0x00,0xfa,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x18,0x19,0x19,0x00,0x19,0x1a,0x1a,0x00,0x1a,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,\n\t0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,\n\t0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x29,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x37,0x37,0x37,0x00,\n\t0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x40,0x3f,0x00,\n\t0x40,0x41,0x40,0x00,0x41,0x42,0x41,0x00,0x42,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,\n\t0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x51,0x00,\n\t0x52,0x52,0x52,0x00,0x53,0x54,0x53,0x00,0x54,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,\n\t0x5b,0x5b,0x5a,0x00,0x5c,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,\n\t0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,\n\t0x6d,0x6d,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,\n\t0x75,0x76,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7b,0x00,0x7c,0x7d,0x7c,0x00,0x7d,0x7e,0x7d,0x00,\n\t0x7e,0x7f,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,\n\t0x87,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,\n\t0x90,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,\n\t0x99,0x99,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,\n\t0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,\n\t0xb4,0xb4,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,\n\t0xbd,0xbd,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,\n\t0xc6,0xc6,0xc3,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xce,0xcb,0x00,\n\t0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd2,0xce,0x00,0xd2,0xd3,0xcf,0x00,0xd3,0xd4,0xd0,0x00,0xd4,0xd5,0xd1,0x00,0xd5,0xd6,0xd2,0x00,0xd6,0xd7,0xd3,0x00,\n\t0xd8,0xd8,0xd4,0x00,0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,\n\t0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,\n\t0xe9,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,\n\t0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf3,0xf1,0x00,0xf5,0xf4,0xf2,0x00,0xf6,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,\n\t0xf9,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x18,0x19,0x19,0x00,0x19,0x1a,0x1a,0x00,0x1a,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,\n\t0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,\n\t0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x29,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,\n\t0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,\n\t0x40,0x41,0x40,0x00,0x41,0x42,0x41,0x00,0x42,0x43,0x42,0x00,0x43,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,\n\t0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,\n\t0x52,0x52,0x52,0x00,0x53,0x53,0x52,0x00,0x54,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,\n\t0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,\n\t0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,\n\t0x6d,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,\n\t0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7c,0x00,0x7d,0x7e,0x7d,0x00,\n\t0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,\n\t0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,\n\t0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,\n\t0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,\n\t0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,\n\t0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,\n\t0xbc,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,\n\t0xc5,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xce,0xcb,0x00,\n\t0xce,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd4,0xd0,0x00,0xd4,0xd5,0xd1,0x00,0xd5,0xd6,0xd2,0x00,0xd6,0xd7,0xd3,0x00,\n\t0xd7,0xd8,0xd4,0x00,0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,\n\t0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,\n\t0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,\n\t0xf2,0xf2,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf4,0xf1,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf7,0xf6,0x00,\n\t0xf9,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x12,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,\n\t0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x24,0x25,0x24,0x00,\n\t0x25,0x26,0x25,0x00,0x27,0x27,0x27,0x00,0x28,0x29,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,\n\t0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,\n\t0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,\n\t0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,\n\t0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,\n\t0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,\n\t0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x68,0x00,0x69,0x6a,0x69,0x00,0x6b,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,\n\t0x6d,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,\n\t0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7d,0x00,\n\t0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x80,0x81,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,\n\t0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,\n\t0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,\n\t0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,\n\t0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,\n\t0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,\n\t0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,\n\t0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xce,0xcb,0x00,\n\t0xce,0xcf,0xcc,0x00,0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd6,0xd2,0x00,0xd6,0xd7,0xd3,0x00,\n\t0xd7,0xd8,0xd4,0x00,0xd8,0xd9,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,\n\t0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,\n\t0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,\n\t0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf6,0xf4,0x00,0xf8,0xf7,0xf6,0x00,\n\t0xf9,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x12,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,\n\t0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x24,0x25,0x24,0x00,\n\t0x25,0x26,0x25,0x00,0x27,0x27,0x27,0x00,0x28,0x29,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,\n\t0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,\n\t0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,\n\t0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,\n\t0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,\n\t0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,\n\t0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x69,0x68,0x00,0x69,0x6a,0x69,0x00,0x6a,0x6b,0x6a,0x00,0x6b,0x6c,0x6b,0x00,\n\t0x6d,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x70,0x6f,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,\n\t0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,\n\t0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x80,0x81,0x80,0x00,0x81,0x82,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,\n\t0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,\n\t0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,\n\t0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,\n\t0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,\n\t0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,\n\t0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,\n\t0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xce,0xcb,0x00,\n\t0xce,0xcf,0xcc,0x00,0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,\n\t0xd7,0xd8,0xd4,0x00,0xd8,0xd9,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xda,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,\n\t0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe5,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,\n\t0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,\n\t0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf5,0xf3,0x00,0xf7,0xf6,0xf4,0x00,0xf8,0xf7,0xf5,0x00,\n\t0xf9,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x12,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1d,0x1d,0x1d,0x00,\n\t0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x24,0x25,0x24,0x00,\n\t0x25,0x26,0x25,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x2a,0x29,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,\n\t0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,\n\t0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x48,0x00,\n\t0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x51,0x51,0x50,0x00,\n\t0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,\n\t0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,\n\t0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x6a,0x69,0x00,0x6a,0x6b,0x6a,0x00,0x6b,0x6c,0x6b,0x00,\n\t0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x70,0x6f,0x00,0x71,0x71,0x70,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,\n\t0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,\n\t0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x80,0x00,0x81,0x82,0x81,0x00,0x82,0x83,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,\n\t0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,\n\t0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,\n\t0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,\n\t0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,\n\t0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,\n\t0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,\n\t0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,\n\t0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xce,0xcb,0x00,\n\t0xce,0xcf,0xcc,0x00,0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,\n\t0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xdb,0xd7,0x00,0xdb,0xdc,0xd8,0x00,0xdc,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,\n\t0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,\n\t0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,\n\t0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf4,0xf2,0x00,0xf6,0xf5,0xf3,0x00,0xf7,0xf6,0xf4,0x00,0xf8,0xf7,0xf5,0x00,\n\t0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfb,0xfb,0x00,0xfd,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x12,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,\n\t0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,\n\t0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,\n\t0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,\n\t0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,\n\t0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,\n\t0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,\n\t0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6b,0x6a,0x00,0x6b,0x6c,0x6b,0x00,\n\t0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x71,0x71,0x70,0x00,0x72,0x72,0x71,0x00,0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,\n\t0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,\n\t0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x82,0x00,0x83,0x84,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,\n\t0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8f,0x8f,0x8e,0x00,\n\t0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x98,0x98,0x97,0x00,\n\t0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,\n\t0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,\n\t0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb3,0xb0,0x00,\n\t0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbc,0xb9,0x00,\n\t0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc5,0xc2,0x00,\n\t0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xce,0xcb,0x00,\n\t0xce,0xcf,0xcc,0x00,0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,\n\t0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,\n\t0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe8,0xe7,0xe4,0x00,\n\t0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf1,0xf0,0xed,0x00,\n\t0xf2,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf3,0xf1,0x00,0xf5,0xf4,0xf2,0x00,0xf6,0xf5,0xf3,0x00,0xf7,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,\n\t0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfb,0xfa,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x12,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2d,0x2c,0x00,0x2d,0x2e,0x2d,0x00,\n\t0x2e,0x2f,0x2e,0x00,0x2f,0x30,0x2f,0x00,0x31,0x31,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,\n\t0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3e,0x3e,0x00,0x3e,0x3f,0x3f,0x00,\n\t0x3f,0x40,0x40,0x00,0x40,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,\n\t0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,\n\t0x51,0x51,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x5a,0x5a,0x59,0x00,\n\t0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x63,0x63,0x62,0x00,\n\t0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6c,0x6b,0x00,\n\t0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x73,0x73,0x72,0x00,0x74,0x75,0x74,0x00,\n\t0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7b,0x7c,0x7b,0x00,0x7d,0x7e,0x7c,0x00,\n\t0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x84,0x00,0x86,0x87,0x85,0x00,\n\t0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,\n\t0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,\n\t0x98,0x99,0x97,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa1,0x9f,0x00,\n\t0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xaa,0xa8,0x00,\n\t0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,\n\t0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,\n\t0xbc,0xbc,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,\n\t0xc5,0xc5,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,\n\t0xce,0xce,0xcb,0x00,0xcf,0xd0,0xcc,0x00,0xd0,0xd1,0xcd,0x00,0xd1,0xd2,0xce,0x00,0xd2,0xd3,0xcf,0x00,0xd3,0xd4,0xd0,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,\n\t0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,\n\t0xdf,0xdf,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,\n\t0xe8,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,0xf0,0xf0,0xec,0x00,\n\t0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf2,0xf0,0x00,0xf4,0xf3,0xf1,0x00,0xf5,0xf4,0xf2,0x00,0xf6,0xf5,0xf3,0x00,0xf7,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,\n\t0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x12,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2d,0x2c,0x00,0x2d,0x2e,0x2d,0x00,\n\t0x2e,0x2f,0x2e,0x00,0x2f,0x30,0x2f,0x00,0x31,0x31,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,\n\t0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3e,0x3e,0x00,0x3e,0x3f,0x3f,0x00,\n\t0x3f,0x40,0x40,0x00,0x40,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,\n\t0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,\n\t0x51,0x51,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x59,0x00,\n\t0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,\n\t0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6b,0x6a,0x00,\n\t0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,\n\t0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7b,0x7c,0x7b,0x00,0x7c,0x7d,0x7c,0x00,\n\t0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,\n\t0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,\n\t0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,\n\t0x98,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,\n\t0xa1,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,\n\t0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,\n\t0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,\n\t0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,\n\t0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,\n\t0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd3,0xcf,0x00,0xd3,0xd4,0xd0,0x00,0xd4,0xd5,0xd1,0x00,0xd5,0xd6,0xd2,0x00,\n\t0xd6,0xd7,0xd3,0x00,0xd7,0xd8,0xd4,0x00,0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,\n\t0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,\n\t0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,\n\t0xf1,0xf1,0xed,0x00,0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf4,0xf2,0x00,0xf6,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,\n\t0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfa,0xf9,0x00,0xfc,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x12,0x00,0x14,0x13,0x13,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2e,0x2d,0x00,\n\t0x2e,0x2f,0x2e,0x00,0x2f,0x30,0x2f,0x00,0x30,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x36,0x36,0x00,\n\t0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3f,0x3f,0x00,\n\t0x3f,0x40,0x40,0x00,0x40,0x41,0x41,0x00,0x41,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x48,0x48,0x47,0x00,\n\t0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,\n\t0x51,0x51,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,\n\t0x5a,0x5a,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,\n\t0x63,0x63,0x62,0x00,0x64,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6b,0x6a,0x00,\n\t0x6c,0x6c,0x6b,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,\n\t0x74,0x75,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7b,0x7c,0x7b,0x00,0x7c,0x7d,0x7c,0x00,\n\t0x7d,0x7e,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,\n\t0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,\n\t0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,\n\t0x98,0x98,0x97,0x00,0x99,0x9a,0x98,0x00,0x9a,0x9b,0x99,0x00,0x9b,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,\n\t0xa1,0xa1,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,\n\t0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,\n\t0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,\n\t0xbb,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,\n\t0xc4,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,\n\t0xcd,0xce,0xcb,0x00,0xce,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd6,0xd2,0x00,\n\t0xd6,0xd7,0xd3,0x00,0xd7,0xd8,0xd4,0x00,0xd8,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,\n\t0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,\n\t0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,\n\t0xf1,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,\n\t0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfa,0xf9,0x00,0xfc,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x12,0x00,0x14,0x13,0x13,0x00,0x15,0x14,0x14,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,\n\t0x2e,0x2f,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,\n\t0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,\n\t0x3f,0x40,0x40,0x00,0x40,0x41,0x41,0x00,0x41,0x42,0x42,0x00,0x42,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,\n\t0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,\n\t0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,\n\t0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,\n\t0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x66,0x65,0x00,0x66,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6b,0x6a,0x00,\n\t0x6c,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,\n\t0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7b,0x7c,0x7b,0x00,0x7c,0x7d,0x7c,0x00,\n\t0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,\n\t0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,\n\t0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,\n\t0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9b,0x99,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,\n\t0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,\n\t0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xae,0xab,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,\n\t0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,\n\t0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,\n\t0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,\n\t0xcd,0xce,0xcb,0x00,0xce,0xcf,0xcc,0x00,0xcf,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,\n\t0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd9,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xda,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,\n\t0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,\n\t0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,\n\t0xf1,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,\n\t0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xf9,0xf8,0x00,0xfb,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x12,0x00,0x14,0x13,0x13,0x00,0x15,0x14,0x14,0x00,\n\t0x16,0x15,0x15,0x00,0x17,0x16,0x16,0x00,0x18,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,\n\t0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,\n\t0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,\n\t0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x42,0x41,0x00,0x42,0x43,0x42,0x00,0x43,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,\n\t0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,\n\t0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,\n\t0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,\n\t0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x67,0x66,0x00,0x67,0x68,0x67,0x00,0x68,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6b,0x6a,0x00,\n\t0x6c,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,\n\t0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7b,0x00,0x7c,0x7d,0x7c,0x00,\n\t0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,\n\t0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,\n\t0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x97,0x97,0x96,0x00,\n\t0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,\n\t0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,\n\t0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,\n\t0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xbb,0xb8,0x00,\n\t0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc4,0xc1,0x00,\n\t0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcd,0xca,0x00,\n\t0xcd,0xce,0xcb,0x00,0xce,0xcf,0xcc,0x00,0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,\n\t0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdc,0xd8,0x00,0xdc,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,\n\t0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,\n\t0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xf0,0xef,0xec,0x00,\n\t0xf1,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,\n\t0xf8,0xf8,0xf5,0x00,0xf9,0xf8,0xf6,0x00,0xfa,0xf9,0xf8,0x00,0xfb,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x12,0x00,0x14,0x13,0x13,0x00,0x15,0x14,0x14,0x00,\n\t0x16,0x15,0x15,0x00,0x17,0x16,0x16,0x00,0x18,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,\n\t0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,\n\t0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,\n\t0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x42,0x41,0x00,0x42,0x43,0x42,0x00,0x43,0x44,0x43,0x00,0x44,0x45,0x44,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,\n\t0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,\n\t0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,\n\t0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,\n\t0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x68,0x67,0x00,0x68,0x69,0x68,0x00,0x69,0x6a,0x69,0x00,0x6a,0x6b,0x6a,0x00,\n\t0x6c,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,\n\t0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,\n\t0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x80,0x81,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,\n\t0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,\n\t0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,\n\t0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,\n\t0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,\n\t0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,\n\t0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,\n\t0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,\n\t0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,\n\t0xcd,0xce,0xcb,0x00,0xce,0xcf,0xcc,0x00,0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,\n\t0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,\n\t0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,\n\t0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,\n\t0xf1,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,\n\t0xf8,0xf8,0xf5,0x00,0xf9,0xf8,0xf6,0x00,0xfa,0xf9,0xf7,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x12,0x00,0x14,0x13,0x13,0x00,0x15,0x14,0x14,0x00,\n\t0x16,0x15,0x15,0x00,0x17,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x28,0x27,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,\n\t0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x36,0x35,0x36,0x00,\n\t0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,\n\t0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x43,0x42,0x00,0x43,0x44,0x43,0x00,0x44,0x45,0x44,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,\n\t0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4f,0x4e,0x00,0x50,0x50,0x50,0x00,\n\t0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,\n\t0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,\n\t0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x69,0x68,0x00,0x69,0x6a,0x69,0x00,0x6a,0x6b,0x6a,0x00,\n\t0x6b,0x6c,0x6b,0x00,0x6c,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x70,0x6f,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,\n\t0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,\n\t0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7f,0x00,0x80,0x81,0x80,0x00,0x81,0x82,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,\n\t0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8e,0x8e,0x8d,0x00,\n\t0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,\n\t0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,\n\t0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,\n\t0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb2,0xaf,0x00,\n\t0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,\n\t0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc1,0x00,\n\t0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,\n\t0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd1,0xcd,0x00,0xd1,0xd2,0xce,0x00,0xd2,0xd3,0xcf,0x00,0xd3,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,\n\t0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,\n\t0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe3,0x00,\n\t0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,\n\t0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf6,0xf4,0x00,\n\t0xf8,0xf7,0xf5,0x00,0xf9,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x12,0x00,0x14,0x13,0x13,0x00,0x15,0x14,0x14,0x00,\n\t0x16,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,\n\t0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,\n\t0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,\n\t0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x44,0x43,0x00,0x44,0x45,0x44,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,\n\t0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4f,0x4e,0x00,0x4f,0x50,0x4f,0x00,\n\t0x51,0x51,0x51,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,\n\t0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,\n\t0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x6a,0x69,0x00,0x6a,0x6b,0x6a,0x00,\n\t0x6b,0x6c,0x6b,0x00,0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x70,0x70,0x6f,0x00,0x71,0x71,0x70,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,\n\t0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,\n\t0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x81,0x00,0x82,0x83,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,\n\t0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,\n\t0x8e,0x8f,0x8d,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,\n\t0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,\n\t0xa0,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,\n\t0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,\n\t0xb2,0xb2,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,\n\t0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,\n\t0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,\n\t0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd4,0xd0,0x00,0xd4,0xd5,0xd1,0x00,\n\t0xd5,0xd6,0xd2,0x00,0xd7,0xd7,0xd3,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,\n\t0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,\n\t0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,\n\t0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf5,0xf3,0x00,0xf7,0xf6,0xf4,0x00,\n\t0xf8,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x14,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x17,0x18,0x00,0x19,0x18,0x19,0x00,0x1a,0x19,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,\n\t0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,\n\t0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,\n\t0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,\n\t0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4f,0x4e,0x00,0x4f,0x50,0x4f,0x00,\n\t0x50,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x59,0x59,0x58,0x00,\n\t0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x62,0x62,0x61,0x00,\n\t0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6b,0x6a,0x00,\n\t0x6b,0x6c,0x6b,0x00,0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x72,0x72,0x71,0x00,0x73,0x74,0x73,0x00,\n\t0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7c,0x7d,0x7b,0x00,\n\t0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x83,0x00,0x85,0x86,0x84,0x00,\n\t0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,\n\t0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,\n\t0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9a,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0xa0,0x9e,0x00,\n\t0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa9,0xa7,0x00,\n\t0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,\n\t0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,\n\t0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,\n\t0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,\n\t0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,\n\t0xd5,0xd5,0xd2,0x00,0xd6,0xd7,0xd3,0x00,0xd7,0xd8,0xd4,0x00,0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,\n\t0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,\n\t0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,0xef,0xef,0xeb,0x00,\n\t0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf4,0xf1,0x00,0xf6,0xf5,0xf3,0x00,0xf7,0xf6,0xf4,0x00,\n\t0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x14,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x17,0x18,0x00,0x19,0x18,0x19,0x00,0x1a,0x19,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,\n\t0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,\n\t0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,\n\t0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,\n\t0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4f,0x4e,0x00,0x4f,0x50,0x4f,0x00,\n\t0x50,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,\n\t0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,\n\t0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,\n\t0x6b,0x6c,0x6b,0x00,0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,\n\t0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7b,0x7c,0x7b,0x00,\n\t0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,\n\t0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,\n\t0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,\n\t0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9a,0x9b,0x99,0x00,0x9b,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9e,0x00,\n\t0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,\n\t0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,\n\t0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,\n\t0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,\n\t0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,\n\t0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,\n\t0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,\n\t0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe6,0xe6,0xe2,0x00,\n\t0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,\n\t0xf0,0xf0,0xec,0x00,0xf1,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf4,0x00,\n\t0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x19,0x18,0x19,0x00,0x1a,0x19,0x1a,0x00,0x1b,0x1a,0x1b,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x29,0x28,0x28,0x00,0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2d,0x2d,0x00,\n\t0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,\n\t0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,\n\t0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x47,0x47,0x47,0x00,\n\t0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x50,0x4f,0x00,\n\t0x50,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,\n\t0x59,0x59,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,\n\t0x62,0x62,0x61,0x00,0x63,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,\n\t0x6b,0x6b,0x6a,0x00,0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,\n\t0x73,0x74,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7b,0x7c,0x7b,0x00,\n\t0x7c,0x7d,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,\n\t0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,\n\t0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,\n\t0x97,0x97,0x96,0x00,0x98,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9a,0x9b,0x99,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,\n\t0xa0,0xa0,0x9e,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,\n\t0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,\n\t0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,\n\t0xba,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,\n\t0xc3,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,\n\t0xcc,0xcd,0xca,0x00,0xcd,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,\n\t0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdd,0xd9,0x00,\n\t0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,\n\t0xe7,0xe6,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,\n\t0xf0,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,\n\t0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x15,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x19,0x18,0x19,0x00,0x1a,0x19,0x1a,0x00,0x1b,0x1a,0x1b,0x00,0x1c,0x1b,0x1c,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,\n\t0x2e,0x2e,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,\n\t0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,\n\t0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,\n\t0x50,0x51,0x50,0x00,0x51,0x51,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,\n\t0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,\n\t0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x65,0x64,0x00,0x65,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,\n\t0x6b,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,\n\t0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7b,0x7c,0x7b,0x00,\n\t0x7c,0x7d,0x7c,0x00,0x7d,0x7e,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,\n\t0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,\n\t0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,\n\t0x96,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x9a,0x98,0x00,0x9a,0x9b,0x99,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,\n\t0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,\n\t0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,\n\t0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,\n\t0xba,0xba,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,\n\t0xc3,0xc3,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,\n\t0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xcf,0xcb,0x00,0xcf,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,\n\t0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,\n\t0xdd,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,\n\t0xe6,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,\n\t0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,\n\t0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1b,0x1a,0x1b,0x00,0x1c,0x1b,0x1c,0x00,\n\t0x1d,0x1c,0x1d,0x00,0x1e,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,\n\t0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,\n\t0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,\n\t0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,\n\t0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x58,0x00,\n\t0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,\n\t0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x66,0x65,0x00,0x66,0x67,0x66,0x00,0x67,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,\n\t0x6b,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,\n\t0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x7a,0x00,0x7b,0x7c,0x7b,0x00,\n\t0x7c,0x7d,0x7c,0x00,0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,\n\t0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,\n\t0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,\n\t0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9b,0x99,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,\n\t0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,\n\t0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,\n\t0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,\n\t0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,\n\t0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,\n\t0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd2,0xce,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,\n\t0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,\n\t0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,\n\t0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,\n\t0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,\n\t0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1b,0x1a,0x1b,0x00,0x1c,0x1b,0x1c,0x00,\n\t0x1d,0x1c,0x1d,0x00,0x1e,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,\n\t0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,\n\t0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,\n\t0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,\n\t0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,\n\t0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,\n\t0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x67,0x66,0x00,0x67,0x68,0x67,0x00,0x68,0x69,0x68,0x00,0x69,0x6a,0x69,0x00,\n\t0x6b,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,\n\t0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,\n\t0x7c,0x7d,0x7c,0x00,0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,\n\t0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,\n\t0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,\n\t0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,\n\t0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,\n\t0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,\n\t0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,\n\t0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,\n\t0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,\n\t0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,\n\t0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,\n\t0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,\n\t0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,\n\t0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,\n\t0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1d,0x1d,0x1d,0x00,\n\t0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,\n\t0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,\n\t0x36,0x35,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,\n\t0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,\n\t0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,\n\t0x59,0x59,0x58,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,\n\t0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x68,0x67,0x00,0x68,0x69,0x68,0x00,0x69,0x6a,0x69,0x00,\n\t0x6a,0x6b,0x6a,0x00,0x6b,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,\n\t0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,\n\t0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x80,0x81,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,\n\t0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,\n\t0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,\n\t0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,\n\t0x9f,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,\n\t0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,\n\t0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,\n\t0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,\n\t0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,\n\t0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,\n\t0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,\n\t0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,\n\t0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,\n\t0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,\n\t0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,\n\t0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,\n\t0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,\n\t0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,\n\t0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,\n\t0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,\n\t0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x67,0x00,0x68,0x69,0x68,0x00,0x69,0x6a,0x69,0x00,\n\t0x6a,0x6b,0x6a,0x00,0x6b,0x6c,0x6b,0x00,0x6c,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x70,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,\n\t0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,\n\t0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x80,0x00,0x81,0x82,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,\n\t0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,\n\t0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,\n\t0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,\n\t0x9f,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,\n\t0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,\n\t0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,\n\t0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,\n\t0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,\n\t0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,\n\t0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,\n\t0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe5,0xe1,0x00,\n\t0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xee,0xea,0x00,\n\t0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,\n\t0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,\n\t0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,\n\t0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,\n\t0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,\n\t0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x58,0x58,0x57,0x00,\n\t0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x61,0x61,0x60,0x00,\n\t0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x68,0x00,0x69,0x6a,0x69,0x00,\n\t0x6a,0x6b,0x6a,0x00,0x6b,0x6c,0x6b,0x00,0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x70,0x6f,0x00,0x71,0x71,0x71,0x00,0x72,0x73,0x72,0x00,\n\t0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7b,0x7c,0x7a,0x00,\n\t0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x82,0x00,0x84,0x85,0x83,0x00,\n\t0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,\n\t0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,\n\t0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9f,0x9d,0x00,\n\t0x9f,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa8,0xa6,0x00,\n\t0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,\n\t0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,\n\t0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc2,0xc2,0xbf,0x00,\n\t0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xcb,0xcb,0xc8,0x00,\n\t0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,\n\t0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,\n\t0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,\n\t0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,\n\t0xef,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf1,0x00,0xf6,0xf6,0xf3,0x00,\n\t0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,\n\t0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,\n\t0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x38,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,\n\t0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,\n\t0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x58,0x58,0x57,0x00,\n\t0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,\n\t0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,\n\t0x6a,0x6b,0x6a,0x00,0x6b,0x6c,0x6b,0x00,0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x70,0x70,0x6f,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,\n\t0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,\n\t0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,\n\t0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,\n\t0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,\n\t0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9a,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,\n\t0x9f,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,\n\t0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,\n\t0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,\n\t0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc2,0xbf,0x00,\n\t0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,\n\t0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,\n\t0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,\n\t0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,\n\t0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,\n\t0xef,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf4,0xf1,0x00,0xf6,0xf5,0xf3,0x00,\n\t0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1c,0x1d,0x1d,0x00,0x1d,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,\n\t0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,\n\t0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x38,0x39,0x00,0x3a,0x39,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,\n\t0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4f,0x4f,0x4f,0x00,\n\t0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,\n\t0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,\n\t0x61,0x61,0x61,0x00,0x62,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x69,0x00,\n\t0x6a,0x6a,0x6a,0x00,0x6b,0x6c,0x6b,0x00,0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x71,0x71,0x70,0x00,0x72,0x72,0x72,0x00,\n\t0x73,0x73,0x73,0x00,0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,\n\t0x7c,0x7c,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,\n\t0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,\n\t0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,\n\t0x96,0x96,0x94,0x00,0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9a,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,\n\t0x9f,0x9f,0x9d,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,\n\t0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,\n\t0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,\n\t0xb9,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,\n\t0xc2,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,\n\t0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,\n\t0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,\n\t0xdc,0xdc,0xda,0x00,0xde,0xdd,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,\n\t0xe5,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,\n\t0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf6,0xf5,0xf2,0x00,\n\t0xf7,0xf6,0xf4,0x00,0xf8,0xf7,0xf5,0x00,0xf9,0xf8,0xf6,0x00,0xfa,0xf9,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,\n\t0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1c,0x1d,0x1d,0x00,0x1d,0x1e,0x1e,0x00,0x1e,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,\n\t0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,\n\t0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x38,0x39,0x00,0x3a,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,\n\t0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4f,0x4f,0x4f,0x00,\n\t0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,\n\t0x58,0x58,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,\n\t0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x69,0x00,\n\t0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x72,0x72,0x72,0x00,\n\t0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,\n\t0x7b,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,\n\t0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x88,0x88,0x86,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,\n\t0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x95,0x95,0x93,0x00,\n\t0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9a,0x9b,0x99,0x00,0x9b,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,\n\t0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,\n\t0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,\n\t0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb9,0xb7,0x00,\n\t0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,\n\t0xc2,0xc2,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,\n\t0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,\n\t0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,\n\t0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xdf,0xde,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,\n\t0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,\n\t0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,\n\t0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xfa,0xf9,0xf7,0x00,0xfb,0xfa,0xf8,0x00,0xfc,0xfb,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,\n\t0xff,0xff,0xfc,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1c,0x1d,0x1d,0x00,0x1d,0x1e,0x1e,0x00,0x1e,0x1f,0x1f,0x00,0x1f,0x20,0x20,0x00,0x20,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2d,0x00,\n\t0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,\n\t0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x38,0x39,0x00,0x3a,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,0x3c,0x3b,0x3c,0x00,0x3d,0x3d,0x3d,0x00,\n\t0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,\n\t0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x60,0x00,\n\t0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x65,0x64,0x00,0x65,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,\n\t0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,\n\t0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,\n\t0x7b,0x7c,0x7b,0x00,0x7c,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,\n\t0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,\n\t0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,\n\t0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x9a,0x98,0x00,0x9a,0x9b,0x99,0x00,0x9b,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,\n\t0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,\n\t0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,\n\t0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,\n\t0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,\n\t0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc8,0x00,\n\t0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,\n\t0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd9,0x00,\n\t0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,0xe0,0xdf,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,\n\t0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xed,0xea,0x00,\n\t0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,\n\t0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfd,0xfc,0xfa,0x00,0xfe,0xfe,0xfb,0x00,\n\t0xff,0xff,0xfc,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1c,0x1d,0x1d,0x00,0x1d,0x1e,0x1e,0x00,0x1e,0x1f,0x1f,0x00,0x1f,0x20,0x20,0x00,0x20,0x21,0x21,0x00,0x21,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,\n\t0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,\n\t0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x38,0x39,0x00,0x3a,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,0x3c,0x3b,0x3c,0x00,0x3d,0x3c,0x3d,0x00,\n\t0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,\n\t0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,\n\t0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x66,0x65,0x00,0x66,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,\n\t0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,\n\t0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,\n\t0x7b,0x7c,0x7b,0x00,0x7c,0x7d,0x7c,0x00,0x7d,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,\n\t0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8c,0x8a,0x00,\n\t0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,\n\t0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9b,0x99,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,\n\t0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,\n\t0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,\n\t0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,\n\t0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,\n\t0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,\n\t0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,\n\t0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,\n\t0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe1,0xe0,0xde,0x00,0xe2,0xe1,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,\n\t0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,\n\t0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,\n\t0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,\n\t0xff,0xff,0xfc,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,\n\t0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,\n\t0x61,0x61,0x60,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x67,0x66,0x00,0x67,0x68,0x67,0x00,0x69,0x69,0x68,0x00,\n\t0x6a,0x6a,0x69,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,\n\t0x72,0x73,0x72,0x00,0x74,0x74,0x73,0x00,0x75,0x75,0x74,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,\n\t0x7b,0x7c,0x7b,0x00,0x7c,0x7d,0x7c,0x00,0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,\n\t0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8c,0x8c,0x8a,0x00,\n\t0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,\n\t0x95,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,\n\t0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,\n\t0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xb0,0xae,0x00,\n\t0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,\n\t0xb9,0xb9,0xb7,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,\n\t0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,\n\t0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,\n\t0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,\n\t0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe2,0xe1,0xdf,0x00,0xe3,0xe2,0xe0,0x00,0xe4,0xe4,0xe1,0x00,\n\t0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,\n\t0xee,0xed,0xea,0x00,0xef,0xee,0xec,0x00,0xf0,0xef,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,\n\t0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,\n\t0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,\n\t0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,\n\t0x61,0x61,0x60,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x68,0x67,0x00,0x68,0x69,0x68,0x00,\n\t0x6a,0x6a,0x69,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,\n\t0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,0x75,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,\n\t0x7b,0x7c,0x7b,0x00,0x7c,0x7d,0x7c,0x00,0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x80,0x81,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,\n\t0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,\n\t0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,\n\t0x95,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,\n\t0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,\n\t0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,\n\t0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,\n\t0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,\n\t0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,\n\t0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,\n\t0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,\n\t0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe3,0xe2,0xe0,0x00,0xe4,0xe3,0xe1,0x00,\n\t0xe5,0xe4,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,\n\t0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,0xf0,0xef,0xed,0x00,0xf1,0xf0,0xee,0x00,0xf2,0xf1,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,\n\t0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,\n\t0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,\n\t0x24,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,\n\t0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x60,0x60,0x5f,0x00,\n\t0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x69,0x68,0x00,\n\t0x69,0x6a,0x69,0x00,0x6b,0x6b,0x6a,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x72,0x71,0x00,\n\t0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7b,0x79,0x00,\n\t0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x80,0x81,0x80,0x00,0x81,0x82,0x81,0x00,0x83,0x84,0x82,0x00,\n\t0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,\n\t0x8c,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,\n\t0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9e,0x9c,0x00,\n\t0x9e,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa7,0xa5,0x00,\n\t0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,\n\t0xb0,0xb0,0xae,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,\n\t0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,\n\t0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xca,0xca,0xc7,0x00,\n\t0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,\n\t0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,\n\t0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe4,0xe3,0xe1,0x00,\n\t0xe5,0xe4,0xe2,0x00,0xe6,0xe5,0xe3,0x00,0xe7,0xe6,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,\n\t0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf0,0xee,0x00,0xf2,0xf1,0xef,0x00,0xf3,0xf2,0xf0,0x00,0xf4,0xf3,0xf1,0x00,0xf5,0xf5,0xf2,0x00,\n\t0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfb,0x00,\n\t0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,\n\t0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,\n\t0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,\n\t0x69,0x6a,0x69,0x00,0x6a,0x6b,0x6a,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,\n\t0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,\n\t0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,\n\t0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,\n\t0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,\n\t0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,\n\t0x9e,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,\n\t0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,\n\t0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,\n\t0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,\n\t0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,\n\t0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,\n\t0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,\n\t0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,\n\t0xe5,0xe4,0xe2,0x00,0xe6,0xe5,0xe3,0x00,0xe7,0xe6,0xe4,0x00,0xe8,0xe7,0xe5,0x00,0xe9,0xe8,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,\n\t0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,0xf2,0xf1,0xef,0x00,0xf3,0xf2,0xf0,0x00,0xf4,0xf3,0xf1,0x00,0xf5,0xf4,0xf2,0x00,\n\t0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,\n\t0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x14,0x14,0x14,0x00,\n\t0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1b,0x1c,0x1d,0x00,0x1c,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,\n\t0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,\n\t0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,\n\t0x69,0x69,0x69,0x00,0x6a,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,\n\t0x72,0x72,0x72,0x00,0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,\n\t0x7b,0x7b,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,\n\t0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,\n\t0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,\n\t0x95,0x95,0x93,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,\n\t0x9e,0x9e,0x9c,0x00,0x9f,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,\n\t0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,\n\t0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,\n\t0xb8,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,\n\t0xc1,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,\n\t0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,\n\t0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,\n\t0xdb,0xdb,0xd9,0x00,0xdd,0xdc,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,\n\t0xe4,0xe4,0xe2,0x00,0xe6,0xe5,0xe3,0x00,0xe7,0xe6,0xe4,0x00,0xe8,0xe7,0xe5,0x00,0xe9,0xe8,0xe6,0x00,0xea,0xe9,0xe7,0x00,0xeb,0xea,0xe8,0x00,0xec,0xeb,0xe9,0x00,\n\t0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xf0,0x00,0xf4,0xf3,0xf1,0x00,0xf5,0xf4,0xf2,0x00,\n\t0xf6,0xf5,0xf3,0x00,0xf7,0xf6,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,\n\t0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfd,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1b,0x1c,0x1d,0x00,0x1c,0x1d,0x1e,0x00,0x1d,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,\n\t0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,\n\t0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x63,0x62,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,\n\t0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6c,0x6b,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,\n\t0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,\n\t0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,\n\t0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,\n\t0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,\n\t0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,\n\t0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,\n\t0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,\n\t0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,\n\t0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,\n\t0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,\n\t0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,\n\t0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,\n\t0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xde,0xdd,0xdb,0x00,0xdf,0xde,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,\n\t0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe7,0xe6,0xe4,0x00,0xe8,0xe7,0xe5,0x00,0xe9,0xe8,0xe6,0x00,0xea,0xe9,0xe7,0x00,0xeb,0xea,0xe8,0x00,0xec,0xeb,0xe9,0x00,\n\t0xed,0xec,0xea,0x00,0xee,0xed,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xf1,0x00,0xf5,0xf4,0xf2,0x00,\n\t0xf6,0xf5,0xf3,0x00,0xf7,0xf6,0xf4,0x00,0xf8,0xf7,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,\n\t0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfd,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1b,0x1c,0x1d,0x00,0x1c,0x1d,0x1e,0x00,0x1d,0x1e,0x1f,0x00,0x1e,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,\n\t0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x34,0x34,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x57,0x57,0x57,0x00,\n\t0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x64,0x63,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,\n\t0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6d,0x6c,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,\n\t0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,\n\t0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,\n\t0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x88,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,\n\t0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,\n\t0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,\n\t0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,\n\t0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,\n\t0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,\n\t0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc1,0xbf,0x00,\n\t0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,\n\t0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xd0,0x00,\n\t0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,\n\t0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xdf,0xde,0xdc,0x00,0xe0,0xdf,0xdd,0x00,0xe1,0xe0,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe1,0x00,\n\t0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,0xe8,0xe7,0xe5,0x00,0xe9,0xe8,0xe6,0x00,0xea,0xe9,0xe7,0x00,0xeb,0xea,0xe8,0x00,0xec,0xeb,0xe9,0x00,\n\t0xed,0xec,0xea,0x00,0xee,0xed,0xeb,0x00,0xef,0xee,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf5,0xf4,0xf2,0x00,\n\t0xf6,0xf5,0xf3,0x00,0xf7,0xf6,0xf4,0x00,0xf8,0xf7,0xf5,0x00,0xf9,0xf8,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,\n\t0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1b,0x1c,0x1d,0x00,0x1c,0x1d,0x1e,0x00,0x1d,0x1e,0x1f,0x00,0x1e,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,\n\t0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,\n\t0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,\n\t0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,\n\t0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,\n\t0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,\n\t0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x88,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,\n\t0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,\n\t0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,\n\t0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,\n\t0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,\n\t0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,\n\t0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,\n\t0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,\n\t0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,\n\t0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,\n\t0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,0xe0,0xdf,0xdd,0x00,0xe1,0xe0,0xde,0x00,0xe2,0xe1,0xdf,0x00,0xe3,0xe2,0xe0,0x00,\n\t0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe9,0xe8,0xe6,0x00,0xea,0xe9,0xe7,0x00,0xeb,0xea,0xe8,0x00,0xec,0xeb,0xe9,0x00,\n\t0xed,0xec,0xea,0x00,0xee,0xed,0xeb,0x00,0xef,0xee,0xec,0x00,0xf0,0xef,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,\n\t0xf6,0xf5,0xf3,0x00,0xf7,0xf6,0xf4,0x00,0xf8,0xf7,0xf5,0x00,0xf9,0xf8,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,\n\t0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1b,0x1c,0x1d,0x00,0x1c,0x1d,0x1e,0x00,0x1d,0x1e,0x1f,0x00,0x1e,0x1f,0x20,0x00,0x1f,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,\n\t0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,\n\t0x35,0x34,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,\n\t0x57,0x57,0x57,0x00,0x58,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,\n\t0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,\n\t0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,\n\t0x7a,0x7b,0x7a,0x00,0x7b,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,\n\t0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,\n\t0x8c,0x8c,0x8a,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,\n\t0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,\n\t0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,\n\t0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,\n\t0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,\n\t0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,\n\t0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,\n\t0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,\n\t0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,\n\t0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe2,0xe1,0xdf,0x00,0xe3,0xe2,0xe0,0x00,\n\t0xe4,0xe3,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xeb,0xea,0xe8,0x00,0xec,0xeb,0xe9,0x00,\n\t0xed,0xec,0xea,0x00,0xee,0xed,0xeb,0x00,0xef,0xee,0xec,0x00,0xf0,0xef,0xed,0x00,0xf1,0xf0,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,\n\t0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf5,0x00,0xf9,0xf8,0xf6,0x00,0xfa,0xf9,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,\n\t0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1b,0x1c,0x1d,0x00,0x1c,0x1d,0x1e,0x00,0x1d,0x1e,0x1f,0x00,0x1e,0x1f,0x20,0x00,0x1f,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,\n\t0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,\n\t0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,\n\t0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,\n\t0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,\n\t0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,\n\t0x7a,0x7b,0x7a,0x00,0x7b,0x7c,0x7b,0x00,0x7c,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,\n\t0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,\n\t0x8c,0x8c,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,\n\t0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,\n\t0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,\n\t0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,\n\t0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,\n\t0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,\n\t0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,\n\t0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,\n\t0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,\n\t0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe3,0xe2,0xe0,0x00,\n\t0xe4,0xe3,0xe1,0x00,0xe5,0xe4,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xec,0xeb,0xe9,0x00,\n\t0xed,0xec,0xea,0x00,0xee,0xed,0xeb,0x00,0xef,0xee,0xec,0x00,0xf0,0xef,0xed,0x00,0xf1,0xf0,0xee,0x00,0xf2,0xf1,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,\n\t0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf7,0x00,0xfb,0xfa,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,\n\t0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1b,0x1c,0x1d,0x00,0x1c,0x1d,0x1e,0x00,0x1d,0x1e,0x1f,0x00,0x1e,0x1f,0x20,0x00,0x1f,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,\n\t0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,\n\t0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,\n\t0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x68,0x68,0x68,0x00,\n\t0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x71,0x71,0x71,0x00,\n\t0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x7a,0x79,0x00,\n\t0x7a,0x7b,0x7a,0x00,0x7b,0x7c,0x7b,0x00,0x7c,0x7d,0x7c,0x00,0x7d,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x83,0x81,0x00,\n\t0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,\n\t0x8c,0x8c,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x93,0x91,0x00,0x94,0x94,0x92,0x00,\n\t0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x9a,0x00,0x9d,0x9d,0x9b,0x00,\n\t0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,\n\t0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xaf,0xad,0x00,\n\t0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb8,0xb6,0x00,\n\t0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,\n\t0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,\n\t0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,\n\t0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd7,0xd8,0xd5,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,\n\t0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,\n\t0xe4,0xe3,0xe1,0x00,0xe5,0xe4,0xe2,0x00,0xe6,0xe5,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,\n\t0xec,0xec,0xea,0x00,0xee,0xed,0xeb,0x00,0xef,0xee,0xec,0x00,0xf0,0xef,0xed,0x00,0xf1,0xf0,0xee,0x00,0xf2,0xf1,0xef,0x00,0xf3,0xf2,0xf0,0x00,0xf4,0xf4,0xf1,0x00,\n\t0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf9,0x00,0xfd,0xfd,0xfa,0x00,\n\t0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1b,0x1c,0x1d,0x00,0x1c,0x1d,0x1e,0x00,0x1d,0x1e,0x1f,0x00,0x1e,0x1f,0x20,0x00,0x1f,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,\n\t0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,\n\t0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4d,0x4d,0x00,0x4d,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,\n\t0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x68,0x68,0x68,0x00,\n\t0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,\n\t0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,\n\t0x7a,0x7b,0x7a,0x00,0x7b,0x7c,0x7b,0x00,0x7c,0x7d,0x7c,0x00,0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,\n\t0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,\n\t0x8c,0x8c,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,\n\t0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,\n\t0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa6,0xa4,0x00,\n\t0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xaf,0xad,0x00,\n\t0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,\n\t0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,\n\t0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,\n\t0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,\n\t0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd8,0xd5,0x00,0xd8,0xd9,0xd6,0x00,0xd9,0xda,0xd7,0x00,\n\t0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,\n\t0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe6,0xe5,0xe3,0x00,0xe7,0xe6,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,\n\t0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf1,0xf0,0xee,0x00,0xf2,0xf1,0xef,0x00,0xf3,0xf2,0xf0,0x00,0xf4,0xf4,0xf1,0x00,\n\t0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,\n\t0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1b,0x1c,0x1d,0x00,0x1c,0x1d,0x1e,0x00,0x1d,0x1e,0x1f,0x00,0x1e,0x1f,0x20,0x00,0x1f,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,\n\t0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,\n\t0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x38,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4e,0x4e,0x00,\n\t0x4e,0x4f,0x4f,0x00,0x4f,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,\n\t0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,\n\t0x71,0x71,0x71,0x00,0x72,0x73,0x72,0x00,0x74,0x74,0x73,0x00,0x75,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x79,0x00,\n\t0x7a,0x7a,0x7a,0x00,0x7b,0x7c,0x7b,0x00,0x7c,0x7d,0x7c,0x00,0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,\n\t0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,\n\t0x8c,0x8c,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,\n\t0x94,0x94,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9b,0x00,\n\t0x9d,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa6,0xa4,0x00,\n\t0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,\n\t0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,\n\t0xb7,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,\n\t0xc0,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,\n\t0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,\n\t0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd9,0xd6,0x00,0xd9,0xda,0xd7,0x00,\n\t0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,\n\t0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe7,0xe6,0xe4,0x00,0xe8,0xe7,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,\n\t0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf3,0xf2,0xf0,0x00,0xf4,0xf3,0xf1,0x00,\n\t0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,\n\t0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1c,0x1d,0x00,0x1c,0x1d,0x1e,0x00,0x1d,0x1e,0x1f,0x00,0x1e,0x1f,0x20,0x00,0x1f,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,\n\t0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,\n\t0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x38,0x39,0x00,0x3a,0x39,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x45,0x45,0x00,\n\t0x45,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4e,0x4e,0x00,\n\t0x4e,0x4f,0x4f,0x00,0x4f,0x50,0x50,0x00,0x50,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,\n\t0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,\n\t0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x74,0x73,0x00,0x75,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,\n\t0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x80,0x81,0x80,0x00,0x82,0x82,0x81,0x00,\n\t0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,\n\t0x8b,0x8c,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,\n\t0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9b,0x00,\n\t0x9d,0x9d,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa4,0x00,\n\t0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,\n\t0xaf,0xaf,0xad,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,\n\t0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,\n\t0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,\n\t0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,\n\t0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xda,0xd7,0x00,\n\t0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,\n\t0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe9,0xe8,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,\n\t0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,\n\t0xf5,0xf4,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,\n\t0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1c,0x1d,0x00,0x1c,0x1d,0x1e,0x00,0x1d,0x1e,0x1f,0x00,0x1e,0x1f,0x20,0x00,0x1f,0x20,0x21,0x00,0x20,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,\n\t0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,\n\t0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x38,0x39,0x00,0x3a,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x46,0x46,0x00,0x46,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,\n\t0x4e,0x4f,0x4f,0x00,0x4f,0x50,0x50,0x00,0x50,0x51,0x51,0x00,0x51,0x52,0x52,0x00,0x52,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,\n\t0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,\n\t0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,\n\t0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x80,0x00,0x81,0x82,0x81,0x00,\n\t0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,\n\t0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x92,0x00,\n\t0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,\n\t0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,\n\t0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,\n\t0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,\n\t0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,\n\t0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,\n\t0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xcf,0xcc,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,\n\t0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,\n\t0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,\n\t0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xeb,0xeb,0xe8,0x00,\n\t0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,\n\t0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,\n\t0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1c,0x1d,0x00,0x1c,0x1d,0x1e,0x00,0x1d,0x1e,0x1f,0x00,0x1e,0x1f,0x20,0x00,0x1f,0x20,0x21,0x00,0x20,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,\n\t0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,\n\t0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x38,0x39,0x00,0x3a,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,0x3c,0x3b,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x46,0x46,0x00,0x46,0x47,0x47,0x00,0x47,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,\n\t0x4e,0x4f,0x4f,0x00,0x4f,0x50,0x50,0x00,0x50,0x51,0x51,0x00,0x51,0x52,0x52,0x00,0x52,0x53,0x53,0x00,0x53,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,\n\t0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,\n\t0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,\n\t0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,\n\t0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,\n\t0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,\n\t0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,\n\t0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,\n\t0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,\n\t0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,\n\t0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,\n\t0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,\n\t0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,\n\t0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,\n\t0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,\n\t0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,\n\t0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,\n\t0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,\n\t0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,\n\t0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,\n\t0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x47,0x47,0x00,0x47,0x48,0x48,0x00,0x48,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,\n\t0x4e,0x4e,0x4e,0x00,0x4f,0x50,0x50,0x00,0x50,0x51,0x51,0x00,0x51,0x52,0x52,0x00,0x52,0x53,0x53,0x00,0x53,0x54,0x54,0x00,0x54,0x55,0x55,0x00,0x56,0x56,0x56,0x00,\n\t0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,\n\t0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x79,0x79,0x78,0x00,\n\t0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,\n\t0x82,0x83,0x81,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,\n\t0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,\n\t0x94,0x94,0x92,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,\n\t0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,\n\t0xa6,0xa6,0xa4,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,\n\t0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,\n\t0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,\n\t0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,\n\t0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd1,0xce,0x00,\n\t0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,\n\t0xda,0xda,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,\n\t0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,\n\t0xeb,0xeb,0xe9,0x00,0xec,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,\n\t0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,\n\t0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,\n\t0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,\n\t0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x47,0x47,0x00,0x47,0x48,0x48,0x00,0x48,0x49,0x49,0x00,0x49,0x4a,0x4a,0x00,0x4a,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,\n\t0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x51,0x51,0x00,0x51,0x52,0x52,0x00,0x52,0x53,0x53,0x00,0x53,0x54,0x54,0x00,0x54,0x55,0x55,0x00,0x55,0x56,0x56,0x00,\n\t0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,\n\t0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,\n\t0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,\n\t0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,\n\t0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,\n\t0x94,0x94,0x92,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,\n\t0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,\n\t0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,\n\t0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,\n\t0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,\n\t0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,\n\t0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,\n\t0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,\n\t0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,0xe1,0xe2,0xdf,0x00,\n\t0xe2,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,\n\t0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,\n\t0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,\n\t0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x23,0x22,0x23,0x00,\n\t0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,\n\t0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x48,0x48,0x00,0x48,0x49,0x49,0x00,0x49,0x4a,0x4a,0x00,0x4a,0x4b,0x4b,0x00,0x4b,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,\n\t0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x52,0x52,0x00,0x52,0x53,0x53,0x00,0x53,0x54,0x54,0x00,0x54,0x55,0x55,0x00,0x55,0x56,0x56,0x00,\n\t0x56,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x70,0x70,0x70,0x00,\n\t0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x79,0x78,0x00,\n\t0x79,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x82,0x80,0x00,\n\t0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,\n\t0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x92,0x90,0x00,0x93,0x93,0x91,0x00,\n\t0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,\n\t0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,\n\t0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,\n\t0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb7,0xb5,0x00,\n\t0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,\n\t0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,\n\t0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,\n\t0xd1,0xd1,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,\n\t0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,0xe1,0xe2,0xdf,0x00,\n\t0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,\n\t0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xef,0xec,0x00,0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,\n\t0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf8,0x00,0xfc,0xfc,0xf9,0x00,\n\t0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x23,0x22,0x23,0x00,\n\t0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,\n\t0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3f,0x3f,0x00,0x3f,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x48,0x48,0x00,0x48,0x49,0x49,0x00,0x49,0x4a,0x4a,0x00,0x4a,0x4b,0x4b,0x00,0x4b,0x4c,0x4c,0x00,0x4c,0x4d,0x4d,0x00,\n\t0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x53,0x53,0x00,0x53,0x54,0x54,0x00,0x54,0x55,0x55,0x00,0x55,0x56,0x56,0x00,\n\t0x56,0x57,0x57,0x00,0x57,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,\n\t0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,\n\t0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,\n\t0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,\n\t0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9b,0x99,0x00,0x9b,0x9c,0x9a,0x00,\n\t0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,\n\t0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,\n\t0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,\n\t0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,\n\t0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,\n\t0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,\n\t0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd7,0xd8,0xd5,0x00,0xd8,0xd9,0xd6,0x00,\n\t0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,0xe1,0xe2,0xdf,0x00,\n\t0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,\n\t0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,\n\t0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,\n\t0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x23,0x22,0x23,0x00,\n\t0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,\n\t0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x40,0x40,0x00,0x40,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x49,0x49,0x00,0x49,0x4a,0x4a,0x00,0x4a,0x4b,0x4b,0x00,0x4b,0x4c,0x4c,0x00,0x4c,0x4d,0x4d,0x00,\n\t0x4d,0x4e,0x4e,0x00,0x4e,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x54,0x54,0x00,0x54,0x55,0x55,0x00,0x55,0x56,0x56,0x00,\n\t0x56,0x57,0x57,0x00,0x57,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,\n\t0x70,0x70,0x70,0x00,0x71,0x72,0x71,0x00,0x73,0x73,0x72,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,\n\t0x79,0x79,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,\n\t0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,\n\t0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9c,0x9a,0x00,\n\t0x9c,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,\n\t0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,\n\t0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,\n\t0xb6,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,\n\t0xbf,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,\n\t0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,\n\t0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd7,0xd8,0xd5,0x00,0xd8,0xd9,0xd6,0x00,\n\t0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,0xe1,0xe2,0xdf,0x00,\n\t0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,\n\t0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf2,0xf3,0xf0,0x00,\n\t0xf3,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,\n\t0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,\n\t0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,\n\t0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x40,0x40,0x00,0x40,0x41,0x41,0x00,0x41,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x49,0x49,0x00,0x49,0x4a,0x4a,0x00,0x4a,0x4b,0x4b,0x00,0x4b,0x4c,0x4c,0x00,0x4c,0x4d,0x4d,0x00,\n\t0x4d,0x4e,0x4e,0x00,0x4e,0x4f,0x4f,0x00,0x4f,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x55,0x55,0x00,0x55,0x56,0x56,0x00,\n\t0x56,0x57,0x57,0x00,0x57,0x58,0x58,0x00,0x58,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,\n\t0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x73,0x72,0x00,0x74,0x74,0x73,0x00,0x75,0x75,0x74,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,\n\t0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,\n\t0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,\n\t0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9c,0x9a,0x00,\n\t0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,\n\t0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,\n\t0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,\n\t0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,\n\t0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,\n\t0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,\n\t0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd7,0xd8,0xd5,0x00,0xd8,0xd9,0xd6,0x00,\n\t0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe1,0xde,0x00,0xe1,0xe2,0xdf,0x00,\n\t0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,\n\t0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf2,0xf3,0xf0,0x00,\n\t0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,\n\t0xfc,0xfc,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfc,0x00,\n\t0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,\n\t0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x33,0x33,0x00,\n\t0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x41,0x41,0x00,0x41,0x42,0x42,0x00,0x42,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x4a,0x4a,0x00,0x4a,0x4b,0x4b,0x00,0x4b,0x4c,0x4c,0x00,0x4c,0x4d,0x4d,0x00,\n\t0x4d,0x4e,0x4e,0x00,0x4e,0x4f,0x4f,0x00,0x4f,0x50,0x50,0x00,0x50,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x56,0x56,0x00,\n\t0x56,0x57,0x57,0x00,0x57,0x58,0x58,0x00,0x58,0x59,0x59,0x00,0x59,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,\n\t0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x74,0x73,0x00,0x75,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x78,0x00,\n\t0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,\n\t0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x89,0x87,0x00,0x8a,0x8a,0x89,0x00,\n\t0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,\n\t0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,\n\t0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xae,0xac,0x00,\n\t0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,\n\t0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,\n\t0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,\n\t0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xce,0xcb,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,\n\t0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd7,0xd8,0xd5,0x00,0xd8,0xd9,0xd6,0x00,\n\t0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdc,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe2,0xdf,0x00,\n\t0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,\n\t0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf3,0xf0,0x00,\n\t0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,\n\t0xfc,0xfc,0xf9,0x00,0xfc,0xfc,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfc,0x00,\n\t0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,\n\t0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,\n\t0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x41,0x41,0x00,0x41,0x42,0x42,0x00,0x42,0x43,0x43,0x00,0x43,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x4a,0x4a,0x00,0x4a,0x4b,0x4b,0x00,0x4b,0x4c,0x4c,0x00,0x4c,0x4d,0x4d,0x00,\n\t0x4d,0x4e,0x4e,0x00,0x4e,0x4f,0x4f,0x00,0x4f,0x50,0x50,0x00,0x50,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,\n\t0x56,0x57,0x57,0x00,0x57,0x58,0x58,0x00,0x58,0x59,0x59,0x00,0x59,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,\n\t0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x75,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,\n\t0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,\n\t0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,\n\t0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x97,0x95,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,\n\t0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,\n\t0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,\n\t0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,\n\t0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,\n\t0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,\n\t0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xce,0xcb,0x00,0xce,0xcf,0xcc,0x00,0xcf,0xd0,0xcd,0x00,\n\t0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd7,0xd8,0xd5,0x00,0xd8,0xd9,0xd6,0x00,\n\t0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,\n\t0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,\n\t0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,\n\t0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,\n\t0xfc,0xfc,0xf9,0x00,0xfc,0xfc,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfc,0x00,\n\t0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x13,0x13,0x13,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,\n\t0x23,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,\n\t0x34,0x33,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x42,0x42,0x00,0x42,0x43,0x43,0x00,0x43,0x44,0x44,0x00,\n\t0x44,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4b,0x4b,0x00,0x4b,0x4c,0x4c,0x00,0x4c,0x4d,0x4d,0x00,\n\t0x4d,0x4e,0x4e,0x00,0x4e,0x4f,0x4f,0x00,0x4f,0x50,0x50,0x00,0x50,0x51,0x51,0x00,0x51,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,\n\t0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x59,0x59,0x00,0x59,0x5a,0x5a,0x00,0x5a,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,\n\t0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,\n\t0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,\n\t0x79,0x79,0x78,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,\n\t0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,\n\t0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x98,0x96,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,\n\t0x9c,0x9c,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa5,0xa3,0x00,\n\t0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,\n\t0xad,0xae,0xac,0x00,0xae,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,\n\t0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,\n\t0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,\n\t0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xce,0xcb,0x00,0xce,0xcf,0xcc,0x00,0xcf,0xd0,0xcd,0x00,\n\t0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd7,0xd8,0xd5,0x00,0xd8,0xd9,0xd6,0x00,\n\t0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,\n\t0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,\n\t0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,\n\t0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,\n\t0xfc,0xfc,0xf9,0x00,0xfc,0xfc,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfc,0x00,\n\t0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,\n\t0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,\n\t0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x42,0x00,0x42,0x43,0x43,0x00,0x43,0x44,0x44,0x00,\n\t0x44,0x45,0x45,0x00,0x45,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4c,0x4c,0x00,0x4c,0x4d,0x4d,0x00,\n\t0x4d,0x4e,0x4e,0x00,0x4e,0x4f,0x4f,0x00,0x4f,0x50,0x50,0x00,0x50,0x51,0x51,0x00,0x51,0x52,0x52,0x00,0x52,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,\n\t0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5b,0x5b,0x00,0x5b,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,\n\t0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,\n\t0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,\n\t0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,\n\t0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,\n\t0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x98,0x96,0x00,0x98,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,\n\t0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,\n\t0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,\n\t0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,0xaf,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,\n\t0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,\n\t0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,\n\t0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xcf,0xcc,0x00,0xcf,0xd0,0xcd,0x00,\n\t0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd8,0xd5,0x00,0xd8,0xd9,0xd6,0x00,\n\t0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,\n\t0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,0xe6,0xe7,0xe4,0x00,0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,\n\t0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,0xef,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,\n\t0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf8,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,\n\t0xfc,0xfc,0xf9,0x00,0xfc,0xfc,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfc,0x00,\n\t0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,\n\t0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,\n\t0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x43,0x00,0x43,0x44,0x44,0x00,\n\t0x44,0x45,0x45,0x00,0x45,0x46,0x46,0x00,0x46,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4d,0x4d,0x00,\n\t0x4d,0x4e,0x4e,0x00,0x4e,0x4f,0x4f,0x00,0x4f,0x50,0x50,0x00,0x50,0x51,0x51,0x00,0x51,0x52,0x52,0x00,0x52,0x53,0x53,0x00,0x53,0x54,0x54,0x00,0x55,0x55,0x55,0x00,\n\t0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,\n\t0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,\n\t0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x78,0x78,0x77,0x00,\n\t0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x81,0x81,0x80,0x00,\n\t0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,\n\t0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x99,0x97,0x00,0x99,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,\n\t0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,\n\t0xa5,0xa5,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,\n\t0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb6,0xb4,0x00,\n\t0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,\n\t0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,\n\t0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xd0,0xcd,0x00,\n\t0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd9,0xd6,0x00,\n\t0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,\n\t0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,\n\t0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,\n\t0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,\n\t0xfc,0xfc,0xf9,0x00,0xfc,0xfc,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfc,0x00,\n\t0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,\n\t0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,\n\t0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x43,0x00,0x43,0x44,0x44,0x00,\n\t0x44,0x45,0x45,0x00,0x45,0x46,0x46,0x00,0x46,0x47,0x47,0x00,0x47,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,\n\t0x4d,0x4e,0x4e,0x00,0x4e,0x4f,0x4f,0x00,0x4f,0x50,0x50,0x00,0x50,0x51,0x51,0x00,0x51,0x52,0x52,0x00,0x52,0x53,0x53,0x00,0x53,0x54,0x54,0x00,0x55,0x55,0x55,0x00,\n\t0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,\n\t0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,\n\t0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,\n\t0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,\n\t0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,\n\t0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x99,0x97,0x00,0x99,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,\n\t0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa2,0x00,0xa3,0xa4,0xa3,0x00,\n\t0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,\n\t0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,\n\t0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,\n\t0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,\n\t0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xd0,0xcd,0x00,\n\t0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,\n\t0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,\n\t0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,\n\t0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,\n\t0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,\n\t0xfc,0xfc,0xf9,0x00,0xfc,0xfc,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,\n\t0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,\n\t0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,\n\t0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x44,0x00,\n\t0x44,0x45,0x45,0x00,0x45,0x46,0x46,0x00,0x46,0x47,0x47,0x00,0x47,0x48,0x48,0x00,0x48,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4d,0x00,\n\t0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x50,0x50,0x00,0x50,0x51,0x51,0x00,0x51,0x52,0x52,0x00,0x52,0x53,0x53,0x00,0x53,0x54,0x54,0x00,0x54,0x55,0x55,0x00,\n\t0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,\n\t0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,\n\t0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,\n\t0x6f,0x6f,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,\n\t0x78,0x78,0x78,0x00,0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,\n\t0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,\n\t0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x9a,0x98,0x00,0x9a,0x9b,0x9a,0x00,\n\t0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa3,0x00,\n\t0xa4,0xa5,0xa4,0x00,0xa5,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,\n\t0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,\n\t0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,\n\t0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,\n\t0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,\n\t0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd4,0x00,0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,\n\t0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,\n\t0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,\n\t0xe9,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,\n\t0xf2,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,\n\t0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xf9,0x00,0xfc,0xfc,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,\n\t0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,\n\t0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,\n\t0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x38,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x44,0x00,\n\t0x44,0x44,0x45,0x00,0x45,0x46,0x46,0x00,0x46,0x47,0x47,0x00,0x47,0x48,0x48,0x00,0x48,0x49,0x49,0x00,0x49,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4d,0x00,\n\t0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x52,0x52,0x00,0x52,0x53,0x53,0x00,0x53,0x54,0x54,0x00,0x54,0x55,0x55,0x00,\n\t0x55,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,\n\t0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,\n\t0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6f,0x00,\n\t0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,\n\t0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,\n\t0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,\n\t0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9b,0x9a,0x00,\n\t0x9b,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa3,0x00,\n\t0xa4,0xa5,0xa4,0x00,0xa5,0xa6,0xa5,0x00,0xa6,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,\n\t0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,\n\t0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,\n\t0xbe,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc7,0xc5,0x00,\n\t0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,\n\t0xd0,0xd0,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,\n\t0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,\n\t0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,\n\t0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xef,0xec,0x00,0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,\n\t0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,\n\t0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,\n\t0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,\n\t0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,\n\t0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x38,0x39,0x00,0x3a,0x39,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,\n\t0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x47,0x47,0x00,0x47,0x48,0x48,0x00,0x48,0x49,0x49,0x00,0x49,0x4a,0x4a,0x00,0x4a,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,\n\t0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x54,0x54,0x00,0x54,0x55,0x55,0x00,\n\t0x55,0x56,0x56,0x00,0x56,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,\n\t0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,\n\t0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,\n\t0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,\n\t0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x80,0x00,\n\t0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,\n\t0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,\n\t0x9b,0x9c,0x9b,0x00,0x9c,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa4,0xa2,0x00,\n\t0xa4,0xa5,0xa4,0x00,0xa5,0xa6,0xa5,0x00,0xa6,0xa7,0xa6,0x00,0xa7,0xa8,0xa7,0x00,0xa8,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,\n\t0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb4,0x00,\n\t0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,\n\t0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc5,0x00,\n\t0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,\n\t0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd7,0xd8,0xd6,0x00,\n\t0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,\n\t0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe7,0x00,\n\t0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,\n\t0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf8,0x00,\n\t0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,\n\t0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,\n\t0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,\n\t0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x38,0x39,0x00,0x3a,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,\n\t0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x48,0x48,0x00,0x48,0x49,0x49,0x00,0x49,0x4a,0x4a,0x00,0x4a,0x4b,0x4b,0x00,0x4b,0x4c,0x4c,0x00,\n\t0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,\n\t0x55,0x56,0x56,0x00,0x56,0x57,0x57,0x00,0x57,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,\n\t0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,\n\t0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,\n\t0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,\n\t0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,\n\t0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,\n\t0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,\n\t0x9b,0x9c,0x9b,0x00,0x9c,0x9d,0x9c,0x00,0x9d,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,\n\t0xa4,0xa5,0xa4,0x00,0xa5,0xa6,0xa5,0x00,0xa6,0xa7,0xa6,0x00,0xa7,0xa8,0xa7,0x00,0xa8,0xa9,0xa8,0x00,0xa9,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,\n\t0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,\n\t0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,\n\t0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,\n\t0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,\n\t0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd7,0xd8,0xd5,0x00,\n\t0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,\n\t0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,\n\t0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,0xec,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,\n\t0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,\n\t0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfb,0x00,\n\t0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1b,0x1b,0x1b,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1c,0x1b,0x1c,0x00,0x1d,0x1c,0x1d,0x00,0x1e,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,\n\t0x2b,0x2a,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,\n\t0x44,0x44,0x44,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x49,0x49,0x00,0x49,0x4a,0x4a,0x00,0x4a,0x4b,0x4b,0x00,0x4b,0x4c,0x4c,0x00,\n\t0x4c,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,\n\t0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x58,0x58,0x00,0x58,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,\n\t0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x66,0x00,\n\t0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,\n\t0x6f,0x6f,0x6f,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,\n\t0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,\n\t0x81,0x81,0x80,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x89,0x89,0x88,0x00,\n\t0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,\n\t0x92,0x92,0x91,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,\n\t0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9e,0x9d,0x00,0x9e,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,\n\t0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa7,0xa6,0x00,0xa7,0xa8,0xa7,0x00,0xa8,0xa9,0xa8,0x00,0xa9,0xaa,0xa9,0x00,0xaa,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,\n\t0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,\n\t0xb5,0xb6,0xb4,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbe,0xbc,0x00,\n\t0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,\n\t0xc7,0xc7,0xc5,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,\n\t0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd7,0xd8,0xd5,0x00,\n\t0xd8,0xd9,0xd6,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,\n\t0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,\n\t0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,0xec,0xed,0xeb,0x00,0xed,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,\n\t0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,\n\t0xfb,0xfb,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfb,0x00,\n\t0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1d,0x1c,0x1d,0x00,0x1e,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,\n\t0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,\n\t0x44,0x44,0x44,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4b,0x4b,0x00,0x4b,0x4c,0x4c,0x00,\n\t0x4c,0x4d,0x4d,0x00,0x4d,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,\n\t0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x5a,0x5a,0x00,0x5a,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,\n\t0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,\n\t0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,\n\t0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,\n\t0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,\n\t0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,\n\t0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,\n\t0x92,0x92,0x91,0x00,0x93,0x93,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,\n\t0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9f,0x9e,0x00,0x9f,0xa0,0x9f,0x00,0xa0,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,\n\t0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa9,0xa8,0x00,0xa9,0xaa,0xa9,0x00,0xaa,0xab,0xaa,0x00,0xab,0xac,0xab,0x00,\n\t0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,\n\t0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,\n\t0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,\n\t0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,\n\t0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd7,0xd8,0xd5,0x00,\n\t0xd8,0xd9,0xd6,0x00,0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,\n\t0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,\n\t0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xea,0x00,0xec,0xed,0xeb,0x00,0xed,0xee,0xec,0x00,0xee,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,\n\t0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,\n\t0xfb,0xfb,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfb,0x00,\n\t0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1e,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,\n\t0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,\n\t0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4c,0x4c,0x00,\n\t0x4c,0x4d,0x4d,0x00,0x4d,0x4e,0x4e,0x00,0x4e,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,\n\t0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,\n\t0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,\n\t0x66,0x66,0x66,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,\n\t0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x77,0x77,0x77,0x00,\n\t0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x80,0x80,0x7f,0x00,\n\t0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,\n\t0x89,0x89,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,\n\t0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,\n\t0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0xa0,0x9f,0x00,0xa0,0xa1,0xa0,0x00,0xa1,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,\n\t0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xab,0xaa,0x00,0xab,0xac,0xab,0x00,\n\t0xac,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb5,0xb3,0x00,\n\t0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,\n\t0xbe,0xbe,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,\n\t0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,\n\t0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd8,0xd5,0x00,\n\t0xd8,0xd9,0xd6,0x00,0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,\n\t0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,\n\t0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xeb,0x00,0xed,0xee,0xec,0x00,0xee,0xef,0xed,0x00,0xef,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,\n\t0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,\n\t0xfb,0xfb,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfb,0x00,\n\t0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,\n\t0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,\n\t0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,\n\t0x4c,0x4d,0x4d,0x00,0x4d,0x4e,0x4e,0x00,0x4e,0x4f,0x4f,0x00,0x4f,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,\n\t0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,\n\t0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,\n\t0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,\n\t0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,\n\t0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,\n\t0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,\n\t0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x94,0x00,0x95,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,\n\t0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa2,0xa1,0x00,0xa2,0xa3,0xa2,0x00,\n\t0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xac,0xab,0x00,\n\t0xac,0xad,0xac,0x00,0xad,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,\n\t0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,\n\t0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,\n\t0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,\n\t0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,0xd6,0xd7,0xd5,0x00,\n\t0xd8,0xd9,0xd6,0x00,0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,\n\t0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,\n\t0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xec,0x00,0xee,0xef,0xed,0x00,0xef,0xf0,0xee,0x00,0xf0,0xf1,0xef,0x00,\n\t0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,\n\t0xfb,0xfb,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,\n\t0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,\n\t0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,\n\t0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,\n\t0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4f,0x4f,0x00,0x4f,0x50,0x50,0x00,0x50,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,\n\t0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,\n\t0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,\n\t0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,\n\t0x6e,0x6e,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,\n\t0x77,0x77,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,\n\t0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,\n\t0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x95,0x00,0x96,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,\n\t0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,\n\t0xa3,0xa4,0xa3,0x00,0xa4,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,\n\t0xac,0xac,0xac,0x00,0xad,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,\n\t0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,\n\t0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,\n\t0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,\n\t0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,0xd6,0xd7,0xd5,0x00,\n\t0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,\n\t0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,\n\t0xe8,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xed,0x00,0xef,0xf0,0xee,0x00,0xf0,0xf1,0xef,0x00,\n\t0xf1,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,\n\t0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,\n\t0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,\n\t0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,\n\t0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,\n\t0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x51,0x51,0x00,0x51,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,\n\t0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,\n\t0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,\n\t0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,\n\t0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,\n\t0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,\n\t0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,\n\t0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,\n\t0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,\n\t0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,\n\t0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,\n\t0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,\n\t0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,\n\t0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,0xd6,0xd7,0xd5,0x00,\n\t0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,\n\t0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,\n\t0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,0xef,0xf0,0xee,0x00,0xf0,0xf1,0xef,0x00,\n\t0xf1,0xf2,0xf0,0x00,0xf2,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,\n\t0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,\n\t0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,\n\t0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x43,0x43,0x43,0x00,\n\t0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,\n\t0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x53,0x53,0x00,0x54,0x54,0x54,0x00,\n\t0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,\n\t0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,\n\t0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,\n\t0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x77,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x88,0x00,\n\t0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,\n\t0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x9a,0x9a,0x99,0x00,\n\t0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,\n\t0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,0xab,0xab,0xab,0x00,\n\t0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,\n\t0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbd,0xbd,0xbc,0x00,\n\t0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,\n\t0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xcf,0xcd,0x00,\n\t0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,0xd6,0xd7,0xd5,0x00,\n\t0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xde,0x00,\n\t0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,\n\t0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xf0,0xed,0x00,0xf0,0xf1,0xef,0x00,\n\t0xf1,0xf2,0xf0,0x00,0xf2,0xf3,0xf1,0x00,0xf3,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,\n\t0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,\n\t0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,\n\t0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,\n\t0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,\n\t0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,\n\t0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,\n\t0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,\n\t0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,\n\t0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,\n\t0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,\n\t0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,\n\t0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,\n\t0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,\n\t0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,\n\t0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,\n\t0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,\n\t0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,\n\t0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,0xd6,0xd7,0xd5,0x00,\n\t0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,\n\t0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,\n\t0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,\n\t0xf1,0xf2,0xf0,0x00,0xf2,0xf3,0xf1,0x00,0xf3,0xf4,0xf2,0x00,0xf4,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,\n\t0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,\n\t0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,\n\t0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,\n\t0x33,0x32,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,\n\t0x43,0x43,0x44,0x00,0x44,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,\n\t0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,\n\t0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,\n\t0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,\n\t0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,\n\t0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,\n\t0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,\n\t0x89,0x89,0x88,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,\n\t0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,\n\t0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,\n\t0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,\n\t0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,\n\t0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,\n\t0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,\n\t0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,\n\t0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,0xd6,0xd7,0xd5,0x00,\n\t0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,\n\t0xdf,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,\n\t0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,0xec,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,\n\t0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf3,0x00,0xf5,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,\n\t0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,\n\t0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,\n\t0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,\n\t0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,\n\t0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,\n\t0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,\n\t0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,\n\t0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,\n\t0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,\n\t0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,\n\t0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,\n\t0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,\n\t0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,\n\t0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,\n\t0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,\n\t0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,\n\t0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,\n\t0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,\n\t0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,\n\t0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,0xd6,0xd7,0xd5,0x00,\n\t0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,\n\t0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,\n\t0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,0xec,0xed,0xeb,0x00,0xed,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,\n\t0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,\n\t0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,\n\t0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,\n\t0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,\n\t0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,\n\t0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,\n\t0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,\n\t0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,\n\t0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x65,0x00,\n\t0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6e,0x00,\n\t0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,\n\t0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x88,0x88,0x87,0x00,\n\t0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x91,0x91,0x90,0x00,\n\t0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x99,0x00,\n\t0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa2,0x00,\n\t0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xab,0xab,0xaa,0x00,\n\t0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb2,0x00,0xb4,0xb4,0xb3,0x00,\n\t0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbd,0xbb,0x00,\n\t0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc6,0xc4,0x00,\n\t0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,\n\t0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd6,0xd4,0x00,0xd6,0xd7,0xd5,0x00,\n\t0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,\n\t0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe7,0xe4,0x00,0xe7,0xe8,0xe5,0x00,\n\t0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,0xec,0xed,0xeb,0x00,0xed,0xee,0xec,0x00,0xee,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,\n\t0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf9,0xf9,0xf7,0x00,\n\t0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,\n\t0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,\n\t0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,\n\t0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,\n\t0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,\n\t0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,\n\t0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,\n\t0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x65,0x00,\n\t0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,\n\t0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,\n\t0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x88,0x88,0x87,0x00,\n\t0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,\n\t0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x99,0x00,\n\t0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,\n\t0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xab,0xab,0xaa,0x00,\n\t0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,\n\t0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,\n\t0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,\n\t0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,\n\t0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,\n\t0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,\n\t0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,\n\t0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xeb,0x00,0xed,0xee,0xec,0x00,0xee,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,\n\t0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf8,0xf9,0xf6,0x00,\n\t0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,\n\t0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x12,0x12,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,\n\t0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,\n\t0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x37,0x38,0x38,0x00,0x38,0x39,0x39,0x00,0x39,0x3a,0x3a,0x00,\n\t0x3a,0x3b,0x3b,0x00,0x3b,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x43,0x00,\n\t0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4c,0x00,\n\t0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,\n\t0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,\n\t0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,\n\t0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,\n\t0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x76,0x76,0x76,0x00,\n\t0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7e,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,\n\t0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,\n\t0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,\n\t0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,\n\t0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,\n\t0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,\n\t0xb4,0xb4,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,\n\t0xbd,0xbd,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,\n\t0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,\n\t0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,\n\t0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,\n\t0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,\n\t0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xed,0x00,0xef,0xf0,0xee,0x00,\n\t0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf8,0xf9,0xf6,0x00,\n\t0xf9,0xfa,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,\n\t0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,\n\t0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,\n\t0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x39,0x39,0x00,0x39,0x3a,0x3a,0x00,\n\t0x3a,0x3b,0x3b,0x00,0x3b,0x3c,0x3c,0x00,0x3c,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x43,0x00,\n\t0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x4a,0x4a,0x00,0x4b,0x4b,0x4c,0x00,\n\t0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,\n\t0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,\n\t0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,\n\t0x65,0x65,0x65,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6d,0x6d,0x6d,0x00,\n\t0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x76,0x76,0x76,0x00,\n\t0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,\n\t0x88,0x88,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,\n\t0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,\n\t0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa2,0xa2,0xa1,0x00,\n\t0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,\n\t0xab,0xab,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,\n\t0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,\n\t0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,\n\t0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,\n\t0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd6,0xd6,0xd5,0x00,\n\t0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,\n\t0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,\n\t0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,0xef,0xf0,0xed,0x00,\n\t0xf0,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf9,0xf6,0x00,\n\t0xf9,0xfa,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,\n\t0xfc,0xfc,0xfb,0x00,0xfc,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,\n\t0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,\n\t0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x3a,0x3a,0x00,\n\t0x3a,0x3b,0x3b,0x00,0x3b,0x3c,0x3c,0x00,0x3c,0x3d,0x3d,0x00,0x3d,0x3e,0x3e,0x00,0x3e,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,\n\t0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4b,0x4b,0x00,\n\t0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,\n\t0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,\n\t0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,\n\t0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,\n\t0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,\n\t0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,\n\t0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x90,0x00,\n\t0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,\n\t0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,\n\t0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,\n\t0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,\n\t0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,\n\t0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,\n\t0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,\n\t0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,\n\t0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,\n\t0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,\n\t0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,0xef,0xf0,0xed,0x00,\n\t0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,\n\t0xf9,0xfa,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,\n\t0xfc,0xfc,0xfb,0x00,0xfc,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,\n\t0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,\n\t0x33,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,\n\t0x3a,0x3b,0x3b,0x00,0x3b,0x3c,0x3c,0x00,0x3c,0x3d,0x3d,0x00,0x3d,0x3e,0x3e,0x00,0x3e,0x3f,0x3f,0x00,0x3f,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,\n\t0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,\n\t0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,\n\t0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,\n\t0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,\n\t0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,\n\t0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,\n\t0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,\n\t0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,\n\t0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,\n\t0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,\n\t0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,\n\t0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,\n\t0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,\n\t0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,\n\t0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,\n\t0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,\n\t0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,\n\t0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xef,0xec,0x00,0xef,0xf0,0xed,0x00,\n\t0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,\n\t0xf9,0xfa,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,\n\t0xfc,0xfc,0xfb,0x00,0xfc,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,\n\t0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,\n\t0x2b,0x29,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x39,0x00,\n\t0x3a,0x3a,0x3a,0x00,0x3b,0x3c,0x3c,0x00,0x3c,0x3d,0x3d,0x00,0x3d,0x3e,0x3e,0x00,0x3e,0x3f,0x3f,0x00,0x3f,0x40,0x40,0x00,0x40,0x41,0x41,0x00,0x42,0x42,0x42,0x00,\n\t0x43,0x43,0x43,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,\n\t0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,\n\t0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x64,0x64,0x64,0x00,\n\t0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,\n\t0x6d,0x6d,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x76,0x00,\n\t0x76,0x76,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,\n\t0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,\n\t0x91,0x91,0x90,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x99,0x99,0x98,0x00,\n\t0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,\n\t0xa2,0xa2,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,\n\t0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,\n\t0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,\n\t0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,\n\t0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcd,0xcd,0xcc,0x00,\n\t0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,\n\t0xd6,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,\n\t0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,\n\t0xe7,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xf0,0xed,0x00,\n\t0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,\n\t0xf9,0xf9,0xf7,0x00,0xf9,0xfa,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfc,0xfa,0x00,\n\t0xfc,0xfc,0xfb,0x00,0xfc,0xfd,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,\n\t0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,\n\t0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,\n\t0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3d,0x3d,0x00,0x3d,0x3e,0x3e,0x00,0x3e,0x3f,0x3f,0x00,0x3f,0x40,0x40,0x00,0x40,0x41,0x41,0x00,0x41,0x42,0x42,0x00,\n\t0x43,0x43,0x43,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,\n\t0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,\n\t0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,\n\t0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,\n\t0x6d,0x6d,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,\n\t0x76,0x76,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,\n\t0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,\n\t0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,\n\t0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,\n\t0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,\n\t0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,\n\t0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,\n\t0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,\n\t0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,\n\t0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,\n\t0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,\n\t0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,\n\t0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,\n\t0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,\n\t0xf9,0xf9,0xf7,0x00,0xf9,0xfa,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfc,0xfa,0x00,\n\t0xfc,0xfc,0xfb,0x00,0xfc,0xfd,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,\n\t0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,\n\t0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,\n\t0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3e,0x3e,0x00,0x3e,0x3f,0x3f,0x00,0x3f,0x40,0x40,0x00,0x40,0x41,0x41,0x00,0x41,0x42,0x42,0x00,\n\t0x42,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,\n\t0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,\n\t0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,\n\t0x64,0x64,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6d,0x00,\n\t0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,\n\t0x76,0x76,0x76,0x00,0x77,0x77,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,\n\t0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x90,0x90,0x8f,0x00,\n\t0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,\n\t0x99,0x99,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa1,0x00,\n\t0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,\n\t0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb1,0x00,0xb3,0xb3,0xb2,0x00,\n\t0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbc,0xba,0x00,\n\t0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc5,0xc3,0x00,\n\t0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,\n\t0xcd,0xce,0xcc,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,\n\t0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,\n\t0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,\n\t0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,\n\t0xf0,0xf0,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf8,0xf8,0xf6,0x00,\n\t0xf9,0xf9,0xf7,0x00,0xf9,0xfa,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfc,0xfa,0x00,\n\t0xfc,0xfc,0xfb,0x00,0xfc,0xfd,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,\n\t0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,\n\t0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2e,0x2c,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,\n\t0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3f,0x3f,0x00,0x3f,0x40,0x40,0x00,0x40,0x41,0x41,0x00,0x41,0x42,0x42,0x00,\n\t0x42,0x43,0x43,0x00,0x43,0x44,0x44,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,\n\t0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,\n\t0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,\n\t0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,\n\t0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,\n\t0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,\n\t0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,\n\t0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,\n\t0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,\n\t0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,\n\t0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,\n\t0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,\n\t0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,\n\t0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,\n\t0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,\n\t0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xed,0x00,\n\t0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,\n\t0xf9,0xf9,0xf7,0x00,0xf9,0xfa,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfc,0xfa,0x00,\n\t0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x1a,0x1a,0x1a,0x00,\n\t0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,\n\t0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,\n\t0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2e,0x2c,0x2e,0x00,0x2f,0x2d,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x38,0x39,0x39,0x00,\n\t0x39,0x3a,0x3a,0x00,0x3a,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x40,0x40,0x00,0x40,0x41,0x41,0x00,0x41,0x42,0x42,0x00,\n\t0x42,0x43,0x43,0x00,0x43,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,\n\t0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,\n\t0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,\n\t0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,\n\t0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,\n\t0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,\n\t0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,\n\t0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,\n\t0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,\n\t0xb3,0xb3,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,\n\t0xbc,0xbc,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,\n\t0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,\n\t0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,\n\t0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,\n\t0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,\n\t0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,\n\t0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,\n\t0xf8,0xf9,0xf6,0x00,0xf9,0xfa,0xf7,0x00,0xf9,0xfa,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfc,0xfa,0x00,\n\t0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,\n\t0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,\n\t0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2e,0x2c,0x2e,0x00,0x2f,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x37,0x38,0x38,0x00,0x38,0x39,0x39,0x00,\n\t0x39,0x3a,0x3a,0x00,0x3a,0x3b,0x3b,0x00,0x3b,0x3c,0x3c,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x41,0x41,0x00,0x41,0x42,0x42,0x00,\n\t0x42,0x43,0x43,0x00,0x43,0x44,0x44,0x00,0x44,0x45,0x45,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,\n\t0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,\n\t0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,\n\t0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,\n\t0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,\n\t0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,\n\t0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,\n\t0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,\n\t0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,\n\t0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,\n\t0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,\n\t0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,\n\t0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,\n\t0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,\n\t0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,\n\t0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,\n\t0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,\n\t0xf8,0xf9,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xfa,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfc,0xfa,0x00,\n\t0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,\n\t0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,\n\t0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2e,0x2c,0x2e,0x00,0x2f,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x36,0x37,0x37,0x00,0x37,0x38,0x38,0x00,0x38,0x39,0x39,0x00,\n\t0x39,0x3a,0x3a,0x00,0x3a,0x3b,0x3b,0x00,0x3b,0x3c,0x3c,0x00,0x3c,0x3d,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x42,0x42,0x00,\n\t0x42,0x43,0x43,0x00,0x43,0x44,0x44,0x00,0x44,0x45,0x45,0x00,0x45,0x46,0x46,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,\n\t0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x64,0x00,\n\t0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,\n\t0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,\n\t0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x87,0x87,0x87,0x00,\n\t0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,\n\t0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x98,0x00,\n\t0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa8,0x00,0xaa,0xaa,0xa9,0x00,\n\t0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,\n\t0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,\n\t0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,\n\t0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,\n\t0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,\n\t0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,\n\t0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,\n\t0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,\n\t0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,\n\t0xf8,0xf9,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xfa,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,\n\t0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,\n\t0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,\n\t0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2e,0x2c,0x2e,0x00,0x2f,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x36,0x37,0x37,0x00,0x37,0x38,0x38,0x00,0x38,0x39,0x39,0x00,\n\t0x39,0x3a,0x3a,0x00,0x3a,0x3b,0x3b,0x00,0x3b,0x3c,0x3c,0x00,0x3c,0x3d,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,\n\t0x42,0x43,0x43,0x00,0x43,0x44,0x44,0x00,0x44,0x45,0x45,0x00,0x45,0x46,0x46,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,\n\t0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,\n\t0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,\n\t0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,\n\t0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,\n\t0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,\n\t0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,\n\t0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,\n\t0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,\n\t0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,\n\t0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,\n\t0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,\n\t0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,\n\t0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,\n\t0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,\n\t0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,\n\t0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,\n\t0xf8,0xf9,0xf6,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,\n\t0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,\n\t0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,\n\t0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2e,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x31,0x00,\n\t0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x35,0x36,0x36,0x00,0x36,0x37,0x37,0x00,0x37,0x38,0x38,0x00,0x38,0x39,0x39,0x00,\n\t0x39,0x3a,0x3a,0x00,0x3a,0x3b,0x3b,0x00,0x3b,0x3c,0x3c,0x00,0x3c,0x3d,0x3d,0x00,0x3d,0x3e,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,\n\t0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x45,0x45,0x00,0x45,0x46,0x46,0x00,0x46,0x47,0x47,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,\n\t0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,\n\t0x64,0x64,0x64,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,\n\t0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,\n\t0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,\n\t0x87,0x87,0x87,0x00,0x89,0x88,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,\n\t0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,\n\t0x99,0x99,0x98,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,\n\t0xaa,0xaa,0xa9,0x00,0xab,0xab,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,\n\t0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,\n\t0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,\n\t0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,\n\t0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,\n\t0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdb,0x00,\n\t0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,\n\t0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,\n\t0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,\n\t0xf8,0xf9,0xf6,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,\n\t0xfb,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,\n\t0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,\n\t0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2e,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,\n\t0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x35,0x35,0x00,0x35,0x36,0x36,0x00,0x36,0x37,0x37,0x00,0x37,0x38,0x38,0x00,0x38,0x39,0x39,0x00,\n\t0x39,0x3a,0x3a,0x00,0x3a,0x3b,0x3b,0x00,0x3b,0x3c,0x3c,0x00,0x3c,0x3d,0x3d,0x00,0x3d,0x3e,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,\n\t0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x46,0x46,0x00,0x46,0x47,0x47,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,\n\t0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x61,0x60,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,\n\t0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x6a,0x69,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,\n\t0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x73,0x72,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,\n\t0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,\n\t0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x8a,0x89,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,\n\t0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,\n\t0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,\n\t0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,\n\t0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,\n\t0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbc,0x00,0xbd,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,\n\t0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,\n\t0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,\n\t0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,\n\t0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,\n\t0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xec,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,\n\t0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,\n\t0xf8,0xf9,0xf6,0x00,0xf8,0xf9,0xf6,0x00,0xf9,0xfa,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,\n\t0xfb,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,\n\t0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,\n\t0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,\n\t0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x37,0x37,0x00,0x37,0x38,0x38,0x00,0x38,0x39,0x39,0x00,\n\t0x39,0x3a,0x3a,0x00,0x3a,0x3b,0x3b,0x00,0x3b,0x3c,0x3c,0x00,0x3c,0x3d,0x3d,0x00,0x3d,0x3e,0x3e,0x00,0x3e,0x3f,0x3f,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,\n\t0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x47,0x47,0x00,0x47,0x48,0x48,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,\n\t0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x62,0x61,0x62,0x00,0x63,0x63,0x63,0x00,\n\t0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6b,0x6a,0x6b,0x00,0x6c,0x6c,0x6c,0x00,\n\t0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x74,0x73,0x74,0x00,0x75,0x75,0x75,0x00,\n\t0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7d,0x7c,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,\n\t0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8b,0x8a,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,\n\t0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x98,0x98,0x97,0x00,\n\t0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,\n\t0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,\n\t0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xbb,0xb9,0x00,\n\t0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbd,0x00,0xbe,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc4,0xc2,0x00,\n\t0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc9,0x00,0xca,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,\n\t0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd5,0xd5,0xd4,0x00,\n\t0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,\n\t0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,\n\t0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xef,0xec,0x00,\n\t0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf8,0xf5,0x00,\n\t0xf8,0xf9,0xf6,0x00,0xf8,0xf9,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,\n\t0xfb,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,\n\t0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x24,0x26,0x00,0x26,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,\n\t0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2b,0x00,0x2d,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,\n\t0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,\n\t0x39,0x3a,0x3a,0x00,0x3a,0x3b,0x3b,0x00,0x3b,0x3c,0x3c,0x00,0x3c,0x3d,0x3d,0x00,0x3d,0x3e,0x3e,0x00,0x3e,0x3f,0x3f,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,\n\t0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x48,0x48,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,\n\t0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x62,0x61,0x62,0x00,0x63,0x63,0x63,0x00,\n\t0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6b,0x6a,0x6b,0x00,0x6c,0x6b,0x6c,0x00,\n\t0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x74,0x73,0x74,0x00,0x75,0x74,0x75,0x00,\n\t0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7d,0x7c,0x7d,0x00,0x7e,0x7d,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,\n\t0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8c,0x8b,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,\n\t0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x98,0x98,0x97,0x00,\n\t0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,\n\t0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,\n\t0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,\n\t0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbd,0x00,0xbe,0xbf,0xbe,0x00,0xbf,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,\n\t0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,\n\t0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,\n\t0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,\n\t0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,\n\t0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xef,0xec,0x00,\n\t0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,\n\t0xf8,0xf9,0xf6,0x00,0xf8,0xf9,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xfa,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,\n\t0xfb,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,\n\t0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x29,0x27,0x28,0x00,0x2a,0x28,0x29,0x00,\n\t0x2b,0x29,0x2a,0x00,0x2c,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,\n\t0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,\n\t0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3c,0x3c,0x00,0x3c,0x3d,0x3d,0x00,0x3d,0x3e,0x3e,0x00,0x3e,0x3f,0x3f,0x00,0x3f,0x40,0x40,0x00,0x41,0x41,0x42,0x00,\n\t0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x49,0x49,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,\n\t0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x63,0x62,0x63,0x00,\n\t0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6c,0x6b,0x6c,0x00,\n\t0x6d,0x6c,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x75,0x74,0x75,0x00,\n\t0x76,0x75,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7e,0x7d,0x7e,0x00,\n\t0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,\n\t0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8d,0x8c,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,\n\t0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,\n\t0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,\n\t0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,\n\t0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,\n\t0xb2,0xb2,0xb2,0x00,0xb3,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,\n\t0xbb,0xbb,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbd,0x00,0xbe,0xbf,0xbe,0x00,0xbf,0xc0,0xbf,0x00,0xc0,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,\n\t0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xca,0x00,0xcb,0xcc,0xcb,0x00,\n\t0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,\n\t0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,\n\t0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,\n\t0xe6,0xe7,0xe4,0x00,0xe7,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,\n\t0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf5,0x00,\n\t0xf8,0xf8,0xf6,0x00,0xf8,0xf9,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xfa,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,\n\t0xfb,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfd,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,\n\t0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x2a,0x28,0x29,0x00,\n\t0x2b,0x29,0x2a,0x00,0x2c,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,\n\t0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,\n\t0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3d,0x3d,0x00,0x3d,0x3e,0x3e,0x00,0x3e,0x3f,0x3f,0x00,0x3f,0x40,0x40,0x00,0x41,0x41,0x42,0x00,\n\t0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,\n\t0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x63,0x62,0x63,0x00,\n\t0x64,0x63,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6b,0x00,0x6c,0x6b,0x6c,0x00,\n\t0x6d,0x6c,0x6d,0x00,0x6e,0x6d,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x75,0x74,0x75,0x00,\n\t0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7e,0x7d,0x7e,0x00,\n\t0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,\n\t0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8e,0x8d,0x8e,0x00,0x8f,0x8f,0x8f,0x00,\n\t0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,\n\t0x98,0x98,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,\n\t0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,\n\t0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,\n\t0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,\n\t0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbe,0x00,0xbf,0xc0,0xbf,0x00,0xc0,0xc1,0xc0,0x00,0xc1,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,\n\t0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xcb,0x00,\n\t0xcc,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,\n\t0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,\n\t0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe6,0xe3,0x00,\n\t0xe6,0xe7,0xe4,0x00,0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,\n\t0xef,0xef,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf7,0xf7,0xf5,0x00,\n\t0xf8,0xf8,0xf6,0x00,0xf8,0xf9,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xfa,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,\n\t0xfb,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,\n\t0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,\n\t0x2b,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,\n\t0x32,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,\n\t0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3f,0x3f,0x00,0x3f,0x40,0x40,0x00,0x40,0x41,0x41,0x00,\n\t0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,\n\t0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x64,0x63,0x64,0x00,0x65,0x64,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6c,0x00,\n\t0x6d,0x6c,0x6d,0x00,0x6e,0x6d,0x6e,0x00,0x6f,0x6e,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,\n\t0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,\n\t0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x81,0x82,0x00,0x83,0x82,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,\n\t0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8f,0x8e,0x8f,0x00,\n\t0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,\n\t0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0xa0,0x00,\n\t0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,\n\t0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb1,0x00,\n\t0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb6,0xb5,0x00,0xb6,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,\n\t0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbf,0xbe,0x00,0xbf,0xc0,0xbf,0x00,0xc0,0xc1,0xc0,0x00,0xc1,0xc2,0xc1,0x00,0xc2,0xc3,0xc2,0x00,\n\t0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,\n\t0xcc,0xcd,0xcc,0x00,0xcd,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,\n\t0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,\n\t0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,\n\t0xe6,0xe7,0xe4,0x00,0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,\n\t0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,\n\t0xf8,0xf8,0xf6,0x00,0xf8,0xf9,0xf6,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,\n\t0xfb,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,\n\t0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,\n\t0x2b,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,\n\t0x32,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,\n\t0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x40,0x40,0x00,0x40,0x41,0x41,0x00,\n\t0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,\n\t0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x64,0x63,0x64,0x00,0x65,0x64,0x65,0x00,0x66,0x65,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,\n\t0x6d,0x6c,0x6d,0x00,0x6e,0x6d,0x6e,0x00,0x6f,0x6e,0x6f,0x00,0x70,0x6f,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,\n\t0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,\n\t0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x81,0x82,0x00,0x83,0x82,0x83,0x00,0x84,0x83,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,\n\t0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,\n\t0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,\n\t0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,\n\t0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,\n\t0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb7,0xb6,0x00,0xb7,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,\n\t0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xc0,0xbf,0x00,0xc0,0xc1,0xc0,0x00,0xc1,0xc2,0xc1,0x00,0xc2,0xc3,0xc2,0x00,\n\t0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,\n\t0xcc,0xcd,0xcc,0x00,0xcd,0xce,0xcd,0x00,0xce,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,\n\t0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,\n\t0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,\n\t0xe6,0xe7,0xe4,0x00,0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,\n\t0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,\n\t0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,\n\t0xfb,0xfc,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,\n\t0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,\n\t0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,\n\t0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,\n\t0x38,0x39,0x39,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x41,0x41,0x00,\n\t0x41,0x42,0x42,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x63,0x63,0x64,0x00,0x65,0x64,0x65,0x00,0x66,0x65,0x66,0x00,0x67,0x66,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,\n\t0x6c,0x6c,0x6c,0x00,0x6e,0x6d,0x6e,0x00,0x6f,0x6e,0x6f,0x00,0x70,0x6f,0x70,0x00,0x71,0x70,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,\n\t0x75,0x75,0x75,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,\n\t0x7e,0x7e,0x7e,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x81,0x82,0x00,0x83,0x82,0x83,0x00,0x84,0x83,0x84,0x00,0x85,0x84,0x85,0x00,0x86,0x86,0x86,0x00,\n\t0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,\n\t0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,\n\t0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,\n\t0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,\n\t0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb8,0xb7,0x00,0xb8,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,\n\t0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc1,0xc0,0x00,0xc1,0xc2,0xc1,0x00,0xc2,0xc3,0xc2,0x00,\n\t0xc3,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,\n\t0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xcf,0xce,0x00,0xcf,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,\n\t0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdd,0xdb,0x00,\n\t0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,\n\t0xe6,0xe6,0xe4,0x00,0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,\n\t0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,\n\t0xf7,0xf8,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfb,0xfa,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,\n\t0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,\n\t0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,\n\t0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,\n\t0x38,0x39,0x39,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x42,0x42,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5c,0x5b,0x5c,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x63,0x63,0x64,0x00,0x65,0x64,0x65,0x00,0x66,0x65,0x66,0x00,0x67,0x66,0x67,0x00,0x68,0x67,0x68,0x00,0x69,0x68,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,\n\t0x6c,0x6c,0x6c,0x00,0x6e,0x6d,0x6e,0x00,0x6f,0x6e,0x6f,0x00,0x70,0x6f,0x70,0x00,0x71,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,\n\t0x75,0x75,0x75,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,\n\t0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x81,0x80,0x81,0x00,0x82,0x81,0x82,0x00,0x83,0x82,0x83,0x00,0x84,0x83,0x84,0x00,0x85,0x84,0x85,0x00,0x86,0x85,0x86,0x00,\n\t0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,\n\t0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,\n\t0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,\n\t0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,\n\t0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb9,0xb8,0x00,0xb9,0xba,0xb9,0x00,\n\t0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc2,0xc1,0x00,0xc2,0xc3,0xc2,0x00,\n\t0xc3,0xc4,0xc3,0x00,0xc4,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,\n\t0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd1,0xd0,0x00,0xd1,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,\n\t0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,\n\t0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,\n\t0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xeb,0x00,0xed,0xee,0xec,0x00,\n\t0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,\n\t0xf7,0xf8,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,\n\t0x21,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,\n\t0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x30,0x30,0x30,0x00,\n\t0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x37,0x38,0x38,0x00,\n\t0x38,0x39,0x39,0x00,0x39,0x3a,0x3a,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x43,0x43,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5d,0x5c,0x5d,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x66,0x65,0x66,0x00,0x67,0x66,0x67,0x00,0x68,0x67,0x68,0x00,0x69,0x68,0x69,0x00,0x6a,0x69,0x6a,0x00,0x6b,0x6b,0x6b,0x00,\n\t0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6f,0x6e,0x6f,0x00,0x70,0x6f,0x70,0x00,0x71,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x72,0x73,0x00,0x74,0x74,0x74,0x00,\n\t0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7d,0x7d,0x00,\n\t0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x82,0x81,0x82,0x00,0x83,0x82,0x83,0x00,0x84,0x83,0x84,0x00,0x85,0x84,0x85,0x00,0x86,0x85,0x86,0x00,\n\t0x87,0x86,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,\n\t0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0xa0,0xa0,0x9f,0x00,\n\t0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,\n\t0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,\n\t0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xba,0xb9,0x00,\n\t0xba,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc3,0xc2,0x00,\n\t0xc3,0xc4,0xc3,0x00,0xc4,0xc5,0xc4,0x00,0xc5,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,\n\t0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,\n\t0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,\n\t0xdd,0xdd,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,\n\t0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xec,0x00,\n\t0xee,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf7,0xf4,0x00,\n\t0xf7,0xf8,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,\n\t0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,\n\t0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2e,0x00,0x30,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,\n\t0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x37,0x38,0x38,0x00,\n\t0x38,0x39,0x39,0x00,0x39,0x3a,0x3a,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5d,0x5c,0x5d,0x00,0x5e,0x5d,0x5e,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x66,0x65,0x66,0x00,0x67,0x66,0x67,0x00,0x68,0x67,0x68,0x00,0x69,0x68,0x69,0x00,0x6a,0x69,0x6a,0x00,0x6b,0x6a,0x6b,0x00,\n\t0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6f,0x6e,0x6f,0x00,0x70,0x6f,0x70,0x00,0x71,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x72,0x73,0x00,0x74,0x73,0x74,0x00,\n\t0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7c,0x7d,0x00,\n\t0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x83,0x82,0x83,0x00,0x84,0x83,0x84,0x00,0x85,0x84,0x85,0x00,0x86,0x85,0x86,0x00,\n\t0x87,0x86,0x87,0x00,0x88,0x87,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,\n\t0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,\n\t0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,\n\t0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,\n\t0xba,0xbb,0xba,0x00,0xbb,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,\n\t0xc3,0xc4,0xc3,0x00,0xc4,0xc5,0xc4,0x00,0xc5,0xc6,0xc5,0x00,0xc6,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,\n\t0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,\n\t0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,\n\t0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xec,0x00,\n\t0xee,0xef,0xed,0x00,0xef,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,\n\t0xf7,0xf8,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x20,0x21,0x00,\n\t0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,\n\t0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,\n\t0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3b,0x3b,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x44,0x44,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5e,0x5d,0x5e,0x00,0x5f,0x5e,0x5f,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x67,0x66,0x67,0x00,0x68,0x67,0x68,0x00,0x69,0x68,0x69,0x00,0x6a,0x69,0x6a,0x00,0x6b,0x6a,0x6b,0x00,\n\t0x6c,0x6b,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x70,0x6f,0x70,0x00,0x71,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x72,0x73,0x00,0x74,0x73,0x74,0x00,\n\t0x75,0x74,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7c,0x7d,0x00,\n\t0x7e,0x7d,0x7e,0x00,0x7f,0x7e,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x84,0x83,0x84,0x00,0x85,0x84,0x85,0x00,0x86,0x85,0x86,0x00,\n\t0x87,0x86,0x87,0x00,0x88,0x87,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,\n\t0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,\n\t0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,\n\t0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,\n\t0xba,0xba,0xba,0x00,0xbb,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,\n\t0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc6,0xc5,0x00,0xc6,0xc7,0xc6,0x00,0xc7,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,\n\t0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,\n\t0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,\n\t0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xec,0x00,\n\t0xee,0xef,0xed,0x00,0xef,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,\n\t0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x20,0x21,0x00,\n\t0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,\n\t0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,\n\t0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5e,0x5d,0x5e,0x00,0x5f,0x5e,0x5f,0x00,0x60,0x5f,0x60,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x67,0x66,0x67,0x00,0x68,0x67,0x68,0x00,0x69,0x68,0x69,0x00,0x6a,0x69,0x6a,0x00,0x6b,0x6a,0x6b,0x00,\n\t0x6c,0x6b,0x6c,0x00,0x6d,0x6c,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x70,0x6f,0x70,0x00,0x71,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x72,0x73,0x00,0x74,0x73,0x74,0x00,\n\t0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x77,0x77,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7c,0x7d,0x00,\n\t0x7e,0x7d,0x7e,0x00,0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x85,0x84,0x85,0x00,0x86,0x85,0x86,0x00,\n\t0x87,0x86,0x87,0x00,0x88,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,\n\t0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,\n\t0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,\n\t0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,\n\t0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,\n\t0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc8,0xc7,0x00,0xc8,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,\n\t0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,\n\t0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,\n\t0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,\n\t0xee,0xef,0xed,0x00,0xef,0xf0,0xee,0x00,0xf0,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,\n\t0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,\n\t0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,\n\t0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,\n\t0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5f,0x5e,0x5f,0x00,0x60,0x5f,0x60,0x00,0x61,0x60,0x61,0x00,0x62,0x62,0x63,0x00,\n\t0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x68,0x67,0x68,0x00,0x69,0x68,0x69,0x00,0x6a,0x69,0x6a,0x00,0x6b,0x6a,0x6b,0x00,\n\t0x6c,0x6b,0x6c,0x00,0x6d,0x6c,0x6d,0x00,0x6e,0x6d,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x71,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x72,0x73,0x00,0x74,0x73,0x74,0x00,\n\t0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x78,0x78,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7c,0x7d,0x00,\n\t0x7e,0x7d,0x7e,0x00,0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x86,0x85,0x86,0x00,\n\t0x87,0x86,0x87,0x00,0x88,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x97,0x97,0x97,0x00,\n\t0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,\n\t0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa8,0x00,\n\t0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb5,0xb4,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,\n\t0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbe,0xbd,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,\n\t0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,\n\t0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xdb,0x00,\n\t0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,\n\t0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xee,0xeb,0x00,\n\t0xee,0xef,0xed,0x00,0xef,0xf0,0xee,0x00,0xf0,0xf1,0xef,0x00,0xf1,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,\n\t0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,\n\t0x21,0x21,0x22,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,\n\t0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,\n\t0x31,0x31,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5f,0x5e,0x5f,0x00,0x60,0x5f,0x60,0x00,0x61,0x60,0x61,0x00,0x62,0x61,0x62,0x00,\n\t0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x68,0x67,0x68,0x00,0x69,0x68,0x69,0x00,0x6a,0x69,0x6a,0x00,0x6b,0x6a,0x6b,0x00,\n\t0x6c,0x6b,0x6c,0x00,0x6d,0x6c,0x6d,0x00,0x6e,0x6d,0x6e,0x00,0x6f,0x6e,0x6f,0x00,0x71,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x72,0x73,0x00,0x74,0x73,0x74,0x00,\n\t0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7c,0x7d,0x00,\n\t0x7e,0x7d,0x7e,0x00,0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,\n\t0x87,0x86,0x87,0x00,0x88,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,\n\t0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,\n\t0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,\n\t0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,\n\t0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,\n\t0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,\n\t0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,\n\t0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,\n\t0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,\n\t0xee,0xef,0xed,0x00,0xef,0xf0,0xee,0x00,0xf0,0xf1,0xef,0x00,0xf1,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,\n\t0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x19,0x19,0x19,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,\n\t0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,\n\t0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x60,0x5f,0x60,0x00,0x61,0x60,0x61,0x00,0x62,0x61,0x62,0x00,\n\t0x63,0x62,0x63,0x00,0x64,0x63,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x69,0x68,0x69,0x00,0x6a,0x69,0x6a,0x00,0x6b,0x6a,0x6b,0x00,\n\t0x6c,0x6b,0x6c,0x00,0x6d,0x6c,0x6d,0x00,0x6e,0x6d,0x6e,0x00,0x6f,0x6e,0x6f,0x00,0x70,0x6f,0x70,0x00,0x72,0x71,0x72,0x00,0x73,0x72,0x73,0x00,0x74,0x73,0x74,0x00,\n\t0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7c,0x7d,0x00,\n\t0x7e,0x7d,0x7e,0x00,0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x81,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,\n\t0x86,0x86,0x86,0x00,0x87,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,0x8b,0x8a,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,\n\t0x97,0x97,0x97,0x00,0x98,0x98,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,\n\t0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,\n\t0xa8,0xa8,0xa8,0x00,0xa9,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,\n\t0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,\n\t0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,\n\t0xcb,0xcb,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,\n\t0xdc,0xdd,0xdb,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,\n\t0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,\n\t0xee,0xee,0xec,0x00,0xef,0xef,0xee,0x00,0xf0,0xf1,0xef,0x00,0xf1,0xf2,0xf0,0x00,0xf2,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,\n\t0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,\n\t0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x61,0x60,0x61,0x00,0x62,0x61,0x62,0x00,\n\t0x63,0x62,0x63,0x00,0x64,0x63,0x64,0x00,0x65,0x64,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x6a,0x69,0x6a,0x00,0x6b,0x6a,0x6b,0x00,\n\t0x6c,0x6b,0x6c,0x00,0x6d,0x6c,0x6d,0x00,0x6e,0x6d,0x6e,0x00,0x6f,0x6e,0x6f,0x00,0x70,0x6f,0x70,0x00,0x71,0x71,0x72,0x00,0x73,0x72,0x73,0x00,0x74,0x73,0x74,0x00,\n\t0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7c,0x7d,0x00,\n\t0x7e,0x7d,0x7e,0x00,0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x81,0x82,0x00,0x83,0x82,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,\n\t0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8b,0x8a,0x8b,0x00,0x8c,0x8b,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,\n\t0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,\n\t0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,\n\t0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,\n\t0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,\n\t0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,\n\t0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,\n\t0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,\n\t0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,\n\t0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf2,0xf0,0x00,0xf2,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,\n\t0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,\n\t0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x62,0x61,0x62,0x00,\n\t0x63,0x62,0x63,0x00,0x64,0x63,0x64,0x00,0x65,0x64,0x65,0x00,0x66,0x65,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6b,0x6a,0x6b,0x00,\n\t0x6c,0x6b,0x6c,0x00,0x6d,0x6c,0x6d,0x00,0x6e,0x6d,0x6e,0x00,0x6f,0x6e,0x6f,0x00,0x70,0x6f,0x70,0x00,0x71,0x70,0x71,0x00,0x72,0x72,0x73,0x00,0x74,0x73,0x74,0x00,\n\t0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7b,0x7c,0x00,0x7d,0x7c,0x7d,0x00,\n\t0x7e,0x7d,0x7e,0x00,0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x81,0x82,0x00,0x83,0x82,0x83,0x00,0x84,0x83,0x84,0x00,0x85,0x85,0x85,0x00,\n\t0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8d,0x8c,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,\n\t0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9c,0x9c,0x00,0x9c,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,\n\t0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,\n\t0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb9,0x00,\n\t0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc2,0x00,\n\t0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,\n\t0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdc,0xda,0x00,\n\t0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe5,0xe3,0x00,\n\t0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,\n\t0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf3,0xf1,0x00,0xf3,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,\n\t0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,\n\t0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x62,0x61,0x62,0x00,\n\t0x63,0x62,0x63,0x00,0x64,0x63,0x64,0x00,0x65,0x64,0x65,0x00,0x66,0x65,0x66,0x00,0x67,0x66,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,\n\t0x6c,0x6b,0x6c,0x00,0x6d,0x6c,0x6d,0x00,0x6e,0x6d,0x6e,0x00,0x6f,0x6e,0x6f,0x00,0x70,0x6f,0x70,0x00,0x71,0x70,0x71,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,\n\t0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,\n\t0x7e,0x7d,0x7e,0x00,0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x81,0x82,0x00,0x83,0x82,0x83,0x00,0x84,0x83,0x84,0x00,0x85,0x85,0x85,0x00,\n\t0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,\n\t0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9d,0x9d,0x00,0x9d,0x9e,0x9e,0x00,0x9e,0x9f,0x9f,0x00,\n\t0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,\n\t0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb9,0x00,\n\t0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,\n\t0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,\n\t0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdc,0xda,0x00,\n\t0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,\n\t0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,\n\t0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,\n\t0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1e,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x29,0x28,0x28,0x00,\n\t0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x58,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,\n\t0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,\n\t0x63,0x62,0x63,0x00,0x64,0x63,0x64,0x00,0x65,0x64,0x65,0x00,0x66,0x65,0x66,0x00,0x67,0x66,0x67,0x00,0x68,0x67,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,\n\t0x6b,0x6b,0x6c,0x00,0x6d,0x6c,0x6d,0x00,0x6e,0x6d,0x6e,0x00,0x6f,0x6e,0x6f,0x00,0x70,0x6f,0x70,0x00,0x71,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x73,0x74,0x00,\n\t0x74,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7c,0x7d,0x00,\n\t0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x81,0x82,0x00,0x83,0x82,0x83,0x00,0x84,0x83,0x84,0x00,0x85,0x84,0x85,0x00,\n\t0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,\n\t0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,\n\t0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9e,0x9e,0x00,0x9e,0x9f,0x9f,0x00,\n\t0x9f,0xa0,0xa0,0x00,0xa0,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,\n\t0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb9,0xb9,0xb8,0x00,\n\t0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc2,0xc2,0xc1,0x00,\n\t0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xca,0x00,\n\t0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,\n\t0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,\n\t0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf2,0x00,0xf4,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,\n\t0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1d,0x00,0x1e,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x29,0x28,0x28,0x00,\n\t0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x4f,0x51,0x00,0x51,0x50,0x52,0x00,\n\t0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x58,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,\n\t0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,\n\t0x62,0x62,0x63,0x00,0x64,0x63,0x64,0x00,0x65,0x64,0x65,0x00,0x66,0x65,0x66,0x00,0x67,0x66,0x67,0x00,0x68,0x67,0x68,0x00,0x69,0x68,0x6a,0x00,0x6a,0x6a,0x6b,0x00,\n\t0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6e,0x6d,0x6e,0x00,0x6f,0x6e,0x6f,0x00,0x70,0x6f,0x70,0x00,0x71,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x73,0x74,0x00,\n\t0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7c,0x7d,0x00,\n\t0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x82,0x81,0x82,0x00,0x83,0x82,0x83,0x00,0x84,0x83,0x84,0x00,0x85,0x84,0x85,0x00,\n\t0x86,0x85,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,\n\t0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,\n\t0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9f,0x9f,0x00,\n\t0x9f,0xa0,0xa0,0x00,0xa0,0xa1,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,\n\t0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb9,0xb9,0xb8,0x00,\n\t0xba,0xba,0xb9,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc2,0xc2,0xc1,0x00,\n\t0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,\n\t0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,\n\t0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,\n\t0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf3,0x00,0xf6,0xf6,0xf4,0x00,\n\t0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x28,0x28,0x00,\n\t0x2a,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4c,0x4e,0x00,0x4e,0x4d,0x4f,0x00,0x4f,0x4e,0x50,0x00,0x50,0x4f,0x51,0x00,0x51,0x50,0x52,0x00,\n\t0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x58,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,\n\t0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,\n\t0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x65,0x64,0x65,0x00,0x66,0x65,0x66,0x00,0x67,0x66,0x67,0x00,0x68,0x67,0x68,0x00,0x69,0x68,0x69,0x00,0x6a,0x69,0x6b,0x00,\n\t0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6f,0x6e,0x6f,0x00,0x70,0x6f,0x70,0x00,0x71,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x72,0x73,0x00,\n\t0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,\n\t0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x84,0x83,0x84,0x00,0x85,0x84,0x85,0x00,\n\t0x86,0x85,0x86,0x00,0x87,0x86,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8e,0x00,\n\t0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,\n\t0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9f,0x00,\n\t0x9f,0xa0,0xa0,0x00,0xa0,0xa1,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa2,0xa3,0xa3,0x00,0xa3,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,\n\t0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xb0,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,\n\t0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,\n\t0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe4,0xe4,0xe3,0x00,\n\t0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,0xec,0xed,0xeb,0x00,\n\t0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf4,0x00,\n\t0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x2a,0x29,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,0x4e,0x4d,0x4f,0x00,0x4f,0x4e,0x50,0x00,0x50,0x4f,0x51,0x00,0x51,0x50,0x52,0x00,\n\t0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x58,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,\n\t0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,\n\t0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x66,0x65,0x66,0x00,0x67,0x66,0x67,0x00,0x68,0x67,0x68,0x00,0x69,0x68,0x69,0x00,0x6a,0x69,0x6a,0x00,\n\t0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x70,0x6f,0x70,0x00,0x71,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x72,0x73,0x00,\n\t0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,\n\t0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,\n\t0x86,0x85,0x86,0x00,0x87,0x86,0x87,0x00,0x88,0x87,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,\n\t0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x95,0x95,0x00,0x95,0x96,0x96,0x00,\n\t0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,\n\t0x9f,0xa0,0xa0,0x00,0xa0,0xa1,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa2,0xa3,0xa3,0x00,0xa3,0xa4,0xa4,0x00,0xa4,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,\n\t0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,\n\t0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,\n\t0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,\n\t0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xec,0xea,0x00,0xec,0xed,0xeb,0x00,\n\t0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,\n\t0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,\n\t0x59,0x59,0x5a,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x61,0x62,0x00,\n\t0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x67,0x66,0x67,0x00,0x68,0x67,0x68,0x00,0x69,0x68,0x69,0x00,0x6a,0x69,0x6a,0x00,\n\t0x6b,0x6a,0x6b,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x71,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x72,0x73,0x00,\n\t0x74,0x73,0x74,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,\n\t0x7d,0x7c,0x7d,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,\n\t0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x88,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,\n\t0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x96,0x96,0x00,\n\t0x96,0x97,0x97,0x00,0x97,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,\n\t0x9f,0x9f,0x9f,0x00,0xa0,0xa1,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa2,0xa3,0xa3,0x00,0xa3,0xa4,0xa4,0x00,0xa4,0xa5,0xa5,0x00,0xa5,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,\n\t0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,\n\t0xc2,0xc2,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,\n\t0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,\n\t0xe4,0xe5,0xe3,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xed,0xeb,0x00,\n\t0xed,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,\n\t0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,\n\t0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,\n\t0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x69,0x68,0x69,0x00,0x6a,0x69,0x6a,0x00,\n\t0x6b,0x6a,0x6b,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x72,0x73,0x00,\n\t0x74,0x73,0x74,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,\n\t0x7d,0x7c,0x7d,0x00,0x7e,0x7d,0x7e,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,\n\t0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,0x8b,0x8a,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,\n\t0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,\n\t0x96,0x97,0x97,0x00,0x97,0x98,0x98,0x00,0x98,0x99,0x99,0x00,0x99,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,\n\t0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa2,0xa2,0x00,0xa2,0xa3,0xa3,0x00,0xa3,0xa4,0xa4,0x00,0xa4,0xa5,0xa5,0x00,0xa5,0xa6,0xa6,0x00,0xa6,0xa7,0xa7,0x00,\n\t0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,\n\t0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,\n\t0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,\n\t0xe4,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,\n\t0xed,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,\n\t0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,\n\t0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,\n\t0x62,0x61,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x6a,0x69,0x6a,0x00,\n\t0x6b,0x6a,0x6b,0x00,0x6c,0x6b,0x6c,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x73,0x72,0x73,0x00,\n\t0x74,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,\n\t0x7d,0x7c,0x7d,0x00,0x7e,0x7d,0x7e,0x00,0x7f,0x7e,0x7f,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,\n\t0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8c,0x8b,0x8c,0x00,0x8d,0x8d,0x8d,0x00,\n\t0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,\n\t0x96,0x96,0x97,0x00,0x97,0x98,0x98,0x00,0x98,0x99,0x99,0x00,0x99,0x9a,0x9a,0x00,0x9a,0x9b,0x9b,0x00,0x9b,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,\n\t0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa3,0xa3,0x00,0xa3,0xa4,0xa4,0x00,0xa4,0xa5,0xa5,0x00,0xa5,0xa6,0xa6,0x00,0xa6,0xa7,0xa7,0x00,\n\t0xa7,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc1,0x00,\n\t0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,\n\t0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe4,0xe2,0x00,\n\t0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,\n\t0xed,0xed,0xec,0x00,0xee,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,\n\t0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,\n\t0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,\n\t0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6b,0x6a,0x6b,0x00,0x6c,0x6b,0x6c,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,\n\t0x74,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,\n\t0x7d,0x7c,0x7d,0x00,0x7e,0x7d,0x7e,0x00,0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,\n\t0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,\n\t0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,\n\t0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x99,0x99,0x00,0x99,0x9a,0x9a,0x00,0x9a,0x9b,0x9b,0x00,0x9b,0x9c,0x9c,0x00,0x9c,0x9d,0x9d,0x00,0x9d,0x9e,0x9e,0x00,\n\t0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa4,0xa4,0x00,0xa4,0xa5,0xa5,0x00,0xa5,0xa6,0xa6,0x00,0xa6,0xa7,0xa7,0x00,\n\t0xa7,0xa8,0xa8,0x00,0xa8,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,\n\t0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,\n\t0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,\n\t0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,\n\t0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,\n\t0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x56,0x58,0x00,0x58,0x57,0x59,0x00,\n\t0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,\n\t0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6c,0x6b,0x6c,0x00,0x6d,0x6c,0x6d,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,\n\t0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,\n\t0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,\n\t0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,\n\t0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x99,0x99,0x00,0x99,0x9a,0x9a,0x00,0x9a,0x9b,0x9b,0x00,0x9b,0x9c,0x9c,0x00,0x9c,0x9d,0x9d,0x00,0x9d,0x9e,0x9e,0x00,\n\t0x9e,0x9f,0x9f,0x00,0x9f,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa5,0xa5,0x00,0xa5,0xa6,0xa6,0x00,0xa6,0xa7,0xa7,0x00,\n\t0xa7,0xa8,0xa8,0x00,0xa8,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,\n\t0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,\n\t0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,\n\t0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,\n\t0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,\n\t0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x58,0x57,0x59,0x00,\n\t0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,\n\t0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6d,0x6c,0x6d,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,\n\t0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x81,0x82,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,\n\t0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,\n\t0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,\n\t0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x9a,0x9a,0x00,0x9a,0x9b,0x9b,0x00,0x9b,0x9c,0x9c,0x00,0x9c,0x9d,0x9d,0x00,0x9d,0x9e,0x9e,0x00,\n\t0x9e,0x9f,0x9f,0x00,0x9f,0xa0,0xa0,0x00,0xa0,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa6,0xa6,0x00,0xa6,0xa7,0xa7,0x00,\n\t0xa7,0xa8,0xa8,0x00,0xa8,0xa9,0xa9,0x00,0xa9,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,\n\t0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,\n\t0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,\n\t0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,\n\t0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,\n\t0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x31,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x58,0x57,0x59,0x00,\n\t0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x61,0x60,0x62,0x00,\n\t0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6e,0x6d,0x6e,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,\n\t0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x83,0x82,0x83,0x00,0x84,0x84,0x85,0x00,\n\t0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,\n\t0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x92,0x92,0x00,0x92,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x96,0x00,\n\t0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9b,0x9b,0x00,0x9b,0x9c,0x9c,0x00,0x9c,0x9d,0x9d,0x00,0x9d,0x9e,0x9e,0x00,\n\t0x9e,0x9f,0x9f,0x00,0x9f,0xa0,0xa0,0x00,0xa0,0xa1,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa7,0xa7,0x00,\n\t0xa7,0xa8,0xa8,0x00,0xa8,0xa9,0xa9,0x00,0xa9,0xaa,0xaa,0x00,0xaa,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,\n\t0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xca,0xca,0xc9,0x00,\n\t0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,\n\t0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xeb,0x00,\n\t0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,\n\t0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x51,0x52,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x58,0x57,0x59,0x00,\n\t0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,\n\t0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,\n\t0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,\n\t0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,\n\t0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x92,0x92,0x00,0x92,0x93,0x93,0x00,0x93,0x94,0x94,0x00,0x94,0x95,0x95,0x00,\n\t0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9b,0x9b,0x00,0x9b,0x9c,0x9c,0x00,0x9c,0x9d,0x9d,0x00,0x9d,0x9e,0x9e,0x00,\n\t0x9e,0x9f,0x9f,0x00,0x9f,0xa0,0xa0,0x00,0xa0,0xa1,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,\n\t0xa7,0xa8,0xa8,0x00,0xa8,0xa9,0xa9,0x00,0xa9,0xaa,0xaa,0x00,0xaa,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,\n\t0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,\n\t0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,\n\t0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,\n\t0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,\n\t0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,\n\t0x20,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,\n\t0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x58,0x57,0x59,0x00,\n\t0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,\n\t0x61,0x61,0x62,0x00,0x62,0x62,0x64,0x00,0x64,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x65,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,\n\t0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,\n\t0x84,0x84,0x85,0x00,0x85,0x86,0x86,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,\n\t0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x93,0x93,0x00,0x93,0x94,0x94,0x00,0x94,0x95,0x95,0x00,\n\t0x95,0x96,0x96,0x00,0x96,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9c,0x9c,0x00,0x9c,0x9d,0x9d,0x00,0x9d,0x9e,0x9e,0x00,\n\t0x9e,0x9f,0x9f,0x00,0x9f,0xa0,0xa0,0x00,0xa0,0xa1,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa2,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,\n\t0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xaa,0xaa,0x00,0xaa,0xab,0xab,0x00,0xab,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,\n\t0xb9,0xb9,0xb8,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,\n\t0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,\n\t0xca,0xca,0xc9,0x00,0xcb,0xcb,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xda,0x00,0xdc,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,\n\t0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,\n\t0xed,0xed,0xeb,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,\n\t0xf6,0xf6,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,\n\t0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x4f,0x51,0x00,\n\t0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x58,0x57,0x59,0x00,\n\t0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,\n\t0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x65,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,\n\t0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,\n\t0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x87,0x87,0x00,0x87,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,\n\t0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x93,0x93,0x00,0x93,0x94,0x94,0x00,0x94,0x95,0x95,0x00,\n\t0x95,0x96,0x96,0x00,0x96,0x97,0x98,0x00,0x97,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9c,0x9c,0x00,0x9c,0x9d,0x9d,0x00,0x9d,0x9e,0x9e,0x00,\n\t0x9e,0x9f,0x9f,0x00,0x9f,0xa0,0xa0,0x00,0xa0,0xa1,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa2,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,\n\t0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,\n\t0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,\n\t0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,\n\t0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,\n\t0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,\n\t0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,\n\t0xf6,0xf6,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,\n\t0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4e,0x50,0x00,0x50,0x4f,0x51,0x00,\n\t0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x58,0x57,0x59,0x00,\n\t0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,\n\t0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x66,0x00,0x66,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7c,0x00,\n\t0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,\n\t0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x88,0x88,0x00,0x88,0x89,0x8a,0x00,0x89,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,\n\t0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x94,0x94,0x00,0x94,0x95,0x95,0x00,\n\t0x95,0x96,0x96,0x00,0x96,0x97,0x97,0x00,0x97,0x98,0x99,0x00,0x98,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9d,0x9d,0x00,0x9d,0x9e,0x9e,0x00,\n\t0x9e,0x9f,0x9f,0x00,0x9f,0xa0,0xa0,0x00,0xa0,0xa1,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa2,0xa3,0xa3,0x00,0xa3,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,\n\t0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb8,0xb8,0xb7,0x00,\n\t0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc1,0xc1,0xc0,0x00,\n\t0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,\n\t0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xcf,0xce,0x00,0xcf,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,\n\t0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xec,0xec,0xea,0x00,\n\t0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,0xf5,0xf5,0xf3,0x00,\n\t0xf6,0xf6,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,\n\t0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4d,0x4f,0x00,0x4f,0x4e,0x50,0x00,0x50,0x4f,0x51,0x00,\n\t0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x58,0x57,0x59,0x00,\n\t0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,\n\t0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,\n\t0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,\n\t0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x89,0x89,0x00,0x89,0x8a,0x8b,0x00,0x8a,0x8b,0x8c,0x00,0x8b,0x8c,0x8d,0x00,\n\t0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x94,0x94,0x00,0x94,0x95,0x95,0x00,\n\t0x95,0x96,0x96,0x00,0x96,0x97,0x97,0x00,0x97,0x98,0x99,0x00,0x98,0x99,0x9a,0x00,0x99,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9d,0x9d,0x00,0x9d,0x9e,0x9e,0x00,\n\t0x9e,0x9f,0x9f,0x00,0x9f,0xa0,0xa0,0x00,0xa0,0xa1,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa2,0xa3,0xa3,0x00,0xa3,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,\n\t0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xae,0xad,0xae,0x00,0xaf,0xae,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb8,0xb7,0xb7,0x00,\n\t0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,\n\t0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,\n\t0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xce,0x00,0xcf,0xd0,0xcf,0x00,0xd0,0xd1,0xd0,0x00,0xd1,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,\n\t0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xec,0xec,0xea,0x00,\n\t0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,\n\t0xf6,0xf6,0xf4,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x18,0x18,0x18,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,\n\t0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4c,0x4e,0x00,0x4e,0x4d,0x4f,0x00,0x4f,0x4e,0x50,0x00,0x50,0x4f,0x51,0x00,\n\t0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,\n\t0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x60,0x61,0x00,\n\t0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x68,0x00,0x68,0x67,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x72,0x72,0x72,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7b,0x7b,0x7b,0x00,\n\t0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,\n\t0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x8a,0x8a,0x00,0x8a,0x8b,0x8c,0x00,0x8b,0x8c,0x8d,0x00,\n\t0x8c,0x8d,0x8e,0x00,0x8d,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x95,0x95,0x00,\n\t0x95,0x96,0x96,0x00,0x96,0x97,0x97,0x00,0x97,0x98,0x99,0x00,0x98,0x99,0x9a,0x00,0x99,0x9a,0x9b,0x00,0x9a,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9e,0x9e,0x00,\n\t0x9e,0x9f,0x9f,0x00,0x9f,0xa0,0xa0,0x00,0xa0,0xa1,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa2,0xa3,0xa3,0x00,0xa3,0xa4,0xa4,0x00,0xa4,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,\n\t0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xaf,0xae,0xaf,0x00,\n\t0xb0,0xaf,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,\n\t0xb9,0xb8,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,\n\t0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,\n\t0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd1,0xd0,0x00,0xd1,0xd2,0xd1,0x00,\n\t0xd2,0xd3,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,\n\t0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,\n\t0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,\n\t0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,0x4e,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,\n\t0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,\n\t0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x60,0x61,0x00,\n\t0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x72,0x72,0x72,0x00,\n\t0x73,0x73,0x73,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7b,0x7b,0x7b,0x00,\n\t0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,\n\t0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8b,0x8b,0x00,0x8b,0x8c,0x8d,0x00,\n\t0x8c,0x8d,0x8e,0x00,0x8d,0x8e,0x8f,0x00,0x8e,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x95,0x95,0x00,\n\t0x95,0x96,0x96,0x00,0x96,0x97,0x97,0x00,0x97,0x98,0x98,0x00,0x98,0x99,0x9a,0x00,0x99,0x9a,0x9b,0x00,0x9a,0x9b,0x9c,0x00,0x9b,0x9c,0x9d,0x00,0x9d,0x9e,0x9e,0x00,\n\t0x9e,0x9f,0x9f,0x00,0x9f,0xa0,0xa0,0x00,0xa0,0xa1,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa2,0xa3,0xa3,0x00,0xa3,0xa4,0xa4,0x00,0xa4,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,\n\t0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xaf,0xae,0xaf,0x00,\n\t0xb0,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,\n\t0xb8,0xb8,0xb8,0x00,0xba,0xb9,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,\n\t0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,\n\t0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xd0,0x00,0xd1,0xd2,0xd1,0x00,\n\t0xd2,0xd3,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,\n\t0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,\n\t0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,\n\t0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,\n\t0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,\n\t0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,\n\t0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,\n\t0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,\n\t0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8c,0x8c,0x00,\n\t0x8c,0x8d,0x8e,0x00,0x8d,0x8e,0x8f,0x00,0x8e,0x8f,0x90,0x00,0x8f,0x90,0x91,0x00,0x90,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,\n\t0x95,0x96,0x96,0x00,0x96,0x97,0x97,0x00,0x97,0x98,0x98,0x00,0x98,0x99,0x9a,0x00,0x99,0x9a,0x9b,0x00,0x9a,0x9b,0x9c,0x00,0x9b,0x9c,0x9d,0x00,0x9c,0x9d,0x9e,0x00,\n\t0x9e,0x9f,0x9f,0x00,0x9f,0xa0,0xa0,0x00,0xa0,0xa1,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa2,0xa3,0xa3,0x00,0xa3,0xa4,0xa4,0x00,0xa4,0xa5,0xa5,0x00,0xa5,0xa6,0xa6,0x00,\n\t0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xaf,0x00,\n\t0xb0,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,\n\t0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xbb,0xba,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xc0,0x00,\n\t0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,\n\t0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd1,0x00,\n\t0xd2,0xd3,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe3,0xe2,0x00,\n\t0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf3,0x00,\n\t0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xf9,0xf9,0xf9,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,\n\t0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x49,0x49,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,\n\t0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,\n\t0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,\n\t0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,\n\t0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,\n\t0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,\n\t0x8c,0x8d,0x8e,0x00,0x8d,0x8e,0x8f,0x00,0x8e,0x8f,0x90,0x00,0x8f,0x90,0x91,0x00,0x90,0x91,0x92,0x00,0x91,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,\n\t0x95,0x96,0x96,0x00,0x96,0x97,0x97,0x00,0x97,0x98,0x98,0x00,0x98,0x99,0x9a,0x00,0x99,0x9a,0x9b,0x00,0x9a,0x9b,0x9c,0x00,0x9b,0x9c,0x9d,0x00,0x9c,0x9d,0x9e,0x00,\n\t0x9e,0x9f,0x9f,0x00,0x9f,0xa0,0xa0,0x00,0xa0,0xa1,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa2,0xa3,0xa3,0x00,0xa3,0xa4,0xa4,0x00,0xa4,0xa5,0xa5,0x00,0xa5,0xa6,0xa6,0x00,\n\t0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,\n\t0xb0,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,\n\t0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbc,0xbb,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,\n\t0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc8,0xc7,0x00,0xc8,0xc9,0xc8,0x00,\n\t0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,\n\t0xd2,0xd3,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,\n\t0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xf9,0xf9,0xf9,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x17,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,\n\t0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x24,0x26,0x00,0x26,0x25,0x27,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x36,0x36,0x37,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,\n\t0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,\n\t0x58,0x57,0x59,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,\n\t0x61,0x60,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,\n\t0x69,0x69,0x6a,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,\n\t0x7b,0x7b,0x7c,0x00,0x7c,0x7d,0x7d,0x00,0x7d,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x84,0x00,\n\t0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,\n\t0x8c,0x8c,0x8d,0x00,0x8d,0x8e,0x8f,0x00,0x8e,0x8f,0x90,0x00,0x8f,0x90,0x91,0x00,0x90,0x91,0x92,0x00,0x91,0x92,0x93,0x00,0x92,0x93,0x94,0x00,0x94,0x94,0x95,0x00,\n\t0x95,0x95,0x96,0x00,0x96,0x97,0x97,0x00,0x97,0x98,0x98,0x00,0x98,0x99,0x9a,0x00,0x99,0x9a,0x9b,0x00,0x9a,0x9b,0x9c,0x00,0x9b,0x9c,0x9d,0x00,0x9c,0x9d,0x9e,0x00,\n\t0x9d,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa2,0xa3,0xa3,0x00,0xa3,0xa4,0xa4,0x00,0xa4,0xa5,0xa5,0x00,0xa5,0xa6,0xa6,0x00,\n\t0xa6,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,\n\t0xaf,0xaf,0xaf,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb3,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,\n\t0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbd,0xbc,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,\n\t0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc9,0xc8,0x00,\n\t0xc9,0xca,0xc9,0x00,0xca,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,\n\t0xd2,0xd2,0xd1,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd8,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,\n\t0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,\n\t0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,\n\t0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x56,0x58,0x00,\n\t0x58,0x57,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,\n\t0x61,0x60,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,\n\t0x69,0x69,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,\n\t0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7e,0x7e,0x00,0x7e,0x7f,0x7f,0x00,0x7f,0x80,0x80,0x00,0x80,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,\n\t0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,\n\t0x8c,0x8c,0x8d,0x00,0x8d,0x8e,0x8e,0x00,0x8e,0x8f,0x90,0x00,0x8f,0x90,0x91,0x00,0x90,0x91,0x92,0x00,0x91,0x92,0x93,0x00,0x92,0x93,0x94,0x00,0x93,0x94,0x95,0x00,\n\t0x95,0x95,0x96,0x00,0x96,0x97,0x97,0x00,0x97,0x98,0x98,0x00,0x98,0x99,0x99,0x00,0x99,0x9a,0x9b,0x00,0x9a,0x9b,0x9c,0x00,0x9b,0x9c,0x9d,0x00,0x9c,0x9d,0x9e,0x00,\n\t0x9d,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa5,0xa5,0x00,0xa5,0xa6,0xa6,0x00,\n\t0xa6,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,\n\t0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb3,0xb4,0x00,0xb5,0xb4,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,\n\t0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,\n\t0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,\n\t0xc9,0xca,0xc9,0x00,0xca,0xcb,0xca,0x00,0xcb,0xcc,0xcb,0x00,0xcc,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,\n\t0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd8,0xd9,0xd8,0x00,0xd9,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,\n\t0xf5,0xf5,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,\n\t0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,\n\t0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,\n\t0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,\n\t0x58,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,\n\t0x60,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,\n\t0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7b,0x00,\n\t0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7f,0x7f,0x00,0x7f,0x80,0x80,0x00,0x80,0x81,0x81,0x00,0x81,0x82,0x82,0x00,0x82,0x83,0x83,0x00,\n\t0x83,0x84,0x84,0x00,0x84,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,\n\t0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8f,0x90,0x00,0x8f,0x90,0x91,0x00,0x90,0x91,0x92,0x00,0x91,0x92,0x93,0x00,0x92,0x93,0x94,0x00,0x93,0x94,0x95,0x00,\n\t0x94,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x98,0x98,0x00,0x98,0x99,0x99,0x00,0x99,0x9a,0x9b,0x00,0x9a,0x9b,0x9c,0x00,0x9b,0x9c,0x9d,0x00,0x9c,0x9d,0x9e,0x00,\n\t0x9d,0x9e,0x9f,0x00,0x9e,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,\n\t0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,\n\t0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb3,0xb4,0x00,0xb5,0xb4,0xb5,0x00,0xb6,0xb5,0xb6,0x00,0xb7,0xb7,0xb7,0x00,\n\t0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xc0,0xc0,0xbf,0x00,\n\t0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,\n\t0xc9,0xc9,0xc9,0x00,0xca,0xcb,0xca,0x00,0xcb,0xcc,0xcb,0x00,0xcc,0xcd,0xcc,0x00,0xcd,0xce,0xcd,0x00,0xce,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,\n\t0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd8,0xd9,0xd8,0x00,0xd9,0xda,0xd9,0x00,\n\t0xda,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf4,0xf4,0xf2,0x00,\n\t0xf5,0xf5,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,\n\t0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,\n\t0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,\n\t0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,\n\t0x58,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,\n\t0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,\n\t0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,\n\t0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x80,0x80,0x00,0x80,0x81,0x81,0x00,0x81,0x82,0x82,0x00,0x82,0x83,0x83,0x00,\n\t0x83,0x84,0x84,0x00,0x84,0x85,0x85,0x00,0x85,0x86,0x87,0x00,0x86,0x87,0x88,0x00,0x87,0x88,0x89,0x00,0x88,0x89,0x8a,0x00,0x89,0x8a,0x8b,0x00,0x8a,0x8b,0x8c,0x00,\n\t0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8f,0x8f,0x00,0x8f,0x90,0x91,0x00,0x90,0x91,0x92,0x00,0x91,0x92,0x93,0x00,0x92,0x93,0x94,0x00,0x93,0x94,0x95,0x00,\n\t0x94,0x95,0x96,0x00,0x95,0x96,0x97,0x00,0x97,0x98,0x98,0x00,0x98,0x99,0x99,0x00,0x99,0x9a,0x9b,0x00,0x9a,0x9b,0x9c,0x00,0x9b,0x9c,0x9d,0x00,0x9c,0x9d,0x9e,0x00,\n\t0x9d,0x9e,0x9f,0x00,0x9e,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,\n\t0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa9,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,0xac,0xab,0xac,0x00,0xad,0xac,0xad,0x00,0xae,0xad,0xae,0x00,\n\t0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb4,0xb3,0xb4,0x00,0xb5,0xb4,0xb5,0x00,0xb6,0xb5,0xb6,0x00,0xb7,0xb6,0xb7,0x00,\n\t0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,\n\t0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcc,0xcb,0x00,0xcc,0xcd,0xcc,0x00,0xcd,0xce,0xcd,0x00,0xce,0xcf,0xce,0x00,0xcf,0xd0,0xcf,0x00,0xd0,0xd1,0xd0,0x00,\n\t0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd8,0xd9,0xd8,0x00,0xd9,0xda,0xd9,0x00,\n\t0xda,0xdb,0xda,0x00,0xdb,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf5,0xf5,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,\n\t0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,\n\t0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,\n\t0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,\n\t0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,\n\t0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,\n\t0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x81,0x81,0x00,0x81,0x82,0x82,0x00,0x82,0x83,0x83,0x00,\n\t0x83,0x84,0x84,0x00,0x84,0x85,0x85,0x00,0x85,0x86,0x87,0x00,0x86,0x87,0x88,0x00,0x87,0x88,0x89,0x00,0x88,0x89,0x8a,0x00,0x89,0x8a,0x8b,0x00,0x8a,0x8b,0x8c,0x00,\n\t0x8b,0x8c,0x8d,0x00,0x8c,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x90,0x91,0x00,0x90,0x91,0x92,0x00,0x91,0x92,0x93,0x00,0x92,0x93,0x94,0x00,0x93,0x94,0x95,0x00,\n\t0x94,0x95,0x96,0x00,0x95,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x99,0x99,0x00,0x99,0x9a,0x9b,0x00,0x9a,0x9b,0x9c,0x00,0x9b,0x9c,0x9d,0x00,0x9c,0x9d,0x9e,0x00,\n\t0x9d,0x9e,0x9f,0x00,0x9e,0x9f,0xa0,0x00,0x9f,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,\n\t0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,0xac,0xab,0xac,0x00,0xad,0xac,0xad,0x00,0xae,0xad,0xae,0x00,\n\t0xaf,0xae,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb5,0xb4,0xb5,0x00,0xb6,0xb5,0xb6,0x00,0xb7,0xb6,0xb7,0x00,\n\t0xb8,0xb7,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,\n\t0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcc,0xcb,0x00,0xcc,0xcd,0xcc,0x00,0xcd,0xce,0xcd,0x00,0xce,0xcf,0xce,0x00,0xcf,0xd0,0xcf,0x00,0xd0,0xd1,0xd0,0x00,\n\t0xd1,0xd2,0xd1,0x00,0xd2,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd8,0xd7,0x00,0xd8,0xd9,0xd8,0x00,0xd9,0xda,0xd9,0x00,\n\t0xda,0xdb,0xda,0x00,0xdb,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,\n\t0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,\n\t0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,\n\t0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,\n\t0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,\n\t0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,\n\t0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x82,0x82,0x00,0x82,0x83,0x83,0x00,\n\t0x83,0x84,0x84,0x00,0x84,0x85,0x85,0x00,0x85,0x86,0x86,0x00,0x86,0x87,0x88,0x00,0x87,0x88,0x89,0x00,0x88,0x89,0x8a,0x00,0x89,0x8a,0x8b,0x00,0x8a,0x8b,0x8c,0x00,\n\t0x8b,0x8c,0x8d,0x00,0x8c,0x8d,0x8e,0x00,0x8d,0x8e,0x8f,0x00,0x8f,0x90,0x90,0x00,0x90,0x91,0x92,0x00,0x91,0x92,0x93,0x00,0x92,0x93,0x94,0x00,0x93,0x94,0x95,0x00,\n\t0x94,0x95,0x96,0x00,0x95,0x96,0x97,0x00,0x96,0x97,0x98,0x00,0x98,0x99,0x99,0x00,0x99,0x9a,0x9b,0x00,0x9a,0x9b,0x9c,0x00,0x9b,0x9c,0x9d,0x00,0x9c,0x9d,0x9e,0x00,\n\t0x9d,0x9e,0x9f,0x00,0x9e,0x9f,0xa0,0x00,0x9f,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,\n\t0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,0xac,0xab,0xac,0x00,0xad,0xac,0xad,0x00,0xae,0xad,0xae,0x00,\n\t0xaf,0xae,0xaf,0x00,0xb0,0xaf,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb6,0xb5,0xb6,0x00,0xb7,0xb6,0xb7,0x00,\n\t0xb8,0xb7,0xb8,0x00,0xb9,0xb8,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,\n\t0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcd,0xcc,0x00,0xcd,0xce,0xcd,0x00,0xce,0xcf,0xce,0x00,0xcf,0xd0,0xcf,0x00,0xd0,0xd1,0xd0,0x00,\n\t0xd1,0xd2,0xd1,0x00,0xd2,0xd3,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd9,0xd8,0x00,0xd9,0xda,0xd9,0x00,\n\t0xda,0xdb,0xda,0x00,0xdb,0xdc,0xdb,0x00,0xdc,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,\n\t0x20,0x1f,0x21,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,\n\t0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,\n\t0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x61,0x00,\n\t0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,\n\t0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,\n\t0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x83,0x83,0x00,\n\t0x83,0x84,0x84,0x00,0x84,0x85,0x85,0x00,0x85,0x86,0x86,0x00,0x86,0x87,0x87,0x00,0x87,0x88,0x89,0x00,0x88,0x89,0x8a,0x00,0x89,0x8a,0x8b,0x00,0x8a,0x8b,0x8c,0x00,\n\t0x8b,0x8c,0x8d,0x00,0x8c,0x8d,0x8e,0x00,0x8d,0x8e,0x8f,0x00,0x8e,0x8f,0x90,0x00,0x90,0x91,0x92,0x00,0x91,0x92,0x93,0x00,0x92,0x93,0x94,0x00,0x93,0x94,0x95,0x00,\n\t0x94,0x95,0x96,0x00,0x95,0x96,0x97,0x00,0x96,0x97,0x98,0x00,0x97,0x98,0x99,0x00,0x99,0x9a,0x9b,0x00,0x9a,0x9b,0x9c,0x00,0x9b,0x9c,0x9d,0x00,0x9c,0x9d,0x9e,0x00,\n\t0x9d,0x9e,0x9f,0x00,0x9e,0x9f,0xa0,0x00,0x9f,0xa0,0xa1,0x00,0xa0,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,\n\t0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,0xac,0xab,0xac,0x00,0xad,0xac,0xad,0x00,0xae,0xad,0xae,0x00,\n\t0xaf,0xae,0xaf,0x00,0xb0,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb7,0xb6,0xb7,0x00,\n\t0xb8,0xb7,0xb8,0x00,0xb9,0xb8,0xb9,0x00,0xba,0xb9,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc5,0xc4,0x00,0xc5,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc8,0x00,\n\t0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xce,0xcd,0x00,0xce,0xcf,0xce,0x00,0xcf,0xd0,0xcf,0x00,0xd0,0xd1,0xd0,0x00,\n\t0xd1,0xd2,0xd1,0x00,0xd2,0xd3,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xda,0xd9,0x00,\n\t0xda,0xdb,0xda,0x00,0xdb,0xdc,0xdb,0x00,0xdc,0xdd,0xdc,0x00,0xdd,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x20,0x00,\n\t0x20,0x1f,0x21,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,\n\t0x2f,0x2f,0x30,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,\n\t0x50,0x50,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,\n\t0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,\n\t0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,\n\t0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x84,0x84,0x00,0x84,0x85,0x85,0x00,0x85,0x86,0x86,0x00,0x86,0x87,0x87,0x00,0x87,0x88,0x89,0x00,0x88,0x89,0x8a,0x00,0x89,0x8a,0x8b,0x00,0x8a,0x8b,0x8c,0x00,\n\t0x8b,0x8c,0x8d,0x00,0x8c,0x8d,0x8e,0x00,0x8d,0x8e,0x8f,0x00,0x8e,0x8f,0x90,0x00,0x90,0x91,0x92,0x00,0x91,0x92,0x93,0x00,0x92,0x93,0x94,0x00,0x93,0x94,0x95,0x00,\n\t0x94,0x95,0x96,0x00,0x95,0x96,0x97,0x00,0x96,0x97,0x98,0x00,0x97,0x98,0x99,0x00,0x99,0x9a,0x9b,0x00,0x9a,0x9b,0x9c,0x00,0x9b,0x9c,0x9d,0x00,0x9c,0x9d,0x9e,0x00,\n\t0x9d,0x9e,0x9f,0x00,0x9e,0x9f,0xa0,0x00,0x9f,0xa0,0xa1,0x00,0xa0,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,\n\t0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,0xac,0xab,0xac,0x00,0xad,0xac,0xad,0x00,0xae,0xad,0xae,0x00,\n\t0xaf,0xae,0xaf,0x00,0xb0,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,\n\t0xb8,0xb7,0xb8,0x00,0xb9,0xb8,0xb9,0x00,0xba,0xb9,0xba,0x00,0xbb,0xba,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc5,0xc4,0x00,0xc5,0xc6,0xc5,0x00,0xc6,0xc7,0xc6,0x00,0xc7,0xc8,0xc7,0x00,\n\t0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xce,0xcd,0x00,0xce,0xcf,0xce,0x00,0xcf,0xd0,0xcf,0x00,0xd0,0xd1,0xd0,0x00,\n\t0xd1,0xd2,0xd1,0x00,0xd2,0xd3,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,\n\t0xda,0xdb,0xda,0x00,0xdb,0xdc,0xdb,0x00,0xdc,0xdd,0xdc,0x00,0xdd,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x20,0x00,\n\t0x1f,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,\n\t0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,\n\t0x60,0x60,0x61,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,\n\t0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,\n\t0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x86,0x86,0x00,0x86,0x87,0x87,0x00,0x87,0x88,0x88,0x00,0x88,0x89,0x8a,0x00,0x89,0x8a,0x8b,0x00,0x8a,0x8b,0x8c,0x00,\n\t0x8b,0x8c,0x8d,0x00,0x8c,0x8d,0x8e,0x00,0x8d,0x8e,0x8f,0x00,0x8e,0x8f,0x90,0x00,0x8f,0x90,0x91,0x00,0x91,0x92,0x93,0x00,0x92,0x93,0x94,0x00,0x93,0x94,0x95,0x00,\n\t0x94,0x95,0x96,0x00,0x95,0x96,0x97,0x00,0x96,0x97,0x98,0x00,0x97,0x98,0x99,0x00,0x98,0x99,0x9a,0x00,0x9a,0x9b,0x9c,0x00,0x9b,0x9c,0x9d,0x00,0x9c,0x9d,0x9e,0x00,\n\t0x9d,0x9e,0x9f,0x00,0x9e,0x9f,0xa0,0x00,0x9f,0xa0,0xa1,0x00,0xa0,0xa1,0xa2,0x00,0xa1,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,\n\t0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xac,0xab,0xac,0x00,0xad,0xac,0xad,0x00,0xae,0xad,0xae,0x00,\n\t0xaf,0xae,0xaf,0x00,0xb0,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,\n\t0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb9,0x00,0xba,0xb9,0xba,0x00,0xbb,0xba,0xbb,0x00,0xbc,0xbb,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc6,0xc5,0x00,0xc6,0xc7,0xc6,0x00,0xc7,0xc8,0xc7,0x00,\n\t0xc8,0xc9,0xc8,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xcf,0xce,0x00,0xcf,0xd0,0xcf,0x00,0xd0,0xd1,0xd0,0x00,\n\t0xd1,0xd2,0xd1,0x00,0xd2,0xd3,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,\n\t0xda,0xda,0xd9,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdd,0xdc,0x00,0xdd,0xde,0xdd,0x00,0xde,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xed,0xec,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x1f,0x00,\n\t0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4e,0x4e,0x50,0x00,\n\t0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,\n\t0x60,0x60,0x61,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x66,0x65,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,\n\t0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,\n\t0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x88,0x88,0x00,0x88,0x89,0x89,0x00,0x89,0x8a,0x8b,0x00,0x8a,0x8b,0x8c,0x00,\n\t0x8b,0x8c,0x8d,0x00,0x8c,0x8d,0x8e,0x00,0x8d,0x8e,0x8f,0x00,0x8e,0x8f,0x90,0x00,0x8f,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x93,0x94,0x00,0x93,0x94,0x95,0x00,\n\t0x94,0x95,0x96,0x00,0x95,0x96,0x97,0x00,0x96,0x97,0x98,0x00,0x97,0x98,0x99,0x00,0x98,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9c,0x9d,0x00,0x9c,0x9d,0x9e,0x00,\n\t0x9d,0x9e,0x9f,0x00,0x9e,0x9f,0xa0,0x00,0x9f,0xa0,0xa1,0x00,0xa0,0xa1,0xa2,0x00,0xa1,0xa2,0xa3,0x00,0xa2,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,\n\t0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xad,0xac,0xad,0x00,0xae,0xad,0xae,0x00,\n\t0xaf,0xae,0xaf,0x00,0xb0,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,\n\t0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xba,0x00,0xbb,0xba,0xbb,0x00,0xbc,0xbb,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc7,0xc6,0x00,0xc7,0xc8,0xc7,0x00,\n\t0xc8,0xc9,0xc8,0x00,0xc9,0xca,0xc9,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xd0,0xcf,0x00,0xd0,0xd1,0xd0,0x00,\n\t0xd1,0xd2,0xd1,0x00,0xd2,0xd3,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,\n\t0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xee,0xed,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,\n\t0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,\n\t0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5f,0x60,0x00,\n\t0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x68,0x69,0x00,\n\t0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x71,0x71,0x71,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,\n\t0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x8a,0x8a,0x00,0x8a,0x8b,0x8c,0x00,\n\t0x8b,0x8c,0x8d,0x00,0x8c,0x8d,0x8e,0x00,0x8d,0x8e,0x8f,0x00,0x8e,0x8f,0x90,0x00,0x8f,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x94,0x95,0x00,\n\t0x94,0x95,0x96,0x00,0x95,0x96,0x97,0x00,0x96,0x97,0x98,0x00,0x97,0x98,0x99,0x00,0x98,0x99,0x9a,0x00,0x99,0x9a,0x9b,0x00,0x9b,0x9b,0x9d,0x00,0x9c,0x9d,0x9e,0x00,\n\t0x9d,0x9e,0x9f,0x00,0x9e,0x9f,0xa0,0x00,0x9f,0xa0,0xa1,0x00,0xa0,0xa1,0xa2,0x00,0xa1,0xa2,0xa3,0x00,0xa2,0xa3,0xa4,0x00,0xa3,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,\n\t0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xae,0xad,0xae,0x00,\n\t0xaf,0xae,0xaf,0x00,0xb0,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb3,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,\n\t0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xbb,0x00,0xbc,0xbb,0xbc,0x00,0xbd,0xbc,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc8,0xc7,0x00,\n\t0xc8,0xc9,0xc8,0x00,0xc9,0xca,0xc9,0x00,0xca,0xcb,0xca,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd1,0xd0,0x00,\n\t0xd1,0xd2,0xd1,0x00,0xd2,0xd3,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,\n\t0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xef,0xee,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,\n\t0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,\n\t0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5f,0x60,0x00,\n\t0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x67,0x69,0x00,\n\t0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x71,0x70,0x71,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x7a,0x7a,0x00,\n\t0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,\n\t0x8b,0x8c,0x8d,0x00,0x8c,0x8d,0x8e,0x00,0x8d,0x8e,0x8f,0x00,0x8e,0x8f,0x90,0x00,0x8f,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,\n\t0x94,0x95,0x96,0x00,0x95,0x96,0x97,0x00,0x96,0x97,0x98,0x00,0x97,0x98,0x99,0x00,0x98,0x99,0x9a,0x00,0x99,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9e,0x00,\n\t0x9d,0x9e,0x9f,0x00,0x9e,0x9f,0xa0,0x00,0x9f,0xa0,0xa1,0x00,0xa0,0xa1,0xa2,0x00,0xa1,0xa2,0xa3,0x00,0xa2,0xa3,0xa4,0x00,0xa3,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,\n\t0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,\n\t0xaf,0xae,0xaf,0x00,0xb0,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb3,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,\n\t0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbc,0x00,0xbd,0xbc,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc8,0xc7,0x00,\n\t0xc8,0xc9,0xc8,0x00,0xc9,0xca,0xc9,0x00,0xca,0xcb,0xca,0x00,0xcb,0xcc,0xcb,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,\n\t0xd1,0xd2,0xd1,0x00,0xd2,0xd3,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,\n\t0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe1,0xe0,0xe0,0x00,0xe2,0xe1,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,\n\t0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3d,0x00,0x3c,0x3c,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,\n\t0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,\n\t0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,0x68,0x67,0x69,0x00,\n\t0x69,0x68,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x7a,0x7a,0x00,\n\t0x7a,0x7b,0x7b,0x00,0x7b,0x7c,0x7c,0x00,0x7c,0x7d,0x7d,0x00,0x7d,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,\n\t0x8b,0x8b,0x8c,0x00,0x8c,0x8d,0x8e,0x00,0x8d,0x8e,0x8f,0x00,0x8e,0x8f,0x90,0x00,0x8f,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,\n\t0x94,0x94,0x96,0x00,0x95,0x96,0x97,0x00,0x96,0x97,0x98,0x00,0x97,0x98,0x99,0x00,0x98,0x99,0x9a,0x00,0x99,0x9a,0x9b,0x00,0x9a,0x9b,0x9c,0x00,0x9c,0x9c,0x9e,0x00,\n\t0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0x9f,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa3,0xa3,0xa5,0x00,0xa4,0xa5,0xa6,0x00,\n\t0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,\n\t0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb3,0xb4,0x00,0xb5,0xb4,0xb5,0x00,0xb6,0xb6,0xb6,0x00,\n\t0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbd,0x00,0xbe,0xbd,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc9,0xc8,0x00,0xc9,0xca,0xc9,0x00,0xca,0xcb,0xca,0x00,0xcb,0xcc,0xcb,0x00,0xcc,0xcd,0xcc,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,\n\t0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,\n\t0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe2,0xe1,0xe1,0x00,\n\t0xe3,0xe2,0xe2,0x00,0xe4,0xe3,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf1,0xf0,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,\n\t0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3d,0x00,0x3c,0x3c,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,\n\t0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,\n\t0x60,0x5f,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,0x68,0x67,0x69,0x00,\n\t0x69,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,\n\t0x71,0x71,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,\n\t0x7a,0x7b,0x7b,0x00,0x7b,0x7c,0x7c,0x00,0x7c,0x7d,0x7d,0x00,0x7d,0x7e,0x7e,0x00,0x7e,0x7f,0x7f,0x00,0x7f,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,\n\t0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8e,0x8f,0x00,0x8e,0x8f,0x90,0x00,0x8f,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,\n\t0x94,0x94,0x95,0x00,0x95,0x95,0x97,0x00,0x96,0x97,0x98,0x00,0x97,0x98,0x99,0x00,0x98,0x99,0x9a,0x00,0x99,0x9a,0x9b,0x00,0x9a,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,\n\t0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0x9f,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa3,0xa3,0xa5,0x00,0xa4,0xa4,0xa6,0x00,\n\t0xa5,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,\n\t0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb3,0xb4,0x00,0xb5,0xb4,0xb5,0x00,0xb6,0xb6,0xb6,0x00,\n\t0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xca,0xc9,0x00,0xca,0xcb,0xca,0x00,0xcb,0xcc,0xcb,0x00,0xcc,0xcd,0xcc,0x00,0xcd,0xce,0xcd,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,\n\t0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,\n\t0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xe0,0x00,0xe2,0xe1,0xe1,0x00,\n\t0xe3,0xe2,0xe2,0x00,0xe4,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf2,0xf1,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,\n\t0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,\n\t0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,\n\t0x69,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,\n\t0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,\n\t0x7a,0x7b,0x7b,0x00,0x7b,0x7c,0x7c,0x00,0x7c,0x7d,0x7d,0x00,0x7d,0x7e,0x7e,0x00,0x7e,0x7f,0x7f,0x00,0x7f,0x80,0x80,0x00,0x80,0x81,0x81,0x00,0x82,0x82,0x82,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,\n\t0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8f,0x90,0x00,0x8f,0x90,0x91,0x00,0x90,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,\n\t0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x98,0x00,0x97,0x98,0x99,0x00,0x98,0x99,0x9a,0x00,0x99,0x9a,0x9b,0x00,0x9a,0x9b,0x9c,0x00,0x9b,0x9c,0x9d,0x00,\n\t0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0x9f,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa3,0xa3,0xa5,0x00,0xa4,0xa4,0xa6,0x00,\n\t0xa5,0xa5,0xa7,0x00,0xa6,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,0xab,0xaa,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,\n\t0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb4,0xb3,0xb4,0x00,0xb5,0xb4,0xb5,0x00,0xb6,0xb5,0xb6,0x00,\n\t0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xcb,0xca,0x00,0xcb,0xcc,0xcb,0x00,0xcc,0xcd,0xcc,0x00,0xcd,0xce,0xcd,0x00,0xce,0xcf,0xce,0x00,0xd0,0xd0,0xd0,0x00,\n\t0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd8,0xd9,0xd8,0x00,\n\t0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe1,0x00,\n\t0xe3,0xe2,0xe2,0x00,0xe4,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe5,0xe5,0x00,0xe7,0xe6,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf3,0xf2,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,\n\t0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x48,0x48,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,\n\t0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,\n\t0x69,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,\n\t0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,\n\t0x7a,0x7b,0x7b,0x00,0x7b,0x7c,0x7c,0x00,0x7c,0x7d,0x7d,0x00,0x7d,0x7e,0x7e,0x00,0x7e,0x7f,0x7f,0x00,0x7f,0x80,0x80,0x00,0x80,0x81,0x81,0x00,0x81,0x82,0x82,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,\n\t0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x90,0x91,0x00,0x90,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,\n\t0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,0x98,0x99,0x9a,0x00,0x99,0x9a,0x9b,0x00,0x9a,0x9b,0x9c,0x00,0x9b,0x9c,0x9d,0x00,\n\t0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0x9f,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa3,0xa3,0xa5,0x00,0xa4,0xa4,0xa6,0x00,\n\t0xa5,0xa5,0xa7,0x00,0xa6,0xa6,0xa8,0x00,0xa7,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,0xab,0xaa,0xac,0x00,0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,\n\t0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb5,0xb4,0xb5,0x00,0xb6,0xb5,0xb6,0x00,\n\t0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcc,0xcb,0x00,0xcc,0xcd,0xcc,0x00,0xcd,0xce,0xcd,0x00,0xce,0xcf,0xce,0x00,0xcf,0xd0,0xcf,0x00,\n\t0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,\n\t0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,\n\t0xe3,0xe2,0xe2,0x00,0xe4,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe5,0xe5,0x00,0xe7,0xe6,0xe6,0x00,0xe8,0xe7,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x17,0x17,0x17,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x24,0x26,0x00,0x26,0x25,0x27,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3e,0x3e,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,\n\t0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,\n\t0x68,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,\n\t0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,\n\t0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7e,0x7e,0x00,0x7e,0x7f,0x7f,0x00,0x7f,0x80,0x80,0x00,0x80,0x81,0x81,0x00,0x81,0x82,0x82,0x00,\n\t0x82,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,\n\t0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x91,0x00,0x90,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,\n\t0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,0x99,0x9a,0x9b,0x00,0x9a,0x9b,0x9c,0x00,0x9b,0x9c,0x9d,0x00,\n\t0x9c,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,\n\t0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,0xac,0xab,0xac,0x00,0xad,0xac,0xad,0x00,\n\t0xae,0xad,0xae,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb6,0xb5,0xb6,0x00,\n\t0xb7,0xb6,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcd,0xcc,0x00,0xcd,0xce,0xcd,0x00,0xce,0xcf,0xce,0x00,0xcf,0xd0,0xcf,0x00,\n\t0xd0,0xd1,0xd0,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,\n\t0xd9,0xd9,0xd9,0x00,0xdb,0xda,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,\n\t0xe2,0xe2,0xe1,0x00,0xe4,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe5,0xe5,0x00,0xe7,0xe6,0xe6,0x00,0xe8,0xe7,0xe7,0x00,0xe9,0xe8,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x24,0x26,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x34,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3e,0x3e,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,\n\t0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x58,0x57,0x59,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,\n\t0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,\n\t0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x75,0x76,0x00,0x75,0x76,0x77,0x00,0x76,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,\n\t0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x81,0x81,0x00,0x81,0x82,0x82,0x00,\n\t0x82,0x83,0x83,0x00,0x83,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,\n\t0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,\n\t0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,0x99,0x99,0x9b,0x00,0x9a,0x9b,0x9c,0x00,0x9b,0x9c,0x9d,0x00,\n\t0x9c,0x9d,0x9e,0x00,0x9d,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,\n\t0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xac,0xab,0xac,0x00,0xad,0xac,0xad,0x00,\n\t0xae,0xad,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,\n\t0xb7,0xb6,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xcf,0xce,0x00,0xcf,0xd0,0xcf,0x00,\n\t0xd0,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,\n\t0xd9,0xd9,0xd9,0x00,0xdb,0xda,0xda,0x00,0xdc,0xdb,0xdb,0x00,0xdd,0xdc,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,\n\t0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe5,0xe5,0x00,0xe7,0xe6,0xe6,0x00,0xe8,0xe7,0xe7,0x00,0xe9,0xe8,0xe8,0x00,0xea,0xe9,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,\n\t0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x33,0x35,0x00,0x34,0x34,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,\n\t0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x59,0x58,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x67,0x69,0x00,\n\t0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,\n\t0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x76,0x77,0x00,0x76,0x77,0x78,0x00,0x77,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,\n\t0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,\n\t0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x93,0x00,0x93,0x93,0x94,0x00,\n\t0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x9a,0x00,0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9b,0x9c,0x9d,0x00,\n\t0x9c,0x9d,0x9e,0x00,0x9d,0x9e,0x9f,0x00,0x9e,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,\n\t0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xad,0xac,0xad,0x00,\n\t0xae,0xad,0xae,0x00,0xaf,0xae,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,\n\t0xb6,0xb6,0xb7,0x00,0xb8,0xb7,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xd0,0xcf,0x00,\n\t0xd0,0xd1,0xd0,0x00,0xd1,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,\n\t0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdc,0xdb,0xdb,0x00,0xdd,0xdc,0xdc,0x00,0xde,0xdd,0xdd,0x00,0xdf,0xde,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,\n\t0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe6,0xe5,0xe5,0x00,0xe7,0xe6,0xe6,0x00,0xe8,0xe7,0xe7,0x00,0xe9,0xe8,0xe8,0x00,0xea,0xe9,0xe9,0x00,\n\t0xeb,0xea,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,\n\t0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,0x34,0x34,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,\n\t0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,\n\t0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,\n\t0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x76,0x77,0x00,0x76,0x77,0x78,0x00,0x77,0x78,0x79,0x00,0x78,0x79,0x7a,0x00,\n\t0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x86,0x85,0x86,0x00,0x87,0x86,0x87,0x00,0x88,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,\n\t0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x93,0x00,0x93,0x92,0x94,0x00,\n\t0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x9a,0x00,0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,\n\t0x9c,0x9d,0x9e,0x00,0x9d,0x9e,0x9f,0x00,0x9e,0x9f,0xa0,0x00,0x9f,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,\n\t0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,\n\t0xae,0xad,0xae,0x00,0xaf,0xae,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,\n\t0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,\n\t0xd0,0xd1,0xd0,0x00,0xd1,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,\n\t0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdc,0xdb,0xdb,0x00,0xdd,0xdc,0xdc,0x00,0xde,0xdd,0xdd,0x00,0xdf,0xde,0xde,0x00,0xe0,0xdf,0xdf,0x00,0xe1,0xe0,0xe0,0x00,\n\t0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe7,0xe6,0xe6,0x00,0xe8,0xe7,0xe7,0x00,0xe9,0xe8,0xe8,0x00,0xea,0xe9,0xe9,0x00,\n\t0xeb,0xea,0xea,0x00,0xec,0xeb,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,\n\t0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,\n\t0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,\n\t0x68,0x67,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x70,0x71,0x00,\n\t0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,0x76,0x77,0x78,0x00,0x77,0x78,0x79,0x00,0x78,0x79,0x7a,0x00,\n\t0x79,0x7a,0x7b,0x00,0x7a,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x87,0x86,0x87,0x00,0x88,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,\n\t0x8b,0x8a,0x8b,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x93,0x92,0x94,0x00,\n\t0x94,0x93,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,\n\t0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0x9f,0xa0,0xa1,0x00,0xa0,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,\n\t0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xb0,0xaf,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,\n\t0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb9,0xb8,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,\n\t0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,\n\t0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdd,0xdc,0xdc,0x00,0xde,0xdd,0xdd,0x00,0xdf,0xde,0xde,0x00,0xe0,0xdf,0xdf,0x00,0xe1,0xe0,0xe0,0x00,\n\t0xe2,0xe1,0xe1,0x00,0xe3,0xe2,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe8,0xe7,0xe7,0x00,0xe9,0xe8,0xe8,0x00,0xea,0xe9,0xe9,0x00,\n\t0xeb,0xea,0xea,0x00,0xec,0xeb,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,\n\t0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,\n\t0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,\n\t0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,\n\t0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x70,0x71,0x00,\n\t0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,0x76,0x77,0x78,0x00,0x77,0x78,0x79,0x00,0x78,0x79,0x7a,0x00,\n\t0x79,0x7a,0x7b,0x00,0x7a,0x7b,0x7c,0x00,0x7b,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x87,0x86,0x87,0x00,0x88,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,\n\t0x8b,0x8a,0x8b,0x00,0x8c,0x8b,0x8c,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x94,0x00,\n\t0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,\n\t0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0x9f,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,0xa1,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,\n\t0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,\n\t0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,\n\t0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd4,0xd3,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,\n\t0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdd,0xdc,0xdc,0x00,0xde,0xdd,0xdd,0x00,0xdf,0xde,0xde,0x00,0xe0,0xdf,0xdf,0x00,0xe1,0xe0,0xe0,0x00,\n\t0xe2,0xe1,0xe1,0x00,0xe3,0xe2,0xe2,0x00,0xe4,0xe3,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe9,0xe8,0xe8,0x00,0xea,0xe9,0xe9,0x00,\n\t0xeb,0xea,0xea,0x00,0xec,0xeb,0xeb,0x00,0xed,0xec,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,\n\t0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,\n\t0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,\n\t0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,\n\t0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,\n\t0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,0x76,0x77,0x78,0x00,0x77,0x78,0x79,0x00,0x78,0x79,0x7a,0x00,\n\t0x79,0x7a,0x7b,0x00,0x7a,0x7b,0x7c,0x00,0x7b,0x7c,0x7d,0x00,0x7c,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x87,0x86,0x87,0x00,0x88,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,\n\t0x8b,0x8a,0x8b,0x00,0x8c,0x8b,0x8c,0x00,0x8d,0x8c,0x8d,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,\n\t0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,\n\t0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0x9f,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa4,0xa4,0xa5,0x00,\n\t0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb6,0x00,\n\t0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,\n\t0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd5,0xd4,0xd4,0x00,0xd6,0xd5,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd8,0x00,\n\t0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xde,0xdd,0xdd,0x00,0xdf,0xde,0xde,0x00,0xe0,0xdf,0xdf,0x00,0xe1,0xe0,0xe0,0x00,\n\t0xe2,0xe1,0xe1,0x00,0xe3,0xe2,0xe2,0x00,0xe4,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xea,0xe9,0xe9,0x00,\n\t0xeb,0xea,0xea,0x00,0xec,0xeb,0xeb,0x00,0xed,0xec,0xec,0x00,0xee,0xed,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,\n\t0x2e,0x2e,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,\n\t0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,\n\t0x4f,0x4f,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,\n\t0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,\n\t0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,0x76,0x76,0x78,0x00,0x77,0x78,0x79,0x00,0x78,0x79,0x7a,0x00,\n\t0x79,0x7a,0x7b,0x00,0x7a,0x7b,0x7c,0x00,0x7b,0x7c,0x7d,0x00,0x7c,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x87,0x86,0x87,0x00,0x88,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,\n\t0x8b,0x8a,0x8b,0x00,0x8c,0x8b,0x8c,0x00,0x8d,0x8c,0x8d,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,\n\t0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,\n\t0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0x9f,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa3,0xa3,0xa5,0x00,\n\t0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,\n\t0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,\n\t0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd5,0xd4,0xd4,0x00,0xd6,0xd5,0xd5,0x00,0xd7,0xd6,0xd6,0x00,0xd8,0xd7,0xd7,0x00,\n\t0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xde,0xdd,0xdd,0x00,0xdf,0xde,0xde,0x00,0xe0,0xdf,0xdf,0x00,0xe1,0xe0,0xe0,0x00,\n\t0xe2,0xe1,0xe1,0x00,0xe3,0xe2,0xe2,0x00,0xe4,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,\n\t0xeb,0xea,0xea,0x00,0xec,0xeb,0xeb,0x00,0xed,0xec,0xec,0x00,0xee,0xed,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,\n\t0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,\n\t0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,\n\t0x5f,0x5e,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,\n\t0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,\n\t0x70,0x70,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,0x76,0x76,0x78,0x00,0x77,0x78,0x79,0x00,0x78,0x79,0x7a,0x00,\n\t0x79,0x7a,0x7b,0x00,0x7a,0x7b,0x7c,0x00,0x7b,0x7c,0x7d,0x00,0x7c,0x7d,0x7e,0x00,0x7d,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x88,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,\n\t0x8b,0x8a,0x8b,0x00,0x8c,0x8b,0x8c,0x00,0x8d,0x8c,0x8d,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,\n\t0x93,0x93,0x94,0x00,0x94,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,\n\t0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0x9f,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa3,0xa3,0xa5,0x00,\n\t0xa4,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,\n\t0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,\n\t0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd6,0xd5,0xd5,0x00,0xd7,0xd6,0xd6,0x00,0xd8,0xd7,0xd7,0x00,\n\t0xd9,0xd8,0xd8,0x00,0xda,0xd9,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xdf,0xde,0xde,0x00,0xe0,0xdf,0xdf,0x00,0xe1,0xe0,0xe0,0x00,\n\t0xe2,0xe1,0xe1,0x00,0xe3,0xe2,0xe2,0x00,0xe4,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe5,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,\n\t0xea,0xea,0xe9,0x00,0xeb,0xeb,0xeb,0x00,0xed,0xec,0xec,0x00,0xee,0xed,0xed,0x00,0xef,0xee,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,\n\t0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4d,0x4d,0x4f,0x00,\n\t0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,\n\t0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,\n\t0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,\n\t0x70,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x77,0x00,0x76,0x76,0x78,0x00,0x77,0x77,0x79,0x00,0x78,0x79,0x7a,0x00,\n\t0x79,0x7a,0x7b,0x00,0x7a,0x7b,0x7c,0x00,0x7b,0x7c,0x7d,0x00,0x7c,0x7d,0x7e,0x00,0x7d,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,\n\t0x8b,0x8a,0x8b,0x00,0x8c,0x8b,0x8c,0x00,0x8d,0x8c,0x8d,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,\n\t0x93,0x93,0x94,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9d,0x00,\n\t0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0x9f,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa3,0xa3,0xa5,0x00,\n\t0xa4,0xa4,0xa6,0x00,0xa5,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,\n\t0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,\n\t0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd7,0xd6,0xd6,0x00,0xd8,0xd7,0xd7,0x00,\n\t0xd9,0xd8,0xd8,0x00,0xda,0xd9,0xd9,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xe0,0xdf,0xdf,0x00,0xe1,0xe0,0xe0,0x00,\n\t0xe2,0xe1,0xe1,0x00,0xe3,0xe2,0xe2,0x00,0xe4,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe5,0xe5,0x00,0xe7,0xe6,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,\n\t0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xec,0x00,0xee,0xed,0xed,0x00,0xef,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,\n\t0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,\n\t0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,\n\t0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,\n\t0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,\n\t0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x79,0x00,0x78,0x78,0x7a,0x00,\n\t0x79,0x7a,0x7b,0x00,0x7a,0x7b,0x7c,0x00,0x7b,0x7c,0x7d,0x00,0x7c,0x7d,0x7e,0x00,0x7d,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,\n\t0x8b,0x8a,0x8b,0x00,0x8c,0x8b,0x8c,0x00,0x8d,0x8c,0x8d,0x00,0x8e,0x8d,0x8e,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,0x92,0x92,0x93,0x00,\n\t0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,0x9b,0x9b,0x9c,0x00,\n\t0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0x9f,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa3,0xa3,0xa5,0x00,\n\t0xa4,0xa4,0xa6,0x00,0xa5,0xa5,0xa7,0x00,0xa6,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb5,0xb5,0xb5,0x00,\n\t0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,\n\t0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd8,0xd7,0xd7,0x00,\n\t0xd9,0xd8,0xd8,0x00,0xda,0xd9,0xd9,0x00,0xdb,0xda,0xda,0x00,0xdc,0xdb,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe1,0xe0,0xe0,0x00,\n\t0xe2,0xe1,0xe1,0x00,0xe3,0xe2,0xe2,0x00,0xe4,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe5,0xe5,0x00,0xe7,0xe6,0xe6,0x00,0xe8,0xe7,0xe7,0x00,0xe9,0xe9,0xe8,0x00,\n\t0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xed,0x00,0xef,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf3,0xf3,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,\n\t0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,\n\t0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,\n\t0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,\n\t0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,\n\t0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,\n\t0x79,0x7a,0x7b,0x00,0x7a,0x7b,0x7c,0x00,0x7b,0x7c,0x7d,0x00,0x7c,0x7d,0x7e,0x00,0x7d,0x7e,0x7f,0x00,0x7e,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,\n\t0x8b,0x8a,0x8b,0x00,0x8c,0x8b,0x8c,0x00,0x8d,0x8c,0x8d,0x00,0x8e,0x8d,0x8e,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,0x92,0x92,0x93,0x00,\n\t0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,\n\t0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0x9f,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa3,0xa3,0xa5,0x00,\n\t0xa4,0xa4,0xa6,0x00,0xa5,0xa5,0xa7,0x00,0xa6,0xa6,0xa8,0x00,0xa7,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb5,0xb5,0xb5,0x00,\n\t0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,0xcf,0xce,0xcf,0x00,\n\t0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd8,0xd7,0xd7,0x00,\n\t0xd9,0xd8,0xd8,0x00,0xda,0xd9,0xd9,0x00,0xdb,0xda,0xda,0x00,0xdc,0xdb,0xdb,0x00,0xdd,0xdc,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,\n\t0xe2,0xe1,0xe1,0x00,0xe3,0xe2,0xe2,0x00,0xe4,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe5,0xe5,0x00,0xe7,0xe6,0xe6,0x00,0xe8,0xe7,0xe7,0x00,0xe9,0xe9,0xe8,0x00,\n\t0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,0xf2,0xf1,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf3,0xf3,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3d,0x3d,0x3e,0x00,\n\t0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,\n\t0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5e,0x5d,0x60,0x00,\n\t0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,0x67,0x66,0x69,0x00,\n\t0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,\n\t0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,\n\t0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,\n\t0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8d,0x8c,0x8d,0x00,0x8e,0x8d,0x8e,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,\n\t0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,\n\t0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa5,0x00,\n\t0xa4,0xa4,0xa6,0x00,0xa5,0xa5,0xa7,0x00,0xa6,0xa6,0xa8,0x00,0xa7,0xa7,0xa9,0x00,0xa8,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,\n\t0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,\n\t0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,0xcf,0xce,0xcf,0x00,\n\t0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,\n\t0xd9,0xd8,0xd8,0x00,0xda,0xd9,0xd9,0x00,0xdb,0xda,0xda,0x00,0xdc,0xdb,0xdb,0x00,0xdd,0xdc,0xdc,0x00,0xde,0xdd,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,\n\t0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe4,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe5,0xe5,0x00,0xe7,0xe6,0xe6,0x00,0xe8,0xe7,0xe7,0x00,0xe9,0xe8,0xe8,0x00,\n\t0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,0xf2,0xf1,0xf1,0x00,\n\t0xf3,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf8,0x00,0xfa,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3d,0x3d,0x3e,0x00,\n\t0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,\n\t0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5e,0x5d,0x60,0x00,\n\t0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,0x65,0x65,0x67,0x00,0x67,0x66,0x69,0x00,\n\t0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6c,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,\n\t0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,\n\t0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,\n\t0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,\n\t0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8e,0x8d,0x8e,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,\n\t0x93,0x92,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,0x99,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,\n\t0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa9,0x00,0xa8,0xa8,0xaa,0x00,0xa9,0xa9,0xab,0x00,0xab,0xaa,0xac,0x00,0xac,0xac,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,\n\t0xb5,0xb5,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,\n\t0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc2,0xc1,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xce,0x00,0xcf,0xce,0xcf,0x00,\n\t0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,\n\t0xd8,0xd8,0xd8,0x00,0xda,0xd9,0xd9,0x00,0xdb,0xda,0xda,0x00,0xdc,0xdb,0xdb,0x00,0xdd,0xdc,0xdc,0x00,0xde,0xdd,0xdd,0x00,0xdf,0xde,0xdf,0x00,0xe0,0xe0,0xe0,0x00,\n\t0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe5,0xe5,0x00,0xe7,0xe6,0xe6,0x00,0xe8,0xe7,0xe7,0x00,0xe9,0xe8,0xe8,0x00,\n\t0xea,0xe9,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xf0,0x00,0xf2,0xf1,0xf1,0x00,\n\t0xf3,0xf2,0xf2,0x00,0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf7,0x00,\n\t0xf9,0xf9,0xf8,0x00,0xfa,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x2f,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3c,0x3c,0x3e,0x00,\n\t0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,\n\t0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,\n\t0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,0x66,0x66,0x68,0x00,\n\t0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6c,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,\n\t0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,\n\t0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x82,0x00,\n\t0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,\n\t0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,\n\t0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,\n\t0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xac,0x00,0xac,0xab,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,\n\t0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbe,0x00,\n\t0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xcf,0x00,\n\t0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,\n\t0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xdb,0xda,0xda,0x00,0xdc,0xdb,0xdb,0x00,0xdd,0xdc,0xdc,0x00,0xde,0xdd,0xdd,0x00,0xdf,0xde,0xde,0x00,0xe0,0xdf,0xe0,0x00,\n\t0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe7,0xe6,0xe6,0x00,0xe8,0xe7,0xe7,0x00,0xe9,0xe8,0xe8,0x00,\n\t0xea,0xe9,0xe9,0x00,0xeb,0xea,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf1,0x00,\n\t0xf3,0xf2,0xf2,0x00,0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf7,0x00,\n\t0xf9,0xf9,0xf8,0x00,0xfa,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x2f,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3c,0x3c,0x3e,0x00,\n\t0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,\n\t0x47,0x47,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,\n\t0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,\n\t0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,\n\t0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6c,0x6f,0x00,0x6e,0x6d,0x70,0x00,0x6f,0x6f,0x71,0x00,\n\t0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,\n\t0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,\n\t0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,\n\t0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,\n\t0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,\n\t0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,\n\t0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,\n\t0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc5,0xc4,0xc5,0x00,0xc6,0xc5,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,\n\t0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,\n\t0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdc,0xdb,0xdb,0x00,0xdd,0xdc,0xdc,0x00,0xde,0xdd,0xdd,0x00,0xdf,0xde,0xde,0x00,0xe0,0xdf,0xdf,0x00,\n\t0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe8,0xe7,0xe7,0x00,0xe9,0xe8,0xe8,0x00,\n\t0xea,0xe9,0xe9,0x00,0xeb,0xea,0xea,0x00,0xec,0xeb,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,\n\t0xf3,0xf2,0xf2,0x00,0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf4,0xf4,0x00,0xf6,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf7,0x00,\n\t0xf9,0xf9,0xf8,0x00,0xfa,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x2f,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,0x34,0x34,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3c,0x3c,0x3e,0x00,\n\t0x3d,0x3d,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,\n\t0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,\n\t0x5e,0x5e,0x60,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,\n\t0x67,0x66,0x69,0x00,0x69,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6c,0x6f,0x00,0x6e,0x6d,0x70,0x00,0x6f,0x6f,0x71,0x00,\n\t0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,\n\t0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,\n\t0x81,0x81,0x82,0x00,0x82,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,\n\t0x8a,0x89,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x91,0x00,0x90,0x90,0x92,0x00,0x92,0x91,0x93,0x00,\n\t0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x9a,0x00,0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,\n\t0x9b,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,\n\t0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,\n\t0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,0xc6,0xc5,0xc6,0x00,\n\t0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,\n\t0xcf,0xcf,0xcf,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,0xd7,0xd7,0xd7,0x00,\n\t0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdd,0xdc,0xdc,0x00,0xde,0xdd,0xdd,0x00,0xdf,0xde,0xde,0x00,0xe0,0xdf,0xdf,0x00,\n\t0xe1,0xe0,0xe0,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,0xe9,0xe8,0xe8,0x00,\n\t0xea,0xe9,0xe9,0x00,0xeb,0xea,0xea,0x00,0xec,0xeb,0xeb,0x00,0xed,0xec,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,\n\t0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf4,0xf4,0x00,0xf6,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf7,0x00,\n\t0xf9,0xf8,0xf8,0x00,0xfa,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x2f,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3c,0x3c,0x3e,0x00,\n\t0x3d,0x3d,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,\n\t0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x57,0x56,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,\n\t0x5e,0x5e,0x60,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,\n\t0x67,0x66,0x69,0x00,0x68,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x70,0x00,0x6f,0x6e,0x71,0x00,\n\t0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,0x77,0x76,0x78,0x00,0x78,0x78,0x79,0x00,\n\t0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,\n\t0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,\n\t0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x91,0x00,0x90,0x90,0x92,0x00,0x91,0x91,0x93,0x00,\n\t0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,\n\t0x9b,0x9b,0x9d,0x00,0x9c,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,\n\t0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,\n\t0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,\n\t0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,\n\t0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,0xd7,0xd6,0xd7,0x00,\n\t0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xdf,0xde,0xde,0x00,0xe0,0xdf,0xdf,0x00,\n\t0xe1,0xe0,0xe0,0x00,0xe2,0xe1,0xe1,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,\n\t0xea,0xe9,0xe9,0x00,0xeb,0xea,0xea,0x00,0xec,0xeb,0xeb,0x00,0xed,0xec,0xec,0x00,0xee,0xed,0xed,0x00,0xef,0xee,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,\n\t0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,0xf4,0xf3,0xf3,0x00,0xf5,0xf4,0xf4,0x00,0xf6,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,\n\t0xf9,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2e,0x2e,0x30,0x00,0x2f,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x32,0x34,0x00,0x33,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3c,0x3c,0x3e,0x00,\n\t0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,\n\t0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x58,0x57,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,\n\t0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,\n\t0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,\n\t0x70,0x6f,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,0x77,0x76,0x78,0x00,0x78,0x77,0x79,0x00,\n\t0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,\n\t0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,\n\t0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x91,0x00,0x90,0x90,0x92,0x00,0x91,0x91,0x93,0x00,\n\t0x92,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,0x9a,0x9a,0x9c,0x00,\n\t0x9b,0x9b,0x9d,0x00,0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,\n\t0xa4,0xa3,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,\n\t0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbd,0xbd,0xbd,0x00,\n\t0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,\n\t0xc6,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,\n\t0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,0xd7,0xd6,0xd7,0x00,\n\t0xd8,0xd7,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xe0,0xdf,0xdf,0x00,\n\t0xe1,0xe0,0xe0,0x00,0xe2,0xe1,0xe1,0x00,0xe3,0xe2,0xe2,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,\n\t0xe9,0xe9,0xe9,0x00,0xeb,0xea,0xea,0x00,0xec,0xeb,0xeb,0x00,0xed,0xec,0xec,0x00,0xee,0xed,0xed,0x00,0xef,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf1,0xf0,0x00,\n\t0xf2,0xf2,0xf1,0x00,0xf3,0xf2,0xf2,0x00,0xf4,0xf3,0xf3,0x00,0xf5,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf7,0xf7,0x00,\n\t0xf9,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2e,0x2e,0x30,0x00,0x2f,0x2f,0x31,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x33,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3c,0x3c,0x3e,0x00,\n\t0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,\n\t0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,\n\t0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,\n\t0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,\n\t0x70,0x6f,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,\n\t0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,\n\t0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,0x87,0x87,0x89,0x00,0x88,0x88,0x8a,0x00,\n\t0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x92,0x00,0x91,0x91,0x93,0x00,\n\t0x92,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,\n\t0x9b,0x9b,0x9d,0x00,0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,\n\t0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,\n\t0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,\n\t0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,\n\t0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,0xd7,0xd6,0xd7,0x00,\n\t0xd8,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe1,0xe0,0xe0,0x00,0xe2,0xe1,0xe1,0x00,0xe3,0xe2,0xe2,0x00,0xe4,0xe3,0xe3,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,\n\t0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xec,0xeb,0xeb,0x00,0xed,0xec,0xec,0x00,0xee,0xed,0xed,0x00,0xef,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,\n\t0xf2,0xf2,0xf1,0x00,0xf3,0xf2,0xf2,0x00,0xf4,0xf3,0xf3,0x00,0xf5,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf7,0xf7,0x00,\n\t0xf9,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x16,0x16,0x16,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2e,0x2e,0x30,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x33,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3c,0x3c,0x3e,0x00,\n\t0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,\n\t0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,\n\t0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,\n\t0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,\n\t0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,\n\t0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,\n\t0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,0x87,0x87,0x89,0x00,0x88,0x88,0x8a,0x00,\n\t0x89,0x89,0x8b,0x00,0x8a,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x92,0x00,0x91,0x91,0x93,0x00,\n\t0x92,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,\n\t0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0xa0,0x00,0x9f,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,\n\t0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,\n\t0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,\n\t0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,0xd7,0xd6,0xd7,0x00,\n\t0xd8,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe3,0xe2,0xe2,0x00,0xe4,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,\n\t0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xec,0xeb,0xeb,0x00,0xed,0xec,0xec,0x00,0xee,0xed,0xed,0x00,0xef,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,\n\t0xf2,0xf1,0xf1,0x00,0xf3,0xf2,0xf2,0x00,0xf4,0xf3,0xf3,0x00,0xf5,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf6,0xf6,0x00,0xf8,0xf7,0xf7,0x00,\n\t0xf9,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2e,0x2e,0x30,0x00,0x2f,0x2f,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3d,0x00,0x3c,0x3c,0x3e,0x00,\n\t0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,\n\t0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,\n\t0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,\n\t0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,\n\t0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,\n\t0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,\n\t0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,0x87,0x87,0x89,0x00,0x88,0x88,0x8a,0x00,\n\t0x89,0x89,0x8b,0x00,0x8a,0x8a,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x93,0x00,\n\t0x92,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,\n\t0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,\n\t0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,\n\t0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc1,0xc0,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,\n\t0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd6,0xd5,0xd6,0x00,0xd7,0xd6,0xd7,0x00,\n\t0xd8,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe4,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe5,0xe5,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,\n\t0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xed,0xec,0xec,0x00,0xee,0xed,0xed,0x00,0xef,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,\n\t0xf2,0xf1,0xf1,0x00,0xf3,0xf2,0xf2,0x00,0xf4,0xf3,0xf3,0x00,0xf5,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf6,0xf6,0x00,0xf8,0xf7,0xf7,0x00,\n\t0xf9,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1e,0x20,0x00,0x21,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3e,0x00,\n\t0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,\n\t0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,0x5d,0x5d,0x5f,0x00,\n\t0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,\n\t0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,\n\t0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,\n\t0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x80,0x81,0x00,\n\t0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,0x87,0x87,0x89,0x00,0x88,0x88,0x8a,0x00,\n\t0x89,0x89,0x8b,0x00,0x8a,0x8a,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x91,0x92,0x00,\n\t0x92,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,\n\t0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa3,0xa2,0xa4,0x00,\n\t0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb4,0xb4,0xb5,0x00,\n\t0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc2,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc6,0x00,\n\t0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd7,0xd6,0xd7,0x00,\n\t0xd8,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe5,0xe5,0x00,0xe7,0xe6,0xe6,0x00,0xe8,0xe8,0xe8,0x00,\n\t0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xee,0xed,0xed,0x00,0xef,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,\n\t0xf2,0xf1,0xf1,0x00,0xf3,0xf2,0xf2,0x00,0xf4,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf5,0xf5,0x00,0xf7,0xf6,0xf6,0x00,0xf8,0xf7,0xf7,0x00,\n\t0xf9,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1e,0x20,0x00,0x21,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,\n\t0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,\n\t0x4e,0x4e,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,\n\t0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,\n\t0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,\n\t0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,\n\t0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,\n\t0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,0x87,0x87,0x89,0x00,0x88,0x88,0x8a,0x00,\n\t0x89,0x89,0x8b,0x00,0x8a,0x8a,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,\n\t0x92,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,\n\t0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,\n\t0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,\n\t0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc2,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,0xc5,0xc4,0xc5,0x00,\n\t0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,\n\t0xd8,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe5,0xe5,0x00,0xe7,0xe6,0xe6,0x00,0xe8,0xe7,0xe7,0x00,\n\t0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xee,0xed,0xed,0x00,0xef,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,\n\t0xf2,0xf1,0xf1,0x00,0xf3,0xf2,0xf2,0x00,0xf4,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf5,0xf5,0x00,0xf7,0xf6,0xf6,0x00,0xf8,0xf7,0xf7,0x00,\n\t0xf9,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x21,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2d,0x00,\n\t0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,\n\t0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,\n\t0x5e,0x5d,0x60,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,\n\t0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,\n\t0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,\n\t0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7c,0x7d,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x88,0x00,0x87,0x87,0x89,0x00,0x88,0x88,0x8a,0x00,\n\t0x89,0x89,0x8b,0x00,0x8a,0x8a,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,\n\t0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,\n\t0xa3,0xa3,0xa4,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,\n\t0xb4,0xb4,0xb5,0x00,0xb6,0xb5,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,0xc5,0xc4,0xc5,0x00,\n\t0xc6,0xc5,0xc6,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,\n\t0xd7,0xd7,0xd7,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdb,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe6,0xe5,0xe5,0x00,0xe7,0xe6,0xe6,0x00,0xe8,0xe7,0xe7,0x00,\n\t0xe9,0xe8,0xe8,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xef,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,\n\t0xf2,0xf1,0xf1,0x00,0xf3,0xf2,0xf2,0x00,0xf4,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf4,0xf4,0x00,0xf6,0xf5,0xf5,0x00,0xf7,0xf6,0xf6,0x00,0xf8,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfb,0xfb,0x00,0xfd,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x28,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2c,0x2b,0x2d,0x00,\n\t0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,\n\t0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,\n\t0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,\n\t0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,\n\t0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,\n\t0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7c,0x7d,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x88,0x00,0x87,0x87,0x89,0x00,0x88,0x88,0x8a,0x00,\n\t0x89,0x89,0x8b,0x00,0x8a,0x8a,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,\n\t0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,\n\t0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,\n\t0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb7,0xb6,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,0xc5,0xc4,0xc5,0x00,\n\t0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,\n\t0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xda,0xd9,0xda,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdb,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe7,0xe6,0xe6,0x00,0xe8,0xe7,0xe7,0x00,\n\t0xe9,0xe8,0xe8,0x00,0xea,0xe9,0xe9,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,\n\t0xf2,0xf1,0xf1,0x00,0xf3,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf4,0xf4,0x00,0xf6,0xf5,0xf5,0x00,0xf7,0xf6,0xf6,0x00,0xf8,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfb,0xfb,0x00,0xfd,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x27,0x26,0x28,0x00,0x28,0x27,0x29,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,\n\t0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,\n\t0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5d,0x5c,0x5f,0x00,\n\t0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x66,0x65,0x68,0x00,\n\t0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,\n\t0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x76,0x77,0x00,0x78,0x77,0x78,0x00,\n\t0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7c,0x7d,0x00,0x7e,0x7d,0x7e,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x89,0x00,0x88,0x88,0x8a,0x00,\n\t0x89,0x89,0x8b,0x00,0x8a,0x8a,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,\n\t0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa2,0xa3,0x00,\n\t0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,\n\t0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb8,0xb7,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,0xc5,0xc4,0xc5,0x00,\n\t0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,\n\t0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdb,0xdc,0x00,0xdd,0xdc,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe8,0xe7,0xe7,0x00,\n\t0xe9,0xe8,0xe8,0x00,0xea,0xe9,0xe9,0x00,0xeb,0xea,0xea,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,\n\t0xf2,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf3,0xf3,0x00,0xf5,0xf4,0xf4,0x00,0xf6,0xf5,0xf5,0x00,0xf7,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,\n\t0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,\n\t0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5d,0x5c,0x5f,0x00,\n\t0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,\n\t0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,\n\t0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,\n\t0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7c,0x7d,0x00,0x7e,0x7d,0x7e,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x89,0x00,0x88,0x88,0x8a,0x00,\n\t0x89,0x89,0x8b,0x00,0x8a,0x8a,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,\n\t0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa2,0xa3,0x00,\n\t0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,0xab,0xaa,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,\n\t0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb9,0xb8,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,0xc5,0xc4,0xc5,0x00,\n\t0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,\n\t0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdc,0xdb,0xdc,0x00,0xdd,0xdc,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe8,0xe7,0xe7,0x00,\n\t0xe9,0xe8,0xe8,0x00,0xea,0xe9,0xe9,0x00,0xeb,0xea,0xea,0x00,0xec,0xeb,0xeb,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,\n\t0xf2,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf3,0xf3,0x00,0xf5,0xf4,0xf4,0x00,0xf6,0xf5,0xf5,0x00,0xf7,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,\n\t0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3c,0x3c,0x3d,0x00,\n\t0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x45,0x45,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,\n\t0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,\n\t0x66,0x66,0x68,0x00,0x68,0x67,0x69,0x00,0x69,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6e,0x70,0x00,\n\t0x6f,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,0x77,0x77,0x78,0x00,\n\t0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7d,0x7c,0x7d,0x00,0x7e,0x7d,0x7e,0x00,0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x81,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x8a,0x00,\n\t0x89,0x89,0x8b,0x00,0x8a,0x8a,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,\n\t0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,\n\t0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,0xab,0xaa,0xac,0x00,\n\t0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,\n\t0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xba,0xb9,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc5,0xc4,0xc5,0x00,\n\t0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xcb,0xcc,0x00,0xcc,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd6,0xd6,0x00,\n\t0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdd,0xdc,0xdd,0x00,0xde,0xdd,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,\n\t0xe9,0xe8,0xe8,0x00,0xea,0xe9,0xe9,0x00,0xeb,0xea,0xea,0x00,0xec,0xeb,0xeb,0x00,0xed,0xec,0xec,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,\n\t0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf2,0xf2,0x00,0xf4,0xf3,0xf3,0x00,0xf5,0xf4,0xf4,0x00,0xf6,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,\n\t0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x2f,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3c,0x3c,0x3d,0x00,\n\t0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x45,0x45,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,\n\t0x5d,0x5d,0x5f,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,\n\t0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x69,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6e,0x6f,0x00,\n\t0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,0x77,0x77,0x78,0x00,\n\t0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x81,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x8a,0x00,\n\t0x89,0x89,0x8b,0x00,0x8a,0x8a,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,\n\t0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,\n\t0xa3,0xa2,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xaa,0xa9,0xab,0x00,0xab,0xaa,0xac,0x00,\n\t0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,\n\t0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xbb,0xba,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc5,0xc4,0xc5,0x00,\n\t0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd6,0xd6,0x00,\n\t0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xde,0xdd,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,\n\t0xe8,0xe8,0xe8,0x00,0xea,0xe9,0xe9,0x00,0xeb,0xea,0xea,0x00,0xec,0xeb,0xeb,0x00,0xed,0xec,0xec,0x00,0xee,0xed,0xed,0x00,0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,\n\t0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf2,0xf2,0x00,0xf4,0xf3,0xf3,0x00,0xf5,0xf4,0xf4,0x00,0xf6,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,\n\t0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x2f,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,\n\t0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,0x65,0x65,0x67,0x00,\n\t0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,\n\t0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x73,0x72,0x73,0x00,0x74,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x75,0x77,0x00,0x77,0x76,0x78,0x00,\n\t0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x88,0x89,0x00,\n\t0x89,0x89,0x8b,0x00,0x8a,0x8a,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x99,0x9b,0x00,\n\t0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,\n\t0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xab,0xaa,0xac,0x00,\n\t0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,\n\t0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbc,0xbb,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,\n\t0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,\n\t0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xdf,0xde,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,\n\t0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xeb,0xea,0xea,0x00,0xec,0xeb,0xeb,0x00,0xed,0xec,0xec,0x00,0xee,0xed,0xed,0x00,0xef,0xee,0xee,0x00,0xf0,0xf0,0xf0,0x00,\n\t0xf1,0xf1,0xf1,0x00,0xf2,0xf1,0xf1,0x00,0xf3,0xf2,0xf2,0x00,0xf4,0xf3,0xf3,0x00,0xf5,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfa,0xfa,0x00,0xfc,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,\n\t0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2e,0x2e,0x30,0x00,0x2f,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,\n\t0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,\n\t0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,\n\t0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x74,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,\n\t0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,\n\t0x89,0x89,0x8b,0x00,0x8a,0x8a,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,\n\t0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,\n\t0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,\n\t0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,\n\t0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,\n\t0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,\n\t0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,\n\t0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xec,0xeb,0xeb,0x00,0xed,0xec,0xec,0x00,0xee,0xed,0xed,0x00,0xef,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,\n\t0xf1,0xf1,0xf1,0x00,0xf2,0xf1,0xf1,0x00,0xf3,0xf2,0xf2,0x00,0xf4,0xf3,0xf3,0x00,0xf5,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfa,0xfa,0x00,0xfc,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x28,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,\n\t0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2e,0x2e,0x30,0x00,0x2f,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,\n\t0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,\n\t0x66,0x65,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,\n\t0x6f,0x6e,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,\n\t0x78,0x77,0x78,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,\n\t0x80,0x80,0x81,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,\n\t0x89,0x88,0x8a,0x00,0x8a,0x8a,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,\n\t0x9a,0x99,0x9b,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,\n\t0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,\n\t0xab,0xab,0xac,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,0xb3,0xb3,0xb4,0x00,\n\t0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,\n\t0xc5,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,\n\t0xce,0xcd,0xce,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,\n\t0xd7,0xd6,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,\n\t0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xed,0xec,0xec,0x00,0xee,0xed,0xed,0x00,0xef,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,\n\t0xf1,0xf0,0xf0,0x00,0xf2,0xf1,0xf1,0x00,0xf3,0xf2,0xf2,0x00,0xf4,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x23,0x25,0x00,\n\t0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x27,0x26,0x28,0x00,0x28,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,\n\t0x2d,0x2c,0x2e,0x00,0x2d,0x2d,0x2f,0x00,0x2e,0x2e,0x30,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,\n\t0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,\n\t0x66,0x65,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,\n\t0x6f,0x6e,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,\n\t0x78,0x77,0x78,0x00,0x79,0x78,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,\n\t0x80,0x80,0x81,0x00,0x81,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,\n\t0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,\n\t0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,\n\t0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,\n\t0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,0xb3,0xb2,0xb4,0x00,\n\t0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbe,0xbd,0xbe,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,\n\t0xc5,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,\n\t0xce,0xcd,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,\n\t0xd7,0xd6,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,\n\t0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xef,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,\n\t0xf1,0xf0,0xf0,0x00,0xf2,0xf1,0xf1,0x00,0xf3,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,\n\t0x26,0x24,0x26,0x00,0x26,0x25,0x27,0x00,0x27,0x26,0x28,0x00,0x28,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,\n\t0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x65,0x64,0x67,0x00,\n\t0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,\n\t0x6f,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x77,0x76,0x77,0x00,\n\t0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,\n\t0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,\n\t0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,\n\t0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,\n\t0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xaa,0xab,0x00,\n\t0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,0xb3,0xb2,0xb4,0x00,\n\t0xb4,0xb3,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbf,0xbe,0xbf,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,\n\t0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,\n\t0xce,0xcd,0xce,0x00,0xcf,0xce,0xcf,0x00,0xd0,0xd0,0xd0,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,\n\t0xd7,0xd6,0xd7,0x00,0xd8,0xd7,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,\n\t0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,\n\t0xf1,0xf0,0xf0,0x00,0xf2,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xf9,0xf9,0x00,0xfb,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1d,0x00,\n\t0x1e,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,\n\t0x26,0x24,0x26,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,\n\t0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,\n\t0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,\n\t0x6f,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,\n\t0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,\n\t0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,\n\t0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,\n\t0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,\n\t0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,\n\t0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,0xb3,0xb2,0xb4,0x00,\n\t0xb4,0xb3,0xb5,0x00,0xb5,0xb4,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbf,0xbe,0xbf,0x00,0xc0,0xbf,0xc0,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,\n\t0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,\n\t0xce,0xcd,0xce,0x00,0xcf,0xce,0xcf,0x00,0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,\n\t0xd7,0xd6,0xd7,0x00,0xd8,0xd7,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,\n\t0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,\n\t0xf1,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1d,0x00,\n\t0x1e,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,\n\t0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,\n\t0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,\n\t0x65,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x67,0x69,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,\n\t0x6e,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,\n\t0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,\n\t0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,\n\t0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,\n\t0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,\n\t0xab,0xaa,0xac,0x00,0xac,0xab,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,0xb3,0xb2,0xb4,0x00,\n\t0xb4,0xb3,0xb5,0x00,0xb5,0xb4,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xc0,0xbf,0xc0,0x00,0xc1,0xc0,0xc1,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,\n\t0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,\n\t0xce,0xcd,0xce,0x00,0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,\n\t0xd7,0xd6,0xd7,0x00,0xd8,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,\n\t0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1c,0x00,0x1d,0x1c,0x1d,0x00,\n\t0x1e,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,\n\t0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,\n\t0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,\n\t0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,0x68,0x67,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,\n\t0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,\n\t0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,\n\t0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8f,0x91,0x00,0x90,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,\n\t0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,\n\t0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,\n\t0xab,0xaa,0xac,0x00,0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb2,0xb1,0xb3,0x00,0xb3,0xb2,0xb4,0x00,\n\t0xb4,0xb3,0xb5,0x00,0xb5,0xb4,0xb6,0x00,0xb6,0xb5,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xc0,0xbf,0xc0,0x00,0xc1,0xc0,0xc1,0x00,0xc2,0xc1,0xc2,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,\n\t0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,\n\t0xce,0xcd,0xce,0x00,0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,\n\t0xd7,0xd6,0xd7,0x00,0xd8,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,\n\t0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1b,0x00,0x1c,0x1b,0x1c,0x00,0x1d,0x1c,0x1d,0x00,\n\t0x1e,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,\n\t0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5c,0x5c,0x5e,0x00,\n\t0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,\n\t0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x69,0x68,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6f,0x00,\n\t0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7f,0x80,0x00,\n\t0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,\n\t0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,\n\t0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa2,0xa1,0xa3,0x00,\n\t0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,\n\t0xab,0xaa,0xac,0x00,0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb3,0xb2,0xb4,0x00,\n\t0xb4,0xb3,0xb5,0x00,0xb5,0xb4,0xb6,0x00,0xb6,0xb5,0xb7,0x00,0xb7,0xb6,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc1,0xc0,0xc1,0x00,0xc2,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc4,0xc5,0x00,\n\t0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,\n\t0xce,0xcd,0xce,0x00,0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd6,0xd5,0xd6,0x00,\n\t0xd7,0xd6,0xd7,0x00,0xd8,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe7,0xe7,0xe7,0x00,\n\t0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1b,0x00,0x1c,0x1b,0x1c,0x00,0x1d,0x1c,0x1d,0x00,\n\t0x1e,0x1d,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,\n\t0x2c,0x2c,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,\n\t0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,\n\t0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,\n\t0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,\n\t0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,\n\t0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,\n\t0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,\n\t0xab,0xaa,0xac,0x00,0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,\n\t0xb4,0xb3,0xb5,0x00,0xb5,0xb4,0xb6,0x00,0xb6,0xb5,0xb7,0x00,0xb7,0xb6,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc1,0xc0,0xc1,0x00,0xc2,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,\n\t0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,\n\t0xce,0xcd,0xce,0x00,0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,\n\t0xd7,0xd6,0xd7,0x00,0xd8,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1b,0x00,0x1c,0x1b,0x1c,0x00,0x1d,0x1c,0x1d,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5c,0x5c,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,\n\t0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,\n\t0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,\n\t0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,\n\t0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,\n\t0xa2,0xa1,0xa3,0x00,0xa3,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,\n\t0xab,0xaa,0xac,0x00,0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,\n\t0xb3,0xb3,0xb4,0x00,0xb5,0xb4,0xb5,0x00,0xb6,0xb5,0xb7,0x00,0xb7,0xb6,0xb8,0x00,0xb8,0xb7,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc2,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,\n\t0xc5,0xc4,0xc5,0x00,0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,\n\t0xce,0xcd,0xce,0x00,0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,\n\t0xd6,0xd6,0xd6,0x00,0xd8,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1b,0x00,0x1c,0x1b,0x1c,0x00,0x1d,0x1c,0x1d,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4b,0x4d,0x00,\n\t0x4d,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5c,0x5c,0x5f,0x00,0x5d,0x5d,0x60,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,\n\t0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,\n\t0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,\n\t0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,\n\t0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,\n\t0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa5,0x00,0xa4,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,\n\t0xab,0xaa,0xac,0x00,0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,\n\t0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb6,0xb5,0xb6,0x00,0xb7,0xb6,0xb8,0x00,0xb8,0xb7,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc2,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,\n\t0xc5,0xc4,0xc5,0x00,0xc6,0xc5,0xc6,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,\n\t0xce,0xcd,0xce,0x00,0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,\n\t0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf6,0xf6,0xf6,0x00,\n\t0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1b,0x00,0x1c,0x1b,0x1c,0x00,0x1d,0x1b,0x1d,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4a,0x4d,0x00,0x4c,0x4b,0x4d,0x00,\n\t0x4d,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5c,0x5c,0x5f,0x00,0x5d,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,\n\t0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,\n\t0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,\n\t0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,\n\t0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,\n\t0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa6,0x00,0xa5,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,\n\t0xab,0xaa,0xac,0x00,0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,\n\t0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb7,0xb6,0xb7,0x00,0xb8,0xb7,0xb8,0x00,0xb9,0xb8,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,\n\t0xc5,0xc4,0xc5,0x00,0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,\n\t0xce,0xcd,0xce,0x00,0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,\n\t0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdb,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf6,0xf6,0xf6,0x00,\n\t0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1b,0x00,0x1c,0x1b,0x1c,0x00,0x1d,0x1b,0x1d,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x49,0x4c,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,\n\t0x4d,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5c,0x5c,0x5f,0x00,0x5d,0x5d,0x60,0x00,0x5e,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,\n\t0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,\n\t0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,\n\t0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,\n\t0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,\n\t0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa6,0x00,0xa5,0xa4,0xa7,0x00,0xa6,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,\n\t0xab,0xaa,0xac,0x00,0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,\n\t0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb8,0xb7,0xb8,0x00,0xb9,0xb8,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,\n\t0xc5,0xc4,0xc5,0x00,0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,\n\t0xce,0xcd,0xce,0x00,0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,\n\t0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xda,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdb,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,\n\t0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1b,0x00,0x1c,0x1b,0x1c,0x00,0x1d,0x1b,0x1d,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3b,0x00,0x3a,0x39,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x48,0x4b,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,\n\t0x4d,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5c,0x5c,0x5f,0x00,0x5d,0x5d,0x60,0x00,0x5e,0x5e,0x61,0x00,0x5f,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,\n\t0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6d,0x6e,0x00,\n\t0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x76,0x77,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x88,0x87,0x89,0x00,\n\t0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,\n\t0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,\n\t0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa6,0x00,0xa5,0xa4,0xa7,0x00,0xa6,0xa5,0xa8,0x00,0xa7,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,\n\t0xab,0xaa,0xac,0x00,0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb2,0xb3,0x00,\n\t0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb9,0xb8,0xb9,0x00,0xba,0xb9,0xba,0x00,0xbb,0xbb,0xbb,0x00,\n\t0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,\n\t0xc5,0xc4,0xc5,0x00,0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,\n\t0xce,0xcd,0xce,0x00,0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd5,0xd5,0x00,\n\t0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xdb,0x00,0xdc,0xdb,0xdc,0x00,0xdd,0xdc,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,\n\t0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1b,0x00,0x1c,0x1a,0x1c,0x00,0x1d,0x1b,0x1d,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3b,0x00,0x3a,0x39,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x47,0x4a,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,\n\t0x4d,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5c,0x5c,0x5f,0x00,0x5d,0x5d,0x60,0x00,0x5e,0x5e,0x61,0x00,0x5f,0x5f,0x62,0x00,0x60,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,\n\t0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6d,0x6e,0x00,\n\t0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x76,0x77,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x86,0x87,0x00,0x88,0x87,0x89,0x00,\n\t0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,\n\t0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,\n\t0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa7,0x00,0xa6,0xa5,0xa8,0x00,0xa7,0xa6,0xa9,0x00,0xa8,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,\n\t0xab,0xaa,0xac,0x00,0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb2,0xb3,0x00,\n\t0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xba,0xb9,0xba,0x00,0xbb,0xbb,0xbb,0x00,\n\t0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,\n\t0xc5,0xc4,0xc5,0x00,0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xca,0x00,0xca,0xc9,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,\n\t0xce,0xcd,0xce,0x00,0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd5,0xd5,0x00,\n\t0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdc,0x00,0xdd,0xdc,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,\n\t0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1b,0x00,0x1c,0x1a,0x1c,0x00,0x1d,0x1b,0x1d,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3c,0x00,0x3b,0x3a,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x47,0x46,0x48,0x00,0x48,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,\n\t0x4d,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5c,0x5c,0x5f,0x00,0x5d,0x5d,0x60,0x00,0x5e,0x5e,0x61,0x00,0x5f,0x5f,0x62,0x00,0x60,0x60,0x63,0x00,0x61,0x61,0x64,0x00,0x62,0x62,0x65,0x00,0x64,0x64,0x66,0x00,\n\t0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,\n\t0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x87,0x88,0x00,\n\t0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x98,0x9a,0x00,\n\t0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,\n\t0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa7,0x00,0xa6,0xa5,0xa8,0x00,0xa7,0xa6,0xa9,0x00,0xa8,0xa7,0xaa,0x00,0xa9,0xa9,0xab,0x00,\n\t0xab,0xaa,0xac,0x00,0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,\n\t0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xbb,0xba,0xbb,0x00,\n\t0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,\n\t0xc5,0xc4,0xc5,0x00,0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xca,0x00,0xca,0xc9,0xcb,0x00,0xcb,0xca,0xcc,0x00,0xcc,0xcc,0xcd,0x00,\n\t0xce,0xcd,0xce,0x00,0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,\n\t0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xde,0xdd,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xef,0xef,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,\n\t0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1b,0x00,0x1c,0x1a,0x1c,0x00,0x1d,0x1b,0x1d,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3c,0x00,0x3b,0x3a,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x45,0x47,0x00,0x47,0x46,0x48,0x00,0x48,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,\n\t0x4d,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5c,0x5c,0x5f,0x00,0x5d,0x5d,0x60,0x00,0x5e,0x5e,0x61,0x00,0x5f,0x5f,0x62,0x00,0x60,0x60,0x63,0x00,0x61,0x61,0x64,0x00,0x62,0x62,0x65,0x00,0x63,0x63,0x66,0x00,\n\t0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,\n\t0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,\n\t0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,\n\t0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,\n\t0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa7,0x00,0xa6,0xa5,0xa8,0x00,0xa7,0xa6,0xa9,0x00,0xa8,0xa7,0xaa,0x00,0xa9,0xa8,0xab,0x00,\n\t0xab,0xaa,0xac,0x00,0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,\n\t0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,\n\t0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,\n\t0xc5,0xc4,0xc5,0x00,0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xca,0x00,0xca,0xc9,0xcb,0x00,0xcb,0xca,0xcc,0x00,0xcc,0xcb,0xcd,0x00,\n\t0xce,0xcd,0xce,0x00,0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,\n\t0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,\n\t0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1b,0x00,0x1c,0x1a,0x1c,0x00,0x1d,0x1b,0x1d,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x32,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3c,0x00,0x3b,0x3a,0x3d,0x00,\n\t0x3c,0x3b,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x44,0x46,0x00,0x46,0x45,0x47,0x00,0x47,0x46,0x48,0x00,0x48,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,\n\t0x4d,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x53,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5c,0x5c,0x5f,0x00,0x5d,0x5d,0x60,0x00,0x5e,0x5e,0x61,0x00,0x5f,0x5f,0x62,0x00,0x60,0x60,0x63,0x00,0x61,0x61,0x64,0x00,0x62,0x62,0x65,0x00,0x63,0x63,0x66,0x00,\n\t0x64,0x64,0x67,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,\n\t0x77,0x76,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,\n\t0x88,0x87,0x89,0x00,0x89,0x89,0x8b,0x00,0x8a,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,\n\t0x99,0x98,0x9a,0x00,0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0x9f,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,\n\t0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa7,0x00,0xa6,0xa5,0xa8,0x00,0xa7,0xa6,0xa9,0x00,0xa8,0xa7,0xaa,0x00,0xa9,0xa8,0xab,0x00,\n\t0xaa,0xa9,0xac,0x00,0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,\n\t0xb3,0xb2,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,\n\t0xbb,0xbb,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,\n\t0xc4,0xc4,0xc5,0x00,0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xcb,0x00,0xcb,0xca,0xcc,0x00,0xcc,0xcb,0xcd,0x00,\n\t0xcd,0xcc,0xce,0x00,0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,\n\t0xd6,0xd5,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,\n\t0xde,0xde,0xde,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,\n\t0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,\n\t0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x19,0x1b,0x00,0x1c,0x1a,0x1c,0x00,0x1d,0x1b,0x1d,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x22,0x24,0x00,\n\t0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x31,0x34,0x00,\n\t0x33,0x32,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3c,0x00,0x3b,0x3a,0x3d,0x00,\n\t0x3c,0x3b,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x44,0x46,0x00,0x46,0x45,0x47,0x00,0x47,0x46,0x48,0x00,0x48,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,\n\t0x4d,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x52,0x55,0x00,\n\t0x54,0x53,0x56,0x00,0x55,0x54,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5c,0x5c,0x5f,0x00,0x5d,0x5d,0x60,0x00,0x5e,0x5e,0x61,0x00,0x5f,0x5f,0x62,0x00,0x60,0x60,0x63,0x00,0x61,0x61,0x64,0x00,0x62,0x62,0x65,0x00,0x63,0x63,0x66,0x00,\n\t0x64,0x64,0x67,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,\n\t0x77,0x76,0x78,0x00,0x78,0x77,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,\n\t0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,0x8a,0x8a,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,\n\t0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,0x9b,0x9b,0x9d,0x00,0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0x9f,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,\n\t0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa8,0x00,0xa7,0xa6,0xa9,0x00,0xa8,0xa7,0xaa,0x00,0xa9,0xa8,0xab,0x00,\n\t0xaa,0xa9,0xac,0x00,0xab,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,\n\t0xb3,0xb2,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,\n\t0xbb,0xbb,0xbc,0x00,0xbd,0xbc,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,\n\t0xc4,0xc4,0xc5,0x00,0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xcb,0x00,0xcb,0xca,0xcc,0x00,0xcc,0xcb,0xcd,0x00,\n\t0xcd,0xcc,0xce,0x00,0xce,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,\n\t0xd6,0xd5,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,\n\t0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,\n\t0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,\n\t0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x19,0x1b,0x00,0x1c,0x1a,0x1c,0x00,0x1d,0x1b,0x1d,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x22,0x24,0x00,\n\t0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x30,0x33,0x00,0x32,0x31,0x34,0x00,\n\t0x33,0x32,0x35,0x00,0x34,0x33,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3d,0x00,\n\t0x3c,0x3b,0x3e,0x00,0x3d,0x3c,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x44,0x46,0x00,0x46,0x45,0x47,0x00,0x47,0x46,0x48,0x00,0x48,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,\n\t0x4d,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x51,0x54,0x00,0x53,0x52,0x55,0x00,\n\t0x54,0x53,0x56,0x00,0x55,0x54,0x57,0x00,0x56,0x55,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5c,0x5c,0x5f,0x00,0x5d,0x5d,0x60,0x00,0x5e,0x5e,0x61,0x00,0x5f,0x5f,0x62,0x00,0x60,0x60,0x63,0x00,0x61,0x61,0x64,0x00,0x62,0x62,0x65,0x00,0x63,0x63,0x66,0x00,\n\t0x64,0x64,0x67,0x00,0x65,0x65,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6e,0x71,0x00,0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,\n\t0x77,0x76,0x78,0x00,0x78,0x77,0x79,0x00,0x79,0x78,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7f,0x7e,0x80,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,\n\t0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,\n\t0x90,0x90,0x92,0x00,0x91,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,\n\t0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9d,0x00,0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0x9f,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,\n\t0xa1,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa8,0x00,0xa7,0xa6,0xa9,0x00,0xa8,0xa7,0xaa,0x00,0xa9,0xa8,0xab,0x00,\n\t0xaa,0xa9,0xac,0x00,0xab,0xaa,0xad,0x00,0xac,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,\n\t0xb3,0xb2,0xb4,0x00,0xb4,0xb3,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,\n\t0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,0xbe,0xbd,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,\n\t0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xcb,0x00,0xcb,0xca,0xcc,0x00,0xcc,0xcb,0xcd,0x00,\n\t0xcd,0xcc,0xce,0x00,0xce,0xcd,0xcf,0x00,0xcf,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,\n\t0xd6,0xd5,0xd6,0x00,0xd7,0xd6,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,\n\t0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,\n\t0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,\n\t0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x19,0x1b,0x00,0x1c,0x1a,0x1c,0x00,0x1d,0x1b,0x1d,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,\n\t0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x2f,0x32,0x00,0x31,0x30,0x33,0x00,0x32,0x31,0x34,0x00,\n\t0x33,0x32,0x35,0x00,0x34,0x33,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3d,0x00,\n\t0x3c,0x3b,0x3e,0x00,0x3d,0x3c,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x44,0x46,0x00,0x46,0x45,0x47,0x00,0x47,0x46,0x48,0x00,0x48,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,\n\t0x4d,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x50,0x53,0x00,0x52,0x51,0x54,0x00,0x53,0x52,0x55,0x00,\n\t0x54,0x53,0x56,0x00,0x55,0x54,0x57,0x00,0x56,0x55,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5c,0x5c,0x5f,0x00,0x5d,0x5d,0x60,0x00,0x5e,0x5e,0x61,0x00,0x5f,0x5f,0x62,0x00,0x60,0x60,0x63,0x00,0x61,0x61,0x64,0x00,0x62,0x62,0x65,0x00,0x63,0x63,0x66,0x00,\n\t0x64,0x64,0x67,0x00,0x65,0x65,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6e,0x71,0x00,0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,\n\t0x77,0x76,0x78,0x00,0x78,0x77,0x79,0x00,0x79,0x78,0x7a,0x00,0x7a,0x79,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7f,0x7e,0x80,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,\n\t0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,\n\t0x90,0x90,0x92,0x00,0x91,0x91,0x93,0x00,0x92,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,\n\t0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0x9f,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,\n\t0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa8,0x00,0xa7,0xa6,0xa9,0x00,0xa8,0xa7,0xaa,0x00,0xa9,0xa8,0xab,0x00,\n\t0xaa,0xa9,0xac,0x00,0xab,0xaa,0xad,0x00,0xac,0xac,0xae,0x00,0xad,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,\n\t0xb3,0xb2,0xb4,0x00,0xb4,0xb3,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,\n\t0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,0xbe,0xbd,0xbe,0x00,0xbf,0xbe,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc4,0x00,\n\t0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xcb,0x00,0xcb,0xca,0xcc,0x00,0xcc,0xcb,0xcd,0x00,\n\t0xcd,0xcc,0xce,0x00,0xce,0xcd,0xcf,0x00,0xcf,0xcf,0xd0,0x00,0xd0,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,\n\t0xd6,0xd5,0xd6,0x00,0xd7,0xd6,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,\n\t0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,\n\t0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,\n\t0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x19,0x1b,0x00,0x1c,0x1a,0x1c,0x00,0x1d,0x1b,0x1d,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,\n\t0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2e,0x31,0x00,0x30,0x2f,0x32,0x00,0x31,0x30,0x33,0x00,0x32,0x31,0x34,0x00,\n\t0x33,0x32,0x35,0x00,0x34,0x33,0x36,0x00,0x35,0x34,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3d,0x00,\n\t0x3c,0x3b,0x3e,0x00,0x3d,0x3c,0x3f,0x00,0x3e,0x3d,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x44,0x46,0x00,0x46,0x45,0x47,0x00,0x47,0x46,0x48,0x00,0x48,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,\n\t0x4d,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x4f,0x52,0x00,0x51,0x50,0x53,0x00,0x52,0x51,0x54,0x00,0x53,0x52,0x55,0x00,\n\t0x54,0x53,0x56,0x00,0x55,0x54,0x57,0x00,0x56,0x55,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5c,0x5c,0x5f,0x00,0x5d,0x5d,0x60,0x00,0x5e,0x5e,0x61,0x00,0x5f,0x5f,0x62,0x00,0x60,0x60,0x63,0x00,0x61,0x61,0x64,0x00,0x62,0x62,0x65,0x00,0x63,0x63,0x66,0x00,\n\t0x64,0x64,0x67,0x00,0x65,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6e,0x71,0x00,0x70,0x6f,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,\n\t0x77,0x76,0x78,0x00,0x78,0x77,0x79,0x00,0x79,0x78,0x7a,0x00,0x7a,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7f,0x7e,0x80,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,\n\t0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,\n\t0x90,0x90,0x92,0x00,0x91,0x91,0x93,0x00,0x92,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,\n\t0x98,0x98,0x9a,0x00,0x99,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9e,0x00,0x9d,0x9c,0x9f,0x00,0x9e,0x9e,0xa0,0x00,0x9f,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,\n\t0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa8,0x00,0xa7,0xa6,0xa9,0x00,0xa8,0xa7,0xaa,0x00,0xa9,0xa8,0xab,0x00,\n\t0xaa,0xa9,0xac,0x00,0xab,0xaa,0xad,0x00,0xac,0xab,0xae,0x00,0xad,0xad,0xaf,0x00,0xae,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,\n\t0xb3,0xb2,0xb4,0x00,0xb4,0xb3,0xb5,0x00,0xb5,0xb4,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,\n\t0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbf,0xbe,0xbf,0x00,0xc0,0xbf,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc4,0x00,\n\t0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xcb,0x00,0xcb,0xca,0xcc,0x00,0xcc,0xcb,0xcd,0x00,\n\t0xcd,0xcc,0xce,0x00,0xce,0xcd,0xcf,0x00,0xcf,0xce,0xd0,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,\n\t0xd6,0xd5,0xd6,0x00,0xd7,0xd6,0xd7,0x00,0xd8,0xd7,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,\n\t0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,\n\t0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,\n\t0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x19,0x1b,0x00,0x1c,0x1a,0x1c,0x00,0x1d,0x1b,0x1d,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,\n\t0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2d,0x30,0x00,0x30,0x2e,0x31,0x00,0x30,0x2f,0x32,0x00,0x31,0x30,0x33,0x00,0x32,0x31,0x34,0x00,\n\t0x33,0x32,0x35,0x00,0x34,0x33,0x36,0x00,0x35,0x34,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,\n\t0x3c,0x3b,0x3e,0x00,0x3d,0x3c,0x3f,0x00,0x3e,0x3d,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x44,0x46,0x00,0x46,0x45,0x47,0x00,0x47,0x46,0x48,0x00,0x48,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,\n\t0x4d,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4e,0x51,0x00,0x50,0x4f,0x52,0x00,0x51,0x50,0x53,0x00,0x52,0x51,0x54,0x00,0x53,0x52,0x55,0x00,\n\t0x54,0x53,0x56,0x00,0x55,0x54,0x57,0x00,0x56,0x55,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5c,0x5c,0x5f,0x00,0x5d,0x5d,0x60,0x00,0x5e,0x5e,0x61,0x00,0x5f,0x5f,0x62,0x00,0x60,0x60,0x63,0x00,0x61,0x61,0x64,0x00,0x62,0x62,0x65,0x00,0x63,0x63,0x66,0x00,\n\t0x64,0x64,0x67,0x00,0x65,0x65,0x68,0x00,0x66,0x66,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6e,0x71,0x00,0x70,0x6f,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,\n\t0x77,0x76,0x78,0x00,0x78,0x77,0x79,0x00,0x79,0x78,0x7a,0x00,0x7a,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,\n\t0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,\n\t0x90,0x90,0x92,0x00,0x91,0x91,0x93,0x00,0x92,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,\n\t0x98,0x98,0x9a,0x00,0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9f,0x00,0x9e,0x9d,0xa0,0x00,0x9f,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,\n\t0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa3,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa8,0x00,0xa7,0xa6,0xa9,0x00,0xa8,0xa7,0xaa,0x00,0xa9,0xa8,0xab,0x00,\n\t0xaa,0xa9,0xac,0x00,0xab,0xaa,0xad,0x00,0xac,0xab,0xae,0x00,0xad,0xad,0xaf,0x00,0xae,0xae,0xb0,0x00,0xaf,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,\n\t0xb3,0xb2,0xb4,0x00,0xb4,0xb3,0xb5,0x00,0xb5,0xb4,0xb6,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,\n\t0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbe,0x00,0xbf,0xbe,0xbf,0x00,0xc0,0xbf,0xc0,0x00,0xc1,0xc0,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,\n\t0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xca,0xcc,0x00,0xcc,0xcb,0xcd,0x00,\n\t0xcd,0xcc,0xce,0x00,0xce,0xcd,0xcf,0x00,0xcf,0xce,0xd0,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,\n\t0xd6,0xd5,0xd6,0x00,0xd7,0xd6,0xd7,0x00,0xd8,0xd7,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,\n\t0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,\n\t0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,\n\t0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x19,0x1b,0x00,0x1c,0x1a,0x1c,0x00,0x1d,0x1b,0x1d,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,\n\t0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2c,0x2f,0x00,0x2f,0x2d,0x30,0x00,0x30,0x2e,0x31,0x00,0x30,0x2f,0x32,0x00,0x31,0x30,0x33,0x00,0x32,0x31,0x34,0x00,\n\t0x33,0x32,0x35,0x00,0x34,0x33,0x36,0x00,0x35,0x34,0x37,0x00,0x36,0x35,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,\n\t0x3c,0x3b,0x3e,0x00,0x3d,0x3c,0x3f,0x00,0x3e,0x3d,0x40,0x00,0x3f,0x3e,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x44,0x46,0x00,0x46,0x45,0x47,0x00,0x47,0x46,0x48,0x00,0x48,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,\n\t0x4d,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4d,0x50,0x00,0x4f,0x4e,0x51,0x00,0x50,0x4f,0x52,0x00,0x51,0x50,0x53,0x00,0x52,0x51,0x54,0x00,0x53,0x52,0x55,0x00,\n\t0x54,0x53,0x56,0x00,0x55,0x54,0x57,0x00,0x56,0x55,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5c,0x5c,0x5f,0x00,0x5d,0x5d,0x60,0x00,0x5e,0x5e,0x61,0x00,0x5f,0x5f,0x62,0x00,0x60,0x60,0x63,0x00,0x61,0x61,0x64,0x00,0x62,0x62,0x65,0x00,0x63,0x63,0x66,0x00,\n\t0x64,0x64,0x67,0x00,0x65,0x65,0x68,0x00,0x66,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6e,0x71,0x00,0x70,0x6f,0x72,0x00,0x71,0x70,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,\n\t0x77,0x76,0x78,0x00,0x78,0x77,0x79,0x00,0x79,0x78,0x7a,0x00,0x7a,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7e,0x7f,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,\n\t0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8f,0x91,0x00,\n\t0x90,0x90,0x92,0x00,0x91,0x91,0x93,0x00,0x92,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,\n\t0x98,0x98,0x9a,0x00,0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,0x9d,0x9c,0x9f,0x00,0x9e,0x9d,0xa0,0x00,0x9f,0x9e,0xa1,0x00,0xa0,0xa0,0xa2,0x00,\n\t0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa3,0xa3,0xa5,0x00,0xa4,0xa4,0xa6,0x00,0xa6,0xa5,0xa8,0x00,0xa7,0xa6,0xa9,0x00,0xa8,0xa7,0xaa,0x00,0xa9,0xa8,0xab,0x00,\n\t0xaa,0xa9,0xac,0x00,0xab,0xaa,0xad,0x00,0xac,0xab,0xae,0x00,0xad,0xac,0xaf,0x00,0xae,0xae,0xb0,0x00,0xaf,0xaf,0xb1,0x00,0xb0,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,\n\t0xb3,0xb2,0xb4,0x00,0xb4,0xb3,0xb5,0x00,0xb5,0xb4,0xb5,0x00,0xb6,0xb5,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,\n\t0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbf,0x00,0xc0,0xbf,0xc0,0x00,0xc1,0xc0,0xc1,0x00,0xc2,0xc1,0xc2,0x00,0xc3,0xc3,0xc3,0x00,\n\t0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xca,0xcc,0x00,0xcc,0xcb,0xcd,0x00,\n\t0xcd,0xcc,0xce,0x00,0xce,0xcd,0xcf,0x00,0xcf,0xce,0xd0,0x00,0xd0,0xcf,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,\n\t0xd6,0xd5,0xd6,0x00,0xd7,0xd6,0xd7,0x00,0xd8,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,\n\t0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,\n\t0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,\n\t0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00\n};\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/CAPI/Textures/overdriveLut_dk2_2.h",
    "content": "const uint8_t overdriveLut_dk2[256*256*4] = {\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x11,0x11,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x17,0x23,0x19,0x00,0x19,0x24,0x1a,0x00,0x1b,0x25,0x1b,0x00,0x1d,0x26,0x1d,0x00,\n\t0x1d,0x26,0x1e,0x00,0x1f,0x28,0x1f,0x00,0x20,0x28,0x20,0x00,0x21,0x29,0x21,0x00,0x22,0x2a,0x22,0x00,0x23,0x2b,0x23,0x00,0x24,0x2c,0x25,0x00,0x25,0x2d,0x26,0x00,\n\t0x27,0x2e,0x28,0x00,0x28,0x2f,0x29,0x00,0x29,0x30,0x2b,0x00,0x2b,0x32,0x2c,0x00,0x2b,0x33,0x2d,0x00,0x2d,0x34,0x2f,0x00,0x2d,0x35,0x2f,0x00,0x2f,0x36,0x32,0x00,\n\t0x2f,0x37,0x32,0x00,0x32,0x38,0x34,0x00,0x32,0x39,0x34,0x00,0x34,0x3a,0x36,0x00,0x36,0x3c,0x38,0x00,0x37,0x3d,0x39,0x00,0x38,0x3e,0x3a,0x00,0x39,0x3f,0x3b,0x00,\n\t0x3c,0x41,0x3d,0x00,0x3c,0x41,0x3d,0x00,0x3d,0x42,0x3e,0x00,0x3f,0x44,0x40,0x00,0x40,0x45,0x41,0x00,0x41,0x46,0x42,0x00,0x42,0x47,0x43,0x00,0x43,0x48,0x44,0x00,\n\t0x44,0x49,0x45,0x00,0x45,0x4a,0x46,0x00,0x46,0x4b,0x47,0x00,0x47,0x4c,0x48,0x00,0x49,0x4d,0x4a,0x00,0x4a,0x4e,0x4b,0x00,0x4b,0x4f,0x4c,0x00,0x4b,0x50,0x4d,0x00,\n\t0x4c,0x51,0x4e,0x00,0x4e,0x53,0x4f,0x00,0x4f,0x54,0x50,0x00,0x50,0x55,0x51,0x00,0x51,0x56,0x52,0x00,0x52,0x57,0x54,0x00,0x53,0x58,0x55,0x00,0x54,0x5a,0x56,0x00,\n\t0x56,0x5c,0x57,0x00,0x56,0x5c,0x58,0x00,0x58,0x5e,0x5a,0x00,0x5a,0x60,0x5c,0x00,0x5b,0x61,0x5d,0x00,0x5c,0x63,0x5e,0x00,0x5e,0x64,0x60,0x00,0x5f,0x66,0x61,0x00,\n\t0x61,0x67,0x62,0x00,0x62,0x68,0x64,0x00,0x63,0x6a,0x65,0x00,0x65,0x6b,0x67,0x00,0x66,0x6d,0x68,0x00,0x68,0x6e,0x6a,0x00,0x69,0x6f,0x6b,0x00,0x6b,0x71,0x6c,0x00,\n\t0x6c,0x72,0x6e,0x00,0x6d,0x73,0x6f,0x00,0x6e,0x74,0x70,0x00,0x6f,0x75,0x71,0x00,0x70,0x76,0x72,0x00,0x71,0x77,0x73,0x00,0x73,0x78,0x74,0x00,0x73,0x79,0x76,0x00,\n\t0x75,0x7b,0x77,0x00,0x76,0x7b,0x78,0x00,0x77,0x7d,0x79,0x00,0x78,0x7e,0x7a,0x00,0x79,0x7f,0x7b,0x00,0x7a,0x80,0x7c,0x00,0x7b,0x81,0x7e,0x00,0x7c,0x82,0x7f,0x00,\n\t0x7d,0x83,0x7f,0x00,0x7f,0x84,0x80,0x00,0x80,0x85,0x81,0x00,0x81,0x86,0x83,0x00,0x82,0x87,0x84,0x00,0x83,0x88,0x85,0x00,0x84,0x8a,0x86,0x00,0x86,0x8a,0x87,0x00,\n\t0x87,0x8c,0x88,0x00,0x88,0x8d,0x89,0x00,0x89,0x8e,0x8b,0x00,0x8a,0x8f,0x8b,0x00,0x8c,0x90,0x8d,0x00,0x8c,0x91,0x8f,0x00,0x8e,0x93,0x90,0x00,0x8f,0x94,0x91,0x00,\n\t0x90,0x95,0x92,0x00,0x91,0x95,0x93,0x00,0x92,0x97,0x94,0x00,0x93,0x98,0x95,0x00,0x95,0x99,0x97,0x00,0x96,0x9a,0x98,0x00,0x97,0x9b,0x99,0x00,0x98,0x9d,0x9a,0x00,\n\t0x99,0x9e,0x9c,0x00,0x9a,0x9f,0x9c,0x00,0x9c,0xa1,0x9e,0x00,0x9d,0xa2,0x9f,0x00,0x9f,0xa3,0xa1,0x00,0xa0,0xa4,0xa2,0x00,0xa1,0xa5,0xa3,0x00,0xa2,0xa7,0xa4,0x00,\n\t0xa3,0xa8,0xa6,0x00,0xa4,0xa8,0xa7,0x00,0xa5,0xaa,0xa8,0x00,0xa7,0xab,0xa9,0x00,0xa8,0xac,0xab,0x00,0xa9,0xae,0xac,0x00,0xaa,0xae,0xad,0x00,0xab,0xaf,0xae,0x00,\n\t0xad,0xb1,0xaf,0x00,0xae,0xb2,0xb1,0x00,0xaf,0xb3,0xb2,0x00,0xb0,0xb4,0xb3,0x00,0xb2,0xb6,0xb4,0x00,0xb3,0xb7,0xb6,0x00,0xb5,0xb8,0xb7,0x00,0xb6,0xb9,0xb8,0x00,\n\t0xb7,0xba,0xb9,0x00,0xb8,0xbb,0xba,0x00,0xb9,0xbc,0xbb,0x00,0xba,0xbd,0xbc,0x00,0xbb,0xbf,0xbd,0x00,0xbc,0xc0,0xbf,0x00,0xbd,0xc1,0xc0,0x00,0xbe,0xc2,0xc1,0x00,\n\t0xc0,0xc3,0xc2,0x00,0xc2,0xc4,0xc3,0x00,0xc3,0xc6,0xc5,0x00,0xc3,0xc7,0xc6,0x00,0xc5,0xc8,0xc7,0x00,0xc6,0xc9,0xc8,0x00,0xc7,0xca,0xc9,0x00,0xc8,0xcb,0xca,0x00,\n\t0xc9,0xcc,0xcc,0x00,0xca,0xce,0xcc,0x00,0xcc,0xce,0xce,0x00,0xcd,0xcf,0xcf,0x00,0xce,0xd1,0xd0,0x00,0xcf,0xd2,0xd1,0x00,0xd0,0xd3,0xd2,0x00,0xd1,0xd4,0xd3,0x00,\n\t0xd3,0xd5,0xd5,0x00,0xd3,0xd6,0xd5,0x00,0xd5,0xd7,0xd7,0x00,0xd6,0xd9,0xd7,0x00,0xd7,0xd9,0xd8,0x00,0xd9,0xdb,0xda,0x00,0xd9,0xdc,0xdb,0x00,0xdb,0xdd,0xdc,0x00,\n\t0xdc,0xde,0xdd,0x00,0xdd,0xdf,0xde,0x00,0xde,0xe0,0xdf,0x00,0xdf,0xe2,0xe1,0x00,0xe0,0xe3,0xe2,0x00,0xe1,0xe4,0xe3,0x00,0xe3,0xe5,0xe4,0x00,0xe4,0xe5,0xe4,0x00,\n\t0xe6,0xe7,0xe5,0x00,0xe6,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe9,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xeb,0x00,0xed,0xed,0xeb,0x00,0xed,0xee,0xed,0x00,\n\t0xef,0xf0,0xee,0x00,0xf0,0xf1,0xef,0x00,0xf1,0xf2,0xf0,0x00,0xf2,0xf3,0xf0,0x00,0xf4,0xf5,0xf3,0x00,0xf5,0xf6,0xf4,0x00,0xf5,0xf7,0xf5,0x00,0xf6,0xf8,0xf6,0x00,\n\t0xf7,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xf9,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfd,0xfb,0x00,0xfd,0xff,0xfc,0x00,0xfe,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x17,0x22,0x19,0x00,0x18,0x24,0x1a,0x00,0x1a,0x24,0x1b,0x00,0x1c,0x25,0x1d,0x00,\n\t0x1e,0x26,0x1e,0x00,0x1f,0x27,0x1f,0x00,0x20,0x28,0x20,0x00,0x21,0x29,0x21,0x00,0x22,0x2a,0x22,0x00,0x23,0x2b,0x23,0x00,0x24,0x2c,0x25,0x00,0x25,0x2c,0x26,0x00,\n\t0x26,0x2d,0x28,0x00,0x28,0x2f,0x2a,0x00,0x28,0x30,0x2b,0x00,0x2b,0x31,0x2c,0x00,0x2b,0x32,0x2d,0x00,0x2c,0x33,0x2e,0x00,0x2d,0x34,0x2f,0x00,0x2f,0x36,0x30,0x00,\n\t0x2f,0x36,0x31,0x00,0x32,0x37,0x33,0x00,0x32,0x38,0x34,0x00,0x33,0x3a,0x36,0x00,0x36,0x3b,0x36,0x00,0x37,0x3c,0x38,0x00,0x37,0x3d,0x39,0x00,0x39,0x3e,0x3b,0x00,\n\t0x3b,0x40,0x3b,0x00,0x3c,0x41,0x3d,0x00,0x3c,0x42,0x3e,0x00,0x3e,0x43,0x3f,0x00,0x3f,0x44,0x40,0x00,0x41,0x45,0x41,0x00,0x41,0x46,0x42,0x00,0x42,0x47,0x44,0x00,\n\t0x44,0x48,0x45,0x00,0x45,0x49,0x46,0x00,0x46,0x4a,0x47,0x00,0x47,0x4b,0x48,0x00,0x48,0x4d,0x49,0x00,0x49,0x4d,0x4a,0x00,0x4a,0x4f,0x4b,0x00,0x4b,0x50,0x4c,0x00,\n\t0x4c,0x51,0x4d,0x00,0x4d,0x52,0x4e,0x00,0x4e,0x53,0x50,0x00,0x4f,0x54,0x51,0x00,0x50,0x55,0x52,0x00,0x52,0x56,0x53,0x00,0x53,0x57,0x54,0x00,0x54,0x59,0x55,0x00,\n\t0x55,0x5b,0x57,0x00,0x56,0x5c,0x58,0x00,0x57,0x5d,0x59,0x00,0x59,0x5f,0x5b,0x00,0x5a,0x60,0x5c,0x00,0x5c,0x62,0x5e,0x00,0x5d,0x63,0x5f,0x00,0x5f,0x65,0x60,0x00,\n\t0x60,0x66,0x62,0x00,0x62,0x67,0x63,0x00,0x63,0x69,0x65,0x00,0x64,0x6a,0x66,0x00,0x66,0x6b,0x68,0x00,0x67,0x6d,0x69,0x00,0x68,0x6f,0x6b,0x00,0x6a,0x70,0x6c,0x00,\n\t0x6c,0x71,0x6e,0x00,0x6c,0x72,0x6e,0x00,0x6d,0x73,0x6f,0x00,0x6e,0x74,0x70,0x00,0x70,0x75,0x71,0x00,0x71,0x76,0x73,0x00,0x71,0x77,0x74,0x00,0x73,0x78,0x75,0x00,\n\t0x74,0x79,0x76,0x00,0x75,0x7b,0x77,0x00,0x76,0x7c,0x78,0x00,0x77,0x7d,0x79,0x00,0x79,0x7e,0x7b,0x00,0x7a,0x7f,0x7b,0x00,0x7b,0x80,0x7d,0x00,0x7c,0x81,0x7e,0x00,\n\t0x7d,0x82,0x7f,0x00,0x7e,0x83,0x80,0x00,0x80,0x84,0x81,0x00,0x80,0x85,0x82,0x00,0x81,0x86,0x83,0x00,0x82,0x87,0x84,0x00,0x83,0x89,0x85,0x00,0x84,0x89,0x86,0x00,\n\t0x85,0x8b,0x88,0x00,0x86,0x8c,0x89,0x00,0x88,0x8d,0x8b,0x00,0x89,0x8e,0x8c,0x00,0x8a,0x8f,0x8d,0x00,0x8b,0x91,0x8e,0x00,0x8c,0x92,0x8f,0x00,0x8e,0x93,0x90,0x00,\n\t0x8f,0x94,0x91,0x00,0x90,0x95,0x92,0x00,0x91,0x96,0x93,0x00,0x92,0x97,0x95,0x00,0x94,0x98,0x96,0x00,0x95,0x99,0x96,0x00,0x95,0x9a,0x97,0x00,0x96,0x9b,0x99,0x00,\n\t0x99,0x9e,0x9b,0x00,0x9a,0x9f,0x9c,0x00,0x9b,0xa0,0x9e,0x00,0x9c,0xa1,0x9f,0x00,0x9e,0xa2,0xa0,0x00,0x9f,0xa3,0xa1,0x00,0xa0,0xa4,0xa2,0x00,0xa1,0xa5,0xa3,0x00,\n\t0xa2,0xa7,0xa5,0x00,0xa3,0xa8,0xa6,0x00,0xa5,0xa9,0xa7,0x00,0xa6,0xaa,0xa9,0x00,0xa7,0xab,0xaa,0x00,0xa8,0xac,0xaa,0x00,0xa9,0xae,0xab,0x00,0xaa,0xae,0xac,0x00,\n\t0xac,0xb0,0xae,0x00,0xac,0xb1,0xaf,0x00,0xae,0xb2,0xb0,0x00,0xaf,0xb3,0xb1,0x00,0xb1,0xb4,0xb3,0x00,0xb1,0xb6,0xb4,0x00,0xb4,0xb7,0xb6,0x00,0xb4,0xb8,0xb6,0x00,\n\t0xb6,0xb9,0xb8,0x00,0xb7,0xba,0xb9,0x00,0xb8,0xbb,0xbb,0x00,0xb9,0xbd,0xbc,0x00,0xba,0xbe,0xbd,0x00,0xbb,0xbf,0xbd,0x00,0xbc,0xc0,0xbf,0x00,0xbe,0xc1,0xbf,0x00,\n\t0xbf,0xc3,0xc1,0x00,0xc0,0xc3,0xc2,0x00,0xc2,0xc5,0xc4,0x00,0xc3,0xc6,0xc5,0x00,0xc4,0xc7,0xc6,0x00,0xc5,0xc8,0xc7,0x00,0xc6,0xca,0xc8,0x00,0xc7,0xca,0xc9,0x00,\n\t0xc8,0xcc,0xca,0x00,0xca,0xcd,0xcb,0x00,0xcb,0xce,0xcd,0x00,0xcb,0xcf,0xcd,0x00,0xcd,0xd0,0xcf,0x00,0xce,0xd1,0xd0,0x00,0xcf,0xd3,0xd1,0x00,0xd0,0xd3,0xd2,0x00,\n\t0xd2,0xd4,0xd3,0x00,0xd3,0xd6,0xd4,0x00,0xd4,0xd7,0xd5,0x00,0xd5,0xd8,0xd7,0x00,0xd6,0xd9,0xd8,0x00,0xd7,0xdb,0xd9,0x00,0xd9,0xdb,0xda,0x00,0xda,0xdc,0xdb,0x00,\n\t0xdb,0xde,0xdc,0x00,0xdc,0xdf,0xdd,0x00,0xdd,0xe0,0xde,0x00,0xde,0xe1,0xdf,0x00,0xdf,0xe2,0xe1,0x00,0xe1,0xe4,0xe1,0x00,0xe2,0xe4,0xe3,0x00,0xe3,0xe5,0xe4,0x00,\n\t0xe4,0xe6,0xe5,0x00,0xe5,0xe8,0xe6,0x00,0xe7,0xe9,0xe7,0x00,0xe8,0xea,0xe9,0x00,0xe9,0xeb,0xea,0x00,0xea,0xec,0xeb,0x00,0xec,0xee,0xeb,0x00,0xed,0xee,0xec,0x00,\n\t0xee,0xef,0xed,0x00,0xef,0xf1,0xef,0x00,0xf0,0xf2,0xf0,0x00,0xf1,0xf3,0xf0,0x00,0xf3,0xf4,0xf2,0x00,0xf3,0xf5,0xf2,0x00,0xf5,0xf6,0xf4,0x00,0xf6,0xf7,0xf5,0x00,\n\t0xf7,0xf8,0xf6,0x00,0xf8,0xfa,0xf7,0x00,0xf9,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfd,0xfb,0x00,0xfd,0xff,0xfc,0x00,0xfe,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x17,0x22,0x19,0x00,0x19,0x23,0x1a,0x00,0x1a,0x24,0x1c,0x00,0x1d,0x25,0x1c,0x00,\n\t0x1d,0x26,0x1d,0x00,0x1f,0x27,0x1f,0x00,0x20,0x27,0x20,0x00,0x20,0x28,0x21,0x00,0x22,0x29,0x22,0x00,0x22,0x2a,0x23,0x00,0x23,0x2b,0x24,0x00,0x25,0x2c,0x26,0x00,\n\t0x27,0x2d,0x27,0x00,0x28,0x2e,0x29,0x00,0x29,0x2f,0x2a,0x00,0x2a,0x30,0x2c,0x00,0x2b,0x31,0x2d,0x00,0x2c,0x33,0x2e,0x00,0x2d,0x33,0x2f,0x00,0x2e,0x35,0x30,0x00,\n\t0x2f,0x36,0x31,0x00,0x30,0x37,0x32,0x00,0x31,0x38,0x33,0x00,0x33,0x39,0x35,0x00,0x34,0x3b,0x36,0x00,0x35,0x3c,0x37,0x00,0x37,0x3c,0x38,0x00,0x38,0x3d,0x3a,0x00,\n\t0x39,0x3f,0x3b,0x00,0x3b,0x40,0x3c,0x00,0x3c,0x41,0x3d,0x00,0x3e,0x42,0x3f,0x00,0x3f,0x43,0x40,0x00,0x40,0x44,0x41,0x00,0x41,0x45,0x42,0x00,0x42,0x47,0x43,0x00,\n\t0x43,0x47,0x44,0x00,0x44,0x48,0x45,0x00,0x45,0x4a,0x46,0x00,0x46,0x4b,0x47,0x00,0x47,0x4c,0x49,0x00,0x49,0x4d,0x4a,0x00,0x4a,0x4e,0x4b,0x00,0x4b,0x4f,0x4c,0x00,\n\t0x4c,0x50,0x4d,0x00,0x4d,0x51,0x4e,0x00,0x4e,0x52,0x4f,0x00,0x4f,0x53,0x50,0x00,0x50,0x54,0x51,0x00,0x51,0x56,0x53,0x00,0x52,0x56,0x54,0x00,0x53,0x58,0x55,0x00,\n\t0x55,0x5a,0x56,0x00,0x56,0x5b,0x57,0x00,0x57,0x5c,0x58,0x00,0x59,0x5e,0x5a,0x00,0x5a,0x60,0x5c,0x00,0x5b,0x61,0x5d,0x00,0x5d,0x63,0x5f,0x00,0x5e,0x64,0x60,0x00,\n\t0x60,0x65,0x61,0x00,0x61,0x67,0x62,0x00,0x62,0x68,0x64,0x00,0x64,0x69,0x66,0x00,0x65,0x6b,0x67,0x00,0x67,0x6c,0x68,0x00,0x68,0x6e,0x6a,0x00,0x69,0x6f,0x6b,0x00,\n\t0x6a,0x70,0x6d,0x00,0x6c,0x71,0x6e,0x00,0x6d,0x72,0x6e,0x00,0x6e,0x73,0x70,0x00,0x6f,0x74,0x71,0x00,0x70,0x75,0x72,0x00,0x71,0x77,0x73,0x00,0x72,0x77,0x74,0x00,\n\t0x73,0x79,0x75,0x00,0x74,0x7a,0x76,0x00,0x76,0x7b,0x78,0x00,0x77,0x7c,0x79,0x00,0x78,0x7d,0x7a,0x00,0x79,0x7e,0x7b,0x00,0x7a,0x7f,0x7c,0x00,0x7b,0x81,0x7d,0x00,\n\t0x7c,0x81,0x7f,0x00,0x7d,0x83,0x80,0x00,0x7f,0x83,0x81,0x00,0x80,0x84,0x82,0x00,0x81,0x85,0x83,0x00,0x82,0x87,0x84,0x00,0x83,0x88,0x85,0x00,0x84,0x89,0x86,0x00,\n\t0x86,0x8a,0x87,0x00,0x87,0x8b,0x88,0x00,0x88,0x8c,0x89,0x00,0x89,0x8e,0x8a,0x00,0x8a,0x8f,0x8c,0x00,0x8b,0x90,0x8e,0x00,0x8c,0x91,0x8f,0x00,0x8d,0x92,0x90,0x00,\n\t0x8f,0x93,0x91,0x00,0x8f,0x94,0x92,0x00,0x91,0x95,0x93,0x00,0x92,0x96,0x94,0x00,0x93,0x97,0x95,0x00,0x94,0x98,0x96,0x00,0x95,0x9a,0x97,0x00,0x96,0x9b,0x98,0x00,\n\t0x98,0x9d,0x9a,0x00,0x99,0x9e,0x9b,0x00,0x9a,0x9f,0x9e,0x00,0x9b,0xa0,0x9f,0x00,0x9d,0xa0,0x9f,0x00,0x9e,0xa2,0xa0,0x00,0x9f,0xa3,0xa2,0x00,0xa0,0xa5,0xa3,0x00,\n\t0xa2,0xa6,0xa4,0x00,0xa3,0xa7,0xa5,0x00,0xa4,0xa8,0xa7,0x00,0xa5,0xa9,0xa8,0x00,0xa7,0xaa,0xa9,0x00,0xa8,0xab,0xaa,0x00,0xa9,0xad,0xab,0x00,0xaa,0xad,0xac,0x00,\n\t0xac,0xaf,0xad,0x00,0xad,0xb0,0xae,0x00,0xae,0xb1,0xb0,0x00,0xaf,0xb2,0xb1,0x00,0xb0,0xb4,0xb2,0x00,0xb1,0xb5,0xb3,0x00,0xb3,0xb6,0xb5,0x00,0xb4,0xb7,0xb6,0x00,\n\t0xb5,0xb9,0xb8,0x00,0xb6,0xba,0xb9,0x00,0xb8,0xbb,0xba,0x00,0xb9,0xbc,0xbb,0x00,0xba,0xbd,0xbd,0x00,0xba,0xbe,0xbd,0x00,0xbc,0xbf,0xbe,0x00,0xbd,0xc0,0xbf,0x00,\n\t0xbe,0xc1,0xc1,0x00,0xc0,0xc3,0xc2,0x00,0xc1,0xc4,0xc3,0x00,0xc2,0xc5,0xc4,0x00,0xc3,0xc6,0xc5,0x00,0xc4,0xc7,0xc6,0x00,0xc5,0xc8,0xc8,0x00,0xc7,0xc9,0xc9,0x00,\n\t0xc8,0xca,0xca,0x00,0xc9,0xcc,0xcb,0x00,0xca,0xcd,0xcc,0x00,0xcb,0xcd,0xce,0x00,0xcc,0xcf,0xcf,0x00,0xcd,0xd0,0xd0,0x00,0xcf,0xd1,0xd1,0x00,0xd0,0xd3,0xd2,0x00,\n\t0xd1,0xd3,0xd3,0x00,0xd2,0xd4,0xd4,0x00,0xd3,0xd5,0xd5,0x00,0xd4,0xd7,0xd6,0x00,0xd6,0xd8,0xd8,0x00,0xd7,0xd9,0xd8,0x00,0xd8,0xda,0xda,0x00,0xd9,0xdb,0xdb,0x00,\n\t0xda,0xdc,0xdc,0x00,0xdc,0xde,0xdd,0x00,0xdd,0xde,0xde,0x00,0xde,0xe0,0xdf,0x00,0xdf,0xe1,0xe0,0x00,0xe0,0xe1,0xe1,0x00,0xe1,0xe3,0xe2,0x00,0xe2,0xe4,0xe4,0x00,\n\t0xe4,0xe5,0xe5,0x00,0xe4,0xe6,0xe6,0x00,0xe6,0xe7,0xe7,0x00,0xe7,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xec,0xec,0x00,0xec,0xed,0xed,0x00,\n\t0xed,0xee,0xed,0x00,0xee,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf6,0xf5,0xf6,0x00,\n\t0xf6,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfd,0xfd,0x00,0xfd,0xfd,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x19,0x17,0x00,0x18,0x1b,0x18,0x00,0x19,0x1b,0x1a,0x00,0x1b,0x1c,0x1a,0x00,\n\t0x1c,0x1e,0x1b,0x00,0x1d,0x1f,0x1d,0x00,0x1f,0x1f,0x1e,0x00,0x20,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,0x22,0x22,0x21,0x00,0x23,0x23,0x22,0x00,0x24,0x24,0x23,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x2a,0x2a,0x00,0x2a,0x2a,0x2a,0x00,0x2c,0x2c,0x2b,0x00,0x2c,0x2c,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2e,0x2e,0x2f,0x00,0x30,0x30,0x30,0x00,0x30,0x30,0x31,0x00,0x32,0x32,0x32,0x00,0x34,0x33,0x33,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,\n\t0x3a,0x38,0x38,0x00,0x3a,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,0x3d,0x3c,0x3c,0x00,0x3d,0x3c,0x3d,0x00,0x3f,0x3e,0x3e,0x00,0x40,0x3f,0x3f,0x00,0x41,0x40,0x41,0x00,\n\t0x42,0x41,0x42,0x00,0x43,0x42,0x42,0x00,0x44,0x43,0x44,0x00,0x45,0x44,0x45,0x00,0x47,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x49,0x48,0x48,0x00,0x4a,0x49,0x49,0x00,\n\t0x4b,0x4a,0x4a,0x00,0x4c,0x4b,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4d,0x4d,0x00,0x4f,0x4e,0x4e,0x00,0x50,0x4f,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,\n\t0x54,0x53,0x53,0x00,0x54,0x53,0x54,0x00,0x56,0x55,0x55,0x00,0x57,0x56,0x57,0x00,0x59,0x57,0x58,0x00,0x5a,0x59,0x59,0x00,0x5c,0x5a,0x5b,0x00,0x5d,0x5c,0x5c,0x00,\n\t0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5f,0x00,0x61,0x60,0x61,0x00,0x62,0x61,0x62,0x00,0x64,0x63,0x63,0x00,0x65,0x64,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x67,0x67,0x00,\n\t0x69,0x69,0x68,0x00,0x6a,0x69,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6c,0x6d,0x00,0x6f,0x6e,0x6e,0x00,0x70,0x6f,0x6f,0x00,0x71,0x71,0x70,0x00,\n\t0x72,0x72,0x72,0x00,0x73,0x72,0x73,0x00,0x74,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x77,0x00,0x79,0x78,0x78,0x00,0x7a,0x79,0x79,0x00,\n\t0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7f,0x7e,0x7e,0x00,0x80,0x7f,0x7f,0x00,0x81,0x7f,0x81,0x00,0x82,0x80,0x82,0x00,0x83,0x81,0x83,0x00,\n\t0x84,0x83,0x84,0x00,0x86,0x84,0x85,0x00,0x86,0x85,0x86,0x00,0x87,0x86,0x87,0x00,0x89,0x87,0x89,0x00,0x8a,0x88,0x8a,0x00,0x8b,0x89,0x8b,0x00,0x8c,0x8a,0x8c,0x00,\n\t0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x90,0x8f,0x8f,0x00,0x91,0x8e,0x90,0x00,0x92,0x90,0x91,0x00,0x93,0x91,0x92,0x00,0x94,0x92,0x93,0x00,0x95,0x93,0x95,0x00,\n\t0x96,0x95,0x96,0x00,0x98,0x96,0x97,0x00,0x99,0x97,0x98,0x00,0x9a,0x98,0x99,0x00,0x9b,0x99,0x9b,0x00,0x9c,0x9a,0x9c,0x00,0x9e,0x9b,0x9d,0x00,0x9f,0x9c,0x9e,0x00,\n\t0xa0,0xa0,0xa0,0x00,0xa1,0xa0,0xa0,0x00,0xa3,0xa1,0xa2,0x00,0xa4,0xa3,0xa3,0x00,0xa5,0xa4,0xa4,0x00,0xa7,0xa3,0xa6,0x00,0xa8,0xa5,0xa7,0x00,0xa9,0xa5,0xa8,0x00,\n\t0xab,0xa7,0xa9,0x00,0xac,0xa8,0xaa,0x00,0xad,0xaa,0xab,0x00,0xae,0xab,0xad,0x00,0xaf,0xac,0xaf,0x00,0xb0,0xad,0xb0,0x00,0xb1,0xaf,0xb1,0x00,0xb3,0xb0,0xb2,0x00,\n\t0xb4,0xb1,0xb3,0x00,0xb5,0xb2,0xb3,0x00,0xb7,0xb3,0xb5,0x00,0xb7,0xb4,0xb6,0x00,0xb9,0xb5,0xb7,0x00,0xba,0xb5,0xb8,0x00,0xbb,0xb9,0xba,0x00,0xbb,0xb9,0xbb,0x00,\n\t0xbd,0xbb,0xbc,0x00,0xbe,0xbc,0xbd,0x00,0xbf,0xbd,0xbe,0x00,0xc1,0xbe,0xbf,0x00,0xc2,0xbf,0xc0,0x00,0xc3,0xbf,0xc1,0x00,0xc4,0xc0,0xc2,0x00,0xc5,0xc1,0xc4,0x00,\n\t0xc7,0xc2,0xc5,0x00,0xc7,0xc3,0xc7,0x00,0xc9,0xc4,0xc8,0x00,0xc9,0xc5,0xc9,0x00,0xcb,0xc7,0xca,0x00,0xcc,0xc9,0xcb,0x00,0xcd,0xca,0xcc,0x00,0xce,0xcb,0xcc,0x00,\n\t0xd0,0xcc,0xce,0x00,0xd1,0xcc,0xcf,0x00,0xd2,0xce,0xd0,0x00,0xd3,0xcf,0xd1,0x00,0xd5,0xcf,0xd2,0x00,0xd5,0xd1,0xd3,0x00,0xd6,0xd1,0xd4,0x00,0xd7,0xd3,0xd6,0x00,\n\t0xd9,0xd4,0xd7,0x00,0xda,0xd5,0xd8,0x00,0xdb,0xd6,0xd9,0x00,0xdd,0xd8,0xda,0x00,0xde,0xda,0xdc,0x00,0xde,0xdc,0xdd,0x00,0xe0,0xdd,0xdd,0x00,0xe1,0xde,0xde,0x00,\n\t0xe3,0xdf,0xdf,0x00,0xe3,0xdf,0xe0,0x00,0xe5,0xe1,0xe1,0x00,0xe6,0xe2,0xe2,0x00,0xe7,0xe3,0xe3,0x00,0xe8,0xe2,0xe4,0x00,0xe9,0xe3,0xe6,0x00,0xea,0xe4,0xe7,0x00,\n\t0xec,0xe5,0xe8,0x00,0xed,0xe6,0xe9,0x00,0xee,0xe7,0xea,0x00,0xef,0xe8,0xeb,0x00,0xf0,0xe9,0xec,0x00,0xf1,0xeb,0xee,0x00,0xf3,0xed,0xee,0x00,0xf4,0xee,0xef,0x00,\n\t0xf5,0xef,0xf0,0x00,0xf6,0xf0,0xf1,0x00,0xf7,0xf2,0xf2,0x00,0xf8,0xf3,0xf3,0x00,0xfa,0xf3,0xf5,0x00,0xfb,0xf4,0xf5,0x00,0xfc,0xf5,0xf7,0x00,0xfc,0xf7,0xf8,0x00,\n\t0xfd,0xf7,0xf9,0x00,0xfe,0xf8,0xfa,0x00,0xff,0xf9,0xfc,0x00,0xff,0xfb,0xfc,0x00,0xff,0xfb,0xfe,0x00,0xff,0xfd,0xff,0x00,0xff,0xfe,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x15,0x15,0x15,0x00,0x16,0x19,0x17,0x00,0x18,0x1a,0x18,0x00,0x19,0x1b,0x19,0x00,0x1b,0x1c,0x1a,0x00,\n\t0x1d,0x1d,0x1b,0x00,0x1e,0x1e,0x1d,0x00,0x1f,0x1f,0x1e,0x00,0x1f,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,0x21,0x22,0x21,0x00,0x23,0x23,0x22,0x00,0x24,0x24,0x23,0x00,\n\t0x25,0x25,0x24,0x00,0x26,0x27,0x26,0x00,0x28,0x28,0x27,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2c,0x2b,0x2c,0x00,0x2c,0x2c,0x2c,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2e,0x2e,0x2e,0x00,0x30,0x30,0x30,0x00,0x30,0x30,0x30,0x00,0x32,0x32,0x32,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,\n\t0x3a,0x38,0x39,0x00,0x3a,0x39,0x39,0x00,0x3b,0x3a,0x3a,0x00,0x3d,0x3c,0x3c,0x00,0x3d,0x3c,0x3d,0x00,0x3f,0x3d,0x3d,0x00,0x40,0x3e,0x3f,0x00,0x41,0x40,0x40,0x00,\n\t0x42,0x41,0x41,0x00,0x43,0x42,0x42,0x00,0x44,0x43,0x43,0x00,0x45,0x44,0x44,0x00,0x47,0x45,0x46,0x00,0x47,0x47,0x47,0x00,0x49,0x48,0x48,0x00,0x4a,0x48,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4a,0x4b,0x00,0x4d,0x4c,0x4c,0x00,0x4e,0x4d,0x4d,0x00,0x4f,0x4e,0x4e,0x00,0x50,0x4f,0x4f,0x00,0x51,0x50,0x50,0x00,0x52,0x51,0x52,0x00,\n\t0x54,0x53,0x53,0x00,0x54,0x53,0x54,0x00,0x55,0x55,0x55,0x00,0x57,0x56,0x56,0x00,0x58,0x57,0x57,0x00,0x5a,0x58,0x59,0x00,0x5b,0x5a,0x5a,0x00,0x5c,0x5b,0x5b,0x00,\n\t0x5e,0x5d,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x61,0x60,0x60,0x00,0x62,0x61,0x61,0x00,0x64,0x63,0x63,0x00,0x65,0x64,0x64,0x00,0x66,0x66,0x66,0x00,0x68,0x67,0x67,0x00,\n\t0x6a,0x68,0x68,0x00,0x6a,0x69,0x69,0x00,0x6b,0x6a,0x6a,0x00,0x6c,0x6b,0x6b,0x00,0x6d,0x6c,0x6c,0x00,0x6f,0x6d,0x6d,0x00,0x70,0x6e,0x6e,0x00,0x71,0x6f,0x6f,0x00,\n\t0x72,0x71,0x71,0x00,0x73,0x72,0x72,0x00,0x74,0x73,0x73,0x00,0x75,0x74,0x74,0x00,0x76,0x75,0x75,0x00,0x77,0x76,0x76,0x00,0x78,0x77,0x78,0x00,0x7a,0x78,0x78,0x00,\n\t0x7b,0x79,0x7a,0x00,0x7c,0x7a,0x7b,0x00,0x7d,0x7c,0x7c,0x00,0x7e,0x7c,0x7d,0x00,0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x7f,0x00,0x81,0x80,0x80,0x00,0x82,0x81,0x81,0x00,\n\t0x83,0x82,0x82,0x00,0x85,0x83,0x83,0x00,0x85,0x84,0x85,0x00,0x87,0x85,0x85,0x00,0x87,0x86,0x87,0x00,0x89,0x87,0x88,0x00,0x8a,0x89,0x89,0x00,0x8b,0x8a,0x8a,0x00,\n\t0x8d,0x8b,0x8c,0x00,0x8e,0x8c,0x8d,0x00,0x8f,0x8d,0x8e,0x00,0x90,0x8e,0x8f,0x00,0x91,0x8f,0x90,0x00,0x93,0x90,0x91,0x00,0x93,0x92,0x93,0x00,0x95,0x93,0x93,0x00,\n\t0x96,0x94,0x95,0x00,0x97,0x95,0x96,0x00,0x99,0x96,0x97,0x00,0x99,0x97,0x99,0x00,0x9b,0x99,0x9a,0x00,0x9c,0x9a,0x9b,0x00,0x9d,0x9b,0x9c,0x00,0x9e,0x9c,0x9d,0x00,\n\t0xa0,0x9e,0x9e,0x00,0xa1,0x9e,0xa0,0x00,0xa2,0xa0,0xa0,0x00,0xa4,0xa1,0xa2,0x00,0xa5,0xa2,0xa3,0x00,0xa6,0xa2,0xa5,0x00,0xa8,0xa4,0xa6,0x00,0xa8,0xa5,0xa7,0x00,\n\t0xaa,0xa7,0xa9,0x00,0xab,0xa7,0xaa,0x00,0xac,0xa9,0xab,0x00,0xad,0xaa,0xac,0x00,0xaf,0xab,0xad,0x00,0xb0,0xac,0xae,0x00,0xb1,0xae,0xaf,0x00,0xb2,0xaf,0xb0,0x00,\n\t0xb3,0xb0,0xb2,0x00,0xb5,0xb1,0xb2,0x00,0xb6,0xb2,0xb4,0x00,0xb6,0xb3,0xb5,0x00,0xb8,0xb4,0xb6,0x00,0xba,0xb5,0xb7,0x00,0xba,0xb6,0xb9,0x00,0xbb,0xb7,0xba,0x00,\n\t0xbc,0xb9,0xba,0x00,0xbe,0xba,0xbb,0x00,0xbf,0xbb,0xbc,0x00,0xc0,0xbb,0xbe,0x00,0xc1,0xbd,0xbf,0x00,0xc2,0xbe,0xc0,0x00,0xc3,0xbf,0xc1,0x00,0xc4,0xc1,0xc3,0x00,\n\t0xc6,0xc2,0xc4,0x00,0xc6,0xc3,0xc4,0x00,0xc8,0xc4,0xc6,0x00,0xc9,0xc5,0xc6,0x00,0xca,0xc6,0xc8,0x00,0xcb,0xc7,0xc9,0x00,0xcc,0xc9,0xca,0x00,0xcd,0xca,0xcb,0x00,\n\t0xcf,0xcb,0xcc,0x00,0xd0,0xcc,0xcd,0x00,0xd1,0xcd,0xcf,0x00,0xd2,0xce,0xd0,0x00,0xd4,0xcf,0xd1,0x00,0xd5,0xd0,0xd2,0x00,0xd6,0xd1,0xd3,0x00,0xd7,0xd2,0xd4,0x00,\n\t0xd8,0xd4,0xd5,0x00,0xd9,0xd5,0xd6,0x00,0xda,0xd5,0xd7,0x00,0xdc,0xd6,0xd9,0x00,0xdd,0xd8,0xda,0x00,0xdf,0xd9,0xdb,0x00,0xdf,0xdb,0xdc,0x00,0xe0,0xdb,0xdd,0x00,\n\t0xe2,0xdc,0xdf,0x00,0xe2,0xdd,0xdf,0x00,0xe4,0xdf,0xe0,0x00,0xe4,0xdf,0xe1,0x00,0xe5,0xe1,0xe3,0x00,0xe6,0xe1,0xe3,0x00,0xe8,0xe3,0xe4,0x00,0xe9,0xe3,0xe5,0x00,\n\t0xea,0xe5,0xe6,0x00,0xeb,0xe6,0xe6,0x00,0xec,0xe7,0xe8,0x00,0xed,0xe8,0xe9,0x00,0xef,0xe9,0xea,0x00,0xef,0xea,0xeb,0x00,0xf1,0xec,0xed,0x00,0xf2,0xed,0xed,0x00,\n\t0xf3,0xee,0xef,0x00,0xf4,0xef,0xf0,0x00,0xf5,0xf0,0xf1,0x00,0xf6,0xf1,0xf2,0x00,0xf8,0xf2,0xf3,0x00,0xf9,0xf3,0xf4,0x00,0xfa,0xf4,0xf5,0x00,0xfc,0xf6,0xf6,0x00,\n\t0xfe,0xf7,0xf7,0x00,0xfe,0xf8,0xf9,0x00,0xff,0xf9,0xfa,0x00,0xff,0xfa,0xfb,0x00,0xff,0xfb,0xfc,0x00,0xff,0xfc,0xfd,0x00,0xff,0xfe,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x16,0x19,0x17,0x00,0x18,0x1a,0x18,0x00,0x19,0x1b,0x18,0x00,0x1b,0x1c,0x1a,0x00,\n\t0x1c,0x1d,0x1b,0x00,0x1d,0x1e,0x1c,0x00,0x1e,0x1f,0x1e,0x00,0x1f,0x20,0x1e,0x00,0x20,0x21,0x1f,0x00,0x21,0x22,0x20,0x00,0x23,0x23,0x22,0x00,0x24,0x24,0x23,0x00,\n\t0x24,0x25,0x24,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2b,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,\n\t0x2e,0x2e,0x2e,0x00,0x30,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x32,0x32,0x31,0x00,0x34,0x33,0x32,0x00,0x35,0x34,0x34,0x00,0x36,0x35,0x35,0x00,0x37,0x36,0x36,0x00,\n\t0x39,0x38,0x37,0x00,0x3a,0x39,0x39,0x00,0x3b,0x3a,0x3a,0x00,0x3c,0x3b,0x3b,0x00,0x3d,0x3c,0x3c,0x00,0x3e,0x3d,0x3d,0x00,0x3f,0x3e,0x3e,0x00,0x41,0x40,0x40,0x00,\n\t0x42,0x41,0x41,0x00,0x43,0x41,0x42,0x00,0x44,0x43,0x43,0x00,0x45,0x44,0x44,0x00,0x46,0x45,0x45,0x00,0x47,0x46,0x46,0x00,0x48,0x47,0x47,0x00,0x49,0x48,0x48,0x00,\n\t0x4a,0x49,0x49,0x00,0x4b,0x4a,0x4a,0x00,0x4d,0x4c,0x4c,0x00,0x4d,0x4c,0x4d,0x00,0x4e,0x4e,0x4d,0x00,0x50,0x4f,0x4f,0x00,0x51,0x50,0x50,0x00,0x52,0x51,0x51,0x00,\n\t0x53,0x52,0x52,0x00,0x54,0x53,0x53,0x00,0x55,0x54,0x54,0x00,0x56,0x56,0x56,0x00,0x58,0x57,0x57,0x00,0x59,0x58,0x58,0x00,0x5b,0x5a,0x5a,0x00,0x5c,0x5b,0x5b,0x00,\n\t0x5e,0x5c,0x5c,0x00,0x5f,0x5e,0x5e,0x00,0x60,0x5f,0x5f,0x00,0x62,0x61,0x61,0x00,0x63,0x62,0x62,0x00,0x64,0x64,0x64,0x00,0x66,0x65,0x65,0x00,0x67,0x66,0x66,0x00,\n\t0x69,0x68,0x67,0x00,0x6a,0x68,0x68,0x00,0x6b,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6d,0x6c,0x6c,0x00,0x6e,0x6d,0x6d,0x00,0x6f,0x6e,0x6e,0x00,0x70,0x6f,0x6f,0x00,\n\t0x71,0x70,0x70,0x00,0x72,0x71,0x71,0x00,0x74,0x73,0x72,0x00,0x75,0x74,0x74,0x00,0x76,0x75,0x74,0x00,0x77,0x76,0x76,0x00,0x78,0x77,0x77,0x00,0x79,0x78,0x78,0x00,\n\t0x7a,0x79,0x79,0x00,0x7b,0x7a,0x7a,0x00,0x7d,0x7b,0x7b,0x00,0x7d,0x7c,0x7d,0x00,0x7f,0x7e,0x7e,0x00,0x80,0x7e,0x7f,0x00,0x81,0x7f,0x80,0x00,0x82,0x80,0x80,0x00,\n\t0x84,0x81,0x81,0x00,0x84,0x83,0x83,0x00,0x86,0x84,0x84,0x00,0x87,0x85,0x86,0x00,0x88,0x86,0x87,0x00,0x89,0x87,0x88,0x00,0x8a,0x88,0x89,0x00,0x8b,0x89,0x8a,0x00,\n\t0x8d,0x8b,0x8a,0x00,0x8d,0x8c,0x8b,0x00,0x8f,0x8d,0x8d,0x00,0x90,0x8e,0x8e,0x00,0x91,0x8f,0x8f,0x00,0x92,0x90,0x91,0x00,0x93,0x91,0x92,0x00,0x94,0x93,0x93,0x00,\n\t0x95,0x94,0x95,0x00,0x97,0x95,0x96,0x00,0x98,0x96,0x96,0x00,0x99,0x97,0x97,0x00,0x9a,0x98,0x98,0x00,0x9b,0x99,0x9a,0x00,0x9e,0x9b,0x9c,0x00,0x9f,0x9c,0x9d,0x00,\n\t0xa0,0x9e,0x9f,0x00,0xa0,0x9e,0x9f,0x00,0xa2,0x9f,0xa0,0x00,0xa3,0xa0,0xa2,0x00,0xa4,0xa1,0xa2,0x00,0xa5,0xa2,0xa3,0x00,0xa6,0xa4,0xa4,0x00,0xa7,0xa5,0xa5,0x00,\n\t0xa9,0xa6,0xa6,0x00,0xaa,0xa7,0xa8,0x00,0xab,0xa8,0xa9,0x00,0xac,0xaa,0xaa,0x00,0xad,0xab,0xac,0x00,0xae,0xac,0xac,0x00,0xb1,0xad,0xaf,0x00,0xb1,0xaf,0xaf,0x00,\n\t0xb3,0xb0,0xb1,0x00,0xb4,0xb1,0xb2,0x00,0xb5,0xb2,0xb3,0x00,0xb6,0xb3,0xb4,0x00,0xb7,0xb4,0xb5,0x00,0xb8,0xb5,0xb5,0x00,0xb9,0xb6,0xb7,0x00,0xba,0xb7,0xb8,0x00,\n\t0xbc,0xb9,0xb9,0x00,0xbd,0xb9,0xbb,0x00,0xbe,0xbb,0xbc,0x00,0xc0,0xbb,0xbd,0x00,0xc1,0xbd,0xbe,0x00,0xc1,0xbe,0xbf,0x00,0xc3,0xbf,0xc1,0x00,0xc4,0xc0,0xc1,0x00,\n\t0xc5,0xc1,0xc3,0x00,0xc6,0xc3,0xc3,0x00,0xc7,0xc4,0xc5,0x00,0xc9,0xc5,0xc6,0x00,0xca,0xc6,0xc7,0x00,0xcb,0xc7,0xc8,0x00,0xcc,0xc8,0xc9,0x00,0xcd,0xc9,0xca,0x00,\n\t0xce,0xca,0xcb,0x00,0xd0,0xcb,0xcd,0x00,0xd1,0xcd,0xce,0x00,0xd2,0xcd,0xcf,0x00,0xd3,0xcf,0xd0,0x00,0xd4,0xd0,0xd1,0x00,0xd5,0xd1,0xd2,0x00,0xd7,0xd2,0xd3,0x00,\n\t0xd8,0xd3,0xd4,0x00,0xd9,0xd4,0xd5,0x00,0xda,0xd6,0xd6,0x00,0xdb,0xd7,0xd7,0x00,0xdc,0xd8,0xd8,0x00,0xdd,0xd9,0xd9,0x00,0xde,0xda,0xda,0x00,0xdf,0xdb,0xdc,0x00,\n\t0xe1,0xdc,0xdd,0x00,0xe1,0xdd,0xde,0x00,0xe3,0xde,0xdf,0x00,0xe4,0xdf,0xe0,0x00,0xe6,0xe1,0xe1,0x00,0xe7,0xe1,0xe2,0x00,0xe8,0xe3,0xe3,0x00,0xe9,0xe3,0xe4,0x00,\n\t0xeb,0xe5,0xe5,0x00,0xec,0xe6,0xe6,0x00,0xed,0xe7,0xe7,0x00,0xee,0xe8,0xe8,0x00,0xef,0xe9,0xea,0x00,0xf0,0xea,0xea,0x00,0xf1,0xeb,0xec,0x00,0xf3,0xed,0xec,0x00,\n\t0xf4,0xed,0xee,0x00,0xf5,0xee,0xef,0x00,0xf6,0xf0,0xf0,0x00,0xf7,0xf1,0xf1,0x00,0xf8,0xf2,0xf2,0x00,0xf9,0xf3,0xf3,0x00,0xfa,0xf4,0xf4,0x00,0xfb,0xf5,0xf6,0x00,\n\t0xfd,0xf6,0xf7,0x00,0xfd,0xf7,0xf8,0x00,0xff,0xf8,0xf9,0x00,0xff,0xfa,0xf9,0x00,0xff,0xfb,0xfc,0x00,0xff,0xfc,0xfc,0x00,0xff,0xfd,0xfd,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x16,0x18,0x16,0x00,0x17,0x19,0x18,0x00,0x19,0x1b,0x18,0x00,0x1a,0x1c,0x1a,0x00,\n\t0x1c,0x1d,0x1b,0x00,0x1d,0x1d,0x1c,0x00,0x1e,0x1f,0x1d,0x00,0x1f,0x20,0x1e,0x00,0x20,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,0x22,0x22,0x21,0x00,0x23,0x23,0x22,0x00,\n\t0x24,0x24,0x24,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x29,0x28,0x00,0x29,0x29,0x29,0x00,0x2b,0x2b,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2d,0x2d,0x2d,0x00,\n\t0x2d,0x2d,0x2d,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x31,0x31,0x00,0x33,0x33,0x32,0x00,0x35,0x34,0x33,0x00,0x35,0x35,0x35,0x00,0x37,0x36,0x36,0x00,\n\t0x39,0x37,0x37,0x00,0x39,0x38,0x38,0x00,0x3a,0x39,0x39,0x00,0x3c,0x3b,0x3b,0x00,0x3d,0x3c,0x3c,0x00,0x3e,0x3d,0x3d,0x00,0x3f,0x3e,0x3e,0x00,0x41,0x40,0x3f,0x00,\n\t0x41,0x40,0x40,0x00,0x42,0x41,0x41,0x00,0x43,0x42,0x42,0x00,0x44,0x44,0x43,0x00,0x46,0x45,0x45,0x00,0x47,0x46,0x46,0x00,0x48,0x47,0x47,0x00,0x49,0x48,0x48,0x00,\n\t0x4a,0x49,0x49,0x00,0x4b,0x4a,0x4a,0x00,0x4c,0x4b,0x4b,0x00,0x4d,0x4c,0x4c,0x00,0x4e,0x4d,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x52,0x51,0x51,0x00,\n\t0x53,0x52,0x52,0x00,0x54,0x53,0x52,0x00,0x55,0x54,0x54,0x00,0x56,0x55,0x55,0x00,0x57,0x56,0x56,0x00,0x58,0x58,0x57,0x00,0x5a,0x59,0x59,0x00,0x5c,0x5b,0x5b,0x00,\n\t0x5d,0x5c,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x60,0x5f,0x5f,0x00,0x61,0x60,0x60,0x00,0x63,0x62,0x61,0x00,0x64,0x63,0x63,0x00,0x66,0x65,0x64,0x00,0x67,0x66,0x65,0x00,\n\t0x69,0x67,0x66,0x00,0x69,0x68,0x67,0x00,0x6a,0x69,0x69,0x00,0x6b,0x6a,0x6a,0x00,0x6c,0x6c,0x6b,0x00,0x6d,0x6c,0x6c,0x00,0x6f,0x6e,0x6d,0x00,0x70,0x6f,0x6e,0x00,\n\t0x71,0x70,0x6f,0x00,0x72,0x71,0x70,0x00,0x73,0x72,0x71,0x00,0x74,0x73,0x73,0x00,0x76,0x74,0x74,0x00,0x76,0x75,0x75,0x00,0x78,0x76,0x76,0x00,0x79,0x77,0x77,0x00,\n\t0x7a,0x79,0x78,0x00,0x7b,0x7a,0x79,0x00,0x7c,0x7b,0x7b,0x00,0x7d,0x7c,0x7c,0x00,0x7e,0x7d,0x7d,0x00,0x7f,0x7e,0x7e,0x00,0x81,0x7f,0x7f,0x00,0x82,0x80,0x80,0x00,\n\t0x83,0x81,0x81,0x00,0x84,0x82,0x82,0x00,0x85,0x83,0x83,0x00,0x86,0x85,0x84,0x00,0x88,0x86,0x85,0x00,0x88,0x87,0x86,0x00,0x8a,0x88,0x87,0x00,0x8b,0x89,0x89,0x00,\n\t0x8c,0x8a,0x89,0x00,0x8d,0x8b,0x8a,0x00,0x8e,0x8d,0x8c,0x00,0x8f,0x8d,0x8d,0x00,0x90,0x8f,0x8f,0x00,0x92,0x90,0x90,0x00,0x92,0x91,0x91,0x00,0x94,0x92,0x92,0x00,\n\t0x95,0x93,0x94,0x00,0x96,0x95,0x95,0x00,0x98,0x96,0x96,0x00,0x99,0x97,0x97,0x00,0x9a,0x98,0x98,0x00,0x9b,0x99,0x99,0x00,0x9c,0x9a,0x9a,0x00,0x9d,0x9b,0x9b,0x00,\n\t0x9f,0x9d,0x9e,0x00,0xa0,0x9e,0x9f,0x00,0xa1,0x9f,0xa0,0x00,0xa3,0xa0,0xa1,0x00,0xa4,0xa1,0xa2,0x00,0xa5,0xa2,0xa2,0x00,0xa6,0xa3,0xa3,0x00,0xa7,0xa4,0xa4,0x00,\n\t0xa9,0xa6,0xa6,0x00,0xaa,0xa7,0xa6,0x00,0xac,0xa8,0xa8,0x00,0xac,0xa9,0xa9,0x00,0xae,0xab,0xab,0x00,0xaf,0xab,0xab,0x00,0xb0,0xad,0xae,0x00,0xb1,0xae,0xaf,0x00,\n\t0xb2,0xb0,0xb0,0x00,0xb3,0xb0,0xb1,0x00,0xb5,0xb1,0xb2,0x00,0xb5,0xb2,0xb3,0x00,0xb7,0xb4,0xb4,0x00,0xb8,0xb5,0xb4,0x00,0xb9,0xb6,0xb6,0x00,0xba,0xb7,0xb7,0x00,\n\t0xbb,0xb8,0xb8,0x00,0xbc,0xb9,0xb9,0x00,0xbd,0xbb,0xbb,0x00,0xbf,0xbb,0xbc,0x00,0xc0,0xbc,0xbd,0x00,0xc1,0xbd,0xbe,0x00,0xc2,0xbf,0xc0,0x00,0xc3,0xc0,0xc0,0x00,\n\t0xc5,0xc1,0xc1,0x00,0xc6,0xc3,0xc3,0x00,0xc7,0xc3,0xc4,0x00,0xc8,0xc4,0xc5,0x00,0xc9,0xc5,0xc6,0x00,0xca,0xc7,0xc7,0x00,0xcb,0xc8,0xc8,0x00,0xcc,0xc9,0xca,0x00,\n\t0xce,0xca,0xca,0x00,0xce,0xcb,0xcb,0x00,0xd0,0xcc,0xcd,0x00,0xd1,0xcd,0xce,0x00,0xd2,0xcf,0xcf,0x00,0xd3,0xcf,0xd0,0x00,0xd5,0xd1,0xd1,0x00,0xd6,0xd2,0xd2,0x00,\n\t0xd7,0xd3,0xd3,0x00,0xd8,0xd4,0xd4,0x00,0xda,0xd5,0xd5,0x00,0xda,0xd7,0xd6,0x00,0xdb,0xd8,0xd7,0x00,0xdd,0xd8,0xd8,0x00,0xde,0xda,0xda,0x00,0xdf,0xda,0xdb,0x00,\n\t0xe0,0xdb,0xdc,0x00,0xe2,0xdd,0xdd,0x00,0xe3,0xde,0xde,0x00,0xe4,0xdf,0xdf,0x00,0xe5,0xe0,0xe0,0x00,0xe6,0xe0,0xe1,0x00,0xe7,0xe2,0xe2,0x00,0xe9,0xe3,0xe4,0x00,\n\t0xea,0xe4,0xe4,0x00,0xeb,0xe5,0xe5,0x00,0xec,0xe6,0xe7,0x00,0xed,0xe7,0xe8,0x00,0xef,0xe8,0xe9,0x00,0xf0,0xea,0xea,0x00,0xf0,0xeb,0xeb,0x00,0xf1,0xec,0xec,0x00,\n\t0xf2,0xed,0xee,0x00,0xf3,0xee,0xef,0x00,0xf4,0xef,0xf0,0x00,0xf5,0xf0,0xf0,0x00,0xf6,0xf2,0xf2,0x00,0xf8,0xf2,0xf2,0x00,0xf9,0xf4,0xf4,0x00,0xf9,0xf5,0xf5,0x00,\n\t0xfb,0xf6,0xf6,0x00,0xfc,0xf7,0xf8,0x00,0xfd,0xf8,0xf8,0x00,0xff,0xf9,0xfa,0x00,0xff,0xfa,0xfa,0x00,0xff,0xfb,0xfc,0x00,0xff,0xfd,0xfd,0x00,0xff,0xfe,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x16,0x18,0x16,0x00,0x17,0x19,0x17,0x00,0x19,0x1a,0x18,0x00,0x1b,0x1b,0x19,0x00,\n\t0x1b,0x1c,0x1a,0x00,0x1d,0x1d,0x1c,0x00,0x1e,0x1e,0x1d,0x00,0x1f,0x1f,0x1e,0x00,0x20,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,0x22,0x22,0x21,0x00,0x23,0x23,0x22,0x00,\n\t0x25,0x24,0x23,0x00,0x26,0x26,0x24,0x00,0x27,0x27,0x26,0x00,0x29,0x28,0x28,0x00,0x29,0x29,0x28,0x00,0x2a,0x2b,0x2b,0x00,0x2b,0x2b,0x2b,0x00,0x2d,0x2d,0x2c,0x00,\n\t0x2d,0x2d,0x2c,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x2f,0x2f,0x00,0x31,0x31,0x30,0x00,0x32,0x32,0x32,0x00,0x33,0x34,0x33,0x00,0x35,0x35,0x34,0x00,0x36,0x36,0x35,0x00,\n\t0x37,0x37,0x37,0x00,0x39,0x38,0x38,0x00,0x3a,0x39,0x39,0x00,0x3c,0x3b,0x3a,0x00,0x3c,0x3b,0x3b,0x00,0x3e,0x3c,0x3c,0x00,0x3f,0x3e,0x3d,0x00,0x40,0x3f,0x3f,0x00,\n\t0x41,0x40,0x40,0x00,0x42,0x41,0x41,0x00,0x43,0x42,0x42,0x00,0x44,0x43,0x43,0x00,0x46,0x45,0x44,0x00,0x47,0x46,0x45,0x00,0x48,0x47,0x46,0x00,0x48,0x48,0x47,0x00,\n\t0x4a,0x49,0x48,0x00,0x4b,0x4a,0x49,0x00,0x4c,0x4b,0x4b,0x00,0x4d,0x4c,0x4b,0x00,0x4e,0x4d,0x4c,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x4f,0x4e,0x00,0x51,0x51,0x50,0x00,\n\t0x53,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x55,0x54,0x53,0x00,0x56,0x55,0x54,0x00,0x57,0x56,0x55,0x00,0x58,0x57,0x57,0x00,0x5a,0x59,0x57,0x00,0x5b,0x5b,0x59,0x00,\n\t0x5d,0x5c,0x5b,0x00,0x5e,0x5d,0x5c,0x00,0x5f,0x5f,0x5e,0x00,0x61,0x60,0x5f,0x00,0x63,0x62,0x61,0x00,0x64,0x63,0x62,0x00,0x65,0x65,0x63,0x00,0x66,0x66,0x65,0x00,\n\t0x68,0x67,0x66,0x00,0x69,0x68,0x67,0x00,0x6a,0x69,0x68,0x00,0x6b,0x6a,0x69,0x00,0x6c,0x6c,0x6a,0x00,0x6d,0x6d,0x6b,0x00,0x6e,0x6e,0x6c,0x00,0x70,0x6f,0x6e,0x00,\n\t0x71,0x70,0x6f,0x00,0x72,0x71,0x70,0x00,0x73,0x72,0x71,0x00,0x74,0x73,0x72,0x00,0x75,0x74,0x73,0x00,0x76,0x75,0x74,0x00,0x77,0x77,0x75,0x00,0x78,0x78,0x77,0x00,\n\t0x79,0x79,0x77,0x00,0x7b,0x7a,0x79,0x00,0x7c,0x7b,0x7a,0x00,0x7d,0x7c,0x7b,0x00,0x7e,0x7d,0x7c,0x00,0x7f,0x7e,0x7d,0x00,0x80,0x7f,0x7e,0x00,0x81,0x80,0x7f,0x00,\n\t0x82,0x82,0x80,0x00,0x83,0x82,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x85,0x83,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x8a,0x89,0x87,0x00,\n\t0x8b,0x8a,0x89,0x00,0x8c,0x8b,0x8a,0x00,0x8e,0x8d,0x8b,0x00,0x8f,0x8d,0x8d,0x00,0x90,0x8f,0x8e,0x00,0x91,0x90,0x8f,0x00,0x92,0x91,0x90,0x00,0x94,0x92,0x91,0x00,\n\t0x95,0x94,0x94,0x00,0x96,0x95,0x94,0x00,0x97,0x96,0x95,0x00,0x98,0x97,0x96,0x00,0x99,0x98,0x97,0x00,0x9b,0x99,0x98,0x00,0x9c,0x9a,0x99,0x00,0x9e,0x9b,0x9b,0x00,\n\t0x9f,0x9d,0x9c,0x00,0xa0,0x9e,0x9d,0x00,0xa1,0x9f,0x9e,0x00,0xa2,0xa0,0x9f,0x00,0xa3,0xa2,0xa1,0x00,0xa4,0xa2,0xa2,0x00,0xa5,0xa4,0xa3,0x00,0xa6,0xa4,0xa4,0x00,\n\t0xa8,0xa6,0xa6,0x00,0xa8,0xa7,0xa7,0x00,0xaa,0xa8,0xa8,0x00,0xab,0xa9,0xa9,0x00,0xac,0xab,0xab,0x00,0xad,0xab,0xab,0x00,0xb0,0xad,0xad,0x00,0xb0,0xae,0xae,0x00,\n\t0xb2,0xaf,0xaf,0x00,0xb3,0xb0,0xb0,0x00,0xb4,0xb2,0xb2,0x00,0xb5,0xb3,0xb2,0x00,0xb7,0xb4,0xb3,0x00,0xb8,0xb5,0xb5,0x00,0xb9,0xb6,0xb6,0x00,0xba,0xb7,0xb7,0x00,\n\t0xbb,0xb8,0xb8,0x00,0xbb,0xb9,0xb9,0x00,0xbc,0xba,0xba,0x00,0xbe,0xbb,0xbb,0x00,0xc0,0xbd,0xbc,0x00,0xc1,0xbe,0xbc,0x00,0xc2,0xbf,0xbf,0x00,0xc3,0xc0,0xc0,0x00,\n\t0xc4,0xc1,0xc1,0x00,0xc5,0xc2,0xc2,0x00,0xc7,0xc3,0xc3,0x00,0xc7,0xc4,0xc4,0x00,0xc9,0xc6,0xc5,0x00,0xca,0xc7,0xc6,0x00,0xcb,0xc8,0xc7,0x00,0xcc,0xc9,0xc9,0x00,\n\t0xce,0xca,0xca,0x00,0xce,0xcb,0xcb,0x00,0xd0,0xcc,0xcc,0x00,0xd0,0xcd,0xcd,0x00,0xd2,0xcf,0xce,0x00,0xd3,0xcf,0xcf,0x00,0xd4,0xd1,0xd0,0x00,0xd5,0xd2,0xd2,0x00,\n\t0xd6,0xd3,0xd3,0x00,0xd8,0xd4,0xd4,0x00,0xd9,0xd5,0xd5,0x00,0xdb,0xd6,0xd6,0x00,0xdc,0xd7,0xd8,0x00,0xdd,0xd9,0xd9,0x00,0xde,0xda,0xd9,0x00,0xde,0xda,0xda,0x00,\n\t0xe0,0xdc,0xdb,0x00,0xe1,0xdd,0xdc,0x00,0xe2,0xde,0xdd,0x00,0xe3,0xdf,0xdf,0x00,0xe4,0xe0,0xdf,0x00,0xe5,0xe1,0xe0,0x00,0xe6,0xe2,0xe1,0x00,0xe7,0xe3,0xe3,0x00,\n\t0xe8,0xe4,0xe4,0x00,0xe9,0xe5,0xe4,0x00,0xeb,0xe6,0xe6,0x00,0xeb,0xe7,0xe6,0x00,0xed,0xe9,0xe8,0x00,0xee,0xea,0xe8,0x00,0xef,0xeb,0xea,0x00,0xf0,0xec,0xeb,0x00,\n\t0xf1,0xee,0xec,0x00,0xf3,0xee,0xed,0x00,0xf4,0xf0,0xef,0x00,0xf5,0xf1,0xef,0x00,0xf6,0xf2,0xf1,0x00,0xf8,0xf3,0xf1,0x00,0xf8,0xf4,0xf2,0x00,0xf9,0xf5,0xf4,0x00,\n\t0xfb,0xf6,0xf5,0x00,0xfc,0xf7,0xf6,0x00,0xfd,0xf8,0xf7,0x00,0xfe,0xfa,0xf8,0x00,0xff,0xfb,0xf9,0x00,0xff,0xfc,0xfb,0x00,0xff,0xfd,0xfc,0x00,0xff,0xfe,0xfd,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x16,0x17,0x16,0x00,0x17,0x19,0x16,0x00,0x18,0x1a,0x18,0x00,0x1b,0x1b,0x19,0x00,\n\t0x1c,0x1c,0x1a,0x00,0x1d,0x1d,0x1b,0x00,0x1e,0x1e,0x1c,0x00,0x1f,0x1f,0x1d,0x00,0x20,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,0x22,0x22,0x20,0x00,0x23,0x23,0x22,0x00,\n\t0x24,0x24,0x23,0x00,0x26,0x26,0x24,0x00,0x26,0x27,0x26,0x00,0x28,0x28,0x28,0x00,0x28,0x29,0x28,0x00,0x2b,0x2b,0x29,0x00,0x2b,0x2b,0x2a,0x00,0x2c,0x2c,0x2c,0x00,\n\t0x2d,0x2d,0x2d,0x00,0x2f,0x2f,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x31,0x30,0x00,0x33,0x32,0x31,0x00,0x34,0x33,0x32,0x00,0x35,0x34,0x33,0x00,0x36,0x36,0x35,0x00,\n\t0x38,0x37,0x36,0x00,0x39,0x38,0x37,0x00,0x3a,0x39,0x38,0x00,0x3c,0x3b,0x3a,0x00,0x3c,0x3b,0x3b,0x00,0x3d,0x3c,0x3c,0x00,0x3e,0x3d,0x3d,0x00,0x40,0x3f,0x3e,0x00,\n\t0x41,0x40,0x3f,0x00,0x42,0x41,0x40,0x00,0x43,0x42,0x41,0x00,0x44,0x43,0x42,0x00,0x45,0x44,0x44,0x00,0x46,0x45,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x47,0x47,0x00,\n\t0x4a,0x49,0x47,0x00,0x4b,0x4a,0x49,0x00,0x4c,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4e,0x4d,0x4c,0x00,0x4f,0x4e,0x4d,0x00,0x50,0x4f,0x4e,0x00,0x51,0x51,0x50,0x00,\n\t0x52,0x52,0x51,0x00,0x53,0x53,0x51,0x00,0x54,0x54,0x53,0x00,0x56,0x55,0x54,0x00,0x57,0x56,0x55,0x00,0x58,0x57,0x56,0x00,0x5a,0x59,0x57,0x00,0x5b,0x5a,0x58,0x00,\n\t0x5c,0x5c,0x5a,0x00,0x5e,0x5d,0x5c,0x00,0x5f,0x5f,0x5d,0x00,0x61,0x60,0x5e,0x00,0x62,0x62,0x60,0x00,0x63,0x63,0x62,0x00,0x65,0x64,0x63,0x00,0x66,0x66,0x64,0x00,\n\t0x68,0x67,0x65,0x00,0x68,0x68,0x66,0x00,0x6a,0x69,0x67,0x00,0x6b,0x6a,0x68,0x00,0x6c,0x6b,0x6a,0x00,0x6d,0x6c,0x6a,0x00,0x6e,0x6d,0x6c,0x00,0x6f,0x6e,0x6c,0x00,\n\t0x70,0x70,0x6e,0x00,0x71,0x71,0x6f,0x00,0x72,0x72,0x70,0x00,0x73,0x73,0x71,0x00,0x75,0x74,0x73,0x00,0x76,0x75,0x73,0x00,0x77,0x76,0x74,0x00,0x78,0x77,0x76,0x00,\n\t0x79,0x78,0x77,0x00,0x7a,0x79,0x78,0x00,0x7c,0x7b,0x79,0x00,0x7d,0x7c,0x7a,0x00,0x7e,0x7d,0x7b,0x00,0x7f,0x7e,0x7c,0x00,0x7f,0x7f,0x7d,0x00,0x80,0x80,0x7f,0x00,\n\t0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,0x84,0x83,0x82,0x00,0x85,0x85,0x83,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x87,0x87,0x00,0x8a,0x89,0x88,0x00,\n\t0x8b,0x8a,0x89,0x00,0x8c,0x8b,0x89,0x00,0x8e,0x8c,0x8b,0x00,0x8f,0x8d,0x8c,0x00,0x90,0x8f,0x8d,0x00,0x91,0x90,0x8e,0x00,0x92,0x91,0x8f,0x00,0x93,0x92,0x91,0x00,\n\t0x95,0x93,0x92,0x00,0x96,0x95,0x93,0x00,0x97,0x95,0x94,0x00,0x98,0x96,0x95,0x00,0x99,0x98,0x97,0x00,0x9a,0x99,0x97,0x00,0x9c,0x9a,0x99,0x00,0x9e,0x9b,0x9a,0x00,\n\t0x9f,0x9d,0x9b,0x00,0x9f,0x9d,0x9c,0x00,0xa1,0x9f,0x9d,0x00,0xa2,0xa0,0x9e,0x00,0xa3,0xa1,0xa0,0x00,0xa3,0xa2,0xa1,0x00,0xa5,0xa3,0xa2,0x00,0xa6,0xa4,0xa4,0x00,\n\t0xa7,0xa6,0xa5,0x00,0xa8,0xa6,0xa6,0x00,0xaa,0xa8,0xa7,0x00,0xab,0xa9,0xa8,0x00,0xac,0xaa,0xa9,0x00,0xad,0xab,0xab,0x00,0xaf,0xad,0xac,0x00,0xb0,0xae,0xad,0x00,\n\t0xb2,0xaf,0xae,0x00,0xb2,0xb0,0xaf,0x00,0xb4,0xb1,0xb0,0x00,0xb5,0xb3,0xb1,0x00,0xb6,0xb3,0xb3,0x00,0xb7,0xb4,0xb4,0x00,0xb8,0xb6,0xb5,0x00,0xb8,0xb6,0xb6,0x00,\n\t0xbb,0xb8,0xb7,0x00,0xbc,0xb9,0xb8,0x00,0xbd,0xba,0xba,0x00,0xbe,0xbb,0xba,0x00,0xbf,0xbc,0xbb,0x00,0xc0,0xbd,0xbc,0x00,0xc1,0xbf,0xbe,0x00,0xc3,0xbf,0xbf,0x00,\n\t0xc4,0xc0,0xc0,0x00,0xc4,0xc2,0xc1,0x00,0xc6,0xc3,0xc2,0x00,0xc7,0xc4,0xc3,0x00,0xc8,0xc5,0xc4,0x00,0xc9,0xc6,0xc5,0x00,0xca,0xc8,0xc7,0x00,0xcb,0xc9,0xc7,0x00,\n\t0xcd,0xca,0xc9,0x00,0xce,0xcb,0xca,0x00,0xcf,0xcc,0xcb,0x00,0xd0,0xcd,0xcb,0x00,0xd1,0xce,0xcd,0x00,0xd3,0xcf,0xce,0x00,0xd4,0xd0,0xd0,0x00,0xd5,0xd2,0xd0,0x00,\n\t0xd6,0xd2,0xd1,0x00,0xd7,0xd3,0xd3,0x00,0xd9,0xd4,0xd4,0x00,0xda,0xd6,0xd5,0x00,0xdb,0xd7,0xd6,0x00,0xdb,0xd8,0xd8,0x00,0xdd,0xd9,0xd8,0x00,0xde,0xda,0xd9,0x00,\n\t0xdf,0xdc,0xda,0x00,0xe0,0xdc,0xdb,0x00,0xe2,0xde,0xdc,0x00,0xe3,0xde,0xdd,0x00,0xe4,0xe0,0xde,0x00,0xe5,0xe0,0xdf,0x00,0xe7,0xe2,0xe1,0x00,0xe7,0xe3,0xe1,0x00,\n\t0xe9,0xe4,0xe3,0x00,0xea,0xe5,0xe3,0x00,0xeb,0xe6,0xe4,0x00,0xec,0xe7,0xe4,0x00,0xee,0xe9,0xe6,0x00,0xef,0xe9,0xe7,0x00,0xf0,0xeb,0xe8,0x00,0xf1,0xeb,0xe9,0x00,\n\t0xf2,0xed,0xea,0x00,0xf3,0xee,0xeb,0x00,0xf4,0xef,0xed,0x00,0xf5,0xf0,0xee,0x00,0xf7,0xf1,0xef,0x00,0xf8,0xf2,0xf0,0x00,0xf9,0xf3,0xf1,0x00,0xfb,0xf5,0xf2,0x00,\n\t0xfb,0xf6,0xf4,0x00,0xfc,0xf7,0xf5,0x00,0xfe,0xf8,0xf6,0x00,0xff,0xf9,0xf7,0x00,0xff,0xfa,0xf8,0x00,0xff,0xfc,0xf9,0x00,0xff,0xfc,0xfb,0x00,0xff,0xfd,0xfb,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x16,0x17,0x16,0x00,0x17,0x18,0x16,0x00,0x18,0x19,0x17,0x00,0x1a,0x1a,0x19,0x00,\n\t0x1c,0x1c,0x1a,0x00,0x1d,0x1d,0x1b,0x00,0x1e,0x1e,0x1c,0x00,0x1f,0x1f,0x1d,0x00,0x20,0x20,0x1e,0x00,0x20,0x21,0x1f,0x00,0x22,0x22,0x20,0x00,0x23,0x23,0x21,0x00,\n\t0x24,0x24,0x23,0x00,0x26,0x25,0x24,0x00,0x27,0x26,0x25,0x00,0x28,0x28,0x27,0x00,0x29,0x29,0x28,0x00,0x2a,0x2a,0x29,0x00,0x2b,0x2b,0x2a,0x00,0x2d,0x2c,0x2b,0x00,\n\t0x2d,0x2c,0x2c,0x00,0x2e,0x2e,0x2d,0x00,0x2f,0x2f,0x2e,0x00,0x31,0x30,0x30,0x00,0x31,0x32,0x30,0x00,0x33,0x33,0x32,0x00,0x34,0x34,0x33,0x00,0x36,0x35,0x34,0x00,\n\t0x37,0x37,0x35,0x00,0x39,0x38,0x37,0x00,0x3a,0x39,0x38,0x00,0x3b,0x3a,0x39,0x00,0x3c,0x3b,0x3a,0x00,0x3d,0x3c,0x3b,0x00,0x3e,0x3d,0x3c,0x00,0x40,0x3f,0x3d,0x00,\n\t0x41,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x43,0x42,0x41,0x00,0x44,0x43,0x42,0x00,0x45,0x44,0x43,0x00,0x46,0x45,0x44,0x00,0x47,0x46,0x45,0x00,0x48,0x47,0x46,0x00,\n\t0x49,0x48,0x47,0x00,0x4a,0x4a,0x48,0x00,0x4c,0x4b,0x4a,0x00,0x4c,0x4c,0x4a,0x00,0x4d,0x4d,0x4b,0x00,0x4e,0x4e,0x4d,0x00,0x50,0x4f,0x4e,0x00,0x51,0x50,0x4f,0x00,\n\t0x52,0x51,0x50,0x00,0x53,0x52,0x51,0x00,0x54,0x53,0x52,0x00,0x55,0x55,0x53,0x00,0x57,0x56,0x54,0x00,0x58,0x57,0x55,0x00,0x59,0x59,0x57,0x00,0x5b,0x5a,0x58,0x00,\n\t0x5c,0x5b,0x59,0x00,0x5d,0x5c,0x5b,0x00,0x5f,0x5e,0x5c,0x00,0x60,0x60,0x5e,0x00,0x62,0x61,0x5f,0x00,0x63,0x63,0x60,0x00,0x64,0x64,0x62,0x00,0x66,0x65,0x63,0x00,\n\t0x68,0x67,0x65,0x00,0x68,0x68,0x65,0x00,0x69,0x69,0x67,0x00,0x6a,0x6a,0x68,0x00,0x6c,0x6b,0x69,0x00,0x6d,0x6c,0x6a,0x00,0x6e,0x6d,0x6b,0x00,0x6f,0x6e,0x6c,0x00,\n\t0x70,0x6f,0x6d,0x00,0x71,0x70,0x6e,0x00,0x72,0x72,0x6f,0x00,0x73,0x73,0x70,0x00,0x75,0x74,0x72,0x00,0x76,0x74,0x73,0x00,0x76,0x76,0x74,0x00,0x78,0x77,0x75,0x00,\n\t0x79,0x78,0x76,0x00,0x7a,0x79,0x77,0x00,0x7b,0x7a,0x78,0x00,0x7c,0x7b,0x79,0x00,0x7e,0x7d,0x7b,0x00,0x7e,0x7d,0x7c,0x00,0x7f,0x7f,0x7d,0x00,0x81,0x80,0x7e,0x00,\n\t0x82,0x80,0x7f,0x00,0x83,0x82,0x81,0x00,0x84,0x83,0x81,0x00,0x85,0x84,0x83,0x00,0x87,0x85,0x84,0x00,0x87,0x86,0x85,0x00,0x89,0x87,0x86,0x00,0x8a,0x88,0x87,0x00,\n\t0x8b,0x89,0x88,0x00,0x8c,0x8b,0x89,0x00,0x8d,0x8c,0x8b,0x00,0x8e,0x8d,0x8b,0x00,0x90,0x8e,0x8c,0x00,0x91,0x8f,0x8d,0x00,0x92,0x90,0x8f,0x00,0x93,0x91,0x90,0x00,\n\t0x95,0x93,0x91,0x00,0x95,0x94,0x92,0x00,0x97,0x95,0x93,0x00,0x97,0x96,0x94,0x00,0x98,0x97,0x96,0x00,0x9a,0x98,0x96,0x00,0x9b,0x9a,0x98,0x00,0x9d,0x9b,0x99,0x00,\n\t0x9f,0x9c,0x9a,0x00,0x9f,0x9d,0x9b,0x00,0xa0,0x9e,0x9c,0x00,0xa2,0x9f,0x9d,0x00,0xa3,0xa0,0x9f,0x00,0xa3,0xa1,0xa0,0x00,0xa4,0xa3,0xa2,0x00,0xa5,0xa4,0xa3,0x00,\n\t0xa7,0xa5,0xa4,0x00,0xa8,0xa6,0xa5,0x00,0xa9,0xa7,0xa6,0x00,0xaa,0xa9,0xa8,0x00,0xac,0xaa,0xa9,0x00,0xad,0xab,0xaa,0x00,0xaf,0xac,0xab,0x00,0xb0,0xae,0xac,0x00,\n\t0xb1,0xaf,0xad,0x00,0xb2,0xb0,0xae,0x00,0xb3,0xb1,0xb0,0x00,0xb5,0xb2,0xb0,0x00,0xb6,0xb3,0xb2,0x00,0xb6,0xb4,0xb3,0x00,0xb8,0xb5,0xb4,0x00,0xb8,0xb6,0xb5,0x00,\n\t0xbb,0xb8,0xb6,0x00,0xbc,0xb8,0xb7,0x00,0xbd,0xba,0xb8,0x00,0xbe,0xbb,0xba,0x00,0xbf,0xbc,0xba,0x00,0xc0,0xbd,0xbb,0x00,0xc1,0xbf,0xbc,0x00,0xc2,0xbf,0xbe,0x00,\n\t0xc4,0xc0,0xbf,0x00,0xc5,0xc2,0xc0,0x00,0xc6,0xc3,0xc1,0x00,0xc7,0xc4,0xc2,0x00,0xc8,0xc5,0xc3,0x00,0xc9,0xc6,0xc4,0x00,0xca,0xc7,0xc6,0x00,0xcb,0xc8,0xc7,0x00,\n\t0xcd,0xca,0xc8,0x00,0xcd,0xca,0xc9,0x00,0xcf,0xcb,0xca,0x00,0xd0,0xcc,0xcb,0x00,0xd1,0xcd,0xcc,0x00,0xd2,0xcf,0xcd,0x00,0xd3,0xd0,0xcf,0x00,0xd5,0xd1,0xcf,0x00,\n\t0xd6,0xd2,0xd0,0x00,0xd7,0xd4,0xd1,0x00,0xd8,0xd4,0xd3,0x00,0xd9,0xd5,0xd4,0x00,0xda,0xd7,0xd6,0x00,0xdb,0xd8,0xd6,0x00,0xdd,0xd9,0xd7,0x00,0xde,0xda,0xd8,0x00,\n\t0xdf,0xdb,0xd9,0x00,0xe0,0xdc,0xdb,0x00,0xe1,0xde,0xdc,0x00,0xe3,0xdf,0xdd,0x00,0xe4,0xe0,0xde,0x00,0xe5,0xe0,0xde,0x00,0xe6,0xe2,0xe0,0x00,0xe7,0xe3,0xe1,0x00,\n\t0xe9,0xe4,0xe2,0x00,0xe9,0xe4,0xe3,0x00,0xeb,0xe6,0xe4,0x00,0xec,0xe7,0xe4,0x00,0xee,0xe8,0xe6,0x00,0xee,0xe9,0xe7,0x00,0xef,0xeb,0xe8,0x00,0xf0,0xeb,0xe9,0x00,\n\t0xf2,0xec,0xeb,0x00,0xf3,0xee,0xeb,0x00,0xf4,0xef,0xec,0x00,0xf5,0xf0,0xed,0x00,0xf6,0xf1,0xef,0x00,0xf7,0xf2,0xf0,0x00,0xf8,0xf3,0xf1,0x00,0xf9,0xf5,0xf3,0x00,\n\t0xfb,0xf5,0xf4,0x00,0xfc,0xf7,0xf5,0x00,0xfd,0xf8,0xf6,0x00,0xfe,0xf9,0xf7,0x00,0xff,0xfa,0xf9,0x00,0xff,0xfb,0xfa,0x00,0xff,0xfc,0xfa,0x00,0xff,0xfd,0xfb,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x10,0x10,0x10,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x16,0x17,0x15,0x00,0x17,0x18,0x16,0x00,0x18,0x19,0x17,0x00,0x19,0x1a,0x18,0x00,\n\t0x1b,0x1b,0x19,0x00,0x1c,0x1c,0x1b,0x00,0x1d,0x1d,0x1c,0x00,0x1e,0x1e,0x1d,0x00,0x20,0x1f,0x1e,0x00,0x20,0x20,0x1f,0x00,0x22,0x22,0x20,0x00,0x22,0x22,0x21,0x00,\n\t0x24,0x24,0x22,0x00,0x25,0x25,0x24,0x00,0x26,0x26,0x25,0x00,0x28,0x28,0x26,0x00,0x28,0x28,0x27,0x00,0x2b,0x2a,0x29,0x00,0x2b,0x2b,0x29,0x00,0x2c,0x2c,0x2b,0x00,\n\t0x2c,0x2c,0x2b,0x00,0x2f,0x2f,0x2e,0x00,0x2f,0x2f,0x2e,0x00,0x30,0x30,0x2f,0x00,0x32,0x32,0x31,0x00,0x33,0x33,0x32,0x00,0x34,0x34,0x33,0x00,0x35,0x35,0x34,0x00,\n\t0x37,0x37,0x36,0x00,0x38,0x37,0x36,0x00,0x39,0x38,0x37,0x00,0x3b,0x3a,0x39,0x00,0x3c,0x3b,0x3a,0x00,0x3d,0x3c,0x3b,0x00,0x3e,0x3d,0x3c,0x00,0x40,0x3e,0x3d,0x00,\n\t0x41,0x40,0x3e,0x00,0x41,0x41,0x3f,0x00,0x42,0x41,0x40,0x00,0x44,0x43,0x41,0x00,0x45,0x44,0x43,0x00,0x46,0x45,0x44,0x00,0x47,0x46,0x45,0x00,0x47,0x47,0x46,0x00,\n\t0x49,0x48,0x47,0x00,0x4a,0x49,0x48,0x00,0x4b,0x4b,0x49,0x00,0x4c,0x4b,0x4a,0x00,0x4d,0x4c,0x4b,0x00,0x4e,0x4e,0x4c,0x00,0x4f,0x4f,0x4d,0x00,0x51,0x50,0x4e,0x00,\n\t0x52,0x51,0x4f,0x00,0x52,0x52,0x51,0x00,0x54,0x53,0x52,0x00,0x55,0x55,0x53,0x00,0x56,0x56,0x54,0x00,0x57,0x57,0x55,0x00,0x59,0x58,0x56,0x00,0x5a,0x5a,0x57,0x00,\n\t0x5c,0x5b,0x59,0x00,0x5d,0x5d,0x5a,0x00,0x5e,0x5e,0x5c,0x00,0x60,0x5f,0x5d,0x00,0x61,0x60,0x5f,0x00,0x62,0x62,0x60,0x00,0x64,0x64,0x61,0x00,0x65,0x65,0x63,0x00,\n\t0x66,0x67,0x64,0x00,0x68,0x67,0x65,0x00,0x69,0x68,0x66,0x00,0x6a,0x6a,0x67,0x00,0x6b,0x6a,0x68,0x00,0x6c,0x6c,0x69,0x00,0x6d,0x6d,0x6b,0x00,0x6e,0x6e,0x6c,0x00,\n\t0x70,0x6f,0x6c,0x00,0x71,0x70,0x6e,0x00,0x72,0x71,0x6f,0x00,0x73,0x72,0x70,0x00,0x74,0x73,0x71,0x00,0x75,0x74,0x72,0x00,0x76,0x76,0x73,0x00,0x77,0x76,0x74,0x00,\n\t0x78,0x78,0x75,0x00,0x7a,0x79,0x77,0x00,0x7b,0x7a,0x78,0x00,0x7c,0x7b,0x79,0x00,0x7d,0x7c,0x7a,0x00,0x7e,0x7d,0x7b,0x00,0x7f,0x7e,0x7c,0x00,0x80,0x7f,0x7d,0x00,\n\t0x81,0x80,0x7f,0x00,0x82,0x81,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x86,0x85,0x83,0x00,0x87,0x86,0x84,0x00,0x89,0x87,0x86,0x00,0x8a,0x88,0x87,0x00,\n\t0x8b,0x89,0x88,0x00,0x8b,0x8a,0x89,0x00,0x8d,0x8b,0x8a,0x00,0x8e,0x8c,0x8b,0x00,0x8f,0x8e,0x8c,0x00,0x91,0x8f,0x8d,0x00,0x91,0x90,0x8e,0x00,0x92,0x91,0x8f,0x00,\n\t0x94,0x93,0x90,0x00,0x95,0x94,0x91,0x00,0x96,0x95,0x92,0x00,0x97,0x96,0x93,0x00,0x98,0x97,0x95,0x00,0x99,0x98,0x96,0x00,0x9b,0x99,0x97,0x00,0x9c,0x9a,0x98,0x00,\n\t0x9e,0x9c,0x9a,0x00,0x9f,0x9d,0x9b,0x00,0xa0,0x9e,0x9d,0x00,0xa1,0x9f,0x9e,0x00,0xa2,0xa0,0x9f,0x00,0xa2,0xa1,0x9f,0x00,0xa4,0xa3,0xa0,0x00,0xa5,0xa4,0xa1,0x00,\n\t0xa6,0xa5,0xa2,0x00,0xa7,0xa6,0xa4,0x00,0xa9,0xa7,0xa5,0x00,0xaa,0xa8,0xa6,0x00,0xac,0xaa,0xa7,0x00,0xac,0xaa,0xa9,0x00,0xae,0xac,0xaa,0x00,0xaf,0xad,0xab,0x00,\n\t0xb0,0xae,0xad,0x00,0xb1,0xb0,0xad,0x00,0xb3,0xb0,0xaf,0x00,0xb4,0xb2,0xb0,0x00,0xb5,0xb3,0xb1,0x00,0xb5,0xb4,0xb1,0x00,0xb7,0xb5,0xb3,0x00,0xb8,0xb5,0xb3,0x00,\n\t0xba,0xb7,0xb5,0x00,0xbb,0xb8,0xb6,0x00,0xbc,0xba,0xb7,0x00,0xbe,0xba,0xb9,0x00,0xbe,0xbc,0xba,0x00,0xbf,0xbc,0xbb,0x00,0xc1,0xbe,0xbc,0x00,0xc1,0xbf,0xbd,0x00,\n\t0xc3,0xc0,0xbe,0x00,0xc4,0xc1,0xbf,0x00,0xc5,0xc2,0xc1,0x00,0xc6,0xc3,0xc2,0x00,0xc7,0xc4,0xc3,0x00,0xc8,0xc6,0xc4,0x00,0xc9,0xc7,0xc5,0x00,0xcb,0xc8,0xc6,0x00,\n\t0xcc,0xc9,0xc7,0x00,0xcd,0xca,0xc8,0x00,0xce,0xcb,0xc9,0x00,0xcf,0xcc,0xca,0x00,0xd0,0xce,0xcc,0x00,0xd2,0xce,0xcc,0x00,0xd3,0xd0,0xce,0x00,0xd4,0xd1,0xcf,0x00,\n\t0xd5,0xd2,0xd0,0x00,0xd6,0xd3,0xd1,0x00,0xd7,0xd4,0xd2,0x00,0xd8,0xd6,0xd3,0x00,0xda,0xd6,0xd4,0x00,0xdb,0xd7,0xd5,0x00,0xdc,0xd9,0xd7,0x00,0xdd,0xd9,0xd8,0x00,\n\t0xde,0xdb,0xd8,0x00,0xdf,0xdc,0xda,0x00,0xe1,0xdd,0xdb,0x00,0xe2,0xde,0xdc,0x00,0xe3,0xdf,0xdd,0x00,0xe4,0xe0,0xde,0x00,0xe4,0xe1,0xdf,0x00,0xe6,0xe2,0xe0,0x00,\n\t0xe6,0xe4,0xe1,0x00,0xe8,0xe4,0xe2,0x00,0xe9,0xe5,0xe3,0x00,0xeb,0xe6,0xe4,0x00,0xec,0xe8,0xe5,0x00,0xec,0xe9,0xe6,0x00,0xee,0xea,0xe7,0x00,0xef,0xeb,0xe8,0x00,\n\t0xf0,0xec,0xe9,0x00,0xf1,0xee,0xea,0x00,0xf2,0xee,0xec,0x00,0xf3,0xef,0xed,0x00,0xf4,0xf0,0xed,0x00,0xf5,0xf2,0xee,0x00,0xf7,0xf3,0xf0,0x00,0xf9,0xf4,0xf3,0x00,\n\t0xfa,0xf5,0xf3,0x00,0xfb,0xf6,0xf4,0x00,0xfc,0xf7,0xf5,0x00,0xfd,0xf8,0xf6,0x00,0xfe,0xf9,0xf8,0x00,0xff,0xfb,0xf9,0x00,0xff,0xfc,0xf9,0x00,0xff,0xfd,0xfb,0x00,\n\t0xff,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x16,0x15,0x00,0x17,0x18,0x16,0x00,0x18,0x19,0x17,0x00,0x1a,0x1a,0x18,0x00,\n\t0x1b,0x1b,0x19,0x00,0x1c,0x1c,0x1b,0x00,0x1d,0x1d,0x1c,0x00,0x1e,0x1e,0x1d,0x00,0x1f,0x1f,0x1e,0x00,0x20,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,0x22,0x22,0x21,0x00,\n\t0x24,0x23,0x22,0x00,0x25,0x25,0x23,0x00,0x25,0x26,0x25,0x00,0x27,0x27,0x26,0x00,0x28,0x28,0x27,0x00,0x2a,0x2a,0x29,0x00,0x2a,0x2a,0x29,0x00,0x2c,0x2c,0x2b,0x00,\n\t0x2c,0x2c,0x2b,0x00,0x2e,0x2e,0x2d,0x00,0x2f,0x2f,0x2d,0x00,0x30,0x30,0x2f,0x00,0x32,0x32,0x30,0x00,0x33,0x33,0x32,0x00,0x34,0x33,0x33,0x00,0x35,0x35,0x33,0x00,\n\t0x37,0x36,0x36,0x00,0x38,0x37,0x36,0x00,0x39,0x38,0x37,0x00,0x3b,0x3a,0x38,0x00,0x3b,0x3b,0x39,0x00,0x3c,0x3b,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3f,0x3e,0x3d,0x00,\n\t0x40,0x3f,0x3e,0x00,0x41,0x40,0x3f,0x00,0x42,0x41,0x40,0x00,0x43,0x42,0x41,0x00,0x44,0x44,0x42,0x00,0x45,0x45,0x43,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x45,0x00,\n\t0x48,0x48,0x46,0x00,0x4a,0x49,0x47,0x00,0x4b,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4e,0x4e,0x4c,0x00,0x4f,0x4e,0x4d,0x00,0x50,0x50,0x4e,0x00,\n\t0x51,0x51,0x4f,0x00,0x52,0x52,0x50,0x00,0x53,0x53,0x51,0x00,0x55,0x54,0x53,0x00,0x56,0x55,0x54,0x00,0x57,0x56,0x55,0x00,0x58,0x58,0x56,0x00,0x5a,0x59,0x57,0x00,\n\t0x5b,0x5b,0x58,0x00,0x5d,0x5c,0x5a,0x00,0x5e,0x5e,0x5c,0x00,0x5f,0x5f,0x5d,0x00,0x61,0x60,0x5e,0x00,0x62,0x62,0x60,0x00,0x63,0x63,0x61,0x00,0x65,0x64,0x62,0x00,\n\t0x66,0x66,0x64,0x00,0x67,0x67,0x64,0x00,0x68,0x68,0x66,0x00,0x69,0x69,0x67,0x00,0x6b,0x6a,0x68,0x00,0x6c,0x6b,0x69,0x00,0x6c,0x6c,0x6a,0x00,0x6e,0x6d,0x6b,0x00,\n\t0x6f,0x6f,0x6c,0x00,0x70,0x70,0x6d,0x00,0x71,0x71,0x6e,0x00,0x72,0x72,0x70,0x00,0x73,0x73,0x71,0x00,0x74,0x74,0x72,0x00,0x75,0x75,0x73,0x00,0x76,0x77,0x74,0x00,\n\t0x78,0x77,0x75,0x00,0x79,0x78,0x76,0x00,0x7a,0x7a,0x77,0x00,0x7b,0x7b,0x78,0x00,0x7c,0x7c,0x7a,0x00,0x7d,0x7d,0x7b,0x00,0x7f,0x7e,0x7c,0x00,0x80,0x7f,0x7d,0x00,\n\t0x81,0x80,0x7e,0x00,0x82,0x81,0x7f,0x00,0x83,0x82,0x81,0x00,0x84,0x83,0x82,0x00,0x85,0x85,0x83,0x00,0x87,0x86,0x84,0x00,0x88,0x86,0x85,0x00,0x89,0x88,0x86,0x00,\n\t0x8a,0x89,0x87,0x00,0x8b,0x8a,0x88,0x00,0x8c,0x8b,0x89,0x00,0x8d,0x8c,0x8a,0x00,0x8f,0x8d,0x8c,0x00,0x90,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x92,0x91,0x8f,0x00,\n\t0x93,0x92,0x90,0x00,0x94,0x93,0x91,0x00,0x95,0x95,0x92,0x00,0x96,0x95,0x93,0x00,0x98,0x96,0x95,0x00,0x99,0x98,0x95,0x00,0x9a,0x99,0x97,0x00,0x9b,0x9a,0x98,0x00,\n\t0x9d,0x9b,0x99,0x00,0x9d,0x9c,0x9a,0x00,0x9f,0x9e,0x9b,0x00,0xa0,0x9f,0x9e,0x00,0xa1,0xa0,0x9f,0x00,0xa3,0xa1,0x9f,0x00,0xa4,0xa2,0xa0,0x00,0xa5,0xa3,0xa0,0x00,\n\t0xa7,0xa5,0xa2,0x00,0xa7,0xa5,0xa3,0x00,0xa9,0xa7,0xa4,0x00,0xaa,0xa8,0xa5,0x00,0xab,0xa9,0xa7,0x00,0xad,0xaa,0xa7,0x00,0xae,0xac,0xaa,0x00,0xaf,0xad,0xab,0x00,\n\t0xb0,0xae,0xad,0x00,0xb1,0xaf,0xad,0x00,0xb2,0xb0,0xae,0x00,0xb3,0xb1,0xaf,0x00,0xb5,0xb3,0xb1,0x00,0xb6,0xb3,0xb1,0x00,0xb7,0xb4,0xb2,0x00,0xb8,0xb5,0xb3,0x00,\n\t0xb9,0xb7,0xb5,0x00,0xba,0xb8,0xb6,0x00,0xbb,0xb9,0xb7,0x00,0xbc,0xba,0xb8,0x00,0xbe,0xbb,0xb9,0x00,0xbe,0xbc,0xbb,0x00,0xc0,0xbd,0xbc,0x00,0xc1,0xbf,0xbd,0x00,\n\t0xc2,0xc0,0xbe,0x00,0xc3,0xc1,0xbf,0x00,0xc5,0xc2,0xc0,0x00,0xc5,0xc3,0xc1,0x00,0xc7,0xc5,0xc2,0x00,0xc8,0xc5,0xc3,0x00,0xc9,0xc6,0xc5,0x00,0xca,0xc7,0xc6,0x00,\n\t0xcb,0xc9,0xc7,0x00,0xcc,0xca,0xc8,0x00,0xce,0xcb,0xc9,0x00,0xcf,0xcb,0xca,0x00,0xcf,0xcd,0xcb,0x00,0xd0,0xce,0xcc,0x00,0xd2,0xcf,0xcd,0x00,0xd3,0xd0,0xce,0x00,\n\t0xd4,0xd2,0xd0,0x00,0xd5,0xd2,0xd0,0x00,0xd7,0xd4,0xd2,0x00,0xd9,0xd5,0xd2,0x00,0xda,0xd6,0xd3,0x00,0xdb,0xd7,0xd4,0x00,0xdb,0xd8,0xd6,0x00,0xdc,0xd9,0xd7,0x00,\n\t0xde,0xdb,0xd8,0x00,0xdf,0xdb,0xd9,0x00,0xe0,0xdd,0xda,0x00,0xe1,0xdd,0xdb,0x00,0xe2,0xdf,0xdc,0x00,0xe3,0xdf,0xdd,0x00,0xe4,0xe1,0xdf,0x00,0xe5,0xe2,0xe0,0x00,\n\t0xe6,0xe3,0xe1,0x00,0xe7,0xe4,0xe1,0x00,0xe8,0xe5,0xe3,0x00,0xe9,0xe6,0xe3,0x00,0xeb,0xe8,0xe5,0x00,0xec,0xe8,0xe6,0x00,0xed,0xea,0xe7,0x00,0xee,0xeb,0xe7,0x00,\n\t0xef,0xec,0xe9,0x00,0xf0,0xec,0xea,0x00,0xf1,0xee,0xea,0x00,0xf3,0xef,0xec,0x00,0xf4,0xf0,0xed,0x00,0xf5,0xf2,0xee,0x00,0xf6,0xf2,0xef,0x00,0xf7,0xf3,0xf1,0x00,\n\t0xf8,0xf5,0xf2,0x00,0xfa,0xf6,0xf4,0x00,0xfb,0xf7,0xf5,0x00,0xfb,0xf8,0xf6,0x00,0xfd,0xf9,0xf7,0x00,0xfe,0xfb,0xf8,0x00,0xff,0xfb,0xf9,0x00,0xff,0xfc,0xfa,0x00,\n\t0xff,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x16,0x15,0x00,0x17,0x17,0x15,0x00,0x17,0x18,0x17,0x00,0x19,0x1a,0x18,0x00,\n\t0x1a,0x1a,0x19,0x00,0x1c,0x1c,0x1b,0x00,0x1d,0x1d,0x1b,0x00,0x1e,0x1e,0x1d,0x00,0x1f,0x1f,0x1e,0x00,0x20,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,0x22,0x22,0x21,0x00,\n\t0x23,0x23,0x22,0x00,0x24,0x24,0x23,0x00,0x25,0x25,0x24,0x00,0x27,0x27,0x26,0x00,0x28,0x28,0x27,0x00,0x2a,0x29,0x29,0x00,0x2a,0x2a,0x29,0x00,0x2c,0x2b,0x2b,0x00,\n\t0x2c,0x2c,0x2b,0x00,0x2e,0x2d,0x2d,0x00,0x2e,0x2e,0x2d,0x00,0x2f,0x30,0x2f,0x00,0x32,0x31,0x30,0x00,0x33,0x32,0x32,0x00,0x33,0x33,0x32,0x00,0x35,0x34,0x33,0x00,\n\t0x37,0x36,0x35,0x00,0x37,0x37,0x36,0x00,0x38,0x38,0x37,0x00,0x3b,0x39,0x38,0x00,0x3b,0x3a,0x39,0x00,0x3c,0x3b,0x3a,0x00,0x3d,0x3c,0x3b,0x00,0x3f,0x3d,0x3d,0x00,\n\t0x40,0x3f,0x3d,0x00,0x41,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x43,0x42,0x41,0x00,0x44,0x44,0x42,0x00,0x45,0x44,0x43,0x00,0x46,0x46,0x44,0x00,0x47,0x46,0x45,0x00,\n\t0x48,0x47,0x46,0x00,0x49,0x49,0x47,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4e,0x4d,0x4c,0x00,0x4f,0x4e,0x4d,0x00,0x50,0x50,0x4e,0x00,\n\t0x51,0x50,0x4f,0x00,0x52,0x51,0x50,0x00,0x53,0x53,0x51,0x00,0x54,0x54,0x52,0x00,0x55,0x55,0x53,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x59,0x59,0x57,0x00,\n\t0x5b,0x5a,0x59,0x00,0x5c,0x5c,0x5a,0x00,0x5e,0x5d,0x5b,0x00,0x5f,0x5f,0x5c,0x00,0x60,0x60,0x5e,0x00,0x62,0x62,0x5f,0x00,0x63,0x63,0x61,0x00,0x64,0x64,0x62,0x00,\n\t0x66,0x66,0x64,0x00,0x67,0x66,0x64,0x00,0x68,0x68,0x65,0x00,0x69,0x68,0x66,0x00,0x6a,0x6a,0x67,0x00,0x6b,0x6b,0x68,0x00,0x6c,0x6c,0x69,0x00,0x6d,0x6d,0x6b,0x00,\n\t0x6f,0x6e,0x6c,0x00,0x6f,0x6f,0x6d,0x00,0x71,0x71,0x6e,0x00,0x72,0x71,0x6f,0x00,0x73,0x73,0x70,0x00,0x74,0x74,0x71,0x00,0x75,0x75,0x72,0x00,0x76,0x76,0x74,0x00,\n\t0x77,0x77,0x75,0x00,0x78,0x78,0x76,0x00,0x7a,0x7a,0x77,0x00,0x7b,0x7a,0x78,0x00,0x7c,0x7b,0x79,0x00,0x7d,0x7c,0x7a,0x00,0x7e,0x7e,0x7c,0x00,0x7f,0x7f,0x7c,0x00,\n\t0x80,0x80,0x7e,0x00,0x81,0x80,0x7e,0x00,0x82,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x85,0x83,0x00,0x86,0x86,0x84,0x00,0x87,0x87,0x86,0x00,\n\t0x89,0x88,0x87,0x00,0x89,0x8a,0x88,0x00,0x8b,0x8a,0x89,0x00,0x8c,0x8b,0x8a,0x00,0x8e,0x8d,0x8b,0x00,0x8f,0x8e,0x8c,0x00,0x90,0x8f,0x8d,0x00,0x91,0x90,0x8e,0x00,\n\t0x93,0x92,0x8f,0x00,0x94,0x93,0x90,0x00,0x95,0x94,0x92,0x00,0x96,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x98,0x97,0x95,0x00,0x9a,0x98,0x96,0x00,0x9b,0x99,0x97,0x00,\n\t0x9c,0x9b,0x99,0x00,0x9e,0x9c,0x99,0x00,0x9f,0x9d,0x9b,0x00,0xa0,0x9e,0x9c,0x00,0xa1,0x9f,0x9d,0x00,0xa1,0xa0,0x9e,0x00,0xa3,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,\n\t0xa5,0xa3,0xa3,0x00,0xa6,0xa5,0xa4,0x00,0xa8,0xa6,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xaa,0xa8,0xa6,0x00,0xab,0xa9,0xa7,0x00,0xad,0xab,0xa9,0x00,0xae,0xac,0xaa,0x00,\n\t0xb0,0xad,0xab,0x00,0xb0,0xae,0xac,0x00,0xb2,0xb0,0xae,0x00,0xb3,0xb1,0xae,0x00,0xb4,0xb2,0xb0,0x00,0xb5,0xb2,0xb0,0x00,0xb5,0xb4,0xb1,0x00,0xb6,0xb5,0xb2,0x00,\n\t0xb9,0xb6,0xb4,0x00,0xb9,0xb7,0xb5,0x00,0xbb,0xb8,0xb7,0x00,0xbb,0xb9,0xb8,0x00,0xbc,0xbb,0xb9,0x00,0xbd,0xbc,0xba,0x00,0xbf,0xbd,0xbb,0x00,0xc0,0xbd,0xbd,0x00,\n\t0xc1,0xbf,0xbe,0x00,0xc3,0xc0,0xbe,0x00,0xc4,0xc1,0xbf,0x00,0xc5,0xc2,0xc0,0x00,0xc6,0xc3,0xc1,0x00,0xc7,0xc5,0xc2,0x00,0xc8,0xc6,0xc4,0x00,0xc9,0xc7,0xc5,0x00,\n\t0xcb,0xc8,0xc6,0x00,0xcc,0xc9,0xc7,0x00,0xcd,0xca,0xc9,0x00,0xce,0xcb,0xc9,0x00,0xcf,0xcc,0xca,0x00,0xd0,0xce,0xcb,0x00,0xd2,0xcf,0xcd,0x00,0xd2,0xd0,0xce,0x00,\n\t0xd4,0xd1,0xcf,0x00,0xd5,0xd2,0xcf,0x00,0xd6,0xd3,0xd1,0x00,0xd8,0xd4,0xd2,0x00,0xd9,0xd6,0xd3,0x00,0xda,0xd6,0xd4,0x00,0xdb,0xd7,0xd5,0x00,0xdc,0xd8,0xd6,0x00,\n\t0xdd,0xda,0xd7,0x00,0xde,0xdb,0xd8,0x00,0xdf,0xdc,0xd9,0x00,0xe0,0xdd,0xdb,0x00,0xe1,0xde,0xdc,0x00,0xe2,0xdf,0xdc,0x00,0xe4,0xe0,0xde,0x00,0xe4,0xe1,0xde,0x00,\n\t0xe5,0xe3,0xe0,0x00,0xe6,0xe3,0xe0,0x00,0xe7,0xe5,0xe2,0x00,0xe9,0xe5,0xe3,0x00,0xea,0xe7,0xe4,0x00,0xeb,0xe7,0xe5,0x00,0xed,0xe8,0xe7,0x00,0xee,0xea,0xe7,0x00,\n\t0xef,0xeb,0xe9,0x00,0xf1,0xec,0xea,0x00,0xf2,0xed,0xeb,0x00,0xf3,0xee,0xec,0x00,0xf4,0xef,0xed,0x00,0xf5,0xf1,0xee,0x00,0xf6,0xf2,0xf0,0x00,0xf7,0xf3,0xf1,0x00,\n\t0xf9,0xf4,0xf2,0x00,0xf9,0xf6,0xf3,0x00,0xfb,0xf7,0xf4,0x00,0xfc,0xf8,0xf5,0x00,0xfd,0xf9,0xf6,0x00,0xff,0xfa,0xf7,0x00,0xff,0xfb,0xf8,0x00,0xff,0xfc,0xfa,0x00,\n\t0xff,0xfd,0xfb,0x00,0xff,0xfd,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x16,0x15,0x00,0x16,0x17,0x15,0x00,0x17,0x18,0x17,0x00,0x1a,0x19,0x18,0x00,\n\t0x1b,0x1a,0x19,0x00,0x1c,0x1b,0x1a,0x00,0x1d,0x1c,0x1b,0x00,0x1e,0x1d,0x1d,0x00,0x1f,0x1e,0x1e,0x00,0x20,0x1f,0x1f,0x00,0x21,0x20,0x20,0x00,0x22,0x22,0x20,0x00,\n\t0x23,0x23,0x22,0x00,0x24,0x24,0x23,0x00,0x25,0x25,0x24,0x00,0x27,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x29,0x29,0x28,0x00,0x2a,0x2a,0x29,0x00,0x2c,0x2b,0x2a,0x00,\n\t0x2c,0x2c,0x2b,0x00,0x2e,0x2d,0x2d,0x00,0x2e,0x2e,0x2d,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x31,0x30,0x00,0x33,0x32,0x31,0x00,0x33,0x33,0x32,0x00,0x34,0x34,0x33,0x00,\n\t0x37,0x36,0x34,0x00,0x37,0x37,0x36,0x00,0x38,0x37,0x36,0x00,0x3a,0x39,0x38,0x00,0x3b,0x3a,0x39,0x00,0x3c,0x3b,0x3a,0x00,0x3d,0x3c,0x3b,0x00,0x3e,0x3d,0x3c,0x00,\n\t0x3f,0x3f,0x3d,0x00,0x40,0x3f,0x3e,0x00,0x41,0x41,0x3f,0x00,0x42,0x42,0x41,0x00,0x44,0x43,0x42,0x00,0x45,0x44,0x43,0x00,0x46,0x45,0x44,0x00,0x47,0x46,0x45,0x00,\n\t0x48,0x47,0x46,0x00,0x49,0x48,0x47,0x00,0x4a,0x4a,0x48,0x00,0x4b,0x4b,0x49,0x00,0x4c,0x4c,0x4a,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4c,0x00,0x4f,0x4f,0x4e,0x00,\n\t0x51,0x50,0x4f,0x00,0x52,0x51,0x50,0x00,0x53,0x52,0x51,0x00,0x54,0x54,0x52,0x00,0x55,0x55,0x53,0x00,0x56,0x56,0x54,0x00,0x58,0x57,0x55,0x00,0x59,0x59,0x56,0x00,\n\t0x5a,0x5a,0x58,0x00,0x5b,0x5c,0x59,0x00,0x5d,0x5d,0x5b,0x00,0x5f,0x5e,0x5c,0x00,0x60,0x60,0x5e,0x00,0x61,0x61,0x5f,0x00,0x63,0x63,0x60,0x00,0x64,0x64,0x62,0x00,\n\t0x65,0x65,0x63,0x00,0x66,0x66,0x64,0x00,0x67,0x67,0x65,0x00,0x69,0x68,0x66,0x00,0x6a,0x69,0x67,0x00,0x6b,0x6b,0x68,0x00,0x6c,0x6b,0x69,0x00,0x6d,0x6d,0x6a,0x00,\n\t0x6e,0x6e,0x6c,0x00,0x6f,0x6f,0x6d,0x00,0x70,0x70,0x6e,0x00,0x71,0x71,0x6f,0x00,0x73,0x72,0x70,0x00,0x74,0x73,0x71,0x00,0x75,0x74,0x72,0x00,0x76,0x76,0x73,0x00,\n\t0x77,0x77,0x75,0x00,0x78,0x78,0x75,0x00,0x79,0x79,0x77,0x00,0x7a,0x7a,0x78,0x00,0x7c,0x7b,0x79,0x00,0x7d,0x7c,0x7a,0x00,0x7e,0x7d,0x7b,0x00,0x7f,0x7e,0x7c,0x00,\n\t0x80,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x7f,0x00,0x83,0x82,0x80,0x00,0x84,0x84,0x81,0x00,0x85,0x84,0x82,0x00,0x86,0x86,0x84,0x00,0x87,0x87,0x85,0x00,\n\t0x88,0x88,0x86,0x00,0x89,0x89,0x86,0x00,0x8b,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8e,0x8d,0x8a,0x00,0x8f,0x8e,0x8b,0x00,0x90,0x8f,0x8c,0x00,0x91,0x90,0x8e,0x00,\n\t0x93,0x91,0x90,0x00,0x94,0x93,0x91,0x00,0x95,0x94,0x92,0x00,0x96,0x95,0x93,0x00,0x96,0x95,0x94,0x00,0x98,0x97,0x95,0x00,0x99,0x98,0x96,0x00,0x9a,0x99,0x97,0x00,\n\t0x9c,0x9b,0x98,0x00,0x9d,0x9b,0x99,0x00,0x9f,0x9d,0x9a,0x00,0xa0,0x9e,0x9c,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa0,0x9e,0x00,0xa2,0xa2,0x9f,0x00,0xa3,0xa2,0xa0,0x00,\n\t0xa5,0xa4,0xa1,0x00,0xa6,0xa5,0xa2,0x00,0xa7,0xa6,0xa3,0x00,0xa8,0xa7,0xa4,0x00,0xaa,0xa8,0xa6,0x00,0xab,0xa9,0xa7,0x00,0xad,0xab,0xa9,0x00,0xae,0xac,0xaa,0x00,\n\t0xaf,0xad,0xab,0x00,0xb0,0xae,0xac,0x00,0xb1,0xaf,0xad,0x00,0xb2,0xb0,0xae,0x00,0xb4,0xb1,0xaf,0x00,0xb4,0xb2,0xb0,0x00,0xb5,0xb3,0xb1,0x00,0xb6,0xb5,0xb2,0x00,\n\t0xb8,0xb6,0xb4,0x00,0xb9,0xb7,0xb5,0x00,0xba,0xb9,0xb6,0x00,0xbb,0xb9,0xb7,0x00,0xbd,0xba,0xb8,0x00,0xbd,0xbb,0xb9,0x00,0xbf,0xbc,0xba,0x00,0xc0,0xbe,0xbc,0x00,\n\t0xc1,0xbf,0xbd,0x00,0xc2,0xc0,0xbe,0x00,0xc3,0xc1,0xbf,0x00,0xc4,0xc2,0xc0,0x00,0xc6,0xc4,0xc1,0x00,0xc7,0xc5,0xc2,0x00,0xc8,0xc6,0xc3,0x00,0xc9,0xc7,0xc5,0x00,\n\t0xcb,0xc8,0xc6,0x00,0xcb,0xc9,0xc7,0x00,0xcd,0xca,0xc8,0x00,0xcd,0xcb,0xc9,0x00,0xcf,0xcc,0xca,0x00,0xd0,0xcd,0xcb,0x00,0xd1,0xcf,0xcc,0x00,0xd2,0xd0,0xcd,0x00,\n\t0xd4,0xd1,0xcf,0x00,0xd4,0xd2,0xd0,0x00,0xd6,0xd3,0xd1,0x00,0xd7,0xd5,0xd1,0x00,0xd9,0xd6,0xd3,0x00,0xd9,0xd7,0xd3,0x00,0xdb,0xd7,0xd5,0x00,0xdb,0xd8,0xd6,0x00,\n\t0xdd,0xda,0xd7,0x00,0xde,0xda,0xd8,0x00,0xdf,0xdc,0xd9,0x00,0xe0,0xdd,0xda,0x00,0xe1,0xde,0xdb,0x00,0xe2,0xe0,0xdc,0x00,0xe4,0xe0,0xde,0x00,0xe4,0xe1,0xde,0x00,\n\t0xe5,0xe3,0xe0,0x00,0xe6,0xe4,0xe0,0x00,0xe7,0xe5,0xe2,0x00,0xe9,0xe5,0xe3,0x00,0xe9,0xe7,0xe4,0x00,0xeb,0xe7,0xe5,0x00,0xec,0xe9,0xe6,0x00,0xed,0xea,0xe6,0x00,\n\t0xee,0xeb,0xe8,0x00,0xef,0xec,0xe9,0x00,0xf1,0xed,0xea,0x00,0xf2,0xee,0xeb,0x00,0xf3,0xef,0xec,0x00,0xf4,0xf1,0xed,0x00,0xf5,0xf2,0xef,0x00,0xf6,0xf3,0xef,0x00,\n\t0xf7,0xf4,0xf1,0x00,0xf8,0xf5,0xf2,0x00,0xfa,0xf6,0xf3,0x00,0xfb,0xf7,0xf3,0x00,0xfc,0xf9,0xf5,0x00,0xfd,0xfa,0xf6,0x00,0xff,0xfb,0xf8,0x00,0xff,0xfc,0xf8,0x00,\n\t0xff,0xfd,0xf9,0x00,0xff,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x18,0x16,0x00,0x19,0x19,0x18,0x00,\n\t0x1a,0x1a,0x19,0x00,0x1b,0x1b,0x1a,0x00,0x1c,0x1c,0x1b,0x00,0x1d,0x1d,0x1c,0x00,0x1e,0x1e,0x1e,0x00,0x20,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,\n\t0x23,0x22,0x22,0x00,0x24,0x24,0x23,0x00,0x25,0x25,0x24,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x29,0x29,0x28,0x00,0x29,0x29,0x29,0x00,0x2b,0x2b,0x2a,0x00,\n\t0x2b,0x2b,0x2b,0x00,0x2d,0x2d,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x30,0x2f,0x00,0x32,0x32,0x31,0x00,0x33,0x32,0x32,0x00,0x34,0x34,0x33,0x00,\n\t0x36,0x35,0x34,0x00,0x37,0x36,0x36,0x00,0x38,0x37,0x37,0x00,0x3a,0x39,0x38,0x00,0x3b,0x3a,0x39,0x00,0x3c,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,0x3e,0x3d,0x3c,0x00,\n\t0x3f,0x3f,0x3d,0x00,0x40,0x3f,0x3e,0x00,0x41,0x40,0x3f,0x00,0x42,0x41,0x40,0x00,0x44,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x46,0x45,0x44,0x00,0x46,0x46,0x45,0x00,\n\t0x47,0x47,0x46,0x00,0x49,0x48,0x47,0x00,0x4a,0x4a,0x48,0x00,0x4b,0x4a,0x49,0x00,0x4c,0x4b,0x4a,0x00,0x4d,0x4d,0x4b,0x00,0x4e,0x4e,0x4c,0x00,0x4f,0x4f,0x4d,0x00,\n\t0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x54,0x53,0x52,0x00,0x55,0x55,0x53,0x00,0x56,0x56,0x54,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,\n\t0x5a,0x5a,0x57,0x00,0x5b,0x5b,0x59,0x00,0x5d,0x5d,0x5b,0x00,0x5e,0x5e,0x5c,0x00,0x60,0x5f,0x5e,0x00,0x61,0x61,0x5f,0x00,0x63,0x63,0x60,0x00,0x64,0x64,0x61,0x00,\n\t0x66,0x65,0x63,0x00,0x66,0x66,0x63,0x00,0x67,0x67,0x65,0x00,0x68,0x68,0x66,0x00,0x69,0x69,0x67,0x00,0x6a,0x6a,0x68,0x00,0x6c,0x6c,0x69,0x00,0x6d,0x6c,0x6a,0x00,\n\t0x6e,0x6e,0x6b,0x00,0x6f,0x6f,0x6c,0x00,0x70,0x70,0x6d,0x00,0x71,0x71,0x6f,0x00,0x72,0x72,0x70,0x00,0x73,0x73,0x71,0x00,0x74,0x74,0x72,0x00,0x76,0x75,0x73,0x00,\n\t0x76,0x76,0x74,0x00,0x78,0x77,0x75,0x00,0x79,0x79,0x77,0x00,0x7a,0x7a,0x78,0x00,0x7b,0x7b,0x79,0x00,0x7c,0x7c,0x7a,0x00,0x7e,0x7d,0x7b,0x00,0x7e,0x7e,0x7c,0x00,\n\t0x80,0x7f,0x7d,0x00,0x81,0x80,0x7e,0x00,0x82,0x81,0x80,0x00,0x83,0x82,0x81,0x00,0x85,0x84,0x82,0x00,0x85,0x84,0x83,0x00,0x87,0x85,0x84,0x00,0x88,0x87,0x85,0x00,\n\t0x89,0x88,0x86,0x00,0x8a,0x89,0x87,0x00,0x8b,0x8a,0x88,0x00,0x8c,0x8b,0x89,0x00,0x8d,0x8c,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x90,0x8f,0x8d,0x00,0x91,0x90,0x8e,0x00,\n\t0x92,0x91,0x8f,0x00,0x93,0x92,0x90,0x00,0x94,0x94,0x91,0x00,0x95,0x95,0x92,0x00,0x97,0x96,0x94,0x00,0x98,0x97,0x94,0x00,0x99,0x98,0x96,0x00,0x9a,0x99,0x97,0x00,\n\t0x9b,0x9b,0x98,0x00,0x9c,0x9b,0x99,0x00,0x9e,0x9d,0x9a,0x00,0x9e,0x9e,0x9c,0x00,0xa0,0xa0,0x9d,0x00,0xa2,0xa0,0x9e,0x00,0xa2,0xa1,0xa0,0x00,0xa4,0xa2,0xa1,0x00,\n\t0xa5,0xa3,0xa2,0x00,0xa6,0xa4,0xa3,0x00,0xa8,0xa6,0xa4,0x00,0xa9,0xa7,0xa5,0x00,0xaa,0xa8,0xa7,0x00,0xab,0xa9,0xa8,0x00,0xac,0xab,0xa9,0x00,0xad,0xac,0xaa,0x00,\n\t0xaf,0xad,0xab,0x00,0xb0,0xae,0xac,0x00,0xb1,0xaf,0xad,0x00,0xb2,0xb0,0xae,0x00,0xb3,0xb2,0xb0,0x00,0xb5,0xb2,0xb1,0x00,0xb6,0xb3,0xb2,0x00,0xb7,0xb4,0xb3,0x00,\n\t0xb8,0xb6,0xb4,0x00,0xb9,0xb7,0xb5,0x00,0xba,0xb8,0xb6,0x00,0xba,0xb9,0xb7,0x00,0xbc,0xba,0xb8,0x00,0xbd,0xbb,0xb9,0x00,0xbf,0xbc,0xba,0x00,0xc0,0xbe,0xbb,0x00,\n\t0xc1,0xbf,0xbc,0x00,0xc2,0xc0,0xbd,0x00,0xc3,0xc1,0xbf,0x00,0xc4,0xc2,0xc0,0x00,0xc5,0xc4,0xc2,0x00,0xc7,0xc4,0xc2,0x00,0xc8,0xc6,0xc4,0x00,0xc9,0xc6,0xc4,0x00,\n\t0xca,0xc8,0xc6,0x00,0xcb,0xc9,0xc6,0x00,0xcc,0xca,0xc8,0x00,0xcd,0xcb,0xc9,0x00,0xcf,0xcc,0xca,0x00,0xd0,0xce,0xcb,0x00,0xd1,0xcf,0xcd,0x00,0xd2,0xcf,0xcd,0x00,\n\t0xd3,0xd0,0xcf,0x00,0xd4,0xd2,0xd0,0x00,0xd6,0xd3,0xd0,0x00,0xd7,0xd4,0xd2,0x00,0xd9,0xd5,0xd3,0x00,0xd9,0xd6,0xd4,0x00,0xda,0xd7,0xd5,0x00,0xdb,0xd8,0xd6,0x00,\n\t0xdc,0xd9,0xd7,0x00,0xdd,0xda,0xd8,0x00,0xdf,0xdc,0xd9,0x00,0xe0,0xdc,0xda,0x00,0xe1,0xde,0xdb,0x00,0xe2,0xde,0xdc,0x00,0xe3,0xe0,0xde,0x00,0xe4,0xe0,0xde,0x00,\n\t0xe5,0xe2,0xe0,0x00,0xe6,0xe3,0xe1,0x00,0xe7,0xe4,0xe2,0x00,0xe8,0xe5,0xe3,0x00,0xea,0xe6,0xe4,0x00,0xea,0xe7,0xe4,0x00,0xec,0xe9,0xe6,0x00,0xed,0xea,0xe7,0x00,\n\t0xee,0xeb,0xe8,0x00,0xef,0xeb,0xe9,0x00,0xf0,0xed,0xea,0x00,0xf1,0xee,0xeb,0x00,0xf2,0xef,0xec,0x00,0xf4,0xf1,0xed,0x00,0xf5,0xf1,0xef,0x00,0xf6,0xf3,0xef,0x00,\n\t0xf7,0xf4,0xf0,0x00,0xf9,0xf5,0xf1,0x00,0xf9,0xf6,0xf3,0x00,0xfb,0xf7,0xf4,0x00,0xfb,0xf8,0xf5,0x00,0xfd,0xf9,0xf6,0x00,0xfe,0xfa,0xf7,0x00,0xff,0xfb,0xf8,0x00,\n\t0xff,0xfd,0xfa,0x00,0xff,0xfe,0xfa,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x16,0x00,0x18,0x18,0x18,0x00,\n\t0x1a,0x1a,0x19,0x00,0x1b,0x1b,0x1a,0x00,0x1c,0x1c,0x1b,0x00,0x1d,0x1d,0x1c,0x00,0x1e,0x1e,0x1d,0x00,0x20,0x1f,0x1e,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x20,0x00,\n\t0x22,0x22,0x22,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x29,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2b,0x2a,0x00,\n\t0x2c,0x2b,0x2b,0x00,0x2d,0x2d,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x2f,0x00,0x31,0x31,0x30,0x00,0x32,0x32,0x32,0x00,0x34,0x33,0x33,0x00,\n\t0x35,0x35,0x34,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x36,0x00,0x39,0x38,0x38,0x00,0x3a,0x39,0x39,0x00,0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,\n\t0x3f,0x3e,0x3d,0x00,0x40,0x3f,0x3e,0x00,0x41,0x40,0x3f,0x00,0x42,0x41,0x40,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,\n\t0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x4a,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4d,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4f,0x4f,0x4e,0x00,\n\t0x50,0x50,0x4f,0x00,0x51,0x51,0x4f,0x00,0x52,0x52,0x50,0x00,0x53,0x53,0x52,0x00,0x55,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x57,0x57,0x55,0x00,0x58,0x58,0x56,0x00,\n\t0x59,0x59,0x57,0x00,0x5b,0x5b,0x58,0x00,0x5c,0x5c,0x5a,0x00,0x5e,0x5e,0x5c,0x00,0x5f,0x5f,0x5d,0x00,0x61,0x61,0x5f,0x00,0x62,0x62,0x60,0x00,0x63,0x63,0x61,0x00,\n\t0x64,0x65,0x62,0x00,0x65,0x66,0x63,0x00,0x67,0x67,0x65,0x00,0x68,0x68,0x66,0x00,0x69,0x69,0x67,0x00,0x6a,0x6a,0x68,0x00,0x6b,0x6b,0x69,0x00,0x6c,0x6c,0x6a,0x00,\n\t0x6d,0x6e,0x6b,0x00,0x6e,0x6e,0x6c,0x00,0x70,0x6f,0x6d,0x00,0x71,0x71,0x6e,0x00,0x72,0x72,0x70,0x00,0x73,0x72,0x71,0x00,0x74,0x74,0x72,0x00,0x75,0x75,0x73,0x00,\n\t0x76,0x77,0x74,0x00,0x77,0x77,0x75,0x00,0x79,0x79,0x76,0x00,0x7a,0x79,0x77,0x00,0x7b,0x7b,0x78,0x00,0x7c,0x7b,0x79,0x00,0x7d,0x7d,0x7b,0x00,0x7e,0x7e,0x7c,0x00,\n\t0x7f,0x7f,0x7d,0x00,0x80,0x80,0x7e,0x00,0x82,0x81,0x7f,0x00,0x83,0x82,0x80,0x00,0x84,0x83,0x82,0x00,0x85,0x84,0x82,0x00,0x86,0x85,0x83,0x00,0x87,0x87,0x85,0x00,\n\t0x89,0x88,0x86,0x00,0x89,0x88,0x87,0x00,0x8b,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8d,0x8c,0x8a,0x00,0x8e,0x8d,0x8c,0x00,0x8f,0x8e,0x8c,0x00,0x90,0x8f,0x8e,0x00,\n\t0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x90,0x00,0x94,0x94,0x92,0x00,0x96,0x95,0x94,0x00,0x97,0x96,0x94,0x00,0x98,0x97,0x95,0x00,0x99,0x99,0x96,0x00,\n\t0x9b,0x9a,0x98,0x00,0x9c,0x9b,0x99,0x00,0x9d,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9d,0x00,0xa1,0x9f,0x9e,0x00,0xa2,0xa1,0x9e,0x00,0xa3,0xa2,0xa0,0x00,\n\t0xa5,0xa3,0xa1,0x00,0xa6,0xa4,0xa3,0x00,0xa7,0xa5,0xa4,0x00,0xa8,0xa7,0xa5,0x00,0xaa,0xa8,0xa7,0x00,0xab,0xa9,0xa7,0x00,0xac,0xaa,0xa8,0x00,0xad,0xab,0xa9,0x00,\n\t0xae,0xad,0xab,0x00,0xaf,0xad,0xac,0x00,0xb0,0xaf,0xad,0x00,0xb1,0xaf,0xae,0x00,0xb2,0xb1,0xaf,0x00,0xb3,0xb2,0xb0,0x00,0xb4,0xb3,0xb2,0x00,0xb5,0xb4,0xb2,0x00,\n\t0xb7,0xb6,0xb4,0x00,0xb8,0xb6,0xb5,0x00,0xb9,0xb8,0xb6,0x00,0xba,0xb9,0xb7,0x00,0xbc,0xba,0xb8,0x00,0xbd,0xbb,0xb9,0x00,0xbe,0xbc,0xba,0x00,0xbf,0xbd,0xbb,0x00,\n\t0xc0,0xbe,0xbb,0x00,0xc1,0xbf,0xbd,0x00,0xc2,0xc1,0xbf,0x00,0xc3,0xc2,0xbf,0x00,0xc5,0xc2,0xc1,0x00,0xc5,0xc4,0xc2,0x00,0xc7,0xc5,0xc3,0x00,0xc8,0xc6,0xc4,0x00,\n\t0xc9,0xc7,0xc6,0x00,0xca,0xc8,0xc6,0x00,0xcb,0xca,0xc7,0x00,0xcc,0xca,0xc8,0x00,0xce,0xcc,0xc9,0x00,0xcf,0xcd,0xcb,0x00,0xd0,0xce,0xcc,0x00,0xd1,0xcf,0xcd,0x00,\n\t0xd2,0xd0,0xce,0x00,0xd4,0xd1,0xcf,0x00,0xd4,0xd2,0xd0,0x00,0xd5,0xd4,0xd2,0x00,0xd7,0xd5,0xd3,0x00,0xd8,0xd6,0xd4,0x00,0xda,0xd7,0xd4,0x00,0xda,0xd8,0xd5,0x00,\n\t0xdc,0xd9,0xd6,0x00,0xdd,0xda,0xd7,0x00,0xde,0xdb,0xd8,0x00,0xdf,0xdc,0xda,0x00,0xe0,0xde,0xdb,0x00,0xe1,0xdf,0xdb,0x00,0xe2,0xdf,0xdd,0x00,0xe3,0xe0,0xdd,0x00,\n\t0xe5,0xe2,0xdf,0x00,0xe6,0xe3,0xe0,0x00,0xe7,0xe4,0xe2,0x00,0xe8,0xe5,0xe2,0x00,0xea,0xe6,0xe4,0x00,0xea,0xe7,0xe4,0x00,0xec,0xe9,0xe5,0x00,0xed,0xe9,0xe6,0x00,\n\t0xee,0xea,0xe7,0x00,0xef,0xeb,0xe8,0x00,0xf0,0xec,0xea,0x00,0xf2,0xee,0xeb,0x00,0xf3,0xef,0xec,0x00,0xf4,0xf0,0xed,0x00,0xf5,0xf1,0xee,0x00,0xf6,0xf2,0xef,0x00,\n\t0xf7,0xf3,0xf0,0x00,0xf9,0xf5,0xf1,0x00,0xf9,0xf6,0xf2,0x00,0xfa,0xf7,0xf3,0x00,0xfc,0xf8,0xf4,0x00,0xfd,0xf9,0xf6,0x00,0xfe,0xfa,0xf7,0x00,0xff,0xfb,0xf8,0x00,\n\t0xff,0xfc,0xf9,0x00,0xff,0xfd,0xfa,0x00,0xff,0xff,0xfa,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x15,0x14,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x16,0x00,0x19,0x18,0x18,0x00,\n\t0x1a,0x19,0x19,0x00,0x1b,0x1b,0x1a,0x00,0x1c,0x1c,0x1b,0x00,0x1d,0x1d,0x1c,0x00,0x1e,0x1e,0x1d,0x00,0x1f,0x1f,0x1e,0x00,0x20,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,\n\t0x22,0x22,0x21,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x26,0x26,0x26,0x00,0x26,0x26,0x26,0x00,0x29,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2b,0x2b,0x2a,0x00,\n\t0x2b,0x2b,0x2b,0x00,0x2c,0x2d,0x2c,0x00,0x2c,0x2d,0x2d,0x00,0x2f,0x2f,0x2e,0x00,0x30,0x30,0x2f,0x00,0x32,0x31,0x30,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,\n\t0x36,0x35,0x34,0x00,0x36,0x36,0x35,0x00,0x37,0x37,0x36,0x00,0x39,0x38,0x38,0x00,0x3a,0x39,0x38,0x00,0x3b,0x3a,0x3a,0x00,0x3c,0x3b,0x3b,0x00,0x3d,0x3c,0x3c,0x00,\n\t0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x43,0x42,0x41,0x00,0x44,0x43,0x42,0x00,0x45,0x45,0x44,0x00,0x46,0x45,0x45,0x00,\n\t0x47,0x46,0x45,0x00,0x48,0x47,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,\n\t0x50,0x50,0x4e,0x00,0x50,0x50,0x4f,0x00,0x52,0x52,0x50,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x58,0x56,0x00,\n\t0x59,0x59,0x57,0x00,0x5a,0x5a,0x58,0x00,0x5c,0x5c,0x5a,0x00,0x5d,0x5d,0x5c,0x00,0x5f,0x5f,0x5d,0x00,0x60,0x60,0x5e,0x00,0x61,0x62,0x5f,0x00,0x63,0x63,0x61,0x00,\n\t0x64,0x64,0x63,0x00,0x65,0x65,0x63,0x00,0x66,0x66,0x64,0x00,0x67,0x67,0x65,0x00,0x68,0x69,0x66,0x00,0x69,0x6a,0x68,0x00,0x6b,0x6b,0x69,0x00,0x6c,0x6c,0x6a,0x00,\n\t0x6d,0x6d,0x6b,0x00,0x6e,0x6e,0x6c,0x00,0x6f,0x6f,0x6d,0x00,0x70,0x70,0x6e,0x00,0x71,0x71,0x6f,0x00,0x72,0x72,0x70,0x00,0x73,0x73,0x71,0x00,0x74,0x75,0x73,0x00,\n\t0x76,0x76,0x74,0x00,0x77,0x77,0x75,0x00,0x78,0x78,0x76,0x00,0x79,0x79,0x77,0x00,0x7a,0x7a,0x78,0x00,0x7b,0x7b,0x79,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7e,0x7b,0x00,\n\t0x7f,0x7f,0x7d,0x00,0x80,0x80,0x7d,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x80,0x00,0x83,0x84,0x82,0x00,0x85,0x85,0x83,0x00,0x86,0x86,0x84,0x00,\n\t0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x90,0x8f,0x8d,0x00,\n\t0x91,0x91,0x8e,0x00,0x93,0x92,0x8f,0x00,0x94,0x93,0x90,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x93,0x00,0x97,0x97,0x95,0x00,0x99,0x98,0x96,0x00,\n\t0x9a,0x9a,0x98,0x00,0x9b,0x9a,0x98,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0xa0,0x9f,0x9d,0x00,0xa1,0xa0,0x9e,0x00,0xa2,0xa1,0xa0,0x00,\n\t0xa4,0xa3,0xa1,0x00,0xa5,0xa3,0xa2,0x00,0xa6,0xa5,0xa3,0x00,0xa7,0xa6,0xa5,0x00,0xa9,0xa7,0xa6,0x00,0xaa,0xa8,0xa7,0x00,0xab,0xaa,0xa8,0x00,0xac,0xab,0xa9,0x00,\n\t0xad,0xac,0xaa,0x00,0xae,0xae,0xab,0x00,0xb0,0xae,0xad,0x00,0xb0,0xb0,0xad,0x00,0xb2,0xb1,0xaf,0x00,0xb3,0xb2,0xaf,0x00,0xb5,0xb2,0xb1,0x00,0xb5,0xb3,0xb2,0x00,\n\t0xb7,0xb5,0xb3,0x00,0xb7,0xb6,0xb4,0x00,0xb9,0xb8,0xb5,0x00,0xb9,0xb8,0xb6,0x00,0xbb,0xb9,0xb7,0x00,0xbb,0xba,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xba,0x00,\n\t0xc0,0xbe,0xbb,0x00,0xc0,0xbf,0xbc,0x00,0xc2,0xc0,0xbe,0x00,0xc2,0xc1,0xbf,0x00,0xc4,0xc2,0xc0,0x00,0xc5,0xc3,0xc1,0x00,0xc6,0xc4,0xc2,0x00,0xc7,0xc6,0xc3,0x00,\n\t0xc8,0xc7,0xc5,0x00,0xca,0xc8,0xc6,0x00,0xcb,0xc9,0xc7,0x00,0xcc,0xca,0xc8,0x00,0xcd,0xcb,0xc9,0x00,0xce,0xcc,0xca,0x00,0xcf,0xcd,0xcb,0x00,0xd1,0xce,0xcc,0x00,\n\t0xd2,0xd0,0xce,0x00,0xd3,0xd1,0xcf,0x00,0xd4,0xd2,0xd0,0x00,0xd6,0xd3,0xd1,0x00,0xd7,0xd4,0xd3,0x00,0xd7,0xd5,0xd3,0x00,0xd9,0xd7,0xd4,0x00,0xd9,0xd7,0xd5,0x00,\n\t0xdb,0xd9,0xd6,0x00,0xdc,0xd9,0xd7,0x00,0xdd,0xda,0xd8,0x00,0xde,0xdb,0xd9,0x00,0xe0,0xdd,0xda,0x00,0xe0,0xde,0xdb,0x00,0xe2,0xdf,0xdd,0x00,0xe3,0xe0,0xdd,0x00,\n\t0xe4,0xe1,0xdf,0x00,0xe5,0xe1,0xdf,0x00,0xe6,0xe3,0xe1,0x00,0xe7,0xe4,0xe1,0x00,0xe8,0xe6,0xe3,0x00,0xe9,0xe6,0xe3,0x00,0xeb,0xe8,0xe5,0x00,0xec,0xe9,0xe5,0x00,\n\t0xed,0xea,0xe7,0x00,0xee,0xeb,0xe8,0x00,0xef,0xec,0xe9,0x00,0xf0,0xed,0xea,0x00,0xf2,0xee,0xeb,0x00,0xf3,0xef,0xec,0x00,0xf4,0xf0,0xed,0x00,0xf5,0xf2,0xee,0x00,\n\t0xf7,0xf3,0xf0,0x00,0xf8,0xf4,0xf0,0x00,0xf9,0xf5,0xf2,0x00,0xfa,0xf6,0xf2,0x00,0xfb,0xf7,0xf4,0x00,0xfc,0xf8,0xf5,0x00,0xfd,0xf9,0xf6,0x00,0xfe,0xfb,0xf7,0x00,\n\t0xff,0xfc,0xf9,0x00,0xff,0xfd,0xfa,0x00,0xff,0xfe,0xfa,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x16,0x00,0x18,0x18,0x17,0x00,\n\t0x19,0x19,0x18,0x00,0x1a,0x1a,0x19,0x00,0x1b,0x1b,0x1b,0x00,0x1d,0x1d,0x1c,0x00,0x1e,0x1e,0x1d,0x00,0x1f,0x1f,0x1e,0x00,0x20,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,\n\t0x22,0x22,0x21,0x00,0x23,0x23,0x22,0x00,0x24,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,0x2a,0x2a,0x2a,0x00,\n\t0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x34,0x34,0x34,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x36,0x00,0x38,0x38,0x37,0x00,0x3a,0x39,0x38,0x00,0x3b,0x3a,0x39,0x00,0x3c,0x3b,0x3a,0x00,0x3d,0x3d,0x3c,0x00,\n\t0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x43,0x42,0x41,0x00,0x44,0x43,0x42,0x00,0x45,0x44,0x43,0x00,0x46,0x45,0x44,0x00,\n\t0x47,0x46,0x45,0x00,0x48,0x47,0x46,0x00,0x49,0x48,0x47,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4f,0x4d,0x00,\n\t0x50,0x50,0x4e,0x00,0x51,0x51,0x4f,0x00,0x52,0x52,0x50,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x58,0x56,0x00,\n\t0x58,0x59,0x57,0x00,0x59,0x5a,0x58,0x00,0x5b,0x5c,0x5a,0x00,0x5d,0x5d,0x5b,0x00,0x5f,0x5f,0x5d,0x00,0x60,0x60,0x5e,0x00,0x61,0x61,0x60,0x00,0x63,0x63,0x61,0x00,\n\t0x64,0x64,0x63,0x00,0x65,0x65,0x63,0x00,0x66,0x66,0x64,0x00,0x67,0x67,0x65,0x00,0x68,0x68,0x66,0x00,0x69,0x69,0x67,0x00,0x6a,0x6a,0x68,0x00,0x6b,0x6c,0x6a,0x00,\n\t0x6d,0x6d,0x6b,0x00,0x6e,0x6e,0x6c,0x00,0x6f,0x6f,0x6d,0x00,0x70,0x70,0x6e,0x00,0x71,0x71,0x6f,0x00,0x72,0x72,0x70,0x00,0x73,0x73,0x71,0x00,0x74,0x75,0x73,0x00,\n\t0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x79,0x79,0x77,0x00,0x7a,0x7a,0x78,0x00,0x7b,0x7b,0x79,0x00,0x7c,0x7c,0x7a,0x00,0x7d,0x7d,0x7c,0x00,\n\t0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x82,0x00,0x83,0x84,0x83,0x00,0x84,0x85,0x84,0x00,0x86,0x86,0x85,0x00,\n\t0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8e,0x8d,0x8c,0x00,0x8f,0x8f,0x8d,0x00,\n\t0x91,0x90,0x8f,0x00,0x92,0x91,0x90,0x00,0x93,0x92,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,\n\t0x9a,0x99,0x97,0x00,0x9b,0x9a,0x98,0x00,0x9c,0x9b,0x99,0x00,0x9d,0x9d,0x9b,0x00,0x9f,0x9e,0x9c,0x00,0xa0,0x9f,0x9d,0x00,0xa1,0xa0,0x9e,0x00,0xa2,0xa1,0x9f,0x00,\n\t0xa3,0xa2,0xa1,0x00,0xa4,0xa3,0xa2,0x00,0xa5,0xa4,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa8,0xa7,0xa6,0x00,0xa9,0xa8,0xa7,0x00,0xaa,0xa9,0xa8,0x00,0xab,0xab,0xa9,0x00,\n\t0xad,0xac,0xaa,0x00,0xae,0xad,0xab,0x00,0xaf,0xae,0xac,0x00,0xb0,0xaf,0xad,0x00,0xb2,0xb0,0xaf,0x00,0xb3,0xb1,0xb0,0x00,0xb4,0xb2,0xb1,0x00,0xb5,0xb4,0xb2,0x00,\n\t0xb6,0xb5,0xb3,0x00,0xb7,0xb6,0xb4,0x00,0xb8,0xb7,0xb5,0x00,0xb9,0xb8,0xb6,0x00,0xbb,0xb9,0xb8,0x00,0xbc,0xba,0xb8,0x00,0xbd,0xbb,0xb9,0x00,0xbe,0xbc,0xba,0x00,\n\t0xbf,0xbe,0xbb,0x00,0xc0,0xbf,0xbc,0x00,0xc1,0xc0,0xbd,0x00,0xc2,0xc1,0xbf,0x00,0xc4,0xc2,0xc0,0x00,0xc5,0xc3,0xc1,0x00,0xc6,0xc4,0xc2,0x00,0xc7,0xc6,0xc3,0x00,\n\t0xc8,0xc7,0xc5,0x00,0xc9,0xc8,0xc6,0x00,0xca,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcd,0xcb,0xc9,0x00,0xce,0xcc,0xca,0x00,0xcf,0xcd,0xcb,0x00,0xd0,0xce,0xcd,0x00,\n\t0xd1,0xcf,0xce,0x00,0xd2,0xd0,0xcf,0x00,0xd3,0xd1,0xd0,0x00,0xd4,0xd3,0xd1,0x00,0xd6,0xd4,0xd2,0x00,0xd7,0xd5,0xd3,0x00,0xd8,0xd6,0xd4,0x00,0xd9,0xd7,0xd5,0x00,\n\t0xdb,0xd8,0xd7,0x00,0xdc,0xd9,0xd8,0x00,0xdd,0xda,0xd9,0x00,0xde,0xdb,0xda,0x00,0xdf,0xdc,0xdb,0x00,0xe0,0xdd,0xdc,0x00,0xe1,0xde,0xdd,0x00,0xe2,0xe0,0xde,0x00,\n\t0xe3,0xe1,0xdf,0x00,0xe4,0xe2,0xe0,0x00,0xe5,0xe3,0xe1,0x00,0xe6,0xe4,0xe2,0x00,0xe7,0xe5,0xe3,0x00,0xe9,0xe6,0xe4,0x00,0xea,0xe7,0xe5,0x00,0xeb,0xe9,0xe6,0x00,\n\t0xec,0xea,0xe7,0x00,0xed,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,0xf1,0xee,0xeb,0x00,0xf2,0xef,0xec,0x00,0xf3,0xf0,0xed,0x00,0xf4,0xf1,0xee,0x00,\n\t0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf2,0x00,0xf8,0xf6,0xf3,0x00,0xfa,0xf7,0xf4,0x00,0xfb,0xf8,0xf5,0x00,0xfc,0xf9,0xf6,0x00,0xfd,0xfa,0xf7,0x00,\n\t0xfe,0xfb,0xf9,0x00,0xfe,0xfc,0xfa,0x00,0xff,0xfd,0xfb,0x00,0xff,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x15,0x00,0x17,0x17,0x16,0x00,0x18,0x18,0x17,0x00,\n\t0x19,0x19,0x18,0x00,0x1a,0x1a,0x19,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1e,0x1e,0x1d,0x00,0x1f,0x1f,0x1e,0x00,0x20,0x20,0x1f,0x00,0x21,0x21,0x20,0x00,\n\t0x22,0x22,0x21,0x00,0x23,0x23,0x22,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,0x2a,0x29,0x29,0x00,\n\t0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x35,0x00,0x37,0x37,0x36,0x00,0x38,0x38,0x37,0x00,0x39,0x39,0x38,0x00,0x3a,0x3a,0x39,0x00,0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,\n\t0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,\n\t0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,\n\t0x4f,0x50,0x4e,0x00,0x50,0x51,0x4f,0x00,0x51,0x52,0x50,0x00,0x52,0x53,0x51,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,\n\t0x58,0x59,0x57,0x00,0x59,0x5a,0x58,0x00,0x5b,0x5c,0x5a,0x00,0x5c,0x5d,0x5b,0x00,0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x61,0x61,0x5f,0x00,0x62,0x62,0x61,0x00,\n\t0x64,0x64,0x62,0x00,0x65,0x65,0x63,0x00,0x66,0x66,0x64,0x00,0x67,0x67,0x65,0x00,0x68,0x68,0x66,0x00,0x69,0x69,0x67,0x00,0x6a,0x6a,0x68,0x00,0x6b,0x6b,0x69,0x00,\n\t0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,\n\t0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x7a,0x7a,0x78,0x00,0x7b,0x7b,0x79,0x00,0x7c,0x7c,0x7a,0x00,0x7d,0x7d,0x7b,0x00,\n\t0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,\n\t0x87,0x87,0x85,0x00,0x88,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8c,0x8a,0x00,0x8e,0x8d,0x8c,0x00,0x8f,0x8e,0x8d,0x00,\n\t0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,\n\t0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9c,0x9b,0x99,0x00,0x9d,0x9c,0x9a,0x00,0x9f,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,\n\t0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa5,0xa4,0xa3,0x00,0xa6,0xa5,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xaa,0xa9,0xa7,0x00,0xab,0xaa,0xa8,0x00,\n\t0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xaf,0xae,0xac,0x00,0xb0,0xaf,0xad,0x00,0xb1,0xb0,0xae,0x00,0xb2,0xb1,0xaf,0x00,0xb3,0xb2,0xb0,0x00,0xb4,0xb3,0xb1,0x00,\n\t0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb8,0xb7,0xb5,0x00,0xb9,0xb8,0xb6,0x00,0xba,0xb9,0xb7,0x00,0xbb,0xba,0xb8,0x00,0xbc,0xbb,0xb9,0x00,0xbd,0xbc,0xba,0x00,\n\t0xbe,0xbd,0xbb,0x00,0xbf,0xbe,0xbc,0x00,0xc1,0xbf,0xbd,0x00,0xc2,0xc0,0xbe,0x00,0xc3,0xc2,0xc0,0x00,0xc4,0xc3,0xc1,0x00,0xc5,0xc4,0xc2,0x00,0xc6,0xc5,0xc3,0x00,\n\t0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xca,0xc9,0xc6,0x00,0xcb,0xca,0xc7,0x00,0xcc,0xcb,0xc9,0x00,0xcd,0xcc,0xca,0x00,0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,\n\t0xd0,0xcf,0xce,0x00,0xd1,0xd0,0xcf,0x00,0xd3,0xd1,0xd0,0x00,0xd4,0xd2,0xd1,0x00,0xd6,0xd4,0xd2,0x00,0xd7,0xd5,0xd3,0x00,0xd8,0xd6,0xd4,0x00,0xd9,0xd7,0xd5,0x00,\n\t0xda,0xd8,0xd6,0x00,0xdb,0xd9,0xd7,0x00,0xdc,0xda,0xd8,0x00,0xdd,0xdb,0xd9,0x00,0xde,0xdc,0xda,0x00,0xdf,0xdd,0xdb,0x00,0xe0,0xde,0xdc,0x00,0xe1,0xdf,0xdd,0x00,\n\t0xe3,0xe1,0xde,0x00,0xe4,0xe2,0xdf,0x00,0xe5,0xe3,0xe0,0x00,0xe6,0xe4,0xe1,0x00,0xe7,0xe5,0xe3,0x00,0xe8,0xe6,0xe4,0x00,0xe9,0xe7,0xe5,0x00,0xea,0xe8,0xe6,0x00,\n\t0xec,0xea,0xe7,0x00,0xed,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,0xf2,0xf0,0xed,0x00,0xf3,0xf1,0xee,0x00,\n\t0xf4,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf7,0xf4,0xf1,0x00,0xf8,0xf5,0xf2,0x00,0xf9,0xf7,0xf4,0x00,0xfa,0xf8,0xf5,0x00,0xfb,0xf9,0xf6,0x00,0xfc,0xfa,0xf7,0x00,\n\t0xfe,0xfb,0xf8,0x00,0xfe,0xfc,0xf9,0x00,0xfe,0xfd,0xfa,0x00,0xff,0xfe,0xfb,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x17,0x16,0x00,0x17,0x18,0x17,0x00,\n\t0x18,0x19,0x18,0x00,0x1a,0x1a,0x19,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,\n\t0x21,0x21,0x21,0x00,0x23,0x22,0x22,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,\n\t0x2a,0x2a,0x2a,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,\n\t0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x38,0x38,0x00,0x3a,0x3a,0x39,0x00,0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,\n\t0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x42,0x41,0x41,0x00,0x43,0x42,0x42,0x00,0x44,0x43,0x43,0x00,0x45,0x44,0x44,0x00,\n\t0x46,0x45,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4c,0x4a,0x00,0x4c,0x4d,0x4c,0x00,0x4d,0x4e,0x4d,0x00,\n\t0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x55,0x53,0x00,0x55,0x56,0x54,0x00,0x56,0x57,0x55,0x00,\n\t0x57,0x58,0x56,0x00,0x59,0x5a,0x58,0x00,0x5a,0x5b,0x59,0x00,0x5c,0x5d,0x5b,0x00,0x5e,0x5e,0x5c,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,\n\t0x63,0x63,0x62,0x00,0x64,0x64,0x62,0x00,0x65,0x65,0x63,0x00,0x66,0x66,0x64,0x00,0x67,0x67,0x65,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,\n\t0x6c,0x6c,0x6a,0x00,0x6d,0x6d,0x6b,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x70,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,\n\t0x74,0x75,0x73,0x00,0x76,0x76,0x74,0x00,0x77,0x77,0x75,0x00,0x78,0x78,0x76,0x00,0x79,0x79,0x77,0x00,0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,\n\t0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,\n\t0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x89,0x88,0x87,0x00,0x8a,0x89,0x88,0x00,0x8b,0x8a,0x89,0x00,0x8c,0x8c,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8d,0x00,\n\t0x90,0x8f,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x97,0x94,0x00,0x97,0x98,0x95,0x00,\n\t0x99,0x99,0x96,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9d,0x9c,0x9a,0x00,0x9e,0x9d,0x9b,0x00,0x9f,0x9e,0x9c,0x00,0xa0,0x9f,0x9d,0x00,0xa1,0xa0,0x9e,0x00,\n\t0xa2,0xa1,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa7,0xa6,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,\n\t0xac,0xab,0xa9,0x00,0xad,0xac,0xaa,0x00,0xae,0xad,0xab,0x00,0xaf,0xae,0xac,0x00,0xb1,0xaf,0xae,0x00,0xb2,0xb1,0xaf,0x00,0xb3,0xb2,0xb0,0x00,0xb4,0xb3,0xb1,0x00,\n\t0xb5,0xb4,0xb2,0x00,0xb6,0xb5,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xba,0xb9,0xb7,0x00,0xbb,0xba,0xb8,0x00,0xbc,0xbb,0xb9,0x00,0xbd,0xbc,0xba,0x00,\n\t0xbe,0xbd,0xbb,0x00,0xbf,0xbe,0xbc,0x00,0xc0,0xbf,0xbd,0x00,0xc1,0xc0,0xbe,0x00,0xc3,0xc1,0xbf,0x00,0xc4,0xc3,0xc0,0x00,0xc5,0xc4,0xc1,0x00,0xc6,0xc5,0xc2,0x00,\n\t0xc7,0xc6,0xc4,0x00,0xc8,0xc7,0xc5,0x00,0xc9,0xc8,0xc6,0x00,0xca,0xc9,0xc7,0x00,0xcc,0xca,0xc8,0x00,0xcd,0xcb,0xca,0x00,0xce,0xcc,0xcb,0x00,0xcf,0xcd,0xcc,0x00,\n\t0xd0,0xce,0xcd,0x00,0xd1,0xd0,0xce,0x00,0xd2,0xd1,0xcf,0x00,0xd4,0xd2,0xd0,0x00,0xd5,0xd3,0xd1,0x00,0xd6,0xd4,0xd2,0x00,0xd7,0xd5,0xd3,0x00,0xd8,0xd6,0xd4,0x00,\n\t0xda,0xd7,0xd6,0x00,0xdb,0xd8,0xd7,0x00,0xdc,0xd9,0xd8,0x00,0xdd,0xda,0xd9,0x00,0xde,0xdb,0xda,0x00,0xdf,0xdd,0xdb,0x00,0xe0,0xde,0xdc,0x00,0xe1,0xdf,0xdd,0x00,\n\t0xe2,0xe0,0xde,0x00,0xe3,0xe1,0xdf,0x00,0xe4,0xe2,0xe0,0x00,0xe5,0xe3,0xe1,0x00,0xe6,0xe4,0xe2,0x00,0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe5,0x00,0xea,0xe8,0xe6,0x00,\n\t0xeb,0xe9,0xe7,0x00,0xec,0xea,0xe8,0x00,0xed,0xeb,0xe9,0x00,0xee,0xec,0xea,0x00,0xf0,0xed,0xeb,0x00,0xf1,0xee,0xec,0x00,0xf2,0xef,0xed,0x00,0xf3,0xf0,0xee,0x00,\n\t0xf4,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf2,0x00,0xf9,0xf6,0xf3,0x00,0xfa,0xf7,0xf4,0x00,0xfb,0xf8,0xf5,0x00,0xfc,0xf9,0xf6,0x00,\n\t0xfd,0xfa,0xf8,0x00,0xfd,0xfb,0xf9,0x00,0xfe,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x17,0x16,0x00,0x17,0x18,0x17,0x00,\n\t0x18,0x19,0x18,0x00,0x19,0x1a,0x19,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,\n\t0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,\n\t0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,\n\t0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,\n\t0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4d,0x4c,0x00,0x4d,0x4e,0x4d,0x00,\n\t0x4e,0x4f,0x4e,0x00,0x4f,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x56,0x54,0x00,0x56,0x57,0x55,0x00,\n\t0x57,0x58,0x56,0x00,0x59,0x5a,0x58,0x00,0x5a,0x5b,0x59,0x00,0x5c,0x5d,0x5b,0x00,0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,\n\t0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x65,0x65,0x63,0x00,0x66,0x66,0x64,0x00,0x67,0x67,0x65,0x00,0x68,0x68,0x66,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,\n\t0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,\n\t0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x77,0x77,0x75,0x00,0x78,0x78,0x76,0x00,0x79,0x79,0x77,0x00,0x7a,0x7a,0x78,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,\n\t0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x85,0x83,0x00,\n\t0x86,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x89,0x88,0x86,0x00,0x8a,0x89,0x87,0x00,0x8b,0x8a,0x88,0x00,0x8c,0x8b,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8d,0x00,\n\t0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x96,0x97,0x94,0x00,0x97,0x98,0x95,0x00,\n\t0x98,0x99,0x96,0x00,0x9a,0x9a,0x97,0x00,0x9b,0x9b,0x99,0x00,0x9d,0x9c,0x9a,0x00,0x9e,0x9d,0x9b,0x00,0x9f,0x9e,0x9c,0x00,0xa0,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,\n\t0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,\n\t0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xae,0xad,0xab,0x00,0xaf,0xae,0xac,0x00,0xb0,0xaf,0xad,0x00,0xb1,0xb0,0xae,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,\n\t0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbb,0xba,0x00,\n\t0xbd,0xbc,0xbb,0x00,0xbe,0xbd,0xbc,0x00,0xc0,0xbf,0xbd,0x00,0xc1,0xc0,0xbe,0x00,0xc2,0xc1,0xbf,0x00,0xc3,0xc2,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,\n\t0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc9,0xc8,0xc6,0x00,0xca,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,0xcd,0xcc,0xcb,0x00,0xce,0xcd,0xcc,0x00,\n\t0xcf,0xce,0xcd,0x00,0xd1,0xcf,0xce,0x00,0xd2,0xd1,0xcf,0x00,0xd4,0xd2,0xcf,0x00,0xd5,0xd3,0xd0,0x00,0xd6,0xd4,0xd1,0x00,0xd7,0xd5,0xd3,0x00,0xd8,0xd6,0xd4,0x00,\n\t0xd9,0xd7,0xd5,0x00,0xda,0xd8,0xd6,0x00,0xdb,0xd9,0xd7,0x00,0xdc,0xda,0xd8,0x00,0xdd,0xdb,0xd9,0x00,0xde,0xdc,0xda,0x00,0xe0,0xde,0xdb,0x00,0xe1,0xdf,0xdc,0x00,\n\t0xe2,0xe0,0xdd,0x00,0xe3,0xe1,0xde,0x00,0xe4,0xe2,0xe0,0x00,0xe4,0xe3,0xe1,0x00,0xe5,0xe4,0xe2,0x00,0xe6,0xe5,0xe3,0x00,0xe8,0xe7,0xe5,0x00,0xe9,0xe8,0xe6,0x00,\n\t0xea,0xe9,0xe7,0x00,0xeb,0xea,0xe8,0x00,0xed,0xeb,0xe9,0x00,0xee,0xec,0xea,0x00,0xef,0xed,0xeb,0x00,0xf0,0xee,0xec,0x00,0xf1,0xef,0xed,0x00,0xf2,0xf0,0xed,0x00,\n\t0xf3,0xf1,0xee,0x00,0xf4,0xf2,0xef,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf2,0x00,0xf8,0xf6,0xf3,0x00,0xf9,0xf7,0xf4,0x00,0xfa,0xf8,0xf5,0x00,0xfb,0xf9,0xf6,0x00,\n\t0xfc,0xfa,0xf7,0x00,0xfd,0xfb,0xf8,0x00,0xfe,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x18,0x17,0x00,\n\t0x18,0x19,0x18,0x00,0x19,0x1a,0x19,0x00,0x1b,0x1b,0x1a,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,\n\t0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,\n\t0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2d,0x2c,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x33,0x32,0x00,\n\t0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3c,0x3c,0x3b,0x00,\n\t0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4e,0x4d,0x00,\n\t0x4e,0x4f,0x4e,0x00,0x4f,0x50,0x4f,0x00,0x50,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x57,0x55,0x00,\n\t0x57,0x58,0x56,0x00,0x58,0x59,0x57,0x00,0x5a,0x5b,0x59,0x00,0x5b,0x5c,0x5a,0x00,0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x61,0x62,0x60,0x00,\n\t0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x67,0x67,0x65,0x00,0x68,0x68,0x66,0x00,0x69,0x69,0x67,0x00,0x6a,0x6b,0x69,0x00,\n\t0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x73,0x74,0x72,0x00,\n\t0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x79,0x79,0x77,0x00,0x7a,0x7a,0x78,0x00,0x7b,0x7b,0x79,0x00,0x7c,0x7c,0x7b,0x00,\n\t0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x85,0x85,0x83,0x00,\n\t0x86,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x88,0x88,0x86,0x00,0x8a,0x89,0x87,0x00,0x8b,0x8a,0x88,0x00,0x8c,0x8b,0x89,0x00,0x8d,0x8c,0x8b,0x00,0x8e,0x8e,0x8c,0x00,\n\t0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x97,0x97,0x95,0x00,\n\t0x98,0x99,0x96,0x00,0x99,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9c,0x9c,0x9a,0x00,0x9e,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,\n\t0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xaa,0xaa,0xa7,0x00,\n\t0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xb0,0xaf,0xad,0x00,0xb1,0xb0,0xae,0x00,0xb2,0xb1,0xaf,0x00,0xb3,0xb2,0xb1,0x00,\n\t0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xb9,0xb7,0x00,0xbb,0xba,0xb8,0x00,0xbc,0xbb,0xb9,0x00,\n\t0xbd,0xbc,0xbb,0x00,0xbe,0xbd,0xbc,0x00,0xbf,0xbe,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc2,0xc1,0xbf,0x00,0xc3,0xc2,0xc0,0x00,0xc4,0xc3,0xc1,0x00,0xc5,0xc5,0xc2,0x00,\n\t0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,0xcd,0xcc,0xca,0x00,0xce,0xcd,0xcb,0x00,\n\t0xcf,0xce,0xcd,0x00,0xd0,0xcf,0xcd,0x00,0xd2,0xd0,0xce,0x00,0xd3,0xd2,0xcf,0x00,0xd4,0xd3,0xd0,0x00,0xd5,0xd4,0xd1,0x00,0xd6,0xd5,0xd2,0x00,0xd7,0xd6,0xd4,0x00,\n\t0xd8,0xd7,0xd5,0x00,0xd9,0xd8,0xd6,0x00,0xda,0xd9,0xd7,0x00,0xdb,0xda,0xd8,0x00,0xdd,0xdb,0xd9,0x00,0xde,0xdc,0xda,0x00,0xdf,0xdd,0xdb,0x00,0xe0,0xdf,0xdc,0x00,\n\t0xe2,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe2,0x00,0xe6,0xe5,0xe3,0x00,0xe7,0xe6,0xe4,0x00,0xe9,0xe7,0xe5,0x00,\n\t0xea,0xe9,0xe7,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,0xf2,0xf0,0xed,0x00,\n\t0xf3,0xf1,0xee,0x00,0xf4,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf7,0xf5,0xf2,0x00,0xf8,0xf6,0xf3,0x00,0xf9,0xf7,0xf4,0x00,0xfa,0xf8,0xf5,0x00,0xfb,0xf9,0xf6,0x00,\n\t0xfc,0xfa,0xf7,0x00,0xfd,0xfb,0xf8,0x00,0xfd,0xfc,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x18,0x19,0x18,0x00,0x19,0x1a,0x19,0x00,0x1b,0x1b,0x1a,0x00,0x1c,0x1c,0x1b,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,\n\t0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,\n\t0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2d,0x2c,0x00,0x2d,0x2e,0x2d,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x34,0x33,0x00,0x34,0x35,0x34,0x00,0x35,0x36,0x35,0x00,0x36,0x37,0x36,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x48,0x47,0x00,0x48,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,\n\t0x4e,0x4f,0x4e,0x00,0x4f,0x50,0x4f,0x00,0x50,0x51,0x50,0x00,0x51,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,\n\t0x57,0x58,0x56,0x00,0x58,0x59,0x57,0x00,0x5a,0x5b,0x59,0x00,0x5b,0x5c,0x5a,0x00,0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,\n\t0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,\n\t0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,\n\t0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,\n\t0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,\n\t0x86,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x88,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8b,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8e,0x8c,0x00,\n\t0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x93,0x94,0x91,0x00,0x94,0x95,0x92,0x00,0x95,0x96,0x93,0x00,0x96,0x97,0x94,0x00,\n\t0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9c,0x9b,0x99,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,\n\t0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,\n\t0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,\n\t0xb4,0xb3,0xb2,0x00,0xb5,0xb4,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,\n\t0xbd,0xbc,0xba,0x00,0xbe,0xbd,0xbb,0x00,0xbf,0xbe,0xbc,0x00,0xc0,0xbf,0xbd,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,\n\t0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,\n\t0xcf,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd1,0xd0,0xce,0x00,0xd2,0xd1,0xcf,0x00,0xd4,0xd3,0xd0,0x00,0xd5,0xd4,0xd1,0x00,0xd6,0xd5,0xd2,0x00,0xd7,0xd6,0xd3,0x00,\n\t0xd8,0xd7,0xd5,0x00,0xd9,0xd8,0xd6,0x00,0xda,0xd9,0xd7,0x00,0xdb,0xda,0xd8,0x00,0xdc,0xdb,0xd9,0x00,0xdd,0xdc,0xda,0x00,0xdf,0xdd,0xdb,0x00,0xe0,0xde,0xdc,0x00,\n\t0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe4,0x00,0xe8,0xe7,0xe5,0x00,\n\t0xea,0xe8,0xe6,0x00,0xeb,0xe9,0xe7,0x00,0xec,0xea,0xe8,0x00,0xed,0xeb,0xe9,0x00,0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,0xf2,0xf0,0xed,0x00,\n\t0xf3,0xf1,0xee,0x00,0xf4,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf8,0xf6,0xf3,0x00,0xf9,0xf7,0xf4,0x00,0xfa,0xf8,0xf5,0x00,0xfb,0xf9,0xf6,0x00,\n\t0xfc,0xfa,0xf7,0x00,0xfc,0xfb,0xf8,0x00,0xfd,0xfc,0xf9,0x00,0xfe,0xfd,0xfa,0x00,0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1b,0x1a,0x1a,0x00,0x1c,0x1b,0x1b,0x00,0x1d,0x1c,0x1c,0x00,0x1e,0x1d,0x1d,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,\n\t0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,\n\t0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2d,0x2c,0x00,0x2d,0x2e,0x2d,0x00,0x2e,0x2f,0x2e,0x00,0x2f,0x30,0x2f,0x00,0x30,0x31,0x30,0x00,0x31,0x32,0x31,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x39,0x38,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,\n\t0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x48,0x46,0x00,0x48,0x49,0x47,0x00,0x49,0x4a,0x48,0x00,0x4a,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,\n\t0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x54,0x52,0x00,0x54,0x55,0x54,0x00,0x55,0x56,0x55,0x00,\n\t0x56,0x57,0x56,0x00,0x58,0x59,0x57,0x00,0x59,0x5a,0x59,0x00,0x5b,0x5c,0x5a,0x00,0x5c,0x5d,0x5b,0x00,0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,\n\t0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x65,0x62,0x00,0x64,0x66,0x63,0x00,0x66,0x67,0x64,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,\n\t0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,\n\t0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x78,0x78,0x76,0x00,0x79,0x79,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,\n\t0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,\n\t0x85,0x85,0x83,0x00,0x87,0x86,0x84,0x00,0x88,0x87,0x86,0x00,0x89,0x88,0x87,0x00,0x8a,0x89,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8c,0x8a,0x00,0x8d,0x8e,0x8b,0x00,\n\t0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,\n\t0x97,0x98,0x95,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9d,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,\n\t0xa0,0xa0,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa7,0xa7,0xa4,0x00,0xa8,0xa8,0xa5,0x00,0xa9,0xa9,0xa6,0x00,\n\t0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xaf,0xae,0xac,0x00,0xb0,0xaf,0xae,0x00,0xb1,0xb0,0xaf,0x00,0xb2,0xb1,0xb0,0x00,\n\t0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xb8,0xb6,0x00,0xba,0xb9,0xb7,0x00,0xbb,0xba,0xb8,0x00,\n\t0xbc,0xbb,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc1,0xc0,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,\n\t0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xca,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,0xcd,0xcc,0xca,0x00,\n\t0xce,0xcd,0xcc,0x00,0xcf,0xcf,0xcc,0x00,0xd1,0xd0,0xcd,0x00,0xd2,0xd1,0xce,0x00,0xd3,0xd2,0xcf,0x00,0xd4,0xd3,0xd1,0x00,0xd5,0xd4,0xd2,0x00,0xd6,0xd5,0xd3,0x00,\n\t0xd7,0xd6,0xd4,0x00,0xd8,0xd7,0xd5,0x00,0xd9,0xd8,0xd6,0x00,0xda,0xd9,0xd7,0x00,0xdc,0xda,0xd8,0x00,0xdd,0xdc,0xd9,0x00,0xde,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,\n\t0xe1,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,\n\t0xe9,0xe8,0xe6,0x00,0xeb,0xe9,0xe6,0x00,0xec,0xea,0xe7,0x00,0xed,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,\n\t0xf2,0xf0,0xed,0x00,0xf4,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf2,0x00,0xf8,0xf6,0xf3,0x00,0xf9,0xf8,0xf4,0x00,0xfa,0xf9,0xf5,0x00,\n\t0xfb,0xfa,0xf6,0x00,0xfc,0xfb,0xf7,0x00,0xfd,0xfc,0xf8,0x00,0xfe,0xfd,0xf9,0x00,0xff,0xfe,0xfb,0x00,0xff,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1b,0x1a,0x1a,0x00,0x1c,0x1b,0x1b,0x00,0x1d,0x1c,0x1c,0x00,0x1e,0x1d,0x1d,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,\n\t0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,\n\t0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2d,0x2c,0x00,0x2d,0x2e,0x2d,0x00,0x2e,0x2f,0x2e,0x00,0x2f,0x30,0x2f,0x00,0x30,0x31,0x30,0x00,0x31,0x32,0x31,0x00,\n\t0x32,0x33,0x32,0x00,0x33,0x34,0x33,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,\n\t0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x48,0x46,0x00,0x48,0x49,0x47,0x00,0x49,0x4a,0x48,0x00,0x4a,0x4b,0x49,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,\n\t0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x55,0x54,0x00,0x55,0x56,0x55,0x00,\n\t0x56,0x57,0x56,0x00,0x58,0x59,0x57,0x00,0x59,0x5a,0x59,0x00,0x5b,0x5c,0x5a,0x00,0x5c,0x5d,0x5b,0x00,0x5d,0x5e,0x5c,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,\n\t0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x65,0x62,0x00,0x64,0x66,0x63,0x00,0x65,0x67,0x64,0x00,0x66,0x68,0x65,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,\n\t0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,\n\t0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,\n\t0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,\n\t0x85,0x85,0x83,0x00,0x86,0x86,0x84,0x00,0x88,0x87,0x86,0x00,0x89,0x88,0x87,0x00,0x8a,0x89,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8c,0x8a,0x00,0x8c,0x8e,0x8b,0x00,\n\t0x8d,0x8f,0x8c,0x00,0x8e,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x90,0x00,0x93,0x94,0x91,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,\n\t0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,\n\t0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa8,0xa8,0xa5,0x00,0xa9,0xa9,0xa6,0x00,\n\t0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb1,0xb0,0xaf,0x00,0xb2,0xb1,0xb0,0x00,\n\t0xb3,0xb2,0xb1,0x00,0xb4,0xb3,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xba,0xb9,0xb7,0x00,0xbb,0xba,0xb8,0x00,\n\t0xbc,0xbb,0xb9,0x00,0xbd,0xbc,0xba,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,\n\t0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,0xcd,0xcc,0xca,0x00,\n\t0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,\n\t0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd9,0xd8,0xd6,0x00,0xda,0xd9,0xd7,0x00,0xdb,0xda,0xd8,0x00,0xdc,0xdb,0xd9,0x00,0xde,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,\n\t0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe7,0xe6,0xe3,0x00,0xe8,0xe6,0xe4,0x00,\n\t0xe9,0xe7,0xe5,0x00,0xea,0xe8,0xe6,0x00,0xec,0xea,0xe7,0x00,0xed,0xeb,0xe7,0x00,0xee,0xec,0xe8,0x00,0xef,0xed,0xe9,0x00,0xf0,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,\n\t0xf2,0xf0,0xed,0x00,0xf3,0xf1,0xee,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf2,0x00,0xf8,0xf6,0xf3,0x00,0xf9,0xf8,0xf4,0x00,0xfa,0xf9,0xf5,0x00,\n\t0xfb,0xfa,0xf6,0x00,0xfc,0xfb,0xf7,0x00,0xfd,0xfc,0xf8,0x00,0xfe,0xfd,0xf9,0x00,0xff,0xfe,0xfa,0x00,0xff,0xfe,0xfb,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0f,0x0f,0x0f,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1c,0x1b,0x1b,0x00,0x1d,0x1c,0x1c,0x00,0x1e,0x1d,0x1d,0x00,0x1f,0x1e,0x1e,0x00,0x20,0x20,0x20,0x00,\n\t0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x29,0x29,0x29,0x00,\n\t0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2e,0x2d,0x00,0x2e,0x2f,0x2e,0x00,0x2f,0x30,0x2f,0x00,0x30,0x31,0x30,0x00,0x31,0x32,0x31,0x00,\n\t0x32,0x33,0x32,0x00,0x33,0x34,0x33,0x00,0x35,0x35,0x34,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x3a,0x3a,0x39,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,\n\t0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x49,0x47,0x00,0x49,0x4a,0x48,0x00,0x4a,0x4b,0x49,0x00,0x4b,0x4c,0x4a,0x00,0x4d,0x4d,0x4c,0x00,\n\t0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x56,0x55,0x00,\n\t0x56,0x57,0x56,0x00,0x57,0x58,0x57,0x00,0x59,0x5a,0x58,0x00,0x5a,0x5b,0x5a,0x00,0x5c,0x5d,0x5b,0x00,0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x60,0x61,0x5f,0x00,\n\t0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x66,0x63,0x00,0x65,0x67,0x64,0x00,0x66,0x68,0x65,0x00,0x67,0x69,0x66,0x00,0x69,0x6a,0x68,0x00,\n\t0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x72,0x73,0x71,0x00,\n\t0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7b,0x7c,0x7a,0x00,\n\t0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x84,0x84,0x82,0x00,\n\t0x85,0x85,0x83,0x00,0x86,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x89,0x88,0x87,0x00,0x8a,0x89,0x88,0x00,0x8b,0x8a,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,\n\t0x8d,0x8f,0x8c,0x00,0x8e,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x90,0x00,0x93,0x94,0x91,0x00,0x94,0x95,0x92,0x00,0x96,0x96,0x94,0x00,\n\t0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9e,0x00,\n\t0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa3,0xa2,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa9,0xa9,0xa6,0x00,\n\t0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb2,0xb1,0xaf,0x00,\n\t0xb3,0xb2,0xb1,0x00,0xb4,0xb3,0xb2,0x00,0xb5,0xb4,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xbb,0xba,0xb8,0x00,\n\t0xbc,0xbb,0xb9,0x00,0xbd,0xbc,0xba,0x00,0xbe,0xbd,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc4,0xc4,0xc1,0x00,\n\t0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcd,0xcc,0xca,0x00,\n\t0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd3,0x00,\n\t0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd9,0xd8,0xd6,0x00,0xda,0xd9,0xd7,0x00,0xdb,0xda,0xd8,0x00,0xdc,0xdb,0xd9,0x00,0xdd,0xdc,0xda,0x00,0xdf,0xde,0xdb,0x00,\n\t0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe8,0xe6,0xe4,0x00,\n\t0xe9,0xe7,0xe5,0x00,0xea,0xe8,0xe6,0x00,0xeb,0xe9,0xe6,0x00,0xed,0xeb,0xe7,0x00,0xee,0xec,0xe8,0x00,0xef,0xed,0xe9,0x00,0xf0,0xee,0xea,0x00,0xf1,0xef,0xec,0x00,\n\t0xf2,0xf0,0xed,0x00,0xf3,0xf1,0xee,0x00,0xf4,0xf2,0xef,0x00,0xf5,0xf4,0xf0,0x00,0xf7,0xf5,0xf2,0x00,0xf8,0xf6,0xf3,0x00,0xf9,0xf7,0xf4,0x00,0xfa,0xf8,0xf5,0x00,\n\t0xfb,0xfa,0xf6,0x00,0xfc,0xfb,0xf7,0x00,0xfd,0xfc,0xf8,0x00,0xfe,0xfd,0xf9,0x00,0xff,0xfe,0xfa,0x00,0xff,0xfe,0xfb,0x00,0xff,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,\n\t0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1d,0x1c,0x1c,0x00,0x1e,0x1d,0x1d,0x00,0x1f,0x1e,0x1e,0x00,0x20,0x1f,0x1f,0x00,\n\t0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,\n\t0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2f,0x2e,0x00,0x2f,0x30,0x2f,0x00,0x30,0x31,0x30,0x00,0x31,0x32,0x31,0x00,\n\t0x33,0x33,0x32,0x00,0x34,0x34,0x33,0x00,0x35,0x35,0x34,0x00,0x36,0x36,0x35,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x3a,0x3a,0x39,0x00,0x3b,0x3b,0x3a,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,\n\t0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x4a,0x48,0x00,0x4a,0x4b,0x49,0x00,0x4b,0x4c,0x4a,0x00,0x4c,0x4d,0x4b,0x00,\n\t0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,\n\t0x56,0x57,0x56,0x00,0x57,0x58,0x57,0x00,0x59,0x5a,0x58,0x00,0x5a,0x5b,0x59,0x00,0x5c,0x5d,0x5b,0x00,0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x60,0x60,0x5e,0x00,\n\t0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x67,0x64,0x00,0x66,0x68,0x65,0x00,0x67,0x69,0x66,0x00,0x68,0x6a,0x67,0x00,\n\t0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,\n\t0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,\n\t0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,\n\t0x85,0x85,0x83,0x00,0x86,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x88,0x88,0x86,0x00,0x8a,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,\n\t0x8d,0x8f,0x8c,0x00,0x8e,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x90,0x00,0x93,0x94,0x91,0x00,0x94,0x95,0x92,0x00,0x95,0x96,0x93,0x00,\n\t0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,\n\t0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa3,0xa2,0xa1,0x00,0xa4,0xa3,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,\n\t0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,\n\t0xb3,0xb2,0xb0,0x00,0xb4,0xb3,0xb1,0x00,0xb5,0xb4,0xb2,0x00,0xb6,0xb5,0xb3,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,\n\t0xbc,0xbb,0xb9,0x00,0xbd,0xbc,0xba,0x00,0xbe,0xbd,0xbb,0x00,0xbf,0xbe,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,\n\t0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,\n\t0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd1,0xd0,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,\n\t0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd9,0xd8,0xd6,0x00,0xda,0xd9,0xd7,0x00,0xdb,0xda,0xd8,0x00,0xdc,0xdb,0xd9,0x00,0xdd,0xdc,0xda,0x00,0xde,0xdd,0xdb,0x00,\n\t0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,\n\t0xe9,0xe7,0xe5,0x00,0xea,0xe8,0xe5,0x00,0xeb,0xe9,0xe6,0x00,0xec,0xea,0xe7,0x00,0xee,0xec,0xe8,0x00,0xef,0xed,0xe9,0x00,0xf0,0xee,0xea,0x00,0xf1,0xef,0xeb,0x00,\n\t0xf2,0xf0,0xed,0x00,0xf3,0xf1,0xee,0x00,0xf4,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf5,0xf1,0x00,0xf7,0xf6,0xf2,0x00,0xf8,0xf7,0xf3,0x00,0xf9,0xf8,0xf4,0x00,\n\t0xfb,0xf9,0xf6,0x00,0xfc,0xfa,0xf7,0x00,0xfd,0xfb,0xf8,0x00,0xfe,0xfc,0xf9,0x00,0xff,0xfe,0xfa,0x00,0xff,0xfe,0xfb,0x00,0xff,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x13,0x13,0x14,0x00,0x14,0x14,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x16,0x00,\n\t0x18,0x18,0x17,0x00,0x19,0x19,0x18,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x23,0x23,0x00,0x23,0x24,0x24,0x00,0x24,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,\n\t0x29,0x29,0x29,0x00,0x2a,0x2b,0x2a,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x31,0x30,0x00,0x32,0x32,0x31,0x00,\n\t0x33,0x33,0x32,0x00,0x34,0x34,0x33,0x00,0x35,0x35,0x34,0x00,0x36,0x36,0x35,0x00,0x37,0x37,0x36,0x00,0x38,0x38,0x38,0x00,0x3a,0x3a,0x39,0x00,0x3b,0x3b,0x3a,0x00,\n\t0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,\n\t0x44,0x44,0x44,0x00,0x45,0x46,0x45,0x00,0x46,0x47,0x46,0x00,0x47,0x48,0x47,0x00,0x48,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,\n\t0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x50,0x4f,0x00,0x50,0x51,0x50,0x00,0x51,0x52,0x51,0x00,0x52,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,\n\t0x56,0x56,0x55,0x00,0x57,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5b,0x59,0x00,0x5b,0x5c,0x5a,0x00,0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x60,0x60,0x5e,0x00,\n\t0x61,0x61,0x5f,0x00,0x62,0x63,0x60,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,\n\t0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,\n\t0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x75,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,\n\t0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7e,0x7e,0x7c,0x00,0x7f,0x7f,0x7d,0x00,0x80,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,\n\t0x84,0x85,0x83,0x00,0x86,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x88,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8c,0x89,0x00,0x8c,0x8d,0x8a,0x00,\n\t0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,\n\t0x96,0x96,0x94,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,\n\t0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa3,0xa2,0xa1,0x00,0xa4,0xa3,0xa2,0x00,0xa5,0xa4,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,\n\t0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xaf,0xae,0xac,0x00,0xb0,0xb0,0xad,0x00,0xb1,0xb1,0xae,0x00,\n\t0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb5,0xb4,0xb2,0x00,0xb6,0xb5,0xb3,0x00,0xb7,0xb6,0xb4,0x00,0xb8,0xb7,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,\n\t0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,\n\t0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xca,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,\n\t0xcd,0xcc,0xca,0x00,0xce,0xce,0xcb,0x00,0xd0,0xcf,0xcc,0x00,0xd1,0xd0,0xcd,0x00,0xd2,0xd1,0xce,0x00,0xd3,0xd2,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,\n\t0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd9,0xd8,0xd5,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xda,0xd7,0x00,0xdc,0xdb,0xd8,0x00,0xdd,0xdc,0xd9,0x00,0xde,0xdd,0xda,0x00,\n\t0xdf,0xde,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe2,0xe1,0xdd,0x00,0xe3,0xe2,0xde,0x00,0xe4,0xe3,0xdf,0x00,0xe5,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,\n\t0xe8,0xe6,0xe4,0x00,0xea,0xe8,0xe5,0x00,0xeb,0xe9,0xe6,0x00,0xec,0xea,0xe7,0x00,0xed,0xeb,0xe7,0x00,0xee,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,\n\t0xf1,0xef,0xec,0x00,0xf2,0xf1,0xed,0x00,0xf3,0xf2,0xee,0x00,0xf4,0xf3,0xef,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf2,0x00,0xf8,0xf6,0xf3,0x00,0xf9,0xf7,0xf4,0x00,\n\t0xfa,0xf9,0xf5,0x00,0xfb,0xfa,0xf6,0x00,0xfd,0xfb,0xf8,0x00,0xfe,0xfc,0xf9,0x00,0xff,0xfd,0xfa,0x00,0xff,0xfe,0xfb,0x00,0xff,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x13,0x13,0x14,0x00,0x14,0x14,0x15,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x16,0x00,\n\t0x18,0x18,0x17,0x00,0x19,0x19,0x18,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x23,0x23,0x00,0x23,0x24,0x24,0x00,0x24,0x25,0x25,0x00,0x25,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,\n\t0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x31,0x30,0x00,0x32,0x32,0x31,0x00,\n\t0x33,0x33,0x32,0x00,0x34,0x34,0x33,0x00,0x35,0x35,0x34,0x00,0x36,0x36,0x35,0x00,0x37,0x37,0x36,0x00,0x38,0x38,0x37,0x00,0x3a,0x3a,0x39,0x00,0x3b,0x3b,0x3a,0x00,\n\t0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,\n\t0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x47,0x46,0x00,0x47,0x48,0x47,0x00,0x48,0x49,0x48,0x00,0x49,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,\n\t0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x50,0x4f,0x00,0x50,0x51,0x50,0x00,0x51,0x52,0x51,0x00,0x52,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,\n\t0x56,0x56,0x55,0x00,0x57,0x58,0x56,0x00,0x59,0x59,0x58,0x00,0x5a,0x5b,0x59,0x00,0x5b,0x5c,0x5a,0x00,0x5d,0x5d,0x5b,0x00,0x5e,0x5f,0x5d,0x00,0x60,0x60,0x5e,0x00,\n\t0x61,0x61,0x5f,0x00,0x62,0x62,0x60,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,\n\t0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,\n\t0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x75,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,\n\t0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7e,0x7e,0x7c,0x00,0x7f,0x7f,0x7d,0x00,0x80,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,\n\t0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x88,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8c,0x89,0x00,0x8c,0x8d,0x8a,0x00,\n\t0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,\n\t0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,\n\t0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa3,0xa2,0xa1,0x00,0xa4,0xa3,0xa2,0x00,0xa5,0xa4,0xa3,0x00,0xa6,0xa5,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,\n\t0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xb0,0xb0,0xad,0x00,0xb1,0xb1,0xae,0x00,\n\t0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb5,0xb4,0xb2,0x00,0xb6,0xb5,0xb3,0x00,0xb7,0xb6,0xb4,0x00,0xb8,0xb7,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,\n\t0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,\n\t0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xcb,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,\n\t0xcd,0xcc,0xca,0x00,0xce,0xcd,0xcb,0x00,0xd0,0xcf,0xcc,0x00,0xd1,0xd0,0xcd,0x00,0xd2,0xd1,0xce,0x00,0xd3,0xd2,0xcf,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,\n\t0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd9,0xd8,0xd5,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xda,0xd7,0x00,0xdc,0xdb,0xd8,0x00,0xdd,0xdc,0xd9,0x00,0xde,0xdd,0xda,0x00,\n\t0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe2,0xe1,0xdd,0x00,0xe3,0xe2,0xde,0x00,0xe4,0xe3,0xdf,0x00,0xe5,0xe4,0xe0,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe5,0xe3,0x00,\n\t0xe8,0xe6,0xe4,0x00,0xe9,0xe7,0xe5,0x00,0xeb,0xe9,0xe6,0x00,0xec,0xea,0xe6,0x00,0xed,0xeb,0xe7,0x00,0xee,0xec,0xe8,0x00,0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,\n\t0xf1,0xef,0xec,0x00,0xf2,0xf0,0xed,0x00,0xf3,0xf2,0xee,0x00,0xf4,0xf3,0xef,0x00,0xf5,0xf4,0xf0,0x00,0xf6,0xf5,0xf1,0x00,0xf8,0xf6,0xf3,0x00,0xf9,0xf7,0xf4,0x00,\n\t0xfa,0xf8,0xf5,0x00,0xfb,0xf9,0xf6,0x00,0xfd,0xfb,0xf8,0x00,0xfe,0xfc,0xf9,0x00,0xff,0xfd,0xfa,0x00,0xff,0xfe,0xfb,0x00,0xff,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x13,0x13,0x13,0x00,0x13,0x13,0x14,0x00,0x14,0x14,0x15,0x00,0x15,0x15,0x15,0x00,0x17,0x17,0x16,0x00,\n\t0x18,0x18,0x17,0x00,0x19,0x19,0x18,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x24,0x24,0x00,0x24,0x25,0x25,0x00,0x25,0x26,0x26,0x00,0x26,0x27,0x27,0x00,0x28,0x28,0x28,0x00,\n\t0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2c,0x2b,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,0x32,0x32,0x31,0x00,\n\t0x33,0x33,0x32,0x00,0x34,0x34,0x33,0x00,0x35,0x35,0x34,0x00,0x36,0x36,0x35,0x00,0x37,0x37,0x36,0x00,0x38,0x38,0x37,0x00,0x39,0x39,0x39,0x00,0x3b,0x3b,0x3a,0x00,\n\t0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x43,0x00,\n\t0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x48,0x47,0x00,0x48,0x49,0x48,0x00,0x49,0x4a,0x49,0x00,0x4a,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,\n\t0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x51,0x50,0x00,0x51,0x52,0x51,0x00,0x52,0x53,0x52,0x00,0x53,0x54,0x53,0x00,0x55,0x55,0x54,0x00,\n\t0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x59,0x57,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5c,0x5a,0x00,0x5c,0x5d,0x5b,0x00,0x5e,0x5e,0x5c,0x00,0x5f,0x60,0x5e,0x00,\n\t0x61,0x61,0x5f,0x00,0x62,0x62,0x60,0x00,0x63,0x63,0x61,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,\n\t0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,\n\t0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7b,0x79,0x00,\n\t0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7f,0x7f,0x7d,0x00,0x80,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,0x83,0x84,0x81,0x00,\n\t0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8d,0x8a,0x00,\n\t0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,\n\t0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9f,0x9f,0x9c,0x00,\n\t0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa4,0xa3,0xa1,0x00,0xa5,0xa4,0xa3,0x00,0xa6,0xa5,0xa4,0x00,0xa7,0xa6,0xa5,0x00,0xa8,0xa8,0xa6,0x00,\n\t0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb1,0xb1,0xae,0x00,\n\t0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb6,0xb5,0xb3,0x00,0xb7,0xb6,0xb4,0x00,0xb8,0xb7,0xb5,0x00,0xb9,0xb8,0xb6,0x00,0xba,0xba,0xb7,0x00,\n\t0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc3,0xc3,0xc0,0x00,\n\t0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcc,0xcb,0xc9,0x00,\n\t0xcd,0xcc,0xca,0x00,0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,0xd1,0xd0,0xcd,0x00,0xd2,0xd1,0xce,0x00,0xd3,0xd2,0xcf,0x00,0xd4,0xd3,0xd0,0x00,0xd5,0xd4,0xd1,0x00,\n\t0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xda,0xd7,0x00,0xdc,0xdb,0xd8,0x00,0xdd,0xdc,0xd9,0x00,0xde,0xdd,0xda,0x00,\n\t0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe3,0xe1,0xde,0x00,0xe4,0xe3,0xdf,0x00,0xe5,0xe3,0xe0,0x00,0xe6,0xe4,0xe1,0x00,0xe7,0xe5,0xe2,0x00,\n\t0xe8,0xe6,0xe4,0x00,0xe9,0xe7,0xe4,0x00,0xea,0xe8,0xe5,0x00,0xeb,0xea,0xe6,0x00,0xed,0xeb,0xe7,0x00,0xee,0xec,0xe8,0x00,0xef,0xed,0xe9,0x00,0xf0,0xee,0xeb,0x00,\n\t0xf1,0xef,0xec,0x00,0xf2,0xf0,0xed,0x00,0xf3,0xf1,0xee,0x00,0xf4,0xf3,0xef,0x00,0xf5,0xf4,0xf0,0x00,0xf6,0xf5,0xf1,0x00,0xf7,0xf6,0xf3,0x00,0xf9,0xf7,0xf4,0x00,\n\t0xfa,0xf8,0xf5,0x00,0xfb,0xf9,0xf6,0x00,0xfc,0xfa,0xf7,0x00,0xfe,0xfc,0xf9,0x00,0xff,0xfd,0xfa,0x00,0xff,0xfd,0xfb,0x00,0xff,0xfe,0xfc,0x00,0xff,0xfe,0xfd,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x14,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x18,0x18,0x17,0x00,0x19,0x19,0x18,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x25,0x25,0x00,0x25,0x26,0x26,0x00,0x26,0x27,0x27,0x00,0x27,0x28,0x28,0x00,\n\t0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2c,0x2b,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,0x32,0x31,0x31,0x00,\n\t0x33,0x33,0x32,0x00,0x34,0x34,0x33,0x00,0x35,0x35,0x34,0x00,0x36,0x36,0x35,0x00,0x37,0x37,0x36,0x00,0x38,0x38,0x37,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,\n\t0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x49,0x48,0x00,0x49,0x4a,0x49,0x00,0x4a,0x4b,0x4a,0x00,0x4b,0x4c,0x4b,0x00,\n\t0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x52,0x51,0x00,0x52,0x53,0x52,0x00,0x53,0x54,0x53,0x00,0x54,0x55,0x54,0x00,\n\t0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x59,0x57,0x00,0x5a,0x5a,0x58,0x00,0x5b,0x5c,0x5a,0x00,0x5c,0x5d,0x5b,0x00,0x5e,0x5e,0x5c,0x00,0x5f,0x60,0x5e,0x00,\n\t0x61,0x61,0x5f,0x00,0x62,0x62,0x60,0x00,0x63,0x63,0x61,0x00,0x64,0x64,0x62,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,\n\t0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,\n\t0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,\n\t0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x80,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,0x83,0x83,0x81,0x00,\n\t0x84,0x85,0x82,0x00,0x85,0x86,0x83,0x00,0x86,0x87,0x84,0x00,0x87,0x88,0x85,0x00,0x88,0x89,0x86,0x00,0x89,0x8a,0x87,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8c,0x8a,0x00,\n\t0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,\n\t0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,\n\t0xa0,0xa0,0x9d,0x00,0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa5,0xa4,0xa2,0x00,0xa6,0xa5,0xa3,0x00,0xa7,0xa6,0xa4,0x00,0xa8,0xa7,0xa5,0x00,\n\t0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,\n\t0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb7,0xb6,0xb4,0x00,0xb8,0xb7,0xb5,0x00,0xb9,0xb8,0xb6,0x00,0xba,0xb9,0xb7,0x00,\n\t0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,\n\t0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,\n\t0xcd,0xcc,0xca,0x00,0xce,0xcd,0xcb,0x00,0xcf,0xce,0xcc,0x00,0xd0,0xcf,0xcd,0x00,0xd2,0xd1,0xce,0x00,0xd3,0xd2,0xcf,0x00,0xd4,0xd3,0xd0,0x00,0xd5,0xd4,0xd1,0x00,\n\t0xd6,0xd5,0xd2,0x00,0xd7,0xd6,0xd3,0x00,0xd8,0xd7,0xd4,0x00,0xd9,0xd8,0xd5,0x00,0xdb,0xda,0xd7,0x00,0xdc,0xdb,0xd8,0x00,0xdd,0xdc,0xd9,0x00,0xde,0xdd,0xda,0x00,\n\t0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe4,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,\n\t0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,0xea,0xe8,0xe5,0x00,0xeb,0xe9,0xe6,0x00,0xec,0xeb,0xe7,0x00,0xed,0xec,0xe8,0x00,0xee,0xed,0xe9,0x00,0xef,0xee,0xea,0x00,\n\t0xf1,0xef,0xec,0x00,0xf2,0xf0,0xed,0x00,0xf3,0xf1,0xee,0x00,0xf4,0xf2,0xef,0x00,0xf5,0xf4,0xf0,0x00,0xf6,0xf5,0xf1,0x00,0xf7,0xf6,0xf3,0x00,0xf8,0xf7,0xf4,0x00,\n\t0xfa,0xf8,0xf5,0x00,0xfb,0xf9,0xf6,0x00,0xfc,0xfa,0xf7,0x00,0xfd,0xfb,0xf8,0x00,0xff,0xfd,0xfa,0x00,0xff,0xfd,0xfb,0x00,0xff,0xfe,0xfc,0x00,0xff,0xfe,0xfd,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x1a,0x1a,0x00,0x1a,0x1b,0x1b,0x00,0x1b,0x1c,0x1c,0x00,0x1c,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x27,0x26,0x00,0x27,0x28,0x27,0x00,\n\t0x28,0x29,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2c,0x2b,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,0x32,0x31,0x31,0x00,\n\t0x33,0x32,0x32,0x00,0x34,0x33,0x33,0x00,0x35,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x38,0x38,0x37,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,\n\t0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4b,0x4a,0x00,0x4b,0x4c,0x4b,0x00,\n\t0x4c,0x4d,0x4c,0x00,0x4d,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x54,0x52,0x00,0x54,0x55,0x53,0x00,\n\t0x55,0x56,0x54,0x00,0x57,0x57,0x56,0x00,0x58,0x59,0x57,0x00,0x5a,0x5a,0x58,0x00,0x5b,0x5b,0x59,0x00,0x5c,0x5d,0x5b,0x00,0x5e,0x5e,0x5c,0x00,0x5f,0x60,0x5e,0x00,\n\t0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x67,0x67,0x65,0x00,0x68,0x68,0x66,0x00,\n\t0x69,0x69,0x67,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,\n\t0x71,0x72,0x70,0x00,0x73,0x73,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,\n\t0x7a,0x7b,0x79,0x00,0x7c,0x7c,0x7a,0x00,0x7d,0x7d,0x7b,0x00,0x7e,0x7e,0x7c,0x00,0x7f,0x7f,0x7d,0x00,0x80,0x81,0x7e,0x00,0x81,0x82,0x7f,0x00,0x82,0x83,0x80,0x00,\n\t0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x88,0x88,0x86,0x00,0x89,0x8a,0x87,0x00,0x8a,0x8b,0x88,0x00,0x8c,0x8c,0x8a,0x00,\n\t0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,\n\t0x95,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9d,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,\n\t0x9f,0x9f,0x9d,0x00,0xa1,0xa0,0x9e,0x00,0xa2,0xa1,0x9f,0x00,0xa3,0xa2,0xa0,0x00,0xa4,0xa3,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,\n\t0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,0xb0,0xb0,0xad,0x00,\n\t0xb1,0xb1,0xae,0x00,0xb3,0xb2,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,\n\t0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbd,0xbc,0xba,0x00,0xbe,0xbd,0xbb,0x00,0xbf,0xbe,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,\n\t0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc9,0xc8,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,\n\t0xcc,0xcc,0xc9,0x00,0xce,0xcd,0xca,0x00,0xcf,0xce,0xcb,0x00,0xd0,0xcf,0xcc,0x00,0xd1,0xd0,0xcd,0x00,0xd2,0xd1,0xce,0x00,0xd3,0xd2,0xcf,0x00,0xd4,0xd3,0xd0,0x00,\n\t0xd5,0xd5,0xd2,0x00,0xd7,0xd6,0xd3,0x00,0xd8,0xd7,0xd4,0x00,0xd9,0xd8,0xd5,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xda,0xd7,0x00,0xdc,0xdb,0xd8,0x00,0xdd,0xdc,0xd9,0x00,\n\t0xde,0xdd,0xda,0x00,0xe0,0xde,0xdb,0x00,0xe1,0xdf,0xdc,0x00,0xe2,0xe0,0xdd,0x00,0xe3,0xe2,0xde,0x00,0xe4,0xe3,0xdf,0x00,0xe5,0xe4,0xe0,0x00,0xe6,0xe5,0xe1,0x00,\n\t0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xec,0xea,0xe7,0x00,0xed,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,\n\t0xf0,0xee,0xeb,0x00,0xf1,0xf0,0xec,0x00,0xf3,0xf1,0xee,0x00,0xf4,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf6,0xf3,0x00,0xf8,0xf7,0xf4,0x00,\n\t0xf9,0xf8,0xf5,0x00,0xfb,0xf9,0xf6,0x00,0xfc,0xfa,0xf7,0x00,0xfd,0xfb,0xf8,0x00,0xfe,0xfc,0xf9,0x00,0xfe,0xfd,0xfa,0x00,0xff,0xfe,0xfb,0x00,0xff,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x1a,0x1a,0x00,0x1a,0x1b,0x1b,0x00,0x1b,0x1c,0x1c,0x00,0x1c,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x27,0x26,0x00,0x27,0x28,0x27,0x00,\n\t0x28,0x29,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2c,0x2b,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,0x32,0x31,0x31,0x00,\n\t0x33,0x32,0x32,0x00,0x34,0x33,0x33,0x00,0x35,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,\n\t0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4b,0x4a,0x00,0x4b,0x4c,0x4b,0x00,\n\t0x4c,0x4d,0x4c,0x00,0x4d,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x54,0x52,0x00,0x54,0x55,0x53,0x00,\n\t0x55,0x56,0x54,0x00,0x57,0x57,0x55,0x00,0x58,0x59,0x57,0x00,0x5a,0x5a,0x58,0x00,0x5b,0x5b,0x59,0x00,0x5c,0x5d,0x5b,0x00,0x5e,0x5e,0x5c,0x00,0x5f,0x60,0x5e,0x00,\n\t0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x67,0x67,0x65,0x00,0x68,0x68,0x66,0x00,\n\t0x69,0x69,0x67,0x00,0x6a,0x6a,0x68,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,\n\t0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,\n\t0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7d,0x7d,0x7b,0x00,0x7e,0x7e,0x7c,0x00,0x7f,0x7f,0x7d,0x00,0x80,0x80,0x7e,0x00,0x81,0x82,0x7f,0x00,0x82,0x83,0x80,0x00,\n\t0x83,0x84,0x81,0x00,0x84,0x85,0x82,0x00,0x85,0x86,0x83,0x00,0x86,0x87,0x84,0x00,0x87,0x88,0x85,0x00,0x89,0x89,0x87,0x00,0x8a,0x8b,0x88,0x00,0x8c,0x8c,0x8a,0x00,\n\t0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,\n\t0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9d,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,\n\t0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9d,0x00,0xa2,0xa1,0x9f,0x00,0xa3,0xa2,0xa0,0x00,0xa4,0xa3,0xa1,0x00,0xa5,0xa4,0xa2,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,\n\t0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,0xb0,0xb0,0xad,0x00,\n\t0xb1,0xb1,0xae,0x00,0xb2,0xb2,0xaf,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,\n\t0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbd,0xbc,0xba,0x00,0xbe,0xbd,0xbb,0x00,0xbf,0xbe,0xbc,0x00,0xc0,0xbf,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,\n\t0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,\n\t0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xcf,0xce,0xcb,0x00,0xd0,0xcf,0xcc,0x00,0xd1,0xd0,0xcd,0x00,0xd2,0xd1,0xce,0x00,0xd3,0xd2,0xcf,0x00,0xd4,0xd3,0xd0,0x00,\n\t0xd5,0xd4,0xd1,0x00,0xd6,0xd5,0xd2,0x00,0xd8,0xd7,0xd4,0x00,0xd9,0xd8,0xd5,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xda,0xd7,0x00,0xdc,0xdb,0xd8,0x00,0xdd,0xdc,0xd9,0x00,\n\t0xde,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,0xe1,0xdf,0xdc,0x00,0xe2,0xe0,0xdd,0x00,0xe3,0xe1,0xde,0x00,0xe4,0xe2,0xdf,0x00,0xe5,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,\n\t0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,\n\t0xf0,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,0xf3,0xf1,0xee,0x00,0xf4,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf6,0xf3,0x00,0xf8,0xf7,0xf4,0x00,\n\t0xf9,0xf8,0xf5,0x00,0xfa,0xf9,0xf6,0x00,0xfc,0xfa,0xf7,0x00,0xfd,0xfb,0xf8,0x00,0xfe,0xfc,0xf9,0x00,0xfe,0xfd,0xfa,0x00,0xff,0xfe,0xfb,0x00,0xff,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1b,0x1b,0x00,0x1b,0x1c,0x1c,0x00,0x1c,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x28,0x27,0x00,\n\t0x28,0x29,0x28,0x00,0x29,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2d,0x2c,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x32,0x31,0x31,0x00,\n\t0x33,0x32,0x32,0x00,0x34,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x39,0x38,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,\n\t0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4c,0x4b,0x00,\n\t0x4c,0x4d,0x4c,0x00,0x4d,0x4e,0x4d,0x00,0x4e,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x55,0x53,0x00,\n\t0x55,0x56,0x54,0x00,0x56,0x57,0x55,0x00,0x58,0x58,0x56,0x00,0x59,0x5a,0x58,0x00,0x5b,0x5b,0x59,0x00,0x5c,0x5c,0x5a,0x00,0x5d,0x5e,0x5c,0x00,0x5f,0x5f,0x5d,0x00,\n\t0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x68,0x68,0x66,0x00,\n\t0x69,0x69,0x67,0x00,0x6a,0x6a,0x68,0x00,0x6b,0x6b,0x69,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,\n\t0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,\n\t0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7e,0x7e,0x7c,0x00,0x7f,0x7f,0x7d,0x00,0x80,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x83,0x80,0x00,\n\t0x83,0x84,0x81,0x00,0x84,0x85,0x82,0x00,0x85,0x86,0x83,0x00,0x86,0x87,0x84,0x00,0x87,0x88,0x85,0x00,0x88,0x89,0x86,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8c,0x89,0x00,\n\t0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x95,0x93,0x00,\n\t0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9e,0x9e,0x9b,0x00,\n\t0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9d,0x00,0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0xa0,0x00,0xa4,0xa3,0xa1,0x00,0xa5,0xa4,0xa2,0x00,0xa6,0xa5,0xa3,0x00,0xa7,0xa7,0xa5,0x00,\n\t0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,0xb0,0xb0,0xad,0x00,\n\t0xb1,0xb1,0xae,0x00,0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,\n\t0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xbb,0x00,0xbf,0xbe,0xbc,0x00,0xc0,0xbf,0xbd,0x00,0xc1,0xc0,0xbe,0x00,0xc2,0xc2,0xbf,0x00,\n\t0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xcb,0xcb,0xc8,0x00,\n\t0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xd0,0xcf,0xcc,0x00,0xd1,0xd0,0xcd,0x00,0xd2,0xd1,0xce,0x00,0xd3,0xd2,0xcf,0x00,0xd4,0xd3,0xd0,0x00,\n\t0xd5,0xd4,0xd1,0x00,0xd6,0xd5,0xd2,0x00,0xd7,0xd6,0xd3,0x00,0xd9,0xd8,0xd5,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xda,0xd7,0x00,0xdc,0xdb,0xd8,0x00,0xdd,0xdc,0xd9,0x00,\n\t0xde,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe3,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe5,0xe1,0x00,\n\t0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe9,0xe8,0xe4,0x00,0xea,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xef,0xed,0xea,0x00,\n\t0xf0,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,0xf2,0xf0,0xed,0x00,0xf3,0xf2,0xef,0x00,0xf5,0xf3,0xf0,0x00,0xf6,0xf4,0xf1,0x00,0xf7,0xf5,0xf2,0x00,0xf8,0xf7,0xf3,0x00,\n\t0xf9,0xf8,0xf5,0x00,0xfa,0xf9,0xf6,0x00,0xfb,0xfa,0xf7,0x00,0xfd,0xfb,0xf8,0x00,0xfe,0xfc,0xf9,0x00,0xfe,0xfd,0xfa,0x00,0xfe,0xfd,0xfb,0x00,0xff,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x13,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1c,0x1c,0x00,0x1c,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,\n\t0x28,0x29,0x29,0x00,0x29,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,\n\t0x33,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x39,0x38,0x00,0x3a,0x3a,0x39,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,\n\t0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,\n\t0x4c,0x4d,0x4c,0x00,0x4d,0x4e,0x4d,0x00,0x4e,0x4f,0x4e,0x00,0x4f,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,\n\t0x55,0x56,0x54,0x00,0x56,0x57,0x55,0x00,0x58,0x58,0x56,0x00,0x59,0x59,0x57,0x00,0x5b,0x5b,0x59,0x00,0x5c,0x5c,0x5a,0x00,0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,\n\t0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,\n\t0x69,0x69,0x67,0x00,0x6a,0x6a,0x68,0x00,0x6b,0x6b,0x69,0x00,0x6c,0x6c,0x6a,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,\n\t0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,\n\t0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7f,0x7f,0x7d,0x00,0x80,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,\n\t0x83,0x84,0x81,0x00,0x84,0x85,0x82,0x00,0x85,0x86,0x83,0x00,0x86,0x87,0x84,0x00,0x87,0x88,0x85,0x00,0x88,0x89,0x86,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,\n\t0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,\n\t0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,\n\t0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9d,0x00,0xa1,0xa1,0x9e,0x00,0xa2,0xa2,0x9f,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,\n\t0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,0xb0,0xb0,0xad,0x00,\n\t0xb1,0xb1,0xae,0x00,0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,\n\t0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,\n\t0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,\n\t0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd1,0xd0,0xcd,0x00,0xd2,0xd1,0xce,0x00,0xd3,0xd2,0xcf,0x00,0xd4,0xd3,0xd0,0x00,\n\t0xd5,0xd4,0xd1,0x00,0xd6,0xd5,0xd2,0x00,0xd7,0xd6,0xd3,0x00,0xd8,0xd7,0xd4,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xda,0xd7,0x00,0xdc,0xdb,0xd8,0x00,0xdd,0xdc,0xd9,0x00,\n\t0xde,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,\n\t0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe9,0xe8,0xe4,0x00,0xea,0xe9,0xe5,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,\n\t0xf0,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,0xf2,0xf0,0xed,0x00,0xf3,0xf1,0xee,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf4,0xf1,0x00,0xf6,0xf5,0xf2,0x00,0xf7,0xf6,0xf3,0x00,\n\t0xf9,0xf8,0xf4,0x00,0xfa,0xf9,0xf5,0x00,0xfb,0xfa,0xf6,0x00,0xfc,0xfb,0xf7,0x00,0xfe,0xfc,0xf8,0x00,0xfe,0xfc,0xf9,0x00,0xfe,0xfd,0xfa,0x00,0xff,0xfe,0xfb,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x28,0x00,\n\t0x28,0x28,0x29,0x00,0x29,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2f,0x2e,0x2e,0x00,0x30,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,\n\t0x32,0x31,0x31,0x00,0x33,0x32,0x32,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x39,0x38,0x00,0x3a,0x3a,0x39,0x00,\n\t0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,\n\t0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x46,0x45,0x00,0x46,0x47,0x46,0x00,0x47,0x48,0x47,0x00,0x48,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,\n\t0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4f,0x4d,0x00,0x4f,0x50,0x4e,0x00,0x50,0x51,0x4f,0x00,0x51,0x52,0x50,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,\n\t0x55,0x55,0x54,0x00,0x56,0x57,0x55,0x00,0x58,0x58,0x56,0x00,0x59,0x59,0x57,0x00,0x5a,0x5a,0x58,0x00,0x5c,0x5c,0x5a,0x00,0x5d,0x5d,0x5b,0x00,0x5e,0x5f,0x5d,0x00,\n\t0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x65,0x65,0x63,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,\n\t0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6f,0x6f,0x6d,0x00,0x70,0x70,0x6e,0x00,\n\t0x71,0x71,0x6f,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x79,0x76,0x00,0x78,0x7a,0x77,0x00,\n\t0x79,0x7b,0x78,0x00,0x7b,0x7c,0x79,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x82,0x7f,0x00,\n\t0x83,0x83,0x80,0x00,0x84,0x84,0x81,0x00,0x85,0x85,0x83,0x00,0x86,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x88,0x89,0x86,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,\n\t0x8c,0x8c,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,\n\t0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9d,0x9d,0x9a,0x00,\n\t0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa3,0xa2,0xa0,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,\n\t0xa7,0xa7,0xa5,0x00,0xa9,0xa9,0xa6,0x00,0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xaf,0xab,0x00,0xaf,0xb0,0xac,0x00,\n\t0xb0,0xb1,0xad,0x00,0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,\n\t0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbe,0xbd,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,\n\t0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc1,0x00,0xc5,0xc4,0xc2,0x00,0xc6,0xc5,0xc3,0x00,0xc7,0xc6,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,\n\t0xcb,0xcb,0xc8,0x00,0xcd,0xcc,0xc9,0x00,0xce,0xce,0xca,0x00,0xcf,0xcf,0xcb,0x00,0xd0,0xd0,0xcc,0x00,0xd1,0xd1,0xcd,0x00,0xd2,0xd2,0xce,0x00,0xd3,0xd3,0xcf,0x00,\n\t0xd4,0xd4,0xd0,0x00,0xd6,0xd5,0xd2,0x00,0xd7,0xd6,0xd3,0x00,0xd8,0xd7,0xd4,0x00,0xd9,0xd8,0xd5,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,\n\t0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe2,0xe1,0xdd,0x00,0xe3,0xe2,0xde,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,\n\t0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,0xe9,0xe7,0xe4,0x00,0xea,0xe8,0xe5,0x00,0xeb,0xe9,0xe6,0x00,0xec,0xea,0xe7,0x00,0xed,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,\n\t0xef,0xed,0xea,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,0xf4,0xf2,0xef,0x00,0xf5,0xf4,0xf0,0x00,0xf6,0xf5,0xf1,0x00,0xf7,0xf6,0xf2,0x00,\n\t0xf8,0xf7,0xf4,0x00,0xfa,0xf8,0xf5,0x00,0xfb,0xf9,0xf6,0x00,0xfc,0xfa,0xf7,0x00,0xfd,0xfb,0xf8,0x00,0xfe,0xfc,0xf9,0x00,0xfe,0xfd,0xfa,0x00,0xff,0xfe,0xfb,0x00,\n\t0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,\n\t0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x30,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,\n\t0x32,0x31,0x31,0x00,0x33,0x32,0x32,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x39,0x38,0x00,0x3a,0x3a,0x39,0x00,\n\t0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,\n\t0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x46,0x45,0x00,0x46,0x47,0x46,0x00,0x47,0x48,0x47,0x00,0x48,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,\n\t0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4f,0x4d,0x00,0x4f,0x50,0x4e,0x00,0x50,0x51,0x4f,0x00,0x51,0x52,0x50,0x00,0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,\n\t0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x58,0x58,0x56,0x00,0x59,0x59,0x57,0x00,0x5a,0x5a,0x58,0x00,0x5b,0x5c,0x5a,0x00,0x5d,0x5d,0x5b,0x00,0x5e,0x5f,0x5d,0x00,\n\t0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,\n\t0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6f,0x6f,0x6d,0x00,0x70,0x70,0x6e,0x00,\n\t0x71,0x71,0x6f,0x00,0x72,0x72,0x70,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x79,0x76,0x00,0x78,0x7a,0x77,0x00,\n\t0x79,0x7b,0x78,0x00,0x7a,0x7c,0x79,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x82,0x7f,0x00,\n\t0x83,0x83,0x80,0x00,0x84,0x84,0x81,0x00,0x85,0x85,0x83,0x00,0x86,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x88,0x88,0x86,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,\n\t0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,\n\t0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9c,0x9c,0x99,0x00,0x9d,0x9d,0x9a,0x00,\n\t0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,\n\t0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xaa,0xaa,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xaf,0xab,0x00,0xaf,0xb0,0xac,0x00,\n\t0xb0,0xb1,0xad,0x00,0xb1,0xb2,0xae,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,\n\t0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,\n\t0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc5,0xc4,0xc2,0x00,0xc6,0xc5,0xc3,0x00,0xc7,0xc6,0xc4,0x00,0xc8,0xc7,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,\n\t0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xce,0xce,0xca,0x00,0xcf,0xcf,0xcb,0x00,0xd0,0xd0,0xcc,0x00,0xd1,0xd1,0xcd,0x00,0xd2,0xd2,0xce,0x00,0xd3,0xd3,0xcf,0x00,\n\t0xd4,0xd4,0xd0,0x00,0xd5,0xd5,0xd1,0x00,0xd7,0xd6,0xd3,0x00,0xd8,0xd7,0xd4,0x00,0xd9,0xd8,0xd5,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,\n\t0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,\n\t0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,0xe9,0xe7,0xe4,0x00,0xea,0xe8,0xe5,0x00,0xeb,0xe9,0xe6,0x00,0xec,0xea,0xe7,0x00,0xed,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,\n\t0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,0xf1,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf6,0xf5,0xf1,0x00,0xf7,0xf6,0xf2,0x00,\n\t0xf8,0xf7,0xf3,0x00,0xf9,0xf8,0xf4,0x00,0xfb,0xf9,0xf5,0x00,0xfc,0xfa,0xf6,0x00,0xfd,0xfb,0xf7,0x00,0xfe,0xfc,0xf8,0x00,0xfe,0xfd,0xfa,0x00,0xff,0xfe,0xfb,0x00,\n\t0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1f,0x1f,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x28,0x00,\n\t0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,\n\t0x32,0x31,0x31,0x00,0x33,0x32,0x32,0x00,0x34,0x33,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x3a,0x3a,0x39,0x00,\n\t0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,\n\t0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x47,0x46,0x00,0x47,0x48,0x47,0x00,0x48,0x49,0x48,0x00,0x49,0x4a,0x49,0x00,0x4b,0x4b,0x4a,0x00,\n\t0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x50,0x4e,0x00,0x50,0x51,0x4f,0x00,0x51,0x52,0x50,0x00,0x52,0x53,0x52,0x00,0x54,0x54,0x53,0x00,\n\t0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x59,0x59,0x57,0x00,0x5a,0x5a,0x58,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5d,0x5b,0x00,0x5e,0x5e,0x5d,0x00,\n\t0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x67,0x68,0x66,0x00,\n\t0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x70,0x70,0x6e,0x00,\n\t0x71,0x71,0x6f,0x00,0x72,0x72,0x70,0x00,0x73,0x73,0x71,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x7a,0x77,0x00,\n\t0x79,0x7b,0x78,0x00,0x7a,0x7c,0x79,0x00,0x7b,0x7d,0x7a,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7e,0x00,0x82,0x82,0x7f,0x00,\n\t0x83,0x83,0x80,0x00,0x84,0x84,0x81,0x00,0x85,0x85,0x82,0x00,0x86,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x88,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8b,0x89,0x00,\n\t0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x90,0x00,0x93,0x94,0x92,0x00,\n\t0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9c,0x99,0x00,0x9d,0x9d,0x9a,0x00,\n\t0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa5,0xa2,0x00,0xa6,0xa6,0xa4,0x00,\n\t0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xab,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,0xaf,0xb0,0xac,0x00,\n\t0xb0,0xb1,0xad,0x00,0xb1,0xb2,0xae,0x00,0xb2,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,\n\t0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc1,0xc1,0xbe,0x00,\n\t0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc6,0xc5,0xc3,0x00,0xc7,0xc6,0xc4,0x00,0xc8,0xc7,0xc5,0x00,0xc9,0xc8,0xc6,0x00,0xca,0xca,0xc7,0x00,\n\t0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xcf,0xcf,0xcb,0x00,0xd0,0xd0,0xcc,0x00,0xd1,0xd1,0xcd,0x00,0xd2,0xd2,0xce,0x00,0xd3,0xd3,0xcf,0x00,\n\t0xd4,0xd4,0xd0,0x00,0xd5,0xd5,0xd1,0x00,0xd6,0xd6,0xd2,0x00,0xd8,0xd7,0xd4,0x00,0xd9,0xd8,0xd5,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xda,0xd7,0x00,0xdc,0xdc,0xd8,0x00,\n\t0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe4,0xe3,0xdf,0x00,0xe5,0xe4,0xe1,0x00,\n\t0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,0xea,0xe8,0xe5,0x00,0xeb,0xe9,0xe6,0x00,0xec,0xea,0xe7,0x00,0xed,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,\n\t0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,0xf2,0xf1,0xed,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf4,0xf1,0x00,0xf7,0xf6,0xf2,0x00,\n\t0xf8,0xf7,0xf3,0x00,0xf9,0xf8,0xf4,0x00,0xfa,0xf9,0xf5,0x00,0xfb,0xfa,0xf6,0x00,0xfd,0xfb,0xf7,0x00,0xfd,0xfc,0xf8,0x00,0xfe,0xfd,0xf9,0x00,0xfe,0xfe,0xfb,0x00,\n\t0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,\n\t0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,\n\t0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,\n\t0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,\n\t0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,0x42,0x42,0x41,0x00,\n\t0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x48,0x47,0x00,0x48,0x49,0x48,0x00,0x49,0x4a,0x49,0x00,0x4a,0x4b,0x4a,0x00,\n\t0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x51,0x4f,0x00,0x51,0x52,0x50,0x00,0x52,0x53,0x52,0x00,0x53,0x54,0x53,0x00,\n\t0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x59,0x57,0x00,0x5a,0x5a,0x58,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5d,0x5b,0x00,0x5d,0x5e,0x5d,0x00,\n\t0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,\n\t0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,\n\t0x71,0x71,0x6f,0x00,0x72,0x72,0x70,0x00,0x73,0x73,0x71,0x00,0x74,0x74,0x72,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,\n\t0x79,0x7b,0x78,0x00,0x7a,0x7c,0x79,0x00,0x7b,0x7d,0x7a,0x00,0x7c,0x7e,0x7b,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7d,0x00,0x80,0x81,0x7e,0x00,0x81,0x82,0x7f,0x00,\n\t0x83,0x83,0x80,0x00,0x84,0x84,0x81,0x00,0x85,0x85,0x82,0x00,0x86,0x86,0x83,0x00,0x87,0x87,0x85,0x00,0x88,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,\n\t0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x90,0x00,0x93,0x94,0x91,0x00,\n\t0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9c,0x99,0x00,0x9c,0x9d,0x9a,0x00,\n\t0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa5,0xa2,0x00,0xa5,0xa6,0xa3,0x00,\n\t0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,\n\t0xb0,0xb1,0xad,0x00,0xb1,0xb2,0xae,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,\n\t0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,\n\t0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc7,0xc6,0xc4,0x00,0xc8,0xc7,0xc5,0x00,0xc9,0xc8,0xc6,0x00,0xca,0xc9,0xc7,0x00,\n\t0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xd0,0xd0,0xcc,0x00,0xd1,0xd1,0xcd,0x00,0xd2,0xd2,0xce,0x00,0xd3,0xd3,0xcf,0x00,\n\t0xd4,0xd4,0xd0,0x00,0xd5,0xd5,0xd1,0x00,0xd6,0xd6,0xd2,0x00,0xd7,0xd7,0xd3,0x00,0xd9,0xd8,0xd5,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xda,0xd7,0x00,0xdc,0xdb,0xd8,0x00,\n\t0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe4,0xe3,0xdf,0x00,0xe5,0xe4,0xe0,0x00,\n\t0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xeb,0xe9,0xe6,0x00,0xec,0xea,0xe7,0x00,0xed,0xeb,0xe8,0x00,0xee,0xec,0xe9,0x00,\n\t0xef,0xed,0xea,0x00,0xf0,0xee,0xeb,0x00,0xf1,0xef,0xec,0x00,0xf2,0xf0,0xed,0x00,0xf3,0xf2,0xee,0x00,0xf4,0xf3,0xef,0x00,0xf5,0xf4,0xf0,0x00,0xf6,0xf5,0xf1,0x00,\n\t0xf8,0xf7,0xf3,0x00,0xf9,0xf8,0xf4,0x00,0xfa,0xf9,0xf5,0x00,0xfb,0xfa,0xf6,0x00,0xfc,0xfb,0xf7,0x00,0xfd,0xfc,0xf8,0x00,0xfe,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,\n\t0xff,0xff,0xfc,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,\n\t0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,\n\t0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x34,0x00,0x36,0x35,0x35,0x00,0x37,0x37,0x36,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,\n\t0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,\n\t0x42,0x42,0x42,0x00,0x43,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x4a,0x49,0x00,0x4a,0x4b,0x4a,0x00,\n\t0x4b,0x4c,0x4b,0x00,0x4c,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,\n\t0x54,0x54,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x59,0x57,0x00,0x59,0x5a,0x58,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5d,0x5b,0x00,0x5d,0x5e,0x5d,0x00,\n\t0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,\n\t0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,\n\t0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x77,0x74,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,\n\t0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7f,0x7f,0x7d,0x00,0x80,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,\n\t0x82,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x85,0x82,0x00,0x85,0x86,0x83,0x00,0x86,0x87,0x84,0x00,0x87,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,\n\t0x8b,0x8b,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x93,0x90,0x00,0x92,0x94,0x91,0x00,\n\t0x94,0x95,0x92,0x00,0x95,0x96,0x93,0x00,0x96,0x97,0x94,0x00,0x97,0x98,0x95,0x00,0x98,0x99,0x96,0x00,0x9a,0x9a,0x97,0x00,0x9b,0x9c,0x99,0x00,0x9c,0x9d,0x9a,0x00,\n\t0x9d,0x9e,0x9b,0x00,0x9e,0x9f,0x9c,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa5,0xa2,0x00,0xa5,0xa6,0xa3,0x00,\n\t0xa6,0xa7,0xa4,0x00,0xa8,0xa8,0xa5,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,\n\t0xaf,0xb0,0xad,0x00,0xb1,0xb1,0xae,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb7,0xb6,0xb4,0x00,0xb8,0xb7,0xb4,0x00,\n\t0xb9,0xb8,0xb5,0x00,0xba,0xb9,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,\n\t0xc1,0xc1,0xbe,0x00,0xc3,0xc2,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,\n\t0xca,0xca,0xc7,0x00,0xcc,0xcc,0xc8,0x00,0xcd,0xcd,0xc9,0x00,0xce,0xce,0xca,0x00,0xcf,0xcf,0xcb,0x00,0xd0,0xd0,0xcc,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,\n\t0xd3,0xd3,0xd0,0x00,0xd5,0xd4,0xd1,0x00,0xd6,0xd5,0xd2,0x00,0xd7,0xd6,0xd3,0x00,0xd8,0xd7,0xd4,0x00,0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,\n\t0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe4,0xe2,0xdf,0x00,0xe5,0xe3,0xe0,0x00,\n\t0xe6,0xe4,0xe1,0x00,0xe7,0xe5,0xe2,0x00,0xe8,0xe7,0xe3,0x00,0xe9,0xe8,0xe4,0x00,0xea,0xe9,0xe5,0x00,0xeb,0xea,0xe6,0x00,0xec,0xeb,0xe7,0x00,0xed,0xec,0xe8,0x00,\n\t0xee,0xed,0xe9,0x00,0xef,0xee,0xea,0x00,0xf0,0xef,0xeb,0x00,0xf1,0xf0,0xec,0x00,0xf2,0xf1,0xee,0x00,0xf4,0xf3,0xef,0x00,0xf5,0xf4,0xf0,0x00,0xf6,0xf5,0xf1,0x00,\n\t0xf7,0xf6,0xf2,0x00,0xf8,0xf7,0xf3,0x00,0xf9,0xf8,0xf4,0x00,0xfa,0xf9,0xf5,0x00,0xfc,0xfa,0xf6,0x00,0xfc,0xfb,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,\n\t0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x15,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,\n\t0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x31,0x30,0x31,0x00,\n\t0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x34,0x00,0x36,0x35,0x35,0x00,0x37,0x36,0x36,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,\n\t0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,\n\t0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x4a,0x49,0x00,0x4a,0x4b,0x4a,0x00,\n\t0x4b,0x4c,0x4b,0x00,0x4c,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,\n\t0x54,0x54,0x54,0x00,0x55,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x59,0x57,0x00,0x59,0x5a,0x58,0x00,0x5a,0x5b,0x5a,0x00,0x5c,0x5d,0x5b,0x00,0x5d,0x5e,0x5d,0x00,\n\t0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,\n\t0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,\n\t0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,\n\t0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x80,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,\n\t0x82,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x85,0x82,0x00,0x85,0x86,0x83,0x00,0x86,0x87,0x84,0x00,0x87,0x88,0x85,0x00,0x89,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,\n\t0x8b,0x8b,0x89,0x00,0x8c,0x8c,0x8a,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x93,0x90,0x00,0x92,0x94,0x91,0x00,\n\t0x93,0x95,0x92,0x00,0x94,0x96,0x93,0x00,0x96,0x97,0x94,0x00,0x97,0x98,0x95,0x00,0x98,0x99,0x96,0x00,0x99,0x9a,0x97,0x00,0x9b,0x9c,0x99,0x00,0x9c,0x9d,0x9a,0x00,\n\t0x9d,0x9e,0x9b,0x00,0x9e,0x9f,0x9c,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa5,0xa2,0x00,0xa5,0xa6,0xa3,0x00,\n\t0xa6,0xa7,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,\n\t0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb7,0xb6,0xb4,0x00,0xb8,0xb7,0xb4,0x00,\n\t0xb9,0xb8,0xb5,0x00,0xba,0xb9,0xb6,0x00,0xbb,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,\n\t0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,\n\t0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcd,0xcd,0xc9,0x00,0xce,0xce,0xca,0x00,0xcf,0xcf,0xcb,0x00,0xd0,0xd0,0xcc,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,\n\t0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd6,0xd5,0xd2,0x00,0xd7,0xd6,0xd3,0x00,0xd8,0xd7,0xd4,0x00,0xd9,0xd8,0xd5,0x00,0xda,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,\n\t0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe4,0xe2,0xdf,0x00,0xe5,0xe3,0xe0,0x00,\n\t0xe6,0xe4,0xe1,0x00,0xe7,0xe5,0xe2,0x00,0xe8,0xe7,0xe3,0x00,0xe9,0xe8,0xe4,0x00,0xea,0xe9,0xe5,0x00,0xeb,0xea,0xe6,0x00,0xec,0xeb,0xe7,0x00,0xed,0xec,0xe8,0x00,\n\t0xee,0xed,0xe9,0x00,0xef,0xee,0xea,0x00,0xf0,0xef,0xeb,0x00,0xf1,0xf0,0xec,0x00,0xf2,0xf1,0xed,0x00,0xf3,0xf2,0xee,0x00,0xf5,0xf4,0xf0,0x00,0xf6,0xf5,0xf1,0x00,\n\t0xf7,0xf6,0xf2,0x00,0xf8,0xf7,0xf3,0x00,0xf9,0xf8,0xf4,0x00,0xfa,0xf9,0xf5,0x00,0xfb,0xfa,0xf6,0x00,0xfc,0xfb,0xf7,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,\n\t0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x16,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x27,0x27,0x27,0x00,\n\t0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x30,0x30,0x00,\n\t0x32,0x31,0x32,0x00,0x33,0x32,0x32,0x00,0x34,0x33,0x33,0x00,0x35,0x34,0x34,0x00,0x36,0x35,0x35,0x00,0x37,0x36,0x36,0x00,0x38,0x38,0x37,0x00,0x39,0x39,0x39,0x00,\n\t0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,\n\t0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x49,0x00,0x4a,0x4b,0x4a,0x00,\n\t0x4b,0x4c,0x4b,0x00,0x4c,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x53,0x00,\n\t0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x5a,0x58,0x00,0x5a,0x5b,0x59,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5e,0x5c,0x00,\n\t0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,\n\t0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,\n\t0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x78,0x79,0x77,0x00,\n\t0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,\n\t0x82,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x86,0x83,0x00,0x86,0x87,0x84,0x00,0x87,0x88,0x85,0x00,0x88,0x89,0x86,0x00,0x8a,0x8a,0x88,0x00,\n\t0x8b,0x8b,0x89,0x00,0x8c,0x8c,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x94,0x91,0x00,\n\t0x93,0x95,0x92,0x00,0x94,0x96,0x93,0x00,0x95,0x97,0x94,0x00,0x97,0x98,0x95,0x00,0x98,0x99,0x96,0x00,0x99,0x9a,0x97,0x00,0x9a,0x9b,0x98,0x00,0x9b,0x9d,0x9a,0x00,\n\t0x9d,0x9e,0x9b,0x00,0x9e,0x9f,0x9c,0x00,0x9f,0xa0,0x9d,0x00,0xa0,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa6,0xa3,0x00,\n\t0xa6,0xa7,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xaf,0xac,0x00,\n\t0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,\n\t0xb9,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,\n\t0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,\n\t0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xce,0xca,0x00,0xcf,0xcf,0xcb,0x00,0xd0,0xd0,0xcc,0x00,0xd1,0xd1,0xcd,0x00,0xd2,0xd2,0xcf,0x00,\n\t0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd7,0xd6,0xd3,0x00,0xd8,0xd7,0xd4,0x00,0xd9,0xd8,0xd5,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xdb,0xd7,0x00,\n\t0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,\n\t0xe6,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,\n\t0xee,0xed,0xe9,0x00,0xef,0xee,0xea,0x00,0xf0,0xef,0xeb,0x00,0xf1,0xf0,0xec,0x00,0xf2,0xf1,0xed,0x00,0xf3,0xf2,0xee,0x00,0xf4,0xf3,0xef,0x00,0xf5,0xf5,0xf1,0x00,\n\t0xf7,0xf6,0xf2,0x00,0xf8,0xf7,0xf3,0x00,0xf9,0xf8,0xf4,0x00,0xfa,0xf9,0xf5,0x00,0xfb,0xfa,0xf6,0x00,0xfc,0xfb,0xf7,0x00,0xfd,0xfd,0xf8,0x00,0xfe,0xfe,0xfa,0x00,\n\t0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,\n\t0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,\n\t0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x32,0x31,0x31,0x00,0x33,0x32,0x32,0x00,0x34,0x33,0x33,0x00,0x35,0x34,0x34,0x00,0x36,0x35,0x35,0x00,0x37,0x36,0x36,0x00,0x38,0x38,0x37,0x00,0x39,0x39,0x38,0x00,\n\t0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,\n\t0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x45,0x44,0x00,0x45,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x47,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,\n\t0x4b,0x4c,0x4b,0x00,0x4c,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,\n\t0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x57,0x56,0x00,0x57,0x58,0x57,0x00,0x59,0x5a,0x58,0x00,0x5a,0x5b,0x59,0x00,0x5c,0x5c,0x5b,0x00,0x5d,0x5e,0x5c,0x00,\n\t0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,\n\t0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,\n\t0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,\n\t0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,\n\t0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x86,0x87,0x84,0x00,0x87,0x88,0x85,0x00,0x88,0x89,0x86,0x00,0x89,0x8a,0x87,0x00,\n\t0x8b,0x8b,0x89,0x00,0x8c,0x8c,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,\n\t0x93,0x95,0x92,0x00,0x94,0x96,0x93,0x00,0x95,0x97,0x94,0x00,0x96,0x98,0x95,0x00,0x98,0x99,0x96,0x00,0x99,0x9a,0x97,0x00,0x9a,0x9b,0x98,0x00,0x9b,0x9c,0x99,0x00,\n\t0x9c,0x9e,0x9b,0x00,0x9d,0x9f,0x9c,0x00,0x9f,0xa0,0x9d,0x00,0xa0,0xa1,0x9e,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,\n\t0xa6,0xa7,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,\n\t0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,\n\t0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,\n\t0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,\n\t0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xcf,0xcb,0x00,0xcf,0xd0,0xcc,0x00,0xd0,0xd1,0xcd,0x00,0xd1,0xd2,0xce,0x00,\n\t0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd8,0xd7,0xd4,0x00,0xd9,0xd8,0xd5,0x00,0xda,0xd9,0xd6,0x00,0xdb,0xda,0xd7,0x00,\n\t0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,0xe4,0xe3,0xe0,0x00,\n\t0xe5,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,0xe8,0xe7,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,\n\t0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf4,0xf3,0xef,0x00,0xf5,0xf4,0xf0,0x00,\n\t0xf6,0xf6,0xf2,0x00,0xf7,0xf7,0xf3,0x00,0xf8,0xf8,0xf4,0x00,0xf9,0xf9,0xf5,0x00,0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfd,0xfd,0xf8,0x00,0xfe,0xfe,0xf9,0x00,\n\t0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x15,0x00,\n\t0x17,0x16,0x16,0x00,0x18,0x17,0x17,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,\n\t0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2f,0x2e,0x2e,0x00,0x30,0x2f,0x2f,0x00,\n\t0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x38,0x38,0x37,0x00,0x39,0x39,0x38,0x00,\n\t0x3a,0x3a,0x39,0x00,0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,\n\t0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x45,0x44,0x00,0x45,0x46,0x45,0x00,0x46,0x47,0x46,0x00,0x47,0x48,0x47,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,\n\t0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4e,0x4d,0x4d,0x00,0x4f,0x4e,0x4e,0x00,0x50,0x4f,0x4f,0x00,0x51,0x50,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,\n\t0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x57,0x55,0x00,0x57,0x58,0x56,0x00,0x58,0x59,0x57,0x00,0x5a,0x5b,0x59,0x00,0x5c,0x5c,0x5a,0x00,0x5d,0x5e,0x5c,0x00,\n\t0x5f,0x5f,0x5d,0x00,0x60,0x60,0x5e,0x00,0x61,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,\n\t0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,\n\t0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,\n\t0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7b,0x7b,0x79,0x00,0x7c,0x7c,0x7a,0x00,0x7d,0x7d,0x7b,0x00,0x7e,0x7e,0x7c,0x00,0x7f,0x80,0x7d,0x00,0x80,0x81,0x7e,0x00,\n\t0x81,0x82,0x7f,0x00,0x82,0x83,0x80,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x88,0x89,0x86,0x00,0x89,0x8a,0x87,0x00,\n\t0x8a,0x8b,0x88,0x00,0x8b,0x8c,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,\n\t0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x98,0x9a,0x97,0x00,0x99,0x9b,0x98,0x00,0x9a,0x9c,0x99,0x00,\n\t0x9c,0x9d,0x9a,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa3,0xa0,0x00,0xa3,0xa4,0xa1,0x00,0xa4,0xa5,0xa2,0x00,\n\t0xa5,0xa6,0xa3,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,\n\t0xae,0xaf,0xac,0x00,0xb0,0xb0,0xad,0x00,0xb1,0xb1,0xae,0x00,0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb6,0xb2,0x00,0xb6,0xb7,0xb3,0x00,\n\t0xb8,0xb8,0xb4,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,\n\t0xc0,0xc0,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,\n\t0xc9,0xc9,0xc6,0x00,0xca,0xcb,0xc7,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,\n\t0xd2,0xd2,0xcf,0x00,0xd4,0xd3,0xd0,0x00,0xd5,0xd5,0xd1,0x00,0xd6,0xd6,0xd2,0x00,0xd7,0xd7,0xd3,0x00,0xd8,0xd8,0xd4,0x00,0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,\n\t0xdb,0xdb,0xd7,0x00,0xdd,0xdc,0xd9,0x00,0xde,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,\n\t0xe5,0xe3,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,\n\t0xed,0xec,0xe8,0x00,0xee,0xed,0xe9,0x00,0xef,0xef,0xea,0x00,0xf0,0xf0,0xeb,0x00,0xf1,0xf1,0xec,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,\n\t0xf6,0xf5,0xf1,0x00,0xf7,0xf6,0xf2,0x00,0xf8,0xf8,0xf3,0x00,0xf9,0xf9,0xf4,0x00,0xfa,0xfa,0xf5,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfd,0xf8,0x00,0xfe,0xfe,0xf9,0x00,\n\t0xff,0xff,0xfa,0x00,0xff,0xff,0xfb,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x15,0x00,\n\t0x17,0x16,0x16,0x00,0x18,0x17,0x17,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,\n\t0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2f,0x2e,0x2e,0x00,0x30,0x2f,0x2f,0x00,\n\t0x31,0x30,0x30,0x00,0x32,0x31,0x31,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x38,0x38,0x37,0x00,0x39,0x39,0x38,0x00,\n\t0x3a,0x3a,0x39,0x00,0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,\n\t0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x45,0x44,0x00,0x45,0x46,0x45,0x00,0x46,0x47,0x46,0x00,0x47,0x48,0x47,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,\n\t0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4e,0x4d,0x4d,0x00,0x4f,0x4e,0x4e,0x00,0x50,0x4f,0x4f,0x00,0x51,0x50,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,\n\t0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x57,0x55,0x00,0x57,0x58,0x56,0x00,0x58,0x59,0x57,0x00,0x5a,0x5b,0x59,0x00,0x5c,0x5c,0x5a,0x00,0x5d,0x5e,0x5c,0x00,\n\t0x5f,0x5f,0x5d,0x00,0x60,0x60,0x5e,0x00,0x61,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,\n\t0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,\n\t0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,\n\t0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7b,0x7b,0x79,0x00,0x7c,0x7c,0x7a,0x00,0x7d,0x7d,0x7b,0x00,0x7e,0x7e,0x7c,0x00,0x7f,0x80,0x7d,0x00,0x7f,0x81,0x7e,0x00,\n\t0x80,0x82,0x7f,0x00,0x81,0x83,0x80,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x88,0x89,0x86,0x00,0x89,0x8a,0x87,0x00,\n\t0x8a,0x8b,0x88,0x00,0x8b,0x8c,0x89,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,\n\t0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x99,0x9b,0x98,0x00,0x9a,0x9c,0x99,0x00,\n\t0x9b,0x9d,0x9a,0x00,0x9c,0x9e,0x9b,0x00,0x9e,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa3,0xa4,0xa1,0x00,0xa4,0xa5,0xa2,0x00,\n\t0xa5,0xa6,0xa3,0x00,0xa6,0xa7,0xa4,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,\n\t0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb1,0xb1,0xae,0x00,0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb6,0xb2,0x00,0xb6,0xb7,0xb3,0x00,\n\t0xb7,0xb8,0xb4,0x00,0xb8,0xb9,0xb5,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,\n\t0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,\n\t0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xce,0xcb,0x00,0xce,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,\n\t0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd5,0xd5,0xd1,0x00,0xd6,0xd6,0xd2,0x00,0xd7,0xd7,0xd3,0x00,0xd8,0xd8,0xd4,0x00,0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,\n\t0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xde,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,\n\t0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe6,0xe7,0xe3,0x00,0xe7,0xe8,0xe4,0x00,0xe8,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,\n\t0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xef,0xea,0x00,0xef,0xf0,0xeb,0x00,0xf0,0xf1,0xec,0x00,0xf1,0xf2,0xed,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,\n\t0xf5,0xf5,0xf1,0x00,0xf6,0xf6,0xf2,0x00,0xf7,0xf8,0xf3,0x00,0xf8,0xf9,0xf4,0x00,0xf9,0xfa,0xf5,0x00,0xfb,0xfb,0xf6,0x00,0xfc,0xfd,0xf8,0x00,0xfe,0xfe,0xf9,0x00,\n\t0xff,0xff,0xfa,0x00,0xff,0xff,0xfb,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0e,0x0e,0x0e,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x15,0x00,\n\t0x17,0x16,0x16,0x00,0x18,0x17,0x17,0x00,0x19,0x18,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x27,0x00,\n\t0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x30,0x2f,0x2f,0x00,\n\t0x31,0x30,0x30,0x00,0x32,0x31,0x31,0x00,0x33,0x32,0x32,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x39,0x38,0x00,\n\t0x3a,0x3a,0x39,0x00,0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x41,0x00,\n\t0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x46,0x45,0x00,0x46,0x47,0x46,0x00,0x47,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x4a,0x00,\n\t0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4f,0x4e,0x4e,0x00,0x50,0x4f,0x4f,0x00,0x51,0x50,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,\n\t0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x58,0x56,0x00,0x58,0x59,0x57,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5c,0x5a,0x00,0x5d,0x5d,0x5c,0x00,\n\t0x5f,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x66,0x67,0x65,0x00,\n\t0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,\n\t0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,\n\t0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7c,0x7c,0x7a,0x00,0x7d,0x7d,0x7b,0x00,0x7e,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x81,0x7e,0x00,\n\t0x80,0x82,0x7f,0x00,0x81,0x83,0x80,0x00,0x83,0x84,0x81,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x89,0x8a,0x87,0x00,\n\t0x8a,0x8b,0x88,0x00,0x8b,0x8c,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x93,0x90,0x00,\n\t0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9a,0x9c,0x99,0x00,\n\t0x9b,0x9d,0x9a,0x00,0x9c,0x9e,0x9b,0x00,0x9e,0x9f,0x9c,0x00,0x9f,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa5,0xa2,0x00,\n\t0xa5,0xa6,0xa3,0x00,0xa6,0xa7,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xae,0xab,0x00,\n\t0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb7,0xb3,0x00,\n\t0xb7,0xb8,0xb4,0x00,0xb8,0xb9,0xb5,0x00,0xb9,0xba,0xb6,0x00,0xba,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,\n\t0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,\n\t0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xce,0xcb,0x00,0xce,0xcf,0xcc,0x00,0xcf,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,\n\t0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd6,0xd6,0xd2,0x00,0xd7,0xd7,0xd3,0x00,0xd8,0xd8,0xd4,0x00,0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,\n\t0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,\n\t0xe4,0xe3,0xe0,0x00,0xe5,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe7,0xe3,0x00,0xe7,0xe8,0xe4,0x00,0xe8,0xe9,0xe5,0x00,0xe9,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,\n\t0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xf0,0xeb,0x00,0xf0,0xf1,0xec,0x00,0xf1,0xf2,0xed,0x00,0xf3,0xf3,0xee,0x00,0xf4,0xf4,0xf0,0x00,\n\t0xf5,0xf5,0xf1,0x00,0xf6,0xf6,0xf2,0x00,0xf7,0xf7,0xf3,0x00,0xf8,0xf9,0xf4,0x00,0xf9,0xfa,0xf5,0x00,0xfb,0xfb,0xf6,0x00,0xfc,0xfc,0xf7,0x00,0xfd,0xfe,0xf9,0x00,\n\t0xff,0xff,0xfa,0x00,0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x15,0x00,\n\t0x17,0x16,0x16,0x00,0x18,0x17,0x17,0x00,0x19,0x18,0x19,0x00,0x1a,0x19,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,\n\t0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,\n\t0x31,0x30,0x30,0x00,0x32,0x31,0x31,0x00,0x33,0x32,0x32,0x00,0x34,0x33,0x33,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,\n\t0x3a,0x3a,0x39,0x00,0x3b,0x3b,0x3a,0x00,0x3c,0x3c,0x3b,0x00,0x3d,0x3d,0x3c,0x00,0x3e,0x3e,0x3d,0x00,0x3f,0x3f,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,\n\t0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x47,0x46,0x00,0x47,0x48,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,\n\t0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x50,0x4f,0x4f,0x00,0x51,0x50,0x50,0x00,0x52,0x52,0x51,0x00,0x53,0x53,0x52,0x00,\n\t0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x59,0x57,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5c,0x5a,0x00,0x5d,0x5d,0x5c,0x00,\n\t0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,\n\t0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,\n\t0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,\n\t0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7d,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,\n\t0x80,0x82,0x7f,0x00,0x81,0x83,0x80,0x00,0x83,0x84,0x81,0x00,0x84,0x85,0x82,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,\n\t0x8a,0x8b,0x88,0x00,0x8b,0x8c,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8b,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8e,0x00,0x91,0x91,0x8f,0x00,0x92,0x92,0x90,0x00,\n\t0x93,0x94,0x91,0x00,0x94,0x95,0x92,0x00,0x95,0x96,0x93,0x00,0x96,0x97,0x94,0x00,0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9a,0x9b,0x99,0x00,\n\t0x9b,0x9d,0x9a,0x00,0x9c,0x9e,0x9b,0x00,0x9e,0x9f,0x9c,0x00,0x9f,0xa0,0x9d,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,\n\t0xa5,0xa6,0xa3,0x00,0xa6,0xa7,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,\n\t0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,\n\t0xb7,0xb8,0xb4,0x00,0xb8,0xb9,0xb5,0x00,0xb9,0xba,0xb6,0x00,0xba,0xbb,0xb7,0x00,0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,\n\t0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,\n\t0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xce,0xcb,0x00,0xce,0xcf,0xcc,0x00,0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,\n\t0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd7,0xd7,0xd3,0x00,0xd8,0xd8,0xd4,0x00,0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,\n\t0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,0xe3,0xe2,0xdf,0x00,\n\t0xe4,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe8,0xe4,0x00,0xe8,0xe9,0xe5,0x00,0xe9,0xea,0xe6,0x00,0xea,0xeb,0xe7,0x00,\n\t0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf1,0xec,0x00,0xf1,0xf2,0xed,0x00,0xf3,0xf3,0xee,0x00,0xf4,0xf4,0xef,0x00,\n\t0xf5,0xf5,0xf1,0x00,0xf6,0xf6,0xf2,0x00,0xf7,0xf7,0xf3,0x00,0xf8,0xf8,0xf4,0x00,0xfa,0xfa,0xf5,0x00,0xfb,0xfb,0xf6,0x00,0xfc,0xfc,0xf7,0x00,0xfd,0xfd,0xf8,0x00,\n\t0xff,0xff,0xfa,0x00,0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,\n\t0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,\n\t0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x36,0x36,0x35,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,\n\t0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,\n\t0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,\n\t0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x52,0x51,0x00,0x52,0x53,0x52,0x00,\n\t0x53,0x54,0x53,0x00,0x54,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5d,0x5c,0x00,\n\t0x5e,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x60,0x61,0x60,0x00,0x61,0x62,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,\n\t0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,\n\t0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,\n\t0x77,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,\n\t0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x85,0x83,0x00,0x86,0x87,0x84,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,\n\t0x89,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x91,0x91,0x8e,0x00,0x92,0x92,0x8f,0x00,\n\t0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x99,0x96,0x00,0x99,0x9a,0x98,0x00,0x9a,0x9b,0x99,0x00,\n\t0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9e,0x9f,0x9c,0x00,0x9f,0xa0,0x9d,0x00,0xa0,0xa1,0x9e,0x00,0xa1,0xa2,0x9f,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,\n\t0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,\n\t0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,0xb0,0xb1,0xad,0x00,0xb1,0xb2,0xae,0x00,0xb2,0xb3,0xaf,0x00,0xb3,0xb4,0xb0,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,\n\t0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,\n\t0xbf,0xbf,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,\n\t0xc8,0xc8,0xc5,0x00,0xc9,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xcd,0x00,\n\t0xd1,0xd1,0xce,0x00,0xd3,0xd3,0xcf,0x00,0xd4,0xd4,0xd0,0x00,0xd5,0xd5,0xd1,0x00,0xd6,0xd6,0xd2,0x00,0xd7,0xd7,0xd3,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,\n\t0xda,0xda,0xd7,0x00,0xdc,0xdb,0xd8,0x00,0xdd,0xdc,0xd9,0x00,0xde,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,\n\t0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,\n\t0xeb,0xeb,0xe8,0x00,0xec,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xea,0x00,0xf0,0xf0,0xeb,0x00,0xf1,0xf1,0xed,0x00,0xf3,0xf2,0xee,0x00,0xf4,0xf3,0xef,0x00,\n\t0xf5,0xf4,0xf0,0x00,0xf6,0xf6,0xf1,0x00,0xf7,0xf7,0xf2,0x00,0xf9,0xf8,0xf3,0x00,0xfa,0xf9,0xf4,0x00,0xfb,0xfb,0xf6,0x00,0xfc,0xfc,0xf7,0x00,0xfd,0xfd,0xf8,0x00,\n\t0xfe,0xfe,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x11,0x11,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,\n\t0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,\n\t0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,\n\t0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x40,0x40,0x3f,0x00,0x41,0x41,0x40,0x00,\n\t0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x49,0x49,0x48,0x00,0x4a,0x4a,0x49,0x00,\n\t0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x52,0x51,0x00,0x52,0x53,0x52,0x00,\n\t0x53,0x54,0x53,0x00,0x54,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,0x5c,0x5d,0x5c,0x00,\n\t0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x60,0x61,0x60,0x00,0x61,0x62,0x61,0x00,0x62,0x63,0x62,0x00,0x64,0x65,0x63,0x00,0x65,0x66,0x64,0x00,\n\t0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,\n\t0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,\n\t0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,\n\t0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x85,0x83,0x00,0x86,0x86,0x84,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,\n\t0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x91,0x91,0x8e,0x00,0x92,0x92,0x8f,0x00,\n\t0x93,0x93,0x90,0x00,0x94,0x94,0x91,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x9a,0x98,0x00,0x9a,0x9b,0x99,0x00,\n\t0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9e,0x9f,0x9c,0x00,0x9f,0xa0,0x9d,0x00,0xa0,0xa1,0x9e,0x00,0xa1,0xa2,0x9f,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,\n\t0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xac,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,\n\t0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,0xb0,0xb1,0xad,0x00,0xb1,0xb2,0xae,0x00,0xb2,0xb3,0xaf,0x00,0xb3,0xb4,0xb0,0x00,0xb5,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,\n\t0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,\n\t0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,\n\t0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xcd,0x00,\n\t0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd4,0xd4,0xd0,0x00,0xd5,0xd5,0xd1,0x00,0xd6,0xd6,0xd2,0x00,0xd7,0xd7,0xd3,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,\n\t0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdd,0xdc,0xd9,0x00,0xde,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,\n\t0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,\n\t0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xea,0x00,0xf0,0xf0,0xeb,0x00,0xf1,0xf1,0xec,0x00,0xf3,0xf2,0xee,0x00,0xf4,0xf3,0xef,0x00,\n\t0xf5,0xf4,0xf0,0x00,0xf6,0xf5,0xf1,0x00,0xf8,0xf7,0xf2,0x00,0xf9,0xf8,0xf3,0x00,0xfa,0xf9,0xf4,0x00,0xfb,0xfa,0xf5,0x00,0xfc,0xfc,0xf7,0x00,0xfd,0xfd,0xf8,0x00,\n\t0xfe,0xfe,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x12,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x14,0x14,0x15,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1e,0x1e,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,\n\t0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x2a,0x29,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,\n\t0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,\n\t0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x41,0x41,0x40,0x00,\n\t0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x4a,0x4a,0x49,0x00,\n\t0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x53,0x52,0x00,\n\t0x53,0x54,0x53,0x00,0x54,0x55,0x54,0x00,0x55,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5b,0x5a,0x00,0x5c,0x5c,0x5b,0x00,\n\t0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x60,0x61,0x60,0x00,0x61,0x62,0x61,0x00,0x62,0x63,0x62,0x00,0x63,0x64,0x63,0x00,0x65,0x66,0x64,0x00,\n\t0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6e,0x6f,0x6d,0x00,\n\t0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x76,0x00,\n\t0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,\n\t0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x85,0x83,0x00,0x86,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x88,0x89,0x87,0x00,\n\t0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,\n\t0x93,0x93,0x90,0x00,0x94,0x94,0x91,0x00,0x95,0x95,0x92,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9b,0x99,0x00,\n\t0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9f,0xa0,0x9d,0x00,0xa0,0xa1,0x9e,0x00,0xa1,0xa2,0x9f,0x00,0xa2,0xa3,0xa0,0x00,0xa4,0xa4,0xa2,0x00,\n\t0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,0xad,0xad,0xaa,0x00,\n\t0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,0xb0,0xb0,0xad,0x00,0xb1,0xb2,0xae,0x00,0xb2,0xb3,0xaf,0x00,0xb3,0xb4,0xb0,0x00,0xb4,0xb5,0xb1,0x00,0xb6,0xb6,0xb3,0x00,\n\t0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,\n\t0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,\n\t0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,\n\t0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd5,0xd5,0xd1,0x00,0xd6,0xd6,0xd2,0x00,0xd7,0xd7,0xd3,0x00,0xd8,0xd8,0xd4,0x00,0xd9,0xd9,0xd6,0x00,\n\t0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xde,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe2,0xde,0x00,\n\t0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe7,0x00,\n\t0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xef,0xef,0xea,0x00,0xf0,0xf0,0xeb,0x00,0xf1,0xf1,0xec,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,\n\t0xf5,0xf4,0xf0,0x00,0xf6,0xf5,0xf1,0x00,0xf7,0xf6,0xf2,0x00,0xf8,0xf8,0xf3,0x00,0xfa,0xf9,0xf4,0x00,0xfb,0xfa,0xf5,0x00,0xfc,0xfb,0xf6,0x00,0xfd,0xfd,0xf8,0x00,\n\t0xfe,0xfe,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x13,0x12,0x13,0x00,0x13,0x13,0x14,0x00,0x14,0x14,0x15,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,\n\t0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x2a,0x29,0x00,0x2b,0x2b,0x2a,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,\n\t0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,\n\t0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,\n\t0x42,0x42,0x41,0x00,0x43,0x43,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4b,0x4b,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,\n\t0x53,0x54,0x53,0x00,0x54,0x55,0x54,0x00,0x55,0x56,0x55,0x00,0x56,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5b,0x5a,0x00,0x5b,0x5c,0x5b,0x00,\n\t0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x60,0x61,0x60,0x00,0x61,0x62,0x61,0x00,0x62,0x63,0x62,0x00,0x63,0x64,0x63,0x00,0x64,0x65,0x64,0x00,\n\t0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,\n\t0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,\n\t0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,\n\t0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x85,0x85,0x83,0x00,0x86,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x88,0x88,0x86,0x00,\n\t0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,\n\t0x92,0x93,0x90,0x00,0x93,0x94,0x91,0x00,0x94,0x95,0x92,0x00,0x95,0x96,0x93,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,\n\t0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0xa0,0xa1,0x9e,0x00,0xa1,0xa2,0x9f,0x00,0xa2,0xa3,0xa0,0x00,0xa3,0xa4,0xa1,0x00,\n\t0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,\n\t0xae,0xae,0xab,0x00,0xaf,0xaf,0xac,0x00,0xb0,0xb0,0xad,0x00,0xb1,0xb1,0xae,0x00,0xb2,0xb3,0xaf,0x00,0xb3,0xb4,0xb0,0x00,0xb4,0xb5,0xb1,0x00,0xb5,0xb6,0xb2,0x00,\n\t0xb7,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,\n\t0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,\n\t0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,\n\t0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd6,0xd6,0xd2,0x00,0xd7,0xd7,0xd3,0x00,0xd8,0xd8,0xd4,0x00,0xd9,0xd9,0xd5,0x00,\n\t0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xdf,0xde,0xdb,0x00,0xe0,0xdf,0xdc,0x00,0xe1,0xe0,0xdd,0x00,0xe2,0xe1,0xde,0x00,\n\t0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,\n\t0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,\n\t0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf1,0x00,0xf7,0xf6,0xf2,0x00,0xf8,0xf7,0xf3,0x00,0xf9,0xf9,0xf4,0x00,0xfa,0xfa,0xf5,0x00,0xfb,0xfb,0xf6,0x00,0xfc,0xfc,0xf7,0x00,\n\t0xfe,0xfe,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x13,0x00,0x13,0x12,0x14,0x00,0x14,0x14,0x15,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x21,0x00,0x23,0x23,0x22,0x00,0x24,0x24,0x23,0x00,0x25,0x25,0x25,0x00,0x25,0x26,0x26,0x00,\n\t0x26,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x2a,0x29,0x00,0x2b,0x2b,0x2a,0x00,0x2c,0x2c,0x2b,0x00,0x2d,0x2d,0x2c,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,\n\t0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,\n\t0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,\n\t0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4d,0x4c,0x00,0x4d,0x4e,0x4d,0x00,0x4e,0x4f,0x4e,0x00,0x4f,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,\n\t0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x56,0x55,0x00,0x56,0x57,0x56,0x00,0x57,0x58,0x57,0x00,0x59,0x59,0x58,0x00,0x5a,0x5b,0x5a,0x00,0x5b,0x5c,0x5b,0x00,\n\t0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x63,0x00,0x64,0x65,0x64,0x00,\n\t0x65,0x66,0x65,0x00,0x66,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,\n\t0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x73,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,\n\t0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7f,0x7d,0x00,0x7e,0x80,0x7e,0x00,\n\t0x7f,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x88,0x88,0x86,0x00,\n\t0x89,0x89,0x87,0x00,0x8a,0x8b,0x88,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,\n\t0x92,0x92,0x90,0x00,0x93,0x93,0x91,0x00,0x94,0x95,0x92,0x00,0x95,0x96,0x93,0x00,0x96,0x97,0x94,0x00,0x97,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,\n\t0x9b,0x9b,0x99,0x00,0x9c,0x9d,0x9a,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa3,0xa0,0x00,0xa3,0xa4,0xa1,0x00,\n\t0xa4,0xa5,0xa2,0x00,0xa5,0xa6,0xa3,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,\n\t0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,\n\t0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xba,0x00,\n\t0xbf,0xbf,0xbb,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,\n\t0xc7,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xcf,0xcf,0xcd,0x00,\n\t0xd0,0xd0,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,\n\t0xd9,0xd9,0xd6,0x00,0xdb,0xda,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,\n\t0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe5,0xe1,0x00,0xe5,0xe6,0xe1,0x00,0xe6,0xe7,0xe2,0x00,0xe7,0xe8,0xe4,0x00,0xe8,0xe9,0xe5,0x00,0xe9,0xea,0xe6,0x00,\n\t0xea,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf2,0xee,0x00,0xf2,0xf3,0xef,0x00,\n\t0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf1,0x00,0xf6,0xf6,0xf2,0x00,0xf7,0xf7,0xf3,0x00,0xf9,0xf8,0xf4,0x00,0xfa,0xfa,0xf5,0x00,0xfb,0xfb,0xf6,0x00,0xfc,0xfc,0xf7,0x00,\n\t0xfd,0xfd,0xf8,0x00,0xfe,0xfe,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x13,0x00,0x13,0x12,0x14,0x00,0x14,0x14,0x15,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x21,0x00,0x23,0x23,0x22,0x00,0x24,0x24,0x23,0x00,0x25,0x25,0x25,0x00,0x25,0x26,0x26,0x00,\n\t0x26,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x2a,0x29,0x00,0x2b,0x2b,0x2a,0x00,0x2c,0x2c,0x2b,0x00,0x2d,0x2d,0x2c,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,\n\t0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,\n\t0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,\n\t0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x44,0x44,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4d,0x4c,0x00,0x4d,0x4e,0x4d,0x00,0x4e,0x4f,0x4e,0x00,0x4f,0x50,0x4f,0x00,0x51,0x51,0x50,0x00,0x52,0x52,0x51,0x00,\n\t0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x56,0x55,0x00,0x56,0x57,0x56,0x00,0x57,0x58,0x57,0x00,0x58,0x59,0x58,0x00,0x5a,0x5b,0x5a,0x00,0x5b,0x5c,0x5b,0x00,\n\t0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x63,0x00,0x64,0x65,0x64,0x00,\n\t0x65,0x66,0x65,0x00,0x66,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6b,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,\n\t0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,\n\t0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7f,0x7d,0x00,0x7e,0x80,0x7e,0x00,\n\t0x7f,0x81,0x7f,0x00,0x80,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x88,0x88,0x86,0x00,\n\t0x89,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,\n\t0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x94,0x95,0x92,0x00,0x95,0x96,0x93,0x00,0x96,0x97,0x94,0x00,0x97,0x98,0x95,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,\n\t0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa2,0xa3,0xa0,0x00,0xa3,0xa4,0xa1,0x00,\n\t0xa4,0xa5,0xa2,0x00,0xa5,0xa6,0xa3,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,\n\t0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,\n\t0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xba,0x00,\n\t0xbf,0xbf,0xbb,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,\n\t0xc7,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xcf,0xcf,0xcd,0x00,\n\t0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,\n\t0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,\n\t0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe5,0xe1,0x00,0xe5,0xe6,0xe1,0x00,0xe6,0xe7,0xe2,0x00,0xe7,0xe8,0xe3,0x00,0xe8,0xe9,0xe5,0x00,0xe9,0xea,0xe6,0x00,\n\t0xea,0xeb,0xe7,0x00,0xeb,0xec,0xe8,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf2,0xee,0x00,0xf2,0xf3,0xef,0x00,\n\t0xf3,0xf4,0xf0,0x00,0xf4,0xf5,0xf1,0x00,0xf6,0xf6,0xf2,0x00,0xf7,0xf7,0xf3,0x00,0xf8,0xf8,0xf4,0x00,0xf9,0xf9,0xf5,0x00,0xfb,0xfb,0xf6,0x00,0xfc,0xfc,0xf7,0x00,\n\t0xfd,0xfd,0xf8,0x00,0xfe,0xfe,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x13,0x00,0x13,0x12,0x14,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x22,0x22,0x21,0x00,0x23,0x23,0x22,0x00,0x24,0x24,0x23,0x00,0x24,0x25,0x24,0x00,0x25,0x26,0x26,0x00,\n\t0x26,0x27,0x27,0x00,0x27,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2b,0x2a,0x00,0x2c,0x2c,0x2b,0x00,0x2d,0x2d,0x2c,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,\n\t0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x38,0x38,0x38,0x00,\n\t0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,\n\t0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x45,0x45,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4e,0x4d,0x00,0x4e,0x4f,0x4e,0x00,0x4f,0x50,0x4f,0x00,0x50,0x51,0x50,0x00,0x52,0x52,0x51,0x00,\n\t0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x57,0x56,0x00,0x57,0x58,0x57,0x00,0x58,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5c,0x5b,0x00,\n\t0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x64,0x00,\n\t0x65,0x66,0x65,0x00,0x66,0x67,0x66,0x00,0x67,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,0x6d,0x6e,0x6c,0x00,\n\t0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x76,0x77,0x75,0x00,\n\t0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x80,0x7e,0x00,\n\t0x7f,0x81,0x7f,0x00,0x80,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x88,0x88,0x86,0x00,\n\t0x89,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,\n\t0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x96,0x93,0x00,0x96,0x97,0x94,0x00,0x97,0x98,0x95,0x00,0x98,0x99,0x96,0x00,0x99,0x9a,0x98,0x00,\n\t0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa3,0xa4,0xa1,0x00,\n\t0xa4,0xa5,0xa2,0x00,0xa5,0xa6,0xa3,0x00,0xa6,0xa7,0xa4,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xac,0xad,0xaa,0x00,\n\t0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb5,0xb5,0xb2,0x00,\n\t0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbe,0xbe,0xba,0x00,\n\t0xbf,0xbf,0xbb,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc7,0xc4,0x00,\n\t0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcc,0xc8,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,\n\t0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,\n\t0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xde,0x00,\n\t0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe6,0xe1,0x00,0xe6,0xe7,0xe2,0x00,0xe7,0xe8,0xe3,0x00,0xe8,0xe9,0xe4,0x00,0xe9,0xea,0xe6,0x00,\n\t0xea,0xeb,0xe7,0x00,0xeb,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf3,0xef,0x00,\n\t0xf3,0xf4,0xf0,0x00,0xf4,0xf5,0xf1,0x00,0xf6,0xf6,0xf2,0x00,0xf7,0xf7,0xf3,0x00,0xf8,0xf8,0xf4,0x00,0xf9,0xf9,0xf5,0x00,0xfa,0xfa,0xf6,0x00,0xfc,0xfc,0xf7,0x00,\n\t0xfd,0xfd,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x13,0x00,0x13,0x12,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x21,0x00,0x23,0x23,0x22,0x00,0x23,0x24,0x23,0x00,0x24,0x25,0x24,0x00,0x25,0x26,0x25,0x00,\n\t0x26,0x27,0x27,0x00,0x27,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2c,0x2c,0x2b,0x00,0x2d,0x2d,0x2c,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,\n\t0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,\n\t0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,\n\t0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x46,0x46,0x45,0x00,0x47,0x47,0x46,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4f,0x4e,0x00,0x4f,0x50,0x4f,0x00,0x50,0x51,0x50,0x00,0x51,0x52,0x51,0x00,\n\t0x53,0x53,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x58,0x57,0x00,0x58,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5c,0x5a,0x00,\n\t0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,\n\t0x65,0x66,0x65,0x00,0x66,0x67,0x66,0x00,0x67,0x68,0x67,0x00,0x68,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,\n\t0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,\n\t0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,\n\t0x7f,0x81,0x7f,0x00,0x80,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,\n\t0x89,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8c,0x8a,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,\n\t0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x97,0x94,0x00,0x97,0x98,0x95,0x00,0x98,0x99,0x96,0x00,0x99,0x9a,0x97,0x00,\n\t0x9a,0x9b,0x99,0x00,0x9b,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,\n\t0xa4,0xa5,0xa2,0x00,0xa5,0xa6,0xa3,0x00,0xa6,0xa7,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,\n\t0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,\n\t0xb6,0xb6,0xb3,0x00,0xb7,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,\n\t0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,\n\t0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcd,0xcd,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,\n\t0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,\n\t0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,\n\t0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe7,0xe2,0x00,0xe7,0xe8,0xe3,0x00,0xe8,0xe9,0xe4,0x00,0xe9,0xea,0xe5,0x00,\n\t0xea,0xeb,0xe7,0x00,0xeb,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,\n\t0xf3,0xf4,0xf0,0x00,0xf4,0xf5,0xf1,0x00,0xf6,0xf6,0xf2,0x00,0xf7,0xf7,0xf3,0x00,0xf8,0xf8,0xf4,0x00,0xf9,0xf9,0xf5,0x00,0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,\n\t0xfd,0xfd,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,\n\t0x26,0x26,0x26,0x00,0x27,0x28,0x27,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2e,0x2e,0x00,0x2e,0x2f,0x2f,0x00,\n\t0x2f,0x30,0x30,0x00,0x30,0x31,0x31,0x00,0x31,0x32,0x32,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,\n\t0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,\n\t0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x51,0x50,0x00,0x51,0x52,0x51,0x00,\n\t0x52,0x53,0x52,0x00,0x53,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5c,0x5a,0x00,\n\t0x5c,0x5d,0x5b,0x00,0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x61,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,\n\t0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,\n\t0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,\n\t0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,\n\t0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x85,0x83,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,\n\t0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,\n\t0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,\n\t0x9a,0x9a,0x98,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa1,0x9e,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,\n\t0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa7,0xa4,0x00,0xa6,0xa8,0xa5,0x00,0xa7,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,\n\t0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb1,0x00,\n\t0xb5,0xb6,0xb2,0x00,0xb6,0xb7,0xb4,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,\n\t0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,\n\t0xc7,0xc7,0xc4,0x00,0xc8,0xc9,0xc5,0x00,0xca,0xca,0xc6,0x00,0xcb,0xcb,0xc7,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,\n\t0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd7,0xd7,0xd3,0x00,0xd8,0xd8,0xd4,0x00,\n\t0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,\n\t0xe1,0xe1,0xde,0x00,0xe2,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,\n\t0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,\n\t0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf6,0xf6,0xf2,0x00,0xf7,0xf7,0xf3,0x00,0xf8,0xf8,0xf4,0x00,0xf9,0xf9,0xf5,0x00,0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf6,0x00,\n\t0xfc,0xfc,0xf7,0x00,0xfd,0xfd,0xf8,0x00,0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x14,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,\n\t0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2e,0x2e,0x00,0x2e,0x2f,0x2f,0x00,\n\t0x2f,0x30,0x30,0x00,0x30,0x31,0x31,0x00,0x31,0x32,0x32,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,\n\t0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,\n\t0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x51,0x50,0x00,0x51,0x52,0x51,0x00,\n\t0x52,0x53,0x52,0x00,0x53,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x59,0x57,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5c,0x5a,0x00,\n\t0x5c,0x5d,0x5b,0x00,0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x63,0x64,0x62,0x00,0x64,0x65,0x63,0x00,\n\t0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,\n\t0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,\n\t0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,\n\t0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x85,0x83,0x00,0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,\n\t0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,\n\t0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x98,0x99,0x97,0x00,\n\t0x99,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,\n\t0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa7,0xa4,0x00,0xa6,0xa8,0xa5,0x00,0xa7,0xa9,0xa6,0x00,0xa8,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,\n\t0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb1,0x00,\n\t0xb5,0xb6,0xb2,0x00,0xb6,0xb7,0xb3,0x00,0xb8,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,\n\t0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,\n\t0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xca,0xca,0xc6,0x00,0xcb,0xcb,0xc7,0x00,0xcc,0xcc,0xc8,0x00,0xcd,0xcd,0xc9,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,\n\t0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd7,0xd7,0xd3,0x00,0xd8,0xd8,0xd4,0x00,\n\t0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,\n\t0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,\n\t0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,\n\t0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf6,0xf6,0xf2,0x00,0xf7,0xf7,0xf3,0x00,0xf8,0xf8,0xf4,0x00,0xf9,0xf9,0xf5,0x00,0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf6,0x00,\n\t0xfc,0xfc,0xf7,0x00,0xfd,0xfd,0xf8,0x00,0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x15,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,\n\t0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2f,0x2f,0x00,\n\t0x2f,0x30,0x30,0x00,0x30,0x31,0x31,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,\n\t0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x40,0x40,0x40,0x00,\n\t0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x48,0x47,0x47,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x52,0x51,0x00,\n\t0x52,0x53,0x52,0x00,0x53,0x54,0x53,0x00,0x54,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,\n\t0x5c,0x5d,0x5b,0x00,0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x62,0x00,0x64,0x65,0x63,0x00,\n\t0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,\n\t0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,\n\t0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7f,0x7d,0x00,\n\t0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x85,0x83,0x00,0x86,0x86,0x84,0x00,0x87,0x88,0x86,0x00,\n\t0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x90,0x91,0x8f,0x00,\n\t0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,\n\t0x99,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9d,0x9a,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa3,0xa1,0x00,\n\t0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa8,0xa5,0x00,0xa7,0xa9,0xa6,0x00,0xa8,0xaa,0xa7,0x00,0xa9,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,\n\t0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb5,0xb1,0x00,\n\t0xb5,0xb6,0xb2,0x00,0xb6,0xb7,0xb3,0x00,0xb7,0xb8,0xb5,0x00,0xb9,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,\n\t0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,\n\t0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xcb,0xc7,0x00,0xcc,0xcc,0xc8,0x00,0xcd,0xcd,0xc9,0x00,0xce,0xce,0xca,0x00,0xcf,0xcf,0xcc,0x00,\n\t0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd8,0xd8,0xd4,0x00,\n\t0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdd,0x00,\n\t0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,\n\t0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xee,0xed,0xe9,0x00,0xef,0xee,0xeb,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf0,0xed,0x00,0xf2,0xf2,0xee,0x00,\n\t0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf1,0x00,0xf7,0xf6,0xf2,0x00,0xf8,0xf8,0xf4,0x00,0xf9,0xf9,0xf4,0x00,0xfa,0xfa,0xf5,0x00,0xfb,0xfb,0xf6,0x00,\n\t0xfc,0xfc,0xf7,0x00,0xfd,0xfd,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,\n\t0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x30,0x30,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,\n\t0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,\n\t0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x48,0x47,0x47,0x00,0x49,0x48,0x48,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,\n\t0x52,0x53,0x52,0x00,0x53,0x54,0x53,0x00,0x54,0x55,0x54,0x00,0x55,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,\n\t0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5c,0x00,0x5e,0x5f,0x5d,0x00,0x5f,0x60,0x5e,0x00,0x60,0x61,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x62,0x00,0x63,0x64,0x63,0x00,\n\t0x65,0x66,0x64,0x00,0x66,0x67,0x65,0x00,0x67,0x68,0x66,0x00,0x68,0x69,0x67,0x00,0x69,0x6a,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,\n\t0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,\n\t0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,\n\t0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x85,0x83,0x00,0x86,0x86,0x84,0x00,0x87,0x87,0x85,0x00,\n\t0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8f,0x00,\n\t0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,\n\t0x9a,0x9a,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,\n\t0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa9,0xa6,0x00,0xa8,0xaa,0xa7,0x00,0xa9,0xab,0xa8,0x00,0xaa,0xac,0xa9,0x00,\n\t0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xaf,0x00,0xb3,0xb3,0xb0,0x00,0xb4,0xb4,0xb1,0x00,\n\t0xb5,0xb6,0xb2,0x00,0xb6,0xb7,0xb3,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,\n\t0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,\n\t0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcc,0xc8,0x00,0xcc,0xcd,0xc9,0x00,0xcd,0xce,0xca,0x00,0xce,0xcf,0xcb,0x00,\n\t0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,\n\t0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,\n\t0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,\n\t0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xef,0xee,0xea,0x00,0xf0,0xef,0xeb,0x00,0xf1,0xf0,0xed,0x00,0xf2,0xf1,0xee,0x00,\n\t0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf1,0x00,0xf6,0xf6,0xf2,0x00,0xf8,0xf7,0xf3,0x00,0xf9,0xf8,0xf4,0x00,0xfa,0xf9,0xf5,0x00,0xfb,0xfa,0xf6,0x00,\n\t0xfc,0xfc,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,\n\t0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,\n\t0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,\n\t0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,\n\t0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x48,0x47,0x47,0x00,0x49,0x48,0x48,0x00,\n\t0x4a,0x49,0x49,0x00,0x4b,0x4a,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,\n\t0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x55,0x54,0x00,0x55,0x56,0x55,0x00,0x56,0x57,0x56,0x00,0x58,0x58,0x57,0x00,0x59,0x5a,0x59,0x00,0x5b,0x5b,0x5a,0x00,\n\t0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x62,0x60,0x00,0x62,0x63,0x62,0x00,0x63,0x64,0x63,0x00,\n\t0x64,0x65,0x64,0x00,0x65,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,\n\t0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,\n\t0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,\n\t0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x80,0x00,0x83,0x84,0x81,0x00,0x84,0x85,0x83,0x00,0x86,0x86,0x84,0x00,0x87,0x87,0x85,0x00,\n\t0x88,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8b,0x88,0x00,0x8b,0x8c,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8f,0x00,\n\t0x90,0x91,0x90,0x00,0x91,0x92,0x91,0x00,0x92,0x94,0x92,0x00,0x93,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x98,0x99,0x96,0x00,\n\t0x9a,0x9a,0x97,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,\n\t0xa2,0xa3,0xa1,0x00,0xa3,0xa5,0xa2,0x00,0xa5,0xa6,0xa3,0x00,0xa6,0xa7,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,\n\t0xab,0xac,0xa9,0x00,0xad,0xad,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,\n\t0xb4,0xb5,0xb2,0x00,0xb6,0xb6,0xb3,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,\n\t0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc5,0xc1,0x00,0xc5,0xc6,0xc2,0x00,\n\t0xc6,0xc7,0xc3,0x00,0xc7,0xc8,0xc4,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,\n\t0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd2,0xd2,0xce,0x00,0xd3,0xd3,0xcf,0x00,0xd4,0xd4,0xd0,0x00,0xd5,0xd5,0xd1,0x00,0xd6,0xd6,0xd2,0x00,0xd7,0xd7,0xd3,0x00,\n\t0xd8,0xd8,0xd4,0x00,0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,\n\t0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe8,0xe7,0xe3,0x00,0xe9,0xe8,0xe4,0x00,\n\t0xea,0xe9,0xe5,0x00,0xeb,0xea,0xe6,0x00,0xec,0xec,0xe7,0x00,0xed,0xed,0xe8,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf1,0xf0,0xec,0x00,0xf2,0xf1,0xee,0x00,\n\t0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf4,0xf1,0x00,0xf6,0xf5,0xf2,0x00,0xf7,0xf7,0xf3,0x00,0xf8,0xf8,0xf4,0x00,0xf9,0xf9,0xf5,0x00,0xfa,0xfa,0xf6,0x00,\n\t0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,\n\t0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,\n\t0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,\n\t0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,\n\t0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x48,0x47,0x47,0x00,0x49,0x48,0x48,0x00,\n\t0x4a,0x49,0x49,0x00,0x4b,0x4a,0x4a,0x00,0x4c,0x4c,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,\n\t0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x55,0x54,0x00,0x55,0x56,0x55,0x00,0x56,0x57,0x56,0x00,0x58,0x58,0x58,0x00,0x59,0x5a,0x59,0x00,0x5b,0x5b,0x5b,0x00,\n\t0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x63,0x62,0x00,0x63,0x64,0x63,0x00,\n\t0x64,0x65,0x64,0x00,0x65,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6c,0x6a,0x00,0x6c,0x6d,0x6b,0x00,\n\t0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,0x74,0x75,0x73,0x00,0x75,0x76,0x74,0x00,\n\t0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,\n\t0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x80,0x00,0x83,0x84,0x81,0x00,0x84,0x85,0x82,0x00,0x86,0x86,0x84,0x00,0x87,0x87,0x85,0x00,\n\t0x88,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8b,0x88,0x00,0x8b,0x8c,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8f,0x00,\n\t0x90,0x91,0x90,0x00,0x91,0x92,0x91,0x00,0x92,0x94,0x92,0x00,0x93,0x95,0x93,0x00,0x94,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x99,0x99,0x96,0x00,\n\t0x9a,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9d,0x9d,0x9a,0x00,0x9e,0x9e,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9d,0x00,0xa1,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,\n\t0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa5,0xa6,0xa3,0x00,0xa6,0xa7,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,\n\t0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,\n\t0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbc,0xbc,0xb9,0x00,\n\t0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc5,0xc1,0x00,0xc5,0xc6,0xc2,0x00,\n\t0xc6,0xc7,0xc3,0x00,0xc7,0xc8,0xc4,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,\n\t0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd2,0xd2,0xce,0x00,0xd3,0xd3,0xcf,0x00,0xd4,0xd4,0xd0,0x00,0xd5,0xd5,0xd1,0x00,0xd6,0xd6,0xd2,0x00,0xd7,0xd7,0xd3,0x00,\n\t0xd8,0xd8,0xd4,0x00,0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,\n\t0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe8,0xe7,0xe3,0x00,0xe9,0xe8,0xe4,0x00,\n\t0xea,0xe9,0xe5,0x00,0xeb,0xea,0xe6,0x00,0xec,0xec,0xe7,0x00,0xed,0xed,0xe8,0x00,0xee,0xee,0xe9,0x00,0xef,0xef,0xeb,0x00,0xf1,0xf0,0xec,0x00,0xf2,0xf1,0xee,0x00,\n\t0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf4,0xf1,0x00,0xf6,0xf5,0xf1,0x00,0xf7,0xf6,0xf2,0x00,0xf8,0xf7,0xf3,0x00,0xf9,0xf9,0xf5,0x00,0xfa,0xfa,0xf6,0x00,\n\t0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,\n\t0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,\n\t0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x29,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x37,0x37,0x37,0x00,\n\t0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,\n\t0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x49,0x48,0x48,0x00,\n\t0x4a,0x49,0x49,0x00,0x4b,0x4a,0x4a,0x00,0x4c,0x4b,0x4b,0x00,0x4d,0x4d,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,\n\t0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x56,0x55,0x00,0x56,0x57,0x56,0x00,0x57,0x58,0x57,0x00,0x59,0x59,0x59,0x00,0x5a,0x5b,0x5a,0x00,\n\t0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x64,0x63,0x00,\n\t0x64,0x65,0x64,0x00,0x65,0x66,0x65,0x00,0x66,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6b,0x6a,0x00,0x6c,0x6d,0x6b,0x00,\n\t0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,0x75,0x76,0x74,0x00,\n\t0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7e,0x7e,0x7d,0x00,\n\t0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x7f,0x00,0x82,0x83,0x80,0x00,0x83,0x84,0x81,0x00,0x84,0x85,0x82,0x00,0x85,0x86,0x84,0x00,0x87,0x87,0x85,0x00,\n\t0x88,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8c,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,\n\t0x90,0x91,0x90,0x00,0x91,0x92,0x91,0x00,0x92,0x93,0x92,0x00,0x93,0x95,0x93,0x00,0x94,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x95,0x00,0x98,0x99,0x96,0x00,\n\t0x9a,0x9a,0x97,0x00,0x9b,0x9b,0x98,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9e,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0xa0,0xa0,0x9d,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,\n\t0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa6,0xa7,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,\n\t0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,\n\t0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,\n\t0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc6,0xc2,0x00,\n\t0xc6,0xc7,0xc3,0x00,0xc7,0xc8,0xc4,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,\n\t0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd3,0xd3,0xcf,0x00,0xd4,0xd4,0xd0,0x00,0xd5,0xd5,0xd1,0x00,0xd6,0xd6,0xd2,0x00,0xd7,0xd7,0xd3,0x00,\n\t0xd8,0xd8,0xd4,0x00,0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xe0,0xe0,0xdc,0x00,\n\t0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,\n\t0xea,0xe9,0xe5,0x00,0xeb,0xea,0xe6,0x00,0xec,0xeb,0xe7,0x00,0xed,0xed,0xe8,0x00,0xee,0xee,0xe9,0x00,0xef,0xef,0xea,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,\n\t0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xef,0x00,0xf5,0xf4,0xf0,0x00,0xf6,0xf5,0xf1,0x00,0xf7,0xf6,0xf2,0x00,0xf8,0xf7,0xf3,0x00,0xf9,0xf8,0xf4,0x00,0xfa,0xfa,0xf6,0x00,\n\t0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,\n\t0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,\n\t0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x29,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,\n\t0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,\n\t0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,\n\t0x4a,0x49,0x49,0x00,0x4b,0x4a,0x4a,0x00,0x4c,0x4b,0x4b,0x00,0x4d,0x4c,0x4c,0x00,0x4e,0x4e,0x4d,0x00,0x4f,0x4f,0x4e,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,\n\t0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x57,0x56,0x00,0x57,0x58,0x57,0x00,0x59,0x59,0x59,0x00,0x5a,0x5b,0x5a,0x00,\n\t0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,\n\t0x64,0x65,0x64,0x00,0x65,0x66,0x65,0x00,0x66,0x67,0x66,0x00,0x67,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,\n\t0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,\n\t0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,\n\t0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,0x83,0x84,0x81,0x00,0x84,0x85,0x82,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,\n\t0x88,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8b,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,\n\t0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x94,0x00,0x97,0x98,0x95,0x00,0x98,0x99,0x96,0x00,\n\t0x99,0x9a,0x97,0x00,0x9a,0x9b,0x98,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9f,0x9f,0x9c,0x00,0x9f,0xa0,0x9d,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,\n\t0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,\n\t0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,\n\t0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb9,0xba,0xb7,0x00,0xba,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,\n\t0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,\n\t0xc6,0xc7,0xc3,0x00,0xc7,0xc8,0xc4,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xce,0xcb,0x00,\n\t0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd4,0xd4,0xd0,0x00,0xd5,0xd5,0xd1,0x00,0xd6,0xd6,0xd2,0x00,0xd7,0xd7,0xd3,0x00,\n\t0xd8,0xd8,0xd4,0x00,0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,0xdb,0xdb,0xd7,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,\n\t0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,\n\t0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xee,0xee,0xe9,0x00,0xef,0xef,0xea,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,\n\t0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf1,0x00,0xf7,0xf6,0xf2,0x00,0xf8,0xf7,0xf3,0x00,0xf9,0xf8,0xf4,0x00,0xfa,0xf9,0xf5,0x00,\n\t0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,\n\t0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x24,0x25,0x24,0x00,\n\t0x25,0x26,0x25,0x00,0x27,0x27,0x27,0x00,0x28,0x29,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,\n\t0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,\n\t0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x46,0x45,0x45,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,\n\t0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,\n\t0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x58,0x57,0x00,0x59,0x59,0x59,0x00,0x5a,0x5b,0x5a,0x00,\n\t0x5b,0x5c,0x5b,0x00,0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x60,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,\n\t0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x67,0x66,0x00,0x67,0x68,0x67,0x00,0x68,0x69,0x68,0x00,0x69,0x6a,0x69,0x00,0x6a,0x6b,0x6a,0x00,0x6b,0x6c,0x6b,0x00,\n\t0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,\n\t0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,\n\t0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,\n\t0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,\n\t0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,\n\t0x99,0x99,0x97,0x00,0x9a,0x9b,0x98,0x00,0x9b,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,\n\t0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,\n\t0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb2,0xb3,0xaf,0x00,0xb3,0xb4,0xb0,0x00,\n\t0xb4,0xb5,0xb1,0x00,0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,\n\t0xbd,0xbc,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,\n\t0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xcd,0xcb,0x00,\n\t0xce,0xce,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd6,0xd2,0x00,0xd6,0xd7,0xd3,0x00,\n\t0xd7,0xd8,0xd4,0x00,0xd8,0xd9,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdd,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,\n\t0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,\n\t0xe9,0xe8,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,\n\t0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xee,0x00,0xf4,0xf4,0xef,0x00,0xf5,0xf5,0xf0,0x00,0xf6,0xf6,0xf1,0x00,0xf7,0xf7,0xf3,0x00,0xf8,0xf8,0xf4,0x00,0xf9,0xf9,0xf5,0x00,\n\t0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1c,0x1c,0x1c,0x00,0x1d,0x1d,0x1d,0x00,\n\t0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x24,0x25,0x24,0x00,\n\t0x25,0x26,0x25,0x00,0x27,0x27,0x27,0x00,0x28,0x29,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,\n\t0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,\n\t0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,\n\t0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,\n\t0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x58,0x57,0x00,0x59,0x59,0x59,0x00,0x5a,0x5b,0x5a,0x00,\n\t0x5b,0x5c,0x5b,0x00,0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x60,0x61,0x60,0x00,0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,\n\t0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x67,0x66,0x00,0x67,0x68,0x67,0x00,0x68,0x69,0x68,0x00,0x69,0x6a,0x69,0x00,0x6a,0x6b,0x6a,0x00,0x6b,0x6c,0x6b,0x00,\n\t0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,\n\t0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,\n\t0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,\n\t0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8e,0x8f,0x8c,0x00,0x8f,0x90,0x8d,0x00,\n\t0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x93,0x93,0x91,0x00,0x94,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x97,0x98,0x96,0x00,\n\t0x98,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,\n\t0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,\n\t0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb2,0xb3,0xaf,0x00,0xb3,0xb4,0xb0,0x00,\n\t0xb4,0xb5,0xb1,0x00,0xb5,0xb6,0xb2,0x00,0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbb,0xb9,0x00,\n\t0xbd,0xbc,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,\n\t0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xcd,0xcb,0x00,\n\t0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd6,0xd2,0x00,0xd6,0xd7,0xd3,0x00,\n\t0xd7,0xd8,0xd4,0x00,0xd8,0xd9,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,\n\t0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,\n\t0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,\n\t0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf4,0xf4,0xef,0x00,0xf5,0xf5,0xf0,0x00,0xf6,0xf6,0xf1,0x00,0xf7,0xf7,0xf2,0x00,0xf8,0xf8,0xf4,0x00,0xf9,0xf9,0xf5,0x00,\n\t0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0d,0x0d,0x0d,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1d,0x1d,0x1d,0x00,\n\t0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x23,0x24,0x24,0x00,0x24,0x25,0x24,0x00,\n\t0x25,0x26,0x25,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,\n\t0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,\n\t0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,\n\t0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x51,0x51,0x51,0x00,\n\t0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x59,0x58,0x00,0x5a,0x5a,0x5a,0x00,\n\t0x5b,0x5c,0x5b,0x00,0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x60,0x61,0x60,0x00,0x61,0x62,0x61,0x00,0x63,0x63,0x62,0x00,\n\t0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x68,0x67,0x00,0x68,0x69,0x68,0x00,0x69,0x6a,0x69,0x00,0x6a,0x6b,0x6a,0x00,0x6b,0x6c,0x6b,0x00,\n\t0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,\n\t0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,\n\t0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x85,0x83,0x00,0x86,0x87,0x85,0x00,\n\t0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8f,0x90,0x8d,0x00,\n\t0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,\n\t0x98,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9b,0x9c,0x99,0x00,0x9c,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa2,0xa0,0x00,\n\t0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xaa,0xab,0xa8,0x00,\n\t0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb3,0xb4,0xb0,0x00,\n\t0xb4,0xb5,0xb1,0x00,0xb5,0xb6,0xb2,0x00,0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbb,0xb9,0x00,\n\t0xbd,0xbc,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,\n\t0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,\n\t0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd7,0xd3,0x00,\n\t0xd7,0xd8,0xd4,0x00,0xd8,0xd9,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,\n\t0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,\n\t0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,\n\t0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf5,0xf5,0xf0,0x00,0xf6,0xf6,0xf1,0x00,0xf7,0xf7,0xf2,0x00,0xf8,0xf8,0xf4,0x00,0xf9,0xf9,0xf5,0x00,\n\t0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfe,0xfe,0xfa,0x00,0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x22,0x23,0x23,0x00,0x23,0x24,0x24,0x00,0x24,0x25,0x24,0x00,\n\t0x25,0x26,0x25,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,\n\t0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,\n\t0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,\n\t0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,\n\t0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x59,0x58,0x00,0x59,0x5a,0x5a,0x00,\n\t0x5b,0x5c,0x5b,0x00,0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x60,0x61,0x60,0x00,0x61,0x62,0x61,0x00,0x62,0x63,0x62,0x00,\n\t0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x69,0x68,0x00,0x69,0x6a,0x69,0x00,0x6a,0x6b,0x6a,0x00,0x6b,0x6c,0x6b,0x00,\n\t0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x71,0x00,0x73,0x74,0x72,0x00,0x74,0x75,0x73,0x00,\n\t0x75,0x76,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,\n\t0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,\n\t0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,0x8f,0x90,0x8d,0x00,\n\t0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,\n\t0x98,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9b,0x9c,0x99,0x00,0x9c,0x9d,0x9a,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,\n\t0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,\n\t0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,\n\t0xb4,0xb5,0xb1,0x00,0xb5,0xb6,0xb2,0x00,0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,\n\t0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,\n\t0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,\n\t0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,\n\t0xd7,0xd8,0xd4,0x00,0xd8,0xd9,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xda,0xdb,0xd7,0x00,0xdb,0xdc,0xd8,0x00,0xdc,0xdd,0xd9,0x00,0xdd,0xde,0xda,0x00,0xde,0xdf,0xdb,0x00,\n\t0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,\n\t0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,\n\t0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf6,0xf6,0xf1,0x00,0xf7,0xf7,0xf2,0x00,0xf8,0xf8,0xf4,0x00,0xf9,0xf9,0xf5,0x00,\n\t0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,\n\t0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,\n\t0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,\n\t0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,\n\t0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x57,0x00,0x58,0x59,0x58,0x00,0x59,0x5a,0x5a,0x00,\n\t0x5a,0x5b,0x5b,0x00,0x5b,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x62,0x61,0x00,0x62,0x63,0x62,0x00,\n\t0x63,0x64,0x63,0x00,0x64,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,\n\t0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x73,0x73,0x72,0x00,0x74,0x74,0x73,0x00,\n\t0x75,0x75,0x74,0x00,0x76,0x77,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,\n\t0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,\n\t0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8c,0x00,0x8f,0x90,0x8d,0x00,\n\t0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x95,0x00,\n\t0x98,0x99,0x96,0x00,0x99,0x9a,0x98,0x00,0x9b,0x9c,0x99,0x00,0x9c,0x9d,0x9a,0x00,0x9d,0x9e,0x9b,0x00,0x9e,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,\n\t0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,\n\t0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,0xad,0xae,0xaa,0x00,0xae,0xaf,0xab,0x00,0xaf,0xb0,0xac,0x00,0xb0,0xb1,0xad,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,\n\t0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xbb,0xb8,0x00,0xba,0xbc,0xb9,0x00,\n\t0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,\n\t0xc5,0xc5,0xc2,0x00,0xc6,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,\n\t0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd1,0xcd,0x00,0xd1,0xd2,0xce,0x00,0xd2,0xd3,0xcf,0x00,0xd3,0xd4,0xd0,0x00,0xd5,0xd5,0xd1,0x00,0xd6,0xd6,0xd2,0x00,\n\t0xd7,0xd7,0xd3,0x00,0xd8,0xd8,0xd4,0x00,0xd9,0xda,0xd6,0x00,0xda,0xdb,0xd7,0x00,0xdb,0xdc,0xd8,0x00,0xdc,0xdd,0xd9,0x00,0xdd,0xde,0xda,0x00,0xde,0xde,0xdb,0x00,\n\t0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,\n\t0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,\n\t0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf1,0x00,0xf6,0xf6,0xf2,0x00,0xf8,0xf8,0xf4,0x00,0xf9,0xf9,0xf5,0x00,\n\t0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x10,0x10,0x10,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x28,0x28,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,\n\t0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,\n\t0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,\n\t0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,\n\t0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x54,0x54,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x57,0x00,0x58,0x59,0x58,0x00,0x59,0x5a,0x5a,0x00,\n\t0x5a,0x5b,0x5b,0x00,0x5b,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x62,0x61,0x00,0x62,0x63,0x62,0x00,\n\t0x63,0x64,0x63,0x00,0x64,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6b,0x69,0x00,0x6b,0x6c,0x6a,0x00,\n\t0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x73,0x73,0x72,0x00,0x74,0x74,0x73,0x00,\n\t0x75,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x78,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,\n\t0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x80,0x82,0x80,0x00,0x81,0x83,0x81,0x00,0x82,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,\n\t0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8c,0x8d,0x8a,0x00,0x8d,0x8e,0x8c,0x00,0x8f,0x90,0x8d,0x00,\n\t0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x91,0x00,0x92,0x94,0x92,0x00,0x93,0x95,0x93,0x00,0x94,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x95,0x00,\n\t0x98,0x99,0x96,0x00,0x99,0x9a,0x97,0x00,0x9b,0x9c,0x99,0x00,0x9c,0x9d,0x9a,0x00,0x9d,0x9e,0x9b,0x00,0x9e,0x9f,0x9c,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,\n\t0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,\n\t0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,0xad,0xae,0xaa,0x00,0xae,0xaf,0xab,0x00,0xaf,0xb0,0xac,0x00,0xb0,0xb1,0xad,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,\n\t0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xbb,0xb8,0x00,0xba,0xbc,0xb9,0x00,\n\t0xbb,0xbd,0xba,0x00,0xbc,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,\n\t0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,\n\t0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd1,0xcd,0x00,0xd1,0xd2,0xce,0x00,0xd2,0xd3,0xcf,0x00,0xd3,0xd4,0xd0,0x00,0xd5,0xd5,0xd1,0x00,0xd6,0xd6,0xd2,0x00,\n\t0xd7,0xd7,0xd3,0x00,0xd8,0xd8,0xd4,0x00,0xd9,0xda,0xd6,0x00,0xda,0xdb,0xd7,0x00,0xdb,0xdc,0xd8,0x00,0xdc,0xdd,0xd9,0x00,0xdd,0xde,0xda,0x00,0xde,0xde,0xdb,0x00,\n\t0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,\n\t0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xeb,0xea,0xe7,0x00,0xec,0xeb,0xe8,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,\n\t0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf1,0x00,0xf6,0xf6,0xf2,0x00,0xf8,0xf8,0xf4,0x00,0xf9,0xf9,0xf5,0x00,\n\t0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x11,0x11,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x28,0x28,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2e,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x35,0x34,0x35,0x00,0x36,0x36,0x36,0x00,\n\t0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3f,0x3f,0x3f,0x00,\n\t0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x48,0x48,0x48,0x00,\n\t0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,\n\t0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x55,0x55,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x58,0x00,0x59,0x5a,0x59,0x00,\n\t0x5a,0x5b,0x5b,0x00,0x5b,0x5c,0x5c,0x00,0x5c,0x5d,0x5c,0x00,0x5e,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x63,0x62,0x00,\n\t0x63,0x64,0x63,0x00,0x64,0x65,0x64,0x00,0x65,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6c,0x6a,0x00,\n\t0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,0x74,0x74,0x73,0x00,\n\t0x75,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x79,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7d,0x7e,0x7c,0x00,\n\t0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x80,0x82,0x80,0x00,0x81,0x83,0x81,0x00,0x82,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,\n\t0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8c,0x8c,0x8a,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,\n\t0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x91,0x00,0x92,0x94,0x92,0x00,0x93,0x95,0x93,0x00,0x94,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x95,0x00,\n\t0x98,0x99,0x96,0x00,0x99,0x9a,0x97,0x00,0x9a,0x9b,0x99,0x00,0x9c,0x9d,0x9a,0x00,0x9d,0x9e,0x9b,0x00,0x9e,0x9f,0x9c,0x00,0x9f,0xa0,0x9d,0x00,0xa1,0xa1,0x9f,0x00,\n\t0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xaa,0xa7,0x00,\n\t0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xae,0xaf,0xab,0x00,0xaf,0xb0,0xac,0x00,0xb0,0xb1,0xad,0x00,0xb1,0xb2,0xae,0x00,0xb2,0xb3,0xb0,0x00,\n\t0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbc,0xb9,0x00,\n\t0xbb,0xbd,0xba,0x00,0xbc,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,\n\t0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,\n\t0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd2,0xce,0x00,0xd2,0xd3,0xcf,0x00,0xd3,0xd4,0xd0,0x00,0xd4,0xd5,0xd1,0x00,0xd6,0xd6,0xd2,0x00,\n\t0xd7,0xd7,0xd3,0x00,0xd8,0xd8,0xd4,0x00,0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdc,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,\n\t0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,\n\t0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xec,0xeb,0xe7,0x00,0xed,0xec,0xe9,0x00,0xee,0xed,0xea,0x00,0xef,0xee,0xeb,0x00,0xf0,0xf0,0xec,0x00,\n\t0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf1,0x00,0xf6,0xf6,0xf2,0x00,0xf7,0xf7,0xf3,0x00,0xf9,0xf9,0xf5,0x00,\n\t0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,\n\t0x16,0x15,0x16,0x00,0x17,0x16,0x16,0x00,0x18,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x28,0x28,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2f,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,\n\t0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,\n\t0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,\n\t0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,\n\t0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x56,0x56,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x58,0x00,0x59,0x5a,0x59,0x00,\n\t0x5a,0x5b,0x5b,0x00,0x5b,0x5c,0x5b,0x00,0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5f,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,\n\t0x63,0x64,0x63,0x00,0x64,0x65,0x64,0x00,0x65,0x66,0x65,0x00,0x66,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,0x6b,0x6b,0x6a,0x00,\n\t0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,\n\t0x75,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,\n\t0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,\n\t0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8c,0x8a,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,\n\t0x90,0x91,0x8e,0x00,0x91,0x92,0x8f,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x95,0x00,\n\t0x98,0x99,0x96,0x00,0x99,0x9a,0x97,0x00,0x9a,0x9b,0x99,0x00,0x9b,0x9c,0x9a,0x00,0x9d,0x9e,0x9b,0x00,0x9e,0x9f,0x9c,0x00,0x9f,0xa0,0x9d,0x00,0xa0,0xa1,0x9e,0x00,\n\t0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,\n\t0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xaf,0xb0,0xac,0x00,0xb0,0xb1,0xad,0x00,0xb1,0xb2,0xae,0x00,0xb2,0xb3,0xaf,0x00,\n\t0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,\n\t0xbb,0xbd,0xba,0x00,0xbc,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,\n\t0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,\n\t0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd3,0xcf,0x00,0xd3,0xd4,0xd0,0x00,0xd4,0xd5,0xd1,0x00,0xd5,0xd6,0xd2,0x00,\n\t0xd7,0xd7,0xd3,0x00,0xd8,0xd8,0xd4,0x00,0xd9,0xd9,0xd5,0x00,0xda,0xda,0xd6,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,\n\t0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,0xe7,0xe7,0xe3,0x00,\n\t0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xed,0xec,0xe8,0x00,0xee,0xed,0xe9,0x00,0xef,0xee,0xea,0x00,0xf0,0xef,0xeb,0x00,\n\t0xf1,0xf1,0xec,0x00,0xf2,0xf2,0xed,0x00,0xf3,0xf3,0xee,0x00,0xf4,0xf4,0xef,0x00,0xf5,0xf5,0xf1,0x00,0xf6,0xf6,0xf2,0x00,0xf7,0xf7,0xf3,0x00,0xf8,0xf8,0xf4,0x00,\n\t0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x14,0x00,\n\t0x16,0x15,0x15,0x00,0x17,0x16,0x16,0x00,0x18,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x28,0x28,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,\n\t0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,\n\t0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x42,0x42,0x00,0x42,0x43,0x43,0x00,0x43,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,\n\t0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,\n\t0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x57,0x56,0x00,0x58,0x58,0x58,0x00,0x59,0x5a,0x59,0x00,\n\t0x5a,0x5b,0x5a,0x00,0x5b,0x5c,0x5b,0x00,0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,\n\t0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x69,0x68,0x00,0x69,0x6a,0x69,0x00,0x6a,0x6b,0x6a,0x00,\n\t0x6b,0x6c,0x6b,0x00,0x6c,0x6d,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,\n\t0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,\n\t0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x80,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,\n\t0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8c,0x8a,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,\n\t0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x96,0x97,0x95,0x00,\n\t0x97,0x98,0x96,0x00,0x99,0x9a,0x97,0x00,0x9a,0x9b,0x99,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,\n\t0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,\n\t0xa9,0xaa,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,\n\t0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,\n\t0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,\n\t0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xc9,0x00,\n\t0xcd,0xcd,0xca,0x00,0xce,0xcf,0xcb,0x00,0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,\n\t0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xdb,0xd7,0x00,0xdb,0xdc,0xd8,0x00,0xdc,0xdd,0xd9,0x00,0xdd,0xde,0xda,0x00,\n\t0xde,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,\n\t0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xef,0xee,0xea,0x00,0xf0,0xef,0xeb,0x00,\n\t0xf1,0xf0,0xec,0x00,0xf2,0xf1,0xed,0x00,0xf3,0xf3,0xee,0x00,0xf3,0xf4,0xef,0x00,0xf4,0xf5,0xf0,0x00,0xf6,0xf6,0xf2,0x00,0xf7,0xf7,0xf3,0x00,0xf8,0xf8,0xf4,0x00,\n\t0xf9,0xf9,0xf5,0x00,0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x14,0x00,\n\t0x16,0x15,0x15,0x00,0x17,0x16,0x16,0x00,0x18,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x28,0x28,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,\n\t0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,\n\t0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x42,0x42,0x00,0x42,0x43,0x43,0x00,0x43,0x44,0x44,0x00,0x44,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,\n\t0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,\n\t0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x57,0x56,0x00,0x58,0x58,0x58,0x00,0x59,0x5a,0x59,0x00,\n\t0x5a,0x5b,0x5a,0x00,0x5b,0x5c,0x5b,0x00,0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,0x62,0x62,0x61,0x00,\n\t0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x6a,0x69,0x00,0x6a,0x6b,0x6a,0x00,\n\t0x6b,0x6c,0x6b,0x00,0x6c,0x6d,0x6c,0x00,0x6e,0x6f,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,\n\t0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,\n\t0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x80,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,\n\t0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x89,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8c,0x8a,0x00,0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,\n\t0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x96,0x97,0x95,0x00,\n\t0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x9a,0x9b,0x99,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,\n\t0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,\n\t0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,\n\t0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,\n\t0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,\n\t0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xc9,0x00,\n\t0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,\n\t0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdd,0xd9,0x00,0xdd,0xde,0xda,0x00,\n\t0xde,0xdf,0xdb,0x00,0xdf,0xe0,0xdc,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe6,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,\n\t0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe6,0x00,0xec,0xec,0xe7,0x00,0xed,0xed,0xe8,0x00,0xef,0xee,0xe9,0x00,0xf0,0xef,0xea,0x00,\n\t0xf1,0xf0,0xeb,0x00,0xf2,0xf1,0xec,0x00,0xf3,0xf3,0xee,0x00,0xf3,0xf4,0xef,0x00,0xf4,0xf5,0xf0,0x00,0xf5,0xf6,0xf1,0x00,0xf7,0xf7,0xf3,0x00,0xf8,0xf8,0xf4,0x00,\n\t0xf9,0xf9,0xf5,0x00,0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x14,0x00,\n\t0x16,0x15,0x15,0x00,0x17,0x16,0x16,0x00,0x18,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x28,0x27,0x28,0x00,0x29,0x29,0x29,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x36,0x35,0x36,0x00,\n\t0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,\n\t0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x43,0x43,0x00,0x43,0x44,0x44,0x00,0x44,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,\n\t0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4f,0x4e,0x4e,0x00,0x50,0x50,0x50,0x00,\n\t0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,\n\t0x5a,0x5b,0x5a,0x00,0x5b,0x5c,0x5b,0x00,0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x60,0x61,0x60,0x00,0x62,0x62,0x61,0x00,\n\t0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6b,0x6a,0x00,\n\t0x6b,0x6c,0x6b,0x00,0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6f,0x70,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,\n\t0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7d,0x7b,0x00,\n\t0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x81,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x86,0x84,0x00,\n\t0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x8a,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8c,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8f,0x8d,0x00,\n\t0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x94,0x94,0x93,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,\n\t0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,\n\t0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,\n\t0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,\n\t0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xbb,0xb8,0x00,\n\t0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc4,0xc1,0x00,\n\t0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,\n\t0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,\n\t0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xde,0xda,0x00,\n\t0xde,0xdf,0xdb,0x00,0xdf,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe7,0xe6,0xe3,0x00,\n\t0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe5,0x00,0xea,0xe9,0xe5,0x00,0xeb,0xeb,0xe6,0x00,0xec,0xec,0xe7,0x00,0xed,0xed,0xe8,0x00,0xee,0xee,0xe9,0x00,0xf0,0xef,0xea,0x00,\n\t0xf1,0xf0,0xeb,0x00,0xf2,0xf1,0xec,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf5,0xf0,0x00,0xf5,0xf6,0xf1,0x00,0xf6,0xf7,0xf3,0x00,0xf8,0xf8,0xf4,0x00,\n\t0xf9,0xf9,0xf5,0x00,0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfd,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x14,0x00,\n\t0x16,0x15,0x15,0x00,0x17,0x16,0x16,0x00,0x18,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,\n\t0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,\n\t0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x44,0x44,0x00,0x44,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,\n\t0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4f,0x4e,0x4e,0x00,0x50,0x4f,0x4f,0x00,\n\t0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,\n\t0x5a,0x5b,0x5a,0x00,0x5b,0x5c,0x5b,0x00,0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x60,0x61,0x60,0x00,0x61,0x62,0x61,0x00,\n\t0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,\n\t0x6b,0x6c,0x6b,0x00,0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x70,0x71,0x6f,0x00,0x71,0x72,0x70,0x00,0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,\n\t0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,\n\t0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x80,0x81,0x7f,0x00,0x82,0x82,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,0x85,0x85,0x83,0x00,\n\t0x86,0x87,0x85,0x00,0x87,0x88,0x86,0x00,0x88,0x89,0x87,0x00,0x89,0x8a,0x88,0x00,0x8b,0x8b,0x89,0x00,0x8c,0x8c,0x8a,0x00,0x8d,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,\n\t0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,\n\t0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,\n\t0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,\n\t0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,\n\t0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,\n\t0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,\n\t0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,\n\t0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,\n\t0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,\n\t0xde,0xdf,0xdb,0x00,0xdf,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,\n\t0xe8,0xe7,0xe4,0x00,0xe9,0xe8,0xe4,0x00,0xea,0xe9,0xe5,0x00,0xeb,0xea,0xe6,0x00,0xec,0xec,0xe7,0x00,0xed,0xed,0xe8,0x00,0xee,0xee,0xe9,0x00,0xef,0xef,0xea,0x00,\n\t0xf1,0xf0,0xeb,0x00,0xf1,0xf1,0xec,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf1,0x00,0xf6,0xf7,0xf3,0x00,0xf7,0xf8,0xf4,0x00,\n\t0xf9,0xf9,0xf5,0x00,0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x14,0x00,\n\t0x16,0x15,0x15,0x00,0x17,0x16,0x16,0x00,0x18,0x17,0x17,0x00,0x18,0x17,0x18,0x00,0x19,0x18,0x19,0x00,0x1a,0x19,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,\n\t0x2f,0x2e,0x2e,0x00,0x30,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,\n\t0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3d,0x3e,0x00,\n\t0x3f,0x3e,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,\n\t0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4f,0x4e,0x4e,0x00,0x50,0x4f,0x4f,0x00,\n\t0x51,0x50,0x50,0x00,0x52,0x51,0x51,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,\n\t0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,\n\t0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,\n\t0x6b,0x6b,0x6a,0x00,0x6c,0x6d,0x6b,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,\n\t0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,\n\t0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,\n\t0x85,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,\n\t0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x92,0x8f,0x00,0x91,0x93,0x90,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x96,0x95,0x00,\n\t0x97,0x97,0x96,0x00,0x98,0x99,0x97,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,\n\t0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,\n\t0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,\n\t0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,\n\t0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,\n\t0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,\n\t0xcc,0xcc,0xca,0x00,0xcd,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd4,0xd0,0x00,0xd4,0xd5,0xd1,0x00,\n\t0xd5,0xd6,0xd2,0x00,0xd6,0xd7,0xd3,0x00,0xd7,0xd8,0xd4,0x00,0xd8,0xd9,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xda,0xdb,0xd7,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,\n\t0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,\n\t0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xed,0xec,0xe8,0x00,0xee,0xed,0xe9,0x00,0xef,0xee,0xea,0x00,\n\t0xf0,0xef,0xeb,0x00,0xf1,0xf0,0xec,0x00,0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf1,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf8,0xf4,0x00,\n\t0xf8,0xf9,0xf5,0x00,0xf9,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x14,0x00,\n\t0x16,0x15,0x15,0x00,0x17,0x16,0x16,0x00,0x18,0x17,0x17,0x00,0x18,0x17,0x18,0x00,0x19,0x18,0x19,0x00,0x1a,0x19,0x1a,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,\n\t0x2f,0x2e,0x2e,0x00,0x30,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,\n\t0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3d,0x3e,0x00,\n\t0x3f,0x3e,0x3f,0x00,0x40,0x3f,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,\n\t0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4f,0x4e,0x4e,0x00,0x50,0x4f,0x4f,0x00,\n\t0x51,0x50,0x50,0x00,0x52,0x51,0x51,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,\n\t0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,\n\t0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,\n\t0x6b,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,\n\t0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,\n\t0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,\n\t0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8d,0x8e,0x8c,0x00,\n\t0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x92,0x8f,0x00,0x91,0x93,0x90,0x00,0x92,0x94,0x91,0x00,0x93,0x95,0x92,0x00,0x95,0x96,0x94,0x00,0x96,0x96,0x95,0x00,\n\t0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,\n\t0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa8,0xa5,0x00,0xa8,0xa9,0xa6,0x00,\n\t0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,\n\t0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,\n\t0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc2,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,\n\t0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,\n\t0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd4,0xd0,0x00,0xd4,0xd5,0xd1,0x00,\n\t0xd5,0xd6,0xd2,0x00,0xd6,0xd7,0xd3,0x00,0xd7,0xd8,0xd4,0x00,0xd8,0xd9,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xda,0xdb,0xd7,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,\n\t0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,\n\t0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xee,0xed,0xe9,0x00,0xef,0xee,0xea,0x00,\n\t0xf0,0xef,0xeb,0x00,0xf1,0xf0,0xec,0x00,0xf2,0xf1,0xee,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf5,0xf1,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf8,0xf4,0x00,\n\t0xf8,0xf9,0xf5,0x00,0xf9,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x13,0x00,0x15,0x14,0x14,0x00,\n\t0x16,0x15,0x15,0x00,0x17,0x16,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x19,0x18,0x19,0x00,0x1a,0x19,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1d,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2e,0x2d,0x2d,0x00,\n\t0x2f,0x2e,0x2e,0x00,0x30,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,\n\t0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3c,0x3d,0x00,0x3e,0x3d,0x3e,0x00,\n\t0x3f,0x3e,0x3f,0x00,0x40,0x3f,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x47,0x47,0x47,0x00,\n\t0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x50,0x4f,0x4f,0x00,\n\t0x51,0x50,0x50,0x00,0x52,0x51,0x51,0x00,0x53,0x52,0x52,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x59,0x59,0x59,0x00,\n\t0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,\n\t0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,\n\t0x6b,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x73,0x73,0x73,0x00,\n\t0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,\n\t0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x85,0x83,0x00,\n\t0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8e,0x8c,0x00,\n\t0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x93,0x90,0x00,0x92,0x94,0x91,0x00,0x93,0x95,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x95,0x00,\n\t0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0xa0,0x9e,0x00,\n\t0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa9,0xa6,0x00,\n\t0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,\n\t0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,\n\t0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc3,0xc3,0xc0,0x00,\n\t0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,\n\t0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd5,0xd1,0x00,\n\t0xd5,0xd6,0xd2,0x00,0xd6,0xd7,0xd3,0x00,0xd7,0xd8,0xd4,0x00,0xd8,0xd9,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xda,0xdb,0xd7,0x00,0xdb,0xdc,0xd8,0x00,0xdd,0xdd,0xda,0x00,\n\t0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe0,0x00,0xe5,0xe5,0xe1,0x00,0xe6,0xe6,0xe2,0x00,\n\t0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,\n\t0xf0,0xef,0xeb,0x00,0xf1,0xf0,0xec,0x00,0xf2,0xf1,0xed,0x00,0xf3,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf4,0xf1,0x00,0xf6,0xf6,0xf2,0x00,0xf7,0xf7,0xf4,0x00,\n\t0xf8,0xf9,0xf5,0x00,0xf9,0xfa,0xf6,0x00,0xfa,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,\n\t0x16,0x15,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x19,0x18,0x19,0x00,0x1a,0x19,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,\n\t0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,\n\t0x2f,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,\n\t0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3b,0x3c,0x00,0x3d,0x3c,0x3d,0x00,0x3e,0x3d,0x3e,0x00,\n\t0x3f,0x3e,0x3f,0x00,0x40,0x3f,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,\n\t0x51,0x50,0x50,0x00,0x52,0x51,0x51,0x00,0x53,0x52,0x52,0x00,0x54,0x53,0x53,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,\n\t0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,\n\t0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,0x6a,0x6a,0x69,0x00,\n\t0x6b,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,\n\t0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7b,0x7c,0x7b,0x00,\n\t0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,\n\t0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,\n\t0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x94,0x91,0x00,0x93,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,\n\t0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,\n\t0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa6,0x00,\n\t0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,\n\t0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,\n\t0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,\n\t0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,\n\t0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xcf,0xcc,0x00,0xcf,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,\n\t0xd5,0xd6,0xd2,0x00,0xd6,0xd7,0xd3,0x00,0xd7,0xd8,0xd4,0x00,0xd8,0xd9,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xda,0xdb,0xd7,0x00,0xdb,0xdc,0xd8,0x00,0xdc,0xdd,0xd9,0x00,\n\t0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe3,0xe4,0xe0,0x00,0xe4,0xe5,0xe1,0x00,0xe5,0xe6,0xe2,0x00,\n\t0xe6,0xe7,0xe3,0x00,0xe7,0xe8,0xe4,0x00,0xe8,0xe9,0xe5,0x00,0xe9,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,\n\t0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf4,0xf1,0x00,0xf6,0xf6,0xf2,0x00,0xf7,0xf7,0xf3,0x00,\n\t0xf8,0xf9,0xf5,0x00,0xf9,0xfa,0xf6,0x00,0xfa,0xfb,0xf7,0x00,0xfb,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,\n\t0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2e,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,\n\t0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,\n\t0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,\n\t0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x53,0x52,0x52,0x00,0x54,0x53,0x53,0x00,0x55,0x54,0x54,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,\n\t0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5c,0x5b,0x00,0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,\n\t0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x69,0x68,0x00,0x69,0x6a,0x69,0x00,\n\t0x6a,0x6b,0x6a,0x00,0x6b,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x70,0x70,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,\n\t0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,\n\t0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,\n\t0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8c,0x8d,0x8c,0x00,\n\t0x8d,0x8e,0x8d,0x00,0x8e,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,\n\t0x97,0x97,0x95,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9d,0x00,0x9e,0x9f,0x9e,0x00,\n\t0x9f,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,\n\t0xa8,0xa9,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,\n\t0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,\n\t0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xc0,0xc0,0xbd,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,\n\t0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc8,0x00,\n\t0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xcf,0xcb,0x00,0xcf,0xd0,0xcc,0x00,0xd0,0xd1,0xcd,0x00,0xd1,0xd2,0xce,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,\n\t0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdc,0xd8,0x00,0xdc,0xdd,0xd9,0x00,\n\t0xdd,0xde,0xda,0x00,0xdf,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,\n\t0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,\n\t0xef,0xee,0xea,0x00,0xf0,0xef,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf1,0x00,0xf6,0xf6,0xf2,0x00,0xf7,0xf7,0xf3,0x00,\n\t0xf8,0xf8,0xf4,0x00,0xf9,0xf9,0xf5,0x00,0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1b,0x1b,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,\n\t0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2e,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,\n\t0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,\n\t0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,\n\t0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x53,0x52,0x52,0x00,0x54,0x53,0x53,0x00,0x55,0x54,0x54,0x00,0x56,0x55,0x55,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,\n\t0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5c,0x5b,0x00,0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x60,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,\n\t0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x69,0x68,0x00,0x69,0x6a,0x69,0x00,\n\t0x6a,0x6b,0x6a,0x00,0x6b,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x70,0x6f,0x00,0x71,0x72,0x71,0x00,0x72,0x73,0x72,0x00,\n\t0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7b,0x79,0x00,0x7b,0x7c,0x7a,0x00,\n\t0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,\n\t0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8c,0x8d,0x8c,0x00,\n\t0x8d,0x8e,0x8d,0x00,0x8e,0x8f,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x95,0x95,0x93,0x00,0x96,0x96,0x94,0x00,\n\t0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9e,0x9d,0x00,0x9e,0x9f,0x9e,0x00,\n\t0x9f,0xa0,0x9f,0x00,0xa0,0xa1,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,\n\t0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,\n\t0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb9,0xb6,0x00,0xb9,0xba,0xb7,0x00,\n\t0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,\n\t0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc8,0x00,\n\t0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xcf,0xcb,0x00,0xcf,0xd0,0xcc,0x00,0xd0,0xd1,0xcd,0x00,0xd1,0xd2,0xce,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,\n\t0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdc,0xd8,0x00,0xdc,0xdd,0xd9,0x00,\n\t0xdd,0xde,0xda,0x00,0xde,0xdf,0xdb,0x00,0xe0,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe4,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,\n\t0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,\n\t0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf6,0xf6,0xf2,0x00,0xf7,0xf7,0xf3,0x00,\n\t0xf8,0xf8,0xf4,0x00,0xf9,0xf9,0xf5,0x00,0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1c,0x1c,0x1c,0x00,\n\t0x1d,0x1d,0x1d,0x00,0x1e,0x1e,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x27,0x27,0x00,0x29,0x28,0x28,0x00,0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,\n\t0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2e,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x35,0x35,0x00,\n\t0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,\n\t0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,\n\t0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x54,0x53,0x53,0x00,0x55,0x54,0x54,0x00,0x56,0x55,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x58,0x00,\n\t0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5d,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x61,0x61,0x60,0x00,\n\t0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x6a,0x69,0x00,\n\t0x6a,0x6b,0x6a,0x00,0x6b,0x6c,0x6b,0x00,0x6c,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x70,0x6f,0x00,0x71,0x71,0x70,0x00,0x72,0x73,0x72,0x00,\n\t0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,0x7b,0x7c,0x7a,0x00,\n\t0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,\n\t0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8b,0x8c,0x8b,0x00,0x8c,0x8d,0x8c,0x00,\n\t0x8d,0x8e,0x8d,0x00,0x8e,0x8f,0x8e,0x00,0x8f,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x96,0x96,0x94,0x00,\n\t0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9e,0x00,\n\t0x9f,0xa0,0x9f,0x00,0xa0,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,\n\t0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,\n\t0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xba,0xb7,0x00,\n\t0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc2,0xc2,0xc0,0x00,\n\t0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,\n\t0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xd0,0xcc,0x00,0xd0,0xd1,0xcd,0x00,0xd1,0xd2,0xce,0x00,0xd2,0xd3,0xcf,0x00,0xd4,0xd4,0xd1,0x00,\n\t0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdd,0xd9,0x00,\n\t0xdd,0xde,0xda,0x00,0xde,0xdf,0xdb,0x00,0xdf,0xe0,0xdc,0x00,0xe1,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe3,0xe3,0xdf,0x00,0xe3,0xe4,0xe0,0x00,0xe4,0xe5,0xe2,0x00,\n\t0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,0xe7,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,\n\t0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf2,0x00,0xf7,0xf7,0xf3,0x00,\n\t0xf8,0xf8,0xf4,0x00,0xf9,0xf9,0xf5,0x00,0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,\n\t0x1d,0x1d,0x1d,0x00,0x1e,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,\n\t0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,\n\t0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,\n\t0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,\n\t0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,\n\t0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x55,0x54,0x54,0x00,0x56,0x55,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,\n\t0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5e,0x5d,0x00,0x5e,0x5f,0x5e,0x00,0x5f,0x60,0x5f,0x00,0x60,0x61,0x60,0x00,\n\t0x62,0x62,0x61,0x00,0x63,0x63,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,\n\t0x6a,0x6b,0x6a,0x00,0x6b,0x6c,0x6b,0x00,0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x70,0x6f,0x00,0x71,0x71,0x70,0x00,0x72,0x72,0x71,0x00,\n\t0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,\n\t0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7c,0x00,0x7e,0x7f,0x7d,0x00,0x7f,0x80,0x7e,0x00,0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,\n\t0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x8a,0x8a,0x89,0x00,0x8a,0x8b,0x8a,0x00,0x8b,0x8c,0x8b,0x00,0x8c,0x8d,0x8c,0x00,\n\t0x8d,0x8e,0x8d,0x00,0x8e,0x8f,0x8e,0x00,0x8f,0x91,0x8f,0x00,0x90,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,\n\t0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,\n\t0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,\n\t0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,\n\t0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,\n\t0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,\n\t0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,\n\t0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd1,0xcd,0x00,0xd1,0xd2,0xce,0x00,0xd2,0xd3,0xcf,0x00,0xd3,0xd4,0xd0,0x00,\n\t0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,\n\t0xdd,0xde,0xda,0x00,0xde,0xdf,0xdb,0x00,0xdf,0xe0,0xdc,0x00,0xe0,0xe1,0xdd,0x00,0xe2,0xe2,0xde,0x00,0xe2,0xe3,0xdf,0x00,0xe3,0xe4,0xe0,0x00,0xe4,0xe5,0xe1,0x00,\n\t0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe3,0x00,0xe7,0xe8,0xe4,0x00,0xe8,0xe9,0xe5,0x00,0xea,0xea,0xe6,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,\n\t0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf1,0xed,0x00,0xf1,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,\n\t0xf8,0xf8,0xf4,0x00,0xf9,0xf9,0xf5,0x00,0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x10,0x00,0x13,0x11,0x11,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x23,0x00,\n\t0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2d,0x00,\n\t0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,\n\t0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,\n\t0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4e,0x4d,0x4e,0x00,0x4f,0x4e,0x4f,0x00,\n\t0x50,0x4f,0x50,0x00,0x51,0x50,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,\n\t0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,\n\t0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,\n\t0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x71,0x71,0x70,0x00,0x72,0x72,0x71,0x00,\n\t0x73,0x73,0x72,0x00,0x74,0x74,0x73,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,\n\t0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,\n\t0x85,0x85,0x83,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,\n\t0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x91,0x8e,0x00,0x90,0x92,0x8f,0x00,0x91,0x93,0x90,0x00,0x93,0x94,0x91,0x00,0x94,0x95,0x93,0x00,0x95,0x95,0x94,0x00,\n\t0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x99,0x98,0x00,0x99,0x9a,0x99,0x00,0x9a,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,\n\t0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa6,0xa7,0xa4,0x00,0xa7,0xa8,0xa5,0x00,\n\t0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,\n\t0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,\n\t0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,\n\t0xc2,0xc3,0xc0,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xca,0xc8,0x00,\n\t0xcb,0xcb,0xc8,0x00,0xcc,0xcd,0xc9,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,\n\t0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xda,0xdb,0xd7,0x00,0xdb,0xdc,0xd8,0x00,\n\t0xdc,0xdd,0xd9,0x00,0xde,0xde,0xda,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,\n\t0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe8,0xe4,0x00,0xe8,0xe9,0xe5,0x00,0xe9,0xea,0xe6,0x00,0xea,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,\n\t0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf1,0xed,0x00,0xf1,0xf2,0xee,0x00,0xf2,0xf3,0xef,0x00,0xf4,0xf4,0xf0,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,\n\t0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,\n\t0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x10,0x00,0x13,0x11,0x11,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x23,0x00,\n\t0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,\n\t0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,\n\t0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,\n\t0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4e,0x4d,0x4e,0x00,0x4f,0x4e,0x4f,0x00,\n\t0x50,0x4f,0x50,0x00,0x51,0x50,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x57,0x57,0x56,0x00,0x58,0x58,0x57,0x00,\n\t0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,\n\t0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x64,0x64,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,\n\t0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6d,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x71,0x71,0x70,0x00,0x72,0x72,0x71,0x00,\n\t0x73,0x73,0x72,0x00,0x74,0x74,0x73,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,\n\t0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x83,0x83,0x81,0x00,0x84,0x84,0x82,0x00,\n\t0x85,0x85,0x83,0x00,0x86,0x86,0x84,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,\n\t0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x91,0x8e,0x00,0x90,0x92,0x8f,0x00,0x91,0x93,0x90,0x00,0x92,0x94,0x91,0x00,0x94,0x95,0x93,0x00,0x95,0x95,0x94,0x00,\n\t0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x99,0x98,0x00,0x99,0x9a,0x99,0x00,0x9a,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,\n\t0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa6,0xa7,0xa4,0x00,0xa7,0xa8,0xa5,0x00,\n\t0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,\n\t0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,\n\t0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xc0,0xc1,0xbe,0x00,0xc1,0xc2,0xbf,0x00,\n\t0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xca,0xc7,0x00,\n\t0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,\n\t0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xdb,0xd7,0x00,0xdb,0xdc,0xd8,0x00,\n\t0xdc,0xdd,0xd9,0x00,0xdd,0xde,0xda,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,\n\t0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe8,0xe4,0x00,0xe8,0xe9,0xe5,0x00,0xe9,0xea,0xe6,0x00,0xea,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,\n\t0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf1,0xed,0x00,0xf1,0xf2,0xee,0x00,0xf2,0xf3,0xef,0x00,0xf3,0xf4,0xf0,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,\n\t0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,\n\t0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x10,0x00,0x13,0x11,0x11,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x24,0x23,0x23,0x00,\n\t0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2d,0x00,\n\t0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x35,0x34,0x35,0x00,\n\t0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,\n\t0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4f,0x4e,0x4f,0x00,\n\t0x50,0x4f,0x50,0x00,0x51,0x50,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x58,0x58,0x57,0x00,\n\t0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,\n\t0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x65,0x65,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x69,0x00,\n\t0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6e,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x72,0x72,0x71,0x00,\n\t0x73,0x73,0x72,0x00,0x74,0x74,0x73,0x00,0x75,0x75,0x74,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,\n\t0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x83,0x81,0x00,0x84,0x84,0x82,0x00,\n\t0x85,0x85,0x83,0x00,0x86,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8d,0x8b,0x00,\n\t0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x92,0x8f,0x00,0x91,0x93,0x90,0x00,0x92,0x94,0x91,0x00,0x93,0x94,0x93,0x00,0x95,0x95,0x94,0x00,\n\t0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x9a,0x99,0x00,0x9a,0x9b,0x9a,0x00,0x9b,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9f,0x9d,0x00,\n\t0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa7,0xa8,0xa5,0x00,\n\t0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,\n\t0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb5,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb9,0xb9,0xb7,0x00,\n\t0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc2,0xbf,0x00,\n\t0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,\n\t0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,0xd2,0xd2,0xcf,0x00,0xd3,0xd3,0xd0,0x00,\n\t0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdc,0xd8,0x00,\n\t0xdc,0xdd,0xd9,0x00,0xdd,0xde,0xda,0x00,0xde,0xdf,0xdb,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,\n\t0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe9,0xe5,0x00,0xe9,0xea,0xe6,0x00,0xea,0xeb,0xe7,0x00,0xeb,0xec,0xe8,0x00,0xed,0xed,0xe9,0x00,\n\t0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf2,0xee,0x00,0xf2,0xf3,0xef,0x00,0xf3,0xf4,0xf0,0x00,0xf4,0xf5,0xf1,0x00,0xf6,0xf6,0xf3,0x00,\n\t0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,\n\t0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x12,0x10,0x10,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x23,0x00,\n\t0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,\n\t0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,\n\t0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x38,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,\n\t0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x50,0x4f,0x50,0x00,0x51,0x50,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,\n\t0x59,0x59,0x58,0x00,0x5a,0x5a,0x59,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,\n\t0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x66,0x66,0x65,0x00,0x67,0x67,0x66,0x00,0x68,0x68,0x67,0x00,0x69,0x69,0x68,0x00,\n\t0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6f,0x6e,0x00,0x6f,0x70,0x6f,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,\n\t0x73,0x73,0x72,0x00,0x74,0x74,0x73,0x00,0x75,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,\n\t0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,\n\t0x85,0x85,0x83,0x00,0x86,0x86,0x84,0x00,0x87,0x87,0x85,0x00,0x88,0x88,0x86,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8d,0x8b,0x00,\n\t0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x93,0x91,0x00,0x92,0x93,0x92,0x00,0x93,0x94,0x93,0x00,0x94,0x95,0x94,0x00,\n\t0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9b,0x9a,0x00,0x9b,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,\n\t0xa0,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,\n\t0xa8,0xa9,0xa6,0x00,0xa9,0xaa,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,\n\t0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb6,0xb3,0x00,0xb6,0xb7,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,\n\t0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,\n\t0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc8,0xc5,0x00,0xc9,0xc9,0xc6,0x00,0xca,0xca,0xc7,0x00,\n\t0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,\n\t0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,\n\t0xdc,0xdd,0xd9,0x00,0xdd,0xde,0xda,0x00,0xde,0xdf,0xdb,0x00,0xdf,0xe0,0xdc,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,\n\t0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xea,0xe6,0x00,0xea,0xeb,0xe7,0x00,0xeb,0xec,0xe8,0x00,0xec,0xed,0xe9,0x00,\n\t0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf3,0xef,0x00,0xf3,0xf4,0xf0,0x00,0xf4,0xf5,0xf1,0x00,0xf5,0xf6,0xf2,0x00,\n\t0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,\n\t0xff,0xff,0xfc,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x10,0x10,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x23,0x00,\n\t0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,\n\t0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x38,0x37,0x38,0x00,0x39,0x38,0x39,0x00,0x3a,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,0x3c,0x3b,0x3c,0x00,0x3d,0x3c,0x3d,0x00,\n\t0x3e,0x3d,0x3e,0x00,0x3f,0x3e,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,\n\t0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,\n\t0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x68,0x67,0x00,0x68,0x69,0x68,0x00,\n\t0x69,0x6a,0x69,0x00,0x6a,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,\n\t0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,0x75,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,\n\t0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,\n\t0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x8a,0x88,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8d,0x8b,0x00,\n\t0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x90,0x00,0x91,0x92,0x91,0x00,0x92,0x93,0x92,0x00,0x93,0x94,0x93,0x00,0x94,0x95,0x93,0x00,\n\t0x95,0x96,0x94,0x00,0x96,0x97,0x96,0x00,0x97,0x98,0x97,0x00,0x98,0x99,0x98,0x00,0x99,0x9a,0x99,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,\n\t0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,\n\t0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,\n\t0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,\n\t0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,\n\t0xc1,0xc2,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,\n\t0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,\n\t0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,\n\t0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,\n\t0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xec,0xea,0x00,\n\t0xed,0xed,0xeb,0x00,0xee,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,\n\t0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf9,0xf8,0xf5,0x00,0xfa,0xf9,0xf6,0x00,0xfb,0xfa,0xf7,0x00,0xfc,0xfb,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,\n\t0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0f,0x0f,0x0f,0x00,0x10,0x10,0x10,0x00,0x11,0x10,0x10,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x23,0x00,\n\t0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,\n\t0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x38,0x37,0x38,0x00,0x39,0x38,0x39,0x00,0x3a,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,0x3c,0x3b,0x3c,0x00,0x3d,0x3c,0x3d,0x00,\n\t0x3e,0x3d,0x3e,0x00,0x3f,0x3e,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,\n\t0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,\n\t0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x68,0x67,0x00,0x68,0x69,0x68,0x00,\n\t0x69,0x6a,0x69,0x00,0x6a,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x71,0x70,0x00,0x71,0x72,0x71,0x00,\n\t0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,0x75,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x7a,0x78,0x00,0x7a,0x7b,0x79,0x00,\n\t0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x80,0x81,0x80,0x00,0x82,0x83,0x81,0x00,0x83,0x84,0x82,0x00,\n\t0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x8a,0x88,0x00,0x8b,0x8b,0x8a,0x00,0x8c,0x8d,0x8b,0x00,\n\t0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8f,0x00,0x90,0x91,0x90,0x00,0x91,0x92,0x91,0x00,0x92,0x93,0x92,0x00,0x93,0x94,0x93,0x00,0x94,0x95,0x93,0x00,\n\t0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x97,0x00,0x98,0x99,0x98,0x00,0x99,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,\n\t0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,\n\t0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xaa,0xab,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,\n\t0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb7,0xb8,0xb5,0x00,0xb8,0xb9,0xb6,0x00,\n\t0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbc,0x00,0xc0,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,\n\t0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,\n\t0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xce,0xcb,0x00,0xce,0xcf,0xcc,0x00,0xcf,0xd0,0xcd,0x00,0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,\n\t0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,\n\t0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,\n\t0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,\n\t0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,\n\t0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf9,0xf8,0xf5,0x00,0xfa,0xf9,0xf6,0x00,0xfb,0xfa,0xf7,0x00,0xfc,0xfb,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,\n\t0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x10,0x10,0x10,0x00,0x11,0x10,0x10,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x23,0x00,\n\t0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2c,0x2c,0x00,\n\t0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x39,0x38,0x39,0x00,0x3a,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,0x3c,0x3b,0x3c,0x00,0x3d,0x3c,0x3d,0x00,\n\t0x3e,0x3d,0x3e,0x00,0x3f,0x3e,0x3f,0x00,0x40,0x3f,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x45,0x00,0x46,0x46,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,\n\t0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x60,0x60,0x60,0x00,\n\t0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x69,0x68,0x00,\n\t0x69,0x6a,0x69,0x00,0x6a,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x70,0x70,0x00,0x71,0x72,0x71,0x00,\n\t0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7b,0x79,0x00,\n\t0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x80,0x81,0x80,0x00,0x82,0x82,0x81,0x00,0x83,0x84,0x82,0x00,\n\t0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8c,0x8c,0x8b,0x00,\n\t0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x90,0x00,0x91,0x92,0x91,0x00,0x92,0x93,0x92,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,\n\t0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x97,0x00,0x98,0x99,0x98,0x00,0x99,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9e,0x9e,0x9d,0x00,\n\t0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,\n\t0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xab,0xac,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xae,0x00,\n\t0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb9,0xb6,0x00,\n\t0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbf,0x00,\n\t0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,\n\t0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xce,0xcb,0x00,0xce,0xcf,0xcc,0x00,0xcf,0xd0,0xcd,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd3,0xd0,0x00,\n\t0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,\n\t0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe4,0xe4,0xe1,0x00,\n\t0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,\n\t0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,\n\t0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xfa,0xf9,0xf6,0x00,0xfb,0xfa,0xf7,0x00,0xfc,0xfb,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,\n\t0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x10,0x10,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x23,0x00,\n\t0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2d,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x3a,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,0x3c,0x3b,0x3c,0x00,0x3d,0x3c,0x3d,0x00,\n\t0x3e,0x3d,0x3e,0x00,0x3f,0x3e,0x3f,0x00,0x40,0x3f,0x40,0x00,0x41,0x40,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,\n\t0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,\n\t0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,\n\t0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,\n\t0x69,0x6a,0x69,0x00,0x6a,0x6b,0x6a,0x00,0x6c,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,\n\t0x72,0x73,0x72,0x00,0x73,0x74,0x73,0x00,0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,\n\t0x7b,0x7c,0x7a,0x00,0x7c,0x7d,0x7b,0x00,0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x80,0x81,0x80,0x00,0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,\n\t0x84,0x85,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8b,0x00,\n\t0x8d,0x8e,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x91,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,0x94,0x95,0x93,0x00,\n\t0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x97,0x00,0x98,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,\n\t0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,\n\t0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xac,0xad,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,\n\t0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,\n\t0xb9,0xba,0xb7,0x00,0xba,0xbb,0xb8,0x00,0xbb,0xbc,0xb9,0x00,0xbc,0xbd,0xba,0x00,0xbd,0xbe,0xbb,0x00,0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,\n\t0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,\n\t0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xcd,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,\n\t0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,\n\t0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,\n\t0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,\n\t0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xf0,0xec,0x00,0xf0,0xf1,0xed,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,\n\t0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfb,0xfa,0xf7,0x00,0xfc,0xfb,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,\n\t0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x10,0x10,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x22,0x23,0x00,\n\t0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x40,0x3f,0x40,0x00,0x41,0x40,0x41,0x00,0x42,0x41,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,\n\t0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,\n\t0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6c,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,\n\t0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,\n\t0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x81,0x80,0x00,0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,\n\t0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x85,0x00,0x88,0x88,0x86,0x00,0x89,0x89,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8b,0x00,\n\t0x8c,0x8d,0x8c,0x00,0x8d,0x8e,0x8d,0x00,0x8e,0x8f,0x8e,0x00,0x8f,0x90,0x8f,0x00,0x90,0x91,0x90,0x00,0x91,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,\n\t0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,\n\t0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,\n\t0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,\n\t0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,\n\t0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,\n\t0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,\n\t0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,\n\t0xd2,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,\n\t0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,\n\t0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe7,0xe3,0x00,0xe7,0xe8,0xe4,0x00,0xe8,0xe9,0xe5,0x00,0xe9,0xea,0xe6,0x00,0xea,0xeb,0xe7,0x00,0xeb,0xec,0xe8,0x00,\n\t0xec,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xf0,0xec,0x00,0xf0,0xf1,0xed,0x00,0xf1,0xf2,0xee,0x00,0xf2,0xf3,0xef,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,\n\t0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,\n\t0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x10,0x10,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x22,0x23,0x00,\n\t0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x40,0x3f,0x40,0x00,0x41,0x40,0x41,0x00,0x42,0x41,0x42,0x00,0x43,0x42,0x43,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,\n\t0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,\n\t0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6c,0x6c,0x6b,0x00,0x6d,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,\n\t0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,\n\t0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,\n\t0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x85,0x00,0x88,0x88,0x86,0x00,0x89,0x89,0x88,0x00,0x8a,0x8b,0x89,0x00,0x8b,0x8c,0x8b,0x00,\n\t0x8c,0x8d,0x8c,0x00,0x8d,0x8e,0x8d,0x00,0x8e,0x8f,0x8e,0x00,0x8f,0x90,0x8f,0x00,0x90,0x91,0x90,0x00,0x91,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,\n\t0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,\n\t0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,\n\t0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xae,0xaf,0xac,0x00,0xaf,0xb0,0xad,0x00,\n\t0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,\n\t0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbf,0xc0,0xbd,0x00,0xc0,0xc1,0xbe,0x00,\n\t0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,\n\t0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,\n\t0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,\n\t0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,\n\t0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe7,0xe3,0x00,0xe7,0xe8,0xe4,0x00,0xe8,0xe9,0xe5,0x00,0xe9,0xea,0xe6,0x00,0xea,0xeb,0xe7,0x00,0xeb,0xec,0xe8,0x00,\n\t0xec,0xed,0xe9,0x00,0xed,0xee,0xea,0x00,0xef,0xf0,0xec,0x00,0xf0,0xf1,0xed,0x00,0xf1,0xf2,0xee,0x00,0xf2,0xf3,0xef,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,\n\t0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfd,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,\n\t0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x10,0x10,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x22,0x00,0x23,0x22,0x23,0x00,\n\t0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x33,0x32,0x33,0x00,0x34,0x34,0x34,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x41,0x40,0x41,0x00,0x42,0x41,0x42,0x00,0x43,0x42,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x46,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x56,0x00,0x57,0x57,0x57,0x00,\n\t0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,\n\t0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6d,0x6d,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x70,0x6f,0x00,0x71,0x71,0x71,0x00,\n\t0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,\n\t0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x82,0x81,0x00,0x83,0x83,0x82,0x00,\n\t0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x85,0x00,0x88,0x88,0x86,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8c,0x8a,0x00,\n\t0x8c,0x8d,0x8c,0x00,0x8d,0x8e,0x8d,0x00,0x8e,0x8f,0x8e,0x00,0x8f,0x90,0x8f,0x00,0x90,0x91,0x90,0x00,0x91,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,\n\t0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x98,0x97,0x96,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9e,0x9e,0x9c,0x00,\n\t0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa7,0xa5,0x00,\n\t0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,0xaf,0xb0,0xad,0x00,\n\t0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,\n\t0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc1,0xbe,0x00,\n\t0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,\n\t0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xd0,0x00,\n\t0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xdb,0xdb,0xd8,0x00,\n\t0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,\n\t0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe8,0xe4,0x00,0xe8,0xe9,0xe5,0x00,0xe9,0xea,0xe6,0x00,0xea,0xeb,0xe7,0x00,0xeb,0xec,0xe8,0x00,\n\t0xec,0xed,0xe9,0x00,0xed,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf1,0xed,0x00,0xf1,0xf2,0xee,0x00,0xf2,0xf3,0xef,0x00,0xf3,0xf4,0xf0,0x00,0xf5,0xf5,0xf2,0x00,\n\t0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfd,0xf9,0x00,0xfe,0xfe,0xfa,0x00,\n\t0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x10,0x10,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x19,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x22,0x23,0x00,\n\t0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,\n\t0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x42,0x41,0x42,0x00,0x43,0x42,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,\n\t0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,\n\t0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6e,0x6e,0x6d,0x00,0x6f,0x6f,0x6e,0x00,0x70,0x70,0x6f,0x00,0x71,0x71,0x70,0x00,\n\t0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,\n\t0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x82,0x81,0x00,0x82,0x83,0x82,0x00,\n\t0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,\n\t0x8c,0x8d,0x8c,0x00,0x8d,0x8e,0x8d,0x00,0x8e,0x8f,0x8e,0x00,0x8f,0x90,0x8f,0x00,0x90,0x91,0x90,0x00,0x91,0x92,0x91,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,\n\t0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x98,0x97,0x96,0x00,0x99,0x98,0x97,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,\n\t0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,0xa6,0xa6,0xa4,0x00,\n\t0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,\n\t0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xaf,0x00,0xb2,0xb3,0xb0,0x00,0xb3,0xb4,0xb1,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,\n\t0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,\n\t0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,\n\t0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,\n\t0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xda,0xdb,0xd7,0x00,\n\t0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,\n\t0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe9,0xe5,0x00,0xe9,0xea,0xe6,0x00,0xea,0xeb,0xe7,0x00,0xeb,0xec,0xe8,0x00,\n\t0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf2,0xee,0x00,0xf2,0xf3,0xef,0x00,0xf3,0xf4,0xf0,0x00,0xf4,0xf5,0xf1,0x00,\n\t0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfd,0xf9,0x00,0xfd,0xfe,0xfa,0x00,\n\t0xff,0xff,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x10,0x10,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x22,0x23,0x00,\n\t0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2b,0x00,\n\t0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,\n\t0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,\n\t0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,\n\t0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x70,0x70,0x6f,0x00,0x71,0x71,0x70,0x00,\n\t0x72,0x72,0x71,0x00,0x73,0x73,0x72,0x00,0x74,0x74,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,\n\t0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,\n\t0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,\n\t0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,\n\t0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x98,0x97,0x96,0x00,0x99,0x98,0x97,0x00,0x9a,0x99,0x98,0x00,0x9b,0x9b,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,\n\t0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,\n\t0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,\n\t0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,\n\t0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,\n\t0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc6,0x00,\n\t0xc9,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,\n\t0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xda,0xdb,0xd7,0x00,\n\t0xdb,0xdc,0xd8,0x00,0xdc,0xdd,0xd9,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,\n\t0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,\n\t0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf4,0xf0,0x00,0xf4,0xf5,0xf1,0x00,\n\t0xf5,0xf6,0xf2,0x00,0xf6,0xf7,0xf3,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfd,0xf9,0x00,0xfd,0xfe,0xfa,0x00,\n\t0xfe,0xff,0xfb,0x00,0xfe,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x10,0x10,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x22,0x23,0x00,\n\t0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x26,0x27,0x00,0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2b,0x00,\n\t0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,\n\t0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,\n\t0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,\n\t0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x70,0x70,0x6f,0x00,0x71,0x71,0x70,0x00,\n\t0x72,0x72,0x71,0x00,0x73,0x73,0x72,0x00,0x74,0x75,0x74,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x79,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,\n\t0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x82,0x80,0x00,0x82,0x83,0x81,0x00,\n\t0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,\n\t0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,\n\t0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x98,0x97,0x96,0x00,0x99,0x98,0x97,0x00,0x9a,0x99,0x98,0x00,0x9b,0x9a,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,\n\t0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,\n\t0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,\n\t0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,\n\t0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,\n\t0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc6,0x00,\n\t0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,\n\t0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd7,0xd8,0xd5,0x00,0xd9,0xda,0xd6,0x00,0xda,0xdb,0xd7,0x00,\n\t0xdb,0xdc,0xd8,0x00,0xdc,0xdd,0xd9,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,\n\t0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,\n\t0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf4,0xf0,0x00,0xf4,0xf5,0xf1,0x00,\n\t0xf5,0xf6,0xf2,0x00,0xf6,0xf7,0xf3,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfd,0xf9,0x00,0xfd,0xfe,0xfa,0x00,\n\t0xfe,0xff,0xfb,0x00,0xfe,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x10,0x10,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1b,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x21,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,\n\t0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x28,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,\n\t0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x33,0x00,0x34,0x33,0x34,0x00,\n\t0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4e,0x4e,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x57,0x00,\n\t0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x68,0x68,0x68,0x00,\n\t0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x71,0x71,0x70,0x00,\n\t0x72,0x72,0x71,0x00,0x73,0x73,0x72,0x00,0x74,0x74,0x73,0x00,0x75,0x76,0x75,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x7a,0x7a,0x79,0x00,\n\t0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x83,0x81,0x00,\n\t0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,\n\t0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x8f,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x92,0x00,0x94,0x94,0x93,0x00,\n\t0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x99,0x98,0x97,0x00,0x9a,0x99,0x98,0x00,0x9b,0x9a,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,\n\t0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,\n\t0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,\n\t0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb3,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb6,0x00,\n\t0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb8,0x00,0xbc,0xbc,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,\n\t0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,\n\t0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd2,0xcf,0x00,\n\t0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd7,0xd8,0xd5,0x00,0xd8,0xd9,0xd6,0x00,0xda,0xdb,0xd7,0x00,\n\t0xdb,0xdc,0xd8,0x00,0xdc,0xdd,0xd9,0x00,0xdd,0xde,0xda,0x00,0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,0xe1,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,\n\t0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe3,0x00,0xe8,0xe8,0xe4,0x00,0xe9,0xe9,0xe5,0x00,0xea,0xea,0xe7,0x00,0xec,0xec,0xe8,0x00,\n\t0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf5,0xf1,0x00,\n\t0xf5,0xf6,0xf2,0x00,0xf6,0xf7,0xf3,0x00,0xf7,0xf8,0xf4,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfe,0xfa,0x00,\n\t0xfe,0xff,0xfb,0x00,0xfe,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x10,0x10,0x00,0x12,0x11,0x11,0x00,0x13,0x12,0x13,0x00,0x14,0x13,0x14,0x00,\n\t0x15,0x14,0x15,0x00,0x16,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,\n\t0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x1f,0x00,0x20,0x20,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,\n\t0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,\n\t0x2d,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,\n\t0x35,0x34,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,\n\t0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,\n\t0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,\n\t0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,\n\t0x72,0x72,0x71,0x00,0x73,0x73,0x72,0x00,0x74,0x74,0x73,0x00,0x75,0x75,0x74,0x00,0x76,0x77,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,0x79,0x7a,0x79,0x00,\n\t0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,\n\t0x83,0x84,0x82,0x00,0x84,0x85,0x83,0x00,0x85,0x86,0x84,0x00,0x86,0x87,0x85,0x00,0x88,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,\n\t0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8e,0x00,0x90,0x91,0x90,0x00,0x91,0x92,0x91,0x00,0x92,0x93,0x92,0x00,0x93,0x94,0x93,0x00,\n\t0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x9a,0x99,0x98,0x00,0x9b,0x9a,0x99,0x00,0x9c,0x9c,0x9a,0x00,0x9d,0x9d,0x9b,0x00,\n\t0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,\n\t0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,\n\t0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,\n\t0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbd,0xbd,0xba,0x00,0xbe,0xbe,0xbb,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,\n\t0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,\n\t0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,\n\t0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd7,0xd8,0xd5,0x00,0xd8,0xd9,0xd6,0x00,0xd9,0xda,0xd7,0x00,\n\t0xdb,0xdc,0xd8,0x00,0xdc,0xdd,0xd9,0x00,0xdd,0xde,0xda,0x00,0xde,0xdf,0xdb,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,\n\t0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,\n\t0xed,0xed,0xe9,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,\n\t0xf5,0xf6,0xf2,0x00,0xf6,0xf7,0xf3,0x00,0xf7,0xf8,0xf4,0x00,0xf8,0xf9,0xf5,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,\n\t0xfe,0xff,0xfb,0x00,0xfe,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,\n\t0x15,0x13,0x15,0x00,0x16,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,\n\t0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x22,0x00,\n\t0x24,0x23,0x23,0x00,0x25,0x24,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,\n\t0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,\n\t0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3b,0x3c,0x00,\n\t0x3d,0x3c,0x3d,0x00,0x3e,0x3d,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,\n\t0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,\n\t0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,\n\t0x71,0x71,0x71,0x00,0x72,0x73,0x72,0x00,0x74,0x74,0x73,0x00,0x75,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,\n\t0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7d,0x7c,0x00,0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,\n\t0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,\n\t0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8f,0x8d,0x00,0x8f,0x90,0x8f,0x00,0x90,0x91,0x90,0x00,0x91,0x92,0x91,0x00,0x92,0x93,0x92,0x00,0x93,0x94,0x92,0x00,\n\t0x94,0x95,0x93,0x00,0x96,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,\n\t0x9d,0x9e,0x9d,0x00,0x9e,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,\n\t0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,\n\t0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,\n\t0xb7,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,\n\t0xc0,0xc0,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc5,0xc2,0x00,0xc4,0xc6,0xc3,0x00,0xc5,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,\n\t0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,\n\t0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd2,0x00,0xd6,0xd7,0xd3,0x00,0xd7,0xd8,0xd4,0x00,0xd8,0xd9,0xd6,0x00,0xd9,0xda,0xd7,0x00,\n\t0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe2,0xde,0x00,0xe2,0xe3,0xdf,0x00,\n\t0xe3,0xe4,0xe0,0x00,0xe4,0xe5,0xe1,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,\n\t0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,\n\t0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,\n\t0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,\n\t0x15,0x13,0x15,0x00,0x16,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,\n\t0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x22,0x00,\n\t0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,\n\t0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,\n\t0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,0x3c,0x3b,0x3c,0x00,\n\t0x3d,0x3c,0x3d,0x00,0x3e,0x3d,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,\n\t0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,\n\t0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,\n\t0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x74,0x74,0x73,0x00,0x75,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,\n\t0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7d,0x7c,0x00,0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,\n\t0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x8a,0x8a,0x89,0x00,0x8b,0x8b,0x8a,0x00,\n\t0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8f,0x8e,0x00,0x8f,0x90,0x8f,0x00,0x90,0x91,0x90,0x00,0x91,0x92,0x91,0x00,0x92,0x93,0x92,0x00,0x93,0x94,0x92,0x00,\n\t0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x97,0x97,0x95,0x00,0x98,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9c,0x00,\n\t0x9d,0x9e,0x9d,0x00,0x9e,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa4,0x00,\n\t0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa9,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xae,0xab,0x00,0xae,0xaf,0xac,0x00,\n\t0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,\n\t0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,\n\t0xc0,0xc0,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc5,0xc2,0x00,0xc4,0xc6,0xc3,0x00,0xc5,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,\n\t0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,\n\t0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd2,0x00,0xd6,0xd7,0xd3,0x00,0xd7,0xd8,0xd4,0x00,0xd8,0xd9,0xd6,0x00,0xd9,0xda,0xd7,0x00,\n\t0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe2,0xde,0x00,0xe2,0xe3,0xdf,0x00,\n\t0xe3,0xe4,0xe0,0x00,0xe4,0xe5,0xe1,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,\n\t0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,\n\t0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfc,0xfc,0xf8,0x00,0xfd,0xfd,0xf9,0x00,\n\t0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,\n\t0x15,0x13,0x15,0x00,0x16,0x14,0x16,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,\n\t0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x22,0x00,\n\t0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,\n\t0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,\n\t0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3a,0x3b,0x00,0x3c,0x3b,0x3c,0x00,\n\t0x3d,0x3c,0x3d,0x00,0x3e,0x3d,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x44,0x00,0x45,0x45,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4e,0x00,\n\t0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,\n\t0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5f,0x5f,0x5f,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,\n\t0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x75,0x75,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,\n\t0x7a,0x7a,0x79,0x00,0x7b,0x7b,0x7a,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,\n\t0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x8a,0x88,0x00,0x8b,0x8b,0x8a,0x00,\n\t0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x90,0x8f,0x00,0x90,0x91,0x90,0x00,0x91,0x92,0x91,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,\n\t0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x99,0x99,0x97,0x00,0x9a,0x9a,0x98,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,\n\t0x9d,0x9e,0x9d,0x00,0x9e,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa6,0xa4,0x00,\n\t0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xaa,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xaf,0xac,0x00,\n\t0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,\n\t0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbe,0x00,\n\t0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc6,0xc3,0x00,0xc5,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,\n\t0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xcf,0x00,\n\t0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd6,0xd2,0x00,0xd6,0xd7,0xd3,0x00,0xd7,0xd8,0xd4,0x00,0xd8,0xd9,0xd6,0x00,0xd9,0xda,0xd7,0x00,\n\t0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe3,0xdf,0x00,\n\t0xe3,0xe4,0xe0,0x00,0xe4,0xe5,0xe1,0x00,0xe5,0xe6,0xe2,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,\n\t0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,0xf4,0xf4,0xf1,0x00,\n\t0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfd,0xfd,0xf9,0x00,\n\t0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,\n\t0x15,0x13,0x15,0x00,0x16,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,\n\t0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x22,0x00,\n\t0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,\n\t0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,\n\t0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,0x3c,0x3b,0x3c,0x00,\n\t0x3d,0x3c,0x3d,0x00,0x3e,0x3d,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,\n\t0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,\n\t0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,\n\t0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6b,0x6b,0x00,0x6b,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,\n\t0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x76,0x76,0x75,0x00,0x77,0x77,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x78,0x00,\n\t0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7f,0x7e,0x00,0x7f,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,\n\t0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x86,0x86,0x85,0x00,0x87,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,\n\t0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x91,0x90,0x00,0x91,0x92,0x90,0x00,0x92,0x93,0x91,0x00,0x93,0x94,0x92,0x00,\n\t0x94,0x95,0x93,0x00,0x95,0x96,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,\n\t0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,\n\t0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,\n\t0xaf,0xb0,0xad,0x00,0xb0,0xb1,0xae,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb7,0xb5,0x00,\n\t0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,\n\t0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,0xc8,0xc9,0xc6,0x00,\n\t0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcc,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcc,0x00,0xd0,0xd0,0xcd,0x00,0xd1,0xd1,0xce,0x00,\n\t0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd7,0xd3,0x00,0xd7,0xd8,0xd4,0x00,0xd8,0xd9,0xd6,0x00,0xd9,0xda,0xd7,0x00,\n\t0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,\n\t0xe3,0xe4,0xe0,0x00,0xe4,0xe5,0xe1,0x00,0xe5,0xe6,0xe2,0x00,0xe6,0xe7,0xe3,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,\n\t0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf1,0xed,0x00,0xf1,0xf2,0xee,0x00,0xf2,0xf3,0xef,0x00,0xf3,0xf4,0xf0,0x00,\n\t0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,\n\t0xfe,0xfe,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x13,0x00,\n\t0x15,0x13,0x14,0x00,0x16,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,\n\t0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x22,0x00,\n\t0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,\n\t0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,\n\t0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,\n\t0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,\n\t0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,\n\t0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x55,0x55,0x00,0x55,0x56,0x56,0x00,\n\t0x56,0x57,0x57,0x00,0x57,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x62,0x61,0x62,0x00,0x63,0x62,0x63,0x00,0x64,0x63,0x64,0x00,0x65,0x64,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6b,0x6b,0x00,0x6b,0x6c,0x6c,0x00,0x6c,0x6d,0x6d,0x00,0x6d,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,\n\t0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x78,0x78,0x77,0x00,0x79,0x79,0x79,0x00,\n\t0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,\n\t0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x85,0x86,0x85,0x00,0x86,0x87,0x86,0x00,0x88,0x88,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,\n\t0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,\n\t0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x97,0x95,0x00,0x97,0x98,0x96,0x00,0x98,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,\n\t0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,\n\t0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,\n\t0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb6,0xb5,0x00,\n\t0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,\n\t0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,\n\t0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,\n\t0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd9,0xd6,0x00,0xd9,0xda,0xd7,0x00,\n\t0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,\n\t0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xea,0xe6,0x00,0xea,0xeb,0xe7,0x00,\n\t0xeb,0xec,0xe8,0x00,0xec,0xed,0xe9,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,\n\t0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf7,0xf6,0xf3,0x00,0xf8,0xf7,0xf4,0x00,0xf9,0xf8,0xf5,0x00,0xfa,0xfa,0xf6,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,\n\t0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x13,0x00,\n\t0x15,0x13,0x14,0x00,0x16,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,\n\t0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x22,0x00,\n\t0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,\n\t0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,\n\t0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,\n\t0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,\n\t0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,\n\t0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x55,0x55,0x00,0x55,0x56,0x56,0x00,\n\t0x56,0x57,0x57,0x00,0x57,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x62,0x61,0x62,0x00,0x63,0x62,0x63,0x00,0x64,0x63,0x64,0x00,0x65,0x64,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6b,0x6b,0x00,0x6b,0x6c,0x6c,0x00,0x6c,0x6d,0x6d,0x00,0x6d,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,\n\t0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,\n\t0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x81,0x81,0x80,0x00,0x82,0x82,0x81,0x00,\n\t0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x85,0x85,0x84,0x00,0x85,0x86,0x85,0x00,0x86,0x87,0x86,0x00,0x87,0x88,0x87,0x00,0x89,0x8a,0x88,0x00,0x8a,0x8b,0x89,0x00,\n\t0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,\n\t0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x97,0x95,0x00,0x96,0x98,0x96,0x00,0x97,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9b,0x9c,0x9a,0x00,0x9c,0x9d,0x9b,0x00,\n\t0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa4,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,\n\t0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,\n\t0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,0xb6,0xb6,0xb5,0x00,\n\t0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,\n\t0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc3,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,\n\t0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,\n\t0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd4,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd9,0xd6,0x00,0xd9,0xda,0xd7,0x00,\n\t0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,\n\t0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xea,0xe6,0x00,0xea,0xeb,0xe7,0x00,\n\t0xeb,0xec,0xe8,0x00,0xec,0xed,0xe9,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,\n\t0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf7,0xf6,0xf3,0x00,0xf8,0xf7,0xf4,0x00,0xf9,0xf8,0xf5,0x00,0xfa,0xf9,0xf6,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,\n\t0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x13,0x00,\n\t0x15,0x13,0x14,0x00,0x16,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1c,0x00,\n\t0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x22,0x00,\n\t0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,\n\t0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x34,0x00,\n\t0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,\n\t0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3e,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x45,0x00,\n\t0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x48,0x47,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,\n\t0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x56,0x56,0x00,\n\t0x56,0x57,0x57,0x00,0x57,0x58,0x58,0x00,0x58,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x63,0x62,0x63,0x00,0x64,0x63,0x64,0x00,0x65,0x64,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6c,0x6c,0x00,0x6c,0x6d,0x6d,0x00,0x6d,0x6e,0x6e,0x00,0x6e,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,\n\t0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x78,0x77,0x00,0x79,0x79,0x79,0x00,\n\t0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x82,0x82,0x81,0x00,\n\t0x83,0x83,0x82,0x00,0x84,0x84,0x83,0x00,0x84,0x85,0x84,0x00,0x85,0x86,0x85,0x00,0x86,0x87,0x86,0x00,0x87,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8b,0x89,0x00,\n\t0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,\n\t0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x95,0x96,0x95,0x00,0x96,0x98,0x96,0x00,0x97,0x99,0x97,0x00,0x99,0x9a,0x98,0x00,0x9a,0x9b,0x9a,0x00,0x9c,0x9d,0x9b,0x00,\n\t0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa5,0xa5,0xa3,0x00,\n\t0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xae,0xae,0xac,0x00,\n\t0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,\n\t0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,\n\t0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc4,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc6,0x00,\n\t0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd1,0xce,0x00,\n\t0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd5,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xda,0xd7,0x00,\n\t0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,\n\t0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xeb,0xe7,0x00,\n\t0xeb,0xec,0xe8,0x00,0xec,0xed,0xe9,0x00,0xed,0xee,0xea,0x00,0xee,0xef,0xec,0x00,0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,\n\t0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf8,0xf7,0xf4,0x00,0xf9,0xf8,0xf5,0x00,0xfa,0xf9,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf9,0x00,\n\t0xfd,0xfd,0xfa,0x00,0xfd,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x13,0x00,\n\t0x15,0x13,0x14,0x00,0x16,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,\n\t0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x22,0x00,\n\t0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,\n\t0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,\n\t0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,\n\t0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3e,0x3f,0x00,0x40,0x3f,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x48,0x47,0x48,0x00,0x49,0x48,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,\n\t0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,\n\t0x56,0x57,0x57,0x00,0x57,0x58,0x58,0x00,0x58,0x59,0x59,0x00,0x59,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x64,0x63,0x64,0x00,0x65,0x64,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6d,0x6d,0x00,0x6d,0x6e,0x6e,0x00,0x6e,0x6f,0x6f,0x00,0x6f,0x70,0x70,0x00,\n\t0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,\n\t0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,\n\t0x83,0x83,0x82,0x00,0x83,0x84,0x83,0x00,0x84,0x85,0x84,0x00,0x85,0x86,0x85,0x00,0x86,0x87,0x86,0x00,0x87,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,\n\t0x8b,0x8c,0x8a,0x00,0x8c,0x8d,0x8b,0x00,0x8e,0x8e,0x8c,0x00,0x8f,0x8f,0x8d,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x92,0x00,\n\t0x94,0x94,0x93,0x00,0x94,0x95,0x94,0x00,0x95,0x96,0x95,0x00,0x96,0x97,0x96,0x00,0x97,0x99,0x98,0x00,0x99,0x9a,0x99,0x00,0x9a,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,\n\t0x9e,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,\n\t0xa6,0xa6,0xa4,0x00,0xa7,0xa7,0xa5,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,\n\t0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xaf,0x00,0xb2,0xb2,0xb0,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,\n\t0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,\n\t0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc5,0xc5,0xc2,0x00,0xc6,0xc6,0xc3,0x00,0xc7,0xc7,0xc4,0x00,0xc8,0xc8,0xc5,0x00,\n\t0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,\n\t0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd6,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,\n\t0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,\n\t0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,\n\t0xeb,0xec,0xe8,0x00,0xec,0xed,0xe9,0x00,0xed,0xee,0xea,0x00,0xee,0xef,0xeb,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,\n\t0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf9,0xf8,0xf5,0x00,0xfa,0xf9,0xf6,0x00,0xfb,0xfb,0xf7,0x00,0xfc,0xfc,0xf8,0x00,\n\t0xfd,0xfd,0xfa,0x00,0xfd,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x13,0x00,\n\t0x15,0x13,0x14,0x00,0x16,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x22,0x00,\n\t0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,\n\t0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x32,0x32,0x00,0x32,0x33,0x33,0x00,\n\t0x33,0x34,0x34,0x00,0x34,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3f,0x3e,0x3f,0x00,0x40,0x3f,0x40,0x00,0x41,0x40,0x41,0x00,0x42,0x41,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x48,0x47,0x48,0x00,0x49,0x48,0x49,0x00,0x4a,0x49,0x4a,0x00,0x4b,0x4a,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,\n\t0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,\n\t0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6f,0x6f,0x00,0x6f,0x70,0x70,0x00,\n\t0x70,0x71,0x71,0x00,0x71,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,\n\t0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,\n\t0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x88,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,\n\t0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8e,0x8d,0x8c,0x00,0x8f,0x8e,0x8d,0x00,0x90,0x8f,0x8e,0x00,0x91,0x90,0x8f,0x00,0x92,0x92,0x91,0x00,0x92,0x93,0x92,0x00,\n\t0x93,0x94,0x93,0x00,0x94,0x95,0x94,0x00,0x95,0x96,0x95,0x00,0x96,0x97,0x97,0x00,0x97,0x98,0x98,0x00,0x99,0x9a,0x99,0x00,0x9a,0x9b,0x9a,0x00,0x9c,0x9c,0x9a,0x00,\n\t0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,\n\t0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa7,0x00,0xa8,0xa9,0xa8,0x00,0xa9,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,\n\t0xae,0xae,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,\n\t0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,\n\t0xbf,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,\n\t0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,\n\t0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,\n\t0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe1,0xde,0x00,0xe1,0xe2,0xdf,0x00,\n\t0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe6,0x00,\n\t0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe9,0x00,0xed,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,\n\t0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfb,0xf7,0x00,0xfb,0xfc,0xf8,0x00,\n\t0xfc,0xfd,0xf9,0x00,0xfd,0xfe,0xfa,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0e,0x0e,0x0e,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x13,0x00,\n\t0x15,0x13,0x14,0x00,0x16,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x22,0x00,\n\t0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,\n\t0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x32,0x32,0x00,0x32,0x33,0x33,0x00,\n\t0x33,0x34,0x34,0x00,0x34,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3f,0x3e,0x3f,0x00,0x40,0x3f,0x40,0x00,0x41,0x40,0x41,0x00,0x42,0x41,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x48,0x47,0x48,0x00,0x49,0x48,0x49,0x00,0x4a,0x49,0x4a,0x00,0x4b,0x4a,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,\n\t0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,\n\t0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5d,0x5d,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6f,0x6f,0x00,0x6f,0x70,0x70,0x00,\n\t0x70,0x71,0x71,0x00,0x71,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x78,0x77,0x00,0x78,0x79,0x78,0x00,\n\t0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7c,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,\n\t0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x89,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,\n\t0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8e,0x8d,0x8c,0x00,0x8f,0x8e,0x8d,0x00,0x90,0x8f,0x8e,0x00,0x91,0x90,0x8f,0x00,0x92,0x92,0x91,0x00,0x92,0x93,0x92,0x00,\n\t0x93,0x94,0x93,0x00,0x94,0x95,0x94,0x00,0x95,0x96,0x96,0x00,0x96,0x97,0x97,0x00,0x97,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9b,0x9a,0x00,0x9c,0x9c,0x9a,0x00,\n\t0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa4,0xa2,0x00,0xa4,0xa5,0xa3,0x00,\n\t0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa7,0x00,0xa8,0xa9,0xa8,0x00,0xa9,0xaa,0xa9,0x00,0xaa,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,\n\t0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,\n\t0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,\n\t0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,\n\t0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xcb,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,\n\t0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,\n\t0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe1,0xde,0x00,0xe1,0xe2,0xdf,0x00,\n\t0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe6,0x00,\n\t0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xee,0xee,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,\n\t0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfb,0xf7,0x00,0xfb,0xfc,0xf8,0x00,\n\t0xfc,0xfd,0xf9,0x00,0xfd,0xfe,0xfa,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0f,0x0f,0x0f,0x00,0x11,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,\n\t0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x22,0x00,\n\t0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2b,0x2b,0x00,\n\t0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x33,0x33,0x00,\n\t0x33,0x34,0x34,0x00,0x34,0x35,0x35,0x00,0x35,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x40,0x3f,0x40,0x00,0x41,0x40,0x41,0x00,0x42,0x41,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x48,0x00,0x49,0x48,0x49,0x00,0x4a,0x49,0x4a,0x00,0x4b,0x4a,0x4b,0x00,0x4c,0x4b,0x4c,0x00,0x4d,0x4d,0x4d,0x00,\n\t0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x56,0x00,\n\t0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5e,0x5e,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x67,0x67,0x67,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x70,0x70,0x00,\n\t0x70,0x71,0x71,0x00,0x71,0x72,0x72,0x00,0x72,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x79,0x78,0x00,\n\t0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7b,0x7c,0x7b,0x00,0x7d,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x81,0x00,\n\t0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x89,0x88,0x00,0x8a,0x8a,0x89,0x00,\n\t0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8f,0x8e,0x8d,0x00,0x90,0x8f,0x8e,0x00,0x91,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x93,0x92,0x00,\n\t0x93,0x94,0x93,0x00,0x94,0x95,0x94,0x00,0x95,0x96,0x95,0x00,0x96,0x97,0x97,0x00,0x97,0x98,0x98,0x00,0x98,0x99,0x99,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9c,0x9a,0x00,\n\t0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa5,0xa3,0x00,\n\t0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa8,0x00,0xa9,0xaa,0xa9,0x00,0xaa,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,\n\t0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb6,0xb6,0xb4,0x00,\n\t0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbf,0xbd,0x00,\n\t0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc3,0xc4,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,\n\t0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcc,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,\n\t0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd7,0xd8,0xd5,0x00,0xd9,0xd9,0xd6,0x00,\n\t0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe2,0xdf,0x00,\n\t0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe6,0x00,\n\t0xeb,0xeb,0xe7,0x00,0xec,0xec,0xe8,0x00,0xed,0xed,0xea,0x00,0xef,0xef,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xf0,0x00,\n\t0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfc,0xf8,0x00,\n\t0xfc,0xfd,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x11,0x0f,0x11,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,\n\t0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x22,0x00,\n\t0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2c,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,\n\t0x33,0x34,0x34,0x00,0x34,0x35,0x35,0x00,0x35,0x36,0x36,0x00,0x36,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,0x3b,0x3b,0x3b,0x00,\n\t0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x41,0x40,0x41,0x00,0x42,0x41,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x4a,0x49,0x4a,0x00,0x4b,0x4a,0x4b,0x00,0x4c,0x4b,0x4c,0x00,0x4d,0x4c,0x4d,0x00,\n\t0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,\n\t0x57,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,\n\t0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,\n\t0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,\n\t0x70,0x71,0x71,0x00,0x71,0x72,0x72,0x00,0x72,0x73,0x73,0x00,0x73,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,\n\t0x79,0x7a,0x79,0x00,0x7a,0x7b,0x7a,0x00,0x7b,0x7c,0x7b,0x00,0x7c,0x7d,0x7c,0x00,0x7e,0x7e,0x7d,0x00,0x7f,0x7f,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,\n\t0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x89,0x88,0x00,0x89,0x8a,0x89,0x00,\n\t0x8b,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x90,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x94,0x93,0x00,0x94,0x95,0x94,0x00,0x95,0x96,0x95,0x00,0x96,0x97,0x96,0x00,0x97,0x98,0x98,0x00,0x98,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9c,0x9a,0x00,\n\t0x9d,0x9d,0x9b,0x00,0x9e,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,\n\t0xa5,0xa6,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa9,0x00,0xaa,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,\n\t0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,\n\t0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,\n\t0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc4,0xc5,0xc2,0x00,0xc5,0xc6,0xc3,0x00,0xc6,0xc7,0xc4,0x00,0xc7,0xc8,0xc5,0x00,\n\t0xc8,0xc9,0xc6,0x00,0xc9,0xca,0xc7,0x00,0xca,0xcb,0xc8,0x00,0xcb,0xcc,0xc9,0x00,0xcd,0xcd,0xca,0x00,0xce,0xce,0xcb,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,\n\t0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,0xd7,0xd8,0xd5,0x00,0xd8,0xd9,0xd6,0x00,\n\t0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,\n\t0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,\n\t0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xf0,0xf0,0xec,0x00,0xf1,0xf1,0xed,0x00,0xf2,0xf2,0xee,0x00,0xf3,0xf3,0xef,0x00,\n\t0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,\n\t0xfc,0xfd,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,\n\t0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,\n\t0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x3a,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,\n\t0x3c,0x3b,0x3c,0x00,0x3d,0x3c,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,\n\t0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x56,0x55,0x55,0x00,\n\t0x57,0x56,0x56,0x00,0x58,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,\n\t0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,\n\t0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,\n\t0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x76,0x75,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,\n\t0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,\n\t0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x89,0x88,0x00,0x89,0x8a,0x89,0x00,\n\t0x8a,0x8b,0x8a,0x00,0x8c,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9c,0x9a,0x00,\n\t0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,\n\t0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,\n\t0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,\n\t0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,\n\t0xbf,0xbf,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,\n\t0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,\n\t0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd8,0xd5,0x00,0xd8,0xd9,0xd6,0x00,\n\t0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,\n\t0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe5,0xe1,0x00,0xe5,0xe6,0xe2,0x00,0xe6,0xe7,0xe3,0x00,0xe7,0xe8,0xe4,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,\n\t0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf2,0xee,0x00,0xf2,0xf3,0xef,0x00,\n\t0xf3,0xf4,0xf0,0x00,0xf4,0xf5,0xf1,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf8,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,\n\t0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,\n\t0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,\n\t0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x3a,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,\n\t0x3c,0x3b,0x3c,0x00,0x3d,0x3c,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x43,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,\n\t0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x55,0x54,0x54,0x00,0x56,0x55,0x55,0x00,\n\t0x57,0x56,0x56,0x00,0x58,0x57,0x57,0x00,0x59,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,\n\t0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,\n\t0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,\n\t0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,\n\t0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x80,0x80,0x7f,0x00,0x81,0x81,0x80,0x00,\n\t0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x89,0x88,0x00,0x89,0x8a,0x89,0x00,\n\t0x8a,0x8b,0x8a,0x00,0x8b,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9c,0x9a,0x00,\n\t0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9f,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,\n\t0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,\n\t0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,\n\t0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,\n\t0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,\n\t0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,\n\t0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd8,0xd5,0x00,0xd8,0xd9,0xd6,0x00,\n\t0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,\n\t0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe5,0xe1,0x00,0xe5,0xe6,0xe2,0x00,0xe6,0xe7,0xe3,0x00,0xe7,0xe8,0xe4,0x00,0xe9,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,\n\t0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf2,0xee,0x00,0xf2,0xf3,0xef,0x00,\n\t0xf3,0xf4,0xf0,0x00,0xf4,0xf5,0xf1,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf8,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,\n\t0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,\n\t0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,\n\t0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,\n\t0x3c,0x3b,0x3c,0x00,0x3d,0x3c,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x43,0x43,0x00,0x44,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,\n\t0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x50,0x4f,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x56,0x55,0x55,0x00,\n\t0x57,0x56,0x56,0x00,0x58,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5e,0x00,\n\t0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,\n\t0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,\n\t0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x77,0x77,0x00,0x78,0x78,0x78,0x00,\n\t0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x81,0x81,0x80,0x00,\n\t0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x8a,0x89,0x00,\n\t0x8a,0x8b,0x8a,0x00,0x8b,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,\n\t0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0xa0,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,\n\t0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xad,0xad,0xab,0x00,\n\t0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,\n\t0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,\n\t0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,\n\t0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xd0,0xd0,0xce,0x00,\n\t0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd9,0xd6,0x00,\n\t0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,\n\t0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe6,0xe2,0x00,0xe6,0xe7,0xe3,0x00,0xe7,0xe8,0xe4,0x00,0xe8,0xe9,0xe6,0x00,0xea,0xea,0xe7,0x00,\n\t0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf3,0xef,0x00,\n\t0xf3,0xf4,0xf0,0x00,0xf4,0xf5,0xf1,0x00,0xf5,0xf6,0xf2,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf8,0xf9,0xf6,0x00,0xf9,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,\n\t0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,\n\t0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,\n\t0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,\n\t0x3c,0x3b,0x3c,0x00,0x3d,0x3c,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x43,0x43,0x00,0x43,0x44,0x44,0x00,\n\t0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,\n\t0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x50,0x4f,0x50,0x00,0x51,0x50,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,\n\t0x57,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,\n\t0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,\n\t0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,\n\t0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x77,0x77,0x00,0x77,0x78,0x78,0x00,\n\t0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,\n\t0x82,0x82,0x81,0x00,0x83,0x83,0x82,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,\n\t0x8a,0x8b,0x8a,0x00,0x8b,0x8c,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,\n\t0x9c,0x9d,0x9b,0x00,0x9d,0x9e,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa1,0xa1,0x9f,0x00,0xa2,0xa2,0xa0,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,\n\t0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,0xac,0xad,0xab,0x00,\n\t0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,0xb5,0xb6,0xb4,0x00,\n\t0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,0xbe,0xbe,0xbc,0x00,\n\t0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,\n\t0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,\n\t0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,\n\t0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,\n\t0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe7,0xe4,0x00,0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,\n\t0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,\n\t0xf3,0xf4,0xf0,0x00,0xf4,0xf5,0xf1,0x00,0xf5,0xf6,0xf2,0x00,0xf6,0xf7,0xf3,0x00,0xf7,0xf8,0xf5,0x00,0xf8,0xf9,0xf6,0x00,0xf9,0xfa,0xf7,0x00,0xfa,0xfb,0xf8,0x00,\n\t0xfc,0xfc,0xf9,0x00,0xfc,0xfd,0xfa,0x00,0xfd,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,\n\t0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,\n\t0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,\n\t0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,\n\t0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x43,0x43,0x00,0x43,0x44,0x44,0x00,\n\t0x44,0x45,0x45,0x00,0x45,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,\n\t0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x50,0x4f,0x50,0x00,0x51,0x50,0x51,0x00,0x52,0x51,0x52,0x00,0x53,0x52,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,\n\t0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,\n\t0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,\n\t0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,\n\t0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x77,0x77,0x00,0x77,0x78,0x78,0x00,\n\t0x78,0x79,0x79,0x00,0x79,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,\n\t0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x84,0x84,0x00,0x84,0x85,0x85,0x00,0x85,0x86,0x86,0x00,0x86,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,\n\t0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,\n\t0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa2,0x00,0xa3,0xa4,0xa3,0x00,\n\t0xa4,0xa5,0xa4,0x00,0xa5,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,\n\t0xad,0xad,0xac,0x00,0xae,0xaf,0xad,0x00,0xaf,0xb0,0xaf,0x00,0xb0,0xb1,0xb0,0x00,0xb1,0xb2,0xb1,0x00,0xb2,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,\n\t0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,\n\t0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,\n\t0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,\n\t0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,\n\t0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,\n\t0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe6,0x00,\n\t0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xed,0xe9,0x00,0xed,0xee,0xea,0x00,0xee,0xef,0xeb,0x00,0xef,0xf0,0xec,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,\n\t0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xfa,0xf6,0x00,0xfa,0xfb,0xf7,0x00,\n\t0xfb,0xfc,0xf8,0x00,0xfc,0xfd,0xf9,0x00,0xfd,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,\n\t0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,\n\t0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,\n\t0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,\n\t0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x43,0x43,0x00,0x43,0x44,0x44,0x00,\n\t0x44,0x45,0x45,0x00,0x45,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,\n\t0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x50,0x4f,0x50,0x00,0x51,0x50,0x51,0x00,0x52,0x51,0x52,0x00,0x53,0x52,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,\n\t0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,\n\t0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,\n\t0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,\n\t0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x77,0x77,0x00,0x77,0x78,0x78,0x00,\n\t0x78,0x79,0x79,0x00,0x79,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,\n\t0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x84,0x84,0x00,0x84,0x85,0x85,0x00,0x85,0x86,0x86,0x00,0x86,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,\n\t0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8d,0x8d,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x9a,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,\n\t0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9f,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa2,0x00,0xa3,0xa4,0xa3,0x00,\n\t0xa4,0xa5,0xa4,0x00,0xa5,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,\n\t0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xb0,0xaf,0x00,0xb0,0xb1,0xb0,0x00,0xb1,0xb2,0xb1,0x00,0xb2,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,\n\t0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbb,0x00,\n\t0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbe,0x00,0xc1,0xc2,0xbf,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,\n\t0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,\n\t0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,\n\t0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,\n\t0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe6,0x00,\n\t0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xed,0xe9,0x00,0xed,0xee,0xea,0x00,0xee,0xef,0xeb,0x00,0xef,0xf0,0xec,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,\n\t0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xfa,0xf6,0x00,0xfa,0xfb,0xf7,0x00,\n\t0xfb,0xfc,0xf8,0x00,0xfc,0xfd,0xf9,0x00,0xfd,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,\n\t0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,\n\t0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x33,0x00,\n\t0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,\n\t0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3d,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x43,0x00,0x43,0x44,0x44,0x00,\n\t0x44,0x45,0x45,0x00,0x45,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4d,0x00,\n\t0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x51,0x50,0x51,0x00,0x52,0x51,0x52,0x00,0x53,0x52,0x53,0x00,0x54,0x53,0x54,0x00,0x55,0x55,0x55,0x00,\n\t0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,\n\t0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x66,0x66,0x66,0x00,\n\t0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,\n\t0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x78,0x78,0x00,\n\t0x78,0x79,0x79,0x00,0x79,0x7a,0x7a,0x00,0x7a,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,\n\t0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x85,0x85,0x00,0x85,0x86,0x86,0x00,0x86,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,\n\t0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8d,0x8c,0x8c,0x00,0x8e,0x8e,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9b,0x9b,0x9a,0x00,\n\t0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0xa0,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa3,0x00,\n\t0xa4,0xa5,0xa4,0x00,0xa5,0xa6,0xa5,0x00,0xa6,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,\n\t0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xb0,0x00,0xb1,0xb2,0xb1,0x00,0xb2,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,\n\t0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbb,0x00,\n\t0xbe,0xbf,0xbc,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc2,0xc3,0xc0,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,\n\t0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,\n\t0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd4,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,\n\t0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe1,0xde,0x00,\n\t0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,\n\t0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xee,0xea,0x00,0xee,0xef,0xeb,0x00,0xef,0xf0,0xec,0x00,0xf0,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,\n\t0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfb,0xf7,0x00,\n\t0xfb,0xfc,0xf8,0x00,0xfc,0xfd,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,\n\t0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x16,0x00,0x17,0x17,0x17,0x00,0x18,0x18,0x18,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,\n\t0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,\n\t0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3d,0x3e,0x00,0x3f,0x3e,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,\n\t0x44,0x45,0x45,0x00,0x45,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,\n\t0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x52,0x51,0x52,0x00,0x53,0x52,0x53,0x00,0x54,0x53,0x54,0x00,0x55,0x54,0x55,0x00,\n\t0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,\n\t0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,\n\t0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,\n\t0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x72,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,\n\t0x78,0x79,0x79,0x00,0x79,0x7a,0x7a,0x00,0x7a,0x7b,0x7b,0x00,0x7b,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,\n\t0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x86,0x86,0x00,0x86,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,\n\t0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8d,0x8c,0x8c,0x00,0x8e,0x8d,0x8d,0x00,0x8f,0x8f,0x8e,0x00,0x90,0x90,0x8f,0x00,0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,\n\t0x93,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,\n\t0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa1,0x9f,0x00,0xa1,0xa2,0xa0,0x00,0xa2,0xa3,0xa1,0x00,0xa3,0xa4,0xa2,0x00,\n\t0xa4,0xa5,0xa4,0x00,0xa5,0xa6,0xa5,0x00,0xa6,0xa7,0xa6,0x00,0xa7,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,\n\t0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb1,0x00,0xb2,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,\n\t0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,0xbd,0xbe,0xbc,0x00,\n\t0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc3,0xc0,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,\n\t0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,\n\t0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd5,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,\n\t0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdc,0xdc,0xd9,0x00,0xdd,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,\n\t0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe9,0xe6,0x00,\n\t0xea,0xea,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xef,0xeb,0x00,0xef,0xf0,0xec,0x00,0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,\n\t0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,\n\t0xfb,0xfc,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,\n\t0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,\n\t0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,\n\t0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3d,0x3e,0x00,0x3f,0x3e,0x3f,0x00,0x40,0x3f,0x40,0x00,0x41,0x41,0x41,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,\n\t0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x47,0x46,0x47,0x00,0x48,0x47,0x48,0x00,0x49,0x48,0x49,0x00,0x4a,0x49,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,\n\t0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x54,0x53,0x54,0x00,0x55,0x54,0x54,0x00,\n\t0x56,0x55,0x55,0x00,0x57,0x56,0x56,0x00,0x58,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,\n\t0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x65,0x00,\n\t0x66,0x66,0x66,0x00,0x67,0x67,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,\n\t0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x72,0x73,0x00,0x74,0x73,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,\n\t0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,\n\t0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,\n\t0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8d,0x8c,0x8c,0x00,0x8e,0x8d,0x8d,0x00,0x8f,0x8e,0x8e,0x00,0x90,0x8f,0x8f,0x00,0x91,0x90,0x90,0x00,0x91,0x91,0x91,0x00,\n\t0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x95,0x94,0x00,0x95,0x96,0x95,0x00,0x96,0x97,0x96,0x00,0x98,0x98,0x97,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,\n\t0x9b,0x9b,0x9b,0x00,0x9c,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,\n\t0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,\n\t0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,\n\t0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,\n\t0xbe,0xbe,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc3,0xc0,0x00,0xc2,0xc4,0xc1,0x00,0xc3,0xc5,0xc2,0x00,0xc4,0xc6,0xc4,0x00,0xc5,0xc6,0xc5,0x00,\n\t0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,\n\t0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,\n\t0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,\n\t0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe8,0xe6,0x00,\n\t0xea,0xe9,0xe7,0x00,0xeb,0xeb,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,\n\t0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,\n\t0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,\n\t0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,\n\t0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,\n\t0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3d,0x3e,0x00,0x3f,0x3e,0x3f,0x00,0x40,0x3f,0x40,0x00,0x41,0x40,0x41,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,\n\t0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x47,0x46,0x47,0x00,0x48,0x47,0x48,0x00,0x49,0x48,0x49,0x00,0x4a,0x49,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,\n\t0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x54,0x53,0x54,0x00,0x55,0x54,0x54,0x00,\n\t0x56,0x55,0x55,0x00,0x57,0x56,0x56,0x00,0x58,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5c,0x5c,0x5c,0x00,0x5d,0x5d,0x5d,0x00,\n\t0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x65,0x00,\n\t0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,\n\t0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x72,0x73,0x00,0x74,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,\n\t0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,\n\t0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,\n\t0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8d,0x8c,0x8c,0x00,0x8e,0x8d,0x8d,0x00,0x8f,0x8e,0x8e,0x00,0x90,0x8f,0x8f,0x00,0x91,0x90,0x90,0x00,0x91,0x91,0x91,0x00,\n\t0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x95,0x94,0x00,0x95,0x96,0x95,0x00,0x96,0x97,0x96,0x00,0x97,0x98,0x97,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,\n\t0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,\n\t0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,\n\t0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb4,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,\n\t0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,\n\t0xbe,0xbe,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc3,0xc0,0x00,0xc2,0xc4,0xc1,0x00,0xc3,0xc5,0xc2,0x00,0xc4,0xc6,0xc4,0x00,0xc5,0xc6,0xc5,0x00,\n\t0xc6,0xc7,0xc6,0x00,0xc7,0xc8,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,\n\t0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd7,0xd7,0xd4,0x00,0xd8,0xd8,0xd5,0x00,\n\t0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xdb,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,\n\t0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,0xe8,0xe8,0xe5,0x00,0xe9,0xe8,0xe6,0x00,\n\t0xea,0xe9,0xe7,0x00,0xeb,0xea,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,\n\t0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,\n\t0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,\n\t0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x19,0x18,0x19,0x00,0x1a,0x19,0x1b,0x00,\n\t0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,\n\t0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3e,0x3f,0x00,0x40,0x3f,0x40,0x00,0x41,0x40,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x44,0x00,\n\t0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x48,0x47,0x48,0x00,0x49,0x48,0x49,0x00,0x4a,0x49,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,\n\t0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x54,0x53,0x53,0x00,0x55,0x54,0x54,0x00,\n\t0x56,0x55,0x55,0x00,0x57,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5d,0x5d,0x5d,0x00,\n\t0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,\n\t0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6f,0x00,\n\t0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x73,0x72,0x73,0x00,0x74,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,\n\t0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7f,0x7e,0x7e,0x00,0x80,0x80,0x80,0x00,\n\t0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x89,0x89,0x89,0x00,\n\t0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8e,0x8d,0x8d,0x00,0x8f,0x8e,0x8e,0x00,0x90,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,\n\t0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x96,0x95,0x00,0x96,0x97,0x96,0x00,0x97,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x9a,0x00,\n\t0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9e,0x9d,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,\n\t0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xab,0x00,\n\t0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb5,0xb5,0xb3,0x00,\n\t0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbc,0x00,\n\t0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc4,0xc1,0x00,0xc3,0xc5,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc5,0x00,\n\t0xc6,0xc7,0xc6,0x00,0xc7,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,\n\t0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd8,0xd8,0xd5,0x00,\n\t0xd9,0xd9,0xd6,0x00,0xda,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,\n\t0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe9,0xe8,0xe6,0x00,\n\t0xea,0xe9,0xe7,0x00,0xeb,0xea,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf2,0xef,0x00,\n\t0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,\n\t0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,\n\t0x14,0x13,0x14,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x19,0x18,0x19,0x00,0x1a,0x19,0x1a,0x00,\n\t0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,\n\t0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2e,0x2e,0x00,0x2f,0x2f,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,0x32,0x32,0x32,0x00,\n\t0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,\n\t0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x40,0x3f,0x40,0x00,0x41,0x40,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,\n\t0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x49,0x48,0x49,0x00,0x4a,0x49,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,\n\t0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x52,0x00,0x54,0x53,0x53,0x00,0x55,0x54,0x54,0x00,\n\t0x56,0x55,0x55,0x00,0x57,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,\n\t0x5e,0x5e,0x5e,0x00,0x5f,0x5f,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,\n\t0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,\n\t0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x74,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,\n\t0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7f,0x7e,0x7e,0x00,0x80,0x7f,0x7f,0x00,\n\t0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,\n\t0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8f,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,\n\t0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x97,0x96,0x00,0x97,0x98,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,\n\t0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9e,0x9d,0x9d,0x00,0x9f,0x9e,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,\n\t0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,\n\t0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,0xb4,0xb5,0xb3,0x00,\n\t0xb6,0xb6,0xb4,0x00,0xb7,0xb7,0xb5,0x00,0xb8,0xb8,0xb6,0x00,0xb9,0xb9,0xb7,0x00,0xba,0xba,0xb8,0x00,0xbb,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,\n\t0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc4,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,\n\t0xc6,0xc7,0xc6,0x00,0xc7,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,\n\t0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,\n\t0xd9,0xd9,0xd6,0x00,0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,\n\t0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,\n\t0xea,0xe9,0xe7,0x00,0xeb,0xea,0xe8,0x00,0xec,0xec,0xe9,0x00,0xed,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,\n\t0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,\n\t0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1d,0x1c,0x1d,0x00,0x1e,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x21,0x21,0x22,0x00,\n\t0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,\n\t0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,\n\t0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4b,0x4b,0x00,0x4b,0x4c,0x4c,0x00,\n\t0x4c,0x4d,0x4d,0x00,0x4d,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x54,0x53,0x53,0x00,0x55,0x54,0x54,0x00,\n\t0x56,0x55,0x55,0x00,0x57,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x5a,0x5a,0x5a,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,\n\t0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,\n\t0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,\n\t0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,\n\t0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7f,0x7e,0x7e,0x00,0x80,0x7f,0x7f,0x00,\n\t0x81,0x80,0x80,0x00,0x82,0x81,0x81,0x00,0x83,0x83,0x83,0x00,0x83,0x84,0x84,0x00,0x84,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,\n\t0x89,0x89,0x89,0x00,0x8b,0x8a,0x8a,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,\n\t0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,\n\t0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9e,0x9d,0x9c,0x00,0x9f,0x9e,0x9d,0x00,0xa0,0x9f,0x9e,0x00,0xa1,0xa0,0x9f,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,\n\t0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,\n\t0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,\n\t0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,\n\t0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,\n\t0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xce,0xcb,0x00,0xce,0xcf,0xcc,0x00,\n\t0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,\n\t0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,\n\t0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,\n\t0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,\n\t0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,\n\t0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1d,0x1c,0x1d,0x00,0x1e,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x21,0x21,0x21,0x00,\n\t0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,\n\t0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x42,0x42,0x42,0x00,0x43,0x43,0x43,0x00,\n\t0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4b,0x4b,0x00,0x4b,0x4c,0x4c,0x00,\n\t0x4c,0x4d,0x4d,0x00,0x4d,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x54,0x53,0x53,0x00,0x55,0x54,0x54,0x00,\n\t0x56,0x55,0x55,0x00,0x57,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,\n\t0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x60,0x60,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,\n\t0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,\n\t0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,\n\t0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7f,0x7e,0x7e,0x00,0x80,0x7f,0x7f,0x00,\n\t0x81,0x80,0x80,0x00,0x82,0x81,0x81,0x00,0x83,0x83,0x83,0x00,0x83,0x84,0x84,0x00,0x84,0x85,0x85,0x00,0x85,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,\n\t0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,\n\t0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x99,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,\n\t0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9e,0x9d,0x9c,0x00,0x9f,0x9e,0x9d,0x00,0xa0,0x9f,0x9e,0x00,0xa1,0xa0,0x9f,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,\n\t0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa7,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xab,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,\n\t0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,\n\t0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbc,0xbc,0xba,0x00,0xbd,0xbd,0xbb,0x00,\n\t0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,\n\t0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xce,0xcb,0x00,0xce,0xcf,0xcc,0x00,\n\t0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,\n\t0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,\n\t0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,\n\t0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,\n\t0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf9,0xf9,0xf6,0x00,0xfa,0xfa,0xf7,0x00,\n\t0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1e,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x21,0x00,\n\t0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,\n\t0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x42,0x41,0x42,0x00,0x43,0x43,0x43,0x00,\n\t0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4c,0x4c,0x00,\n\t0x4c,0x4d,0x4d,0x00,0x4d,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x55,0x54,0x54,0x00,\n\t0x56,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,\n\t0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x61,0x61,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,\n\t0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,\n\t0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x76,0x00,0x77,0x77,0x77,0x00,\n\t0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x80,0x7f,0x7f,0x00,\n\t0x81,0x80,0x80,0x00,0x82,0x81,0x81,0x00,0x83,0x82,0x82,0x00,0x83,0x84,0x84,0x00,0x84,0x85,0x85,0x00,0x85,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,\n\t0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,\n\t0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x99,0x98,0x00,0x9a,0x9a,0x99,0x00,\n\t0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9f,0x9e,0x9d,0x00,0xa0,0x9f,0x9e,0x00,0xa1,0xa0,0x9f,0x00,0xa2,0xa1,0xa1,0x00,0xa3,0xa3,0xa2,0x00,\n\t0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa8,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xac,0xac,0xaa,0x00,\n\t0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,\n\t0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,\n\t0xbe,0xbe,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,\n\t0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xcf,0xcc,0x00,\n\t0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,\n\t0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdc,0x00,0xe0,0xe0,0xdd,0x00,\n\t0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe2,0x00,0xe6,0xe6,0xe3,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,\n\t0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,0xef,0xf0,0xed,0x00,0xf1,0xf1,0xee,0x00,\n\t0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xfa,0xfa,0xf7,0x00,\n\t0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1f,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x21,0x00,\n\t0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,\n\t0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x42,0x41,0x42,0x00,0x43,0x42,0x43,0x00,\n\t0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,\n\t0x4c,0x4d,0x4d,0x00,0x4d,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,\n\t0x56,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,\n\t0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x62,0x62,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,\n\t0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,0x6e,0x6e,0x6e,0x00,\n\t0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,\n\t0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x81,0x80,0x80,0x00,0x82,0x81,0x81,0x00,0x83,0x82,0x82,0x00,0x84,0x83,0x83,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,\n\t0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,\n\t0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x99,0x98,0x00,0x99,0x9a,0x99,0x00,\n\t0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0xa0,0x9f,0x9f,0x00,0xa1,0xa0,0xa0,0x00,0xa2,0xa1,0xa1,0x00,0xa3,0xa2,0xa2,0x00,\n\t0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa9,0xa7,0x00,0xa9,0xaa,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,\n\t0xad,0xad,0xab,0x00,0xae,0xae,0xac,0x00,0xaf,0xaf,0xad,0x00,0xb0,0xb0,0xae,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,\n\t0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xb9,0x00,0xbb,0xbc,0xba,0x00,0xbc,0xbd,0xbb,0x00,\n\t0xbd,0xbe,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,\n\t0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,\n\t0xcf,0xd0,0xcd,0x00,0xd0,0xd1,0xce,0x00,0xd1,0xd2,0xcf,0x00,0xd2,0xd3,0xd0,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,\n\t0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,\n\t0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xdf,0x00,0xe3,0xe3,0xe0,0x00,0xe4,0xe4,0xe1,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,\n\t0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,\n\t0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,\n\t0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x10,0x0e,0x10,0x00,0x11,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x21,0x00,\n\t0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,\n\t0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x42,0x41,0x42,0x00,0x43,0x42,0x43,0x00,\n\t0x44,0x43,0x44,0x00,0x45,0x44,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,\n\t0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4f,0x4e,0x4f,0x00,0x50,0x4f,0x50,0x00,0x51,0x50,0x51,0x00,0x52,0x51,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,\n\t0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,\n\t0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,\n\t0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,\n\t0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x83,0x82,0x82,0x00,0x84,0x83,0x83,0x00,0x85,0x84,0x84,0x00,0x86,0x85,0x85,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,\n\t0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x90,0x90,0x00,0x90,0x91,0x90,0x00,\n\t0x91,0x92,0x91,0x00,0x92,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x99,0x98,0x00,0x99,0x9a,0x99,0x00,\n\t0x9a,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa1,0x00,\n\t0xa3,0xa3,0xa2,0x00,0xa4,0xa5,0xa3,0x00,0xa5,0xa6,0xa5,0x00,0xa6,0xa7,0xa6,0x00,0xa7,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,\n\t0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,\n\t0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xba,0x00,\n\t0xbd,0xbd,0xbb,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc3,0x00,\n\t0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,\n\t0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,\n\t0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,\n\t0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe5,0x00,\n\t0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,\n\t0xf1,0xf2,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,\n\t0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0d,0x0d,0x0d,0x00,0x0e,0x0e,0x0e,0x00,0x10,0x0e,0x10,0x00,0x11,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x21,0x00,\n\t0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x29,0x29,0x00,0x2a,0x2a,0x2a,0x00,\n\t0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2d,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x39,0x39,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x42,0x41,0x42,0x00,0x43,0x42,0x43,0x00,\n\t0x44,0x43,0x44,0x00,0x45,0x44,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,\n\t0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4f,0x4e,0x4f,0x00,0x50,0x4f,0x50,0x00,0x51,0x50,0x51,0x00,0x52,0x51,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,\n\t0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,\n\t0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x64,0x64,0x64,0x00,0x65,0x65,0x65,0x00,\n\t0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,\n\t0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x83,0x82,0x82,0x00,0x84,0x83,0x83,0x00,0x85,0x84,0x84,0x00,0x86,0x85,0x85,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,\n\t0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x90,0x90,0x00,0x90,0x91,0x90,0x00,\n\t0x91,0x92,0x91,0x00,0x92,0x93,0x92,0x00,0x94,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x99,0x98,0x00,0x99,0x9a,0x99,0x00,\n\t0x9a,0x9b,0x9a,0x00,0x9b,0x9c,0x9b,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa1,0x00,\n\t0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa6,0xa5,0x00,0xa6,0xa7,0xa6,0x00,0xa7,0xa8,0xa7,0x00,0xa8,0xa9,0xa8,0x00,0xaa,0xab,0xa9,0x00,0xab,0xac,0xaa,0x00,\n\t0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,\n\t0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbb,0xbc,0xba,0x00,\n\t0xbc,0xbd,0xbb,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc3,0x00,\n\t0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,\n\t0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd6,0xd6,0xd4,0x00,0xd7,0xd7,0xd5,0x00,\n\t0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,\n\t0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe5,0x00,\n\t0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,\n\t0xf1,0xf2,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,\n\t0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0e,0x0e,0x0e,0x00,0x10,0x0e,0x10,0x00,0x11,0x0f,0x11,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x21,0x00,\n\t0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x29,0x00,0x2a,0x2a,0x2a,0x00,\n\t0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x3a,0x3a,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x43,0x42,0x43,0x00,\n\t0x44,0x43,0x44,0x00,0x45,0x44,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4c,0x00,\n\t0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x50,0x4f,0x50,0x00,0x51,0x50,0x51,0x00,0x52,0x51,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,\n\t0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x56,0x57,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5b,0x5a,0x5b,0x00,0x5c,0x5c,0x5d,0x00,\n\t0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x65,0x65,0x65,0x00,\n\t0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6e,0x00,\n\t0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x71,0x70,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x77,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x84,0x83,0x83,0x00,0x85,0x84,0x84,0x00,0x86,0x85,0x85,0x00,0x87,0x86,0x86,0x00,0x88,0x88,0x88,0x00,\n\t0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x91,0x90,0x00,\n\t0x91,0x92,0x91,0x00,0x92,0x93,0x92,0x00,0x93,0x94,0x93,0x00,0x95,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x98,0x00,0x99,0x9a,0x99,0x00,\n\t0x9a,0x9b,0x9a,0x00,0x9b,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,\n\t0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa6,0xa5,0x00,0xa6,0xa7,0xa6,0x00,0xa7,0xa8,0xa7,0x00,0xa8,0xa9,0xa8,0x00,0xa9,0xaa,0xa9,0x00,0xab,0xac,0xaa,0x00,\n\t0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb4,0xb4,0xb3,0x00,\n\t0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbb,0xbc,0xba,0x00,\n\t0xbc,0xbd,0xbb,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,\n\t0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xce,0xce,0xcc,0x00,\n\t0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd7,0xd7,0xd5,0x00,\n\t0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,\n\t0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe5,0x00,\n\t0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf1,0xee,0x00,\n\t0xf1,0xf2,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,\n\t0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x10,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x21,0x00,\n\t0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,\n\t0x2b,0x2b,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,\n\t0x3b,0x3b,0x3b,0x00,0x3c,0x3c,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,\n\t0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,\n\t0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x51,0x50,0x51,0x00,0x52,0x51,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,\n\t0x55,0x55,0x55,0x00,0x55,0x56,0x56,0x00,0x56,0x57,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5b,0x5a,0x5b,0x00,0x5c,0x5b,0x5c,0x00,\n\t0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,\n\t0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,\n\t0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x71,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,\n\t0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x85,0x84,0x84,0x00,0x86,0x85,0x85,0x00,0x87,0x86,0x86,0x00,0x88,0x87,0x87,0x00,\n\t0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,\n\t0x91,0x92,0x91,0x00,0x92,0x93,0x92,0x00,0x93,0x94,0x93,0x00,0x94,0x95,0x94,0x00,0x96,0x96,0x95,0x00,0x97,0x97,0x96,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,\n\t0x9a,0x9b,0x9a,0x00,0x9b,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,\n\t0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa6,0xa5,0x00,0xa6,0xa7,0xa6,0x00,0xa7,0xa8,0xa7,0x00,0xa8,0xa9,0xa8,0x00,0xa9,0xaa,0xa9,0x00,0xaa,0xab,0xaa,0x00,\n\t0xac,0xad,0xab,0x00,0xad,0xae,0xac,0x00,0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb4,0xb2,0x00,\n\t0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbb,0xbc,0xbb,0x00,\n\t0xbc,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,\n\t0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,\n\t0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,\n\t0xd8,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,\n\t0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,\n\t0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,\n\t0xf1,0xf2,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf4,0x00,0xf8,0xf8,0xf5,0x00,0xf9,0xf9,0xf6,0x00,\n\t0xfa,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfd,0xfa,0x00,0xfd,0xfe,0xfb,0x00,0xff,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x20,0x21,0x00,\n\t0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,\n\t0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,\n\t0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x42,0x00,0x42,0x43,0x43,0x00,\n\t0x43,0x44,0x44,0x00,0x44,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x46,0x47,0x00,0x48,0x47,0x48,0x00,0x49,0x48,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,\n\t0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x53,0x53,0x00,0x53,0x54,0x54,0x00,\n\t0x54,0x55,0x55,0x00,0x55,0x56,0x56,0x00,0x56,0x57,0x57,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x5a,0x00,0x5b,0x5a,0x5b,0x00,0x5c,0x5b,0x5c,0x00,\n\t0x5d,0x5c,0x5d,0x00,0x5e,0x5d,0x5e,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,\n\t0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,\n\t0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x71,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x72,0x73,0x00,0x74,0x73,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,\n\t0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,\n\t0x88,0x88,0x88,0x00,0x89,0x89,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,\n\t0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x97,0x96,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,\n\t0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,\n\t0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa6,0xa5,0x00,0xa6,0xa7,0xa6,0x00,0xa7,0xa8,0xa7,0x00,0xa8,0xa9,0xa8,0x00,0xa9,0xaa,0xa9,0x00,0xaa,0xab,0xaa,0x00,\n\t0xab,0xac,0xab,0x00,0xac,0xad,0xac,0x00,0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb3,0xb2,0x00,\n\t0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbb,0xbc,0xbb,0x00,\n\t0xbc,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,\n\t0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,\n\t0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,\n\t0xd7,0xd8,0xd5,0x00,0xd8,0xd9,0xd6,0x00,0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,\n\t0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,\n\t0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,\n\t0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf4,0xf1,0x00,0xf6,0xf5,0xf2,0x00,0xf7,0xf6,0xf3,0x00,0xf8,0xf8,0xf5,0x00,0xf8,0xf9,0xf6,0x00,\n\t0xf9,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfd,0xfa,0x00,0xfd,0xfe,0xfb,0x00,0xfe,0xff,0xfc,0x00,0xfe,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x20,0x21,0x00,\n\t0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,\n\t0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,\n\t0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3d,0x3d,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x42,0x42,0x00,0x42,0x43,0x43,0x00,\n\t0x43,0x44,0x44,0x00,0x44,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x46,0x47,0x00,0x48,0x47,0x48,0x00,0x49,0x48,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,\n\t0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x53,0x53,0x00,0x53,0x54,0x54,0x00,\n\t0x54,0x55,0x55,0x00,0x55,0x56,0x56,0x00,0x56,0x57,0x57,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5b,0x5a,0x5b,0x00,0x5c,0x5b,0x5c,0x00,\n\t0x5d,0x5c,0x5d,0x00,0x5e,0x5d,0x5e,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,\n\t0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,\n\t0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x71,0x70,0x71,0x00,0x72,0x71,0x72,0x00,0x73,0x72,0x73,0x00,0x74,0x73,0x74,0x00,0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,\n\t0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,\n\t0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,\n\t0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,\n\t0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,\n\t0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa6,0xa5,0x00,0xa6,0xa7,0xa6,0x00,0xa7,0xa8,0xa7,0x00,0xa8,0xa9,0xa8,0x00,0xa9,0xaa,0xa9,0x00,0xaa,0xab,0xaa,0x00,\n\t0xab,0xac,0xab,0x00,0xac,0xad,0xac,0x00,0xae,0xaf,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb3,0xb1,0x00,0xb3,0xb3,0xb2,0x00,\n\t0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbb,0xbc,0xbb,0x00,\n\t0xbc,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,\n\t0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcd,0xcb,0x00,0xcd,0xce,0xcc,0x00,\n\t0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd6,0xd3,0x00,0xd6,0xd7,0xd4,0x00,\n\t0xd7,0xd8,0xd5,0x00,0xd8,0xd9,0xd6,0x00,0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xde,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,\n\t0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,\n\t0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,\n\t0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf4,0xf3,0xf0,0x00,0xf5,0xf4,0xf1,0x00,0xf6,0xf5,0xf2,0x00,0xf7,0xf6,0xf3,0x00,0xf8,0xf8,0xf5,0x00,0xf8,0xf9,0xf6,0x00,\n\t0xf9,0xfa,0xf7,0x00,0xfa,0xfb,0xf8,0x00,0xfc,0xfd,0xfa,0x00,0xfd,0xfe,0xfb,0x00,0xfe,0xff,0xfc,0x00,0xfe,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x20,0x21,0x00,\n\t0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,\n\t0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,\n\t0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3e,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x42,0x00,0x42,0x43,0x43,0x00,\n\t0x43,0x44,0x44,0x00,0x44,0x45,0x45,0x00,0x45,0x45,0x46,0x00,0x47,0x46,0x47,0x00,0x48,0x47,0x48,0x00,0x49,0x48,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,\n\t0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x54,0x54,0x00,\n\t0x54,0x55,0x55,0x00,0x55,0x56,0x56,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5b,0x00,0x5c,0x5b,0x5c,0x00,\n\t0x5d,0x5c,0x5d,0x00,0x5e,0x5d,0x5e,0x00,0x5f,0x5e,0x5f,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,\n\t0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,\n\t0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x72,0x71,0x72,0x00,0x73,0x72,0x73,0x00,0x74,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x76,0x76,0x00,\n\t0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7e,0x7d,0x00,0x7f,0x7f,0x7f,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,\n\t0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8b,0x8a,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,\n\t0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x98,0x97,0x00,0x99,0x99,0x99,0x00,\n\t0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,\n\t0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa7,0xa6,0x00,0xa7,0xa8,0xa7,0x00,0xa8,0xa9,0xa8,0x00,0xa9,0xaa,0xa9,0x00,0xaa,0xab,0xaa,0x00,\n\t0xab,0xac,0xab,0x00,0xac,0xad,0xac,0x00,0xad,0xae,0xad,0x00,0xaf,0xb0,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb2,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,\n\t0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xba,0xbb,0xba,0x00,0xbb,0xbc,0xbb,0x00,\n\t0xbc,0xbd,0xbc,0x00,0xbd,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,\n\t0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xce,0xcc,0x00,\n\t0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd7,0xd4,0x00,\n\t0xd7,0xd8,0xd5,0x00,0xd8,0xd9,0xd6,0x00,0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xdf,0xdf,0xdc,0x00,\n\t0xe0,0xe0,0xdd,0x00,0xe1,0xe1,0xde,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe8,0xe6,0x00,\n\t0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,\n\t0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf5,0xf4,0xf1,0x00,0xf6,0xf5,0xf2,0x00,0xf7,0xf6,0xf3,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf9,0xf6,0x00,\n\t0xf9,0xfa,0xf7,0x00,0xfa,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfe,0xfb,0x00,0xfe,0xff,0xfc,0x00,0xfe,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x20,0x21,0x00,\n\t0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,\n\t0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,\n\t0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,\n\t0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3f,0x3f,0x00,0x40,0x40,0x40,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,\n\t0x43,0x44,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x48,0x47,0x48,0x00,0x49,0x48,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,\n\t0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,\n\t0x55,0x55,0x55,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,\n\t0x5d,0x5c,0x5d,0x00,0x5e,0x5d,0x5e,0x00,0x5f,0x5e,0x5f,0x00,0x60,0x5f,0x60,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,\n\t0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,\n\t0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x73,0x72,0x73,0x00,0x74,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,\n\t0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,\n\t0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,\n\t0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8b,0x8a,0x00,0x8b,0x8c,0x8b,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,\n\t0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x98,0x97,0x00,0x98,0x99,0x98,0x00,\n\t0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,\n\t0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa8,0xa7,0x00,0xa8,0xa9,0xa8,0x00,0xa9,0xaa,0xa9,0x00,0xaa,0xab,0xaa,0x00,\n\t0xab,0xac,0xab,0x00,0xac,0xad,0xac,0x00,0xad,0xae,0xad,0x00,0xae,0xaf,0xae,0x00,0xb0,0xb1,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,\n\t0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb9,0xb9,0xb8,0x00,0xb9,0xba,0xb9,0x00,0xba,0xbb,0xba,0x00,0xbb,0xbc,0xbb,0x00,\n\t0xbc,0xbd,0xbc,0x00,0xbd,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,\n\t0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,\n\t0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd2,0x00,0xd5,0xd5,0xd3,0x00,0xd6,0xd6,0xd4,0x00,\n\t0xd7,0xd8,0xd5,0x00,0xd8,0xd9,0xd6,0x00,0xd9,0xda,0xd7,0x00,0xda,0xdb,0xd8,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdc,0x00,\n\t0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,\n\t0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,0xec,0xed,0xeb,0x00,0xed,0xee,0xeb,0x00,0xee,0xef,0xec,0x00,0xef,0xf0,0xed,0x00,\n\t0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf6,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,\n\t0xf9,0xfa,0xf7,0x00,0xfa,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xff,0xfc,0x00,0xfe,0xff,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x20,0x21,0x00,\n\t0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,\n\t0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,\n\t0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,\n\t0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x40,0x40,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,\n\t0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,\n\t0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x54,0x53,0x53,0x00,\n\t0x55,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x57,0x58,0x58,0x00,0x59,0x59,0x59,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,\n\t0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5f,0x5e,0x5f,0x00,0x60,0x5f,0x60,0x00,0x61,0x60,0x61,0x00,0x62,0x61,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,\n\t0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,\n\t0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,\n\t0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,\n\t0x7f,0x80,0x7f,0x00,0x80,0x81,0x80,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,\n\t0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8b,0x8a,0x00,0x8b,0x8c,0x8b,0x00,0x8c,0x8d,0x8c,0x00,0x8d,0x8e,0x8d,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,\n\t0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x98,0x97,0x00,0x98,0x99,0x98,0x00,\n\t0x99,0x9a,0x99,0x00,0x9b,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,\n\t0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,\n\t0xab,0xab,0xaa,0x00,0xac,0xad,0xab,0x00,0xad,0xae,0xad,0x00,0xae,0xaf,0xae,0x00,0xaf,0xb0,0xaf,0x00,0xb0,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,\n\t0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xba,0x00,0xbb,0xbb,0xbb,0x00,\n\t0xbc,0xbc,0xbc,0x00,0xbd,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,\n\t0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,\n\t0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,\n\t0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xde,0xdb,0x00,0xde,0xdf,0xdd,0x00,\n\t0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,\n\t0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xef,0xec,0x00,0xef,0xf0,0xed,0x00,\n\t0xf0,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,\n\t0xf9,0xf9,0xf7,0x00,0xfa,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x20,0x21,0x00,\n\t0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x29,0x00,0x29,0x29,0x2a,0x00,\n\t0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x30,0x30,0x00,0x31,0x31,0x31,0x00,\n\t0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,\n\t0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,\n\t0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,\n\t0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x53,0x52,0x52,0x00,0x54,0x53,0x53,0x00,\n\t0x55,0x54,0x54,0x00,0x56,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x57,0x57,0x57,0x00,0x57,0x58,0x58,0x00,0x58,0x59,0x59,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,\n\t0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5f,0x5e,0x5f,0x00,0x60,0x5f,0x60,0x00,0x61,0x60,0x61,0x00,0x62,0x61,0x62,0x00,0x63,0x63,0x63,0x00,0x64,0x64,0x64,0x00,\n\t0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6c,0x6c,0x6c,0x00,0x6d,0x6d,0x6d,0x00,\n\t0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,\n\t0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7e,0x7d,0x00,0x7e,0x7f,0x7e,0x00,\n\t0x7f,0x80,0x7f,0x00,0x80,0x81,0x80,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,\n\t0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8b,0x8a,0x00,0x8b,0x8c,0x8b,0x00,0x8c,0x8d,0x8c,0x00,0x8d,0x8e,0x8d,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,\n\t0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x98,0x97,0x00,0x98,0x99,0x98,0x00,\n\t0x99,0x9a,0x99,0x00,0x9a,0x9b,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,\n\t0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,\n\t0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xae,0xad,0x00,0xae,0xaf,0xae,0x00,0xaf,0xb0,0xaf,0x00,0xb0,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,\n\t0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb7,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xbb,0xba,0x00,0xbb,0xbb,0xbb,0x00,\n\t0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc4,0xc2,0x00,0xc4,0xc5,0xc3,0x00,\n\t0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,\n\t0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,\n\t0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,\n\t0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,\n\t0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xef,0xed,0x00,0xef,0xf0,0xed,0x00,\n\t0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,\n\t0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x20,0x21,0x00,\n\t0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x25,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x2a,0x00,\n\t0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x31,0x31,0x00,\n\t0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,\n\t0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,\n\t0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4b,0x4b,0x4b,0x00,\n\t0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x54,0x53,0x53,0x00,\n\t0x55,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x56,0x57,0x57,0x00,0x57,0x58,0x58,0x00,0x58,0x59,0x59,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,\n\t0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x60,0x5f,0x60,0x00,0x61,0x60,0x61,0x00,0x62,0x61,0x62,0x00,0x63,0x62,0x63,0x00,0x64,0x64,0x64,0x00,\n\t0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6d,0x6d,0x6d,0x00,\n\t0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x76,0x75,0x76,0x00,\n\t0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7f,0x7e,0x00,\n\t0x7f,0x80,0x7f,0x00,0x80,0x81,0x80,0x00,0x81,0x82,0x81,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,\n\t0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8c,0x8b,0x00,0x8c,0x8d,0x8c,0x00,0x8d,0x8e,0x8d,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,\n\t0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x98,0x97,0x00,0x98,0x99,0x98,0x00,\n\t0x99,0x9a,0x99,0x00,0x9a,0x9b,0x9a,0x00,0x9b,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0xa0,0x00,0xa2,0xa2,0xa1,0x00,\n\t0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,\n\t0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xad,0x00,0xae,0xaf,0xae,0x00,0xaf,0xb0,0xaf,0x00,0xb0,0xb1,0xb0,0x00,0xb1,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,\n\t0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb8,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xba,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xbb,0x00,\n\t0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc5,0xc3,0x00,\n\t0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcc,0x00,\n\t0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,\n\t0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xdf,0xdd,0x00,\n\t0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe7,0xe7,0xe5,0x00,\n\t0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xf0,0xed,0x00,\n\t0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,\n\t0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x20,0x21,0x00,\n\t0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x26,0x26,0x00,0x27,0x27,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,\n\t0x2b,0x2a,0x2b,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,\n\t0x32,0x32,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,\n\t0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,\n\t0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,\n\t0x55,0x54,0x55,0x00,0x55,0x55,0x55,0x00,0x56,0x56,0x56,0x00,0x56,0x57,0x57,0x00,0x57,0x58,0x58,0x00,0x58,0x59,0x59,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,\n\t0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x61,0x60,0x61,0x00,0x62,0x61,0x62,0x00,0x63,0x62,0x63,0x00,0x64,0x63,0x64,0x00,\n\t0x65,0x65,0x65,0x00,0x66,0x66,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,\n\t0x6e,0x6e,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,\n\t0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x80,0x7f,0x00,0x80,0x81,0x80,0x00,0x81,0x82,0x81,0x00,0x82,0x83,0x82,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,\n\t0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8d,0x8d,0x00,0x8d,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,\n\t0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x98,0x97,0x00,0x98,0x99,0x98,0x00,\n\t0x99,0x9a,0x99,0x00,0x9a,0x9b,0x9a,0x00,0x9b,0x9c,0x9b,0x00,0x9c,0x9d,0x9c,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,\n\t0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,\n\t0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xb0,0xaf,0x00,0xb0,0xb1,0xb0,0x00,0xb1,0xb2,0xb1,0x00,0xb2,0xb3,0xb2,0x00,\n\t0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb9,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,\n\t0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,\n\t0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xca,0xca,0xc8,0x00,0xcb,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,\n\t0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,\n\t0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,\n\t0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xde,0x00,0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,\n\t0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,\n\t0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf3,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,\n\t0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x20,0x20,0x21,0x00,\n\t0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x28,0x28,0x00,0x2a,0x29,0x29,0x00,\n\t0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,\n\t0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,\n\t0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,\n\t0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,0x53,0x53,0x54,0x00,\n\t0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,\n\t0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x63,0x62,0x63,0x00,0x64,0x63,0x64,0x00,\n\t0x65,0x64,0x65,0x00,0x66,0x65,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,\n\t0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,\n\t0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x86,0x85,0x86,0x00,0x87,0x86,0x87,0x00,\n\t0x88,0x87,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x8f,0x00,\n\t0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x98,0x97,0x00,0x98,0x99,0x98,0x00,\n\t0x99,0x9a,0x99,0x00,0x9a,0x9b,0x9a,0x00,0x9b,0x9c,0x9b,0x00,0x9c,0x9d,0x9d,0x00,0x9d,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,\n\t0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb2,0xb1,0x00,0xb2,0xb3,0xb2,0x00,\n\t0xb3,0xb4,0xb3,0x00,0xb4,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xba,0xbb,0xba,0x00,\n\t0xbb,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,\n\t0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,\n\t0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,\n\t0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,\n\t0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,\n\t0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xea,0x00,0xec,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,\n\t0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf5,0x00,0xf7,0xf8,0xf6,0x00,\n\t0xf8,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x20,0x20,0x21,0x00,\n\t0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x29,0x28,0x28,0x00,0x2a,0x29,0x29,0x00,\n\t0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,\n\t0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,\n\t0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,\n\t0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,\n\t0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,\n\t0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x63,0x62,0x63,0x00,0x64,0x63,0x64,0x00,\n\t0x65,0x64,0x65,0x00,0x66,0x65,0x66,0x00,0x67,0x67,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,\n\t0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,\n\t0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x86,0x85,0x86,0x00,0x87,0x86,0x87,0x00,\n\t0x88,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x8f,0x00,\n\t0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x98,0x97,0x00,0x98,0x99,0x98,0x00,\n\t0x99,0x9a,0x99,0x00,0x9a,0x9b,0x9a,0x00,0x9b,0x9c,0x9c,0x00,0x9c,0x9d,0x9d,0x00,0x9d,0x9e,0x9e,0x00,0x9e,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,\n\t0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb2,0xb1,0x00,0xb2,0xb3,0xb2,0x00,\n\t0xb3,0xb4,0xb3,0x00,0xb4,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xba,0xbb,0xba,0x00,\n\t0xbb,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,\n\t0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcc,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,\n\t0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,\n\t0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,\n\t0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe6,0xe3,0x00,0xe6,0xe7,0xe4,0x00,\n\t0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,\n\t0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf5,0x00,0xf7,0xf8,0xf6,0x00,\n\t0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x1f,0x21,0x00,0x20,0x20,0x21,0x00,\n\t0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x28,0x28,0x00,0x2a,0x29,0x29,0x00,\n\t0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,\n\t0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x3a,0x00,\n\t0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x41,0x40,0x41,0x00,0x42,0x42,0x43,0x00,\n\t0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,\n\t0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x55,0x56,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5b,0x5a,0x5c,0x00,\n\t0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x64,0x63,0x64,0x00,\n\t0x65,0x64,0x65,0x00,0x66,0x65,0x66,0x00,0x67,0x66,0x67,0x00,0x68,0x68,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,\n\t0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,\n\t0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x86,0x00,0x87,0x86,0x87,0x00,\n\t0x88,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8e,0x00,0x90,0x90,0x8f,0x00,\n\t0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x99,0x98,0x00,\n\t0x99,0x9a,0x99,0x00,0x9a,0x9b,0x9a,0x00,0x9b,0x9c,0x9b,0x00,0x9c,0x9d,0x9d,0x00,0x9d,0x9e,0x9e,0x00,0x9e,0x9f,0x9f,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,\n\t0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb3,0xb2,0x00,\n\t0xb3,0xb4,0xb3,0x00,0xb4,0xb5,0xb4,0x00,0xb5,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xba,0xbb,0xba,0x00,\n\t0xbb,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc3,0x00,\n\t0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcd,0xcd,0xcb,0x00,\n\t0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,\n\t0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,\n\t0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe7,0xe4,0x00,\n\t0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,\n\t0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf4,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf6,0x00,\n\t0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,\n\t0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x20,0x20,0x21,0x00,\n\t0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,\n\t0x2b,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,\n\t0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x34,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x37,0x00,0x38,0x38,0x38,0x00,0x39,0x39,0x39,0x00,\n\t0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x41,0x40,0x41,0x00,0x42,0x41,0x42,0x00,\n\t0x43,0x43,0x44,0x00,0x44,0x44,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,\n\t0x54,0x54,0x55,0x00,0x54,0x55,0x56,0x00,0x55,0x56,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,\n\t0x65,0x64,0x65,0x00,0x66,0x65,0x66,0x00,0x67,0x66,0x67,0x00,0x68,0x67,0x68,0x00,0x69,0x69,0x69,0x00,0x6a,0x6a,0x6a,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,\n\t0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,\n\t0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,\n\t0x88,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,\n\t0x91,0x91,0x90,0x00,0x92,0x92,0x91,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,\n\t0x99,0x9a,0x99,0x00,0x9a,0x9b,0x9a,0x00,0x9b,0x9c,0x9b,0x00,0x9c,0x9d,0x9c,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa7,0xa7,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,0xaa,0xaa,0xa9,0x00,\n\t0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,\n\t0xb3,0xb4,0xb3,0x00,0xb4,0xb5,0xb4,0x00,0xb5,0xb6,0xb5,0x00,0xb6,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,\n\t0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,0xc4,0xc4,0xc2,0x00,\n\t0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,\n\t0xce,0xce,0xcc,0x00,0xcf,0xcf,0xcd,0x00,0xd0,0xd0,0xce,0x00,0xd1,0xd1,0xcf,0x00,0xd2,0xd2,0xd0,0x00,0xd3,0xd3,0xd1,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,\n\t0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdc,0x00,\n\t0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe1,0x00,0xe4,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,\n\t0xe7,0xe8,0xe5,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,\n\t0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,\n\t0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,\n\t0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x20,0x20,0x21,0x00,\n\t0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,\n\t0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,\n\t0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x38,0x39,0x00,\n\t0x3a,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x41,0x40,0x41,0x00,0x42,0x41,0x42,0x00,\n\t0x43,0x42,0x43,0x00,0x44,0x43,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x52,0x53,0x00,0x52,0x53,0x54,0x00,\n\t0x53,0x54,0x55,0x00,0x54,0x55,0x56,0x00,0x55,0x56,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,\n\t0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,\n\t0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,\n\t0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x81,0x82,0x82,0x00,0x82,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,\n\t0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x8a,0x8a,0x00,0x8a,0x8b,0x8b,0x00,0x8b,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,\n\t0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,\n\t0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa9,0xa8,0xa8,0x00,0xaa,0xa9,0xa9,0x00,\n\t0xab,0xaa,0xaa,0x00,0xac,0xab,0xab,0x00,0xad,0xad,0xac,0x00,0xad,0xae,0xad,0x00,0xae,0xaf,0xae,0x00,0xaf,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,\n\t0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb6,0xb5,0x00,0xb6,0xb7,0xb6,0x00,0xb7,0xb8,0xb7,0x00,0xb8,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,\n\t0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,\n\t0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc6,0x00,0xc7,0xc8,0xc7,0x00,0xc8,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,\n\t0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,\n\t0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdb,0x00,\n\t0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,\n\t0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xee,0xee,0xec,0x00,0xef,0xee,0xed,0x00,\n\t0xf0,0xef,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,\n\t0xf8,0xf9,0xf6,0x00,0xf9,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,\n\t0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x20,0x20,0x21,0x00,\n\t0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x28,0x28,0x00,0x29,0x29,0x29,0x00,\n\t0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2c,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,\n\t0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x38,0x37,0x38,0x00,0x39,0x38,0x39,0x00,\n\t0x3a,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x41,0x40,0x41,0x00,0x42,0x41,0x42,0x00,\n\t0x43,0x42,0x43,0x00,0x44,0x43,0x44,0x00,0x45,0x45,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x52,0x53,0x00,0x52,0x53,0x54,0x00,\n\t0x53,0x54,0x55,0x00,0x54,0x55,0x56,0x00,0x55,0x56,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,\n\t0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,\n\t0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x74,0x74,0x74,0x00,0x75,0x75,0x75,0x00,\n\t0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x81,0x82,0x82,0x00,0x82,0x83,0x83,0x00,0x83,0x84,0x84,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,\n\t0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x8a,0x8a,0x00,0x8a,0x8b,0x8b,0x00,0x8b,0x8c,0x8c,0x00,0x8c,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,\n\t0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,\n\t0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9c,0x9c,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa9,0xa8,0xa8,0x00,0xaa,0xa9,0xa9,0x00,\n\t0xab,0xaa,0xaa,0x00,0xac,0xab,0xab,0x00,0xad,0xad,0xac,0x00,0xad,0xae,0xad,0x00,0xae,0xaf,0xae,0x00,0xaf,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,\n\t0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb6,0xb5,0x00,0xb6,0xb7,0xb6,0x00,0xb7,0xb8,0xb7,0x00,0xb8,0xb9,0xb8,0x00,0xba,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,\n\t0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbf,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,\n\t0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc6,0x00,0xc7,0xc8,0xc7,0x00,0xc8,0xc9,0xc8,0x00,0xc9,0xca,0xc9,0x00,0xcb,0xcc,0xca,0x00,0xcc,0xcd,0xcb,0x00,\n\t0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,\n\t0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,0xdd,0xde,0xdb,0x00,\n\t0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe5,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,\n\t0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xee,0xee,0xec,0x00,0xef,0xee,0xed,0x00,\n\t0xf0,0xef,0xee,0x00,0xf1,0xf0,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,\n\t0xf8,0xf9,0xf6,0x00,0xf9,0xfa,0xf7,0x00,0xfb,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfe,0xfe,0xfb,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x19,0x18,0x1a,0x00,\n\t0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,\n\t0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x28,0x00,0x29,0x29,0x29,0x00,\n\t0x2a,0x2a,0x2a,0x00,0x2b,0x2b,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,\n\t0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x39,0x38,0x39,0x00,\n\t0x3a,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,0x3c,0x3b,0x3c,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x42,0x41,0x42,0x00,\n\t0x43,0x42,0x43,0x00,0x44,0x43,0x44,0x00,0x45,0x44,0x45,0x00,0x46,0x46,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4b,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x53,0x54,0x00,\n\t0x53,0x54,0x55,0x00,0x54,0x55,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x57,0x00,0x58,0x58,0x58,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x63,0x64,0x00,\n\t0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6b,0x6a,0x6b,0x00,0x6c,0x6c,0x6d,0x00,\n\t0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x75,0x75,0x75,0x00,\n\t0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7e,0x7e,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x81,0x82,0x82,0x00,0x82,0x83,0x83,0x00,0x83,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x87,0x00,\n\t0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8b,0x8b,0x00,0x8b,0x8c,0x8c,0x00,0x8c,0x8d,0x8d,0x00,0x8d,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,\n\t0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x97,0x97,0x00,0x98,0x98,0x98,0x00,\n\t0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9d,0x9d,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xaa,0xa9,0xa9,0x00,\n\t0xab,0xaa,0xaa,0x00,0xac,0xab,0xab,0x00,0xac,0xad,0xac,0x00,0xad,0xae,0xad,0x00,0xae,0xaf,0xae,0x00,0xaf,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,\n\t0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb7,0xb6,0x00,0xb7,0xb8,0xb7,0x00,0xb8,0xb9,0xb8,0x00,0xb9,0xba,0xb9,0x00,0xbb,0xbb,0xba,0x00,\n\t0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xc0,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,\n\t0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc7,0x00,0xc8,0xc9,0xc8,0x00,0xc9,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcd,0xcb,0x00,\n\t0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd5,0xd5,0xd4,0x00,\n\t0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,\n\t0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,0xe6,0xe6,0xe4,0x00,\n\t0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xeb,0xec,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xec,0x00,0xef,0xee,0xed,0x00,\n\t0xf0,0xef,0xee,0x00,0xf1,0xf0,0xef,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf8,0xf5,0x00,\n\t0xf8,0xf9,0xf6,0x00,0xf9,0xfa,0xf7,0x00,0xfa,0xfb,0xf8,0x00,0xfc,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfe,0xfb,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,\n\t0x14,0x12,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x19,0x18,0x19,0x00,\n\t0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1e,0x1e,0x20,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,\n\t0x21,0x21,0x22,0x00,0x22,0x22,0x22,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,\n\t0x2b,0x2a,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,\n\t0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,\n\t0x3a,0x39,0x3a,0x00,0x3b,0x3a,0x3b,0x00,0x3c,0x3b,0x3c,0x00,0x3d,0x3c,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,\n\t0x43,0x42,0x43,0x00,0x44,0x43,0x44,0x00,0x45,0x44,0x45,0x00,0x46,0x45,0x46,0x00,0x47,0x47,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,\n\t0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,\n\t0x54,0x54,0x55,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,\n\t0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6b,0x6a,0x6b,0x00,0x6c,0x6b,0x6c,0x00,\n\t0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,\n\t0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,\n\t0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,\n\t0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8c,0x8c,0x00,0x8c,0x8d,0x8d,0x00,0x8d,0x8e,0x8e,0x00,0x8e,0x8f,0x8f,0x00,\n\t0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x97,0x97,0x00,0x97,0x98,0x98,0x00,\n\t0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9d,0x9c,0x9c,0x00,0x9e,0x9e,0x9d,0x00,0x9f,0x9f,0x9e,0x00,0xa0,0xa0,0x9f,0x00,0xa1,0xa1,0xa0,0x00,\n\t0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,\n\t0xab,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xad,0xac,0x00,0xad,0xae,0xad,0x00,0xae,0xaf,0xae,0x00,0xaf,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,\n\t0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb8,0xb7,0x00,0xb8,0xb9,0xb8,0x00,0xb9,0xba,0xb9,0x00,0xba,0xbb,0xba,0x00,\n\t0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc1,0xbf,0x00,0xc1,0xc2,0xc0,0x00,0xc2,0xc3,0xc1,0x00,0xc3,0xc4,0xc2,0x00,\n\t0xc4,0xc5,0xc3,0x00,0xc5,0xc6,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc8,0x00,0xc9,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,\n\t0xcd,0xce,0xcc,0x00,0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,\n\t0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xd9,0x00,0xdc,0xdd,0xda,0x00,0xdd,0xde,0xdb,0x00,\n\t0xde,0xdf,0xdc,0x00,0xdf,0xe0,0xdd,0x00,0xe0,0xe1,0xde,0x00,0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,\n\t0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xec,0xea,0x00,0xec,0xed,0xeb,0x00,0xed,0xee,0xec,0x00,0xee,0xef,0xed,0x00,\n\t0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,\n\t0xf8,0xf9,0xf6,0x00,0xf9,0xfa,0xf7,0x00,0xfa,0xfb,0xf8,0x00,0xfb,0xfc,0xf9,0x00,0xfd,0xfd,0xfa,0x00,0xfd,0xfe,0xfb,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x12,0x10,0x12,0x00,\n\t0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,\n\t0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x20,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,\n\t0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x28,0x00,0x2a,0x28,0x29,0x00,\n\t0x2b,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,\n\t0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,\n\t0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3e,0x3f,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,\n\t0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x45,0x44,0x45,0x00,0x46,0x45,0x46,0x00,0x47,0x46,0x47,0x00,0x48,0x47,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,\n\t0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x53,0x52,0x53,0x00,\n\t0x54,0x53,0x54,0x00,0x55,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,\n\t0x64,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6b,0x6a,0x6b,0x00,0x6c,0x6b,0x6c,0x00,\n\t0x6d,0x6c,0x6d,0x00,0x6e,0x6d,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,\n\t0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,\n\t0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x81,0x81,0x00,0x83,0x82,0x82,0x00,0x84,0x83,0x84,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,\n\t0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8e,0x8e,0x00,0x8e,0x8f,0x8f,0x00,\n\t0x8f,0x90,0x90,0x00,0x90,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x97,0x97,0x00,0x97,0x98,0x98,0x00,\n\t0x98,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9d,0x9c,0x9c,0x00,0x9e,0x9d,0x9d,0x00,0x9f,0x9e,0x9e,0x00,0xa0,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,\n\t0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa4,0xa3,0xa4,0x00,0xa5,0xa4,0xa5,0x00,0xa6,0xa5,0xa6,0x00,0xa7,0xa6,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,\n\t0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xad,0xac,0x00,0xad,0xae,0xad,0x00,0xae,0xaf,0xae,0x00,0xaf,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,\n\t0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,\n\t0xbb,0xbb,0xbb,0x00,0xbc,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,\n\t0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,\n\t0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,\n\t0xd5,0xd6,0xd4,0x00,0xd6,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,\n\t0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe1,0xde,0x00,0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,\n\t0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xee,0xec,0x00,0xee,0xef,0xec,0x00,\n\t0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,\n\t0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfb,0xf8,0x00,0xfb,0xfc,0xf9,0x00,0xfc,0xfd,0xfa,0x00,0xfd,0xfe,0xfb,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,0x12,0x10,0x12,0x00,\n\t0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,\n\t0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x20,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,\n\t0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x29,0x27,0x28,0x00,0x2a,0x28,0x29,0x00,\n\t0x2b,0x29,0x2a,0x00,0x2c,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,\n\t0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,\n\t0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,\n\t0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x45,0x44,0x45,0x00,0x46,0x45,0x46,0x00,0x47,0x46,0x47,0x00,0x48,0x47,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,\n\t0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x52,0x51,0x52,0x00,0x53,0x52,0x53,0x00,\n\t0x54,0x53,0x54,0x00,0x55,0x54,0x55,0x00,0x56,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,\n\t0x64,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6b,0x6a,0x6b,0x00,0x6c,0x6b,0x6c,0x00,\n\t0x6d,0x6c,0x6d,0x00,0x6e,0x6d,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,\n\t0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,\n\t0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x81,0x81,0x00,0x83,0x82,0x82,0x00,0x84,0x83,0x83,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,\n\t0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8e,0x8e,0x00,0x8e,0x8f,0x8f,0x00,\n\t0x8f,0x90,0x90,0x00,0x90,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x97,0x97,0x00,0x97,0x98,0x98,0x00,\n\t0x98,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9d,0x9c,0x9c,0x00,0x9e,0x9d,0x9d,0x00,0x9f,0x9e,0x9e,0x00,0xa0,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,\n\t0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa4,0xa3,0xa4,0x00,0xa5,0xa4,0xa5,0x00,0xa6,0xa5,0xa6,0x00,0xa7,0xa6,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,\n\t0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xad,0xac,0x00,0xad,0xae,0xad,0x00,0xae,0xaf,0xae,0x00,0xaf,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,\n\t0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,\n\t0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,\n\t0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc7,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,\n\t0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd4,0xd2,0x00,0xd4,0xd5,0xd3,0x00,\n\t0xd5,0xd6,0xd4,0x00,0xd6,0xd7,0xd5,0x00,0xd8,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,\n\t0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe1,0xde,0x00,0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,\n\t0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xee,0xec,0x00,0xee,0xef,0xec,0x00,\n\t0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf2,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,\n\t0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfb,0xf8,0x00,0xfb,0xfc,0xf9,0x00,0xfc,0xfd,0xfa,0x00,0xfd,0xfe,0xfb,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xff,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0d,0x0d,0x0d,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,\n\t0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,\n\t0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x20,0x00,\n\t0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x2a,0x28,0x29,0x00,\n\t0x2b,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,\n\t0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,\n\t0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,\n\t0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x46,0x45,0x46,0x00,0x47,0x46,0x47,0x00,0x48,0x47,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,\n\t0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x53,0x52,0x53,0x00,\n\t0x54,0x53,0x54,0x00,0x55,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x63,0x62,0x64,0x00,\n\t0x64,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6c,0x6b,0x6c,0x00,\n\t0x6d,0x6c,0x6d,0x00,0x6e,0x6d,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,\n\t0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,\n\t0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x82,0x81,0x81,0x00,0x83,0x82,0x82,0x00,0x84,0x83,0x83,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,\n\t0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8f,0x8f,0x00,\n\t0x8f,0x90,0x90,0x00,0x90,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x98,0x98,0x00,\n\t0x98,0x99,0x99,0x00,0x99,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9e,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,\n\t0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa5,0xa4,0xa4,0x00,0xa6,0xa5,0xa6,0x00,0xa7,0xa6,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,\n\t0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xae,0xad,0x00,0xae,0xaf,0xae,0x00,0xaf,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,\n\t0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,\n\t0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,\n\t0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc8,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcc,0xcc,0xcb,0x00,\n\t0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd5,0xd3,0x00,\n\t0xd5,0xd6,0xd4,0x00,0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd9,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,\n\t0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe1,0xde,0x00,0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,\n\t0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xeb,0x00,0xee,0xef,0xec,0x00,\n\t0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf3,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,\n\t0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfc,0xf9,0x00,0xfc,0xfd,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,\n\t0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,\n\t0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x20,0x20,0x00,\n\t0x21,0x21,0x21,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,\n\t0x2b,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,\n\t0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,\n\t0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,\n\t0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x47,0x46,0x47,0x00,0x48,0x47,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,\n\t0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,\n\t0x54,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,\n\t0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x64,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,\n\t0x6d,0x6c,0x6d,0x00,0x6e,0x6d,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,\n\t0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,\n\t0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x81,0x00,0x83,0x82,0x82,0x00,0x84,0x83,0x83,0x00,0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,\n\t0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x90,0x90,0x00,0x90,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,\n\t0x98,0x99,0x99,0x00,0x99,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,\n\t0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa6,0xa5,0xa5,0x00,0xa7,0xa6,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,\n\t0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xaf,0xae,0x00,0xaf,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,0xb2,0xb2,0xb1,0x00,\n\t0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,\n\t0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,\n\t0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc9,0xc7,0x00,0xc9,0xca,0xc8,0x00,0xca,0xcb,0xc9,0x00,0xcb,0xcc,0xca,0x00,\n\t0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,\n\t0xd5,0xd6,0xd4,0x00,0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xda,0xda,0xd8,0x00,0xdb,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,\n\t0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe1,0xde,0x00,0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,\n\t0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,\n\t0xef,0xf0,0xed,0x00,0xf0,0xf1,0xee,0x00,0xf1,0xf2,0xef,0x00,0xf2,0xf3,0xf0,0x00,0xf4,0xf4,0xf1,0x00,0xf5,0xf5,0xf2,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,\n\t0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfd,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,\n\t0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,\n\t0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x27,0x25,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,\n\t0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2b,0x2c,0x00,0x2e,0x2c,0x2d,0x00,0x2f,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,\n\t0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,\n\t0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,\n\t0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,\n\t0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x56,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,\n\t0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,\n\t0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,\n\t0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,\n\t0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x85,0x85,0x00,0x85,0x86,0x86,0x00,\n\t0x86,0x87,0x87,0x00,0x87,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x92,0x91,0x92,0x00,0x93,0x92,0x93,0x00,0x94,0x93,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,\n\t0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9d,0x9c,0x9d,0x00,0x9e,0x9d,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0x9f,0x00,\n\t0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,\n\t0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb1,0xb0,0xb0,0x00,0xb2,0xb1,0xb1,0x00,\n\t0xb3,0xb2,0xb2,0x00,0xb4,0xb3,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb9,0x00,0xb9,0xba,0xba,0x00,\n\t0xba,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,\n\t0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,\n\t0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,\n\t0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,\n\t0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe1,0xde,0x00,0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe3,0x00,0xe4,0xe6,0xe4,0x00,\n\t0xe5,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,\n\t0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,\n\t0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,\n\t0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,\n\t0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,\n\t0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2b,0x2c,0x00,0x2e,0x2c,0x2d,0x00,0x2f,0x2d,0x2e,0x00,0x30,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,\n\t0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,\n\t0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x49,0x49,0x49,0x00,0x4a,0x4a,0x4a,0x00,\n\t0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,\n\t0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,\n\t0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,\n\t0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6f,0x6f,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,\n\t0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,\n\t0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x85,0x85,0x00,0x85,0x86,0x86,0x00,\n\t0x86,0x87,0x87,0x00,0x87,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x92,0x91,0x92,0x00,0x93,0x92,0x93,0x00,0x94,0x93,0x94,0x00,0x95,0x94,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,\n\t0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0x9f,0x00,\n\t0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa8,0xa8,0xa7,0x00,0xa9,0xa9,0xa8,0x00,\n\t0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb1,0xb0,0xb0,0x00,0xb2,0xb1,0xb1,0x00,\n\t0xb3,0xb2,0xb2,0x00,0xb4,0xb3,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb9,0x00,0xb9,0xba,0xba,0x00,\n\t0xba,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,\n\t0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,\n\t0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,\n\t0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,\n\t0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe1,0xde,0x00,0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe4,0xe5,0xe3,0x00,0xe4,0xe6,0xe4,0x00,\n\t0xe5,0xe7,0xe5,0x00,0xe6,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,\n\t0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,\n\t0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,\n\t0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,\n\t0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,\n\t0x2a,0x29,0x29,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2b,0x2c,0x00,0x2e,0x2c,0x2d,0x00,0x2f,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,\n\t0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x40,0x3f,0x41,0x00,0x41,0x41,0x42,0x00,\n\t0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x4a,0x4a,0x4a,0x00,\n\t0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,\n\t0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x5a,0x59,0x5b,0x00,\n\t0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x66,0x65,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,\n\t0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x70,0x70,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x75,0x00,\n\t0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7e,0x00,\n\t0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x86,0x86,0x00,\n\t0x86,0x87,0x87,0x00,0x87,0x88,0x88,0x00,0x88,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x92,0x00,0x93,0x92,0x93,0x00,0x94,0x93,0x94,0x00,0x95,0x94,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,\n\t0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0x9f,0x00,\n\t0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa4,0x00,0xa6,0xa6,0xa5,0x00,0xa7,0xa7,0xa7,0x00,0xa9,0xa9,0xa8,0x00,\n\t0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb2,0xb1,0xb1,0x00,\n\t0xb3,0xb2,0xb2,0x00,0xb4,0xb3,0xb3,0x00,0xb5,0xb4,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb8,0xb9,0xb8,0x00,0xb9,0xba,0xba,0x00,\n\t0xba,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,\n\t0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,\n\t0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd4,0xd4,0xd3,0x00,\n\t0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,\n\t0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe2,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe3,0xe4,0xe1,0x00,0xe3,0xe5,0xe2,0x00,0xe4,0xe6,0xe4,0x00,\n\t0xe5,0xe7,0xe5,0x00,0xe6,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,\n\t0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf7,0xf7,0xf5,0x00,\n\t0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfe,0xfc,0x00,0xfe,0xfe,0xfe,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,\n\t0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,\n\t0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x26,0x24,0x25,0x00,0x27,0x25,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x28,0x00,\n\t0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2b,0x2c,0x00,0x2e,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,\n\t0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x40,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,\n\t0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4c,0x00,0x4d,0x4d,0x4d,0x00,0x4e,0x4e,0x4e,0x00,0x4f,0x4f,0x4f,0x00,0x50,0x50,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,\n\t0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x66,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,\n\t0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x71,0x71,0x71,0x00,0x72,0x72,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,\n\t0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,\n\t0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,\n\t0x86,0x87,0x87,0x00,0x87,0x88,0x88,0x00,0x88,0x89,0x89,0x00,0x89,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x94,0x93,0x94,0x00,0x95,0x94,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,\n\t0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0x9f,0x00,\n\t0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa3,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,\n\t0xaa,0xaa,0xa9,0x00,0xab,0xab,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,\n\t0xb3,0xb2,0xb2,0x00,0xb4,0xb3,0xb3,0x00,0xb5,0xb4,0xb4,0x00,0xb6,0xb5,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb7,0xb8,0xb7,0x00,0xb8,0xb9,0xb8,0x00,0xb9,0xba,0xb9,0x00,\n\t0xba,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,\n\t0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,\n\t0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,\n\t0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,\n\t0xde,0xde,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe3,0xe0,0x00,0xe2,0xe4,0xe1,0x00,0xe3,0xe5,0xe2,0x00,0xe4,0xe6,0xe3,0x00,\n\t0xe5,0xe7,0xe5,0x00,0xe6,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xec,0x00,\n\t0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,\n\t0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfc,0xfd,0xfb,0x00,0xfd,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,\n\t0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,\n\t0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x25,0x23,0x24,0x00,0x26,0x24,0x25,0x00,0x27,0x25,0x26,0x00,0x28,0x27,0x27,0x00,0x29,0x28,0x29,0x00,\n\t0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x38,0x00,0x38,0x37,0x39,0x00,\n\t0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x40,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,\n\t0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4d,0x4c,0x4d,0x00,0x4e,0x4d,0x4e,0x00,0x4f,0x4e,0x4f,0x00,0x50,0x4f,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,\n\t0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x66,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x67,0x69,0x00,0x69,0x68,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,\n\t0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,\n\t0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7c,0x7c,0x00,0x7c,0x7d,0x7d,0x00,\n\t0x7d,0x7e,0x7e,0x00,0x7e,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,\n\t0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,\n\t0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0x9f,0x00,\n\t0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa2,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,\n\t0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,\n\t0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,\n\t0xba,0xba,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,\n\t0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,\n\t0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,\n\t0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,\n\t0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,\n\t0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xeb,0x00,\n\t0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,\n\t0xf7,0xf8,0xf5,0x00,0xf8,0xf9,0xf6,0x00,0xf9,0xfa,0xf7,0x00,0xfa,0xfb,0xf8,0x00,0xfb,0xfc,0xf9,0x00,0xfc,0xfd,0xfb,0x00,0xfd,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,\n\t0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,\n\t0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x24,0x22,0x23,0x00,0x25,0x23,0x24,0x00,0x26,0x24,0x25,0x00,0x27,0x25,0x26,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,\n\t0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x33,0x33,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x37,0x38,0x00,0x38,0x37,0x39,0x00,\n\t0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x40,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,\n\t0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4d,0x4c,0x4d,0x00,0x4e,0x4d,0x4e,0x00,0x4f,0x4e,0x4f,0x00,0x50,0x4f,0x50,0x00,0x51,0x51,0x51,0x00,0x52,0x52,0x52,0x00,\n\t0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x55,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x66,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x67,0x69,0x00,0x69,0x68,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,\n\t0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x73,0x73,0x73,0x00,0x74,0x74,0x74,0x00,\n\t0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7c,0x7c,0x00,0x7c,0x7d,0x7d,0x00,\n\t0x7d,0x7e,0x7e,0x00,0x7e,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,\n\t0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8d,0x8d,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,\n\t0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0x9f,0x00,\n\t0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,\n\t0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xac,0xac,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,\n\t0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,\n\t0xba,0xba,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbf,0xbf,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,\n\t0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,\n\t0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xcf,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,\n\t0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdc,0xda,0x00,0xdc,0xdd,0xdb,0x00,\n\t0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,\n\t0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xed,0xed,0xeb,0x00,0xee,0xee,0xeb,0x00,\n\t0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf6,0xf3,0x00,0xf6,0xf7,0xf4,0x00,\n\t0xf7,0xf8,0xf5,0x00,0xf8,0xf9,0xf6,0x00,0xf9,0xfa,0xf7,0x00,0xfa,0xfb,0xf8,0x00,0xfb,0xfc,0xf9,0x00,0xfc,0xfd,0xfa,0x00,0xfd,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,\n\t0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,\n\t0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x25,0x23,0x24,0x00,0x26,0x24,0x25,0x00,0x27,0x25,0x26,0x00,0x28,0x26,0x27,0x00,0x29,0x28,0x29,0x00,\n\t0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x34,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x36,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x39,0x00,\n\t0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x41,0x40,0x42,0x00,\n\t0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4e,0x4d,0x4e,0x00,0x4f,0x4e,0x4f,0x00,0x50,0x4f,0x50,0x00,0x51,0x50,0x51,0x00,0x52,0x52,0x52,0x00,\n\t0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x55,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5d,0x5c,0x5d,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x67,0x66,0x68,0x00,0x68,0x67,0x69,0x00,0x69,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6b,0x6c,0x00,\n\t0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x74,0x74,0x74,0x00,\n\t0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7d,0x7d,0x00,\n\t0x7d,0x7e,0x7e,0x00,0x7e,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,\n\t0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8d,0x8c,0x8d,0x00,0x8e,0x8e,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x97,0x97,0x97,0x00,\n\t0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9e,0x00,0xa0,0xa0,0x9f,0x00,\n\t0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,\n\t0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xad,0xad,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,\n\t0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,\n\t0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xc0,0xc0,0xbe,0x00,0xc1,0xc1,0xbf,0x00,0xc2,0xc2,0xc0,0x00,0xc3,0xc3,0xc1,0x00,\n\t0xc4,0xc4,0xc2,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,\n\t0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xd0,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,\n\t0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,0xd6,0xd7,0xd5,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdd,0xdb,0x00,\n\t0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,\n\t0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xed,0xea,0x00,0xee,0xee,0xeb,0x00,\n\t0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf7,0xf4,0x00,\n\t0xf7,0xf8,0xf5,0x00,0xf8,0xf9,0xf6,0x00,0xf9,0xfa,0xf7,0x00,0xfa,0xfb,0xf8,0x00,0xfb,0xfc,0xf9,0x00,0xfc,0xfd,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfd,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,\n\t0x13,0x11,0x13,0x00,0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x18,0x19,0x00,\n\t0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x26,0x24,0x25,0x00,0x27,0x25,0x26,0x00,0x28,0x26,0x27,0x00,0x29,0x27,0x28,0x00,\n\t0x2a,0x29,0x2a,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x34,0x33,0x34,0x00,0x35,0x35,0x35,0x00,0x36,0x35,0x36,0x00,0x37,0x36,0x37,0x00,0x38,0x37,0x38,0x00,\n\t0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,0x3c,0x3b,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4f,0x4e,0x4f,0x00,0x50,0x4f,0x50,0x00,0x51,0x50,0x51,0x00,0x52,0x51,0x52,0x00,\n\t0x53,0x53,0x54,0x00,0x54,0x53,0x54,0x00,0x55,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5d,0x5c,0x5d,0x00,0x5e,0x5d,0x5e,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x68,0x67,0x69,0x00,0x69,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,\n\t0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,\n\t0x75,0x75,0x75,0x00,0x76,0x76,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,\n\t0x7d,0x7e,0x7e,0x00,0x7e,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,\n\t0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8d,0x8c,0x8d,0x00,0x8e,0x8d,0x8e,0x00,\n\t0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,\n\t0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,\n\t0xa1,0xa1,0xa0,0x00,0xa2,0xa2,0xa1,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,\n\t0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xae,0xae,0xad,0x00,0xaf,0xaf,0xae,0x00,0xb0,0xb0,0xaf,0x00,0xb1,0xb1,0xb0,0x00,\n\t0xb2,0xb2,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,\n\t0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,\n\t0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc3,0x00,0xc6,0xc6,0xc4,0x00,0xc7,0xc7,0xc5,0x00,0xc8,0xc8,0xc6,0x00,0xc9,0xc9,0xc7,0x00,0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,\n\t0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd1,0xcf,0x00,0xd1,0xd2,0xd0,0x00,0xd2,0xd3,0xd1,0x00,0xd3,0xd4,0xd2,0x00,\n\t0xd4,0xd5,0xd3,0x00,0xd5,0xd6,0xd4,0x00,0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,\n\t0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,\n\t0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,\n\t0xef,0xef,0xec,0x00,0xf0,0xf0,0xed,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,\n\t0xf7,0xf8,0xf5,0x00,0xf8,0xf9,0xf6,0x00,0xf9,0xfa,0xf7,0x00,0xfa,0xfb,0xf8,0x00,0xfb,0xfc,0xf9,0x00,0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x11,0x00,\n\t0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x17,0x19,0x00,\n\t0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3d,0x3f,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x51,0x50,0x51,0x00,0x52,0x51,0x53,0x00,\n\t0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5d,0x5c,0x5d,0x00,0x5e,0x5d,0x5e,0x00,0x5f,0x5e,0x5f,0x00,0x60,0x5f,0x60,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,\n\t0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,\n\t0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,\n\t0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x81,0x82,0x00,0x83,0x82,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,\n\t0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8d,0x8c,0x8d,0x00,0x8e,0x8d,0x8e,0x00,\n\t0x8f,0x8e,0x8f,0x00,0x90,0x8f,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,\n\t0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,\n\t0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,\n\t0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xb0,0xaf,0x00,0xb0,0xb1,0xb0,0x00,\n\t0xb1,0xb2,0xb1,0x00,0xb2,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,\n\t0xba,0xba,0xb9,0x00,0xbb,0xbb,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,\n\t0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xca,0xc9,0x00,0xca,0xcb,0xca,0x00,\n\t0xcb,0xcc,0xcb,0x00,0xcc,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,\n\t0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,\n\t0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,\n\t0xee,0xef,0xec,0x00,0xef,0xf0,0xed,0x00,0xf0,0xf1,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,\n\t0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x11,0x00,\n\t0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x18,0x17,0x18,0x00,0x18,0x17,0x19,0x00,\n\t0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x33,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,\n\t0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5d,0x5c,0x5d,0x00,0x5e,0x5d,0x5e,0x00,0x5f,0x5e,0x5f,0x00,0x60,0x5f,0x60,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,\n\t0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,\n\t0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,\n\t0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x77,0x77,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,\n\t0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x81,0x82,0x00,0x83,0x82,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,\n\t0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8d,0x8c,0x8d,0x00,0x8e,0x8d,0x8e,0x00,\n\t0x8f,0x8e,0x8f,0x00,0x90,0x8f,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,\n\t0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,\n\t0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,\n\t0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xb0,0xaf,0x00,0xb0,0xb1,0xb0,0x00,\n\t0xb1,0xb2,0xb1,0x00,0xb2,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,\n\t0xba,0xba,0xb9,0x00,0xbb,0xbb,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,\n\t0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xca,0xc9,0x00,0xca,0xcb,0xca,0x00,\n\t0xcb,0xcc,0xcb,0x00,0xcc,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,\n\t0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,\n\t0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xec,0xed,0xea,0x00,0xed,0xee,0xeb,0x00,\n\t0xee,0xef,0xec,0x00,0xef,0xf0,0xed,0x00,0xf0,0xf1,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,\n\t0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x11,0x00,\n\t0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x17,0x19,0x00,\n\t0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x52,0x51,0x53,0x00,\n\t0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5e,0x5d,0x5e,0x00,0x5f,0x5e,0x5f,0x00,0x60,0x5f,0x60,0x00,0x61,0x60,0x61,0x00,0x62,0x62,0x63,0x00,\n\t0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6b,0x6a,0x6c,0x00,\n\t0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,\n\t0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x78,0x78,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,\n\t0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x82,0x81,0x82,0x00,0x83,0x82,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,\n\t0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8e,0x8d,0x8e,0x00,\n\t0x8f,0x8e,0x8f,0x00,0x90,0x8f,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x97,0x00,\n\t0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,\n\t0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,\n\t0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb1,0xb0,0x00,\n\t0xb1,0xb2,0xb1,0x00,0xb2,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,\n\t0xba,0xba,0xb9,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,\n\t0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xcb,0xca,0x00,\n\t0xcb,0xcc,0xcb,0x00,0xcc,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,\n\t0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,\n\t0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe6,0x00,0xe9,0xea,0xe7,0x00,0xea,0xeb,0xe8,0x00,0xec,0xec,0xea,0x00,0xed,0xee,0xeb,0x00,\n\t0xee,0xef,0xec,0x00,0xef,0xf0,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,0xf4,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,\n\t0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x11,0x00,\n\t0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x17,0x19,0x00,\n\t0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,\n\t0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x53,0x52,0x54,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5a,0x00,\n\t0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5f,0x5e,0x5f,0x00,0x60,0x5f,0x60,0x00,0x61,0x60,0x61,0x00,0x62,0x61,0x62,0x00,\n\t0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,\n\t0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,\n\t0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,\n\t0x7e,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x84,0x84,0x84,0x00,0x85,0x85,0x85,0x00,\n\t0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,\n\t0x8f,0x8e,0x8f,0x00,0x90,0x8f,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,\n\t0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,\n\t0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,\n\t0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb1,0xb2,0xb1,0x00,0xb2,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,\n\t0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbd,0xbc,0x00,0xbd,0xbe,0xbd,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,\n\t0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,\n\t0xcb,0xcc,0xcb,0x00,0xcc,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xda,0x00,0xdb,0xdc,0xdb,0x00,\n\t0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,\n\t0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,\n\t0xee,0xef,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,0xf4,0xf5,0xf3,0x00,0xf5,0xf6,0xf4,0x00,\n\t0xf7,0xf7,0xf5,0x00,0xf7,0xf8,0xf6,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x11,0x00,\n\t0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x15,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x17,0x19,0x00,\n\t0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x54,0x56,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x58,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,\n\t0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,\n\t0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,\n\t0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,\n\t0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,\n\t0x7e,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x84,0x84,0x00,0x85,0x85,0x85,0x00,\n\t0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,\n\t0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,\n\t0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,\n\t0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa7,0xa6,0x00,0xa7,0xa8,0xa7,0x00,\n\t0xa8,0xa9,0xa8,0x00,0xa9,0xaa,0xa9,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb9,0x00,\n\t0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbd,0xbc,0x00,0xbd,0xbe,0xbd,0x00,0xbe,0xbf,0xbe,0x00,0xbf,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,\n\t0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,\n\t0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xce,0xcd,0xcd,0x00,0xcf,0xce,0xce,0x00,0xd0,0xcf,0xcf,0x00,0xd1,0xd0,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xda,0x00,0xdb,0xdc,0xdb,0x00,\n\t0xdc,0xdd,0xdc,0x00,0xdd,0xde,0xdd,0x00,0xde,0xdf,0xde,0x00,0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,\n\t0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,\n\t0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf5,0xf3,0x00,0xf5,0xf6,0xf4,0x00,\n\t0xf6,0xf7,0xf5,0x00,0xf7,0xf8,0xf6,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x11,0x00,\n\t0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x15,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x17,0x18,0x00,0x18,0x17,0x19,0x00,\n\t0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x58,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,\n\t0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,\n\t0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,\n\t0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,\n\t0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7b,0x7b,0x00,0x7d,0x7c,0x7c,0x00,\n\t0x7e,0x7d,0x7d,0x00,0x7f,0x7e,0x7e,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x80,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x84,0x84,0x00,0x85,0x85,0x85,0x00,\n\t0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,\n\t0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,\n\t0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,\n\t0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa7,0xa6,0x00,0xa7,0xa8,0xa7,0x00,\n\t0xa8,0xa9,0xa8,0x00,0xa9,0xaa,0xa9,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,\n\t0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbd,0xbc,0x00,0xbd,0xbe,0xbd,0x00,0xbe,0xbf,0xbe,0x00,0xbf,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,\n\t0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,\n\t0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xce,0xcd,0xcd,0x00,0xcf,0xce,0xce,0x00,0xd0,0xcf,0xcf,0x00,0xd1,0xd0,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd7,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xda,0x00,0xdb,0xdc,0xdb,0x00,\n\t0xdc,0xdd,0xdc,0x00,0xdd,0xde,0xdd,0x00,0xde,0xdf,0xde,0x00,0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,\n\t0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xec,0xec,0xea,0x00,0xed,0xed,0xeb,0x00,\n\t0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf5,0xf3,0x00,0xf5,0xf6,0xf4,0x00,\n\t0xf6,0xf7,0xf5,0x00,0xf7,0xf8,0xf6,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,\n\t0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x15,0x15,0x16,0x00,0x16,0x16,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,\n\t0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x4a,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,\n\t0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,\n\t0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x65,0x64,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,\n\t0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6f,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,\n\t0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7c,0x7c,0x00,\n\t0x7e,0x7d,0x7d,0x00,0x7e,0x7e,0x7e,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x80,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x85,0x85,0x00,\n\t0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,\n\t0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,\n\t0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9f,0x9f,0x9f,0x00,\n\t0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa8,0xa7,0x00,\n\t0xa8,0xa9,0xa8,0x00,0xa9,0xaa,0xa9,0x00,0xaa,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb9,0x00,\n\t0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbe,0xbd,0x00,0xbe,0xbf,0xbe,0x00,0xbf,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,\n\t0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,\n\t0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xcf,0xce,0xce,0x00,0xd0,0xcf,0xcf,0x00,0xd1,0xd0,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd8,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xdb,0x00,\n\t0xdc,0xdd,0xdc,0x00,0xdd,0xde,0xdd,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,0xe0,0xe1,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,\n\t0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xed,0xed,0xeb,0x00,\n\t0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf4,0x00,\n\t0xf6,0xf7,0xf5,0x00,0xf7,0xf8,0xf6,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x0f,0x00,0x12,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,\n\t0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x15,0x15,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,\n\t0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,\n\t0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,\n\t0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,\n\t0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,\n\t0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x65,0x64,0x66,0x00,0x66,0x65,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,\n\t0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,\n\t0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7c,0x00,\n\t0x7e,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,\n\t0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x89,0x00,0x8a,0x8a,0x8a,0x00,0x8b,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,\n\t0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,\n\t0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,\n\t0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,\n\t0xa8,0xa9,0xa8,0x00,0xa9,0xaa,0xa9,0x00,0xaa,0xab,0xab,0x00,0xab,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb6,0x00,0xb8,0xb8,0xb7,0x00,0xb9,0xb9,0xb8,0x00,\n\t0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,\n\t0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,\n\t0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd9,0xd7,0x00,0xd9,0xda,0xd8,0x00,0xda,0xdb,0xd9,0x00,0xdb,0xdc,0xda,0x00,\n\t0xdc,0xdd,0xdc,0x00,0xdd,0xde,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xdf,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,\n\t0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,\n\t0xee,0xee,0xec,0x00,0xef,0xef,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,\n\t0xf6,0xf7,0xf5,0x00,0xf7,0xf8,0xf6,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0e,0x00,0x11,0x0e,0x0f,0x00,0x12,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,\n\t0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x17,0x17,0x19,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x20,0x00,0x1f,0x1f,0x20,0x00,\n\t0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x36,0x37,0x38,0x00,\n\t0x37,0x38,0x39,0x00,0x38,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,\n\t0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,\n\t0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x65,0x64,0x66,0x00,0x66,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x67,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,\n\t0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,\n\t0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,0x7c,0x7b,0x7d,0x00,\n\t0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x82,0x82,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,\n\t0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x88,0x88,0x00,0x88,0x89,0x89,0x00,0x89,0x8a,0x8a,0x00,0x8a,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,\n\t0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,\n\t0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,\n\t0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,\n\t0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbf,0xbe,0xbe,0x00,0xc0,0xbf,0xbf,0x00,0xc1,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,\n\t0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,\n\t0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xcf,0xce,0x00,0xcf,0xd0,0xcf,0x00,0xd0,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,\n\t0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,\n\t0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,\n\t0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0e,0x00,0x11,0x0e,0x0f,0x00,0x12,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,\n\t0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x17,0x17,0x19,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x20,0x00,0x1f,0x1f,0x20,0x00,\n\t0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x36,0x37,0x38,0x00,\n\t0x37,0x38,0x39,0x00,0x38,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x48,0x48,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,\n\t0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,\n\t0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x65,0x64,0x66,0x00,0x66,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x67,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,\n\t0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,\n\t0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,\n\t0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x81,0x82,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,\n\t0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x88,0x88,0x00,0x88,0x89,0x89,0x00,0x89,0x8a,0x8a,0x00,0x8a,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,\n\t0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x95,0x95,0x95,0x00,0x96,0x96,0x96,0x00,\n\t0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,\n\t0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,\n\t0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xbb,0xba,0xba,0x00,0xbc,0xbc,0xbc,0x00,0xbe,0xbd,0xbd,0x00,0xbf,0xbe,0xbe,0x00,0xc0,0xbf,0xbf,0x00,0xc1,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,\n\t0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,\n\t0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xce,0xcd,0x00,0xce,0xcf,0xce,0x00,0xcf,0xd0,0xcf,0x00,0xd0,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xdf,0xdf,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,\n\t0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,\n\t0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xf0,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf5,0xf2,0x00,0xf5,0xf6,0xf3,0x00,\n\t0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0c,0x0c,0x0c,0x00,0x10,0x0d,0x0e,0x00,0x11,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,\n\t0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x17,0x17,0x19,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,\n\t0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x23,0x22,0x22,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x35,0x36,0x37,0x00,0x36,0x37,0x38,0x00,\n\t0x37,0x38,0x39,0x00,0x38,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3e,0x40,0x00,0x40,0x40,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x49,0x49,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x5a,0x00,\n\t0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x61,0x62,0x00,\n\t0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x66,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x67,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,\n\t0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x73,0x73,0x74,0x00,\n\t0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,\n\t0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x81,0x82,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,\n\t0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x89,0x89,0x00,0x89,0x8a,0x8a,0x00,0x8a,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,\n\t0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x96,0x96,0x96,0x00,\n\t0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,\n\t0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa2,0xa1,0xa1,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,\n\t0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xb0,0xb0,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbd,0x00,0xbf,0xbe,0xbe,0x00,0xc0,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,\n\t0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xca,0x00,\n\t0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xcf,0xce,0x00,0xcf,0xd0,0xcf,0x00,0xd0,0xd1,0xd0,0x00,0xd1,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xe0,0xe0,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,\n\t0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,\n\t0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xf0,0xee,0x00,0xf1,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf6,0xf3,0x00,\n\t0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x10,0x0d,0x0e,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,\n\t0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x17,0x17,0x19,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,\n\t0x20,0x20,0x21,0x00,0x21,0x21,0x21,0x00,0x23,0x22,0x22,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,\n\t0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x34,0x35,0x36,0x00,0x35,0x36,0x37,0x00,0x36,0x37,0x38,0x00,\n\t0x37,0x38,0x39,0x00,0x38,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3e,0x40,0x00,0x40,0x3f,0x41,0x00,\n\t0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x4a,0x4a,0x4a,0x00,0x4b,0x4b,0x4b,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,\n\t0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,\n\t0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x67,0x66,0x68,0x00,0x68,0x67,0x69,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,\n\t0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,\n\t0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,\n\t0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x81,0x00,0x82,0x81,0x82,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,\n\t0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x8a,0x8a,0x00,0x8a,0x8b,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,\n\t0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,\n\t0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,\n\t0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa2,0xa1,0xa1,0x00,0xa3,0xa2,0xa2,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,\n\t0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,\n\t0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbf,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,\n\t0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,0xca,0xca,0xc9,0x00,\n\t0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xd0,0xcf,0x00,0xd0,0xd1,0xd0,0x00,0xd1,0xd2,0xd1,0x00,0xd2,0xd3,0xd2,0x00,\n\t0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe1,0xe1,0xdf,0x00,0xe2,0xe2,0xe0,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,\n\t0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,\n\t0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xf0,0xee,0x00,0xf0,0xf1,0xef,0x00,0xf2,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,\n\t0xf6,0xf7,0xf4,0x00,0xf7,0xf8,0xf5,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0d,0x0e,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,\n\t0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x17,0x17,0x19,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1e,0x20,0x00,\n\t0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x23,0x22,0x22,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,\n\t0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3e,0x40,0x00,0x40,0x3f,0x41,0x00,\n\t0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x51,0x00,\n\t0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,\n\t0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,\n\t0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,\n\t0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,\n\t0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,\n\t0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,\n\t0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,\n\t0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,\n\t0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa2,0xa1,0xa1,0x00,0xa3,0xa2,0xa2,0x00,0xa4,0xa3,0xa3,0x00,0xa5,0xa4,0xa4,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,\n\t0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,\n\t0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc9,0xc8,0xc8,0x00,0xca,0xc9,0xc9,0x00,\n\t0xcb,0xca,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd6,0xd5,0xd5,0x00,0xd7,0xd6,0xd6,0x00,0xd8,0xd7,0xd7,0x00,0xd9,0xd8,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xd9,0x00,\n\t0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,\n\t0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,\n\t0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xf0,0xee,0x00,0xf0,0xf1,0xef,0x00,0xf1,0xf2,0xf0,0x00,0xf2,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,\n\t0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0d,0x0e,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,\n\t0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x17,0x17,0x19,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1e,0x20,0x00,\n\t0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x23,0x22,0x22,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,\n\t0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3f,0x3e,0x40,0x00,0x40,0x3f,0x41,0x00,\n\t0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x51,0x00,\n\t0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x54,0x54,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,\n\t0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,\n\t0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,\n\t0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,\n\t0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,\n\t0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8c,0x8c,0x8c,0x00,0x8d,0x8d,0x8d,0x00,\n\t0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,\n\t0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,\n\t0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa2,0xa1,0xa1,0x00,0xa3,0xa2,0xa2,0x00,0xa4,0xa3,0xa3,0x00,0xa5,0xa4,0xa4,0x00,0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,\n\t0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,\n\t0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc9,0xc8,0xc8,0x00,0xca,0xc9,0xc9,0x00,\n\t0xcb,0xca,0xca,0x00,0xcc,0xcb,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd6,0xd5,0xd5,0x00,0xd7,0xd6,0xd6,0x00,0xd8,0xd7,0xd7,0x00,0xd9,0xd8,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xd9,0x00,\n\t0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,\n\t0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,\n\t0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xf0,0xee,0x00,0xf0,0xf1,0xef,0x00,0xf1,0xf2,0xf0,0x00,0xf2,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,\n\t0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0d,0x0e,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,\n\t0x13,0x11,0x12,0x00,0x14,0x12,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x17,0x17,0x19,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1e,0x1f,0x00,\n\t0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x25,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x38,0x00,\n\t0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x40,0x3f,0x41,0x00,\n\t0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x51,0x00,\n\t0x52,0x52,0x52,0x00,0x53,0x53,0x53,0x00,0x53,0x54,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,\n\t0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,\n\t0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x6a,0x6a,0x6b,0x00,\n\t0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x76,0x76,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7c,0x7b,0x7d,0x00,\n\t0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x83,0x83,0x00,0x84,0x84,0x85,0x00,\n\t0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8d,0x8d,0x8d,0x00,\n\t0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,\n\t0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,\n\t0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa3,0xa2,0xa2,0x00,0xa4,0xa3,0xa3,0x00,0xa5,0xa4,0xa4,0x00,0xa6,0xa5,0xa6,0x00,0xa7,0xa7,0xa7,0x00,\n\t0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,\n\t0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xca,0xc9,0xc9,0x00,\n\t0xcb,0xca,0xca,0x00,0xcc,0xcb,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd7,0xd6,0xd6,0x00,0xd8,0xd7,0xd7,0x00,0xd9,0xd8,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xd9,0x00,\n\t0xdc,0xdc,0xda,0x00,0xdd,0xdd,0xdb,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe3,0x00,\n\t0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xeb,0x00,\n\t0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf1,0xef,0x00,0xf1,0xf2,0xf0,0x00,0xf2,0xf3,0xf1,0x00,0xf3,0xf4,0xf2,0x00,0xf5,0xf5,0xf3,0x00,\n\t0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0d,0x0e,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x10,0x11,0x00,\n\t0x13,0x11,0x12,0x00,0x14,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x17,0x17,0x19,0x00,\n\t0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1e,0x1f,0x00,\n\t0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,\n\t0x52,0x52,0x53,0x00,0x52,0x53,0x53,0x00,0x53,0x54,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,\n\t0x59,0x59,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,\n\t0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x76,0x76,0x00,0x76,0x77,0x77,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,\n\t0x7d,0x7c,0x7e,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x83,0x83,0x00,0x83,0x84,0x84,0x00,\n\t0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,\n\t0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,\n\t0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,\n\t0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa4,0xa3,0xa3,0x00,0xa5,0xa4,0xa4,0x00,0xa6,0xa5,0xa6,0x00,0xa7,0xa6,0xa7,0x00,\n\t0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,\n\t0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,\n\t0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd8,0xd7,0xd7,0x00,0xd9,0xd8,0xd8,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,\n\t0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe9,0xe9,0xe7,0x00,0xea,0xea,0xe8,0x00,0xeb,0xeb,0xe9,0x00,0xec,0xec,0xea,0x00,\n\t0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf2,0xf0,0x00,0xf2,0xf3,0xf1,0x00,0xf3,0xf4,0xf2,0x00,0xf4,0xf5,0xf3,0x00,\n\t0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf5,0x00,0xf8,0xf8,0xf6,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfd,0xfb,0x00,0xfd,0xfe,0xfc,0x00,\n\t0xff,0xff,0xfd,0x00,0xff,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0d,0x0e,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x0f,0x11,0x00,\n\t0x13,0x10,0x12,0x00,0x14,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1e,0x1f,0x00,\n\t0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x24,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,\n\t0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x50,0x51,0x00,0x50,0x51,0x52,0x00,\n\t0x51,0x52,0x53,0x00,0x52,0x53,0x54,0x00,0x53,0x54,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x57,0x59,0x00,\n\t0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,\n\t0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x76,0x76,0x00,0x76,0x77,0x77,0x00,0x77,0x78,0x78,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,\n\t0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x82,0x00,0x82,0x83,0x83,0x00,0x83,0x84,0x84,0x00,\n\t0x84,0x85,0x85,0x00,0x85,0x86,0x86,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,\n\t0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x96,0x00,\n\t0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,\n\t0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,\n\t0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xaa,0x00,0xac,0xab,0xab,0x00,0xad,0xac,0xac,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,\n\t0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xca,0xc9,0x00,\n\t0xca,0xcb,0xca,0x00,0xcb,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,\n\t0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,\n\t0xec,0xed,0xeb,0x00,0xed,0xee,0xec,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf4,0xf2,0x00,0xf4,0xf5,0xf3,0x00,\n\t0xf5,0xf6,0xf4,0x00,0xf6,0xf7,0xf5,0x00,0xf7,0xf8,0xf6,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,0xfc,0xfd,0xfa,0x00,0xfd,0xfe,0xfb,0x00,\n\t0xfe,0xff,0xfc,0x00,0xfe,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0d,0x0e,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,0x12,0x0f,0x11,0x00,\n\t0x13,0x10,0x12,0x00,0x14,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1e,0x1f,0x00,\n\t0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x24,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,\n\t0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x50,0x51,0x00,0x50,0x51,0x52,0x00,\n\t0x51,0x52,0x53,0x00,0x52,0x53,0x54,0x00,0x53,0x54,0x55,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x57,0x59,0x00,\n\t0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,\n\t0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x76,0x76,0x00,0x76,0x77,0x77,0x00,0x77,0x78,0x78,0x00,0x78,0x79,0x79,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,\n\t0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x83,0x83,0x00,0x83,0x84,0x84,0x00,\n\t0x84,0x85,0x85,0x00,0x85,0x86,0x86,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,\n\t0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x90,0x90,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,\n\t0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,\n\t0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,\n\t0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xaa,0x00,0xac,0xab,0xab,0x00,0xad,0xac,0xac,0x00,0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb3,0xb3,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,\n\t0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc9,0xc8,0x00,0xc9,0xca,0xc9,0x00,\n\t0xca,0xcb,0xca,0x00,0xcb,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,\n\t0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,\n\t0xec,0xed,0xeb,0x00,0xed,0xee,0xec,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf4,0xf2,0x00,0xf4,0xf5,0xf3,0x00,\n\t0xf5,0xf6,0xf4,0x00,0xf6,0xf7,0xf5,0x00,0xf7,0xf8,0xf6,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfc,0xfd,0xfa,0x00,0xfd,0xfe,0xfb,0x00,\n\t0xfe,0xff,0xfc,0x00,0xfe,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0d,0x0e,0x00,0x10,0x0e,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,\n\t0x13,0x10,0x12,0x00,0x14,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1e,0x1f,0x00,\n\t0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x24,0x26,0x00,0x26,0x25,0x27,0x00,0x28,0x27,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,\n\t0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x43,0x42,0x43,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x51,0x52,0x00,\n\t0x51,0x52,0x53,0x00,0x52,0x53,0x54,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x57,0x59,0x00,\n\t0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x62,0x00,\n\t0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x64,0x63,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x77,0x77,0x00,0x77,0x78,0x78,0x00,0x78,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7c,0x00,\n\t0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x7f,0x00,0x80,0x80,0x80,0x00,0x81,0x81,0x81,0x00,0x82,0x82,0x83,0x00,0x83,0x84,0x84,0x00,\n\t0x84,0x85,0x85,0x00,0x85,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,\n\t0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x91,0x91,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x96,0x00,\n\t0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9d,0x9c,0x9d,0x00,0x9e,0x9e,0x9e,0x00,\n\t0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa7,0x00,\n\t0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xab,0xaa,0xaa,0x00,0xac,0xab,0xab,0x00,0xad,0xac,0xac,0x00,0xae,0xad,0xae,0x00,0xaf,0xaf,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb4,0xb4,0xb3,0x00,0xb5,0xb5,0xb4,0x00,0xb6,0xb6,0xb5,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc1,0xc1,0xc1,0x00,\n\t0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xca,0xc9,0x00,\n\t0xca,0xcb,0xca,0x00,0xcb,0xcc,0xcb,0x00,0xcc,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd9,0x00,0xdb,0xdb,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,\n\t0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,\n\t0xec,0xed,0xeb,0x00,0xed,0xee,0xec,0x00,0xee,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf4,0xf2,0x00,0xf4,0xf5,0xf3,0x00,\n\t0xf5,0xf6,0xf4,0x00,0xf6,0xf7,0xf5,0x00,0xf7,0xf8,0xf6,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfd,0xfe,0xfb,0x00,\n\t0xfe,0xff,0xfc,0x00,0xfe,0xff,0xfd,0x00,0xfe,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0d,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,\n\t0x13,0x10,0x12,0x00,0x14,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x17,0x18,0x00,\n\t0x18,0x18,0x19,0x00,0x19,0x19,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1e,0x1f,0x00,\n\t0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x25,0x00,0x25,0x24,0x26,0x00,0x26,0x25,0x27,0x00,0x27,0x26,0x28,0x00,\n\t0x29,0x28,0x29,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x43,0x42,0x43,0x00,0x44,0x43,0x44,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x52,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x57,0x59,0x00,\n\t0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,\n\t0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x64,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x78,0x78,0x00,0x78,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,\n\t0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,\n\t0x85,0x85,0x85,0x00,0x86,0x86,0x86,0x00,0x87,0x87,0x87,0x00,0x88,0x88,0x88,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,\n\t0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x92,0x92,0x92,0x00,0x93,0x93,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,\n\t0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9d,0x9c,0x9d,0x00,0x9e,0x9d,0x9e,0x00,\n\t0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,\n\t0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xac,0xab,0xac,0x00,0xad,0xac,0xad,0x00,0xae,0xad,0xae,0x00,0xaf,0xae,0xaf,0x00,\n\t0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,\n\t0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,\n\t0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,\n\t0xca,0xcb,0xca,0x00,0xcb,0xcc,0xcb,0x00,0xcc,0xcd,0xcc,0x00,0xcd,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,\n\t0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,\n\t0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,\n\t0xec,0xed,0xeb,0x00,0xed,0xee,0xec,0x00,0xee,0xef,0xee,0x00,0xef,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf4,0xf2,0x00,0xf4,0xf5,0xf3,0x00,\n\t0xf5,0xf6,0xf4,0x00,0xf6,0xf7,0xf5,0x00,0xf7,0xf8,0xf6,0x00,0xf8,0xf9,0xf7,0x00,0xf9,0xfa,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfd,0xfb,0x00,\n\t0xfe,0xff,0xfc,0x00,0xfe,0xff,0xfd,0x00,0xfe,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,\n\t0x13,0x10,0x12,0x00,0x14,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x17,0x00,0x17,0x16,0x18,0x00,\n\t0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1e,0x1f,0x00,\n\t0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x43,0x42,0x43,0x00,0x44,0x43,0x44,0x00,0x45,0x44,0x45,0x00,0x46,0x45,0x46,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x57,0x57,0x59,0x00,\n\t0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,\n\t0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x64,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,\n\t0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,0x84,0x83,0x84,0x00,\n\t0x85,0x84,0x85,0x00,0x86,0x85,0x86,0x00,0x87,0x86,0x87,0x00,0x88,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,0x8b,0x8a,0x8b,0x00,0x8c,0x8b,0x8c,0x00,\n\t0x8d,0x8c,0x8d,0x00,0x8e,0x8e,0x8e,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,\n\t0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9d,0x9c,0x9d,0x00,0x9e,0x9d,0x9e,0x00,\n\t0x9f,0x9e,0x9f,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,\n\t0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,\n\t0xaf,0xaf,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,\n\t0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,\n\t0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,\n\t0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,\n\t0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xde,0xdd,0x00,0xde,0xdf,0xde,0x00,0xdf,0xe0,0xdf,0x00,0xe0,0xe1,0xe0,0x00,0xe1,0xe2,0xe1,0x00,0xe2,0xe3,0xe2,0x00,\n\t0xe3,0xe4,0xe3,0x00,0xe4,0xe5,0xe4,0x00,0xe5,0xe6,0xe5,0x00,0xe6,0xe7,0xe6,0x00,0xe7,0xe8,0xe7,0x00,0xe8,0xe9,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,\n\t0xec,0xed,0xeb,0x00,0xed,0xee,0xec,0x00,0xee,0xef,0xee,0x00,0xef,0xf0,0xef,0x00,0xf0,0xf1,0xf0,0x00,0xf1,0xf2,0xf1,0x00,0xf3,0xf4,0xf2,0x00,0xf4,0xf5,0xf3,0x00,\n\t0xf5,0xf6,0xf4,0x00,0xf6,0xf7,0xf5,0x00,0xf7,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfd,0xfb,0x00,\n\t0xfd,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,\n\t0x13,0x10,0x12,0x00,0x14,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x17,0x16,0x18,0x00,\n\t0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x1a,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1e,0x1f,0x00,0x1f,0x1e,0x1f,0x00,\n\t0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x43,0x42,0x43,0x00,0x44,0x43,0x44,0x00,0x45,0x44,0x45,0x00,0x46,0x45,0x46,0x00,0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x57,0x57,0x59,0x00,\n\t0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,\n\t0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x64,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x68,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x7a,0x7a,0x7a,0x00,0x7b,0x7b,0x7b,0x00,\n\t0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x83,0x82,0x83,0x00,0x84,0x83,0x84,0x00,\n\t0x85,0x84,0x85,0x00,0x86,0x85,0x86,0x00,0x87,0x86,0x87,0x00,0x88,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,0x8b,0x8a,0x8b,0x00,0x8c,0x8b,0x8c,0x00,\n\t0x8d,0x8c,0x8d,0x00,0x8e,0x8d,0x8e,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x94,0x94,0x94,0x00,0x95,0x95,0x95,0x00,\n\t0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9d,0x9c,0x9d,0x00,0x9e,0x9d,0x9e,0x00,\n\t0x9f,0x9e,0x9f,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,\n\t0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,\n\t0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,\n\t0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,\n\t0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,\n\t0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd1,0xd1,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,\n\t0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xde,0xdd,0x00,0xde,0xdf,0xde,0x00,0xdf,0xe0,0xdf,0x00,0xe0,0xe1,0xe0,0x00,0xe1,0xe2,0xe1,0x00,0xe2,0xe3,0xe2,0x00,\n\t0xe3,0xe4,0xe3,0x00,0xe4,0xe5,0xe4,0x00,0xe5,0xe6,0xe5,0x00,0xe6,0xe7,0xe6,0x00,0xe7,0xe8,0xe7,0x00,0xe8,0xe9,0xe8,0x00,0xea,0xeb,0xe9,0x00,0xeb,0xec,0xea,0x00,\n\t0xec,0xed,0xeb,0x00,0xed,0xee,0xec,0x00,0xee,0xef,0xee,0x00,0xef,0xf0,0xef,0x00,0xf0,0xf1,0xf0,0x00,0xf1,0xf2,0xf1,0x00,0xf3,0xf4,0xf2,0x00,0xf4,0xf5,0xf3,0x00,\n\t0xf5,0xf6,0xf4,0x00,0xf6,0xf7,0xf5,0x00,0xf7,0xf8,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfd,0xfb,0x00,\n\t0xfd,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,\n\t0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x17,0x00,0x17,0x16,0x18,0x00,\n\t0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1b,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1d,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x1f,0x00,\n\t0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x44,0x43,0x44,0x00,0x45,0x44,0x45,0x00,0x46,0x45,0x46,0x00,0x47,0x46,0x48,0x00,0x48,0x48,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,\n\t0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,\n\t0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x65,0x64,0x66,0x00,0x66,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x67,0x69,0x00,0x69,0x69,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x72,0x72,0x73,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7b,0x7b,0x00,\n\t0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7d,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x82,0x83,0x00,0x84,0x83,0x84,0x00,\n\t0x85,0x84,0x85,0x00,0x86,0x85,0x86,0x00,0x87,0x86,0x87,0x00,0x88,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,0x8b,0x8a,0x8b,0x00,0x8c,0x8b,0x8c,0x00,\n\t0x8d,0x8c,0x8d,0x00,0x8e,0x8d,0x8e,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x94,0x93,0x94,0x00,0x95,0x95,0x95,0x00,\n\t0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9d,0x9c,0x9d,0x00,0x9e,0x9d,0x9e,0x00,\n\t0x9f,0x9e,0x9f,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa0,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,\n\t0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,\n\t0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,\n\t0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,\n\t0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,\n\t0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xd0,0x00,0xd2,0xd2,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xda,0x00,\n\t0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xdf,0xde,0x00,0xdf,0xe0,0xdf,0x00,0xe0,0xe1,0xe0,0x00,0xe1,0xe2,0xe1,0x00,0xe2,0xe3,0xe2,0x00,\n\t0xe3,0xe4,0xe3,0x00,0xe4,0xe5,0xe4,0x00,0xe5,0xe6,0xe5,0x00,0xe6,0xe7,0xe6,0x00,0xe7,0xe8,0xe7,0x00,0xe8,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xec,0xea,0x00,\n\t0xec,0xed,0xeb,0x00,0xed,0xee,0xec,0x00,0xee,0xef,0xed,0x00,0xef,0xf0,0xef,0x00,0xf0,0xf1,0xf0,0x00,0xf1,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,0xf4,0xf5,0xf3,0x00,\n\t0xf5,0xf6,0xf4,0x00,0xf6,0xf7,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfd,0xfb,0x00,\n\t0xfd,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,\n\t0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x16,0x18,0x00,\n\t0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1c,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x1f,0x00,\n\t0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x45,0x44,0x45,0x00,0x46,0x45,0x46,0x00,0x47,0x46,0x48,0x00,0x48,0x47,0x49,0x00,\n\t0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x51,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,\n\t0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,0x60,0x60,0x61,0x00,\n\t0x61,0x61,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x66,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x67,0x69,0x00,0x69,0x68,0x6a,0x00,\n\t0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,\n\t0x7c,0x7c,0x7c,0x00,0x7d,0x7c,0x7d,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,\n\t0x85,0x84,0x85,0x00,0x86,0x85,0x86,0x00,0x87,0x86,0x87,0x00,0x88,0x87,0x88,0x00,0x89,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,0x8b,0x8a,0x8b,0x00,0x8c,0x8b,0x8c,0x00,\n\t0x8d,0x8c,0x8d,0x00,0x8e,0x8d,0x8e,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x94,0x93,0x94,0x00,0x95,0x94,0x95,0x00,\n\t0x96,0x96,0x96,0x00,0x97,0x97,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9d,0x9c,0x9d,0x00,0x9e,0x9d,0x9e,0x00,\n\t0x9f,0x9e,0x9f,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa0,0xa1,0x00,0xa2,0xa1,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,0xa6,0xa6,0xa6,0x00,\n\t0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,\n\t0xb0,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,\n\t0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,\n\t0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,\n\t0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,\n\t0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd3,0x00,0xd5,0xd5,0xd4,0x00,0xd6,0xd6,0xd5,0x00,0xd7,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xe0,0xdf,0x00,0xe0,0xe1,0xe0,0x00,0xe1,0xe2,0xe1,0x00,0xe2,0xe3,0xe2,0x00,\n\t0xe3,0xe4,0xe3,0x00,0xe4,0xe5,0xe4,0x00,0xe5,0xe6,0xe5,0x00,0xe6,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xed,0xeb,0x00,0xed,0xee,0xec,0x00,0xee,0xef,0xed,0x00,0xef,0xf0,0xee,0x00,0xf0,0xf1,0xf0,0x00,0xf1,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,\n\t0xf5,0xf6,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfd,0xfb,0x00,\n\t0xfd,0xfe,0xfc,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x11,0x00,\n\t0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x16,0x18,0x00,\n\t0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x1f,0x00,\n\t0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2e,0x00,\n\t0x30,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,0x32,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x47,0x46,0x48,0x00,0x48,0x47,0x49,0x00,\n\t0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x52,0x00,\n\t0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,\n\t0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,\n\t0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x68,0x67,0x69,0x00,0x69,0x68,0x6a,0x00,\n\t0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,\n\t0x7c,0x7b,0x7c,0x00,0x7d,0x7c,0x7d,0x00,0x7e,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,0x7f,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,\n\t0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,\n\t0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x94,0x93,0x94,0x00,0x95,0x94,0x95,0x00,\n\t0x96,0x95,0x96,0x00,0x97,0x96,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9d,0x9c,0x9d,0x00,0x9e,0x9d,0x9d,0x00,\n\t0x9f,0x9e,0x9e,0x00,0xa0,0x9f,0x9f,0x00,0xa1,0xa0,0xa1,0x00,0xa2,0xa1,0xa2,0x00,0xa3,0xa2,0xa3,0x00,0xa4,0xa3,0xa4,0x00,0xa5,0xa4,0xa5,0x00,0xa6,0xa5,0xa6,0x00,\n\t0xa7,0xa6,0xa7,0x00,0xa8,0xa7,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xaf,0xae,0xae,0x00,\n\t0xb0,0xaf,0xaf,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,\n\t0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,\n\t0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,\n\t0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,\n\t0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,\n\t0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf2,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,\n\t0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfd,0xfa,0x00,\n\t0xfd,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x11,0x00,\n\t0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x16,0x18,0x00,\n\t0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x1f,0x00,\n\t0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2e,0x00,\n\t0x30,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,0x32,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x47,0x46,0x48,0x00,0x48,0x47,0x49,0x00,\n\t0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,\n\t0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,\n\t0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,\n\t0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x68,0x67,0x69,0x00,0x69,0x68,0x6a,0x00,\n\t0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6c,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,\n\t0x7c,0x7b,0x7c,0x00,0x7d,0x7c,0x7d,0x00,0x7e,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,0x7f,0x7f,0x81,0x00,0x80,0x80,0x82,0x00,0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,\n\t0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,\n\t0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x94,0x93,0x94,0x00,0x95,0x94,0x95,0x00,\n\t0x96,0x95,0x96,0x00,0x97,0x96,0x97,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9d,0x9c,0x9d,0x00,0x9e,0x9d,0x9d,0x00,\n\t0x9f,0x9e,0x9e,0x00,0xa0,0x9f,0x9f,0x00,0xa1,0xa0,0xa1,0x00,0xa2,0xa1,0xa2,0x00,0xa3,0xa2,0xa3,0x00,0xa4,0xa3,0xa4,0x00,0xa5,0xa4,0xa5,0x00,0xa6,0xa5,0xa6,0x00,\n\t0xa7,0xa6,0xa7,0x00,0xa8,0xa7,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xae,0xad,0xad,0x00,0xaf,0xae,0xae,0x00,\n\t0xb0,0xaf,0xaf,0x00,0xb1,0xb0,0xb0,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,\n\t0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xbb,0xbb,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,\n\t0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc8,0xc8,0xc7,0x00,0xc9,0xc9,0xc8,0x00,\n\t0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,\n\t0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe2,0xe0,0x00,0xe2,0xe3,0xe1,0x00,\n\t0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf3,0xf3,0xf1,0x00,0xf4,0xf4,0xf2,0x00,\n\t0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfc,0xfa,0x00,0xfc,0xfd,0xfa,0x00,\n\t0xfd,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xff,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x11,0x00,\n\t0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x16,0x18,0x00,\n\t0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x1f,0x00,\n\t0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2a,0x00,0x2c,0x2b,0x2b,0x00,0x2d,0x2c,0x2c,0x00,0x2e,0x2d,0x2d,0x00,0x2f,0x2e,0x2e,0x00,\n\t0x30,0x2f,0x2f,0x00,0x31,0x30,0x30,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3d,0x3f,0x00,0x3f,0x3f,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x48,0x00,0x48,0x47,0x49,0x00,\n\t0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x52,0x00,\n\t0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,\n\t0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,\n\t0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x69,0x00,0x69,0x68,0x6a,0x00,\n\t0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6d,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7b,0x7a,0x7b,0x00,\n\t0x7c,0x7b,0x7c,0x00,0x7d,0x7c,0x7d,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,0x7f,0x7f,0x81,0x00,0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,0x83,0x83,0x84,0x00,\n\t0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,\n\t0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x95,0x94,0x95,0x00,\n\t0x96,0x95,0x96,0x00,0x97,0x96,0x97,0x00,0x98,0x97,0x98,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9e,0x9d,0x9d,0x00,\n\t0x9f,0x9e,0x9e,0x00,0xa0,0x9f,0x9f,0x00,0xa1,0xa0,0xa1,0x00,0xa2,0xa1,0xa2,0x00,0xa3,0xa2,0xa3,0x00,0xa4,0xa3,0xa4,0x00,0xa5,0xa4,0xa5,0x00,0xa6,0xa5,0xa6,0x00,\n\t0xa7,0xa6,0xa7,0x00,0xa8,0xa7,0xa8,0x00,0xa9,0xa8,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xaf,0xae,0xae,0x00,\n\t0xb0,0xaf,0xaf,0x00,0xb1,0xb0,0xb0,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,\n\t0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbc,0xbc,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,\n\t0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc9,0xc9,0xc8,0x00,\n\t0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,\n\t0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe3,0xe1,0x00,\n\t0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf4,0xf4,0xf2,0x00,\n\t0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfd,0xfa,0x00,\n\t0xfd,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x11,0x00,\n\t0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x16,0x18,0x00,\n\t0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x1f,0x00,\n\t0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,\n\t0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3d,0x3f,0x00,0x3f,0x3e,0x40,0x00,\n\t0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,\n\t0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x51,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,\n\t0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,\n\t0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,\n\t0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,\n\t0x7c,0x7b,0x7d,0x00,0x7c,0x7c,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,0x7f,0x7f,0x81,0x00,0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,\n\t0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,\n\t0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,\n\t0x96,0x95,0x96,0x00,0x97,0x96,0x97,0x00,0x98,0x97,0x98,0x00,0x99,0x98,0x99,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,\n\t0x9f,0x9e,0x9f,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa0,0xa1,0x00,0xa2,0xa1,0xa2,0x00,0xa3,0xa2,0xa3,0x00,0xa4,0xa3,0xa4,0x00,0xa5,0xa4,0xa5,0x00,0xa6,0xa5,0xa6,0x00,\n\t0xa7,0xa6,0xa7,0x00,0xa8,0xa7,0xa8,0x00,0xa9,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,\n\t0xb0,0xaf,0xaf,0x00,0xb1,0xb0,0xb0,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,\n\t0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbd,0xbd,0xbc,0x00,0xbe,0xbe,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,\n\t0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,\n\t0xca,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,\n\t0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe4,0xe2,0x00,0xe4,0xe5,0xe3,0x00,0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf5,0xf5,0xf3,0x00,0xf6,0xf6,0xf4,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfa,0x00,\n\t0xfd,0xfe,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x11,0x00,\n\t0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x16,0x18,0x00,\n\t0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1e,0x1e,0x1f,0x00,\n\t0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x22,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2d,0x2f,0x00,\n\t0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3d,0x3f,0x00,0x3f,0x3e,0x40,0x00,\n\t0x40,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,\n\t0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,\n\t0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,\n\t0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,\n\t0x7b,0x7b,0x7d,0x00,0x7c,0x7c,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,\n\t0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,\n\t0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,\n\t0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x98,0x97,0x98,0x00,0x99,0x98,0x99,0x00,0x9a,0x99,0x9a,0x00,0x9b,0x9a,0x9b,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,\n\t0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,\n\t0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xac,0xab,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,\n\t0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb3,0xb4,0x00,0xb5,0xb4,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,\n\t0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,\n\t0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,\n\t0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcc,0xcb,0xcb,0x00,0xcd,0xcc,0xcc,0x00,0xce,0xcd,0xcd,0x00,0xcf,0xce,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,\n\t0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf7,0xf6,0x00,0xf7,0xf8,0xf7,0x00,0xf8,0xf9,0xf8,0x00,0xf9,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfa,0x00,\n\t0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x11,0x00,\n\t0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x17,0x16,0x17,0x00,0x17,0x16,0x18,0x00,\n\t0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1e,0x1e,0x1f,0x00,\n\t0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x22,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2d,0x2e,0x00,0x2e,0x2d,0x2f,0x00,\n\t0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3e,0x3d,0x3f,0x00,0x3f,0x3e,0x40,0x00,\n\t0x40,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,\n\t0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,\n\t0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,\n\t0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x75,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x79,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7c,0x00,\n\t0x7b,0x7b,0x7d,0x00,0x7c,0x7c,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,\n\t0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,\n\t0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,\n\t0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x98,0x97,0x98,0x00,0x99,0x98,0x99,0x00,0x9a,0x99,0x9a,0x00,0x9b,0x9a,0x9b,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,\n\t0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,\n\t0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,\n\t0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb3,0xb4,0x00,0xb5,0xb4,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,\n\t0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbf,0xbf,0xbe,0x00,0xc0,0xc0,0xbf,0x00,\n\t0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,\n\t0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcc,0xcb,0xcb,0x00,0xcd,0xcc,0xcc,0x00,0xce,0xcd,0xcd,0x00,0xcf,0xce,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,\n\t0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe6,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf7,0xf6,0x00,0xf7,0xf8,0xf7,0x00,0xf8,0xf9,0xf8,0x00,0xf9,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfa,0x00,\n\t0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0b,0x0b,0x0b,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x11,0x00,\n\t0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,\n\t0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x1f,0x00,\n\t0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x23,0x22,0x22,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2a,0x2a,0x2b,0x00,0x2b,0x2b,0x2c,0x00,0x2c,0x2c,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,\n\t0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,0x35,0x34,0x36,0x00,0x36,0x36,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3f,0x00,0x3f,0x3e,0x40,0x00,\n\t0x40,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x49,0x00,\n\t0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,\n\t0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x6a,0x00,\n\t0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x76,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,\n\t0x7b,0x7b,0x7d,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x84,0x00,\n\t0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,\n\t0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,\n\t0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x99,0x98,0x99,0x00,0x9a,0x99,0x9a,0x00,0x9b,0x9a,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9e,0x00,\n\t0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa6,0x00,\n\t0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,\n\t0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb3,0xb4,0x00,0xb5,0xb4,0xb5,0x00,0xb6,0xb5,0xb6,0x00,0xb7,0xb7,0xb7,0x00,\n\t0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xc0,0xc0,0xbf,0x00,\n\t0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,\n\t0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcd,0xcc,0xcc,0x00,0xce,0xcd,0xcd,0x00,0xcf,0xce,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,\n\t0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd8,0xd9,0xd8,0x00,0xda,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe7,0xe5,0x00,0xe7,0xe8,0xe6,0x00,0xe8,0xe9,0xe7,0x00,0xe9,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf8,0xf7,0x00,0xf8,0xf9,0xf8,0x00,0xf9,0xfa,0xf9,0x00,0xfa,0xfb,0xfa,0x00,0xfc,0xfc,0xfa,0x00,\n\t0xfd,0xfd,0xfb,0x00,0xfd,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x11,0x00,\n\t0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,\n\t0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x1f,0x00,\n\t0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x22,0x00,0x24,0x23,0x23,0x00,0x25,0x24,0x24,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,\n\t0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,0x35,0x34,0x36,0x00,0x36,0x35,0x37,0x00,\n\t0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,\n\t0x40,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,\n\t0x51,0x51,0x52,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x56,0x58,0x00,\n\t0x58,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,\n\t0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,\n\t0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x77,0x76,0x77,0x00,0x78,0x77,0x78,0x00,0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,\n\t0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x86,0x87,0x00,0x86,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,\n\t0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,\n\t0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x9a,0x99,0x9a,0x00,0x9b,0x9a,0x9b,0x00,0x9c,0x9c,0x9c,0x00,0x9d,0x9d,0x9d,0x00,\n\t0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,\n\t0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,\n\t0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb4,0xb3,0xb4,0x00,0xb5,0xb4,0xb5,0x00,0xb6,0xb5,0xb6,0x00,0xb7,0xb6,0xb7,0x00,\n\t0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc1,0xc1,0xc0,0x00,0xc2,0xc2,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,\n\t0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xce,0xcd,0xcd,0x00,0xcf,0xce,0xce,0x00,0xd0,0xd0,0xcf,0x00,0xd1,0xd1,0xd0,0x00,\n\t0xd2,0xd2,0xd1,0x00,0xd3,0xd3,0xd2,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd8,0xd9,0xd8,0x00,0xd9,0xda,0xd9,0x00,\n\t0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe8,0xe7,0x00,0xe8,0xe9,0xe8,0x00,0xe9,0xea,0xe9,0x00,0xea,0xeb,0xea,0x00,\n\t0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf9,0xf8,0x00,0xf9,0xfa,0xf9,0x00,0xfa,0xfb,0xfa,0x00,0xfb,0xfc,0xfb,0x00,\n\t0xfd,0xfd,0xfc,0x00,0xfd,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0e,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x11,0x00,\n\t0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x16,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x1f,0x00,\n\t0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,\n\t0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,\n\t0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x50,0x00,\n\t0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x56,0x58,0x00,\n\t0x58,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,\n\t0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,\n\t0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,\n\t0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x86,0x87,0x00,0x86,0x87,0x88,0x00,0x87,0x88,0x89,0x00,0x88,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,\n\t0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x93,0x93,0x00,0x93,0x94,0x94,0x00,\n\t0x94,0x95,0x95,0x00,0x96,0x96,0x96,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9c,0x9c,0x00,0x9c,0x9d,0x9d,0x00,\n\t0x9d,0x9e,0x9e,0x00,0x9e,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,\n\t0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,\n\t0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,\n\t0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc7,0xc8,0x00,\n\t0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xd0,0xcf,0x00,0xd0,0xd1,0xd0,0x00,\n\t0xd1,0xd2,0xd1,0x00,0xd2,0xd3,0xd2,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,\n\t0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe5,0xe6,0xe6,0x00,0xe6,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xea,0xe9,0x00,0xea,0xeb,0xe9,0x00,\n\t0xeb,0xec,0xea,0x00,0xec,0xed,0xeb,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfb,0xfa,0x00,0xfb,0xfc,0xfb,0x00,\n\t0xfc,0xfd,0xfc,0x00,0xfd,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0e,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x11,0x00,\n\t0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x16,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x1f,0x00,\n\t0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2e,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,\n\t0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,\n\t0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x50,0x00,\n\t0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,0x57,0x56,0x58,0x00,\n\t0x58,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,0x5a,0x5a,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,\n\t0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,0x67,0x67,0x68,0x00,0x68,0x68,0x69,0x00,\n\t0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x79,0x79,0x79,0x00,0x7a,0x7a,0x7a,0x00,\n\t0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x86,0x87,0x00,0x86,0x87,0x88,0x00,0x87,0x88,0x89,0x00,0x88,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,\n\t0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x93,0x93,0x00,0x93,0x94,0x94,0x00,\n\t0x94,0x95,0x95,0x00,0x95,0x96,0x96,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9c,0x9c,0x00,0x9c,0x9d,0x9d,0x00,\n\t0x9d,0x9e,0x9e,0x00,0x9e,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,\n\t0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xad,0xad,0xad,0x00,0xae,0xae,0xae,0x00,\n\t0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,\n\t0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc3,0xc3,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc7,0xc8,0x00,\n\t0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xd0,0xcf,0x00,0xd0,0xd1,0xd0,0x00,\n\t0xd1,0xd2,0xd1,0x00,0xd2,0xd3,0xd2,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,\n\t0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe5,0x00,0xe5,0xe6,0xe6,0x00,0xe6,0xe7,0xe7,0x00,0xe7,0xe8,0xe8,0x00,0xe9,0xea,0xe9,0x00,0xea,0xeb,0xe9,0x00,\n\t0xeb,0xec,0xea,0x00,0xec,0xed,0xeb,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfb,0xfa,0x00,0xfb,0xfc,0xfb,0x00,\n\t0xfc,0xfd,0xfc,0x00,0xfd,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0e,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x11,0x00,\n\t0x12,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x13,0x12,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x16,0x16,0x18,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x1f,0x00,\n\t0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x22,0x00,0x23,0x23,0x23,0x00,0x24,0x24,0x24,0x00,0x25,0x25,0x26,0x00,0x27,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,\n\t0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x39,0x38,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,\n\t0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x50,0x00,\n\t0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,\n\t0x58,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5b,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,\n\t0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x68,0x69,0x00,\n\t0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,0x71,0x71,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x7a,0x7a,0x00,\n\t0x7b,0x7b,0x7b,0x00,0x7c,0x7c,0x7c,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x87,0x88,0x00,0x87,0x88,0x89,0x00,0x88,0x89,0x8a,0x00,0x89,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,\n\t0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x94,0x94,0x00,\n\t0x94,0x95,0x95,0x00,0x95,0x96,0x96,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9d,0x9d,0x00,\n\t0x9d,0x9e,0x9e,0x00,0x9e,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,\n\t0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xae,0xae,0xae,0x00,\n\t0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,\n\t0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc4,0xc4,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc7,0xc8,0x00,\n\t0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd1,0xd0,0x00,\n\t0xd1,0xd2,0xd1,0x00,0xd2,0xd3,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,\n\t0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe5,0xe6,0xe5,0x00,0xe6,0xe7,0xe7,0x00,0xe7,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xeb,0xe9,0x00,\n\t0xeb,0xec,0xea,0x00,0xec,0xed,0xeb,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfb,0x00,\n\t0xfc,0xfd,0xfc,0x00,0xfd,0xfe,0xfd,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x11,0x00,\n\t0x12,0x10,0x12,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x16,0x16,0x18,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1e,0x1f,0x00,\n\t0x1f,0x1f,0x20,0x00,0x20,0x20,0x21,0x00,0x21,0x21,0x22,0x00,0x22,0x22,0x23,0x00,0x23,0x23,0x24,0x00,0x24,0x24,0x25,0x00,0x25,0x25,0x26,0x00,0x26,0x26,0x27,0x00,\n\t0x28,0x27,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,\n\t0x2f,0x2e,0x30,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,\n\t0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,\n\t0x51,0x50,0x52,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,\n\t0x58,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5c,0x5d,0x00,0x5d,0x5d,0x5e,0x00,0x5e,0x5e,0x5f,0x00,0x5f,0x5f,0x60,0x00,\n\t0x60,0x60,0x61,0x00,0x61,0x61,0x62,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x67,0x69,0x00,\n\t0x69,0x69,0x6a,0x00,0x6a,0x6a,0x6b,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,\n\t0x72,0x72,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7a,0x00,\n\t0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x88,0x89,0x00,0x88,0x89,0x8a,0x00,0x89,0x8a,0x8b,0x00,0x8a,0x8b,0x8c,0x00,\n\t0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,\n\t0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,\n\t0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa1,0xa1,0xa1,0x00,0xa2,0xa2,0xa2,0x00,0xa3,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,\n\t0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,\n\t0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,\n\t0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc5,0xc5,0xc4,0x00,0xc6,0xc6,0xc5,0x00,0xc7,0xc7,0xc6,0x00,0xc8,0xc8,0xc7,0x00,\n\t0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,\n\t0xd1,0xd2,0xd1,0x00,0xd2,0xd3,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,\n\t0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,0xe2,0xe2,0xe1,0x00,\n\t0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xeb,0xec,0xea,0x00,0xec,0xed,0xeb,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,\n\t0xfc,0xfd,0xfc,0x00,0xfd,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x10,0x00,\n\t0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x16,0x16,0x18,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x24,0x26,0x00,0x26,0x25,0x27,0x00,\n\t0x27,0x26,0x28,0x00,0x28,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,0x3c,0x3b,0x3d,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,\n\t0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,0x45,0x44,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x50,0x00,0x50,0x4f,0x51,0x00,\n\t0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x56,0x56,0x57,0x00,\n\t0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,\n\t0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x67,0x69,0x00,\n\t0x69,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,\n\t0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x79,0x78,0x79,0x00,0x7a,0x79,0x7b,0x00,\n\t0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,\n\t0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x94,0x93,0x95,0x00,\n\t0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9c,0x00,0x9d,0x9c,0x9d,0x00,\n\t0x9e,0x9d,0x9e,0x00,0x9f,0x9e,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa0,0xa1,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa2,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,\n\t0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,\n\t0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,\n\t0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc7,0xc6,0x00,0xc7,0xc8,0xc7,0x00,\n\t0xc8,0xc9,0xc8,0x00,0xc9,0xca,0xc9,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,\n\t0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,\n\t0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,\n\t0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xee,0xed,0xed,0x00,0xef,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,\n\t0xfc,0xfd,0xfb,0x00,0xfd,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x10,0x00,\n\t0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x16,0x16,0x18,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x24,0x26,0x00,0x26,0x25,0x27,0x00,\n\t0x27,0x26,0x28,0x00,0x28,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,0x3c,0x3b,0x3d,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,\n\t0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,0x45,0x44,0x46,0x00,0x46,0x46,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4f,0x4e,0x50,0x00,0x50,0x4f,0x51,0x00,\n\t0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x56,0x56,0x57,0x00,\n\t0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,\n\t0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,0x67,0x66,0x68,0x00,0x68,0x67,0x69,0x00,\n\t0x69,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,\n\t0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x79,0x78,0x7a,0x00,0x7a,0x79,0x7b,0x00,\n\t0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,\n\t0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,\n\t0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9c,0x9b,0x9c,0x00,0x9d,0x9c,0x9d,0x00,\n\t0x9e,0x9d,0x9e,0x00,0x9f,0x9e,0x9f,0x00,0xa0,0xa0,0xa0,0x00,0xa0,0xa1,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa2,0xa3,0xa3,0x00,0xa4,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,\n\t0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,\n\t0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,\n\t0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc7,0xc6,0x00,0xc7,0xc8,0xc7,0x00,\n\t0xc8,0xc9,0xc8,0x00,0xc9,0xca,0xc9,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,\n\t0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd8,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,\n\t0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,\n\t0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xee,0xed,0xed,0x00,0xef,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfb,0xf9,0x00,0xfb,0xfc,0xfa,0x00,\n\t0xfc,0xfd,0xfb,0x00,0xfd,0xfe,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x10,0x00,\n\t0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x16,0x16,0x18,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x24,0x26,0x00,0x26,0x25,0x27,0x00,\n\t0x27,0x26,0x28,0x00,0x28,0x27,0x29,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,0x3c,0x3b,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x40,0x00,\n\t0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,0x45,0x44,0x46,0x00,0x46,0x45,0x47,0x00,0x47,0x47,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x50,0x4f,0x51,0x00,\n\t0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x57,0x00,\n\t0x57,0x57,0x58,0x00,0x58,0x58,0x59,0x00,0x59,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,\n\t0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,0x68,0x67,0x69,0x00,\n\t0x69,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,\n\t0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x79,0x78,0x7a,0x00,0x7a,0x79,0x7b,0x00,\n\t0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,\n\t0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x94,0x93,0x95,0x00,\n\t0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x97,0x00,0x98,0x98,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9d,0x9c,0x9d,0x00,\n\t0x9e,0x9d,0x9e,0x00,0x9f,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa1,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa2,0xa3,0xa3,0x00,0xa3,0xa4,0xa4,0x00,0xa5,0xa5,0xa5,0x00,\n\t0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,\n\t0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,\n\t0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbf,0xbf,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc8,0xc7,0x00,\n\t0xc8,0xc9,0xc8,0x00,0xc9,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,\n\t0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd9,0xd9,0xd8,0x00,\n\t0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,\n\t0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe6,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xef,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfc,0xfa,0x00,\n\t0xfc,0xfd,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x10,0x00,\n\t0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x16,0x16,0x18,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,\n\t0x28,0x26,0x28,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,0x3c,0x3b,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x44,0x43,0x45,0x00,0x45,0x44,0x46,0x00,0x46,0x45,0x47,0x00,0x47,0x46,0x48,0x00,\n\t0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,\n\t0x51,0x50,0x52,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5c,0x5e,0x00,0x5e,0x5d,0x5f,0x00,0x5f,0x5e,0x60,0x00,\n\t0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,\n\t0x69,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,\n\t0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x79,0x78,0x7a,0x00,0x7a,0x79,0x7b,0x00,\n\t0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,\n\t0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,\n\t0x95,0x94,0x96,0x00,0x96,0x95,0x96,0x00,0x97,0x96,0x97,0x00,0x98,0x97,0x98,0x00,0x99,0x99,0x99,0x00,0x9a,0x9a,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,\n\t0x9e,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa2,0xa2,0x00,0xa2,0xa3,0xa3,0x00,0xa3,0xa4,0xa4,0x00,0xa4,0xa5,0xa5,0x00,\n\t0xa6,0xa6,0xa6,0x00,0xa7,0xa7,0xa7,0x00,0xa8,0xa8,0xa8,0x00,0xa9,0xa9,0xa9,0x00,0xaa,0xaa,0xaa,0x00,0xab,0xab,0xab,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,\n\t0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,\n\t0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,\n\t0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc9,0xc8,0x00,0xc9,0xca,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,\n\t0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd8,0xd9,0xd8,0x00,\n\t0xda,0xda,0xd9,0x00,0xdb,0xdb,0xda,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,\n\t0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe5,0xe4,0x00,0xe7,0xe7,0xe5,0x00,0xe8,0xe8,0xe6,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,\n\t0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,\n\t0xfc,0xfd,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x10,0x00,\n\t0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x16,0x16,0x18,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x23,0x21,0x22,0x00,0x24,0x22,0x23,0x00,0x25,0x23,0x24,0x00,0x26,0x24,0x25,0x00,0x27,0x25,0x26,0x00,\n\t0x28,0x26,0x27,0x00,0x29,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,\n\t0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,\n\t0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x52,0x54,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,\n\t0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,\n\t0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,0x77,0x76,0x78,0x00,0x79,0x78,0x7a,0x00,0x7a,0x79,0x7b,0x00,\n\t0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7e,0x00,0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,\n\t0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,\n\t0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x9a,0x99,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,\n\t0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,\n\t0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa8,0xa7,0xa8,0x00,0xa9,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,\n\t0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb3,0xb4,0x00,0xb5,0xb4,0xb5,0x00,0xb6,0xb5,0xb6,0x00,\n\t0xb7,0xb6,0xb7,0x00,0xb8,0xb7,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,\n\t0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,\n\t0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd8,0xd9,0xd8,0x00,\n\t0xd9,0xda,0xd9,0x00,0xda,0xdb,0xda,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,\n\t0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe5,0xe4,0x00,0xe7,0xe6,0xe5,0x00,0xe8,0xe7,0xe6,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf2,0xf1,0x00,0xf2,0xf3,0xf2,0x00,\n\t0xf3,0xf4,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xf9,0x00,\n\t0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,0x11,0x0f,0x10,0x00,\n\t0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x12,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x16,0x16,0x18,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1d,0x1f,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x22,0x00,0x24,0x22,0x23,0x00,0x25,0x23,0x24,0x00,0x26,0x24,0x25,0x00,0x27,0x25,0x26,0x00,\n\t0x28,0x26,0x27,0x00,0x29,0x27,0x28,0x00,0x2a,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,\n\t0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,\n\t0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x62,0x62,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,\n\t0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,\n\t0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,0x77,0x76,0x78,0x00,0x79,0x78,0x7a,0x00,0x7a,0x79,0x7b,0x00,\n\t0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7e,0x00,0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,0x81,0x81,0x82,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,\n\t0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,\n\t0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9b,0x9b,0x9b,0x00,0x9c,0x9c,0x9c,0x00,\n\t0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,\n\t0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa8,0xa7,0xa8,0x00,0xa9,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,\n\t0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb3,0xb4,0x00,0xb5,0xb4,0xb5,0x00,0xb6,0xb5,0xb6,0x00,\n\t0xb7,0xb6,0xb7,0x00,0xb8,0xb7,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,\n\t0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xcb,0xcb,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,\n\t0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd8,0xd7,0x00,0xd8,0xd9,0xd8,0x00,\n\t0xd9,0xda,0xd9,0x00,0xda,0xdb,0xda,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,\n\t0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe5,0xe4,0xe4,0x00,0xe6,0xe5,0xe4,0x00,0xe7,0xe6,0xe5,0x00,0xe8,0xe7,0xe6,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf2,0xf1,0x00,0xf2,0xf3,0xf2,0x00,\n\t0xf3,0xf4,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xf9,0x00,\n\t0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,\n\t0x12,0x10,0x11,0x00,0x13,0x11,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x16,0x16,0x18,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1c,0x1f,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x22,0x00,0x24,0x22,0x23,0x00,0x25,0x23,0x24,0x00,0x26,0x24,0x25,0x00,0x27,0x25,0x26,0x00,\n\t0x28,0x26,0x27,0x00,0x29,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,\n\t0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,\n\t0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x51,0x52,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x58,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x63,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,\n\t0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x70,0x72,0x00,\n\t0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,0x77,0x76,0x78,0x00,0x78,0x78,0x79,0x00,0x7a,0x79,0x7b,0x00,\n\t0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7d,0x00,0x7e,0x7d,0x7e,0x00,0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x82,0x00,0x82,0x82,0x83,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,\n\t0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,\n\t0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9c,0x9c,0x9c,0x00,\n\t0x9d,0x9d,0x9d,0x00,0x9e,0x9e,0x9e,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,\n\t0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa8,0xa7,0xa8,0x00,0xa9,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xae,0x00,\n\t0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb3,0xb4,0x00,0xb5,0xb4,0xb5,0x00,0xb6,0xb5,0xb6,0x00,\n\t0xb7,0xb6,0xb7,0x00,0xb8,0xb7,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbf,0x00,\n\t0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc2,0xc1,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcc,0xcc,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xd0,0x00,\n\t0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd9,0xd8,0x00,\n\t0xd9,0xda,0xd9,0x00,0xda,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,\n\t0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe4,0x00,0xe7,0xe6,0xe5,0x00,0xe8,0xe7,0xe6,0x00,0xe9,0xe8,0xe8,0x00,0xea,0xea,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf3,0xf2,0x00,\n\t0xf3,0xf4,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf5,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,\n\t0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0e,0x00,0x11,0x0e,0x0f,0x00,0x11,0x0f,0x10,0x00,\n\t0x12,0x10,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x16,0x16,0x18,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1b,0x1e,0x00,0x1d,0x1c,0x1f,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x22,0x00,0x24,0x22,0x23,0x00,0x25,0x23,0x24,0x00,0x26,0x24,0x25,0x00,0x27,0x25,0x26,0x00,\n\t0x28,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,\n\t0x2f,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,\n\t0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,\n\t0x50,0x50,0x51,0x00,0x50,0x51,0x52,0x00,0x51,0x52,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x56,0x57,0x00,\n\t0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x64,0x65,0x00,0x65,0x65,0x66,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,\n\t0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,\n\t0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x76,0x75,0x77,0x00,0x77,0x76,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,\n\t0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7c,0x00,0x7d,0x7c,0x7d,0x00,0x7e,0x7d,0x7e,0x00,0x7f,0x7e,0x7f,0x00,0x80,0x7f,0x80,0x00,0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,\n\t0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,\n\t0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,\n\t0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,\n\t0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,\n\t0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa8,0xa7,0xa8,0x00,0xa9,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,\n\t0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb3,0xb4,0x00,0xb5,0xb4,0xb5,0x00,0xb6,0xb5,0xb6,0x00,\n\t0xb7,0xb6,0xb7,0x00,0xb8,0xb7,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc2,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcd,0xcd,0xcc,0x00,0xce,0xce,0xcd,0x00,0xcf,0xcf,0xce,0x00,0xd0,0xd0,0xcf,0x00,\n\t0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,\n\t0xd9,0xda,0xd9,0x00,0xda,0xdb,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,\n\t0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,\n\t0xeb,0xeb,0xea,0x00,0xec,0xec,0xeb,0x00,0xed,0xed,0xec,0x00,0xee,0xee,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf4,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf5,0xf6,0xf5,0x00,0xf6,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,\n\t0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0e,0x00,0x11,0x0e,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x16,0x16,0x18,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1e,0x00,0x1d,0x1c,0x1f,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x22,0x00,0x24,0x22,0x23,0x00,0x25,0x23,0x24,0x00,0x26,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,\n\t0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4e,0x4f,0x50,0x00,\n\t0x4f,0x50,0x51,0x00,0x50,0x51,0x52,0x00,0x51,0x52,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x55,0x57,0x00,\n\t0x57,0x56,0x58,0x00,0x58,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,\n\t0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,\n\t0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x77,0x76,0x78,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,\n\t0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,\n\t0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x89,0x8a,0x00,\n\t0x8b,0x8a,0x8b,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x92,0x93,0x00,0x92,0x93,0x94,0x00,\n\t0x93,0x94,0x95,0x00,0x94,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9d,0x00,\n\t0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa0,0xa1,0x00,0xa2,0xa1,0xa2,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,\n\t0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa8,0xa7,0xa8,0x00,0xa9,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,\n\t0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,\n\t0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc2,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,0xc5,0xc4,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xcf,0xce,0x00,0xcf,0xd0,0xcf,0x00,\n\t0xd0,0xd1,0xd0,0x00,0xd1,0xd2,0xd1,0x00,0xd2,0xd3,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,0xd5,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,\n\t0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,\n\t0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,\n\t0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xed,0xec,0x00,0xed,0xee,0xed,0x00,0xee,0xef,0xee,0x00,0xef,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,\n\t0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0e,0x00,0x11,0x0e,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x16,0x16,0x18,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1e,0x00,0x1d,0x1c,0x1f,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x22,0x00,0x24,0x22,0x23,0x00,0x25,0x23,0x24,0x00,0x26,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x34,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,\n\t0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4e,0x4f,0x50,0x00,\n\t0x4f,0x50,0x51,0x00,0x50,0x51,0x52,0x00,0x51,0x52,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x55,0x57,0x00,\n\t0x57,0x56,0x58,0x00,0x58,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,\n\t0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,\n\t0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,\n\t0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,\n\t0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,0x8a,0x89,0x8a,0x00,\n\t0x8b,0x8a,0x8b,0x00,0x8c,0x8b,0x8c,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x92,0x93,0x00,0x92,0x93,0x94,0x00,\n\t0x93,0x94,0x95,0x00,0x94,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,\n\t0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa0,0xa1,0x00,0xa2,0xa1,0xa2,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,\n\t0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa8,0xa7,0xa8,0x00,0xa9,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,0xac,0xac,0xac,0x00,0xad,0xad,0xad,0x00,\n\t0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,\n\t0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb9,0xb9,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc2,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,0xc5,0xc4,0xc5,0x00,0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xcf,0xce,0x00,0xcf,0xd0,0xcf,0x00,\n\t0xd0,0xd1,0xd0,0x00,0xd1,0xd2,0xd1,0x00,0xd2,0xd3,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,0xd5,0xd5,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,\n\t0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdc,0xdc,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,\n\t0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe4,0x00,0xe4,0xe5,0xe5,0x00,0xe5,0xe6,0xe6,0x00,0xe6,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,\n\t0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xed,0xec,0x00,0xed,0xee,0xed,0x00,0xee,0xef,0xee,0x00,0xef,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xfa,0xfa,0xf8,0x00,0xfb,0xfb,0xf9,0x00,\n\t0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0e,0x00,0x11,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x16,0x16,0x18,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1e,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x21,0x00,0x23,0x21,0x22,0x00,0x24,0x22,0x23,0x00,0x25,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,0x35,0x35,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3e,0x00,0x3e,0x3e,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,\n\t0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,0x4e,0x4d,0x4f,0x00,0x4e,0x4f,0x50,0x00,\n\t0x4f,0x50,0x51,0x00,0x50,0x51,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x55,0x57,0x00,\n\t0x57,0x56,0x58,0x00,0x58,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x65,0x68,0x00,0x67,0x67,0x69,0x00,\n\t0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,\n\t0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x78,0x77,0x79,0x00,0x79,0x79,0x7a,0x00,\n\t0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x83,0x00,\n\t0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x88,0x8a,0x00,0x8a,0x89,0x8a,0x00,\n\t0x8b,0x8a,0x8b,0x00,0x8c,0x8b,0x8c,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x93,0x00,0x92,0x93,0x94,0x00,\n\t0x93,0x94,0x95,0x00,0x94,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,\n\t0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa0,0xa1,0x00,0xa2,0xa1,0xa2,0x00,0xa3,0xa2,0xa3,0x00,0xa4,0xa4,0xa5,0x00,\n\t0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa9,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,0xac,0xab,0xac,0x00,0xad,0xad,0xad,0x00,\n\t0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,\n\t0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,0xc5,0xc4,0xc5,0x00,0xc6,0xc5,0xc6,0x00,0xc7,0xc7,0xc7,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xd0,0xcf,0x00,\n\t0xd0,0xd1,0xd0,0x00,0xd1,0xd2,0xd1,0x00,0xd2,0xd3,0xd2,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,0xd5,0xd5,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,\n\t0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdd,0xdd,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,\n\t0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe4,0x00,0xe4,0xe5,0xe5,0x00,0xe5,0xe6,0xe6,0x00,0xe6,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,\n\t0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xee,0xed,0x00,0xee,0xef,0xee,0x00,0xef,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfb,0xfb,0xf9,0x00,\n\t0xfc,0xfc,0xfa,0x00,0xfd,0xfd,0xfb,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x11,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x16,0x16,0x18,0x00,\n\t0x17,0x17,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x24,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,0x35,0x34,0x36,0x00,\n\t0x36,0x36,0x37,0x00,0x37,0x37,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3f,0x3f,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x45,0x00,0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,\n\t0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,0x4e,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,\n\t0x4f,0x50,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x56,0x55,0x57,0x00,\n\t0x57,0x56,0x58,0x00,0x58,0x57,0x59,0x00,0x59,0x58,0x5a,0x00,0x5a,0x59,0x5b,0x00,0x5b,0x5a,0x5c,0x00,0x5c,0x5b,0x5d,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x64,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,\n\t0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,\n\t0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x78,0x77,0x79,0x00,0x79,0x78,0x7a,0x00,\n\t0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,0x8a,0x89,0x8a,0x00,\n\t0x8b,0x8a,0x8b,0x00,0x8c,0x8b,0x8c,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x93,0x00,0x92,0x92,0x94,0x00,\n\t0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,\n\t0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa0,0xa1,0x00,0xa2,0xa1,0xa2,0x00,0xa3,0xa2,0xa3,0x00,0xa4,0xa3,0xa4,0x00,\n\t0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,0xac,0xab,0xac,0x00,0xad,0xac,0xad,0x00,\n\t0xae,0xae,0xae,0x00,0xaf,0xaf,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,\n\t0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc4,0xc3,0xc4,0x00,0xc5,0xc4,0xc5,0x00,0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,\n\t0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,\n\t0xd0,0xd1,0xd0,0x00,0xd1,0xd2,0xd1,0x00,0xd2,0xd3,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd5,0x00,0xd5,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,\n\t0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xde,0xde,0xdd,0x00,0xdf,0xdf,0xde,0x00,0xe0,0xe0,0xdf,0x00,0xe1,0xe1,0xe0,0x00,\n\t0xe2,0xe2,0xe1,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,\n\t0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xef,0xee,0x00,0xef,0xf0,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfc,0xfc,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0b,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x11,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x16,0x15,0x17,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,\n\t0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,0x35,0x34,0x36,0x00,\n\t0x36,0x35,0x37,0x00,0x37,0x36,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,\n\t0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,0x4e,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,\n\t0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,\n\t0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,\n\t0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x78,0x77,0x79,0x00,0x79,0x78,0x7a,0x00,\n\t0x7a,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,0x89,0x89,0x8a,0x00,\n\t0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x93,0x00,0x93,0x92,0x94,0x00,\n\t0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,\n\t0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa0,0xa1,0x00,0xa2,0xa1,0xa2,0x00,0xa3,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa6,0xa5,0xa6,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,\n\t0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,\n\t0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd3,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,\n\t0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,\n\t0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,\n\t0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xfa,0x00,\n\t0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0b,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x11,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,0x16,0x15,0x17,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1e,0x00,\n\t0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,0x35,0x34,0x36,0x00,\n\t0x36,0x35,0x37,0x00,0x37,0x36,0x38,0x00,0x38,0x38,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,\n\t0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,0x4e,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,\n\t0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x55,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,\n\t0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,\n\t0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x73,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x78,0x77,0x79,0x00,0x79,0x78,0x7a,0x00,\n\t0x7a,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,0x89,0x89,0x8a,0x00,\n\t0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,\n\t0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,\n\t0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa0,0xa1,0x00,0xa2,0xa1,0xa2,0x00,0xa3,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xb0,0xb0,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,\n\t0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,\n\t0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd3,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,\n\t0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,\n\t0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,\n\t0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,\n\t0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0a,0x0a,0x0a,0x00,0x0f,0x0b,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1e,0x00,\n\t0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,0x35,0x34,0x36,0x00,\n\t0x36,0x35,0x37,0x00,0x37,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x39,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x48,0x00,\n\t0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,0x4e,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,\n\t0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x54,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5d,0x5c,0x5f,0x00,0x5e,0x5e,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x66,0x65,0x67,0x00,0x67,0x66,0x69,0x00,\n\t0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,\n\t0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x74,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x79,0x78,0x7a,0x00,\n\t0x7a,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,0x89,0x89,0x8a,0x00,\n\t0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8e,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x93,0x92,0x94,0x00,\n\t0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,0x9b,0x9b,0x9d,0x00,\n\t0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9f,0x00,0x9e,0x9e,0x9f,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa0,0xa1,0x00,0xa2,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb1,0xb1,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb6,0x00,\n\t0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbd,0xbc,0xbd,0x00,0xbe,0xbe,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,\n\t0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd4,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd8,0xd8,0xd8,0x00,\n\t0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,\n\t0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe4,0xe3,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,\n\t0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf2,0xf2,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xfa,0x00,\n\t0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0f,0x0b,0x0d,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x14,0x13,0x15,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1e,0x00,\n\t0x1f,0x1e,0x1f,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,0x26,0x25,0x26,0x00,\n\t0x27,0x26,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,0x35,0x34,0x36,0x00,\n\t0x36,0x35,0x37,0x00,0x37,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x3a,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,0x4e,0x4d,0x4f,0x00,0x4f,0x4e,0x50,0x00,\n\t0x50,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x55,0x55,0x57,0x00,\n\t0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,\n\t0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x66,0x65,0x67,0x00,0x67,0x66,0x68,0x00,\n\t0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,\n\t0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x75,0x76,0x00,0x76,0x76,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,\n\t0x7a,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,\n\t0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8f,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,\n\t0x94,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,\n\t0x9c,0x9c,0x9e,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa1,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,\n\t0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbd,0xbc,0xbd,0x00,0xbe,0xbd,0xbe,0x00,\n\t0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,\n\t0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd5,0xd4,0x00,0xd5,0xd6,0xd5,0x00,0xd6,0xd7,0xd6,0x00,0xd7,0xd8,0xd7,0x00,\n\t0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,\n\t0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe4,0xe3,0x00,0xe4,0xe5,0xe4,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,\n\t0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,\n\t0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0e,0x0b,0x0c,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4e,0x4d,0x4f,0x00,0x4f,0x4e,0x50,0x00,\n\t0x50,0x4f,0x51,0x00,0x51,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x55,0x55,0x56,0x00,\n\t0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,\n\t0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x66,0x65,0x67,0x00,0x67,0x66,0x68,0x00,\n\t0x68,0x67,0x69,0x00,0x69,0x68,0x6a,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,\n\t0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x76,0x75,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,\n\t0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,\n\t0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,\n\t0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,\n\t0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,\n\t0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbd,0xbc,0xbd,0x00,0xbe,0xbd,0xbe,0x00,\n\t0xbf,0xbe,0xbf,0x00,0xc0,0xbf,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcc,0xcc,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,\n\t0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,\n\t0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,\n\t0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe4,0xe3,0x00,0xe4,0xe5,0xe4,0x00,0xe5,0xe6,0xe5,0x00,0xe6,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,\n\t0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,\n\t0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0e,0x0b,0x0c,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x15,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4e,0x4d,0x4f,0x00,0x4f,0x4e,0x50,0x00,\n\t0x50,0x4f,0x51,0x00,0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x55,0x55,0x56,0x00,\n\t0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,\n\t0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x66,0x65,0x67,0x00,0x67,0x66,0x68,0x00,\n\t0x68,0x67,0x69,0x00,0x69,0x68,0x6a,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,\n\t0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,\n\t0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x80,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,\n\t0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,\n\t0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,\n\t0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb4,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,\n\t0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbd,0xbc,0xbd,0x00,0xbe,0xbd,0xbe,0x00,\n\t0xbf,0xbe,0xbf,0x00,0xc0,0xbf,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcc,0xcc,0xcd,0x00,0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,\n\t0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,\n\t0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,\n\t0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe4,0xe3,0x00,0xe4,0xe5,0xe4,0x00,0xe5,0xe6,0xe5,0x00,0xe6,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,\n\t0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,\n\t0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0e,0x0b,0x0c,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x14,0x15,0x00,0x16,0x14,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1f,0x20,0x00,0x20,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x36,0x00,\n\t0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4f,0x4e,0x50,0x00,\n\t0x50,0x4f,0x51,0x00,0x51,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x56,0x00,\n\t0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5e,0x5d,0x60,0x00,\n\t0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,0x67,0x66,0x68,0x00,\n\t0x68,0x67,0x69,0x00,0x69,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,\n\t0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,\n\t0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,0x81,0x81,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x8a,0x89,0x8b,0x00,\n\t0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,\n\t0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,0x99,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,\n\t0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa7,0xa6,0xa7,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,0xab,0xaa,0xac,0x00,0xac,0xac,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb4,0xb4,0x00,0xb5,0xb5,0xb5,0x00,\n\t0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,0xbe,0xbd,0xbe,0x00,\n\t0xbf,0xbe,0xbf,0x00,0xc0,0xbf,0xc0,0x00,0xc1,0xc0,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcc,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,0xcf,0xcf,0xcf,0x00,\n\t0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,\n\t0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,\n\t0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe5,0xe4,0x00,0xe5,0xe6,0xe5,0x00,0xe6,0xe7,0xe6,0x00,0xe7,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,\n\t0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,\n\t0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0e,0x0b,0x0c,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x13,0x00,0x14,0x13,0x14,0x00,0x15,0x13,0x15,0x00,0x16,0x14,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1d,0x1d,0x1e,0x00,\n\t0x1e,0x1e,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,\n\t0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,\n\t0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,\n\t0x50,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x55,0x56,0x00,\n\t0x56,0x56,0x57,0x00,0x57,0x57,0x58,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,\n\t0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,\n\t0x68,0x67,0x69,0x00,0x69,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,\n\t0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x79,0x00,\n\t0x7a,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,\n\t0x82,0x82,0x83,0x00,0x83,0x83,0x84,0x00,0x84,0x84,0x85,0x00,0x85,0x85,0x86,0x00,0x86,0x86,0x87,0x00,0x87,0x87,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,\n\t0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,\n\t0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,\n\t0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa7,0xa6,0xa7,0x00,0xa8,0xa7,0xa8,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,0xab,0xaa,0xac,0x00,0xac,0xab,0xad,0x00,\n\t0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb4,0xb4,0x00,0xb4,0xb5,0xb5,0x00,\n\t0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb7,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,\n\t0xbf,0xbe,0xbf,0x00,0xc0,0xbf,0xc0,0x00,0xc1,0xc0,0xc1,0x00,0xc2,0xc1,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcc,0x00,0xcc,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,0xcf,0xce,0xcf,0x00,\n\t0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,\n\t0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,\n\t0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe6,0xe5,0x00,0xe6,0xe7,0xe6,0x00,0xe7,0xe8,0xe7,0x00,0xe8,0xe9,0xe8,0x00,\n\t0xea,0xea,0xe9,0x00,0xeb,0xeb,0xea,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,\n\t0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xf9,0x00,\n\t0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0e,0x0b,0x0c,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x16,0x14,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,\n\t0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,\n\t0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,\n\t0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x54,0x56,0x00,\n\t0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,\n\t0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x65,0x00,0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,\n\t0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,\n\t0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,0x77,0x77,0x78,0x00,0x78,0x78,0x7a,0x00,\n\t0x7a,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7c,0x7c,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,\n\t0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,\n\t0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,\n\t0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,\n\t0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa7,0xa6,0xa7,0x00,0xa8,0xa7,0xa8,0x00,0xa9,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xac,0x00,0xac,0xab,0xad,0x00,\n\t0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb4,0xb4,0x00,0xb4,0xb5,0xb5,0x00,\n\t0xb5,0xb6,0xb6,0x00,0xb6,0xb7,0xb7,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,\n\t0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xce,0xcd,0xcd,0x00,0xcf,0xce,0xce,0x00,\n\t0xd0,0xcf,0xcf,0x00,0xd1,0xd0,0xd0,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,\n\t0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,\n\t0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,\n\t0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xec,0xec,0x00,0xec,0xed,0xed,0x00,0xed,0xee,0xee,0x00,0xee,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf0,0x00,\n\t0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf9,0xf8,0x00,0xf9,0xfa,0xf9,0x00,\n\t0xfa,0xfb,0xfa,0x00,0xfb,0xfc,0xfb,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0e,0x0b,0x0c,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x16,0x14,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,\n\t0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,\n\t0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x45,0x45,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,\n\t0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,0x55,0x54,0x56,0x00,\n\t0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,\n\t0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x65,0x00,0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,\n\t0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x6a,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6e,0x6f,0x00,0x6f,0x6f,0x70,0x00,\n\t0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x76,0x75,0x77,0x00,0x77,0x77,0x79,0x00,0x79,0x78,0x7a,0x00,\n\t0x7a,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7c,0x7c,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,\n\t0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x88,0x89,0x00,0x89,0x89,0x8a,0x00,\n\t0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x91,0x92,0x00,0x92,0x92,0x93,0x00,\n\t0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,\n\t0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa7,0xa6,0xa7,0x00,0xa8,0xa7,0xa8,0x00,0xa9,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xac,0x00,0xac,0xab,0xad,0x00,\n\t0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb4,0xb4,0x00,0xb4,0xb5,0xb5,0x00,\n\t0xb5,0xb6,0xb6,0x00,0xb6,0xb7,0xb7,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,\n\t0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc5,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xce,0xcd,0xcd,0x00,0xcf,0xce,0xce,0x00,\n\t0xd0,0xcf,0xcf,0x00,0xd1,0xd0,0xd0,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,\n\t0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,\n\t0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,\n\t0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xec,0xec,0x00,0xec,0xed,0xed,0x00,0xed,0xee,0xee,0x00,0xee,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf0,0x00,\n\t0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf9,0xf8,0x00,0xf9,0xfa,0xf9,0x00,\n\t0xfa,0xfb,0xfa,0x00,0xfb,0xfc,0xfb,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0e,0x0b,0x0c,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x16,0x14,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x26,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,\n\t0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,\n\t0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3d,0x3d,0x3f,0x00,\n\t0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,0x46,0x46,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x50,0x00,\n\t0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x55,0x00,0x55,0x54,0x56,0x00,\n\t0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,0x5d,0x5d,0x5f,0x00,\n\t0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x65,0x00,0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,\n\t0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6b,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6f,0x70,0x00,\n\t0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,0x77,0x76,0x78,0x00,0x78,0x78,0x79,0x00,\n\t0x7a,0x79,0x7b,0x00,0x7a,0x7a,0x7c,0x00,0x7b,0x7b,0x7d,0x00,0x7c,0x7c,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,0x7f,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,\n\t0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,0x89,0x89,0x8a,0x00,\n\t0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,0x92,0x92,0x93,0x00,\n\t0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,\n\t0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9e,0x9d,0x9e,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa8,0xa7,0xa8,0x00,0xa9,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,0xac,0xab,0xad,0x00,\n\t0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb5,0xb5,0x00,\n\t0xb5,0xb6,0xb6,0x00,0xb6,0xb7,0xb7,0x00,0xb7,0xb8,0xb8,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,\n\t0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc5,0xc5,0x00,0xc6,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xcf,0xce,0xce,0x00,\n\t0xd0,0xcf,0xcf,0x00,0xd1,0xd0,0xd0,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,\n\t0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,\n\t0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,\n\t0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xed,0xed,0x00,0xed,0xee,0xee,0x00,0xee,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf0,0x00,\n\t0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xfa,0xf9,0x00,\n\t0xfa,0xfb,0xfa,0x00,0xfb,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0e,0x0b,0x0c,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x16,0x14,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x24,0x26,0x00,\n\t0x27,0x25,0x27,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,\n\t0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x32,0x00,0x32,0x32,0x33,0x00,0x33,0x33,0x34,0x00,0x34,0x34,0x35,0x00,\n\t0x35,0x35,0x36,0x00,0x36,0x36,0x37,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3c,0x3c,0x3e,0x00,\n\t0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,0x45,0x45,0x47,0x00,\n\t0x47,0x47,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,\n\t0x4f,0x4f,0x51,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x55,0x54,0x56,0x00,\n\t0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,\n\t0x5e,0x5e,0x60,0x00,0x5f,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x65,0x00,0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,\n\t0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6c,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,\n\t0x70,0x70,0x71,0x00,0x71,0x71,0x72,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,0x77,0x76,0x78,0x00,0x78,0x77,0x79,0x00,\n\t0x79,0x79,0x7a,0x00,0x7a,0x7a,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,0x7f,0x7f,0x81,0x00,0x80,0x80,0x82,0x00,\n\t0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,\n\t0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8c,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,\n\t0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,\n\t0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9e,0x9d,0x9e,0x00,0x9f,0x9e,0x9f,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa9,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,0xac,0xab,0xac,0x00,\n\t0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,\n\t0xb5,0xb6,0xb6,0x00,0xb6,0xb7,0xb7,0x00,0xb7,0xb8,0xb8,0x00,0xb8,0xb9,0xb9,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,\n\t0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc5,0xc5,0x00,0xc5,0xc6,0xc6,0x00,\n\t0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,\n\t0xd0,0xcf,0xcf,0x00,0xd1,0xd0,0xd0,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,0xd7,0xd7,0xd7,0x00,\n\t0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xdb,0x00,0xdb,0xdb,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,\n\t0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,\n\t0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xee,0xee,0x00,0xee,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,\n\t0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,\n\t0xfa,0xfb,0xfa,0x00,0xfb,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0e,0x0b,0x0c,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x16,0x14,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2b,0x2d,0x00,\n\t0x2e,0x2c,0x2e,0x00,0x2f,0x2d,0x2f,0x00,0x30,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,\n\t0x35,0x34,0x36,0x00,0x36,0x35,0x37,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3c,0x3c,0x3e,0x00,\n\t0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,0x45,0x45,0x47,0x00,\n\t0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,\n\t0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,\n\t0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x65,0x00,0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,\n\t0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,\n\t0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,0x76,0x76,0x78,0x00,0x77,0x77,0x79,0x00,\n\t0x79,0x78,0x7a,0x00,0x7a,0x79,0x7b,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x81,0x00,0x80,0x80,0x82,0x00,\n\t0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,\n\t0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,0x90,0x90,0x92,0x00,0x91,0x91,0x92,0x00,\n\t0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,\n\t0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9e,0x9d,0x9e,0x00,0x9f,0x9e,0x9f,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa0,0xa1,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xaf,0xae,0xaf,0x00,0xb0,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb2,0xb2,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,\n\t0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb8,0xb8,0x00,0xb8,0xb9,0xb9,0x00,0xb9,0xba,0xba,0x00,0xba,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,\n\t0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc5,0xc5,0x00,0xc5,0xc6,0xc6,0x00,\n\t0xc6,0xc7,0xc7,0x00,0xc7,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,\n\t0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,0xd5,0xd5,0xd6,0x00,0xd6,0xd6,0xd7,0x00,\n\t0xd7,0xd7,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xdb,0x00,0xdb,0xdb,0xdc,0x00,0xdc,0xdc,0xdd,0x00,0xdd,0xdd,0xde,0x00,0xde,0xde,0xdf,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,\n\t0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,\n\t0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0e,0x0b,0x0c,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x16,0x14,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1c,0x1e,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,0x2d,0x2b,0x2d,0x00,\n\t0x2e,0x2c,0x2e,0x00,0x2f,0x2d,0x2f,0x00,0x30,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,\n\t0x35,0x34,0x36,0x00,0x36,0x35,0x37,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3c,0x3c,0x3e,0x00,\n\t0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,0x45,0x45,0x47,0x00,\n\t0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,\n\t0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x51,0x51,0x52,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,\n\t0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x65,0x00,0x65,0x65,0x67,0x00,0x66,0x66,0x68,0x00,\n\t0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,\n\t0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,0x76,0x76,0x78,0x00,0x77,0x77,0x78,0x00,\n\t0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7b,0x7b,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x81,0x00,0x80,0x80,0x82,0x00,\n\t0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,\n\t0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,0x90,0x90,0x92,0x00,0x91,0x91,0x92,0x00,\n\t0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,\n\t0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9e,0x9d,0x9e,0x00,0x9f,0x9e,0x9f,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa0,0xa1,0x00,0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xaf,0xae,0xaf,0x00,0xb0,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,\n\t0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb8,0xb8,0x00,0xb8,0xb9,0xb9,0x00,0xb9,0xba,0xba,0x00,0xba,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,\n\t0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc5,0xc5,0x00,0xc5,0xc6,0xc6,0x00,\n\t0xc6,0xc7,0xc7,0x00,0xc7,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,\n\t0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,0xd5,0xd5,0xd6,0x00,0xd6,0xd6,0xd7,0x00,\n\t0xd7,0xd7,0xd8,0x00,0xd8,0xd8,0xd9,0x00,0xda,0xda,0xdb,0x00,0xdb,0xdb,0xdc,0x00,0xdc,0xdc,0xdd,0x00,0xdd,0xdd,0xde,0x00,0xde,0xde,0xdf,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,\n\t0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,\n\t0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0e,0x0b,0x0c,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1b,0x1e,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,\n\t0x2e,0x2c,0x2e,0x00,0x2f,0x2d,0x2f,0x00,0x30,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,\n\t0x35,0x34,0x36,0x00,0x36,0x35,0x37,0x00,0x37,0x36,0x38,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3c,0x3c,0x3e,0x00,\n\t0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,0x45,0x45,0x47,0x00,\n\t0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,\n\t0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x50,0x51,0x52,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,\n\t0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x66,0x68,0x00,\n\t0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6f,0x6e,0x70,0x00,\n\t0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,0x76,0x76,0x78,0x00,0x77,0x77,0x78,0x00,\n\t0x78,0x78,0x79,0x00,0x79,0x79,0x7a,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7c,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x82,0x00,\n\t0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,\n\t0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,0x90,0x90,0x92,0x00,0x91,0x91,0x92,0x00,\n\t0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,\n\t0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9f,0x9e,0x9f,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa0,0xa1,0x00,0xa2,0xa1,0xa3,0x00,0xa3,0xa3,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xb0,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb5,0x00,\n\t0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb9,0xb9,0x00,0xb9,0xba,0xba,0x00,0xba,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,\n\t0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc5,0x00,0xc5,0xc6,0xc6,0x00,\n\t0xc6,0xc7,0xc7,0x00,0xc7,0xc8,0xc8,0x00,0xc8,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,\n\t0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,0xd5,0xd5,0xd6,0x00,0xd6,0xd6,0xd7,0x00,\n\t0xd7,0xd7,0xd8,0x00,0xd8,0xd8,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdc,0x00,0xdc,0xdc,0xdd,0x00,0xdd,0xdd,0xde,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,\n\t0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf1,0xf1,0x00,\n\t0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0e,0x0b,0x0c,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x17,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1e,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x28,0x29,0x00,0x2a,0x29,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,\n\t0x2e,0x2c,0x2e,0x00,0x2f,0x2d,0x2f,0x00,0x30,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,\n\t0x35,0x34,0x36,0x00,0x36,0x35,0x37,0x00,0x37,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,0x3c,0x3c,0x3e,0x00,\n\t0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,0x45,0x45,0x47,0x00,\n\t0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,\n\t0x4f,0x4f,0x50,0x00,0x4f,0x50,0x51,0x00,0x50,0x51,0x52,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,\n\t0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x65,0x67,0x00,\n\t0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,\n\t0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,0x76,0x76,0x78,0x00,0x77,0x77,0x79,0x00,\n\t0x78,0x78,0x7a,0x00,0x79,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7d,0x7e,0x00,0x7e,0x7e,0x7f,0x00,0x7f,0x7f,0x80,0x00,0x80,0x80,0x81,0x00,\n\t0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,\n\t0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,0x90,0x90,0x92,0x00,0x91,0x91,0x93,0x00,\n\t0x92,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,\n\t0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa0,0xa1,0x00,0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,\n\t0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb1,0xb0,0xb1,0x00,0xb2,0xb1,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,\n\t0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xba,0xba,0xba,0x00,0xbb,0xbb,0xbb,0x00,0xbc,0xbc,0xbc,0x00,0xbd,0xbd,0xbd,0x00,\n\t0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,\n\t0xc6,0xc7,0xc7,0x00,0xc7,0xc8,0xc8,0x00,0xc8,0xc9,0xc9,0x00,0xc9,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcc,0x00,0xcd,0xcd,0xcd,0x00,0xce,0xce,0xce,0x00,\n\t0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,0xd5,0xd5,0xd6,0x00,0xd6,0xd6,0xd7,0x00,\n\t0xd8,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdd,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe3,0xe2,0x00,0xe3,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,\n\t0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,\n\t0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0e,0x0b,0x0c,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1e,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,\n\t0x2e,0x2c,0x2e,0x00,0x2f,0x2d,0x2f,0x00,0x30,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,\n\t0x35,0x34,0x36,0x00,0x36,0x35,0x37,0x00,0x37,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3b,0x3d,0x00,0x3c,0x3c,0x3e,0x00,\n\t0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x46,0x00,0x45,0x45,0x47,0x00,\n\t0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4d,0x4e,0x4f,0x00,\n\t0x4e,0x4f,0x50,0x00,0x4f,0x50,0x51,0x00,0x50,0x51,0x52,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,\n\t0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x65,0x67,0x00,\n\t0x67,0x66,0x68,0x00,0x68,0x67,0x69,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,\n\t0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x76,0x78,0x00,0x77,0x77,0x79,0x00,\n\t0x78,0x78,0x7a,0x00,0x79,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,0x88,0x87,0x89,0x00,0x89,0x88,0x89,0x00,\n\t0x8a,0x89,0x8a,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,0x90,0x90,0x92,0x00,0x91,0x91,0x93,0x00,\n\t0x92,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,\n\t0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,\n\t0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,\n\t0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb8,0x00,0xb9,0xb8,0xb9,0x00,0xba,0xb9,0xba,0x00,0xbb,0xba,0xbb,0x00,0xbc,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,\n\t0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd7,0xd6,0xd6,0x00,\n\t0xd8,0xd7,0xd7,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe3,0xe2,0x00,0xe3,0xe4,0xe3,0x00,0xe4,0xe5,0xe4,0x00,0xe5,0xe6,0xe5,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,\n\t0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,\n\t0xf2,0xf1,0xf1,0x00,0xf3,0xf2,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf5,0xf6,0xf5,0x00,0xf6,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0e,0x0b,0x0c,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0f,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1e,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,\n\t0x2e,0x2c,0x2e,0x00,0x2f,0x2d,0x2f,0x00,0x30,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,\n\t0x35,0x34,0x36,0x00,0x36,0x35,0x37,0x00,0x37,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3b,0x3d,0x00,0x3c,0x3c,0x3e,0x00,\n\t0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x40,0x40,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x46,0x00,0x45,0x45,0x47,0x00,\n\t0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4d,0x4e,0x00,0x4d,0x4e,0x4f,0x00,\n\t0x4e,0x4f,0x50,0x00,0x4f,0x50,0x51,0x00,0x50,0x51,0x52,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x54,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,\n\t0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x65,0x64,0x66,0x00,0x66,0x65,0x67,0x00,\n\t0x67,0x66,0x68,0x00,0x68,0x67,0x69,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,\n\t0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x76,0x78,0x00,0x77,0x77,0x79,0x00,\n\t0x78,0x78,0x7a,0x00,0x79,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,0x88,0x87,0x89,0x00,0x89,0x88,0x89,0x00,\n\t0x8a,0x89,0x8a,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8c,0x8d,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,0x90,0x90,0x92,0x00,0x91,0x91,0x93,0x00,\n\t0x92,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x99,0x99,0x9a,0x00,0x9a,0x9a,0x9b,0x00,\n\t0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,\n\t0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb3,0xb3,0xb3,0x00,0xb4,0xb4,0xb4,0x00,\n\t0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb8,0xb7,0xb8,0x00,0xb9,0xb8,0xb9,0x00,0xba,0xb9,0xba,0x00,0xbb,0xba,0xbb,0x00,0xbc,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,\n\t0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd6,0xd5,0xd5,0x00,0xd7,0xd6,0xd6,0x00,\n\t0xd8,0xd7,0xd7,0x00,0xd9,0xd8,0xd8,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe3,0xe2,0x00,0xe3,0xe4,0xe3,0x00,0xe4,0xe5,0xe4,0x00,0xe5,0xe6,0xe5,0x00,0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,\n\t0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xf0,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,\n\t0xf2,0xf1,0xf1,0x00,0xf3,0xf2,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf5,0xf6,0xf5,0x00,0xf6,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x05,0x05,0x05,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0e,0x0b,0x0c,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0e,0x00,0x11,0x0e,0x10,0x00,\n\t0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1e,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,\n\t0x2e,0x2c,0x2e,0x00,0x2f,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,\n\t0x35,0x34,0x36,0x00,0x36,0x35,0x37,0x00,0x37,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3e,0x00,\n\t0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x41,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x46,0x00,0x45,0x45,0x47,0x00,\n\t0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4e,0x4f,0x00,\n\t0x4e,0x4f,0x50,0x00,0x4f,0x50,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x53,0x54,0x00,0x54,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5d,0x5c,0x5f,0x00,\n\t0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x61,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x66,0x65,0x67,0x00,\n\t0x67,0x66,0x68,0x00,0x68,0x67,0x69,0x00,0x69,0x68,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,\n\t0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x76,0x78,0x00,0x77,0x77,0x79,0x00,\n\t0x78,0x78,0x7a,0x00,0x79,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,0x87,0x87,0x89,0x00,0x89,0x88,0x89,0x00,\n\t0x8a,0x89,0x8a,0x00,0x8b,0x8a,0x8b,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8d,0x8e,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,0x90,0x90,0x92,0x00,0x91,0x91,0x93,0x00,\n\t0x92,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x99,0x98,0x9a,0x00,0x9a,0x9a,0x9b,0x00,\n\t0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa3,0xa2,0xa4,0x00,\n\t0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,0xab,0xab,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb4,0xb4,0x00,\n\t0xb5,0xb5,0xb5,0x00,0xb6,0xb6,0xb6,0x00,0xb7,0xb7,0xb8,0x00,0xb9,0xb8,0xb9,0x00,0xba,0xb9,0xba,0x00,0xbb,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xc0,0xbf,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc6,0x00,\n\t0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd7,0xd6,0xd6,0x00,\n\t0xd8,0xd7,0xd7,0x00,0xd9,0xd8,0xd8,0x00,0xda,0xd9,0xd9,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe4,0xe3,0x00,0xe4,0xe5,0xe4,0x00,0xe5,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe8,0x00,\n\t0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,0xf1,0xf0,0xf0,0x00,\n\t0xf2,0xf1,0xf1,0x00,0xf3,0xf2,0xf2,0x00,0xf3,0xf4,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf5,0xf6,0xf5,0x00,0xf6,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xfa,0xfa,0xf9,0x00,0xfb,0xfb,0xfa,0x00,0xfc,0xfc,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0e,0x0b,0x0c,0x00,0x0f,0x0c,0x0d,0x00,0x10,0x0d,0x0e,0x00,0x11,0x0e,0x0f,0x00,\n\t0x12,0x0f,0x11,0x00,0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1e,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2d,0x2b,0x2d,0x00,\n\t0x2e,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,\n\t0x35,0x34,0x36,0x00,0x36,0x35,0x37,0x00,0x37,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,\n\t0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x42,0x42,0x43,0x00,0x43,0x43,0x44,0x00,0x44,0x44,0x46,0x00,0x45,0x45,0x47,0x00,\n\t0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,\n\t0x4e,0x4f,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x52,0x00,0x52,0x52,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x58,0x5a,0x00,0x59,0x59,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,\n\t0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x62,0x64,0x00,0x63,0x63,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,\n\t0x67,0x66,0x68,0x00,0x68,0x67,0x69,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,\n\t0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x76,0x78,0x00,0x77,0x77,0x79,0x00,\n\t0x79,0x78,0x7a,0x00,0x7a,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7d,0x00,0x7d,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,0x87,0x87,0x89,0x00,0x88,0x88,0x89,0x00,\n\t0x8a,0x89,0x8a,0x00,0x8b,0x8a,0x8b,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,0x90,0x90,0x92,0x00,0x91,0x91,0x93,0x00,\n\t0x93,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,\n\t0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,\n\t0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,0xab,0xaa,0xac,0x00,\n\t0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb3,0xb4,0x00,\n\t0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xba,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xc0,0xbf,0xc0,0x00,0xc1,0xc0,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,\n\t0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,\n\t0xd8,0xd7,0xd7,0x00,0xd9,0xd8,0xd8,0x00,0xda,0xd9,0xd9,0x00,0xdb,0xda,0xda,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe5,0xe4,0x00,0xe5,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,\n\t0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,\n\t0xf2,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf4,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf5,0xf6,0xf5,0x00,0xf6,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0e,0x0a,0x0c,0x00,0x0f,0x0b,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1e,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,\n\t0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x33,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x37,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,\n\t0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x44,0x44,0x46,0x00,0x45,0x45,0x47,0x00,\n\t0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,\n\t0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x52,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,\n\t0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,\n\t0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,\n\t0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x76,0x78,0x00,0x78,0x77,0x79,0x00,\n\t0x79,0x78,0x7a,0x00,0x7a,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7b,0x7b,0x7d,0x00,0x7c,0x7c,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,0x87,0x87,0x89,0x00,0x88,0x88,0x89,0x00,\n\t0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x90,0x92,0x00,0x92,0x91,0x93,0x00,\n\t0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,\n\t0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,\n\t0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,0xab,0xaa,0xac,0x00,\n\t0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb3,0xb2,0xb3,0x00,0xb4,0xb3,0xb5,0x00,\n\t0xb5,0xb4,0xb6,0x00,0xb6,0xb5,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xc0,0xbf,0xc0,0x00,0xc1,0xc0,0xc1,0x00,0xc2,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,\n\t0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,\n\t0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,\n\t0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,\n\t0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf4,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf5,0xf6,0xf5,0x00,0xf6,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf9,0x00,\n\t0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,0x09,0x09,0x09,0x00,0x0e,0x0a,0x0c,0x00,0x0f,0x0b,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1e,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x27,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,\n\t0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,0x33,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x37,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3b,0x3c,0x00,0x3c,0x3c,0x3d,0x00,\n\t0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x44,0x44,0x46,0x00,0x45,0x45,0x47,0x00,\n\t0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,\n\t0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5b,0x5d,0x00,0x5c,0x5c,0x5e,0x00,\n\t0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x64,0x66,0x00,0x65,0x65,0x67,0x00,\n\t0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6d,0x6f,0x00,0x6e,0x6e,0x70,0x00,\n\t0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x77,0x76,0x78,0x00,0x78,0x77,0x79,0x00,\n\t0x79,0x78,0x7a,0x00,0x7a,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7b,0x7b,0x7d,0x00,0x7c,0x7c,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,0x87,0x87,0x89,0x00,0x88,0x88,0x89,0x00,\n\t0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,\n\t0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,\n\t0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,\n\t0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,0xab,0xaa,0xac,0x00,\n\t0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb3,0xb2,0xb4,0x00,0xb4,0xb3,0xb5,0x00,\n\t0xb5,0xb4,0xb6,0x00,0xb6,0xb5,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xc0,0xbf,0xc0,0x00,0xc1,0xc0,0xc1,0x00,0xc2,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc4,0xc4,0x00,0xc5,0xc5,0xc5,0x00,\n\t0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd1,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,\n\t0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xde,0xde,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe7,0xe7,0xe6,0x00,0xe8,0xe8,0xe7,0x00,\n\t0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,\n\t0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf4,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf5,0xf6,0xf5,0x00,0xf6,0xf7,0xf6,0x00,0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,\n\t0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x09,0x09,0x09,0x00,0x0e,0x0a,0x0c,0x00,0x0f,0x0b,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x17,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1e,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,\n\t0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,0x3c,0x3c,0x3d,0x00,\n\t0x3d,0x3d,0x3e,0x00,0x3e,0x3e,0x3f,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x44,0x43,0x45,0x00,0x45,0x45,0x47,0x00,\n\t0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,\n\t0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5c,0x5e,0x00,\n\t0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,0x65,0x65,0x67,0x00,\n\t0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6c,0x6f,0x00,0x6e,0x6e,0x70,0x00,\n\t0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x78,0x00,0x78,0x77,0x79,0x00,\n\t0x79,0x78,0x7a,0x00,0x7a,0x79,0x7b,0x00,0x7a,0x7a,0x7c,0x00,0x7b,0x7b,0x7d,0x00,0x7c,0x7c,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,0x87,0x87,0x89,0x00,0x88,0x88,0x89,0x00,\n\t0x89,0x89,0x8a,0x00,0x8a,0x8a,0x8b,0x00,0x8b,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x90,0x91,0x00,0x92,0x91,0x93,0x00,\n\t0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,\n\t0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,\n\t0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,0xab,0xaa,0xac,0x00,\n\t0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb4,0xb3,0xb5,0x00,\n\t0xb5,0xb4,0xb6,0x00,0xb6,0xb5,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc1,0xc0,0xc1,0x00,0xc2,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,0xc5,0xc5,0xc5,0x00,\n\t0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcc,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd2,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,\n\t0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xde,0x00,0xdf,0xdf,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe8,0xe8,0xe7,0x00,\n\t0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,\n\t0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf5,0xf6,0xf5,0x00,0xf6,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf9,0x00,\n\t0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x0a,0x0c,0x00,0x0f,0x0b,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x15,0x17,0x00,\n\t0x16,0x16,0x18,0x00,0x17,0x16,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1e,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x23,0x00,0x24,0x23,0x24,0x00,0x25,0x24,0x25,0x00,\n\t0x26,0x25,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,\n\t0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x33,0x35,0x00,\n\t0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x39,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,0x3c,0x3b,0x3d,0x00,\n\t0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x44,0x43,0x45,0x00,0x45,0x44,0x46,0x00,\n\t0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,\n\t0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,\n\t0x5d,0x5d,0x5f,0x00,0x5e,0x5e,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,\n\t0x66,0x66,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6c,0x6f,0x00,0x6e,0x6d,0x70,0x00,\n\t0x6f,0x6f,0x71,0x00,0x70,0x70,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x78,0x00,0x77,0x76,0x79,0x00,\n\t0x79,0x78,0x7a,0x00,0x79,0x79,0x7b,0x00,0x7a,0x7a,0x7c,0x00,0x7b,0x7b,0x7d,0x00,0x7c,0x7c,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,0x87,0x87,0x89,0x00,0x88,0x88,0x8a,0x00,\n\t0x89,0x89,0x8b,0x00,0x8a,0x8a,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,\n\t0x93,0x92,0x94,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x9a,0x00,0x99,0x99,0x9b,0x00,\n\t0x9b,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,0xa2,0xa2,0xa3,0x00,\n\t0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa8,0xaa,0x00,0xaa,0xa9,0xab,0x00,0xab,0xaa,0xac,0x00,\n\t0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,\n\t0xb5,0xb4,0xb6,0x00,0xb6,0xb5,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbd,0x00,\n\t0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc2,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,0xc5,0xc4,0xc5,0x00,\n\t0xc6,0xc6,0xc6,0x00,0xc7,0xc7,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcc,0xcc,0xcd,0x00,0xcd,0xcd,0xce,0x00,\n\t0xcf,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd3,0xd3,0x00,0xd4,0xd4,0xd4,0x00,0xd5,0xd5,0xd5,0x00,0xd6,0xd6,0xd6,0x00,\n\t0xd7,0xd7,0xd7,0x00,0xd8,0xd8,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdc,0x00,0xdc,0xdc,0xdd,0x00,0xdd,0xdd,0xde,0x00,0xde,0xde,0xdf,0x00,\n\t0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,\n\t0xe9,0xe9,0xe8,0x00,0xea,0xea,0xe9,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,\n\t0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,\n\t0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x0a,0x0c,0x00,0x0f,0x0b,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x14,0x17,0x00,\n\t0x16,0x15,0x18,0x00,0x17,0x16,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1e,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x20,0x20,0x22,0x00,0x21,0x21,0x23,0x00,0x22,0x22,0x24,0x00,0x24,0x23,0x24,0x00,0x25,0x23,0x25,0x00,\n\t0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x28,0x00,0x2a,0x28,0x29,0x00,0x2b,0x29,0x2a,0x00,0x2c,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x30,0x00,0x2f,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x32,0x35,0x00,\n\t0x34,0x33,0x36,0x00,0x35,0x34,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,0x3c,0x3b,0x3e,0x00,\n\t0x3d,0x3c,0x3f,0x00,0x3e,0x3d,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x44,0x43,0x45,0x00,0x45,0x44,0x46,0x00,\n\t0x46,0x45,0x47,0x00,0x47,0x46,0x48,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,\n\t0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,\n\t0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,\n\t0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6d,0x6c,0x6f,0x00,0x6e,0x6d,0x70,0x00,\n\t0x6f,0x6e,0x71,0x00,0x70,0x6f,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x78,0x00,0x77,0x76,0x79,0x00,\n\t0x78,0x77,0x7a,0x00,0x79,0x78,0x7b,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7c,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x89,0x00,0x88,0x87,0x8a,0x00,\n\t0x89,0x88,0x8b,0x00,0x8a,0x89,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,\n\t0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x9a,0x00,0x99,0x99,0x9b,0x00,\n\t0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9e,0x00,0x9f,0x9e,0x9f,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,\n\t0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xaa,0xa9,0xab,0x00,0xab,0xaa,0xac,0x00,\n\t0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,\n\t0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb7,0xb8,0x00,0xb7,0xb8,0xb9,0x00,0xb8,0xb9,0xba,0x00,0xb9,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbb,0xbc,0x00,\n\t0xbd,0xbc,0xbd,0x00,0xbe,0xbd,0xbe,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,\n\t0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcd,0x00,0xcd,0xcd,0xce,0x00,\n\t0xce,0xce,0xcf,0x00,0xcf,0xcf,0xd0,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,\n\t0xd7,0xd6,0xd7,0x00,0xd8,0xd7,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xdb,0x00,0xdb,0xdb,0xdc,0x00,0xdc,0xdc,0xdd,0x00,0xdd,0xdd,0xde,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe2,0xe2,0x00,0xe2,0xe3,0xe3,0x00,0xe3,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,\n\t0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xeb,0x00,0xeb,0xeb,0xec,0x00,0xec,0xec,0xed,0x00,0xed,0xed,0xee,0x00,0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,\n\t0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf5,0xf4,0xf4,0x00,0xf6,0xf5,0xf5,0x00,0xf7,0xf6,0xf6,0x00,0xf8,0xf7,0xf7,0x00,0xf9,0xf8,0xf8,0x00,\n\t0xfa,0xf9,0xf9,0x00,0xfb,0xfa,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x0a,0x0c,0x00,0x0f,0x0b,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,0x16,0x14,0x17,0x00,\n\t0x16,0x15,0x18,0x00,0x17,0x16,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1e,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x20,0x20,0x22,0x00,0x21,0x21,0x23,0x00,0x22,0x22,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x23,0x25,0x00,\n\t0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x28,0x00,0x2a,0x28,0x29,0x00,0x2b,0x29,0x2a,0x00,0x2c,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x30,0x00,0x2f,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,0x33,0x32,0x35,0x00,\n\t0x34,0x33,0x36,0x00,0x35,0x34,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3b,0x3a,0x3d,0x00,0x3c,0x3b,0x3e,0x00,\n\t0x3d,0x3c,0x3f,0x00,0x3e,0x3d,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x44,0x43,0x45,0x00,0x45,0x44,0x46,0x00,\n\t0x46,0x45,0x47,0x00,0x47,0x46,0x48,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,\n\t0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x57,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,\n\t0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,\n\t0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6d,0x6c,0x6f,0x00,0x6e,0x6d,0x70,0x00,\n\t0x6f,0x6e,0x71,0x00,0x70,0x6f,0x72,0x00,0x71,0x71,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x76,0x75,0x78,0x00,0x77,0x76,0x79,0x00,\n\t0x78,0x77,0x7a,0x00,0x79,0x78,0x7b,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7c,0x7f,0x00,0x7f,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x89,0x00,0x88,0x87,0x8a,0x00,\n\t0x89,0x88,0x8b,0x00,0x8a,0x89,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x90,0x90,0x91,0x00,0x91,0x91,0x92,0x00,\n\t0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x9a,0x00,0x99,0x99,0x9b,0x00,\n\t0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9e,0x00,0x9f,0x9e,0x9f,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,\n\t0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xaa,0xa9,0xab,0x00,0xab,0xaa,0xac,0x00,\n\t0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,\n\t0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb7,0xb8,0x00,0xb7,0xb8,0xb9,0x00,0xb8,0xb9,0xba,0x00,0xb9,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbb,0xbc,0x00,\n\t0xbd,0xbc,0xbd,0x00,0xbe,0xbd,0xbe,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,\n\t0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc8,0xc8,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcd,0x00,0xcd,0xcd,0xce,0x00,\n\t0xce,0xce,0xcf,0x00,0xcf,0xcf,0xd0,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,\n\t0xd7,0xd6,0xd7,0x00,0xd8,0xd7,0xd8,0x00,0xd9,0xd9,0xda,0x00,0xda,0xda,0xdb,0x00,0xdb,0xdb,0xdc,0x00,0xdc,0xdc,0xdd,0x00,0xdd,0xdd,0xde,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe2,0xe2,0x00,0xe2,0xe3,0xe3,0x00,0xe3,0xe4,0xe4,0x00,0xe4,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,\n\t0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xeb,0x00,0xeb,0xeb,0xec,0x00,0xec,0xec,0xed,0x00,0xed,0xed,0xee,0x00,0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,\n\t0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf4,0xf3,0xf3,0x00,0xf5,0xf4,0xf4,0x00,0xf6,0xf5,0xf5,0x00,0xf7,0xf6,0xf6,0x00,0xf8,0xf7,0xf7,0x00,0xf9,0xf8,0xf8,0x00,\n\t0xfa,0xf9,0xf9,0x00,0xfb,0xfa,0xfa,0x00,0xfc,0xfc,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x0a,0x0c,0x00,0x0f,0x0b,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x13,0x16,0x00,0x16,0x14,0x17,0x00,\n\t0x16,0x15,0x18,0x00,0x17,0x16,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x20,0x20,0x22,0x00,0x21,0x21,0x23,0x00,0x22,0x22,0x24,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,\n\t0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x28,0x00,0x2a,0x28,0x29,0x00,0x2b,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,0x2c,0x2b,0x2c,0x00,\n\t0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x30,0x00,0x2f,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x31,0x34,0x00,0x33,0x32,0x35,0x00,\n\t0x34,0x33,0x36,0x00,0x35,0x34,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,0x3c,0x3b,0x3e,0x00,\n\t0x3d,0x3c,0x3f,0x00,0x3e,0x3d,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x44,0x43,0x45,0x00,0x45,0x44,0x46,0x00,\n\t0x46,0x45,0x47,0x00,0x47,0x46,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,\n\t0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,\n\t0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,\n\t0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x70,0x00,\n\t0x6f,0x6e,0x71,0x00,0x70,0x6f,0x72,0x00,0x71,0x70,0x73,0x00,0x72,0x72,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,0x77,0x76,0x79,0x00,\n\t0x78,0x77,0x7a,0x00,0x79,0x78,0x7b,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7c,0x7f,0x00,0x7e,0x7e,0x80,0x00,0x80,0x7f,0x81,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x89,0x00,0x88,0x87,0x8a,0x00,\n\t0x89,0x88,0x8b,0x00,0x8a,0x89,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,0x91,0x91,0x92,0x00,\n\t0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9b,0x00,\n\t0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9d,0x00,0x9c,0x9c,0x9d,0x00,0x9e,0x9d,0x9e,0x00,0x9f,0x9e,0x9f,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,\n\t0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xac,0x00,\n\t0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,\n\t0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb8,0x00,0xb7,0xb8,0xb9,0x00,0xb8,0xb9,0xba,0x00,0xb9,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbb,0xbc,0x00,\n\t0xbd,0xbc,0xbd,0x00,0xbe,0xbd,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,\n\t0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc9,0xc9,0x00,0xca,0xca,0xca,0x00,0xcb,0xcb,0xcb,0x00,0xcc,0xcc,0xcd,0x00,0xcd,0xcd,0xce,0x00,\n\t0xce,0xce,0xcf,0x00,0xcf,0xcf,0xd0,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,\n\t0xd7,0xd6,0xd7,0x00,0xd8,0xd7,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xdb,0x00,0xdb,0xdb,0xdc,0x00,0xdc,0xdc,0xdd,0x00,0xdd,0xdd,0xde,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe2,0xe2,0x00,0xe2,0xe3,0xe3,0x00,0xe3,0xe4,0xe4,0x00,0xe4,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,\n\t0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xec,0x00,0xec,0xec,0xed,0x00,0xed,0xed,0xee,0x00,0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,\n\t0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf6,0xf5,0xf5,0x00,0xf7,0xf6,0xf6,0x00,0xf8,0xf7,0xf7,0x00,0xf9,0xf8,0xf8,0x00,\n\t0xfa,0xf9,0xf9,0x00,0xfb,0xfa,0xfa,0x00,0xfc,0xfb,0xfb,0x00,0xfd,0xfd,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x0a,0x0c,0x00,0x0f,0x0b,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x12,0x15,0x00,0x15,0x13,0x16,0x00,0x16,0x14,0x17,0x00,\n\t0x16,0x15,0x18,0x00,0x17,0x16,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1c,0x1e,0x00,\n\t0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,\n\t0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,\n\t0x2d,0x2c,0x2e,0x00,0x2d,0x2d,0x2f,0x00,0x2e,0x2e,0x30,0x00,0x2f,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x30,0x33,0x00,0x32,0x31,0x34,0x00,0x33,0x32,0x35,0x00,\n\t0x34,0x33,0x36,0x00,0x35,0x34,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,0x3c,0x3b,0x3d,0x00,\n\t0x3d,0x3c,0x3f,0x00,0x3e,0x3d,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x44,0x43,0x45,0x00,0x45,0x44,0x46,0x00,\n\t0x46,0x45,0x47,0x00,0x47,0x46,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,0x4d,0x4d,0x4f,0x00,\n\t0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x54,0x56,0x00,\n\t0x55,0x55,0x57,0x00,0x56,0x55,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,\n\t0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,\n\t0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,\n\t0x6f,0x6e,0x71,0x00,0x70,0x6f,0x72,0x00,0x71,0x70,0x73,0x00,0x72,0x71,0x74,0x00,0x73,0x73,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,0x76,0x76,0x78,0x00,\n\t0x78,0x77,0x7a,0x00,0x79,0x78,0x7b,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7c,0x7f,0x00,0x7e,0x7e,0x80,0x00,0x7f,0x7f,0x81,0x00,\n\t0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x87,0x00,0x87,0x86,0x89,0x00,0x88,0x87,0x8a,0x00,\n\t0x89,0x88,0x8b,0x00,0x8a,0x89,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,0x90,0x90,0x92,0x00,\n\t0x92,0x92,0x93,0x00,0x93,0x93,0x94,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,\n\t0x9a,0x9a,0x9c,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9f,0x9e,0x9f,0x00,0xa0,0x9f,0xa0,0x00,0xa1,0xa0,0xa2,0x00,0xa2,0xa1,0xa3,0x00,\n\t0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,\n\t0xac,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,\n\t0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb8,0x00,0xb7,0xb7,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbc,0xbc,0xbc,0x00,\n\t0xbd,0xbd,0xbd,0x00,0xbe,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,\n\t0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcc,0xcc,0xcd,0x00,0xcd,0xcd,0xce,0x00,\n\t0xce,0xce,0xcf,0x00,0xcf,0xcf,0xd0,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,\n\t0xd7,0xd6,0xd7,0x00,0xd8,0xd7,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdc,0x00,0xdc,0xdc,0xdd,0x00,0xdd,0xdd,0xde,0x00,0xde,0xde,0xdf,0x00,\n\t0xdf,0xdf,0xe0,0x00,0xe0,0xe0,0xe1,0x00,0xe1,0xe2,0xe2,0x00,0xe2,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,0xe7,0xe7,0xe7,0x00,\n\t0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xed,0x00,0xed,0xed,0xee,0x00,0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,\n\t0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xfa,0xf9,0xf9,0x00,0xfb,0xfa,0xfa,0x00,0xfc,0xfb,0xfb,0x00,0xfd,0xfc,0xfc,0x00,0xfe,0xfe,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x0a,0x0c,0x00,0x0f,0x0b,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x10,0x13,0x00,0x14,0x11,0x14,0x00,0x15,0x12,0x15,0x00,0x15,0x13,0x16,0x00,0x16,0x14,0x16,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1b,0x1e,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1f,0x1d,0x1f,0x00,0x20,0x1e,0x20,0x00,0x21,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,\n\t0x26,0x24,0x25,0x00,0x27,0x25,0x26,0x00,0x28,0x26,0x28,0x00,0x28,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,\n\t0x2c,0x2c,0x2e,0x00,0x2d,0x2d,0x2f,0x00,0x2e,0x2e,0x30,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x34,0x00,0x33,0x32,0x35,0x00,\n\t0x34,0x33,0x36,0x00,0x35,0x34,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,0x3c,0x3b,0x3d,0x00,\n\t0x3d,0x3c,0x3e,0x00,0x3e,0x3d,0x3f,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x44,0x43,0x45,0x00,0x45,0x44,0x46,0x00,\n\t0x46,0x45,0x47,0x00,0x47,0x46,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,\n\t0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x53,0x55,0x00,\n\t0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,\n\t0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,\n\t0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,\n\t0x6f,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,0x71,0x70,0x73,0x00,0x72,0x71,0x74,0x00,0x73,0x72,0x75,0x00,0x74,0x73,0x76,0x00,0x75,0x75,0x77,0x00,0x76,0x76,0x78,0x00,\n\t0x77,0x77,0x79,0x00,0x78,0x78,0x7a,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7c,0x7f,0x00,0x7e,0x7e,0x80,0x00,0x7f,0x7f,0x81,0x00,\n\t0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x87,0x86,0x89,0x00,0x88,0x87,0x8a,0x00,\n\t0x89,0x88,0x8b,0x00,0x8a,0x89,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,0x90,0x90,0x92,0x00,\n\t0x91,0x91,0x93,0x00,0x92,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,\n\t0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa2,0x00,0xa1,0xa1,0xa3,0x00,\n\t0xa2,0xa2,0xa4,0x00,0xa3,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,\n\t0xac,0xab,0xac,0x00,0xad,0xac,0xad,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,\n\t0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb8,0x00,0xb8,0xb7,0xb9,0x00,0xb9,0xb8,0xba,0x00,0xba,0xb9,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbb,0xbc,0xbc,0x00,\n\t0xbc,0xbd,0xbd,0x00,0xbd,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc4,0x00,0xc5,0xc4,0xc5,0x00,\n\t0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xca,0x00,0xca,0xc9,0xcb,0x00,0xcb,0xca,0xcc,0x00,0xcc,0xcc,0xcd,0x00,0xcd,0xcd,0xcd,0x00,\n\t0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,\n\t0xd7,0xd6,0xd7,0x00,0xd8,0xd7,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xde,0x00,0xde,0xde,0xdf,0x00,\n\t0xdf,0xdf,0xe0,0x00,0xe0,0xe0,0xe1,0x00,0xe1,0xe2,0xe2,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,\n\t0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,\n\t0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,0xf4,0xf4,0xf3,0x00,0xf5,0xf5,0xf4,0x00,0xf6,0xf6,0xf5,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfc,0xfb,0xfb,0x00,0xfd,0xfc,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x0a,0x0c,0x00,0x0f,0x0b,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x13,0x10,0x12,0x00,0x13,0x10,0x13,0x00,0x14,0x11,0x14,0x00,0x15,0x12,0x15,0x00,0x15,0x13,0x16,0x00,0x16,0x14,0x16,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1b,0x1d,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1f,0x1d,0x1f,0x00,0x20,0x1e,0x20,0x00,0x21,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x24,0x00,\n\t0x26,0x24,0x25,0x00,0x27,0x25,0x26,0x00,0x28,0x26,0x28,0x00,0x28,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2b,0x2b,0x2d,0x00,\n\t0x2c,0x2c,0x2e,0x00,0x2d,0x2d,0x2f,0x00,0x2e,0x2e,0x30,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x34,0x00,0x33,0x32,0x35,0x00,\n\t0x34,0x33,0x36,0x00,0x35,0x34,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,0x3c,0x3b,0x3d,0x00,\n\t0x3d,0x3c,0x3e,0x00,0x3e,0x3d,0x3f,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x44,0x43,0x45,0x00,0x45,0x44,0x46,0x00,\n\t0x46,0x45,0x47,0x00,0x47,0x46,0x48,0x00,0x48,0x48,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,\n\t0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x50,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,0x54,0x53,0x55,0x00,\n\t0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,\n\t0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x60,0x5f,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,\n\t0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6d,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,\n\t0x6f,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,0x71,0x70,0x73,0x00,0x72,0x71,0x74,0x00,0x73,0x72,0x75,0x00,0x74,0x73,0x76,0x00,0x75,0x75,0x77,0x00,0x76,0x76,0x78,0x00,\n\t0x77,0x77,0x79,0x00,0x78,0x78,0x7a,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7c,0x7f,0x00,0x7e,0x7e,0x80,0x00,0x7f,0x7f,0x81,0x00,\n\t0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x87,0x86,0x89,0x00,0x88,0x87,0x8a,0x00,\n\t0x89,0x88,0x8b,0x00,0x8a,0x89,0x8c,0x00,0x8b,0x8b,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,0x90,0x90,0x92,0x00,\n\t0x91,0x91,0x93,0x00,0x92,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x98,0x98,0x99,0x00,0x99,0x99,0x9a,0x00,\n\t0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa2,0x00,0xa1,0xa1,0xa3,0x00,\n\t0xa2,0xa2,0xa4,0x00,0xa3,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xaa,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,\n\t0xac,0xab,0xac,0x00,0xad,0xac,0xad,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb2,0xb3,0x00,0xb3,0xb3,0xb4,0x00,\n\t0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb7,0xb6,0xb8,0x00,0xb8,0xb7,0xb9,0x00,0xb9,0xb8,0xba,0x00,0xba,0xb9,0xbb,0x00,0xbb,0xbb,0xbc,0x00,0xbb,0xbc,0xbc,0x00,\n\t0xbc,0xbd,0xbd,0x00,0xbd,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc4,0xc3,0xc4,0x00,0xc5,0xc4,0xc5,0x00,\n\t0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc9,0x00,0xc9,0xc8,0xca,0x00,0xca,0xc9,0xcb,0x00,0xcb,0xca,0xcc,0x00,0xcc,0xcc,0xcd,0x00,0xcd,0xcd,0xcd,0x00,\n\t0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,\n\t0xd7,0xd6,0xd7,0x00,0xd8,0xd7,0xd8,0x00,0xd9,0xd9,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xde,0x00,0xde,0xde,0xdf,0x00,\n\t0xdf,0xdf,0xe0,0x00,0xe0,0xe0,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,\n\t0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xef,0xef,0xee,0x00,0xf0,0xf0,0xef,0x00,\n\t0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf3,0xf3,0xf2,0x00,0xf3,0xf4,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf5,0xf6,0xf5,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfc,0xfb,0xfb,0x00,0xfd,0xfc,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x0a,0x0c,0x00,0x0f,0x0b,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x13,0x00,0x14,0x11,0x14,0x00,0x14,0x12,0x15,0x00,0x15,0x13,0x16,0x00,0x15,0x14,0x16,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1b,0x1d,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1f,0x1d,0x1f,0x00,0x20,0x1e,0x20,0x00,0x21,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x24,0x00,\n\t0x26,0x24,0x25,0x00,0x27,0x25,0x26,0x00,0x27,0x26,0x28,0x00,0x28,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2b,0x2b,0x2d,0x00,\n\t0x2c,0x2c,0x2e,0x00,0x2d,0x2d,0x2f,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x35,0x00,\n\t0x34,0x33,0x36,0x00,0x35,0x34,0x37,0x00,0x36,0x35,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3c,0x3b,0x3d,0x00,\n\t0x3d,0x3c,0x3e,0x00,0x3e,0x3d,0x3f,0x00,0x3f,0x3e,0x40,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x45,0x44,0x46,0x00,\n\t0x46,0x45,0x47,0x00,0x47,0x46,0x48,0x00,0x48,0x47,0x49,0x00,0x49,0x49,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,\n\t0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x50,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x52,0x55,0x00,0x54,0x53,0x55,0x00,\n\t0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,\n\t0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x61,0x60,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,\n\t0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6e,0x6d,0x6f,0x00,\n\t0x6f,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x71,0x74,0x00,0x73,0x72,0x75,0x00,0x74,0x73,0x76,0x00,0x75,0x75,0x77,0x00,0x76,0x76,0x78,0x00,\n\t0x77,0x77,0x79,0x00,0x78,0x78,0x7a,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7c,0x7f,0x00,0x7e,0x7e,0x80,0x00,0x7f,0x7f,0x81,0x00,\n\t0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,\n\t0x89,0x88,0x8b,0x00,0x8a,0x89,0x8c,0x00,0x8b,0x8a,0x8d,0x00,0x8c,0x8c,0x8e,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,0x90,0x90,0x92,0x00,\n\t0x91,0x91,0x93,0x00,0x92,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x99,0x9a,0x00,\n\t0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa3,0x00,\n\t0xa2,0xa2,0xa4,0x00,0xa3,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xab,0xaa,0xab,0x00,\n\t0xac,0xab,0xac,0x00,0xad,0xac,0xad,0x00,0xae,0xad,0xae,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,0xb3,0xb3,0xb4,0x00,\n\t0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb8,0xb7,0xb9,0x00,0xb9,0xb8,0xba,0x00,0xba,0xb9,0xbb,0x00,0xbb,0xba,0xbb,0x00,0xbb,0xbc,0xbc,0x00,\n\t0xbc,0xbd,0xbd,0x00,0xbd,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc4,0x00,0xc5,0xc4,0xc5,0x00,\n\t0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xca,0x00,0xca,0xc9,0xcb,0x00,0xcb,0xca,0xcc,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcd,0xcd,0x00,\n\t0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,0xd6,0xd5,0xd6,0x00,\n\t0xd7,0xd6,0xd7,0x00,0xd8,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xda,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xdf,0x00,\n\t0xdf,0xdf,0xe0,0x00,0xe0,0xe0,0xe1,0x00,0xe1,0xe1,0xe1,0x00,0xe3,0xe3,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,\n\t0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xf0,0xf0,0xef,0x00,\n\t0xf1,0xf1,0xf0,0x00,0xf2,0xf2,0xf1,0x00,0xf2,0xf3,0xf2,0x00,0xf3,0xf4,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf5,0xf6,0xf5,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfd,0xfc,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x0a,0x0d,0x00,0x0f,0x0b,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x13,0x00,0x14,0x11,0x14,0x00,0x14,0x12,0x15,0x00,0x15,0x13,0x16,0x00,0x15,0x14,0x16,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x19,0x18,0x1a,0x00,0x1a,0x19,0x1b,0x00,0x1b,0x1a,0x1c,0x00,0x1c,0x1b,0x1d,0x00,0x1d,0x1b,0x1d,0x00,\n\t0x1e,0x1c,0x1e,0x00,0x1f,0x1d,0x1f,0x00,0x20,0x1e,0x20,0x00,0x21,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,\n\t0x26,0x24,0x26,0x00,0x26,0x25,0x27,0x00,0x27,0x26,0x28,0x00,0x28,0x27,0x29,0x00,0x29,0x28,0x2a,0x00,0x2a,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,0x2c,0x2b,0x2d,0x00,\n\t0x2d,0x2c,0x2e,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x33,0x32,0x34,0x00,\n\t0x34,0x33,0x36,0x00,0x35,0x34,0x37,0x00,0x36,0x35,0x38,0x00,0x37,0x36,0x39,0x00,0x38,0x38,0x3a,0x00,0x39,0x39,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3d,0x3c,0x3e,0x00,0x3e,0x3d,0x3f,0x00,0x3f,0x3e,0x40,0x00,0x40,0x3f,0x41,0x00,0x41,0x41,0x43,0x00,0x42,0x42,0x44,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x46,0x45,0x47,0x00,0x47,0x46,0x48,0x00,0x48,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x4a,0x4b,0x00,0x4b,0x4b,0x4c,0x00,0x4c,0x4c,0x4d,0x00,0x4d,0x4d,0x4e,0x00,\n\t0x4e,0x4e,0x50,0x00,0x4f,0x4e,0x50,0x00,0x50,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x51,0x54,0x00,0x53,0x52,0x55,0x00,0x54,0x53,0x55,0x00,\n\t0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x58,0x57,0x59,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,\n\t0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x62,0x61,0x63,0x00,0x63,0x62,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,\n\t0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6b,0x6b,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,\n\t0x6f,0x6e,0x70,0x00,0x70,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x75,0x00,0x74,0x73,0x76,0x00,0x75,0x75,0x77,0x00,0x76,0x76,0x78,0x00,\n\t0x77,0x77,0x7a,0x00,0x78,0x78,0x7b,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7c,0x7f,0x00,0x7e,0x7e,0x80,0x00,0x7f,0x7f,0x81,0x00,\n\t0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,\n\t0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8d,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x8f,0x8f,0x91,0x00,0x90,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x92,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x96,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,\n\t0x9a,0x9a,0x9b,0x00,0x9b,0x9b,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,\n\t0xa2,0xa2,0xa4,0x00,0xa3,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,\n\t0xac,0xab,0xac,0x00,0xad,0xac,0xad,0x00,0xae,0xad,0xae,0x00,0xaf,0xae,0xaf,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,0xb3,0xb2,0xb4,0x00,\n\t0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb8,0xb7,0xb8,0x00,0xb9,0xb8,0xba,0x00,0xba,0xb9,0xba,0x00,0xbb,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbd,0xbd,0x00,0xbd,0xbe,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,\n\t0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc7,0x00,0xc8,0xc7,0xc8,0x00,0xc9,0xc8,0xc9,0x00,0xca,0xc9,0xcb,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,0xcd,0xcc,0xcd,0x00,\n\t0xce,0xce,0xce,0x00,0xcf,0xcf,0xcf,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,0xd5,0xd5,0xd6,0x00,\n\t0xd7,0xd6,0xd7,0x00,0xd8,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xdb,0xdb,0x00,0xdc,0xdc,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xe0,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe4,0xe4,0xe3,0x00,0xe5,0xe5,0xe4,0x00,0xe6,0xe6,0xe5,0x00,0xe7,0xe7,0xe6,0x00,\n\t0xe8,0xe8,0xe7,0x00,0xe9,0xe9,0xe8,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,\n\t0xf1,0xf1,0xf0,0x00,0xf1,0xf2,0xf1,0x00,0xf2,0xf3,0xf2,0x00,0xf3,0xf4,0xf3,0x00,0xf4,0xf5,0xf5,0x00,0xf5,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfe,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x0a,0x0d,0x00,0x0f,0x0b,0x0e,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x13,0x00,0x13,0x11,0x14,0x00,0x14,0x12,0x15,0x00,0x15,0x13,0x16,0x00,0x15,0x14,0x16,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1b,0x1d,0x00,\n\t0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,\n\t0x25,0x24,0x26,0x00,0x26,0x25,0x27,0x00,0x27,0x26,0x28,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,\n\t0x2d,0x2b,0x2d,0x00,0x2e,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x36,0x35,0x38,0x00,0x37,0x36,0x39,0x00,0x38,0x37,0x3a,0x00,0x39,0x38,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3f,0x3e,0x40,0x00,0x40,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x48,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4f,0x00,\n\t0x4e,0x4d,0x50,0x00,0x4f,0x4e,0x51,0x00,0x50,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x50,0x53,0x00,0x52,0x51,0x54,0x00,0x53,0x52,0x55,0x00,0x54,0x53,0x55,0x00,\n\t0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,\n\t0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,\n\t0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,\n\t0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x76,0x00,0x75,0x75,0x77,0x00,0x76,0x76,0x78,0x00,\n\t0x77,0x77,0x7a,0x00,0x78,0x78,0x7b,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7c,0x7f,0x00,0x7e,0x7e,0x80,0x00,0x7f,0x7f,0x81,0x00,\n\t0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x89,0x00,\n\t0x89,0x88,0x8a,0x00,0x8a,0x89,0x8b,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,\n\t0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,\n\t0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,\n\t0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb3,0x00,0xb2,0xb2,0xb4,0x00,\n\t0xb3,0xb3,0xb5,0x00,0xb5,0xb4,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb8,0xb7,0xb8,0x00,0xb9,0xb8,0xb9,0x00,0xba,0xb9,0xba,0x00,0xbb,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,\n\t0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcc,0xcc,0xcd,0x00,\n\t0xcd,0xcd,0xce,0x00,0xce,0xce,0xcf,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,0xd5,0xd5,0xd6,0x00,\n\t0xd6,0xd6,0xd7,0x00,0xd7,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdb,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe6,0xe5,0x00,0xe6,0xe7,0xe6,0x00,\n\t0xe7,0xe8,0xe7,0x00,0xe8,0xe9,0xe8,0x00,0xe9,0xea,0xea,0x00,0xea,0xeb,0xeb,0x00,0xeb,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf3,0xf2,0x00,0xf3,0xf4,0xf4,0x00,0xf4,0xf5,0xf5,0x00,0xf5,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x0a,0x0d,0x00,0x0f,0x0b,0x0e,0x00,0x10,0x0c,0x0f,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x13,0x00,0x13,0x11,0x14,0x00,0x14,0x12,0x15,0x00,0x15,0x13,0x16,0x00,0x15,0x14,0x16,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1b,0x1d,0x00,0x1c,0x1b,0x1d,0x00,\n\t0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,\n\t0x25,0x24,0x26,0x00,0x26,0x25,0x27,0x00,0x27,0x26,0x28,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,\n\t0x2d,0x2b,0x2d,0x00,0x2e,0x2c,0x2e,0x00,0x2f,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x32,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x36,0x35,0x38,0x00,0x37,0x36,0x39,0x00,0x38,0x37,0x3a,0x00,0x39,0x38,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3f,0x3e,0x40,0x00,0x40,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x48,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4e,0x00,0x4d,0x4c,0x4f,0x00,\n\t0x4e,0x4d,0x50,0x00,0x4f,0x4e,0x51,0x00,0x50,0x4f,0x52,0x00,0x50,0x4f,0x52,0x00,0x51,0x50,0x53,0x00,0x52,0x51,0x54,0x00,0x53,0x52,0x55,0x00,0x54,0x53,0x55,0x00,\n\t0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x57,0x56,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5b,0x5a,0x5d,0x00,0x5c,0x5b,0x5e,0x00,\n\t0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x64,0x63,0x66,0x00,0x65,0x64,0x67,0x00,\n\t0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6c,0x6e,0x00,0x6d,0x6d,0x6f,0x00,\n\t0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x76,0x00,0x75,0x75,0x77,0x00,0x76,0x76,0x79,0x00,\n\t0x77,0x77,0x7a,0x00,0x78,0x78,0x7b,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7c,0x7f,0x00,0x7e,0x7e,0x80,0x00,0x7f,0x7f,0x81,0x00,\n\t0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x87,0x86,0x88,0x00,0x88,0x87,0x88,0x00,\n\t0x89,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x90,0x8f,0x91,0x00,0x91,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x98,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,\n\t0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,\n\t0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,\n\t0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb3,0x00,0xb2,0xb2,0xb4,0x00,\n\t0xb3,0xb3,0xb5,0x00,0xb5,0xb4,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb8,0xb7,0xb8,0x00,0xb9,0xb8,0xb9,0x00,0xba,0xb9,0xba,0x00,0xbb,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc4,0x00,0xc4,0xc4,0xc5,0x00,\n\t0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcc,0xcc,0xcd,0x00,\n\t0xcd,0xcd,0xce,0x00,0xce,0xce,0xcf,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,0xd5,0xd5,0xd6,0x00,\n\t0xd6,0xd6,0xd7,0x00,0xd7,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdb,0xdc,0x00,0xdd,0xdd,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe6,0xe5,0x00,0xe6,0xe7,0xe6,0x00,\n\t0xe7,0xe8,0xe7,0x00,0xe8,0xe9,0xe8,0x00,0xe9,0xea,0xea,0x00,0xea,0xeb,0xeb,0x00,0xeb,0xec,0xec,0x00,0xec,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf3,0xf3,0x00,0xf3,0xf4,0xf4,0x00,0xf4,0xf5,0xf5,0x00,0xf5,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x0a,0x0d,0x00,0x0f,0x0b,0x0e,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x13,0x00,0x13,0x11,0x14,0x00,0x14,0x12,0x15,0x00,0x15,0x13,0x16,0x00,0x15,0x14,0x16,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x1a,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1d,0x00,\n\t0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x24,0x00,0x24,0x23,0x25,0x00,\n\t0x25,0x24,0x26,0x00,0x26,0x25,0x27,0x00,0x27,0x26,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,\n\t0x2d,0x2b,0x2d,0x00,0x2e,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x37,0x36,0x39,0x00,0x38,0x37,0x3a,0x00,0x39,0x38,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3f,0x3e,0x40,0x00,0x40,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x48,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4f,0x00,\n\t0x4e,0x4d,0x50,0x00,0x4f,0x4e,0x51,0x00,0x50,0x4f,0x51,0x00,0x50,0x4f,0x52,0x00,0x51,0x50,0x53,0x00,0x52,0x51,0x54,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,\n\t0x55,0x54,0x56,0x00,0x56,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5c,0x5b,0x5e,0x00,\n\t0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x65,0x64,0x67,0x00,\n\t0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6d,0x6f,0x00,\n\t0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x77,0x00,0x76,0x76,0x78,0x00,\n\t0x77,0x77,0x7a,0x00,0x78,0x78,0x7b,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7c,0x7f,0x00,0x7e,0x7d,0x80,0x00,0x7f,0x7f,0x81,0x00,\n\t0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,0x88,0x87,0x88,0x00,\n\t0x89,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x91,0x00,0x91,0x90,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x99,0x00,0x99,0x98,0x9a,0x00,\n\t0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,\n\t0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,\n\t0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb3,0x00,0xb2,0xb2,0xb4,0x00,\n\t0xb3,0xb3,0xb5,0x00,0xb4,0xb4,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb9,0xb8,0xb9,0x00,0xba,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc5,0x00,\n\t0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcc,0xcc,0xcd,0x00,\n\t0xcd,0xcd,0xce,0x00,0xce,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,0xd5,0xd5,0xd6,0x00,\n\t0xd6,0xd6,0xd7,0x00,0xd7,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdb,0xdc,0x00,0xdd,0xdc,0xdd,0x00,0xde,0xde,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe7,0xe6,0x00,\n\t0xe7,0xe8,0xe7,0x00,0xe8,0xe9,0xe8,0x00,0xe9,0xea,0xea,0x00,0xea,0xeb,0xeb,0x00,0xeb,0xec,0xec,0x00,0xec,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf4,0xf4,0x00,0xf4,0xf5,0xf5,0x00,0xf5,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x0a,0x0d,0x00,0x0f,0x0b,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x13,0x00,0x13,0x11,0x14,0x00,0x14,0x12,0x15,0x00,0x15,0x13,0x16,0x00,0x15,0x14,0x16,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x18,0x18,0x1a,0x00,0x19,0x19,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1d,0x00,\n\t0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x25,0x00,\n\t0x26,0x24,0x26,0x00,0x26,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2c,0x2a,0x2c,0x00,\n\t0x2d,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x30,0x32,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x38,0x37,0x3a,0x00,0x39,0x38,0x3b,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3f,0x3e,0x40,0x00,0x40,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x48,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,\n\t0x4e,0x4d,0x50,0x00,0x4f,0x4e,0x50,0x00,0x50,0x4f,0x51,0x00,0x50,0x4f,0x52,0x00,0x51,0x50,0x53,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x54,0x53,0x55,0x00,\n\t0x55,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,\n\t0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6c,0x6f,0x00,\n\t0x6e,0x6e,0x70,0x00,0x6f,0x6f,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x77,0x00,0x76,0x75,0x78,0x00,\n\t0x78,0x77,0x79,0x00,0x79,0x78,0x7a,0x00,0x7a,0x79,0x7b,0x00,0x7b,0x7a,0x7c,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7c,0x7f,0x00,0x7e,0x7d,0x80,0x00,0x7f,0x7e,0x81,0x00,\n\t0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,0x87,0x87,0x88,0x00,\n\t0x89,0x88,0x89,0x00,0x8a,0x89,0x8a,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x91,0x00,0x90,0x8f,0x92,0x00,\n\t0x92,0x91,0x93,0x00,0x92,0x92,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,\n\t0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,\n\t0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa6,0x00,0xa5,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa7,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,\n\t0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb3,0x00,0xb2,0xb2,0xb4,0x00,\n\t0xb3,0xb3,0xb5,0x00,0xb4,0xb4,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb9,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc2,0x00,0xc3,0xc3,0xc3,0x00,0xc4,0xc4,0xc4,0x00,\n\t0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcc,0xcc,0xcd,0x00,\n\t0xcd,0xcd,0xce,0x00,0xce,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,0xd5,0xd5,0xd6,0x00,\n\t0xd6,0xd6,0xd7,0x00,0xd7,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdb,0xdc,0x00,0xdd,0xdc,0xdd,0x00,0xde,0xdd,0xde,0x00,\n\t0xdf,0xdf,0xdf,0x00,0xe0,0xe0,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe8,0xe7,0x00,0xe8,0xe9,0xe8,0x00,0xe9,0xea,0xea,0x00,0xea,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf4,0xf3,0x00,0xf4,0xf5,0xf5,0x00,0xf5,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,0xf8,0xf8,0xf8,0x00,\n\t0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x09,0x0c,0x00,0x0f,0x0a,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x13,0x00,0x13,0x11,0x14,0x00,0x14,0x12,0x15,0x00,0x15,0x13,0x16,0x00,0x15,0x14,0x16,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1d,0x00,\n\t0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x21,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x24,0x00,\n\t0x26,0x24,0x25,0x00,0x27,0x25,0x26,0x00,0x27,0x26,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3f,0x3e,0x40,0x00,0x40,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x48,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,\n\t0x4e,0x4d,0x4f,0x00,0x4f,0x4e,0x50,0x00,0x50,0x4f,0x51,0x00,0x50,0x4f,0x52,0x00,0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,\n\t0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6c,0x6f,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6e,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x77,0x75,0x77,0x00,\n\t0x78,0x76,0x79,0x00,0x79,0x77,0x7a,0x00,0x7a,0x79,0x7b,0x00,0x7a,0x7a,0x7c,0x00,0x7b,0x7b,0x7d,0x00,0x7c,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,0x87,0x86,0x88,0x00,\n\t0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x91,0x00,0x90,0x8f,0x92,0x00,\n\t0x91,0x90,0x93,0x00,0x92,0x91,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,\n\t0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,\n\t0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa6,0x00,0xa5,0xa5,0xa7,0x00,0xa6,0xa6,0xa8,0x00,0xa7,0xa7,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,\n\t0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb3,0x00,0xb2,0xb2,0xb4,0x00,\n\t0xb3,0xb3,0xb5,0x00,0xb4,0xb4,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,\n\t0xc5,0xc4,0xc5,0x00,0xc6,0xc5,0xc6,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcc,0xcc,0xcd,0x00,\n\t0xcd,0xcd,0xce,0x00,0xce,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,\n\t0xd6,0xd5,0xd6,0x00,0xd7,0xd6,0xd7,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdb,0xdc,0x00,0xdd,0xdc,0xdd,0x00,0xde,0xdd,0xde,0x00,\n\t0xdf,0xde,0xdf,0x00,0xe0,0xdf,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xea,0x00,0xeb,0xea,0xeb,0x00,0xec,0xeb,0xec,0x00,0xed,0xec,0xed,0x00,0xee,0xed,0xee,0x00,0xef,0xee,0xef,0x00,\n\t0xf0,0xef,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf4,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf5,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf7,0xf7,0x00,\n\t0xf9,0xf8,0xf8,0x00,0xfa,0xf9,0xf9,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x09,0x0c,0x00,0x0f,0x0a,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x13,0x00,0x13,0x11,0x14,0x00,0x14,0x12,0x15,0x00,0x15,0x13,0x16,0x00,0x15,0x14,0x16,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1d,0x00,\n\t0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x20,0x1e,0x20,0x00,0x21,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x24,0x00,\n\t0x26,0x24,0x25,0x00,0x27,0x25,0x26,0x00,0x28,0x26,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x3a,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3f,0x3e,0x40,0x00,0x40,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x43,0x45,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x48,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,\n\t0x4e,0x4d,0x4f,0x00,0x4f,0x4e,0x50,0x00,0x50,0x4f,0x51,0x00,0x50,0x4f,0x51,0x00,0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x5a,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,\n\t0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6c,0x6f,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6e,0x71,0x00,0x71,0x70,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x76,0x74,0x76,0x00,0x77,0x75,0x77,0x00,\n\t0x78,0x76,0x78,0x00,0x79,0x77,0x79,0x00,0x7a,0x79,0x7b,0x00,0x7a,0x7a,0x7c,0x00,0x7b,0x7b,0x7d,0x00,0x7c,0x7c,0x7e,0x00,0x7e,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,0x87,0x86,0x88,0x00,\n\t0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,0x8b,0x8a,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x91,0x00,0x90,0x8f,0x92,0x00,\n\t0x91,0x90,0x93,0x00,0x92,0x91,0x94,0x00,0x93,0x93,0x95,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,\n\t0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9c,0x9c,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,\n\t0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa6,0x00,0xa5,0xa5,0xa7,0x00,0xa6,0xa6,0xa8,0x00,0xa7,0xa7,0xa9,0x00,0xa9,0xa9,0xaa,0x00,0xaa,0xaa,0xab,0x00,\n\t0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb3,0x00,0xb2,0xb2,0xb4,0x00,\n\t0xb3,0xb3,0xb5,0x00,0xb4,0xb4,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc3,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,\n\t0xc5,0xc4,0xc5,0x00,0xc6,0xc5,0xc6,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcc,0xcc,0xcd,0x00,\n\t0xcd,0xcd,0xce,0x00,0xce,0xce,0xcf,0x00,0xd0,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,\n\t0xd6,0xd5,0xd6,0x00,0xd7,0xd6,0xd7,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdb,0xdc,0x00,0xdd,0xdc,0xdd,0x00,0xde,0xdd,0xde,0x00,\n\t0xdf,0xde,0xdf,0x00,0xe0,0xdf,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xea,0xe9,0xea,0x00,0xeb,0xea,0xeb,0x00,0xec,0xeb,0xec,0x00,0xed,0xec,0xed,0x00,0xee,0xed,0xee,0x00,0xef,0xee,0xef,0x00,\n\t0xf0,0xef,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf4,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf5,0xf6,0xf5,0x00,0xf7,0xf7,0xf6,0x00,0xf8,0xf7,0xf7,0x00,\n\t0xf9,0xf8,0xf8,0x00,0xfa,0xf9,0xf9,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xff,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x04,0x04,0x04,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x09,0x0c,0x00,0x0f,0x0a,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x13,0x00,0x13,0x11,0x14,0x00,0x14,0x12,0x15,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1d,0x00,\n\t0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x20,0x1e,0x20,0x00,0x21,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x24,0x00,\n\t0x26,0x24,0x25,0x00,0x27,0x25,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x39,0x3c,0x00,0x3b,0x3b,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x40,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x44,0x46,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x49,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,\n\t0x4e,0x4d,0x4f,0x00,0x4f,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x4f,0x51,0x00,0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5b,0x5d,0x00,\n\t0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,\n\t0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x67,0x69,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6c,0x6f,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6e,0x71,0x00,0x70,0x6f,0x72,0x00,0x72,0x71,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x77,0x75,0x77,0x00,\n\t0x78,0x76,0x78,0x00,0x79,0x77,0x79,0x00,0x79,0x78,0x7b,0x00,0x7a,0x7a,0x7c,0x00,0x7b,0x7b,0x7d,0x00,0x7c,0x7c,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7f,0x7e,0x80,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x86,0x85,0x88,0x00,0x87,0x86,0x88,0x00,\n\t0x88,0x87,0x89,0x00,0x89,0x88,0x8a,0x00,0x8a,0x89,0x8c,0x00,0x8c,0x8b,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x92,0x00,\n\t0x91,0x90,0x93,0x00,0x92,0x91,0x94,0x00,0x93,0x92,0x95,0x00,0x94,0x94,0x95,0x00,0x95,0x95,0x96,0x00,0x96,0x96,0x97,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,\n\t0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9d,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,\n\t0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa7,0x00,0xa6,0xa6,0xa8,0x00,0xa7,0xa7,0xa9,0x00,0xa8,0xa8,0xaa,0x00,0xaa,0xaa,0xab,0x00,\n\t0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb4,0x00,\n\t0xb3,0xb3,0xb5,0x00,0xb4,0xb4,0xb6,0x00,0xb5,0xb5,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,\n\t0xc5,0xc4,0xc5,0x00,0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcc,0xcc,0xcd,0x00,\n\t0xcd,0xcd,0xce,0x00,0xce,0xce,0xcf,0x00,0xcf,0xcf,0xd0,0x00,0xd1,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,\n\t0xd6,0xd5,0xd6,0x00,0xd7,0xd6,0xd7,0x00,0xd8,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdb,0xdc,0x00,0xdd,0xdc,0xdd,0x00,0xde,0xdd,0xde,0x00,\n\t0xdf,0xde,0xdf,0x00,0xe0,0xdf,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xeb,0xea,0xeb,0x00,0xec,0xeb,0xec,0x00,0xed,0xec,0xed,0x00,0xee,0xed,0xee,0x00,0xef,0xee,0xef,0x00,\n\t0xf0,0xef,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf5,0xf6,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf8,0xf7,0xf7,0x00,\n\t0xf9,0xf8,0xf8,0x00,0xfa,0xf9,0xf9,0x00,0xfb,0xfa,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfd,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xfe,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x09,0x0c,0x00,0x0f,0x0a,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x13,0x00,0x13,0x11,0x14,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1d,0x00,\n\t0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x20,0x1e,0x20,0x00,0x21,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x25,0x23,0x24,0x00,\n\t0x26,0x24,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x33,0x00,0x32,0x32,0x34,0x00,\n\t0x33,0x33,0x35,0x00,0x34,0x34,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x39,0x3c,0x00,0x3b,0x3a,0x3d,0x00,\n\t0x3c,0x3c,0x3e,0x00,0x3d,0x3d,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x41,0x40,0x42,0x00,0x42,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x45,0x47,0x00,0x46,0x46,0x48,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x4a,0x49,0x4b,0x00,0x4b,0x4a,0x4c,0x00,0x4c,0x4b,0x4d,0x00,0x4d,0x4c,0x4e,0x00,\n\t0x4e,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x4f,0x51,0x00,0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,\n\t0x5c,0x5c,0x5e,0x00,0x5d,0x5d,0x5f,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,\n\t0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6c,0x6f,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6e,0x71,0x00,0x70,0x6f,0x72,0x00,0x71,0x70,0x73,0x00,0x73,0x72,0x74,0x00,0x74,0x73,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,\n\t0x78,0x76,0x78,0x00,0x78,0x77,0x79,0x00,0x79,0x78,0x7b,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7b,0x7d,0x00,0x7c,0x7c,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,\n\t0x80,0x7f,0x81,0x00,0x81,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x84,0x86,0x00,0x85,0x84,0x87,0x00,0x86,0x85,0x88,0x00,0x87,0x86,0x89,0x00,\n\t0x88,0x87,0x8a,0x00,0x89,0x88,0x8b,0x00,0x8a,0x89,0x8c,0x00,0x8b,0x8a,0x8d,0x00,0x8d,0x8c,0x8e,0x00,0x8e,0x8d,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x93,0x00,0x92,0x91,0x94,0x00,0x93,0x92,0x95,0x00,0x94,0x93,0x96,0x00,0x95,0x95,0x97,0x00,0x96,0x96,0x98,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,\n\t0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9e,0x9f,0x00,0x9f,0x9f,0xa0,0x00,0xa0,0xa0,0xa1,0x00,0xa1,0xa1,0xa2,0x00,\n\t0xa2,0xa2,0xa3,0x00,0xa3,0xa3,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa8,0x00,0xa7,0xa7,0xa9,0x00,0xa8,0xa8,0xaa,0x00,0xa9,0xa9,0xab,0x00,\n\t0xab,0xab,0xac,0x00,0xac,0xac,0xad,0x00,0xad,0xad,0xae,0x00,0xae,0xae,0xaf,0x00,0xaf,0xaf,0xb0,0x00,0xb0,0xb0,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,\n\t0xb3,0xb3,0xb5,0x00,0xb4,0xb4,0xb6,0x00,0xb5,0xb5,0xb7,0x00,0xb6,0xb6,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xb9,0xb9,0xba,0x00,0xba,0xba,0xbb,0x00,0xbb,0xbb,0xbc,0x00,\n\t0xbc,0xbc,0xbd,0x00,0xbd,0xbd,0xbe,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,\n\t0xc5,0xc4,0xc5,0x00,0xc6,0xc5,0xc6,0x00,0xc7,0xc6,0xc8,0x00,0xc8,0xc7,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xca,0xca,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcc,0xcc,0xcd,0x00,\n\t0xcd,0xcd,0xce,0x00,0xce,0xce,0xcf,0x00,0xcf,0xcf,0xd0,0x00,0xd0,0xd0,0xd1,0x00,0xd2,0xd1,0xd2,0x00,0xd3,0xd2,0xd3,0x00,0xd4,0xd3,0xd4,0x00,0xd5,0xd4,0xd5,0x00,\n\t0xd6,0xd5,0xd6,0x00,0xd7,0xd6,0xd7,0x00,0xd8,0xd8,0xd9,0x00,0xd9,0xd9,0xda,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdb,0xdc,0x00,0xdd,0xdc,0xdd,0x00,0xde,0xdd,0xde,0x00,\n\t0xdf,0xde,0xdf,0x00,0xe0,0xdf,0xe0,0x00,0xe1,0xe1,0xe1,0x00,0xe2,0xe2,0xe2,0x00,0xe3,0xe3,0xe3,0x00,0xe4,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xec,0xeb,0xec,0x00,0xed,0xec,0xed,0x00,0xee,0xed,0xee,0x00,0xef,0xee,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf5,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf9,0xf8,0xf8,0x00,0xfa,0xf9,0xf9,0x00,0xfb,0xfa,0xfb,0x00,0xfc,0xfb,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfd,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xfe,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x09,0x0c,0x00,0x0f,0x0a,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1d,0x00,\n\t0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x20,0x1e,0x20,0x00,0x21,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x24,0x22,0x24,0x00,\n\t0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x33,0x00,0x32,0x31,0x34,0x00,\n\t0x33,0x32,0x35,0x00,0x34,0x33,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x39,0x3c,0x00,0x3b,0x3a,0x3d,0x00,\n\t0x3c,0x3b,0x3e,0x00,0x3d,0x3c,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x44,0x46,0x00,0x46,0x45,0x47,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x4f,0x51,0x00,0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,\n\t0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,\n\t0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6c,0x6f,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6e,0x71,0x00,0x70,0x6f,0x72,0x00,0x71,0x70,0x73,0x00,0x72,0x71,0x74,0x00,0x74,0x72,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,\n\t0x77,0x76,0x78,0x00,0x78,0x77,0x79,0x00,0x79,0x78,0x7b,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,\n\t0x7f,0x7f,0x81,0x00,0x80,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x88,0x00,0x86,0x86,0x89,0x00,\n\t0x87,0x87,0x8a,0x00,0x89,0x88,0x8b,0x00,0x8a,0x89,0x8c,0x00,0x8b,0x8a,0x8d,0x00,0x8c,0x8b,0x8e,0x00,0x8d,0x8c,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,0x93,0x92,0x95,0x00,0x94,0x93,0x96,0x00,0x95,0x94,0x97,0x00,0x96,0x95,0x98,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,\n\t0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9d,0x00,0x9e,0x9d,0x9e,0x00,0x9f,0x9e,0x9f,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,\n\t0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xaa,0x00,0xa9,0xa9,0xab,0x00,\n\t0xaa,0xaa,0xac,0x00,0xab,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,\n\t0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb7,0x00,0xb6,0xb6,0xb8,0x00,0xb7,0xb7,0xb9,0x00,0xb8,0xb8,0xba,0x00,0xba,0xb9,0xbb,0x00,0xbb,0xba,0xbb,0x00,\n\t0xbc,0xbb,0xbc,0x00,0xbd,0xbc,0xbd,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,\n\t0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,0xc7,0xc6,0xc8,0x00,0xc8,0xc7,0xc9,0x00,0xc9,0xc8,0xca,0x00,0xca,0xc9,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcc,0xcc,0xcd,0x00,\n\t0xcd,0xcd,0xce,0x00,0xce,0xce,0xcf,0x00,0xcf,0xcf,0xd0,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,\n\t0xd5,0xd5,0xd6,0x00,0xd7,0xd6,0xd7,0x00,0xd8,0xd8,0xd9,0x00,0xd9,0xd9,0xda,0x00,0xda,0xda,0xdb,0x00,0xdb,0xdb,0xdc,0x00,0xdc,0xdc,0xdd,0x00,0xdd,0xdd,0xde,0x00,\n\t0xde,0xde,0xdf,0x00,0xdf,0xdf,0xe0,0x00,0xe0,0xe1,0xe1,0x00,0xe1,0xe2,0xe2,0x00,0xe2,0xe3,0xe3,0x00,0xe3,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xee,0xed,0xee,0x00,0xef,0xef,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfb,0xfa,0xfb,0x00,0xfc,0xfb,0xfc,0x00,0xfd,0xfc,0xfd,0x00,0xfe,0xfd,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xfe,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x07,0x07,0x07,0x00,0x08,0x08,0x08,0x00,0x0e,0x09,0x0c,0x00,0x0f,0x0a,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x17,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1d,0x00,\n\t0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x20,0x1e,0x20,0x00,0x21,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x24,0x22,0x24,0x00,0x24,0x22,0x24,0x00,\n\t0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x31,0x33,0x00,0x32,0x31,0x34,0x00,\n\t0x33,0x32,0x35,0x00,0x34,0x33,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x39,0x3c,0x00,0x3b,0x3a,0x3d,0x00,\n\t0x3c,0x3b,0x3e,0x00,0x3d,0x3c,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x44,0x46,0x00,0x46,0x45,0x47,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x4f,0x51,0x00,0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x53,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x56,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,\n\t0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,\n\t0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x67,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6c,0x6f,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6e,0x71,0x00,0x70,0x6f,0x72,0x00,0x71,0x70,0x73,0x00,0x72,0x71,0x74,0x00,0x73,0x72,0x75,0x00,0x75,0x74,0x76,0x00,0x76,0x75,0x77,0x00,\n\t0x77,0x76,0x78,0x00,0x78,0x77,0x79,0x00,0x79,0x78,0x7b,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,\n\t0x7f,0x7f,0x81,0x00,0x80,0x80,0x82,0x00,0x82,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x88,0x00,0x86,0x86,0x89,0x00,\n\t0x87,0x87,0x8a,0x00,0x88,0x88,0x8b,0x00,0x8a,0x89,0x8c,0x00,0x8b,0x8a,0x8d,0x00,0x8c,0x8b,0x8e,0x00,0x8d,0x8c,0x8f,0x00,0x8f,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,0x93,0x92,0x95,0x00,0x94,0x93,0x96,0x00,0x95,0x94,0x97,0x00,0x96,0x95,0x98,0x00,0x97,0x97,0x99,0x00,0x98,0x98,0x9a,0x00,\n\t0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9d,0x00,0x9e,0x9d,0x9e,0x00,0x9f,0x9e,0x9f,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,\n\t0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,0xa4,0xa4,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xaa,0x00,0xa9,0xa9,0xab,0x00,\n\t0xaa,0xaa,0xac,0x00,0xab,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb1,0xb2,0x00,0xb2,0xb2,0xb3,0x00,\n\t0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb7,0x00,0xb6,0xb6,0xb8,0x00,0xb7,0xb7,0xb9,0x00,0xb8,0xb8,0xba,0x00,0xba,0xb9,0xbb,0x00,0xbb,0xba,0xbb,0x00,\n\t0xbc,0xbb,0xbc,0x00,0xbd,0xbc,0xbd,0x00,0xbe,0xbe,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,\n\t0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,0xc7,0xc6,0xc8,0x00,0xc8,0xc7,0xc9,0x00,0xc9,0xc8,0xca,0x00,0xca,0xc9,0xcb,0x00,0xcb,0xcb,0xcc,0x00,0xcc,0xcc,0xcd,0x00,\n\t0xcd,0xcd,0xce,0x00,0xce,0xce,0xcf,0x00,0xcf,0xcf,0xd0,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,\n\t0xd5,0xd5,0xd6,0x00,0xd6,0xd6,0xd7,0x00,0xd8,0xd8,0xd9,0x00,0xd9,0xd9,0xda,0x00,0xda,0xda,0xdb,0x00,0xdb,0xdb,0xdc,0x00,0xdc,0xdc,0xdd,0x00,0xdd,0xdd,0xde,0x00,\n\t0xde,0xde,0xdf,0x00,0xdf,0xdf,0xe0,0x00,0xe0,0xe1,0xe1,0x00,0xe1,0xe2,0xe2,0x00,0xe2,0xe3,0xe3,0x00,0xe3,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xee,0xee,0xee,0x00,0xef,0xef,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfb,0xfa,0xfb,0x00,0xfc,0xfb,0xfc,0x00,0xfd,0xfc,0xfd,0x00,0xfe,0xfd,0xfe,0x00,0xfe,0xfe,0xfe,0x00,0xff,0xfe,0xff,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x08,0x08,0x08,0x00,0x0e,0x09,0x0c,0x00,0x0f,0x0a,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x16,0x18,0x00,0x18,0x16,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1d,0x00,\n\t0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x21,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x23,0x21,0x23,0x00,0x23,0x22,0x23,0x00,0x24,0x22,0x24,0x00,\n\t0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2e,0x2e,0x2f,0x00,0x2f,0x2f,0x30,0x00,0x30,0x30,0x31,0x00,0x31,0x30,0x33,0x00,0x32,0x31,0x34,0x00,\n\t0x33,0x32,0x35,0x00,0x34,0x33,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3d,0x00,\n\t0x3c,0x3b,0x3e,0x00,0x3d,0x3c,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x44,0x46,0x00,0x46,0x45,0x47,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x4f,0x51,0x00,0x51,0x50,0x52,0x00,0x52,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x55,0x57,0x00,0x56,0x55,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,\n\t0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,\n\t0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x68,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6c,0x6f,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6e,0x71,0x00,0x70,0x6f,0x72,0x00,0x71,0x70,0x73,0x00,0x72,0x71,0x74,0x00,0x73,0x72,0x75,0x00,0x74,0x74,0x76,0x00,0x76,0x75,0x77,0x00,\n\t0x77,0x76,0x78,0x00,0x78,0x77,0x79,0x00,0x79,0x78,0x7b,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,\n\t0x7f,0x7f,0x81,0x00,0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,0x83,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x88,0x00,0x86,0x86,0x89,0x00,\n\t0x87,0x87,0x8a,0x00,0x88,0x88,0x8b,0x00,0x8a,0x89,0x8c,0x00,0x8b,0x8a,0x8d,0x00,0x8c,0x8b,0x8e,0x00,0x8d,0x8c,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x96,0x00,0x95,0x94,0x97,0x00,0x96,0x95,0x98,0x00,0x97,0x96,0x99,0x00,0x98,0x98,0x9a,0x00,\n\t0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9d,0x00,0x9e,0x9d,0x9e,0x00,0x9f,0x9e,0x9f,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,\n\t0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa5,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xab,0x00,\n\t0xaa,0xaa,0xac,0x00,0xab,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb2,0xb3,0x00,\n\t0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb8,0x00,0xb7,0xb7,0xb9,0x00,0xb8,0xb8,0xba,0x00,0xba,0xb9,0xbb,0x00,0xbb,0xba,0xbb,0x00,\n\t0xbc,0xbb,0xbc,0x00,0xbd,0xbc,0xbd,0x00,0xbe,0xbd,0xbf,0x00,0xbf,0xbf,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,\n\t0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc8,0xc7,0xc9,0x00,0xc9,0xc8,0xca,0x00,0xca,0xc9,0xcb,0x00,0xcb,0xca,0xcc,0x00,0xcc,0xcc,0xcd,0x00,\n\t0xcd,0xcd,0xce,0x00,0xce,0xce,0xcf,0x00,0xcf,0xcf,0xd0,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,\n\t0xd5,0xd5,0xd6,0x00,0xd6,0xd6,0xd7,0x00,0xd7,0xd7,0xd8,0x00,0xd9,0xd9,0xda,0x00,0xda,0xda,0xdb,0x00,0xdb,0xdb,0xdc,0x00,0xdc,0xdc,0xdd,0x00,0xdd,0xdd,0xde,0x00,\n\t0xde,0xde,0xdf,0x00,0xdf,0xdf,0xe0,0x00,0xe0,0xe0,0xe1,0x00,0xe1,0xe2,0xe2,0x00,0xe2,0xe3,0xe3,0x00,0xe3,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xef,0xef,0xef,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfc,0xfb,0xfc,0x00,0xfd,0xfc,0xfd,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x0e,0x09,0x0c,0x00,0x0f,0x0a,0x0d,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x14,0x16,0x00,\n\t0x16,0x15,0x17,0x00,0x17,0x15,0x18,0x00,0x18,0x16,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1d,0x00,\n\t0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x22,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x22,0x24,0x00,\n\t0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x30,0x2f,0x32,0x00,0x31,0x30,0x33,0x00,0x32,0x31,0x34,0x00,\n\t0x33,0x32,0x35,0x00,0x34,0x33,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,\n\t0x3c,0x3b,0x3e,0x00,0x3d,0x3c,0x3f,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x44,0x46,0x00,0x46,0x45,0x47,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x4f,0x51,0x00,0x51,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x53,0x55,0x00,\n\t0x54,0x54,0x56,0x00,0x55,0x54,0x57,0x00,0x56,0x55,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,\n\t0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x61,0x60,0x63,0x00,0x62,0x61,0x64,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,\n\t0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x69,0x6b,0x00,0x6a,0x6a,0x6c,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6c,0x6f,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6e,0x71,0x00,0x70,0x6f,0x72,0x00,0x71,0x70,0x73,0x00,0x72,0x71,0x74,0x00,0x73,0x72,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,\n\t0x77,0x76,0x78,0x00,0x78,0x77,0x79,0x00,0x79,0x78,0x7b,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,\n\t0x7f,0x7f,0x81,0x00,0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,0x84,0x83,0x85,0x00,0x85,0x84,0x86,0x00,0x86,0x85,0x88,0x00,0x87,0x86,0x89,0x00,\n\t0x88,0x87,0x8a,0x00,0x89,0x88,0x8b,0x00,0x8a,0x89,0x8c,0x00,0x8b,0x8a,0x8d,0x00,0x8c,0x8b,0x8e,0x00,0x8d,0x8c,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x97,0x00,0x96,0x95,0x98,0x00,0x97,0x96,0x99,0x00,0x98,0x97,0x9a,0x00,\n\t0x99,0x99,0x9b,0x00,0x9a,0x9a,0x9c,0x00,0x9c,0x9b,0x9d,0x00,0x9d,0x9c,0x9e,0x00,0x9e,0x9d,0x9f,0x00,0x9f,0x9e,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa1,0xa0,0xa2,0x00,\n\t0xa2,0xa1,0xa3,0x00,0xa3,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa6,0xa7,0x00,0xa7,0xa7,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,\n\t0xaa,0xaa,0xac,0x00,0xab,0xab,0xad,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,\n\t0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb9,0x00,0xb8,0xb8,0xba,0x00,0xba,0xb9,0xbb,0x00,0xbb,0xba,0xbc,0x00,\n\t0xbc,0xbb,0xbd,0x00,0xbd,0xbc,0xbe,0x00,0xbe,0xbd,0xbf,0x00,0xbf,0xbe,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,\n\t0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc9,0xc8,0xca,0x00,0xca,0xc9,0xcb,0x00,0xcb,0xca,0xcc,0x00,0xcc,0xcb,0xcd,0x00,\n\t0xcd,0xcd,0xce,0x00,0xce,0xce,0xcf,0x00,0xcf,0xcf,0xd0,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,\n\t0xd5,0xd5,0xd6,0x00,0xd6,0xd6,0xd7,0x00,0xd7,0xd7,0xd8,0x00,0xd8,0xd8,0xd9,0x00,0xda,0xda,0xdb,0x00,0xdb,0xdb,0xdc,0x00,0xdc,0xdc,0xdd,0x00,0xdd,0xdd,0xde,0x00,\n\t0xde,0xde,0xdf,0x00,0xdf,0xdf,0xe0,0x00,0xe0,0xe0,0xe1,0x00,0xe1,0xe1,0xe2,0x00,0xe2,0xe3,0xe3,0x00,0xe3,0xe4,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,\n\t0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf1,0x00,0xf2,0xf2,0xf2,0x00,0xf3,0xf3,0xf3,0x00,0xf4,0xf4,0xf4,0x00,0xf5,0xf5,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfd,0xfc,0xfd,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x0e,0x09,0x0b,0x00,0x0f,0x0a,0x0c,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x13,0x16,0x00,\n\t0x16,0x14,0x17,0x00,0x17,0x15,0x18,0x00,0x18,0x16,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1a,0x1d,0x00,\n\t0x1d,0x1b,0x1e,0x00,0x1e,0x1c,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x22,0x24,0x00,\n\t0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2d,0x30,0x00,0x30,0x2e,0x31,0x00,0x31,0x2f,0x32,0x00,0x31,0x30,0x33,0x00,0x32,0x31,0x34,0x00,\n\t0x33,0x32,0x35,0x00,0x34,0x33,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,\n\t0x3c,0x3b,0x3d,0x00,0x3d,0x3c,0x3e,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x44,0x46,0x00,0x46,0x45,0x47,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x52,0x55,0x00,\n\t0x54,0x53,0x56,0x00,0x55,0x54,0x57,0x00,0x56,0x55,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,\n\t0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,\n\t0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6c,0x6f,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6e,0x71,0x00,0x70,0x6f,0x72,0x00,0x71,0x70,0x73,0x00,0x72,0x71,0x74,0x00,0x73,0x72,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,\n\t0x76,0x76,0x78,0x00,0x77,0x77,0x79,0x00,0x79,0x78,0x7b,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,\n\t0x7f,0x7f,0x81,0x00,0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x86,0x85,0x88,0x00,0x87,0x86,0x89,0x00,\n\t0x88,0x87,0x8a,0x00,0x89,0x88,0x8b,0x00,0x8a,0x89,0x8c,0x00,0x8a,0x8a,0x8d,0x00,0x8b,0x8b,0x8e,0x00,0x8d,0x8c,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,\n\t0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,0x9c,0x9a,0x9d,0x00,0x9d,0x9b,0x9e,0x00,0x9e,0x9c,0x9f,0x00,0x9f,0x9d,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,\n\t0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,\n\t0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,\n\t0xb3,0xb2,0xb4,0x00,0xb4,0xb3,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xba,0xb9,0xbb,0x00,0xbb,0xba,0xbc,0x00,\n\t0xbc,0xbb,0xbd,0x00,0xbd,0xbc,0xbe,0x00,0xbe,0xbd,0xbf,0x00,0xbf,0xbe,0xc0,0x00,0xc0,0xbf,0xc1,0x00,0xc1,0xc0,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,\n\t0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xcb,0xca,0xcc,0x00,0xcc,0xcb,0xcd,0x00,\n\t0xcd,0xcc,0xce,0x00,0xce,0xcd,0xcf,0x00,0xcf,0xcf,0xd0,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,\n\t0xd5,0xd5,0xd6,0x00,0xd6,0xd6,0xd7,0x00,0xd7,0xd7,0xd8,0x00,0xd8,0xd8,0xd9,0x00,0xd9,0xd9,0xda,0x00,0xda,0xda,0xdb,0x00,0xdc,0xdc,0xdd,0x00,0xdd,0xdd,0xde,0x00,\n\t0xde,0xde,0xdf,0x00,0xdf,0xdf,0xe0,0x00,0xe0,0xe0,0xe1,0x00,0xe1,0xe1,0xe2,0x00,0xe2,0xe2,0xe3,0x00,0xe3,0xe3,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,\n\t0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf2,0x00,0xf2,0xf2,0xf3,0x00,0xf3,0xf3,0xf4,0x00,0xf4,0xf4,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf6,0x00,\n\t0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x0e,0x09,0x0b,0x00,0x0f,0x0a,0x0c,0x00,0x10,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x13,0x16,0x00,\n\t0x16,0x14,0x17,0x00,0x17,0x15,0x18,0x00,0x18,0x16,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1a,0x1d,0x00,\n\t0x1d,0x1b,0x1e,0x00,0x1e,0x1c,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x22,0x24,0x00,\n\t0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2d,0x30,0x00,0x30,0x2e,0x31,0x00,0x31,0x2f,0x32,0x00,0x32,0x30,0x33,0x00,0x32,0x31,0x34,0x00,\n\t0x33,0x32,0x35,0x00,0x34,0x33,0x36,0x00,0x35,0x35,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,\n\t0x3c,0x3b,0x3d,0x00,0x3d,0x3c,0x3e,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x44,0x46,0x00,0x46,0x45,0x47,0x00,0x47,0x47,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x51,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x52,0x55,0x00,\n\t0x54,0x53,0x56,0x00,0x55,0x54,0x57,0x00,0x56,0x55,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,\n\t0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,\n\t0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6c,0x6b,0x6e,0x00,0x6d,0x6c,0x6f,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6e,0x71,0x00,0x70,0x6f,0x72,0x00,0x71,0x70,0x73,0x00,0x72,0x71,0x74,0x00,0x73,0x72,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,\n\t0x76,0x76,0x78,0x00,0x77,0x77,0x79,0x00,0x79,0x78,0x7b,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,\n\t0x7f,0x7f,0x81,0x00,0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x86,0x85,0x88,0x00,0x87,0x86,0x89,0x00,\n\t0x88,0x87,0x8a,0x00,0x89,0x88,0x8b,0x00,0x8a,0x89,0x8c,0x00,0x8a,0x8a,0x8d,0x00,0x8b,0x8b,0x8e,0x00,0x8d,0x8c,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,\n\t0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,0x9c,0x9a,0x9d,0x00,0x9d,0x9b,0x9e,0x00,0x9e,0x9c,0x9f,0x00,0x9f,0x9d,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,\n\t0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,\n\t0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,\n\t0xb3,0xb2,0xb4,0x00,0xb4,0xb3,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xba,0xb9,0xbb,0x00,0xbb,0xba,0xbc,0x00,\n\t0xbc,0xbb,0xbd,0x00,0xbd,0xbc,0xbe,0x00,0xbe,0xbd,0xbf,0x00,0xbf,0xbe,0xc0,0x00,0xc0,0xbf,0xc1,0x00,0xc1,0xc0,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,\n\t0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xcb,0xca,0xcc,0x00,0xcc,0xcb,0xcd,0x00,\n\t0xcd,0xcc,0xce,0x00,0xce,0xcd,0xcf,0x00,0xcf,0xcf,0xd0,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,\n\t0xd5,0xd5,0xd6,0x00,0xd6,0xd6,0xd7,0x00,0xd7,0xd7,0xd8,0x00,0xd8,0xd8,0xd9,0x00,0xd9,0xd9,0xda,0x00,0xda,0xda,0xdb,0x00,0xdc,0xdc,0xdd,0x00,0xdd,0xdd,0xde,0x00,\n\t0xde,0xde,0xdf,0x00,0xdf,0xdf,0xe0,0x00,0xe0,0xe0,0xe1,0x00,0xe1,0xe1,0xe2,0x00,0xe2,0xe2,0xe3,0x00,0xe3,0xe3,0xe4,0x00,0xe5,0xe5,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,\n\t0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf2,0x00,0xf2,0xf2,0xf3,0x00,0xf3,0xf3,0xf4,0x00,0xf4,0xf4,0xf5,0x00,0xf6,0xf6,0xf6,0x00,0xf7,0xf7,0xf6,0x00,\n\t0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x0e,0x09,0x0b,0x00,0x0f,0x0a,0x0c,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x13,0x16,0x00,\n\t0x16,0x14,0x17,0x00,0x17,0x15,0x18,0x00,0x18,0x16,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1a,0x1d,0x00,\n\t0x1d,0x1b,0x1e,0x00,0x1e,0x1c,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x20,0x00,0x21,0x20,0x21,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x22,0x24,0x00,\n\t0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2d,0x30,0x00,0x30,0x2e,0x31,0x00,0x31,0x2f,0x32,0x00,0x32,0x30,0x33,0x00,0x32,0x31,0x34,0x00,\n\t0x33,0x32,0x35,0x00,0x34,0x33,0x36,0x00,0x35,0x34,0x37,0x00,0x36,0x36,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,\n\t0x3c,0x3b,0x3d,0x00,0x3d,0x3c,0x3e,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x44,0x46,0x00,0x46,0x45,0x47,0x00,0x47,0x46,0x49,0x00,0x48,0x48,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x50,0x00,0x4f,0x4f,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x52,0x55,0x00,\n\t0x54,0x53,0x56,0x00,0x55,0x54,0x57,0x00,0x56,0x55,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,\n\t0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x5f,0x62,0x00,0x61,0x60,0x63,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,\n\t0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6d,0x6c,0x6f,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6e,0x71,0x00,0x70,0x6f,0x72,0x00,0x71,0x70,0x73,0x00,0x72,0x71,0x74,0x00,0x73,0x72,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,\n\t0x76,0x76,0x78,0x00,0x77,0x77,0x79,0x00,0x79,0x78,0x7b,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,\n\t0x7f,0x7f,0x81,0x00,0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x87,0x86,0x89,0x00,\n\t0x88,0x87,0x8a,0x00,0x89,0x88,0x8b,0x00,0x89,0x89,0x8c,0x00,0x8a,0x8a,0x8d,0x00,0x8b,0x8b,0x8e,0x00,0x8d,0x8c,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,\n\t0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9d,0x00,0x9d,0x9b,0x9e,0x00,0x9e,0x9c,0x9f,0x00,0x9f,0x9d,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,\n\t0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,\n\t0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,\n\t0xb3,0xb2,0xb4,0x00,0xb4,0xb3,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xba,0xb9,0xba,0x00,0xbb,0xba,0xbc,0x00,\n\t0xbc,0xbb,0xbd,0x00,0xbd,0xbc,0xbe,0x00,0xbe,0xbd,0xbf,0x00,0xbf,0xbe,0xc0,0x00,0xc0,0xbf,0xc1,0x00,0xc1,0xc0,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,\n\t0xc4,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcd,0x00,\n\t0xcd,0xcc,0xce,0x00,0xce,0xcd,0xcf,0x00,0xcf,0xce,0xd0,0x00,0xd0,0xd0,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,\n\t0xd5,0xd5,0xd6,0x00,0xd6,0xd6,0xd7,0x00,0xd7,0xd7,0xd8,0x00,0xd8,0xd8,0xd9,0x00,0xd9,0xd9,0xda,0x00,0xda,0xda,0xdb,0x00,0xdc,0xdc,0xdd,0x00,0xdd,0xdd,0xde,0x00,\n\t0xde,0xde,0xdf,0x00,0xdf,0xdf,0xe0,0x00,0xe0,0xe0,0xe1,0x00,0xe1,0xe1,0xe2,0x00,0xe2,0xe2,0xe3,0x00,0xe3,0xe3,0xe4,0x00,0xe5,0xe4,0xe5,0x00,0xe6,0xe6,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,\n\t0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf2,0x00,0xf2,0xf2,0xf3,0x00,0xf3,0xf3,0xf4,0x00,0xf4,0xf4,0xf5,0x00,0xf5,0xf6,0xf6,0x00,0xf7,0xf7,0xf6,0x00,\n\t0xf8,0xf8,0xf7,0x00,0xf9,0xf9,0xf8,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x0e,0x09,0x0c,0x00,0x0e,0x0a,0x0d,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x13,0x16,0x00,\n\t0x16,0x14,0x17,0x00,0x17,0x15,0x18,0x00,0x18,0x16,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1d,0x00,\n\t0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x22,0x00,0x23,0x22,0x23,0x00,0x24,0x22,0x24,0x00,\n\t0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x28,0x00,0x29,0x27,0x29,0x00,0x2a,0x28,0x2a,0x00,0x2b,0x29,0x2b,0x00,0x2b,0x2a,0x2c,0x00,\n\t0x2c,0x2b,0x2d,0x00,0x2d,0x2c,0x2e,0x00,0x2e,0x2d,0x2f,0x00,0x2f,0x2e,0x30,0x00,0x30,0x2f,0x31,0x00,0x31,0x2f,0x32,0x00,0x32,0x30,0x33,0x00,0x32,0x31,0x34,0x00,\n\t0x33,0x32,0x35,0x00,0x34,0x33,0x36,0x00,0x35,0x34,0x37,0x00,0x36,0x35,0x38,0x00,0x37,0x37,0x39,0x00,0x38,0x38,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,\n\t0x3c,0x3b,0x3d,0x00,0x3d,0x3c,0x3e,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x44,0x46,0x00,0x46,0x45,0x47,0x00,0x47,0x46,0x49,0x00,0x48,0x47,0x4a,0x00,0x49,0x49,0x4b,0x00,0x4a,0x4a,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4e,0x00,\n\t0x4d,0x4d,0x4f,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x52,0x55,0x00,\n\t0x54,0x53,0x56,0x00,0x55,0x54,0x57,0x00,0x56,0x55,0x58,0x00,0x57,0x56,0x59,0x00,0x58,0x57,0x5a,0x00,0x59,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,\n\t0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x5f,0x5e,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,\n\t0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,\n\t0x6e,0x6d,0x70,0x00,0x6f,0x6e,0x71,0x00,0x70,0x6f,0x72,0x00,0x71,0x70,0x73,0x00,0x72,0x71,0x74,0x00,0x73,0x72,0x75,0x00,0x74,0x74,0x76,0x00,0x75,0x75,0x77,0x00,\n\t0x77,0x76,0x78,0x00,0x78,0x77,0x79,0x00,0x79,0x78,0x7b,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,\n\t0x7f,0x7f,0x81,0x00,0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,\n\t0x88,0x87,0x8a,0x00,0x88,0x88,0x8b,0x00,0x89,0x89,0x8c,0x00,0x8a,0x8a,0x8d,0x00,0x8b,0x8b,0x8e,0x00,0x8d,0x8c,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x98,0x97,0x99,0x00,\n\t0x99,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9d,0x00,0x9d,0x9b,0x9e,0x00,0x9e,0x9c,0x9f,0x00,0x9f,0x9d,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,\n\t0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,\n\t0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb1,0xb3,0x00,\n\t0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xba,0xb9,0xba,0x00,0xbb,0xba,0xbb,0x00,\n\t0xbc,0xbb,0xbd,0x00,0xbd,0xbc,0xbe,0x00,0xbe,0xbd,0xbf,0x00,0xbf,0xbe,0xc0,0x00,0xc0,0xc0,0xc1,0x00,0xc1,0xc1,0xc2,0x00,0xc2,0xc2,0xc3,0x00,0xc3,0xc3,0xc4,0x00,\n\t0xc5,0xc4,0xc5,0x00,0xc5,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,\n\t0xcd,0xcc,0xce,0x00,0xce,0xcd,0xcf,0x00,0xcf,0xce,0xd0,0x00,0xd0,0xcf,0xd1,0x00,0xd1,0xd1,0xd2,0x00,0xd2,0xd2,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,\n\t0xd5,0xd5,0xd6,0x00,0xd6,0xd6,0xd7,0x00,0xd7,0xd7,0xd8,0x00,0xd8,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdc,0xdd,0x00,0xdd,0xdd,0xde,0x00,\n\t0xde,0xde,0xdf,0x00,0xdf,0xdf,0xe0,0x00,0xe0,0xe0,0xe1,0x00,0xe1,0xe1,0xe2,0x00,0xe2,0xe2,0xe3,0x00,0xe3,0xe3,0xe4,0x00,0xe5,0xe4,0xe5,0x00,0xe6,0xe5,0xe6,0x00,\n\t0xe7,0xe7,0xe7,0x00,0xe8,0xe8,0xe8,0x00,0xe9,0xe9,0xe9,0x00,0xea,0xea,0xea,0x00,0xeb,0xeb,0xeb,0x00,0xec,0xec,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,\n\t0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf2,0x00,0xf2,0xf2,0xf3,0x00,0xf3,0xf3,0xf4,0x00,0xf4,0xf4,0xf5,0x00,0xf5,0xf6,0xf6,0x00,0xf6,0xf7,0xf7,0x00,\n\t0xf8,0xf8,0xf8,0x00,0xf9,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x02,0x02,0x02,0x00,0x03,0x03,0x03,0x00,\n\t0x04,0x04,0x04,0x00,0x05,0x05,0x05,0x00,0x06,0x06,0x06,0x00,0x07,0x07,0x07,0x00,0x0d,0x09,0x0c,0x00,0x0e,0x0a,0x0d,0x00,0x0f,0x0c,0x0e,0x00,0x10,0x0d,0x0f,0x00,\n\t0x11,0x0e,0x10,0x00,0x12,0x0f,0x11,0x00,0x12,0x10,0x12,0x00,0x13,0x10,0x12,0x00,0x13,0x11,0x13,0x00,0x14,0x12,0x14,0x00,0x15,0x13,0x15,0x00,0x15,0x13,0x16,0x00,\n\t0x16,0x14,0x17,0x00,0x17,0x15,0x18,0x00,0x18,0x16,0x19,0x00,0x18,0x17,0x1a,0x00,0x19,0x18,0x1b,0x00,0x1a,0x19,0x1c,0x00,0x1b,0x1a,0x1d,0x00,0x1c,0x1b,0x1d,0x00,\n\t0x1d,0x1c,0x1e,0x00,0x1e,0x1d,0x1f,0x00,0x1f,0x1e,0x20,0x00,0x20,0x1f,0x21,0x00,0x21,0x20,0x22,0x00,0x22,0x21,0x23,0x00,0x23,0x22,0x23,0x00,0x24,0x22,0x24,0x00,\n\t0x25,0x23,0x25,0x00,0x26,0x24,0x26,0x00,0x27,0x25,0x27,0x00,0x28,0x26,0x27,0x00,0x29,0x27,0x28,0x00,0x2a,0x28,0x29,0x00,0x2b,0x29,0x2a,0x00,0x2b,0x2a,0x2b,0x00,\n\t0x2c,0x2b,0x2c,0x00,0x2d,0x2c,0x2d,0x00,0x2e,0x2d,0x2e,0x00,0x2f,0x2e,0x2f,0x00,0x30,0x2f,0x30,0x00,0x31,0x30,0x31,0x00,0x32,0x30,0x32,0x00,0x32,0x31,0x33,0x00,\n\t0x33,0x32,0x34,0x00,0x34,0x33,0x35,0x00,0x35,0x34,0x37,0x00,0x36,0x35,0x38,0x00,0x37,0x36,0x39,0x00,0x38,0x37,0x3a,0x00,0x3a,0x39,0x3b,0x00,0x3b,0x3a,0x3c,0x00,\n\t0x3c,0x3b,0x3d,0x00,0x3d,0x3c,0x3e,0x00,0x3e,0x3e,0x40,0x00,0x3f,0x3f,0x41,0x00,0x40,0x40,0x42,0x00,0x41,0x41,0x43,0x00,0x43,0x42,0x44,0x00,0x44,0x43,0x45,0x00,\n\t0x45,0x44,0x46,0x00,0x46,0x45,0x47,0x00,0x47,0x46,0x49,0x00,0x48,0x47,0x4a,0x00,0x49,0x48,0x4b,0x00,0x4a,0x49,0x4c,0x00,0x4b,0x4b,0x4d,0x00,0x4c,0x4c,0x4d,0x00,\n\t0x4d,0x4d,0x4e,0x00,0x4e,0x4e,0x4f,0x00,0x4f,0x4f,0x50,0x00,0x4f,0x4f,0x51,0x00,0x50,0x50,0x52,0x00,0x51,0x51,0x53,0x00,0x52,0x52,0x54,0x00,0x53,0x52,0x54,0x00,\n\t0x54,0x53,0x55,0x00,0x55,0x54,0x56,0x00,0x56,0x55,0x58,0x00,0x56,0x56,0x59,0x00,0x57,0x57,0x5a,0x00,0x58,0x58,0x5b,0x00,0x5a,0x59,0x5c,0x00,0x5b,0x5a,0x5d,0x00,\n\t0x5c,0x5b,0x5e,0x00,0x5d,0x5c,0x5f,0x00,0x5e,0x5d,0x60,0x00,0x5f,0x5f,0x61,0x00,0x60,0x60,0x62,0x00,0x61,0x61,0x63,0x00,0x63,0x62,0x65,0x00,0x64,0x63,0x66,0x00,\n\t0x65,0x64,0x67,0x00,0x66,0x65,0x68,0x00,0x67,0x66,0x69,0x00,0x68,0x67,0x6a,0x00,0x69,0x68,0x6b,0x00,0x6a,0x69,0x6c,0x00,0x6b,0x6a,0x6d,0x00,0x6c,0x6b,0x6e,0x00,\n\t0x6d,0x6c,0x6f,0x00,0x6e,0x6d,0x70,0x00,0x70,0x6f,0x72,0x00,0x71,0x70,0x73,0x00,0x72,0x71,0x74,0x00,0x73,0x72,0x75,0x00,0x74,0x74,0x76,0x00,0x76,0x75,0x77,0x00,\n\t0x77,0x76,0x78,0x00,0x78,0x77,0x79,0x00,0x79,0x78,0x7b,0x00,0x7a,0x79,0x7c,0x00,0x7b,0x7a,0x7d,0x00,0x7c,0x7b,0x7e,0x00,0x7d,0x7d,0x7f,0x00,0x7e,0x7e,0x80,0x00,\n\t0x7f,0x7f,0x81,0x00,0x80,0x80,0x82,0x00,0x81,0x81,0x83,0x00,0x82,0x82,0x84,0x00,0x83,0x83,0x85,0x00,0x84,0x84,0x86,0x00,0x85,0x85,0x87,0x00,0x86,0x86,0x88,0x00,\n\t0x87,0x87,0x89,0x00,0x88,0x88,0x8a,0x00,0x89,0x89,0x8c,0x00,0x8a,0x8a,0x8d,0x00,0x8b,0x8b,0x8e,0x00,0x8d,0x8c,0x8f,0x00,0x8e,0x8e,0x90,0x00,0x90,0x8f,0x91,0x00,\n\t0x91,0x90,0x92,0x00,0x92,0x91,0x93,0x00,0x93,0x92,0x94,0x00,0x94,0x93,0x95,0x00,0x95,0x94,0x96,0x00,0x96,0x95,0x97,0x00,0x97,0x96,0x98,0x00,0x97,0x97,0x99,0x00,\n\t0x98,0x98,0x9a,0x00,0x9a,0x99,0x9b,0x00,0x9b,0x9a,0x9d,0x00,0x9d,0x9b,0x9e,0x00,0x9e,0x9c,0x9f,0x00,0x9f,0x9d,0xa0,0x00,0xa0,0x9f,0xa1,0x00,0xa0,0xa0,0xa2,0x00,\n\t0xa1,0xa1,0xa3,0x00,0xa2,0xa2,0xa4,0x00,0xa4,0xa3,0xa5,0x00,0xa5,0xa4,0xa6,0x00,0xa6,0xa5,0xa7,0x00,0xa7,0xa6,0xa8,0x00,0xa8,0xa8,0xa9,0x00,0xa9,0xa9,0xaa,0x00,\n\t0xaa,0xaa,0xab,0x00,0xab,0xab,0xac,0x00,0xad,0xac,0xae,0x00,0xae,0xad,0xaf,0x00,0xaf,0xae,0xb0,0x00,0xb0,0xaf,0xb1,0x00,0xb1,0xb0,0xb2,0x00,0xb2,0xb2,0xb3,0x00,\n\t0xb3,0xb3,0xb4,0x00,0xb4,0xb4,0xb5,0x00,0xb5,0xb5,0xb6,0x00,0xb6,0xb6,0xb7,0x00,0xb7,0xb7,0xb8,0x00,0xb8,0xb8,0xb9,0x00,0xba,0xb9,0xba,0x00,0xbb,0xba,0xbb,0x00,\n\t0xbc,0xbb,0xbc,0x00,0xbd,0xbc,0xbd,0x00,0xbe,0xbd,0xbe,0x00,0xbf,0xbf,0xbf,0x00,0xc0,0xc0,0xc0,0x00,0xc1,0xc1,0xc1,0x00,0xc2,0xc2,0xc3,0x00,0xc4,0xc3,0xc4,0x00,\n\t0xc5,0xc4,0xc5,0x00,0xc6,0xc5,0xc6,0x00,0xc6,0xc6,0xc7,0x00,0xc7,0xc7,0xc8,0x00,0xc8,0xc8,0xc9,0x00,0xc9,0xc9,0xca,0x00,0xcb,0xca,0xcb,0x00,0xcc,0xcb,0xcc,0x00,\n\t0xcd,0xcc,0xcd,0x00,0xce,0xcd,0xce,0x00,0xcf,0xce,0xd0,0x00,0xd0,0xcf,0xd1,0x00,0xd1,0xd0,0xd2,0x00,0xd2,0xd1,0xd3,0x00,0xd3,0xd3,0xd4,0x00,0xd4,0xd4,0xd5,0x00,\n\t0xd5,0xd5,0xd6,0x00,0xd6,0xd6,0xd7,0x00,0xd7,0xd7,0xd8,0x00,0xd9,0xd8,0xd9,0x00,0xda,0xd9,0xda,0x00,0xdb,0xda,0xdb,0x00,0xdc,0xdc,0xdd,0x00,0xdd,0xdd,0xde,0x00,\n\t0xde,0xde,0xdf,0x00,0xdf,0xdf,0xe0,0x00,0xe0,0xe0,0xe1,0x00,0xe1,0xe1,0xe2,0x00,0xe2,0xe2,0xe3,0x00,0xe3,0xe3,0xe4,0x00,0xe5,0xe4,0xe5,0x00,0xe6,0xe5,0xe6,0x00,\n\t0xe7,0xe6,0xe7,0x00,0xe8,0xe7,0xe8,0x00,0xe9,0xe8,0xe9,0x00,0xe9,0xe9,0xea,0x00,0xea,0xea,0xeb,0x00,0xeb,0xeb,0xec,0x00,0xed,0xed,0xed,0x00,0xee,0xee,0xee,0x00,\n\t0xef,0xef,0xef,0x00,0xf0,0xf0,0xf0,0x00,0xf1,0xf1,0xf2,0x00,0xf2,0xf2,0xf3,0x00,0xf3,0xf3,0xf4,0x00,0xf4,0xf4,0xf5,0x00,0xf5,0xf6,0xf6,0x00,0xf6,0xf7,0xf7,0x00,\n\t0xf7,0xf8,0xf8,0x00,0xf8,0xf9,0xf9,0x00,0xfa,0xfa,0xfa,0x00,0xfb,0xfb,0xfb,0x00,0xfc,0xfc,0xfc,0x00,0xfd,0xfd,0xfd,0x00,0xfd,0xfd,0xfd,0x00,0xfe,0xfe,0xfe,0x00\n};\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Displays/OVR_Display.cpp",
    "content": "/************************************************************************************\n\nPublicHeader:   None\nFilename    :   OVR_Display.cpp\nContent     :   Common implementation for display device\nCreated     :   May 6, 2014\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_Display.h\"\n\n\nnamespace OVR {\n\n\n// Place platform-independent code here\n\nstatic bool DirectDisplayInitialized = false;\n\nbool Display::GetDirectDisplayInitialized()\n{\n    return DirectDisplayInitialized;\n}\n\nvoid Display::SetDirectDisplayInitialized(bool initialized)\n{\n    DirectDisplayInitialized = initialized;\n}\n\n\n//-----------------------------------------------------------------------------\n// EDID Parsing\n\n// FIXME: This can be done much more compactly without the bitfields.\n#pragma pack(push, 1)\n\n#if defined(_MSC_VER)\n#pragma warning(disable: 4201)  // Nameless struct/union\n#endif\n\n// All of our EDIDs use the Detailed timing descriptors, and not the \n// older Standard timing info in the EDID. Conforming EDID v1.3+ displays\n// always put their preferred resolution, refresh, and timing info into the\n// first Detailed timing descriptor.\n\n#ifndef byte_t\ntypedef unsigned char byte_t;\n#endif\n\n//static const uint32_t EDIDv13Size = 128;              // Standard EDID v1.3 is 128 bytes.\nstatic const uint32_t FirstDetailedTimingOffset = 54; // Detailed timing table starts here.\nstatic const uint32_t DetailedTimingDescriptorCount = 4;\nstatic const byte_t   MonitorSerialNumberType = 0xFF;\nstatic const byte_t   MonitorNameType = 0xFC;\n\n// Expected signature of EDID\nstatic const byte_t EDIDSignature[] = { 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 };\n\nstruct EDID_Header\n{\n    byte_t Signature[8];\n\n    byte_t VendorIDHigh;\n    byte_t VendorIDLow;\n\n    uint16_t ProductCode;\n    uint32_t SerialNumber;\n\n    // We don't currently use anything farther into the header\n    byte_t Unused[112];\n};\n\nstruct EDID_Detailed_Timing_Descriptor\n{\n    uint16_t PixelClock;        // In 10Khz units\n\n    byte_t HActivePixelsLSB;\n    byte_t HBlankingPixelsLSB;\n\n    union\n    {\n        struct\n        {\n            byte_t HBlankingPixelsMSB : 4;\n            byte_t HActivePixelsMSB : 4;\n        } Values;\n        byte_t Value_;\n    } HSizeMSB;\n\n    byte_t VActivePixelsLSB;\n    byte_t VBlankingPixelsLSB;\n    union\n    {\n        struct\n        {\n            byte_t VBlankingPixelsMSB : 4;\n            byte_t VActivePixelsMSB : 4;\n        } Values;\n        byte_t Value_;\n    } VSizeMSB;\n\n    byte_t HSyncOffsetPixelsLSB;\n    byte_t HSyncPulseWidthPixelsLSB;\n\n    union\n    {\n        struct\n        {\n            byte_t VSyncPulseWidthLSB : 4;\n            byte_t VSyncOffsetPixelsLSB : 4;\n        } Values;\n        byte_t Value_;\n    } VSync;\n\n    union\n    {\n        struct\n        {\n            byte_t VSyncPulseWidthMSB : 2;\n            byte_t VSyncOffsetMSB : 2;\n            byte_t HSyncPulseWidthMSB : 2;\n            byte_t HSyncOffsetMSB : 2;\n        } Values;\n        byte_t Value_;\n    } SyncMSB;\n\n    byte_t Unused[6]; // We don't use anything else in the header\n};\n\nstruct EDID_Other_Descriptor\n{\n    byte_t Reserved[3];\n    byte_t Type;\n    byte_t Reserved1;\n    char Data[13];\n};\n\n#pragma pack(pop)\n\n\nstatic void StripTrailingWhitespace(char* str)\n{\n    // Get initial string length\n    int mlen = (int)strlen(str);\n\n    // While removing trailing characters,\n    while (mlen > 0)\n    {\n        // If trailing character should be stripped,\n        char trailing = str[mlen - 1];\n        if (trailing == '\\n' || trailing == ' ')\n        {\n            // Strip it and reduce string length.\n            str[mlen - 1] = '\\0';\n            --mlen;\n        }\n        else\n        {\n            // Stop here.\n            break;\n        }\n    }\n}\n\nbool DisplayEDID::Parse(const unsigned char* edid)\n{\n    const EDID_Header* header = (const EDID_Header*)edid;\n\n    if (memcmp(header->Signature, EDIDSignature, sizeof(EDIDSignature)) != 0)\n    {\n        OVR_ASSERT(false);\n        return false;\n    }\n\n    memset(VendorName,   0, sizeof(VendorName));\n    memset(MonitorName,  0, sizeof(MonitorName));\n    memset(SerialNumber, 0, sizeof(SerialNumber));\n\n    // Extract the 5-bit chars for the Vendor ID (PNP code)\n    uint16_t char1 = (header->VendorIDHigh >> 2) & 0x1F;\n    uint16_t char2 = ((header->VendorIDHigh & 0x2) << 3) | (header->VendorIDLow >> 5);\n    uint16_t char3 = header->VendorIDLow & 0x1F;\n    VendorName[0]  = (char)char1 - 1 + 'A';\n    VendorName[1] = (char)char2 - 1 + 'A';\n    VendorName[2] = (char)char3 - 1 + 'A';\n    VendorName[3]  = '\\0';\n    ModelNumber    = header->ProductCode;\n\n    const EDID_Detailed_Timing_Descriptor* detailedTiming = (const EDID_Detailed_Timing_Descriptor*)&edid[FirstDetailedTimingOffset];\n\n    // First Detailed timing info is always preferred mode:\n    uint32_t hActive   = (detailedTiming->HSizeMSB.Values.HActivePixelsMSB << 8) | detailedTiming->HActivePixelsLSB;\n    uint32_t vActive   = (detailedTiming->VSizeMSB.Values.VActivePixelsMSB << 8) | detailedTiming->VActivePixelsLSB;\n    uint32_t hBlanking = (detailedTiming->HSizeMSB.Values.HBlankingPixelsMSB << 8) | detailedTiming->HBlankingPixelsLSB;\n    uint32_t vBlanking = (detailedTiming->VSizeMSB.Values.VBlankingPixelsMSB << 8) | detailedTiming->VBlankingPixelsLSB;\n\n    // Need to scale up the values, since they're in 10Khz, and we're using integer math without fractions\n    uint32_t denom = 1000;\n    uint32_t totalPixels = (hActive + hBlanking) * (vActive + vBlanking);\n    uint32_t vSyncNumerator = (uint32_t)(((uint64_t)detailedTiming->PixelClock * 10000 * denom) / totalPixels);\n\n    Width  = hActive;\n    Height = vActive;\n\n    RefreshNumerator   = vSyncNumerator;\n    RefreshDenominator = denom;\n\n    // The remaining ones can hold extra info. Look for monitor name & serial number strings.\n    ++detailedTiming;\n    for (int i = 1; i < (int)DetailedTimingDescriptorCount; ++i, ++detailedTiming)\n    {\n        if (detailedTiming->PixelClock == 0)\n        {\n            // Not a timing info, use OtherDescriptor instead\n            const EDID_Other_Descriptor* other = (const EDID_Other_Descriptor*)detailedTiming;\n            switch (other->Type)\n            {\n            case MonitorNameType:\n                static_assert(sizeof(MonitorName) == sizeof(other->Data) + 1, \"serial number field size is off\");\n                memcpy(MonitorName, other->Data, sizeof(MonitorName));\n                MonitorName[sizeof(MonitorName) - 1] = '\\0';\n                StripTrailingWhitespace(MonitorName);\n                break;\n\n            case MonitorSerialNumberType:\n                static_assert(sizeof(SerialNumber) == sizeof(other->Data) + 1, \"serial number field size is off\");\n                memcpy(SerialNumber, other->Data, sizeof(SerialNumber));\n                SerialNumber[sizeof(SerialNumber) - 1] = '\\0';\n                StripTrailingWhitespace(SerialNumber);\n                break;\n\n            default:\n                break;\n            }\n        }\n    }\n\n    return true;\n}\n\nHmdTypeEnum HmdTypeFromModelNumber(int modelNumber)\n{\n    HmdTypeEnum deviceTypeGuess = HmdType_Unknown;\n    switch (modelNumber)\n    {\n    case 3: deviceTypeGuess = HmdType_DK2;       break;\n    case 2: deviceTypeGuess = HmdType_DKHDProto; break;\n    case 1: deviceTypeGuess = HmdType_DK1;       break;\n    default: break;\n    }\n    return deviceTypeGuess;\n}\n\nbool Display::MatchDisplay(const Display* other)\n{\n    // Note this is not checking the DeviceName, which corresponds to which monitor the device is.\n    // This allows matching to match a display that has changed how it is plugged in.\n    // The rotation must match, which allows us to react properly by regenerating the HMD info.\n    bool displayMatch =\n        (DisplayID == other->DisplayID) &&\n        (EdidSerialNumber == other->EdidSerialNumber) &&\n        (NativeResolutionInPixels == other->NativeResolutionInPixels) &&\n        (Rotation == other->Rotation) &&\n        (ApplicationExclusive == other->ApplicationExclusive);\n\n    return displayMatch;\n}\n\n\n} // namespace OVR\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Displays/OVR_Display.h",
    "content": "/************************************************************************************\n\nPublicHeader:   None\nFilename    :   OVR_Display.h\nContent     :   Contains platform independent display management\nCreated     :   May 6, 2014\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Display_h\n#define OVR_Display_h\n\n#include \"Sensors/OVR_DeviceConstants.h\" // Required for HmdTypeEnum\n\n#include \"Kernel/OVR_Types.h\"\n#include \"Kernel/OVR_Atomic.h\"\n#include \"Kernel/OVR_RefCount.h\"\n#include \"Kernel/OVR_Array.h\"\n#include \"Kernel/OVR_String.h\"\n#include \"Extras/OVR_Math.h\"\n#include <stdint.h> // uint32_t\n\nnamespace OVR {\n\n\n\n//-------------------------------------------------------------------------------------\n// DisplayEDID\n//\n// Parses binary EDID information for the pieces we need\nstruct DisplayEDID\n{\n    char VendorName[4];\n    char MonitorName[14];\n    char SerialNumber[14];\n    uint16_t ModelNumber;\n\n    uint32_t Width;\n    uint32_t Height;\n\n    uint32_t RefreshNumerator;\n    uint32_t RefreshDenominator;\n\n    bool Parse(const unsigned char* edid);\n};\n\nHmdTypeEnum HmdTypeFromModelNumber(int modelNumber);\n\n\n//-------------------------------------------------------------------------------------\n// DisplayDesc\n\n// Display information that is enumerable\nstruct DisplayDesc\n{\n    HmdTypeEnum DeviceTypeGuess; // This is a guess about what type of HMD it is connected to\n    char        DisplayID[64];   // This is the device identifier string from MONITORINFO (for app usage)\n    char        ModelName[14];   // This is a \"DK2\" type string\n    char        EdidSerialNumber[14];\n    Sizei       ResolutionInPixels;\n    Vector2i    DesktopDisplayOffset;\n    int         Rotation;\n};\n\n\n//-----------------------------------------------------------------------------\n// Display Search Handle\n//\nclass DisplaySearchHandle\n{\npublic:\n\tDisplaySearchHandle() {}\n\n\tvirtual ~DisplaySearchHandle() {}\n\n\tvoid operator= (const DisplaySearchHandle&) {}\n};\n\n//-------------------------------------------------------------------------------------\n// ***** Display\n\n// Display object describes an Oculus HMD screen in LibOVR, providing information such\n// as EDID serial number and resolution in platform-independent manner.\n//\n// Display is an abstract base class to support OS and driver specific implementations.\n// It support HMD screen enumeration through GetDisplayCount/GetDisplay static functions.\n//\n// Examples of implementations of Display are the following:\n// Display_Win32_Generic - Compatibly mode implementation that maintains operation on\n//\t\t\t\t\t\t   systems without drivers.\n// Display_Win32_Driver  - Driver-Based display\n// Display_OSX_Generic   - Additional compatibility mode implementation for OS X\n\nclass Display : public RefCountBase<Display>\n{\nprotected:\n\tenum MirrorMode\n\t{\n\t\tMirrorEnabled = 0,\n\t\tMirrorDisabled = 1\n\t};\n\n\tMirrorMode mirrorMode;\n\n\tDisplay(\n            HmdTypeEnum deviceTypeGuess,\n#ifdef OVR_OS_MAC\n            uint32_t displayID,\n#else\n\t\t\tconst String& displayID,\n#endif\n\t\t\tconst String& modelName,\n\t\t\tconst String& editSerial,\n            const Sizei& logicalRes,\n\t\t\tconst Sizei& nativeRes,\n\t\t\tconst Vector2i& displayOffset, \n\t\t\tconst uint64_t devNumber,\n\t\t\tconst uint32_t rotation,\n\t\t\tconst bool appExclusive):\n\t\tmirrorMode(MirrorDisabled),\n\t\tDeviceTypeGuess(deviceTypeGuess),\n        DisplayID(displayID),\n\t\tModelName(modelName),\n\t\tEdidSerialNumber(editSerial),\n\t\tLogicalResolutionInPixels(logicalRes),\n\t\tNativeResolutionInPixels(nativeRes),\n\t\tDesktopDisplayOffset(displayOffset),\n\t\tDeviceNumber(devNumber),\n\t\tRotation(rotation),\n\t\tApplicationExclusive(appExclusive)\n    {\n\t}\n\n    void operator = (const Display&) { } // Quiet warning.\n\npublic:\n\tvirtual ~Display() { }\n\n\t// ----- Platform specific static Display functionality -----\n\n\t// Mandatory function that sets up the display environment with\n\t// any necessary shimming and function hooks. This should be one\n\t// of the very first things your application does when it\n\t// initializes LibOVR\n\tstatic bool Initialize();\n    static void Shutdown();\n\n\t// Returns a count of the detected displays. These are Rift displays\n\t// attached directly to an active display port\n\tstatic int          GetDisplayCount( DisplaySearchHandle* handle = NULL, bool extended = true, bool applicationOnly = true, bool extendedEDIDSerials = false );\n\t// Returns a specific index of a display. Displays are sorted in no particular order.\n\tstatic Ptr<Display> GetDisplay( int index = 0, DisplaySearchHandle* handle = NULL ); \n\n\n    // Returns true if we are referencing the same display; useful for matching display\n    // objects with the ones already detected.\n    bool MatchDisplay(const Display* other);\n\n\n\t// ----- Device independent instance based Display functionality -----\n\n    // Device type guess based on display info.\n    const HmdTypeEnum   DeviceTypeGuess;\n#if defined(OVR_OS_MAC)\n    // CGDirectDisplayID for the rift.\n    const uint32_t      DisplayID; \n#else\n\t// A string denoting the display device name so that apps can recognize the monitor\n\tconst String        DisplayID;\n#endif\n    // A literal string containing the name of the model, i.e. Rift DK2\n    const String        ModelName;\n    // Part of the serial number encoded in Edid, used for monitor <-> sensor matching.\n    const String        EdidSerialNumber;\n    // Logical resolution is the display resolution in presentation terms.\n    // That is to say, the resolution that represents the orientation the\n    // display is projected to the user. For DK2, while being a portrait display\n    // the display is held in landscape and therefore the logical resolution\n    // is 1920x1080\n    const Sizei         LogicalResolutionInPixels;\n    // Native resolution is the resolution reported by the EDID and represents the\n    // exact hardware resolution of the Rift. For example, on DK2\n    // this is 1080x1920\n    // In theory, an OS rotated Rift's native and logical resolutions should match\n    const Sizei         NativeResolutionInPixels;\n    // For displays that are attached to the desktop, this return value has meaning.\n    // Otherwise it should always return origin\n    const Vector2i      DesktopDisplayOffset;\n\t// For Windows machines this value stores the ChildUid used to identify this display\n\tconst uint64_t\t    DeviceNumber;\n\t// Stores the device specific default rotation of the screen\n\t// E.g. DK2 is rotated 90 degrees as it is a portrait display\n\tconst uint32_t\t    Rotation;\n\t// Is set if the Display is capable in Application-Only mode\n\tconst bool\t\t\tApplicationExclusive;\n\n\t// Functionality for rendering within the window\n\tvirtual MirrorMode SetMirrorMode( MirrorMode newMode ) = 0;\n\n\t// Functionality for enabling/disabling display\n    virtual bool SetDisplaySleep(bool off)\n    {\n        // Override to implement if supported\n        OVR_UNUSED(off);\n        return false;\n    }\n\n    // Check if right now the current rendering application should be in monitor-extended mode.\n    // If displaySearch is true then this function attempts to discover extended mode devices. Otherwise this \n    // function modifies no data. \n    static bool InCompatibilityMode( bool displaySearch = true );\n\n    // Polls the computer's displays to see if any of them are extended mode Rift devices.\n    static bool ExtendedModeDevicesExist(); \n\n    // Tracks the initialization state of direct mode.\n    static bool GetDirectDisplayInitialized();\n    static void SetDirectDisplayInitialized(bool initialized);\n\n    // Get/set the mode for all applications\n    static bool GetDriverMode(bool& driverInstalled, bool& compatMode, bool& hideDK1Mode);\n    static bool SetDriverMode(bool compatMode, bool hideDK1Mode);\n\n    static DisplaySearchHandle* GetDisplaySearchHandle();\n};\n\n\n} // namespace OVR\n\n#endif\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Displays/OVR_OSX_Display.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_OSX_Display.cpp\nContent     :   OSX-specific Display declarations\nCreated     :   July 2, 2014\nAuthors     :   James Hughes\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include \"OVR_OSX_Display.h\"\n#include \"Kernel/OVR_Log.h\"\n\n#include <ApplicationServices/ApplicationServices.h>\n#include <CoreFoundation/CoreFoundation.h>\n#include <CoreFoundation/CFString.h>\n#include <IOKit/graphics/IOGraphicsLib.h>\n\n//-------------------------------------------------------------------------------------\n// ***** Display enumeration Helpers\n\nnamespace OVR { \n\n// FIXME Code duplication with windows.\n#define EDID_LENGTH                             0x80\n\n#define EDID_HEADER                             0x00\n#define EDID_HEADER_END                         0x07\n\n#define ID_MANUFACTURER_NAME                    0x08\n#define ID_MANUFACTURER_NAME_END                0x09\n\n#define EDID_STRUCT_VERSION                     0x12\n#define EDID_STRUCT_REVISION                    0x13\n\n#define ESTABLISHED_TIMING_1                    0x23\n#define ESTABLISHED_TIMING_2                    0x24\n#define MANUFACTURERS_TIMINGS                   0x25\n\n#define DETAILED_TIMING_DESCRIPTIONS_START      0x36\n#define DETAILED_TIMING_DESCRIPTION_SIZE        18\n#define NO_DETAILED_TIMING_DESCRIPTIONS         4\n\n#define DETAILED_TIMING_DESCRIPTION_1           0x36\n#define DETAILED_TIMING_DESCRIPTION_2           0x48\n#define DETAILED_TIMING_DESCRIPTION_3           0x5a\n#define DETAILED_TIMING_DESCRIPTION_4           0x6c\n\n#define MONITOR_NAME            0xfc\n#define MONITOR_LIMITS          0xfd\n#define MONITOR_SERIAL\t\t\t0xff\n\n#define UNKNOWN_DESCRIPTOR      -1\n#define DETAILED_TIMING_BLOCK   -2\n\n#define DESCRIPTOR_DATA         5\n\nconst UByte edid_v1_header[] = { 0x00, 0xff, 0xff, 0xff,\n\t                            0xff, 0xff, 0xff, 0x00 };\n\nconst UByte edid_v1_descriptor_flag[] = { 0x00, 0x00 };\n\n// FIXME Code duplication with windows. Refactor.\nstatic int blockType( UByte* block )\n{\n\tif ( !strncmp( (const char*)edid_v1_descriptor_flag, (const char*)block, 2 ) )\n\t{\n\t\t// descriptor\n\t\tif ( block[ 2 ] != 0 )\n\t\t\treturn UNKNOWN_DESCRIPTOR;\n\t\treturn block[ 3 ];\n\t}\n    else\n    {\t\t\n\t\treturn DETAILED_TIMING_BLOCK;\n\t}\n}\n\nstatic char* getMonitorName( UByte const* block )\n{\n\tstatic char name[ 13 ];\n\tunsigned    i;\n\tUByte const* ptr = block + DESCRIPTOR_DATA;\n\n\tfor( i = 0; i < 13; i++, ptr++ )\n\t{\n\t\tif ( *ptr == 0xa )\n\t\t{\n\t\t\tname[ i ] = 0;\n\t\t\treturn name;\n\t\t}\n\n\t\tname[ i ] = *ptr;\n\t}\n\n\treturn name;\n}\n\n// FIXME Code duplication with windows. Refactor.\nstatic bool parseEdid( UByte* edid, OVR::OSX::DisplayEDID& edidResult )\n{\n    unsigned i;\n    UByte* block;\n    const char* monitor_name = \"Unknown\";\n    UByte checksum = 0;\n\n    for( i = 0; i < EDID_LENGTH; i++ )\n        checksum += edid[ i ];\n\n    // Bad checksum, fail EDID\n    if (  checksum != 0  )\n        return false;\n\n    if ( strncmp( (const char*)edid+EDID_HEADER, (const char*)edid_v1_header, EDID_HEADER_END+1 ) )\n    {\n        // First bytes don't match EDID version 1 header\n        return false;\n    }\n\n\n    // OVR_DEBUG_LOG_TEXT(( \"\\n# EDID version %d revision %d\\n\",\n    //                     (int)edid[EDID_STRUCT_VERSION],(int)edid[EDID_STRUCT_REVISION] ));\n\n    // Monitor name and timings \n\n    char serialNumber[14];\n    memset( serialNumber, 0, 14 );\n\n    block = edid + DETAILED_TIMING_DESCRIPTIONS_START;\n\n    for( i = 0; i < NO_DETAILED_TIMING_DESCRIPTIONS; i++,\n        block += DETAILED_TIMING_DESCRIPTION_SIZE )\n    {\n\n        if ( blockType( block ) == MONITOR_NAME )\n        {\n            monitor_name = getMonitorName( block );\n        }\n\n        if( blockType( block ) == MONITOR_SERIAL )\n        {\n            memcpy( serialNumber, block + 5, 13 );\n            break;\n        }\n    }\n\n    UByte vendorString[4] = {0};\n\n    vendorString[0] = (edid[8] >> 2 & 31) + 64;\n    vendorString[1] = ((edid[8] & 3) << 3) | (edid[9] >> 5) + 64;\n    vendorString[2] = (edid[9] & 31) + 64;\n\n    edidResult.ModelNumber  = *(UInt16*)&edid[10];\n    edidResult.MonitorName  = OVR::String(monitor_name);\n    edidResult.VendorName   = OVR::String((const char*)vendorString);\n    edidResult.SerialNumber = OVR::String(serialNumber);\n    \n    // printf( \"\\tIdentifier \\\"%s\\\"\\n\", monitor_name );\n    // printf( \"\\tVendorName \\\"%s\\\"\\n\", vendorString );\n    // printf( \"\\tModelName \\\"%s\\\"\\n\", monitor_name );\n    // printf( \"\\tModelNumber %d\\n\", edidResult.ModelNumber );\n    // printf( \"\\tSerialNumber \\\"%s\\\"\\n\", edidResult.SerialNumber.ToCStr() );\n\n    // FIXME: Get timings as well, though they aren't very useful here\n    // except for the vertical refresh rate, presumably\n\n    return true;\n}\n\nstatic int discoverExtendedRifts(OVR::OSX::DisplayDesc* descriptorArray, int inputArraySize, bool edidInfo)\n{\n    OVR_UNUSED(edidInfo);\n    int result = 0;\n\n    static bool reportDiscovery = true;\n    OVR_UNUSED(reportDiscovery);\n\n    CGDirectDisplayID Displays[32];\n    uint32_t NDisplays = 0;\n    CGGetOnlineDisplayList(32, Displays, &NDisplays);\n\n    for (unsigned int i = 0; i < NDisplays; i++)\n    {\n        CGDirectDisplayID dispId = Displays[i];\n\n        io_service_t port = CGDisplayIOServicePort(dispId);\n        CFDictionaryRef DispInfo = IODisplayCreateInfoDictionary(port, kNilOptions);\n\n        // Display[i]\n\n        uint32_t vendor = CGDisplayVendorNumber(dispId);\n        uint32_t product = CGDisplayModelNumber(dispId);\n\n        CGRect desktop = CGDisplayBounds(dispId);\n        Vector2i desktopOffset(desktop.origin.x, desktop.origin.y);\n        \n        if (vendor == 16082 && ( (product == 1)||(product == 2)||(product == 3) ) ) // 7\" or HD\n        {\n            if( result >= inputArraySize )\n            {\n                CFRelease(DispInfo);\n                return result;\n            }\n\n            int width  = static_cast<int>(CGDisplayPixelsWide(dispId));\n            int height = static_cast<int>(CGDisplayPixelsHigh(dispId));\n            Sizei monitorResolution(width, height);\n            \n            // Obtain and parse EDID data.\n            CFDataRef data = \n                (CFDataRef)CFDictionaryGetValue(DispInfo, CFSTR(kIODisplayEDIDKey));\n            if (!data)\n            {\n                CFRelease(DispInfo);\n                OVR::LogError(\"[OSX Display] Unable to obtain EDID for Oculus product %d\", product);\n                continue;\n            }\n            UByte* edid = (UByte*)CFDataGetBytePtr(data);\n            OSX::DisplayEDID edidResult;\n            parseEdid( edid, edidResult );\n\n            OVR::OSX::DisplayDesc& desc = descriptorArray[result++];\n            desc.DisplayID                  = dispId;\n            desc.ModelName                  = edidResult.MonitorName;   // User friendly string.\n            desc.EdidSerialNumber           = edidResult.SerialNumber;\n            desc.LogicalResolutionInPixels  = monitorResolution;\n            desc.NativeResolutionInPixels   = monitorResolution;\n            desc.DesktopDisplayOffset       = desktopOffset;\n            desc.Rotation                   = 0;\n\n            auto roughEqual = [](double a, double b) -> bool\n            {\n                return fabs(a - b) < 1.0;\n            };\n\n            switch (product)\n            {\n                    case 3: desc.DeviceTypeGuess = HmdType_DK2;       break;\n                    case 2: desc.DeviceTypeGuess = HmdType_DKHDProto; break;\n                    case 1: desc.DeviceTypeGuess = HmdType_DK1;       break;\n\n                default:\n                    case 0: desc.DeviceTypeGuess = HmdType_Unknown;   break;\n            }\n\n            bool portraitDevice = (desc.DeviceTypeGuess == HmdType_DK2);\n            double rotation = fabs(CGDisplayRotation(dispId));\n            if (roughEqual(rotation, 0))\n            {\n                desc.Rotation = portraitDevice ? 270 : 0;\n            }\n            else if (roughEqual(rotation, 90))\n            {\n                desc.Rotation = portraitDevice ? 0 : 90;\n            }\n            else if (roughEqual(rotation, 180))\n            {\n                desc.Rotation = portraitDevice ? 90 : 180;\n            }\n            else if (roughEqual(rotation, 270))\n            {\n                desc.Rotation = portraitDevice ? 180 : 270;\n            }\n\n            // Hard-coded defaults in case the device doesn't have the data itself.\n            // DK2 prototypes (0003) or DK HD Prototypes (0002)                \n            if (product == 3 || product == 2)\n            {\n                desc.LogicalResolutionInPixels  = Sizei(1920, 1080);\n                desc.NativeResolutionInPixels   = Sizei(1080, 1920);\n            }\n            else\n            {\n                desc.LogicalResolutionInPixels  = monitorResolution;\n                desc.NativeResolutionInPixels   = monitorResolution;\n            }\n\n            //OVR_DEBUG_LOG_TEXT((\"Display Found %x:%x\\n\", vendor, product));\n        }\n        CFRelease(DispInfo);\n    }\n\n    return result;\n}\n\n\n//-------------------------------------------------------------------------------------\n// ***** Display \n\nbool Display::Initialize()\n{\n    // Nothing to initialize. OS X only supports compatibility mode.\n    return true;\n}\n\nvoid Display::Shutdown()\n{\n}\n\n\nbool Display::GetDriverMode(bool& driverInstalled, bool& compatMode, bool& hideDK1Mode)\n{\n    driverInstalled = false;\n    compatMode = true;\n    hideDK1Mode = false;\n    return true;\n}\n\nbool Display::SetDriverMode(bool /*compatMode*/, bool /*hideDK1Mode*/)\n{\n    return false;\n}\n\nDisplaySearchHandle* Display::GetDisplaySearchHandle()\n{\n\treturn new OSX::OSXDisplaySearchHandle();\n}\n\nbool Display::InCompatibilityMode( bool displaySearch )\n{\n\tOVR_UNUSED( displaySearch );\n    return true;\n}\n\nint Display::GetDisplayCount( DisplaySearchHandle* handle, bool extended, bool applicationOnly, bool edidInfo )\n{\n    OVR_UNUSED(applicationOnly);\n\n\tstatic int extendedCount = -1;\n\n\tOSX::OSXDisplaySearchHandle* localHandle = (OSX::OSXDisplaySearchHandle*)handle;\n    if (localHandle == NULL)\n    {\n        OVR::LogError(\"[OSX Display] No search handle passed into GetDisplayCount. Return 0 rifts.\");\n        return 0;\n    }\n\n    if (extendedCount == -1 || extended)\n    {\n        extendedCount = discoverExtendedRifts(localHandle->cachedDescriptorArray, OSX::OSXDisplaySearchHandle::DescArraySize, edidInfo);\n    }\n\n\tlocalHandle->extended = true;\n\tlocalHandle->extendedDisplayCount = extendedCount;\n\tint totalCount = extendedCount;\n\n    /// FIXME: Implement application mode for OS X.\n    localHandle->application = false;\n    localHandle->applicationDisplayCount = 0;\n\n    localHandle->displayCount = totalCount;\n\n    return totalCount;\n}\n\nPtr<Display> Display::GetDisplay( int index, DisplaySearchHandle* handle )\n{\n    Ptr<Display> result = NULL;\n\n    if (index < 0)\n    {\n        OVR::LogError(\"[OSX Display] Invalid index given to GetDisplay.\");\n        return NULL;\n    }\n\n\tOSX::OSXDisplaySearchHandle* localHandle = (OSX::OSXDisplaySearchHandle*)handle;\n    if (localHandle == NULL)\n    {\n        OVR::LogError(\"[OSX Display] No search handle passed into GetDisplay. Return 0 rifts.\");\n        return NULL;\n    }\n\n    if (localHandle->extended)\n    {\n        if (index >= 0 && index < (int)localHandle->extendedDisplayCount)\n        {\n            return *new OSX::OSXDisplayGeneric(localHandle->cachedDescriptorArray[index]);\n        }\n\n        // index -= localHandle->extendedDisplayCount;\n    }\n\n    if (localHandle->application)\n    {\n        OVR::LogError(\"[OSX Display] Mac does not support application displays.\");\n    }\n\n    return result;\n}\n} // namespace OVR\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Displays/OVR_OSX_Display.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_OSX_Display.h\nContent     :   OSX-specific Display declarations\nCreated     :   July 2, 2014\nAuthors     :   James Hughes\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_OSX_Display_h\n#define OVR_OSX_Display_h\n\n#include \"OVR_Display.h\"\n\nnamespace OVR { namespace OSX {\n\n\n//-------------------------------------------------------------------------------------\n// DisplayDesc\n\n// Display information enumerable through OS .\n// TBD: Should we just move this to public header, so it's a const member of Display?\nstruct DisplayDesc\n{\n    DisplayDesc() :\n        DeviceTypeGuess(HmdType_None),\n        DisplayID(0),\n        LogicalResolutionInPixels(0),\n        NativeResolutionInPixels(0)\n    {}\n\n    HmdTypeEnum DeviceTypeGuess;\n    uint32_t    DisplayID; // This is the device identifier string from MONITORINFO (for app usage)\n    String      ModelName; // This is a \"DK2\" type string\n    String      EdidSerialNumber;\n    Sizei       LogicalResolutionInPixels;\n    Sizei       NativeResolutionInPixels;\n    Vector2i    DesktopDisplayOffset;\n    int         Rotation;\n};\n\n\n//-------------------------------------------------------------------------------------\n// DisplayEDID\n\n// Describes EDID information as reported from our display driver.\nstruct DisplayEDID\n{\n    DisplayEDID() :\n        ModelNumber(0)\n    {}\n\n    String MonitorName;\n    UInt16 ModelNumber;\n    String VendorName;\n    String SerialNumber;\n};\n\n//-------------------------------------------------------------------------------------\n// OSX Display Search Handle\nclass OSXDisplaySearchHandle : public DisplaySearchHandle\n{\npublic:\n    OSXDisplaySearchHandle() :\n        extended(false),\n        application(false),\n        extendedDisplayCount(0),\n        applicationDisplayCount(0),\n        displayCount(0)\n    {}\n    virtual ~OSXDisplaySearchHandle()   {}\n\n    static const int DescArraySize = 16;\n\n    OSX::DisplayDesc    cachedDescriptorArray[DescArraySize];\n    bool                extended;\n    bool                application;\n    int                 extendedDisplayCount;\n    int                 applicationDisplayCount;\n    int                 displayCount;\n};\n\n//-------------------------------------------------------------------------------------\n// OSXDisplayGeneric\n\n// Describes OSX display in Compatibility mode, containing basic data\nclass OSXDisplayGeneric : public Display\n{\npublic:\n    OSXDisplayGeneric( const DisplayDesc& dd ) :\n        Display(dd.DeviceTypeGuess,\n                dd.DisplayID,\n                dd.ModelName,\n                dd.EdidSerialNumber,\n                dd.LogicalResolutionInPixels,\n                dd.NativeResolutionInPixels,\n                dd.DesktopDisplayOffset,\n                0,\n                dd.Rotation,\n\t\t\t\t        false)\n    {\n    }\n\n    virtual ~OSXDisplayGeneric()\n    {\n    }\n\n    virtual bool InCompatibilityMode() const\n    {\n        return true;\n    }\n\n    // Generic displays are not capable of mirroring\n    virtual MirrorMode SetMirrorMode( MirrorMode newMode ) \n    { \n        OVR_UNUSED( newMode ); \n        return MirrorDisabled; \n    } \n};\n\n}} // namespace OVR::OSX\n\n#endif // OVR_OSX_Display_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Displays/OVR_Win32_Display.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Win32_Display.cpp\nContent     :   Win32 Display implementation\nCreated     :   May 6, 2014\nAuthors     :   Dean Beeler\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include \"Kernel/OVR_Win32_IncludeWindows.h\"\n\n#include \"OVR_Win32_Display.h\"\n#include \"OVR_Win32_Dxgi_Display.h\"\n#include \"OVR_Win32_ShimFunctions.h\"\n#include \"Util/Util_Direct3D.h\"\n\n#include <stdio.h>\n#include <tchar.h>\n#include <string.h>\n#include <stdlib.h>\n#include <winioctl.h>\n#include <SetupAPI.h>\n#include <Mmsystem.h>\n#include <conio.h>\n\n#include <setupapi.h>\n#include <initguid.h>\n#pragma comment(lib, \"setupapi.lib\") // SetupDiGetDeviceRegistryProperty et al\n#pragma comment(lib, \"dxgi.lib\") // D3D11 adapter/output enumeration\n\n// WIN32_LEAN_AND_MEAN included in OVR_Atomic.h may break 'byte' declaration.\n#ifdef WIN32_LEAN_AND_MEAN\n typedef unsigned char byte;\n#endif\n\n#include \"Kernel/OVR_String.h\"\n#include \"Kernel/OVR_Log.h\"\n\ntypedef struct\n{\n    HANDLE  hDevice;\n    UINT    ExpectedWidth;\n    UINT    ExpectedHeight;\n    HWND    hWindow;\n    bool    CompatibilityMode;\n    bool    HideDK1Mode;\n} ContextStruct;\n\nstatic ContextStruct GlobalDisplayContext = {};\n\n \n//-------------------------------------------------------------------------------------\n// ***** Display enumeration Helpers\n\n// THere are two ways to enumerate display: through our driver (DeviceIoControl)\n// and through Win32 EnumDisplayMonitors (compatibility mode).\n\n\nnamespace OVR { \n\n\n//-----------------------------------------------------------------------------\n// Direct Mode\n\nULONG getRiftCount( HANDLE hDevice )\n{\n    ULONG riftCount = 0;\n    DWORD bytesReturned = 0;\n\n    BOOL result = DeviceIoControl( hDevice, IOCTL_RIFTMGR_GET_RIFT_COUNT, nullptr, 0,\n                                   &riftCount, sizeof( ULONG ), &bytesReturned, nullptr );\n\n    if( result )\n        return riftCount;\n    else\n        return 0;\n}\n\nULONG getRift( HANDLE hDevice, int index )\n{\n    ULONG riftCount = getRiftCount( hDevice );\n    DWORD bytesReturned = 0;\n    BOOL result;\n\n    if( riftCount >= (ULONG)index )\n    {\n        RIFT_STATUS riftStatus[16] = {0};\n\n        result = DeviceIoControl( hDevice, IOCTL_RIFTMGR_GET_RIFT_ARRAY, riftStatus,\n                                  riftCount * sizeof( RIFT_STATUS ), &riftCount,\n                                  sizeof( ULONG ), &bytesReturned, nullptr );\n        if( result )\n        {\n            PRIFT_STATUS tmpRift;\n            unsigned int i;\n            for( i = 0, tmpRift = riftStatus; i < riftCount; ++i, ++tmpRift )\n            {\n                if( i == (unsigned int)index )\n                    return tmpRift->childUid;\n            }\n        }\n    }\n\n    return 0;\n}\n\nstatic bool getEdid(HANDLE hDevice, ULONG uid, DisplayEDID& edid)\n{\n    ULONG       riftCount = 0;\n    DWORD       bytesReturned = 0;\n    RIFT_STATUS riftStatus[16] = {0};\n\n    BOOL result = DeviceIoControl( hDevice, IOCTL_RIFTMGR_GET_RIFT_COUNT, nullptr, 0,\n                                   &riftCount, sizeof( ULONG ), &bytesReturned, nullptr );\n\n    if (!result)\n    {\n        return false;\n    }\n\n    result = DeviceIoControl( hDevice, IOCTL_RIFTMGR_GET_RIFT_ARRAY, &riftStatus,\n                              riftCount * sizeof( RIFT_STATUS ), &riftCount, sizeof(ULONG),\n                              &bytesReturned, nullptr );\n    if (!result)\n    {\n        return false;\n    }\n\n    for (ULONG i = 0; i < riftCount; ++i)\n    {\n        ULONG riftUid = riftStatus[i].childUid;\n        if (riftUid == uid)\n        {\n            char edidBuffer[512];\n\n            result = DeviceIoControl(hDevice, IOCTL_RIFTMGR_GETEDID, &riftUid, sizeof(ULONG),\n                                     edidBuffer, 512, &bytesReturned, nullptr);\n\n            if (result)\n            {\n                if (edid.Parse((unsigned char*)edidBuffer))\n                {\n                    return true;\n                }\n                else\n                {\n                    LogError((\"[Win32Display] WARNING: The driver was not able to return EDID for a display\"));\n                }\n            }\n\n            break;\n        }\n    }\n\n    return false;\n}\n\n\n//-----------------------------------------------------------------------------\n// Rift Monitors\n\nstatic bool GetMonitorEDID(const wchar_t* deviceID, DisplayEDID& edid)\n{\n    // Find second slash and split there\n    const wchar_t* pSlash1 = wcschr(deviceID, L'\\\\');\n    if (!pSlash1)\n        return false;\n\n    // And the second one\n    const wchar_t* pSlash2 = wcschr(pSlash1 + 1, L'\\\\');\n    if (!pSlash2)\n        return false;\n\n    wchar_t hardwareID[128] = {};\n    wcsncpy_s(hardwareID, pSlash1 + 1, (pSlash2 - pSlash1 - 1));\n\n    wchar_t driverID[128] = {};\n    wcscpy_s(driverID, pSlash2 + 1);\n\n    ScopedHKEY displayKey;\n    if (RegOpenKey(HKEY_LOCAL_MACHINE, L\"SYSTEM\\\\CurrentControlSet\\\\Enum\\\\DISPLAY\",\n                   &displayKey.GetRawRef()) == 0)\n    {\n        wchar_t keyName[MAX_PATH] = {};\n        DWORD iKey = 0;\n        while (RegEnumKey(displayKey.Get(), iKey++, keyName, _countof(keyName)) == 0)\n        {\n            if (_wcsicmp(keyName, hardwareID) == 0)\n            {\n                ScopedHKEY devKey;\n                if (RegOpenKey(displayKey.Get(), keyName, &devKey.GetRawRef()) == 0)\n                {\n                    wchar_t nodeName[MAX_PATH] = {};\n                    DWORD iNode = 0;\n                    while (RegEnumKey(devKey.Get(), iNode++, nodeName, _countof(nodeName)) == 0)\n                    {\n                        wchar_t devDriverID[MAX_PATH] = {};\n                        DWORD cbDriverID = sizeof(devDriverID);\n                        if (RegGetValue(devKey.Get(), nodeName, L\"Driver\", RRF_RT_REG_SZ, nullptr,\n                                        devDriverID, &cbDriverID) == 0)\n                        {\n                            // Check if DriverID matches\n                            if (_wcsicmp(devDriverID, driverID) == 0)\n                            {\n                                ScopedHKEY nodeKey;\n                                if (RegOpenKey(devKey.Get(), nodeName, &nodeKey.GetRawRef()) == 0)\n                                {\n                                    BYTE edidBytes[512] = {};\n                                    DWORD cbEDID = sizeof(edidBytes);\n                                    if (RegGetValue(nodeKey.Get(), L\"Device Parameters\", L\"EDID\", RRF_RT_REG_BINARY,\n                                        nullptr, edidBytes, &cbEDID) == 0)\n                                    {\n                                        return edid.Parse(edidBytes);\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    return true;\n}\n\nstatic bool FillDisplayDesc(DXGI_OUTPUT_DESC const& outputDesc, DISPLAY_DEVICEW& dispDev, DisplayEDID const& edid, DisplayDesc& result)\n{\n    // EdidSerialNumber\n    static_assert(sizeof(result.EdidSerialNumber) == sizeof(edid.SerialNumber), \"sizes need to match\");\n    memcpy(result.EdidSerialNumber, edid.SerialNumber, sizeof(result.EdidSerialNumber));\n\n    // DisplayID\n    size_t converted = 0;\n    if (0 != wcstombs_s(&converted, result.DisplayID, dispDev.DeviceName, _TRUNCATE))\n        return false;\n\n    // DesktopDisplayOffset\n    result.DesktopDisplayOffset = Vector2i(outputDesc.DesktopCoordinates.left,\n                                           outputDesc.DesktopCoordinates.top);\n\n    // ModelName\n    static_assert(sizeof(result.ModelName) == sizeof(edid.MonitorName), \"sizes need to match\");\n    memcpy(result.ModelName, edid.MonitorName, sizeof(result.ModelName));\n\n    // Resolution\n    result.ResolutionInPixels.w = edid.Width;\n    result.ResolutionInPixels.h = edid.Height;\n\n    // DK2 Landscape = DXGI_MODE_ROTATION_IDENTITY -> DXGI_MODE_ROTATION_ROTATE90\n    // DK2 Portrait = DXGI_MODE_ROTATION_ROTATE90 -> DXGI_MODE_ROTATION_IDENTITY\n    // DK2 Landscape(Flipped) = DXGI_MODE_ROTATION_ROTATE180 -> DXGI_MODE_ROTATION_ROTATE270\n    // DK2 Portrait(Flipped) = DXGI_MODE_ROTATION_ROTATE270 -> DXGI_MODE_ROTATION_ROTATE180\n    bool tallScreen = result.ResolutionInPixels.w < result.ResolutionInPixels.h;\n\n    // Rotation\n    // This is the rotation from portrait mode, and the DK2 (for example) is naturally landscape,\n    // so we need to adjust the rotation value based on the HMD type.\n    switch (outputDesc.Rotation)\n    {\n    case DXGI_MODE_ROTATION_IDENTITY:\n    default:\n        result.Rotation = tallScreen ? 270 : 0;\n        break;\n    case DXGI_MODE_ROTATION_ROTATE90:\n        result.Rotation = tallScreen ? 0 : 90;\n        break;\n    case DXGI_MODE_ROTATION_ROTATE180:\n        result.Rotation = tallScreen ? 90 : 180;\n        break;\n    case DXGI_MODE_ROTATION_ROTATE270:\n        result.Rotation = tallScreen ? 180 : 270;\n        break;\n    }\n\n    // DeviceTypeGuess\n    result.DeviceTypeGuess = HmdTypeFromModelNumber(edid.ModelNumber);\n\n    return true;\n}\n\n// Pass in 0 if only an existence check is requested.\nstatic int DiscoverRiftMonitors(DisplayDesc* descriptorArray = nullptr, int inputArraySize = 0)\n{\n    int outputArraySize = 0;\n\n    Ptr<IDXGIFactory1> factory;\n    HRESULT hr = ::CreateDXGIFactory1(IID_PPV_ARGS(&factory.GetRawRef()));\n    OVR_D3D_CHECK_RET_FALSE(hr);\n\n    Ptr<IDXGIAdapter> adapter;\n    uint32_t iAdapter = 0;\n    while (adapter = nullptr,\n           SUCCEEDED(factory->EnumAdapters(iAdapter++, &adapter.GetRawRef())))\n    {\n        Ptr<IDXGIAdapter1> adapter1;\n        hr = adapter->QueryInterface(IID_PPV_ARGS(&adapter1.GetRawRef()));\n        if (!OVR_D3D_CHECK(hr))\n            continue;\n\n        DXGI_ADAPTER_DESC1 adapterDesc = {};\n        adapter1->GetDesc1(&adapterDesc);\n\n        if (adapterDesc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)\n        {\n            // Don't bother with software adapters (WARP, BasicRender, etc...)\n            continue;\n        }\n\n        Ptr<IDXGIOutput> output;\n        uint32_t iOutput = 0;\n        while (output = nullptr,\n               SUCCEEDED(adapter->EnumOutputs(iOutput++, &output.GetRawRef())))\n        {\n            // Get DeviceName for each output\n            DXGI_OUTPUT_DESC outputDesc;\n            hr = output->GetDesc(&outputDesc);\n            if (!OVR_D3D_CHECK(hr))\n                continue;\n\n            // Get DeviceID from DeviceName\n            DISPLAY_DEVICEW dispDev = {};\n            dispDev.cb = sizeof(dispDev);\n            if (!::EnumDisplayDevicesW(outputDesc.DeviceName, 0, &dispDev, 0))\n                continue;\n\n            // If it is a Rift monitor,\n            if (wcsstr(dispDev.DeviceID, L\"RTD2205\") ||\n                wcsstr(dispDev.DeviceID, L\"CVT0003\") ||\n                wcsstr(dispDev.DeviceID, L\"MST0030\") ||\n                wcsstr(dispDev.DeviceID, L\"OVR00\")) // Part of Oculus EDID.\n            {\n                DisplayEDID edid = {};\n\n                // If monitor existence is the goal,\n                if (!descriptorArray || inputArraySize <= 0)\n                    return 1;\n\n                if (outputArraySize < inputArraySize)\n                {\n                    if (GetMonitorEDID(dispDev.DeviceID, edid) &&\n                        FillDisplayDesc(outputDesc, dispDev, edid, descriptorArray[outputArraySize]))\n                    {\n                        outputArraySize++;\n                    }\n                }\n            }\n        }\n    }\n\n    return outputArraySize;\n}\n\nbool Display::ExtendedModeDevicesExist()\n{\n    return DiscoverRiftMonitors() > 0;\n}\n\n\n//-------------------------------------------------------------------------------------\n// ***** Display \n\nbool Display::InCompatibilityMode(bool displaySearch)\n{\n    return (displaySearch && ExtendedModeDevicesExist()) ||\n            GlobalDisplayContext.CompatibilityMode;\n}\n\n#define OVR_FLAG_COMPATIBILITY_MODE 1\n#define OVR_FLAG_HIDE_DK1 2\n\n\nvoid Display::Shutdown()\n{\n    Win32::DisplayShim::GetInstance().Shutdown();\n    OVR::Display::SetDirectDisplayInitialized(false);\n}\n\nbool Display::Initialize()\n{\n    // This function is re-entrant because it may be called again to\n    // patch-up comatibility mode by the Config Util (Hack in HMDView::SetupGraphics).\n    // For this reason, the GetDirectDisplayInitialized() check is only done for\n    // shim initialization below.\n\n    HANDLE hDevice = INVALID_HANDLE_VALUE;\n\n    if (GlobalDisplayContext.hDevice == 0)\n    {\n        hDevice = CreateFile(L\"\\\\\\\\.\\\\ovr_video\" ,\n                             GENERIC_READ | GENERIC_WRITE, 0,\n                             nullptr, OPEN_EXISTING, 0, nullptr);\n    }\n    else\n    {   // The device has already been created\n        hDevice = GlobalDisplayContext.hDevice;\n    }\n\n    if (hDevice != nullptr && hDevice != INVALID_HANDLE_VALUE)\n    {\n        GlobalDisplayContext.hDevice             = hDevice;\n        GlobalDisplayContext.CompatibilityMode = false;\n\n        DWORD bytesReturned = 0;\n        LONG compatiblityResult = OVR_STATUS_SUCCESS;\n\n        BOOL result = DeviceIoControl( hDevice, IOCTL_RIFTMGR_GETCOMPATIBILITYMODE, nullptr, 0,\n                                       &compatiblityResult, sizeof( LONG ), &bytesReturned, nullptr );\n        if (result)\n        {\n            GlobalDisplayContext.CompatibilityMode = (compatiblityResult & OVR_FLAG_COMPATIBILITY_MODE) != 0;\n            GlobalDisplayContext.HideDK1Mode = (compatiblityResult & OVR_FLAG_HIDE_DK1) != 0;\n        }\n        else\n        {\n            // If calling our driver fails in any way, assume compatibility mode as well\n            GlobalDisplayContext.CompatibilityMode = true;\n        }\n\n        if (!GlobalDisplayContext.CompatibilityMode)\n        {\n            // If a display is actually connected, bring up the shim layers so we can actually use it\n            // TBD: Do we care about extended mode displays? -cat\n            if (OVR::Display::ExtendedModeDevicesExist() ||\n                getRiftCount(GlobalDisplayContext.hDevice) > 0)\n            {\n                // FIXME: Initializing DX9 with landscape numbers rather than portrait\n                GlobalDisplayContext.ExpectedWidth = 1080;\n                GlobalDisplayContext.ExpectedHeight = 1920;\n            }\n            else\n            {\n                GlobalDisplayContext.CompatibilityMode = true;\n            }\n        }\n    }\n    else\n    {\n        GlobalDisplayContext.CompatibilityMode = true;\n    }\n\n\n\n    // Set up display code for Windows\n    Win32::DisplayShim::GetInstance();\n\n    // This code will look for the first display. If it's a display\n    // that's extending the desktop, the code will assume we're in\n    // compatibility mode. Compatibility mode prevents shim loading\n    // and renders only to extended Rifts.\n    // If we find a display and it's application exclusive,\n    // we load the shim so we can render to it.\n    // If no display is available, we revert to whatever the\n    // driver tells us we're in\n\n    bool anyExtendedRifts = OVR::Display::ExtendedModeDevicesExist() ||\n                            GlobalDisplayContext.CompatibilityMode;\n\n    if (!OVR::Display::GetDirectDisplayInitialized())\n    {\n        OVR::Display::SetDirectDisplayInitialized(\n            Win32::DisplayShim::GetInstance().Initialize(anyExtendedRifts));\n    }\n    \n    return true;\n}\n\nbool Display::GetDriverMode(bool& driverInstalled, bool& compatMode, bool& hideDK1Mode)\n{\n    if (GlobalDisplayContext.hDevice == nullptr)\n    {\n        driverInstalled = false;\n        compatMode      = true;\n        hideDK1Mode     = false;\n    }\n    else\n    {\n        driverInstalled = true;\n        compatMode      = GlobalDisplayContext.CompatibilityMode;\n        hideDK1Mode     = GlobalDisplayContext.HideDK1Mode;\n    }\n\n    return true;\n}\n\nbool Display::SetDriverMode(bool compatMode, bool hideDK1Mode)\n{\n    // If device is not initialized,\n    if (GlobalDisplayContext.hDevice == nullptr)\n    {\n        OVR_ASSERT(false);\n        return false;\n    }\n\n    // If no change,\n    if ((compatMode == GlobalDisplayContext.CompatibilityMode) &&\n        (hideDK1Mode == GlobalDisplayContext.HideDK1Mode))\n    {\n        return true;\n    }\n\n    LONG mode_flags = 0;\n    if (compatMode)\n    {\n        mode_flags |= OVR_FLAG_COMPATIBILITY_MODE;\n    }\n    if (hideDK1Mode)\n    {\n        mode_flags |= OVR_FLAG_HIDE_DK1;\n    }\n\n    DWORD bytesReturned = 0;\n    LONG err = 1;\n\n    if (!DeviceIoControl(GlobalDisplayContext.hDevice,\n                         IOCTL_RIFTMGR_SETCOMPATIBILITYMODE,\n                         &mode_flags,\n                         sizeof(LONG),\n                         &err,\n                         sizeof(LONG),\n                         &bytesReturned,\n                         nullptr) ||\n        (err != 0 && err != -3))\n    {\n        LogError(\"{ERR-001w} [Win32Display] Unable to set device mode to (compat=%d dk1hide=%d): err=%d\",\n            (int)compatMode, (int)hideDK1Mode, (int)err);\n        return false;\n    }\n\n    OVR_DEBUG_LOG((\"[Win32Display] Set device mode to (compat=%d dk1hide=%d)\",\n        (int)compatMode, (int)hideDK1Mode));\n\n    GlobalDisplayContext.HideDK1Mode = hideDK1Mode;\n    GlobalDisplayContext.CompatibilityMode = compatMode;\n    return true;\n}\n\nDisplaySearchHandle* Display::GetDisplaySearchHandle()\n{\n    return new Win32::Win32DisplaySearchHandle();\n}\n\n// FIXME: The handle parameter will be used to unify GetDisplayCount and GetDisplay calls\n// The handle will be written to the 64-bit value pointed and will store the enumerated\n// display list. This will allow the indexes to be meaningful between obtaining\n// the count. With a single handle the count should be stable\nint Display::GetDisplayCount(DisplaySearchHandle* handle, bool extended, bool applicationOnly, bool extendedEDIDSerials)\n{\n    OVR_UNUSED(extendedEDIDSerials);\n    static int extendedCount = -1;\n    static int applicationCount = -1;\n\n    Win32::Win32DisplaySearchHandle* localHandle = (Win32::Win32DisplaySearchHandle*)handle;\n    \n    if( localHandle == nullptr )\n        return 0;\n\n    if( extendedCount == -1 || extended )\n    {\n        extendedCount = DiscoverRiftMonitors(localHandle->cachedDescriptorArray, 16);\n    }\n\n    localHandle->extended = true;\n    localHandle->extendedDisplayCount = extendedCount;\n    int totalCount = extendedCount;\n\n    if( applicationCount == -1 || applicationOnly )\n    {\n        applicationCount = getRiftCount(GlobalDisplayContext.hDevice);\n        localHandle->application = true;\n    }\n\n    totalCount += applicationCount;\n    localHandle->applicationDisplayCount = applicationCount;\n    localHandle->displayCount = totalCount;\n\n    return totalCount;\n}\n\nPtr<Display> Display::GetDisplay(int index, DisplaySearchHandle* handle)\n{\n    Ptr<Display> result;\n\n    if( index < 0 )\n        return result;\n\n    Win32::Win32DisplaySearchHandle* localHandle = (Win32::Win32DisplaySearchHandle*)handle;\n\n    if( localHandle == nullptr )\n        return nullptr;\n\n    if (localHandle->extended)\n    {\n        if (index >= 0 && index < (int)localHandle->extendedDisplayCount)\n        {\n            return *new Win32::Win32DisplayGeneric(localHandle->cachedDescriptorArray[index]);\n        }\n\n        index -= localHandle->extendedDisplayCount;\n    }\n\n    if(localHandle->application)\n    {\n        if (index >= 0 && index < (int)getRiftCount(GlobalDisplayContext.hDevice))\n        {\n            ULONG riftChildId = getRift(GlobalDisplayContext.hDevice, index);\n            DisplayEDID dEdid;\n\n            if (!getEdid(GlobalDisplayContext.hDevice, riftChildId, dEdid))\n            {\n                return nullptr;\n            }\n\n            uint32_t nativeWidth = dEdid.Width, nativeHeight = dEdid.Height;\n            uint32_t rotation    = (dEdid.ModelNumber == 2 ||\n                                    dEdid.ModelNumber == 3) ? 90 : 0;\n\n            uint32_t logicalWidth, logicalHeight;\n            if (rotation == 0)\n            {\n                logicalWidth  = nativeWidth;\n                logicalHeight = nativeHeight;\n            }\n            else\n            {\n                logicalWidth  = nativeHeight;\n                logicalHeight = nativeWidth;\n            }\n\n            result = *new Win32::Win32DisplayDriver( \n                        HmdTypeFromModelNumber(dEdid.ModelNumber),\n                        \"\",\n                        dEdid.MonitorName,\n                        dEdid.SerialNumber,\n                        Sizei(logicalWidth, logicalHeight),\n                        Sizei(nativeWidth, nativeHeight),\n                        Vector2i(0),\n                        dEdid,\n                        GlobalDisplayContext.hDevice,\n                        riftChildId,\n                        rotation);\n        }\n    }\n    return result;\n}\n\nDisplay::MirrorMode Win32::Win32DisplayDriver::SetMirrorMode( Display::MirrorMode newMode )\n{\n    return newMode;\n}\n\nstatic bool SetDisplayPower(HANDLE hDevice, ULONG childId, int mode)\n{\n#ifdef OVR_OS_WIN64\n    BOOL is64BitOS = TRUE;\n#else\n    BOOL is64BitOS = FALSE;\n    BOOL res = IsWow64Process(GetCurrentProcess(), &is64BitOS);\n    OVR_ASSERT_AND_UNUSED(res == TRUE,res);\n#endif\n    ULONG localResult = 0;\n    DWORD bytesReturned = 0;\n    BOOL result;\n    if (is64BitOS)\n    {\n        ULONG64 longArray[2];\n        longArray[0] = childId;\n        longArray[1] = mode;\n        result = DeviceIoControl(hDevice,\n            IOCTL_RIFTMGR_DISPLAYPOWER,\n            longArray,\n            2 * sizeof(ULONG64),\n            &localResult,\n            sizeof(ULONG),\n            &bytesReturned,\n            nullptr);\n    }\n    else\n    {\n        ULONG32 longArray[2];\n        longArray[0] = childId;\n        longArray[1]  = mode;\n        result = DeviceIoControl(hDevice,\n            IOCTL_RIFTMGR_DISPLAYPOWER,\n            longArray,\n            2 * sizeof(ULONG32),\n            &localResult,\n            sizeof(ULONG),\n            &bytesReturned,\n            nullptr);\n    }\n\n    // Note: bytesReturned does not seem to be set\n    return result != FALSE /* && bytesReturned == sizeof(ULONG) */ && mode == (int)localResult;\n}\n\nbool Win32::Win32DisplayDriver::SetDisplaySleep(bool sleep)\n{\n    return SetDisplayPower(hDevice, ChildId, sleep ? 2 : 1);\n}\n\n\n} // namespace OVR\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Displays/OVR_Win32_Display.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Win32_Display.h\nContent     :   Win32-specific Display declarations\nCreated     :   May 6, 2014\nAuthors     :   Dean Beeler\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Win32_Display_h\n#define OVR_Win32_Display_h\n\n#include \"OVR_Display.h\"\n\nOVR_DISABLE_MSVC_WARNING(4351) // new behavior: elements of array will be default initialized\n\nnamespace OVR { namespace Win32 {\n\n\nclass Win32DisplaySearchHandle : public DisplaySearchHandle\n{\npublic:\n    static const int ArraySize = 16;\n\n    DisplayDesc        cachedDescriptorArray[ArraySize];\n    bool\t\t\t   extended;\n    bool\t\t\t   application;\n    int\t\t\t\t   extendedDisplayCount;\n    int\t\t\t\t   applicationDisplayCount;\n    int\t\t\t\t   displayCount;\n\n    Win32DisplaySearchHandle() :\n        cachedDescriptorArray(),\n        extended(),\n        application(false),\n        extendedDisplayCount(0),\n        applicationDisplayCount(0),\n        displayCount(0)\n    {\n    }\n\n\tvirtual ~Win32DisplaySearchHandle()\n    {\n    }\n};\n\n//-------------------------------------------------------------------------------------\n// Win32DisplayGeneric\n\n// Describes Win32 display in Compatibility mode, containing basic data\nclass Win32DisplayGeneric : public Display\n{\npublic:\n    Win32DisplayGeneric( const DisplayDesc& dd ) :\n        Display(dd.DeviceTypeGuess,\n                dd.DisplayID,\n                dd.ModelName,\n                dd.EdidSerialNumber,\n                dd.ResolutionInPixels,\n                dd.ResolutionInPixels,\n                dd.DesktopDisplayOffset,\n                0,\n                dd.Rotation,\n                false)\n    {\n    }\n\n    virtual ~Win32DisplayGeneric()\n    {\n    }\n\n    // Generic displays are not capable of mirroring\n    virtual MirrorMode SetMirrorMode( MirrorMode newMode ) \n    { \n        OVR_UNUSED( newMode ); \n        return MirrorDisabled; \n    }\n};\n\n\n//-------------------------------------------------------------------------------------\n// Win32DisplayDriver\n\n// Oculus driver based display object.\nclass Win32DisplayDriver : public Display\n{\n\tHANDLE\t\thDevice;\n\tULONG\t\tChildId;\n\tDisplayEDID Edid;\n\npublic:\n    Win32DisplayDriver(const HmdTypeEnum  deviceTypeGuess,\n                       const String&      displayID,\n\t\t\t\t\t   const String&      modelName,\n\t\t\t\t\t   const String&      edidSerial,\n                       const Sizei&       logicalRes,\n\t\t\t\t\t   const Sizei&       nativeRes,\n\t\t\t\t\t   const Vector2i&    displayOffset,\n                       const DisplayEDID& edid,\n\t\t\t\t\t   HANDLE hdevice,\n\t\t\t\t\t   ULONG child,\n\t\t\t\t\t   uint32_t rotation) :\n\t\tDisplay(deviceTypeGuess,\n\t\t\t\tdisplayID,\n\t\t\t\tmodelName,\n\t\t\t\tedidSerial,\n\t\t\t\tlogicalRes,\n\t\t\t\tnativeRes,\n\t\t\t\tdisplayOffset,\n\t\t\t\tchild,\n\t\t\t\trotation,\n\t\t\t\ttrue),\n\t\thDevice(hdevice),\n\t\tChildId(child),\n\t\tEdid(edid)\n    {\n\t}\n\n\tvirtual ~Win32DisplayDriver()\n\t{\n\t}\n\n\tvirtual MirrorMode SetMirrorMode( MirrorMode newMode );\n\n    // Support sleep/wake\n\tvirtual bool SetDisplaySleep(bool off);\n};\n\n\n}} // namespace OVR::Win32\n\n\nOVR_RESTORE_MSVC_WARNING()\n\n\n#endif // OVR_Win32_Display_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Displays/OVR_Win32_Dxgi_Display.h",
    "content": "/************************************************************************************\n \nPublicHeader:   None\nFilename    :   dxgi_ovr_filter.h\nContent     :   Shared usermode/kernel mode definitions for IOCTL functionality.\n                Also used from LibOVR to access the driver.\nCreated     :   January 27, 2014\nAuthors     :   Dean Beeler\n \nCopyright   :   Copyright 2013 Oculus, LLC. All Rights reserved.\n \nUse of this software is subject to the terms of the Oculus LLC license\nagreement provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n \n/************************************************************************************/\n\n#ifndef OVR_dxgi_ovr_filter_h\n#define OVR_dxgi_ovr_filter_h\n\n#include <Kernel/OVR_Win32_IncludeWindows.h>\n#include <InitGuid.h>\n\n#define USERMODE_TEST_ROTATION 1\n\n#if USERMODE_TEST_ROTATION // Used only by the um test application\n#define USERMODE_SURFACE_WIDTH 1920\n#define USERMODE_SURFACE_HEIGHT 1080\n#else\n#define USERMODE_SURFACE_WIDTH 1080\n#define USERMODE_SURFACE_HEIGHT 1920\n#endif\n\n#define TEST_ROTATION 0 // Kernel-mode parameters\n\n#if TEST_ROTATION\n#define SURFACE_WIDTH 1920\n#define SURFACE_HEIGHT 1080\n#else\n#define SURFACE_WIDTH 1080\n#define SURFACE_HEIGHT 1920\n#endif\n\n// {46231713-49FD-4922-84E3-9FF907C06803}\nDEFINE_GUID(GUID_DEVINTERFACE_OVRRIFTMGR, \n\t0x46231713, 0x49fd, 0x4922, 0x84, 0xe3, 0x9f, 0xf9, 0x7, 0xc0, 0x68, 0x3);\n\n#define QUERYADAPTER_MAGICSIZE\t\t17836\n#define QUERYADAPTER_MAGICHEADER\t0x4f565246 // OVRF\n#define QUERYADAPTER_MAXPATH\t\t2048\n\n#define FUNCTION_INDEX 0xb800\n\n#pragma pack(push,1)\n\n#define OVR_RIFT_MODE_OFF\t\t\t0\t// Disabled\n#define OVR_RIFT_MODE_ENABLED\t\t1   // Enabled\n#define OVR_RIFT_MODE_EXTEND\t\t2   // Extending 2D displays. Without this flag\n\t\t\t\t\t\t\t\t\t\t//\t2D displays are disabled when the Rift\n\t\t\t\t\t\t\t\t\t\t//\tis active\n#define OVR_RIFT_MODE_FRONTBUFFER\t4\t// Enable front buffer only for Rift\n#define OVR_RIFT_MODE_LOCKMOUSE\t\t8\t// Prevent mouse from entering bounds\n\n#define OVR_ESCAPE_TYPE_HANDLE\t\t1   // Escape to notify driver of our collected handles\n\n#define OVR_FlipImmediate\t\t\t0x2\n#define OVR_FlipOnNextVSync\t\t\t0x4\n\n//-----------------------------------------------------------------------------------\n// Structures for application to UM driver\n\n// Kernel32.dll functionality\ntypedef HMODULE  (WINAPI *WinLoadLibraryA) ( LPCSTR  );\ntypedef HMODULE  (WINAPI *WinLoadLibraryW) ( LPCWSTR  );\ntypedef HMODULE  (WINAPI *WinLoadLibraryExA) ( LPCSTR, HANDLE, DWORD  );\ntypedef HMODULE  (WINAPI *WinLoadLibraryExW) ( LPCWSTR, HANDLE, DWORD  );\ntypedef BOOL     (WINAPI *WinGetModuleHandleExA)( DWORD, LPCSTR, HMODULE* );\ntypedef BOOL     (WINAPI *WinGetModuleHandleExW)( DWORD, LPCWSTR, HMODULE* );\n\n// Overridden DirectX 9 entry points\ntypedef void*\t (WINAPI *WinDirect3DCreate9)(UINT SDKVersion);\ntypedef HRESULT  (WINAPI *WinDirect3DCreate9Ex)(UINT SDKVersion, void** aDevice);\n\n// Overridden DXGI entry points\ntypedef HRESULT (WINAPI *WinCreateDXGIFactory)(\n\t__in   REFIID riid,\n\t__out  void **ppFactory\n\t);\n\ntypedef HRESULT (WINAPI *WinCreateDXGIFactory1)(\n\t__in   REFIID riid,\n\t__out  void **ppFactory\n\t);\n\ntypedef HRESULT (WINAPI *WinCreateDXGIFactory2)(\n\t__in   UINT flags,\n\t__in   const IID &riid,\n\t__out  void **ppFactory\n\t);\n\n// Application usermode callbacks from usermode driver. These \n// functions are all provided by the calling application that uses\n// the filter mode driver\n\n// IsInitializingDisplay is used at runtime to validate that\n// the created resource (RT or bind_present) matches the resolution\n// of our expected backbuffer. If the application returns true,\n// our usermode driver will convert this to a primary\ntypedef BOOL  (WINAPI *IsInitializingDisplay) ( PVOID, UINT, UINT );\n// RiftForContext is a function that will return the Rift device of\n// the concerned context. This is for targeting a particular\n// device instance with a particular Rift for rendering\ntypedef ULONG (WINAPI *RiftForContext)( PVOID, HANDLE );\n// CloseRiftForContext is a function that informs the application\n// the created device is shutting down and the context\n// can freedly disassociate with the particular\ntypedef BOOL (WINAPI *CloseRiftForContext)( PVOID, HANDLE, ULONG );\ntypedef BOOL (WINAPI *WindowDisplayResolution)( PVOID, UINT*, UINT*, UINT*, UINT*, BOOL* );\n// IsCreatingBackBuffer is a function directed at the runtime shim\n// to confirm that the runtime is actively creating the additional\n// swapchain for rotation and display out to the rift.\n// When creating the original swapchain this function should return false\n// so the orignal swapchain isn't inadvertantly coopted.\ntypedef BOOL (WINAPI *IsCreatingBackBuffer)( PVOID );\n// Callback from the usermode driver to obtain the desire to see debug statements from\n// the usermode drivers on the output console. Only called one per usermode driver shim\n// and usermode runtime.\ntypedef BOOL (WINAPI *ShouldEnableDebug)( VOID );\n// Callback from the usermode driver to the runtime obtain the vsync status\ntypedef BOOL (WINAPI *ShouldVSync)( VOID );\n// Callback from usermode mode and runtime driver to obtain expected native width, \n// height and degrees rotation of the rift\ntypedef BOOL (WINAPI *ExpectedResolution)( PVOID, UINT*, UINT*, UINT* );\n// Usermode callback that reports whether or not mirroring is enabled\ntypedef BOOL (WINAPI *MirroringEnabled)( PVOID );\n// Callback from the shim for Unity and other plugins used to\n// report the swapchain that was created by the application\ntypedef void* (WINAPI *GetDX11SwapChain)( PVOID );\n// Callback to report the HWND associated with this context\ntypedef HWND (WINAPI* GetWindowForContext)( PVOID );\n// Should present Rift on context\ntypedef BOOL (WINAPI* PresentRiftOnContext)( PVOID );\n// Used by a pre-loaded shim (d3d9, dxgi, opengl32) to\n// identify which api version we loaded\n// 1 = OpenGL\n// 9 = DirectX 9\n// 10 = DirectX 1X\ntypedef int (WINAPI* ActiveAPIVersion)( PVOID );\n\n// Get the version of the runtime filter.\ntypedef ULONG (WINAPI* GetRTFilterVersion)();\n\n#pragma warning(push)\n#pragma warning(disable: 4201)\n\ntypedef struct _LINK_APPLICATION_DRIVER\n{\n\tUINT32                      version;\n\tPVOID\t\t\t\t\t\tcontext;\n\n\tunion \n\t{\n\t\tstruct  \n\t\t{\n\t\t\tIsInitializingDisplay\t\tpfnInitializingDisplay;\n\t\t\tRiftForContext\t\t\t\tpfnRiftForContext;\n\t\t\tCloseRiftForContext\t\t\tpfnCloseRiftForContext;\n\t\t\tWindowDisplayResolution\t\tpfnWindowDisplayResolution;\n\t\t\tIsCreatingBackBuffer\t\tpfnIsCreatingBackBuffer;\n\t\t\tShouldEnableDebug\t\t\tpfnShouldEnableDebug;\n\t\t\tShouldVSync\t\t\t\t\tpfnShouldVSync;\n\t\t\tExpectedResolution\t\t\tpfnExpectedResolution;\n\t\t\tMirroringEnabled\t\t\tpfnMirroringEnabled;\n\t\t\tGetDX11SwapChain\t\t\tpfnGetDX11SwapChain;\n\t\t\tGetWindowForContext\t\t\tpfnGetWindowForContext;\n\t\t\tPresentRiftOnContext\t\tpfnPresentRiftOnContext;\n\t\t\tActiveAPIVersion\t\t\tpfnActiveAPIVersion;\n\t\t};\n\n\t\tPROC\tplaceholders[128];\n\t};\n\n\n\t// Used by Runtime filter for linking with original libraries\n\tWinDirect3DCreate9\t\t\tpfnDirect3DCreate9;\n\tWinDirect3DCreate9Ex\t\tpfnDirect3DCreate9Ex;\n\tWinCreateDXGIFactory\t\tpfnCreateDXGIFactory;\n\tWinCreateDXGIFactory1\t\tpfnCreateDXGIFactory1;\n\tWinCreateDXGIFactory2\t\tpfnCreateDXGIFactory2;\n} LINK_APPLICATION_DRIVER, *PLINK_APPLICATION_DRIVER;\n\n#pragma warning(pop)\n\n\n// OVRDisplay.dll functionality\ntypedef HRESULT (WINAPI *PreloadLibraryFn) ( WinLoadLibraryA , LPCSTR, PLINK_APPLICATION_DRIVER appDriver );\ntypedef HRESULT (WINAPI *PreloadLibraryRTFn) ( PLINK_APPLICATION_DRIVER appDriver );\n\n//-----------------------------------------------------------------------------------\n// Structures for UM driver to KM driver\n\ntypedef struct _QUERY_KM_DRIVER\n{\n\tUINT32 magic;\t\t\t\t\t\t\t\t// Friend or foe identifier for our filter driver\n\t\t\t\t\t\t\t\t\t\t\t\t// See: QUERYADAPTER_MAGICHEADER\n\tUINT32 maxVidPnSources;\t\t\t\t\t\t// Returns the maximum number of video present network sources\n} QUERY_KM_DRIVER, *PQUERY_KM_DRIVER;\n\n#ifndef _D3DUKMDT_H_\ntypedef UINT D3DKMT_HANDLE;\n#endif\n\ntypedef struct _HandleNotepad\n{\n\t// These are assigned around CreateResource\n\tHANDLE\t\t\thUsermodeInResource;\n\tHANDLE\t\t\thUsermodeOutResource;\n\n\t// These are assigned within the kernel with\n\t// DxgkDdiCreateAllocation and\n\t// DxgkDdiOpenAllocation\n\tD3DKMT_HANDLE\thAllocation;\n\tPVOID\t\t\thDeviceSpecificHandle;\n\tPVOID\t\t\thKernelDriverHandle;\n\n\t// These are assigned around pfnAllocateCb\n\tHANDLE\t\t\thUsermodeSharedResource;\n\tD3DKMT_HANDLE\thKernelModeSharedResource;\n\n\tULONG\t\t\tchildUid;\n\n\tUINT\t\t\tpitch;\n\n} HandleNotepad, *PHandleNotepad;\n\n\ntypedef struct _ALLOC_PRIVATE_STRUCTURE\n{\n\tUINT32 magic;\t\t\t\t\t\t\t\t// Friend or foe identifier for our filter driver\n\n\tPVOID originalPrivataDataPtr;\t\t\t\t// Location in usermode of the original private data structure\n\tUINT  originalPrivateSize;\t\t\t\t\t// Size of private data structure at the end of this header\n\n\tPVOID hAllocationHandle;\t\t\t\t\t// User-mode-assigned allocation handle for CreateAllocation\n\tPVOID hDeviceSpecificHandle;\t\t\t\t// Assigned in kernal OpenAllocation\n\tPVOID hInternalHandle;\t\t\t\t\t\t// Assigned in kernal CreateAllocation\n\tUINT  pitch;\t\t\t\t\t\t\t\t// Hinted surface pitch\n\n\tBYTE originalPrivateData[1];\t\t\t\t// Variable length\n\n\n} ALLOC_PRIVATE_STRUCTURE, *PALLOC_PRIVATE_STRUCTURE;\n\ntypedef struct _ESCAPE_STRUCTURE\n{\n\tUINT32 magic;\t\t\t\t\t\t\t\t// Friend or foe identifier for our filter driver\n\n\tUINT32 escapeType;\t\t\t\t\t\t\t// Specifier for individual type of escape message\n\t\t\t\t\t\t\t\t\t\t\t\t// Type 1 for notepad\n\tunion {\n\t\tHandleNotepad notepad;\n\t};\n} ESCAPE_STRUCTURE, *PESCAPE_STRUCTURE;\n\n// Structures for internal operation of KM driver\n\ntypedef struct _RIFT_SYNC\n{\n\tULONG\tchildUid;\t\t\t\t// ChildUid as reported by RIFT_STATUS\n\tULONG   vsync;\t\t\t\t\t// 1 for vsync, 0 for immediate\n} RIFT_SYNC, *PRIFT_SYNC;\n\ntypedef struct _RIFT_MODE\n{\n\tULONG\tchildUid;\t\t\t\t// ChildUid as reported by RIFT_STATUS\n\tULONG\tmode;\t\t\t\t\t// Bitmap of mode values, defined by OVR_RIFT_HOME_*\n\tHANDLE\tuserModeHandle;\t\t\t// Handle of render target created in user mode\n\t\t\t\t\t\t\t\t\t// that's usable as a primary \n} RIFT_MODE, *PRIFT_MODE;\n\ntypedef struct _RIFT_STATUS\n{\n\tULONG childUid;\t\t\t\t// Display driver assigned Uid for this display\n\tULONG mode;\t\t\t\t\t// Active rift mode, see OVR_RIFT_MODE_*\n\tULONG serialNumber;\t\t\t// Serial number as reported in the Rift's EDID\n\tULONG textureHandle;\t\t// Handle of shared render resource -- NULL if not shared \n} RIFT_STATUS, *PRIFT_STATUS;\n\ntypedef struct _RIFT_STATUS_ARRAY\n{\n\tULONG arraySize;\t\t\t// Size of pre-allocated RIFT_STATUS structures. \n\tRIFT_STATUS status[1];\t\t// Array of status blocks containing connection information on each Rift\n} RIFT_STATUS_ARRAY, *PRIFT_STATUS_ARRAY;\n\n#pragma pack(pop)\n\n// IOCTL for UM application to KM driver\n\n#define OVR_STATUS_SUCCESS\t\t\t\t\t 0\n#define OVR_STATUS_FAIL\t\t\t\t\t\t-1\n#define OVR_STATUS_DRIVER_IN_USE\t\t\t-2\n#define OVR_STATUS_MODE_ALREADY_ACTIVE\t\t-3\n#define OVR_STATUS_RIFT_NOT_PRESENT\t\t\t-4\n\n//\n// Returns the number of Rift displays attached to the video adapter\n// If 0, no Rift displays have been connected.\n// If greater than 0, use this size to pre-allocate space for an array\n// of rift statuses\n//\n// Input Buffer: Nothing\n// Output Buffer: LONG - count of Rift displays attached to video adapter\n//\n#define IOCTL_RIFTMGR_GET_RIFT_COUNT CTL_CODE(FILE_DEVICE_VIDEO, \\\n\tFUNCTION_INDEX, METHOD_BUFFERED, FILE_ANY_ACCESS)\n\n//\n// Fills out a pre-allocated array with information on the individually attached\n// screens.\n// \n// On Input, specify the arraySize as the size of the allocation.\n//\n// On Output, the arraySize will be updated with the actual number of Rifts\n// reported. Use IOCTL_RIFTMGR_GET_RIFT_COUNT to query the number of Rifts.\n// If the count changes (added or removed) between calls, the function will either fail\n// due to the buffer being too small, or the arraySize count will be updated\n// with a new count of devices along with their respective parameters.\n//\n// Input Buffer: PRIFT_STATUS - Pointer to allocated status array\n// Output Buffer: LONG - Count of Rift displays reported in the structure. -1 if out of\n//\t\t\t\t\t\t memory\t\t\t\t\t\t\n//\n#define IOCTL_RIFTMGR_GET_RIFT_ARRAY CTL_CODE(FILE_DEVICE_VIDEO, \\\n\tFUNCTION_INDEX + 1, METHOD_NEITHER, FILE_ANY_ACCESS)\n\n// Changes the mode of an attached Rift (DEPRECATED)\n// Input Buffer: PRIFT_MODE - Pointer to a mode structure specifying the childUid and\n//\t\t\t\t\t\t\t  mode for a particular Rift\n// Output Buffer: LONG\t\t- Non-zero on error, 0 on successful mode change\n//\n#define IOCTL_RIFTMGR_SET_RIFT_MODE CTL_CODE(FILE_DEVICE_VIDEO, \\\n\tFUNCTION_INDEX + 2, METHOD_NEITHER, FILE_ANY_ACCESS)\n\n// Lock the primary of the rift and obtain an address\n// Input Buffer: ULONG\t\t\t- ChildUid of a Rift as previously discovered\n// Output Buffer: ULONG_PTR\t\t- Pointer to a usermode mapped address of the primary\n#define IOCTL_RIFTMGR_GET_RIFT_PRIMARY CTL_CODE(FILE_DEVICE_VIDEO, \\\n\tFUNCTION_INDEX + 3, METHOD_NEITHER, FILE_ANY_ACCESS)\n\n// Release Rift primary\n// Input Buffer: PULONG_PTR\t\t- ChildUid of a Rift as previously discovered and virtual pointer\n// Output Buffer: NOTHING\n#define IOCTL_RIFTMGR_RELEASE_RIFT_PRIMARY CTL_CODE(FILE_DEVICE_VIDEO, \\\n\tFUNCTION_INDEX + 4, METHOD_NEITHER, FILE_ANY_ACCESS)\n\n\n// Point the rift to another render target\n// Input Buffer: PHANDLE\t\t- Array of handles, rift and the render target resource\n// Output Buffer: NOTHING\n#define IOCTL_RIFTMGR_SETRIFTBUFFER CTL_CODE(FILE_DEVICE_VIDEO, \\\n\tFUNCTION_INDEX + 5, METHOD_NEITHER, FILE_ANY_ACCESS)\n\n// Enable or disable vsync on Rift present\n// Input Buffer: PRIFT_SYNC\t\t- Pointer to a mode structure specifying the childUid and\n//\t\t\t\t\t\t\t\t  and sync\n// Output Buffer: NOTHING\n#define IOCTL_RIFTMGR_SETVSYNCMODE CTL_CODE(FILE_DEVICE_VIDEO, \\\n\tFUNCTION_INDEX + 6, METHOD_NEITHER, FILE_ANY_ACCESS)\n\n// Get scan line\n// Input Buffer: ULONG\t\t\t- ChildUid of a Rift as previously discovered\n// Output Buffer: ULONG\t\t\t- 31st bit is set if in vertical blank, high 15 bits has per second \n//\t\t\t\t\t\t\t\t  frame number (0-74), low 16 bits has scanline (0-1919)\n#define IOCTL_RIFTMGR_GETSCANLINE CTL_CODE(FILE_DEVICE_VIDEO, \\\n\tFUNCTION_INDEX + 7, METHOD_NEITHER, FILE_ANY_ACCESS)\n\n// Enable or disable compatibility mode. Entering compatibility mode will fail if\n// the Rift is already actively scanning out a surface\n// Input Buffer: LONG\t\t\t- Bit assignments:\n// LSB (bit 0) is a flag for compatibility mode itself.\n//      1 means compatibility mode.\n//      0 means application direct mode.\n// Bit 1 means \"Hide DK1's\".\n//      1 means operate DK1's in synchronous with the compatibility mode exactly.\n//      0 means operate in DK1 legacy mode.\n// Output Buffer: LONG\t\t\t- Result value (see OVR statuses)\n//\t\t\t\t\t\t\t\t   0 = success\n//\t\t\t\t\t\t\t\t  -1 = general failure\n//\t\t\t\t\t\t\t\t  -2 = failure, rift scanning out\n//                                -3 = already active\n//                                -4 = rift not present\n#define IOCTL_RIFTMGR_SETCOMPATIBILITYMODE CTL_CODE(FILE_DEVICE_VIDEO, \\\n\tFUNCTION_INDEX + 8, METHOD_NEITHER, FILE_ANY_ACCESS)\n\n// Call to obtain the current status of compatibility mode\n// Input Buffer: NOTHING\n// Output Buffer: LONG\t\t\t- Bit assignments:\n// LSB (bit 0) is a flag for compatibility mode itself.\n//      1 means compatibility mode.\n//      0 means application direct mode.\n// Bit 1 means \"Hide DK1's\".\n//      1 means operate DK1's in synchronous with the compatibility mode exactly.\n//      0 means operate in DK1 legacy mode.\n#define IOCTL_RIFTMGR_GETCOMPATIBILITYMODE CTL_CODE(FILE_DEVICE_VIDEO, \\\n\tFUNCTION_INDEX + 9, METHOD_NEITHER, FILE_ANY_ACCESS)\n\n// Call to set the power mode of a particular Rift\n// Input Buffer: PULONG_PTR\t\t- ChildUid of a Rift as previously discovered and ULONG value\n//\t\t\t\t\t\t\t      second ULONG has value of \n//\t\t\t\t\t\t\t\t  0 to simply obtain the power status of the display\n//\t\t\t\t\t\t\t\t  1 to set the display into a full power state (needs a primary to fully scan out)\n//\t\t\t\t\t\t\t\t  2 to set the display into sleep mode\n//\t\t\t\t\t\t\t\t  3 to set the display into full power off mode (WARNING: Will potentially trash primary)\n// Output Buffer: LONG\t\t\t- Result value \n//\t\t\t\t\t\t\t\t  0 = Failure to obtain power status\n//\t\t\t\t\t\t\t\t  1 = Full power\n//\t\t\t\t\t\t\t\t  2 = Sleep\n//\t\t\t\t\t\t\t\t  3 = Power off\n#define IOCTL_RIFTMGR_DISPLAYPOWER CTL_CODE(FILE_DEVICE_VIDEO, \\\n\tFUNCTION_INDEX + 10, METHOD_NEITHER, FILE_ANY_ACCESS)\n\n// Return the EDID of the display in the output buffer. The driver\n// will copy as many bytes as possible to fill the buffer.\n// Input Buffer: ULONG\t\t\t- ChildUid of a Rift as previously discovered\n// Output Buffer: PCHAR\t\t\t- Preallocated buffer of a variable size to store the EDID from the display\n#define IOCTL_RIFTMGR_GETEDID CTL_CODE(FILE_DEVICE_VIDEO, \\\n\tFUNCTION_INDEX + 11, METHOD_NEITHER, FILE_ANY_ACCESS)\n\n#define IOCTL_RIFTMGR_WAITFORVSYNC CTL_CODE(FILE_DEVICE_VIDEO, \\\n    FUNCTION_INDEX + 12, METHOD_NEITHER, FILE_ANY_ACCESS)\n\n// Return information about the currently scanned out frame to the rift\n// Input Buffer: ULONG\t\t\t- ChildUid of a Rift as previously discovered\n// Output Buffer: UINT64[2]\t    - Preallocated buffer of 2 UINT64s to hold CurrentFrameIndex & QPC time of current scan out start\n#define IOCTL_RIFTMGR_GETCURRENTFRAMEINFO CTL_CODE(FILE_DEVICE_VIDEO, \\\n    FUNCTION_INDEX + 13, METHOD_NEITHER, FILE_ANY_ACCESS)\n\n// Return the kernel index of the adapter that the rift is connected to\n// Input Buffer: ULONG\t\t\t- ChildUid of a Rift as previously discovered\n// Output Buffer: ULONG\t        - The kernel adapter index\n#define IOCTL_RIFTMGR_GETRIFTADAPTERID CTL_CODE(FILE_DEVICE_VIDEO, \\\n    FUNCTION_INDEX + 14, METHOD_NEITHER, FILE_ANY_ACCESS)\n\n#endif\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Displays/OVR_Win32_FocusReader.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Win32_FocusReader.cpp\nContent     :   Reader for current app with focus on Windows\nCreated     :   July 2, 2014\nAuthors     :   Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include \"OVR_Win32_FocusReader.h\"\n#include \"Kernel/OVR_Log.h\"\n#include \"../Service/Service_NetClient.h\"\n\nOVR_DEFINE_SINGLETON(OVR::Win32::RenderFocusReader);\n\nnamespace OVR { namespace Win32 {\n\n\nHWND RenderFocusReader::ReadActiveWindow()\n{\n    const LocklessFocusState* focusState = Reader.Get();\n\n    if (!focusState || NoSharedMemory)\n    {\n        if (!Reader.Open(OVR_FOCUS_OBSERVER_SHARE_NAME))\n        {\n            OVR_DEBUG_LOG((\"[Win32ShimFunctions] Unable to open the shared memory space\"));\n            // Note: This should only warn and not assert because it is normal behavior when the server is not running.\n            NoSharedMemory = true;\n            return 0;\n        }\n\n        focusState = Reader.Get();\n        if (!focusState)\n        {\n            OVR_DEBUG_LOG((\"[Win32ShimFunctions] Unable to get the shared memory space\"));\n            NoSharedMemory = true;\n            return 0;\n        }\n    }\n\n    return (HWND)Ptr64ToPtr(focusState->ActiveWindowHandle);\n}\n\nRenderFocusReader::RenderFocusReader() :\n    NoSharedMemory(false)\n{\n\t// Must be at end of function\n    PushDestroyCallbacks();\n}\n\nRenderFocusReader::~RenderFocusReader()\n{\n}\n\nvoid RenderFocusReader::OnSystemDestroy()\n{\n    delete this;\n}\n\n\n}} // namespace OVR::Win32\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Displays/OVR_Win32_FocusReader.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Win32_FocusReader.h\nContent     :   Reader for current app with focus on Windows\nCreated     :   July 2, 2014\nAuthors     :   Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Win32_FocusReader_h\n#define OVR_Win32_FocusReader_h\n\n#include \"Kernel/OVR_System.h\"\n#include \"Kernel/OVR_Lockless.h\"\n#include \"Kernel/OVR_Array.h\"\n#include \"Kernel/OVR_SharedMemory.h\"\n\nnamespace OVR { namespace Win32 {\n\n\n#define OVR_FOCUS_OBSERVER_SHARE_NAME \"OVRAppFocus\"\n\n//-----------------------------------------------------------------------------\n// LocklessFocusState\n\n#pragma pack(push, 8)\n\n// Focus state data\nstruct LocklessFocusState\n{\n    LocklessFocusState(DWORD pid = 0) :\n        ActiveProcessId(pid),\n        ActiveWindowHandle(NULL)\n    {\n    }\n\n    DWORD ActiveProcessId;\n    void * POINTER_64 ActiveWindowHandle;\n};\n\n#pragma pack(pop)\n\ntypedef SharedObjectWriter< LocklessFocusState > SharedFocusWriter;\ntypedef SharedObjectReader< LocklessFocusState > SharedFocusReader;\n\n\n//-----------------------------------------------------------------------------\n// RenderFocusReader\n\nclass RenderFocusReader : public OVR::SystemSingletonBase<RenderFocusReader>, public NewOverrideBase\n{\n    OVR_DECLARE_SINGLETON(RenderFocusReader);\n\n    SharedFocusReader         Reader;         // Shared memory reader\n    bool                      NoSharedMemory; // Flag reporting that no shared memory has been detected;\n\npublic:\n    HWND ReadActiveWindow();\n};\n\n\n}} // namespace OVR::Win32\n\n#endif // OVR_Win32_FocusReader_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Displays/OVR_Win32_RenderShim.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Win32_DisplayShim.cpp\nContent     :   Shared static functions for inclusion that allow for an application\n\t\t        to inject the usermode driver into an application\nCreated     :   March 21, 2014\nAuthors     :   Dean Beeler\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nUse of this software is subject to the terms of the Oculus Inc license\nagreement provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\n************************************************************************************/\n\n#include \"../../Include/OVR_Version.h\"\n\n#ifndef AVOID_LIB_OVR\n#include \"Kernel/OVR_Types.h\" // Without this we can get warnings (due to VC++ bugs) about _malloca being redefined, and miss LibOVR overrides.\n#include \"Kernel/OVR_Win32_IncludeWindows.h\"\n#else\n#include <windows.h>\n#ifndef NTSTATUS\n#define NTSTATUS DWORD\n#endif\n#endif\n\n#include <ObjBase.h>\n\n#include <DbgHelp.h>\n#include \"OVR_Win32_Dxgi_Display.h\"\n#include \"OVR_Win32_ShimVersion.h\"\n\n#if AVOID_LIB_OVR\n#define IN_COMPATIBILITY_MODE() (0)\n#else\n#include \"OVR_Win32_Display.h\"\n#define IN_COMPATIBILITY_MODE() OVR::Display::InCompatibilityMode()\n#endif\n\n#pragma comment(lib, \"DbgHelp.lib\")\n\n#ifndef alloca\n#include <malloc.h> // alloca\n#endif\n\n#define WIDE_TO_MB(wideString) \\\n    int wideString ## _slen = (int)wcslen(wideString); \\\n    char* wideString ## _cstr = (char*)alloca(wideString ## _slen * 2); \\\n    int count = WideCharToMultiByte(GetACP(), 0, wideString, -1, wideString ## _cstr, wideString ## _slen * 2, NULL, NULL); \\\n    wideString ## _cstr[count] = '\\0';\n\n// Forward declarations\n// These functions are implemented in OVR_Win32_DisplayDevice.cpp.\n\nBOOL WINAPI OVRIsInitializingDisplay( PVOID context, UINT width, UINT height );\nBOOL WINAPI OVRIsCreatingBackBuffer( PVOID context );\nBOOL WINAPI OVRShouldVSync( );\nULONG WINAPI OVRRiftForContext( PVOID context, HANDLE driverHandle );\nBOOL WINAPI OVRCloseRiftForContext( PVOID context, HANDLE driverHandle, ULONG rift );\nBOOL WINAPI OVRWindowDisplayResolution( PVOID context, UINT* width, UINT* height,\n\t\t\t\t\t\t\t\t\t   UINT* titleHeight, UINT* borderWidth,\n\t\t\t\t\t\t\t\t\t   BOOL* vsyncEnabled );\nBOOL WINAPI OVRExpectedResolution( PVOID context, UINT* width, UINT* height, UINT* rotationInDegrees );\nBOOL WINAPI OVRShouldEnableDebug();\nBOOL WINAPI OVRMirroringEnabled( PVOID context );\nHWND WINAPI OVRGetWindowForContext(PVOID context);\nBOOL WINAPI OVRShouldPresentOnContext(PVOID context);\n\nstatic const char* GFX_DRIVER_KEY_FMT = \"SYSTEM\\\\CurrentControlSet\\\\Control\\\\Class\\\\{4d36e968-e325-11ce-bfc1-08002be10318}\\\\%04d\";\n#ifdef _WIN64\nstatic const char* RTFilter = \"OVRDisplayRT64.dll\";\nstatic const char* UMFilter = \"OVRDisplay64.dll\";\n#else\nstatic const char* RTFilter = \"OVRDisplayRT32.dll\";\nstatic const char* UMFilter = \"OVRDisplay32.dll\";\n#endif\nstatic const char* OptimusDrivers = \"nvumdshimx.dll nvumdshim.dll\";\n\ntypedef enum OVRTargetAPI\n{\n\tDirectX,\n\tOpenGL\n};\n\nstatic PVOID lastContext = NULL;\nLINK_APPLICATION_DRIVER appDriver = {0};\nstatic INT apiVersion = 10;\n\nstatic CHAR* ReadRegStr(HKEY keySub, const char* keyName, const char* valName)\n{\n\tCHAR *val = NULL;\n\tREGSAM access = KEY_READ;\n\tHKEY hKey;\n\nTryAgainWOW64:\n\tNTSTATUS res = RegOpenKeyExA( keySub, keyName, 0, access, &hKey );\n\tif ( res == ERROR_SUCCESS ) \n\t{ \n\t\tDWORD valLen;\n\t\tres = RegQueryValueExA( hKey, valName, NULL, NULL, NULL, &valLen );\n\t\tif( res == ERROR_SUCCESS ) {\n\t\t\tval = (CHAR*)calloc( valLen + 1, sizeof(CHAR) );\n\t\t\tres = RegQueryValueExA( hKey, valName, NULL, NULL, (LPBYTE)val, &valLen );\n\n\t\t\tif( res == ERROR_SUCCESS )\n\t\t\t{\n\t\t\t\tCHAR* byte = val;\n\t\t\t\tfor( DWORD j = 0; j < valLen; ++j )\n\t\t\t\t{\n\t\t\t\t\tif( byte[j] == 0 )\n\t\t\t\t\t\tbyte[j] = ' ';\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfree( val );\n\t\t\t\tval = NULL;\n\t\t\t}\n\t\t}\n\t\tRegCloseKey( hKey ); \n\t}\n\n\tif( res == ERROR_FILE_NOT_FOUND && keySub == HKEY_LOCAL_MACHINE && access == KEY_READ  ) {\n#ifdef _WIN64\n\t\taccess = KEY_READ | KEY_WOW64_32KEY;\n#else\n\t\taccess = KEY_READ | KEY_WOW64_64KEY;\n#endif\n\t\tgoto TryAgainWOW64;\n\t}\n\treturn val;\n}\n\n#define OLD_DATA_BACKUP_SIZE 16\n\nstatic WinLoadLibraryA       oldProcA = NULL; // Note: This is used to indicate that the shim is in place\nstatic WinLoadLibraryExA     oldProcExA = NULL;\nstatic WinLoadLibraryW       oldProcW = NULL;\nstatic WinLoadLibraryExW     oldProcExW = NULL;\nstatic WinGetModuleHandleExA oldProcModExA = NULL;\nstatic WinGetModuleHandleExW oldProcModExW = NULL;\nstatic WinDirect3DCreate9    oldDirectX9Create = NULL;\nstatic BYTE                  oldDirectX9CreateData[OLD_DATA_BACKUP_SIZE];\nstatic WinDirect3DCreate9Ex  oldDirectX9ExCreate = NULL;\nstatic BYTE                  oldDirectX9ExCreateData[OLD_DATA_BACKUP_SIZE];\nstatic WinCreateDXGIFactory\t oldCreateDXGIFactory = NULL;\nstatic BYTE                  oldCreateDXGIFactoryData[OLD_DATA_BACKUP_SIZE];\nstatic WinCreateDXGIFactory1 oldCreateDXGIFactory1 = NULL;\nstatic BYTE                  oldCreateDXGIFactory1Data[OLD_DATA_BACKUP_SIZE];\nstatic WinCreateDXGIFactory2 oldCreateDXGIFactory2 = NULL;\nstatic BYTE                  oldCreateDXGIFactory2Data[OLD_DATA_BACKUP_SIZE];\n\n#define NUM_LOADER_LIBS 4\n\nstatic const char* loaderLibraryList[NUM_LOADER_LIBS] = {\n    \"kernel32.dll\",\n    \"api-ms-win-core-libraryloader-l1-2-0.dll\",\n    \"api-ms-win-core-libraryloader-l1-1-0.dll\",\n    \"api-ms-win-core-libraryloader-l1-1-1.dll\"\n};\n\nenum ShimedLibraries\n{\n    ShimLibDXGI      = 0,\n    ShimLibD3D9      = 1,\n    ShimLibD3D11     = 2,\n    ShimLibDXGIDebug = 3,\n    ShimLibD3D10Core = 4,\n    ShimLibD3D10     = 5,\n    ShimLibGL        = 6,\n    ShimCountMax     = 7\n};\n\nstatic const char* dllList[ShimCountMax] = {\n    \"dxgi.dll\",\n    \"d3d9.dll\",\n    \"d3d11.dll\",\n    \"dxgidebug.dll\",\n    \"d3d10core.dll\",\n    \"d3d10.dll\",\n    \"opengl32.dll\"\n};\n\nstatic HINSTANCE oldLoaderInstances[ShimCountMax] = { NULL };\nstatic PROC oldLoaderProcA[ShimCountMax][NUM_LOADER_LIBS] = { { NULL } };\nstatic PROC oldLoaderProcW[ShimCountMax][NUM_LOADER_LIBS] = { { NULL } };\nstatic PROC oldLoaderProcExA[ShimCountMax][NUM_LOADER_LIBS] = { { NULL } };\nstatic PROC oldLoaderProcExW[ShimCountMax][NUM_LOADER_LIBS] = { { NULL } };\nstatic PROC oldLoaderProcModExA[ShimCountMax][NUM_LOADER_LIBS] = { { NULL } };\nstatic PROC oldLoaderProcModExW[ShimCountMax][NUM_LOADER_LIBS] = { { NULL } };\n\nstatic HMODULE rtFilterModule = NULL;\n\nstatic bool checkForOverride( LPCSTR libFileName, OVRTargetAPI& targetApi )\n{\n\tfor (int i=0; ; i++)\n\t{\n\t\tCHAR keyString[256] = {0};\n\n\t\tsprintf_s( keyString, 256, GFX_DRIVER_KEY_FMT, i );\n\n\t\tCHAR* infSection = ReadRegStr( HKEY_LOCAL_MACHINE, keyString, \"InfSection\" );\n\n\t\t// No provider name means we're out of display enumerations\n\t\tif( infSection == NULL )\n\t\t\tbreak;\n\n\t\tfree(infSection);\n\n\t\t// Check 64-bit driver names followed by 32-bit driver names\n\t\tconst char* driverKeys[] = {\"UserModeDriverName\", \"UserModeDriverNameWoW\", \"OpenGLDriverName\", \"OpenGLDriverNameWoW\", \"InstalledDisplayDrivers\" };\n\t\tfor( int j = 0; j < 6; ++j )\n\t\t{\n\t\t\tCHAR userModeList[4096] = {0};\n\t\t\t\n\t\t\tswitch(j)\n\t\t\t{\n\t\t\t\tcase 5:\n\t\t\t\t\tstrcpy_s( userModeList, 4095, OptimusDrivers );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t{\n\t\t\t\t\t\tCHAR* regString = ReadRegStr( HKEY_LOCAL_MACHINE, keyString, driverKeys[j] );\n\t\t\t\t\t\tif( regString )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstrcpy_s( userModeList, 4095, regString );\n\t\t\t\t\t\t\tfree( regString );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tchar *nextToken = NULL;\n\n\t\t\tif( userModeList )\n\t\t\t{\n\t\t\t\tchar* first = strtok_s( userModeList, \" \", &nextToken );\n\t\t\t\twhile( first )\n\t\t\t\t{\n\t\t\t\t\tif( strstr( libFileName, first ) != 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\tif( j < 2 )\n\t\t\t\t\t\t\ttargetApi = DirectX;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\ttargetApi = OpenGL;\n\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tfirst = strtok_s( NULL, \" \", &nextToken );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nstatic HMODULE createShim( LPCSTR lpLibFileName, OVRTargetAPI targetAPI )\n{\n\t//Sleep(10000);\n\tif( IN_COMPATIBILITY_MODE() )\n\t{\n\t\treturn (*oldProcA)( lpLibFileName );\n\t}\n\n\tUNREFERENCED_PARAMETER( targetAPI );\n\n\tHMODULE result = NULL;\n\n\tresult = (*oldProcA)( UMFilter );\n\n\tif( result )\n\t{\n\t\tPreloadLibraryFn loadFunc = (PreloadLibraryFn)GetProcAddress( result, \"PreloadLibrary\" );\n\t\tif( loadFunc )\n\t\t{\n\t\t\tHRESULT localRes = (*loadFunc)( oldProcA, lpLibFileName, &appDriver );\n\t\t\tif( localRes != S_OK )\n\t\t\t\tresult = NULL;\n\t\t}\n\t}\n\n\tif( !result )\n\t{\n        MessageBox(nullptr, L\"Unable to find the Rift Display Driver.\", L\"Configuration Error\", MB_OK | MB_ICONERROR);\n\t\tresult = (*oldProcA)( lpLibFileName );\n\t}\n\treturn result;\n}\n\nstatic HMODULE\n\tWINAPI\n\tOVRLoadLibraryA(\n\t__in LPCSTR lpLibFileName\n\t)\n{\n\tOVRTargetAPI targetAPI = DirectX;\n\tbool needShim = checkForOverride( lpLibFileName, targetAPI );\n\tif( !needShim )\n\t\treturn (*oldProcA)( lpLibFileName );\n\n\treturn createShim( lpLibFileName, targetAPI );\n}\n\nstatic HMODULE\n\tWINAPI\n\tOVRLoadLibraryW(\n\t__in LPCWSTR lpLibFileName\n\t)\n{\n    WIDE_TO_MB(lpLibFileName); // Convert lpLibFileName -> lpLibFileName_cstr\n\n\tOVRTargetAPI targetAPI = DirectX;\n\n    bool needShim = checkForOverride( lpLibFileName_cstr, targetAPI );\n\tif( !needShim )\t\n\t\treturn (*oldProcW)( lpLibFileName );\n\n    return createShim( lpLibFileName_cstr, targetAPI );\n}\n\nstatic HMODULE\n\tWINAPI\n\tOVRLoadLibraryExA(\n\t__in       LPCSTR lpLibFileName,\n\t__reserved HANDLE hFile,\n\t__in       DWORD dwFlags\n\n\t)\n{\n\tOVRTargetAPI targetAPI = DirectX;\n\n\tbool needShim = checkForOverride( lpLibFileName, targetAPI );\n\tif( !needShim )\n\t\treturn (*oldProcExA)( lpLibFileName, hFile, dwFlags );\n\n\t// FIXME: Don't throw away the flags parameter\n\treturn createShim( lpLibFileName, targetAPI );\n}\n\nstatic HMODULE\n\tWINAPI\n\tOVRLoadLibraryExW(\n\t__in       LPCWSTR lpLibFileName,\n\t__reserved HANDLE hFile,\n\t__in       DWORD dwFlags\n\t)\n{\n    WIDE_TO_MB(lpLibFileName); // Convert lpLibFileName -> lpLibFileName_cstr\n\n\tOVRTargetAPI targetAPI = DirectX;\n\n\tbool needShim = checkForOverride( lpLibFileName_cstr, targetAPI );\n\tif( !needShim )\n\t\treturn (*oldProcExW)( lpLibFileName, hFile, dwFlags );\n\n\t// FIXME: Don't throw away the flags parameter\n\treturn createShim( lpLibFileName_cstr, targetAPI );\n}\n\nstatic BOOL WINAPI OVRGetModuleHandleExA(\n\t__in      DWORD dwFlags,\n\t__in_opt  LPCSTR lpModuleName,\n\t__out    HMODULE *phModule\n\t)\n{\n\tOVRTargetAPI targetAPI = DirectX;\n\n\tbool needShim = checkForOverride( lpModuleName, targetAPI );\n\tif( !needShim )\n\t{\n\t\treturn (*oldProcModExA)( dwFlags, lpModuleName, phModule );\n\t}\n\t\n\t*phModule = createShim( lpModuleName, targetAPI );\n\n\treturn TRUE;\n}\n\nstatic BOOL WINAPI OVRGetModuleHandleExW(\n\t__in      DWORD dwFlags,\n\t__in_opt  LPCWSTR lpModuleName,\n\t__out    HMODULE *phModule\n\t)\n{\n    WIDE_TO_MB(lpModuleName); // Convert lpModuleName -> lpModuleName_cstr\n\n    OVRTargetAPI targetAPI = DirectX;\n\n\tbool needShim = checkForOverride( lpModuleName_cstr, targetAPI );\n\tif( !needShim )\n\t{\n\t\treturn (*oldProcModExW)( dwFlags, lpModuleName, phModule );\n\t}\n\n\t*phModule = createShim( lpModuleName_cstr, targetAPI );\n\n\treturn TRUE;\n}\n\n#ifdef _AMD64_\nstatic void restoreFunction( PROC pfnHookAPIAddr, PBYTE oldData )\n{\n\tstatic const LONGLONG addressSize = sizeof(PROC);\n\tstatic const LONGLONG jmpSize = addressSize + 6;\n\n\tDWORD oldProtect;\n\tVirtualProtect((LPVOID)pfnHookAPIAddr, OLD_DATA_BACKUP_SIZE,                       \n\t\tPAGE_EXECUTE_READWRITE, &oldProtect);\n\n\tmemcpy(pfnHookAPIAddr, oldData, OLD_DATA_BACKUP_SIZE);  \n\n\tVirtualProtect((LPVOID)pfnHookAPIAddr, OLD_DATA_BACKUP_SIZE, oldProtect, NULL);  \n}\n\nstatic void setFunction( PROC pfnHookAPIAddr, PROC replacementFunction, PBYTE oldData )\n{\n\tstatic const LONGLONG addressSize = sizeof(PROC);\n\tstatic const LONGLONG jmpSize = addressSize + 6;\n\n\tINT_PTR jumpOffset = (INT_PTR)replacementFunction;\n\n\tDWORD oldProtect;\n\tVirtualProtect((LPVOID)pfnHookAPIAddr, OLD_DATA_BACKUP_SIZE,                       \n\t\tPAGE_EXECUTE_READWRITE, &oldProtect);\n\n\tmemcpy(oldData, pfnHookAPIAddr, OLD_DATA_BACKUP_SIZE);\n\n\tPBYTE functionData = (PBYTE)pfnHookAPIAddr;\n\tfunctionData[0] = 0xff; // JMP [RIP+0]\n\tfunctionData[1] = 0x25; //\n\tfunctionData[2] = 0x00; //\n\tfunctionData[3] = 0x00; //\n\tfunctionData[4] = 0x00; //\n\tfunctionData[5] = 0x00; //\n\tmemcpy( functionData + 6, &jumpOffset, sizeof( INT_PTR ) );\n\n\tVirtualProtect((LPVOID)pfnHookAPIAddr, OLD_DATA_BACKUP_SIZE, oldProtect, NULL);  \n}\n#else\nstatic void restoreFunction( PROC pfnHookAPIAddr, PBYTE oldData )\n{\n\tstatic const LONGLONG addressSize = sizeof(PROC);\n\tstatic const LONGLONG jmpSize = addressSize + 1;\n\n\tDWORD oldProtect;\n\tVirtualProtect((LPVOID)pfnHookAPIAddr, jmpSize,                       \n\t\tPAGE_EXECUTE_READWRITE, &oldProtect);\n\n\tmemcpy(pfnHookAPIAddr, oldData, jmpSize);  \n\n\tVirtualProtect((LPVOID)pfnHookAPIAddr, jmpSize, oldProtect, NULL);  \n}\n\nstatic void setFunction( PROC pfnHookAPIAddr, PROC replacementFunction, PBYTE oldData )\n{\n\tstatic const LONGLONG addressSize = sizeof(PROC);\n\tstatic const LONGLONG jmpSize = addressSize + 1;\n\n\tINT_PTR jumpOffset = (INT_PTR)replacementFunction - (INT_PTR)pfnHookAPIAddr - jmpSize;\n\n\tDWORD oldProtect;\n\tVirtualProtect((LPVOID)pfnHookAPIAddr, jmpSize,                       \n\t\tPAGE_EXECUTE_READWRITE, &oldProtect);\n\n\tmemcpy(oldData, pfnHookAPIAddr, jmpSize);\n\n\tPBYTE functionData = (PBYTE)pfnHookAPIAddr;\n\tmemcpy( oldData, functionData, jmpSize );\n\tfunctionData[0] = 0xe9;\n\tmemcpy( functionData + 1, &jumpOffset, sizeof( INT_PTR ) );\n\n\tVirtualProtect((LPVOID)pfnHookAPIAddr, jmpSize, oldProtect, NULL);  \n}\n#endif\n\nstatic BOOL WINAPI OVRLocalIsInitializingDisplay( PVOID context, UINT width, UINT height )\n{\n\tUINT expectedWidth, expectedHeight, rotation;\n\n\tOVRExpectedResolution( context, &expectedWidth, &expectedHeight, &rotation );\n\n\tif( appDriver.pfnActiveAPIVersion )\n\t\tapiVersion = (*appDriver.pfnActiveAPIVersion)( context );\n\n\tswitch( apiVersion )\n\t{\n\t\tcase 1:  // OpenGL\n\t\tcase 10: // DirectX 1X\n\t\t\tif( width == expectedWidth && height == expectedHeight )\n\t\t\t\treturn TRUE;\n\t\t\tbreak;\n\t\tcase 9: // DirectX 9\n\t\t\tif( rotation == 90 || rotation == 270 )\n\t\t\t{\n\t\t\t\tif( width == expectedHeight && height == expectedWidth )\n\t\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif( width == expectedWidth && height == expectedHeight )\n\t\t\t\t\treturn TRUE;\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\treturn FALSE;\n}\n\n\nHRESULT APIENTRY OVRDirect3DCreate9Ex(UINT SDKVersion, void** aDevice)\n{\n\tapiVersion = 9;\n\n\tHRESULT result = S_OK;\n\n\trestoreFunction( (PROC)oldDirectX9ExCreate, oldDirectX9ExCreateData );\n\n    if (IN_COMPATIBILITY_MODE())\n    {\n        result = (*oldDirectX9ExCreate)(SDKVersion, aDevice);\n    }\n    else\n    {\n        WinDirect3DCreate9Ex createFunction = (WinDirect3DCreate9Ex)GetProcAddress(rtFilterModule, \"Direct3DCreate9Ex\");\n        result = (*createFunction)(SDKVersion, aDevice);\n    }\n\n\tsetFunction( (PROC)oldDirectX9ExCreate, (PROC)OVRDirect3DCreate9Ex, oldDirectX9ExCreateData );\n\n\tprintf(\"%s result 0x%x\\n\", __FUNCTION__, result);\n\n\treturn result;\n}\n\nvoid* APIENTRY OVRDirect3DCreate9(UINT SDKVersion)\n{\n\tvoid* result = NULL;\n\n\tOVRDirect3DCreate9Ex( SDKVersion, &result );\n\n\treturn result;\n}\n\nHRESULT APIENTRY OVRCreateDXGIFactory(\n\t__in   REFIID riid,\n\t__out  void **ppFactory\n\t)\n{\n\tHRESULT result = E_FAIL;\n\n\trestoreFunction( (PROC)oldCreateDXGIFactory, oldCreateDXGIFactoryData );\n\n    if (IN_COMPATIBILITY_MODE())\n    {\n        result = (*oldCreateDXGIFactory)(riid, ppFactory);\n    }\n    else\n    {\n        WinCreateDXGIFactory createFunction = (WinCreateDXGIFactory)GetProcAddress(rtFilterModule, \"CreateDXGIFactory\");\n        result = (*createFunction)(riid, ppFactory);\n    }\n\n\tsetFunction( (PROC)oldCreateDXGIFactory, (PROC)OVRCreateDXGIFactory, oldCreateDXGIFactoryData );\n\n\tprintf(\"%s result 0x%x\\n\", __FUNCTION__, result);\n\n\treturn result;\n}\n\nHRESULT APIENTRY OVRCreateDXGIFactory1(\n\t__in   REFIID riid,\n\t__out  void **ppFactory\n\t)\n{\n\tHRESULT result = E_FAIL;\n\n\trestoreFunction( (PROC)oldCreateDXGIFactory1, oldCreateDXGIFactory1Data );\n\n    if (IN_COMPATIBILITY_MODE())\n    {\n        result = (*oldCreateDXGIFactory1)(riid, ppFactory);\n    }\n    else\n    {\n        WinCreateDXGIFactory1 createFunction = (WinCreateDXGIFactory1)GetProcAddress(rtFilterModule, \"CreateDXGIFactory1\");\n        result = (*createFunction)(riid, ppFactory);\n    }\n\n\tsetFunction( (PROC)oldCreateDXGIFactory1, (PROC)OVRCreateDXGIFactory1, oldCreateDXGIFactory1Data );\n\n\tprintf(\"%s result 0x%x\\n\", __FUNCTION__, result);\n\n\treturn result;\n}\n\nHRESULT APIENTRY OVRCreateDXGIFactory2(\n\t__in   UINT flags,\n\t__in   const IID &riid,\n\t__out  void **ppFactory\n\t)\n{\n\tHRESULT result = E_FAIL;\n\n\trestoreFunction( (PROC)oldCreateDXGIFactory2, oldCreateDXGIFactory2Data );\n\n    if (IN_COMPATIBILITY_MODE())\n    {\n        result = (*oldCreateDXGIFactory2)(flags, riid, ppFactory);\n    }\n    else\n    {\n        WinCreateDXGIFactory2 createFunction = (WinCreateDXGIFactory2)GetProcAddress(rtFilterModule, \"CreateDXGIFactory2\");\n        result = (*createFunction)(flags, riid, ppFactory);\n    }\n\n\tsetFunction( (PROC)oldCreateDXGIFactory2, (PROC)OVRCreateDXGIFactory2, oldCreateDXGIFactory2Data );\n\n\tprintf(\"%s result 0x%x\\n\", __FUNCTION__, result);\n\n\treturn result;\n}\n\nstatic PROC SetProcAddressDirect(\n\t__in HINSTANCE hInstance,\n\t__in LPCSTR lpProcName,\n\t__in PROC  newFunction,\n\t__inout  BYTE* oldData\n\t)\n{\n\tstatic const LONGLONG addressSize = sizeof(PROC);\n\tstatic const LONGLONG jmpSize = addressSize + 1;\n\n\tPROC result = NULL;\n\n\tPROC pfnHookAPIAddr = GetProcAddress( hInstance, lpProcName );\n\n\tif( pfnHookAPIAddr )\n\t{\n\t\tresult = pfnHookAPIAddr;\n\n\t\tsetFunction( pfnHookAPIAddr, newFunction, oldData );\n\t}\n\n\treturn result;\n}\n\nstatic PROC SetProcAddressA(\n\t__in  HINSTANCE targetModule,\n\t__in  LPCSTR lpLibFileName,\n\t__in  LPCSTR lpProcName,\n\t__in  PROC  newFunction,\n    __in  PROC  origFunction = NULL\n\t)\n{\n    HMODULE hModule = LoadLibraryA( lpLibFileName );\n    if(hModule == NULL)\n        return NULL;\n\n    // To do: call FreeLibrary(hModule) at the appropriate time.\n\tPROC pfnHookAPIAddr = (origFunction != NULL) ? origFunction : GetProcAddress(hModule, lpProcName );\n\n\tHINSTANCE hInstance = targetModule; \n\n\tULONG ulSize;\n\tPIMAGE_IMPORT_DESCRIPTOR pImportDesc = \n\t\t(PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(\n\t\thInstance,\n\t\tTRUE,\n\t\tIMAGE_DIRECTORY_ENTRY_IMPORT,\n\t\t&ulSize\n\t\t);\n\n\twhile (pImportDesc->Name)\n\t{\n\t\tPSTR pszModName = (PSTR)((PBYTE) hInstance + pImportDesc->Name);\n\t\tif (_stricmp(pszModName, lpLibFileName) == 0) \n\t\t\tbreak;   \n\t\tpImportDesc++;\n\t}\n\n\tPIMAGE_THUNK_DATA pThunk = \n\t\t(PIMAGE_THUNK_DATA)((PBYTE) hInstance + pImportDesc->FirstThunk);\n\n\twhile (pThunk->u1.Function)\n\t{\n\t\tPROC* ppfn = (PROC*) &pThunk->u1.Function;\n\t\tBOOL bFound = (*ppfn == pfnHookAPIAddr);\n\n\t\tif (bFound) \n\t\t{\n\t\t\tMEMORY_BASIC_INFORMATION mbi;\n\t\t\tVirtualQuery(\n\t\t\t\tppfn,\n\t\t\t\t&mbi,\n\t\t\t\tsizeof(MEMORY_BASIC_INFORMATION)\n\t\t\t\t);\n\t\t\tVirtualProtect(\n\t\t\t\tmbi.BaseAddress,\n\t\t\t\tmbi.RegionSize,\n\t\t\t\tPAGE_READWRITE,\n\t\t\t\t&mbi.Protect);\n\n\t\t\t*ppfn = *newFunction;\n\n\t\t\tDWORD dwOldProtect;\n\t\t\tVirtualProtect(\n\t\t\t\tmbi.BaseAddress,\n\t\t\t\tmbi.RegionSize,\n\t\t\t\tmbi.Protect,\n\t\t\t\t&dwOldProtect\n\t\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tpThunk++;\n\t}\n\n\treturn pfnHookAPIAddr;\n}\n\nvoid clearUMDriverOverrides()\n{\n    if (lastContext != NULL)\n    {\n        // Unpatch all the things.\n\n        if (oldCreateDXGIFactory)\n        {\n            restoreFunction((PROC)oldCreateDXGIFactory, oldCreateDXGIFactoryData);\n        }\n        if (oldCreateDXGIFactory1)\n        {\n            restoreFunction((PROC)oldCreateDXGIFactory1, oldCreateDXGIFactory1Data);\n        }\n        if (oldCreateDXGIFactory2)\n        {\n            restoreFunction((PROC)oldCreateDXGIFactory2, oldCreateDXGIFactory2Data);\n        }\n        if (oldDirectX9Create)\n        {\n            restoreFunction((PROC)oldDirectX9Create, oldDirectX9CreateData);\n        }\n        if (oldDirectX9ExCreate)\n        {\n            restoreFunction((PROC)oldDirectX9ExCreate, oldDirectX9ExCreateData);\n        }\n        if (oldCreateDXGIFactory2)\n        {\n            restoreFunction((PROC)oldCreateDXGIFactory2, oldCreateDXGIFactory2Data);\n        }\n\n        for (int i = 0; i < ShimCountMax; ++i)\n        {\n            HINSTANCE hInst = oldLoaderInstances[i];\n\n            if (hInst != NULL)\n            {\n                for (int j = 0; j < NUM_LOADER_LIBS; ++j)\n                {\n                    const char* loaderLibrary = loaderLibraryList[j];\n\n                    if (oldLoaderProcA[j])\n                    {\n                        SetProcAddressA(hInst, loaderLibrary, \"LoadLibraryA\", oldLoaderProcA[i][j], (PROC)OVRLoadLibraryA);\n                    }\n                    if (oldLoaderProcW[j])\n                    {\n                        SetProcAddressA(hInst, loaderLibrary, \"LoadLibraryW\", oldLoaderProcW[i][j], (PROC)OVRLoadLibraryW);\n                    }\n                    if (oldLoaderProcExA[j])\n                    {\n                        SetProcAddressA(hInst, loaderLibrary, \"LoadLibraryExA\", oldLoaderProcExA[i][j], (PROC)OVRLoadLibraryExA);\n                    }\n                    if (oldLoaderProcExW[j])\n                    {\n                        SetProcAddressA(hInst, loaderLibrary, \"LoadLibraryExW\", oldLoaderProcExW[i][j], (PROC)OVRLoadLibraryExW);\n                    }\n                    if (oldLoaderProcModExA[j])\n                    {\n                        SetProcAddressA(hInst, loaderLibrary, \"GetModuleHandleExA\", oldLoaderProcModExA[i][j], (PROC)OVRGetModuleHandleExA);\n                    }\n                    if (oldLoaderProcModExW[j])\n                    {\n                        SetProcAddressA(hInst, loaderLibrary, \"GetModuleHandleExW\", oldLoaderProcModExW[i][j], (PROC)OVRGetModuleHandleExW);\n                    }\n                }\n\n                FreeLibrary(hInst);\n            }\n        }\n\n        if (rtFilterModule != NULL)\n        {\n            LPFNCANUNLOADNOW pfnCanUnloadNow = (LPFNCANUNLOADNOW)GetProcAddress(rtFilterModule, \"DllCanUnloadNow\");\n            if (pfnCanUnloadNow && pfnCanUnloadNow() == S_OK)\n            {\n                FreeLibrary(rtFilterModule);\n                rtFilterModule = NULL;\n            }\n        }\n\n        // Do not set the following to NULL, because it's possible that we may be called after this function is executed. \n        // This is due to quirks in how third party DLLs implement their linking to these functions. In any case\n        // this module will be going away within a month or so of this writing.\n        //oldProcA = NULL;\n        //oldProcExA = NULL;\n        //oldProcW = NULL;\n        //oldProcExW = NULL;\n        //oldProcModExA = NULL;\n        //oldProcModExW = NULL;\n\n        oldDirectX9Create = NULL;\n        oldDirectX9ExCreate = NULL;\n        oldCreateDXGIFactory = NULL;\n        oldCreateDXGIFactory1 = NULL;\n        oldCreateDXGIFactory2 = NULL;\n\n        lastContext = NULL;\n    }\n}\n\nbool checkUMDriverOverrides(void* context)\n{\n\tlastContext = context;\n    if (oldCreateDXGIFactory != NULL)\n        return true;\n\n\tPreloadLibraryRTFn loadFunc = NULL;\n\tfor( int i = 0; i < ShimCountMax; ++i )\n\t{\n        HINSTANCE hInst = NULL;\n\t\ttry\n\t\t{\n\t\t\thInst = LoadLibraryA(dllList[i]);\n\t\t}\n\t\tcatch(...)\n\t\t{\n\t\t}\n\n        oldLoaderInstances[i] = hInst;\n\n\t\tif (hInst == NULL)\n            continue;\n\n\t\tShimedLibraries libCount = (ShimedLibraries)i;\n\t\tswitch( libCount )\n\t\t{\n\t\t\tcase ShimLibDXGI:\n\t\t\t\toldCreateDXGIFactory = (WinCreateDXGIFactory)SetProcAddressDirect( hInst, \"CreateDXGIFactory\", (PROC)OVRCreateDXGIFactory, oldCreateDXGIFactoryData );\n\t\t\t\toldCreateDXGIFactory1 = (WinCreateDXGIFactory1)SetProcAddressDirect( hInst, \"CreateDXGIFactory1\", (PROC)OVRCreateDXGIFactory1, oldCreateDXGIFactory1Data );\n\t\t\t\toldCreateDXGIFactory2 = (WinCreateDXGIFactory2)SetProcAddressDirect( hInst, \"CreateDXGIFactory2\", (PROC)OVRCreateDXGIFactory2, oldCreateDXGIFactory2Data );\n\t\t\t\tbreak;\n\t\t\tcase ShimLibD3D9:\n\t\t\t\toldDirectX9Create = (WinDirect3DCreate9)SetProcAddressDirect( hInst, \"Direct3DCreate9\", (PROC)OVRDirect3DCreate9, oldDirectX9CreateData );\n\t\t\t\toldDirectX9ExCreate = (WinDirect3DCreate9Ex)SetProcAddressDirect( hInst, \"Direct3DCreate9Ex\", (PROC)OVRDirect3DCreate9Ex, oldDirectX9ExCreateData );\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n        for (int j = 0; j < NUM_LOADER_LIBS; ++j)\n        {\n            const char* loaderLibrary = loaderLibraryList[j];\n\n            PROC temp = NULL;\n            temp = SetProcAddressA(hInst, loaderLibrary, \"LoadLibraryA\", (PROC)OVRLoadLibraryA);\n            if (!oldProcA)\n            {\n                oldProcA = (WinLoadLibraryA)temp;\n            }\n            oldLoaderProcA[i][j] = temp;\n\n            temp = SetProcAddressA(hInst, loaderLibrary, \"LoadLibraryW\", (PROC)OVRLoadLibraryW);\n            if (!oldProcW)\n            {\n                oldProcW = (WinLoadLibraryW)temp;\n            }\n            oldLoaderProcW[i][j] = temp;\n\n            temp = SetProcAddressA(hInst, loaderLibrary, \"LoadLibraryExA\", (PROC)OVRLoadLibraryExA);\n            if (!oldProcExA)\n            {\n                oldProcExA = (WinLoadLibraryExA)temp;\n            }\n            oldLoaderProcExA[i][j] = temp;\n\n            temp = SetProcAddressA(hInst, loaderLibrary, \"LoadLibraryExW\", (PROC)OVRLoadLibraryExW);\n            if (!oldProcExW)\n            {\n                oldProcExW = (WinLoadLibraryExW)temp;\n            }\n            oldLoaderProcExW[i][j] = temp;\n\n            temp = SetProcAddressA(hInst, loaderLibrary, \"GetModuleHandleExA\", (PROC)OVRGetModuleHandleExA);\n            if (!oldProcModExA)\n            {\n                oldProcModExA = (WinGetModuleHandleExA)temp;\n            }\n            oldLoaderProcModExA[i][j] = temp;\n\n            temp = SetProcAddressA(hInst, loaderLibrary, \"GetModuleHandleExW\", (PROC)OVRGetModuleHandleExW);\n            if (!oldProcModExW)\n            {\n                oldProcModExW = (WinGetModuleHandleExW)temp;\n            }\n            oldLoaderProcModExW[i][j] = temp;\n        }\n\n        if (loadFunc == NULL)\n        {\n            loadFunc = (PreloadLibraryRTFn)GetProcAddress(hInst, \"PreloadLibraryRT\");\n        }\n\t}\n\n    rtFilterModule = oldProcA ? (*oldProcA)(RTFilter) : NULL;\n\n    IsCreatingBackBuffer backBufferFunc = NULL;\n    ShouldVSync\tshouldVSyncFunc = NULL;\n    GetRTFilterVersion getRTFilterVersionFunc = NULL;\n\n    if (rtFilterModule != NULL)\n    {\n        loadFunc = (PreloadLibraryRTFn)GetProcAddress(rtFilterModule, \"PreloadLibraryRT\");\n        backBufferFunc = (IsCreatingBackBuffer)GetProcAddress(rtFilterModule, \"OVRIsCreatingBackBuffer\");\n        shouldVSyncFunc = (ShouldVSync)GetProcAddress(rtFilterModule, \"OVRShouldVSync\");\n        getRTFilterVersionFunc = (GetRTFilterVersion)GetProcAddress(rtFilterModule, \"OVRGetRTFilterVersion\");\n    }\n\n    if (loadFunc == NULL)\n    {\n        MessageBox(nullptr, L\"Unable to load the Oculus Display Driver. Please reinstall the Oculus Runtime.\", L\"Configuration Error\", MB_OK | MB_ICONERROR);\n        clearUMDriverOverrides();\n        return false;\n    }\n\n    if (getRTFilterVersionFunc == NULL)\n    {\n        WCHAR message[1000] = {};\n\t\tswprintf_s(message, L\"This app requires the %d.%d.%d version of the Oculus Runtime.\", OVR_MAJOR_VERSION, OVR_MINOR_VERSION, OVR_BUILD_NUMBER);\n        MessageBox(nullptr, message, L\"Configuration Error\", MB_OK | MB_ICONERROR);\n        clearUMDriverOverrides();\n        return false;\n    }\n\n    // Verify that we are running with the appropriate display driver\n    {\n        const ULONG rtFilterVersion = (*getRTFilterVersionFunc)();\n        const ULONG rtFilterMajor = OVR_GET_VERSION_MAJOR(rtFilterVersion);\n        const ULONG rtFilterMinor = OVR_GET_VERSION_MINOR(rtFilterVersion);\n        \n        if ((rtFilterMajor != OVR_RTFILTER_VERSION_MAJOR) || (rtFilterMinor < OVR_RTFILTER_VERSION_MINOR))\n        {\n            WCHAR message[1000] = {};\n\t\t\tswprintf_s(message, L\"This app requires the %d.%d.%d version of the Oculus Runtime.\", OVR_MAJOR_VERSION, OVR_MINOR_VERSION, OVR_BUILD_NUMBER);\n            MessageBox(nullptr, message, L\"Configuration Error\", MB_OK | MB_ICONERROR);\n            clearUMDriverOverrides();\n            return false;\n        }\n    }\n\n    appDriver.version = OVR_RENDER_SHIM_VERSION_MAJOR;\n\tappDriver.context = lastContext;\n\n//\t\t\tappDriver.pfnInitializingDisplay        = OVRIsInitializingDisplay;\n\tappDriver.pfnInitializingDisplay        = OVRLocalIsInitializingDisplay;\n\tappDriver.pfnRiftForContext             = OVRRiftForContext;\n\tappDriver.pfnCloseRiftForContext        = OVRCloseRiftForContext;\n\tappDriver.pfnWindowDisplayResolution    = OVRWindowDisplayResolution;\n\tappDriver.pfnShouldEnableDebug          = OVRShouldEnableDebug;\n\tappDriver.pfnIsCreatingBackBuffer       = (backBufferFunc == NULL) ? OVRIsCreatingBackBuffer : backBufferFunc;\n\tappDriver.pfnShouldVSync                = (shouldVSyncFunc == NULL) ? OVRShouldVSync : shouldVSyncFunc;\n\tappDriver.pfnExpectedResolution\t\t\t= OVRExpectedResolution;\n\tappDriver.pfnMirroringEnabled\t\t\t= OVRMirroringEnabled;\n\tappDriver.pfnGetWindowForContext\t\t= OVRGetWindowForContext;\n\tappDriver.pfnPresentRiftOnContext\t\t= OVRShouldPresentOnContext;\n\n\tappDriver.pfnDirect3DCreate9    = oldDirectX9Create;\n\tappDriver.pfnDirect3DCreate9Ex  = oldDirectX9ExCreate;\n\tappDriver.pfnCreateDXGIFactory  = oldCreateDXGIFactory;\n\tappDriver.pfnCreateDXGIFactory1 = oldCreateDXGIFactory1;\n\tappDriver.pfnCreateDXGIFactory2 = oldCreateDXGIFactory2;\n\n\t(*loadFunc)( &appDriver );\n\n    return true;\n}\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Displays/OVR_Win32_ShimFunctions.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Win32_ShimFunctions.cpp\nContent     :   Client-side shim callbacks for usermode/rt hooks\nCreated     :   May 6, 2014\nAuthors     :   Dean Beeler\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include <Kernel/OVR_Win32_IncludeWindows.h>\n#include \"OVR_Win32_Display.h\"\n#include \"OVR_Win32_ShimFunctions.h\"\n#include \"OVR_Win32_Dxgi_Display.h\"\n#include \"../OVR_Stereo.h\"\n#include \"OVR_Win32_FocusReader.h\"\n\n// Exported \nextern bool checkUMDriverOverrides(void* context);\nextern void clearUMDriverOverrides();\n\n#include <stdio.h>\n#include <tchar.h>\n#include <string.h>\n#include <stdlib.h>\n#include <winioctl.h>\n#include <SetupAPI.h>\n#include <Mmsystem.h>\n#include <conio.h>\n\n\n//-------------------------------------------------------------------------------------\n// ***** User-mode Callbacks\n//\n// See IsInitializingDisplay, etc in Dxgi_Display.h for details\n//\n\nextern LINK_APPLICATION_DRIVER appDriver;\n\nBOOL WINAPI OVRIsInitializingDisplay(PVOID context, UINT width, UINT height)\n{\n\tOVR::Win32::DisplayShim* con = (OVR::Win32::DisplayShim*)context;\n\tif (con->ExpectedWidth == (int)width && con->ExpectedHeight == (int)height)\n\t\treturn TRUE;\n\n\treturn FALSE;\n}\n\nBOOL WINAPI OVRExpectedResolution( PVOID context, UINT* width, UINT* height, UINT* rotationInDegrees )\n{\n\tOVR::Win32::DisplayShim* con = (OVR::Win32::DisplayShim*)context;\n\n\t*width = con->ExpectedWidth;\n\t*height = con->ExpectedHeight;\n\t*rotationInDegrees = con->Rotation;\n\treturn TRUE;\n}\n\nBOOL WINAPI OVRIsCreatingBackBuffer(PVOID context)\n{\n\tOVR::Win32::DisplayShim* con = (OVR::Win32::DisplayShim*)context;\n\tif( con->ExpectedWidth != -1 && con->ExpectedHeight != -1 )\n\t\treturn TRUE;\n\n\treturn FALSE;\n}\n\nBOOL WINAPI OVRShouldVSync( )\n{\n\treturn FALSE;\n}\n\n\nULONG WINAPI OVRRiftForContext(PVOID context, HANDLE driverHandle)\n{\n\tOVR_UNUSED( driverHandle );\n\tOVR::Win32::DisplayShim* con = (OVR::Win32::DisplayShim*)context;\n\n    return con->ChildUid;\n}\n\nHWND WINAPI OVRGetWindowForContext(PVOID context)\n{\n\tOVR::Win32::DisplayShim* con = (OVR::Win32::DisplayShim*)context;\n\n\tif( con->Active )\n\t{\n\t\treturn con->hWindow;\n\t}\n\telse\n\t{\n\t\treturn 0;\n\t}\n}\n\nBOOL WINAPI OVRShouldPresentOnContext(PVOID context)\n{\n\tOVR::Win32::DisplayShim* con = (OVR::Win32::DisplayShim*)context;\n\n\treturn con->Active && ( con->hWindow == OVR::Win32::RenderFocusReader::GetInstance()->ReadActiveWindow() );\n}\n\nBOOL WINAPI OVRCloseRiftForContext( PVOID context, HANDLE driverHandle, ULONG rift )\n{\n\tOVR_UNUSED( context ); OVR_UNUSED( driverHandle ); OVR_UNUSED( rift );\n\t// TODO\n\treturn TRUE;\n}\n\nBOOL WINAPI OVRWindowDisplayResolution( PVOID context, UINT* width, UINT* height,\n\t\t\t\t\t\t\t\t\t   UINT* titleHeight, UINT* borderWidth,\n\t\t\t\t\t\t\t\t\t   BOOL* vsyncEnabled )\n{\n\tOVR::Win32::DisplayShim* con = (OVR::Win32::DisplayShim*)context;\n\tvoid* handle = con->hWindow;\n\n\tif( handle )\n\t{\n\t\tRECT winRect = { 0 };\n\t\tGetWindowRect( (HWND)handle, &winRect );\n\n\t\tRECT rect = {0};\n\t\tif( GetClientRect( (HWND)handle, &rect ) )\n\t\t{\n\t\t\tLONG barHeight = (winRect.bottom - winRect.top) - (rect.bottom - rect.top);\n\t\t\tLONG borderSize = (winRect.right - winRect.left) - (rect.right - rect.left);\n\n\t\t\t*titleHeight = barHeight - borderSize + (borderSize / 2 );\n\t\t\t*borderWidth = borderSize / 2;\n\t\t\t*width = rect.right - rect.left + (borderSize / 2);\n\t\t\t*height = rect.bottom - rect.top + *titleHeight;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\telse\n\t{\n\t\treturn FALSE;\n\t}\n\n\t*vsyncEnabled = TRUE;\n\n\treturn TRUE;\n}\n\nBOOL WINAPI OVRShouldEnableDebug()\n{\n\treturn FALSE;\n}\n\nBOOL WINAPI OVRMirroringEnabled( PVOID context )\n{\n\tOVR::Win32::DisplayShim* con = (OVR::Win32::DisplayShim*)context;\n\n\treturn con->UseMirroring;\n}\n\n\n// This is a temporarily exported function for the purpose of aiding in the DLL transition for the Unity plugin.\n// It is unsupported and will be removed in a future release.\nextern \"C\"\n{\n    OVR_PUBLIC_FUNCTION(void*) ovr_GetDX11SwapChain()\n    {\n        return OVR::Win32::DisplayShim::GetInstance().GetDX11SwapChain();\n    }\n}\n\n\nnamespace OVR { namespace Win32 {\n\nDisplayShim::DisplayShim() :\n\tChildUid( 0 ),\n\tExpectedWidth( 1280 ),\n\tExpectedHeight( 800 ),\n\tRotation( 0 ),\n\thWindow( 0 ),\n\tUseMirroring( true ),\n    Active( false )\n{\n\n}\n\nDisplayShim::~DisplayShim()\n{\n\n}\n\nbool DisplayShim::Initialize( bool inCompatibility )\n{\n\tif (inCompatibility)\n        return false;\n\n    return checkUMDriverOverrides( this );\n}\n\nbool DisplayShim::Shutdown()\n{\n    clearUMDriverOverrides();\n\n\treturn true;\n}\n\nbool DisplayShim::Update(ExtraMonitorInfo* shimInfo)\n{\n\tChildUid = shimInfo->DeviceNumber;\n\tExpectedWidth = shimInfo->NativeWidth;\n\tExpectedHeight = shimInfo->NativeHeight;\n\tRotation = shimInfo->Rotation;\n\tUseMirroring = shimInfo->UseMirroring != 0;\n\treturn true;\n}\n\nvoid* DisplayShim::GetDX11SwapChain()\n{\n\tif( appDriver.pfnGetDX11SwapChain )\n\t{\n\t\treturn (*appDriver.pfnGetDX11SwapChain)(this);\n\t}\n\n\treturn NULL;\n}\n\n\n} } // OVR::Win32\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Displays/OVR_Win32_ShimFunctions.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Win32_ShimFunctions.h\nContent     :   Client-side shim callbacks for usermode/rt hooks\nCreated     :   May 6, 2014\nAuthors     :   Dean Beeler\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Win32_ShimFunctions_h\n#define OVR_Win32_ShimFunctions_h\n\n#include \"OVR_Win32_Display.h\"\n\nnamespace OVR {\n\nstruct ExtraMonitorInfo;\n\nnamespace Win32 {  \n\n\nclass DisplayShim\n{\npublic:\n\npublic:\n\tstatic DisplayShim& GetInstance()\n\t{\n\t\tstatic DisplayShim instance;\n\t\treturn instance;\n\t}\n\n\tbool Initialize( bool inCompatibility );\n\tbool Shutdown();\n\n\tbool Update( ExtraMonitorInfo* shimInfo );\n\n\tvoid* GetDX11SwapChain();\n\n\tULONG   ChildUid;\n\tint\t\tExpectedWidth;\n\tint\t\tExpectedHeight;\n\tint\t\tRotation;\n\tHWND    hWindow;\n\tbool\tUseMirroring;\n\tbool\tActive;\n\nprivate:\n\n\tDisplayShim();\n\n\tvirtual ~DisplayShim();\n\n\tDisplayShim(DisplayShim const&);    // Don't Implement\n\tvoid operator=(DisplayShim const&); // Don't implement\n\n};\n\n\n}} // namespace OVR::Win32\n\n#endif\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Displays/OVR_Win32_ShimVersion.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Win32_ShimVersion.h\nContent     :   Versioning info for our display shim\nCreated     :   Nov 4, 2014\nAuthors     :   Scott Bassett\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#define STRINGIZE_(x) #x\n#define STRINGIZE(x) STRINGIZE_(x)\n\n#define OVR_MAKE_VERSION(major, minor, patch)   (ULONG)(((major) << 24) | ((minor) << 16) | patch)\n#define OVR_GET_VERSION_MAJOR(x)                (ULONG)(((x) >> 24) & 0x000000FF)\n#define OVR_GET_VERSION_MINOR(x)                (ULONG)(((x) >> 16) & 0x000000FF)\n#define OVR_GET_VERSION_PATCH(x)                (ULONG)((x) & 0x0000FFFF)\n\n#define OVR_RENDER_SHIM_VERSION_MAJOR       1\n#define OVR_RENDER_SHIM_VERSION_MINOR       0\n#define OVR_RENDER_SHIM_VERSION_PATCH       0\n#define OVR_RENDER_SHIM_VERSION             OVR_MAKE_VERSION(OVR_RENDER_SHIM_VERSION_MAJOR, OVR_RENDER_SHIM_VERSION_MINOR, OVR_RENDER_SHIM_VERSION_PATCH)\n#define OVR_RENDER_SHIM_VERSION_STRING      (STRINGIZE(OVR_RENDER_SHIM_VERSION_MAJOR) \".\" STRINGIZE(OVR_RENDER_SHIM_VERSION_MINOR) \".\" STRINGIZE(OVR_RENDER_SHIM_VERSION_PATCH))\n\n// IF YOU CHANGE ANY OF THESE NUMBERS YOU MUST UPDATE MULTIPLE FILES.\n// PLEASE LOOK AT CHANGELIST 31947 TO SEE THE FULL LIST.\n#define OVR_RTFILTER_VERSION_MAJOR          1\n#define OVR_RTFILTER_VERSION_MINOR          2\n#define OVR_RTFILTER_VERSION_PATCH          4\n#define OVR_RTFILTER_VERSION                OVR_MAKE_VERSION(OVR_RTFILTER_VERSION_MAJOR, OVR_RTFILTER_VERSION_MINOR, OVR_RTFILTER_VERSION_PATCH)\n#define OVR_RTFILTER_VERSION_STRING         (STRINGIZE(OVR_RTFILTER_VERSION_MAJOR) \".\" STRINGIZE(OVR_RTFILTER_VERSION_MINOR) \".\" STRINGIZE(OVR_RTFILTER_VERSION_PATCH))\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Net/OVR_BitStream.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_BitStream.cpp\nContent     :   A generic serialization toolkit for packing data to a binary stream.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_BitStream.h\"\n\n#ifdef OVR_OS_WIN32\n#include <WinSock2.h>\n#else\n#include <arpa/inet.h>\n#endif\n\nnamespace OVR { namespace Net {\n\n\n//-----------------------------------------------------------------------------\n// BitStream\n\t\nBitStream::BitStream()\n{\n\tnumberOfBitsUsed = 0;\n\t//numberOfBitsAllocated = 32 * 8;\n\tnumberOfBitsAllocated = BITSTREAM_STACK_ALLOCATION_SIZE * 8;\n\treadOffset = 0;\n\t//data = ( unsigned char* ) OVR_ALLOC( 32);\n\tdata = ( unsigned char* ) stackData;\n\n#ifdef _DEBUG\t\n\t//\tOVR_ASSERT( data );\n#endif\n\t//memset(data, 0, 32);\n\tcopyData = true;\n}\n\nBitStream::BitStream( const unsigned int initialBytesToAllocate )\n{\n\tnumberOfBitsUsed = 0;\n\treadOffset = 0;\n\tif (initialBytesToAllocate <= BITSTREAM_STACK_ALLOCATION_SIZE)\n\t{\n\t\tdata = ( unsigned char* ) stackData;\n\t\tnumberOfBitsAllocated = BITSTREAM_STACK_ALLOCATION_SIZE * 8;\n\t}\n\telse\n\t{\n\t\tdata = ( unsigned char* ) OVR_ALLOC( (size_t) initialBytesToAllocate);\n\t\tnumberOfBitsAllocated = initialBytesToAllocate << 3;\n\t}\n#ifdef _DEBUG\n\tOVR_ASSERT( data );\n#endif\n\t// memset(data, 0, initialBytesToAllocate);\n\tcopyData = true;\n}\n\nBitStream::BitStream( char* _data, const unsigned int lengthInBytes, bool _copyData )\n{\n\tnumberOfBitsUsed = lengthInBytes << 3;\n\treadOffset = 0;\n\tcopyData = _copyData;\n\tnumberOfBitsAllocated = lengthInBytes << 3;\n\n\tif ( copyData )\n\t{\n\t\tif ( lengthInBytes > 0 )\n\t\t{\n\t\t\tif (lengthInBytes < BITSTREAM_STACK_ALLOCATION_SIZE)\n\t\t\t{\n\t\t\t\tdata = ( unsigned char* ) stackData;\n\t\t\t\tnumberOfBitsAllocated = BITSTREAM_STACK_ALLOCATION_SIZE << 3;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdata = ( unsigned char* ) OVR_ALLOC( (size_t) lengthInBytes);\n\t\t\t}\n#ifdef _DEBUG\n\t\t\tOVR_ASSERT( data );\n#endif\n\t\t\tmemcpy( data, _data, (size_t) lengthInBytes );\n\t\t}\n\t\telse\n\t\t\tdata = 0;\n\t}\n\telse\n\t\tdata = ( unsigned char* ) _data;\n}\n\nvoid BitStream::WrapBuffer(unsigned char* _data, const unsigned int lengthInBytes)\n{\n    if (copyData && numberOfBitsAllocated > (BITSTREAM_STACK_ALLOCATION_SIZE << 3))\n        OVR_FREE(data);  // Use realloc and free so we are more efficient than delete and new for resizing\n\n    numberOfBitsUsed = lengthInBytes << 3;\n    readOffset = 0;\n    copyData = false;\n    numberOfBitsAllocated = lengthInBytes << 3;\n    data = (unsigned char*)_data;\n}\n\n// Use this if you pass a pointer copy to the constructor (_copyData==false) and want to overallocate to prevent reallocation\nvoid BitStream::SetNumberOfBitsAllocated( const BitSize_t lengthInBits )\n{\n#ifdef _DEBUG\n\tOVR_ASSERT( lengthInBits >= ( BitSize_t ) numberOfBitsAllocated );\n#endif\t\n\tnumberOfBitsAllocated = lengthInBits;\n}\n\nBitStream::~BitStream()\n{\n\tif ( copyData && numberOfBitsAllocated > (BITSTREAM_STACK_ALLOCATION_SIZE << 3))\n\t\tOVR_FREE( data );  // Use realloc and free so we are more efficient than delete and new for resizing\n}\n\nvoid BitStream::Reset( void )\n{\n\t// Note:  Do NOT reallocate memory because BitStream is used\n\t// in places to serialize/deserialize a buffer. Reallocation\n\t// is a dangerous operation (may result in leaks).\n\n\tif ( numberOfBitsUsed > 0 )\n\t{\n\t\t//  memset(data, 0, BITS_TO_BYTES(numberOfBitsUsed));\n\t}\n\n\t// Don't free memory here for speed efficiency\n\t//free(data);  // Use realloc and free so we are more efficient than delete and new for resizing\n\tnumberOfBitsUsed = 0;\n\n\t//numberOfBitsAllocated=8;\n\treadOffset = 0;\n\n\t//data=(unsigned char*)OVR_ALLOC(1, _FILE_AND_LINE_);\n\t// if (numberOfBitsAllocated>0)\n\t//  memset(data, 0, BITS_TO_BYTES(numberOfBitsAllocated));\n}\n\n// Write an array or casted stream\nvoid BitStream::Write( const char* inputByteArray, const unsigned int numberOfBytes )\n{\n\tif (numberOfBytes==0)\n\t\treturn;\n\n\t// Optimization:\n\tif ((numberOfBitsUsed & 7) == 0)\n\t{\n\t\tAddBitsAndReallocate( BYTES_TO_BITS(numberOfBytes) );\n\t\tmemcpy(data+BITS_TO_BYTES(numberOfBitsUsed), inputByteArray, (size_t) numberOfBytes);\n\t\tnumberOfBitsUsed+=BYTES_TO_BITS(numberOfBytes);\n\t}\n\telse\n\t{\n\t\tWriteBits( ( unsigned char* ) inputByteArray, numberOfBytes * 8, true );\n\t}\n\n}\nvoid BitStream::Write( BitStream *bitStream)\n{\n\tWrite(bitStream, bitStream->GetNumberOfBitsUsed()-bitStream->GetReadOffset());\n}\nvoid BitStream::Write( BitStream *bitStream, BitSize_t numberOfBits )\n{\n\tAddBitsAndReallocate( numberOfBits );\n\tBitSize_t numberOfBitsMod8;\n\n\tif ((bitStream->GetReadOffset()&7)==0 && (numberOfBitsUsed&7)==0)\n\t{\n\t\tint readOffsetBytes=bitStream->GetReadOffset()/8;\n\t\tint numBytes=numberOfBits/8;\n\t\tmemcpy(data + (numberOfBitsUsed >> 3), bitStream->GetData()+readOffsetBytes, numBytes);\n\t\tnumberOfBits-=BYTES_TO_BITS(numBytes);\n\t\tbitStream->SetReadOffset(BYTES_TO_BITS(numBytes+readOffsetBytes));\n\t\tnumberOfBitsUsed+=BYTES_TO_BITS(numBytes);\n\t}\n\n\twhile (numberOfBits > 0 && bitStream->readOffset + 1 <= bitStream->numberOfBitsUsed)\n\t{\n\t\t--numberOfBits;\n\t\tnumberOfBitsMod8 = numberOfBitsUsed & 7;\n\t\tif ( numberOfBitsMod8 == 0 )\n\t\t{\n\t\t\t// New byte\n\t\t\tif (bitStream->data[ bitStream->readOffset >> 3 ] & ( 0x80 >> ( bitStream->readOffset & 7 ) ) )\n\t\t\t{\n\t\t\t\t// Write 1\n\t\t\t\tdata[ numberOfBitsUsed >> 3 ] = 0x80;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Write 0\n\t\t\t\tdata[ numberOfBitsUsed >> 3 ] = 0;\n\t\t\t}\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Existing byte\n\t\t\tif (bitStream->data[ bitStream->readOffset >> 3 ] & ( 0x80 >> ( bitStream->readOffset & 7 ) ) )\n\t\t\t\tdata[ numberOfBitsUsed >> 3 ] |= 0x80 >> ( numberOfBitsMod8 ); // Set the bit to 1\n\t\t\t// else 0, do nothing\n\t\t}\n\n\t\tbitStream->readOffset++;\n\t\tnumberOfBitsUsed++;\n\t}\n}\nvoid BitStream::Write( BitStream &bitStream, BitSize_t numberOfBits )\n{\n\tWrite(&bitStream, numberOfBits);\n}\nvoid BitStream::Write( BitStream &bitStream )\n{\n\tWrite(&bitStream);\n}\nbool BitStream::Read( BitStream *bitStream, BitSize_t numberOfBits )\n{\n\tif (GetNumberOfUnreadBits() < numberOfBits)\n\t\treturn false;\n\tbitStream->Write(this, numberOfBits);\n\treturn true;\n}\nbool BitStream::Read( BitStream *bitStream )\n{\n\tbitStream->Write(this);\n\treturn true;\n}\nbool BitStream::Read( BitStream &bitStream, BitSize_t numberOfBits )\n{\n\tif (GetNumberOfUnreadBits() < numberOfBits)\n\t\treturn false;\n\tbitStream.Write(this, numberOfBits);\n\treturn true;\n}\nbool BitStream::Read( BitStream &bitStream )\n{\n\tbitStream.Write(this);\n\treturn true;\n}\n\n// Read an array or casted stream\nbool BitStream::Read( char* outByteArray, const unsigned int numberOfBytes )\n{\n\t// Optimization:\n\tif ((readOffset & 7) == 0)\n\t{\n\t\tif ( readOffset + ( numberOfBytes << 3 ) > numberOfBitsUsed )\n\t\t\treturn false;\n\n\t\t// Write the data\n\t\tmemcpy( outByteArray, data + ( readOffset >> 3 ), (size_t) numberOfBytes );\n\n\t\treadOffset += numberOfBytes << 3;\n\t\treturn true;\n\t}\n\telse\n\t{\n\t\treturn ReadBits( ( unsigned char* ) outByteArray, numberOfBytes * 8 );\n\t}\n}\n\n// Sets the read pointer back to the beginning of your data.\nvoid BitStream::ResetReadPointer( void )\n{\n\treadOffset = 0;\n}\n\n// Sets the write pointer back to the beginning of your data.\nvoid BitStream::ResetWritePointer( void )\n{\n\tnumberOfBitsUsed = 0;\n}\n\n// Write a 0\nvoid BitStream::Write0( void )\n{\n\tAddBitsAndReallocate( 1 );\n\n\t// New bytes need to be zeroed\n\tif ( ( numberOfBitsUsed & 7 ) == 0 )\n\t\tdata[ numberOfBitsUsed >> 3 ] = 0;\n\n\tnumberOfBitsUsed++;\n}\n\n// Write a 1\nvoid BitStream::Write1( void )\n{\n\tAddBitsAndReallocate( 1 );\n\n\tBitSize_t numberOfBitsMod8 = numberOfBitsUsed & 7;\n\n\tif ( numberOfBitsMod8 == 0 )\n\t\tdata[ numberOfBitsUsed >> 3 ] = 0x80;\n\telse\n\t\tdata[ numberOfBitsUsed >> 3 ] |= 0x80 >> ( numberOfBitsMod8 ); // Set the bit to 1\n\n\tnumberOfBitsUsed++;\n}\n\n// Returns true if the next data read is a 1, false if it is a 0\nbool BitStream::ReadBit( void )\n{\n\tbool result = ( data[ readOffset >> 3 ] & ( 0x80 >> ( readOffset & 7 ) ) ) !=0;\n\treadOffset++;\n\treturn result;\n}\n\n// Align the bitstream to the byte boundary and then write the specified number of bits.\n// This is faster than WriteBits but wastes the bits to do the alignment and requires you to call\n// SetReadToByteAlignment at the corresponding read position\nvoid BitStream::WriteAlignedBytes( const unsigned char* inByteArray, const unsigned int numberOfBytesToWrite )\n{\n\tAlignWriteToByteBoundary();\n\tWrite((const char*) inByteArray, numberOfBytesToWrite);\n}\nvoid BitStream::EndianSwapBytes( int byteOffset, int length )\n{\n\tif (DoEndianSwap())\n\t{\n\t\tReverseBytesInPlace(data+byteOffset, length);\n\t}\n}\n/// Aligns the bitstream, writes inputLength, and writes input. Won't write beyond maxBytesToWrite\nvoid BitStream::WriteAlignedBytesSafe( const char *inByteArray, const unsigned int inputLength, const unsigned int maxBytesToWrite )\n{\n\tif (inByteArray==0 || inputLength==0)\n\t{\n\t\tWriteCompressed((unsigned int)0);\n\t\treturn;\n\t}\n\tWriteCompressed(inputLength);\n\tWriteAlignedBytes((const unsigned char*) inByteArray, inputLength < maxBytesToWrite ? inputLength : maxBytesToWrite);\n}\n\n// Read bits, starting at the next aligned bits. Note that the modulus 8 starting offset of the\n// sequence must be the same as was used with WriteBits. This will be a problem with packet coalescence\n// unless you byte align the coalesced packets.\nbool BitStream::ReadAlignedBytes( unsigned char* inOutByteArray, const unsigned int numberOfBytesToRead )\n{\n#ifdef _DEBUG\n\tOVR_ASSERT( numberOfBytesToRead > 0 );\n#endif\n\n\tif ( numberOfBytesToRead <= 0 )\n\t\treturn false;\n\n\t// Byte align\n\tAlignReadToByteBoundary();\n\n\tif ( readOffset + ( numberOfBytesToRead << 3 ) > numberOfBitsUsed )\n\t\treturn false;\n\n\t// Write the data\n\tmemcpy( inOutByteArray, data + ( readOffset >> 3 ), (size_t) numberOfBytesToRead );\n\n\treadOffset += numberOfBytesToRead << 3;\n\n\treturn true;\n}\nbool BitStream::ReadAlignedBytesSafe( char *inOutByteArray, int &inputLength, const int maxBytesToRead )\n{\n\treturn ReadAlignedBytesSafe(inOutByteArray,(unsigned int&) inputLength,(unsigned int)maxBytesToRead);\n}\nbool BitStream::ReadAlignedBytesSafe( char *inOutByteArray, unsigned int &inputLength, const unsigned int maxBytesToRead )\n{\n\tif (ReadCompressed(inputLength)==false)\n\t\treturn false;\n\tif (inputLength > maxBytesToRead)\n\t\tinputLength=maxBytesToRead;\n\tif (inputLength==0)\n\t\treturn true;\n\treturn ReadAlignedBytes((unsigned char*) inOutByteArray, inputLength);\n}\nbool BitStream::ReadAlignedBytesSafeAlloc( char **outByteArray, int &inputLength, const unsigned int maxBytesToRead )\n{\n\treturn ReadAlignedBytesSafeAlloc(outByteArray,(unsigned int&) inputLength, maxBytesToRead);\n}\nbool BitStream::ReadAlignedBytesSafeAlloc( char ** outByteArray, unsigned int &inputLength, const unsigned int maxBytesToRead )\n{\n\tOVR_FREE(*outByteArray);\n\t*outByteArray=0;\n\tif (ReadCompressed(inputLength)==false)\n\t\treturn false;\n\tif (inputLength > maxBytesToRead)\n\t\tinputLength=maxBytesToRead;\n\tif (inputLength==0)\n\t\treturn true;\n\t*outByteArray = (char*) OVR_ALLOC( (size_t) inputLength);\n\treturn ReadAlignedBytes((unsigned char*) *outByteArray, inputLength);\n}\n\n// Write numberToWrite bits from the input source\nvoid BitStream::WriteBits( const unsigned char* inByteArray, BitSize_t numberOfBitsToWrite, const bool rightAlignedBits )\n{\n//\tif (numberOfBitsToWrite<=0)\n//\t\treturn;\n\n\tAddBitsAndReallocate( numberOfBitsToWrite );\n\n\tconst BitSize_t numberOfBitsUsedMod8 = numberOfBitsUsed & 7;\n\n\t// If currently aligned and numberOfBits is a multiple of 8, just memcpy for speed\n\tif (numberOfBitsUsedMod8==0 && (numberOfBitsToWrite&7)==0)\n\t{\n\t\tmemcpy( data + ( numberOfBitsUsed >> 3 ), inByteArray, numberOfBitsToWrite>>3);\n\t\tnumberOfBitsUsed+=numberOfBitsToWrite;\n\t\treturn;\n\t}\n\n\tunsigned char dataByte;\n\tconst unsigned char* inputPtr=inByteArray;\n\n\t// Faster to put the while at the top surprisingly enough\n\twhile ( numberOfBitsToWrite > 0 )\n\t\t//do\n\t{\n\t\tdataByte = *( inputPtr++ );\n\n\t\tif ( numberOfBitsToWrite < 8 && rightAlignedBits )   // rightAlignedBits means in the case of a partial byte, the bits are aligned from the right (bit 0) rather than the left (as in the normal internal representation)\n\t\t\tdataByte <<= 8 - numberOfBitsToWrite;  // shift left to get the bits on the left, as in our internal representation\n\n\t\t// Writing to a new byte each time\n\t\tif ( numberOfBitsUsedMod8 == 0 )\n\t\t\t* ( data + ( numberOfBitsUsed >> 3 ) ) = dataByte;\n\t\telse\n\t\t{\n\t\t\t// Copy over the new data.\n\t\t\t*( data + ( numberOfBitsUsed >> 3 ) ) |= dataByte >> ( numberOfBitsUsedMod8 ); // First half\n\n\t\t\tif ( 8 - ( numberOfBitsUsedMod8 ) < 8 && 8 - ( numberOfBitsUsedMod8 ) < numberOfBitsToWrite )   // If we didn't write it all out in the first half (8 - (numberOfBitsUsed%8) is the number we wrote in the first half)\n\t\t\t{\n\t\t\t\t*( data + ( numberOfBitsUsed >> 3 ) + 1 ) = (unsigned char) ( dataByte << ( 8 - ( numberOfBitsUsedMod8 ) ) ); // Second half (overlaps byte boundary)\n\t\t\t}\n\t\t}\n\n\t\tif ( numberOfBitsToWrite >= 8 )\n\t\t{\n\t\t\tnumberOfBitsUsed += 8;\n\t\t\tnumberOfBitsToWrite -= 8;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnumberOfBitsUsed += numberOfBitsToWrite;\n\t\t\tnumberOfBitsToWrite=0;\n\t\t}\n\t}\n\t// } while(numberOfBitsToWrite>0);\n}\n\n// Set the stream to some initial data.  For internal use\nvoid BitStream::SetData( unsigned char *inByteArray )\n{\n\tdata=inByteArray;\n\tcopyData=false;\n}\n\n// Assume the input source points to a native type, compress and write it\nvoid BitStream::WriteCompressed( const unsigned char* inByteArray,\n\t\t\t\t\t\t\t\tconst unsigned int size, const bool unsignedData )\n{\n\tBitSize_t currentByte = ( size >> 3 ) - 1; // PCs\n\n\tunsigned char byteMatch;\n\n\tif ( unsignedData )\n\t{\n\t\tbyteMatch = 0;\n\t}\n\n\telse\n\t{\n\t\tbyteMatch = 0xFF;\n\t}\n\n\t// Write upper bytes with a single 1\n\t// From high byte to low byte, if high byte is a byteMatch then write a 1 bit. Otherwise write a 0 bit and then write the remaining bytes\n\twhile ( currentByte > 0 )\n\t{\n\t\tif ( inByteArray[ currentByte ] == byteMatch )   // If high byte is byteMatch (0 of 0xff) then it would have the same value shifted\n\t\t{\n\t\t\tbool b = true;\n\t\t\tWrite( b );\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Write the remainder of the data after writing 0\n\t\t\tbool b = false;\n\t\t\tWrite( b );\n\n\t\t\tWriteBits( inByteArray, ( currentByte + 1 ) << 3, true );\n\t\t\t//  currentByte--;\n\n\n\t\t\treturn ;\n\t\t}\n\n\t\tcurrentByte--;\n\t}\n\n\t// If the upper half of the last byte is a 0 (positive) or 16 (negative) then write a 1 and the remaining 4 bits.  Otherwise write a 0 and the 8 bites.\n\tif ( ( unsignedData && ( ( *( inByteArray + currentByte ) ) & 0xF0 ) == 0x00 ) ||\n\t\t( unsignedData == false && ( ( *( inByteArray + currentByte ) ) & 0xF0 ) == 0xF0 ) )\n\t{\n\t\tbool b = true;\n\t\tWrite( b );\n\t\tWriteBits( inByteArray + currentByte, 4, true );\n\t}\n\n\telse\n\t{\n\t\tbool b = false;\n\t\tWrite( b );\n\t\tWriteBits( inByteArray + currentByte, 8, true );\n\t}\n}\n\n// Read numberOfBitsToRead bits to the output source\n// alignBitsToRight should be set to true to convert internal bitstream data to userdata\n// It should be false if you used WriteBits with rightAlignedBits false\nbool BitStream::ReadBits( unsigned char *inOutByteArray, BitSize_t numberOfBitsToRead, const bool alignBitsToRight )\n{\n#ifdef _DEBUG\n\t//\tOVR_ASSERT( numberOfBitsToRead > 0 );\n#endif\n\tif (numberOfBitsToRead<=0)\n\t\treturn false;\n\n\tif ( readOffset + numberOfBitsToRead > numberOfBitsUsed )\n\t\treturn false;\n\n\n\tconst BitSize_t readOffsetMod8 = readOffset & 7;\n\n\t// If currently aligned and numberOfBits is a multiple of 8, just memcpy for speed\n\tif (readOffsetMod8==0 && (numberOfBitsToRead&7)==0)\n\t{\n\t\tmemcpy( inOutByteArray, data + ( readOffset >> 3 ), numberOfBitsToRead>>3);\n\t\treadOffset+=numberOfBitsToRead;\n\t\treturn true;\n\t}\n\n\n\n\tBitSize_t offset = 0;\n\n\tmemset( inOutByteArray, 0, (size_t) BITS_TO_BYTES( numberOfBitsToRead ) );\n\n\twhile ( numberOfBitsToRead > 0 )\n\t{\n\t\t*( inOutByteArray + offset ) |= *( data + ( readOffset >> 3 ) ) << ( readOffsetMod8 ); // First half\n\n\t\tif ( readOffsetMod8 > 0 && numberOfBitsToRead > 8 - ( readOffsetMod8 ) )   // If we have a second half, we didn't read enough bytes in the first half\n\t\t\t*( inOutByteArray + offset ) |= *( data + ( readOffset >> 3 ) + 1 ) >> ( 8 - ( readOffsetMod8 ) ); // Second half (overlaps byte boundary)\n\n\t\tif (numberOfBitsToRead>=8)\n\t\t{\n\t\t\tnumberOfBitsToRead -= 8;\n\t\t\treadOffset += 8;\n\t\t\toffset++;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tint neg = (int) numberOfBitsToRead - 8;\n\n\t\t\tif ( neg < 0 )   // Reading a partial byte for the last byte, shift right so the data is aligned on the right\n\t\t\t{\n\n\t\t\t\tif ( alignBitsToRight )\n\t\t\t\t\t* ( inOutByteArray + offset ) >>= -neg;\n\n\t\t\t\treadOffset += 8 + neg;\n\t\t\t}\n\t\t\telse\n\t\t\t\treadOffset += 8;\n\n\t\t\toffset++;\n\n\t\t\tnumberOfBitsToRead=0;\n\t\t}\t\t\n\t}\n\n\treturn true;\n}\n\n// Assume the input source points to a compressed native type. Decompress and read it\nbool BitStream::ReadCompressed( unsigned char* inOutByteArray,\n\t\t\t\t\t\t\t   const unsigned int size, const bool unsignedData )\n{\n\tunsigned int currentByte = ( size >> 3 ) - 1;\n\n\n\tunsigned char byteMatch, halfByteMatch;\n\n\tif ( unsignedData )\n\t{\n\t\tbyteMatch = 0;\n\t\thalfByteMatch = 0;\n\t}\n\n\telse\n\t{\n\t\tbyteMatch = 0xFF;\n\t\thalfByteMatch = 0xF0;\n\t}\n\n\t// Upper bytes are specified with a single 1 if they match byteMatch\n\t// From high byte to low byte, if high byte is a byteMatch then write a 1 bit. Otherwise write a 0 bit and then write the remaining bytes\n\twhile ( currentByte > 0 )\n\t{\n\t\t// If we read a 1 then the data is byteMatch.\n\n\t\tbool b;\n\n\t\tif ( Read( b ) == false )\n\t\t\treturn false;\n\n\t\tif ( b )   // Check that bit\n\t\t{\n\t\t\tinOutByteArray[ currentByte ] = byteMatch;\n\t\t\tcurrentByte--;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Read the rest of the bytes\n\n\t\t\tif ( ReadBits( inOutByteArray, ( currentByte + 1 ) << 3 ) == false )\n\t\t\t\treturn false;\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// All but the first bytes are byteMatch.  If the upper half of the last byte is a 0 (positive) or 16 (negative) then what we read will be a 1 and the remaining 4 bits.\n\t// Otherwise we read a 0 and the 8 bytes\n\t//OVR_ASSERT(readOffset+1 <=numberOfBitsUsed); // If this assert is hit the stream wasn't long enough to read from\n\tif ( readOffset + 1 > numberOfBitsUsed )\n\t\treturn false;\n\n\tbool b=false;\n\n\tif ( Read( b ) == false )\n\t\treturn false;\n\n\tif ( b )   // Check that bit\n\t{\n\n\t\tif ( ReadBits( inOutByteArray + currentByte, 4 ) == false )\n\t\t\treturn false;\n\n\t\tinOutByteArray[ currentByte ] |= halfByteMatch; // We have to set the high 4 bits since these are set to 0 by ReadBits\n\t}\n\telse\n\t{\n\t\tif ( ReadBits( inOutByteArray + currentByte, 8 ) == false )\n\t\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n// Reallocates (if necessary) in preparation of writing numberOfBitsToWrite\nvoid BitStream::AddBitsAndReallocate( const BitSize_t numberOfBitsToWrite )\n{\n\tBitSize_t newNumberOfBitsAllocated = numberOfBitsToWrite + numberOfBitsUsed;\n\n\tif ( numberOfBitsToWrite + numberOfBitsUsed > 0 && ( ( numberOfBitsAllocated - 1 ) >> 3 ) < ( ( newNumberOfBitsAllocated - 1 ) >> 3 ) )   // If we need to allocate 1 or more new bytes\n\t{\n#ifdef _DEBUG\n\t\t// If this assert hits then we need to specify true for the third parameter in the constructor\n\t\t// It needs to reallocate to hold all the data and can't do it unless we allocated to begin with\n\t\t// Often hits if you call Write or Serialize on a read-only bitstream\n\t\tOVR_ASSERT( copyData == true );\n#endif\n\n\t\t// Less memory efficient but saves on news and deletes\n\t\t/// Cap to 1 meg buffer to save on huge allocations\n\t\tnewNumberOfBitsAllocated = ( numberOfBitsToWrite + numberOfBitsUsed ) * 2;\n\t\tif (newNumberOfBitsAllocated - ( numberOfBitsToWrite + numberOfBitsUsed ) > 1048576 )\n\t\t\tnewNumberOfBitsAllocated = numberOfBitsToWrite + numberOfBitsUsed + 1048576;\n\n\t\t//\t\tBitSize_t newByteOffset = BITS_TO_BYTES( numberOfBitsAllocated );\n\t\t// Use realloc and free so we are more efficient than delete and new for resizing\n\t\tBitSize_t amountToAllocate = BITS_TO_BYTES( newNumberOfBitsAllocated );\n\t\tif (data==(unsigned char*)stackData)\n\t\t{\n\t\t\tif (amountToAllocate > BITSTREAM_STACK_ALLOCATION_SIZE)\n\t\t\t{\n\t\t\t\tdata = ( unsigned char* ) OVR_ALLOC( (size_t) amountToAllocate);\n\t\t\t\tOVR_ASSERT(data);\n                if (data)\n\t\t\t\t{\n                    // need to copy the stack data over to our new memory area too\n                    memcpy ((void *)data, (void *)stackData, (size_t) BITS_TO_BYTES( numberOfBitsAllocated ));\n                }\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdata = ( unsigned char* ) OVR_REALLOC( data, (size_t) amountToAllocate);\n\t\t}\n\n#ifdef _DEBUG\n\t\tOVR_ASSERT( data ); // Make sure realloc succeeded\n#endif\n\t\t//  memset(data+newByteOffset, 0,  ((newNumberOfBitsAllocated-1)>>3) - ((numberOfBitsAllocated-1)>>3)); // Set the new data block to 0\n\t}\n\n\tif ( newNumberOfBitsAllocated > numberOfBitsAllocated )\n\t\tnumberOfBitsAllocated = newNumberOfBitsAllocated;\n}\nBitSize_t BitStream::GetNumberOfBitsAllocated(void) const\n{\n\treturn numberOfBitsAllocated;\n}\nvoid BitStream::PadWithZeroToByteLength( unsigned int bytes )\n{\n\tif (GetNumberOfBytesUsed() < bytes)\n\t{\n\t\tAlignWriteToByteBoundary();\n\t\tunsigned int numToWrite = bytes - GetNumberOfBytesUsed();\n\t\tAddBitsAndReallocate( BYTES_TO_BITS(numToWrite) );\n\t\tmemset(data+BITS_TO_BYTES(numberOfBitsUsed), 0, (size_t) numToWrite);\n\t\tnumberOfBitsUsed+=BYTES_TO_BITS(numToWrite);\n\t}\n}\n\n/* \n// Julius Goryavsky's version of Harley's algorithm.\n// 17 elementary ops plus an indexed load, if the machine\n// has \"and not.\"\n\nint nlz10b(unsigned x) {\n\n   static char table[64] =\n     {32,20,19, u, u,18, u, 7,  10,17, u, u,14, u, 6, u,\n       u, 9, u,16, u, u, 1,26,   u,13, u, u,24, 5, u, u,\n       u,21, u, 8,11, u,15, u,   u, u, u, 2,27, 0,25, u,\n      22, u,12, u, u, 3,28, u,  23, u, 4,29, u, u,30,31};\n\n   x = x | (x >> 1);    // Propagate leftmost\n   x = x | (x >> 2);    // 1-bit to the right.\n   x = x | (x >> 4);\n   x = x | (x >> 8);\n   x = x & ~(x >> 16);\n   x = x*0xFD7049FF;    // Activate this line or the following 3.\n// x = (x << 9) - x;    // Multiply by 511.\n// x = (x << 11) - x;   // Multiply by 2047.\n// x = (x << 14) - x;   // Multiply by 16383.\n   return table[x >> 26];\n}\n*/\nint BitStream::NumberOfLeadingZeroes( int8_t x ) {return NumberOfLeadingZeroes((uint8_t)x);}\nint BitStream::NumberOfLeadingZeroes( uint8_t x )\n{\n\tuint8_t y;\n\tint n;\n\n\tn = 8;\n\ty = x >> 4;  if (y != 0) {n = n - 4;  x = y;}\n\ty = x >> 2;  if (y != 0) {n = n - 2;  x = y;}\n\ty = x >> 1;  if (y != 0) return n - 2;\n\treturn (int)(n - x);\n}\nint BitStream::NumberOfLeadingZeroes( int16_t x ) {return NumberOfLeadingZeroes((uint16_t)x);}\nint BitStream::NumberOfLeadingZeroes( uint16_t x )\n{\n\tuint16_t y;\n\tint n;\n\n\tn = 16;\n\ty = x >> 8;  if (y != 0) {n = n - 8;  x = y;}\n\ty = x >> 4;  if (y != 0) {n = n - 4;  x = y;}\n\ty = x >> 2;  if (y != 0) {n = n - 2;  x = y;}\n\ty = x >> 1;  if (y != 0) return n - 2;\n\treturn (int)(n - x);\n}\nint BitStream::NumberOfLeadingZeroes( int32_t x ) {return NumberOfLeadingZeroes((uint32_t)x);}\nint BitStream::NumberOfLeadingZeroes( uint32_t x )\n{\n\tuint32_t y;\n\tint n;\n\n\tn = 32;\n\ty = x >>16;  if (y != 0) {n = n -16;  x = y;}\n\ty = x >> 8;  if (y != 0) {n = n - 8;  x = y;}\n\ty = x >> 4;  if (y != 0) {n = n - 4;  x = y;}\n\ty = x >> 2;  if (y != 0) {n = n - 2;  x = y;}\n\ty = x >> 1;  if (y != 0) return n - 2;\n\treturn (int)(n - x);\n}\nint BitStream::NumberOfLeadingZeroes( int64_t x ) {return NumberOfLeadingZeroes((uint64_t)x);}\nint BitStream::NumberOfLeadingZeroes( uint64_t x )\n{\n\tuint64_t y;\n\tint n;\n\n\tn = 64;\n\ty = x >>32;  if (y != 0) {n = n -32;  x = y;}\n\ty = x >>16;  if (y != 0) {n = n -16;  x = y;}\n\ty = x >> 8;  if (y != 0) {n = n - 8;  x = y;}\n\ty = x >> 4;  if (y != 0) {n = n - 4;  x = y;}\n\ty = x >> 2;  if (y != 0) {n = n - 2;  x = y;}\n\ty = x >> 1;  if (y != 0) return n - 2;\n\treturn (int)(n - x);\n}\n\n// Should hit if reads didn't match writes\nvoid BitStream::AssertStreamEmpty( void )\n{\n\tOVR_ASSERT( readOffset == numberOfBitsUsed );\n}\nvoid BitStream::PrintBits( char *out ) const\n{\n\tif ( numberOfBitsUsed <= 0 )\n\t{\n\t\tOVR_strcpy(out, 128, \"No bits\\n\" );\n\t\treturn;\n\t}\n\n\tunsigned int strIndex=0;\n\tfor ( BitSize_t counter = 0; counter < BITS_TO_BYTES( numberOfBitsUsed ) && strIndex < 2000 ; counter++ )\n\t{\n\t\tBitSize_t stop;\n\n\t\tif ( counter == ( numberOfBitsUsed - 1 ) >> 3 )\n\t\t\tstop = 8 - ( ( ( numberOfBitsUsed - 1 ) & 7 ) + 1 );\n\t\telse\n\t\t\tstop = 0;\n\n\t\tfor ( BitSize_t counter2 = 7; counter2 >= stop; counter2-- )\n\t\t{\n\t\t\tif ( ( data[ counter ] >> counter2 ) & 1 )\n\t\t\t\tout[strIndex++]='1';\n\t\t\telse\n\t\t\t\tout[strIndex++]='0';\n\n\t\t\tif (counter2==0)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tout[strIndex++]=' ';\n\t}\n\n\tout[strIndex++]='\\n';\n\n\tout[strIndex++]=0;\n}\nvoid BitStream::PrintBits( void ) const\n{\n\tchar out[2048];\n\tPrintBits(out);\n\tprintf(\"%s\", out);\n}\nvoid BitStream::PrintHex( char *out ) const\n{\n\tBitSize_t i;\n\tfor ( i=0; i < GetNumberOfBytesUsed(); i++)\n\t{\n\t\tOVR_sprintf(out+i*3, 128, \"%02x \", data[i]);\n\t}\n}\nvoid BitStream::PrintHex( void ) const\n{\n\tchar out[2048];\n\tPrintHex(out);\n\tprintf(\"%s\", out);\n}\n\n// Exposes the data for you to look at, like PrintBits does.\n// Data will point to the stream.  Returns the length in bits of the stream.\nBitSize_t BitStream::CopyData( unsigned char** _data ) const\n{\n#ifdef _DEBUG\n\tOVR_ASSERT( numberOfBitsUsed > 0 );\n#endif\n\n\t*_data = (unsigned char*) OVR_ALLOC( (size_t) BITS_TO_BYTES( numberOfBitsUsed ));\n\tmemcpy( *_data, data, sizeof(unsigned char) * (size_t) ( BITS_TO_BYTES( numberOfBitsUsed ) ) );\n\treturn numberOfBitsUsed;\n}\n\n// Ignore data we don't intend to read\nvoid BitStream::IgnoreBits( const BitSize_t numberOfBits )\n{\n\treadOffset += numberOfBits;\n}\n\nvoid BitStream::IgnoreBytes( const unsigned int numberOfBytes )\n{\n\tIgnoreBits(BYTES_TO_BITS(numberOfBytes));\n}\n\n// Move the write pointer to a position on the array.  Dangerous if you don't know what you are doing!\n// Doesn't work with non-aligned data!\nvoid BitStream::SetWriteOffset( const BitSize_t offset )\n{\n\tnumberOfBitsUsed = offset;\n}\n\n/*\nBitSize_t BitStream::GetWriteOffset( void ) const\n{\nreturn numberOfBitsUsed;\n}\n\n// Returns the length in bits of the stream\nBitSize_t BitStream::GetNumberOfBitsUsed( void ) const\n{\nreturn GetWriteOffset();\n}\n\n// Returns the length in bytes of the stream\nBitSize_t BitStream::GetNumberOfBytesUsed( void ) const\n{\nreturn BITS_TO_BYTES( numberOfBitsUsed );\n}\n\n// Returns the number of bits into the stream that we have read\nBitSize_t BitStream::GetReadOffset( void ) const\n{\nreturn readOffset;\n}\n\n\n// Sets the read bit index\nvoid BitStream::SetReadOffset( const BitSize_t newReadOffset )\n{\nreadOffset=newReadOffset;\n}\n\n// Returns the number of bits left in the stream that haven't been read\nBitSize_t BitStream::GetNumberOfUnreadBits( void ) const\n{\nreturn numberOfBitsUsed - readOffset;\n}\n// Exposes the internal data\nunsigned char* BitStream::GetData( void ) const\n{\nreturn data;\n}\n\n*/\n// If we used the constructor version with copy data off, this makes sure it is set to on and the data pointed to is copied.\nvoid BitStream::AssertCopyData( void )\n{\n\tif ( copyData == false )\n\t{\n\t\tcopyData = true;\n\n\t\tif ( numberOfBitsAllocated > 0 )\n\t\t{\n\t\t\tunsigned char * newdata = ( unsigned char* ) OVR_ALLOC( (size_t) BITS_TO_BYTES( numberOfBitsAllocated ));\n#ifdef _DEBUG\n\n\t\t\tOVR_ASSERT( data );\n#endif\n\n\t\t\tmemcpy( newdata, data, (size_t) BITS_TO_BYTES( numberOfBitsAllocated ) );\n\t\t\tdata = newdata;\n\t\t}\n\n\t\telse\n\t\t\tdata = 0;\n\t}\n}\nbool BitStream::IsNetworkOrderInternal(void)\n{\n    static unsigned long htonlValue = htonl(12345);\n    return htonlValue == 12345;\n}\nvoid BitStream::ReverseBytes(unsigned char *inByteArray, unsigned char *inOutByteArray, const unsigned int length)\n{\n\tfor (BitSize_t i=0; i < length; i++)\n\t\tinOutByteArray[i]=inByteArray[length-i-1];\n}\nvoid BitStream::ReverseBytesInPlace(unsigned char *inOutData,const unsigned int length)\n{\n\tunsigned char temp;\n\tBitSize_t i;\n\tfor (i=0; i < (length>>1); i++)\n\t{\n\t\ttemp = inOutData[i];\n\t\tinOutData[i]=inOutData[length-i-1];\n\t\tinOutData[length-i-1]=temp;\n\t}\n}\n\nvoid BitStream::WriteAlignedVar8(const char *inByteArray)\n{\n\tOVR_ASSERT((numberOfBitsUsed&7)==0);\n\tAddBitsAndReallocate(1*8);\n\tdata[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[0];\n\tnumberOfBitsUsed+=1*8;\n}\nbool BitStream::ReadAlignedVar8(char *inOutByteArray)\n{\n\tOVR_ASSERT((readOffset&7)==0);\n\tif ( readOffset + 1*8 > numberOfBitsUsed )\n\t\treturn false;\n\n\tinOutByteArray[0] = data[( readOffset >> 3 ) + 0];\n\treadOffset+=1*8;\n\treturn true;\n}\nvoid BitStream::WriteAlignedVar16(const char *inByteArray)\n{\n\tOVR_ASSERT((numberOfBitsUsed&7)==0);\n\tAddBitsAndReallocate(2*8);\n#ifndef __BITSTREAM_NATIVE_END\n\tif (DoEndianSwap())\n\t{\n\t\tdata[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[1];\n\t\tdata[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[0];\n\t}\n\telse\n#endif\n\t{\n\t\tdata[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[0];\n\t\tdata[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[1];\n\t}\n\n\tnumberOfBitsUsed+=2*8;\n}\nbool BitStream::ReadAlignedVar16(char *inOutByteArray)\n{\n\tOVR_ASSERT((readOffset&7)==0);\n\tif ( readOffset + 2*8 > numberOfBitsUsed )\n\t\treturn false;\n#ifndef __BITSTREAM_NATIVE_END\n\tif (DoEndianSwap())\n\t{\n\t\tinOutByteArray[0] = data[( readOffset >> 3 ) + 1];\n\t\tinOutByteArray[1] = data[( readOffset >> 3 ) + 0];\n\t}\n\telse\n#endif\n\t{\n\t\tinOutByteArray[0] = data[( readOffset >> 3 ) + 0];\n\t\tinOutByteArray[1] = data[( readOffset >> 3 ) + 1];\n\t}\n\n\treadOffset+=2*8;\n\treturn true;\n}\nvoid BitStream::WriteAlignedVar32(const char *inByteArray)\n{\n\tOVR_ASSERT((numberOfBitsUsed&7)==0);\n\tAddBitsAndReallocate(4*8);\n#ifndef __BITSTREAM_NATIVE_END\n\tif (DoEndianSwap())\n\t{\n\t\tdata[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[3];\n\t\tdata[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[2];\n\t\tdata[( numberOfBitsUsed >> 3 ) + 2] = inByteArray[1];\n\t\tdata[( numberOfBitsUsed >> 3 ) + 3] = inByteArray[0];\n\t}\n\telse\n#endif\n\t{\n\t\tdata[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[0];\n\t\tdata[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[1];\n\t\tdata[( numberOfBitsUsed >> 3 ) + 2] = inByteArray[2];\n\t\tdata[( numberOfBitsUsed >> 3 ) + 3] = inByteArray[3];\n\t}\n\n\tnumberOfBitsUsed+=4*8;\n}\nbool BitStream::ReadAlignedVar32(char *inOutByteArray)\n{\n\tOVR_ASSERT((readOffset&7)==0);\n\tif ( readOffset + 4*8 > numberOfBitsUsed )\n\t\treturn false;\n#ifndef __BITSTREAM_NATIVE_END\n\tif (DoEndianSwap())\n\t{\n\t\tinOutByteArray[0] = data[( readOffset >> 3 ) + 3];\n\t\tinOutByteArray[1] = data[( readOffset >> 3 ) + 2];\n\t\tinOutByteArray[2] = data[( readOffset >> 3 ) + 1];\n\t\tinOutByteArray[3] = data[( readOffset >> 3 ) + 0];\n\t}\n\telse\n#endif\n\t{\n\t\tinOutByteArray[0] = data[( readOffset >> 3 ) + 0];\n\t\tinOutByteArray[1] = data[( readOffset >> 3 ) + 1];\n\t\tinOutByteArray[2] = data[( readOffset >> 3 ) + 2];\n\t\tinOutByteArray[3] = data[( readOffset >> 3 ) + 3];\n\t}\n\n\treadOffset+=4*8;\n\treturn true;\n}\nbool BitStream::ReadFloat16( float &outFloat, float floatMin, float floatMax )\n{\n\tuint16_t percentile;\n\tif (Read(percentile))\n\t{\n\t\tOVR_ASSERT(floatMax>floatMin);\n\t\toutFloat = floatMin + ((float) percentile / 65535.0f) * (floatMax-floatMin);\n\t\tif (outFloat<floatMin)\n\t\t\toutFloat=floatMin;\n\t\telse if (outFloat>floatMax)\n\t\t\toutFloat=floatMax;\n\t\treturn true;\n\t}\n\treturn false;\n}\nbool BitStream::SerializeFloat16(bool writeToBitstream, float &inOutFloat, float floatMin, float floatMax)\n{\n\tif (writeToBitstream)\n\t\tWriteFloat16(inOutFloat, floatMin, floatMax);\n\telse\n\t\treturn ReadFloat16(inOutFloat, floatMin, floatMax);\n\treturn true;\n}\nvoid BitStream::WriteFloat16( float inOutFloat, float floatMin, float floatMax )\n{\n\tOVR_ASSERT(floatMax>floatMin);\n\tif (inOutFloat>floatMax+.001)\n\t{\n\t\tOVR_ASSERT(inOutFloat<=floatMax+.001);\n\t}\n\tif (inOutFloat<floatMin-.001)\n\t{\n\t\tOVR_ASSERT(inOutFloat>=floatMin-.001);\n\t}\n\tfloat percentile=65535.0f * (inOutFloat-floatMin)/(floatMax-floatMin);\n\tif (percentile<0.0)\n\t\tpercentile=0.0;\n\tif (percentile>65535.0f)\n\t\tpercentile=65535.0f;\n\tWrite((uint16_t)percentile);\n}\n\n\n}} // OVR::Net\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Net/OVR_BitStream.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_BitStream.h\nContent     :   A generic serialization toolkit for packing data to a binary stream.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Bitstream_h\n#define OVR_Bitstream_h\n\n#include <math.h>\n#include \"Kernel/OVR_Types.h\"\n#include \"Kernel/OVR_Std.h\"\n#include \"Kernel/OVR_String.h\"\n\n#if defined(OVR_CC_MSVC)\n#pragma warning(push)\n#endif\n\nnamespace OVR { namespace Net {\n\ntypedef uint32_t BitSize_t;\n#define BITSTREAM_STACK_ALLOCATION_SIZE 256\n#define BITS_TO_BYTES(x) (((x)+7)>>3)\n#define BYTES_TO_BITS(x) ((x)<<3)\n\n\n//-----------------------------------------------------------------------------\n// BitStream\n\n// Generic serialization class to binary stream\nclass BitStream : public NewOverrideBase\n{\npublic:\n\t/// Default Constructor\n\tBitStream();\n\n\t/// \\brief Create the bitstream, with some number of bytes to immediately allocate.\n\t/// \\details There is no benefit to calling this, unless you know exactly how many bytes you need and it is greater than BITSTREAM_STACK_ALLOCATION_SIZE.\n\t/// In that case all it does is save you one or more realloc calls.\n\t/// \\param[in] initialBytesToAllocate the number of bytes to pre-allocate.\n\tBitStream( const unsigned int initialBytesToAllocate );\n\n\t/// \\brief Initialize the BitStream, immediately setting the data it contains to a predefined pointer.\n\t/// \\details Set \\a _copyData to true if you want to make an internal copy of the data you are passing. Set it to false to just save a pointer to the data.\n\t/// You shouldn't call Write functions with \\a _copyData as false, as this will write to unallocated memory\n\t/// 99% of the time you will use this function to cast Packet::data to a bitstream for reading, in which case you should write something as follows:\n\t/// \\code\n\t/// RakNet::BitStream bs(packet->data, packet->length, false);\n\t/// \\endcode\n\t/// \\param[in] _data An array of bytes.\n\t/// \\param[in] lengthInBytes Size of the \\a _data.\n\t/// \\param[in] _copyData true or false to make a copy of \\a _data or not.\n\tBitStream( char* _data, const unsigned int lengthInBytes, bool _copyData );\n\n\t// Destructor\n\t~BitStream();\n\npublic:\n\t/// Resets the bitstream for reuse.\n\tvoid Reset( void );\n\n    // Releases the current data and points the bitstream at the provided buffer\n    void WrapBuffer(unsigned char* data, const unsigned int lengthInBytes);\n\n\t/// \\brief Bidirectional serialize/deserialize any integral type to/from a bitstream.  \n\t/// \\details Undefine __BITSTREAM_NATIVE_END if you need endian swapping.\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] inOutTemplateVar The value to write\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\ttemplate <class templateType>\n\tbool Serialize(bool writeToBitstream, templateType &inOutTemplateVar);\n\n\t/// \\brief Bidirectional serialize/deserialize any integral type to/from a bitstream. \n\t/// \\details If the current value is different from the last value\n\t/// the current value will be written.  Otherwise, a single bit will be written\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] inOutCurrentValue The current value to write\n\t/// \\param[in] lastValue The last value to compare against.  Only used if \\a writeToBitstream is true.\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\ttemplate <class templateType>\n\tbool SerializeDelta(bool writeToBitstream, templateType &inOutCurrentValue, const templateType &lastValue);\n\n\t/// \\brief Bidirectional version of SerializeDelta when you don't know what the last value is, or there is no last value.\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] inOutCurrentValue The current value to write\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\ttemplate <class templateType>\n\tbool SerializeDelta(bool writeToBitstream, templateType &inOutCurrentValue);\n\n\t/// \\brief Bidirectional serialize/deserialize any integral type to/from a bitstream.\n\t/// \\details Undefine __BITSTREAM_NATIVE_END if you need endian swapping.\n\t/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n\t/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n\t/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] inOutTemplateVar The value to write\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\ttemplate <class templateType>\n\tbool SerializeCompressed(bool writeToBitstream, templateType &inOutTemplateVar);\n\n\t/// \\brief Bidirectional serialize/deserialize any integral type to/from a bitstream.  \n\t/// \\details If the current value is different from the last value\n\t/// the current value will be written.  Otherwise, a single bit will be written\n\t/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n\t/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n\t/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] inOutCurrentValue The current value to write\n\t/// \\param[in] lastValue The last value to compare against.  Only used if \\a writeToBitstream is true.\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\ttemplate <class templateType>\n\tbool SerializeCompressedDelta(bool writeToBitstream, templateType &inOutCurrentValue, const templateType &lastValue);\n\n\t/// \\brief Save as SerializeCompressedDelta(templateType &currentValue, const templateType &lastValue) when we have an unknown second parameter\n\t/// \\return true on data read. False on insufficient data in bitstream\n\ttemplate <class templateType>\n\tbool SerializeCompressedDelta(bool writeToBitstream, templateType &inOutTemplateVar);\n\n\t/// \\brief Bidirectional serialize/deserialize an array or casted stream or raw data.  This does NOT do endian swapping.\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] inOutByteArray a byte buffer\n\t/// \\param[in] numberOfBytes the size of \\a input in bytes\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\tbool Serialize(bool writeToBitstream,  char* inOutByteArray, const unsigned int numberOfBytes );\n\n\t/// \\brief Serialize a float into 2 bytes, spanning the range between \\a floatMin and \\a floatMax\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] inOutFloat The float to write\n\t/// \\param[in] floatMin Predetermined minimum value of f\n\t/// \\param[in] floatMax Predetermined maximum value of f\n\tbool SerializeFloat16(bool writeToBitstream, float &inOutFloat, float floatMin, float floatMax);\n\n\t/// Serialize one type casted to another (smaller) type, to save bandwidth\n\t/// serializationType should be uint8_t, uint16_t, uint24_t, or uint32_t\n\t/// Example: int num=53; SerializeCasted<uint8_t>(true, num); would use 1 byte to write what would otherwise be an integer (4 or 8 bytes)\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] value The value to serialize\n\ttemplate <class serializationType, class sourceType >\n\tbool SerializeCasted( bool writeToBitstream, sourceType &value );\n\n\t/// Given the minimum and maximum values for an integer type, figure out the minimum number of bits to represent the range\n\t/// Then serialize only those bits\n\t/// \\note A static is used so that the required number of bits for (maximum-minimum) is only calculated once. This does require that \\a minimum and \\maximum are fixed values for a given line of code for the life of the program\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] value Integer value to write, which should be between \\a minimum and \\a maximum\n\t/// \\param[in] minimum Minimum value of \\a value\n\t/// \\param[in] maximum Maximum value of \\a value\n\t/// \\param[in] allowOutsideRange If true, all sends will take an extra bit, however value can deviate from outside \\a minimum and \\a maximum. If false, will assert if the value deviates\n\ttemplate <class templateType>\n\tbool SerializeBitsFromIntegerRange( bool writeToBitstream, templateType &value, const templateType minimum, const templateType maximum, bool allowOutsideRange=false );\n\t/// \\param[in] requiredBits Primarily for internal use, called from above function() after calculating number of bits needed to represent maximum-minimum\n\ttemplate <class templateType>\n\tbool SerializeBitsFromIntegerRange( bool writeToBitstream, templateType &value, const templateType minimum, const templateType maximum, const int requiredBits, bool allowOutsideRange=false );\n\n\t/// \\brief Bidirectional serialize/deserialize a normalized 3D vector, using (at most) 4 bytes + 3 bits instead of 12-24 bytes.  \n\t/// \\details Will further compress y or z axis aligned vectors.\n\t/// Accurate to 1/32767.5.\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] x x\n\t/// \\param[in] y y\n\t/// \\param[in] z z\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tbool SerializeNormVector(bool writeToBitstream,  templateType &x, templateType &y, templateType &z );\n\n\t/// \\brief Bidirectional serialize/deserialize a vector, using 10 bytes instead of 12.\n\t/// \\details Loses accuracy to about 3/10ths and only saves 2 bytes, so only use if accuracy is not important.\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] x x\n\t/// \\param[in] y y\n\t/// \\param[in] z z\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tbool SerializeVector(bool writeToBitstream,  templateType &x, templateType &y, templateType &z );\n\n\t/// \\brief Bidirectional serialize/deserialize a normalized quaternion in 6 bytes + 4 bits instead of 16 bytes. Slightly lossy.\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] w w\n\t/// \\param[in] x x\n\t/// \\param[in] y y\n\t/// \\param[in] z z\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tbool SerializeNormQuat(bool writeToBitstream,  templateType &w, templateType &x, templateType &y, templateType &z);\n\n\t/// \\brief Bidirectional serialize/deserialize an orthogonal matrix by creating a quaternion, and writing 3 components of the quaternion in 2 bytes each.\n\t/// \\details Use 6 bytes instead of 36\n\t/// Lossy, although the result is renormalized\n\t/// \\return true on success, false on failure.\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tbool SerializeOrthMatrix(\n\t\tbool writeToBitstream,\n\t\ttemplateType &m00, templateType &m01, templateType &m02,\n\t\ttemplateType &m10, templateType &m11, templateType &m12,\n\t\ttemplateType &m20, templateType &m21, templateType &m22 );\n\n\t/// \\brief Bidirectional serialize/deserialize numberToSerialize bits to/from the input. \n\t/// \\details Right aligned data means in the case of a partial byte, the bits are aligned\n\t/// from the right (bit 0) rather than the left (as in the normal\n\t/// internal representation) You would set this to true when\n\t/// writing user data, and false when copying bitstream data, such\n\t/// as writing one bitstream to another\n\t/// \\param[in] writeToBitstream true to write from your data to this bitstream.  False to read from this bitstream and write to your data\n\t/// \\param[in] inOutByteArray The data\n\t/// \\param[in] numberOfBitsToSerialize The number of bits to write\n\t/// \\param[in] rightAlignedBits if true data will be right aligned\n\t/// \\return true if \\a writeToBitstream is true.  true if \\a writeToBitstream is false and the read was successful.  false if \\a writeToBitstream is false and the read was not successful.\n\tbool SerializeBits(bool writeToBitstream, unsigned char* inOutByteArray, const BitSize_t numberOfBitsToSerialize, const bool rightAlignedBits = true );\n\n\t/// \\brief Write any integral type to a bitstream.  \n\t/// \\details Undefine __BITSTREAM_NATIVE_END if you need endian swapping.\n\t/// \\param[in] inTemplateVar The value to write\n\ttemplate <class templateType>\n\tvoid Write(const templateType &inTemplateVar);\n\n\t/// \\brief Write the dereferenced pointer to any integral type to a bitstream.  \n\t/// \\details Undefine __BITSTREAM_NATIVE_END if you need endian swapping.\n\t/// \\param[in] inTemplateVar The value to write\n\ttemplate <class templateType>\n\tvoid WritePtr(templateType *inTemplateVar);\n\n\t/// \\brief Write any integral type to a bitstream.  \n\t/// \\details If the current value is different from the last value\n\t/// the current value will be written.  Otherwise, a single bit will be written\n\t/// \\param[in] currentValue The current value to write\n\t/// \\param[in] lastValue The last value to compare against\n\ttemplate <class templateType>\n\tvoid WriteDelta(const templateType &currentValue, const templateType &lastValue);\n\n\t/// \\brief WriteDelta when you don't know what the last value is, or there is no last value.\n\t/// \\param[in] currentValue The current value to write\n\ttemplate <class templateType>\n\tvoid WriteDelta(const templateType &currentValue);\n\n\t/// \\brief Write any integral type to a bitstream.  \n\t/// \\details Undefine __BITSTREAM_NATIVE_END if you need endian swapping.\n\t/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n\t/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n\t/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n\t/// \\param[in] inTemplateVar The value to write\n\ttemplate <class templateType>\n\tvoid WriteCompressed(const templateType &inTemplateVar);\n\n\t/// \\brief Write any integral type to a bitstream.  \n\t/// \\details If the current value is different from the last value\n\t/// the current value will be written.  Otherwise, a single bit will be written\n\t/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n\t/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n\t/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n\t/// \\param[in] currentValue The current value to write\n\t/// \\param[in] lastValue The last value to compare against\n\ttemplate <class templateType>\n\tvoid WriteCompressedDelta(const templateType &currentValue, const templateType &lastValue);\n\n\t/// \\brief Save as WriteCompressedDelta(const templateType &currentValue, const templateType &lastValue) when we have an unknown second parameter\n\ttemplate <class templateType>\n\tvoid WriteCompressedDelta(const templateType &currentValue);\n\n\t/// \\brief Read any integral type from a bitstream.  \n\t/// \\details Define __BITSTREAM_NATIVE_END if you need endian swapping.\n\t/// \\param[in] outTemplateVar The value to read\n\t/// \\return true on success, false on failure.\n\ttemplate <class templateType>\n\tbool Read(templateType &outTemplateVar);\n\n\t/// \\brief Read any integral type from a bitstream.  \n\t/// \\details If the written value differed from the value compared against in the write function,\n\t/// var will be updated.  Otherwise it will retain the current value.\n\t/// ReadDelta is only valid from a previous call to WriteDelta\n\t/// \\param[in] outTemplateVar The value to read\n\t/// \\return true on success, false on failure.\n\ttemplate <class templateType>\n\tbool ReadDelta(templateType &outTemplateVar);\n\n\t/// \\brief Read any integral type from a bitstream.  \n\t/// \\details Undefine __BITSTREAM_NATIVE_END if you need endian swapping.\n\t/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n\t/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n\t/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n\t/// \\param[in] outTemplateVar The value to read\n\t/// \\return true on success, false on failure.\n\ttemplate <class templateType>\n\tbool ReadCompressed(templateType &outTemplateVar);\n\n\t/// \\brief Read any integral type from a bitstream.  \n\t/// \\details If the written value differed from the value compared against in the write function,\n\t/// var will be updated.  Otherwise it will retain the current value.\n\t/// the current value will be updated.\n\t/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n\t/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n\t/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n\t/// ReadCompressedDelta is only valid from a previous call to WriteDelta\n\t/// \\param[in] outTemplateVar The value to read\n\t/// \\return true on success, false on failure.\n\ttemplate <class templateType>\n\tbool ReadCompressedDelta(templateType &outTemplateVar);\n\n\t/// \\brief Read one bitstream to another.\n\t/// \\param[in] numberOfBits bits to read\n\t/// \\param bitStream the bitstream to read into from\n\t/// \\return true on success, false on failure.\n\tbool Read( BitStream *bitStream, BitSize_t numberOfBits );\n\tbool Read( BitStream *bitStream );\n\tbool Read( BitStream &bitStream, BitSize_t numberOfBits );\n\tbool Read( BitStream &bitStream );\n\n\t/// \\brief Write an array or casted stream or raw data.  This does NOT do endian swapping.\n\t/// \\param[in] inputByteArray a byte buffer\n\t/// \\param[in] numberOfBytes the size of \\a input in bytes\n\tvoid Write( const char* inputByteArray, const unsigned int numberOfBytes );\n\n\t/// \\brief Write one bitstream to another.\n\t/// \\param[in] numberOfBits bits to write\n\t/// \\param bitStream the bitstream to copy from\n\tvoid Write( BitStream *bitStream, BitSize_t numberOfBits );\n\tvoid Write( BitStream *bitStream );\n\tvoid Write( BitStream &bitStream, BitSize_t numberOfBits );\n\tvoid Write( BitStream &bitStream );\\\n\n\t/// \\brief Write a float into 2 bytes, spanning the range between \\a floatMin and \\a floatMax\n\t/// \\param[in] x The float to write\n\t/// \\param[in] floatMin Predetermined minimum value of f\n\t/// \\param[in] floatMax Predetermined maximum value of f\n\tvoid WriteFloat16( float x, float floatMin, float floatMax );\n\n\t/// Write one type serialized as another (smaller) type, to save bandwidth\n\t/// serializationType should be uint8_t, uint16_t, uint24_t, or uint32_t\n\t/// Example: int num=53; WriteCasted<uint8_t>(num); would use 1 byte to write what would otherwise be an integer (4 or 8 bytes)\n\t/// \\param[in] value The value to write\n\ttemplate <class serializationType, class sourceType >\n\tvoid WriteCasted( const sourceType &value );\n\n\t/// Given the minimum and maximum values for an integer type, figure out the minimum number of bits to represent the range\n\t/// Then write only those bits\n\t/// \\note A static is used so that the required number of bits for (maximum-minimum) is only calculated once. This does require that \\a minimum and \\maximum are fixed values for a given line of code for the life of the program\n\t/// \\param[in] value Integer value to write, which should be between \\a minimum and \\a maximum\n\t/// \\param[in] minimum Minimum value of \\a value\n\t/// \\param[in] maximum Maximum value of \\a value\n\t/// \\param[in] allowOutsideRange If true, all sends will take an extra bit, however value can deviate from outside \\a minimum and \\a maximum. If false, will assert if the value deviates. This should match the corresponding value passed to Read().\n\ttemplate <class templateType>\n\tvoid WriteBitsFromIntegerRange( const templateType value, const templateType minimum, const templateType maximum, bool allowOutsideRange=false );\n\t/// \\param[in] requiredBits Primarily for internal use, called from above function() after calculating number of bits needed to represent maximum-minimum\n\ttemplate <class templateType>\n\tvoid WriteBitsFromIntegerRange( const templateType value, const templateType minimum, const templateType maximum, const int requiredBits, bool allowOutsideRange=false );\n\n\t/// \\brief Write a normalized 3D vector, using (at most) 4 bytes + 3 bits instead of 12-24 bytes.  \n\t/// \\details Will further compress y or z axis aligned vectors.\n\t/// Accurate to 1/32767.5.\n\t/// \\param[in] x x\n\t/// \\param[in] y y\n\t/// \\param[in] z z\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tvoid WriteNormVector( templateType x, templateType y, templateType z );\n\n\t/// \\brief Write a vector, using 10 bytes instead of 12.\n\t/// \\details Loses accuracy to about 3/10ths and only saves 2 bytes, \n\t/// so only use if accuracy is not important.\n\t/// \\param[in] x x\n\t/// \\param[in] y y\n\t/// \\param[in] z z\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tvoid WriteVector( templateType x, templateType y, templateType z );\n\n\t/// \\brief Write a normalized quaternion in 6 bytes + 4 bits instead of 16 bytes.  Slightly lossy.\n\t/// \\param[in] w w\n\t/// \\param[in] x x\n\t/// \\param[in] y y\n\t/// \\param[in] z z\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tvoid WriteNormQuat( templateType w, templateType x, templateType y, templateType z);\n\n\t/// \\brief Write an orthogonal matrix by creating a quaternion, and writing 3 components of the quaternion in 2 bytes each.\n\t/// \\details Use 6 bytes instead of 36\n\t/// Lossy, although the result is renormalized\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tvoid WriteOrthMatrix(\n\t\ttemplateType m00, templateType m01, templateType m02,\n\t\ttemplateType m10, templateType m11, templateType m12,\n\t\ttemplateType m20, templateType m21, templateType m22 );\n\n\t/// \\brief Read an array or casted stream of byte.\n\t/// \\details The array is raw data. There is no automatic endian conversion with this function\n\t/// \\param[in] output The result byte array. It should be larger than @em numberOfBytes.\n\t/// \\param[in] numberOfBytes The number of byte to read\n\t/// \\return true on success false if there is some missing bytes.\n\tbool Read( char* output, const unsigned int numberOfBytes );\n\n\t/// \\brief Read a float into 2 bytes, spanning the range between \\a floatMin and \\a floatMax\n\t/// \\param[in] outFloat The float to read\n\t/// \\param[in] floatMin Predetermined minimum value of f\n\t/// \\param[in] floatMax Predetermined maximum value of f\n\tbool ReadFloat16( float &outFloat, float floatMin, float floatMax );\n\n\t/// Read one type serialized to another (smaller) type, to save bandwidth\n\t/// serializationType should be uint8_t, uint16_t, uint24_t, or uint32_t\n\t/// Example: int num; ReadCasted<uint8_t>(num); would read 1 bytefrom the stream, and put the value in an integer\n\t/// \\param[in] value The value to write\n\ttemplate <class serializationType, class sourceType >\n\tbool ReadCasted( sourceType &value );\n\n\t/// Given the minimum and maximum values for an integer type, figure out the minimum number of bits to represent the range\n\t/// Then read only those bits\n\t/// \\note A static is used so that the required number of bits for (maximum-minimum) is only calculated once. This does require that \\a minimum and \\maximum are fixed values for a given line of code for the life of the program\n\t/// \\param[in] value Integer value to read, which should be between \\a minimum and \\a maximum\n\t/// \\param[in] minimum Minimum value of \\a value\n\t/// \\param[in] maximum Maximum value of \\a value\n\t/// \\param[in] allowOutsideRange If true, all sends will take an extra bit, however value can deviate from outside \\a minimum and \\a maximum. If false, will assert if the value deviates. This should match the corresponding value passed to Write().\n\ttemplate <class templateType>\n\tbool ReadBitsFromIntegerRange( templateType &value, const templateType minimum, const templateType maximum, bool allowOutsideRange=false );\n\t/// \\param[in] requiredBits Primarily for internal use, called from above function() after calculating number of bits needed to represent maximum-minimum\n\ttemplate <class templateType>\n\tbool ReadBitsFromIntegerRange( templateType &value, const templateType minimum, const templateType maximum, const int requiredBits, bool allowOutsideRange=false );\n\n\t/// \\brief Read a normalized 3D vector, using (at most) 4 bytes + 3 bits instead of 12-24 bytes.  \n\t/// \\details Will further compress y or z axis aligned vectors.\n\t/// Accurate to 1/32767.5.\n\t/// \\param[in] x x\n\t/// \\param[in] y y\n\t/// \\param[in] z z\n\t/// \\return true on success, false on failure.\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tbool ReadNormVector( templateType &x, templateType &y, templateType &z );\n\n\t/// \\brief Read 3 floats or doubles, using 10 bytes, where those float or doubles comprise a vector.\n\t/// \\details Loses accuracy to about 3/10ths and only saves 2 bytes, \n\t/// so only use if accuracy is not important.\n\t/// \\param[in] x x\n\t/// \\param[in] y y\n\t/// \\param[in] z z\n\t/// \\return true on success, false on failure.\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tbool ReadVector( templateType &x, templateType &y, templateType &z );\n\n\t/// \\brief Read a normalized quaternion in 6 bytes + 4 bits instead of 16 bytes.\n\t/// \\param[in] w w\n\t/// \\param[in] x x\n\t/// \\param[in] y y\n\t/// \\param[in] z z\n\t/// \\return true on success, false on failure.\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tbool ReadNormQuat( templateType &w, templateType &x, templateType &y, templateType &z);\n\n\t/// \\brief Read an orthogonal matrix from a quaternion, reading 3 components of the quaternion in 2 bytes each and extrapolatig the 4th.\n\t/// \\details Use 6 bytes instead of 36\n\t/// Lossy, although the result is renormalized\n\t/// \\return true on success, false on failure.\n\ttemplate <class templateType> // templateType for this function must be a float or double\n\tbool ReadOrthMatrix(\n\t\ttemplateType &m00, templateType &m01, templateType &m02,\n\t\ttemplateType &m10, templateType &m11, templateType &m12,\n\t\ttemplateType &m20, templateType &m21, templateType &m22 );\n\n\t/// \\brief Sets the read pointer back to the beginning of your data.\n\tvoid ResetReadPointer( void );\n\n\t/// \\brief Sets the write pointer back to the beginning of your data.\n\tvoid ResetWritePointer( void );\n\n\t/// \\brief This is good to call when you are done with the stream to make\n\t/// sure you didn't leave any data left over void\n\tvoid AssertStreamEmpty( void );\n\n\t/// \\brief RAKNET_DEBUG_PRINTF the bits in the stream.  Great for debugging.\n\tvoid PrintBits( char *out ) const;\n\tvoid PrintBits( void ) const;\n\tvoid PrintHex( char *out ) const;\n\tvoid PrintHex( void ) const;\n\n\t/// \\brief Ignore data we don't intend to read\n\t/// \\param[in] numberOfBits The number of bits to ignore\n\tvoid IgnoreBits( const BitSize_t numberOfBits );\n\n\t/// \\brief Ignore data we don't intend to read\n\t/// \\param[in] numberOfBits The number of bytes to ignore\n\tvoid IgnoreBytes( const unsigned int numberOfBytes );\n\n\t/// \\brief Move the write pointer to a position on the array.\n\t/// \\param[in] offset the offset from the start of the array.\n\t/// \\attention\n\t/// \\details Dangerous if you don't know what you are doing!\n\t/// For efficiency reasons you can only write mid-stream if your data is byte aligned.\n\tvoid SetWriteOffset( const BitSize_t offset );\n\n\t/// \\brief Returns the length in bits of the stream\n\tinline BitSize_t GetNumberOfBitsUsed( void ) const {return GetWriteOffset();}\n\tinline BitSize_t GetWriteOffset( void ) const {return numberOfBitsUsed;}\n\n\t/// \\brief Returns the length in bytes of the stream\n\tinline BitSize_t GetNumberOfBytesUsed( void ) const {return BITS_TO_BYTES( numberOfBitsUsed );}\n\n\t/// \\brief Returns the number of bits into the stream that we have read\n\tinline BitSize_t GetReadOffset( void ) const {return readOffset;}\n\n\t/// \\brief Sets the read bit index\n\tvoid SetReadOffset( const BitSize_t newReadOffset ) {readOffset=newReadOffset;}\n\n\t/// \\brief Returns the number of bits left in the stream that haven't been read\n\tinline BitSize_t GetNumberOfUnreadBits( void ) const {return numberOfBitsUsed - readOffset;}\n\n\t/// \\brief Makes a copy of the internal data for you \\a _data will point to\n\t/// the stream. Partial bytes are left aligned.\n\t/// \\param[out] _data The allocated copy of GetData()\n\t/// \\return The length in bits of the stream.\n\tBitSize_t CopyData( unsigned char** _data ) const;\n\n\t/// \\internal\n\t/// Set the stream to some initial data.\n\tvoid SetData( unsigned char *inByteArray );\n\n\t/// Gets the data that BitStream is writing to / reading from.\n\t/// Partial bytes are left aligned.\n\t/// \\return A pointer to the internal state\n\tinline char* GetData( void ) const {return (char*) data;}\n\n\t/// \\brief Write numberToWrite bits from the input source.\n\t/// \\details Right aligned data means in the case of a partial byte, the bits are aligned\n\t/// from the right (bit 0) rather than the left (as in the normal\n\t/// internal representation) You would set this to true when\n\t/// writing user data, and false when copying bitstream data, such\n\t/// as writing one bitstream to another.\n\t/// \\param[in] inByteArray The data\n\t/// \\param[in] numberOfBitsToWrite The number of bits to write\n\t/// \\param[in] rightAlignedBits if true data will be right aligned\n\tvoid WriteBits( const unsigned char* inByteArray, BitSize_t numberOfBitsToWrite, const bool rightAlignedBits = true );\n\n\t/// \\brief Align the bitstream to the byte boundary and then write the\n\t/// specified number of bits.  \n\t/// \\details This is faster than WriteBits but\n\t/// wastes the bits to do the alignment and requires you to call\n\t/// ReadAlignedBits at the corresponding read position.\n\t/// \\param[in] inByteArray The data\n\t/// \\param[in] numberOfBytesToWrite The size of input.\n\tvoid WriteAlignedBytes( const unsigned char *inByteArray, const unsigned int numberOfBytesToWrite );\n\n\t// Endian swap bytes already in the bitstream\n\tvoid EndianSwapBytes( int byteOffset, int length );\n\n\t/// \\brief Aligns the bitstream, writes inputLength, and writes input. Won't write beyond maxBytesToWrite\n\t/// \\param[in] inByteArray The data\n\t/// \\param[in] inputLength The size of input.\n\t/// \\param[in] maxBytesToWrite Max bytes to write\n\tvoid WriteAlignedBytesSafe( const char *inByteArray, const unsigned int inputLength, const unsigned int maxBytesToWrite );\n\n\t/// \\brief Read bits, starting at the next aligned bits. \n\t/// \\details Note that the modulus 8 starting offset of the sequence must be the same as\n\t/// was used with WriteBits. This will be a problem with packet\n\t/// coalescence unless you byte align the coalesced packets.\n\t/// \\param[in] inOutByteArray The byte array larger than @em numberOfBytesToRead\n\t/// \\param[in] numberOfBytesToRead The number of byte to read from the internal state\n\t/// \\return true if there is enough byte.\n\tbool ReadAlignedBytes( unsigned char *inOutByteArray, const unsigned int numberOfBytesToRead );\n\n\t/// \\brief Reads what was written by WriteAlignedBytesSafe.\n\t/// \\param[in] inOutByteArray The data\n\t/// \\param[in] maxBytesToRead Maximum number of bytes to read\n\t/// \\return true on success, false on failure.\n\tbool ReadAlignedBytesSafe( char *inOutByteArray, int &inputLength, const int maxBytesToRead );\n\tbool ReadAlignedBytesSafe( char *inOutByteArray, unsigned int &inputLength, const unsigned int maxBytesToRead );\n\n\t/// \\brief Same as ReadAlignedBytesSafe() but allocates the memory for you using new, rather than assuming it is safe to write to\n\t/// \\param[in] outByteArray outByteArray will be deleted if it is not a pointer to 0\n\t/// \\return true on success, false on failure.\n\tbool ReadAlignedBytesSafeAlloc( char **outByteArray, int &inputLength, const unsigned int maxBytesToRead );\n\tbool ReadAlignedBytesSafeAlloc( char **outByteArray, unsigned int &inputLength, const unsigned int maxBytesToRead );\n\n\t/// \\brief Align the next write and/or read to a byte boundary.  \n\t/// \\details This can be used to 'waste' bits to byte align for efficiency reasons It\n\t/// can also be used to force coalesced bitstreams to start on byte\n\t/// boundaries so so WriteAlignedBits and ReadAlignedBits both\n\t/// calculate the same offset when aligning.\n\tinline void AlignWriteToByteBoundary( void ) {numberOfBitsUsed += 8 - ( (( numberOfBitsUsed - 1 ) & 7) + 1 );}\n\n\t/// \\brief Align the next write and/or read to a byte boundary.  \n\t/// \\details This can be used to 'waste' bits to byte align for efficiency reasons It\n\t/// can also be used to force coalesced bitstreams to start on byte\n\t/// boundaries so so WriteAlignedBits and ReadAlignedBits both\n\t/// calculate the same offset when aligning.\n\tinline void AlignReadToByteBoundary( void ) {readOffset += 8 - ( (( readOffset - 1 ) & 7 ) + 1 );}\n\n\t/// \\brief Read \\a numberOfBitsToRead bits to the output source.\n\t/// \\details alignBitsToRight should be set to true to convert internal\n\t/// bitstream data to userdata. It should be false if you used\n\t/// WriteBits with rightAlignedBits false\n\t/// \\param[in] inOutByteArray The resulting bits array\n\t/// \\param[in] numberOfBitsToRead The number of bits to read\n\t/// \\param[in] alignBitsToRight if true bits will be right aligned.\n\t/// \\return true if there is enough bits to read\n\tbool ReadBits( unsigned char *inOutByteArray, BitSize_t numberOfBitsToRead, const bool alignBitsToRight = true );\n\n\t/// \\brief Write a 0\n\tvoid Write0( void );\n\n\t/// \\brief Write a 1\n\tvoid Write1( void );\n\n\t/// \\brief Reads 1 bit and returns true if that bit is 1 and false if it is 0.\n\tbool ReadBit( void );\n\n\t/// \\brief If we used the constructor version with copy data off, this\n\t/// *makes sure it is set to on and the data pointed to is copied.\n\tvoid AssertCopyData( void );\n\n\t/// \\brief Use this if you pass a pointer copy to the constructor\n\t/// *(_copyData==false) and want to overallocate to prevent\n\t/// reallocation.\n\tvoid SetNumberOfBitsAllocated( const BitSize_t lengthInBits );\n\n\t/// \\brief Reallocates (if necessary) in preparation of writing numberOfBitsToWrite\n\tvoid AddBitsAndReallocate( const BitSize_t numberOfBitsToWrite );\n\n\t/// \\internal\n\t/// \\return How many bits have been allocated internally\n\tBitSize_t GetNumberOfBitsAllocated(void) const;\n\n\t/// Write zeros until the bitstream is filled up to \\a bytes\n\tvoid PadWithZeroToByteLength( unsigned int bytes );\n\n\t/// Get the number of leading zeros for a number\n\t/// \\param[in] x Number to test\n\tstatic int NumberOfLeadingZeroes( uint8_t x );\n\tstatic int NumberOfLeadingZeroes( uint16_t x );\n\tstatic int NumberOfLeadingZeroes( uint32_t x );\n\tstatic int NumberOfLeadingZeroes( uint64_t x );\n\tstatic int NumberOfLeadingZeroes( int8_t x );\n\tstatic int NumberOfLeadingZeroes( int16_t x );\n\tstatic int NumberOfLeadingZeroes( int32_t x );\n\tstatic int NumberOfLeadingZeroes( int64_t x );\n\n\t/// \\internal Unrolled inner loop, for when performance is critical\n\tvoid WriteAlignedVar8(const char *inByteArray);\n\t/// \\internal Unrolled inner loop, for when performance is critical\n\tbool ReadAlignedVar8(char *inOutByteArray);\n\t/// \\internal Unrolled inner loop, for when performance is critical\n\tvoid WriteAlignedVar16(const char *inByteArray);\n\t/// \\internal Unrolled inner loop, for when performance is critical\n\tbool ReadAlignedVar16(char *inOutByteArray);\n\t/// \\internal Unrolled inner loop, for when performance is critical\n\tvoid WriteAlignedVar32(const char *inByteArray);\n\t/// \\internal Unrolled inner loop, for when performance is critical\n\tbool ReadAlignedVar32(char *inOutByteArray);\n\n\tinline void Write(const char * const inStringVar)\n\t{\n\t\tuint16_t l = (uint16_t) OVR_strlen(inStringVar);\n\t\tWrite(l);\n\t\tWriteAlignedBytes((const unsigned char*) inStringVar, (const unsigned int) l);\n\t}\n\tinline void Write(const unsigned char * const inTemplateVar)\n\t{\n\t\tWrite((const char*)inTemplateVar);\n\t}\n\tinline void Write(char * const inTemplateVar)\n\t{\n\t\tWrite((const char*)inTemplateVar);\n\t}\n\tinline void Write(unsigned char * const inTemplateVar)\n\t{\n\t\tWrite((const char*)inTemplateVar);\n\t}\n\n\t/// ---- Member function template specialization declarations ----\n\t// Used for VC7\n#if defined(OVR_CC_MSVC) && _MSC_VER == 1300\n\t/// Write a bool to a bitstream.\n\t/// \\param[in] var The value to write\n\ttemplate <>\n\tvoid Write(const bool &var);\n\n\t/// Write a RakNetGUID to a bitsteam\n\t/// \\param[in] var The value to write\n\ttemplate <>\n\tvoid Write(const RakNetGuid &var);\n\n\t/// Write a string to a bitstream\n\t/// \\param[in] var The value to write\n\ttemplate <>\n\tvoid Write(const char* const &var);\n\ttemplate <>\n\tvoid Write(const unsigned char* const &var);\n\ttemplate <>\n\tvoid Write(char* const &var);\n\ttemplate <>\n\tvoid Write(unsigned char* const &var);\n\ttemplate <>\n\tvoid Write(const OVR::String &var);\n\n\t/// \\brief Write a bool delta.  \n\t/// \\details Same thing as just calling Write\n\t/// \\param[in] currentValue The current value to write\n\t/// \\param[in] lastValue The last value to compare against\n\ttemplate <>\n\tvoid WriteDelta(const bool &currentValue, const bool &lastValue);\n\n\ttemplate <>\n\tvoid WriteCompressed(const bool &var);\n\n\t/// For values between -1 and 1\n\ttemplate <>\n\tvoid WriteCompressed(const float &var);\n\n\t/// For values between -1 and 1\n\ttemplate <>\n\tvoid WriteCompressed(const double &var);\n\t\n\t/// \\brief Write a bool delta.  \n\t/// \\details Same thing as just calling Write\n\t/// \\param[in] currentValue The current value to write\n\t/// \\param[in] lastValue The last value to compare against\n\ttemplate <>\n\tvoid WriteCompressedDelta(const bool &currentValue, const bool &lastValue);\n\n\t/// \\brief Save as WriteCompressedDelta(bool currentValue, const templateType &lastValue) \n\t/// when we have an unknown second bool\n\ttemplate <>\n\tvoid WriteCompressedDelta(const bool &currentValue);\n\n\t/// \\brief Read a bool from a bitstream.\n\t/// \\param[in] var The value to read\n\t/// \\return true on success, false on failure.\n\ttemplate <>\n\tbool Read(bool &var);\n\n\t/// \\brief Read a String from a bitstream.\n\t/// \\param[in] var The value to read\n\t/// \\return true on success, false on failure.\n\ttemplate <>\n\tbool Read(char *&var);\n\ttemplate <>\n\tbool Read(wchar_t *&var);\n\ttemplate <>\n\tbool Read(unsigned char *&var);\n\n\t/// \\brief Read a bool from a bitstream.\n\t/// \\param[in] var The value to read\n\t/// \\return true on success, false on failure.\n\ttemplate <>\n\tbool ReadDelta(bool &var);\n\n\ttemplate <>\n\tbool ReadCompressed(bool &var);\n\n\ttemplate <>\n\tbool ReadCompressed(float &var);\n\n\t/// For values between -1 and 1\n\t/// \\return true on success, false on failure.\n\ttemplate <>\n\tbool ReadCompressed(double &var);\n\n\ttemplate <>\n\tbool ReadCompressed(char* &var);\n\ttemplate <>\n\tbool ReadCompressed(wchar_t* &var);\n\ttemplate <>\n\tbool ReadCompressed(unsigned char *&var);\n\ttemplate <>\n\tbool ReadCompressed(OVR::String &var);\n\n\t/// \\brief Read a bool from a bitstream.\n\t/// \\param[in] var The value to read\n\t/// \\return true on success, false on failure.\n\ttemplate <>\n\tbool ReadCompressedDelta(bool &var);\n#endif\n\n\tinline static bool DoEndianSwap(void) {\n#ifndef __BITSTREAM_NATIVE_END\n\t\treturn IsNetworkOrder()==false;\n#else\n\t\treturn false;\n#endif\n\t}\n\tinline static bool IsBigEndian(void)\n\t{\n\t\treturn IsNetworkOrder();\n\t}\n\tinline static bool IsNetworkOrder(void) {bool r = IsNetworkOrderInternal(); return r;}\n\t// Not inline, won't compile on PC due to winsock include errors\n\tstatic bool IsNetworkOrderInternal(void);\n\tstatic void ReverseBytes(unsigned char *inByteArray, unsigned char *inOutByteArray, const unsigned int length);\n\tstatic void ReverseBytesInPlace(unsigned char *inOutData,const unsigned int length);\n\nprivate:\n\n\tBitStream( const BitStream & /*invalid*/) : numberOfBitsUsed(0), numberOfBitsAllocated(0), readOffset(0),data(NULL), copyData(false) {\n\t\tOVR_ASSERT(0);\n\t}\n\n\tBitStream& operator = ( const BitStream& /*invalid*/ ) {\n\t\tOVR_ASSERT(0);\n\t\tstatic BitStream i;\n\t\treturn i;\n\t}\n\n\t/// \\brief Assume the input source points to a native type, compress and write it.\n\tvoid WriteCompressed( const unsigned char* inByteArray, const unsigned int size, const bool unsignedData );\n\n\t/// \\brief Assume the input source points to a compressed native type. Decompress and read it.\n\tbool ReadCompressed( unsigned char* inOutByteArray,\tconst unsigned int size, const bool unsignedData );\n\n\n\tBitSize_t numberOfBitsUsed;\n\n\tBitSize_t numberOfBitsAllocated;\n\n\tBitSize_t readOffset;\n\n\tunsigned char *data;\n\n\t/// true if the internal buffer is copy of the data passed to the constructor\n\tbool copyData;\n\n\t/// BitStreams that use less than BITSTREAM_STACK_ALLOCATION_SIZE use the stack, rather than the heap to store data.  It switches over if BITSTREAM_STACK_ALLOCATION_SIZE is exceeded\n\tunsigned char stackData[BITSTREAM_STACK_ALLOCATION_SIZE];\n};\n\ntemplate <class templateType>\ninline bool BitStream::Serialize(bool writeToBitstream, templateType &inOutTemplateVar)\n{\n\tif (writeToBitstream)\n\t\tWrite(inOutTemplateVar);\n\telse\n\t\treturn Read(inOutTemplateVar);\n\treturn true;\n}\n\ntemplate <class templateType>\ninline bool BitStream::SerializeDelta(bool writeToBitstream, templateType &inOutCurrentValue, const templateType &lastValue)\n{\n\tif (writeToBitstream)\n\t\tWriteDelta(inOutCurrentValue, lastValue);\n\telse\n\t\treturn ReadDelta(inOutCurrentValue);\n\treturn true;\n}\n\ntemplate <class templateType>\ninline bool BitStream::SerializeDelta(bool writeToBitstream, templateType &inOutCurrentValue)\n{\n\tif (writeToBitstream)\n\t\tWriteDelta(inOutCurrentValue);\n\telse\n\t\treturn ReadDelta(inOutCurrentValue);\n\treturn true;\n}\n\ntemplate <class templateType>\ninline bool BitStream::SerializeCompressed(bool writeToBitstream, templateType &inOutTemplateVar)\n{\n\tif (writeToBitstream)\n\t\tWriteCompressed(inOutTemplateVar);\n\telse\n\t\treturn ReadCompressed(inOutTemplateVar);\n\treturn true;\n}\n\ntemplate <class templateType>\ninline bool BitStream::SerializeCompressedDelta(bool writeToBitstream, templateType &inOutCurrentValue, const templateType &lastValue)\n{\n\tif (writeToBitstream)\n\t\tWriteCompressedDelta(inOutCurrentValue,lastValue);\n\telse\n\t\treturn ReadCompressedDelta(inOutCurrentValue);\n\treturn true;\n}\n//Stoppedhere\ntemplate <class templateType>\ninline bool BitStream::SerializeCompressedDelta(bool writeToBitstream, templateType &inOutCurrentValue)\n{\n\tif (writeToBitstream)\n\t\tWriteCompressedDelta(inOutCurrentValue);\n\telse\n\t\treturn ReadCompressedDelta(inOutCurrentValue);\n\treturn true;\n}\n\ninline bool BitStream::Serialize(bool writeToBitstream, char* inOutByteArray, const unsigned int numberOfBytes )\n{\n\tif (writeToBitstream)\n\t\tWrite(inOutByteArray, numberOfBytes);\n\telse\n\t\treturn Read(inOutByteArray, numberOfBytes);\n\treturn true;\n}\n\ntemplate <class serializationType, class sourceType >\nbool BitStream::SerializeCasted( bool writeToBitstream, sourceType &value )\n{\n\tif (writeToBitstream) WriteCasted<serializationType>(value);\n\telse return ReadCasted<serializationType>(value);\n\treturn true;\n}\n\ntemplate <class templateType>\nbool BitStream::SerializeBitsFromIntegerRange( bool writeToBitstream, templateType &value, const templateType minimum, const templateType maximum, bool allowOutsideRange )\n{\n\tint requiredBits=BYTES_TO_BITS(sizeof(templateType))-NumberOfLeadingZeroes(templateType(maximum-minimum));\n\treturn SerializeBitsFromIntegerRange(writeToBitstream,value,minimum,maximum,requiredBits,allowOutsideRange);\n}\ntemplate <class templateType>\nbool BitStream::SerializeBitsFromIntegerRange( bool writeToBitstream, templateType &value, const templateType minimum, const templateType maximum, const int requiredBits, bool allowOutsideRange )\n{\n\tif (writeToBitstream) WriteBitsFromIntegerRange(value,minimum,maximum,requiredBits,allowOutsideRange);\n\telse return ReadBitsFromIntegerRange(value,minimum,maximum,requiredBits,allowOutsideRange);\n\treturn true;\n}\n\ntemplate <class templateType>\ninline bool BitStream::SerializeNormVector(bool writeToBitstream, templateType &x, templateType &y, templateType &z )\n{\n\tif (writeToBitstream)\n\t\tWriteNormVector(x,y,z);\n\telse\n\t\treturn ReadNormVector(x,y,z);\n\treturn true;\n}\n\ntemplate <class templateType>\ninline bool BitStream::SerializeVector(bool writeToBitstream,  templateType &x, templateType &y, templateType &z )\n{\n\tif (writeToBitstream)\n\t\tWriteVector(x,y,z);\n\telse\n\t\treturn ReadVector(x,y,z);\n\treturn true;\n}\n\ntemplate <class templateType>\ninline bool BitStream::SerializeNormQuat(bool writeToBitstream,  templateType &w, templateType &x, templateType &y, templateType &z)\n{\n\tif (writeToBitstream)\n\t\tWriteNormQuat(w,x,y,z);\n\telse\n\t\treturn ReadNormQuat(w,x,y,z);\n\treturn true;\n}\n\ntemplate <class templateType>\ninline bool BitStream::SerializeOrthMatrix(\n\tbool writeToBitstream,\n\ttemplateType &m00, templateType &m01, templateType &m02,\n\ttemplateType &m10, templateType &m11, templateType &m12,\n\ttemplateType &m20, templateType &m21, templateType &m22 )\n{\n\tif (writeToBitstream)\n\t\tWriteOrthMatrix(m00,m01,m02,m10,m11,m12,m20,m21,m22);\n\telse\n\t\treturn ReadOrthMatrix(m00,m01,m02,m10,m11,m12,m20,m21,m22);\n\treturn true;\n}\n\ninline bool BitStream::SerializeBits(bool writeToBitstream, unsigned char* inOutByteArray, const BitSize_t numberOfBitsToSerialize, const bool rightAlignedBits )\n{\n\tif (writeToBitstream)\n\t\tWriteBits(inOutByteArray,numberOfBitsToSerialize,rightAlignedBits);\n\telse\n\t\treturn ReadBits(inOutByteArray,numberOfBitsToSerialize,rightAlignedBits);\n\treturn true;\n}\n\ntemplate <class templateType>\ninline void BitStream::Write(const templateType &inTemplateVar)\n{\n#ifdef OVR_CC_MSVC\n#pragma warning(disable:4127)   // conditional expression is constant\n#endif\n\tif (sizeof(inTemplateVar)==1)\n\t\tWriteBits( ( unsigned char* ) & inTemplateVar, sizeof( templateType ) * 8, true );\n\telse\n\t{\n#ifndef __BITSTREAM_NATIVE_END\n\t\tif (DoEndianSwap())\n\t\t{\n\t\t\tunsigned char output[sizeof(templateType)];\n\t\t\tReverseBytes((unsigned char*)&inTemplateVar, output, sizeof(templateType));\n\t\t\tWriteBits( ( unsigned char* ) output, sizeof(templateType) * 8, true );\n\t\t}\n\t\telse\n#endif\n\t\t\tWriteBits( ( unsigned char* ) & inTemplateVar, sizeof(templateType) * 8, true );\n\t}\n}\n\ntemplate <class templateType>\ninline void BitStream::WritePtr(templateType *inTemplateVar)\n{\n#ifdef OVR_CC_MSVC\n#pragma warning(disable:4127)   // conditional expression is constant\n#endif\n\tif (sizeof(templateType)==1)\n\t\tWriteBits( ( unsigned char* ) inTemplateVar, sizeof( templateType ) * 8, true );\n\telse\n\t{\n#ifndef __BITSTREAM_NATIVE_END\n\t\tif (DoEndianSwap())\n\t\t{\n\t\t\tunsigned char output[sizeof(templateType)];\n\t\t\tReverseBytes((unsigned char*) inTemplateVar, output, sizeof(templateType));\n\t\t\tWriteBits( ( unsigned char* ) output, sizeof(templateType) * 8, true );\n\t\t}\n\t\telse\n#endif\n\t\t\tWriteBits( ( unsigned char* ) inTemplateVar, sizeof(templateType) * 8, true );\n\t}\n}\n\n/// \\brief Write a bool to a bitstream.\n/// \\param[in] inTemplateVar The value to write\ntemplate <>\ninline void BitStream::Write(const bool &inTemplateVar)\n{\n\tif ( inTemplateVar )\n\t\tWrite1();\n\telse\n\t\tWrite0();\n}\n\n\n/// \\brief Write a string to a bitstream.\n/// \\param[in] var The value to write\ntemplate <>\ninline void BitStream::Write(const OVR::String &inTemplateVar)\n{\n\tuint16_t l = (uint16_t) inTemplateVar.GetLength();\n\tWrite(l);\n\tWriteAlignedBytes((const unsigned char*) inTemplateVar.ToCStr(), (const unsigned int) l);\n}\ntemplate <>\ninline void BitStream::Write(const char * const &inStringVar)\n{\n\tuint16_t l = (uint16_t) strlen(inStringVar);\n\tWrite(l);\n\tWriteAlignedBytes((const unsigned char*) inStringVar, (const unsigned int) l);\n}\ntemplate <>\ninline void BitStream::Write(const unsigned char * const &inTemplateVar)\n{\n\tWrite((const char*)inTemplateVar);\n}\ntemplate <>\ninline void BitStream::Write(char * const &inTemplateVar)\n{\n\tWrite((const char*)inTemplateVar);\n}\ntemplate <>\ninline void BitStream::Write(unsigned char * const &inTemplateVar)\n{\n\tWrite((const char*)inTemplateVar);\n}\n\n/// \\brief Write any integral type to a bitstream.  \n/// \\details If the current value is different from the last value\n/// the current value will be written.  Otherwise, a single bit will be written\n/// \\param[in] currentValue The current value to write\n/// \\param[in] lastValue The last value to compare against\ntemplate <class templateType>\ninline void BitStream::WriteDelta(const templateType &currentValue, const templateType &lastValue)\n{\n\tif (currentValue==lastValue)\n\t{\n\t\tWrite(false);\n\t}\n\telse\n\t{\n\t\tWrite(true);\n\t\tWrite(currentValue);\n\t}\n}\n\n/// \\brief Write a bool delta. Same thing as just calling Write\n/// \\param[in] currentValue The current value to write\n/// \\param[in] lastValue The last value to compare against\ntemplate <>\ninline void BitStream::WriteDelta(const bool &currentValue, const bool &lastValue)\n{\n\t(void) lastValue;\n\n\tWrite(currentValue);\n}\n\n/// \\brief WriteDelta when you don't know what the last value is, or there is no last value.\n/// \\param[in] currentValue The current value to write\ntemplate <class templateType>\ninline void BitStream::WriteDelta(const templateType &currentValue)\n{\n\tWrite(true);\n\tWrite(currentValue);\n}\n\n/// \\brief Write any integral type to a bitstream.  \n/// \\details Undefine __BITSTREAM_NATIVE_END if you need endian swapping.\n/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n/// \\param[in] inTemplateVar The value to write\ntemplate <class templateType>\ninline void BitStream::WriteCompressed(const templateType &inTemplateVar)\n{\n#ifdef OVR_CC_MSVC\n#pragma warning(disable:4127)   // conditional expression is constant\n#endif\n\tif (sizeof(inTemplateVar)==1)\n\t\tWriteCompressed( ( unsigned char* ) & inTemplateVar, sizeof( templateType ) * 8, true );\n\telse\n\t{\n#ifndef __BITSTREAM_NATIVE_END\n#ifdef OVR_CC_MSVC\n#pragma warning(disable:4244)   // '=' : conversion from 'unsigned long' to 'uint16_t', possible loss of data\n#endif\n\n\t\tif (DoEndianSwap())\n\t\t{\n\t\t\tunsigned char output[sizeof(templateType)];\n\t\t\tReverseBytes((unsigned char*)&inTemplateVar, output, sizeof(templateType));\n\t\t\tWriteCompressed( ( unsigned char* ) output, sizeof(templateType) * 8, true );\n\t\t}\n\t\telse\n#endif\n\t\t\tWriteCompressed( ( unsigned char* ) & inTemplateVar, sizeof(templateType) * 8, true );\n\t}\n}\n\ntemplate <>\ninline void BitStream::WriteCompressed(const bool &inTemplateVar)\n{\n\tWrite(inTemplateVar);\n}\n\n/// For values between -1 and 1\ntemplate <>\ninline void BitStream::WriteCompressed(const float &inTemplateVar)\n{\n\tOVR_ASSERT(inTemplateVar > -1.01f && inTemplateVar < 1.01f);\n\tfloat varCopy=inTemplateVar;\n\tif (varCopy < -1.0f)\n\t\tvarCopy=-1.0f;\n\tif (varCopy > 1.0f)\n\t\tvarCopy=1.0f;\n\tWrite((uint16_t)((varCopy+1.0f)*32767.5f));\n}\n\n/// For values between -1 and 1\ntemplate <>\ninline void BitStream::WriteCompressed(const double &inTemplateVar)\n{\n\tOVR_ASSERT(inTemplateVar > -1.01 && inTemplateVar < 1.01);\n\tdouble varCopy=inTemplateVar;\n\tif (varCopy < -1.0f)\n\t\tvarCopy=-1.0f;\n\tif (varCopy > 1.0f)\n\t\tvarCopy=1.0f;\n\tWrite((uint32_t)((varCopy+1.0)*2147483648.0));\n}\n\n/// \\brief Write any integral type to a bitstream.  \n/// \\details If the current value is different from the last value\n/// the current value will be written.  Otherwise, a single bit will be written\n/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n/// \\param[in] currentValue The current value to write\n/// \\param[in] lastValue The last value to compare against\ntemplate <class templateType>\ninline void BitStream::WriteCompressedDelta(const templateType &currentValue, const templateType &lastValue)\n{\n\tif (currentValue==lastValue)\n\t{\n\t\tWrite(false);\n\t}\n\telse\n\t{\n\t\tWrite(true);\n\t\tWriteCompressed(currentValue);\n\t}\n}\n\n/// \\brief Write a bool delta.  Same thing as just calling Write\n/// \\param[in] currentValue The current value to write\n/// \\param[in] lastValue The last value to compare against\ntemplate <>\ninline void BitStream::WriteCompressedDelta(const bool &currentValue, const bool &lastValue)\n{\n\t(void) lastValue;\n\n\tWrite(currentValue);\n}\n\n/// \\brief Save as WriteCompressedDelta(const templateType &currentValue, const templateType &lastValue) \n/// when we have an unknown second parameter\ntemplate <class templateType>\ninline void BitStream::WriteCompressedDelta(const templateType &currentValue)\n{\n\tWrite(true);\n\tWriteCompressed(currentValue);\n}\n\n/// \\brief Save as WriteCompressedDelta(bool currentValue, const templateType &lastValue) \n/// when we have an unknown second bool\ntemplate <>\ninline void BitStream::WriteCompressedDelta(const bool &currentValue)\n{\n\tWrite(currentValue);\n}\n\n/// \\brief Read any integral type from a bitstream.  Define __BITSTREAM_NATIVE_END if you need endian swapping.\n/// \\param[in] outTemplateVar The value to read\ntemplate <class templateType>\ninline bool BitStream::Read(templateType &outTemplateVar)\n{\n#ifdef OVR_CC_MSVC\n#pragma warning(disable:4127)   // conditional expression is constant\n#endif\n\tif (sizeof(outTemplateVar)==1)\n\t\treturn ReadBits( ( unsigned char* ) &outTemplateVar, sizeof(templateType) * 8, true );\n\telse\n\t{\n#ifndef __BITSTREAM_NATIVE_END\n#ifdef OVR_CC_MSVC\n#pragma warning(disable:4244)   // '=' : conversion from 'unsigned long' to 'uint16_t', possible loss of data\n#endif\n\t\tif (DoEndianSwap())\n\t\t{\n\t\t\tunsigned char output[sizeof(templateType)];\n\t\t\tif (ReadBits( ( unsigned char* ) output, sizeof(templateType) * 8, true ))\n\t\t\t{\n\t\t\t\tReverseBytes(output, (unsigned char*)&outTemplateVar, sizeof(templateType));\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\telse\n#endif\n\t\t\treturn ReadBits( ( unsigned char* ) & outTemplateVar, sizeof(templateType) * 8, true );\n\t}\n}\n\n/// \\brief Read a bool from a bitstream.\n/// \\param[in] outTemplateVar The value to read\ntemplate <>\ninline bool BitStream::Read(bool &outTemplateVar)\n{\n\tif ( readOffset + 1 > numberOfBitsUsed )\n\t\treturn false;\n\n\tif ( data[ readOffset >> 3 ] & ( 0x80 >> ( readOffset & 7 ) ) )   // Is it faster to just write it out here?\n\t\toutTemplateVar = true;\n\telse\n\t\toutTemplateVar = false;\n\n\t// Has to be on a different line for Mac\n\treadOffset++;\n\n\treturn true;\n}\n\ntemplate <>\ninline bool BitStream::Read(OVR::String &outTemplateVar)\n{\n\tbool b;\n\tuint16_t l;\n\tb=Read(l);\n\tif (b && l>0)\n\t{\n\t\tAlignReadToByteBoundary();\n\t\toutTemplateVar.AssignString((const char*) (data + ( readOffset >> 3 )), (size_t) l);\n\t\tIgnoreBytes(l);\n\t}\n\telse\n\t{\n\t\tAlignReadToByteBoundary();\n\t}\n\treturn b;\n}\ntemplate <>\ninline bool BitStream::Read(char *&varString)\n{\n\tbool b;\n\tuint16_t l;\n\tb=Read(l);\n\tif (b && l>0)\n\t{\n\t\tmemcpy(varString, data + ( readOffset >> 3 ), l);\n\t\tIgnoreBytes(l);\n\t}\n\telse\n\t{\n\t\tAlignReadToByteBoundary();\n\t}\n\treturn b;\n}\ntemplate <>\ninline bool BitStream::Read(unsigned char *&varString)\n{\n\tbool b;\n\tuint16_t l;\n\tb=Read(l);\n\tif (b && l>0)\n\t{\n\t\tmemcpy(varString, data + ( readOffset >> 3 ), l);\n\t\tIgnoreBytes(l);\n\t}\n\telse\n\t{\n\t\tAlignReadToByteBoundary();\n\t}\n\treturn b;\n}\n\n/// \\brief Read any integral type from a bitstream.  \n/// \\details If the written value differed from the value compared against in the write function,\n/// var will be updated.  Otherwise it will retain the current value.\n/// ReadDelta is only valid from a previous call to WriteDelta\n/// \\param[in] outTemplateVar The value to read\ntemplate <class templateType>\ninline bool BitStream::ReadDelta(templateType &outTemplateVar)\n{\n\tbool dataWritten;\n\tbool success;\n\tsuccess=Read(dataWritten);\n\tif (dataWritten)\n\t\tsuccess=Read(outTemplateVar);\n\treturn success;\n}\n\n/// \\brief Read a bool from a bitstream.\n/// \\param[in] outTemplateVar The value to read\ntemplate <>\ninline bool BitStream::ReadDelta(bool &outTemplateVar)\n{\n\treturn Read(outTemplateVar);\n}\n\n/// \\brief Read any integral type from a bitstream.  \n/// \\details Undefine __BITSTREAM_NATIVE_END if you need endian swapping.\n/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n/// \\param[in] outTemplateVar The value to read\ntemplate <class templateType>\ninline bool BitStream::ReadCompressed(templateType &outTemplateVar)\n{\n#ifdef OVR_CC_MSVC\n#pragma warning(disable:4127)   // conditional expression is constant\n#endif\n\tif (sizeof(outTemplateVar)==1)\n\t\treturn ReadCompressed( ( unsigned char* ) &outTemplateVar, sizeof(templateType) * 8, true );\n\telse\n\t{\n#ifndef __BITSTREAM_NATIVE_END\n\t\tif (DoEndianSwap())\n\t\t{\n\t\t\tunsigned char output[sizeof(templateType)];\n\t\t\tif (ReadCompressed( ( unsigned char* ) output, sizeof(templateType) * 8, true ))\n\t\t\t{\n\t\t\t\tReverseBytes(output, (unsigned char*)&outTemplateVar, sizeof(templateType));\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\telse\n#endif\n\t\t\treturn ReadCompressed( ( unsigned char* ) & outTemplateVar, sizeof(templateType) * 8, true );\n\t}\n}\n\ntemplate <>\ninline bool BitStream::ReadCompressed(bool &outTemplateVar)\n{\n\treturn Read(outTemplateVar);\n}\n\n/// For values between -1 and 1\ntemplate <>\ninline bool BitStream::ReadCompressed(float &outTemplateVar)\n{\n\tuint16_t compressedFloat;\n\tif (Read(compressedFloat))\n\t{\n\t\toutTemplateVar = ((float)compressedFloat / 32767.5f - 1.0f);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/// For values between -1 and 1\ntemplate <>\ninline bool BitStream::ReadCompressed(double &outTemplateVar)\n{\n\tuint32_t compressedFloat;\n\tif (Read(compressedFloat))\n\t{\n\t\toutTemplateVar = ((double)compressedFloat / 2147483648.0 - 1.0);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/// \\brief Read any integral type from a bitstream.  \n/// \\details If the written value differed from the value compared against in the write function,\n/// var will be updated.  Otherwise it will retain the current value.\n/// the current value will be updated.\n/// For floating point, this is lossy, using 2 bytes for a float and 4 for a double.  The range must be between -1 and +1.\n/// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type\n/// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte\n/// ReadCompressedDelta is only valid from a previous call to WriteDelta\n/// \\param[in] outTemplateVar The value to read\ntemplate <class templateType>\ninline bool BitStream::ReadCompressedDelta(templateType &outTemplateVar)\n{\n\tbool dataWritten;\n\tbool success;\n\tsuccess=Read(dataWritten);\n\tif (dataWritten)\n\t\tsuccess=ReadCompressed(outTemplateVar);\n\treturn success;\n}\n\n/// \\brief Read a bool from a bitstream.\n/// \\param[in] outTemplateVar The value to read\ntemplate <>\ninline bool BitStream::ReadCompressedDelta(bool &outTemplateVar)\n{\n\treturn Read(outTemplateVar);\n}\n\ntemplate <class destinationType, class sourceType >\nvoid BitStream::WriteCasted( const sourceType &value )\n{\n\tdestinationType val = (destinationType) value;\n\tWrite(val);\n}\n\ntemplate <class templateType>\nvoid BitStream::WriteBitsFromIntegerRange( const templateType value, const templateType minimum,const templateType maximum, bool allowOutsideRange )\n{\n\tint requiredBits=BYTES_TO_BITS(sizeof(templateType))-NumberOfLeadingZeroes(templateType(maximum-minimum));\n\tWriteBitsFromIntegerRange(value,minimum,maximum,requiredBits,allowOutsideRange);\n}\ntemplate <class templateType>\nvoid BitStream::WriteBitsFromIntegerRange( const templateType value, const templateType minimum,const templateType maximum, const int requiredBits, bool allowOutsideRange )\n{\n\tOVR_ASSERT(maximum>=minimum);\n\tOVR_ASSERT(allowOutsideRange==true || (value>=minimum && value<=maximum));\n\tif (allowOutsideRange)\n\t{\n\t\tif (value<minimum || value>maximum)\n\t\t{\n\t\t\tWrite(true);\n\t\t\tWrite(value);\n\t\t\treturn;\n\t\t}\n\t\tWrite(false);\n\t}\n\ttemplateType valueOffMin=value-minimum;\n\tif (IsBigEndian()==true)\n\t{\n\t\tunsigned char output[sizeof(templateType)];\n\t\tReverseBytes((unsigned char*)&valueOffMin, output, sizeof(templateType));\n\t\tWriteBits(output,requiredBits);\n\t}\n\telse\n\t{\n\t\tWriteBits((unsigned char*) &valueOffMin,requiredBits);\n\t}\n}\n\ntemplate <class templateType> // templateType for this function must be a float or double\nvoid BitStream::WriteNormVector( templateType x, templateType y, templateType z )\n{\n#ifdef _DEBUG\n\tOVR_ASSERT(x <= 1.01 && y <= 1.01 && z <= 1.01 && x >= -1.01 && y >= -1.01 && z >= -1.01);\n#endif\n\n\tWriteFloat16((float)x,-1.0f,1.0f);\n\tWriteFloat16((float)y,-1.0f,1.0f);\n\tWriteFloat16((float)z,-1.0f,1.0f);\n}\n\ntemplate <class templateType> // templateType for this function must be a float or double\nvoid BitStream::WriteVector( templateType x, templateType y, templateType z )\n{\n\ttemplateType magnitude = sqrt(x * x + y * y + z * z);\n\tWrite((float)magnitude);\n\tif (magnitude > 0.00001f)\n\t{\n\t\tWriteCompressed((float)(x/magnitude));\n\t\tWriteCompressed((float)(y/magnitude));\n\t\tWriteCompressed((float)(z/magnitude));\n\t\t//\tWrite((uint16_t)((x/magnitude+1.0f)*32767.5f));\n\t\t//\tWrite((uint16_t)((y/magnitude+1.0f)*32767.5f));\n\t\t//\tWrite((uint16_t)((z/magnitude+1.0f)*32767.5f));\n\t}\n}\n\ntemplate <class templateType> // templateType for this function must be a float or double\nvoid BitStream::WriteNormQuat( templateType w, templateType x, templateType y, templateType z)\n{\n\tWrite((bool)(w<0.0));\n\tWrite((bool)(x<0.0));\n\tWrite((bool)(y<0.0));\n\tWrite((bool)(z<0.0));\n\tWrite((uint16_t)(fabs(x)*65535.0));\n\tWrite((uint16_t)(fabs(y)*65535.0));\n\tWrite((uint16_t)(fabs(z)*65535.0));\n\t// Leave out w and calculate it on the target\n}\n\ntemplate <class templateType> // templateType for this function must be a float or double\nvoid BitStream::WriteOrthMatrix(\n\ttemplateType m00, templateType m01, templateType m02,\n\ttemplateType m10, templateType m11, templateType m12,\n\ttemplateType m20, templateType m21, templateType m22 )\n{\n\n\tdouble qw;\n\tdouble qx;\n\tdouble qy;\n\tdouble qz;\n\n\t// Convert matrix to quat\n\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/\n\tfloat sum;\n\tsum = 1 + m00 + m11 + m22;\n\tif (sum < 0.0f) sum=0.0f;\n\tqw = sqrt( sum  ) / 2;\n\tsum = 1 + m00 - m11 - m22;\n\tif (sum < 0.0f) sum=0.0f;\n\tqx = sqrt( sum  ) / 2;\n\tsum = 1 - m00 + m11 - m22;\n\tif (sum < 0.0f) sum=0.0f;\n\tqy = sqrt( sum  ) / 2;\n\tsum = 1 - m00 - m11 + m22;\n\tif (sum < 0.0f) sum=0.0f;\n\tqz = sqrt( sum  ) / 2;\n\tif (qw < 0.0) qw=0.0;\n\tif (qx < 0.0) qx=0.0;\n\tif (qy < 0.0) qy=0.0;\n\tif (qz < 0.0) qz=0.0;\n#ifdef OVR_OS_WIN32\n\tqx = _copysign( (double) qx, (double) (m21 - m12) );\n\tqy = _copysign( (double) qy, (double) (m02 - m20) );\n\tqz = _copysign( (double) qz, (double) (m10 - m01) );\n#else\n\tqx = copysign( (double) qx, (double) (m21 - m12) );\n\tqy = copysign( (double) qy, (double) (m02 - m20) );\n\tqz = copysign( (double) qz, (double) (m10 - m01) );\n#endif\n\n\tWriteNormQuat(qw,qx,qy,qz);\n}\n\ntemplate <class serializationType, class sourceType >\nbool BitStream::ReadCasted( sourceType &value )\n{\n\tserializationType val;\n\tbool success = Read(val);\n\tvalue=(sourceType) val;\n\treturn success;\n}\n\ntemplate <class templateType>\nbool BitStream::ReadBitsFromIntegerRange( templateType &value, const templateType minimum, const templateType maximum, bool allowOutsideRange )\n{\n\tint requiredBits=BYTES_TO_BITS(sizeof(templateType))-NumberOfLeadingZeroes(templateType(maximum-minimum));\n\treturn ReadBitsFromIntegerRange(value,minimum,maximum,requiredBits,allowOutsideRange);\n}\ntemplate <class templateType>\nbool BitStream::ReadBitsFromIntegerRange( templateType &value, const templateType minimum, const templateType maximum, const int requiredBits, bool allowOutsideRange )\n{\n\tOVR_ASSERT_AND_UNUSED(maximum>=minimum, maximum);\n\tif (allowOutsideRange)\n\t{\n\t\tbool isOutsideRange;\n\t\tRead(isOutsideRange);\n\t\tif (isOutsideRange)\n\t\t\treturn Read(value);\n\t}\n\tunsigned char output[sizeof(templateType)];\n\tmemset(output,0,sizeof(output));\n\tbool success = ReadBits(output,requiredBits);\n\tif (success)\n\t{\n\t\tif (IsBigEndian()==true)\n\t\t\tReverseBytesInPlace(output,sizeof(output));\n\t\tmemcpy(&value,output,sizeof(output));\n\n\t\tvalue+=minimum;\n\t}\n\n\treturn success;\n}\n\ntemplate <class templateType> // templateType for this function must be a float or double\nbool BitStream::ReadNormVector( templateType &x, templateType &y, templateType &z )\n{\n\tfloat xIn,yIn,zIn;\n\tReadFloat16(xIn,-1.0f,1.0f);\n\tReadFloat16(yIn,-1.0f,1.0f);\n\tReadFloat16(zIn,-1.0f,1.0f);\n\tx=xIn;\n\ty=yIn;\n\tz=zIn;\n\treturn true;\n}\n\ntemplate <class templateType> // templateType for this function must be a float or double\nbool BitStream::ReadVector( templateType &x, templateType &y, templateType &z )\n{\n\tfloat magnitude;\n\t//uint16_t sx,sy,sz;\n\tif (!Read(magnitude))\n\t\treturn false;\n\tif (magnitude>0.00001f)\n\t{\n\t\t//\tRead(sx);\n\t\t//\tRead(sy);\n\t\t//\tif (!Read(sz))\n\t\t//\t\treturn false;\n\t\t//\tx=((float)sx / 32767.5f - 1.0f) * magnitude;\n\t\t//\ty=((float)sy / 32767.5f - 1.0f) * magnitude;\n\t\t//\tz=((float)sz / 32767.5f - 1.0f) * magnitude;\n\t\tfloat cx=0.0f,cy=0.0f,cz=0.0f;\n\t\tReadCompressed(cx);\n\t\tReadCompressed(cy);\n\t\tif (!ReadCompressed(cz))\n\t\t\treturn false;\n\t\tx=cx;\n\t\ty=cy;\n\t\tz=cz;\n\t\tx*=magnitude;\n\t\ty*=magnitude;\n\t\tz*=magnitude;\n\t}\n\telse\n\t{\n\t\tx=0.0;\n\t\ty=0.0;\n\t\tz=0.0;\n\t}\n\treturn true;\n}\n\ntemplate <class templateType> // templateType for this function must be a float or double\nbool BitStream::ReadNormQuat( templateType &w, templateType &x, templateType &y, templateType &z)\n{\n\tbool cwNeg=false, cxNeg=false, cyNeg=false, czNeg=false;\n\tuint16_t cx,cy,cz;\n\tRead(cwNeg);\n\tRead(cxNeg);\n\tRead(cyNeg);\n\tRead(czNeg);\n\tRead(cx);\n\tRead(cy);\n\tif (!Read(cz))\n\t\treturn false;\n\n\t// Calculate w from x,y,z\n\tx=(templateType)(cx/65535.0);\n\ty=(templateType)(cy/65535.0);\n\tz=(templateType)(cz/65535.0);\n\tif (cxNeg) x=-x;\n\tif (cyNeg) y=-y;\n\tif (czNeg) z=-z;\n\tfloat difference = 1.0f - x*x - y*y - z*z;\n\tif (difference < 0.0f)\n\t\tdifference=0.0f;\n\tw = (templateType)(sqrt(difference));\n\tif (cwNeg)\n\t\tw=-w;\n\n\treturn true;\n}\n\ntemplate <class templateType> // templateType for this function must be a float or double\nbool BitStream::ReadOrthMatrix(\n\ttemplateType &m00, templateType &m01, templateType &m02,\n\ttemplateType &m10, templateType &m11, templateType &m12,\n\ttemplateType &m20, templateType &m21, templateType &m22 )\n{\n\tfloat qw,qx,qy,qz;\n\tif (!ReadNormQuat(qw,qx,qy,qz))\n\t\treturn false;\n\n\t// Quat to orthogonal rotation matrix\n\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/index.htm\n\tdouble sqw = (double)qw*(double)qw;\n\tdouble sqx = (double)qx*(double)qx;\n\tdouble sqy = (double)qy*(double)qy;\n\tdouble sqz = (double)qz*(double)qz;\n\tm00 =  (templateType)(sqx - sqy - sqz + sqw); // since sqw + sqx + sqy + sqz =1\n\tm11 = (templateType)(-sqx + sqy - sqz + sqw);\n\tm22 = (templateType)(-sqx - sqy + sqz + sqw);\n\n\tdouble tmp1 = (double)qx*(double)qy;\n\tdouble tmp2 = (double)qz*(double)qw;\n\tm10 = (templateType)(2.0 * (tmp1 + tmp2));\n\tm01 = (templateType)(2.0 * (tmp1 - tmp2));\n\n\ttmp1 = (double)qx*(double)qz;\n\ttmp2 = (double)qy*(double)qw;\n\tm20 =(templateType)(2.0 * (tmp1 - tmp2));\n\tm02 = (templateType)(2.0 * (tmp1 + tmp2));\n\ttmp1 = (double)qy*(double)qz;\n\ttmp2 = (double)qx*(double)qw;\n\tm21 = (templateType)(2.0 * (tmp1 + tmp2));\n\tm12 = (templateType)(2.0 * (tmp1 - tmp2));\n\n\treturn true;\n}\n\ntemplate <class templateType>\nBitStream& operator<<(BitStream& out, templateType& c)\n{\n\tout.Write(c);\n\treturn out;\n}\ntemplate <class templateType>\nBitStream& operator>>(BitStream& in, templateType& c)\n{\n\tbool success = in.Read(c);\n\t(void)success;\n\n\tOVR_ASSERT(success);\n\treturn in;\n}\n\n\n}} // OVR::Net\n\n#if defined(OVR_CC_MSVC)\n#pragma warning(pop)\n#endif\n\n#endif\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Net/OVR_MessageIDTypes.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_MessageIDTypes.h\nContent     :   Enumeration list indicating what type of message is being sent\nCreated     :   July 3, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\nnamespace OVR { namespace Net {\n\n/// First byte of a network message\ntypedef unsigned char MessageID;\n\nenum DefaultMessageIDTypes\n{\n    OVRID_RPC1,\n    OVRID_END = 128,\n    OVRID_LATENCY_TESTER_1,\n};\n\n}} // namespace OVR::Net\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Net/OVR_NetworkPlugin.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_NetworkPlugin.cpp\nContent     :   Base class for an extension to the network objects.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_NetworkPlugin.h\"\n\nnamespace OVR { namespace Net { namespace Plugins {\n\n\n//-----------------------------------------------------------------------------\n// Plugin identifier to assign next\n\n//static uint8_t pluginIdNext = 0;\n\n\n//-----------------------------------------------------------------------------\n// NetworkPlugin\n\nNetworkPlugin::NetworkPlugin()\n{\n\tpSession = 0;\n\t//PluginId = pluginIdNext++;\n}\n\nNetworkPlugin::~NetworkPlugin()\n{\n}\n\nvoid NetworkPlugin::OnAddedToSession(Session* _pSession)\n{\n\tif (pSession != 0)\n\t{\n\t\tpSession->RemoveSessionListener(this);\n\t}\n\n\tpSession = _pSession;\n}\n\nvoid NetworkPlugin::OnRemovedFromSession(Session* _pSession)\n{\n\tOVR_UNUSED(_pSession);\n\tOVR_ASSERT(_pSession == pSession);\n\n\tpSession = 0;\n}\n\n\n}}} // OVR::Net::Plugins\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Net/OVR_NetworkPlugin.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_NetworkPlugin.h\nContent     :   Base class for an extension to the network objects.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_NetworkPlugin_h\n#define OVR_NetworkPlugin_h\n\n#include \"OVR_Session.h\"\n\nnamespace OVR { namespace Net { namespace Plugins {\n\n\n//-----------------------------------------------------------------------------\n// NetworkPlugin\n\n// NetworkPlugins use Session and SessionListener to provide network functionality\n// independent of the transport medium.\n// Uses the chain of command design pattern such that plugins can invoke or intercept\n// network events via the Session.\nclass NetworkPlugin : public SessionListener\n{\npublic:\n\tNetworkPlugin();\n\tvirtual ~NetworkPlugin();\n\nprotected:\n\tvirtual void OnAddedToSession(Session* _pSession);\n\tvirtual void OnRemovedFromSession(Session* _pSession);\n\n\tSession *pSession;\n\t//uint8_t PluginId;\n};\n\n\n}}} // OVR::Net::Plugins\n\n#endif\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Net/OVR_NetworkTypes.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_NetworkTypes.h\nContent     :   Shared header for network types\nCreated     :   June 12, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_NetworkTypes_h\n#define OVR_NetworkTypes_h\n\n#include \"Kernel/OVR_Types.h\"\n\nnamespace OVR {\tnamespace Net {\n\n\ntypedef uint64_t NetworkID;\nconst NetworkID InvalidNetworkID = ~((NetworkID)0);\n\n\n} } // OVR::Net\n\n#endif\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Net/OVR_PacketizedTCPSocket.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_PacketizedTCPSocket.cpp\nContent     :   TCP with automated message framing.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_PacketizedTCPSocket.h\"\n\nnamespace OVR { namespace Net {\n\n\n//-----------------------------------------------------------------------------\n// Constants\n\nstatic const int LENGTH_FIELD_BYTES = 4;\n\n\n//-----------------------------------------------------------------------------\n// PacketizedTCPSocket\n\nPacketizedTCPSocket::PacketizedTCPSocket()\n{\n\tpRecvBuff = 0;\n\tpRecvBuffSize = 0;\n\tTransport = TransportType_PacketizedTCP;\n}\n\nPacketizedTCPSocket::PacketizedTCPSocket(SocketHandle _sock, bool isListenSocket) : PacketizedTCPSocketBase(_sock, isListenSocket)\n{\n\tpRecvBuff = 0;\n\tpRecvBuffSize = 0;\n\tTransport = TransportType_PacketizedTCP;\n}\n\nPacketizedTCPSocket::~PacketizedTCPSocket()\n{\n\tOVR_FREE(pRecvBuff);\n}\n\nint PacketizedTCPSocket::Send(const void* pData, int bytes)\n{\n    Lock::Locker locker(&sendLock);\n\n\tif (bytes <= 0)\n\t{\n\t\treturn -1;\n\t}\n\n\t// Convert length to 4 endian-neutral bytes\n\tuint32_t lengthWord = bytes;\n\tuint8_t lengthBytes[LENGTH_FIELD_BYTES] = {\n\t\t(uint8_t)lengthWord,\n\t\t(uint8_t)(lengthWord >> 8),\n\t\t(uint8_t)(lengthWord >> 16),\n\t\t(uint8_t)(lengthWord >> 24)\n\t};\n\n\tint s = PacketizedTCPSocketBase::Send(lengthBytes, LENGTH_FIELD_BYTES);\n\tif (s > 0)\n\t{\n\t\treturn PacketizedTCPSocketBase::Send(pData,bytes);\n\t}\n\telse\n\t{\n\t\treturn s;\n\t}\n}\n\nint PacketizedTCPSocket::SendAndConcatenate(const void** pDataArray, int* dataLengthArray, int arrayCount)\n{\n    Lock::Locker locker(&sendLock);\n\n    if (arrayCount == 0)\n\t\treturn 0;\n\n\tint totalBytes = 0;\n\tfor (int i = 0; i < arrayCount; i++)\n\t\ttotalBytes += dataLengthArray[i];\n\n\t// Convert length to 4 endian-neutral bytes\n\tuint32_t lengthWord = totalBytes;\n\tuint8_t lengthBytes[LENGTH_FIELD_BYTES] = {\n\t\t(uint8_t)lengthWord,\n\t\t(uint8_t)(lengthWord >> 8),\n\t\t(uint8_t)(lengthWord >> 16),\n\t\t(uint8_t)(lengthWord >> 24)\n\t};\n\n\tint s = PacketizedTCPSocketBase::Send(lengthBytes, LENGTH_FIELD_BYTES);\n\tif (s > 0)\n\t{\n\t\tfor (int i = 0; i < arrayCount; i++)\n\t\t{\n\t\t\tPacketizedTCPSocketBase::Send(pDataArray[i], dataLengthArray[i]);\n\t\t}\n\t}\n\n\treturn s;\n}\n\nvoid PacketizedTCPSocket::OnRecv(SocketEvent_TCP* eventHandler, uint8_t* pData, int bytesRead)\n{\n\tuint8_t* dataSource = NULL;\n\tint dataSourceSize = 0;\n\n\trecvBuffLock.DoLock();\n\n\tif (pRecvBuff == NULL)\n\t{\n\t\tdataSource = pData;\n\t\tdataSourceSize = bytesRead;\n\t}\n\telse\n\t{\n\t\tuint8_t* pRecvBuffNew = (uint8_t*)OVR_REALLOC(pRecvBuff, bytesRead + pRecvBuffSize);\n\t\tif (!pRecvBuffNew)\n\t\t{\n\t\t\tOVR_FREE(pRecvBuff);\n\t\t\tpRecvBuff = NULL;\n\t\t\tpRecvBuffSize = 0;\n\t\t\trecvBuffLock.Unlock();\n\t\t\treturn;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tpRecvBuff = pRecvBuffNew;\n\n\t\t\tmemcpy(pRecvBuff + pRecvBuffSize, pData, bytesRead);\n\n\t\t\tdataSourceSize = pRecvBuffSize + bytesRead;\n\t\t\tdataSource = pRecvBuff;\n\t\t}\n\t}\n\n\tint bytesReadFromStream;\n\twhile (bytesReadFromStream = BytesFromStream(dataSource, dataSourceSize),\n\t\t   LENGTH_FIELD_BYTES + bytesReadFromStream <= dataSourceSize)\n\t{\n\t\tdataSource += LENGTH_FIELD_BYTES;\n\t\tdataSourceSize -= LENGTH_FIELD_BYTES;\n\n\t\tTCPSocket::OnRecv(eventHandler, dataSource, bytesReadFromStream);\n\n\t\tdataSource += bytesReadFromStream;\n\t\tdataSourceSize -= bytesReadFromStream;\n\t}\n\n\tif (dataSourceSize > 0)\n\t{\n        if (dataSource != NULL)\n        {\n            if (pRecvBuff == NULL)\n            {\n                pRecvBuff = (uint8_t*)OVR_ALLOC(dataSourceSize);\n                if (!pRecvBuff)\n                {\n                    pRecvBuffSize = 0;\n                    recvBuffLock.Unlock();\n                    return;\n                }\n                else\n                {\n                    memcpy(pRecvBuff, dataSource, dataSourceSize);\n                }\n            }\n            else\n            {\n                memmove(pRecvBuff, dataSource, dataSourceSize);\n            }\n        }\n\t}\n\telse\n\t{\n\t\tif (pRecvBuff != NULL)\n\t\t\tOVR_FREE(pRecvBuff);\n\n\t\tpRecvBuff = NULL;\n\t}\n\tpRecvBuffSize = dataSourceSize;\n\n\trecvBuffLock.Unlock();\n}\n\nint PacketizedTCPSocket::BytesFromStream(uint8_t* pData, int bytesRead)\n{\n\tif (pData != 0 && bytesRead >= LENGTH_FIELD_BYTES)\n\t{\n\t\treturn pData[0] | ((uint32_t)pData[1] << 8) | ((uint32_t)pData[2] << 16) | ((uint32_t)pData[3] << 24);\n\t}\n\n\treturn 0;\n}\n\n\n}} // OVR::Net\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Net/OVR_PacketizedTCPSocket.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_PacketizedTCPSocket.cpp\nContent     :   TCP with automated message framing.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_PacketizedTCPSocket_h\n#define OVR_PacketizedTCPSocket_h\n\n#include \"OVR_Socket.h\"\n#include \"Kernel/OVR_Allocator.h\"\n#include \"Kernel/OVR_Atomic.h\"\n\n#ifdef OVR_OS_WIN32\n#include \"OVR_Win32_Socket.h\"\n#else\n#include \"OVR_Unix_Socket.h\"\n#endif\n\nnamespace OVR { namespace Net {\n\n\n//-----------------------------------------------------------------------------\n// NetworkPlugin\n\n// Packetized TCP base socket\nclass PacketizedTCPSocketBase : public TCPSocket\n{\npublic:\n\tPacketizedTCPSocketBase() {}\n\tPacketizedTCPSocketBase(SocketHandle _sock, bool isListenSocket) : TCPSocket(_sock, isListenSocket) {}\n};\n\n\n//-----------------------------------------------------------------------------\n// PacketizedTCPSocket\n\n// Uses TCP but is message aligned rather than stream aligned\n// Alternative to reliable UDP\nclass PacketizedTCPSocket : public PacketizedTCPSocketBase\n{\npublic:\n\tPacketizedTCPSocket();\n\tPacketizedTCPSocket(SocketHandle _sock, bool isListenSocket);\n\tvirtual ~PacketizedTCPSocket();\n\npublic:\n\tvirtual int Send(const void* pData, int bytes);\n\tvirtual int SendAndConcatenate(const void** pDataArray, int *dataLengthArray, int arrayCount);\n\nprotected:\n\tvirtual void OnRecv(SocketEvent_TCP* eventHandler, uint8_t* pData, int bytesRead);\n\n\tint BytesFromStream(uint8_t* pData, int bytesRead);\n\n    Lock   sendLock;\n    Lock   recvBuffLock;\n\n\tuint8_t* pRecvBuff;     // Queued receive buffered data\n\tint    pRecvBuffSize; // Size of receive queue in bytes\n};\n\n\n}} // OVR::Net\n\n#endif\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Net/OVR_RPC1.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_RPC1.cpp\nContent     :   A network plugin that provides remote procedure call functionality.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_RPC1.h\"\n#include \"OVR_BitStream.h\"\n#include \"Kernel/OVR_Threads.h\" // Thread::MSleep\n#include \"OVR_MessageIDTypes.h\"\n\nnamespace OVR { namespace Net { namespace Plugins {\n\n\n//-----------------------------------------------------------------------------\n// Types\n\nenum {\n\tID_RPC4_SIGNAL,\n\tCALL_BLOCKING,\n\tRPC_ERROR_FUNCTION_NOT_REGISTERED,\n\tID_RPC4_RETURN,\n};\n\n\n//-----------------------------------------------------------------------------\n// RPC1\n\nRPC1::RPC1()\n{\n\tblockingOnThisConnection = 0;\n\tblockingReturnValue = new BitStream();\n}\n\nRPC1::~RPC1()\n{\n\tdelete blockingReturnValue;\n}\n\nvoid RPC1::RegisterSlot(OVR::String sharedIdentifier,  OVR::CallbackListener<RPCSlot>* rpcSlotObserver)\n{\n    slotHash.AddListener(sharedIdentifier, rpcSlotObserver);\n}\n\nbool RPC1::RegisterBlockingFunction(OVR::String uniqueID, RPCDelegate blockingFunction)\n{\n\tif (registeredBlockingFunctions.Get(uniqueID))\n\t\treturn false;\n\n\tregisteredBlockingFunctions.Set(uniqueID, blockingFunction);\n\treturn true;\n}\n\nvoid RPC1::UnregisterBlockingFunction(OVR::String uniqueID)\n{\n\tregisteredBlockingFunctions.Remove(uniqueID);\n}\n\nbool RPC1::CallBlocking( OVR::String uniqueID, OVR::Net::BitStream* bitStream, Ptr<Connection> pConnection, OVR::Net::BitStream* returnData )\n{\n    // If invalid parameters,\n    if (!pConnection)\n    {\n        // Note: This may happen if the endpoint disconnects just before the call\n        return false;\n    }\n\n\tOVR::Net::BitStream out;\n\tout.Write((MessageID) OVRID_RPC1);\n\tout.Write((MessageID) CALL_BLOCKING);\n\tout.Write(uniqueID);\n\tif (bitStream)\n\t{\n\t\tbitStream->ResetReadPointer();\n\t\tout.AlignWriteToByteBoundary();\n\t\tout.Write(bitStream);\n\t}\n\n\tSendParameters sp(pConnection, out.GetData(), out.GetNumberOfBytesUsed());\n\n    if (returnData)\n    {\n        returnData->Reset();\n    }\n\n    // Only one thread call at a time\n    Lock::Locker singleRPCLocker(&singleRPCLock);\n\n    // Note this does not prevent multiple calls at a time because .Wait will unlock it below.\n    // The purpose of this mutex is to synchronize the polling thread and this one, not prevent\n    // multiple threads from invoking RPC.\n    Mutex::Locker locker(&callBlockingMutex);\n\n    blockingReturnValue->Reset();\n    blockingOnThisConnection = pConnection;\n\n    int bytesSent = pSession->Send(&sp);\n    if (bytesSent == sp.Bytes)\n    {\n        while (blockingOnThisConnection == pConnection)\n        {\n            callBlockingWait.Wait(&callBlockingMutex);\n        }\n    }\n\telse\n\t{\n\t\treturn false;\n\t}\n\n    if (returnData)\n    {\n        returnData->Write(blockingReturnValue);\n        returnData->ResetReadPointer();\n    }\n\n\treturn true;\n}\n\nbool RPC1::Signal(OVR::String sharedIdentifier, OVR::Net::BitStream* bitStream, Ptr<Connection> pConnection)\n{\n\tOVR::Net::BitStream out;\n\tout.Write((MessageID) OVRID_RPC1);\n\tout.Write((MessageID) ID_RPC4_SIGNAL);\n\t//out.Write(PluginId);\n\tout.Write(sharedIdentifier);\n\tif (bitStream)\n\t{\n\t\tbitStream->ResetReadPointer();\n\t\tout.AlignWriteToByteBoundary();\n\t\tout.Write(bitStream);\n\t}\n\tSendParameters sp(pConnection, out.GetData(), out.GetNumberOfBytesUsed());\n\tint32_t bytesSent = pSession->Send(&sp);\n\treturn bytesSent == sp.Bytes;\n}\nvoid RPC1::BroadcastSignal(OVR::String sharedIdentifier, OVR::Net::BitStream* bitStream)\n{\n    OVR::Net::BitStream out;\n    out.Write((MessageID) OVRID_RPC1);\n    out.Write((MessageID) ID_RPC4_SIGNAL);\n    //out.Write(PluginId);\n    out.Write(sharedIdentifier);\n    if (bitStream)\n    {\n        bitStream->ResetReadPointer();\n        out.AlignWriteToByteBoundary();\n        out.Write(bitStream);\n    }\n    BroadcastParameters p(out.GetData(), out.GetNumberOfBytesUsed());\n    pSession->Broadcast(&p);\n}\nvoid RPC1::OnReceive(ReceivePayload *pPayload, ListenerReceiveResult *lrrOut)\n{\n\tOVR_UNUSED(lrrOut);\n\n    if (pPayload->pData[0] == OVRID_RPC1)\n    {\n\t\tOVR_ASSERT(pPayload->Bytes >= 2);\n\n\t\tOVR::Net::BitStream bsIn((char*)pPayload->pData, pPayload->Bytes, false);\n\t\tbsIn.IgnoreBytes(2);\n\n        if (pPayload->pData[1] == RPC_ERROR_FUNCTION_NOT_REGISTERED)\n        {\n            Mutex::Locker locker(&callBlockingMutex);\n\n            blockingReturnValue->Reset();\n            blockingOnThisConnection = 0;\n            callBlockingWait.NotifyAll();\n        }\n        else if (pPayload->pData[1] == ID_RPC4_RETURN)\n        {\n            Mutex::Locker locker(&callBlockingMutex);\n\n            blockingReturnValue->Reset();\n\t\t\tblockingReturnValue->Write(bsIn);\n            blockingOnThisConnection = 0;\n            callBlockingWait.NotifyAll();\n\t\t}\n        else if (pPayload->pData[1] == CALL_BLOCKING)\n        {\n\t\t\tOVR::String uniqueId;\n\t\t\tbsIn.Read(uniqueId);\n\n\t\t\tRPCDelegate *bf = registeredBlockingFunctions.Get(uniqueId);\n\t\t\tif (bf==0)\n\t\t\t{\n\t\t\t\tOVR::Net::BitStream bsOut;\n\t\t\t\tbsOut.Write((unsigned char) OVRID_RPC1);\n\t\t\t\tbsOut.Write((unsigned char) RPC_ERROR_FUNCTION_NOT_REGISTERED);\n\n\t\t\t\tSendParameters sp(pPayload->pConnection, bsOut.GetData(), bsOut.GetNumberOfBytesUsed());\n\t\t\t\tpSession->Send(&sp);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tOVR::Net::BitStream returnData;\n\t\t\tbsIn.AlignReadToByteBoundary();\n\t\t\t(*bf)(&bsIn, &returnData, pPayload);\n\n\t\t\tOVR::Net::BitStream out;\n\t\t\tout.Write((MessageID) OVRID_RPC1);\n\t\t\tout.Write((MessageID) ID_RPC4_RETURN);\n\t\t\treturnData.ResetReadPointer();\n\t\t\tout.AlignWriteToByteBoundary();\n\t\t\tout.Write(returnData);\n\n\t\t\tSendParameters sp(pPayload->pConnection, out.GetData(), out.GetNumberOfBytesUsed());\n\t\t\tpSession->Send(&sp);\n\t\t}\n\t\telse if (pPayload->pData[1]==ID_RPC4_SIGNAL)\n\t\t{\n\t\t\tOVR::String sharedIdentifier;\n\t\t\tbsIn.Read(sharedIdentifier);\n\n\t\t\tCallbackEmitter<RPCSlot>* o = slotHash.GetKey(sharedIdentifier);\n\n\t\t\tif (o)\n\t\t\t{\n\t\t\t\tbsIn.AlignReadToByteBoundary();\n\n\t\t\t\tOVR::Net::BitStream serializedParameters(bsIn.GetData() + bsIn.GetReadOffset()/8, bsIn.GetNumberOfUnreadBits()/8, false);\n\n\t\t\t\to->Call(&serializedParameters, pPayload);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid RPC1::OnDisconnected(Connection* conn)\n{\n    if (blockingOnThisConnection == conn)\n    {\n        blockingOnThisConnection = 0;\n        callBlockingWait.NotifyAll();\n    }\n}\n\nvoid RPC1::OnConnected(Connection* conn)\n{\n    OVR_UNUSED(conn);\n}\n\n\n}}} // OVR::Net::Plugins\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Net/OVR_RPC1.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_RPC1.h\nContent     :   A network plugin that provides remote procedure call functionality.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Net_RPC_h\n#define OVR_Net_RPC_h\n\n#include \"OVR_NetworkPlugin.h\"\n#include \"Kernel/OVR_Hash.h\"\n#include \"Kernel/OVR_String.h\"\n#include \"OVR_BitStream.h\"\n#include \"Kernel/OVR_Threads.h\"\n#include \"Kernel/OVR_Delegates.h\"\n#include \"Kernel/OVR_Callbacks.h\"\n\nnamespace OVR { namespace Net { namespace Plugins {\n\n\ntypedef Delegate3<void, BitStream*, BitStream*, ReceivePayload*> RPCDelegate;\ntypedef Delegate2<void, BitStream*, ReceivePayload*> RPCSlot;\n// typedef void ( *Slot ) ( OVR::Net::BitStream *userData, OVR::Net::ReceivePayload *pPayload );\n\n/// NetworkPlugin that maps strings to function pointers. Can invoke the functions using blocking calls with return values, or signal/slots. Networked parameters serialized with BitStream\nclass RPC1 : public NetworkPlugin, public NewOverrideBase\n{\npublic:\n\tRPC1();\n\tvirtual ~RPC1();\n\n\t/// Register a slot, which is a function pointer to one or more implementations that supports this function signature\n\t/// When a signal occurs, all slots with the same identifier are called.\n\t/// \\param[in] sharedIdentifier A string to identify the slot. Recommended to be the same as the name of the function.\n\t/// \\param[in] functionPtr Pointer to the function.\n\t/// \\param[in] callPriority Slots are called by order of the highest callPriority first. For slots with the same priority, they are called in the order they are registered\n\tvoid RegisterSlot(OVR::String sharedIdentifier,  CallbackListener<RPCSlot>* rpcSlotListener);\n\n\t/// \\brief Same as \\a RegisterFunction, but is called with CallBlocking() instead of Call() and returns a value to the caller\n\tbool RegisterBlockingFunction(OVR::String uniqueID, RPCDelegate blockingFunction);\n\n\t/// \\brief Same as UnregisterFunction, except for a blocking function\n\tvoid UnregisterBlockingFunction(OVR::String uniqueID);\n\n\t// \\brief Same as call, but don't return until the remote system replies.\n\t/// Broadcasting parameter does not exist, this can only call one remote system\n\t/// \\note This function does not return until the remote system responds, disconnects, or was never connected to begin with\n\t/// \\param[in] Identifier originally passed to RegisterBlockingFunction() on the remote system(s)\n\t/// \\param[in] bitStream bitStream encoded data to send to the function callback\n\t/// \\param[in] pConnection connection to send on\n\t/// \\param[out] returnData Written to by the function registered with RegisterBlockingFunction.\n\t/// \\return true if successfully called. False on disconnect, function not registered, or not connected to begin with\n\tbool CallBlocking( OVR::String uniqueID, OVR::Net::BitStream * bitStream, Ptr<Connection> pConnection, OVR::Net::BitStream *returnData = NULL );\n\n\t/// Calls zero or more functions identified by sharedIdentifier registered with RegisterSlot()\n\t/// \\param[in] sharedIdentifier parameter of the same name passed to RegisterSlot() on the remote system\n\t/// \\param[in] bitStream bitStream encoded data to send to the function callback\n\t/// \\param[in] pConnection connection to send on\n\tbool Signal(OVR::String sharedIdentifier, OVR::Net::BitStream * bitStream, Ptr<Connection> pConnection);\n    void BroadcastSignal(OVR::String sharedIdentifier, OVR::Net::BitStream * bitStream);\n\n\nprotected:\n\tvirtual void OnReceive(ReceivePayload *pPayload, ListenerReceiveResult *lrrOut);\n\n    virtual void OnDisconnected(Connection* conn);\n    virtual void OnConnected(Connection* conn);\n\n\tHash< String, RPCDelegate, String::HashFunctor > registeredBlockingFunctions;\n\n\tCallbackHash< RPCSlot > slotHash;\n\n    // Synchronization for RPC caller\n    Lock            singleRPCLock;\n    Mutex           callBlockingMutex;\n    WaitCondition   callBlockingWait;\n\n    Net::BitStream* blockingReturnValue;\n\tPtr<Connection> blockingOnThisConnection;\n};\n\n\n}}} // OVR::Net::Plugins\n\n#endif // OVR_Net_RPC_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Net/OVR_Session.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Session.h\nContent     :   One network session that provides connection/disconnection events.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_Session.h\"\n#include \"OVR_PacketizedTCPSocket.h\"\n#include \"Kernel/OVR_Log.h\"\n#include \"Service/Service_NetSessionCommon.h\"\n\nnamespace OVR { namespace Net {\n\n\n// The SDK version requested by the user.\nSDKVersion RuntimeSDKVersion;\n\n\n//-----------------------------------------------------------------------------\n// Protocol\n\nstatic const char* OfficialHelloString      = \"OculusVR_Hello\";\nstatic const char* OfficialAuthorizedString = \"OculusVR_Authorized\";\n\nbool RPC_C2S_Hello::Serialize(bool writeToBitstream, Net::BitStream* bs)\n{\n    bs->Serialize(writeToBitstream, HelloString);\n    bs->Serialize(writeToBitstream, MajorVersion);\n    bs->Serialize(writeToBitstream, MinorVersion);\n    if (!bs->Serialize(writeToBitstream, PatchVersion))\n        return false;\n\n    // If an older client is connecting to us,\n    if (!writeToBitstream && (MajorVersion * 100) + (MinorVersion * 10) + PatchVersion < 121)\n    {\n        // The following was version code was added to RPC version 1.2\n        // without bumping it up to 1.3 and introducing an incompatibility.\n        // We can do this because an older server will not read this additional data.\n        return true;\n    }\n\n    bs->Serialize(writeToBitstream, CodeVersion.ProductVersion);\n    bs->Serialize(writeToBitstream, CodeVersion.MajorVersion);\n    bs->Serialize(writeToBitstream, CodeVersion.MinorVersion);\n    bs->Serialize(writeToBitstream, CodeVersion.RequestedMinorVersion);\n    bs->Serialize(writeToBitstream, CodeVersion.PatchVersion);\n    bs->Serialize(writeToBitstream, CodeVersion.BuildNumber);\n    return bs->Serialize(writeToBitstream, CodeVersion.FeatureVersion);\n}\n\nvoid RPC_C2S_Hello::ClientGenerate(Net::BitStream* bs)\n{\n    RPC_C2S_Hello hello;\n    hello.HelloString  = OfficialHelloString;\n    hello.MajorVersion = RPCVersion_Major;\n    hello.MinorVersion = RPCVersion_Minor;\n    hello.PatchVersion = RPCVersion_Patch;\n    OVR_ASSERT(OVR::Net::RuntimeSDKVersion.ProductVersion != UINT16_MAX);\n    hello.CodeVersion = OVR::Net::RuntimeSDKVersion; // This should have been set to a value earlier in the first steps of ovr initialization.\n    hello.Serialize(true, bs);\n}\n\nbool RPC_C2S_Hello::ServerValidate()\n{\n    // Server checks the protocol version\n    return MajorVersion == RPCVersion_Major &&\n           MinorVersion <= RPCVersion_Minor &&\n           HelloString.CompareNoCase(OfficialHelloString) == 0;\n}\n\nbool RPC_S2C_Authorization::Serialize(bool writeToBitstream, Net::BitStream* bs)\n{\n    bs->Serialize(writeToBitstream, AuthString);\n    bs->Serialize(writeToBitstream, MajorVersion);\n    bs->Serialize(writeToBitstream, MinorVersion);\n    if (!bs->Serialize(writeToBitstream, PatchVersion))\n        return false;\n\n    // If an older client is connecting to us,\n    if (!writeToBitstream && (MajorVersion * 100) + (MinorVersion * 10) + PatchVersion < 121)\n    {\n        // The following was version code was added to RPC version 1.2\n        // without bumping it up to 1.3 and introducing an incompatibility.\n        // We can do this because an older server will not read this additional data.\n        return true;\n    }\n\n    bs->Serialize(writeToBitstream, CodeVersion.ProductVersion);\n    bs->Serialize(writeToBitstream, CodeVersion.MajorVersion);\n    bs->Serialize(writeToBitstream, CodeVersion.MinorVersion);\n    bs->Serialize(writeToBitstream, CodeVersion.RequestedMinorVersion);\n    bs->Serialize(writeToBitstream, CodeVersion.PatchVersion);\n    bs->Serialize(writeToBitstream, CodeVersion.BuildNumber);\n    return bs->Serialize(writeToBitstream, CodeVersion.FeatureVersion);\n}\n\nvoid RPC_S2C_Authorization::ServerGenerate(Net::BitStream* bs, String errorString)\n{\n    RPC_S2C_Authorization auth;\n    if (errorString.IsEmpty())\n    {\n        auth.AuthString = OfficialAuthorizedString;\n    }\n    else\n    {\n        auth.AuthString = errorString;\n    }\n    auth.MajorVersion = RPCVersion_Major;\n    auth.MinorVersion = RPCVersion_Minor;\n    auth.PatchVersion = RPCVersion_Patch;\n    // Leave CurrentSDKVersion as it is.\n    auth.Serialize(true, bs);\n}\n\nbool RPC_S2C_Authorization::ClientValidate()\n{\n    return AuthString.CompareNoCase(OfficialAuthorizedString) == 0;\n}\n\n\n//-----------------------------------------------------------------------------\n// SingleProcess\n\nstatic bool SingleProcess = false;\n\nvoid Session::SetSingleProcess(bool enable)\n{\n    SingleProcess = enable;\n}\n\nbool Session::IsSingleProcess()\n{\n    return SingleProcess;\n}\n\n\n//-----------------------------------------------------------------------------\n// Session\n\nvoid Session::Shutdown()\n{\n    {\n        Lock::Locker locker(&SocketListenersLock);\n\n        const int count = SocketListeners.GetSizeI();\n        for (int i = 0; i < count; ++i)\n        {\n            SocketListeners[i]->Close();\n        }\n    }\n\n    Lock::Locker locker(&ConnectionsLock);\n\n    const int count = AllConnections.GetSizeI();\n    for (int i = 0; i < count; ++i)\n    {\n        Connection* arrayItem = AllConnections[i].GetPtr();\n\n        if (arrayItem->Transport == TransportType_PacketizedTCP)\n        {\n            PacketizedTCPConnection* ptcp = (PacketizedTCPConnection*)arrayItem;\n\n            ptcp->pSocket->Close();\n        }\n    }\n}\n\nSessionResult Session::Listen(ListenerDescription* pListenerDescription)\n{\n    if (pListenerDescription->Transport == TransportType_PacketizedTCP)\n    {\n        BerkleyListenerDescription* bld = (BerkleyListenerDescription*)pListenerDescription;\n        TCPSocket* tcpSocket = (TCPSocket*)bld->BoundSocketToListenWith.GetPtr();\n\n        if (tcpSocket->Listen() < 0)\n        {\n            return SessionResult_ListenFailure;\n        }\n\n        Lock::Locker locker(&SocketListenersLock);\n        SocketListeners.PushBack(tcpSocket);\n    }\n    else\n    {\n        OVR_ASSERT(false);\n    }\n\n    return SessionResult_OK;\n}\n\nSessionResult Session::Connect(ConnectParameters *cp)\n{\n    if (cp->Transport == TransportType_PacketizedTCP)\n    {\n        ConnectParametersBerkleySocket* cp2 = (ConnectParametersBerkleySocket*)cp;\n        Ptr<PacketizedTCPConnection> c;\n\n        {\n            Lock::Locker locker(&ConnectionsLock);\n\n            int connIndex;\n            Ptr<PacketizedTCPConnection> conn = findConnectionBySocket(AllConnections, cp2->BoundSocketToConnectWith, &connIndex);\n            if (conn)\n            {\n                return SessionResult_AlreadyConnected;\n            }\n\n            // If we are already connected, don't create a duplicate connection\n            if (FullConnections.GetSizeI() > 0)\n            {\n                return SessionResult_AlreadyConnected;\n            }\n\n            // If we are already connecting, don't create a duplicate connection\n            const int count = AllConnections.GetSizeI();\n            for (int i = 0; i < count; ++i)\n            {\n                Connection* arrayItem = AllConnections[i].GetPtr();\n\n                OVR_ASSERT(arrayItem);\n                if (arrayItem) {\n                    if (arrayItem->State == Client_ConnectedWait\n                        || arrayItem->State == Client_Connecting)\n                    {\n                        return SessionResult_ConnectInProgress;\n                    }\n                }\n            }\n\n            TCPSocketBase* tcpSock = (TCPSocketBase*)cp2->BoundSocketToConnectWith.GetPtr();\n\n            int ret = tcpSock->Connect(&cp2->RemoteAddress);\n            if (ret < 0)\n            {\n                return SessionResult_ConnectFailure;\n            }\n\n            Ptr<Connection> newConnection = AllocConnection(cp2->Transport);\n            if (!newConnection)\n            {\n                return SessionResult_ConnectFailure;\n            }\n\n            c = (PacketizedTCPConnection*)newConnection.GetPtr();\n            c->pSocket = (TCPSocket*) cp2->BoundSocketToConnectWith.GetPtr();\n            c->Address = cp2->RemoteAddress;\n            c->Transport = cp2->Transport;\n            c->SetState(Client_Connecting);\n\n            AllConnections.PushBack(c);\n        }\n\n        if (cp2->Blocking)\n        {\n            c->WaitOnConnecting();\n        }\n\n        EConnectionState state = c->State;\n        if (state == State_Connected)\n        {\n            return SessionResult_OK;\n        }\n        else if (state == Client_Connecting)\n        {\n            return SessionResult_ConnectInProgress;\n        }\n        else\n        {\n            return SessionResult_ConnectFailure;\n        }\n    }\n    else\n    {\n        OVR_ASSERT(false);\n    }\n\n    return SessionResult_OK;\n}\n\nstatic Session* SingleProcessServer = nullptr;\n\nSessionResult Session::ListenPTCP(OVR::Net::BerkleyBindParameters *bbp)\n{\n    if (Session::IsSingleProcess())\n    {\n        // Do not actually listen on a socket.\n        SingleProcessServer = this;\n        return SessionResult_OK;\n    }\n\n    Ptr<PacketizedTCPSocket> listenSocket = *new OVR::Net::PacketizedTCPSocket();\n    if (listenSocket->Bind(bbp) == INVALID_SOCKET)\n    {\n        return SessionResult_BindFailure;\n    }\n\n    BerkleyListenerDescription bld;\n    bld.BoundSocketToListenWith = listenSocket.GetPtr();\n    bld.Transport = TransportType_PacketizedTCP;\n\n    return Listen(&bld);\n}\n\nSessionResult Session::ConnectPTCP(OVR::Net::BerkleyBindParameters* bbp, SockAddr* remoteAddress, bool blocking)\n{\n    if (Session::IsSingleProcess())\n    {\n        OVR_ASSERT(SingleProcessServer); // ListenPTCP() must be called before ConnectPTCP()\n\n        SingleProcessServer->SingleTargetSession = this;\n        SingleTargetSession = SingleProcessServer;\n\n        Ptr<PacketizedTCPSocket> s = *new PacketizedTCPSocket;\n        SockAddr sa;\n        sa.Set(\"::1\", 10101, SOCK_STREAM);\n\n        Ptr<Connection> newConnection = AllocConnection(TransportType_PacketizedTCP);\n        if (!newConnection)\n        {\n            return SessionResult_ConnectFailure;\n        }\n\n        PacketizedTCPConnection* c = (PacketizedTCPConnection*)newConnection.GetPtr();\n        c->pSocket = s;\n        c->Address = &sa;\n        c->Transport = TransportType_PacketizedTCP;\n        c->SetState(Client_Connecting);\n        AllConnections.PushBack(c);\n\n        SingleTargetSession->TCP_OnAccept(s, &sa, INVALID_SOCKET);\n        TCP_OnConnected(s);\n\n        return SessionResult_OK;\n    }\n\n    ConnectParametersBerkleySocket cp(NULL, remoteAddress, blocking, TransportType_PacketizedTCP);\n    Ptr<PacketizedTCPSocket> connectSocket = *new PacketizedTCPSocket();\n\n    cp.BoundSocketToConnectWith = connectSocket.GetPtr();\n    if (connectSocket->Bind(bbp) == INVALID_SOCKET)\n    {\n        return SessionResult_BindFailure;\n    }\n\n    return Connect(&cp);\n}\n\nPtr<PacketizedTCPConnection> Session::findConnectionBySockAddr(SockAddr* address)\n{\n    const int count = AllConnections.GetSizeI();\n    for (int i = 0; i < count; ++i)\n    {\n        Connection* arrayItem = AllConnections[i].GetPtr();\n\n        if (arrayItem->Transport == TransportType_PacketizedTCP)\n        {\n            PacketizedTCPConnection* conn = (PacketizedTCPConnection*)arrayItem;\n\n            if (conn->Address == *address)\n            {\n                return conn;\n            }\n        }\n    }\n\n    return 0;\n}\n\nint Session::Send(SendParameters *payload)\n{\n    if (payload->pConnection->Transport == TransportType_PacketizedTCP)\n    {\n        if (Session::IsSingleProcess())\n        {\n            OVR_ASSERT(SingleTargetSession->AllConnections.GetSizeI() > 0);\n            PacketizedTCPConnection* conn = (PacketizedTCPConnection*)SingleTargetSession->AllConnections[0].GetPtr();\n            SingleTargetSession->TCP_OnRecv(conn->pSocket, (uint8_t*)payload->pData, payload->Bytes);\n            return payload->Bytes;\n        }\n        else\n        {\n            PacketizedTCPConnection* conn = (PacketizedTCPConnection*)payload->pConnection.GetPtr();\n            return conn->pSocket->Send(payload->pData, payload->Bytes);\n        }\n    }\n\n    OVR_ASSERT(false); // Should not reach here\n    return 0;\n}\n\nvoid Session::Broadcast(BroadcastParameters *payload)\n{\n    SendParameters sp;\n    sp.Bytes=payload->Bytes;\n    sp.pData=payload->pData;\n\n    {\n        Lock::Locker locker(&ConnectionsLock);\n\n        const int connectionCount = FullConnections.GetSizeI();\n        for (int i = 0; i < connectionCount; ++i)\n        {\n            sp.pConnection = FullConnections[i];\n            Send(&sp);\n        }    \n    }\n}\n\n// DO NOT CALL Poll() FROM MULTIPLE THREADS due to AllBlockingTcpSockets being a member\nvoid Session::Poll(bool listeners)\n{\n    if (Net::Session::IsSingleProcess())\n    {\n        // Spend a lot of time sleeping in single process mode\n        Thread::MSleep(100);\n        return;\n    }\n\n    AllBlockingTcpSockets.Clear();\n\n    if (listeners)\n    {\n        Lock::Locker locker(&SocketListenersLock);\n\n        const int listenerCount = SocketListeners.GetSizeI();\n        for (int i = 0; i < listenerCount; ++i)\n        {\n            AllBlockingTcpSockets.PushBack(SocketListeners[i]);\n        }\n    }\n\n    {\n        Lock::Locker locker(&ConnectionsLock);\n\n        const int connectionCount = AllConnections.GetSizeI();\n        for (int i = 0; i < connectionCount; ++i)\n        {\n            Connection* arrayItem = AllConnections[i].GetPtr();\n\n            if (arrayItem->Transport == TransportType_PacketizedTCP)\n            {\n                PacketizedTCPConnection* ptcp = (PacketizedTCPConnection*)arrayItem;\n\n                AllBlockingTcpSockets.PushBack(ptcp->pSocket);\n            }\n            else\n            {\n                OVR_ASSERT(false);\n            }\n        }\n    }\n\n    const int count = AllBlockingTcpSockets.GetSizeI();\n    if (count > 0)\n    {\n        TCPSocketPollState state;\n\n        // Add all the sockets for polling,\n        for (int i = 0; i < count; ++i)\n        {\n            Net::TCPSocket* sock = AllBlockingTcpSockets[i].GetPtr();\n\n            // If socket handle is invalid,\n            if (sock->GetSocketHandle() == INVALID_SOCKET)\n            {\n                OVR_DEBUG_LOG((\"[Session] Detected an invalid socket handle - Treating it as a disconnection.\"));\n                sock->IsConnecting = false;\n                TCP_OnClosed(sock);\n            }\n            else\n            {\n                state.Add(sock);\n            }\n        }\n\n        // If polling returns with an event,\n        if (state.Poll(AllBlockingTcpSockets[0]->GetBlockingTimeoutUsec(), AllBlockingTcpSockets[0]->GetBlockingTimeoutSec()))\n        {\n            // Handle any events for each socket\n            for (int i = 0; i < count; ++i)\n            {\n                state.HandleEvent(AllBlockingTcpSockets[i], this);\n            }\n        }\n    }\n}\n\nvoid Session::AddSessionListener(SessionListener* se)\n{\n    Lock::Locker locker(&SessionListenersLock);\n\n    const int count = SessionListeners.GetSizeI();\n    for (int i = 0; i < count; ++i)\n    {\n        if (SessionListeners[i] == se)\n        {\n            // Already added\n            return;\n        }\n    }\n\n    SessionListeners.PushBack(se);\n    se->OnAddedToSession(this);\n}\n\nvoid Session::RemoveSessionListener(SessionListener* se)\n{\n    Lock::Locker locker(&SessionListenersLock);\n\n    const int count = SessionListeners.GetSizeI();\n    for (int i = 0; i < count; ++i)\n    {\n        if (SessionListeners[i] == se)\n        {\n            se->OnRemovedFromSession(this);\n\n            SessionListeners.RemoveAtUnordered(i);\n            break;\n        }\n    }\n}\n\nint Session::GetActiveSocketsCount()\n{\n    return SocketListeners.GetSizeI() + AllConnections.GetSizeI();\n}\n\nPtr<Connection> Session::AllocConnection(TransportType transport)\n{\n    switch (transport)\n    {\n    case TransportType_TCP:           return *new TCPConnection();\n    case TransportType_PacketizedTCP: return *new PacketizedTCPConnection();\n    default:\n        OVR_ASSERT(false);\n        break;\n    }\n\n    return NULL;\n}\n\nPtr<PacketizedTCPConnection> Session::findConnectionBySocket(Array< Ptr<Connection> >& connectionArray, Socket* s, int *connectionIndex)\n{\n    const int count = connectionArray.GetSizeI();\n    for (int i = 0; i < count; ++i)\n    {\n        Connection* arrayItem = connectionArray[i].GetPtr();\n\n        if (arrayItem->Transport == TransportType_PacketizedTCP)\n        {\n            PacketizedTCPConnection* ptc = (PacketizedTCPConnection*)arrayItem;\n\n            if (ptc->pSocket == s)\n            {\n                if (connectionIndex)\n                {\n                    *connectionIndex = i;\n                }\n                return ptc;\n            }\n        }\n    }\n\n    return NULL;\n}\n\nint Session::invokeSessionListeners(ReceivePayload* rp)\n{\n    Lock::Locker locker(&SessionListenersLock);\n\n    const int count = SessionListeners.GetSizeI();\n    for (int j = 0; j < count; ++j)\n    {\n        ListenerReceiveResult lrr = LRR_CONTINUE;\n        SessionListeners[j]->OnReceive(rp, &lrr);\n\n        if (lrr == LRR_RETURN || lrr == LRR_BREAK)\n        {\n            break;\n        }\n    }\n\n    return rp->Bytes;\n}\n\nvoid Session::TCP_OnRecv(Socket* pSocket, uint8_t* pData, int bytesRead)\n{\n    // KevinJ: 9/2/2014 Fix deadlock - Watchdog calls Broadcast(), which locks ConnectionsLock().\n    // Lock::Locker locker(&ConnectionsLock);\n\n    // Look for the connection in the full connection list first\n    int connIndex;\n    ConnectionsLock.DoLock();\n    Ptr<PacketizedTCPConnection> conn = findConnectionBySocket(AllConnections, pSocket, &connIndex);\n    ConnectionsLock.Unlock();\n    if (conn)\n    {\n        if (conn->State == State_Connected)\n        {\n            ReceivePayload rp;\n            rp.Bytes = bytesRead;\n            rp.pConnection = conn;\n            rp.pData = pData;\n\n            // Call listeners\n            invokeSessionListeners(&rp);\n        }\n        else if (conn->State == Client_ConnectedWait)\n        {\n            // Check the version data from the message\n            BitStream bsIn((char*)pData, bytesRead, false);\n\n            RPC_S2C_Authorization auth;\n            if (!auth.Serialize(false, &bsIn) ||\n                !auth.ClientValidate())\n            {\n                LogError(\"{ERR-001} [Session] REJECTED: OVRService did not authorize us: %s\", auth.AuthString.ToCStr());\n\n                conn->SetState(State_Zombie);\n                invokeSessionEvent(&SessionListener::OnIncompatibleProtocol, conn);\n            }\n            else\n            {\n                // Read remote version\n                conn->RemoteMajorVersion = auth.MajorVersion;\n                conn->RemoteMinorVersion = auth.MinorVersion;\n                conn->RemotePatchVersion = auth.PatchVersion;\n                conn->RemoteCodeVersion  = auth.CodeVersion;\n\n                // Mark as connected\n                conn->SetState(State_Connected);\n                ConnectionsLock.DoLock();\n                int connIndex2;\n                if (findConnectionBySocket(AllConnections, pSocket, &connIndex2)==conn && findConnectionBySocket(FullConnections, pSocket, &connIndex2)==NULL)\n                {\n                    FullConnections.PushBack(conn);\n                    HaveFullConnections.store(true, std::memory_order_relaxed);\n                }\n                ConnectionsLock.Unlock();\n                invokeSessionEvent(&SessionListener::OnConnectionRequestAccepted, conn);\n            }\n        }\n        else if (conn->State == Server_ConnectedWait)\n        {\n            // Check the version data from the message\n            BitStream bsIn((char*)pData, bytesRead, false);\n\n            RPC_C2S_Hello hello;\n            if (!hello.Serialize(false, &bsIn) ||\n                !hello.ServerValidate())\n            {\n                LogError(\"{ERR-002} [Session] REJECTED: Rift application is using an incompatible version %d.%d.%d, feature version %d (my version=%d.%d.%d, feature version %d)\",\n                         hello.MajorVersion, hello.MinorVersion, hello.PatchVersion, hello.CodeVersion.FeatureVersion,\n                         RPCVersion_Major, RPCVersion_Minor, RPCVersion_Patch, OVR_FEATURE_VERSION);\n\n                conn->SetState(State_Zombie);\n\n                // Send auth response\n                BitStream bsOut;\n                RPC_S2C_Authorization::ServerGenerate(&bsOut, \"Incompatible protocol version.  Please make sure your OVRService and SDK are both up to date.\");\n\n                SendParameters sp;\n                sp.Bytes = bsOut.GetNumberOfBytesUsed();\n                sp.pData = bsOut.GetData();\n                sp.pConnection = conn;\n                Send(&sp);\n            }\n            else\n            {\n                if (hello.CodeVersion.FeatureVersion != OVR_FEATURE_VERSION)\n                {\n                    LogError(\"[Session] WARNING: Rift application is using a different feature version than the server (server version = %d, app version = %d)\",\n                        OVR_FEATURE_VERSION, hello.CodeVersion.FeatureVersion);\n                }\n\n                // Read remote version\n                conn->RemoteMajorVersion = hello.MajorVersion;\n                conn->RemoteMinorVersion = hello.MinorVersion;\n                conn->RemotePatchVersion = hello.PatchVersion;\n                conn->RemoteCodeVersion  = hello.CodeVersion;\n\n                // Send auth response\n                BitStream bsOut;\n                RPC_S2C_Authorization::ServerGenerate(&bsOut);\n\n                SendParameters sp;\n                sp.Bytes = bsOut.GetNumberOfBytesUsed();\n                sp.pData = bsOut.GetData();\n                sp.pConnection = conn;\n                Send(&sp);\n\n                // Mark as connected\n                conn->SetState(State_Connected);\n                ConnectionsLock.DoLock();\n                int connIndex2;\n                if (findConnectionBySocket(AllConnections, pSocket, &connIndex2)==conn && findConnectionBySocket(FullConnections, pSocket, &connIndex2)==NULL)\n                {\n                    FullConnections.PushBack(conn);\n                    HaveFullConnections.store(true, std::memory_order_relaxed);\n                }\n                ConnectionsLock.Unlock();\n                invokeSessionEvent(&SessionListener::OnNewIncomingConnection, conn);\n\n            }\n        }\n        else\n        {\n            OVR_ASSERT(false);\n        }\n    }\n}\n\nvoid Session::TCP_OnClosed(TCPSocket* s)\n{\n    Lock::Locker locker(&ConnectionsLock);\n\n    // If found in the full connection list,\n    int connIndex = 0;\n    Ptr<PacketizedTCPConnection> conn = findConnectionBySocket(AllConnections, s, &connIndex);\n    if (conn)\n    {\n        AllConnections.RemoveAtUnordered(connIndex);\n\n        // If in the full connection list,\n        if (findConnectionBySocket(FullConnections, s, &connIndex))\n        {\n            FullConnections.RemoveAtUnordered(connIndex);\n            if (FullConnections.GetSizeI() < 1)\n            {\n                HaveFullConnections.store(false, std::memory_order_relaxed);\n            }\n        }\n\n        // Generate an appropriate event for the current state\n        switch (conn->State)\n        {\n        case Client_Connecting:\n            invokeSessionEvent(&SessionListener::OnConnectionAttemptFailed, conn);\n            break;\n        case Client_ConnectedWait:\n        case Server_ConnectedWait:\n            invokeSessionEvent(&SessionListener::OnHandshakeAttemptFailed, conn);\n            break;\n        case State_Connected:\n        case State_Zombie:\n            invokeSessionEvent(&SessionListener::OnDisconnected, conn);\n            break;\n        default:\n            OVR_ASSERT(false);\n            break;\n        }\n\n        conn->SetState(State_Zombie);\n    }\n}\n\nvoid Session::TCP_OnAccept(TCPSocket* pListener, SockAddr* pSockAddr, SocketHandle newSock)\n{\n    OVR_UNUSED(pListener);\n    Ptr<PacketizedTCPSocket> newSocket = *new PacketizedTCPSocket(newSock, false);\n\n    OVR_ASSERT(pListener->Transport == TransportType_PacketizedTCP);\n\n    // If pSockAddr is not localhost, then close newSock\n    if (!pSockAddr->IsLocalhost())\n    {\n        newSocket->Close();\n        return;\n    }\n\n    if (newSocket)\n    {\n        Ptr<Connection> b = AllocConnection(TransportType_PacketizedTCP);\n        Ptr<PacketizedTCPConnection> c = (PacketizedTCPConnection*)b.GetPtr();\n        c->pSocket = newSocket;\n        c->Address = *pSockAddr;\n        c->State = Server_ConnectedWait;\n\n        {\n            Lock::Locker locker(&ConnectionsLock);\n            AllConnections.PushBack(c);\n        }\n\n        // Server does not send the first packet.  It waits for the client to send its version\n    }\n}\n\nvoid Session::TCP_OnConnected(TCPSocket *s)\n{\n    Lock::Locker locker(&ConnectionsLock);\n\n    // If connection was found,\n    PacketizedTCPConnection* conn = findConnectionBySocket(AllConnections, s);\n    if (conn)\n    {\n        OVR_ASSERT(conn->State == Client_Connecting);\n\n        // Just update state but do not generate any notifications yet\n        conn->SetState(Client_ConnectedWait);\n\n        // Send hello message\n        BitStream bsOut;\n        RPC_C2S_Hello::ClientGenerate(&bsOut);\n\n        SendParameters sp;\n        sp.Bytes = bsOut.GetNumberOfBytesUsed();\n        sp.pData = bsOut.GetData();\n        sp.pConnection = conn;\n        Send(&sp);\n    }\n}\n\nvoid Session::invokeSessionEvent(void(SessionListener::*f)(Connection*), Connection* conn)\n{\n    Lock::Locker locker(&SessionListenersLock);\n\n    const int count = SessionListeners.GetSizeI();\n    for (int i = 0; i < count; ++i)\n    {\n        (SessionListeners[i]->*f)(conn);\n    }\n}\n\nPtr<Connection> Session::GetConnectionAtIndex(int index)\n{\n    Lock::Locker locker(&ConnectionsLock);\n\n    const int count = FullConnections.GetSizeI();\n\n    if (index < count)\n    {\n        return FullConnections[index];\n    }\n\n    return NULL;\n}\n\n\n}} // OVR::Net\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Net/OVR_Session.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_Session.h\nContent     :   One network session that provides connection/disconnection events.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Session_h\n#define OVR_Session_h\n\n#include <atomic>\n\n#include <OVR_Version.h>\n#include \"OVR_Socket.h\"\n#include \"OVR_PacketizedTCPSocket.h\"\n#include \"Kernel/OVR_Array.h\"\n#include \"Kernel/OVR_Threads.h\"\n#include \"Kernel/OVR_RefCount.h\"\n#include <stdint.h>\n\n\nnamespace OVR { namespace Net {\n\nclass Session;\n\n\n//-----------------------------------------------------------------------------\n// Based on Semantic Versioning ( http://semver.org/ )\n//\n// Please update changelog below:\n// 1.0.0 - [SDK 0.4.0] Initial version (July 21, 2014)\n// 1.1.0 - [SDK 0.4.1] Add Get/SetDriverMode_1, HMDCountUpdate_1 Version mismatch results (July 28, 2014)\n// 1.2.0 - [SDK 0.4.4]\n// 1.2.1 - [SDK 0.5.0] Added DyLib model and SDKVersion\n// 1.3.0 - [SDK 0.5.0] Multiple shared memory regions for different objects\n//-----------------------------------------------------------------------------\n\nstatic const uint16_t RPCVersion_Major = 1; // MAJOR version when you make incompatible API changes,\nstatic const uint16_t RPCVersion_Minor = 3; // MINOR version when you add functionality in a backwards-compatible manner, and\nstatic const uint16_t RPCVersion_Patch = 0; // PATCH version when you make backwards-compatible bug fixes.\n\n#define OVR_FEATURE_VERSION 0\n\n\nstruct SDKVersion\n{\n    uint16_t ProductVersion;        // CAPI DLL product number, 0 before first consumer release\n    uint16_t MajorVersion;          // CAPI DLL version major number\n    uint16_t MinorVersion;          // CAPI DLL version minor number\n    uint16_t RequestedMinorVersion; // Number provided by game in ovr_Initialize() arguments\n    uint16_t PatchVersion;          // CAPI DLL version patch number\n    uint16_t BuildNumber;           // Number increments per build\n    uint16_t FeatureVersion;        // CAPI DLL feature version number\n\n    SDKVersion()\n    {\n        Reset();\n    }\n\n    void Reset()\n    {\n        ProductVersion        = MajorVersion = MinorVersion = UINT16_MAX;\n        RequestedMinorVersion = PatchVersion = BuildNumber = UINT16_MAX;\n        FeatureVersion        = UINT16_MAX;\n    }\n\n    void SetCurrent()\n    {\n        ProductVersion        = OVR_PRODUCT_VERSION;\n        MajorVersion          = OVR_MAJOR_VERSION;\n        MinorVersion          = OVR_MINOR_VERSION;\n        RequestedMinorVersion = OVR_MINOR_VERSION;\n        PatchVersion          = OVR_PATCH_VERSION;\n        BuildNumber           = OVR_BUILD_NUMBER;\n        FeatureVersion        = OVR_FEATURE_VERSION;\n    }\n};\n\n// This is the version that the OVR_CAPI client passes on to the server.  It's a global variable\n// because it needs to be initialized in ovr_Initialize but read in the OVR_Session module.\n// This variable exists as a global in the server but it has no meaning.\nextern SDKVersion RuntimeSDKVersion;\n\n\n// Client starts communication by sending its version number.\nstruct RPC_C2S_Hello\n{\n    RPC_C2S_Hello() :\n        MajorVersion(0),\n        MinorVersion(0),\n        PatchVersion(0),\n        CodeVersion()\n    {\n        CodeVersion.SetCurrent();\n    }\n\n    String HelloString;\n\n    // Client protocol version info\n    uint16_t MajorVersion, MinorVersion, PatchVersion;\n\n    // Client runtime code version info\n    SDKVersion CodeVersion;\n\n    bool Serialize(bool writeToBitstream, Net::BitStream* bs);\n    static void ClientGenerate(Net::BitStream* bs);\n    bool ServerValidate();\n};\n\n// Server responds with an authorization accepted message, including the server's version number\nstruct RPC_S2C_Authorization\n{\n    RPC_S2C_Authorization() :\n        MajorVersion(0),\n        MinorVersion(0),\n        PatchVersion(0),\n        CodeVersion()\n    {\n        CodeVersion.SetCurrent();\n    }\n\n    String AuthString;\n\n    // Server version info\n    uint16_t MajorVersion, MinorVersion, PatchVersion;\n\n    // The SDK version that the server was built with.\n    // There's no concept of the server requesting an SDK version like the client does.\n    SDKVersion CodeVersion;\n\n    bool Serialize(bool writeToBitstream, Net::BitStream* bs);\n    static void ServerGenerate(Net::BitStream* bs, String errorString = \"\");\n    bool ClientValidate();\n};\n\n\n//-----------------------------------------------------------------------------\n// Result of a session function\nenum SessionResult\n{\n    SessionResult_OK,\n    SessionResult_BindFailure,\n    SessionResult_ListenFailure,\n    SessionResult_ConnectFailure,\n    SessionResult_ConnectInProgress,\n    SessionResult_AlreadyConnected,\n};\n\n\n//-----------------------------------------------------------------------------\n// Connection state\nenum EConnectionState\n{\n    State_Zombie,          // Disconnected\n\n    // Client-only:\n    Client_Connecting,     // Waiting for TCP connection\n    Client_ConnectedWait,  // Connected! Waiting for server to authorize\n\n    // Server-only:\n    Server_ConnectedWait,  // Connected! Waiting for client handshake\n\n    State_Connected        // Connected\n};\n\n\n//-----------------------------------------------------------------------------\n// Generic connection over any transport\nclass Connection : public RefCountBase<Connection>\n{\npublic:\n    Connection() :\n        Transport(TransportType_None),\n        State(State_Zombie),\n        RemoteMajorVersion(0),\n        RemoteMinorVersion(0),\n        RemotePatchVersion(0),\n        RemoteCodeVersion()\n    {\n    }\n    virtual ~Connection() // Allow delete from base\n    {\n    }\n\npublic:\n    virtual void SetState(EConnectionState s) {State = s;}\n\n    TransportType    Transport;\n    EConnectionState State;\n\n    // Version number read from remote host just before connection completes\n    int              RemoteMajorVersion;    // RPC version\n    int              RemoteMinorVersion;\n    int              RemotePatchVersion;\n    SDKVersion       RemoteCodeVersion;\n};\n\n\n//-----------------------------------------------------------------------------\n// Generic network connection over any network transport\nclass NetworkConnection : public Connection\n{\nprotected:\n    NetworkConnection()\n    {\n    }\n    virtual ~NetworkConnection()\n    {\n    }\n\npublic:\n    // Thread-safe interface to set or wait on a connection state change.\n    // All modifications of the connection state should go through this function,\n    // on the client side.\n    void SetState(EConnectionState s)\n    {\n        Mutex::Locker locker(&StateMutex);\n\n        if (s != State)\n        {\n            State = s;\n\n            if (State != Client_Connecting &&\n                State != Client_ConnectedWait)\n            {\n                ConnectingWait.NotifyAll();\n            }\n        }\n    }\n\n    // Call this function to wait for the state to change to a connected state.\n    void WaitOnConnecting()\n    {\n        Mutex::Locker locker(&StateMutex);\n\n        while (State == Client_Connecting || State == Client_ConnectedWait)\n        {\n            ConnectingWait.Wait(&StateMutex);\n        }\n    }\n\n    SockAddr      Address;\n    Mutex         StateMutex;\n    WaitCondition ConnectingWait;\n};\n\n\n//-----------------------------------------------------------------------------\n// TCP Connection\nclass TCPConnection : public NetworkConnection\n{\npublic:\n    TCPConnection()\n    {\n    }\n    virtual ~TCPConnection()\n    {\n    }\n\npublic:\n    Ptr<TCPSocket> pSocket;\n};\n\n\n//-----------------------------------------------------------------------------\n// Packetized TCP Connection\nclass PacketizedTCPConnection : public TCPConnection\n{\npublic:\n    PacketizedTCPConnection()\n    {\n        Transport = TransportType_PacketizedTCP;\n    }\n    virtual ~PacketizedTCPConnection()\n    {\n    }\n};\n\n\n//-----------------------------------------------------------------------------\n// Generic socket listener description\nclass ListenerDescription\n{\npublic:\n    ListenerDescription() :\n        Transport(TransportType_None)\n    {\n    }\n\n    TransportType Transport;\n};\n\n\n//-----------------------------------------------------------------------------\n// Description for a Berkley socket listener\nclass BerkleyListenerDescription : public ListenerDescription\n{\npublic:\n    static const int DefaultMaxIncomingConnections =  64;\n    static const int DefaultMaxConnections         = 128;\n\n    BerkleyListenerDescription() :\n        MaxIncomingConnections(DefaultMaxIncomingConnections),\n        MaxConnections(DefaultMaxConnections)\n    {\n    }\n\n    Ptr<BerkleySocket> BoundSocketToListenWith;\n    int                MaxIncomingConnections;\n    int                MaxConnections;\n};\n\n\n//-----------------------------------------------------------------------------\n// Receive payload\nstruct ReceivePayload\n{\n    Connection* pConnection; // Source connection\n    uint8_t*    pData;       // Pointer to data received\n    int         Bytes;       // Number of bytes of data received\n};\n\n//-----------------------------------------------------------------------------\n// Broadcast parameters\nclass BroadcastParameters\n{\npublic:\n    BroadcastParameters() :\n        pData(NULL),\n        Bytes(0)\n    {\n    }\n\n    BroadcastParameters(const void* _pData, int _bytes) :\n        pData(_pData),\n        Bytes(_bytes)\n    {\n    }\n\npublic:\n    const void*     pData;       // Pointer to data to send\n    int             Bytes;       // Number of bytes of data received\n};\n\n//-----------------------------------------------------------------------------\n// Send parameters\nclass SendParameters\n{\npublic:\n    SendParameters() :\n        pData(NULL),\n        Bytes(0)\n    {\n    }\n    SendParameters(Ptr<Connection> _pConnection, const void* _pData, int _bytes) :\n        pConnection(_pConnection),\n        pData(_pData),\n        Bytes(_bytes)\n    {\n    }\n\npublic:\n    Ptr<Connection> pConnection; // Connection to use\n    const void*     pData;       // Pointer to data to send\n    int             Bytes;       // Number of bytes of data received\n};\n\n\n//-----------------------------------------------------------------------------\n// Parameters to connect\nstruct ConnectParameters\n{\npublic:\n    ConnectParameters() :\n        Transport(TransportType_None)\n    {\n    }\n\n    TransportType Transport;\n};\n\nstruct ConnectParametersBerkleySocket : public ConnectParameters\n{\n    SockAddr           RemoteAddress;\n    Ptr<BerkleySocket> BoundSocketToConnectWith;\n    bool               Blocking;\n\n    ConnectParametersBerkleySocket(BerkleySocket* s, SockAddr* addr, bool blocking,\n                                   TransportType transport) :\n        RemoteAddress(*addr),\n        BoundSocketToConnectWith(s),\n        Blocking(blocking)\n    {\n        Transport = transport;\n    }\n};\n\n\n//-----------------------------------------------------------------------------\n// Listener receive result\nenum ListenerReceiveResult\n{\n    /// The SessionListener used this message and it shouldn't be given to the user.\n    LRR_RETURN = 0,\n\n    /// The SessionListener is going to hold on to this message.  Do not deallocate it but do not pass it to other plugins either.\n    LRR_BREAK,\n\n    /// This message will be processed by other SessionListeners, and at last by the user.\n    LRR_CONTINUE,\n};\n\n\n//-----------------------------------------------------------------------------\n// SessionListener\n\n// Callback interface for network events such as connecting, disconnecting, getting data, independent of the transport medium\nclass SessionListener\n{\npublic:\n    virtual ~SessionListener(){}\n\n    // Data events\n    virtual void OnReceive(ReceivePayload* pPayload, ListenerReceiveResult* lrrOut) { OVR_UNUSED2(pPayload, lrrOut);  }\n\n    // Connection was closed\n    virtual void OnDisconnected(Connection* conn) = 0;\n\n    // Connection was created (some data was exchanged to verify protocol compatibility too)\n    virtual void OnConnected(Connection* conn) = 0;\n\n    // Server accepted client\n    virtual void OnNewIncomingConnection(Connection* conn)     { OnConnected(conn); }\n    // Client was accepted\n    virtual void OnConnectionRequestAccepted(Connection* conn) { OnConnected(conn); }\n\n    // Connection attempt failed for some reason\n    virtual void OnConnectionAttemptFailed(Connection* conn)   { OnDisconnected(conn); }\n\n    // Incompatible protocol\n    virtual void OnIncompatibleProtocol(Connection* conn)      { OnConnectionAttemptFailed(conn); }\n    // Disconnected during initial handshake\n    virtual void OnHandshakeAttemptFailed(Connection* conn)    { OnConnectionAttemptFailed(conn); }\n\n    // Other\n    virtual void OnAddedToSession(Session* session)            { OVR_UNUSED(session); }\n    virtual void OnRemovedFromSession(Session* session)        { OVR_UNUSED(session); }\n};\n\n\n//-----------------------------------------------------------------------------\n// Session\n\n//  Interface for network events such as listening on a socket, sending data, connecting, and disconnecting. Works independently of the transport medium and also implements loopback\nclass Session : public SocketEvent_TCP, public NewOverrideBase\n{\npublic:\n    Session() :\n        HaveFullConnections(false)\n    {\n    }\n    virtual ~Session()\n    {\n        // Ensure memory backing the sockets array is released\n        AllBlockingTcpSockets.ClearAndRelease();\n    }\n\n    virtual SessionResult Listen(ListenerDescription* pListenerDescription);\n    virtual SessionResult Connect(ConnectParameters* cp);\n    virtual int           Send(SendParameters* payload);\n    virtual void          Broadcast(BroadcastParameters* payload);\n    // DO NOT CALL Poll() FROM MULTIPLE THREADS due to AllBlockingTcpSockets being a member\n    virtual void          Poll(bool listeners = true);\n    virtual void          AddSessionListener(SessionListener* se);\n    virtual void          RemoveSessionListener(SessionListener* se);\n    // GetActiveSocketsCount() is not thread-safe: Socket count may change at any time.\n    virtual int           GetActiveSocketsCount();\n\n    // Packetized TCP convenience functions\n    virtual SessionResult ListenPTCP(BerkleyBindParameters* bbp);\n    virtual SessionResult ConnectPTCP(BerkleyBindParameters* bbp, SockAddr* RemoteAddress, bool blocking);\n\n    // Closes all the sockets; useful for interrupting the socket polling during shutdown\n    void            Shutdown();\n\n    // Returns true if there is at least one successful connection\n    // WARNING: This function may not be in sync across threads, but it IS atomic\n    bool            ConnectionSuccessful() const\n    {\n        return HaveFullConnections.load(std::memory_order_relaxed);\n    }\n\n    // Get count of successful connections (past handshake point)\n    // WARNING: This function is not thread-safe\n    int             GetConnectionCount() const\n    {\n        return FullConnections.GetSizeI();\n    }\n    Ptr<Connection> GetConnectionAtIndex(int index);\n\nprotected:\n    virtual Ptr<Connection> AllocConnection(TransportType transportType);\n\n    Lock SocketListenersLock, ConnectionsLock, SessionListenersLock;\n    Array< Ptr<TCPSocket> >   SocketListeners;     // List of active sockets\n    Array< Ptr<Connection> >  AllConnections;      // List of active connections stuck at the versioning handshake\n    Array< Ptr<Connection> >  FullConnections;     // List of active connections past the versioning handshake\n    Array< SessionListener* > SessionListeners;    // List of session listeners\n    Array< Ptr< Net::TCPSocket > > AllBlockingTcpSockets; // Preallocated blocking sockets array\n\n    std::atomic<bool> HaveFullConnections;\n\n    // Tools\n    Ptr<PacketizedTCPConnection> findConnectionBySocket(Array< Ptr<Connection> >& connectionArray, Socket* s, int *connectionIndex = NULL); // Call with ConnectionsLock held\n    Ptr<PacketizedTCPConnection> findConnectionBySockAddr(SockAddr* address); // Call with ConnectionsLock held\n    int                   invokeSessionListeners(ReceivePayload*);\n    void                  invokeSessionEvent(void(SessionListener::*f)(Connection*), Connection* pConnection);\n\n    // TCP\n    virtual void          TCP_OnRecv(Socket* pSocket, uint8_t* pData, int bytesRead);\n    virtual void          TCP_OnClosed(TCPSocket* pSocket);\n    virtual void          TCP_OnAccept(TCPSocket* pListener, SockAddr* pSockAddr, SocketHandle newSock);\n    virtual void          TCP_OnConnected(TCPSocket* pSocket);\n\npublic:\n    static void SetSingleProcess(bool enable);\n    static bool IsSingleProcess();\n\nprotected:\n    Session* SingleTargetSession; // Target for SingleProcess mode\n};\n\n\n}} // OVR::Net\n\n#endif\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Net/OVR_Socket.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Socket.cpp\nContent     :   Socket common data shared between all platforms.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_Socket.h\"\n\nnamespace OVR { namespace Net {\n\n\n//-----------------------------------------------------------------------------\n// Socket\n\nSocket::Socket() :\n\tTransport(TransportType_None)\n{\n}\n\n\n//-----------------------------------------------------------------------------\n// BerkleyBindParameters\n\nBerkleyBindParameters::BerkleyBindParameters() :\n\tPort(0),\n    Address(),\n    blockingTimeout(0x7fffffff)\n{\n}\n\n//-----------------------------------------------------------------------------\n// BerkleySocket\n\nBerkleySocket::BerkleySocket() :\n\tTheSocket(INVALID_SOCKET)\n  //TimeoutUsec(0) // Initialized by SetBlockingTimeout\n  //TimeoutSec(0)  // \"\n{\n    SetBlockingTimeout(1000);\n}\n\nBerkleySocket::~BerkleySocket()\n{\n\t// Close socket on destruction\n\tClose();\n}\n\n\n//-----------------------------------------------------------------------------\n// UDPSocketBase\n\nUDPSocketBase::UDPSocketBase()\n{\n\tTransport = TransportType_UDP;\n}\n\n\n//-----------------------------------------------------------------------------\n// TCPSocketBase\n\nTCPSocketBase::TCPSocketBase()\n  : IsListenSocket(false)\n{\n\tTransport = TransportType_TCP;\n}\n\nTCPSocketBase::TCPSocketBase(SocketHandle handle)\n  : IsListenSocket(false)\n{\n\tTheSocket = handle;\n}\n\n\n}} // OVR::Net\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Net/OVR_Socket.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_Socket.h\nContent     :   Socket common data shared between all platforms.\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Socket_h\n#define OVR_Socket_h\n\n#include \"Kernel/OVR_Types.h\"\n#include \"Kernel/OVR_Timer.h\"\n#include \"Kernel/OVR_Allocator.h\"\n#include \"Kernel/OVR_RefCount.h\"\n#include \"Kernel/OVR_String.h\"\n\n// OS-specific socket headers\n#if defined(OVR_OS_WIN32)\n#include <WinSock2.h>\n#include <WS2tcpip.h>\n#include \"Kernel/OVR_Win32_IncludeWindows.h\"\n#else\n# include <unistd.h>\n# include <sys/types.h>\n# include <netinet/in.h>\n#ifdef OVR_OS_ANDROID\n#include <sys/socket.h>\n#endif\n#endif\n\nnamespace OVR { namespace Net {\n\nclass SockAddr;\nclass UDPSocket;\nclass TCPSocket;\n\n\n//-----------------------------------------------------------------------------\n// Portable numeric Socket handle\n#if defined(OVR_OS_WIN32)\ntypedef SOCKET SocketHandle;\n#else\ntypedef int SocketHandle;\nstatic const SocketHandle INVALID_SOCKET = -1;\nstatic const int SOCKET_ERROR = -1;\n#endif\n\n\n//-----------------------------------------------------------------------------\n// Types of network transport\nenum TransportType\n{\n\tTransportType_None,          // No transport (useful placeholder for invalid states)\n\tTransportType_TCP,           // TCP/IPv4/v6\n\tTransportType_UDP,           // UDP/IPv4/v6\n\tTransportType_PacketizedTCP  // Packetized TCP: Message framing is automatic\n};\n\n\n//-----------------------------------------------------------------------------\n// Abstraction for a network socket. Inheritance hierarchy\n// modeled after RakNet so that future support can be added\n// for Linux, Windows RT, consoles, etc.\nclass Socket : public RefCountBase<Socket>\n{\npublic:\n\tSocket();\n\tvirtual void Close() = 0;\n\npublic:\n\tTransportType Transport; // Type of transport\n};\n\n\n//-----------------------------------------------------------------------------\n// Bind parameters for Berkley sockets\nstruct BerkleyBindParameters\n{\npublic:\n\tBerkleyBindParameters();\n\npublic:\n\tuint16_t Port;     // Port\n\tString Address;\n    uint32_t blockingTimeout;\n};\n\n\n//-----------------------------------------------------------------------------\n// Berkley socket\nclass BerkleySocket : public Socket\n{\npublic:\n\tBerkleySocket();\n\tvirtual ~BerkleySocket();\n\n\tvirtual void   Close();\n\tvirtual int32_t GetSockname(SockAddr* pSockAddrOut);\n\tvirtual void   SetBlockingTimeout(int timeoutMs) // milliseconds\n\t{\n        TimeoutSec = timeoutMs / 1000;\n        TimeoutUsec = (timeoutMs % 1000) * 1000;\n\t}\n    int            GetBlockingTimeoutUsec() const\n    {\n        return TimeoutUsec;\n    }\n    int            GetBlockingTimeoutSec() const\n    {\n        return TimeoutSec;\n    }\n    SocketHandle   GetSocketHandle() const\n    {\n        return TheSocket;\n    }\n\nprotected:\n\tSocketHandle TheSocket;           // Socket handle\n    int TimeoutUsec, TimeoutSec;\n};\n\n\n//-----------------------------------------------------------------------------\n// UDP socket events\nclass SocketEvent_UDP\n{\npublic:\n\tvirtual ~SocketEvent_UDP(){}\n\n\tvirtual void UDP_OnRecv(Socket* pSocket, uint8_t* pData,\n\t\t\t\t\t\t\tuint32_t bytesRead, SockAddr* pSockAddr)\n\t{\n\t\tOVR_UNUSED4(pSocket, pData, bytesRead, pSockAddr);\n\t}\n};\n\n\n//-----------------------------------------------------------------------------\n// TCP socket events\nclass SocketEvent_TCP\n{\npublic:\n\tvirtual ~SocketEvent_TCP(){}\n\n\tvirtual void TCP_OnRecv     (Socket* pSocket,\n                                 uint8_t* pData,\n                                 int bytesRead)\n\t{\n\t\tOVR_UNUSED3(pSocket, pData, bytesRead);\n\t}\n\tvirtual void TCP_OnClosed   (TCPSocket* pSocket)\n\t{\n\t\tOVR_UNUSED(pSocket);\n\t}\n\tvirtual void TCP_OnAccept   (TCPSocket* pListener,\n                                 SockAddr* pSockAddr,\n\t\t\t\t\t\t\t\t SocketHandle newSock)\n\t{\n\t\tOVR_UNUSED3(pListener, pSockAddr, newSock);\n\t}\n\tvirtual void TCP_OnConnected(TCPSocket* pSocket)\n\t{\n\t\tOVR_UNUSED(pSocket);\n\t}\n};\n\n\n//-----------------------------------------------------------------------------\n// UDP Berkley socket\n\n// Base class for UDP sockets, code shared between platforms\nclass UDPSocketBase : public BerkleySocket\n{\npublic:\n\tUDPSocketBase();\n\npublic:\n\tvirtual SocketHandle Bind(BerkleyBindParameters* pBindParameters) = 0;\n\tvirtual int          Send(const void* pData,\n                              int bytes,\n                              SockAddr* pSockAddr) = 0;\n\tvirtual void         Poll(SocketEvent_UDP* eventHandler) = 0;\n\nprotected:\n\tvirtual void         OnRecv(SocketEvent_UDP* eventHandler,\n                                uint8_t* pData,\n\t\t\t\t\t\t\t\tint bytesRead,\n                                SockAddr* address) = 0;\n};\n\n\n//-----------------------------------------------------------------------------\n// TCP Berkley socket\n\n// Base class for TCP sockets, code shared between platforms\nclass TCPSocketBase : public BerkleySocket\n{\npublic:\n\tTCPSocketBase();\n\tTCPSocketBase(SocketHandle handle);\n\npublic:\n\tvirtual SocketHandle Bind(BerkleyBindParameters* pBindParameters) = 0;\n\tvirtual int          Listen() = 0;\n\tvirtual int          Connect(SockAddr* pSockAddr) = 0;\n\tvirtual int          Send(const void* pData,\n                              int bytes) = 0;\nprotected:\n\tvirtual void         OnRecv(SocketEvent_TCP* eventHandler,\n                                uint8_t* pData,\n                                int bytesRead) = 0;\n\nprotected:\n\tbool IsListenSocket; // Is the socket listening (acting as a server)?\n};\n\n\n}} // OVR::Net\n\n#endif\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Net/OVR_Unix_Socket.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Unix_Socket.cpp\nContent     :   Berkley sockets networking implementation\nCreated     :   July 1, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_Unix_Socket.h\"\n#include \"Kernel/OVR_Std.h\"\n#include \"Kernel/OVR_Allocator.h\"\n#include \"Kernel/OVR_Threads.h\" // Thread::MSleep\n#include \"Kernel/OVR_Log.h\"\n\n#include <errno.h>\n\nnamespace OVR { namespace Net {\n\n//-----------------------------------------------------------------------------\n// BerkleySocket\n\nvoid BerkleySocket::Close()\n{\n\tif (TheSocket != INVALID_SOCKET)\n\t{\n\t\tclose(TheSocket);\n\t\tTheSocket = INVALID_SOCKET;\n\t}\n}\n\nSInt32 BerkleySocket::GetSockname(SockAddr *pSockAddrOut)\n{\n\tstruct sockaddr_in6 sa;\n\tmemset(&sa,0,sizeof(sa));\n\tsocklen_t size = sizeof(sa);\n\tSInt32 i = getsockname(TheSocket, (sockaddr*)&sa, &size);\n\tif (i>=0)\n\t{\n\t\tpSockAddrOut->Set(&sa);\n\t}\n\treturn i;\n}\n\n\n//-----------------------------------------------------------------------------\n// BitStream overloads for SockAddr\n\nBitStream& operator<<(BitStream& out, SockAddr& in)\n{\n\tout.WriteBits((const unsigned char*) &in.Addr6, sizeof(in.Addr6)*8, true);\n\treturn out;\n}\n\nBitStream& operator>>(BitStream& in, SockAddr& out)\n{\n\tbool success = in.ReadBits((unsigned char*) &out.Addr6, sizeof(out.Addr6)*8, true);\n\tOVR_ASSERT(success);\n\tOVR_UNUSED(success);\n\treturn in;\n}\n\n\n//-----------------------------------------------------------------------------\n// SockAddr\n\nSockAddr::SockAddr()\n{\n}\n\nSockAddr::SockAddr(SockAddr* address)\n{\n\tSet(&address->Addr6);\n}\n\nSockAddr::SockAddr(sockaddr_storage* storage)\n{\n\tSet(storage);\n}\n\nSockAddr::SockAddr(sockaddr_in6* address)\n{\n\tSet(address);\n}\n\nSockAddr::SockAddr(const char* hostAddress, UInt16 port, int sockType)\n{\n\tSet(hostAddress, port, sockType);\n}\n\nvoid SockAddr::Set(const sockaddr_storage* storage)\n{\n\tmemcpy(&Addr6, storage, sizeof(Addr6));\n}\n\nvoid SockAddr::Set(const sockaddr_in6* address)\n{\n\tmemcpy(&Addr6, address, sizeof(Addr6));\n}\n\nvoid SockAddr::Set(const char* hostAddress, UInt16 port, int sockType)\n{\n\tmemset(&Addr6, 0, sizeof(Addr6));\n\n\tstruct addrinfo hints;\n\n\t// make sure the struct is empty\n\tmemset(&hints, 0, sizeof (addrinfo));\n\n\thints.ai_socktype = sockType; // SOCK_DGRAM or SOCK_STREAM\n\thints.ai_flags = AI_PASSIVE;     // fill in my IP for me\n\thints.ai_family = AF_UNSPEC ;\n\n    if (SOCK_DGRAM == sockType)\n    {\n        hints.ai_protocol = IPPROTO_UDP;\n    }\n    else if (SOCK_STREAM == sockType)\n    {\n        hints.ai_protocol = IPPROTO_TCP;\n    }\n\n    struct addrinfo* servinfo = NULL;  // will point to the results\n\n\tchar portStr[32];\n\tOVR_itoa(port, portStr, sizeof(portStr), 10);\n\tint errcode = getaddrinfo(hostAddress, portStr, &hints, &servinfo);\n\n    if (0 != errcode)\n    {\n        OVR::LogError(\"getaddrinfo error: %s\", gai_strerror(errcode));\n    }\n\n    OVR_ASSERT(servinfo);\n\n    if (servinfo)\n    {\n        memcpy(&Addr6, servinfo->ai_addr, sizeof(Addr6));\n\n        freeaddrinfo(servinfo);\n    }\n}\n\nUInt16 SockAddr::GetPort()\n{\n\treturn htons(Addr6.sin6_port);\n}\n\nString SockAddr::ToString(bool writePort, char portDelineator) const\n{\n    char dest[INET6_ADDRSTRLEN + 1];\n\n\tint ret = getnameinfo((struct sockaddr*)&Addr6,\n\t\t\t\t\t\t  sizeof(struct sockaddr_in6),\n\t\t\t\t\t\t  dest,\n\t\t\t\t\t\t  INET6_ADDRSTRLEN,\n\t\t\t\t\t\t  NULL,\n\t\t\t\t\t\t  0,\n\t\t\t\t\t\t  NI_NUMERICHOST);\n\tif (ret != 0)\n\t{\n\t\tdest[0] = '\\0';\n\t}\n\n\tif (writePort)\n\t{\n\t\tunsigned char ch[2];\n\t\tch[0]=portDelineator;\n\t\tch[1]=0;\n\t\tOVR_strcat(dest, 16, (const char*) ch);\n\t\tOVR_itoa(ntohs(Addr6.sin6_port), dest+strlen(dest), 16, 10);\n\t}\n\n    return String(dest);\n}\nbool SockAddr::IsLocalhost() const\n{\n    static const unsigned char localhost_bytes[] =\n    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };\n\n    return memcmp(Addr6.sin6_addr.s6_addr, localhost_bytes, 16) == 0;\n}\nbool SockAddr::operator==( const SockAddr& right ) const\n{\n\treturn memcmp(&Addr6, &right.Addr6, sizeof(Addr6)) == 0;\n}\n\nbool SockAddr::operator!=( const SockAddr& right ) const\n{\n\treturn !(*this == right);\n}\n\nbool SockAddr::operator>( const SockAddr& right ) const\n{\n\treturn memcmp(&Addr6, &right.Addr6, sizeof(Addr6)) > 0;\n}\n\nbool SockAddr::operator<( const SockAddr& right ) const\n{\n\treturn memcmp(&Addr6, &right.Addr6, sizeof(Addr6)) < 0;\n}\n\n\n// Returns true on success\nstatic bool SetSocketOptions(SocketHandle sock)\n{\n    bool failed = false;\n    int sock_opt;\n    int sockError = 0;\n\n    // This doubles the max throughput rate\n    sock_opt=1024*256;\n    sockError = setsockopt(sock, SOL_SOCKET, SO_RCVBUF, ( char * ) & sock_opt, sizeof ( sock_opt ) );\n    if (sockError != 0)\n    {\n\t\tint errsv = errno;\n        OVR::LogError(\"[Socket] Failed SO_RCVBUF setsockopt, errno: %d\", errsv);\n        failed = true;\n    }\n    \n    // This doesn't make much difference: 10% maybe\n    // Not supported on console 2\n    sock_opt=1024*16;\n    sockError = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, ( char * ) & sock_opt, sizeof ( sock_opt ) );\n    if (sockError != 0)\n    {\n\t\tint errsv = errno;\n        OVR::LogError(\"[Socket] Failed SO_SNDBUF setsockopt, errno: %d\", errsv);\n        failed = true;\n    }\n\n    // NOTE: This should be OVR_OS_BSD, not Mac.\n#ifdef OVR_OS_MAC\n    int value = 1;\n    sockError = setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(value));\n    if (sockError != 0)\n    {\n        int errsv = errno;\n        OVR::LogError(\"[Socket] Failed SO_NOSIGPIPE setsockopt, errno: %d\", errsv);\n        failed = true;\n    }\n#endif\n\n    // Reuse address is only needed for posix platforms, as it is the default\n    // on Windows platforms.\n    int optval = 1;\n    sockError = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int));\n    if (sockError != 0)\n    {\n\t\tint errsv = errno;\n        OVR::LogError(\"[Socket] Failed SO_REUSEADDR setsockopt, errno: %d\", errsv);\n        failed = true;\n    }\n\n    return !failed;\n}\n\nvoid _Ioctlsocket(SocketHandle sock, unsigned long nonblocking)\n{\n\tint flags = fcntl(sock, F_GETFL, 0);\n\tif (flags < 0) return; // return false\n\tif (nonblocking == 0)\t{ flags &= ~O_NONBLOCK; }\n\telse\t\t\t\t\t{ flags |= O_NONBLOCK;  }\n\tfcntl(sock, F_SETFL, flags);\n}\n\nstatic SocketHandle BindShared(int ai_family, int ai_socktype, BerkleyBindParameters *pBindParameters)\n{\n\tSocketHandle sock;\n\n\tstruct addrinfo hints;\n\tmemset(&hints, 0, sizeof (addrinfo)); // make sure the struct is empty\n\thints.ai_family = ai_family;\n\thints.ai_socktype = ai_socktype;\n\thints.ai_flags = AI_PASSIVE;     // fill in my IP for me\n\tstruct addrinfo *servinfo=0, *aip;  // will point to the results\n\tchar portStr[32];\n\tOVR_itoa(pBindParameters->Port, portStr, sizeof(portStr), 10);\n\n    int errcode = 0;\n\tif (!pBindParameters->Address.IsEmpty())\n\t\terrcode = getaddrinfo(pBindParameters->Address.ToCStr(), portStr, &hints, &servinfo);\n\telse\n\t\terrcode = getaddrinfo(0, portStr, &hints, &servinfo);\n\n    if (0 != errcode)\n    {\n        OVR::LogError(\"getaddrinfo error: %s\", gai_strerror(errcode));\n    }\n\n\tfor (aip = servinfo; aip != NULL; aip = aip->ai_next)\n\t{\n\t\t// Open socket. The address type depends on what\n\t\t// getaddrinfo() gave us.\n\t\tsock = socket(aip->ai_family, aip->ai_socktype, aip->ai_protocol);\n\t\tif (sock != 0)\n\t\t{\n            SetSocketOptions(sock);\n\t\t\tint ret = bind( sock, aip->ai_addr, (int) aip->ai_addrlen );\n\t\t\tif (ret>=0)\n\t\t\t{\n\t\t\t\t// The actual socket is always non-blocking\n\t\t\t\t// I control blocking or not using WSAEventSelect\n\t\t\t\t_Ioctlsocket(sock, 1);\n                freeaddrinfo(servinfo);\n\t\t\t\treturn sock;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tclose(sock);\n\t\t\t}\n\t\t}\n\t}\n\n    if (servinfo) { freeaddrinfo(servinfo); }\n\treturn INVALID_SOCKET;\n}\n\n\n//-----------------------------------------------------------------------------\n// UDPSocket\n\nUDPSocket::UDPSocket()\n{\n\tRecvBuf = new UByte[RecvBufSize];\n}\n\nUDPSocket::~UDPSocket()\n{\n\tdelete[] RecvBuf;\n}\n\nSocketHandle UDPSocket::Bind(BerkleyBindParameters *pBindParameters)\n{\n\tSocketHandle s = BindShared(AF_INET6, SOCK_DGRAM, pBindParameters);\n\tif (s < 0)\n\t\treturn s;\n\n\tClose();\n\tTheSocket = s;\n\n\treturn TheSocket;\n}\n\nvoid UDPSocket::OnRecv(SocketEvent_UDP* eventHandler, UByte* pData, int bytesRead, SockAddr* address)\n{\n\teventHandler->UDP_OnRecv(this, pData, bytesRead, address);\n}\n\nint UDPSocket::Send(const void* pData, int bytes, SockAddr* address)\n{\n    // NOTE: This should be OVR_OS_BSD\n#ifdef OVR_OS_MAC\n    int flags = 0;\n#else\n    int flags = MSG_NOSIGNAL;\n#endif\n\n\treturn (int)sendto(TheSocket, (const char*)pData, bytes, flags, (const sockaddr*)&address->Addr6, sizeof(address->Addr6));\n}\n\nvoid UDPSocket::Poll(SocketEvent_UDP *eventHandler)\n{\n\tstruct sockaddr_storage win32_addr;\n\tsocklen_t fromlen;\n\tint bytesRead;\n\n    // FIXME: Implement blocking poll wait for UDP\n\n\t// While some bytes are read,\n\twhile (fromlen = sizeof(win32_addr), // Must set fromlen each time\n\t\t   bytesRead = (int)recvfrom(TheSocket, (char*)RecvBuf, RecvBufSize, 0, (sockaddr*)&win32_addr, &fromlen),\n\t\t   bytesRead > 0)\n\t{\n\t\tSockAddr address(&win32_addr); // Wrap address\n\n\t\tOnRecv(eventHandler, RecvBuf, bytesRead, &address);\n\t}\n}\n\n\n//-----------------------------------------------------------------------------\n// TCPSocket\n\nTCPSocket::TCPSocket()\n{\n\tIsConnecting = false;\n\tIsListenSocket = false;\n}\nTCPSocket::TCPSocket(SocketHandle boundHandle, bool isListenSocket)\n{\n\tTheSocket = boundHandle;\n\tIsListenSocket = isListenSocket;\n\tIsConnecting = false;\n\n    if (TheSocket != INVALID_SOCKET)\n    {\n        SetSocketOptions(TheSocket);\n\n        // The actual socket is always non-blocking\n        _Ioctlsocket(TheSocket, 1);\n    }\n}\n\nTCPSocket::~TCPSocket()\n{\n}\n\nvoid TCPSocket::OnRecv(SocketEvent_TCP* eventHandler, UByte* pData, int bytesRead)\n{\n\teventHandler->TCP_OnRecv(this, pData, bytesRead);\n}\n\nSocketHandle TCPSocket::Bind(BerkleyBindParameters* pBindParameters)\n{\t\n\tSocketHandle s = BindShared(AF_INET6, SOCK_STREAM, pBindParameters);\n\tif (s < 0)\n\t\treturn s;\n\n\tClose();\n\n    SetBlockingTimeout(pBindParameters->blockingTimeout);\n    TheSocket = s;\n\n\treturn TheSocket;\n}\n\nint TCPSocket::Listen()\n{\n    if (IsListenSocket)\n    {\n        return 0;\n    }\n\n\tint i = listen(TheSocket, SOMAXCONN);\n\tif (i >= 0)\n\t{\n\t\tIsListenSocket = true;\n\t}\n\n\treturn i;\n}\n\nint TCPSocket::Connect(SockAddr* address)\n{\n\tint retval;\n\n\tretval = connect(TheSocket, (struct sockaddr *) &address->Addr6, sizeof(address->Addr6));\n\tif (retval < 0)\n\t{\n\t\tint errsv = errno;\n        // EINPROGRESS should not be checked on windows but should\n        // be checked on POSIX platforms.\n\t\tif (errsv == EWOULDBLOCK || errsv == EINPROGRESS)\n\t\t{\n            IsConnecting = true;\n            return 0;\n\t\t}\n\n\t\tOVR::LogText( \"TCPSocket::Connect failed:Error code - %d\\n\", errsv );\n\t}\n\n\treturn retval;\n}\n\nint TCPSocket::Send(const void* pData, int bytes)\n{\n\tif (bytes <= 0)\n\t{\n\t\treturn 0;\n\t}\n\telse\n\t{\n\t\treturn (int)send(TheSocket, (const char*)pData, bytes, 0);\n\t}\n}\n\n\n//// TCPSocketPollState\n\nTCPSocketPollState::TCPSocketPollState()\n{\n    FD_ZERO(&readFD);\n    FD_ZERO(&exceptionFD);\n    FD_ZERO(&writeFD);\n    largestDescriptor = INVALID_SOCKET;\n}\n\nbool TCPSocketPollState::IsValid() const\n{\n    return largestDescriptor != INVALID_SOCKET;\n}\n\nvoid TCPSocketPollState::Add(TCPSocket* tcpSocket)\n{\n    if (!tcpSocket)\n    {\n        return;\n    }\n\n    SocketHandle handle = tcpSocket->GetSocketHandle();\n\n    if (handle == INVALID_SOCKET)\n    {\n        return;\n    }\n\n    if (largestDescriptor == INVALID_SOCKET ||\n        largestDescriptor < handle)\n    {\n        largestDescriptor = handle;\n    }\n\n    FD_SET(handle, &readFD);\n    FD_SET(handle, &exceptionFD);\n\n    if (tcpSocket->IsConnecting)\n    {\n        FD_SET(handle, &writeFD);\n    }\n}\n\nbool TCPSocketPollState::Poll(long usec, long seconds)\n{\n    timeval tv;\n    tv.tv_sec = seconds;\n    tv.tv_usec = (int)usec;\n\n    return select(largestDescriptor + 1, &readFD, &writeFD, &exceptionFD, &tv) > 0;\n}\n\nvoid TCPSocketPollState::HandleEvent(TCPSocket* tcpSocket, SocketEvent_TCP* eventHandler)\n{\n    if (!tcpSocket || !eventHandler)\n    {\n        return;\n    }\n\n    SocketHandle handle = tcpSocket->GetSocketHandle();\n\n    if (tcpSocket->IsConnecting && FD_ISSET(handle, &writeFD))\n    {\n        tcpSocket->IsConnecting = false;\n        eventHandler->TCP_OnConnected(tcpSocket);\n    }\n\n    if (FD_ISSET(handle, &readFD))\n    {\n        if (!tcpSocket->IsListenSocket)\n        {\n            static const int BUFF_SIZE = 8096;\n            char data[BUFF_SIZE];\n\n            int bytesRead = (int)recv(handle, data, BUFF_SIZE, 0);\n            if (bytesRead > 0)\n            {\n                tcpSocket->OnRecv(eventHandler, (UByte*)data, bytesRead);\n            }\n            else // Disconnection event:\n            {\n                tcpSocket->IsConnecting = false;\n                eventHandler->TCP_OnClosed(tcpSocket);\n            }\n        }\n        else\n        {\n            struct sockaddr_storage sockAddr;\n            socklen_t sockAddrSize = sizeof(sockAddr);\n\n            SocketHandle newSock = accept(handle, (sockaddr*)&sockAddr, (socklen_t*)&sockAddrSize);\n            if (newSock > 0)\n            {\n                SockAddr sa(&sockAddr);\n                eventHandler->TCP_OnAccept(tcpSocket, &sa, newSock);\n            }\n        }\n    }\n\n    if (FD_ISSET(handle, &exceptionFD))\n    {\n        tcpSocket->IsConnecting = false;\n        eventHandler->TCP_OnClosed(tcpSocket);\n    }\n}\n\n\n}} // namespace OVR::Net\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Net/OVR_Unix_Socket.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_Unix_Socket.h\nContent     :   Berkley sockets networking implementation\nCreated     :   July 1, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Unix_Socket_h\n#define OVR_Unix_Socket_h\n\n#include \"OVR_Socket.h\"\n#include \"OVR_BitStream.h\"\n\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <netdb.h>\n#include <fcntl.h>\n\nnamespace OVR { namespace Net { \n\n//-----------------------------------------------------------------------------\n// SockAddr\n\n// Abstraction for IPV6 socket address, with various convenience functions\nclass SockAddr\n{\npublic:\n\tSockAddr();\n\tSockAddr(SockAddr* sa);\n\tSockAddr(sockaddr_storage* sa);\n\tSockAddr(sockaddr_in6* sa);\n\tSockAddr(const char* hostAddress, UInt16 port, int sockType);\n\npublic:\n\tvoid   Set(const sockaddr_storage* sa);\n\tvoid   Set(const sockaddr_in6* sa);\n\tvoid   Set(const char* hostAddress, UInt16 port, int sockType); // SOCK_DGRAM or SOCK_STREAM\n\n\tUInt16 GetPort();\n\n    String ToString(bool writePort, char portDelineator) const;\n\n    bool   IsLocalhost() const;\n\n\tvoid   Serialize(BitStream* bs);\n\tbool   Deserialize(BitStream);\n\n\tbool   operator==( const SockAddr& right ) const;\n\tbool   operator!=( const SockAddr& right ) const;\n\tbool   operator >( const SockAddr& right ) const;\n\tbool   operator <( const SockAddr& right ) const;\n\npublic:\n\tsockaddr_in6 Addr6;\n};\n\n\n//-----------------------------------------------------------------------------\n// UDP Socket\n\n// Windows version of TCP socket\nclass UDPSocket : public UDPSocketBase\n{\npublic:\n\tUDPSocket();\n\tvirtual ~UDPSocket();\n\npublic:\n\tvirtual SocketHandle Bind(BerkleyBindParameters* pBindParameters);\n\tvirtual int          Send(const void* pData, int bytes, SockAddr* address);\n\tvirtual void         Poll(SocketEvent_UDP* eventHandler);\n\nprotected:\n\tstatic const int RecvBufSize = 1048576;\n\tUByte* RecvBuf;\n\n\tvirtual void         OnRecv(SocketEvent_UDP* eventHandler, UByte* pData,\n\t\t\t\t\t\t\t\tint bytesRead, SockAddr* address);\n};\n\n\n//-----------------------------------------------------------------------------\n// TCP Socket\n\n// Windows version of TCP socket\nclass TCPSocket : public TCPSocketBase\n{\n    friend class TCPSocketPollState;\n\npublic:\n\tTCPSocket();\n\tTCPSocket(SocketHandle boundHandle, bool isListenSocket);\n\tvirtual ~TCPSocket();\n\npublic:\n\tvirtual SocketHandle Bind(BerkleyBindParameters* pBindParameters);\n\tvirtual int          Listen();\n\tvirtual int          Connect(SockAddr* address);\n\tvirtual int          Send(const void* pData, int bytes);\n\nprotected:\n\tvirtual void         OnRecv(SocketEvent_TCP* eventHandler, UByte* pData,\n\t\t\t\t\t\t\t\tint bytesRead);\n\npublic:\n\tbool IsConnecting; // Is in the process of connecting?\n};\n\n\n//-----------------------------------------------------------------------------\n// TCPSocketPollState\n\n// Polls multiple blocking TCP sockets at once\nclass TCPSocketPollState\n{\n    fd_set readFD, exceptionFD, writeFD;\n    SocketHandle largestDescriptor;\n\npublic:\n    TCPSocketPollState();\n    bool IsValid() const;\n    void Add(TCPSocket* tcpSocket);\n    bool Poll(long usec = 30000, long seconds = 0);\n    void HandleEvent(TCPSocket* tcpSocket, SocketEvent_TCP* eventHandler);\n};\n\n\n}} // OVR::Net\n\n#endif\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Net/OVR_Win32_Socket.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Win32_Socket.cpp\nContent     :   Windows-specific socket-based networking implementation\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_Win32_Socket.h\"\n#include \"Kernel/OVR_Std.h\"\n#include \"Kernel/OVR_Allocator.h\"\n#include \"Kernel/OVR_Threads.h\" // Thread::MSleep\n#include \"Kernel/OVR_Log.h\"\n\n#include <Winsock2.h>\n#pragma comment(lib, \"ws2_32.lib\")\n\nnamespace OVR { namespace Net {\n\n\n//-----------------------------------------------------------------------------\n// WSAStartupSingleton\n\nclass WSAStartupSingleton\n{\npublic:\n\tstatic void AddRef(void);\n\tstatic void Deref(void);\n\nprotected:\n\tstatic int RefCount;\n};\n\n\n// Local data\nint WSAStartupSingleton::RefCount = 0;\n\n\n// Implementation\nvoid WSAStartupSingleton::AddRef()\n{\n\tif (++RefCount == 1)\n\t{\n\t\tWSADATA winsockInfo;\n\t\tconst int errCode = WSAStartup(MAKEWORD(2, 2), &winsockInfo);\n\t\tOVR_ASSERT(errCode == 0);\n\n\t\t// If an error code is returned\n\t\tif (errCode != 0)\n\t\t{\n\t\t\tLogError(\"{ERR-007w} [Socket] Unable to initialize Winsock %d\", errCode);\n\t\t}\n\t}\n}\n\nvoid WSAStartupSingleton::Deref()\n{\n\tOVR_ASSERT(RefCount > 0);\n\n\tif (RefCount > 0)\n\t{\n\t\tif (--RefCount == 0)\n\t\t{\n\t\t\tWSACleanup();\n\t\t\tRefCount = 0;\n\t\t}\n\t}\n}\n\n\n//-----------------------------------------------------------------------------\n// BerkleySocket\n\nvoid BerkleySocket::Close()\n{\n\tif (TheSocket != INVALID_SOCKET)\n\t{\n\t\tclosesocket(TheSocket);\n\t\tTheSocket = INVALID_SOCKET;\n\t}\n}\n\nint32_t BerkleySocket::GetSockname(SockAddr *pSockAddrOut)\n{\n\tstruct sockaddr_in6 sa;\n\tmemset(&sa,0,sizeof(sa));\n\tint size = sizeof(sa);\n\tint32_t i = getsockname(TheSocket, (sockaddr*) &sa, &size);\n\tif (i>=0)\n\t{\n\t\tpSockAddrOut->Set(&sa);\n\t}\n\treturn i;\n}\n\n\n//-----------------------------------------------------------------------------\n// BitStream overloads for SockAddr\n\nBitStream& operator<<(BitStream& out, SockAddr& in)\n{\n\tout.WriteBits((const unsigned char*) &in.Addr6, sizeof(in.Addr6)*8, true);\n\treturn out;\n}\n\nBitStream& operator>>(BitStream& in, SockAddr& out)\n{\n\tbool success = in.ReadBits((unsigned char*) &out.Addr6, sizeof(out.Addr6)*8, true);\n\tOVR_ASSERT(success);\n\tOVR_UNUSED(success);\n\treturn in;\n}\n\n\n//-----------------------------------------------------------------------------\n// SockAddr\n\nSockAddr::SockAddr()\n{\n\tWSAStartupSingleton::AddRef();\n\n    // Zero out the address to squelch static analysis tools\n    ZeroMemory(&Addr6, sizeof(Addr6));\n}\n\nSockAddr::SockAddr(SockAddr* address)\n{\n\tWSAStartupSingleton::AddRef();\n\tSet(&address->Addr6);\n}\n\nSockAddr::SockAddr(sockaddr_storage* storage)\n{\n\tWSAStartupSingleton::AddRef();\n\tSet(storage);\n}\n\nSockAddr::SockAddr(sockaddr_in6* address)\n{\n\tWSAStartupSingleton::AddRef();\n\tSet(address);\n}\n\nSockAddr::SockAddr(const char* hostAddress, uint16_t port, int sockType)\n{\n\tWSAStartupSingleton::AddRef();\n\tSet(hostAddress, port, sockType);\n}\n\nvoid SockAddr::Set(const sockaddr_storage* storage)\n{\n\tmemcpy(&Addr6, storage, sizeof(Addr6));\n}\n\nvoid SockAddr::Set(const sockaddr_in6* address)\n{\n\tmemcpy(&Addr6, address, sizeof(Addr6));\n}\n\nvoid SockAddr::Set(const char* hostAddress, uint16_t port, int sockType)\n{\n\tmemset(&Addr6, 0, sizeof(Addr6));\n\n\tstruct addrinfo hints;\n\n\t// make sure the struct is empty\n\tmemset(&hints, 0, sizeof (addrinfo));\n\n\thints.ai_socktype = sockType; // SOCK_DGRAM or SOCK_STREAM\n\thints.ai_flags = AI_PASSIVE;     // fill in my IP for me\n\thints.ai_family = AF_UNSPEC ;\n\n    // FIXME See OVR_Unix_Socket implementation and man pages for getaddrinfo.\n    //       ai_protocol is expecting to be either IPPROTO_UDP and IPPROTO_TCP.\n    //       But this has been working on windows so I'm leaving it be for\n    //       now instead of introducing another variable.\n\thints.ai_protocol = IPPROTO_IPV6;\n\n    struct addrinfo* servinfo = NULL;  // will point to the results\n\n\tchar portStr[32];\n\tOVR_itoa(port, portStr, sizeof(portStr), 10);\n\tint errcode = getaddrinfo(hostAddress, portStr, &hints, &servinfo);\n\n    if (0 != errcode)\n    {\n        OVR::LogError(\"{ERR-008w} getaddrinfo error: %s\", gai_strerror(errcode));\n    }\n\n    OVR_ASSERT(servinfo);\n\n    if (servinfo)\n    {\n        memcpy(&Addr6, servinfo->ai_addr, sizeof(Addr6));\n\n        freeaddrinfo(servinfo);\n    }\n}\n\nuint16_t SockAddr::GetPort()\n{\n\treturn htons(Addr6.sin6_port);\n}\n\nString SockAddr::ToString(bool writePort, char portDelineator) const\n{\n    char dest[INET6_ADDRSTRLEN + 1];\n\n\tint ret = getnameinfo((struct sockaddr*)&Addr6,\n\t\t\t\t\t\t  sizeof(struct sockaddr_in6),\n\t\t\t\t\t\t  dest,\n\t\t\t\t\t\t  INET6_ADDRSTRLEN,\n\t\t\t\t\t\t  NULL,\n\t\t\t\t\t\t  0,\n\t\t\t\t\t\t  NI_NUMERICHOST);\n\tif (ret != 0)\n\t{\n\t\tdest[0] = '\\0';\n\t}\n\n\tif (writePort)\n\t{\n\t\tunsigned char ch[2];\n\t\tch[0]=portDelineator;\n\t\tch[1]=0;\n\t\tOVR_strcat(dest, 16, (const char*) ch);\n\t\tOVR_itoa(ntohs(Addr6.sin6_port), dest+strlen(dest), 16, 10);\n\t}\n\n    return String(dest);\n}\nbool SockAddr::IsLocalhost() const\n{\n    static const unsigned char localhost_bytes[] =\n    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };\n\n    return memcmp(Addr6.sin6_addr.s6_addr, localhost_bytes, 16) == 0;\n}\nbool SockAddr::operator==( const SockAddr& right ) const\n{\n\treturn memcmp(&Addr6, &right.Addr6, sizeof(Addr6)) == 0;\n}\n\nbool SockAddr::operator!=( const SockAddr& right ) const\n{\n\treturn !(*this == right);\n}\n\nbool SockAddr::operator>( const SockAddr& right ) const\n{\n\treturn memcmp(&Addr6, &right.Addr6, sizeof(Addr6)) > 0;\n}\n\nbool SockAddr::operator<( const SockAddr& right ) const\n{\n\treturn memcmp(&Addr6, &right.Addr6, sizeof(Addr6)) < 0;\n}\n\nstatic bool SetSocketOptions(SocketHandle sock)\n{\n    int result = 0;\n\tint sock_opt;\n\n\t// This doubles the max throughput rate\n    sock_opt = 1024 * 256;\n    result |= setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)& sock_opt, sizeof (sock_opt));\n\n\t// Immediate hard close. Don't linger the socket, or recreating the socket quickly on Vista fails.\n    sock_opt = 0;\n    result |= setsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)& sock_opt, sizeof (sock_opt));\n\n\t// This doesn't make much difference: 10% maybe\n    sock_opt = 1024 * 16;\n    result |= setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)& sock_opt, sizeof (sock_opt));\n\n    // If all the setsockopt() returned 0 there were no failures, so return true for success, else false\n    return result == 0;\n}\n\nvoid _Ioctlsocket(SocketHandle sock, unsigned long nonblocking)\n{\n    ioctlsocket(sock, FIONBIO, &nonblocking);\n}\n\nstatic SocketHandle BindShared(int ai_family, int ai_socktype, BerkleyBindParameters* pBindParameters)\n{\n\tSocketHandle sock;\n\n\tstruct addrinfo hints;\n\tmemset(&hints, 0, sizeof (addrinfo)); // make sure the struct is empty\n\thints.ai_family = ai_family;\n\thints.ai_socktype = ai_socktype;\n\thints.ai_flags = AI_PASSIVE;     // fill in my IP for me\n\tstruct addrinfo *servinfo=0, *aip;  // will point to the results\n\tchar portStr[32];\n\tOVR_itoa(pBindParameters->Port, portStr, sizeof(portStr), 10);\n\n    int errcode = 0;\n\tif (!pBindParameters->Address.IsEmpty())\n\t\terrcode = getaddrinfo(pBindParameters->Address.ToCStr(), portStr, &hints, &servinfo);\n\telse\n\t\terrcode = getaddrinfo(0, portStr, &hints, &servinfo);\n\n    if (0 != errcode)\n    {\n        OVR::LogError(\"{ERR-020w} getaddrinfo error: %s\", gai_strerror(errcode));\n    }\n\n\tfor (aip = servinfo; aip != NULL; aip = aip->ai_next)\n\t{\n\t\t// Open socket. The address type depends on what\n\t\t// getaddrinfo() gave us.\n\t\tsock = socket(aip->ai_family, aip->ai_socktype, aip->ai_protocol);\n        if (sock != INVALID_SOCKET)\n\t\t{\n            if (bind(sock, aip->ai_addr, (int)aip->ai_addrlen) != SOCKET_ERROR)\n\t\t\t{\n\t\t\t\t// The actual socket is always non-blocking\n\t\t\t\t// I control blocking or not using WSAEventSelect\n\t\t\t\t_Ioctlsocket(sock, 1);\n                freeaddrinfo(servinfo);\n\t\t\t\treturn sock;\n\t\t\t}\n\n            closesocket(sock);\n        }\n\t}\n\n    if (servinfo) { freeaddrinfo(servinfo); }\n\treturn INVALID_SOCKET;\n}\n\n\n//-----------------------------------------------------------------------------\n// UDPSocket\n\nUDPSocket::UDPSocket()\n{\n\tWSAStartupSingleton::AddRef();\n\tRecvBuf = new uint8_t[RecvBufSize];\n}\n\nUDPSocket::~UDPSocket()\n{\n\tWSAStartupSingleton::Deref();\n\tdelete[] RecvBuf;\n}\n\nSocketHandle UDPSocket::Bind(BerkleyBindParameters *pBindParameters)\n{\n\tSocketHandle s = BindShared(AF_INET6, SOCK_DGRAM, pBindParameters);\n\tif (s == INVALID_SOCKET)\n\t\treturn s;\n\n\tClose();\n\tTheSocket = s;\n\tSetSocketOptions(TheSocket);\n\n\treturn TheSocket;\n}\n\nvoid UDPSocket::OnRecv(SocketEvent_UDP* eventHandler, uint8_t* pData, int bytesRead, SockAddr* address)\n{\n\teventHandler->UDP_OnRecv(this, pData, bytesRead, address);\n}\n\nint UDPSocket::Send(const void* pData, int bytes, SockAddr* address)\n{\n\treturn sendto(TheSocket, (const char*)pData, bytes, 0, (const sockaddr*)&address->Addr6, sizeof(address->Addr6));\n}\n\nvoid UDPSocket::Poll(SocketEvent_UDP *eventHandler)\n{\n\tstruct sockaddr_storage win32_addr;\n\tsocklen_t fromlen;\n\tint bytesRead;\n\n    // FIXME: Implement blocking poll wait for UDP\n\n\t// While some bytes are read,\n\twhile (fromlen = sizeof(win32_addr), // Must set fromlen each time\n\t\t   bytesRead = recvfrom(TheSocket, (char*)RecvBuf, RecvBufSize, 0, (sockaddr*)&win32_addr, &fromlen),\n\t\t   bytesRead > 0)\n\t{\n\t\tSockAddr address(&win32_addr); // Wrap address\n\n\t\tOnRecv(eventHandler, RecvBuf, bytesRead, &address);\n\t}\n}\n\n\n//-----------------------------------------------------------------------------\n// TCPSocket\n\nTCPSocket::TCPSocket()\n{\n\tIsConnecting = false;\n\tIsListenSocket = false;\n\tWSAStartupSingleton::AddRef();\n}\n\nTCPSocket::TCPSocket(SocketHandle boundHandle, bool isListenSocket)\n{\n\tTheSocket = boundHandle;\n\tIsListenSocket = isListenSocket;\n\tIsConnecting = false;\n\tWSAStartupSingleton::AddRef();\n\n    if (TheSocket != INVALID_SOCKET)\n    {\n        SetSocketOptions(TheSocket);\n\n        // The actual socket is always non-blocking\n        _Ioctlsocket(TheSocket, 1);\n    }\n}\n\nTCPSocket::~TCPSocket()\n{\n\tWSAStartupSingleton::Deref();\n}\n\nvoid TCPSocket::OnRecv(SocketEvent_TCP* eventHandler, uint8_t* pData, int bytesRead)\n{\n\teventHandler->TCP_OnRecv(this, pData, bytesRead);\n}\n\nSocketHandle TCPSocket::Bind(BerkleyBindParameters* pBindParameters)\n{\t\n\tSocketHandle s = BindShared(AF_INET6, SOCK_STREAM, pBindParameters);\n\tif (s == INVALID_SOCKET)\n\t\treturn s;\n\n\tClose();\n\n    SetBlockingTimeout(pBindParameters->blockingTimeout);\n    TheSocket = s;\n\n    SetSocketOptions(TheSocket);\n\n\treturn TheSocket;\n}\n\nint TCPSocket::Listen()\n{\n    if (IsListenSocket)\n    {\n        return 0;\n    }\n\n\tint i = listen(TheSocket, SOMAXCONN);\n\tif (i >= 0)\n\t{\n\t\tIsListenSocket = true;\n\t}\n\n\treturn i;\n}\n\nint TCPSocket::Connect(SockAddr* address)\n{\n\tint retval;\n\n\tretval = connect(TheSocket, (struct sockaddr *) &address->Addr6, sizeof(address->Addr6));\n\tif (retval < 0)\n\t{\n\t\tDWORD dwIOError = WSAGetLastError();\n\t\tif (dwIOError == WSAEWOULDBLOCK)\n\t\t{\n            IsConnecting = true;\n            return 0;\n\t\t}\n\n\t\tLogError(\"[TCPSocket] ERROR: Connect failed. Error code - %d\", (int)dwIOError);\n\t}\n\n\treturn retval;\n}\n\nint TCPSocket::Send(const void* pData, int bytes)\n{\n\tif (bytes <= 0)\n\t{\n\t\treturn 0;\n\t}\n\telse\n\t{\n\t\treturn send(TheSocket, (const char*)pData, bytes, 0);\n\t}\n}\n\n\n//// TCPSocketPollState\n\nTCPSocketPollState::TCPSocketPollState()\n{\n    memset(&readFD, 0, sizeof(readFD));\n    memset(&exceptionFD, 0, sizeof(exceptionFD));\n    memset(&writeFD, 0, sizeof(writeFD));\n\n    FD_ZERO(&readFD);\n    FD_ZERO(&exceptionFD);\n    FD_ZERO(&writeFD);\n    largestDescriptor = INVALID_SOCKET;\n}\n\nbool TCPSocketPollState::IsValid() const\n{\n    return largestDescriptor != INVALID_SOCKET;\n}\n\nvoid TCPSocketPollState::Add(TCPSocket* tcpSocket)\n{\n    if (!tcpSocket)\n    {\n        return;\n    }\n\n    SocketHandle handle = tcpSocket->GetSocketHandle();\n\n    if (largestDescriptor == INVALID_SOCKET ||\n        largestDescriptor < handle)\n    {\n        largestDescriptor = handle;\n    }\n\n    FD_SET(handle, &readFD);\n    FD_SET(handle, &exceptionFD);\n\n    if (tcpSocket->IsConnecting)\n    {\n        FD_SET(handle, &writeFD);\n    }\n}\n\nbool TCPSocketPollState::Poll(long usec, long seconds)\n{\n    timeval tv;\n    tv.tv_sec = seconds;\n    tv.tv_usec = usec;\n\n    return (int)select((int)largestDescriptor + 1, &readFD, &writeFD, &exceptionFD, &tv) > 0;\n}\n\nvoid TCPSocketPollState::HandleEvent(TCPSocket* tcpSocket, SocketEvent_TCP* eventHandler)\n{\n    if (!tcpSocket || !eventHandler)\n    {\n        return;\n    }\n\n    SocketHandle handle = tcpSocket->GetSocketHandle();\n\n    if (tcpSocket->IsConnecting && FD_ISSET(handle, &writeFD))\n    {\n        tcpSocket->IsConnecting = false;\n        eventHandler->TCP_OnConnected(tcpSocket);\n    }\n\n    if (FD_ISSET(handle, &readFD))\n    {\n        if (!tcpSocket->IsListenSocket)\n        {\n            static const int BUFF_SIZE = 8096;\n            char data[BUFF_SIZE];\n\n            int bytesRead = recv(handle, data, BUFF_SIZE, 0);\n            if (bytesRead > 0)\n            {\n                tcpSocket->OnRecv(eventHandler, (uint8_t*)data, bytesRead);\n            }\n            else // Disconnection event:\n            {\n                tcpSocket->IsConnecting = false;\n                eventHandler->TCP_OnClosed(tcpSocket);\n            }\n        }\n        else\n        {\n            struct sockaddr_storage sockAddr;\n            socklen_t sockAddrSize = sizeof(sockAddr);\n\n            SocketHandle newSock = accept(handle, (sockaddr*)&sockAddr, (socklen_t*)&sockAddrSize);\n            if (newSock != INVALID_SOCKET)\n            {\n                SockAddr sa(&sockAddr);\n                eventHandler->TCP_OnAccept(tcpSocket, &sa, newSock);\n            }\n        }\n    }\n\n    if (FD_ISSET(handle, &exceptionFD))\n    {\n        tcpSocket->IsConnecting = false;\n        eventHandler->TCP_OnClosed(tcpSocket);\n    }\n}\n\n\n}} // namespace OVR::Net\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Net/OVR_Win32_Socket.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_Win32_Socket.h\nContent     :   Windows-specific socket-based networking implementation\nCreated     :   June 10, 2014\nAuthors     :   Kevin Jenkins\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Win32_Socket_h\n#define OVR_Win32_Socket_h\n\n#include \"OVR_Socket.h\"\n#include \"OVR_BitStream.h\"\n\n#include <WinSock2.h>\n#include <WS2tcpip.h>\n#include \"Kernel/OVR_Win32_IncludeWindows.h\"\n#include <io.h>\n\nnamespace OVR { namespace Net { \n\n\n//-----------------------------------------------------------------------------\n// SockAddr\n\n// Abstraction for IPV6 socket address, with various convenience functions\nclass SockAddr\n{\npublic:\n\tSockAddr();\n\tSockAddr(SockAddr* sa);\n\tSockAddr(sockaddr_storage* sa);\n\tSockAddr(sockaddr_in6* sa);\n\tSockAddr(const char* hostAddress, uint16_t port, int sockType);\n\npublic:\n\tvoid   Set(const sockaddr_storage* sa);\n\tvoid   Set(const sockaddr_in6* sa);\n\tvoid   Set(const char* hostAddress, uint16_t port, int sockType); // SOCK_DGRAM or SOCK_STREAM\n\n\tuint16_t GetPort();\n\n\tString ToString(bool writePort, char portDelineator) const;\n    bool IsLocalhost() const;\n\n\tvoid   Serialize(BitStream* bs);\n\tbool   Deserialize(BitStream);\n\n\tbool   operator==( const SockAddr& right ) const;\n\tbool   operator!=( const SockAddr& right ) const;\n\tbool   operator >( const SockAddr& right ) const;\n\tbool   operator <( const SockAddr& right ) const;\n\npublic:\n\tsockaddr_in6 Addr6;\n};\n\n\n//-----------------------------------------------------------------------------\n// UDP Socket\n\n// Windows version of TCP socket\nclass UDPSocket : public UDPSocketBase\n{\npublic:\n\tUDPSocket();\n\tvirtual ~UDPSocket();\n\npublic:\n\tvirtual SocketHandle Bind(BerkleyBindParameters* pBindParameters);\n\tvirtual int          Send(const void* pData, int bytes, SockAddr* address);\n\tvirtual void         Poll(SocketEvent_UDP* eventHandler);\n\nprotected:\n\tstatic const int RecvBufSize = 1048576;\n\tuint8_t* RecvBuf;\n\n\tvirtual void         OnRecv(SocketEvent_UDP* eventHandler, uint8_t* pData,\n\t\t\t\t\t\t\t\tint bytesRead, SockAddr* address);\n};\n\n\n//-----------------------------------------------------------------------------\n// TCP Socket\n\n// Windows version of TCP socket\nclass TCPSocket : public TCPSocketBase\n{\n    friend class TCPSocketPollState;\n\npublic:\n\tTCPSocket();\n\tTCPSocket(SocketHandle boundHandle, bool isListenSocket);\n\tvirtual ~TCPSocket();\n\npublic:\n\tvirtual SocketHandle Bind(BerkleyBindParameters* pBindParameters);\n\tvirtual int          Listen();\n\tvirtual int          Connect(SockAddr* address);\n\tvirtual int          Send(const void* pData, int bytes);\n\nprotected:\n\tvirtual void         OnRecv(SocketEvent_TCP* eventHandler, uint8_t* pData,\n\t\t\t\t\t\t\t\tint bytesRead);\n\npublic:\n\tbool IsConnecting; // Is in the process of connecting?\n};\n\n\n//-----------------------------------------------------------------------------\n// TCPSocketPollState\n\n// Polls multiple blocking TCP sockets at once\nclass TCPSocketPollState\n{\n    fd_set readFD, exceptionFD, writeFD;\n    SocketHandle largestDescriptor;\n\npublic:\n    TCPSocketPollState();\n    bool IsValid() const;\n    void Add(TCPSocket* tcpSocket);\n    bool Poll(long usec = 30000, long seconds = 0);\n    void HandleEvent(TCPSocket* tcpSocket, SocketEvent_TCP* eventHandler);\n};\n\n\n}} // OVR::Net\n\n#endif\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/OVR_CAPI.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_CAPI.cpp\nContent     :   Experimental simple C interface to the HMD - version 1.\nCreated     :   November 30, 2013\nAuthors     :   Michael Antonov\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_CAPI.h\"\n#include \"OVR_Version.h\"\n\n\n#include \"Kernel/OVR_Timer.h\"\n#include \"Kernel/OVR_System.h\"\n#include \"Kernel/OVR_DebugHelp.h\"\n#include \"Extras/OVR_Math.h\"\n#include \"OVR_Stereo.h\"\n#include \"OVR_Profile.h\"\n\n#include \"CAPI/CAPI_HMDState.h\"\n\n#include \"Net/OVR_Session.h\"\n#include \"Service/Service_NetClient.h\"\n#ifdef OVR_PRIVATE_FILE\n#include \"Service/Service_NetServer.h\"\n#endif\n\n#include \"Displays/OVR_Display.h\"\n\n#if defined(OVR_OS_WIN32)\n#include \"Displays/OVR_Win32_ShimFunctions.h\"\n#include <VersionHelpers.h>\n#endif\n\n// Forward decl to keep the callback static\n\n// Note: Removed CaptureHmdDescTrace from non-Win32 due to build warning.\n#if !defined(OVR_OS_MAC) && !defined(OVR_OS_LINUX)\nstatic bool CaptureHmdDescTrace(const OVR::CAPI::HMDState *state);\n#endif\n#define TRACE_STATE_CAPTURE_FUNC OVR::CAPI::HMDState::EnumerateHMDStateList(CaptureHmdDescTrace)\n#include \"Tracing/Tracing.h\"\n\n#if !defined(OVR_OS_MAC) && !defined(OVR_OS_LINUX)\n// EnumerateHMDStateList callback for tracing state capture\nstatic bool CaptureHmdDescTrace(const OVR::CAPI::HMDState* state)\n{\n    TraceHmdDesc(*state->pHmdDesc);\n    OVR_UNUSED(state); // Avoid potential compiler warnings.\n    return true;\n}\n#endif\n\n// Produce an invalid tracking state that will not mess up the application too badly.\nstatic ovrTrackingState GetNullTrackingState()\n{\n    ovrTrackingState nullState = ovrTrackingState();\n    nullState.HeadPose.ThePose.Orientation.w = 1.f; // Provide valid quaternions for head pose.\n    return nullState;\n}\n\n// Produce a null frame timing structure that will not break the calling application.\nstatic ovrFrameTiming GetNullFrameTiming()\n{\n    ovrFrameTiming nullTiming = ovrFrameTiming();\n    nullTiming.DeltaSeconds = 0.013f; // Provide nominal value\n    return nullTiming;\n}\n\n\nusing namespace OVR;\nusing namespace OVR::Util::Render;\nusing namespace OVR::Vision;\n\n//-------------------------------------------------------------------------------------\n// Math\nnamespace OVR {\n\n\n// ***** SensorDataType\n\nSensorDataType::SensorDataType(const ovrSensorData& s)\n{\n    Acceleration        = s.Accelerometer;\n    RotationRate        = s.Gyro;\n    MagneticField       = s.Magnetometer;\n    Temperature         = s.Temperature;\n    AbsoluteTimeSeconds = s.TimeInSeconds;\n}\n\nSensorDataType::operator ovrSensorData () const\n{\n    ovrSensorData result;\n    result.Accelerometer = Acceleration;\n    result.Gyro          = RotationRate;\n    result.Magnetometer  = MagneticField;\n    result.Temperature   = Temperature;\n    result.TimeInSeconds = (float)AbsoluteTimeSeconds;\n    return result;\n}\n\n\n\n\n// ***** SensorState\n\nTrackingState::TrackingState(const ovrTrackingState& s)\n{\n    HeadPose          = s.HeadPose;\n    CameraPose        = s.CameraPose;\n    LeveledCameraPose = s.LeveledCameraPose;\n    RawSensorData     = s.RawSensorData;\n    StatusFlags       = s.StatusFlags;\n}\n\nTrackingState::operator ovrTrackingState() const\n{\n    ovrTrackingState result;\n    result.HeadPose          = HeadPose;\n    result.CameraPose        = CameraPose;\n    result.LeveledCameraPose = LeveledCameraPose;\n    result.RawSensorData     = RawSensorData;\n    result.StatusFlags       = StatusFlags;\n    return result;\n}\n\n\n} // namespace OVR\n\n//-------------------------------------------------------------------------------------\n\nusing namespace OVR::CAPI;\n\n\n// Helper function to validate the HMD object provided by the API user.\nstatic HMDState* GetHMDStateFromOvrHmd(ovrHmd hmddesc)\n{\n    if (!hmddesc || !hmddesc->Handle)\n        return nullptr;\n\n    return (HMDState*)hmddesc->Handle;\n}\n\n\nOVR_PUBLIC_FUNCTION(double) ovr_GetTimeInSeconds()\n{\n    return Timer::GetSeconds();\n}\n\n\n//-------------------------------------------------------------------------------------\n\n// 1. Init/shutdown.\n\nstatic ovrBool CAPI_ovrInitializeCalled = ovrFalse;\nstatic OVR::Service::NetClient* CAPI_pNetClient = nullptr;\n\n\novrBool ovr_InitializeRenderingShim()\n{\n    OVR::Display::Initialize();\n\n    return OVR::Display::GetDirectDisplayInitialized();\n}\n\nOVR_PUBLIC_FUNCTION(ovrBool) ovr_InitializeRenderingShimVersion(int requestedMinorVersion)\n{\n    // We ignore the patch and build versions here, as they aren't relevant to compatibility.\n    // And we don't store them away here, as we do that in ovr_Initialize() instead.\n    \n    if (requestedMinorVersion > OVR_MINOR_VERSION)\n        return ovrFalse;\n\n    return ovr_InitializeRenderingShim();\n}\n\n// Write out to the log where the current running module is located on disk.\nstatic void LogLocationOfThisModule()\n{\n#if defined (OVR_OS_WIN32)\n    // Log out the DLL file path on startup.\n    {\n        bool success = false;\n\n        HMODULE hModule = nullptr;\n        GetModuleHandleEx(\n            GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,\n            (LPCTSTR)&ovr_Initialize,\n            &hModule);\n        if (hModule)\n        {\n            wchar_t filename[_MAX_PATH];\n            DWORD len = GetModuleFileNameW(hModule, filename, OVR_ARRAY_COUNT(filename));\n            if (len > 0 && filename[0])\n            {\n                success = true;\n                LogText(\"[CAPI] LibOVR module is located at %ws\\n\", filename);\n            }\n        }\n\n        if (!success)\n        {\n            LogError(\"[CAPI] WARNING: Unable to find LibOVR module.\");\n        }\n    }\n#endif // OVR_OS_WIN32\n}\n\n// These defaults are also in OVR_CAPIShim.c\nstatic const ovrInitParams DefaultParams = {\n    ovrInit_RequestVersion, // Flags\n    OVR_MINOR_VERSION,      // RequestedMinorVersion\n    0,                      // LogCallback\n    0                       // ConnectionTimeoutSeconds\n};\n\n// Precondition: params is not null\nOVR_PUBLIC_FUNCTION(ovrBool) ovr_Initialize(ovrInitParams const* params)\n{\n    // TBD: Should we check if the version requested changed and fail here?\n    if (CAPI_ovrInitializeCalled) // If already initialized...\n        return ovrTrue;\n\n    TraceInit();\n    TraceCall(0);\n\n    if (!params)\n    {\n        params = &DefaultParams;\n    }\n\n    bool DebugMode = (params->Flags & ovrInit_Debug) != 0;\n\n#if defined(OVR_BUILD_DEBUG)\n    // If no debug setting is provided,\n    if (!(params->Flags & (ovrInit_Debug | ovrInit_ForceNoDebug)))\n    {\n        DebugMode = true;\n    }\n#endif\n\n    // We ignore the requested patch version and build version, as they are not currently relevant to\n    // the library compatibility. Our test for minor version compatibility is currently simple: we support\n    // only older or equal minor versions, and don't change our behavior if the requested minor version\n    // is older than than OVR_MINOR_VERSION.\n\n    if ((params->Flags & ovrInit_RequestVersion) != 0 &&\n        (params->RequestedMinorVersion > OVR_MINOR_VERSION))\n    {\n        goto Abort;\n    }\n\n#if defined(OVR_OS_WIN32)\n    // Older than Windows 7 SP1?\n    if (!IsWindows7SP1OrGreater())\n    {\n        MessageBoxA(nullptr, \"This software depends on features available starting with \\nWindows 7 Service Pack 1, and it cannot start.\", \"LibOVR: Cannot start\", 0);\n        OVR_ASSERT(false);\n        goto Abort;\n    }\n#endif // OVR_OS_WIN32\n\n    OVR::Net::RuntimeSDKVersion.SetCurrent();  // Fill in the constant parts of this struct.\n    OVR::Net::RuntimeSDKVersion.RequestedMinorVersion = (uint16_t)params->RequestedMinorVersion;\n\n    // Initialize display subsystem regardless of Allocator initialization.\n    OVR::Display::Initialize();\n\n    // We must set up the system for the plugin to work\n    if (!OVR::System::IsInitialized())\n    {\n        // TBD: Base this on registry setting?\n        Allocator::SetLeakTracking(DebugMode);\n\n        OVR::Log* logger = OVR::Log::ConfigureDefaultLog(OVR::LogMask_All);\n\n        // Set the CAPI logger callback\n        logger->SetCAPICallback(params->LogCallback);\n\n        OVR::System::Init(logger);\n    }\n\n    if (!OVR::Display::GetDirectDisplayInitialized() && !OVR::Display::InCompatibilityMode(true))\n    {\n        OVR_ASSERT(false);\n        goto Abort;\n    }\n\n    CAPI_pNetClient = NetClient::GetInstance();\n\n    // Store off the initialization parameters from ovr_Initialize()\n    CAPI_pNetClient->ApplyParameters(params);\n\n    // Mark as initialized regardless of whether or not we can connect to the server.\n    CAPI_ovrInitializeCalled = 1;\n\n    // Log the location of the module after most of the bring-up, as the game\n    // could do almost anything in response to a log message callback.\n    LogLocationOfThisModule();\n\n    // If unable to connect to server and we are not in a debug mode,\n    if (!CAPI_pNetClient->Connect(true) && !DebugMode)\n    {\n        // Then it's a failure when the server is unreachable.\n        // This means that a DebugHMD cannot be created unless the ovrInit_Debug flag is set.\n        goto Abort;\n    }\n\n    // everything is okay\n    TraceReturn(0);\n    return ovrTrue;\n\nAbort:\n    // clean up and return failure\n    TraceReturn(0);\n    TraceFini();\n    return ovrFalse;\n}\n\n\nOVR_PUBLIC_FUNCTION(void) ovr_Shutdown()\n{  \n    if (CAPI_ovrInitializeCalled)\n    {\n        OVR::Display::Shutdown();\n        TraceCall(0);\n        TraceFini();\n        CAPI_ovrInitializeCalled = 0;\n    }\n\n    if (OVR::System::IsInitialized())\n    {\n        OVR::System::Destroy();\n    }\n\n    OVR::Net::RuntimeSDKVersion.Reset();\n    CAPI_pNetClient = nullptr;  // Not strictly necessary, but useful for debugging and cleanliness.\n}\n\n\n// There is a thread safety issue with ovrHmd_Detect in that multiple calls from different\n// threads can corrupt the global array state. This would lead to two problems:\n//  a) Create(index) enumerator may miss or overshoot items. Probably not a big deal\n//     as game logic can easily be written to only do Detect(s)/Creates in one place.\n//     The alternative would be to return list handle.\n//  b) TBD: Un-mutexed Detect access from two threads could lead to crash. We should\n//         probably check this.\n//\n\nOVR_PUBLIC_FUNCTION(int) ovrHmd_Detect()\n{\n    if (!CAPI_ovrInitializeCalled)\n        return -2;\n\n    return CAPI_pNetClient->Hmd_Detect();\n}\n\n\n// ovrHmd_Create us explicitly separated from ConfigureTracking and ConfigureRendering to allow creation of \n// a relatively light-weight handle that would reference the device going forward and would \n// survive future ovrHmd_Detect calls. That is once ovrHMD is returned, index is no longer\n// necessary and can be changed by a ovrHmd_Detect call.\nOVR_PUBLIC_FUNCTION(ovrHmd) ovrHmd_Create(int index)\n{\n    if (!CAPI_ovrInitializeCalled)\n        return 0;\n\n    double t0 = Timer::GetSeconds();\n    HMDNetworkInfo netInfo;\n\n    // There may be some delay before the HMD is fully detected.\n    // Since we are also trying to create the HMD immediately it may lose this race and\n    // get \"NO HMD DETECTED.\"  Wait a bit longer to avoid this.\n    while (!CAPI_pNetClient->Hmd_Create(index, &netInfo) ||\n           netInfo.NetId == InvalidVirtualHmdId)\n    {\n        double waitTime = 2.0; // Default wait time\n\n        if (NetClient::GetInstance()->IsConnected(false, false))\n        {\n            NetClient::GetInstance()->SetLastError(\"No HMD Detected\");\n\n            // If in single process mode,\n            if (Net::Session::IsSingleProcess())\n            {\n                // Wait 8 seconds for HMD to be detected, as this is a single process\n                // build and we expect that the operator has the system set up properly.\n                waitTime = 8.0;\n            }\n            else\n            {\n                // Wait 1/2 second for HMD to be detected.\n                waitTime = 0.5;\n            }\n        }\n        else\n        {\n            NetClient::GetInstance()->SetLastError(\"Not connected to service\");\n\n            // Wait the default amount of time for the service to start up.\n        }\n\n        // If two seconds elapse and still no HMD detected,\n        if (Timer::GetSeconds() - t0 > waitTime)\n        {\n            return 0;\n        }\n    }\n\n    // Create HMD State object\n    HMDState* hmds = HMDState::CreateHMDState(CAPI_pNetClient, netInfo);\n    if (!hmds)\n    {\n        CAPI_pNetClient->Hmd_Release(netInfo.NetId);\n\n        NetClient::GetInstance()->SetLastError(\"Unable to create HMD state\");\n        return 0;\n    }\n\n    // Reset frame timing so that FrameTimeManager values are properly initialized in AppRendered mode.\n    ovrHmd_ResetFrameTiming(hmds->pHmdDesc, 0);\n\n    TraceHmdDesc(*hmds->pHmdDesc);\n\n    return hmds->pHmdDesc;\n}\n\n\nOVR_PUBLIC_FUNCTION(ovrBool) ovrHmd_AttachToWindow(ovrHmd hmddesc, void* window,\n                                                   const ovrRecti* destMirrorRect,\n                                                   const ovrRecti* sourceRenderTargetRect)\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return ovrFalse;\n\n    OVR_UNUSED3(destMirrorRect, sourceRenderTargetRect, hmds);\n\n    if (!CAPI_ovrInitializeCalled)\n        return ovrFalse;\n\n#ifndef OVR_OS_MAC\n    CAPI_pNetClient->Hmd_AttachToWindow(hmds->GetNetId(), window);\n    hmds->pWindow = window;\n#endif\n#ifdef OVR_OS_WIN32\n    Win32::DisplayShim::GetInstance().hWindow = (HWND)window;\n#endif\n#ifdef OVR_OS_MAC\n    OVR_UNUSED(window);\n#endif\n\n    return ovrTrue;\n}\n\nOVR_PUBLIC_FUNCTION(ovrHmd) ovrHmd_CreateDebug(ovrHmdType type)\n{\n    if (!CAPI_ovrInitializeCalled)\n        return 0;\n\n    HMDState* hmds = HMDState::CreateDebugHMDState(type);\n    if (!hmds)\n        return nullptr;\n\n    return hmds->pHmdDesc;\n}\n\nOVR_PUBLIC_FUNCTION(void) ovrHmd_Destroy(ovrHmd hmddesc)\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return;\n\n    {   // Thread checker in its own scope, to avoid access after 'delete'.\n        // Essentially just checks that no other RenderAPI function is executing.\n        ThreadChecker::Scope checkScope(&hmds->RenderAPIThreadChecker, \"ovrHmd_Destroy\");\n    }    \n\n#ifdef OVR_OS_WIN32\n    if (hmds->pWindow)\n    {\n        // ? ok to call\n        //CAPI_pNetClient->Hmd_AttachToWindow(hmds->GetNetId(), 0);\n        hmds->pWindow = 0;\n        Win32::DisplayShim::GetInstance().hWindow = (HWND)0;\n    }    \n#endif\n\n    delete (HMDState*)hmddesc->Handle;\n}\n\n\nOVR_PUBLIC_FUNCTION(const char*) ovrHmd_GetLastError(ovrHmd hmddesc)\n{\n    if (!CAPI_ovrInitializeCalled)\n        return \"System initialize not called\";\n\n    VirtualHmdId netId = InvalidVirtualHmdId;\n\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (hmds)\n        netId = hmds->GetNetId();\n\n    return CAPI_pNetClient->Hmd_GetLastError(netId);\n}\n\n#define OVR_VERSION_LIBOVR_PFX \"libOVR:\"\n\n// Returns version string representing libOVR version. Static, so\n// string remains valid for app lifespan\nOVR_PUBLIC_FUNCTION(const char*) ovr_GetVersionString()\n{\n\tstatic const char* version = OVR_VERSION_LIBOVR_PFX OVR_VERSION_STRING;\n    return version + sizeof(OVR_VERSION_LIBOVR_PFX) - 1;\n}\n\n\n\n//-------------------------------------------------------------------------------------\n\n// Returns capability bits that are enabled at this time; described by ovrHmdCapBits.\n// Note that this value is different font ovrHmdDesc::Caps, which describes what\n// capabilities are available.\nOVR_PUBLIC_FUNCTION(unsigned int) ovrHmd_GetEnabledCaps(ovrHmd hmddesc)\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return 0;\n\n    return hmds->EnabledHmdCaps;\n}\n\n// Modifies capability bits described by ovrHmdCapBits that can be modified,\n// such as ovrHmdCap_LowPersistance.\nOVR_PUBLIC_FUNCTION(void) ovrHmd_SetEnabledCaps(ovrHmd hmddesc, unsigned int capsBits)\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return;\n\n    hmds->SetEnabledHmdCaps(capsBits);\n}\n\n\n//-------------------------------------------------------------------------------------\n// *** Sensor\n\n// Sensor APIs are separated from Create & Configure for several reasons:\n//  - They need custom parameters that control allocation of heavy resources\n//    such as Vision tracking, which you don't want to create unless necessary.\n//  - A game may want to switch some sensor settings based on user input, \n//    or at lease enable/disable features such as Vision for debugging.\n//  - The same or syntactically similar sensor interface is likely to be used if we \n//    introduce controllers.\n//\n//  - Sensor interface functions are all Thread-safe, unlike the frame/render API\n//    functions that have different rules (all frame access functions\n//    must be on render thread)\n\nOVR_PUBLIC_FUNCTION(ovrBool) ovrHmd_ConfigureTracking(ovrHmd hmddesc, unsigned int supportedCaps,\n                                                      unsigned int requiredCaps)\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return ovrFalse;\n\n    return hmds->ConfigureTracking(supportedCaps, requiredCaps) ? ovrTrue : ovrFalse;\n}\n\n\nOVR_PUBLIC_FUNCTION(void) ovrHmd_RecenterPose(ovrHmd hmddesc)\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return;\n\n    hmds->RecenterPose();\n}\n\nOVR_PUBLIC_FUNCTION(ovrTrackingState) ovrHmd_GetTrackingState(ovrHmd hmddesc, double absTime)\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return GetNullTrackingState();\n\n    return hmds->PredictedTrackingState(absTime);\n}\n\n\n\n\n\n//-------------------------------------------------------------------------------------\n// *** General Setup\n\n// Per HMD -> calculateIdealPixelSize\nOVR_PUBLIC_FUNCTION(ovrSizei) ovrHmd_GetFovTextureSize(ovrHmd hmddesc, ovrEyeType eye,\n                                                       ovrFovPort fov, float pixelsPerDisplayPixel)\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return Sizei(0);\n\n    return hmds->RenderState.GetFOVTextureSize(eye, fov, pixelsPerDisplayPixel);\n}\n\n\n//-------------------------------------------------------------------------------------\n\n\nOVR_PUBLIC_FUNCTION(ovrBool) ovrHmd_ConfigureRendering(ovrHmd hmddesc,\n                                                       const ovrRenderAPIConfig* apiConfig,\n                                                       unsigned int distortionCaps,\n                                                       const ovrFovPort eyeFovIn[2],\n                                                       ovrEyeRenderDesc eyeRenderDescOut[2])\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return ovrFalse;\n\n    return hmds->ConfigureRendering(eyeRenderDescOut, eyeFovIn,\n                                    apiConfig, distortionCaps);\n}\n\nOVR_PUBLIC_FUNCTION(ovrFrameTiming) ovrHmd_BeginFrame(ovrHmd hmddesc, unsigned int frameIndex)\n{\n    // NOTE: frameIndex == 0 is handled inside ovrHmd_BeginFrameTiming()\n\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return GetNullFrameTiming();\n\n    TraceCall(frameIndex);\n\n    // Check: Proper configure and threading state for the call.\n    hmds->checkRenderingConfigured(\"ovrHmd_BeginFrame\");\n    OVR_DEBUG_LOG_COND(hmds->BeginFrameCalled, (\"ovrHmd_BeginFrame called multiple times.\"));\n    ThreadChecker::Scope checkScope(&hmds->RenderAPIThreadChecker, \"ovrHmd_BeginFrame\");\n\n    hmds->BeginFrameCalled   = true;\n    hmds->BeginFrameThreadId = OVR::GetCurrentThreadId();\n\n    ovrFrameTiming timing = ovrHmd_BeginFrameTiming(hmddesc, frameIndex);\n\n    TraceReturn(frameIndex);\n\n    return timing;\n}\n\n\n// Renders textures to frame buffer\nOVR_PUBLIC_FUNCTION(void) ovrHmd_EndFrame(ovrHmd hmddesc,\n                                          const ovrPosef renderPose[2],\n                                          const ovrTexture eyeTexture[2])\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return;\n\n    const ovrTexture*        eyeDepthTexture = nullptr;\n    ovrPositionTimewarpDesc* posTimewarpDesc = nullptr;\n\n    TraceCall(hmds->BeginFrameIndex);\n\n    hmds->SubmitEyeTextures(renderPose, eyeTexture, eyeDepthTexture);\n\n    // Debug state checks: Must be in BeginFrame, on the same thread.\n    hmds->checkBeginFrameScope(\"ovrHmd_EndFrame\");\n    ThreadChecker::Scope checkScope(&hmds->RenderAPIThreadChecker, \"ovrHmd_EndFrame\");  \n    \n    hmds->pRenderer->SetLatencyTestColor(hmds->LatencyTestActive ? hmds->LatencyTestDrawColor : nullptr);\n\n    ovrHmd_GetLatencyTest2DrawColor(hmddesc, nullptr); // We don't actually need to draw color, so send nullptr\n    \n    if (hmds->pRenderer)\n    {\n        hmds->pRenderer->SaveGraphicsState();\n\n        // See if we need to show the HSWDisplay.\n        if (hmds->pHSWDisplay) // Until we know that these are valid, assume any of them can't be.\n        {\n            ovrHSWDisplayState hswDisplayState;\n            hmds->pHSWDisplay->TickState(&hswDisplayState, true);  // This may internally call HASWarning::Display.\n\n            if (hswDisplayState.Displayed)\n            {\n                hmds->pHSWDisplay->Render(ovrEye_Left, &eyeTexture[ovrEye_Left]);\n                hmds->pHSWDisplay->Render(ovrEye_Right, &eyeTexture[ovrEye_Right]);\n            }\n        }\n\n        if (posTimewarpDesc)\n            hmds->pRenderer->SetPositionTimewarpDesc(*posTimewarpDesc);\n\n        hmds->pRenderer->EndFrame(hmds->BeginFrameIndex, true);\n        hmds->pRenderer->RestoreGraphicsState();\n    }\n\n    // Call after present\n    ovrHmd_EndFrameTiming(hmddesc);\n\n    TraceReturn(hmds->BeginFrameIndex);\n\n    // Out of BeginFrame\n    hmds->BeginFrameThreadId = 0;\n    hmds->BeginFrameCalled   = false;\n    hmds->BeginFrameIndex++; // Set frame index to the next value in case 0 is passed.\n}\n\n// Not exposed as part of public API\nOVR_PUBLIC_FUNCTION(void) ovrHmd_RegisterPostDistortionCallback(ovrHmd hmddesc, PostDistortionCallback callback)\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds || !hmds->pRenderer)\n        return;\n\n    hmds->pRenderer->RegisterPostDistortionCallback(callback);\n}\n\n\n\n//-------------------------------------------------------------------------------------\n// ***** Frame Timing logic\n\nOVR_PUBLIC_FUNCTION(ovrFrameTiming) ovrHmd_GetFrameTiming(ovrHmd hmddesc, unsigned int frameIndex)\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return GetNullFrameTiming();\n\n    // If no frame index is provided,\n    if (frameIndex == 0)\n    {\n        // Use the next one in the series.\n        frameIndex = hmds->BeginFrameIndex;\n    }\n\n    return hmds->GetFrameTiming(frameIndex);\n}\n\nOVR_PUBLIC_FUNCTION(ovrFrameTiming) ovrHmd_BeginFrameTiming(ovrHmd hmddesc, unsigned int frameIndex)\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return GetNullFrameTiming();\n\n    // Check: Proper state for the call.    \n    OVR_DEBUG_LOG_COND(hmds->BeginFrameTimingCalled,\n                      (\"ovrHmd_BeginFrameTiming called multiple times.\"));    \n    hmds->BeginFrameTimingCalled = true;\n\n    // If a frame index is specified,\n    if (frameIndex != 0)\n    {\n        // Use the next one after the last BeginFrame() index.\n        hmds->BeginFrameIndex = (uint32_t)frameIndex;\n    }\n    else\n    {\n        frameIndex = hmds->BeginFrameIndex;\n    }\n\n    // Update latency tester once per frame\n    hmds->LatencyTestActive = hmds->ProcessLatencyTest(hmds->LatencyTestDrawColor);\n\n    if (!hmds->BeginFrameCalled)\n    {\n        hmds->TimewarpTimer.CalculateTimewarpTiming(frameIndex);\n    }\n\n    return hmds->GetFrameTiming(frameIndex);\n}\n\nOVR_PUBLIC_FUNCTION(void) ovrHmd_EndFrameTiming(ovrHmd hmddesc)\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return;\n\n    // Debug state checks: Must be in BeginFrameTiming, on the same thread.\n    hmds->checkBeginFrameTimingScope(\"ovrHmd_EndTiming\");\n   // MA TBD: Correct check or not?\n   // ThreadChecker::Scope checkScope(&hmds->RenderAPIThreadChecker, \"ovrHmd_EndFrame\");\n\n    hmds->BeginFrameTimingCalled = false;\n\n    hmds->endFrameRenderTiming();\n}\n\nOVR_PUBLIC_FUNCTION(void) ovrHmd_ResetFrameTiming(ovrHmd hmddesc, unsigned int frameIndex)\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return;\n\n    OVR_UNUSED(frameIndex);\n\n    // Clear timing-related state.\n    hmds->BeginFrameIndex = frameIndex;\n    hmds->TimewarpTimer.Reset();\n}\n\nOVR_PUBLIC_FUNCTION(void) ovrHmd_GetEyePoses(ovrHmd hmddesc, unsigned int frameIndex, const ovrVector3f hmdToEyeViewOffset[2],\n                                             ovrPosef outEyePoses[2], ovrTrackingState* outHmdTrackingState)\n{\n    if (!hmdToEyeViewOffset || !outEyePoses)\n    {\n        OVR_ASSERT(false);\n        return;\n    }\n\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n    {\n        outEyePoses[0] = ovrPosef(); outEyePoses[0].Orientation.w = 1;\n        outEyePoses[1] = ovrPosef(); outEyePoses[1].Orientation.w = 1;\n        if (outHmdTrackingState)\n            *outHmdTrackingState = GetNullTrackingState();\n        return;\n    }\n\n    // If no frame index is provided,\n    if (frameIndex == 0)\n    {\n        // Use the next one in the series.\n        frameIndex = hmds->BeginFrameIndex;\n    }\n\n    ovrTrackingState hmdTrackingState = hmds->GetMidpointPredictionTracking(frameIndex);\n    TraceTrackingState(hmdTrackingState);\n    ovrPosef hmdPose = hmdTrackingState.HeadPose.ThePose;\n\n    // caller passed in a valid pointer, so copy to output\n    if (outHmdTrackingState)\n       *outHmdTrackingState = hmdTrackingState;\n\n    // Currently HmdToEyeViewOffset is only a 3D vector\n    // (Negate HmdToEyeViewOffset because offset is a view matrix offset and not a camera offset)\n    outEyePoses[0] = Posef(hmdPose.Orientation, ((Posef)hmdPose).Apply(-((Vector3f)hmdToEyeViewOffset[0])));\n    outEyePoses[1] = Posef(hmdPose.Orientation, ((Posef)hmdPose).Apply(-((Vector3f)hmdToEyeViewOffset[1])));\n}\n\nOVR_PUBLIC_FUNCTION(ovrPosef) ovrHmd_GetHmdPosePerEye(ovrHmd hmddesc, ovrEyeType eye)\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n    {\n        ovrPosef nullPose = ovrPosef();\n        nullPose.Orientation.w = 1.0f; // Return a proper quaternion.\n        return nullPose;\n    }\n\n    hmds->checkBeginFrameTimingScope(\"ovrHmd_GetEyePose\");\n\n    return hmds->GetEyePredictionPose(eye);\n}\n\nOVR_PUBLIC_FUNCTION(void) ovrHmd_AddDistortionTimeMeasurement(ovrHmd hmddesc, double distortionTimeSeconds)\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return;\n\n    hmds->checkBeginFrameTimingScope(\"ovrHmd_GetTimewarpEyeMatrices\");   \n\n    hmds->TimewarpTimer.AddDistortionTimeMeasurement(distortionTimeSeconds);\n}\n\nOVR_PUBLIC_FUNCTION(void) ovrHmd_GetEyeTimewarpMatricesDebug(ovrHmd hmddesc, ovrEyeType eye, ovrPosef renderPose,\n                                                             ovrQuatf playerTorsoMotion, ovrMatrix4f twmOut[2],\n                                                             double debugTimingOffsetInSeconds)\n{\n    if (!twmOut)\n    {\n        OVR_ASSERT(false);\n        return;\n    }\n\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return;\n\n    // Debug checks: BeginFrame was called, on the same thread.\n    hmds->checkBeginFrameTimingScope(\"ovrHmd_GetTimewarpEyeMatrices\");   \n\n    // TODO: Position input disabled for now\n    bool calcPosition = false;\n    ovrVector3f* hmdToEyeViewOffset = nullptr;\n\n    // playerTorsoMotion can be fed in by the app to indicate player rotation,\n    // i.e. renderPose is in torso space, and playerTorsoMotion says that torso space changed.\n    Quatf playerTorsoMotionInv = Quatf(playerTorsoMotion).Inverted();\n    Posef renderPoseTorso = (Posef)renderPose * Posef(playerTorsoMotionInv, Vector3f::Zero());\n    hmds->GetTimewarpMatricesEx(eye, renderPoseTorso, calcPosition, hmdToEyeViewOffset, twmOut,\n                                debugTimingOffsetInSeconds);\n}\n\n\nOVR_PUBLIC_FUNCTION(void) ovrHmd_GetEyeTimewarpMatrices(ovrHmd hmddesc, ovrEyeType eye, ovrPosef renderPose, ovrMatrix4f twmOut[2])\n{\n    if (!twmOut)\n    {\n        OVR_ASSERT(false);\n        return;\n    }\n\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return;\n\n    // Shortcut to doing orientation-only timewarp.\n\n    hmds->GetTimewarpMatrices(eye, renderPose, twmOut);\n}\n\n\nOVR_PUBLIC_FUNCTION(ovrEyeRenderDesc) ovrHmd_GetRenderDesc(ovrHmd hmddesc,\n                                                           ovrEyeType eyeType, ovrFovPort fov)\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return ovrEyeRenderDesc();\n\n    return hmds->RenderState.CalcRenderDesc(eyeType, fov);\n}\n\n\n#define OVR_OFFSET_OF(s, field) ((size_t)&((s*)0)->field)\n\n\nOVR_PUBLIC_FUNCTION(ovrBool) ovrHmd_CreateDistortionMeshDebug(ovrHmd hmddesc,\n                                                              ovrEyeType eyeType, ovrFovPort fov,\n                                                              unsigned int distortionCaps,\n                                                              ovrDistortionMesh *meshData,\n\t\t\t\t\t\t\t\t\t\t\t\t              float debugEyeReliefOverrideInMetres)\n{\n    if (!meshData)\n    {\n        OVR_ASSERT(false);\n        return ovrFalse;\n    }\n\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return ovrFalse;\n\n    return hmds->CreateDistortionMesh(eyeType, fov,\n                                      distortionCaps,\n                                      meshData,\n                                      debugEyeReliefOverrideInMetres)\n           ? ovrTrue : ovrFalse;\n}\n\n\nOVR_PUBLIC_FUNCTION(ovrBool) ovrHmd_CreateDistortionMesh(ovrHmd hmddesc,\n                                                         ovrEyeType eyeType, ovrFovPort fov,\n                                                         unsigned int distortionCaps,\n                                                         ovrDistortionMesh *meshData)\n{\n    if (!meshData)\n    {\n        OVR_ASSERT(false);\n        return ovrFalse;\n    }\n\n    return ovrHmd_CreateDistortionMeshDebug(hmddesc, eyeType, fov, distortionCaps, meshData, 0);\n}\n\n\n\n// Frees distortion mesh allocated by ovrHmd_GenerateDistortionMesh. meshData elements\n// are set to null and 0s after the call.\nOVR_PUBLIC_FUNCTION(void) ovrHmd_DestroyDistortionMesh(ovrDistortionMesh* meshData)\n{\n    if (!meshData)\n    {\n        OVR_ASSERT(false);\n        return;\n    }\n\n    if (meshData->pVertexData)\n        DistortionMeshDestroy((DistortionMeshVertexData*)meshData->pVertexData,\n                              meshData->pIndexData);\n    meshData->pVertexData = 0;\n    meshData->pIndexData  = 0;\n    meshData->VertexCount = 0;\n    meshData->IndexCount  = 0;\n}\n\n\n\n// Computes updated 'uvScaleOffsetOut' to be used with a distortion if render target size or\n// viewport changes after the fact. This can be used to adjust render size every frame, if desired.\nOVR_PUBLIC_FUNCTION(void) ovrHmd_GetRenderScaleAndOffset(ovrFovPort fov,\n                                                         ovrSizei textureSize, ovrRecti renderViewport,\n                                                         ovrVector2f uvScaleOffsetOut[2] )\n{        \n    if (!uvScaleOffsetOut)\n    {\n        OVR_ASSERT(false);\n        return;\n    }\n\n    // Find the mapping from TanAngle space to target NDC space.\n    ScaleAndOffset2D  eyeToSourceNDC = CreateNDCScaleAndOffsetFromFov(fov);\n    // Find the mapping from TanAngle space to textureUV space.\n    ScaleAndOffset2D  eyeToSourceUV  = CreateUVScaleAndOffsetfromNDCScaleandOffset(\n                                         eyeToSourceNDC,\n                                         renderViewport, textureSize );\n\n    if (uvScaleOffsetOut)\n    {\n        uvScaleOffsetOut[0] = eyeToSourceUV.Scale;\n        uvScaleOffsetOut[1] = eyeToSourceUV.Offset;\n    }\n}\n\n\n//-------------------------------------------------------------------------------------\n// ***** Latency Test interface\n\nOVR_PUBLIC_FUNCTION(ovrBool) ovrHmd_GetLatencyTestDrawColor(ovrHmd hmddesc, unsigned char rgbColorOut[3])\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return ovrFalse;\n\n    if (rgbColorOut)\n    {\n        rgbColorOut[0] = hmds->LatencyTestDrawColor[0];\n        rgbColorOut[1] = hmds->LatencyTestDrawColor[1];\n        rgbColorOut[2] = hmds->LatencyTestDrawColor[2];\n    }\n\n    return hmds->LatencyTestActive;\n}\n\nOVR_PUBLIC_FUNCTION(ovrBool) ovrHmd_ProcessLatencyTest(ovrHmd hmddesc, unsigned char rgbColorOut[3])\n{\n    OVR_UNUSED(hmddesc);\n\n    if (!rgbColorOut)\n    {\n        OVR_ASSERT(false);\n        return ovrFalse;\n    }\n\n    return NetClient::GetInstance()->LatencyUtil_ProcessInputs(Timer::GetSeconds(), rgbColorOut);\n}\n\nOVR_PUBLIC_FUNCTION(const char*) ovrHmd_GetLatencyTestResult(ovrHmd hmddesc)\n{\n    OVR_UNUSED(hmddesc);\n\n    return NetClient::GetInstance()->LatencyUtil_GetResultsString();\n}\n\nOVR_PUBLIC_FUNCTION(ovrBool) ovrHmd_GetLatencyTest2DrawColor(ovrHmd hmddesc, unsigned char rgbColorOut[3])\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return ovrFalse;\n\n    // TBD: Move directly into renderer\n    bool dk2LatencyTest = (hmds->EnabledHmdCaps & ovrHmdCap_DynamicPrediction) != 0;\n    if (dk2LatencyTest)\n    {\n        hmds->LatencyTest2DrawColor[0] = hmds->ScreenLatencyTracker.GetNextDrawColor();\n        hmds->LatencyTest2DrawColor[1] = hmds->ScreenLatencyTracker.IsLatencyTimingAvailable() ? 255 : 0;\n        hmds->LatencyTest2DrawColor[2] = hmds->ScreenLatencyTracker.IsLatencyTimingAvailable() ? 0 : 255;\n\n        if (rgbColorOut)\n        {\n            rgbColorOut[0] = hmds->LatencyTest2DrawColor[0];\n            rgbColorOut[1] = hmds->LatencyTest2DrawColor[1];\n            rgbColorOut[2] = hmds->LatencyTest2DrawColor[2];\n        }\n\n        if (hmds->pRenderer)\n            hmds->pRenderer->SetLatencyTest2Color(hmds->LatencyTest2DrawColor);\n    }\n    else\n    {\n        if (hmds->pRenderer)\n            hmds->pRenderer->SetLatencyTest2Color(nullptr);\n    }\n\n    return dk2LatencyTest ? ovrTrue : ovrFalse;\n}\n\n\nOVR_PUBLIC_FUNCTION(double) ovrHmd_GetMeasuredLatencyTest2(ovrHmd hmddesc)\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return 0.;\n\n    double latencyPostPresent = 0.;\n    hmds->ScreenLatencyTracker.GetVsyncToScanout(latencyPostPresent);\n    return latencyPostPresent;\n}\n\n\n//-------------------------------------------------------------------------------------\n// ***** Health and Safety Warning Display interface\n//\n\nOVR_PUBLIC_FUNCTION(void) ovrHmd_GetHSWDisplayState(ovrHmd hmddesc, ovrHSWDisplayState *hswDisplayState)\n{\n    if (!hswDisplayState)\n    {\n        OVR_ASSERT(false);\n        return;\n    }\n\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return;\n\n    OVR::CAPI::HSWDisplay* pHSWDisplay = hmds->pHSWDisplay;\n\n    if (pHSWDisplay)\n        pHSWDisplay->TickState(hswDisplayState); // This may internally call HSWDisplay::Display.\n}\n\nOVR_PUBLIC_FUNCTION(ovrBool) ovrHmd_DismissHSWDisplay(ovrHmd hmddesc)\n{\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds)\n        return ovrFalse;\n\n    OVR::CAPI::HSWDisplay* pHSWDisplay = hmds->pHSWDisplay;\n\n    if (pHSWDisplay && pHSWDisplay->Dismiss())\n        return ovrTrue;\n\n    return ovrFalse;\n}\n\n\n// -----------------------------------------------------------------------------------\n// ***** Property Access\n\nOVR_PUBLIC_FUNCTION(ovrBool) ovrHmd_GetBool(ovrHmd hmddesc,\n                                            const char* propertyName,\n                                            ovrBool defaultVal)\n{\n    OVR_ASSERT(propertyName != nullptr);\n    if (!propertyName)\n        return ovrFalse;\n\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    bool success = false;\n    if (hmds)\n    {\n        success = hmds->getBoolValue(propertyName, (defaultVal != ovrFalse));\n    }\n    else\n    {\n        success = NetClient::GetInstance()->GetBoolValue(InvalidVirtualHmdId, propertyName, (defaultVal != ovrFalse));\n    }\n    return success ? ovrTrue : ovrFalse;\n}\n\nOVR_PUBLIC_FUNCTION(ovrBool) ovrHmd_SetBool(ovrHmd hmddesc,\n                                            const char* propertyName,\n                                            ovrBool value)\n{\n    OVR_ASSERT(propertyName != nullptr);\n    if (!propertyName)\n        return ovrFalse;\n\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    bool retval = false;\n    if (hmds)\n    {\n        retval = hmds->setBoolValue(propertyName, value != ovrFalse);\n    }\n    else\n    {\n        retval = NetClient::GetInstance()->SetBoolValue(InvalidVirtualHmdId, propertyName, (value != ovrFalse));\n    }\n    return retval ? ovrTrue : ovrFalse;\n}\n\nOVR_PUBLIC_FUNCTION(int) ovrHmd_GetInt(ovrHmd hmddesc,\n                                       const char* propertyName,\n                                       int defaultVal)\n{\n    OVR_ASSERT(propertyName != nullptr);\n    if (!propertyName)\n        return ovrFalse;\n\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (hmds)\n    {\n        return hmds->getIntValue(propertyName, defaultVal);\n    }\n    else\n    {\n        return NetClient::GetInstance()->GetIntValue(InvalidVirtualHmdId, propertyName, defaultVal);\n    }\n}\n\nOVR_PUBLIC_FUNCTION(ovrBool) ovrHmd_SetInt(ovrHmd hmddesc,\n                                           const char* propertyName,\n                                           int value)\n{\n    OVR_ASSERT(propertyName != nullptr);\n    if (!propertyName)\n        return ovrFalse;\n\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    bool success = false;\n    if (hmds)\n    {\n        success = hmds->setIntValue(propertyName, value);\n    }\n    else\n    {\n        success = NetClient::GetInstance()->SetIntValue(InvalidVirtualHmdId, propertyName, value);\n    }\n    return success ? ovrTrue : ovrFalse;\n}\n\nOVR_PUBLIC_FUNCTION(float) ovrHmd_GetFloat(ovrHmd hmddesc,\n                                           const char* propertyName,\n                                           float defaultVal)\n{\n    OVR_ASSERT(propertyName != nullptr);\n    if (!propertyName)\n        return ovrFalse;\n\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (hmds)\n    {\n        return hmds->getFloatValue(propertyName, defaultVal);\n    }\n    else\n    {\n        return (float)NetClient::GetInstance()->GetNumberValue(InvalidVirtualHmdId, propertyName, defaultVal);\n    }\n}\n\nOVR_PUBLIC_FUNCTION(ovrBool) ovrHmd_SetFloat(ovrHmd hmddesc,\n                                             const char* propertyName,\n                                             float value)\n{\n    OVR_ASSERT(propertyName != nullptr);\n    if (!propertyName)\n        return ovrFalse;\n\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    bool success = false;\n    if (hmds)\n    {\n        success = hmds->setFloatValue(propertyName, value);\n    }\n    else\n    {\n        success = NetClient::GetInstance()->SetNumberValue(InvalidVirtualHmdId, propertyName, value);\n    }\n    return success ? ovrTrue : ovrFalse;\n}\n\nOVR_PUBLIC_FUNCTION(unsigned int) ovrHmd_GetFloatArray(ovrHmd hmddesc,\n                                                       const char* propertyName,\n                                                       float values[],\n                                                       unsigned int arraySize)\n{\n    OVR_ASSERT(propertyName != nullptr && values != nullptr);\n    if (!propertyName || !values)\n        return 0;\n\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds) return 0;\n\n    return hmds->getFloatArray(propertyName, values, arraySize);\n}\n\n// Modify float[] property; false if property doesn't exist or is readonly.\nOVR_PUBLIC_FUNCTION(ovrBool) ovrHmd_SetFloatArray(ovrHmd hmddesc,\n                                                  const char* propertyName,\n                                                  float values[],\n                                                  unsigned int arraySize)\n{\n    OVR_ASSERT(propertyName != nullptr && values != nullptr);\n    if (!propertyName || !values)\n        return ovrFalse;\n\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (!hmds) return ovrFalse;\n\n    return hmds->setFloatArray(propertyName, values, arraySize) ? ovrTrue : ovrFalse;\n}\n\nOVR_PUBLIC_FUNCTION(const char*) ovrHmd_GetString(ovrHmd hmddesc,\n                                                  const char* propertyName,\n                                                  const char* defaultVal)\n{\n    OVR_ASSERT(propertyName != nullptr);\n    if (!propertyName)\n        return \"\";\n\n    // Replace null default with empty string\n    if (!defaultVal)\n        defaultVal = \"\";\n\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    if (hmds)\n    {\n        return hmds->getString(propertyName, defaultVal);\n    }\n    else\n    {\n        return NetClient::GetInstance()->GetStringValue(InvalidVirtualHmdId, propertyName, defaultVal);\n    }\n}\n\nOVR_PUBLIC_FUNCTION(ovrBool) ovrHmd_SetString(ovrHmd hmddesc,\n                                              const char* propertyName,\n                                              const char* value)\n{\n    OVR_ASSERT(propertyName != nullptr);\n    if (!propertyName)\n        return ovrFalse;\n\n    // Replace null value with empty string\n    if (!value)\n        value = \"\";\n\n    HMDState* hmds = GetHMDStateFromOvrHmd(hmddesc);\n    bool success = false;\n    if (hmds)\n    {\n        success = hmds->setString(propertyName, value);\n    }\n    else\n    {\n        success = NetClient::GetInstance()->SetStringValue(InvalidVirtualHmdId, propertyName, value);\n    }\n    return success ? ovrTrue : ovrFalse;\n}\n\n\n// -----------------------------------------------------------------------------------\n// ***** Logging\n\n// make sure OVR_Log.h's enum matches CAPI's\nstatic_assert(\n    ((ovrLogLevel_Debug == ovrLogLevel(LogLevel_Debug)) &&\n    (ovrLogLevel_Info   == ovrLogLevel(LogLevel_Info)) &&\n    (ovrLogLevel_Error  == ovrLogLevel(LogLevel_Error))),\n    \"mismatched LogLevel enums\"\n);\n\n#define OVR_TRACEMSG_MAX_LEN 1024 /* in chars */\n\nOVR_PUBLIC_FUNCTION(int) ovr_TraceMessage(int level, const char* message)\n{\n    OVR_ASSERT(message != nullptr);\n    if (!message)\n        return -1;\n\n    // Keep traced messages to some reasonable maximum length\n    int len = (int)strnlen(message, OVR_TRACEMSG_MAX_LEN);\n    if (len >= OVR_TRACEMSG_MAX_LEN)\n        return -1;\n\n    switch (level)\n    {\n    case ovrLogLevel_Debug:\n        TraceLogDebug(message);\n        break;\n    case ovrLogLevel_Info:\n    default:\n        TraceLogInfo(message);\n        break;\n    case ovrLogLevel_Error:\n        TraceLogError(message);\n        break;\n    }\n\n    return len;\n}\n\nOVR_PUBLIC_FUNCTION(ovrBool) ovrHmd_StartPerfLog(ovrHmd hmddesc, const char* fileName, const char* userData1)\n{\n    // DEPRECATED\n    OVR_UNUSED3(hmddesc, fileName, userData1);\n    return ovrFalse;\n}\n\nOVR_PUBLIC_FUNCTION(ovrBool) ovrHmd_StopPerfLog(ovrHmd hmddesc)\n{\n    // DEPRECATED\n    OVR_UNUSED(hmddesc);\n    return ovrFalse;\n}\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/OVR_Profile.cpp",
    "content": "/************************************************************************************\n\nPublicHeader:   None\nFilename    :   OVR_Profile.cpp\nContent     :   Structs and functions for loading and storing device profile settings\nCreated     :   February 14, 2013\nNotes       :\n   \n   Profiles are used to store per-user settings that can be transferred and used\n   across multiple applications.  For example, player IPD can be configured once \n   and reused for a unified experience across games.  Configuration and saving of profiles\n   can be accomplished in game via the Profile API or by the official Oculus Configuration\n   Utility.\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_Profile.h\"\n#include \"Kernel/OVR_JSON.h\"\n#include \"Kernel/OVR_SysFile.h\"\n#include \"Kernel/OVR_Allocator.h\"\n#include \"OVR_Stereo.h\"\n\n#ifdef OVR_OS_WIN32\n#include \"Kernel/OVR_Win32_IncludeWindows.h\"\n#include <Shlobj.h>\n#elif defined(OVR_OS_MS) // Other Microsoft OSs\n// Nothing, thanks.\n#else\n#include <dirent.h>\n#include <sys/stat.h>\n\n#ifdef OVR_OS_LINUX\n#include <unistd.h>\n#include <pwd.h>\n#endif\n\n#endif\n\n\n#define PROFILE_VERSION 2.0\n#define MAX_PROFILE_MAJOR_VERSION 2\n#define MAX_DEVICE_PROFILE_MAJOR_VERSION 1\n\n\nnamespace OVR {\n\n\n//-----------------------------------------------------------------------------\n// ProfileDeviceKey\n\nProfileDeviceKey::ProfileDeviceKey(const HMDInfo* info) :\n    Valid(false)\n{\n    if (info)\n    {\n        PrintedSerial = info->PrintedSerial;\n        ProductName = SanitizeProductName(info->ProductName);\n        ProductId = info->ProductId;\n        HmdType = info->HmdType;\n\n        if (ProductId != 0)\n        {\n            Valid = true;\n        }\n    }\n    else\n    {\n        ProductId = 0;\n        HmdType = HmdType_None;\n    }\n}\n\nString ProfileDeviceKey::SanitizeProductName(String productName)\n{\n    String result;\n\n    if (!productName.IsEmpty())\n    {\n        const char* product_name = productName.ToCStr();\n\n        // First strip off \"Oculus\"\n        const char* oculus = strstr(product_name, \"Oculus \");\n        if (oculus)\n        {\n            product_name = oculus + OVR_strlen(\"Oculus \");\n        }\n\n        // And remove spaces from the name\n        for (const char* s = product_name; *s != 0; s++)\n        {\n            if (*s != ' ')\n            {\n                result.AppendChar(*s);\n            }\n        }\n    }\n\n    return result;\n}\n\n\n\n//-----------------------------------------------------------------------------\n// Returns the pathname of the JSON file containing the stored profiles\nString GetBaseOVRPath(bool create_dir)\n{\n    String path;\n\n#if defined(OVR_OS_WIN32)\n\n    TCHAR data_path[MAX_PATH];\n    SHGetFolderPath(0, CSIDL_LOCAL_APPDATA, NULL, 0, data_path);\n    path = String(data_path);\n    \n    path += \"/Oculus\";\n\n    if (create_dir)\n    {   // Create the Oculus directory if it doesn't exist\n        WCHAR wpath[128];\n        OVR::UTF8Util::DecodeString(wpath, path.ToCStr());\n\n        DWORD attrib = GetFileAttributes(wpath);\n        bool exists = attrib != INVALID_FILE_ATTRIBUTES && (attrib & FILE_ATTRIBUTE_DIRECTORY);\n        if (!exists)\n        {   \n            CreateDirectory(wpath, NULL);\n        }\n    }\n\n#elif defined(OVR_OS_OS) // Other Microsoft OSs\n\n    // TODO: figure this out.\n    OVR_UNUSED ( create_dir );\n    path = \"\";\n        \n#elif defined(OVR_OS_MAC)\n\n    const char* home = getenv(\"HOME\");\n    path = home;\n    path += \"/Library/Preferences/Oculus\";\n\n    if (create_dir)\n    {   // Create the Oculus directory if it doesn't exist\n        DIR* dir = opendir(path);\n        if (dir == NULL)\n        {\n            mkdir(path, S_IRWXU | S_IRWXG | S_IRWXO);\n        }\n        else\n        {\n            closedir(dir);\n        }\n    }\n\n#else\n\n    const char* home = getenv(\"HOME\");\n    path = home;\n    path += \"/.config/Oculus\";\n\n    if (create_dir)\n    {   // Create the Oculus directory if it doesn't exist\n        DIR* dir = opendir(path);\n        if (dir == NULL)\n        {\n            mkdir(path, S_IRWXU | S_IRWXG | S_IRWXO);\n        }\n        else\n        {\n            closedir(dir);\n        }\n    }\n\n#endif\n\n    return path;\n}\n\nString ProfileManager::GetProfilePath()\n{\n    return BasePath + \"/ProfileDB.json\";\n}\n\nstatic JSON* FindTaggedData(JSON* data, const char** tag_names, const char** qtags, int num_qtags)\n{\n    if (data == NULL || !(data->Name == \"TaggedData\") || data->Type != JSON_Array)\n        return NULL;\n\n    JSON* tagged_item = data->GetFirstItem();\n    while (tagged_item)\n    {\n        JSON* tags = tagged_item->GetItemByName(\"tags\");\n        if (tags->Type == JSON_Array && num_qtags == tags->GetArraySize())\n        {   // Check for a full tag match on each item\n            int num_matches = 0;\n            \n            for (int k=0; k<num_qtags; k++)\n            {\n                JSON* tag = tags->GetFirstItem();\n                while (tag)\n                {\n                    JSON* tagval = tag->GetFirstItem();\n                    if (tagval && tagval->Name == tag_names[k])\n                    {\n                        if (tagval->Value == qtags[k])\n                            num_matches++;\n                        break;\n                    }\n                    tag = tags->GetNextItem(tag);\n                }\n            }\n\n            // if all tags were matched then copy the values into this Profile\n            if (num_matches == num_qtags)\n            {\n                JSON* vals = tagged_item->GetItemByName(\"vals\");\n                return vals;\n            }\n        }\n\n        tagged_item = data->GetNextItem(tagged_item);\n    }\n\n    return NULL;\n}\n\nstatic void FilterTaggedData(JSON* data, const char* tag_name, const char* qtag, Array<JSON*>& items)\n{\n    if (data == NULL || !(data->Name == \"TaggedData\") || data->Type != JSON_Array)\n        return;\n\n    JSON* tagged_item = data->GetFirstItem();\n    while (tagged_item)\n    {\n        JSON* tags = tagged_item->GetItemByName(\"tags\");\n        if (tags->Type == JSON_Array)\n        {   // Check for a tag match on the requested tag\n            \n            JSON* tag = tags->GetFirstItem();\n            while (tag)\n            {\n                JSON* tagval = tag->GetFirstItem();\n                if (tagval && tagval->Name == tag_name)\n                {\n                    if (tagval->Value == qtag)\n                    {   // Add this item to the output list\n                        items.PushBack(tagged_item);\n                    }\n                    break;\n                }\n                tag = tags->GetNextItem(tag);\n            }\n        }\n\n        tagged_item = data->GetNextItem(tagged_item);\n    }\n}\n\n\n//-----------------------------------------------------------------------------\n// ***** ProfileManager\n\ntemplate<> ProfileManager* OVR::SystemSingletonBase<ProfileManager>::SlowGetInstance()\n{\n    static OVR::Lock lock;\n    OVR::Lock::Locker locker(&lock);\n    if (!SingletonInstance) SingletonInstance = new ProfileManager(true);\n    return SingletonInstance;\n}\n\nProfileManager::ProfileManager(bool sys_register) :\n    Changed(false)\n{\n    // Attempt to get the base path automatically, but this may fail\n    BasePath = GetBaseOVRPath(false);\n\n    if (sys_register)\n        PushDestroyCallbacks();\n}\n\nProfileManager::~ProfileManager()\n{\n    ClearProfileData();\n}\n\nvoid ProfileManager::OnSystemDestroy()\n{\n    delete this;\n}\n\n// In the service process it is important to set the base path because this cannot be detected automatically\nvoid ProfileManager::SetBasePath(String basePath)\n{\n    if (basePath != BasePath)\n    {\n        BasePath = basePath;\n        LoadCache(false);\n    }\n}\n\n// Clear the local profile cache\nvoid ProfileManager::ClearProfileData()\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    ProfileCache.Clear();\n    Changed = false;\n}\n\n// Serializes the profiles to disk.\nvoid ProfileManager::Save()\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    if (ProfileCache == NULL)\n        return;\n\n    // Save the profile to disk\n    BasePath = GetBaseOVRPath(true);  // create the base directory if it doesn't exist\n    String path = GetProfilePath();\n    ProfileCache->Save(path);\n    Changed = false;\n}\n\n// Returns a profile with all system default values\nProfile* ProfileManager::GetDefaultProfile(HmdTypeEnum device)\n{\n    // In the absence of any data, set some reasonable profile defaults.\n    // However, this is not future proof and developers should still\n    // provide reasonable default values for queried fields.\n    \n    // Biometric data\n    Profile* profile = CreateProfile();\n    profile->SetValue(OVR_KEY_USER,               \"default\");\n    profile->SetValue(OVR_KEY_NAME,               \"Default\");\n    profile->SetValue(OVR_KEY_GENDER,             OVR_DEFAULT_GENDER);\n    profile->SetFloatValue(OVR_KEY_PLAYER_HEIGHT, OVR_DEFAULT_PLAYER_HEIGHT);\n    profile->SetFloatValue(OVR_KEY_EYE_HEIGHT,    OVR_DEFAULT_EYE_HEIGHT);\n    profile->SetFloatValue(OVR_KEY_IPD,           OVR_DEFAULT_IPD);\n    float half_ipd[2] = { OVR_DEFAULT_IPD / 2, OVR_DEFAULT_IPD / 2 };\n    profile->SetFloatValues(OVR_KEY_EYE_TO_NOSE_DISTANCE, half_ipd, 2);\n    float dist[2] = {OVR_DEFAULT_NECK_TO_EYE_HORIZONTAL, OVR_DEFAULT_NECK_TO_EYE_VERTICAL};\n    profile->SetFloatValues(OVR_KEY_NECK_TO_EYE_DISTANCE, dist, 2);\n    \n    // Device specific data\n    if (device != HmdType_None)\n    {\n        if (device == HmdType_CrystalCoveProto || device == HmdType_DK2)\n        {\n            profile->SetValue(\"EyeCup\", \"A\");\n            profile->SetIntValue(OVR_KEY_EYE_RELIEF_DIAL, OVR_DEFAULT_EYE_RELIEF_DIAL);\n\n            // TODO: These defaults are a little bogus and designed for continuity with 0.3\n            // eye-relief values.  We need better measurement-based numbers in future releases\n            float max_eye_plate[2] = { 0.01965f + 0.018f, 0.01965f + 0.018f };\n            profile->SetFloatValues(OVR_KEY_MAX_EYE_TO_PLATE_DISTANCE, max_eye_plate, 2);\n        }\n        else\n        {   // DK1 and DKHD variants\n            profile->SetValue(\"EyeCup\", \"A\");\n            profile->SetIntValue(OVR_KEY_EYE_RELIEF_DIAL, OVR_DEFAULT_EYE_RELIEF_DIAL);\n\n            // TODO: These defaults are a little bogus and designed for continuity with 0.3\n            // DK1 distortion.  We need better measurement-based numbers in future releases\n            float max_eye_plate[2] = { 0.02357f + 0.017f, 0.02357f + 0.017f };\n            profile->SetFloatValues(OVR_KEY_MAX_EYE_TO_PLATE_DISTANCE, max_eye_plate, 2);\n        }\n    }\n\n    return profile;\n}\n\n//------------------------------------------------------------------------------\nvoid ProfileManager::Read()\n{\n    LoadCache(false);\n}\n\n// Populates the local profile cache.  This occurs on the first access of the profile\n// data.  All profile operations are performed against the local cache until the\n// ProfileManager is released or goes out of scope at which time the cache is serialized\n// to disk.\nvoid ProfileManager::LoadCache(bool create)\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    ClearProfileData();\n\n    String path = GetProfilePath();\n\n    Ptr<JSON> root = *JSON::Load(path);\n    if (root == NULL)\n    {   \n        path = BasePath + \"/Profiles.json\";  // look for legacy profile\n        root = *JSON::Load(path);\n        \n        if (root == NULL)\n        {\n            if (create)\n            {   // Generate a skeleton profile database\n                root = *JSON::CreateObject();\n                root->AddNumberItem(\"Oculus Profile Version\", 2.0);\n                root->AddItem(\"Users\", JSON::CreateArray());\n                root->AddItem(\"TaggedData\", JSON::CreateArray());\n                ProfileCache = root;\n            }\n            \n            return;\n        }\n\n        // Verify the legacy version\n        JSON* version_item = root->GetFirstItem();\n        if (version_item->Name == \"Oculus Profile Version\")\n        {\n            int major = atoi(version_item->Value.ToCStr());\n            if (major != 1)\n                return;   // don't use the file on unsupported major version number\n        }\n        else\n        {\n            return;      // invalid file\n        }\n\n        // Convert the legacy format to the new database format\n        LoadV1Profiles(root);\n    }\n    else\n    {\n        // Verify the file format and version\n        JSON* version_item = root->GetFirstItem();\n        if (version_item && version_item->Name == \"Oculus Profile Version\")\n        {\n            int major = atoi(version_item->Value.ToCStr());\n            if (major != 2)\n                return;   // don't use the file on unsupported major version number\n        }\n        else\n        {\n            return;       // invalid file \n        }\n\n        ProfileCache = root;   // store the database contents for traversal\n    }\n}\n\nvoid ProfileManager::LoadV1Profiles(JSON* v1)\n{\n    JSON* item0 = v1->GetFirstItem();\n    JSON* item1 = v1->GetNextItem(item0);\n    JSON* item2 = v1->GetNextItem(item1);\n\n    OVR_ASSERT(item1 && item2);\n    if(!item1 || !item2)\n        return;\n\n    // Create the new profile database\n    Ptr<JSON> root = *JSON::CreateObject();\n    root->AddNumberItem(\"Oculus Profile Version\", 2.0);\n    root->AddItem(\"Users\", JSON::CreateArray());\n    root->AddItem(\"TaggedData\", JSON::CreateArray());\n    ProfileCache = root;\n\n    const char* default_dk1_user = item1->Value;\n    \n    // Read the number of profiles\n    int   profileCount = (int)item2->dValue;\n    JSON* profileItem  = item2;\n\n    for (int p=0; p<profileCount; p++)\n    {\n        profileItem = root->GetNextItem(profileItem);\n        if (profileItem == NULL)\n            break;\n\n        if (profileItem->Name == \"Profile\")\n        {\n            // Read the required Name field\n            const char* profileName;\n            JSON* item = profileItem->GetFirstItem();\n        \n            if (item && (item->Name == \"Name\"))\n            {   \n                profileName = item->Value;\n            }\n            else\n            {\n                return;   // invalid field\n            }\n            \n            // Read the user profile fields\n            if (CreateUser(profileName, profileName))\n            {\n                const char* tag_names[2] = {\"User\", \"Product\"};\n                const char* tags[2];\n                tags[0] = profileName;\n\n                Ptr<Profile> user_profile = *CreateProfile();\n                user_profile->SetValue(OVR_KEY_NAME, profileName);\n\n                float neckeye[2] = { 0, 0 };\n\n                item = profileItem->GetNextItem(item);\n                while (item)\n                {\n                    if (item->Type != JSON_Object)\n                    {\n                        if (item->Name == OVR_KEY_PLAYER_HEIGHT)\n                        {   // Add an explicit eye height\n\n                        }\n                        if (item->Name == \"NeckEyeHori\")\n                            neckeye[0] = (float)item->dValue;\n                        else if (item->Name == \"NeckEyeVert\")\n                            neckeye[1] = (float)item->dValue;\n                        else \n                            user_profile->SetValue(item);\n                    }\n                    else\n                    {   \n                        // Add the user/device tag values\n                        const char* device_name = item->Name.ToCStr();\n                        Ptr<Profile> device_profile = *CreateProfile();\n\n                        JSON* device_item = item->GetFirstItem();\n                        while (device_item)\n                        {\n                            device_profile->SetValue(device_item);\n                            device_item = item->GetNextItem(device_item);\n                        }\n\n                        tags[1] = device_name;\n                        SetTaggedProfile(tag_names, tags, 2, device_profile);\n                    }\n\n                    item = profileItem->GetNextItem(item);\n                }\n\n                // Add an explicit eye-height field\n                float player_height = user_profile->GetFloatValue(OVR_KEY_PLAYER_HEIGHT,\n                                                                  OVR_DEFAULT_PLAYER_HEIGHT);\n                if (player_height > 0)\n                {\n                    char gender[16];\n                    user_profile->GetValue(OVR_KEY_GENDER, gender, 16);\n        \n                    const float EYE_TO_HEADTOP_RATIO =   0.44538f;\n                    const float MALE_AVG_HEAD_HEIGHT =   0.232f;\n                    const float FEMALE_AVG_HEAD_HEIGHT = 0.218f;\n     \n                    // compute distance from top of skull to the eye\n                    float head_height;\n                    if (OVR_strcmp(gender, \"Female\") == 0)\n                        head_height = FEMALE_AVG_HEAD_HEIGHT;\n                    else\n                        head_height = MALE_AVG_HEAD_HEIGHT;\n\n                    float skull = EYE_TO_HEADTOP_RATIO * head_height;\n                    float eye_height = player_height - skull;\n\n                    user_profile->SetFloatValue(OVR_KEY_EYE_HEIGHT, eye_height);\n                }\n\n                // Convert NeckEye values to an array\n                if (neckeye[0] > 0 && neckeye[1] > 0)\n                    user_profile->SetFloatValues(OVR_KEY_NECK_TO_EYE_DISTANCE, neckeye, 2);\n\n                // Add the user tag values\n                SetTaggedProfile(tag_names, tags, 1, user_profile);\n            }\n        }\n    }\n\n    // since V1 profiles were only for DK1, the assign the user to all DK1's\n    const char* tag_names[1] = { \"Product\" };\n    const char* tags[1] = { \"RiftDK1\" };\n    Ptr<Profile> product_profile = *CreateProfile();\n    product_profile->SetValue(\"DefaultUser\", default_dk1_user);\n    SetTaggedProfile(tag_names, tags, 1, product_profile);\n}\n\n// Returns the number of stored profiles for this device type\nint ProfileManager::GetUserCount()\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    if (ProfileCache == NULL)\n    {   // Load the cache\n        LoadCache(false);\n        if (ProfileCache == NULL)\n            return 0;\n    }\n\n    JSON* users = ProfileCache->GetItemByName(\"Users\");\n    if (users == NULL)\n        return 0;\n\n    return users->GetItemCount();\n}\n\nbool ProfileManager::CreateUser(const char* user, const char* name)\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    if (ProfileCache == NULL)\n    {   // Load the cache\n        LoadCache(true);\n        if (ProfileCache == NULL)\n            return false;\n    }\n\n    JSON* users = ProfileCache->GetItemByName(\"Users\");\n    if (users == NULL)\n    {   // Generate the User section\n        users = JSON::CreateArray();\n        ProfileCache->AddItem(\"Users\", users);\n//TODO: Insert this before the TaggedData\n    }\n\n    // Search for the pre-existence of this user\n    JSON* user_item = users->GetFirstItem();\n    int index = 0;\n    while (user_item)\n    {\n        JSON* userid = user_item->GetItemByName(\"User\");\n        int compare = OVR_strcmp(user, userid->Value);\n        if (compare == 0)\n        {   // The user already exists so simply update the fields\n            JSON* name_item = user_item->GetItemByName(\"Name\");\n            if (name_item && OVR_strcmp(name, name_item->Value) != 0)\n            {\n                name_item->Value = name;\n                Changed = true;\n            }\n            return true;\n        }\n        else if (compare < 0)\n        {   // A new user should be placed before this item\n            break;\n        }\n        \n        user_item = users->GetNextItem(user_item);\n        index++;\n    }\n\n    // Create and fill the user struct\n    JSON* new_user = JSON::CreateObject();\n    new_user->AddStringItem(OVR_KEY_USER, user);\n    new_user->AddStringItem(OVR_KEY_NAME, name);\n    // user_item->AddStringItem(\"Password\", password);\n\n    if (user_item == NULL)\n        users->AddArrayElement(new_user);\n    else\n        users->InsertArrayElement(index, new_user);\n\n    Changed = true;\n    return true;\n}\n\nbool ProfileManager::HasUser(const char* user)\n{\n\tLock::Locker lockScope(&ProfileLock);\n\n\tif (ProfileCache == NULL)\n\t{   // Load the cache\n\t\tLoadCache(false);\n\t\tif (ProfileCache == NULL)\n\t\t\treturn false;\n\t}\n\n\tJSON* users = ProfileCache->GetItemByName(\"Users\");\n\tif (users == NULL)\n\t\treturn false;\n\n\t// Remove this user from the User table\n\tJSON* user_item = users->GetFirstItem();\n\twhile (user_item)\n\t{\n\t\tJSON* userid = user_item->GetItemByName(\"User\");\n\t\tif (OVR_strcmp(user, userid->Value) == 0)\n\t\t{   \n\t\t\treturn true;\n\t\t}\n\n\t\tuser_item = users->GetNextItem(user_item);\n\t}\n\n\treturn false;\n}\n\n// Returns the user id of a specific user in the list.  The returned \n// memory is locally allocated and should not be stored or deleted.  Returns NULL\n// if the index is invalid\nconst char* ProfileManager::GetUser(unsigned int index)\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    if (ProfileCache == NULL)\n    {   // Load the cache\n        LoadCache(false);\n        if (ProfileCache == NULL)\n            return NULL;\n    }\n\n    JSON* users = ProfileCache->GetItemByName(\"Users\");\n    \n    if (users && index < users->GetItemCount())\n    {\n        JSON* user_item = users->GetItemByIndex(index);\n        if (user_item)\n        {\n            JSON* user = user_item->GetFirstItem();\n            if (user)\n            {\n                JSON* userid = user_item->GetItemByName(OVR_KEY_USER);\n                if (userid)\n                    return userid->Value.ToCStr();\n            }\n        }\n    }\n    \n\n    return NULL;\n}\n\nbool ProfileManager::RemoveUser(const char* user)\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    if (ProfileCache == NULL)\n    {   // Load the cache\n        LoadCache(false);\n        if (ProfileCache == NULL)\n            return true;\n    }\n\n    JSON* users = ProfileCache->GetItemByName(\"Users\");\n    if (users == NULL)\n        return true;\n\n    // Remove this user from the User table\n    JSON* user_item = users->GetFirstItem();\n    while (user_item)\n    {\n        JSON* userid = user_item->GetItemByName(\"User\");\n        if (OVR_strcmp(user, userid->Value) == 0)\n        {   // Delete the user entry\n            user_item->RemoveNode();\n            user_item->Release();\n            Changed = true;\n            break;\n        }\n        \n        user_item = users->GetNextItem(user_item);\n    }\n\n    // Now remove all data entries with this user tag\n    JSON* tagged_data = ProfileCache->GetItemByName(\"TaggedData\");\n    Array<JSON*> user_items;\n    FilterTaggedData(tagged_data, \"User\", user, user_items);\n    for (unsigned int i=0; i<user_items.GetSize(); i++)\n    {\n        user_items[i]->RemoveNode();\n        user_items[i]->Release();\n        Changed = true;\n    }\n \n    return Changed;\n}\n\nProfile* ProfileManager::CreateProfile()\n{\n    Profile* profile = new Profile(BasePath);\n    return profile;\n}\n\nconst char* ProfileManager::GetDefaultUser(const ProfileDeviceKey& deviceKey)\n{\n    const char* product_str = deviceKey.ProductName.IsEmpty() ? NULL : deviceKey.ProductName.ToCStr();\n    const char* serial_str = deviceKey.PrintedSerial.IsEmpty() ? NULL : deviceKey.PrintedSerial.ToCStr();\n\n    return GetDefaultUser(product_str, serial_str);\n}\n\n// Returns the name of the profile that is marked as the current default user.\nconst char* ProfileManager::GetDefaultUser(const char* product, const char* serial)\n{\n    const char* tag_names[2] = {\"Product\", \"Serial\"};\n    const char* tags[2];\n\n    Ptr<Profile> p;\n    if (product && serial)\n    {\n        tags[0] = product;\n        tags[1] = serial;\n        // Look for a default user on this specific device\n        Profile* tmp_ptr = GetTaggedProfile(tag_names, tags, 2);\n        if (tmp_ptr == nullptr)\n        {   // Look for a default user on this product\n            tmp_ptr = GetTaggedProfile(tag_names, tags, 1);\n        }\n        if (tmp_ptr != nullptr)\n        {\n            p = *tmp_ptr;\n        }\n\n    }\n    else if (product)\n    {\n        tags[0] = product;\n        // Look for a default user on this specific device\n        Profile* tmp_ptr = GetTaggedProfile(tag_names, tags, 1);\n        if (tmp_ptr != nullptr)\n        {\n            p = *tmp_ptr;\n        }\n    }\n\n    if (p)\n    {\n        const char* user = p->GetValue(\"DefaultUser\");\n        if (user != nullptr && user[0] != 0)\n        {\n            TempBuff = user;\n            return TempBuff.ToCStr();\n        }\n    }\n\n    return NULL;\n}\n\n//-----------------------------------------------------------------------------\nbool ProfileManager::SetDefaultUser(const ProfileDeviceKey& deviceKey, const char* user)\n{\n    const char* tag_names[2] = {\"Product\", \"Serial\"};\n    const char* tags[2];\n\n    const char* product_str = deviceKey.ProductName.IsEmpty() ? NULL : deviceKey.ProductName.ToCStr();\n    const char* serial_str = deviceKey.PrintedSerial.IsEmpty() ? NULL : deviceKey.PrintedSerial.ToCStr();\n\n    if (product_str && serial_str)\n    {\n        tags[0] = product_str;\n        tags[1] = serial_str;\n\n        Ptr<Profile> p = *CreateProfile();\n        p->SetValue(\"DefaultUser\", user);\n        return SetTaggedProfile(tag_names, tags, 2, p);\n    }\n\n    return false;\n}\n\n//-----------------------------------------------------------------------------\nProfile* ProfileManager::GetTaggedProfile(const char** tag_names, const char** tags, int num_tags)\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    if (ProfileCache == NULL)\n    {   // Load the cache\n        LoadCache(false);\n        if (ProfileCache == NULL)\n            return NULL;\n    }\n\n    JSON* tagged_data = ProfileCache->GetItemByName(\"TaggedData\");\n    OVR_ASSERT(tagged_data);\n    if (tagged_data == NULL)\n        return NULL;\n    \n    Profile* profile = new Profile(BasePath);\n    \n    JSON* vals = FindTaggedData(tagged_data, tag_names, tags, num_tags);\n    if (vals)\n    {   \n        JSON* item = vals->GetFirstItem();\n        while (item)\n        {\n            //printf(\"Add %s, %s\\n\", item->Name.ToCStr(), item->Value.ToCStr());\n            //profile->Settings.Set(item->Name, item->Value);\n            profile->SetValue(item);\n            item = vals->GetNextItem(item);\n        }\n\n        return profile;\n    }\n    else\n    {\n        profile->Release();\n        return NULL;\n    }\n}\n\n//-----------------------------------------------------------------------------\nbool ProfileManager::SetTaggedProfile(const char** tag_names, const char** tags, int num_tags, Profile* profile)\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    if (ProfileCache == NULL)\n    {   // Load the cache\n        LoadCache(true);\n        if (ProfileCache == NULL)\n            return false;  // TODO: Generate a new profile DB\n    }\n\n    JSON* tagged_data = ProfileCache->GetItemByName(\"TaggedData\");\n    OVR_ASSERT(tagged_data);\n    if (tagged_data == NULL)\n        return false;\n\n    // Get the cached tagged data section\n    JSON* vals = FindTaggedData(tagged_data, tag_names, tags, num_tags);\n    if (vals == NULL)\n    {  \n        JSON* tagged_item = JSON::CreateObject();\n        JSON* taglist = JSON::CreateArray();\n        for (int i=0; i<num_tags; i++)\n        {\n            JSON* k = JSON::CreateObject();\n            k->AddStringItem(tag_names[i], tags[i]);\n            taglist->AddArrayElement(k);\n        }\n\n        vals = JSON::CreateObject();\n        \n        tagged_item->AddItem(\"tags\", taglist);\n        tagged_item->AddItem(\"vals\", vals);\n        tagged_data->AddArrayElement(tagged_item);\n    }\n\n    // Now add or update each profile setting in cache\n    for (unsigned int i=0; i<profile->Values.GetSize(); i++)\n    {\n        JSON* value = profile->Values[i];\n        \n        bool found = false;\n        JSON* item = vals->GetFirstItem();\n        while (item)\n        {\n            if (value->Name == item->Name)\n            {\n                // Don't allow a pre-existing type to be overridden\n                OVR_ASSERT(value->Type == item->Type);\n\n                if (value->Type == item->Type)\n                {   // Check for the same value\n                    if (value->Type == JSON_Array)\n                    {   // Update each array item\n                        if (item->GetArraySize() == value->GetArraySize())\n                        {   // Update each value (assumed to be basic types and not array of objects)\n                            JSON* value_element = value->GetFirstItem();\n                            JSON* item_element = item->GetFirstItem();\n                            while (item_element && value_element)\n                            {\n                                if (value_element->Type == JSON_String)\n                                {\n                                    if (item_element->Value != value_element->Value)\n                                    {   // Overwrite the changed value and mark for file update\n                                        item_element->Value = value_element->Value;\n                                        Changed = true;\n                                    }\n                                }\n                                else {\n                                    if (item_element->dValue != value_element->dValue)\n                                    {   // Overwrite the changed value and mark for file update\n                                        item_element->dValue = value_element->dValue;\n                                        Changed = true;\n                                    }\n                                }\n                                \n                                value_element = value->GetNextItem(value_element);\n                                item_element = item->GetNextItem(item_element);\n                            }\n                        }\n                        else\n                        {   // if the array size changed, simply create a new one                            \n// TODO: Create the new array\n                        }\n                    }\n                    else if (value->Type == JSON_String)\n                    {\n                        if (item->Value != value->Value)\n                        {   // Overwrite the changed value and mark for file update\n                            item->Value = value->Value;\n                            Changed = true;\n                        }\n                    }\n                    else {\n                        if (item->dValue != value->dValue)\n                        {   // Overwrite the changed value and mark for file update\n                            item->dValue = value->dValue;\n                            Changed = true;\n                        }\n                    }\n                }\n                else\n                {\n                    return false;\n                }\n\n                found = true;\n                break;\n            }\n            \n            item = vals->GetNextItem(item);\n        }\n\n        if (!found)\n        {   // Add the new value\n            Changed = true;\n\n            if (value->Type == JSON_String)\n                vals->AddStringItem(value->Name, value->Value);\n            else if (value->Type == JSON_Bool)\n                vals->AddBoolItem(value->Name, ((int)value->dValue != 0));\n            else if (value->Type == JSON_Number)\n                vals->AddNumberItem(value->Name, value->dValue);\n            else if (value->Type == JSON_Array)\n                vals->AddItem(value->Name, value->Copy());\n            else\n            {\n                OVR_ASSERT(false);\n                Changed = false;\n            }\n        }\n    }\n\n    return true;\n}\n\n//-----------------------------------------------------------------------------\nProfile* ProfileManager::GetDefaultUserProfile(const ProfileDeviceKey& deviceKey)\n{\n    const char* userName = GetDefaultUser(deviceKey);\n\n    Profile* profile = GetProfile(deviceKey, userName);\n\n    if (!profile)\n    {\n        profile = GetDefaultProfile(deviceKey.HmdType);\n    }\n\n    return profile;\n}\n\n//-----------------------------------------------------------------------------\nProfile* ProfileManager::GetProfile(const ProfileDeviceKey& deviceKey, const char* user)\n{\n    Lock::Locker lockScope(&ProfileLock);\n\n    if (ProfileCache == NULL)\n    {   // Load the cache\n        LoadCache(false);\n        if (ProfileCache == NULL)\n            return NULL;\n    }\n    \n    Profile* profile = new Profile(BasePath);\n\n    if (deviceKey.Valid)\n    {\n        if (!profile->LoadDeviceProfile(deviceKey) && (user == NULL))\n        {\n            profile->Release();\n            return NULL;\n        }\n    }\n    \n    if (user)\n    {\n        const char* product_str = deviceKey.ProductName.IsEmpty() ? NULL : deviceKey.ProductName.ToCStr();\n        const char* serial_str = deviceKey.PrintedSerial.IsEmpty() ? NULL : deviceKey.PrintedSerial.ToCStr();\n\n        if (!profile->LoadProfile(ProfileCache.GetPtr(), user, product_str, serial_str))\n        {\n            profile->Release();\n            return NULL;\n        }\n    }\n\n    return profile;\n}\n\n\n//-----------------------------------------------------------------------------\n// ***** Profile\n\nProfile::~Profile()\n{\n    ValMap.Clear();\n    for (unsigned int i=0; i<Values.GetSize(); i++)\n        Values[i]->Release();\n\n    Values.Clear();\n}\n\nbool Profile::Close()\n{\n    // TODO:\n    return true;\n}\n\n//-----------------------------------------------------------------------------\nvoid Profile::CopyItems(JSON* root, String prefix)\n{\n    JSON* item = root->GetFirstItem();\n    while (item)\n    {\n        String item_name;\n        if (prefix.IsEmpty())\n            item_name = item->Name;\n        else\n            item_name = prefix + \".\" + item->Name;\n\n        if (item->Type == JSON_Object)\n        {   // recursively copy the children\n            \n            CopyItems(item, item_name);\n        }\n        else\n        {\n            //Settings.Set(item_name, item->Value);\n            SetValue(item);\n        }\n\n        item = root->GetNextItem(item);\n    }\n}\n\n//-----------------------------------------------------------------------------\nbool Profile::LoadDeviceFile(unsigned int productId, const char* printedSerialNumber)\n{\n    if (printedSerialNumber[0] == 0)\n        return false;\n\n    String path = BasePath + \"/Devices.json\";\n\n    // Load the device profiles\n    JSON *tmp_ptr = JSON::Load(path);\n    if (tmp_ptr == NULL)\n        return false;\n    Ptr<JSON> root = *tmp_ptr;\n\n    // Quick sanity check of the file type and format before we parse it\n    JSON* version = root->GetFirstItem();\n    if (version && version->Name == \"Oculus Device Profile Version\")\n    {   \n        int major = atoi(version->Value.ToCStr());\n        if (major > MAX_DEVICE_PROFILE_MAJOR_VERSION)\n            return false;   // don't parse the file on unsupported major version number\n    }\n    else\n    {\n        return false;\n    }   \n\n    JSON* device = root->GetNextItem(version);\n    while (device)\n    {   \n        if (device->Name == \"Device\")\n        {   \n            JSON* product_item = device->GetItemByName(\"ProductID\");\n            JSON* serial_item = device->GetItemByName(\"Serial\");\n            if (product_item && serial_item &&\n                (product_item->dValue == productId) && (serial_item->Value == printedSerialNumber))\n            {   \n                // found the entry for this device so recursively copy all the settings to the profile\n                CopyItems(device, \"\");\n                return true;   \n            }\n        }\n\n        device = root->GetNextItem(device);\n    }\n    \n    return false;\n}\n\n#if 0\n//-----------------------------------------------------------------------------\nstatic int BCDByte(unsigned int byte)\n{\n    int digit1 = (byte >> 4) & 0x000f;\n    int digit2 = byte & 0x000f;\n    int decimal = digit1 * 10 + digit2;\n    return decimal;\n}\n#endif\n\n//-----------------------------------------------------------------------------\nbool Profile::LoadDeviceProfile(const ProfileDeviceKey& deviceKey)\n{\n    bool success = false;\n    if (!deviceKey.Valid)\n            return false;\n\n#if 0\n        int dev_major = BCDByte((sinfo.Version >> 8) & 0x00ff);\n        OVR_UNUSED(dev_major);\n        //int dev_minor = BCDByte(sinfo.Version & 0xff);\n      \n        //if (dev_minor > 18)\n        //{   // If the firmware supports hardware stored profiles then grab the device profile\n            // from the sensor\n            // TBD:  Implement this\n        //}\n        //else\n        {\n#endif\n            // Grab the model and serial number from the device and use it to access the device\n            // profile file stored on the local machine\n        success = LoadDeviceFile(deviceKey.ProductId, deviceKey.PrintedSerial);\n    //}\n\n    return success;\n}\n\n//-----------------------------------------------------------------------------\nbool Profile::LoadUser(JSON* root, \n                         const char* user,\n                          const char* model_name,\n                          const char* device_serial)\n{\n    if (user == NULL)\n        return false;\n\n    // For legacy files, convert to old style names\n    //if (model_name && OVR_strcmp(model_name, \"Oculus Rift DK1\") == 0)\n    //    model_name = \"RiftDK1\";\n    \n    bool user_found = false;\n    JSON* data = root->GetItemByName(\"TaggedData\");\n    if (data)\n    {   \n        const char* tag_names[3];\n        const char* tags[3];\n        tag_names[0] = \"User\";\n        tags[0] = user;\n        int num_tags = 1;\n\n        if (model_name)\n        {\n            tag_names[num_tags] = \"Product\";\n            tags[num_tags] = model_name;\n            num_tags++;\n        }\n\n        if (device_serial)\n        {\n            tag_names[num_tags] = \"Serial\";\n            tags[num_tags] = device_serial;\n            num_tags++;\n        }\n\n        // Retrieve all tag permutations\n        for (int combos=1; combos<=num_tags; combos++)\n        {\n            for (int i=0; i<(num_tags - combos + 1); i++)\n            {\n                JSON* vals = FindTaggedData(data, tag_names+i, tags+i, combos);\n                if (vals)\n                {   \n                    if (i==0)   // This tag-combination contains a user match\n                        user_found = true;\n\n                    // Add the values to the Profile.  More specialized multi-tag values\n                    // will take precedence over and overwrite generalized ones \n                    // For example: (\"Me\",\"RiftDK1\").IPD would overwrite (\"Me\").IPD\n                    JSON* item = vals->GetFirstItem();\n                    while (item)\n                    {\n                        //printf(\"Add %s, %s\\n\", item->Name.ToCStr(), item->Value.ToCStr());\n                        //Settings.Set(item->Name, item->Value);\n                        SetValue(item);\n                        item = vals->GetNextItem(item);\n                    }\n                }\n            }\n        }\n    }\n\n    if (user_found)\n        SetValue(OVR_KEY_USER, user);\n\n    return user_found;\n}\n\n\n//-----------------------------------------------------------------------------\nbool Profile::LoadProfile(JSON* root,\n                          const char* user,\n                          const char* device_model,\n                          const char* device_serial)\n{\n    if (!LoadUser(root, user, device_model, device_serial))\n        return false;\n\n    return true;\n}\n\n\n//-----------------------------------------------------------------------------\nchar* Profile::GetValue(const char* key, char* val, int val_length) const\n{\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value))\n    {\n        OVR_strcpy(val, val_length, value->Value.ToCStr());\n        return val;\n    }\n    else\n    {\n        val[0] = 0;\n        return NULL;\n    }\n}\n\n//-----------------------------------------------------------------------------\nconst char* Profile::GetValue(const char* key)\n{\n    // Non-reentrant query.  The returned buffer can only be used until the next call\n    // to GetValue()\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value))\n    {\n        TempVal = value->Value;\n        return TempVal.ToCStr();\n    }\n    else\n    {\n        return NULL;\n    }\n}\n\n//-----------------------------------------------------------------------------\nint Profile::GetNumValues(const char* key) const\n{\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value))\n    {  \n        if (value->Type == JSON_Array)\n            return value->GetArraySize();\n        else\n            return 1;\n    }\n    else\n        return 0;        \n}\n\n//-----------------------------------------------------------------------------\nbool Profile::GetBoolValue(const char* key, bool default_val) const\n{\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value) && value->Type == JSON_Bool)\n        return (value->dValue != 0);\n    else\n        return default_val;\n}\n\n//-----------------------------------------------------------------------------\nint Profile::GetIntValue(const char* key, int default_val) const\n{\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value) && value->Type == JSON_Number)\n        return (int)(value->dValue);\n    else\n        return default_val;\n}\n\n//-----------------------------------------------------------------------------\nfloat Profile::GetFloatValue(const char* key, float default_val) const\n{\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value) && value->Type == JSON_Number)\n        return (float)(value->dValue);\n    else\n        return default_val;\n}\n\n//-----------------------------------------------------------------------------\nint Profile::GetFloatValues(const char* key, float* values, int num_vals) const\n{\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value) && value->Type == JSON_Array)\n    {\n        int val_count = Alg::Min(value->GetArraySize(), num_vals);\n        JSON* item = value->GetFirstItem();\n        int count=0;\n        while (item && count < val_count)\n        {\n            if (item->Type == JSON_Number)\n                values[count] = (float)item->dValue;\n            else\n                break;\n\n            count++;\n            item = value->GetNextItem(item);\n        }\n\n        return count;\n    }\n    else\n    {\n        return 0;\n    }\n}\n\n//-----------------------------------------------------------------------------\ndouble Profile::GetDoubleValue(const char* key, double default_val) const\n{\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value) && value->Type == JSON_Number)\n        return value->dValue;\n    else\n        return default_val;\n}\n\n//-----------------------------------------------------------------------------\nint Profile::GetDoubleValues(const char* key, double* values, int num_vals) const\n{\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value) && value->Type == JSON_Array)\n    {\n        int val_count = Alg::Min(value->GetArraySize(), num_vals);\n        JSON* item = value->GetFirstItem();\n        int count=0;\n        while (item && count < val_count)\n        {\n            if (item->Type == JSON_Number)\n                values[count] = item->dValue;\n            else\n                break;\n\n            count++;\n            item = value->GetNextItem(item);\n        }\n\n        return count;\n    }\n    return 0;\n}\n\n//-----------------------------------------------------------------------------\nvoid Profile::SetValue(JSON* val)\n{\n    if (val == NULL)\n        return;\n\n    if (val->Type == JSON_Number)\n        SetDoubleValue(val->Name, val->dValue);\n    else if (val->Type == JSON_Bool)\n        SetBoolValue(val->Name, (val->dValue != 0));\n    else if (val->Type == JSON_String)\n        SetValue(val->Name, val->Value);\n    else if (val->Type == JSON_Array)\n    {\n        // Create a copy of the array\n        JSON* value = val->Copy();\n        Values.PushBack(value);\n        ValMap.Set(value->Name, value);\n    }\n}\n\n//-----------------------------------------------------------------------------\nvoid Profile::SetValue(const char* key, const char* val)\n{\n    if (key == NULL || val == NULL)\n        return;\n\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value))\n    {\n        value->Value = val;\n    }\n    else\n    {\n        value = JSON::CreateString(val);\n        value->Name = key;\n\n        Values.PushBack(value);\n        ValMap.Set(key, value);\n    }\n}\n\n//-----------------------------------------------------------------------------\nvoid Profile::SetBoolValue(const char* key, bool val)\n{\n    if (key == NULL)\n        return;\n\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value))\n    {\n        value->dValue = val;\n    }\n    else\n    {\n        value = JSON::CreateBool(val);\n        value->Name = key;\n\n        Values.PushBack(value);\n        ValMap.Set(key, value);\n    }\n}\n\n//-----------------------------------------------------------------------------\nvoid Profile::SetIntValue(const char* key, int val)\n{\n    SetDoubleValue(key, val);\n}\n\n//-----------------------------------------------------------------------------\nvoid Profile::SetFloatValue(const char* key, float val)\n{\n    SetDoubleValue(key, val);\n}\n\n//-----------------------------------------------------------------------------\nvoid Profile::SetFloatValues(const char* key, const float* vals, int num_vals)\n{\n    JSON* value = NULL;\n    int val_count = 0;\n    if (ValMap.Get(key, &value))\n    {\n        if (value->Type == JSON_Array)\n        {\n            // truncate the existing array if fewer entries provided\n            int num_existing_vals = value->GetArraySize();\n            for (int i=num_vals; i<num_existing_vals; i++)\n                value->RemoveLast();\n            \n            JSON* item = value->GetFirstItem();\n            while (item && val_count < num_vals)\n            {\n                if (item->Type == JSON_Number)\n                    item->dValue = vals[val_count];\n\n                item = value->GetNextItem(item);\n                val_count++;\n            }\n        }\n        else\n        {\n            return;  // Maybe we should change the data type?\n        }\n    }\n    else\n    {\n        value = JSON::CreateArray();\n        value->Name = key;\n\n        Values.PushBack(value);\n        ValMap.Set(key, value);\n    }\n\n    for (; val_count < num_vals; val_count++)\n        value->AddArrayNumber(vals[val_count]);\n}\n\n//-----------------------------------------------------------------------------\nvoid Profile::SetDoubleValue(const char* key, double val)\n{\n    JSON* value = NULL;\n    if (ValMap.Get(key, &value))\n    {\n        value->dValue = val;\n    }\n    else\n    {\n        value = JSON::CreateNumber(val);\n        value->Name = key;\n\n        Values.PushBack(value);\n        ValMap.Set(key, value);\n    }\n}\n\n//-----------------------------------------------------------------------------\nvoid Profile::SetDoubleValues(const char* key, const double* vals, int num_vals)\n{\n    JSON* value = NULL;\n    int val_count = 0;\n    if (ValMap.Get(key, &value))\n    {\n        if (value->Type == JSON_Array)\n        {\n            // truncate the existing array if fewer entries provided\n            int num_existing_vals = value->GetArraySize();\n            for (int i=num_vals; i<num_existing_vals; i++)\n                value->RemoveLast();\n            \n            JSON* item = value->GetFirstItem();\n            while (item && val_count < num_vals)\n            {\n                if (item->Type == JSON_Number)\n                    item->dValue = vals[val_count];\n\n                item = value->GetNextItem(item);\n                val_count++;\n            }\n        }\n        else\n        {\n            return;  // Maybe we should change the data type?\n        }\n    }\n    else\n    {\n        value = JSON::CreateArray();\n        value->Name = key;\n\n        Values.PushBack(value);\n        ValMap.Set(key, value);\n    }\n\n    for (; val_count < num_vals; val_count++)\n        value->AddArrayNumber(vals[val_count]);\n}\n\n//------------------------------------------------------------------------------\nbool Profile::IsDefaultProfile()\n{\n    return 0 == OVR::String::CompareNoCase(\"Default\", GetValue(OVR_KEY_NAME));\n}\n\n\n}  // namespace OVR\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/OVR_Profile.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Profile.h\nContent     :   Structs and functions for loading and storing device profile settings\nCreated     :   February 14, 2013\nNotes       :\n   Profiles are used to store per-user settings that can be transferred and used\n   across multiple applications.  For example, player IPD can be configured once \n   and reused for a unified experience across games.  Configuration and saving of profiles\n   can be accomplished in game via the Profile API or by the official Oculus Configuration\n   Utility.\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Profile_h\n#define OVR_Profile_h\n\n#include \"OVR_CAPI_Keys.h\"\n\n#include \"Sensors/OVR_DeviceConstants.h\"\n#include \"Kernel/OVR_String.h\"\n#include \"Kernel/OVR_RefCount.h\"\n#include \"Kernel/OVR_Array.h\"\n#include \"Kernel/OVR_StringHash.h\"\n#include \"Kernel/OVR_System.h\"\n\nnamespace OVR {\n\nclass HMDInfo; // Opaque forward declaration\nclass Profile;\nclass JSON;\n\n\n// Device key for looking up profiles\nstruct ProfileDeviceKey\n{\n    ProfileDeviceKey(const HMDInfo* info);\n\n\t// Initialized properly?\n\tbool Valid;\n\n    // The HMD type\n    HmdTypeEnum HmdType;\n\n\t// This is the 12 character serial number printed on the HMD\n\tString PrintedSerial;\n\n\t// This is the product name string of the USB sensor device\n\t// Note: It has been modified from the original to remove spaces and strip off \"Oculus\"\n\tString ProductName;\n\n\t// This is the product id from the HID info of the USB sensor device\n\tunsigned ProductId;\n\n    static String SanitizeProductName(String productName);\n};\n\n\n// -----------------------------------------------------------------------------\n// ***** ProfileManager\n\n// Profiles are interfaced through a ProfileManager object.  Applications should\n// create a ProfileManager each time they intend to read or write user profile data.\n// The scope of the ProfileManager object defines when disk I/O is performed.  Disk\n// reads are performed on the first profile access and disk writes are performed when\n// the ProfileManager goes out of scope.  All profile interactions between these times\n// are performed in local memory and are fast.  A typical profile interaction might\n// look like this:\n//\n// {\n//     Ptr<ProfileManager> pm      = *ProfileManager::Create();\n//     Ptr<Profile>        profile = pm->LoadProfile(Profile_RiftDK1,\n//                                                   pm->GetDefaultProfileName(Profile_RiftDK1));\n//     if (profile)\n//     {   // Retrieve the current profile settings\n//     }\n// }   // Profile will be destroyed and any disk I/O completed when going out of scope\nclass ProfileManager : public NewOverrideBase, public SystemSingletonBase<ProfileManager>\n{\n    friend class OVR::SystemSingletonBase<ProfileManager>;\n\nprotected:\n    ProfileManager(bool sys_register);\n    virtual ~ProfileManager();\n    virtual void OnSystemDestroy();\n\nprotected:\n    // Synchronize ProfileManager access since it may be accessed from multiple threads,\n    // as it's shared through DeviceManager.\n    Lock                ProfileLock;\n    Ptr<JSON>           ProfileCache;\n    bool                Changed;\n    String              TempBuff;\n    String              BasePath;\n    \npublic:\n    // In the service process it is important to set the base path because this cannot be detected automatically\n    void                SetBasePath(String basePath);\n\n    int                 GetUserCount();\n    const char*         GetUser(unsigned int index);\n    bool                CreateUser(const char* user, const char* name);\n\tbool\t\t\t\tHasUser(const char* user);\n    bool                RemoveUser(const char* user);\n    const char*         GetDefaultUser(const ProfileDeviceKey& deviceKey);\n    bool                SetDefaultUser(const ProfileDeviceKey& deviceKey, const char* user);\n\n    virtual Profile*    CreateProfile();\n    Profile*            GetProfile(const ProfileDeviceKey& deviceKey, const char* user);\n    Profile*            GetDefaultUserProfile(const ProfileDeviceKey& deviceKey);\n    Profile*            GetDefaultProfile(HmdTypeEnum device);\n    Profile*            GetTaggedProfile(const char** key_names, const char** keys, int num_keys);\n    bool                SetTaggedProfile(const char** key_names, const char** keys, int num_keys, Profile* profile);\n    \n    // Force re-reading the settings\n    void                Read();\n\nprotected:\n    // Force writing the settings\n    void                ClearProfileData();\n    void                Save();\n\n    String              GetProfilePath();\n    void                LoadCache(bool create);\n    void                LoadV1Profiles(JSON* v1);\n    const char*         GetDefaultUser(const char* product, const char* serial);\n};\n\n\n//-------------------------------------------------------------------\n// ***** Profile\n\n// The base profile for all users.  This object is not created directly.\n// Instead derived device objects provide add specific device members to \n// the base profile\nclass Profile : public RefCountBase<Profile>\n{\nprotected:\n    OVR::Hash<String, JSON*, String::HashFunctor>   ValMap;\n    OVR::Array<JSON*>   Values;  \n    OVR::String         TempVal;\n    String              BasePath;\n\npublic:\n    ~Profile();\n\n    int                 GetNumValues(const char* key) const;\n    const char*         GetValue(const char* key);\n    char*               GetValue(const char* key, char* val, int val_length) const;\n    bool                GetBoolValue(const char* key, bool default_val) const;\n    int                 GetIntValue(const char* key, int default_val) const;\n    float               GetFloatValue(const char* key, float default_val) const;\n    int                 GetFloatValues(const char* key, float* values, int num_vals) const;\n    double              GetDoubleValue(const char* key, double default_val) const;\n    int                 GetDoubleValues(const char* key, double* values, int num_vals) const;\n\n    void                SetValue(const char* key, const char* val);\n    void                SetBoolValue(const char* key, bool val);\n    void                SetIntValue(const char* key, int val);\n    void                SetFloatValue(const char* key, float val);\n    void                SetFloatValues(const char* key, const float* vals, int num_vals);\n    void                SetDoubleValue(const char* key, double val);\n    void                SetDoubleValues(const char* key, const double* vals, int num_vals);\n\n    bool                IsDefaultProfile();\n    \n    bool Close();\n\nprotected:\n\tProfile(String basePath) :\n\t\tBasePath(basePath)\n\t{\n\t}\n    \n    void                SetValue(JSON* val);\n\n\tstatic bool         LoadProfile(const ProfileDeviceKey& deviceKey,\n                                    const char* user,\n                                    Profile** profile);\n    void                CopyItems(JSON* root, String prefix);\n    \n    bool                LoadDeviceFile(unsigned int device_id, const char* serial);\n\tbool                LoadDeviceProfile(const ProfileDeviceKey& deviceKey);\n\n    bool                LoadProfile(JSON* root,\n                                    const char* user,\n                                    const char* device_model,\n                                    const char* device_serial);\n\n    bool                LoadUser(JSON* root,\n                                 const char* user,\n                                 const char* device_name,\n                                 const char* device_serial);\n\n    friend class ProfileManager;\n    friend class WProfileManager;\n};\n\n// This path should be passed into the ProfileManager\nString GetBaseOVRPath(bool create_dir);\n\n\n} // namespace OVR\n\n#endif // OVR_Profile_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/OVR_SerialFormat.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_System.cpp\nContent     :   General kernel initialization/cleanup, including that\n                of the memory allocator.\nCreated     :   September 19, 2012\nNotes       : \n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"OVR_SerialFormat.h\"\n\n#ifdef SERIAL_FORMAT_UNIT_TEST\n#include \"Kernel/OVR_Log.h\"\n#include \"Kernel/OVR_Rand.h\"\n#endif\n\n\n#include <cctype>\n#include <ctime>\n\nnamespace OVR {\n\n\n//// Serial Format Detection\n\nSerialFormatType DetectBufferFormat(uint8_t firstByte, int sizeInBytes)\n{\n\tswitch (firstByte)\n\t{\n\tcase SerialFormatType_DK2:\n\t\tif (sizeInBytes == 12)\n\t\t{\n\t\t\treturn SerialFormatType_DK2;\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn SerialFormatType_Invalid;\n}\n\n\n//// DK2 Helpers\n\nstatic bool ValidDK2ProductId(int x)\n{\n\tswitch (x)\n\t{\n\tcase DK2ProductId_DK1:\n\tcase DK2ProductId_DK2:\n\tcase DK2ProductId_Refurb:\n\t\treturn true;\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn false;\n}\n\nstatic bool ValidDK2PartId(int x)\n{\n\tswitch (x)\n\t{\n\tcase DK2PartId_HMD:\n\tcase DK2PartId_PTC:\n\tcase DK2PartId_Carton:\n\t\treturn true;\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn false;\n}\n\n\n//// DK2BinarySerialFormat\n\nbool DK2BinarySerialFormat::FromBuffer(const uint8_t buffer[12], bool allowUnknownTypes)\n{\n\t// Format Type must be 0\n\t\n\tint formatType = buffer[0];\n\n\tif (formatType != SerialFormatType_DK2)\n\t{\n\t\treturn false;\n\t}\n\n\t// Product Id\n\n\tint productId = buffer[1] >> 4;\n\n\tif (!allowUnknownTypes && !ValidDK2ProductId(productId))\n\t{\n\t\treturn false;\n\t}\n\n\tProductId = (DK2ProductId)productId;\n\n\t// Part Id\n\n\tint partId = buffer[1] & 15;\n\n\tif (!allowUnknownTypes && !ValidDK2PartId(partId))\n\t{\n\t\treturn false;\n\t}\n\n\tPartId = (DK2PartId)partId;\n\n\t// Minutes Since Epoch (May 1, 2014)\n\n\tMinutesSinceEpoch = buffer[4] | ((uint32_t)buffer[3] << 8) | ((uint32_t)buffer[2] << 16);\n\n\t// Unit number on that day\n\n\tUnitNumber = buffer[6] | ((uint32_t)buffer[5] << 8);\n\n\t// Hash of MAC address\n\n\tMacHash[0] = buffer[7];\n\tMacHash[1] = buffer[8];\n\tMacHash[2] = buffer[9];\n\tMacHash[3] = buffer[10];\n\tMacHash[4] = buffer[11];\n\n\treturn true;\n}\n\nvoid DK2BinarySerialFormat::ToBuffer(uint8_t buffer[12])\n{\n\t// Serialize to buffer\n\tbuffer[0] = SerialFormatType_DK2;\n\tbuffer[1] = (uint8_t)((ProductId << 4) | (PartId));\n\tbuffer[2] = (uint8_t)(MinutesSinceEpoch >> 16);\n\tbuffer[3] = (uint8_t)(MinutesSinceEpoch >> 8);\n\tbuffer[4] = (uint8_t)MinutesSinceEpoch;\n\tbuffer[5] = (uint8_t)(UnitNumber >> 8);\n\tbuffer[6] = (uint8_t)UnitNumber;\n\n\tbuffer[7] = MacHash[0];\n\tbuffer[8] = MacHash[1];\n\tbuffer[9] = MacHash[2];\n\tbuffer[10] = MacHash[3];\n\tbuffer[11] = MacHash[4];\n}\n\nbool DK2BinarySerialFormat::operator==(const DK2BinarySerialFormat& rhs)\n{\n\tif (ProductId != rhs.ProductId)\n\t\treturn false;\n\tif (PartId != rhs.PartId)\n\t\treturn false;\n\tif (MinutesSinceEpoch != rhs.MinutesSinceEpoch)\n\t\treturn false;\n\tif (UnitNumber != rhs.UnitNumber)\n\t\treturn false;\n\tfor (int ii = 0; ii < 5; ++ii)\n\t{\n\t\tif (MacHash[ii] != rhs.MacHash[ii])\n\t\t\treturn false;\n\t}\n\treturn true;\n}\n\n\n//// DK2PrintedSerialFormat\n\n// Base-32 Crockford decoding rules:\n// 0 o O => 0\n// 1 i | I L l => 1\n// 2, 3, 4, 5, 6, 7, 8, 9 => 2 - 9\n// a, b, c, d, e, f, g, h => 10 - 17\n// j, k => 18, 19\n// m, n => 20, 21\n// p, q, r, s, t => 22, 23, 24, 25, 26\n// v, w, x, y, z => 27, 28, 29, 30, 31\nstatic const char Base32FromChar[256] = {\n\t// Null - Unit Separator\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0 - 15\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 16 - 31\n\t// (sp)!\"#$%&'()*+,-./\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 32 - 47\n\t// 0123456789:;<=>?\n\t 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1, // 48 - 63\n\t// @A-Z[\\]^_\n\t-1, 10, 11, 12, 13, 14, 15, 16, 17,  1, 18, 19,  1, 20, 21,  0, // 64 - 79\n\t22, 23, 24, 25, 26, -1, 27, 28, 29, 30, 31, -1, -1, -1, -1, -1, // 80 - 95\n\t// `a-z{|}~DEL\n\t-1, 10, 11, 12, 13, 14, 15, 16, 17,  1, 18, 19,  1, 20, 21,  0, // 96 - 111\n\t22, 23, 24, 25, 26, -1, 27, 28, 29, 30, 31, -1,  1, -1, -1, -1, // 112 - 127\n\n\t// Extended ASCII:\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1\n};\n\n// Base-32 Crockford encoding rules:\n// 0-9 => 0-9\n// 10 - 17 => a, b, c, d, e, f, g, h\n// 18, 19 => j, k\n// 20, 21 => m, n\n// 22, 23, 24, 25, 26 => p, q, r, s, t\n// 27, 28, 29, 30, 31 => v, w, x, y, z\nstatic const char* CharFromBase32 = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\n\nbool DK2PrintedSerialFormat::FromBase32(const char* str, bool allowUnknownTypes)\n{\n\t// Note: Truncated strings get caught by returning negative values from the table like other invalid characters\n\n\t// Product Id\n\n\tint productId = Base32FromChar[(unsigned char)str[0]];\n\tif (productId < 0 || (!allowUnknownTypes && !ValidDK2ProductId(productId)))\n\t{\n\t\treturn false;\n\t}\n\n\tProductId = (DK2ProductId)productId;\n\n\t// Label Type\n\n\tint labelType = Base32FromChar[(unsigned char)str[1]];\n\tif (labelType < 0 || (!allowUnknownTypes && !ValidDK2PartId(labelType)))\n\t{\n\t\treturn false;\n\t}\n\n\tLabelType = (DK2LabelType)labelType;\n\n\tuint8_t dataBytes[7];\n\tfor (int ii = 0; ii < 7; ++ii)\n\t{\n\t\tint c = Base32FromChar[(unsigned char)str[2 + ii]];\n\t\tif (c < 0) return false;\n\t\tdataBytes[ii] = (uint8_t)c;\n\t}\n\n\t// Minutes Since Epoch\n\n\tMinutesSinceEpoch = dataBytes[3] | ((uint32_t)dataBytes[2] << 5) | ((uint32_t)dataBytes[1] << 10) | ((uint32_t)dataBytes[0] << 15);\n\n\t// Unit Number\n\n\tUnitNumber = dataBytes[6] | ((uint32_t)dataBytes[5] << 5) | ((uint32_t)dataBytes[4] << 10);\n\n\t// MAC Hash\n\n\tfor (int ii = 0; ii < 3; ++ii)\n\t{\n\t\tint c = Base32FromChar[(unsigned char)str[9 + ii]];\n\t\tif (c < 0)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tMacHashLow[ii] = (uint8_t)c;\n\t}\n\n\t// String must be exactly 12 characters\n\tif (str[12] != '\\0')\n\t{\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nString DK2PrintedSerialFormat::ToBase32()\n{\n\tString s;\n\n\ts += CharFromBase32[ProductId];\n\ts += CharFromBase32[LabelType];\n\ts += CharFromBase32[(MinutesSinceEpoch >> 15) & 31];\n\ts += CharFromBase32[(MinutesSinceEpoch >> 10) & 31];\n\ts += CharFromBase32[(MinutesSinceEpoch >> 5) & 31];\n\ts += CharFromBase32[MinutesSinceEpoch & 31];\n\ts += CharFromBase32[(UnitNumber >> 10) & 31];\n\ts += CharFromBase32[(UnitNumber >> 5) & 31];\n\ts += CharFromBase32[UnitNumber & 31];\n\ts += CharFromBase32[MacHashLow[0] & 31];\n\ts += CharFromBase32[MacHashLow[1] & 31];\n\ts += CharFromBase32[MacHashLow[2] & 31];\n\n\treturn s;\n}\n\nbool DK2PrintedSerialFormat::operator==(const DK2PrintedSerialFormat& rhs)\n{\n\tif (ProductId != rhs.ProductId)\n\t\treturn false;\n\tif (LabelType != rhs.LabelType)\n\t\treturn false;\n\tif (MinutesSinceEpoch != rhs.MinutesSinceEpoch)\n\t\treturn false;\n\tif (UnitNumber != rhs.UnitNumber)\n\t\treturn false;\n\tfor (int ii = 0; ii < 3; ++ii)\n\t{\n\t\tif (MacHashLow[ii] != rhs.MacHashLow[ii])\n\t\t\treturn false;\n\t}\n\treturn true;\n}\n\nbool DK2PrintedSerialFormat::operator==(const DK2BinarySerialFormat& rhs)\n{\n\tif (ProductId != rhs.ProductId)\n\t\treturn false;\n\tif (LabelType != rhs.PartId)\n\t\treturn false;\n\tif (MinutesSinceEpoch != rhs.MinutesSinceEpoch)\n\t\treturn false;\n\tif (UnitNumber != rhs.UnitNumber)\n\t\treturn false;\n\tfor (int ii = 0; ii < 3; ++ii)\n\t{\n\t\tif (MacHashLow[ii] != (rhs.MacHash[ii] & 31))\n\t\t\treturn false;\n\t}\n\treturn true;\n}\n\nvoid DK2PrintedSerialFormat::FromBinary(const DK2BinarySerialFormat& bin)\n{\n\tProductId = bin.ProductId;\n\tLabelType = bin.PartId;\n\tMinutesSinceEpoch = bin.MinutesSinceEpoch;\n\tUnitNumber = bin.UnitNumber;\n\tMacHashLow[0] = bin.MacHash[0] & 31;\n\tMacHashLow[1] = bin.MacHash[1] & 31;\n\tMacHashLow[2] = bin.MacHash[2] & 31;\n}\n\n\n\n\n} // OVR\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/OVR_SerialFormat.h",
    "content": "/************************************************************************************\n\nPublicHeader:   n/a\nFilename    :   OVR_SerialFormat.h\nContent     :   Serial Number format tools\nCreated     :   June 12, 2014\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_SerialFormat_h\n#define OVR_SerialFormat_h\n\n#include \"Kernel/OVR_Types.h\"\n#include \"Kernel/OVR_String.h\"\n\n#include \"OVR_Version.h\"\n\n\nnamespace OVR {\n\n\n//-----------------------------------------------------------------------------\n// SerialFormatType enumeration\n\nenum SerialFormatType\n{\n\tSerialFormatType_Invalid = -1, // Invalid format\n\tSerialFormatType_DK2 = 0,\t   // Format used for DK2\n};\n\n// Returns the expected serial format based on the first byte of the buffer\nSerialFormatType DetectBufferFormat(uint8_t firstByte, int sizeInBytes);\n\n\n//-----------------------------------------------------------------------------\n// DK2 Serial Format\n\nenum DK2ProductId\n{\n\tDK2ProductId_DK1    = 1, // DK1\n\tDK2ProductId_DK2    = 2, // Product Id used for initial DK2 launch\n\tDK2ProductId_Refurb = 3, // Refurbished DK2\n};\n\nenum DK2PartId\n{\n\tDK2PartId_HMD    = 0, // HMD\n\tDK2PartId_PTC    = 1, // PTC(camera)\n\tDK2PartId_Carton = 2, // Carton: An HMD + PTC combo (should not be stamped on a component) AKA Overpack\n};\n\ntypedef DK2PartId DK2LabelType; // Printed Serial Number version\n\n\n// DK2 tool for reading/writing the binary serial format\nclass DK2BinarySerialFormat\n{\npublic:\n\tstatic const SerialFormatType FormatType = SerialFormatType_DK2; // first byte\n\n\tDK2ProductId ProductId;         // [4 bits] 2 = DK2\n\tDK2PartId    PartId;            // [4 bits] 0 means HMD, 1 means PTC(camera)\n\tint          MinutesSinceEpoch; // [3 bytes] Number of minutes that have elapsed since the epoch: May 1st, 2014\n\t// [0] = high byte, [1] = middle byte, [2] = low byte\n\tint          UnitNumber;        // [2 bytes] Value that increments each time a new serial number is created.  Resets to zero each day\n\t// [0] = high byte, [1] = low byte\n\tuint8_t      MacHash[5];        // [5 bytes] 5 most significant bytes of MD5 hash from first ethernet adapter mac address\n\n\tbool operator==(const DK2BinarySerialFormat& rhs);\n\npublic:\n\t// Returns false if the input is invalid in some way\n\tbool FromBuffer(const uint8_t buffer[12], bool allowUnknownTypes = false);\n\n\t// Fills the provided buffer with 12 bytes\n\tvoid ToBuffer(uint8_t buffer[12]);\n};\n\n\n// DK2 tool for reading/writing the printed serial format\nclass DK2PrintedSerialFormat\n{\npublic:\n\tDK2ProductId ProductId;         // [1 char] 2 = DK2, 3 = Reconditioned bundle\n\tDK2LabelType LabelType;         // [1 char] 0 means HMD, 1 means PTC(camera), 2 means Overpack(bundle)\n\tint          MinutesSinceEpoch; // [4 char] Number of minutes that have elapsed since the epoch: May 1st, 2014\n\tint          UnitNumber;        // [3 char] Value that increments each time a new serial number is created.  Resets to zero each day\n\tuint8_t      MacHashLow[3];     // [3 char] 3 least significant bytes of mac hash\n\n\tbool operator==(const DK2PrintedSerialFormat& rhs);\n\tbool operator==(const DK2BinarySerialFormat& rhs);\n\npublic:\n\t// Convert from binary to printed\n\tvoid FromBinary(const DK2BinarySerialFormat& bin);\n\n\t// Returns false if the input is invalid in some way\n\t// Convert from a 12 character printed serial number\n\tbool FromBase32(const char* str, bool allowUnknownTypes = false);\n\n\t// Returns a long human-readable base32 string (20 characters), NOT a printed serial number\n\tString ToBase32();\n};\n\n\n\n\n} // OVR\n\n#endif // OVR_SerialFormat_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/OVR_Stereo.cpp",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Stereo.cpp\nContent     :   Stereo rendering functions\nCreated     :   November 30, 2013\nAuthors     :   Tom Fosyth\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include \"OVR_Stereo.h\"\n#include \"OVR_Profile.h\"\n#include \"Kernel/OVR_Log.h\"\n#include \"Kernel/OVR_Alg.h\"\n\n#include \"Util/Util_Render_Stereo.h\" // DistortionMeshCreate\n\n\n//To allow custom distortion to be introduced to CatMulSpline.\nfloat (*CustomDistortion)(float) = nullptr;\nfloat (*CustomDistortionInv)(float) = nullptr;\n\n\nnamespace OVR {\n\n\nusing namespace Alg;\n\n//-----------------------------------------------------------------------------------\n\n// Inputs are 4 points (pFitX[0],pFitY[0]) through (pFitX[3],pFitY[3])\n// Result is four coefficients in pResults[0] through pResults[3] such that\n//      y = pResult[0] + x * ( pResult[1] + x * ( pResult[2] + x * ( pResult[3] ) ) );\n// passes through all four input points.\n// Return is true if it succeeded, false if it failed (because two control points\n// have the same pFitX value).\nbool FitCubicPolynomial ( float *pResult, const float *pFitX, const float *pFitY )\n{\n    float d0 = ( ( pFitX[0]-pFitX[1] ) * ( pFitX[0]-pFitX[2] ) * ( pFitX[0]-pFitX[3] ) );\n    float d1 = ( ( pFitX[1]-pFitX[2] ) * ( pFitX[1]-pFitX[3] ) * ( pFitX[1]-pFitX[0] ) );\n    float d2 = ( ( pFitX[2]-pFitX[3] ) * ( pFitX[2]-pFitX[0] ) * ( pFitX[2]-pFitX[1] ) );\n    float d3 = ( ( pFitX[3]-pFitX[0] ) * ( pFitX[3]-pFitX[1] ) * ( pFitX[3]-pFitX[2] ) );\n\n    if ( ( d0 == 0.0f ) || ( d1 == 0.0f ) || ( d2 == 0.0f ) || ( d3 == 0.0f ) )\n    {\n        return false;\n    }\n\n    float f0 = pFitY[0] / d0;\n    float f1 = pFitY[1] / d1;\n    float f2 = pFitY[2] / d2;\n    float f3 = pFitY[3] / d3;\n\n    pResult[0] = -( f0*pFitX[1]*pFitX[2]*pFitX[3]\n                  + f1*pFitX[0]*pFitX[2]*pFitX[3]\n                  + f2*pFitX[0]*pFitX[1]*pFitX[3]\n                  + f3*pFitX[0]*pFitX[1]*pFitX[2] );\n    pResult[1] = f0*(pFitX[1]*pFitX[2] + pFitX[2]*pFitX[3] + pFitX[3]*pFitX[1])\n               + f1*(pFitX[0]*pFitX[2] + pFitX[2]*pFitX[3] + pFitX[3]*pFitX[0])\n               + f2*(pFitX[0]*pFitX[1] + pFitX[1]*pFitX[3] + pFitX[3]*pFitX[0])\n               + f3*(pFitX[0]*pFitX[1] + pFitX[1]*pFitX[2] + pFitX[2]*pFitX[0]);\n    pResult[2] = -( f0*(pFitX[1]+pFitX[2]+pFitX[3])\n                  + f1*(pFitX[0]+pFitX[2]+pFitX[3])\n                  + f2*(pFitX[0]+pFitX[1]+pFitX[3])\n                  + f3*(pFitX[0]+pFitX[1]+pFitX[2]) );\n    pResult[3] = f0 + f1 + f2 + f3;\n\n    return true;\n}\n\n#define TPH_SPLINE_STATISTICS 0\n#if TPH_SPLINE_STATISTICS\nstatic float max_scaledVal = 0;\nstatic float average_total_out_of_range = 0;\nstatic float average_out_of_range;\nstatic int num_total = 0;\nstatic int num_out_of_range = 0;\nstatic int num_out_of_range_over_1 = 0;\nstatic int num_out_of_range_over_2 = 0;\nstatic int num_out_of_range_over_3 = 0;\nstatic float percent_out_of_range;\n#endif\n\nfloat EvalCatmullRom10Spline ( float const *K, float scaledVal )\n{\n    int const NumSegments = LensConfig::NumCoefficients;\n\n\t#if TPH_SPLINE_STATISTICS\n\t//Value should be in range of 0 to (NumSegments-1) (typically 10) if spline is valid. Right?\n\tif (scaledVal > (NumSegments-1))\n\t{\n\t\tnum_out_of_range++;\n\t\taverage_total_out_of_range+=scaledVal;\n\t\taverage_out_of_range = average_total_out_of_range / ((float) num_out_of_range); \n\t\tpercent_out_of_range = 100.0f*(num_out_of_range)/num_total;\n\t}\n\tif (scaledVal > (NumSegments-1+1)) num_out_of_range_over_1++;\n\tif (scaledVal > (NumSegments-1+2)) num_out_of_range_over_2++;\n\tif (scaledVal > (NumSegments-1+3)) num_out_of_range_over_3++;\n\tnum_total++;\n\tif (scaledVal > max_scaledVal)\n\t{\n\t\tmax_scaledVal = scaledVal;\n\t\tmax_scaledVal = scaledVal;\n\t}\n\t#endif\n\n    float scaledValFloor = floorf ( scaledVal );\n    scaledValFloor = Alg::Max ( 0.0f, Alg::Min ( (float)(NumSegments-1), scaledValFloor ) );\n    float t = scaledVal - scaledValFloor;\n    int k = (int)scaledValFloor;\n\n    float p0, p1;\n    float m0, m1;\n    switch ( k )\n    {\n    case 0:\n        // Curve starts at 1.0 with gradient K[1]-K[0]\n        p0 = 1.0f;\n        m0 =        ( K[1] - K[0] );    // general case would have been (K[1]-K[-1])/2\n        p1 = K[1];\n        m1 = 0.5f * ( K[2] - K[0] );\n        break;\n    default:\n        // General case\n        p0 = K[k  ];\n        m0 = 0.5f * ( K[k+1] - K[k-1] );\n        p1 = K[k+1];\n        m1 = 0.5f * ( K[k+2] - K[k  ] );\n        break;\n    case NumSegments-2:\n        // Last tangent is just the slope of the last two points.\n        p0 = K[NumSegments-2];\n        m0 = 0.5f * ( K[NumSegments-1] - K[NumSegments-3] );\n        p1 = K[NumSegments-1];\n        m1 = K[NumSegments-1] - K[NumSegments-2];\n        break;\n    case NumSegments-1:\n        // Beyond the last segment it's just a straight line\n        p0 = K[NumSegments-1];\n        m0 = K[NumSegments-1] - K[NumSegments-2];\n        p1 = p0 + m0;\n        m1 = m0;\n        break;\n    }\n\n    float omt = 1.0f - t;\n    float res  = ( p0 * ( 1.0f + 2.0f *   t ) + m0 *   t ) * omt * omt\n               + ( p1 * ( 1.0f + 2.0f * omt ) - m1 * omt ) *   t *   t;\n\n    return res;\n}\n\n\n\n\n// Converts a Profile eyecup string into an eyecup enumeration\nvoid SetEyeCup(HmdRenderInfo* renderInfo, const char* cup)\n{\n    if (OVR_strcmp(cup, \"A\") == 0)\n        renderInfo->EyeCups = EyeCup_DK1A;\n    else if (OVR_strcmp(cup, \"B\") == 0)\n        renderInfo->EyeCups = EyeCup_DK1B;\n    else if (OVR_strcmp(cup, \"C\") == 0)\n        renderInfo->EyeCups = EyeCup_DK1C;\n    else if (OVR_strcmp(cup, \"Orange A\") == 0)\n        renderInfo->EyeCups =  EyeCup_OrangeA;\n    else if (OVR_strcmp(cup, \"Red A\") == 0)\n        renderInfo->EyeCups = EyeCup_RedA;\n    else if (OVR_strcmp(cup, \"Pink A\") == 0)\n        renderInfo->EyeCups = EyeCup_PinkA;\n    else if (OVR_strcmp(cup, \"Blue A\") == 0)\n        renderInfo->EyeCups = EyeCup_BlueA;\n    else\n        renderInfo->EyeCups = EyeCup_DK1A;\n}\n\n\n\n//-----------------------------------------------------------------------------------\n\n\n// The result is a scaling applied to the distance.\nfloat LensConfig::DistortionFnScaleRadiusSquared (float rsq) const\n{\n    float scale = 1.0f;\n    switch ( Eqn )\n    {\n    case Distortion_Poly4:\n        // This version is deprecated! Prefer one of the other two.\n        scale = ( K[0] + rsq * ( K[1] + rsq * ( K[2] + rsq * K[3] ) ) );\n        break;\n    case Distortion_RecipPoly4:\n        scale = 1.0f / ( K[0] + rsq * ( K[1] + rsq * ( K[2] + rsq * K[3] ) ) );\n        break;\n    case Distortion_CatmullRom10:{\n        // A Catmull-Rom spline through the values 1.0, K[1], K[2] ... K[10]\n        // evenly spaced in R^2 from 0.0 to MaxR^2\n        // K[0] controls the slope at radius=0.0, rather than the actual value.\n        const int NumSegments = LensConfig::NumCoefficients;\n        OVR_ASSERT ( NumSegments <= NumCoefficients );\n        float scaledRsq = (float)(NumSegments-1) * rsq / ( MaxR * MaxR );\n        scale = EvalCatmullRom10Spline ( K, scaledRsq );\n\n\n\t\t//Intercept, and overrule if needed\n\t\tif (CustomDistortion)\n\t\t{\n\t\t\tscale = CustomDistortion(rsq);\n\t\t}\n\n        }break;\n    default:\n        OVR_ASSERT ( false );\n        break;\n    }\n    return scale;\n}\n\n// x,y,z components map to r,g,b\nVector3f LensConfig::DistortionFnScaleRadiusSquaredChroma (float rsq) const\n{\n    float scale = DistortionFnScaleRadiusSquared ( rsq );\n    Vector3f scaleRGB;\n    scaleRGB.x = scale * ( 1.0f + ChromaticAberration[0] + rsq * ChromaticAberration[1] );     // Red\n    scaleRGB.y = scale;                                                                        // Green\n    scaleRGB.z = scale * ( 1.0f + ChromaticAberration[2] + rsq * ChromaticAberration[3] );     // Blue\n    return scaleRGB;\n}\n\n// DistortionFnInverse computes the inverse of the distortion function on an argument.\nfloat LensConfig::DistortionFnInverse(float r) const\n{    \n    OVR_ASSERT((r <= 20.0f));\n\n    float s, d;\n    float delta = r * 0.25f;\n\n    // Better to start guessing too low & take longer to converge than too high\n    // and hit singularities. Empirically, r * 0.5f is too high in some cases.\n    s = r * 0.25f;\n    d = fabs(r - DistortionFn(s));\n\n    for (int i = 0; i < 20; i++)\n    {\n        float sUp   = s + delta;\n        float sDown = s - delta;\n        float dUp   = fabs(r - DistortionFn(sUp));\n        float dDown = fabs(r - DistortionFn(sDown));\n\n        if (dUp < d)\n        {\n            s = sUp;\n            d = dUp;\n        }\n        else if (dDown < d)\n        {\n            s = sDown;\n            d = dDown;\n        }\n        else\n        {\n            delta *= 0.5f;\n        }\n    }\n\n    return s;\n}\n\n\n\nfloat LensConfig::DistortionFnInverseApprox(float r) const\n{\n    float rsq = r * r;\n    float scale = 1.0f;\n    switch ( Eqn )\n    {\n    case Distortion_Poly4:\n        // Deprecated\n        OVR_ASSERT ( false );\n        break;\n    case Distortion_RecipPoly4:\n        scale = 1.0f / ( InvK[0] + rsq * ( InvK[1] + rsq * ( InvK[2] + rsq * InvK[3] ) ) );\n        break;\n    case Distortion_CatmullRom10:{\n        // A Catmull-Rom spline through the values 1.0, K[1], K[2] ... K[9]\n        // evenly spaced in R^2 from 0.0 to MaxR^2\n        // K[0] controls the slope at radius=0.0, rather than the actual value.\n        const int NumSegments = LensConfig::NumCoefficients;\n        OVR_ASSERT ( NumSegments <= NumCoefficients );\n        float scaledRsq = (float)(NumSegments-1) * rsq / ( MaxInvR * MaxInvR );\n        scale = EvalCatmullRom10Spline ( InvK, scaledRsq );\n\n\t\t//Intercept, and overrule if needed\n\t\tif (CustomDistortionInv)\n\t\t{\n\t\t\tscale = CustomDistortionInv(rsq);\n\t\t}\n\n        }break;\n    default:\n        OVR_ASSERT ( false );\n        break;\n    }\n    return r * scale;\n}\n\nvoid LensConfig::SetUpInverseApprox()\n{\n    float maxR = MaxInvR;\n\n    switch ( Eqn )\n    {\n    case Distortion_Poly4:\n        // Deprecated\n        OVR_ASSERT ( false );\n        break;\n    case Distortion_RecipPoly4:{\n\n        float sampleR[4];\n        float sampleRSq[4];\n        float sampleInv[4];\n        float sampleFit[4];\n\n        // Found heuristically...\n        sampleR[0] = 0.0f;\n        sampleR[1] = maxR * 0.4f;\n        sampleR[2] = maxR * 0.8f;\n        sampleR[3] = maxR * 1.5f;\n        for ( int i = 0; i < 4; i++ )\n        {\n            sampleRSq[i] = sampleR[i] * sampleR[i];\n            sampleInv[i] = DistortionFnInverse ( sampleR[i] );\n            sampleFit[i] = sampleR[i] / sampleInv[i];\n        }\n        sampleFit[0] = 1.0f;\n        FitCubicPolynomial ( InvK, sampleRSq, sampleFit );\n\n    #if 0\n        // Should be a nearly exact match on the chosen points.\n        OVR_ASSERT ( fabs ( DistortionFnInverse ( sampleR[0] ) - DistortionFnInverseApprox ( sampleR[0] ) ) / maxR < 0.0001f );\n        OVR_ASSERT ( fabs ( DistortionFnInverse ( sampleR[1] ) - DistortionFnInverseApprox ( sampleR[1] ) ) / maxR < 0.0001f );\n        OVR_ASSERT ( fabs ( DistortionFnInverse ( sampleR[2] ) - DistortionFnInverseApprox ( sampleR[2] ) ) / maxR < 0.0001f );\n        OVR_ASSERT ( fabs ( DistortionFnInverse ( sampleR[3] ) - DistortionFnInverseApprox ( sampleR[3] ) ) / maxR < 0.0001f );\n        // Should be a decent match on the rest of the range.\n        const int maxCheck = 20;\n        for ( int i = 0; i < maxCheck; i++ )\n        {\n            float checkR = (float)i * maxR / (float)maxCheck;\n            float realInv = DistortionFnInverse       ( checkR );\n            float testInv = DistortionFnInverseApprox ( checkR );\n            float error = fabsf ( realInv - testInv ) / maxR;\n            OVR_ASSERT ( error < 0.1f );\n        }\n    #endif\n\n        }break;\n    case Distortion_CatmullRom10:{\n\n        const int NumSegments = LensConfig::NumCoefficients;\n        OVR_ASSERT ( NumSegments <= NumCoefficients );\n        for ( int i = 1; i < NumSegments; i++ )\n        {\n            float scaledRsq = (float)i;\n            float rsq = scaledRsq * MaxInvR * MaxInvR / (float)( NumSegments - 1);\n            float r = sqrtf ( rsq );\n            float inv = DistortionFnInverse ( r );\n            InvK[i] = inv / r;\n            InvK[0] = 1.0f;     // TODO: fix this.\n        }\n\n#if 0\n        const int maxCheck = 20;\n        for ( int i = 0; i <= maxCheck; i++ )\n        {\n            float checkR = (float)i * MaxInvR / (float)maxCheck;\n            float realInv = DistortionFnInverse       ( checkR );\n            float testInv = DistortionFnInverseApprox ( checkR );\n            float error = fabsf ( realInv - testInv ) / MaxR;\n            OVR_ASSERT ( error < 0.01f );\n        }\n#endif\n\n        }break;\n\n    default:\n        break;\n    }\n}\n\n\nvoid LensConfig::SetToIdentity()\n{\n    for ( int i = 0; i < NumCoefficients; i++ )\n    {\n        K[i] = 0.0f;\n        InvK[i] = 0.0f;\n    }\n    Eqn = Distortion_RecipPoly4;\n    K[0] = 1.0f;\n    InvK[0] = 1.0f;\n    MaxR = 1.0f;\n    MaxInvR = 1.0f;\n    ChromaticAberration[0] = 0.0f;\n    ChromaticAberration[1] = 0.0f;\n    ChromaticAberration[2] = 0.0f;\n    ChromaticAberration[3] = 0.0f;\n    MetersPerTanAngleAtCenter = 0.05f;\n}\n\n\nenum LensConfigStoredVersion\n{\n    LCSV_CatmullRom10Version1 = 1\n};\n\n// DO NOT CHANGE THESE ONCE THEY HAVE BEEN BAKED INTO FIRMWARE.\n// If something needs to change, add a new one!\nstruct LensConfigStored_CatmullRom10Version1\n{\n    // All these items must be fixed-length integers - no \"float\", no \"int\", etc.\n    uint16_t    VersionNumber;      // Must be LCSV_CatmullRom10Version1\n\n    uint16_t    K[11];\n    uint16_t    MaxR;\n    uint16_t    MetersPerTanAngleAtCenter;\n    uint16_t    ChromaticAberration[4];\n    // InvK and MaxInvR are calculated on load.\n};\n\nuint16_t EncodeFixedPointUInt16 ( float val, uint16_t zeroVal, int fractionalBits )\n{\n    OVR_ASSERT ( ( fractionalBits >= 0 ) && ( fractionalBits < 31 ) );\n    float valWhole = val * (float)( 1 << fractionalBits );\n    valWhole += (float)zeroVal + 0.5f;\n    valWhole = floorf ( valWhole );\n    OVR_ASSERT ( ( valWhole >= 0.0f ) && ( valWhole < (float)( 1 << 16 ) ) );\n    return (uint16_t)valWhole;\n}\n\nfloat DecodeFixedPointUInt16 ( uint16_t val, uint16_t zeroVal, int fractionalBits )\n{\n    OVR_ASSERT ( ( fractionalBits >= 0 ) && ( fractionalBits < 31 ) );\n    float valFloat = (float)val;\n    valFloat -= (float)zeroVal;\n    valFloat *= 1.0f / (float)( 1 << fractionalBits );\n    return valFloat;\n}\n\n\n// Returns true on success.\nbool LoadLensConfig ( LensConfig *presult, uint8_t const *pbuffer, int bufferSizeInBytes )\n{\n    if ( bufferSizeInBytes < 2 )\n    {\n        // Can't even tell the version number!\n        return false;\n    }\n    uint16_t version = DecodeUInt16 ( pbuffer + 0 );\n    switch ( version )\n    {\n    case LCSV_CatmullRom10Version1:\n        {\n            if ( bufferSizeInBytes < (int)sizeof(LensConfigStored_CatmullRom10Version1) )\n            {\n                return false;\n            }\n            LensConfigStored_CatmullRom10Version1 lcs;\n            lcs.VersionNumber               = DecodeUInt16 ( pbuffer + 0 );\n            for ( int i = 0; i < 11; i++ )\n            {\n                lcs.K[i]                    = DecodeUInt16 ( pbuffer + 2 + 2*i );\n            }\n            lcs.MaxR                        = DecodeUInt16 ( pbuffer + 24 );\n            lcs.MetersPerTanAngleAtCenter   = DecodeUInt16 ( pbuffer + 26 );\n            for ( int i = 0; i < 4; i++ )\n            {\n                lcs.ChromaticAberration[i]  = DecodeUInt16 ( pbuffer + 28 + 2*i );\n            }\n            OVR_COMPILER_ASSERT ( sizeof(lcs) ==                       36 );\n\n            // Convert to the real thing.\n            LensConfig result;\n            result.Eqn = Distortion_CatmullRom10;\n            for ( int i = 0; i < 11; i++ )\n            {\n                // K[] are mostly 1.something. They may get significantly bigger, but they never hit 0.0.\n                result.K[i] = DecodeFixedPointUInt16 ( lcs.K[i], 0, 14 );\n            }\n            // MaxR is tan(angle), so always >0, typically just over 1.0 (45 degrees half-fov),\n            // but may get arbitrarily high. tan(76)=4 is a very reasonable limit!\n            result.MaxR = DecodeFixedPointUInt16 ( lcs.MaxR, 0, 14 );\n            // MetersPerTanAngleAtCenter is also known as focal length!\n            // Typically around 0.04 for our current screens, minimum of 0, sensible maximum of 0.125 (i.e. 3 \"extra\" bits of fraction)\n            result.MetersPerTanAngleAtCenter = DecodeFixedPointUInt16 ( lcs.MetersPerTanAngleAtCenter, 0, 16+3 );\n            for ( int i = 0; i < 4; i++ )\n            {\n                // ChromaticAberration[] are mostly 0.0something, centered on 0.0. Largest seen is 0.04, so set max to 0.125 (i.e. 3 \"extra\" bits of fraction)\n                result.ChromaticAberration[i] = DecodeFixedPointUInt16 ( lcs.ChromaticAberration[i], 0x8000, 16+3 );\n            }\n            result.MaxInvR = result.DistortionFn ( result.MaxR );\n            result.SetUpInverseApprox();\n\n            OVR_ASSERT ( version == lcs.VersionNumber );\n\n            *presult = result;\n        }\n        break;\n    default:\n        // Unknown format.\n        return false;\n        break;\n    }\n    return true;\n}\n\n// Returns number of bytes needed.\nint SaveLensConfigSizeInBytes ( LensConfig const &config )\n{\n    OVR_UNUSED ( config );\n    return sizeof ( LensConfigStored_CatmullRom10Version1 );\n}\n\n// Returns true on success.\nbool SaveLensConfig ( uint8_t *pbuffer, int bufferSizeInBytes, LensConfig const &config )\n{\n    if ( bufferSizeInBytes < (int)sizeof ( LensConfigStored_CatmullRom10Version1 ) )\n    {\n        return false;\n    }\n\n    // Construct the values.\n    LensConfigStored_CatmullRom10Version1 lcs;\n    lcs.VersionNumber = LCSV_CatmullRom10Version1;\n    for ( int i = 0; i < 11; i++ )\n    {\n        // K[] are mostly 1.something. They may get significantly bigger, but they never hit 0.0.\n        lcs.K[i] = EncodeFixedPointUInt16 ( config.K[i], 0, 14 );\n    }\n    // MaxR is tan(angle), so always >0, typically just over 1.0 (45 degrees half-fov),\n    // but may get arbitrarily high. tan(76)=4 is a very reasonable limit!\n    lcs.MaxR = EncodeFixedPointUInt16 ( config.MaxR, 0, 14 );\n    // MetersPerTanAngleAtCenter is also known as focal length!\n    // Typically around 0.04 for our current screens, minimum of 0, sensible maximum of 0.125 (i.e. 3 \"extra\" bits of fraction)\n    lcs.MetersPerTanAngleAtCenter = EncodeFixedPointUInt16 ( config.MetersPerTanAngleAtCenter, 0, 16+3 );\n    for ( int i = 0; i < 4; i++ )\n    {\n        // ChromaticAberration[] are mostly 0.0something, centered on 0.0. Largest seen is 0.04, so set max to 0.125 (i.e. 3 \"extra\" bits of fraction)\n        lcs.ChromaticAberration[i] = EncodeFixedPointUInt16 ( config.ChromaticAberration[i], 0x8000, 16+3 );\n    }\n\n\n    // Now store them out, sensitive to endianness.\n    EncodeUInt16 (      pbuffer + 0,        lcs.VersionNumber );\n    for ( int i = 0; i < 11; i++ )\n    {\n        EncodeUInt16 (  pbuffer + 2 + 2*i,  lcs.K[i] );\n    }\n    EncodeUInt16 (      pbuffer + 24,       lcs.MaxR );\n    EncodeUInt16 (      pbuffer + 26,       lcs.MetersPerTanAngleAtCenter );\n    for ( int i = 0; i < 4; i++ )\n    {\n        EncodeUInt16 (  pbuffer + 28 + 2*i, lcs.ChromaticAberration[i] );\n    }\n    OVR_COMPILER_ASSERT (         36        == sizeof(lcs) );\n\n    return true;\n}\n\n#ifdef OVR_BUILD_DEBUG\nvoid TestSaveLoadLensConfig ( LensConfig const &config )\n{\n    OVR_ASSERT ( config.Eqn == Distortion_CatmullRom10 );\n    // As a test, make sure this can be encoded and decoded correctly.\n    const int bufferSize = 256;\n    uint8_t buffer[bufferSize];\n    OVR_ASSERT ( SaveLensConfigSizeInBytes ( config ) < bufferSize );\n    bool success;\n    success = SaveLensConfig ( buffer, bufferSize, config );\n    OVR_ASSERT ( success );\n    LensConfig testConfig;\n    success = LoadLensConfig ( &testConfig, buffer, bufferSize );\n    OVR_ASSERT ( success );\n    OVR_ASSERT ( testConfig.Eqn == config.Eqn );\n    for ( int i = 0; i < 11; i++ )\n    {\n        OVR_ASSERT ( fabs ( testConfig.K[i] - config.K[i] ) < 0.0001f );\n    }\n    OVR_ASSERT ( fabsf ( testConfig.MaxR - config.MaxR ) < 0.0001f );\n    OVR_ASSERT ( fabsf ( testConfig.MetersPerTanAngleAtCenter - config.MetersPerTanAngleAtCenter ) < 0.00001f );\n    for ( int i = 0; i < 4; i++ )\n    {\n        OVR_ASSERT ( fabsf ( testConfig.ChromaticAberration[i] - config.ChromaticAberration[i] ) < 0.00001f );\n    }\n}\n#endif\n\n\n//-----------------------------------------------------------------------------\n// ProfileRenderInfo\n\nProfileRenderInfo::ProfileRenderInfo() :\n    EyeCupType(),\n    EyeReliefDial(0)\n{\n    Eye2Nose[0] = OVR_DEFAULT_IPD * 0.5f;\n    Eye2Nose[1] = OVR_DEFAULT_IPD * 0.5f;\n    Eye2Plate[0] = 0.;\n    Eye2Plate[1] = 0.;\n}\n\nProfileRenderInfo GenerateProfileRenderInfoFromProfile( HMDInfo const& hmdInfo,\n                                                        Profile const* profile )\n{\n    ProfileRenderInfo profileRenderInfo;\n\n    if (!profile)\n    {\n        LogError(\"[Stereo] Error: No user profile provided.\");\n        OVR_ASSERT(false);\n        return profileRenderInfo;\n    }\n\n    // Eye cup type\n    char eyecup[16];\n    if (profile->GetValue(OVR_KEY_EYE_CUP, eyecup, 16))\n    {\n        profileRenderInfo.EyeCupType = eyecup;\n    }\n\n    Ptr<Profile> def = *ProfileManager::GetInstance()->GetDefaultProfile(hmdInfo.HmdType);\n\n    // Set the eye position\n    // Use the user profile value unless they have elected to use the defaults\n    if (!profile->GetBoolValue(OVR_KEY_CUSTOM_EYE_RENDER, true))\n    {\n        profile = def; // use the default\n    }\n\n    if (!def)\n    {\n        LogError(\"[Stereo] Error: No user profile provided.\");\n        OVR_ASSERT(false);\n        return profileRenderInfo;\n    }\n\n    // Username\n    char user[32] = {};\n    profile->GetValue(OVR_KEY_USER, user, 32);   // for debugging purposes\n\n    // TBD: Maybe we should separate custom camera positioning from custom distortion rendering ??\n    float ipd = OVR_DEFAULT_IPD;\n    if (profile->GetFloatValues(OVR_KEY_EYE_TO_NOSE_DISTANCE, profileRenderInfo.Eye2Nose, 2) != 2)\n    {\n        // Legacy profiles may not include half-ipd, so use the regular IPD value instead\n        ipd = profile->GetFloatValue(OVR_KEY_IPD, OVR_DEFAULT_IPD);\n    }\n\n    const float ipd_div2 = ipd * 0.5f;\n    profileRenderInfo.Eye2Nose[0] = ipd_div2;\n    profileRenderInfo.Eye2Nose[1] = ipd_div2;\n\n    if ((profile->GetFloatValues(OVR_KEY_MAX_EYE_TO_PLATE_DISTANCE, profileRenderInfo.Eye2Plate, 2) != 2) &&\n        (def->GetFloatValues(OVR_KEY_MAX_EYE_TO_PLATE_DISTANCE, profileRenderInfo.Eye2Plate, 2) != 2))\n    {\n        // We shouldn't be here.  The user or default profile should have the eye relief\n        OVR_ASSERT(false);\n    }\n\n    profileRenderInfo.EyeReliefDial = profile->GetIntValue(OVR_KEY_EYE_RELIEF_DIAL, OVR_DEFAULT_EYE_RELIEF_DIAL);\n\n\n\n    OVR_DEBUG_LOG((\"[Stereo] Read profile render info for user '%s'\", user));\n\n    return profileRenderInfo;\n}\n\n\n//-----------------------------------------------------------------------------------\n\n// TBD: There is a question of whether this is the best file for CreateDebugHMDInfo. As long as there are many\n// constants for HmdRenderInfo here as well it is ok. The alternative would be OVR_Common_HMDDevice.cpp, but\n// that's specialized per platform... should probably move it there onces the code is in the common base class.\n\nHMDInfo CreateDebugHMDInfo(HmdTypeEnum hmdType)\n{\n    HMDInfo info;    \n\n    info.DebugDevice = true;\n\n    if ((hmdType != HmdType_DK1)\n     && (hmdType != HmdType_CrystalCoveProto)\n     && (hmdType != HmdType_DK2)\n       )\n    {\n        LogText(\"Debug HMDInfo - HmdType not supported. Defaulting to DK1.\\n\");\n        hmdType = HmdType_DK1;\n    }\n\n    // The alternative would be to initialize info.HmdType to HmdType_None instead. If we did that,\n    // code wouldn't be \"maximally compatible\" and devs wouldn't know what device we are\n    // simulating... so if differentiation becomes necessary we better add Debug flag in the future.\n    info.HmdType      = hmdType;\n    info.Manufacturer = \"Oculus VR\";    \n\n    switch(hmdType)\n    {\n    case HmdType_DK1:\n        info.ProductName                            = \"Oculus Rift DK1\";\n        info.ResolutionInPixels                     = Sizei ( 1280, 800 );\n        info.ScreenSizeInMeters                     = Sizef ( 0.1498f, 0.0936f );\n        info.ScreenGapSizeInMeters                  = 0.0f;\n        info.CenterFromTopInMeters                  = 0.0468f;\n        info.LensSeparationInMeters                 = 0.0635f;\n        info.PelOffsetR                             = Vector2f ( 0.0f, 0.0f );\n        info.PelOffsetB                             = Vector2f ( 0.0f, 0.0f );\n        info.Shutter.Type                           = HmdShutter_RollingTopToBottom;\n        info.Shutter.VsyncToNextVsync               = ( 1.0f / 60.0f );\n        info.Shutter.VsyncToFirstScanline           = 0.000052f;\n        info.Shutter.FirstScanlineToLastScanline    = 0.016580f;\n        info.Shutter.PixelSettleTime                = 0.015f;\n        info.Shutter.PixelPersistence               = ( 1.0f / 60.0f );\n        break;\n\n    case HmdType_CrystalCoveProto:\n        info.ProductName                            = \"Oculus Rift Crystal Cove\";        \n        info.ResolutionInPixels                     = Sizei ( 1920, 1080 );\n        info.ScreenSizeInMeters                     = Sizef ( 0.12576f, 0.07074f );\n        info.ScreenGapSizeInMeters                  = 0.0f;\n        info.CenterFromTopInMeters                  = info.ScreenSizeInMeters.h * 0.5f;\n        info.LensSeparationInMeters                 = 0.0635f;\n        info.PelOffsetR                             = Vector2f ( 0.0f, 0.0f );\n        info.PelOffsetB                             = Vector2f ( 0.0f, 0.0f );\n        info.Shutter.Type                           = HmdShutter_RollingRightToLeft;\n        info.Shutter.VsyncToNextVsync               = ( 1.0f / 76.0f );\n        info.Shutter.VsyncToFirstScanline           = 0.0000273f;\n        info.Shutter.FirstScanlineToLastScanline    = 0.0131033f;\n        info.Shutter.PixelSettleTime                = 0.0f;\n        info.Shutter.PixelPersistence               = 0.18f * info.Shutter.VsyncToNextVsync;\n        break;\n\n    case HmdType_DK2:\n        info.ProductName                            = \"Oculus Rift DK2\";        \n        info.ResolutionInPixels                     = Sizei ( 1920, 1080 );\n        info.ScreenSizeInMeters                     = Sizef ( 0.12576f, 0.07074f );\n        info.ScreenGapSizeInMeters                  = 0.0f;\n        info.CenterFromTopInMeters                  = info.ScreenSizeInMeters.h * 0.5f;\n        info.LensSeparationInMeters                 = 0.0635f;\n        info.PelOffsetR                             = Vector2f ( 0.5f, 0.5f );\n        info.PelOffsetB                             = Vector2f ( 0.5f, 0.5f );\n        info.Shutter.Type                           = HmdShutter_RollingRightToLeft;\n        info.Shutter.VsyncToNextVsync               = ( 1.0f / 76.0f );\n        info.Shutter.VsyncToFirstScanline           = 0.0000273f;\n        info.Shutter.FirstScanlineToLastScanline    = 0.0131033f;\n        info.Shutter.PixelSettleTime                = 0.0f;\n        info.Shutter.PixelPersistence               = 0.18f * info.Shutter.VsyncToNextVsync;\n        break;\n\n\n    default:\n        break;\n    }\n\n    return info;\n}\n\n\nHmdRenderInfo GenerateHmdRenderInfoFromHmdInfo ( HMDInfo const &hmdInfo,\n                                                 ProfileRenderInfo const& profileRenderInfo,\n                                                 DistortionEqnType distortionType /*= Distortion_CatmullRom10*/,\n                                                 EyeCupType eyeCupOverride /*= EyeCup_LAST*/ )\n{\n    HmdRenderInfo renderInfo;\n    \n    renderInfo.HmdType                              = hmdInfo.HmdType;\n    renderInfo.ResolutionInPixels                   = hmdInfo.ResolutionInPixels;\n    renderInfo.ScreenSizeInMeters                   = hmdInfo.ScreenSizeInMeters;\n    renderInfo.CenterFromTopInMeters                = hmdInfo.CenterFromTopInMeters;\n    renderInfo.ScreenGapSizeInMeters                = hmdInfo.ScreenGapSizeInMeters;\n    renderInfo.LensSeparationInMeters               = hmdInfo.LensSeparationInMeters;\n    renderInfo.PelOffsetR                           = hmdInfo.PelOffsetR;\n    renderInfo.PelOffsetB                           = hmdInfo.PelOffsetB;\n\n    OVR_ASSERT ( sizeof(renderInfo.Shutter) == sizeof(hmdInfo.Shutter) );   // Try to keep the files in sync!\n    renderInfo.Shutter.Type                         = hmdInfo.Shutter.Type;\n    renderInfo.Shutter.VsyncToNextVsync             = hmdInfo.Shutter.VsyncToNextVsync;\n    renderInfo.Shutter.VsyncToFirstScanline         = hmdInfo.Shutter.VsyncToFirstScanline;\n    renderInfo.Shutter.FirstScanlineToLastScanline  = hmdInfo.Shutter.FirstScanlineToLastScanline;\n    renderInfo.Shutter.PixelSettleTime              = hmdInfo.Shutter.PixelSettleTime;\n    renderInfo.Shutter.PixelPersistence             = hmdInfo.Shutter.PixelPersistence;\n\n    renderInfo.LensDiameterInMeters                 = 0.035f;\n    renderInfo.LensSurfaceToMidplateInMeters        = 0.025f;\n    renderInfo.EyeCups                              = EyeCup_DK1A;\n\n#if defined(OVR_OS_LINUX)\n    // If the Rift is a monitor,\n    if (hmdInfo.InCompatibilityMode)\n    {\n        renderInfo.Rotation = hmdInfo.ShimInfo.Rotation;\n    }\n    else // Direct mode handles rotation internally\n    {\n#endif\n        renderInfo.Rotation = 0;\n#if defined(OVR_OS_LINUX)\n    }\n#endif\n\n#if 0       // Device settings are out of date - don't use them.\n    if (Contents & Contents_Distortion)\n    {\n        memcpy(renderInfo.DistortionK, DistortionK, sizeof(float)*4);\n        renderInfo.DistortionEqn = Distortion_RecipPoly4;\n    }\n#endif\n\n    // Defaults in case of no user profile.\n    renderInfo.EyeLeft.NoseToPupilInMeters   = 0.032f;\n    renderInfo.EyeLeft.ReliefInMeters        = 0.012f;\n\n    // 10mm eye-relief laser numbers for DK1 lenses.\n    // These are a decent seed for finding eye-relief and IPD.\n    // These are NOT used for rendering!\n    // Rendering distortions are now in GenerateLensConfigFromEyeRelief()\n    // So, if you're hacking in new distortions, don't do it here!\n    renderInfo.EyeLeft.Distortion.SetToIdentity();\n    renderInfo.EyeLeft.Distortion.MetersPerTanAngleAtCenter = 0.0449f;\n    renderInfo.EyeLeft.Distortion.Eqn       = Distortion_RecipPoly4;\n    renderInfo.EyeLeft.Distortion.K[0]      =  1.0f;\n    renderInfo.EyeLeft.Distortion.K[1]      = -0.494165344f;\n    renderInfo.EyeLeft.Distortion.K[2]      = 0.587046423f;\n    renderInfo.EyeLeft.Distortion.K[3]      = -0.841887126f;\n    renderInfo.EyeLeft.Distortion.MaxR      = 1.0f;\n\n    renderInfo.EyeLeft.Distortion.ChromaticAberration[0] = -0.006f;\n    renderInfo.EyeLeft.Distortion.ChromaticAberration[1] =  0.0f;\n    renderInfo.EyeLeft.Distortion.ChromaticAberration[2] =  0.014f;\n    renderInfo.EyeLeft.Distortion.ChromaticAberration[3] =  0.0f;\n\n    renderInfo.EyeRight = renderInfo.EyeLeft;\n\n    // Set eye cup type\n    SetEyeCup(&renderInfo, profileRenderInfo.EyeCupType.ToCStr());\n\n    switch ( hmdInfo.HmdType )\n    {\n    case HmdType_None:\n    case HmdType_DKProto:\n    case HmdType_DK1:\n        // Slight hack to improve usability.\n        // If you have a DKHD-style lens profile enabled,\n        // but you plug in DK1 and forget to change the profile,\n        // obviously you don't want those lens numbers.\n        if ( ( renderInfo.EyeCups != EyeCup_DK1A ) &&\n             ( renderInfo.EyeCups != EyeCup_DK1B ) &&\n             ( renderInfo.EyeCups != EyeCup_DK1C ) )\n        {\n            renderInfo.EyeCups = EyeCup_DK1A;\n        }\n        break;\n\n    case HmdType_DKHD2Proto:\n        renderInfo.EyeCups = EyeCup_DKHD2A;\n        break;\n    case HmdType_CrystalCoveProto:\n        renderInfo.EyeCups = EyeCup_PinkA;\n        break;\n    case HmdType_DK2:\n        renderInfo.EyeCups = EyeCup_DK2A;\n        break;\n    default:\n        break;\n    }\n\n    if ( eyeCupOverride != EyeCup_LAST )\n    {\n        renderInfo.EyeCups = eyeCupOverride;\n    }\n\n    switch ( renderInfo.EyeCups )\n    {\n    case EyeCup_DK1A:\n    case EyeCup_DK1B:\n    case EyeCup_DK1C:\n        renderInfo.LensDiameterInMeters                   = 0.035f;\n        renderInfo.LensSurfaceToMidplateInMeters          = 0.02357f;\n        // Not strictly lens-specific, but still wise to set a reasonable default for relief.\n        renderInfo.EyeLeft.ReliefInMeters                 = 0.010f; \n        renderInfo.EyeRight.ReliefInMeters                = 0.010f; \n        break;\n    case EyeCup_DKHD2A:\n        renderInfo.LensDiameterInMeters                   = 0.035f;\n        renderInfo.LensSurfaceToMidplateInMeters          = 0.02357f;\n        // Not strictly lens-specific, but still wise to set a reasonable default for relief.\n        renderInfo.EyeLeft.ReliefInMeters                 = 0.010f; \n        renderInfo.EyeRight.ReliefInMeters                = 0.010f; \n        break;\n    case EyeCup_PinkA:\n    case EyeCup_DK2A:\n        renderInfo.LensDiameterInMeters                   = 0.04f;      // approximate\n        renderInfo.LensSurfaceToMidplateInMeters          = 0.01965f;\n        // Not strictly lens-specific, but still wise to set a reasonable default for relief.\n        renderInfo.EyeLeft.ReliefInMeters                 = 0.012f;\n        renderInfo.EyeRight.ReliefInMeters                = 0.012f;\n        break;\n    default: OVR_ASSERT ( false ); break;\n    }\n\n    renderInfo.EyeLeft.NoseToPupilInMeters = profileRenderInfo.Eye2Nose[0];\n    renderInfo.EyeRight.NoseToPupilInMeters = profileRenderInfo.Eye2Nose[1];\n\n    // Subtract the eye-cup height from the plate distance to get the eye-to-lens distance\n    // This measurement should be the the distance at maximum dial setting\n    // We still need to adjust with the dial offset\n    renderInfo.EyeLeft.ReliefInMeters = profileRenderInfo.Eye2Plate[0] - renderInfo.LensSurfaceToMidplateInMeters;\n    renderInfo.EyeRight.ReliefInMeters = profileRenderInfo.Eye2Plate[1] - renderInfo.LensSurfaceToMidplateInMeters;\n\n    // Adjust the eye relief with the dial setting (from the assumed max eye relief)\n    renderInfo.EyeLeft.ReliefInMeters -= ((10 - profileRenderInfo.EyeReliefDial) * 0.001f);\n    renderInfo.EyeRight.ReliefInMeters -= ((10 - profileRenderInfo.EyeReliefDial) * 0.001f);\n\n\n    // Now we know where the eyes are relative to the lenses, we can compute a distortion for each.\n    // TODO: incorporate lateral offset in distortion generation.\n    // TODO: we used a distortion to calculate eye-relief, and now we're making a distortion from that eye-relief. Close the loop!\n\n    for ( int eyeNum = 0; eyeNum < 2; eyeNum++ )\n    {\n        HmdRenderInfo::EyeConfig *pHmdEyeConfig = ( eyeNum == 0 ) ? &(renderInfo.EyeLeft) : &(renderInfo.EyeRight);\n\n        float eye_relief = pHmdEyeConfig->ReliefInMeters;\n        LensConfig distortionConfig = GenerateLensConfigFromEyeRelief ( eye_relief, renderInfo, distortionType );\n        pHmdEyeConfig->Distortion = distortionConfig;\n\n    }\n\n    return renderInfo;\n}\n\n\nLensConfig GenerateLensConfigFromEyeRelief ( float eyeReliefInMeters, HmdRenderInfo const &hmd, DistortionEqnType distortionType /*= Distortion_CatmullRom10*/ )\n{\n    struct DistortionDescriptor\n    {\n        float EyeRelief;\n        // The three places we're going to sample & lerp the curve at.\n        // One sample is always at 0.0, and the distortion scale should be 1.0 or else!\n        // Only use for poly4 numbers - CR has an implicit scale.\n        float SampleRadius[3];\n        // Where the distortion has actually been measured/calibrated out to.\n        // Don't try to hallucinate data out beyond here.\n        float MaxRadius;\n        // The config itself.\n        LensConfig Config;\n    };\n\n\tstatic const int MaxDistortions = 10;\n\tDistortionDescriptor distortions[MaxDistortions];\n\tfor (int i = 0; i < MaxDistortions; i++)\n    {\n        distortions[i].EyeRelief = 0.0f;\n        memset(distortions[i].SampleRadius, 0, sizeof(distortions[i].SampleRadius));\n        distortions[i].MaxRadius = 1.0f;\n        distortions[i].Config.SetToIdentity(); // Note: This line causes a false Microsoft static analysis error -cat\n    }\n    int numDistortions = 0;\n    int defaultDistortion = 0;     // index of the default distortion curve to use if zero eye relief supplied\n\n    if ( ( hmd.EyeCups == EyeCup_DK1A ) ||\n         ( hmd.EyeCups == EyeCup_DK1B ) ||\n         ( hmd.EyeCups == EyeCup_DK1C ) )\n    {\n\n        numDistortions = 0;\n        /*\n        distortions[numDistortions].Config.Eqn = Distortion_CatmullRom10;\n        distortions[numDistortions].EyeRelief                            = 0.010f;\n        distortions[numDistortions].Config.MetersPerTanAngleAtCenter     = 0.0425f;\n        distortions[numDistortions].Config.K[0]                          = 1.0000f;\n        distortions[numDistortions].Config.K[1]                          = 1.0f;\n        distortions[numDistortions].Config.K[2]                          = 1.0f;\n        distortions[numDistortions].Config.K[3]                          = 1.0f;\n        distortions[numDistortions].Config.K[4]                          = 1.0f;\n        distortions[numDistortions].Config.K[5]                          = 1.0f;\n        distortions[numDistortions].Config.K[6]                          = 1.0f;\n        distortions[numDistortions].Config.K[7]                          = 1.0f;\n        distortions[numDistortions].Config.K[8]                          = 1.0f;\n        distortions[numDistortions].Config.K[9]                          = 1.0f;\n        distortions[numDistortions].Config.K[10]                         = 1.0f;\n        distortions[numDistortions].MaxRadius                            = 1.0f;\n        defaultDistortion = numDistortions;                      // this is the default\n        numDistortions++;\n                \n        distortions[0].Config.ChromaticAberration[0]        =  0.0f;\n        distortions[0].Config.ChromaticAberration[1]        =  0.0f;\n        distortions[0].Config.ChromaticAberration[2]        =  0.0f;\n        distortions[0].Config.ChromaticAberration[3]        =  0.0f;\n        */\n        \n        // Tuned at minimum dial setting - extended to r^2 == 1.8\n        distortions[numDistortions].Config.Eqn = Distortion_CatmullRom10;\n        distortions[numDistortions].EyeRelief                            = 0.012760465f - 0.005f;\n        distortions[numDistortions].Config.MetersPerTanAngleAtCenter     = 0.0425f;\n        distortions[numDistortions].Config.K[0]                          = 1.0000f;\n        distortions[numDistortions].Config.K[1]                          = 1.06505f;\n        distortions[numDistortions].Config.K[2]                          = 1.14725f;\n        distortions[numDistortions].Config.K[3]                          = 1.2705f;\n        distortions[numDistortions].Config.K[4]                          = 1.48f;\n        distortions[numDistortions].Config.K[5]                          = 1.87f;\n        distortions[numDistortions].Config.K[6]                          = 2.534f;\n        distortions[numDistortions].Config.K[7]                          = 3.6f;\n        distortions[numDistortions].Config.K[8]                          = 5.1f;\n        distortions[numDistortions].Config.K[9]                          = 7.4f;\n        distortions[numDistortions].Config.K[10]                         = 11.0f;\n        distortions[numDistortions].MaxRadius                            = sqrt(1.8f);\n        defaultDistortion = numDistortions;                      // this is the default\n        numDistortions++;\n        \n        // Tuned at middle dial setting\n        distortions[numDistortions].Config.Eqn = Distortion_CatmullRom10;\n        distortions[numDistortions].EyeRelief                            = 0.012760465f;  // my average eye-relief\n        distortions[numDistortions].Config.MetersPerTanAngleAtCenter     = 0.0425f;\n        distortions[numDistortions].Config.K[0]                          = 1.0f;\n        distortions[numDistortions].Config.K[1]                          = 1.032407264f;\n        distortions[numDistortions].Config.K[2]                          = 1.07160462f;\n        distortions[numDistortions].Config.K[3]                          = 1.11998388f;\n        distortions[numDistortions].Config.K[4]                          = 1.1808606f;\n        distortions[numDistortions].Config.K[5]                          = 1.2590494f;\n        distortions[numDistortions].Config.K[6]                          = 1.361915f;\n        distortions[numDistortions].Config.K[7]                          = 1.5014339f;\n        distortions[numDistortions].Config.K[8]                          = 1.6986004f;\n        distortions[numDistortions].Config.K[9]                          = 1.9940577f;\n        distortions[numDistortions].Config.K[10]                         = 2.4783147f;\n        distortions[numDistortions].MaxRadius                            = 1.0f;\n        numDistortions++;\n\n        // Tuned at maximum dial setting\n        distortions[numDistortions].Config.Eqn = Distortion_CatmullRom10;\n        distortions[numDistortions].EyeRelief                            = 0.012760465f + 0.005f;\n        distortions[numDistortions].Config.MetersPerTanAngleAtCenter     = 0.0425f;\n        distortions[numDistortions].Config.K[0]                          = 1.0102f;\n        distortions[numDistortions].Config.K[1]                          = 1.0371f;\n        distortions[numDistortions].Config.K[2]                          = 1.0831f;\n        distortions[numDistortions].Config.K[3]                          = 1.1353f;\n        distortions[numDistortions].Config.K[4]                          = 1.2f;\n        distortions[numDistortions].Config.K[5]                          = 1.2851f;\n        distortions[numDistortions].Config.K[6]                          = 1.3979f;\n        distortions[numDistortions].Config.K[7]                          = 1.56f;\n        distortions[numDistortions].Config.K[8]                          = 1.8f;\n        distortions[numDistortions].Config.K[9]                          = 2.25f;\n        distortions[numDistortions].Config.K[10]                         = 3.0f;\n        distortions[numDistortions].MaxRadius                            = 1.0f;\n        numDistortions++;\n        \n\n        \n        // Chromatic aberration doesn't seem to change with eye relief.\n        for ( int i = 0; i < numDistortions; i++ )\n        {\n            distortions[i].Config.ChromaticAberration[0]        = -0.006f;\n            distortions[i].Config.ChromaticAberration[1]        =  0.0f;\n            distortions[i].Config.ChromaticAberration[2]        =  0.014f;\n            distortions[i].Config.ChromaticAberration[3]        =  0.0f;\n        }\n        \n    }\n    else if ( hmd.EyeCups == EyeCup_DKHD2A )\n    {\n        // Tuned DKHD2 lens\n        numDistortions = 0;\n       \n        distortions[numDistortions].Config.Eqn = Distortion_CatmullRom10;\n        distortions[numDistortions].EyeRelief                            = 0.010f;\n        distortions[numDistortions].Config.MetersPerTanAngleAtCenter     = 0.0425f;\n        distortions[numDistortions].Config.K[0]                          = 1.0f;\n        distortions[numDistortions].Config.K[1]                          = 1.0425f;\n        distortions[numDistortions].Config.K[2]                          = 1.0826f;\n        distortions[numDistortions].Config.K[3]                          = 1.130f;\n        distortions[numDistortions].Config.K[4]                          = 1.185f;\n        distortions[numDistortions].Config.K[5]                          = 1.250f;\n        distortions[numDistortions].Config.K[6]                          = 1.338f;\n        distortions[numDistortions].Config.K[7]                          = 1.455f;\n        distortions[numDistortions].Config.K[8]                          = 1.620f;\n        distortions[numDistortions].Config.K[9]                          = 1.840f;\n        distortions[numDistortions].Config.K[10]                         = 2.200f;\n        distortions[numDistortions].MaxRadius                            = 1.0f;\n        \n        defaultDistortion = numDistortions;   // this is the default\n        numDistortions++;\n\n        distortions[numDistortions] = distortions[0];\n        distortions[numDistortions].EyeRelief = 0.020f;\n        numDistortions++;\n\n        // Chromatic aberration doesn't seem to change with eye relief.\n        for ( int i = 0; i < numDistortions; i++ )\n        {\n            distortions[i].Config.ChromaticAberration[0]        = -0.006f;\n            distortions[i].Config.ChromaticAberration[1]        =  0.0f;\n            distortions[i].Config.ChromaticAberration[2]        =  0.014f;\n            distortions[i].Config.ChromaticAberration[3]        =  0.0f;\n        }\n    }\n    else if ( hmd.EyeCups == EyeCup_PinkA || hmd.EyeCups == EyeCup_DK2A )\n    {\n        // Tuned Crystal Cove & DK2 Lens (CES & GDC)\n        numDistortions = 0;\n       \n        \n        distortions[numDistortions].EyeRelief                            = 0.008f;\n        distortions[numDistortions].Config.MetersPerTanAngleAtCenter     = 0.036f;\n        // TODO: Need to retune this distortion for minimum eye relief\n        distortions[numDistortions].Config.Eqn = Distortion_CatmullRom10;\n        distortions[numDistortions].Config.K[0]                          = 1.003f;\n        distortions[numDistortions].Config.K[1]                          = 1.02f;\n        distortions[numDistortions].Config.K[2]                          = 1.042f;\n        distortions[numDistortions].Config.K[3]                          = 1.066f;\n        distortions[numDistortions].Config.K[4]                          = 1.094f;\n        distortions[numDistortions].Config.K[5]                          = 1.126f;\n        distortions[numDistortions].Config.K[6]                          = 1.162f;\n        distortions[numDistortions].Config.K[7]                          = 1.203f;\n        distortions[numDistortions].Config.K[8]                          = 1.25f;\n        distortions[numDistortions].Config.K[9]                          = 1.31f;\n        distortions[numDistortions].Config.K[10]                         = 1.38f;\n        distortions[numDistortions].MaxRadius                            = 1.0f;\n        \n        distortions[numDistortions].Config.ChromaticAberration[0]        = -0.0112f;\n        distortions[numDistortions].Config.ChromaticAberration[1]        = -0.015f;\n        distortions[numDistortions].Config.ChromaticAberration[2]        =  0.0187f;\n        distortions[numDistortions].Config.ChromaticAberration[3]        =  0.015f;\n        \n        numDistortions++;\n\n\n\n\n\n        distortions[numDistortions].EyeRelief                            = 0.018f;\n        distortions[numDistortions].Config.MetersPerTanAngleAtCenter     = 0.036f;\n\n        distortions[numDistortions].Config.Eqn = Distortion_CatmullRom10;\n        distortions[numDistortions].Config.K[0]                          = 1.003f;\n        distortions[numDistortions].Config.K[1]                          = 1.02f;\n        distortions[numDistortions].Config.K[2]                          = 1.042f;\n        distortions[numDistortions].Config.K[3]                          = 1.066f;\n        distortions[numDistortions].Config.K[4]                          = 1.094f;\n        distortions[numDistortions].Config.K[5]                          = 1.126f;\n        distortions[numDistortions].Config.K[6]                          = 1.162f;\n        distortions[numDistortions].Config.K[7]                          = 1.203f;\n        distortions[numDistortions].Config.K[8]                          = 1.25f;\n        distortions[numDistortions].Config.K[9]                          = 1.31f;\n        distortions[numDistortions].Config.K[10]                         = 1.38f;\n        distortions[numDistortions].MaxRadius                            = 1.0f;\n\n        distortions[numDistortions].Config.ChromaticAberration[0]        = -0.015f;\n        distortions[numDistortions].Config.ChromaticAberration[1]        = -0.02f;\n        distortions[numDistortions].Config.ChromaticAberration[2]        =  0.025f;\n        distortions[numDistortions].Config.ChromaticAberration[3]        =  0.02f;\n        \n        defaultDistortion = numDistortions;   // this is the default\n        numDistortions++;\n    }\n    else\n    {\n        // Unknown lens.\n        // Use DK1 black lens settings, just so we can continue to run with something.\n        distortions[0].EyeRelief = 0.005f;\n        distortions[0].Config.MetersPerTanAngleAtCenter = 0.043875f;\n        distortions[0].Config.Eqn = Distortion_RecipPoly4;\n        distortions[0].Config.K[0] = 1.0f;\n        distortions[0].Config.K[1] = -0.3999f;\n        distortions[0].Config.K[2] =  0.2408f;\n        distortions[0].Config.K[3] = -0.4589f;\n        distortions[0].SampleRadius[0] = 0.2f;\n        distortions[0].SampleRadius[1] = 0.4f;\n        distortions[0].SampleRadius[2] = 0.6f;\n\n        distortions[1] = distortions[0];\n        distortions[1].EyeRelief = 0.010f;\n        numDistortions = 2;\n\n        // Chromatic aberration doesn't seem to change with eye relief.\n        for ( int i = 0; i < numDistortions; i++ )\n        {\n            // These are placeholder, they have not been tuned!\n            distortions[i].Config.ChromaticAberration[0]        =  0.0f;\n            distortions[i].Config.ChromaticAberration[1]        =  0.0f;\n            distortions[i].Config.ChromaticAberration[2]        =  0.0f;\n            distortions[i].Config.ChromaticAberration[3]        =  0.0f;\n        }\n    }\n\n\tOVR_ASSERT(numDistortions < MaxDistortions);\n\n    DistortionDescriptor *pUpper = nullptr;\n    DistortionDescriptor *pLower = nullptr;\n    float lerpVal = 0.0f;\n    if (eyeReliefInMeters == 0)\n    {   // Use a constant default distortion if an invalid eye-relief is supplied\n        pLower = &(distortions[defaultDistortion]);\n        pUpper = &(distortions[defaultDistortion]);\n        lerpVal = 0.0f;\n    }\n    else\n    {\n        for ( int i = 0; i < numDistortions-1; i++ )\n        {\n            OVR_ASSERT ( distortions[i].EyeRelief < distortions[i+1].EyeRelief );\n            if ( ( distortions[i].EyeRelief <= eyeReliefInMeters ) && ( distortions[i+1].EyeRelief > eyeReliefInMeters ) )\n            {\n                pLower = &(distortions[i]);\n                pUpper = &(distortions[i+1]);\n                lerpVal = ( eyeReliefInMeters - pLower->EyeRelief ) / ( pUpper->EyeRelief - pLower->EyeRelief );\n                // No break here - I want the ASSERT to check everything every time!\n            }\n        }\n    }\n\n    if ( pUpper == nullptr )\n    {\n#if 0\n        // Outside the range, so extrapolate rather than interpolate.\n        if ( distortions[0].EyeRelief > eyeReliefInMeters )\n        { \n            pLower = &(distortions[0]);\n            pUpper = &(distortions[1]);\n        }\n        else\n        {\n            OVR_ASSERT ( distortions[numDistortions-1].EyeRelief <= eyeReliefInMeters );\n            pLower = &(distortions[numDistortions-2]);\n            pUpper = &(distortions[numDistortions-1]);\n        }\n        lerpVal = ( eyeReliefInMeters - pLower->EyeRelief ) / ( pUpper->EyeRelief - pLower->EyeRelief );\n#else\n        // Do not extrapolate, just clamp - slightly worried about people putting in bogus settings.\n        if ( distortions[0].EyeRelief > eyeReliefInMeters )\n        {\n            pLower = &(distortions[0]);\n            pUpper = &(distortions[0]);\n        }\n        else\n        {\n            OVR_ASSERT ( distortions[numDistortions-1].EyeRelief <= eyeReliefInMeters );\n            pLower = &(distortions[numDistortions-1]);\n            pUpper = &(distortions[numDistortions-1]);\n        }\n        lerpVal = 0.0f;\n#endif\n    }\n    float invLerpVal = 1.0f - lerpVal;\n\n    pLower->Config.MaxR = pLower->MaxRadius;\n    pUpper->Config.MaxR = pUpper->MaxRadius;\n\n    LensConfig result;\n    // Where is the edge of the lens - no point modelling further than this.\n    float maxValidRadius = invLerpVal * pLower->MaxRadius + lerpVal * pUpper->MaxRadius;\n    result.MaxR = maxValidRadius;\n\n    switch ( distortionType )\n    {\n    case Distortion_Poly4:\n        // Deprecated\n        OVR_ASSERT ( false );\n        break;\n    case Distortion_RecipPoly4:{\n        // Lerp control points and fit an equation to them.\n        float fitX[4];\n        float fitY[4];\n        fitX[0] = 0.0f;\n        fitY[0] = 1.0f;\n        for ( int ctrlPt = 1; ctrlPt < 4; ctrlPt ++ )\n        {\n            // SampleRadius is not valid for Distortion_RecipPoly4 types.\n            float radiusLerp = ( invLerpVal * pLower->MaxRadius + lerpVal * pUpper->MaxRadius ) * ( (float)ctrlPt / 4.0f );\n            float radiusLerpSq = radiusLerp * radiusLerp;\n            float fitYLower = pLower->Config.DistortionFnScaleRadiusSquared ( radiusLerpSq );\n            float fitYUpper = pUpper->Config.DistortionFnScaleRadiusSquared ( radiusLerpSq );\n            fitX[ctrlPt] = radiusLerpSq;\n            fitY[ctrlPt] = 1.0f / ( invLerpVal * fitYLower + lerpVal * fitYUpper );\n        }\n\n        result.Eqn = Distortion_RecipPoly4;\n        bool bSuccess = FitCubicPolynomial ( result.K, fitX, fitY );\n        OVR_ASSERT ( bSuccess );\n        OVR_UNUSED ( bSuccess );\n\n        // Set up the fast inverse.\n        float maxRDist = result.DistortionFn ( maxValidRadius );\n        result.MaxInvR = maxRDist;\n        result.SetUpInverseApprox();\n\n        }break;\n\n    case Distortion_CatmullRom10:{\n\n        // Evenly sample & lerp points on the curve.\n        const int NumSegments = LensConfig::NumCoefficients;\n        result.MaxR = maxValidRadius;\n        // Directly interpolate the K0 values\n        result.K[0] = invLerpVal * pLower->Config.K[0] + lerpVal * pUpper->Config.K[0];\n\n        // Sample and interpolate the distortion curves to derive K[1] ... K[n]\n        for ( int ctrlPt = 1; ctrlPt < NumSegments; ctrlPt++ )\n        {\n            float radiusSq = ( (float)ctrlPt / (float)(NumSegments-1) ) * maxValidRadius * maxValidRadius;\n            float fitYLower = pLower->Config.DistortionFnScaleRadiusSquared ( radiusSq );\n            float fitYUpper = pUpper->Config.DistortionFnScaleRadiusSquared ( radiusSq );\n            float fitLerp = invLerpVal * fitYLower + lerpVal * fitYUpper;\n            result.K[ctrlPt] = fitLerp;\n        }\n\n        result.Eqn = Distortion_CatmullRom10;\n\n        for ( int ctrlPt = 1; ctrlPt < NumSegments; ctrlPt++ )\n        {\n            float radiusSq = ( (float)ctrlPt / (float)(NumSegments-1) ) * maxValidRadius * maxValidRadius;\n            float val = result.DistortionFnScaleRadiusSquared ( radiusSq );            \n            OVR_ASSERT ( Alg::Abs ( val - result.K[ctrlPt] ) < 0.0001f );\n            OVR_UNUSED1(val); // For release build.\n        }\n\n        // Set up the fast inverse.\n        float maxRDist = result.DistortionFn ( maxValidRadius );\n        result.MaxInvR = maxRDist;\n        result.SetUpInverseApprox();\n\n        }break;\n\n    default: OVR_ASSERT ( false ); break;\n    }\n\n\n    // Chromatic aberration.\n    result.ChromaticAberration[0] = invLerpVal * pLower->Config.ChromaticAberration[0] + lerpVal * pUpper->Config.ChromaticAberration[0];\n    result.ChromaticAberration[1] = invLerpVal * pLower->Config.ChromaticAberration[1] + lerpVal * pUpper->Config.ChromaticAberration[1];\n    result.ChromaticAberration[2] = invLerpVal * pLower->Config.ChromaticAberration[2] + lerpVal * pUpper->Config.ChromaticAberration[2];\n    result.ChromaticAberration[3] = invLerpVal * pLower->Config.ChromaticAberration[3] + lerpVal * pUpper->Config.ChromaticAberration[3];\n\n    // Scale.\n    result.MetersPerTanAngleAtCenter =  pLower->Config.MetersPerTanAngleAtCenter * invLerpVal +\n                                        pUpper->Config.MetersPerTanAngleAtCenter * lerpVal;\n    /*\n    // Commented out - Causes ASSERT with no HMD plugged in\n#ifdef OVR_BUILD_DEBUG\n    if ( distortionType == Distortion_CatmullRom10 )\n    {\n        TestSaveLoadLensConfig ( result );\n    }\n#endif\n    */\n    return result;\n}\n\n\nDistortionRenderDesc CalculateDistortionRenderDesc ( StereoEye eyeType, HmdRenderInfo const &hmd,\n                                                     const LensConfig *pLensOverride /*= nullptr */ )\n{\n    // From eye relief, IPD and device characteristics, we get the distortion mapping.\n    // This distortion does the following things:\n    // 1. It undoes the distortion that happens at the edges of the lens.\n    // 2. It maps the undistorted field into \"retina\" space.\n    // So the input is a pixel coordinate - the physical pixel on the display itself.\n    // The output is the real-world direction of the ray from this pixel as it comes out of the lens and hits the eye.\n    // However we typically think of rays \"coming from\" the eye, so the direction (TanAngleX,TanAngleY,1) is the direction\n    //      that the pixel appears to be in real-world space, where AngleX and AngleY are relative to the straight-ahead vector.\n    // If your renderer is a raytracer, you can use this vector directly (normalize as appropriate).\n    // However in standard rasterisers, we have rendered a 2D image and are putting it in front of the eye,\n    //      so we then need a mapping from this space to the [-1,1] UV coordinate space, which depends on exactly\n    //      where \"in space\" the app wants to put that rendertarget.\n    //      Where in space, and how large this rendertarget is, is completely up to the app and/or user,\n    //      though of course we can provide some useful hints.\n\n    // TODO: Use IPD and eye relief to modify distortion (i.e. non-radial component)\n    // TODO: cope with lenses that don't produce collimated light.\n    //       This means that IPD relative to the lens separation changes the light vergence,\n    //       and so we actually need to change where the image is displayed.\n\n    const HmdRenderInfo::EyeConfig &hmdEyeConfig = ( eyeType == StereoEye_Left ) ? hmd.EyeLeft : hmd.EyeRight;\n\n    DistortionRenderDesc localDistortion;\n    localDistortion.Lens = hmdEyeConfig.Distortion;\n\n    if ( pLensOverride != nullptr )\n    {\n        localDistortion.Lens = *pLensOverride;\n    }\n\n    Sizef pixelsPerMeter(hmd.ResolutionInPixels.w / ( hmd.ScreenSizeInMeters.w - hmd.ScreenGapSizeInMeters ),\n                         hmd.ResolutionInPixels.h / hmd.ScreenSizeInMeters.h);\n\n    localDistortion.PixelsPerTanAngleAtCenter = (pixelsPerMeter * localDistortion.Lens.MetersPerTanAngleAtCenter).ToVector();\n    // Same thing, scaled to [-1,1] for each eye, rather than pixels.\n\n    localDistortion.TanEyeAngleScale = Vector2f(0.25f, 0.5f).EntrywiseMultiply(\n                                       (hmd.ScreenSizeInMeters / localDistortion.Lens.MetersPerTanAngleAtCenter).ToVector());\n    \n    // <--------------left eye------------------><-ScreenGapSizeInMeters-><--------------right eye----------------->\n    // <------------------------------------------ScreenSizeInMeters.Width----------------------------------------->\n    //                            <----------------LensSeparationInMeters--------------->\n    // <--centerFromLeftInMeters->\n    //                            ^\n    //                      Center of lens\n\n    // Find the lens centers in scale of [-1,+1] (NDC) in left eye.\n    float visibleWidthOfOneEye = 0.5f * ( hmd.ScreenSizeInMeters.w - hmd.ScreenGapSizeInMeters );\n    float centerFromLeftInMeters = ( hmd.ScreenSizeInMeters.w - hmd.LensSeparationInMeters ) * 0.5f;\n    localDistortion.LensCenter.x = (     centerFromLeftInMeters / visibleWidthOfOneEye          ) * 2.0f - 1.0f;\n    localDistortion.LensCenter.y = ( hmd.CenterFromTopInMeters  / hmd.ScreenSizeInMeters.h ) * 2.0f - 1.0f;\n    if ( eyeType == StereoEye_Right )\n    {\n        localDistortion.LensCenter.x = -localDistortion.LensCenter.x;\n    }\n\n    return localDistortion;\n}\n\nFovPort CalculateFovFromEyePosition ( float eyeReliefInMeters,\n                                      float offsetToRightInMeters,\n                                      float offsetDownwardsInMeters,\n                                      float lensDiameterInMeters,\n                                      float extraEyeRotationInRadians /*= 0.0f*/ )\n{\n    // 2D view of things:\n    //       |-|            <--- offsetToRightInMeters (in this case, it is negative)\n    // |=======C=======|    <--- lens surface (C=center)\n    //  \\    |       _/\n    //   \\   R     _/\n    //    \\  |   _/\n    //     \\ | _/\n    //      \\|/\n    //       O  <--- center of pupil\n\n    // (technically the lens is round rather than square, so it's not correct to\n    // separate vertical and horizontal like this, but it's close enough)\n    float halfLensDiameter = lensDiameterInMeters * 0.5f;\n    FovPort fovPort;\n    fovPort.UpTan    = ( halfLensDiameter + offsetDownwardsInMeters ) / eyeReliefInMeters;\n    fovPort.DownTan  = ( halfLensDiameter - offsetDownwardsInMeters ) / eyeReliefInMeters;\n    fovPort.LeftTan  = ( halfLensDiameter + offsetToRightInMeters   ) / eyeReliefInMeters;\n    fovPort.RightTan = ( halfLensDiameter - offsetToRightInMeters   ) / eyeReliefInMeters;\n\n    if ( extraEyeRotationInRadians > 0.0f )\n    {\n        // That's the basic looking-straight-ahead eye position relative to the lens.\n        // But if you look left, the pupil moves left as the eyeball rotates, which\n        // means you can see more to the right than this geometry suggests.\n        // So add in the bounds for the extra movement of the pupil.\n\n        // Beyond 30 degrees does not increase FOV because the pupil starts moving backwards more than sideways.\n        extraEyeRotationInRadians = Alg::Min ( DegreeToRad ( 30.0f ), Alg::Max ( 0.0f, extraEyeRotationInRadians ) );\n        \n        // The rotation of the eye is a bit more complex than a simple circle.  The center of rotation\n        // at 13.5mm from cornea is slightly further back than the actual center of the eye.\n        // Additionally the rotation contains a small lateral component as the muscles pull the eye\n        const float eyeballCenterToPupil = 0.0135f;  // center of eye rotation\n        const float eyeballLateralPull = 0.001f * (extraEyeRotationInRadians / DegreeToRad ( 30.0f));  // lateral motion as linear function \n        float extraTranslation = eyeballCenterToPupil * sinf ( extraEyeRotationInRadians ) + eyeballLateralPull;\n        float extraRelief = eyeballCenterToPupil * ( 1.0f - cosf ( extraEyeRotationInRadians ) );\n\n        fovPort.UpTan    = Alg::Max ( fovPort.UpTan   , ( halfLensDiameter + offsetDownwardsInMeters + extraTranslation ) / ( eyeReliefInMeters + extraRelief ) );\n        fovPort.DownTan  = Alg::Max ( fovPort.DownTan , ( halfLensDiameter - offsetDownwardsInMeters + extraTranslation ) / ( eyeReliefInMeters + extraRelief ) );\n        fovPort.LeftTan  = Alg::Max ( fovPort.LeftTan , ( halfLensDiameter + offsetToRightInMeters   + extraTranslation ) / ( eyeReliefInMeters + extraRelief ) );\n        fovPort.RightTan = Alg::Max ( fovPort.RightTan, ( halfLensDiameter - offsetToRightInMeters   + extraTranslation ) / ( eyeReliefInMeters + extraRelief ) );\n    }\n\n    return fovPort;\n}\n\n\n\nFovPort CalculateFovFromHmdInfo ( StereoEye eyeType,\n                                  DistortionRenderDesc const &distortion,\n                                  HmdRenderInfo const &hmd,\n                                  float extraEyeRotationInRadians /*= 0.0f*/ )\n{\n    FovPort fovPort;\n    float eyeReliefInMeters;\n    float offsetToRightInMeters;\n    if ( eyeType == StereoEye_Right )\n    {\n        eyeReliefInMeters     = hmd.EyeRight.ReliefInMeters;\n        offsetToRightInMeters = hmd.EyeRight.NoseToPupilInMeters - 0.5f * hmd.LensSeparationInMeters;\n    }\n    else\n    {\n        eyeReliefInMeters     = hmd.EyeLeft.ReliefInMeters;\n        offsetToRightInMeters = -(hmd.EyeLeft.NoseToPupilInMeters - 0.5f * hmd.LensSeparationInMeters);\n    }\n\n    // Limit the eye-relief to 6 mm for FOV calculations since this just tends to spread off-screen\n    // and get clamped anyways on DK1 (but in Unity it continues to spreads and causes \n    // unnecessarily large render targets)\n    eyeReliefInMeters = Alg::Max(eyeReliefInMeters, 0.006f);\n\n\n    // Central view.\n    fovPort = CalculateFovFromEyePosition ( eyeReliefInMeters,\n                                            offsetToRightInMeters,\n                                            0.0f,\n                                            hmd.LensDiameterInMeters,\n                                            extraEyeRotationInRadians );\n\n    // clamp to the screen\n    fovPort = ClampToPhysicalScreenFov ( eyeType, distortion, fovPort );\n       \n    return fovPort;\n}\n\n\n\nFovPort GetPhysicalScreenFov ( StereoEye eyeType, DistortionRenderDesc const &distortion )\n{\n    OVR_UNUSED1 ( eyeType );\n\n    FovPort resultFovPort;\n\n    // Figure out the boundaries of the screen. We take the middle pixel of the screen,\n    // move to each of the four screen edges, and transform those back into TanAngle space.\n    Vector2f dmiddle = distortion.LensCenter;\n\n    // The gotcha is that for some distortion functions, the map will \"wrap around\"\n    // for screen pixels that are not actually visible to the user (especially on DK1,\n    // which has a lot of invisible pixels), and map to pixels that are close to the middle.\n    // This means the edges of the screen will actually be\n    // \"closer\" than the visible bounds, so we'll clip too aggressively.\n\n    // Solution - step gradually towards the boundary, noting the maximum distance.\n    struct FunctionHider\n    {\n        static FovPort FindRange ( Vector2f from, Vector2f to, int numSteps,\n                                          DistortionRenderDesc const &distortionL )\n        {\n            FovPort result;\n            result.UpTan    = 0.0f;\n            result.DownTan  = 0.0f;\n            result.LeftTan  = 0.0f;\n            result.RightTan = 0.0f;\n\n            float stepScale = 1.0f / ( numSteps - 1 );\n            for ( int step = 0; step < numSteps; step++ )\n            {\n                float    lerpFactor  = stepScale * (float)step;\n                Vector2f sample      = from + (to - from) * lerpFactor;\n                Vector2f tanEyeAngle = TransformScreenNDCToTanFovSpace ( distortionL, sample );\n\n                result.LeftTan  = Alg::Max ( result.LeftTan,  -tanEyeAngle.x );\n                result.RightTan = Alg::Max ( result.RightTan,  tanEyeAngle.x );\n                result.UpTan    = Alg::Max ( result.UpTan,    -tanEyeAngle.y );\n                result.DownTan  = Alg::Max ( result.DownTan,   tanEyeAngle.y );\n            }\n            return result;\n        }\n    };\n\n    FovPort leftFovPort  = FunctionHider::FindRange( dmiddle, Vector2f( -1.0f, dmiddle.y ), 10, distortion );\n    FovPort rightFovPort = FunctionHider::FindRange( dmiddle, Vector2f( 1.0f, dmiddle.y ),  10, distortion );\n    FovPort upFovPort    = FunctionHider::FindRange( dmiddle, Vector2f( dmiddle.x, -1.0f ), 10, distortion );\n    FovPort downFovPort  = FunctionHider::FindRange( dmiddle, Vector2f( dmiddle.x, 1.0f ),  10, distortion );\n    \n    resultFovPort.LeftTan  = leftFovPort.LeftTan;\n    resultFovPort.RightTan = rightFovPort.RightTan;\n    resultFovPort.UpTan    = upFovPort.UpTan;\n    resultFovPort.DownTan  = downFovPort.DownTan;\n\n    return resultFovPort;\n}\n\nFovPort ClampToPhysicalScreenFov( StereoEye eyeType, DistortionRenderDesc const &distortion,\n                                         FovPort inputFovPort )\n{\n    FovPort resultFovPort;\n    FovPort phsyicalFovPort = GetPhysicalScreenFov ( eyeType, distortion );\n    resultFovPort.LeftTan  = Alg::Min ( inputFovPort.LeftTan,  phsyicalFovPort.LeftTan );\n    resultFovPort.RightTan = Alg::Min ( inputFovPort.RightTan, phsyicalFovPort.RightTan );\n    resultFovPort.UpTan    = Alg::Min ( inputFovPort.UpTan,    phsyicalFovPort.UpTan );\n    resultFovPort.DownTan  = Alg::Min ( inputFovPort.DownTan,  phsyicalFovPort.DownTan );\n\n    return resultFovPort;\n}\n\nSizei CalculateIdealPixelSize ( StereoEye eyeType, DistortionRenderDesc const &distortion,\n                                FovPort tanHalfFov, float pixelsPerDisplayPixel )\n{\n    OVR_UNUSED(eyeType);   // might be useful in the future if we do overlapping fovs\n\n    Sizei result;    \n    // TODO: if the app passes in a FOV that doesn't cover the centre, use the distortion values for the nearest edge/corner to match pixel size.\n    result.w  = (int)(0.5f + pixelsPerDisplayPixel * distortion.PixelsPerTanAngleAtCenter.x * ( tanHalfFov.LeftTan + tanHalfFov.RightTan ) );\n    result.h = (int)(0.5f + pixelsPerDisplayPixel * distortion.PixelsPerTanAngleAtCenter.y * ( tanHalfFov.UpTan   + tanHalfFov.DownTan  ) );\n    return result;\n}\n\nRecti GetFramebufferViewport ( StereoEye eyeType, HmdRenderInfo const &hmd )\n{\n    Recti result;\n    result.w = hmd.ResolutionInPixels.w/2;\n    result.h = hmd.ResolutionInPixels.h;\n    result.x = 0;\n    result.y = 0;\n    if ( eyeType == StereoEye_Right )\n    {\n        result.x = (hmd.ResolutionInPixels.w+1)/2;      // Round up, not down.\n    }\n    return result;\n}\n\n\nScaleAndOffset2D CreateUVScaleAndOffsetfromNDCScaleandOffset ( ScaleAndOffset2D scaleAndOffsetNDC,\n                                                               Recti renderedViewport,\n                                                               Sizei renderTargetSize )\n{\n    // scaleAndOffsetNDC takes you to NDC space [-1,+1] within the given viewport on the rendertarget.\n    // We want a scale to instead go to actual UV coordinates you can sample with,\n    // which need [0,1] and ignore the viewport.\n    ScaleAndOffset2D result;\n    // Scale [-1,1] to [0,1]\n    result.Scale  = scaleAndOffsetNDC.Scale * 0.5f;\n    result.Offset = scaleAndOffsetNDC.Offset * 0.5f + Vector2f(0.5f);\n    \n    // ...but we will have rendered to a subsection of the RT, so scale for that.\n    Vector2f scale(  (float)renderedViewport.w / (float)renderTargetSize.w,\n                     (float)renderedViewport.h / (float)renderTargetSize.h );\n    Vector2f offset( (float)renderedViewport.x / (float)renderTargetSize.w,\n                     (float)renderedViewport.y / (float)renderTargetSize.h );\n\n\tresult.Scale  = result.Scale.EntrywiseMultiply(scale);\n    result.Offset  = result.Offset.EntrywiseMultiply(scale) + offset;\n    return result;\n}\n\n\n//-----------------------------------------------------------------------------------\n// A set of \"forward-mapping\" functions, mapping from framebuffer space to real-world and/or texture space.\n\n// This mimics the first half of the distortion shader's function.\nVector2f TransformScreenNDCToTanFovSpace( DistortionRenderDesc const &distortion,\n                                          const Vector2f &framebufferNDC )\n{\n    // Scale to TanHalfFov space, but still distorted.\n    Vector2f tanEyeAngleDistorted;\n    tanEyeAngleDistorted.x = ( framebufferNDC.x - distortion.LensCenter.x ) * distortion.TanEyeAngleScale.x;\n    tanEyeAngleDistorted.y = ( framebufferNDC.y - distortion.LensCenter.y ) * distortion.TanEyeAngleScale.y;\n    // Distort.\n    float radiusSquared = ( tanEyeAngleDistorted.x * tanEyeAngleDistorted.x )\n                        + ( tanEyeAngleDistorted.y * tanEyeAngleDistorted.y );\n    float distortionScale = distortion.Lens.DistortionFnScaleRadiusSquared ( radiusSquared );\n    Vector2f tanEyeAngle;\n    tanEyeAngle.x = tanEyeAngleDistorted.x * distortionScale;\n    tanEyeAngle.y = tanEyeAngleDistorted.y * distortionScale;\n\n    return tanEyeAngle;\n}\n\n// Same, with chromatic aberration correction.\nvoid TransformScreenNDCToTanFovSpaceChroma ( Vector2f *resultR, Vector2f *resultG, Vector2f *resultB, \n                                             DistortionRenderDesc const &distortion,\n                                             const Vector2f &framebufferNDC )\n{\n    // Scale to TanHalfFov space, but still distorted.\n    Vector2f tanEyeAngleDistorted;\n    tanEyeAngleDistorted.x = ( framebufferNDC.x - distortion.LensCenter.x ) * distortion.TanEyeAngleScale.x;\n    tanEyeAngleDistorted.y = ( framebufferNDC.y - distortion.LensCenter.y ) * distortion.TanEyeAngleScale.y;\n    // Distort.\n    float radiusSquared = ( tanEyeAngleDistorted.x * tanEyeAngleDistorted.x )\n                        + ( tanEyeAngleDistorted.y * tanEyeAngleDistorted.y );\n    Vector3f distortionScales = distortion.Lens.DistortionFnScaleRadiusSquaredChroma ( radiusSquared );\n    *resultR = tanEyeAngleDistorted * distortionScales.x;\n    *resultG = tanEyeAngleDistorted * distortionScales.y;\n    *resultB = tanEyeAngleDistorted * distortionScales.z;\n}\n\n// This mimics the second half of the distortion shader's function.\nVector2f TransformTanFovSpaceToRendertargetTexUV( ScaleAndOffset2D const &eyeToSourceUV,\n                                                  Vector2f const &tanEyeAngle )\n{\n    Vector2f textureUV;\n    textureUV.x = tanEyeAngle.x * eyeToSourceUV.Scale.x + eyeToSourceUV.Offset.x;\n    textureUV.y = tanEyeAngle.y * eyeToSourceUV.Scale.y + eyeToSourceUV.Offset.y;\n    return textureUV;\n}\n\nVector2f TransformTanFovSpaceToRendertargetNDC( ScaleAndOffset2D const &eyeToSourceNDC,\n                                                Vector2f const &tanEyeAngle )\n{\n    Vector2f textureNDC;\n    textureNDC.x = tanEyeAngle.x * eyeToSourceNDC.Scale.x + eyeToSourceNDC.Offset.x;\n    textureNDC.y = tanEyeAngle.y * eyeToSourceNDC.Scale.y + eyeToSourceNDC.Offset.y;\n    return textureNDC;\n}\n\nVector2f TransformScreenPixelToScreenNDC( Recti const &distortionViewport,\n                                          Vector2f const &pixel )\n{\n    // Move to [-1,1] NDC coords.\n    Vector2f framebufferNDC;\n    framebufferNDC.x = -1.0f + 2.0f * ( ( pixel.x - (float)distortionViewport.x ) / (float)distortionViewport.w );\n    framebufferNDC.y = -1.0f + 2.0f * ( ( pixel.y - (float)distortionViewport.y ) / (float)distortionViewport.h );\n    return framebufferNDC;\n}\n\nVector2f TransformScreenPixelToTanFovSpace( Recti const &distortionViewport,\n                                            DistortionRenderDesc const &distortion,\n                                            Vector2f const &pixel )\n{\n    return TransformScreenNDCToTanFovSpace( distortion,\n                TransformScreenPixelToScreenNDC( distortionViewport, pixel ) );\n}\n\nVector2f TransformScreenNDCToRendertargetTexUV( DistortionRenderDesc const &distortion,\n                                                StereoEyeParams const &eyeParams,\n                                                Vector2f const &pixel )\n{\n    return TransformTanFovSpaceToRendertargetTexUV ( eyeParams,\n                TransformScreenNDCToTanFovSpace ( distortion, pixel ) );\n}\n\nVector2f TransformScreenPixelToRendertargetTexUV( Recti const &distortionViewport,\n                                                  DistortionRenderDesc const &distortion,\n                                                  StereoEyeParams const &eyeParams,\n                                                  Vector2f const &pixel )\n{\n    return TransformTanFovSpaceToRendertargetTexUV ( eyeParams,\n                TransformScreenPixelToTanFovSpace ( distortionViewport, distortion, pixel ) );\n}\n\n\n//-----------------------------------------------------------------------------------\n// A set of \"reverse-mapping\" functions, mapping from real-world and/or texture space back to the framebuffer.\n\nVector2f TransformTanFovSpaceToScreenNDC( DistortionRenderDesc const &distortion,\n                                          const Vector2f &tanEyeAngle, bool usePolyApprox /*= false*/ )\n{\n    float tanEyeAngleRadius = tanEyeAngle.Length();\n    float tanEyeAngleDistortedRadius = distortion.Lens.DistortionFnInverseApprox ( tanEyeAngleRadius );\n    if ( !usePolyApprox )\n    {\n        tanEyeAngleDistortedRadius = distortion.Lens.DistortionFnInverse ( tanEyeAngleRadius );\n    }\n    Vector2f tanEyeAngleDistorted = tanEyeAngle;\n    if ( tanEyeAngleRadius > 0.0f )\n    {   \n        tanEyeAngleDistorted = tanEyeAngle * ( tanEyeAngleDistortedRadius / tanEyeAngleRadius );\n    }\n\n    Vector2f framebufferNDC;\n    framebufferNDC.x = ( tanEyeAngleDistorted.x / distortion.TanEyeAngleScale.x ) + distortion.LensCenter.x;\n    framebufferNDC.y = ( tanEyeAngleDistorted.y / distortion.TanEyeAngleScale.y ) + distortion.LensCenter.y;\n\n    return framebufferNDC;\n}\n\nVector2f TransformRendertargetNDCToTanFovSpace( const ScaleAndOffset2D &eyeToSourceNDC,\n                                                const Vector2f &textureNDC )\n{\n    Vector2f tanEyeAngle = (textureNDC - eyeToSourceNDC.Offset) / eyeToSourceNDC.Scale;\n    return tanEyeAngle;\n}\n\n\n\n//-----------------------------------------------------------------------------\n// Timewarp Matrix\n//\n// These functions provide helper functions to compute the timewarp shader input\n// matrices needed during the distortion/timewarp/chroma draw call.\n\n//-----------------------------------------------------------------------------\n// CalculateOrientationTimewarpMatrix\n//\n// For Orientation-only Timewarp, the inputs are quaternions and the output is\n// a transform matrix.  The matrix may need to be transposed depending on which\n// renderer is used.  This function produces one compatible with D3D11.\n//\n// eye: Input quaternion of EyeRenderPose.Orientation inverted.\n// pred: Input quaternion of predicted eye pose at scanout.\n// M: Output D3D11-compatible transform matrix for the Timewarp shader.\nvoid CalculateOrientationTimewarpMatrix(Quatf const & eyeInv, Quatf const & pred, Matrix4f& M)\n{\n    Posef renderFromEyeInverted = Posef ( eyeInv, Vector3f::Zero() );\n    Posef hmdPose = Posef ( pred, Vector3f::Zero() );\n\n    CalculatePositionalTimewarpMatrix ( renderFromEyeInverted, hmdPose, Vector3f::Zero(), M );\n}\n\n//-----------------------------------------------------------------------------\n// CalculatePositionalTimewarpMatrix\n//\n// The matrix may need to be transposed depending on which\n// renderer is used.  This function produces one compatible with D3D11.\n//\n// renderFromEyeInverted: Input render transform from eye inverted.\n// hmdPose: Input predicted head pose from HMD tracking code.\n// extraQuat: Input extra quaternion rotation applied to calculations.\n// extraEyeOffset: Input extra eye position offset applied to calculations.\n// M: Output D3D11-compatible transform matrix for the Timewarp shader.\nvoid CalculatePositionalTimewarpMatrix(Posef const & renderFromEyeInverted, Posef const & hmdPose,\n                                       Vector3f const & extraEyeOffset,\n                                       Matrix4f& M)\n{\n\n    Posef eyePose = Posef(hmdPose.Rotation, hmdPose.Translation + extraEyeOffset);\n    Matrix4f Mres = Matrix4f(renderFromEyeInverted * eyePose);\n\n    // The real-world orientations have:                                  X=right, Y=up,   Z=backwards.\n    // The vectors inside the mesh are in NDC to keep the shader simple: X=right, Y=down, Z=forwards.\n    // So we need to perform a similarity transform on this delta matrix.\n    // The verbose code would look like this:\n    /*\n    Matrix4f matBasisChange;\n    matBasisChange.SetIdentity();\n    matBasisChange.M[0][0] =  1.0f;\n    matBasisChange.M[1][1] = -1.0f;\n    matBasisChange.M[2][2] = -1.0f;\n    Matrix4f matBasisChangeInv = matBasisChange.Inverted();\n    matRenderFromNow = matBasisChangeInv * matRenderFromNow * matBasisChange;\n    */\n    // ...but of course all the above is a constant transform and much more easily done.\n    // We flip the signs of the Y&Z row, then flip the signs of the Y&Z column,\n    // and of course most of the flips cancel:\n    // +++                        +--                     +--\n    // +++ -> flip Y&Z columns -> +-- -> flip Y&Z rows -> -++\n    // +++                        +--                     -++\n    Mres.M[0][1] = -Mres.M[0][1];\n    Mres.M[0][2] = -Mres.M[0][2];\n    Mres.M[1][0] = -Mres.M[1][0];\n    Mres.M[2][0] = -Mres.M[2][0];\n    Mres.M[1][3] = -Mres.M[1][3];\n    Mres.M[2][3] = -Mres.M[2][3];\n\n    M = Mres;\n}\n\n\n//-----------------------------------------------------------------------------\n// CalculateTimewarpFromSensors\n//\n// Read current pose from sensors and construct timewarp matrices for start/end\n// predicted poses.\n//\n// hmdPose: RenderPose eye quaternion, *not* inverted.\n// reader: the tracking state\n// poseInFaceSpace: true if the pose supplied is stuck-to-your-face rather than fixed-in-space\n// calcPosition: true if the position part of the result is actually used (false = orientation only)\n// hmdToEyeViewOffset: offset from the HMD \"middle eye\" to actual eye.\n// startEndTimes: start and end times of the screen - typically fed direct from Timing->GetTimewarpTiming()->EyeStartEndTimes[eyeNum]\n//\n// Results:\n// startEndMatrices: Timewarp matrices for the start and end times respectively.\n// timewarpIMUTime: On success it contains the raw IMU sample time for the pose.\n// Returns false on failure to read state.\nbool CalculateTimewarpFromSensors(Posef const & hmdPose,\n                                  Vision::TrackingStateReader* reader,\n                                  bool poseInFaceSpace,\n                                  bool calcPosition, \n                                  ovrVector3f const &hmdToEyeViewOffset,\n                                  const double startEndTimes[2],\n                                  Matrix4f startEndMatrices[2],\n                                  double& timewarpIMUTime)\n{\n    Vision::TrackingState startState, endState;\n    if (!reader->GetTrackingStateAtTime(startEndTimes[0], startState) ||\n        !reader->GetTrackingStateAtTime(startEndTimes[1], endState))\n    {\n        // No data is available so do not do timewarp.\n        startEndMatrices[0] = Matrix4f::Identity();\n        startEndMatrices[1] = Matrix4f::Identity();\n        timewarpIMUTime = 0.;\n        return false;\n    }\n\n    ovrPosef startHmdPose;\n    ovrPosef endHmdPose;\n    if ( poseInFaceSpace )\n    {\n        startHmdPose.Position = Vector3f::Zero();\n        startHmdPose.Orientation = Quatf::Identity();\n        endHmdPose = startHmdPose;\n    }\n    else\n    {\n        startHmdPose = startState.HeadPose.ThePose;\n        endHmdPose   = endState.HeadPose.ThePose;\n    }\n\n    Posef renderPose = hmdPose;\n    Vector3f eyeOffset = Vector3f(0.0f, 0.0f, 0.0f);\n    if(calcPosition)\n    {\n        if(hmdToEyeViewOffset.x >= MATH_FLOAT_MAXVALUE)\n        {\n            OVR_ASSERT(false);\n            LogError(\"{ERR-103} [FrameTime] Invalid hmdToEyeViewOffset provided by client.\");\n\n            renderPose.Translation = Vector3f::Zero();   // disable position to avoid positional issues\n        }\n        else\n        {\n            // Currently HmdToEyeViewOffset is only a 3D vector\n            // (Negate HmdToEyeViewOffset because offset is a view matrix offset and not a camera offset)\n            eyeOffset = ((Posef)startHmdPose).Apply(-((Vector3f)hmdToEyeViewOffset));\n        }\n    }\n    else\n    {\n        // Orientation only.\n        renderPose.Translation = Vector3f::Zero();\n    }\n\n\n    if(calcPosition)\n    {\n        Posef hmdPoseInv = hmdPose.Inverted();\n        CalculatePositionalTimewarpMatrix ( hmdPoseInv, startHmdPose,\n                                            eyeOffset, startEndMatrices[0] );\n        CalculatePositionalTimewarpMatrix ( hmdPoseInv,   endHmdPose,\n                                            eyeOffset, startEndMatrices[1] );\n    }\n    else\n    {\n        // Orientation-only.\n        Quatf quatFromEye = hmdPose.Rotation.Inverted();\n        CalculateOrientationTimewarpMatrix(quatFromEye, startHmdPose.Orientation, startEndMatrices[0]);\n        CalculateOrientationTimewarpMatrix(quatFromEye,   endHmdPose.Orientation, startEndMatrices[1]);\n    }\n\n    // Store off the IMU sample time.\n    timewarpIMUTime = startState.RawSensorData.AbsoluteTimeSeconds;\n\n    return true;\n}\n\n// Only handles orientation, not translation.\nbool CalculateOrientationTimewarpFromSensors(Quatf const & eyeQuat,\n                                             Vision::TrackingStateReader* reader,\n                                             const double startEndTimes[2],\n                                             Matrix4f startEndMatrices[2],\n                                             double& timewarpIMUTime)\n{\n    Posef hmdPose = Posef ( eyeQuat, Vector3f::Zero() );\n    return CalculateTimewarpFromSensors ( hmdPose, reader, false, false, Vector3f::Zero(), startEndTimes, startEndMatrices, timewarpIMUTime );\n}\n\n\n//-----------------------------------------------------------------------------\n// CalculateEyeTimewarpTimes\n//\n// Given the scanout start time, duration of scanout, and shutter type, this\n// function returns the timewarp left/right eye start and end prediction times.\nvoid CalculateEyeTimewarpTimes(double scanoutStartTime, double scanoutDuration,\n                               HmdShutterTypeEnum shutterType,\n                               double leftEyeStartEndTime[2], double rightEyeStartEndTime[2])\n{\n    // Calculate absolute points in time when eye rendering or corresponding time-warp\n    // screen edges will become visible.\n    // This only matters with VSync.\n    switch (shutterType)\n    {\n    case HmdShutter_RollingTopToBottom:\n    case HmdShutter_RollingLeftToRight:\n    case HmdShutter_RollingRightToLeft:\n        // This is *Correct* with Tom's distortion mesh organization.\n        leftEyeStartEndTime[0] = scanoutStartTime;\n        leftEyeStartEndTime[1] = scanoutStartTime + scanoutDuration;\n        rightEyeStartEndTime[0] = scanoutStartTime;\n        rightEyeStartEndTime[1] = scanoutStartTime + scanoutDuration;\n        break;\n    case HmdShutter_Global:\n        // TBD\n        {\n            double midpoint = scanoutStartTime + scanoutDuration * 0.5;\n            leftEyeStartEndTime[0] = midpoint;\n            leftEyeStartEndTime[1] = midpoint;\n            rightEyeStartEndTime[0] = midpoint;\n            rightEyeStartEndTime[1] = midpoint;\n        }\n        break;\n    default:\n        OVR_ASSERT(false);\n        break;\n    }\n}\n\n//-----------------------------------------------------------------------------\n// CalculateEyeRenderTimes\n//\n// Given the scanout start time, duration of scanout, and shutter type, this\n// function returns the left/right eye render times.\nvoid CalculateEyeRenderTimes(double scanoutStartTime, double scanoutDuration,\n                             HmdShutterTypeEnum shutterType,\n                             double& leftEyeRenderTime, double& rightEyeRenderTime)\n{\n    switch(shutterType)\n    {\n    case HmdShutter_RollingTopToBottom:\n    case HmdShutter_Global:\n        leftEyeRenderTime  = scanoutStartTime + scanoutDuration * 0.5;\n        rightEyeRenderTime = scanoutStartTime + scanoutDuration * 0.5;\n        break;\n    case HmdShutter_RollingLeftToRight:\n        leftEyeRenderTime  = scanoutStartTime + scanoutDuration * 0.25;\n        rightEyeRenderTime = scanoutStartTime + scanoutDuration * 0.75;\n        break;\n    case HmdShutter_RollingRightToLeft:\n        leftEyeRenderTime  = scanoutStartTime + scanoutDuration * 0.75;\n        rightEyeRenderTime = scanoutStartTime + scanoutDuration * 0.25;\n        break;\n    default:\n        OVR_ASSERT(false);\n        break;\n    }\n}\n\n\n//-----------------------------------------------------------------------------\n// CalculateDistortionMeshFromFOV\n//\n// This function fills in the target meshData object given the provided\n// parameters, for a single specified eye.\n//\n// Returns false on failure.\nbool CalculateDistortionMeshFromFOV(HmdRenderInfo const & renderInfo,\n                                    DistortionRenderDesc const & distortionDesc,\n                                    StereoEye stereoEye, FovPort fov,\n                                    unsigned distortionCaps,\n                                    ovrDistortionMesh *meshData)\n{\n    if (!meshData)\n    {\n        return false;\n    }\n\n    // Not used now, but Chromatic flag or others could possibly be checked for in the future.\n    OVR_UNUSED1(distortionCaps); \n\n    // *** Calculate a part of \"StereoParams\" needed for mesh generation\n\n    // Note that mesh distortion generation is invariant of RenderTarget UVs, allowing\n    // render target size and location to be changed after the fact dynamically. \n    // eyeToSourceUV is computed here for convenience, so that users don't need\n    // to call ovrHmd_GetRenderScaleAndOffset unless changing RT dynamically.\n\n    // Find the mapping from TanAngle space to target NDC space.\n    ScaleAndOffset2D eyeToSourceNDC = CreateNDCScaleAndOffsetFromFov(fov);\n\n    int triangleCount = 0;\n    int vertexCount = 0;\n\n    OVR::Util::Render::DistortionMeshCreate(\n        (OVR::Util::Render::DistortionMeshVertexData**)&meshData->pVertexData,\n        (uint16_t**)&meshData->pIndexData,\n        &vertexCount, &triangleCount,\n        (stereoEye == StereoEye_Right),\n        renderInfo, distortionDesc, eyeToSourceNDC);\n\n    if (meshData->pVertexData)\n    {\n        // Convert to index\n        meshData->IndexCount = triangleCount * 3;\n        meshData->VertexCount = vertexCount;\n        return true;\n    }\n\n    return false;\n}\n\n\n} //namespace OVR\n\n//Just want to make a copy disentangled from all these namespaces!\nfloat ExtEvalCatmullRom10Spline ( float const *K, float scaledVal )\n{\n\treturn(OVR::EvalCatmullRom10Spline ( K, scaledVal ));\n}\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/OVR_Stereo.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Stereo.h\nContent     :   Stereo rendering functions\nCreated     :   November 30, 2013\nAuthors     :   Tom Fosyth\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Stereo_h\n#define OVR_Stereo_h\n\n#include \"Sensors/OVR_DeviceConstants.h\"\n#include \"Displays/OVR_Display.h\"\n#include \"Vision/SensorFusion/Vision_SensorStateReader.h\"\n#include \"OVR_Profile.h\"\n#include \"OVR_CAPI.h\" // ovrDistortionMesh\n#include \"OVR_StereoProjection.h\"\n\n\n// CAPI Forward declaration.\ntypedef struct ovrFovPort_ ovrFovPort;\ntypedef struct ovrRecti_ ovrRecti;\n\nnamespace OVR {\n\nclass SensorDevice; // Opaque forward declaration\n\n\n//-----------------------------------------------------------------------------------\n// ***** Misc. utility functions.\n\n// Inputs are 4 points (pFitX[0],pFitY[0]) through (pFitX[3],pFitY[3])\n// Result is four coefficients in pResults[0] through pResults[3] such that\n//      y = pResult[0] + x * ( pResult[1] + x * ( pResult[2] + x * ( pResult[3] ) ) );\n// passes through all four input points.\n// Return is true if it succeeded, false if it failed (because two control points\n// have the same pFitX value).\nbool FitCubicPolynomial ( float *pResult, const float *pFitX, const float *pFitY );\n\n//-----------------------------------------------------------------------------------\n// ***** LensConfig\n\n// LensConfig describes the configuration of a single lens in an HMD.\n// - Eqn and K[] describe a distortion function.\n// - MetersPerTanAngleAtCenter is the relationship between distance on a\n//   screen (at the center of the lens), and the angle variance of the light after it\n//   has passed through the lens.\n// - ChromaticAberration is an array of parameters for controlling\n//   additional Red and Blue scaling in order to reduce chromatic aberration\n//   caused by the Rift lenses.\nstruct LensConfig\n{\n    LensConfig()\n      : Eqn(Distortion_CatmullRom10)\n      //K()\n      , MaxR(0.0f)\n      , MetersPerTanAngleAtCenter(0.0f)\n      //ChromaticAberration()\n      //InvK()\n      , MaxInvR(0.0f)\n    {\n        memset(&K, 0, sizeof(K));\n        memset(&ChromaticAberration, 0, sizeof(ChromaticAberration));\n        memset(&InvK, 0, sizeof(InvK));\n    }\n    \n    // The result is a scaling applied to the distance from the center of the lens.\n    float    DistortionFnScaleRadiusSquared (float rsq) const;\n    // x,y,z components map to r,g,b scales.\n    Vector3f DistortionFnScaleRadiusSquaredChroma (float rsq) const;\n\n    // DistortionFn applies distortion to the argument.\n    // Input: the distance in TanAngle/NIC space from the optical center to the input pixel.\n    // Output: the resulting distance after distortion.\n    float DistortionFn(float r) const\n    {\n        return r * DistortionFnScaleRadiusSquared ( r * r );\n    }\n\n    // DistortionFnInverse computes the inverse of the distortion function on an argument.\n    float DistortionFnInverse(float r) const;\n\n    // Also computes the inverse, but using a polynomial approximation. Warning - it's just an approximation!\n    float DistortionFnInverseApprox(float r) const;\n    // Sets up InvK[].\n    void SetUpInverseApprox();\n\n    // Sets a bunch of sensible defaults.\n    void SetToIdentity();\n\n\n\n    enum { NumCoefficients = 11 };\n\n    DistortionEqnType   Eqn;\n    float               K[NumCoefficients];\n    float               MaxR;       // The highest R you're going to query for - the curve is unpredictable beyond it.\n\n    float               MetersPerTanAngleAtCenter;\n\n    // Additional per-channel scaling is applied after distortion:\n    //  Index [0] - Red channel constant coefficient.\n    //  Index [1] - Red channel r^2 coefficient.\n    //  Index [2] - Blue channel constant coefficient.\n    //  Index [3] - Blue channel r^2 coefficient.\n    float               ChromaticAberration[4];\n\n    float               InvK[NumCoefficients];\n    float               MaxInvR;\n};\n\n\n// For internal use - storing and loading lens config data\n\n// Returns true on success.\nbool LoadLensConfig ( LensConfig *presult, uint8_t const *pbuffer, int bufferSizeInBytes );\n\n// Returns number of bytes needed.\nint SaveLensConfigSizeInBytes ( LensConfig const &config );\n// Returns true on success.\nbool SaveLensConfig ( uint8_t *pbuffer, int bufferSizeInBytes, LensConfig const &config );\n\n\n//-----------------------------------------------------------------------------------\n// ***** DistortionRenderDesc\n\n// This describes distortion for a single eye in an HMD with a display, not just the lens by itself.\nstruct DistortionRenderDesc\n{\n    // The raw lens values.\n    LensConfig          Lens;\n\n    // These map from [-1,1] across the eye being rendered into TanEyeAngle space (but still distorted)\n    Vector2f            LensCenter;\n    Vector2f            TanEyeAngleScale;\n    // Computed from device characteristics, IPD and eye-relief.\n    // (not directly used for rendering, but very useful)\n    Vector2f            PixelsPerTanAngleAtCenter;\n};\n\n\n//-------------------------------------------------------------------------------------\n// ***** HMDInfo \n\n// This structure describes various aspects of the HMD allowing us to configure rendering.\n//\n//  Currently included data:\n//   - Physical screen dimensions, resolution, and eye distances.\n//     (some of these will be configurable with a tool in the future).\n//     These arguments allow us to properly setup projection across HMDs.\n//   - DisplayDeviceName for identifying HMD screen; system-specific interpretation.\n//\n// TBD:\n//  - Power on/ off?\n//  - Sensor rates and capabilities\n//  - Distortion radius/variables    \n//  - Screen update frequency\n//  - Distortion needed flag\n//  - Update modes:\n//      Set update mode: Stereo (both sides together), mono (same in both eyes),\n//                       Alternating, Alternating scan-lines.\n\n// Oculus VR Display Driver Shim Information\nstruct ExtraMonitorInfo\n{\n\tint DeviceNumber;\n\tint NativeWidth;\n\tint NativeHeight;\n\tint Rotation;\n\tint UseMirroring;\n\n\tExtraMonitorInfo() :\n\t\tDeviceNumber(0),\n\t\tNativeWidth(1920),\n\t\tNativeHeight(1080),\n\t\tRotation(0),\n\t\tUseMirroring(1)\n\t{\n\t}\n};\n\nclass HMDInfo\n{\npublic:\n\t// Name string describing the product: \"Oculus Rift DK1\", etc.\n\tString      ProductName;\n\tString      Manufacturer;\n\n\tunsigned    Version;\n\n\t// Characteristics of the HMD screen and enclosure\n\tHmdTypeEnum HmdType;\n    bool        DebugDevice;                    // Indicates if the HMD is a virtual debug device, such as when there is no HMD present.\n\tSize<int>   ResolutionInPixels;\n\tSize<float> ScreenSizeInMeters;\n\tfloat       ScreenGapSizeInMeters;\n\tfloat       CenterFromTopInMeters;\n\tfloat       LensSeparationInMeters;\n    Vector2f    PelOffsetR;                     // Offsets from the green pel in pixels (i.e. usual values are 0.5 or 0.333)\n    Vector2f    PelOffsetB;\n\n\t// Timing & shutter data. All values in seconds.\n\tstruct ShutterInfo\n\t{\n\t\tHmdShutterTypeEnum  Type;\n\t\tfloat   VsyncToNextVsync;                // 1/framerate\n\t\tfloat   VsyncToFirstScanline;            // for global shutter, vsync->shutter open.\n\t\tfloat   FirstScanlineToLastScanline;     // for global shutter, will be zero.\n\t\tfloat   PixelSettleTime;                 // estimated.\n\t\tfloat   PixelPersistence;                // Full persistence = 1/framerate.\n\t}           Shutter;\n\n\t// Desktop coordinate position of the screen (can be negative; may not be present on all platforms)\n\tint         DesktopX;\n\tint         DesktopY;\n\n\t// Windows:\n\t// \"\\\\\\\\.\\\\DISPLAY3\", etc. Can be used in EnumDisplaySettings/CreateDC.\n\tString      DisplayDeviceName;\n\tExtraMonitorInfo ShimInfo;\n\n\t// MacOS:\n\tint         DisplayId;\n\n\tbool\t    InCompatibilityMode;\n\n\t// Printed serial number for the HMD; should match external sticker\n    String      PrintedSerial;\n\n    // Tracker descriptor information:\n    int         VendorId;\n    int         ProductId;\n    int         FirmwareMajor;\n    int         FirmwareMinor;\n\n    float   CameraFrustumHFovInRadians;\n    float   CameraFrustumVFovInRadians;\n    float   CameraFrustumNearZInMeters;\n    float   CameraFrustumFarZInMeters;\n\n\t// Constructor initializes all values to 0s.\n\t// To create a \"virtualized\" HMDInfo, use CreateDebugHMDInfo instead.\n\tHMDInfo() :\n\t\tProductName(),\n        Manufacturer(),\n        Version(0),\n\t\tHmdType(HmdType_None),\n        DebugDevice(false),\n\t\tResolutionInPixels(0),\n\t\tScreenSizeInMeters(0.0f),\n\t\tScreenGapSizeInMeters(0.0f),\n\t\tCenterFromTopInMeters(0),\n\t\tLensSeparationInMeters(0),\n        PelOffsetR(0.0f,0.0f),\n        PelOffsetB(0.0f,0.0f),\n      //Shutter (initialized below)\n\t\tDesktopX(0),\n\t\tDesktopY(0),\n        DisplayDeviceName(),\n        ShimInfo(),\n\t\tDisplayId(-1),\n\t\tInCompatibilityMode(false),\n        PrintedSerial(),\n        VendorId(-1),\n        ProductId(-1),\n        FirmwareMajor(-1),\n        FirmwareMinor(-1),\n        CameraFrustumHFovInRadians(0.0f),\n        CameraFrustumVFovInRadians(0.0f),\n        CameraFrustumNearZInMeters(0.0f),\n        CameraFrustumFarZInMeters(0.0f)\n\t{\n\t\tShutter.Type = HmdShutter_LAST;\n\t\tShutter.VsyncToNextVsync = 0.0f;\n\t\tShutter.VsyncToFirstScanline = 0.0f;\n\t\tShutter.FirstScanlineToLastScanline = 0.0f;\n\t\tShutter.PixelSettleTime = 0.0f;\n\t\tShutter.PixelPersistence = 0.0f;\n    }\n\n\t// Operator = copies local fields only (base class must be correct already)\n\tvoid operator=(const HMDInfo& src)\n\t{\n\t\tProductName = src.ProductName;\n\t\tManufacturer = src.Manufacturer;\n\t\tVersion = src.Version;\n\t\tHmdType = src.HmdType;\n        DebugDevice = src.DebugDevice;\n\t\tResolutionInPixels = src.ResolutionInPixels;\n\t\tScreenSizeInMeters = src.ScreenSizeInMeters;\n\t\tScreenGapSizeInMeters = src.ScreenGapSizeInMeters;\n\t\tCenterFromTopInMeters = src.CenterFromTopInMeters;\n\t\tLensSeparationInMeters = src.LensSeparationInMeters;\n        PelOffsetR = src.PelOffsetR;\n        PelOffsetB = src.PelOffsetB;\n\t\tDesktopX = src.DesktopX;\n\t\tDesktopY = src.DesktopY;\n\t\tShutter = src.Shutter;\n\t\tDisplayDeviceName = src.DisplayDeviceName;\n\t\tShimInfo = src.ShimInfo;\n\t\tDisplayId = src.DisplayId;\n\t\tInCompatibilityMode = src.InCompatibilityMode;\n        VendorId = src.VendorId;\n        ProductId = src.ProductId;\n        FirmwareMajor = src.FirmwareMajor;\n        FirmwareMinor = src.FirmwareMinor;\n        PrintedSerial = src.PrintedSerial;\n        CameraFrustumHFovInRadians = src.CameraFrustumHFovInRadians;\n        CameraFrustumVFovInRadians = src.CameraFrustumVFovInRadians;\n        CameraFrustumNearZInMeters = src.CameraFrustumNearZInMeters;\n        CameraFrustumFarZInMeters = src.CameraFrustumFarZInMeters;\n    }\n\n\tvoid SetScreenParameters(int hres, int vres,\n\t\t\t\t\t\t\t float hsize, float vsize,\n\t\t\t\t\t\t\t float vCenterFromTopInMeters, float lensSeparationInMeters,\n\t\t\t\t\t\t\t bool compatibilityMode)\n\t{\n\t\tResolutionInPixels = Sizei(hres, vres);\n\t\tScreenSizeInMeters = Sizef(hsize, vsize);\n\t\tCenterFromTopInMeters = vCenterFromTopInMeters;\n\t\tLensSeparationInMeters = lensSeparationInMeters;\n\t\tInCompatibilityMode = compatibilityMode;\n\t}\n\n\tbool IsSameDisplay(const HMDInfo& o) const\n\t{\n\t\treturn DisplayId == o.DisplayId &&\n\t\t\tDisplayDeviceName.CompareNoCase(o.DisplayDeviceName) == 0;\n\t}\n\n\tstatic bool CreateFromSensorAndDisplay(SensorDevice* sensor, Display* display, HMDInfo* hmdi);\n};\n\n\n//-----------------------------------------------------------------------------------\n// ***** HmdRenderInfo\n\n// All the parts of the HMD info that are needed to set up the rendering system.\n\nstruct HmdRenderInfo\n{\n    // The start of this structure is intentionally very similar to HMDInfo in OVER_Device.h\n    // However to reduce interdependencies, one does not simply #include the other.\n\n    HmdTypeEnum HmdType;\n\n    // Size of the entire screen\n    Size<int>   ResolutionInPixels;\n    Size<float> ScreenSizeInMeters;\n    float       ScreenGapSizeInMeters;\n    Vector2f    PelOffsetR;                     // Offsets from the green pel in pixels (i.e. usual values are 0.5 or 0.333)\n    Vector2f    PelOffsetB;\n\n    // Display is rotated 0/90/180/270 degrees counter-clockwise?\n    int         Rotation;\n\n    // Some displays scan out in different directions, so this flag can be used to change\n    // where we render the latency test pixel.\n    bool        OffsetLatencyTester;\n\n    // Characteristics of the lenses.\n    float       CenterFromTopInMeters;\n    float       LensSeparationInMeters;\n    float       LensDiameterInMeters;\n    float       LensSurfaceToMidplateInMeters;\n    EyeCupType  EyeCups;\n\n    // Timing & shutter data. All values in seconds.\n    struct ShutterInfo\n    {\n        HmdShutterTypeEnum  Type;\n        float               VsyncToNextVsync;                // 1/framerate\n        float               VsyncToFirstScanline;            // for global shutter, vsync->shutter open.\n        float               FirstScanlineToLastScanline;     // for global shutter, will be zero.\n        float               PixelSettleTime;                 // estimated.\n        float               PixelPersistence;                // Full persistence = 1/framerate.\n    } Shutter;\n\n\n    // These are all set from the user's profile.\n    struct EyeConfig\n    {\n        // Distance from center of eyeball to front plane of lens.\n        float               ReliefInMeters;\n        // Distance from nose (technically, center of Rift) to the middle of the eye.\n        float               NoseToPupilInMeters;\n\n        LensConfig          Distortion;\n    } EyeLeft, EyeRight;\n\n\n    HmdRenderInfo()\n    {\n        HmdType = HmdType_None;\n        ResolutionInPixels.w = 0;\n        ResolutionInPixels.h = 0;\n        ScreenSizeInMeters.w = 0.0f;\n        ScreenSizeInMeters.h = 0.0f;\n        ScreenGapSizeInMeters = 0.0f;\n        CenterFromTopInMeters = 0.0f;\n        LensSeparationInMeters = 0.0f;\n        LensDiameterInMeters = 0.0f;\n        LensSurfaceToMidplateInMeters = 0.0f;\n        PelOffsetR = Vector2f ( 0.0f, 0.0f );\n        PelOffsetB = Vector2f ( 0.0f, 0.0f );\n        Rotation = 0;\n        OffsetLatencyTester = false;\n        Shutter.Type = HmdShutter_LAST;\n        Shutter.VsyncToNextVsync = 0.0f;\n        Shutter.VsyncToFirstScanline = 0.0f;\n        Shutter.FirstScanlineToLastScanline = 0.0f;\n        Shutter.PixelSettleTime = 0.0f;\n        Shutter.PixelPersistence = 0.0f;\n        EyeCups = EyeCup_DK1A;\n        EyeLeft.ReliefInMeters = 0.0f;\n        EyeLeft.NoseToPupilInMeters = 0.0f;\n        EyeLeft.Distortion.SetToIdentity();\n        EyeRight = EyeLeft;\n    }\n\n    // The \"center eye\" is the position the HMD tracking returns,\n    // and games will also usually use it for audio, aiming reticles, some line-of-sight tests, etc.\n    EyeConfig GetEyeCenter() const\n    {\n        EyeConfig result;\n        result.ReliefInMeters = 0.5f * ( EyeLeft.ReliefInMeters + EyeRight.ReliefInMeters );\n        result.NoseToPupilInMeters = 0.0f;\n        result.Distortion.SetToIdentity();\n        return result;\n    }\n\n};\n\n\n//-----------------------------------------------------------------------------\n// ProfileRenderInfo\n//\n// Render-related information from the user profile.\nstruct ProfileRenderInfo\n{\n    // Type of eye cup on the headset\n    // ie. \"A\", \"Orange A\"\n    String EyeCupType;\n\n    // IPD/2 offset for each eye\n    float Eye2Nose[2];\n\n    // Eye to plate distance for each eye\n    float Eye2Plate[2];\n\n    // Eye relief dial\n    int EyeReliefDial;\n\n\n    ProfileRenderInfo();\n};\n\n\n//-----------------------------------------------------------------------------------\n\n// Stateless computation functions, in somewhat recommended execution order.\n// For examples on how to use many of them, see the StereoConfig::UpdateComputedState function.\n\nconst float OVR_DEFAULT_EXTRA_EYE_ROTATION = 30.0f * MATH_FLOAT_DEGREETORADFACTOR;\n\n// Creates a dummy debug HMDInfo matching a particular HMD model.\n// Useful for development without an actual HMD attached.\nHMDInfo             CreateDebugHMDInfo(HmdTypeEnum hmdType);\n\n// Fills in a render info object from a user Profile object.\n// It may need to fill in some defaults, so it also takes in the HMD type.\nProfileRenderInfo   GenerateProfileRenderInfoFromProfile( HMDInfo const& hmdInfo,\n                                                          Profile const* profile );\n\n// profile may be NULL, in which case it uses the hard-coded defaults.\n// distortionType should be left at the default unless you require something specific for your distortion shaders.\n// eyeCupOverride can be EyeCup_LAST, in which case it uses the one in the profile.\nHmdRenderInfo       GenerateHmdRenderInfoFromHmdInfo ( HMDInfo const &hmdInfo,\n                                                       ProfileRenderInfo const& profileRenderInfo,\n                                                       DistortionEqnType distortionType = Distortion_CatmullRom10,\n                                                       EyeCupType eyeCupOverride = EyeCup_LAST );\n\nLensConfig          GenerateLensConfigFromEyeRelief ( float eyeReliefInMeters, HmdRenderInfo const &hmd,\n                                                      DistortionEqnType distortionType = Distortion_CatmullRom10 );\n\nDistortionRenderDesc CalculateDistortionRenderDesc ( StereoEye eyeType, HmdRenderInfo const &hmd,\n                                                     LensConfig const *pLensOverride = NULL );\n\nFovPort             CalculateFovFromEyePosition ( float eyeReliefInMeters,\n                                                  float offsetToRightInMeters,\n                                                  float offsetDownwardsInMeters,\n                                                  float lensDiameterInMeters,\n                                                  float extraEyeRotationInRadians = OVR_DEFAULT_EXTRA_EYE_ROTATION);\n\nFovPort             CalculateFovFromHmdInfo ( StereoEye eyeType,\n                                              DistortionRenderDesc const &distortion,\n                                              HmdRenderInfo const &hmd,\n                                              float extraEyeRotationInRadians = OVR_DEFAULT_EXTRA_EYE_ROTATION );\n\nFovPort             GetPhysicalScreenFov ( StereoEye eyeType, DistortionRenderDesc const &distortion );\n\nFovPort             ClampToPhysicalScreenFov ( StereoEye eyeType, DistortionRenderDesc const &distortion,\n                                               FovPort inputFovPort );\n\nSizei               CalculateIdealPixelSize ( StereoEye eyeType, DistortionRenderDesc const &distortion,\n                                              FovPort fov, float pixelsPerDisplayPixel );\n\nRecti               GetFramebufferViewport ( StereoEye eyeType, HmdRenderInfo const &hmd );\n\nScaleAndOffset2D    CreateUVScaleAndOffsetfromNDCScaleandOffset ( ScaleAndOffset2D scaleAndOffsetNDC,\n                                                                  Recti renderedViewport,\n                                                                  Sizei renderTargetSize );\n\n\n//-----------------------------------------------------------------------------------\n// ***** StereoEyeParams\n\n// StereoEyeParams describes RenderDevice configuration needed to render\n// the scene for one eye. \nstruct StereoEyeParams\n{\n    StereoEye               Eye;\n    Matrix4f                HmdToEyeViewOffset;         // Translation to be applied to view matrix.\n\n    // Distortion and the VP on the physical display - the thing to run the distortion shader on.\n    DistortionRenderDesc    Distortion;\n    Recti                   DistortionViewport;\n\n    // Projection and VP of a particular view (you could have multiple of these).\n    Recti                   RenderedViewport;       // Viewport that we render the standard scene to.\n    FovPort                 Fov;                    // The FOVs of this scene.\n    Matrix4f                RenderedProjection;     // Projection matrix used with this eye.\n    ScaleAndOffset2D        EyeToSourceNDC;         // Mapping from TanEyeAngle space to [-1,+1] on the rendered image.\n    ScaleAndOffset2D        EyeToSourceUV;          // Mapping from TanEyeAngle space to actual texture UV coords.\n};\n\n\n//-----------------------------------------------------------------------------------\n// A set of \"forward-mapping\" functions, mapping from framebuffer space to real-world and/or texture space.\nVector2f TransformScreenNDCToTanFovSpace ( DistortionRenderDesc const &distortion,\n                                           const Vector2f &framebufferNDC );\nvoid TransformScreenNDCToTanFovSpaceChroma ( Vector2f *resultR, Vector2f *resultG, Vector2f *resultB, \n                                             DistortionRenderDesc const &distortion,\n                                             const Vector2f &framebufferNDC );\nVector2f TransformTanFovSpaceToRendertargetTexUV ( ScaleAndOffset2D const &eyeToSourceUV,\n                                                   Vector2f const &tanEyeAngle );\nVector2f TransformTanFovSpaceToRendertargetNDC ( ScaleAndOffset2D const &eyeToSourceNDC,\n                                                 Vector2f const &tanEyeAngle );\nVector2f TransformScreenPixelToScreenNDC( Recti const &distortionViewport,\n                                          Vector2f const &pixel );\nVector2f TransformScreenPixelToTanFovSpace ( Recti const &distortionViewport,\n                                             DistortionRenderDesc const &distortion,\n                                             Vector2f const &pixel );\nVector2f TransformScreenNDCToRendertargetTexUV( DistortionRenderDesc const &distortion,\n                                                StereoEyeParams const &eyeParams,\n                                                Vector2f const &pixel );\nVector2f TransformScreenPixelToRendertargetTexUV( Recti const &distortionViewport,\n                                                  DistortionRenderDesc const &distortion,\n                                                  StereoEyeParams const &eyeParams,\n                                                  Vector2f const &pixel );\n\n// A set of \"reverse-mapping\" functions, mapping from real-world and/or texture space back to the framebuffer.\n// Be aware that many of these are significantly slower than their forward-mapping counterparts.\nVector2f TransformTanFovSpaceToScreenNDC( DistortionRenderDesc const &distortion,\n                                          const Vector2f &tanEyeAngle, bool usePolyApprox = false );\nVector2f TransformRendertargetNDCToTanFovSpace( const ScaleAndOffset2D &eyeToSourceNDC,\n                                                const Vector2f &textureNDC );\n\n// Handy wrappers.\ninline Vector2f TransformTanFovSpaceToRendertargetTexUV ( StereoEyeParams const &eyeParams,\n                                                          Vector2f const &tanEyeAngle )\n{\n    return TransformTanFovSpaceToRendertargetTexUV ( eyeParams.EyeToSourceUV, tanEyeAngle );\n}\ninline Vector2f TransformTanFovSpaceToRendertargetNDC ( StereoEyeParams const &eyeParams,\n                                                        Vector2f const &tanEyeAngle )\n{\n    return TransformTanFovSpaceToRendertargetNDC ( eyeParams.EyeToSourceNDC, tanEyeAngle );\n}\n\n\n//-----------------------------------------------------------------------------\n// CalculateOrientationTimewarpMatrix\n//\n// For Orientation-only Timewarp, the inputs are quaternions and the output is\n// a transform matrix.  The matrix may need to be transposed depending on which\n// renderer is used.  This function produces one compatible with D3D11.\n//\n// eye: Input quaternion of EyeRenderPose.Orientation inverted.\n// pred: Input quaternion of predicted eye pose at scanout.\n// M: Output D3D11-compatible transform matrix for the Timewarp shader.\nvoid CalculateOrientationTimewarpMatrix(Quatf const & eye, Quatf const & pred, Matrix4f& M);\n\n//-----------------------------------------------------------------------------\n// CalculatePositionalTimewarpMatrix\n//\n// The matrix may need to be transposed depending on which\n// renderer is used.  This function produces one compatible with D3D11.\n//\n// renderFromEyeInverted: Input render transform from eye inverted.\n// hmdPose: Input predicted head pose from HMD tracking code.\n// extraEyeOffset: Input extra eye position offset applied to calculations.\n// M: Output D3D11-compatible transform matrix for the Timewarp shader.\nvoid CalculatePositionalTimewarpMatrix(Posef const & renderFromEyeInverted, Posef const & hmdPose,\n                                       Vector3f const & extraEyeOffset, Matrix4f& M);\n\n//-----------------------------------------------------------------------------\n// CalculateTimewarpFromSensors\n//\n// Read current pose from sensors and construct timewarp matrices for start/end\n// predicted poses.\n//\n// hmdPose: RenderPose eye quaternion, *not* inverted.\n// reader: the tracking state\n// poseInFaceSpace: true if the pose supplied is stuck-to-your-face rather than fixed-in-place\n// calcPosition: true if the position part of the result is actually used (false = orientation only)\n// hmdToEyeViewOffset: offset from the HMD \"middle eye\" to actual eye.\n// startEndTimes: start and end times of the screen - typically fed direct from Timing->GetTimewarpTiming()->EyeStartEndTimes[eyeNum]\n//\n// Results:\n// startEndMatrices: Timewarp matrices for the start and end times respectively.\n// timewarpIMUTime: On success it contains the raw IMU sample time for the pose.\n// Returns false on failure to read state.\nbool CalculateTimewarpFromSensors(Posef const & hmdPose,\n                                  Vision::TrackingStateReader* reader,\n                                  bool poseInFaceSpace,\n                                  bool calcPosition, \n                                  ovrVector3f const &hmdToEyeViewOffset,\n                                  const double startEndTimes[2],\n                                  Matrix4f startEndMatrices[2],\n                                  double& timewarpIMUTime);\n\n// Orientation-only version.\nbool CalculateOrientationTimewarpFromSensors(Quatf const & eyeQuat,\n                                             Vision::TrackingStateReader* reader,\n                                             const double startEndTimes[2], Matrix4f startEndMatrices[2],\n                                             double& timewarpIMUTime);\n\n//-----------------------------------------------------------------------------\n// CalculateEyeTimewarpTimes\n//\n// Given the scanout start time, duration of scanout, and shutter type, this\n// function returns the timewarp left/right eye start and end prediction times.\nvoid CalculateEyeTimewarpTimes(double scanoutStartTime, double scanoutDuration,\n                               HmdShutterTypeEnum shutterType,\n                               double leftEyeStartEndTime[2], double rightEyeStartEndTime[2]);\n\n//-----------------------------------------------------------------------------\n// CalculateEyeRenderTimes\n//\n// Given the scanout start time, duration of scanout, and shutter type, this\n// function returns the left/right eye render times.\nvoid CalculateEyeRenderTimes(double scanoutStartTime, double scanoutDuration,\n                             HmdShutterTypeEnum shutterType,\n                             double& leftEyeRenderTime, double& rightEyeRenderTime);\n\n\n//-----------------------------------------------------------------------------\n// CalculateDistortionMeshFromFOV\n//\n// This function fills in the target meshData object given the provided\n// parameters, for a single specified eye.\n//\n// Returns false on failure.\nbool CalculateDistortionMeshFromFOV(HmdRenderInfo const & renderInfo,\n                                    DistortionRenderDesc const & distortionDesc,\n                                    StereoEye stereoEye, FovPort fov,\n                                    unsigned distortionCaps,\n                                    ovrDistortionMesh *meshData);\n\n\n} //namespace OVR\n\n#endif // OVR_Stereo_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Sensors/OVR_DeviceConstants.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_DeviceConstants.h\nContent     :   Device constants\nCreated     :   February 5, 2013\nAuthors     :   Lee Cooper\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_DeviceConstants_h\n#define OVR_DeviceConstants_h\n\n#include \"Kernel/OVR_Types.h\"\n#include \"Extras/OVR_Math.h\"\n\n\n// CAPI forward declarations.\nstruct ovrSensorData_;\ntypedef struct ovrSensorData_ ovrSensorData;\n\nnamespace OVR {\n\n\n//-------------------------------------------------------------------------------------\n// Different device types supported by OVR; this type is reported by DeviceBase::GetType.\n// \nenum DeviceType\n{\n    Device_None,\n    Device_Manager,\n    Device_Sensor,\n    Device_LatencyTester,\n    Device_BootLoader,\n    Device_All              = 0xFF // Set for enumeration only, to enumerate all device types.\n};\n\n\n\n//-------------------------------------------------------------------------------------\n// Different lens distortion types supported by devices.\n// \nenum DistortionEqnType\n{\n    Distortion_No_Override  = -1,    \n\t// These two are leagcy and deprecated.\n    Distortion_Poly4        = 0,    // scale = (K0 + K1*r^2 + K2*r^4 + K3*r^6)\n    Distortion_RecipPoly4   = 1,    // scale = 1/(K0 + K1*r^2 + K2*r^4 + K3*r^6)\n\n    // CatmullRom10 is the preferred distortion format.\n    Distortion_CatmullRom10 = 2,    // scale = Catmull-Rom spline through points (1.0, K[1]...K[9])\n\n    Distortion_LAST                 // For ease of enumeration.\n};\n\n\n//-------------------------------------------------------------------------------------\n// HMD types.\n// We use ordinal comparison on the enums often, so the list should be in chronological/capabilities order\n//\nenum HmdTypeEnum\n{\n    HmdType_None,\n\n    HmdType_DKProto,            // First duct-tape model, never sold.\n    HmdType_DK1,                // DevKit1 - on sale to developers.\n    HmdType_DKHDProto,          // DKHD - shown at various shows, never sold.\n    HmdType_DKHD2Proto,         // DKHD2, 5.85-inch panel, never sold.\n    HmdType_DKHDProto566Mi,     // DKHD, 5.66-inch panel, never sold.\n    HmdType_CrystalCoveProto,   // Crystal Cove, 5.66-inch panel, shown at shows but never sold.\n    HmdType_DK2,\n    HmdType_BlackStar,          // Prototype for E3 2014\n    HmdType_CB,                 // EVT Prototypes for Oculus Connect\n\n    // Reminder - this header file is public - codenames only!\n\n    HmdType_Unknown,            // Used for unnamed HW lab experiments.\n\n    HmdType_LAST\n};\n\n\n//-------------------------------------------------------------------------------------\n// HMD shutter types.\n//\nenum HmdShutterTypeEnum\n{\n    HmdShutter_Global,\n    HmdShutter_RollingTopToBottom,\n    HmdShutter_RollingLeftToRight,\n    HmdShutter_RollingRightToLeft,\n\n    HmdShutter_LAST\n};\n\n\n\n//-------------------------------------------------------------------------------------\n// For headsets that use eye cups\n//\nenum EyeCupType\n{\n    // Public lenses\n    EyeCup_DK1A = 0,\n    EyeCup_DK1B = 1,\n    EyeCup_DK1C = 2,\n\n    EyeCup_DK2A = 3,\n\n    // Internal R&D codenames.\n    // Reminder - this header file is public - codenames only!\n    EyeCup_DKHD2A,\n    EyeCup_OrangeA,\n    EyeCup_RedA,\n    EyeCup_PinkA,\n    EyeCup_BlueA,\n    EyeCup_Delilah1A,\n    EyeCup_Delilah2A,\n    EyeCup_JamesA,\n    EyeCup_SunMandalaA,\n    EyeCup_BlackStar,\n    EyeCup_EVTProto,\n\n    EyeCup_LAST\n};\n\n\n//-----------------------------------------------------------------------------\n// BodyFrameState\n//\n#pragma pack(push, 8)\n\nclass SensorDataType\n{\npublic:\n    SensorDataType() : Temperature(0.0f), AbsoluteTimeSeconds(0.0) { }\n\n    // C-interop support\n    SensorDataType(const ovrSensorData& s);\n    operator ovrSensorData () const;\n\n    Vector3f Acceleration;     // in m/s^2\n    Vector3f RotationRate;     // in rad/s\n    Vector3f MagneticField;    // in Gauss\n\n    float    Temperature;      // in degrees Celsius\n\n    // The absolute time from the host computers perspective that the message should be\n    // interpreted as. This is based on incoming timestamp and processed by a filter\n    // that syncs the clocks while attempting to keep the distance between messages\n    // device clock matching.\n    //\n    // Integration should use TimeDelta, but prediction into the future should derive\n    // the delta time from PredictToSeconds - AbsoluteTimeSeconds.\n    //\n    // This value will generally be <= the return from a call to ovr_GetTimeInSeconds(),\n    // but could be greater by under 1 ms due to system time update interrupt delays.\n    //\n    double   AbsoluteTimeSeconds;\n};\n\nstatic_assert((sizeof(SensorDataType) == 3*sizeof(Vector3f) + sizeof(float) + sizeof(double)), \"sizeof(SensorDataType) failure\");\n\n\n\n\n#pragma pack(pop)\n\n\n} // namespace OVR\n\n#endif\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Service/Service_NetClient.cpp",
    "content": "/************************************************************************************\n\nFilename    :   Service_NetClient.cpp\nContent     :   Client for service interface\nCreated     :   June 12, 2014\nAuthors     :   Michael Antonov, Kevin Jenkins, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"Service_NetClient.h\"\n#include \"Net/OVR_MessageIDTypes.h\"\n\n#if defined (OVR_OS_MAC) || defined(OVR_OS_LINUX)\n#define GetCurrentProcessId getpid\n#endif\n\nOVR_DEFINE_SINGLETON(OVR::Service::NetClient);\n\nnamespace OVR { namespace Service {\n\nusing namespace OVR::Net;\n\n\n// Default connection timeout in milliseconds.\nstatic const int kDefaultConnectionTimeoutMS = 5000; // Timeout in Milliseconds\n\n\n//// NetClient\n\nNetClient::NetClient() :\n    LatencyTesterAvailable(false), HMDCount(-1), EdgeTriggeredHMDCount(false)\n{\n    SetDefaultParameters();\n\n    GetSession()->AddSessionListener(this);\n\n    // Register RPC functions\n    registerRPC();\n\n    Start();\n\n    // Must be at end of function\n    PushDestroyCallbacks();\n}\n\nNetClient::~NetClient()\n{\n}\n\nvoid NetClient::OnSystemDestroy()\n{\n    onSystemDestroy();\n}\n\nvoid NetClient::OnThreadDestroy()\n{\n    onThreadDestroy();\n}\n\nvoid NetClient::SetDefaultParameters()\n{\n    ServerOptional      = false;\n    ExtraDebugging      = false;\n    ConnectionTimeoutMS = kDefaultConnectionTimeoutMS;\n}\n\nvoid NetClient::ApplyParameters(ovrInitParams const* params)\n{\n    SetDefaultParameters();\n\n    // If connection timeout is specified,\n    if (params->ConnectionTimeoutMS > 0)\n    {\n        ConnectionTimeoutMS = params->ConnectionTimeoutMS;\n    }\n\n    ServerOptional = (params->Flags & ovrInit_ServerOptional) != 0;\n    ExtraDebugging = (params->Flags & ovrInit_Debug) != 0;\n}\n\nint NetClient::Run()\n{\n    SetThreadName(\"NetClient\");\n\n    while (!Terminated.load(std::memory_order_relaxed))\n    {\n        // There is no watchdog here because the watchdog is part of the private code.\n\n        GetSession()->Poll(false);\n\n        if (GetSession()->GetActiveSocketsCount() == 0)\n        {\n            Thread::MSleep(100);\n        }\n    }\n\n    return 0;\n}\n\nvoid NetClient::OnReceive(ReceivePayload* pPayload, ListenerReceiveResult* lrrOut)\n{\n    OVR_UNUSED(lrrOut);\n    OVR_UNUSED(pPayload);\n}\n\nvoid NetClient::OnDisconnected(Connection* conn)\n{\n    OVR_UNUSED(conn);\n\n    OVR_DEBUG_LOG((\"[NetClient] Disconnected\"));\n\n    EdgeTriggeredHMDCount = false;\n}\n\nvoid NetClient::OnConnected(Connection* conn)\n{\n    OVR_UNUSED(conn);\n\n    OVR_DEBUG_LOG((\"[NetClient] Connected to the server running SDK version \" \\\n        \"(prod=%d).%d.%d(req=%d).%d(build=%d), RPC version %d.%d.%d. \" \\\n        \"Client SDK version (prod=%d).%d.%d(req=%d).%d.(build=%d), RPC version=%d.%d.%d\",\n        conn->RemoteCodeVersion.ProductVersion,\n        conn->RemoteCodeVersion.MajorVersion,\n        conn->RemoteCodeVersion.MinorVersion,\n        conn->RemoteCodeVersion.RequestedMinorVersion,\n        conn->RemoteCodeVersion.PatchVersion,\n        conn->RemoteCodeVersion.BuildNumber,\n        conn->RemoteMajorVersion, conn->RemoteMinorVersion, conn->RemotePatchVersion,\n        OVR_PRODUCT_VERSION,\n        OVR_MAJOR_VERSION,\n        OVR_MINOR_VERSION,\n        RuntimeSDKVersion.RequestedMinorVersion,\n        OVR_PATCH_VERSION,\n        OVR_BUILD_NUMBER,\n        RPCVersion_Major, RPCVersion_Minor, RPCVersion_Patch));\n\n    EdgeTriggeredHMDCount = false;\n}\n\nbool NetClient::Connect(bool blocking)\n{\n    // If server is optional,\n    if (ServerOptional && !Session::IsSingleProcess())\n    {\n        blocking = false; // Poll: Do not block\n    }\n\n    // Set up bind parameters\n    OVR::Net::BerkleyBindParameters bbp;\n    bbp.Address = \"::1\"; // Bind to localhost only!\n    bbp.blockingTimeout = ConnectionTimeoutMS;\n    OVR::Net::SockAddr sa;\n    sa.Set(\"::1\", VRServicePort, SOCK_STREAM);\n\n    // Attempt to connect\n    OVR::Net::SessionResult result = GetSession()->ConnectPTCP(&bbp, &sa, blocking);\n\n    // Already connected counts as success too\n    return result == Net::SessionResult_OK ||\n           result == Net::SessionResult_AlreadyConnected ||\n           result == Net::SessionResult_ConnectInProgress;\n}\n\nvoid NetClient::Disconnect()\n{\n    GetSession()->Shutdown();\n}\n\nbool NetClient::IsConnected(bool attemptReconnect, bool blockOnReconnect)\n{\n    // If it was able to connect,\n    if (GetSession()->ConnectionSuccessful())\n    {\n        return true;\n    }\n    else if (attemptReconnect)\n    {\n        // Attempt to connect here\n        Connect(blockOnReconnect);\n\n        // If it connected,\n        if (GetSession()->ConnectionSuccessful())\n        {\n            return true;\n        }\n    }\n\n    // No connections\n    return false;\n}\n\nvoid NetClient::GetLocalProtocolVersion(int& major, int& minor, int& patch)\n{\n    major = RPCVersion_Major;\n    minor = RPCVersion_Minor;\n    patch = RPCVersion_Patch;\n}\n\nbool NetClient::GetRemoteProtocolVersion(int& major, int& minor, int& patch)\n{\n    Ptr<Connection> conn = GetSession()->GetConnectionAtIndex(0);\n\n    if (conn)\n    {\n        major = conn->RemoteMajorVersion;\n        minor = conn->RemoteMinorVersion;\n        patch = conn->RemotePatchVersion;\n        return true;\n    }\n\n    return false;\n}\n\nvoid NetClient::GetLocalSDKVersion(SDKVersion& requestedSDKVersion)\n{\n    requestedSDKVersion = RuntimeSDKVersion;\n}\n\nbool NetClient::GetRemoteSDKVersion(SDKVersion& remoteSDKVersion)\n{\n    Ptr<Connection> conn = GetSession()->GetConnectionAtIndex(0);\n\n    if (conn)\n    {\n        remoteSDKVersion = conn->RemoteCodeVersion;\n        return true;\n    }\n    \n    return false;\n}\n\n\n//// NetClient API\n\nconst char* NetClient::GetStringValue(VirtualHmdId hmd, const char* key, const char* default_val)\n{\n    // If a null value is provided,\n    if (!default_val)\n    {\n        default_val = \"\";\n    }\n\n    if (!IsConnected(true, true))\n    {\n        return default_val;\n    }\n\n    ProfileGetValue1_Str = default_val;\n\n    OVR::Net::BitStream bsOut, returnData;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n    bsOut.Write(default_val);\n    if (!GetRPC1()->CallBlocking(\"GetStringValue_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return default_val;\n    }\n    if (!returnData.Read(ProfileGetValue1_Str))\n    {\n        OVR_ASSERT(false); //This assert will hit if you tamper or restart the service mid-call.\n    }\n    return ProfileGetValue1_Str.ToCStr();\n}\nbool NetClient::GetBoolValue(VirtualHmdId hmd, const char* key, bool default_val)\n{\n    if (!IsConnected(true, true))\n    {\n        return default_val;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n    bsOut.Write(default_val);\n    if (!GetRPC1()->CallBlocking(\"GetBoolValue_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return default_val;\n    }\n    uint8_t out = 0;\n    if (!returnData.Read(out))\n    {\n        OVR_ASSERT(false); //This assert will hit if you tamper or restart the service mid-call.\n    }\n    return out != 0;\n}\nint NetClient::GetIntValue(VirtualHmdId hmd, const char* key, int default_val)\n{\n    if (!IsConnected(true, true))\n    {\n        return default_val;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n    bsOut.Write(default_val);\n    if (!GetRPC1()->CallBlocking(\"GetIntValue_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return default_val;\n    }\n    int32_t out = (int32_t)default_val;\n    if (!returnData.Read(out))\n    {\n        OVR_ASSERT(false); //This assert will hit if you tamper or restart the service mid-call.\n    }\n    return out;\n}\ndouble NetClient::GetNumberValue(VirtualHmdId hmd, const char* key, double default_val)\n{\n    if (!IsConnected(true, true))\n    {\n        return default_val;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n    bsOut.Write(default_val);\n    if (!GetRPC1()->CallBlocking(\"GetNumberValue_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return default_val;\n    }\n    double out = 0.;\n    if (!returnData.Read(out))\n    {\n        OVR_ASSERT(false); //This assert will hit if you tamper or restart the service mid-call.\n    }\n    return out;\n}\nint NetClient::GetNumberValues(VirtualHmdId hmd, const char* key, double* values, int num_vals)\n{\n    if (!IsConnected(true, true))\n    {\n        return 0;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n\n    int32_t w = (int32_t)num_vals;\n    bsOut.Write(w);\n\n    if (!GetRPC1()->CallBlocking(\"GetNumberValues_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return 0;\n    }\n\n    int32_t out = 0;\n    if (!returnData.Read(out))\n    {\n        OVR_ASSERT(false);\n    }\n    OVR_ASSERT(out >= 0 && out <= num_vals);\n    if (out < 0)\n    {\n        out = 0;\n    }\n    else if (out > num_vals)\n    {\n        out = num_vals;\n    }\n\n    for (int i = 0; i < out && i < num_vals; i++)\n    {\n        if (!returnData.Read(values[i]))\n        {\n            return i;\n        }\n    }\n\n    return out;\n}\n\nbool NetClient::SetStringValue(VirtualHmdId hmd, const char* key, const char* val)\n{\n    if (!IsConnected(true, true))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n\n    bsOut.Write(val);\n\n    if (!GetRPC1()->Signal(\"SetStringValue_1\", &bsOut, GetSession()->GetConnectionAtIndex(0)))\n    {\n        return false;\n    }\n\n    return true;\n}\n\nbool NetClient::SetBoolValue(VirtualHmdId hmd, const char* key, bool val)\n{\n    if (!IsConnected(true, true))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n\n    uint8_t b = val ? 1 : 0;\n    bsOut.Write(b);\n\n    if (!GetRPC1()->Signal(\"SetBoolValue_1\", &bsOut, GetSession()->GetConnectionAtIndex(0)))\n    {\n        return false;\n    }\n\n    return true;\n}\n\nbool NetClient::SetIntValue(VirtualHmdId hmd, const char* key, int val)\n{\n    if (!IsConnected(true, true))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n\n    int32_t w = (int32_t)val;\n    bsOut.Write(w);\n\n    if (!GetRPC1()->Signal(\"SetIntValue_1\", &bsOut, GetSession()->GetConnectionAtIndex(0)))\n    {\n        return false;\n    }\n\n    return true;\n}\n\nbool NetClient::SetNumberValue(VirtualHmdId hmd, const char* key, double val)\n{\n    if (!IsConnected(true, true))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n\n    bsOut.Write(val);\n\n    if (!GetRPC1()->Signal(\"SetNumberValue_1\", &bsOut, GetSession()->GetConnectionAtIndex(0)))\n    {\n        return false;\n    }\n\n    return true;\n}\n\nbool NetClient::SetNumberValues(VirtualHmdId hmd, const char* key, const double* vals, int num_vals)\n{\n    if (!IsConnected(true, true))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut;\n    bsOut.Write(hmd);\n    bsOut.Write(key);\n\n    int32_t w_count = (int32_t)num_vals;\n    bsOut.Write(w_count);\n\n    for (int i = 0; i < num_vals; i++)\n    {\n        bsOut.Write(vals[i]);\n    }\n\n    if (!GetRPC1()->Signal(\"SetNumberValues_1\", &bsOut, GetSession()->GetConnectionAtIndex(0)))\n    {\n        return false;\n    }\n\n    return true;\n}\n\nint NetClient::Hmd_Detect()\n{\n    if (!IsConnected(true, false))\n    {\n        return -1;\n    }\n\n    // If using edge-triggered HMD counting,\n    if (EdgeTriggeredHMDCount)\n    {\n        // Return the last update from the server\n        return HMDCount;\n    }\n\n    // Otherwise: We need to ask the first time\n\n    OVR::Net::BitStream bsOut, returnData;\n\n    if (!GetRPC1()->CallBlocking(\"Hmd_Detect_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return -1;\n    }\n\n    int32_t out = 0;\n    if (!returnData.Read(out))\n    {\n        OVR_ASSERT(false); //This assert will hit if you tamper or restart the service mid-call.\n    }\n    HMDCount = out;\n    EdgeTriggeredHMDCount = true;\n    return out;\n}\n\nbool NetClient::Hmd_Create(int index, HMDNetworkInfo* netInfo)\n{\n    if (!IsConnected(true, true))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n\n    int32_t w = (int32_t)index;\n    bsOut.Write(w);\n\n    // Need the Pid for driver mode\n    pid_t pid = GetCurrentProcessId();\n    bsOut.Write(pid);\n\n    if (!GetRPC1()->CallBlocking(\"Hmd_Create_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return false;\n    }\n\n    return netInfo->Serialize(&returnData, false);\n}\n\nbool NetClient::GetDriverMode(bool& driverInstalled, bool& compatMode, bool& hideDK1Mode)\n{\n    if (!IsConnected(true, true))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n\n    bsOut.Write(InvalidVirtualHmdId);\n\n    if (!GetRPC1()->CallBlocking(\"GetDriverMode_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return false;\n    }\n\n    int32_t w_driverInstalled = 0;\n    int32_t w_compatMode = 0;\n    int32_t w_hideDK1Mode = 0;\n    returnData.Read(w_driverInstalled);\n    returnData.Read(w_compatMode);\n    if (!returnData.Read(w_hideDK1Mode))\n    {\n        return false;\n    }\n\n    driverInstalled = w_driverInstalled != 0;\n    compatMode = w_compatMode != 0;\n    hideDK1Mode = w_hideDK1Mode != 0;\n    return true;\n}\n\nbool NetClient::SetDriverMode(bool compatMode, bool hideDK1Mode)\n{\n    if (!IsConnected(true, true))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n\n    bsOut.Write(InvalidVirtualHmdId);\n\n    int32_t w_compatMode, w_hideDK1Mode;\n    w_compatMode = compatMode ? 1 : 0;\n    w_hideDK1Mode = hideDK1Mode ? 1 : 0;\n    bsOut.Write(w_compatMode);\n    bsOut.Write(w_hideDK1Mode);\n\n    if (!GetRPC1()->CallBlocking(\"SetDriverMode_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return false;\n    }\n\n    int32_t out = 0;\n    if (!returnData.Read(out))\n    {\n        OVR_ASSERT(false);\n        return false;\n    }\n\n    return out != 0;\n}\n\nbool NetClient::Hmd_AttachToWindow(VirtualHmdId hmd, void* hWindow)\n{\n    if (!IsConnected(false, false))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut;\n    bsOut.Write(hmd);\n\n    uint64_t hWinWord = 0;\n    #ifdef OVR_OS_LINUX\n        if (hWindow == NULL)\n        {\n            return false;\n        }\n        hWinWord = *(uint64_t *)&hWindow;\n    #elif defined(OVR_OS_WIN32)\n        hWinWord = (UPInt)hWindow;\n    #else\n        OVR_UNUSED(hWindow);\n    #endif\n\n    bsOut.Write(hWinWord);\n\n    if (!GetRPC1()->CallBlocking(\"Hmd_AttachToWindow_1\", &bsOut, GetSession()->GetConnectionAtIndex(0)))\n    {\n        return false;\n    }\n\n    return true;\n}\n\nvoid NetClient::Hmd_Release(VirtualHmdId hmd)\n{\n    if (!IsConnected(false, false))\n    {\n        return;\n    }\n\n    OVR::Net::BitStream bsOut;\n    bsOut.Write(hmd);\n    bool result = GetRPC1()->CallBlocking(\"Hmd_Release_1\", &bsOut, GetSession()->GetConnectionAtIndex(0));\n    OVR_ASSERT_AND_UNUSED(result, result);\n}\n\nvoid NetClient::SetLastError(String str)\n{\n    Hmd_GetLastError_Str = str;\n}\n\n// Last string is cached locally.\nconst char* NetClient::Hmd_GetLastError(VirtualHmdId hmd)\n{\n    if (hmd == InvalidVirtualHmdId || !IsConnected(false, false))\n    {\n        return Hmd_GetLastError_Str.ToCStr();\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n    bsOut.Write(hmd);\n    if (!GetRPC1()->CallBlocking(\"Hmd_GetLastError_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return Hmd_GetLastError_Str.ToCStr();\n    }\n    if (!returnData.Read(Hmd_GetLastError_Str))\n    {\n        OVR_ASSERT(false);\n    }\n    return Hmd_GetLastError_Str.ToCStr();\n}\n\n\n// Fills in description about HMD; this is the same as filled in by ovrHmd_Create.\n// The actual descriptor is a par\nbool NetClient::Hmd_GetHmdInfo(VirtualHmdId hmd, HMDInfo* hmdInfo)\n{\n    if (!IsConnected(false, false))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n    bsOut.Write(hmd);\n    if (!GetRPC1()->CallBlocking(\"Hmd_GetHmdInfo_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return false;\n    }\n\n    return NetSessionCommon::SerializeHMDInfo(&returnData, hmdInfo, false);\n}\n\n\n//-------------------------------------------------------------------------------------\nunsigned int NetClient::Hmd_GetEnabledCaps(VirtualHmdId hmd)\n{\n    if (!IsConnected(false, false))\n    {\n        return 0;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n    bsOut.Write(hmd);\n    if (!GetRPC1()->CallBlocking(\"Hmd_GetEnabledCaps_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return 0;\n    }\n\n    uint32_t c = 0;\n    if (!returnData.Read(c))\n    {\n        OVR_ASSERT(false); //This assert will hit if you tamper or restart the service mid-call.\n    }\n    return c;\n}\n\n// Returns new caps after modification\nunsigned int NetClient::Hmd_SetEnabledCaps(VirtualHmdId hmd, unsigned int hmdCaps)\n{\n    if (!IsConnected(false, false))\n    {\n        return 0;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n    bsOut.Write(hmd);\n\n    uint32_t c = (uint32_t)hmdCaps;\n    bsOut.Write(c);\n\n    if (!GetRPC1()->CallBlocking(\"Hmd_SetEnabledCaps_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return 0;\n    }\n\n    c = 0;\n    if (!returnData.Read(c))\n    {\n        OVR_ASSERT(false); //This assert will hit if you tamper or restart the service mid-call.\n    }\n    return c;\n}\n\n\n//-------------------------------------------------------------------------------------\n// *** Tracking Setup\n\nbool NetClient::Hmd_ConfigureTracking(VirtualHmdId hmd, unsigned supportedCaps, unsigned requiredCaps)\n{\n    if (!IsConnected(false, false))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n    bsOut.Write(hmd);\n\n    uint32_t w_sc = supportedCaps;\n    bsOut.Write(w_sc);\n    uint32_t w_rc = requiredCaps;\n    bsOut.Write(w_rc);\n\n    if (!GetRPC1()->CallBlocking(\"Hmd_ConfigureTracking_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return false;\n    }\n\n    uint8_t b;\n    if (!returnData.Read(b))\n    {\n        OVR_ASSERT(false);\n    }\n\n    return b != 0;\n}\n\n\nvoid NetClient::Hmd_ResetTracking(VirtualHmdId hmd, bool visionReset)\n{\n    if (!IsConnected(false, false))\n    {\n        return;\n    }\n\n    OVR::Net::BitStream bsOut;\n    bsOut.Write(hmd);\n\n    int32_t w_visionReset;\n    w_visionReset = visionReset ? 1 : 0;\n    bsOut.Write(w_visionReset);\n\n    if (!GetRPC1()->CallBlocking(\"Hmd_ResetTracking_1\", &bsOut, GetSession()->GetConnectionAtIndex(0)))\n    {\n        return;\n    }\n}\n\nbool NetClient::LatencyUtil_ProcessInputs(double startTestSeconds, unsigned char rgbColorOut[3])\n{\n    if (!IsConnected(false, false))\n    {\n        return false;\n    }\n\n    if (!LatencyTesterAvailable)\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n    bsOut.Write(startTestSeconds);\n    if (!GetRPC1()->CallBlocking(\"LatencyUtil_ProcessInputs_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return false;\n    }\n\n    uint8_t u;\n    returnData.Read(u);\n    rgbColorOut[0] = u;\n    returnData.Read(u);\n    rgbColorOut[1] = u;\n    if (!returnData.Read(u))\n    {\n        return false;\n    }\n    rgbColorOut[2] = u;\n\n    return true;\n}\n\nconst char* NetClient::LatencyUtil_GetResultsString()\n{\n    if (!IsConnected(false, false))\n    {\n        return NULL;\n    }\n\n    OVR::Net::BitStream bsOut, returnData;\n    if (!GetRPC1()->CallBlocking(\"LatencyUtil_GetResultsString_1\", &bsOut, GetSession()->GetConnectionAtIndex(0), &returnData))\n    {\n        return NULL;\n    }\n\n    if (!returnData.Read(LatencyUtil_GetResultsString_Str))\n    {\n        OVR_ASSERT(false);\n    }\n\n    return LatencyUtil_GetResultsString_Str.ToCStr();\n}\n\nbool NetClient::ShutdownServer()\n{\n    if (!IsConnected(false, false))\n    {\n        return false;\n    }\n\n    OVR::Net::BitStream bsOut;\n    GetRPC1()->BroadcastSignal(\"Shutdown_1\", &bsOut);\n\n    return true;\n}\n\n\n//// Push Notifications:\n\nvoid NetClient::registerRPC()\n{\n#define RPC_REGISTER_SLOT(observerScope, functionName) \\\n    observerScope.SetHandler(OVR::Net::Plugins::RPCSlot::FromMember<NetClient, &NetClient::functionName>(this)); \\\n    pRPC->RegisterSlot(OVR_STRINGIZE(functionName), &observerScope);\n\n    // Register RPC functions:\n    RPC_REGISTER_SLOT(InitialServerStateScope, InitialServerState_1);\n    RPC_REGISTER_SLOT(LatencyTesterAvailableScope, LatencyTesterAvailable_1);\n    RPC_REGISTER_SLOT(DefaultLogOutputScope, DefaultLogOutput_1);\n    RPC_REGISTER_SLOT(HMDCountUpdateScope, HMDCountUpdate_1);\n}\n\nvoid NetClient::InitialServerState_1(BitStream* userData, ReceivePayload* pPayload)\n{\n    LatencyTesterAvailable_1(userData, pPayload);\n}\n\nvoid NetClient::LatencyTesterAvailable_1(BitStream* userData, ReceivePayload* pPayload)\n{\n    OVR_UNUSED(pPayload);\n\n    uint8_t b = 0;\n    if (!userData->Read(b))\n    {\n        OVR_ASSERT(false);\n        return;\n    }\n\n    LatencyTesterAvailable = (b != 0);\n}\n\nvoid NetClient::DefaultLogOutput_1(BitStream* userData, ReceivePayload* pPayload)\n{\n    OVR_UNUSED(pPayload);\n\n    String formattedText;\n    LogMessageType messageType = Log_Text; // Will normally be overwritten below.\n    userData->Read(messageType);\n    if (userData->Read(formattedText))\n    {\n        if (OVR::Log::GetGlobalLog())\n        {\n            OVR::String logStr = \"[From Service] \";\n            logStr.AppendString(formattedText);\n            OVR::Log::GetGlobalLog()->LogMessage(messageType, \"%s\", logStr.ToCStr());\n        }\n    }\n}\n\nvoid NetClient::HMDCountUpdate_1(BitStream* userData, ReceivePayload* pPayload)\n{\n    OVR_UNUSED(pPayload);\n\n    int32_t hmdCount = 0;\n    if (!userData->Read(hmdCount))\n    {\n        OVR_ASSERT(false);\n        return;\n    }\n\n    HMDCount = hmdCount;\n    EdgeTriggeredHMDCount = true;\n}\n\n\n}} // namespace OVR::Service\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Service/Service_NetClient.h",
    "content": "/************************************************************************************\n\nFilename    :   Service_NetClient.h\nContent     :   Client for service interface\nCreated     :   June 12, 2014\nAuthors     :   Michael Antonov, Kevin Jenkins, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Service_NetClient_h\n#define OVR_Service_NetClient_h\n\n#include \"Net/OVR_NetworkTypes.h\"\n#include \"Service_NetSessionCommon.h\"\n#include \"Kernel/OVR_System.h\"\n#include \"OVR_CAPI.h\"\n#include \"Util/Util_Render_Stereo.h\"\n\nnamespace OVR { namespace Service {\n\nusing namespace OVR::Net;\n\n\n//-------------------------------------------------------------------------------------\n// NetClient\n\nclass NetClient : public NetSessionCommon,\n                  public Net::Plugins::NetworkPlugin,\n                  public SystemSingletonBase<NetClient>\n{\n    OVR_DECLARE_SINGLETON(NetClient);\n    virtual void OnThreadDestroy();\n\npublic:\n    bool         Connect(bool blocking);\n    bool         IsConnected(bool attemptReconnect, bool blockOnReconnect);\n    void         Disconnect();\n\n    void         GetLocalProtocolVersion(int& major, int& minor, int& patch);\n    void         GetLocalSDKVersion(SDKVersion& requestedSDKVersion);\n\n    // These functions may fail if it is not connected\n    bool         GetRemoteProtocolVersion(int& major, int& minor, int& patch);\n    bool         GetRemoteSDKVersion(SDKVersion& remoteSDKVersion);\n\n    void         SetLastError(String str);\n\n    void         ApplyParameters(ovrInitParams const* params);\n\npublic:\n    // Persistent key-value storage\n    const char*  GetStringValue(VirtualHmdId hmd, const char* key, const char* default_val);\n    bool         GetBoolValue(VirtualHmdId hmd, const char* key, bool default_val);\n    int          GetIntValue(VirtualHmdId hmd, const char* key, int default_val);\n    double       GetNumberValue(VirtualHmdId hmd, const char* key, double default_val);\n    int          GetNumberValues(VirtualHmdId hmd, const char* key, double* values, int num_vals);\n\n    bool         SetStringValue(VirtualHmdId hmd, const char* key, const char* val);\n    bool         SetBoolValue(VirtualHmdId hmd, const char* key, bool val);\n    bool         SetIntValue(VirtualHmdId hmd, const char* key, int val);\n    bool         SetNumberValue(VirtualHmdId hmd, const char* key, double val);\n    bool         SetNumberValues(VirtualHmdId hmd, const char* key, const double* vals, int num_vals);\n\n    bool         GetDriverMode(bool& driverInstalled, bool& compatMode, bool& hideDK1Mode);\n    bool         SetDriverMode(bool compatMode, bool hideDK1Mode);\n\n\tint          Hmd_Detect();\n\tbool         Hmd_Create(int index, HMDNetworkInfo* netInfo);\n\tvoid         Hmd_Release(VirtualHmdId hmd);\n\n\t// Last string is cached locally.\n\tconst char*  Hmd_GetLastError(VirtualHmdId hmd);\n\n\t// TBD: Replace with a function to return internal, original HMDInfo?\n\n\t// Fills in description about HMD; this is the same as filled in by ovrHmd_Create.\n\t// The actual descriptor is a par\n\tbool         Hmd_GetHmdInfo(VirtualHmdId hmd, HMDInfo* hmdInfo);\n\n\t//-------------------------------------------------------------------------------------\n\tunsigned int Hmd_GetEnabledCaps(VirtualHmdId hmd);\n\t// Returns new caps after modification\n\tunsigned int Hmd_SetEnabledCaps(VirtualHmdId hmd, unsigned int hmdCaps);\n\n    // Updates driver render target\n    bool         Hmd_AttachToWindow(VirtualHmdId hmd, void* hWindow);\n\n\t//-------------------------------------------------------------------------------------\n\t// *** Tracking Setup\n\n\tbool         Hmd_ConfigureTracking(VirtualHmdId hmd, unsigned supportedCaps, unsigned requiredCaps);\t\n\tvoid         Hmd_ResetTracking(VirtualHmdId hmd, bool visionReset);\n\n\t// TBD: Camera frames\n    bool         LatencyUtil_ProcessInputs(double startTestSeconds, unsigned char rgbColorOut[3]);\n    const char*  LatencyUtil_GetResultsString();\n\n    bool         ShutdownServer();\n\nprotected:\n    // Status\n    bool         LatencyTesterAvailable;\n    int          HMDCount;\n    bool         EdgeTriggeredHMDCount;\n\n    String       Hmd_GetLastError_Str;\n    String       LatencyUtil_GetResultsString_Str;\n    String       ProfileGetValue1_Str, ProfileGetValue3_Str;\n\n    // Parameters passed to ovr_Initialize()\n    bool         ServerOptional;      // Server connection is optional?\n    bool         ExtraDebugging;      // Extra debugging enabled?\n    int          ConnectionTimeoutMS; // Connection timeout in milliseconds\n\n    void         SetDefaultParameters();\n\nprotected:\n    virtual void OnReceive(Net::ReceivePayload* pPayload, Net::ListenerReceiveResult* lrrOut);\n    virtual void OnDisconnected(Net::Connection* conn);\n    virtual void OnConnected(Net::Connection* conn);\n\n    virtual int  Run();\n\n    //// Push Notifications:\n\n    void registerRPC();\n\n    CallbackListener<Net::Plugins::RPCSlot> InitialServerStateScope;\n    void InitialServerState_1(BitStream* userData, ReceivePayload* pPayload);\n\n    CallbackListener<Net::Plugins::RPCSlot> LatencyTesterAvailableScope;\n    void LatencyTesterAvailable_1(BitStream* userData, ReceivePayload* pPayload);\n\n    CallbackListener<Net::Plugins::RPCSlot> DefaultLogOutputScope;\n    void DefaultLogOutput_1(BitStream* userData, ReceivePayload* pPayload);\n\n    CallbackListener<Net::Plugins::RPCSlot> HMDCountUpdateScope;\n    void HMDCountUpdate_1(BitStream* userData, ReceivePayload* pPayload);\n};\n\n\n}} // namespace OVR::Service\n\n#endif // OVR_Service_NetClient_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Service/Service_NetSessionCommon.cpp",
    "content": "/************************************************************************************\n\nFilename    :   Service_NetSessionCommon.cpp\nContent     :   Server for service interface\nCreated     :   June 12, 2014\nAuthors     :   Kevin Jenkins, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"Service_NetSessionCommon.h\"\n#include \"../OVR_Stereo.h\"\n\nnamespace OVR { namespace Service {\n\n\n//-----------------------------------------------------------------------------\n// NetSessionCommon\n\nNetSessionCommon::NetSessionCommon() :\n    Terminated(false)\n{\n    pSession = new Net::Session;\n    OVR_ASSERT(pSession != NULL);\n\n    pRPC = new Net::Plugins::RPC1;\n    OVR_ASSERT(pRPC != NULL);\n\n    pSession->AddSessionListener(pRPC);\n}\n\nNetSessionCommon::~NetSessionCommon()\n{\n    if (pSession)\n    {\n        delete pSession;\n        pSession = NULL;\n    }\n    if (pRPC)\n    {\n        delete pRPC;\n        pRPC = NULL;\n    }\n\n    Terminated.store(true, std::memory_order_relaxed);\n\n    OVR_ASSERT(IsFinished());\n}\n\nvoid NetSessionCommon::onSystemDestroy()\n{\n    Terminated.store(true, std::memory_order_relaxed);\n\n    Join();\n\n    Release();\n}\n\nvoid NetSessionCommon::onThreadDestroy()\n{\n    Terminated.store(true, std::memory_order_relaxed);\n    if (pSession)\n    {\n        pSession->Shutdown();\n    }\n}\n\ntemplate<typename T>\nstatic bool SerializeUInt32(bool write, Net::BitStream* bitStream, T& data)\n{\n    int32_t w = 0;\n    bool result = false;\n\n    if (write)\n    {\n        w = (int32_t)data;\n        result = bitStream->Serialize(write, w);\n    }\n    else\n    {\n        result = bitStream->Serialize(write, w);\n        data = (T)w;\n    }\n\n    return result;\n}\n\nstatic bool SerializeBool(bool write, Net::BitStream* bitStream, bool& data)\n{\n    uint8_t x = 0;\n    bool result = false;\n\n    if (write)\n    {\n        x = data ? 1 : 0;\n        result = bitStream->Serialize(write, x);\n    }\n    else\n    {\n        result = bitStream->Serialize(write, x);\n        data = (x != 0);\n    }\n\n    return result;\n}\n\nbool NetSessionCommon::SerializeHMDInfo(Net::BitStream *bitStream, HMDInfo* hmdInfo, bool write)\n{\n    bool result = false;\n\n    bitStream->Serialize(write, hmdInfo->ProductName);\n    bitStream->Serialize(write, hmdInfo->Manufacturer);\n\n    SerializeUInt32(write, bitStream, hmdInfo->Version);\n    SerializeUInt32(write, bitStream, hmdInfo->HmdType);\n    SerializeUInt32(write, bitStream, hmdInfo->ResolutionInPixels.w);\n    SerializeUInt32(write, bitStream, hmdInfo->ResolutionInPixels.h);\n    SerializeUInt32(write, bitStream, hmdInfo->ShimInfo.DeviceNumber);\n    SerializeUInt32(write, bitStream, hmdInfo->ShimInfo.NativeWidth);\n    SerializeUInt32(write, bitStream, hmdInfo->ShimInfo.NativeHeight);\n    SerializeUInt32(write, bitStream, hmdInfo->ShimInfo.Rotation);\n\n    bitStream->Serialize(write, hmdInfo->ScreenSizeInMeters.w);\n    bitStream->Serialize(write, hmdInfo->ScreenSizeInMeters.h);\n    bitStream->Serialize(write, hmdInfo->ScreenGapSizeInMeters);\n    bitStream->Serialize(write, hmdInfo->CenterFromTopInMeters);\n    bitStream->Serialize(write, hmdInfo->LensSeparationInMeters);\n\n    SerializeUInt32(write, bitStream, hmdInfo->DesktopX);\n    SerializeUInt32(write, bitStream, hmdInfo->DesktopY);\n    SerializeUInt32(write, bitStream, hmdInfo->Shutter.Type);\n\n    bitStream->Serialize(write, hmdInfo->Shutter.VsyncToNextVsync);\n    bitStream->Serialize(write, hmdInfo->Shutter.VsyncToFirstScanline);\n    bitStream->Serialize(write, hmdInfo->Shutter.FirstScanlineToLastScanline);\n    bitStream->Serialize(write, hmdInfo->Shutter.PixelSettleTime);\n    bitStream->Serialize(write, hmdInfo->Shutter.PixelPersistence);\n    bitStream->Serialize(write, hmdInfo->DisplayDeviceName);\n\n    SerializeUInt32(write, bitStream, hmdInfo->DisplayId);\n\n    bitStream->Serialize(write, hmdInfo->PrintedSerial);\n\n    SerializeBool(write, bitStream, hmdInfo->InCompatibilityMode);\n\n    SerializeUInt32(write, bitStream, hmdInfo->VendorId);\n    SerializeUInt32(write, bitStream, hmdInfo->ProductId);\n\n    bitStream->Serialize(write, hmdInfo->CameraFrustumFarZInMeters);\n    bitStream->Serialize(write, hmdInfo->CameraFrustumHFovInRadians);\n    bitStream->Serialize(write, hmdInfo->CameraFrustumNearZInMeters);\n    bitStream->Serialize(write, hmdInfo->CameraFrustumVFovInRadians);\n\n    SerializeUInt32(write, bitStream, hmdInfo->FirmwareMajor);\n    SerializeUInt32(write, bitStream, hmdInfo->FirmwareMinor);\n\n    bitStream->Serialize(write, hmdInfo->PelOffsetR.x);\n    bitStream->Serialize(write, hmdInfo->PelOffsetR.y);\n    bitStream->Serialize(write, hmdInfo->PelOffsetB.x);\n    result = bitStream->Serialize(write, hmdInfo->PelOffsetB.y);\n\n    // Important please read before modifying!\n    // ----------------------------------------------------\n    // Please add new serialized data to the end, here.\n    // Otherwise we will break backwards compatibility\n    // and e.g. 0.4.4 runtime will not work with 0.4.3 SDK.\n\n    // Note that whenever new fields are added here you\n    // should also update the minor version of the RPC\n    // protocol in OVR_Session.h so that clients fail at\n    // a version check instead of when this data is\n    // found to be truncated from the server.\n\n    // The result of the final serialize should be returned to the caller.\n    return result;\n}\n\n// Prefix key names with this to pass through to server\nstatic const char* BypassPrefix = \"server:\";\n\nstatic const char* KeyNames[][NetSessionCommon::ENumTypes] = {\n    /* EGetStringValue */  { \"CameraSerial\", \"CameraUUID\", 0 },\n    /* EGetBoolValue */    { \"ReleaseDK2Sensors\", \"ReleaseLegacySensors\", 0 },\n    /* EGetIntValue */     { 0 },\n    /* EGetNumberValue */  { \"CenterPupilDepth\", \"LoggingMask\", 0 },\n    /* EGetNumberValues */ { \"NeckModelVector3f\", 0 },\n    /* ESetStringValue */  { 0 },\n    /* ESetBoolValue */    { \"ReleaseDK2Sensors\", \"ReleaseLegacySensors\", 0 },\n    /* ESetIntValue */     { 0 },\n    /* ESetNumberValue */  { \"CenterPupilDepth\", \"LoggingMask\", 0 },\n    /* ESetNumberValues */ { \"NeckModelVector3f\", 0 },\n};\n\nbool IsInStringArray(const char* a[], const char* key)\n{\n    for (int i = 0; a[i]; ++i)\n    {\n        if (OVR_strcmp(a[i], key) == 0)\n            return true;\n    }\n\n    return false;\n}\n\nconst char *NetSessionCommon::FilterKeyPrefix(const char* key)\n{\n    // If key starts with BypassPrefix,\n    if (strstr(key, BypassPrefix) == key)\n    {\n        key += strlen(BypassPrefix);\n    }\n\n    return key;\n}\n\nbool NetSessionCommon::IsServiceProperty(EGetterSetters e, const char* key)\n{\n    if ((e >= 0 && e < ENumTypes) && IsInStringArray(KeyNames[e], key))\n    {\n        return true;\n    }\n\n    // If key starts with BypassPrefix,\n    if (strstr(key, BypassPrefix) == key)\n    {\n        return true;\n    }\n\n    return false;\n}\n\n\n}} // namespace OVR::Service\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Service/Service_NetSessionCommon.h",
    "content": "/************************************************************************************\n\nFilename    :   Service_NetSessionCommon.h\nContent     :   Shared networking for service\nCreated     :   June 12, 2014\nAuthors     :   Kevin Jenkins, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Service_NetSessionCommon_h\n#define OVR_Service_NetSessionCommon_h\n\n#include <atomic>\n\n#include \"OVR_CAPI.h\"\n#include \"Kernel/OVR_Threads.h\"\n#include \"Kernel/OVR_System.h\"\n#include \"Net/OVR_RPC1.h\"\n#include \"Net/OVR_BitStream.h\"\n\n\nnamespace OVR {\n\nclass HMDInfo;\n\nnamespace Service {\n\n\n//-----------------------------------------------------------------------------\n// VirtualHmdId\n\n// This is an identifier that is unique to each VirtualHmd object on the server\n// side.  The client side uses this to opaquely reference those objects.\n\ntypedef int32_t VirtualHmdId;\nstatic const int32_t InvalidVirtualHmdId = -1;\n\n// Localhost-bound TCP port that the service listens on for VR apps\nstatic const int VRServicePort = 30322; // 0x7672 = \"vr\" little-endian\n\n// Stores the names of shared memory regions\nstruct SharedMemoryNames\n{\n    String Hmd;\n    String Camera;\n};\n\n// HMDInfo section related to networking\nstruct HMDNetworkInfo\n{\n\tHMDNetworkInfo() :\n\t\tNetId(InvalidVirtualHmdId)\n\t{\n\t}\n\n\t// Network identifier for HMD\n\tVirtualHmdId NetId;\n\n\t// Names of the shared memory objects\n\tSharedMemoryNames SharedMemoryName;\n\n    bool Serialize(Net::BitStream* bs, bool write = true)\n\t{\n        bs->Serialize(write, NetId);\n        bs->Serialize(write, SharedMemoryName.Hmd);\n        if (!bs->Serialize(write, SharedMemoryName.Camera))\n            return false;\n        return true;\n\t}\n\n    // Assignment operator\n    HMDNetworkInfo& operator=(HMDNetworkInfo const & rhs)\n    {\n        NetId = rhs.NetId;\n        SharedMemoryName = rhs.SharedMemoryName;\n        return *this;\n    }\n};\n\n\n//-------------------------------------------------------------------------------------\n// ***** NetSessionCommon\n\n// Common part networking session/RPC implementation shared between client and server.\n\nclass NetSessionCommon : public Thread\n{\nprotected:\n    virtual void onSystemDestroy();\n    virtual void onThreadDestroy();\n\npublic:\n    NetSessionCommon();\n    virtual ~NetSessionCommon();\n\n\tNet::Plugins::RPC1* GetRPC1() const\n    {\n        return pRPC;\n    }\n\tNet::Session* GetSession() const\n    {\n        return pSession;\n    }\n\n\tstatic bool SerializeHMDInfo(Net::BitStream* bitStream, HMDInfo* hmdInfo, bool write = true);\n\npublic:\n    // Getter/setter tools\n    enum EGetterSetters\n    {\n        // Note: If this enumeration changes, then the Servce_NetSessionCommon.cpp\n        // IsServiceProperty() function should be updated.\n\n        EGetStringValue,\n        EGetBoolValue,\n        EGetIntValue,\n        EGetNumberValue,\n        EGetNumberValues,\n        ESetStringValue,\n        ESetBoolValue,\n        ESetIntValue,\n        ESetNumberValue,\n        ESetNumberValues,\n\n        ENumTypes\n    };\n\n    static const char* FilterKeyPrefix(const char* key);\n    static bool IsServiceProperty(EGetterSetters e, const char* key);\n\nprotected:\n    std::atomic<bool>   Terminated; // Thread termination flag\n    Net::Session*       pSession;   // Networking session\n    Net::Plugins::RPC1* pRPC;       // Remote procedure calls object\n};\n\n\n}} // namespace OVR::Service\n\n#endif // OVR_Service_NetSessionCommon_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Service/Service_Win32_FastIPC_Client.cpp",
    "content": "/************************************************************************************\n\nFilename    :   Service_Win32_FastIPC_Client.cpp\nContent     :   Client side of connectionless fast IPC\nCreated     :   Sept 16, 2014\nAuthors     :   Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#include \"Service_Win32_FastIPC_Client.h\"\n\nnamespace OVR { namespace Service { namespace Win32 {\n\nusing namespace OVR::Net;\n\n\n//// FastIPCClient\n\nFastIPCClient::FastIPCClient()\n{\n}\n\nbool FastIPCClient::ReadInitialData(const char* buffer)\n{\n    uint32_t magic    = *(uint32_t*)(buffer);\n    uint32_t verMajor = *(uint32_t*)(buffer + 4);\n    uint32_t verMinor = *(uint32_t*)(buffer + 8);\n\n    if (magic != Magic)\n    {\n        LogError(\"Magic does not match\");\n        return false;\n    }\n\n    if (verMajor != MajorVersion)\n    {\n        LogError(\"Major version mismatch\");\n        return false;\n    }\n\n    if (verMinor < MinorVersion)\n    {\n        LogError(\"Remote minor version too old for our feature level\");\n        return false;\n    }\n\n    HANDLE remoteDataEvent   = (HANDLE)*(uint64_t*)(buffer + 12);\n    HANDLE remoteReturnEvent = (HANDLE)*(uint64_t*)(buffer + 20);\n    pid_t serverProcessId    = (pid_t) *(uint64_t*)(buffer + 28);\n    OVR_UNUSED(serverProcessId);\n\n    if (!remoteDataEvent || !remoteReturnEvent)\n    {\n        LogError(\"Handshake was malformed.  It seems like a version mismatch.\");\n        return false;\n    }\n\n    DataEvent.Attach(remoteDataEvent);\n    ReturnEvent.Attach(remoteReturnEvent);\n\n    return true;\n}\n\nbool FastIPCClient::Initialize(const char* sharedMemoryName)\n{\n    SharedMemory::OpenParameters params;\n    params.accessMode   = SharedMemory::AccessMode_ReadWrite;\n    params.globalName   = sharedMemoryName;\n    params.minSizeBytes = RegionSize;\n    params.openMode     = SharedMemory::OpenMode_OpenOnly;\n    params.remoteMode   = SharedMemory::RemoteMode_ReadWrite;\n    Scratch             = SharedMemoryFactory::GetInstance()->Open(params);\n    IPCMessageIndex     = 1;\n\n    if (!Scratch || Scratch->GetSizeI() < RegionSize)\n    {\n        OVR_ASSERT(false);\n        LogError(\"Unable to open shared memory region\");\n        return false;\n    }\n\n    char* data = (char*)Scratch->GetData();\n\n    // If unable to read handshake,\n    if (!ReadInitialData(data))\n    {\n        return false;\n    }\n\n    return true;\n}\n\nFastIPCClient::~FastIPCClient()\n{\n}\n\nbool FastIPCClient::Call(Net::BitStream* parameters, Net::BitStream* returnData, int timeoutMs)\n{\n    // If not initialized,\n    if (!ReturnEvent.IsValid())\n    {\n        OVR_ASSERT(false);\n        return false;\n    }\n\n    volatile unsigned char* scratch = (unsigned char*)Scratch->GetData();\n\n    uint32_t bytesUsed = ((uint32_t)parameters->GetNumberOfBitsUsed() + 7) / 8;\n\n    // If data is too long,\n    if (bytesUsed > RegionSize - 4)\n    {\n        OVR_ASSERT(false);\n        return false;\n    }\n\n    // First 4 bytes will be the size of the parameters\n    // Note that this is for IPC so endian-ness is not important\n    *(uint32_t*)(scratch + 4) = bytesUsed;\n\n    // Copy data into place\n    memcpy((char*)scratch + 8, parameters->GetData(), bytesUsed);\n\n    // Don't allow read/write operations to move around this point\n    MemoryBarrier();\n\n    // Write message index\n    *(volatile uint32_t*)scratch = IPCMessageIndex;\n\n    // Wake the remote thread to service our request\n    if (!::SetEvent(DataEvent.Get()))\n    {\n        OVR_ASSERT(false);\n        return false;\n    }\n\n    // Wait for result of call:\n\n    ++IPCMessageIndex;\n\n    // Use the GetTickCount() API for low-resolution timing\n    DWORD t0 = ::GetTickCount();\n    int remaining = timeoutMs;\n\n    // Forever,\n    for (;;)\n    {\n        // Wait on the return event\n        DWORD result = ::WaitForSingleObject(ReturnEvent.Get(), timeoutMs < 0 ? INFINITE : remaining);\n\n        if (result == WAIT_FAILED)\n        {\n            int err = GetLastError();\n            LogError(\"[FastIPC] Wait failed with error %d\", err);\n        }\n\n        // If wait succeeded,\n        if (result == WAIT_OBJECT_0)\n        {\n            if (*(volatile uint32_t*)scratch != IPCMessageIndex)\n            {\n                double callTimeoutStart = Timer::GetSeconds();\n\n                while (*(volatile uint32_t*)scratch != IPCMessageIndex)\n                {\n                    if (Timer::GetSeconds() - callTimeoutStart > 1.)\n                    {\n                        LogError(\"[FastIPC] Timed out waiting for remote IPC message to be written.\");\n                        OVR_ASSERT(false);\n                        return false;\n                    }\n\n                    Thread::YieldCurrentThread();\n                }\n            }\n\n            _ReadBarrier();\n\n            // Wrap the scratch buffer\n            uint32_t len = *(uint32_t*)(scratch + 4);\n            returnData->WrapBuffer((unsigned char*)scratch + 8, len);\n\n            ++IPCMessageIndex;\n\n            // Return true for success\n            return true;\n        }\n\n        // If not waiting forever,\n        if (timeoutMs > 0)\n        {\n            // If wait time has elapsed,\n            int elapsed = ::GetTickCount() - t0;\n            if (elapsed >= timeoutMs)\n            {\n                // Break out of loop returning false\n                break;\n            }\n\n            // Calculate remaining wait time\n            remaining = timeoutMs - elapsed;\n        }\n\n        // Continue waiting\n    }\n\n    return false;\n}\n\n\n}}} // namespace OVR::Service::Win32\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Service/Service_Win32_FastIPC_Client.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Service_Win32_FastIPC_Client.h\nContent     :   Client side of connectionless fast IPC\nCreated     :   Sept 16, 2014\nAuthors     :   Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n************************************************************************************/\n\n#ifndef OVR_Service_Win32_FastIPC_Client_h\n#define OVR_Service_Win32_FastIPC_Client_h\n\n#include \"Kernel/OVR_SharedMemory.h\"\n#include \"Net/OVR_RPC1.h\"\n#include \"Kernel/OVR_Win32_IncludeWindows.h\"\n\nnamespace OVR { namespace Service { namespace Win32 {\n\n\n//-----------------------------------------------------------------------------\n// FastIPCClient\n//\n// This class implements the client side for connectionless IPC messaging.\n//\n// The client reads the shared memory name provided and retrieves the data\n// and return event handles.  It can push data to the server synchronously\n// by signaling the data handle and waiting on the return handle.\n\nclass FastIPCClient\n{\n    String            SharedMemoryName;\n    Ptr<SharedMemory> Scratch;\n    ScopedEventHANDLE DataEvent, ReturnEvent;\n    uint32_t          IPCMessageIndex;\n\nprotected:\n    bool ReadInitialData(const char* buffer);\n\npublic:\n    static const int      RegionSize = 4096;\n    static const uint32_t Magic      = 0xfe67bead;\n\n    // Semantic versioning\n    static const uint32_t MajorVersion = 1;\n    static const uint32_t MinorVersion = 0;\n\npublic:\n    FastIPCClient();\n    ~FastIPCClient();\n\n    String GetSharedMemoryName() const\n    {\n        return SharedMemoryName;\n    }\n\n    // Call this to initialize the shared memory section\n    bool Initialize(const char* sharedMemoryName);\n\n    // Make a blocking call to the server\n    // Pass -1 for the timeout to wait forever\n    bool Call(Net::BitStream* bread, Net::BitStream* toast, int timeoutMs = -1);\n};\n\n\n}}} // namespace OVR::Service::Win32\n\n#endif // OVR_Service_Win32_FastIPC_Client_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Util/Util_Interface.cpp",
    "content": "/************************************************************************************\n\nFilename    :   Util_Interface.cpp\nContent     :   Simple interface, utilised by internal demos,\n\t\t\t\twith access to wider SDK as needed. \n\t\t\t\tLocated in the body of the SDK to ensure updated\n\t\t\t\twhen new SDK features are added.\nCreated     :   February 20, 2014\nAuthors     :   Tom Heath\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include \"Util_Interface.h\"\n\n\n\n//Files left in to ease its possible return......\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Util/Util_Interface.h",
    "content": "/************************************************************************************\n\nFilename    :   Util_Interface.h\nContent     :   Simple interface, utilised by internal demos,\n\t\t\t\twith access to wider SDK as needed. \n\t\t\t\tLocated in the body of the SDK to ensure updated\n\t\t\t\twhen new SDK features are added.\nCreated     :   February 20, 2014\nAuthors     :   Tom Heath\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Util_Interface_h\n#define OVR_Util_Interface_h\n#include \"OVR_CAPI.h\"\n\n//Files left in to ease its possible return......\n\n#endif\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Util/Util_LatencyTest2Reader.cpp",
    "content": "/************************************************************************************\n\nFilename    :   Util_LatencyTest2Reader.cpp\nContent     :   Shared functionality for the DK2 latency tester\nCreated     :   July 8, 2014\nAuthors     :   Volga Aksoy, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include \"Util_LatencyTest2Reader.h\"\n\nnamespace OVR { namespace Util {\n\n\n//// FrameTimeRecord\n\nbool FrameTimeRecord::ColorToReadbackIndex(int *readbackIndex, unsigned char color)\n{\n    int compareColor = color - LT2_ColorIncrement/2;\n    int index        = color / LT2_ColorIncrement;  // Use color without subtraction due to rounding.\n    int delta        = compareColor - index * LT2_ColorIncrement;\n\n    if ((delta < LT2_PixelTestThreshold) && (delta > -LT2_PixelTestThreshold))\n    {\n        *readbackIndex = index;\n        return true;\n    }\n    return false;\n}\n\nunsigned char FrameTimeRecord::ReadbackIndexToColor(int readbackIndex)\n{\n    OVR_ASSERT(readbackIndex < LT2_IncrementCount);\n    return (unsigned char)(readbackIndex * LT2_ColorIncrement + LT2_ColorIncrement/2);\n}\n\n\n//// FrameTimeRecordSet\n\nFrameTimeRecordSet::FrameTimeRecordSet()\n{\n    NextWriteIndex = 0;\n    memset(this, 0, sizeof(FrameTimeRecordSet));\n}\n\nvoid FrameTimeRecordSet::AddValue(int readValue, double timeSeconds)\n{\n    Records[NextWriteIndex].ReadbackIndex = readValue;\n    Records[NextWriteIndex].TimeSeconds   = timeSeconds;\n    NextWriteIndex++;\n    if (NextWriteIndex == RecordCount)\n        NextWriteIndex = 0;\n}\n// Matching should be done starting from NextWrite index \n// until wrap-around\n\nconst FrameTimeRecord& FrameTimeRecordSet::operator [] (int i) const\n{\n    return Records[(NextWriteIndex + i) & RecordMask];\n}\n\nconst FrameTimeRecord& FrameTimeRecordSet::GetMostRecentFrame()\n{\n    return Records[(NextWriteIndex - 1) & RecordMask];\n}\n\n// Advances I to  absolute color index\nbool FrameTimeRecordSet::FindReadbackIndex(int* i, int readbackIndex) const\n{\n    for (; *i < RecordCount; (*i)++)\n    {\n        if ((*this)[*i].ReadbackIndex == readbackIndex)\n            return true;\n    }\n    return false;\n}\n\nbool FrameTimeRecordSet::IsAllZeroes() const\n{\n    for (int i = 0; i < RecordCount; i++)\n        if (Records[i].ReadbackIndex != 0)\n            return false;\n    return true;\n}\n\n\n//// RecordStateReader\n\nvoid RecordStateReader::GetRecordSet(FrameTimeRecordSet& recordset)\n{\n    if(!Updater)\n    {\n        return;\n    }\n        \n    recordset = Updater->LatencyTest.GetState();\n    return;\n}\n\n\n}} // namespace OVR::Util\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Util/Util_LatencyTest2Reader.h",
    "content": "/************************************************************************************\n\nFilename    :   Util_LatencyTest2Reader.h\nContent     :   Shared functionality for the DK2 latency tester\nCreated     :   July 8, 2014\nAuthors     :   Volga Aksoy, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Util_LatencyTest2Reader_h\n#define OVR_Util_LatencyTest2Reader_h\n\n#include \"Vision/SensorFusion/Vision_SensorState.h\"\n#include \"Util_LatencyTest2State.h\"\n\nnamespace OVR { namespace Util {\n\n\n//-----------------------------------------------------------------------------\n// RecordStateReader\n\n// User interface to retrieve pose from the sensor fusion subsystem\nclass RecordStateReader : public NewOverrideBase\n{\nprotected:\n    const Vision::CombinedHmdUpdater* Updater;\n\npublic:\n    RecordStateReader()\n        : Updater(NULL)\n    {\n    }\n\n    // Initialize the updater\n    void SetUpdater(const Vision::CombinedHmdUpdater *updater)\n    {\n        Updater = updater;\n    }\n\n    void GetRecordSet(FrameTimeRecordSet& recordset);\n};\n\n\n}} // namespace OVR::Util\n\n#endif // OVR_Util_LatencyTest2Reader_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Util/Util_LatencyTest2State.h",
    "content": "/************************************************************************************\n\nFilename    :   Util_LatencyTest2Reader.h\nContent     :   Shared functionality for the DK2 latency tester\nCreated     :   July 8, 2014\nAuthors     :   Volga Aksoy, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Util_LatencyTest2_State_h\n#define OVR_Util_LatencyTest2_State_h\n\n#include \"Kernel/OVR_Lockless.h\"\n\nnamespace OVR { namespace Util {\n\n\nenum LatencyTester2Constants\n{\n    LT2_ColorIncrement                  = 32,\n    LT2_PixelTestThreshold              = LT2_ColorIncrement / 3,\n    LT2_IncrementCount                  = 256 / LT2_ColorIncrement,\n    LT2_TimeoutWaitingForColorDetected  = 1000  // 1 second\n};\n\n\n//-------------------------------------------------------------------------------------\n// FrameTimeRecord\n\n// Describes frame scan-out time used for latency testing.\nstruct OVR_ALIGNAS(8) FrameTimeRecord\n{\n    int32_t ReadbackIndex;\n    int32_t Pad;\n    double  TimeSeconds;\n\n    // Utility functions to convert color to readBack indices and back.\n    // The purpose of ReadbackIndex is to allow direct comparison by value.\n\n    static bool ColorToReadbackIndex(int *readbackIndex, unsigned char color);\n    static unsigned char ReadbackIndexToColor(int readbackIndex);\n};\n\n\n//-----------------------------------------------------------------------------\n// FrameTimeRecordSet\n\n// FrameTimeRecordSet is a container holding multiple consecutive frame timing records\n// returned from the lock-less state. Used by FrameTimeManager. \nstruct OVR_ALIGNAS(8) FrameTimeRecordSet\n{\n    enum {\n        RecordCount = 4,\n        RecordMask  = RecordCount - 1\n    };\n    FrameTimeRecord Records[RecordCount];    \n    int32_t         NextWriteIndex;\n    int32_t         Pad4;\n\n    FrameTimeRecordSet();\n\n    void AddValue(int readValue, double timeSeconds);\n    // Matching should be done starting from NextWrite index \n    // until wrap-around\n\n    const FrameTimeRecord& operator [] (int i) const;\n\n    const FrameTimeRecord& GetMostRecentFrame();\n\n    // Advances I to  absolute color index\n    bool FindReadbackIndex(int* i, int readbackIndex) const;\n\n    bool IsAllZeroes() const;\n};\n\n}} // namespace OVR::Util\n\n#endif // OVR_Util_LatencyTest2_State_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Util/Util_MatFile.cpp",
    "content": "/************************************************************************************\n\nFilename    :   Util_MatFile.cpp\nContent     :   Matlab .MAT file access functions\nCreated     :   June 1, 2014\nAuthors     :   Neil Konzen\n\nCopyright   :   Copyright 2014 Oculus VR, Inc. All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include \"Util_MatFile.h\"\n\n#include \"Kernel/OVR_Types.h\"\n#include \"Kernel/OVR_Alg.h\"\n#include \"Kernel/OVR_Std.h\"\n\nOVR_DISABLE_MSVC_WARNING(4996) //  'fopen': This function or variable may be unsafe. Consider using fopen_s inst\n\n\nnamespace OVR { namespace Util {\n\nusing namespace OVR::Alg;\n\n\n// Data structures relating to MATLAB .MAT binary files\n#define\tFX_FORM_IEEE_LE\t\t0000u\n#define FX_FORM_IEEE_BE\t\t1000u\n#define FX_FORM_VAX_D_FLOAT 2000u\n#define FX_FORM_VAX_G_FLOAT 3000u\n#define FX_FORM_CRAY\t\t4000u\n#define FX_FORM(type)\t\t((((type) / 1000u) % 10u) * 1000u)\n\n#define FX_PREC_UINT8 \t\t50u\n#define FX_PREC_INTU\t\t40u\n#define FX_PREC_INTS\t\t30u\n#define FX_PREC_LONG\t\t20u\n#define FX_PREC_SINGLE\t\t10u\n#define FX_PREC_DOUBLE\t\t00u\n#define FX_PREC(type)\t\t((((type) / 10u) % 10u) * 10u)\n\n// Note that the elements of a text matrix are stored as floating-point numbers\n// between 0 and 255 representing ASCII-encoded characters.\n#define FX_MAT_NUMERIC\t   0u\n#define FX_MAT_TEXT\t\t   1u\n#define FX_MAT_SPARSE\t   2u\n#define FX_MAT(type)\t\t((type) % 10u)\n\nstruct Fmatrix\n{\n\tuint32_t type;\t    //\tType - see #defines\n\tuint32_t mrows;     //\tRow dimension - NOTE: Column dimension for C Arrays!\n\tuint32_t ncols;\t    // \tColumn dimension - NOTE: Row dimension for C Arrays!\n\tuint32_t imagf;\t    //\t1=complex, 0=real\n\tuint32_t namelen;\t// \tlength including zero terminator\n};\n\n\nuint32_t MatFile::GetMatlabType(ValueType type, size_t& valueSize)\n{\n    switch (type)\n    {\n    case ByteValue: valueSize = sizeof(uint8_t); return FX_PREC_UINT8;\n    case UInt16Value: valueSize = sizeof(uint16_t); return FX_PREC_INTU;\n    case Int16Value: valueSize = sizeof(int16_t); return FX_PREC_INTS;\n    case UInt32Value: valueSize = sizeof(uint32_t); return FX_PREC_LONG;    // Not directly supported by matlab!\n    case Int32Value: valueSize = sizeof(int32_t); return FX_PREC_LONG;\n    case FloatValue: valueSize = sizeof(float); return FX_PREC_SINGLE;\n    case DoubleValue: valueSize = sizeof(double); return FX_PREC_DOUBLE;\n    case StringValue: valueSize = sizeof(char); return FX_MAT_TEXT; // special case for string arrays\n    default:\n        OVR_ASSERT(false);\n        valueSize = 0;\n        return 0;\n    }\n}\n\nMatFile::ValueType MatFile::GetValueType(uint32_t matlabType, size_t& valueSize)\n{\n    switch (matlabType)\n    {\n    case FX_PREC_UINT8: valueSize = sizeof(uint8_t); return ByteValue;\n    case FX_PREC_INTU: valueSize = sizeof(uint16_t); return UInt16Value;\n    case FX_PREC_INTS: valueSize = sizeof(int16_t); return Int16Value;\n    case FX_PREC_LONG: valueSize = sizeof(int32_t); return Int32Value;\n    case FX_PREC_SINGLE: valueSize = sizeof(float); return FloatValue;\n    case FX_PREC_DOUBLE: valueSize = sizeof(double); return DoubleValue;\n    case FX_MAT_TEXT: valueSize = sizeof(char); return StringValue;\n    default:\n        OVR_ASSERT(false);\n        valueSize = 0;\n        return UnknownValue;\n    }\n}\n\nMatFile::MatFile(void)\n{\n\tm_f = NULL;\n}\n\nMatFile::~MatFile(void)\n{\n\tif (m_f)\n\t\tfclose(m_f);\n\tm_f = NULL;\n}\n\n// Matlab arrays are stored column-major, while C/C++ arrays are stored row-major.\n// This means that a C array appears to Matlab transposed, and vice versa.\n// To deal with this we swap the row and column values stored in the Matlab matrix header.\n\nbool MatFile::Open(const char* pszFile, bool write)\n{\n    OVR_ASSERT(!m_f);\n    m_f = fopen(pszFile, write ? \"wb\" : \"rb\");\n    return (m_f != nullptr);\n}\n\nvoid MatFile::Close()\n{\n\tif (m_f)\n\t{\n\t\tfclose(m_f);\n\t\tm_f = NULL;\n\t}\n}\n\nint MatFile::ReadString(const char* name, char* text, size_t maxTextSize)\n{\n\tint rows, cols;\n\tValueType valueType;\n\n\tmaxTextSize = Alg::Min(maxTextSize, INT_MAX/sizeof(double)/2);\n\n\tif (!GetMatrixInfo(name, valueType, rows, cols))\n\t\treturn 0;\n\n\tif (valueType != StringValue)\n\t\treturn 0;\n\n\tint count = rows * cols;\t// character count, not including zero terminator\n\n\tdouble* doubles = new double[count];\n\tReadMatrixValues(doubles, StringValue, count, 1);\n\n\tif (maxTextSize > 0 && count > 0)\n\t{\n\t\tcount = (int)Alg::Min(count, (int)(maxTextSize-1));\n\t\tfor (int i = 0; i < count; i++)\n\t\t\ttext[i] = (char)doubles[i];\n\t\ttext[count] = 0;\t// Always zero terminate\n\t}\n\n\tdelete[] doubles;\n\n\treturn count;\n}\n\nbool MatFile::WriteString(const char* name, const char* string)\n{\n\tint length = (int)Alg::Min(strlen(string), INT_MAX/sizeof(double)/2);\n\n\tdouble* doubles = new double[length];\n\tfor (int i = 0; i < length; i++)\n\t\tdoubles[i] = (double)((unsigned char)string[i]);\n\n\tbool ok = WriteMatrix(name, doubles, StringValue, (int)length, 1);\n\n\tdelete[] doubles;\n\n\treturn ok;\n}\n\nvoid* MatFile::ReadMatrix(const char* name, ValueType valueType, int& rows, int& cols)\n{\n\tValueType fileValueType;\n\tif (!GetMatrixInfo(name, fileValueType, rows, cols))\n\t\treturn NULL;\n\n\tint valueCount = rows * cols;\n\n\tvoid* values = NULL;\n\tswitch (fileValueType)\n\t{\n\tcase StringValue:\t// Text matrices are stored as doubles\n\tcase DoubleValue:\n\t\tvalues = new double[valueCount];\n\t\tbreak;\n\tcase FloatValue:\n\t\tvalues = new float[valueCount];\n\t\tbreak;\n\tcase ByteValue:\n\t\tvalues = new uint8_t[valueCount];\n\t\tbreak;\n\tcase Int16Value:\n\t\tvalues = new int16_t[valueCount];\n\t\tbreak;\n\tcase UInt16Value:\n\t\tvalues = new uint16_t[valueCount];\n\t\tbreak;\n\tcase Int32Value:\n    /*case UInt32Value: -- not directly supported by matlab -v4 files */\n        values = new int32_t[valueCount];\n\t\tbreak;\n\tdefault:\n        OVR_ASSERT(false);\n\t\treturn NULL;\n\t}\n\n\tbool ok = ReadMatrixValues(values, fileValueType, rows, cols);\n\n\tif (ok)\n\t\tvalues = ConvertVector(values, valueCount, fileValueType, valueType);\n\n\tif (!ok)\n\t{\n\t\tdelete[] (char*)values;\n\t\tvalues = NULL;\n\t}\n\n    OVR_ASSERT(values);\n\treturn values;\n}\n\nvoid* MatFile::ConvertVector(void* fromValues, int valueCount, ValueType fromType, ValueType toType)\n{\n\t// Special case: Always convert characters stored as doubles to a char array\n\tif (fromType == StringValue)\n\t\tfromType = DoubleValue;\n\n\tif (fromType == toType)\n\t\treturn fromValues;\n\n    // UInt32 values are stored as Int32 values by Matlab\n    if (fromType == Int32Value && toType == UInt32Value)\n        return fromValues;\n\n    // When a .mat file is saved by Matlab, many datatypes are converted to double.\n\t// We support conversion of doubles to some other types: float, long, byte, char\n\t// and strings and floats to doubles.\n\t// convert singles to doubles\n\tbool ok = true;\n\tif (fromType == DoubleValue)\n\t{\n        const double* fromDoubles = (const double*)fromValues;\n\t\tif (toType == FloatValue)\n\t\t{\n\t\t\tfloat* newValues = new float[valueCount];\n\t\t\tfor (int i = 0; i < valueCount; i++)\n\t\t\t\tnewValues[i] = (float)fromDoubles[i];\n\t\t\tdelete[] (char*)fromValues;\n\t\t\tfromValues = newValues;\n\t\t}\n\t\telse if (toType == Int32Value)\n\t\t{\n\t\t\tint32_t* newValues = new int32_t[valueCount];\n\t\t\tfor (int i = 0; i < valueCount; i++)\n\t\t\t\tnewValues[i] = (int32_t)fromDoubles[i];\n\t\t\tdelete[] (char*)fromValues;\n\t\t\tfromValues = newValues;\n\t\t}\n        else if (toType == UInt32Value)\n        {\n            uint32_t* newValues = new uint32_t[valueCount];\n            for (int i = 0; i < valueCount; i++)\n                newValues[i] = (uint32_t)fromDoubles[i];\n            delete[] (char*)fromValues;\n            fromValues = newValues;\n        }\n\t\telse if (toType == Int16Value)\n\t\t{\n\t\t\tint16_t* newValues = new int16_t[valueCount];\n\t\t\tfor (int i = 0; i < valueCount; i++)\n\t\t\t\tnewValues[i] = (int16_t)fromDoubles[i];\n\t\t\tdelete[] (char*)fromValues;\n\t\t\tfromValues = newValues;\n\t\t}\n\t\telse if (toType == UInt16Value)\n\t\t{\n\t\t\tuint16_t* newValues = new uint16_t[valueCount];\n\t\t\tfor (int i = 0; i < valueCount; i++)\n\t\t\t\tnewValues[i] = (uint16_t)fromDoubles[i];\n\t\t\tdelete[] (char*)fromValues;\n\t\t\tfromValues = newValues;\n\t\t}\n\t\telse if (toType == ByteValue)\n\t\t{\n\t\t\tuint8_t* newValues = new uint8_t[valueCount];\n\t\t\tfor (int i = 0; i < valueCount; i++)\n\t\t\t\tnewValues[i] = (uint8_t)fromDoubles[i];\n\t\t\tdelete[] (char*)fromValues;\n\t\t\tfromValues = newValues;\n\t\t}\n\t\telse if (toType == StringValue)\n\t\t{\n\t\t\tchar* newValues = new char[valueCount];\n\t\t\tfor (int i = 0; i < valueCount; i++)\n\t\t\t\tnewValues[i] = (char)fromDoubles[i];\n\t\t\tdelete[] (char*)fromValues;\n\t\t\tfromValues = newValues;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// unsupported type conversion\n\t\t\tok = false;\n\t\t}\n\t}\n\telse\n\t{\n\t\tok = false;\t// only conversions from doubles supported\n\t}\n\n\tif (!ok)\n\t{\n        OVR_ASSERT(false);\n\t\tdelete[] (char*)fromValues;\n\t\tfromValues = NULL;\n\t}\n\n\treturn fromValues;\n}\n\nbool MatFile::GetMatrixInfo(const char* name, ValueType& valueType, int& rows, int& cols)\n{\n    OVR_ASSERT(m_f);\n\tfseek(m_f, 0, SEEK_SET);\t// rewind to start of file\n\t\n\tstatic const int maxVarNameLen = 255;\n\tchar varName[maxVarNameLen+1];\n\n\twhile (ReadMatrixInfo(varName, maxVarNameLen, valueType, rows, cols))\n\t{\n\t\tif (OVR_stricmp(name, varName) == 0)\n\t\t\treturn true;\n\t\t// skip over data to next one\n\t\tReadMatrixValues(NULL, valueType, rows, cols);\n\t}\n\n\treturn false;\n}\n\nbool MatFile::ReadMatrixInfo(char name[], size_t maxNameSize, ValueType& valueType, int& rows, int& cols)\n{\n\tif (name && maxNameSize > 0)\n\t\tname[0] = 0;\n\n\tvalueType = UnknownValue;\n\trows = 0;\n\tcols = 0;\n\n    OVR_ASSERT(m_f);\n\tif (!m_f)\n\t\treturn false;\n\n\tFmatrix header;\n\tif (fread(&header, sizeof(header), 1, m_f) != 1)\n\t\treturn false;\n\n\t// Read transpose of row and column values stored in the file\n\tcols = header.mrows;\n\trows = header.ncols;\n\n\tif (FX_FORM(header.type) != FX_FORM_IEEE_LE)\n\t{\n        OVR_ASSERT(false);\n\t\treturn false;\n\t}\n\n\t// Imaginary not supported\n\tif (header.imagf != 0)\n\t{\n        OVR_ASSERT(false);\n\t\treturn false;\n\t}\n\n\t// sparse matrices not supported\n\tif (FX_MAT(header.type) == FX_MAT_SPARSE)\n\t{\n        OVR_ASSERT(false);\n\t\treturn false;\n\t}\n\n\t// Special case for strings as text matrixes: they are stored as doubles(!)\n\tif (FX_MAT(header.type) == FX_MAT_TEXT)\n\t{\n\t\tvalueType = StringValue;\n\t}\n\telse\n\t{\n        // only numeric types supported\n        if (FX_MAT(header.type) != FX_MAT_NUMERIC)\n        {\n            OVR_ASSERT(false);\n            return false;\n        }\n        size_t valueSize;\n        valueType = GetValueType(FX_PREC(header.type), valueSize);\n\t}\n\n\t// Read in name\n    OVR_ASSERT(maxNameSize >= header.namelen);\n\tif (maxNameSize < header.namelen)\n\t\treturn false;\n\n\tif (fread(name, sizeof(char), header.namelen, m_f) != header.namelen)\n\t\treturn false;\n\n\treturn true;\n}\n\nbool MatFile::ReadMatrixValues(void* values, ValueType valueType, int rows, int cols)\n{\n    OVR_ASSERT(m_f);\n\tif (!m_f)\n\t\treturn false;\n\n    OVR_ASSERT(rows*cols > 0);\n\n\tsize_t valueCount = (size_t)(rows * cols);\n    size_t valueSize = 0;\n    GetMatlabType(valueType, valueSize);\n    if (valueSize == 0)\n        return false;\n\n    // If no values pointer specified, skip over data without reading\n\tif (!values)\n\t{\n\t\tif (fseek(m_f, (long)(valueSize * valueCount), SEEK_CUR) != 0)\n\t\t\treturn false;\n\t}\n\telse\n\t{\n\t\tif (fread(values, valueSize, valueCount, m_f) != valueCount)\n\t\t\treturn false;\n\t}\n\n    return true;\n}\n\nbool MatFile::WriteMatrix(const char* name, const void* values, ValueType valueType, int rows, int cols)\n{\n\tif (!m_f)\n\t\treturn false;\n\n    OVR_ASSERT(rows*cols > 0);\n\n\tsize_t valueCount = (size_t)(rows * cols);\n\tsize_t valueSize = 0;\n    uint32_t matlabType = GetMatlabType(valueType, valueSize);\n    if (valueSize == 0)\n        return false;\n\n\tFmatrix header;\n\tif (valueType == StringValue)\n\t{\n\t\theader.type = (FX_FORM_IEEE_LE + FX_MAT_TEXT);\n\t}\n\telse\n\t{\n\t\theader.type = (FX_FORM_IEEE_LE + FX_MAT_NUMERIC) + matlabType;\n\t}\n\n\t// NOTE: We store transposed dimensions!\n\theader.mrows = cols;\n\theader.ncols = rows;\n\theader.imagf = 0;\n\theader.namelen = (uint32_t)(strlen(name) + 1);\n    OVR_ASSERT(header.namelen > 1);\n\n\tif (fwrite(&header, sizeof(header), 1, m_f) != 1)\n\t\treturn false;\n\tif (fwrite(name, sizeof(char), header.namelen, m_f) != header.namelen)\n\t\treturn false;\n\tif (fwrite(values, valueSize, valueCount, m_f) != valueCount)\n\t\treturn false;\n\n    return true;\n}\n\n\n}} // namespace OVR::Util\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Util/Util_MatFile.h",
    "content": "/************************************************************************************\n\nFilename    :   Util_MatFile.h\nContent     :   Matlab .MAT file access functions\nCreated     :   June 1, 2014\nAuthors     :   Neil Konzen\n\nCopyright   :   Copyright 2014 Oculus VR, Inc. All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Util_MatFile_h\n#define OVR_Util_MatFile_h\n\n#include \"Kernel/OVR_Types.h\"\n\n#include <stdint.h>\n#include <stdio.h>\n\n// Read and write MatLab .MAT data files, in MatLab Version 4 format\nnamespace OVR { namespace Util {\n\n\nclass MatFile\n{\npublic:\n\tMatFile();\n\t~MatFile(void);\n\n\tbool Open(const char* pszFile, bool write);\n\tvoid Close();\n\n\t// Matrix element value types\n    enum ValueType {\n        UnknownValue = 0,\n        ByteValue = 1,\n        UInt16Value = 2,\n        Int16Value = 3,\n        UInt32Value = 4,    // NOTE: Matlab -v4 don't support UInt32 directly: values stored as Int32.\n        Int32Value = 5,\n        FloatValue = 6,\n        DoubleValue = 7,\n        StringValue = 8\n    };\n\n\t// NOTE: A stored matrix is TRANSPOSED when read into MatLab\n    // MatLab uses Fortran column-major matrix storage conventions\n\n\t// Write a matrix, organized as rows x columns\n\t// Vectors should be written with 1 column: they will appear in Matlab as a 1-row matrix.\n\t// NOTE: this function reads StringValue matrices as an array of doubles (!)\n\tbool WriteMatrix(const char* name, const void* values, ValueType valueType, int rows, int cols);\n\n\tbool WriteMatrix(const char* name, const uint8_t* values, int rows, int cols = 1) { return WriteMatrix(name, values, ByteValue, rows, cols); }\n\tbool WriteMatrix(const char* name, const uint16_t* values, int rows, int cols = 1){ return WriteMatrix(name, values, UInt16Value, rows, cols); }\n\tbool WriteMatrix(const char* name, const int16_t* values, int rows, int cols = 1) { return WriteMatrix(name, values, Int16Value, rows, cols); }\n\tbool WriteMatrix(const char* name, const int32_t* values, int rows, int cols = 1) { return WriteMatrix(name, values, Int32Value, rows, cols); }\n\tbool WriteMatrix(const char* name, const float* values, int rows, int cols = 1)   { return WriteMatrix(name, values, FloatValue, rows, cols); }\n\tbool WriteMatrix(const char* name, const double* values, int rows, int cols = 1)  { return WriteMatrix(name, values, DoubleValue, rows, cols); }\n\tbool WriteString(const char* name, const char* value);\n\n    // NOTE: Matlab doesn't directly support uint32_t type: these values are saved and loaded as Int32Values\n    bool WriteMatrix(const char* name, const uint32_t* values, int rows, int cols = 1){ return WriteMatrix(name, values, Int32Value, rows, cols); }\n\n\tbool GetMatrixInfo(const char* name, ValueType& valueType, int& rows, int& cols);\n\n\tuint8_t*  ReadByteMatrix(const char* name, int& rows, int& cols)\t\t{ return (uint8_t*)ReadMatrix(name, ByteValue, rows, cols); }\n\tuint16_t* ReadUInt16Matrix(const char* name, int& rows, int& cols)\t    { return (uint16_t*)ReadMatrix(name, UInt16Value, rows, cols); }\n\tint16_t*  ReadInt16Matrix(const char* name, int& rows, int& cols)\t\t{ return (int16_t*)ReadMatrix(name, Int16Value, rows, cols); }\n\tint32_t*  ReadInt32Matrix(const char* name, int& rows, int& cols)\t\t{ return (int32_t*)ReadMatrix(name, Int32Value, rows, cols); }\n    float*    ReadFloatMatrix(const char* name, int& rows, int& cols)\t\t    { return (float*)ReadMatrix(name, FloatValue, rows, cols); }\n\tdouble*   ReadDoubleMatrix(const char* name, int& rows, int& cols)\t    { return (double*)ReadMatrix(name, DoubleValue, rows, cols); }\n\n    // NOTE: Matlab doesn't directly support uint32_t type: these values are saved and loaded as Int32Values\n    uint32_t* ReadUInt32Matrix(const char* name, int& rows, int& cols)\t\t{ return (uint32_t*)ReadMatrix(name, Int32Value, rows, cols); }\n\n\tint ReadString(const char* name, char* string, size_t maxStringSize);\n\n\t// Read matrix values. This function performs (some) data type conversions to specified valueType in cases where data is stored in .mat file as doubles.\n\tbool ReadMatrixValues(void* values, ValueType valueType, int rows, int cols);\n\nprivate:\n    static uint32_t GetMatlabType(ValueType valueType, size_t& valueSize);\t// returns Matlab FX_* type and size in bytes of data type element\n    static ValueType GetValueType(uint32_t matlabType, size_t& valueSize);\n\n\t// Read a matrix, organized as column-major rows x columns. Caller must delete returned vectors\n\tvoid* ReadMatrix(const char* name, ValueType valueType, int& rows, int& cols);\n\n\t// Read next matrix name, value type, and dimensions\n\tbool ReadMatrixInfo(char name[/*maxNameSize*/], size_t maxNameSize, ValueType& valueType, int& rows, int& cols);\n\n\tvoid* ConvertVector(void* fromValues, int valueCount, ValueType fromType, ValueType toType);\n\nprivate:\n\tFILE* m_f;\n};\n\n\n}}\t// namespace OVR::Util\n\n#endif // OVR_Util_MatFile_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Util/Util_Render_Stereo.cpp",
    "content": "/************************************************************************************\n\nFilename    :   Util_Render_Stereo.cpp\nContent     :   Stereo rendering configuration implementation\nCreated     :   October 22, 2012\nAuthors     :   Michael Antonov, Andrew Reisse, Tom Forsyth\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include \"Util_Render_Stereo.h\"\n\nnamespace OVR { namespace Util { namespace Render {\n\nusing namespace OVR::Vision;\n\n\n#if defined (OVR_CC_MSVC)\nstatic_assert(sizeof(DistortionMeshVertexData) == sizeof(ovrDistortionVertex), \"DistortionMeshVertexData size mismatch\");\n#endif\n\n//-----------------------------------------------------------------------------------\n// **** Useful debug functions.\n\nchar const* GetDebugNameEyeCupType ( EyeCupType eyeCupType )\n{\n    switch ( eyeCupType )\n    {\n    case EyeCup_DK1A:           return \"DK1 A\";\n    case EyeCup_DK1B:           return \"DK1 B\";\n    case EyeCup_DK1C:           return \"DK1 C\";\n    case EyeCup_DKHD2A:         return \"DKHD2 A\";\n    case EyeCup_OrangeA:        return \"Orange A\";\n    case EyeCup_RedA:           return \"Red A\";\n    case EyeCup_PinkA:          return \"Pink A\";\n    case EyeCup_BlueA:          return \"Blue A\";\n    case EyeCup_Delilah1A:      return \"Delilah 1 A\";\n    case EyeCup_Delilah2A:      return \"Delilah 2 A\";\n    case EyeCup_JamesA:         return \"James A\";\n    case EyeCup_SunMandalaA:    return \"Sun Mandala A\";\n    case EyeCup_DK2A:           return \"DK2 A\";\n    case EyeCup_BlackStar:      return \"BlackStar\";\n    case EyeCup_EVTProto:       return \"EVT A\";\n    case EyeCup_LAST:           return \"LAST\";\n    default: OVR_ASSERT ( false ); return \"Error\"; break;\n    }\n}\n\nchar const* GetDebugNameHmdType ( HmdTypeEnum hmdType )\n{\n    switch ( hmdType )\n    {\n    case HmdType_None:              return \"None\";\n    case HmdType_DK1:               return \"DK1\";\n    case HmdType_DKProto:           return \"DK1 prototype\";\n    case HmdType_DKHDProto:         return \"DK HD prototype 1\";\n    case HmdType_DKHDProto566Mi:    return \"DK HD prototype 566 Mi\";\n    case HmdType_DKHD2Proto:        return \"DK HD prototype 585\";\n    case HmdType_CrystalCoveProto:  return \"Crystal Cove\";\n    case HmdType_DK2:               return \"DK2\";\n    case HmdType_BlackStar:         return \"BlackStar\";\n    case HmdType_CB:                return \"Crescent Bay\";\n    case HmdType_Unknown:           return \"Unknown\";\n    case HmdType_LAST:              return \"LAST\";\n    default: OVR_ASSERT ( false );  return \"Error\";\n    }\n}\n\n\n//-----------------------------------------------------------------------------------\n// **** Internal pipeline functions.\n\nstruct DistortionAndFov\n{\n    DistortionRenderDesc    Distortion;\n    FovPort                 Fov;\n};\n\nstatic DistortionAndFov CalculateDistortionAndFovInternal ( StereoEye eyeType, HmdRenderInfo const &hmd,\n                                                            LensConfig const *pLensOverride = NULL,\n                                                            FovPort const *pTanHalfFovOverride = NULL,\n                                                            float extraEyeRotationInRadians = OVR_DEFAULT_EXTRA_EYE_ROTATION )\n{\n    // pLensOverride can be NULL, which means no override.\n\n    DistortionRenderDesc localDistortion  = CalculateDistortionRenderDesc ( eyeType, hmd, pLensOverride );\n    FovPort              fov              = CalculateFovFromHmdInfo ( eyeType, localDistortion, hmd, extraEyeRotationInRadians );\n    // Here the app or the user would optionally clamp this visible fov to a smaller number if\n    // they want more perf or resolution and are willing to give up FOV.\n    // They may also choose to clamp UDLR differently e.g. to get cinemascope-style views.\n    if ( pTanHalfFovOverride != NULL )\n    {\n        fov = *pTanHalfFovOverride;\n    }\n\n    // Here we could call ClampToPhysicalScreenFov(), but we do want people\n    // to be able to play with larger-than-screen views.\n    // The calling app can always do the clamping itself.\n    DistortionAndFov result;\n    result.Distortion = localDistortion;\n    result.Fov        = fov;\n\n    return result;\n}\n\n\nstatic Recti CalculateViewportInternal ( StereoEye eyeType,\n                                            Sizei const actualRendertargetSurfaceSize,\n                                            Sizei const requestedRenderedPixelSize,\n                                            bool bRendertargetSharedByBothEyes,\n                                            bool bMonoRenderingMode = false )\n{\n    Recti renderedViewport;\n    if ( bMonoRenderingMode || !bRendertargetSharedByBothEyes || (eyeType == StereoEye_Center) )\n    {\n        // One eye per RT.\n        renderedViewport.x = 0;\n        renderedViewport.y = 0;\n        renderedViewport.w = Alg::Min ( actualRendertargetSurfaceSize.w, requestedRenderedPixelSize.w );\n        renderedViewport.h = Alg::Min ( actualRendertargetSurfaceSize.h, requestedRenderedPixelSize.h );\n    }\n    else\n    {\n        // Both eyes share the RT.\n        renderedViewport.x = 0;\n        renderedViewport.y = 0;\n        renderedViewport.w = Alg::Min ( actualRendertargetSurfaceSize.w/2, requestedRenderedPixelSize.w );\n        renderedViewport.h = Alg::Min ( actualRendertargetSurfaceSize.h,  requestedRenderedPixelSize.h );\n        if ( eyeType == StereoEye_Right )\n        {\n            renderedViewport.x = (actualRendertargetSurfaceSize.w+1)/2;      // Round up, not down.\n        }\n    }\n    return renderedViewport;\n}\n\nstatic Recti CalculateViewportDensityInternal ( StereoEye eyeType,\n                                                   DistortionRenderDesc const &distortion,\n                                                   FovPort const &fov,\n                                                   Sizei const &actualRendertargetSurfaceSize,\n                                                   bool bRendertargetSharedByBothEyes,\n                                                   float desiredPixelDensity = 1.0f,\n                                                   bool bMonoRenderingMode = false )\n{\n    OVR_ASSERT ( actualRendertargetSurfaceSize.w > 0 );\n    OVR_ASSERT ( actualRendertargetSurfaceSize.h > 0 );\n\n    // What size RT do we need to get 1:1 mapping?\n    Sizei idealPixelSize = CalculateIdealPixelSize ( eyeType, distortion, fov, desiredPixelDensity );\n    // ...but we might not actually get that size.\n    return CalculateViewportInternal ( eyeType,\n                                       actualRendertargetSurfaceSize,\n                                       idealPixelSize,\n                                       bRendertargetSharedByBothEyes, bMonoRenderingMode );\n}\n\nstatic ViewportScaleAndOffset CalculateViewportScaleAndOffsetInternal (\n                                                          ScaleAndOffset2D const &eyeToSourceNDC,\n                                                          Recti const &renderedViewport,\n                                                          Sizei const &actualRendertargetSurfaceSize )\n{\n    ViewportScaleAndOffset result;\n    result.RenderedViewport = renderedViewport;\n    result.EyeToSourceUV = CreateUVScaleAndOffsetfromNDCScaleandOffset(\n                                            eyeToSourceNDC, renderedViewport, actualRendertargetSurfaceSize );\n    return result;\n}\n\n\nstatic StereoEyeParams CalculateStereoEyeParamsInternal ( StereoEye eyeType, HmdRenderInfo const &hmd,\n                                                          DistortionRenderDesc const &distortion,\n                                                          FovPort const &fov,\n                                                          Sizei const &actualRendertargetSurfaceSize,\n                                                          Recti const &renderedViewport,\n                                                          bool bRightHanded = true, bool isOpenGL = false,\n                                                          float zNear = 0.01f, float zFar = 10000.0f,\n                                                          bool bMonoRenderingMode = false,\n                                                          float zoomFactor = 1.0f )\n{\n    // Generate the projection matrix for intermediate rendertarget.\n    // Z range can also be inserted later by the app (though not in this particular case)\n    float fovScale = 1.0f / zoomFactor;\n    FovPort zoomedFov = fov;\n    zoomedFov.LeftTan  *= fovScale;\n    zoomedFov.RightTan *= fovScale;\n    zoomedFov.UpTan    *= fovScale;\n    zoomedFov.DownTan  *= fovScale;\n    Matrix4f projection = CreateProjection ( bRightHanded, isOpenGL, zoomedFov, eyeType, zNear, zFar );\n\n    // Find the mapping from TanAngle space to target NDC space.\n    // Note this does NOT take the zoom factor into account because\n    // this is the mapping of actual physical eye FOV (and our eyes do not zoom!)\n    // to screen space.\n    ScaleAndOffset2D eyeToSourceNDC = CreateNDCScaleAndOffsetFromFov ( fov );\n\n    // The size of the final FB, which is fixed and determined by the physical size of the device display.\n    Recti distortedViewport   = GetFramebufferViewport ( eyeType, hmd );\n    Vector3f virtualCameraOffset = CalculateEyeVirtualCameraOffset(hmd, eyeType, bMonoRenderingMode);\n\n    StereoEyeParams result;\n    result.Eye                  = eyeType;\n    result.HmdToEyeViewOffset   = Matrix4f::Translation(virtualCameraOffset);\n    result.Distortion           = distortion;\n    result.DistortionViewport   = distortedViewport;\n    result.Fov                  = fov;\n    result.RenderedProjection   = projection;\n    result.EyeToSourceNDC       = eyeToSourceNDC;\n    ViewportScaleAndOffset vsao = CalculateViewportScaleAndOffsetInternal ( eyeToSourceNDC, renderedViewport, actualRendertargetSurfaceSize );\n    result.RenderedViewport     = vsao.RenderedViewport;\n    result.EyeToSourceUV        = vsao.EyeToSourceUV;\n\n    return result;\n}\n\n\nVector3f CalculateEyeVirtualCameraOffset(HmdRenderInfo const &hmd,\n                                         StereoEye eyeType, bool bmonoRenderingMode)\n{\n    Vector3f virtualCameraOffset(0);\n\n    if (!bmonoRenderingMode)\n    {\n        float eyeCenterRelief = hmd.GetEyeCenter().ReliefInMeters;\n\n        if (eyeType == StereoEye_Left)\n        {\n            virtualCameraOffset.x = hmd.EyeLeft.NoseToPupilInMeters;\n            virtualCameraOffset.z = eyeCenterRelief - hmd.EyeLeft.ReliefInMeters;\n        }\n        else if (eyeType == StereoEye_Right)\n        {\n            virtualCameraOffset.x = -hmd.EyeRight.NoseToPupilInMeters;\n            virtualCameraOffset.z = eyeCenterRelief - hmd.EyeRight.ReliefInMeters;\n        }\n    }\n\n    return virtualCameraOffset;\n}\n\n\n//-----------------------------------------------------------------------------------\n// **** Higher-level utility functions.\n\nSizei CalculateRecommendedTextureSize ( HmdRenderInfo const &hmd,\n                                        bool bRendertargetSharedByBothEyes,\n                                        float pixelDensityInCenter /*= 1.0f*/ )\n{\n    Sizei idealPixelSize[2];\n    for ( int eyeNum = 0; eyeNum < 2; eyeNum++ )\n    {\n        StereoEye eyeType = ( eyeNum == 0 ) ? StereoEye_Left : StereoEye_Right;\n\n        DistortionAndFov distortionAndFov = CalculateDistortionAndFovInternal ( eyeType, hmd, NULL, NULL, OVR_DEFAULT_EXTRA_EYE_ROTATION );\n\n        idealPixelSize[eyeNum] = CalculateIdealPixelSize ( eyeType,\n                                        distortionAndFov.Distortion,\n                                        distortionAndFov.Fov,\n                                        pixelDensityInCenter );\n    }\n\n    Sizei result;\n    result.w = Alg::Max ( idealPixelSize[0].w, idealPixelSize[1].w );\n    result.h = Alg::Max ( idealPixelSize[0].h, idealPixelSize[1].h );\n    if ( bRendertargetSharedByBothEyes )\n    {\n        result.w *= 2;\n    }\n    return result;\n}\n\nStereoEyeParams CalculateStereoEyeParams ( HmdRenderInfo const &hmd,\n                                           StereoEye eyeType,\n                                           Sizei const &actualRendertargetSurfaceSize,\n                                           bool bRendertargetSharedByBothEyes,\n                                           bool bRightHanded /*= true*/,\n                                           bool bOpenGL /*= false*/,\n                                           float zNear /*= 0.01f*/, float zFar /*= 10000.0f*/,\n\t\t\t\t\t\t\t\t\t\t   Sizei const *pOverrideRenderedPixelSize /* = NULL*/,\n                                           FovPort const *pOverrideFovport /*= NULL*/,\n                                           float zoomFactor /*= 1.0f*/ )\n{\n    DistortionAndFov distortionAndFov = CalculateDistortionAndFovInternal ( eyeType, hmd, NULL, NULL, OVR_DEFAULT_EXTRA_EYE_ROTATION );\n    if ( pOverrideFovport != NULL )\n    {\n        distortionAndFov.Fov = *pOverrideFovport;\n    }\n\n    Recti viewport;\n    if ( pOverrideRenderedPixelSize != NULL )\n    {\n        viewport = CalculateViewportInternal ( eyeType, actualRendertargetSurfaceSize, *pOverrideRenderedPixelSize, bRendertargetSharedByBothEyes, false );\n    }\n    else\n    {\n        viewport = CalculateViewportDensityInternal ( eyeType,\n                                                      distortionAndFov.Distortion,\n                                                      distortionAndFov.Fov,\n                                                      actualRendertargetSurfaceSize, bRendertargetSharedByBothEyes, 1.0f, false );\n    }\n\n    return CalculateStereoEyeParamsInternal (\n                                eyeType, hmd,\n                                distortionAndFov.Distortion,\n                                distortionAndFov.Fov,\n                                actualRendertargetSurfaceSize, viewport,\n                                bRightHanded, bOpenGL, zNear, zFar, false, zoomFactor );\n}\n\n\nFovPort CalculateRecommendedFov ( HmdRenderInfo const &hmd,\n                                  StereoEye eyeType,\n                                  bool bMakeFovSymmetrical /* = false */ )\n{\n    DistortionAndFov distortionAndFov = CalculateDistortionAndFovInternal ( eyeType, hmd, NULL, NULL, OVR_DEFAULT_EXTRA_EYE_ROTATION );\n    FovPort fov = distortionAndFov.Fov;\n    if ( bMakeFovSymmetrical )\n    {\n        // Deal with engines that cannot support an off-center projection.\n        // Unfortunately this means they will be rendering pixels that the user can't actually see.\n        float fovTanH = Alg::Max ( fov.LeftTan, fov.RightTan );\n        float fovTanV = Alg::Max ( fov.UpTan, fov.DownTan );\n        fov.LeftTan = fovTanH;\n        fov.RightTan = fovTanH;\n        fov.UpTan = fovTanV;\n        fov.DownTan = fovTanV;\n    }\n    return fov;\n}\n\nViewportScaleAndOffset ModifyRenderViewport ( StereoEyeParams const &params,\n                                              Sizei const &actualRendertargetSurfaceSize,\n                                              Recti const &renderViewport )\n{\n    return CalculateViewportScaleAndOffsetInternal ( params.EyeToSourceNDC, renderViewport, actualRendertargetSurfaceSize );\n}\n\nViewportScaleAndOffset ModifyRenderSize ( StereoEyeParams const &params,\n                                          Sizei const &actualRendertargetSurfaceSize,\n                                          Sizei const &requestedRenderSize,\n                                          bool bRendertargetSharedByBothEyes /*= false*/ )\n{\n    Recti renderViewport = CalculateViewportInternal ( params.Eye, actualRendertargetSurfaceSize, requestedRenderSize, bRendertargetSharedByBothEyes, false );\n    return CalculateViewportScaleAndOffsetInternal ( params.EyeToSourceNDC, renderViewport, actualRendertargetSurfaceSize );\n}\n\nViewportScaleAndOffset ModifyRenderDensity ( StereoEyeParams const &params,\n                                             Sizei const &actualRendertargetSurfaceSize,\n                                             float pixelDensity /*= 1.0f*/,\n                                             bool bRendertargetSharedByBothEyes /*= false*/ )\n{\n    Recti renderViewport = CalculateViewportDensityInternal ( params.Eye, params.Distortion, params.Fov, actualRendertargetSurfaceSize, bRendertargetSharedByBothEyes, pixelDensity, false );\n    return CalculateViewportScaleAndOffsetInternal ( params.EyeToSourceNDC, renderViewport, actualRendertargetSurfaceSize );\n}\n\n\n//-----------------------------------------------------------------------------------\n// **** StereoConfig Implementation\n\nStereoConfig::StereoConfig(StereoMode mode)\n    : Mode(mode),\n      DirtyFlag(true)\n{\n    // Initialize \"fake\" default HMD values for testing without HMD plugged in.\n    // These default values match those returned by DK1\n    // (at least they did at time of writing - certainly good enough for debugging)\n    Hmd.HmdType                                         = HmdType_None;\n    Hmd.ResolutionInPixels                              = Sizei(1280, 800);\n    Hmd.ScreenSizeInMeters                              = Sizef(0.1498f, 0.0936f);\n    Hmd.ScreenGapSizeInMeters                           = 0.0f;\n    Hmd.PelOffsetR                                      = Vector2f ( 0.0f, 0.0f );\n    Hmd.PelOffsetB                                      = Vector2f ( 0.0f, 0.0f );\n    Hmd.CenterFromTopInMeters                           = 0.0468f;\n    Hmd.LensSeparationInMeters                          = 0.0635f;\n    Hmd.LensDiameterInMeters                            = 0.035f;\n    Hmd.LensSurfaceToMidplateInMeters                   = 0.025f;\n    Hmd.EyeCups                                         = EyeCup_DK1A;\n    Hmd.Shutter.Type                                    = HmdShutter_RollingTopToBottom;\n    Hmd.Shutter.VsyncToNextVsync                        = ( 1.0f / 60.0f );\n    Hmd.Shutter.VsyncToFirstScanline                    = 0.000052f;\n    Hmd.Shutter.FirstScanlineToLastScanline             = 0.016580f;\n    Hmd.Shutter.PixelSettleTime                         = 0.015f;\n    Hmd.Shutter.PixelPersistence                        = ( 1.0f / 60.0f );\n    Hmd.EyeLeft.Distortion.SetToIdentity();\n    Hmd.EyeLeft.Distortion.MetersPerTanAngleAtCenter    = 0.043875f;\n    Hmd.EyeLeft.Distortion.Eqn                          = Distortion_RecipPoly4;\n    Hmd.EyeLeft.Distortion.K[0]                         = 1.0f;\n    Hmd.EyeLeft.Distortion.K[1]                         = -0.3999f;\n    Hmd.EyeLeft.Distortion.K[2]                         = 0.2408f;\n    Hmd.EyeLeft.Distortion.K[3]                         = -0.4589f;\n    Hmd.EyeLeft.Distortion.MaxR                         = 1.0f;\n\tHmd.EyeLeft.Distortion.ChromaticAberration[0]\t\t= 0.006f;\n\tHmd.EyeLeft.Distortion.ChromaticAberration[1]\t\t= 0.0f;\n\tHmd.EyeLeft.Distortion.ChromaticAberration[2]\t\t= -0.014f;\n\tHmd.EyeLeft.Distortion.ChromaticAberration[3]\t\t= 0.0f;\n    Hmd.EyeLeft.NoseToPupilInMeters                     = 0.62f;\n    Hmd.EyeLeft.ReliefInMeters                          = 0.013f;\n    Hmd.EyeRight = Hmd.EyeLeft;\n\n    SetViewportMode = SVPM_Density;\n    SetViewportPixelsPerDisplayPixel = 1.0f;\n    // Not used in this mode, but init them anyway.\n    SetViewportSize[0] = Sizei(0,0);\n    SetViewportSize[1] = Sizei(0,0);\n    SetViewport[0] = Recti(0,0,0,0);\n    SetViewport[1] = Recti(0,0,0,0);\n\n    OverrideLens = false;\n    OverrideTanHalfFov = false;\n    OverrideZeroIpd = false;\n    ExtraEyeRotationInRadians = OVR_DEFAULT_EXTRA_EYE_ROTATION;\n    IsRendertargetSharedByBothEyes = true;\n    RightHandedProjection = true;\n    UsingOpenGL = false;\n\n    // This should cause an assert if the app does not call SetRendertargetSize()\n    RendertargetSize = Sizei ( 0, 0 );\n\n    ZNear = 0.01f;\n    ZFar = 10000.0f;\n\n    Set2DAreaFov(DegreeToRad(85.0f));\n}\n\nvoid StereoConfig::SetHmdRenderInfo(const HmdRenderInfo& hmd)\n{\n    Hmd = hmd;\n    DirtyFlag = true;\n}\n\nvoid StereoConfig::Set2DAreaFov(float fovRadians)\n{\n    Area2DFov = fovRadians;\n    DirtyFlag = true;\n}\n\nconst StereoEyeParamsWithOrtho& StereoConfig::GetEyeRenderParams(StereoEye eye)\n{\n    if ( DirtyFlag )\n    {\n        UpdateComputedState();\n    }\n\n    static const uint8_t eyeParamIndices[3] = { 0, 0, 1 };\n\n    OVR_ASSERT(eye < sizeof(eyeParamIndices));\n    return EyeRenderParams[eyeParamIndices[eye]];\n}\n\nvoid StereoConfig::SetLensOverride ( LensConfig const *pLensOverrideLeft  /*= NULL*/,\n                                     LensConfig const *pLensOverrideRight /*= NULL*/ )\n{\n    if ( pLensOverrideLeft == NULL )\n    {\n        OverrideLens = false;\n    }\n    else\n    {\n        OverrideLens = true;\n        LensOverrideLeft = *pLensOverrideLeft;\n        LensOverrideRight = *pLensOverrideLeft;\n        if ( pLensOverrideRight != NULL )\n        {\n            LensOverrideRight = *pLensOverrideRight;\n        }\n    }\n    DirtyFlag = true;\n}\n\nvoid StereoConfig::SetRendertargetSize (Size<int> const rendertargetSize,\n                                        bool rendertargetIsSharedByBothEyes )\n{\n    RendertargetSize = rendertargetSize;\n    IsRendertargetSharedByBothEyes = rendertargetIsSharedByBothEyes;\n    DirtyFlag = true;\n}\n\nvoid StereoConfig::SetFov ( FovPort const *pfovLeft  /*= NULL*/,\n                            FovPort const *pfovRight /*= NULL*/ )\n{\n    DirtyFlag = true;\n    if ( pfovLeft == NULL )\n    {\n        OverrideTanHalfFov = false;\n    }\n    else\n    {\n        OverrideTanHalfFov = true;\n        FovOverrideLeft  = *pfovLeft;\n        FovOverrideRight = *pfovLeft;\n        if ( pfovRight != NULL )\n        {\n            FovOverrideRight = *pfovRight;\n        }\n    }\n}\n\n\nvoid StereoConfig::SetZeroVirtualIpdOverride ( bool enableOverride )\n{\n    DirtyFlag = true;\n    OverrideZeroIpd = enableOverride;\n}\n\n\nvoid StereoConfig::SetZClipPlanesAndHandedness ( float zNear /*= 0.01f*/, float zFar /*= 10000.0f*/,\n                                                 bool rightHandedProjection /*= true*/, bool isOpenGL /*= false*/ )\n{\n    DirtyFlag = true;\n    ZNear = zNear;\n    ZFar = zFar;\n    RightHandedProjection = rightHandedProjection;\n    UsingOpenGL = isOpenGL;\n}\n\nvoid StereoConfig::SetExtraEyeRotation ( float extraEyeRotationInRadians )\n{\n    DirtyFlag = true;\n    ExtraEyeRotationInRadians = extraEyeRotationInRadians;\n}\n\nSizei StereoConfig::CalculateRecommendedTextureSize ( bool rendertargetSharedByBothEyes,\n                                                      float pixelDensityInCenter /*= 1.0f*/ )\n{\n    return Render::CalculateRecommendedTextureSize ( Hmd, rendertargetSharedByBothEyes, pixelDensityInCenter );\n}\n\n\n\nvoid StereoConfig::UpdateComputedState()\n{\n    int numEyes = 2;\n    StereoEye eyeTypes[2];\n\n    switch ( Mode )\n    {\n    case Stereo_None:\n        numEyes         = 1;\n        eyeTypes[0]     = StereoEye_Center;\n        break;\n\n    case Stereo_LeftRight_Multipass:\n        numEyes         = 2;\n        eyeTypes[0]     = StereoEye_Left;\n        eyeTypes[1]     = StereoEye_Right;\n        break;\n\n    default:\n        numEyes = 0;\n        OVR_ASSERT( false );\n        break;\n    }\n\n    // If either of these fire, you've probably forgotten to call SetRendertargetSize()\n    OVR_ASSERT ( RendertargetSize.w > 0 );\n    OVR_ASSERT ( RendertargetSize.h > 0 );\n\n    for ( int eyeNum = 0; eyeNum < numEyes; eyeNum++ )\n    {\n        StereoEye eyeType = eyeTypes[eyeNum];\n        LensConfig *pLensOverride = NULL;\n        if ( OverrideLens )\n        {\n            if ( eyeType == StereoEye_Right )\n            {\n                pLensOverride = &LensOverrideRight;\n            }\n            else\n            {\n                pLensOverride = &LensOverrideLeft;\n            }\n        }\n\n        FovPort *pTanHalfFovOverride = NULL;\n        if ( OverrideTanHalfFov )\n        {\n            if ( eyeType == StereoEye_Right )\n            {\n                pTanHalfFovOverride = &FovOverrideRight;\n            }\n            else\n            {\n                pTanHalfFovOverride = &FovOverrideLeft;\n            }\n        }\n\n        DistortionAndFov distortionAndFov =\n            CalculateDistortionAndFovInternal ( eyeType, Hmd,\n                                                pLensOverride, pTanHalfFovOverride,\n                                                ExtraEyeRotationInRadians );\n\n        EyeRenderParams[eyeNum].StereoEye.Distortion = distortionAndFov.Distortion;\n        EyeRenderParams[eyeNum].StereoEye.Fov        = distortionAndFov.Fov;\n    }\n\n    if ( OverrideZeroIpd )\n    {\n        // Take the union of the calculated eye FOVs.\n        FovPort fov;\n        fov.UpTan    = Alg::Max ( EyeRenderParams[0].StereoEye.Fov.UpTan   , EyeRenderParams[1].StereoEye.Fov.UpTan    );\n        fov.DownTan  = Alg::Max ( EyeRenderParams[0].StereoEye.Fov.DownTan , EyeRenderParams[1].StereoEye.Fov.DownTan  );\n        fov.LeftTan  = Alg::Max ( EyeRenderParams[0].StereoEye.Fov.LeftTan , EyeRenderParams[1].StereoEye.Fov.LeftTan  );\n        fov.RightTan = Alg::Max ( EyeRenderParams[0].StereoEye.Fov.RightTan, EyeRenderParams[1].StereoEye.Fov.RightTan );\n        EyeRenderParams[0].StereoEye.Fov = fov;\n        EyeRenderParams[1].StereoEye.Fov = fov;\n    }\n\n    for ( int eyeNum = 0; eyeNum < numEyes; eyeNum++ )\n    {\n        StereoEye eyeType = eyeTypes[eyeNum];\n\n        DistortionRenderDesc localDistortion = EyeRenderParams[eyeNum].StereoEye.Distortion;\n        FovPort              fov             = EyeRenderParams[eyeNum].StereoEye.Fov;\n\n        // Use a placeholder - will be overridden later.\n        Recti tempViewport = Recti ( 0, 0, 1, 1 );\n\n        EyeRenderParams[eyeNum].StereoEye = CalculateStereoEyeParamsInternal (\n                                        eyeType, Hmd, localDistortion, fov,\n                                        RendertargetSize, tempViewport,\n                                        RightHandedProjection, UsingOpenGL, ZNear, ZFar,\n                                        OverrideZeroIpd );\n\n        // We want to create a virtual 2D surface we can draw debug text messages to.\n        // We'd like it to be a fixed distance (OrthoDistance) away,\n        // and to cover a specific FOV (Area2DFov). We need to find the projection matrix for this,\n        // and also to know how large it is in pixels to achieve a 1:1 mapping at the center of the screen.\n        float orthoDistance = 0.8f;\n        float orthoHalfFov = tanf ( Area2DFov * 0.5f );\n        Vector2f unityOrthoPixelSize = localDistortion.PixelsPerTanAngleAtCenter * ( orthoHalfFov * 2.0f );\n        float localInterpupillaryDistance = Hmd.EyeLeft.NoseToPupilInMeters + Hmd.EyeRight.NoseToPupilInMeters;\n        if ( OverrideZeroIpd )\n        {\n            localInterpupillaryDistance = 0.0f;\n        }\n        Matrix4f ortho = CreateOrthoSubProjection ( true, eyeType,\n                                                    orthoHalfFov, orthoHalfFov,\n                                                    unityOrthoPixelSize.x, unityOrthoPixelSize.y,\n                                                    orthoDistance, localInterpupillaryDistance,\n                                                    EyeRenderParams[eyeNum].StereoEye.RenderedProjection );\n        EyeRenderParams[eyeNum].OrthoProjection = ortho;\n    }\n\n    // ...and now set up the viewport, scale & offset the way the app wanted.\n    setupViewportScaleAndOffsets();\n\n    if ( OverrideZeroIpd )\n    {\n        // Monocular rendering has some fragile parts... don't break any by accident.\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.Fov.UpTan                   == EyeRenderParams[1].StereoEye.Fov.UpTan    );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.Fov.DownTan                 == EyeRenderParams[1].StereoEye.Fov.DownTan  );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.Fov.LeftTan                 == EyeRenderParams[1].StereoEye.Fov.LeftTan  );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.Fov.RightTan                == EyeRenderParams[1].StereoEye.Fov.RightTan );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.RenderedProjection.M[0][0]  == EyeRenderParams[1].StereoEye.RenderedProjection.M[0][0] );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.RenderedProjection.M[1][1]  == EyeRenderParams[1].StereoEye.RenderedProjection.M[1][1] );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.RenderedProjection.M[0][2]  == EyeRenderParams[1].StereoEye.RenderedProjection.M[0][2] );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.RenderedProjection.M[1][2]  == EyeRenderParams[1].StereoEye.RenderedProjection.M[1][2] );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.RenderedViewport            == EyeRenderParams[1].StereoEye.RenderedViewport      );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.EyeToSourceUV.Offset        == EyeRenderParams[1].StereoEye.EyeToSourceUV.Offset  );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.EyeToSourceUV.Scale         == EyeRenderParams[1].StereoEye.EyeToSourceUV.Scale   );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.EyeToSourceNDC.Offset       == EyeRenderParams[1].StereoEye.EyeToSourceNDC.Offset );\n        OVR_ASSERT ( EyeRenderParams[0].StereoEye.EyeToSourceNDC.Scale        == EyeRenderParams[1].StereoEye.EyeToSourceNDC.Scale  );\n        OVR_ASSERT ( EyeRenderParams[0].OrthoProjection.M[0][0]               == EyeRenderParams[1].OrthoProjection.M[0][0] );\n        OVR_ASSERT ( EyeRenderParams[0].OrthoProjection.M[1][1]               == EyeRenderParams[1].OrthoProjection.M[1][1] );\n        OVR_ASSERT ( EyeRenderParams[0].OrthoProjection.M[0][2]               == EyeRenderParams[1].OrthoProjection.M[0][2] );\n        OVR_ASSERT ( EyeRenderParams[0].OrthoProjection.M[1][2]               == EyeRenderParams[1].OrthoProjection.M[1][2] );\n    }\n\n    DirtyFlag = false;\n}\n\n\n\nViewportScaleAndOffsetBothEyes StereoConfig::setupViewportScaleAndOffsets()\n{\n    for ( int eyeNum = 0; eyeNum < 2; eyeNum++ )\n    {\n        StereoEye eyeType = ( eyeNum == 0 ) ? StereoEye_Left : StereoEye_Right;\n\n        DistortionRenderDesc localDistortion = EyeRenderParams[eyeNum].StereoEye.Distortion;\n        FovPort              fov             = EyeRenderParams[eyeNum].StereoEye.Fov;\n\n        Recti renderedViewport;\n        switch ( SetViewportMode )\n        {\n        case SVPM_Density:\n            renderedViewport = CalculateViewportDensityInternal (\n                                    eyeType, localDistortion, fov,\n                                    RendertargetSize, IsRendertargetSharedByBothEyes,\n                                    SetViewportPixelsPerDisplayPixel, OverrideZeroIpd );\n            break;\n        case SVPM_Size:\n            if ( ( eyeType == StereoEye_Right ) && !OverrideZeroIpd )\n            {\n                renderedViewport = CalculateViewportInternal (\n                                        eyeType, RendertargetSize,\n                                        SetViewportSize[1],\n                                        IsRendertargetSharedByBothEyes, OverrideZeroIpd );\n            }\n            else\n            {\n                renderedViewport = CalculateViewportInternal (\n                                        eyeType, RendertargetSize,\n                                        SetViewportSize[0],\n                                        IsRendertargetSharedByBothEyes, OverrideZeroIpd );\n            }\n            break;\n        case SVPM_Viewport:\n            if ( ( eyeType == StereoEye_Right ) && !OverrideZeroIpd )\n            {\n                renderedViewport = SetViewport[1];\n            }\n            else\n            {\n                renderedViewport = SetViewport[0];\n            }\n            break;\n        default: OVR_ASSERT ( false ); break;\n        }\n\n        ViewportScaleAndOffset vpsao = CalculateViewportScaleAndOffsetInternal (\n                                                EyeRenderParams[eyeNum].StereoEye.EyeToSourceNDC,\n                                                renderedViewport,\n                                                RendertargetSize );\n        EyeRenderParams[eyeNum].StereoEye.RenderedViewport = vpsao.RenderedViewport;\n        EyeRenderParams[eyeNum].StereoEye.EyeToSourceUV    = vpsao.EyeToSourceUV;\n    }\n\n    ViewportScaleAndOffsetBothEyes result;\n    result.Left.EyeToSourceUV     = EyeRenderParams[0].StereoEye.EyeToSourceUV;\n    result.Left.RenderedViewport  = EyeRenderParams[0].StereoEye.RenderedViewport;\n    result.Right.EyeToSourceUV    = EyeRenderParams[1].StereoEye.EyeToSourceUV;\n    result.Right.RenderedViewport = EyeRenderParams[1].StereoEye.RenderedViewport;\n    return result;\n}\n\n// Specify a pixel density - how many rendered pixels per pixel in the physical display.\nViewportScaleAndOffsetBothEyes StereoConfig::SetRenderDensity ( float pixelsPerDisplayPixel )\n{\n    SetViewportMode  = SVPM_Density;\n    SetViewportPixelsPerDisplayPixel = pixelsPerDisplayPixel;\n    return setupViewportScaleAndOffsets();\n}\n\n// Supply the size directly. Will be clamped to the physical rendertarget size.\nViewportScaleAndOffsetBothEyes StereoConfig::SetRenderSize ( Sizei const &renderSizeLeft, Sizei const &renderSizeRight )\n{\n    SetViewportMode  = SVPM_Size;\n    SetViewportSize[0] = renderSizeLeft;\n    SetViewportSize[1] = renderSizeRight;\n    return setupViewportScaleAndOffsets();\n}\n\n// Supply the viewport directly. This is not clamped to the physical rendertarget - careful now!\nViewportScaleAndOffsetBothEyes StereoConfig::SetRenderViewport ( Recti const &renderViewportLeft, Recti const &renderViewportRight )\n{\n    SetViewportMode  = SVPM_Viewport;\n    SetViewport[0] = renderViewportLeft;\n    SetViewport[1] = renderViewportRight;\n    return setupViewportScaleAndOffsets();\n}\n\nMatrix4f StereoConfig::GetProjectionWithZoom ( StereoEye eye, float fovZoom ) const\n{\n    int eyeNum = ( eye == StereoEye_Right ) ? 1 : 0;\n    float fovScale = 1.0f / fovZoom;\n    FovPort fovPort = EyeRenderParams[eyeNum].StereoEye.Fov;\n    fovPort.LeftTan  *= fovScale;\n    fovPort.RightTan *= fovScale;\n    fovPort.UpTan    *= fovScale;\n    fovPort.DownTan  *= fovScale;\n    return CreateProjection ( RightHandedProjection, UsingOpenGL, fovPort, eye, ZNear, ZFar );\n}\n\n\n\n\n//-----------------------------------------------------------------------------------\n// *****  Distortion Mesh Rendering\n\n\n// Pow2 for the Morton order to work!\n// 4 is too low - it is easy to see the \"wobbles\" in the HMD.\n// 5 is realllly close but you can see pixel differences with even/odd frame checking.\n// 6 is indistinguishable on a monitor on even/odd frames.\nstatic const int DMA_GridSizeLog2   = 6;\nstatic const int DMA_GridSize       = 1<<DMA_GridSizeLog2;\nstatic const int DMA_NumVertsPerEye = (DMA_GridSize+1)*(DMA_GridSize+1);\nstatic const int DMA_NumTrisPerEye  = (DMA_GridSize)*(DMA_GridSize)*2;\n\n\n\nDistortionMeshVertexData DistortionMeshMakeVertex ( Vector2f screenNDC,\n                                                    bool rightEye,\n                                                    const HmdRenderInfo &hmdRenderInfo,\n                                                    const DistortionRenderDesc &distortion, const ScaleAndOffset2D &eyeToSourceNDC )\n{\n    DistortionMeshVertexData result;\n\n    Vector2f tanEyeAnglesR, tanEyeAnglesG, tanEyeAnglesB;\n    TransformScreenNDCToTanFovSpaceChroma ( &tanEyeAnglesR, &tanEyeAnglesG, &tanEyeAnglesB,\n                                            distortion, screenNDC );\n\n\tresult.TanEyeAnglesR = tanEyeAnglesR;\n\tresult.TanEyeAnglesG = tanEyeAnglesG;\n\tresult.TanEyeAnglesB = tanEyeAnglesB;\n\n    HmdShutterTypeEnum shutterType = hmdRenderInfo.Shutter.Type;\n    switch ( shutterType )\n    {\n    case HmdShutter_Global:\n        result.TimewarpLerp = 0.0f;\n        break;\n    case HmdShutter_RollingLeftToRight:\n        // Retrace is left to right - left eye goes 0.0 -> 0.5, then right goes 0.5 -> 1.0\n        result.TimewarpLerp = screenNDC.x * 0.25f + 0.25f;\n        if (rightEye)\n        {\n            result.TimewarpLerp += 0.5f;\n        }\n        break;\n    case HmdShutter_RollingRightToLeft:\n        // Retrace is right to left - right eye goes 0.0 -> 0.5, then left goes 0.5 -> 1.0\n        result.TimewarpLerp = 0.75f - screenNDC.x * 0.25f;\n        if (rightEye)\n        {\n            result.TimewarpLerp -= 0.5f;\n        }\n        break;\n    case HmdShutter_RollingTopToBottom:\n        // Retrace is top to bottom on both eyes at the same time.\n        result.TimewarpLerp = screenNDC.y * 0.5f + 0.5f;\n        break;\n    default: OVR_ASSERT ( false ); break;\n    }\n\n    // When does the fade-to-black edge start? Chosen heuristically.\n    float fadeOutBorderFractionTexture = 0.1f;\n    float fadeOutBorderFractionTextureInnerEdge = 0.1f;\n    float fadeOutBorderFractionScreen = 0.1f;\n    float fadeOutFloor = 0.6f;        // the floor controls how much black is in the fade region\n\n    if (hmdRenderInfo.HmdType == HmdType_DK1)\n    {\n        fadeOutBorderFractionTexture = 0.3f;\n        fadeOutBorderFractionTextureInnerEdge = 0.075f;\n        fadeOutBorderFractionScreen = 0.075f;\n        fadeOutFloor = 0.25f;\n    }\n\n    // Fade out at texture edges.\n    // The furthest out will be the blue channel, because of chromatic aberration (true of any standard lens)\n    Vector2f sourceTexCoordBlueNDC = TransformTanFovSpaceToRendertargetNDC ( eyeToSourceNDC, tanEyeAnglesB );\n\tif (rightEye)\n\t{\n\t\t// The inner edge of the eye texture is usually much more magnified, because it's right against the middle of the screen, not the FOV edge.\n\t\t// So we want a different scaling factor for that. This code flips the texture NDC so that +1.0 is the inner edge\n\t\tsourceTexCoordBlueNDC.x = -sourceTexCoordBlueNDC.x;\n\t}\n    float edgeFadeIn               = ( 1.0f / fadeOutBorderFractionTextureInnerEdge ) * ( 1.0f - sourceTexCoordBlueNDC.x )  ;   // Inner\n    edgeFadeIn       = Alg::Min ( edgeFadeIn, ( 1.0f / fadeOutBorderFractionTexture ) * ( 1.0f + sourceTexCoordBlueNDC.x ) );   // Outer\n    edgeFadeIn       = Alg::Min ( edgeFadeIn, ( 1.0f / fadeOutBorderFractionTexture ) * ( 1.0f - sourceTexCoordBlueNDC.y ) );   // Upper\n    edgeFadeIn       = Alg::Min ( edgeFadeIn, ( 1.0f / fadeOutBorderFractionTexture ) * ( 1.0f + sourceTexCoordBlueNDC.y ) );   // Lower\n\n    // Also fade out at screen edges. Since this is in pixel space, no need to do inner specially.\n    float edgeFadeInScreen = ( 1.0f / fadeOutBorderFractionScreen ) *\n                             ( 1.0f - Alg::Max ( Alg::Abs ( screenNDC.x ), Alg::Abs ( screenNDC.y ) ) );\n    edgeFadeIn = Alg::Min ( edgeFadeInScreen, edgeFadeIn ) + fadeOutFloor;\n\n\t// Note - this is NOT clamped negatively.\n\t// For rendering methods that interpolate over a coarse grid, we need the values to go negative for correct intersection with zero.\n    result.Shade = Alg::Min ( edgeFadeIn, 1.0f );\n\n    float eyeOffset = rightEye ? 1.0f : 0.0f;\n    float xOffset = 0.5f * screenNDC.x - 0.5f + eyeOffset;\n    float yOffset = -screenNDC.y;\n\n    // Rotate the mesh to match screen orientation.\n    if (hmdRenderInfo.Rotation == 270)\n    {\n        result.ScreenPosNDC.x = -yOffset;\n        result.ScreenPosNDC.y = xOffset;\n    }\n    else if (hmdRenderInfo.Rotation == 0)\n    {\n        result.ScreenPosNDC.x = xOffset;\n        result.ScreenPosNDC.y = yOffset;\n    }\n    else if (hmdRenderInfo.Rotation == 180)\n    {\n        result.ScreenPosNDC.x = -xOffset;\n        result.ScreenPosNDC.y = -yOffset;\n    }\n    else if (hmdRenderInfo.Rotation == 90)\n    {\n        result.ScreenPosNDC.x = yOffset;\n        result.ScreenPosNDC.y = -xOffset;\n    }\n\n    return result;\n}\n\n\nvoid DistortionMeshDestroy ( DistortionMeshVertexData *pVertices, uint16_t *pTriangleMeshIndices )\n{\n    OVR_FREE ( pVertices );\n    OVR_FREE ( pTriangleMeshIndices );\n}\n\nvoid DistortionMeshCreate ( DistortionMeshVertexData **ppVertices, uint16_t **ppTriangleListIndices,\n                            int *pNumVertices, int *pNumTriangles,\n                            const StereoEyeParams &stereoParams, const HmdRenderInfo &hmdRenderInfo )\n{\n    bool    rightEye      = ( stereoParams.Eye == StereoEye_Right );\n    int     vertexCount   = 0;\n    int     triangleCount = 0;\n\n    // Generate mesh into allocated data and return result.\n    DistortionMeshCreate(ppVertices, ppTriangleListIndices, &vertexCount, &triangleCount,\n                         rightEye, hmdRenderInfo, stereoParams.Distortion, stereoParams.EyeToSourceNDC);\n\n    *pNumVertices  = vertexCount;\n    *pNumTriangles = triangleCount;\n}\n\n\n// Generate distortion mesh for a eye.\nvoid DistortionMeshCreate( DistortionMeshVertexData **ppVertices, uint16_t **ppTriangleListIndices,\n                           int *pNumVertices, int *pNumTriangles,\n                           bool rightEye,\n                           const HmdRenderInfo &hmdRenderInfo,\n                           const DistortionRenderDesc &distortion, const ScaleAndOffset2D &eyeToSourceNDC )\n{\n    *pNumVertices  = DMA_NumVertsPerEye;\n    *pNumTriangles = DMA_NumTrisPerEye;\n\n    *ppVertices = (DistortionMeshVertexData*)\n                      OVR_ALLOC( sizeof(DistortionMeshVertexData) * (*pNumVertices) );\n    *ppTriangleListIndices  = (uint16_t*) OVR_ALLOC( sizeof(uint16_t) * (*pNumTriangles) * 3 );\n\n    if (!*ppVertices || !*ppTriangleListIndices)\n    {\n        if (*ppVertices)\n        {\n            OVR_FREE(*ppVertices);\n        }\n        if (*ppTriangleListIndices)\n        {\n            OVR_FREE(*ppTriangleListIndices);\n        }\n        *ppVertices             = NULL;\n        *ppTriangleListIndices  = NULL;\n        *pNumTriangles          = 0;\n        *pNumVertices           = 0;\n        return;\n    }\n\n\n\n    // Populate vertex buffer info\n\n    // First pass - build up raw vertex data.\n    DistortionMeshVertexData* pcurVert = *ppVertices;\n\n    for ( int y = 0; y <= DMA_GridSize; y++ )\n    {\n        for ( int x = 0; x <= DMA_GridSize; x++ )\n        {\n\n            Vector2f sourceCoordNDC;\n            // NDC texture coords [-1,+1]\n            sourceCoordNDC.x = 2.0f * ( (float)x / (float)DMA_GridSize ) - 1.0f;\n            sourceCoordNDC.y = 2.0f * ( (float)y / (float)DMA_GridSize ) - 1.0f;\n            Vector2f tanEyeAngle = TransformRendertargetNDCToTanFovSpace ( eyeToSourceNDC, sourceCoordNDC );\n\n            // Find a corresponding screen position.\n            // Note - this function does not have to be precise - we're just trying to match the mesh tessellation\n            // with the shape of the distortion to minimise the number of trianlges needed.\n            Vector2f screenNDC = TransformTanFovSpaceToScreenNDC ( distortion, tanEyeAngle, false );\n            // ...but don't let verts overlap to the other eye.\n            screenNDC.x = Alg::Max ( -1.0f, Alg::Min ( screenNDC.x, 1.0f ) );\n            screenNDC.y = Alg::Max ( -1.0f, Alg::Min ( screenNDC.y, 1.0f ) );\n\n            // From those screen positions, generate the vertex.\n            *pcurVert = DistortionMeshMakeVertex ( screenNDC, rightEye, hmdRenderInfo, distortion, eyeToSourceNDC );\n            pcurVert++;\n        }\n    }\n\n\n    // Populate index buffer info\n    uint16_t *pcurIndex = *ppTriangleListIndices;\n\n    for ( int triNum = 0; triNum < DMA_GridSize * DMA_GridSize; triNum++ )\n    {\n        // Use a Morton order to help locality of FB, texture and vertex cache.\n        // (0.325ms raster order -> 0.257ms Morton order)\n        OVR_ASSERT ( DMA_GridSize <= 256 );\n        int x = ( ( triNum & 0x0001 ) >> 0 ) |\n                ( ( triNum & 0x0004 ) >> 1 ) |\n                ( ( triNum & 0x0010 ) >> 2 ) |\n                ( ( triNum & 0x0040 ) >> 3 ) |\n                ( ( triNum & 0x0100 ) >> 4 ) |\n                ( ( triNum & 0x0400 ) >> 5 ) |\n                ( ( triNum & 0x1000 ) >> 6 ) |\n                ( ( triNum & 0x4000 ) >> 7 );\n        int y = ( ( triNum & 0x0002 ) >> 1 ) |\n                ( ( triNum & 0x0008 ) >> 2 ) |\n                ( ( triNum & 0x0020 ) >> 3 ) |\n                ( ( triNum & 0x0080 ) >> 4 ) |\n                ( ( triNum & 0x0200 ) >> 5 ) |\n                ( ( triNum & 0x0800 ) >> 6 ) |\n                ( ( triNum & 0x2000 ) >> 7 ) |\n                ( ( triNum & 0x8000 ) >> 8 );\n        int FirstVertex = x * (DMA_GridSize+1) + y;\n        // Another twist - we want the top-left and bottom-right quadrants to\n        // have the triangles split one way, the other two split the other.\n        // +---+---+---+---+\n        // |  /|  /|\\  |\\  |\n        // | / | / | \\ | \\ |\n        // |/  |/  |  \\|  \\|\n        // +---+---+---+---+\n        // |  /|  /|\\  |\\  |\n        // | / | / | \\ | \\ |\n        // |/  |/  |  \\|  \\|\n        // +---+---+---+---+\n        // |\\  |\\  |  /|  /|\n        // | \\ | \\ | / | / |\n        // |  \\|  \\|/  |/  |\n        // +---+---+---+---+\n        // |\\  |\\  |  /|  /|\n        // | \\ | \\ | / | / |\n        // |  \\|  \\|/  |/  |\n        // +---+---+---+---+\n        // This way triangle edges don't span long distances over the distortion function,\n        // so linear interpolation works better & we can use fewer tris.\n        if ( ( x < DMA_GridSize/2 ) != ( y < DMA_GridSize/2 ) )       // != is logical XOR\n        {\n            *pcurIndex++ = (uint16_t)FirstVertex;\n            *pcurIndex++ = (uint16_t)FirstVertex+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(DMA_GridSize+1)+1;\n\n            *pcurIndex++ = (uint16_t)FirstVertex+(DMA_GridSize+1)+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(DMA_GridSize+1);\n            *pcurIndex++ = (uint16_t)FirstVertex;\n        }\n        else\n        {\n            *pcurIndex++ = (uint16_t)FirstVertex;\n            *pcurIndex++ = (uint16_t)FirstVertex+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(DMA_GridSize+1);\n\n            *pcurIndex++ = (uint16_t)FirstVertex+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(DMA_GridSize+1)+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(DMA_GridSize+1);\n        }\n    }\n}\n\n//-----------------------------------------------------------------------------------\n// *****  Heightmap Mesh Rendering\n\n\nstatic const int HMA_GridSizeLog2   = 7;\nstatic const int HMA_GridSize       = 1<<HMA_GridSizeLog2;\nstatic const int HMA_NumVertsPerEye = (HMA_GridSize+1)*(HMA_GridSize+1);\nstatic const int HMA_NumTrisPerEye  = (HMA_GridSize)*(HMA_GridSize)*2;\n\n\nvoid HeightmapMeshDestroy ( HeightmapMeshVertexData *pVertices, uint16_t *pTriangleMeshIndices )\n{\n    OVR_FREE ( pVertices );\n    OVR_FREE ( pTriangleMeshIndices );\n}\n\nvoid HeightmapMeshCreate ( HeightmapMeshVertexData **ppVertices, uint16_t **ppTriangleListIndices,\n    int *pNumVertices, int *pNumTriangles,\n    const StereoEyeParams &stereoParams, const HmdRenderInfo &hmdRenderInfo )\n{\n    bool    rightEye      = ( stereoParams.Eye == StereoEye_Right );\n    int     vertexCount   = 0;\n    int     triangleCount = 0;\n\n    // Generate mesh into allocated data and return result.\n    HeightmapMeshCreate(ppVertices, ppTriangleListIndices, &vertexCount, &triangleCount,\n        rightEye, hmdRenderInfo, stereoParams.EyeToSourceNDC);\n\n    *pNumVertices  = vertexCount;\n    *pNumTriangles = triangleCount;\n}\n\n\n// Generate heightmap mesh for one eye.\nvoid HeightmapMeshCreate( HeightmapMeshVertexData **ppVertices, uint16_t **ppTriangleListIndices,\n    int *pNumVertices, int *pNumTriangles, bool rightEye,\n    const HmdRenderInfo &hmdRenderInfo,\n    const ScaleAndOffset2D &eyeToSourceNDC )\n{\n    *pNumVertices  = HMA_NumVertsPerEye;\n    *pNumTriangles = HMA_NumTrisPerEye;\n\n    *ppVertices = (HeightmapMeshVertexData*) OVR_ALLOC( sizeof(HeightmapMeshVertexData) * (*pNumVertices) );\n    *ppTriangleListIndices  = (uint16_t*) OVR_ALLOC( sizeof(uint16_t) * (*pNumTriangles) * 3 );\n\n    if (!*ppVertices || !*ppTriangleListIndices)\n    {\n        if (*ppVertices)\n        {\n            OVR_FREE(*ppVertices);\n        }\n        if (*ppTriangleListIndices)\n        {\n            OVR_FREE(*ppTriangleListIndices);\n        }\n        *ppVertices             = NULL;\n        *ppTriangleListIndices  = NULL;\n        *pNumTriangles          = 0;\n        *pNumVertices           = 0;\n        return;\n    }\n\n    // Populate vertex buffer info\n    // float xOffset = (rightEye ? 1.0f : 0.0f);  Currently disabled because its usage is disabled below.\n\n    // First pass - build up raw vertex data.\n    HeightmapMeshVertexData* pcurVert = *ppVertices;\n\n    for ( int y = 0; y <= HMA_GridSize; y++ )\n    {\n        for ( int x = 0; x <= HMA_GridSize; x++ )\n        {\n            Vector2f sourceCoordNDC;\n            // NDC texture coords [-1,+1]\n            sourceCoordNDC.x = 2.0f * ( (float)x / (float)HMA_GridSize ) - 1.0f;\n            sourceCoordNDC.y = 2.0f * ( (float)y / (float)HMA_GridSize ) - 1.0f;\n            Vector2f tanEyeAngle = TransformRendertargetNDCToTanFovSpace ( eyeToSourceNDC, sourceCoordNDC );\n\n            pcurVert->TanEyeAngles = tanEyeAngle;\n\n            HmdShutterTypeEnum shutterType = hmdRenderInfo.Shutter.Type;\n            switch ( shutterType )\n            {\n            case HmdShutter_Global:\n                pcurVert->TimewarpLerp = 0.0f;\n                break;\n            case HmdShutter_RollingLeftToRight:\n                // Retrace is left to right - left eye goes 0.0 -> 0.5, then right goes 0.5 -> 1.0\n                pcurVert->TimewarpLerp = sourceCoordNDC.x * 0.25f + 0.25f;\n                if (rightEye)\n                {\n                    pcurVert->TimewarpLerp += 0.5f;\n                }\n                break;\n            case HmdShutter_RollingRightToLeft:\n                // Retrace is right to left - right eye goes 0.0 -> 0.5, then left goes 0.5 -> 1.0\n                pcurVert->TimewarpLerp = 0.75f - sourceCoordNDC.x * 0.25f;\n                if (rightEye)\n                {\n                    pcurVert->TimewarpLerp -= 0.5f;\n                }\n                break;\n            case HmdShutter_RollingTopToBottom:\n                // Retrace is top to bottom on both eyes at the same time.\n                pcurVert->TimewarpLerp = sourceCoordNDC.y * 0.5f + 0.5f;\n                break;\n            default: OVR_ASSERT ( false ); break;\n            }\n\n            // Don't let verts overlap to the other eye.\n            //sourceCoordNDC.x = Alg::Max ( -1.0f, Alg::Min ( sourceCoordNDC.x, 1.0f ) );\n            //sourceCoordNDC.y = Alg::Max ( -1.0f, Alg::Min ( sourceCoordNDC.y, 1.0f ) );\n\n            //pcurVert->ScreenPosNDC.x = 0.5f * sourceCoordNDC.x - 0.5f + xOffset;\n            pcurVert->ScreenPosNDC.x = sourceCoordNDC.x;\n            pcurVert->ScreenPosNDC.y = -sourceCoordNDC.y;\n\n            pcurVert++;\n        }\n    }\n\n\n    // Populate index buffer info\n    uint16_t *pcurIndex = *ppTriangleListIndices;\n\n    for ( int triNum = 0; triNum < HMA_GridSize * HMA_GridSize; triNum++ )\n    {\n        // Use a Morton order to help locality of FB, texture and vertex cache.\n        // (0.325ms raster order -> 0.257ms Morton order)\n        OVR_ASSERT ( HMA_GridSize < 256 );\n        int x = ( ( triNum & 0x0001 ) >> 0 ) |\n                ( ( triNum & 0x0004 ) >> 1 ) |\n                ( ( triNum & 0x0010 ) >> 2 ) |\n                ( ( triNum & 0x0040 ) >> 3 ) |\n                ( ( triNum & 0x0100 ) >> 4 ) |\n                ( ( triNum & 0x0400 ) >> 5 ) |\n                ( ( triNum & 0x1000 ) >> 6 ) |\n                ( ( triNum & 0x4000 ) >> 7 );\n        int y = ( ( triNum & 0x0002 ) >> 1 ) |\n                ( ( triNum & 0x0008 ) >> 2 ) |\n                ( ( triNum & 0x0020 ) >> 3 ) |\n                ( ( triNum & 0x0080 ) >> 4 ) |\n                ( ( triNum & 0x0200 ) >> 5 ) |\n                ( ( triNum & 0x0800 ) >> 6 ) |\n                ( ( triNum & 0x2000 ) >> 7 ) |\n                ( ( triNum & 0x8000 ) >> 8 );\n        int FirstVertex = x * (HMA_GridSize+1) + y;\n        // Another twist - we want the top-left and bottom-right quadrants to\n        // have the triangles split one way, the other two split the other.\n        // +---+---+---+---+\n        // |  /|  /|\\  |\\  |\n        // | / | / | \\ | \\ |\n        // |/  |/  |  \\|  \\|\n        // +---+---+---+---+\n        // |  /|  /|\\  |\\  |\n        // | / | / | \\ | \\ |\n        // |/  |/  |  \\|  \\|\n        // +---+---+---+---+\n        // |\\  |\\  |  /|  /|\n        // | \\ | \\ | / | / |\n        // |  \\|  \\|/  |/  |\n        // +---+---+---+---+\n        // |\\  |\\  |  /|  /|\n        // | \\ | \\ | / | / |\n        // |  \\|  \\|/  |/  |\n        // +---+---+---+---+\n        // This way triangle edges don't span long distances over the distortion function,\n        // so linear interpolation works better & we can use fewer tris.\n        if ( ( x < HMA_GridSize/2 ) != ( y < HMA_GridSize/2 ) )       // != is logical XOR\n        {\n            *pcurIndex++ = (uint16_t)FirstVertex;\n            *pcurIndex++ = (uint16_t)FirstVertex+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(HMA_GridSize+1)+1;\n\n            *pcurIndex++ = (uint16_t)FirstVertex+(HMA_GridSize+1)+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(HMA_GridSize+1);\n            *pcurIndex++ = (uint16_t)FirstVertex;\n        }\n        else\n        {\n            *pcurIndex++ = (uint16_t)FirstVertex;\n            *pcurIndex++ = (uint16_t)FirstVertex+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(HMA_GridSize+1);\n\n            *pcurIndex++ = (uint16_t)FirstVertex+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(HMA_GridSize+1)+1;\n            *pcurIndex++ = (uint16_t)FirstVertex+(HMA_GridSize+1);\n        }\n    }\n}\n\n//-----------------------------------------------------------------------------------\n// ***** Prediction and timewarp.\n//\n\n// Calculates the values from the HMD info.\nPredictionValues PredictionGetDeviceValues ( const HmdRenderInfo &hmdRenderInfo,\n                                             bool withTimewarp /*= true*/,\n                                             bool withVsync /*= true*/ )\n{\n    PredictionValues result;\n\n    result.WithTimewarp = withTimewarp;\n    result.WithVsync = withVsync;\n\n    // For unclear reasons, most graphics systems add an extra frame of latency\n    // somewhere along the way. In time we'll debug this and figure it out, but\n    // for now this gets prediction a little bit better.\n    const float extraFramesOfBufferingKludge = 1.0f;\n\n    if ( withVsync )\n    {\n        // These are the times from the Present+Flush to when the middle of the scene is \"averagely visible\" (without timewarp)\n        // So if you had no timewarp, this, plus the time until the next vsync, is how much to predict by.\n        result.PresentFlushToRenderedScene  = extraFramesOfBufferingKludge * hmdRenderInfo.Shutter.FirstScanlineToLastScanline;\n        // Predict to the middle of the screen being scanned out.\n        result.PresentFlushToRenderedScene += hmdRenderInfo.Shutter.VsyncToFirstScanline + 0.5f * hmdRenderInfo.Shutter.FirstScanlineToLastScanline;\n        // Time for pixels to get half-way to settling.\n        result.PresentFlushToRenderedScene += hmdRenderInfo.Shutter.PixelSettleTime * 0.5f;\n        // Predict to half-way through persistence\n        result.PresentFlushToRenderedScene += hmdRenderInfo.Shutter.PixelPersistence * 0.5f;\n\n        // The time from the Present+Flush to when the first scanline is \"averagely visible\".\n        result.PresentFlushToTimewarpStart  = extraFramesOfBufferingKludge * hmdRenderInfo.Shutter.FirstScanlineToLastScanline;\n        // Predict to the first line being scanned out.\n        result.PresentFlushToTimewarpStart += hmdRenderInfo.Shutter.VsyncToFirstScanline;\n        // Time for pixels to get half-way to settling.\n        result.PresentFlushToTimewarpStart += hmdRenderInfo.Shutter.PixelSettleTime * 0.5f;\n        // Predict to half-way through persistence\n        result.PresentFlushToTimewarpStart += hmdRenderInfo.Shutter.PixelPersistence * 0.5f;\n\n        // Time to the the last scanline.\n        result.PresentFlushToTimewarpEnd    = result.PresentFlushToTimewarpStart + hmdRenderInfo.Shutter.FirstScanlineToLastScanline;\n\n        // Ideal framerate.\n        result.PresentFlushToPresentFlush   = hmdRenderInfo.Shutter.VsyncToNextVsync;\n    }\n    else\n    {\n        // Timewarp without vsync is a little odd.\n        // Currently, we assume that without vsync, we have no idea which scanline\n        // is currently being sent to the display. So we can't do lerping timewarp,\n        // we can just do a full-screen late-stage fixup.\n\n        // \"PresentFlushToRenderedScene\" means the time from the Present+Flush to when the middle of the scene is \"averagely visible\" (without timewarp)\n        // So if you had no timewarp, this, plus the time until the next flush (which is usually the time to render the frame), is how much to predict by.\n        // Time for pixels to get half-way to settling.\n        result.PresentFlushToRenderedScene  = hmdRenderInfo.Shutter.PixelSettleTime * 0.5f;\n        // Predict to half-way through persistence\n        result.PresentFlushToRenderedScene += hmdRenderInfo.Shutter.PixelPersistence * 0.5f;\n\n        // Without vsync, you don't know timings, and so can't do anything useful with lerped warping.\n        result.PresentFlushToTimewarpStart  = result.PresentFlushToRenderedScene;\n        result.PresentFlushToTimewarpEnd    = result.PresentFlushToRenderedScene;\n\n        // There's no concept of \"ideal\" when vsync is off.\n        result.PresentFlushToPresentFlush   = 0.0f;\n    }\n\n    return result;\n}\n\nMatrix4f TimewarpComputePoseDelta ( Matrix4f const &renderedViewFromWorld, Matrix4f const &predictedViewFromWorld, Matrix4f const&hmdToEyeViewOffset )\n{\n    Matrix4f worldFromPredictedView = (hmdToEyeViewOffset * predictedViewFromWorld).InvertedHomogeneousTransform();\n    Matrix4f matRenderFromNowStart = (hmdToEyeViewOffset * renderedViewFromWorld) * worldFromPredictedView;\n\n    // The sensor-predicted orientations have:                           X=right, Y=up,   Z=backwards.\n    // The vectors inside the mesh are in NDC to keep the shader simple: X=right, Y=down, Z=forwards.\n    // So we need to perform a similarity transform on this delta matrix.\n    // The verbose code would look like this:\n    /*\n    Matrix4f matBasisChange;\n    matBasisChange.SetIdentity();\n    matBasisChange.M[0][0] =  1.0f;\n    matBasisChange.M[1][1] = -1.0f;\n    matBasisChange.M[2][2] = -1.0f;\n    Matrix4f matBasisChangeInv = matBasisChange.Inverted();\n    matRenderFromNow = matBasisChangeInv * matRenderFromNow * matBasisChange;\n    */\n    // ...but of course all the above is a constant transform and much more easily done.\n    // We flip the signs of the Y&Z row, then flip the signs of the Y&Z column,\n    // and of course most of the flips cancel:\n    // +++                        +--                     +--\n    // +++ -> flip Y&Z columns -> +-- -> flip Y&Z rows -> -++\n    // +++                        +--                     -++\n    matRenderFromNowStart.M[0][1] = -matRenderFromNowStart.M[0][1];\n    matRenderFromNowStart.M[0][2] = -matRenderFromNowStart.M[0][2];\n    matRenderFromNowStart.M[1][0] = -matRenderFromNowStart.M[1][0];\n    matRenderFromNowStart.M[2][0] = -matRenderFromNowStart.M[2][0];\n    matRenderFromNowStart.M[1][3] = -matRenderFromNowStart.M[1][3];\n    matRenderFromNowStart.M[2][3] = -matRenderFromNowStart.M[2][3];\n\n    return matRenderFromNowStart;\n}\n\nMatrix4f TimewarpComputePoseDeltaPosition ( Matrix4f const &renderedViewFromWorld, Matrix4f const &predictedViewFromWorld, Matrix4f const&hmdToEyeViewOffset )\n{\n    Matrix4f worldFromPredictedView = (hmdToEyeViewOffset * predictedViewFromWorld).InvertedHomogeneousTransform();\n    Matrix4f matRenderXform = (hmdToEyeViewOffset * renderedViewFromWorld) * worldFromPredictedView;\n\n    return matRenderXform.Inverted();\n}\n\n\n#if defined(OVR_ENABLE_TIMEWARP_MACHINE)\n// This is deprecated by DistortionTiming code. -cat\n\nTimewarpMachine::TimewarpMachine()\n  : VsyncEnabled(false),\n    RenderInfo(),\n    CurrentPredictionValues(),\n    DistortionTimeCount(0),\n    DistortionTimeCurrentStart(0.0),\n  //DistortionTimes[],\n    DistortionTimeAverage(0.f),\n  //EyeRenderPoses[],\n    LastFramePresentFlushTime(0.0),\n    PresentFlushToPresentFlushSeconds(0.f),\n    NextFramePresentFlushTime(0.0)\n{\n    #if defined(OVR_BUILD_DEBUG)\n        memset(DistortionTimes, 0, sizeof(DistortionTimes));\n    #endif\n\n    for ( int i = 0; i < 2; i++ )\n    {\n        EyeRenderPoses[i] = Posef();\n    }\n}\n\nvoid TimewarpMachine::Reset(HmdRenderInfo& renderInfo, bool vsyncEnabled, double timeNow)\n{\n    RenderInfo = renderInfo;\n    VsyncEnabled = vsyncEnabled;\n    CurrentPredictionValues = PredictionGetDeviceValues ( renderInfo, true, VsyncEnabled );\n    PresentFlushToPresentFlushSeconds = 0.0f;\n    DistortionTimeCount = 0;\n    DistortionTimeAverage = 0.0f;\n    LastFramePresentFlushTime = timeNow;\n    AfterPresentAndFlush(timeNow);\n}\n\nvoid TimewarpMachine::AfterPresentAndFlush(double timeNow)\n{\n    AfterPresentWithoutFlush();\n    AfterPresentFinishes ( timeNow );\n}\n\nvoid TimewarpMachine::AfterPresentWithoutFlush()\n{\n    // We've only issued the Present - it hasn't actually finished (i.e. appeared)\n    // But we need to estimate when the next Present will appear, so extrapolate from previous data.\n    NextFramePresentFlushTime = LastFramePresentFlushTime + 2.0 * (double)PresentFlushToPresentFlushSeconds;\n}\n\nvoid TimewarpMachine::AfterPresentFinishes(double timeNow)\n{\n    // The present has now actually happened.\n    PresentFlushToPresentFlushSeconds = (float)(timeNow - LastFramePresentFlushTime);\n    LastFramePresentFlushTime = timeNow;\n    NextFramePresentFlushTime = timeNow + (double)PresentFlushToPresentFlushSeconds;\n}\n\n\n\ndouble TimewarpMachine::GetViewRenderPredictionTime()\n{\n    // Note that PredictionGetDeviceValues() did all the vsync-dependent thinking for us.\n    return NextFramePresentFlushTime + CurrentPredictionValues.PresentFlushToRenderedScene;\n}\n\nbool TimewarpMachine::GetViewRenderPredictionPose(TrackingStateReader* reader, Posef& pose)\n{\n\treturn reader->GetPoseAtTime(GetViewRenderPredictionTime(), pose);\n}\n\ndouble TimewarpMachine::GetVisiblePixelTimeStart()\n{\n    // Note that PredictionGetDeviceValues() did all the vsync-dependent thinking for us.\n    return NextFramePresentFlushTime + CurrentPredictionValues.PresentFlushToTimewarpStart;\n}\ndouble TimewarpMachine::GetVisiblePixelTimeEnd()\n{\n    // Note that PredictionGetDeviceValues() did all the vsync-dependent thinking for us.\n    return NextFramePresentFlushTime + CurrentPredictionValues.PresentFlushToTimewarpEnd;\n}\nbool TimewarpMachine::GetPredictedVisiblePixelPoseStart(TrackingStateReader* reader, Posef& pose)\n{\n\treturn reader->GetPoseAtTime(GetVisiblePixelTimeStart(), pose);\n}\nbool TimewarpMachine::GetPredictedVisiblePixelPoseEnd(TrackingStateReader* reader, Posef& pose)\n{\n\treturn reader->GetPoseAtTime(GetVisiblePixelTimeEnd(), pose);\n}\nbool TimewarpMachine::GetTimewarpDeltaStart(TrackingStateReader* reader, Posef const &renderedPose, Matrix4f& transform)\n{\n\tPosef visiblePose;\n\tif (!GetPredictedVisiblePixelPoseStart(reader, visiblePose))\n\t{\n\t\treturn false;\n\t}\n\n    Matrix4f visibleMatrix(visiblePose);\n    Matrix4f renderedMatrix(renderedPose);\n    Matrix4f identity;  // doesn't matter for orientation-only timewarp\n    transform = TimewarpComputePoseDelta ( renderedMatrix, visibleMatrix, identity );\n\n\treturn true;\n}\nbool TimewarpMachine::GetTimewarpDeltaEnd(TrackingStateReader* reader, Posef const &renderedPose, Matrix4f& transform)\n{\n\tPosef visiblePose;\n\tif (!GetPredictedVisiblePixelPoseEnd(reader, visiblePose))\n\t{\n\t\treturn false;\n\t}\n\n    Matrix4f visibleMatrix(visiblePose);\n    Matrix4f renderedMatrix(renderedPose);\n    Matrix4f identity;  // doesn't matter for orientation-only timewarp\n    transform = TimewarpComputePoseDelta ( renderedMatrix, visibleMatrix, identity );\n\n\treturn true;\n}\n\n\n// What time should the app wait until before starting distortion?\ndouble  TimewarpMachine::JustInTime_GetDistortionWaitUntilTime()\n{\n    if ( !VsyncEnabled || ( DistortionTimeCount < NumDistortionTimes ) )\n    {\n        // Don't wait.\n        return LastFramePresentFlushTime;\n    }\n\n    // Note - 1-2ms fudge factor (because Windows timer granularity etc) is NOT added here,\n    // because otherwise you end up adding multiple fudge factors!\n    // So it's left for the calling app to add just one fudge factor.\n\n    float howLongBeforePresent = DistortionTimeAverage;\n    // Subtlety here. Technically, the correct time is NextFramePresentFlushTime - howLongBeforePresent.\n    // However, if the app drops a frame, this then perpetuates it,\n    // i.e. if the display is running at 60fps, but the last frame was slow,\n    // (e.g. because of swapping or whatever), then NextFramePresentFlushTime is\n    // 33ms in the future, not 16ms. Since this function supplies the\n    // time to wait until, the app will indeed wait until 32ms, so the framerate\n    // drops to 30fps and never comes back up!\n    // So we return the *ideal* framerate, not the *actual* framerate.\n    return LastFramePresentFlushTime + (float)( CurrentPredictionValues.PresentFlushToPresentFlush - howLongBeforePresent );\n}\n\ndouble TimewarpMachine::JustInTime_AverageDistortionTime()\n{\n    if ( JustInTime_NeedDistortionTimeMeasurement() )\n    {\n        return 0.0;\n    }\n    return DistortionTimeAverage;\n}\n\nbool    TimewarpMachine::JustInTime_NeedDistortionTimeMeasurement() const\n{\n    if (!VsyncEnabled)\n    {\n        return false;\n    }\n    return ( DistortionTimeCount < NumDistortionTimes );\n}\n\nvoid    TimewarpMachine::JustInTime_BeforeDistortionTimeMeasurement(double timeNow)\n{\n    DistortionTimeCurrentStart = timeNow;\n}\n\nvoid    TimewarpMachine::JustInTime_AfterDistortionTimeMeasurement(double timeNow)\n{\n    float timeDelta = (float)( timeNow - DistortionTimeCurrentStart );\n    if ( DistortionTimeCount < NumDistortionTimes )\n    {\n        DistortionTimes[DistortionTimeCount] = timeDelta;\n        DistortionTimeCount++;\n        if ( DistortionTimeCount == NumDistortionTimes )\n        {\n            // Median.\n            float distortionTimeMedian = 0.0f;\n            for ( int i = 0; i < NumDistortionTimes/2; i++ )\n            {\n                // Find the maximum time of those remaining.\n                float maxTime = DistortionTimes[0];\n                int maxIndex = 0;\n                for ( int j = 1; j < NumDistortionTimes; j++ )\n                {\n                    if ( maxTime < DistortionTimes[j] )\n                    {\n                        maxTime = DistortionTimes[j];\n                        maxIndex = j;\n                    }\n                }\n                // Zero that max time, so we'll find the next-highest time.\n                DistortionTimes[maxIndex] = 0.0f;\n                distortionTimeMedian = maxTime;\n            }\n            DistortionTimeAverage = distortionTimeMedian;\n        }\n    }\n    else\n    {\n        OVR_ASSERT ( !\"Really didn't need more measurements, thanks\" );\n    }\n}\n\n#endif // OVR_ENABLE_TIMEWARP_MACHINE\n\n\n}}}  // OVR::Util::Render\n\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Util/Util_Render_Stereo.h",
    "content": "/************************************************************************************\n\nFilename    :   Util_Render_Stereo.h\nContent     :   Sample stereo rendering configuration classes.\nCreated     :   October 22, 2012\nAuthors     :   Michael Antonov, Tom Forsyth\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Util_Render_Stereo_h\n#define OVR_Util_Render_Stereo_h\n\n#include \"OVR_Stereo.h\"\n#include \"Extras/OVR_Math.h\"\n#include \"Vision/SensorFusion/Vision_SensorStateReader.h\"\n\nnamespace OVR { namespace Util { namespace Render {\n\n\n\n//-----------------------------------------------------------------------------------\n// **** Useful debug functions.\n//\n// Purely for debugging - the results are not very end-user-friendly.\nchar const* GetDebugNameEyeCupType ( EyeCupType eyeCupType );\nchar const* GetDebugNameHmdType ( HmdTypeEnum hmdType );\n\n\n\n//-----------------------------------------------------------------------------------\n// **** Higher-level utility functions.\n\nSizei CalculateRecommendedTextureSize    ( HmdRenderInfo const &hmd,\n                                           bool bRendertargetSharedByBothEyes,\n                                           float pixelDensityInCenter = 1.0f );\n\nFovPort CalculateRecommendedFov          ( HmdRenderInfo const &hmd,\n                                           StereoEye eyeType,\n                                           bool bMakeFovSymmetrical = false);\n\nStereoEyeParams CalculateStereoEyeParams ( HmdRenderInfo const &hmd,\n                                           StereoEye eyeType,\n                                           Sizei const &actualRendertargetSurfaceSize,\n                                           bool bRendertargetSharedByBothEyes,\n                                           bool bRightHanded = true,\n                                           float zNear = 0.01f, float zFar = 10000.0f,\n\t\t\t\t\t\t\t\t\t\t   Sizei const *pOverrideRenderedPixelSize = NULL,\n                                           FovPort const *pOverrideFovport = NULL,\n                                           float zoomFactor = 1.0f );\n\nVector3f CalculateEyeVirtualCameraOffset(HmdRenderInfo const &hmd,\n                                         StereoEye eyeType, bool bMonoRenderingMode );\n\n\n// These are two components from StereoEyeParams that can be changed\n// very easily without full recomputation of everything.\nstruct ViewportScaleAndOffset\n{\n    Recti               RenderedViewport;\n    ScaleAndOffset2D    EyeToSourceUV;\n};\n\n// Three ways to override the size of the render view dynamically.\n// None of these require changing the distortion parameters or the regenerating the distortion mesh,\n// and can be called every frame if desired.\nViewportScaleAndOffset ModifyRenderViewport ( StereoEyeParams const &params,\n                                              Sizei const &actualRendertargetSurfaceSize,\n                                              Recti const &renderViewport );\n\nViewportScaleAndOffset ModifyRenderSize ( StereoEyeParams const &params,\n                                          Sizei const &actualRendertargetSurfaceSize,\n                                          Sizei const &requestedRenderSize,\n                                          bool bRendertargetSharedByBothEyes = false );\n\nViewportScaleAndOffset ModifyRenderDensity ( StereoEyeParams const &params,\n                                             Sizei const &actualRendertargetSurfaceSize,\n                                             float pixelDensity = 1.0f,\n                                             bool bRendertargetSharedByBothEyes = false );\n\n\n//-----------------------------------------------------------------------------------\n// *****  StereoConfig\n\n// StereoConfig maintains a scene stereo state and allow switching between different\n// stereo rendering modes. To support rendering, StereoConfig keeps track of HMD\n// variables such as screen size, eye-to-screen distance and distortion, and computes\n// extra data such as FOV and distortion center offsets based on it. Rendering\n// parameters are returned though StereoEyeParams for each eye.\n//\n// Beyond regular 3D projection, this class supports rendering a 2D orthographic\n// surface for UI and text. The 2D surface will be defined by CreateOrthoSubProjection().\n// The (0,0) coordinate corresponds to eye center location.\n// \n// Applications are not required to use this class, but they should be doing very\n// similar sequences of operations, and it may be useful to start with this class\n// and modify it.\n\nstruct StereoEyeParamsWithOrtho\n{\n    StereoEyeParams         StereoEye;\n    Matrix4f                OrthoProjection;\n};\n\nstruct ViewportScaleAndOffsetBothEyes\n{\n    ViewportScaleAndOffset  Left;\n    ViewportScaleAndOffset  Right;\n};\n\nclass StereoConfig\n{\npublic:\n\n    // StereoMode describes rendering modes that can be used by StereoConfig.\n    // These modes control whether stereo rendering is used or not (Stereo_None),\n    // and how it is implemented.\n    enum StereoMode\n    {\n        Stereo_None                     = 0,        // Single eye\n        Stereo_LeftRight_Multipass      = 1,        // One frustum per eye\n    };\n\n\n    StereoConfig(StereoMode mode = Stereo_LeftRight_Multipass);\n \n    //---------------------------------------------------------------------------------------------\n    // *** Core functions - every app MUST call these functions at least once.\n\n    // Sets HMD parameters; also initializes distortion coefficients.\n    void        SetHmdRenderInfo(const HmdRenderInfo& hmd);\n\n    // Set the physical size of the rendertarget surface the app created,\n    // and whether one RT is shared by both eyes, or each eye has its own RT:\n    // true: both eyes are rendered to the same RT. Left eye starts at top-left, right eye starts at top-middle.\n    // false: each eye is rendered to its own RT. Some GPU architectures prefer this arrangement.\n    // Typically, the app would call CalculateRecommendedTextureSize() to suggest the choice of RT size.\n    // This setting must be exactly the size of the actual RT created, or the UVs produced will be incorrect.\n    // If the app wants to render to a subsection of the RT, it should use SetRenderSize()\n    void        SetRendertargetSize (Size<int> const rendertargetSize,\n                                     bool rendertargetIsSharedByBothEyes );\n\n    // Returns full set of Stereo rendering parameters for the specified eye.\n    const StereoEyeParamsWithOrtho& GetEyeRenderParams(StereoEye eye);\n\n\n\n    //---------------------------------------------------------------------------------------------\n    // *** Optional functions - an app may call these to override default behaviours.\n\n    const HmdRenderInfo& GetHmdRenderInfo() const { return Hmd; }\n\n    // Returns the recommended size of rendertargets.\n    // If rendertargetIsSharedByBothEyes is true, this is the size of the combined buffer.\n    // If rendertargetIsSharedByBothEyes is false, this is the size of each individual buffer.\n    // pixelDensityInCenter may be set to any number - by default it will match the HMD resolution in the center of the image.\n    // After creating the rendertargets, the application MUST call SetRendertargetSize() with the actual size created\n    // (which can be larger or smaller as the app wishes, but StereoConfig needs to know either way)\n    Sizei       CalculateRecommendedTextureSize ( bool rendertargetSharedByBothEyes,\n                                                  float pixelDensityInCenter = 1.0f );\n\n    // Sets a stereo rendering mode and updates internal cached\n    // state (matrices, per-eye view) based on it.\n    void        SetStereoMode(StereoMode mode)  { Mode = mode; DirtyFlag = true; }\n    StereoMode  GetStereoMode() const           { return Mode; }\n\n    // Sets the fieldOfView that the 2D coordinate area stretches to.\n    void        Set2DAreaFov(float fovRadians);\n\n    // Really only for science experiments - no normal app should ever need to override\n    // the HMD's lens descriptors. Passing NULL removes the override.\n    // Supply both = set left and right.\n    // Supply just left = set both to the same.\n    // Supply neither = remove override.\n    void        SetLensOverride ( LensConfig const *pLensOverrideLeft  = NULL,\n                                  LensConfig const *pLensOverrideRight = NULL );\n \n    // Override the rendered FOV in various ways. All angles in tangent units.\n    // This is not clamped to the physical FOV of the display - you'll need to do that yourself!\n    // Supply both = set left and right.\n    // Supply just left = set both to the same.\n    // Supply neither = remove override.\n    void        SetFov ( FovPort const *pfovLeft  = NULL,\n\t\t\t\t\t     FovPort const *pfovRight = NULL );\n    \n    void        SetFovPortRadians ( float horizontal, float vertical )\n    {\n        FovPort fov = FovPort::CreateFromRadians(horizontal, vertical);\n        SetFov( &fov, &fov );\n    }\n\n\n    // This forces a \"zero IPD\" mode where there is just a single render with an FOV that\n    //   is the union of the two calculated FOVs.\n    // The calculated render is for the left eye. Any size & FOV overrides for the right\n    //   eye will be ignored.\n    // If you query the right eye's size, you will get the same render\n    //   size & position as the left eye - you should not actually do the render of course!\n    //   The distortion values will be different, because it goes to a different place on the framebuffer.\n    // Note that if you do this, the rendertarget does not need to be twice the width of\n    //   the render size any more.\n    void        SetZeroVirtualIpdOverride ( bool enableOverride );\n\n    // Allows the app to specify near and far clip planes and the right/left-handedness of the projection matrix.\n    void        SetZClipPlanesAndHandedness ( float zNear = 0.01f, float zFar = 10000.0f,\n                                              bool rightHandedProjection = true, bool isOpenGL = false );\n\n    // Allows the app to specify how much extra eye rotation to allow when determining the visible FOV.\n    void        SetExtraEyeRotation ( float extraEyeRotationInRadians = 0.0f );\n\n    // The dirty flag is set by any of the above calls. Just handy for the app to know\n    // if e.g. the distortion mesh needs regeneration.\n    void        SetDirty() { DirtyFlag = true; }\n    bool        IsDirty() { return DirtyFlag; }\n\n    // An app never needs to call this - GetEyeRenderParams will call it internally if\n    // the state is dirty. However apps can call this explicitly to control when and where\n    // computation is performed (e.g. not inside critical loops)\n    void        UpdateComputedState();\n\n    // This returns the projection matrix with a \"zoom\". Does not modify any internal state.\n    Matrix4f    GetProjectionWithZoom ( StereoEye eye, float fovZoom ) const;\n\n\n    //---------------------------------------------------------------------------------------------\n    // The SetRender* functions are special.\n    //\n    // They do not require a full recalculation of state, and they do not change anything but the\n    // ViewportScaleAndOffset data for the eyes (which they return), and do not set the dirty flag!\n    // This means they can be called without regenerating the distortion mesh, and thus \n    // can happily be called every frame without causing performance problems. Dynamic rescaling \n    // of the rendertarget can help keep framerate up in demanding VR applications.\n    // See the documentation for more details on their use.\n\n    // Specify a pixel density - how many rendered pixels per pixel in the physical display.\n    ViewportScaleAndOffsetBothEyes SetRenderDensity ( float pixelsPerDisplayPixel );\n\n    // Supply the size directly. Will be clamped to the physical rendertarget size.\n    ViewportScaleAndOffsetBothEyes SetRenderSize ( Sizei const &renderSizeLeft, Sizei const &renderSizeRight );\n\n    // Supply the viewport directly. This is not clamped to the physical rendertarget - careful now!\n    ViewportScaleAndOffsetBothEyes SetRenderViewport ( Recti const &renderViewportLeft, Recti const &renderViewportRight );\n\nprivate:\n\n    // *** Modifiable State\n\n    StereoMode         Mode;\n    HmdRenderInfo      Hmd;\n\n    float              Area2DFov;           // FOV range mapping to the 2D area.\n\n    // Only one of these three overrides can be true!\n    enum SetViewportModeEnum\n    {\n        SVPM_Density,\n        SVPM_Size,\n        SVPM_Viewport,\n    }                  SetViewportMode;\n    // ...and depending which it is, one of the following are used.\n    float              SetViewportPixelsPerDisplayPixel;\n    Sizei              SetViewportSize[2];\n    Recti           SetViewport[2];\n\n    // Other overrides.\n    bool               OverrideLens;\n    LensConfig         LensOverrideLeft;\n    LensConfig         LensOverrideRight;\n    Sizei              RendertargetSize;\n    bool               OverrideTanHalfFov;\n    FovPort            FovOverrideLeft;\n    FovPort            FovOverrideRight;\n    bool               OverrideZeroIpd;\n    float              ZNear;\n    float              ZFar;\n    float              ExtraEyeRotationInRadians;\n    bool               IsRendertargetSharedByBothEyes;\n    bool               RightHandedProjection;\n    bool               UsingOpenGL; // for projection clip depth calculation\n\n    bool               DirtyFlag;   // Set when any if the modifiable state changed. Does NOT get set by SetRender*()\n\n    // Utility function.\n    ViewportScaleAndOffsetBothEyes setupViewportScaleAndOffsets();\n\n    // *** Computed State\n\npublic:     // Small hack for the config tool. Normal code should never read EyeRenderParams directly - use GetEyeRenderParams() instead.\n    // 0/1 = left/right main views.\n    StereoEyeParamsWithOrtho    EyeRenderParams[2];\n};\n\n\n//-----------------------------------------------------------------------------------\n// *****  Distortion Mesh Rendering\n//\n\n// Stores both texture UV coords, or tan(angle) values.\n// Use whichever set of data the specific distortion algorithm requires.\n// This struct *must* be binary compatible with CAPI ovrDistortionVertex.\nstruct DistortionMeshVertexData\n{\n    // [-1,+1],[-1,+1] over the entire framebuffer.\n    Vector2f    ScreenPosNDC;\n    // [0.0-1.0] interpolation value for timewarping - see documentation for details.\n    float       TimewarpLerp;\n    // [0.0-1.0] fade-to-black at the edges to reduce peripheral vision noise.\n    float       Shade;        \n    // The red, green, and blue vectors in tan(angle) space.\n    // Scale and offset by the values in StereoEyeParams.EyeToSourceUV.Scale\n    // and StereoParams.EyeToSourceUV.Offset to get to real texture UV coords.\n    Vector2f    TanEyeAnglesR;\n    Vector2f    TanEyeAnglesG;\n    Vector2f    TanEyeAnglesB;    \n};\n\n// If you just want a single point on the screen transformed.\nDistortionMeshVertexData DistortionMeshMakeVertex ( Vector2f screenNDC,\n                                                    bool rightEye,\n                                                    const HmdRenderInfo &hmdRenderInfo, \n                                                    const DistortionRenderDesc &distortion, const ScaleAndOffset2D &eyeToSourceNDC );\n\nvoid DistortionMeshCreate ( DistortionMeshVertexData **ppVertices, uint16_t **ppTriangleListIndices,\n                            int *pNumVertices, int *pNumTriangles,\n                            const StereoEyeParams &stereoParams, const HmdRenderInfo &hmdRenderInfo );\n\n// Generate distortion mesh for a eye.\n// This version requires less data then stereoParms, supporting dynamic change in render target viewport.\nvoid DistortionMeshCreate( DistortionMeshVertexData **ppVertices, uint16_t **ppTriangleListIndices,\n                           int *pNumVertices, int *pNumTriangles,\n                           bool rightEye,\n                           const HmdRenderInfo &hmdRenderInfo, \n                           const DistortionRenderDesc &distortion, const ScaleAndOffset2D &eyeToSourceNDC );\n\nvoid DistortionMeshDestroy ( DistortionMeshVertexData *pVertices, uint16_t *pTriangleMeshIndices );\n\n\n//-----------------------------------------------------------------------------------\n// *****  Heightmap Mesh Rendering\n//\n\n// Stores both texture UV coords, or tan(angle) values.\n// This struct *must* be binary compatible with CAPI ovrHeightmapVertex.\nstruct HeightmapMeshVertexData\n{\n    // [-1,+1],[-1,+1] over the entire framebuffer.\n    Vector2f    ScreenPosNDC;\n    // [0.0-1.0] interpolation value for timewarping - see documentation for details.\n    float       TimewarpLerp;\n    // The vectors in tan(angle) space.\n    // Scale and offset by the values in StereoEyeParams.EyeToSourceUV.Scale\n    // and StereoParams.EyeToSourceUV.Offset to get to real texture UV coords.\n    Vector2f    TanEyeAngles;    \n};\n\n\nvoid HeightmapMeshCreate ( HeightmapMeshVertexData **ppVertices, uint16_t **ppTriangleListIndices,\n    int *pNumVertices, int *pNumTriangles,\n    const StereoEyeParams &stereoParams, const HmdRenderInfo &hmdRenderInfo );\n\n// Generate heightmap mesh for a eye. This version requires less data then stereoParms, supporting\n// dynamic change in render target viewport.\nvoid HeightmapMeshCreate( HeightmapMeshVertexData **ppVertices, uint16_t **ppTriangleListIndices,\n    int *pNumVertices, int *pNumTriangles, bool rightEye,\n    const HmdRenderInfo &hmdRenderInfo, const ScaleAndOffset2D &eyeToSourceNDC );\n\nvoid HeightmapMeshDestroy ( HeightmapMeshVertexData *pVertices, uint16_t *pTriangleMeshIndices );\n\n\n\n//-----------------------------------------------------------------------------------\n// ***** Prediction and timewarp.\n//\n\nstruct PredictionValues\n{\n    // All values in seconds.\n    // These are the times in seconds from a present+flush to the relevant display element.\n    // The time is measured to the middle of that element's visibility window,\n    // e.g. if the device is a full-persistence display, the element will be visible for\n    // an entire frame, so the time measures to the middle of that period, i.e. half the frame time.\n    float PresentFlushToRenderedScene;        // To the overall rendered 3D scene being visible.\n    float PresentFlushToTimewarpStart;        // To when the first timewarped scanline will be visible.\n    float PresentFlushToTimewarpEnd;          // To when the last timewarped scanline will be visible.\n    float PresentFlushToPresentFlush;         // To the next present+flush, i.e. the ideal framerate.\n\n    bool  WithTimewarp;\n    bool  WithVsync;\n};\n\n// Calculates the values from the HMD info.\nPredictionValues PredictionGetDeviceValues ( const HmdRenderInfo &hmdRenderInfo,\n                                             bool withTimewarp = true,\n                                             bool withVsync = true );\n\n// Pass in an orientation used to render the scene, and then the predicted orientation\n// (which may have been computed later on, and thus is more accurate), and this\n// will return the matrix to pass to the timewarp distortion shader.\n// TODO: deal with different handedness?\nMatrix4f TimewarpComputePoseDelta ( Matrix4f const &renderedViewFromWorld, Matrix4f const &predictedViewFromWorld, Matrix4f const&hmdToEyeViewOffset );\nMatrix4f TimewarpComputePoseDeltaPosition ( Matrix4f const &renderedViewFromWorld, Matrix4f const &predictedViewFromWorld, Matrix4f const&hmdToEyeViewOffset );\n\n\n#if defined(OVR_ENABLE_TIMEWARP_MACHINE)\n// This is deprecated by DistortionTiming code. -cat\n\n// TimewarpMachine helps keep track of rendered frame timing and\n// handles predictions for time-warp rendering.\nclass TimewarpMachine\n{\npublic:\n    TimewarpMachine();\n   \n    // Call this on and every time something about the setup changes.\n    void        Reset ( HmdRenderInfo& renderInfo, bool vsyncEnabled, double timeNow );\n\n    // The only reliable time in most engines is directly after the frame-present and GPU flush-and-wait.\n    // This call should be done right after that to give this system the timing info it needs.\n    void        AfterPresentAndFlush(double timeNow);\n    // But some engines queue up the frame-present and only later find out when it actually happened.\n    // They should call these two at those times.\n    void        AfterPresentWithoutFlush();\n    void        AfterPresentFinishes(double timeNow);\n\n    // The \"average\" time the rendered frame will show up,\n    // and the predicted pose of the HMD at that time.\n    // You usually only need to call one of these functions.\n    double      GetViewRenderPredictionTime();\n    bool        GetViewRenderPredictionPose(Vision::TrackingStateReader* reader, Posef& transform);\n\n\n    // Timewarp prediction functions. You usually only need to call one of these three sets of functions.\n\n    // The predicted times that the first and last pixel will be visible on-screen.\n    double      GetVisiblePixelTimeStart();\n    double      GetVisiblePixelTimeEnd();\n    // Predicted poses of the HMD at those first and last pixels.\n\tbool        GetPredictedVisiblePixelPoseStart(Vision::TrackingStateReader* reader, Posef& transform);\n\tbool        GetPredictedVisiblePixelPoseEnd(Vision::TrackingStateReader* reader, Posef& transform);\n    // The delta matrices to feed to the timewarp distortion code,\n    // given the pose that was used for rendering.\n    // (usually the one returned by GetViewRenderPredictionPose() earlier)\n\tbool        GetTimewarpDeltaStart(Vision::TrackingStateReader* reader, Posef const &renderedPose, Matrix4f& transform);\n\tbool        GetTimewarpDeltaEnd(Vision::TrackingStateReader* reader, Posef const &renderedPose, Matrix4f& transform);\n\n    // Just-In-Time distortion aims to delay the second sensor reading & distortion\n    // until the very last moment to improve prediction. However, it is a little scary,\n    // since the delay might wait too long and miss the vsync completely!\n    // Use of the JustInTime_* functions is entirely optional, and we advise allowing\n    // users to turn it off in their video options to cope with odd machine configurations.\n\n    // What time should the app wait until before starting distortion?\n    double      JustInTime_GetDistortionWaitUntilTime();\n\n    // Used to time the distortion rendering\n    bool        JustInTime_NeedDistortionTimeMeasurement() const;\n    void        JustInTime_BeforeDistortionTimeMeasurement(double timeNow);\n    void        JustInTime_AfterDistortionTimeMeasurement(double timeNow);\n    double      JustInTime_AverageDistortionTime();     // Just for profiling - use JustInTime_GetDistortionWaitUntilTime() for functionality.\n\nprivate:\n    bool                VsyncEnabled;\n    HmdRenderInfo       RenderInfo;\n    PredictionValues    CurrentPredictionValues;\n\n    enum { NumDistortionTimes = 100 };\n    int                 DistortionTimeCount;\n    double              DistortionTimeCurrentStart;\n    float               DistortionTimes[NumDistortionTimes];\n    float               DistortionTimeAverage;\n\n    // Pose at which last time the eye was rendered.\n    Posef               EyeRenderPoses[2];\n\n    // Absolute time of the last present+flush\n    double              LastFramePresentFlushTime;\n    // Seconds between present+flushes\n    float               PresentFlushToPresentFlushSeconds;\n    // Predicted absolute time of the next present+flush\n    double              NextFramePresentFlushTime;\n\n};\n\n#endif // OVR_ENABLE_TIMEWARP_MACHINE\n\n\n\n}}}  // OVR::Util::Render\n\n#endif\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Vision/SensorFusion/Vision_SensorState.h",
    "content": "/************************************************************************************\n\nFilename    :   Vision_SensorState.h\nContent     :   Sensor state information shared by tracking system with games\nCreated     :   May 13, 2014\nAuthors     :   Dov Katz, Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, Inc. All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Vision_SensorState_h\n#define OVR_Vision_SensorState_h\n\n#include \"Vision/Vision_Common.h\"\n#include \"Kernel/OVR_SharedMemory.h\"\n#include \"Kernel/OVR_Lockless.h\"\n#include \"Kernel/OVR_String.h\"\n#include \"Util/Util_LatencyTest2State.h\"\n#include \"Sensors/OVR_DeviceConstants.h\"\n\n\nnamespace OVR { namespace Vision {\n\n\n// Bit flags describing the current status of sensor tracking.\n// These values must be the same as ovrStatusBits\nenum StatusBits\n{\n    // Tracked bits: Toggled by SensorFusion\n    Status_OrientationTracked = 0x0001, // Orientation is currently tracked (connected and in use)\n    Status_PositionTracked    = 0x0002, // Position is currently tracked (false if out of range)\n    Status_CameraPoseTracked  = 0x0004, // Camera pose is currently tracked\n\n    // Connected bits: Toggled by TrackingManager\n    Status_PositionConnected  = 0x0020, // Position tracking HW is connected\n    Status_BuiltinConnected   = 0x0040, // Builtin tracking HW is connected\n    Status_HMDConnected       = 0x0080, // HMD is available & connected\n\n    // Masks\n    Status_AllMask = 0xffff,\n    Status_TrackingMask = Status_PositionTracked | Status_OrientationTracked | Status_CameraPoseTracked,\n    Status_ConnectedMask = Status_PositionConnected | Status_HMDConnected,\n};\n\n#pragma pack(push, 8)\n\n// TrackedObject state stored in lockless updater \"queue\" and used for \n// prediction by SensorStateReader\nstruct LocklessSensorState\n{\n    PoseState<double> WorldFromImu;\n    SensorDataType    RawSensorData;\n\n    // DO NOT USE\n    // only preserved for backwards compatibility\n    Pose<double>      WorldFromCamera_DEPRECATED;\n\n    uint32_t          StatusFlags;\n    uint32_t          _PAD_0_;\n\n    // ImuFromCpf for HMD pose tracking\n    Posed             ImuFromCpf;\n\n    // Initialized to invalid state\n    LocklessSensorState() :\n       WorldFromImu()\n     , RawSensorData()\n     , WorldFromCamera_DEPRECATED()\n     , StatusFlags(0)\n     , _PAD_0_(0) // This assignment should be irrelevant, but it quells static/runtime analysis complaints.\n     , ImuFromCpf()\n    {\n    }\n};\n\nstatic_assert((sizeof(LocklessSensorState) == sizeof(PoseState<double>) + sizeof(SensorDataType) + sizeof(Pose<double>) + 2*sizeof(uint32_t) + sizeof(Posed)), \"sizeof(LocklessSensorState) failure\");\n\nstruct LocklessCameraState\n{\n    Pose<double>      WorldFromCamera;\n\n    uint32_t          StatusFlags;\n    uint32_t          _PAD_0_;\n\n    // Initialized to invalid state\n    LocklessCameraState() :\n        WorldFromCamera()\n        , StatusFlags(0)\n        , _PAD_0_(0) // This assignment should be irrelevant, but it quells static/runtime analysis complaints.\n    {\n    }\n};\n\nstatic_assert((sizeof(LocklessCameraState) == sizeof(Pose<double>) + 2 * sizeof(uint32_t)), \"sizeof(LocklessCameraState) failure\");\n\n\n// Padded out version stored in the updater slots\n// Designed to be a larger fixed size to allow the data to grow in the future\n// without breaking older compiled code.\nOVR_DISABLE_MSVC_WARNING(4351)\ntemplate <class Payload, int PaddingSize>\nstruct LocklessPadding\n{\n    uint8_t buffer[PaddingSize];\n    \n    LocklessPadding() : buffer() { }\n\n    LocklessPadding& operator=(const Payload& rhs)\n    {\n        // if this fires off, then increase PaddingSize\n        // IMPORTANT: this WILL break backwards compatibility\n        static_assert(sizeof(buffer) >= sizeof(Payload), \"PaddingSize is too small\");\n\n        memcpy(buffer, &rhs, sizeof(Payload));\n        return *this;\n    }\n\n    operator Payload() const\n    {\n        Payload result;\n        memcpy(&result, buffer, sizeof(Payload));\n        return result;\n    }\n};\nOVR_RESTORE_MSVC_WARNING()\n\n#pragma pack(pop)\n\n//// Lockless updaters\n\nstruct CombinedHmdUpdater\n{\n    // IMPORTANT: do not add more data to this struct\n    // new objects should have their own shared memory blocks\n    LocklessUpdater<LocklessSensorState, LocklessPadding<LocklessSensorState, 512> > SensorState;\n    LocklessUpdater<Util::FrameTimeRecordSet, Util::FrameTimeRecordSet> LatencyTest;\n};\n\n\ntypedef LocklessUpdater<LocklessCameraState, LocklessPadding<LocklessCameraState, 512> > CameraStateUpdater;\n\n\n}} // namespace OVR::Vision\n\n#endif\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Vision/SensorFusion/Vision_SensorStateReader.cpp",
    "content": "/************************************************************************************\n\nFilename    :   Vision_SensorStateReader.cpp\nContent     :   Separate reader component that is able to recover sensor pose\nCreated     :   June 4, 2014\nAuthors     :   Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#include \"Vision_SensorStateReader.h\"\n\n\nnamespace OVR { namespace Vision {\n\n\n//-------------------------------------------------------------------------------------\n\n// This is a \"perceptually tuned predictive filter\", which means that it is optimized\n// for improvements in the VR experience, rather than pure error.  In particular,\n// jitter is more perceptible at lower speeds whereas latency is more perceptible\n// after a high-speed motion.  Therefore, the prediction interval is dynamically\n// adjusted based on speed.  Significant more research is needed to further improve\n// this family of filters.\nstatic Pose<double> calcPredictedPose(const PoseState<double>& poseState, double predictionDt)\n{\n    Pose<double> pose = poseState.ThePose;\n    const double linearCoef = 1.0;\n    Vector3d angularVelocity = poseState.AngularVelocity;\n    double angularSpeed = angularVelocity.Length();\n\n    // This could be tuned so that linear and angular are combined with different coefficients\n    double speed = angularSpeed + linearCoef * poseState.LinearVelocity.Length();\n\n    const double slope = 0.2; // The rate at which the dynamic prediction interval varies\n    double candidateDt = slope * speed; // TODO: Replace with smoothstep function\n\n    double dynamicDt = predictionDt;\n\n    // Choose the candidate if it is shorter, to improve stability\n    if (candidateDt < predictionDt)\n    {\n        dynamicDt = candidateDt;\n    }\n\n    if (angularSpeed > 0.001)\n    {\n        pose.Rotation = pose.Rotation * Quatd(angularVelocity, angularSpeed * dynamicDt);\n    }\n\n    pose.Translation += poseState.LinearVelocity * dynamicDt;\n\n    return pose;\n}\n\nPoseState<float> calcPredictedPoseState(const LocklessSensorState& sensorState, double absoluteTime, const Posed& centeredFromWorld)\n{\n    // Delta time from the last available data\n    double pdt = absoluteTime - sensorState.WorldFromImu.TimeInSeconds;\n    static const double maxPdt = 0.1;\n\n    // If delta went negative due to synchronization problems between processes or just a lag spike,\n    if (pdt < 0)\n    {\n        pdt = 0;\n    }\n    else if (pdt > maxPdt)\n    {\n        pdt = maxPdt;\n        static double lastLatWarnTime = 0;\n        if (lastLatWarnTime != sensorState.WorldFromImu.TimeInSeconds)\n        {\n            lastLatWarnTime = sensorState.WorldFromImu.TimeInSeconds;\n            LogText(\"[TrackingStateReader] Prediction interval too high: %f s, clamping at %f s\\n\", pdt, maxPdt);\n        }\n    }\n\n    PoseStatef result;\n    result = PoseStatef(sensorState.WorldFromImu);\n    result.TimeInSeconds = absoluteTime;\n    result.ThePose = Posef(centeredFromWorld * calcPredictedPose(sensorState.WorldFromImu, pdt) * sensorState.ImuFromCpf);\n    return result;\n}\n\n//// TrackingStateReader\n\n// Pre-0.5.0 applications assume that the initial WorldFromCentered\n// pose is always identity, because the WorldFromImu pose has a 180-degree flip in Y \n// and a 1-meter offset in Z.  See CAPI_HMDState.cpp\nPosed TrackingStateReader::DefaultWorldFromCentered(Quatd::Identity(), Vector3d(0, 0, 0));\n\n// At startup, we want an identity pose when the user is looking along the positive camera Z axis, one meter in front of camera.\n// That is a 180 degree rotation about Y, with a -1 meter translation (the inverse of this pose, CenteredFromWorld, is actually used)\n// (NOTE: This pose should be the same as SensorFusionFilter::DefaultWorldFromImu)\n//\n//Posed TrackingStateReader::DefaultWorldFromCentered(Quatd(0, 1, 0, 0), Vector3d(0, 0, -1));\n\nTrackingStateReader::TrackingStateReader() :\n    HmdUpdater(nullptr),\n    CameraUpdater(nullptr)\n{\n    CenteredFromWorld = GetDefaultCenteredFromWorld();\n}\n\nvoid TrackingStateReader::SetUpdaters(const CombinedHmdUpdater *hmd, const CameraStateUpdater *camera)\n{\n    HmdUpdater    = hmd;\n    CameraUpdater = camera;\n}\n\n\n// This function centers tracking on the current pose, such that when the\n// headset is positioned at the current pose and looking level in the current direction,\n// the tracking system pose will be identity.\n// In other words, tracking is relative to this centered pose.\n//\nbool TrackingStateReader::RecenterPose(const Vector3d& neckModelOffset)\n{\n    if (!HmdUpdater)\n        return false;\n\n    const LocklessSensorState lstate = HmdUpdater->SensorState.GetState();\n    Posed worldFromCpf = (lstate.WorldFromImu.ThePose * lstate.ImuFromCpf);\n\n    return ComputeCenteredFromWorld(worldFromCpf, neckModelOffset);\n}\n\nbool TrackingStateReader::ComputeCenteredFromWorld(const Posed& worldFromCpf, const Vector3d& neckModel)\n{\n    // Position of CPF in the head rotation center frame\n    const Vector3d cpfInRotationCenter = neckModel;\n\n    const Vector3d forward(0, 0, -1);\n    const Vector3d up(0, 1, 0);\n    Vector3d look = worldFromCpf.Rotate(forward);\n\n    // If the headset is pointed straight up or straight down,\n    // it may be face down on a tabletop.  In this case we\n    // can't reliably extract a heading angle.\n    // We assume straight ahead and return false so caller \n    // knows that recenter may not be reliable.\n    bool headingValid = true;\n    static const double lookTol = cos(DegreeToRad(20.0));\n    if (fabs(look.Dot(up)) >= lookTol)    // fabs(lookBack.Dot(up))\n    {\n        look = forward;\n        headingValid = false;\n    }\n\n    // Now compute the orientation of the headset when looking straight ahead:\n    // Extract the heading (yaw) component of the pose\n    Vector3d centeredLook = Vector3d(look.x, 0, look.z).Normalized();\n    Quatd centeredOrientation = Quatd::Align(centeredLook, forward);\n\n    // Compute the position in world space of the head rotation center:\n    // we assume the head rotates about this point in space.\n    Vector3d headRotationCenter = worldFromCpf.Transform(-cpfInRotationCenter);\n\n    // Now apply the heading rotation to compute the reference position of the CPF\n    // relative to the head rotation center.\n    Vector3d centeredCpfPos = headRotationCenter + centeredOrientation.Rotate(cpfInRotationCenter);\n\n    // Now compute the centered pose of the CPF.\n    Posed worldFromCentered(centeredOrientation, centeredCpfPos);\n\n    // For tracking, we use the inverse of the centered pose\n    CenteredFromWorld = worldFromCentered.Inverted();\n\n    return headingValid;\n}\n\nbool TrackingStateReader::GetTrackingStateAtTime(double absoluteTime, TrackingState& ss) const\n{\n    LocklessCameraState cameraState;\n    LocklessSensorState sensorState;\n\n    if (CameraUpdater)\n        cameraState = CameraUpdater->GetState();\n    if (HmdUpdater)\n        sensorState = HmdUpdater->SensorState.GetState();\n\n    // Update the status flags\n    ss.StatusFlags = cameraState.StatusFlags | sensorState.StatusFlags;\n\n    // If no hardware is connected, override the tracking flags\n    if (0 == (ss.StatusFlags & Status_HMDConnected))\n    {\n        ss.StatusFlags &= ~Status_TrackingMask;\n    }\n    if (0 == (ss.StatusFlags & Status_PositionConnected))\n    {\n        ss.StatusFlags &= ~(Status_PositionTracked | Status_CameraPoseTracked);\n    }\n\n    // If tracking info is invalid,\n    if (0 == (ss.StatusFlags & Status_TrackingMask))\n    {\n        return false;\n    }\n    \n    ss.HeadPose = calcPredictedPoseState(sensorState, absoluteTime, CenteredFromWorld);\n\n    ss.CameraPose        = Posef(CenteredFromWorld * cameraState.WorldFromCamera);\n    ss.LeveledCameraPose = Posef(CenteredFromWorld * Posed(Quatd(), cameraState.WorldFromCamera.Translation));\n\n    ss.RawSensorData = sensorState.RawSensorData;\n    return true;\n}\n\nbool TrackingStateReader::GetPoseAtTime(double absoluteTime, Posef& transform) const\n{\n    TrackingState ss;\n\n    if (!GetTrackingStateAtTime(absoluteTime, ss))\n    {\n        return false;\n    }\n\n    transform = ss.HeadPose.ThePose;\n\n    return true;\n}\n\nuint32_t TrackingStateReader::GetStatus() const\n{\n    TrackingState ss;\n\n    if (!GetTrackingStateAtTime(0, ss))\n    {\n        return 0;\n    }\n\n    return ss.StatusFlags;\n}\n\n\n}} // namespace OVR::Vision\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Vision/SensorFusion/Vision_SensorStateReader.h",
    "content": "/************************************************************************************\n\nFilename    :   Vision_SensorStateReader.h\nContent     :   Separate reader component that is able to recover sensor pose\nCreated     :   June 4, 2014\nAuthors     :   Chris Taylor\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\"); \nyou may not use the Oculus VR Rift SDK except in compliance with the License, \nwhich is provided at the time of installation or download, or which \notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2 \n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK \ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Vision_SensorStateReader_h\n#define OVR_Vision_SensorStateReader_h\n\n#include \"Kernel/OVR_Lockless.h\"\n#include \"Vision_SensorState.h\"\n\n#include \"OVR_Profile.h\"\n\n\n// CAPI forward declarations.\nstruct ovrTrackingState_;\ntypedef struct ovrTrackingState_ ovrTrackingState;\n\nnamespace OVR { namespace Vision {\n\n\n//-----------------------------------------------------------------------------\n// TrackingStateReader\n\n// Full output of tracking reported by GetSensorStateAtTime()\nclass TrackingState\n{\npublic:\n    TrackingState() : StatusFlags(0) { }\n\n    // C-interop support\n    TrackingState(const ovrTrackingState& s);\n    operator ovrTrackingState () const;\n\n    // HMD pose information for the requested time.\n    PoseStatef   HeadPose;\n\n    // Orientation and position of the external camera, if present.\n    Posef        CameraPose;\n    // Orientation and position of the camera after alignment with gravity \n    Posef        LeveledCameraPose;\n\n    // Most recent sensor data received from the HMD\n    SensorDataType RawSensorData;\n\n    // Sensor status described by ovrStatusBits.\n    uint32_t     StatusFlags;\n\n};\n\n// User interface to retrieve pose from the sensor fusion subsystem\nclass TrackingStateReader : public NewOverrideBase\n{\nprotected:\n    const CombinedHmdUpdater* HmdUpdater;\n    const CameraStateUpdater* CameraUpdater;\n\n    // Transform from real-world coordinates to centered coordinates\n    Posed CenteredFromWorld; \n    static Posed DefaultWorldFromCentered;\n\npublic:\n    TrackingStateReader();\n\n    // Initialize the updaters\n    void SetUpdaters(const CombinedHmdUpdater *hmd, const CameraStateUpdater *camera);\n\n\n    // Re-centers on the current yaw and translation, taking\n    // the head-neck model into account.\n    bool         RecenterPose(const Vector3d& neckModeloffset);\n\n    // Computes CenteredFromWorld from a worldFromCpf pose and neck model offset\n    bool         ComputeCenteredFromWorld(const Posed& worldFromCpf, const Vector3d& neckModelOffset);\n\n    // Get the full dynamical system state of the CPF, which includes velocities and accelerations,\n    // predicted at a specified absolute point in time.\n    bool         GetTrackingStateAtTime(double absoluteTime, TrackingState& state) const;\n\n    // Get the predicted pose (orientation, position) of the center pupil frame (CPF) at a specific point in time.\n    bool         GetPoseAtTime(double absoluteTime, Posef& transform) const;\n\n    // Get the sensor status (same as GetSensorStateAtTime(...).Status)\n    uint32_t     GetStatus() const;\n\n    Posed GetCenteredFromWorld() const\n    {\n        return CenteredFromWorld;\n    }\n\n    Posed GetDefaultCenteredFromWorld() const\n    {\n        return DefaultWorldFromCentered.Inverted();\n    }\n};\n\n\n}} // namespace OVR::Vision\n\n#endif // Vision_SensorStateReader_h\n"
  },
  {
    "path": "externals/ovr-0.5.0.1/Src/Vision/Vision_Common.h",
    "content": "/************************************************************************************\n\nFilename    :   OVR_Vision_Common.h\nContent     :   Common data structures that are used in multiple vision files\nCreated     :   November 25, 2014\nAuthors     :   Max Katsev\n\nCopyright   :   Copyright 2014 Oculus VR, LLC All Rights reserved.\n\nLicensed under the Oculus VR Rift SDK License Version 3.2 (the \"License\");\nyou may not use the Oculus VR Rift SDK except in compliance with the License,\nwhich is provided at the time of installation or download, or which\notherwise accompanies this software in either electronic or hard copy form.\n\nYou may obtain a copy of the License at\n\nhttp://www.oculusvr.com/licenses/LICENSE-3.2\n\nUnless required by applicable law or agreed to in writing, the Oculus VR SDK\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*************************************************************************************/\n\n#ifndef OVR_Vision_Common_h\n#define OVR_Vision_Common_h\n\n#include \"Kernel/OVR_RefCount.h\"\n#include \"Extras/OVR_Math.h\"\n#include \"Kernel/OVR_Array.h\"\n#include \"Kernel/OVR_Log.h\"\n#include \"Sensors/OVR_DeviceConstants.h\"\n\n// Compatible types (these are declared in global namespace)\ntypedef struct ovrPoseStatef_ ovrPoseStatef;\ntypedef struct ovrPoseStated_ ovrPoseStated;\n\nnamespace OVR { namespace Vision {\n    \n// Global \"calibration mode\" used by calibration tools to change\n// the behavior of the SDK for calibration/experimentation purposes.\n// This flag is set at system startup by calibration tools, and never changed.\n\nextern int BundleCalibrationMode;\n\n// Vision <-> OVR transform functions\n//\n// These transforms are required across the interface to many of the\n// matching and reconstruction functions.\n//\n// OVR system is x+ right, y+ up, z+ back.\n// Vision system is x+ right, y+ down, z+ forward.\n// This is a 180 degree rotation about X axis.\n//\ntemplate<typename T> inline Vector3<T> VisionFromOvr(const Vector3<T>& ovr)       { return Vector3<T>(ovr.x, -ovr.y, -ovr.z); }\ntemplate<typename T> inline Vector3<T> OvrFromVision(const Vector3<T>& vision)    { return Vector3<T>(vision.x, -vision.y, -vision.z); }\n    \ntemplate<typename T> inline Quat<T> VisionFromOvr(const Quat<T>& ovr)       { return Quat<T>(ovr.x, -ovr.y, -ovr.z, ovr.w); }\ntemplate<typename T> inline Quat<T> OvrFromVision(const Quat<T>& vision)    { return Quat<T>(vision.x, -vision.y, -vision.z, vision.w); }\n\ntemplate<typename T> inline Pose<T> VisionFromOvr(const Pose<T>& ovr)       { return Pose<T>(VisionFromOvr(ovr.Rotation), VisionFromOvr(ovr.Translation)); }\ntemplate<typename T> inline Pose<T> OvrFromVision(const Pose<T>& vision)    { return Pose<T>(OvrFromVision(vision.Rotation), OvrFromVision(vision.Translation)); }\n\nstruct ImuSample\n{\n    double Time;\n\n    Vector3d Accelerometer;\n    Vector3d Gyro;\n    Vector3d Magnetometer;\n    double Temperature;\n\n    ImuSample() : Time(-1), \n                  Temperature(-1) {}\n\n    ImuSample(const SensorDataType& data) : Time(data.AbsoluteTimeSeconds),\n                                            Accelerometer(data.Acceleration),\n                                            Gyro(data.RotationRate),\n                                            Magnetometer(data.MagneticField),\n                                            Temperature(data.Temperature) {}\n};\n\nstruct PoseSample\n{\n    double Time;\n    Posed ThePose;\n    Vector3d LinearVelocity, AngularVelocity;\n\n    // stats for LED tracking\n    int LedsCount;\n    double ObjectSpaceError;\n    // stats for sphere tracking\n    int ContourCount;\n    double CircleRadius;\n\n    bool HasOrientation, HasPosition, HasVelocities;\n    // true => ThePose == WorldFromImu, false => ThePose == CameraFromImu\n    bool IsInWorldFrame;\n\n    void ApplyWorldFromCamera(const Posed& worldFromCamera)\n    {\n        OVR_ASSERT(!IsInWorldFrame);\n\n        IsInWorldFrame = true;\n        ThePose = worldFromCamera * ThePose;\n        if (HasVelocities)\n        {\n            LinearVelocity = worldFromCamera.Rotate(LinearVelocity);\n            AngularVelocity = worldFromCamera.Rotate(AngularVelocity);\n    }\n    }\n\n    friend PoseSample operator*(const PoseSample& sample, const Posed& trans)\n    {\n        PoseSample result = sample;\n        result.ThePose = sample.ThePose * trans;\n        // if we don't have orientation, the result will be useless - this is probably not expected to happen\n        OVR_ASSERT(sample.HasOrientation); \n        result.HasPosition = sample.HasPosition && sample.HasOrientation;\n        return result;\n    }\n\n    PoseSample(double time = -1) : Time(time),\n                   LedsCount(-1),\n                   ObjectSpaceError(-1),\n                   ContourCount(-1),\n                   CircleRadius(-1),\n                   HasOrientation(false),\n                   HasPosition(false),\n                   HasVelocities(false),\n                   IsInWorldFrame(false) {}\n};\n\nstruct PoseEstimate\n{\n    Posed WorldFromImu, CameraFromWorld;\n\n    bool HasPosition, HasOrientation, HasUp;\n\n    Posed CameraFromImu() const\n    {\n        return CameraFromWorld * WorldFromImu;\n    }\n\n    friend PoseEstimate operator*(const PoseEstimate& estimate, const Posed& trans)\n{\n    PoseEstimate result = estimate;\n    result.WorldFromImu = estimate.WorldFromImu * trans;\n    // if we don't have orientation, the result will be useless - this is probably not expected to happen\n    OVR_ASSERT(estimate.HasOrientation);\n    result.HasPosition = estimate.HasPosition && estimate.HasOrientation;\n    return result;\n    }\n\n    PoseEstimate(const Posed& worldFromCamera) :\n        CameraFromWorld(worldFromCamera.Inverted()),\n        HasPosition(false),\n        HasOrientation(false),\n        HasUp(false) {}\n};\n\n} // namespace OVR::Vision\n\n// PoseState describes the complete pose, or a rigid body configuration, at a\n// point in time, including first and second derivatives. It is used to specify\n// instantaneous location and movement of the headset.\n// SensorState is returned as a part of the sensor state.\n\ntemplate<class T>\nclass PoseState\n{\npublic:\n\ttypedef typename CompatibleTypes<Pose<T> >::Type CompatibleType;\n\n\tPoseState() : TimeInSeconds(0.0) { }\n\n\t// float <-> double conversion constructor.\n\texplicit PoseState(const PoseState<typename Math<T>::OtherFloatType> &src)\n\t\t: ThePose(src.ThePose),\n\t\tAngularVelocity(src.AngularVelocity), LinearVelocity(src.LinearVelocity),\n\t\tAngularAcceleration(src.AngularAcceleration), LinearAcceleration(src.LinearAcceleration),\n\t\tTimeInSeconds(src.TimeInSeconds)\n\t{ }\n\n\t// C-interop support: PoseStatef <-> ovrPoseStatef\n\tPoseState(const typename CompatibleTypes<PoseState<T> >::Type& src)\n\t\t: ThePose(src.ThePose),\n\t\tAngularVelocity(src.AngularVelocity), LinearVelocity(src.LinearVelocity),\n\t\tAngularAcceleration(src.AngularAcceleration), LinearAcceleration(src.LinearAcceleration),\n\t\tTimeInSeconds(src.TimeInSeconds)\n\t{ }\n\n\toperator typename CompatibleTypes<PoseState<T> >::Type() const\n\t{\n\t\ttypename CompatibleTypes<PoseState<T> >::Type result;\n\t\tresult.ThePose = ThePose;\n\t\tresult.AngularVelocity = AngularVelocity;\n\t\tresult.LinearVelocity = LinearVelocity;\n\t\tresult.AngularAcceleration = AngularAcceleration;\n\t\tresult.LinearAcceleration = LinearAcceleration;\n\t\tresult.TimeInSeconds = TimeInSeconds;\n\t\treturn result;\n\t}\n\n\tPose<T> ThePose;\n\tVector3<T>  AngularVelocity;\n\tVector3<T>  LinearVelocity;\n\tVector3<T>  AngularAcceleration;\n\tVector3<T>  LinearAcceleration;\n\t// Absolute time of this state sample; always a double measured in seconds.\n\tdouble      TimeInSeconds;\n\n\t// ***** Helpers for Pose integration\n\n    // Stores and integrates gyro angular velocity reading for a given time step.\n    void StoreAndIntegrateGyro(Vector3d angVel, double dt)\n    {\n        AngularVelocity = angVel;\n        ThePose.Rotation *= Quatd::FromRotationVector(angVel * dt);\n    }\n\n    void StoreAndIntegrateAccelerometer(Vector3d linearAccel, double dt)\n    {\n        LinearAcceleration = linearAccel;\n        ThePose.Translation += LinearVelocity * dt + LinearAcceleration * (dt * dt * 0.5);\n        LinearVelocity += LinearAcceleration * dt;\n    }\n\n    friend PoseState operator*(const Pose<T>& trans, const PoseState& poseState)\n{\n        PoseState result;\n\tresult.ThePose             = trans * poseState.ThePose;\n\tresult.LinearVelocity      = trans.Rotate(poseState.LinearVelocity);\n\tresult.LinearAcceleration  = trans.Rotate(poseState.LinearAcceleration);\n\tresult.AngularVelocity     = trans.Rotate(poseState.AngularVelocity);\n\tresult.AngularAcceleration = trans.Rotate(poseState.AngularAcceleration);\n\treturn result;\n}\n};\n\n// External API returns pose as float, but uses doubles internally for quaternion precision.\ntypedef PoseState<float>  PoseStatef;\ntypedef PoseState<double> PoseStated;\n\n// Compatible types\ntemplate<> struct CompatibleTypes<PoseState<float> > { typedef ovrPoseStatef Type; };\ntemplate<> struct CompatibleTypes<PoseState<double> > { typedef ovrPoseStated Type; };\n\n// Handy debug output functions\ntemplate<typename T>\nvoid Dump(const char* label, const Pose<T>& pose)\n{\n    auto t = pose.Translation * 1000;\n    auto r = pose.Rotation.ToRotationVector();\n    double angle = RadToDegree(r.Length());\n    if (r.LengthSq() > 0)\n        r.Normalize();\n    LogText(\"%s: %.2f, %.2f, %.2f mm, %.2f deg %.2f, %.2f, %.2f\\n\",\n            label, t.x, t.y, t.z, angle, r.x, r.y, r.z);\n}\n\ntemplate<typename T>\nvoid Dump(const char* label, const Vector3<T>& v)\n{\n    LogText(\"%s %.5g, %.5g, %.5g (%.5g)\\n\", label, v.x, v.y, v.z, v.Length());\n}\n\ntemplate<typename T>\nvoid Dump(const char* label, const Quat<T>& q)\n{\n    auto r = q.ToRotationVector();\n    auto axis = r.Normalized();\n    auto angle = RadToDegree(r.Length());\n    LogText(\"%s %.2f (%.2f, %.2f, %.2f)\\n\", label, angle, axis.x, axis.y, axis.z);\n}\n\ntemplate<typename T>\nvoid Dump(const char* label, double time, const Pose<T>& p)\n{\n    LogText(\"%.4f: \", time);\n    Dump(label, p);\n}\n\nstatic_assert((sizeof(PoseState<double>) == sizeof(Pose<double>) + 4 * sizeof(Vector3<double>) + sizeof(double)), \"sizeof(PoseState<double>) failure\");\n#ifdef OVR_CPU_X86_64\nstatic_assert((sizeof(PoseState<float>) == sizeof(Pose<float>) + 4 * sizeof(Vector3<float>) + sizeof(uint32_t)+sizeof(double)), \"sizeof(PoseState<float>) failure\"); //TODO: Manually pad template.\n#elif defined(OVR_OS_WIN32) // The Windows 32 bit ABI aligns 64 bit values on 64 bit boundaries\nstatic_assert((sizeof(PoseState<float>) == sizeof(Pose<float>) + 4 * sizeof(Vector3<float>) + sizeof(uint32_t)+sizeof(double)), \"sizeof(PoseState<float>) failure\");\n#elif defined(OVR_CPU_ARM) // ARM aligns 64 bit values to 64 bit boundaries: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472k/chr1359125009502.html\nstatic_assert((sizeof(PoseState<float>) == sizeof(Pose<float>) + 4 * sizeof(Vector3<float>) + sizeof(uint32_t)+sizeof(double)), \"sizeof(PoseState<float>) failure\");\n#else // Else Unix/Apple 32 bit ABI, which aligns 64 bit values on 32 bit boundaries.\nstatic_assert((sizeof(PoseState<float>) == sizeof(Pose<float>) + 4 * sizeof(Vector3<float>) + sizeof(double)), \"sizeof(PoseState<float>) failure:\");\n#endif\n\n} // namespace OVR\n\n#endif // OVR_Vision_Common_h\n"
  },
  {
    "path": "externals/stb/stb_image.h",
    "content": "/* stb_image - v2.02 - public domain image loader - http://nothings.org/stb_image.h\n                                     no warranty implied; use at your own risk\n\n   Do this:\n      #define STB_IMAGE_IMPLEMENTATION\n   before you include this file in *one* C or C++ file to create the implementation.\n\n   // i.e. it should look like this:\n   #include ...\n   #include ...\n   #include ...\n   #define STB_IMAGE_IMPLEMENTATION\n   #include \"stb_image.h\"\n\n   You can #define STBI_ASSERT(x) before the #include to avoid using assert.h.\n   And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free\n\n\n   QUICK NOTES:\n      Primarily of interest to game developers and other people who can\n          avoid problematic images and only need the trivial interface\n\n      JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib)\n      PNG 1/2/4/8-bit-per-channel (16 bpc not supported)\n\n      TGA (not sure what subset, if a subset)\n      BMP non-1bpp, non-RLE\n      PSD (composited view only, no extra channels)\n\n      GIF (*comp always reports as 4-channel)\n      HDR (radiance rgbE format)\n      PIC (Softimage PIC)\n      PNM (PPM and PGM binary only)\n\n      - decode from memory or through FILE (define STBI_NO_STDIO to remove code)\n      - decode from arbitrary I/O callbacks\n      - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON)\n\n   Full documentation under \"DOCUMENTATION\" below.\n\n\n   Revision 2.00 release notes:\n\n      - Progressive JPEG is now supported.\n\n      - PPM and PGM binary formats are now supported, thanks to Ken Miller.\n\n      - x86 platforms now make use of SSE2 SIMD instructions for\n        JPEG decoding, and ARM platforms can use NEON SIMD if requested.\n        This work was done by Fabian \"ryg\" Giesen. SSE2 is used by\n        default, but NEON must be enabled explicitly; see docs.\n\n        With other JPEG optimizations included in this version, we see\n        2x speedup on a JPEG on an x86 machine, and a 1.5x speedup\n        on a JPEG on an ARM machine, relative to previous versions of this\n        library. The same results will not obtain for all JPGs and for all\n        x86/ARM machines. (Note that progressive JPEGs are significantly\n        slower to decode than regular JPEGs.) This doesn't mean that this\n        is the fastest JPEG decoder in the land; rather, it brings it\n        closer to parity with standard libraries. If you want the fastest\n        decode, look elsewhere. (See \"Philosophy\" section of docs below.)\n\n        See final bullet items below for more info on SIMD.\n\n      - Added STBI_MALLOC, STBI_REALLOC, and STBI_FREE macros for replacing\n        the memory allocator. Unlike other STBI libraries, these macros don't\n        support a context parameter, so if you need to pass a context in to\n        the allocator, you'll have to store it in a global or a thread-local\n        variable.\n\n      - Split existing STBI_NO_HDR flag into two flags, STBI_NO_HDR and\n        STBI_NO_LINEAR.\n            STBI_NO_HDR:     suppress implementation of .hdr reader format\n            STBI_NO_LINEAR:  suppress high-dynamic-range light-linear float API\n\n      - You can suppress implementation of any of the decoders to reduce\n        your code footprint by #defining one or more of the following\n        symbols before creating the implementation.\n\n            STBI_NO_JPEG\n            STBI_NO_PNG\n            STBI_NO_BMP\n            STBI_NO_PSD\n            STBI_NO_TGA\n            STBI_NO_GIF\n            STBI_NO_HDR\n            STBI_NO_PIC\n            STBI_NO_PNM   (.ppm and .pgm)\n\n      - You can request *only* certain decoders and suppress all other ones\n        (this will be more forward-compatible, as addition of new decoders\n        doesn't require you to disable them explicitly):\n\n            STBI_ONLY_JPEG\n            STBI_ONLY_PNG\n            STBI_ONLY_BMP\n            STBI_ONLY_PSD\n            STBI_ONLY_TGA\n            STBI_ONLY_GIF\n            STBI_ONLY_HDR\n            STBI_ONLY_PIC\n            STBI_ONLY_PNM   (.ppm and .pgm)\n\n         Note that you can define multiples of these, and you will get all\n         of them (\"only x\" and \"only y\" is interpreted to mean \"only x&y\").\n\n       - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still\n         want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB\n\n      - Compilation of all SIMD code can be suppressed with\n            #define STBI_NO_SIMD\n        It should not be necessary to disable SIMD unless you have issues\n        compiling (e.g. using an x86 compiler which doesn't support SSE\n        intrinsics or that doesn't support the method used to detect\n        SSE2 support at run-time), and even those can be reported as\n        bugs so I can refine the built-in compile-time checking to be\n        smarter.\n\n      - The old STBI_SIMD system which allowed installing a user-defined\n        IDCT etc. has been removed. If you need this, don't upgrade. My\n        assumption is that almost nobody was doing this, and those who\n        were will find the built-in SIMD more satisfactory anyway.\n\n      - RGB values computed for JPEG images are slightly different from\n        previous versions of stb_image. (This is due to using less\n        integer precision in SIMD.) The C code has been adjusted so\n        that the same RGB values will be computed regardless of whether\n        SIMD support is available, so your app should always produce\n        consistent results. But these results are slightly different from\n        previous versions. (Specifically, about 3% of available YCbCr values\n        will compute different RGB results from pre-1.49 versions by +-1;\n        most of the deviating values are one smaller in the G channel.)\n\n      - If you must produce consistent results with previous versions of\n        stb_image, #define STBI_JPEG_OLD and you will get the same results\n        you used to; however, you will not get the SIMD speedups for\n        the YCbCr-to-RGB conversion step (although you should still see\n        significant JPEG speedup from the other changes).\n\n        Please note that STBI_JPEG_OLD is a temporary feature; it will be\n        removed in future versions of the library. It is only intended for\n        near-term back-compatibility use.\n\n\n   Latest revision history:\n      2.02  (2015-01-19) fix incorrect assert, fix warning\n      2.01  (2015-01-17) fix various warnings\n      2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG\n      2.00  (2014-12-25) optimize JPEG, including x86 SSE2 & ARM NEON SIMD\n                         progressive JPEG\n                         PGM/PPM support\n                         STBI_MALLOC,STBI_REALLOC,STBI_FREE\n                         STBI_NO_*, STBI_ONLY_*\n                         GIF bugfix\n      1.48  (2014-12-14) fix incorrectly-named assert()\n      1.47  (2014-12-14) 1/2/4-bit PNG support (both grayscale and paletted)\n                         optimize PNG\n                         fix bug in interlaced PNG with user-specified channel count\n      1.46  (2014-08-26) fix broken tRNS chunk in non-paletted PNG\n      1.45  (2014-08-16) workaround MSVC-ARM internal compiler error by wrapping malloc\n\n   See end of file for full revision history.\n\n\n ============================    Contributors    =========================\n\n Image formats                                Bug fixes & warning fixes\n    Sean Barrett (jpeg, png, bmp)                Marc LeBlanc\n    Nicolas Schulz (hdr, psd)                    Christpher Lloyd\n    Jonathan Dummer (tga)                        Dave Moore\n    Jean-Marc Lienher (gif)                      Won Chun\n    Tom Seddon (pic)                             the Horde3D community\n    Thatcher Ulrich (psd)                        Janez Zemva\n    Ken Miller (pgm, ppm)                        Jonathan Blow\n                                                 Laurent Gomila\n                                                 Aruelien Pocheville\n Extensions, features                            Ryamond Barbiero\n    Jetro Lauha (stbi_info)                      David Woo\n    Martin \"SpartanJ\" Golini (stbi_info)         Martin Golini\n    James \"moose2000\" Brown (iPhone PNG)         Roy Eltham\n    Ben \"Disch\" Wenger (io callbacks)            Luke Graham\n    Omar Cornut (1/2/4-bit PNG)                  Thomas Ruf\n                                                 John Bartholomew\n                                                 Ken Hamada\n Optimizations & bugfixes                        Cort Stratton\n    Fabian \"ryg\" Giesen                          Blazej Dariusz Roszkowski\n    Arseny Kapoulkine                            Thibault Reuille\n                                                 Paul Du Bois\n                                                 Guillaume George\n  If your name should be here but                Jerry Jansson\n  isn't, let Sean know.                          Hayaki Saito\n                                                 Johan Duparc\n                                                 Ronny Chevalier\n                                                 Michal Cichon\n                                                 Tero Hanninen\n                                                 Sergio Gonzalez\n                                                 Cass Everitt\n                                                 Engin Manap\n\nLicense:\n   This software is in the public domain. Where that dedication is not\n   recognized, you are granted a perpetual, irrevocable license to copy\n   and modify this file however you want.\n\n*/\n\n#ifndef STBI_INCLUDE_STB_IMAGE_H\n#define STBI_INCLUDE_STB_IMAGE_H\n\n// DOCUMENTATION\n//\n// Limitations:\n//    - no 16-bit-per-channel PNG\n//    - no 12-bit-per-channel JPEG\n//    - no JPEGs with arithmetic coding\n//    - no 1-bit BMP\n//    - GIF always returns *comp=4\n//\n// Basic usage (see HDR discussion below for HDR usage):\n//    int x,y,n;\n//    unsigned char *data = stbi_load(filename, &x, &y, &n, 0);\n//    // ... process data if not NULL ...\n//    // ... x = width, y = height, n = # 8-bit components per pixel ...\n//    // ... replace '0' with '1'..'4' to force that many components per pixel\n//    // ... but 'n' will always be the number that it would have been if you said 0\n//    stbi_image_free(data)\n//\n// Standard parameters:\n//    int *x       -- outputs image width in pixels\n//    int *y       -- outputs image height in pixels\n//    int *comp    -- outputs # of image components in image file\n//    int req_comp -- if non-zero, # of image components requested in result\n//\n// The return value from an image loader is an 'unsigned char *' which points\n// to the pixel data, or NULL on an allocation failure or if the image is\n// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels,\n// with each pixel consisting of N interleaved 8-bit components; the first\n// pixel pointed to is top-left-most in the image. There is no padding between\n// image scanlines or between pixels, regardless of format. The number of\n// components N is 'req_comp' if req_comp is non-zero, or *comp otherwise.\n// If req_comp is non-zero, *comp has the number of components that _would_\n// have been output otherwise. E.g. if you set req_comp to 4, you will always\n// get RGBA output, but you can check *comp to see if it's trivially opaque\n// because e.g. there were only 3 channels in the source image.\n//\n// An output image with N components has the following components interleaved\n// in this order in each pixel:\n//\n//     N=#comp     components\n//       1           grey\n//       2           grey, alpha\n//       3           red, green, blue\n//       4           red, green, blue, alpha\n//\n// If image loading fails for any reason, the return value will be NULL,\n// and *x, *y, *comp will be unchanged. The function stbi_failure_reason()\n// can be queried for an extremely brief, end-user unfriendly explanation\n// of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid\n// compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly\n// more user-friendly ones.\n//\n// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.\n//\n// ===========================================================================\n//\n// Philosophy\n//\n// stb libraries are designed with the following priorities:\n//\n//    1. easy to use\n//    2. easy to maintain\n//    3. good performance\n//\n// Sometimes I let \"good performance\" creep up in priority over \"easy to maintain\",\n// and for best performance I may provide less-easy-to-use APIs that give higher\n// performance, in addition to the easy to use ones. Nevertheless, it's important\n// to keep in mind that from the standpoint of you, a client of this library,\n// all you care about is #1 and #3, and stb libraries do not emphasize #3 above all.\n//\n// Some secondary priorities arise directly from the first two, some of which\n// make more explicit reasons why performance can't be emphasized.\n//\n//    - Portable (\"ease of use\")\n//    - Small footprint (\"easy to maintain\")\n//    - No dependencies (\"ease of use\")\n//\n// ===========================================================================\n//\n// I/O callbacks\n//\n// I/O callbacks allow you to read from arbitrary sources, like packaged\n// files or some other source. Data read from callbacks are processed\n// through a small internal buffer (currently 128 bytes) to try to reduce\n// overhead.\n//\n// The three functions you must define are \"read\" (reads some bytes of data),\n// \"skip\" (skips some bytes of data), \"eof\" (reports if the stream is at the end).\n//\n// ===========================================================================\n//\n// SIMD support\n//\n// The JPEG decoder will try to automatically use SIMD kernels on x86 when\n// supported by the compiler. For ARM Neon support, you must explicitly\n// request it.\n//\n// (The old do-it-yourself SIMD API is no longer supported in the current\n// code.)\n//\n// On x86, SSE2 will automatically be used when available based on a run-time\n// test; if not, the generic C versions are used as a fall-back. On ARM targets,\n// the typical path is to have separate builds for NEON and non-NEON devices\n// (at least this is true for iOS and Android). Therefore, the NEON support is\n// toggled by a build flag: define STBI_NEON to get NEON loops.\n//\n// The output of the JPEG decoder is slightly different from versions where\n// SIMD support was introduced (that is, for versions before 1.49). The\n// difference is only +-1 in the 8-bit RGB channels, and only on a small\n// fraction of pixels. You can force the pre-1.49 behavior by defining\n// STBI_JPEG_OLD, but this will disable some of the SIMD decoding path\n// and hence cost some performance.\n//\n// If for some reason you do not want to use any of SIMD code, or if\n// you have issues compiling it, you can disable it entirely by\n// defining STBI_NO_SIMD.\n//\n// ===========================================================================\n//\n// HDR image support   (disable by defining STBI_NO_HDR)\n//\n// stb_image now supports loading HDR images in general, and currently\n// the Radiance .HDR file format, although the support is provided\n// generically. You can still load any file through the existing interface;\n// if you attempt to load an HDR file, it will be automatically remapped to\n// LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;\n// both of these constants can be reconfigured through this interface:\n//\n//     stbi_hdr_to_ldr_gamma(2.2f);\n//     stbi_hdr_to_ldr_scale(1.0f);\n//\n// (note, do not use _inverse_ constants; stbi_image will invert them\n// appropriately).\n//\n// Additionally, there is a new, parallel interface for loading files as\n// (linear) floats to preserve the full dynamic range:\n//\n//    float *data = stbi_loadf(filename, &x, &y, &n, 0);\n//\n// If you load LDR images through this interface, those images will\n// be promoted to floating point values, run through the inverse of\n// constants corresponding to the above:\n//\n//     stbi_ldr_to_hdr_scale(1.0f);\n//     stbi_ldr_to_hdr_gamma(2.2f);\n//\n// Finally, given a filename (or an open file or memory block--see header\n// file for details) containing image data, you can query for the \"most\n// appropriate\" interface to use (that is, whether the image is HDR or\n// not), using:\n//\n//     stbi_is_hdr(char *filename);\n//\n// ===========================================================================\n//\n// iPhone PNG support:\n//\n// By default we convert iphone-formatted PNGs back to RGB, even though\n// they are internally encoded differently. You can disable this conversion\n// by by calling stbi_convert_iphone_png_to_rgb(0), in which case\n// you will always just get the native iphone \"format\" through (which\n// is BGR stored in RGB).\n//\n// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per\n// pixel to remove any premultiplied alpha *only* if the image file explicitly\n// says there's premultiplied data (currently only happens in iPhone images,\n// and only if iPhone convert-to-rgb processing is on).\n//\n\n\n#ifndef STBI_NO_STDIO\n#include <stdio.h>\n#endif // STBI_NO_STDIO\n\n#define STBI_VERSION 1\n\nenum\n{\n   STBI_default = 0, // only used for req_comp\n\n   STBI_grey       = 1,\n   STBI_grey_alpha = 2,\n   STBI_rgb        = 3,\n   STBI_rgb_alpha  = 4\n};\n\ntypedef unsigned char stbi_uc;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef STB_IMAGE_STATIC\n#define STBIDEF static\n#else\n#define STBIDEF extern\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// PRIMARY API - works on images of any type\n//\n\n//\n// load image by filename, open file, or memory buffer\n//\n\ntypedef struct\n{\n   int      (*read)  (void *user,char *data,int size);   // fill 'data' with 'size' bytes.  return number of bytes actually read\n   void     (*skip)  (void *user,int n);                 // skip the next 'n' bytes, or 'unget' the last -n bytes if negative\n   int      (*eof)   (void *user);                       // returns nonzero if we are at end of file/data\n} stbi_io_callbacks;\n\nSTBIDEF stbi_uc *stbi_load               (char              const *filename,           int *x, int *y, int *comp, int req_comp);\nSTBIDEF stbi_uc *stbi_load_from_memory   (stbi_uc           const *buffer, int len   , int *x, int *y, int *comp, int req_comp);\nSTBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk  , void *user, int *x, int *y, int *comp, int req_comp);\n\n#ifndef STBI_NO_STDIO\nSTBIDEF stbi_uc *stbi_load_from_file  (FILE *f,                  int *x, int *y, int *comp, int req_comp);\n// for stbi_load_from_file, file pointer is left pointing immediately after image\n#endif\n\n#ifndef STBI_NO_LINEAR\n   STBIDEF float *stbi_loadf                 (char const *filename,           int *x, int *y, int *comp, int req_comp);\n   STBIDEF float *stbi_loadf_from_memory     (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);\n   STBIDEF float *stbi_loadf_from_callbacks  (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp);\n\n   #ifndef STBI_NO_STDIO\n   STBIDEF float *stbi_loadf_from_file  (FILE *f,                int *x, int *y, int *comp, int req_comp);\n   #endif\n#endif\n\n#ifndef STBI_NO_HDR\n   STBIDEF void   stbi_hdr_to_ldr_gamma(float gamma);\n   STBIDEF void   stbi_hdr_to_ldr_scale(float scale);\n#endif\n\n#ifndef STBI_NO_LINEAR\n   STBIDEF void   stbi_ldr_to_hdr_gamma(float gamma);\n   STBIDEF void   stbi_ldr_to_hdr_scale(float scale);\n#endif // STBI_NO_HDR\n\n// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR\nSTBIDEF int    stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);\nSTBIDEF int    stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);\n#ifndef STBI_NO_STDIO\nSTBIDEF int      stbi_is_hdr          (char const *filename);\nSTBIDEF int      stbi_is_hdr_from_file(FILE *f);\n#endif // STBI_NO_STDIO\n\n\n// get a VERY brief reason for failure\n// NOT THREADSAFE\nSTBIDEF const char *stbi_failure_reason  (void);\n\n// free the loaded image -- this is just free()\nSTBIDEF void     stbi_image_free      (void *retval_from_stbi_load);\n\n// get image dimensions & components without fully decoding\nSTBIDEF int      stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);\nSTBIDEF int      stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp);\n\n#ifndef STBI_NO_STDIO\nSTBIDEF int      stbi_info            (char const *filename,     int *x, int *y, int *comp);\nSTBIDEF int      stbi_info_from_file  (FILE *f,                  int *x, int *y, int *comp);\n\n#endif\n\n\n\n// for image formats that explicitly notate that they have premultiplied alpha,\n// we just return the colors as stored in the file. set this flag to force\n// unpremultiplication. results are undefined if the unpremultiply overflow.\nSTBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply);\n\n// indicate whether we should process iphone images back to canonical format,\n// or just pass them through \"as-is\"\nSTBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);\n\n\n// ZLIB client - used by PNG, available for other purposes\n\nSTBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);\nSTBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header);\nSTBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen);\nSTBIDEF int   stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);\n\nSTBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen);\nSTBIDEF int   stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);\n\n\n#ifdef __cplusplus\n}\n#endif\n\n//\n//\n////   end header file   /////////////////////////////////////////////////////\n#endif // STBI_INCLUDE_STB_IMAGE_H\n\n#ifdef STB_IMAGE_IMPLEMENTATION\n\n#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \\\n  || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \\\n  || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \\\n  || defined(STBI_ONLY_ZLIB)\n   #ifndef STBI_ONLY_JPEG\n   #define STBI_NO_JPEG\n   #endif\n   #ifndef STBI_ONLY_PNG\n   #define STBI_NO_PNG\n   #endif\n   #ifndef STBI_ONLY_BMP\n   #define STBI_NO_BMP\n   #endif\n   #ifndef STBI_ONLY_PSD\n   #define STBI_NO_PSD\n   #endif\n   #ifndef STBI_ONLY_TGA\n   #define STBI_NO_TGA\n   #endif\n   #ifndef STBI_ONLY_GIF\n   #define STBI_NO_GIF\n   #endif\n   #ifndef STBI_ONLY_HDR\n   #define STBI_NO_HDR\n   #endif\n   #ifndef STBI_ONLY_PIC\n   #define STBI_NO_PIC\n   #endif\n   #ifndef STBI_ONLY_PNM\n   #define STBI_NO_PNM\n   #endif\n#endif\n\n#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)\n#define STBI_NO_ZLIB\n#endif\n\n\n#include <stdarg.h>\n#include <stddef.h> // ptrdiff_t on osx\n#include <stdlib.h>\n#include <string.h>\n\n#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)\n#include <math.h>  // ldexp\n#endif\n\n#ifndef STBI_NO_STDIO\n#include <stdio.h>\n#endif\n\n#ifndef STBI_ASSERT\n#include <assert.h>\n#define STBI_ASSERT(x) assert(x)\n#endif\n\n\n#ifndef _MSC_VER\n   #ifdef __cplusplus\n   #define stbi_inline inline\n   #else\n   #define stbi_inline\n   #endif\n#else\n   #define stbi_inline __forceinline\n#endif\n\n\n#ifdef _MSC_VER\ntypedef unsigned short stbi__uint16;\ntypedef   signed short stbi__int16;\ntypedef unsigned int   stbi__uint32;\ntypedef   signed int   stbi__int32;\n#else\n#include <stdint.h>\ntypedef uint16_t stbi__uint16;\ntypedef int16_t  stbi__int16;\ntypedef uint32_t stbi__uint32;\ntypedef int32_t  stbi__int32;\n#endif\n\n// should produce compiler error if size is wrong\ntypedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];\n\n#ifdef _MSC_VER\n#define STBI_NOTUSED(v)  (void)(v)\n#else\n#define STBI_NOTUSED(v)  (void)sizeof(v)\n#endif\n\n#ifdef _MSC_VER\n#define STBI_HAS_LROTL\n#endif\n\n#ifdef STBI_HAS_LROTL\n   #define stbi_lrot(x,y)  _lrotl(x,y)\n#else\n   #define stbi_lrot(x,y)  (((x) << (y)) | ((x) >> (32 - (y))))\n#endif\n\n#if defined(STBI_MALLOC) && defined(STBI_FREE) && defined(STBI_REALLOC)\n// ok\n#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC)\n// ok\n#else\n#error \"Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC.\"\n#endif\n\n#ifndef STBI_MALLOC\n#define STBI_MALLOC(sz)    malloc(sz)\n#define STBI_REALLOC(p,sz) realloc(p,sz)\n#define STBI_FREE(p)       free(p)\n#endif\n\n#if defined(__GNUC__) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)\n// gcc doesn't support sse2 intrinsics unless you compile with -msse2,\n// (but compiling with -msse2 allows the compiler to use SSE2 everywhere;\n// this is just broken and gcc are jerks for not fixing it properly\n// http://www.virtualdub.org/blog/pivot/entry.php?id=363 )\n#define STBI_NO_SIMD\n#endif\n\n#if !defined(STBI_NO_SIMD) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86))\n#define STBI_SSE2\n#include <emmintrin.h>\n\n#ifdef _MSC_VER\n\n#if _MSC_VER >= 1400  // not VC6\n#include <intrin.h> // __cpuid\nstatic int stbi__cpuid3(void)\n{\n   int info[4];\n   __cpuid(info,1);\n   return info[3];\n}\n#else\nstatic int stbi__cpuid3(void)\n{\n   int res;\n   __asm {\n      mov  eax,1\n      cpuid\n      mov  res,edx\n   }\n   return res;\n}\n#endif\n\n#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name\n\nstatic int stbi__sse2_available()\n{\n   int info3 = stbi__cpuid3();\n   return ((info3 >> 26) & 1) != 0;\n}\n#else // assume GCC-style if not VC++\n#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))\n\nstatic int stbi__sse2_available()\n{\n#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later\n   // GCC 4.8+ has a nice way to do this\n   return __builtin_cpu_supports(\"sse2\");\n#else\n   // portable way to do this, preferably without using GCC inline ASM?\n   // just bail for now.\n   return 0;\n#endif\n}\n#endif\n#endif\n\n// ARM NEON\n#if defined(STBI_NO_SIMD) && defined(STBI_NEON)\n#undef STBI_NEON\n#endif\n\n#ifdef STBI_NEON\n#include <arm_neon.h>\n// assume GCC or Clang on ARM targets\n#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))\n#endif\n\n#ifndef STBI_SIMD_ALIGN\n#define STBI_SIMD_ALIGN(type, name) type name\n#endif\n\n///////////////////////////////////////////////\n//\n//  stbi__context struct and start_xxx functions\n\n// stbi__context structure is our basic context used by all images, so it\n// contains all the IO context, plus some basic image information\ntypedef struct\n{\n   stbi__uint32 img_x, img_y;\n   int img_n, img_out_n;\n\n   stbi_io_callbacks io;\n   void *io_user_data;\n\n   int read_from_callbacks;\n   int buflen;\n   stbi_uc buffer_start[128];\n\n   stbi_uc *img_buffer, *img_buffer_end;\n   stbi_uc *img_buffer_original;\n} stbi__context;\n\n\nstatic void stbi__refill_buffer(stbi__context *s);\n\n// initialize a memory-decode context\nstatic void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len)\n{\n   s->io.read = NULL;\n   s->read_from_callbacks = 0;\n   s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;\n   s->img_buffer_end = (stbi_uc *) buffer+len;\n}\n\n// initialize a callback-based context\nstatic void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user)\n{\n   s->io = *c;\n   s->io_user_data = user;\n   s->buflen = sizeof(s->buffer_start);\n   s->read_from_callbacks = 1;\n   s->img_buffer_original = s->buffer_start;\n   stbi__refill_buffer(s);\n}\n\n#ifndef STBI_NO_STDIO\n\nstatic int stbi__stdio_read(void *user, char *data, int size)\n{\n   return (int) fread(data,1,size,(FILE*) user);\n}\n\nstatic void stbi__stdio_skip(void *user, int n)\n{\n   fseek((FILE*) user, n, SEEK_CUR);\n}\n\nstatic int stbi__stdio_eof(void *user)\n{\n   return feof((FILE*) user);\n}\n\nstatic stbi_io_callbacks stbi__stdio_callbacks =\n{\n   stbi__stdio_read,\n   stbi__stdio_skip,\n   stbi__stdio_eof,\n};\n\nstatic void stbi__start_file(stbi__context *s, FILE *f)\n{\n   stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f);\n}\n\n//static void stop_file(stbi__context *s) { }\n\n#endif // !STBI_NO_STDIO\n\nstatic void stbi__rewind(stbi__context *s)\n{\n   // conceptually rewind SHOULD rewind to the beginning of the stream,\n   // but we just rewind to the beginning of the initial buffer, because\n   // we only use it after doing 'test', which only ever looks at at most 92 bytes\n   s->img_buffer = s->img_buffer_original;\n}\n\n#ifndef STBI_NO_JPEG\nstatic int      stbi__jpeg_test(stbi__context *s);\nstatic stbi_uc *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);\nstatic int      stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_PNG\nstatic int      stbi__png_test(stbi__context *s);\nstatic stbi_uc *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);\nstatic int      stbi__png_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_BMP\nstatic int      stbi__bmp_test(stbi__context *s);\nstatic stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);\nstatic int      stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_TGA\nstatic int      stbi__tga_test(stbi__context *s);\nstatic stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);\nstatic int      stbi__tga_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_PSD\nstatic int      stbi__psd_test(stbi__context *s);\nstatic stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);\nstatic int      stbi__psd_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_HDR\nstatic int      stbi__hdr_test(stbi__context *s);\nstatic float   *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);\nstatic int      stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_PIC\nstatic int      stbi__pic_test(stbi__context *s);\nstatic stbi_uc *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);\nstatic int      stbi__pic_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_GIF\nstatic int      stbi__gif_test(stbi__context *s);\nstatic stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);\nstatic int      stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_PNM\nstatic int      stbi__pnm_test(stbi__context *s);\nstatic stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);\nstatic int      stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n// this is not threadsafe\nstatic const char *stbi__g_failure_reason;\n\nSTBIDEF const char *stbi_failure_reason(void)\n{\n   return stbi__g_failure_reason;\n}\n\nstatic int stbi__err(const char *str)\n{\n   stbi__g_failure_reason = str;\n   return 0;\n}\n\nstatic void *stbi__malloc(size_t size)\n{\n    return STBI_MALLOC(size);\n}\n\n// stbi__err - error\n// stbi__errpf - error returning pointer to float\n// stbi__errpuc - error returning pointer to unsigned char\n\n#ifdef STBI_NO_FAILURE_STRINGS\n   #define stbi__err(x,y)  0\n#elif defined(STBI_FAILURE_USERMSG)\n   #define stbi__err(x,y)  stbi__err(y)\n#else\n   #define stbi__err(x,y)  stbi__err(x)\n#endif\n\n#define stbi__errpf(x,y)   ((float *) (stbi__err(x,y)?NULL:NULL))\n#define stbi__errpuc(x,y)  ((unsigned char *) (stbi__err(x,y)?NULL:NULL))\n\nSTBIDEF void stbi_image_free(void *retval_from_stbi_load)\n{\n   STBI_FREE(retval_from_stbi_load);\n}\n\n#ifndef STBI_NO_LINEAR\nstatic float   *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp);\n#endif\n\n#ifndef STBI_NO_HDR\nstatic stbi_uc *stbi__hdr_to_ldr(float   *data, int x, int y, int comp);\n#endif\n\nstatic unsigned char *stbi_load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   #ifndef STBI_NO_JPEG\n   if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp);\n   #endif\n   #ifndef STBI_NO_PNG\n   if (stbi__png_test(s))  return stbi__png_load(s,x,y,comp,req_comp);\n   #endif\n   #ifndef STBI_NO_BMP\n   if (stbi__bmp_test(s))  return stbi__bmp_load(s,x,y,comp,req_comp);\n   #endif\n   #ifndef STBI_NO_GIF\n   if (stbi__gif_test(s))  return stbi__gif_load(s,x,y,comp,req_comp);\n   #endif\n   #ifndef STBI_NO_PSD\n   if (stbi__psd_test(s))  return stbi__psd_load(s,x,y,comp,req_comp);\n   #endif\n   #ifndef STBI_NO_PIC\n   if (stbi__pic_test(s))  return stbi__pic_load(s,x,y,comp,req_comp);\n   #endif\n   #ifndef STBI_NO_PNM\n   if (stbi__pnm_test(s))  return stbi__pnm_load(s,x,y,comp,req_comp);\n   #endif\n\n   #ifndef STBI_NO_HDR\n   if (stbi__hdr_test(s)) {\n      float *hdr = stbi__hdr_load(s, x,y,comp,req_comp);\n      return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);\n   }\n   #endif\n\n   #ifndef STBI_NO_TGA\n   // test tga last because it's a crappy test!\n   if (stbi__tga_test(s))\n      return stbi__tga_load(s,x,y,comp,req_comp);\n   #endif\n\n   return stbi__errpuc(\"unknown image type\", \"Image not of any known type, or corrupt\");\n}\n\n#ifndef STBI_NO_STDIO\n\nstatic FILE *stbi__fopen(char const *filename, char const *mode)\n{\n   FILE *f;\n#if defined(_MSC_VER) && _MSC_VER >= 1400\n   if (0 != fopen_s(&f, filename, mode))\n      f=0;\n#else\n   f = fopen(filename, mode);\n#endif\n   return f;\n}\n\n\nSTBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)\n{\n   FILE *f = stbi__fopen(filename, \"rb\");\n   unsigned char *result;\n   if (!f) return stbi__errpuc(\"can't fopen\", \"Unable to open file\");\n   result = stbi_load_from_file(f,x,y,comp,req_comp);\n   fclose(f);\n   return result;\n}\n\nSTBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)\n{\n   unsigned char *result;\n   stbi__context s;\n   stbi__start_file(&s,f);\n   result = stbi_load_main(&s,x,y,comp,req_comp);\n   if (result) {\n      // need to 'unget' all the characters in the IO buffer\n      fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);\n   }\n   return result;\n}\n#endif //!STBI_NO_STDIO\n\nSTBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__context s;\n   stbi__start_mem(&s,buffer,len);\n   return stbi_load_main(&s,x,y,comp,req_comp);\n}\n\nSTBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__context s;\n   stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);\n   return stbi_load_main(&s,x,y,comp,req_comp);\n}\n\n#ifndef STBI_NO_LINEAR\nstatic float *stbi_loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   unsigned char *data;\n   #ifndef STBI_NO_HDR\n   if (stbi__hdr_test(s))\n      return stbi__hdr_load(s,x,y,comp,req_comp);\n   #endif\n   data = stbi_load_main(s, x, y, comp, req_comp);\n   if (data)\n      return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);\n   return stbi__errpf(\"unknown image type\", \"Image not of any known type, or corrupt\");\n}\n\nSTBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__context s;\n   stbi__start_mem(&s,buffer,len);\n   return stbi_loadf_main(&s,x,y,comp,req_comp);\n}\n\nSTBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__context s;\n   stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);\n   return stbi_loadf_main(&s,x,y,comp,req_comp);\n}\n\n#ifndef STBI_NO_STDIO\nSTBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)\n{\n   float *result;\n   FILE *f = stbi__fopen(filename, \"rb\");\n   if (!f) return stbi__errpf(\"can't fopen\", \"Unable to open file\");\n   result = stbi_loadf_from_file(f,x,y,comp,req_comp);\n   fclose(f);\n   return result;\n}\n\nSTBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__context s;\n   stbi__start_file(&s,f);\n   return stbi_loadf_main(&s,x,y,comp,req_comp);\n}\n#endif // !STBI_NO_STDIO\n\n#endif // !STBI_NO_LINEAR\n\n// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is\n// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always\n// reports false!\n\nSTBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)\n{\n   #ifndef STBI_NO_HDR\n   stbi__context s;\n   stbi__start_mem(&s,buffer,len);\n   return stbi__hdr_test(&s);\n   #else\n   STBI_NOTUSED(buffer);\n   STBI_NOTUSED(len);\n   return 0;\n   #endif\n}\n\n#ifndef STBI_NO_STDIO\nSTBIDEF int      stbi_is_hdr          (char const *filename)\n{\n   FILE *f = stbi__fopen(filename, \"rb\");\n   int result=0;\n   if (f) {\n      result = stbi_is_hdr_from_file(f);\n      fclose(f);\n   }\n   return result;\n}\n\nSTBIDEF int      stbi_is_hdr_from_file(FILE *f)\n{\n   #ifndef STBI_NO_HDR\n   stbi__context s;\n   stbi__start_file(&s,f);\n   return stbi__hdr_test(&s);\n   #else\n   return 0;\n   #endif\n}\n#endif // !STBI_NO_STDIO\n\nSTBIDEF int      stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)\n{\n   #ifndef STBI_NO_HDR\n   stbi__context s;\n   stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);\n   return stbi__hdr_test(&s);\n   #else\n   return 0;\n   #endif\n}\n\nstatic float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;\nstatic float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;\n\n#ifndef STBI_NO_LINEAR\nSTBIDEF void   stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; }\nSTBIDEF void   stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; }\n#endif\n\nSTBIDEF void   stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; }\nSTBIDEF void   stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; }\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// Common code used by all image loaders\n//\n\nenum\n{\n   STBI__SCAN_load=0,\n   STBI__SCAN_type,\n   STBI__SCAN_header\n};\n\nstatic void stbi__refill_buffer(stbi__context *s)\n{\n   int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen);\n   if (n == 0) {\n      // at end of file, treat same as if from memory, but need to handle case\n      // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file\n      s->read_from_callbacks = 0;\n      s->img_buffer = s->buffer_start;\n      s->img_buffer_end = s->buffer_start+1;\n      *s->img_buffer = 0;\n   } else {\n      s->img_buffer = s->buffer_start;\n      s->img_buffer_end = s->buffer_start + n;\n   }\n}\n\nstbi_inline static stbi_uc stbi__get8(stbi__context *s)\n{\n   if (s->img_buffer < s->img_buffer_end)\n      return *s->img_buffer++;\n   if (s->read_from_callbacks) {\n      stbi__refill_buffer(s);\n      return *s->img_buffer++;\n   }\n   return 0;\n}\n\nstbi_inline static int stbi__at_eof(stbi__context *s)\n{\n   if (s->io.read) {\n      if (!(s->io.eof)(s->io_user_data)) return 0;\n      // if feof() is true, check if buffer = end\n      // special case: we've only got the special 0 character at the end\n      if (s->read_from_callbacks == 0) return 1;\n   }\n\n   return s->img_buffer >= s->img_buffer_end;\n}\n\nstatic void stbi__skip(stbi__context *s, int n)\n{\n   if (s->io.read) {\n      int blen = (int) (s->img_buffer_end - s->img_buffer);\n      if (blen < n) {\n         s->img_buffer = s->img_buffer_end;\n         (s->io.skip)(s->io_user_data, n - blen);\n         return;\n      }\n   }\n   s->img_buffer += n;\n}\n\nstatic int stbi__getn(stbi__context *s, stbi_uc *buffer, int n)\n{\n   if (s->io.read) {\n      int blen = (int) (s->img_buffer_end - s->img_buffer);\n      if (blen < n) {\n         int res, count;\n\n         memcpy(buffer, s->img_buffer, blen);\n\n         count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen);\n         res = (count == (n-blen));\n         s->img_buffer = s->img_buffer_end;\n         return res;\n      }\n   }\n\n   if (s->img_buffer+n <= s->img_buffer_end) {\n      memcpy(buffer, s->img_buffer, n);\n      s->img_buffer += n;\n      return 1;\n   } else\n      return 0;\n}\n\nstatic int stbi__get16be(stbi__context *s)\n{\n   int z = stbi__get8(s);\n   return (z << 8) + stbi__get8(s);\n}\n\nstatic stbi__uint32 stbi__get32be(stbi__context *s)\n{\n   stbi__uint32 z = stbi__get16be(s);\n   return (z << 16) + stbi__get16be(s);\n}\n\nstatic int stbi__get16le(stbi__context *s)\n{\n   int z = stbi__get8(s);\n   return z + (stbi__get8(s) << 8);\n}\n\nstatic stbi__uint32 stbi__get32le(stbi__context *s)\n{\n   stbi__uint32 z = stbi__get16le(s);\n   return z + (stbi__get16le(s) << 16);\n}\n\n#define STBI__BYTECAST(x)  ((stbi_uc) ((x) & 255))  // truncate int to byte without warnings\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//  generic converter from built-in img_n to req_comp\n//    individual types do this automatically as much as possible (e.g. jpeg\n//    does all cases internally since it needs to colorspace convert anyway,\n//    and it never has alpha, so very few cases ). png can automatically\n//    interleave an alpha=255 channel, but falls back to this for other cases\n//\n//  assume data buffer is malloced, so malloc a new one and free that one\n//  only failure mode is malloc failing\n\nstatic stbi_uc stbi__compute_y(int r, int g, int b)\n{\n   return (stbi_uc) (((r*77) + (g*150) +  (29*b)) >> 8);\n}\n\nstatic unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y)\n{\n   int i,j;\n   unsigned char *good;\n\n   if (req_comp == img_n) return data;\n   STBI_ASSERT(req_comp >= 1 && req_comp <= 4);\n\n   good = (unsigned char *) stbi__malloc(req_comp * x * y);\n   if (good == NULL) {\n      STBI_FREE(data);\n      return stbi__errpuc(\"outofmem\", \"Out of memory\");\n   }\n\n   for (j=0; j < (int) y; ++j) {\n      unsigned char *src  = data + j * x * img_n   ;\n      unsigned char *dest = good + j * x * req_comp;\n\n      #define COMBO(a,b)  ((a)*8+(b))\n      #define CASE(a,b)   case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)\n      // convert source image with img_n components to one with req_comp components;\n      // avoid switch per pixel, so use switch per scanline and massive macros\n      switch (COMBO(img_n, req_comp)) {\n         CASE(1,2) dest[0]=src[0], dest[1]=255; break;\n         CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break;\n         CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break;\n         CASE(2,1) dest[0]=src[0]; break;\n         CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break;\n         CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break;\n         CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break;\n         CASE(3,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;\n         CASE(3,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; break;\n         CASE(4,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;\n         CASE(4,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break;\n         CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break;\n         default: STBI_ASSERT(0);\n      }\n      #undef CASE\n   }\n\n   STBI_FREE(data);\n   return good;\n}\n\n#ifndef STBI_NO_LINEAR\nstatic float   *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)\n{\n   int i,k,n;\n   float *output = (float *) stbi__malloc(x * y * comp * sizeof(float));\n   if (output == NULL) { STBI_FREE(data); return stbi__errpf(\"outofmem\", \"Out of memory\"); }\n   // compute number of non-alpha components\n   if (comp & 1) n = comp; else n = comp-1;\n   for (i=0; i < x*y; ++i) {\n      for (k=0; k < n; ++k) {\n         output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);\n      }\n      if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f;\n   }\n   STBI_FREE(data);\n   return output;\n}\n#endif\n\n#ifndef STBI_NO_HDR\n#define stbi__float2int(x)   ((int) (x))\nstatic stbi_uc *stbi__hdr_to_ldr(float   *data, int x, int y, int comp)\n{\n   int i,k,n;\n   stbi_uc *output = (stbi_uc *) stbi__malloc(x * y * comp);\n   if (output == NULL) { STBI_FREE(data); return stbi__errpuc(\"outofmem\", \"Out of memory\"); }\n   // compute number of non-alpha components\n   if (comp & 1) n = comp; else n = comp-1;\n   for (i=0; i < x*y; ++i) {\n      for (k=0; k < n; ++k) {\n         float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;\n         if (z < 0) z = 0;\n         if (z > 255) z = 255;\n         output[i*comp + k] = (stbi_uc) stbi__float2int(z);\n      }\n      if (k < comp) {\n         float z = data[i*comp+k] * 255 + 0.5f;\n         if (z < 0) z = 0;\n         if (z > 255) z = 255;\n         output[i*comp + k] = (stbi_uc) stbi__float2int(z);\n      }\n   }\n   STBI_FREE(data);\n   return output;\n}\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//  \"baseline\" JPEG/JFIF decoder\n//\n//    simple implementation\n//      - doesn't support delayed output of y-dimension\n//      - simple interface (only one output format: 8-bit interleaved RGB)\n//      - doesn't try to recover corrupt jpegs\n//      - doesn't allow partial loading, loading multiple at once\n//      - still fast on x86 (copying globals into locals doesn't help x86)\n//      - allocates lots of intermediate memory (full size of all components)\n//        - non-interleaved case requires this anyway\n//        - allows good upsampling (see next)\n//    high-quality\n//      - upsampled channels are bilinearly interpolated, even across blocks\n//      - quality integer IDCT derived from IJG's 'slow'\n//    performance\n//      - fast huffman; reasonable integer IDCT\n//      - some SIMD kernels for common paths on targets with SSE2/NEON\n//      - uses a lot of intermediate memory, could cache poorly\n\n#ifndef STBI_NO_JPEG\n\n// huffman decoding acceleration\n#define FAST_BITS   9  // larger handles more cases; smaller stomps less cache\n\ntypedef struct\n{\n   stbi_uc  fast[1 << FAST_BITS];\n   // weirdly, repacking this into AoS is a 10% speed loss, instead of a win\n   stbi__uint16 code[256];\n   stbi_uc  values[256];\n   stbi_uc  size[257];\n   unsigned int maxcode[18];\n   int    delta[17];   // old 'firstsymbol' - old 'firstcode'\n} stbi__huffman;\n\ntypedef struct\n{\n   stbi__context *s;\n   stbi__huffman huff_dc[4];\n   stbi__huffman huff_ac[4];\n   stbi_uc dequant[4][64];\n   stbi__int16 fast_ac[4][1 << FAST_BITS];\n\n// sizes for components, interleaved MCUs\n   int img_h_max, img_v_max;\n   int img_mcu_x, img_mcu_y;\n   int img_mcu_w, img_mcu_h;\n\n// definition of jpeg image component\n   struct\n   {\n      int id;\n      int h,v;\n      int tq;\n      int hd,ha;\n      int dc_pred;\n\n      int x,y,w2,h2;\n      stbi_uc *data;\n      void *raw_data, *raw_coeff;\n      stbi_uc *linebuf;\n      short   *coeff;   // progressive only\n      int      coeff_w, coeff_h; // number of 8x8 coefficient blocks\n   } img_comp[4];\n\n   stbi__uint32   code_buffer; // jpeg entropy-coded buffer\n   int            code_bits;   // number of valid bits\n   unsigned char  marker;      // marker seen while filling entropy buffer\n   int            nomore;      // flag if we saw a marker so must stop\n\n   int            progressive;\n   int            spec_start;\n   int            spec_end;\n   int            succ_high;\n   int            succ_low;\n   int            eob_run;\n\n   int scan_n, order[4];\n   int restart_interval, todo;\n\n// kernels\n   void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]);\n   void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step);\n   stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs);\n} stbi__jpeg;\n\nstatic int stbi__build_huffman(stbi__huffman *h, int *count)\n{\n   int i,j,k=0,code;\n   // build size list for each symbol (from JPEG spec)\n   for (i=0; i < 16; ++i)\n      for (j=0; j < count[i]; ++j)\n         h->size[k++] = (stbi_uc) (i+1);\n   h->size[k] = 0;\n\n   // compute actual symbols (from jpeg spec)\n   code = 0;\n   k = 0;\n   for(j=1; j <= 16; ++j) {\n      // compute delta to add to code to compute symbol id\n      h->delta[j] = k - code;\n      if (h->size[k] == j) {\n         while (h->size[k] == j)\n            h->code[k++] = (stbi__uint16) (code++);\n         if (code-1 >= (1 << j)) return stbi__err(\"bad code lengths\",\"Corrupt JPEG\");\n      }\n      // compute largest code + 1 for this size, preshifted as needed later\n      h->maxcode[j] = code << (16-j);\n      code <<= 1;\n   }\n   h->maxcode[j] = 0xffffffff;\n\n   // build non-spec acceleration table; 255 is flag for not-accelerated\n   memset(h->fast, 255, 1 << FAST_BITS);\n   for (i=0; i < k; ++i) {\n      int s = h->size[i];\n      if (s <= FAST_BITS) {\n         int c = h->code[i] << (FAST_BITS-s);\n         int m = 1 << (FAST_BITS-s);\n         for (j=0; j < m; ++j) {\n            h->fast[c+j] = (stbi_uc) i;\n         }\n      }\n   }\n   return 1;\n}\n\n// build a table that decodes both magnitude and value of small ACs in\n// one go.\nstatic void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)\n{\n   int i;\n   for (i=0; i < (1 << FAST_BITS); ++i) {\n      stbi_uc fast = h->fast[i];\n      fast_ac[i] = 0;\n      if (fast < 255) {\n         int rs = h->values[fast];\n         int run = (rs >> 4) & 15;\n         int magbits = rs & 15;\n         int len = h->size[fast];\n\n         if (magbits && len + magbits <= FAST_BITS) {\n            // magnitude code followed by receive_extend code\n            int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);\n            int m = 1 << (magbits - 1);\n            if (k < m) k += (-1 << magbits) + 1;\n            // if the result is small enough, we can fit it in fast_ac table\n            if (k >= -128 && k <= 127)\n               fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits));\n         }\n      }\n   }\n}\n\nstatic void stbi__grow_buffer_unsafe(stbi__jpeg *j)\n{\n   do {\n      int b = j->nomore ? 0 : stbi__get8(j->s);\n      if (b == 0xff) {\n         int c = stbi__get8(j->s);\n         if (c != 0) {\n            j->marker = (unsigned char) c;\n            j->nomore = 1;\n            return;\n         }\n      }\n      j->code_buffer |= b << (24 - j->code_bits);\n      j->code_bits += 8;\n   } while (j->code_bits <= 24);\n}\n\n// (1 << n) - 1\nstatic stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};\n\n// decode a jpeg huffman value from the bitstream\nstbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)\n{\n   unsigned int temp;\n   int c,k;\n\n   if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n\n   // look at the top FAST_BITS and determine what symbol ID it is,\n   // if the code is <= FAST_BITS\n   c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);\n   k = h->fast[c];\n   if (k < 255) {\n      int s = h->size[k];\n      if (s > j->code_bits)\n         return -1;\n      j->code_buffer <<= s;\n      j->code_bits -= s;\n      return h->values[k];\n   }\n\n   // naive test is to shift the code_buffer down so k bits are\n   // valid, then test against maxcode. To speed this up, we've\n   // preshifted maxcode left so that it has (16-k) 0s at the\n   // end; in other words, regardless of the number of bits, it\n   // wants to be compared against something shifted to have 16;\n   // that way we don't need to shift inside the loop.\n   temp = j->code_buffer >> 16;\n   for (k=FAST_BITS+1 ; ; ++k)\n      if (temp < h->maxcode[k])\n         break;\n   if (k == 17) {\n      // error! code not found\n      j->code_bits -= 16;\n      return -1;\n   }\n\n   if (k > j->code_bits)\n      return -1;\n\n   // convert the huffman code to the symbol id\n   c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];\n   STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);\n\n   // convert the id to a symbol\n   j->code_bits -= k;\n   j->code_buffer <<= k;\n   return h->values[c];\n}\n\n// bias[n] = (-1<<n) + 1\nstatic int const stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};\n\n// combined JPEG 'receive' and JPEG 'extend', since baseline\n// always extends everything it receives.\nstbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n)\n{\n   unsigned int k;\n   int sgn;\n   if (j->code_bits < n) stbi__grow_buffer_unsafe(j);\n\n   sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB\n   k = stbi_lrot(j->code_buffer, n);\n   j->code_buffer = k & ~stbi__bmask[n];\n   k &= stbi__bmask[n];\n   j->code_bits -= n;\n   return k + (stbi__jbias[n] & ~sgn);\n}\n\n// get some unsigned bits\nstbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n)\n{\n   unsigned int k;\n   if (j->code_bits < n) stbi__grow_buffer_unsafe(j);\n   k = stbi_lrot(j->code_buffer, n);\n   j->code_buffer = k & ~stbi__bmask[n];\n   k &= stbi__bmask[n];\n   j->code_bits -= n;\n   return k;\n}\n\nstbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j)\n{\n   unsigned int k;\n   if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);\n   k = j->code_buffer;\n   j->code_buffer <<= 1;\n   --j->code_bits;\n   return k & 0x80000000;\n}\n\n// given a value that's at position X in the zigzag stream,\n// where does it appear in the 8x8 matrix coded as row-major?\nstatic stbi_uc stbi__jpeg_dezigzag[64+15] =\n{\n    0,  1,  8, 16,  9,  2,  3, 10,\n   17, 24, 32, 25, 18, 11,  4,  5,\n   12, 19, 26, 33, 40, 48, 41, 34,\n   27, 20, 13,  6,  7, 14, 21, 28,\n   35, 42, 49, 56, 57, 50, 43, 36,\n   29, 22, 15, 23, 30, 37, 44, 51,\n   58, 59, 52, 45, 38, 31, 39, 46,\n   53, 60, 61, 54, 47, 55, 62, 63,\n   // let corrupt input sample past end\n   63, 63, 63, 63, 63, 63, 63, 63,\n   63, 63, 63, 63, 63, 63, 63\n};\n\n// decode one 64-entry block--\nstatic int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi_uc *dequant)\n{\n   int diff,dc,k;\n   int t;\n\n   if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n   t = stbi__jpeg_huff_decode(j, hdc);\n   if (t < 0) return stbi__err(\"bad huffman code\",\"Corrupt JPEG\");\n\n   // 0 all the ac values now so we can do it 32-bits at a time\n   memset(data,0,64*sizeof(data[0]));\n\n   diff = t ? stbi__extend_receive(j, t) : 0;\n   dc = j->img_comp[b].dc_pred + diff;\n   j->img_comp[b].dc_pred = dc;\n   data[0] = (short) (dc * dequant[0]);\n\n   // decode AC components, see JPEG spec\n   k = 1;\n   do {\n      unsigned int zig;\n      int c,r,s;\n      if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n      c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);\n      r = fac[c];\n      if (r) { // fast-AC path\n         k += (r >> 4) & 15; // run\n         s = r & 15; // combined length\n         j->code_buffer <<= s;\n         j->code_bits -= s;\n         // decode into unzigzag'd location\n         zig = stbi__jpeg_dezigzag[k++];\n         data[zig] = (short) ((r >> 8) * dequant[zig]);\n      } else {\n         int rs = stbi__jpeg_huff_decode(j, hac);\n         if (rs < 0) return stbi__err(\"bad huffman code\",\"Corrupt JPEG\");\n         s = rs & 15;\n         r = rs >> 4;\n         if (s == 0) {\n            if (rs != 0xf0) break; // end block\n            k += 16;\n         } else {\n            k += r;\n            // decode into unzigzag'd location\n            zig = stbi__jpeg_dezigzag[k++];\n            data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);\n         }\n      }\n   } while (k < 64);\n   return 1;\n}\n\nstatic int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b)\n{\n   int diff,dc;\n   int t;\n   if (j->spec_end != 0) return stbi__err(\"can't merge dc and ac\", \"Corrupt JPEG\");\n\n   if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n\n   if (j->succ_high == 0) {\n      // first scan for DC coefficient, must be first\n      memset(data,0,64*sizeof(data[0])); // 0 all the ac values now\n      t = stbi__jpeg_huff_decode(j, hdc);\n      diff = t ? stbi__extend_receive(j, t) : 0;\n\n      dc = j->img_comp[b].dc_pred + diff;\n      j->img_comp[b].dc_pred = dc;\n      data[0] = (short) (dc << j->succ_low);\n   } else {\n      // refinement scan for DC coefficient\n      if (stbi__jpeg_get_bit(j))\n         data[0] += (short) (1 << j->succ_low);\n   }\n   return 1;\n}\n\n// @OPTIMIZE: store non-zigzagged during the decode passes,\n// and only de-zigzag when dequantizing\nstatic int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac)\n{\n   int k;\n   if (j->spec_start == 0) return stbi__err(\"can't merge dc and ac\", \"Corrupt JPEG\");\n\n   if (j->succ_high == 0) {\n      int shift = j->succ_low;\n\n      if (j->eob_run) {\n         --j->eob_run;\n         return 1;\n      }\n\n      k = j->spec_start;\n      do {\n         unsigned int zig;\n         int c,r,s;\n         if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n         c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);\n         r = fac[c];\n         if (r) { // fast-AC path\n            k += (r >> 4) & 15; // run\n            s = r & 15; // combined length\n            j->code_buffer <<= s;\n            j->code_bits -= s;\n            zig = stbi__jpeg_dezigzag[k++];\n            data[zig] = (short) ((r >> 8) << shift);\n         } else {\n            int rs = stbi__jpeg_huff_decode(j, hac);\n            if (rs < 0) return stbi__err(\"bad huffman code\",\"Corrupt JPEG\");\n            s = rs & 15;\n            r = rs >> 4;\n            if (s == 0) {\n               if (r < 15) {\n                  j->eob_run = (1 << r);\n                  if (r)\n                     j->eob_run += stbi__jpeg_get_bits(j, r);\n                  --j->eob_run;\n                  break;\n               }\n               k += 16;\n            } else {\n               k += r;\n               zig = stbi__jpeg_dezigzag[k++];\n               data[zig] = (short) (stbi__extend_receive(j,s) << shift);\n            }\n         }\n      } while (k <= j->spec_end);\n   } else {\n      // refinement scan for these AC coefficients\n\n      short bit = (short) (1 << j->succ_low);\n\n      if (j->eob_run) {\n         --j->eob_run;\n         for (k = j->spec_start; k <= j->spec_end; ++k) {\n            short *p = &data[stbi__jpeg_dezigzag[k]];\n            if (*p != 0)\n               if (stbi__jpeg_get_bit(j))\n                  if ((*p & bit)==0) {\n                     if (*p > 0)\n                        *p += bit;\n                     else\n                        *p -= bit;\n                  }\n         }\n      } else {\n         k = j->spec_start;\n         do {\n            int r,s;\n            int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh\n            if (rs < 0) return stbi__err(\"bad huffman code\",\"Corrupt JPEG\");\n            s = rs & 15;\n            r = rs >> 4;\n            if (s == 0) {\n               if (r < 15) {\n                  j->eob_run = (1 << r) - 1;\n                  if (r)\n                     j->eob_run += stbi__jpeg_get_bits(j, r);\n                  r = 64; // force end of block\n               } else\n                  r = 16; // r=15 is the code for 16 0s\n            } else {\n               if (s != 1) return stbi__err(\"bad huffman code\", \"Corrupt JPEG\");\n               // sign bit\n               if (stbi__jpeg_get_bit(j))\n                  s = bit;\n               else\n                  s = -bit;\n            }\n\n            // advance by r\n            while (k <= j->spec_end) {\n               short *p = &data[stbi__jpeg_dezigzag[k]];\n               if (*p != 0) {\n                  if (stbi__jpeg_get_bit(j))\n                     if ((*p & bit)==0) {\n                        if (*p > 0)\n                           *p += bit;\n                        else\n                           *p -= bit;\n                     }\n                  ++k;\n               } else {\n                  if (r == 0) {\n                     if (s)\n                        data[stbi__jpeg_dezigzag[k++]] = (short) s;\n                     break;\n                  }\n                  --r;\n                  ++k;\n               }\n            }\n         } while (k <= j->spec_end);\n      }\n   }\n   return 1;\n}\n\n// take a -128..127 value and stbi__clamp it and convert to 0..255\nstbi_inline static stbi_uc stbi__clamp(int x)\n{\n   // trick to use a single test to catch both cases\n   if ((unsigned int) x > 255) {\n      if (x < 0) return 0;\n      if (x > 255) return 255;\n   }\n   return (stbi_uc) x;\n}\n\n#define stbi__f2f(x)  ((int) (((x) * 4096 + 0.5)))\n#define stbi__fsh(x)  ((x) << 12)\n\n// derived from jidctint -- DCT_ISLOW\n#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \\\n   int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \\\n   p2 = s2;                                    \\\n   p3 = s6;                                    \\\n   p1 = (p2+p3) * stbi__f2f(0.5411961f);       \\\n   t2 = p1 + p3*stbi__f2f(-1.847759065f);      \\\n   t3 = p1 + p2*stbi__f2f( 0.765366865f);      \\\n   p2 = s0;                                    \\\n   p3 = s4;                                    \\\n   t0 = stbi__fsh(p2+p3);                      \\\n   t1 = stbi__fsh(p2-p3);                      \\\n   x0 = t0+t3;                                 \\\n   x3 = t0-t3;                                 \\\n   x1 = t1+t2;                                 \\\n   x2 = t1-t2;                                 \\\n   t0 = s7;                                    \\\n   t1 = s5;                                    \\\n   t2 = s3;                                    \\\n   t3 = s1;                                    \\\n   p3 = t0+t2;                                 \\\n   p4 = t1+t3;                                 \\\n   p1 = t0+t3;                                 \\\n   p2 = t1+t2;                                 \\\n   p5 = (p3+p4)*stbi__f2f( 1.175875602f);      \\\n   t0 = t0*stbi__f2f( 0.298631336f);           \\\n   t1 = t1*stbi__f2f( 2.053119869f);           \\\n   t2 = t2*stbi__f2f( 3.072711026f);           \\\n   t3 = t3*stbi__f2f( 1.501321110f);           \\\n   p1 = p5 + p1*stbi__f2f(-0.899976223f);      \\\n   p2 = p5 + p2*stbi__f2f(-2.562915447f);      \\\n   p3 = p3*stbi__f2f(-1.961570560f);           \\\n   p4 = p4*stbi__f2f(-0.390180644f);           \\\n   t3 += p1+p4;                                \\\n   t2 += p2+p3;                                \\\n   t1 += p2+p4;                                \\\n   t0 += p1+p3;\n\nstatic void stbi__idct_block(stbi_uc *out, int out_stride, short data[64])\n{\n   int i,val[64],*v=val;\n   stbi_uc *o;\n   short *d = data;\n\n   // columns\n   for (i=0; i < 8; ++i,++d, ++v) {\n      // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing\n      if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0\n           && d[40]==0 && d[48]==0 && d[56]==0) {\n         //    no shortcut                 0     seconds\n         //    (1|2|3|4|5|6|7)==0          0     seconds\n         //    all separate               -0.047 seconds\n         //    1 && 2|3 && 4|5 && 6|7:    -0.047 seconds\n         int dcterm = d[0] << 2;\n         v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;\n      } else {\n         STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])\n         // constants scaled things up by 1<<12; let's bring them back\n         // down, but keep 2 extra bits of precision\n         x0 += 512; x1 += 512; x2 += 512; x3 += 512;\n         v[ 0] = (x0+t3) >> 10;\n         v[56] = (x0-t3) >> 10;\n         v[ 8] = (x1+t2) >> 10;\n         v[48] = (x1-t2) >> 10;\n         v[16] = (x2+t1) >> 10;\n         v[40] = (x2-t1) >> 10;\n         v[24] = (x3+t0) >> 10;\n         v[32] = (x3-t0) >> 10;\n      }\n   }\n\n   for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {\n      // no fast case since the first 1D IDCT spread components out\n      STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])\n      // constants scaled things up by 1<<12, plus we had 1<<2 from first\n      // loop, plus horizontal and vertical each scale by sqrt(8) so together\n      // we've got an extra 1<<3, so 1<<17 total we need to remove.\n      // so we want to round that, which means adding 0.5 * 1<<17,\n      // aka 65536. Also, we'll end up with -128 to 127 that we want\n      // to encode as 0..255 by adding 128, so we'll add that before the shift\n      x0 += 65536 + (128<<17);\n      x1 += 65536 + (128<<17);\n      x2 += 65536 + (128<<17);\n      x3 += 65536 + (128<<17);\n      // tried computing the shifts into temps, or'ing the temps to see\n      // if any were out of range, but that was slower\n      o[0] = stbi__clamp((x0+t3) >> 17);\n      o[7] = stbi__clamp((x0-t3) >> 17);\n      o[1] = stbi__clamp((x1+t2) >> 17);\n      o[6] = stbi__clamp((x1-t2) >> 17);\n      o[2] = stbi__clamp((x2+t1) >> 17);\n      o[5] = stbi__clamp((x2-t1) >> 17);\n      o[3] = stbi__clamp((x3+t0) >> 17);\n      o[4] = stbi__clamp((x3-t0) >> 17);\n   }\n}\n\n#ifdef STBI_SSE2\n// sse2 integer IDCT. not the fastest possible implementation but it\n// produces bit-identical results to the generic C version so it's\n// fully \"transparent\".\nstatic void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])\n{\n   // This is constructed to match our regular (generic) integer IDCT exactly.\n   __m128i row0, row1, row2, row3, row4, row5, row6, row7;\n   __m128i tmp;\n\n   // dot product constant: even elems=x, odd elems=y\n   #define dct_const(x,y)  _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))\n\n   // out(0) = c0[even]*x + c0[odd]*y   (c0, x, y 16-bit, out 32-bit)\n   // out(1) = c1[even]*x + c1[odd]*y\n   #define dct_rot(out0,out1, x,y,c0,c1) \\\n      __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \\\n      __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \\\n      __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \\\n      __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \\\n      __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \\\n      __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)\n\n   // out = in << 12  (in 16-bit, out 32-bit)\n   #define dct_widen(out, in) \\\n      __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \\\n      __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)\n\n   // wide add\n   #define dct_wadd(out, a, b) \\\n      __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \\\n      __m128i out##_h = _mm_add_epi32(a##_h, b##_h)\n\n   // wide sub\n   #define dct_wsub(out, a, b) \\\n      __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \\\n      __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)\n\n   // butterfly a/b, add bias, then shift by \"s\" and pack\n   #define dct_bfly32o(out0, out1, a,b,bias,s) \\\n      { \\\n         __m128i abiased_l = _mm_add_epi32(a##_l, bias); \\\n         __m128i abiased_h = _mm_add_epi32(a##_h, bias); \\\n         dct_wadd(sum, abiased, b); \\\n         dct_wsub(dif, abiased, b); \\\n         out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \\\n         out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \\\n      }\n\n   // 8-bit interleave step (for transposes)\n   #define dct_interleave8(a, b) \\\n      tmp = a; \\\n      a = _mm_unpacklo_epi8(a, b); \\\n      b = _mm_unpackhi_epi8(tmp, b)\n\n   // 16-bit interleave step (for transposes)\n   #define dct_interleave16(a, b) \\\n      tmp = a; \\\n      a = _mm_unpacklo_epi16(a, b); \\\n      b = _mm_unpackhi_epi16(tmp, b)\n\n   #define dct_pass(bias,shift) \\\n      { \\\n         /* even part */ \\\n         dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \\\n         __m128i sum04 = _mm_add_epi16(row0, row4); \\\n         __m128i dif04 = _mm_sub_epi16(row0, row4); \\\n         dct_widen(t0e, sum04); \\\n         dct_widen(t1e, dif04); \\\n         dct_wadd(x0, t0e, t3e); \\\n         dct_wsub(x3, t0e, t3e); \\\n         dct_wadd(x1, t1e, t2e); \\\n         dct_wsub(x2, t1e, t2e); \\\n         /* odd part */ \\\n         dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \\\n         dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \\\n         __m128i sum17 = _mm_add_epi16(row1, row7); \\\n         __m128i sum35 = _mm_add_epi16(row3, row5); \\\n         dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \\\n         dct_wadd(x4, y0o, y4o); \\\n         dct_wadd(x5, y1o, y5o); \\\n         dct_wadd(x6, y2o, y5o); \\\n         dct_wadd(x7, y3o, y4o); \\\n         dct_bfly32o(row0,row7, x0,x7,bias,shift); \\\n         dct_bfly32o(row1,row6, x1,x6,bias,shift); \\\n         dct_bfly32o(row2,row5, x2,x5,bias,shift); \\\n         dct_bfly32o(row3,row4, x3,x4,bias,shift); \\\n      }\n\n   __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));\n   __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));\n   __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));\n   __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));\n   __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));\n   __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));\n   __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));\n   __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));\n\n   // rounding biases in column/row passes, see stbi__idct_block for explanation.\n   __m128i bias_0 = _mm_set1_epi32(512);\n   __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));\n\n   // load\n   row0 = _mm_load_si128((const __m128i *) (data + 0*8));\n   row1 = _mm_load_si128((const __m128i *) (data + 1*8));\n   row2 = _mm_load_si128((const __m128i *) (data + 2*8));\n   row3 = _mm_load_si128((const __m128i *) (data + 3*8));\n   row4 = _mm_load_si128((const __m128i *) (data + 4*8));\n   row5 = _mm_load_si128((const __m128i *) (data + 5*8));\n   row6 = _mm_load_si128((const __m128i *) (data + 6*8));\n   row7 = _mm_load_si128((const __m128i *) (data + 7*8));\n\n   // column pass\n   dct_pass(bias_0, 10);\n\n   {\n      // 16bit 8x8 transpose pass 1\n      dct_interleave16(row0, row4);\n      dct_interleave16(row1, row5);\n      dct_interleave16(row2, row6);\n      dct_interleave16(row3, row7);\n\n      // transpose pass 2\n      dct_interleave16(row0, row2);\n      dct_interleave16(row1, row3);\n      dct_interleave16(row4, row6);\n      dct_interleave16(row5, row7);\n\n      // transpose pass 3\n      dct_interleave16(row0, row1);\n      dct_interleave16(row2, row3);\n      dct_interleave16(row4, row5);\n      dct_interleave16(row6, row7);\n   }\n\n   // row pass\n   dct_pass(bias_1, 17);\n\n   {\n      // pack\n      __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7\n      __m128i p1 = _mm_packus_epi16(row2, row3);\n      __m128i p2 = _mm_packus_epi16(row4, row5);\n      __m128i p3 = _mm_packus_epi16(row6, row7);\n\n      // 8bit 8x8 transpose pass 1\n      dct_interleave8(p0, p2); // a0e0a1e1...\n      dct_interleave8(p1, p3); // c0g0c1g1...\n\n      // transpose pass 2\n      dct_interleave8(p0, p1); // a0c0e0g0...\n      dct_interleave8(p2, p3); // b0d0f0h0...\n\n      // transpose pass 3\n      dct_interleave8(p0, p2); // a0b0c0d0...\n      dct_interleave8(p1, p3); // a4b4c4d4...\n\n      // store\n      _mm_storel_epi64((__m128i *) out, p0); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, p2); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, p1); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, p3); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));\n   }\n\n#undef dct_const\n#undef dct_rot\n#undef dct_widen\n#undef dct_wadd\n#undef dct_wsub\n#undef dct_bfly32o\n#undef dct_interleave8\n#undef dct_interleave16\n#undef dct_pass\n}\n\n#endif // STBI_SSE2\n\n#ifdef STBI_NEON\n\n// NEON integer IDCT. should produce bit-identical\n// results to the generic C version.\nstatic void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])\n{\n   int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;\n\n   int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));\n   int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));\n   int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));\n   int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));\n   int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));\n   int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));\n   int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));\n   int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));\n   int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));\n   int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));\n   int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));\n   int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));\n\n#define dct_long_mul(out, inq, coeff) \\\n   int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \\\n   int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)\n\n#define dct_long_mac(out, acc, inq, coeff) \\\n   int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \\\n   int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)\n\n#define dct_widen(out, inq) \\\n   int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \\\n   int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)\n\n// wide add\n#define dct_wadd(out, a, b) \\\n   int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \\\n   int32x4_t out##_h = vaddq_s32(a##_h, b##_h)\n\n// wide sub\n#define dct_wsub(out, a, b) \\\n   int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \\\n   int32x4_t out##_h = vsubq_s32(a##_h, b##_h)\n\n// butterfly a/b, then shift using \"shiftop\" by \"s\" and pack\n#define dct_bfly32o(out0,out1, a,b,shiftop,s) \\\n   { \\\n      dct_wadd(sum, a, b); \\\n      dct_wsub(dif, a, b); \\\n      out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \\\n      out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \\\n   }\n\n#define dct_pass(shiftop, shift) \\\n   { \\\n      /* even part */ \\\n      int16x8_t sum26 = vaddq_s16(row2, row6); \\\n      dct_long_mul(p1e, sum26, rot0_0); \\\n      dct_long_mac(t2e, p1e, row6, rot0_1); \\\n      dct_long_mac(t3e, p1e, row2, rot0_2); \\\n      int16x8_t sum04 = vaddq_s16(row0, row4); \\\n      int16x8_t dif04 = vsubq_s16(row0, row4); \\\n      dct_widen(t0e, sum04); \\\n      dct_widen(t1e, dif04); \\\n      dct_wadd(x0, t0e, t3e); \\\n      dct_wsub(x3, t0e, t3e); \\\n      dct_wadd(x1, t1e, t2e); \\\n      dct_wsub(x2, t1e, t2e); \\\n      /* odd part */ \\\n      int16x8_t sum15 = vaddq_s16(row1, row5); \\\n      int16x8_t sum17 = vaddq_s16(row1, row7); \\\n      int16x8_t sum35 = vaddq_s16(row3, row5); \\\n      int16x8_t sum37 = vaddq_s16(row3, row7); \\\n      int16x8_t sumodd = vaddq_s16(sum17, sum35); \\\n      dct_long_mul(p5o, sumodd, rot1_0); \\\n      dct_long_mac(p1o, p5o, sum17, rot1_1); \\\n      dct_long_mac(p2o, p5o, sum35, rot1_2); \\\n      dct_long_mul(p3o, sum37, rot2_0); \\\n      dct_long_mul(p4o, sum15, rot2_1); \\\n      dct_wadd(sump13o, p1o, p3o); \\\n      dct_wadd(sump24o, p2o, p4o); \\\n      dct_wadd(sump23o, p2o, p3o); \\\n      dct_wadd(sump14o, p1o, p4o); \\\n      dct_long_mac(x4, sump13o, row7, rot3_0); \\\n      dct_long_mac(x5, sump24o, row5, rot3_1); \\\n      dct_long_mac(x6, sump23o, row3, rot3_2); \\\n      dct_long_mac(x7, sump14o, row1, rot3_3); \\\n      dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \\\n      dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \\\n      dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \\\n      dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \\\n   }\n\n   // load\n   row0 = vld1q_s16(data + 0*8);\n   row1 = vld1q_s16(data + 1*8);\n   row2 = vld1q_s16(data + 2*8);\n   row3 = vld1q_s16(data + 3*8);\n   row4 = vld1q_s16(data + 4*8);\n   row5 = vld1q_s16(data + 5*8);\n   row6 = vld1q_s16(data + 6*8);\n   row7 = vld1q_s16(data + 7*8);\n\n   // add DC bias\n   row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));\n\n   // column pass\n   dct_pass(vrshrn_n_s32, 10);\n\n   // 16bit 8x8 transpose\n   {\n// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively.\n// whether compilers actually get this is another story, sadly.\n#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }\n#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); }\n#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); }\n\n      // pass 1\n      dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6\n      dct_trn16(row2, row3);\n      dct_trn16(row4, row5);\n      dct_trn16(row6, row7);\n\n      // pass 2\n      dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4\n      dct_trn32(row1, row3);\n      dct_trn32(row4, row6);\n      dct_trn32(row5, row7);\n\n      // pass 3\n      dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0\n      dct_trn64(row1, row5);\n      dct_trn64(row2, row6);\n      dct_trn64(row3, row7);\n\n#undef dct_trn16\n#undef dct_trn32\n#undef dct_trn64\n   }\n\n   // row pass\n   // vrshrn_n_s32 only supports shifts up to 16, we need\n   // 17. so do a non-rounding shift of 16 first then follow\n   // up with a rounding shift by 1.\n   dct_pass(vshrn_n_s32, 16);\n\n   {\n      // pack and round\n      uint8x8_t p0 = vqrshrun_n_s16(row0, 1);\n      uint8x8_t p1 = vqrshrun_n_s16(row1, 1);\n      uint8x8_t p2 = vqrshrun_n_s16(row2, 1);\n      uint8x8_t p3 = vqrshrun_n_s16(row3, 1);\n      uint8x8_t p4 = vqrshrun_n_s16(row4, 1);\n      uint8x8_t p5 = vqrshrun_n_s16(row5, 1);\n      uint8x8_t p6 = vqrshrun_n_s16(row6, 1);\n      uint8x8_t p7 = vqrshrun_n_s16(row7, 1);\n\n      // again, these can translate into one instruction, but often don't.\n#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }\n#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); }\n#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); }\n\n      // sadly can't use interleaved stores here since we only write\n      // 8 bytes to each scan line!\n\n      // 8x8 8-bit transpose pass 1\n      dct_trn8_8(p0, p1);\n      dct_trn8_8(p2, p3);\n      dct_trn8_8(p4, p5);\n      dct_trn8_8(p6, p7);\n\n      // pass 2\n      dct_trn8_16(p0, p2);\n      dct_trn8_16(p1, p3);\n      dct_trn8_16(p4, p6);\n      dct_trn8_16(p5, p7);\n\n      // pass 3\n      dct_trn8_32(p0, p4);\n      dct_trn8_32(p1, p5);\n      dct_trn8_32(p2, p6);\n      dct_trn8_32(p3, p7);\n\n      // store\n      vst1_u8(out, p0); out += out_stride;\n      vst1_u8(out, p1); out += out_stride;\n      vst1_u8(out, p2); out += out_stride;\n      vst1_u8(out, p3); out += out_stride;\n      vst1_u8(out, p4); out += out_stride;\n      vst1_u8(out, p5); out += out_stride;\n      vst1_u8(out, p6); out += out_stride;\n      vst1_u8(out, p7);\n\n#undef dct_trn8_8\n#undef dct_trn8_16\n#undef dct_trn8_32\n   }\n\n#undef dct_long_mul\n#undef dct_long_mac\n#undef dct_widen\n#undef dct_wadd\n#undef dct_wsub\n#undef dct_bfly32o\n#undef dct_pass\n}\n\n#endif // STBI_NEON\n\n#define STBI__MARKER_none  0xff\n// if there's a pending marker from the entropy stream, return that\n// otherwise, fetch from the stream and get a marker. if there's no\n// marker, return 0xff, which is never a valid marker value\nstatic stbi_uc stbi__get_marker(stbi__jpeg *j)\n{\n   stbi_uc x;\n   if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; }\n   x = stbi__get8(j->s);\n   if (x != 0xff) return STBI__MARKER_none;\n   while (x == 0xff)\n      x = stbi__get8(j->s);\n   return x;\n}\n\n// in each scan, we'll have scan_n components, and the order\n// of the components is specified by order[]\n#define STBI__RESTART(x)     ((x) >= 0xd0 && (x) <= 0xd7)\n\n// after a restart interval, stbi__jpeg_reset the entropy decoder and\n// the dc prediction\nstatic void stbi__jpeg_reset(stbi__jpeg *j)\n{\n   j->code_bits = 0;\n   j->code_buffer = 0;\n   j->nomore = 0;\n   j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0;\n   j->marker = STBI__MARKER_none;\n   j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;\n   j->eob_run = 0;\n   // no more than 1<<31 MCUs if no restart_interal? that's plenty safe,\n   // since we don't even allow 1<<30 pixels\n}\n\nstatic int stbi__parse_entropy_coded_data(stbi__jpeg *z)\n{\n   stbi__jpeg_reset(z);\n   if (!z->progressive) {\n      if (z->scan_n == 1) {\n         int i,j;\n         STBI_SIMD_ALIGN(short, data[64]);\n         int n = z->order[0];\n         // non-interleaved data, we just need to process one block at a time,\n         // in trivial scanline order\n         // number of blocks to do just depends on how many actual \"pixels\" this\n         // component has, independent of interleaved MCU blocking and such\n         int w = (z->img_comp[n].x+7) >> 3;\n         int h = (z->img_comp[n].y+7) >> 3;\n         for (j=0; j < h; ++j) {\n            for (i=0; i < w; ++i) {\n               int ha = z->img_comp[n].ha;\n               if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0;\n               z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);\n               // every data block is an MCU, so countdown the restart interval\n               if (--z->todo <= 0) {\n                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\n                  // if it's NOT a restart, then just bail, so we get corrupt data\n                  // rather than no data\n                  if (!STBI__RESTART(z->marker)) return 1;\n                  stbi__jpeg_reset(z);\n               }\n            }\n         }\n         return 1;\n      } else { // interleaved\n         int i,j,k,x,y;\n         STBI_SIMD_ALIGN(short, data[64]);\n         for (j=0; j < z->img_mcu_y; ++j) {\n            for (i=0; i < z->img_mcu_x; ++i) {\n               // scan an interleaved mcu... process scan_n components in order\n               for (k=0; k < z->scan_n; ++k) {\n                  int n = z->order[k];\n                  // scan out an mcu's worth of this component; that's just determined\n                  // by the basic H and V specified for the component\n                  for (y=0; y < z->img_comp[n].v; ++y) {\n                     for (x=0; x < z->img_comp[n].h; ++x) {\n                        int x2 = (i*z->img_comp[n].h + x)*8;\n                        int y2 = (j*z->img_comp[n].v + y)*8;\n                        int ha = z->img_comp[n].ha;\n                        if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0;\n                        z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);\n                     }\n                  }\n               }\n               // after all interleaved components, that's an interleaved MCU,\n               // so now count down the restart interval\n               if (--z->todo <= 0) {\n                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\n                  if (!STBI__RESTART(z->marker)) return 1;\n                  stbi__jpeg_reset(z);\n               }\n            }\n         }\n         return 1;\n      }\n   } else {\n      if (z->scan_n == 1) {\n         int i,j;\n         int n = z->order[0];\n         // non-interleaved data, we just need to process one block at a time,\n         // in trivial scanline order\n         // number of blocks to do just depends on how many actual \"pixels\" this\n         // component has, independent of interleaved MCU blocking and such\n         int w = (z->img_comp[n].x+7) >> 3;\n         int h = (z->img_comp[n].y+7) >> 3;\n         for (j=0; j < h; ++j) {\n            for (i=0; i < w; ++i) {\n               short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);\n               if (z->spec_start == 0) {\n                  if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))\n                     return 0;\n               } else {\n                  int ha = z->img_comp[n].ha;\n                  if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))\n                     return 0;\n               }\n               // every data block is an MCU, so countdown the restart interval\n               if (--z->todo <= 0) {\n                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\n                  if (!STBI__RESTART(z->marker)) return 1;\n                  stbi__jpeg_reset(z);\n               }\n            }\n         }\n         return 1;\n      } else { // interleaved\n         int i,j,k,x,y;\n         for (j=0; j < z->img_mcu_y; ++j) {\n            for (i=0; i < z->img_mcu_x; ++i) {\n               // scan an interleaved mcu... process scan_n components in order\n               for (k=0; k < z->scan_n; ++k) {\n                  int n = z->order[k];\n                  // scan out an mcu's worth of this component; that's just determined\n                  // by the basic H and V specified for the component\n                  for (y=0; y < z->img_comp[n].v; ++y) {\n                     for (x=0; x < z->img_comp[n].h; ++x) {\n                        int x2 = (i*z->img_comp[n].h + x);\n                        int y2 = (j*z->img_comp[n].v + y);\n                        short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);\n                        if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))\n                           return 0;\n                     }\n                  }\n               }\n               // after all interleaved components, that's an interleaved MCU,\n               // so now count down the restart interval\n               if (--z->todo <= 0) {\n                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\n                  if (!STBI__RESTART(z->marker)) return 1;\n                  stbi__jpeg_reset(z);\n               }\n            }\n         }\n         return 1;\n      }\n   }\n}\n\nstatic void stbi__jpeg_dequantize(short *data, stbi_uc *dequant)\n{\n   int i;\n   for (i=0; i < 64; ++i)\n      data[i] *= dequant[i];\n}\n\nstatic void stbi__jpeg_finish(stbi__jpeg *z)\n{\n   if (z->progressive) {\n      // dequantize and idct the data\n      int i,j,n;\n      for (n=0; n < z->s->img_n; ++n) {\n         int w = (z->img_comp[n].x+7) >> 3;\n         int h = (z->img_comp[n].y+7) >> 3;\n         for (j=0; j < h; ++j) {\n            for (i=0; i < w; ++i) {\n               short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);\n               stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);\n               z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);\n            }\n         }\n      }\n   }\n}\n\nstatic int stbi__process_marker(stbi__jpeg *z, int m)\n{\n   int L;\n   switch (m) {\n      case STBI__MARKER_none: // no marker found\n         return stbi__err(\"expected marker\",\"Corrupt JPEG\");\n\n      case 0xDD: // DRI - specify restart interval\n         if (stbi__get16be(z->s) != 4) return stbi__err(\"bad DRI len\",\"Corrupt JPEG\");\n         z->restart_interval = stbi__get16be(z->s);\n         return 1;\n\n      case 0xDB: // DQT - define quantization table\n         L = stbi__get16be(z->s)-2;\n         while (L > 0) {\n            int q = stbi__get8(z->s);\n            int p = q >> 4;\n            int t = q & 15,i;\n            if (p != 0) return stbi__err(\"bad DQT type\",\"Corrupt JPEG\");\n            if (t > 3) return stbi__err(\"bad DQT table\",\"Corrupt JPEG\");\n            for (i=0; i < 64; ++i)\n               z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s);\n            L -= 65;\n         }\n         return L==0;\n\n      case 0xC4: // DHT - define huffman table\n         L = stbi__get16be(z->s)-2;\n         while (L > 0) {\n            stbi_uc *v;\n            int sizes[16],i,n=0;\n            int q = stbi__get8(z->s);\n            int tc = q >> 4;\n            int th = q & 15;\n            if (tc > 1 || th > 3) return stbi__err(\"bad DHT header\",\"Corrupt JPEG\");\n            for (i=0; i < 16; ++i) {\n               sizes[i] = stbi__get8(z->s);\n               n += sizes[i];\n            }\n            L -= 17;\n            if (tc == 0) {\n               if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0;\n               v = z->huff_dc[th].values;\n            } else {\n               if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0;\n               v = z->huff_ac[th].values;\n            }\n            for (i=0; i < n; ++i)\n               v[i] = stbi__get8(z->s);\n            if (tc != 0)\n               stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);\n            L -= n;\n         }\n         return L==0;\n   }\n   // check for comment block or APP blocks\n   if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {\n      stbi__skip(z->s, stbi__get16be(z->s)-2);\n      return 1;\n   }\n   return 0;\n}\n\n// after we see SOS\nstatic int stbi__process_scan_header(stbi__jpeg *z)\n{\n   int i;\n   int Ls = stbi__get16be(z->s);\n   z->scan_n = stbi__get8(z->s);\n   if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err(\"bad SOS component count\",\"Corrupt JPEG\");\n   if (Ls != 6+2*z->scan_n) return stbi__err(\"bad SOS len\",\"Corrupt JPEG\");\n   for (i=0; i < z->scan_n; ++i) {\n      int id = stbi__get8(z->s), which;\n      int q = stbi__get8(z->s);\n      for (which = 0; which < z->s->img_n; ++which)\n         if (z->img_comp[which].id == id)\n            break;\n      if (which == z->s->img_n) return 0; // no match\n      z->img_comp[which].hd = q >> 4;   if (z->img_comp[which].hd > 3) return stbi__err(\"bad DC huff\",\"Corrupt JPEG\");\n      z->img_comp[which].ha = q & 15;   if (z->img_comp[which].ha > 3) return stbi__err(\"bad AC huff\",\"Corrupt JPEG\");\n      z->order[i] = which;\n   }\n\n   {\n      int aa;\n      z->spec_start = stbi__get8(z->s);\n      z->spec_end   = stbi__get8(z->s); // should be 63, but might be 0\n      aa = stbi__get8(z->s);\n      z->succ_high = (aa >> 4);\n      z->succ_low  = (aa & 15);\n      if (z->progressive) {\n         if (z->spec_start > 63 || z->spec_end > 63  || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)\n            return stbi__err(\"bad SOS\", \"Corrupt JPEG\");\n      } else {\n         if (z->spec_start != 0) return stbi__err(\"bad SOS\",\"Corrupt JPEG\");\n         if (z->succ_high != 0 || z->succ_low != 0) return stbi__err(\"bad SOS\",\"Corrupt JPEG\");\n         z->spec_end = 63;\n      }\n   }\n\n   return 1;\n}\n\nstatic int stbi__process_frame_header(stbi__jpeg *z, int scan)\n{\n   stbi__context *s = z->s;\n   int Lf,p,i,q, h_max=1,v_max=1,c;\n   Lf = stbi__get16be(s);         if (Lf < 11) return stbi__err(\"bad SOF len\",\"Corrupt JPEG\"); // JPEG\n   p  = stbi__get8(s);            if (p != 8) return stbi__err(\"only 8-bit\",\"JPEG format not supported: 8-bit only\"); // JPEG baseline\n   s->img_y = stbi__get16be(s);   if (s->img_y == 0) return stbi__err(\"no header height\", \"JPEG format not supported: delayed height\"); // Legal, but we don't handle it--but neither does IJG\n   s->img_x = stbi__get16be(s);   if (s->img_x == 0) return stbi__err(\"0 width\",\"Corrupt JPEG\"); // JPEG requires\n   c = stbi__get8(s);\n   if (c != 3 && c != 1) return stbi__err(\"bad component count\",\"Corrupt JPEG\");    // JFIF requires\n   s->img_n = c;\n   for (i=0; i < c; ++i) {\n      z->img_comp[i].data = NULL;\n      z->img_comp[i].linebuf = NULL;\n   }\n\n   if (Lf != 8+3*s->img_n) return stbi__err(\"bad SOF len\",\"Corrupt JPEG\");\n\n   for (i=0; i < s->img_n; ++i) {\n      z->img_comp[i].id = stbi__get8(s);\n      if (z->img_comp[i].id != i+1)   // JFIF requires\n         if (z->img_comp[i].id != i)  // some version of jpegtran outputs non-JFIF-compliant files!\n            return stbi__err(\"bad component ID\",\"Corrupt JPEG\");\n      q = stbi__get8(s);\n      z->img_comp[i].h = (q >> 4);  if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err(\"bad H\",\"Corrupt JPEG\");\n      z->img_comp[i].v = q & 15;    if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err(\"bad V\",\"Corrupt JPEG\");\n      z->img_comp[i].tq = stbi__get8(s);  if (z->img_comp[i].tq > 3) return stbi__err(\"bad TQ\",\"Corrupt JPEG\");\n   }\n\n   if (scan != STBI__SCAN_load) return 1;\n\n   if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err(\"too large\", \"Image too large to decode\");\n\n   for (i=0; i < s->img_n; ++i) {\n      if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;\n      if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;\n   }\n\n   // compute interleaved mcu info\n   z->img_h_max = h_max;\n   z->img_v_max = v_max;\n   z->img_mcu_w = h_max * 8;\n   z->img_mcu_h = v_max * 8;\n   z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;\n   z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;\n\n   for (i=0; i < s->img_n; ++i) {\n      // number of effective pixels (e.g. for non-interleaved MCU)\n      z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;\n      z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;\n      // to simplify generation, we'll allocate enough memory to decode\n      // the bogus oversized data from using interleaved MCUs and their\n      // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't\n      // discard the extra data until colorspace conversion\n      z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;\n      z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;\n      z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15);\n\n      if (z->img_comp[i].raw_data == NULL) {\n         for(--i; i >= 0; --i) {\n            STBI_FREE(z->img_comp[i].raw_data);\n            z->img_comp[i].data = NULL;\n         }\n         return stbi__err(\"outofmem\", \"Out of memory\");\n      }\n      // align blocks for idct using mmx/sse\n      z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);\n      z->img_comp[i].linebuf = NULL;\n      if (z->progressive) {\n         z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3;\n         z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3;\n         z->img_comp[i].raw_coeff = STBI_MALLOC(z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 * sizeof(short) + 15);\n         z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15);\n      } else {\n         z->img_comp[i].coeff = 0;\n         z->img_comp[i].raw_coeff = 0;\n      }\n   }\n\n   return 1;\n}\n\n// use comparisons since in some cases we handle more than one case (e.g. SOF)\n#define stbi__DNL(x)         ((x) == 0xdc)\n#define stbi__SOI(x)         ((x) == 0xd8)\n#define stbi__EOI(x)         ((x) == 0xd9)\n#define stbi__SOF(x)         ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)\n#define stbi__SOS(x)         ((x) == 0xda)\n\n#define stbi__SOF_progressive(x)   ((x) == 0xc2)\n\nstatic int stbi__decode_jpeg_header(stbi__jpeg *z, int scan)\n{\n   int m;\n   z->marker = STBI__MARKER_none; // initialize cached marker to empty\n   m = stbi__get_marker(z);\n   if (!stbi__SOI(m)) return stbi__err(\"no SOI\",\"Corrupt JPEG\");\n   if (scan == STBI__SCAN_type) return 1;\n   m = stbi__get_marker(z);\n   while (!stbi__SOF(m)) {\n      if (!stbi__process_marker(z,m)) return 0;\n      m = stbi__get_marker(z);\n      while (m == STBI__MARKER_none) {\n         // some files have extra padding after their blocks, so ok, we'll scan\n         if (stbi__at_eof(z->s)) return stbi__err(\"no SOF\", \"Corrupt JPEG\");\n         m = stbi__get_marker(z);\n      }\n   }\n   z->progressive = stbi__SOF_progressive(m);\n   if (!stbi__process_frame_header(z, scan)) return 0;\n   return 1;\n}\n\n// decode image to YCbCr format\nstatic int stbi__decode_jpeg_image(stbi__jpeg *j)\n{\n   int m;\n   j->restart_interval = 0;\n   if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0;\n   m = stbi__get_marker(j);\n   while (!stbi__EOI(m)) {\n      if (stbi__SOS(m)) {\n         if (!stbi__process_scan_header(j)) return 0;\n         if (!stbi__parse_entropy_coded_data(j)) return 0;\n         if (j->marker == STBI__MARKER_none ) {\n            // handle 0s at the end of image data from IP Kamera 9060\n            while (!stbi__at_eof(j->s)) {\n               int x = stbi__get8(j->s);\n               if (x == 255) {\n                  j->marker = stbi__get8(j->s);\n                  break;\n               } else if (x != 0) {\n                  return stbi__err(\"junk before marker\", \"Corrupt JPEG\");\n               }\n            }\n            // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0\n         }\n      } else {\n         if (!stbi__process_marker(j, m)) return 0;\n      }\n      m = stbi__get_marker(j);\n   }\n   if (j->progressive)\n      stbi__jpeg_finish(j);\n   return 1;\n}\n\n// static jfif-centered resampling (across block boundaries)\n\ntypedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,\n                                    int w, int hs);\n\n#define stbi__div4(x) ((stbi_uc) ((x) >> 2))\n\nstatic stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n   STBI_NOTUSED(out);\n   STBI_NOTUSED(in_far);\n   STBI_NOTUSED(w);\n   STBI_NOTUSED(hs);\n   return in_near;\n}\n\nstatic stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n   // need to generate two samples vertically for every one in input\n   int i;\n   STBI_NOTUSED(hs);\n   for (i=0; i < w; ++i)\n      out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);\n   return out;\n}\n\nstatic stbi_uc*  stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n   // need to generate two samples horizontally for every one in input\n   int i;\n   stbi_uc *input = in_near;\n\n   if (w == 1) {\n      // if only one sample, can't do any interpolation\n      out[0] = out[1] = input[0];\n      return out;\n   }\n\n   out[0] = input[0];\n   out[1] = stbi__div4(input[0]*3 + input[1] + 2);\n   for (i=1; i < w-1; ++i) {\n      int n = 3*input[i]+2;\n      out[i*2+0] = stbi__div4(n+input[i-1]);\n      out[i*2+1] = stbi__div4(n+input[i+1]);\n   }\n   out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);\n   out[i*2+1] = input[w-1];\n\n   STBI_NOTUSED(in_far);\n   STBI_NOTUSED(hs);\n\n   return out;\n}\n\n#define stbi__div16(x) ((stbi_uc) ((x) >> 4))\n\nstatic stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n   // need to generate 2x2 samples for every one in input\n   int i,t0,t1;\n   if (w == 1) {\n      out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);\n      return out;\n   }\n\n   t1 = 3*in_near[0] + in_far[0];\n   out[0] = stbi__div4(t1+2);\n   for (i=1; i < w; ++i) {\n      t0 = t1;\n      t1 = 3*in_near[i]+in_far[i];\n      out[i*2-1] = stbi__div16(3*t0 + t1 + 8);\n      out[i*2  ] = stbi__div16(3*t1 + t0 + 8);\n   }\n   out[w*2-1] = stbi__div4(t1+2);\n\n   STBI_NOTUSED(hs);\n\n   return out;\n}\n\n#if defined(STBI_SSE2) || defined(STBI_NEON)\nstatic stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n   // need to generate 2x2 samples for every one in input\n   int i=0,t0,t1;\n\n   if (w == 1) {\n      out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);\n      return out;\n   }\n\n   t1 = 3*in_near[0] + in_far[0];\n   // process groups of 8 pixels for as long as we can.\n   // note we can't handle the last pixel in a row in this loop\n   // because we need to handle the filter boundary conditions.\n   for (; i < ((w-1) & ~7); i += 8) {\n#if defined(STBI_SSE2)\n      // load and perform the vertical filtering pass\n      // this uses 3*x + y = 4*x + (y - x)\n      __m128i zero  = _mm_setzero_si128();\n      __m128i farb  = _mm_loadl_epi64((__m128i *) (in_far + i));\n      __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));\n      __m128i farw  = _mm_unpacklo_epi8(farb, zero);\n      __m128i nearw = _mm_unpacklo_epi8(nearb, zero);\n      __m128i diff  = _mm_sub_epi16(farw, nearw);\n      __m128i nears = _mm_slli_epi16(nearw, 2);\n      __m128i curr  = _mm_add_epi16(nears, diff); // current row\n\n      // horizontal filter works the same based on shifted vers of current\n      // row. \"prev\" is current row shifted right by 1 pixel; we need to\n      // insert the previous pixel value (from t1).\n      // \"next\" is current row shifted left by 1 pixel, with first pixel\n      // of next block of 8 pixels added in.\n      __m128i prv0 = _mm_slli_si128(curr, 2);\n      __m128i nxt0 = _mm_srli_si128(curr, 2);\n      __m128i prev = _mm_insert_epi16(prv0, t1, 0);\n      __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);\n\n      // horizontal filter, polyphase implementation since it's convenient:\n      // even pixels = 3*cur + prev = cur*4 + (prev - cur)\n      // odd  pixels = 3*cur + next = cur*4 + (next - cur)\n      // note the shared term.\n      __m128i bias  = _mm_set1_epi16(8);\n      __m128i curs = _mm_slli_epi16(curr, 2);\n      __m128i prvd = _mm_sub_epi16(prev, curr);\n      __m128i nxtd = _mm_sub_epi16(next, curr);\n      __m128i curb = _mm_add_epi16(curs, bias);\n      __m128i even = _mm_add_epi16(prvd, curb);\n      __m128i odd  = _mm_add_epi16(nxtd, curb);\n\n      // interleave even and odd pixels, then undo scaling.\n      __m128i int0 = _mm_unpacklo_epi16(even, odd);\n      __m128i int1 = _mm_unpackhi_epi16(even, odd);\n      __m128i de0  = _mm_srli_epi16(int0, 4);\n      __m128i de1  = _mm_srli_epi16(int1, 4);\n\n      // pack and write output\n      __m128i outv = _mm_packus_epi16(de0, de1);\n      _mm_storeu_si128((__m128i *) (out + i*2), outv);\n#elif defined(STBI_NEON)\n      // load and perform the vertical filtering pass\n      // this uses 3*x + y = 4*x + (y - x)\n      uint8x8_t farb  = vld1_u8(in_far + i);\n      uint8x8_t nearb = vld1_u8(in_near + i);\n      int16x8_t diff  = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));\n      int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));\n      int16x8_t curr  = vaddq_s16(nears, diff); // current row\n\n      // horizontal filter works the same based on shifted vers of current\n      // row. \"prev\" is current row shifted right by 1 pixel; we need to\n      // insert the previous pixel value (from t1).\n      // \"next\" is current row shifted left by 1 pixel, with first pixel\n      // of next block of 8 pixels added in.\n      int16x8_t prv0 = vextq_s16(curr, curr, 7);\n      int16x8_t nxt0 = vextq_s16(curr, curr, 1);\n      int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);\n      int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);\n\n      // horizontal filter, polyphase implementation since it's convenient:\n      // even pixels = 3*cur + prev = cur*4 + (prev - cur)\n      // odd  pixels = 3*cur + next = cur*4 + (next - cur)\n      // note the shared term.\n      int16x8_t curs = vshlq_n_s16(curr, 2);\n      int16x8_t prvd = vsubq_s16(prev, curr);\n      int16x8_t nxtd = vsubq_s16(next, curr);\n      int16x8_t even = vaddq_s16(curs, prvd);\n      int16x8_t odd  = vaddq_s16(curs, nxtd);\n\n      // undo scaling and round, then store with even/odd phases interleaved\n      uint8x8x2_t o;\n      o.val[0] = vqrshrun_n_s16(even, 4);\n      o.val[1] = vqrshrun_n_s16(odd,  4);\n      vst2_u8(out + i*2, o);\n#endif\n\n      // \"previous\" value for next iter\n      t1 = 3*in_near[i+7] + in_far[i+7];\n   }\n\n   t0 = t1;\n   t1 = 3*in_near[i] + in_far[i];\n   out[i*2] = stbi__div16(3*t1 + t0 + 8);\n\n   for (++i; i < w; ++i) {\n      t0 = t1;\n      t1 = 3*in_near[i]+in_far[i];\n      out[i*2-1] = stbi__div16(3*t0 + t1 + 8);\n      out[i*2  ] = stbi__div16(3*t1 + t0 + 8);\n   }\n   out[w*2-1] = stbi__div4(t1+2);\n\n   STBI_NOTUSED(hs);\n\n   return out;\n}\n#endif\n\nstatic stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n   // resample with nearest-neighbor\n   int i,j;\n   STBI_NOTUSED(in_far);\n   for (i=0; i < w; ++i)\n      for (j=0; j < hs; ++j)\n         out[i*hs+j] = in_near[i];\n   return out;\n}\n\n#ifdef STBI_JPEG_OLD\n// this is the same YCbCr-to-RGB calculation that stb_image has used\n// historically before the algorithm changes in 1.49\n#define float2fixed(x)  ((int) ((x) * 65536 + 0.5))\nstatic void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step)\n{\n   int i;\n   for (i=0; i < count; ++i) {\n      int y_fixed = (y[i] << 16) + 32768; // rounding\n      int r,g,b;\n      int cr = pcr[i] - 128;\n      int cb = pcb[i] - 128;\n      r = y_fixed + cr*float2fixed(1.40200f);\n      g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f);\n      b = y_fixed                            + cb*float2fixed(1.77200f);\n      r >>= 16;\n      g >>= 16;\n      b >>= 16;\n      if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }\n      if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }\n      if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }\n      out[0] = (stbi_uc)r;\n      out[1] = (stbi_uc)g;\n      out[2] = (stbi_uc)b;\n      out[3] = 255;\n      out += step;\n   }\n}\n#else\n// this is a reduced-precision calculation of YCbCr-to-RGB introduced\n// to make sure the code produces the same results in both SIMD and scalar\n#define float2fixed(x)  (((int) ((x) * 4096.0f + 0.5f)) << 8)\nstatic void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step)\n{\n   int i;\n   for (i=0; i < count; ++i) {\n      int y_fixed = (y[i] << 20) + (1<<19); // rounding\n      int r,g,b;\n      int cr = pcr[i] - 128;\n      int cb = pcb[i] - 128;\n      r = y_fixed +  cr* float2fixed(1.40200f);\n      g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);\n      b = y_fixed                               +   cb* float2fixed(1.77200f);\n      r >>= 20;\n      g >>= 20;\n      b >>= 20;\n      if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }\n      if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }\n      if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }\n      out[0] = (stbi_uc)r;\n      out[1] = (stbi_uc)g;\n      out[2] = (stbi_uc)b;\n      out[3] = 255;\n      out += step;\n   }\n}\n#endif\n\n#if defined(STBI_SSE2) || defined(STBI_NEON)\nstatic void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step)\n{\n   int i = 0;\n\n#ifdef STBI_SSE2\n   // step == 3 is pretty ugly on the final interleave, and i'm not convinced\n   // it's useful in practice (you wouldn't use it for textures, for example).\n   // so just accelerate step == 4 case.\n   if (step == 4) {\n      // this is a fairly straightforward implementation and not super-optimized.\n      __m128i signflip  = _mm_set1_epi8(-0x80);\n      __m128i cr_const0 = _mm_set1_epi16(   (short) ( 1.40200f*4096.0f+0.5f));\n      __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f));\n      __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f));\n      __m128i cb_const1 = _mm_set1_epi16(   (short) ( 1.77200f*4096.0f+0.5f));\n      __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128);\n      __m128i xw = _mm_set1_epi16(255); // alpha channel\n\n      for (; i+7 < count; i += 8) {\n         // load\n         __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));\n         __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));\n         __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));\n         __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128\n         __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128\n\n         // unpack to short (and left-shift cr, cb by 8)\n         __m128i yw  = _mm_unpacklo_epi8(y_bias, y_bytes);\n         __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);\n         __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);\n\n         // color transform\n         __m128i yws = _mm_srli_epi16(yw, 4);\n         __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);\n         __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);\n         __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);\n         __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);\n         __m128i rws = _mm_add_epi16(cr0, yws);\n         __m128i gwt = _mm_add_epi16(cb0, yws);\n         __m128i bws = _mm_add_epi16(yws, cb1);\n         __m128i gws = _mm_add_epi16(gwt, cr1);\n\n         // descale\n         __m128i rw = _mm_srai_epi16(rws, 4);\n         __m128i bw = _mm_srai_epi16(bws, 4);\n         __m128i gw = _mm_srai_epi16(gws, 4);\n\n         // back to byte, set up for transpose\n         __m128i brb = _mm_packus_epi16(rw, bw);\n         __m128i gxb = _mm_packus_epi16(gw, xw);\n\n         // transpose to interleave channels\n         __m128i t0 = _mm_unpacklo_epi8(brb, gxb);\n         __m128i t1 = _mm_unpackhi_epi8(brb, gxb);\n         __m128i o0 = _mm_unpacklo_epi16(t0, t1);\n         __m128i o1 = _mm_unpackhi_epi16(t0, t1);\n\n         // store\n         _mm_storeu_si128((__m128i *) (out + 0), o0);\n         _mm_storeu_si128((__m128i *) (out + 16), o1);\n         out += 32;\n      }\n   }\n#endif\n\n#ifdef STBI_NEON\n   // in this version, step=3 support would be easy to add. but is there demand?\n   if (step == 4) {\n      // this is a fairly straightforward implementation and not super-optimized.\n      uint8x8_t signflip = vdup_n_u8(0x80);\n      int16x8_t cr_const0 = vdupq_n_s16(   (short) ( 1.40200f*4096.0f+0.5f));\n      int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f));\n      int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f));\n      int16x8_t cb_const1 = vdupq_n_s16(   (short) ( 1.77200f*4096.0f+0.5f));\n\n      for (; i+7 < count; i += 8) {\n         // load\n         uint8x8_t y_bytes  = vld1_u8(y + i);\n         uint8x8_t cr_bytes = vld1_u8(pcr + i);\n         uint8x8_t cb_bytes = vld1_u8(pcb + i);\n         int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));\n         int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));\n\n         // expand to s16\n         int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));\n         int16x8_t crw = vshll_n_s8(cr_biased, 7);\n         int16x8_t cbw = vshll_n_s8(cb_biased, 7);\n\n         // color transform\n         int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);\n         int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);\n         int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);\n         int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);\n         int16x8_t rws = vaddq_s16(yws, cr0);\n         int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);\n         int16x8_t bws = vaddq_s16(yws, cb1);\n\n         // undo scaling, round, convert to byte\n         uint8x8x4_t o;\n         o.val[0] = vqrshrun_n_s16(rws, 4);\n         o.val[1] = vqrshrun_n_s16(gws, 4);\n         o.val[2] = vqrshrun_n_s16(bws, 4);\n         o.val[3] = vdup_n_u8(255);\n\n         // store, interleaving r/g/b/a\n         vst4_u8(out, o);\n         out += 8*4;\n      }\n   }\n#endif\n\n   for (; i < count; ++i) {\n      int y_fixed = (y[i] << 20) + (1<<19); // rounding\n      int r,g,b;\n      int cr = pcr[i] - 128;\n      int cb = pcb[i] - 128;\n      r = y_fixed + cr* float2fixed(1.40200f);\n      g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);\n      b = y_fixed                             +   cb* float2fixed(1.77200f);\n      r >>= 20;\n      g >>= 20;\n      b >>= 20;\n      if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }\n      if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }\n      if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }\n      out[0] = (stbi_uc)r;\n      out[1] = (stbi_uc)g;\n      out[2] = (stbi_uc)b;\n      out[3] = 255;\n      out += step;\n   }\n}\n#endif\n\n// set up the kernels\nstatic void stbi__setup_jpeg(stbi__jpeg *j)\n{\n   j->idct_block_kernel = stbi__idct_block;\n   j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;\n   j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;\n\n#ifdef STBI_SSE2\n   if (stbi__sse2_available()) {\n      j->idct_block_kernel = stbi__idct_simd;\n      #ifndef STBI_JPEG_OLD\n      j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;\n      #endif\n      j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;\n   }\n#endif\n\n#ifdef STBI_NEON\n   j->idct_block_kernel = stbi__idct_simd;\n   #ifndef STBI_JPEG_OLD\n   j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;\n   #endif\n   j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;\n#endif\n}\n\n// clean up the temporary component buffers\nstatic void stbi__cleanup_jpeg(stbi__jpeg *j)\n{\n   int i;\n   for (i=0; i < j->s->img_n; ++i) {\n      if (j->img_comp[i].raw_data) {\n         STBI_FREE(j->img_comp[i].raw_data);\n         j->img_comp[i].raw_data = NULL;\n         j->img_comp[i].data = NULL;\n      }\n      if (j->img_comp[i].raw_coeff) {\n         STBI_FREE(j->img_comp[i].raw_coeff);\n         j->img_comp[i].raw_coeff = 0;\n         j->img_comp[i].coeff = 0;\n      }\n      if (j->img_comp[i].linebuf) {\n         STBI_FREE(j->img_comp[i].linebuf);\n         j->img_comp[i].linebuf = NULL;\n      }\n   }\n}\n\ntypedef struct\n{\n   resample_row_func resample;\n   stbi_uc *line0,*line1;\n   int hs,vs;   // expansion factor in each axis\n   int w_lores; // horizontal pixels pre-expansion\n   int ystep;   // how far through vertical expansion we are\n   int ypos;    // which pre-expansion row we're on\n} stbi__resample;\n\nstatic stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)\n{\n   int n, decode_n;\n   z->s->img_n = 0; // make stbi__cleanup_jpeg safe\n\n   // validate req_comp\n   if (req_comp < 0 || req_comp > 4) return stbi__errpuc(\"bad req_comp\", \"Internal error\");\n\n   // load a jpeg image from whichever source, but leave in YCbCr format\n   if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; }\n\n   // determine actual number of components to generate\n   n = req_comp ? req_comp : z->s->img_n;\n\n   if (z->s->img_n == 3 && n < 3)\n      decode_n = 1;\n   else\n      decode_n = z->s->img_n;\n\n   // resample and color-convert\n   {\n      int k;\n      unsigned int i,j;\n      stbi_uc *output;\n      stbi_uc *coutput[4];\n\n      stbi__resample res_comp[4];\n\n      for (k=0; k < decode_n; ++k) {\n         stbi__resample *r = &res_comp[k];\n\n         // allocate line buffer big enough for upsampling off the edges\n         // with upsample factor of 4\n         z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);\n         if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc(\"outofmem\", \"Out of memory\"); }\n\n         r->hs      = z->img_h_max / z->img_comp[k].h;\n         r->vs      = z->img_v_max / z->img_comp[k].v;\n         r->ystep   = r->vs >> 1;\n         r->w_lores = (z->s->img_x + r->hs-1) / r->hs;\n         r->ypos    = 0;\n         r->line0   = r->line1 = z->img_comp[k].data;\n\n         if      (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;\n         else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;\n         else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;\n         else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;\n         else                               r->resample = stbi__resample_row_generic;\n      }\n\n      // can't error after this so, this is safe\n      output = (stbi_uc *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1);\n      if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc(\"outofmem\", \"Out of memory\"); }\n\n      // now go ahead and resample\n      for (j=0; j < z->s->img_y; ++j) {\n         stbi_uc *out = output + n * z->s->img_x * j;\n         for (k=0; k < decode_n; ++k) {\n            stbi__resample *r = &res_comp[k];\n            int y_bot = r->ystep >= (r->vs >> 1);\n            coutput[k] = r->resample(z->img_comp[k].linebuf,\n                                     y_bot ? r->line1 : r->line0,\n                                     y_bot ? r->line0 : r->line1,\n                                     r->w_lores, r->hs);\n            if (++r->ystep >= r->vs) {\n               r->ystep = 0;\n               r->line0 = r->line1;\n               if (++r->ypos < z->img_comp[k].y)\n                  r->line1 += z->img_comp[k].w2;\n            }\n         }\n         if (n >= 3) {\n            stbi_uc *y = coutput[0];\n            if (z->s->img_n == 3) {\n               z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);\n            } else\n               for (i=0; i < z->s->img_x; ++i) {\n                  out[0] = out[1] = out[2] = y[i];\n                  out[3] = 255; // not used if n==3\n                  out += n;\n               }\n         } else {\n            stbi_uc *y = coutput[0];\n            if (n == 1)\n               for (i=0; i < z->s->img_x; ++i) out[i] = y[i];\n            else\n               for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;\n         }\n      }\n      stbi__cleanup_jpeg(z);\n      *out_x = z->s->img_x;\n      *out_y = z->s->img_y;\n      if (comp) *comp  = z->s->img_n; // report original components, not output\n      return output;\n   }\n}\n\nstatic unsigned char *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__jpeg j;\n   j.s = s;\n   stbi__setup_jpeg(&j);\n   return load_jpeg_image(&j, x,y,comp,req_comp);\n}\n\nstatic int stbi__jpeg_test(stbi__context *s)\n{\n   int r;\n   stbi__jpeg j;\n   j.s = s;\n   stbi__setup_jpeg(&j);\n   r = stbi__decode_jpeg_header(&j, STBI__SCAN_type);\n   stbi__rewind(s);\n   return r;\n}\n\nstatic int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp)\n{\n   if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {\n      stbi__rewind( j->s );\n      return 0;\n   }\n   if (x) *x = j->s->img_x;\n   if (y) *y = j->s->img_y;\n   if (comp) *comp = j->s->img_n;\n   return 1;\n}\n\nstatic int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   stbi__jpeg j;\n   j.s = s;\n   return stbi__jpeg_info_raw(&j, x, y, comp);\n}\n#endif\n\n// public domain zlib decode    v0.2  Sean Barrett 2006-11-18\n//    simple implementation\n//      - all input must be provided in an upfront buffer\n//      - all output is written to a single output buffer (can malloc/realloc)\n//    performance\n//      - fast huffman\n\n#ifndef STBI_NO_ZLIB\n\n// fast-way is faster to check than jpeg huffman, but slow way is slower\n#define STBI__ZFAST_BITS  9 // accelerate all cases in default tables\n#define STBI__ZFAST_MASK  ((1 << STBI__ZFAST_BITS) - 1)\n\n// zlib-style huffman encoding\n// (jpegs packs from left, zlib from right, so can't share code)\ntypedef struct\n{\n   stbi__uint16 fast[1 << STBI__ZFAST_BITS];\n   stbi__uint16 firstcode[16];\n   int maxcode[17];\n   stbi__uint16 firstsymbol[16];\n   stbi_uc  size[288];\n   stbi__uint16 value[288];\n} stbi__zhuffman;\n\nstbi_inline static int stbi__bitreverse16(int n)\n{\n  n = ((n & 0xAAAA) >>  1) | ((n & 0x5555) << 1);\n  n = ((n & 0xCCCC) >>  2) | ((n & 0x3333) << 2);\n  n = ((n & 0xF0F0) >>  4) | ((n & 0x0F0F) << 4);\n  n = ((n & 0xFF00) >>  8) | ((n & 0x00FF) << 8);\n  return n;\n}\n\nstbi_inline static int stbi__bit_reverse(int v, int bits)\n{\n   STBI_ASSERT(bits <= 16);\n   // to bit reverse n bits, reverse 16 and shift\n   // e.g. 11 bits, bit reverse and shift away 5\n   return stbi__bitreverse16(v) >> (16-bits);\n}\n\nstatic int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num)\n{\n   int i,k=0;\n   int code, next_code[16], sizes[17];\n\n   // DEFLATE spec for generating codes\n   memset(sizes, 0, sizeof(sizes));\n   memset(z->fast, 0, sizeof(z->fast));\n   for (i=0; i < num; ++i)\n      ++sizes[sizelist[i]];\n   sizes[0] = 0;\n   for (i=1; i < 16; ++i)\n      STBI_ASSERT(sizes[i] <= (1 << i));\n   code = 0;\n   for (i=1; i < 16; ++i) {\n      next_code[i] = code;\n      z->firstcode[i] = (stbi__uint16) code;\n      z->firstsymbol[i] = (stbi__uint16) k;\n      code = (code + sizes[i]);\n      if (sizes[i])\n         if (code-1 >= (1 << i)) return stbi__err(\"bad codelengths\",\"Corrupt JPEG\");\n      z->maxcode[i] = code << (16-i); // preshift for inner loop\n      code <<= 1;\n      k += sizes[i];\n   }\n   z->maxcode[16] = 0x10000; // sentinel\n   for (i=0; i < num; ++i) {\n      int s = sizelist[i];\n      if (s) {\n         int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];\n         stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);\n         z->size [c] = (stbi_uc     ) s;\n         z->value[c] = (stbi__uint16) i;\n         if (s <= STBI__ZFAST_BITS) {\n            int k = stbi__bit_reverse(next_code[s],s);\n            while (k < (1 << STBI__ZFAST_BITS)) {\n               z->fast[k] = fastv;\n               k += (1 << s);\n            }\n         }\n         ++next_code[s];\n      }\n   }\n   return 1;\n}\n\n// zlib-from-memory implementation for PNG reading\n//    because PNG allows splitting the zlib stream arbitrarily,\n//    and it's annoying structurally to have PNG call ZLIB call PNG,\n//    we require PNG read all the IDATs and combine them into a single\n//    memory buffer\n\ntypedef struct\n{\n   stbi_uc *zbuffer, *zbuffer_end;\n   int num_bits;\n   stbi__uint32 code_buffer;\n\n   char *zout;\n   char *zout_start;\n   char *zout_end;\n   int   z_expandable;\n\n   stbi__zhuffman z_length, z_distance;\n} stbi__zbuf;\n\nstbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z)\n{\n   if (z->zbuffer >= z->zbuffer_end) return 0;\n   return *z->zbuffer++;\n}\n\nstatic void stbi__fill_bits(stbi__zbuf *z)\n{\n   do {\n      STBI_ASSERT(z->code_buffer < (1U << z->num_bits));\n      z->code_buffer |= stbi__zget8(z) << z->num_bits;\n      z->num_bits += 8;\n   } while (z->num_bits <= 24);\n}\n\nstbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n)\n{\n   unsigned int k;\n   if (z->num_bits < n) stbi__fill_bits(z);\n   k = z->code_buffer & ((1 << n) - 1);\n   z->code_buffer >>= n;\n   z->num_bits -= n;\n   return k;\n}\n\nstatic int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)\n{\n   int b,s,k;\n   // not resolved by fast table, so compute it the slow way\n   // use jpeg approach, which requires MSbits at top\n   k = stbi__bit_reverse(a->code_buffer, 16);\n   for (s=STBI__ZFAST_BITS+1; ; ++s)\n      if (k < z->maxcode[s])\n         break;\n   if (s == 16) return -1; // invalid code!\n   // code size is s, so:\n   b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];\n   STBI_ASSERT(z->size[b] == s);\n   a->code_buffer >>= s;\n   a->num_bits -= s;\n   return z->value[b];\n}\n\nstbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)\n{\n   int b,s;\n   if (a->num_bits < 16) stbi__fill_bits(a);\n   b = z->fast[a->code_buffer & STBI__ZFAST_MASK];\n   if (b) {\n      s = b >> 9;\n      a->code_buffer >>= s;\n      a->num_bits -= s;\n      return b & 511;\n   }\n   return stbi__zhuffman_decode_slowpath(a, z);\n}\n\nstatic int stbi__zexpand(stbi__zbuf *z, char *zout, int n)  // need to make room for n bytes\n{\n   char *q;\n   int cur, limit;\n   z->zout = zout;\n   if (!z->z_expandable) return stbi__err(\"output buffer limit\",\"Corrupt PNG\");\n   cur   = (int) (z->zout     - z->zout_start);\n   limit = (int) (z->zout_end - z->zout_start);\n   while (cur + n > limit)\n      limit *= 2;\n   q = (char *) STBI_REALLOC(z->zout_start, limit);\n   if (q == NULL) return stbi__err(\"outofmem\", \"Out of memory\");\n   z->zout_start = q;\n   z->zout       = q + cur;\n   z->zout_end   = q + limit;\n   return 1;\n}\n\nstatic int stbi__zlength_base[31] = {\n   3,4,5,6,7,8,9,10,11,13,\n   15,17,19,23,27,31,35,43,51,59,\n   67,83,99,115,131,163,195,227,258,0,0 };\n\nstatic int stbi__zlength_extra[31]=\n{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };\n\nstatic int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,\n257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};\n\nstatic int stbi__zdist_extra[32] =\n{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};\n\nstatic int stbi__parse_huffman_block(stbi__zbuf *a)\n{\n   char *zout = a->zout;\n   for(;;) {\n      int z = stbi__zhuffman_decode(a, &a->z_length);\n      if (z < 256) {\n         if (z < 0) return stbi__err(\"bad huffman code\",\"Corrupt PNG\"); // error in huffman codes\n         if (zout >= a->zout_end) {\n            if (!stbi__zexpand(a, zout, 1)) return 0;\n            zout = a->zout;\n         }\n         *zout++ = (char) z;\n      } else {\n         stbi_uc *p;\n         int len,dist;\n         if (z == 256) {\n            a->zout = zout;\n            return 1;\n         }\n         z -= 257;\n         len = stbi__zlength_base[z];\n         if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);\n         z = stbi__zhuffman_decode(a, &a->z_distance);\n         if (z < 0) return stbi__err(\"bad huffman code\",\"Corrupt PNG\");\n         dist = stbi__zdist_base[z];\n         if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);\n         if (zout - a->zout_start < dist) return stbi__err(\"bad dist\",\"Corrupt PNG\");\n         if (zout + len > a->zout_end) {\n            if (!stbi__zexpand(a, zout, len)) return 0;\n            zout = a->zout;\n         }\n         p = (stbi_uc *) (zout - dist);\n         if (dist == 1) { // run of one byte; common in images.\n            stbi_uc v = *p;\n            do *zout++ = v; while (--len);\n         } else {\n            do *zout++ = *p++; while (--len);\n         }\n      }\n   }\n}\n\nstatic int stbi__compute_huffman_codes(stbi__zbuf *a)\n{\n   static stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };\n   stbi__zhuffman z_codelength;\n   stbi_uc lencodes[286+32+137];//padding for maximum single op\n   stbi_uc codelength_sizes[19];\n   int i,n;\n\n   int hlit  = stbi__zreceive(a,5) + 257;\n   int hdist = stbi__zreceive(a,5) + 1;\n   int hclen = stbi__zreceive(a,4) + 4;\n\n   memset(codelength_sizes, 0, sizeof(codelength_sizes));\n   for (i=0; i < hclen; ++i) {\n      int s = stbi__zreceive(a,3);\n      codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;\n   }\n   if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;\n\n   n = 0;\n   while (n < hlit + hdist) {\n      int c = stbi__zhuffman_decode(a, &z_codelength);\n      STBI_ASSERT(c >= 0 && c < 19);\n      if (c < 16)\n         lencodes[n++] = (stbi_uc) c;\n      else if (c == 16) {\n         c = stbi__zreceive(a,2)+3;\n         memset(lencodes+n, lencodes[n-1], c);\n         n += c;\n      } else if (c == 17) {\n         c = stbi__zreceive(a,3)+3;\n         memset(lencodes+n, 0, c);\n         n += c;\n      } else {\n         STBI_ASSERT(c == 18);\n         c = stbi__zreceive(a,7)+11;\n         memset(lencodes+n, 0, c);\n         n += c;\n      }\n   }\n   if (n != hlit+hdist) return stbi__err(\"bad codelengths\",\"Corrupt PNG\");\n   if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;\n   if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0;\n   return 1;\n}\n\nstatic int stbi__parse_uncomperssed_block(stbi__zbuf *a)\n{\n   stbi_uc header[4];\n   int len,nlen,k;\n   if (a->num_bits & 7)\n      stbi__zreceive(a, a->num_bits & 7); // discard\n   // drain the bit-packed data into header\n   k = 0;\n   while (a->num_bits > 0) {\n      header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check\n      a->code_buffer >>= 8;\n      a->num_bits -= 8;\n   }\n   STBI_ASSERT(a->num_bits == 0);\n   // now fill header the normal way\n   while (k < 4)\n      header[k++] = stbi__zget8(a);\n   len  = header[1] * 256 + header[0];\n   nlen = header[3] * 256 + header[2];\n   if (nlen != (len ^ 0xffff)) return stbi__err(\"zlib corrupt\",\"Corrupt PNG\");\n   if (a->zbuffer + len > a->zbuffer_end) return stbi__err(\"read past buffer\",\"Corrupt PNG\");\n   if (a->zout + len > a->zout_end)\n      if (!stbi__zexpand(a, a->zout, len)) return 0;\n   memcpy(a->zout, a->zbuffer, len);\n   a->zbuffer += len;\n   a->zout += len;\n   return 1;\n}\n\nstatic int stbi__parse_zlib_header(stbi__zbuf *a)\n{\n   int cmf   = stbi__zget8(a);\n   int cm    = cmf & 15;\n   /* int cinfo = cmf >> 4; */\n   int flg   = stbi__zget8(a);\n   if ((cmf*256+flg) % 31 != 0) return stbi__err(\"bad zlib header\",\"Corrupt PNG\"); // zlib spec\n   if (flg & 32) return stbi__err(\"no preset dict\",\"Corrupt PNG\"); // preset dictionary not allowed in png\n   if (cm != 8) return stbi__err(\"bad compression\",\"Corrupt PNG\"); // DEFLATE required for png\n   // window = 1 << (8 + cinfo)... but who cares, we fully buffer output\n   return 1;\n}\n\n// @TODO: should statically initialize these for optimal thread safety\nstatic stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32];\nstatic void stbi__init_zdefaults(void)\n{\n   int i;   // use <= to match clearly with spec\n   for (i=0; i <= 143; ++i)     stbi__zdefault_length[i]   = 8;\n   for (   ; i <= 255; ++i)     stbi__zdefault_length[i]   = 9;\n   for (   ; i <= 279; ++i)     stbi__zdefault_length[i]   = 7;\n   for (   ; i <= 287; ++i)     stbi__zdefault_length[i]   = 8;\n\n   for (i=0; i <=  31; ++i)     stbi__zdefault_distance[i] = 5;\n}\n\nstatic int stbi__parse_zlib(stbi__zbuf *a, int parse_header)\n{\n   int final, type;\n   if (parse_header)\n      if (!stbi__parse_zlib_header(a)) return 0;\n   a->num_bits = 0;\n   a->code_buffer = 0;\n   do {\n      final = stbi__zreceive(a,1);\n      type = stbi__zreceive(a,2);\n      if (type == 0) {\n         if (!stbi__parse_uncomperssed_block(a)) return 0;\n      } else if (type == 3) {\n         return 0;\n      } else {\n         if (type == 1) {\n            // use fixed code lengths\n            if (!stbi__zdefault_distance[31]) stbi__init_zdefaults();\n            if (!stbi__zbuild_huffman(&a->z_length  , stbi__zdefault_length  , 288)) return 0;\n            if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance,  32)) return 0;\n         } else {\n            if (!stbi__compute_huffman_codes(a)) return 0;\n         }\n         if (!stbi__parse_huffman_block(a)) return 0;\n      }\n   } while (!final);\n   return 1;\n}\n\nstatic int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header)\n{\n   a->zout_start = obuf;\n   a->zout       = obuf;\n   a->zout_end   = obuf + olen;\n   a->z_expandable = exp;\n\n   return stbi__parse_zlib(a, parse_header);\n}\n\nSTBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)\n{\n   stbi__zbuf a;\n   char *p = (char *) stbi__malloc(initial_size);\n   if (p == NULL) return NULL;\n   a.zbuffer = (stbi_uc *) buffer;\n   a.zbuffer_end = (stbi_uc *) buffer + len;\n   if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {\n      if (outlen) *outlen = (int) (a.zout - a.zout_start);\n      return a.zout_start;\n   } else {\n      STBI_FREE(a.zout_start);\n      return NULL;\n   }\n}\n\nSTBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen)\n{\n   return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);\n}\n\nSTBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)\n{\n   stbi__zbuf a;\n   char *p = (char *) stbi__malloc(initial_size);\n   if (p == NULL) return NULL;\n   a.zbuffer = (stbi_uc *) buffer;\n   a.zbuffer_end = (stbi_uc *) buffer + len;\n   if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {\n      if (outlen) *outlen = (int) (a.zout - a.zout_start);\n      return a.zout_start;\n   } else {\n      STBI_FREE(a.zout_start);\n      return NULL;\n   }\n}\n\nSTBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen)\n{\n   stbi__zbuf a;\n   a.zbuffer = (stbi_uc *) ibuffer;\n   a.zbuffer_end = (stbi_uc *) ibuffer + ilen;\n   if (stbi__do_zlib(&a, obuffer, olen, 0, 1))\n      return (int) (a.zout - a.zout_start);\n   else\n      return -1;\n}\n\nSTBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen)\n{\n   stbi__zbuf a;\n   char *p = (char *) stbi__malloc(16384);\n   if (p == NULL) return NULL;\n   a.zbuffer = (stbi_uc *) buffer;\n   a.zbuffer_end = (stbi_uc *) buffer+len;\n   if (stbi__do_zlib(&a, p, 16384, 1, 0)) {\n      if (outlen) *outlen = (int) (a.zout - a.zout_start);\n      return a.zout_start;\n   } else {\n      STBI_FREE(a.zout_start);\n      return NULL;\n   }\n}\n\nSTBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)\n{\n   stbi__zbuf a;\n   a.zbuffer = (stbi_uc *) ibuffer;\n   a.zbuffer_end = (stbi_uc *) ibuffer + ilen;\n   if (stbi__do_zlib(&a, obuffer, olen, 0, 0))\n      return (int) (a.zout - a.zout_start);\n   else\n      return -1;\n}\n#endif\n\n// public domain \"baseline\" PNG decoder   v0.10  Sean Barrett 2006-11-18\n//    simple implementation\n//      - only 8-bit samples\n//      - no CRC checking\n//      - allocates lots of intermediate memory\n//        - avoids problem of streaming data between subsystems\n//        - avoids explicit window management\n//    performance\n//      - uses stb_zlib, a PD zlib implementation with fast huffman decoding\n\n#ifndef STBI_NO_PNG\ntypedef struct\n{\n   stbi__uint32 length;\n   stbi__uint32 type;\n} stbi__pngchunk;\n\nstatic stbi__pngchunk stbi__get_chunk_header(stbi__context *s)\n{\n   stbi__pngchunk c;\n   c.length = stbi__get32be(s);\n   c.type   = stbi__get32be(s);\n   return c;\n}\n\nstatic int stbi__check_png_header(stbi__context *s)\n{\n   static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };\n   int i;\n   for (i=0; i < 8; ++i)\n      if (stbi__get8(s) != png_sig[i]) return stbi__err(\"bad png sig\",\"Not a PNG\");\n   return 1;\n}\n\ntypedef struct\n{\n   stbi__context *s;\n   stbi_uc *idata, *expanded, *out;\n} stbi__png;\n\n\nenum {\n   STBI__F_none=0,\n   STBI__F_sub=1,\n   STBI__F_up=2,\n   STBI__F_avg=3,\n   STBI__F_paeth=4,\n   // synthetic filters used for first scanline to avoid needing a dummy row of 0s\n   STBI__F_avg_first,\n   STBI__F_paeth_first\n};\n\nstatic stbi_uc first_row_filter[5] =\n{\n   STBI__F_none,\n   STBI__F_sub,\n   STBI__F_none,\n   STBI__F_avg_first,\n   STBI__F_paeth_first\n};\n\nstatic int stbi__paeth(int a, int b, int c)\n{\n   int p = a + b - c;\n   int pa = abs(p-a);\n   int pb = abs(p-b);\n   int pc = abs(p-c);\n   if (pa <= pb && pa <= pc) return a;\n   if (pb <= pc) return b;\n   return c;\n}\n\nstatic stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };\n\n// create the png data from post-deflated data\nstatic int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color)\n{\n   stbi__context *s = a->s;\n   stbi__uint32 i,j,stride = x*out_n;\n   stbi__uint32 img_len, img_width_bytes;\n   int k;\n   int img_n = s->img_n; // copy it into a local for later\n\n   STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);\n   a->out = (stbi_uc *) stbi__malloc(x * y * out_n); // extra bytes to write off the end into\n   if (!a->out) return stbi__err(\"outofmem\", \"Out of memory\");\n\n   img_width_bytes = (((img_n * x * depth) + 7) >> 3);\n   img_len = (img_width_bytes + 1) * y;\n   if (s->img_x == x && s->img_y == y) {\n      if (raw_len != img_len) return stbi__err(\"not enough pixels\",\"Corrupt PNG\");\n   } else { // interlaced:\n      if (raw_len < img_len) return stbi__err(\"not enough pixels\",\"Corrupt PNG\");\n   }\n\n   for (j=0; j < y; ++j) {\n      stbi_uc *cur = a->out + stride*j;\n      stbi_uc *prior = cur - stride;\n      int filter = *raw++;\n      int filter_bytes = img_n;\n      int width = x;\n      if (filter > 4)\n         return stbi__err(\"invalid filter\",\"Corrupt PNG\");\n\n      if (depth < 8) {\n         STBI_ASSERT(img_width_bytes <= x);\n         cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place\n         filter_bytes = 1;\n         width = img_width_bytes;\n      }\n\n      // if first row, use special filter that doesn't sample previous row\n      if (j == 0) filter = first_row_filter[filter];\n\n      // handle first byte explicitly\n      for (k=0; k < filter_bytes; ++k) {\n         switch (filter) {\n            case STBI__F_none       : cur[k] = raw[k]; break;\n            case STBI__F_sub        : cur[k] = raw[k]; break;\n            case STBI__F_up         : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;\n            case STBI__F_avg        : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break;\n            case STBI__F_paeth      : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break;\n            case STBI__F_avg_first  : cur[k] = raw[k]; break;\n            case STBI__F_paeth_first: cur[k] = raw[k]; break;\n         }\n      }\n\n      if (depth == 8) {\n         if (img_n != out_n)\n            cur[img_n] = 255; // first pixel\n         raw += img_n;\n         cur += out_n;\n         prior += out_n;\n      } else {\n         raw += 1;\n         cur += 1;\n         prior += 1;\n      }\n\n      // this is a little gross, so that we don't switch per-pixel or per-component\n      if (depth < 8 || img_n == out_n) {\n         int nk = (width - 1)*img_n;\n         #define CASE(f) \\\n             case f:     \\\n                for (k=0; k < nk; ++k)\n         switch (filter) {\n            // \"none\" filter turns into a memcpy here; make that explicit.\n            case STBI__F_none:         memcpy(cur, raw, nk); break;\n            CASE(STBI__F_sub)          cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); break;\n            CASE(STBI__F_up)           cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;\n            CASE(STBI__F_avg)          cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); break;\n            CASE(STBI__F_paeth)        cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); break;\n            CASE(STBI__F_avg_first)    cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); break;\n            CASE(STBI__F_paeth_first)  cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); break;\n         }\n         #undef CASE\n         raw += nk;\n      } else {\n         STBI_ASSERT(img_n+1 == out_n);\n         #define CASE(f) \\\n             case f:     \\\n                for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \\\n                   for (k=0; k < img_n; ++k)\n         switch (filter) {\n            CASE(STBI__F_none)         cur[k] = raw[k]; break;\n            CASE(STBI__F_sub)          cur[k] = STBI__BYTECAST(raw[k] + cur[k-out_n]); break;\n            CASE(STBI__F_up)           cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;\n            CASE(STBI__F_avg)          cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-out_n])>>1)); break;\n            CASE(STBI__F_paeth)        cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],prior[k],prior[k-out_n])); break;\n            CASE(STBI__F_avg_first)    cur[k] = STBI__BYTECAST(raw[k] + (cur[k-out_n] >> 1)); break;\n            CASE(STBI__F_paeth_first)  cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],0,0)); break;\n         }\n         #undef CASE\n      }\n   }\n\n   // we make a separate pass to expand bits to pixels; for performance,\n   // this could run two scanlines behind the above code, so it won't\n   // intefere with filtering but will still be in the cache.\n   if (depth < 8) {\n      for (j=0; j < y; ++j) {\n         stbi_uc *cur = a->out + stride*j;\n         stbi_uc *in  = a->out + stride*j + x*out_n - img_width_bytes;\n         // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit\n         // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop\n         stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range\n\n         // note that the final byte might overshoot and write more data than desired.\n         // we can allocate enough data that this never writes out of memory, but it\n         // could also overwrite the next scanline. can it overwrite non-empty data\n         // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel.\n         // so we need to explicitly clamp the final ones\n\n         if (depth == 4) {\n            for (k=x*img_n; k >= 2; k-=2, ++in) {\n               *cur++ = scale * ((*in >> 4)       );\n               *cur++ = scale * ((*in     ) & 0x0f);\n            }\n            if (k > 0) *cur++ = scale * ((*in >> 4)       );\n         } else if (depth == 2) {\n            for (k=x*img_n; k >= 4; k-=4, ++in) {\n               *cur++ = scale * ((*in >> 6)       );\n               *cur++ = scale * ((*in >> 4) & 0x03);\n               *cur++ = scale * ((*in >> 2) & 0x03);\n               *cur++ = scale * ((*in     ) & 0x03);\n            }\n            if (k > 0) *cur++ = scale * ((*in >> 6)       );\n            if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);\n            if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);\n         } else if (depth == 1) {\n            for (k=x*img_n; k >= 8; k-=8, ++in) {\n               *cur++ = scale * ((*in >> 7)       );\n               *cur++ = scale * ((*in >> 6) & 0x01);\n               *cur++ = scale * ((*in >> 5) & 0x01);\n               *cur++ = scale * ((*in >> 4) & 0x01);\n               *cur++ = scale * ((*in >> 3) & 0x01);\n               *cur++ = scale * ((*in >> 2) & 0x01);\n               *cur++ = scale * ((*in >> 1) & 0x01);\n               *cur++ = scale * ((*in     ) & 0x01);\n            }\n            if (k > 0) *cur++ = scale * ((*in >> 7)       );\n            if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);\n            if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);\n            if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);\n            if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);\n            if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);\n            if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);\n         }\n         if (img_n != out_n) {\n            // insert alpha = 255\n            stbi_uc *cur = a->out + stride*j;\n            int i;\n            if (img_n == 1) {\n               for (i=x-1; i >= 0; --i) {\n                  cur[i*2+1] = 255;\n                  cur[i*2+0] = cur[i];\n               }\n            } else {\n               STBI_ASSERT(img_n == 3);\n               for (i=x-1; i >= 0; --i) {\n                  cur[i*4+3] = 255;\n                  cur[i*4+2] = cur[i*3+2];\n                  cur[i*4+1] = cur[i*3+1];\n                  cur[i*4+0] = cur[i*3+0];\n               }\n            }\n         }\n      }\n   }\n\n   return 1;\n}\n\nstatic int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced)\n{\n   stbi_uc *final;\n   int p;\n   if (!interlaced)\n      return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);\n\n   // de-interlacing\n   final = (stbi_uc *) stbi__malloc(a->s->img_x * a->s->img_y * out_n);\n   for (p=0; p < 7; ++p) {\n      int xorig[] = { 0,4,0,2,0,1,0 };\n      int yorig[] = { 0,0,4,0,2,0,1 };\n      int xspc[]  = { 8,8,4,4,2,2,1 };\n      int yspc[]  = { 8,8,8,4,4,2,2 };\n      int i,j,x,y;\n      // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1\n      x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];\n      y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];\n      if (x && y) {\n         stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;\n         if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {\n            STBI_FREE(final);\n            return 0;\n         }\n         for (j=0; j < y; ++j) {\n            for (i=0; i < x; ++i) {\n               int out_y = j*yspc[p]+yorig[p];\n               int out_x = i*xspc[p]+xorig[p];\n               memcpy(final + out_y*a->s->img_x*out_n + out_x*out_n,\n                      a->out + (j*x+i)*out_n, out_n);\n            }\n         }\n         STBI_FREE(a->out);\n         image_data += img_len;\n         image_data_len -= img_len;\n      }\n   }\n   a->out = final;\n\n   return 1;\n}\n\nstatic int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n)\n{\n   stbi__context *s = z->s;\n   stbi__uint32 i, pixel_count = s->img_x * s->img_y;\n   stbi_uc *p = z->out;\n\n   // compute color-based transparency, assuming we've\n   // already got 255 as the alpha value in the output\n   STBI_ASSERT(out_n == 2 || out_n == 4);\n\n   if (out_n == 2) {\n      for (i=0; i < pixel_count; ++i) {\n         p[1] = (p[0] == tc[0] ? 0 : 255);\n         p += 2;\n      }\n   } else {\n      for (i=0; i < pixel_count; ++i) {\n         if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])\n            p[3] = 0;\n         p += 4;\n      }\n   }\n   return 1;\n}\n\nstatic int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n)\n{\n   stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;\n   stbi_uc *p, *temp_out, *orig = a->out;\n\n   p = (stbi_uc *) stbi__malloc(pixel_count * pal_img_n);\n   if (p == NULL) return stbi__err(\"outofmem\", \"Out of memory\");\n\n   // between here and free(out) below, exitting would leak\n   temp_out = p;\n\n   if (pal_img_n == 3) {\n      for (i=0; i < pixel_count; ++i) {\n         int n = orig[i]*4;\n         p[0] = palette[n  ];\n         p[1] = palette[n+1];\n         p[2] = palette[n+2];\n         p += 3;\n      }\n   } else {\n      for (i=0; i < pixel_count; ++i) {\n         int n = orig[i]*4;\n         p[0] = palette[n  ];\n         p[1] = palette[n+1];\n         p[2] = palette[n+2];\n         p[3] = palette[n+3];\n         p += 4;\n      }\n   }\n   STBI_FREE(a->out);\n   a->out = temp_out;\n\n   STBI_NOTUSED(len);\n\n   return 1;\n}\n\nstatic int stbi__unpremultiply_on_load = 0;\nstatic int stbi__de_iphone_flag = 0;\n\nSTBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)\n{\n   stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;\n}\n\nSTBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)\n{\n   stbi__de_iphone_flag = flag_true_if_should_convert;\n}\n\nstatic void stbi__de_iphone(stbi__png *z)\n{\n   stbi__context *s = z->s;\n   stbi__uint32 i, pixel_count = s->img_x * s->img_y;\n   stbi_uc *p = z->out;\n\n   if (s->img_out_n == 3) {  // convert bgr to rgb\n      for (i=0; i < pixel_count; ++i) {\n         stbi_uc t = p[0];\n         p[0] = p[2];\n         p[2] = t;\n         p += 3;\n      }\n   } else {\n      STBI_ASSERT(s->img_out_n == 4);\n      if (stbi__unpremultiply_on_load) {\n         // convert bgr to rgb and unpremultiply\n         for (i=0; i < pixel_count; ++i) {\n            stbi_uc a = p[3];\n            stbi_uc t = p[0];\n            if (a) {\n               p[0] = p[2] * 255 / a;\n               p[1] = p[1] * 255 / a;\n               p[2] =  t   * 255 / a;\n            } else {\n               p[0] = p[2];\n               p[2] = t;\n            }\n            p += 4;\n         }\n      } else {\n         // convert bgr to rgb\n         for (i=0; i < pixel_count; ++i) {\n            stbi_uc t = p[0];\n            p[0] = p[2];\n            p[2] = t;\n            p += 4;\n         }\n      }\n   }\n}\n\n#define STBI__PNG_TYPE(a,b,c,d)  (((a) << 24) + ((b) << 16) + ((c) << 8) + (d))\n\nstatic int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)\n{\n   stbi_uc palette[1024], pal_img_n=0;\n   stbi_uc has_trans=0, tc[3];\n   stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;\n   int first=1,k,interlace=0, color=0, depth=0, is_iphone=0;\n   stbi__context *s = z->s;\n\n   z->expanded = NULL;\n   z->idata = NULL;\n   z->out = NULL;\n\n   if (!stbi__check_png_header(s)) return 0;\n\n   if (scan == STBI__SCAN_type) return 1;\n\n   for (;;) {\n      stbi__pngchunk c = stbi__get_chunk_header(s);\n      switch (c.type) {\n         case STBI__PNG_TYPE('C','g','B','I'):\n            is_iphone = 1;\n            stbi__skip(s, c.length);\n            break;\n         case STBI__PNG_TYPE('I','H','D','R'): {\n            int comp,filter;\n            if (!first) return stbi__err(\"multiple IHDR\",\"Corrupt PNG\");\n            first = 0;\n            if (c.length != 13) return stbi__err(\"bad IHDR len\",\"Corrupt PNG\");\n            s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err(\"too large\",\"Very large image (corrupt?)\");\n            s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err(\"too large\",\"Very large image (corrupt?)\");\n            depth = stbi__get8(s);  if (depth != 1 && depth != 2 && depth != 4 && depth != 8)  return stbi__err(\"1/2/4/8-bit only\",\"PNG not supported: 1/2/4/8-bit only\");\n            color = stbi__get8(s);  if (color > 6)         return stbi__err(\"bad ctype\",\"Corrupt PNG\");\n            if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err(\"bad ctype\",\"Corrupt PNG\");\n            comp  = stbi__get8(s);  if (comp) return stbi__err(\"bad comp method\",\"Corrupt PNG\");\n            filter= stbi__get8(s);  if (filter) return stbi__err(\"bad filter method\",\"Corrupt PNG\");\n            interlace = stbi__get8(s); if (interlace>1) return stbi__err(\"bad interlace method\",\"Corrupt PNG\");\n            if (!s->img_x || !s->img_y) return stbi__err(\"0-pixel image\",\"Corrupt PNG\");\n            if (!pal_img_n) {\n               s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);\n               if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err(\"too large\", \"Image too large to decode\");\n               if (scan == STBI__SCAN_header) return 1;\n            } else {\n               // if paletted, then pal_n is our final components, and\n               // img_n is # components to decompress/filter.\n               s->img_n = 1;\n               if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err(\"too large\",\"Corrupt PNG\");\n               // if SCAN_header, have to scan to see if we have a tRNS\n            }\n            break;\n         }\n\n         case STBI__PNG_TYPE('P','L','T','E'):  {\n            if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n            if (c.length > 256*3) return stbi__err(\"invalid PLTE\",\"Corrupt PNG\");\n            pal_len = c.length / 3;\n            if (pal_len * 3 != c.length) return stbi__err(\"invalid PLTE\",\"Corrupt PNG\");\n            for (i=0; i < pal_len; ++i) {\n               palette[i*4+0] = stbi__get8(s);\n               palette[i*4+1] = stbi__get8(s);\n               palette[i*4+2] = stbi__get8(s);\n               palette[i*4+3] = 255;\n            }\n            break;\n         }\n\n         case STBI__PNG_TYPE('t','R','N','S'): {\n            if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n            if (z->idata) return stbi__err(\"tRNS after IDAT\",\"Corrupt PNG\");\n            if (pal_img_n) {\n               if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; }\n               if (pal_len == 0) return stbi__err(\"tRNS before PLTE\",\"Corrupt PNG\");\n               if (c.length > pal_len) return stbi__err(\"bad tRNS len\",\"Corrupt PNG\");\n               pal_img_n = 4;\n               for (i=0; i < c.length; ++i)\n                  palette[i*4+3] = stbi__get8(s);\n            } else {\n               if (!(s->img_n & 1)) return stbi__err(\"tRNS with alpha\",\"Corrupt PNG\");\n               if (c.length != (stbi__uint32) s->img_n*2) return stbi__err(\"bad tRNS len\",\"Corrupt PNG\");\n               has_trans = 1;\n               for (k=0; k < s->img_n; ++k)\n                  tc[k] = (stbi_uc) (stbi__get16be(s) & 255) * stbi__depth_scale_table[depth]; // non 8-bit images will be larger\n            }\n            break;\n         }\n\n         case STBI__PNG_TYPE('I','D','A','T'): {\n            if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n            if (pal_img_n && !pal_len) return stbi__err(\"no PLTE\",\"Corrupt PNG\");\n            if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; }\n            if (ioff + c.length > idata_limit) {\n               stbi_uc *p;\n               if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;\n               while (ioff + c.length > idata_limit)\n                  idata_limit *= 2;\n               p = (stbi_uc *) STBI_REALLOC(z->idata, idata_limit); if (p == NULL) return stbi__err(\"outofmem\", \"Out of memory\");\n               z->idata = p;\n            }\n            if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err(\"outofdata\",\"Corrupt PNG\");\n            ioff += c.length;\n            break;\n         }\n\n         case STBI__PNG_TYPE('I','E','N','D'): {\n            stbi__uint32 raw_len, bpl;\n            if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n            if (scan != STBI__SCAN_load) return 1;\n            if (z->idata == NULL) return stbi__err(\"no IDAT\",\"Corrupt PNG\");\n            // initial guess for decoded data size to avoid unnecessary reallocs\n            bpl = (s->img_x * depth + 7) / 8; // bytes per line, per component\n            raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */;\n            z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone);\n            if (z->expanded == NULL) return 0; // zlib should set error\n            STBI_FREE(z->idata); z->idata = NULL;\n            if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)\n               s->img_out_n = s->img_n+1;\n            else\n               s->img_out_n = s->img_n;\n            if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, depth, color, interlace)) return 0;\n            if (has_trans)\n               if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0;\n            if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)\n               stbi__de_iphone(z);\n            if (pal_img_n) {\n               // pal_img_n == 3 or 4\n               s->img_n = pal_img_n; // record the actual colors we had\n               s->img_out_n = pal_img_n;\n               if (req_comp >= 3) s->img_out_n = req_comp;\n               if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))\n                  return 0;\n            }\n            STBI_FREE(z->expanded); z->expanded = NULL;\n            return 1;\n         }\n\n         default:\n            // if critical, fail\n            if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n            if ((c.type & (1 << 29)) == 0) {\n               #ifndef STBI_NO_FAILURE_STRINGS\n               // not threadsafe\n               static char invalid_chunk[] = \"XXXX PNG chunk not known\";\n               invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);\n               invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);\n               invalid_chunk[2] = STBI__BYTECAST(c.type >>  8);\n               invalid_chunk[3] = STBI__BYTECAST(c.type >>  0);\n               #endif\n               return stbi__err(invalid_chunk, \"PNG not supported: unknown PNG chunk type\");\n            }\n            stbi__skip(s, c.length);\n            break;\n      }\n      // end of PNG chunk, read and skip CRC\n      stbi__get32be(s);\n   }\n}\n\nstatic unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp)\n{\n   unsigned char *result=NULL;\n   if (req_comp < 0 || req_comp > 4) return stbi__errpuc(\"bad req_comp\", \"Internal error\");\n   if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {\n      result = p->out;\n      p->out = NULL;\n      if (req_comp && req_comp != p->s->img_out_n) {\n         result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);\n         p->s->img_out_n = req_comp;\n         if (result == NULL) return result;\n      }\n      *x = p->s->img_x;\n      *y = p->s->img_y;\n      if (n) *n = p->s->img_out_n;\n   }\n   STBI_FREE(p->out);      p->out      = NULL;\n   STBI_FREE(p->expanded); p->expanded = NULL;\n   STBI_FREE(p->idata);    p->idata    = NULL;\n\n   return result;\n}\n\nstatic unsigned char *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__png p;\n   p.s = s;\n   return stbi__do_png(&p, x,y,comp,req_comp);\n}\n\nstatic int stbi__png_test(stbi__context *s)\n{\n   int r;\n   r = stbi__check_png_header(s);\n   stbi__rewind(s);\n   return r;\n}\n\nstatic int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp)\n{\n   if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {\n      stbi__rewind( p->s );\n      return 0;\n   }\n   if (x) *x = p->s->img_x;\n   if (y) *y = p->s->img_y;\n   if (comp) *comp = p->s->img_n;\n   return 1;\n}\n\nstatic int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   stbi__png p;\n   p.s = s;\n   return stbi__png_info_raw(&p, x, y, comp);\n}\n#endif\n\n// Microsoft/Windows BMP image\n\n#ifndef STBI_NO_BMP\nstatic int stbi__bmp_test_raw(stbi__context *s)\n{\n   int r;\n   int sz;\n   if (stbi__get8(s) != 'B') return 0;\n   if (stbi__get8(s) != 'M') return 0;\n   stbi__get32le(s); // discard filesize\n   stbi__get16le(s); // discard reserved\n   stbi__get16le(s); // discard reserved\n   stbi__get32le(s); // discard data offset\n   sz = stbi__get32le(s);\n   r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);\n   return r;\n}\n\nstatic int stbi__bmp_test(stbi__context *s)\n{\n   int r = stbi__bmp_test_raw(s);\n   stbi__rewind(s);\n   return r;\n}\n\n\n// returns 0..31 for the highest set bit\nstatic int stbi__high_bit(unsigned int z)\n{\n   int n=0;\n   if (z == 0) return -1;\n   if (z >= 0x10000) n += 16, z >>= 16;\n   if (z >= 0x00100) n +=  8, z >>=  8;\n   if (z >= 0x00010) n +=  4, z >>=  4;\n   if (z >= 0x00004) n +=  2, z >>=  2;\n   if (z >= 0x00002) n +=  1, z >>=  1;\n   return n;\n}\n\nstatic int stbi__bitcount(unsigned int a)\n{\n   a = (a & 0x55555555) + ((a >>  1) & 0x55555555); // max 2\n   a = (a & 0x33333333) + ((a >>  2) & 0x33333333); // max 4\n   a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits\n   a = (a + (a >> 8)); // max 16 per 8 bits\n   a = (a + (a >> 16)); // max 32 per 8 bits\n   return a & 0xff;\n}\n\nstatic int stbi__shiftsigned(int v, int shift, int bits)\n{\n   int result;\n   int z=0;\n\n   if (shift < 0) v <<= -shift;\n   else v >>= shift;\n   result = v;\n\n   z = bits;\n   while (z < 8) {\n      result += v >> z;\n      z += bits;\n   }\n   return result;\n}\n\nstatic stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   stbi_uc *out;\n   unsigned int mr=0,mg=0,mb=0,ma=0, fake_a=0;\n   stbi_uc pal[256][4];\n   int psize=0,i,j,compress=0,width;\n   int bpp, flip_vertically, pad, target, offset, hsz;\n   if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc(\"not BMP\", \"Corrupt BMP\");\n   stbi__get32le(s); // discard filesize\n   stbi__get16le(s); // discard reserved\n   stbi__get16le(s); // discard reserved\n   offset = stbi__get32le(s);\n   hsz = stbi__get32le(s);\n   if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc(\"unknown BMP\", \"BMP type not supported: unknown\");\n   if (hsz == 12) {\n      s->img_x = stbi__get16le(s);\n      s->img_y = stbi__get16le(s);\n   } else {\n      s->img_x = stbi__get32le(s);\n      s->img_y = stbi__get32le(s);\n   }\n   if (stbi__get16le(s) != 1) return stbi__errpuc(\"bad BMP\", \"bad BMP\");\n   bpp = stbi__get16le(s);\n   if (bpp == 1) return stbi__errpuc(\"monochrome\", \"BMP type not supported: 1-bit\");\n   flip_vertically = ((int) s->img_y) > 0;\n   s->img_y = abs((int) s->img_y);\n   if (hsz == 12) {\n      if (bpp < 24)\n         psize = (offset - 14 - 24) / 3;\n   } else {\n      compress = stbi__get32le(s);\n      if (compress == 1 || compress == 2) return stbi__errpuc(\"BMP RLE\", \"BMP type not supported: RLE\");\n      stbi__get32le(s); // discard sizeof\n      stbi__get32le(s); // discard hres\n      stbi__get32le(s); // discard vres\n      stbi__get32le(s); // discard colorsused\n      stbi__get32le(s); // discard max important\n      if (hsz == 40 || hsz == 56) {\n         if (hsz == 56) {\n            stbi__get32le(s);\n            stbi__get32le(s);\n            stbi__get32le(s);\n            stbi__get32le(s);\n         }\n         if (bpp == 16 || bpp == 32) {\n            mr = mg = mb = 0;\n            if (compress == 0) {\n               if (bpp == 32) {\n                  mr = 0xffu << 16;\n                  mg = 0xffu <<  8;\n                  mb = 0xffu <<  0;\n                  ma = 0xffu << 24;\n                  fake_a = 1; // @TODO: check for cases like alpha value is all 0 and switch it to 255\n                  STBI_NOTUSED(fake_a);\n               } else {\n                  mr = 31u << 10;\n                  mg = 31u <<  5;\n                  mb = 31u <<  0;\n               }\n            } else if (compress == 3) {\n               mr = stbi__get32le(s);\n               mg = stbi__get32le(s);\n               mb = stbi__get32le(s);\n               // not documented, but generated by photoshop and handled by mspaint\n               if (mr == mg && mg == mb) {\n                  // ?!?!?\n                  return stbi__errpuc(\"bad BMP\", \"bad BMP\");\n               }\n            } else\n               return stbi__errpuc(\"bad BMP\", \"bad BMP\");\n         }\n      } else {\n         STBI_ASSERT(hsz == 108 || hsz == 124);\n         mr = stbi__get32le(s);\n         mg = stbi__get32le(s);\n         mb = stbi__get32le(s);\n         ma = stbi__get32le(s);\n         stbi__get32le(s); // discard color space\n         for (i=0; i < 12; ++i)\n            stbi__get32le(s); // discard color space parameters\n         if (hsz == 124) {\n            stbi__get32le(s); // discard rendering intent\n            stbi__get32le(s); // discard offset of profile data\n            stbi__get32le(s); // discard size of profile data\n            stbi__get32le(s); // discard reserved\n         }\n      }\n      if (bpp < 16)\n         psize = (offset - 14 - hsz) >> 2;\n   }\n   s->img_n = ma ? 4 : 3;\n   if (req_comp && req_comp >= 3) // we can directly decode 3 or 4\n      target = req_comp;\n   else\n      target = s->img_n; // if they want monochrome, we'll post-convert\n   out = (stbi_uc *) stbi__malloc(target * s->img_x * s->img_y);\n   if (!out) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n   if (bpp < 16) {\n      int z=0;\n      if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc(\"invalid\", \"Corrupt BMP\"); }\n      for (i=0; i < psize; ++i) {\n         pal[i][2] = stbi__get8(s);\n         pal[i][1] = stbi__get8(s);\n         pal[i][0] = stbi__get8(s);\n         if (hsz != 12) stbi__get8(s);\n         pal[i][3] = 255;\n      }\n      stbi__skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4));\n      if (bpp == 4) width = (s->img_x + 1) >> 1;\n      else if (bpp == 8) width = s->img_x;\n      else { STBI_FREE(out); return stbi__errpuc(\"bad bpp\", \"Corrupt BMP\"); }\n      pad = (-width)&3;\n      for (j=0; j < (int) s->img_y; ++j) {\n         for (i=0; i < (int) s->img_x; i += 2) {\n            int v=stbi__get8(s),v2=0;\n            if (bpp == 4) {\n               v2 = v & 15;\n               v >>= 4;\n            }\n            out[z++] = pal[v][0];\n            out[z++] = pal[v][1];\n            out[z++] = pal[v][2];\n            if (target == 4) out[z++] = 255;\n            if (i+1 == (int) s->img_x) break;\n            v = (bpp == 8) ? stbi__get8(s) : v2;\n            out[z++] = pal[v][0];\n            out[z++] = pal[v][1];\n            out[z++] = pal[v][2];\n            if (target == 4) out[z++] = 255;\n         }\n         stbi__skip(s, pad);\n      }\n   } else {\n      int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;\n      int z = 0;\n      int easy=0;\n      stbi__skip(s, offset - 14 - hsz);\n      if (bpp == 24) width = 3 * s->img_x;\n      else if (bpp == 16) width = 2*s->img_x;\n      else /* bpp = 32 and pad = 0 */ width=0;\n      pad = (-width) & 3;\n      if (bpp == 24) {\n         easy = 1;\n      } else if (bpp == 32) {\n         if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)\n            easy = 2;\n      }\n      if (!easy) {\n         if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc(\"bad masks\", \"Corrupt BMP\"); }\n         // right shift amt to put high bit in position #7\n         rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);\n         gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);\n         bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);\n         ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);\n      }\n      for (j=0; j < (int) s->img_y; ++j) {\n         if (easy) {\n            for (i=0; i < (int) s->img_x; ++i) {\n               unsigned char a;\n               out[z+2] = stbi__get8(s);\n               out[z+1] = stbi__get8(s);\n               out[z+0] = stbi__get8(s);\n               z += 3;\n               a = (easy == 2 ? stbi__get8(s) : 255);\n               if (target == 4) out[z++] = a;\n            }\n         } else {\n            for (i=0; i < (int) s->img_x; ++i) {\n               stbi__uint32 v = (stbi__uint32) (bpp == 16 ? stbi__get16le(s) : stbi__get32le(s));\n               int a;\n               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));\n               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));\n               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));\n               a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);\n               if (target == 4) out[z++] = STBI__BYTECAST(a);\n            }\n         }\n         stbi__skip(s, pad);\n      }\n   }\n   if (flip_vertically) {\n      stbi_uc t;\n      for (j=0; j < (int) s->img_y>>1; ++j) {\n         stbi_uc *p1 = out +      j     *s->img_x*target;\n         stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;\n         for (i=0; i < (int) s->img_x*target; ++i) {\n            t = p1[i], p1[i] = p2[i], p2[i] = t;\n         }\n      }\n   }\n\n   if (req_comp && req_comp != target) {\n      out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);\n      if (out == NULL) return out; // stbi__convert_format frees input on failure\n   }\n\n   *x = s->img_x;\n   *y = s->img_y;\n   if (comp) *comp = s->img_n;\n   return out;\n}\n#endif\n\n// Targa Truevision - TGA\n// by Jonathan Dummer\n#ifndef STBI_NO_TGA\nstatic int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)\n{\n    int tga_w, tga_h, tga_comp;\n    int sz;\n    stbi__get8(s);                   // discard Offset\n    sz = stbi__get8(s);              // color type\n    if( sz > 1 ) {\n        stbi__rewind(s);\n        return 0;      // only RGB or indexed allowed\n    }\n    sz = stbi__get8(s);              // image type\n    // only RGB or grey allowed, +/- RLE\n    if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0;\n    stbi__skip(s,9);\n    tga_w = stbi__get16le(s);\n    if( tga_w < 1 ) {\n        stbi__rewind(s);\n        return 0;   // test width\n    }\n    tga_h = stbi__get16le(s);\n    if( tga_h < 1 ) {\n        stbi__rewind(s);\n        return 0;   // test height\n    }\n    sz = stbi__get8(s);               // bits per pixel\n    // only RGB or RGBA or grey allowed\n    if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) {\n        stbi__rewind(s);\n        return 0;\n    }\n    tga_comp = sz;\n    if (x) *x = tga_w;\n    if (y) *y = tga_h;\n    if (comp) *comp = tga_comp / 8;\n    return 1;                   // seems to have passed everything\n}\n\nstatic int stbi__tga_test(stbi__context *s)\n{\n   int res;\n   int sz;\n   stbi__get8(s);      //   discard Offset\n   sz = stbi__get8(s);   //   color type\n   if ( sz > 1 ) return 0;   //   only RGB or indexed allowed\n   sz = stbi__get8(s);   //   image type\n   if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0;   //   only RGB or grey allowed, +/- RLE\n   stbi__get16be(s);      //   discard palette start\n   stbi__get16be(s);      //   discard palette length\n   stbi__get8(s);         //   discard bits per palette color entry\n   stbi__get16be(s);      //   discard x origin\n   stbi__get16be(s);      //   discard y origin\n   if ( stbi__get16be(s) < 1 ) return 0;      //   test width\n   if ( stbi__get16be(s) < 1 ) return 0;      //   test height\n   sz = stbi__get8(s);   //   bits per pixel\n   if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) )\n      res = 0;\n   else\n      res = 1;\n   stbi__rewind(s);\n   return res;\n}\n\nstatic stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   //   read in the TGA header stuff\n   int tga_offset = stbi__get8(s);\n   int tga_indexed = stbi__get8(s);\n   int tga_image_type = stbi__get8(s);\n   int tga_is_RLE = 0;\n   int tga_palette_start = stbi__get16le(s);\n   int tga_palette_len = stbi__get16le(s);\n   int tga_palette_bits = stbi__get8(s);\n   int tga_x_origin = stbi__get16le(s);\n   int tga_y_origin = stbi__get16le(s);\n   int tga_width = stbi__get16le(s);\n   int tga_height = stbi__get16le(s);\n   int tga_bits_per_pixel = stbi__get8(s);\n   int tga_comp = tga_bits_per_pixel / 8;\n   int tga_inverted = stbi__get8(s);\n   //   image data\n   unsigned char *tga_data;\n   unsigned char *tga_palette = NULL;\n   int i, j;\n   unsigned char raw_data[4];\n   int RLE_count = 0;\n   int RLE_repeating = 0;\n   int read_next_pixel = 1;\n\n   //   do a tiny bit of precessing\n   if ( tga_image_type >= 8 )\n   {\n      tga_image_type -= 8;\n      tga_is_RLE = 1;\n   }\n   /* int tga_alpha_bits = tga_inverted & 15; */\n   tga_inverted = 1 - ((tga_inverted >> 5) & 1);\n\n   //   error check\n   if ( //(tga_indexed) ||\n      (tga_width < 1) || (tga_height < 1) ||\n      (tga_image_type < 1) || (tga_image_type > 3) ||\n      ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) &&\n      (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32))\n      )\n   {\n      return NULL; // we don't report this as a bad TGA because we don't even know if it's TGA\n   }\n\n   //   If I'm paletted, then I'll use the number of bits from the palette\n   if ( tga_indexed )\n   {\n      tga_comp = tga_palette_bits / 8;\n   }\n\n   //   tga info\n   *x = tga_width;\n   *y = tga_height;\n   if (comp) *comp = tga_comp;\n\n   tga_data = (unsigned char*)stbi__malloc( tga_width * tga_height * tga_comp );\n   if (!tga_data) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n\n   // skip to the data's starting position (offset usually = 0)\n   stbi__skip(s, tga_offset );\n\n   if ( !tga_indexed && !tga_is_RLE) {\n      for (i=0; i < tga_height; ++i) {\n         int y = tga_inverted ? tga_height -i - 1 : i;\n         stbi_uc *tga_row = tga_data + y*tga_width*tga_comp;\n         stbi__getn(s, tga_row, tga_width * tga_comp);\n      }\n   } else  {\n      //   do I need to load a palette?\n      if ( tga_indexed)\n      {\n         //   any data to skip? (offset usually = 0)\n         stbi__skip(s, tga_palette_start );\n         //   load the palette\n         tga_palette = (unsigned char*)stbi__malloc( tga_palette_len * tga_palette_bits / 8 );\n         if (!tga_palette) {\n            STBI_FREE(tga_data);\n            return stbi__errpuc(\"outofmem\", \"Out of memory\");\n         }\n         if (!stbi__getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) {\n            STBI_FREE(tga_data);\n            STBI_FREE(tga_palette);\n            return stbi__errpuc(\"bad palette\", \"Corrupt TGA\");\n         }\n      }\n      //   load the data\n      for (i=0; i < tga_width * tga_height; ++i)\n      {\n         //   if I'm in RLE mode, do I need to get a RLE stbi__pngchunk?\n         if ( tga_is_RLE )\n         {\n            if ( RLE_count == 0 )\n            {\n               //   yep, get the next byte as a RLE command\n               int RLE_cmd = stbi__get8(s);\n               RLE_count = 1 + (RLE_cmd & 127);\n               RLE_repeating = RLE_cmd >> 7;\n               read_next_pixel = 1;\n            } else if ( !RLE_repeating )\n            {\n               read_next_pixel = 1;\n            }\n         } else\n         {\n            read_next_pixel = 1;\n         }\n         //   OK, if I need to read a pixel, do it now\n         if ( read_next_pixel )\n         {\n            //   load however much data we did have\n            if ( tga_indexed )\n            {\n               //   read in 1 byte, then perform the lookup\n               int pal_idx = stbi__get8(s);\n               if ( pal_idx >= tga_palette_len )\n               {\n                  //   invalid index\n                  pal_idx = 0;\n               }\n               pal_idx *= tga_bits_per_pixel / 8;\n               for (j = 0; j*8 < tga_bits_per_pixel; ++j)\n               {\n                  raw_data[j] = tga_palette[pal_idx+j];\n               }\n            } else\n            {\n               //   read in the data raw\n               for (j = 0; j*8 < tga_bits_per_pixel; ++j)\n               {\n                  raw_data[j] = stbi__get8(s);\n               }\n            }\n            //   clear the reading flag for the next pixel\n            read_next_pixel = 0;\n         } // end of reading a pixel\n\n         // copy data\n         for (j = 0; j < tga_comp; ++j)\n           tga_data[i*tga_comp+j] = raw_data[j];\n\n         //   in case we're in RLE mode, keep counting down\n         --RLE_count;\n      }\n      //   do I need to invert the image?\n      if ( tga_inverted )\n      {\n         for (j = 0; j*2 < tga_height; ++j)\n         {\n            int index1 = j * tga_width * tga_comp;\n            int index2 = (tga_height - 1 - j) * tga_width * tga_comp;\n            for (i = tga_width * tga_comp; i > 0; --i)\n            {\n               unsigned char temp = tga_data[index1];\n               tga_data[index1] = tga_data[index2];\n               tga_data[index2] = temp;\n               ++index1;\n               ++index2;\n            }\n         }\n      }\n      //   clear my palette, if I had one\n      if ( tga_palette != NULL )\n      {\n         STBI_FREE( tga_palette );\n      }\n   }\n\n   // swap RGB\n   if (tga_comp >= 3)\n   {\n      unsigned char* tga_pixel = tga_data;\n      for (i=0; i < tga_width * tga_height; ++i)\n      {\n         unsigned char temp = tga_pixel[0];\n         tga_pixel[0] = tga_pixel[2];\n         tga_pixel[2] = temp;\n         tga_pixel += tga_comp;\n      }\n   }\n\n   // convert to target component count\n   if (req_comp && req_comp != tga_comp)\n      tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);\n\n   //   the things I do to get rid of an error message, and yet keep\n   //   Microsoft's C compilers happy... [8^(\n   tga_palette_start = tga_palette_len = tga_palette_bits =\n         tga_x_origin = tga_y_origin = 0;\n   //   OK, done\n   return tga_data;\n}\n#endif\n\n// *************************************************************************************************\n// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB\n\n#ifndef STBI_NO_PSD\nstatic int stbi__psd_test(stbi__context *s)\n{\n   int r = (stbi__get32be(s) == 0x38425053);\n   stbi__rewind(s);\n   return r;\n}\n\nstatic stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   int   pixelCount;\n   int channelCount, compression;\n   int channel, i, count, len;\n   int w,h;\n   stbi_uc *out;\n\n   // Check identifier\n   if (stbi__get32be(s) != 0x38425053)   // \"8BPS\"\n      return stbi__errpuc(\"not PSD\", \"Corrupt PSD image\");\n\n   // Check file type version.\n   if (stbi__get16be(s) != 1)\n      return stbi__errpuc(\"wrong version\", \"Unsupported version of PSD image\");\n\n   // Skip 6 reserved bytes.\n   stbi__skip(s, 6 );\n\n   // Read the number of channels (R, G, B, A, etc).\n   channelCount = stbi__get16be(s);\n   if (channelCount < 0 || channelCount > 16)\n      return stbi__errpuc(\"wrong channel count\", \"Unsupported number of channels in PSD image\");\n\n   // Read the rows and columns of the image.\n   h = stbi__get32be(s);\n   w = stbi__get32be(s);\n\n   // Make sure the depth is 8 bits.\n   if (stbi__get16be(s) != 8)\n      return stbi__errpuc(\"unsupported bit depth\", \"PSD bit depth is not 8 bit\");\n\n   // Make sure the color mode is RGB.\n   // Valid options are:\n   //   0: Bitmap\n   //   1: Grayscale\n   //   2: Indexed color\n   //   3: RGB color\n   //   4: CMYK color\n   //   7: Multichannel\n   //   8: Duotone\n   //   9: Lab color\n   if (stbi__get16be(s) != 3)\n      return stbi__errpuc(\"wrong color format\", \"PSD is not in RGB color format\");\n\n   // Skip the Mode Data.  (It's the palette for indexed color; other info for other modes.)\n   stbi__skip(s,stbi__get32be(s) );\n\n   // Skip the image resources.  (resolution, pen tool paths, etc)\n   stbi__skip(s, stbi__get32be(s) );\n\n   // Skip the reserved data.\n   stbi__skip(s, stbi__get32be(s) );\n\n   // Find out if the data is compressed.\n   // Known values:\n   //   0: no compression\n   //   1: RLE compressed\n   compression = stbi__get16be(s);\n   if (compression > 1)\n      return stbi__errpuc(\"bad compression\", \"PSD has an unknown compression format\");\n\n   // Create the destination image.\n   out = (stbi_uc *) stbi__malloc(4 * w*h);\n   if (!out) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n   pixelCount = w*h;\n\n   // Initialize the data to zero.\n   //memset( out, 0, pixelCount * 4 );\n\n   // Finally, the image data.\n   if (compression) {\n      // RLE as used by .PSD and .TIFF\n      // Loop until you get the number of unpacked bytes you are expecting:\n      //     Read the next source byte into n.\n      //     If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.\n      //     Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.\n      //     Else if n is 128, noop.\n      // Endloop\n\n      // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data,\n      // which we're going to just skip.\n      stbi__skip(s, h * channelCount * 2 );\n\n      // Read the RLE data by channel.\n      for (channel = 0; channel < 4; channel++) {\n         stbi_uc *p;\n\n         p = out+channel;\n         if (channel >= channelCount) {\n            // Fill this channel with default data.\n            for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4;\n         } else {\n            // Read the RLE data.\n            count = 0;\n            while (count < pixelCount) {\n               len = stbi__get8(s);\n               if (len == 128) {\n                  // No-op.\n               } else if (len < 128) {\n                  // Copy next len+1 bytes literally.\n                  len++;\n                  count += len;\n                  while (len) {\n                     *p = stbi__get8(s);\n                     p += 4;\n                     len--;\n                  }\n               } else if (len > 128) {\n                  stbi_uc   val;\n                  // Next -len+1 bytes in the dest are replicated from next source byte.\n                  // (Interpret len as a negative 8-bit int.)\n                  len ^= 0x0FF;\n                  len += 2;\n                  val = stbi__get8(s);\n                  count += len;\n                  while (len) {\n                     *p = val;\n                     p += 4;\n                     len--;\n                  }\n               }\n            }\n         }\n      }\n\n   } else {\n      // We're at the raw image data.  It's each channel in order (Red, Green, Blue, Alpha, ...)\n      // where each channel consists of an 8-bit value for each pixel in the image.\n\n      // Read the data by channel.\n      for (channel = 0; channel < 4; channel++) {\n         stbi_uc *p;\n\n         p = out + channel;\n         if (channel > channelCount) {\n            // Fill this channel with default data.\n            for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4;\n         } else {\n            // Read the data.\n            for (i = 0; i < pixelCount; i++)\n               *p = stbi__get8(s), p += 4;\n         }\n      }\n   }\n\n   if (req_comp && req_comp != 4) {\n      out = stbi__convert_format(out, 4, req_comp, w, h);\n      if (out == NULL) return out; // stbi__convert_format frees input on failure\n   }\n\n   if (comp) *comp = channelCount;\n   *y = h;\n   *x = w;\n\n   return out;\n}\n#endif\n\n// *************************************************************************************************\n// Softimage PIC loader\n// by Tom Seddon\n//\n// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format\n// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/\n\n#ifndef STBI_NO_PIC\nstatic int stbi__pic_is4(stbi__context *s,const char *str)\n{\n   int i;\n   for (i=0; i<4; ++i)\n      if (stbi__get8(s) != (stbi_uc)str[i])\n         return 0;\n\n   return 1;\n}\n\nstatic int stbi__pic_test_core(stbi__context *s)\n{\n   int i;\n\n   if (!stbi__pic_is4(s,\"\\x53\\x80\\xF6\\x34\"))\n      return 0;\n\n   for(i=0;i<84;++i)\n      stbi__get8(s);\n\n   if (!stbi__pic_is4(s,\"PICT\"))\n      return 0;\n\n   return 1;\n}\n\ntypedef struct\n{\n   stbi_uc size,type,channel;\n} stbi__pic_packet;\n\nstatic stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest)\n{\n   int mask=0x80, i;\n\n   for (i=0; i<4; ++i, mask>>=1) {\n      if (channel & mask) {\n         if (stbi__at_eof(s)) return stbi__errpuc(\"bad file\",\"PIC file too short\");\n         dest[i]=stbi__get8(s);\n      }\n   }\n\n   return dest;\n}\n\nstatic void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src)\n{\n   int mask=0x80,i;\n\n   for (i=0;i<4; ++i, mask>>=1)\n      if (channel&mask)\n         dest[i]=src[i];\n}\n\nstatic stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result)\n{\n   int act_comp=0,num_packets=0,y,chained;\n   stbi__pic_packet packets[10];\n\n   // this will (should...) cater for even some bizarre stuff like having data\n    // for the same channel in multiple packets.\n   do {\n      stbi__pic_packet *packet;\n\n      if (num_packets==sizeof(packets)/sizeof(packets[0]))\n         return stbi__errpuc(\"bad format\",\"too many packets\");\n\n      packet = &packets[num_packets++];\n\n      chained = stbi__get8(s);\n      packet->size    = stbi__get8(s);\n      packet->type    = stbi__get8(s);\n      packet->channel = stbi__get8(s);\n\n      act_comp |= packet->channel;\n\n      if (stbi__at_eof(s))          return stbi__errpuc(\"bad file\",\"file too short (reading packets)\");\n      if (packet->size != 8)  return stbi__errpuc(\"bad format\",\"packet isn't 8bpp\");\n   } while (chained);\n\n   *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel?\n\n   for(y=0; y<height; ++y) {\n      int packet_idx;\n\n      for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {\n         stbi__pic_packet *packet = &packets[packet_idx];\n         stbi_uc *dest = result+y*width*4;\n\n         switch (packet->type) {\n            default:\n               return stbi__errpuc(\"bad format\",\"packet has bad compression type\");\n\n            case 0: {//uncompressed\n               int x;\n\n               for(x=0;x<width;++x, dest+=4)\n                  if (!stbi__readval(s,packet->channel,dest))\n                     return 0;\n               break;\n            }\n\n            case 1://Pure RLE\n               {\n                  int left=width, i;\n\n                  while (left>0) {\n                     stbi_uc count,value[4];\n\n                     count=stbi__get8(s);\n                     if (stbi__at_eof(s))   return stbi__errpuc(\"bad file\",\"file too short (pure read count)\");\n\n                     if (count > left)\n                        count = (stbi_uc) left;\n\n                     if (!stbi__readval(s,packet->channel,value))  return 0;\n\n                     for(i=0; i<count; ++i,dest+=4)\n                        stbi__copyval(packet->channel,dest,value);\n                     left -= count;\n                  }\n               }\n               break;\n\n            case 2: {//Mixed RLE\n               int left=width;\n               while (left>0) {\n                  int count = stbi__get8(s), i;\n                  if (stbi__at_eof(s))  return stbi__errpuc(\"bad file\",\"file too short (mixed read count)\");\n\n                  if (count >= 128) { // Repeated\n                     stbi_uc value[4];\n                     int i;\n\n                     if (count==128)\n                        count = stbi__get16be(s);\n                     else\n                        count -= 127;\n                     if (count > left)\n                        return stbi__errpuc(\"bad file\",\"scanline overrun\");\n\n                     if (!stbi__readval(s,packet->channel,value))\n                        return 0;\n\n                     for(i=0;i<count;++i, dest += 4)\n                        stbi__copyval(packet->channel,dest,value);\n                  } else { // Raw\n                     ++count;\n                     if (count>left) return stbi__errpuc(\"bad file\",\"scanline overrun\");\n\n                     for(i=0;i<count;++i, dest+=4)\n                        if (!stbi__readval(s,packet->channel,dest))\n                           return 0;\n                  }\n                  left-=count;\n               }\n               break;\n            }\n         }\n      }\n   }\n\n   return result;\n}\n\nstatic stbi_uc *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp)\n{\n   stbi_uc *result;\n   int i, x,y;\n\n   for (i=0; i<92; ++i)\n      stbi__get8(s);\n\n   x = stbi__get16be(s);\n   y = stbi__get16be(s);\n   if (stbi__at_eof(s))  return stbi__errpuc(\"bad file\",\"file too short (pic header)\");\n   if ((1 << 28) / x < y) return stbi__errpuc(\"too large\", \"Image too large to decode\");\n\n   stbi__get32be(s); //skip `ratio'\n   stbi__get16be(s); //skip `fields'\n   stbi__get16be(s); //skip `pad'\n\n   // intermediate buffer is RGBA\n   result = (stbi_uc *) stbi__malloc(x*y*4);\n   memset(result, 0xff, x*y*4);\n\n   if (!stbi__pic_load_core(s,x,y,comp, result)) {\n      STBI_FREE(result);\n      result=0;\n   }\n   *px = x;\n   *py = y;\n   if (req_comp == 0) req_comp = *comp;\n   result=stbi__convert_format(result,4,req_comp,x,y);\n\n   return result;\n}\n\nstatic int stbi__pic_test(stbi__context *s)\n{\n   int r = stbi__pic_test_core(s);\n   stbi__rewind(s);\n   return r;\n}\n#endif\n\n// *************************************************************************************************\n// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb\n\n#ifndef STBI_NO_GIF\ntypedef struct\n{\n   stbi__int16 prefix;\n   stbi_uc first;\n   stbi_uc suffix;\n} stbi__gif_lzw;\n\ntypedef struct\n{\n   int w,h;\n   stbi_uc *out;                 // output buffer (always 4 components)\n   int flags, bgindex, ratio, transparent, eflags;\n   stbi_uc  pal[256][4];\n   stbi_uc lpal[256][4];\n   stbi__gif_lzw codes[4096];\n   stbi_uc *color_table;\n   int parse, step;\n   int lflags;\n   int start_x, start_y;\n   int max_x, max_y;\n   int cur_x, cur_y;\n   int line_size;\n} stbi__gif;\n\nstatic int stbi__gif_test_raw(stbi__context *s)\n{\n   int sz;\n   if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0;\n   sz = stbi__get8(s);\n   if (sz != '9' && sz != '7') return 0;\n   if (stbi__get8(s) != 'a') return 0;\n   return 1;\n}\n\nstatic int stbi__gif_test(stbi__context *s)\n{\n   int r = stbi__gif_test_raw(s);\n   stbi__rewind(s);\n   return r;\n}\n\nstatic void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp)\n{\n   int i;\n   for (i=0; i < num_entries; ++i) {\n      pal[i][2] = stbi__get8(s);\n      pal[i][1] = stbi__get8(s);\n      pal[i][0] = stbi__get8(s);\n      pal[i][3] = transp == i ? 0 : 255;\n   }\n}\n\nstatic int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info)\n{\n   stbi_uc version;\n   if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8')\n      return stbi__err(\"not GIF\", \"Corrupt GIF\");\n\n   version = stbi__get8(s);\n   if (version != '7' && version != '9')    return stbi__err(\"not GIF\", \"Corrupt GIF\");\n   if (stbi__get8(s) != 'a')                return stbi__err(\"not GIF\", \"Corrupt GIF\");\n\n   stbi__g_failure_reason = \"\";\n   g->w = stbi__get16le(s);\n   g->h = stbi__get16le(s);\n   g->flags = stbi__get8(s);\n   g->bgindex = stbi__get8(s);\n   g->ratio = stbi__get8(s);\n   g->transparent = -1;\n\n   if (comp != 0) *comp = 4;  // can't actually tell whether it's 3 or 4 until we parse the comments\n\n   if (is_info) return 1;\n\n   if (g->flags & 0x80)\n      stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);\n\n   return 1;\n}\n\nstatic int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)\n{\n   stbi__gif g;\n   if (!stbi__gif_header(s, &g, comp, 1)) {\n      stbi__rewind( s );\n      return 0;\n   }\n   if (x) *x = g.w;\n   if (y) *y = g.h;\n   return 1;\n}\n\nstatic void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)\n{\n   stbi_uc *p, *c;\n\n   // recurse to decode the prefixes, since the linked-list is backwards,\n   // and working backwards through an interleaved image would be nasty\n   if (g->codes[code].prefix >= 0)\n      stbi__out_gif_code(g, g->codes[code].prefix);\n\n   if (g->cur_y >= g->max_y) return;\n\n   p = &g->out[g->cur_x + g->cur_y];\n   c = &g->color_table[g->codes[code].suffix * 4];\n\n   if (c[3] >= 128) {\n      p[0] = c[2];\n      p[1] = c[1];\n      p[2] = c[0];\n      p[3] = c[3];\n   }\n   g->cur_x += 4;\n\n   if (g->cur_x >= g->max_x) {\n      g->cur_x = g->start_x;\n      g->cur_y += g->step;\n\n      while (g->cur_y >= g->max_y && g->parse > 0) {\n         g->step = (1 << g->parse) * g->line_size;\n         g->cur_y = g->start_y + (g->step >> 1);\n         --g->parse;\n      }\n   }\n}\n\nstatic stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)\n{\n   stbi_uc lzw_cs;\n   stbi__int32 len, code;\n   stbi__uint32 first;\n   stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;\n   stbi__gif_lzw *p;\n\n   lzw_cs = stbi__get8(s);\n   clear = 1 << lzw_cs;\n   first = 1;\n   codesize = lzw_cs + 1;\n   codemask = (1 << codesize) - 1;\n   bits = 0;\n   valid_bits = 0;\n   for (code = 0; code < clear; code++) {\n      g->codes[code].prefix = -1;\n      g->codes[code].first = (stbi_uc) code;\n      g->codes[code].suffix = (stbi_uc) code;\n   }\n\n   // support no starting clear code\n   avail = clear+2;\n   oldcode = -1;\n\n   len = 0;\n   for(;;) {\n      if (valid_bits < codesize) {\n         if (len == 0) {\n            len = stbi__get8(s); // start new block\n            if (len == 0)\n               return g->out;\n         }\n         --len;\n         bits |= (stbi__int32) stbi__get8(s) << valid_bits;\n         valid_bits += 8;\n      } else {\n         stbi__int32 code = bits & codemask;\n         bits >>= codesize;\n         valid_bits -= codesize;\n         // @OPTIMIZE: is there some way we can accelerate the non-clear path?\n         if (code == clear) {  // clear code\n            codesize = lzw_cs + 1;\n            codemask = (1 << codesize) - 1;\n            avail = clear + 2;\n            oldcode = -1;\n            first = 0;\n         } else if (code == clear + 1) { // end of stream code\n            stbi__skip(s, len);\n            while ((len = stbi__get8(s)) > 0)\n               stbi__skip(s,len);\n            return g->out;\n         } else if (code <= avail) {\n            if (first) return stbi__errpuc(\"no clear code\", \"Corrupt GIF\");\n\n            if (oldcode >= 0) {\n               p = &g->codes[avail++];\n               if (avail > 4096)        return stbi__errpuc(\"too many codes\", \"Corrupt GIF\");\n               p->prefix = (stbi__int16) oldcode;\n               p->first = g->codes[oldcode].first;\n               p->suffix = (code == avail) ? p->first : g->codes[code].first;\n            } else if (code == avail)\n               return stbi__errpuc(\"illegal code in raster\", \"Corrupt GIF\");\n\n            stbi__out_gif_code(g, (stbi__uint16) code);\n\n            if ((avail & codemask) == 0 && avail <= 0x0FFF) {\n               codesize++;\n               codemask = (1 << codesize) - 1;\n            }\n\n            oldcode = code;\n         } else {\n            return stbi__errpuc(\"illegal code in raster\", \"Corrupt GIF\");\n         }\n      }\n   }\n}\n\nstatic void stbi__fill_gif_background(stbi__gif *g)\n{\n   int i;\n   stbi_uc *c = g->pal[g->bgindex];\n   // @OPTIMIZE: write a dword at a time\n   for (i = 0; i < g->w * g->h * 4; i += 4) {\n      stbi_uc *p  = &g->out[i];\n      p[0] = c[2];\n      p[1] = c[1];\n      p[2] = c[0];\n      p[3] = c[3];\n   }\n}\n\n// this function is designed to support animated gifs, although stb_image doesn't support it\nstatic stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp)\n{\n   int i;\n   stbi_uc *old_out = 0;\n\n   if (g->out == 0) {\n      if (!stbi__gif_header(s, g, comp,0))     return 0; // stbi__g_failure_reason set by stbi__gif_header\n      g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h);\n      if (g->out == 0)                      return stbi__errpuc(\"outofmem\", \"Out of memory\");\n      stbi__fill_gif_background(g);\n   } else {\n      // animated-gif-only path\n      if (((g->eflags & 0x1C) >> 2) == 3) {\n         old_out = g->out;\n         g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h);\n         if (g->out == 0)                   return stbi__errpuc(\"outofmem\", \"Out of memory\");\n         memcpy(g->out, old_out, g->w*g->h*4);\n      }\n   }\n\n   for (;;) {\n      switch (stbi__get8(s)) {\n         case 0x2C: /* Image Descriptor */\n         {\n            stbi__int32 x, y, w, h;\n            stbi_uc *o;\n\n            x = stbi__get16le(s);\n            y = stbi__get16le(s);\n            w = stbi__get16le(s);\n            h = stbi__get16le(s);\n            if (((x + w) > (g->w)) || ((y + h) > (g->h)))\n               return stbi__errpuc(\"bad Image Descriptor\", \"Corrupt GIF\");\n\n            g->line_size = g->w * 4;\n            g->start_x = x * 4;\n            g->start_y = y * g->line_size;\n            g->max_x   = g->start_x + w * 4;\n            g->max_y   = g->start_y + h * g->line_size;\n            g->cur_x   = g->start_x;\n            g->cur_y   = g->start_y;\n\n            g->lflags = stbi__get8(s);\n\n            if (g->lflags & 0x40) {\n               g->step = 8 * g->line_size; // first interlaced spacing\n               g->parse = 3;\n            } else {\n               g->step = g->line_size;\n               g->parse = 0;\n            }\n\n            if (g->lflags & 0x80) {\n               stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);\n               g->color_table = (stbi_uc *) g->lpal;\n            } else if (g->flags & 0x80) {\n               for (i=0; i < 256; ++i)  // @OPTIMIZE: stbi__jpeg_reset only the previous transparent\n                  g->pal[i][3] = 255;\n               if (g->transparent >= 0 && (g->eflags & 0x01))\n                  g->pal[g->transparent][3] = 0;\n               g->color_table = (stbi_uc *) g->pal;\n            } else\n               return stbi__errpuc(\"missing color table\", \"Corrupt GIF\");\n\n            o = stbi__process_gif_raster(s, g);\n            if (o == NULL) return NULL;\n\n            if (req_comp && req_comp != 4)\n               o = stbi__convert_format(o, 4, req_comp, g->w, g->h);\n            return o;\n         }\n\n         case 0x21: // Comment Extension.\n         {\n            int len;\n            if (stbi__get8(s) == 0xF9) { // Graphic Control Extension.\n               len = stbi__get8(s);\n               if (len == 4) {\n                  g->eflags = stbi__get8(s);\n                  stbi__get16le(s); // delay\n                  g->transparent = stbi__get8(s);\n               } else {\n                  stbi__skip(s, len);\n                  break;\n               }\n            }\n            while ((len = stbi__get8(s)) != 0)\n               stbi__skip(s, len);\n            break;\n         }\n\n         case 0x3B: // gif stream termination code\n            return (stbi_uc *) s; // using '1' causes warning on some compilers\n\n         default:\n            return stbi__errpuc(\"unknown code\", \"Corrupt GIF\");\n      }\n   }\n}\n\nstatic stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   stbi_uc *u = 0;\n   stbi__gif g;\n   memset(&g, 0, sizeof(g));\n\n   u = stbi__gif_load_next(s, &g, comp, req_comp);\n   if (u == (stbi_uc *) s) u = 0;  // end of animated gif marker\n   if (u) {\n      *x = g.w;\n      *y = g.h;\n   }\n\n   return u;\n}\n\nstatic int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   return stbi__gif_info_raw(s,x,y,comp);\n}\n#endif\n\n// *************************************************************************************************\n// Radiance RGBE HDR loader\n// originally by Nicolas Schulz\n#ifndef STBI_NO_HDR\nstatic int stbi__hdr_test_core(stbi__context *s)\n{\n   const char *signature = \"#?RADIANCE\\n\";\n   int i;\n   for (i=0; signature[i]; ++i)\n      if (stbi__get8(s) != signature[i])\n         return 0;\n   return 1;\n}\n\nstatic int stbi__hdr_test(stbi__context* s)\n{\n   int r = stbi__hdr_test_core(s);\n   stbi__rewind(s);\n   return r;\n}\n\n#define STBI__HDR_BUFLEN  1024\nstatic char *stbi__hdr_gettoken(stbi__context *z, char *buffer)\n{\n   int len=0;\n   char c = '\\0';\n\n   c = (char) stbi__get8(z);\n\n   while (!stbi__at_eof(z) && c != '\\n') {\n      buffer[len++] = c;\n      if (len == STBI__HDR_BUFLEN-1) {\n         // flush to end of line\n         while (!stbi__at_eof(z) && stbi__get8(z) != '\\n')\n            ;\n         break;\n      }\n      c = (char) stbi__get8(z);\n   }\n\n   buffer[len] = 0;\n   return buffer;\n}\n\nstatic void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp)\n{\n   if ( input[3] != 0 ) {\n      float f1;\n      // Exponent\n      f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8));\n      if (req_comp <= 2)\n         output[0] = (input[0] + input[1] + input[2]) * f1 / 3;\n      else {\n         output[0] = input[0] * f1;\n         output[1] = input[1] * f1;\n         output[2] = input[2] * f1;\n      }\n      if (req_comp == 2) output[1] = 1;\n      if (req_comp == 4) output[3] = 1;\n   } else {\n      switch (req_comp) {\n         case 4: output[3] = 1; /* fallthrough */\n         case 3: output[0] = output[1] = output[2] = 0;\n                 break;\n         case 2: output[1] = 1; /* fallthrough */\n         case 1: output[0] = 0;\n                 break;\n      }\n   }\n}\n\nstatic float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   char buffer[STBI__HDR_BUFLEN];\n   char *token;\n   int valid = 0;\n   int width, height;\n   stbi_uc *scanline;\n   float *hdr_data;\n   int len;\n   unsigned char count, value;\n   int i, j, k, c1,c2, z;\n\n\n   // Check identifier\n   if (strcmp(stbi__hdr_gettoken(s,buffer), \"#?RADIANCE\") != 0)\n      return stbi__errpf(\"not HDR\", \"Corrupt HDR image\");\n\n   // Parse header\n   for(;;) {\n      token = stbi__hdr_gettoken(s,buffer);\n      if (token[0] == 0) break;\n      if (strcmp(token, \"FORMAT=32-bit_rle_rgbe\") == 0) valid = 1;\n   }\n\n   if (!valid)    return stbi__errpf(\"unsupported format\", \"Unsupported HDR format\");\n\n   // Parse width and height\n   // can't use sscanf() if we're not using stdio!\n   token = stbi__hdr_gettoken(s,buffer);\n   if (strncmp(token, \"-Y \", 3))  return stbi__errpf(\"unsupported data layout\", \"Unsupported HDR format\");\n   token += 3;\n   height = (int) strtol(token, &token, 10);\n   while (*token == ' ') ++token;\n   if (strncmp(token, \"+X \", 3))  return stbi__errpf(\"unsupported data layout\", \"Unsupported HDR format\");\n   token += 3;\n   width = (int) strtol(token, NULL, 10);\n\n   *x = width;\n   *y = height;\n\n   if (comp) *comp = 3;\n   if (req_comp == 0) req_comp = 3;\n\n   // Read data\n   hdr_data = (float *) stbi__malloc(height * width * req_comp * sizeof(float));\n\n   // Load image data\n   // image data is stored as some number of sca\n   if ( width < 8 || width >= 32768) {\n      // Read flat data\n      for (j=0; j < height; ++j) {\n         for (i=0; i < width; ++i) {\n            stbi_uc rgbe[4];\n           main_decode_loop:\n            stbi__getn(s, rgbe, 4);\n            stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);\n         }\n      }\n   } else {\n      // Read RLE-encoded data\n      scanline = NULL;\n\n      for (j = 0; j < height; ++j) {\n         c1 = stbi__get8(s);\n         c2 = stbi__get8(s);\n         len = stbi__get8(s);\n         if (c1 != 2 || c2 != 2 || (len & 0x80)) {\n            // not run-length encoded, so we have to actually use THIS data as a decoded\n            // pixel (note this can't be a valid pixel--one of RGB must be >= 128)\n            stbi_uc rgbe[4];\n            rgbe[0] = (stbi_uc) c1;\n            rgbe[1] = (stbi_uc) c2;\n            rgbe[2] = (stbi_uc) len;\n            rgbe[3] = (stbi_uc) stbi__get8(s);\n            stbi__hdr_convert(hdr_data, rgbe, req_comp);\n            i = 1;\n            j = 0;\n            STBI_FREE(scanline);\n            goto main_decode_loop; // yes, this makes no sense\n         }\n         len <<= 8;\n         len |= stbi__get8(s);\n         if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf(\"invalid decoded scanline length\", \"corrupt HDR\"); }\n         if (scanline == NULL) scanline = (stbi_uc *) stbi__malloc(width * 4);\n\n         for (k = 0; k < 4; ++k) {\n            i = 0;\n            while (i < width) {\n               count = stbi__get8(s);\n               if (count > 128) {\n                  // Run\n                  value = stbi__get8(s);\n                  count -= 128;\n                  for (z = 0; z < count; ++z)\n                     scanline[i++ * 4 + k] = value;\n               } else {\n                  // Dump\n                  for (z = 0; z < count; ++z)\n                     scanline[i++ * 4 + k] = stbi__get8(s);\n               }\n            }\n         }\n         for (i=0; i < width; ++i)\n            stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);\n      }\n      STBI_FREE(scanline);\n   }\n\n   return hdr_data;\n}\n\nstatic int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   char buffer[STBI__HDR_BUFLEN];\n   char *token;\n   int valid = 0;\n\n   if (strcmp(stbi__hdr_gettoken(s,buffer), \"#?RADIANCE\") != 0) {\n       stbi__rewind( s );\n       return 0;\n   }\n\n   for(;;) {\n      token = stbi__hdr_gettoken(s,buffer);\n      if (token[0] == 0) break;\n      if (strcmp(token, \"FORMAT=32-bit_rle_rgbe\") == 0) valid = 1;\n   }\n\n   if (!valid) {\n       stbi__rewind( s );\n       return 0;\n   }\n   token = stbi__hdr_gettoken(s,buffer);\n   if (strncmp(token, \"-Y \", 3)) {\n       stbi__rewind( s );\n       return 0;\n   }\n   token += 3;\n   *y = (int) strtol(token, &token, 10);\n   while (*token == ' ') ++token;\n   if (strncmp(token, \"+X \", 3)) {\n       stbi__rewind( s );\n       return 0;\n   }\n   token += 3;\n   *x = (int) strtol(token, NULL, 10);\n   *comp = 3;\n   return 1;\n}\n#endif // STBI_NO_HDR\n\n#ifndef STBI_NO_BMP\nstatic int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   int hsz;\n   if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') {\n       stbi__rewind( s );\n       return 0;\n   }\n   stbi__skip(s,12);\n   hsz = stbi__get32le(s);\n   if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) {\n       stbi__rewind( s );\n       return 0;\n   }\n   if (hsz == 12) {\n      *x = stbi__get16le(s);\n      *y = stbi__get16le(s);\n   } else {\n      *x = stbi__get32le(s);\n      *y = stbi__get32le(s);\n   }\n   if (stbi__get16le(s) != 1) {\n       stbi__rewind( s );\n       return 0;\n   }\n   *comp = stbi__get16le(s) / 8;\n   return 1;\n}\n#endif\n\n#ifndef STBI_NO_PSD\nstatic int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   int channelCount;\n   if (stbi__get32be(s) != 0x38425053) {\n       stbi__rewind( s );\n       return 0;\n   }\n   if (stbi__get16be(s) != 1) {\n       stbi__rewind( s );\n       return 0;\n   }\n   stbi__skip(s, 6);\n   channelCount = stbi__get16be(s);\n   if (channelCount < 0 || channelCount > 16) {\n       stbi__rewind( s );\n       return 0;\n   }\n   *y = stbi__get32be(s);\n   *x = stbi__get32be(s);\n   if (stbi__get16be(s) != 8) {\n       stbi__rewind( s );\n       return 0;\n   }\n   if (stbi__get16be(s) != 3) {\n       stbi__rewind( s );\n       return 0;\n   }\n   *comp = 4;\n   return 1;\n}\n#endif\n\n#ifndef STBI_NO_PIC\nstatic int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   int act_comp=0,num_packets=0,chained;\n   stbi__pic_packet packets[10];\n\n   stbi__skip(s, 92);\n\n   *x = stbi__get16be(s);\n   *y = stbi__get16be(s);\n   if (stbi__at_eof(s))  return 0;\n   if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {\n       stbi__rewind( s );\n       return 0;\n   }\n\n   stbi__skip(s, 8);\n\n   do {\n      stbi__pic_packet *packet;\n\n      if (num_packets==sizeof(packets)/sizeof(packets[0]))\n         return 0;\n\n      packet = &packets[num_packets++];\n      chained = stbi__get8(s);\n      packet->size    = stbi__get8(s);\n      packet->type    = stbi__get8(s);\n      packet->channel = stbi__get8(s);\n      act_comp |= packet->channel;\n\n      if (stbi__at_eof(s)) {\n          stbi__rewind( s );\n          return 0;\n      }\n      if (packet->size != 8) {\n          stbi__rewind( s );\n          return 0;\n      }\n   } while (chained);\n\n   *comp = (act_comp & 0x10 ? 4 : 3);\n\n   return 1;\n}\n#endif\n\n// *************************************************************************************************\n// Portable Gray Map and Portable Pixel Map loader\n// by Ken Miller\n//\n// PGM: http://netpbm.sourceforge.net/doc/pgm.html\n// PPM: http://netpbm.sourceforge.net/doc/ppm.html\n//\n// Known limitations:\n//    Does not support comments in the header section\n//    Does not support ASCII image data (formats P2 and P3)\n//    Does not support 16-bit-per-channel\n\n#ifndef STBI_NO_PNM\n\nstatic int      stbi__pnm_test(stbi__context *s)\n{\n   char p, t;\n   p = (char) stbi__get8(s);\n   t = (char) stbi__get8(s);\n   if (p != 'P' || (t != '5' && t != '6')) {\n       stbi__rewind( s );\n       return 0;\n   }\n   return 1;\n}\n\nstatic stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   stbi_uc *out;\n   if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n))\n      return 0;\n   *x = s->img_x;\n   *y = s->img_y;\n   *comp = s->img_n;\n\n   out = (stbi_uc *) stbi__malloc(s->img_n * s->img_x * s->img_y);\n   if (!out) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n   stbi__getn(s, out, s->img_n * s->img_x * s->img_y);\n\n   if (req_comp && req_comp != s->img_n) {\n      out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);\n      if (out == NULL) return out; // stbi__convert_format frees input on failure\n   }\n   return out;\n}\n\nstatic int      stbi__pnm_isspace(char c)\n{\n   return c == ' ' || c == '\\t' || c == '\\n' || c == '\\v' || c == '\\f' || c == '\\r';\n}\n\nstatic void     stbi__pnm_skip_whitespace(stbi__context *s, char *c)\n{\n   while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))\n      *c = (char) stbi__get8(s);\n}\n\nstatic int      stbi__pnm_isdigit(char c)\n{\n   return c >= '0' && c <= '9';\n}\n\nstatic int      stbi__pnm_getinteger(stbi__context *s, char *c)\n{\n   int value = 0;\n\n   while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {\n      value = value*10 + (*c - '0');\n      *c = (char) stbi__get8(s);\n   }\n\n   return value;\n}\n\nstatic int      stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   int maxv;\n   char c, p, t;\n\n   stbi__rewind( s );\n\n   // Get identifier\n   p = (char) stbi__get8(s);\n   t = (char) stbi__get8(s);\n   if (p != 'P' || (t != '5' && t != '6')) {\n       stbi__rewind( s );\n       return 0;\n   }\n\n   *comp = (t == '6') ? 3 : 1;  // '5' is 1-component .pgm; '6' is 3-component .ppm\n\n   c = (char) stbi__get8(s);\n   stbi__pnm_skip_whitespace(s, &c);\n\n   *x = stbi__pnm_getinteger(s, &c); // read width\n   stbi__pnm_skip_whitespace(s, &c);\n\n   *y = stbi__pnm_getinteger(s, &c); // read height\n   stbi__pnm_skip_whitespace(s, &c);\n\n   maxv = stbi__pnm_getinteger(s, &c);  // read max value\n\n   if (maxv > 255)\n      return stbi__err(\"max value > 255\", \"PPM image not 8-bit\");\n   else\n      return 1;\n}\n#endif\n\nstatic int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)\n{\n   #ifndef STBI_NO_JPEG\n   if (stbi__jpeg_info(s, x, y, comp)) return 1;\n   #endif\n\n   #ifndef STBI_NO_PNG\n   if (stbi__png_info(s, x, y, comp))  return 1;\n   #endif\n\n   #ifndef STBI_NO_GIF\n   if (stbi__gif_info(s, x, y, comp))  return 1;\n   #endif\n\n   #ifndef STBI_NO_BMP\n   if (stbi__bmp_info(s, x, y, comp))  return 1;\n   #endif\n\n   #ifndef STBI_NO_PSD\n   if (stbi__psd_info(s, x, y, comp))  return 1;\n   #endif\n\n   #ifndef STBI_NO_PIC\n   if (stbi__pic_info(s, x, y, comp))  return 1;\n   #endif\n\n   #ifndef STBI_NO_PNM\n   if (stbi__pnm_info(s, x, y, comp))  return 1;\n   #endif\n\n   #ifndef STBI_NO_HDR\n   if (stbi__hdr_info(s, x, y, comp))  return 1;\n   #endif\n\n   // test tga last because it's a crappy test!\n   #ifndef STBI_NO_TGA\n   if (stbi__tga_info(s, x, y, comp))\n       return 1;\n   #endif\n   return stbi__err(\"unknown image type\", \"Image not of any known type, or corrupt\");\n}\n\n#ifndef STBI_NO_STDIO\nSTBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)\n{\n    FILE *f = stbi__fopen(filename, \"rb\");\n    int result;\n    if (!f) return stbi__err(\"can't fopen\", \"Unable to open file\");\n    result = stbi_info_from_file(f, x, y, comp);\n    fclose(f);\n    return result;\n}\n\nSTBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)\n{\n   int r;\n   stbi__context s;\n   long pos = ftell(f);\n   stbi__start_file(&s, f);\n   r = stbi__info_main(&s,x,y,comp);\n   fseek(f,pos,SEEK_SET);\n   return r;\n}\n#endif // !STBI_NO_STDIO\n\nSTBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)\n{\n   stbi__context s;\n   stbi__start_mem(&s,buffer,len);\n   return stbi__info_main(&s,x,y,comp);\n}\n\nSTBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp)\n{\n   stbi__context s;\n   stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);\n   return stbi__info_main(&s,x,y,comp);\n}\n\n#endif // STB_IMAGE_IMPLEMENTATION\n\n/*\n   revision history:\n      2.02  (2015-01-19) fix incorrect assert, fix warning\n      2.01  (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2\n      2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG\n      2.00  (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg)\n                         progressive JPEG (stb)\n                         PGM/PPM support (Ken Miller)\n                         STBI_MALLOC,STBI_REALLOC,STBI_FREE\n                         GIF bugfix -- seemingly never worked\n                         STBI_NO_*, STBI_ONLY_*\n      1.48  (2014-12-14) fix incorrectly-named assert()\n      1.47  (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb)\n                         optimize PNG (ryg)\n                         fix bug in interlaced PNG with user-specified channel count (stb)\n      1.46  (2014-08-26)\n              fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG\n      1.45  (2014-08-16)\n              fix MSVC-ARM internal compiler error by wrapping malloc\n      1.44  (2014-08-07)\n              various warning fixes from Ronny Chevalier\n      1.43  (2014-07-15)\n              fix MSVC-only compiler problem in code changed in 1.42\n      1.42  (2014-07-09)\n              don't define _CRT_SECURE_NO_WARNINGS (affects user code)\n              fixes to stbi__cleanup_jpeg path\n              added STBI_ASSERT to avoid requiring assert.h\n      1.41  (2014-06-25)\n              fix search&replace from 1.36 that messed up comments/error messages\n      1.40  (2014-06-22)\n              fix gcc struct-initialization warning\n      1.39  (2014-06-15)\n              fix to TGA optimization when req_comp != number of components in TGA;\n              fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite)\n              add support for BMP version 5 (more ignored fields)\n      1.38  (2014-06-06)\n              suppress MSVC warnings on integer casts truncating values\n              fix accidental rename of 'skip' field of I/O\n      1.37  (2014-06-04)\n              remove duplicate typedef\n      1.36  (2014-06-03)\n              convert to header file single-file library\n              if de-iphone isn't set, load iphone images color-swapped instead of returning NULL\n      1.35  (2014-05-27)\n              various warnings\n              fix broken STBI_SIMD path\n              fix bug where stbi_load_from_file no longer left file pointer in correct place\n              fix broken non-easy path for 32-bit BMP (possibly never used)\n              TGA optimization by Arseny Kapoulkine\n      1.34  (unknown)\n              use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case\n      1.33  (2011-07-14)\n              make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements\n      1.32  (2011-07-13)\n              support for \"info\" function for all supported filetypes (SpartanJ)\n      1.31  (2011-06-20)\n              a few more leak fixes, bug in PNG handling (SpartanJ)\n      1.30  (2011-06-11)\n              added ability to load files via callbacks to accomidate custom input streams (Ben Wenger)\n              removed deprecated format-specific test/load functions\n              removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway\n              error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha)\n              fix inefficiency in decoding 32-bit BMP (David Woo)\n      1.29  (2010-08-16)\n              various warning fixes from Aurelien Pocheville\n      1.28  (2010-08-01)\n              fix bug in GIF palette transparency (SpartanJ)\n      1.27  (2010-08-01)\n              cast-to-stbi_uc to fix warnings\n      1.26  (2010-07-24)\n              fix bug in file buffering for PNG reported by SpartanJ\n      1.25  (2010-07-17)\n              refix trans_data warning (Won Chun)\n      1.24  (2010-07-12)\n              perf improvements reading from files on platforms with lock-heavy fgetc()\n              minor perf improvements for jpeg\n              deprecated type-specific functions so we'll get feedback if they're needed\n              attempt to fix trans_data warning (Won Chun)\n      1.23    fixed bug in iPhone support\n      1.22  (2010-07-10)\n              removed image *writing* support\n              stbi_info support from Jetro Lauha\n              GIF support from Jean-Marc Lienher\n              iPhone PNG-extensions from James Brown\n              warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva)\n      1.21    fix use of 'stbi_uc' in header (reported by jon blow)\n      1.20    added support for Softimage PIC, by Tom Seddon\n      1.19    bug in interlaced PNG corruption check (found by ryg)\n      1.18 2008-08-02\n              fix a threading bug (local mutable static)\n      1.17    support interlaced PNG\n      1.16    major bugfix - stbi__convert_format converted one too many pixels\n      1.15    initialize some fields for thread safety\n      1.14    fix threadsafe conversion bug\n              header-file-only version (#define STBI_HEADER_FILE_ONLY before including)\n      1.13    threadsafe\n      1.12    const qualifiers in the API\n      1.11    Support installable IDCT, colorspace conversion routines\n      1.10    Fixes for 64-bit (don't use \"unsigned long\")\n              optimized upsampling by Fabian \"ryg\" Giesen\n      1.09    Fix format-conversion for PSD code (bad global variables!)\n      1.08    Thatcher Ulrich's PSD code integrated by Nicolas Schulz\n      1.07    attempt to fix C++ warning/errors again\n      1.06    attempt to fix C++ warning/errors again\n      1.05    fix TGA loading to return correct *comp and use good luminance calc\n      1.04    default float alpha is 1, not 255; use 'void *' for stbi_image_free\n      1.03    bugfixes to STBI_NO_STDIO, STBI_NO_HDR\n      1.02    support for (subset of) HDR files, float interface for preferred access to them\n      1.01    fix bug: possible bug in handling right-side up bmps... not sure\n              fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all\n      1.00    interface to zlib that skips zlib header\n      0.99    correct handling of alpha in palette\n      0.98    TGA loader by lonesock; dynamically add loaders (untested)\n      0.97    jpeg errors on too large a file; also catch another malloc failure\n      0.96    fix detection of invalid v value - particleman@mollyrocket forum\n      0.95    during header scan, seek to markers in case of padding\n      0.94    STBI_NO_STDIO to disable stdio usage; rename all #defines the same\n      0.93    handle jpegtran output; verbose errors\n      0.92    read 4,8,16,24,32-bit BMP files of several formats\n      0.91    output 24-bit Windows 3.0 BMP files\n      0.90    fix a few more warnings; bump version number to approach 1.0\n      0.61    bugfixes due to Marc LeBlanc, Christopher Lloyd\n      0.60    fix compiling as c++\n      0.59    fix warnings: merge Dave Moore's -Wall fixes\n      0.58    fix bug: zlib uncompressed mode len/nlen was wrong endian\n      0.57    fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available\n      0.56    fix bug: zlib uncompressed mode len vs. nlen\n      0.55    fix bug: restart_interval not initialized to 0\n      0.54    allow NULL for 'int *comp'\n      0.53    fix bug in png 3->4; speedup png decoding\n      0.52    png handles req_comp=3,4 directly; minor cleanup; jpeg comments\n      0.51    obey req_comp requests, 1-component jpegs return as 1-component,\n              on 'test' only check type, not whether we support this variant\n      0.50    first released version\n*/\n"
  },
  {
    "path": "externals/stb/stb_truetype.h",
    "content": "// stb_truetype.h - v1.02 - public domain\n// authored from 2009-2014 by Sean Barrett / RAD Game Tools\n//\n//   This library processes TrueType files:\n//        parse files\n//        extract glyph metrics\n//        extract glyph shapes\n//        render glyphs to one-channel bitmaps with antialiasing (box filter)\n//\n//   Todo:\n//        non-MS cmaps\n//        crashproof on bad data\n//        hinting? (no longer patented)\n//        cleartype-style AA?\n//        optimize: use simple memory allocator for intermediates\n//        optimize: build edge-list directly from curves\n//        optimize: rasterize directly from curves?\n//\n// ADDITIONAL CONTRIBUTORS\n//\n//   Mikko Mononen: compound shape support, more cmap formats\n//   Tor Andersson: kerning, subpixel rendering\n//\n//   Bug/warning reports/fixes:\n//       \"Zer\" on mollyrocket (with fix)\n//       Cass Everitt\n//       stoiko (Haemimont Games)\n//       Brian Hook \n//       Walter van Niftrik\n//       David Gow\n//       David Given\n//       Ivan-Assen Ivanov\n//       Anthony Pesch\n//       Johan Duparc\n//       Hou Qiming\n//       Fabian \"ryg\" Giesen\n//\n//   Misc other:\n//       Ryan Gordon\n//\n// VERSION HISTORY\n//\n//   1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++\n//   1.01 (2014-12-08) fix subpixel position when oversampling to exactly match\n//                        non-oversampled; STBTT_POINT_SIZE for packed case only\n//   1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling\n//   0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg)\n//   0.9  (2014-08-07) support certain mac/iOS fonts without an MS platformID\n//   0.8b (2014-07-07) fix a warning\n//   0.8  (2014-05-25) fix a few more warnings\n//   0.7  (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back\n//   0.6c (2012-07-24) improve documentation\n//   0.6b (2012-07-20) fix a few more warnings\n//   0.6  (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels,\n//                        stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty\n//   0.5  (2011-12-09) bugfixes:\n//                        subpixel glyph renderer computed wrong bounding box\n//                        first vertex of shape can be off-curve (FreeSans)\n//   0.4b (2011-12-03) fixed an error in the font baking example\n//   0.4  (2011-12-01) kerning, subpixel rendering (tor)\n//                    bugfixes for:\n//                        codepoint-to-glyph conversion using table fmt=12\n//                        codepoint-to-glyph conversion using table fmt=4\n//                        stbtt_GetBakedQuad with non-square texture (Zer)\n//                    updated Hello World! sample to use kerning and subpixel\n//                    fixed some warnings\n//   0.3  (2009-06-24) cmap fmt=12, compound shapes (MM)\n//                    userdata, malloc-from-userdata, non-zero fill (stb)\n//   0.2  (2009-03-11) Fix unsigned/signed char warnings\n//   0.1  (2009-03-09) First public release\n//\n// LICENSE\n//\n//   This software is in the public domain. Where that dedication is not\n//   recognized, you are granted a perpetual, irrevokable license to copy\n//   and modify this file as you see fit.\n//\n// USAGE\n//\n//   Include this file in whatever places neeed to refer to it. In ONE C/C++\n//   file, write:\n//      #define STB_TRUETYPE_IMPLEMENTATION\n//   before the #include of this file. This expands out the actual\n//   implementation into that C/C++ file.\n//\n//   Simple 3D API (don't ship this, but it's fine for tools and quick start)\n//           stbtt_BakeFontBitmap()               -- bake a font to a bitmap for use as texture\n//           stbtt_GetBakedQuad()                 -- compute quad to draw for a given char\n//\n//   Improved 3D API (more shippable):\n//           #include \"stb_rect_pack.h\"           -- optional, but you really want it\n//           stbtt_PackBegin()\n//           stbtt_PackSetOversample()            -- for improved quality on small fonts\n//           stbtt_PackFontRanges()\n//           stbtt_PackEnd()\n//           stbtt_GetPackedQuad()\n//\n//   \"Load\" a font file from a memory buffer (you have to keep the buffer loaded)\n//           stbtt_InitFont()\n//           stbtt_GetFontOffsetForIndex()        -- use for TTC font collections\n//\n//   Render a unicode codepoint to a bitmap\n//           stbtt_GetCodepointBitmap()           -- allocates and returns a bitmap\n//           stbtt_MakeCodepointBitmap()          -- renders into bitmap you provide\n//           stbtt_GetCodepointBitmapBox()        -- how big the bitmap must be\n//\n//   Character advance/positioning\n//           stbtt_GetCodepointHMetrics()\n//           stbtt_GetFontVMetrics()\n//           stbtt_GetCodepointKernAdvance()\n//\n// ADDITIONAL DOCUMENTATION\n//\n//   Immediately after this block comment are a series of sample programs.\n//\n//   After the sample programs is the \"header file\" section. This section\n//   includes documentation for each API function.\n//\n//   Some important concepts to understand to use this library:\n//\n//      Codepoint\n//         Characters are defined by unicode codepoints, e.g. 65 is\n//         uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is\n//         the hiragana for \"ma\".\n//\n//      Glyph\n//         A visual character shape (every codepoint is rendered as\n//         some glyph)\n//\n//      Glyph index\n//         A font-specific integer ID representing a glyph\n//\n//      Baseline\n//         Glyph shapes are defined relative to a baseline, which is the\n//         bottom of uppercase characters. Characters extend both above\n//         and below the baseline.\n//\n//      Current Point\n//         As you draw text to the screen, you keep track of a \"current point\"\n//         which is the origin of each character. The current point's vertical\n//         position is the baseline. Even \"baked fonts\" use this model.\n//\n//      Vertical Font Metrics\n//         The vertical qualities of the font, used to vertically position\n//         and space the characters. See docs for stbtt_GetFontVMetrics.\n//\n//      Font Size in Pixels or Points\n//         The preferred interface for specifying font sizes in stb_truetype\n//         is to specify how tall the font's vertical extent should be in pixels.\n//         If that sounds good enough, skip the next paragraph.\n//\n//         Most font APIs instead use \"points\", which are a common typographic\n//         measurement for describing font size, defined as 72 points per inch.\n//         stb_truetype provides a point API for compatibility. However, true\n//         \"per inch\" conventions don't make much sense on computer displays\n//         since they different monitors have different number of pixels per\n//         inch. For example, Windows traditionally uses a convention that\n//         there are 96 pixels per inch, thus making 'inch' measurements have\n//         nothing to do with inches, and thus effectively defining a point to\n//         be 1.333 pixels. Additionally, the TrueType font data provides\n//         an explicit scale factor to scale a given font's glyphs to points,\n//         but the author has observed that this scale factor is often wrong\n//         for non-commercial fonts, thus making fonts scaled in points\n//         according to the TrueType spec incoherently sized in practice.\n//\n// ADVANCED USAGE\n//\n//   Quality:\n//\n//    - Use the functions with Subpixel at the end to allow your characters\n//      to have subpixel positioning. Since the font is anti-aliased, not\n//      hinted, this is very import for quality. (This is not possible with\n//      baked fonts.)\n//\n//    - Kerning is now supported, and if you're supporting subpixel rendering\n//      then kerning is worth using to give your text a polished look.\n//\n//   Performance:\n//\n//    - Convert Unicode codepoints to glyph indexes and operate on the glyphs;\n//      if you don't do this, stb_truetype is forced to do the conversion on\n//      every call.\n//\n//    - There are a lot of memory allocations. We should modify it to take\n//      a temp buffer and allocate from the temp buffer (without freeing),\n//      should help performance a lot.\n//\n// NOTES\n//\n//   The system uses the raw data found in the .ttf file without changing it\n//   and without building auxiliary data structures. This is a bit inefficient\n//   on little-endian systems (the data is big-endian), but assuming you're\n//   caching the bitmaps or glyph shapes this shouldn't be a big deal.\n//\n//   It appears to be very hard to programmatically determine what font a\n//   given file is in a general way. I provide an API for this, but I don't\n//   recommend it.\n//\n//\n// SOURCE STATISTICS (based on v0.6c, 2050 LOC)\n//\n//   Documentation & header file        520 LOC  \\___ 660 LOC documentation\n//   Sample code                        140 LOC  /\n//   Truetype parsing                   620 LOC  ---- 620 LOC TrueType\n//   Software rasterization             240 LOC  \\                           .\n//   Curve tesselation                  120 LOC   \\__ 550 LOC Bitmap creation\n//   Bitmap management                  100 LOC   /\n//   Baked bitmap interface              70 LOC  /\n//   Font name matching & access        150 LOC  ---- 150 \n//   C runtime library abstraction       60 LOC  ----  60\n\n\n//////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////\n////\n////  SAMPLE PROGRAMS\n////\n//\n//  Incomplete text-in-3d-api example, which draws quads properly aligned to be lossless\n//\n#if 0\n#define STB_TRUETYPE_IMPLEMENTATION  // force following include to generate implementation\n#include \"stb_truetype.h\"\n\nchar ttf_buffer[1<<20];\nunsigned char temp_bitmap[512*512];\n\nstbtt_bakedchar cdata[96]; // ASCII 32..126 is 95 glyphs\nGLstbtt_uint ftex;\n\nvoid my_stbtt_initfont(void)\n{\n   fread(ttf_buffer, 1, 1<<20, fopen(\"c:/windows/fonts/times.ttf\", \"rb\"));\n   stbtt_BakeFontBitmap(data,0, 32.0, temp_bitmap,512,512, 32,96, cdata); // no guarantee this fits!\n   // can free ttf_buffer at this point\n   glGenTextures(1, &ftex);\n   glBindTexture(GL_TEXTURE_2D, ftex);\n   glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 512,512, 0, GL_ALPHA, GL_UNSIGNED_BYTE, temp_bitmap);\n   // can free temp_bitmap at this point\n   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n}\n\nvoid my_stbtt_print(float x, float y, char *text)\n{\n   // assume orthographic projection with units = screen pixels, origin at top left\n   glBindTexture(GL_TEXTURE_2D, ftex);\n   glBegin(GL_QUADS);\n   while (*text) {\n      if (*text >= 32 && *text < 128) {\n         stbtt_aligned_quad q;\n         stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl & d3d10+,0=d3d9\n         glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y0);\n         glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y0);\n         glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y1);\n         glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y1);\n      }\n      ++text;\n   }\n   glEnd();\n}\n#endif\n//\n//\n//////////////////////////////////////////////////////////////////////////////\n//\n// Complete program (this compiles): get a single bitmap, print as ASCII art\n//\n#if 0\n#include <stdio.h>\n#define STB_TRUETYPE_IMPLEMENTATION  // force following include to generate implementation\n#include \"stb_truetype.h\"\n\nchar ttf_buffer[1<<25];\n\nint main(int argc, char **argv)\n{\n   stbtt_fontinfo font;\n   unsigned char *bitmap;\n   int w,h,i,j,c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20);\n\n   fread(ttf_buffer, 1, 1<<25, fopen(argc > 3 ? argv[3] : \"c:/windows/fonts/arialbd.ttf\", \"rb\"));\n\n   stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer,0));\n   bitmap = stbtt_GetCodepointBitmap(&font, 0,stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0,0);\n\n   for (j=0; j < h; ++j) {\n      for (i=0; i < w; ++i)\n         putchar(\" .:ioVM@\"[bitmap[j*w+i]>>5]);\n      putchar('\\n');\n   }\n   return 0;\n}\n#endif \n//\n// Output:\n//\n//     .ii.\n//    @@@@@@.\n//   V@Mio@@o\n//   :i.  V@V\n//     :oM@@M\n//   :@@@MM@M\n//   @@o  o@M\n//  :@@.  M@M\n//   @@@o@@@@\n//   :M@@V:@@.\n//  \n//////////////////////////////////////////////////////////////////////////////\n// \n// Complete program: print \"Hello World!\" banner, with bugs\n//\n#if 0\nchar buffer[24<<20];\nunsigned char screen[20][79];\n\nint main(int arg, char **argv)\n{\n   stbtt_fontinfo font;\n   int i,j,ascent,baseline,ch=0;\n   float scale, xpos=2; // leave a little padding in case the character extends left\n   char *text = \"Heljo World!\";\n\n   fread(buffer, 1, 1000000, fopen(\"c:/windows/fonts/arialbd.ttf\", \"rb\"));\n   stbtt_InitFont(&font, buffer, 0);\n\n   scale = stbtt_ScaleForPixelHeight(&font, 15);\n   stbtt_GetFontVMetrics(&font, &ascent,0,0);\n   baseline = (int) (ascent*scale);\n\n   while (text[ch]) {\n      int advance,lsb,x0,y0,x1,y1;\n      float x_shift = xpos - (float) floor(xpos);\n      stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb);\n      stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale,scale,x_shift,0, &x0,&y0,&x1,&y1);\n      stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int) xpos + x0], x1-x0,y1-y0, 79, scale,scale,x_shift,0, text[ch]);\n      // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong\n      // because this API is really for baking character bitmaps into textures. if you want to render\n      // a sequence of characters, you really need to render each bitmap to a temp buffer, then\n      // \"alpha blend\" that into the working buffer\n      xpos += (advance * scale);\n      if (text[ch+1])\n         xpos += scale*stbtt_GetCodepointKernAdvance(&font, text[ch],text[ch+1]);\n      ++ch;\n   }\n\n   for (j=0; j < 20; ++j) {\n      for (i=0; i < 78; ++i)\n         putchar(\" .:ioVM@\"[screen[j][i]>>5]);\n      putchar('\\n');\n   }\n\n   return 0;\n}\n#endif\n\n\n//////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////\n////\n////   INTEGRATION WITH YOUR CODEBASE\n////\n////   The following sections allow you to supply alternate definitions\n////   of C library functions used by stb_truetype.\n\n#ifdef STB_TRUETYPE_IMPLEMENTATION\n   // #define your own (u)stbtt_int8/16/32 before including to override this\n   #ifndef stbtt_uint8\n   typedef unsigned char   stbtt_uint8;\n   typedef signed   char   stbtt_int8;\n   typedef unsigned short  stbtt_uint16;\n   typedef signed   short  stbtt_int16;\n   typedef unsigned int    stbtt_uint32;\n   typedef signed   int    stbtt_int32;\n   #endif\n\n   typedef char stbtt__check_size32[sizeof(stbtt_int32)==4 ? 1 : -1];\n   typedef char stbtt__check_size16[sizeof(stbtt_int16)==2 ? 1 : -1];\n\n   // #define your own STBTT_sort() to override this to avoid qsort\n   #ifndef STBTT_sort\n   #include <stdlib.h>\n   #define STBTT_sort(data,num_items,item_size,compare_func)   qsort(data,num_items,item_size,compare_func)\n   #endif\n\n   // #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h\n   #ifndef STBTT_ifloor\n   #include <math.h>\n   #define STBTT_ifloor(x)   ((int) floor(x))\n   #define STBTT_iceil(x)    ((int) ceil(x))\n   #endif\n\n   #ifndef STBTT_sqrt\n   #include <math.h>\n   #define STBTT_sqrt(x)      sqrt(x)\n   #endif\n\n   // #define your own functions \"STBTT_malloc\" / \"STBTT_free\" to avoid malloc.h\n   #ifndef STBTT_malloc\n   #include <stdlib.h>\n   #define STBTT_malloc(x,u)  ((void)(u),malloc(x))\n   #define STBTT_free(x,u)    ((void)(u),free(x))\n   #endif\n\n   #ifndef STBTT_assert\n   #include <assert.h>\n   #define STBTT_assert(x)    assert(x)\n   #endif\n\n   #ifndef STBTT_strlen\n   #include <string.h>\n   #define STBTT_strlen(x)    strlen(x)\n   #endif\n\n   #ifndef STBTT_memcpy\n   #include <memory.h>\n   #define STBTT_memcpy       memcpy\n   #define STBTT_memset       memset\n   #endif\n#endif\n\n///////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////\n////\n////   INTERFACE\n////\n////\n\n#ifndef __STB_INCLUDE_STB_TRUETYPE_H__\n#define __STB_INCLUDE_STB_TRUETYPE_H__\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// TEXTURE BAKING API\n//\n// If you use this API, you only have to call two functions ever.\n//\n\ntypedef struct\n{\n   unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap\n   float xoff,yoff,xadvance;\n} stbtt_bakedchar;\n\nextern int stbtt_BakeFontBitmap(const unsigned char *data, int offset,  // font location (use offset=0 for plain .ttf)\n                                float pixel_height,                     // height of font in pixels\n                                unsigned char *pixels, int pw, int ph,  // bitmap to be filled in\n                                int first_char, int num_chars,          // characters to bake\n                                stbtt_bakedchar *chardata);             // you allocate this, it's num_chars long\n// if return is positive, the first unused row of the bitmap\n// if return is negative, returns the negative of the number of characters that fit\n// if return is 0, no characters fit and no rows were used\n// This uses a very crappy packing.\n\ntypedef struct\n{\n   float x0,y0,s0,t0; // top-left\n   float x1,y1,s1,t1; // bottom-right\n} stbtt_aligned_quad;\n\nextern void stbtt_GetBakedQuad(stbtt_bakedchar *chardata, int pw, int ph,  // same data as above\n                               int char_index,             // character to display\n                               float *xpos, float *ypos,   // pointers to current position in screen pixel space\n                               stbtt_aligned_quad *q,      // output: quad to draw\n                               int opengl_fillrule);       // true if opengl fill rule; false if DX9 or earlier\n// Call GetBakedQuad with char_index = 'character - first_char', and it\n// creates the quad you need to draw and advances the current position.\n//\n// The coordinate system used assumes y increases downwards.\n//\n// Characters will extend both above and below the current position;\n// see discussion of \"BASELINE\" above.\n//\n// It's inefficient; you might want to c&p it and optimize it.\n\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// NEW TEXTURE BAKING API\n//\n// This provides options for packing multiple fonts into one atlas, not\n// perfectly but better than nothing.\n\ntypedef struct\n{\n   unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap\n   float xoff,yoff,xadvance;\n   float xoff2,yoff2;\n} stbtt_packedchar;\n\ntypedef struct stbtt_pack_context stbtt_pack_context;\n\nextern int  stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int width, int height, int stride_in_bytes, int padding, void *alloc_context);\n// Initializes a packing context stored in the passed-in stbtt_pack_context.\n// Future calls using this context will pack characters into the bitmap passed\n// in here: a 1-channel bitmap that is weight x height. stride_in_bytes is\n// the distance from one row to the next (or 0 to mean they are packed tightly\n// together). \"padding\" is // the amount of padding to leave between each\n// character (normally you want '1' for bitmaps you'll use as textures with\n// bilinear filtering).\n//\n// Returns 0 on failure, 1 on success.\n\nextern void stbtt_PackEnd  (stbtt_pack_context *spc);\n// Cleans up the packing context and frees all memory.\n\n#define STBTT_POINT_SIZE(x)   (-(x))\n\nextern int  stbtt_PackFontRange(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, float font_size,\n                                int first_unicode_char_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range);\n// Creates character bitmaps from the font_index'th font found in fontdata (use\n// font_index=0 if you don't know what that is). It creates num_chars_in_range\n// bitmaps for characters with unicode values starting at first_unicode_char_in_range\n// and increasing. Data for how to render them is stored in chardata_for_range;\n// pass these to stbtt_GetPackedQuad to get back renderable quads.\n//\n// font_size is the full height of the character from ascender to descender,\n// as computed by stbtt_ScaleForPixelHeight. To use a point size as computed\n// by stbtt_ScaleForMappingEmToPixels, wrap the point size in STBTT_POINT_SIZE()\n// and pass that result as 'font_size':\n//       ...,                  20 , ... // font max minus min y is 20 pixels tall\n//       ..., STBTT_POINT_SIZE(20), ... // 'M' is 20 pixels tall\n\ntypedef struct\n{\n   float font_size;\n   int first_unicode_char_in_range;\n   int num_chars_in_range;\n   stbtt_packedchar *chardata_for_range; // output\n} stbtt_pack_range;\n\nextern int  stbtt_PackFontRanges(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges);\n// Creates character bitmaps from multiple ranges of characters stored in\n// ranges. This will usually create a better-packed bitmap than multiple\n// calls to stbtt_PackFontRange.\n\n\nextern void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample);\n// Oversampling a font increases the quality by allowing higher-quality subpixel\n// positioning, and is especially valuable at smaller text sizes.\n//\n// This function sets the amount of oversampling for all following calls to\n// stbtt_PackFontRange(s). The default (no oversampling) is achieved by\n// h_oversample=1, v_oversample=1. The total number of pixels required is\n// h_oversample*v_oversample larger than the default; for example, 2x2\n// oversampling requires 4x the storage of 1x1. For best results, render\n// oversampled textures with bilinear filtering. Look at the readme in\n// stb/tests/oversample for information about oversampled fonts\n\nextern void stbtt_GetPackedQuad(stbtt_packedchar *chardata, int pw, int ph,  // same data as above\n                               int char_index,             // character to display\n                               float *xpos, float *ypos,   // pointers to current position in screen pixel space\n                               stbtt_aligned_quad *q,      // output: quad to draw\n                               int align_to_integer);\n\n// this is an opaque structure that you shouldn't mess with which holds\n// all the context needed from PackBegin to PackEnd.\nstruct stbtt_pack_context {\n   void *user_allocator_context;\n   void *pack_info;\n   int   width;\n   int   height;\n   int   stride_in_bytes;\n   int   padding;\n   unsigned int   h_oversample, v_oversample;\n   unsigned char *pixels;\n   void  *nodes;\n};\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// FONT LOADING\n//\n//\n\nextern int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index);\n// Each .ttf/.ttc file may have more than one font. Each font has a sequential\n// index number starting from 0. Call this function to get the font offset for\n// a given index; it returns -1 if the index is out of range. A regular .ttf\n// file will only define one font and it always be at offset 0, so it will\n// return '0' for index 0, and -1 for all other indices. You can just skip\n// this step if you know it's that kind of font.\n\n\n// The following structure is defined publically so you can declare one on\n// the stack or as a global or etc, but you should treat it as opaque.\ntypedef struct stbtt_fontinfo\n{\n   void           * userdata;\n   unsigned char  * data;              // pointer to .ttf file\n   int              fontstart;         // offset of start of font\n\n   int numGlyphs;                     // number of glyphs, needed for range checking\n\n   int loca,head,glyf,hhea,hmtx,kern; // table locations as offset from start of .ttf\n   int index_map;                     // a cmap mapping for our chosen character encoding\n   int indexToLocFormat;              // format needed to map from glyph index to glyph\n} stbtt_fontinfo;\n\nextern int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset);\n// Given an offset into the file that defines a font, this function builds\n// the necessary cached info for the rest of the system. You must allocate\n// the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't\n// need to do anything special to free it, because the contents are pure\n// value data with no additional data structures. Returns 0 on failure.\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// CHARACTER TO GLYPH-INDEX CONVERSIOn\n\nint stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint);\n// If you're going to perform multiple operations on the same character\n// and you want a speed-up, call this function with the character you're\n// going to process, then use glyph-based functions instead of the\n// codepoint-based functions.\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// CHARACTER PROPERTIES\n//\n\nextern float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float pixels);\n// computes a scale factor to produce a font whose \"height\" is 'pixels' tall.\n// Height is measured as the distance from the highest ascender to the lowest\n// descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics\n// and computing:\n//       scale = pixels / (ascent - descent)\n// so if you prefer to measure height by the ascent only, use a similar calculation.\n\nextern float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels);\n// computes a scale factor to produce a font whose EM size is mapped to\n// 'pixels' tall. This is probably what traditional APIs compute, but\n// I'm not positive.\n\nextern void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap);\n// ascent is the coordinate above the baseline the font extends; descent\n// is the coordinate below the baseline the font extends (i.e. it is typically negative)\n// lineGap is the spacing between one row's descent and the next row's ascent...\n// so you should advance the vertical position by \"*ascent - *descent + *lineGap\"\n//   these are expressed in unscaled coordinates, so you must multiply by\n//   the scale factor for a given size\n\nextern void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1);\n// the bounding box around all possible characters\n\nextern void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing);\n// leftSideBearing is the offset from the current horizontal position to the left edge of the character\n// advanceWidth is the offset from the current horizontal position to the next horizontal position\n//   these are expressed in unscaled coordinates\n\nextern int  stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2);\n// an additional amount to add to the 'advance' value between ch1 and ch2\n\nextern int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1);\n// Gets the bounding box of the visible part of the glyph, in unscaled coordinates\n\nextern void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing);\nextern int  stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2);\nextern int  stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1);\n// as above, but takes one or more glyph indices for greater efficiency\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// GLYPH SHAPES (you probably don't need these, but they have to go before\n// the bitmaps for C declaration-order reasons)\n//\n\n#ifndef STBTT_vmove // you can predefine these to use different values (but why?)\n   enum {\n      STBTT_vmove=1,\n      STBTT_vline,\n      STBTT_vcurve\n   };\n#endif\n\n#ifndef stbtt_vertex // you can predefine this to use different values\n                   // (we share this with other code at RAD)\n   #define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file\n   typedef struct\n   {\n      stbtt_vertex_type x,y,cx,cy;\n      unsigned char type,padding;\n   } stbtt_vertex;\n#endif\n\nextern int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index);\n// returns non-zero if nothing is drawn for this glyph\n\nextern int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices);\nextern int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **vertices);\n// returns # of vertices and fills *vertices with the pointer to them\n//   these are expressed in \"unscaled\" coordinates\n//\n// The shape is a series of countours. Each one starts with\n// a STBTT_moveto, then consists of a series of mixed\n// STBTT_lineto and STBTT_curveto segments. A lineto\n// draws a line from previous endpoint to its x,y; a curveto\n// draws a quadratic bezier from previous endpoint to\n// its x,y, using cx,cy as the bezier control point.\n\nextern void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices);\n// frees the data allocated above\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// BITMAP RENDERING\n//\n\nextern void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata);\n// frees the bitmap allocated below\n\nextern unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff);\n// allocates a large-enough single-channel 8bpp bitmap and renders the\n// specified character/glyph at the specified scale into it, with\n// antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque).\n// *width & *height are filled out with the width & height of the bitmap,\n// which is stored left-to-right, top-to-bottom.\n//\n// xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap\n\nextern unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff);\n// the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel\n// shift for the character\n\nextern void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint);\n// the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap\n// in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap\n// is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the\n// width and height and positioning info for it first.\n\nextern void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint);\n// same as stbtt_MakeCodepointBitmap, but you can specify a subpixel\n// shift for the character\n\nextern void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1);\n// get the bbox of the bitmap centered around the glyph origin; so the\n// bitmap width is ix1-ix0, height is iy1-iy0, and location to place\n// the bitmap top left is (leftSideBearing*scale,iy0).\n// (Note that the bitmap uses y-increases-down, but the shape uses\n// y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.)\n\nextern void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1);\n// same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel\n// shift for the character\n\n// the following functions are equivalent to the above functions, but operate\n// on glyph indices instead of Unicode codepoints (for efficiency)\nextern unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff);\nextern unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff);\nextern void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph);\nextern void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph);\nextern void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1);\nextern void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1);\n\n\n// @TODO: don't expose this structure\ntypedef struct\n{\n   int w,h,stride;\n   unsigned char *pixels;\n} stbtt__bitmap;\n\nextern void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata);\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// Finding the right font...\n//\n// You should really just solve this offline, keep your own tables\n// of what font is what, and don't try to get it out of the .ttf file.\n// That's because getting it out of the .ttf file is really hard, because\n// the names in the file can appear in many possible encodings, in many\n// possible languages, and e.g. if you need a case-insensitive comparison,\n// the details of that depend on the encoding & language in a complex way\n// (actually underspecified in truetype, but also gigantic).\n//\n// But you can use the provided functions in two possible ways:\n//     stbtt_FindMatchingFont() will use *case-sensitive* comparisons on\n//             unicode-encoded names to try to find the font you want;\n//             you can run this before calling stbtt_InitFont()\n//\n//     stbtt_GetFontNameString() lets you get any of the various strings\n//             from the file yourself and do your own comparisons on them.\n//             You have to have called stbtt_InitFont() first.\n\n\nextern int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags);\n// returns the offset (not index) of the font that matches, or -1 if none\n//   if you use STBTT_MACSTYLE_DONTCARE, use a font name like \"Arial Bold\".\n//   if you use any other flag, use a font name like \"Arial\"; this checks\n//     the 'macStyle' header field; i don't know if fonts set this consistently\n#define STBTT_MACSTYLE_DONTCARE     0\n#define STBTT_MACSTYLE_BOLD         1\n#define STBTT_MACSTYLE_ITALIC       2\n#define STBTT_MACSTYLE_UNDERSCORE   4\n#define STBTT_MACSTYLE_NONE         8   // <= not same as 0, this makes us check the bitfield is 0\n\nextern int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2);\n// returns 1/0 whether the first string interpreted as utf8 is identical to\n// the second string interpreted as big-endian utf16... useful for strings from next func\n\nextern const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID);\n// returns the string (which may be big-endian double byte, e.g. for unicode)\n// and puts the length in bytes in *length.\n//\n// some of the values for the IDs are below; for more see the truetype spec:\n//     http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html\n//     http://www.microsoft.com/typography/otspec/name.htm\n\nenum { // platformID\n   STBTT_PLATFORM_ID_UNICODE   =0,\n   STBTT_PLATFORM_ID_MAC       =1,\n   STBTT_PLATFORM_ID_ISO       =2,\n   STBTT_PLATFORM_ID_MICROSOFT =3\n};\n\nenum { // encodingID for STBTT_PLATFORM_ID_UNICODE\n   STBTT_UNICODE_EID_UNICODE_1_0    =0,\n   STBTT_UNICODE_EID_UNICODE_1_1    =1,\n   STBTT_UNICODE_EID_ISO_10646      =2,\n   STBTT_UNICODE_EID_UNICODE_2_0_BMP=3,\n   STBTT_UNICODE_EID_UNICODE_2_0_FULL=4\n};\n\nenum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT\n   STBTT_MS_EID_SYMBOL        =0,\n   STBTT_MS_EID_UNICODE_BMP   =1,\n   STBTT_MS_EID_SHIFTJIS      =2,\n   STBTT_MS_EID_UNICODE_FULL  =10\n};\n\nenum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes\n   STBTT_MAC_EID_ROMAN        =0,   STBTT_MAC_EID_ARABIC       =4,\n   STBTT_MAC_EID_JAPANESE     =1,   STBTT_MAC_EID_HEBREW       =5,\n   STBTT_MAC_EID_CHINESE_TRAD =2,   STBTT_MAC_EID_GREEK        =6,\n   STBTT_MAC_EID_KOREAN       =3,   STBTT_MAC_EID_RUSSIAN      =7\n};\n\nenum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID...\n       // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs\n   STBTT_MS_LANG_ENGLISH     =0x0409,   STBTT_MS_LANG_ITALIAN     =0x0410,\n   STBTT_MS_LANG_CHINESE     =0x0804,   STBTT_MS_LANG_JAPANESE    =0x0411,\n   STBTT_MS_LANG_DUTCH       =0x0413,   STBTT_MS_LANG_KOREAN      =0x0412,\n   STBTT_MS_LANG_FRENCH      =0x040c,   STBTT_MS_LANG_RUSSIAN     =0x0419,\n   STBTT_MS_LANG_GERMAN      =0x0407,   STBTT_MS_LANG_SPANISH     =0x0409,\n   STBTT_MS_LANG_HEBREW      =0x040d,   STBTT_MS_LANG_SWEDISH     =0x041D\n};\n\nenum { // languageID for STBTT_PLATFORM_ID_MAC\n   STBTT_MAC_LANG_ENGLISH      =0 ,   STBTT_MAC_LANG_JAPANESE     =11,\n   STBTT_MAC_LANG_ARABIC       =12,   STBTT_MAC_LANG_KOREAN       =23,\n   STBTT_MAC_LANG_DUTCH        =4 ,   STBTT_MAC_LANG_RUSSIAN      =32,\n   STBTT_MAC_LANG_FRENCH       =1 ,   STBTT_MAC_LANG_SPANISH      =6 ,\n   STBTT_MAC_LANG_GERMAN       =2 ,   STBTT_MAC_LANG_SWEDISH      =5 ,\n   STBTT_MAC_LANG_HEBREW       =10,   STBTT_MAC_LANG_CHINESE_SIMPLIFIED =33,\n   STBTT_MAC_LANG_ITALIAN      =3 ,   STBTT_MAC_LANG_CHINESE_TRAD =19\n};\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // __STB_INCLUDE_STB_TRUETYPE_H__\n\n///////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////\n////\n////   IMPLEMENTATION\n////\n////\n\n#ifdef STB_TRUETYPE_IMPLEMENTATION\n\n#ifndef STBTT_MAX_OVERSAMPLE\n#define STBTT_MAX_OVERSAMPLE   8\n#endif\n\ntypedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE-1)) == 0 ? 1 : -1];\n\n//////////////////////////////////////////////////////////////////////////\n//\n// accessors to parse data from file\n//\n\n// on platforms that don't allow misaligned reads, if we want to allow\n// truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE\n\n#define ttBYTE(p)     (* (stbtt_uint8 *) (p))\n#define ttCHAR(p)     (* (stbtt_int8 *) (p))\n#define ttFixed(p)    ttLONG(p)\n\n#if defined(STB_TRUETYPE_BIGENDIAN) && !defined(ALLOW_UNALIGNED_TRUETYPE)\n\n   #define ttUSHORT(p)   (* (stbtt_uint16 *) (p))\n   #define ttSHORT(p)    (* (stbtt_int16 *) (p))\n   #define ttULONG(p)    (* (stbtt_uint32 *) (p))\n   #define ttLONG(p)     (* (stbtt_int32 *) (p))\n\n#else\n\n   stbtt_uint16 ttUSHORT(const stbtt_uint8 *p) { return p[0]*256 + p[1]; }\n   stbtt_int16 ttSHORT(const stbtt_uint8 *p)   { return p[0]*256 + p[1]; }\n   stbtt_uint32 ttULONG(const stbtt_uint8 *p)  { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; }\n   stbtt_int32 ttLONG(const stbtt_uint8 *p)    { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; }\n\n#endif\n\n#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3))\n#define stbtt_tag(p,str)           stbtt_tag4(p,str[0],str[1],str[2],str[3])\n\nstatic int stbtt__isfont(const stbtt_uint8 *font)\n{\n   // check the version number\n   if (stbtt_tag4(font, '1',0,0,0))  return 1; // TrueType 1\n   if (stbtt_tag(font, \"typ1\"))   return 1; // TrueType with type 1 font -- we don't support this!\n   if (stbtt_tag(font, \"OTTO\"))   return 1; // OpenType with CFF\n   if (stbtt_tag4(font, 0,1,0,0)) return 1; // OpenType 1.0\n   return 0;\n}\n\n// @OPTIMIZE: binary search\nstatic stbtt_uint32 stbtt__find_table(stbtt_uint8 *data, stbtt_uint32 fontstart, const char *tag)\n{\n   stbtt_int32 num_tables = ttUSHORT(data+fontstart+4);\n   stbtt_uint32 tabledir = fontstart + 12;\n   stbtt_int32 i;\n   for (i=0; i < num_tables; ++i) {\n      stbtt_uint32 loc = tabledir + 16*i;\n      if (stbtt_tag(data+loc+0, tag))\n         return ttULONG(data+loc+8);\n   }\n   return 0;\n}\n\nint stbtt_GetFontOffsetForIndex(const unsigned char *font_collection, int index)\n{\n   // if it's just a font, there's only one valid index\n   if (stbtt__isfont(font_collection))\n      return index == 0 ? 0 : -1;\n\n   // check if it's a TTC\n   if (stbtt_tag(font_collection, \"ttcf\")) {\n      // version 1?\n      if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) {\n         stbtt_int32 n = ttLONG(font_collection+8);\n         if (index >= n)\n            return -1;\n         return ttULONG(font_collection+12+index*14);\n      }\n   }\n   return -1;\n}\n\nint stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data2, int fontstart)\n{\n   stbtt_uint8 *data = (stbtt_uint8 *) data2;\n   stbtt_uint32 cmap, t;\n   stbtt_int32 i,numTables;\n\n   info->data = data;\n   info->fontstart = fontstart;\n\n   cmap = stbtt__find_table(data, fontstart, \"cmap\");       // required\n   info->loca = stbtt__find_table(data, fontstart, \"loca\"); // required\n   info->head = stbtt__find_table(data, fontstart, \"head\"); // required\n   info->glyf = stbtt__find_table(data, fontstart, \"glyf\"); // required\n   info->hhea = stbtt__find_table(data, fontstart, \"hhea\"); // required\n   info->hmtx = stbtt__find_table(data, fontstart, \"hmtx\"); // required\n   info->kern = stbtt__find_table(data, fontstart, \"kern\"); // not required\n   if (!cmap || !info->loca || !info->head || !info->glyf || !info->hhea || !info->hmtx)\n      return 0;\n\n   t = stbtt__find_table(data, fontstart, \"maxp\");\n   if (t)\n      info->numGlyphs = ttUSHORT(data+t+4);\n   else\n      info->numGlyphs = 0xffff;\n\n   // find a cmap encoding table we understand *now* to avoid searching\n   // later. (todo: could make this installable)\n   // the same regardless of glyph.\n   numTables = ttUSHORT(data + cmap + 2);\n   info->index_map = 0;\n   for (i=0; i < numTables; ++i) {\n      stbtt_uint32 encoding_record = cmap + 4 + 8 * i;\n      // find an encoding we understand:\n      switch(ttUSHORT(data+encoding_record)) {\n         case STBTT_PLATFORM_ID_MICROSOFT:\n            switch (ttUSHORT(data+encoding_record+2)) {\n               case STBTT_MS_EID_UNICODE_BMP:\n               case STBTT_MS_EID_UNICODE_FULL:\n                  // MS/Unicode\n                  info->index_map = cmap + ttULONG(data+encoding_record+4);\n                  break;\n            }\n            break;\n        case STBTT_PLATFORM_ID_UNICODE:\n            // Mac/iOS has these\n            // all the encodingIDs are unicode, so we don't bother to check it\n            info->index_map = cmap + ttULONG(data+encoding_record+4);\n            break;\n      }\n   }\n   if (info->index_map == 0)\n      return 0;\n\n   info->indexToLocFormat = ttUSHORT(data+info->head + 50);\n   return 1;\n}\n\nint stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint)\n{\n   stbtt_uint8 *data = info->data;\n   stbtt_uint32 index_map = info->index_map;\n\n   stbtt_uint16 format = ttUSHORT(data + index_map + 0);\n   if (format == 0) { // apple byte encoding\n      stbtt_int32 bytes = ttUSHORT(data + index_map + 2);\n      if (unicode_codepoint < bytes-6)\n         return ttBYTE(data + index_map + 6 + unicode_codepoint);\n      return 0;\n   } else if (format == 6) {\n      stbtt_uint32 first = ttUSHORT(data + index_map + 6);\n      stbtt_uint32 count = ttUSHORT(data + index_map + 8);\n      if ((stbtt_uint32) unicode_codepoint >= first && (stbtt_uint32) unicode_codepoint < first+count)\n         return ttUSHORT(data + index_map + 10 + (unicode_codepoint - first)*2);\n      return 0;\n   } else if (format == 2) {\n      STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean\n      return 0;\n   } else if (format == 4) { // standard mapping for windows fonts: binary search collection of ranges\n      stbtt_uint16 segcount = ttUSHORT(data+index_map+6) >> 1;\n      stbtt_uint16 searchRange = ttUSHORT(data+index_map+8) >> 1;\n      stbtt_uint16 entrySelector = ttUSHORT(data+index_map+10);\n      stbtt_uint16 rangeShift = ttUSHORT(data+index_map+12) >> 1;\n      stbtt_uint16 item, offset, start, end;\n\n      // do a binary search of the segments\n      stbtt_uint32 endCount = index_map + 14;\n      stbtt_uint32 search = endCount;\n\n      if (unicode_codepoint > 0xffff)\n         return 0;\n\n      // they lie from endCount .. endCount + segCount\n      // but searchRange is the nearest power of two, so...\n      if (unicode_codepoint >= ttUSHORT(data + search + rangeShift*2))\n         search += rangeShift*2;\n\n      // now decrement to bias correctly to find smallest\n      search -= 2;\n      while (entrySelector) {\n         searchRange >>= 1;\n         start = ttUSHORT(data + search + searchRange*2 + segcount*2 + 2);\n         end = ttUSHORT(data + search + searchRange*2);\n         if (unicode_codepoint > end)\n            search += searchRange*2;\n         --entrySelector;\n      }\n      search += 2;\n\n      item = (stbtt_uint16) ((search - endCount) >> 1);\n\n      STBTT_assert(unicode_codepoint <= ttUSHORT(data + endCount + 2*item));\n      start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item);\n      end = ttUSHORT(data + index_map + 14 + 2 + 2*item);\n      if (unicode_codepoint < start)\n         return 0;\n\n      offset = ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item);\n      if (offset == 0)\n         return (stbtt_uint16) (unicode_codepoint + ttSHORT(data + index_map + 14 + segcount*4 + 2 + 2*item));\n\n      return ttUSHORT(data + offset + (unicode_codepoint-start)*2 + index_map + 14 + segcount*6 + 2 + 2*item);\n   } else if (format == 12 || format == 13) {\n      stbtt_uint32 ngroups = ttULONG(data+index_map+12);\n      stbtt_int32 low,high;\n      low = 0; high = (stbtt_int32)ngroups;\n      // Binary search the right group.\n      while (low < high) {\n         stbtt_int32 mid = low + ((high-low) >> 1); // rounds down, so low <= mid < high\n         stbtt_uint32 start_char = ttULONG(data+index_map+16+mid*12);\n         stbtt_uint32 end_char = ttULONG(data+index_map+16+mid*12+4);\n         if ((stbtt_uint32) unicode_codepoint < start_char)\n            high = mid;\n         else if ((stbtt_uint32) unicode_codepoint > end_char)\n            low = mid+1;\n         else {\n            stbtt_uint32 start_glyph = ttULONG(data+index_map+16+mid*12+8);\n            if (format == 12)\n               return start_glyph + unicode_codepoint-start_char;\n            else // format == 13\n               return start_glyph;\n         }\n      }\n      return 0; // not found\n   }\n   // @TODO\n   STBTT_assert(0);\n   return 0;\n}\n\nint stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices)\n{\n   return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices);\n}\n\nstatic void stbtt_setvertex(stbtt_vertex *v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy)\n{\n   v->type = type;\n   v->x = (stbtt_int16) x;\n   v->y = (stbtt_int16) y;\n   v->cx = (stbtt_int16) cx;\n   v->cy = (stbtt_int16) cy;\n}\n\nstatic int stbtt__GetGlyfOffset(const stbtt_fontinfo *info, int glyph_index)\n{\n   int g1,g2;\n\n   if (glyph_index >= info->numGlyphs) return -1; // glyph index out of range\n   if (info->indexToLocFormat >= 2)    return -1; // unknown index->glyph map format\n\n   if (info->indexToLocFormat == 0) {\n      g1 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2) * 2;\n      g2 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2;\n   } else {\n      g1 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4);\n      g2 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4 + 4);\n   }\n\n   return g1==g2 ? -1 : g1; // if length is 0, return -1\n}\n\nint stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1)\n{\n   int g = stbtt__GetGlyfOffset(info, glyph_index);\n   if (g < 0) return 0;\n\n   if (x0) *x0 = ttSHORT(info->data + g + 2);\n   if (y0) *y0 = ttSHORT(info->data + g + 4);\n   if (x1) *x1 = ttSHORT(info->data + g + 6);\n   if (y1) *y1 = ttSHORT(info->data + g + 8);\n   return 1;\n}\n\nint stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1)\n{\n   return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info,codepoint), x0,y0,x1,y1);\n}\n\nint stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index)\n{\n   stbtt_int16 numberOfContours;\n   int g = stbtt__GetGlyfOffset(info, glyph_index);\n   if (g < 0) return 1;\n   numberOfContours = ttSHORT(info->data + g);\n   return numberOfContours == 0;\n}\n\nstatic int stbtt__close_shape(stbtt_vertex *vertices, int num_vertices, int was_off, int start_off,\n    stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy)\n{\n   if (start_off) {\n      if (was_off)\n         stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+scx)>>1, (cy+scy)>>1, cx,cy);\n      stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx,sy,scx,scy);\n   } else {\n      if (was_off)\n         stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve,sx,sy,cx,cy);\n      else\n         stbtt_setvertex(&vertices[num_vertices++], STBTT_vline,sx,sy,0,0);\n   }\n   return num_vertices;\n}\n\nint stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices)\n{\n   stbtt_int16 numberOfContours;\n   stbtt_uint8 *endPtsOfContours;\n   stbtt_uint8 *data = info->data;\n   stbtt_vertex *vertices=0;\n   int num_vertices=0;\n   int g = stbtt__GetGlyfOffset(info, glyph_index);\n\n   *pvertices = NULL;\n\n   if (g < 0) return 0;\n\n   numberOfContours = ttSHORT(data + g);\n\n   if (numberOfContours > 0) {\n      stbtt_uint8 flags=0,flagcount;\n      stbtt_int32 ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0;\n      stbtt_int32 x,y,cx,cy,sx,sy, scx,scy;\n      stbtt_uint8 *points;\n      endPtsOfContours = (data + g + 10);\n      ins = ttUSHORT(data + g + 10 + numberOfContours * 2);\n      points = data + g + 10 + numberOfContours * 2 + 2 + ins;\n\n      n = 1+ttUSHORT(endPtsOfContours + numberOfContours*2-2);\n\n      m = n + 2*numberOfContours;  // a loose bound on how many vertices we might need\n      vertices = (stbtt_vertex *) STBTT_malloc(m * sizeof(vertices[0]), info->userdata);\n      if (vertices == 0)\n         return 0;\n\n      next_move = 0;\n      flagcount=0;\n\n      // in first pass, we load uninterpreted data into the allocated array\n      // above, shifted to the end of the array so we won't overwrite it when\n      // we create our final data starting from the front\n\n      off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated\n\n      // first load flags\n\n      for (i=0; i < n; ++i) {\n         if (flagcount == 0) {\n            flags = *points++;\n            if (flags & 8)\n               flagcount = *points++;\n         } else\n            --flagcount;\n         vertices[off+i].type = flags;\n      }\n\n      // now load x coordinates\n      x=0;\n      for (i=0; i < n; ++i) {\n         flags = vertices[off+i].type;\n         if (flags & 2) {\n            stbtt_int16 dx = *points++;\n            x += (flags & 16) ? dx : -dx; // ???\n         } else {\n            if (!(flags & 16)) {\n               x = x + (stbtt_int16) (points[0]*256 + points[1]);\n               points += 2;\n            }\n         }\n         vertices[off+i].x = (stbtt_int16) x;\n      }\n\n      // now load y coordinates\n      y=0;\n      for (i=0; i < n; ++i) {\n         flags = vertices[off+i].type;\n         if (flags & 4) {\n            stbtt_int16 dy = *points++;\n            y += (flags & 32) ? dy : -dy; // ???\n         } else {\n            if (!(flags & 32)) {\n               y = y + (stbtt_int16) (points[0]*256 + points[1]);\n               points += 2;\n            }\n         }\n         vertices[off+i].y = (stbtt_int16) y;\n      }\n\n      // now convert them to our format\n      num_vertices=0;\n      sx = sy = cx = cy = scx = scy = 0;\n      for (i=0; i < n; ++i) {\n         flags = vertices[off+i].type;\n         x     = (stbtt_int16) vertices[off+i].x;\n         y     = (stbtt_int16) vertices[off+i].y;\n\n         if (next_move == i) {\n            if (i != 0)\n               num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy);\n\n            // now start the new one               \n            start_off = !(flags & 1);\n            if (start_off) {\n               // if we start off with an off-curve point, then when we need to find a point on the curve\n               // where we can start, and we need to save some state for when we wraparound.\n               scx = x;\n               scy = y;\n               if (!(vertices[off+i+1].type & 1)) {\n                  // next point is also a curve point, so interpolate an on-point curve\n                  sx = (x + (stbtt_int32) vertices[off+i+1].x) >> 1;\n                  sy = (y + (stbtt_int32) vertices[off+i+1].y) >> 1;\n               } else {\n                  // otherwise just use the next point as our start point\n                  sx = (stbtt_int32) vertices[off+i+1].x;\n                  sy = (stbtt_int32) vertices[off+i+1].y;\n                  ++i; // we're using point i+1 as the starting point, so skip it\n               }\n            } else {\n               sx = x;\n               sy = y;\n            }\n            stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove,sx,sy,0,0);\n            was_off = 0;\n            next_move = 1 + ttUSHORT(endPtsOfContours+j*2);\n            ++j;\n         } else {\n            if (!(flags & 1)) { // if it's a curve\n               if (was_off) // two off-curve control points in a row means interpolate an on-curve midpoint\n                  stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+x)>>1, (cy+y)>>1, cx, cy);\n               cx = x;\n               cy = y;\n               was_off = 1;\n            } else {\n               if (was_off)\n                  stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x,y, cx, cy);\n               else\n                  stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x,y,0,0);\n               was_off = 0;\n            }\n         }\n      }\n      num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy);\n   } else if (numberOfContours == -1) {\n      // Compound shapes.\n      int more = 1;\n      stbtt_uint8 *comp = data + g + 10;\n      num_vertices = 0;\n      vertices = 0;\n      while (more) {\n         stbtt_uint16 flags, gidx;\n         int comp_num_verts = 0, i;\n         stbtt_vertex *comp_verts = 0, *tmp = 0;\n         float mtx[6] = {1,0,0,1,0,0}, m, n;\n         \n         flags = ttSHORT(comp); comp+=2;\n         gidx = ttSHORT(comp); comp+=2;\n\n         if (flags & 2) { // XY values\n            if (flags & 1) { // shorts\n               mtx[4] = ttSHORT(comp); comp+=2;\n               mtx[5] = ttSHORT(comp); comp+=2;\n            } else {\n               mtx[4] = ttCHAR(comp); comp+=1;\n               mtx[5] = ttCHAR(comp); comp+=1;\n            }\n         }\n         else {\n            // @TODO handle matching point\n            STBTT_assert(0);\n         }\n         if (flags & (1<<3)) { // WE_HAVE_A_SCALE\n            mtx[0] = mtx[3] = ttSHORT(comp)/16384.0f; comp+=2;\n            mtx[1] = mtx[2] = 0;\n         } else if (flags & (1<<6)) { // WE_HAVE_AN_X_AND_YSCALE\n            mtx[0] = ttSHORT(comp)/16384.0f; comp+=2;\n            mtx[1] = mtx[2] = 0;\n            mtx[3] = ttSHORT(comp)/16384.0f; comp+=2;\n         } else if (flags & (1<<7)) { // WE_HAVE_A_TWO_BY_TWO\n            mtx[0] = ttSHORT(comp)/16384.0f; comp+=2;\n            mtx[1] = ttSHORT(comp)/16384.0f; comp+=2;\n            mtx[2] = ttSHORT(comp)/16384.0f; comp+=2;\n            mtx[3] = ttSHORT(comp)/16384.0f; comp+=2;\n         }\n         \n         // Find transformation scales.\n         m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]);\n         n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]);\n\n         // Get indexed glyph.\n         comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts);\n         if (comp_num_verts > 0) {\n            // Transform vertices.\n            for (i = 0; i < comp_num_verts; ++i) {\n               stbtt_vertex* v = &comp_verts[i];\n               stbtt_vertex_type x,y;\n               x=v->x; y=v->y;\n               v->x = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4]));\n               v->y = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5]));\n               x=v->cx; y=v->cy;\n               v->cx = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4]));\n               v->cy = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5]));\n            }\n            // Append vertices.\n            tmp = (stbtt_vertex*)STBTT_malloc((num_vertices+comp_num_verts)*sizeof(stbtt_vertex), info->userdata);\n            if (!tmp) {\n               if (vertices) STBTT_free(vertices, info->userdata);\n               if (comp_verts) STBTT_free(comp_verts, info->userdata);\n               return 0;\n            }\n            if (num_vertices > 0) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex));\n            STBTT_memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex));\n            if (vertices) STBTT_free(vertices, info->userdata);\n            vertices = tmp;\n            STBTT_free(comp_verts, info->userdata);\n            num_vertices += comp_num_verts;\n         }\n         // More components ?\n         more = flags & (1<<5);\n      }\n   } else if (numberOfContours < 0) {\n      // @TODO other compound variations?\n      STBTT_assert(0);\n   } else {\n      // numberOfCounters == 0, do nothing\n   }\n\n   *pvertices = vertices;\n   return num_vertices;\n}\n\nvoid stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing)\n{\n   stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data+info->hhea + 34);\n   if (glyph_index < numOfLongHorMetrics) {\n      if (advanceWidth)     *advanceWidth    = ttSHORT(info->data + info->hmtx + 4*glyph_index);\n      if (leftSideBearing)  *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*glyph_index + 2);\n   } else {\n      if (advanceWidth)     *advanceWidth    = ttSHORT(info->data + info->hmtx + 4*(numOfLongHorMetrics-1));\n      if (leftSideBearing)  *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*numOfLongHorMetrics + 2*(glyph_index - numOfLongHorMetrics));\n   }\n}\n\nint  stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2)\n{\n   stbtt_uint8 *data = info->data + info->kern;\n   stbtt_uint32 needle, straw;\n   int l, r, m;\n\n   // we only look at the first table. it must be 'horizontal' and format 0.\n   if (!info->kern)\n      return 0;\n   if (ttUSHORT(data+2) < 1) // number of tables, need at least 1\n      return 0;\n   if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format\n      return 0;\n\n   l = 0;\n   r = ttUSHORT(data+10) - 1;\n   needle = glyph1 << 16 | glyph2;\n   while (l <= r) {\n      m = (l + r) >> 1;\n      straw = ttULONG(data+18+(m*6)); // note: unaligned read\n      if (needle < straw)\n         r = m - 1;\n      else if (needle > straw)\n         l = m + 1;\n      else\n         return ttSHORT(data+22+(m*6));\n   }\n   return 0;\n}\n\nint  stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2)\n{\n   if (!info->kern) // if no kerning table, don't waste time looking up both codepoint->glyphs\n      return 0;\n   return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info,ch1), stbtt_FindGlyphIndex(info,ch2));\n}\n\nvoid stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing)\n{\n   stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info,codepoint), advanceWidth, leftSideBearing);\n}\n\nvoid stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap)\n{\n   if (ascent ) *ascent  = ttSHORT(info->data+info->hhea + 4);\n   if (descent) *descent = ttSHORT(info->data+info->hhea + 6);\n   if (lineGap) *lineGap = ttSHORT(info->data+info->hhea + 8);\n}\n\nvoid stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1)\n{\n   *x0 = ttSHORT(info->data + info->head + 36);\n   *y0 = ttSHORT(info->data + info->head + 38);\n   *x1 = ttSHORT(info->data + info->head + 40);\n   *y1 = ttSHORT(info->data + info->head + 42);\n}\n\nfloat stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float height)\n{\n   int fheight = ttSHORT(info->data + info->hhea + 4) - ttSHORT(info->data + info->hhea + 6);\n   return (float) height / fheight;\n}\n\nfloat stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels)\n{\n   int unitsPerEm = ttUSHORT(info->data + info->head + 18);\n   return pixels / unitsPerEm;\n}\n\nvoid stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v)\n{\n   STBTT_free(v, info->userdata);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// antialiasing software rasterizer\n//\n\nvoid stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1)\n{\n   int x0,y0,x1,y1;\n   if (!stbtt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) {\n      // e.g. space character\n      if (ix0) *ix0 = 0;\n      if (iy0) *iy0 = 0;\n      if (ix1) *ix1 = 0;\n      if (iy1) *iy1 = 0;\n   } else {\n      // move to integral bboxes (treating pixels as little squares, what pixels get touched)?\n      if (ix0) *ix0 = STBTT_ifloor( x0 * scale_x + shift_x);\n      if (iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y);\n      if (ix1) *ix1 = STBTT_iceil ( x1 * scale_x + shift_x);\n      if (iy1) *iy1 = STBTT_iceil (-y0 * scale_y + shift_y);\n   }\n}\n\nvoid stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1)\n{\n   stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y,0.0f,0.0f, ix0, iy0, ix1, iy1);\n}\n\nvoid stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1)\n{\n   stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font,codepoint), scale_x, scale_y,shift_x,shift_y, ix0,iy0,ix1,iy1);\n}\n\nvoid stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1)\n{\n   stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y,0.0f,0.0f, ix0,iy0,ix1,iy1);\n}\n\ntypedef struct stbtt__edge {\n   float x0,y0, x1,y1;\n   int invert;\n} stbtt__edge;\n\ntypedef struct stbtt__active_edge\n{\n   int x,dx;\n   float ey;\n   struct stbtt__active_edge *next;\n   int valid;\n} stbtt__active_edge;\n\n#define FIXSHIFT   10\n#define FIX        (1 << FIXSHIFT)\n#define FIXMASK    (FIX-1)\n\nstatic stbtt__active_edge *new_active(stbtt__edge *e, int off_x, float start_point, void *userdata)\n{\n   stbtt__active_edge *z = (stbtt__active_edge *) STBTT_malloc(sizeof(*z), userdata); // @TODO: make a pool of these!!!\n   float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0);\n   STBTT_assert(e->y0 <= start_point);\n   if (!z) return z;\n   // round dx down to avoid going too far\n   if (dxdy < 0)\n      z->dx = -STBTT_ifloor(FIX * -dxdy);\n   else\n      z->dx = STBTT_ifloor(FIX * dxdy);\n   z->x = STBTT_ifloor(FIX * (e->x0 + dxdy * (start_point - e->y0)));\n   z->x -= off_x * FIX;\n   z->ey = e->y1;\n   z->next = 0;\n   z->valid = e->invert ? 1 : -1;\n   return z;\n}\n\n// note: this routine clips fills that extend off the edges... ideally this\n// wouldn't happen, but it could happen if the truetype glyph bounding boxes\n// are wrong, or if the user supplies a too-small bitmap\nstatic void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__active_edge *e, int max_weight)\n{\n   // non-zero winding fill\n   int x0=0, w=0;\n\n   while (e) {\n      if (w == 0) {\n         // if we're currently at zero, we need to record the edge start point\n         x0 = e->x; w += e->valid;\n      } else {\n         int x1 = e->x; w += e->valid;\n         // if we went to zero, we need to draw\n         if (w == 0) {\n            int i = x0 >> FIXSHIFT;\n            int j = x1 >> FIXSHIFT;\n\n            if (i < len && j >= 0) {\n               if (i == j) {\n                  // x0,x1 are the same pixel, so compute combined coverage\n                  scanline[i] = scanline[i] + (stbtt_uint8) ((x1 - x0) * max_weight >> FIXSHIFT);\n               } else {\n                  if (i >= 0) // add antialiasing for x0\n                     scanline[i] = scanline[i] + (stbtt_uint8) (((FIX - (x0 & FIXMASK)) * max_weight) >> FIXSHIFT);\n                  else\n                     i = -1; // clip\n\n                  if (j < len) // add antialiasing for x1\n                     scanline[j] = scanline[j] + (stbtt_uint8) (((x1 & FIXMASK) * max_weight) >> FIXSHIFT);\n                  else\n                     j = len; // clip\n\n                  for (++i; i < j; ++i) // fill pixels between x0 and x1\n                     scanline[i] = scanline[i] + (stbtt_uint8) max_weight;\n               }\n            }\n         }\n      }\n      \n      e = e->next;\n   }\n}\n\nstatic void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata)\n{\n   stbtt__active_edge *active = NULL;\n   int y,j=0;\n   int max_weight = (255 / vsubsample);  // weight per vertical scanline\n   int s; // vertical subsample index\n   unsigned char scanline_data[512], *scanline;\n\n   if (result->w > 512)\n      scanline = (unsigned char *) STBTT_malloc(result->w, userdata);\n   else\n      scanline = scanline_data;\n\n   y = off_y * vsubsample;\n   e[n].y0 = (off_y + result->h) * (float) vsubsample + 1;\n\n   while (j < result->h) {\n      STBTT_memset(scanline, 0, result->w);\n      for (s=0; s < vsubsample; ++s) {\n         // find center of pixel for this scanline\n         float scan_y = y + 0.5f;\n         stbtt__active_edge **step = &active;\n\n         // update all active edges;\n         // remove all active edges that terminate before the center of this scanline\n         while (*step) {\n            stbtt__active_edge * z = *step;\n            if (z->ey <= scan_y) {\n               *step = z->next; // delete from list\n               STBTT_assert(z->valid);\n               z->valid = 0;\n               STBTT_free(z, userdata);\n            } else {\n               z->x += z->dx; // advance to position for current scanline\n               step = &((*step)->next); // advance through list\n            }\n         }\n\n         // resort the list if needed\n         for(;;) {\n            int changed=0;\n            step = &active;\n            while (*step && (*step)->next) {\n               if ((*step)->x > (*step)->next->x) {\n                  stbtt__active_edge *t = *step;\n                  stbtt__active_edge *q = t->next;\n\n                  t->next = q->next;\n                  q->next = t;\n                  *step = q;\n                  changed = 1;\n               }\n               step = &(*step)->next;\n            }\n            if (!changed) break;\n         }\n\n         // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline\n         while (e->y0 <= scan_y) {\n            if (e->y1 > scan_y) {\n               stbtt__active_edge *z = new_active(e, off_x, scan_y, userdata);\n               // find insertion point\n               if (active == NULL)\n                  active = z;\n               else if (z->x < active->x) {\n                  // insert at front\n                  z->next = active;\n                  active = z;\n               } else {\n                  // find thing to insert AFTER\n                  stbtt__active_edge *p = active;\n                  while (p->next && p->next->x < z->x)\n                     p = p->next;\n                  // at this point, p->next->x is NOT < z->x\n                  z->next = p->next;\n                  p->next = z;\n               }\n            }\n            ++e;\n         }\n\n         // now process all active edges in XOR fashion\n         if (active)\n            stbtt__fill_active_edges(scanline, result->w, active, max_weight);\n\n         ++y;\n      }\n      STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w);\n      ++j;\n   }\n\n   while (active) {\n      stbtt__active_edge *z = active;\n      active = active->next;\n      STBTT_free(z, userdata);\n   }\n\n   if (scanline != scanline_data)\n      STBTT_free(scanline, userdata);\n}\n\nstatic int stbtt__edge_compare(const void *p, const void *q)\n{\n   stbtt__edge *a = (stbtt__edge *) p;\n   stbtt__edge *b = (stbtt__edge *) q;\n\n   if (a->y0 < b->y0) return -1;\n   if (a->y0 > b->y0) return  1;\n   return 0;\n}\n\ntypedef struct\n{\n   float x,y;\n} stbtt__point;\n\nstatic void stbtt__rasterize(stbtt__bitmap *result, stbtt__point *pts, int *wcount, int windings, float scale_x, float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void *userdata)\n{\n   float y_scale_inv = invert ? -scale_y : scale_y;\n   stbtt__edge *e;\n   int n,i,j,k,m;\n   int vsubsample = result->h < 8 ? 15 : 5;\n   // vsubsample should divide 255 evenly; otherwise we won't reach full opacity\n\n   // now we have to blow out the windings into explicit edge lists\n   n = 0;\n   for (i=0; i < windings; ++i)\n      n += wcount[i];\n\n   e = (stbtt__edge *) STBTT_malloc(sizeof(*e) * (n+1), userdata); // add an extra one as a sentinel\n   if (e == 0) return;\n   n = 0;\n\n   m=0;\n   for (i=0; i < windings; ++i) {\n      stbtt__point *p = pts + m;\n      m += wcount[i];\n      j = wcount[i]-1;\n      for (k=0; k < wcount[i]; j=k++) {\n         int a=k,b=j;\n         // skip the edge if horizontal\n         if (p[j].y == p[k].y)\n            continue;\n         // add edge from j to k to the list\n         e[n].invert = 0;\n         if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) {\n            e[n].invert = 1;\n            a=j,b=k;\n         }\n         e[n].x0 = p[a].x * scale_x + shift_x;\n         e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample;\n         e[n].x1 = p[b].x * scale_x + shift_x;\n         e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample;\n         ++n;\n      }\n   }\n\n   // now sort the edges by their highest point (should snap to integer, and then by x)\n   STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare);\n\n   // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule\n   stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata);\n\n   STBTT_free(e, userdata);\n}\n\nstatic void stbtt__add_point(stbtt__point *points, int n, float x, float y)\n{\n   if (!points) return; // during first pass, it's unallocated\n   points[n].x = x;\n   points[n].y = y;\n}\n\n// tesselate until threshhold p is happy... @TODO warped to compensate for non-linear stretching\nstatic int stbtt__tesselate_curve(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n)\n{\n   // midpoint\n   float mx = (x0 + 2*x1 + x2)/4;\n   float my = (y0 + 2*y1 + y2)/4;\n   // versus directly drawn line\n   float dx = (x0+x2)/2 - mx;\n   float dy = (y0+y2)/2 - my;\n   if (n > 16) // 65536 segments on one curve better be enough!\n      return 1;\n   if (dx*dx+dy*dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA\n      stbtt__tesselate_curve(points, num_points, x0,y0, (x0+x1)/2.0f,(y0+y1)/2.0f, mx,my, objspace_flatness_squared,n+1);\n      stbtt__tesselate_curve(points, num_points, mx,my, (x1+x2)/2.0f,(y1+y2)/2.0f, x2,y2, objspace_flatness_squared,n+1);\n   } else {\n      stbtt__add_point(points, *num_points,x2,y2);\n      *num_points = *num_points+1;\n   }\n   return 1;\n}\n\n// returns number of contours\nstbtt__point *stbtt_FlattenCurves(stbtt_vertex *vertices, int num_verts, float objspace_flatness, int **contour_lengths, int *num_contours, void *userdata)\n{\n   stbtt__point *points=0;\n   int num_points=0;\n\n   float objspace_flatness_squared = objspace_flatness * objspace_flatness;\n   int i,n=0,start=0, pass;\n\n   // count how many \"moves\" there are to get the contour count\n   for (i=0; i < num_verts; ++i)\n      if (vertices[i].type == STBTT_vmove)\n         ++n;\n\n   *num_contours = n;\n   if (n == 0) return 0;\n\n   *contour_lengths = (int *) STBTT_malloc(sizeof(**contour_lengths) * n, userdata);\n\n   if (*contour_lengths == 0) {\n      *num_contours = 0;\n      return 0;\n   }\n\n   // make two passes through the points so we don't need to realloc\n   for (pass=0; pass < 2; ++pass) {\n      float x=0,y=0;\n      if (pass == 1) {\n         points = (stbtt__point *) STBTT_malloc(num_points * sizeof(points[0]), userdata);\n         if (points == NULL) goto error;\n      }\n      num_points = 0;\n      n= -1;\n      for (i=0; i < num_verts; ++i) {\n         switch (vertices[i].type) {\n            case STBTT_vmove:\n               // start the next contour\n               if (n >= 0)\n                  (*contour_lengths)[n] = num_points - start;\n               ++n;\n               start = num_points;\n\n               x = vertices[i].x, y = vertices[i].y;\n               stbtt__add_point(points, num_points++, x,y);\n               break;\n            case STBTT_vline:\n               x = vertices[i].x, y = vertices[i].y;\n               stbtt__add_point(points, num_points++, x, y);\n               break;\n            case STBTT_vcurve:\n               stbtt__tesselate_curve(points, &num_points, x,y,\n                                        vertices[i].cx, vertices[i].cy,\n                                        vertices[i].x,  vertices[i].y,\n                                        objspace_flatness_squared, 0);\n               x = vertices[i].x, y = vertices[i].y;\n               break;\n         }\n      }\n      (*contour_lengths)[n] = num_points - start;\n   }\n\n   return points;\nerror:\n   STBTT_free(points, userdata);\n   STBTT_free(*contour_lengths, userdata);\n   *contour_lengths = 0;\n   *num_contours = 0;\n   return NULL;\n}\n\nvoid stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata)\n{\n   float scale = scale_x > scale_y ? scale_y : scale_x;\n   int winding_count, *winding_lengths;\n   stbtt__point *windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, &winding_count, userdata);\n   if (windings) {\n      stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, userdata);\n      STBTT_free(winding_lengths, userdata);\n      STBTT_free(windings, userdata);\n   }\n}\n\nvoid stbtt_FreeBitmap(unsigned char *bitmap, void *userdata)\n{\n   STBTT_free(bitmap, userdata);\n}\n\nunsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff)\n{\n   int ix0,iy0,ix1,iy1;\n   stbtt__bitmap gbm;\n   stbtt_vertex *vertices;   \n   int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices);\n\n   if (scale_x == 0) scale_x = scale_y;\n   if (scale_y == 0) {\n      if (scale_x == 0) return NULL;\n      scale_y = scale_x;\n   }\n\n   stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,&ix1,&iy1);\n\n   // now we get the size\n   gbm.w = (ix1 - ix0);\n   gbm.h = (iy1 - iy0);\n   gbm.pixels = NULL; // in case we error\n\n   if (width ) *width  = gbm.w;\n   if (height) *height = gbm.h;\n   if (xoff  ) *xoff   = ix0;\n   if (yoff  ) *yoff   = iy0;\n   \n   if (gbm.w && gbm.h) {\n      gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata);\n      if (gbm.pixels) {\n         gbm.stride = gbm.w;\n\n         stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata);\n      }\n   }\n   STBTT_free(vertices, info->userdata);\n   return gbm.pixels;\n}   \n\nunsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff)\n{\n   return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff);\n}\n\nvoid stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph)\n{\n   int ix0,iy0;\n   stbtt_vertex *vertices;\n   int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices);\n   stbtt__bitmap gbm;   \n\n   stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0);\n   gbm.pixels = output;\n   gbm.w = out_w;\n   gbm.h = out_h;\n   gbm.stride = out_stride;\n\n   if (gbm.w && gbm.h)\n      stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0,iy0, 1, info->userdata);\n\n   STBTT_free(vertices, info->userdata);\n}\n\nvoid stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph)\n{\n   stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, glyph);\n}\n\nunsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff)\n{\n   return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff);\n}   \n\nvoid stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint)\n{\n   stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info,codepoint));\n}\n\nunsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff)\n{\n   return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff);\n}   \n\nvoid stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint)\n{\n   stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, codepoint);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// bitmap baking\n//\n// This is SUPER-CRAPPY packing to keep source code small\n\nextern int stbtt_BakeFontBitmap(const unsigned char *data, int offset,  // font location (use offset=0 for plain .ttf)\n                                float pixel_height,                     // height of font in pixels\n                                unsigned char *pixels, int pw, int ph,  // bitmap to be filled in\n                                int first_char, int num_chars,          // characters to bake\n                                stbtt_bakedchar *chardata)\n{\n   float scale;\n   int x,y,bottom_y, i;\n   stbtt_fontinfo f;\n   if (!stbtt_InitFont(&f, data, offset))\n      return -1;\n   STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels\n   x=y=1;\n   bottom_y = 1;\n\n   scale = stbtt_ScaleForPixelHeight(&f, pixel_height);\n\n   for (i=0; i < num_chars; ++i) {\n      int advance, lsb, x0,y0,x1,y1,gw,gh;\n      int g = stbtt_FindGlyphIndex(&f, first_char + i);\n      stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb);\n      stbtt_GetGlyphBitmapBox(&f, g, scale,scale, &x0,&y0,&x1,&y1);\n      gw = x1-x0;\n      gh = y1-y0;\n      if (x + gw + 1 >= pw)\n         y = bottom_y, x = 1; // advance to next row\n      if (y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row\n         return -i;\n      STBTT_assert(x+gw < pw);\n      STBTT_assert(y+gh < ph);\n      stbtt_MakeGlyphBitmap(&f, pixels+x+y*pw, gw,gh,pw, scale,scale, g);\n      chardata[i].x0 = (stbtt_int16) x;\n      chardata[i].y0 = (stbtt_int16) y;\n      chardata[i].x1 = (stbtt_int16) (x + gw);\n      chardata[i].y1 = (stbtt_int16) (y + gh);\n      chardata[i].xadvance = scale * advance;\n      chardata[i].xoff     = (float) x0;\n      chardata[i].yoff     = (float) y0;\n      x = x + gw + 1;\n      if (y+gh+1 > bottom_y)\n         bottom_y = y+gh+1;\n   }\n   return bottom_y;\n}\n\nvoid stbtt_GetBakedQuad(stbtt_bakedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int opengl_fillrule)\n{\n   float d3d_bias = opengl_fillrule ? 0 : -0.5f;\n   float ipw = 1.0f / pw, iph = 1.0f / ph;\n   stbtt_bakedchar *b = chardata + char_index;\n   int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5);\n   int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5);\n\n   q->x0 = round_x + d3d_bias;\n   q->y0 = round_y + d3d_bias;\n   q->x1 = round_x + b->x1 - b->x0 + d3d_bias;\n   q->y1 = round_y + b->y1 - b->y0 + d3d_bias;\n\n   q->s0 = b->x0 * ipw;\n   q->t0 = b->y0 * iph;\n   q->s1 = b->x1 * ipw;\n   q->t1 = b->y1 * iph;\n\n   *xpos += b->xadvance;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// rectangle packing replacement routines if you don't have stb_rect_pack.h\n//\n\n#ifndef STB_RECT_PACK_VERSION\n#ifdef _MSC_VER\n#define STBTT__NOTUSED(v)  (void)(v)\n#else\n#define STBTT__NOTUSED(v)  (void)sizeof(v)\n#endif\n\ntypedef int stbrp_coord;\n\n////////////////////////////////////////////////////////////////////////////////////\n//                                                                                //\n//                                                                                //\n// COMPILER WARNING ?!?!?                                                         //\n//                                                                                //\n//                                                                                //\n// if you get a compile warning due to these symbols being defined more than      //\n// once, move #include \"stb_rect_pack.h\" before #include \"stb_truetype.h\"         //\n//                                                                                //\n////////////////////////////////////////////////////////////////////////////////////\n\ntypedef struct\n{\n   int width,height;\n   int x,y,bottom_y;\n} stbrp_context;\n\ntypedef struct\n{\n   unsigned char x;\n} stbrp_node;\n\ntypedef struct\n{\n   stbrp_coord x,y;\n   int id,w,h,was_packed;\n} stbrp_rect;\n\nstatic void stbrp_init_target(stbrp_context *con, int pw, int ph, stbrp_node *nodes, int num_nodes)\n{\n   con->width  = pw;\n   con->height = ph;\n   con->x = 0;\n   con->y = 0;\n   con->bottom_y = 0;\n   STBTT__NOTUSED(nodes);\n   STBTT__NOTUSED(num_nodes);   \n}\n\nstatic void stbrp_pack_rects(stbrp_context *con, stbrp_rect *rects, int num_rects)\n{\n   int i;\n   for (i=0; i < num_rects; ++i) {\n      if (con->x + rects[i].w > con->width) {\n         con->x = 0;\n         con->y = con->bottom_y;\n      }\n      if (con->y + rects[i].h > con->height)\n         break;\n      rects[i].x = con->x;\n      rects[i].y = con->y;\n      rects[i].was_packed = 1;\n      con->x += rects[i].w;\n      if (con->y + rects[i].h > con->bottom_y)\n         con->bottom_y = con->y + rects[i].h;\n   }\n   for (   ; i < num_rects; ++i)\n      rects[i].was_packed = 0;\n}\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// bitmap baking\n//\n// This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If\n// stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy.\n\nint stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int pw, int ph, int stride_in_bytes, int padding, void *alloc_context)\n{\n   stbrp_context *context = (stbrp_context *) STBTT_malloc(sizeof(*context)            ,alloc_context);\n   int            num_nodes = pw - padding;\n   stbrp_node    *nodes   = (stbrp_node    *) STBTT_malloc(sizeof(*nodes  ) * num_nodes,alloc_context);\n\n   if (context == NULL || nodes == NULL) {\n      if (context != NULL) STBTT_free(context, alloc_context);\n      if (nodes   != NULL) STBTT_free(nodes  , alloc_context);\n      return 0;\n   }\n\n   spc->user_allocator_context = alloc_context;\n   spc->width = pw;\n   spc->height = ph;\n   spc->pixels = pixels;\n   spc->pack_info = context;\n   spc->nodes = nodes;\n   spc->padding = padding;\n   spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw;\n   spc->h_oversample = 1;\n   spc->v_oversample = 1;\n\n   stbrp_init_target(context, pw-padding, ph-padding, nodes, num_nodes);\n\n   STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels\n\n   return 1;\n}\n\nvoid stbtt_PackEnd  (stbtt_pack_context *spc)\n{\n   STBTT_free(spc->nodes    , spc->user_allocator_context);\n   STBTT_free(spc->pack_info, spc->user_allocator_context);\n}\n\nvoid stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample)\n{\n   STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE);\n   STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE);\n   if (h_oversample <= STBTT_MAX_OVERSAMPLE)\n      spc->h_oversample = h_oversample;\n   if (v_oversample <= STBTT_MAX_OVERSAMPLE)\n      spc->v_oversample = v_oversample;\n}\n\n#define STBTT__OVER_MASK  (STBTT_MAX_OVERSAMPLE-1)\n\nstatic void stbtt__h_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width)\n{\n   unsigned char buffer[STBTT_MAX_OVERSAMPLE];\n   int safe_w = w - kernel_width;\n   int j;\n   for (j=0; j < h; ++j) {\n      int i;\n      unsigned int total;\n      memset(buffer, 0, kernel_width);\n\n      total = 0;\n\n      // make kernel_width a constant in common cases so compiler can optimize out the divide\n      switch (kernel_width) {\n         case 2:\n            for (i=0; i <= safe_w; ++i) {\n               total += pixels[i] - buffer[i & STBTT__OVER_MASK];\n               buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i];\n               pixels[i] = (unsigned char) (total / 2);\n            }\n            break;\n         case 3:\n            for (i=0; i <= safe_w; ++i) {\n               total += pixels[i] - buffer[i & STBTT__OVER_MASK];\n               buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i];\n               pixels[i] = (unsigned char) (total / 3);\n            }\n            break;\n         case 4:\n            for (i=0; i <= safe_w; ++i) {\n               total += pixels[i] - buffer[i & STBTT__OVER_MASK];\n               buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i];\n               pixels[i] = (unsigned char) (total / 4);\n            }\n            break;\n         default:\n            for (i=0; i <= safe_w; ++i) {\n               total += pixels[i] - buffer[i & STBTT__OVER_MASK];\n               buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i];\n               pixels[i] = (unsigned char) (total / kernel_width);\n            }\n            break;\n      }\n\n      for (; i < w; ++i) {\n         STBTT_assert(pixels[i] == 0);\n         total -= buffer[i & STBTT__OVER_MASK];\n         pixels[i] = (unsigned char) (total / kernel_width);\n      }\n\n      pixels += stride_in_bytes;\n   }\n}\n\nstatic void stbtt__v_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width)\n{\n   unsigned char buffer[STBTT_MAX_OVERSAMPLE];\n   int safe_h = h - kernel_width;\n   int j;\n   for (j=0; j < w; ++j) {\n      int i;\n      unsigned int total;\n      memset(buffer, 0, kernel_width);\n\n      total = 0;\n\n      // make kernel_width a constant in common cases so compiler can optimize out the divide\n      switch (kernel_width) {\n         case 2:\n            for (i=0; i <= safe_h; ++i) {\n               total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK];\n               buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes];\n               pixels[i*stride_in_bytes] = (unsigned char) (total / 2);\n            }\n            break;\n         case 3:\n            for (i=0; i <= safe_h; ++i) {\n               total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK];\n               buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes];\n               pixels[i*stride_in_bytes] = (unsigned char) (total / 3);\n            }\n            break;\n         case 4:\n            for (i=0; i <= safe_h; ++i) {\n               total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK];\n               buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes];\n               pixels[i*stride_in_bytes] = (unsigned char) (total / 4);\n            }\n            break;\n         default:\n            for (i=0; i <= safe_h; ++i) {\n               total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK];\n               buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes];\n               pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width);\n            }\n            break;\n      }\n\n      for (; i < h; ++i) {\n         STBTT_assert(pixels[i*stride_in_bytes] == 0);\n         total -= buffer[i & STBTT__OVER_MASK];\n         pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width);\n      }\n\n      pixels += 1;\n   }\n}\n\nstatic float stbtt__oversample_shift(int oversample)\n{\n   if (!oversample)\n      return 0.0f;\n\n   // The prefilter is a box filter of width \"oversample\",\n   // which shifts phase by (oversample - 1)/2 pixels in\n   // oversampled space. We want to shift in the opposite\n   // direction to counter this.\n   return (float)-(oversample - 1) / (2.0f * (float)oversample);\n}\n\nint stbtt_PackFontRanges(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges)\n{\n   stbtt_fontinfo info;\n   float recip_h = 1.0f / spc->h_oversample;\n   float recip_v = 1.0f / spc->v_oversample;\n   float sub_x = stbtt__oversample_shift(spc->h_oversample);\n   float sub_y = stbtt__oversample_shift(spc->v_oversample);\n   int i,j,k,n, return_value = 1;\n   stbrp_context *context = (stbrp_context *) spc->pack_info;\n   stbrp_rect    *rects;\n\n   // flag all characters as NOT packed\n   for (i=0; i < num_ranges; ++i)\n      for (j=0; j < ranges[i].num_chars_in_range; ++j)\n         ranges[i].chardata_for_range[j].x0 =\n         ranges[i].chardata_for_range[j].y0 =\n         ranges[i].chardata_for_range[j].x1 =\n         ranges[i].chardata_for_range[j].y1 = 0;\n\n   n = 0;\n   for (i=0; i < num_ranges; ++i)\n      n += ranges[i].num_chars_in_range;\n         \n   rects = (stbrp_rect *) STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context);\n   if (rects == NULL)\n      return 0;\n\n   stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata,font_index));\n   k=0;\n   for (i=0; i < num_ranges; ++i) {\n      float fh = ranges[i].font_size;\n      float scale = fh > 0 ? stbtt_ScaleForPixelHeight(&info, fh) : stbtt_ScaleForMappingEmToPixels(&info, -fh);\n      for (j=0; j < ranges[i].num_chars_in_range; ++j) {\n         int x0,y0,x1,y1;\n         stbtt_GetCodepointBitmapBoxSubpixel(&info, ranges[i].first_unicode_char_in_range + j,\n                                              scale * spc->h_oversample,\n                                              scale * spc->v_oversample,\n                                              0,0,\n                                              &x0,&y0,&x1,&y1);\n         rects[k].w = (stbrp_coord) (x1-x0 + spc->padding + spc->h_oversample-1);\n         rects[k].h = (stbrp_coord) (y1-y0 + spc->padding + spc->v_oversample-1);\n         ++k;\n      }\n   }\n\n   stbrp_pack_rects(context, rects, k);\n\n   k = 0;\n   for (i=0; i < num_ranges; ++i) {\n      float fh = ranges[i].font_size;\n      float scale = fh > 0 ? stbtt_ScaleForPixelHeight(&info, fh) : stbtt_ScaleForMappingEmToPixels(&info, -fh);\n      for (j=0; j < ranges[i].num_chars_in_range; ++j) {\n         stbrp_rect *r = &rects[k];\n         if (r->was_packed) {\n            stbtt_packedchar *bc = &ranges[i].chardata_for_range[j];\n            int advance, lsb, x0,y0,x1,y1;\n            int glyph = stbtt_FindGlyphIndex(&info, ranges[i].first_unicode_char_in_range + j);\n            stbrp_coord pad = (stbrp_coord) spc->padding;\n\n            // pad on left and top\n            r->x += pad;\n            r->y += pad;\n            r->w -= pad;\n            r->h -= pad;\n            stbtt_GetGlyphHMetrics(&info, glyph, &advance, &lsb);\n            stbtt_GetGlyphBitmapBox(&info, glyph,\n                                    scale * spc->h_oversample,\n                                    scale * spc->v_oversample,\n                                    &x0,&y0,&x1,&y1);\n            stbtt_MakeGlyphBitmapSubpixel(&info,\n                                          spc->pixels + r->x + r->y*spc->stride_in_bytes,\n                                          r->w - spc->h_oversample+1,\n                                          r->h - spc->v_oversample+1,\n                                          spc->stride_in_bytes,\n                                          scale * spc->h_oversample,\n                                          scale * spc->v_oversample,\n                                          0,0,\n                                          glyph);\n\n            if (spc->h_oversample > 1)\n               stbtt__h_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes,\n                                  r->w, r->h, spc->stride_in_bytes,\n                                  spc->h_oversample);\n\n            if (spc->v_oversample > 1)\n               stbtt__v_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes,\n                                  r->w, r->h, spc->stride_in_bytes,\n                                  spc->v_oversample);\n\n            bc->x0       = (stbtt_int16)  r->x;\n            bc->y0       = (stbtt_int16)  r->y;\n            bc->x1       = (stbtt_int16) (r->x + r->w);\n            bc->y1       = (stbtt_int16) (r->y + r->h);\n            bc->xadvance =                scale * advance;\n            bc->xoff     =       (float)  x0 * recip_h + sub_x;\n            bc->yoff     =       (float)  y0 * recip_v + sub_y;\n            bc->xoff2    =                (x0 + r->w) * recip_h + sub_x;\n            bc->yoff2    =                (y0 + r->h) * recip_v + sub_y;\n         } else {\n            return_value = 0; // if any fail, report failure\n         }\n\n         ++k;\n      }\n   }\n\n   return return_value;\n}\n\nint stbtt_PackFontRange(stbtt_pack_context *spc, unsigned char *fontdata, int font_index, float font_size,\n            int first_unicode_char_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range)\n{\n   stbtt_pack_range range;\n   range.first_unicode_char_in_range = first_unicode_char_in_range;\n   range.num_chars_in_range          = num_chars_in_range;\n   range.chardata_for_range          = chardata_for_range;\n   range.font_size                   = font_size;\n   return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1);\n}\n\nvoid stbtt_GetPackedQuad(stbtt_packedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int align_to_integer)\n{\n   float ipw = 1.0f / pw, iph = 1.0f / ph;\n   stbtt_packedchar *b = chardata + char_index;\n\n   if (align_to_integer) {\n      float x = (float) STBTT_ifloor((*xpos + b->xoff) + 0.5);\n      float y = (float) STBTT_ifloor((*ypos + b->yoff) + 0.5);\n      q->x0 = x;\n      q->y0 = y;\n      q->x1 = x + b->xoff2 - b->xoff;\n      q->y1 = y + b->yoff2 - b->yoff;\n   } else {\n      q->x0 = *xpos + b->xoff;\n      q->y0 = *ypos + b->yoff;\n      q->x1 = *xpos + b->xoff2;\n      q->y1 = *ypos + b->yoff2;\n   }\n\n   q->s0 = b->x0 * ipw;\n   q->t0 = b->y0 * iph;\n   q->s1 = b->x1 * ipw;\n   q->t1 = b->y1 * iph;\n\n   *xpos += b->xadvance;\n}\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// font name matching -- recommended not to use this\n//\n\n// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string\nstatic stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(const stbtt_uint8 *s1, stbtt_int32 len1, const stbtt_uint8 *s2, stbtt_int32 len2) \n{\n   stbtt_int32 i=0;\n\n   // convert utf16 to utf8 and compare the results while converting\n   while (len2) {\n      stbtt_uint16 ch = s2[0]*256 + s2[1];\n      if (ch < 0x80) {\n         if (i >= len1) return -1;\n         if (s1[i++] != ch) return -1;\n      } else if (ch < 0x800) {\n         if (i+1 >= len1) return -1;\n         if (s1[i++] != 0xc0 + (ch >> 6)) return -1;\n         if (s1[i++] != 0x80 + (ch & 0x3f)) return -1;\n      } else if (ch >= 0xd800 && ch < 0xdc00) {\n         stbtt_uint32 c;\n         stbtt_uint16 ch2 = s2[2]*256 + s2[3];\n         if (i+3 >= len1) return -1;\n         c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000;\n         if (s1[i++] != 0xf0 + (c >> 18)) return -1;\n         if (s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1;\n         if (s1[i++] != 0x80 + ((c >>  6) & 0x3f)) return -1;\n         if (s1[i++] != 0x80 + ((c      ) & 0x3f)) return -1;\n         s2 += 2; // plus another 2 below\n         len2 -= 2;\n      } else if (ch >= 0xdc00 && ch < 0xe000) {\n         return -1;\n      } else {\n         if (i+2 >= len1) return -1;\n         if (s1[i++] != 0xe0 + (ch >> 12)) return -1;\n         if (s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1;\n         if (s1[i++] != 0x80 + ((ch     ) & 0x3f)) return -1;\n      }\n      s2 += 2;\n      len2 -= 2;\n   }\n   return i;\n}\n\nint stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2) \n{\n   return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((const stbtt_uint8*) s1, len1, (const stbtt_uint8*) s2, len2);\n}\n\n// returns results in whatever encoding you request... but note that 2-byte encodings\n// will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare\nconst char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID)\n{\n   stbtt_int32 i,count,stringOffset;\n   stbtt_uint8 *fc = font->data;\n   stbtt_uint32 offset = font->fontstart;\n   stbtt_uint32 nm = stbtt__find_table(fc, offset, \"name\");\n   if (!nm) return NULL;\n\n   count = ttUSHORT(fc+nm+2);\n   stringOffset = nm + ttUSHORT(fc+nm+4);\n   for (i=0; i < count; ++i) {\n      stbtt_uint32 loc = nm + 6 + 12 * i;\n      if (platformID == ttUSHORT(fc+loc+0) && encodingID == ttUSHORT(fc+loc+2)\n          && languageID == ttUSHORT(fc+loc+4) && nameID == ttUSHORT(fc+loc+6)) {\n         *length = ttUSHORT(fc+loc+8);\n         return (const char *) (fc+stringOffset+ttUSHORT(fc+loc+10));\n      }\n   }\n   return NULL;\n}\n\nstatic int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint8 *name, stbtt_int32 nlen, stbtt_int32 target_id, stbtt_int32 next_id)\n{\n   stbtt_int32 i;\n   stbtt_int32 count = ttUSHORT(fc+nm+2);\n   stbtt_int32 stringOffset = nm + ttUSHORT(fc+nm+4);\n\n   for (i=0; i < count; ++i) {\n      stbtt_uint32 loc = nm + 6 + 12 * i;\n      stbtt_int32 id = ttUSHORT(fc+loc+6);\n      if (id == target_id) {\n         // find the encoding\n         stbtt_int32 platform = ttUSHORT(fc+loc+0), encoding = ttUSHORT(fc+loc+2), language = ttUSHORT(fc+loc+4);\n\n         // is this a Unicode encoding?\n         if (platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) {\n            stbtt_int32 slen = ttUSHORT(fc+loc+8);\n            stbtt_int32 off = ttUSHORT(fc+loc+10);\n\n            // check if there's a prefix match\n            stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc+stringOffset+off,slen);\n            if (matchlen >= 0) {\n               // check for target_id+1 immediately following, with same encoding & language\n               if (i+1 < count && ttUSHORT(fc+loc+12+6) == next_id && ttUSHORT(fc+loc+12) == platform && ttUSHORT(fc+loc+12+2) == encoding && ttUSHORT(fc+loc+12+4) == language) {\n                  slen = ttUSHORT(fc+loc+12+8);\n                  off = ttUSHORT(fc+loc+12+10);\n                  if (slen == 0) {\n                     if (matchlen == nlen)\n                        return 1;\n                  } else if (matchlen < nlen && name[matchlen] == ' ') {\n                     ++matchlen;\n                     if (stbtt_CompareUTF8toUTF16_bigendian((char*) (name+matchlen), nlen-matchlen, (char*)(fc+stringOffset+off),slen))\n                        return 1;\n                  }\n               } else {\n                  // if nothing immediately following\n                  if (matchlen == nlen)\n                     return 1;\n               }\n            }\n         }\n\n         // @TODO handle other encodings\n      }\n   }\n   return 0;\n}\n\nstatic int stbtt__matches(stbtt_uint8 *fc, stbtt_uint32 offset, stbtt_uint8 *name, stbtt_int32 flags)\n{\n   stbtt_int32 nlen = (stbtt_int32) STBTT_strlen((char *) name);\n   stbtt_uint32 nm,hd;\n   if (!stbtt__isfont(fc+offset)) return 0;\n\n   // check italics/bold/underline flags in macStyle...\n   if (flags) {\n      hd = stbtt__find_table(fc, offset, \"head\");\n      if ((ttUSHORT(fc+hd+44) & 7) != (flags & 7)) return 0;\n   }\n\n   nm = stbtt__find_table(fc, offset, \"name\");\n   if (!nm) return 0;\n\n   if (flags) {\n      // if we checked the macStyle flags, then just check the family and ignore the subfamily\n      if (stbtt__matchpair(fc, nm, name, nlen, 16, -1))  return 1;\n      if (stbtt__matchpair(fc, nm, name, nlen,  1, -1))  return 1;\n      if (stbtt__matchpair(fc, nm, name, nlen,  3, -1))  return 1;\n   } else {\n      if (stbtt__matchpair(fc, nm, name, nlen, 16, 17))  return 1;\n      if (stbtt__matchpair(fc, nm, name, nlen,  1,  2))  return 1;\n      if (stbtt__matchpair(fc, nm, name, nlen,  3, -1))  return 1;\n   }\n\n   return 0;\n}\n\nint stbtt_FindMatchingFont(const unsigned char *font_collection, const char *name_utf8, stbtt_int32 flags)\n{\n   stbtt_int32 i;\n   for (i=0;;++i) {\n      stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i);\n      if (off < 0) return off;\n      if (stbtt__matches((stbtt_uint8 *) font_collection, off, (stbtt_uint8*) name_utf8, flags))\n         return off;\n   }\n}\n\n#endif // STB_TRUETYPE_IMPLEMENTATION\n"
  },
  {
    "path": "lua/_frequencies.lua",
    "content": "frequencies = {\n  {start_freq=9000, end_freq=14000, allocation=\"not allocated\", applications=\"Inductive applications, Ultra Low Power Active Medical Implants, On-site paging\"},\n  {start_freq=14000, end_freq=19950, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Ultra Low Power Active Medical Implants, Maritime military systems, On-site paging\"},\n  {start_freq=19950, end_freq=20050, allocation=\"not allocated\", applications=\"Inductive applications, Ultra Low Power Active Medical Implants, On-site paging\"},\n  {start_freq=20050, end_freq=70000, allocation=\"FIXED, MARITIME MOBILE\", applications=\"Inductive applications, Ultra Low Power Active Medical Implants, Maritime military systems, On-site paging, Point-to-Point\"},\n  {start_freq=70000, end_freq=72000, allocation=\"not allocated\", applications=\"Inductive applications, Ultra Low Power Active Medical Implants\"},\n  {start_freq=72000, end_freq=84000, allocation=\"FIXED\", applications=\"Inductive applications, Ultra Low Power Active Medical Implants, Point-to-Point\"},\n  {start_freq=84000, end_freq=130000, allocation=\"not allocated\", applications=\"Inductive applications, Ultra Low Power Active Medical Implants\"},\n  {start_freq=130000, end_freq=135700, allocation=\"FIXED\", applications=\"Inductive applications, Ultra Low Power Active Medical Implants, Point-to-Point, Tracking systems\"},\n  {start_freq=135700, end_freq=137800, allocation=\"FIXED, Amateur\", applications=\"Inductive applications, Ultra Low Power Active Medical Implants, Point-to-Point, Tracking systems, Amateur\"},\n  {start_freq=137800, end_freq=148500, allocation=\"FIXED\", applications=\"Inductive applications, Ultra Low Power Active Medical Implants, Point-to-Point, Tracking systems\"},\n  {start_freq=148500, end_freq=255000, allocation=\"not allocated\", applications=\"Inductive applications, Ultra Low Power Active Medical Implants\"},\n  {start_freq=255000, end_freq=283500, allocation=\"AERONAUTICAL RADIONAVIGATION\", applications=\"Inductive applications, Ultra Low Power Active Medical Implants, Beacons (aeronautical)\"},\n  {start_freq=283500, end_freq=315000, allocation=\"AERONAUTICAL RADIONAVIGATION, MARITIME RADIONAVIGATION\", applications=\"Inductive applications, Ultra Low Power Active Medical Implants, Beacons (aeronautical), Beacons (maritime), Defence systems\"},\n  {start_freq=315000, end_freq=405000, allocation=\"AERONAUTICAL RADIONAVIGATION\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Beacons (aeronautical), Defence systems\"},\n  {start_freq=405000, end_freq=415000, allocation=\"RADIONAVIGATION\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Defence systems\"},\n  {start_freq=415000, end_freq=435000, allocation=\"AERONAUTICAL RADIONAVIGATION, MARITIME MOBILE\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Maritime communications, Defence systems\"},\n  {start_freq=435000, end_freq=495000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Maritime communications, Defence systems, Detection of avalanche victims (457 kHz), Amateur (472-479 kHz)\"},\n  {start_freq=495000, end_freq=505000, allocation=\"MOBILE (distress and calling)\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, GMDSS, Amateur (501-504 kHz)\"},\n  {start_freq=505000, end_freq=526500, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Defence systems, Maritime communications\"},\n  {start_freq=526500, end_freq=1606500, allocation=\"BROADCASTING\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices (315-600 kHz), AM sound analogue\"},\n  {start_freq=1606500, end_freq=1625000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Defence systems, Maritime communications\"},\n  {start_freq=1625000, end_freq=1635000, allocation=\"RADIOLOCATION\", applications=\"Inductive applications, Defence systems\"},\n  {start_freq=1635000, end_freq=1800000, allocation=\"FIXED, MARITIME MOBILE\", applications=\"Inductive applications, Defence systems, Maritime communications, Point-to-Point\"},\n  {start_freq=1800000, end_freq=1810000, allocation=\"RADIOLOCATION\", applications=\"Inductive applications, Defence systems\"},\n  {start_freq=1810000, end_freq=1830000, allocation=\"MOBILE except aeronautical mobile\", applications=\"Inductive applications, Amateur, Defence systems, Maritime communications\"},\n  {start_freq=1830000, end_freq=1850000, allocation=\"AMATEUR\", applications=\"Inductive applications, Amateur\"},\n  {start_freq=1850000, end_freq=2000000, allocation=\"MOBILE except aeronautical mobile\", applications=\"Inductive applications, Amateur, Defence systems, Maritime communications\"},\n  {start_freq=2000000, end_freq=2025000, allocation=\"FIXED, MOBILE except aeronautical mobile (R)\", applications=\"Inductive applications, Defence systems\"},\n  {start_freq=2025000, end_freq=2045000, allocation=\"MOBILE except aeronautical mobile (R)\", applications=\"Inductive applications, Defence systems\"},\n  {start_freq=2045000, end_freq=2160000, allocation=\"LAND MOBILE, MARITIME MOBILE\", applications=\"Inductive applications, Defence systems, Maritime communications\"},\n  {start_freq=2160000, end_freq=2170000, allocation=\"RADIOLOCATION\", applications=\"Inductive applications, Defence systems\"},\n  {start_freq=2170000, end_freq=2173500, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Defence systems\"},\n  {start_freq=2173500, end_freq=2190500, allocation=\"MOBILE (distress and calling)\", applications=\"Inductive applications, GMDSS\"},\n  {start_freq=2190500, end_freq=2300000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Defence systems\"},\n  {start_freq=2300000, end_freq=2498000, allocation=\"MOBILE except aeronautical mobile (R)\", applications=\"Inductive applications, Defence systems\"},\n  {start_freq=2498000, end_freq=2502000, allocation=\"not allocated\", applications=\"Inductive applications\"},\n  {start_freq=2502000, end_freq=2625000, allocation=\"FIXED, MOBILE except aeronautical mobile (R)\", applications=\"Inductive applications, Defence systems, Point-to-Point\"},\n  {start_freq=2625000, end_freq=2650000, allocation=\"MARITIME MOBILE, MARITIME RADIONAVIGATION\", applications=\"Inductive applications, Defence systems\"},\n  {start_freq=2650000, end_freq=2850000, allocation=\"FIXED, MOBILE except aeronautical mobile (R)\", applications=\"Inductive applications, Defence systems, Point-to-Point\"},\n  {start_freq=2850000, end_freq=3025000, allocation=\"AERONAUTICAL MOBILE (R)\", applications=\"Inductive applications, Aeronautical communications\"},\n  {start_freq=3025000, end_freq=3155000, allocation=\"AERONAUTICAL MOBILE (OR)\", applications=\"Inductive applications, Aeronautical military systems\"},\n  {start_freq=3155000, end_freq=3230000, allocation=\"FIXED, MOBILE except aeronautical mobile (R)\", applications=\"Inductive applications, Defence systems, Point-to-Point\"},\n  {start_freq=3230000, end_freq=3400000, allocation=\"FIXED, MOBILE except aeronautical mobile\", applications=\"Inductive applications, Defence systems, Point-to-Point\"},\n  {start_freq=3400000, end_freq=3500000, allocation=\"AERONAUTICAL MOBILE (R)\", applications=\"Inductive applications, Aeronautical communications\"},\n  {start_freq=3500000, end_freq=3800000, allocation=\"AMATEUR, FIXED, MOBILE except aeronautical mobile\", applications=\"Inductive applications, Amateur, Defence systems, Point-to-Point\"},\n  {start_freq=3800000, end_freq=3900000, allocation=\"AERONAUTICAL MOBILE (OR), FIXED, LAND MOBILE\", applications=\"Inductive applications, Defence systems, Point-to-Point\"},\n  {start_freq=3900000, end_freq=3950000, allocation=\"AERONAUTICAL MOBILE (OR)\", applications=\"Inductive applications, Aeronautical military systems\"},\n  {start_freq=3950000, end_freq=4000000, allocation=\"FIXED\", applications=\"Inductive applications, Point-to-Point\"},\n  {start_freq=4000000, end_freq=4063000, allocation=\"FIXED\", applications=\"Inductive applications, Point-to-Point, Defence systems\"},\n  {start_freq=4063000, end_freq=4152000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Maritime communications\"},\n  {start_freq=4152000, end_freq=4172000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Maritime military systems\"},\n  {start_freq=4172000, end_freq=4438000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Maritime communications\"},\n  {start_freq=4438000, end_freq=4650000, allocation=\"FIXED, MOBILE except aeronautical mobile (R)\", applications=\"Inductive applications, Defence systems, Euroloop, Point-to-Point\"},\n  {start_freq=4650000, end_freq=4700000, allocation=\"AERONAUTICAL MOBILE (R)\", applications=\"Inductive applications, Aeronautical communications\"},\n  {start_freq=4700000, end_freq=4750000, allocation=\"AERONAUTICAL MOBILE (OR)\", applications=\"Inductive applications, Aeronautical military systems\"},\n  {start_freq=4750000, end_freq=4850000, allocation=\"FIXED\", applications=\"Inductive applications, Point-to-Point\"},\n  {start_freq=4850000, end_freq=4995000, allocation=\"FIXED, LAND MOBILE\", applications=\"Inductive applications, Point-to-Point\"},\n  {start_freq=4995000, end_freq=5060000, allocation=\"not allocated\", applications=\"Inductive applications\"},\n  {start_freq=5060000, end_freq=5450000, allocation=\"FIXED\", applications=\"Inductive applications, Defence systems, Point-to-Point\"},\n  {start_freq=5450000, end_freq=5480000, allocation=\"FIXED, LAND MOBILE, AERONAUTICAL MOBILE (OR)\", applications=\"Inductive applications, Defence systems\"},\n  {start_freq=5480000, end_freq=5680000, allocation=\"AERONAUTICAL MOBILE (R)\", applications=\"Inductive applications, Aeronautical communications\"},\n  {start_freq=5680000, end_freq=5730000, allocation=\"AERONAUTICAL MOBILE (OR)\", applications=\"Inductive applications, Aeronautical military systems\"},\n  {start_freq=5730000, end_freq=5900000, allocation=\"FIXED\", applications=\"Inductive applications, Point-to-Point\"},\n  {start_freq=5900000, end_freq=5950000, allocation=\"not allocated\", applications=\"Inductive applications\"},\n  {start_freq=5950000, end_freq=6200000, allocation=\"BROADCASTING\", applications=\"Inductive applications, AM sound analogue\"},\n  {start_freq=6200000, end_freq=6233000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Maritime communications\"},\n  {start_freq=6233000, end_freq=6261000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Maritime military systems\"},\n  {start_freq=6261000, end_freq=6525000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Maritime communications\"},\n  {start_freq=6525000, end_freq=6685000, allocation=\"AERONAUTICAL MOBILE (R)\", applications=\"Inductive applications, Aeronautical communications\"},\n  {start_freq=6685000, end_freq=6765000, allocation=\"AERONAUTICAL MOBILE (OR)\", applications=\"Inductive applications, Aeronautical military systems\"},\n  {start_freq=6765000, end_freq=7000000, allocation=\"FIXED\", applications=\"Inductive applications, Point-to-Point, ISM (6765-6795 kHz), Non-specific Short Range Devices (6765-6795 kHz)\"},\n  {start_freq=7000000, end_freq=7100000, allocation=\"AMATEUR, AMATEUR-SATELLITE\", applications=\"Inductive applications, Amateur, Amateur-satellite\"},\n  {start_freq=7100000, end_freq=7200000, allocation=\"Amateur\", applications=\"Inductive applications, Amateur\"},\n  {start_freq=7200000, end_freq=7300000, allocation=\"BROADCASTING\", applications=\"Inductive applications, AM sound analogue\"},\n  {start_freq=7300000, end_freq=7350000, allocation=\"not allocated\", applications=\"Inductive applications\"},\n  {start_freq=7350000, end_freq=8195000, allocation=\"FIXED\", applications=\"Inductive applications, Point-to-Point\"},\n  {start_freq=8195000, end_freq=8300000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Maritime communications\"},\n  {start_freq=8300000, end_freq=8340000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Maritime military systems\"},\n  {start_freq=8340000, end_freq=8815000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Maritime communications\"},\n  {start_freq=8815000, end_freq=8965000, allocation=\"AERONAUTICAL MOBILE (R)\", applications=\"Inductive applications, Aeronautical communications\"},\n  {start_freq=8965000, end_freq=9040000, allocation=\"AERONAUTICAL MOBILE (OR)\", applications=\"Inductive applications, Aeronautical military systems\"},\n  {start_freq=9040000, end_freq=9400000, allocation=\"FIXED\", applications=\"Inductive applications, Point-to-Point\"},\n  {start_freq=9400000, end_freq=9500000, allocation=\"not allocated\", applications=\"Inductive applications\"},\n  {start_freq=9500000, end_freq=9900000, allocation=\"BROADCASTING\", applications=\"Inductive applications, AM sound analogue\"},\n  {start_freq=9900000, end_freq=9995000, allocation=\"FIXED\", applications=\"Inductive applications, Point-to-Point\"},\n  {start_freq=9995000, end_freq=10005000, allocation=\"not allocated\", applications=\"Inductive applications\"},\n  {start_freq=10005000, end_freq=10100000, allocation=\"not allocated\", applications=\"Inductive applications\"},\n  {start_freq=10100000, end_freq=10150000, allocation=\"Amateur\", applications=\"Inductive applications, Amateur\"},\n  {start_freq=10150000, end_freq=11175000, allocation=\"FIXED\", applications=\"Inductive applications, Defence systems, Point-to-Point\"},\n  {start_freq=11175000, end_freq=11275000, allocation=\"AERONAUTICAL MOBILE (OR)\", applications=\"Inductive applications, Aeronautical military systems\"},\n  {start_freq=11275000, end_freq=11400000, allocation=\"AERONAUTICAL MOBILE (R)\", applications=\"Inductive applications, Aeronautical communications\"},\n  {start_freq=11400000, end_freq=11600000, allocation=\"FIXED\", applications=\"Inductive applications, Point-to-Point\"},\n  {start_freq=11600000, end_freq=11650000, allocation=\"not allocated\", applications=\"Inductive applications\"},\n  {start_freq=11650000, end_freq=12050000, allocation=\"BROADCASTING\", applications=\"Inductive applications, AM sound analogue\"},\n  {start_freq=12050000, end_freq=12100000, allocation=\"not allocated\", applications=\"Inductive applications\"},\n  {start_freq=12100000, end_freq=12230000, allocation=\"FIXED\", applications=\"Inductive applications, Point-to-Point\"},\n  {start_freq=12230000, end_freq=12368000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Maritime communications\"},\n  {start_freq=12368000, end_freq=12420000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Maritime military systems\"},\n  {start_freq=12420000, end_freq=13200000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Maritime communications, Ultra Low Power Animal Implantable Devices (12500-20000 kHz)\"},\n  {start_freq=13200000, end_freq=13260000, allocation=\"AERONAUTICAL MOBILE (OR)\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Aeronautical military systems\"},\n  {start_freq=13260000, end_freq=13360000, allocation=\"AERONAUTICAL MOBILE (R)\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Aeronautical communications\"},\n  {start_freq=13360000, end_freq=13570000, allocation=\"FIXED\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Defence systems, Point-to-Point, ISM (13553-13567 kHz), Non-specific Short Range Devices (13553-13567 kHz)\"},\n  {start_freq=13570000, end_freq=13600000, allocation=\"not allocated\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices\"},\n  {start_freq=13600000, end_freq=13800000, allocation=\"BROADCASTING\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, AM sound analogue\"},\n  {start_freq=13800000, end_freq=13870000, allocation=\"not allocated\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices\"},\n  {start_freq=13870000, end_freq=14000000, allocation=\"FIXED\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Defence systems, Point-to-Point\"},\n  {start_freq=14000000, end_freq=14250000, allocation=\"AMATEUR, AMATEUR-SATELLITE\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Amateur, Amateur-satellite\"},\n  {start_freq=14250000, end_freq=14350000, allocation=\"AMATEUR\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Amateur\"},\n  {start_freq=14350000, end_freq=14990000, allocation=\"FIXED\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Defence systems, Point-to-Point\"},\n  {start_freq=14990000, end_freq=15010000, allocation=\"not allocated\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices\"},\n  {start_freq=15010000, end_freq=15100000, allocation=\"AERONAUTICAL MOBILE (OR)\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Aeronautical military systems\"},\n  {start_freq=15100000, end_freq=15600000, allocation=\"BROADCASTING\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, AM sound analogue\"},\n  {start_freq=15600000, end_freq=15800000, allocation=\"not allocated\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices\"},\n  {start_freq=15800000, end_freq=16360000, allocation=\"FIXED\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Point-to-Point\"},\n  {start_freq=16360000, end_freq=16549000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Maritime communications\"},\n  {start_freq=16549000, end_freq=16617000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Maritime military systems\"},\n  {start_freq=16617000, end_freq=17410000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Maritime communications\"},\n  {start_freq=17410000, end_freq=17480000, allocation=\"FIXED\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Point-to-Point\"},\n  {start_freq=17480000, end_freq=17550000, allocation=\"not allocated\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices\"},\n  {start_freq=17550000, end_freq=17900000, allocation=\"BROADCASTING\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, AM sound analogue\"},\n  {start_freq=17900000, end_freq=17970000, allocation=\"AERONAUTICAL MOBILE (R)\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Aeronautical communications\"},\n  {start_freq=17970000, end_freq=18030000, allocation=\"AERONAUTICAL MOBILE (OR)\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Aeronautical military systems\"},\n  {start_freq=18030000, end_freq=18052000, allocation=\"FIXED\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Point-to-Point\"},\n  {start_freq=18052000, end_freq=18068000, allocation=\"not allocated\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices\"},\n  {start_freq=18068000, end_freq=18168000, allocation=\"AMATEUR, AMATEUR-SATELLITE\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Amateur, Amateur-satellite\"},\n  {start_freq=18168000, end_freq=18780000, allocation=\"FIXED\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Defence systems, Point-to-Point\"},\n  {start_freq=18780000, end_freq=18846000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Maritime communications\"},\n  {start_freq=18846000, end_freq=18870000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Maritime military systems\"},\n  {start_freq=18870000, end_freq=18900000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Maritime communications\"},\n  {start_freq=18900000, end_freq=19020000, allocation=\"not allocated\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices\"},\n  {start_freq=19020000, end_freq=19680000, allocation=\"FIXED\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Point-to-Point\"},\n  {start_freq=19680000, end_freq=19800000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Defence systems\"},\n  {start_freq=19800000, end_freq=19990000, allocation=\"FIXED\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices, Point-to-Point\"},\n  {start_freq=19990000, end_freq=20010000, allocation=\"not allocated\", applications=\"Inductive applications, Ultra Low Power Animal Implantable Devices (12500-20000 kHz)\"},\n  {start_freq=20010000, end_freq=21000000, allocation=\"FIXED\", applications=\"Inductive applications, Point-to-Point\"},\n  {start_freq=21000000, end_freq=21450000, allocation=\"AMATEUR, AMATEUR-SATELLITE\", applications=\"Inductive applications, Amateur, Amateur-satellite\"},\n  {start_freq=21450000, end_freq=21850000, allocation=\"BROADCASTING\", applications=\"Inductive applications, AM sound analogue\"},\n  {start_freq=21850000, end_freq=21870000, allocation=\"FIXED\", applications=\"Inductive applications, Point-to-Point\"},\n  {start_freq=21870000, end_freq=21924000, allocation=\"not allocated\", applications=\"Inductive applications\"},\n  {start_freq=21924000, end_freq=22000000, allocation=\"AERONAUTICAL MOBILE (R)\", applications=\"Inductive applications, Aeronautical communications\"},\n  {start_freq=22000000, end_freq=22180000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Maritime communications\"},\n  {start_freq=22180000, end_freq=22240000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Maritime military systems\"},\n  {start_freq=22240000, end_freq=22855000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Maritime communications\"},\n  {start_freq=22855000, end_freq=23200000, allocation=\"FIXED\", applications=\"Inductive applications, Defence systems, Point-to-Point\"},\n  {start_freq=23200000, end_freq=23350000, allocation=\"AERONAUTICAL MOBILE (OR), FIXED\", applications=\"Inductive applications, Defence systems\"},\n  {start_freq=23350000, end_freq=24890000, allocation=\"FIXED\", applications=\"Inductive applications, Defence systems, Point-to-Point\"},\n  {start_freq=24890000, end_freq=24990000, allocation=\"AMATEUR, AMATEUR-SATELLITE\", applications=\"Inductive applications, Amateur, Amateur-satellite\"},\n  {start_freq=24990000, end_freq=25070000, allocation=\"not allocated\", applications=\"Inductive applications, Defence systems\"},\n  {start_freq=25070000, end_freq=25121000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Maritime communications\"},\n  {start_freq=25121000, end_freq=25161250, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Maritime military systems\"},\n  {start_freq=25161250, end_freq=25210000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications, Maritime communications\"},\n  {start_freq=25210000, end_freq=25550000, allocation=\"FIXED\", applications=\"Inductive applications, Defence systems, Point-to-Point\"},\n  {start_freq=25550000, end_freq=25670000, allocation=\"not allocated\", applications=\"Inductive applications\"},\n  {start_freq=25670000, end_freq=26100000, allocation=\"BROADCASTING\", applications=\"Inductive applications, AM sound analogue\"},\n  {start_freq=26100000, end_freq=26175000, allocation=\"MARITIME MOBILE\", applications=\"Inductive applications\"},\n  {start_freq=26175000, end_freq=27500000, allocation=\"FIXED, MOBILE except aeronautical mobile\", applications=\"Inductive applications, Defence systems, Point-to-Point, Eurobalise (26345-27845 kHz) (27.095 MHz), On-site paging (26500-26960 kHz), ISM (26957-27283 kHz), Non-specific Short Range Devices (26957-27283 kHz), AM CB (26960-26990 kHz), PR 27 (26960-26990 kHz), Model control (26990-27000 kHz), AM CB (27000-27040 kHz), PR 27 (27000-27040 kHz), Model control (27040-27050 kHz), AM CB (27050-27090 kHz), PR 27 (27050-27090 kHz), Model control (27090-27100 kHz), AM CB (27100-27140 kHz), PR 27 (27100-27140 kHz), Model control (27140-27150 kHz), AM CB (27150-27190 kHz), PR 27 (27150-27190 kHz), Model control (27190-27200 kHz), AM CB (27200-27410 kHz), PR 27 (27200-27410 kHz)\"},\n  {start_freq=27500000, end_freq=28000000, allocation=\"not allocated\", applications=\"Inductive applications, Eurobalise (26345-27845 kHz) (27.095 MHz)\"},\n  {start_freq=28000000, end_freq=29700000, allocation=\"AMATEUR, AMATEUR-SATELLITE\", applications=\"Inductive applications, Amateur, Amateur-satellite\"},\n  {start_freq=29700000, end_freq=30025000, allocation=\"MOBILE\", applications=\"Inductive applications (9-30000 kHz), Defence systems, Ultra Low Power Medical Membrane Implants (30-37.5 MHz)\"},\n  {start_freq=30025000, end_freq=30287500, allocation=\"MOBILE\", applications=\"Ultra Low Power Medical Membrane Implants, PMR, Radio microphone\"},\n  {start_freq=30287500, end_freq=32462500, allocation=\"MOBILE\", applications=\"Ultra Low Power Medical Membrane Implants, Defence systems\"},\n  {start_freq=32462500, end_freq=33287500, allocation=\"MOBILE\", applications=\"Ultra Low Power Medical Membrane Implants, PMR, Radio microphone\"},\n  {start_freq=33287500, end_freq=34062500, allocation=\"MOBILE\", applications=\"Ultra Low Power Medical Membrane Implants, Defence systems\"},\n  {start_freq=34062500, end_freq=36987500, allocation=\"MOBILE\", applications=\"Ultra Low Power Medical Membrane Implants, Radio microphone, PMR, Flying model control (34.995-35.335 MHz), Wireless audio applications (36.6-36.8 MHz)\"},\n  {start_freq=36987500, end_freq=37262500, allocation=\"MOBILE\", applications=\"Ultra Low Power Medical Membrane Implants, Radio microphone, Defence systems, Wireless audio applications (37-37.2 MHz)\"},\n  {start_freq=37262500, end_freq=37712500, allocation=\"MOBILE\", applications=\"Ultra Low Power Medical Membrane Implants (30-37.5 MHz), Defence systems\"},\n  {start_freq=37712500, end_freq=39925000, allocation=\"MOBILE\", applications=\"Radio microphone, Wireless audio applications (37.8-38 MHz)\"},\n  {start_freq=39925000, end_freq=40562500, allocation=\"MOBILE\", applications=\"Defence systems\"},\n  {start_freq=40562500, end_freq=40700000, allocation=\"MOBILE\", applications=\"Radio microphone, Model control (40.57-40.7 MHz), ISM (40.66-40.7 MHz), Non-specific Short Range Devices (40.66-40.7 MHz)\"},\n  {start_freq=40700000, end_freq=40787500, allocation=\"MOBILE\", applications=\"On-site paging\"},\n  {start_freq=40787500, end_freq=40975000, allocation=\"MOBILE\", applications=\"Defence systems\"},\n  {start_freq=40975000, end_freq=41212500, allocation=\"MOBILE\", applications=\"On-site paging, Radio microphone\"},\n  {start_freq=41212500, end_freq=41725000, allocation=\"MOBILE\", applications=\"Defence systems\"},\n  {start_freq=41725000, end_freq=41987500, allocation=\"MOBILE\", applications=\"On-site paging, Radio microphone\"},\n  {start_freq=41987500, end_freq=47000000, allocation=\"MOBILE\", applications=\"Defence systems\"},\n  {start_freq=47000000, end_freq=68000000, allocation=\"LAND MOBILE\", applications=\"Land military systems, Amateur (50-52 MHz)\"},\n  {start_freq=68000000, end_freq=69945000, allocation=\"MOBILE except aeronautical mobile\", applications=\"Defence systems\"},\n  {start_freq=69945000, end_freq=69955000, allocation=\"MOBILE except aeronautical mobile, Amateur\", applications=\"Defence systems, Amateur (69.950 MHz)\"},\n  {start_freq=69955000, end_freq=70112500, allocation=\"MOBILE except aeronautical mobile\", applications=\"Defence systems\"},\n  {start_freq=70112500, end_freq=70412500, allocation=\"MOBILE except aeronautical mobile\", applications=\"PMR, Amateur (70.19-70.4125 MHz)\"},\n  {start_freq=70412500, end_freq=71987500, allocation=\"MOBILE except aeronautical mobile\", applications=\"Defence systems\"},\n  {start_freq=71987500, end_freq=72512500, allocation=\"MOBILE except aeronautical mobile\", applications=\"PMR, Model control (72.0125-72.2625 MHz)\"},\n  {start_freq=72512500, end_freq=74787500, allocation=\"MOBILE except aeronautical mobile\", applications=\"Defence systems\"},\n  {start_freq=74787500, end_freq=74800000, allocation=\"MOBILE except aeronautical mobile\", applications=\"\"},\n  {start_freq=74800000, end_freq=75200000, allocation=\"AERONAUTICAL RADIONAVIGATION\", applications=\"ILS\"},\n  {start_freq=75200000, end_freq=78687500, allocation=\"MOBILE except aeronautical mobile\", applications=\"PMR\"},\n  {start_freq=78687500, end_freq=81525000, allocation=\"MOBILE except aeronautical mobile\", applications=\"Defence systems\"},\n  {start_freq=81525000, end_freq=82500000, allocation=\"MOBILE except aeronautical mobile\", applications=\"PMR\"},\n  {start_freq=82500000, end_freq=84987500, allocation=\"MOBILE except aeronautical mobile\", applications=\"Defence systems\"},\n  {start_freq=84987500, end_freq=87500000, allocation=\"MOBILE except aeronautical mobile\", applications=\"PMR\"},\n  {start_freq=87500000, end_freq=108000000, allocation=\"BROADCASTING\", applications=\"FM sound analogue, Wireless audio applications\"},\n  {start_freq=108000000, end_freq=117975000, allocation=\"AERONAUTICAL RADIONAVIGATION\", applications=\"ILS, VOR\"},\n  {start_freq=117975000, end_freq=121450000, allocation=\"AERONAUTICAL MOBILE (R)\", applications=\"Aeronautical communications\"},\n  {start_freq=121450000, end_freq=121550000, allocation=\"AERONAUTICAL MOBILE (R)\", applications=\"EPIRBs\"},\n  {start_freq=121550000, end_freq=137000000, allocation=\"AERONAUTICAL MOBILE (R)\", applications=\"Aeronautical communications\"},\n  {start_freq=137000000, end_freq=137025000, allocation=\"METEOROLOGICAL-SATELLITE (space-to-Earth), MOBILE-SATELLITE (space-to-Earth), SPACE OPERATION (space-to-Earth), SPACE RESEARCH (space-to-Earth)\", applications=\"Space Operations, S-PCS, Weather satellites\"},\n  {start_freq=137025000, end_freq=137175000, allocation=\"METEOROLOGICAL-SATELLITE (space-to-Earth), Mobile-Satellite (space-to-Earth), SPACE OPERATION (space-to-Earth), SPACE RESEARCH (space-to-Earth)\", applications=\"Space Operations, S-PCS, Weather satellites\"},\n  {start_freq=137175000, end_freq=137875000, allocation=\"METEOROLOGICAL-SATELLITE (space-to-Earth), MOBILE-SATELLITE (space-to-Earth), SPACE OPERATION (space-to-Earth), SPACE RESEARCH (space-to-Earth)\", applications=\"Space Operations, S-PCS, Weather satellites\"},\n  {start_freq=137875000, end_freq=138000000, allocation=\"METEOROLOGICAL-SATELLITE (space-to-Earth), Mobile-Satellite (space-to-Earth), SPACE OPERATION (space-to-Earth), SPACE RESEARCH (space-to-Earth)\", applications=\"Space Operations, S-PCS, Weather satellites\"},\n  {start_freq=138000000, end_freq=144000000, allocation=\"AERONAUTICAL MOBILE (OR), LAND MOBILE\", applications=\"Defence systems\"},\n  {start_freq=144000000, end_freq=146000000, allocation=\"AMATEUR, AMATEUR-SATELLITE\", applications=\"Amateur, Amateur-satellite\"},\n  {start_freq=146000000, end_freq=148000000, allocation=\"MOBILE except aeronautical mobile (R)\", applications=\"PMR\"},\n  {start_freq=148000000, end_freq=149900000, allocation=\"MOBILE except aeronautical mobile (R), MOBILE-SATELLITE (Earth-to-space)\", applications=\"On-site paging, PMR, S-PCS\"},\n  {start_freq=149900000, end_freq=150050000, allocation=\"MOBILE-SATELLITE (Earth-to-space), RADIONAVIGATION-SATELLITE\", applications=\"PMR (No new assignments), S-PCS\"},\n  {start_freq=150050000, end_freq=153000000, allocation=\"MOBILE except aeronautical mobile, RADIO ASTRONOMY\", applications=\"PMR\"},\n  {start_freq=153000000, end_freq=154000000, allocation=\"Meteorological Aids, MOBILE except aeronautical mobile (R)\", applications=\"PMR\"},\n  {start_freq=154000000, end_freq=156000000, allocation=\"MOBILE except aeronautical mobile (R)\", applications=\"PMR\"},\n  {start_freq=156000000, end_freq=156512500, allocation=\"MOBILE except aeronautical mobile (R)\", applications=\"Maritime communications\"},\n  {start_freq=156512500, end_freq=156537500, allocation=\"MOBILE except aeronautical mobile (R)\", applications=\"SAR (communications)\"},\n  {start_freq=156537500, end_freq=156762500, allocation=\"MOBILE except aeronautical mobile (R)\", applications=\"Maritime communications\"},\n  {start_freq=156762500, end_freq=156837500, allocation=\"MARITIME MOBILE (distress and calling)\", applications=\"SAR (communications)\"},\n  {start_freq=156837500, end_freq=174000000, allocation=\"MOBILE except aeronautical mobile\", applications=\"On-site paging, Maritime communications (156.8375-157.45 MHz), PMR (157.45-160.6 MHz), Maritime communications (160.6-160.975 MHz), PMR (160.975-161.475 MHz), Maritime communications (161.475-162.05 MHz), PMR (162.05-169.4 MHz), Aids for hearing impaired (169.4-169.475 MHz) (License exempt), Aids for hearing impaired (169.4-169.475 MHz) (Individual license required), Aids for hearing impaired (169.4-169.475 MHz) (Individual license required), Aids for hearing impaired (169.4-169.475 MHz) (License exempt), Asset tracking and tracing (169.4-169.475 MHz), Meter reading (169.4-169.475 MHz), Alarms (169.475-169.4875 MHz), Aids for hearing impaired (169.4875-169.5875 MHz) (Individual license , required), Aids for hearing impaired (169.4875-169.5875 MHz) (License exempt), Aids for hearing impaired (169.4875-169.5875 MHz) (License exempt), Aids for hearing impaired (169.4875-169.5875 MHz) (Individual license , required), Alarms (169.5875-169.6 MHz), PMR (169.825-174 MHz)\"},\n  {start_freq=174000000, end_freq=223000000, allocation=\"BROADCASTING, LAND MOBILE\", applications=\"T-DAB (Foreseen), SAP/SAB portable audio link (174-216 MHz), SAP/SAB vehicular audio links (174-216 MHz), Radio microphone (174-202 MHz), On-site paging (174-174.06 MHz), Radio microphone (202-209 MHz), Radio microphone (209-216 MHz)\"},\n  {start_freq=223000000, end_freq=226500000, allocation=\"BROADCASTING\", applications=\"T-DAB\"},\n  {start_freq=226500000, end_freq=230000000, allocation=\"BROADCASTING, Fixed, Mobile\", applications=\"Defence systems, T-DAB (Foreseen)\"},\n  {start_freq=230000000, end_freq=235000000, allocation=\"FIXED, MOBILE\", applications=\"Defence systems\"},\n  {start_freq=235000000, end_freq=242950000, allocation=\"FIXED, MOBILE, Mobile-Satellite\", applications=\"Defence systems\"},\n  {start_freq=242950000, end_freq=243050000, allocation=\"FIXED, MOBILE, Mobile-Satellite\", applications=\"EPIRBs\"},\n  {start_freq=243050000, end_freq=322000000, allocation=\"FIXED, MOBILE, Mobile-Satellite\", applications=\"Defence systems\"},\n  {start_freq=322000000, end_freq=328600000, allocation=\"FIXED, MOBILE, RADIO ASTRONOMY\", applications=\"Defence systems, Radio astronomy\"},\n  {start_freq=328600000, end_freq=335400000, allocation=\"AERONAUTICAL RADIONAVIGATION\", applications=\"ILS\"},\n  {start_freq=335400000, end_freq=380000000, allocation=\"FIXED, MOBILE, Mobile-Satellite\", applications=\"Defence systems\"},\n  {start_freq=380000000, end_freq=385000000, allocation=\"FIXED, MOBILE, Mobile-Satellite\", applications=\"Emergency services\"},\n  {start_freq=385000000, end_freq=390000000, allocation=\"FIXED, MOBILE, Mobile-Satellite\", applications=\"Defence systems\"},\n  {start_freq=390000000, end_freq=395000000, allocation=\"FIXED, MOBILE, Mobile-Satellite\", applications=\"Emergency services\"},\n  {start_freq=395000000, end_freq=399900000, allocation=\"FIXED, MOBILE, Mobile-Satellite\", applications=\"Defence systems\"},\n  {start_freq=399900000, end_freq=400050000, allocation=\"MOBILE-SATELLITE (Earth-to-space), RADIONAVIGATION-SATELLITE\", applications=\"\"},\n  {start_freq=400050000, end_freq=400150000, allocation=\"STANDARD FREQUENCY AND TIME SIGNAL-SATELLITE\", applications=\"\"},\n  {start_freq=400150000, end_freq=401000000, allocation=\"METEOROLOGICAL AIDS, MOBILE-SATELLITE (space-to-Earth)\", applications=\"Defence systems, Sondes\"},\n  {start_freq=401000000, end_freq=403000000, allocation=\"METEOROLOGICAL AIDS, Meteorological-Satellite (Earth-to-space)\", applications=\"Defence systems, Sondes, Weather satellites, Active medical implants (401-402 MHz), Ultra Low Power Active Medical Implants (402-405 MHz)\"},\n  {start_freq=403000000, end_freq=406000000, allocation=\"METEOROLOGICAL AIDS\", applications=\"Defence systems, Sondes, Ultra Low Power Active Medical Implants (402-405 MHz), Active medical implants (405-406 MHz)\"},\n  {start_freq=406000000, end_freq=406100000, allocation=\"MOBILE-SATELLITE (Earth-to-space)\", applications=\"EPIRBs\"},\n  {start_freq=406100000, end_freq=410000000, allocation=\"MOBILE except aeronautical mobile, RADIO ASTRONOMY\", applications=\"PMR, Radio astronomy\"},\n  {start_freq=410000000, end_freq=430000000, allocation=\"MOBILE except aeronautical mobile\", applications=\"PAMR, PMR, TETRA (415-419 MHz), TETRA (425-429 MHz)\"},\n  {start_freq=430000000, end_freq=440000000, allocation=\"AMATEUR, RADIOLOCATION\", applications=\"Amateur, Defence systems, ISM (433.05-434.79 MHz), Non-specific Short Range Devices (433.05-434.79 MHz), Amateur-satellite (435-438 MHz)\"},\n  {start_freq=440000000, end_freq=450000000, allocation=\"MOBILE except aeronautical mobile\", applications=\"Medical Telemetry, PMR, Analogue PMR446 (446-446.1 MHz), Digital PMR446 (446.1-446.2 MHz)\"},\n  {start_freq=450000000, end_freq=470000000, allocation=\"FIXED, MOBILE\", applications=\"Medical Telemetry, On-site paging, PMR, On-board communications (457.525-457.575 MHz), On-board communications (467.525-467.575 MHz)\"},\n  {start_freq=470000000, end_freq=608000000, allocation=\"BROADCASTING, Land Mobile\", applications=\"DVB-T, SAP/SAB portable audio link, SAP/SAB vehicular audio links, Radio microphone (470-518 MHz), Medical Telemetry (470-470.225 MHz), Radio microphone (518-526 MHz), Radio microphone (526-534 MHz), Radio microphone (534-542 MHz), Radio microphone (542-786 MHz), Intercom (550-574 MHz)\"},\n  {start_freq=608000000, end_freq=614000000, allocation=\"BROADCASTING, Land Mobile, Radio Astronomy\", applications=\"Radio microphone, Radio astronomy\"},\n  {start_freq=614000000, end_freq=790000000, allocation=\"BROADCASTING, Land Mobile\", applications=\"Radio microphone (542-786 MHz), DVB-T, SAP/SAB portable audio link (614-780 MHz), SAP/SAB vehicular audio links (614-780 MHz), Intercom (614-646 MHz), Intercom (774-784 MHz), Radio microphone (786-789 MHz)\"},\n  {start_freq=790000000, end_freq=826000000, allocation=\"MOBILE except aeronautical mobile\", applications=\"Broadband Wireless Access (791-821 MHz), Radio microphone (823-826 MHz)\"},\n  {start_freq=826000000, end_freq=832000000, allocation=\"MOBILE except aeronautical mobile\", applications=\"Radio microphone\"},\n  {start_freq=832000000, end_freq=862000000, allocation=\"MOBILE except aeronautical mobile\", applications=\"Broadband Wireless Access\"},\n  {start_freq=862000000, end_freq=863000000, allocation=\"MOBILE except aeronautical mobile\", applications=\"Defence systems\"},\n  {start_freq=863000000, end_freq=868600000, allocation=\"MOBILE except aeronautical mobile\", applications=\"Radio microphone (863-865 MHz), Wireless audio applications (863-865 MHz), CT2 (864.1-868.1 MHz), RFID (865-868 MHz), Non-specific Short Range Devices (868-868.6 MHz)\"},\n  {start_freq=868600000, end_freq=868700000, allocation=\"MOBILE except aeronautical mobile\", applications=\"Alarms\"},\n  {start_freq=868700000, end_freq=869200000, allocation=\"MOBILE except aeronautical mobile\", applications=\"Non-specific Short Range Devices\"},\n  {start_freq=869200000, end_freq=869400000, allocation=\"MOBILE except aeronautical mobile\", applications=\"Alarms\"},\n  {start_freq=869400000, end_freq=869650000, allocation=\"MOBILE except aeronautical mobile\", applications=\"Non-specific Short Range Devices\"},\n  {start_freq=869650000, end_freq=869700000, allocation=\"MOBILE except aeronautical mobile\", applications=\"Alarms\"},\n  {start_freq=869700000, end_freq=870000000, allocation=\"MOBILE except aeronautical mobile\", applications=\"Non-specific Short Range Devices\"},\n  {start_freq=870000000, end_freq=876000000, allocation=\"MOBILE except aeronautical mobile\", applications=\"\"},\n  {start_freq=876000000, end_freq=880000000, allocation=\"MOBILE except aeronautical mobile\", applications=\"GSM-R\"},\n  {start_freq=880000000, end_freq=915000000, allocation=\"MOBILE except aeronautical mobile\", applications=\"GSM, IMT-2000\"},\n  {start_freq=915000000, end_freq=921000000, allocation=\"MOBILE except aeronautical mobile\", applications=\"\"},\n  {start_freq=921000000, end_freq=925000000, allocation=\"MOBILE except aeronautical mobile\", applications=\"GSM-R\"},\n  {start_freq=925000000, end_freq=960000000, allocation=\"MOBILE except aeronautical mobile\", applications=\"GSM, IMT-2000\"},\n  {start_freq=960000000, end_freq=1164000000, allocation=\"AERONAUTICAL RADIONAVIGATION\", applications=\"Aeronautical surveillance, DME, JTIDS/MIDS, TACAN-DME\"},\n  {start_freq=1164000000, end_freq=1215000000, allocation=\"AERONAUTICAL RADIONAVIGATION, RADIONAVIGATION-SATELLITE (space-to-Earth)\", applications=\"Aeronautical surveillance, DME, JTIDS/MIDS, TACAN-DME, Satellite navigation systems\"},\n  {start_freq=1215000000, end_freq=1240000000, allocation=\"RADIOLOCATION, RADIONAVIGATION, RADIONAVIGATION-SATELLITE (space-to-Earth)\", applications=\"Satellite navigation systems, Defence systems\"},\n  {start_freq=1240000000, end_freq=1260000000, allocation=\"Amateur, RADIOLOCATION, RADIONAVIGATION, RADIONAVIGATION-SATELLITE (space-to-Earth)\", applications=\"Amateur, Defence systems\"},\n  {start_freq=1260000000, end_freq=1270000000, allocation=\"Amateur, Amateur-Satellite, RADIOLOCATION, RADIONAVIGATION, RADIONAVIGATION-SATELLITE (space-to-Earth)\", applications=\"Satellite navigation systems, Aeronautical surveillance, Amateur, Amateur-satellite, Defence systems\"},\n  {start_freq=1270000000, end_freq=1300000000, allocation=\"Amateur, RADIOLOCATION, RADIONAVIGATION, RADIONAVIGATION-SATELLITE (space-to-Earth)\", applications=\"Satellite navigation systems, Aeronautical surveillance, Amateur, Defence systems\"},\n  {start_freq=1300000000, end_freq=1350000000, allocation=\"AERONAUTICAL RADIONAVIGATION, Radiolocation\", applications=\"Aeronautical surveillance, Defence systems\"},\n  {start_freq=1350000000, end_freq=1362500000, allocation=\"FIXED\", applications=\"\"},\n  {start_freq=1362500000, end_freq=1375000000, allocation=\"FIXED\", applications=\"Tactical radio relay\"},\n  {start_freq=1375000000, end_freq=1387500000, allocation=\"FIXED\", applications=\"Radio relay\"},\n  {start_freq=1387500000, end_freq=1400000000, allocation=\"FIXED\", applications=\"Tactical radio relay\"},\n  {start_freq=1400000000, end_freq=1427000000, allocation=\"RADIO ASTRONOMY\", applications=\"\"},\n  {start_freq=1427000000, end_freq=1439500000, allocation=\"FIXED\", applications=\"Radio relay\"},\n  {start_freq=1439500000, end_freq=1452000000, allocation=\"FIXED\", applications=\"Tactical radio relay\"},\n  {start_freq=1452000000, end_freq=1467500000, allocation=\"BROADCASTING\", applications=\"T-DAB (Foreseen)\"},\n  {start_freq=1467500000, end_freq=1492000000, allocation=\"BROADCASTING, FIXED\", applications=\"T-DAB (1452-1479.5 MHz) (Foreseen)\"},\n  {start_freq=1492000000, end_freq=1504500000, allocation=\"FIXED\", applications=\"Radio relay (Unidirectional links)\"},\n  {start_freq=1504500000, end_freq=1517000000, allocation=\"FIXED\", applications=\"Tactical radio relay\"},\n  {start_freq=1517000000, end_freq=1525000000, allocation=\"FIXED\", applications=\"Radio relay (Unidirectional links)\"},\n  {start_freq=1525000000, end_freq=1530000000, allocation=\"FIXED, MOBILE-SATELLITE (space-to-Earth)\", applications=\"MSS Earth stations\"},\n  {start_freq=1530000000, end_freq=1535000000, allocation=\"Fixed, MOBILE-SATELLITE (space-to-Earth)\", applications=\"MSS Earth stations\"},\n  {start_freq=1535000000, end_freq=1559000000, allocation=\"MOBILE-SATELLITE (space-to-Earth)\", applications=\"MSS Earth stations, SAR (communications) (1544-1545 MHz)\"},\n  {start_freq=1559000000, end_freq=1610000000, allocation=\"AERONAUTICAL RADIONAVIGATION, RADIONAVIGATION-SATELLITE (space-to-Earth)\", applications=\"Satellite navigation systems\"},\n  {start_freq=1610000000, end_freq=1613800000, allocation=\"AERONAUTICAL RADIONAVIGATION, MOBILE-SATELLITE (Earth-to-space)\", applications=\"S-PCS\"},\n  {start_freq=1613800000, end_freq=1626500000, allocation=\"AERONAUTICAL RADIONAVIGATION, METEOROLOGICAL-SATELLITE (Earth-to-space), Meteorological-Satellite (space-to-Earth)\", applications=\"S-PCS\"},\n  {start_freq=1626500000, end_freq=1660000000, allocation=\"MOBILE-SATELLITE (Earth-to-space)\", applications=\"MSS Earth stations, SAR (communications) (1645.5-1646.5 MHz)\"},\n  {start_freq=1660000000, end_freq=1660500000, allocation=\"METEOROLOGICAL-SATELLITE (Earth-to-space), RADIO ASTRONOMY\", applications=\"MSS Earth stations\"},\n  {start_freq=1660500000, end_freq=1668400000, allocation=\"RADIO ASTRONOMY\", applications=\"\"},\n  {start_freq=1668400000, end_freq=1670000000, allocation=\"METEOROLOGICAL AIDS\", applications=\"Meteorology\"},\n  {start_freq=1670000000, end_freq=1675000000, allocation=\"METEOROLOGICAL AIDS, METEOROLOGICAL-SATELLITE (space-to-Earth), MOBILE\", applications=\"Meteorology\"},\n  {start_freq=1675000000, end_freq=1700000000, allocation=\"METEOROLOGICAL AIDS, METEOROLOGICAL-SATELLITE (space-to-Earth)\", applications=\"Meteorology\"},\n  {start_freq=1700000000, end_freq=1710000000, allocation=\"FIXED\", applications=\"Tactical radio relay\"},\n  {start_freq=1710000000, end_freq=1785000000, allocation=\"MOBILE\", applications=\"GSM, IMT-2000, Mobile Communications on Board Aircraft, Mobile Communications on Board Vessel (1731.1-1733.5 MHz)\"},\n  {start_freq=1785000000, end_freq=1880000000, allocation=\"MOBILE\", applications=\"Radio microphone (1785-1800 MHz), GSM (1805-1880 MHz), IMT-2000 (1805-1880 MHz), Mobile Communications on Board Aircraft (1805-1880 MHz), Mobile Communications on Board Vessel (1826.1-1828.5 MHz)\"},\n  {start_freq=1880000000, end_freq=1900000000, allocation=\"MOBILE\", applications=\"DECT\"},\n  {start_freq=1900000000, end_freq=1980000000, allocation=\"MOBILE\", applications=\"IMT-2000\"},\n  {start_freq=1980000000, end_freq=2010000000, allocation=\"FIXED, MOBILE-SATELLITE (Earth-to-space)\", applications=\"SAP/SAB and ENG/OB (Temporary links), MSS Earth stations\"},\n  {start_freq=2010000000, end_freq=2025000000, allocation=\"FIXED, MOBILE\", applications=\"SAP/SAB and ENG/OB (Temporary links)\"},\n  {start_freq=2025000000, end_freq=2110000000, allocation=\"FIXED, SPACE OPERATION (Earth-to-space) (space-to-space)\", applications=\"SAP/SAB airborne video links, SAP/SAB portable video link, SAP/SAB vehicular video links, Space Operations\"},\n  {start_freq=2110000000, end_freq=2170000000, allocation=\"MOBILE\", applications=\"IMT-2000\"},\n  {start_freq=2170000000, end_freq=2200000000, allocation=\"FIXED, MOBILE-SATELLITE (space-to-Earth)\", applications=\"MSS Earth stations, SAP/SAB and ENG/OB (Temporary links)\"},\n  {start_freq=2200000000, end_freq=2290000000, allocation=\"FIXED, SPACE OPERATION (space-to-Earth) (space-to-space)\", applications=\"SAP/SAB airborne video links, SAP/SAB portable video link, SAP/SAB vehicular video links, Space Operations\"},\n  {start_freq=2290000000, end_freq=2300000000, allocation=\"FIXED\", applications=\"SAP/SAB airborne video links, SAP/SAB portable video link, SAP/SAB vehicular video links\"},\n  {start_freq=2300000000, end_freq=2450000000, allocation=\"Amateur, MOBILE, Radiolocation\", applications=\"SAP/SAB airborne video links (2200-2400 MHz), SAP/SAB portable video link (2200-2400 MHz), SAP/SAB vehicular video links (2200-2400 MHz), Amateur, Defence systems, Detection of movement and alert (2400-2483.5 MHz), ISM (2400-2483.5 MHz), Non-specific Short Range Devices (2400-2483.5 MHz), Wideband Data Transmission Systems (2400-2483.5 MHz), Amateur-satellite (2400-2450 MHz), AVI (2446-2454 MHz), RFID (2446-2454 MHz)\"},\n  {start_freq=2450000000, end_freq=2483500000, allocation=\"MOBILE, Radiolocation\", applications=\"Detection of movement and alert, ISM, Non-specific Short Range Devices, Wideband Data Transmission Systems, AVI (2446-2454 MHz), RFID (2446-2454 MHz), Defence systems\"},\n  {start_freq=2483500000, end_freq=2500000000, allocation=\"FIXED, MOBILE, MOBILE-SATELLITE (space-to-Earth), Radiolocation\", applications=\"SAP/SAB and ENG/OB (Temporary links), S-PCS\"},\n  {start_freq=2500000000, end_freq=2690000000, allocation=\"FIXED, MOBILE except aeronautical mobile\", applications=\"SAP/SAB and ENG/OB (Temporary links), Broadband Wireless Access\"},\n  {start_freq=2690000000, end_freq=2700000000, allocation=\"RADIO ASTRONOMY\", applications=\"SAP/SAB and ENG/OB (Temporary links)\"},\n  {start_freq=2700000000, end_freq=2900000000, allocation=\"AERONAUTICAL RADIONAVIGATION, Radiolocation\", applications=\"Aeronautical surveillance, Radiolocation (military)\"},\n  {start_freq=2900000000, end_freq=3100000000, allocation=\"Radiolocation, RADIONAVIGATION\", applications=\"Radiolocation (military)\"},\n  {start_freq=3100000000, end_freq=3400000000, allocation=\"RADIOLOCATION\", applications=\"Radiolocation (military)\"},\n  {start_freq=3400000000, end_freq=3410000000, allocation=\"Radiolocation\", applications=\"SAP/SAB airborne video links (Until 01/10/2010), Radiolocation (military)\"},\n  {start_freq=3410000000, end_freq=3500000000, allocation=\"FIXED, Mobile\", applications=\"SAP/SAB airborne video links (3400-3450 MHz) (Until 01/10/2010), Broadband Wireless Access\"},\n  {start_freq=3500000000, end_freq=3600000000, allocation=\"FIXED, Mobile\", applications=\"SAP/SAB airborne video links (3500-3550 MHz) (Until 01/10/2010), Broadband Wireless Access (3510-3600 MHz)\"},\n  {start_freq=3600000000, end_freq=3625000000, allocation=\"FIXED\", applications=\"Radio relay (ITU-R F.635)\"},\n  {start_freq=3625000000, end_freq=4200000000, allocation=\"FIXED, FIXED-SATELLITE (space-to-Earth)\", applications=\"Radio relay (ITU-R F.635), FSS Earth stations, Radio relay (3800-4200 MHz) (ERC/REC 12-08 Annex B)\"},\n  {start_freq=4200000000, end_freq=4400000000, allocation=\"AERONAUTICAL RADIONAVIGATION\", applications=\"Defence systems\"},\n  {start_freq=4400000000, end_freq=4825000000, allocation=\"FIXED, MOBILE\", applications=\"Defence systems, Tank Level Probing Radar (4500-7000 MHz)\"},\n  {start_freq=4825000000, end_freq=4835000000, allocation=\"MOBILE except aeronautical mobile, FIXED\", applications=\"Defence systems, Tank Level Probing Radar\"},\n  {start_freq=4835000000, end_freq=4950000000, allocation=\"MOBILE, FIXED\", applications=\"Defence systems, Tank Level Probing Radar\"},\n  {start_freq=4950000000, end_freq=5000000000, allocation=\"MOBILE except aeronautical mobile, FIXED\", applications=\"Defence systems, Tank Level Probing Radar\"},\n  {start_freq=5000000000, end_freq=5150000000, allocation=\"AERONAUTICAL RADIONAVIGATION\", applications=\"Tank Level Probing Radar, MLS (5031-5091 MHz) (Envisaged)\"},\n  {start_freq=5150000000, end_freq=5250000000, allocation=\"AERONAUTICAL RADIONAVIGATION, MOBILE\", applications=\"Tank Level Probing Radar, Wideband Data Transmission Systems\"},\n  {start_freq=5250000000, end_freq=5350000000, allocation=\"RADIOLOCATION\", applications=\"Tank Level Probing Radar, Defence systems, Wideband Data Transmission Systems\"},\n  {start_freq=5350000000, end_freq=5470000000, allocation=\"AERONAUTICAL RADIONAVIGATION, Radiolocation\", applications=\"Tank Level Probing Radar, Defence systems\"},\n  {start_freq=5470000000, end_freq=5650000000, allocation=\"MARITIME RADIONAVIGATION, Radiolocation\", applications=\"Tank Level Probing Radar, Wideband Data Transmission Systems, Defence systems, Weather radar\"},\n  {start_freq=5650000000, end_freq=5830000000, allocation=\"RADIOLOCATION, Amateur\", applications=\"Tank Level Probing Radar, Wideband Data Transmission Systems (5470-5725 MHz), Amateur, Defence systems, Amateur-satellite (5650-5670 MHz), ISM (5725-5875 MHz), Non-specific Short Range Devices (5725-5875 MHz), RTTT (5795-5815 MHz)\"},\n  {start_freq=5830000000, end_freq=5850000000, allocation=\"RADIOLOCATION, Amateur, Amateur-Satellite\", applications=\"Tank Level Probing Radar, Amateur, Defence systems, ISM, Non-specific Short Range Devices, Amateur-satellite\"},\n  {start_freq=5850000000, end_freq=6700000000, allocation=\"FIXED, FIXED-SATELLITE (Earth-to-space)\", applications=\"Tank Level Probing Radar, ISM (5725-5875 MHz), Non-specific Short Range Devices (5725-5875 MHz), FSS Earth stations (5850-6425 MHz), Intelligent Transport Systems (5875-5905 MHz), Radio relay (5925-6425 MHz), Radio relay (6425-7125 MHz), SAP/SAB P to P video links (6425-7125 MHz)\"},\n  {start_freq=6700000000, end_freq=7075000000, allocation=\"FIXED, FIXED-SATELLITE (space-to-Earth) (Earth-to-space)\", applications=\"Tank Level Probing Radar (4500-7000 MHz), Radio relay, SAP/SAB P to P video links\"},\n  {start_freq=7075000000, end_freq=7250000000, allocation=\"FIXED\", applications=\"Radio relay (6425-7125 MHz), SAP/SAB P to P video links (6425-7125 MHz)\"},\n  {start_freq=7250000000, end_freq=7375000000, allocation=\"FIXED, FIXED-SATELLITE (space-to-Earth), MOBILE-SATELLITE\", applications=\"Satellite systems (military)\"},\n  {start_freq=7375000000, end_freq=7450000000, allocation=\"FIXED, FIXED-SATELLITE (space-to-Earth), MOBILE-SATELLITE\", applications=\"Satellite systems (military), SAP/SAB P to P video links, Radio relay (7425-7900 MHz)\"},\n  {start_freq=7450000000, end_freq=7750000000, allocation=\"FIXED, FIXED-SATELLITE (space-to-Earth)\", applications=\"Satellite systems (military), SAP/SAB P to P video links (7375-7484 MHz), Radio relay, SAP/SAB P to P video links (7596-7729 MHz)\"},\n  {start_freq=7750000000, end_freq=7900000000, allocation=\"FIXED\", applications=\"Radio relay, SAP/SAB P to P video links (7841-7900 MHz)\"},\n  {start_freq=7900000000, end_freq=8025000000, allocation=\"FIXED, FIXED-SATELLITE (Earth-to-space), MOBILE-SATELLITE\", applications=\"Satellite systems (military)\"},\n  {start_freq=8025000000, end_freq=8400000000, allocation=\"FIXED, FIXED-SATELLITE (Earth-to-space)\", applications=\"Satellite systems (military), Fixed radio relay (military) (8200-8500 MHz), Radio relay (8200-8500 MHz)\"},\n  {start_freq=8400000000, end_freq=8500000000, allocation=\"FIXED\", applications=\"Fixed radio relay (military), Radio relay\"},\n  {start_freq=8500000000, end_freq=8750000000, allocation=\"RADIOLOCATION\", applications=\"Tank Level Probing Radar, Radiolocation (military)\"},\n  {start_freq=8750000000, end_freq=8850000000, allocation=\"AERONAUTICAL RADIONAVIGATION, MARITIME RADIONAVIGATION, RADIOLOCATION\", applications=\"Tank Level Probing Radar, Radiolocation (military)\"},\n  {start_freq=8850000000, end_freq=9000000000, allocation=\"MARITIME RADIONAVIGATION, RADIOLOCATION\", applications=\"Tank Level Probing Radar, Radiolocation (military)\"},\n  {start_freq=9000000000, end_freq=9200000000, allocation=\"AERONAUTICAL RADIONAVIGATION, MARITIME RADIONAVIGATION, Radiolocation\", applications=\"Tank Level Probing Radar, Radiolocation (military)\"},\n  {start_freq=9200000000, end_freq=9300000000, allocation=\"MARITIME RADIONAVIGATION, RADIOLOCATION\", applications=\"Tank Level Probing Radar, Radiolocation (military), Detection of movement and alert\"},\n  {start_freq=9300000000, end_freq=9500000000, allocation=\"Radiolocation, RADIONAVIGATION\", applications=\"Tank Level Probing Radar, Radiolocation (military), Detection of movement and alert\"},\n  {start_freq=9500000000, end_freq=9800000000, allocation=\"RADIOLOCATION, RADIONAVIGATION\", applications=\"Tank Level Probing Radar, Radiolocation (military), Detection of movement and alert\"},\n  {start_freq=9800000000, end_freq=10000000000, allocation=\"Fixed, Meteorological-Satellite, RADIOLOCATION\", applications=\"Tank Level Probing Radar, Radiolocation (military), Detection of movement and alert (9500-9975 MHz)\"},\n  {start_freq=10000000000, end_freq=10150000000, allocation=\"Amateur, RADIOLOCATION\", applications=\"Tank Level Probing Radar, Radiolocation (military), Amateur\"},\n  {start_freq=10150000000, end_freq=10300000000, allocation=\"Amateur, FIXED, RADIOLOCATION\", applications=\"Tank Level Probing Radar, Radiolocation (military), Amateur, Broadband Wireless Access\"},\n  {start_freq=10300000000, end_freq=10450000000, allocation=\"Amateur, RADIOLOCATION\", applications=\"Tank Level Probing Radar, Radiolocation (military), Amateur\"},\n  {start_freq=10450000000, end_freq=10500000000, allocation=\"Amateur, Amateur-Satellite, RADIOLOCATION\", applications=\"Tank Level Probing Radar, Radiolocation (military), Amateur, Amateur-satellite\"},\n  {start_freq=10500000000, end_freq=10600000000, allocation=\"FIXED, Radiolocation\", applications=\"Tank Level Probing Radar, Broadband Wireless Access, Detection of movement and alert, Radiolocation (civil), SAP/SAB P to P video links (10.56-10.588 GHz)\"},\n  {start_freq=10600000000, end_freq=10680000000, allocation=\"FIXED\", applications=\"Broadband Wireless Access (10.5-10.65 GHz)\"},\n  {start_freq=10680000000, end_freq=10700000000, allocation=\"RADIO ASTRONOMY\", applications=\"\"},\n  {start_freq=10700000000, end_freq=11700000000, allocation=\"FIXED, FIXED-SATELLITE (space-to-Earth) (Earth-to-space)\", applications=\"SIT/SUT, FSS Earth stations, MSS Earth stations, Radio relay, SNG, VSAT\"},\n  {start_freq=11700000000, end_freq=12500000000, allocation=\"BROADCASTING-SATELLITE, FIXED\", applications=\"SIT/SUT\"},\n  {start_freq=12500000000, end_freq=12750000000, allocation=\"FIXED-SATELLITE (space-to-Earth) (Earth-to-space)\", applications=\"SIT/SUT, MSS Earth stations, SNG, VSAT\"},\n  {start_freq=12750000000, end_freq=13250000000, allocation=\"FIXED\", applications=\"FSS Earth stations (No new assignments), Radio relay, SAP/SAB P to P video links\"},\n  {start_freq=13250000000, end_freq=13400000000, allocation=\"AERONAUTICAL RADIONAVIGATION\", applications=\"Defence systems\"},\n  {start_freq=13400000000, end_freq=13750000000, allocation=\"RADIOLOCATION\", applications=\"Detection of movement and alert, Radiolocation (civil), Radiolocation (military)\"},\n  {start_freq=13750000000, end_freq=14000000000, allocation=\"RADIOLOCATION, FIXED-SATELLITE (Earth-to-space)\", applications=\"Detection of movement and alert, Radiolocation (civil), Radiolocation (military), FSS Earth stations\"},\n  {start_freq=14000000000, end_freq=14250000000, allocation=\"FIXED-SATELLITE (Earth-to-space), RADIONAVIGATION\", applications=\"FSS Earth stations, SNG, VSAT, MSS Earth stations\"},\n  {start_freq=14250000000, end_freq=14500000000, allocation=\"FIXED-SATELLITE (Earth-to-space)\", applications=\"FSS Earth stations, SNG, VSAT\"},\n  {start_freq=14500000000, end_freq=14620000000, allocation=\"FIXED\", applications=\"Radio relay\"},\n  {start_freq=14620000000, end_freq=15230000000, allocation=\"FIXED\", applications=\"Fixed radio relay (military)\"},\n  {start_freq=15230000000, end_freq=15350000000, allocation=\"FIXED\", applications=\"Radio relay\"},\n  {start_freq=15350000000, end_freq=15400000000, allocation=\"RADIO ASTRONOMY\", applications=\"\"},\n  {start_freq=15400000000, end_freq=15700000000, allocation=\"AERONAUTICAL RADIONAVIGATION\", applications=\"\"},\n  {start_freq=15700000000, end_freq=16200000000, allocation=\"RADIOLOCATION\", applications=\"Radiolocation (military)\"},\n  {start_freq=16200000000, end_freq=17300000000, allocation=\"RADIOLOCATION\", applications=\"Radiolocation (military), Ground Based Synthetic Aperture Radar (17.1-17.3 GHz)\"},\n  {start_freq=17300000000, end_freq=17700000000, allocation=\"FIXED-SATELLITE (Earth-to-space), Radiolocation\", applications=\"Radiolocation (military), FSS Earth stations\"},\n  {start_freq=17700000000, end_freq=19700000000, allocation=\"FIXED\", applications=\"FSS Earth stations (No new assignments), Radio relay\"},\n  {start_freq=19700000000, end_freq=20200000000, allocation=\"FIXED-SATELLITE (space-to-Earth)\", applications=\"SIT/SUT\"},\n  {start_freq=20200000000, end_freq=21200000000, allocation=\"FIXED-SATELLITE (space-to-Earth), MOBILE-SATELLITE (space-to-Earth)\", applications=\"Defence systems\"},\n  {start_freq=21200000000, end_freq=23600000000, allocation=\"FIXED\", applications=\"Radio relay, SAP/SAB P to P video links, Short-range radar (21.65-24.25 GHz)\"},\n  {start_freq=23600000000, end_freq=24000000000, allocation=\"not allocated\", applications=\"Short-range radar\"},\n  {start_freq=24000000000, end_freq=24050000000, allocation=\"AMATEUR, AMATEUR-SATELLITE\", applications=\"Short-range radar, ISM, Non-specific Short Range Devices, Amateur, Amateur-satellite\"},\n  {start_freq=24050000000, end_freq=24250000000, allocation=\"Amateur, RADIOLOCATION\", applications=\"Short-range radar, ISM, Non-specific Short Range Devices, Tank Level Probing Radar, Amateur, Detection of movement and alert, Radiolocation (civil), Radiolocation (military)\"},\n  {start_freq=24250000000, end_freq=24500000000, allocation=\"FIXED\", applications=\"Tank Level Probing Radar, Short-range radar\"},\n  {start_freq=24500000000, end_freq=25250000000, allocation=\"FIXED\", applications=\"Tank Level Probing Radar, Short-range radar, Radio relay (24.549-25.333 GHz), Wireless Local Loop (25.137-25.193 GHz)\"},\n  {start_freq=25250000000, end_freq=25333000000, allocation=\"FIXED, MOBILE\", applications=\"Tank Level Probing Radar, Short-range radar, Radio relay\"},\n  {start_freq=25333000000, end_freq=25500000000, allocation=\"FIXED, MOBILE\", applications=\"Tank Level Probing Radar, Short-range radar, Fixed radio relay (military) (25.333-25.445 GHz)\"},\n  {start_freq=25500000000, end_freq=26341000000, allocation=\"FIXED, MOBILE\", applications=\"Tank Level Probing Radar, Short-range radar, Radio relay (25.557-26.341 GHz), Wireless Local Loop (26.145-26.201 GHz)\"},\n  {start_freq=26341000000, end_freq=27500000000, allocation=\"FIXED, MOBILE\", applications=\"Tank Level Probing Radar (24.05-27 GHz), Short-range radar (24.25-26.65 GHz), Fixed radio relay (military) (26.341-26.453 GHz)\"},\n  {start_freq=27500000000, end_freq=27828500000, allocation=\"FIXED\", applications=\"FSS Earth stations (27.5485-27.8285 GHz) (Foreseen)\"},\n  {start_freq=27828500000, end_freq=27940500000, allocation=\"FIXED\", applications=\"Fixed radio relay (military)\"},\n  {start_freq=27940500000, end_freq=28836500000, allocation=\"FIXED\", applications=\"Radio relay (27.9405-28.1925 GHz), Wireless Local Loop (28.2205-28.4445 GHz), FSS Earth stations (28.5565-28.8365 GHz) (Foreseen)\"},\n  {start_freq=28836500000, end_freq=28948500000, allocation=\"FIXED\", applications=\"Fixed radio relay (military)\"},\n  {start_freq=28948500000, end_freq=29500000000, allocation=\"FIXED\", applications=\"Radio relay (28.9485-29.2005 GHz), Wireless Local Loop (29.2285-29.4525 GHz)\"},\n  {start_freq=29500000000, end_freq=30000000000, allocation=\"FIXED-SATELLITE (Earth-to-space)\", applications=\"SIT/SUT\"},\n  {start_freq=30000000000, end_freq=31000000000, allocation=\"FIXED-SATELLITE (Earth-to-space), MOBILE-SATELLITE (Earth-to-space)\", applications=\"Defence systems\"},\n  {start_freq=31000000000, end_freq=31300000000, allocation=\"FIXED\", applications=\"Radio relay\"},\n  {start_freq=31300000000, end_freq=31500000000, allocation=\"EARTH EXPLORATION-SATELLITE (passive), RADIO ASTRONOMY, SPACE RESEARCH (passive)\", applications=\"\"},\n  {start_freq=31500000000, end_freq=31800000000, allocation=\"not allocated\", applications=\"\"},\n  {start_freq=31800000000, end_freq=33400000000, allocation=\"RADIONAVIGATION, FIXED\", applications=\"Radio relay\"},\n  {start_freq=33400000000, end_freq=36000000000, allocation=\"RADIOLOCATION\", applications=\"Radiolocation (military)\"},\n  {start_freq=36000000000, end_freq=37282000000, allocation=\"FIXED, MOBILE\", applications=\"Defence systems (36-37 GHz), Fixed radio relay (military) (37.058-37.282 GHz) (CEPT T/R 12-01)\"},\n  {start_freq=37282000000, end_freq=37500000000, allocation=\"FIXED, MOBILE\", applications=\"Radio relay (37.308-38.178 GHz)\"},\n  {start_freq=37500000000, end_freq=38318000000, allocation=\"FIXED\", applications=\"Radio relay (37.308-38.178 GHz)\"},\n  {start_freq=38318000000, end_freq=38542000000, allocation=\"FIXED\", applications=\"Fixed radio relay (military) (38.318-38.452 GHz) (CEPT T/R 12-01)\"},\n  {start_freq=38542000000, end_freq=39500000000, allocation=\"FIXED\", applications=\"Radio relay (38.568-39.438 GHz)\"},\n  {start_freq=39500000000, end_freq=40500000000, allocation=\"FIXED-SATELLITE (space-to-Earth), MOBILE-SATELLITE (space-to-Earth)\", applications=\"Satellite systems (military) (Foreseen)\"},\n  {start_freq=40500000000, end_freq=43500000000, allocation=\"FIXED\", applications=\"\"},\n  {start_freq=43500000000, end_freq=47000000000, allocation=\"MOBILE, MOBILE-SATELLITE, RADIONAVIGATION, RADIONAVIGATION-SATELLITE\", applications=\"\"},\n  {start_freq=47000000000, end_freq=47200000000, allocation=\"AMATEUR, AMATEUR-SATELLITE\", applications=\"Amateur, Amateur-satellite\"},\n  {start_freq=47200000000, end_freq=50200000000, allocation=\"FIXED\", applications=\"HAPS (47.2-47.5 GHz) (Foreseen), HAPS (47.9-48.2 GHz) (Foreseen)\"},\n  {start_freq=50200000000, end_freq=50400000000, allocation=\"not allocated\", applications=\"\"},\n  {start_freq=50400000000, end_freq=51400000000, allocation=\"FIXED-SATELLITE (Earth-to-space), Mobile-Satellite (Earth-to-space)\", applications=\"\"},\n  {start_freq=51400000000, end_freq=52600000000, allocation=\"FIXED\", applications=\"Radio relay\"},\n  {start_freq=52600000000, end_freq=55780000000, allocation=\"not allocated\", applications=\"\"},\n  {start_freq=55780000000, end_freq=57000000000, allocation=\"FIXED\", applications=\"Radio relay\"},\n  {start_freq=57000000000, end_freq=59000000000, allocation=\"FIXED\", applications=\"Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems, Wideband Data Transmission Systems, Tank Level Probing Radar, Unplanned. uncoordinated fixed links\"},\n  {start_freq=59000000000, end_freq=62000000000, allocation=\"FIXED, MOBILE, RADIOLOCATION\", applications=\"Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems, Wideband Data Transmission Systems, Tank Level Probing Radar, Unplanned. uncoordinated fixed links, ISM (61-61.5 GHz), Non-specific Short Range Devices (61-61.5 GHz)\"},\n  {start_freq=62000000000, end_freq=63000000000, allocation=\"FIXED, MOBILE, RADIOLOCATION\", applications=\"Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems, Wideband Data Transmission Systems, Tank Level Probing Radar, Unplanned. uncoordinated fixed links\"},\n  {start_freq=63000000000, end_freq=64000000000, allocation=\"MOBILE, RADIOLOCATION\", applications=\"Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems, Wideband Data Transmission Systems, Tank Level Probing Radar, RTTT\"},\n  {start_freq=64000000000, end_freq=66000000000, allocation=\"MOBILE, FIXED\", applications=\"Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems (Indoor applications), Wideband Data Transmission Systems, Wideband Data Transmission Systems, Unplanned. uncoordinated fixed links\"},\n  {start_freq=66000000000, end_freq=71000000000, allocation=\"RADIONAVIGATION, RADIONAVIGATION-SATELLITE\", applications=\"\"},\n  {start_freq=71000000000, end_freq=74000000000, allocation=\"FIXED\", applications=\"Unplanned. uncoordinated fixed links\"},\n  {start_freq=74000000000, end_freq=75500000000, allocation=\"FIXED\", applications=\"Unplanned. uncoordinated fixed links, Tank Level Probing Radar (75-85 GHz)\"},\n  {start_freq=75500000000, end_freq=76000000000, allocation=\"AMATEUR, AMATEUR-SATELLITE, FIXED\", applications=\"Unplanned. uncoordinated fixed links, Tank Level Probing Radar, Amateur, Amateur-satellite\"},\n  {start_freq=76000000000, end_freq=81000000000, allocation=\"RADIOLOCATION, Amateur, Amateur-Satellite\", applications=\"Tank Level Probing Radar, Amateur, Amateur-satellite, RTTT (76-77 GHz), Short-range radar (77-81 GHz)\"},\n  {start_freq=81000000000, end_freq=84000000000, allocation=\"FIXED\", applications=\"Tank Level Probing Radar, Unplanned. uncoordinated fixed links\"},\n  {start_freq=84000000000, end_freq=86000000000, allocation=\"FIXED\", applications=\"Tank Level Probing Radar (75-85 GHz), Unplanned. uncoordinated fixed links\"},\n  {start_freq=86000000000, end_freq=92000000000, allocation=\"not allocated\", applications=\"\"},\n  {start_freq=92000000000, end_freq=95000000000, allocation=\"RADIOLOCATION\", applications=\"\"},\n  {start_freq=95000000000, end_freq=100000000000, allocation=\"RADIONAVIGATION, RADIONAVIGATION-SATELLITE, RADIOLOCATION\", applications=\"\"},\n  {start_freq=100000000000, end_freq=126000000000, allocation=\"not allocated\", applications=\"ISM (122-123 GHz), Non-specific Short Range Devices (122-123 GHz)\"},\n  {start_freq=126000000000, end_freq=134000000000, allocation=\"RADIOLOCATION\", applications=\"\"},\n  {start_freq=134000000000, end_freq=142000000000, allocation=\"RADIONAVIGATION, RADIONAVIGATION-SATELLITE\", applications=\"\"},\n  {start_freq=142000000000, end_freq=144000000000, allocation=\"AMATEUR, AMATEUR-SATELLITE\", applications=\"Amateur, Amateur-satellite\"},\n  {start_freq=144000000000, end_freq=149000000000, allocation=\"Amateur, Amateur-Satellite\", applications=\"Amateur, Amateur-satellite\"},\n  {start_freq=149000000000, end_freq=190000000000, allocation=\"not allocated\", applications=\"\"},\n  {start_freq=190000000000, end_freq=200000000000, allocation=\"RADIONAVIGATION, RADIONAVIGATION-SATELLITE\", applications=\"\"},\n  {start_freq=200000000000, end_freq=231000000000, allocation=\"not allocated\", applications=\"\"},\n  {start_freq=231000000000, end_freq=235000000000, allocation=\"Radiolocation\", applications=\"\"},\n  {start_freq=235000000000, end_freq=238000000000, allocation=\"not allocated\", applications=\"\"},\n  {start_freq=238000000000, end_freq=241000000000, allocation=\"Radiolocation\", applications=\"\"},\n  {start_freq=241000000000, end_freq=248000000000, allocation=\"Amateur, Amateur-Satellite, RADIOLOCATION\", applications=\"Amateur, Amateur-satellite, ISM (244-246 GHz), Non-specific Short Range Devices (244-246 GHz)\"},\n  {start_freq=248000000000, end_freq=250000000000, allocation=\"AMATEUR, AMATEUR-SATELLITE\", applications=\"Amateur, Amateur-satellite\"},\n  {start_freq=250000000000, end_freq=252000000000, allocation=\"not allocated\", applications=\"\"},\n  {start_freq=252000000000, end_freq=265000000000, allocation=\"RADIONAVIGATION, RADIONAVIGATION-SATELLITE\", applications=\"\"},\n  {start_freq=265000000000, end_freq=275000000000, allocation=\"not allocated\", applications=\"\"}\n}\n"
  },
  {
    "path": "lua/_keys.lua",
    "content": "KEY_UNKNOWN = -1\nKEY_SPACE = 32\nKEY_APOSTROPHE = 39 -- '\nKEY_COMMA = 44 -- ,\nKEY_MINUS = 45 -- -\nKEY_PERIOD = 46 -- .\nKEY_SLASH = 47 -- /\nKEY_0 = 48\nKEY_1 = 49\nKEY_2 = 50\nKEY_3 = 51\nKEY_4 = 52\nKEY_5 = 53\nKEY_6 = 54\nKEY_7 = 55\nKEY_8 = 56\nKEY_9 = 57\nKEY_SEMICOLON = 59 -- ;\nKEY_EQUAL = 61 -- =\nKEY_A = 65\nKEY_B = 66\nKEY_C = 67\nKEY_D = 68\nKEY_E = 69\nKEY_F = 70\nKEY_G = 71\nKEY_H = 72\nKEY_I = 73\nKEY_J = 74\nKEY_K = 75\nKEY_L = 76\nKEY_M = 77\nKEY_N = 78\nKEY_O = 79\nKEY_P = 80\nKEY_Q = 81\nKEY_R = 82\nKEY_S = 83\nKEY_T = 84\nKEY_U = 85\nKEY_V = 86\nKEY_W = 87\nKEY_X = 88\nKEY_Y = 89\nKEY_Z = 90\nKEY_LEFT_BRACKET = 91 -- [\nKEY_BACKSLASH = 92 -- \\\nKEY_RIGHT_BRACKET = 93 -- ]\nKEY_GRAVE_ACCENT = 96 -- `\nKEY_WORLD_1 = 161 -- non-US #1\nKEY_WORLD_2 = 162 -- non-US #2\nKEY_ESCAPE = 256\nKEY_ENTER = 257\nKEY_TAB = 258\nKEY_BACKSPACE = 259\nKEY_INSERT = 260\nKEY_DELETE = 261\nKEY_RIGHT = 262\nKEY_LEFT = 263\nKEY_DOWN = 264\nKEY_UP = 265\nKEY_PAGE_UP = 266\nKEY_PAGE_DOWN = 267\nKEY_HOME = 268\nKEY_END = 269\nKEY_CAPS_LOCK = 280\nKEY_SCROLL_LOCK = 281\nKEY_NUM_LOCK = 282\nKEY_PRINT_SCREEN = 283\nKEY_PAUSE = 284\nKEY_F1 = 290\nKEY_F2 = 291\nKEY_F3 = 292\nKEY_F4 = 293\nKEY_F5 = 294\nKEY_F6 = 295\nKEY_F7 = 296\nKEY_F8 = 297\nKEY_F9 = 298\nKEY_F10 = 299\nKEY_F11 = 300\nKEY_F12 = 301\nKEY_F13 = 302\nKEY_F14 = 303\nKEY_F15 = 304\nKEY_F16 = 305\nKEY_F17 = 306\nKEY_F18 = 307\nKEY_F19 = 308\nKEY_F20 = 309\nKEY_F21 = 310\nKEY_F22 = 311\nKEY_F23 = 312\nKEY_F24 = 313\nKEY_F25 = 314\nKEY_KP_0 = 320\nKEY_KP_1 = 321\nKEY_KP_2 = 322\nKEY_KP_3 = 323\nKEY_KP_4 = 324\nKEY_KP_5 = 325\nKEY_KP_6 = 326\nKEY_KP_7 = 327\nKEY_KP_8 = 328\nKEY_KP_9 = 329\nKEY_KP_DECIMAL = 330\nKEY_KP_DIVIDE = 331\nKEY_KP_MULTIPLY = 332\nKEY_KP_SUBTRACT = 333\nKEY_KP_ADD = 334\nKEY_KP_ENTER = 335\nKEY_KP_EQUAL = 336\nKEY_LEFT_SHIFT = 340\nKEY_LEFT_CONTROL = 341\nKEY_LEFT_ALT = 342\nKEY_LEFT_SUPER = 343\nKEY_RIGHT_SHIFT = 344\nKEY_RIGHT_CONTROL = 345\nKEY_RIGHT_ALT = 346\nKEY_RIGHT_SUPER = 347\nKEY_MENU = 348\n\nfunction keys_camera_handler(key, mods)\n    if (mods == 1) then -- Shift key\n        d = 1\n    elseif (mods == 4) then -- Alt key\n        d = 0.001\n    else\n        d = 0.1\n    end\n    if key == KEY_W then\n        camera_z = camera_z - d\n    elseif key == KEY_S then\n        camera_z = camera_z + d\n    elseif key == KEY_A then\n        camera_x = camera_x - d\n    elseif key == KEY_D then\n        camera_x = camera_x + d\n    elseif key == KEY_Q then\n        camera_y = camera_y - d\n    elseif key == KEY_E then\n        camera_y = camera_y + d\n    end\nend\n\nfunction keys_frequency_handler(key, mods)\n    if (mods == 1) then -- Shift key\n        d = 10\n    elseif (mods == 4) then -- Alt key\n        d = 0.001\n    else\n        d = 0.1\n    end\n    if key == KEY_RIGHT then\n        freq = freq + d\n        freq = nrf_device_set_frequency(device, freq)\n        if fft then\n            nrf_fft_shift(fft, (device.sample_rate / 1e6) / d)\n        end\n        print(\"Frequency: \" .. freq)\n    elseif key == KEY_LEFT then\n        freq = freq - d\n        freq = nrf_device_set_frequency(device, freq)\n        if fft then\n            nrf_fft_shift(fft, -((device.sample_rate / 1e6) / d))\n        end\n        print(\"Frequency: \" .. freq)\n    end\nend\n\nfunction keys_frequency_offset_handler(key, mods)\n    if (mods == 1) then -- Shift key\n        d = 100000\n    elseif (mods == 4) then -- Alt key\n        d = 100\n    else\n        d = 10000\n    end\n    if key == KEY_LEFT_BRACKET then\n        freq_offset = freq_offset + d\n        print(\"Frequency: \" .. freq .. \" offset: \" .. freq_offset)\n        nrf_player_set_freq_offset(player, freq_offset)\n    elseif key == KEY_RIGHT_BRACKET then\n        freq_offset = freq_offset - d\n        print(\"Frequency: \" .. freq .. \" offset: \" .. freq_offset)\n        nrf_player_set_freq_offset(player, freq_offset)\n    end\nend\n"
  },
  {
    "path": "lua/animate-camera.lua",
    "content": "-- Animate the camera around a static scene\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0) * dot(normalize(vp), normalize(vn)) * 0.3;\n    color += vec3(0.1, 0.1, 0.5);\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(vp, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.95);\n}\n]]\n\nfunction setup()\n    model = ngl_model_load_obj(\"../obj/cubes.obj\")\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\nend\n\nfunction draw()\n    camera_x = math.sin(nwm_get_time() * 0.3) * 50\n    camera_y = 10\n    camera_z = math.cos(nwm_get_time() * 0.3) * 50\n\n    camera = ngl_camera_new_look_at(camera_x, camera_y, camera_z)\n    ngl_clear(0.2, 0.2, 0.2, 1)\n    ngl_draw_model(camera, model, shader)\nend\n"
  },
  {
    "path": "lua/capture-model.lua",
    "content": "-- Save transformed geometry data using OpenGL Transform Feedback\n-- https://www.opengl.org/wiki/Transform_Feedback\n-- Press \"c\" to capture/save the model in a file called \"out.obj\".\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0) * dot(normalize(vp), normalize(vn)) * 0.5;\n    color += vec3(0.2, 0.5, 0.8);\n    vec3 p = vp + noise1(uTime / 5.0 + vp.x / 100.0) * 20.0 + noise1(uTime / 10.0 + vp.z / 100.0) * 20.0;\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(p, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.95);\n}\n]]\n\ncamera_x = 0\ncamera_y = 30\ncamera_z = 50\n\nfunction setup()\n    model = ngl_model_new_grid_triangles(100, 100, 5, 5)\n    shader = ngl_shader_new(GL_LINES, VERTEX_SHADER, FRAGMENT_SHADER)\nend\n\nfunction draw()\n    ngl_clear(0.2, 0.2, 0.2, 1)\n    camera = ngl_camera_new_look_at(camera_x, camera_y, camera_z)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_camera_handler(key, mods)\n    if key == KEY_C then\n        ngl_capture_model(camera, model, shader, \"out.obj\")\n        print(\"Saved to out.obj.\")\n    end\nend\n"
  },
  {
    "path": "lua/diffuse.lua",
    "content": "-- Display a static scene with a diffuse shader.\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color = vec3(.41,.3,.2);\nuniform mat4 uViewMatrix, uProjectionMatrix, NormalMatrix;\nuniform vec4 LightPosition;\nuniform vec3 Kd = vec3(2,5,10);\nuniform vec3 Ld = vec3(5,3,1);\nuniform float uTime;\n\nvoid main() {\n    vec3 tnorm = normalize(vp * vn);\n    //vec3 tnorm = vec3(1.0, 1.0, 1.0) * dot(normalize(vp), normalize(vn)) * 0.3;\n    vec4 eyeCoords = uProjectionMatrix * uViewMatrix * vec4(vp, 1.0);\n    vec3 s = normalize(vec3(LightPosition - eyeCoords));\n    vec3 nn = ((Ld * Kd) * max( dot( s, tnorm ), 0.0 )) / 10.0;\n    color = ((Ld * Kd) * max( dot( s, tnorm ), 0.0 )) / 10.0;\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(vp, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.95);\n}\n]]\n\nfunction setup()\n    camera = ngl_camera_new_look_at(-20, 18, 50)\n    model = ngl_model_load_obj(\"../obj/c004.obj\")\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\nend\n\nfunction draw()\n    ngl_clear(0.2, 0.2, 0.2, 1)\n    ngl_draw_model(camera, model, shader)\nend\n"
  },
  {
    "path": "lua/draw-text.lua",
    "content": "-- Example showing how to draw text.\n\nfunction setup()\n    font = ngl_font_new(\"../fonts/Roboto-Bold.ttf\", 72)\nend\n\nfunction draw()\n    ngl_clear(0.0, 0.0, 0.0, 1)\n    ngl_font_draw(font, \"Hello, world!\", 1, 1, 1.0)\nend\n"
  },
  {
    "path": "lua/dvbt-animate-one.lua",
    "content": "-- Visualize IQ data as a texture from the HackRF\n-- You want seizures? 'Cause this is how you get seizures.\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nout vec3 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    texCoord = vt;\n    gl_Position = vec4(vp.x*2, vp.z*2, 0, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nin vec2 texCoord;\nuniform sampler2D uTexture;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    float r = texture(uTexture, texCoord).r * 255;\n    fragColor = vec4(r, r, r, 1);\n}\n]]\n\nfunction setup()\n    countdown = 10\n    freq = 502.19\n    shift = 0.1e6\n    percentage = 0\n    device = nrf_device_new(freq, \"../rfdata/rf-200.500-big.raw\")\n    shifter = nrf_freq_shifter_new(0.1e6, device.sample_rate)\n    filter = nrf_iq_filter_new(device.sample_rate, 80e3, 97)\n\n    camera = ngl_camera_new_look_at(0, 0, 0) -- Camera is unnecessary but ngl_draw_model requires it\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(2, 2, 1, 1)\nend\n\nfunction draw()\n    if countdown > 0 then\n        samples_buffer = nrf_device_get_samples_buffer(device)\n        nrf_freq_shifter_process(shifter, samples_buffer)\n        shifter_buffer = nrf_freq_shifter_get_buffer(shifter)\n        nrf_iq_filter_process(filter, shifter_buffer)\n        filter_buffer = nrf_iq_filter_get_buffer(filter)\n        countdown = countdown - 1\n    else\n        reduce_buffer = nut_buffer_reduce(filter_buffer, percentage)\n        iq_buffer = nrf_buffer_to_iq_points(reduce_buffer)\n\n\n        ngl_clear(0.2, 0.2, 0.2, 1.0)\n        ngl_texture_update(texture, iq_buffer, 256, 256)\n        ngl_draw_model(camera, model, shader)\n        percentage = percentage + 0.0001\n    end\nend\n\nfunction on_key(key, mods)\n    keys_frequency_handler(key, mods)\n    if key == KEY_E then\n        nut_buffer_save(nut_buffer_convert(buffer, 1), \"out.raw\")\n    end\n    if key == KEY_LEFT_BRACKET then\n        shift = shift - 0.001e3\n        shifter = nrf_freq_shifter_new(shift, device.sample_rate)\n        print(\"Shift: \" .. shift)\n    elseif key == KEY_RIGHT_BRACKET then\n        shift = shift + 0.001e3\n        shifter = nrf_freq_shifter_new(shift, device.sample_rate)\n        print(\"Shift: \" .. shift)\n    end\nend\n"
  },
  {
    "path": "lua/dvbt.lua",
    "content": "-- Visualize IQ data as a texture from the HackRF\n-- You want seizures? 'Cause this is how you get seizures.\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nout vec3 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    texCoord = vt;\n    gl_Position = vec4(vp.x*2, vp.z*2, 0, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nin vec2 texCoord;\nuniform sampler2D uTexture;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    float r = texture(uTexture, texCoord).r * 10;\n    fragColor = vec4(r, r, r, 1);\n}\n]]\n\nfunction setup()\n    freq = 502.19\n    shift = 0.1e6\n    device = nrf_device_new(freq, \"../rfdata/rf-200.500-big.raw\")\n    shifter = nrf_freq_shifter_new(shift, device.sample_rate)\n    filter = nrf_iq_filter_new(device.sample_rate, 60e3, 97)\n\n    camera = ngl_camera_new_look_at(0, 0, 0) -- Camera is unnecessary but ngl_draw_model requires it\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(2, 2, 1, 1)\nend\n\nfunction draw()\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    nrf_freq_shifter_process(shifter, samples_buffer)\n    shifter_buffer = nrf_freq_shifter_get_buffer(shifter)\n    nrf_iq_filter_process(filter, shifter_buffer)\n    filter_buffer = nrf_iq_filter_get_buffer(filter)\n    iq_buffer = nrf_buffer_to_iq_points(filter_buffer)\n\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_texture_update(texture, iq_buffer, 256, 256)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_frequency_handler(key, mods)\n    if key == KEY_E then\n        nut_buffer_save(nut_buffer_convert(filter_buffer, NUT_BUFFER_U8), \"out.raw\")\n    end\n    if key == KEY_LEFT_BRACKET then\n        shift = shift - 0.01e3\n        shifter = nrf_freq_shifter_new(shift, device.sample_rate)\n        print(\"Shift: \" .. shift)\n    elseif key == KEY_RIGHT_BRACKET then\n        shift = shift + 0.01e3\n        shifter = nrf_freq_shifter_new(shift, device.sample_rate)\n        print(\"Shift: \" .. shift)\n    end\nend\n"
  },
  {
    "path": "lua/empty.lua",
    "content": "-- Empty template to get started\n\nfunction setup()\n    -- Load the model, shaders, camera, ...\nend\n\nfunction draw()\n    ngl_clear(0.2, 0.2, 0.2, 1)\n    -- Draw your scene\nend\n"
  },
  {
    "path": "lua/fft-sea-auto.lua",
    "content": "-- Visualize FFT data as a texture from the HackRF\n-- Calculate normals and lighting\n\nGRADIENT_VERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nout vec4 color;\n\nuniform float uRed;\nuniform float uGreen;\nuniform float uBlue;\nuniform float uAlpha;\nuniform float uGlobalAlpha;\n\nvoid main () {\n    if (vp.z > 0) {\n        color = vec4(uRed, uGreen, uBlue, uAlpha);\n    } else {\n        color = vec4(uRed * 0.01, uGreen * 0.01, uBlue * 0.01, uAlpha);\n    }\n    color.a *= uGlobalAlpha;\n    gl_Position = vec4(vp.x * 2, vp.z * 2, 0, 1);\n}\n]]\n\nGRADIENT_FRAGMENT_SHADER = [[\n#version 400\nin vec4 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = color;\n}\n]]\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nflat out vec4 color;\nout vec2 texCoord;\nflat out float dontDraw;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nuniform sampler2D uTexture;\nuniform float uRed;\nuniform float uGreen;\nuniform float uBlue;\nuniform float uAlpha;\nuniform float uLight;\nuniform float uAmbient;\n\nvoid main() {\n    float d = 0.004;\n    float cell_size = 0.001;\n    vec2 tp = vec2(vt.x, vt.y - 0.5);\n    if (tp.y < 0) {\n        tp.y = 1-tp.y;\n    }\n    float y1 = texture(uTexture, tp).r;\n    y1 *= d;\n    vec3 v1 = vec3(vp.x, y1, vp.z);\n\n    if (y1 == 0) {\n        dontDraw = 1.0;\n    } else {\n        dontDraw = 0.0;\n    }\n\n    color = vec4(uRed, uGreen, uBlue, uAlpha);\n\n    texCoord = vt;\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(v1, 1.0);\n    gl_PointSize = 5;\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nflat in vec4 color;\nin vec2 texCoord;\nflat in float dontDraw;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    if (dontDraw >= 1.0) {\n        fragColor = vec4(0.0, 0.0, 0.0, 0.0);\n    } else {\n        fragColor = color;\n    }\n}\n]]\n\nFREQUENCIES = {\n    {start_freq=87.5, end_freq=108.0, label=\"FM Radio\", red=0.8, green=0.0, blue=0.0},\n    {start_freq=165, end_freq=175, label=\"TETRA Police Radio\", red=0.1, green=0.1, blue=0.9},\n    {start_freq=430, end_freq=440, label=\"ISM\", red=0.8, green=0.8, blue=0.0},\n    {start_freq=830, end_freq=980, label=\"GSM\", red=0.0, green=0.8, blue=0.8},\n    {start_freq=2400, end_freq=2500, label=\"Wi-Fi\", red=0.2, green=0.6, blue=0.9}\n}\n\nFREQUENCY_START = 87.5\nFREQUENCY_DISPLAY_TIME = 150\n\nSTATE_NORMAL = 1\nSTATE_FADING_OUT = 2\nSTATE_FADING_IN = 3\n\nfunction round(val, decimal)\n  local exp = decimal and 10^decimal or 1\n  return math.ceil(val * exp - 0.5) / exp\nend\n\nfunction find_range(freq)\n    for _, freq_info in pairs(FREQUENCIES) do\n        if freq_info.start_freq <= freq and freq_info.end_freq >= freq then\n            return freq_info\n        end\n    end\nend\n\n-- Switch to the next interesting frequency\nfunction switch_freq()\n    frequency_index = frequency_index + 1\n    if frequency_index > #INTERESTING_FREQUENCIES then\n        frequency_index = 1\n    end\n    freq_to_switch = INTERESTING_FREQUENCIES[frequency_index]\n    state = STATE_FADING_OUT\nend\n\nfunction set_freq(new_freq)\n    d = new_freq - freq\n    new_freq = round(new_freq, 3)\n    freq = nrf_device_set_frequency(device, new_freq)\n    nrf_fft_shift(fft, (device.sample_rate / 1e6) / d)\n    print(\"Frequency: \" .. new_freq)\n    info = find_range(freq)\n    if info then\n        ngl_shader_uniform_set_float(shader, \"uRed\", info.red)\n        ngl_shader_uniform_set_float(shader, \"uGreen\", info.green)\n        ngl_shader_uniform_set_float(shader, \"uBlue\", info.blue)\n        ngl_shader_uniform_set_float(shader, \"uAlpha\", 0.1)\n\n        ngl_shader_uniform_set_float(line_shader, \"uRed\", info.red * 1.5)\n        ngl_shader_uniform_set_float(line_shader, \"uGreen\", info.green * 1.5)\n        ngl_shader_uniform_set_float(line_shader, \"uBlue\", info.blue * 1.5)\n        ngl_shader_uniform_set_float(line_shader, \"uAlpha\", 1.0)\n\n        ngl_shader_uniform_set_float(grad_shader, \"uRed\", info.red)\n        ngl_shader_uniform_set_float(grad_shader, \"uGreen\", info.green)\n        ngl_shader_uniform_set_float(grad_shader, \"uBlue\", info.blue)\n        ngl_shader_uniform_set_float(grad_shader, \"uAlpha\", 1)\n    else\n        ngl_shader_uniform_set_float(shader, \"uRed\", 0.1)\n        ngl_shader_uniform_set_float(shader, \"uGreen\", 0.1)\n        ngl_shader_uniform_set_float(shader, \"uBlue\", 0.1)\n        ngl_shader_uniform_set_float(shader, \"uAlpha\", 0.3)\n\n        ngl_shader_uniform_set_float(line_shader, \"uRed\", 0.4)\n        ngl_shader_uniform_set_float(line_shader, \"uGreen\", 0.4)\n        ngl_shader_uniform_set_float(line_shader, \"uBlue\", 0.4)\n        ngl_shader_uniform_set_float(line_shader, \"uAlpha\", 1.0)\n\n        ngl_shader_uniform_set_float(grad_shader, \"uRed\", 0.2)\n        ngl_shader_uniform_set_float(grad_shader, \"uGreen\", 0.2)\n        ngl_shader_uniform_set_float(grad_shader, \"uBlue\", 0.2)\n        ngl_shader_uniform_set_float(grad_shader, \"uAlpha\", 1)\n    end\n    frequency_display_countdown = FREQUENCY_DISPLAY_TIME\nend\n\nfunction setup()\n    freq = FREQUENCY_START\n    freq_offset = 100000\n\n    device = nrf_device_new(freq, \"../rfdata/rf-200.500-big.raw\")\n    fft = nrf_fft_new(128, 512)\n    player = nrf_player_new(device, NRF_DEMODULATE_WBFM, freq_offset)\n\n    camera = ngl_camera_new()\n\n    grad_model = ngl_model_new_grid_triangles(2, 2, 1, 1)\n    grad_shader = ngl_shader_new(GL_TRIANGLES, GRADIENT_VERTEX_SHADER, GRADIENT_FRAGMENT_SHADER)\n\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    line_shader = ngl_shader_new(GL_LINES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(256, 512, 0.001, 0.001)\n    ngl_model_translate(model, 0, -0.02, 0.002)\n\n    freq_font = ngl_font_new(\"../fonts/Roboto-Bold.ttf\", 24)\n    info_font = ngl_font_new(\"../fonts/RobotoCondensed-Bold.ttf\", 18)\n\n    frequency_display_countdown = FREQUENCY_DISPLAY_TIME\n    set_freq(freq)\nend\n\nfunction draw()\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    nrf_fft_process(fft, samples_buffer)\n    fft_buffer = nrf_fft_get_buffer(fft)\n\n    ngl_clear(0, 0, 0, 1)\n\n    ngl_draw_background(camera, grad_model, grad_shader)\n\n    ngl_texture_update(texture, fft_buffer, 128, 512)\n    ngl_draw_model(camera, model, shader)\n    ngl_draw_model(camera, model, line_shader)\n\n    frequency_display_countdown = frequency_display_countdown - 1\n    if frequency_display_countdown > 0 then\n        if frequency_display_countdown < 50 then\n            font_alpha = 1.0 - ((50 - frequency_display_countdown) / 50.0)\n        else\n            font_alpha = 1.0\n        end\n        freq_text = round(freq - (freq_offset / 1000000), 1)\n        ngl_font_draw(freq_font, freq_text, 1, 0.1, font_alpha)\n        info = find_range(freq)\n        if info then\n            ngl_font_draw(info_font, info.label, 1, 0.17, font_alpha)\n        end\n    end\n    set_freq(freq + 0.01)\nend\n"
  },
  {
    "path": "lua/fft-sea-sick.lua",
    "content": "-- Visualize FFT data as a texture from the HackRF\n-- Calculate normals and lighting\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nflat out vec4 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nuniform sampler2D uTexture;\nvoid main() {\n    float d = 0.01;\n    float cell_size = 0.003;\n    float t1 = texture(uTexture, vt).r;\n    float t2 = texture(uTexture, vt + vec2(cell_size, 0)).r;\n    float t3 = texture(uTexture, vt + vec2(0, cell_size)).r;\n\n    if (t1 > 1) {\n        t1 = 0.0;\n    }\n    if (t2 > 1) {\n        t2 = 0.0;\n    }\n    if (t3 > 1) {\n       t3 = 0.0;\n    }\n\n    t1 = abs(t1);\n    t2 = abs(t2);\n    t3 = abs(t3);\n    t1 *= d;\n    t2 *= d;\n    t3 *= d;\n\n    vec3 v1 = vec3(vp.x, t1, vp.z);\n    vec3 v2 = vec3(vp.x + cell_size, t2, vp.z);\n    vec3 v3 = vec3(vp.x, t3, vp.z + cell_size);\n\n    vec3 u = v2 - v1;\n    vec3 v = v3 - v1;\n    float x = (u.y * v.z) - (u.z * v.y);\n    float y = (u.z * v.x) - (u.x * v.z);\n    float z = (u.x * v.y) - (u.y * v.x);\n    vec3 n = vec3(x, y, z);\n\n    color = vec4(1.0, 1.0, 1.0, 0.95) * dot(normalize(v1), normalize(n)) * 0.5;\n    color += vec4(0.5, 0.25, 0.21, 1.0);\n\n    float l = 1.0 - ((vp.x * vp.x + vp.z * vp.z) * 2.0);\n    float ll = 1.0 - ((vp.z * vp.z + vp.y * vp.y) * 2.0);\n\n    float sharkfactor = .25;\n    float seasickfactor = 1.25;\n    v1.x += sharkfactor*noise1(l*2.0) * sin(uTime/2.0);\n    v1.y += .05*noise1(l+uTime/seasickfactor);\n    color.g += .5*noise1(l*1.2);\n    color.r += 2.0*noise1(ll*1.2);\n    texCoord = vt;\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(v1, 1.0);\n    gl_PointSize = 5;\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nflat in vec4 color;\nin vec2 texCoord;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = color;\n}\n]]\n\n\nfunction setup()\n    freq = 97\n    device = nrf_device_new(freq, \"../rfdata/rf-200.500-big.raw\")\n    fft = nrf_fft_new(128, 128)\n\n    camera = ngl_camera_new_look_at(0, 0.01, 0.2)\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(128, 128, 0.006, 0.006)\n    ngl_model_translate(model, 0, -0.03, 0)\nend\n\nfunction draw()\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    nrf_fft_process(fft, samples_buffer)\n    fft_buffer = nrf_fft_get_buffer(fft)\n\n    camera_y = 0.01+ .020 *math.abs(math.sin(nwm_get_time() * 0.03))\n    camera = ngl_camera_new_look_at(0, camera_y, 0.2)\n\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_texture_update(texture, fft_buffer, 128, 128)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_frequency_handler(key, mods)\nend\n"
  },
  {
    "path": "lua/fft-sea.lua",
    "content": "-- Visualize FFT data as a texture from the HackRF\n-- Calculate normals and lighting\n\nGRADIENT_VERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nout vec4 color;\n\nuniform float uRed;\nuniform float uGreen;\nuniform float uBlue;\nuniform float uAlpha;\nuniform float uGlobalAlpha;\n\nvoid main () {\n    if (vp.z > 0) {\n        color = vec4(uRed, uGreen, uBlue, uAlpha);\n    } else {\n        color = vec4(uRed * 0.01, uGreen * 0.01, uBlue * 0.01, uAlpha);\n    }\n    color.a *= uGlobalAlpha;\n    gl_Position = vec4(vp.x * 2, vp.z * 2, 0, 1);\n}\n]]\n\nGRADIENT_FRAGMENT_SHADER = [[\n#version 400\nin vec4 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = color;\n}\n]]\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nflat out vec4 color;\nout vec2 texCoord;\nflat out float dontDraw;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nuniform sampler2D uTexture;\nuniform float uRed;\nuniform float uGreen;\nuniform float uBlue;\nuniform float uAlpha;\nuniform float uLight;\nuniform float uAmbient;\nuniform float uGlobalAlpha;\n\nvoid main() {\n    float d = 0.004;\n    float cell_size = 0.001;\n    vec2 tp = vec2(vt.x, vt.y - 0.5);\n    if (tp.y < 0) {\n        tp.y = 1-tp.y;\n    }\n    float y1 = texture(uTexture, tp).r;\n    y1 *= d;\n    vec3 v1 = vec3(vp.x, y1, vp.z);\n\n    if (y1 == 0) {\n        dontDraw = 1.0;\n    } else {\n        dontDraw = 0.0;\n    }\n\n    color = vec4(uRed, uGreen, uBlue, uAlpha);\n    color.a *= uGlobalAlpha;\n\n    texCoord = vt;\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(v1, 1.0);\n    gl_PointSize = 5;\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nflat in vec4 color;\nin vec2 texCoord;\nflat in float dontDraw;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    if (dontDraw >= 1.0) {\n        fragColor = vec4(0.0, 0.0, 0.0, 0.0);\n    } else {\n        fragColor = color;\n    }\n}\n]]\n\nFREQUENCIES = {\n    {start_freq=87.5, end_freq=108.0, label=\"FM Radio\", red=0.8, green=0.0, blue=0.0},\n    {start_freq=165, end_freq=175, label=\"TETRA Police Radio\", red=0.1, green=0.1, blue=0.9},\n    {start_freq=430, end_freq=440, label=\"ISM\", red=0.8, green=0.8, blue=0.0},\n    {start_freq=830, end_freq=980, label=\"GSM\", red=0.0, green=0.8, blue=0.8},\n    {start_freq=2400, end_freq=2500, label=\"Wi-Fi\", red=0.2, green=0.6, blue=0.9}\n}\n\nINTERESTING_FREQUENCIES = {97.6, 169.8, 434.1, 930.3, 2412.1}\n\nFREQUENCY_INDEX = 1\nFREQUENCY_DISPLAY_TIME = 150\n\nSTATE_NORMAL = 1\nSTATE_FADING_OUT = 2\nSTATE_FADING_IN = 3\n\nfunction round(val, decimal)\n  local exp = decimal and 10^decimal or 1\n  return math.ceil(val * exp - 0.5) / exp\nend\n\nfunction find_range(freq)\n    for _, freq_info in pairs(FREQUENCIES) do\n        if freq_info.start_freq <= freq and freq_info.end_freq >= freq then\n            return freq_info\n        end\n    end\nend\n\n-- Switch to the next interesting frequency\nfunction switch_freq()\n    frequency_index = frequency_index + 1\n    if frequency_index > #INTERESTING_FREQUENCIES then\n        frequency_index = 1\n    end\n    freq_to_switch = INTERESTING_FREQUENCIES[frequency_index]\n    state = STATE_FADING_OUT\nend\n\nfunction set_freq(new_freq)\n    d = new_freq - freq\n    new_freq = round(new_freq, 3)\n    freq = nrf_device_set_frequency(device, new_freq)\n    nrf_fft_shift(fft, (device.sample_rate / 1e6) / d)\n    print(\"Frequency: \" .. new_freq)\n    info = find_range(freq)\n    if info then\n        ngl_shader_uniform_set_float(shader, \"uRed\", info.red)\n        ngl_shader_uniform_set_float(shader, \"uGreen\", info.green)\n        ngl_shader_uniform_set_float(shader, \"uBlue\", info.blue)\n        ngl_shader_uniform_set_float(shader, \"uAlpha\", 0.1)\n\n        ngl_shader_uniform_set_float(line_shader, \"uRed\", info.red * 1.5)\n        ngl_shader_uniform_set_float(line_shader, \"uGreen\", info.green * 1.5)\n        ngl_shader_uniform_set_float(line_shader, \"uBlue\", info.blue * 1.5)\n        ngl_shader_uniform_set_float(line_shader, \"uAlpha\", 1.0)\n\n        ngl_shader_uniform_set_float(grad_shader, \"uRed\", info.red)\n        ngl_shader_uniform_set_float(grad_shader, \"uGreen\", info.green)\n        ngl_shader_uniform_set_float(grad_shader, \"uBlue\", info.blue)\n        ngl_shader_uniform_set_float(grad_shader, \"uAlpha\", 1)\n    else\n        ngl_shader_uniform_set_float(shader, \"uRed\", 0.1)\n        ngl_shader_uniform_set_float(shader, \"uGreen\", 0.1)\n        ngl_shader_uniform_set_float(shader, \"uBlue\", 0.1)\n        ngl_shader_uniform_set_float(shader, \"uAlpha\", 0.3)\n\n        ngl_shader_uniform_set_float(line_shader, \"uRed\", 0.4)\n        ngl_shader_uniform_set_float(line_shader, \"uGreen\", 0.4)\n        ngl_shader_uniform_set_float(line_shader, \"uBlue\", 0.4)\n        ngl_shader_uniform_set_float(line_shader, \"uAlpha\", 1.0)\n\n        ngl_shader_uniform_set_float(grad_shader, \"uRed\", 0.2)\n        ngl_shader_uniform_set_float(grad_shader, \"uGreen\", 0.2)\n        ngl_shader_uniform_set_float(grad_shader, \"uBlue\", 0.2)\n        ngl_shader_uniform_set_float(grad_shader, \"uAlpha\", 1)\n    end\n    frequency_display_countdown = FREQUENCY_DISPLAY_TIME\nend\n\n-- Receive OSC events\nfunction handle_message(path, args)\n    if path == \"/wii/1/accel/pry\" then\n        roll = args[2] - 0.5\n        if math.abs(roll) > 0.4 then\n            if roll < 0 then\n                d = -0.04\n            else\n                d = 0.04\n            end\n            set_freq(freq + d)\n        end\n    elseif path == \"/wii/1/button/Right\" and args[1] == 1 then\n        new_freq = freq + 0.1\n        set_freq(math.ceil(new_freq * 10) / 10)\n    elseif path == \"/wii/1/button/Left\" and args[1] == 1 then\n        new_freq = freq - 0.1\n        set_freq(math.floor(new_freq * 10) / 10)\n    elseif path == \"/wii/1/button/Up\" then\n        ngl_model_translate(model, 0.0, -0.001, 0.0)\n    elseif path == \"/wii/1/button/Down\" then\n        ngl_model_translate(model, 0.0, 0.001, 0.0)\n    elseif path == \"/wii/1/button/A\" and args[1] == 1 then\n        switch_freq()\n    end\nend\n\nfunction setup()\n    frequency_index = 1\n    freq = INTERESTING_FREQUENCIES[frequency_index]\n    freq_offset = 100000\n\n    device = nrf_device_new(freq, \"../rfdata/rf-200.500-big.raw\")\n    fft = nrf_fft_new(128, 512)\n    player = nrf_player_new(device, NRF_DEMODULATE_WBFM, freq_offset)\n\n    server = nosc_server_new(2222, handle_message)\n\n    camera = ngl_camera_new()\n\n    grad_model = ngl_model_new_grid_triangles(2, 2, 1, 1)\n    grad_shader = ngl_shader_new(GL_TRIANGLES, GRADIENT_VERTEX_SHADER, GRADIENT_FRAGMENT_SHADER)\n\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    line_shader = ngl_shader_new(GL_LINES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(256, 512, 0.001, 0.001)\n    ngl_model_translate(model, 0, -0.02, 0.002)\n\n    skybox = ngl_skybox_new(\"../img/negz.jpg\", \"../img/posz.jpg\", \"../img/posy.jpg\", \"../img/negy.jpg\", \"../img/negx.jpg\", \"../img/posx.jpg\")\n    freq_font = ngl_font_new(\"../fonts/Roboto-Bold.ttf\", 72)\n    info_font = ngl_font_new(\"../fonts/RobotoCondensed-Bold.ttf\", 36)\n\n    frequency_display_countdown = FREQUENCY_DISPLAY_TIME\n    set_freq(freq)\n\n    set_global_alpha(1.0)\n    state = STATE_NORMAL\nend\n\nfunction set_global_alpha(new_alpha)\n    global_alpha = new_alpha\n    ngl_shader_uniform_set_float(shader, \"uGlobalAlpha\", global_alpha)\n    ngl_shader_uniform_set_float(line_shader, \"uGlobalAlpha\", global_alpha)\n    ngl_shader_uniform_set_float(grad_shader, \"uGlobalAlpha\", global_alpha)\nend\n\nfunction draw()\n    if state == STATE_NORMAL then\n    elseif state == STATE_FADING_OUT then\n        set_global_alpha(global_alpha - 0.01)\n        nrf_player_set_gain(player, global_alpha)\n        if global_alpha <= 0 then\n            set_freq(freq_to_switch)\n            state = STATE_FADING_IN\n        end\n    elseif state == STATE_FADING_IN then\n        set_global_alpha(global_alpha + 0.01)\n        nrf_player_set_gain(player, global_alpha)\n        if global_alpha >= 1 then\n            state = STATE_NORMAL\n        end\n    end\n\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    nrf_fft_process(fft, samples_buffer)\n    fft_buffer = nrf_fft_get_buffer(fft)\n\n    nosc_server_update(server)\n\n    ngl_clear(0, 0, 0, 1)\n\n    ngl_draw_background(camera, grad_model, grad_shader)\n\n    ngl_texture_update(texture, fft_buffer, 128, 512)\n    ngl_draw_model(camera, model, shader)\n    ngl_draw_model(camera, model, line_shader)\n\n    frequency_display_countdown = frequency_display_countdown - 1\n    if frequency_display_countdown > 0 then\n        if frequency_display_countdown < 50 then\n            font_alpha = 1.0 - ((50 - frequency_display_countdown) / 50.0)\n        else\n            font_alpha = 1.0\n        end\n        ngl_font_draw(freq_font, freq - (freq_offset / 1000000), 1, 0.7, font_alpha)\n        info = find_range(freq)\n        if info then\n            ngl_font_draw(info_font, info.label, 1, 0.8, font_alpha)\n        end\n    end\nend\n\nfunction on_key(key, mods)\n    if (mods == 1) then -- Shift key\n        d = 10\n    elseif (mods == 4) then -- Alt key\n        d = 0.001\n    else\n        d = 0.1\n    end\n    if key == KEY_A then\n        switch_freq()\n    elseif key == KEY_RIGHT then\n        set_freq(freq + d)\n    elseif key == KEY_LEFT then\n        set_freq(freq - d)\n    end\nend\n"
  },
  {
    "path": "lua/fft-shifted.lua",
    "content": "-- Visualize FFT data as a texture\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nout vec3 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    texCoord = vt;\n    gl_Position = vec4(vp.x*2, vp.z*2, 0, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nin vec2 texCoord;\nuniform sampler2D uTexture;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    float r = texture(uTexture, texCoord).r;\n    float g = texture(uTexture, texCoord).g;\n    float pwr = r * r + g * g;\n    float pwr_dbfs = 10.0 * log2(pwr + 1.0e-20) / log2(2.7182818284);\n\n    //float v = sqrt(r * r + g * g) * 0.1;\n    float v = pwr_dbfs * 0.02;\n    fragColor = vec4(v, v, v, 0.95);\n}\n]]\n\nfunction setup()\n    freq = 97.5\n    shift = 0\n    device = nrf_device_new(freq, \"../rfdata/rf-200.500-big.raw\")\n    shifter = nrf_freq_shifter_new(shift, device.sample_rate)\n    fft = nrf_fft_new(1024, 1024)\n\n    camera = ngl_camera_new_look_at(0, 0, 0) -- Camera is unnecessary but ngl_draw_model requires it\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(2, 2, 1, 1)\nend\n\nfunction draw()\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    nrf_freq_shifter_process(shifter, samples_buffer)\n    shifter_buffer = nrf_freq_shifter_get_buffer(shifter)\n    nrf_fft_process(fft, shifter_buffer)\n    fft_buffer = nrf_fft_get_buffer(fft)\n\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_texture_update(texture, fft_buffer, 1024, 1024)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_frequency_handler(key, mods)\n    if key == KEY_LEFT_BRACKET then\n        shift = shift - 10e3\n        shifter = nrf_freq_shifter_new(shift, device.sample_rate)\n        print(\"Shift: \" .. shift)\n    elseif key == KEY_RIGHT_BRACKET then\n        shift = shift + 10e3\n        shifter = nrf_freq_shifter_new(shift, device.sample_rate)\n        print(\"Shift: \" .. shift)\n    end\nend\n"
  },
  {
    "path": "lua/fft.lua",
    "content": "-- Visualize FFT data as a texture\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nout vec3 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    texCoord = vt;\n    gl_Position = vec4(vp.x*2, vp.z*2, 0, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nin vec2 texCoord;\nuniform sampler2D uTexture;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    float r = texture(uTexture, texCoord).r * 0.1;\n    fragColor = vec4(r, r, r, 0.95);\n}\n]]\n\nfunction setup()\n    freq = 97\n    device = nrf_device_new(freq, \"../rfdata/rf-200.500-big.raw\")\n    fft = nrf_fft_new(1024, 1024)\n\n    camera = ngl_camera_new_look_at(0, 0, 0) -- Camera is unnecessary but ngl_draw_model requires it\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(2, 2, 1, 1)\nend\n\nfunction draw()\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    nrf_fft_process(fft, samples_buffer)\n    fft_buffer = nrf_fft_get_buffer(fft)\n\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_texture_update(texture, fft_buffer, 1024, 1024)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_frequency_handler(key, mods)\nend\n"
  },
  {
    "path": "lua/fm-player.lua",
    "content": "-- Play FM radio. Has no visible interface.\n\nfunction setup()\n    freq_offset = 50000\n    freq = (100.9e6 + freq_offset) / 1e6\n    device = nrf_device_new(freq, \"../rfdata/rf-100.900-1.raw\")\n    player = nrf_player_new(device, NRF_DEMODULATE_WBFM, freq_offset)\n    freq_font = ngl_font_new(\"../fonts/Roboto-Bold.ttf\", 72)\nend\n\nfunction draw()\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_font_draw(freq_font, freq, 1, 0.7, 1.0)\nend\n\nfunction on_key(key, mods)\n    keys_frequency_handler(key, mods)\n    keys_frequency_offset_handler(key, mods)\nend\n"
  },
  {
    "path": "lua/grid-ripple.lua",
    "content": "-- Use noise on a grid\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 0.0, 0.0);\n    float force = .6;\n    float speed = 4.0;\n    vec2 p = -1.0 + 2.0 * vp.xy / vec2(1.0,1.0);\n    float len = length(p);\n    vec2 uv = vp.xy + (p/len) * sin(len * 2.0 - uTime * speed) * force;\nuv.x = uv.x + 2.0* sin(uTime/2.0);\n    vec3 pt = vec3(uv.x, noise1(noise1(uv.x * .287) + noise1(uv.y * 0.393) + uTime * .95), vp.y);\n    gl_PointSize = 2;\ncolor = vec3(0.26, 0.8-noise1(pt.y*5.0), 1.0-(noise1(pt.y*5.0)));\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(pt, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.95);\n}\n]]\n\nfunction setup()\n    shader = ngl_shader_new(GL_POINTS, VERTEX_SHADER, FRAGMENT_SHADER)\n    model = ngl_model_new_grid_points(500, 500, 0.05, 0.05)\n    --model = ngl_model_load_obj(\"../obj/c004.obj\")\nend\n\nfunction draw()\n    camera = ngl_camera_new_look_at(0, -5, -5)\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_draw_model(camera, model, shader)\nend\n"
  },
  {
    "path": "lua/grid.lua",
    "content": "-- Draw a grid\n-- Animation happens in the shader\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    vec3 pt = vp * 2.0;\n    gl_PointSize = abs(sin(pt.x * pt.y * uTime * 5.0)  * 5.0);\n    gl_Position = vec4(pt, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.95);\n}\n]]\n\nfunction setup()\n    camera = ngl_camera_new_look_at(0, 0, 0) -- Shader ignores camera position, but camera object is required for ngl_draw_model\n    shader = ngl_shader_new(GL_POINTS, VERTEX_SHADER, FRAGMENT_SHADER)\n    model = ngl_model_new_grid_points(100, 100, 0.01, 0.01)\nend\n\nfunction draw()\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_draw_model(camera, model, shader)\nend\n"
  },
  {
    "path": "lua/iq-lines-animate-freq.lua",
    "content": "-- Visualize IQ data as lines, animating through the spectrum\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nout vec3 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    texCoord = vt;\n    gl_Position = vec4(vp.x*2, vp.z*2, 0, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nin vec2 texCoord;\nuniform sampler2D uTexture;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    float r = texture(uTexture, texCoord).r * 20;\n    fragColor = vec4(r, r, r, 1);\n}\n]]\n\nfunction setup()\n    freq = 100\n    line_percentage = 0.01\n    device = nrf_device_new(freq, \"../rfdata/rf-202.500-2.raw\")\n    filter = nrf_iq_filter_new(device.sample_rate, 100e3, 51)\n\n    camera = ngl_camera_new_look_at(0, 0, 0) -- Camera is unnecessary but ngl_draw_model requires it\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(2, 2, 1, 1)\nend\n\nfunction draw()\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    nrf_iq_filter_process(filter, samples_buffer)\n    filter_buffer = nrf_iq_filter_get_buffer(filter)\n    iq_buffer = nrf_buffer_to_iq_lines(filter_buffer, 4, 0.3)\n\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_texture_update(texture, iq_buffer, 1024, 1024)\n    ngl_draw_model(camera, model, shader)\n\n    freq = freq + 0.0001\n    nrf_device_set_frequency(device, freq)\nend\n"
  },
  {
    "path": "lua/iq-lines-animate-one.lua",
    "content": "-- Visualize a single sample\n\nif NWM_OPENGL_TYPE == NWM_OPENGL then\n\n    VERTEX_SHADER = [[\n    #version 400\n    layout (location = 0) in vec3 vp;\n    layout (location = 1) in vec3 vn;\n    layout (location = 2) in vec2 vt;\n    out vec3 color;\n    out vec2 texCoord;\n    uniform mat4 uViewMatrix, uProjectionMatrix;\n    uniform float uTime;\n    void main() {\n        color = vec3(1.0, 1.0, 1.0);\n        texCoord = vt;\n        gl_Position = vec4(vp.x*2, vp.z*2, 0, 1.0);\n    }\n    ]]\n\n    FRAGMENT_SHADER = [[\n    #version 400\n    in vec3 color;\n    in vec2 texCoord;\n    uniform sampler2D uTexture;\n    layout (location = 0) out vec4 fragColor;\n    void main() {\n        float r = texture(uTexture, texCoord).r * 100;\n        fragColor = vec4(r, r, r, 1);\n    }\n    ]]\n\nelse\n\n    VERTEX_SHADER = [[\n    attribute vec3 vp;\n    attribute vec3 vn;\n    attribute vec2 vt;\n    varying vec3 color;\n    varying vec2 texCoord;\n    uniform mat4 uViewMatrix, uProjectionMatrix;\n    uniform float uTime;\n    void main() {\n        color = vec3(1.0, 1.0, 1.0);\n        texCoord = vt;\n        gl_Position = vec4(vp.x*2, vp.z*2, 0, 1.0);\n    }\n    ]]\n\n    FRAGMENT_SHADER = [[\n    precision mediump float;\n    varying vec3 color;\n    varying vec2 texCoord;\n    uniform sampler2D uTexture;\n    void main() {\n        float r = texture2D(uTexture, texCoord).a * 100;\n        gl_FragColor = vec4(r, r, r, 1.0);\n    }\n    ]]\n\nend\n\nfunction setup()\n    countdown = 10\n    percentage = 0\n    device = nrf_device_new(100.9, \"../rfdata/rf-2.500-1.raw\")\n    filter = nrf_iq_filter_new(device.sample_rate, 200e3, 51)\n\n    camera = ngl_camera_new_look_at(0, 0, 0) -- Shader ignores camera position, but camera object is required for ngl_draw_model\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(2, 2, 1, 1)\nend\n\nfunction draw()\n    if countdown > 0 then\n        samples_buffer = nrf_device_get_samples_buffer(device)\n        nrf_iq_filter_process(filter, samples_buffer)\n        filter_buffer = nrf_iq_filter_get_buffer(filter)\n        countdown = countdown - 1\n    elseif percentage > 1 then\n        countdown = 1\n        percentage = 0\n    else\n        iq_buffer = nrf_buffer_to_iq_lines(filter_buffer, 4, percentage)\n\n        ngl_clear(0.2, 0.2, 0.2, 1.0)\n        ngl_texture_update(texture, iq_buffer, 1024, 1024)\n        ngl_draw_model(camera, model, shader)\n\n        percentage = percentage + 0.001\n    end\nend\n\nfunction on_key(key, mods)\n    if key == KEY_E then\n        nut_buffer_save(nut_buffer_convert(buffer, 1), \"out.raw\")\n    end\nend\n"
  },
  {
    "path": "lua/iq-lines-buffer.lua",
    "content": "-- Visualize IQ data as lines.\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nout vec3 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    texCoord = vt;\n    gl_Position = vec4(vp.x*2, vp.z*2, 0, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nin vec2 texCoord;\nuniform sampler2D uTexture;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    float r = texture(uTexture, texCoord).r * 1;\n    fragColor = vec4(r, r, r, 1);\n}\n]]\n\nfunction setup()\n    freq = 433\n    device = nrf_device_new(freq, \"../rfdata/rf-200.500-big.raw\")\n    --filter = nrf_iq_filter_new(device.sample_rate, 100e3, 43)\n\n    camera = ngl_camera_new_look_at(0, 0, 0) -- Camera is unnecessary but ngl_draw_model requires it\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(2, 2, 1, 1)\nend\n\nfunction draw()\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    --nrf_iq_filter_process(filter, samples_buffer)\n    --filter_buffer = nrf_iq_filter_get_buffer(filter)\n    iq_buffer = nrf_buffer_to_iq_lines(samples_buffer, 2, 1.0)\n\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_texture_update(texture, iq_buffer, 512, 512)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_frequency_handler(key, mods)\n    if key == KEY_E then\n        nut_buffer_save(nut_buffer_convert(filter_buffer, 1), \"out.raw\")\n    end\nend\n"
  },
  {
    "path": "lua/iq-lines.lua",
    "content": "-- Visualize IQ data from the HackRF\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    vec2 pt = vec2((vp.x - 0.5) * 2, (vp.y - 0.5) * 2);\n    gl_Position = vec4(pt.x, pt.y, 0.0, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.95);\n}\n]]\n\nfunction setup()\n    freq = 143.2\n    line_percentage = 0.04\n    device = nrf_device_new(freq, \"../rfdata/rf-200.500-big.raw\")\n\n    camera = ngl_camera_new_look_at(0, 0, 0) -- Shader ignores camera position, but camera object is required for ngl_draw_model\n    shader = ngl_shader_new(GL_LINE_STRIP, VERTEX_SHADER, FRAGMENT_SHADER)\nend\n\nfunction draw()\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    reduced_buffer = nut_buffer_reduce(samples_buffer, line_percentage)\n\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    model = ngl_model_new_with_buffer(reduced_buffer)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction clamp(v, min, max)\n    if v < min then\n        return min\n    elseif v > max then\n        return max\n    else\n        return v\n    end\nend\n\nfunction on_key(key, mods)\n    keys_frequency_handler(key, mods)\n    if (mods == 4) then -- Alt key\n        d = 0.001\n    else\n        d = 0.01\n    end\n    if key == KEY_COMMA then\n        line_percentage = clamp(line_percentage - d, 0, 1)\n        print(\"Line percentage: \" .. line_percentage * 100 .. \"%\")\n    elseif key == KEY_PERIOD then\n        line_percentage = clamp(line_percentage + d, 0, 1)\n        print(\"Line percentage: \" .. line_percentage * 100 .. \"%\")\n    end\nend\n"
  },
  {
    "path": "lua/iq-tex-3d-filtered.lua",
    "content": "-- Visualize IQ data from the HackRF in 3D.\n-- Calculate normals and lighting\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nflat out vec4 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nuniform sampler2D uTexture;\nvoid main() {\n    float offset = 0.0;\n    float power = 1;\n    float t1 = offset + texture(uTexture, vt).r * power;\n    float t2 = offset + texture(uTexture, vt + vec2(0.01, 0)).r * power;\n    float t3 = offset + texture(uTexture, vt + vec2(0, 0.01)).r * power;\n    vec3 v1 = vec3(vp.x, t1, vp.z);\n    vec3 v2 = vec3(vp.x + 0.01, t2, vp.z);\n    vec3 v3 = vec3(vp.x, t3, vp.z + 0.01);\n\n    vec3 u = v2 - v1;\n    vec3 v = v3 - v1;\n    float x = (u.y * v.z) - (u.z * v.y);\n    float y = (u.z * v.x) - (u.x * v.z);\n    float z = (u.x * v.y) - (u.y * v.x);\n    vec3 n = vec3(x, y, z);\n\n    color = vec4(1.0, 1.0, 1.0, 1.0) * dot(normalize(v1), normalize(n)) * 0.5;\n    color += vec4(0.2, 0.2, 0.4, 0.5);\n    color *= 2;\n\n    float l = 1.0 - ((vp.x * vp.x + vp.z * vp.z) * 1.0);\n    color *= vec4(l, l, l, l);\n    texCoord = vt;\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(v1, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nflat in vec4 color;\nin vec2 texCoord;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = color;\n}\n]]\n\ncamera_x = 0.0\ncamera_y = 1\ncamera_z = 1\n\nfunction setup()\n    freq = 97\n    device = nrf_device_new(freq, \"../rfdata/rf-202.500-2.raw\")\n    filter = nrf_iq_filter_new(device.sample_rate, 200e3, 21)\n\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(256, 256, 0.005, 0.005)\n    ngl_model_translate(model, 0, -0.1, 0)\nend\n\nfunction draw()\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    nrf_iq_filter_process(filter, samples_buffer)\n    filter_buffer = nrf_iq_filter_get_buffer(filter)\n    iq_buffer = nrf_buffer_to_iq_points(filter_buffer) -- nrf_device_get_iq_buffer(device)\n\n\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    camera = ngl_camera_new_look_at(camera_x, camera_y, camera_z)\n    ngl_texture_update(texture, iq_buffer, 256, 256)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_camera_handler(key, mods)\n    keys_frequency_handler(key, mods)\nend\n"
  },
  {
    "path": "lua/iq-tex-3d.lua",
    "content": "-- Visualize IQ data from the HackRF in 3D.\n-- Calculate normals and lighting\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nflat out vec4 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nuniform sampler2D uTexture;\nvoid main() {\n    float offset = 0.0;\n    float power = 1;\n    float t1 = offset + texture(uTexture, vt).r * power;\n    float t2 = offset + texture(uTexture, vt + vec2(0.01, 0)).r * power;\n    float t3 = offset + texture(uTexture, vt + vec2(0, 0.01)).r * power;\n    vec3 v1 = vec3(vp.x, t1, vp.z);\n    vec3 v2 = vec3(vp.x + 0.01, t2, vp.z);\n    vec3 v3 = vec3(vp.x, t3, vp.z + 0.01);\n\n    vec3 u = v2 - v1;\n    vec3 v = v3 - v1;\n    float x = (u.y * v.z) - (u.z * v.y);\n    float y = (u.z * v.x) - (u.x * v.z);\n    float z = (u.x * v.y) - (u.y * v.x);\n    vec3 n = vec3(x, y, z);\n\n    color = vec4(1.0, 1.0, 1.0, 1.0) * dot(normalize(v1), normalize(n)) * 0.5;\n    color += vec4(0.2, 0.2, 0.4, 0.5);\n    color *= 2;\n\n    float l = 1.0 - ((vp.x * vp.x + vp.z * vp.z) * 1.0);\n    color *= vec4(l, l, l, l);\n    texCoord = vt;\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(v1, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nflat in vec4 color;\nin vec2 texCoord;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = color;\n}\n]]\n\ncamera_x = 0.0\ncamera_y = 1\ncamera_z = 1\n\nfunction setup()\n    freq = 201.2\n    device = nrf_device_new(freq, \"../rfdata/rf-202.500-2.raw\")\n\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(256, 256, 0.005, 0.005)\n    ngl_model_translate(model, 0, -0.1, 0)\nend\n\nfunction draw()\n    iq_buffer = nrf_device_get_iq_buffer(device)\n\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    camera = ngl_camera_new_look_at(camera_x, camera_y, camera_z)\n    ngl_texture_update(texture, iq_buffer, 256, 256)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_camera_handler(key, mods)\n    keys_frequency_handler(key, mods)\nend\n"
  },
  {
    "path": "lua/iq-tex-audio.lua",
    "content": "-- Visualize IQ data as a texture from the HackRF\n-- You want seizures? 'Cause this is how you get seizures.\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nout vec3 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    texCoord = vt; // vec2(vp.x + 0.5, vp.z + 0.5);\n    gl_Position = vec4(vp.x*2, vp.z*2, 0, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nin vec2 texCoord;\nuniform sampler2D uTexture;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    float r = texture(uTexture, texCoord).r * 10;\n    fragColor = vec4(r, r, r, 0.95);\n}\n]]\n\nfunction setup()\n    freq = 97.6\n    freq_offset = 100000\n    device = nrf_device_new(freq, \"../rfdata/rf-200.500-big.raw\")\n    shifter = nrf_freq_shifter_new(freq_offset, device.sample_rate)\n    filter = nrf_iq_filter_new(device.sample_rate, 10e3, 51)\n    player = nrf_player_new(device, NRF_DEMODULATE_WBFM, freq_offset)\n\n    camera = ngl_camera_new_look_at(0, 0, 0) -- Camera is unnecessary but ngl_draw_model requires it\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(2, 2, 1, 1)\nend\n\nfunction draw()\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    nrf_freq_shifter_process(shifter, samples_buffer)\n    shifter_buffer = nrf_freq_shifter_get_buffer(shifter)\n    nrf_iq_filter_process(filter, shifter_buffer)\n    filter_buffer = nrf_iq_filter_get_buffer(filter)\n    iq_buffer = nrf_buffer_to_iq_points(filter_buffer)\n\n\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_texture_update(texture, iq_buffer, 256, 256)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_frequency_handler(key, mods)\n    keys_frequency_offset_handler(key, mods)\nend\n"
  },
  {
    "path": "lua/iq-tex-filtered.lua",
    "content": "-- Visualize IQ data as a texture from the HackRF\n-- You want seizures? 'Cause this is how you get seizures.\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nout vec3 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    texCoord = vt;\n    gl_Position = vec4(vp.x*2, vp.z*2, 0, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nin vec2 texCoord;\nuniform sampler2D uTexture;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    float r = texture(uTexture, texCoord).r * 90;\n    fragColor = vec4(r, r, r, 1);\n}\n]]\n\nfunction setup()\n    freq = 936.2\n    device = nrf_device_new(freq, \"../rfdata/rf-200.500-big.raw\")\n    filter = nrf_iq_filter_new(device.sample_rate, 200e3, 51)\n\n    camera = ngl_camera_new_look_at(0, 0, 0) -- Camera is unnecessary but ngl_draw_model requires it\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(2, 2, 1, 1)\nend\n\nfunction draw()\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    nrf_iq_filter_process(filter, samples_buffer)\n    filter_buffer = nrf_iq_filter_get_buffer(filter)\n    iq_buffer = nrf_buffer_to_iq_lines(filter_buffer, 4, 0.2)\n\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_texture_update(texture, iq_buffer, 1024, 1024)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_frequency_handler(key, mods)\n    if key == KEY_E then\n        nut_buffer_save(nut_buffer_convert(buffer, 1), \"out.raw\")\n    end\nend\n"
  },
  {
    "path": "lua/iq-tex-steps.lua",
    "content": "-- Visualize IQ data as a texture from a file.\n-- Don't connect a device.\n-- Steps are deliberate.\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nout vec3 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    texCoord = vt;\n    gl_Position = vec4(vp.x*2, vp.z*2, 0, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nin vec2 texCoord;\nuniform sampler2D uTexture;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    float r = texture(uTexture, texCoord).r * 5;\n    fragColor = vec4(r, r, r, 0.95);\n}\n]]\n\nfunction setup()\n    freq = 612.004\n    device = nrf_device_new(freq, \"../rfdata/rf-612.004-big.raw\")\n    nrf_device_set_paused(device, true)\n    camera = ngl_camera_new_look_at(0, 0, 0) -- Camera is unnecessary but ngl_draw_model requires it\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(2, 2, 1, 1)\nend\n\nfunction draw()\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    buffer = nrf_device_get_iq_buffer(device);\n    ngl_texture_update(texture, buffer, 256, 256);\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_frequency_handler(key, mods)\n    if (key == KEY_SPACE) then\n        nrf_device_step(device)\n    end\nend\n"
  },
  {
    "path": "lua/iq-tex.lua",
    "content": "-- Visualize IQ data as a texture from the HackRF\n-- You want seizures? 'Cause this is how you get seizures.\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nout vec3 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    texCoord = vt;\n    gl_Position = vec4(vp.x*2, vp.z*2, 0, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nin vec2 texCoord;\nuniform sampler2D uTexture;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    float r = texture(uTexture, texCoord).r * 10;\n    fragColor = vec4(r, r, r, 1);\n}\n]]\n\nfunction setup()\n    freq = 200.5\n    device = nrf_device_new(freq, \"../rfdata/rf-200.500-big.raw\")\n    camera = ngl_camera_new_look_at(0, 0, 0) -- Camera is unnecessary but ngl_draw_model requires it\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(2, 2, 1, 1)\nend\n\nfunction draw()\n    iq_buffer = nrf_device_get_iq_buffer(device)\n\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_texture_update(texture, iq_buffer, 256, 256)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_frequency_handler(key, mods)\nend\n"
  },
  {
    "path": "lua/keys.lua",
    "content": "-- Show keys\n\nfunction setup()\nend\n\nfunction draw()\n    ngl_clear(0.2, 0.2, 0.2, 1)\nend\n\nfunction on_key(key)\n    print(\"Key \" .. key)\n    if key == KEY_SPACE then\n        print(\"Space\")\n    elseif key == KEY_DOWN then\n        print(\"Down\")\n    end\nend\n\n"
  },
  {
    "path": "lua/model-sea.lua",
    "content": "-- Display a static scene with a diffuse shader.\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color = vec3(.41,.3,.2);\nuniform mat4 uViewMatrix, uProjectionMatrix, NormalMatrix;\nuniform float uTime;\n\nvoid main() {\nfloat roughness = .0025;\nfloat innertexture = 50;\nfloat yflow = 4.50;\nvec3 pt = vec3(vp.x + noise1(uTime/10.0-vp.y),vp.y+noise1(vp.x * (roughness* 30.0) + noise1(vp.z * roughness) + uTime * 0.5) *yflow,vp.z);\n\ncolor = vec3(0.8-noise1(vp.z*innertexture), 1.0-noise1(vp.z*innertexture), 1.0-(noise1(vp.x*innertexture)));\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(pt, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.95);\n}\n]]\n\nfunction setup()\n    model = ngl_model_load_obj(\"../obj/c004.obj\")\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\nend\n\nfunction draw()\n    ngl_clear(0.2, 0.2, 0.2, 1)\n    time = nwm_get_time()\n    camera_x = math.sin(time * 0.5) * 50.0\n    camera_z = math.cos(time * 0.5) * 50.0\n    --camera = ngl_camera_new_look_at(camera_x,10,camera_z)\n    camera = ngl_camera_new_look_at(camera_x,30,80)\n    ngl_draw_model(camera, model, shader)\nend\n"
  },
  {
    "path": "lua/noise-grid-triangles.lua",
    "content": "-- Use noise on a grid triangles\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    vec3 pt = vec3(vp.x * 10, 0, vp.z * 10);\n    color = vec3(1.0, 1.0, 1.0);\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(pt, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.95);\n}\n]]\n\nfunction setup()\n    shader = ngl_shader_new(GL_LINES, VERTEX_SHADER, FRAGMENT_SHADER)\n    model = ngl_model_new_grid_triangles(100, 100, 0.01, 0.01)\nend\n\nfunction draw()\n    camera = ngl_camera_new_look_at(0, 5, 10)\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_draw_model(camera, model, shader)\nend\n"
  },
  {
    "path": "lua/noise-grid-wave.lua",
    "content": "-- Use noise on a grid triangles\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\nfloat roughness = 2.0;\nfloat innertexture = 50;\nfloat yflow = 1.50;\n    vec3 pt = vec3((vp.x + noise1(uTime/10.0-vp.z))* 40, noise1(noise1(vp.x * (roughness* 3.0)) + noise1(vp.z * roughness) + uTime * 0.5) * yflow, vp.z * 40);\ncolor = vec3(0.8-noise1(vp.x*innertexture), 1.0-noise1(vp.x*innertexture), 1.0-(noise1(vp.x*innertexture))); //vertical\n//color = vec3(0.8-noise1(vp.z*innertexture), 1.0-noise1(vp.z*innertexture), 1.0-(noise1(vp.z*innertexture))); // horizontal\n//color = vec3(0.8, 1.0-noise1(vp.x*innertexture*3), 1.0-(noise1(vp.z*innertexture)+noise1(vp.x*innertexture))); // mix + color accent\n\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(pt, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.95);\n}\n]]\n\nfunction setup()\n    shader = ngl_shader_new(GL_LINES, VERTEX_SHADER, FRAGMENT_SHADER)\n    model = ngl_model_new_grid_triangles(100, 100, 0.01, 0.01)\nend\n\nfunction draw()\n    camera = ngl_camera_new_look_at(0, 5, 10)\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_draw_model(camera, model, shader)\nend\n"
  },
  {
    "path": "lua/noise-grid.lua",
    "content": "-- Use noise on a grid\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\n\nvoid main() {\n    float increase = 6.0;\n    vec3 pt = vec3(vp.x * 10, noise1(noise1((vp.x) * increase) + noise1(vp.y * increase) + uTime * 0.5), vp.y * 10);\n    color.r = .25;\n    color.g = (pt.z * (pt.y/3.0));\n    color.b = .5+(pt.y * 2.0);\n    gl_PointSize = 5;\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(pt, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.95);\n}\n]]\n\nfunction setup()\n    shader = ngl_shader_new(GL_POINTS, VERTEX_SHADER, FRAGMENT_SHADER)\n    model = ngl_model_new_grid_points(500, 500, 0.005, 0.005)\nend\n\nfunction draw()\n    camera = ngl_camera_new_look_at(0, -5, -5)\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_draw_model(camera, model, shader)\nend\n"
  },
  {
    "path": "lua/osc-rotate.lua",
    "content": "-- Rotate the camera based on OSC messages from OSCulator\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0) * dot(normalize(vp), normalize(vn)) * 0.3;\n    color += vec3(0.1, 0.1, 0.5);\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(vp, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.95);\n}\n]]\n\nfunction handle_message(path, args)\n    if path == \"/wii/1/accel/pry\" then\n        pitch = args[1] - 0.5\n        roll = args[2] - 0.5\n        yaw = args[3] - 0.5\n        accel = args[4] - 0.5\n        camera_y = camera_y - yaw * 5\n    end\nend\n\n\nfunction setup()\n    camera_x = 0\n    camera_y = 0\n    camera_z = 0\n\n    server = nosc_server_new(2222, handle_message)\n    model = ngl_model_load_obj(\"../obj/cubes.obj\")\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\nend\n\nfunction draw()\n    nosc_server_update(server)\n\n    camera = ngl_camera_new()\n    ngl_camera_translate(camera, 10, -2, 10)\n    ngl_camera_rotate_y(camera, camera_y)\n\n    ngl_clear(0.2, 0.2, 0.2, 1)\n    ngl_draw_model(camera, model, shader)\nend\n"
  },
  {
    "path": "lua/osc-server.lua",
    "content": "-- Receive OSC events\n\nfunction handle_message(path, args)\n    print(\"OSC path: \" .. path .. \" len: \" .. #args .. \" 1: \" .. args[1])\nend\n\nfunction setup()\n    server = nosc_server_new(2222, handle_message)\nend\n\nfunction draw()\n    nosc_server_update(server)\n    ngl_clear(0.2, 0.2, 0.2, 1)\nend\n"
  },
  {
    "path": "lua/psychedelic-noise.lua",
    "content": "-- Use noise on a grid triangles\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    vec3 pt = vec3(vp.x * 10, noise1(vp.x + 2 * vp.z + 1 * uTime) * 1.0, vp.z * 10);\n    color = vec3(1.0, 1.0, 1.0);\n    gl_PointSize = 2;\n    vec3 ptn = pt;\n    color = vec3(1.0, 1.0, 1.0) * dot(normalize(pt), normalize(ptn)) * 0.3;\n    //color += vec3(0.1, 0.1, 0.5);\n    color = noise3(pt.x * pt.y * pt.z * 0.4) * 2.0;\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(pt, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.95);\n}\n]]\n\nfunction setup()\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    model = ngl_model_new_grid_triangles(100, 100, 0.01, 0.01)\nend\n\nfunction draw()\n    camera = ngl_camera_new_look_at(0, -7, 0.1)\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_draw_model(camera, model, shader)\nend\n"
  },
  {
    "path": "lua/samples-and-model.lua",
    "content": "-- Visualize IQ data as a texture from the HackRF\n-- You want seizures? 'Cause this is how you get seizures.\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nflat out vec4 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nuniform sampler2D uTexture;\nvoid main() {\n    float offset = -10;\n    float power = 20;\n    float t1 = offset + texture(uTexture, vt).r * power;\n    float t2 = offset + texture(uTexture, vt + vec2(0.01, 0)).r * power;\n    float t3 = offset + texture(uTexture, vt + vec2(0, 0.01)).r * power;\n    vec3 v1 = vec3(vp.x, t1, vp.z);\n    vec3 v2 = vec3(vp.x + 0.01, t2, vp.z);\n    vec3 v3 = vec3(vp.x, t3, vp.z + 0.01);\n\n    vec3 u = v2 - v1;\n    vec3 v = v3 - v1;\n    float x = (u.y * v.z) - (u.z * v.y);\n    float y = (u.z * v.x) - (u.x * v.z);\n    float z = (u.x * v.y) - (u.y * v.x);\n    vec3 n = vec3(x, y, z);\n\n    color = vec4(1.0, 1.0, 1.0, 0.8) * dot(normalize(v1), normalize(n)) * 1;\n    color += vec4(0.2, 0.2, 0.4, 0.5);\n    //color *= 0.9;\n\n    float l = abs(1.0 - ((vp.x * vp.x + vp.z * vp.z) * 0.0003));\n    color *= vec4(l, l, l, l);\n    texCoord = vt;\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(v1, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nflat in vec4 color;\nin vec2 texCoord;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = color;\n}\n]]\n\nROOM_VERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0) * dot(normalize(vp), normalize(vn)) * 0.5;\n    //color += vec3(0.2, 0.5, 0.8);\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(vp, 1.0);\n}\n]]\n\nROOM_FRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.3);\n}\n]]\n\nfunction setup()\n    camera_x = -30\n    camera_y = 18\n    camera_z = 50\n    freq = 50.1\n    device = nrf_device_new(freq, \"../rfdata/rf-202.500-2.raw\")\n    interpolator = nrf_interpolator_new(0.01)\n\n\n    grid_shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    room_shader = ngl_shader_new(GL_TRIANGLES, ROOM_VERTEX_SHADER, ROOM_FRAGMENT_SHADER)\n    texture = ngl_texture_new(grid_shader, \"uTexture\")\n    grid_model = ngl_model_new_grid_triangles(100, 100, 1, 1)\n    room_model = ngl_model_load_obj(\"../obj/c004.obj\")\nend\n\nfunction draw()\n    buffer = nrf_device_get_samples_buffer(device)\n    nrf_interpolator_process(interpolator, buffer)\n    interpolator_buffer = nrf_interpolator_get_buffer(interpolator)\n\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_texture_update(texture, interpolator_buffer, 512, 256)\n    camera = ngl_camera_new_look_at(camera_x, camera_y, camera_z)\n    ngl_draw_model(camera, grid_model, grid_shader)\n    ngl_draw_model(camera, room_model, room_shader)\nend\n\nfunction on_key(key, mods)\n    keys_camera_handler(key, mods)\n    keys_frequency_handler(key, mods)\nend\n\n"
  },
  {
    "path": "lua/samples-tex-3d-filtered.lua",
    "content": "-- Visualize IQ data as a texture from the HackRF\n-- You want seizures? 'Cause this is how you get seizures.\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nout vec4 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nuniform sampler2D uTexture;\nvoid main() {\n    float l = 1.0 - ((vp.x * vp.x + vp.z * vp.z) * 0.04);\n    color = vec4(l, l, l, l);\n    texCoord = vt;\n    float r = texture(uTexture, vt).r * 1.5;\n\n    vec3 pt = vec3(vp.x, r, vp.z);\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(pt, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec4 color;\nin vec2 texCoord;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = color;\n}\n]]\n\nfunction setup()\n    freq = 97.5\n    device = nrf_device_new(freq, \"../rfdata/rf-202.500-2.raw\")\n    filter = nrf_iq_filter_new(device.sample_rate, 10e3, 23)\n\n    camera = ngl_camera_new_look_at(0, 2, 4)\n    shader = ngl_shader_new(GL_LINE_STRIP, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(100, 100, 0.1, 0.1)\nend\n\nfunction draw()\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    nrf_iq_filter_process(filter, samples_buffer)\n    filter_buffer = nrf_iq_filter_get_buffer(filter)\n\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_texture_update(texture, filter_buffer, 512, 256)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_frequency_handler(key, mods)\nend\n\n"
  },
  {
    "path": "lua/samples-tex-3d.lua",
    "content": "-- Visualize IQ data as a texture from the HackRF\n-- You want seizures? 'Cause this is how you get seizures.\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nout vec4 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nuniform sampler2D uTexture;\nvoid main() {\n    float l = 1.0 - ((vp.x * vp.x + vp.z * vp.z) * 0.04);\n    color = vec4(l, l, l, l);\n    texCoord = vt;\n    float r = texture(uTexture, vt).r * 1;\n\n    vec3 pt = vec3(vp.x, r, vp.z);\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(pt, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec4 color;\nin vec2 texCoord;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = color;\n}\n]]\n\nfunction setup()\n    freq = 199.9\n    device = nrf_device_new(freq, \"../rfdata/rf-202.500-2.raw\")\n    camera = ngl_camera_new_look_at(0, 2, 4)\n    shader = ngl_shader_new(GL_LINE_STRIP, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(100, 100, 0.1, 0.1)\nend\n\nfunction draw()\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    buffer = nrf_device_get_samples_buffer(device)\n    ngl_texture_update(texture, buffer, 512, 256)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_frequency_handler(key, mods)\nend\n\n"
  },
  {
    "path": "lua/samples-tex-shaded.lua",
    "content": "-- Visualize IQ data as a texture from the HackRF\n-- Calculate normals and lighting\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nflat out vec4 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nuniform sampler2D uTexture;\nvoid main() {\n    float offset = -0.2;\n    float power = 0.1;\n    float t1 = offset + texture(uTexture, vt).r * power;\n    float t2 = offset + texture(uTexture, vt + vec2(0.01, 0)).r * power;\n    float t3 = offset + texture(uTexture, vt + vec2(0, 0.01)).r * power;\n    vec3 v1 = vec3(vp.x, t1, vp.z);\n    vec3 v2 = vec3(vp.x + 0.01, t2, vp.z);\n    vec3 v3 = vec3(vp.x, t3, vp.z + 0.01);\n\n    vec3 u = v2 - v1;\n    vec3 v = v3 - v1;\n    float x = (u.y * v.z) - (u.z * v.y);\n    float y = (u.z * v.x) - (u.x * v.z);\n    float z = (u.x * v.y) - (u.y * v.x);\n    vec3 n = vec3(x, y, z);\n\n    color = vec4(1.0, 1.0, 1.0, 1.0) * dot(normalize(v1), normalize(n)) * 0.5;\n    color += vec4(0.2, 0.2, 0.4, 0.5);\n    color *= 2;\n\n    float l = 1.0 - ((vp.x * vp.x + vp.z * vp.z) * 2.0);\n    color *= vec4(l, l, l, l);\n    texCoord = vt;\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(v1, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nflat in vec4 color;\nin vec2 texCoord;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = color;\n}\n]]\n\nfunction setup()\n    freq = 201.2\n    device = nrf_device_new(freq, \"../rfdata/rf-202.500-2.raw\")\n    camera = ngl_camera_new_look_at(0, 0.3, 0.5)\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(100, 100, 0.01, 0.01)\nend\n\nfunction draw()\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    buffer = nrf_device_get_samples_buffer(device)\n    ngl_texture_update(texture, buffer, 512, 256)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_frequency_handler(key, mods)\nend\n"
  },
  {
    "path": "lua/samples-tex-slow.lua",
    "content": "-- Visualize IQ data as a texture from the HackRF\n-- You want seizures? 'Cause this is how you get seizures.\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nout vec3 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    texCoord = vt; // vec2(vp.x + 0.5, vp.z + 0.5);\n    gl_Position = vec4(vp.x*2, vp.z*2, 0, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nin vec2 texCoord;\nuniform sampler2D uTexture;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    float r = texture(uTexture, texCoord).r * 1;\n    fragColor = vec4(r, r, r, 0.95);\n}\n]]\n\ntime_to_switch = 400\n\nfunction setup()\n    freq = 1.0\n    freq_time = 0\n    device = nrf_device_new(freq, \"../rfdata/rf-200.500-big.raw\")\n    interpolator = nrf_interpolator_new(0.01)\n\n    camera = ngl_camera_new_look_at(0, 0, 0) -- Camera is unnecessary but ngl_draw_model requires it\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(2, 2, 1, 1)\nend\n\nfunction draw()\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    nrf_interpolator_process(interpolator, samples_buffer)\n    interpolator_buffer = nrf_interpolator_get_buffer(interpolator)\n\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_texture_update(texture, interpolator_buffer, 512, 256)\n    ngl_draw_model(camera, model, shader)\n    freq_time = freq_time + 1\n    if freq_time >= time_to_switch then\n        freq = freq + 0.1\n        nrf_device_set_frequency(device, freq)\n        print(\"Frequency: \" .. freq)\n        freq_time = 0\n    end\nend\n\nfunction on_key(key, mods)\n    keys_frequency_handler(key, mods)\nend\n"
  },
  {
    "path": "lua/samples-tex.lua",
    "content": "-- Visualize IQ data as a texture from the HackRF\n-- You want seizures? 'Cause this is how you get seizures.\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nout vec3 color;\nout vec2 texCoord;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    texCoord = vt; // vec2(vp.x + 0.5, vp.z + 0.5);\n    gl_Position = vec4(vp.x*2, vp.z*2, 0, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nin vec2 texCoord;\nuniform sampler2D uTexture;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    float r = texture(uTexture, texCoord).r * 1;\n    fragColor = vec4(r, r, r, 0.95);\n}\n]]\n\n\nfunction setup()\n    freq = 200.5\n    device = nrf_device_new(freq, \"../rfdata/rf-200.500-big.raw\")\n    camera = ngl_camera_new_look_at(0, 0, 0) -- Camera is unnecessary but ngl_draw_model requires it\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(2, 2, 1, 1)\nend\n\nfunction draw()\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    buffer = nrf_device_get_samples_buffer(device)\n    ngl_texture_update(texture, buffer, 512, 256)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_frequency_handler(key, mods)\nend\n"
  },
  {
    "path": "lua/sea-grid.lua",
    "content": "-- Use noise on a grid\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    float force = 0.1;\n    float waves = 3.0;\n    float speed = 1.5;\nvec2 p = -1.0 + 2.0 * vp.xy / vec2(1,1);\n float len = length(p);\n  vec2 uv = vp.xy + (p/len) * cos(len * 2.0 - uTime * 2.0) * force;\n    //vec3 pt = vec3(vp.x * 20, noise1(noise1(vp.x * 8.287) + noise1(vp.y * 7.393) + uTime * 0.5) + force * cos(vp.x * waves - uTime * speed), vp.y * 20);\nvec3 pt = vec3(uv.x, 0, uv.y);\n\n    gl_PointSize = 2;\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(pt, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.95);\n}\n]]\n\nfunction setup()\n    shader = ngl_shader_new(GL_POINTS, VERTEX_SHADER, FRAGMENT_SHADER)\n    model = ngl_model_new_grid_points(500, 500, 0.05, 0.05)\nend\n\nfunction draw()\n    camera = ngl_camera_new_look_at(0, -5, -5)\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    ngl_draw_model(camera, model, shader)\nend\n"
  },
  {
    "path": "lua/signal-detector.lua",
    "content": "-- Detect signals on the ISM band (433 MHz) and show the \"signature\"\n\nif NWM_OPENGL_TYPE == NWM_OPENGL then\n\n    VERTEX_SHADER = [[\n    #version 400\n    layout (location = 0) in vec3 vp;\n    layout (location = 1) in vec3 vn;\n    layout (location = 2) in vec2 vt;\n    out vec3 color;\n    out vec2 texCoord;\n    uniform mat4 uViewMatrix, uProjectionMatrix;\n    uniform float uTime;\n    void main() {\n        color = vec3(1.0, 1.0, 1.0);\n        texCoord = vt;\n        gl_Position = vec4(vp.x*2, vp.z*2, 0, 1.0);\n    }\n    ]]\n\n    FRAGMENT_SHADER = [[\n    #version 400\n    in vec3 color;\n    in vec2 texCoord;\n    uniform sampler2D uTexture;\n    uniform float uAlpha;\n    layout (location = 0) out vec4 fragColor;\n    void main() {\n        float r = texture(uTexture, texCoord).r * 80;\n        fragColor = vec4(r, r, r, uAlpha);\n    }\n    ]]\n\nelse\n\n    VERTEX_SHADER = [[\n    attribute vec3 vp;\n    attribute vec3 vn;\n    attribute vec2 vt;\n    varying vec3 color;\n    varying vec2 texCoord;\n    uniform mat4 uViewMatrix, uProjectionMatrix;\n    uniform float uTime;\n    void main() {\n        color = vec3(1.0, 1.0, 1.0);\n        texCoord = vt;\n        gl_Position = vec4(vp.x*2, vp.z*2, 0, 1.0);\n    }\n    ]]\n\n    FRAGMENT_SHADER = [[\n    precision mediump float;\n    varying vec3 color;\n    varying vec2 texCoord;\n    uniform sampler2D uTexture;\n    uniform float uAlpha;\n    void main() {\n        float r = texture2D(uTexture, texCoord).a * 100;\n        gl_FragColor = vec4(r, r, r, uAlpha);\n    }\n    ]]\n\nend\n\nSTATE_DETECTING = 1\nSTATE_CAPTURING = 2\nSTATE_DRAWING = 3\n\nfunction setup()\n    freq = 433\n    device = nrf_device_new(freq, \"../rfdata/rf-200.500-big.raw\")\n    filter = nrf_iq_filter_new(device.sample_rate, 200e3, 97)\n\n    detector = nrf_signal_detector_new()\n    signal_threshold = 100\n    state = STATE_DETECTING\n    draw_buffer = nil\n    have_signal = false\n    buffer_index = 1\n    alpha = 1\n\n    camera = ngl_camera_new_look_at(0, 0, 0) -- Camera is unnecessary but ngl_draw_model requires it\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new(shader, \"uTexture\")\n    model = ngl_model_new_grid_triangles(2, 2, 1, 1)\n    percentage_drawn = 0\nend\n\nfunction draw()\n    ngl_clear(0.0, 0.0, 0.0, 1.0)\n\n    if state == STATE_DETECTING then\n        samples_buffer = nrf_device_get_samples_buffer(device)\n        nrf_signal_detector_process(detector, samples_buffer)\n        sd = nrf_signal_detector_get_standard_deviation(detector)\n        if sd > signal_threshold then\n            state = STATE_CAPTURING\n            nrf_iq_filter_process(filter, samples_buffer)\n            draw_buffer = nrf_iq_filter_get_buffer(filter)\n        end\n    elseif state == STATE_CAPTURING then\n        samples_buffer = nrf_device_get_samples_buffer(device)\n        nrf_signal_detector_process(detector, samples_buffer)\n        sd = nrf_signal_detector_get_standard_deviation(detector)\n        if sd > signal_threshold then\n            nrf_iq_filter_process(filter, samples_buffer)\n            filter_buffer = nrf_iq_filter_get_buffer(filter)\n            nut_buffer_append(draw_buffer, filter_buffer)\n        else\n            state = STATE_DRAWING\n            percentage_drawn = 0\n            alpha = 1\n        end\n    elseif state == STATE_DRAWING then\n        iq_buffer = nrf_buffer_to_iq_lines(draw_buffer, 4, percentage_drawn)\n\n        ngl_texture_update(texture, iq_buffer, 1024, 1024)\n        ngl_shader_uniform_set_float(shader, \"uAlpha\", alpha)\n        ngl_draw_model(camera, model, shader)\n\n        percentage_drawn = percentage_drawn + 0.005\n\n        if percentage_drawn >= 0.9 then\n            alpha = alpha - 0.01\n        end\n\n        if percentage_drawn >= 1 then\n            state = STATE_DETECTING\n            draw_buffer = nil\n            percentage_drawn = 0\n        end\n    end\nend\n"
  },
  {
    "path": "lua/skybox.lua",
    "content": "-- Load a static scene\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0) * dot(normalize(vp), normalize(vn)) * 0.5;\n    color += vec3(0.2, 0.5, 0.8);\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(vp, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.95);\n}\n]]\n\ncamera_x = -20\ncamera_y = 18\ncamera_z = 50\n\nfunction setup()\n    model = ngl_model_load_obj(\"../obj/c004.obj\")\n    skybox = ngl_skybox_new(\"../img/negz.jpg\", \"../img/posz.jpg\", \"../img/posy.jpg\", \"../img/negy.jpg\", \"../img/negx.jpg\", \"../img/posx.jpg\")\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    camera = ngl_camera_new_look_at(camera_x, camera_y, camera_z)\nend\n\nfunction draw()\n    ngl_clear(0.2, 0.2, 0.2, 1)\n    camera = ngl_camera_new_look_at(camera_x, camera_y, camera_z)\n    ngl_skybox_draw(skybox, camera)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_camera_handler(key, mods)\nend\n"
  },
  {
    "path": "lua/slinky-points.lua",
    "content": "-- Visualize IQ data from the HackRF as a spiral (like a slinky toy)\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    vec3 pt = vec3((vp.x - 0.5) * 10, (vp.y - 0.5) * 10, (vp.z - 0.5) * 50.0);\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(pt, 1.0);\n    gl_PointSize = 2;\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 1.0);\n}\n]]\n\n\nfunction setup()\n    camera_x = 0.1\n    camera_y = 0.1\n    camera_z = 0.5\n    freq = 2.6\n    device = nrf_device_new(freq, \"../rfdata/rf-100.900-2.raw\")\n    shader = ngl_shader_new(GL_POINTS, VERTEX_SHADER, FRAGMENT_SHADER)\nend\n\nfunction draw()\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    position_buffer = nrf_buffer_add_position_channel(samples_buffer)\n\n    time = nwm_get_time()\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    camera = ngl_camera_new_look_at(camera_x, camera_y, camera_z)\n    model = ngl_model_new_with_buffer(position_buffer)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_camera_handler(key, mods)\n    keys_frequency_handler(key, mods)\nend\n\n"
  },
  {
    "path": "lua/slinky-slow.lua",
    "content": "-- Visualize IQ data from the HackRF as a spiral (like a slinky toy)\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    vec3 pt = vec3((vp.x - 0.5) * 5, (vp.y - 0.5) * 5, (vp.z - 0.5) * 100);\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(pt, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.1);\n}\n]]\n\ncamera_x = 0\ncamera_y = 0\ncamera_z = 10\nfunction setup()\n    freq = 200\n    device = nrf_device_new(freq, \"../rfdata/rf-100.900-2.raw\", 0.01)\n    shader = ngl_shader_new(GL_LINE_STRIP, VERTEX_SHADER, FRAGMENT_SHADER)\nend\n\nfunction draw()\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    position_buffer = nrf_buffer_add_position_channel(samples_buffer)\n\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    camera = ngl_camera_new_look_at(camera_x, camera_y, camera_z)\n    model = ngl_model_new_with_buffer(position_buffer)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_camera_handler(key, mods)\n    keys_frequency_handler(key, mods)\nend\n"
  },
  {
    "path": "lua/slinky-two-point-five.lua",
    "content": "-- Visualize IQ data from the HackRF as a spiral (like a slinky toy)\n-- This visualisation looks at the 2.5 (test?) tone\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    vec3 pt = vec3(vp.x, vp.y, (vp.z - 0.5) * 1000.0);\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(pt, 1.0);\n}\n\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.95);\n}\n]]\n\nfunction setup()\n    device = nrf_device_new(2.5, \"../rfdata/rf-2.500-1.raw\")\n    shader = ngl_shader_new(GL_LINE_STRIP, VERTEX_SHADER, FRAGMENT_SHADER)\nend\n\nfunction draw()\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    position_buffer = nrf_buffer_add_position_channel(samples_buffer)\n\n    time = nwm_get_time()\n    camera_x = 0.5\n    camera_y = 0.0\n    camera_z = -1\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    camera = ngl_camera_new_look_at(camera_x, camera_y, camera_z)\n    buffer = nrf_device_get_samples_buffer(device)\n    model = ngl_model_new_with_buffer(position_buffer)\n    ngl_draw_model(camera, model, shader)\nend\n"
  },
  {
    "path": "lua/slinky-vr.lua",
    "content": "-- Visualize IQ data from the HackRF as a spiral (like a slinky toy)\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0);\n    vec3 pt = vec3((vp.x - 0.5) * 10, (vp.y - 0.5) * 10, (vp.z - 0.5) * 20);\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(pt, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.95);\n}\n]]\n\nfunction setup()\n    freq = 0.8\n    device = nrf_device_new(freq, \"../rfdata/rf-100.900-2.raw\")\n    shader = ngl_shader_new(GL_POINTS, VERTEX_SHADER, FRAGMENT_SHADER)\n    camera = ngl_camera_new_look_at(4, 0.5, 10)\nend\n\nfunction draw()\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    position_buffer = nrf_buffer_add_position_channel(samples_buffer)\n\n    time = nwm_get_time()\n    ngl_clear(0.2, 0.2, 0.2, 1.0)\n    model = ngl_model_new_with_buffer(position_buffer)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_frequency_handler(key, mods)\nend\n"
  },
  {
    "path": "lua/slinky.lua",
    "content": "-- Visualize IQ data from the HackRF as a spiral (like a slinky toy)\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(0.95, 0.95, 0.95);\n    vec3 pt = vec3((vp.x - 0.5) * 5, (vp.y - 0.5) * 5, (vp.z - 0.5) * 50);\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(pt, 1.0);\n    gl_PointSize = 3;\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.1);\n}\n]]\n\ncamera_x = 0\ncamera_y = 0\ncamera_z = 5\nfunction setup()\n    freq = 203.5\n    device = nrf_device_new(freq, \"../rfdata/rf-100.900-2.raw\")\n    shader = ngl_shader_new(GL_LINE_STRIP, VERTEX_SHADER, FRAGMENT_SHADER)\nend\n\nfunction draw()\n    samples_buffer = nrf_device_get_samples_buffer(device)\n    position_buffer = nrf_buffer_add_position_channel(samples_buffer)\n\n    ngl_clear(0.05, 0.05, 0.05, 1.0)\n    camera = ngl_camera_new_look_at(camera_x, camera_y, camera_z)\n    model = ngl_model_new_with_buffer(position_buffer)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_camera_handler(key, mods)\n    keys_frequency_handler(key, mods)\nend\n"
  },
  {
    "path": "lua/static-gradient.lua",
    "content": "-- Load a static scene\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0) * dot(normalize(vp), normalize(vn)) * 3;\n    //color += vec3(0.2, 0.5, 0.8);\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(vp, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nuniform sampler2D uRamp;\nvoid main() {\n    float r = texture(uRamp, vec2(color.r, 0)).r;\n    float g = texture(uRamp, vec2(color.g, 0)).g;\n    float b = texture(uRamp, vec2(color.b, 0)).b;\n    fragColor = vec4(r, g, b, 1);\n}\n]]\n\ncamera_x = -20\ncamera_y = 18\ncamera_z = 50\n\nfunction setup()\n    model = ngl_model_load_obj(\"../obj/c004.obj\")\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new_from_file(\"../img/grad-bry.jpg\", shader, \"uRamp\")\n    camera = ngl_camera_new_look_at(camera_x, camera_y, camera_z)\nend\n\nfunction draw()\n    ngl_clear(0.2, 0.2, 0.2, 1)\n    camera = ngl_camera_new_look_at(camera_x, camera_y, camera_z)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_camera_handler(key, mods)\nend\n"
  },
  {
    "path": "lua/static.lua",
    "content": "-- Load a static scene\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nout vec3 color;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nvoid main() {\n    color = vec3(1.0, 1.0, 1.0) * dot(normalize(vp), normalize(vn)) * 0.5;\n    color += vec3(0.2, 0.5, 0.8);\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(vp, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nlayout (location = 0) out vec4 fragColor;\nvoid main() {\n    fragColor = vec4(color, 0.95);\n}\n]]\n\ncamera_x = -20\ncamera_y = 18\ncamera_z = 50\n\nfunction setup()\n    model = ngl_model_load_obj(\"../obj/c004.obj\")\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    camera = ngl_camera_new_look_at(camera_x, camera_y, camera_z)\nend\n\nfunction draw()\n    ngl_clear(0.2, 0.2, 0.2, 1)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    if (mods == 1) then -- Shift key\n        d = 1\n    else\n        d = 0.1\n    end\n\n    if key == KEY_A or key == KEY_LEFT then\n        ngl_model_translate(model, d, 0.0, 0.0)\n    elseif key == KEY_D or key == KEY_RIGHT then\n        ngl_model_translate(model, -d, 0.0, 0.0)\n    elseif key == KEY_Q then\n        ngl_model_translate(model, 0.0, d, 0.0)\n    elseif key == KEY_E then\n        ngl_model_translate(model, 0.0, -d, 0.0)\n    elseif key == KEY_W or key == KEY_DOWN then\n        ngl_model_translate(model, 0.0, 0.0, d)\n    elseif key == KEY_S or key == KEY_DOWN then\n        ngl_model_translate(model, 0.0, 0.0, -d)\n    end\nend\n"
  },
  {
    "path": "lua/texture-image.lua",
    "content": "-- Load a static scene\n\nVERTEX_SHADER = [[\n#version 400\nlayout (location = 0) in vec3 vp;\nlayout (location = 1) in vec3 vn;\nlayout (location = 2) in vec2 vt;\nuniform mat4 uViewMatrix, uProjectionMatrix;\nuniform float uTime;\nout vec2 texCoord;\nvoid main() {\n    texCoord = vt;\n    gl_Position = uProjectionMatrix * uViewMatrix * vec4(vp, 1.0);\n}\n]]\n\nFRAGMENT_SHADER = [[\n#version 400\nin vec3 color;\nin vec2 texCoord;\nlayout (location = 0) out vec4 fragColor;\nuniform sampler2D uTexture;\nvoid main() {\n    fragColor = texture(uTexture, texCoord);\n}\n]]\n\ncamera_x = 0\ncamera_y = 1\ncamera_z = 0.3\n\nfunction setup()\n    model = ngl_model_new_grid_triangles(2, 2, 1, 1)\n    shader = ngl_shader_new(GL_TRIANGLES, VERTEX_SHADER, FRAGMENT_SHADER)\n    texture = ngl_texture_new_from_file(\"../img/negx.jpg\", shader, \"uTexture\")\n    camera = ngl_camera_new_look_at(camera_x, camera_y, camera_z)\nend\n\nfunction draw()\n    ngl_clear(0.2, 0.2, 0.2, 1)\n    camera = ngl_camera_new_look_at(camera_x, camera_y, camera_z)\n    ngl_draw_model(camera, model, shader)\nend\n\nfunction on_key(key, mods)\n    keys_camera_handler(key, mods)\nend\n"
  },
  {
    "path": "obj/c004.obj",
    "content": "# Blender v2.72 (sub 0) OBJ File: 'c004.blend'\n# www.blender.org\no Cube.012\nv 21.277115 8.982596 20.857449\nv 20.545414 8.982596 20.857981\nv 20.550171 8.982596 27.414165\nv 21.281872 8.982596 27.413633\nv 21.277115 13.204562 20.857449\nv 20.545414 13.204562 20.857981\nv 20.550171 13.204562 27.414165\nv 21.281872 13.204562 27.413633\nv 20.442596 9.632384 23.185902\nv 20.831560 9.632384 23.185619\nv 20.832939 9.632384 25.086113\nv 20.443974 9.632384 25.086393\nv 20.442596 10.021349 23.185902\nv 20.831560 10.021349 23.185619\nv 20.832939 10.021349 25.086113\nv 20.443974 10.021349 25.086393\nv 19.543789 7.920372 23.186554\nv 19.932755 7.920372 23.186272\nv 19.934134 7.920372 25.086763\nv 19.545168 7.920372 25.087046\nv 19.543789 7.663570 23.186554\nv 19.932755 7.663570 23.186272\nv 19.934134 7.663570 25.086763\nv 19.545168 7.663570 25.087046\nv 21.516022 7.920372 22.710962\nv 21.518089 7.920372 25.559776\nv 21.516022 7.663570 22.710962\nv 21.518089 7.663570 25.559776\nv 21.277334 9.177227 21.159687\nv 21.281652 9.177227 27.111397\nv 21.277334 13.009932 21.159687\nv 21.281652 13.009932 27.111397\nv 21.277334 9.177227 21.159687\nv 21.281652 9.177227 27.111397\nv 21.277334 13.009932 21.159687\nv 21.281652 13.009932 27.111397\nv 21.191442 9.177227 21.159748\nv 21.195761 9.177227 27.111460\nv 21.191442 13.009932 21.159748\nv 21.195761 13.009932 27.111460\nvn 0.000700 0.000000 1.000000\nvn 1.000000 0.000000 -0.000700\nvn -0.000700 0.000000 -1.000000\nvn -1.000000 0.000000 0.000700\nvn 0.000000 1.000000 -0.000000\nvn 0.000000 -1.000000 0.000000\nvn 0.885400 -0.464800 -0.000600\nvn -0.885400 0.464800 0.000600\nvn 0.287500 0.000000 0.957800\nvn 0.286100 0.000000 -0.958200\nvn 0.000000 0.000000 1.000000\nvn 0.000800 0.000000 1.000000\ns off\nf 6//1 2//1 1//1\nf 7//2 3//2 2//2\nf 8//3 4//3 3//3\nf 1//4 4//4 30//4\nf 1//5 2//5 3//5\nf 7//6 6//6 5//6\nf 9//1 10//1 14//1\nf 10//4 11//4 15//4\nf 11//3 12//3 16//3\nf 12//2 9//2 13//2\nf 9//7 12//7 20//7\nf 13//6 14//6 15//6\nf 20//2 24//2 21//2\nf 11//3 19//3 20//3\nf 11//8 10//8 18//8\nf 10//1 9//1 17//1\nf 24//5 23//5 22//5\nf 19//3 23//3 24//3\nf 22//9 27//9 25//9\nf 17//1 21//1 22//1\nf 25//4 27//4 28//4\nf 19//10 26//10 28//10\nf 22//5 23//5 28//5\nf 18//6 25//6 26//6\nf 30//11 34//11 33//11\nf 5//4 31//4 32//4\nf 8//4 32//4 30//4\nf 1//4 29//4 31//4\nf 33//6 34//6 38//6\nf 31//11 35//11 36//11\nf 32//11 36//11 34//11\nf 29//11 33//11 35//11\nf 39//4 37//4 38//4\nf 35//5 39//5 40//5\nf 36//12 40//12 38//12\nf 33//3 37//3 39//3\nf 5//1 6//1 1//1\nf 6//2 7//2 2//2\nf 7//3 8//3 3//3\nf 29//4 1//4 30//4\nf 4//5 1//5 3//5\nf 8//6 7//6 5//6\nf 13//1 9//1 14//1\nf 14//4 10//4 15//4\nf 15//3 11//3 16//3\nf 16//2 12//2 13//2\nf 17//7 9//7 20//7\nf 16//6 13//6 15//6\nf 17//2 20//2 21//2\nf 12//3 11//3 20//3\nf 19//8 11//8 18//8\nf 18//1 10//1 17//1\nf 21//5 24//5 22//5\nf 20//3 19//3 24//3\nf 18//9 22//9 25//9\nf 18//1 17//1 22//1\nf 26//4 25//4 28//4\nf 23//10 19//10 28//10\nf 27//5 22//5 28//5\nf 19//6 18//6 26//6\nf 29//11 30//11 33//11\nf 8//4 5//4 32//4\nf 4//4 8//4 30//4\nf 5//4 1//4 31//4\nf 37//6 33//6 38//6\nf 32//11 31//11 36//11\nf 30//11 32//11 34//11\nf 31//11 29//11 35//11\nf 40//4 39//4 38//4\nf 36//5 35//5 40//5\nf 34//1 36//1 38//1\nf 35//3 33//3 39//3\no Cube.011\nv 21.277115 8.982596 29.611691\nv 20.545414 8.982596 29.612223\nv 20.550171 8.982596 36.168407\nv 21.281872 8.982596 36.167877\nv 21.277115 13.204562 29.611691\nv 20.545414 13.204562 29.612223\nv 20.550171 13.204562 36.168407\nv 21.281872 13.204562 36.167877\nv 20.442596 9.632384 31.940144\nv 20.831560 9.632384 31.939861\nv 20.832939 9.632384 33.840355\nv 20.443974 9.632384 33.840637\nv 20.442596 10.021349 31.940144\nv 20.831560 10.021349 31.939861\nv 20.832939 10.021349 33.840355\nv 20.443974 10.021349 33.840637\nv 19.543789 7.920372 31.940796\nv 19.932755 7.920372 31.940514\nv 19.934134 7.920372 33.841007\nv 19.545168 7.920372 33.841290\nv 19.543789 7.663570 31.940796\nv 19.932755 7.663570 31.940514\nv 19.934134 7.663570 33.841007\nv 19.545168 7.663570 33.841290\nv 21.516022 7.920372 31.465204\nv 21.518089 7.920372 34.314018\nv 21.516022 7.663570 31.465204\nv 21.518089 7.663570 34.314018\nv 21.277334 9.177227 29.913929\nv 21.281652 9.177227 35.865639\nv 21.277334 13.009932 29.913929\nv 21.281652 13.009932 35.865639\nv 21.277334 9.177227 29.913929\nv 21.281652 9.177227 35.865639\nv 21.277334 13.009932 29.913929\nv 21.281652 13.009932 35.865639\nv 21.191442 9.177227 29.913990\nv 21.195761 9.177227 35.865700\nv 21.191442 13.009932 29.913990\nv 21.195761 13.009932 35.865700\nvn 0.000700 0.000000 1.000000\nvn 1.000000 0.000000 -0.000700\nvn -0.000700 0.000000 -1.000000\nvn -1.000000 0.000000 0.000700\nvn 0.000000 1.000000 0.000000\nvn 0.000000 -1.000000 0.000000\nvn 0.885400 -0.464800 -0.000600\nvn -0.885400 0.464800 0.000600\nvn 0.287500 0.000000 0.957800\nvn 0.286100 0.000000 -0.958200\nvn 0.000000 0.000000 1.000000\nvn 0.000600 0.000000 1.000000\ns off\nf 46//13 42//13 41//13\nf 47//14 43//14 42//14\nf 48//15 44//15 43//15\nf 44//16 70//16 69//16\nf 42//17 43//17 44//17\nf 47//18 46//18 45//18\nf 49//13 50//13 54//13\nf 50//16 51//16 55//16\nf 51//15 52//15 56//15\nf 52//14 49//14 53//14\nf 49//19 52//19 60//19\nf 56//18 53//18 54//18\nf 60//14 64//14 61//14\nf 51//15 59//15 60//15\nf 50//20 58//20 59//20\nf 50//13 49//13 57//13\nf 64//17 63//17 62//17\nf 59//15 63//15 64//15\nf 62//21 67//21 65//21\nf 57//13 61//13 62//13\nf 65//16 67//16 68//16\nf 59//22 66//22 68//22\nf 63//17 68//17 67//17\nf 58//18 65//18 66//18\nf 70//23 74//23 73//23\nf 45//16 71//16 72//16\nf 48//16 72//16 70//16\nf 41//16 69//16 71//16\nf 74//18 78//18 77//18\nf 71//23 75//23 76//23\nf 72//23 76//23 74//23\nf 69//23 73//23 75//23\nf 79//16 77//16 78//16\nf 76//17 75//17 79//17\nf 76//13 80//13 78//13\nf 73//15 77//15 79//15\nf 45//13 46//13 41//13\nf 46//14 47//14 42//14\nf 47//15 48//15 43//15\nf 41//16 44//16 69//16\nf 41//17 42//17 44//17\nf 48//18 47//18 45//18\nf 53//13 49//13 54//13\nf 54//16 50//16 55//16\nf 55//15 51//15 56//15\nf 56//14 52//14 53//14\nf 57//19 49//19 60//19\nf 55//18 56//18 54//18\nf 57//14 60//14 61//14\nf 52//15 51//15 60//15\nf 51//20 50//20 59//20\nf 58//13 50//13 57//13\nf 61//17 64//17 62//17\nf 60//15 59//15 64//15\nf 58//21 62//21 65//21\nf 58//13 57//13 62//13\nf 66//16 65//16 68//16\nf 63//22 59//22 68//22\nf 62//17 63//17 67//17\nf 59//18 58//18 66//18\nf 69//23 70//23 73//23\nf 48//16 45//16 72//16\nf 44//16 48//16 70//16\nf 45//16 41//16 71//16\nf 73//18 74//18 77//18\nf 72//23 71//23 76//23\nf 70//23 72//23 74//23\nf 71//23 69//23 75//23\nf 80//16 79//16 78//16\nf 80//17 76//17 79//17\nf 74//24 76//24 78//24\nf 75//15 73//15 79//15\no Cube.009_Cube.000\nv -11.786067 8.982596 32.615345\nv -11.786067 8.982596 31.883646\nv -18.342253 8.982596 31.883646\nv -18.342253 8.982596 32.615349\nv -11.786067 13.204562 32.615345\nv -11.786067 13.204562 31.883646\nv -18.342253 13.204562 31.883646\nv -18.342253 13.204562 32.615349\nv -14.113914 9.632384 31.779139\nv -14.113914 9.632384 32.168102\nv -16.014406 9.632384 32.168102\nv -16.014406 9.632384 31.779139\nv -14.113914 10.021349 31.779139\nv -14.113914 10.021349 32.168102\nv -16.014406 10.021349 32.168102\nv -16.014406 10.021349 31.779139\nv -14.113914 7.920372 30.880331\nv -14.113914 7.920372 31.269297\nv -16.014406 7.920372 31.269297\nv -16.014406 7.920372 30.880333\nv -14.113914 7.663570 30.880331\nv -14.113914 7.663570 31.269297\nv -16.014406 7.663570 31.269297\nv -16.014406 7.663570 30.880333\nv -13.639753 7.920372 32.852909\nv -16.488567 7.920372 32.852909\nv -13.639753 7.663570 32.852909\nv -16.488567 7.663570 32.852909\nv -12.088305 9.177227 32.615345\nv -18.040016 9.177227 32.615349\nv -12.088305 13.009932 32.615345\nv -18.040016 13.009932 32.615349\nv -12.088305 9.177227 32.615345\nv -18.040016 9.177227 32.615349\nv -12.088305 13.009932 32.615345\nv -18.040016 13.009932 32.615349\nv -12.088305 9.177227 32.529453\nv -18.040016 9.177227 32.529457\nv -12.088305 13.009932 32.529453\nv -18.040016 13.009932 32.529457\nvn -1.000000 0.000000 0.000000\nvn 0.000000 0.000000 1.000000\nvn 1.000000 0.000000 0.000000\nvn 0.000000 0.000000 -1.000000\nvn 0.000000 1.000000 0.000000\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 -0.464800 0.885400\nvn 0.000000 0.464800 -0.885400\nvn -0.958000 0.000000 0.286800\nvn 0.958000 0.000000 0.286800\ns off\nf 86//25 82//25 81//25\nf 87//26 83//26 82//26\nf 88//27 84//27 83//27\nf 81//28 84//28 110//28\nf 82//29 83//29 84//29\nf 87//30 86//30 85//30\nf 89//25 90//25 94//25\nf 90//28 91//28 95//28\nf 91//27 92//27 96//27\nf 92//26 89//26 93//26\nf 92//31 100//31 97//31\nf 93//30 94//30 95//30\nf 100//26 104//26 101//26\nf 91//27 99//27 100//27\nf 90//32 98//32 99//32\nf 90//25 89//25 97//25\nf 101//29 104//29 103//29\nf 99//27 103//27 104//27\nf 102//33 107//33 105//33\nf 97//25 101//25 102//25\nf 105//28 107//28 108//28\nf 99//34 106//34 108//34\nf 103//29 108//29 107//29\nf 98//30 105//30 106//30\nf 110//26 114//26 113//26\nf 85//28 111//28 112//28\nf 88//28 112//28 110//28\nf 81//28 109//28 111//28\nf 114//30 118//30 117//30\nf 111//26 115//26 116//26\nf 112//26 116//26 114//26\nf 109//26 113//26 115//26\nf 119//28 117//28 118//28\nf 115//29 119//29 120//29\nf 116//25 120//25 118//25\nf 113//27 117//27 119//27\nf 85//25 86//25 81//25\nf 86//26 87//26 82//26\nf 87//27 88//27 83//27\nf 109//28 81//28 110//28\nf 81//29 82//29 84//29\nf 88//30 87//30 85//30\nf 93//25 89//25 94//25\nf 94//28 90//28 95//28\nf 95//27 91//27 96//27\nf 96//26 92//26 93//26\nf 89//31 92//31 97//31\nf 96//30 93//30 95//30\nf 97//26 100//26 101//26\nf 92//27 91//27 100//27\nf 91//32 90//32 99//32\nf 98//25 90//25 97//25\nf 102//29 101//29 103//29\nf 100//27 99//27 104//27\nf 98//33 102//33 105//33\nf 98//25 97//25 102//25\nf 106//28 105//28 108//28\nf 103//34 99//34 108//34\nf 102//29 103//29 107//29\nf 99//30 98//30 106//30\nf 109//26 110//26 113//26\nf 88//28 85//28 112//28\nf 84//28 88//28 110//28\nf 85//28 81//28 111//28\nf 113//30 114//30 117//30\nf 112//26 111//26 116//26\nf 110//26 112//26 114//26\nf 111//26 109//26 115//26\nf 120//28 119//28 118//28\nf 116//29 115//29 120//29\nf 114//25 116//25 118//25\nf 115//27 113//27 119//27\no Cube.010_Cube.018\nv 9.138707 8.982596 32.828861\nv 9.138707 8.982596 32.097160\nv 2.582521 8.982596 32.097164\nv 2.582521 8.982596 32.828865\nv 9.138707 13.204562 32.828861\nv 9.138707 13.204562 32.097160\nv 2.582521 13.204562 32.097164\nv 2.582521 13.204562 32.828865\nv 6.810860 9.632384 31.992655\nv 6.810860 9.632384 32.381618\nv 4.910367 9.632384 32.381618\nv 4.910367 9.632384 31.992655\nv 6.810860 10.021349 31.992655\nv 6.810860 10.021349 32.381618\nv 4.910367 10.021349 32.381618\nv 4.910367 10.021349 31.992655\nv 6.810860 7.920372 31.093847\nv 6.810860 7.920372 31.482813\nv 4.910367 7.920372 31.482813\nv 4.910367 7.920372 31.093849\nv 6.810860 7.663570 31.093847\nv 6.810860 7.663570 31.482813\nv 4.910367 7.663570 31.482813\nv 4.910367 7.663570 31.093849\nv 7.285021 7.920372 33.066425\nv 4.436207 7.920372 33.066425\nv 7.285021 7.663570 33.066425\nv 4.436207 7.663570 33.066425\nv 8.836470 9.177227 32.828861\nv 2.884758 9.177227 32.828865\nv 8.836470 13.009932 32.828861\nv 2.884758 13.009932 32.828865\nv 8.836470 9.177227 32.828861\nv 2.884758 9.177227 32.828865\nv 8.836470 13.009932 32.828861\nv 2.884758 13.009932 32.828865\nv 8.836470 9.177227 32.742970\nv 2.884758 9.177227 32.742973\nv 8.836470 13.009932 32.742970\nv 2.884758 13.009932 32.742973\nvn -1.000000 0.000000 0.000000\nvn 0.000000 0.000000 1.000000\nvn 1.000000 0.000000 0.000000\nvn 0.000000 0.000000 -1.000000\nvn 0.000000 1.000000 0.000000\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 -0.464800 0.885400\nvn 0.000000 0.464800 -0.885400\nvn -0.958000 0.000000 0.286800\nvn 0.958000 0.000000 0.286800\ns off\nf 126//35 122//35 121//35\nf 127//36 123//36 122//36\nf 128//37 124//37 123//37\nf 124//38 150//38 149//38\nf 122//39 123//39 124//39\nf 127//40 126//40 125//40\nf 129//35 130//35 134//35\nf 130//38 131//38 135//38\nf 131//37 132//37 136//37\nf 132//36 129//36 133//36\nf 132//41 140//41 137//41\nf 136//40 133//40 134//40\nf 140//36 144//36 141//36\nf 131//37 139//37 140//37\nf 130//42 138//42 139//42\nf 130//35 129//35 137//35\nf 144//39 143//39 142//39\nf 139//37 143//37 144//37\nf 142//43 147//43 145//43\nf 137//35 141//35 142//35\nf 145//38 147//38 148//38\nf 139//44 146//44 148//44\nf 143//39 148//39 147//39\nf 138//40 145//40 146//40\nf 150//36 154//36 153//36\nf 125//38 151//38 152//38\nf 128//38 152//38 150//38\nf 121//38 149//38 151//38\nf 154//40 158//40 157//40\nf 151//36 155//36 156//36\nf 152//36 156//36 154//36\nf 149//36 153//36 155//36\nf 159//38 157//38 158//38\nf 155//39 159//39 160//39\nf 156//35 160//35 158//35\nf 153//37 157//37 159//37\nf 125//35 126//35 121//35\nf 126//36 127//36 122//36\nf 127//37 128//37 123//37\nf 121//38 124//38 149//38\nf 121//39 122//39 124//39\nf 128//40 127//40 125//40\nf 133//35 129//35 134//35\nf 134//38 130//38 135//38\nf 135//37 131//37 136//37\nf 136//36 132//36 133//36\nf 129//41 132//41 137//41\nf 135//40 136//40 134//40\nf 137//36 140//36 141//36\nf 132//37 131//37 140//37\nf 131//42 130//42 139//42\nf 138//35 130//35 137//35\nf 141//39 144//39 142//39\nf 140//37 139//37 144//37\nf 138//43 142//43 145//43\nf 138//35 137//35 142//35\nf 146//38 145//38 148//38\nf 143//44 139//44 148//44\nf 142//39 143//39 147//39\nf 139//40 138//40 146//40\nf 149//36 150//36 153//36\nf 128//38 125//38 152//38\nf 124//38 128//38 150//38\nf 125//38 121//38 151//38\nf 153//40 154//40 157//40\nf 152//36 151//36 156//36\nf 150//36 152//36 154//36\nf 151//36 149//36 155//36\nf 160//38 159//38 158//38\nf 156//39 155//39 160//39\nf 154//35 156//35 158//35\nf 155//37 153//37 159//37\no Cube.008_Cube.009\nv 30.017714 3.975633 32.074238\nv 24.837765 3.975633 32.133255\nv 24.783924 3.975633 27.407705\nv 29.963873 3.975633 27.348688\nv 30.017714 4.281491 32.074238\nv 24.837765 4.281491 32.133255\nv 24.783924 4.281491 27.407705\nv 29.963873 4.281491 27.348688\nv 25.082710 0.001058 32.123379\nv 24.842375 0.001058 32.126118\nv 24.839638 0.001058 31.885782\nv 25.079973 0.001058 31.883043\nv 25.082710 4.126889 32.123379\nv 24.842375 4.126889 32.126118\nv 24.839638 4.126889 31.885782\nv 25.079973 4.126889 31.883043\nv 25.030399 0.001058 27.649452\nv 24.790064 0.001058 27.652189\nv 24.787325 0.001058 27.411854\nv 25.027660 0.001058 27.409117\nv 25.030399 4.126889 27.649452\nv 24.790064 4.126889 27.652189\nv 24.787325 4.126889 27.411854\nv 25.027660 4.126889 27.409117\nv 29.750021 4.091805 32.052803\nv 29.965702 4.066954 32.050346\nv 29.911930 4.066954 27.330757\nv 29.696247 4.091805 27.333216\nv 30.350504 8.110107 32.045963\nv 30.566185 8.085256 32.043507\nv 30.512413 8.085256 27.323917\nv 30.296732 8.110107 27.326374\nv 30.717491 0.001054 32.059181\nv 30.480257 0.000886 32.061882\nv 30.477518 0.000886 31.821547\nv 30.714754 0.001054 31.818844\nv 29.942448 4.104732 32.068008\nv 29.706329 4.059904 32.070702\nv 29.939711 4.104732 31.827675\nv 30.667160 0.001054 27.641558\nv 30.429924 0.000886 27.644260\nv 30.427187 0.000886 27.403927\nv 30.664421 0.001054 27.401222\nv 29.892117 4.104732 27.650389\nv 29.655998 4.059904 27.653080\nv 29.889378 4.104732 27.410053\nvn 0.011400 0.000000 0.999900\nvn -0.999900 0.000000 0.011400\nvn -0.011400 0.000000 -0.999900\nvn 0.999900 0.000000 -0.011400\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 1.000000 0.000000\nvn -0.989000 0.147800 0.011300\nvn 0.989000 -0.147800 -0.011300\nvn 0.114400 0.993400 -0.001300\nvn -0.114500 -0.993400 0.001300\nvn 0.982600 0.185600 -0.011200\nvn 0.000700 -1.000000 -0.000000\ns off\nf 166//45 162//45 161//45\nf 167//46 163//46 162//46\nf 167//47 168//47 164//47\nf 165//48 161//48 164//48\nf 162//49 163//49 164//49\nf 167//50 166//50 165//50\nf 174//45 170//45 169//45\nf 175//46 171//46 170//46\nf 176//47 172//47 171//47\nf 173//48 169//48 172//48\nf 170//49 171//49 172//49\nf 176//50 175//50 174//50\nf 182//45 178//45 177//45\nf 183//46 179//46 178//46\nf 184//47 180//47 179//47\nf 181//48 177//48 180//48\nf 177//49 178//49 179//49\nf 183//50 182//50 181//50\nf 190//47 186//47 185//47\nf 191//51 187//51 186//51\nf 191//45 192//45 188//45\nf 192//52 189//52 185//52\nf 185//53 186//53 187//53\nf 192//54 191//54 190//54\nf 198//45 194//45 193//45\nf 199//55 197//55 193//55\nf 193//56 194//56 195//56\nf 205//45 201//45 200//45\nf 206//55 204//55 200//55\nf 201//56 202//56 203//56\nf 165//45 166//45 161//45\nf 166//46 167//46 162//46\nf 163//47 167//47 164//47\nf 168//48 165//48 164//48\nf 161//49 162//49 164//49\nf 168//50 167//50 165//50\nf 173//45 174//45 169//45\nf 174//46 175//46 170//46\nf 175//47 176//47 171//47\nf 176//48 173//48 172//48\nf 169//49 170//49 172//49\nf 173//50 176//50 174//50\nf 181//45 182//45 177//45\nf 182//46 183//46 178//46\nf 183//47 184//47 179//47\nf 184//48 181//48 180//48\nf 180//49 177//49 179//49\nf 184//50 183//50 181//50\nf 189//47 190//47 185//47\nf 190//51 191//51 186//51\nf 187//45 191//45 188//45\nf 188//52 192//52 185//52\nf 188//53 185//53 187//53\nf 189//54 192//54 190//54\nf 197//45 198//45 193//45\nf 196//55 199//55 193//55\nf 196//56 193//56 195//56\nf 204//45 205//45 200//45\nf 203//55 206//55 200//55\nf 200//56 201//56 203//56\no Cube.007_Cube.008\nv 19.101385 3.975633 43.383373\nv 19.264616 3.975633 38.205662\nv 23.988129 3.975633 38.354572\nv 23.824896 3.975633 43.532288\nv 19.101385 4.281490 43.383373\nv 19.264616 4.281490 38.205662\nv 23.988129 4.281490 38.354572\nv 23.824896 4.281490 43.532288\nv 19.263977 0.001058 38.450806\nv 19.271551 0.001058 38.210571\nv 19.511784 0.001058 38.218147\nv 19.504210 0.001058 38.458378\nv 19.263977 4.126888 38.450806\nv 19.271551 4.126888 38.210571\nv 19.511784 4.126888 38.218147\nv 19.504210 4.126888 38.458378\nv 23.736031 0.001058 38.590450\nv 23.743605 0.001058 38.350220\nv 23.983837 0.001058 38.357792\nv 23.976263 0.001058 38.598026\nv 23.736031 4.126888 38.590450\nv 23.743605 4.126888 38.350220\nv 23.983837 4.126888 38.357792\nv 23.976263 4.126888 38.598026\nv 19.134281 4.091805 43.116844\nv 19.127483 4.066953 43.332432\nv 23.845036 4.066953 43.481159\nv 23.851833 4.091805 43.265572\nv 19.115358 8.110107 43.717072\nv 19.108562 8.085256 43.932659\nv 23.826115 8.085256 44.081383\nv 23.832911 8.110107 43.865795\nv 19.086412 0.001054 44.083153\nv 19.093889 0.000886 43.846020\nv 19.334120 0.000886 43.853592\nv 19.326645 0.001054 44.090725\nv 19.110836 4.104732 43.308445\nv 19.118277 4.059903 43.072426\nv 19.351067 4.104732 43.316017\nv 23.502127 0.001054 44.222363\nv 23.509602 0.000886 43.985229\nv 23.749834 0.000886 43.992802\nv 23.742359 0.001054 44.229935\nv 23.526550 4.104732 43.447655\nv 23.533991 4.059903 43.211636\nv 23.766781 4.104732 43.455227\nvn -0.999500 0.000000 -0.031500\nvn 0.031500 0.000000 -0.999500\nvn 0.999500 0.000000 0.031500\nvn -0.031500 0.000000 0.999500\nvn 0.000000 -1.000000 -0.000000\nvn 0.000000 1.000000 -0.000000\nvn 0.031200 0.147800 -0.988500\nvn -0.031200 -0.147800 0.988500\nvn -0.003600 0.993400 0.114400\nvn 0.003600 -0.993400 -0.114400\nvn -0.031000 0.185600 0.982100\nvn -0.000000 -1.000000 0.000700\nvn -0.030900 0.185600 0.982100\ns off\nf 211//57 212//57 208//57\nf 212//58 213//58 209//58\nf 214//59 210//59 209//59\nf 214//60 211//60 207//60\nf 207//61 208//61 209//61\nf 213//62 212//62 211//62\nf 220//57 216//57 215//57\nf 221//58 217//58 216//58\nf 222//59 218//59 217//59\nf 219//60 215//60 218//60\nf 216//61 217//61 218//61\nf 221//62 220//62 219//62\nf 228//57 224//57 223//57\nf 229//58 225//58 224//58\nf 230//59 226//59 225//59\nf 227//60 223//60 226//60\nf 224//61 225//61 226//61\nf 229//62 228//62 227//62\nf 236//59 232//59 231//59\nf 237//63 233//63 232//63\nf 237//57 238//57 234//57\nf 235//64 231//64 234//64\nf 232//65 233//65 234//65\nf 237//66 236//66 235//66\nf 244//57 240//57 239//57\nf 243//67 239//67 242//67\nf 239//68 240//68 241//68\nf 251//57 247//57 246//57\nf 252//67 250//67 246//67\nf 246//68 247//68 248//68\nf 207//57 211//57 208//57\nf 208//58 212//58 209//58\nf 213//59 214//59 209//59\nf 210//60 214//60 207//60\nf 210//61 207//61 209//61\nf 214//62 213//62 211//62\nf 219//57 220//57 215//57\nf 220//58 221//58 216//58\nf 221//59 222//59 217//59\nf 222//60 219//60 218//60\nf 215//61 216//61 218//61\nf 222//62 221//62 219//62\nf 227//57 228//57 223//57\nf 228//58 229//58 224//58\nf 229//59 230//59 225//59\nf 230//60 227//60 226//60\nf 223//61 224//61 226//61\nf 230//62 229//62 227//62\nf 235//59 236//59 231//59\nf 236//63 237//63 232//63\nf 233//57 237//57 234//57\nf 238//64 235//64 234//64\nf 231//65 232//65 234//65\nf 238//66 237//66 235//66\nf 243//57 244//57 239//57\nf 245//69 243//69 242//69\nf 242//68 239//68 241//68\nf 250//57 251//57 246//57\nf 249//67 252//67 246//67\nf 249//68 246//68 248//68\no Cube.006_Cube.007\nv 2.712318 3.975632 43.118710\nv 2.875550 3.975632 37.940998\nv 7.599061 3.975632 38.089909\nv 7.435829 3.975632 43.267624\nv 2.712318 4.281490 43.118710\nv 2.875550 4.281490 37.940998\nv 7.599061 4.281490 38.089909\nv 7.435829 4.281490 43.267624\nv 2.874911 0.001057 38.186142\nv 2.882484 0.001057 37.945908\nv 3.122716 0.001057 37.953484\nv 3.115142 0.001057 38.193714\nv 2.874911 4.126888 38.186142\nv 2.882484 4.126888 37.945908\nv 3.122716 4.126888 37.953484\nv 3.115142 4.126888 38.193714\nv 7.346965 0.001057 38.325787\nv 7.354538 0.001057 38.085556\nv 7.594769 0.001057 38.093128\nv 7.587196 0.001057 38.333363\nv 7.346965 4.126888 38.325787\nv 7.354538 4.126888 38.085556\nv 7.594769 4.126888 38.093128\nv 7.587196 4.126888 38.333363\nv 2.745214 4.091805 42.852180\nv 2.738418 4.066953 43.067768\nv 7.455970 4.066953 43.216496\nv 7.462767 4.091805 43.000908\nv 2.726292 8.110106 43.452408\nv 2.719495 8.085255 43.667995\nv 7.437047 8.085255 43.816719\nv 7.443844 8.110106 43.601131\nv 2.697346 0.001053 43.818489\nv 2.704822 0.000886 43.581356\nv 2.945053 0.000886 43.588928\nv 2.937577 0.001053 43.826061\nv 2.721769 4.104732 43.043781\nv 2.729210 4.059903 42.807762\nv 2.962001 4.104732 43.051353\nv 7.113060 0.001053 43.957699\nv 7.120535 0.000886 43.720566\nv 7.360767 0.000886 43.728138\nv 7.353292 0.001053 43.965271\nv 7.137483 4.104732 43.182991\nv 7.144924 4.059903 42.946972\nv 7.377715 4.104732 43.190563\nvn -0.999500 0.000000 -0.031500\nvn 0.031500 0.000000 -0.999500\nvn 0.999500 0.000000 0.031500\nvn -0.031500 0.000000 0.999500\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 1.000000 -0.000000\nvn 0.031200 0.147800 -0.988500\nvn -0.031200 -0.147800 0.988500\nvn -0.003600 0.993400 0.114400\nvn 0.003600 -0.993400 -0.114400\nvn -0.030900 0.185600 0.982100\nvn -0.000000 -1.000000 0.000700\nvn -0.031000 0.185600 0.982100\ns off\nf 258//70 254//70 253//70\nf 259//71 255//71 254//71\nf 260//72 256//72 255//72\nf 257//73 253//73 256//73\nf 254//74 255//74 256//74\nf 259//75 258//75 257//75\nf 266//70 262//70 261//70\nf 267//71 263//71 262//71\nf 268//72 264//72 263//72\nf 265//73 261//73 264//73\nf 262//74 263//74 264//74\nf 268//75 267//75 266//75\nf 274//70 270//70 269//70\nf 275//71 271//71 270//71\nf 276//72 272//72 271//72\nf 273//73 269//73 272//73\nf 270//74 271//74 272//74\nf 276//75 275//75 274//75\nf 282//72 278//72 277//72\nf 283//76 279//76 278//76\nf 283//70 284//70 280//70\nf 284//77 281//77 277//77\nf 278//78 279//78 280//78\nf 284//79 283//79 282//79\nf 290//70 286//70 285//70\nf 289//80 285//80 288//80\nf 285//81 286//81 287//81\nf 297//70 293//70 292//70\nf 296//82 292//82 295//82\nf 292//81 293//81 294//81\nf 257//70 258//70 253//70\nf 258//71 259//71 254//71\nf 259//72 260//72 255//72\nf 260//73 257//73 256//73\nf 253//74 254//74 256//74\nf 260//75 259//75 257//75\nf 265//70 266//70 261//70\nf 266//71 267//71 262//71\nf 267//72 268//72 263//72\nf 268//73 265//73 264//73\nf 261//74 262//74 264//74\nf 265//75 268//75 266//75\nf 273//70 274//70 269//70\nf 274//71 275//71 270//71\nf 275//72 276//72 271//72\nf 276//73 273//73 272//73\nf 269//74 270//74 272//74\nf 273//75 276//75 274//75\nf 281//72 282//72 277//72\nf 282//76 283//76 278//76\nf 279//70 283//70 280//70\nf 280//77 284//77 277//77\nf 277//78 278//78 280//78\nf 281//79 284//79 282//79\nf 289//70 290//70 285//70\nf 291//82 289//82 288//82\nf 288//81 285//81 287//81\nf 296//70 297//70 292//70\nf 298//82 296//82 295//82\nf 295//81 292//81 294//81\no Cube.005_Cube.006\nv -18.198074 3.975632 42.589371\nv -18.034843 3.975632 37.411659\nv -13.311332 3.975632 37.560570\nv -13.474564 3.975632 42.738285\nv -18.198074 4.281490 42.589371\nv -18.034843 4.281490 37.411659\nv -13.311332 4.281490 37.560570\nv -13.474564 4.281490 42.738285\nv -18.035482 0.001057 37.656803\nv -18.027908 0.001057 37.416569\nv -17.787678 0.001057 37.424145\nv -17.795250 0.001057 37.664375\nv -18.035482 4.126888 37.656803\nv -18.027908 4.126888 37.416569\nv -17.787678 4.126888 37.424145\nv -17.795250 4.126888 37.664375\nv -13.563428 0.001057 37.796448\nv -13.555855 0.001057 37.556217\nv -13.315623 0.001057 37.563789\nv -13.323196 0.001057 37.804024\nv -13.563428 4.126888 37.796448\nv -13.555855 4.126888 37.556217\nv -13.315623 4.126888 37.563789\nv -13.323196 4.126888 37.804024\nv -18.165178 4.091804 42.322842\nv -18.171974 4.066953 42.538429\nv -13.454423 4.066953 42.687157\nv -13.447626 4.091804 42.471569\nv -18.184101 8.110106 42.923069\nv -18.190897 8.085255 43.138657\nv -13.473346 8.085255 43.287380\nv -13.466549 8.110106 43.071793\nv -18.213047 0.001053 43.289150\nv -18.205570 0.000886 43.052017\nv -17.965340 0.000886 43.059593\nv -17.972815 0.001053 43.296722\nv -18.188623 4.104731 42.514442\nv -18.181183 4.059903 42.278423\nv -17.948391 4.104731 42.522015\nv -13.797333 0.001053 43.428360\nv -13.789857 0.000886 43.191227\nv -13.549625 0.000886 43.198799\nv -13.557101 0.001053 43.435932\nv -13.772909 4.104731 42.653652\nv -13.765469 4.059903 42.417633\nv -13.532678 4.104731 42.661224\nvn -0.999500 0.000000 -0.031500\nvn 0.031500 0.000000 -0.999500\nvn 0.999500 0.000000 0.031500\nvn -0.031500 0.000000 0.999500\nvn 0.000000 -1.000000 -0.000000\nvn 0.000000 1.000000 -0.000000\nvn 0.031200 0.147800 -0.988500\nvn -0.031200 -0.147800 0.988500\nvn -0.003600 0.993400 0.114400\nvn 0.003600 -0.993400 -0.114400\nvn -0.031000 0.185600 0.982100\nvn -0.000000 -1.000000 0.000700\nvn -0.030900 0.185600 0.982100\ns off\nf 304//83 300//83 299//83\nf 304//84 305//84 301//84\nf 306//85 302//85 301//85\nf 303//86 299//86 302//86\nf 300//87 301//87 302//87\nf 305//88 304//88 303//88\nf 312//83 308//83 307//83\nf 313//84 309//84 308//84\nf 314//85 310//85 309//85\nf 311//86 307//86 310//86\nf 308//87 309//87 310//87\nf 314//88 313//88 312//88\nf 320//83 316//83 315//83\nf 321//84 317//84 316//84\nf 322//85 318//85 317//85\nf 319//86 315//86 318//86\nf 316//87 317//87 318//87\nf 322//88 321//88 320//88\nf 328//85 324//85 323//85\nf 329//89 325//89 324//89\nf 329//83 330//83 326//83\nf 327//90 323//90 326//90\nf 324//91 325//91 326//91\nf 330//92 329//92 328//92\nf 336//83 332//83 331//83\nf 337//93 335//93 331//93\nf 332//94 333//94 334//94\nf 343//83 339//83 338//83\nf 342//93 338//93 341//93\nf 338//94 339//94 340//94\nf 303//83 304//83 299//83\nf 300//84 304//84 301//84\nf 305//85 306//85 301//85\nf 306//86 303//86 302//86\nf 299//87 300//87 302//87\nf 306//88 305//88 303//88\nf 311//83 312//83 307//83\nf 312//84 313//84 308//84\nf 313//85 314//85 309//85\nf 314//86 311//86 310//86\nf 307//87 308//87 310//87\nf 311//88 314//88 312//88\nf 319//83 320//83 315//83\nf 320//84 321//84 316//84\nf 321//85 322//85 317//85\nf 322//86 319//86 318//86\nf 315//87 316//87 318//87\nf 319//88 322//88 320//88\nf 327//85 328//85 323//85\nf 328//89 329//89 324//89\nf 325//83 329//83 326//83\nf 330//90 327//90 326//90\nf 323//91 324//91 326//91\nf 327//92 330//92 328//92\nf 335//83 336//83 331//83\nf 334//93 337//93 331//93\nf 331//94 332//94 334//94\nf 342//83 343//83 338//83\nf 344//95 342//95 341//95\nf 341//94 338//94 340//94\no Plane.003\nv 27.190660 7.453963 39.513622\nv 27.190662 7.453963 19.340351\nv 17.079443 7.453963 39.513622\nv 17.079445 7.453963 19.340351\nv 27.190660 7.789458 39.513622\nv 27.190662 7.789458 19.340351\nv 17.079443 7.789458 39.513622\nv 17.079445 7.789458 19.340351\nv 18.453768 -0.000242 38.820137\nv 17.743471 -0.000242 38.820137\nv 17.743471 -0.000242 38.109840\nv 18.453768 -0.000242 38.109840\nv 18.453768 7.605369 38.820137\nv 17.743471 7.605369 38.820137\nv 17.743471 7.605369 38.109840\nv 18.453768 7.605369 38.109840\nv 18.453770 -0.000242 20.798428\nv 17.743473 -0.000242 20.798428\nv 17.743473 -0.000242 20.088131\nv 18.453770 -0.000242 20.088131\nv 18.453770 7.605369 20.798428\nv 17.743473 7.605369 20.798428\nv 17.743473 7.605369 20.088131\nv 18.453770 7.605369 20.088131\nv 26.410721 -0.000242 38.820137\nv 25.700424 -0.000242 38.820137\nv 25.700424 -0.000242 38.109840\nv 26.410721 -0.000242 38.109840\nv 26.410721 7.605369 38.820137\nv 25.700424 7.605369 38.820137\nv 25.700424 7.605369 38.109840\nv 26.410721 7.605369 38.109840\nv 26.410723 -0.000242 20.798428\nv 25.700426 -0.000242 20.798428\nv 25.700426 -0.000242 20.088131\nv 26.410723 -0.000242 20.088131\nv 26.410723 7.605369 20.798428\nv 25.700426 7.605369 20.798428\nv 25.700426 7.605369 20.088131\nv 26.410723 7.605369 20.088131\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 1.000000 -0.000000\nvn -1.000000 0.000000 -0.000000\nvn 0.000000 0.000000 -1.000000\nvn 1.000000 0.000000 0.000000\nvn 0.000000 0.000000 1.000000\ns off\nf 347//96 348//96 346//96\nf 350//97 352//97 351//97\nf 347//98 351//98 352//98\nf 348//99 352//99 350//99\nf 346//100 350//100 349//100\nf 345//101 349//101 351//101\nf 358//101 354//101 353//101\nf 359//98 355//98 354//98\nf 360//99 356//99 355//99\nf 357//100 353//100 356//100\nf 354//96 355//96 356//96\nf 359//97 358//97 357//97\nf 366//101 362//101 361//101\nf 367//98 363//98 362//98\nf 368//99 364//99 363//99\nf 365//100 361//100 364//100\nf 362//96 363//96 364//96\nf 367//97 366//97 365//97\nf 374//101 370//101 369//101\nf 375//98 371//98 370//98\nf 376//99 372//99 371//99\nf 373//100 369//100 372//100\nf 370//96 371//96 372//96\nf 375//97 374//97 373//97\nf 382//101 378//101 377//101\nf 383//98 379//98 378//98\nf 384//99 380//99 379//99\nf 381//100 377//100 380//100\nf 378//96 379//96 380//96\nf 383//97 382//97 381//97\nf 345//96 347//96 346//96\nf 349//97 350//97 351//97\nf 348//98 347//98 352//98\nf 346//99 348//99 350//99\nf 345//100 346//100 349//100\nf 347//101 345//101 351//101\nf 357//101 358//101 353//101\nf 358//98 359//98 354//98\nf 359//99 360//99 355//99\nf 360//100 357//100 356//100\nf 353//96 354//96 356//96\nf 360//97 359//97 357//97\nf 365//101 366//101 361//101\nf 366//98 367//98 362//98\nf 367//99 368//99 363//99\nf 368//100 365//100 364//100\nf 361//96 362//96 364//96\nf 368//97 367//97 365//97\nf 373//101 374//101 369//101\nf 374//98 375//98 370//98\nf 375//99 376//99 371//99\nf 376//100 373//100 372//100\nf 369//96 370//96 372//96\nf 376//97 375//97 373//97\nf 381//101 382//101 377//101\nf 382//98 383//98 378//98\nf 383//99 384//99 379//99\nf 384//100 381//100 380//100\nf 377//96 378//96 380//96\nf 384//97 383//97 381//97\no Plane.002\nv -23.391720 7.453963 39.510792\nv -3.218449 7.453963 39.510792\nv -23.391720 7.453963 29.399574\nv -3.218449 7.453963 29.399574\nv -23.391720 7.789458 39.510792\nv -3.218449 7.789458 39.510792\nv -23.391720 7.789458 29.399574\nv -3.218449 7.789458 29.399574\nv -22.698235 -0.000242 30.773899\nv -22.698235 -0.000242 30.063602\nv -21.987938 -0.000242 30.063602\nv -21.987938 -0.000242 30.773899\nv -22.698235 7.605369 30.773899\nv -22.698235 7.605369 30.063602\nv -21.987938 7.605369 30.063602\nv -21.987938 7.605369 30.773899\nv -4.676525 -0.000242 30.773899\nv -4.676525 -0.000242 30.063602\nv -3.966229 -0.000242 30.063602\nv -3.966229 -0.000242 30.773899\nv -4.676525 7.605369 30.773899\nv -4.676525 7.605369 30.063602\nv -3.966229 7.605369 30.063602\nv -3.966229 7.605369 30.773899\nv -22.698235 -0.000242 38.730850\nv -22.698235 -0.000242 38.020554\nv -21.987938 -0.000242 38.020554\nv -21.987938 -0.000242 38.730850\nv -22.698235 7.605369 38.730850\nv -22.698235 7.605369 38.020554\nv -21.987938 7.605369 38.020554\nv -21.987938 7.605369 38.730850\nv -4.676525 -0.000242 38.730850\nv -4.676525 -0.000242 38.020554\nv -3.966229 -0.000242 38.020554\nv -3.966229 -0.000242 38.730850\nv -4.676525 7.605369 38.730850\nv -4.676525 7.605369 38.020554\nv -3.966229 7.605369 38.020554\nv -3.966229 7.605369 38.730850\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 1.000000 0.000000\nvn 0.000000 0.000000 -1.000000\nvn 1.000000 0.000000 0.000000\nvn 0.000000 0.000000 1.000000\nvn -1.000000 0.000000 0.000000\ns off\nf 387//102 388//102 386//102\nf 390//103 392//103 391//103\nf 387//104 391//104 392//104\nf 388//105 392//105 390//105\nf 386//106 390//106 389//106\nf 385//107 389//107 391//107\nf 398//107 394//107 393//107\nf 399//104 395//104 394//104\nf 400//105 396//105 395//105\nf 397//106 393//106 396//106\nf 394//102 395//102 396//102\nf 399//103 398//103 397//103\nf 406//107 402//107 401//107\nf 407//104 403//104 402//104\nf 408//105 404//105 403//105\nf 405//106 401//106 404//106\nf 402//102 403//102 404//102\nf 407//103 406//103 405//103\nf 414//107 410//107 409//107\nf 415//104 411//104 410//104\nf 416//105 412//105 411//105\nf 413//106 409//106 412//106\nf 410//102 411//102 412//102\nf 415//103 414//103 413//103\nf 422//107 418//107 417//107\nf 423//104 419//104 418//104\nf 424//105 420//105 419//105\nf 421//106 417//106 420//106\nf 418//102 419//102 420//102\nf 423//103 422//103 421//103\nf 385//102 387//102 386//102\nf 389//103 390//103 391//103\nf 388//104 387//104 392//104\nf 386//105 388//105 390//105\nf 385//106 386//106 389//106\nf 387//107 385//107 391//107\nf 397//107 398//107 393//107\nf 398//104 399//104 394//104\nf 399//105 400//105 395//105\nf 400//106 397//106 396//106\nf 393//102 394//102 396//102\nf 400//103 399//103 397//103\nf 405//107 406//107 401//107\nf 406//104 407//104 402//104\nf 407//105 408//105 403//105\nf 408//106 405//106 404//106\nf 401//102 402//102 404//102\nf 408//103 407//103 405//103\nf 413//107 414//107 409//107\nf 414//104 415//104 410//104\nf 415//105 416//105 411//105\nf 416//106 413//106 412//106\nf 409//102 410//102 412//102\nf 416//103 415//103 413//103\nf 421//107 422//107 417//107\nf 422//104 423//104 418//104\nf 423//105 424//105 419//105\nf 424//106 421//106 420//106\nf 417//102 418//102 420//102\nf 424//103 423//103 421//103\no Plane.001\nv -3.128918 7.453963 39.510792\nv 17.044353 7.453963 39.510792\nv -3.128918 7.453963 29.399574\nv 17.044353 7.453963 29.399574\nv -3.128918 7.789458 39.510792\nv 17.044353 7.789458 39.510792\nv -3.128918 7.789458 29.399574\nv 17.044353 7.789458 29.399574\nv -2.435432 -0.000242 30.773899\nv -2.435432 -0.000242 30.063602\nv -1.725137 -0.000242 30.063602\nv -1.725137 -0.000242 30.773899\nv -2.435432 7.605369 30.773899\nv -2.435432 7.605369 30.063602\nv -1.725137 7.605369 30.063602\nv -1.725137 7.605369 30.773899\nv 15.586277 -0.000242 30.773899\nv 15.586277 -0.000242 30.063602\nv 16.296574 -0.000242 30.063602\nv 16.296574 -0.000242 30.773899\nv 15.586277 7.605369 30.773899\nv 15.586277 7.605369 30.063602\nv 16.296574 7.605369 30.063602\nv 16.296574 7.605369 30.773899\nv -2.435432 -0.000242 38.730850\nv -2.435432 -0.000242 38.020554\nv -1.725137 -0.000242 38.020554\nv -1.725137 -0.000242 38.730850\nv -2.435432 7.605369 38.730850\nv -2.435432 7.605369 38.020554\nv -1.725137 7.605369 38.020554\nv -1.725137 7.605369 38.730850\nv 15.586277 -0.000242 38.730850\nv 15.586277 -0.000242 38.020554\nv 16.296574 -0.000242 38.020554\nv 16.296574 -0.000242 38.730850\nv 15.586277 7.605369 38.730850\nv 15.586277 7.605369 38.020554\nv 16.296574 7.605369 38.020554\nv 16.296574 7.605369 38.730850\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 1.000000 0.000000\nvn 0.000000 0.000000 -1.000000\nvn 1.000000 0.000000 0.000000\nvn 0.000000 0.000000 1.000000\nvn -1.000000 0.000000 0.000000\ns off\nf 427//108 428//108 426//108\nf 430//109 432//109 431//109\nf 427//110 431//110 432//110\nf 428//111 432//111 430//111\nf 426//112 430//112 429//112\nf 425//113 429//113 431//113\nf 438//113 434//113 433//113\nf 439//110 435//110 434//110\nf 440//111 436//111 435//111\nf 437//112 433//112 436//112\nf 434//108 435//108 436//108\nf 439//109 438//109 437//109\nf 446//113 442//113 441//113\nf 447//110 443//110 442//110\nf 448//111 444//111 443//111\nf 445//112 441//112 444//112\nf 442//108 443//108 444//108\nf 447//109 446//109 445//109\nf 454//113 450//113 449//113\nf 455//110 451//110 450//110\nf 456//111 452//111 451//111\nf 453//112 449//112 452//112\nf 450//108 451//108 452//108\nf 455//109 454//109 453//109\nf 462//113 458//113 457//113\nf 463//110 459//110 458//110\nf 464//111 460//111 459//111\nf 461//112 457//112 460//112\nf 458//108 459//108 460//108\nf 463//109 462//109 461//109\nf 425//108 427//108 426//108\nf 429//109 430//109 431//109\nf 428//110 427//110 432//110\nf 426//111 428//111 430//111\nf 425//112 426//112 429//112\nf 427//113 425//113 431//113\nf 437//113 438//113 433//113\nf 438//110 439//110 434//110\nf 439//111 440//111 435//111\nf 440//112 437//112 436//112\nf 433//108 434//108 436//108\nf 440//109 439//109 437//109\nf 445//113 446//113 441//113\nf 446//110 447//110 442//110\nf 447//111 448//111 443//111\nf 448//112 445//112 444//112\nf 441//108 442//108 444//108\nf 448//109 447//109 445//109\nf 453//113 454//113 449//113\nf 454//110 455//110 450//110\nf 455//111 456//111 451//111\nf 456//112 453//112 452//112\nf 449//108 450//108 452//108\nf 456//109 455//109 453//109\nf 461//113 462//113 457//113\nf 462//110 463//110 458//110\nf 463//111 464//111 459//111\nf 464//112 461//112 460//112\nf 457//108 458//108 460//108\nf 464//109 463//109 461//109\no Cube.004_Cube.005\nv -20.358261 -0.067952 5.558284\nv -20.358261 -0.067952 -5.945713\nv -11.529404 -0.067952 -5.945713\nv -11.529404 -0.067952 5.558284\nv -20.358261 11.436045 5.558284\nv -20.358261 11.436045 -5.945713\nv -11.529404 11.436045 -5.945713\nv -11.529404 11.436045 5.558284\nv -20.358261 11.436045 5.558284\nv -20.358261 11.436045 -5.945713\nv -11.529404 11.436045 -5.945713\nv -11.529404 11.436045 5.558284\nv -20.358261 11.436045 5.558284\nv -20.358261 11.436045 -5.945713\nv -11.529404 11.436045 -5.945713\nv -11.529404 11.436045 5.558284\nv -20.213440 11.436045 5.369581\nv -20.213440 11.436045 -5.757009\nv -11.674225 11.436045 -5.757009\nv -11.674225 11.436045 5.369581\nv -20.213440 10.797614 5.369581\nv -20.213440 10.797614 -5.757009\nv -11.674225 10.797614 -5.757009\nv -11.674225 10.797614 5.369581\nvn -1.000000 0.000000 0.000000\nvn 0.000000 0.000000 -1.000000\nvn 1.000000 0.000000 0.000000\nvn 0.000000 0.000000 1.000000\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 1.000000 0.000000\ns off\nf 470//114 466//114 465//114\nf 471//115 467//115 466//115\nf 472//116 468//116 467//116\nf 469//117 465//117 468//117\nf 466//118 467//118 468//118\nf 472//117 476//117 473//117\nf 476//117 480//117 477//117\nf 471//117 475//117 476//117\nf 470//117 474//117 475//117\nf 469//117 473//117 474//117\nf 480//119 484//119 481//119\nf 475//117 479//117 480//117\nf 474//117 478//117 479//117\nf 473//117 477//117 478//117\nf 481//115 484//115 488//115\nf 479//119 483//119 484//119\nf 478//119 482//119 483//119\nf 477//119 481//119 482//119\nf 487//119 486//119 485//119\nf 483//114 487//114 488//114\nf 483//117 482//117 486//117\nf 481//116 485//116 486//116\nf 469//114 470//114 465//114\nf 470//115 471//115 466//115\nf 471//116 472//116 467//116\nf 472//117 469//117 468//117\nf 465//118 466//118 468//118\nf 469//117 472//117 473//117\nf 473//117 476//117 477//117\nf 472//117 471//117 476//117\nf 471//117 470//117 475//117\nf 470//117 469//117 474//117\nf 477//119 480//119 481//119\nf 476//117 475//117 480//117\nf 475//117 474//117 479//117\nf 474//117 473//117 478//117\nf 485//115 481//115 488//115\nf 480//119 479//119 484//119\nf 479//119 478//119 483//119\nf 478//119 477//119 482//119\nf 488//119 487//119 485//119\nf 484//114 483//114 488//114\nf 487//117 483//117 486//117\nf 482//116 481//116 486//116\no Cube.003_Cube.004\nv -2.997356 3.975632 -8.797663\nv -1.639302 3.975632 -3.798558\nv -6.199872 3.975632 -2.559635\nv -7.557926 3.975632 -7.558740\nv -2.997356 4.281490 -8.797663\nv -1.639302 4.281490 -3.798558\nv -6.199872 4.281490 -2.559635\nv -7.557926 4.281490 -7.558740\nv -1.710379 0.001057 -4.033173\nv -1.647369 0.001057 -3.801228\nv -1.879314 0.001057 -3.738218\nv -1.942324 0.001057 -3.970163\nv -1.710379 4.126888 -4.033173\nv -1.647369 4.126888 -3.801228\nv -1.879314 4.126888 -3.738218\nv -1.942324 4.126888 -3.970163\nv -6.027775 0.001057 -2.858924\nv -5.964765 0.001057 -2.626979\nv -6.196710 0.001057 -2.563969\nv -6.259720 0.001057 -2.795914\nv -6.027775 4.126888 -2.858924\nv -5.964765 4.126888 -2.626979\nv -6.196710 4.126888 -2.563969\nv -6.259720 4.126888 -2.795914\nv -2.950872 4.091804 -8.533165\nv -3.007418 4.066953 -8.741317\nv -7.562235 4.066953 -7.503957\nv -7.505689 4.091804 -7.295806\nv -3.108304 8.110106 -9.112684\nv -3.164850 8.085255 -9.320836\nv -7.719667 8.085255 -8.083476\nv -7.663121 8.110106 -7.875325\nv -3.187679 0.001053 -9.471230\nv -3.125482 0.000886 -9.242277\nv -3.357427 0.000886 -9.179267\nv -3.419624 0.001053 -9.408219\nv -2.984482 4.104731 -8.723245\nv -2.922578 4.059903 -8.495370\nv -3.216427 4.104731 -8.660234\nv -7.451070 0.001053 -8.313039\nv -7.388873 0.000886 -8.084085\nv -7.620818 0.000886 -8.021076\nv -7.683015 0.001053 -8.250029\nv -7.247873 4.104731 -7.565054\nv -7.185968 4.059903 -7.337179\nv -7.479817 4.104731 -7.502044\nvn 0.965000 0.000000 -0.262200\nvn 0.262200 0.000000 0.965000\nvn -0.965000 0.000000 0.262200\nvn -0.262200 0.000000 -0.965000\nvn 0.000000 -1.000000 -0.000000\nvn 0.000000 1.000000 -0.000000\nvn 0.259300 0.147800 0.954400\nvn -0.259300 -0.147800 -0.954400\nvn -0.030000 0.993400 -0.110500\nvn 0.030000 -0.993400 0.110500\nvn -0.257600 0.185600 -0.948300\nvn -0.000200 -1.000000 -0.000700\ns off\nf 494//120 490//120 489//120\nf 494//121 495//121 491//121\nf 496//122 492//122 491//122\nf 496//123 493//123 489//123\nf 490//124 491//124 492//124\nf 495//125 494//125 493//125\nf 502//120 498//120 497//120\nf 503//121 499//121 498//121\nf 504//122 500//122 499//122\nf 501//123 497//123 500//123\nf 498//124 499//124 500//124\nf 504//125 503//125 502//125\nf 510//120 506//120 505//120\nf 511//121 507//121 506//121\nf 512//122 508//122 507//122\nf 509//123 505//123 508//123\nf 506//124 507//124 508//124\nf 512//125 511//125 510//125\nf 518//122 514//122 513//122\nf 519//126 515//126 514//126\nf 519//120 520//120 516//120\nf 517//127 513//127 516//127\nf 514//128 515//128 516//128\nf 519//129 518//129 517//129\nf 526//120 522//120 521//120\nf 527//130 525//130 521//130\nf 522//131 523//131 524//131\nf 533//120 529//120 528//120\nf 532//130 528//130 531//130\nf 529//131 530//131 531//131\nf 493//120 494//120 489//120\nf 490//121 494//121 491//121\nf 495//122 496//122 491//122\nf 492//123 496//123 489//123\nf 489//124 490//124 492//124\nf 496//125 495//125 493//125\nf 501//120 502//120 497//120\nf 502//121 503//121 498//121\nf 503//122 504//122 499//122\nf 504//123 501//123 500//123\nf 497//124 498//124 500//124\nf 501//125 504//125 502//125\nf 509//120 510//120 505//120\nf 510//121 511//121 506//121\nf 511//122 512//122 507//122\nf 512//123 509//123 508//123\nf 505//124 506//124 508//124\nf 509//125 512//125 510//125\nf 517//122 518//122 513//122\nf 518//126 519//126 514//126\nf 515//120 519//120 516//120\nf 520//127 517//127 516//127\nf 513//128 514//128 516//128\nf 520//129 519//129 517//129\nf 525//120 526//120 521//120\nf 524//130 527//130 521//130\nf 521//131 522//131 524//131\nf 532//120 533//120 528//120\nf 534//130 532//130 531//130\nf 528//131 529//131 531//131\no Cube.002_Cube.003\nv 11.565445 3.975632 -9.878628\nv 8.486217 3.975632 -5.712848\nv 4.685871 3.975632 -8.521957\nv 7.765098 3.975632 -12.687737\nv 11.565445 4.281490 -9.878628\nv 8.486217 4.281490 -5.712848\nv 4.685871 4.281490 -8.521957\nv 7.765098 4.281490 -12.687737\nv 8.626177 0.001057 -5.914114\nv 8.483309 0.001057 -5.720833\nv 8.290028 0.001057 -5.863701\nv 8.432896 0.001057 -6.056982\nv 8.626177 4.126888 -5.914114\nv 8.483309 4.126888 -5.720833\nv 8.290028 4.126888 -5.863701\nv 8.432896 4.126888 -6.056982\nv 5.027380 0.001057 -8.572578\nv 4.884512 0.001057 -8.379297\nv 4.691232 0.001057 -8.522165\nv 4.834100 0.001057 -8.715446\nv 5.027380 4.126888 -8.572578\nv 4.884512 4.126888 -8.379297\nv 4.691232 4.126888 -8.522165\nv 4.834100 4.126888 -8.715446\nv 11.386793 4.091804 -9.678122\nv 11.515005 4.066953 -9.851576\nv 7.719452 4.066953 -12.657141\nv 7.591240 4.091804 -12.483688\nv 11.743751 8.110106 -10.161038\nv 11.871963 8.085255 -10.334492\nv 8.076410 8.085255 -13.140058\nv 7.948198 8.110106 -12.966604\nv 11.975779 0.001053 -10.445675\nv 11.834754 0.000886 -10.254888\nv 11.641474 0.000886 -10.397755\nv 11.782497 0.001053 -10.588542\nv 11.515053 4.104731 -9.822375\nv 11.374692 4.059903 -9.632485\nv 11.321773 4.104731 -9.965242\nv 8.423073 0.001053 -13.071734\nv 8.282048 0.000886 -12.880947\nv 8.088768 0.000886 -13.023815\nv 8.229793 0.001053 -13.214602\nv 7.962348 4.104731 -12.448435\nv 7.821987 4.059903 -12.258546\nv 7.769067 4.104731 -12.591303\nvn 0.804200 0.000000 0.594400\nvn -0.594400 0.000000 0.804200\nvn -0.804200 0.000000 -0.594400\nvn 0.594400 0.000000 -0.804200\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 1.000000 0.000000\nvn -0.587900 0.147800 0.795300\nvn 0.587900 -0.147800 -0.795300\nvn 0.068000 0.993400 -0.092000\nvn -0.068000 -0.993400 0.092000\nvn 0.584100 0.185600 -0.790200\nvn 0.000400 -1.000000 -0.000600\ns off\nf 540//132 536//132 535//132\nf 541//133 537//133 536//133\nf 542//134 538//134 537//134\nf 539//135 535//135 538//135\nf 536//136 537//136 538//136\nf 542//137 541//137 540//137\nf 548//132 544//132 543//132\nf 549//133 545//133 544//133\nf 550//134 546//134 545//134\nf 547//135 543//135 546//135\nf 543//136 544//136 545//136\nf 549//137 548//137 547//137\nf 556//132 552//132 551//132\nf 557//133 553//133 552//133\nf 558//134 554//134 553//134\nf 555//135 551//135 554//135\nf 552//136 553//136 554//136\nf 558//137 557//137 556//137\nf 564//134 560//134 559//134\nf 565//138 561//138 560//138\nf 565//132 566//132 562//132\nf 563//139 559//139 562//139\nf 559//140 560//140 561//140\nf 566//141 565//141 564//141\nf 572//132 568//132 567//132\nf 571//142 567//142 570//142\nf 568//143 569//143 570//143\nf 579//132 575//132 574//132\nf 580//142 578//142 574//142\nf 575//143 576//143 577//143\nf 539//132 540//132 535//132\nf 540//133 541//133 536//133\nf 541//134 542//134 537//134\nf 542//135 539//135 538//135\nf 535//136 536//136 538//136\nf 539//137 542//137 540//137\nf 547//132 548//132 543//132\nf 548//133 549//133 544//133\nf 549//134 550//134 545//134\nf 550//135 547//135 546//135\nf 546//136 543//136 545//136\nf 550//137 549//137 547//137\nf 555//132 556//132 551//132\nf 556//133 557//133 552//133\nf 557//134 558//134 553//134\nf 558//135 555//135 554//135\nf 551//136 552//136 554//136\nf 555//137 558//137 556//137\nf 563//134 564//134 559//134\nf 564//138 565//138 560//138\nf 561//132 565//132 562//132\nf 566//139 563//139 562//139\nf 562//140 559//140 561//140\nf 563//141 566//141 564//141\nf 571//132 572//132 567//132\nf 573//142 571//142 570//142\nf 567//143 568//143 570//143\nf 578//132 579//132 574//132\nf 577//142 580//142 574//142\nf 574//143 575//143 577//143\no Cube.001_Cube.002\nv 2.347127 3.975632 7.296266\nv 2.123841 3.975632 2.120795\nv 6.845307 3.975632 1.917096\nv 7.068593 3.975632 7.092567\nv 2.347127 4.281490 7.296266\nv 2.123841 4.281490 2.120795\nv 6.845307 4.281490 1.917096\nv 7.068593 4.281490 7.092567\nv 2.141482 0.001057 2.365304\nv 2.131122 0.001057 2.125176\nv 2.371250 0.001057 2.114816\nv 2.381610 0.001057 2.354945\nv 2.141482 4.126888 2.365304\nv 2.131122 4.126888 2.125176\nv 2.371250 4.126888 2.114816\nv 2.381610 4.126888 2.354945\nv 6.611500 0.001057 2.171115\nv 6.601140 0.001057 1.930987\nv 6.841268 0.001057 1.920627\nv 6.851627 0.001057 2.160755\nv 6.611500 4.126888 2.171115\nv 6.601140 4.126888 1.930987\nv 6.841268 4.126888 1.920627\nv 6.851627 4.126888 2.160755\nv 2.360059 4.091804 7.028027\nv 2.369356 4.066953 7.243522\nv 7.084865 4.066953 7.040080\nv 7.075568 4.091804 6.824585\nv 2.385943 8.110106 7.627992\nv 2.395240 8.085255 7.843486\nv 7.110749 8.085255 7.640045\nv 7.101452 8.110106 7.424550\nv 2.384374 0.001053 7.995214\nv 2.374147 0.000886 7.758183\nv 2.614275 0.000886 7.747824\nv 2.624501 0.001053 7.984854\nv 2.350965 4.104731 7.220840\nv 2.340787 4.059903 6.984926\nv 2.591092 4.104731 7.210481\nv 6.798176 0.001053 7.804789\nv 6.787950 0.000886 7.567759\nv 7.028077 0.000886 7.557399\nv 7.038303 0.001053 7.794429\nv 6.764767 4.104731 7.030416\nv 6.754589 4.059903 6.794501\nv 7.004894 4.104731 7.020056\nvn -0.999100 0.000000 0.043100\nvn -0.043100 0.000000 -0.999100\nvn 0.999100 0.000000 -0.043100\nvn 0.043100 0.000000 0.999100\nvn 0.000000 -1.000000 -0.000000\nvn 0.000000 1.000000 0.000000\nvn -0.042600 0.147800 -0.988100\nvn 0.042600 -0.147800 0.988100\nvn 0.004900 0.993400 0.114300\nvn -0.004900 -0.993400 -0.114400\nvn 0.042400 0.185600 0.981700\nvn 0.000000 -1.000000 0.000700\nvn 0.004900 0.993400 0.114400\nvn -0.004900 -0.993400 -0.114300\ns off\nf 585//144 586//144 582//144\nf 586//145 587//145 583//145\nf 587//146 588//146 584//146\nf 588//147 585//147 581//147\nf 582//148 583//148 584//148\nf 587//149 586//149 585//149\nf 594//144 590//144 589//144\nf 594//145 595//145 591//145\nf 596//146 592//146 591//146\nf 596//147 593//147 589//147\nf 590//148 591//148 592//148\nf 596//149 595//149 594//149\nf 602//144 598//144 597//144\nf 603//145 599//145 598//145\nf 604//146 600//146 599//146\nf 601//147 597//147 600//147\nf 598//148 599//148 600//148\nf 603//149 602//149 601//149\nf 610//146 606//146 605//146\nf 611//150 607//150 606//150\nf 611//144 612//144 608//144\nf 609//151 605//151 608//151\nf 606//152 607//152 608//152\nf 611//153 610//153 609//153\nf 618//144 614//144 613//144\nf 619//154 617//154 613//154\nf 614//155 615//155 616//155\nf 625//144 621//144 620//144\nf 624//154 620//154 623//154\nf 621//155 622//155 623//155\nf 581//144 585//144 582//144\nf 582//145 586//145 583//145\nf 583//146 587//146 584//146\nf 584//147 588//147 581//147\nf 581//148 582//148 584//148\nf 588//149 587//149 585//149\nf 593//144 594//144 589//144\nf 590//145 594//145 591//145\nf 595//146 596//146 591//146\nf 592//147 596//147 589//147\nf 589//148 590//148 592//148\nf 593//149 596//149 594//149\nf 601//144 602//144 597//144\nf 602//145 603//145 598//145\nf 603//146 604//146 599//146\nf 604//147 601//147 600//147\nf 597//148 598//148 600//148\nf 604//149 603//149 601//149\nf 609//146 610//146 605//146\nf 610//150 611//150 606//150\nf 607//144 611//144 608//144\nf 612//151 609//151 608//151\nf 605//156 606//156 608//156\nf 612//157 611//157 609//157\nf 617//144 618//144 613//144\nf 616//154 619//154 613//154\nf 613//155 614//155 616//155\nf 624//144 625//144 620//144\nf 626//154 624//154 623//154\nf 620//155 621//155 623//155\no Cube_Cube.001\nv -7.345846 3.975632 7.121086\nv -7.182613 3.975632 1.943373\nv -2.459102 3.975632 2.092286\nv -2.622334 3.975632 7.269999\nv -7.345846 4.281490 7.121086\nv -7.182613 4.281490 1.943373\nv -2.459102 4.281490 2.092286\nv -2.622334 4.281490 7.269999\nv -7.183253 0.001057 2.188517\nv -7.175679 0.001057 1.948285\nv -6.935448 0.001057 1.955859\nv -6.943021 0.001057 2.196091\nv -7.183253 4.126888 2.188517\nv -7.175679 4.126888 1.948285\nv -6.935448 4.126888 1.955859\nv -6.943021 4.126888 2.196091\nv -2.711199 0.001057 2.328164\nv -2.703625 0.001057 2.087932\nv -2.463394 0.001057 2.095505\nv -2.470968 0.001057 2.335737\nv -2.711199 4.126888 2.328164\nv -2.703625 4.126888 2.087932\nv -2.463394 4.126888 2.095505\nv -2.470968 4.126888 2.335737\nv -7.312949 4.091804 6.854558\nv -7.319746 4.066953 7.070146\nv -2.602194 4.066953 7.218871\nv -2.595397 4.091804 7.003284\nv -7.331872 8.110106 7.454782\nv -7.338669 8.085255 7.670370\nv -2.621116 8.085255 7.819096\nv -2.614320 8.110106 7.603508\nv -7.360818 0.001053 7.820866\nv -7.353342 0.000886 7.583733\nv -7.113111 0.000886 7.591306\nv -7.120586 0.001053 7.828439\nv -7.336394 4.104731 7.046157\nv -7.328954 4.059903 6.810140\nv -7.096163 4.104731 7.053730\nv -2.945104 0.001053 7.960075\nv -2.937628 0.000886 7.722942\nv -2.697396 0.000886 7.730515\nv -2.704872 0.001053 7.967649\nv -2.920681 4.104731 7.185366\nv -2.913240 4.059903 6.949349\nv -2.680449 4.104731 7.192940\nvn -0.999500 0.000000 -0.031500\nvn 0.031500 0.000000 -0.999500\nvn 0.999500 0.000000 0.031500\nvn -0.031500 0.000000 0.999500\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 1.000000 -0.000000\nvn 0.031200 0.147800 -0.988500\nvn -0.031200 -0.147800 0.988500\nvn -0.003600 0.993400 0.114400\nvn 0.003600 -0.993400 -0.114400\nvn -0.031000 0.185600 0.982100\nvn -0.000000 -1.000000 0.000700\ns off\nf 632//158 628//158 627//158\nf 632//159 633//159 629//159\nf 634//160 630//160 629//160\nf 631//161 627//161 630//161\nf 628//162 629//162 630//162\nf 633//163 632//163 631//163\nf 640//158 636//158 635//158\nf 641//159 637//159 636//159\nf 642//160 638//160 637//160\nf 639//161 635//161 638//161\nf 636//162 637//162 638//162\nf 641//163 640//163 639//163\nf 648//158 644//158 643//158\nf 648//159 649//159 645//159\nf 650//160 646//160 645//160\nf 650//161 647//161 643//161\nf 644//162 645//162 646//162\nf 649//163 648//163 647//163\nf 656//160 652//160 651//160\nf 657//164 653//164 652//164\nf 657//158 658//158 654//158\nf 658//165 655//165 651//165\nf 652//166 653//166 654//166\nf 657//167 656//167 655//167\nf 664//158 660//158 659//158\nf 663//168 659//168 662//168\nf 659//169 660//169 661//169\nf 671//158 667//158 666//158\nf 670//168 666//168 669//168\nf 667//169 668//169 669//169\nf 631//158 632//158 627//158\nf 628//159 632//159 629//159\nf 633//160 634//160 629//160\nf 634//161 631//161 630//161\nf 627//162 628//162 630//162\nf 634//163 633//163 631//163\nf 639//158 640//158 635//158\nf 640//159 641//159 636//159\nf 641//160 642//160 637//160\nf 642//161 639//161 638//161\nf 635//162 636//162 638//162\nf 642//163 641//163 639//163\nf 647//158 648//158 643//158\nf 644//159 648//159 645//159\nf 649//160 650//160 645//160\nf 646//161 650//161 643//161\nf 643//162 644//162 646//162\nf 650//163 649//163 647//163\nf 655//160 656//160 651//160\nf 656//164 657//164 652//164\nf 653//158 657//158 654//158\nf 654//165 658//165 651//165\nf 651//166 652//166 654//166\nf 658//167 657//167 655//167\nf 663//158 664//158 659//158\nf 665//168 663//168 662//168\nf 662//169 659//169 661//169\nf 670//158 671//158 666//158\nf 672//168 670//168 669//168\nf 666//169 667//169 669//169\no Plane\nv -9.990057 7.453963 4.747684\nv 10.183214 7.453963 4.747684\nv -9.990057 7.453963 -5.363534\nv 10.183214 7.453963 -5.363534\nv -9.990057 7.789458 4.747684\nv 10.183214 7.789458 4.747684\nv -9.990057 7.789458 -5.363534\nv 10.183214 7.789458 -5.363534\nv -9.296572 -0.000242 -3.989209\nv -9.296572 -0.000242 -4.699506\nv -8.586276 -0.000242 -4.699506\nv -8.586276 -0.000242 -3.989209\nv -9.296572 7.605369 -3.989209\nv -9.296572 7.605369 -4.699506\nv -8.586276 7.605369 -4.699506\nv -8.586276 7.605369 -3.989209\nv 8.725138 -0.000242 -3.989209\nv 8.725138 -0.000242 -4.699506\nv 9.435433 -0.000242 -4.699506\nv 9.435433 -0.000242 -3.989209\nv 8.725138 7.605369 -3.989209\nv 8.725138 7.605369 -4.699506\nv 9.435433 7.605369 -4.699506\nv 9.435433 7.605369 -3.989209\nv -9.296572 -0.000242 3.967743\nv -9.296572 -0.000242 3.257447\nv -8.586276 -0.000242 3.257447\nv -8.586276 -0.000242 3.967743\nv -9.296572 7.605369 3.967743\nv -9.296572 7.605369 3.257447\nv -8.586276 7.605369 3.257447\nv -8.586276 7.605369 3.967743\nv 8.725138 -0.000242 3.967743\nv 8.725138 -0.000242 3.257447\nv 9.435433 -0.000242 3.257447\nv 9.435433 -0.000242 3.967743\nv 8.725138 7.605369 3.967743\nv 8.725138 7.605369 3.257447\nv 9.435433 7.605369 3.257447\nv 9.435433 7.605369 3.967743\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 1.000000 0.000000\nvn 0.000000 0.000000 -1.000000\nvn 1.000000 0.000000 0.000000\nvn 0.000000 0.000000 1.000000\nvn -1.000000 0.000000 0.000000\ns off\nf 675//170 676//170 674//170\nf 678//171 680//171 679//171\nf 675//172 679//172 680//172\nf 676//173 680//173 678//173\nf 674//174 678//174 677//174\nf 673//175 677//175 679//175\nf 686//175 682//175 681//175\nf 687//172 683//172 682//172\nf 688//173 684//173 683//173\nf 685//174 681//174 684//174\nf 682//170 683//170 684//170\nf 687//171 686//171 685//171\nf 694//175 690//175 689//175\nf 695//172 691//172 690//172\nf 696//173 692//173 691//173\nf 693//174 689//174 692//174\nf 690//170 691//170 692//170\nf 695//171 694//171 693//171\nf 702//175 698//175 697//175\nf 703//172 699//172 698//172\nf 704//173 700//173 699//173\nf 701//174 697//174 700//174\nf 698//170 699//170 700//170\nf 703//171 702//171 701//171\nf 710//175 706//175 705//175\nf 711//172 707//172 706//172\nf 712//173 708//173 707//173\nf 709//174 705//174 708//174\nf 706//170 707//170 708//170\nf 711//171 710//171 709//171\nf 673//170 675//170 674//170\nf 677//171 678//171 679//171\nf 676//172 675//172 680//172\nf 674//173 676//173 678//173\nf 673//174 674//174 677//174\nf 675//175 673//175 679//175\nf 685//175 686//175 681//175\nf 686//172 687//172 682//172\nf 687//173 688//173 683//173\nf 688//174 685//174 684//174\nf 681//170 682//170 684//170\nf 688//171 687//171 685//171\nf 693//175 694//175 689//175\nf 694//172 695//172 690//172\nf 695//173 696//173 691//173\nf 696//174 693//174 692//174\nf 689//170 690//170 692//170\nf 696//171 695//171 693//171\nf 701//175 702//175 697//175\nf 702//172 703//172 698//172\nf 703//173 704//173 699//173\nf 704//174 701//174 700//174\nf 697//170 698//170 700//170\nf 704//171 703//171 701//171\nf 709//175 710//175 705//175\nf 710//172 711//172 706//172\nf 711//173 712//173 707//173\nf 712//174 709//174 708//174\nf 705//170 706//170 708//170\nf 712//171 711//171 709//171\n"
  },
  {
    "path": "obj/cubes.obj",
    "content": "# Blender v2.72 (sub 0) OBJ File: ''\n# www.blender.org\nmtllib cubes.mtl\no Cube\nv 1.000000 -1.000000 -1.000000\nv 1.000000 -1.000000 1.000000\nv -1.000000 -1.000000 1.000000\nv -1.000000 -1.000000 -1.000000\nv 1.000000 1.000000 -0.999999\nv 0.999999 1.000000 1.000001\nv -1.000000 1.000000 1.000000\nv -1.000000 1.000000 -1.000000\nv 4.600001 -1.000000 -1.000000\nv 4.600001 -1.000000 1.000000\nv 2.600001 -1.000000 1.000000\nv 2.600002 -1.000000 -1.000000\nv 4.600002 1.000000 -0.999999\nv 4.600001 1.000000 1.000001\nv 2.600001 1.000000 1.000000\nv 2.600002 1.000000 -1.000000\nv 8.200003 -1.000000 -1.000000\nv 8.200003 -1.000000 1.000000\nv 6.200003 -1.000000 1.000000\nv 6.200004 -1.000000 -1.000000\nv 8.200004 1.000000 -0.999999\nv 8.200003 1.000000 1.000001\nv 6.200003 1.000000 1.000000\nv 6.200003 1.000000 -1.000000\nv 11.800005 -1.000000 -1.000000\nv 11.800005 -1.000000 1.000000\nv 9.800005 -1.000000 1.000000\nv 9.800005 -1.000000 -1.000000\nv 11.800005 1.000000 -0.999999\nv 11.800004 1.000000 1.000001\nv 9.800005 1.000000 1.000000\nv 9.800005 1.000000 -1.000000\nv 15.400006 -1.000000 -1.000000\nv 15.400006 -1.000000 1.000000\nv 13.400006 -1.000000 1.000000\nv 13.400006 -1.000000 -1.000000\nv 15.400007 1.000000 -0.999999\nv 15.400005 1.000000 1.000001\nv 13.400006 1.000000 1.000000\nv 13.400006 1.000000 -1.000000\nv 19.000008 -1.000000 -1.000000\nv 19.000008 -1.000000 1.000000\nv 17.000008 -1.000000 1.000000\nv 17.000008 -1.000000 -1.000000\nv 19.000008 1.000000 -0.999999\nv 19.000008 1.000000 1.000001\nv 17.000008 1.000000 1.000000\nv 17.000008 1.000000 -1.000000\nv 22.600010 -1.000000 -1.000000\nv 22.600010 -1.000000 1.000000\nv 20.600010 -1.000000 1.000000\nv 20.600010 -1.000000 -1.000000\nv 22.600010 1.000000 -0.999999\nv 22.600010 1.000000 1.000001\nv 20.600010 1.000000 1.000000\nv 20.600010 1.000000 -1.000000\nv 26.200012 -1.000000 -1.000000\nv 26.200012 -1.000000 1.000000\nv 24.200012 -1.000000 1.000000\nv 24.200012 -1.000000 -1.000000\nv 26.200012 1.000000 -0.999999\nv 26.200012 1.000000 1.000001\nv 24.200012 1.000000 1.000000\nv 24.200012 1.000000 -1.000000\nv 29.800014 -1.000000 -1.000000\nv 29.800014 -1.000000 1.000000\nv 27.800014 -1.000000 1.000000\nv 27.800014 -1.000000 -1.000000\nv 29.800014 1.000000 -0.999999\nv 29.800014 1.000000 1.000001\nv 27.800014 1.000000 1.000000\nv 27.800014 1.000000 -1.000000\nv 33.400017 -1.000000 -1.000000\nv 33.400017 -1.000000 1.000000\nv 31.400017 -1.000000 1.000000\nv 31.400017 -1.000000 -1.000000\nv 33.400017 1.000000 -0.999999\nv 33.400017 1.000000 1.000001\nv 31.400017 1.000000 1.000000\nv 31.400017 1.000000 -1.000000\nv 1.000000 -1.000000 -4.600001\nv 1.000000 -1.000000 -2.600002\nv -1.000000 -1.000000 -2.600002\nv -1.000000 -1.000000 -4.600002\nv 1.000000 1.000000 -4.600001\nv 0.999999 1.000000 -2.600001\nv -1.000000 1.000000 -2.600002\nv -1.000000 1.000000 -4.600001\nv 4.600001 -1.000000 -4.600001\nv 4.600001 -1.000000 -2.600002\nv 2.600001 -1.000000 -2.600002\nv 2.600002 -1.000000 -4.600002\nv 4.600002 1.000000 -4.600001\nv 4.600001 1.000000 -2.600001\nv 2.600001 1.000000 -2.600002\nv 2.600002 1.000000 -4.600001\nv 8.200003 -1.000000 -4.600001\nv 8.200003 -1.000000 -2.600002\nv 6.200003 -1.000000 -2.600002\nv 6.200004 -1.000000 -4.600002\nv 8.200004 1.000000 -4.600001\nv 8.200003 1.000000 -2.600001\nv 6.200003 1.000000 -2.600002\nv 6.200003 1.000000 -4.600001\nv 11.800005 -1.000000 -4.600001\nv 11.800005 -1.000000 -2.600002\nv 9.800005 -1.000000 -2.600002\nv 9.800005 -1.000000 -4.600002\nv 11.800005 1.000000 -4.600001\nv 11.800004 1.000000 -2.600001\nv 9.800005 1.000000 -2.600002\nv 9.800005 1.000000 -4.600001\nv 15.400006 -1.000000 -4.600001\nv 15.400006 -1.000000 -2.600002\nv 13.400006 -1.000000 -2.600002\nv 13.400006 -1.000000 -4.600002\nv 15.400007 1.000000 -4.600001\nv 15.400005 1.000000 -2.600001\nv 13.400006 1.000000 -2.600002\nv 13.400006 1.000000 -4.600001\nv 19.000008 -1.000000 -4.600001\nv 19.000008 -1.000000 -2.600002\nv 17.000008 -1.000000 -2.600002\nv 17.000008 -1.000000 -4.600002\nv 19.000008 1.000000 -4.600001\nv 19.000008 1.000000 -2.600001\nv 17.000008 1.000000 -2.600002\nv 17.000008 1.000000 -4.600001\nv 22.600010 -1.000000 -4.600001\nv 22.600010 -1.000000 -2.600002\nv 20.600010 -1.000000 -2.600002\nv 20.600010 -1.000000 -4.600002\nv 22.600010 1.000000 -4.600001\nv 22.600010 1.000000 -2.600001\nv 20.600010 1.000000 -2.600002\nv 20.600010 1.000000 -4.600001\nv 26.200012 -1.000000 -4.600001\nv 26.200012 -1.000000 -2.600002\nv 24.200012 -1.000000 -2.600002\nv 24.200012 -1.000000 -4.600002\nv 26.200012 1.000000 -4.600001\nv 26.200012 1.000000 -2.600001\nv 24.200012 1.000000 -2.600002\nv 24.200012 1.000000 -4.600001\nv 29.800014 -1.000000 -4.600001\nv 29.800014 -1.000000 -2.600002\nv 27.800014 -1.000000 -2.600002\nv 27.800014 -1.000000 -4.600002\nv 29.800014 1.000000 -4.600001\nv 29.800014 1.000000 -2.600001\nv 27.800014 1.000000 -2.600002\nv 27.800014 1.000000 -4.600001\nv 33.400017 -1.000000 -4.600001\nv 33.400017 -1.000000 -2.600002\nv 31.400017 -1.000000 -2.600002\nv 31.400017 -1.000000 -4.600002\nv 33.400017 1.000000 -4.600001\nv 33.400017 1.000000 -2.600001\nv 31.400017 1.000000 -2.600002\nv 31.400017 1.000000 -4.600001\nv 1.000000 -1.000000 -8.200003\nv 1.000000 -1.000000 -6.200003\nv -1.000000 -1.000000 -6.200003\nv -1.000000 -1.000000 -8.200004\nv 1.000000 1.000000 -8.200003\nv 0.999999 1.000000 -6.200003\nv -1.000000 1.000000 -6.200004\nv -1.000000 1.000000 -8.200003\nv 4.600001 -1.000000 -8.200003\nv 4.600001 -1.000000 -6.200003\nv 2.600001 -1.000000 -6.200003\nv 2.600002 -1.000000 -8.200004\nv 4.600002 1.000000 -8.200003\nv 4.600001 1.000000 -6.200003\nv 2.600001 1.000000 -6.200004\nv 2.600002 1.000000 -8.200003\nv 8.200003 -1.000000 -8.200003\nv 8.200003 -1.000000 -6.200003\nv 6.200003 -1.000000 -6.200003\nv 6.200004 -1.000000 -8.200004\nv 8.200004 1.000000 -8.200003\nv 8.200003 1.000000 -6.200003\nv 6.200003 1.000000 -6.200004\nv 6.200003 1.000000 -8.200003\nv 11.800005 -1.000000 -8.200003\nv 11.800005 -1.000000 -6.200003\nv 9.800005 -1.000000 -6.200003\nv 9.800005 -1.000000 -8.200004\nv 11.800005 1.000000 -8.200003\nv 11.800004 1.000000 -6.200003\nv 9.800005 1.000000 -6.200004\nv 9.800005 1.000000 -8.200003\nv 15.400006 -1.000000 -8.200003\nv 15.400006 -1.000000 -6.200003\nv 13.400006 -1.000000 -6.200003\nv 13.400006 -1.000000 -8.200004\nv 15.400007 1.000000 -8.200003\nv 15.400005 1.000000 -6.200003\nv 13.400006 1.000000 -6.200004\nv 13.400006 1.000000 -8.200003\nv 19.000008 -1.000000 -8.200003\nv 19.000008 -1.000000 -6.200003\nv 17.000008 -1.000000 -6.200003\nv 17.000008 -1.000000 -8.200004\nv 19.000008 1.000000 -8.200003\nv 19.000008 1.000000 -6.200003\nv 17.000008 1.000000 -6.200004\nv 17.000008 1.000000 -8.200003\nv 22.600010 -1.000000 -8.200003\nv 22.600010 -1.000000 -6.200003\nv 20.600010 -1.000000 -6.200003\nv 20.600010 -1.000000 -8.200004\nv 22.600010 1.000000 -8.200003\nv 22.600010 1.000000 -6.200003\nv 20.600010 1.000000 -6.200004\nv 20.600010 1.000000 -8.200003\nv 26.200012 -1.000000 -8.200003\nv 26.200012 -1.000000 -6.200003\nv 24.200012 -1.000000 -6.200003\nv 24.200012 -1.000000 -8.200004\nv 26.200012 1.000000 -8.200003\nv 26.200012 1.000000 -6.200003\nv 24.200012 1.000000 -6.200004\nv 24.200012 1.000000 -8.200003\nv 29.800014 -1.000000 -8.200003\nv 29.800014 -1.000000 -6.200003\nv 27.800014 -1.000000 -6.200003\nv 27.800014 -1.000000 -8.200004\nv 29.800014 1.000000 -8.200003\nv 29.800014 1.000000 -6.200003\nv 27.800014 1.000000 -6.200004\nv 27.800014 1.000000 -8.200003\nv 33.400017 -1.000000 -8.200003\nv 33.400017 -1.000000 -6.200003\nv 31.400017 -1.000000 -6.200003\nv 31.400017 -1.000000 -8.200004\nv 33.400017 1.000000 -8.200003\nv 33.400017 1.000000 -6.200003\nv 31.400017 1.000000 -6.200004\nv 31.400017 1.000000 -8.200003\nv 1.000000 -1.000000 -11.800005\nv 1.000000 -1.000000 -9.800005\nv -1.000000 -1.000000 -9.800005\nv -1.000000 -1.000000 -11.800005\nv 1.000000 1.000000 -11.800004\nv 0.999999 1.000000 -9.800004\nv -1.000000 1.000000 -9.800005\nv -1.000000 1.000000 -11.800005\nv 4.600001 -1.000000 -11.800005\nv 4.600001 -1.000000 -9.800005\nv 2.600001 -1.000000 -9.800005\nv 2.600002 -1.000000 -11.800005\nv 4.600002 1.000000 -11.800004\nv 4.600001 1.000000 -9.800004\nv 2.600001 1.000000 -9.800005\nv 2.600002 1.000000 -11.800005\nv 8.200003 -1.000000 -11.800005\nv 8.200003 -1.000000 -9.800005\nv 6.200003 -1.000000 -9.800005\nv 6.200004 -1.000000 -11.800005\nv 8.200004 1.000000 -11.800004\nv 8.200003 1.000000 -9.800004\nv 6.200003 1.000000 -9.800005\nv 6.200003 1.000000 -11.800005\nv 11.800005 -1.000000 -11.800005\nv 11.800005 -1.000000 -9.800005\nv 9.800005 -1.000000 -9.800005\nv 9.800005 -1.000000 -11.800005\nv 11.800005 1.000000 -11.800004\nv 11.800004 1.000000 -9.800004\nv 9.800005 1.000000 -9.800005\nv 9.800005 1.000000 -11.800005\nv 15.400006 -1.000000 -11.800005\nv 15.400006 -1.000000 -9.800005\nv 13.400006 -1.000000 -9.800005\nv 13.400006 -1.000000 -11.800005\nv 15.400007 1.000000 -11.800004\nv 15.400005 1.000000 -9.800004\nv 13.400006 1.000000 -9.800005\nv 13.400006 1.000000 -11.800005\nv 19.000008 -1.000000 -11.800005\nv 19.000008 -1.000000 -9.800005\nv 17.000008 -1.000000 -9.800005\nv 17.000008 -1.000000 -11.800005\nv 19.000008 1.000000 -11.800004\nv 19.000008 1.000000 -9.800004\nv 17.000008 1.000000 -9.800005\nv 17.000008 1.000000 -11.800005\nv 22.600010 -1.000000 -11.800005\nv 22.600010 -1.000000 -9.800005\nv 20.600010 -1.000000 -9.800005\nv 20.600010 -1.000000 -11.800005\nv 22.600010 1.000000 -11.800004\nv 22.600010 1.000000 -9.800004\nv 20.600010 1.000000 -9.800005\nv 20.600010 1.000000 -11.800005\nv 26.200012 -1.000000 -11.800005\nv 26.200012 -1.000000 -9.800005\nv 24.200012 -1.000000 -9.800005\nv 24.200012 -1.000000 -11.800005\nv 26.200012 1.000000 -11.800004\nv 26.200012 1.000000 -9.800004\nv 24.200012 1.000000 -9.800005\nv 24.200012 1.000000 -11.800005\nv 29.800014 -1.000000 -11.800005\nv 29.800014 -1.000000 -9.800005\nv 27.800014 -1.000000 -9.800005\nv 27.800014 -1.000000 -11.800005\nv 29.800014 1.000000 -11.800004\nv 29.800014 1.000000 -9.800004\nv 27.800014 1.000000 -9.800005\nv 27.800014 1.000000 -11.800005\nv 33.400017 -1.000000 -11.800005\nv 33.400017 -1.000000 -9.800005\nv 31.400017 -1.000000 -9.800005\nv 31.400017 -1.000000 -11.800005\nv 33.400017 1.000000 -11.800004\nv 33.400017 1.000000 -9.800004\nv 31.400017 1.000000 -9.800005\nv 31.400017 1.000000 -11.800005\nv 1.000000 -1.000000 -15.400006\nv 1.000000 -1.000000 -13.400006\nv -1.000000 -1.000000 -13.400006\nv -1.000000 -1.000000 -15.400006\nv 1.000000 1.000000 -15.400005\nv 0.999999 1.000000 -13.400005\nv -1.000000 1.000000 -13.400006\nv -1.000000 1.000000 -15.400006\nv 4.600001 -1.000000 -15.400006\nv 4.600001 -1.000000 -13.400006\nv 2.600001 -1.000000 -13.400006\nv 2.600002 -1.000000 -15.400006\nv 4.600002 1.000000 -15.400005\nv 4.600001 1.000000 -13.400005\nv 2.600001 1.000000 -13.400006\nv 2.600002 1.000000 -15.400006\nv 8.200003 -1.000000 -15.400006\nv 8.200003 -1.000000 -13.400006\nv 6.200003 -1.000000 -13.400006\nv 6.200004 -1.000000 -15.400006\nv 8.200004 1.000000 -15.400005\nv 8.200003 1.000000 -13.400005\nv 6.200003 1.000000 -13.400006\nv 6.200003 1.000000 -15.400006\nv 11.800005 -1.000000 -15.400006\nv 11.800005 -1.000000 -13.400006\nv 9.800005 -1.000000 -13.400006\nv 9.800005 -1.000000 -15.400006\nv 11.800005 1.000000 -15.400005\nv 11.800004 1.000000 -13.400005\nv 9.800005 1.000000 -13.400006\nv 9.800005 1.000000 -15.400006\nv 15.400006 -1.000000 -15.400006\nv 15.400006 -1.000000 -13.400006\nv 13.400006 -1.000000 -13.400006\nv 13.400006 -1.000000 -15.400006\nv 15.400007 1.000000 -15.400005\nv 15.400005 1.000000 -13.400005\nv 13.400006 1.000000 -13.400006\nv 13.400006 1.000000 -15.400006\nv 19.000008 -1.000000 -15.400006\nv 19.000008 -1.000000 -13.400006\nv 17.000008 -1.000000 -13.400006\nv 17.000008 -1.000000 -15.400006\nv 19.000008 1.000000 -15.400005\nv 19.000008 1.000000 -13.400005\nv 17.000008 1.000000 -13.400006\nv 17.000008 1.000000 -15.400006\nv 22.600010 -1.000000 -15.400006\nv 22.600010 -1.000000 -13.400006\nv 20.600010 -1.000000 -13.400006\nv 20.600010 -1.000000 -15.400006\nv 22.600010 1.000000 -15.400005\nv 22.600010 1.000000 -13.400005\nv 20.600010 1.000000 -13.400006\nv 20.600010 1.000000 -15.400006\nv 26.200012 -1.000000 -15.400006\nv 26.200012 -1.000000 -13.400006\nv 24.200012 -1.000000 -13.400006\nv 24.200012 -1.000000 -15.400006\nv 26.200012 1.000000 -15.400005\nv 26.200012 1.000000 -13.400005\nv 24.200012 1.000000 -13.400006\nv 24.200012 1.000000 -15.400006\nv 29.800014 -1.000000 -15.400006\nv 29.800014 -1.000000 -13.400006\nv 27.800014 -1.000000 -13.400006\nv 27.800014 -1.000000 -15.400006\nv 29.800014 1.000000 -15.400005\nv 29.800014 1.000000 -13.400005\nv 27.800014 1.000000 -13.400006\nv 27.800014 1.000000 -15.400006\nv 33.400017 -1.000000 -15.400006\nv 33.400017 -1.000000 -13.400006\nv 31.400017 -1.000000 -13.400006\nv 31.400017 -1.000000 -15.400006\nv 33.400017 1.000000 -15.400005\nv 33.400017 1.000000 -13.400005\nv 31.400017 1.000000 -13.400006\nv 31.400017 1.000000 -15.400006\nv 1.000000 -1.000000 -19.000008\nv 1.000000 -1.000000 -17.000008\nv -1.000000 -1.000000 -17.000008\nv -1.000000 -1.000000 -19.000008\nv 1.000000 1.000000 -19.000008\nv 0.999999 1.000000 -17.000008\nv -1.000000 1.000000 -17.000008\nv -1.000000 1.000000 -19.000008\nv 4.600001 -1.000000 -19.000008\nv 4.600001 -1.000000 -17.000008\nv 2.600001 -1.000000 -17.000008\nv 2.600002 -1.000000 -19.000008\nv 4.600002 1.000000 -19.000008\nv 4.600001 1.000000 -17.000008\nv 2.600001 1.000000 -17.000008\nv 2.600002 1.000000 -19.000008\nv 8.200003 -1.000000 -19.000008\nv 8.200003 -1.000000 -17.000008\nv 6.200003 -1.000000 -17.000008\nv 6.200004 -1.000000 -19.000008\nv 8.200004 1.000000 -19.000008\nv 8.200003 1.000000 -17.000008\nv 6.200003 1.000000 -17.000008\nv 6.200003 1.000000 -19.000008\nv 11.800005 -1.000000 -19.000008\nv 11.800005 -1.000000 -17.000008\nv 9.800005 -1.000000 -17.000008\nv 9.800005 -1.000000 -19.000008\nv 11.800005 1.000000 -19.000008\nv 11.800004 1.000000 -17.000008\nv 9.800005 1.000000 -17.000008\nv 9.800005 1.000000 -19.000008\nv 15.400006 -1.000000 -19.000008\nv 15.400006 -1.000000 -17.000008\nv 13.400006 -1.000000 -17.000008\nv 13.400006 -1.000000 -19.000008\nv 15.400007 1.000000 -19.000008\nv 15.400005 1.000000 -17.000008\nv 13.400006 1.000000 -17.000008\nv 13.400006 1.000000 -19.000008\nv 19.000008 -1.000000 -19.000008\nv 19.000008 -1.000000 -17.000008\nv 17.000008 -1.000000 -17.000008\nv 17.000008 -1.000000 -19.000008\nv 19.000008 1.000000 -19.000008\nv 19.000008 1.000000 -17.000008\nv 17.000008 1.000000 -17.000008\nv 17.000008 1.000000 -19.000008\nv 22.600010 -1.000000 -19.000008\nv 22.600010 -1.000000 -17.000008\nv 20.600010 -1.000000 -17.000008\nv 20.600010 -1.000000 -19.000008\nv 22.600010 1.000000 -19.000008\nv 22.600010 1.000000 -17.000008\nv 20.600010 1.000000 -17.000008\nv 20.600010 1.000000 -19.000008\nv 26.200012 -1.000000 -19.000008\nv 26.200012 -1.000000 -17.000008\nv 24.200012 -1.000000 -17.000008\nv 24.200012 -1.000000 -19.000008\nv 26.200012 1.000000 -19.000008\nv 26.200012 1.000000 -17.000008\nv 24.200012 1.000000 -17.000008\nv 24.200012 1.000000 -19.000008\nv 29.800014 -1.000000 -19.000008\nv 29.800014 -1.000000 -17.000008\nv 27.800014 -1.000000 -17.000008\nv 27.800014 -1.000000 -19.000008\nv 29.800014 1.000000 -19.000008\nv 29.800014 1.000000 -17.000008\nv 27.800014 1.000000 -17.000008\nv 27.800014 1.000000 -19.000008\nv 33.400017 -1.000000 -19.000008\nv 33.400017 -1.000000 -17.000008\nv 31.400017 -1.000000 -17.000008\nv 31.400017 -1.000000 -19.000008\nv 33.400017 1.000000 -19.000008\nv 33.400017 1.000000 -17.000008\nv 31.400017 1.000000 -17.000008\nv 31.400017 1.000000 -19.000008\nv 1.000000 -1.000000 -22.600010\nv 1.000000 -1.000000 -20.600010\nv -1.000000 -1.000000 -20.600010\nv -1.000000 -1.000000 -22.600010\nv 1.000000 1.000000 -22.600010\nv 0.999999 1.000000 -20.600010\nv -1.000000 1.000000 -20.600010\nv -1.000000 1.000000 -22.600010\nv 4.600001 -1.000000 -22.600010\nv 4.600001 -1.000000 -20.600010\nv 2.600001 -1.000000 -20.600010\nv 2.600002 -1.000000 -22.600010\nv 4.600002 1.000000 -22.600010\nv 4.600001 1.000000 -20.600010\nv 2.600001 1.000000 -20.600010\nv 2.600002 1.000000 -22.600010\nv 8.200003 -1.000000 -22.600010\nv 8.200003 -1.000000 -20.600010\nv 6.200003 -1.000000 -20.600010\nv 6.200004 -1.000000 -22.600010\nv 8.200004 1.000000 -22.600010\nv 8.200003 1.000000 -20.600010\nv 6.200003 1.000000 -20.600010\nv 6.200003 1.000000 -22.600010\nv 11.800005 -1.000000 -22.600010\nv 11.800005 -1.000000 -20.600010\nv 9.800005 -1.000000 -20.600010\nv 9.800005 -1.000000 -22.600010\nv 11.800005 1.000000 -22.600010\nv 11.800004 1.000000 -20.600010\nv 9.800005 1.000000 -20.600010\nv 9.800005 1.000000 -22.600010\nv 15.400006 -1.000000 -22.600010\nv 15.400006 -1.000000 -20.600010\nv 13.400006 -1.000000 -20.600010\nv 13.400006 -1.000000 -22.600010\nv 15.400007 1.000000 -22.600010\nv 15.400005 1.000000 -20.600010\nv 13.400006 1.000000 -20.600010\nv 13.400006 1.000000 -22.600010\nv 19.000008 -1.000000 -22.600010\nv 19.000008 -1.000000 -20.600010\nv 17.000008 -1.000000 -20.600010\nv 17.000008 -1.000000 -22.600010\nv 19.000008 1.000000 -22.600010\nv 19.000008 1.000000 -20.600010\nv 17.000008 1.000000 -20.600010\nv 17.000008 1.000000 -22.600010\nv 22.600010 -1.000000 -22.600010\nv 22.600010 -1.000000 -20.600010\nv 20.600010 -1.000000 -20.600010\nv 20.600010 -1.000000 -22.600010\nv 22.600010 1.000000 -22.600010\nv 22.600010 1.000000 -20.600010\nv 20.600010 1.000000 -20.600010\nv 20.600010 1.000000 -22.600010\nv 26.200012 -1.000000 -22.600010\nv 26.200012 -1.000000 -20.600010\nv 24.200012 -1.000000 -20.600010\nv 24.200012 -1.000000 -22.600010\nv 26.200012 1.000000 -22.600010\nv 26.200012 1.000000 -20.600010\nv 24.200012 1.000000 -20.600010\nv 24.200012 1.000000 -22.600010\nv 29.800014 -1.000000 -22.600010\nv 29.800014 -1.000000 -20.600010\nv 27.800014 -1.000000 -20.600010\nv 27.800014 -1.000000 -22.600010\nv 29.800014 1.000000 -22.600010\nv 29.800014 1.000000 -20.600010\nv 27.800014 1.000000 -20.600010\nv 27.800014 1.000000 -22.600010\nv 33.400017 -1.000000 -22.600010\nv 33.400017 -1.000000 -20.600010\nv 31.400017 -1.000000 -20.600010\nv 31.400017 -1.000000 -22.600010\nv 33.400017 1.000000 -22.600010\nv 33.400017 1.000000 -20.600010\nv 31.400017 1.000000 -20.600010\nv 31.400017 1.000000 -22.600010\nv 1.000000 -1.000000 -26.200012\nv 1.000000 -1.000000 -24.200012\nv -1.000000 -1.000000 -24.200012\nv -1.000000 -1.000000 -26.200012\nv 1.000000 1.000000 -26.200012\nv 0.999999 1.000000 -24.200012\nv -1.000000 1.000000 -24.200012\nv -1.000000 1.000000 -26.200012\nv 4.600001 -1.000000 -26.200012\nv 4.600001 -1.000000 -24.200012\nv 2.600001 -1.000000 -24.200012\nv 2.600002 -1.000000 -26.200012\nv 4.600002 1.000000 -26.200012\nv 4.600001 1.000000 -24.200012\nv 2.600001 1.000000 -24.200012\nv 2.600002 1.000000 -26.200012\nv 8.200003 -1.000000 -26.200012\nv 8.200003 -1.000000 -24.200012\nv 6.200003 -1.000000 -24.200012\nv 6.200004 -1.000000 -26.200012\nv 8.200004 1.000000 -26.200012\nv 8.200003 1.000000 -24.200012\nv 6.200003 1.000000 -24.200012\nv 6.200003 1.000000 -26.200012\nv 11.800005 -1.000000 -26.200012\nv 11.800005 -1.000000 -24.200012\nv 9.800005 -1.000000 -24.200012\nv 9.800005 -1.000000 -26.200012\nv 11.800005 1.000000 -26.200012\nv 11.800004 1.000000 -24.200012\nv 9.800005 1.000000 -24.200012\nv 9.800005 1.000000 -26.200012\nv 15.400006 -1.000000 -26.200012\nv 15.400006 -1.000000 -24.200012\nv 13.400006 -1.000000 -24.200012\nv 13.400006 -1.000000 -26.200012\nv 15.400007 1.000000 -26.200012\nv 15.400005 1.000000 -24.200012\nv 13.400006 1.000000 -24.200012\nv 13.400006 1.000000 -26.200012\nv 19.000008 -1.000000 -26.200012\nv 19.000008 -1.000000 -24.200012\nv 17.000008 -1.000000 -24.200012\nv 17.000008 -1.000000 -26.200012\nv 19.000008 1.000000 -26.200012\nv 19.000008 1.000000 -24.200012\nv 17.000008 1.000000 -24.200012\nv 17.000008 1.000000 -26.200012\nv 22.600010 -1.000000 -26.200012\nv 22.600010 -1.000000 -24.200012\nv 20.600010 -1.000000 -24.200012\nv 20.600010 -1.000000 -26.200012\nv 22.600010 1.000000 -26.200012\nv 22.600010 1.000000 -24.200012\nv 20.600010 1.000000 -24.200012\nv 20.600010 1.000000 -26.200012\nv 26.200012 -1.000000 -26.200012\nv 26.200012 -1.000000 -24.200012\nv 24.200012 -1.000000 -24.200012\nv 24.200012 -1.000000 -26.200012\nv 26.200012 1.000000 -26.200012\nv 26.200012 1.000000 -24.200012\nv 24.200012 1.000000 -24.200012\nv 24.200012 1.000000 -26.200012\nv 29.800014 -1.000000 -26.200012\nv 29.800014 -1.000000 -24.200012\nv 27.800014 -1.000000 -24.200012\nv 27.800014 -1.000000 -26.200012\nv 29.800014 1.000000 -26.200012\nv 29.800014 1.000000 -24.200012\nv 27.800014 1.000000 -24.200012\nv 27.800014 1.000000 -26.200012\nv 33.400017 -1.000000 -26.200012\nv 33.400017 -1.000000 -24.200012\nv 31.400017 -1.000000 -24.200012\nv 31.400017 -1.000000 -26.200012\nv 33.400017 1.000000 -26.200012\nv 33.400017 1.000000 -24.200012\nv 31.400017 1.000000 -24.200012\nv 31.400017 1.000000 -26.200012\nv 1.000000 -1.000000 -29.800014\nv 1.000000 -1.000000 -27.800014\nv -1.000000 -1.000000 -27.800014\nv -1.000000 -1.000000 -29.800014\nv 1.000000 1.000000 -29.800014\nv 0.999999 1.000000 -27.800014\nv -1.000000 1.000000 -27.800014\nv -1.000000 1.000000 -29.800014\nv 4.600001 -1.000000 -29.800014\nv 4.600001 -1.000000 -27.800014\nv 2.600001 -1.000000 -27.800014\nv 2.600002 -1.000000 -29.800014\nv 4.600002 1.000000 -29.800014\nv 4.600001 1.000000 -27.800014\nv 2.600001 1.000000 -27.800014\nv 2.600002 1.000000 -29.800014\nv 8.200003 -1.000000 -29.800014\nv 8.200003 -1.000000 -27.800014\nv 6.200003 -1.000000 -27.800014\nv 6.200004 -1.000000 -29.800014\nv 8.200004 1.000000 -29.800014\nv 8.200003 1.000000 -27.800014\nv 6.200003 1.000000 -27.800014\nv 6.200003 1.000000 -29.800014\nv 11.800005 -1.000000 -29.800014\nv 11.800005 -1.000000 -27.800014\nv 9.800005 -1.000000 -27.800014\nv 9.800005 -1.000000 -29.800014\nv 11.800005 1.000000 -29.800014\nv 11.800004 1.000000 -27.800014\nv 9.800005 1.000000 -27.800014\nv 9.800005 1.000000 -29.800014\nv 15.400006 -1.000000 -29.800014\nv 15.400006 -1.000000 -27.800014\nv 13.400006 -1.000000 -27.800014\nv 13.400006 -1.000000 -29.800014\nv 15.400007 1.000000 -29.800014\nv 15.400005 1.000000 -27.800014\nv 13.400006 1.000000 -27.800014\nv 13.400006 1.000000 -29.800014\nv 19.000008 -1.000000 -29.800014\nv 19.000008 -1.000000 -27.800014\nv 17.000008 -1.000000 -27.800014\nv 17.000008 -1.000000 -29.800014\nv 19.000008 1.000000 -29.800014\nv 19.000008 1.000000 -27.800014\nv 17.000008 1.000000 -27.800014\nv 17.000008 1.000000 -29.800014\nv 22.600010 -1.000000 -29.800014\nv 22.600010 -1.000000 -27.800014\nv 20.600010 -1.000000 -27.800014\nv 20.600010 -1.000000 -29.800014\nv 22.600010 1.000000 -29.800014\nv 22.600010 1.000000 -27.800014\nv 20.600010 1.000000 -27.800014\nv 20.600010 1.000000 -29.800014\nv 26.200012 -1.000000 -29.800014\nv 26.200012 -1.000000 -27.800014\nv 24.200012 -1.000000 -27.800014\nv 24.200012 -1.000000 -29.800014\nv 26.200012 1.000000 -29.800014\nv 26.200012 1.000000 -27.800014\nv 24.200012 1.000000 -27.800014\nv 24.200012 1.000000 -29.800014\nv 29.800014 -1.000000 -29.800014\nv 29.800014 -1.000000 -27.800014\nv 27.800014 -1.000000 -27.800014\nv 27.800014 -1.000000 -29.800014\nv 29.800014 1.000000 -29.800014\nv 29.800014 1.000000 -27.800014\nv 27.800014 1.000000 -27.800014\nv 27.800014 1.000000 -29.800014\nv 33.400017 -1.000000 -29.800014\nv 33.400017 -1.000000 -27.800014\nv 31.400017 -1.000000 -27.800014\nv 31.400017 -1.000000 -29.800014\nv 33.400017 1.000000 -29.800014\nv 33.400017 1.000000 -27.800014\nv 31.400017 1.000000 -27.800014\nv 31.400017 1.000000 -29.800014\nv 1.000000 -1.000000 -33.400017\nv 1.000000 -1.000000 -31.400017\nv -1.000000 -1.000000 -31.400017\nv -1.000000 -1.000000 -33.400017\nv 1.000000 1.000000 -33.400017\nv 0.999999 1.000000 -31.400017\nv -1.000000 1.000000 -31.400017\nv -1.000000 1.000000 -33.400017\nv 4.600001 -1.000000 -33.400017\nv 4.600001 -1.000000 -31.400017\nv 2.600001 -1.000000 -31.400017\nv 2.600002 -1.000000 -33.400017\nv 4.600002 1.000000 -33.400017\nv 4.600001 1.000000 -31.400017\nv 2.600001 1.000000 -31.400017\nv 2.600002 1.000000 -33.400017\nv 8.200003 -1.000000 -33.400017\nv 8.200003 -1.000000 -31.400017\nv 6.200003 -1.000000 -31.400017\nv 6.200004 -1.000000 -33.400017\nv 8.200004 1.000000 -33.400017\nv 8.200003 1.000000 -31.400017\nv 6.200003 1.000000 -31.400017\nv 6.200003 1.000000 -33.400017\nv 11.800005 -1.000000 -33.400017\nv 11.800005 -1.000000 -31.400017\nv 9.800005 -1.000000 -31.400017\nv 9.800005 -1.000000 -33.400017\nv 11.800005 1.000000 -33.400017\nv 11.800004 1.000000 -31.400017\nv 9.800005 1.000000 -31.400017\nv 9.800005 1.000000 -33.400017\nv 15.400006 -1.000000 -33.400017\nv 15.400006 -1.000000 -31.400017\nv 13.400006 -1.000000 -31.400017\nv 13.400006 -1.000000 -33.400017\nv 15.400007 1.000000 -33.400017\nv 15.400005 1.000000 -31.400017\nv 13.400006 1.000000 -31.400017\nv 13.400006 1.000000 -33.400017\nv 19.000008 -1.000000 -33.400017\nv 19.000008 -1.000000 -31.400017\nv 17.000008 -1.000000 -31.400017\nv 17.000008 -1.000000 -33.400017\nv 19.000008 1.000000 -33.400017\nv 19.000008 1.000000 -31.400017\nv 17.000008 1.000000 -31.400017\nv 17.000008 1.000000 -33.400017\nv 22.600010 -1.000000 -33.400017\nv 22.600010 -1.000000 -31.400017\nv 20.600010 -1.000000 -31.400017\nv 20.600010 -1.000000 -33.400017\nv 22.600010 1.000000 -33.400017\nv 22.600010 1.000000 -31.400017\nv 20.600010 1.000000 -31.400017\nv 20.600010 1.000000 -33.400017\nv 26.200012 -1.000000 -33.400017\nv 26.200012 -1.000000 -31.400017\nv 24.200012 -1.000000 -31.400017\nv 24.200012 -1.000000 -33.400017\nv 26.200012 1.000000 -33.400017\nv 26.200012 1.000000 -31.400017\nv 24.200012 1.000000 -31.400017\nv 24.200012 1.000000 -33.400017\nv 29.800014 -1.000000 -33.400017\nv 29.800014 -1.000000 -31.400017\nv 27.800014 -1.000000 -31.400017\nv 27.800014 -1.000000 -33.400017\nv 29.800014 1.000000 -33.400017\nv 29.800014 1.000000 -31.400017\nv 27.800014 1.000000 -31.400017\nv 27.800014 1.000000 -33.400017\nv 33.400017 -1.000000 -33.400017\nv 33.400017 -1.000000 -31.400017\nv 31.400017 -1.000000 -31.400017\nv 31.400017 -1.000000 -33.400017\nv 33.400017 1.000000 -33.400017\nv 33.400017 1.000000 -31.400017\nv 31.400017 1.000000 -31.400017\nv 31.400017 1.000000 -33.400017\nv -1.000000 -1.000000 -1.000000\nv -1.000000 -1.000000 1.000000\nv 1.000000 -1.000000 1.000000\nv 1.000000 -1.000000 -1.000000\nv -1.000000 1.000000 -0.999999\nv -0.999999 1.000000 1.000001\nv 1.000000 1.000000 1.000000\nv 1.000000 1.000000 -1.000000\nv -4.600001 -1.000000 -1.000000\nv -4.600001 -1.000000 1.000000\nv -2.600001 -1.000000 1.000000\nv -2.600002 -1.000000 -1.000000\nv -4.600002 1.000000 -0.999999\nv -4.600001 1.000000 1.000001\nv -2.600001 1.000000 1.000000\nv -2.600002 1.000000 -1.000000\nv -8.200003 -1.000000 -1.000000\nv -8.200003 -1.000000 1.000000\nv -6.200003 -1.000000 1.000000\nv -6.200004 -1.000000 -1.000000\nv -8.200004 1.000000 -0.999999\nv -8.200003 1.000000 1.000001\nv -6.200003 1.000000 1.000000\nv -6.200003 1.000000 -1.000000\nv -11.800005 -1.000000 -1.000000\nv -11.800005 -1.000000 1.000000\nv -9.800005 -1.000000 1.000000\nv -9.800005 -1.000000 -1.000000\nv -11.800005 1.000000 -0.999999\nv -11.800004 1.000000 1.000001\nv -9.800005 1.000000 1.000000\nv -9.800005 1.000000 -1.000000\nv -15.400006 -1.000000 -1.000000\nv -15.400006 -1.000000 1.000000\nv -13.400006 -1.000000 1.000000\nv -13.400006 -1.000000 -1.000000\nv -15.400007 1.000000 -0.999999\nv -15.400005 1.000000 1.000001\nv -13.400006 1.000000 1.000000\nv -13.400006 1.000000 -1.000000\nv -19.000008 -1.000000 -1.000000\nv -19.000008 -1.000000 1.000000\nv -17.000008 -1.000000 1.000000\nv -17.000008 -1.000000 -1.000000\nv -19.000008 1.000000 -0.999999\nv -19.000008 1.000000 1.000001\nv -17.000008 1.000000 1.000000\nv -17.000008 1.000000 -1.000000\nv -22.600010 -1.000000 -1.000000\nv -22.600010 -1.000000 1.000000\nv -20.600010 -1.000000 1.000000\nv -20.600010 -1.000000 -1.000000\nv -22.600010 1.000000 -0.999999\nv -22.600010 1.000000 1.000001\nv -20.600010 1.000000 1.000000\nv -20.600010 1.000000 -1.000000\nv -26.200012 -1.000000 -1.000000\nv -26.200012 -1.000000 1.000000\nv -24.200012 -1.000000 1.000000\nv -24.200012 -1.000000 -1.000000\nv -26.200012 1.000000 -0.999999\nv -26.200012 1.000000 1.000001\nv -24.200012 1.000000 1.000000\nv -24.200012 1.000000 -1.000000\nv -29.800014 -1.000000 -1.000000\nv -29.800014 -1.000000 1.000000\nv -27.800014 -1.000000 1.000000\nv -27.800014 -1.000000 -1.000000\nv -29.800014 1.000000 -0.999999\nv -29.800014 1.000000 1.000001\nv -27.800014 1.000000 1.000000\nv -27.800014 1.000000 -1.000000\nv -33.400017 -1.000000 -1.000000\nv -33.400017 -1.000000 1.000000\nv -31.400017 -1.000000 1.000000\nv -31.400017 -1.000000 -1.000000\nv -33.400017 1.000000 -0.999999\nv -33.400017 1.000000 1.000001\nv -31.400017 1.000000 1.000000\nv -31.400017 1.000000 -1.000000\nv -1.000000 -1.000000 -4.600001\nv -1.000000 -1.000000 -2.600002\nv 1.000000 -1.000000 -2.600002\nv 1.000000 -1.000000 -4.600002\nv -1.000000 1.000000 -4.600001\nv -0.999999 1.000000 -2.600001\nv 1.000000 1.000000 -2.600002\nv 1.000000 1.000000 -4.600001\nv -4.600001 -1.000000 -4.600001\nv -4.600001 -1.000000 -2.600002\nv -2.600001 -1.000000 -2.600002\nv -2.600002 -1.000000 -4.600002\nv -4.600002 1.000000 -4.600001\nv -4.600001 1.000000 -2.600001\nv -2.600001 1.000000 -2.600002\nv -2.600002 1.000000 -4.600001\nv -8.200003 -1.000000 -4.600001\nv -8.200003 -1.000000 -2.600002\nv -6.200003 -1.000000 -2.600002\nv -6.200004 -1.000000 -4.600002\nv -8.200004 1.000000 -4.600001\nv -8.200003 1.000000 -2.600001\nv -6.200003 1.000000 -2.600002\nv -6.200003 1.000000 -4.600001\nv -11.800005 -1.000000 -4.600001\nv -11.800005 -1.000000 -2.600002\nv -9.800005 -1.000000 -2.600002\nv -9.800005 -1.000000 -4.600002\nv -11.800005 1.000000 -4.600001\nv -11.800004 1.000000 -2.600001\nv -9.800005 1.000000 -2.600002\nv -9.800005 1.000000 -4.600001\nv -15.400006 -1.000000 -4.600001\nv -15.400006 -1.000000 -2.600002\nv -13.400006 -1.000000 -2.600002\nv -13.400006 -1.000000 -4.600002\nv -15.400007 1.000000 -4.600001\nv -15.400005 1.000000 -2.600001\nv -13.400006 1.000000 -2.600002\nv -13.400006 1.000000 -4.600001\nv -19.000008 -1.000000 -4.600001\nv -19.000008 -1.000000 -2.600002\nv -17.000008 -1.000000 -2.600002\nv -17.000008 -1.000000 -4.600002\nv -19.000008 1.000000 -4.600001\nv -19.000008 1.000000 -2.600001\nv -17.000008 1.000000 -2.600002\nv -17.000008 1.000000 -4.600001\nv -22.600010 -1.000000 -4.600001\nv -22.600010 -1.000000 -2.600002\nv -20.600010 -1.000000 -2.600002\nv -20.600010 -1.000000 -4.600002\nv -22.600010 1.000000 -4.600001\nv -22.600010 1.000000 -2.600001\nv -20.600010 1.000000 -2.600002\nv -20.600010 1.000000 -4.600001\nv -26.200012 -1.000000 -4.600001\nv -26.200012 -1.000000 -2.600002\nv -24.200012 -1.000000 -2.600002\nv -24.200012 -1.000000 -4.600002\nv -26.200012 1.000000 -4.600001\nv -26.200012 1.000000 -2.600001\nv -24.200012 1.000000 -2.600002\nv -24.200012 1.000000 -4.600001\nv -29.800014 -1.000000 -4.600001\nv -29.800014 -1.000000 -2.600002\nv -27.800014 -1.000000 -2.600002\nv -27.800014 -1.000000 -4.600002\nv -29.800014 1.000000 -4.600001\nv -29.800014 1.000000 -2.600001\nv -27.800014 1.000000 -2.600002\nv -27.800014 1.000000 -4.600001\nv -33.400017 -1.000000 -4.600001\nv -33.400017 -1.000000 -2.600002\nv -31.400017 -1.000000 -2.600002\nv -31.400017 -1.000000 -4.600002\nv -33.400017 1.000000 -4.600001\nv -33.400017 1.000000 -2.600001\nv -31.400017 1.000000 -2.600002\nv -31.400017 1.000000 -4.600001\nv -1.000000 -1.000000 -8.200003\nv -1.000000 -1.000000 -6.200003\nv 1.000000 -1.000000 -6.200003\nv 1.000000 -1.000000 -8.200004\nv -1.000000 1.000000 -8.200003\nv -0.999999 1.000000 -6.200003\nv 1.000000 1.000000 -6.200004\nv 1.000000 1.000000 -8.200003\nv -4.600001 -1.000000 -8.200003\nv -4.600001 -1.000000 -6.200003\nv -2.600001 -1.000000 -6.200003\nv -2.600002 -1.000000 -8.200004\nv -4.600002 1.000000 -8.200003\nv -4.600001 1.000000 -6.200003\nv -2.600001 1.000000 -6.200004\nv -2.600002 1.000000 -8.200003\nv -8.200003 -1.000000 -8.200003\nv -8.200003 -1.000000 -6.200003\nv -6.200003 -1.000000 -6.200003\nv -6.200004 -1.000000 -8.200004\nv -8.200004 1.000000 -8.200003\nv -8.200003 1.000000 -6.200003\nv -6.200003 1.000000 -6.200004\nv -6.200003 1.000000 -8.200003\nv -11.800005 -1.000000 -8.200003\nv -11.800005 -1.000000 -6.200003\nv -9.800005 -1.000000 -6.200003\nv -9.800005 -1.000000 -8.200004\nv -11.800005 1.000000 -8.200003\nv -11.800004 1.000000 -6.200003\nv -9.800005 1.000000 -6.200004\nv -9.800005 1.000000 -8.200003\nv -15.400006 -1.000000 -8.200003\nv -15.400006 -1.000000 -6.200003\nv -13.400006 -1.000000 -6.200003\nv -13.400006 -1.000000 -8.200004\nv -15.400007 1.000000 -8.200003\nv -15.400005 1.000000 -6.200003\nv -13.400006 1.000000 -6.200004\nv -13.400006 1.000000 -8.200003\nv -19.000008 -1.000000 -8.200003\nv -19.000008 -1.000000 -6.200003\nv -17.000008 -1.000000 -6.200003\nv -17.000008 -1.000000 -8.200004\nv -19.000008 1.000000 -8.200003\nv -19.000008 1.000000 -6.200003\nv -17.000008 1.000000 -6.200004\nv -17.000008 1.000000 -8.200003\nv -22.600010 -1.000000 -8.200003\nv -22.600010 -1.000000 -6.200003\nv -20.600010 -1.000000 -6.200003\nv -20.600010 -1.000000 -8.200004\nv -22.600010 1.000000 -8.200003\nv -22.600010 1.000000 -6.200003\nv -20.600010 1.000000 -6.200004\nv -20.600010 1.000000 -8.200003\nv -26.200012 -1.000000 -8.200003\nv -26.200012 -1.000000 -6.200003\nv -24.200012 -1.000000 -6.200003\nv -24.200012 -1.000000 -8.200004\nv -26.200012 1.000000 -8.200003\nv -26.200012 1.000000 -6.200003\nv -24.200012 1.000000 -6.200004\nv -24.200012 1.000000 -8.200003\nv -29.800014 -1.000000 -8.200003\nv -29.800014 -1.000000 -6.200003\nv -27.800014 -1.000000 -6.200003\nv -27.800014 -1.000000 -8.200004\nv -29.800014 1.000000 -8.200003\nv -29.800014 1.000000 -6.200003\nv -27.800014 1.000000 -6.200004\nv -27.800014 1.000000 -8.200003\nv -33.400017 -1.000000 -8.200003\nv -33.400017 -1.000000 -6.200003\nv -31.400017 -1.000000 -6.200003\nv -31.400017 -1.000000 -8.200004\nv -33.400017 1.000000 -8.200003\nv -33.400017 1.000000 -6.200003\nv -31.400017 1.000000 -6.200004\nv -31.400017 1.000000 -8.200003\nv -1.000000 -1.000000 -11.800005\nv -1.000000 -1.000000 -9.800005\nv 1.000000 -1.000000 -9.800005\nv 1.000000 -1.000000 -11.800005\nv -1.000000 1.000000 -11.800004\nv -0.999999 1.000000 -9.800004\nv 1.000000 1.000000 -9.800005\nv 1.000000 1.000000 -11.800005\nv -4.600001 -1.000000 -11.800005\nv -4.600001 -1.000000 -9.800005\nv -2.600001 -1.000000 -9.800005\nv -2.600002 -1.000000 -11.800005\nv -4.600002 1.000000 -11.800004\nv -4.600001 1.000000 -9.800004\nv -2.600001 1.000000 -9.800005\nv -2.600002 1.000000 -11.800005\nv -8.200003 -1.000000 -11.800005\nv -8.200003 -1.000000 -9.800005\nv -6.200003 -1.000000 -9.800005\nv -6.200004 -1.000000 -11.800005\nv -8.200004 1.000000 -11.800004\nv -8.200003 1.000000 -9.800004\nv -6.200003 1.000000 -9.800005\nv -6.200003 1.000000 -11.800005\nv -11.800005 -1.000000 -11.800005\nv -11.800005 -1.000000 -9.800005\nv -9.800005 -1.000000 -9.800005\nv -9.800005 -1.000000 -11.800005\nv -11.800005 1.000000 -11.800004\nv -11.800004 1.000000 -9.800004\nv -9.800005 1.000000 -9.800005\nv -9.800005 1.000000 -11.800005\nv -15.400006 -1.000000 -11.800005\nv -15.400006 -1.000000 -9.800005\nv -13.400006 -1.000000 -9.800005\nv -13.400006 -1.000000 -11.800005\nv -15.400007 1.000000 -11.800004\nv -15.400005 1.000000 -9.800004\nv -13.400006 1.000000 -9.800005\nv -13.400006 1.000000 -11.800005\nv -19.000008 -1.000000 -11.800005\nv -19.000008 -1.000000 -9.800005\nv -17.000008 -1.000000 -9.800005\nv -17.000008 -1.000000 -11.800005\nv -19.000008 1.000000 -11.800004\nv -19.000008 1.000000 -9.800004\nv -17.000008 1.000000 -9.800005\nv -17.000008 1.000000 -11.800005\nv -22.600010 -1.000000 -11.800005\nv -22.600010 -1.000000 -9.800005\nv -20.600010 -1.000000 -9.800005\nv -20.600010 -1.000000 -11.800005\nv -22.600010 1.000000 -11.800004\nv -22.600010 1.000000 -9.800004\nv -20.600010 1.000000 -9.800005\nv -20.600010 1.000000 -11.800005\nv -26.200012 -1.000000 -11.800005\nv -26.200012 -1.000000 -9.800005\nv -24.200012 -1.000000 -9.800005\nv -24.200012 -1.000000 -11.800005\nv -26.200012 1.000000 -11.800004\nv -26.200012 1.000000 -9.800004\nv -24.200012 1.000000 -9.800005\nv -24.200012 1.000000 -11.800005\nv -29.800014 -1.000000 -11.800005\nv -29.800014 -1.000000 -9.800005\nv -27.800014 -1.000000 -9.800005\nv -27.800014 -1.000000 -11.800005\nv -29.800014 1.000000 -11.800004\nv -29.800014 1.000000 -9.800004\nv -27.800014 1.000000 -9.800005\nv -27.800014 1.000000 -11.800005\nv -33.400017 -1.000000 -11.800005\nv -33.400017 -1.000000 -9.800005\nv -31.400017 -1.000000 -9.800005\nv -31.400017 -1.000000 -11.800005\nv -33.400017 1.000000 -11.800004\nv -33.400017 1.000000 -9.800004\nv -31.400017 1.000000 -9.800005\nv -31.400017 1.000000 -11.800005\nv -1.000000 -1.000000 -15.400006\nv -1.000000 -1.000000 -13.400006\nv 1.000000 -1.000000 -13.400006\nv 1.000000 -1.000000 -15.400006\nv -1.000000 1.000000 -15.400005\nv -0.999999 1.000000 -13.400005\nv 1.000000 1.000000 -13.400006\nv 1.000000 1.000000 -15.400006\nv -4.600001 -1.000000 -15.400006\nv -4.600001 -1.000000 -13.400006\nv -2.600001 -1.000000 -13.400006\nv -2.600002 -1.000000 -15.400006\nv -4.600002 1.000000 -15.400005\nv -4.600001 1.000000 -13.400005\nv -2.600001 1.000000 -13.400006\nv -2.600002 1.000000 -15.400006\nv -8.200003 -1.000000 -15.400006\nv -8.200003 -1.000000 -13.400006\nv -6.200003 -1.000000 -13.400006\nv -6.200004 -1.000000 -15.400006\nv -8.200004 1.000000 -15.400005\nv -8.200003 1.000000 -13.400005\nv -6.200003 1.000000 -13.400006\nv -6.200003 1.000000 -15.400006\nv -11.800005 -1.000000 -15.400006\nv -11.800005 -1.000000 -13.400006\nv -9.800005 -1.000000 -13.400006\nv -9.800005 -1.000000 -15.400006\nv -11.800005 1.000000 -15.400005\nv -11.800004 1.000000 -13.400005\nv -9.800005 1.000000 -13.400006\nv -9.800005 1.000000 -15.400006\nv -15.400006 -1.000000 -15.400006\nv -15.400006 -1.000000 -13.400006\nv -13.400006 -1.000000 -13.400006\nv -13.400006 -1.000000 -15.400006\nv -15.400007 1.000000 -15.400005\nv -15.400005 1.000000 -13.400005\nv -13.400006 1.000000 -13.400006\nv -13.400006 1.000000 -15.400006\nv -19.000008 -1.000000 -15.400006\nv -19.000008 -1.000000 -13.400006\nv -17.000008 -1.000000 -13.400006\nv -17.000008 -1.000000 -15.400006\nv -19.000008 1.000000 -15.400005\nv -19.000008 1.000000 -13.400005\nv -17.000008 1.000000 -13.400006\nv -17.000008 1.000000 -15.400006\nv -22.600010 -1.000000 -15.400006\nv -22.600010 -1.000000 -13.400006\nv -20.600010 -1.000000 -13.400006\nv -20.600010 -1.000000 -15.400006\nv -22.600010 1.000000 -15.400005\nv -22.600010 1.000000 -13.400005\nv -20.600010 1.000000 -13.400006\nv -20.600010 1.000000 -15.400006\nv -26.200012 -1.000000 -15.400006\nv -26.200012 -1.000000 -13.400006\nv -24.200012 -1.000000 -13.400006\nv -24.200012 -1.000000 -15.400006\nv -26.200012 1.000000 -15.400005\nv -26.200012 1.000000 -13.400005\nv -24.200012 1.000000 -13.400006\nv -24.200012 1.000000 -15.400006\nv -29.800014 -1.000000 -15.400006\nv -29.800014 -1.000000 -13.400006\nv -27.800014 -1.000000 -13.400006\nv -27.800014 -1.000000 -15.400006\nv -29.800014 1.000000 -15.400005\nv -29.800014 1.000000 -13.400005\nv -27.800014 1.000000 -13.400006\nv -27.800014 1.000000 -15.400006\nv -33.400017 -1.000000 -15.400006\nv -33.400017 -1.000000 -13.400006\nv -31.400017 -1.000000 -13.400006\nv -31.400017 -1.000000 -15.400006\nv -33.400017 1.000000 -15.400005\nv -33.400017 1.000000 -13.400005\nv -31.400017 1.000000 -13.400006\nv -31.400017 1.000000 -15.400006\nv -1.000000 -1.000000 -19.000008\nv -1.000000 -1.000000 -17.000008\nv 1.000000 -1.000000 -17.000008\nv 1.000000 -1.000000 -19.000008\nv -1.000000 1.000000 -19.000008\nv -0.999999 1.000000 -17.000008\nv 1.000000 1.000000 -17.000008\nv 1.000000 1.000000 -19.000008\nv -4.600001 -1.000000 -19.000008\nv -4.600001 -1.000000 -17.000008\nv -2.600001 -1.000000 -17.000008\nv -2.600002 -1.000000 -19.000008\nv -4.600002 1.000000 -19.000008\nv -4.600001 1.000000 -17.000008\nv -2.600001 1.000000 -17.000008\nv -2.600002 1.000000 -19.000008\nv -8.200003 -1.000000 -19.000008\nv -8.200003 -1.000000 -17.000008\nv -6.200003 -1.000000 -17.000008\nv -6.200004 -1.000000 -19.000008\nv -8.200004 1.000000 -19.000008\nv -8.200003 1.000000 -17.000008\nv -6.200003 1.000000 -17.000008\nv -6.200003 1.000000 -19.000008\nv -11.800005 -1.000000 -19.000008\nv -11.800005 -1.000000 -17.000008\nv -9.800005 -1.000000 -17.000008\nv -9.800005 -1.000000 -19.000008\nv -11.800005 1.000000 -19.000008\nv -11.800004 1.000000 -17.000008\nv -9.800005 1.000000 -17.000008\nv -9.800005 1.000000 -19.000008\nv -15.400006 -1.000000 -19.000008\nv -15.400006 -1.000000 -17.000008\nv -13.400006 -1.000000 -17.000008\nv -13.400006 -1.000000 -19.000008\nv -15.400007 1.000000 -19.000008\nv -15.400005 1.000000 -17.000008\nv -13.400006 1.000000 -17.000008\nv -13.400006 1.000000 -19.000008\nv -19.000008 -1.000000 -19.000008\nv -19.000008 -1.000000 -17.000008\nv -17.000008 -1.000000 -17.000008\nv -17.000008 -1.000000 -19.000008\nv -19.000008 1.000000 -19.000008\nv -19.000008 1.000000 -17.000008\nv -17.000008 1.000000 -17.000008\nv -17.000008 1.000000 -19.000008\nv -22.600010 -1.000000 -19.000008\nv -22.600010 -1.000000 -17.000008\nv -20.600010 -1.000000 -17.000008\nv -20.600010 -1.000000 -19.000008\nv -22.600010 1.000000 -19.000008\nv -22.600010 1.000000 -17.000008\nv -20.600010 1.000000 -17.000008\nv -20.600010 1.000000 -19.000008\nv -26.200012 -1.000000 -19.000008\nv -26.200012 -1.000000 -17.000008\nv -24.200012 -1.000000 -17.000008\nv -24.200012 -1.000000 -19.000008\nv -26.200012 1.000000 -19.000008\nv -26.200012 1.000000 -17.000008\nv -24.200012 1.000000 -17.000008\nv -24.200012 1.000000 -19.000008\nv -29.800014 -1.000000 -19.000008\nv -29.800014 -1.000000 -17.000008\nv -27.800014 -1.000000 -17.000008\nv -27.800014 -1.000000 -19.000008\nv -29.800014 1.000000 -19.000008\nv -29.800014 1.000000 -17.000008\nv -27.800014 1.000000 -17.000008\nv -27.800014 1.000000 -19.000008\nv -33.400017 -1.000000 -19.000008\nv -33.400017 -1.000000 -17.000008\nv -31.400017 -1.000000 -17.000008\nv -31.400017 -1.000000 -19.000008\nv -33.400017 1.000000 -19.000008\nv -33.400017 1.000000 -17.000008\nv -31.400017 1.000000 -17.000008\nv -31.400017 1.000000 -19.000008\nv -1.000000 -1.000000 -22.600010\nv -1.000000 -1.000000 -20.600010\nv 1.000000 -1.000000 -20.600010\nv 1.000000 -1.000000 -22.600010\nv -1.000000 1.000000 -22.600010\nv -0.999999 1.000000 -20.600010\nv 1.000000 1.000000 -20.600010\nv 1.000000 1.000000 -22.600010\nv -4.600001 -1.000000 -22.600010\nv -4.600001 -1.000000 -20.600010\nv -2.600001 -1.000000 -20.600010\nv -2.600002 -1.000000 -22.600010\nv -4.600002 1.000000 -22.600010\nv -4.600001 1.000000 -20.600010\nv -2.600001 1.000000 -20.600010\nv -2.600002 1.000000 -22.600010\nv -8.200003 -1.000000 -22.600010\nv -8.200003 -1.000000 -20.600010\nv -6.200003 -1.000000 -20.600010\nv -6.200004 -1.000000 -22.600010\nv -8.200004 1.000000 -22.600010\nv -8.200003 1.000000 -20.600010\nv -6.200003 1.000000 -20.600010\nv -6.200003 1.000000 -22.600010\nv -11.800005 -1.000000 -22.600010\nv -11.800005 -1.000000 -20.600010\nv -9.800005 -1.000000 -20.600010\nv -9.800005 -1.000000 -22.600010\nv -11.800005 1.000000 -22.600010\nv -11.800004 1.000000 -20.600010\nv -9.800005 1.000000 -20.600010\nv -9.800005 1.000000 -22.600010\nv -15.400006 -1.000000 -22.600010\nv -15.400006 -1.000000 -20.600010\nv -13.400006 -1.000000 -20.600010\nv -13.400006 -1.000000 -22.600010\nv -15.400007 1.000000 -22.600010\nv -15.400005 1.000000 -20.600010\nv -13.400006 1.000000 -20.600010\nv -13.400006 1.000000 -22.600010\nv -19.000008 -1.000000 -22.600010\nv -19.000008 -1.000000 -20.600010\nv -17.000008 -1.000000 -20.600010\nv -17.000008 -1.000000 -22.600010\nv -19.000008 1.000000 -22.600010\nv -19.000008 1.000000 -20.600010\nv -17.000008 1.000000 -20.600010\nv -17.000008 1.000000 -22.600010\nv -22.600010 -1.000000 -22.600010\nv -22.600010 -1.000000 -20.600010\nv -20.600010 -1.000000 -20.600010\nv -20.600010 -1.000000 -22.600010\nv -22.600010 1.000000 -22.600010\nv -22.600010 1.000000 -20.600010\nv -20.600010 1.000000 -20.600010\nv -20.600010 1.000000 -22.600010\nv -26.200012 -1.000000 -22.600010\nv -26.200012 -1.000000 -20.600010\nv -24.200012 -1.000000 -20.600010\nv -24.200012 -1.000000 -22.600010\nv -26.200012 1.000000 -22.600010\nv -26.200012 1.000000 -20.600010\nv -24.200012 1.000000 -20.600010\nv -24.200012 1.000000 -22.600010\nv -29.800014 -1.000000 -22.600010\nv -29.800014 -1.000000 -20.600010\nv -27.800014 -1.000000 -20.600010\nv -27.800014 -1.000000 -22.600010\nv -29.800014 1.000000 -22.600010\nv -29.800014 1.000000 -20.600010\nv -27.800014 1.000000 -20.600010\nv -27.800014 1.000000 -22.600010\nv -33.400017 -1.000000 -22.600010\nv -33.400017 -1.000000 -20.600010\nv -31.400017 -1.000000 -20.600010\nv -31.400017 -1.000000 -22.600010\nv -33.400017 1.000000 -22.600010\nv -33.400017 1.000000 -20.600010\nv -31.400017 1.000000 -20.600010\nv -31.400017 1.000000 -22.600010\nv -1.000000 -1.000000 -26.200012\nv -1.000000 -1.000000 -24.200012\nv 1.000000 -1.000000 -24.200012\nv 1.000000 -1.000000 -26.200012\nv -1.000000 1.000000 -26.200012\nv -0.999999 1.000000 -24.200012\nv 1.000000 1.000000 -24.200012\nv 1.000000 1.000000 -26.200012\nv -4.600001 -1.000000 -26.200012\nv -4.600001 -1.000000 -24.200012\nv -2.600001 -1.000000 -24.200012\nv -2.600002 -1.000000 -26.200012\nv -4.600002 1.000000 -26.200012\nv -4.600001 1.000000 -24.200012\nv -2.600001 1.000000 -24.200012\nv -2.600002 1.000000 -26.200012\nv -8.200003 -1.000000 -26.200012\nv -8.200003 -1.000000 -24.200012\nv -6.200003 -1.000000 -24.200012\nv -6.200004 -1.000000 -26.200012\nv -8.200004 1.000000 -26.200012\nv -8.200003 1.000000 -24.200012\nv -6.200003 1.000000 -24.200012\nv -6.200003 1.000000 -26.200012\nv -11.800005 -1.000000 -26.200012\nv -11.800005 -1.000000 -24.200012\nv -9.800005 -1.000000 -24.200012\nv -9.800005 -1.000000 -26.200012\nv -11.800005 1.000000 -26.200012\nv -11.800004 1.000000 -24.200012\nv -9.800005 1.000000 -24.200012\nv -9.800005 1.000000 -26.200012\nv -15.400006 -1.000000 -26.200012\nv -15.400006 -1.000000 -24.200012\nv -13.400006 -1.000000 -24.200012\nv -13.400006 -1.000000 -26.200012\nv -15.400007 1.000000 -26.200012\nv -15.400005 1.000000 -24.200012\nv -13.400006 1.000000 -24.200012\nv -13.400006 1.000000 -26.200012\nv -19.000008 -1.000000 -26.200012\nv -19.000008 -1.000000 -24.200012\nv -17.000008 -1.000000 -24.200012\nv -17.000008 -1.000000 -26.200012\nv -19.000008 1.000000 -26.200012\nv -19.000008 1.000000 -24.200012\nv -17.000008 1.000000 -24.200012\nv -17.000008 1.000000 -26.200012\nv -22.600010 -1.000000 -26.200012\nv -22.600010 -1.000000 -24.200012\nv -20.600010 -1.000000 -24.200012\nv -20.600010 -1.000000 -26.200012\nv -22.600010 1.000000 -26.200012\nv -22.600010 1.000000 -24.200012\nv -20.600010 1.000000 -24.200012\nv -20.600010 1.000000 -26.200012\nv -26.200012 -1.000000 -26.200012\nv -26.200012 -1.000000 -24.200012\nv -24.200012 -1.000000 -24.200012\nv -24.200012 -1.000000 -26.200012\nv -26.200012 1.000000 -26.200012\nv -26.200012 1.000000 -24.200012\nv -24.200012 1.000000 -24.200012\nv -24.200012 1.000000 -26.200012\nv -29.800014 -1.000000 -26.200012\nv -29.800014 -1.000000 -24.200012\nv -27.800014 -1.000000 -24.200012\nv -27.800014 -1.000000 -26.200012\nv -29.800014 1.000000 -26.200012\nv -29.800014 1.000000 -24.200012\nv -27.800014 1.000000 -24.200012\nv -27.800014 1.000000 -26.200012\nv -33.400017 -1.000000 -26.200012\nv -33.400017 -1.000000 -24.200012\nv -31.400017 -1.000000 -24.200012\nv -31.400017 -1.000000 -26.200012\nv -33.400017 1.000000 -26.200012\nv -33.400017 1.000000 -24.200012\nv -31.400017 1.000000 -24.200012\nv -31.400017 1.000000 -26.200012\nv -1.000000 -1.000000 -29.800014\nv -1.000000 -1.000000 -27.800014\nv 1.000000 -1.000000 -27.800014\nv 1.000000 -1.000000 -29.800014\nv -1.000000 1.000000 -29.800014\nv -0.999999 1.000000 -27.800014\nv 1.000000 1.000000 -27.800014\nv 1.000000 1.000000 -29.800014\nv -4.600001 -1.000000 -29.800014\nv -4.600001 -1.000000 -27.800014\nv -2.600001 -1.000000 -27.800014\nv -2.600002 -1.000000 -29.800014\nv -4.600002 1.000000 -29.800014\nv -4.600001 1.000000 -27.800014\nv -2.600001 1.000000 -27.800014\nv -2.600002 1.000000 -29.800014\nv -8.200003 -1.000000 -29.800014\nv -8.200003 -1.000000 -27.800014\nv -6.200003 -1.000000 -27.800014\nv -6.200004 -1.000000 -29.800014\nv -8.200004 1.000000 -29.800014\nv -8.200003 1.000000 -27.800014\nv -6.200003 1.000000 -27.800014\nv -6.200003 1.000000 -29.800014\nv -11.800005 -1.000000 -29.800014\nv -11.800005 -1.000000 -27.800014\nv -9.800005 -1.000000 -27.800014\nv -9.800005 -1.000000 -29.800014\nv -11.800005 1.000000 -29.800014\nv -11.800004 1.000000 -27.800014\nv -9.800005 1.000000 -27.800014\nv -9.800005 1.000000 -29.800014\nv -15.400006 -1.000000 -29.800014\nv -15.400006 -1.000000 -27.800014\nv -13.400006 -1.000000 -27.800014\nv -13.400006 -1.000000 -29.800014\nv -15.400007 1.000000 -29.800014\nv -15.400005 1.000000 -27.800014\nv -13.400006 1.000000 -27.800014\nv -13.400006 1.000000 -29.800014\nv -19.000008 -1.000000 -29.800014\nv -19.000008 -1.000000 -27.800014\nv -17.000008 -1.000000 -27.800014\nv -17.000008 -1.000000 -29.800014\nv -19.000008 1.000000 -29.800014\nv -19.000008 1.000000 -27.800014\nv -17.000008 1.000000 -27.800014\nv -17.000008 1.000000 -29.800014\nv -22.600010 -1.000000 -29.800014\nv -22.600010 -1.000000 -27.800014\nv -20.600010 -1.000000 -27.800014\nv -20.600010 -1.000000 -29.800014\nv -22.600010 1.000000 -29.800014\nv -22.600010 1.000000 -27.800014\nv -20.600010 1.000000 -27.800014\nv -20.600010 1.000000 -29.800014\nv -26.200012 -1.000000 -29.800014\nv -26.200012 -1.000000 -27.800014\nv -24.200012 -1.000000 -27.800014\nv -24.200012 -1.000000 -29.800014\nv -26.200012 1.000000 -29.800014\nv -26.200012 1.000000 -27.800014\nv -24.200012 1.000000 -27.800014\nv -24.200012 1.000000 -29.800014\nv -29.800014 -1.000000 -29.800014\nv -29.800014 -1.000000 -27.800014\nv -27.800014 -1.000000 -27.800014\nv -27.800014 -1.000000 -29.800014\nv -29.800014 1.000000 -29.800014\nv -29.800014 1.000000 -27.800014\nv -27.800014 1.000000 -27.800014\nv -27.800014 1.000000 -29.800014\nv -33.400017 -1.000000 -29.800014\nv -33.400017 -1.000000 -27.800014\nv -31.400017 -1.000000 -27.800014\nv -31.400017 -1.000000 -29.800014\nv -33.400017 1.000000 -29.800014\nv -33.400017 1.000000 -27.800014\nv -31.400017 1.000000 -27.800014\nv -31.400017 1.000000 -29.800014\nv -1.000000 -1.000000 -33.400017\nv -1.000000 -1.000000 -31.400017\nv 1.000000 -1.000000 -31.400017\nv 1.000000 -1.000000 -33.400017\nv -1.000000 1.000000 -33.400017\nv -0.999999 1.000000 -31.400017\nv 1.000000 1.000000 -31.400017\nv 1.000000 1.000000 -33.400017\nv -4.600001 -1.000000 -33.400017\nv -4.600001 -1.000000 -31.400017\nv -2.600001 -1.000000 -31.400017\nv -2.600002 -1.000000 -33.400017\nv -4.600002 1.000000 -33.400017\nv -4.600001 1.000000 -31.400017\nv -2.600001 1.000000 -31.400017\nv -2.600002 1.000000 -33.400017\nv -8.200003 -1.000000 -33.400017\nv -8.200003 -1.000000 -31.400017\nv -6.200003 -1.000000 -31.400017\nv -6.200004 -1.000000 -33.400017\nv -8.200004 1.000000 -33.400017\nv -8.200003 1.000000 -31.400017\nv -6.200003 1.000000 -31.400017\nv -6.200003 1.000000 -33.400017\nv -11.800005 -1.000000 -33.400017\nv -11.800005 -1.000000 -31.400017\nv -9.800005 -1.000000 -31.400017\nv -9.800005 -1.000000 -33.400017\nv -11.800005 1.000000 -33.400017\nv -11.800004 1.000000 -31.400017\nv -9.800005 1.000000 -31.400017\nv -9.800005 1.000000 -33.400017\nv -15.400006 -1.000000 -33.400017\nv -15.400006 -1.000000 -31.400017\nv -13.400006 -1.000000 -31.400017\nv -13.400006 -1.000000 -33.400017\nv -15.400007 1.000000 -33.400017\nv -15.400005 1.000000 -31.400017\nv -13.400006 1.000000 -31.400017\nv -13.400006 1.000000 -33.400017\nv -19.000008 -1.000000 -33.400017\nv -19.000008 -1.000000 -31.400017\nv -17.000008 -1.000000 -31.400017\nv -17.000008 -1.000000 -33.400017\nv -19.000008 1.000000 -33.400017\nv -19.000008 1.000000 -31.400017\nv -17.000008 1.000000 -31.400017\nv -17.000008 1.000000 -33.400017\nv -22.600010 -1.000000 -33.400017\nv -22.600010 -1.000000 -31.400017\nv -20.600010 -1.000000 -31.400017\nv -20.600010 -1.000000 -33.400017\nv -22.600010 1.000000 -33.400017\nv -22.600010 1.000000 -31.400017\nv -20.600010 1.000000 -31.400017\nv -20.600010 1.000000 -33.400017\nv -26.200012 -1.000000 -33.400017\nv -26.200012 -1.000000 -31.400017\nv -24.200012 -1.000000 -31.400017\nv -24.200012 -1.000000 -33.400017\nv -26.200012 1.000000 -33.400017\nv -26.200012 1.000000 -31.400017\nv -24.200012 1.000000 -31.400017\nv -24.200012 1.000000 -33.400017\nv -29.800014 -1.000000 -33.400017\nv -29.800014 -1.000000 -31.400017\nv -27.800014 -1.000000 -31.400017\nv -27.800014 -1.000000 -33.400017\nv -29.800014 1.000000 -33.400017\nv -29.800014 1.000000 -31.400017\nv -27.800014 1.000000 -31.400017\nv -27.800014 1.000000 -33.400017\nv -33.400017 -1.000000 -33.400017\nv -33.400017 -1.000000 -31.400017\nv -31.400017 -1.000000 -31.400017\nv -31.400017 -1.000000 -33.400017\nv -33.400017 1.000000 -33.400017\nv -33.400017 1.000000 -31.400017\nv -31.400017 1.000000 -31.400017\nv -31.400017 1.000000 -33.400017\nv 1.000000 2.600000 -1.000000\nv 1.000000 2.600000 1.000000\nv -1.000000 2.600000 1.000000\nv -1.000000 2.600000 -1.000000\nv 1.000000 4.600000 -0.999999\nv 0.999999 4.600000 1.000001\nv -1.000000 4.600000 1.000000\nv -1.000000 4.600000 -1.000000\nv 4.600001 2.600000 -1.000000\nv 4.600001 2.600000 1.000000\nv 2.600001 2.600000 1.000000\nv 2.600002 2.600000 -1.000000\nv 4.600002 4.600000 -0.999999\nv 4.600001 4.600000 1.000001\nv 2.600001 4.600000 1.000000\nv 2.600002 4.600000 -1.000000\nv 8.200003 2.600000 -1.000000\nv 8.200003 2.600000 1.000000\nv 6.200003 2.600000 1.000000\nv 6.200004 2.600000 -1.000000\nv 8.200004 4.600000 -0.999999\nv 8.200003 4.600000 1.000001\nv 6.200003 4.600000 1.000000\nv 6.200003 4.600000 -1.000000\nv 11.800005 2.600000 -1.000000\nv 11.800005 2.600000 1.000000\nv 9.800005 2.600000 1.000000\nv 9.800005 2.600000 -1.000000\nv 11.800005 4.600000 -0.999999\nv 11.800004 4.600000 1.000001\nv 9.800005 4.600000 1.000000\nv 9.800005 4.600000 -1.000000\nv 15.400006 2.600000 -1.000000\nv 15.400006 2.600000 1.000000\nv 13.400006 2.600000 1.000000\nv 13.400006 2.600000 -1.000000\nv 15.400007 4.600000 -0.999999\nv 15.400005 4.600000 1.000001\nv 13.400006 4.600000 1.000000\nv 13.400006 4.600000 -1.000000\nv 19.000008 2.600000 -1.000000\nv 19.000008 2.600000 1.000000\nv 17.000008 2.600000 1.000000\nv 17.000008 2.600000 -1.000000\nv 19.000008 4.600000 -0.999999\nv 19.000008 4.600000 1.000001\nv 17.000008 4.600000 1.000000\nv 17.000008 4.600000 -1.000000\nv 22.600010 2.600000 -1.000000\nv 22.600010 2.600000 1.000000\nv 20.600010 2.600000 1.000000\nv 20.600010 2.600000 -1.000000\nv 22.600010 4.600000 -0.999999\nv 22.600010 4.600000 1.000001\nv 20.600010 4.600000 1.000000\nv 20.600010 4.600000 -1.000000\nv 26.200012 2.600000 -1.000000\nv 26.200012 2.600000 1.000000\nv 24.200012 2.600000 1.000000\nv 24.200012 2.600000 -1.000000\nv 26.200012 4.600000 -0.999999\nv 26.200012 4.600000 1.000001\nv 24.200012 4.600000 1.000000\nv 24.200012 4.600000 -1.000000\nv 29.800014 2.600000 -1.000000\nv 29.800014 2.600000 1.000000\nv 27.800014 2.600000 1.000000\nv 27.800014 2.600000 -1.000000\nv 29.800014 4.600000 -0.999999\nv 29.800014 4.600000 1.000001\nv 27.800014 4.600000 1.000000\nv 27.800014 4.600000 -1.000000\nv 33.400017 2.600000 -1.000000\nv 33.400017 2.600000 1.000000\nv 31.400017 2.600000 1.000000\nv 31.400017 2.600000 -1.000000\nv 33.400017 4.600000 -0.999999\nv 33.400017 4.600000 1.000001\nv 31.400017 4.600000 1.000000\nv 31.400017 4.600000 -1.000000\nv 1.000000 2.600000 -4.600001\nv 1.000000 2.600000 -2.600002\nv -1.000000 2.600000 -2.600002\nv -1.000000 2.600000 -4.600002\nv 1.000000 4.600000 -4.600001\nv 0.999999 4.600000 -2.600001\nv -1.000000 4.600000 -2.600002\nv -1.000000 4.600000 -4.600001\nv 4.600001 2.600000 -4.600001\nv 4.600001 2.600000 -2.600002\nv 2.600001 2.600000 -2.600002\nv 2.600002 2.600000 -4.600002\nv 4.600002 4.600000 -4.600001\nv 4.600001 4.600000 -2.600001\nv 2.600001 4.600000 -2.600002\nv 2.600002 4.600000 -4.600001\nv 8.200003 2.600000 -4.600001\nv 8.200003 2.600000 -2.600002\nv 6.200003 2.600000 -2.600002\nv 6.200004 2.600000 -4.600002\nv 8.200004 4.600000 -4.600001\nv 8.200003 4.600000 -2.600001\nv 6.200003 4.600000 -2.600002\nv 6.200003 4.600000 -4.600001\nv 11.800005 2.600000 -4.600001\nv 11.800005 2.600000 -2.600002\nv 9.800005 2.600000 -2.600002\nv 9.800005 2.600000 -4.600002\nv 11.800005 4.600000 -4.600001\nv 11.800004 4.600000 -2.600001\nv 9.800005 4.600000 -2.600002\nv 9.800005 4.600000 -4.600001\nv 15.400006 2.600000 -4.600001\nv 15.400006 2.600000 -2.600002\nv 13.400006 2.600000 -2.600002\nv 13.400006 2.600000 -4.600002\nv 15.400007 4.600000 -4.600001\nv 15.400005 4.600000 -2.600001\nv 13.400006 4.600000 -2.600002\nv 13.400006 4.600000 -4.600001\nv 19.000008 2.600000 -4.600001\nv 19.000008 2.600000 -2.600002\nv 17.000008 2.600000 -2.600002\nv 17.000008 2.600000 -4.600002\nv 19.000008 4.600000 -4.600001\nv 19.000008 4.600000 -2.600001\nv 17.000008 4.600000 -2.600002\nv 17.000008 4.600000 -4.600001\nv 22.600010 2.600000 -4.600001\nv 22.600010 2.600000 -2.600002\nv 20.600010 2.600000 -2.600002\nv 20.600010 2.600000 -4.600002\nv 22.600010 4.600000 -4.600001\nv 22.600010 4.600000 -2.600001\nv 20.600010 4.600000 -2.600002\nv 20.600010 4.600000 -4.600001\nv 26.200012 2.600000 -4.600001\nv 26.200012 2.600000 -2.600002\nv 24.200012 2.600000 -2.600002\nv 24.200012 2.600000 -4.600002\nv 26.200012 4.600000 -4.600001\nv 26.200012 4.600000 -2.600001\nv 24.200012 4.600000 -2.600002\nv 24.200012 4.600000 -4.600001\nv 29.800014 2.600000 -4.600001\nv 29.800014 2.600000 -2.600002\nv 27.800014 2.600000 -2.600002\nv 27.800014 2.600000 -4.600002\nv 29.800014 4.600000 -4.600001\nv 29.800014 4.600000 -2.600001\nv 27.800014 4.600000 -2.600002\nv 27.800014 4.600000 -4.600001\nv 33.400017 2.600000 -4.600001\nv 33.400017 2.600000 -2.600002\nv 31.400017 2.600000 -2.600002\nv 31.400017 2.600000 -4.600002\nv 33.400017 4.600000 -4.600001\nv 33.400017 4.600000 -2.600001\nv 31.400017 4.600000 -2.600002\nv 31.400017 4.600000 -4.600001\nv 1.000000 2.600000 -8.200003\nv 1.000000 2.600000 -6.200003\nv -1.000000 2.600000 -6.200003\nv -1.000000 2.600000 -8.200004\nv 1.000000 4.600000 -8.200003\nv 0.999999 4.600000 -6.200003\nv -1.000000 4.600000 -6.200004\nv -1.000000 4.600000 -8.200003\nv 4.600001 2.600000 -8.200003\nv 4.600001 2.600000 -6.200003\nv 2.600001 2.600000 -6.200003\nv 2.600002 2.600000 -8.200004\nv 4.600002 4.600000 -8.200003\nv 4.600001 4.600000 -6.200003\nv 2.600001 4.600000 -6.200004\nv 2.600002 4.600000 -8.200003\nv 8.200003 2.600000 -8.200003\nv 8.200003 2.600000 -6.200003\nv 6.200003 2.600000 -6.200003\nv 6.200004 2.600000 -8.200004\nv 8.200004 4.600000 -8.200003\nv 8.200003 4.600000 -6.200003\nv 6.200003 4.600000 -6.200004\nv 6.200003 4.600000 -8.200003\nv 11.800005 2.600000 -8.200003\nv 11.800005 2.600000 -6.200003\nv 9.800005 2.600000 -6.200003\nv 9.800005 2.600000 -8.200004\nv 11.800005 4.600000 -8.200003\nv 11.800004 4.600000 -6.200003\nv 9.800005 4.600000 -6.200004\nv 9.800005 4.600000 -8.200003\nv 15.400006 2.600000 -8.200003\nv 15.400006 2.600000 -6.200003\nv 13.400006 2.600000 -6.200003\nv 13.400006 2.600000 -8.200004\nv 15.400007 4.600000 -8.200003\nv 15.400005 4.600000 -6.200003\nv 13.400006 4.600000 -6.200004\nv 13.400006 4.600000 -8.200003\nv 19.000008 2.600000 -8.200003\nv 19.000008 2.600000 -6.200003\nv 17.000008 2.600000 -6.200003\nv 17.000008 2.600000 -8.200004\nv 19.000008 4.600000 -8.200003\nv 19.000008 4.600000 -6.200003\nv 17.000008 4.600000 -6.200004\nv 17.000008 4.600000 -8.200003\nv 22.600010 2.600000 -8.200003\nv 22.600010 2.600000 -6.200003\nv 20.600010 2.600000 -6.200003\nv 20.600010 2.600000 -8.200004\nv 22.600010 4.600000 -8.200003\nv 22.600010 4.600000 -6.200003\nv 20.600010 4.600000 -6.200004\nv 20.600010 4.600000 -8.200003\nv 26.200012 2.600000 -8.200003\nv 26.200012 2.600000 -6.200003\nv 24.200012 2.600000 -6.200003\nv 24.200012 2.600000 -8.200004\nv 26.200012 4.600000 -8.200003\nv 26.200012 4.600000 -6.200003\nv 24.200012 4.600000 -6.200004\nv 24.200012 4.600000 -8.200003\nv 29.800014 2.600000 -8.200003\nv 29.800014 2.600000 -6.200003\nv 27.800014 2.600000 -6.200003\nv 27.800014 2.600000 -8.200004\nv 29.800014 4.600000 -8.200003\nv 29.800014 4.600000 -6.200003\nv 27.800014 4.600000 -6.200004\nv 27.800014 4.600000 -8.200003\nv 33.400017 2.600000 -8.200003\nv 33.400017 2.600000 -6.200003\nv 31.400017 2.600000 -6.200003\nv 31.400017 2.600000 -8.200004\nv 33.400017 4.600000 -8.200003\nv 33.400017 4.600000 -6.200003\nv 31.400017 4.600000 -6.200004\nv 31.400017 4.600000 -8.200003\nv 1.000000 2.600000 -11.800005\nv 1.000000 2.600000 -9.800005\nv -1.000000 2.600000 -9.800005\nv -1.000000 2.600000 -11.800005\nv 1.000000 4.600000 -11.800004\nv 0.999999 4.600000 -9.800004\nv -1.000000 4.600000 -9.800005\nv -1.000000 4.600000 -11.800005\nv 4.600001 2.600000 -11.800005\nv 4.600001 2.600000 -9.800005\nv 2.600001 2.600000 -9.800005\nv 2.600002 2.600000 -11.800005\nv 4.600002 4.600000 -11.800004\nv 4.600001 4.600000 -9.800004\nv 2.600001 4.600000 -9.800005\nv 2.600002 4.600000 -11.800005\nv 8.200003 2.600000 -11.800005\nv 8.200003 2.600000 -9.800005\nv 6.200003 2.600000 -9.800005\nv 6.200004 2.600000 -11.800005\nv 8.200004 4.600000 -11.800004\nv 8.200003 4.600000 -9.800004\nv 6.200003 4.600000 -9.800005\nv 6.200003 4.600000 -11.800005\nv 11.800005 2.600000 -11.800005\nv 11.800005 2.600000 -9.800005\nv 9.800005 2.600000 -9.800005\nv 9.800005 2.600000 -11.800005\nv 11.800005 4.600000 -11.800004\nv 11.800004 4.600000 -9.800004\nv 9.800005 4.600000 -9.800005\nv 9.800005 4.600000 -11.800005\nv 15.400006 2.600000 -11.800005\nv 15.400006 2.600000 -9.800005\nv 13.400006 2.600000 -9.800005\nv 13.400006 2.600000 -11.800005\nv 15.400007 4.600000 -11.800004\nv 15.400005 4.600000 -9.800004\nv 13.400006 4.600000 -9.800005\nv 13.400006 4.600000 -11.800005\nv 19.000008 2.600000 -11.800005\nv 19.000008 2.600000 -9.800005\nv 17.000008 2.600000 -9.800005\nv 17.000008 2.600000 -11.800005\nv 19.000008 4.600000 -11.800004\nv 19.000008 4.600000 -9.800004\nv 17.000008 4.600000 -9.800005\nv 17.000008 4.600000 -11.800005\nv 22.600010 2.600000 -11.800005\nv 22.600010 2.600000 -9.800005\nv 20.600010 2.600000 -9.800005\nv 20.600010 2.600000 -11.800005\nv 22.600010 4.600000 -11.800004\nv 22.600010 4.600000 -9.800004\nv 20.600010 4.600000 -9.800005\nv 20.600010 4.600000 -11.800005\nv 26.200012 2.600000 -11.800005\nv 26.200012 2.600000 -9.800005\nv 24.200012 2.600000 -9.800005\nv 24.200012 2.600000 -11.800005\nv 26.200012 4.600000 -11.800004\nv 26.200012 4.600000 -9.800004\nv 24.200012 4.600000 -9.800005\nv 24.200012 4.600000 -11.800005\nv 29.800014 2.600000 -11.800005\nv 29.800014 2.600000 -9.800005\nv 27.800014 2.600000 -9.800005\nv 27.800014 2.600000 -11.800005\nv 29.800014 4.600000 -11.800004\nv 29.800014 4.600000 -9.800004\nv 27.800014 4.600000 -9.800005\nv 27.800014 4.600000 -11.800005\nv 33.400017 2.600000 -11.800005\nv 33.400017 2.600000 -9.800005\nv 31.400017 2.600000 -9.800005\nv 31.400017 2.600000 -11.800005\nv 33.400017 4.600000 -11.800004\nv 33.400017 4.600000 -9.800004\nv 31.400017 4.600000 -9.800005\nv 31.400017 4.600000 -11.800005\nv 1.000000 2.600000 -15.400006\nv 1.000000 2.600000 -13.400006\nv -1.000000 2.600000 -13.400006\nv -1.000000 2.600000 -15.400006\nv 1.000000 4.600000 -15.400005\nv 0.999999 4.600000 -13.400005\nv -1.000000 4.600000 -13.400006\nv -1.000000 4.600000 -15.400006\nv 4.600001 2.600000 -15.400006\nv 4.600001 2.600000 -13.400006\nv 2.600001 2.600000 -13.400006\nv 2.600002 2.600000 -15.400006\nv 4.600002 4.600000 -15.400005\nv 4.600001 4.600000 -13.400005\nv 2.600001 4.600000 -13.400006\nv 2.600002 4.600000 -15.400006\nv 8.200003 2.600000 -15.400006\nv 8.200003 2.600000 -13.400006\nv 6.200003 2.600000 -13.400006\nv 6.200004 2.600000 -15.400006\nv 8.200004 4.600000 -15.400005\nv 8.200003 4.600000 -13.400005\nv 6.200003 4.600000 -13.400006\nv 6.200003 4.600000 -15.400006\nv 11.800005 2.600000 -15.400006\nv 11.800005 2.600000 -13.400006\nv 9.800005 2.600000 -13.400006\nv 9.800005 2.600000 -15.400006\nv 11.800005 4.600000 -15.400005\nv 11.800004 4.600000 -13.400005\nv 9.800005 4.600000 -13.400006\nv 9.800005 4.600000 -15.400006\nv 15.400006 2.600000 -15.400006\nv 15.400006 2.600000 -13.400006\nv 13.400006 2.600000 -13.400006\nv 13.400006 2.600000 -15.400006\nv 15.400007 4.600000 -15.400005\nv 15.400005 4.600000 -13.400005\nv 13.400006 4.600000 -13.400006\nv 13.400006 4.600000 -15.400006\nv 19.000008 2.600000 -15.400006\nv 19.000008 2.600000 -13.400006\nv 17.000008 2.600000 -13.400006\nv 17.000008 2.600000 -15.400006\nv 19.000008 4.600000 -15.400005\nv 19.000008 4.600000 -13.400005\nv 17.000008 4.600000 -13.400006\nv 17.000008 4.600000 -15.400006\nv 22.600010 2.600000 -15.400006\nv 22.600010 2.600000 -13.400006\nv 20.600010 2.600000 -13.400006\nv 20.600010 2.600000 -15.400006\nv 22.600010 4.600000 -15.400005\nv 22.600010 4.600000 -13.400005\nv 20.600010 4.600000 -13.400006\nv 20.600010 4.600000 -15.400006\nv 26.200012 2.600000 -15.400006\nv 26.200012 2.600000 -13.400006\nv 24.200012 2.600000 -13.400006\nv 24.200012 2.600000 -15.400006\nv 26.200012 4.600000 -15.400005\nv 26.200012 4.600000 -13.400005\nv 24.200012 4.600000 -13.400006\nv 24.200012 4.600000 -15.400006\nv 29.800014 2.600000 -15.400006\nv 29.800014 2.600000 -13.400006\nv 27.800014 2.600000 -13.400006\nv 27.800014 2.600000 -15.400006\nv 29.800014 4.600000 -15.400005\nv 29.800014 4.600000 -13.400005\nv 27.800014 4.600000 -13.400006\nv 27.800014 4.600000 -15.400006\nv 33.400017 2.600000 -15.400006\nv 33.400017 2.600000 -13.400006\nv 31.400017 2.600000 -13.400006\nv 31.400017 2.600000 -15.400006\nv 33.400017 4.600000 -15.400005\nv 33.400017 4.600000 -13.400005\nv 31.400017 4.600000 -13.400006\nv 31.400017 4.600000 -15.400006\nv 1.000000 2.600000 -19.000008\nv 1.000000 2.600000 -17.000008\nv -1.000000 2.600000 -17.000008\nv -1.000000 2.600000 -19.000008\nv 1.000000 4.600000 -19.000008\nv 0.999999 4.600000 -17.000008\nv -1.000000 4.600000 -17.000008\nv -1.000000 4.600000 -19.000008\nv 4.600001 2.600000 -19.000008\nv 4.600001 2.600000 -17.000008\nv 2.600001 2.600000 -17.000008\nv 2.600002 2.600000 -19.000008\nv 4.600002 4.600000 -19.000008\nv 4.600001 4.600000 -17.000008\nv 2.600001 4.600000 -17.000008\nv 2.600002 4.600000 -19.000008\nv 8.200003 2.600000 -19.000008\nv 8.200003 2.600000 -17.000008\nv 6.200003 2.600000 -17.000008\nv 6.200004 2.600000 -19.000008\nv 8.200004 4.600000 -19.000008\nv 8.200003 4.600000 -17.000008\nv 6.200003 4.600000 -17.000008\nv 6.200003 4.600000 -19.000008\nv 11.800005 2.600000 -19.000008\nv 11.800005 2.600000 -17.000008\nv 9.800005 2.600000 -17.000008\nv 9.800005 2.600000 -19.000008\nv 11.800005 4.600000 -19.000008\nv 11.800004 4.600000 -17.000008\nv 9.800005 4.600000 -17.000008\nv 9.800005 4.600000 -19.000008\nv 15.400006 2.600000 -19.000008\nv 15.400006 2.600000 -17.000008\nv 13.400006 2.600000 -17.000008\nv 13.400006 2.600000 -19.000008\nv 15.400007 4.600000 -19.000008\nv 15.400005 4.600000 -17.000008\nv 13.400006 4.600000 -17.000008\nv 13.400006 4.600000 -19.000008\nv 19.000008 2.600000 -19.000008\nv 19.000008 2.600000 -17.000008\nv 17.000008 2.600000 -17.000008\nv 17.000008 2.600000 -19.000008\nv 19.000008 4.600000 -19.000008\nv 19.000008 4.600000 -17.000008\nv 17.000008 4.600000 -17.000008\nv 17.000008 4.600000 -19.000008\nv 22.600010 2.600000 -19.000008\nv 22.600010 2.600000 -17.000008\nv 20.600010 2.600000 -17.000008\nv 20.600010 2.600000 -19.000008\nv 22.600010 4.600000 -19.000008\nv 22.600010 4.600000 -17.000008\nv 20.600010 4.600000 -17.000008\nv 20.600010 4.600000 -19.000008\nv 26.200012 2.600000 -19.000008\nv 26.200012 2.600000 -17.000008\nv 24.200012 2.600000 -17.000008\nv 24.200012 2.600000 -19.000008\nv 26.200012 4.600000 -19.000008\nv 26.200012 4.600000 -17.000008\nv 24.200012 4.600000 -17.000008\nv 24.200012 4.600000 -19.000008\nv 29.800014 2.600000 -19.000008\nv 29.800014 2.600000 -17.000008\nv 27.800014 2.600000 -17.000008\nv 27.800014 2.600000 -19.000008\nv 29.800014 4.600000 -19.000008\nv 29.800014 4.600000 -17.000008\nv 27.800014 4.600000 -17.000008\nv 27.800014 4.600000 -19.000008\nv 33.400017 2.600000 -19.000008\nv 33.400017 2.600000 -17.000008\nv 31.400017 2.600000 -17.000008\nv 31.400017 2.600000 -19.000008\nv 33.400017 4.600000 -19.000008\nv 33.400017 4.600000 -17.000008\nv 31.400017 4.600000 -17.000008\nv 31.400017 4.600000 -19.000008\nv 1.000000 2.600000 -22.600010\nv 1.000000 2.600000 -20.600010\nv -1.000000 2.600000 -20.600010\nv -1.000000 2.600000 -22.600010\nv 1.000000 4.600000 -22.600010\nv 0.999999 4.600000 -20.600010\nv -1.000000 4.600000 -20.600010\nv -1.000000 4.600000 -22.600010\nv 4.600001 2.600000 -22.600010\nv 4.600001 2.600000 -20.600010\nv 2.600001 2.600000 -20.600010\nv 2.600002 2.600000 -22.600010\nv 4.600002 4.600000 -22.600010\nv 4.600001 4.600000 -20.600010\nv 2.600001 4.600000 -20.600010\nv 2.600002 4.600000 -22.600010\nv 8.200003 2.600000 -22.600010\nv 8.200003 2.600000 -20.600010\nv 6.200003 2.600000 -20.600010\nv 6.200004 2.600000 -22.600010\nv 8.200004 4.600000 -22.600010\nv 8.200003 4.600000 -20.600010\nv 6.200003 4.600000 -20.600010\nv 6.200003 4.600000 -22.600010\nv 11.800005 2.600000 -22.600010\nv 11.800005 2.600000 -20.600010\nv 9.800005 2.600000 -20.600010\nv 9.800005 2.600000 -22.600010\nv 11.800005 4.600000 -22.600010\nv 11.800004 4.600000 -20.600010\nv 9.800005 4.600000 -20.600010\nv 9.800005 4.600000 -22.600010\nv 15.400006 2.600000 -22.600010\nv 15.400006 2.600000 -20.600010\nv 13.400006 2.600000 -20.600010\nv 13.400006 2.600000 -22.600010\nv 15.400007 4.600000 -22.600010\nv 15.400005 4.600000 -20.600010\nv 13.400006 4.600000 -20.600010\nv 13.400006 4.600000 -22.600010\nv 19.000008 2.600000 -22.600010\nv 19.000008 2.600000 -20.600010\nv 17.000008 2.600000 -20.600010\nv 17.000008 2.600000 -22.600010\nv 19.000008 4.600000 -22.600010\nv 19.000008 4.600000 -20.600010\nv 17.000008 4.600000 -20.600010\nv 17.000008 4.600000 -22.600010\nv 22.600010 2.600000 -22.600010\nv 22.600010 2.600000 -20.600010\nv 20.600010 2.600000 -20.600010\nv 20.600010 2.600000 -22.600010\nv 22.600010 4.600000 -22.600010\nv 22.600010 4.600000 -20.600010\nv 20.600010 4.600000 -20.600010\nv 20.600010 4.600000 -22.600010\nv 26.200012 2.600000 -22.600010\nv 26.200012 2.600000 -20.600010\nv 24.200012 2.600000 -20.600010\nv 24.200012 2.600000 -22.600010\nv 26.200012 4.600000 -22.600010\nv 26.200012 4.600000 -20.600010\nv 24.200012 4.600000 -20.600010\nv 24.200012 4.600000 -22.600010\nv 29.800014 2.600000 -22.600010\nv 29.800014 2.600000 -20.600010\nv 27.800014 2.600000 -20.600010\nv 27.800014 2.600000 -22.600010\nv 29.800014 4.600000 -22.600010\nv 29.800014 4.600000 -20.600010\nv 27.800014 4.600000 -20.600010\nv 27.800014 4.600000 -22.600010\nv 33.400017 2.600000 -22.600010\nv 33.400017 2.600000 -20.600010\nv 31.400017 2.600000 -20.600010\nv 31.400017 2.600000 -22.600010\nv 33.400017 4.600000 -22.600010\nv 33.400017 4.600000 -20.600010\nv 31.400017 4.600000 -20.600010\nv 31.400017 4.600000 -22.600010\nv 1.000000 2.600000 -26.200012\nv 1.000000 2.600000 -24.200012\nv -1.000000 2.600000 -24.200012\nv -1.000000 2.600000 -26.200012\nv 1.000000 4.600000 -26.200012\nv 0.999999 4.600000 -24.200012\nv -1.000000 4.600000 -24.200012\nv -1.000000 4.600000 -26.200012\nv 4.600001 2.600000 -26.200012\nv 4.600001 2.600000 -24.200012\nv 2.600001 2.600000 -24.200012\nv 2.600002 2.600000 -26.200012\nv 4.600002 4.600000 -26.200012\nv 4.600001 4.600000 -24.200012\nv 2.600001 4.600000 -24.200012\nv 2.600002 4.600000 -26.200012\nv 8.200003 2.600000 -26.200012\nv 8.200003 2.600000 -24.200012\nv 6.200003 2.600000 -24.200012\nv 6.200004 2.600000 -26.200012\nv 8.200004 4.600000 -26.200012\nv 8.200003 4.600000 -24.200012\nv 6.200003 4.600000 -24.200012\nv 6.200003 4.600000 -26.200012\nv 11.800005 2.600000 -26.200012\nv 11.800005 2.600000 -24.200012\nv 9.800005 2.600000 -24.200012\nv 9.800005 2.600000 -26.200012\nv 11.800005 4.600000 -26.200012\nv 11.800004 4.600000 -24.200012\nv 9.800005 4.600000 -24.200012\nv 9.800005 4.600000 -26.200012\nv 15.400006 2.600000 -26.200012\nv 15.400006 2.600000 -24.200012\nv 13.400006 2.600000 -24.200012\nv 13.400006 2.600000 -26.200012\nv 15.400007 4.600000 -26.200012\nv 15.400005 4.600000 -24.200012\nv 13.400006 4.600000 -24.200012\nv 13.400006 4.600000 -26.200012\nv 19.000008 2.600000 -26.200012\nv 19.000008 2.600000 -24.200012\nv 17.000008 2.600000 -24.200012\nv 17.000008 2.600000 -26.200012\nv 19.000008 4.600000 -26.200012\nv 19.000008 4.600000 -24.200012\nv 17.000008 4.600000 -24.200012\nv 17.000008 4.600000 -26.200012\nv 22.600010 2.600000 -26.200012\nv 22.600010 2.600000 -24.200012\nv 20.600010 2.600000 -24.200012\nv 20.600010 2.600000 -26.200012\nv 22.600010 4.600000 -26.200012\nv 22.600010 4.600000 -24.200012\nv 20.600010 4.600000 -24.200012\nv 20.600010 4.600000 -26.200012\nv 26.200012 2.600000 -26.200012\nv 26.200012 2.600000 -24.200012\nv 24.200012 2.600000 -24.200012\nv 24.200012 2.600000 -26.200012\nv 26.200012 4.600000 -26.200012\nv 26.200012 4.600000 -24.200012\nv 24.200012 4.600000 -24.200012\nv 24.200012 4.600000 -26.200012\nv 29.800014 2.600000 -26.200012\nv 29.800014 2.600000 -24.200012\nv 27.800014 2.600000 -24.200012\nv 27.800014 2.600000 -26.200012\nv 29.800014 4.600000 -26.200012\nv 29.800014 4.600000 -24.200012\nv 27.800014 4.600000 -24.200012\nv 27.800014 4.600000 -26.200012\nv 33.400017 2.600000 -26.200012\nv 33.400017 2.600000 -24.200012\nv 31.400017 2.600000 -24.200012\nv 31.400017 2.600000 -26.200012\nv 33.400017 4.600000 -26.200012\nv 33.400017 4.600000 -24.200012\nv 31.400017 4.600000 -24.200012\nv 31.400017 4.600000 -26.200012\nv 1.000000 2.600000 -29.800014\nv 1.000000 2.600000 -27.800014\nv -1.000000 2.600000 -27.800014\nv -1.000000 2.600000 -29.800014\nv 1.000000 4.600000 -29.800014\nv 0.999999 4.600000 -27.800014\nv -1.000000 4.600000 -27.800014\nv -1.000000 4.600000 -29.800014\nv 4.600001 2.600000 -29.800014\nv 4.600001 2.600000 -27.800014\nv 2.600001 2.600000 -27.800014\nv 2.600002 2.600000 -29.800014\nv 4.600002 4.600000 -29.800014\nv 4.600001 4.600000 -27.800014\nv 2.600001 4.600000 -27.800014\nv 2.600002 4.600000 -29.800014\nv 8.200003 2.600000 -29.800014\nv 8.200003 2.600000 -27.800014\nv 6.200003 2.600000 -27.800014\nv 6.200004 2.600000 -29.800014\nv 8.200004 4.600000 -29.800014\nv 8.200003 4.600000 -27.800014\nv 6.200003 4.600000 -27.800014\nv 6.200003 4.600000 -29.800014\nv 11.800005 2.600000 -29.800014\nv 11.800005 2.600000 -27.800014\nv 9.800005 2.600000 -27.800014\nv 9.800005 2.600000 -29.800014\nv 11.800005 4.600000 -29.800014\nv 11.800004 4.600000 -27.800014\nv 9.800005 4.600000 -27.800014\nv 9.800005 4.600000 -29.800014\nv 15.400006 2.600000 -29.800014\nv 15.400006 2.600000 -27.800014\nv 13.400006 2.600000 -27.800014\nv 13.400006 2.600000 -29.800014\nv 15.400007 4.600000 -29.800014\nv 15.400005 4.600000 -27.800014\nv 13.400006 4.600000 -27.800014\nv 13.400006 4.600000 -29.800014\nv 19.000008 2.600000 -29.800014\nv 19.000008 2.600000 -27.800014\nv 17.000008 2.600000 -27.800014\nv 17.000008 2.600000 -29.800014\nv 19.000008 4.600000 -29.800014\nv 19.000008 4.600000 -27.800014\nv 17.000008 4.600000 -27.800014\nv 17.000008 4.600000 -29.800014\nv 22.600010 2.600000 -29.800014\nv 22.600010 2.600000 -27.800014\nv 20.600010 2.600000 -27.800014\nv 20.600010 2.600000 -29.800014\nv 22.600010 4.600000 -29.800014\nv 22.600010 4.600000 -27.800014\nv 20.600010 4.600000 -27.800014\nv 20.600010 4.600000 -29.800014\nv 26.200012 2.600000 -29.800014\nv 26.200012 2.600000 -27.800014\nv 24.200012 2.600000 -27.800014\nv 24.200012 2.600000 -29.800014\nv 26.200012 4.600000 -29.800014\nv 26.200012 4.600000 -27.800014\nv 24.200012 4.600000 -27.800014\nv 24.200012 4.600000 -29.800014\nv 29.800014 2.600000 -29.800014\nv 29.800014 2.600000 -27.800014\nv 27.800014 2.600000 -27.800014\nv 27.800014 2.600000 -29.800014\nv 29.800014 4.600000 -29.800014\nv 29.800014 4.600000 -27.800014\nv 27.800014 4.600000 -27.800014\nv 27.800014 4.600000 -29.800014\nv 33.400017 2.600000 -29.800014\nv 33.400017 2.600000 -27.800014\nv 31.400017 2.600000 -27.800014\nv 31.400017 2.600000 -29.800014\nv 33.400017 4.600000 -29.800014\nv 33.400017 4.600000 -27.800014\nv 31.400017 4.600000 -27.800014\nv 31.400017 4.600000 -29.800014\nv 1.000000 2.600000 -33.400017\nv 1.000000 2.600000 -31.400017\nv -1.000000 2.600000 -31.400017\nv -1.000000 2.600000 -33.400017\nv 1.000000 4.600000 -33.400017\nv 0.999999 4.600000 -31.400017\nv -1.000000 4.600000 -31.400017\nv -1.000000 4.600000 -33.400017\nv 4.600001 2.600000 -33.400017\nv 4.600001 2.600000 -31.400017\nv 2.600001 2.600000 -31.400017\nv 2.600002 2.600000 -33.400017\nv 4.600002 4.600000 -33.400017\nv 4.600001 4.600000 -31.400017\nv 2.600001 4.600000 -31.400017\nv 2.600002 4.600000 -33.400017\nv 8.200003 2.600000 -33.400017\nv 8.200003 2.600000 -31.400017\nv 6.200003 2.600000 -31.400017\nv 6.200004 2.600000 -33.400017\nv 8.200004 4.600000 -33.400017\nv 8.200003 4.600000 -31.400017\nv 6.200003 4.600000 -31.400017\nv 6.200003 4.600000 -33.400017\nv 11.800005 2.600000 -33.400017\nv 11.800005 2.600000 -31.400017\nv 9.800005 2.600000 -31.400017\nv 9.800005 2.600000 -33.400017\nv 11.800005 4.600000 -33.400017\nv 11.800004 4.600000 -31.400017\nv 9.800005 4.600000 -31.400017\nv 9.800005 4.600000 -33.400017\nv 15.400006 2.600000 -33.400017\nv 15.400006 2.600000 -31.400017\nv 13.400006 2.600000 -31.400017\nv 13.400006 2.600000 -33.400017\nv 15.400007 4.600000 -33.400017\nv 15.400005 4.600000 -31.400017\nv 13.400006 4.600000 -31.400017\nv 13.400006 4.600000 -33.400017\nv 19.000008 2.600000 -33.400017\nv 19.000008 2.600000 -31.400017\nv 17.000008 2.600000 -31.400017\nv 17.000008 2.600000 -33.400017\nv 19.000008 4.600000 -33.400017\nv 19.000008 4.600000 -31.400017\nv 17.000008 4.600000 -31.400017\nv 17.000008 4.600000 -33.400017\nv 22.600010 2.600000 -33.400017\nv 22.600010 2.600000 -31.400017\nv 20.600010 2.600000 -31.400017\nv 20.600010 2.600000 -33.400017\nv 22.600010 4.600000 -33.400017\nv 22.600010 4.600000 -31.400017\nv 20.600010 4.600000 -31.400017\nv 20.600010 4.600000 -33.400017\nv 26.200012 2.600000 -33.400017\nv 26.200012 2.600000 -31.400017\nv 24.200012 2.600000 -31.400017\nv 24.200012 2.600000 -33.400017\nv 26.200012 4.600000 -33.400017\nv 26.200012 4.600000 -31.400017\nv 24.200012 4.600000 -31.400017\nv 24.200012 4.600000 -33.400017\nv 29.800014 2.600000 -33.400017\nv 29.800014 2.600000 -31.400017\nv 27.800014 2.600000 -31.400017\nv 27.800014 2.600000 -33.400017\nv 29.800014 4.600000 -33.400017\nv 29.800014 4.600000 -31.400017\nv 27.800014 4.600000 -31.400017\nv 27.800014 4.600000 -33.400017\nv 33.400017 2.600000 -33.400017\nv 33.400017 2.600000 -31.400017\nv 31.400017 2.600000 -31.400017\nv 31.400017 2.600000 -33.400017\nv 33.400017 4.600000 -33.400017\nv 33.400017 4.600000 -31.400017\nv 31.400017 4.600000 -31.400017\nv 31.400017 4.600000 -33.400017\nv -1.000000 2.600000 -1.000000\nv -1.000000 2.600000 1.000000\nv 1.000000 2.600000 1.000000\nv 1.000000 2.600000 -1.000000\nv -1.000000 4.600000 -0.999999\nv -0.999999 4.600000 1.000001\nv 1.000000 4.600000 1.000000\nv 1.000000 4.600000 -1.000000\nv -4.600001 2.600000 -1.000000\nv -4.600001 2.600000 1.000000\nv -2.600001 2.600000 1.000000\nv -2.600002 2.600000 -1.000000\nv -4.600002 4.600000 -0.999999\nv -4.600001 4.600000 1.000001\nv -2.600001 4.600000 1.000000\nv -2.600002 4.600000 -1.000000\nv -8.200003 2.600000 -1.000000\nv -8.200003 2.600000 1.000000\nv -6.200003 2.600000 1.000000\nv -6.200004 2.600000 -1.000000\nv -8.200004 4.600000 -0.999999\nv -8.200003 4.600000 1.000001\nv -6.200003 4.600000 1.000000\nv -6.200003 4.600000 -1.000000\nv -11.800005 2.600000 -1.000000\nv -11.800005 2.600000 1.000000\nv -9.800005 2.600000 1.000000\nv -9.800005 2.600000 -1.000000\nv -11.800005 4.600000 -0.999999\nv -11.800004 4.600000 1.000001\nv -9.800005 4.600000 1.000000\nv -9.800005 4.600000 -1.000000\nv -15.400006 2.600000 -1.000000\nv -15.400006 2.600000 1.000000\nv -13.400006 2.600000 1.000000\nv -13.400006 2.600000 -1.000000\nv -15.400007 4.600000 -0.999999\nv -15.400005 4.600000 1.000001\nv -13.400006 4.600000 1.000000\nv -13.400006 4.600000 -1.000000\nv -19.000008 2.600000 -1.000000\nv -19.000008 2.600000 1.000000\nv -17.000008 2.600000 1.000000\nv -17.000008 2.600000 -1.000000\nv -19.000008 4.600000 -0.999999\nv -19.000008 4.600000 1.000001\nv -17.000008 4.600000 1.000000\nv -17.000008 4.600000 -1.000000\nv -22.600010 2.600000 -1.000000\nv -22.600010 2.600000 1.000000\nv -20.600010 2.600000 1.000000\nv -20.600010 2.600000 -1.000000\nv -22.600010 4.600000 -0.999999\nv -22.600010 4.600000 1.000001\nv -20.600010 4.600000 1.000000\nv -20.600010 4.600000 -1.000000\nv -26.200012 2.600000 -1.000000\nv -26.200012 2.600000 1.000000\nv -24.200012 2.600000 1.000000\nv -24.200012 2.600000 -1.000000\nv -26.200012 4.600000 -0.999999\nv -26.200012 4.600000 1.000001\nv -24.200012 4.600000 1.000000\nv -24.200012 4.600000 -1.000000\nv -29.800014 2.600000 -1.000000\nv -29.800014 2.600000 1.000000\nv -27.800014 2.600000 1.000000\nv -27.800014 2.600000 -1.000000\nv -29.800014 4.600000 -0.999999\nv -29.800014 4.600000 1.000001\nv -27.800014 4.600000 1.000000\nv -27.800014 4.600000 -1.000000\nv -33.400017 2.600000 -1.000000\nv -33.400017 2.600000 1.000000\nv -31.400017 2.600000 1.000000\nv -31.400017 2.600000 -1.000000\nv -33.400017 4.600000 -0.999999\nv -33.400017 4.600000 1.000001\nv -31.400017 4.600000 1.000000\nv -31.400017 4.600000 -1.000000\nv -1.000000 2.600000 -4.600001\nv -1.000000 2.600000 -2.600002\nv 1.000000 2.600000 -2.600002\nv 1.000000 2.600000 -4.600002\nv -1.000000 4.600000 -4.600001\nv -0.999999 4.600000 -2.600001\nv 1.000000 4.600000 -2.600002\nv 1.000000 4.600000 -4.600001\nv -4.600001 2.600000 -4.600001\nv -4.600001 2.600000 -2.600002\nv -2.600001 2.600000 -2.600002\nv -2.600002 2.600000 -4.600002\nv -4.600002 4.600000 -4.600001\nv -4.600001 4.600000 -2.600001\nv -2.600001 4.600000 -2.600002\nv -2.600002 4.600000 -4.600001\nv -8.200003 2.600000 -4.600001\nv -8.200003 2.600000 -2.600002\nv -6.200003 2.600000 -2.600002\nv -6.200004 2.600000 -4.600002\nv -8.200004 4.600000 -4.600001\nv -8.200003 4.600000 -2.600001\nv -6.200003 4.600000 -2.600002\nv -6.200003 4.600000 -4.600001\nv -11.800005 2.600000 -4.600001\nv -11.800005 2.600000 -2.600002\nv -9.800005 2.600000 -2.600002\nv -9.800005 2.600000 -4.600002\nv -11.800005 4.600000 -4.600001\nv -11.800004 4.600000 -2.600001\nv -9.800005 4.600000 -2.600002\nv -9.800005 4.600000 -4.600001\nv -15.400006 2.600000 -4.600001\nv -15.400006 2.600000 -2.600002\nv -13.400006 2.600000 -2.600002\nv -13.400006 2.600000 -4.600002\nv -15.400007 4.600000 -4.600001\nv -15.400005 4.600000 -2.600001\nv -13.400006 4.600000 -2.600002\nv -13.400006 4.600000 -4.600001\nv -19.000008 2.600000 -4.600001\nv -19.000008 2.600000 -2.600002\nv -17.000008 2.600000 -2.600002\nv -17.000008 2.600000 -4.600002\nv -19.000008 4.600000 -4.600001\nv -19.000008 4.600000 -2.600001\nv -17.000008 4.600000 -2.600002\nv -17.000008 4.600000 -4.600001\nv -22.600010 2.600000 -4.600001\nv -22.600010 2.600000 -2.600002\nv -20.600010 2.600000 -2.600002\nv -20.600010 2.600000 -4.600002\nv -22.600010 4.600000 -4.600001\nv -22.600010 4.600000 -2.600001\nv -20.600010 4.600000 -2.600002\nv -20.600010 4.600000 -4.600001\nv -26.200012 2.600000 -4.600001\nv -26.200012 2.600000 -2.600002\nv -24.200012 2.600000 -2.600002\nv -24.200012 2.600000 -4.600002\nv -26.200012 4.600000 -4.600001\nv -26.200012 4.600000 -2.600001\nv -24.200012 4.600000 -2.600002\nv -24.200012 4.600000 -4.600001\nv -29.800014 2.600000 -4.600001\nv -29.800014 2.600000 -2.600002\nv -27.800014 2.600000 -2.600002\nv -27.800014 2.600000 -4.600002\nv -29.800014 4.600000 -4.600001\nv -29.800014 4.600000 -2.600001\nv -27.800014 4.600000 -2.600002\nv -27.800014 4.600000 -4.600001\nv -33.400017 2.600000 -4.600001\nv -33.400017 2.600000 -2.600002\nv -31.400017 2.600000 -2.600002\nv -31.400017 2.600000 -4.600002\nv -33.400017 4.600000 -4.600001\nv -33.400017 4.600000 -2.600001\nv -31.400017 4.600000 -2.600002\nv -31.400017 4.600000 -4.600001\nv -1.000000 2.600000 -8.200003\nv -1.000000 2.600000 -6.200003\nv 1.000000 2.600000 -6.200003\nv 1.000000 2.600000 -8.200004\nv -1.000000 4.600000 -8.200003\nv -0.999999 4.600000 -6.200003\nv 1.000000 4.600000 -6.200004\nv 1.000000 4.600000 -8.200003\nv -4.600001 2.600000 -8.200003\nv -4.600001 2.600000 -6.200003\nv -2.600001 2.600000 -6.200003\nv -2.600002 2.600000 -8.200004\nv -4.600002 4.600000 -8.200003\nv -4.600001 4.600000 -6.200003\nv -2.600001 4.600000 -6.200004\nv -2.600002 4.600000 -8.200003\nv -8.200003 2.600000 -8.200003\nv -8.200003 2.600000 -6.200003\nv -6.200003 2.600000 -6.200003\nv -6.200004 2.600000 -8.200004\nv -8.200004 4.600000 -8.200003\nv -8.200003 4.600000 -6.200003\nv -6.200003 4.600000 -6.200004\nv -6.200003 4.600000 -8.200003\nv -11.800005 2.600000 -8.200003\nv -11.800005 2.600000 -6.200003\nv -9.800005 2.600000 -6.200003\nv -9.800005 2.600000 -8.200004\nv -11.800005 4.600000 -8.200003\nv -11.800004 4.600000 -6.200003\nv -9.800005 4.600000 -6.200004\nv -9.800005 4.600000 -8.200003\nv -15.400006 2.600000 -8.200003\nv -15.400006 2.600000 -6.200003\nv -13.400006 2.600000 -6.200003\nv -13.400006 2.600000 -8.200004\nv -15.400007 4.600000 -8.200003\nv -15.400005 4.600000 -6.200003\nv -13.400006 4.600000 -6.200004\nv -13.400006 4.600000 -8.200003\nv -19.000008 2.600000 -8.200003\nv -19.000008 2.600000 -6.200003\nv -17.000008 2.600000 -6.200003\nv -17.000008 2.600000 -8.200004\nv -19.000008 4.600000 -8.200003\nv -19.000008 4.600000 -6.200003\nv -17.000008 4.600000 -6.200004\nv -17.000008 4.600000 -8.200003\nv -22.600010 2.600000 -8.200003\nv -22.600010 2.600000 -6.200003\nv -20.600010 2.600000 -6.200003\nv -20.600010 2.600000 -8.200004\nv -22.600010 4.600000 -8.200003\nv -22.600010 4.600000 -6.200003\nv -20.600010 4.600000 -6.200004\nv -20.600010 4.600000 -8.200003\nv -26.200012 2.600000 -8.200003\nv -26.200012 2.600000 -6.200003\nv -24.200012 2.600000 -6.200003\nv -24.200012 2.600000 -8.200004\nv -26.200012 4.600000 -8.200003\nv -26.200012 4.600000 -6.200003\nv -24.200012 4.600000 -6.200004\nv -24.200012 4.600000 -8.200003\nv -29.800014 2.600000 -8.200003\nv -29.800014 2.600000 -6.200003\nv -27.800014 2.600000 -6.200003\nv -27.800014 2.600000 -8.200004\nv -29.800014 4.600000 -8.200003\nv -29.800014 4.600000 -6.200003\nv -27.800014 4.600000 -6.200004\nv -27.800014 4.600000 -8.200003\nv -33.400017 2.600000 -8.200003\nv -33.400017 2.600000 -6.200003\nv -31.400017 2.600000 -6.200003\nv -31.400017 2.600000 -8.200004\nv -33.400017 4.600000 -8.200003\nv -33.400017 4.600000 -6.200003\nv -31.400017 4.600000 -6.200004\nv -31.400017 4.600000 -8.200003\nv -1.000000 2.600000 -11.800005\nv -1.000000 2.600000 -9.800005\nv 1.000000 2.600000 -9.800005\nv 1.000000 2.600000 -11.800005\nv -1.000000 4.600000 -11.800004\nv -0.999999 4.600000 -9.800004\nv 1.000000 4.600000 -9.800005\nv 1.000000 4.600000 -11.800005\nv -4.600001 2.600000 -11.800005\nv -4.600001 2.600000 -9.800005\nv -2.600001 2.600000 -9.800005\nv -2.600002 2.600000 -11.800005\nv -4.600002 4.600000 -11.800004\nv -4.600001 4.600000 -9.800004\nv -2.600001 4.600000 -9.800005\nv -2.600002 4.600000 -11.800005\nv -8.200003 2.600000 -11.800005\nv -8.200003 2.600000 -9.800005\nv -6.200003 2.600000 -9.800005\nv -6.200004 2.600000 -11.800005\nv -8.200004 4.600000 -11.800004\nv -8.200003 4.600000 -9.800004\nv -6.200003 4.600000 -9.800005\nv -6.200003 4.600000 -11.800005\nv -11.800005 2.600000 -11.800005\nv -11.800005 2.600000 -9.800005\nv -9.800005 2.600000 -9.800005\nv -9.800005 2.600000 -11.800005\nv -11.800005 4.600000 -11.800004\nv -11.800004 4.600000 -9.800004\nv -9.800005 4.600000 -9.800005\nv -9.800005 4.600000 -11.800005\nv -15.400006 2.600000 -11.800005\nv -15.400006 2.600000 -9.800005\nv -13.400006 2.600000 -9.800005\nv -13.400006 2.600000 -11.800005\nv -15.400007 4.600000 -11.800004\nv -15.400005 4.600000 -9.800004\nv -13.400006 4.600000 -9.800005\nv -13.400006 4.600000 -11.800005\nv -19.000008 2.600000 -11.800005\nv -19.000008 2.600000 -9.800005\nv -17.000008 2.600000 -9.800005\nv -17.000008 2.600000 -11.800005\nv -19.000008 4.600000 -11.800004\nv -19.000008 4.600000 -9.800004\nv -17.000008 4.600000 -9.800005\nv -17.000008 4.600000 -11.800005\nv -22.600010 2.600000 -11.800005\nv -22.600010 2.600000 -9.800005\nv -20.600010 2.600000 -9.800005\nv -20.600010 2.600000 -11.800005\nv -22.600010 4.600000 -11.800004\nv -22.600010 4.600000 -9.800004\nv -20.600010 4.600000 -9.800005\nv -20.600010 4.600000 -11.800005\nv -26.200012 2.600000 -11.800005\nv -26.200012 2.600000 -9.800005\nv -24.200012 2.600000 -9.800005\nv -24.200012 2.600000 -11.800005\nv -26.200012 4.600000 -11.800004\nv -26.200012 4.600000 -9.800004\nv -24.200012 4.600000 -9.800005\nv -24.200012 4.600000 -11.800005\nv -29.800014 2.600000 -11.800005\nv -29.800014 2.600000 -9.800005\nv -27.800014 2.600000 -9.800005\nv -27.800014 2.600000 -11.800005\nv -29.800014 4.600000 -11.800004\nv -29.800014 4.600000 -9.800004\nv -27.800014 4.600000 -9.800005\nv -27.800014 4.600000 -11.800005\nv -33.400017 2.600000 -11.800005\nv -33.400017 2.600000 -9.800005\nv -31.400017 2.600000 -9.800005\nv -31.400017 2.600000 -11.800005\nv -33.400017 4.600000 -11.800004\nv -33.400017 4.600000 -9.800004\nv -31.400017 4.600000 -9.800005\nv -31.400017 4.600000 -11.800005\nv -1.000000 2.600000 -15.400006\nv -1.000000 2.600000 -13.400006\nv 1.000000 2.600000 -13.400006\nv 1.000000 2.600000 -15.400006\nv -1.000000 4.600000 -15.400005\nv -0.999999 4.600000 -13.400005\nv 1.000000 4.600000 -13.400006\nv 1.000000 4.600000 -15.400006\nv -4.600001 2.600000 -15.400006\nv -4.600001 2.600000 -13.400006\nv -2.600001 2.600000 -13.400006\nv -2.600002 2.600000 -15.400006\nv -4.600002 4.600000 -15.400005\nv -4.600001 4.600000 -13.400005\nv -2.600001 4.600000 -13.400006\nv -2.600002 4.600000 -15.400006\nv -8.200003 2.600000 -15.400006\nv -8.200003 2.600000 -13.400006\nv -6.200003 2.600000 -13.400006\nv -6.200004 2.600000 -15.400006\nv -8.200004 4.600000 -15.400005\nv -8.200003 4.600000 -13.400005\nv -6.200003 4.600000 -13.400006\nv -6.200003 4.600000 -15.400006\nv -11.800005 2.600000 -15.400006\nv -11.800005 2.600000 -13.400006\nv -9.800005 2.600000 -13.400006\nv -9.800005 2.600000 -15.400006\nv -11.800005 4.600000 -15.400005\nv -11.800004 4.600000 -13.400005\nv -9.800005 4.600000 -13.400006\nv -9.800005 4.600000 -15.400006\nv -15.400006 2.600000 -15.400006\nv -15.400006 2.600000 -13.400006\nv -13.400006 2.600000 -13.400006\nv -13.400006 2.600000 -15.400006\nv -15.400007 4.600000 -15.400005\nv -15.400005 4.600000 -13.400005\nv -13.400006 4.600000 -13.400006\nv -13.400006 4.600000 -15.400006\nv -19.000008 2.600000 -15.400006\nv -19.000008 2.600000 -13.400006\nv -17.000008 2.600000 -13.400006\nv -17.000008 2.600000 -15.400006\nv -19.000008 4.600000 -15.400005\nv -19.000008 4.600000 -13.400005\nv -17.000008 4.600000 -13.400006\nv -17.000008 4.600000 -15.400006\nv -22.600010 2.600000 -15.400006\nv -22.600010 2.600000 -13.400006\nv -20.600010 2.600000 -13.400006\nv -20.600010 2.600000 -15.400006\nv -22.600010 4.600000 -15.400005\nv -22.600010 4.600000 -13.400005\nv -20.600010 4.600000 -13.400006\nv -20.600010 4.600000 -15.400006\nv -26.200012 2.600000 -15.400006\nv -26.200012 2.600000 -13.400006\nv -24.200012 2.600000 -13.400006\nv -24.200012 2.600000 -15.400006\nv -26.200012 4.600000 -15.400005\nv -26.200012 4.600000 -13.400005\nv -24.200012 4.600000 -13.400006\nv -24.200012 4.600000 -15.400006\nv -29.800014 2.600000 -15.400006\nv -29.800014 2.600000 -13.400006\nv -27.800014 2.600000 -13.400006\nv -27.800014 2.600000 -15.400006\nv -29.800014 4.600000 -15.400005\nv -29.800014 4.600000 -13.400005\nv -27.800014 4.600000 -13.400006\nv -27.800014 4.600000 -15.400006\nv -33.400017 2.600000 -15.400006\nv -33.400017 2.600000 -13.400006\nv -31.400017 2.600000 -13.400006\nv -31.400017 2.600000 -15.400006\nv -33.400017 4.600000 -15.400005\nv -33.400017 4.600000 -13.400005\nv -31.400017 4.600000 -13.400006\nv -31.400017 4.600000 -15.400006\nv -1.000000 2.600000 -19.000008\nv -1.000000 2.600000 -17.000008\nv 1.000000 2.600000 -17.000008\nv 1.000000 2.600000 -19.000008\nv -1.000000 4.600000 -19.000008\nv -0.999999 4.600000 -17.000008\nv 1.000000 4.600000 -17.000008\nv 1.000000 4.600000 -19.000008\nv -4.600001 2.600000 -19.000008\nv -4.600001 2.600000 -17.000008\nv -2.600001 2.600000 -17.000008\nv -2.600002 2.600000 -19.000008\nv -4.600002 4.600000 -19.000008\nv -4.600001 4.600000 -17.000008\nv -2.600001 4.600000 -17.000008\nv -2.600002 4.600000 -19.000008\nv -8.200003 2.600000 -19.000008\nv -8.200003 2.600000 -17.000008\nv -6.200003 2.600000 -17.000008\nv -6.200004 2.600000 -19.000008\nv -8.200004 4.600000 -19.000008\nv -8.200003 4.600000 -17.000008\nv -6.200003 4.600000 -17.000008\nv -6.200003 4.600000 -19.000008\nv -11.800005 2.600000 -19.000008\nv -11.800005 2.600000 -17.000008\nv -9.800005 2.600000 -17.000008\nv -9.800005 2.600000 -19.000008\nv -11.800005 4.600000 -19.000008\nv -11.800004 4.600000 -17.000008\nv -9.800005 4.600000 -17.000008\nv -9.800005 4.600000 -19.000008\nv -15.400006 2.600000 -19.000008\nv -15.400006 2.600000 -17.000008\nv -13.400006 2.600000 -17.000008\nv -13.400006 2.600000 -19.000008\nv -15.400007 4.600000 -19.000008\nv -15.400005 4.600000 -17.000008\nv -13.400006 4.600000 -17.000008\nv -13.400006 4.600000 -19.000008\nv -19.000008 2.600000 -19.000008\nv -19.000008 2.600000 -17.000008\nv -17.000008 2.600000 -17.000008\nv -17.000008 2.600000 -19.000008\nv -19.000008 4.600000 -19.000008\nv -19.000008 4.600000 -17.000008\nv -17.000008 4.600000 -17.000008\nv -17.000008 4.600000 -19.000008\nv -22.600010 2.600000 -19.000008\nv -22.600010 2.600000 -17.000008\nv -20.600010 2.600000 -17.000008\nv -20.600010 2.600000 -19.000008\nv -22.600010 4.600000 -19.000008\nv -22.600010 4.600000 -17.000008\nv -20.600010 4.600000 -17.000008\nv -20.600010 4.600000 -19.000008\nv -26.200012 2.600000 -19.000008\nv -26.200012 2.600000 -17.000008\nv -24.200012 2.600000 -17.000008\nv -24.200012 2.600000 -19.000008\nv -26.200012 4.600000 -19.000008\nv -26.200012 4.600000 -17.000008\nv -24.200012 4.600000 -17.000008\nv -24.200012 4.600000 -19.000008\nv -29.800014 2.600000 -19.000008\nv -29.800014 2.600000 -17.000008\nv -27.800014 2.600000 -17.000008\nv -27.800014 2.600000 -19.000008\nv -29.800014 4.600000 -19.000008\nv -29.800014 4.600000 -17.000008\nv -27.800014 4.600000 -17.000008\nv -27.800014 4.600000 -19.000008\nv -33.400017 2.600000 -19.000008\nv -33.400017 2.600000 -17.000008\nv -31.400017 2.600000 -17.000008\nv -31.400017 2.600000 -19.000008\nv -33.400017 4.600000 -19.000008\nv -33.400017 4.600000 -17.000008\nv -31.400017 4.600000 -17.000008\nv -31.400017 4.600000 -19.000008\nv -1.000000 2.600000 -22.600010\nv -1.000000 2.600000 -20.600010\nv 1.000000 2.600000 -20.600010\nv 1.000000 2.600000 -22.600010\nv -1.000000 4.600000 -22.600010\nv -0.999999 4.600000 -20.600010\nv 1.000000 4.600000 -20.600010\nv 1.000000 4.600000 -22.600010\nv -4.600001 2.600000 -22.600010\nv -4.600001 2.600000 -20.600010\nv -2.600001 2.600000 -20.600010\nv -2.600002 2.600000 -22.600010\nv -4.600002 4.600000 -22.600010\nv -4.600001 4.600000 -20.600010\nv -2.600001 4.600000 -20.600010\nv -2.600002 4.600000 -22.600010\nv -8.200003 2.600000 -22.600010\nv -8.200003 2.600000 -20.600010\nv -6.200003 2.600000 -20.600010\nv -6.200004 2.600000 -22.600010\nv -8.200004 4.600000 -22.600010\nv -8.200003 4.600000 -20.600010\nv -6.200003 4.600000 -20.600010\nv -6.200003 4.600000 -22.600010\nv -11.800005 2.600000 -22.600010\nv -11.800005 2.600000 -20.600010\nv -9.800005 2.600000 -20.600010\nv -9.800005 2.600000 -22.600010\nv -11.800005 4.600000 -22.600010\nv -11.800004 4.600000 -20.600010\nv -9.800005 4.600000 -20.600010\nv -9.800005 4.600000 -22.600010\nv -15.400006 2.600000 -22.600010\nv -15.400006 2.600000 -20.600010\nv -13.400006 2.600000 -20.600010\nv -13.400006 2.600000 -22.600010\nv -15.400007 4.600000 -22.600010\nv -15.400005 4.600000 -20.600010\nv -13.400006 4.600000 -20.600010\nv -13.400006 4.600000 -22.600010\nv -19.000008 2.600000 -22.600010\nv -19.000008 2.600000 -20.600010\nv -17.000008 2.600000 -20.600010\nv -17.000008 2.600000 -22.600010\nv -19.000008 4.600000 -22.600010\nv -19.000008 4.600000 -20.600010\nv -17.000008 4.600000 -20.600010\nv -17.000008 4.600000 -22.600010\nv -22.600010 2.600000 -22.600010\nv -22.600010 2.600000 -20.600010\nv -20.600010 2.600000 -20.600010\nv -20.600010 2.600000 -22.600010\nv -22.600010 4.600000 -22.600010\nv -22.600010 4.600000 -20.600010\nv -20.600010 4.600000 -20.600010\nv -20.600010 4.600000 -22.600010\nv -26.200012 2.600000 -22.600010\nv -26.200012 2.600000 -20.600010\nv -24.200012 2.600000 -20.600010\nv -24.200012 2.600000 -22.600010\nv -26.200012 4.600000 -22.600010\nv -26.200012 4.600000 -20.600010\nv -24.200012 4.600000 -20.600010\nv -24.200012 4.600000 -22.600010\nv -29.800014 2.600000 -22.600010\nv -29.800014 2.600000 -20.600010\nv -27.800014 2.600000 -20.600010\nv -27.800014 2.600000 -22.600010\nv -29.800014 4.600000 -22.600010\nv -29.800014 4.600000 -20.600010\nv -27.800014 4.600000 -20.600010\nv -27.800014 4.600000 -22.600010\nv -33.400017 2.600000 -22.600010\nv -33.400017 2.600000 -20.600010\nv -31.400017 2.600000 -20.600010\nv -31.400017 2.600000 -22.600010\nv -33.400017 4.600000 -22.600010\nv -33.400017 4.600000 -20.600010\nv -31.400017 4.600000 -20.600010\nv -31.400017 4.600000 -22.600010\nv -1.000000 2.600000 -26.200012\nv -1.000000 2.600000 -24.200012\nv 1.000000 2.600000 -24.200012\nv 1.000000 2.600000 -26.200012\nv -1.000000 4.600000 -26.200012\nv -0.999999 4.600000 -24.200012\nv 1.000000 4.600000 -24.200012\nv 1.000000 4.600000 -26.200012\nv -4.600001 2.600000 -26.200012\nv -4.600001 2.600000 -24.200012\nv -2.600001 2.600000 -24.200012\nv -2.600002 2.600000 -26.200012\nv -4.600002 4.600000 -26.200012\nv -4.600001 4.600000 -24.200012\nv -2.600001 4.600000 -24.200012\nv -2.600002 4.600000 -26.200012\nv -8.200003 2.600000 -26.200012\nv -8.200003 2.600000 -24.200012\nv -6.200003 2.600000 -24.200012\nv -6.200004 2.600000 -26.200012\nv -8.200004 4.600000 -26.200012\nv -8.200003 4.600000 -24.200012\nv -6.200003 4.600000 -24.200012\nv -6.200003 4.600000 -26.200012\nv -11.800005 2.600000 -26.200012\nv -11.800005 2.600000 -24.200012\nv -9.800005 2.600000 -24.200012\nv -9.800005 2.600000 -26.200012\nv -11.800005 4.600000 -26.200012\nv -11.800004 4.600000 -24.200012\nv -9.800005 4.600000 -24.200012\nv -9.800005 4.600000 -26.200012\nv -15.400006 2.600000 -26.200012\nv -15.400006 2.600000 -24.200012\nv -13.400006 2.600000 -24.200012\nv -13.400006 2.600000 -26.200012\nv -15.400007 4.600000 -26.200012\nv -15.400005 4.600000 -24.200012\nv -13.400006 4.600000 -24.200012\nv -13.400006 4.600000 -26.200012\nv -19.000008 2.600000 -26.200012\nv -19.000008 2.600000 -24.200012\nv -17.000008 2.600000 -24.200012\nv -17.000008 2.600000 -26.200012\nv -19.000008 4.600000 -26.200012\nv -19.000008 4.600000 -24.200012\nv -17.000008 4.600000 -24.200012\nv -17.000008 4.600000 -26.200012\nv -22.600010 2.600000 -26.200012\nv -22.600010 2.600000 -24.200012\nv -20.600010 2.600000 -24.200012\nv -20.600010 2.600000 -26.200012\nv -22.600010 4.600000 -26.200012\nv -22.600010 4.600000 -24.200012\nv -20.600010 4.600000 -24.200012\nv -20.600010 4.600000 -26.200012\nv -26.200012 2.600000 -26.200012\nv -26.200012 2.600000 -24.200012\nv -24.200012 2.600000 -24.200012\nv -24.200012 2.600000 -26.200012\nv -26.200012 4.600000 -26.200012\nv -26.200012 4.600000 -24.200012\nv -24.200012 4.600000 -24.200012\nv -24.200012 4.600000 -26.200012\nv -29.800014 2.600000 -26.200012\nv -29.800014 2.600000 -24.200012\nv -27.800014 2.600000 -24.200012\nv -27.800014 2.600000 -26.200012\nv -29.800014 4.600000 -26.200012\nv -29.800014 4.600000 -24.200012\nv -27.800014 4.600000 -24.200012\nv -27.800014 4.600000 -26.200012\nv -33.400017 2.600000 -26.200012\nv -33.400017 2.600000 -24.200012\nv -31.400017 2.600000 -24.200012\nv -31.400017 2.600000 -26.200012\nv -33.400017 4.600000 -26.200012\nv -33.400017 4.600000 -24.200012\nv -31.400017 4.600000 -24.200012\nv -31.400017 4.600000 -26.200012\nv -1.000000 2.600000 -29.800014\nv -1.000000 2.600000 -27.800014\nv 1.000000 2.600000 -27.800014\nv 1.000000 2.600000 -29.800014\nv -1.000000 4.600000 -29.800014\nv -0.999999 4.600000 -27.800014\nv 1.000000 4.600000 -27.800014\nv 1.000000 4.600000 -29.800014\nv -4.600001 2.600000 -29.800014\nv -4.600001 2.600000 -27.800014\nv -2.600001 2.600000 -27.800014\nv -2.600002 2.600000 -29.800014\nv -4.600002 4.600000 -29.800014\nv -4.600001 4.600000 -27.800014\nv -2.600001 4.600000 -27.800014\nv -2.600002 4.600000 -29.800014\nv -8.200003 2.600000 -29.800014\nv -8.200003 2.600000 -27.800014\nv -6.200003 2.600000 -27.800014\nv -6.200004 2.600000 -29.800014\nv -8.200004 4.600000 -29.800014\nv -8.200003 4.600000 -27.800014\nv -6.200003 4.600000 -27.800014\nv -6.200003 4.600000 -29.800014\nv -11.800005 2.600000 -29.800014\nv -11.800005 2.600000 -27.800014\nv -9.800005 2.600000 -27.800014\nv -9.800005 2.600000 -29.800014\nv -11.800005 4.600000 -29.800014\nv -11.800004 4.600000 -27.800014\nv -9.800005 4.600000 -27.800014\nv -9.800005 4.600000 -29.800014\nv -15.400006 2.600000 -29.800014\nv -15.400006 2.600000 -27.800014\nv -13.400006 2.600000 -27.800014\nv -13.400006 2.600000 -29.800014\nv -15.400007 4.600000 -29.800014\nv -15.400005 4.600000 -27.800014\nv -13.400006 4.600000 -27.800014\nv -13.400006 4.600000 -29.800014\nv -19.000008 2.600000 -29.800014\nv -19.000008 2.600000 -27.800014\nv -17.000008 2.600000 -27.800014\nv -17.000008 2.600000 -29.800014\nv -19.000008 4.600000 -29.800014\nv -19.000008 4.600000 -27.800014\nv -17.000008 4.600000 -27.800014\nv -17.000008 4.600000 -29.800014\nv -22.600010 2.600000 -29.800014\nv -22.600010 2.600000 -27.800014\nv -20.600010 2.600000 -27.800014\nv -20.600010 2.600000 -29.800014\nv -22.600010 4.600000 -29.800014\nv -22.600010 4.600000 -27.800014\nv -20.600010 4.600000 -27.800014\nv -20.600010 4.600000 -29.800014\nv -26.200012 2.600000 -29.800014\nv -26.200012 2.600000 -27.800014\nv -24.200012 2.600000 -27.800014\nv -24.200012 2.600000 -29.800014\nv -26.200012 4.600000 -29.800014\nv -26.200012 4.600000 -27.800014\nv -24.200012 4.600000 -27.800014\nv -24.200012 4.600000 -29.800014\nv -29.800014 2.600000 -29.800014\nv -29.800014 2.600000 -27.800014\nv -27.800014 2.600000 -27.800014\nv -27.800014 2.600000 -29.800014\nv -29.800014 4.600000 -29.800014\nv -29.800014 4.600000 -27.800014\nv -27.800014 4.600000 -27.800014\nv -27.800014 4.600000 -29.800014\nv -33.400017 2.600000 -29.800014\nv -33.400017 2.600000 -27.800014\nv -31.400017 2.600000 -27.800014\nv -31.400017 2.600000 -29.800014\nv -33.400017 4.600000 -29.800014\nv -33.400017 4.600000 -27.800014\nv -31.400017 4.600000 -27.800014\nv -31.400017 4.600000 -29.800014\nv -1.000000 2.600000 -33.400017\nv -1.000000 2.600000 -31.400017\nv 1.000000 2.600000 -31.400017\nv 1.000000 2.600000 -33.400017\nv -1.000000 4.600000 -33.400017\nv -0.999999 4.600000 -31.400017\nv 1.000000 4.600000 -31.400017\nv 1.000000 4.600000 -33.400017\nv -4.600001 2.600000 -33.400017\nv -4.600001 2.600000 -31.400017\nv -2.600001 2.600000 -31.400017\nv -2.600002 2.600000 -33.400017\nv -4.600002 4.600000 -33.400017\nv -4.600001 4.600000 -31.400017\nv -2.600001 4.600000 -31.400017\nv -2.600002 4.600000 -33.400017\nv -8.200003 2.600000 -33.400017\nv -8.200003 2.600000 -31.400017\nv -6.200003 2.600000 -31.400017\nv -6.200004 2.600000 -33.400017\nv -8.200004 4.600000 -33.400017\nv -8.200003 4.600000 -31.400017\nv -6.200003 4.600000 -31.400017\nv -6.200003 4.600000 -33.400017\nv -11.800005 2.600000 -33.400017\nv -11.800005 2.600000 -31.400017\nv -9.800005 2.600000 -31.400017\nv -9.800005 2.600000 -33.400017\nv -11.800005 4.600000 -33.400017\nv -11.800004 4.600000 -31.400017\nv -9.800005 4.600000 -31.400017\nv -9.800005 4.600000 -33.400017\nv -15.400006 2.600000 -33.400017\nv -15.400006 2.600000 -31.400017\nv -13.400006 2.600000 -31.400017\nv -13.400006 2.600000 -33.400017\nv -15.400007 4.600000 -33.400017\nv -15.400005 4.600000 -31.400017\nv -13.400006 4.600000 -31.400017\nv -13.400006 4.600000 -33.400017\nv -19.000008 2.600000 -33.400017\nv -19.000008 2.600000 -31.400017\nv -17.000008 2.600000 -31.400017\nv -17.000008 2.600000 -33.400017\nv -19.000008 4.600000 -33.400017\nv -19.000008 4.600000 -31.400017\nv -17.000008 4.600000 -31.400017\nv -17.000008 4.600000 -33.400017\nv -22.600010 2.600000 -33.400017\nv -22.600010 2.600000 -31.400017\nv -20.600010 2.600000 -31.400017\nv -20.600010 2.600000 -33.400017\nv -22.600010 4.600000 -33.400017\nv -22.600010 4.600000 -31.400017\nv -20.600010 4.600000 -31.400017\nv -20.600010 4.600000 -33.400017\nv -26.200012 2.600000 -33.400017\nv -26.200012 2.600000 -31.400017\nv -24.200012 2.600000 -31.400017\nv -24.200012 2.600000 -33.400017\nv -26.200012 4.600000 -33.400017\nv -26.200012 4.600000 -31.400017\nv -24.200012 4.600000 -31.400017\nv -24.200012 4.600000 -33.400017\nv -29.800014 2.600000 -33.400017\nv -29.800014 2.600000 -31.400017\nv -27.800014 2.600000 -31.400017\nv -27.800014 2.600000 -33.400017\nv -29.800014 4.600000 -33.400017\nv -29.800014 4.600000 -31.400017\nv -27.800014 4.600000 -31.400017\nv -27.800014 4.600000 -33.400017\nv -33.400017 2.600000 -33.400017\nv -33.400017 2.600000 -31.400017\nv -31.400017 2.600000 -31.400017\nv -31.400017 2.600000 -33.400017\nv -33.400017 4.600000 -33.400017\nv -33.400017 4.600000 -31.400017\nv -31.400017 4.600000 -31.400017\nv -31.400017 4.600000 -33.400017\nv 1.000000 6.200000 -1.000000\nv 1.000000 6.200000 1.000000\nv -1.000000 6.200000 1.000000\nv -1.000000 6.200000 -1.000000\nv 1.000000 8.200000 -0.999999\nv 0.999999 8.200000 1.000001\nv -1.000000 8.200000 1.000000\nv -1.000000 8.200000 -1.000000\nv 4.600001 6.200000 -1.000000\nv 4.600001 6.200000 1.000000\nv 2.600001 6.200000 1.000000\nv 2.600002 6.200000 -1.000000\nv 4.600002 8.200000 -0.999999\nv 4.600001 8.200000 1.000001\nv 2.600001 8.200000 1.000000\nv 2.600002 8.200000 -1.000000\nv 8.200003 6.200000 -1.000000\nv 8.200003 6.200000 1.000000\nv 6.200003 6.200000 1.000000\nv 6.200004 6.200000 -1.000000\nv 8.200004 8.200000 -0.999999\nv 8.200003 8.200000 1.000001\nv 6.200003 8.200000 1.000000\nv 6.200003 8.200000 -1.000000\nv 11.800005 6.200000 -1.000000\nv 11.800005 6.200000 1.000000\nv 9.800005 6.200000 1.000000\nv 9.800005 6.200000 -1.000000\nv 11.800005 8.200000 -0.999999\nv 11.800004 8.200000 1.000001\nv 9.800005 8.200000 1.000000\nv 9.800005 8.200000 -1.000000\nv 15.400006 6.200000 -1.000000\nv 15.400006 6.200000 1.000000\nv 13.400006 6.200000 1.000000\nv 13.400006 6.200000 -1.000000\nv 15.400007 8.200000 -0.999999\nv 15.400005 8.200000 1.000001\nv 13.400006 8.200000 1.000000\nv 13.400006 8.200000 -1.000000\nv 19.000008 6.200000 -1.000000\nv 19.000008 6.200000 1.000000\nv 17.000008 6.200000 1.000000\nv 17.000008 6.200000 -1.000000\nv 19.000008 8.200000 -0.999999\nv 19.000008 8.200000 1.000001\nv 17.000008 8.200000 1.000000\nv 17.000008 8.200000 -1.000000\nv 22.600010 6.200000 -1.000000\nv 22.600010 6.200000 1.000000\nv 20.600010 6.200000 1.000000\nv 20.600010 6.200000 -1.000000\nv 22.600010 8.200000 -0.999999\nv 22.600010 8.200000 1.000001\nv 20.600010 8.200000 1.000000\nv 20.600010 8.200000 -1.000000\nv 26.200012 6.200000 -1.000000\nv 26.200012 6.200000 1.000000\nv 24.200012 6.200000 1.000000\nv 24.200012 6.200000 -1.000000\nv 26.200012 8.200000 -0.999999\nv 26.200012 8.200000 1.000001\nv 24.200012 8.200000 1.000000\nv 24.200012 8.200000 -1.000000\nv 29.800014 6.200000 -1.000000\nv 29.800014 6.200000 1.000000\nv 27.800014 6.200000 1.000000\nv 27.800014 6.200000 -1.000000\nv 29.800014 8.200000 -0.999999\nv 29.800014 8.200000 1.000001\nv 27.800014 8.200000 1.000000\nv 27.800014 8.200000 -1.000000\nv 33.400017 6.200000 -1.000000\nv 33.400017 6.200000 1.000000\nv 31.400017 6.200000 1.000000\nv 31.400017 6.200000 -1.000000\nv 33.400017 8.200000 -0.999999\nv 33.400017 8.200000 1.000001\nv 31.400017 8.200000 1.000000\nv 31.400017 8.200000 -1.000000\nv 1.000000 6.200000 -4.600001\nv 1.000000 6.200000 -2.600002\nv -1.000000 6.200000 -2.600002\nv -1.000000 6.200000 -4.600002\nv 1.000000 8.200000 -4.600001\nv 0.999999 8.200000 -2.600001\nv -1.000000 8.200000 -2.600002\nv -1.000000 8.200000 -4.600001\nv 4.600001 6.200000 -4.600001\nv 4.600001 6.200000 -2.600002\nv 2.600001 6.200000 -2.600002\nv 2.600002 6.200000 -4.600002\nv 4.600002 8.200000 -4.600001\nv 4.600001 8.200000 -2.600001\nv 2.600001 8.200000 -2.600002\nv 2.600002 8.200000 -4.600001\nv 8.200003 6.200000 -4.600001\nv 8.200003 6.200000 -2.600002\nv 6.200003 6.200000 -2.600002\nv 6.200004 6.200000 -4.600002\nv 8.200004 8.200000 -4.600001\nv 8.200003 8.200000 -2.600001\nv 6.200003 8.200000 -2.600002\nv 6.200003 8.200000 -4.600001\nv 11.800005 6.200000 -4.600001\nv 11.800005 6.200000 -2.600002\nv 9.800005 6.200000 -2.600002\nv 9.800005 6.200000 -4.600002\nv 11.800005 8.200000 -4.600001\nv 11.800004 8.200000 -2.600001\nv 9.800005 8.200000 -2.600002\nv 9.800005 8.200000 -4.600001\nv 15.400006 6.200000 -4.600001\nv 15.400006 6.200000 -2.600002\nv 13.400006 6.200000 -2.600002\nv 13.400006 6.200000 -4.600002\nv 15.400007 8.200000 -4.600001\nv 15.400005 8.200000 -2.600001\nv 13.400006 8.200000 -2.600002\nv 13.400006 8.200000 -4.600001\nv 19.000008 6.200000 -4.600001\nv 19.000008 6.200000 -2.600002\nv 17.000008 6.200000 -2.600002\nv 17.000008 6.200000 -4.600002\nv 19.000008 8.200000 -4.600001\nv 19.000008 8.200000 -2.600001\nv 17.000008 8.200000 -2.600002\nv 17.000008 8.200000 -4.600001\nv 22.600010 6.200000 -4.600001\nv 22.600010 6.200000 -2.600002\nv 20.600010 6.200000 -2.600002\nv 20.600010 6.200000 -4.600002\nv 22.600010 8.200000 -4.600001\nv 22.600010 8.200000 -2.600001\nv 20.600010 8.200000 -2.600002\nv 20.600010 8.200000 -4.600001\nv 26.200012 6.200000 -4.600001\nv 26.200012 6.200000 -2.600002\nv 24.200012 6.200000 -2.600002\nv 24.200012 6.200000 -4.600002\nv 26.200012 8.200000 -4.600001\nv 26.200012 8.200000 -2.600001\nv 24.200012 8.200000 -2.600002\nv 24.200012 8.200000 -4.600001\nv 29.800014 6.200000 -4.600001\nv 29.800014 6.200000 -2.600002\nv 27.800014 6.200000 -2.600002\nv 27.800014 6.200000 -4.600002\nv 29.800014 8.200000 -4.600001\nv 29.800014 8.200000 -2.600001\nv 27.800014 8.200000 -2.600002\nv 27.800014 8.200000 -4.600001\nv 33.400017 6.200000 -4.600001\nv 33.400017 6.200000 -2.600002\nv 31.400017 6.200000 -2.600002\nv 31.400017 6.200000 -4.600002\nv 33.400017 8.200000 -4.600001\nv 33.400017 8.200000 -2.600001\nv 31.400017 8.200000 -2.600002\nv 31.400017 8.200000 -4.600001\nv 1.000000 6.200000 -8.200003\nv 1.000000 6.200000 -6.200003\nv -1.000000 6.200000 -6.200003\nv -1.000000 6.200000 -8.200004\nv 1.000000 8.200000 -8.200003\nv 0.999999 8.200000 -6.200003\nv -1.000000 8.200000 -6.200004\nv -1.000000 8.200000 -8.200003\nv 4.600001 6.200000 -8.200003\nv 4.600001 6.200000 -6.200003\nv 2.600001 6.200000 -6.200003\nv 2.600002 6.200000 -8.200004\nv 4.600002 8.200000 -8.200003\nv 4.600001 8.200000 -6.200003\nv 2.600001 8.200000 -6.200004\nv 2.600002 8.200000 -8.200003\nv 8.200003 6.200000 -8.200003\nv 8.200003 6.200000 -6.200003\nv 6.200003 6.200000 -6.200003\nv 6.200004 6.200000 -8.200004\nv 8.200004 8.200000 -8.200003\nv 8.200003 8.200000 -6.200003\nv 6.200003 8.200000 -6.200004\nv 6.200003 8.200000 -8.200003\nv 11.800005 6.200000 -8.200003\nv 11.800005 6.200000 -6.200003\nv 9.800005 6.200000 -6.200003\nv 9.800005 6.200000 -8.200004\nv 11.800005 8.200000 -8.200003\nv 11.800004 8.200000 -6.200003\nv 9.800005 8.200000 -6.200004\nv 9.800005 8.200000 -8.200003\nv 15.400006 6.200000 -8.200003\nv 15.400006 6.200000 -6.200003\nv 13.400006 6.200000 -6.200003\nv 13.400006 6.200000 -8.200004\nv 15.400007 8.200000 -8.200003\nv 15.400005 8.200000 -6.200003\nv 13.400006 8.200000 -6.200004\nv 13.400006 8.200000 -8.200003\nv 19.000008 6.200000 -8.200003\nv 19.000008 6.200000 -6.200003\nv 17.000008 6.200000 -6.200003\nv 17.000008 6.200000 -8.200004\nv 19.000008 8.200000 -8.200003\nv 19.000008 8.200000 -6.200003\nv 17.000008 8.200000 -6.200004\nv 17.000008 8.200000 -8.200003\nv 22.600010 6.200000 -8.200003\nv 22.600010 6.200000 -6.200003\nv 20.600010 6.200000 -6.200003\nv 20.600010 6.200000 -8.200004\nv 22.600010 8.200000 -8.200003\nv 22.600010 8.200000 -6.200003\nv 20.600010 8.200000 -6.200004\nv 20.600010 8.200000 -8.200003\nv 26.200012 6.200000 -8.200003\nv 26.200012 6.200000 -6.200003\nv 24.200012 6.200000 -6.200003\nv 24.200012 6.200000 -8.200004\nv 26.200012 8.200000 -8.200003\nv 26.200012 8.200000 -6.200003\nv 24.200012 8.200000 -6.200004\nv 24.200012 8.200000 -8.200003\nv 29.800014 6.200000 -8.200003\nv 29.800014 6.200000 -6.200003\nv 27.800014 6.200000 -6.200003\nv 27.800014 6.200000 -8.200004\nv 29.800014 8.200000 -8.200003\nv 29.800014 8.200000 -6.200003\nv 27.800014 8.200000 -6.200004\nv 27.800014 8.200000 -8.200003\nv 33.400017 6.200000 -8.200003\nv 33.400017 6.200000 -6.200003\nv 31.400017 6.200000 -6.200003\nv 31.400017 6.200000 -8.200004\nv 33.400017 8.200000 -8.200003\nv 33.400017 8.200000 -6.200003\nv 31.400017 8.200000 -6.200004\nv 31.400017 8.200000 -8.200003\nv 1.000000 6.200000 -11.800005\nv 1.000000 6.200000 -9.800005\nv -1.000000 6.200000 -9.800005\nv -1.000000 6.200000 -11.800005\nv 1.000000 8.200000 -11.800004\nv 0.999999 8.200000 -9.800004\nv -1.000000 8.200000 -9.800005\nv -1.000000 8.200000 -11.800005\nv 4.600001 6.200000 -11.800005\nv 4.600001 6.200000 -9.800005\nv 2.600001 6.200000 -9.800005\nv 2.600002 6.200000 -11.800005\nv 4.600002 8.200000 -11.800004\nv 4.600001 8.200000 -9.800004\nv 2.600001 8.200000 -9.800005\nv 2.600002 8.200000 -11.800005\nv 8.200003 6.200000 -11.800005\nv 8.200003 6.200000 -9.800005\nv 6.200003 6.200000 -9.800005\nv 6.200004 6.200000 -11.800005\nv 8.200004 8.200000 -11.800004\nv 8.200003 8.200000 -9.800004\nv 6.200003 8.200000 -9.800005\nv 6.200003 8.200000 -11.800005\nv 11.800005 6.200000 -11.800005\nv 11.800005 6.200000 -9.800005\nv 9.800005 6.200000 -9.800005\nv 9.800005 6.200000 -11.800005\nv 11.800005 8.200000 -11.800004\nv 11.800004 8.200000 -9.800004\nv 9.800005 8.200000 -9.800005\nv 9.800005 8.200000 -11.800005\nv 15.400006 6.200000 -11.800005\nv 15.400006 6.200000 -9.800005\nv 13.400006 6.200000 -9.800005\nv 13.400006 6.200000 -11.800005\nv 15.400007 8.200000 -11.800004\nv 15.400005 8.200000 -9.800004\nv 13.400006 8.200000 -9.800005\nv 13.400006 8.200000 -11.800005\nv 19.000008 6.200000 -11.800005\nv 19.000008 6.200000 -9.800005\nv 17.000008 6.200000 -9.800005\nv 17.000008 6.200000 -11.800005\nv 19.000008 8.200000 -11.800004\nv 19.000008 8.200000 -9.800004\nv 17.000008 8.200000 -9.800005\nv 17.000008 8.200000 -11.800005\nv 22.600010 6.200000 -11.800005\nv 22.600010 6.200000 -9.800005\nv 20.600010 6.200000 -9.800005\nv 20.600010 6.200000 -11.800005\nv 22.600010 8.200000 -11.800004\nv 22.600010 8.200000 -9.800004\nv 20.600010 8.200000 -9.800005\nv 20.600010 8.200000 -11.800005\nv 26.200012 6.200000 -11.800005\nv 26.200012 6.200000 -9.800005\nv 24.200012 6.200000 -9.800005\nv 24.200012 6.200000 -11.800005\nv 26.200012 8.200000 -11.800004\nv 26.200012 8.200000 -9.800004\nv 24.200012 8.200000 -9.800005\nv 24.200012 8.200000 -11.800005\nv 29.800014 6.200000 -11.800005\nv 29.800014 6.200000 -9.800005\nv 27.800014 6.200000 -9.800005\nv 27.800014 6.200000 -11.800005\nv 29.800014 8.200000 -11.800004\nv 29.800014 8.200000 -9.800004\nv 27.800014 8.200000 -9.800005\nv 27.800014 8.200000 -11.800005\nv 33.400017 6.200000 -11.800005\nv 33.400017 6.200000 -9.800005\nv 31.400017 6.200000 -9.800005\nv 31.400017 6.200000 -11.800005\nv 33.400017 8.200000 -11.800004\nv 33.400017 8.200000 -9.800004\nv 31.400017 8.200000 -9.800005\nv 31.400017 8.200000 -11.800005\nv 1.000000 6.200000 -15.400006\nv 1.000000 6.200000 -13.400006\nv -1.000000 6.200000 -13.400006\nv -1.000000 6.200000 -15.400006\nv 1.000000 8.200000 -15.400005\nv 0.999999 8.200000 -13.400005\nv -1.000000 8.200000 -13.400006\nv -1.000000 8.200000 -15.400006\nv 4.600001 6.200000 -15.400006\nv 4.600001 6.200000 -13.400006\nv 2.600001 6.200000 -13.400006\nv 2.600002 6.200000 -15.400006\nv 4.600002 8.200000 -15.400005\nv 4.600001 8.200000 -13.400005\nv 2.600001 8.200000 -13.400006\nv 2.600002 8.200000 -15.400006\nv 8.200003 6.200000 -15.400006\nv 8.200003 6.200000 -13.400006\nv 6.200003 6.200000 -13.400006\nv 6.200004 6.200000 -15.400006\nv 8.200004 8.200000 -15.400005\nv 8.200003 8.200000 -13.400005\nv 6.200003 8.200000 -13.400006\nv 6.200003 8.200000 -15.400006\nv 11.800005 6.200000 -15.400006\nv 11.800005 6.200000 -13.400006\nv 9.800005 6.200000 -13.400006\nv 9.800005 6.200000 -15.400006\nv 11.800005 8.200000 -15.400005\nv 11.800004 8.200000 -13.400005\nv 9.800005 8.200000 -13.400006\nv 9.800005 8.200000 -15.400006\nv 15.400006 6.200000 -15.400006\nv 15.400006 6.200000 -13.400006\nv 13.400006 6.200000 -13.400006\nv 13.400006 6.200000 -15.400006\nv 15.400007 8.200000 -15.400005\nv 15.400005 8.200000 -13.400005\nv 13.400006 8.200000 -13.400006\nv 13.400006 8.200000 -15.400006\nv 19.000008 6.200000 -15.400006\nv 19.000008 6.200000 -13.400006\nv 17.000008 6.200000 -13.400006\nv 17.000008 6.200000 -15.400006\nv 19.000008 8.200000 -15.400005\nv 19.000008 8.200000 -13.400005\nv 17.000008 8.200000 -13.400006\nv 17.000008 8.200000 -15.400006\nv 22.600010 6.200000 -15.400006\nv 22.600010 6.200000 -13.400006\nv 20.600010 6.200000 -13.400006\nv 20.600010 6.200000 -15.400006\nv 22.600010 8.200000 -15.400005\nv 22.600010 8.200000 -13.400005\nv 20.600010 8.200000 -13.400006\nv 20.600010 8.200000 -15.400006\nv 26.200012 6.200000 -15.400006\nv 26.200012 6.200000 -13.400006\nv 24.200012 6.200000 -13.400006\nv 24.200012 6.200000 -15.400006\nv 26.200012 8.200000 -15.400005\nv 26.200012 8.200000 -13.400005\nv 24.200012 8.200000 -13.400006\nv 24.200012 8.200000 -15.400006\nv 29.800014 6.200000 -15.400006\nv 29.800014 6.200000 -13.400006\nv 27.800014 6.200000 -13.400006\nv 27.800014 6.200000 -15.400006\nv 29.800014 8.200000 -15.400005\nv 29.800014 8.200000 -13.400005\nv 27.800014 8.200000 -13.400006\nv 27.800014 8.200000 -15.400006\nv 33.400017 6.200000 -15.400006\nv 33.400017 6.200000 -13.400006\nv 31.400017 6.200000 -13.400006\nv 31.400017 6.200000 -15.400006\nv 33.400017 8.200000 -15.400005\nv 33.400017 8.200000 -13.400005\nv 31.400017 8.200000 -13.400006\nv 31.400017 8.200000 -15.400006\nv 1.000000 6.200000 -19.000008\nv 1.000000 6.200000 -17.000008\nv -1.000000 6.200000 -17.000008\nv -1.000000 6.200000 -19.000008\nv 1.000000 8.200000 -19.000008\nv 0.999999 8.200000 -17.000008\nv -1.000000 8.200000 -17.000008\nv -1.000000 8.200000 -19.000008\nv 4.600001 6.200000 -19.000008\nv 4.600001 6.200000 -17.000008\nv 2.600001 6.200000 -17.000008\nv 2.600002 6.200000 -19.000008\nv 4.600002 8.200000 -19.000008\nv 4.600001 8.200000 -17.000008\nv 2.600001 8.200000 -17.000008\nv 2.600002 8.200000 -19.000008\nv 8.200003 6.200000 -19.000008\nv 8.200003 6.200000 -17.000008\nv 6.200003 6.200000 -17.000008\nv 6.200004 6.200000 -19.000008\nv 8.200004 8.200000 -19.000008\nv 8.200003 8.200000 -17.000008\nv 6.200003 8.200000 -17.000008\nv 6.200003 8.200000 -19.000008\nv 11.800005 6.200000 -19.000008\nv 11.800005 6.200000 -17.000008\nv 9.800005 6.200000 -17.000008\nv 9.800005 6.200000 -19.000008\nv 11.800005 8.200000 -19.000008\nv 11.800004 8.200000 -17.000008\nv 9.800005 8.200000 -17.000008\nv 9.800005 8.200000 -19.000008\nv 15.400006 6.200000 -19.000008\nv 15.400006 6.200000 -17.000008\nv 13.400006 6.200000 -17.000008\nv 13.400006 6.200000 -19.000008\nv 15.400007 8.200000 -19.000008\nv 15.400005 8.200000 -17.000008\nv 13.400006 8.200000 -17.000008\nv 13.400006 8.200000 -19.000008\nv 19.000008 6.200000 -19.000008\nv 19.000008 6.200000 -17.000008\nv 17.000008 6.200000 -17.000008\nv 17.000008 6.200000 -19.000008\nv 19.000008 8.200000 -19.000008\nv 19.000008 8.200000 -17.000008\nv 17.000008 8.200000 -17.000008\nv 17.000008 8.200000 -19.000008\nv 22.600010 6.200000 -19.000008\nv 22.600010 6.200000 -17.000008\nv 20.600010 6.200000 -17.000008\nv 20.600010 6.200000 -19.000008\nv 22.600010 8.200000 -19.000008\nv 22.600010 8.200000 -17.000008\nv 20.600010 8.200000 -17.000008\nv 20.600010 8.200000 -19.000008\nv 26.200012 6.200000 -19.000008\nv 26.200012 6.200000 -17.000008\nv 24.200012 6.200000 -17.000008\nv 24.200012 6.200000 -19.000008\nv 26.200012 8.200000 -19.000008\nv 26.200012 8.200000 -17.000008\nv 24.200012 8.200000 -17.000008\nv 24.200012 8.200000 -19.000008\nv 29.800014 6.200000 -19.000008\nv 29.800014 6.200000 -17.000008\nv 27.800014 6.200000 -17.000008\nv 27.800014 6.200000 -19.000008\nv 29.800014 8.200000 -19.000008\nv 29.800014 8.200000 -17.000008\nv 27.800014 8.200000 -17.000008\nv 27.800014 8.200000 -19.000008\nv 33.400017 6.200000 -19.000008\nv 33.400017 6.200000 -17.000008\nv 31.400017 6.200000 -17.000008\nv 31.400017 6.200000 -19.000008\nv 33.400017 8.200000 -19.000008\nv 33.400017 8.200000 -17.000008\nv 31.400017 8.200000 -17.000008\nv 31.400017 8.200000 -19.000008\nv 1.000000 6.200000 -22.600010\nv 1.000000 6.200000 -20.600010\nv -1.000000 6.200000 -20.600010\nv -1.000000 6.200000 -22.600010\nv 1.000000 8.200000 -22.600010\nv 0.999999 8.200000 -20.600010\nv -1.000000 8.200000 -20.600010\nv -1.000000 8.200000 -22.600010\nv 4.600001 6.200000 -22.600010\nv 4.600001 6.200000 -20.600010\nv 2.600001 6.200000 -20.600010\nv 2.600002 6.200000 -22.600010\nv 4.600002 8.200000 -22.600010\nv 4.600001 8.200000 -20.600010\nv 2.600001 8.200000 -20.600010\nv 2.600002 8.200000 -22.600010\nv 8.200003 6.200000 -22.600010\nv 8.200003 6.200000 -20.600010\nv 6.200003 6.200000 -20.600010\nv 6.200004 6.200000 -22.600010\nv 8.200004 8.200000 -22.600010\nv 8.200003 8.200000 -20.600010\nv 6.200003 8.200000 -20.600010\nv 6.200003 8.200000 -22.600010\nv 11.800005 6.200000 -22.600010\nv 11.800005 6.200000 -20.600010\nv 9.800005 6.200000 -20.600010\nv 9.800005 6.200000 -22.600010\nv 11.800005 8.200000 -22.600010\nv 11.800004 8.200000 -20.600010\nv 9.800005 8.200000 -20.600010\nv 9.800005 8.200000 -22.600010\nv 15.400006 6.200000 -22.600010\nv 15.400006 6.200000 -20.600010\nv 13.400006 6.200000 -20.600010\nv 13.400006 6.200000 -22.600010\nv 15.400007 8.200000 -22.600010\nv 15.400005 8.200000 -20.600010\nv 13.400006 8.200000 -20.600010\nv 13.400006 8.200000 -22.600010\nv 19.000008 6.200000 -22.600010\nv 19.000008 6.200000 -20.600010\nv 17.000008 6.200000 -20.600010\nv 17.000008 6.200000 -22.600010\nv 19.000008 8.200000 -22.600010\nv 19.000008 8.200000 -20.600010\nv 17.000008 8.200000 -20.600010\nv 17.000008 8.200000 -22.600010\nv 22.600010 6.200000 -22.600010\nv 22.600010 6.200000 -20.600010\nv 20.600010 6.200000 -20.600010\nv 20.600010 6.200000 -22.600010\nv 22.600010 8.200000 -22.600010\nv 22.600010 8.200000 -20.600010\nv 20.600010 8.200000 -20.600010\nv 20.600010 8.200000 -22.600010\nv 26.200012 6.200000 -22.600010\nv 26.200012 6.200000 -20.600010\nv 24.200012 6.200000 -20.600010\nv 24.200012 6.200000 -22.600010\nv 26.200012 8.200000 -22.600010\nv 26.200012 8.200000 -20.600010\nv 24.200012 8.200000 -20.600010\nv 24.200012 8.200000 -22.600010\nv 29.800014 6.200000 -22.600010\nv 29.800014 6.200000 -20.600010\nv 27.800014 6.200000 -20.600010\nv 27.800014 6.200000 -22.600010\nv 29.800014 8.200000 -22.600010\nv 29.800014 8.200000 -20.600010\nv 27.800014 8.200000 -20.600010\nv 27.800014 8.200000 -22.600010\nv 33.400017 6.200000 -22.600010\nv 33.400017 6.200000 -20.600010\nv 31.400017 6.200000 -20.600010\nv 31.400017 6.200000 -22.600010\nv 33.400017 8.200000 -22.600010\nv 33.400017 8.200000 -20.600010\nv 31.400017 8.200000 -20.600010\nv 31.400017 8.200000 -22.600010\nv 1.000000 6.200000 -26.200012\nv 1.000000 6.200000 -24.200012\nv -1.000000 6.200000 -24.200012\nv -1.000000 6.200000 -26.200012\nv 1.000000 8.200000 -26.200012\nv 0.999999 8.200000 -24.200012\nv -1.000000 8.200000 -24.200012\nv -1.000000 8.200000 -26.200012\nv 4.600001 6.200000 -26.200012\nv 4.600001 6.200000 -24.200012\nv 2.600001 6.200000 -24.200012\nv 2.600002 6.200000 -26.200012\nv 4.600002 8.200000 -26.200012\nv 4.600001 8.200000 -24.200012\nv 2.600001 8.200000 -24.200012\nv 2.600002 8.200000 -26.200012\nv 8.200003 6.200000 -26.200012\nv 8.200003 6.200000 -24.200012\nv 6.200003 6.200000 -24.200012\nv 6.200004 6.200000 -26.200012\nv 8.200004 8.200000 -26.200012\nv 8.200003 8.200000 -24.200012\nv 6.200003 8.200000 -24.200012\nv 6.200003 8.200000 -26.200012\nv 11.800005 6.200000 -26.200012\nv 11.800005 6.200000 -24.200012\nv 9.800005 6.200000 -24.200012\nv 9.800005 6.200000 -26.200012\nv 11.800005 8.200000 -26.200012\nv 11.800004 8.200000 -24.200012\nv 9.800005 8.200000 -24.200012\nv 9.800005 8.200000 -26.200012\nv 15.400006 6.200000 -26.200012\nv 15.400006 6.200000 -24.200012\nv 13.400006 6.200000 -24.200012\nv 13.400006 6.200000 -26.200012\nv 15.400007 8.200000 -26.200012\nv 15.400005 8.200000 -24.200012\nv 13.400006 8.200000 -24.200012\nv 13.400006 8.200000 -26.200012\nv 19.000008 6.200000 -26.200012\nv 19.000008 6.200000 -24.200012\nv 17.000008 6.200000 -24.200012\nv 17.000008 6.200000 -26.200012\nv 19.000008 8.200000 -26.200012\nv 19.000008 8.200000 -24.200012\nv 17.000008 8.200000 -24.200012\nv 17.000008 8.200000 -26.200012\nv 22.600010 6.200000 -26.200012\nv 22.600010 6.200000 -24.200012\nv 20.600010 6.200000 -24.200012\nv 20.600010 6.200000 -26.200012\nv 22.600010 8.200000 -26.200012\nv 22.600010 8.200000 -24.200012\nv 20.600010 8.200000 -24.200012\nv 20.600010 8.200000 -26.200012\nv 26.200012 6.200000 -26.200012\nv 26.200012 6.200000 -24.200012\nv 24.200012 6.200000 -24.200012\nv 24.200012 6.200000 -26.200012\nv 26.200012 8.200000 -26.200012\nv 26.200012 8.200000 -24.200012\nv 24.200012 8.200000 -24.200012\nv 24.200012 8.200000 -26.200012\nv 29.800014 6.200000 -26.200012\nv 29.800014 6.200000 -24.200012\nv 27.800014 6.200000 -24.200012\nv 27.800014 6.200000 -26.200012\nv 29.800014 8.200000 -26.200012\nv 29.800014 8.200000 -24.200012\nv 27.800014 8.200000 -24.200012\nv 27.800014 8.200000 -26.200012\nv 33.400017 6.200000 -26.200012\nv 33.400017 6.200000 -24.200012\nv 31.400017 6.200000 -24.200012\nv 31.400017 6.200000 -26.200012\nv 33.400017 8.200000 -26.200012\nv 33.400017 8.200000 -24.200012\nv 31.400017 8.200000 -24.200012\nv 31.400017 8.200000 -26.200012\nv 1.000000 6.200000 -29.800014\nv 1.000000 6.200000 -27.800014\nv -1.000000 6.200000 -27.800014\nv -1.000000 6.200000 -29.800014\nv 1.000000 8.200000 -29.800014\nv 0.999999 8.200000 -27.800014\nv -1.000000 8.200000 -27.800014\nv -1.000000 8.200000 -29.800014\nv 4.600001 6.200000 -29.800014\nv 4.600001 6.200000 -27.800014\nv 2.600001 6.200000 -27.800014\nv 2.600002 6.200000 -29.800014\nv 4.600002 8.200000 -29.800014\nv 4.600001 8.200000 -27.800014\nv 2.600001 8.200000 -27.800014\nv 2.600002 8.200000 -29.800014\nv 8.200003 6.200000 -29.800014\nv 8.200003 6.200000 -27.800014\nv 6.200003 6.200000 -27.800014\nv 6.200004 6.200000 -29.800014\nv 8.200004 8.200000 -29.800014\nv 8.200003 8.200000 -27.800014\nv 6.200003 8.200000 -27.800014\nv 6.200003 8.200000 -29.800014\nv 11.800005 6.200000 -29.800014\nv 11.800005 6.200000 -27.800014\nv 9.800005 6.200000 -27.800014\nv 9.800005 6.200000 -29.800014\nv 11.800005 8.200000 -29.800014\nv 11.800004 8.200000 -27.800014\nv 9.800005 8.200000 -27.800014\nv 9.800005 8.200000 -29.800014\nv 15.400006 6.200000 -29.800014\nv 15.400006 6.200000 -27.800014\nv 13.400006 6.200000 -27.800014\nv 13.400006 6.200000 -29.800014\nv 15.400007 8.200000 -29.800014\nv 15.400005 8.200000 -27.800014\nv 13.400006 8.200000 -27.800014\nv 13.400006 8.200000 -29.800014\nv 19.000008 6.200000 -29.800014\nv 19.000008 6.200000 -27.800014\nv 17.000008 6.200000 -27.800014\nv 17.000008 6.200000 -29.800014\nv 19.000008 8.200000 -29.800014\nv 19.000008 8.200000 -27.800014\nv 17.000008 8.200000 -27.800014\nv 17.000008 8.200000 -29.800014\nv 22.600010 6.200000 -29.800014\nv 22.600010 6.200000 -27.800014\nv 20.600010 6.200000 -27.800014\nv 20.600010 6.200000 -29.800014\nv 22.600010 8.200000 -29.800014\nv 22.600010 8.200000 -27.800014\nv 20.600010 8.200000 -27.800014\nv 20.600010 8.200000 -29.800014\nv 26.200012 6.200000 -29.800014\nv 26.200012 6.200000 -27.800014\nv 24.200012 6.200000 -27.800014\nv 24.200012 6.200000 -29.800014\nv 26.200012 8.200000 -29.800014\nv 26.200012 8.200000 -27.800014\nv 24.200012 8.200000 -27.800014\nv 24.200012 8.200000 -29.800014\nv 29.800014 6.200000 -29.800014\nv 29.800014 6.200000 -27.800014\nv 27.800014 6.200000 -27.800014\nv 27.800014 6.200000 -29.800014\nv 29.800014 8.200000 -29.800014\nv 29.800014 8.200000 -27.800014\nv 27.800014 8.200000 -27.800014\nv 27.800014 8.200000 -29.800014\nv 33.400017 6.200000 -29.800014\nv 33.400017 6.200000 -27.800014\nv 31.400017 6.200000 -27.800014\nv 31.400017 6.200000 -29.800014\nv 33.400017 8.200000 -29.800014\nv 33.400017 8.200000 -27.800014\nv 31.400017 8.200000 -27.800014\nv 31.400017 8.200000 -29.800014\nv 1.000000 6.200000 -33.400017\nv 1.000000 6.200000 -31.400017\nv -1.000000 6.200000 -31.400017\nv -1.000000 6.200000 -33.400017\nv 1.000000 8.200000 -33.400017\nv 0.999999 8.200000 -31.400017\nv -1.000000 8.200000 -31.400017\nv -1.000000 8.200000 -33.400017\nv 4.600001 6.200000 -33.400017\nv 4.600001 6.200000 -31.400017\nv 2.600001 6.200000 -31.400017\nv 2.600002 6.200000 -33.400017\nv 4.600002 8.200000 -33.400017\nv 4.600001 8.200000 -31.400017\nv 2.600001 8.200000 -31.400017\nv 2.600002 8.200000 -33.400017\nv 8.200003 6.200000 -33.400017\nv 8.200003 6.200000 -31.400017\nv 6.200003 6.200000 -31.400017\nv 6.200004 6.200000 -33.400017\nv 8.200004 8.200000 -33.400017\nv 8.200003 8.200000 -31.400017\nv 6.200003 8.200000 -31.400017\nv 6.200003 8.200000 -33.400017\nv 11.800005 6.200000 -33.400017\nv 11.800005 6.200000 -31.400017\nv 9.800005 6.200000 -31.400017\nv 9.800005 6.200000 -33.400017\nv 11.800005 8.200000 -33.400017\nv 11.800004 8.200000 -31.400017\nv 9.800005 8.200000 -31.400017\nv 9.800005 8.200000 -33.400017\nv 15.400006 6.200000 -33.400017\nv 15.400006 6.200000 -31.400017\nv 13.400006 6.200000 -31.400017\nv 13.400006 6.200000 -33.400017\nv 15.400007 8.200000 -33.400017\nv 15.400005 8.200000 -31.400017\nv 13.400006 8.200000 -31.400017\nv 13.400006 8.200000 -33.400017\nv 19.000008 6.200000 -33.400017\nv 19.000008 6.200000 -31.400017\nv 17.000008 6.200000 -31.400017\nv 17.000008 6.200000 -33.400017\nv 19.000008 8.200000 -33.400017\nv 19.000008 8.200000 -31.400017\nv 17.000008 8.200000 -31.400017\nv 17.000008 8.200000 -33.400017\nv 22.600010 6.200000 -33.400017\nv 22.600010 6.200000 -31.400017\nv 20.600010 6.200000 -31.400017\nv 20.600010 6.200000 -33.400017\nv 22.600010 8.200000 -33.400017\nv 22.600010 8.200000 -31.400017\nv 20.600010 8.200000 -31.400017\nv 20.600010 8.200000 -33.400017\nv 26.200012 6.200000 -33.400017\nv 26.200012 6.200000 -31.400017\nv 24.200012 6.200000 -31.400017\nv 24.200012 6.200000 -33.400017\nv 26.200012 8.200000 -33.400017\nv 26.200012 8.200000 -31.400017\nv 24.200012 8.200000 -31.400017\nv 24.200012 8.200000 -33.400017\nv 29.800014 6.200000 -33.400017\nv 29.800014 6.200000 -31.400017\nv 27.800014 6.200000 -31.400017\nv 27.800014 6.200000 -33.400017\nv 29.800014 8.200000 -33.400017\nv 29.800014 8.200000 -31.400017\nv 27.800014 8.200000 -31.400017\nv 27.800014 8.200000 -33.400017\nv 33.400017 6.200000 -33.400017\nv 33.400017 6.200000 -31.400017\nv 31.400017 6.200000 -31.400017\nv 31.400017 6.200000 -33.400017\nv 33.400017 8.200000 -33.400017\nv 33.400017 8.200000 -31.400017\nv 31.400017 8.200000 -31.400017\nv 31.400017 8.200000 -33.400017\nv -1.000000 6.200000 -1.000000\nv -1.000000 6.200000 1.000000\nv 1.000000 6.200000 1.000000\nv 1.000000 6.200000 -1.000000\nv -1.000000 8.200000 -0.999999\nv -0.999999 8.200000 1.000001\nv 1.000000 8.200000 1.000000\nv 1.000000 8.200000 -1.000000\nv -4.600001 6.200000 -1.000000\nv -4.600001 6.200000 1.000000\nv -2.600001 6.200000 1.000000\nv -2.600002 6.200000 -1.000000\nv -4.600002 8.200000 -0.999999\nv -4.600001 8.200000 1.000001\nv -2.600001 8.200000 1.000000\nv -2.600002 8.200000 -1.000000\nv -8.200003 6.200000 -1.000000\nv -8.200003 6.200000 1.000000\nv -6.200003 6.200000 1.000000\nv -6.200004 6.200000 -1.000000\nv -8.200004 8.200000 -0.999999\nv -8.200003 8.200000 1.000001\nv -6.200003 8.200000 1.000000\nv -6.200003 8.200000 -1.000000\nv -11.800005 6.200000 -1.000000\nv -11.800005 6.200000 1.000000\nv -9.800005 6.200000 1.000000\nv -9.800005 6.200000 -1.000000\nv -11.800005 8.200000 -0.999999\nv -11.800004 8.200000 1.000001\nv -9.800005 8.200000 1.000000\nv -9.800005 8.200000 -1.000000\nv -15.400006 6.200000 -1.000000\nv -15.400006 6.200000 1.000000\nv -13.400006 6.200000 1.000000\nv -13.400006 6.200000 -1.000000\nv -15.400007 8.200000 -0.999999\nv -15.400005 8.200000 1.000001\nv -13.400006 8.200000 1.000000\nv -13.400006 8.200000 -1.000000\nv -19.000008 6.200000 -1.000000\nv -19.000008 6.200000 1.000000\nv -17.000008 6.200000 1.000000\nv -17.000008 6.200000 -1.000000\nv -19.000008 8.200000 -0.999999\nv -19.000008 8.200000 1.000001\nv -17.000008 8.200000 1.000000\nv -17.000008 8.200000 -1.000000\nv -22.600010 6.200000 -1.000000\nv -22.600010 6.200000 1.000000\nv -20.600010 6.200000 1.000000\nv -20.600010 6.200000 -1.000000\nv -22.600010 8.200000 -0.999999\nv -22.600010 8.200000 1.000001\nv -20.600010 8.200000 1.000000\nv -20.600010 8.200000 -1.000000\nv -26.200012 6.200000 -1.000000\nv -26.200012 6.200000 1.000000\nv -24.200012 6.200000 1.000000\nv -24.200012 6.200000 -1.000000\nv -26.200012 8.200000 -0.999999\nv -26.200012 8.200000 1.000001\nv -24.200012 8.200000 1.000000\nv -24.200012 8.200000 -1.000000\nv -29.800014 6.200000 -1.000000\nv -29.800014 6.200000 1.000000\nv -27.800014 6.200000 1.000000\nv -27.800014 6.200000 -1.000000\nv -29.800014 8.200000 -0.999999\nv -29.800014 8.200000 1.000001\nv -27.800014 8.200000 1.000000\nv -27.800014 8.200000 -1.000000\nv -33.400017 6.200000 -1.000000\nv -33.400017 6.200000 1.000000\nv -31.400017 6.200000 1.000000\nv -31.400017 6.200000 -1.000000\nv -33.400017 8.200000 -0.999999\nv -33.400017 8.200000 1.000001\nv -31.400017 8.200000 1.000000\nv -31.400017 8.200000 -1.000000\nv -1.000000 6.200000 -4.600001\nv -1.000000 6.200000 -2.600002\nv 1.000000 6.200000 -2.600002\nv 1.000000 6.200000 -4.600002\nv -1.000000 8.200000 -4.600001\nv -0.999999 8.200000 -2.600001\nv 1.000000 8.200000 -2.600002\nv 1.000000 8.200000 -4.600001\nv -4.600001 6.200000 -4.600001\nv -4.600001 6.200000 -2.600002\nv -2.600001 6.200000 -2.600002\nv -2.600002 6.200000 -4.600002\nv -4.600002 8.200000 -4.600001\nv -4.600001 8.200000 -2.600001\nv -2.600001 8.200000 -2.600002\nv -2.600002 8.200000 -4.600001\nv -8.200003 6.200000 -4.600001\nv -8.200003 6.200000 -2.600002\nv -6.200003 6.200000 -2.600002\nv -6.200004 6.200000 -4.600002\nv -8.200004 8.200000 -4.600001\nv -8.200003 8.200000 -2.600001\nv -6.200003 8.200000 -2.600002\nv -6.200003 8.200000 -4.600001\nv -11.800005 6.200000 -4.600001\nv -11.800005 6.200000 -2.600002\nv -9.800005 6.200000 -2.600002\nv -9.800005 6.200000 -4.600002\nv -11.800005 8.200000 -4.600001\nv -11.800004 8.200000 -2.600001\nv -9.800005 8.200000 -2.600002\nv -9.800005 8.200000 -4.600001\nv -15.400006 6.200000 -4.600001\nv -15.400006 6.200000 -2.600002\nv -13.400006 6.200000 -2.600002\nv -13.400006 6.200000 -4.600002\nv -15.400007 8.200000 -4.600001\nv -15.400005 8.200000 -2.600001\nv -13.400006 8.200000 -2.600002\nv -13.400006 8.200000 -4.600001\nv -19.000008 6.200000 -4.600001\nv -19.000008 6.200000 -2.600002\nv -17.000008 6.200000 -2.600002\nv -17.000008 6.200000 -4.600002\nv -19.000008 8.200000 -4.600001\nv -19.000008 8.200000 -2.600001\nv -17.000008 8.200000 -2.600002\nv -17.000008 8.200000 -4.600001\nv -22.600010 6.200000 -4.600001\nv -22.600010 6.200000 -2.600002\nv -20.600010 6.200000 -2.600002\nv -20.600010 6.200000 -4.600002\nv -22.600010 8.200000 -4.600001\nv -22.600010 8.200000 -2.600001\nv -20.600010 8.200000 -2.600002\nv -20.600010 8.200000 -4.600001\nv -26.200012 6.200000 -4.600001\nv -26.200012 6.200000 -2.600002\nv -24.200012 6.200000 -2.600002\nv -24.200012 6.200000 -4.600002\nv -26.200012 8.200000 -4.600001\nv -26.200012 8.200000 -2.600001\nv -24.200012 8.200000 -2.600002\nv -24.200012 8.200000 -4.600001\nv -29.800014 6.200000 -4.600001\nv -29.800014 6.200000 -2.600002\nv -27.800014 6.200000 -2.600002\nv -27.800014 6.200000 -4.600002\nv -29.800014 8.200000 -4.600001\nv -29.800014 8.200000 -2.600001\nv -27.800014 8.200000 -2.600002\nv -27.800014 8.200000 -4.600001\nv -33.400017 6.200000 -4.600001\nv -33.400017 6.200000 -2.600002\nv -31.400017 6.200000 -2.600002\nv -31.400017 6.200000 -4.600002\nv -33.400017 8.200000 -4.600001\nv -33.400017 8.200000 -2.600001\nv -31.400017 8.200000 -2.600002\nv -31.400017 8.200000 -4.600001\nv -1.000000 6.200000 -8.200003\nv -1.000000 6.200000 -6.200003\nv 1.000000 6.200000 -6.200003\nv 1.000000 6.200000 -8.200004\nv -1.000000 8.200000 -8.200003\nv -0.999999 8.200000 -6.200003\nv 1.000000 8.200000 -6.200004\nv 1.000000 8.200000 -8.200003\nv -4.600001 6.200000 -8.200003\nv -4.600001 6.200000 -6.200003\nv -2.600001 6.200000 -6.200003\nv -2.600002 6.200000 -8.200004\nv -4.600002 8.200000 -8.200003\nv -4.600001 8.200000 -6.200003\nv -2.600001 8.200000 -6.200004\nv -2.600002 8.200000 -8.200003\nv -8.200003 6.200000 -8.200003\nv -8.200003 6.200000 -6.200003\nv -6.200003 6.200000 -6.200003\nv -6.200004 6.200000 -8.200004\nv -8.200004 8.200000 -8.200003\nv -8.200003 8.200000 -6.200003\nv -6.200003 8.200000 -6.200004\nv -6.200003 8.200000 -8.200003\nv -11.800005 6.200000 -8.200003\nv -11.800005 6.200000 -6.200003\nv -9.800005 6.200000 -6.200003\nv -9.800005 6.200000 -8.200004\nv -11.800005 8.200000 -8.200003\nv -11.800004 8.200000 -6.200003\nv -9.800005 8.200000 -6.200004\nv -9.800005 8.200000 -8.200003\nv -15.400006 6.200000 -8.200003\nv -15.400006 6.200000 -6.200003\nv -13.400006 6.200000 -6.200003\nv -13.400006 6.200000 -8.200004\nv -15.400007 8.200000 -8.200003\nv -15.400005 8.200000 -6.200003\nv -13.400006 8.200000 -6.200004\nv -13.400006 8.200000 -8.200003\nv -19.000008 6.200000 -8.200003\nv -19.000008 6.200000 -6.200003\nv -17.000008 6.200000 -6.200003\nv -17.000008 6.200000 -8.200004\nv -19.000008 8.200000 -8.200003\nv -19.000008 8.200000 -6.200003\nv -17.000008 8.200000 -6.200004\nv -17.000008 8.200000 -8.200003\nv -22.600010 6.200000 -8.200003\nv -22.600010 6.200000 -6.200003\nv -20.600010 6.200000 -6.200003\nv -20.600010 6.200000 -8.200004\nv -22.600010 8.200000 -8.200003\nv -22.600010 8.200000 -6.200003\nv -20.600010 8.200000 -6.200004\nv -20.600010 8.200000 -8.200003\nv -26.200012 6.200000 -8.200003\nv -26.200012 6.200000 -6.200003\nv -24.200012 6.200000 -6.200003\nv -24.200012 6.200000 -8.200004\nv -26.200012 8.200000 -8.200003\nv -26.200012 8.200000 -6.200003\nv -24.200012 8.200000 -6.200004\nv -24.200012 8.200000 -8.200003\nv -29.800014 6.200000 -8.200003\nv -29.800014 6.200000 -6.200003\nv -27.800014 6.200000 -6.200003\nv -27.800014 6.200000 -8.200004\nv -29.800014 8.200000 -8.200003\nv -29.800014 8.200000 -6.200003\nv -27.800014 8.200000 -6.200004\nv -27.800014 8.200000 -8.200003\nv -33.400017 6.200000 -8.200003\nv -33.400017 6.200000 -6.200003\nv -31.400017 6.200000 -6.200003\nv -31.400017 6.200000 -8.200004\nv -33.400017 8.200000 -8.200003\nv -33.400017 8.200000 -6.200003\nv -31.400017 8.200000 -6.200004\nv -31.400017 8.200000 -8.200003\nv -1.000000 6.200000 -11.800005\nv -1.000000 6.200000 -9.800005\nv 1.000000 6.200000 -9.800005\nv 1.000000 6.200000 -11.800005\nv -1.000000 8.200000 -11.800004\nv -0.999999 8.200000 -9.800004\nv 1.000000 8.200000 -9.800005\nv 1.000000 8.200000 -11.800005\nv -4.600001 6.200000 -11.800005\nv -4.600001 6.200000 -9.800005\nv -2.600001 6.200000 -9.800005\nv -2.600002 6.200000 -11.800005\nv -4.600002 8.200000 -11.800004\nv -4.600001 8.200000 -9.800004\nv -2.600001 8.200000 -9.800005\nv -2.600002 8.200000 -11.800005\nv -8.200003 6.200000 -11.800005\nv -8.200003 6.200000 -9.800005\nv -6.200003 6.200000 -9.800005\nv -6.200004 6.200000 -11.800005\nv -8.200004 8.200000 -11.800004\nv -8.200003 8.200000 -9.800004\nv -6.200003 8.200000 -9.800005\nv -6.200003 8.200000 -11.800005\nv -11.800005 6.200000 -11.800005\nv -11.800005 6.200000 -9.800005\nv -9.800005 6.200000 -9.800005\nv -9.800005 6.200000 -11.800005\nv -11.800005 8.200000 -11.800004\nv -11.800004 8.200000 -9.800004\nv -9.800005 8.200000 -9.800005\nv -9.800005 8.200000 -11.800005\nv -15.400006 6.200000 -11.800005\nv -15.400006 6.200000 -9.800005\nv -13.400006 6.200000 -9.800005\nv -13.400006 6.200000 -11.800005\nv -15.400007 8.200000 -11.800004\nv -15.400005 8.200000 -9.800004\nv -13.400006 8.200000 -9.800005\nv -13.400006 8.200000 -11.800005\nv -19.000008 6.200000 -11.800005\nv -19.000008 6.200000 -9.800005\nv -17.000008 6.200000 -9.800005\nv -17.000008 6.200000 -11.800005\nv -19.000008 8.200000 -11.800004\nv -19.000008 8.200000 -9.800004\nv -17.000008 8.200000 -9.800005\nv -17.000008 8.200000 -11.800005\nv -22.600010 6.200000 -11.800005\nv -22.600010 6.200000 -9.800005\nv -20.600010 6.200000 -9.800005\nv -20.600010 6.200000 -11.800005\nv -22.600010 8.200000 -11.800004\nv -22.600010 8.200000 -9.800004\nv -20.600010 8.200000 -9.800005\nv -20.600010 8.200000 -11.800005\nv -26.200012 6.200000 -11.800005\nv -26.200012 6.200000 -9.800005\nv -24.200012 6.200000 -9.800005\nv -24.200012 6.200000 -11.800005\nv -26.200012 8.200000 -11.800004\nv -26.200012 8.200000 -9.800004\nv -24.200012 8.200000 -9.800005\nv -24.200012 8.200000 -11.800005\nv -29.800014 6.200000 -11.800005\nv -29.800014 6.200000 -9.800005\nv -27.800014 6.200000 -9.800005\nv -27.800014 6.200000 -11.800005\nv -29.800014 8.200000 -11.800004\nv -29.800014 8.200000 -9.800004\nv -27.800014 8.200000 -9.800005\nv -27.800014 8.200000 -11.800005\nv -33.400017 6.200000 -11.800005\nv -33.400017 6.200000 -9.800005\nv -31.400017 6.200000 -9.800005\nv -31.400017 6.200000 -11.800005\nv -33.400017 8.200000 -11.800004\nv -33.400017 8.200000 -9.800004\nv -31.400017 8.200000 -9.800005\nv -31.400017 8.200000 -11.800005\nv -1.000000 6.200000 -15.400006\nv -1.000000 6.200000 -13.400006\nv 1.000000 6.200000 -13.400006\nv 1.000000 6.200000 -15.400006\nv -1.000000 8.200000 -15.400005\nv -0.999999 8.200000 -13.400005\nv 1.000000 8.200000 -13.400006\nv 1.000000 8.200000 -15.400006\nv -4.600001 6.200000 -15.400006\nv -4.600001 6.200000 -13.400006\nv -2.600001 6.200000 -13.400006\nv -2.600002 6.200000 -15.400006\nv -4.600002 8.200000 -15.400005\nv -4.600001 8.200000 -13.400005\nv -2.600001 8.200000 -13.400006\nv -2.600002 8.200000 -15.400006\nv -8.200003 6.200000 -15.400006\nv -8.200003 6.200000 -13.400006\nv -6.200003 6.200000 -13.400006\nv -6.200004 6.200000 -15.400006\nv -8.200004 8.200000 -15.400005\nv -8.200003 8.200000 -13.400005\nv -6.200003 8.200000 -13.400006\nv -6.200003 8.200000 -15.400006\nv -11.800005 6.200000 -15.400006\nv -11.800005 6.200000 -13.400006\nv -9.800005 6.200000 -13.400006\nv -9.800005 6.200000 -15.400006\nv -11.800005 8.200000 -15.400005\nv -11.800004 8.200000 -13.400005\nv -9.800005 8.200000 -13.400006\nv -9.800005 8.200000 -15.400006\nv -15.400006 6.200000 -15.400006\nv -15.400006 6.200000 -13.400006\nv -13.400006 6.200000 -13.400006\nv -13.400006 6.200000 -15.400006\nv -15.400007 8.200000 -15.400005\nv -15.400005 8.200000 -13.400005\nv -13.400006 8.200000 -13.400006\nv -13.400006 8.200000 -15.400006\nv -19.000008 6.200000 -15.400006\nv -19.000008 6.200000 -13.400006\nv -17.000008 6.200000 -13.400006\nv -17.000008 6.200000 -15.400006\nv -19.000008 8.200000 -15.400005\nv -19.000008 8.200000 -13.400005\nv -17.000008 8.200000 -13.400006\nv -17.000008 8.200000 -15.400006\nv -22.600010 6.200000 -15.400006\nv -22.600010 6.200000 -13.400006\nv -20.600010 6.200000 -13.400006\nv -20.600010 6.200000 -15.400006\nv -22.600010 8.200000 -15.400005\nv -22.600010 8.200000 -13.400005\nv -20.600010 8.200000 -13.400006\nv -20.600010 8.200000 -15.400006\nv -26.200012 6.200000 -15.400006\nv -26.200012 6.200000 -13.400006\nv -24.200012 6.200000 -13.400006\nv -24.200012 6.200000 -15.400006\nv -26.200012 8.200000 -15.400005\nv -26.200012 8.200000 -13.400005\nv -24.200012 8.200000 -13.400006\nv -24.200012 8.200000 -15.400006\nv -29.800014 6.200000 -15.400006\nv -29.800014 6.200000 -13.400006\nv -27.800014 6.200000 -13.400006\nv -27.800014 6.200000 -15.400006\nv -29.800014 8.200000 -15.400005\nv -29.800014 8.200000 -13.400005\nv -27.800014 8.200000 -13.400006\nv -27.800014 8.200000 -15.400006\nv -33.400017 6.200000 -15.400006\nv -33.400017 6.200000 -13.400006\nv -31.400017 6.200000 -13.400006\nv -31.400017 6.200000 -15.400006\nv -33.400017 8.200000 -15.400005\nv -33.400017 8.200000 -13.400005\nv -31.400017 8.200000 -13.400006\nv -31.400017 8.200000 -15.400006\nv -1.000000 6.200000 -19.000008\nv -1.000000 6.200000 -17.000008\nv 1.000000 6.200000 -17.000008\nv 1.000000 6.200000 -19.000008\nv -1.000000 8.200000 -19.000008\nv -0.999999 8.200000 -17.000008\nv 1.000000 8.200000 -17.000008\nv 1.000000 8.200000 -19.000008\nv -4.600001 6.200000 -19.000008\nv -4.600001 6.200000 -17.000008\nv -2.600001 6.200000 -17.000008\nv -2.600002 6.200000 -19.000008\nv -4.600002 8.200000 -19.000008\nv -4.600001 8.200000 -17.000008\nv -2.600001 8.200000 -17.000008\nv -2.600002 8.200000 -19.000008\nv -8.200003 6.200000 -19.000008\nv -8.200003 6.200000 -17.000008\nv -6.200003 6.200000 -17.000008\nv -6.200004 6.200000 -19.000008\nv -8.200004 8.200000 -19.000008\nv -8.200003 8.200000 -17.000008\nv -6.200003 8.200000 -17.000008\nv -6.200003 8.200000 -19.000008\nv -11.800005 6.200000 -19.000008\nv -11.800005 6.200000 -17.000008\nv -9.800005 6.200000 -17.000008\nv -9.800005 6.200000 -19.000008\nv -11.800005 8.200000 -19.000008\nv -11.800004 8.200000 -17.000008\nv -9.800005 8.200000 -17.000008\nv -9.800005 8.200000 -19.000008\nv -15.400006 6.200000 -19.000008\nv -15.400006 6.200000 -17.000008\nv -13.400006 6.200000 -17.000008\nv -13.400006 6.200000 -19.000008\nv -15.400007 8.200000 -19.000008\nv -15.400005 8.200000 -17.000008\nv -13.400006 8.200000 -17.000008\nv -13.400006 8.200000 -19.000008\nv -19.000008 6.200000 -19.000008\nv -19.000008 6.200000 -17.000008\nv -17.000008 6.200000 -17.000008\nv -17.000008 6.200000 -19.000008\nv -19.000008 8.200000 -19.000008\nv -19.000008 8.200000 -17.000008\nv -17.000008 8.200000 -17.000008\nv -17.000008 8.200000 -19.000008\nv -22.600010 6.200000 -19.000008\nv -22.600010 6.200000 -17.000008\nv -20.600010 6.200000 -17.000008\nv -20.600010 6.200000 -19.000008\nv -22.600010 8.200000 -19.000008\nv -22.600010 8.200000 -17.000008\nv -20.600010 8.200000 -17.000008\nv -20.600010 8.200000 -19.000008\nv -26.200012 6.200000 -19.000008\nv -26.200012 6.200000 -17.000008\nv -24.200012 6.200000 -17.000008\nv -24.200012 6.200000 -19.000008\nv -26.200012 8.200000 -19.000008\nv -26.200012 8.200000 -17.000008\nv -24.200012 8.200000 -17.000008\nv -24.200012 8.200000 -19.000008\nv -29.800014 6.200000 -19.000008\nv -29.800014 6.200000 -17.000008\nv -27.800014 6.200000 -17.000008\nv -27.800014 6.200000 -19.000008\nv -29.800014 8.200000 -19.000008\nv -29.800014 8.200000 -17.000008\nv -27.800014 8.200000 -17.000008\nv -27.800014 8.200000 -19.000008\nv -33.400017 6.200000 -19.000008\nv -33.400017 6.200000 -17.000008\nv -31.400017 6.200000 -17.000008\nv -31.400017 6.200000 -19.000008\nv -33.400017 8.200000 -19.000008\nv -33.400017 8.200000 -17.000008\nv -31.400017 8.200000 -17.000008\nv -31.400017 8.200000 -19.000008\nv -1.000000 6.200000 -22.600010\nv -1.000000 6.200000 -20.600010\nv 1.000000 6.200000 -20.600010\nv 1.000000 6.200000 -22.600010\nv -1.000000 8.200000 -22.600010\nv -0.999999 8.200000 -20.600010\nv 1.000000 8.200000 -20.600010\nv 1.000000 8.200000 -22.600010\nv -4.600001 6.200000 -22.600010\nv -4.600001 6.200000 -20.600010\nv -2.600001 6.200000 -20.600010\nv -2.600002 6.200000 -22.600010\nv -4.600002 8.200000 -22.600010\nv -4.600001 8.200000 -20.600010\nv -2.600001 8.200000 -20.600010\nv -2.600002 8.200000 -22.600010\nv -8.200003 6.200000 -22.600010\nv -8.200003 6.200000 -20.600010\nv -6.200003 6.200000 -20.600010\nv -6.200004 6.200000 -22.600010\nv -8.200004 8.200000 -22.600010\nv -8.200003 8.200000 -20.600010\nv -6.200003 8.200000 -20.600010\nv -6.200003 8.200000 -22.600010\nv -11.800005 6.200000 -22.600010\nv -11.800005 6.200000 -20.600010\nv -9.800005 6.200000 -20.600010\nv -9.800005 6.200000 -22.600010\nv -11.800005 8.200000 -22.600010\nv -11.800004 8.200000 -20.600010\nv -9.800005 8.200000 -20.600010\nv -9.800005 8.200000 -22.600010\nv -15.400006 6.200000 -22.600010\nv -15.400006 6.200000 -20.600010\nv -13.400006 6.200000 -20.600010\nv -13.400006 6.200000 -22.600010\nv -15.400007 8.200000 -22.600010\nv -15.400005 8.200000 -20.600010\nv -13.400006 8.200000 -20.600010\nv -13.400006 8.200000 -22.600010\nv -19.000008 6.200000 -22.600010\nv -19.000008 6.200000 -20.600010\nv -17.000008 6.200000 -20.600010\nv -17.000008 6.200000 -22.600010\nv -19.000008 8.200000 -22.600010\nv -19.000008 8.200000 -20.600010\nv -17.000008 8.200000 -20.600010\nv -17.000008 8.200000 -22.600010\nv -22.600010 6.200000 -22.600010\nv -22.600010 6.200000 -20.600010\nv -20.600010 6.200000 -20.600010\nv -20.600010 6.200000 -22.600010\nv -22.600010 8.200000 -22.600010\nv -22.600010 8.200000 -20.600010\nv -20.600010 8.200000 -20.600010\nv -20.600010 8.200000 -22.600010\nv -26.200012 6.200000 -22.600010\nv -26.200012 6.200000 -20.600010\nv -24.200012 6.200000 -20.600010\nv -24.200012 6.200000 -22.600010\nv -26.200012 8.200000 -22.600010\nv -26.200012 8.200000 -20.600010\nv -24.200012 8.200000 -20.600010\nv -24.200012 8.200000 -22.600010\nv -29.800014 6.200000 -22.600010\nv -29.800014 6.200000 -20.600010\nv -27.800014 6.200000 -20.600010\nv -27.800014 6.200000 -22.600010\nv -29.800014 8.200000 -22.600010\nv -29.800014 8.200000 -20.600010\nv -27.800014 8.200000 -20.600010\nv -27.800014 8.200000 -22.600010\nv -33.400017 6.200000 -22.600010\nv -33.400017 6.200000 -20.600010\nv -31.400017 6.200000 -20.600010\nv -31.400017 6.200000 -22.600010\nv -33.400017 8.200000 -22.600010\nv -33.400017 8.200000 -20.600010\nv -31.400017 8.200000 -20.600010\nv -31.400017 8.200000 -22.600010\nv -1.000000 6.200000 -26.200012\nv -1.000000 6.200000 -24.200012\nv 1.000000 6.200000 -24.200012\nv 1.000000 6.200000 -26.200012\nv -1.000000 8.200000 -26.200012\nv -0.999999 8.200000 -24.200012\nv 1.000000 8.200000 -24.200012\nv 1.000000 8.200000 -26.200012\nv -4.600001 6.200000 -26.200012\nv -4.600001 6.200000 -24.200012\nv -2.600001 6.200000 -24.200012\nv -2.600002 6.200000 -26.200012\nv -4.600002 8.200000 -26.200012\nv -4.600001 8.200000 -24.200012\nv -2.600001 8.200000 -24.200012\nv -2.600002 8.200000 -26.200012\nv -8.200003 6.200000 -26.200012\nv -8.200003 6.200000 -24.200012\nv -6.200003 6.200000 -24.200012\nv -6.200004 6.200000 -26.200012\nv -8.200004 8.200000 -26.200012\nv -8.200003 8.200000 -24.200012\nv -6.200003 8.200000 -24.200012\nv -6.200003 8.200000 -26.200012\nv -11.800005 6.200000 -26.200012\nv -11.800005 6.200000 -24.200012\nv -9.800005 6.200000 -24.200012\nv -9.800005 6.200000 -26.200012\nv -11.800005 8.200000 -26.200012\nv -11.800004 8.200000 -24.200012\nv -9.800005 8.200000 -24.200012\nv -9.800005 8.200000 -26.200012\nv -15.400006 6.200000 -26.200012\nv -15.400006 6.200000 -24.200012\nv -13.400006 6.200000 -24.200012\nv -13.400006 6.200000 -26.200012\nv -15.400007 8.200000 -26.200012\nv -15.400005 8.200000 -24.200012\nv -13.400006 8.200000 -24.200012\nv -13.400006 8.200000 -26.200012\nv -19.000008 6.200000 -26.200012\nv -19.000008 6.200000 -24.200012\nv -17.000008 6.200000 -24.200012\nv -17.000008 6.200000 -26.200012\nv -19.000008 8.200000 -26.200012\nv -19.000008 8.200000 -24.200012\nv -17.000008 8.200000 -24.200012\nv -17.000008 8.200000 -26.200012\nv -22.600010 6.200000 -26.200012\nv -22.600010 6.200000 -24.200012\nv -20.600010 6.200000 -24.200012\nv -20.600010 6.200000 -26.200012\nv -22.600010 8.200000 -26.200012\nv -22.600010 8.200000 -24.200012\nv -20.600010 8.200000 -24.200012\nv -20.600010 8.200000 -26.200012\nv -26.200012 6.200000 -26.200012\nv -26.200012 6.200000 -24.200012\nv -24.200012 6.200000 -24.200012\nv -24.200012 6.200000 -26.200012\nv -26.200012 8.200000 -26.200012\nv -26.200012 8.200000 -24.200012\nv -24.200012 8.200000 -24.200012\nv -24.200012 8.200000 -26.200012\nv -29.800014 6.200000 -26.200012\nv -29.800014 6.200000 -24.200012\nv -27.800014 6.200000 -24.200012\nv -27.800014 6.200000 -26.200012\nv -29.800014 8.200000 -26.200012\nv -29.800014 8.200000 -24.200012\nv -27.800014 8.200000 -24.200012\nv -27.800014 8.200000 -26.200012\nv -33.400017 6.200000 -26.200012\nv -33.400017 6.200000 -24.200012\nv -31.400017 6.200000 -24.200012\nv -31.400017 6.200000 -26.200012\nv -33.400017 8.200000 -26.200012\nv -33.400017 8.200000 -24.200012\nv -31.400017 8.200000 -24.200012\nv -31.400017 8.200000 -26.200012\nv -1.000000 6.200000 -29.800014\nv -1.000000 6.200000 -27.800014\nv 1.000000 6.200000 -27.800014\nv 1.000000 6.200000 -29.800014\nv -1.000000 8.200000 -29.800014\nv -0.999999 8.200000 -27.800014\nv 1.000000 8.200000 -27.800014\nv 1.000000 8.200000 -29.800014\nv -4.600001 6.200000 -29.800014\nv -4.600001 6.200000 -27.800014\nv -2.600001 6.200000 -27.800014\nv -2.600002 6.200000 -29.800014\nv -4.600002 8.200000 -29.800014\nv -4.600001 8.200000 -27.800014\nv -2.600001 8.200000 -27.800014\nv -2.600002 8.200000 -29.800014\nv -8.200003 6.200000 -29.800014\nv -8.200003 6.200000 -27.800014\nv -6.200003 6.200000 -27.800014\nv -6.200004 6.200000 -29.800014\nv -8.200004 8.200000 -29.800014\nv -8.200003 8.200000 -27.800014\nv -6.200003 8.200000 -27.800014\nv -6.200003 8.200000 -29.800014\nv -11.800005 6.200000 -29.800014\nv -11.800005 6.200000 -27.800014\nv -9.800005 6.200000 -27.800014\nv -9.800005 6.200000 -29.800014\nv -11.800005 8.200000 -29.800014\nv -11.800004 8.200000 -27.800014\nv -9.800005 8.200000 -27.800014\nv -9.800005 8.200000 -29.800014\nv -15.400006 6.200000 -29.800014\nv -15.400006 6.200000 -27.800014\nv -13.400006 6.200000 -27.800014\nv -13.400006 6.200000 -29.800014\nv -15.400007 8.200000 -29.800014\nv -15.400005 8.200000 -27.800014\nv -13.400006 8.200000 -27.800014\nv -13.400006 8.200000 -29.800014\nv -19.000008 6.200000 -29.800014\nv -19.000008 6.200000 -27.800014\nv -17.000008 6.200000 -27.800014\nv -17.000008 6.200000 -29.800014\nv -19.000008 8.200000 -29.800014\nv -19.000008 8.200000 -27.800014\nv -17.000008 8.200000 -27.800014\nv -17.000008 8.200000 -29.800014\nv -22.600010 6.200000 -29.800014\nv -22.600010 6.200000 -27.800014\nv -20.600010 6.200000 -27.800014\nv -20.600010 6.200000 -29.800014\nv -22.600010 8.200000 -29.800014\nv -22.600010 8.200000 -27.800014\nv -20.600010 8.200000 -27.800014\nv -20.600010 8.200000 -29.800014\nv -26.200012 6.200000 -29.800014\nv -26.200012 6.200000 -27.800014\nv -24.200012 6.200000 -27.800014\nv -24.200012 6.200000 -29.800014\nv -26.200012 8.200000 -29.800014\nv -26.200012 8.200000 -27.800014\nv -24.200012 8.200000 -27.800014\nv -24.200012 8.200000 -29.800014\nv -29.800014 6.200000 -29.800014\nv -29.800014 6.200000 -27.800014\nv -27.800014 6.200000 -27.800014\nv -27.800014 6.200000 -29.800014\nv -29.800014 8.200000 -29.800014\nv -29.800014 8.200000 -27.800014\nv -27.800014 8.200000 -27.800014\nv -27.800014 8.200000 -29.800014\nv -33.400017 6.200000 -29.800014\nv -33.400017 6.200000 -27.800014\nv -31.400017 6.200000 -27.800014\nv -31.400017 6.200000 -29.800014\nv -33.400017 8.200000 -29.800014\nv -33.400017 8.200000 -27.800014\nv -31.400017 8.200000 -27.800014\nv -31.400017 8.200000 -29.800014\nv -1.000000 6.200000 -33.400017\nv -1.000000 6.200000 -31.400017\nv 1.000000 6.200000 -31.400017\nv 1.000000 6.200000 -33.400017\nv -1.000000 8.200000 -33.400017\nv -0.999999 8.200000 -31.400017\nv 1.000000 8.200000 -31.400017\nv 1.000000 8.200000 -33.400017\nv -4.600001 6.200000 -33.400017\nv -4.600001 6.200000 -31.400017\nv -2.600001 6.200000 -31.400017\nv -2.600002 6.200000 -33.400017\nv -4.600002 8.200000 -33.400017\nv -4.600001 8.200000 -31.400017\nv -2.600001 8.200000 -31.400017\nv -2.600002 8.200000 -33.400017\nv -8.200003 6.200000 -33.400017\nv -8.200003 6.200000 -31.400017\nv -6.200003 6.200000 -31.400017\nv -6.200004 6.200000 -33.400017\nv -8.200004 8.200000 -33.400017\nv -8.200003 8.200000 -31.400017\nv -6.200003 8.200000 -31.400017\nv -6.200003 8.200000 -33.400017\nv -11.800005 6.200000 -33.400017\nv -11.800005 6.200000 -31.400017\nv -9.800005 6.200000 -31.400017\nv -9.800005 6.200000 -33.400017\nv -11.800005 8.200000 -33.400017\nv -11.800004 8.200000 -31.400017\nv -9.800005 8.200000 -31.400017\nv -9.800005 8.200000 -33.400017\nv -15.400006 6.200000 -33.400017\nv -15.400006 6.200000 -31.400017\nv -13.400006 6.200000 -31.400017\nv -13.400006 6.200000 -33.400017\nv -15.400007 8.200000 -33.400017\nv -15.400005 8.200000 -31.400017\nv -13.400006 8.200000 -31.400017\nv -13.400006 8.200000 -33.400017\nv -19.000008 6.200000 -33.400017\nv -19.000008 6.200000 -31.400017\nv -17.000008 6.200000 -31.400017\nv -17.000008 6.200000 -33.400017\nv -19.000008 8.200000 -33.400017\nv -19.000008 8.200000 -31.400017\nv -17.000008 8.200000 -31.400017\nv -17.000008 8.200000 -33.400017\nv -22.600010 6.200000 -33.400017\nv -22.600010 6.200000 -31.400017\nv -20.600010 6.200000 -31.400017\nv -20.600010 6.200000 -33.400017\nv -22.600010 8.200000 -33.400017\nv -22.600010 8.200000 -31.400017\nv -20.600010 8.200000 -31.400017\nv -20.600010 8.200000 -33.400017\nv -26.200012 6.200000 -33.400017\nv -26.200012 6.200000 -31.400017\nv -24.200012 6.200000 -31.400017\nv -24.200012 6.200000 -33.400017\nv -26.200012 8.200000 -33.400017\nv -26.200012 8.200000 -31.400017\nv -24.200012 8.200000 -31.400017\nv -24.200012 8.200000 -33.400017\nv -29.800014 6.200000 -33.400017\nv -29.800014 6.200000 -31.400017\nv -27.800014 6.200000 -31.400017\nv -27.800014 6.200000 -33.400017\nv -29.800014 8.200000 -33.400017\nv -29.800014 8.200000 -31.400017\nv -27.800014 8.200000 -31.400017\nv -27.800014 8.200000 -33.400017\nv -33.400017 6.200000 -33.400017\nv -33.400017 6.200000 -31.400017\nv -31.400017 6.200000 -31.400017\nv -31.400017 6.200000 -33.400017\nv -33.400017 8.200000 -33.400017\nv -33.400017 8.200000 -31.400017\nv -31.400017 8.200000 -31.400017\nv -31.400017 8.200000 -33.400017\nv 1.000000 9.799999 -1.000000\nv 1.000000 9.799999 1.000000\nv -1.000000 9.799999 1.000000\nv -1.000000 9.799999 -1.000000\nv 1.000000 11.799999 -0.999999\nv 0.999999 11.799999 1.000001\nv -1.000000 11.799999 1.000000\nv -1.000000 11.799999 -1.000000\nv 4.600001 9.799999 -1.000000\nv 4.600001 9.799999 1.000000\nv 2.600001 9.799999 1.000000\nv 2.600002 9.799999 -1.000000\nv 4.600002 11.799999 -0.999999\nv 4.600001 11.799999 1.000001\nv 2.600001 11.799999 1.000000\nv 2.600002 11.799999 -1.000000\nv 8.200003 9.799999 -1.000000\nv 8.200003 9.799999 1.000000\nv 6.200003 9.799999 1.000000\nv 6.200004 9.799999 -1.000000\nv 8.200004 11.799999 -0.999999\nv 8.200003 11.799999 1.000001\nv 6.200003 11.799999 1.000000\nv 6.200003 11.799999 -1.000000\nv 11.800005 9.799999 -1.000000\nv 11.800005 9.799999 1.000000\nv 9.800005 9.799999 1.000000\nv 9.800005 9.799999 -1.000000\nv 11.800005 11.799999 -0.999999\nv 11.800004 11.799999 1.000001\nv 9.800005 11.799999 1.000000\nv 9.800005 11.799999 -1.000000\nv 15.400006 9.799999 -1.000000\nv 15.400006 9.799999 1.000000\nv 13.400006 9.799999 1.000000\nv 13.400006 9.799999 -1.000000\nv 15.400007 11.799999 -0.999999\nv 15.400005 11.799999 1.000001\nv 13.400006 11.799999 1.000000\nv 13.400006 11.799999 -1.000000\nv 19.000008 9.799999 -1.000000\nv 19.000008 9.799999 1.000000\nv 17.000008 9.799999 1.000000\nv 17.000008 9.799999 -1.000000\nv 19.000008 11.799999 -0.999999\nv 19.000008 11.799999 1.000001\nv 17.000008 11.799999 1.000000\nv 17.000008 11.799999 -1.000000\nv 22.600010 9.799999 -1.000000\nv 22.600010 9.799999 1.000000\nv 20.600010 9.799999 1.000000\nv 20.600010 9.799999 -1.000000\nv 22.600010 11.799999 -0.999999\nv 22.600010 11.799999 1.000001\nv 20.600010 11.799999 1.000000\nv 20.600010 11.799999 -1.000000\nv 26.200012 9.799999 -1.000000\nv 26.200012 9.799999 1.000000\nv 24.200012 9.799999 1.000000\nv 24.200012 9.799999 -1.000000\nv 26.200012 11.799999 -0.999999\nv 26.200012 11.799999 1.000001\nv 24.200012 11.799999 1.000000\nv 24.200012 11.799999 -1.000000\nv 29.800014 9.799999 -1.000000\nv 29.800014 9.799999 1.000000\nv 27.800014 9.799999 1.000000\nv 27.800014 9.799999 -1.000000\nv 29.800014 11.799999 -0.999999\nv 29.800014 11.799999 1.000001\nv 27.800014 11.799999 1.000000\nv 27.800014 11.799999 -1.000000\nv 33.400017 9.799999 -1.000000\nv 33.400017 9.799999 1.000000\nv 31.400017 9.799999 1.000000\nv 31.400017 9.799999 -1.000000\nv 33.400017 11.799999 -0.999999\nv 33.400017 11.799999 1.000001\nv 31.400017 11.799999 1.000000\nv 31.400017 11.799999 -1.000000\nv 1.000000 9.799999 -4.600001\nv 1.000000 9.799999 -2.600002\nv -1.000000 9.799999 -2.600002\nv -1.000000 9.799999 -4.600002\nv 1.000000 11.799999 -4.600001\nv 0.999999 11.799999 -2.600001\nv -1.000000 11.799999 -2.600002\nv -1.000000 11.799999 -4.600001\nv 4.600001 9.799999 -4.600001\nv 4.600001 9.799999 -2.600002\nv 2.600001 9.799999 -2.600002\nv 2.600002 9.799999 -4.600002\nv 4.600002 11.799999 -4.600001\nv 4.600001 11.799999 -2.600001\nv 2.600001 11.799999 -2.600002\nv 2.600002 11.799999 -4.600001\nv 8.200003 9.799999 -4.600001\nv 8.200003 9.799999 -2.600002\nv 6.200003 9.799999 -2.600002\nv 6.200004 9.799999 -4.600002\nv 8.200004 11.799999 -4.600001\nv 8.200003 11.799999 -2.600001\nv 6.200003 11.799999 -2.600002\nv 6.200003 11.799999 -4.600001\nv 11.800005 9.799999 -4.600001\nv 11.800005 9.799999 -2.600002\nv 9.800005 9.799999 -2.600002\nv 9.800005 9.799999 -4.600002\nv 11.800005 11.799999 -4.600001\nv 11.800004 11.799999 -2.600001\nv 9.800005 11.799999 -2.600002\nv 9.800005 11.799999 -4.600001\nv 15.400006 9.799999 -4.600001\nv 15.400006 9.799999 -2.600002\nv 13.400006 9.799999 -2.600002\nv 13.400006 9.799999 -4.600002\nv 15.400007 11.799999 -4.600001\nv 15.400005 11.799999 -2.600001\nv 13.400006 11.799999 -2.600002\nv 13.400006 11.799999 -4.600001\nv 19.000008 9.799999 -4.600001\nv 19.000008 9.799999 -2.600002\nv 17.000008 9.799999 -2.600002\nv 17.000008 9.799999 -4.600002\nv 19.000008 11.799999 -4.600001\nv 19.000008 11.799999 -2.600001\nv 17.000008 11.799999 -2.600002\nv 17.000008 11.799999 -4.600001\nv 22.600010 9.799999 -4.600001\nv 22.600010 9.799999 -2.600002\nv 20.600010 9.799999 -2.600002\nv 20.600010 9.799999 -4.600002\nv 22.600010 11.799999 -4.600001\nv 22.600010 11.799999 -2.600001\nv 20.600010 11.799999 -2.600002\nv 20.600010 11.799999 -4.600001\nv 26.200012 9.799999 -4.600001\nv 26.200012 9.799999 -2.600002\nv 24.200012 9.799999 -2.600002\nv 24.200012 9.799999 -4.600002\nv 26.200012 11.799999 -4.600001\nv 26.200012 11.799999 -2.600001\nv 24.200012 11.799999 -2.600002\nv 24.200012 11.799999 -4.600001\nv 29.800014 9.799999 -4.600001\nv 29.800014 9.799999 -2.600002\nv 27.800014 9.799999 -2.600002\nv 27.800014 9.799999 -4.600002\nv 29.800014 11.799999 -4.600001\nv 29.800014 11.799999 -2.600001\nv 27.800014 11.799999 -2.600002\nv 27.800014 11.799999 -4.600001\nv 33.400017 9.799999 -4.600001\nv 33.400017 9.799999 -2.600002\nv 31.400017 9.799999 -2.600002\nv 31.400017 9.799999 -4.600002\nv 33.400017 11.799999 -4.600001\nv 33.400017 11.799999 -2.600001\nv 31.400017 11.799999 -2.600002\nv 31.400017 11.799999 -4.600001\nv 1.000000 9.799999 -8.200003\nv 1.000000 9.799999 -6.200003\nv -1.000000 9.799999 -6.200003\nv -1.000000 9.799999 -8.200004\nv 1.000000 11.799999 -8.200003\nv 0.999999 11.799999 -6.200003\nv -1.000000 11.799999 -6.200004\nv -1.000000 11.799999 -8.200003\nv 4.600001 9.799999 -8.200003\nv 4.600001 9.799999 -6.200003\nv 2.600001 9.799999 -6.200003\nv 2.600002 9.799999 -8.200004\nv 4.600002 11.799999 -8.200003\nv 4.600001 11.799999 -6.200003\nv 2.600001 11.799999 -6.200004\nv 2.600002 11.799999 -8.200003\nv 8.200003 9.799999 -8.200003\nv 8.200003 9.799999 -6.200003\nv 6.200003 9.799999 -6.200003\nv 6.200004 9.799999 -8.200004\nv 8.200004 11.799999 -8.200003\nv 8.200003 11.799999 -6.200003\nv 6.200003 11.799999 -6.200004\nv 6.200003 11.799999 -8.200003\nv 11.800005 9.799999 -8.200003\nv 11.800005 9.799999 -6.200003\nv 9.800005 9.799999 -6.200003\nv 9.800005 9.799999 -8.200004\nv 11.800005 11.799999 -8.200003\nv 11.800004 11.799999 -6.200003\nv 9.800005 11.799999 -6.200004\nv 9.800005 11.799999 -8.200003\nv 15.400006 9.799999 -8.200003\nv 15.400006 9.799999 -6.200003\nv 13.400006 9.799999 -6.200003\nv 13.400006 9.799999 -8.200004\nv 15.400007 11.799999 -8.200003\nv 15.400005 11.799999 -6.200003\nv 13.400006 11.799999 -6.200004\nv 13.400006 11.799999 -8.200003\nv 19.000008 9.799999 -8.200003\nv 19.000008 9.799999 -6.200003\nv 17.000008 9.799999 -6.200003\nv 17.000008 9.799999 -8.200004\nv 19.000008 11.799999 -8.200003\nv 19.000008 11.799999 -6.200003\nv 17.000008 11.799999 -6.200004\nv 17.000008 11.799999 -8.200003\nv 22.600010 9.799999 -8.200003\nv 22.600010 9.799999 -6.200003\nv 20.600010 9.799999 -6.200003\nv 20.600010 9.799999 -8.200004\nv 22.600010 11.799999 -8.200003\nv 22.600010 11.799999 -6.200003\nv 20.600010 11.799999 -6.200004\nv 20.600010 11.799999 -8.200003\nv 26.200012 9.799999 -8.200003\nv 26.200012 9.799999 -6.200003\nv 24.200012 9.799999 -6.200003\nv 24.200012 9.799999 -8.200004\nv 26.200012 11.799999 -8.200003\nv 26.200012 11.799999 -6.200003\nv 24.200012 11.799999 -6.200004\nv 24.200012 11.799999 -8.200003\nv 29.800014 9.799999 -8.200003\nv 29.800014 9.799999 -6.200003\nv 27.800014 9.799999 -6.200003\nv 27.800014 9.799999 -8.200004\nv 29.800014 11.799999 -8.200003\nv 29.800014 11.799999 -6.200003\nv 27.800014 11.799999 -6.200004\nv 27.800014 11.799999 -8.200003\nv 33.400017 9.799999 -8.200003\nv 33.400017 9.799999 -6.200003\nv 31.400017 9.799999 -6.200003\nv 31.400017 9.799999 -8.200004\nv 33.400017 11.799999 -8.200003\nv 33.400017 11.799999 -6.200003\nv 31.400017 11.799999 -6.200004\nv 31.400017 11.799999 -8.200003\nv 1.000000 9.799999 -11.800005\nv 1.000000 9.799999 -9.800005\nv -1.000000 9.799999 -9.800005\nv -1.000000 9.799999 -11.800005\nv 1.000000 11.799999 -11.800004\nv 0.999999 11.799999 -9.800004\nv -1.000000 11.799999 -9.800005\nv -1.000000 11.799999 -11.800005\nv 4.600001 9.799999 -11.800005\nv 4.600001 9.799999 -9.800005\nv 2.600001 9.799999 -9.800005\nv 2.600002 9.799999 -11.800005\nv 4.600002 11.799999 -11.800004\nv 4.600001 11.799999 -9.800004\nv 2.600001 11.799999 -9.800005\nv 2.600002 11.799999 -11.800005\nv 8.200003 9.799999 -11.800005\nv 8.200003 9.799999 -9.800005\nv 6.200003 9.799999 -9.800005\nv 6.200004 9.799999 -11.800005\nv 8.200004 11.799999 -11.800004\nv 8.200003 11.799999 -9.800004\nv 6.200003 11.799999 -9.800005\nv 6.200003 11.799999 -11.800005\nv 11.800005 9.799999 -11.800005\nv 11.800005 9.799999 -9.800005\nv 9.800005 9.799999 -9.800005\nv 9.800005 9.799999 -11.800005\nv 11.800005 11.799999 -11.800004\nv 11.800004 11.799999 -9.800004\nv 9.800005 11.799999 -9.800005\nv 9.800005 11.799999 -11.800005\nv 15.400006 9.799999 -11.800005\nv 15.400006 9.799999 -9.800005\nv 13.400006 9.799999 -9.800005\nv 13.400006 9.799999 -11.800005\nv 15.400007 11.799999 -11.800004\nv 15.400005 11.799999 -9.800004\nv 13.400006 11.799999 -9.800005\nv 13.400006 11.799999 -11.800005\nv 19.000008 9.799999 -11.800005\nv 19.000008 9.799999 -9.800005\nv 17.000008 9.799999 -9.800005\nv 17.000008 9.799999 -11.800005\nv 19.000008 11.799999 -11.800004\nv 19.000008 11.799999 -9.800004\nv 17.000008 11.799999 -9.800005\nv 17.000008 11.799999 -11.800005\nv 22.600010 9.799999 -11.800005\nv 22.600010 9.799999 -9.800005\nv 20.600010 9.799999 -9.800005\nv 20.600010 9.799999 -11.800005\nv 22.600010 11.799999 -11.800004\nv 22.600010 11.799999 -9.800004\nv 20.600010 11.799999 -9.800005\nv 20.600010 11.799999 -11.800005\nv 26.200012 9.799999 -11.800005\nv 26.200012 9.799999 -9.800005\nv 24.200012 9.799999 -9.800005\nv 24.200012 9.799999 -11.800005\nv 26.200012 11.799999 -11.800004\nv 26.200012 11.799999 -9.800004\nv 24.200012 11.799999 -9.800005\nv 24.200012 11.799999 -11.800005\nv 29.800014 9.799999 -11.800005\nv 29.800014 9.799999 -9.800005\nv 27.800014 9.799999 -9.800005\nv 27.800014 9.799999 -11.800005\nv 29.800014 11.799999 -11.800004\nv 29.800014 11.799999 -9.800004\nv 27.800014 11.799999 -9.800005\nv 27.800014 11.799999 -11.800005\nv 33.400017 9.799999 -11.800005\nv 33.400017 9.799999 -9.800005\nv 31.400017 9.799999 -9.800005\nv 31.400017 9.799999 -11.800005\nv 33.400017 11.799999 -11.800004\nv 33.400017 11.799999 -9.800004\nv 31.400017 11.799999 -9.800005\nv 31.400017 11.799999 -11.800005\nv 1.000000 9.799999 -15.400006\nv 1.000000 9.799999 -13.400006\nv -1.000000 9.799999 -13.400006\nv -1.000000 9.799999 -15.400006\nv 1.000000 11.799999 -15.400005\nv 0.999999 11.799999 -13.400005\nv -1.000000 11.799999 -13.400006\nv -1.000000 11.799999 -15.400006\nv 4.600001 9.799999 -15.400006\nv 4.600001 9.799999 -13.400006\nv 2.600001 9.799999 -13.400006\nv 2.600002 9.799999 -15.400006\nv 4.600002 11.799999 -15.400005\nv 4.600001 11.799999 -13.400005\nv 2.600001 11.799999 -13.400006\nv 2.600002 11.799999 -15.400006\nv 8.200003 9.799999 -15.400006\nv 8.200003 9.799999 -13.400006\nv 6.200003 9.799999 -13.400006\nv 6.200004 9.799999 -15.400006\nv 8.200004 11.799999 -15.400005\nv 8.200003 11.799999 -13.400005\nv 6.200003 11.799999 -13.400006\nv 6.200003 11.799999 -15.400006\nv 11.800005 9.799999 -15.400006\nv 11.800005 9.799999 -13.400006\nv 9.800005 9.799999 -13.400006\nv 9.800005 9.799999 -15.400006\nv 11.800005 11.799999 -15.400005\nv 11.800004 11.799999 -13.400005\nv 9.800005 11.799999 -13.400006\nv 9.800005 11.799999 -15.400006\nv 15.400006 9.799999 -15.400006\nv 15.400006 9.799999 -13.400006\nv 13.400006 9.799999 -13.400006\nv 13.400006 9.799999 -15.400006\nv 15.400007 11.799999 -15.400005\nv 15.400005 11.799999 -13.400005\nv 13.400006 11.799999 -13.400006\nv 13.400006 11.799999 -15.400006\nv 19.000008 9.799999 -15.400006\nv 19.000008 9.799999 -13.400006\nv 17.000008 9.799999 -13.400006\nv 17.000008 9.799999 -15.400006\nv 19.000008 11.799999 -15.400005\nv 19.000008 11.799999 -13.400005\nv 17.000008 11.799999 -13.400006\nv 17.000008 11.799999 -15.400006\nv 22.600010 9.799999 -15.400006\nv 22.600010 9.799999 -13.400006\nv 20.600010 9.799999 -13.400006\nv 20.600010 9.799999 -15.400006\nv 22.600010 11.799999 -15.400005\nv 22.600010 11.799999 -13.400005\nv 20.600010 11.799999 -13.400006\nv 20.600010 11.799999 -15.400006\nv 26.200012 9.799999 -15.400006\nv 26.200012 9.799999 -13.400006\nv 24.200012 9.799999 -13.400006\nv 24.200012 9.799999 -15.400006\nv 26.200012 11.799999 -15.400005\nv 26.200012 11.799999 -13.400005\nv 24.200012 11.799999 -13.400006\nv 24.200012 11.799999 -15.400006\nv 29.800014 9.799999 -15.400006\nv 29.800014 9.799999 -13.400006\nv 27.800014 9.799999 -13.400006\nv 27.800014 9.799999 -15.400006\nv 29.800014 11.799999 -15.400005\nv 29.800014 11.799999 -13.400005\nv 27.800014 11.799999 -13.400006\nv 27.800014 11.799999 -15.400006\nv 33.400017 9.799999 -15.400006\nv 33.400017 9.799999 -13.400006\nv 31.400017 9.799999 -13.400006\nv 31.400017 9.799999 -15.400006\nv 33.400017 11.799999 -15.400005\nv 33.400017 11.799999 -13.400005\nv 31.400017 11.799999 -13.400006\nv 31.400017 11.799999 -15.400006\nv 1.000000 9.799999 -19.000008\nv 1.000000 9.799999 -17.000008\nv -1.000000 9.799999 -17.000008\nv -1.000000 9.799999 -19.000008\nv 1.000000 11.799999 -19.000008\nv 0.999999 11.799999 -17.000008\nv -1.000000 11.799999 -17.000008\nv -1.000000 11.799999 -19.000008\nv 4.600001 9.799999 -19.000008\nv 4.600001 9.799999 -17.000008\nv 2.600001 9.799999 -17.000008\nv 2.600002 9.799999 -19.000008\nv 4.600002 11.799999 -19.000008\nv 4.600001 11.799999 -17.000008\nv 2.600001 11.799999 -17.000008\nv 2.600002 11.799999 -19.000008\nv 8.200003 9.799999 -19.000008\nv 8.200003 9.799999 -17.000008\nv 6.200003 9.799999 -17.000008\nv 6.200004 9.799999 -19.000008\nv 8.200004 11.799999 -19.000008\nv 8.200003 11.799999 -17.000008\nv 6.200003 11.799999 -17.000008\nv 6.200003 11.799999 -19.000008\nv 11.800005 9.799999 -19.000008\nv 11.800005 9.799999 -17.000008\nv 9.800005 9.799999 -17.000008\nv 9.800005 9.799999 -19.000008\nv 11.800005 11.799999 -19.000008\nv 11.800004 11.799999 -17.000008\nv 9.800005 11.799999 -17.000008\nv 9.800005 11.799999 -19.000008\nv 15.400006 9.799999 -19.000008\nv 15.400006 9.799999 -17.000008\nv 13.400006 9.799999 -17.000008\nv 13.400006 9.799999 -19.000008\nv 15.400007 11.799999 -19.000008\nv 15.400005 11.799999 -17.000008\nv 13.400006 11.799999 -17.000008\nv 13.400006 11.799999 -19.000008\nv 19.000008 9.799999 -19.000008\nv 19.000008 9.799999 -17.000008\nv 17.000008 9.799999 -17.000008\nv 17.000008 9.799999 -19.000008\nv 19.000008 11.799999 -19.000008\nv 19.000008 11.799999 -17.000008\nv 17.000008 11.799999 -17.000008\nv 17.000008 11.799999 -19.000008\nv 22.600010 9.799999 -19.000008\nv 22.600010 9.799999 -17.000008\nv 20.600010 9.799999 -17.000008\nv 20.600010 9.799999 -19.000008\nv 22.600010 11.799999 -19.000008\nv 22.600010 11.799999 -17.000008\nv 20.600010 11.799999 -17.000008\nv 20.600010 11.799999 -19.000008\nv 26.200012 9.799999 -19.000008\nv 26.200012 9.799999 -17.000008\nv 24.200012 9.799999 -17.000008\nv 24.200012 9.799999 -19.000008\nv 26.200012 11.799999 -19.000008\nv 26.200012 11.799999 -17.000008\nv 24.200012 11.799999 -17.000008\nv 24.200012 11.799999 -19.000008\nv 29.800014 9.799999 -19.000008\nv 29.800014 9.799999 -17.000008\nv 27.800014 9.799999 -17.000008\nv 27.800014 9.799999 -19.000008\nv 29.800014 11.799999 -19.000008\nv 29.800014 11.799999 -17.000008\nv 27.800014 11.799999 -17.000008\nv 27.800014 11.799999 -19.000008\nv 33.400017 9.799999 -19.000008\nv 33.400017 9.799999 -17.000008\nv 31.400017 9.799999 -17.000008\nv 31.400017 9.799999 -19.000008\nv 33.400017 11.799999 -19.000008\nv 33.400017 11.799999 -17.000008\nv 31.400017 11.799999 -17.000008\nv 31.400017 11.799999 -19.000008\nv 1.000000 9.799999 -22.600010\nv 1.000000 9.799999 -20.600010\nv -1.000000 9.799999 -20.600010\nv -1.000000 9.799999 -22.600010\nv 1.000000 11.799999 -22.600010\nv 0.999999 11.799999 -20.600010\nv -1.000000 11.799999 -20.600010\nv -1.000000 11.799999 -22.600010\nv 4.600001 9.799999 -22.600010\nv 4.600001 9.799999 -20.600010\nv 2.600001 9.799999 -20.600010\nv 2.600002 9.799999 -22.600010\nv 4.600002 11.799999 -22.600010\nv 4.600001 11.799999 -20.600010\nv 2.600001 11.799999 -20.600010\nv 2.600002 11.799999 -22.600010\nv 8.200003 9.799999 -22.600010\nv 8.200003 9.799999 -20.600010\nv 6.200003 9.799999 -20.600010\nv 6.200004 9.799999 -22.600010\nv 8.200004 11.799999 -22.600010\nv 8.200003 11.799999 -20.600010\nv 6.200003 11.799999 -20.600010\nv 6.200003 11.799999 -22.600010\nv 11.800005 9.799999 -22.600010\nv 11.800005 9.799999 -20.600010\nv 9.800005 9.799999 -20.600010\nv 9.800005 9.799999 -22.600010\nv 11.800005 11.799999 -22.600010\nv 11.800004 11.799999 -20.600010\nv 9.800005 11.799999 -20.600010\nv 9.800005 11.799999 -22.600010\nv 15.400006 9.799999 -22.600010\nv 15.400006 9.799999 -20.600010\nv 13.400006 9.799999 -20.600010\nv 13.400006 9.799999 -22.600010\nv 15.400007 11.799999 -22.600010\nv 15.400005 11.799999 -20.600010\nv 13.400006 11.799999 -20.600010\nv 13.400006 11.799999 -22.600010\nv 19.000008 9.799999 -22.600010\nv 19.000008 9.799999 -20.600010\nv 17.000008 9.799999 -20.600010\nv 17.000008 9.799999 -22.600010\nv 19.000008 11.799999 -22.600010\nv 19.000008 11.799999 -20.600010\nv 17.000008 11.799999 -20.600010\nv 17.000008 11.799999 -22.600010\nv 22.600010 9.799999 -22.600010\nv 22.600010 9.799999 -20.600010\nv 20.600010 9.799999 -20.600010\nv 20.600010 9.799999 -22.600010\nv 22.600010 11.799999 -22.600010\nv 22.600010 11.799999 -20.600010\nv 20.600010 11.799999 -20.600010\nv 20.600010 11.799999 -22.600010\nv 26.200012 9.799999 -22.600010\nv 26.200012 9.799999 -20.600010\nv 24.200012 9.799999 -20.600010\nv 24.200012 9.799999 -22.600010\nv 26.200012 11.799999 -22.600010\nv 26.200012 11.799999 -20.600010\nv 24.200012 11.799999 -20.600010\nv 24.200012 11.799999 -22.600010\nv 29.800014 9.799999 -22.600010\nv 29.800014 9.799999 -20.600010\nv 27.800014 9.799999 -20.600010\nv 27.800014 9.799999 -22.600010\nv 29.800014 11.799999 -22.600010\nv 29.800014 11.799999 -20.600010\nv 27.800014 11.799999 -20.600010\nv 27.800014 11.799999 -22.600010\nv 33.400017 9.799999 -22.600010\nv 33.400017 9.799999 -20.600010\nv 31.400017 9.799999 -20.600010\nv 31.400017 9.799999 -22.600010\nv 33.400017 11.799999 -22.600010\nv 33.400017 11.799999 -20.600010\nv 31.400017 11.799999 -20.600010\nv 31.400017 11.799999 -22.600010\nv 1.000000 9.799999 -26.200012\nv 1.000000 9.799999 -24.200012\nv -1.000000 9.799999 -24.200012\nv -1.000000 9.799999 -26.200012\nv 1.000000 11.799999 -26.200012\nv 0.999999 11.799999 -24.200012\nv -1.000000 11.799999 -24.200012\nv -1.000000 11.799999 -26.200012\nv 4.600001 9.799999 -26.200012\nv 4.600001 9.799999 -24.200012\nv 2.600001 9.799999 -24.200012\nv 2.600002 9.799999 -26.200012\nv 4.600002 11.799999 -26.200012\nv 4.600001 11.799999 -24.200012\nv 2.600001 11.799999 -24.200012\nv 2.600002 11.799999 -26.200012\nv 8.200003 9.799999 -26.200012\nv 8.200003 9.799999 -24.200012\nv 6.200003 9.799999 -24.200012\nv 6.200004 9.799999 -26.200012\nv 8.200004 11.799999 -26.200012\nv 8.200003 11.799999 -24.200012\nv 6.200003 11.799999 -24.200012\nv 6.200003 11.799999 -26.200012\nv 11.800005 9.799999 -26.200012\nv 11.800005 9.799999 -24.200012\nv 9.800005 9.799999 -24.200012\nv 9.800005 9.799999 -26.200012\nv 11.800005 11.799999 -26.200012\nv 11.800004 11.799999 -24.200012\nv 9.800005 11.799999 -24.200012\nv 9.800005 11.799999 -26.200012\nv 15.400006 9.799999 -26.200012\nv 15.400006 9.799999 -24.200012\nv 13.400006 9.799999 -24.200012\nv 13.400006 9.799999 -26.200012\nv 15.400007 11.799999 -26.200012\nv 15.400005 11.799999 -24.200012\nv 13.400006 11.799999 -24.200012\nv 13.400006 11.799999 -26.200012\nv 19.000008 9.799999 -26.200012\nv 19.000008 9.799999 -24.200012\nv 17.000008 9.799999 -24.200012\nv 17.000008 9.799999 -26.200012\nv 19.000008 11.799999 -26.200012\nv 19.000008 11.799999 -24.200012\nv 17.000008 11.799999 -24.200012\nv 17.000008 11.799999 -26.200012\nv 22.600010 9.799999 -26.200012\nv 22.600010 9.799999 -24.200012\nv 20.600010 9.799999 -24.200012\nv 20.600010 9.799999 -26.200012\nv 22.600010 11.799999 -26.200012\nv 22.600010 11.799999 -24.200012\nv 20.600010 11.799999 -24.200012\nv 20.600010 11.799999 -26.200012\nv 26.200012 9.799999 -26.200012\nv 26.200012 9.799999 -24.200012\nv 24.200012 9.799999 -24.200012\nv 24.200012 9.799999 -26.200012\nv 26.200012 11.799999 -26.200012\nv 26.200012 11.799999 -24.200012\nv 24.200012 11.799999 -24.200012\nv 24.200012 11.799999 -26.200012\nv 29.800014 9.799999 -26.200012\nv 29.800014 9.799999 -24.200012\nv 27.800014 9.799999 -24.200012\nv 27.800014 9.799999 -26.200012\nv 29.800014 11.799999 -26.200012\nv 29.800014 11.799999 -24.200012\nv 27.800014 11.799999 -24.200012\nv 27.800014 11.799999 -26.200012\nv 33.400017 9.799999 -26.200012\nv 33.400017 9.799999 -24.200012\nv 31.400017 9.799999 -24.200012\nv 31.400017 9.799999 -26.200012\nv 33.400017 11.799999 -26.200012\nv 33.400017 11.799999 -24.200012\nv 31.400017 11.799999 -24.200012\nv 31.400017 11.799999 -26.200012\nv 1.000000 9.799999 -29.800014\nv 1.000000 9.799999 -27.800014\nv -1.000000 9.799999 -27.800014\nv -1.000000 9.799999 -29.800014\nv 1.000000 11.799999 -29.800014\nv 0.999999 11.799999 -27.800014\nv -1.000000 11.799999 -27.800014\nv -1.000000 11.799999 -29.800014\nv 4.600001 9.799999 -29.800014\nv 4.600001 9.799999 -27.800014\nv 2.600001 9.799999 -27.800014\nv 2.600002 9.799999 -29.800014\nv 4.600002 11.799999 -29.800014\nv 4.600001 11.799999 -27.800014\nv 2.600001 11.799999 -27.800014\nv 2.600002 11.799999 -29.800014\nv 8.200003 9.799999 -29.800014\nv 8.200003 9.799999 -27.800014\nv 6.200003 9.799999 -27.800014\nv 6.200004 9.799999 -29.800014\nv 8.200004 11.799999 -29.800014\nv 8.200003 11.799999 -27.800014\nv 6.200003 11.799999 -27.800014\nv 6.200003 11.799999 -29.800014\nv 11.800005 9.799999 -29.800014\nv 11.800005 9.799999 -27.800014\nv 9.800005 9.799999 -27.800014\nv 9.800005 9.799999 -29.800014\nv 11.800005 11.799999 -29.800014\nv 11.800004 11.799999 -27.800014\nv 9.800005 11.799999 -27.800014\nv 9.800005 11.799999 -29.800014\nv 15.400006 9.799999 -29.800014\nv 15.400006 9.799999 -27.800014\nv 13.400006 9.799999 -27.800014\nv 13.400006 9.799999 -29.800014\nv 15.400007 11.799999 -29.800014\nv 15.400005 11.799999 -27.800014\nv 13.400006 11.799999 -27.800014\nv 13.400006 11.799999 -29.800014\nv 19.000008 9.799999 -29.800014\nv 19.000008 9.799999 -27.800014\nv 17.000008 9.799999 -27.800014\nv 17.000008 9.799999 -29.800014\nv 19.000008 11.799999 -29.800014\nv 19.000008 11.799999 -27.800014\nv 17.000008 11.799999 -27.800014\nv 17.000008 11.799999 -29.800014\nv 22.600010 9.799999 -29.800014\nv 22.600010 9.799999 -27.800014\nv 20.600010 9.799999 -27.800014\nv 20.600010 9.799999 -29.800014\nv 22.600010 11.799999 -29.800014\nv 22.600010 11.799999 -27.800014\nv 20.600010 11.799999 -27.800014\nv 20.600010 11.799999 -29.800014\nv 26.200012 9.799999 -29.800014\nv 26.200012 9.799999 -27.800014\nv 24.200012 9.799999 -27.800014\nv 24.200012 9.799999 -29.800014\nv 26.200012 11.799999 -29.800014\nv 26.200012 11.799999 -27.800014\nv 24.200012 11.799999 -27.800014\nv 24.200012 11.799999 -29.800014\nv 29.800014 9.799999 -29.800014\nv 29.800014 9.799999 -27.800014\nv 27.800014 9.799999 -27.800014\nv 27.800014 9.799999 -29.800014\nv 29.800014 11.799999 -29.800014\nv 29.800014 11.799999 -27.800014\nv 27.800014 11.799999 -27.800014\nv 27.800014 11.799999 -29.800014\nv 33.400017 9.799999 -29.800014\nv 33.400017 9.799999 -27.800014\nv 31.400017 9.799999 -27.800014\nv 31.400017 9.799999 -29.800014\nv 33.400017 11.799999 -29.800014\nv 33.400017 11.799999 -27.800014\nv 31.400017 11.799999 -27.800014\nv 31.400017 11.799999 -29.800014\nv 1.000000 9.799999 -33.400017\nv 1.000000 9.799999 -31.400017\nv -1.000000 9.799999 -31.400017\nv -1.000000 9.799999 -33.400017\nv 1.000000 11.799999 -33.400017\nv 0.999999 11.799999 -31.400017\nv -1.000000 11.799999 -31.400017\nv -1.000000 11.799999 -33.400017\nv 4.600001 9.799999 -33.400017\nv 4.600001 9.799999 -31.400017\nv 2.600001 9.799999 -31.400017\nv 2.600002 9.799999 -33.400017\nv 4.600002 11.799999 -33.400017\nv 4.600001 11.799999 -31.400017\nv 2.600001 11.799999 -31.400017\nv 2.600002 11.799999 -33.400017\nv 8.200003 9.799999 -33.400017\nv 8.200003 9.799999 -31.400017\nv 6.200003 9.799999 -31.400017\nv 6.200004 9.799999 -33.400017\nv 8.200004 11.799999 -33.400017\nv 8.200003 11.799999 -31.400017\nv 6.200003 11.799999 -31.400017\nv 6.200003 11.799999 -33.400017\nv 11.800005 9.799999 -33.400017\nv 11.800005 9.799999 -31.400017\nv 9.800005 9.799999 -31.400017\nv 9.800005 9.799999 -33.400017\nv 11.800005 11.799999 -33.400017\nv 11.800004 11.799999 -31.400017\nv 9.800005 11.799999 -31.400017\nv 9.800005 11.799999 -33.400017\nv 15.400006 9.799999 -33.400017\nv 15.400006 9.799999 -31.400017\nv 13.400006 9.799999 -31.400017\nv 13.400006 9.799999 -33.400017\nv 15.400007 11.799999 -33.400017\nv 15.400005 11.799999 -31.400017\nv 13.400006 11.799999 -31.400017\nv 13.400006 11.799999 -33.400017\nv 19.000008 9.799999 -33.400017\nv 19.000008 9.799999 -31.400017\nv 17.000008 9.799999 -31.400017\nv 17.000008 9.799999 -33.400017\nv 19.000008 11.799999 -33.400017\nv 19.000008 11.799999 -31.400017\nv 17.000008 11.799999 -31.400017\nv 17.000008 11.799999 -33.400017\nv 22.600010 9.799999 -33.400017\nv 22.600010 9.799999 -31.400017\nv 20.600010 9.799999 -31.400017\nv 20.600010 9.799999 -33.400017\nv 22.600010 11.799999 -33.400017\nv 22.600010 11.799999 -31.400017\nv 20.600010 11.799999 -31.400017\nv 20.600010 11.799999 -33.400017\nv 26.200012 9.799999 -33.400017\nv 26.200012 9.799999 -31.400017\nv 24.200012 9.799999 -31.400017\nv 24.200012 9.799999 -33.400017\nv 26.200012 11.799999 -33.400017\nv 26.200012 11.799999 -31.400017\nv 24.200012 11.799999 -31.400017\nv 24.200012 11.799999 -33.400017\nv 29.800014 9.799999 -33.400017\nv 29.800014 9.799999 -31.400017\nv 27.800014 9.799999 -31.400017\nv 27.800014 9.799999 -33.400017\nv 29.800014 11.799999 -33.400017\nv 29.800014 11.799999 -31.400017\nv 27.800014 11.799999 -31.400017\nv 27.800014 11.799999 -33.400017\nv 33.400017 9.799999 -33.400017\nv 33.400017 9.799999 -31.400017\nv 31.400017 9.799999 -31.400017\nv 31.400017 9.799999 -33.400017\nv 33.400017 11.799999 -33.400017\nv 33.400017 11.799999 -31.400017\nv 31.400017 11.799999 -31.400017\nv 31.400017 11.799999 -33.400017\nv -1.000000 9.799999 -1.000000\nv -1.000000 9.799999 1.000000\nv 1.000000 9.799999 1.000000\nv 1.000000 9.799999 -1.000000\nv -1.000000 11.799999 -0.999999\nv -0.999999 11.799999 1.000001\nv 1.000000 11.799999 1.000000\nv 1.000000 11.799999 -1.000000\nv -4.600001 9.799999 -1.000000\nv -4.600001 9.799999 1.000000\nv -2.600001 9.799999 1.000000\nv -2.600002 9.799999 -1.000000\nv -4.600002 11.799999 -0.999999\nv -4.600001 11.799999 1.000001\nv -2.600001 11.799999 1.000000\nv -2.600002 11.799999 -1.000000\nv -8.200003 9.799999 -1.000000\nv -8.200003 9.799999 1.000000\nv -6.200003 9.799999 1.000000\nv -6.200004 9.799999 -1.000000\nv -8.200004 11.799999 -0.999999\nv -8.200003 11.799999 1.000001\nv -6.200003 11.799999 1.000000\nv -6.200003 11.799999 -1.000000\nv -11.800005 9.799999 -1.000000\nv -11.800005 9.799999 1.000000\nv -9.800005 9.799999 1.000000\nv -9.800005 9.799999 -1.000000\nv -11.800005 11.799999 -0.999999\nv -11.800004 11.799999 1.000001\nv -9.800005 11.799999 1.000000\nv -9.800005 11.799999 -1.000000\nv -15.400006 9.799999 -1.000000\nv -15.400006 9.799999 1.000000\nv -13.400006 9.799999 1.000000\nv -13.400006 9.799999 -1.000000\nv -15.400007 11.799999 -0.999999\nv -15.400005 11.799999 1.000001\nv -13.400006 11.799999 1.000000\nv -13.400006 11.799999 -1.000000\nv -19.000008 9.799999 -1.000000\nv -19.000008 9.799999 1.000000\nv -17.000008 9.799999 1.000000\nv -17.000008 9.799999 -1.000000\nv -19.000008 11.799999 -0.999999\nv -19.000008 11.799999 1.000001\nv -17.000008 11.799999 1.000000\nv -17.000008 11.799999 -1.000000\nv -22.600010 9.799999 -1.000000\nv -22.600010 9.799999 1.000000\nv -20.600010 9.799999 1.000000\nv -20.600010 9.799999 -1.000000\nv -22.600010 11.799999 -0.999999\nv -22.600010 11.799999 1.000001\nv -20.600010 11.799999 1.000000\nv -20.600010 11.799999 -1.000000\nv -26.200012 9.799999 -1.000000\nv -26.200012 9.799999 1.000000\nv -24.200012 9.799999 1.000000\nv -24.200012 9.799999 -1.000000\nv -26.200012 11.799999 -0.999999\nv -26.200012 11.799999 1.000001\nv -24.200012 11.799999 1.000000\nv -24.200012 11.799999 -1.000000\nv -29.800014 9.799999 -1.000000\nv -29.800014 9.799999 1.000000\nv -27.800014 9.799999 1.000000\nv -27.800014 9.799999 -1.000000\nv -29.800014 11.799999 -0.999999\nv -29.800014 11.799999 1.000001\nv -27.800014 11.799999 1.000000\nv -27.800014 11.799999 -1.000000\nv -33.400017 9.799999 -1.000000\nv -33.400017 9.799999 1.000000\nv -31.400017 9.799999 1.000000\nv -31.400017 9.799999 -1.000000\nv -33.400017 11.799999 -0.999999\nv -33.400017 11.799999 1.000001\nv -31.400017 11.799999 1.000000\nv -31.400017 11.799999 -1.000000\nv -1.000000 9.799999 -4.600001\nv -1.000000 9.799999 -2.600002\nv 1.000000 9.799999 -2.600002\nv 1.000000 9.799999 -4.600002\nv -1.000000 11.799999 -4.600001\nv -0.999999 11.799999 -2.600001\nv 1.000000 11.799999 -2.600002\nv 1.000000 11.799999 -4.600001\nv -4.600001 9.799999 -4.600001\nv -4.600001 9.799999 -2.600002\nv -2.600001 9.799999 -2.600002\nv -2.600002 9.799999 -4.600002\nv -4.600002 11.799999 -4.600001\nv -4.600001 11.799999 -2.600001\nv -2.600001 11.799999 -2.600002\nv -2.600002 11.799999 -4.600001\nv -8.200003 9.799999 -4.600001\nv -8.200003 9.799999 -2.600002\nv -6.200003 9.799999 -2.600002\nv -6.200004 9.799999 -4.600002\nv -8.200004 11.799999 -4.600001\nv -8.200003 11.799999 -2.600001\nv -6.200003 11.799999 -2.600002\nv -6.200003 11.799999 -4.600001\nv -11.800005 9.799999 -4.600001\nv -11.800005 9.799999 -2.600002\nv -9.800005 9.799999 -2.600002\nv -9.800005 9.799999 -4.600002\nv -11.800005 11.799999 -4.600001\nv -11.800004 11.799999 -2.600001\nv -9.800005 11.799999 -2.600002\nv -9.800005 11.799999 -4.600001\nv -15.400006 9.799999 -4.600001\nv -15.400006 9.799999 -2.600002\nv -13.400006 9.799999 -2.600002\nv -13.400006 9.799999 -4.600002\nv -15.400007 11.799999 -4.600001\nv -15.400005 11.799999 -2.600001\nv -13.400006 11.799999 -2.600002\nv -13.400006 11.799999 -4.600001\nv -19.000008 9.799999 -4.600001\nv -19.000008 9.799999 -2.600002\nv -17.000008 9.799999 -2.600002\nv -17.000008 9.799999 -4.600002\nv -19.000008 11.799999 -4.600001\nv -19.000008 11.799999 -2.600001\nv -17.000008 11.799999 -2.600002\nv -17.000008 11.799999 -4.600001\nv -22.600010 9.799999 -4.600001\nv -22.600010 9.799999 -2.600002\nv -20.600010 9.799999 -2.600002\nv -20.600010 9.799999 -4.600002\nv -22.600010 11.799999 -4.600001\nv -22.600010 11.799999 -2.600001\nv -20.600010 11.799999 -2.600002\nv -20.600010 11.799999 -4.600001\nv -26.200012 9.799999 -4.600001\nv -26.200012 9.799999 -2.600002\nv -24.200012 9.799999 -2.600002\nv -24.200012 9.799999 -4.600002\nv -26.200012 11.799999 -4.600001\nv -26.200012 11.799999 -2.600001\nv -24.200012 11.799999 -2.600002\nv -24.200012 11.799999 -4.600001\nv -29.800014 9.799999 -4.600001\nv -29.800014 9.799999 -2.600002\nv -27.800014 9.799999 -2.600002\nv -27.800014 9.799999 -4.600002\nv -29.800014 11.799999 -4.600001\nv -29.800014 11.799999 -2.600001\nv -27.800014 11.799999 -2.600002\nv -27.800014 11.799999 -4.600001\nv -33.400017 9.799999 -4.600001\nv -33.400017 9.799999 -2.600002\nv -31.400017 9.799999 -2.600002\nv -31.400017 9.799999 -4.600002\nv -33.400017 11.799999 -4.600001\nv -33.400017 11.799999 -2.600001\nv -31.400017 11.799999 -2.600002\nv -31.400017 11.799999 -4.600001\nv -1.000000 9.799999 -8.200003\nv -1.000000 9.799999 -6.200003\nv 1.000000 9.799999 -6.200003\nv 1.000000 9.799999 -8.200004\nv -1.000000 11.799999 -8.200003\nv -0.999999 11.799999 -6.200003\nv 1.000000 11.799999 -6.200004\nv 1.000000 11.799999 -8.200003\nv -4.600001 9.799999 -8.200003\nv -4.600001 9.799999 -6.200003\nv -2.600001 9.799999 -6.200003\nv -2.600002 9.799999 -8.200004\nv -4.600002 11.799999 -8.200003\nv -4.600001 11.799999 -6.200003\nv -2.600001 11.799999 -6.200004\nv -2.600002 11.799999 -8.200003\nv -8.200003 9.799999 -8.200003\nv -8.200003 9.799999 -6.200003\nv -6.200003 9.799999 -6.200003\nv -6.200004 9.799999 -8.200004\nv -8.200004 11.799999 -8.200003\nv -8.200003 11.799999 -6.200003\nv -6.200003 11.799999 -6.200004\nv -6.200003 11.799999 -8.200003\nv -11.800005 9.799999 -8.200003\nv -11.800005 9.799999 -6.200003\nv -9.800005 9.799999 -6.200003\nv -9.800005 9.799999 -8.200004\nv -11.800005 11.799999 -8.200003\nv -11.800004 11.799999 -6.200003\nv -9.800005 11.799999 -6.200004\nv -9.800005 11.799999 -8.200003\nv -15.400006 9.799999 -8.200003\nv -15.400006 9.799999 -6.200003\nv -13.400006 9.799999 -6.200003\nv -13.400006 9.799999 -8.200004\nv -15.400007 11.799999 -8.200003\nv -15.400005 11.799999 -6.200003\nv -13.400006 11.799999 -6.200004\nv -13.400006 11.799999 -8.200003\nv -19.000008 9.799999 -8.200003\nv -19.000008 9.799999 -6.200003\nv -17.000008 9.799999 -6.200003\nv -17.000008 9.799999 -8.200004\nv -19.000008 11.799999 -8.200003\nv -19.000008 11.799999 -6.200003\nv -17.000008 11.799999 -6.200004\nv -17.000008 11.799999 -8.200003\nv -22.600010 9.799999 -8.200003\nv -22.600010 9.799999 -6.200003\nv -20.600010 9.799999 -6.200003\nv -20.600010 9.799999 -8.200004\nv -22.600010 11.799999 -8.200003\nv -22.600010 11.799999 -6.200003\nv -20.600010 11.799999 -6.200004\nv -20.600010 11.799999 -8.200003\nv -26.200012 9.799999 -8.200003\nv -26.200012 9.799999 -6.200003\nv -24.200012 9.799999 -6.200003\nv -24.200012 9.799999 -8.200004\nv -26.200012 11.799999 -8.200003\nv -26.200012 11.799999 -6.200003\nv -24.200012 11.799999 -6.200004\nv -24.200012 11.799999 -8.200003\nv -29.800014 9.799999 -8.200003\nv -29.800014 9.799999 -6.200003\nv -27.800014 9.799999 -6.200003\nv -27.800014 9.799999 -8.200004\nv -29.800014 11.799999 -8.200003\nv -29.800014 11.799999 -6.200003\nv -27.800014 11.799999 -6.200004\nv -27.800014 11.799999 -8.200003\nv -33.400017 9.799999 -8.200003\nv -33.400017 9.799999 -6.200003\nv -31.400017 9.799999 -6.200003\nv -31.400017 9.799999 -8.200004\nv -33.400017 11.799999 -8.200003\nv -33.400017 11.799999 -6.200003\nv -31.400017 11.799999 -6.200004\nv -31.400017 11.799999 -8.200003\nv -1.000000 9.799999 -11.800005\nv -1.000000 9.799999 -9.800005\nv 1.000000 9.799999 -9.800005\nv 1.000000 9.799999 -11.800005\nv -1.000000 11.799999 -11.800004\nv -0.999999 11.799999 -9.800004\nv 1.000000 11.799999 -9.800005\nv 1.000000 11.799999 -11.800005\nv -4.600001 9.799999 -11.800005\nv -4.600001 9.799999 -9.800005\nv -2.600001 9.799999 -9.800005\nv -2.600002 9.799999 -11.800005\nv -4.600002 11.799999 -11.800004\nv -4.600001 11.799999 -9.800004\nv -2.600001 11.799999 -9.800005\nv -2.600002 11.799999 -11.800005\nv -8.200003 9.799999 -11.800005\nv -8.200003 9.799999 -9.800005\nv -6.200003 9.799999 -9.800005\nv -6.200004 9.799999 -11.800005\nv -8.200004 11.799999 -11.800004\nv -8.200003 11.799999 -9.800004\nv -6.200003 11.799999 -9.800005\nv -6.200003 11.799999 -11.800005\nv -11.800005 9.799999 -11.800005\nv -11.800005 9.799999 -9.800005\nv -9.800005 9.799999 -9.800005\nv -9.800005 9.799999 -11.800005\nv -11.800005 11.799999 -11.800004\nv -11.800004 11.799999 -9.800004\nv -9.800005 11.799999 -9.800005\nv -9.800005 11.799999 -11.800005\nv -15.400006 9.799999 -11.800005\nv -15.400006 9.799999 -9.800005\nv -13.400006 9.799999 -9.800005\nv -13.400006 9.799999 -11.800005\nv -15.400007 11.799999 -11.800004\nv -15.400005 11.799999 -9.800004\nv -13.400006 11.799999 -9.800005\nv -13.400006 11.799999 -11.800005\nv -19.000008 9.799999 -11.800005\nv -19.000008 9.799999 -9.800005\nv -17.000008 9.799999 -9.800005\nv -17.000008 9.799999 -11.800005\nv -19.000008 11.799999 -11.800004\nv -19.000008 11.799999 -9.800004\nv -17.000008 11.799999 -9.800005\nv -17.000008 11.799999 -11.800005\nv -22.600010 9.799999 -11.800005\nv -22.600010 9.799999 -9.800005\nv -20.600010 9.799999 -9.800005\nv -20.600010 9.799999 -11.800005\nv -22.600010 11.799999 -11.800004\nv -22.600010 11.799999 -9.800004\nv -20.600010 11.799999 -9.800005\nv -20.600010 11.799999 -11.800005\nv -26.200012 9.799999 -11.800005\nv -26.200012 9.799999 -9.800005\nv -24.200012 9.799999 -9.800005\nv -24.200012 9.799999 -11.800005\nv -26.200012 11.799999 -11.800004\nv -26.200012 11.799999 -9.800004\nv -24.200012 11.799999 -9.800005\nv -24.200012 11.799999 -11.800005\nv -29.800014 9.799999 -11.800005\nv -29.800014 9.799999 -9.800005\nv -27.800014 9.799999 -9.800005\nv -27.800014 9.799999 -11.800005\nv -29.800014 11.799999 -11.800004\nv -29.800014 11.799999 -9.800004\nv -27.800014 11.799999 -9.800005\nv -27.800014 11.799999 -11.800005\nv -33.400017 9.799999 -11.800005\nv -33.400017 9.799999 -9.800005\nv -31.400017 9.799999 -9.800005\nv -31.400017 9.799999 -11.800005\nv -33.400017 11.799999 -11.800004\nv -33.400017 11.799999 -9.800004\nv -31.400017 11.799999 -9.800005\nv -31.400017 11.799999 -11.800005\nv -1.000000 9.799999 -15.400006\nv -1.000000 9.799999 -13.400006\nv 1.000000 9.799999 -13.400006\nv 1.000000 9.799999 -15.400006\nv -1.000000 11.799999 -15.400005\nv -0.999999 11.799999 -13.400005\nv 1.000000 11.799999 -13.400006\nv 1.000000 11.799999 -15.400006\nv -4.600001 9.799999 -15.400006\nv -4.600001 9.799999 -13.400006\nv -2.600001 9.799999 -13.400006\nv -2.600002 9.799999 -15.400006\nv -4.600002 11.799999 -15.400005\nv -4.600001 11.799999 -13.400005\nv -2.600001 11.799999 -13.400006\nv -2.600002 11.799999 -15.400006\nv -8.200003 9.799999 -15.400006\nv -8.200003 9.799999 -13.400006\nv -6.200003 9.799999 -13.400006\nv -6.200004 9.799999 -15.400006\nv -8.200004 11.799999 -15.400005\nv -8.200003 11.799999 -13.400005\nv -6.200003 11.799999 -13.400006\nv -6.200003 11.799999 -15.400006\nv -11.800005 9.799999 -15.400006\nv -11.800005 9.799999 -13.400006\nv -9.800005 9.799999 -13.400006\nv -9.800005 9.799999 -15.400006\nv -11.800005 11.799999 -15.400005\nv -11.800004 11.799999 -13.400005\nv -9.800005 11.799999 -13.400006\nv -9.800005 11.799999 -15.400006\nv -15.400006 9.799999 -15.400006\nv -15.400006 9.799999 -13.400006\nv -13.400006 9.799999 -13.400006\nv -13.400006 9.799999 -15.400006\nv -15.400007 11.799999 -15.400005\nv -15.400005 11.799999 -13.400005\nv -13.400006 11.799999 -13.400006\nv -13.400006 11.799999 -15.400006\nv -19.000008 9.799999 -15.400006\nv -19.000008 9.799999 -13.400006\nv -17.000008 9.799999 -13.400006\nv -17.000008 9.799999 -15.400006\nv -19.000008 11.799999 -15.400005\nv -19.000008 11.799999 -13.400005\nv -17.000008 11.799999 -13.400006\nv -17.000008 11.799999 -15.400006\nv -22.600010 9.799999 -15.400006\nv -22.600010 9.799999 -13.400006\nv -20.600010 9.799999 -13.400006\nv -20.600010 9.799999 -15.400006\nv -22.600010 11.799999 -15.400005\nv -22.600010 11.799999 -13.400005\nv -20.600010 11.799999 -13.400006\nv -20.600010 11.799999 -15.400006\nv -26.200012 9.799999 -15.400006\nv -26.200012 9.799999 -13.400006\nv -24.200012 9.799999 -13.400006\nv -24.200012 9.799999 -15.400006\nv -26.200012 11.799999 -15.400005\nv -26.200012 11.799999 -13.400005\nv -24.200012 11.799999 -13.400006\nv -24.200012 11.799999 -15.400006\nv -29.800014 9.799999 -15.400006\nv -29.800014 9.799999 -13.400006\nv -27.800014 9.799999 -13.400006\nv -27.800014 9.799999 -15.400006\nv -29.800014 11.799999 -15.400005\nv -29.800014 11.799999 -13.400005\nv -27.800014 11.799999 -13.400006\nv -27.800014 11.799999 -15.400006\nv -33.400017 9.799999 -15.400006\nv -33.400017 9.799999 -13.400006\nv -31.400017 9.799999 -13.400006\nv -31.400017 9.799999 -15.400006\nv -33.400017 11.799999 -15.400005\nv -33.400017 11.799999 -13.400005\nv -31.400017 11.799999 -13.400006\nv -31.400017 11.799999 -15.400006\nv -1.000000 9.799999 -19.000008\nv -1.000000 9.799999 -17.000008\nv 1.000000 9.799999 -17.000008\nv 1.000000 9.799999 -19.000008\nv -1.000000 11.799999 -19.000008\nv -0.999999 11.799999 -17.000008\nv 1.000000 11.799999 -17.000008\nv 1.000000 11.799999 -19.000008\nv -4.600001 9.799999 -19.000008\nv -4.600001 9.799999 -17.000008\nv -2.600001 9.799999 -17.000008\nv -2.600002 9.799999 -19.000008\nv -4.600002 11.799999 -19.000008\nv -4.600001 11.799999 -17.000008\nv -2.600001 11.799999 -17.000008\nv -2.600002 11.799999 -19.000008\nv -8.200003 9.799999 -19.000008\nv -8.200003 9.799999 -17.000008\nv -6.200003 9.799999 -17.000008\nv -6.200004 9.799999 -19.000008\nv -8.200004 11.799999 -19.000008\nv -8.200003 11.799999 -17.000008\nv -6.200003 11.799999 -17.000008\nv -6.200003 11.799999 -19.000008\nv -11.800005 9.799999 -19.000008\nv -11.800005 9.799999 -17.000008\nv -9.800005 9.799999 -17.000008\nv -9.800005 9.799999 -19.000008\nv -11.800005 11.799999 -19.000008\nv -11.800004 11.799999 -17.000008\nv -9.800005 11.799999 -17.000008\nv -9.800005 11.799999 -19.000008\nv -15.400006 9.799999 -19.000008\nv -15.400006 9.799999 -17.000008\nv -13.400006 9.799999 -17.000008\nv -13.400006 9.799999 -19.000008\nv -15.400007 11.799999 -19.000008\nv -15.400005 11.799999 -17.000008\nv -13.400006 11.799999 -17.000008\nv -13.400006 11.799999 -19.000008\nv -19.000008 9.799999 -19.000008\nv -19.000008 9.799999 -17.000008\nv -17.000008 9.799999 -17.000008\nv -17.000008 9.799999 -19.000008\nv -19.000008 11.799999 -19.000008\nv -19.000008 11.799999 -17.000008\nv -17.000008 11.799999 -17.000008\nv -17.000008 11.799999 -19.000008\nv -22.600010 9.799999 -19.000008\nv -22.600010 9.799999 -17.000008\nv -20.600010 9.799999 -17.000008\nv -20.600010 9.799999 -19.000008\nv -22.600010 11.799999 -19.000008\nv -22.600010 11.799999 -17.000008\nv -20.600010 11.799999 -17.000008\nv -20.600010 11.799999 -19.000008\nv -26.200012 9.799999 -19.000008\nv -26.200012 9.799999 -17.000008\nv -24.200012 9.799999 -17.000008\nv -24.200012 9.799999 -19.000008\nv -26.200012 11.799999 -19.000008\nv -26.200012 11.799999 -17.000008\nv -24.200012 11.799999 -17.000008\nv -24.200012 11.799999 -19.000008\nv -29.800014 9.799999 -19.000008\nv -29.800014 9.799999 -17.000008\nv -27.800014 9.799999 -17.000008\nv -27.800014 9.799999 -19.000008\nv -29.800014 11.799999 -19.000008\nv -29.800014 11.799999 -17.000008\nv -27.800014 11.799999 -17.000008\nv -27.800014 11.799999 -19.000008\nv -33.400017 9.799999 -19.000008\nv -33.400017 9.799999 -17.000008\nv -31.400017 9.799999 -17.000008\nv -31.400017 9.799999 -19.000008\nv -33.400017 11.799999 -19.000008\nv -33.400017 11.799999 -17.000008\nv -31.400017 11.799999 -17.000008\nv -31.400017 11.799999 -19.000008\nv -1.000000 9.799999 -22.600010\nv -1.000000 9.799999 -20.600010\nv 1.000000 9.799999 -20.600010\nv 1.000000 9.799999 -22.600010\nv -1.000000 11.799999 -22.600010\nv -0.999999 11.799999 -20.600010\nv 1.000000 11.799999 -20.600010\nv 1.000000 11.799999 -22.600010\nv -4.600001 9.799999 -22.600010\nv -4.600001 9.799999 -20.600010\nv -2.600001 9.799999 -20.600010\nv -2.600002 9.799999 -22.600010\nv -4.600002 11.799999 -22.600010\nv -4.600001 11.799999 -20.600010\nv -2.600001 11.799999 -20.600010\nv -2.600002 11.799999 -22.600010\nv -8.200003 9.799999 -22.600010\nv -8.200003 9.799999 -20.600010\nv -6.200003 9.799999 -20.600010\nv -6.200004 9.799999 -22.600010\nv -8.200004 11.799999 -22.600010\nv -8.200003 11.799999 -20.600010\nv -6.200003 11.799999 -20.600010\nv -6.200003 11.799999 -22.600010\nv -11.800005 9.799999 -22.600010\nv -11.800005 9.799999 -20.600010\nv -9.800005 9.799999 -20.600010\nv -9.800005 9.799999 -22.600010\nv -11.800005 11.799999 -22.600010\nv -11.800004 11.799999 -20.600010\nv -9.800005 11.799999 -20.600010\nv -9.800005 11.799999 -22.600010\nv -15.400006 9.799999 -22.600010\nv -15.400006 9.799999 -20.600010\nv -13.400006 9.799999 -20.600010\nv -13.400006 9.799999 -22.600010\nv -15.400007 11.799999 -22.600010\nv -15.400005 11.799999 -20.600010\nv -13.400006 11.799999 -20.600010\nv -13.400006 11.799999 -22.600010\nv -19.000008 9.799999 -22.600010\nv -19.000008 9.799999 -20.600010\nv -17.000008 9.799999 -20.600010\nv -17.000008 9.799999 -22.600010\nv -19.000008 11.799999 -22.600010\nv -19.000008 11.799999 -20.600010\nv -17.000008 11.799999 -20.600010\nv -17.000008 11.799999 -22.600010\nv -22.600010 9.799999 -22.600010\nv -22.600010 9.799999 -20.600010\nv -20.600010 9.799999 -20.600010\nv -20.600010 9.799999 -22.600010\nv -22.600010 11.799999 -22.600010\nv -22.600010 11.799999 -20.600010\nv -20.600010 11.799999 -20.600010\nv -20.600010 11.799999 -22.600010\nv -26.200012 9.799999 -22.600010\nv -26.200012 9.799999 -20.600010\nv -24.200012 9.799999 -20.600010\nv -24.200012 9.799999 -22.600010\nv -26.200012 11.799999 -22.600010\nv -26.200012 11.799999 -20.600010\nv -24.200012 11.799999 -20.600010\nv -24.200012 11.799999 -22.600010\nv -29.800014 9.799999 -22.600010\nv -29.800014 9.799999 -20.600010\nv -27.800014 9.799999 -20.600010\nv -27.800014 9.799999 -22.600010\nv -29.800014 11.799999 -22.600010\nv -29.800014 11.799999 -20.600010\nv -27.800014 11.799999 -20.600010\nv -27.800014 11.799999 -22.600010\nv -33.400017 9.799999 -22.600010\nv -33.400017 9.799999 -20.600010\nv -31.400017 9.799999 -20.600010\nv -31.400017 9.799999 -22.600010\nv -33.400017 11.799999 -22.600010\nv -33.400017 11.799999 -20.600010\nv -31.400017 11.799999 -20.600010\nv -31.400017 11.799999 -22.600010\nv -1.000000 9.799999 -26.200012\nv -1.000000 9.799999 -24.200012\nv 1.000000 9.799999 -24.200012\nv 1.000000 9.799999 -26.200012\nv -1.000000 11.799999 -26.200012\nv -0.999999 11.799999 -24.200012\nv 1.000000 11.799999 -24.200012\nv 1.000000 11.799999 -26.200012\nv -4.600001 9.799999 -26.200012\nv -4.600001 9.799999 -24.200012\nv -2.600001 9.799999 -24.200012\nv -2.600002 9.799999 -26.200012\nv -4.600002 11.799999 -26.200012\nv -4.600001 11.799999 -24.200012\nv -2.600001 11.799999 -24.200012\nv -2.600002 11.799999 -26.200012\nv -8.200003 9.799999 -26.200012\nv -8.200003 9.799999 -24.200012\nv -6.200003 9.799999 -24.200012\nv -6.200004 9.799999 -26.200012\nv -8.200004 11.799999 -26.200012\nv -8.200003 11.799999 -24.200012\nv -6.200003 11.799999 -24.200012\nv -6.200003 11.799999 -26.200012\nv -11.800005 9.799999 -26.200012\nv -11.800005 9.799999 -24.200012\nv -9.800005 9.799999 -24.200012\nv -9.800005 9.799999 -26.200012\nv -11.800005 11.799999 -26.200012\nv -11.800004 11.799999 -24.200012\nv -9.800005 11.799999 -24.200012\nv -9.800005 11.799999 -26.200012\nv -15.400006 9.799999 -26.200012\nv -15.400006 9.799999 -24.200012\nv -13.400006 9.799999 -24.200012\nv -13.400006 9.799999 -26.200012\nv -15.400007 11.799999 -26.200012\nv -15.400005 11.799999 -24.200012\nv -13.400006 11.799999 -24.200012\nv -13.400006 11.799999 -26.200012\nv -19.000008 9.799999 -26.200012\nv -19.000008 9.799999 -24.200012\nv -17.000008 9.799999 -24.200012\nv -17.000008 9.799999 -26.200012\nv -19.000008 11.799999 -26.200012\nv -19.000008 11.799999 -24.200012\nv -17.000008 11.799999 -24.200012\nv -17.000008 11.799999 -26.200012\nv -22.600010 9.799999 -26.200012\nv -22.600010 9.799999 -24.200012\nv -20.600010 9.799999 -24.200012\nv -20.600010 9.799999 -26.200012\nv -22.600010 11.799999 -26.200012\nv -22.600010 11.799999 -24.200012\nv -20.600010 11.799999 -24.200012\nv -20.600010 11.799999 -26.200012\nv -26.200012 9.799999 -26.200012\nv -26.200012 9.799999 -24.200012\nv -24.200012 9.799999 -24.200012\nv -24.200012 9.799999 -26.200012\nv -26.200012 11.799999 -26.200012\nv -26.200012 11.799999 -24.200012\nv -24.200012 11.799999 -24.200012\nv -24.200012 11.799999 -26.200012\nv -29.800014 9.799999 -26.200012\nv -29.800014 9.799999 -24.200012\nv -27.800014 9.799999 -24.200012\nv -27.800014 9.799999 -26.200012\nv -29.800014 11.799999 -26.200012\nv -29.800014 11.799999 -24.200012\nv -27.800014 11.799999 -24.200012\nv -27.800014 11.799999 -26.200012\nv -33.400017 9.799999 -26.200012\nv -33.400017 9.799999 -24.200012\nv -31.400017 9.799999 -24.200012\nv -31.400017 9.799999 -26.200012\nv -33.400017 11.799999 -26.200012\nv -33.400017 11.799999 -24.200012\nv -31.400017 11.799999 -24.200012\nv -31.400017 11.799999 -26.200012\nv -1.000000 9.799999 -29.800014\nv -1.000000 9.799999 -27.800014\nv 1.000000 9.799999 -27.800014\nv 1.000000 9.799999 -29.800014\nv -1.000000 11.799999 -29.800014\nv -0.999999 11.799999 -27.800014\nv 1.000000 11.799999 -27.800014\nv 1.000000 11.799999 -29.800014\nv -4.600001 9.799999 -29.800014\nv -4.600001 9.799999 -27.800014\nv -2.600001 9.799999 -27.800014\nv -2.600002 9.799999 -29.800014\nv -4.600002 11.799999 -29.800014\nv -4.600001 11.799999 -27.800014\nv -2.600001 11.799999 -27.800014\nv -2.600002 11.799999 -29.800014\nv -8.200003 9.799999 -29.800014\nv -8.200003 9.799999 -27.800014\nv -6.200003 9.799999 -27.800014\nv -6.200004 9.799999 -29.800014\nv -8.200004 11.799999 -29.800014\nv -8.200003 11.799999 -27.800014\nv -6.200003 11.799999 -27.800014\nv -6.200003 11.799999 -29.800014\nv -11.800005 9.799999 -29.800014\nv -11.800005 9.799999 -27.800014\nv -9.800005 9.799999 -27.800014\nv -9.800005 9.799999 -29.800014\nv -11.800005 11.799999 -29.800014\nv -11.800004 11.799999 -27.800014\nv -9.800005 11.799999 -27.800014\nv -9.800005 11.799999 -29.800014\nv -15.400006 9.799999 -29.800014\nv -15.400006 9.799999 -27.800014\nv -13.400006 9.799999 -27.800014\nv -13.400006 9.799999 -29.800014\nv -15.400007 11.799999 -29.800014\nv -15.400005 11.799999 -27.800014\nv -13.400006 11.799999 -27.800014\nv -13.400006 11.799999 -29.800014\nv -19.000008 9.799999 -29.800014\nv -19.000008 9.799999 -27.800014\nv -17.000008 9.799999 -27.800014\nv -17.000008 9.799999 -29.800014\nv -19.000008 11.799999 -29.800014\nv -19.000008 11.799999 -27.800014\nv -17.000008 11.799999 -27.800014\nv -17.000008 11.799999 -29.800014\nv -22.600010 9.799999 -29.800014\nv -22.600010 9.799999 -27.800014\nv -20.600010 9.799999 -27.800014\nv -20.600010 9.799999 -29.800014\nv -22.600010 11.799999 -29.800014\nv -22.600010 11.799999 -27.800014\nv -20.600010 11.799999 -27.800014\nv -20.600010 11.799999 -29.800014\nv -26.200012 9.799999 -29.800014\nv -26.200012 9.799999 -27.800014\nv -24.200012 9.799999 -27.800014\nv -24.200012 9.799999 -29.800014\nv -26.200012 11.799999 -29.800014\nv -26.200012 11.799999 -27.800014\nv -24.200012 11.799999 -27.800014\nv -24.200012 11.799999 -29.800014\nv -29.800014 9.799999 -29.800014\nv -29.800014 9.799999 -27.800014\nv -27.800014 9.799999 -27.800014\nv -27.800014 9.799999 -29.800014\nv -29.800014 11.799999 -29.800014\nv -29.800014 11.799999 -27.800014\nv -27.800014 11.799999 -27.800014\nv -27.800014 11.799999 -29.800014\nv -33.400017 9.799999 -29.800014\nv -33.400017 9.799999 -27.800014\nv -31.400017 9.799999 -27.800014\nv -31.400017 9.799999 -29.800014\nv -33.400017 11.799999 -29.800014\nv -33.400017 11.799999 -27.800014\nv -31.400017 11.799999 -27.800014\nv -31.400017 11.799999 -29.800014\nv -1.000000 9.799999 -33.400017\nv -1.000000 9.799999 -31.400017\nv 1.000000 9.799999 -31.400017\nv 1.000000 9.799999 -33.400017\nv -1.000000 11.799999 -33.400017\nv -0.999999 11.799999 -31.400017\nv 1.000000 11.799999 -31.400017\nv 1.000000 11.799999 -33.400017\nv -4.600001 9.799999 -33.400017\nv -4.600001 9.799999 -31.400017\nv -2.600001 9.799999 -31.400017\nv -2.600002 9.799999 -33.400017\nv -4.600002 11.799999 -33.400017\nv -4.600001 11.799999 -31.400017\nv -2.600001 11.799999 -31.400017\nv -2.600002 11.799999 -33.400017\nv -8.200003 9.799999 -33.400017\nv -8.200003 9.799999 -31.400017\nv -6.200003 9.799999 -31.400017\nv -6.200004 9.799999 -33.400017\nv -8.200004 11.799999 -33.400017\nv -8.200003 11.799999 -31.400017\nv -6.200003 11.799999 -31.400017\nv -6.200003 11.799999 -33.400017\nv -11.800005 9.799999 -33.400017\nv -11.800005 9.799999 -31.400017\nv -9.800005 9.799999 -31.400017\nv -9.800005 9.799999 -33.400017\nv -11.800005 11.799999 -33.400017\nv -11.800004 11.799999 -31.400017\nv -9.800005 11.799999 -31.400017\nv -9.800005 11.799999 -33.400017\nv -15.400006 9.799999 -33.400017\nv -15.400006 9.799999 -31.400017\nv -13.400006 9.799999 -31.400017\nv -13.400006 9.799999 -33.400017\nv -15.400007 11.799999 -33.400017\nv -15.400005 11.799999 -31.400017\nv -13.400006 11.799999 -31.400017\nv -13.400006 11.799999 -33.400017\nv -19.000008 9.799999 -33.400017\nv -19.000008 9.799999 -31.400017\nv -17.000008 9.799999 -31.400017\nv -17.000008 9.799999 -33.400017\nv -19.000008 11.799999 -33.400017\nv -19.000008 11.799999 -31.400017\nv -17.000008 11.799999 -31.400017\nv -17.000008 11.799999 -33.400017\nv -22.600010 9.799999 -33.400017\nv -22.600010 9.799999 -31.400017\nv -20.600010 9.799999 -31.400017\nv -20.600010 9.799999 -33.400017\nv -22.600010 11.799999 -33.400017\nv -22.600010 11.799999 -31.400017\nv -20.600010 11.799999 -31.400017\nv -20.600010 11.799999 -33.400017\nv -26.200012 9.799999 -33.400017\nv -26.200012 9.799999 -31.400017\nv -24.200012 9.799999 -31.400017\nv -24.200012 9.799999 -33.400017\nv -26.200012 11.799999 -33.400017\nv -26.200012 11.799999 -31.400017\nv -24.200012 11.799999 -31.400017\nv -24.200012 11.799999 -33.400017\nv -29.800014 9.799999 -33.400017\nv -29.800014 9.799999 -31.400017\nv -27.800014 9.799999 -31.400017\nv -27.800014 9.799999 -33.400017\nv -29.800014 11.799999 -33.400017\nv -29.800014 11.799999 -31.400017\nv -27.800014 11.799999 -31.400017\nv -27.800014 11.799999 -33.400017\nv -33.400017 9.799999 -33.400017\nv -33.400017 9.799999 -31.400017\nv -31.400017 9.799999 -31.400017\nv -31.400017 9.799999 -33.400017\nv -33.400017 11.799999 -33.400017\nv -33.400017 11.799999 -31.400017\nv -31.400017 11.799999 -31.400017\nv -31.400017 11.799999 -33.400017\nv 1.000000 13.400000 -1.000000\nv 1.000000 13.400000 1.000000\nv -1.000000 13.400000 1.000000\nv -1.000000 13.400000 -1.000000\nv 1.000000 15.400000 -0.999999\nv 0.999999 15.400000 1.000001\nv -1.000000 15.400000 1.000000\nv -1.000000 15.400000 -1.000000\nv 4.600001 13.400000 -1.000000\nv 4.600001 13.400000 1.000000\nv 2.600001 13.400000 1.000000\nv 2.600002 13.400000 -1.000000\nv 4.600002 15.400000 -0.999999\nv 4.600001 15.400000 1.000001\nv 2.600001 15.400000 1.000000\nv 2.600002 15.400000 -1.000000\nv 8.200003 13.400000 -1.000000\nv 8.200003 13.400000 1.000000\nv 6.200003 13.400000 1.000000\nv 6.200004 13.400000 -1.000000\nv 8.200004 15.400000 -0.999999\nv 8.200003 15.400000 1.000001\nv 6.200003 15.400000 1.000000\nv 6.200003 15.400000 -1.000000\nv 11.800005 13.400000 -1.000000\nv 11.800005 13.400000 1.000000\nv 9.800005 13.400000 1.000000\nv 9.800005 13.400000 -1.000000\nv 11.800005 15.400000 -0.999999\nv 11.800004 15.400000 1.000001\nv 9.800005 15.400000 1.000000\nv 9.800005 15.400000 -1.000000\nv 15.400006 13.400000 -1.000000\nv 15.400006 13.400000 1.000000\nv 13.400006 13.400000 1.000000\nv 13.400006 13.400000 -1.000000\nv 15.400007 15.400000 -0.999999\nv 15.400005 15.400000 1.000001\nv 13.400006 15.400000 1.000000\nv 13.400006 15.400000 -1.000000\nv 19.000008 13.400000 -1.000000\nv 19.000008 13.400000 1.000000\nv 17.000008 13.400000 1.000000\nv 17.000008 13.400000 -1.000000\nv 19.000008 15.400000 -0.999999\nv 19.000008 15.400000 1.000001\nv 17.000008 15.400000 1.000000\nv 17.000008 15.400000 -1.000000\nv 22.600010 13.400000 -1.000000\nv 22.600010 13.400000 1.000000\nv 20.600010 13.400000 1.000000\nv 20.600010 13.400000 -1.000000\nv 22.600010 15.400000 -0.999999\nv 22.600010 15.400000 1.000001\nv 20.600010 15.400000 1.000000\nv 20.600010 15.400000 -1.000000\nv 26.200012 13.400000 -1.000000\nv 26.200012 13.400000 1.000000\nv 24.200012 13.400000 1.000000\nv 24.200012 13.400000 -1.000000\nv 26.200012 15.400000 -0.999999\nv 26.200012 15.400000 1.000001\nv 24.200012 15.400000 1.000000\nv 24.200012 15.400000 -1.000000\nv 29.800014 13.400000 -1.000000\nv 29.800014 13.400000 1.000000\nv 27.800014 13.400000 1.000000\nv 27.800014 13.400000 -1.000000\nv 29.800014 15.400000 -0.999999\nv 29.800014 15.400000 1.000001\nv 27.800014 15.400000 1.000000\nv 27.800014 15.400000 -1.000000\nv 33.400017 13.400000 -1.000000\nv 33.400017 13.400000 1.000000\nv 31.400017 13.400000 1.000000\nv 31.400017 13.400000 -1.000000\nv 33.400017 15.400000 -0.999999\nv 33.400017 15.400000 1.000001\nv 31.400017 15.400000 1.000000\nv 31.400017 15.400000 -1.000000\nv 1.000000 13.400000 -4.600001\nv 1.000000 13.400000 -2.600002\nv -1.000000 13.400000 -2.600002\nv -1.000000 13.400000 -4.600002\nv 1.000000 15.400000 -4.600001\nv 0.999999 15.400000 -2.600001\nv -1.000000 15.400000 -2.600002\nv -1.000000 15.400000 -4.600001\nv 4.600001 13.400000 -4.600001\nv 4.600001 13.400000 -2.600002\nv 2.600001 13.400000 -2.600002\nv 2.600002 13.400000 -4.600002\nv 4.600002 15.400000 -4.600001\nv 4.600001 15.400000 -2.600001\nv 2.600001 15.400000 -2.600002\nv 2.600002 15.400000 -4.600001\nv 8.200003 13.400000 -4.600001\nv 8.200003 13.400000 -2.600002\nv 6.200003 13.400000 -2.600002\nv 6.200004 13.400000 -4.600002\nv 8.200004 15.400000 -4.600001\nv 8.200003 15.400000 -2.600001\nv 6.200003 15.400000 -2.600002\nv 6.200003 15.400000 -4.600001\nv 11.800005 13.400000 -4.600001\nv 11.800005 13.400000 -2.600002\nv 9.800005 13.400000 -2.600002\nv 9.800005 13.400000 -4.600002\nv 11.800005 15.400000 -4.600001\nv 11.800004 15.400000 -2.600001\nv 9.800005 15.400000 -2.600002\nv 9.800005 15.400000 -4.600001\nv 15.400006 13.400000 -4.600001\nv 15.400006 13.400000 -2.600002\nv 13.400006 13.400000 -2.600002\nv 13.400006 13.400000 -4.600002\nv 15.400007 15.400000 -4.600001\nv 15.400005 15.400000 -2.600001\nv 13.400006 15.400000 -2.600002\nv 13.400006 15.400000 -4.600001\nv 19.000008 13.400000 -4.600001\nv 19.000008 13.400000 -2.600002\nv 17.000008 13.400000 -2.600002\nv 17.000008 13.400000 -4.600002\nv 19.000008 15.400000 -4.600001\nv 19.000008 15.400000 -2.600001\nv 17.000008 15.400000 -2.600002\nv 17.000008 15.400000 -4.600001\nv 22.600010 13.400000 -4.600001\nv 22.600010 13.400000 -2.600002\nv 20.600010 13.400000 -2.600002\nv 20.600010 13.400000 -4.600002\nv 22.600010 15.400000 -4.600001\nv 22.600010 15.400000 -2.600001\nv 20.600010 15.400000 -2.600002\nv 20.600010 15.400000 -4.600001\nv 26.200012 13.400000 -4.600001\nv 26.200012 13.400000 -2.600002\nv 24.200012 13.400000 -2.600002\nv 24.200012 13.400000 -4.600002\nv 26.200012 15.400000 -4.600001\nv 26.200012 15.400000 -2.600001\nv 24.200012 15.400000 -2.600002\nv 24.200012 15.400000 -4.600001\nv 29.800014 13.400000 -4.600001\nv 29.800014 13.400000 -2.600002\nv 27.800014 13.400000 -2.600002\nv 27.800014 13.400000 -4.600002\nv 29.800014 15.400000 -4.600001\nv 29.800014 15.400000 -2.600001\nv 27.800014 15.400000 -2.600002\nv 27.800014 15.400000 -4.600001\nv 33.400017 13.400000 -4.600001\nv 33.400017 13.400000 -2.600002\nv 31.400017 13.400000 -2.600002\nv 31.400017 13.400000 -4.600002\nv 33.400017 15.400000 -4.600001\nv 33.400017 15.400000 -2.600001\nv 31.400017 15.400000 -2.600002\nv 31.400017 15.400000 -4.600001\nv 1.000000 13.400000 -8.200003\nv 1.000000 13.400000 -6.200003\nv -1.000000 13.400000 -6.200003\nv -1.000000 13.400000 -8.200004\nv 1.000000 15.400000 -8.200003\nv 0.999999 15.400000 -6.200003\nv -1.000000 15.400000 -6.200004\nv -1.000000 15.400000 -8.200003\nv 4.600001 13.400000 -8.200003\nv 4.600001 13.400000 -6.200003\nv 2.600001 13.400000 -6.200003\nv 2.600002 13.400000 -8.200004\nv 4.600002 15.400000 -8.200003\nv 4.600001 15.400000 -6.200003\nv 2.600001 15.400000 -6.200004\nv 2.600002 15.400000 -8.200003\nv 8.200003 13.400000 -8.200003\nv 8.200003 13.400000 -6.200003\nv 6.200003 13.400000 -6.200003\nv 6.200004 13.400000 -8.200004\nv 8.200004 15.400000 -8.200003\nv 8.200003 15.400000 -6.200003\nv 6.200003 15.400000 -6.200004\nv 6.200003 15.400000 -8.200003\nv 11.800005 13.400000 -8.200003\nv 11.800005 13.400000 -6.200003\nv 9.800005 13.400000 -6.200003\nv 9.800005 13.400000 -8.200004\nv 11.800005 15.400000 -8.200003\nv 11.800004 15.400000 -6.200003\nv 9.800005 15.400000 -6.200004\nv 9.800005 15.400000 -8.200003\nv 15.400006 13.400000 -8.200003\nv 15.400006 13.400000 -6.200003\nv 13.400006 13.400000 -6.200003\nv 13.400006 13.400000 -8.200004\nv 15.400007 15.400000 -8.200003\nv 15.400005 15.400000 -6.200003\nv 13.400006 15.400000 -6.200004\nv 13.400006 15.400000 -8.200003\nv 19.000008 13.400000 -8.200003\nv 19.000008 13.400000 -6.200003\nv 17.000008 13.400000 -6.200003\nv 17.000008 13.400000 -8.200004\nv 19.000008 15.400000 -8.200003\nv 19.000008 15.400000 -6.200003\nv 17.000008 15.400000 -6.200004\nv 17.000008 15.400000 -8.200003\nv 22.600010 13.400000 -8.200003\nv 22.600010 13.400000 -6.200003\nv 20.600010 13.400000 -6.200003\nv 20.600010 13.400000 -8.200004\nv 22.600010 15.400000 -8.200003\nv 22.600010 15.400000 -6.200003\nv 20.600010 15.400000 -6.200004\nv 20.600010 15.400000 -8.200003\nv 26.200012 13.400000 -8.200003\nv 26.200012 13.400000 -6.200003\nv 24.200012 13.400000 -6.200003\nv 24.200012 13.400000 -8.200004\nv 26.200012 15.400000 -8.200003\nv 26.200012 15.400000 -6.200003\nv 24.200012 15.400000 -6.200004\nv 24.200012 15.400000 -8.200003\nv 29.800014 13.400000 -8.200003\nv 29.800014 13.400000 -6.200003\nv 27.800014 13.400000 -6.200003\nv 27.800014 13.400000 -8.200004\nv 29.800014 15.400000 -8.200003\nv 29.800014 15.400000 -6.200003\nv 27.800014 15.400000 -6.200004\nv 27.800014 15.400000 -8.200003\nv 33.400017 13.400000 -8.200003\nv 33.400017 13.400000 -6.200003\nv 31.400017 13.400000 -6.200003\nv 31.400017 13.400000 -8.200004\nv 33.400017 15.400000 -8.200003\nv 33.400017 15.400000 -6.200003\nv 31.400017 15.400000 -6.200004\nv 31.400017 15.400000 -8.200003\nv 1.000000 13.400000 -11.800005\nv 1.000000 13.400000 -9.800005\nv -1.000000 13.400000 -9.800005\nv -1.000000 13.400000 -11.800005\nv 1.000000 15.400000 -11.800004\nv 0.999999 15.400000 -9.800004\nv -1.000000 15.400000 -9.800005\nv -1.000000 15.400000 -11.800005\nv 4.600001 13.400000 -11.800005\nv 4.600001 13.400000 -9.800005\nv 2.600001 13.400000 -9.800005\nv 2.600002 13.400000 -11.800005\nv 4.600002 15.400000 -11.800004\nv 4.600001 15.400000 -9.800004\nv 2.600001 15.400000 -9.800005\nv 2.600002 15.400000 -11.800005\nv 8.200003 13.400000 -11.800005\nv 8.200003 13.400000 -9.800005\nv 6.200003 13.400000 -9.800005\nv 6.200004 13.400000 -11.800005\nv 8.200004 15.400000 -11.800004\nv 8.200003 15.400000 -9.800004\nv 6.200003 15.400000 -9.800005\nv 6.200003 15.400000 -11.800005\nv 11.800005 13.400000 -11.800005\nv 11.800005 13.400000 -9.800005\nv 9.800005 13.400000 -9.800005\nv 9.800005 13.400000 -11.800005\nv 11.800005 15.400000 -11.800004\nv 11.800004 15.400000 -9.800004\nv 9.800005 15.400000 -9.800005\nv 9.800005 15.400000 -11.800005\nv 15.400006 13.400000 -11.800005\nv 15.400006 13.400000 -9.800005\nv 13.400006 13.400000 -9.800005\nv 13.400006 13.400000 -11.800005\nv 15.400007 15.400000 -11.800004\nv 15.400005 15.400000 -9.800004\nv 13.400006 15.400000 -9.800005\nv 13.400006 15.400000 -11.800005\nv 19.000008 13.400000 -11.800005\nv 19.000008 13.400000 -9.800005\nv 17.000008 13.400000 -9.800005\nv 17.000008 13.400000 -11.800005\nv 19.000008 15.400000 -11.800004\nv 19.000008 15.400000 -9.800004\nv 17.000008 15.400000 -9.800005\nv 17.000008 15.400000 -11.800005\nv 22.600010 13.400000 -11.800005\nv 22.600010 13.400000 -9.800005\nv 20.600010 13.400000 -9.800005\nv 20.600010 13.400000 -11.800005\nv 22.600010 15.400000 -11.800004\nv 22.600010 15.400000 -9.800004\nv 20.600010 15.400000 -9.800005\nv 20.600010 15.400000 -11.800005\nv 26.200012 13.400000 -11.800005\nv 26.200012 13.400000 -9.800005\nv 24.200012 13.400000 -9.800005\nv 24.200012 13.400000 -11.800005\nv 26.200012 15.400000 -11.800004\nv 26.200012 15.400000 -9.800004\nv 24.200012 15.400000 -9.800005\nv 24.200012 15.400000 -11.800005\nv 29.800014 13.400000 -11.800005\nv 29.800014 13.400000 -9.800005\nv 27.800014 13.400000 -9.800005\nv 27.800014 13.400000 -11.800005\nv 29.800014 15.400000 -11.800004\nv 29.800014 15.400000 -9.800004\nv 27.800014 15.400000 -9.800005\nv 27.800014 15.400000 -11.800005\nv 33.400017 13.400000 -11.800005\nv 33.400017 13.400000 -9.800005\nv 31.400017 13.400000 -9.800005\nv 31.400017 13.400000 -11.800005\nv 33.400017 15.400000 -11.800004\nv 33.400017 15.400000 -9.800004\nv 31.400017 15.400000 -9.800005\nv 31.400017 15.400000 -11.800005\nv 1.000000 13.400000 -15.400006\nv 1.000000 13.400000 -13.400006\nv -1.000000 13.400000 -13.400006\nv -1.000000 13.400000 -15.400006\nv 1.000000 15.400000 -15.400005\nv 0.999999 15.400000 -13.400005\nv -1.000000 15.400000 -13.400006\nv -1.000000 15.400000 -15.400006\nv 4.600001 13.400000 -15.400006\nv 4.600001 13.400000 -13.400006\nv 2.600001 13.400000 -13.400006\nv 2.600002 13.400000 -15.400006\nv 4.600002 15.400000 -15.400005\nv 4.600001 15.400000 -13.400005\nv 2.600001 15.400000 -13.400006\nv 2.600002 15.400000 -15.400006\nv 8.200003 13.400000 -15.400006\nv 8.200003 13.400000 -13.400006\nv 6.200003 13.400000 -13.400006\nv 6.200004 13.400000 -15.400006\nv 8.200004 15.400000 -15.400005\nv 8.200003 15.400000 -13.400005\nv 6.200003 15.400000 -13.400006\nv 6.200003 15.400000 -15.400006\nv 11.800005 13.400000 -15.400006\nv 11.800005 13.400000 -13.400006\nv 9.800005 13.400000 -13.400006\nv 9.800005 13.400000 -15.400006\nv 11.800005 15.400000 -15.400005\nv 11.800004 15.400000 -13.400005\nv 9.800005 15.400000 -13.400006\nv 9.800005 15.400000 -15.400006\nv 15.400006 13.400000 -15.400006\nv 15.400006 13.400000 -13.400006\nv 13.400006 13.400000 -13.400006\nv 13.400006 13.400000 -15.400006\nv 15.400007 15.400000 -15.400005\nv 15.400005 15.400000 -13.400005\nv 13.400006 15.400000 -13.400006\nv 13.400006 15.400000 -15.400006\nv 19.000008 13.400000 -15.400006\nv 19.000008 13.400000 -13.400006\nv 17.000008 13.400000 -13.400006\nv 17.000008 13.400000 -15.400006\nv 19.000008 15.400000 -15.400005\nv 19.000008 15.400000 -13.400005\nv 17.000008 15.400000 -13.400006\nv 17.000008 15.400000 -15.400006\nv 22.600010 13.400000 -15.400006\nv 22.600010 13.400000 -13.400006\nv 20.600010 13.400000 -13.400006\nv 20.600010 13.400000 -15.400006\nv 22.600010 15.400000 -15.400005\nv 22.600010 15.400000 -13.400005\nv 20.600010 15.400000 -13.400006\nv 20.600010 15.400000 -15.400006\nv 26.200012 13.400000 -15.400006\nv 26.200012 13.400000 -13.400006\nv 24.200012 13.400000 -13.400006\nv 24.200012 13.400000 -15.400006\nv 26.200012 15.400000 -15.400005\nv 26.200012 15.400000 -13.400005\nv 24.200012 15.400000 -13.400006\nv 24.200012 15.400000 -15.400006\nv 29.800014 13.400000 -15.400006\nv 29.800014 13.400000 -13.400006\nv 27.800014 13.400000 -13.400006\nv 27.800014 13.400000 -15.400006\nv 29.800014 15.400000 -15.400005\nv 29.800014 15.400000 -13.400005\nv 27.800014 15.400000 -13.400006\nv 27.800014 15.400000 -15.400006\nv 33.400017 13.400000 -15.400006\nv 33.400017 13.400000 -13.400006\nv 31.400017 13.400000 -13.400006\nv 31.400017 13.400000 -15.400006\nv 33.400017 15.400000 -15.400005\nv 33.400017 15.400000 -13.400005\nv 31.400017 15.400000 -13.400006\nv 31.400017 15.400000 -15.400006\nv 1.000000 13.400000 -19.000008\nv 1.000000 13.400000 -17.000008\nv -1.000000 13.400000 -17.000008\nv -1.000000 13.400000 -19.000008\nv 1.000000 15.400000 -19.000008\nv 0.999999 15.400000 -17.000008\nv -1.000000 15.400000 -17.000008\nv -1.000000 15.400000 -19.000008\nv 4.600001 13.400000 -19.000008\nv 4.600001 13.400000 -17.000008\nv 2.600001 13.400000 -17.000008\nv 2.600002 13.400000 -19.000008\nv 4.600002 15.400000 -19.000008\nv 4.600001 15.400000 -17.000008\nv 2.600001 15.400000 -17.000008\nv 2.600002 15.400000 -19.000008\nv 8.200003 13.400000 -19.000008\nv 8.200003 13.400000 -17.000008\nv 6.200003 13.400000 -17.000008\nv 6.200004 13.400000 -19.000008\nv 8.200004 15.400000 -19.000008\nv 8.200003 15.400000 -17.000008\nv 6.200003 15.400000 -17.000008\nv 6.200003 15.400000 -19.000008\nv 11.800005 13.400000 -19.000008\nv 11.800005 13.400000 -17.000008\nv 9.800005 13.400000 -17.000008\nv 9.800005 13.400000 -19.000008\nv 11.800005 15.400000 -19.000008\nv 11.800004 15.400000 -17.000008\nv 9.800005 15.400000 -17.000008\nv 9.800005 15.400000 -19.000008\nv 15.400006 13.400000 -19.000008\nv 15.400006 13.400000 -17.000008\nv 13.400006 13.400000 -17.000008\nv 13.400006 13.400000 -19.000008\nv 15.400007 15.400000 -19.000008\nv 15.400005 15.400000 -17.000008\nv 13.400006 15.400000 -17.000008\nv 13.400006 15.400000 -19.000008\nv 19.000008 13.400000 -19.000008\nv 19.000008 13.400000 -17.000008\nv 17.000008 13.400000 -17.000008\nv 17.000008 13.400000 -19.000008\nv 19.000008 15.400000 -19.000008\nv 19.000008 15.400000 -17.000008\nv 17.000008 15.400000 -17.000008\nv 17.000008 15.400000 -19.000008\nv 22.600010 13.400000 -19.000008\nv 22.600010 13.400000 -17.000008\nv 20.600010 13.400000 -17.000008\nv 20.600010 13.400000 -19.000008\nv 22.600010 15.400000 -19.000008\nv 22.600010 15.400000 -17.000008\nv 20.600010 15.400000 -17.000008\nv 20.600010 15.400000 -19.000008\nv 26.200012 13.400000 -19.000008\nv 26.200012 13.400000 -17.000008\nv 24.200012 13.400000 -17.000008\nv 24.200012 13.400000 -19.000008\nv 26.200012 15.400000 -19.000008\nv 26.200012 15.400000 -17.000008\nv 24.200012 15.400000 -17.000008\nv 24.200012 15.400000 -19.000008\nv 29.800014 13.400000 -19.000008\nv 29.800014 13.400000 -17.000008\nv 27.800014 13.400000 -17.000008\nv 27.800014 13.400000 -19.000008\nv 29.800014 15.400000 -19.000008\nv 29.800014 15.400000 -17.000008\nv 27.800014 15.400000 -17.000008\nv 27.800014 15.400000 -19.000008\nv 33.400017 13.400000 -19.000008\nv 33.400017 13.400000 -17.000008\nv 31.400017 13.400000 -17.000008\nv 31.400017 13.400000 -19.000008\nv 33.400017 15.400000 -19.000008\nv 33.400017 15.400000 -17.000008\nv 31.400017 15.400000 -17.000008\nv 31.400017 15.400000 -19.000008\nv 1.000000 13.400000 -22.600010\nv 1.000000 13.400000 -20.600010\nv -1.000000 13.400000 -20.600010\nv -1.000000 13.400000 -22.600010\nv 1.000000 15.400000 -22.600010\nv 0.999999 15.400000 -20.600010\nv -1.000000 15.400000 -20.600010\nv -1.000000 15.400000 -22.600010\nv 4.600001 13.400000 -22.600010\nv 4.600001 13.400000 -20.600010\nv 2.600001 13.400000 -20.600010\nv 2.600002 13.400000 -22.600010\nv 4.600002 15.400000 -22.600010\nv 4.600001 15.400000 -20.600010\nv 2.600001 15.400000 -20.600010\nv 2.600002 15.400000 -22.600010\nv 8.200003 13.400000 -22.600010\nv 8.200003 13.400000 -20.600010\nv 6.200003 13.400000 -20.600010\nv 6.200004 13.400000 -22.600010\nv 8.200004 15.400000 -22.600010\nv 8.200003 15.400000 -20.600010\nv 6.200003 15.400000 -20.600010\nv 6.200003 15.400000 -22.600010\nv 11.800005 13.400000 -22.600010\nv 11.800005 13.400000 -20.600010\nv 9.800005 13.400000 -20.600010\nv 9.800005 13.400000 -22.600010\nv 11.800005 15.400000 -22.600010\nv 11.800004 15.400000 -20.600010\nv 9.800005 15.400000 -20.600010\nv 9.800005 15.400000 -22.600010\nv 15.400006 13.400000 -22.600010\nv 15.400006 13.400000 -20.600010\nv 13.400006 13.400000 -20.600010\nv 13.400006 13.400000 -22.600010\nv 15.400007 15.400000 -22.600010\nv 15.400005 15.400000 -20.600010\nv 13.400006 15.400000 -20.600010\nv 13.400006 15.400000 -22.600010\nv 19.000008 13.400000 -22.600010\nv 19.000008 13.400000 -20.600010\nv 17.000008 13.400000 -20.600010\nv 17.000008 13.400000 -22.600010\nv 19.000008 15.400000 -22.600010\nv 19.000008 15.400000 -20.600010\nv 17.000008 15.400000 -20.600010\nv 17.000008 15.400000 -22.600010\nv 22.600010 13.400000 -22.600010\nv 22.600010 13.400000 -20.600010\nv 20.600010 13.400000 -20.600010\nv 20.600010 13.400000 -22.600010\nv 22.600010 15.400000 -22.600010\nv 22.600010 15.400000 -20.600010\nv 20.600010 15.400000 -20.600010\nv 20.600010 15.400000 -22.600010\nv 26.200012 13.400000 -22.600010\nv 26.200012 13.400000 -20.600010\nv 24.200012 13.400000 -20.600010\nv 24.200012 13.400000 -22.600010\nv 26.200012 15.400000 -22.600010\nv 26.200012 15.400000 -20.600010\nv 24.200012 15.400000 -20.600010\nv 24.200012 15.400000 -22.600010\nv 29.800014 13.400000 -22.600010\nv 29.800014 13.400000 -20.600010\nv 27.800014 13.400000 -20.600010\nv 27.800014 13.400000 -22.600010\nv 29.800014 15.400000 -22.600010\nv 29.800014 15.400000 -20.600010\nv 27.800014 15.400000 -20.600010\nv 27.800014 15.400000 -22.600010\nv 33.400017 13.400000 -22.600010\nv 33.400017 13.400000 -20.600010\nv 31.400017 13.400000 -20.600010\nv 31.400017 13.400000 -22.600010\nv 33.400017 15.400000 -22.600010\nv 33.400017 15.400000 -20.600010\nv 31.400017 15.400000 -20.600010\nv 31.400017 15.400000 -22.600010\nv 1.000000 13.400000 -26.200012\nv 1.000000 13.400000 -24.200012\nv -1.000000 13.400000 -24.200012\nv -1.000000 13.400000 -26.200012\nv 1.000000 15.400000 -26.200012\nv 0.999999 15.400000 -24.200012\nv -1.000000 15.400000 -24.200012\nv -1.000000 15.400000 -26.200012\nv 4.600001 13.400000 -26.200012\nv 4.600001 13.400000 -24.200012\nv 2.600001 13.400000 -24.200012\nv 2.600002 13.400000 -26.200012\nv 4.600002 15.400000 -26.200012\nv 4.600001 15.400000 -24.200012\nv 2.600001 15.400000 -24.200012\nv 2.600002 15.400000 -26.200012\nv 8.200003 13.400000 -26.200012\nv 8.200003 13.400000 -24.200012\nv 6.200003 13.400000 -24.200012\nv 6.200004 13.400000 -26.200012\nv 8.200004 15.400000 -26.200012\nv 8.200003 15.400000 -24.200012\nv 6.200003 15.400000 -24.200012\nv 6.200003 15.400000 -26.200012\nv 11.800005 13.400000 -26.200012\nv 11.800005 13.400000 -24.200012\nv 9.800005 13.400000 -24.200012\nv 9.800005 13.400000 -26.200012\nv 11.800005 15.400000 -26.200012\nv 11.800004 15.400000 -24.200012\nv 9.800005 15.400000 -24.200012\nv 9.800005 15.400000 -26.200012\nv 15.400006 13.400000 -26.200012\nv 15.400006 13.400000 -24.200012\nv 13.400006 13.400000 -24.200012\nv 13.400006 13.400000 -26.200012\nv 15.400007 15.400000 -26.200012\nv 15.400005 15.400000 -24.200012\nv 13.400006 15.400000 -24.200012\nv 13.400006 15.400000 -26.200012\nv 19.000008 13.400000 -26.200012\nv 19.000008 13.400000 -24.200012\nv 17.000008 13.400000 -24.200012\nv 17.000008 13.400000 -26.200012\nv 19.000008 15.400000 -26.200012\nv 19.000008 15.400000 -24.200012\nv 17.000008 15.400000 -24.200012\nv 17.000008 15.400000 -26.200012\nv 22.600010 13.400000 -26.200012\nv 22.600010 13.400000 -24.200012\nv 20.600010 13.400000 -24.200012\nv 20.600010 13.400000 -26.200012\nv 22.600010 15.400000 -26.200012\nv 22.600010 15.400000 -24.200012\nv 20.600010 15.400000 -24.200012\nv 20.600010 15.400000 -26.200012\nv 26.200012 13.400000 -26.200012\nv 26.200012 13.400000 -24.200012\nv 24.200012 13.400000 -24.200012\nv 24.200012 13.400000 -26.200012\nv 26.200012 15.400000 -26.200012\nv 26.200012 15.400000 -24.200012\nv 24.200012 15.400000 -24.200012\nv 24.200012 15.400000 -26.200012\nv 29.800014 13.400000 -26.200012\nv 29.800014 13.400000 -24.200012\nv 27.800014 13.400000 -24.200012\nv 27.800014 13.400000 -26.200012\nv 29.800014 15.400000 -26.200012\nv 29.800014 15.400000 -24.200012\nv 27.800014 15.400000 -24.200012\nv 27.800014 15.400000 -26.200012\nv 33.400017 13.400000 -26.200012\nv 33.400017 13.400000 -24.200012\nv 31.400017 13.400000 -24.200012\nv 31.400017 13.400000 -26.200012\nv 33.400017 15.400000 -26.200012\nv 33.400017 15.400000 -24.200012\nv 31.400017 15.400000 -24.200012\nv 31.400017 15.400000 -26.200012\nv 1.000000 13.400000 -29.800014\nv 1.000000 13.400000 -27.800014\nv -1.000000 13.400000 -27.800014\nv -1.000000 13.400000 -29.800014\nv 1.000000 15.400000 -29.800014\nv 0.999999 15.400000 -27.800014\nv -1.000000 15.400000 -27.800014\nv -1.000000 15.400000 -29.800014\nv 4.600001 13.400000 -29.800014\nv 4.600001 13.400000 -27.800014\nv 2.600001 13.400000 -27.800014\nv 2.600002 13.400000 -29.800014\nv 4.600002 15.400000 -29.800014\nv 4.600001 15.400000 -27.800014\nv 2.600001 15.400000 -27.800014\nv 2.600002 15.400000 -29.800014\nv 8.200003 13.400000 -29.800014\nv 8.200003 13.400000 -27.800014\nv 6.200003 13.400000 -27.800014\nv 6.200004 13.400000 -29.800014\nv 8.200004 15.400000 -29.800014\nv 8.200003 15.400000 -27.800014\nv 6.200003 15.400000 -27.800014\nv 6.200003 15.400000 -29.800014\nv 11.800005 13.400000 -29.800014\nv 11.800005 13.400000 -27.800014\nv 9.800005 13.400000 -27.800014\nv 9.800005 13.400000 -29.800014\nv 11.800005 15.400000 -29.800014\nv 11.800004 15.400000 -27.800014\nv 9.800005 15.400000 -27.800014\nv 9.800005 15.400000 -29.800014\nv 15.400006 13.400000 -29.800014\nv 15.400006 13.400000 -27.800014\nv 13.400006 13.400000 -27.800014\nv 13.400006 13.400000 -29.800014\nv 15.400007 15.400000 -29.800014\nv 15.400005 15.400000 -27.800014\nv 13.400006 15.400000 -27.800014\nv 13.400006 15.400000 -29.800014\nv 19.000008 13.400000 -29.800014\nv 19.000008 13.400000 -27.800014\nv 17.000008 13.400000 -27.800014\nv 17.000008 13.400000 -29.800014\nv 19.000008 15.400000 -29.800014\nv 19.000008 15.400000 -27.800014\nv 17.000008 15.400000 -27.800014\nv 17.000008 15.400000 -29.800014\nv 22.600010 13.400000 -29.800014\nv 22.600010 13.400000 -27.800014\nv 20.600010 13.400000 -27.800014\nv 20.600010 13.400000 -29.800014\nv 22.600010 15.400000 -29.800014\nv 22.600010 15.400000 -27.800014\nv 20.600010 15.400000 -27.800014\nv 20.600010 15.400000 -29.800014\nv 26.200012 13.400000 -29.800014\nv 26.200012 13.400000 -27.800014\nv 24.200012 13.400000 -27.800014\nv 24.200012 13.400000 -29.800014\nv 26.200012 15.400000 -29.800014\nv 26.200012 15.400000 -27.800014\nv 24.200012 15.400000 -27.800014\nv 24.200012 15.400000 -29.800014\nv 29.800014 13.400000 -29.800014\nv 29.800014 13.400000 -27.800014\nv 27.800014 13.400000 -27.800014\nv 27.800014 13.400000 -29.800014\nv 29.800014 15.400000 -29.800014\nv 29.800014 15.400000 -27.800014\nv 27.800014 15.400000 -27.800014\nv 27.800014 15.400000 -29.800014\nv 33.400017 13.400000 -29.800014\nv 33.400017 13.400000 -27.800014\nv 31.400017 13.400000 -27.800014\nv 31.400017 13.400000 -29.800014\nv 33.400017 15.400000 -29.800014\nv 33.400017 15.400000 -27.800014\nv 31.400017 15.400000 -27.800014\nv 31.400017 15.400000 -29.800014\nv 1.000000 13.400000 -33.400017\nv 1.000000 13.400000 -31.400017\nv -1.000000 13.400000 -31.400017\nv -1.000000 13.400000 -33.400017\nv 1.000000 15.400000 -33.400017\nv 0.999999 15.400000 -31.400017\nv -1.000000 15.400000 -31.400017\nv -1.000000 15.400000 -33.400017\nv 4.600001 13.400000 -33.400017\nv 4.600001 13.400000 -31.400017\nv 2.600001 13.400000 -31.400017\nv 2.600002 13.400000 -33.400017\nv 4.600002 15.400000 -33.400017\nv 4.600001 15.400000 -31.400017\nv 2.600001 15.400000 -31.400017\nv 2.600002 15.400000 -33.400017\nv 8.200003 13.400000 -33.400017\nv 8.200003 13.400000 -31.400017\nv 6.200003 13.400000 -31.400017\nv 6.200004 13.400000 -33.400017\nv 8.200004 15.400000 -33.400017\nv 8.200003 15.400000 -31.400017\nv 6.200003 15.400000 -31.400017\nv 6.200003 15.400000 -33.400017\nv 11.800005 13.400000 -33.400017\nv 11.800005 13.400000 -31.400017\nv 9.800005 13.400000 -31.400017\nv 9.800005 13.400000 -33.400017\nv 11.800005 15.400000 -33.400017\nv 11.800004 15.400000 -31.400017\nv 9.800005 15.400000 -31.400017\nv 9.800005 15.400000 -33.400017\nv 15.400006 13.400000 -33.400017\nv 15.400006 13.400000 -31.400017\nv 13.400006 13.400000 -31.400017\nv 13.400006 13.400000 -33.400017\nv 15.400007 15.400000 -33.400017\nv 15.400005 15.400000 -31.400017\nv 13.400006 15.400000 -31.400017\nv 13.400006 15.400000 -33.400017\nv 19.000008 13.400000 -33.400017\nv 19.000008 13.400000 -31.400017\nv 17.000008 13.400000 -31.400017\nv 17.000008 13.400000 -33.400017\nv 19.000008 15.400000 -33.400017\nv 19.000008 15.400000 -31.400017\nv 17.000008 15.400000 -31.400017\nv 17.000008 15.400000 -33.400017\nv 22.600010 13.400000 -33.400017\nv 22.600010 13.400000 -31.400017\nv 20.600010 13.400000 -31.400017\nv 20.600010 13.400000 -33.400017\nv 22.600010 15.400000 -33.400017\nv 22.600010 15.400000 -31.400017\nv 20.600010 15.400000 -31.400017\nv 20.600010 15.400000 -33.400017\nv 26.200012 13.400000 -33.400017\nv 26.200012 13.400000 -31.400017\nv 24.200012 13.400000 -31.400017\nv 24.200012 13.400000 -33.400017\nv 26.200012 15.400000 -33.400017\nv 26.200012 15.400000 -31.400017\nv 24.200012 15.400000 -31.400017\nv 24.200012 15.400000 -33.400017\nv 29.800014 13.400000 -33.400017\nv 29.800014 13.400000 -31.400017\nv 27.800014 13.400000 -31.400017\nv 27.800014 13.400000 -33.400017\nv 29.800014 15.400000 -33.400017\nv 29.800014 15.400000 -31.400017\nv 27.800014 15.400000 -31.400017\nv 27.800014 15.400000 -33.400017\nv 33.400017 13.400000 -33.400017\nv 33.400017 13.400000 -31.400017\nv 31.400017 13.400000 -31.400017\nv 31.400017 13.400000 -33.400017\nv 33.400017 15.400000 -33.400017\nv 33.400017 15.400000 -31.400017\nv 31.400017 15.400000 -31.400017\nv 31.400017 15.400000 -33.400017\nv -1.000000 13.400000 -1.000000\nv -1.000000 13.400000 1.000000\nv 1.000000 13.400000 1.000000\nv 1.000000 13.400000 -1.000000\nv -1.000000 15.400000 -0.999999\nv -0.999999 15.400000 1.000001\nv 1.000000 15.400000 1.000000\nv 1.000000 15.400000 -1.000000\nv -4.600001 13.400000 -1.000000\nv -4.600001 13.400000 1.000000\nv -2.600001 13.400000 1.000000\nv -2.600002 13.400000 -1.000000\nv -4.600002 15.400000 -0.999999\nv -4.600001 15.400000 1.000001\nv -2.600001 15.400000 1.000000\nv -2.600002 15.400000 -1.000000\nv -8.200003 13.400000 -1.000000\nv -8.200003 13.400000 1.000000\nv -6.200003 13.400000 1.000000\nv -6.200004 13.400000 -1.000000\nv -8.200004 15.400000 -0.999999\nv -8.200003 15.400000 1.000001\nv -6.200003 15.400000 1.000000\nv -6.200003 15.400000 -1.000000\nv -11.800005 13.400000 -1.000000\nv -11.800005 13.400000 1.000000\nv -9.800005 13.400000 1.000000\nv -9.800005 13.400000 -1.000000\nv -11.800005 15.400000 -0.999999\nv -11.800004 15.400000 1.000001\nv -9.800005 15.400000 1.000000\nv -9.800005 15.400000 -1.000000\nv -15.400006 13.400000 -1.000000\nv -15.400006 13.400000 1.000000\nv -13.400006 13.400000 1.000000\nv -13.400006 13.400000 -1.000000\nv -15.400007 15.400000 -0.999999\nv -15.400005 15.400000 1.000001\nv -13.400006 15.400000 1.000000\nv -13.400006 15.400000 -1.000000\nv -19.000008 13.400000 -1.000000\nv -19.000008 13.400000 1.000000\nv -17.000008 13.400000 1.000000\nv -17.000008 13.400000 -1.000000\nv -19.000008 15.400000 -0.999999\nv -19.000008 15.400000 1.000001\nv -17.000008 15.400000 1.000000\nv -17.000008 15.400000 -1.000000\nv -22.600010 13.400000 -1.000000\nv -22.600010 13.400000 1.000000\nv -20.600010 13.400000 1.000000\nv -20.600010 13.400000 -1.000000\nv -22.600010 15.400000 -0.999999\nv -22.600010 15.400000 1.000001\nv -20.600010 15.400000 1.000000\nv -20.600010 15.400000 -1.000000\nv -26.200012 13.400000 -1.000000\nv -26.200012 13.400000 1.000000\nv -24.200012 13.400000 1.000000\nv -24.200012 13.400000 -1.000000\nv -26.200012 15.400000 -0.999999\nv -26.200012 15.400000 1.000001\nv -24.200012 15.400000 1.000000\nv -24.200012 15.400000 -1.000000\nv -29.800014 13.400000 -1.000000\nv -29.800014 13.400000 1.000000\nv -27.800014 13.400000 1.000000\nv -27.800014 13.400000 -1.000000\nv -29.800014 15.400000 -0.999999\nv -29.800014 15.400000 1.000001\nv -27.800014 15.400000 1.000000\nv -27.800014 15.400000 -1.000000\nv -33.400017 13.400000 -1.000000\nv -33.400017 13.400000 1.000000\nv -31.400017 13.400000 1.000000\nv -31.400017 13.400000 -1.000000\nv -33.400017 15.400000 -0.999999\nv -33.400017 15.400000 1.000001\nv -31.400017 15.400000 1.000000\nv -31.400017 15.400000 -1.000000\nv -1.000000 13.400000 -4.600001\nv -1.000000 13.400000 -2.600002\nv 1.000000 13.400000 -2.600002\nv 1.000000 13.400000 -4.600002\nv -1.000000 15.400000 -4.600001\nv -0.999999 15.400000 -2.600001\nv 1.000000 15.400000 -2.600002\nv 1.000000 15.400000 -4.600001\nv -4.600001 13.400000 -4.600001\nv -4.600001 13.400000 -2.600002\nv -2.600001 13.400000 -2.600002\nv -2.600002 13.400000 -4.600002\nv -4.600002 15.400000 -4.600001\nv -4.600001 15.400000 -2.600001\nv -2.600001 15.400000 -2.600002\nv -2.600002 15.400000 -4.600001\nv -8.200003 13.400000 -4.600001\nv -8.200003 13.400000 -2.600002\nv -6.200003 13.400000 -2.600002\nv -6.200004 13.400000 -4.600002\nv -8.200004 15.400000 -4.600001\nv -8.200003 15.400000 -2.600001\nv -6.200003 15.400000 -2.600002\nv -6.200003 15.400000 -4.600001\nv -11.800005 13.400000 -4.600001\nv -11.800005 13.400000 -2.600002\nv -9.800005 13.400000 -2.600002\nv -9.800005 13.400000 -4.600002\nv -11.800005 15.400000 -4.600001\nv -11.800004 15.400000 -2.600001\nv -9.800005 15.400000 -2.600002\nv -9.800005 15.400000 -4.600001\nv -15.400006 13.400000 -4.600001\nv -15.400006 13.400000 -2.600002\nv -13.400006 13.400000 -2.600002\nv -13.400006 13.400000 -4.600002\nv -15.400007 15.400000 -4.600001\nv -15.400005 15.400000 -2.600001\nv -13.400006 15.400000 -2.600002\nv -13.400006 15.400000 -4.600001\nv -19.000008 13.400000 -4.600001\nv -19.000008 13.400000 -2.600002\nv -17.000008 13.400000 -2.600002\nv -17.000008 13.400000 -4.600002\nv -19.000008 15.400000 -4.600001\nv -19.000008 15.400000 -2.600001\nv -17.000008 15.400000 -2.600002\nv -17.000008 15.400000 -4.600001\nv -22.600010 13.400000 -4.600001\nv -22.600010 13.400000 -2.600002\nv -20.600010 13.400000 -2.600002\nv -20.600010 13.400000 -4.600002\nv -22.600010 15.400000 -4.600001\nv -22.600010 15.400000 -2.600001\nv -20.600010 15.400000 -2.600002\nv -20.600010 15.400000 -4.600001\nv -26.200012 13.400000 -4.600001\nv -26.200012 13.400000 -2.600002\nv -24.200012 13.400000 -2.600002\nv -24.200012 13.400000 -4.600002\nv -26.200012 15.400000 -4.600001\nv -26.200012 15.400000 -2.600001\nv -24.200012 15.400000 -2.600002\nv -24.200012 15.400000 -4.600001\nv -29.800014 13.400000 -4.600001\nv -29.800014 13.400000 -2.600002\nv -27.800014 13.400000 -2.600002\nv -27.800014 13.400000 -4.600002\nv -29.800014 15.400000 -4.600001\nv -29.800014 15.400000 -2.600001\nv -27.800014 15.400000 -2.600002\nv -27.800014 15.400000 -4.600001\nv -33.400017 13.400000 -4.600001\nv -33.400017 13.400000 -2.600002\nv -31.400017 13.400000 -2.600002\nv -31.400017 13.400000 -4.600002\nv -33.400017 15.400000 -4.600001\nv -33.400017 15.400000 -2.600001\nv -31.400017 15.400000 -2.600002\nv -31.400017 15.400000 -4.600001\nv -1.000000 13.400000 -8.200003\nv -1.000000 13.400000 -6.200003\nv 1.000000 13.400000 -6.200003\nv 1.000000 13.400000 -8.200004\nv -1.000000 15.400000 -8.200003\nv -0.999999 15.400000 -6.200003\nv 1.000000 15.400000 -6.200004\nv 1.000000 15.400000 -8.200003\nv -4.600001 13.400000 -8.200003\nv -4.600001 13.400000 -6.200003\nv -2.600001 13.400000 -6.200003\nv -2.600002 13.400000 -8.200004\nv -4.600002 15.400000 -8.200003\nv -4.600001 15.400000 -6.200003\nv -2.600001 15.400000 -6.200004\nv -2.600002 15.400000 -8.200003\nv -8.200003 13.400000 -8.200003\nv -8.200003 13.400000 -6.200003\nv -6.200003 13.400000 -6.200003\nv -6.200004 13.400000 -8.200004\nv -8.200004 15.400000 -8.200003\nv -8.200003 15.400000 -6.200003\nv -6.200003 15.400000 -6.200004\nv -6.200003 15.400000 -8.200003\nv -11.800005 13.400000 -8.200003\nv -11.800005 13.400000 -6.200003\nv -9.800005 13.400000 -6.200003\nv -9.800005 13.400000 -8.200004\nv -11.800005 15.400000 -8.200003\nv -11.800004 15.400000 -6.200003\nv -9.800005 15.400000 -6.200004\nv -9.800005 15.400000 -8.200003\nv -15.400006 13.400000 -8.200003\nv -15.400006 13.400000 -6.200003\nv -13.400006 13.400000 -6.200003\nv -13.400006 13.400000 -8.200004\nv -15.400007 15.400000 -8.200003\nv -15.400005 15.400000 -6.200003\nv -13.400006 15.400000 -6.200004\nv -13.400006 15.400000 -8.200003\nv -19.000008 13.400000 -8.200003\nv -19.000008 13.400000 -6.200003\nv -17.000008 13.400000 -6.200003\nv -17.000008 13.400000 -8.200004\nv -19.000008 15.400000 -8.200003\nv -19.000008 15.400000 -6.200003\nv -17.000008 15.400000 -6.200004\nv -17.000008 15.400000 -8.200003\nv -22.600010 13.400000 -8.200003\nv -22.600010 13.400000 -6.200003\nv -20.600010 13.400000 -6.200003\nv -20.600010 13.400000 -8.200004\nv -22.600010 15.400000 -8.200003\nv -22.600010 15.400000 -6.200003\nv -20.600010 15.400000 -6.200004\nv -20.600010 15.400000 -8.200003\nv -26.200012 13.400000 -8.200003\nv -26.200012 13.400000 -6.200003\nv -24.200012 13.400000 -6.200003\nv -24.200012 13.400000 -8.200004\nv -26.200012 15.400000 -8.200003\nv -26.200012 15.400000 -6.200003\nv -24.200012 15.400000 -6.200004\nv -24.200012 15.400000 -8.200003\nv -29.800014 13.400000 -8.200003\nv -29.800014 13.400000 -6.200003\nv -27.800014 13.400000 -6.200003\nv -27.800014 13.400000 -8.200004\nv -29.800014 15.400000 -8.200003\nv -29.800014 15.400000 -6.200003\nv -27.800014 15.400000 -6.200004\nv -27.800014 15.400000 -8.200003\nv -33.400017 13.400000 -8.200003\nv -33.400017 13.400000 -6.200003\nv -31.400017 13.400000 -6.200003\nv -31.400017 13.400000 -8.200004\nv -33.400017 15.400000 -8.200003\nv -33.400017 15.400000 -6.200003\nv -31.400017 15.400000 -6.200004\nv -31.400017 15.400000 -8.200003\nv -1.000000 13.400000 -11.800005\nv -1.000000 13.400000 -9.800005\nv 1.000000 13.400000 -9.800005\nv 1.000000 13.400000 -11.800005\nv -1.000000 15.400000 -11.800004\nv -0.999999 15.400000 -9.800004\nv 1.000000 15.400000 -9.800005\nv 1.000000 15.400000 -11.800005\nv -4.600001 13.400000 -11.800005\nv -4.600001 13.400000 -9.800005\nv -2.600001 13.400000 -9.800005\nv -2.600002 13.400000 -11.800005\nv -4.600002 15.400000 -11.800004\nv -4.600001 15.400000 -9.800004\nv -2.600001 15.400000 -9.800005\nv -2.600002 15.400000 -11.800005\nv -8.200003 13.400000 -11.800005\nv -8.200003 13.400000 -9.800005\nv -6.200003 13.400000 -9.800005\nv -6.200004 13.400000 -11.800005\nv -8.200004 15.400000 -11.800004\nv -8.200003 15.400000 -9.800004\nv -6.200003 15.400000 -9.800005\nv -6.200003 15.400000 -11.800005\nv -11.800005 13.400000 -11.800005\nv -11.800005 13.400000 -9.800005\nv -9.800005 13.400000 -9.800005\nv -9.800005 13.400000 -11.800005\nv -11.800005 15.400000 -11.800004\nv -11.800004 15.400000 -9.800004\nv -9.800005 15.400000 -9.800005\nv -9.800005 15.400000 -11.800005\nv -15.400006 13.400000 -11.800005\nv -15.400006 13.400000 -9.800005\nv -13.400006 13.400000 -9.800005\nv -13.400006 13.400000 -11.800005\nv -15.400007 15.400000 -11.800004\nv -15.400005 15.400000 -9.800004\nv -13.400006 15.400000 -9.800005\nv -13.400006 15.400000 -11.800005\nv -19.000008 13.400000 -11.800005\nv -19.000008 13.400000 -9.800005\nv -17.000008 13.400000 -9.800005\nv -17.000008 13.400000 -11.800005\nv -19.000008 15.400000 -11.800004\nv -19.000008 15.400000 -9.800004\nv -17.000008 15.400000 -9.800005\nv -17.000008 15.400000 -11.800005\nv -22.600010 13.400000 -11.800005\nv -22.600010 13.400000 -9.800005\nv -20.600010 13.400000 -9.800005\nv -20.600010 13.400000 -11.800005\nv -22.600010 15.400000 -11.800004\nv -22.600010 15.400000 -9.800004\nv -20.600010 15.400000 -9.800005\nv -20.600010 15.400000 -11.800005\nv -26.200012 13.400000 -11.800005\nv -26.200012 13.400000 -9.800005\nv -24.200012 13.400000 -9.800005\nv -24.200012 13.400000 -11.800005\nv -26.200012 15.400000 -11.800004\nv -26.200012 15.400000 -9.800004\nv -24.200012 15.400000 -9.800005\nv -24.200012 15.400000 -11.800005\nv -29.800014 13.400000 -11.800005\nv -29.800014 13.400000 -9.800005\nv -27.800014 13.400000 -9.800005\nv -27.800014 13.400000 -11.800005\nv -29.800014 15.400000 -11.800004\nv -29.800014 15.400000 -9.800004\nv -27.800014 15.400000 -9.800005\nv -27.800014 15.400000 -11.800005\nv -33.400017 13.400000 -11.800005\nv -33.400017 13.400000 -9.800005\nv -31.400017 13.400000 -9.800005\nv -31.400017 13.400000 -11.800005\nv -33.400017 15.400000 -11.800004\nv -33.400017 15.400000 -9.800004\nv -31.400017 15.400000 -9.800005\nv -31.400017 15.400000 -11.800005\nv -1.000000 13.400000 -15.400006\nv -1.000000 13.400000 -13.400006\nv 1.000000 13.400000 -13.400006\nv 1.000000 13.400000 -15.400006\nv -1.000000 15.400000 -15.400005\nv -0.999999 15.400000 -13.400005\nv 1.000000 15.400000 -13.400006\nv 1.000000 15.400000 -15.400006\nv -4.600001 13.400000 -15.400006\nv -4.600001 13.400000 -13.400006\nv -2.600001 13.400000 -13.400006\nv -2.600002 13.400000 -15.400006\nv -4.600002 15.400000 -15.400005\nv -4.600001 15.400000 -13.400005\nv -2.600001 15.400000 -13.400006\nv -2.600002 15.400000 -15.400006\nv -8.200003 13.400000 -15.400006\nv -8.200003 13.400000 -13.400006\nv -6.200003 13.400000 -13.400006\nv -6.200004 13.400000 -15.400006\nv -8.200004 15.400000 -15.400005\nv -8.200003 15.400000 -13.400005\nv -6.200003 15.400000 -13.400006\nv -6.200003 15.400000 -15.400006\nv -11.800005 13.400000 -15.400006\nv -11.800005 13.400000 -13.400006\nv -9.800005 13.400000 -13.400006\nv -9.800005 13.400000 -15.400006\nv -11.800005 15.400000 -15.400005\nv -11.800004 15.400000 -13.400005\nv -9.800005 15.400000 -13.400006\nv -9.800005 15.400000 -15.400006\nv -15.400006 13.400000 -15.400006\nv -15.400006 13.400000 -13.400006\nv -13.400006 13.400000 -13.400006\nv -13.400006 13.400000 -15.400006\nv -15.400007 15.400000 -15.400005\nv -15.400005 15.400000 -13.400005\nv -13.400006 15.400000 -13.400006\nv -13.400006 15.400000 -15.400006\nv -19.000008 13.400000 -15.400006\nv -19.000008 13.400000 -13.400006\nv -17.000008 13.400000 -13.400006\nv -17.000008 13.400000 -15.400006\nv -19.000008 15.400000 -15.400005\nv -19.000008 15.400000 -13.400005\nv -17.000008 15.400000 -13.400006\nv -17.000008 15.400000 -15.400006\nv -22.600010 13.400000 -15.400006\nv -22.600010 13.400000 -13.400006\nv -20.600010 13.400000 -13.400006\nv -20.600010 13.400000 -15.400006\nv -22.600010 15.400000 -15.400005\nv -22.600010 15.400000 -13.400005\nv -20.600010 15.400000 -13.400006\nv -20.600010 15.400000 -15.400006\nv -26.200012 13.400000 -15.400006\nv -26.200012 13.400000 -13.400006\nv -24.200012 13.400000 -13.400006\nv -24.200012 13.400000 -15.400006\nv -26.200012 15.400000 -15.400005\nv -26.200012 15.400000 -13.400005\nv -24.200012 15.400000 -13.400006\nv -24.200012 15.400000 -15.400006\nv -29.800014 13.400000 -15.400006\nv -29.800014 13.400000 -13.400006\nv -27.800014 13.400000 -13.400006\nv -27.800014 13.400000 -15.400006\nv -29.800014 15.400000 -15.400005\nv -29.800014 15.400000 -13.400005\nv -27.800014 15.400000 -13.400006\nv -27.800014 15.400000 -15.400006\nv -33.400017 13.400000 -15.400006\nv -33.400017 13.400000 -13.400006\nv -31.400017 13.400000 -13.400006\nv -31.400017 13.400000 -15.400006\nv -33.400017 15.400000 -15.400005\nv -33.400017 15.400000 -13.400005\nv -31.400017 15.400000 -13.400006\nv -31.400017 15.400000 -15.400006\nv -1.000000 13.400000 -19.000008\nv -1.000000 13.400000 -17.000008\nv 1.000000 13.400000 -17.000008\nv 1.000000 13.400000 -19.000008\nv -1.000000 15.400000 -19.000008\nv -0.999999 15.400000 -17.000008\nv 1.000000 15.400000 -17.000008\nv 1.000000 15.400000 -19.000008\nv -4.600001 13.400000 -19.000008\nv -4.600001 13.400000 -17.000008\nv -2.600001 13.400000 -17.000008\nv -2.600002 13.400000 -19.000008\nv -4.600002 15.400000 -19.000008\nv -4.600001 15.400000 -17.000008\nv -2.600001 15.400000 -17.000008\nv -2.600002 15.400000 -19.000008\nv -8.200003 13.400000 -19.000008\nv -8.200003 13.400000 -17.000008\nv -6.200003 13.400000 -17.000008\nv -6.200004 13.400000 -19.000008\nv -8.200004 15.400000 -19.000008\nv -8.200003 15.400000 -17.000008\nv -6.200003 15.400000 -17.000008\nv -6.200003 15.400000 -19.000008\nv -11.800005 13.400000 -19.000008\nv -11.800005 13.400000 -17.000008\nv -9.800005 13.400000 -17.000008\nv -9.800005 13.400000 -19.000008\nv -11.800005 15.400000 -19.000008\nv -11.800004 15.400000 -17.000008\nv -9.800005 15.400000 -17.000008\nv -9.800005 15.400000 -19.000008\nv -15.400006 13.400000 -19.000008\nv -15.400006 13.400000 -17.000008\nv -13.400006 13.400000 -17.000008\nv -13.400006 13.400000 -19.000008\nv -15.400007 15.400000 -19.000008\nv -15.400005 15.400000 -17.000008\nv -13.400006 15.400000 -17.000008\nv -13.400006 15.400000 -19.000008\nv -19.000008 13.400000 -19.000008\nv -19.000008 13.400000 -17.000008\nv -17.000008 13.400000 -17.000008\nv -17.000008 13.400000 -19.000008\nv -19.000008 15.400000 -19.000008\nv -19.000008 15.400000 -17.000008\nv -17.000008 15.400000 -17.000008\nv -17.000008 15.400000 -19.000008\nv -22.600010 13.400000 -19.000008\nv -22.600010 13.400000 -17.000008\nv -20.600010 13.400000 -17.000008\nv -20.600010 13.400000 -19.000008\nv -22.600010 15.400000 -19.000008\nv -22.600010 15.400000 -17.000008\nv -20.600010 15.400000 -17.000008\nv -20.600010 15.400000 -19.000008\nv -26.200012 13.400000 -19.000008\nv -26.200012 13.400000 -17.000008\nv -24.200012 13.400000 -17.000008\nv -24.200012 13.400000 -19.000008\nv -26.200012 15.400000 -19.000008\nv -26.200012 15.400000 -17.000008\nv -24.200012 15.400000 -17.000008\nv -24.200012 15.400000 -19.000008\nv -29.800014 13.400000 -19.000008\nv -29.800014 13.400000 -17.000008\nv -27.800014 13.400000 -17.000008\nv -27.800014 13.400000 -19.000008\nv -29.800014 15.400000 -19.000008\nv -29.800014 15.400000 -17.000008\nv -27.800014 15.400000 -17.000008\nv -27.800014 15.400000 -19.000008\nv -33.400017 13.400000 -19.000008\nv -33.400017 13.400000 -17.000008\nv -31.400017 13.400000 -17.000008\nv -31.400017 13.400000 -19.000008\nv -33.400017 15.400000 -19.000008\nv -33.400017 15.400000 -17.000008\nv -31.400017 15.400000 -17.000008\nv -31.400017 15.400000 -19.000008\nv -1.000000 13.400000 -22.600010\nv -1.000000 13.400000 -20.600010\nv 1.000000 13.400000 -20.600010\nv 1.000000 13.400000 -22.600010\nv -1.000000 15.400000 -22.600010\nv -0.999999 15.400000 -20.600010\nv 1.000000 15.400000 -20.600010\nv 1.000000 15.400000 -22.600010\nv -4.600001 13.400000 -22.600010\nv -4.600001 13.400000 -20.600010\nv -2.600001 13.400000 -20.600010\nv -2.600002 13.400000 -22.600010\nv -4.600002 15.400000 -22.600010\nv -4.600001 15.400000 -20.600010\nv -2.600001 15.400000 -20.600010\nv -2.600002 15.400000 -22.600010\nv -8.200003 13.400000 -22.600010\nv -8.200003 13.400000 -20.600010\nv -6.200003 13.400000 -20.600010\nv -6.200004 13.400000 -22.600010\nv -8.200004 15.400000 -22.600010\nv -8.200003 15.400000 -20.600010\nv -6.200003 15.400000 -20.600010\nv -6.200003 15.400000 -22.600010\nv -11.800005 13.400000 -22.600010\nv -11.800005 13.400000 -20.600010\nv -9.800005 13.400000 -20.600010\nv -9.800005 13.400000 -22.600010\nv -11.800005 15.400000 -22.600010\nv -11.800004 15.400000 -20.600010\nv -9.800005 15.400000 -20.600010\nv -9.800005 15.400000 -22.600010\nv -15.400006 13.400000 -22.600010\nv -15.400006 13.400000 -20.600010\nv -13.400006 13.400000 -20.600010\nv -13.400006 13.400000 -22.600010\nv -15.400007 15.400000 -22.600010\nv -15.400005 15.400000 -20.600010\nv -13.400006 15.400000 -20.600010\nv -13.400006 15.400000 -22.600010\nv -19.000008 13.400000 -22.600010\nv -19.000008 13.400000 -20.600010\nv -17.000008 13.400000 -20.600010\nv -17.000008 13.400000 -22.600010\nv -19.000008 15.400000 -22.600010\nv -19.000008 15.400000 -20.600010\nv -17.000008 15.400000 -20.600010\nv -17.000008 15.400000 -22.600010\nv -22.600010 13.400000 -22.600010\nv -22.600010 13.400000 -20.600010\nv -20.600010 13.400000 -20.600010\nv -20.600010 13.400000 -22.600010\nv -22.600010 15.400000 -22.600010\nv -22.600010 15.400000 -20.600010\nv -20.600010 15.400000 -20.600010\nv -20.600010 15.400000 -22.600010\nv -26.200012 13.400000 -22.600010\nv -26.200012 13.400000 -20.600010\nv -24.200012 13.400000 -20.600010\nv -24.200012 13.400000 -22.600010\nv -26.200012 15.400000 -22.600010\nv -26.200012 15.400000 -20.600010\nv -24.200012 15.400000 -20.600010\nv -24.200012 15.400000 -22.600010\nv -29.800014 13.400000 -22.600010\nv -29.800014 13.400000 -20.600010\nv -27.800014 13.400000 -20.600010\nv -27.800014 13.400000 -22.600010\nv -29.800014 15.400000 -22.600010\nv -29.800014 15.400000 -20.600010\nv -27.800014 15.400000 -20.600010\nv -27.800014 15.400000 -22.600010\nv -33.400017 13.400000 -22.600010\nv -33.400017 13.400000 -20.600010\nv -31.400017 13.400000 -20.600010\nv -31.400017 13.400000 -22.600010\nv -33.400017 15.400000 -22.600010\nv -33.400017 15.400000 -20.600010\nv -31.400017 15.400000 -20.600010\nv -31.400017 15.400000 -22.600010\nv -1.000000 13.400000 -26.200012\nv -1.000000 13.400000 -24.200012\nv 1.000000 13.400000 -24.200012\nv 1.000000 13.400000 -26.200012\nv -1.000000 15.400000 -26.200012\nv -0.999999 15.400000 -24.200012\nv 1.000000 15.400000 -24.200012\nv 1.000000 15.400000 -26.200012\nv -4.600001 13.400000 -26.200012\nv -4.600001 13.400000 -24.200012\nv -2.600001 13.400000 -24.200012\nv -2.600002 13.400000 -26.200012\nv -4.600002 15.400000 -26.200012\nv -4.600001 15.400000 -24.200012\nv -2.600001 15.400000 -24.200012\nv -2.600002 15.400000 -26.200012\nv -8.200003 13.400000 -26.200012\nv -8.200003 13.400000 -24.200012\nv -6.200003 13.400000 -24.200012\nv -6.200004 13.400000 -26.200012\nv -8.200004 15.400000 -26.200012\nv -8.200003 15.400000 -24.200012\nv -6.200003 15.400000 -24.200012\nv -6.200003 15.400000 -26.200012\nv -11.800005 13.400000 -26.200012\nv -11.800005 13.400000 -24.200012\nv -9.800005 13.400000 -24.200012\nv -9.800005 13.400000 -26.200012\nv -11.800005 15.400000 -26.200012\nv -11.800004 15.400000 -24.200012\nv -9.800005 15.400000 -24.200012\nv -9.800005 15.400000 -26.200012\nv -15.400006 13.400000 -26.200012\nv -15.400006 13.400000 -24.200012\nv -13.400006 13.400000 -24.200012\nv -13.400006 13.400000 -26.200012\nv -15.400007 15.400000 -26.200012\nv -15.400005 15.400000 -24.200012\nv -13.400006 15.400000 -24.200012\nv -13.400006 15.400000 -26.200012\nv -19.000008 13.400000 -26.200012\nv -19.000008 13.400000 -24.200012\nv -17.000008 13.400000 -24.200012\nv -17.000008 13.400000 -26.200012\nv -19.000008 15.400000 -26.200012\nv -19.000008 15.400000 -24.200012\nv -17.000008 15.400000 -24.200012\nv -17.000008 15.400000 -26.200012\nv -22.600010 13.400000 -26.200012\nv -22.600010 13.400000 -24.200012\nv -20.600010 13.400000 -24.200012\nv -20.600010 13.400000 -26.200012\nv -22.600010 15.400000 -26.200012\nv -22.600010 15.400000 -24.200012\nv -20.600010 15.400000 -24.200012\nv -20.600010 15.400000 -26.200012\nv -26.200012 13.400000 -26.200012\nv -26.200012 13.400000 -24.200012\nv -24.200012 13.400000 -24.200012\nv -24.200012 13.400000 -26.200012\nv -26.200012 15.400000 -26.200012\nv -26.200012 15.400000 -24.200012\nv -24.200012 15.400000 -24.200012\nv -24.200012 15.400000 -26.200012\nv -29.800014 13.400000 -26.200012\nv -29.800014 13.400000 -24.200012\nv -27.800014 13.400000 -24.200012\nv -27.800014 13.400000 -26.200012\nv -29.800014 15.400000 -26.200012\nv -29.800014 15.400000 -24.200012\nv -27.800014 15.400000 -24.200012\nv -27.800014 15.400000 -26.200012\nv -33.400017 13.400000 -26.200012\nv -33.400017 13.400000 -24.200012\nv -31.400017 13.400000 -24.200012\nv -31.400017 13.400000 -26.200012\nv -33.400017 15.400000 -26.200012\nv -33.400017 15.400000 -24.200012\nv -31.400017 15.400000 -24.200012\nv -31.400017 15.400000 -26.200012\nv -1.000000 13.400000 -29.800014\nv -1.000000 13.400000 -27.800014\nv 1.000000 13.400000 -27.800014\nv 1.000000 13.400000 -29.800014\nv -1.000000 15.400000 -29.800014\nv -0.999999 15.400000 -27.800014\nv 1.000000 15.400000 -27.800014\nv 1.000000 15.400000 -29.800014\nv -4.600001 13.400000 -29.800014\nv -4.600001 13.400000 -27.800014\nv -2.600001 13.400000 -27.800014\nv -2.600002 13.400000 -29.800014\nv -4.600002 15.400000 -29.800014\nv -4.600001 15.400000 -27.800014\nv -2.600001 15.400000 -27.800014\nv -2.600002 15.400000 -29.800014\nv -8.200003 13.400000 -29.800014\nv -8.200003 13.400000 -27.800014\nv -6.200003 13.400000 -27.800014\nv -6.200004 13.400000 -29.800014\nv -8.200004 15.400000 -29.800014\nv -8.200003 15.400000 -27.800014\nv -6.200003 15.400000 -27.800014\nv -6.200003 15.400000 -29.800014\nv -11.800005 13.400000 -29.800014\nv -11.800005 13.400000 -27.800014\nv -9.800005 13.400000 -27.800014\nv -9.800005 13.400000 -29.800014\nv -11.800005 15.400000 -29.800014\nv -11.800004 15.400000 -27.800014\nv -9.800005 15.400000 -27.800014\nv -9.800005 15.400000 -29.800014\nv -15.400006 13.400000 -29.800014\nv -15.400006 13.400000 -27.800014\nv -13.400006 13.400000 -27.800014\nv -13.400006 13.400000 -29.800014\nv -15.400007 15.400000 -29.800014\nv -15.400005 15.400000 -27.800014\nv -13.400006 15.400000 -27.800014\nv -13.400006 15.400000 -29.800014\nv -19.000008 13.400000 -29.800014\nv -19.000008 13.400000 -27.800014\nv -17.000008 13.400000 -27.800014\nv -17.000008 13.400000 -29.800014\nv -19.000008 15.400000 -29.800014\nv -19.000008 15.400000 -27.800014\nv -17.000008 15.400000 -27.800014\nv -17.000008 15.400000 -29.800014\nv -22.600010 13.400000 -29.800014\nv -22.600010 13.400000 -27.800014\nv -20.600010 13.400000 -27.800014\nv -20.600010 13.400000 -29.800014\nv -22.600010 15.400000 -29.800014\nv -22.600010 15.400000 -27.800014\nv -20.600010 15.400000 -27.800014\nv -20.600010 15.400000 -29.800014\nv -26.200012 13.400000 -29.800014\nv -26.200012 13.400000 -27.800014\nv -24.200012 13.400000 -27.800014\nv -24.200012 13.400000 -29.800014\nv -26.200012 15.400000 -29.800014\nv -26.200012 15.400000 -27.800014\nv -24.200012 15.400000 -27.800014\nv -24.200012 15.400000 -29.800014\nv -29.800014 13.400000 -29.800014\nv -29.800014 13.400000 -27.800014\nv -27.800014 13.400000 -27.800014\nv -27.800014 13.400000 -29.800014\nv -29.800014 15.400000 -29.800014\nv -29.800014 15.400000 -27.800014\nv -27.800014 15.400000 -27.800014\nv -27.800014 15.400000 -29.800014\nv -33.400017 13.400000 -29.800014\nv -33.400017 13.400000 -27.800014\nv -31.400017 13.400000 -27.800014\nv -31.400017 13.400000 -29.800014\nv -33.400017 15.400000 -29.800014\nv -33.400017 15.400000 -27.800014\nv -31.400017 15.400000 -27.800014\nv -31.400017 15.400000 -29.800014\nv -1.000000 13.400000 -33.400017\nv -1.000000 13.400000 -31.400017\nv 1.000000 13.400000 -31.400017\nv 1.000000 13.400000 -33.400017\nv -1.000000 15.400000 -33.400017\nv -0.999999 15.400000 -31.400017\nv 1.000000 15.400000 -31.400017\nv 1.000000 15.400000 -33.400017\nv -4.600001 13.400000 -33.400017\nv -4.600001 13.400000 -31.400017\nv -2.600001 13.400000 -31.400017\nv -2.600002 13.400000 -33.400017\nv -4.600002 15.400000 -33.400017\nv -4.600001 15.400000 -31.400017\nv -2.600001 15.400000 -31.400017\nv -2.600002 15.400000 -33.400017\nv -8.200003 13.400000 -33.400017\nv -8.200003 13.400000 -31.400017\nv -6.200003 13.400000 -31.400017\nv -6.200004 13.400000 -33.400017\nv -8.200004 15.400000 -33.400017\nv -8.200003 15.400000 -31.400017\nv -6.200003 15.400000 -31.400017\nv -6.200003 15.400000 -33.400017\nv -11.800005 13.400000 -33.400017\nv -11.800005 13.400000 -31.400017\nv -9.800005 13.400000 -31.400017\nv -9.800005 13.400000 -33.400017\nv -11.800005 15.400000 -33.400017\nv -11.800004 15.400000 -31.400017\nv -9.800005 15.400000 -31.400017\nv -9.800005 15.400000 -33.400017\nv -15.400006 13.400000 -33.400017\nv -15.400006 13.400000 -31.400017\nv -13.400006 13.400000 -31.400017\nv -13.400006 13.400000 -33.400017\nv -15.400007 15.400000 -33.400017\nv -15.400005 15.400000 -31.400017\nv -13.400006 15.400000 -31.400017\nv -13.400006 15.400000 -33.400017\nv -19.000008 13.400000 -33.400017\nv -19.000008 13.400000 -31.400017\nv -17.000008 13.400000 -31.400017\nv -17.000008 13.400000 -33.400017\nv -19.000008 15.400000 -33.400017\nv -19.000008 15.400000 -31.400017\nv -17.000008 15.400000 -31.400017\nv -17.000008 15.400000 -33.400017\nv -22.600010 13.400000 -33.400017\nv -22.600010 13.400000 -31.400017\nv -20.600010 13.400000 -31.400017\nv -20.600010 13.400000 -33.400017\nv -22.600010 15.400000 -33.400017\nv -22.600010 15.400000 -31.400017\nv -20.600010 15.400000 -31.400017\nv -20.600010 15.400000 -33.400017\nv -26.200012 13.400000 -33.400017\nv -26.200012 13.400000 -31.400017\nv -24.200012 13.400000 -31.400017\nv -24.200012 13.400000 -33.400017\nv -26.200012 15.400000 -33.400017\nv -26.200012 15.400000 -31.400017\nv -24.200012 15.400000 -31.400017\nv -24.200012 15.400000 -33.400017\nv -29.800014 13.400000 -33.400017\nv -29.800014 13.400000 -31.400017\nv -27.800014 13.400000 -31.400017\nv -27.800014 13.400000 -33.400017\nv -29.800014 15.400000 -33.400017\nv -29.800014 15.400000 -31.400017\nv -27.800014 15.400000 -31.400017\nv -27.800014 15.400000 -33.400017\nv -33.400017 13.400000 -33.400017\nv -33.400017 13.400000 -31.400017\nv -31.400017 13.400000 -31.400017\nv -31.400017 13.400000 -33.400017\nv -33.400017 15.400000 -33.400017\nv -33.400017 15.400000 -31.400017\nv -31.400017 15.400000 -31.400017\nv -31.400017 15.400000 -33.400017\nv 1.000000 17.000000 -1.000000\nv 1.000000 17.000000 1.000000\nv -1.000000 17.000000 1.000000\nv -1.000000 17.000000 -1.000000\nv 1.000000 19.000000 -0.999999\nv 0.999999 19.000000 1.000001\nv -1.000000 19.000000 1.000000\nv -1.000000 19.000000 -1.000000\nv 4.600001 17.000000 -1.000000\nv 4.600001 17.000000 1.000000\nv 2.600001 17.000000 1.000000\nv 2.600002 17.000000 -1.000000\nv 4.600002 19.000000 -0.999999\nv 4.600001 19.000000 1.000001\nv 2.600001 19.000000 1.000000\nv 2.600002 19.000000 -1.000000\nv 8.200003 17.000000 -1.000000\nv 8.200003 17.000000 1.000000\nv 6.200003 17.000000 1.000000\nv 6.200004 17.000000 -1.000000\nv 8.200004 19.000000 -0.999999\nv 8.200003 19.000000 1.000001\nv 6.200003 19.000000 1.000000\nv 6.200003 19.000000 -1.000000\nv 11.800005 17.000000 -1.000000\nv 11.800005 17.000000 1.000000\nv 9.800005 17.000000 1.000000\nv 9.800005 17.000000 -1.000000\nv 11.800005 19.000000 -0.999999\nv 11.800004 19.000000 1.000001\nv 9.800005 19.000000 1.000000\nv 9.800005 19.000000 -1.000000\nv 15.400006 17.000000 -1.000000\nv 15.400006 17.000000 1.000000\nv 13.400006 17.000000 1.000000\nv 13.400006 17.000000 -1.000000\nv 15.400007 19.000000 -0.999999\nv 15.400005 19.000000 1.000001\nv 13.400006 19.000000 1.000000\nv 13.400006 19.000000 -1.000000\nv 19.000008 17.000000 -1.000000\nv 19.000008 17.000000 1.000000\nv 17.000008 17.000000 1.000000\nv 17.000008 17.000000 -1.000000\nv 19.000008 19.000000 -0.999999\nv 19.000008 19.000000 1.000001\nv 17.000008 19.000000 1.000000\nv 17.000008 19.000000 -1.000000\nv 22.600010 17.000000 -1.000000\nv 22.600010 17.000000 1.000000\nv 20.600010 17.000000 1.000000\nv 20.600010 17.000000 -1.000000\nv 22.600010 19.000000 -0.999999\nv 22.600010 19.000000 1.000001\nv 20.600010 19.000000 1.000000\nv 20.600010 19.000000 -1.000000\nv 26.200012 17.000000 -1.000000\nv 26.200012 17.000000 1.000000\nv 24.200012 17.000000 1.000000\nv 24.200012 17.000000 -1.000000\nv 26.200012 19.000000 -0.999999\nv 26.200012 19.000000 1.000001\nv 24.200012 19.000000 1.000000\nv 24.200012 19.000000 -1.000000\nv 29.800014 17.000000 -1.000000\nv 29.800014 17.000000 1.000000\nv 27.800014 17.000000 1.000000\nv 27.800014 17.000000 -1.000000\nv 29.800014 19.000000 -0.999999\nv 29.800014 19.000000 1.000001\nv 27.800014 19.000000 1.000000\nv 27.800014 19.000000 -1.000000\nv 33.400017 17.000000 -1.000000\nv 33.400017 17.000000 1.000000\nv 31.400017 17.000000 1.000000\nv 31.400017 17.000000 -1.000000\nv 33.400017 19.000000 -0.999999\nv 33.400017 19.000000 1.000001\nv 31.400017 19.000000 1.000000\nv 31.400017 19.000000 -1.000000\nv 1.000000 17.000000 -4.600001\nv 1.000000 17.000000 -2.600002\nv -1.000000 17.000000 -2.600002\nv -1.000000 17.000000 -4.600002\nv 1.000000 19.000000 -4.600001\nv 0.999999 19.000000 -2.600001\nv -1.000000 19.000000 -2.600002\nv -1.000000 19.000000 -4.600001\nv 4.600001 17.000000 -4.600001\nv 4.600001 17.000000 -2.600002\nv 2.600001 17.000000 -2.600002\nv 2.600002 17.000000 -4.600002\nv 4.600002 19.000000 -4.600001\nv 4.600001 19.000000 -2.600001\nv 2.600001 19.000000 -2.600002\nv 2.600002 19.000000 -4.600001\nv 8.200003 17.000000 -4.600001\nv 8.200003 17.000000 -2.600002\nv 6.200003 17.000000 -2.600002\nv 6.200004 17.000000 -4.600002\nv 8.200004 19.000000 -4.600001\nv 8.200003 19.000000 -2.600001\nv 6.200003 19.000000 -2.600002\nv 6.200003 19.000000 -4.600001\nv 11.800005 17.000000 -4.600001\nv 11.800005 17.000000 -2.600002\nv 9.800005 17.000000 -2.600002\nv 9.800005 17.000000 -4.600002\nv 11.800005 19.000000 -4.600001\nv 11.800004 19.000000 -2.600001\nv 9.800005 19.000000 -2.600002\nv 9.800005 19.000000 -4.600001\nv 15.400006 17.000000 -4.600001\nv 15.400006 17.000000 -2.600002\nv 13.400006 17.000000 -2.600002\nv 13.400006 17.000000 -4.600002\nv 15.400007 19.000000 -4.600001\nv 15.400005 19.000000 -2.600001\nv 13.400006 19.000000 -2.600002\nv 13.400006 19.000000 -4.600001\nv 19.000008 17.000000 -4.600001\nv 19.000008 17.000000 -2.600002\nv 17.000008 17.000000 -2.600002\nv 17.000008 17.000000 -4.600002\nv 19.000008 19.000000 -4.600001\nv 19.000008 19.000000 -2.600001\nv 17.000008 19.000000 -2.600002\nv 17.000008 19.000000 -4.600001\nv 22.600010 17.000000 -4.600001\nv 22.600010 17.000000 -2.600002\nv 20.600010 17.000000 -2.600002\nv 20.600010 17.000000 -4.600002\nv 22.600010 19.000000 -4.600001\nv 22.600010 19.000000 -2.600001\nv 20.600010 19.000000 -2.600002\nv 20.600010 19.000000 -4.600001\nv 26.200012 17.000000 -4.600001\nv 26.200012 17.000000 -2.600002\nv 24.200012 17.000000 -2.600002\nv 24.200012 17.000000 -4.600002\nv 26.200012 19.000000 -4.600001\nv 26.200012 19.000000 -2.600001\nv 24.200012 19.000000 -2.600002\nv 24.200012 19.000000 -4.600001\nv 29.800014 17.000000 -4.600001\nv 29.800014 17.000000 -2.600002\nv 27.800014 17.000000 -2.600002\nv 27.800014 17.000000 -4.600002\nv 29.800014 19.000000 -4.600001\nv 29.800014 19.000000 -2.600001\nv 27.800014 19.000000 -2.600002\nv 27.800014 19.000000 -4.600001\nv 33.400017 17.000000 -4.600001\nv 33.400017 17.000000 -2.600002\nv 31.400017 17.000000 -2.600002\nv 31.400017 17.000000 -4.600002\nv 33.400017 19.000000 -4.600001\nv 33.400017 19.000000 -2.600001\nv 31.400017 19.000000 -2.600002\nv 31.400017 19.000000 -4.600001\nv 1.000000 17.000000 -8.200003\nv 1.000000 17.000000 -6.200003\nv -1.000000 17.000000 -6.200003\nv -1.000000 17.000000 -8.200004\nv 1.000000 19.000000 -8.200003\nv 0.999999 19.000000 -6.200003\nv -1.000000 19.000000 -6.200004\nv -1.000000 19.000000 -8.200003\nv 4.600001 17.000000 -8.200003\nv 4.600001 17.000000 -6.200003\nv 2.600001 17.000000 -6.200003\nv 2.600002 17.000000 -8.200004\nv 4.600002 19.000000 -8.200003\nv 4.600001 19.000000 -6.200003\nv 2.600001 19.000000 -6.200004\nv 2.600002 19.000000 -8.200003\nv 8.200003 17.000000 -8.200003\nv 8.200003 17.000000 -6.200003\nv 6.200003 17.000000 -6.200003\nv 6.200004 17.000000 -8.200004\nv 8.200004 19.000000 -8.200003\nv 8.200003 19.000000 -6.200003\nv 6.200003 19.000000 -6.200004\nv 6.200003 19.000000 -8.200003\nv 11.800005 17.000000 -8.200003\nv 11.800005 17.000000 -6.200003\nv 9.800005 17.000000 -6.200003\nv 9.800005 17.000000 -8.200004\nv 11.800005 19.000000 -8.200003\nv 11.800004 19.000000 -6.200003\nv 9.800005 19.000000 -6.200004\nv 9.800005 19.000000 -8.200003\nv 15.400006 17.000000 -8.200003\nv 15.400006 17.000000 -6.200003\nv 13.400006 17.000000 -6.200003\nv 13.400006 17.000000 -8.200004\nv 15.400007 19.000000 -8.200003\nv 15.400005 19.000000 -6.200003\nv 13.400006 19.000000 -6.200004\nv 13.400006 19.000000 -8.200003\nv 19.000008 17.000000 -8.200003\nv 19.000008 17.000000 -6.200003\nv 17.000008 17.000000 -6.200003\nv 17.000008 17.000000 -8.200004\nv 19.000008 19.000000 -8.200003\nv 19.000008 19.000000 -6.200003\nv 17.000008 19.000000 -6.200004\nv 17.000008 19.000000 -8.200003\nv 22.600010 17.000000 -8.200003\nv 22.600010 17.000000 -6.200003\nv 20.600010 17.000000 -6.200003\nv 20.600010 17.000000 -8.200004\nv 22.600010 19.000000 -8.200003\nv 22.600010 19.000000 -6.200003\nv 20.600010 19.000000 -6.200004\nv 20.600010 19.000000 -8.200003\nv 26.200012 17.000000 -8.200003\nv 26.200012 17.000000 -6.200003\nv 24.200012 17.000000 -6.200003\nv 24.200012 17.000000 -8.200004\nv 26.200012 19.000000 -8.200003\nv 26.200012 19.000000 -6.200003\nv 24.200012 19.000000 -6.200004\nv 24.200012 19.000000 -8.200003\nv 29.800014 17.000000 -8.200003\nv 29.800014 17.000000 -6.200003\nv 27.800014 17.000000 -6.200003\nv 27.800014 17.000000 -8.200004\nv 29.800014 19.000000 -8.200003\nv 29.800014 19.000000 -6.200003\nv 27.800014 19.000000 -6.200004\nv 27.800014 19.000000 -8.200003\nv 33.400017 17.000000 -8.200003\nv 33.400017 17.000000 -6.200003\nv 31.400017 17.000000 -6.200003\nv 31.400017 17.000000 -8.200004\nv 33.400017 19.000000 -8.200003\nv 33.400017 19.000000 -6.200003\nv 31.400017 19.000000 -6.200004\nv 31.400017 19.000000 -8.200003\nv 1.000000 17.000000 -11.800005\nv 1.000000 17.000000 -9.800005\nv -1.000000 17.000000 -9.800005\nv -1.000000 17.000000 -11.800005\nv 1.000000 19.000000 -11.800004\nv 0.999999 19.000000 -9.800004\nv -1.000000 19.000000 -9.800005\nv -1.000000 19.000000 -11.800005\nv 4.600001 17.000000 -11.800005\nv 4.600001 17.000000 -9.800005\nv 2.600001 17.000000 -9.800005\nv 2.600002 17.000000 -11.800005\nv 4.600002 19.000000 -11.800004\nv 4.600001 19.000000 -9.800004\nv 2.600001 19.000000 -9.800005\nv 2.600002 19.000000 -11.800005\nv 8.200003 17.000000 -11.800005\nv 8.200003 17.000000 -9.800005\nv 6.200003 17.000000 -9.800005\nv 6.200004 17.000000 -11.800005\nv 8.200004 19.000000 -11.800004\nv 8.200003 19.000000 -9.800004\nv 6.200003 19.000000 -9.800005\nv 6.200003 19.000000 -11.800005\nv 11.800005 17.000000 -11.800005\nv 11.800005 17.000000 -9.800005\nv 9.800005 17.000000 -9.800005\nv 9.800005 17.000000 -11.800005\nv 11.800005 19.000000 -11.800004\nv 11.800004 19.000000 -9.800004\nv 9.800005 19.000000 -9.800005\nv 9.800005 19.000000 -11.800005\nv 15.400006 17.000000 -11.800005\nv 15.400006 17.000000 -9.800005\nv 13.400006 17.000000 -9.800005\nv 13.400006 17.000000 -11.800005\nv 15.400007 19.000000 -11.800004\nv 15.400005 19.000000 -9.800004\nv 13.400006 19.000000 -9.800005\nv 13.400006 19.000000 -11.800005\nv 19.000008 17.000000 -11.800005\nv 19.000008 17.000000 -9.800005\nv 17.000008 17.000000 -9.800005\nv 17.000008 17.000000 -11.800005\nv 19.000008 19.000000 -11.800004\nv 19.000008 19.000000 -9.800004\nv 17.000008 19.000000 -9.800005\nv 17.000008 19.000000 -11.800005\nv 22.600010 17.000000 -11.800005\nv 22.600010 17.000000 -9.800005\nv 20.600010 17.000000 -9.800005\nv 20.600010 17.000000 -11.800005\nv 22.600010 19.000000 -11.800004\nv 22.600010 19.000000 -9.800004\nv 20.600010 19.000000 -9.800005\nv 20.600010 19.000000 -11.800005\nv 26.200012 17.000000 -11.800005\nv 26.200012 17.000000 -9.800005\nv 24.200012 17.000000 -9.800005\nv 24.200012 17.000000 -11.800005\nv 26.200012 19.000000 -11.800004\nv 26.200012 19.000000 -9.800004\nv 24.200012 19.000000 -9.800005\nv 24.200012 19.000000 -11.800005\nv 29.800014 17.000000 -11.800005\nv 29.800014 17.000000 -9.800005\nv 27.800014 17.000000 -9.800005\nv 27.800014 17.000000 -11.800005\nv 29.800014 19.000000 -11.800004\nv 29.800014 19.000000 -9.800004\nv 27.800014 19.000000 -9.800005\nv 27.800014 19.000000 -11.800005\nv 33.400017 17.000000 -11.800005\nv 33.400017 17.000000 -9.800005\nv 31.400017 17.000000 -9.800005\nv 31.400017 17.000000 -11.800005\nv 33.400017 19.000000 -11.800004\nv 33.400017 19.000000 -9.800004\nv 31.400017 19.000000 -9.800005\nv 31.400017 19.000000 -11.800005\nv 1.000000 17.000000 -15.400006\nv 1.000000 17.000000 -13.400006\nv -1.000000 17.000000 -13.400006\nv -1.000000 17.000000 -15.400006\nv 1.000000 19.000000 -15.400005\nv 0.999999 19.000000 -13.400005\nv -1.000000 19.000000 -13.400006\nv -1.000000 19.000000 -15.400006\nv 4.600001 17.000000 -15.400006\nv 4.600001 17.000000 -13.400006\nv 2.600001 17.000000 -13.400006\nv 2.600002 17.000000 -15.400006\nv 4.600002 19.000000 -15.400005\nv 4.600001 19.000000 -13.400005\nv 2.600001 19.000000 -13.400006\nv 2.600002 19.000000 -15.400006\nv 8.200003 17.000000 -15.400006\nv 8.200003 17.000000 -13.400006\nv 6.200003 17.000000 -13.400006\nv 6.200004 17.000000 -15.400006\nv 8.200004 19.000000 -15.400005\nv 8.200003 19.000000 -13.400005\nv 6.200003 19.000000 -13.400006\nv 6.200003 19.000000 -15.400006\nv 11.800005 17.000000 -15.400006\nv 11.800005 17.000000 -13.400006\nv 9.800005 17.000000 -13.400006\nv 9.800005 17.000000 -15.400006\nv 11.800005 19.000000 -15.400005\nv 11.800004 19.000000 -13.400005\nv 9.800005 19.000000 -13.400006\nv 9.800005 19.000000 -15.400006\nv 15.400006 17.000000 -15.400006\nv 15.400006 17.000000 -13.400006\nv 13.400006 17.000000 -13.400006\nv 13.400006 17.000000 -15.400006\nv 15.400007 19.000000 -15.400005\nv 15.400005 19.000000 -13.400005\nv 13.400006 19.000000 -13.400006\nv 13.400006 19.000000 -15.400006\nv 19.000008 17.000000 -15.400006\nv 19.000008 17.000000 -13.400006\nv 17.000008 17.000000 -13.400006\nv 17.000008 17.000000 -15.400006\nv 19.000008 19.000000 -15.400005\nv 19.000008 19.000000 -13.400005\nv 17.000008 19.000000 -13.400006\nv 17.000008 19.000000 -15.400006\nv 22.600010 17.000000 -15.400006\nv 22.600010 17.000000 -13.400006\nv 20.600010 17.000000 -13.400006\nv 20.600010 17.000000 -15.400006\nv 22.600010 19.000000 -15.400005\nv 22.600010 19.000000 -13.400005\nv 20.600010 19.000000 -13.400006\nv 20.600010 19.000000 -15.400006\nv 26.200012 17.000000 -15.400006\nv 26.200012 17.000000 -13.400006\nv 24.200012 17.000000 -13.400006\nv 24.200012 17.000000 -15.400006\nv 26.200012 19.000000 -15.400005\nv 26.200012 19.000000 -13.400005\nv 24.200012 19.000000 -13.400006\nv 24.200012 19.000000 -15.400006\nv 29.800014 17.000000 -15.400006\nv 29.800014 17.000000 -13.400006\nv 27.800014 17.000000 -13.400006\nv 27.800014 17.000000 -15.400006\nv 29.800014 19.000000 -15.400005\nv 29.800014 19.000000 -13.400005\nv 27.800014 19.000000 -13.400006\nv 27.800014 19.000000 -15.400006\nv 33.400017 17.000000 -15.400006\nv 33.400017 17.000000 -13.400006\nv 31.400017 17.000000 -13.400006\nv 31.400017 17.000000 -15.400006\nv 33.400017 19.000000 -15.400005\nv 33.400017 19.000000 -13.400005\nv 31.400017 19.000000 -13.400006\nv 31.400017 19.000000 -15.400006\nv 1.000000 17.000000 -19.000008\nv 1.000000 17.000000 -17.000008\nv -1.000000 17.000000 -17.000008\nv -1.000000 17.000000 -19.000008\nv 1.000000 19.000000 -19.000008\nv 0.999999 19.000000 -17.000008\nv -1.000000 19.000000 -17.000008\nv -1.000000 19.000000 -19.000008\nv 4.600001 17.000000 -19.000008\nv 4.600001 17.000000 -17.000008\nv 2.600001 17.000000 -17.000008\nv 2.600002 17.000000 -19.000008\nv 4.600002 19.000000 -19.000008\nv 4.600001 19.000000 -17.000008\nv 2.600001 19.000000 -17.000008\nv 2.600002 19.000000 -19.000008\nv 8.200003 17.000000 -19.000008\nv 8.200003 17.000000 -17.000008\nv 6.200003 17.000000 -17.000008\nv 6.200004 17.000000 -19.000008\nv 8.200004 19.000000 -19.000008\nv 8.200003 19.000000 -17.000008\nv 6.200003 19.000000 -17.000008\nv 6.200003 19.000000 -19.000008\nv 11.800005 17.000000 -19.000008\nv 11.800005 17.000000 -17.000008\nv 9.800005 17.000000 -17.000008\nv 9.800005 17.000000 -19.000008\nv 11.800005 19.000000 -19.000008\nv 11.800004 19.000000 -17.000008\nv 9.800005 19.000000 -17.000008\nv 9.800005 19.000000 -19.000008\nv 15.400006 17.000000 -19.000008\nv 15.400006 17.000000 -17.000008\nv 13.400006 17.000000 -17.000008\nv 13.400006 17.000000 -19.000008\nv 15.400007 19.000000 -19.000008\nv 15.400005 19.000000 -17.000008\nv 13.400006 19.000000 -17.000008\nv 13.400006 19.000000 -19.000008\nv 19.000008 17.000000 -19.000008\nv 19.000008 17.000000 -17.000008\nv 17.000008 17.000000 -17.000008\nv 17.000008 17.000000 -19.000008\nv 19.000008 19.000000 -19.000008\nv 19.000008 19.000000 -17.000008\nv 17.000008 19.000000 -17.000008\nv 17.000008 19.000000 -19.000008\nv 22.600010 17.000000 -19.000008\nv 22.600010 17.000000 -17.000008\nv 20.600010 17.000000 -17.000008\nv 20.600010 17.000000 -19.000008\nv 22.600010 19.000000 -19.000008\nv 22.600010 19.000000 -17.000008\nv 20.600010 19.000000 -17.000008\nv 20.600010 19.000000 -19.000008\nv 26.200012 17.000000 -19.000008\nv 26.200012 17.000000 -17.000008\nv 24.200012 17.000000 -17.000008\nv 24.200012 17.000000 -19.000008\nv 26.200012 19.000000 -19.000008\nv 26.200012 19.000000 -17.000008\nv 24.200012 19.000000 -17.000008\nv 24.200012 19.000000 -19.000008\nv 29.800014 17.000000 -19.000008\nv 29.800014 17.000000 -17.000008\nv 27.800014 17.000000 -17.000008\nv 27.800014 17.000000 -19.000008\nv 29.800014 19.000000 -19.000008\nv 29.800014 19.000000 -17.000008\nv 27.800014 19.000000 -17.000008\nv 27.800014 19.000000 -19.000008\nv 33.400017 17.000000 -19.000008\nv 33.400017 17.000000 -17.000008\nv 31.400017 17.000000 -17.000008\nv 31.400017 17.000000 -19.000008\nv 33.400017 19.000000 -19.000008\nv 33.400017 19.000000 -17.000008\nv 31.400017 19.000000 -17.000008\nv 31.400017 19.000000 -19.000008\nv 1.000000 17.000000 -22.600010\nv 1.000000 17.000000 -20.600010\nv -1.000000 17.000000 -20.600010\nv -1.000000 17.000000 -22.600010\nv 1.000000 19.000000 -22.600010\nv 0.999999 19.000000 -20.600010\nv -1.000000 19.000000 -20.600010\nv -1.000000 19.000000 -22.600010\nv 4.600001 17.000000 -22.600010\nv 4.600001 17.000000 -20.600010\nv 2.600001 17.000000 -20.600010\nv 2.600002 17.000000 -22.600010\nv 4.600002 19.000000 -22.600010\nv 4.600001 19.000000 -20.600010\nv 2.600001 19.000000 -20.600010\nv 2.600002 19.000000 -22.600010\nv 8.200003 17.000000 -22.600010\nv 8.200003 17.000000 -20.600010\nv 6.200003 17.000000 -20.600010\nv 6.200004 17.000000 -22.600010\nv 8.200004 19.000000 -22.600010\nv 8.200003 19.000000 -20.600010\nv 6.200003 19.000000 -20.600010\nv 6.200003 19.000000 -22.600010\nv 11.800005 17.000000 -22.600010\nv 11.800005 17.000000 -20.600010\nv 9.800005 17.000000 -20.600010\nv 9.800005 17.000000 -22.600010\nv 11.800005 19.000000 -22.600010\nv 11.800004 19.000000 -20.600010\nv 9.800005 19.000000 -20.600010\nv 9.800005 19.000000 -22.600010\nv 15.400006 17.000000 -22.600010\nv 15.400006 17.000000 -20.600010\nv 13.400006 17.000000 -20.600010\nv 13.400006 17.000000 -22.600010\nv 15.400007 19.000000 -22.600010\nv 15.400005 19.000000 -20.600010\nv 13.400006 19.000000 -20.600010\nv 13.400006 19.000000 -22.600010\nv 19.000008 17.000000 -22.600010\nv 19.000008 17.000000 -20.600010\nv 17.000008 17.000000 -20.600010\nv 17.000008 17.000000 -22.600010\nv 19.000008 19.000000 -22.600010\nv 19.000008 19.000000 -20.600010\nv 17.000008 19.000000 -20.600010\nv 17.000008 19.000000 -22.600010\nv 22.600010 17.000000 -22.600010\nv 22.600010 17.000000 -20.600010\nv 20.600010 17.000000 -20.600010\nv 20.600010 17.000000 -22.600010\nv 22.600010 19.000000 -22.600010\nv 22.600010 19.000000 -20.600010\nv 20.600010 19.000000 -20.600010\nv 20.600010 19.000000 -22.600010\nv 26.200012 17.000000 -22.600010\nv 26.200012 17.000000 -20.600010\nv 24.200012 17.000000 -20.600010\nv 24.200012 17.000000 -22.600010\nv 26.200012 19.000000 -22.600010\nv 26.200012 19.000000 -20.600010\nv 24.200012 19.000000 -20.600010\nv 24.200012 19.000000 -22.600010\nv 29.800014 17.000000 -22.600010\nv 29.800014 17.000000 -20.600010\nv 27.800014 17.000000 -20.600010\nv 27.800014 17.000000 -22.600010\nv 29.800014 19.000000 -22.600010\nv 29.800014 19.000000 -20.600010\nv 27.800014 19.000000 -20.600010\nv 27.800014 19.000000 -22.600010\nv 33.400017 17.000000 -22.600010\nv 33.400017 17.000000 -20.600010\nv 31.400017 17.000000 -20.600010\nv 31.400017 17.000000 -22.600010\nv 33.400017 19.000000 -22.600010\nv 33.400017 19.000000 -20.600010\nv 31.400017 19.000000 -20.600010\nv 31.400017 19.000000 -22.600010\nv 1.000000 17.000000 -26.200012\nv 1.000000 17.000000 -24.200012\nv -1.000000 17.000000 -24.200012\nv -1.000000 17.000000 -26.200012\nv 1.000000 19.000000 -26.200012\nv 0.999999 19.000000 -24.200012\nv -1.000000 19.000000 -24.200012\nv -1.000000 19.000000 -26.200012\nv 4.600001 17.000000 -26.200012\nv 4.600001 17.000000 -24.200012\nv 2.600001 17.000000 -24.200012\nv 2.600002 17.000000 -26.200012\nv 4.600002 19.000000 -26.200012\nv 4.600001 19.000000 -24.200012\nv 2.600001 19.000000 -24.200012\nv 2.600002 19.000000 -26.200012\nv 8.200003 17.000000 -26.200012\nv 8.200003 17.000000 -24.200012\nv 6.200003 17.000000 -24.200012\nv 6.200004 17.000000 -26.200012\nv 8.200004 19.000000 -26.200012\nv 8.200003 19.000000 -24.200012\nv 6.200003 19.000000 -24.200012\nv 6.200003 19.000000 -26.200012\nv 11.800005 17.000000 -26.200012\nv 11.800005 17.000000 -24.200012\nv 9.800005 17.000000 -24.200012\nv 9.800005 17.000000 -26.200012\nv 11.800005 19.000000 -26.200012\nv 11.800004 19.000000 -24.200012\nv 9.800005 19.000000 -24.200012\nv 9.800005 19.000000 -26.200012\nv 15.400006 17.000000 -26.200012\nv 15.400006 17.000000 -24.200012\nv 13.400006 17.000000 -24.200012\nv 13.400006 17.000000 -26.200012\nv 15.400007 19.000000 -26.200012\nv 15.400005 19.000000 -24.200012\nv 13.400006 19.000000 -24.200012\nv 13.400006 19.000000 -26.200012\nv 19.000008 17.000000 -26.200012\nv 19.000008 17.000000 -24.200012\nv 17.000008 17.000000 -24.200012\nv 17.000008 17.000000 -26.200012\nv 19.000008 19.000000 -26.200012\nv 19.000008 19.000000 -24.200012\nv 17.000008 19.000000 -24.200012\nv 17.000008 19.000000 -26.200012\nv 22.600010 17.000000 -26.200012\nv 22.600010 17.000000 -24.200012\nv 20.600010 17.000000 -24.200012\nv 20.600010 17.000000 -26.200012\nv 22.600010 19.000000 -26.200012\nv 22.600010 19.000000 -24.200012\nv 20.600010 19.000000 -24.200012\nv 20.600010 19.000000 -26.200012\nv 26.200012 17.000000 -26.200012\nv 26.200012 17.000000 -24.200012\nv 24.200012 17.000000 -24.200012\nv 24.200012 17.000000 -26.200012\nv 26.200012 19.000000 -26.200012\nv 26.200012 19.000000 -24.200012\nv 24.200012 19.000000 -24.200012\nv 24.200012 19.000000 -26.200012\nv 29.800014 17.000000 -26.200012\nv 29.800014 17.000000 -24.200012\nv 27.800014 17.000000 -24.200012\nv 27.800014 17.000000 -26.200012\nv 29.800014 19.000000 -26.200012\nv 29.800014 19.000000 -24.200012\nv 27.800014 19.000000 -24.200012\nv 27.800014 19.000000 -26.200012\nv 33.400017 17.000000 -26.200012\nv 33.400017 17.000000 -24.200012\nv 31.400017 17.000000 -24.200012\nv 31.400017 17.000000 -26.200012\nv 33.400017 19.000000 -26.200012\nv 33.400017 19.000000 -24.200012\nv 31.400017 19.000000 -24.200012\nv 31.400017 19.000000 -26.200012\nv 1.000000 17.000000 -29.800014\nv 1.000000 17.000000 -27.800014\nv -1.000000 17.000000 -27.800014\nv -1.000000 17.000000 -29.800014\nv 1.000000 19.000000 -29.800014\nv 0.999999 19.000000 -27.800014\nv -1.000000 19.000000 -27.800014\nv -1.000000 19.000000 -29.800014\nv 4.600001 17.000000 -29.800014\nv 4.600001 17.000000 -27.800014\nv 2.600001 17.000000 -27.800014\nv 2.600002 17.000000 -29.800014\nv 4.600002 19.000000 -29.800014\nv 4.600001 19.000000 -27.800014\nv 2.600001 19.000000 -27.800014\nv 2.600002 19.000000 -29.800014\nv 8.200003 17.000000 -29.800014\nv 8.200003 17.000000 -27.800014\nv 6.200003 17.000000 -27.800014\nv 6.200004 17.000000 -29.800014\nv 8.200004 19.000000 -29.800014\nv 8.200003 19.000000 -27.800014\nv 6.200003 19.000000 -27.800014\nv 6.200003 19.000000 -29.800014\nv 11.800005 17.000000 -29.800014\nv 11.800005 17.000000 -27.800014\nv 9.800005 17.000000 -27.800014\nv 9.800005 17.000000 -29.800014\nv 11.800005 19.000000 -29.800014\nv 11.800004 19.000000 -27.800014\nv 9.800005 19.000000 -27.800014\nv 9.800005 19.000000 -29.800014\nv 15.400006 17.000000 -29.800014\nv 15.400006 17.000000 -27.800014\nv 13.400006 17.000000 -27.800014\nv 13.400006 17.000000 -29.800014\nv 15.400007 19.000000 -29.800014\nv 15.400005 19.000000 -27.800014\nv 13.400006 19.000000 -27.800014\nv 13.400006 19.000000 -29.800014\nv 19.000008 17.000000 -29.800014\nv 19.000008 17.000000 -27.800014\nv 17.000008 17.000000 -27.800014\nv 17.000008 17.000000 -29.800014\nv 19.000008 19.000000 -29.800014\nv 19.000008 19.000000 -27.800014\nv 17.000008 19.000000 -27.800014\nv 17.000008 19.000000 -29.800014\nv 22.600010 17.000000 -29.800014\nv 22.600010 17.000000 -27.800014\nv 20.600010 17.000000 -27.800014\nv 20.600010 17.000000 -29.800014\nv 22.600010 19.000000 -29.800014\nv 22.600010 19.000000 -27.800014\nv 20.600010 19.000000 -27.800014\nv 20.600010 19.000000 -29.800014\nv 26.200012 17.000000 -29.800014\nv 26.200012 17.000000 -27.800014\nv 24.200012 17.000000 -27.800014\nv 24.200012 17.000000 -29.800014\nv 26.200012 19.000000 -29.800014\nv 26.200012 19.000000 -27.800014\nv 24.200012 19.000000 -27.800014\nv 24.200012 19.000000 -29.800014\nv 29.800014 17.000000 -29.800014\nv 29.800014 17.000000 -27.800014\nv 27.800014 17.000000 -27.800014\nv 27.800014 17.000000 -29.800014\nv 29.800014 19.000000 -29.800014\nv 29.800014 19.000000 -27.800014\nv 27.800014 19.000000 -27.800014\nv 27.800014 19.000000 -29.800014\nv 33.400017 17.000000 -29.800014\nv 33.400017 17.000000 -27.800014\nv 31.400017 17.000000 -27.800014\nv 31.400017 17.000000 -29.800014\nv 33.400017 19.000000 -29.800014\nv 33.400017 19.000000 -27.800014\nv 31.400017 19.000000 -27.800014\nv 31.400017 19.000000 -29.800014\nv 1.000000 17.000000 -33.400017\nv 1.000000 17.000000 -31.400017\nv -1.000000 17.000000 -31.400017\nv -1.000000 17.000000 -33.400017\nv 1.000000 19.000000 -33.400017\nv 0.999999 19.000000 -31.400017\nv -1.000000 19.000000 -31.400017\nv -1.000000 19.000000 -33.400017\nv 4.600001 17.000000 -33.400017\nv 4.600001 17.000000 -31.400017\nv 2.600001 17.000000 -31.400017\nv 2.600002 17.000000 -33.400017\nv 4.600002 19.000000 -33.400017\nv 4.600001 19.000000 -31.400017\nv 2.600001 19.000000 -31.400017\nv 2.600002 19.000000 -33.400017\nv 8.200003 17.000000 -33.400017\nv 8.200003 17.000000 -31.400017\nv 6.200003 17.000000 -31.400017\nv 6.200004 17.000000 -33.400017\nv 8.200004 19.000000 -33.400017\nv 8.200003 19.000000 -31.400017\nv 6.200003 19.000000 -31.400017\nv 6.200003 19.000000 -33.400017\nv 11.800005 17.000000 -33.400017\nv 11.800005 17.000000 -31.400017\nv 9.800005 17.000000 -31.400017\nv 9.800005 17.000000 -33.400017\nv 11.800005 19.000000 -33.400017\nv 11.800004 19.000000 -31.400017\nv 9.800005 19.000000 -31.400017\nv 9.800005 19.000000 -33.400017\nv 15.400006 17.000000 -33.400017\nv 15.400006 17.000000 -31.400017\nv 13.400006 17.000000 -31.400017\nv 13.400006 17.000000 -33.400017\nv 15.400007 19.000000 -33.400017\nv 15.400005 19.000000 -31.400017\nv 13.400006 19.000000 -31.400017\nv 13.400006 19.000000 -33.400017\nv 19.000008 17.000000 -33.400017\nv 19.000008 17.000000 -31.400017\nv 17.000008 17.000000 -31.400017\nv 17.000008 17.000000 -33.400017\nv 19.000008 19.000000 -33.400017\nv 19.000008 19.000000 -31.400017\nv 17.000008 19.000000 -31.400017\nv 17.000008 19.000000 -33.400017\nv 22.600010 17.000000 -33.400017\nv 22.600010 17.000000 -31.400017\nv 20.600010 17.000000 -31.400017\nv 20.600010 17.000000 -33.400017\nv 22.600010 19.000000 -33.400017\nv 22.600010 19.000000 -31.400017\nv 20.600010 19.000000 -31.400017\nv 20.600010 19.000000 -33.400017\nv 26.200012 17.000000 -33.400017\nv 26.200012 17.000000 -31.400017\nv 24.200012 17.000000 -31.400017\nv 24.200012 17.000000 -33.400017\nv 26.200012 19.000000 -33.400017\nv 26.200012 19.000000 -31.400017\nv 24.200012 19.000000 -31.400017\nv 24.200012 19.000000 -33.400017\nv 29.800014 17.000000 -33.400017\nv 29.800014 17.000000 -31.400017\nv 27.800014 17.000000 -31.400017\nv 27.800014 17.000000 -33.400017\nv 29.800014 19.000000 -33.400017\nv 29.800014 19.000000 -31.400017\nv 27.800014 19.000000 -31.400017\nv 27.800014 19.000000 -33.400017\nv 33.400017 17.000000 -33.400017\nv 33.400017 17.000000 -31.400017\nv 31.400017 17.000000 -31.400017\nv 31.400017 17.000000 -33.400017\nv 33.400017 19.000000 -33.400017\nv 33.400017 19.000000 -31.400017\nv 31.400017 19.000000 -31.400017\nv 31.400017 19.000000 -33.400017\nv -1.000000 17.000000 -1.000000\nv -1.000000 17.000000 1.000000\nv 1.000000 17.000000 1.000000\nv 1.000000 17.000000 -1.000000\nv -1.000000 19.000000 -0.999999\nv -0.999999 19.000000 1.000001\nv 1.000000 19.000000 1.000000\nv 1.000000 19.000000 -1.000000\nv -4.600001 17.000000 -1.000000\nv -4.600001 17.000000 1.000000\nv -2.600001 17.000000 1.000000\nv -2.600002 17.000000 -1.000000\nv -4.600002 19.000000 -0.999999\nv -4.600001 19.000000 1.000001\nv -2.600001 19.000000 1.000000\nv -2.600002 19.000000 -1.000000\nv -8.200003 17.000000 -1.000000\nv -8.200003 17.000000 1.000000\nv -6.200003 17.000000 1.000000\nv -6.200004 17.000000 -1.000000\nv -8.200004 19.000000 -0.999999\nv -8.200003 19.000000 1.000001\nv -6.200003 19.000000 1.000000\nv -6.200003 19.000000 -1.000000\nv -11.800005 17.000000 -1.000000\nv -11.800005 17.000000 1.000000\nv -9.800005 17.000000 1.000000\nv -9.800005 17.000000 -1.000000\nv -11.800005 19.000000 -0.999999\nv -11.800004 19.000000 1.000001\nv -9.800005 19.000000 1.000000\nv -9.800005 19.000000 -1.000000\nv -15.400006 17.000000 -1.000000\nv -15.400006 17.000000 1.000000\nv -13.400006 17.000000 1.000000\nv -13.400006 17.000000 -1.000000\nv -15.400007 19.000000 -0.999999\nv -15.400005 19.000000 1.000001\nv -13.400006 19.000000 1.000000\nv -13.400006 19.000000 -1.000000\nv -19.000008 17.000000 -1.000000\nv -19.000008 17.000000 1.000000\nv -17.000008 17.000000 1.000000\nv -17.000008 17.000000 -1.000000\nv -19.000008 19.000000 -0.999999\nv -19.000008 19.000000 1.000001\nv -17.000008 19.000000 1.000000\nv -17.000008 19.000000 -1.000000\nv -22.600010 17.000000 -1.000000\nv -22.600010 17.000000 1.000000\nv -20.600010 17.000000 1.000000\nv -20.600010 17.000000 -1.000000\nv -22.600010 19.000000 -0.999999\nv -22.600010 19.000000 1.000001\nv -20.600010 19.000000 1.000000\nv -20.600010 19.000000 -1.000000\nv -26.200012 17.000000 -1.000000\nv -26.200012 17.000000 1.000000\nv -24.200012 17.000000 1.000000\nv -24.200012 17.000000 -1.000000\nv -26.200012 19.000000 -0.999999\nv -26.200012 19.000000 1.000001\nv -24.200012 19.000000 1.000000\nv -24.200012 19.000000 -1.000000\nv -29.800014 17.000000 -1.000000\nv -29.800014 17.000000 1.000000\nv -27.800014 17.000000 1.000000\nv -27.800014 17.000000 -1.000000\nv -29.800014 19.000000 -0.999999\nv -29.800014 19.000000 1.000001\nv -27.800014 19.000000 1.000000\nv -27.800014 19.000000 -1.000000\nv -33.400017 17.000000 -1.000000\nv -33.400017 17.000000 1.000000\nv -31.400017 17.000000 1.000000\nv -31.400017 17.000000 -1.000000\nv -33.400017 19.000000 -0.999999\nv -33.400017 19.000000 1.000001\nv -31.400017 19.000000 1.000000\nv -31.400017 19.000000 -1.000000\nv -1.000000 17.000000 -4.600001\nv -1.000000 17.000000 -2.600002\nv 1.000000 17.000000 -2.600002\nv 1.000000 17.000000 -4.600002\nv -1.000000 19.000000 -4.600001\nv -0.999999 19.000000 -2.600001\nv 1.000000 19.000000 -2.600002\nv 1.000000 19.000000 -4.600001\nv -4.600001 17.000000 -4.600001\nv -4.600001 17.000000 -2.600002\nv -2.600001 17.000000 -2.600002\nv -2.600002 17.000000 -4.600002\nv -4.600002 19.000000 -4.600001\nv -4.600001 19.000000 -2.600001\nv -2.600001 19.000000 -2.600002\nv -2.600002 19.000000 -4.600001\nv -8.200003 17.000000 -4.600001\nv -8.200003 17.000000 -2.600002\nv -6.200003 17.000000 -2.600002\nv -6.200004 17.000000 -4.600002\nv -8.200004 19.000000 -4.600001\nv -8.200003 19.000000 -2.600001\nv -6.200003 19.000000 -2.600002\nv -6.200003 19.000000 -4.600001\nv -11.800005 17.000000 -4.600001\nv -11.800005 17.000000 -2.600002\nv -9.800005 17.000000 -2.600002\nv -9.800005 17.000000 -4.600002\nv -11.800005 19.000000 -4.600001\nv -11.800004 19.000000 -2.600001\nv -9.800005 19.000000 -2.600002\nv -9.800005 19.000000 -4.600001\nv -15.400006 17.000000 -4.600001\nv -15.400006 17.000000 -2.600002\nv -13.400006 17.000000 -2.600002\nv -13.400006 17.000000 -4.600002\nv -15.400007 19.000000 -4.600001\nv -15.400005 19.000000 -2.600001\nv -13.400006 19.000000 -2.600002\nv -13.400006 19.000000 -4.600001\nv -19.000008 17.000000 -4.600001\nv -19.000008 17.000000 -2.600002\nv -17.000008 17.000000 -2.600002\nv -17.000008 17.000000 -4.600002\nv -19.000008 19.000000 -4.600001\nv -19.000008 19.000000 -2.600001\nv -17.000008 19.000000 -2.600002\nv -17.000008 19.000000 -4.600001\nv -22.600010 17.000000 -4.600001\nv -22.600010 17.000000 -2.600002\nv -20.600010 17.000000 -2.600002\nv -20.600010 17.000000 -4.600002\nv -22.600010 19.000000 -4.600001\nv -22.600010 19.000000 -2.600001\nv -20.600010 19.000000 -2.600002\nv -20.600010 19.000000 -4.600001\nv -26.200012 17.000000 -4.600001\nv -26.200012 17.000000 -2.600002\nv -24.200012 17.000000 -2.600002\nv -24.200012 17.000000 -4.600002\nv -26.200012 19.000000 -4.600001\nv -26.200012 19.000000 -2.600001\nv -24.200012 19.000000 -2.600002\nv -24.200012 19.000000 -4.600001\nv -29.800014 17.000000 -4.600001\nv -29.800014 17.000000 -2.600002\nv -27.800014 17.000000 -2.600002\nv -27.800014 17.000000 -4.600002\nv -29.800014 19.000000 -4.600001\nv -29.800014 19.000000 -2.600001\nv -27.800014 19.000000 -2.600002\nv -27.800014 19.000000 -4.600001\nv -33.400017 17.000000 -4.600001\nv -33.400017 17.000000 -2.600002\nv -31.400017 17.000000 -2.600002\nv -31.400017 17.000000 -4.600002\nv -33.400017 19.000000 -4.600001\nv -33.400017 19.000000 -2.600001\nv -31.400017 19.000000 -2.600002\nv -31.400017 19.000000 -4.600001\nv -1.000000 17.000000 -8.200003\nv -1.000000 17.000000 -6.200003\nv 1.000000 17.000000 -6.200003\nv 1.000000 17.000000 -8.200004\nv -1.000000 19.000000 -8.200003\nv -0.999999 19.000000 -6.200003\nv 1.000000 19.000000 -6.200004\nv 1.000000 19.000000 -8.200003\nv -4.600001 17.000000 -8.200003\nv -4.600001 17.000000 -6.200003\nv -2.600001 17.000000 -6.200003\nv -2.600002 17.000000 -8.200004\nv -4.600002 19.000000 -8.200003\nv -4.600001 19.000000 -6.200003\nv -2.600001 19.000000 -6.200004\nv -2.600002 19.000000 -8.200003\nv -8.200003 17.000000 -8.200003\nv -8.200003 17.000000 -6.200003\nv -6.200003 17.000000 -6.200003\nv -6.200004 17.000000 -8.200004\nv -8.200004 19.000000 -8.200003\nv -8.200003 19.000000 -6.200003\nv -6.200003 19.000000 -6.200004\nv -6.200003 19.000000 -8.200003\nv -11.800005 17.000000 -8.200003\nv -11.800005 17.000000 -6.200003\nv -9.800005 17.000000 -6.200003\nv -9.800005 17.000000 -8.200004\nv -11.800005 19.000000 -8.200003\nv -11.800004 19.000000 -6.200003\nv -9.800005 19.000000 -6.200004\nv -9.800005 19.000000 -8.200003\nv -15.400006 17.000000 -8.200003\nv -15.400006 17.000000 -6.200003\nv -13.400006 17.000000 -6.200003\nv -13.400006 17.000000 -8.200004\nv -15.400007 19.000000 -8.200003\nv -15.400005 19.000000 -6.200003\nv -13.400006 19.000000 -6.200004\nv -13.400006 19.000000 -8.200003\nv -19.000008 17.000000 -8.200003\nv -19.000008 17.000000 -6.200003\nv -17.000008 17.000000 -6.200003\nv -17.000008 17.000000 -8.200004\nv -19.000008 19.000000 -8.200003\nv -19.000008 19.000000 -6.200003\nv -17.000008 19.000000 -6.200004\nv -17.000008 19.000000 -8.200003\nv -22.600010 17.000000 -8.200003\nv -22.600010 17.000000 -6.200003\nv -20.600010 17.000000 -6.200003\nv -20.600010 17.000000 -8.200004\nv -22.600010 19.000000 -8.200003\nv -22.600010 19.000000 -6.200003\nv -20.600010 19.000000 -6.200004\nv -20.600010 19.000000 -8.200003\nv -26.200012 17.000000 -8.200003\nv -26.200012 17.000000 -6.200003\nv -24.200012 17.000000 -6.200003\nv -24.200012 17.000000 -8.200004\nv -26.200012 19.000000 -8.200003\nv -26.200012 19.000000 -6.200003\nv -24.200012 19.000000 -6.200004\nv -24.200012 19.000000 -8.200003\nv -29.800014 17.000000 -8.200003\nv -29.800014 17.000000 -6.200003\nv -27.800014 17.000000 -6.200003\nv -27.800014 17.000000 -8.200004\nv -29.800014 19.000000 -8.200003\nv -29.800014 19.000000 -6.200003\nv -27.800014 19.000000 -6.200004\nv -27.800014 19.000000 -8.200003\nv -33.400017 17.000000 -8.200003\nv -33.400017 17.000000 -6.200003\nv -31.400017 17.000000 -6.200003\nv -31.400017 17.000000 -8.200004\nv -33.400017 19.000000 -8.200003\nv -33.400017 19.000000 -6.200003\nv -31.400017 19.000000 -6.200004\nv -31.400017 19.000000 -8.200003\nv -1.000000 17.000000 -11.800005\nv -1.000000 17.000000 -9.800005\nv 1.000000 17.000000 -9.800005\nv 1.000000 17.000000 -11.800005\nv -1.000000 19.000000 -11.800004\nv -0.999999 19.000000 -9.800004\nv 1.000000 19.000000 -9.800005\nv 1.000000 19.000000 -11.800005\nv -4.600001 17.000000 -11.800005\nv -4.600001 17.000000 -9.800005\nv -2.600001 17.000000 -9.800005\nv -2.600002 17.000000 -11.800005\nv -4.600002 19.000000 -11.800004\nv -4.600001 19.000000 -9.800004\nv -2.600001 19.000000 -9.800005\nv -2.600002 19.000000 -11.800005\nv -8.200003 17.000000 -11.800005\nv -8.200003 17.000000 -9.800005\nv -6.200003 17.000000 -9.800005\nv -6.200004 17.000000 -11.800005\nv -8.200004 19.000000 -11.800004\nv -8.200003 19.000000 -9.800004\nv -6.200003 19.000000 -9.800005\nv -6.200003 19.000000 -11.800005\nv -11.800005 17.000000 -11.800005\nv -11.800005 17.000000 -9.800005\nv -9.800005 17.000000 -9.800005\nv -9.800005 17.000000 -11.800005\nv -11.800005 19.000000 -11.800004\nv -11.800004 19.000000 -9.800004\nv -9.800005 19.000000 -9.800005\nv -9.800005 19.000000 -11.800005\nv -15.400006 17.000000 -11.800005\nv -15.400006 17.000000 -9.800005\nv -13.400006 17.000000 -9.800005\nv -13.400006 17.000000 -11.800005\nv -15.400007 19.000000 -11.800004\nv -15.400005 19.000000 -9.800004\nv -13.400006 19.000000 -9.800005\nv -13.400006 19.000000 -11.800005\nv -19.000008 17.000000 -11.800005\nv -19.000008 17.000000 -9.800005\nv -17.000008 17.000000 -9.800005\nv -17.000008 17.000000 -11.800005\nv -19.000008 19.000000 -11.800004\nv -19.000008 19.000000 -9.800004\nv -17.000008 19.000000 -9.800005\nv -17.000008 19.000000 -11.800005\nv -22.600010 17.000000 -11.800005\nv -22.600010 17.000000 -9.800005\nv -20.600010 17.000000 -9.800005\nv -20.600010 17.000000 -11.800005\nv -22.600010 19.000000 -11.800004\nv -22.600010 19.000000 -9.800004\nv -20.600010 19.000000 -9.800005\nv -20.600010 19.000000 -11.800005\nv -26.200012 17.000000 -11.800005\nv -26.200012 17.000000 -9.800005\nv -24.200012 17.000000 -9.800005\nv -24.200012 17.000000 -11.800005\nv -26.200012 19.000000 -11.800004\nv -26.200012 19.000000 -9.800004\nv -24.200012 19.000000 -9.800005\nv -24.200012 19.000000 -11.800005\nv -29.800014 17.000000 -11.800005\nv -29.800014 17.000000 -9.800005\nv -27.800014 17.000000 -9.800005\nv -27.800014 17.000000 -11.800005\nv -29.800014 19.000000 -11.800004\nv -29.800014 19.000000 -9.800004\nv -27.800014 19.000000 -9.800005\nv -27.800014 19.000000 -11.800005\nv -33.400017 17.000000 -11.800005\nv -33.400017 17.000000 -9.800005\nv -31.400017 17.000000 -9.800005\nv -31.400017 17.000000 -11.800005\nv -33.400017 19.000000 -11.800004\nv -33.400017 19.000000 -9.800004\nv -31.400017 19.000000 -9.800005\nv -31.400017 19.000000 -11.800005\nv -1.000000 17.000000 -15.400006\nv -1.000000 17.000000 -13.400006\nv 1.000000 17.000000 -13.400006\nv 1.000000 17.000000 -15.400006\nv -1.000000 19.000000 -15.400005\nv -0.999999 19.000000 -13.400005\nv 1.000000 19.000000 -13.400006\nv 1.000000 19.000000 -15.400006\nv -4.600001 17.000000 -15.400006\nv -4.600001 17.000000 -13.400006\nv -2.600001 17.000000 -13.400006\nv -2.600002 17.000000 -15.400006\nv -4.600002 19.000000 -15.400005\nv -4.600001 19.000000 -13.400005\nv -2.600001 19.000000 -13.400006\nv -2.600002 19.000000 -15.400006\nv -8.200003 17.000000 -15.400006\nv -8.200003 17.000000 -13.400006\nv -6.200003 17.000000 -13.400006\nv -6.200004 17.000000 -15.400006\nv -8.200004 19.000000 -15.400005\nv -8.200003 19.000000 -13.400005\nv -6.200003 19.000000 -13.400006\nv -6.200003 19.000000 -15.400006\nv -11.800005 17.000000 -15.400006\nv -11.800005 17.000000 -13.400006\nv -9.800005 17.000000 -13.400006\nv -9.800005 17.000000 -15.400006\nv -11.800005 19.000000 -15.400005\nv -11.800004 19.000000 -13.400005\nv -9.800005 19.000000 -13.400006\nv -9.800005 19.000000 -15.400006\nv -15.400006 17.000000 -15.400006\nv -15.400006 17.000000 -13.400006\nv -13.400006 17.000000 -13.400006\nv -13.400006 17.000000 -15.400006\nv -15.400007 19.000000 -15.400005\nv -15.400005 19.000000 -13.400005\nv -13.400006 19.000000 -13.400006\nv -13.400006 19.000000 -15.400006\nv -19.000008 17.000000 -15.400006\nv -19.000008 17.000000 -13.400006\nv -17.000008 17.000000 -13.400006\nv -17.000008 17.000000 -15.400006\nv -19.000008 19.000000 -15.400005\nv -19.000008 19.000000 -13.400005\nv -17.000008 19.000000 -13.400006\nv -17.000008 19.000000 -15.400006\nv -22.600010 17.000000 -15.400006\nv -22.600010 17.000000 -13.400006\nv -20.600010 17.000000 -13.400006\nv -20.600010 17.000000 -15.400006\nv -22.600010 19.000000 -15.400005\nv -22.600010 19.000000 -13.400005\nv -20.600010 19.000000 -13.400006\nv -20.600010 19.000000 -15.400006\nv -26.200012 17.000000 -15.400006\nv -26.200012 17.000000 -13.400006\nv -24.200012 17.000000 -13.400006\nv -24.200012 17.000000 -15.400006\nv -26.200012 19.000000 -15.400005\nv -26.200012 19.000000 -13.400005\nv -24.200012 19.000000 -13.400006\nv -24.200012 19.000000 -15.400006\nv -29.800014 17.000000 -15.400006\nv -29.800014 17.000000 -13.400006\nv -27.800014 17.000000 -13.400006\nv -27.800014 17.000000 -15.400006\nv -29.800014 19.000000 -15.400005\nv -29.800014 19.000000 -13.400005\nv -27.800014 19.000000 -13.400006\nv -27.800014 19.000000 -15.400006\nv -33.400017 17.000000 -15.400006\nv -33.400017 17.000000 -13.400006\nv -31.400017 17.000000 -13.400006\nv -31.400017 17.000000 -15.400006\nv -33.400017 19.000000 -15.400005\nv -33.400017 19.000000 -13.400005\nv -31.400017 19.000000 -13.400006\nv -31.400017 19.000000 -15.400006\nv -1.000000 17.000000 -19.000008\nv -1.000000 17.000000 -17.000008\nv 1.000000 17.000000 -17.000008\nv 1.000000 17.000000 -19.000008\nv -1.000000 19.000000 -19.000008\nv -0.999999 19.000000 -17.000008\nv 1.000000 19.000000 -17.000008\nv 1.000000 19.000000 -19.000008\nv -4.600001 17.000000 -19.000008\nv -4.600001 17.000000 -17.000008\nv -2.600001 17.000000 -17.000008\nv -2.600002 17.000000 -19.000008\nv -4.600002 19.000000 -19.000008\nv -4.600001 19.000000 -17.000008\nv -2.600001 19.000000 -17.000008\nv -2.600002 19.000000 -19.000008\nv -8.200003 17.000000 -19.000008\nv -8.200003 17.000000 -17.000008\nv -6.200003 17.000000 -17.000008\nv -6.200004 17.000000 -19.000008\nv -8.200004 19.000000 -19.000008\nv -8.200003 19.000000 -17.000008\nv -6.200003 19.000000 -17.000008\nv -6.200003 19.000000 -19.000008\nv -11.800005 17.000000 -19.000008\nv -11.800005 17.000000 -17.000008\nv -9.800005 17.000000 -17.000008\nv -9.800005 17.000000 -19.000008\nv -11.800005 19.000000 -19.000008\nv -11.800004 19.000000 -17.000008\nv -9.800005 19.000000 -17.000008\nv -9.800005 19.000000 -19.000008\nv -15.400006 17.000000 -19.000008\nv -15.400006 17.000000 -17.000008\nv -13.400006 17.000000 -17.000008\nv -13.400006 17.000000 -19.000008\nv -15.400007 19.000000 -19.000008\nv -15.400005 19.000000 -17.000008\nv -13.400006 19.000000 -17.000008\nv -13.400006 19.000000 -19.000008\nv -19.000008 17.000000 -19.000008\nv -19.000008 17.000000 -17.000008\nv -17.000008 17.000000 -17.000008\nv -17.000008 17.000000 -19.000008\nv -19.000008 19.000000 -19.000008\nv -19.000008 19.000000 -17.000008\nv -17.000008 19.000000 -17.000008\nv -17.000008 19.000000 -19.000008\nv -22.600010 17.000000 -19.000008\nv -22.600010 17.000000 -17.000008\nv -20.600010 17.000000 -17.000008\nv -20.600010 17.000000 -19.000008\nv -22.600010 19.000000 -19.000008\nv -22.600010 19.000000 -17.000008\nv -20.600010 19.000000 -17.000008\nv -20.600010 19.000000 -19.000008\nv -26.200012 17.000000 -19.000008\nv -26.200012 17.000000 -17.000008\nv -24.200012 17.000000 -17.000008\nv -24.200012 17.000000 -19.000008\nv -26.200012 19.000000 -19.000008\nv -26.200012 19.000000 -17.000008\nv -24.200012 19.000000 -17.000008\nv -24.200012 19.000000 -19.000008\nv -29.800014 17.000000 -19.000008\nv -29.800014 17.000000 -17.000008\nv -27.800014 17.000000 -17.000008\nv -27.800014 17.000000 -19.000008\nv -29.800014 19.000000 -19.000008\nv -29.800014 19.000000 -17.000008\nv -27.800014 19.000000 -17.000008\nv -27.800014 19.000000 -19.000008\nv -33.400017 17.000000 -19.000008\nv -33.400017 17.000000 -17.000008\nv -31.400017 17.000000 -17.000008\nv -31.400017 17.000000 -19.000008\nv -33.400017 19.000000 -19.000008\nv -33.400017 19.000000 -17.000008\nv -31.400017 19.000000 -17.000008\nv -31.400017 19.000000 -19.000008\nv -1.000000 17.000000 -22.600010\nv -1.000000 17.000000 -20.600010\nv 1.000000 17.000000 -20.600010\nv 1.000000 17.000000 -22.600010\nv -1.000000 19.000000 -22.600010\nv -0.999999 19.000000 -20.600010\nv 1.000000 19.000000 -20.600010\nv 1.000000 19.000000 -22.600010\nv -4.600001 17.000000 -22.600010\nv -4.600001 17.000000 -20.600010\nv -2.600001 17.000000 -20.600010\nv -2.600002 17.000000 -22.600010\nv -4.600002 19.000000 -22.600010\nv -4.600001 19.000000 -20.600010\nv -2.600001 19.000000 -20.600010\nv -2.600002 19.000000 -22.600010\nv -8.200003 17.000000 -22.600010\nv -8.200003 17.000000 -20.600010\nv -6.200003 17.000000 -20.600010\nv -6.200004 17.000000 -22.600010\nv -8.200004 19.000000 -22.600010\nv -8.200003 19.000000 -20.600010\nv -6.200003 19.000000 -20.600010\nv -6.200003 19.000000 -22.600010\nv -11.800005 17.000000 -22.600010\nv -11.800005 17.000000 -20.600010\nv -9.800005 17.000000 -20.600010\nv -9.800005 17.000000 -22.600010\nv -11.800005 19.000000 -22.600010\nv -11.800004 19.000000 -20.600010\nv -9.800005 19.000000 -20.600010\nv -9.800005 19.000000 -22.600010\nv -15.400006 17.000000 -22.600010\nv -15.400006 17.000000 -20.600010\nv -13.400006 17.000000 -20.600010\nv -13.400006 17.000000 -22.600010\nv -15.400007 19.000000 -22.600010\nv -15.400005 19.000000 -20.600010\nv -13.400006 19.000000 -20.600010\nv -13.400006 19.000000 -22.600010\nv -19.000008 17.000000 -22.600010\nv -19.000008 17.000000 -20.600010\nv -17.000008 17.000000 -20.600010\nv -17.000008 17.000000 -22.600010\nv -19.000008 19.000000 -22.600010\nv -19.000008 19.000000 -20.600010\nv -17.000008 19.000000 -20.600010\nv -17.000008 19.000000 -22.600010\nv -22.600010 17.000000 -22.600010\nv -22.600010 17.000000 -20.600010\nv -20.600010 17.000000 -20.600010\nv -20.600010 17.000000 -22.600010\nv -22.600010 19.000000 -22.600010\nv -22.600010 19.000000 -20.600010\nv -20.600010 19.000000 -20.600010\nv -20.600010 19.000000 -22.600010\nv -26.200012 17.000000 -22.600010\nv -26.200012 17.000000 -20.600010\nv -24.200012 17.000000 -20.600010\nv -24.200012 17.000000 -22.600010\nv -26.200012 19.000000 -22.600010\nv -26.200012 19.000000 -20.600010\nv -24.200012 19.000000 -20.600010\nv -24.200012 19.000000 -22.600010\nv -29.800014 17.000000 -22.600010\nv -29.800014 17.000000 -20.600010\nv -27.800014 17.000000 -20.600010\nv -27.800014 17.000000 -22.600010\nv -29.800014 19.000000 -22.600010\nv -29.800014 19.000000 -20.600010\nv -27.800014 19.000000 -20.600010\nv -27.800014 19.000000 -22.600010\nv -33.400017 17.000000 -22.600010\nv -33.400017 17.000000 -20.600010\nv -31.400017 17.000000 -20.600010\nv -31.400017 17.000000 -22.600010\nv -33.400017 19.000000 -22.600010\nv -33.400017 19.000000 -20.600010\nv -31.400017 19.000000 -20.600010\nv -31.400017 19.000000 -22.600010\nv -1.000000 17.000000 -26.200012\nv -1.000000 17.000000 -24.200012\nv 1.000000 17.000000 -24.200012\nv 1.000000 17.000000 -26.200012\nv -1.000000 19.000000 -26.200012\nv -0.999999 19.000000 -24.200012\nv 1.000000 19.000000 -24.200012\nv 1.000000 19.000000 -26.200012\nv -4.600001 17.000000 -26.200012\nv -4.600001 17.000000 -24.200012\nv -2.600001 17.000000 -24.200012\nv -2.600002 17.000000 -26.200012\nv -4.600002 19.000000 -26.200012\nv -4.600001 19.000000 -24.200012\nv -2.600001 19.000000 -24.200012\nv -2.600002 19.000000 -26.200012\nv -8.200003 17.000000 -26.200012\nv -8.200003 17.000000 -24.200012\nv -6.200003 17.000000 -24.200012\nv -6.200004 17.000000 -26.200012\nv -8.200004 19.000000 -26.200012\nv -8.200003 19.000000 -24.200012\nv -6.200003 19.000000 -24.200012\nv -6.200003 19.000000 -26.200012\nv -11.800005 17.000000 -26.200012\nv -11.800005 17.000000 -24.200012\nv -9.800005 17.000000 -24.200012\nv -9.800005 17.000000 -26.200012\nv -11.800005 19.000000 -26.200012\nv -11.800004 19.000000 -24.200012\nv -9.800005 19.000000 -24.200012\nv -9.800005 19.000000 -26.200012\nv -15.400006 17.000000 -26.200012\nv -15.400006 17.000000 -24.200012\nv -13.400006 17.000000 -24.200012\nv -13.400006 17.000000 -26.200012\nv -15.400007 19.000000 -26.200012\nv -15.400005 19.000000 -24.200012\nv -13.400006 19.000000 -24.200012\nv -13.400006 19.000000 -26.200012\nv -19.000008 17.000000 -26.200012\nv -19.000008 17.000000 -24.200012\nv -17.000008 17.000000 -24.200012\nv -17.000008 17.000000 -26.200012\nv -19.000008 19.000000 -26.200012\nv -19.000008 19.000000 -24.200012\nv -17.000008 19.000000 -24.200012\nv -17.000008 19.000000 -26.200012\nv -22.600010 17.000000 -26.200012\nv -22.600010 17.000000 -24.200012\nv -20.600010 17.000000 -24.200012\nv -20.600010 17.000000 -26.200012\nv -22.600010 19.000000 -26.200012\nv -22.600010 19.000000 -24.200012\nv -20.600010 19.000000 -24.200012\nv -20.600010 19.000000 -26.200012\nv -26.200012 17.000000 -26.200012\nv -26.200012 17.000000 -24.200012\nv -24.200012 17.000000 -24.200012\nv -24.200012 17.000000 -26.200012\nv -26.200012 19.000000 -26.200012\nv -26.200012 19.000000 -24.200012\nv -24.200012 19.000000 -24.200012\nv -24.200012 19.000000 -26.200012\nv -29.800014 17.000000 -26.200012\nv -29.800014 17.000000 -24.200012\nv -27.800014 17.000000 -24.200012\nv -27.800014 17.000000 -26.200012\nv -29.800014 19.000000 -26.200012\nv -29.800014 19.000000 -24.200012\nv -27.800014 19.000000 -24.200012\nv -27.800014 19.000000 -26.200012\nv -33.400017 17.000000 -26.200012\nv -33.400017 17.000000 -24.200012\nv -31.400017 17.000000 -24.200012\nv -31.400017 17.000000 -26.200012\nv -33.400017 19.000000 -26.200012\nv -33.400017 19.000000 -24.200012\nv -31.400017 19.000000 -24.200012\nv -31.400017 19.000000 -26.200012\nv -1.000000 17.000000 -29.800014\nv -1.000000 17.000000 -27.800014\nv 1.000000 17.000000 -27.800014\nv 1.000000 17.000000 -29.800014\nv -1.000000 19.000000 -29.800014\nv -0.999999 19.000000 -27.800014\nv 1.000000 19.000000 -27.800014\nv 1.000000 19.000000 -29.800014\nv -4.600001 17.000000 -29.800014\nv -4.600001 17.000000 -27.800014\nv -2.600001 17.000000 -27.800014\nv -2.600002 17.000000 -29.800014\nv -4.600002 19.000000 -29.800014\nv -4.600001 19.000000 -27.800014\nv -2.600001 19.000000 -27.800014\nv -2.600002 19.000000 -29.800014\nv -8.200003 17.000000 -29.800014\nv -8.200003 17.000000 -27.800014\nv -6.200003 17.000000 -27.800014\nv -6.200004 17.000000 -29.800014\nv -8.200004 19.000000 -29.800014\nv -8.200003 19.000000 -27.800014\nv -6.200003 19.000000 -27.800014\nv -6.200003 19.000000 -29.800014\nv -11.800005 17.000000 -29.800014\nv -11.800005 17.000000 -27.800014\nv -9.800005 17.000000 -27.800014\nv -9.800005 17.000000 -29.800014\nv -11.800005 19.000000 -29.800014\nv -11.800004 19.000000 -27.800014\nv -9.800005 19.000000 -27.800014\nv -9.800005 19.000000 -29.800014\nv -15.400006 17.000000 -29.800014\nv -15.400006 17.000000 -27.800014\nv -13.400006 17.000000 -27.800014\nv -13.400006 17.000000 -29.800014\nv -15.400007 19.000000 -29.800014\nv -15.400005 19.000000 -27.800014\nv -13.400006 19.000000 -27.800014\nv -13.400006 19.000000 -29.800014\nv -19.000008 17.000000 -29.800014\nv -19.000008 17.000000 -27.800014\nv -17.000008 17.000000 -27.800014\nv -17.000008 17.000000 -29.800014\nv -19.000008 19.000000 -29.800014\nv -19.000008 19.000000 -27.800014\nv -17.000008 19.000000 -27.800014\nv -17.000008 19.000000 -29.800014\nv -22.600010 17.000000 -29.800014\nv -22.600010 17.000000 -27.800014\nv -20.600010 17.000000 -27.800014\nv -20.600010 17.000000 -29.800014\nv -22.600010 19.000000 -29.800014\nv -22.600010 19.000000 -27.800014\nv -20.600010 19.000000 -27.800014\nv -20.600010 19.000000 -29.800014\nv -26.200012 17.000000 -29.800014\nv -26.200012 17.000000 -27.800014\nv -24.200012 17.000000 -27.800014\nv -24.200012 17.000000 -29.800014\nv -26.200012 19.000000 -29.800014\nv -26.200012 19.000000 -27.800014\nv -24.200012 19.000000 -27.800014\nv -24.200012 19.000000 -29.800014\nv -29.800014 17.000000 -29.800014\nv -29.800014 17.000000 -27.800014\nv -27.800014 17.000000 -27.800014\nv -27.800014 17.000000 -29.800014\nv -29.800014 19.000000 -29.800014\nv -29.800014 19.000000 -27.800014\nv -27.800014 19.000000 -27.800014\nv -27.800014 19.000000 -29.800014\nv -33.400017 17.000000 -29.800014\nv -33.400017 17.000000 -27.800014\nv -31.400017 17.000000 -27.800014\nv -31.400017 17.000000 -29.800014\nv -33.400017 19.000000 -29.800014\nv -33.400017 19.000000 -27.800014\nv -31.400017 19.000000 -27.800014\nv -31.400017 19.000000 -29.800014\nv -1.000000 17.000000 -33.400017\nv -1.000000 17.000000 -31.400017\nv 1.000000 17.000000 -31.400017\nv 1.000000 17.000000 -33.400017\nv -1.000000 19.000000 -33.400017\nv -0.999999 19.000000 -31.400017\nv 1.000000 19.000000 -31.400017\nv 1.000000 19.000000 -33.400017\nv -4.600001 17.000000 -33.400017\nv -4.600001 17.000000 -31.400017\nv -2.600001 17.000000 -31.400017\nv -2.600002 17.000000 -33.400017\nv -4.600002 19.000000 -33.400017\nv -4.600001 19.000000 -31.400017\nv -2.600001 19.000000 -31.400017\nv -2.600002 19.000000 -33.400017\nv -8.200003 17.000000 -33.400017\nv -8.200003 17.000000 -31.400017\nv -6.200003 17.000000 -31.400017\nv -6.200004 17.000000 -33.400017\nv -8.200004 19.000000 -33.400017\nv -8.200003 19.000000 -31.400017\nv -6.200003 19.000000 -31.400017\nv -6.200003 19.000000 -33.400017\nv -11.800005 17.000000 -33.400017\nv -11.800005 17.000000 -31.400017\nv -9.800005 17.000000 -31.400017\nv -9.800005 17.000000 -33.400017\nv -11.800005 19.000000 -33.400017\nv -11.800004 19.000000 -31.400017\nv -9.800005 19.000000 -31.400017\nv -9.800005 19.000000 -33.400017\nv -15.400006 17.000000 -33.400017\nv -15.400006 17.000000 -31.400017\nv -13.400006 17.000000 -31.400017\nv -13.400006 17.000000 -33.400017\nv -15.400007 19.000000 -33.400017\nv -15.400005 19.000000 -31.400017\nv -13.400006 19.000000 -31.400017\nv -13.400006 19.000000 -33.400017\nv -19.000008 17.000000 -33.400017\nv -19.000008 17.000000 -31.400017\nv -17.000008 17.000000 -31.400017\nv -17.000008 17.000000 -33.400017\nv -19.000008 19.000000 -33.400017\nv -19.000008 19.000000 -31.400017\nv -17.000008 19.000000 -31.400017\nv -17.000008 19.000000 -33.400017\nv -22.600010 17.000000 -33.400017\nv -22.600010 17.000000 -31.400017\nv -20.600010 17.000000 -31.400017\nv -20.600010 17.000000 -33.400017\nv -22.600010 19.000000 -33.400017\nv -22.600010 19.000000 -31.400017\nv -20.600010 19.000000 -31.400017\nv -20.600010 19.000000 -33.400017\nv -26.200012 17.000000 -33.400017\nv -26.200012 17.000000 -31.400017\nv -24.200012 17.000000 -31.400017\nv -24.200012 17.000000 -33.400017\nv -26.200012 19.000000 -33.400017\nv -26.200012 19.000000 -31.400017\nv -24.200012 19.000000 -31.400017\nv -24.200012 19.000000 -33.400017\nv -29.800014 17.000000 -33.400017\nv -29.800014 17.000000 -31.400017\nv -27.800014 17.000000 -31.400017\nv -27.800014 17.000000 -33.400017\nv -29.800014 19.000000 -33.400017\nv -29.800014 19.000000 -31.400017\nv -27.800014 19.000000 -31.400017\nv -27.800014 19.000000 -33.400017\nv -33.400017 17.000000 -33.400017\nv -33.400017 17.000000 -31.400017\nv -31.400017 17.000000 -31.400017\nv -31.400017 17.000000 -33.400017\nv -33.400017 19.000000 -33.400017\nv -33.400017 19.000000 -31.400017\nv -31.400017 19.000000 -31.400017\nv -31.400017 19.000000 -33.400017\nv 1.000000 20.600000 -1.000000\nv 1.000000 20.600000 1.000000\nv -1.000000 20.600000 1.000000\nv -1.000000 20.600000 -1.000000\nv 1.000000 22.600000 -0.999999\nv 0.999999 22.600000 1.000001\nv -1.000000 22.600000 1.000000\nv -1.000000 22.600000 -1.000000\nv 4.600001 20.600000 -1.000000\nv 4.600001 20.600000 1.000000\nv 2.600001 20.600000 1.000000\nv 2.600002 20.600000 -1.000000\nv 4.600002 22.600000 -0.999999\nv 4.600001 22.600000 1.000001\nv 2.600001 22.600000 1.000000\nv 2.600002 22.600000 -1.000000\nv 8.200003 20.600000 -1.000000\nv 8.200003 20.600000 1.000000\nv 6.200003 20.600000 1.000000\nv 6.200004 20.600000 -1.000000\nv 8.200004 22.600000 -0.999999\nv 8.200003 22.600000 1.000001\nv 6.200003 22.600000 1.000000\nv 6.200003 22.600000 -1.000000\nv 11.800005 20.600000 -1.000000\nv 11.800005 20.600000 1.000000\nv 9.800005 20.600000 1.000000\nv 9.800005 20.600000 -1.000000\nv 11.800005 22.600000 -0.999999\nv 11.800004 22.600000 1.000001\nv 9.800005 22.600000 1.000000\nv 9.800005 22.600000 -1.000000\nv 15.400006 20.600000 -1.000000\nv 15.400006 20.600000 1.000000\nv 13.400006 20.600000 1.000000\nv 13.400006 20.600000 -1.000000\nv 15.400007 22.600000 -0.999999\nv 15.400005 22.600000 1.000001\nv 13.400006 22.600000 1.000000\nv 13.400006 22.600000 -1.000000\nv 19.000008 20.600000 -1.000000\nv 19.000008 20.600000 1.000000\nv 17.000008 20.600000 1.000000\nv 17.000008 20.600000 -1.000000\nv 19.000008 22.600000 -0.999999\nv 19.000008 22.600000 1.000001\nv 17.000008 22.600000 1.000000\nv 17.000008 22.600000 -1.000000\nv 22.600010 20.600000 -1.000000\nv 22.600010 20.600000 1.000000\nv 20.600010 20.600000 1.000000\nv 20.600010 20.600000 -1.000000\nv 22.600010 22.600000 -0.999999\nv 22.600010 22.600000 1.000001\nv 20.600010 22.600000 1.000000\nv 20.600010 22.600000 -1.000000\nv 26.200012 20.600000 -1.000000\nv 26.200012 20.600000 1.000000\nv 24.200012 20.600000 1.000000\nv 24.200012 20.600000 -1.000000\nv 26.200012 22.600000 -0.999999\nv 26.200012 22.600000 1.000001\nv 24.200012 22.600000 1.000000\nv 24.200012 22.600000 -1.000000\nv 29.800014 20.600000 -1.000000\nv 29.800014 20.600000 1.000000\nv 27.800014 20.600000 1.000000\nv 27.800014 20.600000 -1.000000\nv 29.800014 22.600000 -0.999999\nv 29.800014 22.600000 1.000001\nv 27.800014 22.600000 1.000000\nv 27.800014 22.600000 -1.000000\nv 33.400017 20.600000 -1.000000\nv 33.400017 20.600000 1.000000\nv 31.400017 20.600000 1.000000\nv 31.400017 20.600000 -1.000000\nv 33.400017 22.600000 -0.999999\nv 33.400017 22.600000 1.000001\nv 31.400017 22.600000 1.000000\nv 31.400017 22.600000 -1.000000\nv 1.000000 20.600000 -4.600001\nv 1.000000 20.600000 -2.600002\nv -1.000000 20.600000 -2.600002\nv -1.000000 20.600000 -4.600002\nv 1.000000 22.600000 -4.600001\nv 0.999999 22.600000 -2.600001\nv -1.000000 22.600000 -2.600002\nv -1.000000 22.600000 -4.600001\nv 4.600001 20.600000 -4.600001\nv 4.600001 20.600000 -2.600002\nv 2.600001 20.600000 -2.600002\nv 2.600002 20.600000 -4.600002\nv 4.600002 22.600000 -4.600001\nv 4.600001 22.600000 -2.600001\nv 2.600001 22.600000 -2.600002\nv 2.600002 22.600000 -4.600001\nv 8.200003 20.600000 -4.600001\nv 8.200003 20.600000 -2.600002\nv 6.200003 20.600000 -2.600002\nv 6.200004 20.600000 -4.600002\nv 8.200004 22.600000 -4.600001\nv 8.200003 22.600000 -2.600001\nv 6.200003 22.600000 -2.600002\nv 6.200003 22.600000 -4.600001\nv 11.800005 20.600000 -4.600001\nv 11.800005 20.600000 -2.600002\nv 9.800005 20.600000 -2.600002\nv 9.800005 20.600000 -4.600002\nv 11.800005 22.600000 -4.600001\nv 11.800004 22.600000 -2.600001\nv 9.800005 22.600000 -2.600002\nv 9.800005 22.600000 -4.600001\nv 15.400006 20.600000 -4.600001\nv 15.400006 20.600000 -2.600002\nv 13.400006 20.600000 -2.600002\nv 13.400006 20.600000 -4.600002\nv 15.400007 22.600000 -4.600001\nv 15.400005 22.600000 -2.600001\nv 13.400006 22.600000 -2.600002\nv 13.400006 22.600000 -4.600001\nv 19.000008 20.600000 -4.600001\nv 19.000008 20.600000 -2.600002\nv 17.000008 20.600000 -2.600002\nv 17.000008 20.600000 -4.600002\nv 19.000008 22.600000 -4.600001\nv 19.000008 22.600000 -2.600001\nv 17.000008 22.600000 -2.600002\nv 17.000008 22.600000 -4.600001\nv 22.600010 20.600000 -4.600001\nv 22.600010 20.600000 -2.600002\nv 20.600010 20.600000 -2.600002\nv 20.600010 20.600000 -4.600002\nv 22.600010 22.600000 -4.600001\nv 22.600010 22.600000 -2.600001\nv 20.600010 22.600000 -2.600002\nv 20.600010 22.600000 -4.600001\nv 26.200012 20.600000 -4.600001\nv 26.200012 20.600000 -2.600002\nv 24.200012 20.600000 -2.600002\nv 24.200012 20.600000 -4.600002\nv 26.200012 22.600000 -4.600001\nv 26.200012 22.600000 -2.600001\nv 24.200012 22.600000 -2.600002\nv 24.200012 22.600000 -4.600001\nv 29.800014 20.600000 -4.600001\nv 29.800014 20.600000 -2.600002\nv 27.800014 20.600000 -2.600002\nv 27.800014 20.600000 -4.600002\nv 29.800014 22.600000 -4.600001\nv 29.800014 22.600000 -2.600001\nv 27.800014 22.600000 -2.600002\nv 27.800014 22.600000 -4.600001\nv 33.400017 20.600000 -4.600001\nv 33.400017 20.600000 -2.600002\nv 31.400017 20.600000 -2.600002\nv 31.400017 20.600000 -4.600002\nv 33.400017 22.600000 -4.600001\nv 33.400017 22.600000 -2.600001\nv 31.400017 22.600000 -2.600002\nv 31.400017 22.600000 -4.600001\nv 1.000000 20.600000 -8.200003\nv 1.000000 20.600000 -6.200003\nv -1.000000 20.600000 -6.200003\nv -1.000000 20.600000 -8.200004\nv 1.000000 22.600000 -8.200003\nv 0.999999 22.600000 -6.200003\nv -1.000000 22.600000 -6.200004\nv -1.000000 22.600000 -8.200003\nv 4.600001 20.600000 -8.200003\nv 4.600001 20.600000 -6.200003\nv 2.600001 20.600000 -6.200003\nv 2.600002 20.600000 -8.200004\nv 4.600002 22.600000 -8.200003\nv 4.600001 22.600000 -6.200003\nv 2.600001 22.600000 -6.200004\nv 2.600002 22.600000 -8.200003\nv 8.200003 20.600000 -8.200003\nv 8.200003 20.600000 -6.200003\nv 6.200003 20.600000 -6.200003\nv 6.200004 20.600000 -8.200004\nv 8.200004 22.600000 -8.200003\nv 8.200003 22.600000 -6.200003\nv 6.200003 22.600000 -6.200004\nv 6.200003 22.600000 -8.200003\nv 11.800005 20.600000 -8.200003\nv 11.800005 20.600000 -6.200003\nv 9.800005 20.600000 -6.200003\nv 9.800005 20.600000 -8.200004\nv 11.800005 22.600000 -8.200003\nv 11.800004 22.600000 -6.200003\nv 9.800005 22.600000 -6.200004\nv 9.800005 22.600000 -8.200003\nv 15.400006 20.600000 -8.200003\nv 15.400006 20.600000 -6.200003\nv 13.400006 20.600000 -6.200003\nv 13.400006 20.600000 -8.200004\nv 15.400007 22.600000 -8.200003\nv 15.400005 22.600000 -6.200003\nv 13.400006 22.600000 -6.200004\nv 13.400006 22.600000 -8.200003\nv 19.000008 20.600000 -8.200003\nv 19.000008 20.600000 -6.200003\nv 17.000008 20.600000 -6.200003\nv 17.000008 20.600000 -8.200004\nv 19.000008 22.600000 -8.200003\nv 19.000008 22.600000 -6.200003\nv 17.000008 22.600000 -6.200004\nv 17.000008 22.600000 -8.200003\nv 22.600010 20.600000 -8.200003\nv 22.600010 20.600000 -6.200003\nv 20.600010 20.600000 -6.200003\nv 20.600010 20.600000 -8.200004\nv 22.600010 22.600000 -8.200003\nv 22.600010 22.600000 -6.200003\nv 20.600010 22.600000 -6.200004\nv 20.600010 22.600000 -8.200003\nv 26.200012 20.600000 -8.200003\nv 26.200012 20.600000 -6.200003\nv 24.200012 20.600000 -6.200003\nv 24.200012 20.600000 -8.200004\nv 26.200012 22.600000 -8.200003\nv 26.200012 22.600000 -6.200003\nv 24.200012 22.600000 -6.200004\nv 24.200012 22.600000 -8.200003\nv 29.800014 20.600000 -8.200003\nv 29.800014 20.600000 -6.200003\nv 27.800014 20.600000 -6.200003\nv 27.800014 20.600000 -8.200004\nv 29.800014 22.600000 -8.200003\nv 29.800014 22.600000 -6.200003\nv 27.800014 22.600000 -6.200004\nv 27.800014 22.600000 -8.200003\nv 33.400017 20.600000 -8.200003\nv 33.400017 20.600000 -6.200003\nv 31.400017 20.600000 -6.200003\nv 31.400017 20.600000 -8.200004\nv 33.400017 22.600000 -8.200003\nv 33.400017 22.600000 -6.200003\nv 31.400017 22.600000 -6.200004\nv 31.400017 22.600000 -8.200003\nv 1.000000 20.600000 -11.800005\nv 1.000000 20.600000 -9.800005\nv -1.000000 20.600000 -9.800005\nv -1.000000 20.600000 -11.800005\nv 1.000000 22.600000 -11.800004\nv 0.999999 22.600000 -9.800004\nv -1.000000 22.600000 -9.800005\nv -1.000000 22.600000 -11.800005\nv 4.600001 20.600000 -11.800005\nv 4.600001 20.600000 -9.800005\nv 2.600001 20.600000 -9.800005\nv 2.600002 20.600000 -11.800005\nv 4.600002 22.600000 -11.800004\nv 4.600001 22.600000 -9.800004\nv 2.600001 22.600000 -9.800005\nv 2.600002 22.600000 -11.800005\nv 8.200003 20.600000 -11.800005\nv 8.200003 20.600000 -9.800005\nv 6.200003 20.600000 -9.800005\nv 6.200004 20.600000 -11.800005\nv 8.200004 22.600000 -11.800004\nv 8.200003 22.600000 -9.800004\nv 6.200003 22.600000 -9.800005\nv 6.200003 22.600000 -11.800005\nv 11.800005 20.600000 -11.800005\nv 11.800005 20.600000 -9.800005\nv 9.800005 20.600000 -9.800005\nv 9.800005 20.600000 -11.800005\nv 11.800005 22.600000 -11.800004\nv 11.800004 22.600000 -9.800004\nv 9.800005 22.600000 -9.800005\nv 9.800005 22.600000 -11.800005\nv 15.400006 20.600000 -11.800005\nv 15.400006 20.600000 -9.800005\nv 13.400006 20.600000 -9.800005\nv 13.400006 20.600000 -11.800005\nv 15.400007 22.600000 -11.800004\nv 15.400005 22.600000 -9.800004\nv 13.400006 22.600000 -9.800005\nv 13.400006 22.600000 -11.800005\nv 19.000008 20.600000 -11.800005\nv 19.000008 20.600000 -9.800005\nv 17.000008 20.600000 -9.800005\nv 17.000008 20.600000 -11.800005\nv 19.000008 22.600000 -11.800004\nv 19.000008 22.600000 -9.800004\nv 17.000008 22.600000 -9.800005\nv 17.000008 22.600000 -11.800005\nv 22.600010 20.600000 -11.800005\nv 22.600010 20.600000 -9.800005\nv 20.600010 20.600000 -9.800005\nv 20.600010 20.600000 -11.800005\nv 22.600010 22.600000 -11.800004\nv 22.600010 22.600000 -9.800004\nv 20.600010 22.600000 -9.800005\nv 20.600010 22.600000 -11.800005\nv 26.200012 20.600000 -11.800005\nv 26.200012 20.600000 -9.800005\nv 24.200012 20.600000 -9.800005\nv 24.200012 20.600000 -11.800005\nv 26.200012 22.600000 -11.800004\nv 26.200012 22.600000 -9.800004\nv 24.200012 22.600000 -9.800005\nv 24.200012 22.600000 -11.800005\nv 29.800014 20.600000 -11.800005\nv 29.800014 20.600000 -9.800005\nv 27.800014 20.600000 -9.800005\nv 27.800014 20.600000 -11.800005\nv 29.800014 22.600000 -11.800004\nv 29.800014 22.600000 -9.800004\nv 27.800014 22.600000 -9.800005\nv 27.800014 22.600000 -11.800005\nv 33.400017 20.600000 -11.800005\nv 33.400017 20.600000 -9.800005\nv 31.400017 20.600000 -9.800005\nv 31.400017 20.600000 -11.800005\nv 33.400017 22.600000 -11.800004\nv 33.400017 22.600000 -9.800004\nv 31.400017 22.600000 -9.800005\nv 31.400017 22.600000 -11.800005\nv 1.000000 20.600000 -15.400006\nv 1.000000 20.600000 -13.400006\nv -1.000000 20.600000 -13.400006\nv -1.000000 20.600000 -15.400006\nv 1.000000 22.600000 -15.400005\nv 0.999999 22.600000 -13.400005\nv -1.000000 22.600000 -13.400006\nv -1.000000 22.600000 -15.400006\nv 4.600001 20.600000 -15.400006\nv 4.600001 20.600000 -13.400006\nv 2.600001 20.600000 -13.400006\nv 2.600002 20.600000 -15.400006\nv 4.600002 22.600000 -15.400005\nv 4.600001 22.600000 -13.400005\nv 2.600001 22.600000 -13.400006\nv 2.600002 22.600000 -15.400006\nv 8.200003 20.600000 -15.400006\nv 8.200003 20.600000 -13.400006\nv 6.200003 20.600000 -13.400006\nv 6.200004 20.600000 -15.400006\nv 8.200004 22.600000 -15.400005\nv 8.200003 22.600000 -13.400005\nv 6.200003 22.600000 -13.400006\nv 6.200003 22.600000 -15.400006\nv 11.800005 20.600000 -15.400006\nv 11.800005 20.600000 -13.400006\nv 9.800005 20.600000 -13.400006\nv 9.800005 20.600000 -15.400006\nv 11.800005 22.600000 -15.400005\nv 11.800004 22.600000 -13.400005\nv 9.800005 22.600000 -13.400006\nv 9.800005 22.600000 -15.400006\nv 15.400006 20.600000 -15.400006\nv 15.400006 20.600000 -13.400006\nv 13.400006 20.600000 -13.400006\nv 13.400006 20.600000 -15.400006\nv 15.400007 22.600000 -15.400005\nv 15.400005 22.600000 -13.400005\nv 13.400006 22.600000 -13.400006\nv 13.400006 22.600000 -15.400006\nv 19.000008 20.600000 -15.400006\nv 19.000008 20.600000 -13.400006\nv 17.000008 20.600000 -13.400006\nv 17.000008 20.600000 -15.400006\nv 19.000008 22.600000 -15.400005\nv 19.000008 22.600000 -13.400005\nv 17.000008 22.600000 -13.400006\nv 17.000008 22.600000 -15.400006\nv 22.600010 20.600000 -15.400006\nv 22.600010 20.600000 -13.400006\nv 20.600010 20.600000 -13.400006\nv 20.600010 20.600000 -15.400006\nv 22.600010 22.600000 -15.400005\nv 22.600010 22.600000 -13.400005\nv 20.600010 22.600000 -13.400006\nv 20.600010 22.600000 -15.400006\nv 26.200012 20.600000 -15.400006\nv 26.200012 20.600000 -13.400006\nv 24.200012 20.600000 -13.400006\nv 24.200012 20.600000 -15.400006\nv 26.200012 22.600000 -15.400005\nv 26.200012 22.600000 -13.400005\nv 24.200012 22.600000 -13.400006\nv 24.200012 22.600000 -15.400006\nv 29.800014 20.600000 -15.400006\nv 29.800014 20.600000 -13.400006\nv 27.800014 20.600000 -13.400006\nv 27.800014 20.600000 -15.400006\nv 29.800014 22.600000 -15.400005\nv 29.800014 22.600000 -13.400005\nv 27.800014 22.600000 -13.400006\nv 27.800014 22.600000 -15.400006\nv 33.400017 20.600000 -15.400006\nv 33.400017 20.600000 -13.400006\nv 31.400017 20.600000 -13.400006\nv 31.400017 20.600000 -15.400006\nv 33.400017 22.600000 -15.400005\nv 33.400017 22.600000 -13.400005\nv 31.400017 22.600000 -13.400006\nv 31.400017 22.600000 -15.400006\nv 1.000000 20.600000 -19.000008\nv 1.000000 20.600000 -17.000008\nv -1.000000 20.600000 -17.000008\nv -1.000000 20.600000 -19.000008\nv 1.000000 22.600000 -19.000008\nv 0.999999 22.600000 -17.000008\nv -1.000000 22.600000 -17.000008\nv -1.000000 22.600000 -19.000008\nv 4.600001 20.600000 -19.000008\nv 4.600001 20.600000 -17.000008\nv 2.600001 20.600000 -17.000008\nv 2.600002 20.600000 -19.000008\nv 4.600002 22.600000 -19.000008\nv 4.600001 22.600000 -17.000008\nv 2.600001 22.600000 -17.000008\nv 2.600002 22.600000 -19.000008\nv 8.200003 20.600000 -19.000008\nv 8.200003 20.600000 -17.000008\nv 6.200003 20.600000 -17.000008\nv 6.200004 20.600000 -19.000008\nv 8.200004 22.600000 -19.000008\nv 8.200003 22.600000 -17.000008\nv 6.200003 22.600000 -17.000008\nv 6.200003 22.600000 -19.000008\nv 11.800005 20.600000 -19.000008\nv 11.800005 20.600000 -17.000008\nv 9.800005 20.600000 -17.000008\nv 9.800005 20.600000 -19.000008\nv 11.800005 22.600000 -19.000008\nv 11.800004 22.600000 -17.000008\nv 9.800005 22.600000 -17.000008\nv 9.800005 22.600000 -19.000008\nv 15.400006 20.600000 -19.000008\nv 15.400006 20.600000 -17.000008\nv 13.400006 20.600000 -17.000008\nv 13.400006 20.600000 -19.000008\nv 15.400007 22.600000 -19.000008\nv 15.400005 22.600000 -17.000008\nv 13.400006 22.600000 -17.000008\nv 13.400006 22.600000 -19.000008\nv 19.000008 20.600000 -19.000008\nv 19.000008 20.600000 -17.000008\nv 17.000008 20.600000 -17.000008\nv 17.000008 20.600000 -19.000008\nv 19.000008 22.600000 -19.000008\nv 19.000008 22.600000 -17.000008\nv 17.000008 22.600000 -17.000008\nv 17.000008 22.600000 -19.000008\nv 22.600010 20.600000 -19.000008\nv 22.600010 20.600000 -17.000008\nv 20.600010 20.600000 -17.000008\nv 20.600010 20.600000 -19.000008\nv 22.600010 22.600000 -19.000008\nv 22.600010 22.600000 -17.000008\nv 20.600010 22.600000 -17.000008\nv 20.600010 22.600000 -19.000008\nv 26.200012 20.600000 -19.000008\nv 26.200012 20.600000 -17.000008\nv 24.200012 20.600000 -17.000008\nv 24.200012 20.600000 -19.000008\nv 26.200012 22.600000 -19.000008\nv 26.200012 22.600000 -17.000008\nv 24.200012 22.600000 -17.000008\nv 24.200012 22.600000 -19.000008\nv 29.800014 20.600000 -19.000008\nv 29.800014 20.600000 -17.000008\nv 27.800014 20.600000 -17.000008\nv 27.800014 20.600000 -19.000008\nv 29.800014 22.600000 -19.000008\nv 29.800014 22.600000 -17.000008\nv 27.800014 22.600000 -17.000008\nv 27.800014 22.600000 -19.000008\nv 33.400017 20.600000 -19.000008\nv 33.400017 20.600000 -17.000008\nv 31.400017 20.600000 -17.000008\nv 31.400017 20.600000 -19.000008\nv 33.400017 22.600000 -19.000008\nv 33.400017 22.600000 -17.000008\nv 31.400017 22.600000 -17.000008\nv 31.400017 22.600000 -19.000008\nv 1.000000 20.600000 -22.600010\nv 1.000000 20.600000 -20.600010\nv -1.000000 20.600000 -20.600010\nv -1.000000 20.600000 -22.600010\nv 1.000000 22.600000 -22.600010\nv 0.999999 22.600000 -20.600010\nv -1.000000 22.600000 -20.600010\nv -1.000000 22.600000 -22.600010\nv 4.600001 20.600000 -22.600010\nv 4.600001 20.600000 -20.600010\nv 2.600001 20.600000 -20.600010\nv 2.600002 20.600000 -22.600010\nv 4.600002 22.600000 -22.600010\nv 4.600001 22.600000 -20.600010\nv 2.600001 22.600000 -20.600010\nv 2.600002 22.600000 -22.600010\nv 8.200003 20.600000 -22.600010\nv 8.200003 20.600000 -20.600010\nv 6.200003 20.600000 -20.600010\nv 6.200004 20.600000 -22.600010\nv 8.200004 22.600000 -22.600010\nv 8.200003 22.600000 -20.600010\nv 6.200003 22.600000 -20.600010\nv 6.200003 22.600000 -22.600010\nv 11.800005 20.600000 -22.600010\nv 11.800005 20.600000 -20.600010\nv 9.800005 20.600000 -20.600010\nv 9.800005 20.600000 -22.600010\nv 11.800005 22.600000 -22.600010\nv 11.800004 22.600000 -20.600010\nv 9.800005 22.600000 -20.600010\nv 9.800005 22.600000 -22.600010\nv 15.400006 20.600000 -22.600010\nv 15.400006 20.600000 -20.600010\nv 13.400006 20.600000 -20.600010\nv 13.400006 20.600000 -22.600010\nv 15.400007 22.600000 -22.600010\nv 15.400005 22.600000 -20.600010\nv 13.400006 22.600000 -20.600010\nv 13.400006 22.600000 -22.600010\nv 19.000008 20.600000 -22.600010\nv 19.000008 20.600000 -20.600010\nv 17.000008 20.600000 -20.600010\nv 17.000008 20.600000 -22.600010\nv 19.000008 22.600000 -22.600010\nv 19.000008 22.600000 -20.600010\nv 17.000008 22.600000 -20.600010\nv 17.000008 22.600000 -22.600010\nv 22.600010 20.600000 -22.600010\nv 22.600010 20.600000 -20.600010\nv 20.600010 20.600000 -20.600010\nv 20.600010 20.600000 -22.600010\nv 22.600010 22.600000 -22.600010\nv 22.600010 22.600000 -20.600010\nv 20.600010 22.600000 -20.600010\nv 20.600010 22.600000 -22.600010\nv 26.200012 20.600000 -22.600010\nv 26.200012 20.600000 -20.600010\nv 24.200012 20.600000 -20.600010\nv 24.200012 20.600000 -22.600010\nv 26.200012 22.600000 -22.600010\nv 26.200012 22.600000 -20.600010\nv 24.200012 22.600000 -20.600010\nv 24.200012 22.600000 -22.600010\nv 29.800014 20.600000 -22.600010\nv 29.800014 20.600000 -20.600010\nv 27.800014 20.600000 -20.600010\nv 27.800014 20.600000 -22.600010\nv 29.800014 22.600000 -22.600010\nv 29.800014 22.600000 -20.600010\nv 27.800014 22.600000 -20.600010\nv 27.800014 22.600000 -22.600010\nv 33.400017 20.600000 -22.600010\nv 33.400017 20.600000 -20.600010\nv 31.400017 20.600000 -20.600010\nv 31.400017 20.600000 -22.600010\nv 33.400017 22.600000 -22.600010\nv 33.400017 22.600000 -20.600010\nv 31.400017 22.600000 -20.600010\nv 31.400017 22.600000 -22.600010\nv 1.000000 20.600000 -26.200012\nv 1.000000 20.600000 -24.200012\nv -1.000000 20.600000 -24.200012\nv -1.000000 20.600000 -26.200012\nv 1.000000 22.600000 -26.200012\nv 0.999999 22.600000 -24.200012\nv -1.000000 22.600000 -24.200012\nv -1.000000 22.600000 -26.200012\nv 4.600001 20.600000 -26.200012\nv 4.600001 20.600000 -24.200012\nv 2.600001 20.600000 -24.200012\nv 2.600002 20.600000 -26.200012\nv 4.600002 22.600000 -26.200012\nv 4.600001 22.600000 -24.200012\nv 2.600001 22.600000 -24.200012\nv 2.600002 22.600000 -26.200012\nv 8.200003 20.600000 -26.200012\nv 8.200003 20.600000 -24.200012\nv 6.200003 20.600000 -24.200012\nv 6.200004 20.600000 -26.200012\nv 8.200004 22.600000 -26.200012\nv 8.200003 22.600000 -24.200012\nv 6.200003 22.600000 -24.200012\nv 6.200003 22.600000 -26.200012\nv 11.800005 20.600000 -26.200012\nv 11.800005 20.600000 -24.200012\nv 9.800005 20.600000 -24.200012\nv 9.800005 20.600000 -26.200012\nv 11.800005 22.600000 -26.200012\nv 11.800004 22.600000 -24.200012\nv 9.800005 22.600000 -24.200012\nv 9.800005 22.600000 -26.200012\nv 15.400006 20.600000 -26.200012\nv 15.400006 20.600000 -24.200012\nv 13.400006 20.600000 -24.200012\nv 13.400006 20.600000 -26.200012\nv 15.400007 22.600000 -26.200012\nv 15.400005 22.600000 -24.200012\nv 13.400006 22.600000 -24.200012\nv 13.400006 22.600000 -26.200012\nv 19.000008 20.600000 -26.200012\nv 19.000008 20.600000 -24.200012\nv 17.000008 20.600000 -24.200012\nv 17.000008 20.600000 -26.200012\nv 19.000008 22.600000 -26.200012\nv 19.000008 22.600000 -24.200012\nv 17.000008 22.600000 -24.200012\nv 17.000008 22.600000 -26.200012\nv 22.600010 20.600000 -26.200012\nv 22.600010 20.600000 -24.200012\nv 20.600010 20.600000 -24.200012\nv 20.600010 20.600000 -26.200012\nv 22.600010 22.600000 -26.200012\nv 22.600010 22.600000 -24.200012\nv 20.600010 22.600000 -24.200012\nv 20.600010 22.600000 -26.200012\nv 26.200012 20.600000 -26.200012\nv 26.200012 20.600000 -24.200012\nv 24.200012 20.600000 -24.200012\nv 24.200012 20.600000 -26.200012\nv 26.200012 22.600000 -26.200012\nv 26.200012 22.600000 -24.200012\nv 24.200012 22.600000 -24.200012\nv 24.200012 22.600000 -26.200012\nv 29.800014 20.600000 -26.200012\nv 29.800014 20.600000 -24.200012\nv 27.800014 20.600000 -24.200012\nv 27.800014 20.600000 -26.200012\nv 29.800014 22.600000 -26.200012\nv 29.800014 22.600000 -24.200012\nv 27.800014 22.600000 -24.200012\nv 27.800014 22.600000 -26.200012\nv 33.400017 20.600000 -26.200012\nv 33.400017 20.600000 -24.200012\nv 31.400017 20.600000 -24.200012\nv 31.400017 20.600000 -26.200012\nv 33.400017 22.600000 -26.200012\nv 33.400017 22.600000 -24.200012\nv 31.400017 22.600000 -24.200012\nv 31.400017 22.600000 -26.200012\nv 1.000000 20.600000 -29.800014\nv 1.000000 20.600000 -27.800014\nv -1.000000 20.600000 -27.800014\nv -1.000000 20.600000 -29.800014\nv 1.000000 22.600000 -29.800014\nv 0.999999 22.600000 -27.800014\nv -1.000000 22.600000 -27.800014\nv -1.000000 22.600000 -29.800014\nv 4.600001 20.600000 -29.800014\nv 4.600001 20.600000 -27.800014\nv 2.600001 20.600000 -27.800014\nv 2.600002 20.600000 -29.800014\nv 4.600002 22.600000 -29.800014\nv 4.600001 22.600000 -27.800014\nv 2.600001 22.600000 -27.800014\nv 2.600002 22.600000 -29.800014\nv 8.200003 20.600000 -29.800014\nv 8.200003 20.600000 -27.800014\nv 6.200003 20.600000 -27.800014\nv 6.200004 20.600000 -29.800014\nv 8.200004 22.600000 -29.800014\nv 8.200003 22.600000 -27.800014\nv 6.200003 22.600000 -27.800014\nv 6.200003 22.600000 -29.800014\nv 11.800005 20.600000 -29.800014\nv 11.800005 20.600000 -27.800014\nv 9.800005 20.600000 -27.800014\nv 9.800005 20.600000 -29.800014\nv 11.800005 22.600000 -29.800014\nv 11.800004 22.600000 -27.800014\nv 9.800005 22.600000 -27.800014\nv 9.800005 22.600000 -29.800014\nv 15.400006 20.600000 -29.800014\nv 15.400006 20.600000 -27.800014\nv 13.400006 20.600000 -27.800014\nv 13.400006 20.600000 -29.800014\nv 15.400007 22.600000 -29.800014\nv 15.400005 22.600000 -27.800014\nv 13.400006 22.600000 -27.800014\nv 13.400006 22.600000 -29.800014\nv 19.000008 20.600000 -29.800014\nv 19.000008 20.600000 -27.800014\nv 17.000008 20.600000 -27.800014\nv 17.000008 20.600000 -29.800014\nv 19.000008 22.600000 -29.800014\nv 19.000008 22.600000 -27.800014\nv 17.000008 22.600000 -27.800014\nv 17.000008 22.600000 -29.800014\nv 22.600010 20.600000 -29.800014\nv 22.600010 20.600000 -27.800014\nv 20.600010 20.600000 -27.800014\nv 20.600010 20.600000 -29.800014\nv 22.600010 22.600000 -29.800014\nv 22.600010 22.600000 -27.800014\nv 20.600010 22.600000 -27.800014\nv 20.600010 22.600000 -29.800014\nv 26.200012 20.600000 -29.800014\nv 26.200012 20.600000 -27.800014\nv 24.200012 20.600000 -27.800014\nv 24.200012 20.600000 -29.800014\nv 26.200012 22.600000 -29.800014\nv 26.200012 22.600000 -27.800014\nv 24.200012 22.600000 -27.800014\nv 24.200012 22.600000 -29.800014\nv 29.800014 20.600000 -29.800014\nv 29.800014 20.600000 -27.800014\nv 27.800014 20.600000 -27.800014\nv 27.800014 20.600000 -29.800014\nv 29.800014 22.600000 -29.800014\nv 29.800014 22.600000 -27.800014\nv 27.800014 22.600000 -27.800014\nv 27.800014 22.600000 -29.800014\nv 33.400017 20.600000 -29.800014\nv 33.400017 20.600000 -27.800014\nv 31.400017 20.600000 -27.800014\nv 31.400017 20.600000 -29.800014\nv 33.400017 22.600000 -29.800014\nv 33.400017 22.600000 -27.800014\nv 31.400017 22.600000 -27.800014\nv 31.400017 22.600000 -29.800014\nv 1.000000 20.600000 -33.400017\nv 1.000000 20.600000 -31.400017\nv -1.000000 20.600000 -31.400017\nv -1.000000 20.600000 -33.400017\nv 1.000000 22.600000 -33.400017\nv 0.999999 22.600000 -31.400017\nv -1.000000 22.600000 -31.400017\nv -1.000000 22.600000 -33.400017\nv 4.600001 20.600000 -33.400017\nv 4.600001 20.600000 -31.400017\nv 2.600001 20.600000 -31.400017\nv 2.600002 20.600000 -33.400017\nv 4.600002 22.600000 -33.400017\nv 4.600001 22.600000 -31.400017\nv 2.600001 22.600000 -31.400017\nv 2.600002 22.600000 -33.400017\nv 8.200003 20.600000 -33.400017\nv 8.200003 20.600000 -31.400017\nv 6.200003 20.600000 -31.400017\nv 6.200004 20.600000 -33.400017\nv 8.200004 22.600000 -33.400017\nv 8.200003 22.600000 -31.400017\nv 6.200003 22.600000 -31.400017\nv 6.200003 22.600000 -33.400017\nv 11.800005 20.600000 -33.400017\nv 11.800005 20.600000 -31.400017\nv 9.800005 20.600000 -31.400017\nv 9.800005 20.600000 -33.400017\nv 11.800005 22.600000 -33.400017\nv 11.800004 22.600000 -31.400017\nv 9.800005 22.600000 -31.400017\nv 9.800005 22.600000 -33.400017\nv 15.400006 20.600000 -33.400017\nv 15.400006 20.600000 -31.400017\nv 13.400006 20.600000 -31.400017\nv 13.400006 20.600000 -33.400017\nv 15.400007 22.600000 -33.400017\nv 15.400005 22.600000 -31.400017\nv 13.400006 22.600000 -31.400017\nv 13.400006 22.600000 -33.400017\nv 19.000008 20.600000 -33.400017\nv 19.000008 20.600000 -31.400017\nv 17.000008 20.600000 -31.400017\nv 17.000008 20.600000 -33.400017\nv 19.000008 22.600000 -33.400017\nv 19.000008 22.600000 -31.400017\nv 17.000008 22.600000 -31.400017\nv 17.000008 22.600000 -33.400017\nv 22.600010 20.600000 -33.400017\nv 22.600010 20.600000 -31.400017\nv 20.600010 20.600000 -31.400017\nv 20.600010 20.600000 -33.400017\nv 22.600010 22.600000 -33.400017\nv 22.600010 22.600000 -31.400017\nv 20.600010 22.600000 -31.400017\nv 20.600010 22.600000 -33.400017\nv 26.200012 20.600000 -33.400017\nv 26.200012 20.600000 -31.400017\nv 24.200012 20.600000 -31.400017\nv 24.200012 20.600000 -33.400017\nv 26.200012 22.600000 -33.400017\nv 26.200012 22.600000 -31.400017\nv 24.200012 22.600000 -31.400017\nv 24.200012 22.600000 -33.400017\nv 29.800014 20.600000 -33.400017\nv 29.800014 20.600000 -31.400017\nv 27.800014 20.600000 -31.400017\nv 27.800014 20.600000 -33.400017\nv 29.800014 22.600000 -33.400017\nv 29.800014 22.600000 -31.400017\nv 27.800014 22.600000 -31.400017\nv 27.800014 22.600000 -33.400017\nv 33.400017 20.600000 -33.400017\nv 33.400017 20.600000 -31.400017\nv 31.400017 20.600000 -31.400017\nv 31.400017 20.600000 -33.400017\nv 33.400017 22.600000 -33.400017\nv 33.400017 22.600000 -31.400017\nv 31.400017 22.600000 -31.400017\nv 31.400017 22.600000 -33.400017\nv -1.000000 20.600000 -1.000000\nv -1.000000 20.600000 1.000000\nv 1.000000 20.600000 1.000000\nv 1.000000 20.600000 -1.000000\nv -1.000000 22.600000 -0.999999\nv -0.999999 22.600000 1.000001\nv 1.000000 22.600000 1.000000\nv 1.000000 22.600000 -1.000000\nv -4.600001 20.600000 -1.000000\nv -4.600001 20.600000 1.000000\nv -2.600001 20.600000 1.000000\nv -2.600002 20.600000 -1.000000\nv -4.600002 22.600000 -0.999999\nv -4.600001 22.600000 1.000001\nv -2.600001 22.600000 1.000000\nv -2.600002 22.600000 -1.000000\nv -8.200003 20.600000 -1.000000\nv -8.200003 20.600000 1.000000\nv -6.200003 20.600000 1.000000\nv -6.200004 20.600000 -1.000000\nv -8.200004 22.600000 -0.999999\nv -8.200003 22.600000 1.000001\nv -6.200003 22.600000 1.000000\nv -6.200003 22.600000 -1.000000\nv -11.800005 20.600000 -1.000000\nv -11.800005 20.600000 1.000000\nv -9.800005 20.600000 1.000000\nv -9.800005 20.600000 -1.000000\nv -11.800005 22.600000 -0.999999\nv -11.800004 22.600000 1.000001\nv -9.800005 22.600000 1.000000\nv -9.800005 22.600000 -1.000000\nv -15.400006 20.600000 -1.000000\nv -15.400006 20.600000 1.000000\nv -13.400006 20.600000 1.000000\nv -13.400006 20.600000 -1.000000\nv -15.400007 22.600000 -0.999999\nv -15.400005 22.600000 1.000001\nv -13.400006 22.600000 1.000000\nv -13.400006 22.600000 -1.000000\nv -19.000008 20.600000 -1.000000\nv -19.000008 20.600000 1.000000\nv -17.000008 20.600000 1.000000\nv -17.000008 20.600000 -1.000000\nv -19.000008 22.600000 -0.999999\nv -19.000008 22.600000 1.000001\nv -17.000008 22.600000 1.000000\nv -17.000008 22.600000 -1.000000\nv -22.600010 20.600000 -1.000000\nv -22.600010 20.600000 1.000000\nv -20.600010 20.600000 1.000000\nv -20.600010 20.600000 -1.000000\nv -22.600010 22.600000 -0.999999\nv -22.600010 22.600000 1.000001\nv -20.600010 22.600000 1.000000\nv -20.600010 22.600000 -1.000000\nv -26.200012 20.600000 -1.000000\nv -26.200012 20.600000 1.000000\nv -24.200012 20.600000 1.000000\nv -24.200012 20.600000 -1.000000\nv -26.200012 22.600000 -0.999999\nv -26.200012 22.600000 1.000001\nv -24.200012 22.600000 1.000000\nv -24.200012 22.600000 -1.000000\nv -29.800014 20.600000 -1.000000\nv -29.800014 20.600000 1.000000\nv -27.800014 20.600000 1.000000\nv -27.800014 20.600000 -1.000000\nv -29.800014 22.600000 -0.999999\nv -29.800014 22.600000 1.000001\nv -27.800014 22.600000 1.000000\nv -27.800014 22.600000 -1.000000\nv -33.400017 20.600000 -1.000000\nv -33.400017 20.600000 1.000000\nv -31.400017 20.600000 1.000000\nv -31.400017 20.600000 -1.000000\nv -33.400017 22.600000 -0.999999\nv -33.400017 22.600000 1.000001\nv -31.400017 22.600000 1.000000\nv -31.400017 22.600000 -1.000000\nv -1.000000 20.600000 -4.600001\nv -1.000000 20.600000 -2.600002\nv 1.000000 20.600000 -2.600002\nv 1.000000 20.600000 -4.600002\nv -1.000000 22.600000 -4.600001\nv -0.999999 22.600000 -2.600001\nv 1.000000 22.600000 -2.600002\nv 1.000000 22.600000 -4.600001\nv -4.600001 20.600000 -4.600001\nv -4.600001 20.600000 -2.600002\nv -2.600001 20.600000 -2.600002\nv -2.600002 20.600000 -4.600002\nv -4.600002 22.600000 -4.600001\nv -4.600001 22.600000 -2.600001\nv -2.600001 22.600000 -2.600002\nv -2.600002 22.600000 -4.600001\nv -8.200003 20.600000 -4.600001\nv -8.200003 20.600000 -2.600002\nv -6.200003 20.600000 -2.600002\nv -6.200004 20.600000 -4.600002\nv -8.200004 22.600000 -4.600001\nv -8.200003 22.600000 -2.600001\nv -6.200003 22.600000 -2.600002\nv -6.200003 22.600000 -4.600001\nv -11.800005 20.600000 -4.600001\nv -11.800005 20.600000 -2.600002\nv -9.800005 20.600000 -2.600002\nv -9.800005 20.600000 -4.600002\nv -11.800005 22.600000 -4.600001\nv -11.800004 22.600000 -2.600001\nv -9.800005 22.600000 -2.600002\nv -9.800005 22.600000 -4.600001\nv -15.400006 20.600000 -4.600001\nv -15.400006 20.600000 -2.600002\nv -13.400006 20.600000 -2.600002\nv -13.400006 20.600000 -4.600002\nv -15.400007 22.600000 -4.600001\nv -15.400005 22.600000 -2.600001\nv -13.400006 22.600000 -2.600002\nv -13.400006 22.600000 -4.600001\nv -19.000008 20.600000 -4.600001\nv -19.000008 20.600000 -2.600002\nv -17.000008 20.600000 -2.600002\nv -17.000008 20.600000 -4.600002\nv -19.000008 22.600000 -4.600001\nv -19.000008 22.600000 -2.600001\nv -17.000008 22.600000 -2.600002\nv -17.000008 22.600000 -4.600001\nv -22.600010 20.600000 -4.600001\nv -22.600010 20.600000 -2.600002\nv -20.600010 20.600000 -2.600002\nv -20.600010 20.600000 -4.600002\nv -22.600010 22.600000 -4.600001\nv -22.600010 22.600000 -2.600001\nv -20.600010 22.600000 -2.600002\nv -20.600010 22.600000 -4.600001\nv -26.200012 20.600000 -4.600001\nv -26.200012 20.600000 -2.600002\nv -24.200012 20.600000 -2.600002\nv -24.200012 20.600000 -4.600002\nv -26.200012 22.600000 -4.600001\nv -26.200012 22.600000 -2.600001\nv -24.200012 22.600000 -2.600002\nv -24.200012 22.600000 -4.600001\nv -29.800014 20.600000 -4.600001\nv -29.800014 20.600000 -2.600002\nv -27.800014 20.600000 -2.600002\nv -27.800014 20.600000 -4.600002\nv -29.800014 22.600000 -4.600001\nv -29.800014 22.600000 -2.600001\nv -27.800014 22.600000 -2.600002\nv -27.800014 22.600000 -4.600001\nv -33.400017 20.600000 -4.600001\nv -33.400017 20.600000 -2.600002\nv -31.400017 20.600000 -2.600002\nv -31.400017 20.600000 -4.600002\nv -33.400017 22.600000 -4.600001\nv -33.400017 22.600000 -2.600001\nv -31.400017 22.600000 -2.600002\nv -31.400017 22.600000 -4.600001\nv -1.000000 20.600000 -8.200003\nv -1.000000 20.600000 -6.200003\nv 1.000000 20.600000 -6.200003\nv 1.000000 20.600000 -8.200004\nv -1.000000 22.600000 -8.200003\nv -0.999999 22.600000 -6.200003\nv 1.000000 22.600000 -6.200004\nv 1.000000 22.600000 -8.200003\nv -4.600001 20.600000 -8.200003\nv -4.600001 20.600000 -6.200003\nv -2.600001 20.600000 -6.200003\nv -2.600002 20.600000 -8.200004\nv -4.600002 22.600000 -8.200003\nv -4.600001 22.600000 -6.200003\nv -2.600001 22.600000 -6.200004\nv -2.600002 22.600000 -8.200003\nv -8.200003 20.600000 -8.200003\nv -8.200003 20.600000 -6.200003\nv -6.200003 20.600000 -6.200003\nv -6.200004 20.600000 -8.200004\nv -8.200004 22.600000 -8.200003\nv -8.200003 22.600000 -6.200003\nv -6.200003 22.600000 -6.200004\nv -6.200003 22.600000 -8.200003\nv -11.800005 20.600000 -8.200003\nv -11.800005 20.600000 -6.200003\nv -9.800005 20.600000 -6.200003\nv -9.800005 20.600000 -8.200004\nv -11.800005 22.600000 -8.200003\nv -11.800004 22.600000 -6.200003\nv -9.800005 22.600000 -6.200004\nv -9.800005 22.600000 -8.200003\nv -15.400006 20.600000 -8.200003\nv -15.400006 20.600000 -6.200003\nv -13.400006 20.600000 -6.200003\nv -13.400006 20.600000 -8.200004\nv -15.400007 22.600000 -8.200003\nv -15.400005 22.600000 -6.200003\nv -13.400006 22.600000 -6.200004\nv -13.400006 22.600000 -8.200003\nv -19.000008 20.600000 -8.200003\nv -19.000008 20.600000 -6.200003\nv -17.000008 20.600000 -6.200003\nv -17.000008 20.600000 -8.200004\nv -19.000008 22.600000 -8.200003\nv -19.000008 22.600000 -6.200003\nv -17.000008 22.600000 -6.200004\nv -17.000008 22.600000 -8.200003\nv -22.600010 20.600000 -8.200003\nv -22.600010 20.600000 -6.200003\nv -20.600010 20.600000 -6.200003\nv -20.600010 20.600000 -8.200004\nv -22.600010 22.600000 -8.200003\nv -22.600010 22.600000 -6.200003\nv -20.600010 22.600000 -6.200004\nv -20.600010 22.600000 -8.200003\nv -26.200012 20.600000 -8.200003\nv -26.200012 20.600000 -6.200003\nv -24.200012 20.600000 -6.200003\nv -24.200012 20.600000 -8.200004\nv -26.200012 22.600000 -8.200003\nv -26.200012 22.600000 -6.200003\nv -24.200012 22.600000 -6.200004\nv -24.200012 22.600000 -8.200003\nv -29.800014 20.600000 -8.200003\nv -29.800014 20.600000 -6.200003\nv -27.800014 20.600000 -6.200003\nv -27.800014 20.600000 -8.200004\nv -29.800014 22.600000 -8.200003\nv -29.800014 22.600000 -6.200003\nv -27.800014 22.600000 -6.200004\nv -27.800014 22.600000 -8.200003\nv -33.400017 20.600000 -8.200003\nv -33.400017 20.600000 -6.200003\nv -31.400017 20.600000 -6.200003\nv -31.400017 20.600000 -8.200004\nv -33.400017 22.600000 -8.200003\nv -33.400017 22.600000 -6.200003\nv -31.400017 22.600000 -6.200004\nv -31.400017 22.600000 -8.200003\nv -1.000000 20.600000 -11.800005\nv -1.000000 20.600000 -9.800005\nv 1.000000 20.600000 -9.800005\nv 1.000000 20.600000 -11.800005\nv -1.000000 22.600000 -11.800004\nv -0.999999 22.600000 -9.800004\nv 1.000000 22.600000 -9.800005\nv 1.000000 22.600000 -11.800005\nv -4.600001 20.600000 -11.800005\nv -4.600001 20.600000 -9.800005\nv -2.600001 20.600000 -9.800005\nv -2.600002 20.600000 -11.800005\nv -4.600002 22.600000 -11.800004\nv -4.600001 22.600000 -9.800004\nv -2.600001 22.600000 -9.800005\nv -2.600002 22.600000 -11.800005\nv -8.200003 20.600000 -11.800005\nv -8.200003 20.600000 -9.800005\nv -6.200003 20.600000 -9.800005\nv -6.200004 20.600000 -11.800005\nv -8.200004 22.600000 -11.800004\nv -8.200003 22.600000 -9.800004\nv -6.200003 22.600000 -9.800005\nv -6.200003 22.600000 -11.800005\nv -11.800005 20.600000 -11.800005\nv -11.800005 20.600000 -9.800005\nv -9.800005 20.600000 -9.800005\nv -9.800005 20.600000 -11.800005\nv -11.800005 22.600000 -11.800004\nv -11.800004 22.600000 -9.800004\nv -9.800005 22.600000 -9.800005\nv -9.800005 22.600000 -11.800005\nv -15.400006 20.600000 -11.800005\nv -15.400006 20.600000 -9.800005\nv -13.400006 20.600000 -9.800005\nv -13.400006 20.600000 -11.800005\nv -15.400007 22.600000 -11.800004\nv -15.400005 22.600000 -9.800004\nv -13.400006 22.600000 -9.800005\nv -13.400006 22.600000 -11.800005\nv -19.000008 20.600000 -11.800005\nv -19.000008 20.600000 -9.800005\nv -17.000008 20.600000 -9.800005\nv -17.000008 20.600000 -11.800005\nv -19.000008 22.600000 -11.800004\nv -19.000008 22.600000 -9.800004\nv -17.000008 22.600000 -9.800005\nv -17.000008 22.600000 -11.800005\nv -22.600010 20.600000 -11.800005\nv -22.600010 20.600000 -9.800005\nv -20.600010 20.600000 -9.800005\nv -20.600010 20.600000 -11.800005\nv -22.600010 22.600000 -11.800004\nv -22.600010 22.600000 -9.800004\nv -20.600010 22.600000 -9.800005\nv -20.600010 22.600000 -11.800005\nv -26.200012 20.600000 -11.800005\nv -26.200012 20.600000 -9.800005\nv -24.200012 20.600000 -9.800005\nv -24.200012 20.600000 -11.800005\nv -26.200012 22.600000 -11.800004\nv -26.200012 22.600000 -9.800004\nv -24.200012 22.600000 -9.800005\nv -24.200012 22.600000 -11.800005\nv -29.800014 20.600000 -11.800005\nv -29.800014 20.600000 -9.800005\nv -27.800014 20.600000 -9.800005\nv -27.800014 20.600000 -11.800005\nv -29.800014 22.600000 -11.800004\nv -29.800014 22.600000 -9.800004\nv -27.800014 22.600000 -9.800005\nv -27.800014 22.600000 -11.800005\nv -33.400017 20.600000 -11.800005\nv -33.400017 20.600000 -9.800005\nv -31.400017 20.600000 -9.800005\nv -31.400017 20.600000 -11.800005\nv -33.400017 22.600000 -11.800004\nv -33.400017 22.600000 -9.800004\nv -31.400017 22.600000 -9.800005\nv -31.400017 22.600000 -11.800005\nv -1.000000 20.600000 -15.400006\nv -1.000000 20.600000 -13.400006\nv 1.000000 20.600000 -13.400006\nv 1.000000 20.600000 -15.400006\nv -1.000000 22.600000 -15.400005\nv -0.999999 22.600000 -13.400005\nv 1.000000 22.600000 -13.400006\nv 1.000000 22.600000 -15.400006\nv -4.600001 20.600000 -15.400006\nv -4.600001 20.600000 -13.400006\nv -2.600001 20.600000 -13.400006\nv -2.600002 20.600000 -15.400006\nv -4.600002 22.600000 -15.400005\nv -4.600001 22.600000 -13.400005\nv -2.600001 22.600000 -13.400006\nv -2.600002 22.600000 -15.400006\nv -8.200003 20.600000 -15.400006\nv -8.200003 20.600000 -13.400006\nv -6.200003 20.600000 -13.400006\nv -6.200004 20.600000 -15.400006\nv -8.200004 22.600000 -15.400005\nv -8.200003 22.600000 -13.400005\nv -6.200003 22.600000 -13.400006\nv -6.200003 22.600000 -15.400006\nv -11.800005 20.600000 -15.400006\nv -11.800005 20.600000 -13.400006\nv -9.800005 20.600000 -13.400006\nv -9.800005 20.600000 -15.400006\nv -11.800005 22.600000 -15.400005\nv -11.800004 22.600000 -13.400005\nv -9.800005 22.600000 -13.400006\nv -9.800005 22.600000 -15.400006\nv -15.400006 20.600000 -15.400006\nv -15.400006 20.600000 -13.400006\nv -13.400006 20.600000 -13.400006\nv -13.400006 20.600000 -15.400006\nv -15.400007 22.600000 -15.400005\nv -15.400005 22.600000 -13.400005\nv -13.400006 22.600000 -13.400006\nv -13.400006 22.600000 -15.400006\nv -19.000008 20.600000 -15.400006\nv -19.000008 20.600000 -13.400006\nv -17.000008 20.600000 -13.400006\nv -17.000008 20.600000 -15.400006\nv -19.000008 22.600000 -15.400005\nv -19.000008 22.600000 -13.400005\nv -17.000008 22.600000 -13.400006\nv -17.000008 22.600000 -15.400006\nv -22.600010 20.600000 -15.400006\nv -22.600010 20.600000 -13.400006\nv -20.600010 20.600000 -13.400006\nv -20.600010 20.600000 -15.400006\nv -22.600010 22.600000 -15.400005\nv -22.600010 22.600000 -13.400005\nv -20.600010 22.600000 -13.400006\nv -20.600010 22.600000 -15.400006\nv -26.200012 20.600000 -15.400006\nv -26.200012 20.600000 -13.400006\nv -24.200012 20.600000 -13.400006\nv -24.200012 20.600000 -15.400006\nv -26.200012 22.600000 -15.400005\nv -26.200012 22.600000 -13.400005\nv -24.200012 22.600000 -13.400006\nv -24.200012 22.600000 -15.400006\nv -29.800014 20.600000 -15.400006\nv -29.800014 20.600000 -13.400006\nv -27.800014 20.600000 -13.400006\nv -27.800014 20.600000 -15.400006\nv -29.800014 22.600000 -15.400005\nv -29.800014 22.600000 -13.400005\nv -27.800014 22.600000 -13.400006\nv -27.800014 22.600000 -15.400006\nv -33.400017 20.600000 -15.400006\nv -33.400017 20.600000 -13.400006\nv -31.400017 20.600000 -13.400006\nv -31.400017 20.600000 -15.400006\nv -33.400017 22.600000 -15.400005\nv -33.400017 22.600000 -13.400005\nv -31.400017 22.600000 -13.400006\nv -31.400017 22.600000 -15.400006\nv -1.000000 20.600000 -19.000008\nv -1.000000 20.600000 -17.000008\nv 1.000000 20.600000 -17.000008\nv 1.000000 20.600000 -19.000008\nv -1.000000 22.600000 -19.000008\nv -0.999999 22.600000 -17.000008\nv 1.000000 22.600000 -17.000008\nv 1.000000 22.600000 -19.000008\nv -4.600001 20.600000 -19.000008\nv -4.600001 20.600000 -17.000008\nv -2.600001 20.600000 -17.000008\nv -2.600002 20.600000 -19.000008\nv -4.600002 22.600000 -19.000008\nv -4.600001 22.600000 -17.000008\nv -2.600001 22.600000 -17.000008\nv -2.600002 22.600000 -19.000008\nv -8.200003 20.600000 -19.000008\nv -8.200003 20.600000 -17.000008\nv -6.200003 20.600000 -17.000008\nv -6.200004 20.600000 -19.000008\nv -8.200004 22.600000 -19.000008\nv -8.200003 22.600000 -17.000008\nv -6.200003 22.600000 -17.000008\nv -6.200003 22.600000 -19.000008\nv -11.800005 20.600000 -19.000008\nv -11.800005 20.600000 -17.000008\nv -9.800005 20.600000 -17.000008\nv -9.800005 20.600000 -19.000008\nv -11.800005 22.600000 -19.000008\nv -11.800004 22.600000 -17.000008\nv -9.800005 22.600000 -17.000008\nv -9.800005 22.600000 -19.000008\nv -15.400006 20.600000 -19.000008\nv -15.400006 20.600000 -17.000008\nv -13.400006 20.600000 -17.000008\nv -13.400006 20.600000 -19.000008\nv -15.400007 22.600000 -19.000008\nv -15.400005 22.600000 -17.000008\nv -13.400006 22.600000 -17.000008\nv -13.400006 22.600000 -19.000008\nv -19.000008 20.600000 -19.000008\nv -19.000008 20.600000 -17.000008\nv -17.000008 20.600000 -17.000008\nv -17.000008 20.600000 -19.000008\nv -19.000008 22.600000 -19.000008\nv -19.000008 22.600000 -17.000008\nv -17.000008 22.600000 -17.000008\nv -17.000008 22.600000 -19.000008\nv -22.600010 20.600000 -19.000008\nv -22.600010 20.600000 -17.000008\nv -20.600010 20.600000 -17.000008\nv -20.600010 20.600000 -19.000008\nv -22.600010 22.600000 -19.000008\nv -22.600010 22.600000 -17.000008\nv -20.600010 22.600000 -17.000008\nv -20.600010 22.600000 -19.000008\nv -26.200012 20.600000 -19.000008\nv -26.200012 20.600000 -17.000008\nv -24.200012 20.600000 -17.000008\nv -24.200012 20.600000 -19.000008\nv -26.200012 22.600000 -19.000008\nv -26.200012 22.600000 -17.000008\nv -24.200012 22.600000 -17.000008\nv -24.200012 22.600000 -19.000008\nv -29.800014 20.600000 -19.000008\nv -29.800014 20.600000 -17.000008\nv -27.800014 20.600000 -17.000008\nv -27.800014 20.600000 -19.000008\nv -29.800014 22.600000 -19.000008\nv -29.800014 22.600000 -17.000008\nv -27.800014 22.600000 -17.000008\nv -27.800014 22.600000 -19.000008\nv -33.400017 20.600000 -19.000008\nv -33.400017 20.600000 -17.000008\nv -31.400017 20.600000 -17.000008\nv -31.400017 20.600000 -19.000008\nv -33.400017 22.600000 -19.000008\nv -33.400017 22.600000 -17.000008\nv -31.400017 22.600000 -17.000008\nv -31.400017 22.600000 -19.000008\nv -1.000000 20.600000 -22.600010\nv -1.000000 20.600000 -20.600010\nv 1.000000 20.600000 -20.600010\nv 1.000000 20.600000 -22.600010\nv -1.000000 22.600000 -22.600010\nv -0.999999 22.600000 -20.600010\nv 1.000000 22.600000 -20.600010\nv 1.000000 22.600000 -22.600010\nv -4.600001 20.600000 -22.600010\nv -4.600001 20.600000 -20.600010\nv -2.600001 20.600000 -20.600010\nv -2.600002 20.600000 -22.600010\nv -4.600002 22.600000 -22.600010\nv -4.600001 22.600000 -20.600010\nv -2.600001 22.600000 -20.600010\nv -2.600002 22.600000 -22.600010\nv -8.200003 20.600000 -22.600010\nv -8.200003 20.600000 -20.600010\nv -6.200003 20.600000 -20.600010\nv -6.200004 20.600000 -22.600010\nv -8.200004 22.600000 -22.600010\nv -8.200003 22.600000 -20.600010\nv -6.200003 22.600000 -20.600010\nv -6.200003 22.600000 -22.600010\nv -11.800005 20.600000 -22.600010\nv -11.800005 20.600000 -20.600010\nv -9.800005 20.600000 -20.600010\nv -9.800005 20.600000 -22.600010\nv -11.800005 22.600000 -22.600010\nv -11.800004 22.600000 -20.600010\nv -9.800005 22.600000 -20.600010\nv -9.800005 22.600000 -22.600010\nv -15.400006 20.600000 -22.600010\nv -15.400006 20.600000 -20.600010\nv -13.400006 20.600000 -20.600010\nv -13.400006 20.600000 -22.600010\nv -15.400007 22.600000 -22.600010\nv -15.400005 22.600000 -20.600010\nv -13.400006 22.600000 -20.600010\nv -13.400006 22.600000 -22.600010\nv -19.000008 20.600000 -22.600010\nv -19.000008 20.600000 -20.600010\nv -17.000008 20.600000 -20.600010\nv -17.000008 20.600000 -22.600010\nv -19.000008 22.600000 -22.600010\nv -19.000008 22.600000 -20.600010\nv -17.000008 22.600000 -20.600010\nv -17.000008 22.600000 -22.600010\nv -22.600010 20.600000 -22.600010\nv -22.600010 20.600000 -20.600010\nv -20.600010 20.600000 -20.600010\nv -20.600010 20.600000 -22.600010\nv -22.600010 22.600000 -22.600010\nv -22.600010 22.600000 -20.600010\nv -20.600010 22.600000 -20.600010\nv -20.600010 22.600000 -22.600010\nv -26.200012 20.600000 -22.600010\nv -26.200012 20.600000 -20.600010\nv -24.200012 20.600000 -20.600010\nv -24.200012 20.600000 -22.600010\nv -26.200012 22.600000 -22.600010\nv -26.200012 22.600000 -20.600010\nv -24.200012 22.600000 -20.600010\nv -24.200012 22.600000 -22.600010\nv -29.800014 20.600000 -22.600010\nv -29.800014 20.600000 -20.600010\nv -27.800014 20.600000 -20.600010\nv -27.800014 20.600000 -22.600010\nv -29.800014 22.600000 -22.600010\nv -29.800014 22.600000 -20.600010\nv -27.800014 22.600000 -20.600010\nv -27.800014 22.600000 -22.600010\nv -33.400017 20.600000 -22.600010\nv -33.400017 20.600000 -20.600010\nv -31.400017 20.600000 -20.600010\nv -31.400017 20.600000 -22.600010\nv -33.400017 22.600000 -22.600010\nv -33.400017 22.600000 -20.600010\nv -31.400017 22.600000 -20.600010\nv -31.400017 22.600000 -22.600010\nv -1.000000 20.600000 -26.200012\nv -1.000000 20.600000 -24.200012\nv 1.000000 20.600000 -24.200012\nv 1.000000 20.600000 -26.200012\nv -1.000000 22.600000 -26.200012\nv -0.999999 22.600000 -24.200012\nv 1.000000 22.600000 -24.200012\nv 1.000000 22.600000 -26.200012\nv -4.600001 20.600000 -26.200012\nv -4.600001 20.600000 -24.200012\nv -2.600001 20.600000 -24.200012\nv -2.600002 20.600000 -26.200012\nv -4.600002 22.600000 -26.200012\nv -4.600001 22.600000 -24.200012\nv -2.600001 22.600000 -24.200012\nv -2.600002 22.600000 -26.200012\nv -8.200003 20.600000 -26.200012\nv -8.200003 20.600000 -24.200012\nv -6.200003 20.600000 -24.200012\nv -6.200004 20.600000 -26.200012\nv -8.200004 22.600000 -26.200012\nv -8.200003 22.600000 -24.200012\nv -6.200003 22.600000 -24.200012\nv -6.200003 22.600000 -26.200012\nv -11.800005 20.600000 -26.200012\nv -11.800005 20.600000 -24.200012\nv -9.800005 20.600000 -24.200012\nv -9.800005 20.600000 -26.200012\nv -11.800005 22.600000 -26.200012\nv -11.800004 22.600000 -24.200012\nv -9.800005 22.600000 -24.200012\nv -9.800005 22.600000 -26.200012\nv -15.400006 20.600000 -26.200012\nv -15.400006 20.600000 -24.200012\nv -13.400006 20.600000 -24.200012\nv -13.400006 20.600000 -26.200012\nv -15.400007 22.600000 -26.200012\nv -15.400005 22.600000 -24.200012\nv -13.400006 22.600000 -24.200012\nv -13.400006 22.600000 -26.200012\nv -19.000008 20.600000 -26.200012\nv -19.000008 20.600000 -24.200012\nv -17.000008 20.600000 -24.200012\nv -17.000008 20.600000 -26.200012\nv -19.000008 22.600000 -26.200012\nv -19.000008 22.600000 -24.200012\nv -17.000008 22.600000 -24.200012\nv -17.000008 22.600000 -26.200012\nv -22.600010 20.600000 -26.200012\nv -22.600010 20.600000 -24.200012\nv -20.600010 20.600000 -24.200012\nv -20.600010 20.600000 -26.200012\nv -22.600010 22.600000 -26.200012\nv -22.600010 22.600000 -24.200012\nv -20.600010 22.600000 -24.200012\nv -20.600010 22.600000 -26.200012\nv -26.200012 20.600000 -26.200012\nv -26.200012 20.600000 -24.200012\nv -24.200012 20.600000 -24.200012\nv -24.200012 20.600000 -26.200012\nv -26.200012 22.600000 -26.200012\nv -26.200012 22.600000 -24.200012\nv -24.200012 22.600000 -24.200012\nv -24.200012 22.600000 -26.200012\nv -29.800014 20.600000 -26.200012\nv -29.800014 20.600000 -24.200012\nv -27.800014 20.600000 -24.200012\nv -27.800014 20.600000 -26.200012\nv -29.800014 22.600000 -26.200012\nv -29.800014 22.600000 -24.200012\nv -27.800014 22.600000 -24.200012\nv -27.800014 22.600000 -26.200012\nv -33.400017 20.600000 -26.200012\nv -33.400017 20.600000 -24.200012\nv -31.400017 20.600000 -24.200012\nv -31.400017 20.600000 -26.200012\nv -33.400017 22.600000 -26.200012\nv -33.400017 22.600000 -24.200012\nv -31.400017 22.600000 -24.200012\nv -31.400017 22.600000 -26.200012\nv -1.000000 20.600000 -29.800014\nv -1.000000 20.600000 -27.800014\nv 1.000000 20.600000 -27.800014\nv 1.000000 20.600000 -29.800014\nv -1.000000 22.600000 -29.800014\nv -0.999999 22.600000 -27.800014\nv 1.000000 22.600000 -27.800014\nv 1.000000 22.600000 -29.800014\nv -4.600001 20.600000 -29.800014\nv -4.600001 20.600000 -27.800014\nv -2.600001 20.600000 -27.800014\nv -2.600002 20.600000 -29.800014\nv -4.600002 22.600000 -29.800014\nv -4.600001 22.600000 -27.800014\nv -2.600001 22.600000 -27.800014\nv -2.600002 22.600000 -29.800014\nv -8.200003 20.600000 -29.800014\nv -8.200003 20.600000 -27.800014\nv -6.200003 20.600000 -27.800014\nv -6.200004 20.600000 -29.800014\nv -8.200004 22.600000 -29.800014\nv -8.200003 22.600000 -27.800014\nv -6.200003 22.600000 -27.800014\nv -6.200003 22.600000 -29.800014\nv -11.800005 20.600000 -29.800014\nv -11.800005 20.600000 -27.800014\nv -9.800005 20.600000 -27.800014\nv -9.800005 20.600000 -29.800014\nv -11.800005 22.600000 -29.800014\nv -11.800004 22.600000 -27.800014\nv -9.800005 22.600000 -27.800014\nv -9.800005 22.600000 -29.800014\nv -15.400006 20.600000 -29.800014\nv -15.400006 20.600000 -27.800014\nv -13.400006 20.600000 -27.800014\nv -13.400006 20.600000 -29.800014\nv -15.400007 22.600000 -29.800014\nv -15.400005 22.600000 -27.800014\nv -13.400006 22.600000 -27.800014\nv -13.400006 22.600000 -29.800014\nv -19.000008 20.600000 -29.800014\nv -19.000008 20.600000 -27.800014\nv -17.000008 20.600000 -27.800014\nv -17.000008 20.600000 -29.800014\nv -19.000008 22.600000 -29.800014\nv -19.000008 22.600000 -27.800014\nv -17.000008 22.600000 -27.800014\nv -17.000008 22.600000 -29.800014\nv -22.600010 20.600000 -29.800014\nv -22.600010 20.600000 -27.800014\nv -20.600010 20.600000 -27.800014\nv -20.600010 20.600000 -29.800014\nv -22.600010 22.600000 -29.800014\nv -22.600010 22.600000 -27.800014\nv -20.600010 22.600000 -27.800014\nv -20.600010 22.600000 -29.800014\nv -26.200012 20.600000 -29.800014\nv -26.200012 20.600000 -27.800014\nv -24.200012 20.600000 -27.800014\nv -24.200012 20.600000 -29.800014\nv -26.200012 22.600000 -29.800014\nv -26.200012 22.600000 -27.800014\nv -24.200012 22.600000 -27.800014\nv -24.200012 22.600000 -29.800014\nv -29.800014 20.600000 -29.800014\nv -29.800014 20.600000 -27.800014\nv -27.800014 20.600000 -27.800014\nv -27.800014 20.600000 -29.800014\nv -29.800014 22.600000 -29.800014\nv -29.800014 22.600000 -27.800014\nv -27.800014 22.600000 -27.800014\nv -27.800014 22.600000 -29.800014\nv -33.400017 20.600000 -29.800014\nv -33.400017 20.600000 -27.800014\nv -31.400017 20.600000 -27.800014\nv -31.400017 20.600000 -29.800014\nv -33.400017 22.600000 -29.800014\nv -33.400017 22.600000 -27.800014\nv -31.400017 22.600000 -27.800014\nv -31.400017 22.600000 -29.800014\nv -1.000000 20.600000 -33.400017\nv -1.000000 20.600000 -31.400017\nv 1.000000 20.600000 -31.400017\nv 1.000000 20.600000 -33.400017\nv -1.000000 22.600000 -33.400017\nv -0.999999 22.600000 -31.400017\nv 1.000000 22.600000 -31.400017\nv 1.000000 22.600000 -33.400017\nv -4.600001 20.600000 -33.400017\nv -4.600001 20.600000 -31.400017\nv -2.600001 20.600000 -31.400017\nv -2.600002 20.600000 -33.400017\nv -4.600002 22.600000 -33.400017\nv -4.600001 22.600000 -31.400017\nv -2.600001 22.600000 -31.400017\nv -2.600002 22.600000 -33.400017\nv -8.200003 20.600000 -33.400017\nv -8.200003 20.600000 -31.400017\nv -6.200003 20.600000 -31.400017\nv -6.200004 20.600000 -33.400017\nv -8.200004 22.600000 -33.400017\nv -8.200003 22.600000 -31.400017\nv -6.200003 22.600000 -31.400017\nv -6.200003 22.600000 -33.400017\nv -11.800005 20.600000 -33.400017\nv -11.800005 20.600000 -31.400017\nv -9.800005 20.600000 -31.400017\nv -9.800005 20.600000 -33.400017\nv -11.800005 22.600000 -33.400017\nv -11.800004 22.600000 -31.400017\nv -9.800005 22.600000 -31.400017\nv -9.800005 22.600000 -33.400017\nv -15.400006 20.600000 -33.400017\nv -15.400006 20.600000 -31.400017\nv -13.400006 20.600000 -31.400017\nv -13.400006 20.600000 -33.400017\nv -15.400007 22.600000 -33.400017\nv -15.400005 22.600000 -31.400017\nv -13.400006 22.600000 -31.400017\nv -13.400006 22.600000 -33.400017\nv -19.000008 20.600000 -33.400017\nv -19.000008 20.600000 -31.400017\nv -17.000008 20.600000 -31.400017\nv -17.000008 20.600000 -33.400017\nv -19.000008 22.600000 -33.400017\nv -19.000008 22.600000 -31.400017\nv -17.000008 22.600000 -31.400017\nv -17.000008 22.600000 -33.400017\nv -22.600010 20.600000 -33.400017\nv -22.600010 20.600000 -31.400017\nv -20.600010 20.600000 -31.400017\nv -20.600010 20.600000 -33.400017\nv -22.600010 22.600000 -33.400017\nv -22.600010 22.600000 -31.400017\nv -20.600010 22.600000 -31.400017\nv -20.600010 22.600000 -33.400017\nv -26.200012 20.600000 -33.400017\nv -26.200012 20.600000 -31.400017\nv -24.200012 20.600000 -31.400017\nv -24.200012 20.600000 -33.400017\nv -26.200012 22.600000 -33.400017\nv -26.200012 22.600000 -31.400017\nv -24.200012 22.600000 -31.400017\nv -24.200012 22.600000 -33.400017\nv -29.800014 20.600000 -33.400017\nv -29.800014 20.600000 -31.400017\nv -27.800014 20.600000 -31.400017\nv -27.800014 20.600000 -33.400017\nv -29.800014 22.600000 -33.400017\nv -29.800014 22.600000 -31.400017\nv -27.800014 22.600000 -31.400017\nv -27.800014 22.600000 -33.400017\nv -33.400017 20.600000 -33.400017\nv -33.400017 20.600000 -31.400017\nv -31.400017 20.600000 -31.400017\nv -31.400017 20.600000 -33.400017\nv -33.400017 22.600000 -33.400017\nv -33.400017 22.600000 -31.400017\nv -31.400017 22.600000 -31.400017\nv -31.400017 22.600000 -33.400017\nv 1.000000 24.200001 -1.000000\nv 1.000000 24.200001 1.000000\nv -1.000000 24.200001 1.000000\nv -1.000000 24.200001 -1.000000\nv 1.000000 26.200001 -0.999999\nv 0.999999 26.200001 1.000001\nv -1.000000 26.200001 1.000000\nv -1.000000 26.200001 -1.000000\nv 4.600001 24.200001 -1.000000\nv 4.600001 24.200001 1.000000\nv 2.600001 24.200001 1.000000\nv 2.600002 24.200001 -1.000000\nv 4.600002 26.200001 -0.999999\nv 4.600001 26.200001 1.000001\nv 2.600001 26.200001 1.000000\nv 2.600002 26.200001 -1.000000\nv 8.200003 24.200001 -1.000000\nv 8.200003 24.200001 1.000000\nv 6.200003 24.200001 1.000000\nv 6.200004 24.200001 -1.000000\nv 8.200004 26.200001 -0.999999\nv 8.200003 26.200001 1.000001\nv 6.200003 26.200001 1.000000\nv 6.200003 26.200001 -1.000000\nv 11.800005 24.200001 -1.000000\nv 11.800005 24.200001 1.000000\nv 9.800005 24.200001 1.000000\nv 9.800005 24.200001 -1.000000\nv 11.800005 26.200001 -0.999999\nv 11.800004 26.200001 1.000001\nv 9.800005 26.200001 1.000000\nv 9.800005 26.200001 -1.000000\nv 15.400006 24.200001 -1.000000\nv 15.400006 24.200001 1.000000\nv 13.400006 24.200001 1.000000\nv 13.400006 24.200001 -1.000000\nv 15.400007 26.200001 -0.999999\nv 15.400005 26.200001 1.000001\nv 13.400006 26.200001 1.000000\nv 13.400006 26.200001 -1.000000\nv 19.000008 24.200001 -1.000000\nv 19.000008 24.200001 1.000000\nv 17.000008 24.200001 1.000000\nv 17.000008 24.200001 -1.000000\nv 19.000008 26.200001 -0.999999\nv 19.000008 26.200001 1.000001\nv 17.000008 26.200001 1.000000\nv 17.000008 26.200001 -1.000000\nv 22.600010 24.200001 -1.000000\nv 22.600010 24.200001 1.000000\nv 20.600010 24.200001 1.000000\nv 20.600010 24.200001 -1.000000\nv 22.600010 26.200001 -0.999999\nv 22.600010 26.200001 1.000001\nv 20.600010 26.200001 1.000000\nv 20.600010 26.200001 -1.000000\nv 26.200012 24.200001 -1.000000\nv 26.200012 24.200001 1.000000\nv 24.200012 24.200001 1.000000\nv 24.200012 24.200001 -1.000000\nv 26.200012 26.200001 -0.999999\nv 26.200012 26.200001 1.000001\nv 24.200012 26.200001 1.000000\nv 24.200012 26.200001 -1.000000\nv 29.800014 24.200001 -1.000000\nv 29.800014 24.200001 1.000000\nv 27.800014 24.200001 1.000000\nv 27.800014 24.200001 -1.000000\nv 29.800014 26.200001 -0.999999\nv 29.800014 26.200001 1.000001\nv 27.800014 26.200001 1.000000\nv 27.800014 26.200001 -1.000000\nv 33.400017 24.200001 -1.000000\nv 33.400017 24.200001 1.000000\nv 31.400017 24.200001 1.000000\nv 31.400017 24.200001 -1.000000\nv 33.400017 26.200001 -0.999999\nv 33.400017 26.200001 1.000001\nv 31.400017 26.200001 1.000000\nv 31.400017 26.200001 -1.000000\nv 1.000000 24.200001 -4.600001\nv 1.000000 24.200001 -2.600002\nv -1.000000 24.200001 -2.600002\nv -1.000000 24.200001 -4.600002\nv 1.000000 26.200001 -4.600001\nv 0.999999 26.200001 -2.600001\nv -1.000000 26.200001 -2.600002\nv -1.000000 26.200001 -4.600001\nv 4.600001 24.200001 -4.600001\nv 4.600001 24.200001 -2.600002\nv 2.600001 24.200001 -2.600002\nv 2.600002 24.200001 -4.600002\nv 4.600002 26.200001 -4.600001\nv 4.600001 26.200001 -2.600001\nv 2.600001 26.200001 -2.600002\nv 2.600002 26.200001 -4.600001\nv 8.200003 24.200001 -4.600001\nv 8.200003 24.200001 -2.600002\nv 6.200003 24.200001 -2.600002\nv 6.200004 24.200001 -4.600002\nv 8.200004 26.200001 -4.600001\nv 8.200003 26.200001 -2.600001\nv 6.200003 26.200001 -2.600002\nv 6.200003 26.200001 -4.600001\nv 11.800005 24.200001 -4.600001\nv 11.800005 24.200001 -2.600002\nv 9.800005 24.200001 -2.600002\nv 9.800005 24.200001 -4.600002\nv 11.800005 26.200001 -4.600001\nv 11.800004 26.200001 -2.600001\nv 9.800005 26.200001 -2.600002\nv 9.800005 26.200001 -4.600001\nv 15.400006 24.200001 -4.600001\nv 15.400006 24.200001 -2.600002\nv 13.400006 24.200001 -2.600002\nv 13.400006 24.200001 -4.600002\nv 15.400007 26.200001 -4.600001\nv 15.400005 26.200001 -2.600001\nv 13.400006 26.200001 -2.600002\nv 13.400006 26.200001 -4.600001\nv 19.000008 24.200001 -4.600001\nv 19.000008 24.200001 -2.600002\nv 17.000008 24.200001 -2.600002\nv 17.000008 24.200001 -4.600002\nv 19.000008 26.200001 -4.600001\nv 19.000008 26.200001 -2.600001\nv 17.000008 26.200001 -2.600002\nv 17.000008 26.200001 -4.600001\nv 22.600010 24.200001 -4.600001\nv 22.600010 24.200001 -2.600002\nv 20.600010 24.200001 -2.600002\nv 20.600010 24.200001 -4.600002\nv 22.600010 26.200001 -4.600001\nv 22.600010 26.200001 -2.600001\nv 20.600010 26.200001 -2.600002\nv 20.600010 26.200001 -4.600001\nv 26.200012 24.200001 -4.600001\nv 26.200012 24.200001 -2.600002\nv 24.200012 24.200001 -2.600002\nv 24.200012 24.200001 -4.600002\nv 26.200012 26.200001 -4.600001\nv 26.200012 26.200001 -2.600001\nv 24.200012 26.200001 -2.600002\nv 24.200012 26.200001 -4.600001\nv 29.800014 24.200001 -4.600001\nv 29.800014 24.200001 -2.600002\nv 27.800014 24.200001 -2.600002\nv 27.800014 24.200001 -4.600002\nv 29.800014 26.200001 -4.600001\nv 29.800014 26.200001 -2.600001\nv 27.800014 26.200001 -2.600002\nv 27.800014 26.200001 -4.600001\nv 33.400017 24.200001 -4.600001\nv 33.400017 24.200001 -2.600002\nv 31.400017 24.200001 -2.600002\nv 31.400017 24.200001 -4.600002\nv 33.400017 26.200001 -4.600001\nv 33.400017 26.200001 -2.600001\nv 31.400017 26.200001 -2.600002\nv 31.400017 26.200001 -4.600001\nv 1.000000 24.200001 -8.200003\nv 1.000000 24.200001 -6.200003\nv -1.000000 24.200001 -6.200003\nv -1.000000 24.200001 -8.200004\nv 1.000000 26.200001 -8.200003\nv 0.999999 26.200001 -6.200003\nv -1.000000 26.200001 -6.200004\nv -1.000000 26.200001 -8.200003\nv 4.600001 24.200001 -8.200003\nv 4.600001 24.200001 -6.200003\nv 2.600001 24.200001 -6.200003\nv 2.600002 24.200001 -8.200004\nv 4.600002 26.200001 -8.200003\nv 4.600001 26.200001 -6.200003\nv 2.600001 26.200001 -6.200004\nv 2.600002 26.200001 -8.200003\nv 8.200003 24.200001 -8.200003\nv 8.200003 24.200001 -6.200003\nv 6.200003 24.200001 -6.200003\nv 6.200004 24.200001 -8.200004\nv 8.200004 26.200001 -8.200003\nv 8.200003 26.200001 -6.200003\nv 6.200003 26.200001 -6.200004\nv 6.200003 26.200001 -8.200003\nv 11.800005 24.200001 -8.200003\nv 11.800005 24.200001 -6.200003\nv 9.800005 24.200001 -6.200003\nv 9.800005 24.200001 -8.200004\nv 11.800005 26.200001 -8.200003\nv 11.800004 26.200001 -6.200003\nv 9.800005 26.200001 -6.200004\nv 9.800005 26.200001 -8.200003\nv 15.400006 24.200001 -8.200003\nv 15.400006 24.200001 -6.200003\nv 13.400006 24.200001 -6.200003\nv 13.400006 24.200001 -8.200004\nv 15.400007 26.200001 -8.200003\nv 15.400005 26.200001 -6.200003\nv 13.400006 26.200001 -6.200004\nv 13.400006 26.200001 -8.200003\nv 19.000008 24.200001 -8.200003\nv 19.000008 24.200001 -6.200003\nv 17.000008 24.200001 -6.200003\nv 17.000008 24.200001 -8.200004\nv 19.000008 26.200001 -8.200003\nv 19.000008 26.200001 -6.200003\nv 17.000008 26.200001 -6.200004\nv 17.000008 26.200001 -8.200003\nv 22.600010 24.200001 -8.200003\nv 22.600010 24.200001 -6.200003\nv 20.600010 24.200001 -6.200003\nv 20.600010 24.200001 -8.200004\nv 22.600010 26.200001 -8.200003\nv 22.600010 26.200001 -6.200003\nv 20.600010 26.200001 -6.200004\nv 20.600010 26.200001 -8.200003\nv 26.200012 24.200001 -8.200003\nv 26.200012 24.200001 -6.200003\nv 24.200012 24.200001 -6.200003\nv 24.200012 24.200001 -8.200004\nv 26.200012 26.200001 -8.200003\nv 26.200012 26.200001 -6.200003\nv 24.200012 26.200001 -6.200004\nv 24.200012 26.200001 -8.200003\nv 29.800014 24.200001 -8.200003\nv 29.800014 24.200001 -6.200003\nv 27.800014 24.200001 -6.200003\nv 27.800014 24.200001 -8.200004\nv 29.800014 26.200001 -8.200003\nv 29.800014 26.200001 -6.200003\nv 27.800014 26.200001 -6.200004\nv 27.800014 26.200001 -8.200003\nv 33.400017 24.200001 -8.200003\nv 33.400017 24.200001 -6.200003\nv 31.400017 24.200001 -6.200003\nv 31.400017 24.200001 -8.200004\nv 33.400017 26.200001 -8.200003\nv 33.400017 26.200001 -6.200003\nv 31.400017 26.200001 -6.200004\nv 31.400017 26.200001 -8.200003\nv 1.000000 24.200001 -11.800005\nv 1.000000 24.200001 -9.800005\nv -1.000000 24.200001 -9.800005\nv -1.000000 24.200001 -11.800005\nv 1.000000 26.200001 -11.800004\nv 0.999999 26.200001 -9.800004\nv -1.000000 26.200001 -9.800005\nv -1.000000 26.200001 -11.800005\nv 4.600001 24.200001 -11.800005\nv 4.600001 24.200001 -9.800005\nv 2.600001 24.200001 -9.800005\nv 2.600002 24.200001 -11.800005\nv 4.600002 26.200001 -11.800004\nv 4.600001 26.200001 -9.800004\nv 2.600001 26.200001 -9.800005\nv 2.600002 26.200001 -11.800005\nv 8.200003 24.200001 -11.800005\nv 8.200003 24.200001 -9.800005\nv 6.200003 24.200001 -9.800005\nv 6.200004 24.200001 -11.800005\nv 8.200004 26.200001 -11.800004\nv 8.200003 26.200001 -9.800004\nv 6.200003 26.200001 -9.800005\nv 6.200003 26.200001 -11.800005\nv 11.800005 24.200001 -11.800005\nv 11.800005 24.200001 -9.800005\nv 9.800005 24.200001 -9.800005\nv 9.800005 24.200001 -11.800005\nv 11.800005 26.200001 -11.800004\nv 11.800004 26.200001 -9.800004\nv 9.800005 26.200001 -9.800005\nv 9.800005 26.200001 -11.800005\nv 15.400006 24.200001 -11.800005\nv 15.400006 24.200001 -9.800005\nv 13.400006 24.200001 -9.800005\nv 13.400006 24.200001 -11.800005\nv 15.400007 26.200001 -11.800004\nv 15.400005 26.200001 -9.800004\nv 13.400006 26.200001 -9.800005\nv 13.400006 26.200001 -11.800005\nv 19.000008 24.200001 -11.800005\nv 19.000008 24.200001 -9.800005\nv 17.000008 24.200001 -9.800005\nv 17.000008 24.200001 -11.800005\nv 19.000008 26.200001 -11.800004\nv 19.000008 26.200001 -9.800004\nv 17.000008 26.200001 -9.800005\nv 17.000008 26.200001 -11.800005\nv 22.600010 24.200001 -11.800005\nv 22.600010 24.200001 -9.800005\nv 20.600010 24.200001 -9.800005\nv 20.600010 24.200001 -11.800005\nv 22.600010 26.200001 -11.800004\nv 22.600010 26.200001 -9.800004\nv 20.600010 26.200001 -9.800005\nv 20.600010 26.200001 -11.800005\nv 26.200012 24.200001 -11.800005\nv 26.200012 24.200001 -9.800005\nv 24.200012 24.200001 -9.800005\nv 24.200012 24.200001 -11.800005\nv 26.200012 26.200001 -11.800004\nv 26.200012 26.200001 -9.800004\nv 24.200012 26.200001 -9.800005\nv 24.200012 26.200001 -11.800005\nv 29.800014 24.200001 -11.800005\nv 29.800014 24.200001 -9.800005\nv 27.800014 24.200001 -9.800005\nv 27.800014 24.200001 -11.800005\nv 29.800014 26.200001 -11.800004\nv 29.800014 26.200001 -9.800004\nv 27.800014 26.200001 -9.800005\nv 27.800014 26.200001 -11.800005\nv 33.400017 24.200001 -11.800005\nv 33.400017 24.200001 -9.800005\nv 31.400017 24.200001 -9.800005\nv 31.400017 24.200001 -11.800005\nv 33.400017 26.200001 -11.800004\nv 33.400017 26.200001 -9.800004\nv 31.400017 26.200001 -9.800005\nv 31.400017 26.200001 -11.800005\nv 1.000000 24.200001 -15.400006\nv 1.000000 24.200001 -13.400006\nv -1.000000 24.200001 -13.400006\nv -1.000000 24.200001 -15.400006\nv 1.000000 26.200001 -15.400005\nv 0.999999 26.200001 -13.400005\nv -1.000000 26.200001 -13.400006\nv -1.000000 26.200001 -15.400006\nv 4.600001 24.200001 -15.400006\nv 4.600001 24.200001 -13.400006\nv 2.600001 24.200001 -13.400006\nv 2.600002 24.200001 -15.400006\nv 4.600002 26.200001 -15.400005\nv 4.600001 26.200001 -13.400005\nv 2.600001 26.200001 -13.400006\nv 2.600002 26.200001 -15.400006\nv 8.200003 24.200001 -15.400006\nv 8.200003 24.200001 -13.400006\nv 6.200003 24.200001 -13.400006\nv 6.200004 24.200001 -15.400006\nv 8.200004 26.200001 -15.400005\nv 8.200003 26.200001 -13.400005\nv 6.200003 26.200001 -13.400006\nv 6.200003 26.200001 -15.400006\nv 11.800005 24.200001 -15.400006\nv 11.800005 24.200001 -13.400006\nv 9.800005 24.200001 -13.400006\nv 9.800005 24.200001 -15.400006\nv 11.800005 26.200001 -15.400005\nv 11.800004 26.200001 -13.400005\nv 9.800005 26.200001 -13.400006\nv 9.800005 26.200001 -15.400006\nv 15.400006 24.200001 -15.400006\nv 15.400006 24.200001 -13.400006\nv 13.400006 24.200001 -13.400006\nv 13.400006 24.200001 -15.400006\nv 15.400007 26.200001 -15.400005\nv 15.400005 26.200001 -13.400005\nv 13.400006 26.200001 -13.400006\nv 13.400006 26.200001 -15.400006\nv 19.000008 24.200001 -15.400006\nv 19.000008 24.200001 -13.400006\nv 17.000008 24.200001 -13.400006\nv 17.000008 24.200001 -15.400006\nv 19.000008 26.200001 -15.400005\nv 19.000008 26.200001 -13.400005\nv 17.000008 26.200001 -13.400006\nv 17.000008 26.200001 -15.400006\nv 22.600010 24.200001 -15.400006\nv 22.600010 24.200001 -13.400006\nv 20.600010 24.200001 -13.400006\nv 20.600010 24.200001 -15.400006\nv 22.600010 26.200001 -15.400005\nv 22.600010 26.200001 -13.400005\nv 20.600010 26.200001 -13.400006\nv 20.600010 26.200001 -15.400006\nv 26.200012 24.200001 -15.400006\nv 26.200012 24.200001 -13.400006\nv 24.200012 24.200001 -13.400006\nv 24.200012 24.200001 -15.400006\nv 26.200012 26.200001 -15.400005\nv 26.200012 26.200001 -13.400005\nv 24.200012 26.200001 -13.400006\nv 24.200012 26.200001 -15.400006\nv 29.800014 24.200001 -15.400006\nv 29.800014 24.200001 -13.400006\nv 27.800014 24.200001 -13.400006\nv 27.800014 24.200001 -15.400006\nv 29.800014 26.200001 -15.400005\nv 29.800014 26.200001 -13.400005\nv 27.800014 26.200001 -13.400006\nv 27.800014 26.200001 -15.400006\nv 33.400017 24.200001 -15.400006\nv 33.400017 24.200001 -13.400006\nv 31.400017 24.200001 -13.400006\nv 31.400017 24.200001 -15.400006\nv 33.400017 26.200001 -15.400005\nv 33.400017 26.200001 -13.400005\nv 31.400017 26.200001 -13.400006\nv 31.400017 26.200001 -15.400006\nv 1.000000 24.200001 -19.000008\nv 1.000000 24.200001 -17.000008\nv -1.000000 24.200001 -17.000008\nv -1.000000 24.200001 -19.000008\nv 1.000000 26.200001 -19.000008\nv 0.999999 26.200001 -17.000008\nv -1.000000 26.200001 -17.000008\nv -1.000000 26.200001 -19.000008\nv 4.600001 24.200001 -19.000008\nv 4.600001 24.200001 -17.000008\nv 2.600001 24.200001 -17.000008\nv 2.600002 24.200001 -19.000008\nv 4.600002 26.200001 -19.000008\nv 4.600001 26.200001 -17.000008\nv 2.600001 26.200001 -17.000008\nv 2.600002 26.200001 -19.000008\nv 8.200003 24.200001 -19.000008\nv 8.200003 24.200001 -17.000008\nv 6.200003 24.200001 -17.000008\nv 6.200004 24.200001 -19.000008\nv 8.200004 26.200001 -19.000008\nv 8.200003 26.200001 -17.000008\nv 6.200003 26.200001 -17.000008\nv 6.200003 26.200001 -19.000008\nv 11.800005 24.200001 -19.000008\nv 11.800005 24.200001 -17.000008\nv 9.800005 24.200001 -17.000008\nv 9.800005 24.200001 -19.000008\nv 11.800005 26.200001 -19.000008\nv 11.800004 26.200001 -17.000008\nv 9.800005 26.200001 -17.000008\nv 9.800005 26.200001 -19.000008\nv 15.400006 24.200001 -19.000008\nv 15.400006 24.200001 -17.000008\nv 13.400006 24.200001 -17.000008\nv 13.400006 24.200001 -19.000008\nv 15.400007 26.200001 -19.000008\nv 15.400005 26.200001 -17.000008\nv 13.400006 26.200001 -17.000008\nv 13.400006 26.200001 -19.000008\nv 19.000008 24.200001 -19.000008\nv 19.000008 24.200001 -17.000008\nv 17.000008 24.200001 -17.000008\nv 17.000008 24.200001 -19.000008\nv 19.000008 26.200001 -19.000008\nv 19.000008 26.200001 -17.000008\nv 17.000008 26.200001 -17.000008\nv 17.000008 26.200001 -19.000008\nv 22.600010 24.200001 -19.000008\nv 22.600010 24.200001 -17.000008\nv 20.600010 24.200001 -17.000008\nv 20.600010 24.200001 -19.000008\nv 22.600010 26.200001 -19.000008\nv 22.600010 26.200001 -17.000008\nv 20.600010 26.200001 -17.000008\nv 20.600010 26.200001 -19.000008\nv 26.200012 24.200001 -19.000008\nv 26.200012 24.200001 -17.000008\nv 24.200012 24.200001 -17.000008\nv 24.200012 24.200001 -19.000008\nv 26.200012 26.200001 -19.000008\nv 26.200012 26.200001 -17.000008\nv 24.200012 26.200001 -17.000008\nv 24.200012 26.200001 -19.000008\nv 29.800014 24.200001 -19.000008\nv 29.800014 24.200001 -17.000008\nv 27.800014 24.200001 -17.000008\nv 27.800014 24.200001 -19.000008\nv 29.800014 26.200001 -19.000008\nv 29.800014 26.200001 -17.000008\nv 27.800014 26.200001 -17.000008\nv 27.800014 26.200001 -19.000008\nv 33.400017 24.200001 -19.000008\nv 33.400017 24.200001 -17.000008\nv 31.400017 24.200001 -17.000008\nv 31.400017 24.200001 -19.000008\nv 33.400017 26.200001 -19.000008\nv 33.400017 26.200001 -17.000008\nv 31.400017 26.200001 -17.000008\nv 31.400017 26.200001 -19.000008\nv 1.000000 24.200001 -22.600010\nv 1.000000 24.200001 -20.600010\nv -1.000000 24.200001 -20.600010\nv -1.000000 24.200001 -22.600010\nv 1.000000 26.200001 -22.600010\nv 0.999999 26.200001 -20.600010\nv -1.000000 26.200001 -20.600010\nv -1.000000 26.200001 -22.600010\nv 4.600001 24.200001 -22.600010\nv 4.600001 24.200001 -20.600010\nv 2.600001 24.200001 -20.600010\nv 2.600002 24.200001 -22.600010\nv 4.600002 26.200001 -22.600010\nv 4.600001 26.200001 -20.600010\nv 2.600001 26.200001 -20.600010\nv 2.600002 26.200001 -22.600010\nv 8.200003 24.200001 -22.600010\nv 8.200003 24.200001 -20.600010\nv 6.200003 24.200001 -20.600010\nv 6.200004 24.200001 -22.600010\nv 8.200004 26.200001 -22.600010\nv 8.200003 26.200001 -20.600010\nv 6.200003 26.200001 -20.600010\nv 6.200003 26.200001 -22.600010\nv 11.800005 24.200001 -22.600010\nv 11.800005 24.200001 -20.600010\nv 9.800005 24.200001 -20.600010\nv 9.800005 24.200001 -22.600010\nv 11.800005 26.200001 -22.600010\nv 11.800004 26.200001 -20.600010\nv 9.800005 26.200001 -20.600010\nv 9.800005 26.200001 -22.600010\nv 15.400006 24.200001 -22.600010\nv 15.400006 24.200001 -20.600010\nv 13.400006 24.200001 -20.600010\nv 13.400006 24.200001 -22.600010\nv 15.400007 26.200001 -22.600010\nv 15.400005 26.200001 -20.600010\nv 13.400006 26.200001 -20.600010\nv 13.400006 26.200001 -22.600010\nv 19.000008 24.200001 -22.600010\nv 19.000008 24.200001 -20.600010\nv 17.000008 24.200001 -20.600010\nv 17.000008 24.200001 -22.600010\nv 19.000008 26.200001 -22.600010\nv 19.000008 26.200001 -20.600010\nv 17.000008 26.200001 -20.600010\nv 17.000008 26.200001 -22.600010\nv 22.600010 24.200001 -22.600010\nv 22.600010 24.200001 -20.600010\nv 20.600010 24.200001 -20.600010\nv 20.600010 24.200001 -22.600010\nv 22.600010 26.200001 -22.600010\nv 22.600010 26.200001 -20.600010\nv 20.600010 26.200001 -20.600010\nv 20.600010 26.200001 -22.600010\nv 26.200012 24.200001 -22.600010\nv 26.200012 24.200001 -20.600010\nv 24.200012 24.200001 -20.600010\nv 24.200012 24.200001 -22.600010\nv 26.200012 26.200001 -22.600010\nv 26.200012 26.200001 -20.600010\nv 24.200012 26.200001 -20.600010\nv 24.200012 26.200001 -22.600010\nv 29.800014 24.200001 -22.600010\nv 29.800014 24.200001 -20.600010\nv 27.800014 24.200001 -20.600010\nv 27.800014 24.200001 -22.600010\nv 29.800014 26.200001 -22.600010\nv 29.800014 26.200001 -20.600010\nv 27.800014 26.200001 -20.600010\nv 27.800014 26.200001 -22.600010\nv 33.400017 24.200001 -22.600010\nv 33.400017 24.200001 -20.600010\nv 31.400017 24.200001 -20.600010\nv 31.400017 24.200001 -22.600010\nv 33.400017 26.200001 -22.600010\nv 33.400017 26.200001 -20.600010\nv 31.400017 26.200001 -20.600010\nv 31.400017 26.200001 -22.600010\nv 1.000000 24.200001 -26.200012\nv 1.000000 24.200001 -24.200012\nv -1.000000 24.200001 -24.200012\nv -1.000000 24.200001 -26.200012\nv 1.000000 26.200001 -26.200012\nv 0.999999 26.200001 -24.200012\nv -1.000000 26.200001 -24.200012\nv -1.000000 26.200001 -26.200012\nv 4.600001 24.200001 -26.200012\nv 4.600001 24.200001 -24.200012\nv 2.600001 24.200001 -24.200012\nv 2.600002 24.200001 -26.200012\nv 4.600002 26.200001 -26.200012\nv 4.600001 26.200001 -24.200012\nv 2.600001 26.200001 -24.200012\nv 2.600002 26.200001 -26.200012\nv 8.200003 24.200001 -26.200012\nv 8.200003 24.200001 -24.200012\nv 6.200003 24.200001 -24.200012\nv 6.200004 24.200001 -26.200012\nv 8.200004 26.200001 -26.200012\nv 8.200003 26.200001 -24.200012\nv 6.200003 26.200001 -24.200012\nv 6.200003 26.200001 -26.200012\nv 11.800005 24.200001 -26.200012\nv 11.800005 24.200001 -24.200012\nv 9.800005 24.200001 -24.200012\nv 9.800005 24.200001 -26.200012\nv 11.800005 26.200001 -26.200012\nv 11.800004 26.200001 -24.200012\nv 9.800005 26.200001 -24.200012\nv 9.800005 26.200001 -26.200012\nv 15.400006 24.200001 -26.200012\nv 15.400006 24.200001 -24.200012\nv 13.400006 24.200001 -24.200012\nv 13.400006 24.200001 -26.200012\nv 15.400007 26.200001 -26.200012\nv 15.400005 26.200001 -24.200012\nv 13.400006 26.200001 -24.200012\nv 13.400006 26.200001 -26.200012\nv 19.000008 24.200001 -26.200012\nv 19.000008 24.200001 -24.200012\nv 17.000008 24.200001 -24.200012\nv 17.000008 24.200001 -26.200012\nv 19.000008 26.200001 -26.200012\nv 19.000008 26.200001 -24.200012\nv 17.000008 26.200001 -24.200012\nv 17.000008 26.200001 -26.200012\nv 22.600010 24.200001 -26.200012\nv 22.600010 24.200001 -24.200012\nv 20.600010 24.200001 -24.200012\nv 20.600010 24.200001 -26.200012\nv 22.600010 26.200001 -26.200012\nv 22.600010 26.200001 -24.200012\nv 20.600010 26.200001 -24.200012\nv 20.600010 26.200001 -26.200012\nv 26.200012 24.200001 -26.200012\nv 26.200012 24.200001 -24.200012\nv 24.200012 24.200001 -24.200012\nv 24.200012 24.200001 -26.200012\nv 26.200012 26.200001 -26.200012\nv 26.200012 26.200001 -24.200012\nv 24.200012 26.200001 -24.200012\nv 24.200012 26.200001 -26.200012\nv 29.800014 24.200001 -26.200012\nv 29.800014 24.200001 -24.200012\nv 27.800014 24.200001 -24.200012\nv 27.800014 24.200001 -26.200012\nv 29.800014 26.200001 -26.200012\nv 29.800014 26.200001 -24.200012\nv 27.800014 26.200001 -24.200012\nv 27.800014 26.200001 -26.200012\nv 33.400017 24.200001 -26.200012\nv 33.400017 24.200001 -24.200012\nv 31.400017 24.200001 -24.200012\nv 31.400017 24.200001 -26.200012\nv 33.400017 26.200001 -26.200012\nv 33.400017 26.200001 -24.200012\nv 31.400017 26.200001 -24.200012\nv 31.400017 26.200001 -26.200012\nv 1.000000 24.200001 -29.800014\nv 1.000000 24.200001 -27.800014\nv -1.000000 24.200001 -27.800014\nv -1.000000 24.200001 -29.800014\nv 1.000000 26.200001 -29.800014\nv 0.999999 26.200001 -27.800014\nv -1.000000 26.200001 -27.800014\nv -1.000000 26.200001 -29.800014\nv 4.600001 24.200001 -29.800014\nv 4.600001 24.200001 -27.800014\nv 2.600001 24.200001 -27.800014\nv 2.600002 24.200001 -29.800014\nv 4.600002 26.200001 -29.800014\nv 4.600001 26.200001 -27.800014\nv 2.600001 26.200001 -27.800014\nv 2.600002 26.200001 -29.800014\nv 8.200003 24.200001 -29.800014\nv 8.200003 24.200001 -27.800014\nv 6.200003 24.200001 -27.800014\nv 6.200004 24.200001 -29.800014\nv 8.200004 26.200001 -29.800014\nv 8.200003 26.200001 -27.800014\nv 6.200003 26.200001 -27.800014\nv 6.200003 26.200001 -29.800014\nv 11.800005 24.200001 -29.800014\nv 11.800005 24.200001 -27.800014\nv 9.800005 24.200001 -27.800014\nv 9.800005 24.200001 -29.800014\nv 11.800005 26.200001 -29.800014\nv 11.800004 26.200001 -27.800014\nv 9.800005 26.200001 -27.800014\nv 9.800005 26.200001 -29.800014\nv 15.400006 24.200001 -29.800014\nv 15.400006 24.200001 -27.800014\nv 13.400006 24.200001 -27.800014\nv 13.400006 24.200001 -29.800014\nv 15.400007 26.200001 -29.800014\nv 15.400005 26.200001 -27.800014\nv 13.400006 26.200001 -27.800014\nv 13.400006 26.200001 -29.800014\nv 19.000008 24.200001 -29.800014\nv 19.000008 24.200001 -27.800014\nv 17.000008 24.200001 -27.800014\nv 17.000008 24.200001 -29.800014\nv 19.000008 26.200001 -29.800014\nv 19.000008 26.200001 -27.800014\nv 17.000008 26.200001 -27.800014\nv 17.000008 26.200001 -29.800014\nv 22.600010 24.200001 -29.800014\nv 22.600010 24.200001 -27.800014\nv 20.600010 24.200001 -27.800014\nv 20.600010 24.200001 -29.800014\nv 22.600010 26.200001 -29.800014\nv 22.600010 26.200001 -27.800014\nv 20.600010 26.200001 -27.800014\nv 20.600010 26.200001 -29.800014\nv 26.200012 24.200001 -29.800014\nv 26.200012 24.200001 -27.800014\nv 24.200012 24.200001 -27.800014\nv 24.200012 24.200001 -29.800014\nv 26.200012 26.200001 -29.800014\nv 26.200012 26.200001 -27.800014\nv 24.200012 26.200001 -27.800014\nv 24.200012 26.200001 -29.800014\nv 29.800014 24.200001 -29.800014\nv 29.800014 24.200001 -27.800014\nv 27.800014 24.200001 -27.800014\nv 27.800014 24.200001 -29.800014\nv 29.800014 26.200001 -29.800014\nv 29.800014 26.200001 -27.800014\nv 27.800014 26.200001 -27.800014\nv 27.800014 26.200001 -29.800014\nv 33.400017 24.200001 -29.800014\nv 33.400017 24.200001 -27.800014\nv 31.400017 24.200001 -27.800014\nv 31.400017 24.200001 -29.800014\nv 33.400017 26.200001 -29.800014\nv 33.400017 26.200001 -27.800014\nv 31.400017 26.200001 -27.800014\nv 31.400017 26.200001 -29.800014\nv 1.000000 24.200001 -33.400017\nv 1.000000 24.200001 -31.400017\nv -1.000000 24.200001 -31.400017\nv -1.000000 24.200001 -33.400017\nv 1.000000 26.200001 -33.400017\nv 0.999999 26.200001 -31.400017\nv -1.000000 26.200001 -31.400017\nv -1.000000 26.200001 -33.400017\nv 4.600001 24.200001 -33.400017\nv 4.600001 24.200001 -31.400017\nv 2.600001 24.200001 -31.400017\nv 2.600002 24.200001 -33.400017\nv 4.600002 26.200001 -33.400017\nv 4.600001 26.200001 -31.400017\nv 2.600001 26.200001 -31.400017\nv 2.600002 26.200001 -33.400017\nv 8.200003 24.200001 -33.400017\nv 8.200003 24.200001 -31.400017\nv 6.200003 24.200001 -31.400017\nv 6.200004 24.200001 -33.400017\nv 8.200004 26.200001 -33.400017\nv 8.200003 26.200001 -31.400017\nv 6.200003 26.200001 -31.400017\nv 6.200003 26.200001 -33.400017\nv 11.800005 24.200001 -33.400017\nv 11.800005 24.200001 -31.400017\nv 9.800005 24.200001 -31.400017\nv 9.800005 24.200001 -33.400017\nv 11.800005 26.200001 -33.400017\nv 11.800004 26.200001 -31.400017\nv 9.800005 26.200001 -31.400017\nv 9.800005 26.200001 -33.400017\nv 15.400006 24.200001 -33.400017\nv 15.400006 24.200001 -31.400017\nv 13.400006 24.200001 -31.400017\nv 13.400006 24.200001 -33.400017\nv 15.400007 26.200001 -33.400017\nv 15.400005 26.200001 -31.400017\nv 13.400006 26.200001 -31.400017\nv 13.400006 26.200001 -33.400017\nv 19.000008 24.200001 -33.400017\nv 19.000008 24.200001 -31.400017\nv 17.000008 24.200001 -31.400017\nv 17.000008 24.200001 -33.400017\nv 19.000008 26.200001 -33.400017\nv 19.000008 26.200001 -31.400017\nv 17.000008 26.200001 -31.400017\nv 17.000008 26.200001 -33.400017\nv 22.600010 24.200001 -33.400017\nv 22.600010 24.200001 -31.400017\nv 20.600010 24.200001 -31.400017\nv 20.600010 24.200001 -33.400017\nv 22.600010 26.200001 -33.400017\nv 22.600010 26.200001 -31.400017\nv 20.600010 26.200001 -31.400017\nv 20.600010 26.200001 -33.400017\nv 26.200012 24.200001 -33.400017\nv 26.200012 24.200001 -31.400017\nv 24.200012 24.200001 -31.400017\nv 24.200012 24.200001 -33.400017\nv 26.200012 26.200001 -33.400017\nv 26.200012 26.200001 -31.400017\nv 24.200012 26.200001 -31.400017\nv 24.200012 26.200001 -33.400017\nv 29.800014 24.200001 -33.400017\nv 29.800014 24.200001 -31.400017\nv 27.800014 24.200001 -31.400017\nv 27.800014 24.200001 -33.400017\nv 29.800014 26.200001 -33.400017\nv 29.800014 26.200001 -31.400017\nv 27.800014 26.200001 -31.400017\nv 27.800014 26.200001 -33.400017\nv 33.400017 24.200001 -33.400017\nv 33.400017 24.200001 -31.400017\nv 31.400017 24.200001 -31.400017\nv 31.400017 24.200001 -33.400017\nv 33.400017 26.200001 -33.400017\nv 33.400017 26.200001 -31.400017\nv 31.400017 26.200001 -31.400017\nv 31.400017 26.200001 -33.400017\nv -1.000000 24.200001 -1.000000\nv -1.000000 24.200001 1.000000\nv 1.000000 24.200001 1.000000\nv 1.000000 24.200001 -1.000000\nv -1.000000 26.200001 -0.999999\nv -0.999999 26.200001 1.000001\nv 1.000000 26.200001 1.000000\nv 1.000000 26.200001 -1.000000\nv -4.600001 24.200001 -1.000000\nv -4.600001 24.200001 1.000000\nv -2.600001 24.200001 1.000000\nv -2.600002 24.200001 -1.000000\nv -4.600002 26.200001 -0.999999\nv -4.600001 26.200001 1.000001\nv -2.600001 26.200001 1.000000\nv -2.600002 26.200001 -1.000000\nv -8.200003 24.200001 -1.000000\nv -8.200003 24.200001 1.000000\nv -6.200003 24.200001 1.000000\nv -6.200004 24.200001 -1.000000\nv -8.200004 26.200001 -0.999999\nv -8.200003 26.200001 1.000001\nv -6.200003 26.200001 1.000000\nv -6.200003 26.200001 -1.000000\nv -11.800005 24.200001 -1.000000\nv -11.800005 24.200001 1.000000\nv -9.800005 24.200001 1.000000\nv -9.800005 24.200001 -1.000000\nv -11.800005 26.200001 -0.999999\nv -11.800004 26.200001 1.000001\nv -9.800005 26.200001 1.000000\nv -9.800005 26.200001 -1.000000\nv -15.400006 24.200001 -1.000000\nv -15.400006 24.200001 1.000000\nv -13.400006 24.200001 1.000000\nv -13.400006 24.200001 -1.000000\nv -15.400007 26.200001 -0.999999\nv -15.400005 26.200001 1.000001\nv -13.400006 26.200001 1.000000\nv -13.400006 26.200001 -1.000000\nv -19.000008 24.200001 -1.000000\nv -19.000008 24.200001 1.000000\nv -17.000008 24.200001 1.000000\nv -17.000008 24.200001 -1.000000\nv -19.000008 26.200001 -0.999999\nv -19.000008 26.200001 1.000001\nv -17.000008 26.200001 1.000000\nv -17.000008 26.200001 -1.000000\nv -22.600010 24.200001 -1.000000\nv -22.600010 24.200001 1.000000\nv -20.600010 24.200001 1.000000\nv -20.600010 24.200001 -1.000000\nv -22.600010 26.200001 -0.999999\nv -22.600010 26.200001 1.000001\nv -20.600010 26.200001 1.000000\nv -20.600010 26.200001 -1.000000\nv -26.200012 24.200001 -1.000000\nv -26.200012 24.200001 1.000000\nv -24.200012 24.200001 1.000000\nv -24.200012 24.200001 -1.000000\nv -26.200012 26.200001 -0.999999\nv -26.200012 26.200001 1.000001\nv -24.200012 26.200001 1.000000\nv -24.200012 26.200001 -1.000000\nv -29.800014 24.200001 -1.000000\nv -29.800014 24.200001 1.000000\nv -27.800014 24.200001 1.000000\nv -27.800014 24.200001 -1.000000\nv -29.800014 26.200001 -0.999999\nv -29.800014 26.200001 1.000001\nv -27.800014 26.200001 1.000000\nv -27.800014 26.200001 -1.000000\nv -33.400017 24.200001 -1.000000\nv -33.400017 24.200001 1.000000\nv -31.400017 24.200001 1.000000\nv -31.400017 24.200001 -1.000000\nv -33.400017 26.200001 -0.999999\nv -33.400017 26.200001 1.000001\nv -31.400017 26.200001 1.000000\nv -31.400017 26.200001 -1.000000\nv -1.000000 24.200001 -4.600001\nv -1.000000 24.200001 -2.600002\nv 1.000000 24.200001 -2.600002\nv 1.000000 24.200001 -4.600002\nv -1.000000 26.200001 -4.600001\nv -0.999999 26.200001 -2.600001\nv 1.000000 26.200001 -2.600002\nv 1.000000 26.200001 -4.600001\nv -4.600001 24.200001 -4.600001\nv -4.600001 24.200001 -2.600002\nv -2.600001 24.200001 -2.600002\nv -2.600002 24.200001 -4.600002\nv -4.600002 26.200001 -4.600001\nv -4.600001 26.200001 -2.600001\nv -2.600001 26.200001 -2.600002\nv -2.600002 26.200001 -4.600001\nv -8.200003 24.200001 -4.600001\nv -8.200003 24.200001 -2.600002\nv -6.200003 24.200001 -2.600002\nv -6.200004 24.200001 -4.600002\nv -8.200004 26.200001 -4.600001\nv -8.200003 26.200001 -2.600001\nv -6.200003 26.200001 -2.600002\nv -6.200003 26.200001 -4.600001\nv -11.800005 24.200001 -4.600001\nv -11.800005 24.200001 -2.600002\nv -9.800005 24.200001 -2.600002\nv -9.800005 24.200001 -4.600002\nv -11.800005 26.200001 -4.600001\nv -11.800004 26.200001 -2.600001\nv -9.800005 26.200001 -2.600002\nv -9.800005 26.200001 -4.600001\nv -15.400006 24.200001 -4.600001\nv -15.400006 24.200001 -2.600002\nv -13.400006 24.200001 -2.600002\nv -13.400006 24.200001 -4.600002\nv -15.400007 26.200001 -4.600001\nv -15.400005 26.200001 -2.600001\nv -13.400006 26.200001 -2.600002\nv -13.400006 26.200001 -4.600001\nv -19.000008 24.200001 -4.600001\nv -19.000008 24.200001 -2.600002\nv -17.000008 24.200001 -2.600002\nv -17.000008 24.200001 -4.600002\nv -19.000008 26.200001 -4.600001\nv -19.000008 26.200001 -2.600001\nv -17.000008 26.200001 -2.600002\nv -17.000008 26.200001 -4.600001\nv -22.600010 24.200001 -4.600001\nv -22.600010 24.200001 -2.600002\nv -20.600010 24.200001 -2.600002\nv -20.600010 24.200001 -4.600002\nv -22.600010 26.200001 -4.600001\nv -22.600010 26.200001 -2.600001\nv -20.600010 26.200001 -2.600002\nv -20.600010 26.200001 -4.600001\nv -26.200012 24.200001 -4.600001\nv -26.200012 24.200001 -2.600002\nv -24.200012 24.200001 -2.600002\nv -24.200012 24.200001 -4.600002\nv -26.200012 26.200001 -4.600001\nv -26.200012 26.200001 -2.600001\nv -24.200012 26.200001 -2.600002\nv -24.200012 26.200001 -4.600001\nv -29.800014 24.200001 -4.600001\nv -29.800014 24.200001 -2.600002\nv -27.800014 24.200001 -2.600002\nv -27.800014 24.200001 -4.600002\nv -29.800014 26.200001 -4.600001\nv -29.800014 26.200001 -2.600001\nv -27.800014 26.200001 -2.600002\nv -27.800014 26.200001 -4.600001\nv -33.400017 24.200001 -4.600001\nv -33.400017 24.200001 -2.600002\nv -31.400017 24.200001 -2.600002\nv -31.400017 24.200001 -4.600002\nv -33.400017 26.200001 -4.600001\nv -33.400017 26.200001 -2.600001\nv -31.400017 26.200001 -2.600002\nv -31.400017 26.200001 -4.600001\nv -1.000000 24.200001 -8.200003\nv -1.000000 24.200001 -6.200003\nv 1.000000 24.200001 -6.200003\nv 1.000000 24.200001 -8.200004\nv -1.000000 26.200001 -8.200003\nv -0.999999 26.200001 -6.200003\nv 1.000000 26.200001 -6.200004\nv 1.000000 26.200001 -8.200003\nv -4.600001 24.200001 -8.200003\nv -4.600001 24.200001 -6.200003\nv -2.600001 24.200001 -6.200003\nv -2.600002 24.200001 -8.200004\nv -4.600002 26.200001 -8.200003\nv -4.600001 26.200001 -6.200003\nv -2.600001 26.200001 -6.200004\nv -2.600002 26.200001 -8.200003\nv -8.200003 24.200001 -8.200003\nv -8.200003 24.200001 -6.200003\nv -6.200003 24.200001 -6.200003\nv -6.200004 24.200001 -8.200004\nv -8.200004 26.200001 -8.200003\nv -8.200003 26.200001 -6.200003\nv -6.200003 26.200001 -6.200004\nv -6.200003 26.200001 -8.200003\nv -11.800005 24.200001 -8.200003\nv -11.800005 24.200001 -6.200003\nv -9.800005 24.200001 -6.200003\nv -9.800005 24.200001 -8.200004\nv -11.800005 26.200001 -8.200003\nv -11.800004 26.200001 -6.200003\nv -9.800005 26.200001 -6.200004\nv -9.800005 26.200001 -8.200003\nv -15.400006 24.200001 -8.200003\nv -15.400006 24.200001 -6.200003\nv -13.400006 24.200001 -6.200003\nv -13.400006 24.200001 -8.200004\nv -15.400007 26.200001 -8.200003\nv -15.400005 26.200001 -6.200003\nv -13.400006 26.200001 -6.200004\nv -13.400006 26.200001 -8.200003\nv -19.000008 24.200001 -8.200003\nv -19.000008 24.200001 -6.200003\nv -17.000008 24.200001 -6.200003\nv -17.000008 24.200001 -8.200004\nv -19.000008 26.200001 -8.200003\nv -19.000008 26.200001 -6.200003\nv -17.000008 26.200001 -6.200004\nv -17.000008 26.200001 -8.200003\nv -22.600010 24.200001 -8.200003\nv -22.600010 24.200001 -6.200003\nv -20.600010 24.200001 -6.200003\nv -20.600010 24.200001 -8.200004\nv -22.600010 26.200001 -8.200003\nv -22.600010 26.200001 -6.200003\nv -20.600010 26.200001 -6.200004\nv -20.600010 26.200001 -8.200003\nv -26.200012 24.200001 -8.200003\nv -26.200012 24.200001 -6.200003\nv -24.200012 24.200001 -6.200003\nv -24.200012 24.200001 -8.200004\nv -26.200012 26.200001 -8.200003\nv -26.200012 26.200001 -6.200003\nv -24.200012 26.200001 -6.200004\nv -24.200012 26.200001 -8.200003\nv -29.800014 24.200001 -8.200003\nv -29.800014 24.200001 -6.200003\nv -27.800014 24.200001 -6.200003\nv -27.800014 24.200001 -8.200004\nv -29.800014 26.200001 -8.200003\nv -29.800014 26.200001 -6.200003\nv -27.800014 26.200001 -6.200004\nv -27.800014 26.200001 -8.200003\nv -33.400017 24.200001 -8.200003\nv -33.400017 24.200001 -6.200003\nv -31.400017 24.200001 -6.200003\nv -31.400017 24.200001 -8.200004\nv -33.400017 26.200001 -8.200003\nv -33.400017 26.200001 -6.200003\nv -31.400017 26.200001 -6.200004\nv -31.400017 26.200001 -8.200003\nv -1.000000 24.200001 -11.800005\nv -1.000000 24.200001 -9.800005\nv 1.000000 24.200001 -9.800005\nv 1.000000 24.200001 -11.800005\nv -1.000000 26.200001 -11.800004\nv -0.999999 26.200001 -9.800004\nv 1.000000 26.200001 -9.800005\nv 1.000000 26.200001 -11.800005\nv -4.600001 24.200001 -11.800005\nv -4.600001 24.200001 -9.800005\nv -2.600001 24.200001 -9.800005\nv -2.600002 24.200001 -11.800005\nv -4.600002 26.200001 -11.800004\nv -4.600001 26.200001 -9.800004\nv -2.600001 26.200001 -9.800005\nv -2.600002 26.200001 -11.800005\nv -8.200003 24.200001 -11.800005\nv -8.200003 24.200001 -9.800005\nv -6.200003 24.200001 -9.800005\nv -6.200004 24.200001 -11.800005\nv -8.200004 26.200001 -11.800004\nv -8.200003 26.200001 -9.800004\nv -6.200003 26.200001 -9.800005\nv -6.200003 26.200001 -11.800005\nv -11.800005 24.200001 -11.800005\nv -11.800005 24.200001 -9.800005\nv -9.800005 24.200001 -9.800005\nv -9.800005 24.200001 -11.800005\nv -11.800005 26.200001 -11.800004\nv -11.800004 26.200001 -9.800004\nv -9.800005 26.200001 -9.800005\nv -9.800005 26.200001 -11.800005\nv -15.400006 24.200001 -11.800005\nv -15.400006 24.200001 -9.800005\nv -13.400006 24.200001 -9.800005\nv -13.400006 24.200001 -11.800005\nv -15.400007 26.200001 -11.800004\nv -15.400005 26.200001 -9.800004\nv -13.400006 26.200001 -9.800005\nv -13.400006 26.200001 -11.800005\nv -19.000008 24.200001 -11.800005\nv -19.000008 24.200001 -9.800005\nv -17.000008 24.200001 -9.800005\nv -17.000008 24.200001 -11.800005\nv -19.000008 26.200001 -11.800004\nv -19.000008 26.200001 -9.800004\nv -17.000008 26.200001 -9.800005\nv -17.000008 26.200001 -11.800005\nv -22.600010 24.200001 -11.800005\nv -22.600010 24.200001 -9.800005\nv -20.600010 24.200001 -9.800005\nv -20.600010 24.200001 -11.800005\nv -22.600010 26.200001 -11.800004\nv -22.600010 26.200001 -9.800004\nv -20.600010 26.200001 -9.800005\nv -20.600010 26.200001 -11.800005\nv -26.200012 24.200001 -11.800005\nv -26.200012 24.200001 -9.800005\nv -24.200012 24.200001 -9.800005\nv -24.200012 24.200001 -11.800005\nv -26.200012 26.200001 -11.800004\nv -26.200012 26.200001 -9.800004\nv -24.200012 26.200001 -9.800005\nv -24.200012 26.200001 -11.800005\nv -29.800014 24.200001 -11.800005\nv -29.800014 24.200001 -9.800005\nv -27.800014 24.200001 -9.800005\nv -27.800014 24.200001 -11.800005\nv -29.800014 26.200001 -11.800004\nv -29.800014 26.200001 -9.800004\nv -27.800014 26.200001 -9.800005\nv -27.800014 26.200001 -11.800005\nv -33.400017 24.200001 -11.800005\nv -33.400017 24.200001 -9.800005\nv -31.400017 24.200001 -9.800005\nv -31.400017 24.200001 -11.800005\nv -33.400017 26.200001 -11.800004\nv -33.400017 26.200001 -9.800004\nv -31.400017 26.200001 -9.800005\nv -31.400017 26.200001 -11.800005\nv -1.000000 24.200001 -15.400006\nv -1.000000 24.200001 -13.400006\nv 1.000000 24.200001 -13.400006\nv 1.000000 24.200001 -15.400006\nv -1.000000 26.200001 -15.400005\nv -0.999999 26.200001 -13.400005\nv 1.000000 26.200001 -13.400006\nv 1.000000 26.200001 -15.400006\nv -4.600001 24.200001 -15.400006\nv -4.600001 24.200001 -13.400006\nv -2.600001 24.200001 -13.400006\nv -2.600002 24.200001 -15.400006\nv -4.600002 26.200001 -15.400005\nv -4.600001 26.200001 -13.400005\nv -2.600001 26.200001 -13.400006\nv -2.600002 26.200001 -15.400006\nv -8.200003 24.200001 -15.400006\nv -8.200003 24.200001 -13.400006\nv -6.200003 24.200001 -13.400006\nv -6.200004 24.200001 -15.400006\nv -8.200004 26.200001 -15.400005\nv -8.200003 26.200001 -13.400005\nv -6.200003 26.200001 -13.400006\nv -6.200003 26.200001 -15.400006\nv -11.800005 24.200001 -15.400006\nv -11.800005 24.200001 -13.400006\nv -9.800005 24.200001 -13.400006\nv -9.800005 24.200001 -15.400006\nv -11.800005 26.200001 -15.400005\nv -11.800004 26.200001 -13.400005\nv -9.800005 26.200001 -13.400006\nv -9.800005 26.200001 -15.400006\nv -15.400006 24.200001 -15.400006\nv -15.400006 24.200001 -13.400006\nv -13.400006 24.200001 -13.400006\nv -13.400006 24.200001 -15.400006\nv -15.400007 26.200001 -15.400005\nv -15.400005 26.200001 -13.400005\nv -13.400006 26.200001 -13.400006\nv -13.400006 26.200001 -15.400006\nv -19.000008 24.200001 -15.400006\nv -19.000008 24.200001 -13.400006\nv -17.000008 24.200001 -13.400006\nv -17.000008 24.200001 -15.400006\nv -19.000008 26.200001 -15.400005\nv -19.000008 26.200001 -13.400005\nv -17.000008 26.200001 -13.400006\nv -17.000008 26.200001 -15.400006\nv -22.600010 24.200001 -15.400006\nv -22.600010 24.200001 -13.400006\nv -20.600010 24.200001 -13.400006\nv -20.600010 24.200001 -15.400006\nv -22.600010 26.200001 -15.400005\nv -22.600010 26.200001 -13.400005\nv -20.600010 26.200001 -13.400006\nv -20.600010 26.200001 -15.400006\nv -26.200012 24.200001 -15.400006\nv -26.200012 24.200001 -13.400006\nv -24.200012 24.200001 -13.400006\nv -24.200012 24.200001 -15.400006\nv -26.200012 26.200001 -15.400005\nv -26.200012 26.200001 -13.400005\nv -24.200012 26.200001 -13.400006\nv -24.200012 26.200001 -15.400006\nv -29.800014 24.200001 -15.400006\nv -29.800014 24.200001 -13.400006\nv -27.800014 24.200001 -13.400006\nv -27.800014 24.200001 -15.400006\nv -29.800014 26.200001 -15.400005\nv -29.800014 26.200001 -13.400005\nv -27.800014 26.200001 -13.400006\nv -27.800014 26.200001 -15.400006\nv -33.400017 24.200001 -15.400006\nv -33.400017 24.200001 -13.400006\nv -31.400017 24.200001 -13.400006\nv -31.400017 24.200001 -15.400006\nv -33.400017 26.200001 -15.400005\nv -33.400017 26.200001 -13.400005\nv -31.400017 26.200001 -13.400006\nv -31.400017 26.200001 -15.400006\nv -1.000000 24.200001 -19.000008\nv -1.000000 24.200001 -17.000008\nv 1.000000 24.200001 -17.000008\nv 1.000000 24.200001 -19.000008\nv -1.000000 26.200001 -19.000008\nv -0.999999 26.200001 -17.000008\nv 1.000000 26.200001 -17.000008\nv 1.000000 26.200001 -19.000008\nv -4.600001 24.200001 -19.000008\nv -4.600001 24.200001 -17.000008\nv -2.600001 24.200001 -17.000008\nv -2.600002 24.200001 -19.000008\nv -4.600002 26.200001 -19.000008\nv -4.600001 26.200001 -17.000008\nv -2.600001 26.200001 -17.000008\nv -2.600002 26.200001 -19.000008\nv -8.200003 24.200001 -19.000008\nv -8.200003 24.200001 -17.000008\nv -6.200003 24.200001 -17.000008\nv -6.200004 24.200001 -19.000008\nv -8.200004 26.200001 -19.000008\nv -8.200003 26.200001 -17.000008\nv -6.200003 26.200001 -17.000008\nv -6.200003 26.200001 -19.000008\nv -11.800005 24.200001 -19.000008\nv -11.800005 24.200001 -17.000008\nv -9.800005 24.200001 -17.000008\nv -9.800005 24.200001 -19.000008\nv -11.800005 26.200001 -19.000008\nv -11.800004 26.200001 -17.000008\nv -9.800005 26.200001 -17.000008\nv -9.800005 26.200001 -19.000008\nv -15.400006 24.200001 -19.000008\nv -15.400006 24.200001 -17.000008\nv -13.400006 24.200001 -17.000008\nv -13.400006 24.200001 -19.000008\nv -15.400007 26.200001 -19.000008\nv -15.400005 26.200001 -17.000008\nv -13.400006 26.200001 -17.000008\nv -13.400006 26.200001 -19.000008\nv -19.000008 24.200001 -19.000008\nv -19.000008 24.200001 -17.000008\nv -17.000008 24.200001 -17.000008\nv -17.000008 24.200001 -19.000008\nv -19.000008 26.200001 -19.000008\nv -19.000008 26.200001 -17.000008\nv -17.000008 26.200001 -17.000008\nv -17.000008 26.200001 -19.000008\nv -22.600010 24.200001 -19.000008\nv -22.600010 24.200001 -17.000008\nv -20.600010 24.200001 -17.000008\nv -20.600010 24.200001 -19.000008\nv -22.600010 26.200001 -19.000008\nv -22.600010 26.200001 -17.000008\nv -20.600010 26.200001 -17.000008\nv -20.600010 26.200001 -19.000008\nv -26.200012 24.200001 -19.000008\nv -26.200012 24.200001 -17.000008\nv -24.200012 24.200001 -17.000008\nv -24.200012 24.200001 -19.000008\nv -26.200012 26.200001 -19.000008\nv -26.200012 26.200001 -17.000008\nv -24.200012 26.200001 -17.000008\nv -24.200012 26.200001 -19.000008\nv -29.800014 24.200001 -19.000008\nv -29.800014 24.200001 -17.000008\nv -27.800014 24.200001 -17.000008\nv -27.800014 24.200001 -19.000008\nv -29.800014 26.200001 -19.000008\nv -29.800014 26.200001 -17.000008\nv -27.800014 26.200001 -17.000008\nv -27.800014 26.200001 -19.000008\nv -33.400017 24.200001 -19.000008\nv -33.400017 24.200001 -17.000008\nv -31.400017 24.200001 -17.000008\nv -31.400017 24.200001 -19.000008\nv -33.400017 26.200001 -19.000008\nv -33.400017 26.200001 -17.000008\nv -31.400017 26.200001 -17.000008\nv -31.400017 26.200001 -19.000008\nv -1.000000 24.200001 -22.600010\nv -1.000000 24.200001 -20.600010\nv 1.000000 24.200001 -20.600010\nv 1.000000 24.200001 -22.600010\nv -1.000000 26.200001 -22.600010\nv -0.999999 26.200001 -20.600010\nv 1.000000 26.200001 -20.600010\nv 1.000000 26.200001 -22.600010\nv -4.600001 24.200001 -22.600010\nv -4.600001 24.200001 -20.600010\nv -2.600001 24.200001 -20.600010\nv -2.600002 24.200001 -22.600010\nv -4.600002 26.200001 -22.600010\nv -4.600001 26.200001 -20.600010\nv -2.600001 26.200001 -20.600010\nv -2.600002 26.200001 -22.600010\nv -8.200003 24.200001 -22.600010\nv -8.200003 24.200001 -20.600010\nv -6.200003 24.200001 -20.600010\nv -6.200004 24.200001 -22.600010\nv -8.200004 26.200001 -22.600010\nv -8.200003 26.200001 -20.600010\nv -6.200003 26.200001 -20.600010\nv -6.200003 26.200001 -22.600010\nv -11.800005 24.200001 -22.600010\nv -11.800005 24.200001 -20.600010\nv -9.800005 24.200001 -20.600010\nv -9.800005 24.200001 -22.600010\nv -11.800005 26.200001 -22.600010\nv -11.800004 26.200001 -20.600010\nv -9.800005 26.200001 -20.600010\nv -9.800005 26.200001 -22.600010\nv -15.400006 24.200001 -22.600010\nv -15.400006 24.200001 -20.600010\nv -13.400006 24.200001 -20.600010\nv -13.400006 24.200001 -22.600010\nv -15.400007 26.200001 -22.600010\nv -15.400005 26.200001 -20.600010\nv -13.400006 26.200001 -20.600010\nv -13.400006 26.200001 -22.600010\nv -19.000008 24.200001 -22.600010\nv -19.000008 24.200001 -20.600010\nv -17.000008 24.200001 -20.600010\nv -17.000008 24.200001 -22.600010\nv -19.000008 26.200001 -22.600010\nv -19.000008 26.200001 -20.600010\nv -17.000008 26.200001 -20.600010\nv -17.000008 26.200001 -22.600010\nv -22.600010 24.200001 -22.600010\nv -22.600010 24.200001 -20.600010\nv -20.600010 24.200001 -20.600010\nv -20.600010 24.200001 -22.600010\nv -22.600010 26.200001 -22.600010\nv -22.600010 26.200001 -20.600010\nv -20.600010 26.200001 -20.600010\nv -20.600010 26.200001 -22.600010\nv -26.200012 24.200001 -22.600010\nv -26.200012 24.200001 -20.600010\nv -24.200012 24.200001 -20.600010\nv -24.200012 24.200001 -22.600010\nv -26.200012 26.200001 -22.600010\nv -26.200012 26.200001 -20.600010\nv -24.200012 26.200001 -20.600010\nv -24.200012 26.200001 -22.600010\nv -29.800014 24.200001 -22.600010\nv -29.800014 24.200001 -20.600010\nv -27.800014 24.200001 -20.600010\nv -27.800014 24.200001 -22.600010\nv -29.800014 26.200001 -22.600010\nv -29.800014 26.200001 -20.600010\nv -27.800014 26.200001 -20.600010\nv -27.800014 26.200001 -22.600010\nv -33.400017 24.200001 -22.600010\nv -33.400017 24.200001 -20.600010\nv -31.400017 24.200001 -20.600010\nv -31.400017 24.200001 -22.600010\nv -33.400017 26.200001 -22.600010\nv -33.400017 26.200001 -20.600010\nv -31.400017 26.200001 -20.600010\nv -31.400017 26.200001 -22.600010\nv -1.000000 24.200001 -26.200012\nv -1.000000 24.200001 -24.200012\nv 1.000000 24.200001 -24.200012\nv 1.000000 24.200001 -26.200012\nv -1.000000 26.200001 -26.200012\nv -0.999999 26.200001 -24.200012\nv 1.000000 26.200001 -24.200012\nv 1.000000 26.200001 -26.200012\nv -4.600001 24.200001 -26.200012\nv -4.600001 24.200001 -24.200012\nv -2.600001 24.200001 -24.200012\nv -2.600002 24.200001 -26.200012\nv -4.600002 26.200001 -26.200012\nv -4.600001 26.200001 -24.200012\nv -2.600001 26.200001 -24.200012\nv -2.600002 26.200001 -26.200012\nv -8.200003 24.200001 -26.200012\nv -8.200003 24.200001 -24.200012\nv -6.200003 24.200001 -24.200012\nv -6.200004 24.200001 -26.200012\nv -8.200004 26.200001 -26.200012\nv -8.200003 26.200001 -24.200012\nv -6.200003 26.200001 -24.200012\nv -6.200003 26.200001 -26.200012\nv -11.800005 24.200001 -26.200012\nv -11.800005 24.200001 -24.200012\nv -9.800005 24.200001 -24.200012\nv -9.800005 24.200001 -26.200012\nv -11.800005 26.200001 -26.200012\nv -11.800004 26.200001 -24.200012\nv -9.800005 26.200001 -24.200012\nv -9.800005 26.200001 -26.200012\nv -15.400006 24.200001 -26.200012\nv -15.400006 24.200001 -24.200012\nv -13.400006 24.200001 -24.200012\nv -13.400006 24.200001 -26.200012\nv -15.400007 26.200001 -26.200012\nv -15.400005 26.200001 -24.200012\nv -13.400006 26.200001 -24.200012\nv -13.400006 26.200001 -26.200012\nv -19.000008 24.200001 -26.200012\nv -19.000008 24.200001 -24.200012\nv -17.000008 24.200001 -24.200012\nv -17.000008 24.200001 -26.200012\nv -19.000008 26.200001 -26.200012\nv -19.000008 26.200001 -24.200012\nv -17.000008 26.200001 -24.200012\nv -17.000008 26.200001 -26.200012\nv -22.600010 24.200001 -26.200012\nv -22.600010 24.200001 -24.200012\nv -20.600010 24.200001 -24.200012\nv -20.600010 24.200001 -26.200012\nv -22.600010 26.200001 -26.200012\nv -22.600010 26.200001 -24.200012\nv -20.600010 26.200001 -24.200012\nv -20.600010 26.200001 -26.200012\nv -26.200012 24.200001 -26.200012\nv -26.200012 24.200001 -24.200012\nv -24.200012 24.200001 -24.200012\nv -24.200012 24.200001 -26.200012\nv -26.200012 26.200001 -26.200012\nv -26.200012 26.200001 -24.200012\nv -24.200012 26.200001 -24.200012\nv -24.200012 26.200001 -26.200012\nv -29.800014 24.200001 -26.200012\nv -29.800014 24.200001 -24.200012\nv -27.800014 24.200001 -24.200012\nv -27.800014 24.200001 -26.200012\nv -29.800014 26.200001 -26.200012\nv -29.800014 26.200001 -24.200012\nv -27.800014 26.200001 -24.200012\nv -27.800014 26.200001 -26.200012\nv -33.400017 24.200001 -26.200012\nv -33.400017 24.200001 -24.200012\nv -31.400017 24.200001 -24.200012\nv -31.400017 24.200001 -26.200012\nv -33.400017 26.200001 -26.200012\nv -33.400017 26.200001 -24.200012\nv -31.400017 26.200001 -24.200012\nv -31.400017 26.200001 -26.200012\nv -1.000000 24.200001 -29.800014\nv -1.000000 24.200001 -27.800014\nv 1.000000 24.200001 -27.800014\nv 1.000000 24.200001 -29.800014\nv -1.000000 26.200001 -29.800014\nv -0.999999 26.200001 -27.800014\nv 1.000000 26.200001 -27.800014\nv 1.000000 26.200001 -29.800014\nv -4.600001 24.200001 -29.800014\nv -4.600001 24.200001 -27.800014\nv -2.600001 24.200001 -27.800014\nv -2.600002 24.200001 -29.800014\nv -4.600002 26.200001 -29.800014\nv -4.600001 26.200001 -27.800014\nv -2.600001 26.200001 -27.800014\nv -2.600002 26.200001 -29.800014\nv -8.200003 24.200001 -29.800014\nv -8.200003 24.200001 -27.800014\nv -6.200003 24.200001 -27.800014\nv -6.200004 24.200001 -29.800014\nv -8.200004 26.200001 -29.800014\nv -8.200003 26.200001 -27.800014\nv -6.200003 26.200001 -27.800014\nv -6.200003 26.200001 -29.800014\nv -11.800005 24.200001 -29.800014\nv -11.800005 24.200001 -27.800014\nv -9.800005 24.200001 -27.800014\nv -9.800005 24.200001 -29.800014\nv -11.800005 26.200001 -29.800014\nv -11.800004 26.200001 -27.800014\nv -9.800005 26.200001 -27.800014\nv -9.800005 26.200001 -29.800014\nv -15.400006 24.200001 -29.800014\nv -15.400006 24.200001 -27.800014\nv -13.400006 24.200001 -27.800014\nv -13.400006 24.200001 -29.800014\nv -15.400007 26.200001 -29.800014\nv -15.400005 26.200001 -27.800014\nv -13.400006 26.200001 -27.800014\nv -13.400006 26.200001 -29.800014\nv -19.000008 24.200001 -29.800014\nv -19.000008 24.200001 -27.800014\nv -17.000008 24.200001 -27.800014\nv -17.000008 24.200001 -29.800014\nv -19.000008 26.200001 -29.800014\nv -19.000008 26.200001 -27.800014\nv -17.000008 26.200001 -27.800014\nv -17.000008 26.200001 -29.800014\nv -22.600010 24.200001 -29.800014\nv -22.600010 24.200001 -27.800014\nv -20.600010 24.200001 -27.800014\nv -20.600010 24.200001 -29.800014\nv -22.600010 26.200001 -29.800014\nv -22.600010 26.200001 -27.800014\nv -20.600010 26.200001 -27.800014\nv -20.600010 26.200001 -29.800014\nv -26.200012 24.200001 -29.800014\nv -26.200012 24.200001 -27.800014\nv -24.200012 24.200001 -27.800014\nv -24.200012 24.200001 -29.800014\nv -26.200012 26.200001 -29.800014\nv -26.200012 26.200001 -27.800014\nv -24.200012 26.200001 -27.800014\nv -24.200012 26.200001 -29.800014\nv -29.800014 24.200001 -29.800014\nv -29.800014 24.200001 -27.800014\nv -27.800014 24.200001 -27.800014\nv -27.800014 24.200001 -29.800014\nv -29.800014 26.200001 -29.800014\nv -29.800014 26.200001 -27.800014\nv -27.800014 26.200001 -27.800014\nv -27.800014 26.200001 -29.800014\nv -33.400017 24.200001 -29.800014\nv -33.400017 24.200001 -27.800014\nv -31.400017 24.200001 -27.800014\nv -31.400017 24.200001 -29.800014\nv -33.400017 26.200001 -29.800014\nv -33.400017 26.200001 -27.800014\nv -31.400017 26.200001 -27.800014\nv -31.400017 26.200001 -29.800014\nv -1.000000 24.200001 -33.400017\nv -1.000000 24.200001 -31.400017\nv 1.000000 24.200001 -31.400017\nv 1.000000 24.200001 -33.400017\nv -1.000000 26.200001 -33.400017\nv -0.999999 26.200001 -31.400017\nv 1.000000 26.200001 -31.400017\nv 1.000000 26.200001 -33.400017\nv -4.600001 24.200001 -33.400017\nv -4.600001 24.200001 -31.400017\nv -2.600001 24.200001 -31.400017\nv -2.600002 24.200001 -33.400017\nv -4.600002 26.200001 -33.400017\nv -4.600001 26.200001 -31.400017\nv -2.600001 26.200001 -31.400017\nv -2.600002 26.200001 -33.400017\nv -8.200003 24.200001 -33.400017\nv -8.200003 24.200001 -31.400017\nv -6.200003 24.200001 -31.400017\nv -6.200004 24.200001 -33.400017\nv -8.200004 26.200001 -33.400017\nv -8.200003 26.200001 -31.400017\nv -6.200003 26.200001 -31.400017\nv -6.200003 26.200001 -33.400017\nv -11.800005 24.200001 -33.400017\nv -11.800005 24.200001 -31.400017\nv -9.800005 24.200001 -31.400017\nv -9.800005 24.200001 -33.400017\nv -11.800005 26.200001 -33.400017\nv -11.800004 26.200001 -31.400017\nv -9.800005 26.200001 -31.400017\nv -9.800005 26.200001 -33.400017\nv -15.400006 24.200001 -33.400017\nv -15.400006 24.200001 -31.400017\nv -13.400006 24.200001 -31.400017\nv -13.400006 24.200001 -33.400017\nv -15.400007 26.200001 -33.400017\nv -15.400005 26.200001 -31.400017\nv -13.400006 26.200001 -31.400017\nv -13.400006 26.200001 -33.400017\nv -19.000008 24.200001 -33.400017\nv -19.000008 24.200001 -31.400017\nv -17.000008 24.200001 -31.400017\nv -17.000008 24.200001 -33.400017\nv -19.000008 26.200001 -33.400017\nv -19.000008 26.200001 -31.400017\nv -17.000008 26.200001 -31.400017\nv -17.000008 26.200001 -33.400017\nv -22.600010 24.200001 -33.400017\nv -22.600010 24.200001 -31.400017\nv -20.600010 24.200001 -31.400017\nv -20.600010 24.200001 -33.400017\nv -22.600010 26.200001 -33.400017\nv -22.600010 26.200001 -31.400017\nv -20.600010 26.200001 -31.400017\nv -20.600010 26.200001 -33.400017\nv -26.200012 24.200001 -33.400017\nv -26.200012 24.200001 -31.400017\nv -24.200012 24.200001 -31.400017\nv -24.200012 24.200001 -33.400017\nv -26.200012 26.200001 -33.400017\nv -26.200012 26.200001 -31.400017\nv -24.200012 26.200001 -31.400017\nv -24.200012 26.200001 -33.400017\nv -29.800014 24.200001 -33.400017\nv -29.800014 24.200001 -31.400017\nv -27.800014 24.200001 -31.400017\nv -27.800014 24.200001 -33.400017\nv -29.800014 26.200001 -33.400017\nv -29.800014 26.200001 -31.400017\nv -27.800014 26.200001 -31.400017\nv -27.800014 26.200001 -33.400017\nv -33.400017 24.200001 -33.400017\nv -33.400017 24.200001 -31.400017\nv -31.400017 24.200001 -31.400017\nv -31.400017 24.200001 -33.400017\nv -33.400017 26.200001 -33.400017\nv -33.400017 26.200001 -31.400017\nv -31.400017 26.200001 -31.400017\nv -31.400017 26.200001 -33.400017\nv 1.000000 27.800001 -1.000000\nv 1.000000 27.800001 1.000000\nv -1.000000 27.800001 1.000000\nv -1.000000 27.800001 -1.000000\nv 1.000000 29.800001 -0.999999\nv 0.999999 29.800001 1.000001\nv -1.000000 29.800001 1.000000\nv -1.000000 29.800001 -1.000000\nv 4.600001 27.800001 -1.000000\nv 4.600001 27.800001 1.000000\nv 2.600001 27.800001 1.000000\nv 2.600002 27.800001 -1.000000\nv 4.600002 29.800001 -0.999999\nv 4.600001 29.800001 1.000001\nv 2.600001 29.800001 1.000000\nv 2.600002 29.800001 -1.000000\nv 8.200003 27.800001 -1.000000\nv 8.200003 27.800001 1.000000\nv 6.200003 27.800001 1.000000\nv 6.200004 27.800001 -1.000000\nv 8.200004 29.800001 -0.999999\nv 8.200003 29.800001 1.000001\nv 6.200003 29.800001 1.000000\nv 6.200003 29.800001 -1.000000\nv 11.800005 27.800001 -1.000000\nv 11.800005 27.800001 1.000000\nv 9.800005 27.800001 1.000000\nv 9.800005 27.800001 -1.000000\nv 11.800005 29.800001 -0.999999\nv 11.800004 29.800001 1.000001\nv 9.800005 29.800001 1.000000\nv 9.800005 29.800001 -1.000000\nv 15.400006 27.800001 -1.000000\nv 15.400006 27.800001 1.000000\nv 13.400006 27.800001 1.000000\nv 13.400006 27.800001 -1.000000\nv 15.400007 29.800001 -0.999999\nv 15.400005 29.800001 1.000001\nv 13.400006 29.800001 1.000000\nv 13.400006 29.800001 -1.000000\nv 19.000008 27.800001 -1.000000\nv 19.000008 27.800001 1.000000\nv 17.000008 27.800001 1.000000\nv 17.000008 27.800001 -1.000000\nv 19.000008 29.800001 -0.999999\nv 19.000008 29.800001 1.000001\nv 17.000008 29.800001 1.000000\nv 17.000008 29.800001 -1.000000\nv 22.600010 27.800001 -1.000000\nv 22.600010 27.800001 1.000000\nv 20.600010 27.800001 1.000000\nv 20.600010 27.800001 -1.000000\nv 22.600010 29.800001 -0.999999\nv 22.600010 29.800001 1.000001\nv 20.600010 29.800001 1.000000\nv 20.600010 29.800001 -1.000000\nv 26.200012 27.800001 -1.000000\nv 26.200012 27.800001 1.000000\nv 24.200012 27.800001 1.000000\nv 24.200012 27.800001 -1.000000\nv 26.200012 29.800001 -0.999999\nv 26.200012 29.800001 1.000001\nv 24.200012 29.800001 1.000000\nv 24.200012 29.800001 -1.000000\nv 29.800014 27.800001 -1.000000\nv 29.800014 27.800001 1.000000\nv 27.800014 27.800001 1.000000\nv 27.800014 27.800001 -1.000000\nv 29.800014 29.800001 -0.999999\nv 29.800014 29.800001 1.000001\nv 27.800014 29.800001 1.000000\nv 27.800014 29.800001 -1.000000\nv 33.400017 27.800001 -1.000000\nv 33.400017 27.800001 1.000000\nv 31.400017 27.800001 1.000000\nv 31.400017 27.800001 -1.000000\nv 33.400017 29.800001 -0.999999\nv 33.400017 29.800001 1.000001\nv 31.400017 29.800001 1.000000\nv 31.400017 29.800001 -1.000000\nv 1.000000 27.800001 -4.600001\nv 1.000000 27.800001 -2.600002\nv -1.000000 27.800001 -2.600002\nv -1.000000 27.800001 -4.600002\nv 1.000000 29.800001 -4.600001\nv 0.999999 29.800001 -2.600001\nv -1.000000 29.800001 -2.600002\nv -1.000000 29.800001 -4.600001\nv 4.600001 27.800001 -4.600001\nv 4.600001 27.800001 -2.600002\nv 2.600001 27.800001 -2.600002\nv 2.600002 27.800001 -4.600002\nv 4.600002 29.800001 -4.600001\nv 4.600001 29.800001 -2.600001\nv 2.600001 29.800001 -2.600002\nv 2.600002 29.800001 -4.600001\nv 8.200003 27.800001 -4.600001\nv 8.200003 27.800001 -2.600002\nv 6.200003 27.800001 -2.600002\nv 6.200004 27.800001 -4.600002\nv 8.200004 29.800001 -4.600001\nv 8.200003 29.800001 -2.600001\nv 6.200003 29.800001 -2.600002\nv 6.200003 29.800001 -4.600001\nv 11.800005 27.800001 -4.600001\nv 11.800005 27.800001 -2.600002\nv 9.800005 27.800001 -2.600002\nv 9.800005 27.800001 -4.600002\nv 11.800005 29.800001 -4.600001\nv 11.800004 29.800001 -2.600001\nv 9.800005 29.800001 -2.600002\nv 9.800005 29.800001 -4.600001\nv 15.400006 27.800001 -4.600001\nv 15.400006 27.800001 -2.600002\nv 13.400006 27.800001 -2.600002\nv 13.400006 27.800001 -4.600002\nv 15.400007 29.800001 -4.600001\nv 15.400005 29.800001 -2.600001\nv 13.400006 29.800001 -2.600002\nv 13.400006 29.800001 -4.600001\nv 19.000008 27.800001 -4.600001\nv 19.000008 27.800001 -2.600002\nv 17.000008 27.800001 -2.600002\nv 17.000008 27.800001 -4.600002\nv 19.000008 29.800001 -4.600001\nv 19.000008 29.800001 -2.600001\nv 17.000008 29.800001 -2.600002\nv 17.000008 29.800001 -4.600001\nv 22.600010 27.800001 -4.600001\nv 22.600010 27.800001 -2.600002\nv 20.600010 27.800001 -2.600002\nv 20.600010 27.800001 -4.600002\nv 22.600010 29.800001 -4.600001\nv 22.600010 29.800001 -2.600001\nv 20.600010 29.800001 -2.600002\nv 20.600010 29.800001 -4.600001\nv 26.200012 27.800001 -4.600001\nv 26.200012 27.800001 -2.600002\nv 24.200012 27.800001 -2.600002\nv 24.200012 27.800001 -4.600002\nv 26.200012 29.800001 -4.600001\nv 26.200012 29.800001 -2.600001\nv 24.200012 29.800001 -2.600002\nv 24.200012 29.800001 -4.600001\nv 29.800014 27.800001 -4.600001\nv 29.800014 27.800001 -2.600002\nv 27.800014 27.800001 -2.600002\nv 27.800014 27.800001 -4.600002\nv 29.800014 29.800001 -4.600001\nv 29.800014 29.800001 -2.600001\nv 27.800014 29.800001 -2.600002\nv 27.800014 29.800001 -4.600001\nv 33.400017 27.800001 -4.600001\nv 33.400017 27.800001 -2.600002\nv 31.400017 27.800001 -2.600002\nv 31.400017 27.800001 -4.600002\nv 33.400017 29.800001 -4.600001\nv 33.400017 29.800001 -2.600001\nv 31.400017 29.800001 -2.600002\nv 31.400017 29.800001 -4.600001\nv 1.000000 27.800001 -8.200003\nv 1.000000 27.800001 -6.200003\nv -1.000000 27.800001 -6.200003\nv -1.000000 27.800001 -8.200004\nv 1.000000 29.800001 -8.200003\nv 0.999999 29.800001 -6.200003\nv -1.000000 29.800001 -6.200004\nv -1.000000 29.800001 -8.200003\nv 4.600001 27.800001 -8.200003\nv 4.600001 27.800001 -6.200003\nv 2.600001 27.800001 -6.200003\nv 2.600002 27.800001 -8.200004\nv 4.600002 29.800001 -8.200003\nv 4.600001 29.800001 -6.200003\nv 2.600001 29.800001 -6.200004\nv 2.600002 29.800001 -8.200003\nv 8.200003 27.800001 -8.200003\nv 8.200003 27.800001 -6.200003\nv 6.200003 27.800001 -6.200003\nv 6.200004 27.800001 -8.200004\nv 8.200004 29.800001 -8.200003\nv 8.200003 29.800001 -6.200003\nv 6.200003 29.800001 -6.200004\nv 6.200003 29.800001 -8.200003\nv 11.800005 27.800001 -8.200003\nv 11.800005 27.800001 -6.200003\nv 9.800005 27.800001 -6.200003\nv 9.800005 27.800001 -8.200004\nv 11.800005 29.800001 -8.200003\nv 11.800004 29.800001 -6.200003\nv 9.800005 29.800001 -6.200004\nv 9.800005 29.800001 -8.200003\nv 15.400006 27.800001 -8.200003\nv 15.400006 27.800001 -6.200003\nv 13.400006 27.800001 -6.200003\nv 13.400006 27.800001 -8.200004\nv 15.400007 29.800001 -8.200003\nv 15.400005 29.800001 -6.200003\nv 13.400006 29.800001 -6.200004\nv 13.400006 29.800001 -8.200003\nv 19.000008 27.800001 -8.200003\nv 19.000008 27.800001 -6.200003\nv 17.000008 27.800001 -6.200003\nv 17.000008 27.800001 -8.200004\nv 19.000008 29.800001 -8.200003\nv 19.000008 29.800001 -6.200003\nv 17.000008 29.800001 -6.200004\nv 17.000008 29.800001 -8.200003\nv 22.600010 27.800001 -8.200003\nv 22.600010 27.800001 -6.200003\nv 20.600010 27.800001 -6.200003\nv 20.600010 27.800001 -8.200004\nv 22.600010 29.800001 -8.200003\nv 22.600010 29.800001 -6.200003\nv 20.600010 29.800001 -6.200004\nv 20.600010 29.800001 -8.200003\nv 26.200012 27.800001 -8.200003\nv 26.200012 27.800001 -6.200003\nv 24.200012 27.800001 -6.200003\nv 24.200012 27.800001 -8.200004\nv 26.200012 29.800001 -8.200003\nv 26.200012 29.800001 -6.200003\nv 24.200012 29.800001 -6.200004\nv 24.200012 29.800001 -8.200003\nv 29.800014 27.800001 -8.200003\nv 29.800014 27.800001 -6.200003\nv 27.800014 27.800001 -6.200003\nv 27.800014 27.800001 -8.200004\nv 29.800014 29.800001 -8.200003\nv 29.800014 29.800001 -6.200003\nv 27.800014 29.800001 -6.200004\nv 27.800014 29.800001 -8.200003\nv 33.400017 27.800001 -8.200003\nv 33.400017 27.800001 -6.200003\nv 31.400017 27.800001 -6.200003\nv 31.400017 27.800001 -8.200004\nv 33.400017 29.800001 -8.200003\nv 33.400017 29.800001 -6.200003\nv 31.400017 29.800001 -6.200004\nv 31.400017 29.800001 -8.200003\nv 1.000000 27.800001 -11.800005\nv 1.000000 27.800001 -9.800005\nv -1.000000 27.800001 -9.800005\nv -1.000000 27.800001 -11.800005\nv 1.000000 29.800001 -11.800004\nv 0.999999 29.800001 -9.800004\nv -1.000000 29.800001 -9.800005\nv -1.000000 29.800001 -11.800005\nv 4.600001 27.800001 -11.800005\nv 4.600001 27.800001 -9.800005\nv 2.600001 27.800001 -9.800005\nv 2.600002 27.800001 -11.800005\nv 4.600002 29.800001 -11.800004\nv 4.600001 29.800001 -9.800004\nv 2.600001 29.800001 -9.800005\nv 2.600002 29.800001 -11.800005\nv 8.200003 27.800001 -11.800005\nv 8.200003 27.800001 -9.800005\nv 6.200003 27.800001 -9.800005\nv 6.200004 27.800001 -11.800005\nv 8.200004 29.800001 -11.800004\nv 8.200003 29.800001 -9.800004\nv 6.200003 29.800001 -9.800005\nv 6.200003 29.800001 -11.800005\nv 11.800005 27.800001 -11.800005\nv 11.800005 27.800001 -9.800005\nv 9.800005 27.800001 -9.800005\nv 9.800005 27.800001 -11.800005\nv 11.800005 29.800001 -11.800004\nv 11.800004 29.800001 -9.800004\nv 9.800005 29.800001 -9.800005\nv 9.800005 29.800001 -11.800005\nv 15.400006 27.800001 -11.800005\nv 15.400006 27.800001 -9.800005\nv 13.400006 27.800001 -9.800005\nv 13.400006 27.800001 -11.800005\nv 15.400007 29.800001 -11.800004\nv 15.400005 29.800001 -9.800004\nv 13.400006 29.800001 -9.800005\nv 13.400006 29.800001 -11.800005\nv 19.000008 27.800001 -11.800005\nv 19.000008 27.800001 -9.800005\nv 17.000008 27.800001 -9.800005\nv 17.000008 27.800001 -11.800005\nv 19.000008 29.800001 -11.800004\nv 19.000008 29.800001 -9.800004\nv 17.000008 29.800001 -9.800005\nv 17.000008 29.800001 -11.800005\nv 22.600010 27.800001 -11.800005\nv 22.600010 27.800001 -9.800005\nv 20.600010 27.800001 -9.800005\nv 20.600010 27.800001 -11.800005\nv 22.600010 29.800001 -11.800004\nv 22.600010 29.800001 -9.800004\nv 20.600010 29.800001 -9.800005\nv 20.600010 29.800001 -11.800005\nv 26.200012 27.800001 -11.800005\nv 26.200012 27.800001 -9.800005\nv 24.200012 27.800001 -9.800005\nv 24.200012 27.800001 -11.800005\nv 26.200012 29.800001 -11.800004\nv 26.200012 29.800001 -9.800004\nv 24.200012 29.800001 -9.800005\nv 24.200012 29.800001 -11.800005\nv 29.800014 27.800001 -11.800005\nv 29.800014 27.800001 -9.800005\nv 27.800014 27.800001 -9.800005\nv 27.800014 27.800001 -11.800005\nv 29.800014 29.800001 -11.800004\nv 29.800014 29.800001 -9.800004\nv 27.800014 29.800001 -9.800005\nv 27.800014 29.800001 -11.800005\nv 33.400017 27.800001 -11.800005\nv 33.400017 27.800001 -9.800005\nv 31.400017 27.800001 -9.800005\nv 31.400017 27.800001 -11.800005\nv 33.400017 29.800001 -11.800004\nv 33.400017 29.800001 -9.800004\nv 31.400017 29.800001 -9.800005\nv 31.400017 29.800001 -11.800005\nv 1.000000 27.800001 -15.400006\nv 1.000000 27.800001 -13.400006\nv -1.000000 27.800001 -13.400006\nv -1.000000 27.800001 -15.400006\nv 1.000000 29.800001 -15.400005\nv 0.999999 29.800001 -13.400005\nv -1.000000 29.800001 -13.400006\nv -1.000000 29.800001 -15.400006\nv 4.600001 27.800001 -15.400006\nv 4.600001 27.800001 -13.400006\nv 2.600001 27.800001 -13.400006\nv 2.600002 27.800001 -15.400006\nv 4.600002 29.800001 -15.400005\nv 4.600001 29.800001 -13.400005\nv 2.600001 29.800001 -13.400006\nv 2.600002 29.800001 -15.400006\nv 8.200003 27.800001 -15.400006\nv 8.200003 27.800001 -13.400006\nv 6.200003 27.800001 -13.400006\nv 6.200004 27.800001 -15.400006\nv 8.200004 29.800001 -15.400005\nv 8.200003 29.800001 -13.400005\nv 6.200003 29.800001 -13.400006\nv 6.200003 29.800001 -15.400006\nv 11.800005 27.800001 -15.400006\nv 11.800005 27.800001 -13.400006\nv 9.800005 27.800001 -13.400006\nv 9.800005 27.800001 -15.400006\nv 11.800005 29.800001 -15.400005\nv 11.800004 29.800001 -13.400005\nv 9.800005 29.800001 -13.400006\nv 9.800005 29.800001 -15.400006\nv 15.400006 27.800001 -15.400006\nv 15.400006 27.800001 -13.400006\nv 13.400006 27.800001 -13.400006\nv 13.400006 27.800001 -15.400006\nv 15.400007 29.800001 -15.400005\nv 15.400005 29.800001 -13.400005\nv 13.400006 29.800001 -13.400006\nv 13.400006 29.800001 -15.400006\nv 19.000008 27.800001 -15.400006\nv 19.000008 27.800001 -13.400006\nv 17.000008 27.800001 -13.400006\nv 17.000008 27.800001 -15.400006\nv 19.000008 29.800001 -15.400005\nv 19.000008 29.800001 -13.400005\nv 17.000008 29.800001 -13.400006\nv 17.000008 29.800001 -15.400006\nv 22.600010 27.800001 -15.400006\nv 22.600010 27.800001 -13.400006\nv 20.600010 27.800001 -13.400006\nv 20.600010 27.800001 -15.400006\nv 22.600010 29.800001 -15.400005\nv 22.600010 29.800001 -13.400005\nv 20.600010 29.800001 -13.400006\nv 20.600010 29.800001 -15.400006\nv 26.200012 27.800001 -15.400006\nv 26.200012 27.800001 -13.400006\nv 24.200012 27.800001 -13.400006\nv 24.200012 27.800001 -15.400006\nv 26.200012 29.800001 -15.400005\nv 26.200012 29.800001 -13.400005\nv 24.200012 29.800001 -13.400006\nv 24.200012 29.800001 -15.400006\nv 29.800014 27.800001 -15.400006\nv 29.800014 27.800001 -13.400006\nv 27.800014 27.800001 -13.400006\nv 27.800014 27.800001 -15.400006\nv 29.800014 29.800001 -15.400005\nv 29.800014 29.800001 -13.400005\nv 27.800014 29.800001 -13.400006\nv 27.800014 29.800001 -15.400006\nv 33.400017 27.800001 -15.400006\nv 33.400017 27.800001 -13.400006\nv 31.400017 27.800001 -13.400006\nv 31.400017 27.800001 -15.400006\nv 33.400017 29.800001 -15.400005\nv 33.400017 29.800001 -13.400005\nv 31.400017 29.800001 -13.400006\nv 31.400017 29.800001 -15.400006\nv 1.000000 27.800001 -19.000008\nv 1.000000 27.800001 -17.000008\nv -1.000000 27.800001 -17.000008\nv -1.000000 27.800001 -19.000008\nv 1.000000 29.800001 -19.000008\nv 0.999999 29.800001 -17.000008\nv -1.000000 29.800001 -17.000008\nv -1.000000 29.800001 -19.000008\nv 4.600001 27.800001 -19.000008\nv 4.600001 27.800001 -17.000008\nv 2.600001 27.800001 -17.000008\nv 2.600002 27.800001 -19.000008\nv 4.600002 29.800001 -19.000008\nv 4.600001 29.800001 -17.000008\nv 2.600001 29.800001 -17.000008\nv 2.600002 29.800001 -19.000008\nv 8.200003 27.800001 -19.000008\nv 8.200003 27.800001 -17.000008\nv 6.200003 27.800001 -17.000008\nv 6.200004 27.800001 -19.000008\nv 8.200004 29.800001 -19.000008\nv 8.200003 29.800001 -17.000008\nv 6.200003 29.800001 -17.000008\nv 6.200003 29.800001 -19.000008\nv 11.800005 27.800001 -19.000008\nv 11.800005 27.800001 -17.000008\nv 9.800005 27.800001 -17.000008\nv 9.800005 27.800001 -19.000008\nv 11.800005 29.800001 -19.000008\nv 11.800004 29.800001 -17.000008\nv 9.800005 29.800001 -17.000008\nv 9.800005 29.800001 -19.000008\nv 15.400006 27.800001 -19.000008\nv 15.400006 27.800001 -17.000008\nv 13.400006 27.800001 -17.000008\nv 13.400006 27.800001 -19.000008\nv 15.400007 29.800001 -19.000008\nv 15.400005 29.800001 -17.000008\nv 13.400006 29.800001 -17.000008\nv 13.400006 29.800001 -19.000008\nv 19.000008 27.800001 -19.000008\nv 19.000008 27.800001 -17.000008\nv 17.000008 27.800001 -17.000008\nv 17.000008 27.800001 -19.000008\nv 19.000008 29.800001 -19.000008\nv 19.000008 29.800001 -17.000008\nv 17.000008 29.800001 -17.000008\nv 17.000008 29.800001 -19.000008\nv 22.600010 27.800001 -19.000008\nv 22.600010 27.800001 -17.000008\nv 20.600010 27.800001 -17.000008\nv 20.600010 27.800001 -19.000008\nv 22.600010 29.800001 -19.000008\nv 22.600010 29.800001 -17.000008\nv 20.600010 29.800001 -17.000008\nv 20.600010 29.800001 -19.000008\nv 26.200012 27.800001 -19.000008\nv 26.200012 27.800001 -17.000008\nv 24.200012 27.800001 -17.000008\nv 24.200012 27.800001 -19.000008\nv 26.200012 29.800001 -19.000008\nv 26.200012 29.800001 -17.000008\nv 24.200012 29.800001 -17.000008\nv 24.200012 29.800001 -19.000008\nv 29.800014 27.800001 -19.000008\nv 29.800014 27.800001 -17.000008\nv 27.800014 27.800001 -17.000008\nv 27.800014 27.800001 -19.000008\nv 29.800014 29.800001 -19.000008\nv 29.800014 29.800001 -17.000008\nv 27.800014 29.800001 -17.000008\nv 27.800014 29.800001 -19.000008\nv 33.400017 27.800001 -19.000008\nv 33.400017 27.800001 -17.000008\nv 31.400017 27.800001 -17.000008\nv 31.400017 27.800001 -19.000008\nv 33.400017 29.800001 -19.000008\nv 33.400017 29.800001 -17.000008\nv 31.400017 29.800001 -17.000008\nv 31.400017 29.800001 -19.000008\nv 1.000000 27.800001 -22.600010\nv 1.000000 27.800001 -20.600010\nv -1.000000 27.800001 -20.600010\nv -1.000000 27.800001 -22.600010\nv 1.000000 29.800001 -22.600010\nv 0.999999 29.800001 -20.600010\nv -1.000000 29.800001 -20.600010\nv -1.000000 29.800001 -22.600010\nv 4.600001 27.800001 -22.600010\nv 4.600001 27.800001 -20.600010\nv 2.600001 27.800001 -20.600010\nv 2.600002 27.800001 -22.600010\nv 4.600002 29.800001 -22.600010\nv 4.600001 29.800001 -20.600010\nv 2.600001 29.800001 -20.600010\nv 2.600002 29.800001 -22.600010\nv 8.200003 27.800001 -22.600010\nv 8.200003 27.800001 -20.600010\nv 6.200003 27.800001 -20.600010\nv 6.200004 27.800001 -22.600010\nv 8.200004 29.800001 -22.600010\nv 8.200003 29.800001 -20.600010\nv 6.200003 29.800001 -20.600010\nv 6.200003 29.800001 -22.600010\nv 11.800005 27.800001 -22.600010\nv 11.800005 27.800001 -20.600010\nv 9.800005 27.800001 -20.600010\nv 9.800005 27.800001 -22.600010\nv 11.800005 29.800001 -22.600010\nv 11.800004 29.800001 -20.600010\nv 9.800005 29.800001 -20.600010\nv 9.800005 29.800001 -22.600010\nv 15.400006 27.800001 -22.600010\nv 15.400006 27.800001 -20.600010\nv 13.400006 27.800001 -20.600010\nv 13.400006 27.800001 -22.600010\nv 15.400007 29.800001 -22.600010\nv 15.400005 29.800001 -20.600010\nv 13.400006 29.800001 -20.600010\nv 13.400006 29.800001 -22.600010\nv 19.000008 27.800001 -22.600010\nv 19.000008 27.800001 -20.600010\nv 17.000008 27.800001 -20.600010\nv 17.000008 27.800001 -22.600010\nv 19.000008 29.800001 -22.600010\nv 19.000008 29.800001 -20.600010\nv 17.000008 29.800001 -20.600010\nv 17.000008 29.800001 -22.600010\nv 22.600010 27.800001 -22.600010\nv 22.600010 27.800001 -20.600010\nv 20.600010 27.800001 -20.600010\nv 20.600010 27.800001 -22.600010\nv 22.600010 29.800001 -22.600010\nv 22.600010 29.800001 -20.600010\nv 20.600010 29.800001 -20.600010\nv 20.600010 29.800001 -22.600010\nv 26.200012 27.800001 -22.600010\nv 26.200012 27.800001 -20.600010\nv 24.200012 27.800001 -20.600010\nv 24.200012 27.800001 -22.600010\nv 26.200012 29.800001 -22.600010\nv 26.200012 29.800001 -20.600010\nv 24.200012 29.800001 -20.600010\nv 24.200012 29.800001 -22.600010\nv 29.800014 27.800001 -22.600010\nv 29.800014 27.800001 -20.600010\nv 27.800014 27.800001 -20.600010\nv 27.800014 27.800001 -22.600010\nv 29.800014 29.800001 -22.600010\nv 29.800014 29.800001 -20.600010\nv 27.800014 29.800001 -20.600010\nv 27.800014 29.800001 -22.600010\nv 33.400017 27.800001 -22.600010\nv 33.400017 27.800001 -20.600010\nv 31.400017 27.800001 -20.600010\nv 31.400017 27.800001 -22.600010\nv 33.400017 29.800001 -22.600010\nv 33.400017 29.800001 -20.600010\nv 31.400017 29.800001 -20.600010\nv 31.400017 29.800001 -22.600010\nv 1.000000 27.800001 -26.200012\nv 1.000000 27.800001 -24.200012\nv -1.000000 27.800001 -24.200012\nv -1.000000 27.800001 -26.200012\nv 1.000000 29.800001 -26.200012\nv 0.999999 29.800001 -24.200012\nv -1.000000 29.800001 -24.200012\nv -1.000000 29.800001 -26.200012\nv 4.600001 27.800001 -26.200012\nv 4.600001 27.800001 -24.200012\nv 2.600001 27.800001 -24.200012\nv 2.600002 27.800001 -26.200012\nv 4.600002 29.800001 -26.200012\nv 4.600001 29.800001 -24.200012\nv 2.600001 29.800001 -24.200012\nv 2.600002 29.800001 -26.200012\nv 8.200003 27.800001 -26.200012\nv 8.200003 27.800001 -24.200012\nv 6.200003 27.800001 -24.200012\nv 6.200004 27.800001 -26.200012\nv 8.200004 29.800001 -26.200012\nv 8.200003 29.800001 -24.200012\nv 6.200003 29.800001 -24.200012\nv 6.200003 29.800001 -26.200012\nv 11.800005 27.800001 -26.200012\nv 11.800005 27.800001 -24.200012\nv 9.800005 27.800001 -24.200012\nv 9.800005 27.800001 -26.200012\nv 11.800005 29.800001 -26.200012\nv 11.800004 29.800001 -24.200012\nv 9.800005 29.800001 -24.200012\nv 9.800005 29.800001 -26.200012\nv 15.400006 27.800001 -26.200012\nv 15.400006 27.800001 -24.200012\nv 13.400006 27.800001 -24.200012\nv 13.400006 27.800001 -26.200012\nv 15.400007 29.800001 -26.200012\nv 15.400005 29.800001 -24.200012\nv 13.400006 29.800001 -24.200012\nv 13.400006 29.800001 -26.200012\nv 19.000008 27.800001 -26.200012\nv 19.000008 27.800001 -24.200012\nv 17.000008 27.800001 -24.200012\nv 17.000008 27.800001 -26.200012\nv 19.000008 29.800001 -26.200012\nv 19.000008 29.800001 -24.200012\nv 17.000008 29.800001 -24.200012\nv 17.000008 29.800001 -26.200012\nv 22.600010 27.800001 -26.200012\nv 22.600010 27.800001 -24.200012\nv 20.600010 27.800001 -24.200012\nv 20.600010 27.800001 -26.200012\nv 22.600010 29.800001 -26.200012\nv 22.600010 29.800001 -24.200012\nv 20.600010 29.800001 -24.200012\nv 20.600010 29.800001 -26.200012\nv 26.200012 27.800001 -26.200012\nv 26.200012 27.800001 -24.200012\nv 24.200012 27.800001 -24.200012\nv 24.200012 27.800001 -26.200012\nv 26.200012 29.800001 -26.200012\nv 26.200012 29.800001 -24.200012\nv 24.200012 29.800001 -24.200012\nv 24.200012 29.800001 -26.200012\nv 29.800014 27.800001 -26.200012\nv 29.800014 27.800001 -24.200012\nv 27.800014 27.800001 -24.200012\nv 27.800014 27.800001 -26.200012\nv 29.800014 29.800001 -26.200012\nv 29.800014 29.800001 -24.200012\nv 27.800014 29.800001 -24.200012\nv 27.800014 29.800001 -26.200012\nv 33.400017 27.800001 -26.200012\nv 33.400017 27.800001 -24.200012\nv 31.400017 27.800001 -24.200012\nv 31.400017 27.800001 -26.200012\nv 33.400017 29.800001 -26.200012\nv 33.400017 29.800001 -24.200012\nv 31.400017 29.800001 -24.200012\nv 31.400017 29.800001 -26.200012\nv 1.000000 27.800001 -29.800014\nv 1.000000 27.800001 -27.800014\nv -1.000000 27.800001 -27.800014\nv -1.000000 27.800001 -29.800014\nv 1.000000 29.800001 -29.800014\nv 0.999999 29.800001 -27.800014\nv -1.000000 29.800001 -27.800014\nv -1.000000 29.800001 -29.800014\nv 4.600001 27.800001 -29.800014\nv 4.600001 27.800001 -27.800014\nv 2.600001 27.800001 -27.800014\nv 2.600002 27.800001 -29.800014\nv 4.600002 29.800001 -29.800014\nv 4.600001 29.800001 -27.800014\nv 2.600001 29.800001 -27.800014\nv 2.600002 29.800001 -29.800014\nv 8.200003 27.800001 -29.800014\nv 8.200003 27.800001 -27.800014\nv 6.200003 27.800001 -27.800014\nv 6.200004 27.800001 -29.800014\nv 8.200004 29.800001 -29.800014\nv 8.200003 29.800001 -27.800014\nv 6.200003 29.800001 -27.800014\nv 6.200003 29.800001 -29.800014\nv 11.800005 27.800001 -29.800014\nv 11.800005 27.800001 -27.800014\nv 9.800005 27.800001 -27.800014\nv 9.800005 27.800001 -29.800014\nv 11.800005 29.800001 -29.800014\nv 11.800004 29.800001 -27.800014\nv 9.800005 29.800001 -27.800014\nv 9.800005 29.800001 -29.800014\nv 15.400006 27.800001 -29.800014\nv 15.400006 27.800001 -27.800014\nv 13.400006 27.800001 -27.800014\nv 13.400006 27.800001 -29.800014\nv 15.400007 29.800001 -29.800014\nv 15.400005 29.800001 -27.800014\nv 13.400006 29.800001 -27.800014\nv 13.400006 29.800001 -29.800014\nv 19.000008 27.800001 -29.800014\nv 19.000008 27.800001 -27.800014\nv 17.000008 27.800001 -27.800014\nv 17.000008 27.800001 -29.800014\nv 19.000008 29.800001 -29.800014\nv 19.000008 29.800001 -27.800014\nv 17.000008 29.800001 -27.800014\nv 17.000008 29.800001 -29.800014\nv 22.600010 27.800001 -29.800014\nv 22.600010 27.800001 -27.800014\nv 20.600010 27.800001 -27.800014\nv 20.600010 27.800001 -29.800014\nv 22.600010 29.800001 -29.800014\nv 22.600010 29.800001 -27.800014\nv 20.600010 29.800001 -27.800014\nv 20.600010 29.800001 -29.800014\nv 26.200012 27.800001 -29.800014\nv 26.200012 27.800001 -27.800014\nv 24.200012 27.800001 -27.800014\nv 24.200012 27.800001 -29.800014\nv 26.200012 29.800001 -29.800014\nv 26.200012 29.800001 -27.800014\nv 24.200012 29.800001 -27.800014\nv 24.200012 29.800001 -29.800014\nv 29.800014 27.800001 -29.800014\nv 29.800014 27.800001 -27.800014\nv 27.800014 27.800001 -27.800014\nv 27.800014 27.800001 -29.800014\nv 29.800014 29.800001 -29.800014\nv 29.800014 29.800001 -27.800014\nv 27.800014 29.800001 -27.800014\nv 27.800014 29.800001 -29.800014\nv 33.400017 27.800001 -29.800014\nv 33.400017 27.800001 -27.800014\nv 31.400017 27.800001 -27.800014\nv 31.400017 27.800001 -29.800014\nv 33.400017 29.800001 -29.800014\nv 33.400017 29.800001 -27.800014\nv 31.400017 29.800001 -27.800014\nv 31.400017 29.800001 -29.800014\nv 1.000000 27.800001 -33.400017\nv 1.000000 27.800001 -31.400017\nv -1.000000 27.800001 -31.400017\nv -1.000000 27.800001 -33.400017\nv 1.000000 29.800001 -33.400017\nv 0.999999 29.800001 -31.400017\nv -1.000000 29.800001 -31.400017\nv -1.000000 29.800001 -33.400017\nv 4.600001 27.800001 -33.400017\nv 4.600001 27.800001 -31.400017\nv 2.600001 27.800001 -31.400017\nv 2.600002 27.800001 -33.400017\nv 4.600002 29.800001 -33.400017\nv 4.600001 29.800001 -31.400017\nv 2.600001 29.800001 -31.400017\nv 2.600002 29.800001 -33.400017\nv 8.200003 27.800001 -33.400017\nv 8.200003 27.800001 -31.400017\nv 6.200003 27.800001 -31.400017\nv 6.200004 27.800001 -33.400017\nv 8.200004 29.800001 -33.400017\nv 8.200003 29.800001 -31.400017\nv 6.200003 29.800001 -31.400017\nv 6.200003 29.800001 -33.400017\nv 11.800005 27.800001 -33.400017\nv 11.800005 27.800001 -31.400017\nv 9.800005 27.800001 -31.400017\nv 9.800005 27.800001 -33.400017\nv 11.800005 29.800001 -33.400017\nv 11.800004 29.800001 -31.400017\nv 9.800005 29.800001 -31.400017\nv 9.800005 29.800001 -33.400017\nv 15.400006 27.800001 -33.400017\nv 15.400006 27.800001 -31.400017\nv 13.400006 27.800001 -31.400017\nv 13.400006 27.800001 -33.400017\nv 15.400007 29.800001 -33.400017\nv 15.400005 29.800001 -31.400017\nv 13.400006 29.800001 -31.400017\nv 13.400006 29.800001 -33.400017\nv 19.000008 27.800001 -33.400017\nv 19.000008 27.800001 -31.400017\nv 17.000008 27.800001 -31.400017\nv 17.000008 27.800001 -33.400017\nv 19.000008 29.800001 -33.400017\nv 19.000008 29.800001 -31.400017\nv 17.000008 29.800001 -31.400017\nv 17.000008 29.800001 -33.400017\nv 22.600010 27.800001 -33.400017\nv 22.600010 27.800001 -31.400017\nv 20.600010 27.800001 -31.400017\nv 20.600010 27.800001 -33.400017\nv 22.600010 29.800001 -33.400017\nv 22.600010 29.800001 -31.400017\nv 20.600010 29.800001 -31.400017\nv 20.600010 29.800001 -33.400017\nv 26.200012 27.800001 -33.400017\nv 26.200012 27.800001 -31.400017\nv 24.200012 27.800001 -31.400017\nv 24.200012 27.800001 -33.400017\nv 26.200012 29.800001 -33.400017\nv 26.200012 29.800001 -31.400017\nv 24.200012 29.800001 -31.400017\nv 24.200012 29.800001 -33.400017\nv 29.800014 27.800001 -33.400017\nv 29.800014 27.800001 -31.400017\nv 27.800014 27.800001 -31.400017\nv 27.800014 27.800001 -33.400017\nv 29.800014 29.800001 -33.400017\nv 29.800014 29.800001 -31.400017\nv 27.800014 29.800001 -31.400017\nv 27.800014 29.800001 -33.400017\nv 33.400017 27.800001 -33.400017\nv 33.400017 27.800001 -31.400017\nv 31.400017 27.800001 -31.400017\nv 31.400017 27.800001 -33.400017\nv 33.400017 29.800001 -33.400017\nv 33.400017 29.800001 -31.400017\nv 31.400017 29.800001 -31.400017\nv 31.400017 29.800001 -33.400017\nv -1.000000 27.800001 -1.000000\nv -1.000000 27.800001 1.000000\nv 1.000000 27.800001 1.000000\nv 1.000000 27.800001 -1.000000\nv -1.000000 29.800001 -0.999999\nv -0.999999 29.800001 1.000001\nv 1.000000 29.800001 1.000000\nv 1.000000 29.800001 -1.000000\nv -4.600001 27.800001 -1.000000\nv -4.600001 27.800001 1.000000\nv -2.600001 27.800001 1.000000\nv -2.600002 27.800001 -1.000000\nv -4.600002 29.800001 -0.999999\nv -4.600001 29.800001 1.000001\nv -2.600001 29.800001 1.000000\nv -2.600002 29.800001 -1.000000\nv -8.200003 27.800001 -1.000000\nv -8.200003 27.800001 1.000000\nv -6.200003 27.800001 1.000000\nv -6.200004 27.800001 -1.000000\nv -8.200004 29.800001 -0.999999\nv -8.200003 29.800001 1.000001\nv -6.200003 29.800001 1.000000\nv -6.200003 29.800001 -1.000000\nv -11.800005 27.800001 -1.000000\nv -11.800005 27.800001 1.000000\nv -9.800005 27.800001 1.000000\nv -9.800005 27.800001 -1.000000\nv -11.800005 29.800001 -0.999999\nv -11.800004 29.800001 1.000001\nv -9.800005 29.800001 1.000000\nv -9.800005 29.800001 -1.000000\nv -15.400006 27.800001 -1.000000\nv -15.400006 27.800001 1.000000\nv -13.400006 27.800001 1.000000\nv -13.400006 27.800001 -1.000000\nv -15.400007 29.800001 -0.999999\nv -15.400005 29.800001 1.000001\nv -13.400006 29.800001 1.000000\nv -13.400006 29.800001 -1.000000\nv -19.000008 27.800001 -1.000000\nv -19.000008 27.800001 1.000000\nv -17.000008 27.800001 1.000000\nv -17.000008 27.800001 -1.000000\nv -19.000008 29.800001 -0.999999\nv -19.000008 29.800001 1.000001\nv -17.000008 29.800001 1.000000\nv -17.000008 29.800001 -1.000000\nv -22.600010 27.800001 -1.000000\nv -22.600010 27.800001 1.000000\nv -20.600010 27.800001 1.000000\nv -20.600010 27.800001 -1.000000\nv -22.600010 29.800001 -0.999999\nv -22.600010 29.800001 1.000001\nv -20.600010 29.800001 1.000000\nv -20.600010 29.800001 -1.000000\nv -26.200012 27.800001 -1.000000\nv -26.200012 27.800001 1.000000\nv -24.200012 27.800001 1.000000\nv -24.200012 27.800001 -1.000000\nv -26.200012 29.800001 -0.999999\nv -26.200012 29.800001 1.000001\nv -24.200012 29.800001 1.000000\nv -24.200012 29.800001 -1.000000\nv -29.800014 27.800001 -1.000000\nv -29.800014 27.800001 1.000000\nv -27.800014 27.800001 1.000000\nv -27.800014 27.800001 -1.000000\nv -29.800014 29.800001 -0.999999\nv -29.800014 29.800001 1.000001\nv -27.800014 29.800001 1.000000\nv -27.800014 29.800001 -1.000000\nv -33.400017 27.800001 -1.000000\nv -33.400017 27.800001 1.000000\nv -31.400017 27.800001 1.000000\nv -31.400017 27.800001 -1.000000\nv -33.400017 29.800001 -0.999999\nv -33.400017 29.800001 1.000001\nv -31.400017 29.800001 1.000000\nv -31.400017 29.800001 -1.000000\nv -1.000000 27.800001 -4.600001\nv -1.000000 27.800001 -2.600002\nv 1.000000 27.800001 -2.600002\nv 1.000000 27.800001 -4.600002\nv -1.000000 29.800001 -4.600001\nv -0.999999 29.800001 -2.600001\nv 1.000000 29.800001 -2.600002\nv 1.000000 29.800001 -4.600001\nv -4.600001 27.800001 -4.600001\nv -4.600001 27.800001 -2.600002\nv -2.600001 27.800001 -2.600002\nv -2.600002 27.800001 -4.600002\nv -4.600002 29.800001 -4.600001\nv -4.600001 29.800001 -2.600001\nv -2.600001 29.800001 -2.600002\nv -2.600002 29.800001 -4.600001\nv -8.200003 27.800001 -4.600001\nv -8.200003 27.800001 -2.600002\nv -6.200003 27.800001 -2.600002\nv -6.200004 27.800001 -4.600002\nv -8.200004 29.800001 -4.600001\nv -8.200003 29.800001 -2.600001\nv -6.200003 29.800001 -2.600002\nv -6.200003 29.800001 -4.600001\nv -11.800005 27.800001 -4.600001\nv -11.800005 27.800001 -2.600002\nv -9.800005 27.800001 -2.600002\nv -9.800005 27.800001 -4.600002\nv -11.800005 29.800001 -4.600001\nv -11.800004 29.800001 -2.600001\nv -9.800005 29.800001 -2.600002\nv -9.800005 29.800001 -4.600001\nv -15.400006 27.800001 -4.600001\nv -15.400006 27.800001 -2.600002\nv -13.400006 27.800001 -2.600002\nv -13.400006 27.800001 -4.600002\nv -15.400007 29.800001 -4.600001\nv -15.400005 29.800001 -2.600001\nv -13.400006 29.800001 -2.600002\nv -13.400006 29.800001 -4.600001\nv -19.000008 27.800001 -4.600001\nv -19.000008 27.800001 -2.600002\nv -17.000008 27.800001 -2.600002\nv -17.000008 27.800001 -4.600002\nv -19.000008 29.800001 -4.600001\nv -19.000008 29.800001 -2.600001\nv -17.000008 29.800001 -2.600002\nv -17.000008 29.800001 -4.600001\nv -22.600010 27.800001 -4.600001\nv -22.600010 27.800001 -2.600002\nv -20.600010 27.800001 -2.600002\nv -20.600010 27.800001 -4.600002\nv -22.600010 29.800001 -4.600001\nv -22.600010 29.800001 -2.600001\nv -20.600010 29.800001 -2.600002\nv -20.600010 29.800001 -4.600001\nv -26.200012 27.800001 -4.600001\nv -26.200012 27.800001 -2.600002\nv -24.200012 27.800001 -2.600002\nv -24.200012 27.800001 -4.600002\nv -26.200012 29.800001 -4.600001\nv -26.200012 29.800001 -2.600001\nv -24.200012 29.800001 -2.600002\nv -24.200012 29.800001 -4.600001\nv -29.800014 27.800001 -4.600001\nv -29.800014 27.800001 -2.600002\nv -27.800014 27.800001 -2.600002\nv -27.800014 27.800001 -4.600002\nv -29.800014 29.800001 -4.600001\nv -29.800014 29.800001 -2.600001\nv -27.800014 29.800001 -2.600002\nv -27.800014 29.800001 -4.600001\nv -33.400017 27.800001 -4.600001\nv -33.400017 27.800001 -2.600002\nv -31.400017 27.800001 -2.600002\nv -31.400017 27.800001 -4.600002\nv -33.400017 29.800001 -4.600001\nv -33.400017 29.800001 -2.600001\nv -31.400017 29.800001 -2.600002\nv -31.400017 29.800001 -4.600001\nv -1.000000 27.800001 -8.200003\nv -1.000000 27.800001 -6.200003\nv 1.000000 27.800001 -6.200003\nv 1.000000 27.800001 -8.200004\nv -1.000000 29.800001 -8.200003\nv -0.999999 29.800001 -6.200003\nv 1.000000 29.800001 -6.200004\nv 1.000000 29.800001 -8.200003\nv -4.600001 27.800001 -8.200003\nv -4.600001 27.800001 -6.200003\nv -2.600001 27.800001 -6.200003\nv -2.600002 27.800001 -8.200004\nv -4.600002 29.800001 -8.200003\nv -4.600001 29.800001 -6.200003\nv -2.600001 29.800001 -6.200004\nv -2.600002 29.800001 -8.200003\nv -8.200003 27.800001 -8.200003\nv -8.200003 27.800001 -6.200003\nv -6.200003 27.800001 -6.200003\nv -6.200004 27.800001 -8.200004\nv -8.200004 29.800001 -8.200003\nv -8.200003 29.800001 -6.200003\nv -6.200003 29.800001 -6.200004\nv -6.200003 29.800001 -8.200003\nv -11.800005 27.800001 -8.200003\nv -11.800005 27.800001 -6.200003\nv -9.800005 27.800001 -6.200003\nv -9.800005 27.800001 -8.200004\nv -11.800005 29.800001 -8.200003\nv -11.800004 29.800001 -6.200003\nv -9.800005 29.800001 -6.200004\nv -9.800005 29.800001 -8.200003\nv -15.400006 27.800001 -8.200003\nv -15.400006 27.800001 -6.200003\nv -13.400006 27.800001 -6.200003\nv -13.400006 27.800001 -8.200004\nv -15.400007 29.800001 -8.200003\nv -15.400005 29.800001 -6.200003\nv -13.400006 29.800001 -6.200004\nv -13.400006 29.800001 -8.200003\nv -19.000008 27.800001 -8.200003\nv -19.000008 27.800001 -6.200003\nv -17.000008 27.800001 -6.200003\nv -17.000008 27.800001 -8.200004\nv -19.000008 29.800001 -8.200003\nv -19.000008 29.800001 -6.200003\nv -17.000008 29.800001 -6.200004\nv -17.000008 29.800001 -8.200003\nv -22.600010 27.800001 -8.200003\nv -22.600010 27.800001 -6.200003\nv -20.600010 27.800001 -6.200003\nv -20.600010 27.800001 -8.200004\nv -22.600010 29.800001 -8.200003\nv -22.600010 29.800001 -6.200003\nv -20.600010 29.800001 -6.200004\nv -20.600010 29.800001 -8.200003\nv -26.200012 27.800001 -8.200003\nv -26.200012 27.800001 -6.200003\nv -24.200012 27.800001 -6.200003\nv -24.200012 27.800001 -8.200004\nv -26.200012 29.800001 -8.200003\nv -26.200012 29.800001 -6.200003\nv -24.200012 29.800001 -6.200004\nv -24.200012 29.800001 -8.200003\nv -29.800014 27.800001 -8.200003\nv -29.800014 27.800001 -6.200003\nv -27.800014 27.800001 -6.200003\nv -27.800014 27.800001 -8.200004\nv -29.800014 29.800001 -8.200003\nv -29.800014 29.800001 -6.200003\nv -27.800014 29.800001 -6.200004\nv -27.800014 29.800001 -8.200003\nv -33.400017 27.800001 -8.200003\nv -33.400017 27.800001 -6.200003\nv -31.400017 27.800001 -6.200003\nv -31.400017 27.800001 -8.200004\nv -33.400017 29.800001 -8.200003\nv -33.400017 29.800001 -6.200003\nv -31.400017 29.800001 -6.200004\nv -31.400017 29.800001 -8.200003\nv -1.000000 27.800001 -11.800005\nv -1.000000 27.800001 -9.800005\nv 1.000000 27.800001 -9.800005\nv 1.000000 27.800001 -11.800005\nv -1.000000 29.800001 -11.800004\nv -0.999999 29.800001 -9.800004\nv 1.000000 29.800001 -9.800005\nv 1.000000 29.800001 -11.800005\nv -4.600001 27.800001 -11.800005\nv -4.600001 27.800001 -9.800005\nv -2.600001 27.800001 -9.800005\nv -2.600002 27.800001 -11.800005\nv -4.600002 29.800001 -11.800004\nv -4.600001 29.800001 -9.800004\nv -2.600001 29.800001 -9.800005\nv -2.600002 29.800001 -11.800005\nv -8.200003 27.800001 -11.800005\nv -8.200003 27.800001 -9.800005\nv -6.200003 27.800001 -9.800005\nv -6.200004 27.800001 -11.800005\nv -8.200004 29.800001 -11.800004\nv -8.200003 29.800001 -9.800004\nv -6.200003 29.800001 -9.800005\nv -6.200003 29.800001 -11.800005\nv -11.800005 27.800001 -11.800005\nv -11.800005 27.800001 -9.800005\nv -9.800005 27.800001 -9.800005\nv -9.800005 27.800001 -11.800005\nv -11.800005 29.800001 -11.800004\nv -11.800004 29.800001 -9.800004\nv -9.800005 29.800001 -9.800005\nv -9.800005 29.800001 -11.800005\nv -15.400006 27.800001 -11.800005\nv -15.400006 27.800001 -9.800005\nv -13.400006 27.800001 -9.800005\nv -13.400006 27.800001 -11.800005\nv -15.400007 29.800001 -11.800004\nv -15.400005 29.800001 -9.800004\nv -13.400006 29.800001 -9.800005\nv -13.400006 29.800001 -11.800005\nv -19.000008 27.800001 -11.800005\nv -19.000008 27.800001 -9.800005\nv -17.000008 27.800001 -9.800005\nv -17.000008 27.800001 -11.800005\nv -19.000008 29.800001 -11.800004\nv -19.000008 29.800001 -9.800004\nv -17.000008 29.800001 -9.800005\nv -17.000008 29.800001 -11.800005\nv -22.600010 27.800001 -11.800005\nv -22.600010 27.800001 -9.800005\nv -20.600010 27.800001 -9.800005\nv -20.600010 27.800001 -11.800005\nv -22.600010 29.800001 -11.800004\nv -22.600010 29.800001 -9.800004\nv -20.600010 29.800001 -9.800005\nv -20.600010 29.800001 -11.800005\nv -26.200012 27.800001 -11.800005\nv -26.200012 27.800001 -9.800005\nv -24.200012 27.800001 -9.800005\nv -24.200012 27.800001 -11.800005\nv -26.200012 29.800001 -11.800004\nv -26.200012 29.800001 -9.800004\nv -24.200012 29.800001 -9.800005\nv -24.200012 29.800001 -11.800005\nv -29.800014 27.800001 -11.800005\nv -29.800014 27.800001 -9.800005\nv -27.800014 27.800001 -9.800005\nv -27.800014 27.800001 -11.800005\nv -29.800014 29.800001 -11.800004\nv -29.800014 29.800001 -9.800004\nv -27.800014 29.800001 -9.800005\nv -27.800014 29.800001 -11.800005\nv -33.400017 27.800001 -11.800005\nv -33.400017 27.800001 -9.800005\nv -31.400017 27.800001 -9.800005\nv -31.400017 27.800001 -11.800005\nv -33.400017 29.800001 -11.800004\nv -33.400017 29.800001 -9.800004\nv -31.400017 29.800001 -9.800005\nv -31.400017 29.800001 -11.800005\nv -1.000000 27.800001 -15.400006\nv -1.000000 27.800001 -13.400006\nv 1.000000 27.800001 -13.400006\nv 1.000000 27.800001 -15.400006\nv -1.000000 29.800001 -15.400005\nv -0.999999 29.800001 -13.400005\nv 1.000000 29.800001 -13.400006\nv 1.000000 29.800001 -15.400006\nv -4.600001 27.800001 -15.400006\nv -4.600001 27.800001 -13.400006\nv -2.600001 27.800001 -13.400006\nv -2.600002 27.800001 -15.400006\nv -4.600002 29.800001 -15.400005\nv -4.600001 29.800001 -13.400005\nv -2.600001 29.800001 -13.400006\nv -2.600002 29.800001 -15.400006\nv -8.200003 27.800001 -15.400006\nv -8.200003 27.800001 -13.400006\nv -6.200003 27.800001 -13.400006\nv -6.200004 27.800001 -15.400006\nv -8.200004 29.800001 -15.400005\nv -8.200003 29.800001 -13.400005\nv -6.200003 29.800001 -13.400006\nv -6.200003 29.800001 -15.400006\nv -11.800005 27.800001 -15.400006\nv -11.800005 27.800001 -13.400006\nv -9.800005 27.800001 -13.400006\nv -9.800005 27.800001 -15.400006\nv -11.800005 29.800001 -15.400005\nv -11.800004 29.800001 -13.400005\nv -9.800005 29.800001 -13.400006\nv -9.800005 29.800001 -15.400006\nv -15.400006 27.800001 -15.400006\nv -15.400006 27.800001 -13.400006\nv -13.400006 27.800001 -13.400006\nv -13.400006 27.800001 -15.400006\nv -15.400007 29.800001 -15.400005\nv -15.400005 29.800001 -13.400005\nv -13.400006 29.800001 -13.400006\nv -13.400006 29.800001 -15.400006\nv -19.000008 27.800001 -15.400006\nv -19.000008 27.800001 -13.400006\nv -17.000008 27.800001 -13.400006\nv -17.000008 27.800001 -15.400006\nv -19.000008 29.800001 -15.400005\nv -19.000008 29.800001 -13.400005\nv -17.000008 29.800001 -13.400006\nv -17.000008 29.800001 -15.400006\nv -22.600010 27.800001 -15.400006\nv -22.600010 27.800001 -13.400006\nv -20.600010 27.800001 -13.400006\nv -20.600010 27.800001 -15.400006\nv -22.600010 29.800001 -15.400005\nv -22.600010 29.800001 -13.400005\nv -20.600010 29.800001 -13.400006\nv -20.600010 29.800001 -15.400006\nv -26.200012 27.800001 -15.400006\nv -26.200012 27.800001 -13.400006\nv -24.200012 27.800001 -13.400006\nv -24.200012 27.800001 -15.400006\nv -26.200012 29.800001 -15.400005\nv -26.200012 29.800001 -13.400005\nv -24.200012 29.800001 -13.400006\nv -24.200012 29.800001 -15.400006\nv -29.800014 27.800001 -15.400006\nv -29.800014 27.800001 -13.400006\nv -27.800014 27.800001 -13.400006\nv -27.800014 27.800001 -15.400006\nv -29.800014 29.800001 -15.400005\nv -29.800014 29.800001 -13.400005\nv -27.800014 29.800001 -13.400006\nv -27.800014 29.800001 -15.400006\nv -33.400017 27.800001 -15.400006\nv -33.400017 27.800001 -13.400006\nv -31.400017 27.800001 -13.400006\nv -31.400017 27.800001 -15.400006\nv -33.400017 29.800001 -15.400005\nv -33.400017 29.800001 -13.400005\nv -31.400017 29.800001 -13.400006\nv -31.400017 29.800001 -15.400006\nv -1.000000 27.800001 -19.000008\nv -1.000000 27.800001 -17.000008\nv 1.000000 27.800001 -17.000008\nv 1.000000 27.800001 -19.000008\nv -1.000000 29.800001 -19.000008\nv -0.999999 29.800001 -17.000008\nv 1.000000 29.800001 -17.000008\nv 1.000000 29.800001 -19.000008\nv -4.600001 27.800001 -19.000008\nv -4.600001 27.800001 -17.000008\nv -2.600001 27.800001 -17.000008\nv -2.600002 27.800001 -19.000008\nv -4.600002 29.800001 -19.000008\nv -4.600001 29.800001 -17.000008\nv -2.600001 29.800001 -17.000008\nv -2.600002 29.800001 -19.000008\nv -8.200003 27.800001 -19.000008\nv -8.200003 27.800001 -17.000008\nv -6.200003 27.800001 -17.000008\nv -6.200004 27.800001 -19.000008\nv -8.200004 29.800001 -19.000008\nv -8.200003 29.800001 -17.000008\nv -6.200003 29.800001 -17.000008\nv -6.200003 29.800001 -19.000008\nv -11.800005 27.800001 -19.000008\nv -11.800005 27.800001 -17.000008\nv -9.800005 27.800001 -17.000008\nv -9.800005 27.800001 -19.000008\nv -11.800005 29.800001 -19.000008\nv -11.800004 29.800001 -17.000008\nv -9.800005 29.800001 -17.000008\nv -9.800005 29.800001 -19.000008\nv -15.400006 27.800001 -19.000008\nv -15.400006 27.800001 -17.000008\nv -13.400006 27.800001 -17.000008\nv -13.400006 27.800001 -19.000008\nv -15.400007 29.800001 -19.000008\nv -15.400005 29.800001 -17.000008\nv -13.400006 29.800001 -17.000008\nv -13.400006 29.800001 -19.000008\nv -19.000008 27.800001 -19.000008\nv -19.000008 27.800001 -17.000008\nv -17.000008 27.800001 -17.000008\nv -17.000008 27.800001 -19.000008\nv -19.000008 29.800001 -19.000008\nv -19.000008 29.800001 -17.000008\nv -17.000008 29.800001 -17.000008\nv -17.000008 29.800001 -19.000008\nv -22.600010 27.800001 -19.000008\nv -22.600010 27.800001 -17.000008\nv -20.600010 27.800001 -17.000008\nv -20.600010 27.800001 -19.000008\nv -22.600010 29.800001 -19.000008\nv -22.600010 29.800001 -17.000008\nv -20.600010 29.800001 -17.000008\nv -20.600010 29.800001 -19.000008\nv -26.200012 27.800001 -19.000008\nv -26.200012 27.800001 -17.000008\nv -24.200012 27.800001 -17.000008\nv -24.200012 27.800001 -19.000008\nv -26.200012 29.800001 -19.000008\nv -26.200012 29.800001 -17.000008\nv -24.200012 29.800001 -17.000008\nv -24.200012 29.800001 -19.000008\nv -29.800014 27.800001 -19.000008\nv -29.800014 27.800001 -17.000008\nv -27.800014 27.800001 -17.000008\nv -27.800014 27.800001 -19.000008\nv -29.800014 29.800001 -19.000008\nv -29.800014 29.800001 -17.000008\nv -27.800014 29.800001 -17.000008\nv -27.800014 29.800001 -19.000008\nv -33.400017 27.800001 -19.000008\nv -33.400017 27.800001 -17.000008\nv -31.400017 27.800001 -17.000008\nv -31.400017 27.800001 -19.000008\nv -33.400017 29.800001 -19.000008\nv -33.400017 29.800001 -17.000008\nv -31.400017 29.800001 -17.000008\nv -31.400017 29.800001 -19.000008\nv -1.000000 27.800001 -22.600010\nv -1.000000 27.800001 -20.600010\nv 1.000000 27.800001 -20.600010\nv 1.000000 27.800001 -22.600010\nv -1.000000 29.800001 -22.600010\nv -0.999999 29.800001 -20.600010\nv 1.000000 29.800001 -20.600010\nv 1.000000 29.800001 -22.600010\nv -4.600001 27.800001 -22.600010\nv -4.600001 27.800001 -20.600010\nv -2.600001 27.800001 -20.600010\nv -2.600002 27.800001 -22.600010\nv -4.600002 29.800001 -22.600010\nv -4.600001 29.800001 -20.600010\nv -2.600001 29.800001 -20.600010\nv -2.600002 29.800001 -22.600010\nv -8.200003 27.800001 -22.600010\nv -8.200003 27.800001 -20.600010\nv -6.200003 27.800001 -20.600010\nv -6.200004 27.800001 -22.600010\nv -8.200004 29.800001 -22.600010\nv -8.200003 29.800001 -20.600010\nv -6.200003 29.800001 -20.600010\nv -6.200003 29.800001 -22.600010\nv -11.800005 27.800001 -22.600010\nv -11.800005 27.800001 -20.600010\nv -9.800005 27.800001 -20.600010\nv -9.800005 27.800001 -22.600010\nv -11.800005 29.800001 -22.600010\nv -11.800004 29.800001 -20.600010\nv -9.800005 29.800001 -20.600010\nv -9.800005 29.800001 -22.600010\nv -15.400006 27.800001 -22.600010\nv -15.400006 27.800001 -20.600010\nv -13.400006 27.800001 -20.600010\nv -13.400006 27.800001 -22.600010\nv -15.400007 29.800001 -22.600010\nv -15.400005 29.800001 -20.600010\nv -13.400006 29.800001 -20.600010\nv -13.400006 29.800001 -22.600010\nv -19.000008 27.800001 -22.600010\nv -19.000008 27.800001 -20.600010\nv -17.000008 27.800001 -20.600010\nv -17.000008 27.800001 -22.600010\nv -19.000008 29.800001 -22.600010\nv -19.000008 29.800001 -20.600010\nv -17.000008 29.800001 -20.600010\nv -17.000008 29.800001 -22.600010\nv -22.600010 27.800001 -22.600010\nv -22.600010 27.800001 -20.600010\nv -20.600010 27.800001 -20.600010\nv -20.600010 27.800001 -22.600010\nv -22.600010 29.800001 -22.600010\nv -22.600010 29.800001 -20.600010\nv -20.600010 29.800001 -20.600010\nv -20.600010 29.800001 -22.600010\nv -26.200012 27.800001 -22.600010\nv -26.200012 27.800001 -20.600010\nv -24.200012 27.800001 -20.600010\nv -24.200012 27.800001 -22.600010\nv -26.200012 29.800001 -22.600010\nv -26.200012 29.800001 -20.600010\nv -24.200012 29.800001 -20.600010\nv -24.200012 29.800001 -22.600010\nv -29.800014 27.800001 -22.600010\nv -29.800014 27.800001 -20.600010\nv -27.800014 27.800001 -20.600010\nv -27.800014 27.800001 -22.600010\nv -29.800014 29.800001 -22.600010\nv -29.800014 29.800001 -20.600010\nv -27.800014 29.800001 -20.600010\nv -27.800014 29.800001 -22.600010\nv -33.400017 27.800001 -22.600010\nv -33.400017 27.800001 -20.600010\nv -31.400017 27.800001 -20.600010\nv -31.400017 27.800001 -22.600010\nv -33.400017 29.800001 -22.600010\nv -33.400017 29.800001 -20.600010\nv -31.400017 29.800001 -20.600010\nv -31.400017 29.800001 -22.600010\nv -1.000000 27.800001 -26.200012\nv -1.000000 27.800001 -24.200012\nv 1.000000 27.800001 -24.200012\nv 1.000000 27.800001 -26.200012\nv -1.000000 29.800001 -26.200012\nv -0.999999 29.800001 -24.200012\nv 1.000000 29.800001 -24.200012\nv 1.000000 29.800001 -26.200012\nv -4.600001 27.800001 -26.200012\nv -4.600001 27.800001 -24.200012\nv -2.600001 27.800001 -24.200012\nv -2.600002 27.800001 -26.200012\nv -4.600002 29.800001 -26.200012\nv -4.600001 29.800001 -24.200012\nv -2.600001 29.800001 -24.200012\nv -2.600002 29.800001 -26.200012\nv -8.200003 27.800001 -26.200012\nv -8.200003 27.800001 -24.200012\nv -6.200003 27.800001 -24.200012\nv -6.200004 27.800001 -26.200012\nv -8.200004 29.800001 -26.200012\nv -8.200003 29.800001 -24.200012\nv -6.200003 29.800001 -24.200012\nv -6.200003 29.800001 -26.200012\nv -11.800005 27.800001 -26.200012\nv -11.800005 27.800001 -24.200012\nv -9.800005 27.800001 -24.200012\nv -9.800005 27.800001 -26.200012\nv -11.800005 29.800001 -26.200012\nv -11.800004 29.800001 -24.200012\nv -9.800005 29.800001 -24.200012\nv -9.800005 29.800001 -26.200012\nv -15.400006 27.800001 -26.200012\nv -15.400006 27.800001 -24.200012\nv -13.400006 27.800001 -24.200012\nv -13.400006 27.800001 -26.200012\nv -15.400007 29.800001 -26.200012\nv -15.400005 29.800001 -24.200012\nv -13.400006 29.800001 -24.200012\nv -13.400006 29.800001 -26.200012\nv -19.000008 27.800001 -26.200012\nv -19.000008 27.800001 -24.200012\nv -17.000008 27.800001 -24.200012\nv -17.000008 27.800001 -26.200012\nv -19.000008 29.800001 -26.200012\nv -19.000008 29.800001 -24.200012\nv -17.000008 29.800001 -24.200012\nv -17.000008 29.800001 -26.200012\nv -22.600010 27.800001 -26.200012\nv -22.600010 27.800001 -24.200012\nv -20.600010 27.800001 -24.200012\nv -20.600010 27.800001 -26.200012\nv -22.600010 29.800001 -26.200012\nv -22.600010 29.800001 -24.200012\nv -20.600010 29.800001 -24.200012\nv -20.600010 29.800001 -26.200012\nv -26.200012 27.800001 -26.200012\nv -26.200012 27.800001 -24.200012\nv -24.200012 27.800001 -24.200012\nv -24.200012 27.800001 -26.200012\nv -26.200012 29.800001 -26.200012\nv -26.200012 29.800001 -24.200012\nv -24.200012 29.800001 -24.200012\nv -24.200012 29.800001 -26.200012\nv -29.800014 27.800001 -26.200012\nv -29.800014 27.800001 -24.200012\nv -27.800014 27.800001 -24.200012\nv -27.800014 27.800001 -26.200012\nv -29.800014 29.800001 -26.200012\nv -29.800014 29.800001 -24.200012\nv -27.800014 29.800001 -24.200012\nv -27.800014 29.800001 -26.200012\nv -33.400017 27.800001 -26.200012\nv -33.400017 27.800001 -24.200012\nv -31.400017 27.800001 -24.200012\nv -31.400017 27.800001 -26.200012\nv -33.400017 29.800001 -26.200012\nv -33.400017 29.800001 -24.200012\nv -31.400017 29.800001 -24.200012\nv -31.400017 29.800001 -26.200012\nv -1.000000 27.800001 -29.800014\nv -1.000000 27.800001 -27.800014\nv 1.000000 27.800001 -27.800014\nv 1.000000 27.800001 -29.800014\nv -1.000000 29.800001 -29.800014\nv -0.999999 29.800001 -27.800014\nv 1.000000 29.800001 -27.800014\nv 1.000000 29.800001 -29.800014\nv -4.600001 27.800001 -29.800014\nv -4.600001 27.800001 -27.800014\nv -2.600001 27.800001 -27.800014\nv -2.600002 27.800001 -29.800014\nv -4.600002 29.800001 -29.800014\nv -4.600001 29.800001 -27.800014\nv -2.600001 29.800001 -27.800014\nv -2.600002 29.800001 -29.800014\nv -8.200003 27.800001 -29.800014\nv -8.200003 27.800001 -27.800014\nv -6.200003 27.800001 -27.800014\nv -6.200004 27.800001 -29.800014\nv -8.200004 29.800001 -29.800014\nv -8.200003 29.800001 -27.800014\nv -6.200003 29.800001 -27.800014\nv -6.200003 29.800001 -29.800014\nv -11.800005 27.800001 -29.800014\nv -11.800005 27.800001 -27.800014\nv -9.800005 27.800001 -27.800014\nv -9.800005 27.800001 -29.800014\nv -11.800005 29.800001 -29.800014\nv -11.800004 29.800001 -27.800014\nv -9.800005 29.800001 -27.800014\nv -9.800005 29.800001 -29.800014\nv -15.400006 27.800001 -29.800014\nv -15.400006 27.800001 -27.800014\nv -13.400006 27.800001 -27.800014\nv -13.400006 27.800001 -29.800014\nv -15.400007 29.800001 -29.800014\nv -15.400005 29.800001 -27.800014\nv -13.400006 29.800001 -27.800014\nv -13.400006 29.800001 -29.800014\nv -19.000008 27.800001 -29.800014\nv -19.000008 27.800001 -27.800014\nv -17.000008 27.800001 -27.800014\nv -17.000008 27.800001 -29.800014\nv -19.000008 29.800001 -29.800014\nv -19.000008 29.800001 -27.800014\nv -17.000008 29.800001 -27.800014\nv -17.000008 29.800001 -29.800014\nv -22.600010 27.800001 -29.800014\nv -22.600010 27.800001 -27.800014\nv -20.600010 27.800001 -27.800014\nv -20.600010 27.800001 -29.800014\nv -22.600010 29.800001 -29.800014\nv -22.600010 29.800001 -27.800014\nv -20.600010 29.800001 -27.800014\nv -20.600010 29.800001 -29.800014\nv -26.200012 27.800001 -29.800014\nv -26.200012 27.800001 -27.800014\nv -24.200012 27.800001 -27.800014\nv -24.200012 27.800001 -29.800014\nv -26.200012 29.800001 -29.800014\nv -26.200012 29.800001 -27.800014\nv -24.200012 29.800001 -27.800014\nv -24.200012 29.800001 -29.800014\nv -29.800014 27.800001 -29.800014\nv -29.800014 27.800001 -27.800014\nv -27.800014 27.800001 -27.800014\nv -27.800014 27.800001 -29.800014\nv -29.800014 29.800001 -29.800014\nv -29.800014 29.800001 -27.800014\nv -27.800014 29.800001 -27.800014\nv -27.800014 29.800001 -29.800014\nv -33.400017 27.800001 -29.800014\nv -33.400017 27.800001 -27.800014\nv -31.400017 27.800001 -27.800014\nv -31.400017 27.800001 -29.800014\nv -33.400017 29.800001 -29.800014\nv -33.400017 29.800001 -27.800014\nv -31.400017 29.800001 -27.800014\nv -31.400017 29.800001 -29.800014\nv -1.000000 27.800001 -33.400017\nv -1.000000 27.800001 -31.400017\nv 1.000000 27.800001 -31.400017\nv 1.000000 27.800001 -33.400017\nv -1.000000 29.800001 -33.400017\nv -0.999999 29.800001 -31.400017\nv 1.000000 29.800001 -31.400017\nv 1.000000 29.800001 -33.400017\nv -4.600001 27.800001 -33.400017\nv -4.600001 27.800001 -31.400017\nv -2.600001 27.800001 -31.400017\nv -2.600002 27.800001 -33.400017\nv -4.600002 29.800001 -33.400017\nv -4.600001 29.800001 -31.400017\nv -2.600001 29.800001 -31.400017\nv -2.600002 29.800001 -33.400017\nv -8.200003 27.800001 -33.400017\nv -8.200003 27.800001 -31.400017\nv -6.200003 27.800001 -31.400017\nv -6.200004 27.800001 -33.400017\nv -8.200004 29.800001 -33.400017\nv -8.200003 29.800001 -31.400017\nv -6.200003 29.800001 -31.400017\nv -6.200003 29.800001 -33.400017\nv -11.800005 27.800001 -33.400017\nv -11.800005 27.800001 -31.400017\nv -9.800005 27.800001 -31.400017\nv -9.800005 27.800001 -33.400017\nv -11.800005 29.800001 -33.400017\nv -11.800004 29.800001 -31.400017\nv -9.800005 29.800001 -31.400017\nv -9.800005 29.800001 -33.400017\nv -15.400006 27.800001 -33.400017\nv -15.400006 27.800001 -31.400017\nv -13.400006 27.800001 -31.400017\nv -13.400006 27.800001 -33.400017\nv -15.400007 29.800001 -33.400017\nv -15.400005 29.800001 -31.400017\nv -13.400006 29.800001 -31.400017\nv -13.400006 29.800001 -33.400017\nv -19.000008 27.800001 -33.400017\nv -19.000008 27.800001 -31.400017\nv -17.000008 27.800001 -31.400017\nv -17.000008 27.800001 -33.400017\nv -19.000008 29.800001 -33.400017\nv -19.000008 29.800001 -31.400017\nv -17.000008 29.800001 -31.400017\nv -17.000008 29.800001 -33.400017\nv -22.600010 27.800001 -33.400017\nv -22.600010 27.800001 -31.400017\nv -20.600010 27.800001 -31.400017\nv -20.600010 27.800001 -33.400017\nv -22.600010 29.800001 -33.400017\nv -22.600010 29.800001 -31.400017\nv -20.600010 29.800001 -31.400017\nv -20.600010 29.800001 -33.400017\nv -26.200012 27.800001 -33.400017\nv -26.200012 27.800001 -31.400017\nv -24.200012 27.800001 -31.400017\nv -24.200012 27.800001 -33.400017\nv -26.200012 29.800001 -33.400017\nv -26.200012 29.800001 -31.400017\nv -24.200012 29.800001 -31.400017\nv -24.200012 29.800001 -33.400017\nv -29.800014 27.800001 -33.400017\nv -29.800014 27.800001 -31.400017\nv -27.800014 27.800001 -31.400017\nv -27.800014 27.800001 -33.400017\nv -29.800014 29.800001 -33.400017\nv -29.800014 29.800001 -31.400017\nv -27.800014 29.800001 -31.400017\nv -27.800014 29.800001 -33.400017\nv -33.400017 27.800001 -33.400017\nv -33.400017 27.800001 -31.400017\nv -31.400017 27.800001 -31.400017\nv -31.400017 27.800001 -33.400017\nv -33.400017 29.800001 -33.400017\nv -33.400017 29.800001 -31.400017\nv -31.400017 29.800001 -31.400017\nv -31.400017 29.800001 -33.400017\nv 1.000000 31.400002 -1.000000\nv 1.000000 31.400002 1.000000\nv -1.000000 31.400002 1.000000\nv -1.000000 31.400002 -1.000000\nv 1.000000 33.400002 -0.999999\nv 0.999999 33.400002 1.000001\nv -1.000000 33.400002 1.000000\nv -1.000000 33.400002 -1.000000\nv 4.600001 31.400002 -1.000000\nv 4.600001 31.400002 1.000000\nv 2.600001 31.400002 1.000000\nv 2.600002 31.400002 -1.000000\nv 4.600002 33.400002 -0.999999\nv 4.600001 33.400002 1.000001\nv 2.600001 33.400002 1.000000\nv 2.600002 33.400002 -1.000000\nv 8.200003 31.400002 -1.000000\nv 8.200003 31.400002 1.000000\nv 6.200003 31.400002 1.000000\nv 6.200004 31.400002 -1.000000\nv 8.200004 33.400002 -0.999999\nv 8.200003 33.400002 1.000001\nv 6.200003 33.400002 1.000000\nv 6.200003 33.400002 -1.000000\nv 11.800005 31.400002 -1.000000\nv 11.800005 31.400002 1.000000\nv 9.800005 31.400002 1.000000\nv 9.800005 31.400002 -1.000000\nv 11.800005 33.400002 -0.999999\nv 11.800004 33.400002 1.000001\nv 9.800005 33.400002 1.000000\nv 9.800005 33.400002 -1.000000\nv 15.400006 31.400002 -1.000000\nv 15.400006 31.400002 1.000000\nv 13.400006 31.400002 1.000000\nv 13.400006 31.400002 -1.000000\nv 15.400007 33.400002 -0.999999\nv 15.400005 33.400002 1.000001\nv 13.400006 33.400002 1.000000\nv 13.400006 33.400002 -1.000000\nv 19.000008 31.400002 -1.000000\nv 19.000008 31.400002 1.000000\nv 17.000008 31.400002 1.000000\nv 17.000008 31.400002 -1.000000\nv 19.000008 33.400002 -0.999999\nv 19.000008 33.400002 1.000001\nv 17.000008 33.400002 1.000000\nv 17.000008 33.400002 -1.000000\nv 22.600010 31.400002 -1.000000\nv 22.600010 31.400002 1.000000\nv 20.600010 31.400002 1.000000\nv 20.600010 31.400002 -1.000000\nv 22.600010 33.400002 -0.999999\nv 22.600010 33.400002 1.000001\nv 20.600010 33.400002 1.000000\nv 20.600010 33.400002 -1.000000\nv 26.200012 31.400002 -1.000000\nv 26.200012 31.400002 1.000000\nv 24.200012 31.400002 1.000000\nv 24.200012 31.400002 -1.000000\nv 26.200012 33.400002 -0.999999\nv 26.200012 33.400002 1.000001\nv 24.200012 33.400002 1.000000\nv 24.200012 33.400002 -1.000000\nv 29.800014 31.400002 -1.000000\nv 29.800014 31.400002 1.000000\nv 27.800014 31.400002 1.000000\nv 27.800014 31.400002 -1.000000\nv 29.800014 33.400002 -0.999999\nv 29.800014 33.400002 1.000001\nv 27.800014 33.400002 1.000000\nv 27.800014 33.400002 -1.000000\nv 33.400017 31.400002 -1.000000\nv 33.400017 31.400002 1.000000\nv 31.400017 31.400002 1.000000\nv 31.400017 31.400002 -1.000000\nv 33.400017 33.400002 -0.999999\nv 33.400017 33.400002 1.000001\nv 31.400017 33.400002 1.000000\nv 31.400017 33.400002 -1.000000\nv 1.000000 31.400002 -4.600001\nv 1.000000 31.400002 -2.600002\nv -1.000000 31.400002 -2.600002\nv -1.000000 31.400002 -4.600002\nv 1.000000 33.400002 -4.600001\nv 0.999999 33.400002 -2.600001\nv -1.000000 33.400002 -2.600002\nv -1.000000 33.400002 -4.600001\nv 4.600001 31.400002 -4.600001\nv 4.600001 31.400002 -2.600002\nv 2.600001 31.400002 -2.600002\nv 2.600002 31.400002 -4.600002\nv 4.600002 33.400002 -4.600001\nv 4.600001 33.400002 -2.600001\nv 2.600001 33.400002 -2.600002\nv 2.600002 33.400002 -4.600001\nv 8.200003 31.400002 -4.600001\nv 8.200003 31.400002 -2.600002\nv 6.200003 31.400002 -2.600002\nv 6.200004 31.400002 -4.600002\nv 8.200004 33.400002 -4.600001\nv 8.200003 33.400002 -2.600001\nv 6.200003 33.400002 -2.600002\nv 6.200003 33.400002 -4.600001\nv 11.800005 31.400002 -4.600001\nv 11.800005 31.400002 -2.600002\nv 9.800005 31.400002 -2.600002\nv 9.800005 31.400002 -4.600002\nv 11.800005 33.400002 -4.600001\nv 11.800004 33.400002 -2.600001\nv 9.800005 33.400002 -2.600002\nv 9.800005 33.400002 -4.600001\nv 15.400006 31.400002 -4.600001\nv 15.400006 31.400002 -2.600002\nv 13.400006 31.400002 -2.600002\nv 13.400006 31.400002 -4.600002\nv 15.400007 33.400002 -4.600001\nv 15.400005 33.400002 -2.600001\nv 13.400006 33.400002 -2.600002\nv 13.400006 33.400002 -4.600001\nv 19.000008 31.400002 -4.600001\nv 19.000008 31.400002 -2.600002\nv 17.000008 31.400002 -2.600002\nv 17.000008 31.400002 -4.600002\nv 19.000008 33.400002 -4.600001\nv 19.000008 33.400002 -2.600001\nv 17.000008 33.400002 -2.600002\nv 17.000008 33.400002 -4.600001\nv 22.600010 31.400002 -4.600001\nv 22.600010 31.400002 -2.600002\nv 20.600010 31.400002 -2.600002\nv 20.600010 31.400002 -4.600002\nv 22.600010 33.400002 -4.600001\nv 22.600010 33.400002 -2.600001\nv 20.600010 33.400002 -2.600002\nv 20.600010 33.400002 -4.600001\nv 26.200012 31.400002 -4.600001\nv 26.200012 31.400002 -2.600002\nv 24.200012 31.400002 -2.600002\nv 24.200012 31.400002 -4.600002\nv 26.200012 33.400002 -4.600001\nv 26.200012 33.400002 -2.600001\nv 24.200012 33.400002 -2.600002\nv 24.200012 33.400002 -4.600001\nv 29.800014 31.400002 -4.600001\nv 29.800014 31.400002 -2.600002\nv 27.800014 31.400002 -2.600002\nv 27.800014 31.400002 -4.600002\nv 29.800014 33.400002 -4.600001\nv 29.800014 33.400002 -2.600001\nv 27.800014 33.400002 -2.600002\nv 27.800014 33.400002 -4.600001\nv 33.400017 31.400002 -4.600001\nv 33.400017 31.400002 -2.600002\nv 31.400017 31.400002 -2.600002\nv 31.400017 31.400002 -4.600002\nv 33.400017 33.400002 -4.600001\nv 33.400017 33.400002 -2.600001\nv 31.400017 33.400002 -2.600002\nv 31.400017 33.400002 -4.600001\nv 1.000000 31.400002 -8.200003\nv 1.000000 31.400002 -6.200003\nv -1.000000 31.400002 -6.200003\nv -1.000000 31.400002 -8.200004\nv 1.000000 33.400002 -8.200003\nv 0.999999 33.400002 -6.200003\nv -1.000000 33.400002 -6.200004\nv -1.000000 33.400002 -8.200003\nv 4.600001 31.400002 -8.200003\nv 4.600001 31.400002 -6.200003\nv 2.600001 31.400002 -6.200003\nv 2.600002 31.400002 -8.200004\nv 4.600002 33.400002 -8.200003\nv 4.600001 33.400002 -6.200003\nv 2.600001 33.400002 -6.200004\nv 2.600002 33.400002 -8.200003\nv 8.200003 31.400002 -8.200003\nv 8.200003 31.400002 -6.200003\nv 6.200003 31.400002 -6.200003\nv 6.200004 31.400002 -8.200004\nv 8.200004 33.400002 -8.200003\nv 8.200003 33.400002 -6.200003\nv 6.200003 33.400002 -6.200004\nv 6.200003 33.400002 -8.200003\nv 11.800005 31.400002 -8.200003\nv 11.800005 31.400002 -6.200003\nv 9.800005 31.400002 -6.200003\nv 9.800005 31.400002 -8.200004\nv 11.800005 33.400002 -8.200003\nv 11.800004 33.400002 -6.200003\nv 9.800005 33.400002 -6.200004\nv 9.800005 33.400002 -8.200003\nv 15.400006 31.400002 -8.200003\nv 15.400006 31.400002 -6.200003\nv 13.400006 31.400002 -6.200003\nv 13.400006 31.400002 -8.200004\nv 15.400007 33.400002 -8.200003\nv 15.400005 33.400002 -6.200003\nv 13.400006 33.400002 -6.200004\nv 13.400006 33.400002 -8.200003\nv 19.000008 31.400002 -8.200003\nv 19.000008 31.400002 -6.200003\nv 17.000008 31.400002 -6.200003\nv 17.000008 31.400002 -8.200004\nv 19.000008 33.400002 -8.200003\nv 19.000008 33.400002 -6.200003\nv 17.000008 33.400002 -6.200004\nv 17.000008 33.400002 -8.200003\nv 22.600010 31.400002 -8.200003\nv 22.600010 31.400002 -6.200003\nv 20.600010 31.400002 -6.200003\nv 20.600010 31.400002 -8.200004\nv 22.600010 33.400002 -8.200003\nv 22.600010 33.400002 -6.200003\nv 20.600010 33.400002 -6.200004\nv 20.600010 33.400002 -8.200003\nv 26.200012 31.400002 -8.200003\nv 26.200012 31.400002 -6.200003\nv 24.200012 31.400002 -6.200003\nv 24.200012 31.400002 -8.200004\nv 26.200012 33.400002 -8.200003\nv 26.200012 33.400002 -6.200003\nv 24.200012 33.400002 -6.200004\nv 24.200012 33.400002 -8.200003\nv 29.800014 31.400002 -8.200003\nv 29.800014 31.400002 -6.200003\nv 27.800014 31.400002 -6.200003\nv 27.800014 31.400002 -8.200004\nv 29.800014 33.400002 -8.200003\nv 29.800014 33.400002 -6.200003\nv 27.800014 33.400002 -6.200004\nv 27.800014 33.400002 -8.200003\nv 33.400017 31.400002 -8.200003\nv 33.400017 31.400002 -6.200003\nv 31.400017 31.400002 -6.200003\nv 31.400017 31.400002 -8.200004\nv 33.400017 33.400002 -8.200003\nv 33.400017 33.400002 -6.200003\nv 31.400017 33.400002 -6.200004\nv 31.400017 33.400002 -8.200003\nv 1.000000 31.400002 -11.800005\nv 1.000000 31.400002 -9.800005\nv -1.000000 31.400002 -9.800005\nv -1.000000 31.400002 -11.800005\nv 1.000000 33.400002 -11.800004\nv 0.999999 33.400002 -9.800004\nv -1.000000 33.400002 -9.800005\nv -1.000000 33.400002 -11.800005\nv 4.600001 31.400002 -11.800005\nv 4.600001 31.400002 -9.800005\nv 2.600001 31.400002 -9.800005\nv 2.600002 31.400002 -11.800005\nv 4.600002 33.400002 -11.800004\nv 4.600001 33.400002 -9.800004\nv 2.600001 33.400002 -9.800005\nv 2.600002 33.400002 -11.800005\nv 8.200003 31.400002 -11.800005\nv 8.200003 31.400002 -9.800005\nv 6.200003 31.400002 -9.800005\nv 6.200004 31.400002 -11.800005\nv 8.200004 33.400002 -11.800004\nv 8.200003 33.400002 -9.800004\nv 6.200003 33.400002 -9.800005\nv 6.200003 33.400002 -11.800005\nv 11.800005 31.400002 -11.800005\nv 11.800005 31.400002 -9.800005\nv 9.800005 31.400002 -9.800005\nv 9.800005 31.400002 -11.800005\nv 11.800005 33.400002 -11.800004\nv 11.800004 33.400002 -9.800004\nv 9.800005 33.400002 -9.800005\nv 9.800005 33.400002 -11.800005\nv 15.400006 31.400002 -11.800005\nv 15.400006 31.400002 -9.800005\nv 13.400006 31.400002 -9.800005\nv 13.400006 31.400002 -11.800005\nv 15.400007 33.400002 -11.800004\nv 15.400005 33.400002 -9.800004\nv 13.400006 33.400002 -9.800005\nv 13.400006 33.400002 -11.800005\nv 19.000008 31.400002 -11.800005\nv 19.000008 31.400002 -9.800005\nv 17.000008 31.400002 -9.800005\nv 17.000008 31.400002 -11.800005\nv 19.000008 33.400002 -11.800004\nv 19.000008 33.400002 -9.800004\nv 17.000008 33.400002 -9.800005\nv 17.000008 33.400002 -11.800005\nv 22.600010 31.400002 -11.800005\nv 22.600010 31.400002 -9.800005\nv 20.600010 31.400002 -9.800005\nv 20.600010 31.400002 -11.800005\nv 22.600010 33.400002 -11.800004\nv 22.600010 33.400002 -9.800004\nv 20.600010 33.400002 -9.800005\nv 20.600010 33.400002 -11.800005\nv 26.200012 31.400002 -11.800005\nv 26.200012 31.400002 -9.800005\nv 24.200012 31.400002 -9.800005\nv 24.200012 31.400002 -11.800005\nv 26.200012 33.400002 -11.800004\nv 26.200012 33.400002 -9.800004\nv 24.200012 33.400002 -9.800005\nv 24.200012 33.400002 -11.800005\nv 29.800014 31.400002 -11.800005\nv 29.800014 31.400002 -9.800005\nv 27.800014 31.400002 -9.800005\nv 27.800014 31.400002 -11.800005\nv 29.800014 33.400002 -11.800004\nv 29.800014 33.400002 -9.800004\nv 27.800014 33.400002 -9.800005\nv 27.800014 33.400002 -11.800005\nv 33.400017 31.400002 -11.800005\nv 33.400017 31.400002 -9.800005\nv 31.400017 31.400002 -9.800005\nv 31.400017 31.400002 -11.800005\nv 33.400017 33.400002 -11.800004\nv 33.400017 33.400002 -9.800004\nv 31.400017 33.400002 -9.800005\nv 31.400017 33.400002 -11.800005\nv 1.000000 31.400002 -15.400006\nv 1.000000 31.400002 -13.400006\nv -1.000000 31.400002 -13.400006\nv -1.000000 31.400002 -15.400006\nv 1.000000 33.400002 -15.400005\nv 0.999999 33.400002 -13.400005\nv -1.000000 33.400002 -13.400006\nv -1.000000 33.400002 -15.400006\nv 4.600001 31.400002 -15.400006\nv 4.600001 31.400002 -13.400006\nv 2.600001 31.400002 -13.400006\nv 2.600002 31.400002 -15.400006\nv 4.600002 33.400002 -15.400005\nv 4.600001 33.400002 -13.400005\nv 2.600001 33.400002 -13.400006\nv 2.600002 33.400002 -15.400006\nv 8.200003 31.400002 -15.400006\nv 8.200003 31.400002 -13.400006\nv 6.200003 31.400002 -13.400006\nv 6.200004 31.400002 -15.400006\nv 8.200004 33.400002 -15.400005\nv 8.200003 33.400002 -13.400005\nv 6.200003 33.400002 -13.400006\nv 6.200003 33.400002 -15.400006\nv 11.800005 31.400002 -15.400006\nv 11.800005 31.400002 -13.400006\nv 9.800005 31.400002 -13.400006\nv 9.800005 31.400002 -15.400006\nv 11.800005 33.400002 -15.400005\nv 11.800004 33.400002 -13.400005\nv 9.800005 33.400002 -13.400006\nv 9.800005 33.400002 -15.400006\nv 15.400006 31.400002 -15.400006\nv 15.400006 31.400002 -13.400006\nv 13.400006 31.400002 -13.400006\nv 13.400006 31.400002 -15.400006\nv 15.400007 33.400002 -15.400005\nv 15.400005 33.400002 -13.400005\nv 13.400006 33.400002 -13.400006\nv 13.400006 33.400002 -15.400006\nv 19.000008 31.400002 -15.400006\nv 19.000008 31.400002 -13.400006\nv 17.000008 31.400002 -13.400006\nv 17.000008 31.400002 -15.400006\nv 19.000008 33.400002 -15.400005\nv 19.000008 33.400002 -13.400005\nv 17.000008 33.400002 -13.400006\nv 17.000008 33.400002 -15.400006\nv 22.600010 31.400002 -15.400006\nv 22.600010 31.400002 -13.400006\nv 20.600010 31.400002 -13.400006\nv 20.600010 31.400002 -15.400006\nv 22.600010 33.400002 -15.400005\nv 22.600010 33.400002 -13.400005\nv 20.600010 33.400002 -13.400006\nv 20.600010 33.400002 -15.400006\nv 26.200012 31.400002 -15.400006\nv 26.200012 31.400002 -13.400006\nv 24.200012 31.400002 -13.400006\nv 24.200012 31.400002 -15.400006\nv 26.200012 33.400002 -15.400005\nv 26.200012 33.400002 -13.400005\nv 24.200012 33.400002 -13.400006\nv 24.200012 33.400002 -15.400006\nv 29.800014 31.400002 -15.400006\nv 29.800014 31.400002 -13.400006\nv 27.800014 31.400002 -13.400006\nv 27.800014 31.400002 -15.400006\nv 29.800014 33.400002 -15.400005\nv 29.800014 33.400002 -13.400005\nv 27.800014 33.400002 -13.400006\nv 27.800014 33.400002 -15.400006\nv 33.400017 31.400002 -15.400006\nv 33.400017 31.400002 -13.400006\nv 31.400017 31.400002 -13.400006\nv 31.400017 31.400002 -15.400006\nv 33.400017 33.400002 -15.400005\nv 33.400017 33.400002 -13.400005\nv 31.400017 33.400002 -13.400006\nv 31.400017 33.400002 -15.400006\nv 1.000000 31.400002 -19.000008\nv 1.000000 31.400002 -17.000008\nv -1.000000 31.400002 -17.000008\nv -1.000000 31.400002 -19.000008\nv 1.000000 33.400002 -19.000008\nv 0.999999 33.400002 -17.000008\nv -1.000000 33.400002 -17.000008\nv -1.000000 33.400002 -19.000008\nv 4.600001 31.400002 -19.000008\nv 4.600001 31.400002 -17.000008\nv 2.600001 31.400002 -17.000008\nv 2.600002 31.400002 -19.000008\nv 4.600002 33.400002 -19.000008\nv 4.600001 33.400002 -17.000008\nv 2.600001 33.400002 -17.000008\nv 2.600002 33.400002 -19.000008\nv 8.200003 31.400002 -19.000008\nv 8.200003 31.400002 -17.000008\nv 6.200003 31.400002 -17.000008\nv 6.200004 31.400002 -19.000008\nv 8.200004 33.400002 -19.000008\nv 8.200003 33.400002 -17.000008\nv 6.200003 33.400002 -17.000008\nv 6.200003 33.400002 -19.000008\nv 11.800005 31.400002 -19.000008\nv 11.800005 31.400002 -17.000008\nv 9.800005 31.400002 -17.000008\nv 9.800005 31.400002 -19.000008\nv 11.800005 33.400002 -19.000008\nv 11.800004 33.400002 -17.000008\nv 9.800005 33.400002 -17.000008\nv 9.800005 33.400002 -19.000008\nv 15.400006 31.400002 -19.000008\nv 15.400006 31.400002 -17.000008\nv 13.400006 31.400002 -17.000008\nv 13.400006 31.400002 -19.000008\nv 15.400007 33.400002 -19.000008\nv 15.400005 33.400002 -17.000008\nv 13.400006 33.400002 -17.000008\nv 13.400006 33.400002 -19.000008\nv 19.000008 31.400002 -19.000008\nv 19.000008 31.400002 -17.000008\nv 17.000008 31.400002 -17.000008\nv 17.000008 31.400002 -19.000008\nv 19.000008 33.400002 -19.000008\nv 19.000008 33.400002 -17.000008\nv 17.000008 33.400002 -17.000008\nv 17.000008 33.400002 -19.000008\nv 22.600010 31.400002 -19.000008\nv 22.600010 31.400002 -17.000008\nv 20.600010 31.400002 -17.000008\nv 20.600010 31.400002 -19.000008\nv 22.600010 33.400002 -19.000008\nv 22.600010 33.400002 -17.000008\nv 20.600010 33.400002 -17.000008\nv 20.600010 33.400002 -19.000008\nv 26.200012 31.400002 -19.000008\nv 26.200012 31.400002 -17.000008\nv 24.200012 31.400002 -17.000008\nv 24.200012 31.400002 -19.000008\nv 26.200012 33.400002 -19.000008\nv 26.200012 33.400002 -17.000008\nv 24.200012 33.400002 -17.000008\nv 24.200012 33.400002 -19.000008\nv 29.800014 31.400002 -19.000008\nv 29.800014 31.400002 -17.000008\nv 27.800014 31.400002 -17.000008\nv 27.800014 31.400002 -19.000008\nv 29.800014 33.400002 -19.000008\nv 29.800014 33.400002 -17.000008\nv 27.800014 33.400002 -17.000008\nv 27.800014 33.400002 -19.000008\nv 33.400017 31.400002 -19.000008\nv 33.400017 31.400002 -17.000008\nv 31.400017 31.400002 -17.000008\nv 31.400017 31.400002 -19.000008\nv 33.400017 33.400002 -19.000008\nv 33.400017 33.400002 -17.000008\nv 31.400017 33.400002 -17.000008\nv 31.400017 33.400002 -19.000008\nv 1.000000 31.400002 -22.600010\nv 1.000000 31.400002 -20.600010\nv -1.000000 31.400002 -20.600010\nv -1.000000 31.400002 -22.600010\nv 1.000000 33.400002 -22.600010\nv 0.999999 33.400002 -20.600010\nv -1.000000 33.400002 -20.600010\nv -1.000000 33.400002 -22.600010\nv 4.600001 31.400002 -22.600010\nv 4.600001 31.400002 -20.600010\nv 2.600001 31.400002 -20.600010\nv 2.600002 31.400002 -22.600010\nv 4.600002 33.400002 -22.600010\nv 4.600001 33.400002 -20.600010\nv 2.600001 33.400002 -20.600010\nv 2.600002 33.400002 -22.600010\nv 8.200003 31.400002 -22.600010\nv 8.200003 31.400002 -20.600010\nv 6.200003 31.400002 -20.600010\nv 6.200004 31.400002 -22.600010\nv 8.200004 33.400002 -22.600010\nv 8.200003 33.400002 -20.600010\nv 6.200003 33.400002 -20.600010\nv 6.200003 33.400002 -22.600010\nv 11.800005 31.400002 -22.600010\nv 11.800005 31.400002 -20.600010\nv 9.800005 31.400002 -20.600010\nv 9.800005 31.400002 -22.600010\nv 11.800005 33.400002 -22.600010\nv 11.800004 33.400002 -20.600010\nv 9.800005 33.400002 -20.600010\nv 9.800005 33.400002 -22.600010\nv 15.400006 31.400002 -22.600010\nv 15.400006 31.400002 -20.600010\nv 13.400006 31.400002 -20.600010\nv 13.400006 31.400002 -22.600010\nv 15.400007 33.400002 -22.600010\nv 15.400005 33.400002 -20.600010\nv 13.400006 33.400002 -20.600010\nv 13.400006 33.400002 -22.600010\nv 19.000008 31.400002 -22.600010\nv 19.000008 31.400002 -20.600010\nv 17.000008 31.400002 -20.600010\nv 17.000008 31.400002 -22.600010\nv 19.000008 33.400002 -22.600010\nv 19.000008 33.400002 -20.600010\nv 17.000008 33.400002 -20.600010\nv 17.000008 33.400002 -22.600010\nv 22.600010 31.400002 -22.600010\nv 22.600010 31.400002 -20.600010\nv 20.600010 31.400002 -20.600010\nv 20.600010 31.400002 -22.600010\nv 22.600010 33.400002 -22.600010\nv 22.600010 33.400002 -20.600010\nv 20.600010 33.400002 -20.600010\nv 20.600010 33.400002 -22.600010\nv 26.200012 31.400002 -22.600010\nv 26.200012 31.400002 -20.600010\nv 24.200012 31.400002 -20.600010\nv 24.200012 31.400002 -22.600010\nv 26.200012 33.400002 -22.600010\nv 26.200012 33.400002 -20.600010\nv 24.200012 33.400002 -20.600010\nv 24.200012 33.400002 -22.600010\nv 29.800014 31.400002 -22.600010\nv 29.800014 31.400002 -20.600010\nv 27.800014 31.400002 -20.600010\nv 27.800014 31.400002 -22.600010\nv 29.800014 33.400002 -22.600010\nv 29.800014 33.400002 -20.600010\nv 27.800014 33.400002 -20.600010\nv 27.800014 33.400002 -22.600010\nv 33.400017 31.400002 -22.600010\nv 33.400017 31.400002 -20.600010\nv 31.400017 31.400002 -20.600010\nv 31.400017 31.400002 -22.600010\nv 33.400017 33.400002 -22.600010\nv 33.400017 33.400002 -20.600010\nv 31.400017 33.400002 -20.600010\nv 31.400017 33.400002 -22.600010\nv 1.000000 31.400002 -26.200012\nv 1.000000 31.400002 -24.200012\nv -1.000000 31.400002 -24.200012\nv -1.000000 31.400002 -26.200012\nv 1.000000 33.400002 -26.200012\nv 0.999999 33.400002 -24.200012\nv -1.000000 33.400002 -24.200012\nv -1.000000 33.400002 -26.200012\nv 4.600001 31.400002 -26.200012\nv 4.600001 31.400002 -24.200012\nv 2.600001 31.400002 -24.200012\nv 2.600002 31.400002 -26.200012\nv 4.600002 33.400002 -26.200012\nv 4.600001 33.400002 -24.200012\nv 2.600001 33.400002 -24.200012\nv 2.600002 33.400002 -26.200012\nv 8.200003 31.400002 -26.200012\nv 8.200003 31.400002 -24.200012\nv 6.200003 31.400002 -24.200012\nv 6.200004 31.400002 -26.200012\nv 8.200004 33.400002 -26.200012\nv 8.200003 33.400002 -24.200012\nv 6.200003 33.400002 -24.200012\nv 6.200003 33.400002 -26.200012\nv 11.800005 31.400002 -26.200012\nv 11.800005 31.400002 -24.200012\nv 9.800005 31.400002 -24.200012\nv 9.800005 31.400002 -26.200012\nv 11.800005 33.400002 -26.200012\nv 11.800004 33.400002 -24.200012\nv 9.800005 33.400002 -24.200012\nv 9.800005 33.400002 -26.200012\nv 15.400006 31.400002 -26.200012\nv 15.400006 31.400002 -24.200012\nv 13.400006 31.400002 -24.200012\nv 13.400006 31.400002 -26.200012\nv 15.400007 33.400002 -26.200012\nv 15.400005 33.400002 -24.200012\nv 13.400006 33.400002 -24.200012\nv 13.400006 33.400002 -26.200012\nv 19.000008 31.400002 -26.200012\nv 19.000008 31.400002 -24.200012\nv 17.000008 31.400002 -24.200012\nv 17.000008 31.400002 -26.200012\nv 19.000008 33.400002 -26.200012\nv 19.000008 33.400002 -24.200012\nv 17.000008 33.400002 -24.200012\nv 17.000008 33.400002 -26.200012\nv 22.600010 31.400002 -26.200012\nv 22.600010 31.400002 -24.200012\nv 20.600010 31.400002 -24.200012\nv 20.600010 31.400002 -26.200012\nv 22.600010 33.400002 -26.200012\nv 22.600010 33.400002 -24.200012\nv 20.600010 33.400002 -24.200012\nv 20.600010 33.400002 -26.200012\nv 26.200012 31.400002 -26.200012\nv 26.200012 31.400002 -24.200012\nv 24.200012 31.400002 -24.200012\nv 24.200012 31.400002 -26.200012\nv 26.200012 33.400002 -26.200012\nv 26.200012 33.400002 -24.200012\nv 24.200012 33.400002 -24.200012\nv 24.200012 33.400002 -26.200012\nv 29.800014 31.400002 -26.200012\nv 29.800014 31.400002 -24.200012\nv 27.800014 31.400002 -24.200012\nv 27.800014 31.400002 -26.200012\nv 29.800014 33.400002 -26.200012\nv 29.800014 33.400002 -24.200012\nv 27.800014 33.400002 -24.200012\nv 27.800014 33.400002 -26.200012\nv 33.400017 31.400002 -26.200012\nv 33.400017 31.400002 -24.200012\nv 31.400017 31.400002 -24.200012\nv 31.400017 31.400002 -26.200012\nv 33.400017 33.400002 -26.200012\nv 33.400017 33.400002 -24.200012\nv 31.400017 33.400002 -24.200012\nv 31.400017 33.400002 -26.200012\nv 1.000000 31.400002 -29.800014\nv 1.000000 31.400002 -27.800014\nv -1.000000 31.400002 -27.800014\nv -1.000000 31.400002 -29.800014\nv 1.000000 33.400002 -29.800014\nv 0.999999 33.400002 -27.800014\nv -1.000000 33.400002 -27.800014\nv -1.000000 33.400002 -29.800014\nv 4.600001 31.400002 -29.800014\nv 4.600001 31.400002 -27.800014\nv 2.600001 31.400002 -27.800014\nv 2.600002 31.400002 -29.800014\nv 4.600002 33.400002 -29.800014\nv 4.600001 33.400002 -27.800014\nv 2.600001 33.400002 -27.800014\nv 2.600002 33.400002 -29.800014\nv 8.200003 31.400002 -29.800014\nv 8.200003 31.400002 -27.800014\nv 6.200003 31.400002 -27.800014\nv 6.200004 31.400002 -29.800014\nv 8.200004 33.400002 -29.800014\nv 8.200003 33.400002 -27.800014\nv 6.200003 33.400002 -27.800014\nv 6.200003 33.400002 -29.800014\nv 11.800005 31.400002 -29.800014\nv 11.800005 31.400002 -27.800014\nv 9.800005 31.400002 -27.800014\nv 9.800005 31.400002 -29.800014\nv 11.800005 33.400002 -29.800014\nv 11.800004 33.400002 -27.800014\nv 9.800005 33.400002 -27.800014\nv 9.800005 33.400002 -29.800014\nv 15.400006 31.400002 -29.800014\nv 15.400006 31.400002 -27.800014\nv 13.400006 31.400002 -27.800014\nv 13.400006 31.400002 -29.800014\nv 15.400007 33.400002 -29.800014\nv 15.400005 33.400002 -27.800014\nv 13.400006 33.400002 -27.800014\nv 13.400006 33.400002 -29.800014\nv 19.000008 31.400002 -29.800014\nv 19.000008 31.400002 -27.800014\nv 17.000008 31.400002 -27.800014\nv 17.000008 31.400002 -29.800014\nv 19.000008 33.400002 -29.800014\nv 19.000008 33.400002 -27.800014\nv 17.000008 33.400002 -27.800014\nv 17.000008 33.400002 -29.800014\nv 22.600010 31.400002 -29.800014\nv 22.600010 31.400002 -27.800014\nv 20.600010 31.400002 -27.800014\nv 20.600010 31.400002 -29.800014\nv 22.600010 33.400002 -29.800014\nv 22.600010 33.400002 -27.800014\nv 20.600010 33.400002 -27.800014\nv 20.600010 33.400002 -29.800014\nv 26.200012 31.400002 -29.800014\nv 26.200012 31.400002 -27.800014\nv 24.200012 31.400002 -27.800014\nv 24.200012 31.400002 -29.800014\nv 26.200012 33.400002 -29.800014\nv 26.200012 33.400002 -27.800014\nv 24.200012 33.400002 -27.800014\nv 24.200012 33.400002 -29.800014\nv 29.800014 31.400002 -29.800014\nv 29.800014 31.400002 -27.800014\nv 27.800014 31.400002 -27.800014\nv 27.800014 31.400002 -29.800014\nv 29.800014 33.400002 -29.800014\nv 29.800014 33.400002 -27.800014\nv 27.800014 33.400002 -27.800014\nv 27.800014 33.400002 -29.800014\nv 33.400017 31.400002 -29.800014\nv 33.400017 31.400002 -27.800014\nv 31.400017 31.400002 -27.800014\nv 31.400017 31.400002 -29.800014\nv 33.400017 33.400002 -29.800014\nv 33.400017 33.400002 -27.800014\nv 31.400017 33.400002 -27.800014\nv 31.400017 33.400002 -29.800014\nv 1.000000 31.400002 -33.400017\nv 1.000000 31.400002 -31.400017\nv -1.000000 31.400002 -31.400017\nv -1.000000 31.400002 -33.400017\nv 1.000000 33.400002 -33.400017\nv 0.999999 33.400002 -31.400017\nv -1.000000 33.400002 -31.400017\nv -1.000000 33.400002 -33.400017\nv 4.600001 31.400002 -33.400017\nv 4.600001 31.400002 -31.400017\nv 2.600001 31.400002 -31.400017\nv 2.600002 31.400002 -33.400017\nv 4.600002 33.400002 -33.400017\nv 4.600001 33.400002 -31.400017\nv 2.600001 33.400002 -31.400017\nv 2.600002 33.400002 -33.400017\nv 8.200003 31.400002 -33.400017\nv 8.200003 31.400002 -31.400017\nv 6.200003 31.400002 -31.400017\nv 6.200004 31.400002 -33.400017\nv 8.200004 33.400002 -33.400017\nv 8.200003 33.400002 -31.400017\nv 6.200003 33.400002 -31.400017\nv 6.200003 33.400002 -33.400017\nv 11.800005 31.400002 -33.400017\nv 11.800005 31.400002 -31.400017\nv 9.800005 31.400002 -31.400017\nv 9.800005 31.400002 -33.400017\nv 11.800005 33.400002 -33.400017\nv 11.800004 33.400002 -31.400017\nv 9.800005 33.400002 -31.400017\nv 9.800005 33.400002 -33.400017\nv 15.400006 31.400002 -33.400017\nv 15.400006 31.400002 -31.400017\nv 13.400006 31.400002 -31.400017\nv 13.400006 31.400002 -33.400017\nv 15.400007 33.400002 -33.400017\nv 15.400005 33.400002 -31.400017\nv 13.400006 33.400002 -31.400017\nv 13.400006 33.400002 -33.400017\nv 19.000008 31.400002 -33.400017\nv 19.000008 31.400002 -31.400017\nv 17.000008 31.400002 -31.400017\nv 17.000008 31.400002 -33.400017\nv 19.000008 33.400002 -33.400017\nv 19.000008 33.400002 -31.400017\nv 17.000008 33.400002 -31.400017\nv 17.000008 33.400002 -33.400017\nv 22.600010 31.400002 -33.400017\nv 22.600010 31.400002 -31.400017\nv 20.600010 31.400002 -31.400017\nv 20.600010 31.400002 -33.400017\nv 22.600010 33.400002 -33.400017\nv 22.600010 33.400002 -31.400017\nv 20.600010 33.400002 -31.400017\nv 20.600010 33.400002 -33.400017\nv 26.200012 31.400002 -33.400017\nv 26.200012 31.400002 -31.400017\nv 24.200012 31.400002 -31.400017\nv 24.200012 31.400002 -33.400017\nv 26.200012 33.400002 -33.400017\nv 26.200012 33.400002 -31.400017\nv 24.200012 33.400002 -31.400017\nv 24.200012 33.400002 -33.400017\nv 29.800014 31.400002 -33.400017\nv 29.800014 31.400002 -31.400017\nv 27.800014 31.400002 -31.400017\nv 27.800014 31.400002 -33.400017\nv 29.800014 33.400002 -33.400017\nv 29.800014 33.400002 -31.400017\nv 27.800014 33.400002 -31.400017\nv 27.800014 33.400002 -33.400017\nv 33.400017 31.400002 -33.400017\nv 33.400017 31.400002 -31.400017\nv 31.400017 31.400002 -31.400017\nv 31.400017 31.400002 -33.400017\nv 33.400017 33.400002 -33.400017\nv 33.400017 33.400002 -31.400017\nv 31.400017 33.400002 -31.400017\nv 31.400017 33.400002 -33.400017\nv -1.000000 31.400002 -1.000000\nv -1.000000 31.400002 1.000000\nv 1.000000 31.400002 1.000000\nv 1.000000 31.400002 -1.000000\nv -1.000000 33.400002 -0.999999\nv -0.999999 33.400002 1.000001\nv 1.000000 33.400002 1.000000\nv 1.000000 33.400002 -1.000000\nv -4.600001 31.400002 -1.000000\nv -4.600001 31.400002 1.000000\nv -2.600001 31.400002 1.000000\nv -2.600002 31.400002 -1.000000\nv -4.600002 33.400002 -0.999999\nv -4.600001 33.400002 1.000001\nv -2.600001 33.400002 1.000000\nv -2.600002 33.400002 -1.000000\nv -8.200003 31.400002 -1.000000\nv -8.200003 31.400002 1.000000\nv -6.200003 31.400002 1.000000\nv -6.200004 31.400002 -1.000000\nv -8.200004 33.400002 -0.999999\nv -8.200003 33.400002 1.000001\nv -6.200003 33.400002 1.000000\nv -6.200003 33.400002 -1.000000\nv -11.800005 31.400002 -1.000000\nv -11.800005 31.400002 1.000000\nv -9.800005 31.400002 1.000000\nv -9.800005 31.400002 -1.000000\nv -11.800005 33.400002 -0.999999\nv -11.800004 33.400002 1.000001\nv -9.800005 33.400002 1.000000\nv -9.800005 33.400002 -1.000000\nv -15.400006 31.400002 -1.000000\nv -15.400006 31.400002 1.000000\nv -13.400006 31.400002 1.000000\nv -13.400006 31.400002 -1.000000\nv -15.400007 33.400002 -0.999999\nv -15.400005 33.400002 1.000001\nv -13.400006 33.400002 1.000000\nv -13.400006 33.400002 -1.000000\nv -19.000008 31.400002 -1.000000\nv -19.000008 31.400002 1.000000\nv -17.000008 31.400002 1.000000\nv -17.000008 31.400002 -1.000000\nv -19.000008 33.400002 -0.999999\nv -19.000008 33.400002 1.000001\nv -17.000008 33.400002 1.000000\nv -17.000008 33.400002 -1.000000\nv -22.600010 31.400002 -1.000000\nv -22.600010 31.400002 1.000000\nv -20.600010 31.400002 1.000000\nv -20.600010 31.400002 -1.000000\nv -22.600010 33.400002 -0.999999\nv -22.600010 33.400002 1.000001\nv -20.600010 33.400002 1.000000\nv -20.600010 33.400002 -1.000000\nv -26.200012 31.400002 -1.000000\nv -26.200012 31.400002 1.000000\nv -24.200012 31.400002 1.000000\nv -24.200012 31.400002 -1.000000\nv -26.200012 33.400002 -0.999999\nv -26.200012 33.400002 1.000001\nv -24.200012 33.400002 1.000000\nv -24.200012 33.400002 -1.000000\nv -29.800014 31.400002 -1.000000\nv -29.800014 31.400002 1.000000\nv -27.800014 31.400002 1.000000\nv -27.800014 31.400002 -1.000000\nv -29.800014 33.400002 -0.999999\nv -29.800014 33.400002 1.000001\nv -27.800014 33.400002 1.000000\nv -27.800014 33.400002 -1.000000\nv -33.400017 31.400002 -1.000000\nv -33.400017 31.400002 1.000000\nv -31.400017 31.400002 1.000000\nv -31.400017 31.400002 -1.000000\nv -33.400017 33.400002 -0.999999\nv -33.400017 33.400002 1.000001\nv -31.400017 33.400002 1.000000\nv -31.400017 33.400002 -1.000000\nv -1.000000 31.400002 -4.600001\nv -1.000000 31.400002 -2.600002\nv 1.000000 31.400002 -2.600002\nv 1.000000 31.400002 -4.600002\nv -1.000000 33.400002 -4.600001\nv -0.999999 33.400002 -2.600001\nv 1.000000 33.400002 -2.600002\nv 1.000000 33.400002 -4.600001\nv -4.600001 31.400002 -4.600001\nv -4.600001 31.400002 -2.600002\nv -2.600001 31.400002 -2.600002\nv -2.600002 31.400002 -4.600002\nv -4.600002 33.400002 -4.600001\nv -4.600001 33.400002 -2.600001\nv -2.600001 33.400002 -2.600002\nv -2.600002 33.400002 -4.600001\nv -8.200003 31.400002 -4.600001\nv -8.200003 31.400002 -2.600002\nv -6.200003 31.400002 -2.600002\nv -6.200004 31.400002 -4.600002\nv -8.200004 33.400002 -4.600001\nv -8.200003 33.400002 -2.600001\nv -6.200003 33.400002 -2.600002\nv -6.200003 33.400002 -4.600001\nv -11.800005 31.400002 -4.600001\nv -11.800005 31.400002 -2.600002\nv -9.800005 31.400002 -2.600002\nv -9.800005 31.400002 -4.600002\nv -11.800005 33.400002 -4.600001\nv -11.800004 33.400002 -2.600001\nv -9.800005 33.400002 -2.600002\nv -9.800005 33.400002 -4.600001\nv -15.400006 31.400002 -4.600001\nv -15.400006 31.400002 -2.600002\nv -13.400006 31.400002 -2.600002\nv -13.400006 31.400002 -4.600002\nv -15.400007 33.400002 -4.600001\nv -15.400005 33.400002 -2.600001\nv -13.400006 33.400002 -2.600002\nv -13.400006 33.400002 -4.600001\nv -19.000008 31.400002 -4.600001\nv -19.000008 31.400002 -2.600002\nv -17.000008 31.400002 -2.600002\nv -17.000008 31.400002 -4.600002\nv -19.000008 33.400002 -4.600001\nv -19.000008 33.400002 -2.600001\nv -17.000008 33.400002 -2.600002\nv -17.000008 33.400002 -4.600001\nv -22.600010 31.400002 -4.600001\nv -22.600010 31.400002 -2.600002\nv -20.600010 31.400002 -2.600002\nv -20.600010 31.400002 -4.600002\nv -22.600010 33.400002 -4.600001\nv -22.600010 33.400002 -2.600001\nv -20.600010 33.400002 -2.600002\nv -20.600010 33.400002 -4.600001\nv -26.200012 31.400002 -4.600001\nv -26.200012 31.400002 -2.600002\nv -24.200012 31.400002 -2.600002\nv -24.200012 31.400002 -4.600002\nv -26.200012 33.400002 -4.600001\nv -26.200012 33.400002 -2.600001\nv -24.200012 33.400002 -2.600002\nv -24.200012 33.400002 -4.600001\nv -29.800014 31.400002 -4.600001\nv -29.800014 31.400002 -2.600002\nv -27.800014 31.400002 -2.600002\nv -27.800014 31.400002 -4.600002\nv -29.800014 33.400002 -4.600001\nv -29.800014 33.400002 -2.600001\nv -27.800014 33.400002 -2.600002\nv -27.800014 33.400002 -4.600001\nv -33.400017 31.400002 -4.600001\nv -33.400017 31.400002 -2.600002\nv -31.400017 31.400002 -2.600002\nv -31.400017 31.400002 -4.600002\nv -33.400017 33.400002 -4.600001\nv -33.400017 33.400002 -2.600001\nv -31.400017 33.400002 -2.600002\nv -31.400017 33.400002 -4.600001\nv -1.000000 31.400002 -8.200003\nv -1.000000 31.400002 -6.200003\nv 1.000000 31.400002 -6.200003\nv 1.000000 31.400002 -8.200004\nv -1.000000 33.400002 -8.200003\nv -0.999999 33.400002 -6.200003\nv 1.000000 33.400002 -6.200004\nv 1.000000 33.400002 -8.200003\nv -4.600001 31.400002 -8.200003\nv -4.600001 31.400002 -6.200003\nv -2.600001 31.400002 -6.200003\nv -2.600002 31.400002 -8.200004\nv -4.600002 33.400002 -8.200003\nv -4.600001 33.400002 -6.200003\nv -2.600001 33.400002 -6.200004\nv -2.600002 33.400002 -8.200003\nv -8.200003 31.400002 -8.200003\nv -8.200003 31.400002 -6.200003\nv -6.200003 31.400002 -6.200003\nv -6.200004 31.400002 -8.200004\nv -8.200004 33.400002 -8.200003\nv -8.200003 33.400002 -6.200003\nv -6.200003 33.400002 -6.200004\nv -6.200003 33.400002 -8.200003\nv -11.800005 31.400002 -8.200003\nv -11.800005 31.400002 -6.200003\nv -9.800005 31.400002 -6.200003\nv -9.800005 31.400002 -8.200004\nv -11.800005 33.400002 -8.200003\nv -11.800004 33.400002 -6.200003\nv -9.800005 33.400002 -6.200004\nv -9.800005 33.400002 -8.200003\nv -15.400006 31.400002 -8.200003\nv -15.400006 31.400002 -6.200003\nv -13.400006 31.400002 -6.200003\nv -13.400006 31.400002 -8.200004\nv -15.400007 33.400002 -8.200003\nv -15.400005 33.400002 -6.200003\nv -13.400006 33.400002 -6.200004\nv -13.400006 33.400002 -8.200003\nv -19.000008 31.400002 -8.200003\nv -19.000008 31.400002 -6.200003\nv -17.000008 31.400002 -6.200003\nv -17.000008 31.400002 -8.200004\nv -19.000008 33.400002 -8.200003\nv -19.000008 33.400002 -6.200003\nv -17.000008 33.400002 -6.200004\nv -17.000008 33.400002 -8.200003\nv -22.600010 31.400002 -8.200003\nv -22.600010 31.400002 -6.200003\nv -20.600010 31.400002 -6.200003\nv -20.600010 31.400002 -8.200004\nv -22.600010 33.400002 -8.200003\nv -22.600010 33.400002 -6.200003\nv -20.600010 33.400002 -6.200004\nv -20.600010 33.400002 -8.200003\nv -26.200012 31.400002 -8.200003\nv -26.200012 31.400002 -6.200003\nv -24.200012 31.400002 -6.200003\nv -24.200012 31.400002 -8.200004\nv -26.200012 33.400002 -8.200003\nv -26.200012 33.400002 -6.200003\nv -24.200012 33.400002 -6.200004\nv -24.200012 33.400002 -8.200003\nv -29.800014 31.400002 -8.200003\nv -29.800014 31.400002 -6.200003\nv -27.800014 31.400002 -6.200003\nv -27.800014 31.400002 -8.200004\nv -29.800014 33.400002 -8.200003\nv -29.800014 33.400002 -6.200003\nv -27.800014 33.400002 -6.200004\nv -27.800014 33.400002 -8.200003\nv -33.400017 31.400002 -8.200003\nv -33.400017 31.400002 -6.200003\nv -31.400017 31.400002 -6.200003\nv -31.400017 31.400002 -8.200004\nv -33.400017 33.400002 -8.200003\nv -33.400017 33.400002 -6.200003\nv -31.400017 33.400002 -6.200004\nv -31.400017 33.400002 -8.200003\nv -1.000000 31.400002 -11.800005\nv -1.000000 31.400002 -9.800005\nv 1.000000 31.400002 -9.800005\nv 1.000000 31.400002 -11.800005\nv -1.000000 33.400002 -11.800004\nv -0.999999 33.400002 -9.800004\nv 1.000000 33.400002 -9.800005\nv 1.000000 33.400002 -11.800005\nv -4.600001 31.400002 -11.800005\nv -4.600001 31.400002 -9.800005\nv -2.600001 31.400002 -9.800005\nv -2.600002 31.400002 -11.800005\nv -4.600002 33.400002 -11.800004\nv -4.600001 33.400002 -9.800004\nv -2.600001 33.400002 -9.800005\nv -2.600002 33.400002 -11.800005\nv -8.200003 31.400002 -11.800005\nv -8.200003 31.400002 -9.800005\nv -6.200003 31.400002 -9.800005\nv -6.200004 31.400002 -11.800005\nv -8.200004 33.400002 -11.800004\nv -8.200003 33.400002 -9.800004\nv -6.200003 33.400002 -9.800005\nv -6.200003 33.400002 -11.800005\nv -11.800005 31.400002 -11.800005\nv -11.800005 31.400002 -9.800005\nv -9.800005 31.400002 -9.800005\nv -9.800005 31.400002 -11.800005\nv -11.800005 33.400002 -11.800004\nv -11.800004 33.400002 -9.800004\nv -9.800005 33.400002 -9.800005\nv -9.800005 33.400002 -11.800005\nv -15.400006 31.400002 -11.800005\nv -15.400006 31.400002 -9.800005\nv -13.400006 31.400002 -9.800005\nv -13.400006 31.400002 -11.800005\nv -15.400007 33.400002 -11.800004\nv -15.400005 33.400002 -9.800004\nv -13.400006 33.400002 -9.800005\nv -13.400006 33.400002 -11.800005\nv -19.000008 31.400002 -11.800005\nv -19.000008 31.400002 -9.800005\nv -17.000008 31.400002 -9.800005\nv -17.000008 31.400002 -11.800005\nv -19.000008 33.400002 -11.800004\nv -19.000008 33.400002 -9.800004\nv -17.000008 33.400002 -9.800005\nv -17.000008 33.400002 -11.800005\nv -22.600010 31.400002 -11.800005\nv -22.600010 31.400002 -9.800005\nv -20.600010 31.400002 -9.800005\nv -20.600010 31.400002 -11.800005\nv -22.600010 33.400002 -11.800004\nv -22.600010 33.400002 -9.800004\nv -20.600010 33.400002 -9.800005\nv -20.600010 33.400002 -11.800005\nv -26.200012 31.400002 -11.800005\nv -26.200012 31.400002 -9.800005\nv -24.200012 31.400002 -9.800005\nv -24.200012 31.400002 -11.800005\nv -26.200012 33.400002 -11.800004\nv -26.200012 33.400002 -9.800004\nv -24.200012 33.400002 -9.800005\nv -24.200012 33.400002 -11.800005\nv -29.800014 31.400002 -11.800005\nv -29.800014 31.400002 -9.800005\nv -27.800014 31.400002 -9.800005\nv -27.800014 31.400002 -11.800005\nv -29.800014 33.400002 -11.800004\nv -29.800014 33.400002 -9.800004\nv -27.800014 33.400002 -9.800005\nv -27.800014 33.400002 -11.800005\nv -33.400017 31.400002 -11.800005\nv -33.400017 31.400002 -9.800005\nv -31.400017 31.400002 -9.800005\nv -31.400017 31.400002 -11.800005\nv -33.400017 33.400002 -11.800004\nv -33.400017 33.400002 -9.800004\nv -31.400017 33.400002 -9.800005\nv -31.400017 33.400002 -11.800005\nv -1.000000 31.400002 -15.400006\nv -1.000000 31.400002 -13.400006\nv 1.000000 31.400002 -13.400006\nv 1.000000 31.400002 -15.400006\nv -1.000000 33.400002 -15.400005\nv -0.999999 33.400002 -13.400005\nv 1.000000 33.400002 -13.400006\nv 1.000000 33.400002 -15.400006\nv -4.600001 31.400002 -15.400006\nv -4.600001 31.400002 -13.400006\nv -2.600001 31.400002 -13.400006\nv -2.600002 31.400002 -15.400006\nv -4.600002 33.400002 -15.400005\nv -4.600001 33.400002 -13.400005\nv -2.600001 33.400002 -13.400006\nv -2.600002 33.400002 -15.400006\nv -8.200003 31.400002 -15.400006\nv -8.200003 31.400002 -13.400006\nv -6.200003 31.400002 -13.400006\nv -6.200004 31.400002 -15.400006\nv -8.200004 33.400002 -15.400005\nv -8.200003 33.400002 -13.400005\nv -6.200003 33.400002 -13.400006\nv -6.200003 33.400002 -15.400006\nv -11.800005 31.400002 -15.400006\nv -11.800005 31.400002 -13.400006\nv -9.800005 31.400002 -13.400006\nv -9.800005 31.400002 -15.400006\nv -11.800005 33.400002 -15.400005\nv -11.800004 33.400002 -13.400005\nv -9.800005 33.400002 -13.400006\nv -9.800005 33.400002 -15.400006\nv -15.400006 31.400002 -15.400006\nv -15.400006 31.400002 -13.400006\nv -13.400006 31.400002 -13.400006\nv -13.400006 31.400002 -15.400006\nv -15.400007 33.400002 -15.400005\nv -15.400005 33.400002 -13.400005\nv -13.400006 33.400002 -13.400006\nv -13.400006 33.400002 -15.400006\nv -19.000008 31.400002 -15.400006\nv -19.000008 31.400002 -13.400006\nv -17.000008 31.400002 -13.400006\nv -17.000008 31.400002 -15.400006\nv -19.000008 33.400002 -15.400005\nv -19.000008 33.400002 -13.400005\nv -17.000008 33.400002 -13.400006\nv -17.000008 33.400002 -15.400006\nv -22.600010 31.400002 -15.400006\nv -22.600010 31.400002 -13.400006\nv -20.600010 31.400002 -13.400006\nv -20.600010 31.400002 -15.400006\nv -22.600010 33.400002 -15.400005\nv -22.600010 33.400002 -13.400005\nv -20.600010 33.400002 -13.400006\nv -20.600010 33.400002 -15.400006\nv -26.200012 31.400002 -15.400006\nv -26.200012 31.400002 -13.400006\nv -24.200012 31.400002 -13.400006\nv -24.200012 31.400002 -15.400006\nv -26.200012 33.400002 -15.400005\nv -26.200012 33.400002 -13.400005\nv -24.200012 33.400002 -13.400006\nv -24.200012 33.400002 -15.400006\nv -29.800014 31.400002 -15.400006\nv -29.800014 31.400002 -13.400006\nv -27.800014 31.400002 -13.400006\nv -27.800014 31.400002 -15.400006\nv -29.800014 33.400002 -15.400005\nv -29.800014 33.400002 -13.400005\nv -27.800014 33.400002 -13.400006\nv -27.800014 33.400002 -15.400006\nv -33.400017 31.400002 -15.400006\nv -33.400017 31.400002 -13.400006\nv -31.400017 31.400002 -13.400006\nv -31.400017 31.400002 -15.400006\nv -33.400017 33.400002 -15.400005\nv -33.400017 33.400002 -13.400005\nv -31.400017 33.400002 -13.400006\nv -31.400017 33.400002 -15.400006\nv -1.000000 31.400002 -19.000008\nv -1.000000 31.400002 -17.000008\nv 1.000000 31.400002 -17.000008\nv 1.000000 31.400002 -19.000008\nv -1.000000 33.400002 -19.000008\nv -0.999999 33.400002 -17.000008\nv 1.000000 33.400002 -17.000008\nv 1.000000 33.400002 -19.000008\nv -4.600001 31.400002 -19.000008\nv -4.600001 31.400002 -17.000008\nv -2.600001 31.400002 -17.000008\nv -2.600002 31.400002 -19.000008\nv -4.600002 33.400002 -19.000008\nv -4.600001 33.400002 -17.000008\nv -2.600001 33.400002 -17.000008\nv -2.600002 33.400002 -19.000008\nv -8.200003 31.400002 -19.000008\nv -8.200003 31.400002 -17.000008\nv -6.200003 31.400002 -17.000008\nv -6.200004 31.400002 -19.000008\nv -8.200004 33.400002 -19.000008\nv -8.200003 33.400002 -17.000008\nv -6.200003 33.400002 -17.000008\nv -6.200003 33.400002 -19.000008\nv -11.800005 31.400002 -19.000008\nv -11.800005 31.400002 -17.000008\nv -9.800005 31.400002 -17.000008\nv -9.800005 31.400002 -19.000008\nv -11.800005 33.400002 -19.000008\nv -11.800004 33.400002 -17.000008\nv -9.800005 33.400002 -17.000008\nv -9.800005 33.400002 -19.000008\nv -15.400006 31.400002 -19.000008\nv -15.400006 31.400002 -17.000008\nv -13.400006 31.400002 -17.000008\nv -13.400006 31.400002 -19.000008\nv -15.400007 33.400002 -19.000008\nv -15.400005 33.400002 -17.000008\nv -13.400006 33.400002 -17.000008\nv -13.400006 33.400002 -19.000008\nv -19.000008 31.400002 -19.000008\nv -19.000008 31.400002 -17.000008\nv -17.000008 31.400002 -17.000008\nv -17.000008 31.400002 -19.000008\nv -19.000008 33.400002 -19.000008\nv -19.000008 33.400002 -17.000008\nv -17.000008 33.400002 -17.000008\nv -17.000008 33.400002 -19.000008\nv -22.600010 31.400002 -19.000008\nv -22.600010 31.400002 -17.000008\nv -20.600010 31.400002 -17.000008\nv -20.600010 31.400002 -19.000008\nv -22.600010 33.400002 -19.000008\nv -22.600010 33.400002 -17.000008\nv -20.600010 33.400002 -17.000008\nv -20.600010 33.400002 -19.000008\nv -26.200012 31.400002 -19.000008\nv -26.200012 31.400002 -17.000008\nv -24.200012 31.400002 -17.000008\nv -24.200012 31.400002 -19.000008\nv -26.200012 33.400002 -19.000008\nv -26.200012 33.400002 -17.000008\nv -24.200012 33.400002 -17.000008\nv -24.200012 33.400002 -19.000008\nv -29.800014 31.400002 -19.000008\nv -29.800014 31.400002 -17.000008\nv -27.800014 31.400002 -17.000008\nv -27.800014 31.400002 -19.000008\nv -29.800014 33.400002 -19.000008\nv -29.800014 33.400002 -17.000008\nv -27.800014 33.400002 -17.000008\nv -27.800014 33.400002 -19.000008\nv -33.400017 31.400002 -19.000008\nv -33.400017 31.400002 -17.000008\nv -31.400017 31.400002 -17.000008\nv -31.400017 31.400002 -19.000008\nv -33.400017 33.400002 -19.000008\nv -33.400017 33.400002 -17.000008\nv -31.400017 33.400002 -17.000008\nv -31.400017 33.400002 -19.000008\nv -1.000000 31.400002 -22.600010\nv -1.000000 31.400002 -20.600010\nv 1.000000 31.400002 -20.600010\nv 1.000000 31.400002 -22.600010\nv -1.000000 33.400002 -22.600010\nv -0.999999 33.400002 -20.600010\nv 1.000000 33.400002 -20.600010\nv 1.000000 33.400002 -22.600010\nv -4.600001 31.400002 -22.600010\nv -4.600001 31.400002 -20.600010\nv -2.600001 31.400002 -20.600010\nv -2.600002 31.400002 -22.600010\nv -4.600002 33.400002 -22.600010\nv -4.600001 33.400002 -20.600010\nv -2.600001 33.400002 -20.600010\nv -2.600002 33.400002 -22.600010\nv -8.200003 31.400002 -22.600010\nv -8.200003 31.400002 -20.600010\nv -6.200003 31.400002 -20.600010\nv -6.200004 31.400002 -22.600010\nv -8.200004 33.400002 -22.600010\nv -8.200003 33.400002 -20.600010\nv -6.200003 33.400002 -20.600010\nv -6.200003 33.400002 -22.600010\nv -11.800005 31.400002 -22.600010\nv -11.800005 31.400002 -20.600010\nv -9.800005 31.400002 -20.600010\nv -9.800005 31.400002 -22.600010\nv -11.800005 33.400002 -22.600010\nv -11.800004 33.400002 -20.600010\nv -9.800005 33.400002 -20.600010\nv -9.800005 33.400002 -22.600010\nv -15.400006 31.400002 -22.600010\nv -15.400006 31.400002 -20.600010\nv -13.400006 31.400002 -20.600010\nv -13.400006 31.400002 -22.600010\nv -15.400007 33.400002 -22.600010\nv -15.400005 33.400002 -20.600010\nv -13.400006 33.400002 -20.600010\nv -13.400006 33.400002 -22.600010\nv -19.000008 31.400002 -22.600010\nv -19.000008 31.400002 -20.600010\nv -17.000008 31.400002 -20.600010\nv -17.000008 31.400002 -22.600010\nv -19.000008 33.400002 -22.600010\nv -19.000008 33.400002 -20.600010\nv -17.000008 33.400002 -20.600010\nv -17.000008 33.400002 -22.600010\nv -22.600010 31.400002 -22.600010\nv -22.600010 31.400002 -20.600010\nv -20.600010 31.400002 -20.600010\nv -20.600010 31.400002 -22.600010\nv -22.600010 33.400002 -22.600010\nv -22.600010 33.400002 -20.600010\nv -20.600010 33.400002 -20.600010\nv -20.600010 33.400002 -22.600010\nv -26.200012 31.400002 -22.600010\nv -26.200012 31.400002 -20.600010\nv -24.200012 31.400002 -20.600010\nv -24.200012 31.400002 -22.600010\nv -26.200012 33.400002 -22.600010\nv -26.200012 33.400002 -20.600010\nv -24.200012 33.400002 -20.600010\nv -24.200012 33.400002 -22.600010\nv -29.800014 31.400002 -22.600010\nv -29.800014 31.400002 -20.600010\nv -27.800014 31.400002 -20.600010\nv -27.800014 31.400002 -22.600010\nv -29.800014 33.400002 -22.600010\nv -29.800014 33.400002 -20.600010\nv -27.800014 33.400002 -20.600010\nv -27.800014 33.400002 -22.600010\nv -33.400017 31.400002 -22.600010\nv -33.400017 31.400002 -20.600010\nv -31.400017 31.400002 -20.600010\nv -31.400017 31.400002 -22.600010\nv -33.400017 33.400002 -22.600010\nv -33.400017 33.400002 -20.600010\nv -31.400017 33.400002 -20.600010\nv -31.400017 33.400002 -22.600010\nv -1.000000 31.400002 -26.200012\nv -1.000000 31.400002 -24.200012\nv 1.000000 31.400002 -24.200012\nv 1.000000 31.400002 -26.200012\nv -1.000000 33.400002 -26.200012\nv -0.999999 33.400002 -24.200012\nv 1.000000 33.400002 -24.200012\nv 1.000000 33.400002 -26.200012\nv -4.600001 31.400002 -26.200012\nv -4.600001 31.400002 -24.200012\nv -2.600001 31.400002 -24.200012\nv -2.600002 31.400002 -26.200012\nv -4.600002 33.400002 -26.200012\nv -4.600001 33.400002 -24.200012\nv -2.600001 33.400002 -24.200012\nv -2.600002 33.400002 -26.200012\nv -8.200003 31.400002 -26.200012\nv -8.200003 31.400002 -24.200012\nv -6.200003 31.400002 -24.200012\nv -6.200004 31.400002 -26.200012\nv -8.200004 33.400002 -26.200012\nv -8.200003 33.400002 -24.200012\nv -6.200003 33.400002 -24.200012\nv -6.200003 33.400002 -26.200012\nv -11.800005 31.400002 -26.200012\nv -11.800005 31.400002 -24.200012\nv -9.800005 31.400002 -24.200012\nv -9.800005 31.400002 -26.200012\nv -11.800005 33.400002 -26.200012\nv -11.800004 33.400002 -24.200012\nv -9.800005 33.400002 -24.200012\nv -9.800005 33.400002 -26.200012\nv -15.400006 31.400002 -26.200012\nv -15.400006 31.400002 -24.200012\nv -13.400006 31.400002 -24.200012\nv -13.400006 31.400002 -26.200012\nv -15.400007 33.400002 -26.200012\nv -15.400005 33.400002 -24.200012\nv -13.400006 33.400002 -24.200012\nv -13.400006 33.400002 -26.200012\nv -19.000008 31.400002 -26.200012\nv -19.000008 31.400002 -24.200012\nv -17.000008 31.400002 -24.200012\nv -17.000008 31.400002 -26.200012\nv -19.000008 33.400002 -26.200012\nv -19.000008 33.400002 -24.200012\nv -17.000008 33.400002 -24.200012\nv -17.000008 33.400002 -26.200012\nv -22.600010 31.400002 -26.200012\nv -22.600010 31.400002 -24.200012\nv -20.600010 31.400002 -24.200012\nv -20.600010 31.400002 -26.200012\nv -22.600010 33.400002 -26.200012\nv -22.600010 33.400002 -24.200012\nv -20.600010 33.400002 -24.200012\nv -20.600010 33.400002 -26.200012\nv -26.200012 31.400002 -26.200012\nv -26.200012 31.400002 -24.200012\nv -24.200012 31.400002 -24.200012\nv -24.200012 31.400002 -26.200012\nv -26.200012 33.400002 -26.200012\nv -26.200012 33.400002 -24.200012\nv -24.200012 33.400002 -24.200012\nv -24.200012 33.400002 -26.200012\nv -29.800014 31.400002 -26.200012\nv -29.800014 31.400002 -24.200012\nv -27.800014 31.400002 -24.200012\nv -27.800014 31.400002 -26.200012\nv -29.800014 33.400002 -26.200012\nv -29.800014 33.400002 -24.200012\nv -27.800014 33.400002 -24.200012\nv -27.800014 33.400002 -26.200012\nv -33.400017 31.400002 -26.200012\nv -33.400017 31.400002 -24.200012\nv -31.400017 31.400002 -24.200012\nv -31.400017 31.400002 -26.200012\nv -33.400017 33.400002 -26.200012\nv -33.400017 33.400002 -24.200012\nv -31.400017 33.400002 -24.200012\nv -31.400017 33.400002 -26.200012\nv -1.000000 31.400002 -29.800014\nv -1.000000 31.400002 -27.800014\nv 1.000000 31.400002 -27.800014\nv 1.000000 31.400002 -29.800014\nv -1.000000 33.400002 -29.800014\nv -0.999999 33.400002 -27.800014\nv 1.000000 33.400002 -27.800014\nv 1.000000 33.400002 -29.800014\nv -4.600001 31.400002 -29.800014\nv -4.600001 31.400002 -27.800014\nv -2.600001 31.400002 -27.800014\nv -2.600002 31.400002 -29.800014\nv -4.600002 33.400002 -29.800014\nv -4.600001 33.400002 -27.800014\nv -2.600001 33.400002 -27.800014\nv -2.600002 33.400002 -29.800014\nv -8.200003 31.400002 -29.800014\nv -8.200003 31.400002 -27.800014\nv -6.200003 31.400002 -27.800014\nv -6.200004 31.400002 -29.800014\nv -8.200004 33.400002 -29.800014\nv -8.200003 33.400002 -27.800014\nv -6.200003 33.400002 -27.800014\nv -6.200003 33.400002 -29.800014\nv -11.800005 31.400002 -29.800014\nv -11.800005 31.400002 -27.800014\nv -9.800005 31.400002 -27.800014\nv -9.800005 31.400002 -29.800014\nv -11.800005 33.400002 -29.800014\nv -11.800004 33.400002 -27.800014\nv -9.800005 33.400002 -27.800014\nv -9.800005 33.400002 -29.800014\nv -15.400006 31.400002 -29.800014\nv -15.400006 31.400002 -27.800014\nv -13.400006 31.400002 -27.800014\nv -13.400006 31.400002 -29.800014\nv -15.400007 33.400002 -29.800014\nv -15.400005 33.400002 -27.800014\nv -13.400006 33.400002 -27.800014\nv -13.400006 33.400002 -29.800014\nv -19.000008 31.400002 -29.800014\nv -19.000008 31.400002 -27.800014\nv -17.000008 31.400002 -27.800014\nv -17.000008 31.400002 -29.800014\nv -19.000008 33.400002 -29.800014\nv -19.000008 33.400002 -27.800014\nv -17.000008 33.400002 -27.800014\nv -17.000008 33.400002 -29.800014\nv -22.600010 31.400002 -29.800014\nv -22.600010 31.400002 -27.800014\nv -20.600010 31.400002 -27.800014\nv -20.600010 31.400002 -29.800014\nv -22.600010 33.400002 -29.800014\nv -22.600010 33.400002 -27.800014\nv -20.600010 33.400002 -27.800014\nv -20.600010 33.400002 -29.800014\nv -26.200012 31.400002 -29.800014\nv -26.200012 31.400002 -27.800014\nv -24.200012 31.400002 -27.800014\nv -24.200012 31.400002 -29.800014\nv -26.200012 33.400002 -29.800014\nv -26.200012 33.400002 -27.800014\nv -24.200012 33.400002 -27.800014\nv -24.200012 33.400002 -29.800014\nv -29.800014 31.400002 -29.800014\nv -29.800014 31.400002 -27.800014\nv -27.800014 31.400002 -27.800014\nv -27.800014 31.400002 -29.800014\nv -29.800014 33.400002 -29.800014\nv -29.800014 33.400002 -27.800014\nv -27.800014 33.400002 -27.800014\nv -27.800014 33.400002 -29.800014\nv -33.400017 31.400002 -29.800014\nv -33.400017 31.400002 -27.800014\nv -31.400017 31.400002 -27.800014\nv -31.400017 31.400002 -29.800014\nv -33.400017 33.400002 -29.800014\nv -33.400017 33.400002 -27.800014\nv -31.400017 33.400002 -27.800014\nv -31.400017 33.400002 -29.800014\nv -1.000000 31.400002 -33.400017\nv -1.000000 31.400002 -31.400017\nv 1.000000 31.400002 -31.400017\nv 1.000000 31.400002 -33.400017\nv -1.000000 33.400002 -33.400017\nv -0.999999 33.400002 -31.400017\nv 1.000000 33.400002 -31.400017\nv 1.000000 33.400002 -33.400017\nv -4.600001 31.400002 -33.400017\nv -4.600001 31.400002 -31.400017\nv -2.600001 31.400002 -31.400017\nv -2.600002 31.400002 -33.400017\nv -4.600002 33.400002 -33.400017\nv -4.600001 33.400002 -31.400017\nv -2.600001 33.400002 -31.400017\nv -2.600002 33.400002 -33.400017\nv -8.200003 31.400002 -33.400017\nv -8.200003 31.400002 -31.400017\nv -6.200003 31.400002 -31.400017\nv -6.200004 31.400002 -33.400017\nv -8.200004 33.400002 -33.400017\nv -8.200003 33.400002 -31.400017\nv -6.200003 33.400002 -31.400017\nv -6.200003 33.400002 -33.400017\nv -11.800005 31.400002 -33.400017\nv -11.800005 31.400002 -31.400017\nv -9.800005 31.400002 -31.400017\nv -9.800005 31.400002 -33.400017\nv -11.800005 33.400002 -33.400017\nv -11.800004 33.400002 -31.400017\nv -9.800005 33.400002 -31.400017\nv -9.800005 33.400002 -33.400017\nv -15.400006 31.400002 -33.400017\nv -15.400006 31.400002 -31.400017\nv -13.400006 31.400002 -31.400017\nv -13.400006 31.400002 -33.400017\nv -15.400007 33.400002 -33.400017\nv -15.400005 33.400002 -31.400017\nv -13.400006 33.400002 -31.400017\nv -13.400006 33.400002 -33.400017\nv -19.000008 31.400002 -33.400017\nv -19.000008 31.400002 -31.400017\nv -17.000008 31.400002 -31.400017\nv -17.000008 31.400002 -33.400017\nv -19.000008 33.400002 -33.400017\nv -19.000008 33.400002 -31.400017\nv -17.000008 33.400002 -31.400017\nv -17.000008 33.400002 -33.400017\nv -22.600010 31.400002 -33.400017\nv -22.600010 31.400002 -31.400017\nv -20.600010 31.400002 -31.400017\nv -20.600010 31.400002 -33.400017\nv -22.600010 33.400002 -33.400017\nv -22.600010 33.400002 -31.400017\nv -20.600010 33.400002 -31.400017\nv -20.600010 33.400002 -33.400017\nv -26.200012 31.400002 -33.400017\nv -26.200012 31.400002 -31.400017\nv -24.200012 31.400002 -31.400017\nv -24.200012 31.400002 -33.400017\nv -26.200012 33.400002 -33.400017\nv -26.200012 33.400002 -31.400017\nv -24.200012 33.400002 -31.400017\nv -24.200012 33.400002 -33.400017\nv -29.800014 31.400002 -33.400017\nv -29.800014 31.400002 -31.400017\nv -27.800014 31.400002 -31.400017\nv -27.800014 31.400002 -33.400017\nv -29.800014 33.400002 -33.400017\nv -29.800014 33.400002 -31.400017\nv -27.800014 33.400002 -31.400017\nv -27.800014 33.400002 -33.400017\nv -33.400017 31.400002 -33.400017\nv -33.400017 31.400002 -31.400017\nv -31.400017 31.400002 -31.400017\nv -31.400017 31.400002 -33.400017\nv -33.400017 33.400002 -33.400017\nv -33.400017 33.400002 -31.400017\nv -31.400017 33.400002 -31.400017\nv -31.400017 33.400002 -33.400017\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 1.000000 0.000000\nvn 1.000000 -0.000000 0.000000\nvn -0.000000 -0.000000 1.000000\nvn -1.000000 -0.000000 -0.000000\nvn 0.000000 0.000000 -1.000000\nusemtl Material\ns off\nf 2//1 3//1 4//1\nf 8//2 7//2 6//2\nf 1//3 5//3 6//3\nf 2//4 6//4 7//4\nf 7//5 8//5 4//5\nf 1//6 4//6 8//6\nf 10//1 11//1 12//1\nf 13//2 16//2 15//2\nf 9//3 13//3 14//3\nf 10//4 14//4 15//4\nf 15//5 16//5 12//5\nf 9//6 12//6 16//6\nf 18//1 19//1 20//1\nf 24//2 23//2 22//2\nf 17//3 21//3 22//3\nf 18//4 22//4 23//4\nf 23//5 24//5 20//5\nf 21//6 17//6 20//6\nf 26//1 27//1 28//1\nf 32//2 31//2 30//2\nf 25//3 29//3 30//3\nf 26//4 30//4 31//4\nf 31//5 32//5 28//5\nf 25//6 28//6 32//6\nf 34//1 35//1 36//1\nf 37//2 40//2 39//2\nf 33//3 37//3 38//3\nf 34//4 38//4 39//4\nf 39//5 40//5 36//5\nf 37//6 33//6 36//6\nf 42//1 43//1 44//1\nf 48//2 47//2 46//2\nf 41//3 45//3 46//3\nf 46//4 47//4 43//4\nf 47//5 48//5 44//5\nf 41//6 44//6 48//6\nf 50//1 51//1 52//1\nf 56//2 55//2 54//2\nf 49//3 53//3 54//3\nf 54//4 55//4 51//4\nf 55//5 56//5 52//5\nf 49//6 52//6 56//6\nf 58//1 59//1 60//1\nf 64//2 63//2 62//2\nf 57//3 61//3 62//3\nf 62//4 63//4 59//4\nf 63//5 64//5 60//5\nf 57//6 60//6 64//6\nf 66//1 67//1 68//1\nf 72//2 71//2 70//2\nf 65//3 69//3 70//3\nf 70//4 71//4 67//4\nf 71//5 72//5 68//5\nf 65//6 68//6 72//6\nf 74//1 75//1 76//1\nf 80//2 79//2 78//2\nf 73//3 77//3 78//3\nf 78//4 79//4 75//4\nf 79//5 80//5 76//5\nf 73//6 76//6 80//6\nf 82//1 83//1 84//1\nf 88//2 87//2 86//2\nf 85//3 86//3 82//3\nf 82//4 86//4 87//4\nf 87//5 88//5 84//5\nf 81//6 84//6 88//6\nf 90//1 91//1 92//1\nf 93//2 96//2 95//2\nf 89//3 93//3 94//3\nf 90//4 94//4 95//4\nf 95//5 96//5 92//5\nf 89//6 92//6 96//6\nf 98//1 99//1 100//1\nf 104//2 103//2 102//2\nf 97//3 101//3 102//3\nf 98//4 102//4 103//4\nf 103//5 104//5 100//5\nf 101//6 97//6 100//6\nf 106//1 107//1 108//1\nf 112//2 111//2 110//2\nf 105//3 109//3 110//3\nf 106//4 110//4 111//4\nf 111//5 112//5 108//5\nf 105//6 108//6 112//6\nf 114//1 115//1 116//1\nf 117//2 120//2 119//2\nf 113//3 117//3 118//3\nf 114//4 118//4 119//4\nf 119//5 120//5 116//5\nf 117//6 113//6 116//6\nf 122//1 123//1 124//1\nf 128//2 127//2 126//2\nf 121//3 125//3 126//3\nf 126//4 127//4 123//4\nf 127//5 128//5 124//5\nf 121//6 124//6 128//6\nf 130//1 131//1 132//1\nf 136//2 135//2 134//2\nf 129//3 133//3 134//3\nf 134//4 135//4 131//4\nf 135//5 136//5 132//5\nf 129//6 132//6 136//6\nf 138//1 139//1 140//1\nf 144//2 143//2 142//2\nf 137//3 141//3 142//3\nf 142//4 143//4 139//4\nf 143//5 144//5 140//5\nf 137//6 140//6 144//6\nf 146//1 147//1 148//1\nf 152//2 151//2 150//2\nf 145//3 149//3 150//3\nf 150//4 151//4 147//4\nf 151//5 152//5 148//5\nf 145//6 148//6 152//6\nf 154//1 155//1 156//1\nf 160//2 159//2 158//2\nf 153//3 157//3 158//3\nf 158//4 159//4 155//4\nf 159//5 160//5 156//5\nf 153//6 156//6 160//6\nf 162//1 163//1 164//1\nf 165//2 168//2 167//2\nf 165//3 166//3 162//3\nf 162//4 166//4 167//4\nf 167//5 168//5 164//5\nf 161//6 164//6 168//6\nf 170//1 171//1 172//1\nf 173//2 176//2 175//2\nf 173//3 174//3 170//3\nf 170//4 174//4 175//4\nf 175//5 176//5 172//5\nf 169//6 172//6 176//6\nf 178//1 179//1 180//1\nf 181//2 184//2 183//2\nf 177//3 181//3 182//3\nf 178//4 182//4 183//4\nf 183//5 184//5 180//5\nf 181//6 177//6 180//6\nf 186//1 187//1 188//1\nf 189//2 192//2 191//2\nf 185//3 189//3 190//3\nf 186//4 190//4 191//4\nf 191//5 192//5 188//5\nf 185//6 188//6 192//6\nf 194//1 195//1 196//1\nf 197//2 200//2 199//2\nf 197//3 198//3 194//3\nf 194//4 198//4 199//4\nf 199//5 200//5 196//5\nf 197//6 193//6 196//6\nf 202//1 203//1 204//1\nf 208//2 207//2 206//2\nf 201//3 205//3 206//3\nf 206//4 207//4 203//4\nf 207//5 208//5 204//5\nf 201//6 204//6 208//6\nf 210//1 211//1 212//1\nf 216//2 215//2 214//2\nf 209//3 213//3 214//3\nf 214//4 215//4 211//4\nf 215//5 216//5 212//5\nf 209//6 212//6 216//6\nf 218//1 219//1 220//1\nf 224//2 223//2 222//2\nf 217//3 221//3 222//3\nf 222//4 223//4 219//4\nf 223//5 224//5 220//5\nf 217//6 220//6 224//6\nf 226//1 227//1 228//1\nf 232//2 231//2 230//2\nf 225//3 229//3 230//3\nf 230//4 231//4 227//4\nf 231//5 232//5 228//5\nf 225//6 228//6 232//6\nf 234//1 235//1 236//1\nf 240//2 239//2 238//2\nf 233//3 237//3 238//3\nf 238//4 239//4 235//4\nf 239//5 240//5 236//5\nf 233//6 236//6 240//6\nf 241//1 242//1 243//1\nf 248//2 247//2 246//2\nf 241//3 245//3 246//3\nf 242//4 246//4 247//4\nf 247//5 248//5 244//5\nf 241//6 244//6 248//6\nf 249//1 250//1 251//1\nf 256//2 255//2 254//2\nf 249//3 253//3 254//3\nf 250//4 254//4 255//4\nf 255//5 256//5 252//5\nf 249//6 252//6 256//6\nf 258//1 259//1 260//1\nf 264//2 263//2 262//2\nf 257//3 261//3 262//3\nf 258//4 262//4 263//4\nf 263//5 264//5 260//5\nf 261//6 257//6 260//6\nf 266//1 267//1 268//1\nf 272//2 271//2 270//2\nf 265//3 269//3 270//3\nf 266//4 270//4 271//4\nf 271//5 272//5 268//5\nf 265//6 268//6 272//6\nf 274//1 275//1 276//1\nf 280//2 279//2 278//2\nf 273//3 277//3 278//3\nf 274//4 278//4 279//4\nf 279//5 280//5 276//5\nf 277//6 273//6 276//6\nf 282//1 283//1 284//1\nf 288//2 287//2 286//2\nf 281//3 285//3 286//3\nf 286//4 287//4 283//4\nf 287//5 288//5 284//5\nf 281//6 284//6 288//6\nf 290//1 291//1 292//1\nf 296//2 295//2 294//2\nf 289//3 293//3 294//3\nf 294//4 295//4 291//4\nf 295//5 296//5 292//5\nf 289//6 292//6 296//6\nf 298//1 299//1 300//1\nf 304//2 303//2 302//2\nf 297//3 301//3 302//3\nf 302//4 303//4 299//4\nf 303//5 304//5 300//5\nf 297//6 300//6 304//6\nf 306//1 307//1 308//1\nf 312//2 311//2 310//2\nf 305//3 309//3 310//3\nf 310//4 311//4 307//4\nf 311//5 312//5 308//5\nf 305//6 308//6 312//6\nf 314//1 315//1 316//1\nf 320//2 319//2 318//2\nf 313//3 317//3 318//3\nf 318//4 319//4 315//4\nf 319//5 320//5 316//5\nf 313//6 316//6 320//6\nf 321//1 322//1 323//1\nf 328//2 327//2 326//2\nf 321//3 325//3 326//3\nf 322//4 326//4 327//4\nf 327//5 328//5 324//5\nf 321//6 324//6 328//6\nf 329//1 330//1 331//1\nf 336//2 335//2 334//2\nf 329//3 333//3 334//3\nf 330//4 334//4 335//4\nf 335//5 336//5 332//5\nf 329//6 332//6 336//6\nf 338//1 339//1 340//1\nf 344//2 343//2 342//2\nf 337//3 341//3 342//3\nf 338//4 342//4 343//4\nf 343//5 344//5 340//5\nf 341//6 337//6 340//6\nf 346//1 347//1 348//1\nf 352//2 351//2 350//2\nf 345//3 349//3 350//3\nf 346//4 350//4 351//4\nf 351//5 352//5 348//5\nf 345//6 348//6 352//6\nf 354//1 355//1 356//1\nf 360//2 359//2 358//2\nf 353//3 357//3 358//3\nf 354//4 358//4 359//4\nf 359//5 360//5 356//5\nf 357//6 353//6 356//6\nf 362//1 363//1 364//1\nf 368//2 367//2 366//2\nf 361//3 365//3 366//3\nf 366//4 367//4 363//4\nf 367//5 368//5 364//5\nf 361//6 364//6 368//6\nf 370//1 371//1 372//1\nf 376//2 375//2 374//2\nf 369//3 373//3 374//3\nf 374//4 375//4 371//4\nf 375//5 376//5 372//5\nf 369//6 372//6 376//6\nf 378//1 379//1 380//1\nf 384//2 383//2 382//2\nf 377//3 381//3 382//3\nf 382//4 383//4 379//4\nf 383//5 384//5 380//5\nf 377//6 380//6 384//6\nf 386//1 387//1 388//1\nf 392//2 391//2 390//2\nf 385//3 389//3 390//3\nf 390//4 391//4 387//4\nf 391//5 392//5 388//5\nf 385//6 388//6 392//6\nf 394//1 395//1 396//1\nf 400//2 399//2 398//2\nf 393//3 397//3 398//3\nf 398//4 399//4 395//4\nf 399//5 400//5 396//5\nf 393//6 396//6 400//6\nf 401//1 402//1 403//1\nf 405//2 408//2 407//2\nf 405//3 406//3 402//3\nf 402//4 406//4 407//4\nf 407//5 408//5 404//5\nf 401//6 404//6 408//6\nf 409//1 410//1 411//1\nf 413//2 416//2 415//2\nf 413//3 414//3 410//3\nf 410//4 414//4 415//4\nf 415//5 416//5 412//5\nf 409//6 412//6 416//6\nf 418//1 419//1 420//1\nf 421//2 424//2 423//2\nf 421//3 422//3 418//3\nf 418//4 422//4 423//4\nf 423//5 424//5 420//5\nf 421//6 417//6 420//6\nf 426//1 427//1 428//1\nf 429//2 432//2 431//2\nf 429//3 430//3 426//3\nf 426//4 430//4 431//4\nf 431//5 432//5 428//5\nf 425//6 428//6 432//6\nf 434//1 435//1 436//1\nf 437//2 440//2 439//2\nf 437//3 438//3 434//3\nf 434//4 438//4 439//4\nf 439//5 440//5 436//5\nf 437//6 433//6 436//6\nf 442//1 443//1 444//1\nf 448//2 447//2 446//2\nf 445//3 446//3 442//3\nf 446//4 447//4 443//4\nf 447//5 448//5 444//5\nf 441//6 444//6 448//6\nf 450//1 451//1 452//1\nf 456//2 455//2 454//2\nf 453//3 454//3 450//3\nf 454//4 455//4 451//4\nf 455//5 456//5 452//5\nf 449//6 452//6 456//6\nf 458//1 459//1 460//1\nf 464//2 463//2 462//2\nf 461//3 462//3 458//3\nf 462//4 463//4 459//4\nf 463//5 464//5 460//5\nf 457//6 460//6 464//6\nf 466//1 467//1 468//1\nf 472//2 471//2 470//2\nf 469//3 470//3 466//3\nf 470//4 471//4 467//4\nf 471//5 472//5 468//5\nf 465//6 468//6 472//6\nf 474//1 475//1 476//1\nf 480//2 479//2 478//2\nf 477//3 478//3 474//3\nf 478//4 479//4 475//4\nf 479//5 480//5 476//5\nf 473//6 476//6 480//6\nf 481//1 482//1 483//1\nf 485//2 488//2 487//2\nf 485//3 486//3 482//3\nf 482//4 486//4 487//4\nf 487//5 488//5 484//5\nf 481//6 484//6 488//6\nf 489//1 490//1 491//1\nf 493//2 496//2 495//2\nf 493//3 494//3 490//3\nf 490//4 494//4 495//4\nf 495//5 496//5 492//5\nf 489//6 492//6 496//6\nf 498//1 499//1 500//1\nf 501//2 504//2 503//2\nf 501//3 502//3 498//3\nf 498//4 502//4 503//4\nf 503//5 504//5 500//5\nf 501//6 497//6 500//6\nf 506//1 507//1 508//1\nf 509//2 512//2 511//2\nf 509//3 510//3 506//3\nf 506//4 510//4 511//4\nf 511//5 512//5 508//5\nf 505//6 508//6 512//6\nf 514//1 515//1 516//1\nf 517//2 520//2 519//2\nf 517//3 518//3 514//3\nf 514//4 518//4 519//4\nf 519//5 520//5 516//5\nf 517//6 513//6 516//6\nf 522//1 523//1 524//1\nf 528//2 527//2 526//2\nf 525//3 526//3 522//3\nf 526//4 527//4 523//4\nf 527//5 528//5 524//5\nf 521//6 524//6 528//6\nf 530//1 531//1 532//1\nf 536//2 535//2 534//2\nf 533//3 534//3 530//3\nf 534//4 535//4 531//4\nf 535//5 536//5 532//5\nf 529//6 532//6 536//6\nf 538//1 539//1 540//1\nf 544//2 543//2 542//2\nf 541//3 542//3 538//3\nf 542//4 543//4 539//4\nf 543//5 544//5 540//5\nf 537//6 540//6 544//6\nf 546//1 547//1 548//1\nf 552//2 551//2 550//2\nf 549//3 550//3 546//3\nf 550//4 551//4 547//4\nf 551//5 552//5 548//5\nf 545//6 548//6 552//6\nf 554//1 555//1 556//1\nf 560//2 559//2 558//2\nf 557//3 558//3 554//3\nf 558//4 559//4 555//4\nf 559//5 560//5 556//5\nf 553//6 556//6 560//6\nf 561//1 562//1 563//1\nf 565//2 568//2 567//2\nf 565//3 566//3 562//3\nf 562//4 566//4 567//4\nf 567//5 568//5 564//5\nf 561//6 564//6 568//6\nf 569//1 570//1 571//1\nf 573//2 576//2 575//2\nf 573//3 574//3 570//3\nf 570//4 574//4 575//4\nf 575//5 576//5 572//5\nf 569//6 572//6 576//6\nf 578//1 579//1 580//1\nf 581//2 584//2 583//2\nf 581//3 582//3 578//3\nf 578//4 582//4 583//4\nf 583//5 584//5 580//5\nf 581//6 577//6 580//6\nf 586//1 587//1 588//1\nf 589//2 592//2 591//2\nf 589//3 590//3 586//3\nf 586//4 590//4 591//4\nf 591//5 592//5 588//5\nf 585//6 588//6 592//6\nf 594//1 595//1 596//1\nf 597//2 600//2 599//2\nf 597//3 598//3 594//3\nf 594//4 598//4 599//4\nf 599//5 600//5 596//5\nf 597//6 593//6 596//6\nf 602//1 603//1 604//1\nf 608//2 607//2 606//2\nf 605//3 606//3 602//3\nf 606//4 607//4 603//4\nf 607//5 608//5 604//5\nf 601//6 604//6 608//6\nf 610//1 611//1 612//1\nf 616//2 615//2 614//2\nf 613//3 614//3 610//3\nf 614//4 615//4 611//4\nf 615//5 616//5 612//5\nf 609//6 612//6 616//6\nf 618//1 619//1 620//1\nf 624//2 623//2 622//2\nf 621//3 622//3 618//3\nf 622//4 623//4 619//4\nf 623//5 624//5 620//5\nf 617//6 620//6 624//6\nf 626//1 627//1 628//1\nf 632//2 631//2 630//2\nf 629//3 630//3 626//3\nf 630//4 631//4 627//4\nf 631//5 632//5 628//5\nf 625//6 628//6 632//6\nf 634//1 635//1 636//1\nf 640//2 639//2 638//2\nf 637//3 638//3 634//3\nf 638//4 639//4 635//4\nf 639//5 640//5 636//5\nf 633//6 636//6 640//6\nf 641//1 642//1 643//1\nf 645//2 648//2 647//2\nf 645//3 646//3 642//3\nf 642//4 646//4 647//4\nf 647//5 648//5 644//5\nf 641//6 644//6 648//6\nf 649//1 650//1 651//1\nf 653//2 656//2 655//2\nf 653//3 654//3 650//3\nf 650//4 654//4 655//4\nf 655//5 656//5 652//5\nf 649//6 652//6 656//6\nf 658//1 659//1 660//1\nf 661//2 664//2 663//2\nf 661//3 662//3 658//3\nf 658//4 662//4 663//4\nf 663//5 664//5 660//5\nf 661//6 657//6 660//6\nf 666//1 667//1 668//1\nf 669//2 672//2 671//2\nf 669//3 670//3 666//3\nf 666//4 670//4 671//4\nf 671//5 672//5 668//5\nf 665//6 668//6 672//6\nf 674//1 675//1 676//1\nf 677//2 680//2 679//2\nf 677//3 678//3 674//3\nf 674//4 678//4 679//4\nf 679//5 680//5 676//5\nf 677//6 673//6 676//6\nf 682//1 683//1 684//1\nf 688//2 687//2 686//2\nf 685//3 686//3 682//3\nf 686//4 687//4 683//4\nf 687//5 688//5 684//5\nf 681//6 684//6 688//6\nf 690//1 691//1 692//1\nf 696//2 695//2 694//2\nf 693//3 694//3 690//3\nf 694//4 695//4 691//4\nf 695//5 696//5 692//5\nf 689//6 692//6 696//6\nf 698//1 699//1 700//1\nf 704//2 703//2 702//2\nf 701//3 702//3 698//3\nf 702//4 703//4 699//4\nf 703//5 704//5 700//5\nf 697//6 700//6 704//6\nf 706//1 707//1 708//1\nf 712//2 711//2 710//2\nf 709//3 710//3 706//3\nf 710//4 711//4 707//4\nf 711//5 712//5 708//5\nf 705//6 708//6 712//6\nf 714//1 715//1 716//1\nf 720//2 719//2 718//2\nf 717//3 718//3 714//3\nf 718//4 719//4 715//4\nf 719//5 720//5 716//5\nf 713//6 716//6 720//6\nf 721//1 722//1 723//1\nf 725//2 728//2 727//2\nf 725//3 726//3 722//3\nf 722//4 726//4 727//4\nf 727//5 728//5 724//5\nf 721//6 724//6 728//6\nf 729//1 730//1 731//1\nf 733//2 736//2 735//2\nf 733//3 734//3 730//3\nf 730//4 734//4 735//4\nf 735//5 736//5 732//5\nf 729//6 732//6 736//6\nf 738//1 739//1 740//1\nf 741//2 744//2 743//2\nf 741//3 742//3 738//3\nf 738//4 742//4 743//4\nf 743//5 744//5 740//5\nf 741//6 737//6 740//6\nf 746//1 747//1 748//1\nf 749//2 752//2 751//2\nf 749//3 750//3 746//3\nf 746//4 750//4 751//4\nf 751//5 752//5 748//5\nf 745//6 748//6 752//6\nf 754//1 755//1 756//1\nf 757//2 760//2 759//2\nf 757//3 758//3 754//3\nf 754//4 758//4 759//4\nf 759//5 760//5 756//5\nf 757//6 753//6 756//6\nf 762//1 763//1 764//1\nf 768//2 767//2 766//2\nf 765//3 766//3 762//3\nf 766//4 767//4 763//4\nf 767//5 768//5 764//5\nf 761//6 764//6 768//6\nf 770//1 771//1 772//1\nf 776//2 775//2 774//2\nf 773//3 774//3 770//3\nf 774//4 775//4 771//4\nf 775//5 776//5 772//5\nf 769//6 772//6 776//6\nf 778//1 779//1 780//1\nf 784//2 783//2 782//2\nf 781//3 782//3 778//3\nf 782//4 783//4 779//4\nf 783//5 784//5 780//5\nf 777//6 780//6 784//6\nf 786//1 787//1 788//1\nf 792//2 791//2 790//2\nf 789//3 790//3 786//3\nf 790//4 791//4 787//4\nf 791//5 792//5 788//5\nf 785//6 788//6 792//6\nf 794//1 795//1 796//1\nf 800//2 799//2 798//2\nf 797//3 798//3 794//3\nf 798//4 799//4 795//4\nf 799//5 800//5 796//5\nf 793//6 796//6 800//6\nf 804//1 803//1 802//1\nf 805//2 806//2 807//2\nf 801//5 802//5 806//5\nf 802//4 803//4 807//4\nf 804//3 808//3 807//3\nf 808//6 804//6 801//6\nf 812//1 811//1 810//1\nf 813//2 814//2 815//2\nf 809//5 810//5 814//5\nf 810//4 811//4 815//4\nf 812//3 816//3 815//3\nf 813//6 816//6 812//6\nf 820//1 819//1 818//1\nf 821//2 822//2 823//2\nf 817//5 818//5 822//5\nf 818//4 819//4 823//4\nf 820//3 824//3 823//3\nf 821//6 824//6 820//6\nf 828//1 827//1 826//1\nf 830//2 831//2 832//2\nf 825//5 826//5 830//5\nf 826//4 827//4 831//4\nf 828//3 832//3 831//3\nf 832//6 828//6 825//6\nf 836//1 835//1 834//1\nf 837//2 838//2 839//2\nf 833//5 834//5 838//5\nf 834//4 835//4 839//4\nf 836//3 840//3 839//3\nf 837//6 840//6 836//6\nf 844//1 843//1 842//1\nf 846//2 847//2 848//2\nf 841//5 842//5 846//5\nf 843//4 847//4 846//4\nf 844//3 848//3 847//3\nf 848//6 844//6 841//6\nf 852//1 851//1 850//1\nf 854//2 855//2 856//2\nf 849//5 850//5 854//5\nf 851//4 855//4 854//4\nf 852//3 856//3 855//3\nf 856//6 852//6 849//6\nf 860//1 859//1 858//1\nf 862//2 863//2 864//2\nf 857//5 858//5 862//5\nf 859//4 863//4 862//4\nf 860//3 864//3 863//3\nf 864//6 860//6 857//6\nf 868//1 867//1 866//1\nf 870//2 871//2 872//2\nf 865//5 866//5 870//5\nf 867//4 871//4 870//4\nf 868//3 872//3 871//3\nf 872//6 868//6 865//6\nf 876//1 875//1 874//1\nf 878//2 879//2 880//2\nf 873//5 874//5 878//5\nf 875//4 879//4 878//4\nf 876//3 880//3 879//3\nf 880//6 876//6 873//6\nf 884//1 883//1 882//1\nf 885//2 886//2 887//2\nf 882//5 886//5 885//5\nf 882//4 883//4 887//4\nf 884//3 888//3 887//3\nf 888//6 884//6 881//6\nf 892//1 891//1 890//1\nf 893//2 894//2 895//2\nf 889//5 890//5 894//5\nf 890//4 891//4 895//4\nf 892//3 896//3 895//3\nf 893//6 896//6 892//6\nf 900//1 899//1 898//1\nf 901//2 902//2 903//2\nf 897//5 898//5 902//5\nf 898//4 899//4 903//4\nf 900//3 904//3 903//3\nf 901//6 904//6 900//6\nf 908//1 907//1 906//1\nf 910//2 911//2 912//2\nf 905//5 906//5 910//5\nf 906//4 907//4 911//4\nf 908//3 912//3 911//3\nf 912//6 908//6 905//6\nf 916//1 915//1 914//1\nf 918//2 919//2 920//2\nf 913//5 914//5 918//5\nf 914//4 915//4 919//4\nf 916//3 920//3 919//3\nf 917//6 920//6 916//6\nf 924//1 923//1 922//1\nf 926//2 927//2 928//2\nf 921//5 922//5 926//5\nf 923//4 927//4 926//4\nf 924//3 928//3 927//3\nf 928//6 924//6 921//6\nf 932//1 931//1 930//1\nf 934//2 935//2 936//2\nf 929//5 930//5 934//5\nf 931//4 935//4 934//4\nf 932//3 936//3 935//3\nf 936//6 932//6 929//6\nf 940//1 939//1 938//1\nf 942//2 943//2 944//2\nf 937//5 938//5 942//5\nf 939//4 943//4 942//4\nf 940//3 944//3 943//3\nf 944//6 940//6 937//6\nf 948//1 947//1 946//1\nf 950//2 951//2 952//2\nf 945//5 946//5 950//5\nf 947//4 951//4 950//4\nf 948//3 952//3 951//3\nf 952//6 948//6 945//6\nf 956//1 955//1 954//1\nf 958//2 959//2 960//2\nf 953//5 954//5 958//5\nf 955//4 959//4 958//4\nf 956//3 960//3 959//3\nf 960//6 956//6 953//6\nf 961//1 964//1 963//1\nf 965//2 966//2 967//2\nf 962//5 966//5 965//5\nf 962//4 963//4 967//4\nf 964//3 968//3 967//3\nf 968//6 964//6 961//6\nf 972//1 971//1 970//1\nf 973//2 974//2 975//2\nf 970//5 974//5 973//5\nf 970//4 971//4 975//4\nf 972//3 976//3 975//3\nf 973//6 976//6 972//6\nf 980//1 979//1 978//1\nf 981//2 982//2 983//2\nf 977//5 978//5 982//5\nf 978//4 979//4 983//4\nf 980//3 984//3 983//3\nf 981//6 984//6 980//6\nf 988//1 987//1 986//1\nf 989//2 990//2 991//2\nf 985//5 986//5 990//5\nf 986//4 987//4 991//4\nf 988//3 992//3 991//3\nf 992//6 988//6 985//6\nf 996//1 995//1 994//1\nf 997//2 998//2 999//2\nf 994//5 998//5 997//5\nf 994//4 995//4 999//4\nf 996//3 1000//3 999//3\nf 997//6 1000//6 996//6\nf 1004//1 1003//1 1002//1\nf 1006//2 1007//2 1008//2\nf 1001//5 1002//5 1006//5\nf 1003//4 1007//4 1006//4\nf 1004//3 1008//3 1007//3\nf 1008//6 1004//6 1001//6\nf 1012//1 1011//1 1010//1\nf 1014//2 1015//2 1016//2\nf 1009//5 1010//5 1014//5\nf 1011//4 1015//4 1014//4\nf 1012//3 1016//3 1015//3\nf 1016//6 1012//6 1009//6\nf 1020//1 1019//1 1018//1\nf 1022//2 1023//2 1024//2\nf 1017//5 1018//5 1022//5\nf 1019//4 1023//4 1022//4\nf 1020//3 1024//3 1023//3\nf 1024//6 1020//6 1017//6\nf 1028//1 1027//1 1026//1\nf 1030//2 1031//2 1032//2\nf 1025//5 1026//5 1030//5\nf 1027//4 1031//4 1030//4\nf 1028//3 1032//3 1031//3\nf 1032//6 1028//6 1025//6\nf 1036//1 1035//1 1034//1\nf 1038//2 1039//2 1040//2\nf 1033//5 1034//5 1038//5\nf 1035//4 1039//4 1038//4\nf 1036//3 1040//3 1039//3\nf 1040//6 1036//6 1033//6\nf 1041//1 1044//1 1043//1\nf 1046//2 1047//2 1048//2\nf 1041//5 1042//5 1046//5\nf 1042//4 1043//4 1047//4\nf 1044//3 1048//3 1047//3\nf 1048//6 1044//6 1041//6\nf 1049//1 1052//1 1051//1\nf 1054//2 1055//2 1056//2\nf 1049//5 1050//5 1054//5\nf 1050//4 1051//4 1055//4\nf 1052//3 1056//3 1055//3\nf 1053//6 1056//6 1052//6\nf 1060//1 1059//1 1058//1\nf 1062//2 1063//2 1064//2\nf 1057//5 1058//5 1062//5\nf 1058//4 1059//4 1063//4\nf 1060//3 1064//3 1063//3\nf 1061//6 1064//6 1060//6\nf 1068//1 1067//1 1066//1\nf 1070//2 1071//2 1072//2\nf 1065//5 1066//5 1070//5\nf 1066//4 1067//4 1071//4\nf 1068//3 1072//3 1071//3\nf 1072//6 1068//6 1065//6\nf 1076//1 1075//1 1074//1\nf 1078//2 1079//2 1080//2\nf 1073//5 1074//5 1078//5\nf 1074//4 1075//4 1079//4\nf 1076//3 1080//3 1079//3\nf 1077//6 1080//6 1076//6\nf 1084//1 1083//1 1082//1\nf 1086//2 1087//2 1088//2\nf 1081//5 1082//5 1086//5\nf 1083//4 1087//4 1086//4\nf 1084//3 1088//3 1087//3\nf 1088//6 1084//6 1081//6\nf 1092//1 1091//1 1090//1\nf 1094//2 1095//2 1096//2\nf 1089//5 1090//5 1094//5\nf 1091//4 1095//4 1094//4\nf 1092//3 1096//3 1095//3\nf 1096//6 1092//6 1089//6\nf 1100//1 1099//1 1098//1\nf 1102//2 1103//2 1104//2\nf 1097//5 1098//5 1102//5\nf 1099//4 1103//4 1102//4\nf 1100//3 1104//3 1103//3\nf 1104//6 1100//6 1097//6\nf 1108//1 1107//1 1106//1\nf 1110//2 1111//2 1112//2\nf 1105//5 1106//5 1110//5\nf 1107//4 1111//4 1110//4\nf 1108//3 1112//3 1111//3\nf 1112//6 1108//6 1105//6\nf 1116//1 1115//1 1114//1\nf 1118//2 1119//2 1120//2\nf 1113//5 1114//5 1118//5\nf 1115//4 1119//4 1118//4\nf 1116//3 1120//3 1119//3\nf 1120//6 1116//6 1113//6\nf 1121//1 1124//1 1123//1\nf 1126//2 1127//2 1128//2\nf 1121//5 1122//5 1126//5\nf 1122//4 1123//4 1127//4\nf 1124//3 1128//3 1127//3\nf 1128//6 1124//6 1121//6\nf 1129//1 1132//1 1131//1\nf 1134//2 1135//2 1136//2\nf 1129//5 1130//5 1134//5\nf 1130//4 1131//4 1135//4\nf 1132//3 1136//3 1135//3\nf 1133//6 1136//6 1132//6\nf 1140//1 1139//1 1138//1\nf 1142//2 1143//2 1144//2\nf 1137//5 1138//5 1142//5\nf 1138//4 1139//4 1143//4\nf 1140//3 1144//3 1143//3\nf 1141//6 1144//6 1140//6\nf 1148//1 1147//1 1146//1\nf 1150//2 1151//2 1152//2\nf 1145//5 1146//5 1150//5\nf 1146//4 1147//4 1151//4\nf 1148//3 1152//3 1151//3\nf 1152//6 1148//6 1145//6\nf 1156//1 1155//1 1154//1\nf 1158//2 1159//2 1160//2\nf 1153//5 1154//5 1158//5\nf 1154//4 1155//4 1159//4\nf 1156//3 1160//3 1159//3\nf 1157//6 1160//6 1156//6\nf 1164//1 1163//1 1162//1\nf 1166//2 1167//2 1168//2\nf 1161//5 1162//5 1166//5\nf 1163//4 1167//4 1166//4\nf 1164//3 1168//3 1167//3\nf 1168//6 1164//6 1161//6\nf 1172//1 1171//1 1170//1\nf 1174//2 1175//2 1176//2\nf 1169//5 1170//5 1174//5\nf 1171//4 1175//4 1174//4\nf 1172//3 1176//3 1175//3\nf 1176//6 1172//6 1169//6\nf 1180//1 1179//1 1178//1\nf 1182//2 1183//2 1184//2\nf 1177//5 1178//5 1182//5\nf 1179//4 1183//4 1182//4\nf 1180//3 1184//3 1183//3\nf 1184//6 1180//6 1177//6\nf 1188//1 1187//1 1186//1\nf 1190//2 1191//2 1192//2\nf 1185//5 1186//5 1190//5\nf 1187//4 1191//4 1190//4\nf 1188//3 1192//3 1191//3\nf 1192//6 1188//6 1185//6\nf 1196//1 1195//1 1194//1\nf 1198//2 1199//2 1200//2\nf 1193//5 1194//5 1198//5\nf 1195//4 1199//4 1198//4\nf 1196//3 1200//3 1199//3\nf 1200//6 1196//6 1193//6\nf 1201//1 1204//1 1203//1\nf 1205//2 1206//2 1207//2\nf 1202//5 1206//5 1205//5\nf 1202//4 1203//4 1207//4\nf 1204//3 1208//3 1207//3\nf 1208//6 1204//6 1201//6\nf 1209//1 1212//1 1211//1\nf 1213//2 1214//2 1215//2\nf 1210//5 1214//5 1213//5\nf 1210//4 1211//4 1215//4\nf 1212//3 1216//3 1215//3\nf 1213//6 1216//6 1212//6\nf 1220//1 1219//1 1218//1\nf 1221//2 1222//2 1223//2\nf 1218//5 1222//5 1221//5\nf 1218//4 1219//4 1223//4\nf 1220//3 1224//3 1223//3\nf 1221//6 1224//6 1220//6\nf 1228//1 1227//1 1226//1\nf 1229//2 1230//2 1231//2\nf 1226//5 1230//5 1229//5\nf 1226//4 1227//4 1231//4\nf 1228//3 1232//3 1231//3\nf 1232//6 1228//6 1225//6\nf 1236//1 1235//1 1234//1\nf 1237//2 1238//2 1239//2\nf 1234//5 1238//5 1237//5\nf 1234//4 1235//4 1239//4\nf 1236//3 1240//3 1239//3\nf 1237//6 1240//6 1236//6\nf 1244//1 1243//1 1242//1\nf 1246//2 1247//2 1248//2\nf 1242//5 1246//5 1245//5\nf 1243//4 1247//4 1246//4\nf 1244//3 1248//3 1247//3\nf 1248//6 1244//6 1241//6\nf 1252//1 1251//1 1250//1\nf 1254//2 1255//2 1256//2\nf 1250//5 1254//5 1253//5\nf 1251//4 1255//4 1254//4\nf 1252//3 1256//3 1255//3\nf 1256//6 1252//6 1249//6\nf 1260//1 1259//1 1258//1\nf 1262//2 1263//2 1264//2\nf 1258//5 1262//5 1261//5\nf 1259//4 1263//4 1262//4\nf 1260//3 1264//3 1263//3\nf 1264//6 1260//6 1257//6\nf 1268//1 1267//1 1266//1\nf 1270//2 1271//2 1272//2\nf 1266//5 1270//5 1269//5\nf 1267//4 1271//4 1270//4\nf 1268//3 1272//3 1271//3\nf 1272//6 1268//6 1265//6\nf 1276//1 1275//1 1274//1\nf 1278//2 1279//2 1280//2\nf 1274//5 1278//5 1277//5\nf 1275//4 1279//4 1278//4\nf 1276//3 1280//3 1279//3\nf 1280//6 1276//6 1273//6\nf 1281//1 1284//1 1283//1\nf 1285//2 1286//2 1287//2\nf 1282//5 1286//5 1285//5\nf 1282//4 1283//4 1287//4\nf 1284//3 1288//3 1287//3\nf 1288//6 1284//6 1281//6\nf 1289//1 1292//1 1291//1\nf 1293//2 1294//2 1295//2\nf 1290//5 1294//5 1293//5\nf 1290//4 1291//4 1295//4\nf 1292//3 1296//3 1295//3\nf 1293//6 1296//6 1292//6\nf 1300//1 1299//1 1298//1\nf 1301//2 1302//2 1303//2\nf 1298//5 1302//5 1301//5\nf 1298//4 1299//4 1303//4\nf 1300//3 1304//3 1303//3\nf 1301//6 1304//6 1300//6\nf 1308//1 1307//1 1306//1\nf 1309//2 1310//2 1311//2\nf 1306//5 1310//5 1309//5\nf 1306//4 1307//4 1311//4\nf 1308//3 1312//3 1311//3\nf 1312//6 1308//6 1305//6\nf 1316//1 1315//1 1314//1\nf 1317//2 1318//2 1319//2\nf 1314//5 1318//5 1317//5\nf 1314//4 1315//4 1319//4\nf 1316//3 1320//3 1319//3\nf 1317//6 1320//6 1316//6\nf 1324//1 1323//1 1322//1\nf 1326//2 1327//2 1328//2\nf 1322//5 1326//5 1325//5\nf 1323//4 1327//4 1326//4\nf 1324//3 1328//3 1327//3\nf 1328//6 1324//6 1321//6\nf 1332//1 1331//1 1330//1\nf 1334//2 1335//2 1336//2\nf 1330//5 1334//5 1333//5\nf 1331//4 1335//4 1334//4\nf 1332//3 1336//3 1335//3\nf 1336//6 1332//6 1329//6\nf 1340//1 1339//1 1338//1\nf 1342//2 1343//2 1344//2\nf 1338//5 1342//5 1341//5\nf 1339//4 1343//4 1342//4\nf 1340//3 1344//3 1343//3\nf 1344//6 1340//6 1337//6\nf 1348//1 1347//1 1346//1\nf 1350//2 1351//2 1352//2\nf 1346//5 1350//5 1349//5\nf 1347//4 1351//4 1350//4\nf 1348//3 1352//3 1351//3\nf 1352//6 1348//6 1345//6\nf 1356//1 1355//1 1354//1\nf 1358//2 1359//2 1360//2\nf 1354//5 1358//5 1357//5\nf 1355//4 1359//4 1358//4\nf 1356//3 1360//3 1359//3\nf 1360//6 1356//6 1353//6\nf 1361//1 1364//1 1363//1\nf 1365//2 1366//2 1367//2\nf 1362//5 1366//5 1365//5\nf 1362//4 1363//4 1367//4\nf 1364//3 1368//3 1367//3\nf 1368//6 1364//6 1361//6\nf 1369//1 1372//1 1371//1\nf 1373//2 1374//2 1375//2\nf 1370//5 1374//5 1373//5\nf 1370//4 1371//4 1375//4\nf 1372//3 1376//3 1375//3\nf 1373//6 1376//6 1372//6\nf 1380//1 1379//1 1378//1\nf 1381//2 1382//2 1383//2\nf 1378//5 1382//5 1381//5\nf 1378//4 1379//4 1383//4\nf 1380//3 1384//3 1383//3\nf 1381//6 1384//6 1380//6\nf 1388//1 1387//1 1386//1\nf 1389//2 1390//2 1391//2\nf 1386//5 1390//5 1389//5\nf 1386//4 1387//4 1391//4\nf 1388//3 1392//3 1391//3\nf 1392//6 1388//6 1385//6\nf 1396//1 1395//1 1394//1\nf 1397//2 1398//2 1399//2\nf 1394//5 1398//5 1397//5\nf 1394//4 1395//4 1399//4\nf 1396//3 1400//3 1399//3\nf 1397//6 1400//6 1396//6\nf 1404//1 1403//1 1402//1\nf 1406//2 1407//2 1408//2\nf 1402//5 1406//5 1405//5\nf 1403//4 1407//4 1406//4\nf 1404//3 1408//3 1407//3\nf 1408//6 1404//6 1401//6\nf 1412//1 1411//1 1410//1\nf 1414//2 1415//2 1416//2\nf 1410//5 1414//5 1413//5\nf 1411//4 1415//4 1414//4\nf 1412//3 1416//3 1415//3\nf 1416//6 1412//6 1409//6\nf 1420//1 1419//1 1418//1\nf 1422//2 1423//2 1424//2\nf 1418//5 1422//5 1421//5\nf 1419//4 1423//4 1422//4\nf 1420//3 1424//3 1423//3\nf 1424//6 1420//6 1417//6\nf 1428//1 1427//1 1426//1\nf 1430//2 1431//2 1432//2\nf 1426//5 1430//5 1429//5\nf 1427//4 1431//4 1430//4\nf 1428//3 1432//3 1431//3\nf 1432//6 1428//6 1425//6\nf 1436//1 1435//1 1434//1\nf 1438//2 1439//2 1440//2\nf 1434//5 1438//5 1437//5\nf 1435//4 1439//4 1438//4\nf 1436//3 1440//3 1439//3\nf 1440//6 1436//6 1433//6\nf 1441//1 1444//1 1443//1\nf 1445//2 1446//2 1447//2\nf 1442//5 1446//5 1445//5\nf 1442//4 1443//4 1447//4\nf 1444//3 1448//3 1447//3\nf 1448//6 1444//6 1441//6\nf 1449//1 1452//1 1451//1\nf 1453//2 1454//2 1455//2\nf 1450//5 1454//5 1453//5\nf 1450//4 1451//4 1455//4\nf 1452//3 1456//3 1455//3\nf 1453//6 1456//6 1452//6\nf 1460//1 1459//1 1458//1\nf 1461//2 1462//2 1463//2\nf 1458//5 1462//5 1461//5\nf 1458//4 1459//4 1463//4\nf 1460//3 1464//3 1463//3\nf 1461//6 1464//6 1460//6\nf 1468//1 1467//1 1466//1\nf 1469//2 1470//2 1471//2\nf 1466//5 1470//5 1469//5\nf 1466//4 1467//4 1471//4\nf 1468//3 1472//3 1471//3\nf 1472//6 1468//6 1465//6\nf 1476//1 1475//1 1474//1\nf 1477//2 1478//2 1479//2\nf 1474//5 1478//5 1477//5\nf 1474//4 1475//4 1479//4\nf 1476//3 1480//3 1479//3\nf 1477//6 1480//6 1476//6\nf 1484//1 1483//1 1482//1\nf 1486//2 1487//2 1488//2\nf 1482//5 1486//5 1485//5\nf 1483//4 1487//4 1486//4\nf 1484//3 1488//3 1487//3\nf 1488//6 1484//6 1481//6\nf 1492//1 1491//1 1490//1\nf 1494//2 1495//2 1496//2\nf 1490//5 1494//5 1493//5\nf 1491//4 1495//4 1494//4\nf 1492//3 1496//3 1495//3\nf 1496//6 1492//6 1489//6\nf 1500//1 1499//1 1498//1\nf 1502//2 1503//2 1504//2\nf 1498//5 1502//5 1501//5\nf 1499//4 1503//4 1502//4\nf 1500//3 1504//3 1503//3\nf 1504//6 1500//6 1497//6\nf 1508//1 1507//1 1506//1\nf 1510//2 1511//2 1512//2\nf 1506//5 1510//5 1509//5\nf 1507//4 1511//4 1510//4\nf 1508//3 1512//3 1511//3\nf 1512//6 1508//6 1505//6\nf 1516//1 1515//1 1514//1\nf 1518//2 1519//2 1520//2\nf 1514//5 1518//5 1517//5\nf 1515//4 1519//4 1518//4\nf 1516//3 1520//3 1519//3\nf 1520//6 1516//6 1513//6\nf 1521//1 1524//1 1523//1\nf 1525//2 1526//2 1527//2\nf 1522//5 1526//5 1525//5\nf 1522//4 1523//4 1527//4\nf 1524//3 1528//3 1527//3\nf 1528//6 1524//6 1521//6\nf 1529//1 1532//1 1531//1\nf 1533//2 1534//2 1535//2\nf 1530//5 1534//5 1533//5\nf 1530//4 1531//4 1535//4\nf 1532//3 1536//3 1535//3\nf 1533//6 1536//6 1532//6\nf 1540//1 1539//1 1538//1\nf 1541//2 1542//2 1543//2\nf 1538//5 1542//5 1541//5\nf 1538//4 1539//4 1543//4\nf 1540//3 1544//3 1543//3\nf 1541//6 1544//6 1540//6\nf 1548//1 1547//1 1546//1\nf 1549//2 1550//2 1551//2\nf 1546//5 1550//5 1549//5\nf 1546//4 1547//4 1551//4\nf 1548//3 1552//3 1551//3\nf 1552//6 1548//6 1545//6\nf 1556//1 1555//1 1554//1\nf 1557//2 1558//2 1559//2\nf 1554//5 1558//5 1557//5\nf 1554//4 1555//4 1559//4\nf 1556//3 1560//3 1559//3\nf 1557//6 1560//6 1556//6\nf 1564//1 1563//1 1562//1\nf 1566//2 1567//2 1568//2\nf 1562//5 1566//5 1565//5\nf 1563//4 1567//4 1566//4\nf 1564//3 1568//3 1567//3\nf 1568//6 1564//6 1561//6\nf 1572//1 1571//1 1570//1\nf 1574//2 1575//2 1576//2\nf 1570//5 1574//5 1573//5\nf 1571//4 1575//4 1574//4\nf 1572//3 1576//3 1575//3\nf 1576//6 1572//6 1569//6\nf 1580//1 1579//1 1578//1\nf 1582//2 1583//2 1584//2\nf 1578//5 1582//5 1581//5\nf 1579//4 1583//4 1582//4\nf 1580//3 1584//3 1583//3\nf 1584//6 1580//6 1577//6\nf 1588//1 1587//1 1586//1\nf 1590//2 1591//2 1592//2\nf 1586//5 1590//5 1589//5\nf 1587//4 1591//4 1590//4\nf 1588//3 1592//3 1591//3\nf 1592//6 1588//6 1585//6\nf 1596//1 1595//1 1594//1\nf 1598//2 1599//2 1600//2\nf 1594//5 1598//5 1597//5\nf 1595//4 1599//4 1598//4\nf 1596//3 1600//3 1599//3\nf 1600//6 1596//6 1593//6\nf 1602//1 1603//1 1604//1\nf 1608//2 1607//2 1606//2\nf 1601//3 1605//3 1606//3\nf 1602//4 1606//4 1607//4\nf 1607//5 1608//5 1604//5\nf 1601//6 1604//6 1608//6\nf 1610//1 1611//1 1612//1\nf 1613//2 1616//2 1615//2\nf 1609//3 1613//3 1614//3\nf 1610//4 1614//4 1615//4\nf 1615//5 1616//5 1612//5\nf 1609//6 1612//6 1616//6\nf 1618//1 1619//1 1620//1\nf 1624//2 1623//2 1622//2\nf 1617//3 1621//3 1622//3\nf 1618//4 1622//4 1623//4\nf 1623//5 1624//5 1620//5\nf 1621//6 1617//6 1620//6\nf 1626//1 1627//1 1628//1\nf 1632//2 1631//2 1630//2\nf 1625//3 1629//3 1630//3\nf 1626//4 1630//4 1631//4\nf 1631//5 1632//5 1628//5\nf 1625//6 1628//6 1632//6\nf 1634//1 1635//1 1636//1\nf 1637//2 1640//2 1639//2\nf 1633//3 1637//3 1638//3\nf 1634//4 1638//4 1639//4\nf 1639//5 1640//5 1636//5\nf 1637//6 1633//6 1636//6\nf 1642//1 1643//1 1644//1\nf 1648//2 1647//2 1646//2\nf 1641//3 1645//3 1646//3\nf 1646//4 1647//4 1643//4\nf 1647//5 1648//5 1644//5\nf 1641//6 1644//6 1648//6\nf 1650//1 1651//1 1652//1\nf 1656//2 1655//2 1654//2\nf 1649//3 1653//3 1654//3\nf 1654//4 1655//4 1651//4\nf 1655//5 1656//5 1652//5\nf 1649//6 1652//6 1656//6\nf 1658//1 1659//1 1660//1\nf 1664//2 1663//2 1662//2\nf 1657//3 1661//3 1662//3\nf 1662//4 1663//4 1659//4\nf 1663//5 1664//5 1660//5\nf 1657//6 1660//6 1664//6\nf 1666//1 1667//1 1668//1\nf 1672//2 1671//2 1670//2\nf 1665//3 1669//3 1670//3\nf 1670//4 1671//4 1667//4\nf 1671//5 1672//5 1668//5\nf 1665//6 1668//6 1672//6\nf 1674//1 1675//1 1676//1\nf 1680//2 1679//2 1678//2\nf 1673//3 1677//3 1678//3\nf 1678//4 1679//4 1675//4\nf 1679//5 1680//5 1676//5\nf 1673//6 1676//6 1680//6\nf 1682//1 1683//1 1684//1\nf 1688//2 1687//2 1686//2\nf 1685//3 1686//3 1682//3\nf 1682//4 1686//4 1687//4\nf 1687//5 1688//5 1684//5\nf 1681//6 1684//6 1688//6\nf 1690//1 1691//1 1692//1\nf 1693//2 1696//2 1695//2\nf 1689//3 1693//3 1694//3\nf 1690//4 1694//4 1695//4\nf 1695//5 1696//5 1692//5\nf 1689//6 1692//6 1696//6\nf 1698//1 1699//1 1700//1\nf 1704//2 1703//2 1702//2\nf 1697//3 1701//3 1702//3\nf 1698//4 1702//4 1703//4\nf 1703//5 1704//5 1700//5\nf 1701//6 1697//6 1700//6\nf 1706//1 1707//1 1708//1\nf 1712//2 1711//2 1710//2\nf 1705//3 1709//3 1710//3\nf 1706//4 1710//4 1711//4\nf 1711//5 1712//5 1708//5\nf 1705//6 1708//6 1712//6\nf 1714//1 1715//1 1716//1\nf 1717//2 1720//2 1719//2\nf 1713//3 1717//3 1718//3\nf 1714//4 1718//4 1719//4\nf 1719//5 1720//5 1716//5\nf 1717//6 1713//6 1716//6\nf 1722//1 1723//1 1724//1\nf 1728//2 1727//2 1726//2\nf 1721//3 1725//3 1726//3\nf 1726//4 1727//4 1723//4\nf 1727//5 1728//5 1724//5\nf 1721//6 1724//6 1728//6\nf 1730//1 1731//1 1732//1\nf 1736//2 1735//2 1734//2\nf 1729//3 1733//3 1734//3\nf 1734//4 1735//4 1731//4\nf 1735//5 1736//5 1732//5\nf 1729//6 1732//6 1736//6\nf 1738//1 1739//1 1740//1\nf 1744//2 1743//2 1742//2\nf 1737//3 1741//3 1742//3\nf 1742//4 1743//4 1739//4\nf 1743//5 1744//5 1740//5\nf 1737//6 1740//6 1744//6\nf 1746//1 1747//1 1748//1\nf 1752//2 1751//2 1750//2\nf 1745//3 1749//3 1750//3\nf 1750//4 1751//4 1747//4\nf 1751//5 1752//5 1748//5\nf 1745//6 1748//6 1752//6\nf 1754//1 1755//1 1756//1\nf 1760//2 1759//2 1758//2\nf 1753//3 1757//3 1758//3\nf 1758//4 1759//4 1755//4\nf 1759//5 1760//5 1756//5\nf 1753//6 1756//6 1760//6\nf 1762//1 1763//1 1764//1\nf 1765//2 1768//2 1767//2\nf 1765//3 1766//3 1762//3\nf 1762//4 1766//4 1767//4\nf 1767//5 1768//5 1764//5\nf 1761//6 1764//6 1768//6\nf 1770//1 1771//1 1772//1\nf 1773//2 1776//2 1775//2\nf 1773//3 1774//3 1770//3\nf 1770//4 1774//4 1775//4\nf 1775//5 1776//5 1772//5\nf 1769//6 1772//6 1776//6\nf 1778//1 1779//1 1780//1\nf 1781//2 1784//2 1783//2\nf 1777//3 1781//3 1782//3\nf 1778//4 1782//4 1783//4\nf 1783//5 1784//5 1780//5\nf 1781//6 1777//6 1780//6\nf 1786//1 1787//1 1788//1\nf 1789//2 1792//2 1791//2\nf 1785//3 1789//3 1790//3\nf 1786//4 1790//4 1791//4\nf 1791//5 1792//5 1788//5\nf 1785//6 1788//6 1792//6\nf 1794//1 1795//1 1796//1\nf 1797//2 1800//2 1799//2\nf 1797//3 1798//3 1794//3\nf 1794//4 1798//4 1799//4\nf 1799//5 1800//5 1796//5\nf 1797//6 1793//6 1796//6\nf 1802//1 1803//1 1804//1\nf 1808//2 1807//2 1806//2\nf 1801//3 1805//3 1806//3\nf 1806//4 1807//4 1803//4\nf 1807//5 1808//5 1804//5\nf 1801//6 1804//6 1808//6\nf 1810//1 1811//1 1812//1\nf 1816//2 1815//2 1814//2\nf 1809//3 1813//3 1814//3\nf 1814//4 1815//4 1811//4\nf 1815//5 1816//5 1812//5\nf 1809//6 1812//6 1816//6\nf 1818//1 1819//1 1820//1\nf 1824//2 1823//2 1822//2\nf 1817//3 1821//3 1822//3\nf 1822//4 1823//4 1819//4\nf 1823//5 1824//5 1820//5\nf 1817//6 1820//6 1824//6\nf 1826//1 1827//1 1828//1\nf 1832//2 1831//2 1830//2\nf 1825//3 1829//3 1830//3\nf 1830//4 1831//4 1827//4\nf 1831//5 1832//5 1828//5\nf 1825//6 1828//6 1832//6\nf 1834//1 1835//1 1836//1\nf 1840//2 1839//2 1838//2\nf 1833//3 1837//3 1838//3\nf 1838//4 1839//4 1835//4\nf 1839//5 1840//5 1836//5\nf 1833//6 1836//6 1840//6\nf 1841//1 1842//1 1843//1\nf 1848//2 1847//2 1846//2\nf 1841//3 1845//3 1846//3\nf 1842//4 1846//4 1847//4\nf 1847//5 1848//5 1844//5\nf 1841//6 1844//6 1848//6\nf 1849//1 1850//1 1851//1\nf 1856//2 1855//2 1854//2\nf 1849//3 1853//3 1854//3\nf 1850//4 1854//4 1855//4\nf 1855//5 1856//5 1852//5\nf 1849//6 1852//6 1856//6\nf 1858//1 1859//1 1860//1\nf 1864//2 1863//2 1862//2\nf 1857//3 1861//3 1862//3\nf 1858//4 1862//4 1863//4\nf 1863//5 1864//5 1860//5\nf 1861//6 1857//6 1860//6\nf 1866//1 1867//1 1868//1\nf 1872//2 1871//2 1870//2\nf 1865//3 1869//3 1870//3\nf 1866//4 1870//4 1871//4\nf 1871//5 1872//5 1868//5\nf 1865//6 1868//6 1872//6\nf 1874//1 1875//1 1876//1\nf 1880//2 1879//2 1878//2\nf 1873//3 1877//3 1878//3\nf 1874//4 1878//4 1879//4\nf 1879//5 1880//5 1876//5\nf 1877//6 1873//6 1876//6\nf 1882//1 1883//1 1884//1\nf 1888//2 1887//2 1886//2\nf 1881//3 1885//3 1886//3\nf 1886//4 1887//4 1883//4\nf 1887//5 1888//5 1884//5\nf 1881//6 1884//6 1888//6\nf 1890//1 1891//1 1892//1\nf 1896//2 1895//2 1894//2\nf 1889//3 1893//3 1894//3\nf 1894//4 1895//4 1891//4\nf 1895//5 1896//5 1892//5\nf 1889//6 1892//6 1896//6\nf 1898//1 1899//1 1900//1\nf 1904//2 1903//2 1902//2\nf 1897//3 1901//3 1902//3\nf 1902//4 1903//4 1899//4\nf 1903//5 1904//5 1900//5\nf 1897//6 1900//6 1904//6\nf 1906//1 1907//1 1908//1\nf 1912//2 1911//2 1910//2\nf 1905//3 1909//3 1910//3\nf 1910//4 1911//4 1907//4\nf 1911//5 1912//5 1908//5\nf 1905//6 1908//6 1912//6\nf 1914//1 1915//1 1916//1\nf 1920//2 1919//2 1918//2\nf 1913//3 1917//3 1918//3\nf 1918//4 1919//4 1915//4\nf 1919//5 1920//5 1916//5\nf 1913//6 1916//6 1920//6\nf 1921//1 1922//1 1923//1\nf 1928//2 1927//2 1926//2\nf 1921//3 1925//3 1926//3\nf 1922//4 1926//4 1927//4\nf 1927//5 1928//5 1924//5\nf 1921//6 1924//6 1928//6\nf 1929//1 1930//1 1931//1\nf 1936//2 1935//2 1934//2\nf 1929//3 1933//3 1934//3\nf 1930//4 1934//4 1935//4\nf 1935//5 1936//5 1932//5\nf 1929//6 1932//6 1936//6\nf 1938//1 1939//1 1940//1\nf 1944//2 1943//2 1942//2\nf 1937//3 1941//3 1942//3\nf 1938//4 1942//4 1943//4\nf 1943//5 1944//5 1940//5\nf 1941//6 1937//6 1940//6\nf 1946//1 1947//1 1948//1\nf 1952//2 1951//2 1950//2\nf 1945//3 1949//3 1950//3\nf 1946//4 1950//4 1951//4\nf 1951//5 1952//5 1948//5\nf 1945//6 1948//6 1952//6\nf 1954//1 1955//1 1956//1\nf 1960//2 1959//2 1958//2\nf 1953//3 1957//3 1958//3\nf 1954//4 1958//4 1959//4\nf 1959//5 1960//5 1956//5\nf 1957//6 1953//6 1956//6\nf 1962//1 1963//1 1964//1\nf 1968//2 1967//2 1966//2\nf 1961//3 1965//3 1966//3\nf 1966//4 1967//4 1963//4\nf 1967//5 1968//5 1964//5\nf 1961//6 1964//6 1968//6\nf 1970//1 1971//1 1972//1\nf 1976//2 1975//2 1974//2\nf 1969//3 1973//3 1974//3\nf 1974//4 1975//4 1971//4\nf 1975//5 1976//5 1972//5\nf 1969//6 1972//6 1976//6\nf 1978//1 1979//1 1980//1\nf 1984//2 1983//2 1982//2\nf 1977//3 1981//3 1982//3\nf 1982//4 1983//4 1979//4\nf 1983//5 1984//5 1980//5\nf 1977//6 1980//6 1984//6\nf 1986//1 1987//1 1988//1\nf 1992//2 1991//2 1990//2\nf 1985//3 1989//3 1990//3\nf 1990//4 1991//4 1987//4\nf 1991//5 1992//5 1988//5\nf 1985//6 1988//6 1992//6\nf 1994//1 1995//1 1996//1\nf 2000//2 1999//2 1998//2\nf 1993//3 1997//3 1998//3\nf 1998//4 1999//4 1995//4\nf 1999//5 2000//5 1996//5\nf 1993//6 1996//6 2000//6\nf 2001//1 2002//1 2003//1\nf 2005//2 2008//2 2007//2\nf 2005//3 2006//3 2002//3\nf 2002//4 2006//4 2007//4\nf 2007//5 2008//5 2004//5\nf 2001//6 2004//6 2008//6\nf 2009//1 2010//1 2011//1\nf 2013//2 2016//2 2015//2\nf 2013//3 2014//3 2010//3\nf 2010//4 2014//4 2015//4\nf 2015//5 2016//5 2012//5\nf 2009//6 2012//6 2016//6\nf 2018//1 2019//1 2020//1\nf 2021//2 2024//2 2023//2\nf 2021//3 2022//3 2018//3\nf 2018//4 2022//4 2023//4\nf 2023//5 2024//5 2020//5\nf 2021//6 2017//6 2020//6\nf 2026//1 2027//1 2028//1\nf 2029//2 2032//2 2031//2\nf 2029//3 2030//3 2026//3\nf 2026//4 2030//4 2031//4\nf 2031//5 2032//5 2028//5\nf 2025//6 2028//6 2032//6\nf 2034//1 2035//1 2036//1\nf 2037//2 2040//2 2039//2\nf 2037//3 2038//3 2034//3\nf 2034//4 2038//4 2039//4\nf 2039//5 2040//5 2036//5\nf 2037//6 2033//6 2036//6\nf 2042//1 2043//1 2044//1\nf 2048//2 2047//2 2046//2\nf 2045//3 2046//3 2042//3\nf 2046//4 2047//4 2043//4\nf 2047//5 2048//5 2044//5\nf 2041//6 2044//6 2048//6\nf 2050//1 2051//1 2052//1\nf 2056//2 2055//2 2054//2\nf 2053//3 2054//3 2050//3\nf 2054//4 2055//4 2051//4\nf 2055//5 2056//5 2052//5\nf 2049//6 2052//6 2056//6\nf 2058//1 2059//1 2060//1\nf 2064//2 2063//2 2062//2\nf 2061//3 2062//3 2058//3\nf 2062//4 2063//4 2059//4\nf 2063//5 2064//5 2060//5\nf 2057//6 2060//6 2064//6\nf 2066//1 2067//1 2068//1\nf 2072//2 2071//2 2070//2\nf 2069//3 2070//3 2066//3\nf 2070//4 2071//4 2067//4\nf 2071//5 2072//5 2068//5\nf 2065//6 2068//6 2072//6\nf 2074//1 2075//1 2076//1\nf 2080//2 2079//2 2078//2\nf 2077//3 2078//3 2074//3\nf 2078//4 2079//4 2075//4\nf 2079//5 2080//5 2076//5\nf 2073//6 2076//6 2080//6\nf 2081//1 2082//1 2083//1\nf 2085//2 2088//2 2087//2\nf 2085//3 2086//3 2082//3\nf 2082//4 2086//4 2087//4\nf 2087//5 2088//5 2084//5\nf 2081//6 2084//6 2088//6\nf 2089//1 2090//1 2091//1\nf 2093//2 2096//2 2095//2\nf 2093//3 2094//3 2090//3\nf 2090//4 2094//4 2095//4\nf 2095//5 2096//5 2092//5\nf 2089//6 2092//6 2096//6\nf 2098//1 2099//1 2100//1\nf 2101//2 2104//2 2103//2\nf 2101//3 2102//3 2098//3\nf 2098//4 2102//4 2103//4\nf 2103//5 2104//5 2100//5\nf 2101//6 2097//6 2100//6\nf 2106//1 2107//1 2108//1\nf 2109//2 2112//2 2111//2\nf 2109//3 2110//3 2106//3\nf 2106//4 2110//4 2111//4\nf 2111//5 2112//5 2108//5\nf 2105//6 2108//6 2112//6\nf 2114//1 2115//1 2116//1\nf 2117//2 2120//2 2119//2\nf 2117//3 2118//3 2114//3\nf 2114//4 2118//4 2119//4\nf 2119//5 2120//5 2116//5\nf 2117//6 2113//6 2116//6\nf 2122//1 2123//1 2124//1\nf 2128//2 2127//2 2126//2\nf 2125//3 2126//3 2122//3\nf 2126//4 2127//4 2123//4\nf 2127//5 2128//5 2124//5\nf 2121//6 2124//6 2128//6\nf 2130//1 2131//1 2132//1\nf 2136//2 2135//2 2134//2\nf 2133//3 2134//3 2130//3\nf 2134//4 2135//4 2131//4\nf 2135//5 2136//5 2132//5\nf 2129//6 2132//6 2136//6\nf 2138//1 2139//1 2140//1\nf 2144//2 2143//2 2142//2\nf 2141//3 2142//3 2138//3\nf 2142//4 2143//4 2139//4\nf 2143//5 2144//5 2140//5\nf 2137//6 2140//6 2144//6\nf 2146//1 2147//1 2148//1\nf 2152//2 2151//2 2150//2\nf 2149//3 2150//3 2146//3\nf 2150//4 2151//4 2147//4\nf 2151//5 2152//5 2148//5\nf 2145//6 2148//6 2152//6\nf 2154//1 2155//1 2156//1\nf 2160//2 2159//2 2158//2\nf 2157//3 2158//3 2154//3\nf 2158//4 2159//4 2155//4\nf 2159//5 2160//5 2156//5\nf 2153//6 2156//6 2160//6\nf 2161//1 2162//1 2163//1\nf 2165//2 2168//2 2167//2\nf 2165//3 2166//3 2162//3\nf 2162//4 2166//4 2167//4\nf 2167//5 2168//5 2164//5\nf 2161//6 2164//6 2168//6\nf 2169//1 2170//1 2171//1\nf 2173//2 2176//2 2175//2\nf 2173//3 2174//3 2170//3\nf 2170//4 2174//4 2175//4\nf 2175//5 2176//5 2172//5\nf 2169//6 2172//6 2176//6\nf 2178//1 2179//1 2180//1\nf 2181//2 2184//2 2183//2\nf 2181//3 2182//3 2178//3\nf 2178//4 2182//4 2183//4\nf 2183//5 2184//5 2180//5\nf 2181//6 2177//6 2180//6\nf 2186//1 2187//1 2188//1\nf 2189//2 2192//2 2191//2\nf 2189//3 2190//3 2186//3\nf 2186//4 2190//4 2191//4\nf 2191//5 2192//5 2188//5\nf 2185//6 2188//6 2192//6\nf 2194//1 2195//1 2196//1\nf 2197//2 2200//2 2199//2\nf 2197//3 2198//3 2194//3\nf 2194//4 2198//4 2199//4\nf 2199//5 2200//5 2196//5\nf 2197//6 2193//6 2196//6\nf 2202//1 2203//1 2204//1\nf 2208//2 2207//2 2206//2\nf 2205//3 2206//3 2202//3\nf 2206//4 2207//4 2203//4\nf 2207//5 2208//5 2204//5\nf 2201//6 2204//6 2208//6\nf 2210//1 2211//1 2212//1\nf 2216//2 2215//2 2214//2\nf 2213//3 2214//3 2210//3\nf 2214//4 2215//4 2211//4\nf 2215//5 2216//5 2212//5\nf 2209//6 2212//6 2216//6\nf 2218//1 2219//1 2220//1\nf 2224//2 2223//2 2222//2\nf 2221//3 2222//3 2218//3\nf 2222//4 2223//4 2219//4\nf 2223//5 2224//5 2220//5\nf 2217//6 2220//6 2224//6\nf 2226//1 2227//1 2228//1\nf 2232//2 2231//2 2230//2\nf 2229//3 2230//3 2226//3\nf 2230//4 2231//4 2227//4\nf 2231//5 2232//5 2228//5\nf 2225//6 2228//6 2232//6\nf 2234//1 2235//1 2236//1\nf 2240//2 2239//2 2238//2\nf 2237//3 2238//3 2234//3\nf 2238//4 2239//4 2235//4\nf 2239//5 2240//5 2236//5\nf 2233//6 2236//6 2240//6\nf 2241//1 2242//1 2243//1\nf 2245//2 2248//2 2247//2\nf 2245//3 2246//3 2242//3\nf 2242//4 2246//4 2247//4\nf 2247//5 2248//5 2244//5\nf 2241//6 2244//6 2248//6\nf 2249//1 2250//1 2251//1\nf 2253//2 2256//2 2255//2\nf 2253//3 2254//3 2250//3\nf 2250//4 2254//4 2255//4\nf 2255//5 2256//5 2252//5\nf 2249//6 2252//6 2256//6\nf 2258//1 2259//1 2260//1\nf 2261//2 2264//2 2263//2\nf 2261//3 2262//3 2258//3\nf 2258//4 2262//4 2263//4\nf 2263//5 2264//5 2260//5\nf 2261//6 2257//6 2260//6\nf 2266//1 2267//1 2268//1\nf 2269//2 2272//2 2271//2\nf 2269//3 2270//3 2266//3\nf 2266//4 2270//4 2271//4\nf 2271//5 2272//5 2268//5\nf 2265//6 2268//6 2272//6\nf 2274//1 2275//1 2276//1\nf 2277//2 2280//2 2279//2\nf 2277//3 2278//3 2274//3\nf 2274//4 2278//4 2279//4\nf 2279//5 2280//5 2276//5\nf 2277//6 2273//6 2276//6\nf 2282//1 2283//1 2284//1\nf 2288//2 2287//2 2286//2\nf 2285//3 2286//3 2282//3\nf 2286//4 2287//4 2283//4\nf 2287//5 2288//5 2284//5\nf 2281//6 2284//6 2288//6\nf 2290//1 2291//1 2292//1\nf 2296//2 2295//2 2294//2\nf 2293//3 2294//3 2290//3\nf 2294//4 2295//4 2291//4\nf 2295//5 2296//5 2292//5\nf 2289//6 2292//6 2296//6\nf 2298//1 2299//1 2300//1\nf 2304//2 2303//2 2302//2\nf 2301//3 2302//3 2298//3\nf 2302//4 2303//4 2299//4\nf 2303//5 2304//5 2300//5\nf 2297//6 2300//6 2304//6\nf 2306//1 2307//1 2308//1\nf 2312//2 2311//2 2310//2\nf 2309//3 2310//3 2306//3\nf 2310//4 2311//4 2307//4\nf 2311//5 2312//5 2308//5\nf 2305//6 2308//6 2312//6\nf 2314//1 2315//1 2316//1\nf 2320//2 2319//2 2318//2\nf 2317//3 2318//3 2314//3\nf 2318//4 2319//4 2315//4\nf 2319//5 2320//5 2316//5\nf 2313//6 2316//6 2320//6\nf 2321//1 2322//1 2323//1\nf 2325//2 2328//2 2327//2\nf 2325//3 2326//3 2322//3\nf 2322//4 2326//4 2327//4\nf 2327//5 2328//5 2324//5\nf 2321//6 2324//6 2328//6\nf 2329//1 2330//1 2331//1\nf 2333//2 2336//2 2335//2\nf 2333//3 2334//3 2330//3\nf 2330//4 2334//4 2335//4\nf 2335//5 2336//5 2332//5\nf 2329//6 2332//6 2336//6\nf 2338//1 2339//1 2340//1\nf 2341//2 2344//2 2343//2\nf 2341//3 2342//3 2338//3\nf 2338//4 2342//4 2343//4\nf 2343//5 2344//5 2340//5\nf 2341//6 2337//6 2340//6\nf 2346//1 2347//1 2348//1\nf 2349//2 2352//2 2351//2\nf 2349//3 2350//3 2346//3\nf 2346//4 2350//4 2351//4\nf 2351//5 2352//5 2348//5\nf 2345//6 2348//6 2352//6\nf 2354//1 2355//1 2356//1\nf 2357//2 2360//2 2359//2\nf 2357//3 2358//3 2354//3\nf 2354//4 2358//4 2359//4\nf 2359//5 2360//5 2356//5\nf 2357//6 2353//6 2356//6\nf 2362//1 2363//1 2364//1\nf 2368//2 2367//2 2366//2\nf 2365//3 2366//3 2362//3\nf 2366//4 2367//4 2363//4\nf 2367//5 2368//5 2364//5\nf 2361//6 2364//6 2368//6\nf 2370//1 2371//1 2372//1\nf 2376//2 2375//2 2374//2\nf 2373//3 2374//3 2370//3\nf 2374//4 2375//4 2371//4\nf 2375//5 2376//5 2372//5\nf 2369//6 2372//6 2376//6\nf 2378//1 2379//1 2380//1\nf 2384//2 2383//2 2382//2\nf 2381//3 2382//3 2378//3\nf 2382//4 2383//4 2379//4\nf 2383//5 2384//5 2380//5\nf 2377//6 2380//6 2384//6\nf 2386//1 2387//1 2388//1\nf 2392//2 2391//2 2390//2\nf 2389//3 2390//3 2386//3\nf 2390//4 2391//4 2387//4\nf 2391//5 2392//5 2388//5\nf 2385//6 2388//6 2392//6\nf 2394//1 2395//1 2396//1\nf 2400//2 2399//2 2398//2\nf 2397//3 2398//3 2394//3\nf 2398//4 2399//4 2395//4\nf 2399//5 2400//5 2396//5\nf 2393//6 2396//6 2400//6\nf 2404//1 2403//1 2402//1\nf 2405//2 2406//2 2407//2\nf 2401//5 2402//5 2406//5\nf 2402//4 2403//4 2407//4\nf 2404//3 2408//3 2407//3\nf 2408//6 2404//6 2401//6\nf 2412//1 2411//1 2410//1\nf 2413//2 2414//2 2415//2\nf 2409//5 2410//5 2414//5\nf 2410//4 2411//4 2415//4\nf 2412//3 2416//3 2415//3\nf 2413//6 2416//6 2412//6\nf 2420//1 2419//1 2418//1\nf 2421//2 2422//2 2423//2\nf 2417//5 2418//5 2422//5\nf 2418//4 2419//4 2423//4\nf 2420//3 2424//3 2423//3\nf 2421//6 2424//6 2420//6\nf 2428//1 2427//1 2426//1\nf 2430//2 2431//2 2432//2\nf 2425//5 2426//5 2430//5\nf 2426//4 2427//4 2431//4\nf 2428//3 2432//3 2431//3\nf 2432//6 2428//6 2425//6\nf 2436//1 2435//1 2434//1\nf 2437//2 2438//2 2439//2\nf 2433//5 2434//5 2438//5\nf 2434//4 2435//4 2439//4\nf 2436//3 2440//3 2439//3\nf 2437//6 2440//6 2436//6\nf 2444//1 2443//1 2442//1\nf 2446//2 2447//2 2448//2\nf 2441//5 2442//5 2446//5\nf 2443//4 2447//4 2446//4\nf 2444//3 2448//3 2447//3\nf 2448//6 2444//6 2441//6\nf 2452//1 2451//1 2450//1\nf 2454//2 2455//2 2456//2\nf 2449//5 2450//5 2454//5\nf 2451//4 2455//4 2454//4\nf 2452//3 2456//3 2455//3\nf 2456//6 2452//6 2449//6\nf 2460//1 2459//1 2458//1\nf 2462//2 2463//2 2464//2\nf 2457//5 2458//5 2462//5\nf 2459//4 2463//4 2462//4\nf 2460//3 2464//3 2463//3\nf 2464//6 2460//6 2457//6\nf 2468//1 2467//1 2466//1\nf 2470//2 2471//2 2472//2\nf 2465//5 2466//5 2470//5\nf 2467//4 2471//4 2470//4\nf 2468//3 2472//3 2471//3\nf 2472//6 2468//6 2465//6\nf 2476//1 2475//1 2474//1\nf 2478//2 2479//2 2480//2\nf 2473//5 2474//5 2478//5\nf 2475//4 2479//4 2478//4\nf 2476//3 2480//3 2479//3\nf 2480//6 2476//6 2473//6\nf 2484//1 2483//1 2482//1\nf 2485//2 2486//2 2487//2\nf 2482//5 2486//5 2485//5\nf 2482//4 2483//4 2487//4\nf 2484//3 2488//3 2487//3\nf 2488//6 2484//6 2481//6\nf 2492//1 2491//1 2490//1\nf 2493//2 2494//2 2495//2\nf 2489//5 2490//5 2494//5\nf 2490//4 2491//4 2495//4\nf 2492//3 2496//3 2495//3\nf 2493//6 2496//6 2492//6\nf 2500//1 2499//1 2498//1\nf 2501//2 2502//2 2503//2\nf 2497//5 2498//5 2502//5\nf 2498//4 2499//4 2503//4\nf 2500//3 2504//3 2503//3\nf 2501//6 2504//6 2500//6\nf 2508//1 2507//1 2506//1\nf 2510//2 2511//2 2512//2\nf 2505//5 2506//5 2510//5\nf 2506//4 2507//4 2511//4\nf 2508//3 2512//3 2511//3\nf 2512//6 2508//6 2505//6\nf 2516//1 2515//1 2514//1\nf 2518//2 2519//2 2520//2\nf 2513//5 2514//5 2518//5\nf 2514//4 2515//4 2519//4\nf 2516//3 2520//3 2519//3\nf 2517//6 2520//6 2516//6\nf 2524//1 2523//1 2522//1\nf 2526//2 2527//2 2528//2\nf 2521//5 2522//5 2526//5\nf 2523//4 2527//4 2526//4\nf 2524//3 2528//3 2527//3\nf 2528//6 2524//6 2521//6\nf 2532//1 2531//1 2530//1\nf 2534//2 2535//2 2536//2\nf 2529//5 2530//5 2534//5\nf 2531//4 2535//4 2534//4\nf 2532//3 2536//3 2535//3\nf 2536//6 2532//6 2529//6\nf 2540//1 2539//1 2538//1\nf 2542//2 2543//2 2544//2\nf 2537//5 2538//5 2542//5\nf 2539//4 2543//4 2542//4\nf 2540//3 2544//3 2543//3\nf 2544//6 2540//6 2537//6\nf 2548//1 2547//1 2546//1\nf 2550//2 2551//2 2552//2\nf 2545//5 2546//5 2550//5\nf 2547//4 2551//4 2550//4\nf 2548//3 2552//3 2551//3\nf 2552//6 2548//6 2545//6\nf 2556//1 2555//1 2554//1\nf 2558//2 2559//2 2560//2\nf 2553//5 2554//5 2558//5\nf 2555//4 2559//4 2558//4\nf 2556//3 2560//3 2559//3\nf 2560//6 2556//6 2553//6\nf 2561//1 2564//1 2563//1\nf 2565//2 2566//2 2567//2\nf 2562//5 2566//5 2565//5\nf 2562//4 2563//4 2567//4\nf 2564//3 2568//3 2567//3\nf 2568//6 2564//6 2561//6\nf 2572//1 2571//1 2570//1\nf 2573//2 2574//2 2575//2\nf 2570//5 2574//5 2573//5\nf 2570//4 2571//4 2575//4\nf 2572//3 2576//3 2575//3\nf 2573//6 2576//6 2572//6\nf 2580//1 2579//1 2578//1\nf 2581//2 2582//2 2583//2\nf 2577//5 2578//5 2582//5\nf 2578//4 2579//4 2583//4\nf 2580//3 2584//3 2583//3\nf 2581//6 2584//6 2580//6\nf 2588//1 2587//1 2586//1\nf 2589//2 2590//2 2591//2\nf 2585//5 2586//5 2590//5\nf 2586//4 2587//4 2591//4\nf 2588//3 2592//3 2591//3\nf 2592//6 2588//6 2585//6\nf 2596//1 2595//1 2594//1\nf 2597//2 2598//2 2599//2\nf 2594//5 2598//5 2597//5\nf 2594//4 2595//4 2599//4\nf 2596//3 2600//3 2599//3\nf 2597//6 2600//6 2596//6\nf 2604//1 2603//1 2602//1\nf 2606//2 2607//2 2608//2\nf 2601//5 2602//5 2606//5\nf 2603//4 2607//4 2606//4\nf 2604//3 2608//3 2607//3\nf 2608//6 2604//6 2601//6\nf 2612//1 2611//1 2610//1\nf 2614//2 2615//2 2616//2\nf 2609//5 2610//5 2614//5\nf 2611//4 2615//4 2614//4\nf 2612//3 2616//3 2615//3\nf 2616//6 2612//6 2609//6\nf 2620//1 2619//1 2618//1\nf 2622//2 2623//2 2624//2\nf 2617//5 2618//5 2622//5\nf 2619//4 2623//4 2622//4\nf 2620//3 2624//3 2623//3\nf 2624//6 2620//6 2617//6\nf 2628//1 2627//1 2626//1\nf 2630//2 2631//2 2632//2\nf 2625//5 2626//5 2630//5\nf 2627//4 2631//4 2630//4\nf 2628//3 2632//3 2631//3\nf 2632//6 2628//6 2625//6\nf 2636//1 2635//1 2634//1\nf 2638//2 2639//2 2640//2\nf 2633//5 2634//5 2638//5\nf 2635//4 2639//4 2638//4\nf 2636//3 2640//3 2639//3\nf 2640//6 2636//6 2633//6\nf 2641//1 2644//1 2643//1\nf 2646//2 2647//2 2648//2\nf 2641//5 2642//5 2646//5\nf 2642//4 2643//4 2647//4\nf 2644//3 2648//3 2647//3\nf 2648//6 2644//6 2641//6\nf 2649//1 2652//1 2651//1\nf 2654//2 2655//2 2656//2\nf 2649//5 2650//5 2654//5\nf 2650//4 2651//4 2655//4\nf 2652//3 2656//3 2655//3\nf 2653//6 2656//6 2652//6\nf 2660//1 2659//1 2658//1\nf 2662//2 2663//2 2664//2\nf 2657//5 2658//5 2662//5\nf 2658//4 2659//4 2663//4\nf 2660//3 2664//3 2663//3\nf 2661//6 2664//6 2660//6\nf 2668//1 2667//1 2666//1\nf 2670//2 2671//2 2672//2\nf 2665//5 2666//5 2670//5\nf 2666//4 2667//4 2671//4\nf 2668//3 2672//3 2671//3\nf 2672//6 2668//6 2665//6\nf 2676//1 2675//1 2674//1\nf 2678//2 2679//2 2680//2\nf 2673//5 2674//5 2678//5\nf 2674//4 2675//4 2679//4\nf 2676//3 2680//3 2679//3\nf 2677//6 2680//6 2676//6\nf 2684//1 2683//1 2682//1\nf 2686//2 2687//2 2688//2\nf 2681//5 2682//5 2686//5\nf 2683//4 2687//4 2686//4\nf 2684//3 2688//3 2687//3\nf 2688//6 2684//6 2681//6\nf 2692//1 2691//1 2690//1\nf 2694//2 2695//2 2696//2\nf 2689//5 2690//5 2694//5\nf 2691//4 2695//4 2694//4\nf 2692//3 2696//3 2695//3\nf 2696//6 2692//6 2689//6\nf 2700//1 2699//1 2698//1\nf 2702//2 2703//2 2704//2\nf 2697//5 2698//5 2702//5\nf 2699//4 2703//4 2702//4\nf 2700//3 2704//3 2703//3\nf 2704//6 2700//6 2697//6\nf 2708//1 2707//1 2706//1\nf 2710//2 2711//2 2712//2\nf 2705//5 2706//5 2710//5\nf 2707//4 2711//4 2710//4\nf 2708//3 2712//3 2711//3\nf 2712//6 2708//6 2705//6\nf 2716//1 2715//1 2714//1\nf 2718//2 2719//2 2720//2\nf 2713//5 2714//5 2718//5\nf 2715//4 2719//4 2718//4\nf 2716//3 2720//3 2719//3\nf 2720//6 2716//6 2713//6\nf 2721//1 2724//1 2723//1\nf 2726//2 2727//2 2728//2\nf 2721//5 2722//5 2726//5\nf 2722//4 2723//4 2727//4\nf 2724//3 2728//3 2727//3\nf 2728//6 2724//6 2721//6\nf 2729//1 2732//1 2731//1\nf 2734//2 2735//2 2736//2\nf 2729//5 2730//5 2734//5\nf 2730//4 2731//4 2735//4\nf 2732//3 2736//3 2735//3\nf 2733//6 2736//6 2732//6\nf 2740//1 2739//1 2738//1\nf 2742//2 2743//2 2744//2\nf 2737//5 2738//5 2742//5\nf 2738//4 2739//4 2743//4\nf 2740//3 2744//3 2743//3\nf 2741//6 2744//6 2740//6\nf 2748//1 2747//1 2746//1\nf 2750//2 2751//2 2752//2\nf 2745//5 2746//5 2750//5\nf 2746//4 2747//4 2751//4\nf 2748//3 2752//3 2751//3\nf 2752//6 2748//6 2745//6\nf 2756//1 2755//1 2754//1\nf 2758//2 2759//2 2760//2\nf 2753//5 2754//5 2758//5\nf 2754//4 2755//4 2759//4\nf 2756//3 2760//3 2759//3\nf 2757//6 2760//6 2756//6\nf 2764//1 2763//1 2762//1\nf 2766//2 2767//2 2768//2\nf 2761//5 2762//5 2766//5\nf 2763//4 2767//4 2766//4\nf 2764//3 2768//3 2767//3\nf 2768//6 2764//6 2761//6\nf 2772//1 2771//1 2770//1\nf 2774//2 2775//2 2776//2\nf 2769//5 2770//5 2774//5\nf 2771//4 2775//4 2774//4\nf 2772//3 2776//3 2775//3\nf 2776//6 2772//6 2769//6\nf 2780//1 2779//1 2778//1\nf 2782//2 2783//2 2784//2\nf 2777//5 2778//5 2782//5\nf 2779//4 2783//4 2782//4\nf 2780//3 2784//3 2783//3\nf 2784//6 2780//6 2777//6\nf 2788//1 2787//1 2786//1\nf 2790//2 2791//2 2792//2\nf 2785//5 2786//5 2790//5\nf 2787//4 2791//4 2790//4\nf 2788//3 2792//3 2791//3\nf 2792//6 2788//6 2785//6\nf 2796//1 2795//1 2794//1\nf 2798//2 2799//2 2800//2\nf 2793//5 2794//5 2798//5\nf 2795//4 2799//4 2798//4\nf 2796//3 2800//3 2799//3\nf 2800//6 2796//6 2793//6\nf 2801//1 2804//1 2803//1\nf 2805//2 2806//2 2807//2\nf 2802//5 2806//5 2805//5\nf 2802//4 2803//4 2807//4\nf 2804//3 2808//3 2807//3\nf 2808//6 2804//6 2801//6\nf 2809//1 2812//1 2811//1\nf 2813//2 2814//2 2815//2\nf 2810//5 2814//5 2813//5\nf 2810//4 2811//4 2815//4\nf 2812//3 2816//3 2815//3\nf 2813//6 2816//6 2812//6\nf 2820//1 2819//1 2818//1\nf 2821//2 2822//2 2823//2\nf 2818//5 2822//5 2821//5\nf 2818//4 2819//4 2823//4\nf 2820//3 2824//3 2823//3\nf 2821//6 2824//6 2820//6\nf 2828//1 2827//1 2826//1\nf 2829//2 2830//2 2831//2\nf 2826//5 2830//5 2829//5\nf 2826//4 2827//4 2831//4\nf 2828//3 2832//3 2831//3\nf 2832//6 2828//6 2825//6\nf 2836//1 2835//1 2834//1\nf 2837//2 2838//2 2839//2\nf 2834//5 2838//5 2837//5\nf 2834//4 2835//4 2839//4\nf 2836//3 2840//3 2839//3\nf 2837//6 2840//6 2836//6\nf 2844//1 2843//1 2842//1\nf 2846//2 2847//2 2848//2\nf 2842//5 2846//5 2845//5\nf 2843//4 2847//4 2846//4\nf 2844//3 2848//3 2847//3\nf 2848//6 2844//6 2841//6\nf 2852//1 2851//1 2850//1\nf 2854//2 2855//2 2856//2\nf 2850//5 2854//5 2853//5\nf 2851//4 2855//4 2854//4\nf 2852//3 2856//3 2855//3\nf 2856//6 2852//6 2849//6\nf 2860//1 2859//1 2858//1\nf 2862//2 2863//2 2864//2\nf 2858//5 2862//5 2861//5\nf 2859//4 2863//4 2862//4\nf 2860//3 2864//3 2863//3\nf 2864//6 2860//6 2857//6\nf 2868//1 2867//1 2866//1\nf 2870//2 2871//2 2872//2\nf 2866//5 2870//5 2869//5\nf 2867//4 2871//4 2870//4\nf 2868//3 2872//3 2871//3\nf 2872//6 2868//6 2865//6\nf 2876//1 2875//1 2874//1\nf 2878//2 2879//2 2880//2\nf 2874//5 2878//5 2877//5\nf 2875//4 2879//4 2878//4\nf 2876//3 2880//3 2879//3\nf 2880//6 2876//6 2873//6\nf 2881//1 2884//1 2883//1\nf 2885//2 2886//2 2887//2\nf 2882//5 2886//5 2885//5\nf 2882//4 2883//4 2887//4\nf 2884//3 2888//3 2887//3\nf 2888//6 2884//6 2881//6\nf 2889//1 2892//1 2891//1\nf 2893//2 2894//2 2895//2\nf 2890//5 2894//5 2893//5\nf 2890//4 2891//4 2895//4\nf 2892//3 2896//3 2895//3\nf 2893//6 2896//6 2892//6\nf 2900//1 2899//1 2898//1\nf 2901//2 2902//2 2903//2\nf 2898//5 2902//5 2901//5\nf 2898//4 2899//4 2903//4\nf 2900//3 2904//3 2903//3\nf 2901//6 2904//6 2900//6\nf 2908//1 2907//1 2906//1\nf 2909//2 2910//2 2911//2\nf 2906//5 2910//5 2909//5\nf 2906//4 2907//4 2911//4\nf 2908//3 2912//3 2911//3\nf 2912//6 2908//6 2905//6\nf 2916//1 2915//1 2914//1\nf 2917//2 2918//2 2919//2\nf 2914//5 2918//5 2917//5\nf 2914//4 2915//4 2919//4\nf 2916//3 2920//3 2919//3\nf 2917//6 2920//6 2916//6\nf 2924//1 2923//1 2922//1\nf 2926//2 2927//2 2928//2\nf 2922//5 2926//5 2925//5\nf 2923//4 2927//4 2926//4\nf 2924//3 2928//3 2927//3\nf 2928//6 2924//6 2921//6\nf 2932//1 2931//1 2930//1\nf 2934//2 2935//2 2936//2\nf 2930//5 2934//5 2933//5\nf 2931//4 2935//4 2934//4\nf 2932//3 2936//3 2935//3\nf 2936//6 2932//6 2929//6\nf 2940//1 2939//1 2938//1\nf 2942//2 2943//2 2944//2\nf 2938//5 2942//5 2941//5\nf 2939//4 2943//4 2942//4\nf 2940//3 2944//3 2943//3\nf 2944//6 2940//6 2937//6\nf 2948//1 2947//1 2946//1\nf 2950//2 2951//2 2952//2\nf 2946//5 2950//5 2949//5\nf 2947//4 2951//4 2950//4\nf 2948//3 2952//3 2951//3\nf 2952//6 2948//6 2945//6\nf 2956//1 2955//1 2954//1\nf 2958//2 2959//2 2960//2\nf 2954//5 2958//5 2957//5\nf 2955//4 2959//4 2958//4\nf 2956//3 2960//3 2959//3\nf 2960//6 2956//6 2953//6\nf 2961//1 2964//1 2963//1\nf 2965//2 2966//2 2967//2\nf 2962//5 2966//5 2965//5\nf 2962//4 2963//4 2967//4\nf 2964//3 2968//3 2967//3\nf 2968//6 2964//6 2961//6\nf 2969//1 2972//1 2971//1\nf 2973//2 2974//2 2975//2\nf 2970//5 2974//5 2973//5\nf 2970//4 2971//4 2975//4\nf 2972//3 2976//3 2975//3\nf 2973//6 2976//6 2972//6\nf 2980//1 2979//1 2978//1\nf 2981//2 2982//2 2983//2\nf 2978//5 2982//5 2981//5\nf 2978//4 2979//4 2983//4\nf 2980//3 2984//3 2983//3\nf 2981//6 2984//6 2980//6\nf 2988//1 2987//1 2986//1\nf 2989//2 2990//2 2991//2\nf 2986//5 2990//5 2989//5\nf 2986//4 2987//4 2991//4\nf 2988//3 2992//3 2991//3\nf 2992//6 2988//6 2985//6\nf 2996//1 2995//1 2994//1\nf 2997//2 2998//2 2999//2\nf 2994//5 2998//5 2997//5\nf 2994//4 2995//4 2999//4\nf 2996//3 3000//3 2999//3\nf 2997//6 3000//6 2996//6\nf 3004//1 3003//1 3002//1\nf 3006//2 3007//2 3008//2\nf 3002//5 3006//5 3005//5\nf 3003//4 3007//4 3006//4\nf 3004//3 3008//3 3007//3\nf 3008//6 3004//6 3001//6\nf 3012//1 3011//1 3010//1\nf 3014//2 3015//2 3016//2\nf 3010//5 3014//5 3013//5\nf 3011//4 3015//4 3014//4\nf 3012//3 3016//3 3015//3\nf 3016//6 3012//6 3009//6\nf 3020//1 3019//1 3018//1\nf 3022//2 3023//2 3024//2\nf 3018//5 3022//5 3021//5\nf 3019//4 3023//4 3022//4\nf 3020//3 3024//3 3023//3\nf 3024//6 3020//6 3017//6\nf 3028//1 3027//1 3026//1\nf 3030//2 3031//2 3032//2\nf 3026//5 3030//5 3029//5\nf 3027//4 3031//4 3030//4\nf 3028//3 3032//3 3031//3\nf 3032//6 3028//6 3025//6\nf 3036//1 3035//1 3034//1\nf 3038//2 3039//2 3040//2\nf 3034//5 3038//5 3037//5\nf 3035//4 3039//4 3038//4\nf 3036//3 3040//3 3039//3\nf 3040//6 3036//6 3033//6\nf 3041//1 3044//1 3043//1\nf 3045//2 3046//2 3047//2\nf 3042//5 3046//5 3045//5\nf 3042//4 3043//4 3047//4\nf 3044//3 3048//3 3047//3\nf 3048//6 3044//6 3041//6\nf 3049//1 3052//1 3051//1\nf 3053//2 3054//2 3055//2\nf 3050//5 3054//5 3053//5\nf 3050//4 3051//4 3055//4\nf 3052//3 3056//3 3055//3\nf 3053//6 3056//6 3052//6\nf 3060//1 3059//1 3058//1\nf 3061//2 3062//2 3063//2\nf 3058//5 3062//5 3061//5\nf 3058//4 3059//4 3063//4\nf 3060//3 3064//3 3063//3\nf 3061//6 3064//6 3060//6\nf 3068//1 3067//1 3066//1\nf 3069//2 3070//2 3071//2\nf 3066//5 3070//5 3069//5\nf 3066//4 3067//4 3071//4\nf 3068//3 3072//3 3071//3\nf 3072//6 3068//6 3065//6\nf 3076//1 3075//1 3074//1\nf 3077//2 3078//2 3079//2\nf 3074//5 3078//5 3077//5\nf 3074//4 3075//4 3079//4\nf 3076//3 3080//3 3079//3\nf 3077//6 3080//6 3076//6\nf 3084//1 3083//1 3082//1\nf 3086//2 3087//2 3088//2\nf 3082//5 3086//5 3085//5\nf 3083//4 3087//4 3086//4\nf 3084//3 3088//3 3087//3\nf 3088//6 3084//6 3081//6\nf 3092//1 3091//1 3090//1\nf 3094//2 3095//2 3096//2\nf 3090//5 3094//5 3093//5\nf 3091//4 3095//4 3094//4\nf 3092//3 3096//3 3095//3\nf 3096//6 3092//6 3089//6\nf 3100//1 3099//1 3098//1\nf 3102//2 3103//2 3104//2\nf 3098//5 3102//5 3101//5\nf 3099//4 3103//4 3102//4\nf 3100//3 3104//3 3103//3\nf 3104//6 3100//6 3097//6\nf 3108//1 3107//1 3106//1\nf 3110//2 3111//2 3112//2\nf 3106//5 3110//5 3109//5\nf 3107//4 3111//4 3110//4\nf 3108//3 3112//3 3111//3\nf 3112//6 3108//6 3105//6\nf 3116//1 3115//1 3114//1\nf 3118//2 3119//2 3120//2\nf 3114//5 3118//5 3117//5\nf 3115//4 3119//4 3118//4\nf 3116//3 3120//3 3119//3\nf 3120//6 3116//6 3113//6\nf 3121//1 3124//1 3123//1\nf 3125//2 3126//2 3127//2\nf 3122//5 3126//5 3125//5\nf 3122//4 3123//4 3127//4\nf 3124//3 3128//3 3127//3\nf 3128//6 3124//6 3121//6\nf 3129//1 3132//1 3131//1\nf 3133//2 3134//2 3135//2\nf 3130//5 3134//5 3133//5\nf 3130//4 3131//4 3135//4\nf 3132//3 3136//3 3135//3\nf 3133//6 3136//6 3132//6\nf 3140//1 3139//1 3138//1\nf 3141//2 3142//2 3143//2\nf 3138//5 3142//5 3141//5\nf 3138//4 3139//4 3143//4\nf 3140//3 3144//3 3143//3\nf 3141//6 3144//6 3140//6\nf 3148//1 3147//1 3146//1\nf 3149//2 3150//2 3151//2\nf 3146//5 3150//5 3149//5\nf 3146//4 3147//4 3151//4\nf 3148//3 3152//3 3151//3\nf 3152//6 3148//6 3145//6\nf 3156//1 3155//1 3154//1\nf 3157//2 3158//2 3159//2\nf 3154//5 3158//5 3157//5\nf 3154//4 3155//4 3159//4\nf 3156//3 3160//3 3159//3\nf 3157//6 3160//6 3156//6\nf 3164//1 3163//1 3162//1\nf 3166//2 3167//2 3168//2\nf 3162//5 3166//5 3165//5\nf 3163//4 3167//4 3166//4\nf 3164//3 3168//3 3167//3\nf 3168//6 3164//6 3161//6\nf 3172//1 3171//1 3170//1\nf 3174//2 3175//2 3176//2\nf 3170//5 3174//5 3173//5\nf 3171//4 3175//4 3174//4\nf 3172//3 3176//3 3175//3\nf 3176//6 3172//6 3169//6\nf 3180//1 3179//1 3178//1\nf 3182//2 3183//2 3184//2\nf 3178//5 3182//5 3181//5\nf 3179//4 3183//4 3182//4\nf 3180//3 3184//3 3183//3\nf 3184//6 3180//6 3177//6\nf 3188//1 3187//1 3186//1\nf 3190//2 3191//2 3192//2\nf 3186//5 3190//5 3189//5\nf 3187//4 3191//4 3190//4\nf 3188//3 3192//3 3191//3\nf 3192//6 3188//6 3185//6\nf 3196//1 3195//1 3194//1\nf 3198//2 3199//2 3200//2\nf 3194//5 3198//5 3197//5\nf 3195//4 3199//4 3198//4\nf 3196//3 3200//3 3199//3\nf 3200//6 3196//6 3193//6\nf 3202//1 3203//1 3204//1\nf 3208//2 3207//2 3206//2\nf 3201//3 3205//3 3206//3\nf 3202//4 3206//4 3207//4\nf 3207//5 3208//5 3204//5\nf 3201//6 3204//6 3208//6\nf 3210//1 3211//1 3212//1\nf 3213//2 3216//2 3215//2\nf 3209//3 3213//3 3214//3\nf 3210//4 3214//4 3215//4\nf 3215//5 3216//5 3212//5\nf 3209//6 3212//6 3216//6\nf 3218//1 3219//1 3220//1\nf 3224//2 3223//2 3222//2\nf 3217//3 3221//3 3222//3\nf 3218//4 3222//4 3223//4\nf 3223//5 3224//5 3220//5\nf 3221//6 3217//6 3220//6\nf 3226//1 3227//1 3228//1\nf 3232//2 3231//2 3230//2\nf 3225//3 3229//3 3230//3\nf 3226//4 3230//4 3231//4\nf 3231//5 3232//5 3228//5\nf 3225//6 3228//6 3232//6\nf 3234//1 3235//1 3236//1\nf 3237//2 3240//2 3239//2\nf 3233//3 3237//3 3238//3\nf 3234//4 3238//4 3239//4\nf 3239//5 3240//5 3236//5\nf 3237//6 3233//6 3236//6\nf 3242//1 3243//1 3244//1\nf 3248//2 3247//2 3246//2\nf 3241//3 3245//3 3246//3\nf 3246//4 3247//4 3243//4\nf 3247//5 3248//5 3244//5\nf 3241//6 3244//6 3248//6\nf 3250//1 3251//1 3252//1\nf 3256//2 3255//2 3254//2\nf 3249//3 3253//3 3254//3\nf 3254//4 3255//4 3251//4\nf 3255//5 3256//5 3252//5\nf 3249//6 3252//6 3256//6\nf 3258//1 3259//1 3260//1\nf 3264//2 3263//2 3262//2\nf 3257//3 3261//3 3262//3\nf 3262//4 3263//4 3259//4\nf 3263//5 3264//5 3260//5\nf 3257//6 3260//6 3264//6\nf 3266//1 3267//1 3268//1\nf 3272//2 3271//2 3270//2\nf 3265//3 3269//3 3270//3\nf 3270//4 3271//4 3267//4\nf 3271//5 3272//5 3268//5\nf 3265//6 3268//6 3272//6\nf 3274//1 3275//1 3276//1\nf 3280//2 3279//2 3278//2\nf 3273//3 3277//3 3278//3\nf 3278//4 3279//4 3275//4\nf 3279//5 3280//5 3276//5\nf 3273//6 3276//6 3280//6\nf 3282//1 3283//1 3284//1\nf 3288//2 3287//2 3286//2\nf 3285//3 3286//3 3282//3\nf 3282//4 3286//4 3287//4\nf 3287//5 3288//5 3284//5\nf 3281//6 3284//6 3288//6\nf 3290//1 3291//1 3292//1\nf 3293//2 3296//2 3295//2\nf 3289//3 3293//3 3294//3\nf 3290//4 3294//4 3295//4\nf 3295//5 3296//5 3292//5\nf 3289//6 3292//6 3296//6\nf 3298//1 3299//1 3300//1\nf 3304//2 3303//2 3302//2\nf 3297//3 3301//3 3302//3\nf 3298//4 3302//4 3303//4\nf 3303//5 3304//5 3300//5\nf 3301//6 3297//6 3300//6\nf 3306//1 3307//1 3308//1\nf 3312//2 3311//2 3310//2\nf 3305//3 3309//3 3310//3\nf 3306//4 3310//4 3311//4\nf 3311//5 3312//5 3308//5\nf 3305//6 3308//6 3312//6\nf 3314//1 3315//1 3316//1\nf 3317//2 3320//2 3319//2\nf 3313//3 3317//3 3318//3\nf 3314//4 3318//4 3319//4\nf 3319//5 3320//5 3316//5\nf 3317//6 3313//6 3316//6\nf 3322//1 3323//1 3324//1\nf 3328//2 3327//2 3326//2\nf 3321//3 3325//3 3326//3\nf 3326//4 3327//4 3323//4\nf 3327//5 3328//5 3324//5\nf 3321//6 3324//6 3328//6\nf 3330//1 3331//1 3332//1\nf 3336//2 3335//2 3334//2\nf 3329//3 3333//3 3334//3\nf 3334//4 3335//4 3331//4\nf 3335//5 3336//5 3332//5\nf 3329//6 3332//6 3336//6\nf 3338//1 3339//1 3340//1\nf 3344//2 3343//2 3342//2\nf 3337//3 3341//3 3342//3\nf 3342//4 3343//4 3339//4\nf 3343//5 3344//5 3340//5\nf 3337//6 3340//6 3344//6\nf 3346//1 3347//1 3348//1\nf 3352//2 3351//2 3350//2\nf 3345//3 3349//3 3350//3\nf 3350//4 3351//4 3347//4\nf 3351//5 3352//5 3348//5\nf 3345//6 3348//6 3352//6\nf 3354//1 3355//1 3356//1\nf 3360//2 3359//2 3358//2\nf 3353//3 3357//3 3358//3\nf 3358//4 3359//4 3355//4\nf 3359//5 3360//5 3356//5\nf 3353//6 3356//6 3360//6\nf 3362//1 3363//1 3364//1\nf 3365//2 3368//2 3367//2\nf 3365//3 3366//3 3362//3\nf 3362//4 3366//4 3367//4\nf 3367//5 3368//5 3364//5\nf 3361//6 3364//6 3368//6\nf 3370//1 3371//1 3372//1\nf 3373//2 3376//2 3375//2\nf 3369//3 3373//3 3374//3\nf 3370//4 3374//4 3375//4\nf 3375//5 3376//5 3372//5\nf 3369//6 3372//6 3376//6\nf 3378//1 3379//1 3380//1\nf 3381//2 3384//2 3383//2\nf 3377//3 3381//3 3382//3\nf 3378//4 3382//4 3383//4\nf 3383//5 3384//5 3380//5\nf 3381//6 3377//6 3380//6\nf 3386//1 3387//1 3388//1\nf 3389//2 3392//2 3391//2\nf 3385//3 3389//3 3390//3\nf 3386//4 3390//4 3391//4\nf 3391//5 3392//5 3388//5\nf 3385//6 3388//6 3392//6\nf 3394//1 3395//1 3396//1\nf 3397//2 3400//2 3399//2\nf 3397//3 3398//3 3394//3\nf 3394//4 3398//4 3399//4\nf 3399//5 3400//5 3396//5\nf 3397//6 3393//6 3396//6\nf 3402//1 3403//1 3404//1\nf 3408//2 3407//2 3406//2\nf 3401//3 3405//3 3406//3\nf 3406//4 3407//4 3403//4\nf 3407//5 3408//5 3404//5\nf 3401//6 3404//6 3408//6\nf 3410//1 3411//1 3412//1\nf 3416//2 3415//2 3414//2\nf 3409//3 3413//3 3414//3\nf 3414//4 3415//4 3411//4\nf 3415//5 3416//5 3412//5\nf 3409//6 3412//6 3416//6\nf 3418//1 3419//1 3420//1\nf 3424//2 3423//2 3422//2\nf 3417//3 3421//3 3422//3\nf 3422//4 3423//4 3419//4\nf 3423//5 3424//5 3420//5\nf 3417//6 3420//6 3424//6\nf 3426//1 3427//1 3428//1\nf 3432//2 3431//2 3430//2\nf 3425//3 3429//3 3430//3\nf 3430//4 3431//4 3427//4\nf 3431//5 3432//5 3428//5\nf 3425//6 3428//6 3432//6\nf 3434//1 3435//1 3436//1\nf 3440//2 3439//2 3438//2\nf 3433//3 3437//3 3438//3\nf 3438//4 3439//4 3435//4\nf 3439//5 3440//5 3436//5\nf 3433//6 3436//6 3440//6\nf 3441//1 3442//1 3443//1\nf 3448//2 3447//2 3446//2\nf 3441//3 3445//3 3446//3\nf 3442//4 3446//4 3447//4\nf 3447//5 3448//5 3444//5\nf 3441//6 3444//6 3448//6\nf 3449//1 3450//1 3451//1\nf 3456//2 3455//2 3454//2\nf 3449//3 3453//3 3454//3\nf 3450//4 3454//4 3455//4\nf 3455//5 3456//5 3452//5\nf 3449//6 3452//6 3456//6\nf 3458//1 3459//1 3460//1\nf 3464//2 3463//2 3462//2\nf 3457//3 3461//3 3462//3\nf 3458//4 3462//4 3463//4\nf 3463//5 3464//5 3460//5\nf 3461//6 3457//6 3460//6\nf 3466//1 3467//1 3468//1\nf 3472//2 3471//2 3470//2\nf 3465//3 3469//3 3470//3\nf 3466//4 3470//4 3471//4\nf 3471//5 3472//5 3468//5\nf 3465//6 3468//6 3472//6\nf 3474//1 3475//1 3476//1\nf 3480//2 3479//2 3478//2\nf 3473//3 3477//3 3478//3\nf 3474//4 3478//4 3479//4\nf 3479//5 3480//5 3476//5\nf 3477//6 3473//6 3476//6\nf 3482//1 3483//1 3484//1\nf 3488//2 3487//2 3486//2\nf 3481//3 3485//3 3486//3\nf 3486//4 3487//4 3483//4\nf 3487//5 3488//5 3484//5\nf 3481//6 3484//6 3488//6\nf 3490//1 3491//1 3492//1\nf 3496//2 3495//2 3494//2\nf 3489//3 3493//3 3494//3\nf 3494//4 3495//4 3491//4\nf 3495//5 3496//5 3492//5\nf 3489//6 3492//6 3496//6\nf 3498//1 3499//1 3500//1\nf 3504//2 3503//2 3502//2\nf 3497//3 3501//3 3502//3\nf 3502//4 3503//4 3499//4\nf 3503//5 3504//5 3500//5\nf 3497//6 3500//6 3504//6\nf 3506//1 3507//1 3508//1\nf 3512//2 3511//2 3510//2\nf 3505//3 3509//3 3510//3\nf 3510//4 3511//4 3507//4\nf 3511//5 3512//5 3508//5\nf 3505//6 3508//6 3512//6\nf 3514//1 3515//1 3516//1\nf 3520//2 3519//2 3518//2\nf 3513//3 3517//3 3518//3\nf 3518//4 3519//4 3515//4\nf 3519//5 3520//5 3516//5\nf 3513//6 3516//6 3520//6\nf 3521//1 3522//1 3523//1\nf 3528//2 3527//2 3526//2\nf 3521//3 3525//3 3526//3\nf 3522//4 3526//4 3527//4\nf 3527//5 3528//5 3524//5\nf 3521//6 3524//6 3528//6\nf 3529//1 3530//1 3531//1\nf 3536//2 3535//2 3534//2\nf 3529//3 3533//3 3534//3\nf 3530//4 3534//4 3535//4\nf 3535//5 3536//5 3532//5\nf 3529//6 3532//6 3536//6\nf 3538//1 3539//1 3540//1\nf 3544//2 3543//2 3542//2\nf 3537//3 3541//3 3542//3\nf 3538//4 3542//4 3543//4\nf 3543//5 3544//5 3540//5\nf 3541//6 3537//6 3540//6\nf 3546//1 3547//1 3548//1\nf 3552//2 3551//2 3550//2\nf 3545//3 3549//3 3550//3\nf 3546//4 3550//4 3551//4\nf 3551//5 3552//5 3548//5\nf 3545//6 3548//6 3552//6\nf 3554//1 3555//1 3556//1\nf 3560//2 3559//2 3558//2\nf 3553//3 3557//3 3558//3\nf 3554//4 3558//4 3559//4\nf 3559//5 3560//5 3556//5\nf 3557//6 3553//6 3556//6\nf 3562//1 3563//1 3564//1\nf 3568//2 3567//2 3566//2\nf 3561//3 3565//3 3566//3\nf 3566//4 3567//4 3563//4\nf 3567//5 3568//5 3564//5\nf 3561//6 3564//6 3568//6\nf 3570//1 3571//1 3572//1\nf 3576//2 3575//2 3574//2\nf 3569//3 3573//3 3574//3\nf 3574//4 3575//4 3571//4\nf 3575//5 3576//5 3572//5\nf 3569//6 3572//6 3576//6\nf 3578//1 3579//1 3580//1\nf 3584//2 3583//2 3582//2\nf 3577//3 3581//3 3582//3\nf 3582//4 3583//4 3579//4\nf 3583//5 3584//5 3580//5\nf 3577//6 3580//6 3584//6\nf 3586//1 3587//1 3588//1\nf 3592//2 3591//2 3590//2\nf 3585//3 3589//3 3590//3\nf 3590//4 3591//4 3587//4\nf 3591//5 3592//5 3588//5\nf 3585//6 3588//6 3592//6\nf 3594//1 3595//1 3596//1\nf 3600//2 3599//2 3598//2\nf 3593//3 3597//3 3598//3\nf 3598//4 3599//4 3595//4\nf 3599//5 3600//5 3596//5\nf 3593//6 3596//6 3600//6\nf 3601//1 3602//1 3603//1\nf 3605//2 3608//2 3607//2\nf 3605//3 3606//3 3602//3\nf 3602//4 3606//4 3607//4\nf 3607//5 3608//5 3604//5\nf 3601//6 3604//6 3608//6\nf 3609//1 3610//1 3611//1\nf 3613//2 3616//2 3615//2\nf 3613//3 3614//3 3610//3\nf 3610//4 3614//4 3615//4\nf 3615//5 3616//5 3612//5\nf 3609//6 3612//6 3616//6\nf 3618//1 3619//1 3620//1\nf 3621//2 3624//2 3623//2\nf 3621//3 3622//3 3618//3\nf 3618//4 3622//4 3623//4\nf 3623//5 3624//5 3620//5\nf 3621//6 3617//6 3620//6\nf 3626//1 3627//1 3628//1\nf 3629//2 3632//2 3631//2\nf 3629//3 3630//3 3626//3\nf 3626//4 3630//4 3631//4\nf 3631//5 3632//5 3628//5\nf 3625//6 3628//6 3632//6\nf 3634//1 3635//1 3636//1\nf 3637//2 3640//2 3639//2\nf 3637//3 3638//3 3634//3\nf 3634//4 3638//4 3639//4\nf 3639//5 3640//5 3636//5\nf 3637//6 3633//6 3636//6\nf 3642//1 3643//1 3644//1\nf 3648//2 3647//2 3646//2\nf 3645//3 3646//3 3642//3\nf 3646//4 3647//4 3643//4\nf 3647//5 3648//5 3644//5\nf 3641//6 3644//6 3648//6\nf 3650//1 3651//1 3652//1\nf 3656//2 3655//2 3654//2\nf 3653//3 3654//3 3650//3\nf 3654//4 3655//4 3651//4\nf 3655//5 3656//5 3652//5\nf 3649//6 3652//6 3656//6\nf 3658//1 3659//1 3660//1\nf 3664//2 3663//2 3662//2\nf 3661//3 3662//3 3658//3\nf 3662//4 3663//4 3659//4\nf 3663//5 3664//5 3660//5\nf 3657//6 3660//6 3664//6\nf 3666//1 3667//1 3668//1\nf 3672//2 3671//2 3670//2\nf 3669//3 3670//3 3666//3\nf 3670//4 3671//4 3667//4\nf 3671//5 3672//5 3668//5\nf 3665//6 3668//6 3672//6\nf 3674//1 3675//1 3676//1\nf 3680//2 3679//2 3678//2\nf 3677//3 3678//3 3674//3\nf 3678//4 3679//4 3675//4\nf 3679//5 3680//5 3676//5\nf 3673//6 3676//6 3680//6\nf 3681//1 3682//1 3683//1\nf 3685//2 3688//2 3687//2\nf 3685//3 3686//3 3682//3\nf 3682//4 3686//4 3687//4\nf 3687//5 3688//5 3684//5\nf 3681//6 3684//6 3688//6\nf 3689//1 3690//1 3691//1\nf 3693//2 3696//2 3695//2\nf 3693//3 3694//3 3690//3\nf 3690//4 3694//4 3695//4\nf 3695//5 3696//5 3692//5\nf 3689//6 3692//6 3696//6\nf 3698//1 3699//1 3700//1\nf 3701//2 3704//2 3703//2\nf 3701//3 3702//3 3698//3\nf 3698//4 3702//4 3703//4\nf 3703//5 3704//5 3700//5\nf 3701//6 3697//6 3700//6\nf 3706//1 3707//1 3708//1\nf 3709//2 3712//2 3711//2\nf 3709//3 3710//3 3706//3\nf 3706//4 3710//4 3711//4\nf 3711//5 3712//5 3708//5\nf 3705//6 3708//6 3712//6\nf 3714//1 3715//1 3716//1\nf 3717//2 3720//2 3719//2\nf 3717//3 3718//3 3714//3\nf 3714//4 3718//4 3719//4\nf 3719//5 3720//5 3716//5\nf 3717//6 3713//6 3716//6\nf 3722//1 3723//1 3724//1\nf 3728//2 3727//2 3726//2\nf 3725//3 3726//3 3722//3\nf 3726//4 3727//4 3723//4\nf 3727//5 3728//5 3724//5\nf 3721//6 3724//6 3728//6\nf 3730//1 3731//1 3732//1\nf 3736//2 3735//2 3734//2\nf 3733//3 3734//3 3730//3\nf 3734//4 3735//4 3731//4\nf 3735//5 3736//5 3732//5\nf 3729//6 3732//6 3736//6\nf 3738//1 3739//1 3740//1\nf 3744//2 3743//2 3742//2\nf 3741//3 3742//3 3738//3\nf 3742//4 3743//4 3739//4\nf 3743//5 3744//5 3740//5\nf 3737//6 3740//6 3744//6\nf 3746//1 3747//1 3748//1\nf 3752//2 3751//2 3750//2\nf 3749//3 3750//3 3746//3\nf 3750//4 3751//4 3747//4\nf 3751//5 3752//5 3748//5\nf 3745//6 3748//6 3752//6\nf 3754//1 3755//1 3756//1\nf 3760//2 3759//2 3758//2\nf 3757//3 3758//3 3754//3\nf 3758//4 3759//4 3755//4\nf 3759//5 3760//5 3756//5\nf 3753//6 3756//6 3760//6\nf 3761//1 3762//1 3763//1\nf 3765//2 3768//2 3767//2\nf 3765//3 3766//3 3762//3\nf 3762//4 3766//4 3767//4\nf 3767//5 3768//5 3764//5\nf 3761//6 3764//6 3768//6\nf 3769//1 3770//1 3771//1\nf 3773//2 3776//2 3775//2\nf 3773//3 3774//3 3770//3\nf 3770//4 3774//4 3775//4\nf 3775//5 3776//5 3772//5\nf 3769//6 3772//6 3776//6\nf 3778//1 3779//1 3780//1\nf 3781//2 3784//2 3783//2\nf 3781//3 3782//3 3778//3\nf 3778//4 3782//4 3783//4\nf 3783//5 3784//5 3780//5\nf 3781//6 3777//6 3780//6\nf 3786//1 3787//1 3788//1\nf 3789//2 3792//2 3791//2\nf 3789//3 3790//3 3786//3\nf 3786//4 3790//4 3791//4\nf 3791//5 3792//5 3788//5\nf 3785//6 3788//6 3792//6\nf 3794//1 3795//1 3796//1\nf 3797//2 3800//2 3799//2\nf 3797//3 3798//3 3794//3\nf 3794//4 3798//4 3799//4\nf 3799//5 3800//5 3796//5\nf 3797//6 3793//6 3796//6\nf 3802//1 3803//1 3804//1\nf 3808//2 3807//2 3806//2\nf 3805//3 3806//3 3802//3\nf 3806//4 3807//4 3803//4\nf 3807//5 3808//5 3804//5\nf 3801//6 3804//6 3808//6\nf 3810//1 3811//1 3812//1\nf 3816//2 3815//2 3814//2\nf 3813//3 3814//3 3810//3\nf 3814//4 3815//4 3811//4\nf 3815//5 3816//5 3812//5\nf 3809//6 3812//6 3816//6\nf 3818//1 3819//1 3820//1\nf 3824//2 3823//2 3822//2\nf 3821//3 3822//3 3818//3\nf 3822//4 3823//4 3819//4\nf 3823//5 3824//5 3820//5\nf 3817//6 3820//6 3824//6\nf 3826//1 3827//1 3828//1\nf 3832//2 3831//2 3830//2\nf 3829//3 3830//3 3826//3\nf 3830//4 3831//4 3827//4\nf 3831//5 3832//5 3828//5\nf 3825//6 3828//6 3832//6\nf 3834//1 3835//1 3836//1\nf 3840//2 3839//2 3838//2\nf 3837//3 3838//3 3834//3\nf 3838//4 3839//4 3835//4\nf 3839//5 3840//5 3836//5\nf 3833//6 3836//6 3840//6\nf 3841//1 3842//1 3843//1\nf 3845//2 3848//2 3847//2\nf 3845//3 3846//3 3842//3\nf 3842//4 3846//4 3847//4\nf 3847//5 3848//5 3844//5\nf 3841//6 3844//6 3848//6\nf 3849//1 3850//1 3851//1\nf 3853//2 3856//2 3855//2\nf 3853//3 3854//3 3850//3\nf 3850//4 3854//4 3855//4\nf 3855//5 3856//5 3852//5\nf 3849//6 3852//6 3856//6\nf 3858//1 3859//1 3860//1\nf 3861//2 3864//2 3863//2\nf 3861//3 3862//3 3858//3\nf 3858//4 3862//4 3863//4\nf 3863//5 3864//5 3860//5\nf 3861//6 3857//6 3860//6\nf 3866//1 3867//1 3868//1\nf 3869//2 3872//2 3871//2\nf 3869//3 3870//3 3866//3\nf 3866//4 3870//4 3871//4\nf 3871//5 3872//5 3868//5\nf 3865//6 3868//6 3872//6\nf 3874//1 3875//1 3876//1\nf 3877//2 3880//2 3879//2\nf 3877//3 3878//3 3874//3\nf 3874//4 3878//4 3879//4\nf 3879//5 3880//5 3876//5\nf 3877//6 3873//6 3876//6\nf 3882//1 3883//1 3884//1\nf 3888//2 3887//2 3886//2\nf 3885//3 3886//3 3882//3\nf 3886//4 3887//4 3883//4\nf 3887//5 3888//5 3884//5\nf 3881//6 3884//6 3888//6\nf 3890//1 3891//1 3892//1\nf 3896//2 3895//2 3894//2\nf 3893//3 3894//3 3890//3\nf 3894//4 3895//4 3891//4\nf 3895//5 3896//5 3892//5\nf 3889//6 3892//6 3896//6\nf 3898//1 3899//1 3900//1\nf 3904//2 3903//2 3902//2\nf 3901//3 3902//3 3898//3\nf 3902//4 3903//4 3899//4\nf 3903//5 3904//5 3900//5\nf 3897//6 3900//6 3904//6\nf 3906//1 3907//1 3908//1\nf 3912//2 3911//2 3910//2\nf 3909//3 3910//3 3906//3\nf 3910//4 3911//4 3907//4\nf 3911//5 3912//5 3908//5\nf 3905//6 3908//6 3912//6\nf 3914//1 3915//1 3916//1\nf 3920//2 3919//2 3918//2\nf 3917//3 3918//3 3914//3\nf 3918//4 3919//4 3915//4\nf 3919//5 3920//5 3916//5\nf 3913//6 3916//6 3920//6\nf 3921//1 3922//1 3923//1\nf 3925//2 3928//2 3927//2\nf 3925//3 3926//3 3922//3\nf 3922//4 3926//4 3927//4\nf 3927//5 3928//5 3924//5\nf 3921//6 3924//6 3928//6\nf 3929//1 3930//1 3931//1\nf 3933//2 3936//2 3935//2\nf 3933//3 3934//3 3930//3\nf 3930//4 3934//4 3935//4\nf 3935//5 3936//5 3932//5\nf 3929//6 3932//6 3936//6\nf 3938//1 3939//1 3940//1\nf 3941//2 3944//2 3943//2\nf 3941//3 3942//3 3938//3\nf 3938//4 3942//4 3943//4\nf 3943//5 3944//5 3940//5\nf 3941//6 3937//6 3940//6\nf 3946//1 3947//1 3948//1\nf 3949//2 3952//2 3951//2\nf 3949//3 3950//3 3946//3\nf 3946//4 3950//4 3951//4\nf 3951//5 3952//5 3948//5\nf 3945//6 3948//6 3952//6\nf 3954//1 3955//1 3956//1\nf 3957//2 3960//2 3959//2\nf 3957//3 3958//3 3954//3\nf 3954//4 3958//4 3959//4\nf 3959//5 3960//5 3956//5\nf 3957//6 3953//6 3956//6\nf 3962//1 3963//1 3964//1\nf 3968//2 3967//2 3966//2\nf 3965//3 3966//3 3962//3\nf 3966//4 3967//4 3963//4\nf 3967//5 3968//5 3964//5\nf 3961//6 3964//6 3968//6\nf 3970//1 3971//1 3972//1\nf 3976//2 3975//2 3974//2\nf 3973//3 3974//3 3970//3\nf 3974//4 3975//4 3971//4\nf 3975//5 3976//5 3972//5\nf 3969//6 3972//6 3976//6\nf 3978//1 3979//1 3980//1\nf 3984//2 3983//2 3982//2\nf 3981//3 3982//3 3978//3\nf 3982//4 3983//4 3979//4\nf 3983//5 3984//5 3980//5\nf 3977//6 3980//6 3984//6\nf 3986//1 3987//1 3988//1\nf 3992//2 3991//2 3990//2\nf 3989//3 3990//3 3986//3\nf 3990//4 3991//4 3987//4\nf 3991//5 3992//5 3988//5\nf 3985//6 3988//6 3992//6\nf 3994//1 3995//1 3996//1\nf 4000//2 3999//2 3998//2\nf 3997//3 3998//3 3994//3\nf 3998//4 3999//4 3995//4\nf 3999//5 4000//5 3996//5\nf 3993//6 3996//6 4000//6\nf 4004//1 4003//1 4002//1\nf 4005//2 4006//2 4007//2\nf 4001//5 4002//5 4006//5\nf 4002//4 4003//4 4007//4\nf 4004//3 4008//3 4007//3\nf 4008//6 4004//6 4001//6\nf 4012//1 4011//1 4010//1\nf 4013//2 4014//2 4015//2\nf 4009//5 4010//5 4014//5\nf 4010//4 4011//4 4015//4\nf 4012//3 4016//3 4015//3\nf 4013//6 4016//6 4012//6\nf 4020//1 4019//1 4018//1\nf 4021//2 4022//2 4023//2\nf 4017//5 4018//5 4022//5\nf 4018//4 4019//4 4023//4\nf 4020//3 4024//3 4023//3\nf 4021//6 4024//6 4020//6\nf 4028//1 4027//1 4026//1\nf 4030//2 4031//2 4032//2\nf 4025//5 4026//5 4030//5\nf 4026//4 4027//4 4031//4\nf 4028//3 4032//3 4031//3\nf 4032//6 4028//6 4025//6\nf 4036//1 4035//1 4034//1\nf 4037//2 4038//2 4039//2\nf 4033//5 4034//5 4038//5\nf 4034//4 4035//4 4039//4\nf 4036//3 4040//3 4039//3\nf 4037//6 4040//6 4036//6\nf 4044//1 4043//1 4042//1\nf 4046//2 4047//2 4048//2\nf 4041//5 4042//5 4046//5\nf 4043//4 4047//4 4046//4\nf 4044//3 4048//3 4047//3\nf 4048//6 4044//6 4041//6\nf 4052//1 4051//1 4050//1\nf 4054//2 4055//2 4056//2\nf 4049//5 4050//5 4054//5\nf 4051//4 4055//4 4054//4\nf 4052//3 4056//3 4055//3\nf 4056//6 4052//6 4049//6\nf 4060//1 4059//1 4058//1\nf 4062//2 4063//2 4064//2\nf 4057//5 4058//5 4062//5\nf 4059//4 4063//4 4062//4\nf 4060//3 4064//3 4063//3\nf 4064//6 4060//6 4057//6\nf 4068//1 4067//1 4066//1\nf 4070//2 4071//2 4072//2\nf 4065//5 4066//5 4070//5\nf 4067//4 4071//4 4070//4\nf 4068//3 4072//3 4071//3\nf 4072//6 4068//6 4065//6\nf 4076//1 4075//1 4074//1\nf 4078//2 4079//2 4080//2\nf 4073//5 4074//5 4078//5\nf 4075//4 4079//4 4078//4\nf 4076//3 4080//3 4079//3\nf 4080//6 4076//6 4073//6\nf 4084//1 4083//1 4082//1\nf 4085//2 4086//2 4087//2\nf 4082//5 4086//5 4085//5\nf 4082//4 4083//4 4087//4\nf 4084//3 4088//3 4087//3\nf 4088//6 4084//6 4081//6\nf 4092//1 4091//1 4090//1\nf 4093//2 4094//2 4095//2\nf 4090//5 4094//5 4093//5\nf 4090//4 4091//4 4095//4\nf 4092//3 4096//3 4095//3\nf 4093//6 4096//6 4092//6\nf 4100//1 4099//1 4098//1\nf 4101//2 4102//2 4103//2\nf 4097//5 4098//5 4102//5\nf 4098//4 4099//4 4103//4\nf 4100//3 4104//3 4103//3\nf 4101//6 4104//6 4100//6\nf 4108//1 4107//1 4106//1\nf 4110//2 4111//2 4112//2\nf 4105//5 4106//5 4110//5\nf 4106//4 4107//4 4111//4\nf 4108//3 4112//3 4111//3\nf 4112//6 4108//6 4105//6\nf 4116//1 4115//1 4114//1\nf 4118//2 4119//2 4120//2\nf 4113//5 4114//5 4118//5\nf 4114//4 4115//4 4119//4\nf 4116//3 4120//3 4119//3\nf 4117//6 4120//6 4116//6\nf 4124//1 4123//1 4122//1\nf 4126//2 4127//2 4128//2\nf 4121//5 4122//5 4126//5\nf 4123//4 4127//4 4126//4\nf 4124//3 4128//3 4127//3\nf 4128//6 4124//6 4121//6\nf 4132//1 4131//1 4130//1\nf 4134//2 4135//2 4136//2\nf 4129//5 4130//5 4134//5\nf 4131//4 4135//4 4134//4\nf 4132//3 4136//3 4135//3\nf 4136//6 4132//6 4129//6\nf 4140//1 4139//1 4138//1\nf 4142//2 4143//2 4144//2\nf 4137//5 4138//5 4142//5\nf 4139//4 4143//4 4142//4\nf 4140//3 4144//3 4143//3\nf 4144//6 4140//6 4137//6\nf 4148//1 4147//1 4146//1\nf 4150//2 4151//2 4152//2\nf 4145//5 4146//5 4150//5\nf 4147//4 4151//4 4150//4\nf 4148//3 4152//3 4151//3\nf 4152//6 4148//6 4145//6\nf 4156//1 4155//1 4154//1\nf 4158//2 4159//2 4160//2\nf 4153//5 4154//5 4158//5\nf 4155//4 4159//4 4158//4\nf 4156//3 4160//3 4159//3\nf 4160//6 4156//6 4153//6\nf 4161//1 4164//1 4163//1\nf 4165//2 4166//2 4167//2\nf 4162//5 4166//5 4165//5\nf 4162//4 4163//4 4167//4\nf 4164//3 4168//3 4167//3\nf 4168//6 4164//6 4161//6\nf 4172//1 4171//1 4170//1\nf 4173//2 4174//2 4175//2\nf 4169//5 4170//5 4174//5\nf 4170//4 4171//4 4175//4\nf 4172//3 4176//3 4175//3\nf 4173//6 4176//6 4172//6\nf 4180//1 4179//1 4178//1\nf 4181//2 4182//2 4183//2\nf 4177//5 4178//5 4182//5\nf 4178//4 4179//4 4183//4\nf 4180//3 4184//3 4183//3\nf 4181//6 4184//6 4180//6\nf 4188//1 4187//1 4186//1\nf 4189//2 4190//2 4191//2\nf 4185//5 4186//5 4190//5\nf 4186//4 4187//4 4191//4\nf 4188//3 4192//3 4191//3\nf 4192//6 4188//6 4185//6\nf 4196//1 4195//1 4194//1\nf 4197//2 4198//2 4199//2\nf 4194//5 4198//5 4197//5\nf 4194//4 4195//4 4199//4\nf 4196//3 4200//3 4199//3\nf 4197//6 4200//6 4196//6\nf 4204//1 4203//1 4202//1\nf 4206//2 4207//2 4208//2\nf 4201//5 4202//5 4206//5\nf 4203//4 4207//4 4206//4\nf 4204//3 4208//3 4207//3\nf 4208//6 4204//6 4201//6\nf 4212//1 4211//1 4210//1\nf 4214//2 4215//2 4216//2\nf 4209//5 4210//5 4214//5\nf 4211//4 4215//4 4214//4\nf 4212//3 4216//3 4215//3\nf 4216//6 4212//6 4209//6\nf 4220//1 4219//1 4218//1\nf 4222//2 4223//2 4224//2\nf 4217//5 4218//5 4222//5\nf 4219//4 4223//4 4222//4\nf 4220//3 4224//3 4223//3\nf 4224//6 4220//6 4217//6\nf 4228//1 4227//1 4226//1\nf 4230//2 4231//2 4232//2\nf 4225//5 4226//5 4230//5\nf 4227//4 4231//4 4230//4\nf 4228//3 4232//3 4231//3\nf 4232//6 4228//6 4225//6\nf 4236//1 4235//1 4234//1\nf 4238//2 4239//2 4240//2\nf 4233//5 4234//5 4238//5\nf 4235//4 4239//4 4238//4\nf 4236//3 4240//3 4239//3\nf 4240//6 4236//6 4233//6\nf 4241//1 4244//1 4243//1\nf 4246//2 4247//2 4248//2\nf 4241//5 4242//5 4246//5\nf 4242//4 4243//4 4247//4\nf 4244//3 4248//3 4247//3\nf 4248//6 4244//6 4241//6\nf 4249//1 4252//1 4251//1\nf 4254//2 4255//2 4256//2\nf 4249//5 4250//5 4254//5\nf 4250//4 4251//4 4255//4\nf 4252//3 4256//3 4255//3\nf 4253//6 4256//6 4252//6\nf 4260//1 4259//1 4258//1\nf 4262//2 4263//2 4264//2\nf 4257//5 4258//5 4262//5\nf 4258//4 4259//4 4263//4\nf 4260//3 4264//3 4263//3\nf 4261//6 4264//6 4260//6\nf 4268//1 4267//1 4266//1\nf 4270//2 4271//2 4272//2\nf 4265//5 4266//5 4270//5\nf 4266//4 4267//4 4271//4\nf 4268//3 4272//3 4271//3\nf 4272//6 4268//6 4265//6\nf 4276//1 4275//1 4274//1\nf 4278//2 4279//2 4280//2\nf 4273//5 4274//5 4278//5\nf 4274//4 4275//4 4279//4\nf 4276//3 4280//3 4279//3\nf 4277//6 4280//6 4276//6\nf 4284//1 4283//1 4282//1\nf 4286//2 4287//2 4288//2\nf 4281//5 4282//5 4286//5\nf 4283//4 4287//4 4286//4\nf 4284//3 4288//3 4287//3\nf 4288//6 4284//6 4281//6\nf 4292//1 4291//1 4290//1\nf 4294//2 4295//2 4296//2\nf 4289//5 4290//5 4294//5\nf 4291//4 4295//4 4294//4\nf 4292//3 4296//3 4295//3\nf 4296//6 4292//6 4289//6\nf 4300//1 4299//1 4298//1\nf 4302//2 4303//2 4304//2\nf 4297//5 4298//5 4302//5\nf 4299//4 4303//4 4302//4\nf 4300//3 4304//3 4303//3\nf 4304//6 4300//6 4297//6\nf 4308//1 4307//1 4306//1\nf 4310//2 4311//2 4312//2\nf 4305//5 4306//5 4310//5\nf 4307//4 4311//4 4310//4\nf 4308//3 4312//3 4311//3\nf 4312//6 4308//6 4305//6\nf 4316//1 4315//1 4314//1\nf 4318//2 4319//2 4320//2\nf 4313//5 4314//5 4318//5\nf 4315//4 4319//4 4318//4\nf 4316//3 4320//3 4319//3\nf 4320//6 4316//6 4313//6\nf 4321//1 4324//1 4323//1\nf 4326//2 4327//2 4328//2\nf 4321//5 4322//5 4326//5\nf 4322//4 4323//4 4327//4\nf 4324//3 4328//3 4327//3\nf 4328//6 4324//6 4321//6\nf 4329//1 4332//1 4331//1\nf 4334//2 4335//2 4336//2\nf 4329//5 4330//5 4334//5\nf 4330//4 4331//4 4335//4\nf 4332//3 4336//3 4335//3\nf 4333//6 4336//6 4332//6\nf 4340//1 4339//1 4338//1\nf 4342//2 4343//2 4344//2\nf 4337//5 4338//5 4342//5\nf 4338//4 4339//4 4343//4\nf 4340//3 4344//3 4343//3\nf 4341//6 4344//6 4340//6\nf 4348//1 4347//1 4346//1\nf 4350//2 4351//2 4352//2\nf 4345//5 4346//5 4350//5\nf 4346//4 4347//4 4351//4\nf 4348//3 4352//3 4351//3\nf 4352//6 4348//6 4345//6\nf 4356//1 4355//1 4354//1\nf 4358//2 4359//2 4360//2\nf 4353//5 4354//5 4358//5\nf 4354//4 4355//4 4359//4\nf 4356//3 4360//3 4359//3\nf 4357//6 4360//6 4356//6\nf 4364//1 4363//1 4362//1\nf 4366//2 4367//2 4368//2\nf 4361//5 4362//5 4366//5\nf 4363//4 4367//4 4366//4\nf 4364//3 4368//3 4367//3\nf 4368//6 4364//6 4361//6\nf 4372//1 4371//1 4370//1\nf 4374//2 4375//2 4376//2\nf 4369//5 4370//5 4374//5\nf 4371//4 4375//4 4374//4\nf 4372//3 4376//3 4375//3\nf 4376//6 4372//6 4369//6\nf 4380//1 4379//1 4378//1\nf 4382//2 4383//2 4384//2\nf 4377//5 4378//5 4382//5\nf 4379//4 4383//4 4382//4\nf 4380//3 4384//3 4383//3\nf 4384//6 4380//6 4377//6\nf 4388//1 4387//1 4386//1\nf 4390//2 4391//2 4392//2\nf 4385//5 4386//5 4390//5\nf 4387//4 4391//4 4390//4\nf 4388//3 4392//3 4391//3\nf 4392//6 4388//6 4385//6\nf 4396//1 4395//1 4394//1\nf 4398//2 4399//2 4400//2\nf 4393//5 4394//5 4398//5\nf 4395//4 4399//4 4398//4\nf 4396//3 4400//3 4399//3\nf 4400//6 4396//6 4393//6\nf 4401//1 4404//1 4403//1\nf 4405//2 4406//2 4407//2\nf 4402//5 4406//5 4405//5\nf 4402//4 4403//4 4407//4\nf 4404//3 4408//3 4407//3\nf 4408//6 4404//6 4401//6\nf 4409//1 4412//1 4411//1\nf 4413//2 4414//2 4415//2\nf 4410//5 4414//5 4413//5\nf 4410//4 4411//4 4415//4\nf 4412//3 4416//3 4415//3\nf 4413//6 4416//6 4412//6\nf 4420//1 4419//1 4418//1\nf 4421//2 4422//2 4423//2\nf 4418//5 4422//5 4421//5\nf 4418//4 4419//4 4423//4\nf 4420//3 4424//3 4423//3\nf 4421//6 4424//6 4420//6\nf 4428//1 4427//1 4426//1\nf 4429//2 4430//2 4431//2\nf 4426//5 4430//5 4429//5\nf 4426//4 4427//4 4431//4\nf 4428//3 4432//3 4431//3\nf 4432//6 4428//6 4425//6\nf 4436//1 4435//1 4434//1\nf 4437//2 4438//2 4439//2\nf 4434//5 4438//5 4437//5\nf 4434//4 4435//4 4439//4\nf 4436//3 4440//3 4439//3\nf 4437//6 4440//6 4436//6\nf 4444//1 4443//1 4442//1\nf 4446//2 4447//2 4448//2\nf 4442//5 4446//5 4445//5\nf 4443//4 4447//4 4446//4\nf 4444//3 4448//3 4447//3\nf 4448//6 4444//6 4441//6\nf 4452//1 4451//1 4450//1\nf 4454//2 4455//2 4456//2\nf 4450//5 4454//5 4453//5\nf 4451//4 4455//4 4454//4\nf 4452//3 4456//3 4455//3\nf 4456//6 4452//6 4449//6\nf 4460//1 4459//1 4458//1\nf 4462//2 4463//2 4464//2\nf 4458//5 4462//5 4461//5\nf 4459//4 4463//4 4462//4\nf 4460//3 4464//3 4463//3\nf 4464//6 4460//6 4457//6\nf 4468//1 4467//1 4466//1\nf 4470//2 4471//2 4472//2\nf 4466//5 4470//5 4469//5\nf 4467//4 4471//4 4470//4\nf 4468//3 4472//3 4471//3\nf 4472//6 4468//6 4465//6\nf 4476//1 4475//1 4474//1\nf 4478//2 4479//2 4480//2\nf 4474//5 4478//5 4477//5\nf 4475//4 4479//4 4478//4\nf 4476//3 4480//3 4479//3\nf 4480//6 4476//6 4473//6\nf 4481//1 4484//1 4483//1\nf 4485//2 4486//2 4487//2\nf 4482//5 4486//5 4485//5\nf 4482//4 4483//4 4487//4\nf 4484//3 4488//3 4487//3\nf 4488//6 4484//6 4481//6\nf 4489//1 4492//1 4491//1\nf 4493//2 4494//2 4495//2\nf 4490//5 4494//5 4493//5\nf 4490//4 4491//4 4495//4\nf 4492//3 4496//3 4495//3\nf 4493//6 4496//6 4492//6\nf 4500//1 4499//1 4498//1\nf 4501//2 4502//2 4503//2\nf 4498//5 4502//5 4501//5\nf 4498//4 4499//4 4503//4\nf 4500//3 4504//3 4503//3\nf 4501//6 4504//6 4500//6\nf 4508//1 4507//1 4506//1\nf 4509//2 4510//2 4511//2\nf 4506//5 4510//5 4509//5\nf 4506//4 4507//4 4511//4\nf 4508//3 4512//3 4511//3\nf 4512//6 4508//6 4505//6\nf 4516//1 4515//1 4514//1\nf 4517//2 4518//2 4519//2\nf 4514//5 4518//5 4517//5\nf 4514//4 4515//4 4519//4\nf 4516//3 4520//3 4519//3\nf 4517//6 4520//6 4516//6\nf 4524//1 4523//1 4522//1\nf 4526//2 4527//2 4528//2\nf 4522//5 4526//5 4525//5\nf 4523//4 4527//4 4526//4\nf 4524//3 4528//3 4527//3\nf 4528//6 4524//6 4521//6\nf 4532//1 4531//1 4530//1\nf 4534//2 4535//2 4536//2\nf 4530//5 4534//5 4533//5\nf 4531//4 4535//4 4534//4\nf 4532//3 4536//3 4535//3\nf 4536//6 4532//6 4529//6\nf 4540//1 4539//1 4538//1\nf 4542//2 4543//2 4544//2\nf 4538//5 4542//5 4541//5\nf 4539//4 4543//4 4542//4\nf 4540//3 4544//3 4543//3\nf 4544//6 4540//6 4537//6\nf 4548//1 4547//1 4546//1\nf 4550//2 4551//2 4552//2\nf 4546//5 4550//5 4549//5\nf 4547//4 4551//4 4550//4\nf 4548//3 4552//3 4551//3\nf 4552//6 4548//6 4545//6\nf 4556//1 4555//1 4554//1\nf 4558//2 4559//2 4560//2\nf 4554//5 4558//5 4557//5\nf 4555//4 4559//4 4558//4\nf 4556//3 4560//3 4559//3\nf 4560//6 4556//6 4553//6\nf 4561//1 4564//1 4563//1\nf 4565//2 4566//2 4567//2\nf 4562//5 4566//5 4565//5\nf 4562//4 4563//4 4567//4\nf 4564//3 4568//3 4567//3\nf 4568//6 4564//6 4561//6\nf 4569//1 4572//1 4571//1\nf 4573//2 4574//2 4575//2\nf 4570//5 4574//5 4573//5\nf 4570//4 4571//4 4575//4\nf 4572//3 4576//3 4575//3\nf 4573//6 4576//6 4572//6\nf 4580//1 4579//1 4578//1\nf 4581//2 4582//2 4583//2\nf 4578//5 4582//5 4581//5\nf 4578//4 4579//4 4583//4\nf 4580//3 4584//3 4583//3\nf 4581//6 4584//6 4580//6\nf 4588//1 4587//1 4586//1\nf 4589//2 4590//2 4591//2\nf 4586//5 4590//5 4589//5\nf 4586//4 4587//4 4591//4\nf 4588//3 4592//3 4591//3\nf 4592//6 4588//6 4585//6\nf 4596//1 4595//1 4594//1\nf 4597//2 4598//2 4599//2\nf 4594//5 4598//5 4597//5\nf 4594//4 4595//4 4599//4\nf 4596//3 4600//3 4599//3\nf 4597//6 4600//6 4596//6\nf 4604//1 4603//1 4602//1\nf 4606//2 4607//2 4608//2\nf 4602//5 4606//5 4605//5\nf 4603//4 4607//4 4606//4\nf 4604//3 4608//3 4607//3\nf 4608//6 4604//6 4601//6\nf 4612//1 4611//1 4610//1\nf 4614//2 4615//2 4616//2\nf 4610//5 4614//5 4613//5\nf 4611//4 4615//4 4614//4\nf 4612//3 4616//3 4615//3\nf 4616//6 4612//6 4609//6\nf 4620//1 4619//1 4618//1\nf 4622//2 4623//2 4624//2\nf 4618//5 4622//5 4621//5\nf 4619//4 4623//4 4622//4\nf 4620//3 4624//3 4623//3\nf 4624//6 4620//6 4617//6\nf 4628//1 4627//1 4626//1\nf 4630//2 4631//2 4632//2\nf 4626//5 4630//5 4629//5\nf 4627//4 4631//4 4630//4\nf 4628//3 4632//3 4631//3\nf 4632//6 4628//6 4625//6\nf 4636//1 4635//1 4634//1\nf 4638//2 4639//2 4640//2\nf 4634//5 4638//5 4637//5\nf 4635//4 4639//4 4638//4\nf 4636//3 4640//3 4639//3\nf 4640//6 4636//6 4633//6\nf 4641//1 4644//1 4643//1\nf 4645//2 4646//2 4647//2\nf 4642//5 4646//5 4645//5\nf 4642//4 4643//4 4647//4\nf 4644//3 4648//3 4647//3\nf 4648//6 4644//6 4641//6\nf 4649//1 4652//1 4651//1\nf 4653//2 4654//2 4655//2\nf 4650//5 4654//5 4653//5\nf 4650//4 4651//4 4655//4\nf 4652//3 4656//3 4655//3\nf 4653//6 4656//6 4652//6\nf 4660//1 4659//1 4658//1\nf 4661//2 4662//2 4663//2\nf 4658//5 4662//5 4661//5\nf 4658//4 4659//4 4663//4\nf 4660//3 4664//3 4663//3\nf 4661//6 4664//6 4660//6\nf 4668//1 4667//1 4666//1\nf 4669//2 4670//2 4671//2\nf 4666//5 4670//5 4669//5\nf 4666//4 4667//4 4671//4\nf 4668//3 4672//3 4671//3\nf 4672//6 4668//6 4665//6\nf 4676//1 4675//1 4674//1\nf 4677//2 4678//2 4679//2\nf 4674//5 4678//5 4677//5\nf 4674//4 4675//4 4679//4\nf 4676//3 4680//3 4679//3\nf 4677//6 4680//6 4676//6\nf 4684//1 4683//1 4682//1\nf 4686//2 4687//2 4688//2\nf 4682//5 4686//5 4685//5\nf 4683//4 4687//4 4686//4\nf 4684//3 4688//3 4687//3\nf 4688//6 4684//6 4681//6\nf 4692//1 4691//1 4690//1\nf 4694//2 4695//2 4696//2\nf 4690//5 4694//5 4693//5\nf 4691//4 4695//4 4694//4\nf 4692//3 4696//3 4695//3\nf 4696//6 4692//6 4689//6\nf 4700//1 4699//1 4698//1\nf 4702//2 4703//2 4704//2\nf 4698//5 4702//5 4701//5\nf 4699//4 4703//4 4702//4\nf 4700//3 4704//3 4703//3\nf 4704//6 4700//6 4697//6\nf 4708//1 4707//1 4706//1\nf 4710//2 4711//2 4712//2\nf 4706//5 4710//5 4709//5\nf 4707//4 4711//4 4710//4\nf 4708//3 4712//3 4711//3\nf 4712//6 4708//6 4705//6\nf 4716//1 4715//1 4714//1\nf 4718//2 4719//2 4720//2\nf 4714//5 4718//5 4717//5\nf 4715//4 4719//4 4718//4\nf 4716//3 4720//3 4719//3\nf 4720//6 4716//6 4713//6\nf 4721//1 4724//1 4723//1\nf 4725//2 4726//2 4727//2\nf 4722//5 4726//5 4725//5\nf 4722//4 4723//4 4727//4\nf 4724//3 4728//3 4727//3\nf 4728//6 4724//6 4721//6\nf 4729//1 4732//1 4731//1\nf 4733//2 4734//2 4735//2\nf 4730//5 4734//5 4733//5\nf 4730//4 4731//4 4735//4\nf 4732//3 4736//3 4735//3\nf 4733//6 4736//6 4732//6\nf 4740//1 4739//1 4738//1\nf 4741//2 4742//2 4743//2\nf 4738//5 4742//5 4741//5\nf 4738//4 4739//4 4743//4\nf 4740//3 4744//3 4743//3\nf 4741//6 4744//6 4740//6\nf 4748//1 4747//1 4746//1\nf 4749//2 4750//2 4751//2\nf 4746//5 4750//5 4749//5\nf 4746//4 4747//4 4751//4\nf 4748//3 4752//3 4751//3\nf 4752//6 4748//6 4745//6\nf 4756//1 4755//1 4754//1\nf 4757//2 4758//2 4759//2\nf 4754//5 4758//5 4757//5\nf 4754//4 4755//4 4759//4\nf 4756//3 4760//3 4759//3\nf 4757//6 4760//6 4756//6\nf 4764//1 4763//1 4762//1\nf 4766//2 4767//2 4768//2\nf 4762//5 4766//5 4765//5\nf 4763//4 4767//4 4766//4\nf 4764//3 4768//3 4767//3\nf 4768//6 4764//6 4761//6\nf 4772//1 4771//1 4770//1\nf 4774//2 4775//2 4776//2\nf 4770//5 4774//5 4773//5\nf 4771//4 4775//4 4774//4\nf 4772//3 4776//3 4775//3\nf 4776//6 4772//6 4769//6\nf 4780//1 4779//1 4778//1\nf 4782//2 4783//2 4784//2\nf 4778//5 4782//5 4781//5\nf 4779//4 4783//4 4782//4\nf 4780//3 4784//3 4783//3\nf 4784//6 4780//6 4777//6\nf 4788//1 4787//1 4786//1\nf 4790//2 4791//2 4792//2\nf 4786//5 4790//5 4789//5\nf 4787//4 4791//4 4790//4\nf 4788//3 4792//3 4791//3\nf 4792//6 4788//6 4785//6\nf 4796//1 4795//1 4794//1\nf 4798//2 4799//2 4800//2\nf 4794//5 4798//5 4797//5\nf 4795//4 4799//4 4798//4\nf 4796//3 4800//3 4799//3\nf 4800//6 4796//6 4793//6\nf 4802//1 4803//1 4804//1\nf 4808//2 4807//2 4806//2\nf 4801//3 4805//3 4806//3\nf 4802//4 4806//4 4807//4\nf 4807//5 4808//5 4804//5\nf 4801//6 4804//6 4808//6\nf 4810//1 4811//1 4812//1\nf 4813//2 4816//2 4815//2\nf 4809//3 4813//3 4814//3\nf 4810//4 4814//4 4815//4\nf 4815//5 4816//5 4812//5\nf 4809//6 4812//6 4816//6\nf 4818//1 4819//1 4820//1\nf 4824//2 4823//2 4822//2\nf 4817//3 4821//3 4822//3\nf 4818//4 4822//4 4823//4\nf 4823//5 4824//5 4820//5\nf 4821//6 4817//6 4820//6\nf 4826//1 4827//1 4828//1\nf 4832//2 4831//2 4830//2\nf 4825//3 4829//3 4830//3\nf 4826//4 4830//4 4831//4\nf 4831//5 4832//5 4828//5\nf 4825//6 4828//6 4832//6\nf 4834//1 4835//1 4836//1\nf 4837//2 4840//2 4839//2\nf 4833//3 4837//3 4838//3\nf 4834//4 4838//4 4839//4\nf 4839//5 4840//5 4836//5\nf 4837//6 4833//6 4836//6\nf 4842//1 4843//1 4844//1\nf 4848//2 4847//2 4846//2\nf 4841//3 4845//3 4846//3\nf 4846//4 4847//4 4843//4\nf 4847//5 4848//5 4844//5\nf 4841//6 4844//6 4848//6\nf 4850//1 4851//1 4852//1\nf 4856//2 4855//2 4854//2\nf 4849//3 4853//3 4854//3\nf 4854//4 4855//4 4851//4\nf 4855//5 4856//5 4852//5\nf 4849//6 4852//6 4856//6\nf 4858//1 4859//1 4860//1\nf 4864//2 4863//2 4862//2\nf 4857//3 4861//3 4862//3\nf 4862//4 4863//4 4859//4\nf 4863//5 4864//5 4860//5\nf 4857//6 4860//6 4864//6\nf 4866//1 4867//1 4868//1\nf 4872//2 4871//2 4870//2\nf 4865//3 4869//3 4870//3\nf 4870//4 4871//4 4867//4\nf 4871//5 4872//5 4868//5\nf 4865//6 4868//6 4872//6\nf 4874//1 4875//1 4876//1\nf 4880//2 4879//2 4878//2\nf 4873//3 4877//3 4878//3\nf 4878//4 4879//4 4875//4\nf 4879//5 4880//5 4876//5\nf 4873//6 4876//6 4880//6\nf 4882//1 4883//1 4884//1\nf 4888//2 4887//2 4886//2\nf 4885//3 4886//3 4882//3\nf 4882//4 4886//4 4887//4\nf 4887//5 4888//5 4884//5\nf 4881//6 4884//6 4888//6\nf 4890//1 4891//1 4892//1\nf 4893//2 4896//2 4895//2\nf 4889//3 4893//3 4894//3\nf 4890//4 4894//4 4895//4\nf 4895//5 4896//5 4892//5\nf 4889//6 4892//6 4896//6\nf 4898//1 4899//1 4900//1\nf 4904//2 4903//2 4902//2\nf 4897//3 4901//3 4902//3\nf 4898//4 4902//4 4903//4\nf 4903//5 4904//5 4900//5\nf 4901//6 4897//6 4900//6\nf 4906//1 4907//1 4908//1\nf 4912//2 4911//2 4910//2\nf 4905//3 4909//3 4910//3\nf 4906//4 4910//4 4911//4\nf 4911//5 4912//5 4908//5\nf 4905//6 4908//6 4912//6\nf 4914//1 4915//1 4916//1\nf 4917//2 4920//2 4919//2\nf 4913//3 4917//3 4918//3\nf 4914//4 4918//4 4919//4\nf 4919//5 4920//5 4916//5\nf 4917//6 4913//6 4916//6\nf 4922//1 4923//1 4924//1\nf 4928//2 4927//2 4926//2\nf 4921//3 4925//3 4926//3\nf 4926//4 4927//4 4923//4\nf 4927//5 4928//5 4924//5\nf 4921//6 4924//6 4928//6\nf 4930//1 4931//1 4932//1\nf 4936//2 4935//2 4934//2\nf 4929//3 4933//3 4934//3\nf 4934//4 4935//4 4931//4\nf 4935//5 4936//5 4932//5\nf 4929//6 4932//6 4936//6\nf 4938//1 4939//1 4940//1\nf 4944//2 4943//2 4942//2\nf 4937//3 4941//3 4942//3\nf 4942//4 4943//4 4939//4\nf 4943//5 4944//5 4940//5\nf 4937//6 4940//6 4944//6\nf 4946//1 4947//1 4948//1\nf 4952//2 4951//2 4950//2\nf 4945//3 4949//3 4950//3\nf 4950//4 4951//4 4947//4\nf 4951//5 4952//5 4948//5\nf 4945//6 4948//6 4952//6\nf 4954//1 4955//1 4956//1\nf 4960//2 4959//2 4958//2\nf 4953//3 4957//3 4958//3\nf 4958//4 4959//4 4955//4\nf 4959//5 4960//5 4956//5\nf 4953//6 4956//6 4960//6\nf 4962//1 4963//1 4964//1\nf 4965//2 4968//2 4967//2\nf 4965//3 4966//3 4962//3\nf 4962//4 4966//4 4967//4\nf 4967//5 4968//5 4964//5\nf 4961//6 4964//6 4968//6\nf 4970//1 4971//1 4972//1\nf 4973//2 4976//2 4975//2\nf 4973//3 4974//3 4970//3\nf 4970//4 4974//4 4975//4\nf 4975//5 4976//5 4972//5\nf 4969//6 4972//6 4976//6\nf 4978//1 4979//1 4980//1\nf 4981//2 4984//2 4983//2\nf 4977//3 4981//3 4982//3\nf 4978//4 4982//4 4983//4\nf 4983//5 4984//5 4980//5\nf 4981//6 4977//6 4980//6\nf 4986//1 4987//1 4988//1\nf 4989//2 4992//2 4991//2\nf 4985//3 4989//3 4990//3\nf 4986//4 4990//4 4991//4\nf 4991//5 4992//5 4988//5\nf 4985//6 4988//6 4992//6\nf 4994//1 4995//1 4996//1\nf 4997//2 5000//2 4999//2\nf 4997//3 4998//3 4994//3\nf 4994//4 4998//4 4999//4\nf 4999//5 5000//5 4996//5\nf 4997//6 4993//6 4996//6\nf 5002//1 5003//1 5004//1\nf 5008//2 5007//2 5006//2\nf 5001//3 5005//3 5006//3\nf 5006//4 5007//4 5003//4\nf 5007//5 5008//5 5004//5\nf 5001//6 5004//6 5008//6\nf 5010//1 5011//1 5012//1\nf 5016//2 5015//2 5014//2\nf 5009//3 5013//3 5014//3\nf 5014//4 5015//4 5011//4\nf 5015//5 5016//5 5012//5\nf 5009//6 5012//6 5016//6\nf 5018//1 5019//1 5020//1\nf 5024//2 5023//2 5022//2\nf 5017//3 5021//3 5022//3\nf 5022//4 5023//4 5019//4\nf 5023//5 5024//5 5020//5\nf 5017//6 5020//6 5024//6\nf 5026//1 5027//1 5028//1\nf 5032//2 5031//2 5030//2\nf 5025//3 5029//3 5030//3\nf 5030//4 5031//4 5027//4\nf 5031//5 5032//5 5028//5\nf 5025//6 5028//6 5032//6\nf 5034//1 5035//1 5036//1\nf 5040//2 5039//2 5038//2\nf 5033//3 5037//3 5038//3\nf 5038//4 5039//4 5035//4\nf 5039//5 5040//5 5036//5\nf 5033//6 5036//6 5040//6\nf 5041//1 5042//1 5043//1\nf 5048//2 5047//2 5046//2\nf 5041//3 5045//3 5046//3\nf 5042//4 5046//4 5047//4\nf 5047//5 5048//5 5044//5\nf 5041//6 5044//6 5048//6\nf 5049//1 5050//1 5051//1\nf 5056//2 5055//2 5054//2\nf 5049//3 5053//3 5054//3\nf 5050//4 5054//4 5055//4\nf 5055//5 5056//5 5052//5\nf 5049//6 5052//6 5056//6\nf 5058//1 5059//1 5060//1\nf 5064//2 5063//2 5062//2\nf 5057//3 5061//3 5062//3\nf 5058//4 5062//4 5063//4\nf 5063//5 5064//5 5060//5\nf 5061//6 5057//6 5060//6\nf 5066//1 5067//1 5068//1\nf 5072//2 5071//2 5070//2\nf 5065//3 5069//3 5070//3\nf 5066//4 5070//4 5071//4\nf 5071//5 5072//5 5068//5\nf 5065//6 5068//6 5072//6\nf 5074//1 5075//1 5076//1\nf 5080//2 5079//2 5078//2\nf 5073//3 5077//3 5078//3\nf 5074//4 5078//4 5079//4\nf 5079//5 5080//5 5076//5\nf 5077//6 5073//6 5076//6\nf 5082//1 5083//1 5084//1\nf 5088//2 5087//2 5086//2\nf 5081//3 5085//3 5086//3\nf 5086//4 5087//4 5083//4\nf 5087//5 5088//5 5084//5\nf 5081//6 5084//6 5088//6\nf 5090//1 5091//1 5092//1\nf 5096//2 5095//2 5094//2\nf 5089//3 5093//3 5094//3\nf 5094//4 5095//4 5091//4\nf 5095//5 5096//5 5092//5\nf 5089//6 5092//6 5096//6\nf 5098//1 5099//1 5100//1\nf 5104//2 5103//2 5102//2\nf 5097//3 5101//3 5102//3\nf 5102//4 5103//4 5099//4\nf 5103//5 5104//5 5100//5\nf 5097//6 5100//6 5104//6\nf 5106//1 5107//1 5108//1\nf 5112//2 5111//2 5110//2\nf 5105//3 5109//3 5110//3\nf 5110//4 5111//4 5107//4\nf 5111//5 5112//5 5108//5\nf 5105//6 5108//6 5112//6\nf 5114//1 5115//1 5116//1\nf 5120//2 5119//2 5118//2\nf 5113//3 5117//3 5118//3\nf 5118//4 5119//4 5115//4\nf 5119//5 5120//5 5116//5\nf 5113//6 5116//6 5120//6\nf 5121//1 5122//1 5123//1\nf 5128//2 5127//2 5126//2\nf 5121//3 5125//3 5126//3\nf 5122//4 5126//4 5127//4\nf 5127//5 5128//5 5124//5\nf 5121//6 5124//6 5128//6\nf 5129//1 5130//1 5131//1\nf 5136//2 5135//2 5134//2\nf 5129//3 5133//3 5134//3\nf 5130//4 5134//4 5135//4\nf 5135//5 5136//5 5132//5\nf 5129//6 5132//6 5136//6\nf 5138//1 5139//1 5140//1\nf 5144//2 5143//2 5142//2\nf 5137//3 5141//3 5142//3\nf 5138//4 5142//4 5143//4\nf 5143//5 5144//5 5140//5\nf 5141//6 5137//6 5140//6\nf 5146//1 5147//1 5148//1\nf 5152//2 5151//2 5150//2\nf 5145//3 5149//3 5150//3\nf 5146//4 5150//4 5151//4\nf 5151//5 5152//5 5148//5\nf 5145//6 5148//6 5152//6\nf 5154//1 5155//1 5156//1\nf 5160//2 5159//2 5158//2\nf 5153//3 5157//3 5158//3\nf 5154//4 5158//4 5159//4\nf 5159//5 5160//5 5156//5\nf 5157//6 5153//6 5156//6\nf 5162//1 5163//1 5164//1\nf 5168//2 5167//2 5166//2\nf 5161//3 5165//3 5166//3\nf 5166//4 5167//4 5163//4\nf 5167//5 5168//5 5164//5\nf 5161//6 5164//6 5168//6\nf 5170//1 5171//1 5172//1\nf 5176//2 5175//2 5174//2\nf 5169//3 5173//3 5174//3\nf 5174//4 5175//4 5171//4\nf 5175//5 5176//5 5172//5\nf 5169//6 5172//6 5176//6\nf 5178//1 5179//1 5180//1\nf 5184//2 5183//2 5182//2\nf 5177//3 5181//3 5182//3\nf 5182//4 5183//4 5179//4\nf 5183//5 5184//5 5180//5\nf 5177//6 5180//6 5184//6\nf 5186//1 5187//1 5188//1\nf 5192//2 5191//2 5190//2\nf 5185//3 5189//3 5190//3\nf 5190//4 5191//4 5187//4\nf 5191//5 5192//5 5188//5\nf 5185//6 5188//6 5192//6\nf 5194//1 5195//1 5196//1\nf 5200//2 5199//2 5198//2\nf 5193//3 5197//3 5198//3\nf 5198//4 5199//4 5195//4\nf 5199//5 5200//5 5196//5\nf 5193//6 5196//6 5200//6\nf 5201//1 5202//1 5203//1\nf 5205//2 5208//2 5207//2\nf 5205//3 5206//3 5202//3\nf 5202//4 5206//4 5207//4\nf 5207//5 5208//5 5204//5\nf 5201//6 5204//6 5208//6\nf 5209//1 5210//1 5211//1\nf 5213//2 5216//2 5215//2\nf 5213//3 5214//3 5210//3\nf 5210//4 5214//4 5215//4\nf 5215//5 5216//5 5212//5\nf 5209//6 5212//6 5216//6\nf 5218//1 5219//1 5220//1\nf 5221//2 5224//2 5223//2\nf 5221//3 5222//3 5218//3\nf 5218//4 5222//4 5223//4\nf 5223//5 5224//5 5220//5\nf 5221//6 5217//6 5220//6\nf 5226//1 5227//1 5228//1\nf 5229//2 5232//2 5231//2\nf 5229//3 5230//3 5226//3\nf 5226//4 5230//4 5231//4\nf 5231//5 5232//5 5228//5\nf 5225//6 5228//6 5232//6\nf 5234//1 5235//1 5236//1\nf 5237//2 5240//2 5239//2\nf 5237//3 5238//3 5234//3\nf 5234//4 5238//4 5239//4\nf 5239//5 5240//5 5236//5\nf 5237//6 5233//6 5236//6\nf 5242//1 5243//1 5244//1\nf 5248//2 5247//2 5246//2\nf 5245//3 5246//3 5242//3\nf 5246//4 5247//4 5243//4\nf 5247//5 5248//5 5244//5\nf 5241//6 5244//6 5248//6\nf 5250//1 5251//1 5252//1\nf 5256//2 5255//2 5254//2\nf 5253//3 5254//3 5250//3\nf 5254//4 5255//4 5251//4\nf 5255//5 5256//5 5252//5\nf 5249//6 5252//6 5256//6\nf 5258//1 5259//1 5260//1\nf 5264//2 5263//2 5262//2\nf 5261//3 5262//3 5258//3\nf 5262//4 5263//4 5259//4\nf 5263//5 5264//5 5260//5\nf 5257//6 5260//6 5264//6\nf 5266//1 5267//1 5268//1\nf 5272//2 5271//2 5270//2\nf 5269//3 5270//3 5266//3\nf 5270//4 5271//4 5267//4\nf 5271//5 5272//5 5268//5\nf 5265//6 5268//6 5272//6\nf 5274//1 5275//1 5276//1\nf 5280//2 5279//2 5278//2\nf 5277//3 5278//3 5274//3\nf 5278//4 5279//4 5275//4\nf 5279//5 5280//5 5276//5\nf 5273//6 5276//6 5280//6\nf 5281//1 5282//1 5283//1\nf 5285//2 5288//2 5287//2\nf 5285//3 5286//3 5282//3\nf 5282//4 5286//4 5287//4\nf 5287//5 5288//5 5284//5\nf 5281//6 5284//6 5288//6\nf 5289//1 5290//1 5291//1\nf 5293//2 5296//2 5295//2\nf 5293//3 5294//3 5290//3\nf 5290//4 5294//4 5295//4\nf 5295//5 5296//5 5292//5\nf 5289//6 5292//6 5296//6\nf 5298//1 5299//1 5300//1\nf 5301//2 5304//2 5303//2\nf 5301//3 5302//3 5298//3\nf 5298//4 5302//4 5303//4\nf 5303//5 5304//5 5300//5\nf 5301//6 5297//6 5300//6\nf 5306//1 5307//1 5308//1\nf 5309//2 5312//2 5311//2\nf 5309//3 5310//3 5306//3\nf 5306//4 5310//4 5311//4\nf 5311//5 5312//5 5308//5\nf 5305//6 5308//6 5312//6\nf 5314//1 5315//1 5316//1\nf 5317//2 5320//2 5319//2\nf 5317//3 5318//3 5314//3\nf 5314//4 5318//4 5319//4\nf 5319//5 5320//5 5316//5\nf 5317//6 5313//6 5316//6\nf 5322//1 5323//1 5324//1\nf 5328//2 5327//2 5326//2\nf 5325//3 5326//3 5322//3\nf 5326//4 5327//4 5323//4\nf 5327//5 5328//5 5324//5\nf 5321//6 5324//6 5328//6\nf 5330//1 5331//1 5332//1\nf 5336//2 5335//2 5334//2\nf 5333//3 5334//3 5330//3\nf 5334//4 5335//4 5331//4\nf 5335//5 5336//5 5332//5\nf 5329//6 5332//6 5336//6\nf 5338//1 5339//1 5340//1\nf 5344//2 5343//2 5342//2\nf 5341//3 5342//3 5338//3\nf 5342//4 5343//4 5339//4\nf 5343//5 5344//5 5340//5\nf 5337//6 5340//6 5344//6\nf 5346//1 5347//1 5348//1\nf 5352//2 5351//2 5350//2\nf 5349//3 5350//3 5346//3\nf 5350//4 5351//4 5347//4\nf 5351//5 5352//5 5348//5\nf 5345//6 5348//6 5352//6\nf 5354//1 5355//1 5356//1\nf 5360//2 5359//2 5358//2\nf 5357//3 5358//3 5354//3\nf 5358//4 5359//4 5355//4\nf 5359//5 5360//5 5356//5\nf 5353//6 5356//6 5360//6\nf 5361//1 5362//1 5363//1\nf 5365//2 5368//2 5367//2\nf 5365//3 5366//3 5362//3\nf 5362//4 5366//4 5367//4\nf 5367//5 5368//5 5364//5\nf 5361//6 5364//6 5368//6\nf 5369//1 5370//1 5371//1\nf 5373//2 5376//2 5375//2\nf 5373//3 5374//3 5370//3\nf 5370//4 5374//4 5375//4\nf 5375//5 5376//5 5372//5\nf 5369//6 5372//6 5376//6\nf 5378//1 5379//1 5380//1\nf 5381//2 5384//2 5383//2\nf 5381//3 5382//3 5378//3\nf 5378//4 5382//4 5383//4\nf 5383//5 5384//5 5380//5\nf 5381//6 5377//6 5380//6\nf 5386//1 5387//1 5388//1\nf 5389//2 5392//2 5391//2\nf 5389//3 5390//3 5386//3\nf 5386//4 5390//4 5391//4\nf 5391//5 5392//5 5388//5\nf 5385//6 5388//6 5392//6\nf 5394//1 5395//1 5396//1\nf 5397//2 5400//2 5399//2\nf 5397//3 5398//3 5394//3\nf 5394//4 5398//4 5399//4\nf 5399//5 5400//5 5396//5\nf 5397//6 5393//6 5396//6\nf 5402//1 5403//1 5404//1\nf 5408//2 5407//2 5406//2\nf 5405//3 5406//3 5402//3\nf 5406//4 5407//4 5403//4\nf 5407//5 5408//5 5404//5\nf 5401//6 5404//6 5408//6\nf 5410//1 5411//1 5412//1\nf 5416//2 5415//2 5414//2\nf 5413//3 5414//3 5410//3\nf 5414//4 5415//4 5411//4\nf 5415//5 5416//5 5412//5\nf 5409//6 5412//6 5416//6\nf 5418//1 5419//1 5420//1\nf 5424//2 5423//2 5422//2\nf 5421//3 5422//3 5418//3\nf 5422//4 5423//4 5419//4\nf 5423//5 5424//5 5420//5\nf 5417//6 5420//6 5424//6\nf 5426//1 5427//1 5428//1\nf 5432//2 5431//2 5430//2\nf 5429//3 5430//3 5426//3\nf 5430//4 5431//4 5427//4\nf 5431//5 5432//5 5428//5\nf 5425//6 5428//6 5432//6\nf 5434//1 5435//1 5436//1\nf 5440//2 5439//2 5438//2\nf 5437//3 5438//3 5434//3\nf 5438//4 5439//4 5435//4\nf 5439//5 5440//5 5436//5\nf 5433//6 5436//6 5440//6\nf 5441//1 5442//1 5443//1\nf 5445//2 5448//2 5447//2\nf 5445//3 5446//3 5442//3\nf 5442//4 5446//4 5447//4\nf 5447//5 5448//5 5444//5\nf 5441//6 5444//6 5448//6\nf 5449//1 5450//1 5451//1\nf 5453//2 5456//2 5455//2\nf 5453//3 5454//3 5450//3\nf 5450//4 5454//4 5455//4\nf 5455//5 5456//5 5452//5\nf 5449//6 5452//6 5456//6\nf 5458//1 5459//1 5460//1\nf 5461//2 5464//2 5463//2\nf 5461//3 5462//3 5458//3\nf 5458//4 5462//4 5463//4\nf 5463//5 5464//5 5460//5\nf 5461//6 5457//6 5460//6\nf 5466//1 5467//1 5468//1\nf 5469//2 5472//2 5471//2\nf 5469//3 5470//3 5466//3\nf 5466//4 5470//4 5471//4\nf 5471//5 5472//5 5468//5\nf 5465//6 5468//6 5472//6\nf 5474//1 5475//1 5476//1\nf 5477//2 5480//2 5479//2\nf 5477//3 5478//3 5474//3\nf 5474//4 5478//4 5479//4\nf 5479//5 5480//5 5476//5\nf 5477//6 5473//6 5476//6\nf 5482//1 5483//1 5484//1\nf 5488//2 5487//2 5486//2\nf 5485//3 5486//3 5482//3\nf 5486//4 5487//4 5483//4\nf 5487//5 5488//5 5484//5\nf 5481//6 5484//6 5488//6\nf 5490//1 5491//1 5492//1\nf 5496//2 5495//2 5494//2\nf 5493//3 5494//3 5490//3\nf 5494//4 5495//4 5491//4\nf 5495//5 5496//5 5492//5\nf 5489//6 5492//6 5496//6\nf 5498//1 5499//1 5500//1\nf 5504//2 5503//2 5502//2\nf 5501//3 5502//3 5498//3\nf 5502//4 5503//4 5499//4\nf 5503//5 5504//5 5500//5\nf 5497//6 5500//6 5504//6\nf 5506//1 5507//1 5508//1\nf 5512//2 5511//2 5510//2\nf 5509//3 5510//3 5506//3\nf 5510//4 5511//4 5507//4\nf 5511//5 5512//5 5508//5\nf 5505//6 5508//6 5512//6\nf 5514//1 5515//1 5516//1\nf 5520//2 5519//2 5518//2\nf 5517//3 5518//3 5514//3\nf 5518//4 5519//4 5515//4\nf 5519//5 5520//5 5516//5\nf 5513//6 5516//6 5520//6\nf 5521//1 5522//1 5523//1\nf 5525//2 5528//2 5527//2\nf 5525//3 5526//3 5522//3\nf 5522//4 5526//4 5527//4\nf 5527//5 5528//5 5524//5\nf 5521//6 5524//6 5528//6\nf 5529//1 5530//1 5531//1\nf 5533//2 5536//2 5535//2\nf 5533//3 5534//3 5530//3\nf 5530//4 5534//4 5535//4\nf 5535//5 5536//5 5532//5\nf 5529//6 5532//6 5536//6\nf 5538//1 5539//1 5540//1\nf 5541//2 5544//2 5543//2\nf 5541//3 5542//3 5538//3\nf 5538//4 5542//4 5543//4\nf 5543//5 5544//5 5540//5\nf 5541//6 5537//6 5540//6\nf 5546//1 5547//1 5548//1\nf 5549//2 5552//2 5551//2\nf 5549//3 5550//3 5546//3\nf 5546//4 5550//4 5551//4\nf 5551//5 5552//5 5548//5\nf 5545//6 5548//6 5552//6\nf 5554//1 5555//1 5556//1\nf 5557//2 5560//2 5559//2\nf 5557//3 5558//3 5554//3\nf 5554//4 5558//4 5559//4\nf 5559//5 5560//5 5556//5\nf 5557//6 5553//6 5556//6\nf 5562//1 5563//1 5564//1\nf 5568//2 5567//2 5566//2\nf 5565//3 5566//3 5562//3\nf 5566//4 5567//4 5563//4\nf 5567//5 5568//5 5564//5\nf 5561//6 5564//6 5568//6\nf 5570//1 5571//1 5572//1\nf 5576//2 5575//2 5574//2\nf 5573//3 5574//3 5570//3\nf 5574//4 5575//4 5571//4\nf 5575//5 5576//5 5572//5\nf 5569//6 5572//6 5576//6\nf 5578//1 5579//1 5580//1\nf 5584//2 5583//2 5582//2\nf 5581//3 5582//3 5578//3\nf 5582//4 5583//4 5579//4\nf 5583//5 5584//5 5580//5\nf 5577//6 5580//6 5584//6\nf 5586//1 5587//1 5588//1\nf 5592//2 5591//2 5590//2\nf 5589//3 5590//3 5586//3\nf 5590//4 5591//4 5587//4\nf 5591//5 5592//5 5588//5\nf 5585//6 5588//6 5592//6\nf 5594//1 5595//1 5596//1\nf 5600//2 5599//2 5598//2\nf 5597//3 5598//3 5594//3\nf 5598//4 5599//4 5595//4\nf 5599//5 5600//5 5596//5\nf 5593//6 5596//6 5600//6\nf 5604//1 5603//1 5602//1\nf 5605//2 5606//2 5607//2\nf 5601//5 5602//5 5606//5\nf 5602//4 5603//4 5607//4\nf 5604//3 5608//3 5607//3\nf 5608//6 5604//6 5601//6\nf 5612//1 5611//1 5610//1\nf 5613//2 5614//2 5615//2\nf 5609//5 5610//5 5614//5\nf 5610//4 5611//4 5615//4\nf 5612//3 5616//3 5615//3\nf 5613//6 5616//6 5612//6\nf 5620//1 5619//1 5618//1\nf 5621//2 5622//2 5623//2\nf 5617//5 5618//5 5622//5\nf 5618//4 5619//4 5623//4\nf 5620//3 5624//3 5623//3\nf 5621//6 5624//6 5620//6\nf 5628//1 5627//1 5626//1\nf 5630//2 5631//2 5632//2\nf 5625//5 5626//5 5630//5\nf 5626//4 5627//4 5631//4\nf 5628//3 5632//3 5631//3\nf 5632//6 5628//6 5625//6\nf 5636//1 5635//1 5634//1\nf 5637//2 5638//2 5639//2\nf 5633//5 5634//5 5638//5\nf 5634//4 5635//4 5639//4\nf 5636//3 5640//3 5639//3\nf 5637//6 5640//6 5636//6\nf 5644//1 5643//1 5642//1\nf 5646//2 5647//2 5648//2\nf 5641//5 5642//5 5646//5\nf 5643//4 5647//4 5646//4\nf 5644//3 5648//3 5647//3\nf 5648//6 5644//6 5641//6\nf 5652//1 5651//1 5650//1\nf 5654//2 5655//2 5656//2\nf 5649//5 5650//5 5654//5\nf 5651//4 5655//4 5654//4\nf 5652//3 5656//3 5655//3\nf 5656//6 5652//6 5649//6\nf 5660//1 5659//1 5658//1\nf 5662//2 5663//2 5664//2\nf 5657//5 5658//5 5662//5\nf 5659//4 5663//4 5662//4\nf 5660//3 5664//3 5663//3\nf 5664//6 5660//6 5657//6\nf 5668//1 5667//1 5666//1\nf 5670//2 5671//2 5672//2\nf 5665//5 5666//5 5670//5\nf 5667//4 5671//4 5670//4\nf 5668//3 5672//3 5671//3\nf 5672//6 5668//6 5665//6\nf 5676//1 5675//1 5674//1\nf 5678//2 5679//2 5680//2\nf 5673//5 5674//5 5678//5\nf 5675//4 5679//4 5678//4\nf 5676//3 5680//3 5679//3\nf 5680//6 5676//6 5673//6\nf 5684//1 5683//1 5682//1\nf 5685//2 5686//2 5687//2\nf 5682//5 5686//5 5685//5\nf 5682//4 5683//4 5687//4\nf 5684//3 5688//3 5687//3\nf 5688//6 5684//6 5681//6\nf 5692//1 5691//1 5690//1\nf 5693//2 5694//2 5695//2\nf 5689//5 5690//5 5694//5\nf 5690//4 5691//4 5695//4\nf 5692//3 5696//3 5695//3\nf 5693//6 5696//6 5692//6\nf 5700//1 5699//1 5698//1\nf 5701//2 5702//2 5703//2\nf 5697//5 5698//5 5702//5\nf 5698//4 5699//4 5703//4\nf 5700//3 5704//3 5703//3\nf 5701//6 5704//6 5700//6\nf 5708//1 5707//1 5706//1\nf 5710//2 5711//2 5712//2\nf 5705//5 5706//5 5710//5\nf 5706//4 5707//4 5711//4\nf 5708//3 5712//3 5711//3\nf 5712//6 5708//6 5705//6\nf 5716//1 5715//1 5714//1\nf 5718//2 5719//2 5720//2\nf 5713//5 5714//5 5718//5\nf 5714//4 5715//4 5719//4\nf 5716//3 5720//3 5719//3\nf 5717//6 5720//6 5716//6\nf 5724//1 5723//1 5722//1\nf 5726//2 5727//2 5728//2\nf 5721//5 5722//5 5726//5\nf 5723//4 5727//4 5726//4\nf 5724//3 5728//3 5727//3\nf 5728//6 5724//6 5721//6\nf 5732//1 5731//1 5730//1\nf 5734//2 5735//2 5736//2\nf 5729//5 5730//5 5734//5\nf 5731//4 5735//4 5734//4\nf 5732//3 5736//3 5735//3\nf 5736//6 5732//6 5729//6\nf 5740//1 5739//1 5738//1\nf 5742//2 5743//2 5744//2\nf 5737//5 5738//5 5742//5\nf 5739//4 5743//4 5742//4\nf 5740//3 5744//3 5743//3\nf 5744//6 5740//6 5737//6\nf 5748//1 5747//1 5746//1\nf 5750//2 5751//2 5752//2\nf 5745//5 5746//5 5750//5\nf 5747//4 5751//4 5750//4\nf 5748//3 5752//3 5751//3\nf 5752//6 5748//6 5745//6\nf 5756//1 5755//1 5754//1\nf 5758//2 5759//2 5760//2\nf 5753//5 5754//5 5758//5\nf 5755//4 5759//4 5758//4\nf 5756//3 5760//3 5759//3\nf 5760//6 5756//6 5753//6\nf 5761//1 5764//1 5763//1\nf 5765//2 5766//2 5767//2\nf 5762//5 5766//5 5765//5\nf 5762//4 5763//4 5767//4\nf 5764//3 5768//3 5767//3\nf 5768//6 5764//6 5761//6\nf 5772//1 5771//1 5770//1\nf 5773//2 5774//2 5775//2\nf 5770//5 5774//5 5773//5\nf 5770//4 5771//4 5775//4\nf 5772//3 5776//3 5775//3\nf 5773//6 5776//6 5772//6\nf 5780//1 5779//1 5778//1\nf 5781//2 5782//2 5783//2\nf 5777//5 5778//5 5782//5\nf 5778//4 5779//4 5783//4\nf 5780//3 5784//3 5783//3\nf 5781//6 5784//6 5780//6\nf 5788//1 5787//1 5786//1\nf 5789//2 5790//2 5791//2\nf 5785//5 5786//5 5790//5\nf 5786//4 5787//4 5791//4\nf 5788//3 5792//3 5791//3\nf 5792//6 5788//6 5785//6\nf 5796//1 5795//1 5794//1\nf 5797//2 5798//2 5799//2\nf 5794//5 5798//5 5797//5\nf 5794//4 5795//4 5799//4\nf 5796//3 5800//3 5799//3\nf 5797//6 5800//6 5796//6\nf 5804//1 5803//1 5802//1\nf 5806//2 5807//2 5808//2\nf 5801//5 5802//5 5806//5\nf 5803//4 5807//4 5806//4\nf 5804//3 5808//3 5807//3\nf 5808//6 5804//6 5801//6\nf 5812//1 5811//1 5810//1\nf 5814//2 5815//2 5816//2\nf 5809//5 5810//5 5814//5\nf 5811//4 5815//4 5814//4\nf 5812//3 5816//3 5815//3\nf 5816//6 5812//6 5809//6\nf 5820//1 5819//1 5818//1\nf 5822//2 5823//2 5824//2\nf 5817//5 5818//5 5822//5\nf 5819//4 5823//4 5822//4\nf 5820//3 5824//3 5823//3\nf 5824//6 5820//6 5817//6\nf 5828//1 5827//1 5826//1\nf 5830//2 5831//2 5832//2\nf 5825//5 5826//5 5830//5\nf 5827//4 5831//4 5830//4\nf 5828//3 5832//3 5831//3\nf 5832//6 5828//6 5825//6\nf 5836//1 5835//1 5834//1\nf 5838//2 5839//2 5840//2\nf 5833//5 5834//5 5838//5\nf 5835//4 5839//4 5838//4\nf 5836//3 5840//3 5839//3\nf 5840//6 5836//6 5833//6\nf 5841//1 5844//1 5843//1\nf 5846//2 5847//2 5848//2\nf 5841//5 5842//5 5846//5\nf 5842//4 5843//4 5847//4\nf 5844//3 5848//3 5847//3\nf 5848//6 5844//6 5841//6\nf 5849//1 5852//1 5851//1\nf 5854//2 5855//2 5856//2\nf 5849//5 5850//5 5854//5\nf 5850//4 5851//4 5855//4\nf 5852//3 5856//3 5855//3\nf 5853//6 5856//6 5852//6\nf 5860//1 5859//1 5858//1\nf 5862//2 5863//2 5864//2\nf 5857//5 5858//5 5862//5\nf 5858//4 5859//4 5863//4\nf 5860//3 5864//3 5863//3\nf 5861//6 5864//6 5860//6\nf 5868//1 5867//1 5866//1\nf 5870//2 5871//2 5872//2\nf 5865//5 5866//5 5870//5\nf 5866//4 5867//4 5871//4\nf 5868//3 5872//3 5871//3\nf 5872//6 5868//6 5865//6\nf 5876//1 5875//1 5874//1\nf 5878//2 5879//2 5880//2\nf 5873//5 5874//5 5878//5\nf 5874//4 5875//4 5879//4\nf 5876//3 5880//3 5879//3\nf 5877//6 5880//6 5876//6\nf 5884//1 5883//1 5882//1\nf 5886//2 5887//2 5888//2\nf 5881//5 5882//5 5886//5\nf 5883//4 5887//4 5886//4\nf 5884//3 5888//3 5887//3\nf 5888//6 5884//6 5881//6\nf 5892//1 5891//1 5890//1\nf 5894//2 5895//2 5896//2\nf 5889//5 5890//5 5894//5\nf 5891//4 5895//4 5894//4\nf 5892//3 5896//3 5895//3\nf 5896//6 5892//6 5889//6\nf 5900//1 5899//1 5898//1\nf 5902//2 5903//2 5904//2\nf 5897//5 5898//5 5902//5\nf 5899//4 5903//4 5902//4\nf 5900//3 5904//3 5903//3\nf 5904//6 5900//6 5897//6\nf 5908//1 5907//1 5906//1\nf 5910//2 5911//2 5912//2\nf 5905//5 5906//5 5910//5\nf 5907//4 5911//4 5910//4\nf 5908//3 5912//3 5911//3\nf 5912//6 5908//6 5905//6\nf 5916//1 5915//1 5914//1\nf 5918//2 5919//2 5920//2\nf 5913//5 5914//5 5918//5\nf 5915//4 5919//4 5918//4\nf 5916//3 5920//3 5919//3\nf 5920//6 5916//6 5913//6\nf 5921//1 5924//1 5923//1\nf 5926//2 5927//2 5928//2\nf 5921//5 5922//5 5926//5\nf 5922//4 5923//4 5927//4\nf 5924//3 5928//3 5927//3\nf 5928//6 5924//6 5921//6\nf 5929//1 5932//1 5931//1\nf 5934//2 5935//2 5936//2\nf 5929//5 5930//5 5934//5\nf 5930//4 5931//4 5935//4\nf 5932//3 5936//3 5935//3\nf 5933//6 5936//6 5932//6\nf 5940//1 5939//1 5938//1\nf 5942//2 5943//2 5944//2\nf 5937//5 5938//5 5942//5\nf 5938//4 5939//4 5943//4\nf 5940//3 5944//3 5943//3\nf 5941//6 5944//6 5940//6\nf 5948//1 5947//1 5946//1\nf 5950//2 5951//2 5952//2\nf 5945//5 5946//5 5950//5\nf 5946//4 5947//4 5951//4\nf 5948//3 5952//3 5951//3\nf 5952//6 5948//6 5945//6\nf 5956//1 5955//1 5954//1\nf 5958//2 5959//2 5960//2\nf 5953//5 5954//5 5958//5\nf 5954//4 5955//4 5959//4\nf 5956//3 5960//3 5959//3\nf 5957//6 5960//6 5956//6\nf 5964//1 5963//1 5962//1\nf 5966//2 5967//2 5968//2\nf 5961//5 5962//5 5966//5\nf 5963//4 5967//4 5966//4\nf 5964//3 5968//3 5967//3\nf 5968//6 5964//6 5961//6\nf 5972//1 5971//1 5970//1\nf 5974//2 5975//2 5976//2\nf 5969//5 5970//5 5974//5\nf 5971//4 5975//4 5974//4\nf 5972//3 5976//3 5975//3\nf 5976//6 5972//6 5969//6\nf 5980//1 5979//1 5978//1\nf 5982//2 5983//2 5984//2\nf 5977//5 5978//5 5982//5\nf 5979//4 5983//4 5982//4\nf 5980//3 5984//3 5983//3\nf 5984//6 5980//6 5977//6\nf 5988//1 5987//1 5986//1\nf 5990//2 5991//2 5992//2\nf 5985//5 5986//5 5990//5\nf 5987//4 5991//4 5990//4\nf 5988//3 5992//3 5991//3\nf 5992//6 5988//6 5985//6\nf 5996//1 5995//1 5994//1\nf 5998//2 5999//2 6000//2\nf 5993//5 5994//5 5998//5\nf 5995//4 5999//4 5998//4\nf 5996//3 6000//3 5999//3\nf 6000//6 5996//6 5993//6\nf 6001//1 6004//1 6003//1\nf 6005//2 6006//2 6007//2\nf 6002//5 6006//5 6005//5\nf 6002//4 6003//4 6007//4\nf 6004//3 6008//3 6007//3\nf 6008//6 6004//6 6001//6\nf 6009//1 6012//1 6011//1\nf 6013//2 6014//2 6015//2\nf 6010//5 6014//5 6013//5\nf 6010//4 6011//4 6015//4\nf 6012//3 6016//3 6015//3\nf 6013//6 6016//6 6012//6\nf 6020//1 6019//1 6018//1\nf 6021//2 6022//2 6023//2\nf 6018//5 6022//5 6021//5\nf 6018//4 6019//4 6023//4\nf 6020//3 6024//3 6023//3\nf 6021//6 6024//6 6020//6\nf 6028//1 6027//1 6026//1\nf 6029//2 6030//2 6031//2\nf 6026//5 6030//5 6029//5\nf 6026//4 6027//4 6031//4\nf 6028//3 6032//3 6031//3\nf 6032//6 6028//6 6025//6\nf 6036//1 6035//1 6034//1\nf 6037//2 6038//2 6039//2\nf 6034//5 6038//5 6037//5\nf 6034//4 6035//4 6039//4\nf 6036//3 6040//3 6039//3\nf 6037//6 6040//6 6036//6\nf 6044//1 6043//1 6042//1\nf 6046//2 6047//2 6048//2\nf 6042//5 6046//5 6045//5\nf 6043//4 6047//4 6046//4\nf 6044//3 6048//3 6047//3\nf 6048//6 6044//6 6041//6\nf 6052//1 6051//1 6050//1\nf 6054//2 6055//2 6056//2\nf 6050//5 6054//5 6053//5\nf 6051//4 6055//4 6054//4\nf 6052//3 6056//3 6055//3\nf 6056//6 6052//6 6049//6\nf 6060//1 6059//1 6058//1\nf 6062//2 6063//2 6064//2\nf 6058//5 6062//5 6061//5\nf 6059//4 6063//4 6062//4\nf 6060//3 6064//3 6063//3\nf 6064//6 6060//6 6057//6\nf 6068//1 6067//1 6066//1\nf 6070//2 6071//2 6072//2\nf 6066//5 6070//5 6069//5\nf 6067//4 6071//4 6070//4\nf 6068//3 6072//3 6071//3\nf 6072//6 6068//6 6065//6\nf 6076//1 6075//1 6074//1\nf 6078//2 6079//2 6080//2\nf 6074//5 6078//5 6077//5\nf 6075//4 6079//4 6078//4\nf 6076//3 6080//3 6079//3\nf 6080//6 6076//6 6073//6\nf 6081//1 6084//1 6083//1\nf 6085//2 6086//2 6087//2\nf 6082//5 6086//5 6085//5\nf 6082//4 6083//4 6087//4\nf 6084//3 6088//3 6087//3\nf 6088//6 6084//6 6081//6\nf 6089//1 6092//1 6091//1\nf 6093//2 6094//2 6095//2\nf 6090//5 6094//5 6093//5\nf 6090//4 6091//4 6095//4\nf 6092//3 6096//3 6095//3\nf 6093//6 6096//6 6092//6\nf 6100//1 6099//1 6098//1\nf 6101//2 6102//2 6103//2\nf 6098//5 6102//5 6101//5\nf 6098//4 6099//4 6103//4\nf 6100//3 6104//3 6103//3\nf 6101//6 6104//6 6100//6\nf 6108//1 6107//1 6106//1\nf 6109//2 6110//2 6111//2\nf 6106//5 6110//5 6109//5\nf 6106//4 6107//4 6111//4\nf 6108//3 6112//3 6111//3\nf 6112//6 6108//6 6105//6\nf 6116//1 6115//1 6114//1\nf 6117//2 6118//2 6119//2\nf 6114//5 6118//5 6117//5\nf 6114//4 6115//4 6119//4\nf 6116//3 6120//3 6119//3\nf 6117//6 6120//6 6116//6\nf 6124//1 6123//1 6122//1\nf 6126//2 6127//2 6128//2\nf 6122//5 6126//5 6125//5\nf 6123//4 6127//4 6126//4\nf 6124//3 6128//3 6127//3\nf 6128//6 6124//6 6121//6\nf 6132//1 6131//1 6130//1\nf 6134//2 6135//2 6136//2\nf 6130//5 6134//5 6133//5\nf 6131//4 6135//4 6134//4\nf 6132//3 6136//3 6135//3\nf 6136//6 6132//6 6129//6\nf 6140//1 6139//1 6138//1\nf 6142//2 6143//2 6144//2\nf 6138//5 6142//5 6141//5\nf 6139//4 6143//4 6142//4\nf 6140//3 6144//3 6143//3\nf 6144//6 6140//6 6137//6\nf 6148//1 6147//1 6146//1\nf 6150//2 6151//2 6152//2\nf 6146//5 6150//5 6149//5\nf 6147//4 6151//4 6150//4\nf 6148//3 6152//3 6151//3\nf 6152//6 6148//6 6145//6\nf 6156//1 6155//1 6154//1\nf 6158//2 6159//2 6160//2\nf 6154//5 6158//5 6157//5\nf 6155//4 6159//4 6158//4\nf 6156//3 6160//3 6159//3\nf 6160//6 6156//6 6153//6\nf 6161//1 6164//1 6163//1\nf 6165//2 6166//2 6167//2\nf 6162//5 6166//5 6165//5\nf 6162//4 6163//4 6167//4\nf 6164//3 6168//3 6167//3\nf 6168//6 6164//6 6161//6\nf 6169//1 6172//1 6171//1\nf 6173//2 6174//2 6175//2\nf 6170//5 6174//5 6173//5\nf 6170//4 6171//4 6175//4\nf 6172//3 6176//3 6175//3\nf 6173//6 6176//6 6172//6\nf 6180//1 6179//1 6178//1\nf 6181//2 6182//2 6183//2\nf 6178//5 6182//5 6181//5\nf 6178//4 6179//4 6183//4\nf 6180//3 6184//3 6183//3\nf 6181//6 6184//6 6180//6\nf 6188//1 6187//1 6186//1\nf 6189//2 6190//2 6191//2\nf 6186//5 6190//5 6189//5\nf 6186//4 6187//4 6191//4\nf 6188//3 6192//3 6191//3\nf 6192//6 6188//6 6185//6\nf 6196//1 6195//1 6194//1\nf 6197//2 6198//2 6199//2\nf 6194//5 6198//5 6197//5\nf 6194//4 6195//4 6199//4\nf 6196//3 6200//3 6199//3\nf 6197//6 6200//6 6196//6\nf 6204//1 6203//1 6202//1\nf 6206//2 6207//2 6208//2\nf 6202//5 6206//5 6205//5\nf 6203//4 6207//4 6206//4\nf 6204//3 6208//3 6207//3\nf 6208//6 6204//6 6201//6\nf 6212//1 6211//1 6210//1\nf 6214//2 6215//2 6216//2\nf 6210//5 6214//5 6213//5\nf 6211//4 6215//4 6214//4\nf 6212//3 6216//3 6215//3\nf 6216//6 6212//6 6209//6\nf 6220//1 6219//1 6218//1\nf 6222//2 6223//2 6224//2\nf 6218//5 6222//5 6221//5\nf 6219//4 6223//4 6222//4\nf 6220//3 6224//3 6223//3\nf 6224//6 6220//6 6217//6\nf 6228//1 6227//1 6226//1\nf 6230//2 6231//2 6232//2\nf 6226//5 6230//5 6229//5\nf 6227//4 6231//4 6230//4\nf 6228//3 6232//3 6231//3\nf 6232//6 6228//6 6225//6\nf 6236//1 6235//1 6234//1\nf 6238//2 6239//2 6240//2\nf 6234//5 6238//5 6237//5\nf 6235//4 6239//4 6238//4\nf 6236//3 6240//3 6239//3\nf 6240//6 6236//6 6233//6\nf 6241//1 6244//1 6243//1\nf 6245//2 6246//2 6247//2\nf 6242//5 6246//5 6245//5\nf 6242//4 6243//4 6247//4\nf 6244//3 6248//3 6247//3\nf 6248//6 6244//6 6241//6\nf 6249//1 6252//1 6251//1\nf 6253//2 6254//2 6255//2\nf 6250//5 6254//5 6253//5\nf 6250//4 6251//4 6255//4\nf 6252//3 6256//3 6255//3\nf 6253//6 6256//6 6252//6\nf 6260//1 6259//1 6258//1\nf 6261//2 6262//2 6263//2\nf 6258//5 6262//5 6261//5\nf 6258//4 6259//4 6263//4\nf 6260//3 6264//3 6263//3\nf 6261//6 6264//6 6260//6\nf 6268//1 6267//1 6266//1\nf 6269//2 6270//2 6271//2\nf 6266//5 6270//5 6269//5\nf 6266//4 6267//4 6271//4\nf 6268//3 6272//3 6271//3\nf 6272//6 6268//6 6265//6\nf 6276//1 6275//1 6274//1\nf 6277//2 6278//2 6279//2\nf 6274//5 6278//5 6277//5\nf 6274//4 6275//4 6279//4\nf 6276//3 6280//3 6279//3\nf 6277//6 6280//6 6276//6\nf 6284//1 6283//1 6282//1\nf 6286//2 6287//2 6288//2\nf 6282//5 6286//5 6285//5\nf 6283//4 6287//4 6286//4\nf 6284//3 6288//3 6287//3\nf 6288//6 6284//6 6281//6\nf 6292//1 6291//1 6290//1\nf 6294//2 6295//2 6296//2\nf 6290//5 6294//5 6293//5\nf 6291//4 6295//4 6294//4\nf 6292//3 6296//3 6295//3\nf 6296//6 6292//6 6289//6\nf 6300//1 6299//1 6298//1\nf 6302//2 6303//2 6304//2\nf 6298//5 6302//5 6301//5\nf 6299//4 6303//4 6302//4\nf 6300//3 6304//3 6303//3\nf 6304//6 6300//6 6297//6\nf 6308//1 6307//1 6306//1\nf 6310//2 6311//2 6312//2\nf 6306//5 6310//5 6309//5\nf 6307//4 6311//4 6310//4\nf 6308//3 6312//3 6311//3\nf 6312//6 6308//6 6305//6\nf 6316//1 6315//1 6314//1\nf 6318//2 6319//2 6320//2\nf 6314//5 6318//5 6317//5\nf 6315//4 6319//4 6318//4\nf 6316//3 6320//3 6319//3\nf 6320//6 6316//6 6313//6\nf 6321//1 6324//1 6323//1\nf 6325//2 6326//2 6327//2\nf 6322//5 6326//5 6325//5\nf 6322//4 6323//4 6327//4\nf 6324//3 6328//3 6327//3\nf 6328//6 6324//6 6321//6\nf 6329//1 6332//1 6331//1\nf 6333//2 6334//2 6335//2\nf 6330//5 6334//5 6333//5\nf 6330//4 6331//4 6335//4\nf 6332//3 6336//3 6335//3\nf 6333//6 6336//6 6332//6\nf 6340//1 6339//1 6338//1\nf 6341//2 6342//2 6343//2\nf 6338//5 6342//5 6341//5\nf 6338//4 6339//4 6343//4\nf 6340//3 6344//3 6343//3\nf 6341//6 6344//6 6340//6\nf 6348//1 6347//1 6346//1\nf 6349//2 6350//2 6351//2\nf 6346//5 6350//5 6349//5\nf 6346//4 6347//4 6351//4\nf 6348//3 6352//3 6351//3\nf 6352//6 6348//6 6345//6\nf 6356//1 6355//1 6354//1\nf 6357//2 6358//2 6359//2\nf 6354//5 6358//5 6357//5\nf 6354//4 6355//4 6359//4\nf 6356//3 6360//3 6359//3\nf 6357//6 6360//6 6356//6\nf 6364//1 6363//1 6362//1\nf 6366//2 6367//2 6368//2\nf 6362//5 6366//5 6365//5\nf 6363//4 6367//4 6366//4\nf 6364//3 6368//3 6367//3\nf 6368//6 6364//6 6361//6\nf 6372//1 6371//1 6370//1\nf 6374//2 6375//2 6376//2\nf 6370//5 6374//5 6373//5\nf 6371//4 6375//4 6374//4\nf 6372//3 6376//3 6375//3\nf 6376//6 6372//6 6369//6\nf 6380//1 6379//1 6378//1\nf 6382//2 6383//2 6384//2\nf 6378//5 6382//5 6381//5\nf 6379//4 6383//4 6382//4\nf 6380//3 6384//3 6383//3\nf 6384//6 6380//6 6377//6\nf 6388//1 6387//1 6386//1\nf 6390//2 6391//2 6392//2\nf 6386//5 6390//5 6389//5\nf 6387//4 6391//4 6390//4\nf 6388//3 6392//3 6391//3\nf 6392//6 6388//6 6385//6\nf 6396//1 6395//1 6394//1\nf 6398//2 6399//2 6400//2\nf 6394//5 6398//5 6397//5\nf 6395//4 6399//4 6398//4\nf 6396//3 6400//3 6399//3\nf 6400//6 6396//6 6393//6\nf 6402//1 6403//1 6404//1\nf 6408//2 6407//2 6406//2\nf 6401//3 6405//3 6406//3\nf 6402//4 6406//4 6407//4\nf 6407//5 6408//5 6404//5\nf 6401//6 6404//6 6408//6\nf 6410//1 6411//1 6412//1\nf 6413//2 6416//2 6415//2\nf 6409//3 6413//3 6414//3\nf 6410//4 6414//4 6415//4\nf 6415//5 6416//5 6412//5\nf 6409//6 6412//6 6416//6\nf 6418//1 6419//1 6420//1\nf 6424//2 6423//2 6422//2\nf 6417//3 6421//3 6422//3\nf 6418//4 6422//4 6423//4\nf 6423//5 6424//5 6420//5\nf 6421//6 6417//6 6420//6\nf 6426//1 6427//1 6428//1\nf 6432//2 6431//2 6430//2\nf 6425//3 6429//3 6430//3\nf 6426//4 6430//4 6431//4\nf 6431//5 6432//5 6428//5\nf 6425//6 6428//6 6432//6\nf 6434//1 6435//1 6436//1\nf 6437//2 6440//2 6439//2\nf 6433//3 6437//3 6438//3\nf 6434//4 6438//4 6439//4\nf 6439//5 6440//5 6436//5\nf 6437//6 6433//6 6436//6\nf 6442//1 6443//1 6444//1\nf 6448//2 6447//2 6446//2\nf 6441//3 6445//3 6446//3\nf 6446//4 6447//4 6443//4\nf 6447//5 6448//5 6444//5\nf 6441//6 6444//6 6448//6\nf 6450//1 6451//1 6452//1\nf 6456//2 6455//2 6454//2\nf 6449//3 6453//3 6454//3\nf 6454//4 6455//4 6451//4\nf 6455//5 6456//5 6452//5\nf 6449//6 6452//6 6456//6\nf 6458//1 6459//1 6460//1\nf 6464//2 6463//2 6462//2\nf 6457//3 6461//3 6462//3\nf 6462//4 6463//4 6459//4\nf 6463//5 6464//5 6460//5\nf 6457//6 6460//6 6464//6\nf 6466//1 6467//1 6468//1\nf 6472//2 6471//2 6470//2\nf 6465//3 6469//3 6470//3\nf 6470//4 6471//4 6467//4\nf 6471//5 6472//5 6468//5\nf 6465//6 6468//6 6472//6\nf 6474//1 6475//1 6476//1\nf 6480//2 6479//2 6478//2\nf 6473//3 6477//3 6478//3\nf 6478//4 6479//4 6475//4\nf 6479//5 6480//5 6476//5\nf 6473//6 6476//6 6480//6\nf 6482//1 6483//1 6484//1\nf 6488//2 6487//2 6486//2\nf 6485//3 6486//3 6482//3\nf 6482//4 6486//4 6487//4\nf 6487//5 6488//5 6484//5\nf 6481//6 6484//6 6488//6\nf 6490//1 6491//1 6492//1\nf 6493//2 6496//2 6495//2\nf 6489//3 6493//3 6494//3\nf 6490//4 6494//4 6495//4\nf 6495//5 6496//5 6492//5\nf 6489//6 6492//6 6496//6\nf 6498//1 6499//1 6500//1\nf 6504//2 6503//2 6502//2\nf 6497//3 6501//3 6502//3\nf 6498//4 6502//4 6503//4\nf 6503//5 6504//5 6500//5\nf 6501//6 6497//6 6500//6\nf 6506//1 6507//1 6508//1\nf 6512//2 6511//2 6510//2\nf 6505//3 6509//3 6510//3\nf 6506//4 6510//4 6511//4\nf 6511//5 6512//5 6508//5\nf 6505//6 6508//6 6512//6\nf 6514//1 6515//1 6516//1\nf 6517//2 6520//2 6519//2\nf 6513//3 6517//3 6518//3\nf 6514//4 6518//4 6519//4\nf 6519//5 6520//5 6516//5\nf 6517//6 6513//6 6516//6\nf 6522//1 6523//1 6524//1\nf 6528//2 6527//2 6526//2\nf 6521//3 6525//3 6526//3\nf 6526//4 6527//4 6523//4\nf 6527//5 6528//5 6524//5\nf 6521//6 6524//6 6528//6\nf 6530//1 6531//1 6532//1\nf 6536//2 6535//2 6534//2\nf 6529//3 6533//3 6534//3\nf 6534//4 6535//4 6531//4\nf 6535//5 6536//5 6532//5\nf 6529//6 6532//6 6536//6\nf 6538//1 6539//1 6540//1\nf 6544//2 6543//2 6542//2\nf 6537//3 6541//3 6542//3\nf 6542//4 6543//4 6539//4\nf 6543//5 6544//5 6540//5\nf 6537//6 6540//6 6544//6\nf 6546//1 6547//1 6548//1\nf 6552//2 6551//2 6550//2\nf 6545//3 6549//3 6550//3\nf 6550//4 6551//4 6547//4\nf 6551//5 6552//5 6548//5\nf 6545//6 6548//6 6552//6\nf 6554//1 6555//1 6556//1\nf 6560//2 6559//2 6558//2\nf 6553//3 6557//3 6558//3\nf 6558//4 6559//4 6555//4\nf 6559//5 6560//5 6556//5\nf 6553//6 6556//6 6560//6\nf 6562//1 6563//1 6564//1\nf 6565//2 6568//2 6567//2\nf 6565//3 6566//3 6562//3\nf 6562//4 6566//4 6567//4\nf 6567//5 6568//5 6564//5\nf 6561//6 6564//6 6568//6\nf 6570//1 6571//1 6572//1\nf 6573//2 6576//2 6575//2\nf 6573//3 6574//3 6570//3\nf 6570//4 6574//4 6575//4\nf 6575//5 6576//5 6572//5\nf 6569//6 6572//6 6576//6\nf 6578//1 6579//1 6580//1\nf 6581//2 6584//2 6583//2\nf 6577//3 6581//3 6582//3\nf 6578//4 6582//4 6583//4\nf 6583//5 6584//5 6580//5\nf 6581//6 6577//6 6580//6\nf 6586//1 6587//1 6588//1\nf 6589//2 6592//2 6591//2\nf 6585//3 6589//3 6590//3\nf 6586//4 6590//4 6591//4\nf 6591//5 6592//5 6588//5\nf 6585//6 6588//6 6592//6\nf 6594//1 6595//1 6596//1\nf 6597//2 6600//2 6599//2\nf 6597//3 6598//3 6594//3\nf 6594//4 6598//4 6599//4\nf 6599//5 6600//5 6596//5\nf 6597//6 6593//6 6596//6\nf 6602//1 6603//1 6604//1\nf 6608//2 6607//2 6606//2\nf 6601//3 6605//3 6606//3\nf 6606//4 6607//4 6603//4\nf 6607//5 6608//5 6604//5\nf 6601//6 6604//6 6608//6\nf 6610//1 6611//1 6612//1\nf 6616//2 6615//2 6614//2\nf 6609//3 6613//3 6614//3\nf 6614//4 6615//4 6611//4\nf 6615//5 6616//5 6612//5\nf 6609//6 6612//6 6616//6\nf 6618//1 6619//1 6620//1\nf 6624//2 6623//2 6622//2\nf 6617//3 6621//3 6622//3\nf 6622//4 6623//4 6619//4\nf 6623//5 6624//5 6620//5\nf 6617//6 6620//6 6624//6\nf 6626//1 6627//1 6628//1\nf 6632//2 6631//2 6630//2\nf 6625//3 6629//3 6630//3\nf 6630//4 6631//4 6627//4\nf 6631//5 6632//5 6628//5\nf 6625//6 6628//6 6632//6\nf 6634//1 6635//1 6636//1\nf 6640//2 6639//2 6638//2\nf 6633//3 6637//3 6638//3\nf 6638//4 6639//4 6635//4\nf 6639//5 6640//5 6636//5\nf 6633//6 6636//6 6640//6\nf 6641//1 6642//1 6643//1\nf 6648//2 6647//2 6646//2\nf 6641//3 6645//3 6646//3\nf 6642//4 6646//4 6647//4\nf 6647//5 6648//5 6644//5\nf 6641//6 6644//6 6648//6\nf 6649//1 6650//1 6651//1\nf 6656//2 6655//2 6654//2\nf 6649//3 6653//3 6654//3\nf 6650//4 6654//4 6655//4\nf 6655//5 6656//5 6652//5\nf 6649//6 6652//6 6656//6\nf 6658//1 6659//1 6660//1\nf 6664//2 6663//2 6662//2\nf 6657//3 6661//3 6662//3\nf 6658//4 6662//4 6663//4\nf 6663//5 6664//5 6660//5\nf 6661//6 6657//6 6660//6\nf 6666//1 6667//1 6668//1\nf 6672//2 6671//2 6670//2\nf 6665//3 6669//3 6670//3\nf 6666//4 6670//4 6671//4\nf 6671//5 6672//5 6668//5\nf 6665//6 6668//6 6672//6\nf 6674//1 6675//1 6676//1\nf 6680//2 6679//2 6678//2\nf 6673//3 6677//3 6678//3\nf 6674//4 6678//4 6679//4\nf 6679//5 6680//5 6676//5\nf 6677//6 6673//6 6676//6\nf 6682//1 6683//1 6684//1\nf 6688//2 6687//2 6686//2\nf 6681//3 6685//3 6686//3\nf 6686//4 6687//4 6683//4\nf 6687//5 6688//5 6684//5\nf 6681//6 6684//6 6688//6\nf 6690//1 6691//1 6692//1\nf 6696//2 6695//2 6694//2\nf 6689//3 6693//3 6694//3\nf 6694//4 6695//4 6691//4\nf 6695//5 6696//5 6692//5\nf 6689//6 6692//6 6696//6\nf 6698//1 6699//1 6700//1\nf 6704//2 6703//2 6702//2\nf 6697//3 6701//3 6702//3\nf 6702//4 6703//4 6699//4\nf 6703//5 6704//5 6700//5\nf 6697//6 6700//6 6704//6\nf 6706//1 6707//1 6708//1\nf 6712//2 6711//2 6710//2\nf 6705//3 6709//3 6710//3\nf 6710//4 6711//4 6707//4\nf 6711//5 6712//5 6708//5\nf 6705//6 6708//6 6712//6\nf 6714//1 6715//1 6716//1\nf 6720//2 6719//2 6718//2\nf 6713//3 6717//3 6718//3\nf 6718//4 6719//4 6715//4\nf 6719//5 6720//5 6716//5\nf 6713//6 6716//6 6720//6\nf 6721//1 6722//1 6723//1\nf 6728//2 6727//2 6726//2\nf 6721//3 6725//3 6726//3\nf 6722//4 6726//4 6727//4\nf 6727//5 6728//5 6724//5\nf 6721//6 6724//6 6728//6\nf 6729//1 6730//1 6731//1\nf 6736//2 6735//2 6734//2\nf 6729//3 6733//3 6734//3\nf 6730//4 6734//4 6735//4\nf 6735//5 6736//5 6732//5\nf 6729//6 6732//6 6736//6\nf 6738//1 6739//1 6740//1\nf 6744//2 6743//2 6742//2\nf 6737//3 6741//3 6742//3\nf 6738//4 6742//4 6743//4\nf 6743//5 6744//5 6740//5\nf 6741//6 6737//6 6740//6\nf 6746//1 6747//1 6748//1\nf 6752//2 6751//2 6750//2\nf 6745//3 6749//3 6750//3\nf 6746//4 6750//4 6751//4\nf 6751//5 6752//5 6748//5\nf 6745//6 6748//6 6752//6\nf 6754//1 6755//1 6756//1\nf 6760//2 6759//2 6758//2\nf 6753//3 6757//3 6758//3\nf 6754//4 6758//4 6759//4\nf 6759//5 6760//5 6756//5\nf 6757//6 6753//6 6756//6\nf 6762//1 6763//1 6764//1\nf 6768//2 6767//2 6766//2\nf 6761//3 6765//3 6766//3\nf 6766//4 6767//4 6763//4\nf 6767//5 6768//5 6764//5\nf 6761//6 6764//6 6768//6\nf 6770//1 6771//1 6772//1\nf 6776//2 6775//2 6774//2\nf 6769//3 6773//3 6774//3\nf 6774//4 6775//4 6771//4\nf 6775//5 6776//5 6772//5\nf 6769//6 6772//6 6776//6\nf 6778//1 6779//1 6780//1\nf 6784//2 6783//2 6782//2\nf 6777//3 6781//3 6782//3\nf 6782//4 6783//4 6779//4\nf 6783//5 6784//5 6780//5\nf 6777//6 6780//6 6784//6\nf 6786//1 6787//1 6788//1\nf 6792//2 6791//2 6790//2\nf 6785//3 6789//3 6790//3\nf 6790//4 6791//4 6787//4\nf 6791//5 6792//5 6788//5\nf 6785//6 6788//6 6792//6\nf 6794//1 6795//1 6796//1\nf 6800//2 6799//2 6798//2\nf 6793//3 6797//3 6798//3\nf 6798//4 6799//4 6795//4\nf 6799//5 6800//5 6796//5\nf 6793//6 6796//6 6800//6\nf 6801//1 6802//1 6803//1\nf 6805//2 6808//2 6807//2\nf 6805//3 6806//3 6802//3\nf 6802//4 6806//4 6807//4\nf 6807//5 6808//5 6804//5\nf 6801//6 6804//6 6808//6\nf 6809//1 6810//1 6811//1\nf 6813//2 6816//2 6815//2\nf 6813//3 6814//3 6810//3\nf 6810//4 6814//4 6815//4\nf 6815//5 6816//5 6812//5\nf 6809//6 6812//6 6816//6\nf 6818//1 6819//1 6820//1\nf 6821//2 6824//2 6823//2\nf 6821//3 6822//3 6818//3\nf 6818//4 6822//4 6823//4\nf 6823//5 6824//5 6820//5\nf 6821//6 6817//6 6820//6\nf 6826//1 6827//1 6828//1\nf 6829//2 6832//2 6831//2\nf 6829//3 6830//3 6826//3\nf 6826//4 6830//4 6831//4\nf 6831//5 6832//5 6828//5\nf 6825//6 6828//6 6832//6\nf 6834//1 6835//1 6836//1\nf 6837//2 6840//2 6839//2\nf 6837//3 6838//3 6834//3\nf 6834//4 6838//4 6839//4\nf 6839//5 6840//5 6836//5\nf 6837//6 6833//6 6836//6\nf 6842//1 6843//1 6844//1\nf 6848//2 6847//2 6846//2\nf 6845//3 6846//3 6842//3\nf 6846//4 6847//4 6843//4\nf 6847//5 6848//5 6844//5\nf 6841//6 6844//6 6848//6\nf 6850//1 6851//1 6852//1\nf 6856//2 6855//2 6854//2\nf 6853//3 6854//3 6850//3\nf 6854//4 6855//4 6851//4\nf 6855//5 6856//5 6852//5\nf 6849//6 6852//6 6856//6\nf 6858//1 6859//1 6860//1\nf 6864//2 6863//2 6862//2\nf 6861//3 6862//3 6858//3\nf 6862//4 6863//4 6859//4\nf 6863//5 6864//5 6860//5\nf 6857//6 6860//6 6864//6\nf 6866//1 6867//1 6868//1\nf 6872//2 6871//2 6870//2\nf 6869//3 6870//3 6866//3\nf 6870//4 6871//4 6867//4\nf 6871//5 6872//5 6868//5\nf 6865//6 6868//6 6872//6\nf 6874//1 6875//1 6876//1\nf 6880//2 6879//2 6878//2\nf 6877//3 6878//3 6874//3\nf 6878//4 6879//4 6875//4\nf 6879//5 6880//5 6876//5\nf 6873//6 6876//6 6880//6\nf 6881//1 6882//1 6883//1\nf 6885//2 6888//2 6887//2\nf 6885//3 6886//3 6882//3\nf 6882//4 6886//4 6887//4\nf 6887//5 6888//5 6884//5\nf 6881//6 6884//6 6888//6\nf 6889//1 6890//1 6891//1\nf 6893//2 6896//2 6895//2\nf 6893//3 6894//3 6890//3\nf 6890//4 6894//4 6895//4\nf 6895//5 6896//5 6892//5\nf 6889//6 6892//6 6896//6\nf 6898//1 6899//1 6900//1\nf 6901//2 6904//2 6903//2\nf 6901//3 6902//3 6898//3\nf 6898//4 6902//4 6903//4\nf 6903//5 6904//5 6900//5\nf 6901//6 6897//6 6900//6\nf 6906//1 6907//1 6908//1\nf 6909//2 6912//2 6911//2\nf 6909//3 6910//3 6906//3\nf 6906//4 6910//4 6911//4\nf 6911//5 6912//5 6908//5\nf 6905//6 6908//6 6912//6\nf 6914//1 6915//1 6916//1\nf 6917//2 6920//2 6919//2\nf 6917//3 6918//3 6914//3\nf 6914//4 6918//4 6919//4\nf 6919//5 6920//5 6916//5\nf 6917//6 6913//6 6916//6\nf 6922//1 6923//1 6924//1\nf 6928//2 6927//2 6926//2\nf 6925//3 6926//3 6922//3\nf 6926//4 6927//4 6923//4\nf 6927//5 6928//5 6924//5\nf 6921//6 6924//6 6928//6\nf 6930//1 6931//1 6932//1\nf 6936//2 6935//2 6934//2\nf 6933//3 6934//3 6930//3\nf 6934//4 6935//4 6931//4\nf 6935//5 6936//5 6932//5\nf 6929//6 6932//6 6936//6\nf 6938//1 6939//1 6940//1\nf 6944//2 6943//2 6942//2\nf 6941//3 6942//3 6938//3\nf 6942//4 6943//4 6939//4\nf 6943//5 6944//5 6940//5\nf 6937//6 6940//6 6944//6\nf 6946//1 6947//1 6948//1\nf 6952//2 6951//2 6950//2\nf 6949//3 6950//3 6946//3\nf 6950//4 6951//4 6947//4\nf 6951//5 6952//5 6948//5\nf 6945//6 6948//6 6952//6\nf 6954//1 6955//1 6956//1\nf 6960//2 6959//2 6958//2\nf 6957//3 6958//3 6954//3\nf 6958//4 6959//4 6955//4\nf 6959//5 6960//5 6956//5\nf 6953//6 6956//6 6960//6\nf 6961//1 6962//1 6963//1\nf 6965//2 6968//2 6967//2\nf 6965//3 6966//3 6962//3\nf 6962//4 6966//4 6967//4\nf 6967//5 6968//5 6964//5\nf 6961//6 6964//6 6968//6\nf 6969//1 6970//1 6971//1\nf 6973//2 6976//2 6975//2\nf 6973//3 6974//3 6970//3\nf 6970//4 6974//4 6975//4\nf 6975//5 6976//5 6972//5\nf 6969//6 6972//6 6976//6\nf 6978//1 6979//1 6980//1\nf 6981//2 6984//2 6983//2\nf 6981//3 6982//3 6978//3\nf 6978//4 6982//4 6983//4\nf 6983//5 6984//5 6980//5\nf 6981//6 6977//6 6980//6\nf 6986//1 6987//1 6988//1\nf 6989//2 6992//2 6991//2\nf 6989//3 6990//3 6986//3\nf 6986//4 6990//4 6991//4\nf 6991//5 6992//5 6988//5\nf 6985//6 6988//6 6992//6\nf 6994//1 6995//1 6996//1\nf 6997//2 7000//2 6999//2\nf 6997//3 6998//3 6994//3\nf 6994//4 6998//4 6999//4\nf 6999//5 7000//5 6996//5\nf 6997//6 6993//6 6996//6\nf 7002//1 7003//1 7004//1\nf 7008//2 7007//2 7006//2\nf 7005//3 7006//3 7002//3\nf 7006//4 7007//4 7003//4\nf 7007//5 7008//5 7004//5\nf 7001//6 7004//6 7008//6\nf 7010//1 7011//1 7012//1\nf 7016//2 7015//2 7014//2\nf 7013//3 7014//3 7010//3\nf 7014//4 7015//4 7011//4\nf 7015//5 7016//5 7012//5\nf 7009//6 7012//6 7016//6\nf 7018//1 7019//1 7020//1\nf 7024//2 7023//2 7022//2\nf 7021//3 7022//3 7018//3\nf 7022//4 7023//4 7019//4\nf 7023//5 7024//5 7020//5\nf 7017//6 7020//6 7024//6\nf 7026//1 7027//1 7028//1\nf 7032//2 7031//2 7030//2\nf 7029//3 7030//3 7026//3\nf 7030//4 7031//4 7027//4\nf 7031//5 7032//5 7028//5\nf 7025//6 7028//6 7032//6\nf 7034//1 7035//1 7036//1\nf 7040//2 7039//2 7038//2\nf 7037//3 7038//3 7034//3\nf 7038//4 7039//4 7035//4\nf 7039//5 7040//5 7036//5\nf 7033//6 7036//6 7040//6\nf 7041//1 7042//1 7043//1\nf 7045//2 7048//2 7047//2\nf 7045//3 7046//3 7042//3\nf 7042//4 7046//4 7047//4\nf 7047//5 7048//5 7044//5\nf 7041//6 7044//6 7048//6\nf 7049//1 7050//1 7051//1\nf 7053//2 7056//2 7055//2\nf 7053//3 7054//3 7050//3\nf 7050//4 7054//4 7055//4\nf 7055//5 7056//5 7052//5\nf 7049//6 7052//6 7056//6\nf 7058//1 7059//1 7060//1\nf 7061//2 7064//2 7063//2\nf 7061//3 7062//3 7058//3\nf 7058//4 7062//4 7063//4\nf 7063//5 7064//5 7060//5\nf 7061//6 7057//6 7060//6\nf 7066//1 7067//1 7068//1\nf 7069//2 7072//2 7071//2\nf 7069//3 7070//3 7066//3\nf 7066//4 7070//4 7071//4\nf 7071//5 7072//5 7068//5\nf 7065//6 7068//6 7072//6\nf 7074//1 7075//1 7076//1\nf 7077//2 7080//2 7079//2\nf 7077//3 7078//3 7074//3\nf 7074//4 7078//4 7079//4\nf 7079//5 7080//5 7076//5\nf 7077//6 7073//6 7076//6\nf 7082//1 7083//1 7084//1\nf 7088//2 7087//2 7086//2\nf 7085//3 7086//3 7082//3\nf 7086//4 7087//4 7083//4\nf 7087//5 7088//5 7084//5\nf 7081//6 7084//6 7088//6\nf 7090//1 7091//1 7092//1\nf 7096//2 7095//2 7094//2\nf 7093//3 7094//3 7090//3\nf 7094//4 7095//4 7091//4\nf 7095//5 7096//5 7092//5\nf 7089//6 7092//6 7096//6\nf 7098//1 7099//1 7100//1\nf 7104//2 7103//2 7102//2\nf 7101//3 7102//3 7098//3\nf 7102//4 7103//4 7099//4\nf 7103//5 7104//5 7100//5\nf 7097//6 7100//6 7104//6\nf 7106//1 7107//1 7108//1\nf 7112//2 7111//2 7110//2\nf 7109//3 7110//3 7106//3\nf 7110//4 7111//4 7107//4\nf 7111//5 7112//5 7108//5\nf 7105//6 7108//6 7112//6\nf 7114//1 7115//1 7116//1\nf 7120//2 7119//2 7118//2\nf 7117//3 7118//3 7114//3\nf 7118//4 7119//4 7115//4\nf 7119//5 7120//5 7116//5\nf 7113//6 7116//6 7120//6\nf 7121//1 7122//1 7123//1\nf 7125//2 7128//2 7127//2\nf 7125//3 7126//3 7122//3\nf 7122//4 7126//4 7127//4\nf 7127//5 7128//5 7124//5\nf 7121//6 7124//6 7128//6\nf 7129//1 7130//1 7131//1\nf 7133//2 7136//2 7135//2\nf 7133//3 7134//3 7130//3\nf 7130//4 7134//4 7135//4\nf 7135//5 7136//5 7132//5\nf 7129//6 7132//6 7136//6\nf 7138//1 7139//1 7140//1\nf 7141//2 7144//2 7143//2\nf 7141//3 7142//3 7138//3\nf 7138//4 7142//4 7143//4\nf 7143//5 7144//5 7140//5\nf 7141//6 7137//6 7140//6\nf 7146//1 7147//1 7148//1\nf 7149//2 7152//2 7151//2\nf 7149//3 7150//3 7146//3\nf 7146//4 7150//4 7151//4\nf 7151//5 7152//5 7148//5\nf 7145//6 7148//6 7152//6\nf 7154//1 7155//1 7156//1\nf 7157//2 7160//2 7159//2\nf 7157//3 7158//3 7154//3\nf 7154//4 7158//4 7159//4\nf 7159//5 7160//5 7156//5\nf 7157//6 7153//6 7156//6\nf 7162//1 7163//1 7164//1\nf 7168//2 7167//2 7166//2\nf 7165//3 7166//3 7162//3\nf 7166//4 7167//4 7163//4\nf 7167//5 7168//5 7164//5\nf 7161//6 7164//6 7168//6\nf 7170//1 7171//1 7172//1\nf 7176//2 7175//2 7174//2\nf 7173//3 7174//3 7170//3\nf 7174//4 7175//4 7171//4\nf 7175//5 7176//5 7172//5\nf 7169//6 7172//6 7176//6\nf 7178//1 7179//1 7180//1\nf 7184//2 7183//2 7182//2\nf 7181//3 7182//3 7178//3\nf 7182//4 7183//4 7179//4\nf 7183//5 7184//5 7180//5\nf 7177//6 7180//6 7184//6\nf 7186//1 7187//1 7188//1\nf 7192//2 7191//2 7190//2\nf 7189//3 7190//3 7186//3\nf 7190//4 7191//4 7187//4\nf 7191//5 7192//5 7188//5\nf 7185//6 7188//6 7192//6\nf 7194//1 7195//1 7196//1\nf 7200//2 7199//2 7198//2\nf 7197//3 7198//3 7194//3\nf 7198//4 7199//4 7195//4\nf 7199//5 7200//5 7196//5\nf 7193//6 7196//6 7200//6\nf 7204//1 7203//1 7202//1\nf 7205//2 7206//2 7207//2\nf 7201//5 7202//5 7206//5\nf 7202//4 7203//4 7207//4\nf 7204//3 7208//3 7207//3\nf 7208//6 7204//6 7201//6\nf 7212//1 7211//1 7210//1\nf 7213//2 7214//2 7215//2\nf 7209//5 7210//5 7214//5\nf 7210//4 7211//4 7215//4\nf 7212//3 7216//3 7215//3\nf 7213//6 7216//6 7212//6\nf 7220//1 7219//1 7218//1\nf 7221//2 7222//2 7223//2\nf 7217//5 7218//5 7222//5\nf 7218//4 7219//4 7223//4\nf 7220//3 7224//3 7223//3\nf 7221//6 7224//6 7220//6\nf 7228//1 7227//1 7226//1\nf 7230//2 7231//2 7232//2\nf 7225//5 7226//5 7230//5\nf 7226//4 7227//4 7231//4\nf 7228//3 7232//3 7231//3\nf 7232//6 7228//6 7225//6\nf 7236//1 7235//1 7234//1\nf 7237//2 7238//2 7239//2\nf 7233//5 7234//5 7238//5\nf 7234//4 7235//4 7239//4\nf 7236//3 7240//3 7239//3\nf 7237//6 7240//6 7236//6\nf 7244//1 7243//1 7242//1\nf 7246//2 7247//2 7248//2\nf 7241//5 7242//5 7246//5\nf 7243//4 7247//4 7246//4\nf 7244//3 7248//3 7247//3\nf 7248//6 7244//6 7241//6\nf 7252//1 7251//1 7250//1\nf 7254//2 7255//2 7256//2\nf 7249//5 7250//5 7254//5\nf 7251//4 7255//4 7254//4\nf 7252//3 7256//3 7255//3\nf 7256//6 7252//6 7249//6\nf 7260//1 7259//1 7258//1\nf 7262//2 7263//2 7264//2\nf 7257//5 7258//5 7262//5\nf 7259//4 7263//4 7262//4\nf 7260//3 7264//3 7263//3\nf 7264//6 7260//6 7257//6\nf 7268//1 7267//1 7266//1\nf 7270//2 7271//2 7272//2\nf 7265//5 7266//5 7270//5\nf 7267//4 7271//4 7270//4\nf 7268//3 7272//3 7271//3\nf 7272//6 7268//6 7265//6\nf 7276//1 7275//1 7274//1\nf 7278//2 7279//2 7280//2\nf 7273//5 7274//5 7278//5\nf 7275//4 7279//4 7278//4\nf 7276//3 7280//3 7279//3\nf 7280//6 7276//6 7273//6\nf 7284//1 7283//1 7282//1\nf 7285//2 7286//2 7287//2\nf 7282//5 7286//5 7285//5\nf 7282//4 7283//4 7287//4\nf 7284//3 7288//3 7287//3\nf 7288//6 7284//6 7281//6\nf 7292//1 7291//1 7290//1\nf 7293//2 7294//2 7295//2\nf 7289//5 7290//5 7294//5\nf 7290//4 7291//4 7295//4\nf 7292//3 7296//3 7295//3\nf 7293//6 7296//6 7292//6\nf 7300//1 7299//1 7298//1\nf 7301//2 7302//2 7303//2\nf 7297//5 7298//5 7302//5\nf 7298//4 7299//4 7303//4\nf 7300//3 7304//3 7303//3\nf 7301//6 7304//6 7300//6\nf 7308//1 7307//1 7306//1\nf 7310//2 7311//2 7312//2\nf 7305//5 7306//5 7310//5\nf 7306//4 7307//4 7311//4\nf 7308//3 7312//3 7311//3\nf 7312//6 7308//6 7305//6\nf 7316//1 7315//1 7314//1\nf 7318//2 7319//2 7320//2\nf 7313//5 7314//5 7318//5\nf 7314//4 7315//4 7319//4\nf 7316//3 7320//3 7319//3\nf 7317//6 7320//6 7316//6\nf 7324//1 7323//1 7322//1\nf 7326//2 7327//2 7328//2\nf 7321//5 7322//5 7326//5\nf 7323//4 7327//4 7326//4\nf 7324//3 7328//3 7327//3\nf 7328//6 7324//6 7321//6\nf 7332//1 7331//1 7330//1\nf 7334//2 7335//2 7336//2\nf 7329//5 7330//5 7334//5\nf 7331//4 7335//4 7334//4\nf 7332//3 7336//3 7335//3\nf 7336//6 7332//6 7329//6\nf 7340//1 7339//1 7338//1\nf 7342//2 7343//2 7344//2\nf 7337//5 7338//5 7342//5\nf 7339//4 7343//4 7342//4\nf 7340//3 7344//3 7343//3\nf 7344//6 7340//6 7337//6\nf 7348//1 7347//1 7346//1\nf 7350//2 7351//2 7352//2\nf 7345//5 7346//5 7350//5\nf 7347//4 7351//4 7350//4\nf 7348//3 7352//3 7351//3\nf 7352//6 7348//6 7345//6\nf 7356//1 7355//1 7354//1\nf 7358//2 7359//2 7360//2\nf 7353//5 7354//5 7358//5\nf 7355//4 7359//4 7358//4\nf 7356//3 7360//3 7359//3\nf 7360//6 7356//6 7353//6\nf 7361//1 7364//1 7363//1\nf 7365//2 7366//2 7367//2\nf 7362//5 7366//5 7365//5\nf 7362//4 7363//4 7367//4\nf 7364//3 7368//3 7367//3\nf 7368//6 7364//6 7361//6\nf 7372//1 7371//1 7370//1\nf 7373//2 7374//2 7375//2\nf 7370//5 7374//5 7373//5\nf 7370//4 7371//4 7375//4\nf 7372//3 7376//3 7375//3\nf 7373//6 7376//6 7372//6\nf 7380//1 7379//1 7378//1\nf 7381//2 7382//2 7383//2\nf 7377//5 7378//5 7382//5\nf 7378//4 7379//4 7383//4\nf 7380//3 7384//3 7383//3\nf 7381//6 7384//6 7380//6\nf 7388//1 7387//1 7386//1\nf 7389//2 7390//2 7391//2\nf 7385//5 7386//5 7390//5\nf 7386//4 7387//4 7391//4\nf 7388//3 7392//3 7391//3\nf 7392//6 7388//6 7385//6\nf 7396//1 7395//1 7394//1\nf 7397//2 7398//2 7399//2\nf 7394//5 7398//5 7397//5\nf 7394//4 7395//4 7399//4\nf 7396//3 7400//3 7399//3\nf 7397//6 7400//6 7396//6\nf 7404//1 7403//1 7402//1\nf 7406//2 7407//2 7408//2\nf 7401//5 7402//5 7406//5\nf 7403//4 7407//4 7406//4\nf 7404//3 7408//3 7407//3\nf 7408//6 7404//6 7401//6\nf 7412//1 7411//1 7410//1\nf 7414//2 7415//2 7416//2\nf 7409//5 7410//5 7414//5\nf 7411//4 7415//4 7414//4\nf 7412//3 7416//3 7415//3\nf 7416//6 7412//6 7409//6\nf 7420//1 7419//1 7418//1\nf 7422//2 7423//2 7424//2\nf 7417//5 7418//5 7422//5\nf 7419//4 7423//4 7422//4\nf 7420//3 7424//3 7423//3\nf 7424//6 7420//6 7417//6\nf 7428//1 7427//1 7426//1\nf 7430//2 7431//2 7432//2\nf 7425//5 7426//5 7430//5\nf 7427//4 7431//4 7430//4\nf 7428//3 7432//3 7431//3\nf 7432//6 7428//6 7425//6\nf 7436//1 7435//1 7434//1\nf 7438//2 7439//2 7440//2\nf 7433//5 7434//5 7438//5\nf 7435//4 7439//4 7438//4\nf 7436//3 7440//3 7439//3\nf 7440//6 7436//6 7433//6\nf 7441//1 7444//1 7443//1\nf 7446//2 7447//2 7448//2\nf 7441//5 7442//5 7446//5\nf 7442//4 7443//4 7447//4\nf 7444//3 7448//3 7447//3\nf 7448//6 7444//6 7441//6\nf 7449//1 7452//1 7451//1\nf 7454//2 7455//2 7456//2\nf 7449//5 7450//5 7454//5\nf 7450//4 7451//4 7455//4\nf 7452//3 7456//3 7455//3\nf 7453//6 7456//6 7452//6\nf 7460//1 7459//1 7458//1\nf 7462//2 7463//2 7464//2\nf 7457//5 7458//5 7462//5\nf 7458//4 7459//4 7463//4\nf 7460//3 7464//3 7463//3\nf 7461//6 7464//6 7460//6\nf 7468//1 7467//1 7466//1\nf 7470//2 7471//2 7472//2\nf 7465//5 7466//5 7470//5\nf 7466//4 7467//4 7471//4\nf 7468//3 7472//3 7471//3\nf 7472//6 7468//6 7465//6\nf 7476//1 7475//1 7474//1\nf 7478//2 7479//2 7480//2\nf 7473//5 7474//5 7478//5\nf 7474//4 7475//4 7479//4\nf 7476//3 7480//3 7479//3\nf 7477//6 7480//6 7476//6\nf 7484//1 7483//1 7482//1\nf 7486//2 7487//2 7488//2\nf 7481//5 7482//5 7486//5\nf 7483//4 7487//4 7486//4\nf 7484//3 7488//3 7487//3\nf 7488//6 7484//6 7481//6\nf 7492//1 7491//1 7490//1\nf 7494//2 7495//2 7496//2\nf 7489//5 7490//5 7494//5\nf 7491//4 7495//4 7494//4\nf 7492//3 7496//3 7495//3\nf 7496//6 7492//6 7489//6\nf 7500//1 7499//1 7498//1\nf 7502//2 7503//2 7504//2\nf 7497//5 7498//5 7502//5\nf 7499//4 7503//4 7502//4\nf 7500//3 7504//3 7503//3\nf 7504//6 7500//6 7497//6\nf 7508//1 7507//1 7506//1\nf 7510//2 7511//2 7512//2\nf 7505//5 7506//5 7510//5\nf 7507//4 7511//4 7510//4\nf 7508//3 7512//3 7511//3\nf 7512//6 7508//6 7505//6\nf 7516//1 7515//1 7514//1\nf 7518//2 7519//2 7520//2\nf 7513//5 7514//5 7518//5\nf 7515//4 7519//4 7518//4\nf 7516//3 7520//3 7519//3\nf 7520//6 7516//6 7513//6\nf 7521//1 7524//1 7523//1\nf 7526//2 7527//2 7528//2\nf 7521//5 7522//5 7526//5\nf 7522//4 7523//4 7527//4\nf 7524//3 7528//3 7527//3\nf 7528//6 7524//6 7521//6\nf 7529//1 7532//1 7531//1\nf 7534//2 7535//2 7536//2\nf 7529//5 7530//5 7534//5\nf 7530//4 7531//4 7535//4\nf 7532//3 7536//3 7535//3\nf 7533//6 7536//6 7532//6\nf 7540//1 7539//1 7538//1\nf 7542//2 7543//2 7544//2\nf 7537//5 7538//5 7542//5\nf 7538//4 7539//4 7543//4\nf 7540//3 7544//3 7543//3\nf 7541//6 7544//6 7540//6\nf 7548//1 7547//1 7546//1\nf 7550//2 7551//2 7552//2\nf 7545//5 7546//5 7550//5\nf 7546//4 7547//4 7551//4\nf 7548//3 7552//3 7551//3\nf 7552//6 7548//6 7545//6\nf 7556//1 7555//1 7554//1\nf 7558//2 7559//2 7560//2\nf 7553//5 7554//5 7558//5\nf 7554//4 7555//4 7559//4\nf 7556//3 7560//3 7559//3\nf 7557//6 7560//6 7556//6\nf 7564//1 7563//1 7562//1\nf 7566//2 7567//2 7568//2\nf 7561//5 7562//5 7566//5\nf 7563//4 7567//4 7566//4\nf 7564//3 7568//3 7567//3\nf 7568//6 7564//6 7561//6\nf 7572//1 7571//1 7570//1\nf 7574//2 7575//2 7576//2\nf 7569//5 7570//5 7574//5\nf 7571//4 7575//4 7574//4\nf 7572//3 7576//3 7575//3\nf 7576//6 7572//6 7569//6\nf 7580//1 7579//1 7578//1\nf 7582//2 7583//2 7584//2\nf 7577//5 7578//5 7582//5\nf 7579//4 7583//4 7582//4\nf 7580//3 7584//3 7583//3\nf 7584//6 7580//6 7577//6\nf 7588//1 7587//1 7586//1\nf 7590//2 7591//2 7592//2\nf 7585//5 7586//5 7590//5\nf 7587//4 7591//4 7590//4\nf 7588//3 7592//3 7591//3\nf 7592//6 7588//6 7585//6\nf 7596//1 7595//1 7594//1\nf 7598//2 7599//2 7600//2\nf 7593//5 7594//5 7598//5\nf 7595//4 7599//4 7598//4\nf 7596//3 7600//3 7599//3\nf 7600//6 7596//6 7593//6\nf 7601//1 7604//1 7603//1\nf 7605//2 7606//2 7607//2\nf 7602//5 7606//5 7605//5\nf 7602//4 7603//4 7607//4\nf 7604//3 7608//3 7607//3\nf 7608//6 7604//6 7601//6\nf 7609//1 7612//1 7611//1\nf 7613//2 7614//2 7615//2\nf 7610//5 7614//5 7613//5\nf 7610//4 7611//4 7615//4\nf 7612//3 7616//3 7615//3\nf 7613//6 7616//6 7612//6\nf 7620//1 7619//1 7618//1\nf 7621//2 7622//2 7623//2\nf 7618//5 7622//5 7621//5\nf 7618//4 7619//4 7623//4\nf 7620//3 7624//3 7623//3\nf 7621//6 7624//6 7620//6\nf 7628//1 7627//1 7626//1\nf 7629//2 7630//2 7631//2\nf 7626//5 7630//5 7629//5\nf 7626//4 7627//4 7631//4\nf 7628//3 7632//3 7631//3\nf 7632//6 7628//6 7625//6\nf 7636//1 7635//1 7634//1\nf 7637//2 7638//2 7639//2\nf 7634//5 7638//5 7637//5\nf 7634//4 7635//4 7639//4\nf 7636//3 7640//3 7639//3\nf 7637//6 7640//6 7636//6\nf 7644//1 7643//1 7642//1\nf 7646//2 7647//2 7648//2\nf 7642//5 7646//5 7645//5\nf 7643//4 7647//4 7646//4\nf 7644//3 7648//3 7647//3\nf 7648//6 7644//6 7641//6\nf 7652//1 7651//1 7650//1\nf 7654//2 7655//2 7656//2\nf 7650//5 7654//5 7653//5\nf 7651//4 7655//4 7654//4\nf 7652//3 7656//3 7655//3\nf 7656//6 7652//6 7649//6\nf 7660//1 7659//1 7658//1\nf 7662//2 7663//2 7664//2\nf 7658//5 7662//5 7661//5\nf 7659//4 7663//4 7662//4\nf 7660//3 7664//3 7663//3\nf 7664//6 7660//6 7657//6\nf 7668//1 7667//1 7666//1\nf 7670//2 7671//2 7672//2\nf 7666//5 7670//5 7669//5\nf 7667//4 7671//4 7670//4\nf 7668//3 7672//3 7671//3\nf 7672//6 7668//6 7665//6\nf 7676//1 7675//1 7674//1\nf 7678//2 7679//2 7680//2\nf 7674//5 7678//5 7677//5\nf 7675//4 7679//4 7678//4\nf 7676//3 7680//3 7679//3\nf 7680//6 7676//6 7673//6\nf 7681//1 7684//1 7683//1\nf 7685//2 7686//2 7687//2\nf 7682//5 7686//5 7685//5\nf 7682//4 7683//4 7687//4\nf 7684//3 7688//3 7687//3\nf 7688//6 7684//6 7681//6\nf 7689//1 7692//1 7691//1\nf 7693//2 7694//2 7695//2\nf 7690//5 7694//5 7693//5\nf 7690//4 7691//4 7695//4\nf 7692//3 7696//3 7695//3\nf 7693//6 7696//6 7692//6\nf 7700//1 7699//1 7698//1\nf 7701//2 7702//2 7703//2\nf 7698//5 7702//5 7701//5\nf 7698//4 7699//4 7703//4\nf 7700//3 7704//3 7703//3\nf 7701//6 7704//6 7700//6\nf 7708//1 7707//1 7706//1\nf 7709//2 7710//2 7711//2\nf 7706//5 7710//5 7709//5\nf 7706//4 7707//4 7711//4\nf 7708//3 7712//3 7711//3\nf 7712//6 7708//6 7705//6\nf 7716//1 7715//1 7714//1\nf 7717//2 7718//2 7719//2\nf 7714//5 7718//5 7717//5\nf 7714//4 7715//4 7719//4\nf 7716//3 7720//3 7719//3\nf 7717//6 7720//6 7716//6\nf 7724//1 7723//1 7722//1\nf 7726//2 7727//2 7728//2\nf 7722//5 7726//5 7725//5\nf 7723//4 7727//4 7726//4\nf 7724//3 7728//3 7727//3\nf 7728//6 7724//6 7721//6\nf 7732//1 7731//1 7730//1\nf 7734//2 7735//2 7736//2\nf 7730//5 7734//5 7733//5\nf 7731//4 7735//4 7734//4\nf 7732//3 7736//3 7735//3\nf 7736//6 7732//6 7729//6\nf 7740//1 7739//1 7738//1\nf 7742//2 7743//2 7744//2\nf 7738//5 7742//5 7741//5\nf 7739//4 7743//4 7742//4\nf 7740//3 7744//3 7743//3\nf 7744//6 7740//6 7737//6\nf 7748//1 7747//1 7746//1\nf 7750//2 7751//2 7752//2\nf 7746//5 7750//5 7749//5\nf 7747//4 7751//4 7750//4\nf 7748//3 7752//3 7751//3\nf 7752//6 7748//6 7745//6\nf 7756//1 7755//1 7754//1\nf 7758//2 7759//2 7760//2\nf 7754//5 7758//5 7757//5\nf 7755//4 7759//4 7758//4\nf 7756//3 7760//3 7759//3\nf 7760//6 7756//6 7753//6\nf 7761//1 7764//1 7763//1\nf 7765//2 7766//2 7767//2\nf 7762//5 7766//5 7765//5\nf 7762//4 7763//4 7767//4\nf 7764//3 7768//3 7767//3\nf 7768//6 7764//6 7761//6\nf 7769//1 7772//1 7771//1\nf 7773//2 7774//2 7775//2\nf 7770//5 7774//5 7773//5\nf 7770//4 7771//4 7775//4\nf 7772//3 7776//3 7775//3\nf 7773//6 7776//6 7772//6\nf 7780//1 7779//1 7778//1\nf 7781//2 7782//2 7783//2\nf 7778//5 7782//5 7781//5\nf 7778//4 7779//4 7783//4\nf 7780//3 7784//3 7783//3\nf 7781//6 7784//6 7780//6\nf 7788//1 7787//1 7786//1\nf 7789//2 7790//2 7791//2\nf 7786//5 7790//5 7789//5\nf 7786//4 7787//4 7791//4\nf 7788//3 7792//3 7791//3\nf 7792//6 7788//6 7785//6\nf 7796//1 7795//1 7794//1\nf 7797//2 7798//2 7799//2\nf 7794//5 7798//5 7797//5\nf 7794//4 7795//4 7799//4\nf 7796//3 7800//3 7799//3\nf 7797//6 7800//6 7796//6\nf 7804//1 7803//1 7802//1\nf 7806//2 7807//2 7808//2\nf 7802//5 7806//5 7805//5\nf 7803//4 7807//4 7806//4\nf 7804//3 7808//3 7807//3\nf 7808//6 7804//6 7801//6\nf 7812//1 7811//1 7810//1\nf 7814//2 7815//2 7816//2\nf 7810//5 7814//5 7813//5\nf 7811//4 7815//4 7814//4\nf 7812//3 7816//3 7815//3\nf 7816//6 7812//6 7809//6\nf 7820//1 7819//1 7818//1\nf 7822//2 7823//2 7824//2\nf 7818//5 7822//5 7821//5\nf 7819//4 7823//4 7822//4\nf 7820//3 7824//3 7823//3\nf 7824//6 7820//6 7817//6\nf 7828//1 7827//1 7826//1\nf 7830//2 7831//2 7832//2\nf 7826//5 7830//5 7829//5\nf 7827//4 7831//4 7830//4\nf 7828//3 7832//3 7831//3\nf 7832//6 7828//6 7825//6\nf 7836//1 7835//1 7834//1\nf 7838//2 7839//2 7840//2\nf 7834//5 7838//5 7837//5\nf 7835//4 7839//4 7838//4\nf 7836//3 7840//3 7839//3\nf 7840//6 7836//6 7833//6\nf 7841//1 7844//1 7843//1\nf 7845//2 7846//2 7847//2\nf 7842//5 7846//5 7845//5\nf 7842//4 7843//4 7847//4\nf 7844//3 7848//3 7847//3\nf 7848//6 7844//6 7841//6\nf 7849//1 7852//1 7851//1\nf 7853//2 7854//2 7855//2\nf 7850//5 7854//5 7853//5\nf 7850//4 7851//4 7855//4\nf 7852//3 7856//3 7855//3\nf 7853//6 7856//6 7852//6\nf 7860//1 7859//1 7858//1\nf 7861//2 7862//2 7863//2\nf 7858//5 7862//5 7861//5\nf 7858//4 7859//4 7863//4\nf 7860//3 7864//3 7863//3\nf 7861//6 7864//6 7860//6\nf 7868//1 7867//1 7866//1\nf 7869//2 7870//2 7871//2\nf 7866//5 7870//5 7869//5\nf 7866//4 7867//4 7871//4\nf 7868//3 7872//3 7871//3\nf 7872//6 7868//6 7865//6\nf 7876//1 7875//1 7874//1\nf 7877//2 7878//2 7879//2\nf 7874//5 7878//5 7877//5\nf 7874//4 7875//4 7879//4\nf 7876//3 7880//3 7879//3\nf 7877//6 7880//6 7876//6\nf 7884//1 7883//1 7882//1\nf 7886//2 7887//2 7888//2\nf 7882//5 7886//5 7885//5\nf 7883//4 7887//4 7886//4\nf 7884//3 7888//3 7887//3\nf 7888//6 7884//6 7881//6\nf 7892//1 7891//1 7890//1\nf 7894//2 7895//2 7896//2\nf 7890//5 7894//5 7893//5\nf 7891//4 7895//4 7894//4\nf 7892//3 7896//3 7895//3\nf 7896//6 7892//6 7889//6\nf 7900//1 7899//1 7898//1\nf 7902//2 7903//2 7904//2\nf 7898//5 7902//5 7901//5\nf 7899//4 7903//4 7902//4\nf 7900//3 7904//3 7903//3\nf 7904//6 7900//6 7897//6\nf 7908//1 7907//1 7906//1\nf 7910//2 7911//2 7912//2\nf 7906//5 7910//5 7909//5\nf 7907//4 7911//4 7910//4\nf 7908//3 7912//3 7911//3\nf 7912//6 7908//6 7905//6\nf 7916//1 7915//1 7914//1\nf 7918//2 7919//2 7920//2\nf 7914//5 7918//5 7917//5\nf 7915//4 7919//4 7918//4\nf 7916//3 7920//3 7919//3\nf 7920//6 7916//6 7913//6\nf 7921//1 7924//1 7923//1\nf 7925//2 7926//2 7927//2\nf 7922//5 7926//5 7925//5\nf 7922//4 7923//4 7927//4\nf 7924//3 7928//3 7927//3\nf 7928//6 7924//6 7921//6\nf 7929//1 7932//1 7931//1\nf 7933//2 7934//2 7935//2\nf 7930//5 7934//5 7933//5\nf 7930//4 7931//4 7935//4\nf 7932//3 7936//3 7935//3\nf 7933//6 7936//6 7932//6\nf 7940//1 7939//1 7938//1\nf 7941//2 7942//2 7943//2\nf 7938//5 7942//5 7941//5\nf 7938//4 7939//4 7943//4\nf 7940//3 7944//3 7943//3\nf 7941//6 7944//6 7940//6\nf 7948//1 7947//1 7946//1\nf 7949//2 7950//2 7951//2\nf 7946//5 7950//5 7949//5\nf 7946//4 7947//4 7951//4\nf 7948//3 7952//3 7951//3\nf 7952//6 7948//6 7945//6\nf 7956//1 7955//1 7954//1\nf 7957//2 7958//2 7959//2\nf 7954//5 7958//5 7957//5\nf 7954//4 7955//4 7959//4\nf 7956//3 7960//3 7959//3\nf 7957//6 7960//6 7956//6\nf 7964//1 7963//1 7962//1\nf 7966//2 7967//2 7968//2\nf 7962//5 7966//5 7965//5\nf 7963//4 7967//4 7966//4\nf 7964//3 7968//3 7967//3\nf 7968//6 7964//6 7961//6\nf 7972//1 7971//1 7970//1\nf 7974//2 7975//2 7976//2\nf 7970//5 7974//5 7973//5\nf 7971//4 7975//4 7974//4\nf 7972//3 7976//3 7975//3\nf 7976//6 7972//6 7969//6\nf 7980//1 7979//1 7978//1\nf 7982//2 7983//2 7984//2\nf 7978//5 7982//5 7981//5\nf 7979//4 7983//4 7982//4\nf 7980//3 7984//3 7983//3\nf 7984//6 7980//6 7977//6\nf 7988//1 7987//1 7986//1\nf 7990//2 7991//2 7992//2\nf 7986//5 7990//5 7989//5\nf 7987//4 7991//4 7990//4\nf 7988//3 7992//3 7991//3\nf 7992//6 7988//6 7985//6\nf 7996//1 7995//1 7994//1\nf 7998//2 7999//2 8000//2\nf 7994//5 7998//5 7997//5\nf 7995//4 7999//4 7998//4\nf 7996//3 8000//3 7999//3\nf 8000//6 7996//6 7993//6\nf 8002//1 8003//1 8004//1\nf 8008//2 8007//2 8006//2\nf 8001//3 8005//3 8006//3\nf 8002//4 8006//4 8007//4\nf 8007//5 8008//5 8004//5\nf 8001//6 8004//6 8008//6\nf 8010//1 8011//1 8012//1\nf 8013//2 8016//2 8015//2\nf 8009//3 8013//3 8014//3\nf 8010//4 8014//4 8015//4\nf 8015//5 8016//5 8012//5\nf 8009//6 8012//6 8016//6\nf 8018//1 8019//1 8020//1\nf 8024//2 8023//2 8022//2\nf 8017//3 8021//3 8022//3\nf 8018//4 8022//4 8023//4\nf 8023//5 8024//5 8020//5\nf 8021//6 8017//6 8020//6\nf 8026//1 8027//1 8028//1\nf 8032//2 8031//2 8030//2\nf 8025//3 8029//3 8030//3\nf 8026//4 8030//4 8031//4\nf 8031//5 8032//5 8028//5\nf 8025//6 8028//6 8032//6\nf 8034//1 8035//1 8036//1\nf 8037//2 8040//2 8039//2\nf 8033//3 8037//3 8038//3\nf 8034//4 8038//4 8039//4\nf 8039//5 8040//5 8036//5\nf 8037//6 8033//6 8036//6\nf 8042//1 8043//1 8044//1\nf 8048//2 8047//2 8046//2\nf 8041//3 8045//3 8046//3\nf 8046//4 8047//4 8043//4\nf 8047//5 8048//5 8044//5\nf 8041//6 8044//6 8048//6\nf 8050//1 8051//1 8052//1\nf 8056//2 8055//2 8054//2\nf 8049//3 8053//3 8054//3\nf 8054//4 8055//4 8051//4\nf 8055//5 8056//5 8052//5\nf 8049//6 8052//6 8056//6\nf 8058//1 8059//1 8060//1\nf 8064//2 8063//2 8062//2\nf 8057//3 8061//3 8062//3\nf 8062//4 8063//4 8059//4\nf 8063//5 8064//5 8060//5\nf 8057//6 8060//6 8064//6\nf 8066//1 8067//1 8068//1\nf 8072//2 8071//2 8070//2\nf 8065//3 8069//3 8070//3\nf 8070//4 8071//4 8067//4\nf 8071//5 8072//5 8068//5\nf 8065//6 8068//6 8072//6\nf 8074//1 8075//1 8076//1\nf 8080//2 8079//2 8078//2\nf 8073//3 8077//3 8078//3\nf 8078//4 8079//4 8075//4\nf 8079//5 8080//5 8076//5\nf 8073//6 8076//6 8080//6\nf 8082//1 8083//1 8084//1\nf 8088//2 8087//2 8086//2\nf 8085//3 8086//3 8082//3\nf 8082//4 8086//4 8087//4\nf 8087//5 8088//5 8084//5\nf 8081//6 8084//6 8088//6\nf 8090//1 8091//1 8092//1\nf 8093//2 8096//2 8095//2\nf 8089//3 8093//3 8094//3\nf 8090//4 8094//4 8095//4\nf 8095//5 8096//5 8092//5\nf 8089//6 8092//6 8096//6\nf 8098//1 8099//1 8100//1\nf 8104//2 8103//2 8102//2\nf 8097//3 8101//3 8102//3\nf 8098//4 8102//4 8103//4\nf 8103//5 8104//5 8100//5\nf 8101//6 8097//6 8100//6\nf 8106//1 8107//1 8108//1\nf 8112//2 8111//2 8110//2\nf 8105//3 8109//3 8110//3\nf 8106//4 8110//4 8111//4\nf 8111//5 8112//5 8108//5\nf 8105//6 8108//6 8112//6\nf 8114//1 8115//1 8116//1\nf 8117//2 8120//2 8119//2\nf 8113//3 8117//3 8118//3\nf 8114//4 8118//4 8119//4\nf 8119//5 8120//5 8116//5\nf 8117//6 8113//6 8116//6\nf 8122//1 8123//1 8124//1\nf 8128//2 8127//2 8126//2\nf 8121//3 8125//3 8126//3\nf 8126//4 8127//4 8123//4\nf 8127//5 8128//5 8124//5\nf 8121//6 8124//6 8128//6\nf 8130//1 8131//1 8132//1\nf 8136//2 8135//2 8134//2\nf 8129//3 8133//3 8134//3\nf 8134//4 8135//4 8131//4\nf 8135//5 8136//5 8132//5\nf 8129//6 8132//6 8136//6\nf 8138//1 8139//1 8140//1\nf 8144//2 8143//2 8142//2\nf 8137//3 8141//3 8142//3\nf 8142//4 8143//4 8139//4\nf 8143//5 8144//5 8140//5\nf 8137//6 8140//6 8144//6\nf 8146//1 8147//1 8148//1\nf 8152//2 8151//2 8150//2\nf 8145//3 8149//3 8150//3\nf 8150//4 8151//4 8147//4\nf 8151//5 8152//5 8148//5\nf 8145//6 8148//6 8152//6\nf 8154//1 8155//1 8156//1\nf 8160//2 8159//2 8158//2\nf 8153//3 8157//3 8158//3\nf 8158//4 8159//4 8155//4\nf 8159//5 8160//5 8156//5\nf 8153//6 8156//6 8160//6\nf 8162//1 8163//1 8164//1\nf 8165//2 8168//2 8167//2\nf 8165//3 8166//3 8162//3\nf 8162//4 8166//4 8167//4\nf 8167//5 8168//5 8164//5\nf 8161//6 8164//6 8168//6\nf 8170//1 8171//1 8172//1\nf 8173//2 8176//2 8175//2\nf 8173//3 8174//3 8170//3\nf 8170//4 8174//4 8175//4\nf 8175//5 8176//5 8172//5\nf 8169//6 8172//6 8176//6\nf 8178//1 8179//1 8180//1\nf 8181//2 8184//2 8183//2\nf 8177//3 8181//3 8182//3\nf 8178//4 8182//4 8183//4\nf 8183//5 8184//5 8180//5\nf 8181//6 8177//6 8180//6\nf 8186//1 8187//1 8188//1\nf 8189//2 8192//2 8191//2\nf 8185//3 8189//3 8190//3\nf 8186//4 8190//4 8191//4\nf 8191//5 8192//5 8188//5\nf 8185//6 8188//6 8192//6\nf 8194//1 8195//1 8196//1\nf 8197//2 8200//2 8199//2\nf 8197//3 8198//3 8194//3\nf 8194//4 8198//4 8199//4\nf 8199//5 8200//5 8196//5\nf 8197//6 8193//6 8196//6\nf 8202//1 8203//1 8204//1\nf 8208//2 8207//2 8206//2\nf 8201//3 8205//3 8206//3\nf 8206//4 8207//4 8203//4\nf 8207//5 8208//5 8204//5\nf 8201//6 8204//6 8208//6\nf 8210//1 8211//1 8212//1\nf 8216//2 8215//2 8214//2\nf 8209//3 8213//3 8214//3\nf 8214//4 8215//4 8211//4\nf 8215//5 8216//5 8212//5\nf 8209//6 8212//6 8216//6\nf 8218//1 8219//1 8220//1\nf 8224//2 8223//2 8222//2\nf 8217//3 8221//3 8222//3\nf 8222//4 8223//4 8219//4\nf 8223//5 8224//5 8220//5\nf 8217//6 8220//6 8224//6\nf 8226//1 8227//1 8228//1\nf 8232//2 8231//2 8230//2\nf 8225//3 8229//3 8230//3\nf 8230//4 8231//4 8227//4\nf 8231//5 8232//5 8228//5\nf 8225//6 8228//6 8232//6\nf 8234//1 8235//1 8236//1\nf 8240//2 8239//2 8238//2\nf 8233//3 8237//3 8238//3\nf 8238//4 8239//4 8235//4\nf 8239//5 8240//5 8236//5\nf 8233//6 8236//6 8240//6\nf 8241//1 8242//1 8243//1\nf 8248//2 8247//2 8246//2\nf 8241//3 8245//3 8246//3\nf 8242//4 8246//4 8247//4\nf 8247//5 8248//5 8244//5\nf 8241//6 8244//6 8248//6\nf 8249//1 8250//1 8251//1\nf 8256//2 8255//2 8254//2\nf 8249//3 8253//3 8254//3\nf 8250//4 8254//4 8255//4\nf 8255//5 8256//5 8252//5\nf 8249//6 8252//6 8256//6\nf 8258//1 8259//1 8260//1\nf 8264//2 8263//2 8262//2\nf 8257//3 8261//3 8262//3\nf 8258//4 8262//4 8263//4\nf 8263//5 8264//5 8260//5\nf 8261//6 8257//6 8260//6\nf 8266//1 8267//1 8268//1\nf 8272//2 8271//2 8270//2\nf 8265//3 8269//3 8270//3\nf 8266//4 8270//4 8271//4\nf 8271//5 8272//5 8268//5\nf 8265//6 8268//6 8272//6\nf 8274//1 8275//1 8276//1\nf 8280//2 8279//2 8278//2\nf 8273//3 8277//3 8278//3\nf 8274//4 8278//4 8279//4\nf 8279//5 8280//5 8276//5\nf 8277//6 8273//6 8276//6\nf 8282//1 8283//1 8284//1\nf 8288//2 8287//2 8286//2\nf 8281//3 8285//3 8286//3\nf 8286//4 8287//4 8283//4\nf 8287//5 8288//5 8284//5\nf 8281//6 8284//6 8288//6\nf 8290//1 8291//1 8292//1\nf 8296//2 8295//2 8294//2\nf 8289//3 8293//3 8294//3\nf 8294//4 8295//4 8291//4\nf 8295//5 8296//5 8292//5\nf 8289//6 8292//6 8296//6\nf 8298//1 8299//1 8300//1\nf 8304//2 8303//2 8302//2\nf 8297//3 8301//3 8302//3\nf 8302//4 8303//4 8299//4\nf 8303//5 8304//5 8300//5\nf 8297//6 8300//6 8304//6\nf 8306//1 8307//1 8308//1\nf 8312//2 8311//2 8310//2\nf 8305//3 8309//3 8310//3\nf 8310//4 8311//4 8307//4\nf 8311//5 8312//5 8308//5\nf 8305//6 8308//6 8312//6\nf 8314//1 8315//1 8316//1\nf 8320//2 8319//2 8318//2\nf 8313//3 8317//3 8318//3\nf 8318//4 8319//4 8315//4\nf 8319//5 8320//5 8316//5\nf 8313//6 8316//6 8320//6\nf 8321//1 8322//1 8323//1\nf 8328//2 8327//2 8326//2\nf 8321//3 8325//3 8326//3\nf 8322//4 8326//4 8327//4\nf 8327//5 8328//5 8324//5\nf 8321//6 8324//6 8328//6\nf 8329//1 8330//1 8331//1\nf 8336//2 8335//2 8334//2\nf 8329//3 8333//3 8334//3\nf 8330//4 8334//4 8335//4\nf 8335//5 8336//5 8332//5\nf 8329//6 8332//6 8336//6\nf 8338//1 8339//1 8340//1\nf 8344//2 8343//2 8342//2\nf 8337//3 8341//3 8342//3\nf 8338//4 8342//4 8343//4\nf 8343//5 8344//5 8340//5\nf 8341//6 8337//6 8340//6\nf 8346//1 8347//1 8348//1\nf 8352//2 8351//2 8350//2\nf 8345//3 8349//3 8350//3\nf 8346//4 8350//4 8351//4\nf 8351//5 8352//5 8348//5\nf 8345//6 8348//6 8352//6\nf 8354//1 8355//1 8356//1\nf 8360//2 8359//2 8358//2\nf 8353//3 8357//3 8358//3\nf 8354//4 8358//4 8359//4\nf 8359//5 8360//5 8356//5\nf 8357//6 8353//6 8356//6\nf 8362//1 8363//1 8364//1\nf 8368//2 8367//2 8366//2\nf 8361//3 8365//3 8366//3\nf 8366//4 8367//4 8363//4\nf 8367//5 8368//5 8364//5\nf 8361//6 8364//6 8368//6\nf 8370//1 8371//1 8372//1\nf 8376//2 8375//2 8374//2\nf 8369//3 8373//3 8374//3\nf 8374//4 8375//4 8371//4\nf 8375//5 8376//5 8372//5\nf 8369//6 8372//6 8376//6\nf 8378//1 8379//1 8380//1\nf 8384//2 8383//2 8382//2\nf 8377//3 8381//3 8382//3\nf 8382//4 8383//4 8379//4\nf 8383//5 8384//5 8380//5\nf 8377//6 8380//6 8384//6\nf 8386//1 8387//1 8388//1\nf 8392//2 8391//2 8390//2\nf 8385//3 8389//3 8390//3\nf 8390//4 8391//4 8387//4\nf 8391//5 8392//5 8388//5\nf 8385//6 8388//6 8392//6\nf 8394//1 8395//1 8396//1\nf 8400//2 8399//2 8398//2\nf 8393//3 8397//3 8398//3\nf 8398//4 8399//4 8395//4\nf 8399//5 8400//5 8396//5\nf 8393//6 8396//6 8400//6\nf 8401//1 8402//1 8403//1\nf 8405//2 8408//2 8407//2\nf 8405//3 8406//3 8402//3\nf 8402//4 8406//4 8407//4\nf 8407//5 8408//5 8404//5\nf 8401//6 8404//6 8408//6\nf 8409//1 8410//1 8411//1\nf 8413//2 8416//2 8415//2\nf 8413//3 8414//3 8410//3\nf 8410//4 8414//4 8415//4\nf 8415//5 8416//5 8412//5\nf 8409//6 8412//6 8416//6\nf 8418//1 8419//1 8420//1\nf 8421//2 8424//2 8423//2\nf 8421//3 8422//3 8418//3\nf 8418//4 8422//4 8423//4\nf 8423//5 8424//5 8420//5\nf 8421//6 8417//6 8420//6\nf 8426//1 8427//1 8428//1\nf 8429//2 8432//2 8431//2\nf 8429//3 8430//3 8426//3\nf 8426//4 8430//4 8431//4\nf 8431//5 8432//5 8428//5\nf 8425//6 8428//6 8432//6\nf 8434//1 8435//1 8436//1\nf 8437//2 8440//2 8439//2\nf 8437//3 8438//3 8434//3\nf 8434//4 8438//4 8439//4\nf 8439//5 8440//5 8436//5\nf 8437//6 8433//6 8436//6\nf 8442//1 8443//1 8444//1\nf 8448//2 8447//2 8446//2\nf 8445//3 8446//3 8442//3\nf 8446//4 8447//4 8443//4\nf 8447//5 8448//5 8444//5\nf 8441//6 8444//6 8448//6\nf 8450//1 8451//1 8452//1\nf 8456//2 8455//2 8454//2\nf 8453//3 8454//3 8450//3\nf 8454//4 8455//4 8451//4\nf 8455//5 8456//5 8452//5\nf 8449//6 8452//6 8456//6\nf 8458//1 8459//1 8460//1\nf 8464//2 8463//2 8462//2\nf 8461//3 8462//3 8458//3\nf 8462//4 8463//4 8459//4\nf 8463//5 8464//5 8460//5\nf 8457//6 8460//6 8464//6\nf 8466//1 8467//1 8468//1\nf 8472//2 8471//2 8470//2\nf 8469//3 8470//3 8466//3\nf 8470//4 8471//4 8467//4\nf 8471//5 8472//5 8468//5\nf 8465//6 8468//6 8472//6\nf 8474//1 8475//1 8476//1\nf 8480//2 8479//2 8478//2\nf 8477//3 8478//3 8474//3\nf 8478//4 8479//4 8475//4\nf 8479//5 8480//5 8476//5\nf 8473//6 8476//6 8480//6\nf 8481//1 8482//1 8483//1\nf 8485//2 8488//2 8487//2\nf 8485//3 8486//3 8482//3\nf 8482//4 8486//4 8487//4\nf 8487//5 8488//5 8484//5\nf 8481//6 8484//6 8488//6\nf 8489//1 8490//1 8491//1\nf 8493//2 8496//2 8495//2\nf 8493//3 8494//3 8490//3\nf 8490//4 8494//4 8495//4\nf 8495//5 8496//5 8492//5\nf 8489//6 8492//6 8496//6\nf 8498//1 8499//1 8500//1\nf 8501//2 8504//2 8503//2\nf 8501//3 8502//3 8498//3\nf 8498//4 8502//4 8503//4\nf 8503//5 8504//5 8500//5\nf 8501//6 8497//6 8500//6\nf 8506//1 8507//1 8508//1\nf 8509//2 8512//2 8511//2\nf 8509//3 8510//3 8506//3\nf 8506//4 8510//4 8511//4\nf 8511//5 8512//5 8508//5\nf 8505//6 8508//6 8512//6\nf 8514//1 8515//1 8516//1\nf 8517//2 8520//2 8519//2\nf 8517//3 8518//3 8514//3\nf 8514//4 8518//4 8519//4\nf 8519//5 8520//5 8516//5\nf 8517//6 8513//6 8516//6\nf 8522//1 8523//1 8524//1\nf 8528//2 8527//2 8526//2\nf 8525//3 8526//3 8522//3\nf 8526//4 8527//4 8523//4\nf 8527//5 8528//5 8524//5\nf 8521//6 8524//6 8528//6\nf 8530//1 8531//1 8532//1\nf 8536//2 8535//2 8534//2\nf 8533//3 8534//3 8530//3\nf 8534//4 8535//4 8531//4\nf 8535//5 8536//5 8532//5\nf 8529//6 8532//6 8536//6\nf 8538//1 8539//1 8540//1\nf 8544//2 8543//2 8542//2\nf 8541//3 8542//3 8538//3\nf 8542//4 8543//4 8539//4\nf 8543//5 8544//5 8540//5\nf 8537//6 8540//6 8544//6\nf 8546//1 8547//1 8548//1\nf 8552//2 8551//2 8550//2\nf 8549//3 8550//3 8546//3\nf 8550//4 8551//4 8547//4\nf 8551//5 8552//5 8548//5\nf 8545//6 8548//6 8552//6\nf 8554//1 8555//1 8556//1\nf 8560//2 8559//2 8558//2\nf 8557//3 8558//3 8554//3\nf 8558//4 8559//4 8555//4\nf 8559//5 8560//5 8556//5\nf 8553//6 8556//6 8560//6\nf 8561//1 8562//1 8563//1\nf 8565//2 8568//2 8567//2\nf 8565//3 8566//3 8562//3\nf 8562//4 8566//4 8567//4\nf 8567//5 8568//5 8564//5\nf 8561//6 8564//6 8568//6\nf 8569//1 8570//1 8571//1\nf 8573//2 8576//2 8575//2\nf 8573//3 8574//3 8570//3\nf 8570//4 8574//4 8575//4\nf 8575//5 8576//5 8572//5\nf 8569//6 8572//6 8576//6\nf 8578//1 8579//1 8580//1\nf 8581//2 8584//2 8583//2\nf 8581//3 8582//3 8578//3\nf 8578//4 8582//4 8583//4\nf 8583//5 8584//5 8580//5\nf 8581//6 8577//6 8580//6\nf 8586//1 8587//1 8588//1\nf 8589//2 8592//2 8591//2\nf 8589//3 8590//3 8586//3\nf 8586//4 8590//4 8591//4\nf 8591//5 8592//5 8588//5\nf 8585//6 8588//6 8592//6\nf 8594//1 8595//1 8596//1\nf 8597//2 8600//2 8599//2\nf 8597//3 8598//3 8594//3\nf 8594//4 8598//4 8599//4\nf 8599//5 8600//5 8596//5\nf 8597//6 8593//6 8596//6\nf 8602//1 8603//1 8604//1\nf 8608//2 8607//2 8606//2\nf 8605//3 8606//3 8602//3\nf 8606//4 8607//4 8603//4\nf 8607//5 8608//5 8604//5\nf 8601//6 8604//6 8608//6\nf 8610//1 8611//1 8612//1\nf 8616//2 8615//2 8614//2\nf 8613//3 8614//3 8610//3\nf 8614//4 8615//4 8611//4\nf 8615//5 8616//5 8612//5\nf 8609//6 8612//6 8616//6\nf 8618//1 8619//1 8620//1\nf 8624//2 8623//2 8622//2\nf 8621//3 8622//3 8618//3\nf 8622//4 8623//4 8619//4\nf 8623//5 8624//5 8620//5\nf 8617//6 8620//6 8624//6\nf 8626//1 8627//1 8628//1\nf 8632//2 8631//2 8630//2\nf 8629//3 8630//3 8626//3\nf 8630//4 8631//4 8627//4\nf 8631//5 8632//5 8628//5\nf 8625//6 8628//6 8632//6\nf 8634//1 8635//1 8636//1\nf 8640//2 8639//2 8638//2\nf 8637//3 8638//3 8634//3\nf 8638//4 8639//4 8635//4\nf 8639//5 8640//5 8636//5\nf 8633//6 8636//6 8640//6\nf 8641//1 8642//1 8643//1\nf 8645//2 8648//2 8647//2\nf 8645//3 8646//3 8642//3\nf 8642//4 8646//4 8647//4\nf 8647//5 8648//5 8644//5\nf 8641//6 8644//6 8648//6\nf 8649//1 8650//1 8651//1\nf 8653//2 8656//2 8655//2\nf 8653//3 8654//3 8650//3\nf 8650//4 8654//4 8655//4\nf 8655//5 8656//5 8652//5\nf 8649//6 8652//6 8656//6\nf 8658//1 8659//1 8660//1\nf 8661//2 8664//2 8663//2\nf 8661//3 8662//3 8658//3\nf 8658//4 8662//4 8663//4\nf 8663//5 8664//5 8660//5\nf 8661//6 8657//6 8660//6\nf 8666//1 8667//1 8668//1\nf 8669//2 8672//2 8671//2\nf 8669//3 8670//3 8666//3\nf 8666//4 8670//4 8671//4\nf 8671//5 8672//5 8668//5\nf 8665//6 8668//6 8672//6\nf 8674//1 8675//1 8676//1\nf 8677//2 8680//2 8679//2\nf 8677//3 8678//3 8674//3\nf 8674//4 8678//4 8679//4\nf 8679//5 8680//5 8676//5\nf 8677//6 8673//6 8676//6\nf 8682//1 8683//1 8684//1\nf 8688//2 8687//2 8686//2\nf 8685//3 8686//3 8682//3\nf 8686//4 8687//4 8683//4\nf 8687//5 8688//5 8684//5\nf 8681//6 8684//6 8688//6\nf 8690//1 8691//1 8692//1\nf 8696//2 8695//2 8694//2\nf 8693//3 8694//3 8690//3\nf 8694//4 8695//4 8691//4\nf 8695//5 8696//5 8692//5\nf 8689//6 8692//6 8696//6\nf 8698//1 8699//1 8700//1\nf 8704//2 8703//2 8702//2\nf 8701//3 8702//3 8698//3\nf 8702//4 8703//4 8699//4\nf 8703//5 8704//5 8700//5\nf 8697//6 8700//6 8704//6\nf 8706//1 8707//1 8708//1\nf 8712//2 8711//2 8710//2\nf 8709//3 8710//3 8706//3\nf 8710//4 8711//4 8707//4\nf 8711//5 8712//5 8708//5\nf 8705//6 8708//6 8712//6\nf 8714//1 8715//1 8716//1\nf 8720//2 8719//2 8718//2\nf 8717//3 8718//3 8714//3\nf 8718//4 8719//4 8715//4\nf 8719//5 8720//5 8716//5\nf 8713//6 8716//6 8720//6\nf 8721//1 8722//1 8723//1\nf 8725//2 8728//2 8727//2\nf 8725//3 8726//3 8722//3\nf 8722//4 8726//4 8727//4\nf 8727//5 8728//5 8724//5\nf 8721//6 8724//6 8728//6\nf 8729//1 8730//1 8731//1\nf 8733//2 8736//2 8735//2\nf 8733//3 8734//3 8730//3\nf 8730//4 8734//4 8735//4\nf 8735//5 8736//5 8732//5\nf 8729//6 8732//6 8736//6\nf 8738//1 8739//1 8740//1\nf 8741//2 8744//2 8743//2\nf 8741//3 8742//3 8738//3\nf 8738//4 8742//4 8743//4\nf 8743//5 8744//5 8740//5\nf 8741//6 8737//6 8740//6\nf 8746//1 8747//1 8748//1\nf 8749//2 8752//2 8751//2\nf 8749//3 8750//3 8746//3\nf 8746//4 8750//4 8751//4\nf 8751//5 8752//5 8748//5\nf 8745//6 8748//6 8752//6\nf 8754//1 8755//1 8756//1\nf 8757//2 8760//2 8759//2\nf 8757//3 8758//3 8754//3\nf 8754//4 8758//4 8759//4\nf 8759//5 8760//5 8756//5\nf 8757//6 8753//6 8756//6\nf 8762//1 8763//1 8764//1\nf 8768//2 8767//2 8766//2\nf 8765//3 8766//3 8762//3\nf 8766//4 8767//4 8763//4\nf 8767//5 8768//5 8764//5\nf 8761//6 8764//6 8768//6\nf 8770//1 8771//1 8772//1\nf 8776//2 8775//2 8774//2\nf 8773//3 8774//3 8770//3\nf 8774//4 8775//4 8771//4\nf 8775//5 8776//5 8772//5\nf 8769//6 8772//6 8776//6\nf 8778//1 8779//1 8780//1\nf 8784//2 8783//2 8782//2\nf 8781//3 8782//3 8778//3\nf 8782//4 8783//4 8779//4\nf 8783//5 8784//5 8780//5\nf 8777//6 8780//6 8784//6\nf 8786//1 8787//1 8788//1\nf 8792//2 8791//2 8790//2\nf 8789//3 8790//3 8786//3\nf 8790//4 8791//4 8787//4\nf 8791//5 8792//5 8788//5\nf 8785//6 8788//6 8792//6\nf 8794//1 8795//1 8796//1\nf 8800//2 8799//2 8798//2\nf 8797//3 8798//3 8794//3\nf 8798//4 8799//4 8795//4\nf 8799//5 8800//5 8796//5\nf 8793//6 8796//6 8800//6\nf 8804//1 8803//1 8802//1\nf 8805//2 8806//2 8807//2\nf 8801//5 8802//5 8806//5\nf 8802//4 8803//4 8807//4\nf 8804//3 8808//3 8807//3\nf 8808//6 8804//6 8801//6\nf 8812//1 8811//1 8810//1\nf 8813//2 8814//2 8815//2\nf 8809//5 8810//5 8814//5\nf 8810//4 8811//4 8815//4\nf 8812//3 8816//3 8815//3\nf 8813//6 8816//6 8812//6\nf 8820//1 8819//1 8818//1\nf 8821//2 8822//2 8823//2\nf 8817//5 8818//5 8822//5\nf 8818//4 8819//4 8823//4\nf 8820//3 8824//3 8823//3\nf 8821//6 8824//6 8820//6\nf 8828//1 8827//1 8826//1\nf 8830//2 8831//2 8832//2\nf 8825//5 8826//5 8830//5\nf 8826//4 8827//4 8831//4\nf 8828//3 8832//3 8831//3\nf 8832//6 8828//6 8825//6\nf 8836//1 8835//1 8834//1\nf 8837//2 8838//2 8839//2\nf 8833//5 8834//5 8838//5\nf 8834//4 8835//4 8839//4\nf 8836//3 8840//3 8839//3\nf 8837//6 8840//6 8836//6\nf 8844//1 8843//1 8842//1\nf 8846//2 8847//2 8848//2\nf 8841//5 8842//5 8846//5\nf 8843//4 8847//4 8846//4\nf 8844//3 8848//3 8847//3\nf 8848//6 8844//6 8841//6\nf 8852//1 8851//1 8850//1\nf 8854//2 8855//2 8856//2\nf 8849//5 8850//5 8854//5\nf 8851//4 8855//4 8854//4\nf 8852//3 8856//3 8855//3\nf 8856//6 8852//6 8849//6\nf 8860//1 8859//1 8858//1\nf 8862//2 8863//2 8864//2\nf 8857//5 8858//5 8862//5\nf 8859//4 8863//4 8862//4\nf 8860//3 8864//3 8863//3\nf 8864//6 8860//6 8857//6\nf 8868//1 8867//1 8866//1\nf 8870//2 8871//2 8872//2\nf 8865//5 8866//5 8870//5\nf 8867//4 8871//4 8870//4\nf 8868//3 8872//3 8871//3\nf 8872//6 8868//6 8865//6\nf 8876//1 8875//1 8874//1\nf 8878//2 8879//2 8880//2\nf 8873//5 8874//5 8878//5\nf 8875//4 8879//4 8878//4\nf 8876//3 8880//3 8879//3\nf 8880//6 8876//6 8873//6\nf 8884//1 8883//1 8882//1\nf 8885//2 8886//2 8887//2\nf 8882//5 8886//5 8885//5\nf 8882//4 8883//4 8887//4\nf 8884//3 8888//3 8887//3\nf 8888//6 8884//6 8881//6\nf 8892//1 8891//1 8890//1\nf 8893//2 8894//2 8895//2\nf 8889//5 8890//5 8894//5\nf 8890//4 8891//4 8895//4\nf 8892//3 8896//3 8895//3\nf 8893//6 8896//6 8892//6\nf 8900//1 8899//1 8898//1\nf 8901//2 8902//2 8903//2\nf 8897//5 8898//5 8902//5\nf 8898//4 8899//4 8903//4\nf 8900//3 8904//3 8903//3\nf 8901//6 8904//6 8900//6\nf 8908//1 8907//1 8906//1\nf 8910//2 8911//2 8912//2\nf 8905//5 8906//5 8910//5\nf 8906//4 8907//4 8911//4\nf 8908//3 8912//3 8911//3\nf 8912//6 8908//6 8905//6\nf 8916//1 8915//1 8914//1\nf 8918//2 8919//2 8920//2\nf 8913//5 8914//5 8918//5\nf 8914//4 8915//4 8919//4\nf 8916//3 8920//3 8919//3\nf 8917//6 8920//6 8916//6\nf 8924//1 8923//1 8922//1\nf 8926//2 8927//2 8928//2\nf 8921//5 8922//5 8926//5\nf 8923//4 8927//4 8926//4\nf 8924//3 8928//3 8927//3\nf 8928//6 8924//6 8921//6\nf 8932//1 8931//1 8930//1\nf 8934//2 8935//2 8936//2\nf 8929//5 8930//5 8934//5\nf 8931//4 8935//4 8934//4\nf 8932//3 8936//3 8935//3\nf 8936//6 8932//6 8929//6\nf 8940//1 8939//1 8938//1\nf 8942//2 8943//2 8944//2\nf 8937//5 8938//5 8942//5\nf 8939//4 8943//4 8942//4\nf 8940//3 8944//3 8943//3\nf 8944//6 8940//6 8937//6\nf 8948//1 8947//1 8946//1\nf 8950//2 8951//2 8952//2\nf 8945//5 8946//5 8950//5\nf 8947//4 8951//4 8950//4\nf 8948//3 8952//3 8951//3\nf 8952//6 8948//6 8945//6\nf 8956//1 8955//1 8954//1\nf 8958//2 8959//2 8960//2\nf 8953//5 8954//5 8958//5\nf 8955//4 8959//4 8958//4\nf 8956//3 8960//3 8959//3\nf 8960//6 8956//6 8953//6\nf 8961//1 8964//1 8963//1\nf 8965//2 8966//2 8967//2\nf 8962//5 8966//5 8965//5\nf 8962//4 8963//4 8967//4\nf 8964//3 8968//3 8967//3\nf 8968//6 8964//6 8961//6\nf 8972//1 8971//1 8970//1\nf 8973//2 8974//2 8975//2\nf 8970//5 8974//5 8973//5\nf 8970//4 8971//4 8975//4\nf 8972//3 8976//3 8975//3\nf 8973//6 8976//6 8972//6\nf 8980//1 8979//1 8978//1\nf 8981//2 8982//2 8983//2\nf 8977//5 8978//5 8982//5\nf 8978//4 8979//4 8983//4\nf 8980//3 8984//3 8983//3\nf 8981//6 8984//6 8980//6\nf 8988//1 8987//1 8986//1\nf 8989//2 8990//2 8991//2\nf 8985//5 8986//5 8990//5\nf 8986//4 8987//4 8991//4\nf 8988//3 8992//3 8991//3\nf 8992//6 8988//6 8985//6\nf 8996//1 8995//1 8994//1\nf 8997//2 8998//2 8999//2\nf 8994//5 8998//5 8997//5\nf 8994//4 8995//4 8999//4\nf 8996//3 9000//3 8999//3\nf 8997//6 9000//6 8996//6\nf 9004//1 9003//1 9002//1\nf 9006//2 9007//2 9008//2\nf 9001//5 9002//5 9006//5\nf 9003//4 9007//4 9006//4\nf 9004//3 9008//3 9007//3\nf 9008//6 9004//6 9001//6\nf 9012//1 9011//1 9010//1\nf 9014//2 9015//2 9016//2\nf 9009//5 9010//5 9014//5\nf 9011//4 9015//4 9014//4\nf 9012//3 9016//3 9015//3\nf 9016//6 9012//6 9009//6\nf 9020//1 9019//1 9018//1\nf 9022//2 9023//2 9024//2\nf 9017//5 9018//5 9022//5\nf 9019//4 9023//4 9022//4\nf 9020//3 9024//3 9023//3\nf 9024//6 9020//6 9017//6\nf 9028//1 9027//1 9026//1\nf 9030//2 9031//2 9032//2\nf 9025//5 9026//5 9030//5\nf 9027//4 9031//4 9030//4\nf 9028//3 9032//3 9031//3\nf 9032//6 9028//6 9025//6\nf 9036//1 9035//1 9034//1\nf 9038//2 9039//2 9040//2\nf 9033//5 9034//5 9038//5\nf 9035//4 9039//4 9038//4\nf 9036//3 9040//3 9039//3\nf 9040//6 9036//6 9033//6\nf 9041//1 9044//1 9043//1\nf 9046//2 9047//2 9048//2\nf 9041//5 9042//5 9046//5\nf 9042//4 9043//4 9047//4\nf 9044//3 9048//3 9047//3\nf 9048//6 9044//6 9041//6\nf 9049//1 9052//1 9051//1\nf 9054//2 9055//2 9056//2\nf 9049//5 9050//5 9054//5\nf 9050//4 9051//4 9055//4\nf 9052//3 9056//3 9055//3\nf 9053//6 9056//6 9052//6\nf 9060//1 9059//1 9058//1\nf 9062//2 9063//2 9064//2\nf 9057//5 9058//5 9062//5\nf 9058//4 9059//4 9063//4\nf 9060//3 9064//3 9063//3\nf 9061//6 9064//6 9060//6\nf 9068//1 9067//1 9066//1\nf 9070//2 9071//2 9072//2\nf 9065//5 9066//5 9070//5\nf 9066//4 9067//4 9071//4\nf 9068//3 9072//3 9071//3\nf 9072//6 9068//6 9065//6\nf 9076//1 9075//1 9074//1\nf 9078//2 9079//2 9080//2\nf 9073//5 9074//5 9078//5\nf 9074//4 9075//4 9079//4\nf 9076//3 9080//3 9079//3\nf 9077//6 9080//6 9076//6\nf 9084//1 9083//1 9082//1\nf 9086//2 9087//2 9088//2\nf 9081//5 9082//5 9086//5\nf 9083//4 9087//4 9086//4\nf 9084//3 9088//3 9087//3\nf 9088//6 9084//6 9081//6\nf 9092//1 9091//1 9090//1\nf 9094//2 9095//2 9096//2\nf 9089//5 9090//5 9094//5\nf 9091//4 9095//4 9094//4\nf 9092//3 9096//3 9095//3\nf 9096//6 9092//6 9089//6\nf 9100//1 9099//1 9098//1\nf 9102//2 9103//2 9104//2\nf 9097//5 9098//5 9102//5\nf 9099//4 9103//4 9102//4\nf 9100//3 9104//3 9103//3\nf 9104//6 9100//6 9097//6\nf 9108//1 9107//1 9106//1\nf 9110//2 9111//2 9112//2\nf 9105//5 9106//5 9110//5\nf 9107//4 9111//4 9110//4\nf 9108//3 9112//3 9111//3\nf 9112//6 9108//6 9105//6\nf 9116//1 9115//1 9114//1\nf 9118//2 9119//2 9120//2\nf 9113//5 9114//5 9118//5\nf 9115//4 9119//4 9118//4\nf 9116//3 9120//3 9119//3\nf 9120//6 9116//6 9113//6\nf 9121//1 9124//1 9123//1\nf 9126//2 9127//2 9128//2\nf 9121//5 9122//5 9126//5\nf 9122//4 9123//4 9127//4\nf 9124//3 9128//3 9127//3\nf 9128//6 9124//6 9121//6\nf 9129//1 9132//1 9131//1\nf 9134//2 9135//2 9136//2\nf 9129//5 9130//5 9134//5\nf 9130//4 9131//4 9135//4\nf 9132//3 9136//3 9135//3\nf 9133//6 9136//6 9132//6\nf 9140//1 9139//1 9138//1\nf 9142//2 9143//2 9144//2\nf 9137//5 9138//5 9142//5\nf 9138//4 9139//4 9143//4\nf 9140//3 9144//3 9143//3\nf 9141//6 9144//6 9140//6\nf 9148//1 9147//1 9146//1\nf 9150//2 9151//2 9152//2\nf 9145//5 9146//5 9150//5\nf 9146//4 9147//4 9151//4\nf 9148//3 9152//3 9151//3\nf 9152//6 9148//6 9145//6\nf 9156//1 9155//1 9154//1\nf 9158//2 9159//2 9160//2\nf 9153//5 9154//5 9158//5\nf 9154//4 9155//4 9159//4\nf 9156//3 9160//3 9159//3\nf 9157//6 9160//6 9156//6\nf 9164//1 9163//1 9162//1\nf 9166//2 9167//2 9168//2\nf 9161//5 9162//5 9166//5\nf 9163//4 9167//4 9166//4\nf 9164//3 9168//3 9167//3\nf 9168//6 9164//6 9161//6\nf 9172//1 9171//1 9170//1\nf 9174//2 9175//2 9176//2\nf 9169//5 9170//5 9174//5\nf 9171//4 9175//4 9174//4\nf 9172//3 9176//3 9175//3\nf 9176//6 9172//6 9169//6\nf 9180//1 9179//1 9178//1\nf 9182//2 9183//2 9184//2\nf 9177//5 9178//5 9182//5\nf 9179//4 9183//4 9182//4\nf 9180//3 9184//3 9183//3\nf 9184//6 9180//6 9177//6\nf 9188//1 9187//1 9186//1\nf 9190//2 9191//2 9192//2\nf 9185//5 9186//5 9190//5\nf 9187//4 9191//4 9190//4\nf 9188//3 9192//3 9191//3\nf 9192//6 9188//6 9185//6\nf 9196//1 9195//1 9194//1\nf 9198//2 9199//2 9200//2\nf 9193//5 9194//5 9198//5\nf 9195//4 9199//4 9198//4\nf 9196//3 9200//3 9199//3\nf 9200//6 9196//6 9193//6\nf 9201//1 9204//1 9203//1\nf 9205//2 9206//2 9207//2\nf 9202//5 9206//5 9205//5\nf 9202//4 9203//4 9207//4\nf 9204//3 9208//3 9207//3\nf 9208//6 9204//6 9201//6\nf 9209//1 9212//1 9211//1\nf 9213//2 9214//2 9215//2\nf 9210//5 9214//5 9213//5\nf 9210//4 9211//4 9215//4\nf 9212//3 9216//3 9215//3\nf 9213//6 9216//6 9212//6\nf 9220//1 9219//1 9218//1\nf 9221//2 9222//2 9223//2\nf 9218//5 9222//5 9221//5\nf 9218//4 9219//4 9223//4\nf 9220//3 9224//3 9223//3\nf 9221//6 9224//6 9220//6\nf 9228//1 9227//1 9226//1\nf 9229//2 9230//2 9231//2\nf 9226//5 9230//5 9229//5\nf 9226//4 9227//4 9231//4\nf 9228//3 9232//3 9231//3\nf 9232//6 9228//6 9225//6\nf 9236//1 9235//1 9234//1\nf 9237//2 9238//2 9239//2\nf 9234//5 9238//5 9237//5\nf 9234//4 9235//4 9239//4\nf 9236//3 9240//3 9239//3\nf 9237//6 9240//6 9236//6\nf 9244//1 9243//1 9242//1\nf 9246//2 9247//2 9248//2\nf 9242//5 9246//5 9245//5\nf 9243//4 9247//4 9246//4\nf 9244//3 9248//3 9247//3\nf 9248//6 9244//6 9241//6\nf 9252//1 9251//1 9250//1\nf 9254//2 9255//2 9256//2\nf 9250//5 9254//5 9253//5\nf 9251//4 9255//4 9254//4\nf 9252//3 9256//3 9255//3\nf 9256//6 9252//6 9249//6\nf 9260//1 9259//1 9258//1\nf 9262//2 9263//2 9264//2\nf 9258//5 9262//5 9261//5\nf 9259//4 9263//4 9262//4\nf 9260//3 9264//3 9263//3\nf 9264//6 9260//6 9257//6\nf 9268//1 9267//1 9266//1\nf 9270//2 9271//2 9272//2\nf 9266//5 9270//5 9269//5\nf 9267//4 9271//4 9270//4\nf 9268//3 9272//3 9271//3\nf 9272//6 9268//6 9265//6\nf 9276//1 9275//1 9274//1\nf 9278//2 9279//2 9280//2\nf 9274//5 9278//5 9277//5\nf 9275//4 9279//4 9278//4\nf 9276//3 9280//3 9279//3\nf 9280//6 9276//6 9273//6\nf 9281//1 9284//1 9283//1\nf 9285//2 9286//2 9287//2\nf 9282//5 9286//5 9285//5\nf 9282//4 9283//4 9287//4\nf 9284//3 9288//3 9287//3\nf 9288//6 9284//6 9281//6\nf 9289//1 9292//1 9291//1\nf 9293//2 9294//2 9295//2\nf 9290//5 9294//5 9293//5\nf 9290//4 9291//4 9295//4\nf 9292//3 9296//3 9295//3\nf 9293//6 9296//6 9292//6\nf 9300//1 9299//1 9298//1\nf 9301//2 9302//2 9303//2\nf 9298//5 9302//5 9301//5\nf 9298//4 9299//4 9303//4\nf 9300//3 9304//3 9303//3\nf 9301//6 9304//6 9300//6\nf 9308//1 9307//1 9306//1\nf 9309//2 9310//2 9311//2\nf 9306//5 9310//5 9309//5\nf 9306//4 9307//4 9311//4\nf 9308//3 9312//3 9311//3\nf 9312//6 9308//6 9305//6\nf 9316//1 9315//1 9314//1\nf 9317//2 9318//2 9319//2\nf 9314//5 9318//5 9317//5\nf 9314//4 9315//4 9319//4\nf 9316//3 9320//3 9319//3\nf 9317//6 9320//6 9316//6\nf 9324//1 9323//1 9322//1\nf 9326//2 9327//2 9328//2\nf 9322//5 9326//5 9325//5\nf 9323//4 9327//4 9326//4\nf 9324//3 9328//3 9327//3\nf 9328//6 9324//6 9321//6\nf 9332//1 9331//1 9330//1\nf 9334//2 9335//2 9336//2\nf 9330//5 9334//5 9333//5\nf 9331//4 9335//4 9334//4\nf 9332//3 9336//3 9335//3\nf 9336//6 9332//6 9329//6\nf 9340//1 9339//1 9338//1\nf 9342//2 9343//2 9344//2\nf 9338//5 9342//5 9341//5\nf 9339//4 9343//4 9342//4\nf 9340//3 9344//3 9343//3\nf 9344//6 9340//6 9337//6\nf 9348//1 9347//1 9346//1\nf 9350//2 9351//2 9352//2\nf 9346//5 9350//5 9349//5\nf 9347//4 9351//4 9350//4\nf 9348//3 9352//3 9351//3\nf 9352//6 9348//6 9345//6\nf 9356//1 9355//1 9354//1\nf 9358//2 9359//2 9360//2\nf 9354//5 9358//5 9357//5\nf 9355//4 9359//4 9358//4\nf 9356//3 9360//3 9359//3\nf 9360//6 9356//6 9353//6\nf 9361//1 9364//1 9363//1\nf 9365//2 9366//2 9367//2\nf 9362//5 9366//5 9365//5\nf 9362//4 9363//4 9367//4\nf 9364//3 9368//3 9367//3\nf 9368//6 9364//6 9361//6\nf 9369//1 9372//1 9371//1\nf 9373//2 9374//2 9375//2\nf 9370//5 9374//5 9373//5\nf 9370//4 9371//4 9375//4\nf 9372//3 9376//3 9375//3\nf 9373//6 9376//6 9372//6\nf 9380//1 9379//1 9378//1\nf 9381//2 9382//2 9383//2\nf 9378//5 9382//5 9381//5\nf 9378//4 9379//4 9383//4\nf 9380//3 9384//3 9383//3\nf 9381//6 9384//6 9380//6\nf 9388//1 9387//1 9386//1\nf 9389//2 9390//2 9391//2\nf 9386//5 9390//5 9389//5\nf 9386//4 9387//4 9391//4\nf 9388//3 9392//3 9391//3\nf 9392//6 9388//6 9385//6\nf 9396//1 9395//1 9394//1\nf 9397//2 9398//2 9399//2\nf 9394//5 9398//5 9397//5\nf 9394//4 9395//4 9399//4\nf 9396//3 9400//3 9399//3\nf 9397//6 9400//6 9396//6\nf 9404//1 9403//1 9402//1\nf 9406//2 9407//2 9408//2\nf 9402//5 9406//5 9405//5\nf 9403//4 9407//4 9406//4\nf 9404//3 9408//3 9407//3\nf 9408//6 9404//6 9401//6\nf 9412//1 9411//1 9410//1\nf 9414//2 9415//2 9416//2\nf 9410//5 9414//5 9413//5\nf 9411//4 9415//4 9414//4\nf 9412//3 9416//3 9415//3\nf 9416//6 9412//6 9409//6\nf 9420//1 9419//1 9418//1\nf 9422//2 9423//2 9424//2\nf 9418//5 9422//5 9421//5\nf 9419//4 9423//4 9422//4\nf 9420//3 9424//3 9423//3\nf 9424//6 9420//6 9417//6\nf 9428//1 9427//1 9426//1\nf 9430//2 9431//2 9432//2\nf 9426//5 9430//5 9429//5\nf 9427//4 9431//4 9430//4\nf 9428//3 9432//3 9431//3\nf 9432//6 9428//6 9425//6\nf 9436//1 9435//1 9434//1\nf 9438//2 9439//2 9440//2\nf 9434//5 9438//5 9437//5\nf 9435//4 9439//4 9438//4\nf 9436//3 9440//3 9439//3\nf 9440//6 9436//6 9433//6\nf 9441//1 9444//1 9443//1\nf 9445//2 9446//2 9447//2\nf 9442//5 9446//5 9445//5\nf 9442//4 9443//4 9447//4\nf 9444//3 9448//3 9447//3\nf 9448//6 9444//6 9441//6\nf 9449//1 9452//1 9451//1\nf 9453//2 9454//2 9455//2\nf 9450//5 9454//5 9453//5\nf 9450//4 9451//4 9455//4\nf 9452//3 9456//3 9455//3\nf 9453//6 9456//6 9452//6\nf 9460//1 9459//1 9458//1\nf 9461//2 9462//2 9463//2\nf 9458//5 9462//5 9461//5\nf 9458//4 9459//4 9463//4\nf 9460//3 9464//3 9463//3\nf 9461//6 9464//6 9460//6\nf 9468//1 9467//1 9466//1\nf 9469//2 9470//2 9471//2\nf 9466//5 9470//5 9469//5\nf 9466//4 9467//4 9471//4\nf 9468//3 9472//3 9471//3\nf 9472//6 9468//6 9465//6\nf 9476//1 9475//1 9474//1\nf 9477//2 9478//2 9479//2\nf 9474//5 9478//5 9477//5\nf 9474//4 9475//4 9479//4\nf 9476//3 9480//3 9479//3\nf 9477//6 9480//6 9476//6\nf 9484//1 9483//1 9482//1\nf 9486//2 9487//2 9488//2\nf 9482//5 9486//5 9485//5\nf 9483//4 9487//4 9486//4\nf 9484//3 9488//3 9487//3\nf 9488//6 9484//6 9481//6\nf 9492//1 9491//1 9490//1\nf 9494//2 9495//2 9496//2\nf 9490//5 9494//5 9493//5\nf 9491//4 9495//4 9494//4\nf 9492//3 9496//3 9495//3\nf 9496//6 9492//6 9489//6\nf 9500//1 9499//1 9498//1\nf 9502//2 9503//2 9504//2\nf 9498//5 9502//5 9501//5\nf 9499//4 9503//4 9502//4\nf 9500//3 9504//3 9503//3\nf 9504//6 9500//6 9497//6\nf 9508//1 9507//1 9506//1\nf 9510//2 9511//2 9512//2\nf 9506//5 9510//5 9509//5\nf 9507//4 9511//4 9510//4\nf 9508//3 9512//3 9511//3\nf 9512//6 9508//6 9505//6\nf 9516//1 9515//1 9514//1\nf 9518//2 9519//2 9520//2\nf 9514//5 9518//5 9517//5\nf 9515//4 9519//4 9518//4\nf 9516//3 9520//3 9519//3\nf 9520//6 9516//6 9513//6\nf 9521//1 9524//1 9523//1\nf 9525//2 9526//2 9527//2\nf 9522//5 9526//5 9525//5\nf 9522//4 9523//4 9527//4\nf 9524//3 9528//3 9527//3\nf 9528//6 9524//6 9521//6\nf 9529//1 9532//1 9531//1\nf 9533//2 9534//2 9535//2\nf 9530//5 9534//5 9533//5\nf 9530//4 9531//4 9535//4\nf 9532//3 9536//3 9535//3\nf 9533//6 9536//6 9532//6\nf 9540//1 9539//1 9538//1\nf 9541//2 9542//2 9543//2\nf 9538//5 9542//5 9541//5\nf 9538//4 9539//4 9543//4\nf 9540//3 9544//3 9543//3\nf 9541//6 9544//6 9540//6\nf 9548//1 9547//1 9546//1\nf 9549//2 9550//2 9551//2\nf 9546//5 9550//5 9549//5\nf 9546//4 9547//4 9551//4\nf 9548//3 9552//3 9551//3\nf 9552//6 9548//6 9545//6\nf 9556//1 9555//1 9554//1\nf 9557//2 9558//2 9559//2\nf 9554//5 9558//5 9557//5\nf 9554//4 9555//4 9559//4\nf 9556//3 9560//3 9559//3\nf 9557//6 9560//6 9556//6\nf 9564//1 9563//1 9562//1\nf 9566//2 9567//2 9568//2\nf 9562//5 9566//5 9565//5\nf 9563//4 9567//4 9566//4\nf 9564//3 9568//3 9567//3\nf 9568//6 9564//6 9561//6\nf 9572//1 9571//1 9570//1\nf 9574//2 9575//2 9576//2\nf 9570//5 9574//5 9573//5\nf 9571//4 9575//4 9574//4\nf 9572//3 9576//3 9575//3\nf 9576//6 9572//6 9569//6\nf 9580//1 9579//1 9578//1\nf 9582//2 9583//2 9584//2\nf 9578//5 9582//5 9581//5\nf 9579//4 9583//4 9582//4\nf 9580//3 9584//3 9583//3\nf 9584//6 9580//6 9577//6\nf 9588//1 9587//1 9586//1\nf 9590//2 9591//2 9592//2\nf 9586//5 9590//5 9589//5\nf 9587//4 9591//4 9590//4\nf 9588//3 9592//3 9591//3\nf 9592//6 9588//6 9585//6\nf 9596//1 9595//1 9594//1\nf 9598//2 9599//2 9600//2\nf 9594//5 9598//5 9597//5\nf 9595//4 9599//4 9598//4\nf 9596//3 9600//3 9599//3\nf 9600//6 9596//6 9593//6\nf 9602//1 9603//1 9604//1\nf 9608//2 9607//2 9606//2\nf 9601//3 9605//3 9606//3\nf 9602//4 9606//4 9607//4\nf 9607//5 9608//5 9604//5\nf 9601//6 9604//6 9608//6\nf 9610//1 9611//1 9612//1\nf 9613//2 9616//2 9615//2\nf 9609//3 9613//3 9614//3\nf 9610//4 9614//4 9615//4\nf 9615//5 9616//5 9612//5\nf 9609//6 9612//6 9616//6\nf 9618//1 9619//1 9620//1\nf 9624//2 9623//2 9622//2\nf 9617//3 9621//3 9622//3\nf 9618//4 9622//4 9623//4\nf 9623//5 9624//5 9620//5\nf 9621//6 9617//6 9620//6\nf 9626//1 9627//1 9628//1\nf 9632//2 9631//2 9630//2\nf 9625//3 9629//3 9630//3\nf 9626//4 9630//4 9631//4\nf 9631//5 9632//5 9628//5\nf 9625//6 9628//6 9632//6\nf 9634//1 9635//1 9636//1\nf 9637//2 9640//2 9639//2\nf 9633//3 9637//3 9638//3\nf 9634//4 9638//4 9639//4\nf 9639//5 9640//5 9636//5\nf 9637//6 9633//6 9636//6\nf 9642//1 9643//1 9644//1\nf 9648//2 9647//2 9646//2\nf 9641//3 9645//3 9646//3\nf 9646//4 9647//4 9643//4\nf 9647//5 9648//5 9644//5\nf 9641//6 9644//6 9648//6\nf 9650//1 9651//1 9652//1\nf 9656//2 9655//2 9654//2\nf 9649//3 9653//3 9654//3\nf 9654//4 9655//4 9651//4\nf 9655//5 9656//5 9652//5\nf 9649//6 9652//6 9656//6\nf 9658//1 9659//1 9660//1\nf 9664//2 9663//2 9662//2\nf 9657//3 9661//3 9662//3\nf 9662//4 9663//4 9659//4\nf 9663//5 9664//5 9660//5\nf 9657//6 9660//6 9664//6\nf 9666//1 9667//1 9668//1\nf 9672//2 9671//2 9670//2\nf 9665//3 9669//3 9670//3\nf 9670//4 9671//4 9667//4\nf 9671//5 9672//5 9668//5\nf 9665//6 9668//6 9672//6\nf 9674//1 9675//1 9676//1\nf 9680//2 9679//2 9678//2\nf 9673//3 9677//3 9678//3\nf 9678//4 9679//4 9675//4\nf 9679//5 9680//5 9676//5\nf 9673//6 9676//6 9680//6\nf 9682//1 9683//1 9684//1\nf 9688//2 9687//2 9686//2\nf 9685//3 9686//3 9682//3\nf 9682//4 9686//4 9687//4\nf 9687//5 9688//5 9684//5\nf 9681//6 9684//6 9688//6\nf 9690//1 9691//1 9692//1\nf 9693//2 9696//2 9695//2\nf 9689//3 9693//3 9694//3\nf 9690//4 9694//4 9695//4\nf 9695//5 9696//5 9692//5\nf 9689//6 9692//6 9696//6\nf 9698//1 9699//1 9700//1\nf 9704//2 9703//2 9702//2\nf 9697//3 9701//3 9702//3\nf 9698//4 9702//4 9703//4\nf 9703//5 9704//5 9700//5\nf 9701//6 9697//6 9700//6\nf 9706//1 9707//1 9708//1\nf 9712//2 9711//2 9710//2\nf 9705//3 9709//3 9710//3\nf 9706//4 9710//4 9711//4\nf 9711//5 9712//5 9708//5\nf 9705//6 9708//6 9712//6\nf 9714//1 9715//1 9716//1\nf 9717//2 9720//2 9719//2\nf 9713//3 9717//3 9718//3\nf 9714//4 9718//4 9719//4\nf 9719//5 9720//5 9716//5\nf 9717//6 9713//6 9716//6\nf 9722//1 9723//1 9724//1\nf 9728//2 9727//2 9726//2\nf 9721//3 9725//3 9726//3\nf 9726//4 9727//4 9723//4\nf 9727//5 9728//5 9724//5\nf 9721//6 9724//6 9728//6\nf 9730//1 9731//1 9732//1\nf 9736//2 9735//2 9734//2\nf 9729//3 9733//3 9734//3\nf 9734//4 9735//4 9731//4\nf 9735//5 9736//5 9732//5\nf 9729//6 9732//6 9736//6\nf 9738//1 9739//1 9740//1\nf 9744//2 9743//2 9742//2\nf 9737//3 9741//3 9742//3\nf 9742//4 9743//4 9739//4\nf 9743//5 9744//5 9740//5\nf 9737//6 9740//6 9744//6\nf 9746//1 9747//1 9748//1\nf 9752//2 9751//2 9750//2\nf 9745//3 9749//3 9750//3\nf 9750//4 9751//4 9747//4\nf 9751//5 9752//5 9748//5\nf 9745//6 9748//6 9752//6\nf 9754//1 9755//1 9756//1\nf 9760//2 9759//2 9758//2\nf 9753//3 9757//3 9758//3\nf 9758//4 9759//4 9755//4\nf 9759//5 9760//5 9756//5\nf 9753//6 9756//6 9760//6\nf 9762//1 9763//1 9764//1\nf 9765//2 9768//2 9767//2\nf 9765//3 9766//3 9762//3\nf 9762//4 9766//4 9767//4\nf 9767//5 9768//5 9764//5\nf 9761//6 9764//6 9768//6\nf 9770//1 9771//1 9772//1\nf 9773//2 9776//2 9775//2\nf 9773//3 9774//3 9770//3\nf 9770//4 9774//4 9775//4\nf 9775//5 9776//5 9772//5\nf 9769//6 9772//6 9776//6\nf 9778//1 9779//1 9780//1\nf 9781//2 9784//2 9783//2\nf 9777//3 9781//3 9782//3\nf 9778//4 9782//4 9783//4\nf 9783//5 9784//5 9780//5\nf 9781//6 9777//6 9780//6\nf 9786//1 9787//1 9788//1\nf 9789//2 9792//2 9791//2\nf 9785//3 9789//3 9790//3\nf 9786//4 9790//4 9791//4\nf 9791//5 9792//5 9788//5\nf 9785//6 9788//6 9792//6\nf 9794//1 9795//1 9796//1\nf 9797//2 9800//2 9799//2\nf 9797//3 9798//3 9794//3\nf 9794//4 9798//4 9799//4\nf 9799//5 9800//5 9796//5\nf 9797//6 9793//6 9796//6\nf 9802//1 9803//1 9804//1\nf 9808//2 9807//2 9806//2\nf 9801//3 9805//3 9806//3\nf 9806//4 9807//4 9803//4\nf 9807//5 9808//5 9804//5\nf 9801//6 9804//6 9808//6\nf 9810//1 9811//1 9812//1\nf 9816//2 9815//2 9814//2\nf 9809//3 9813//3 9814//3\nf 9814//4 9815//4 9811//4\nf 9815//5 9816//5 9812//5\nf 9809//6 9812//6 9816//6\nf 9818//1 9819//1 9820//1\nf 9824//2 9823//2 9822//2\nf 9817//3 9821//3 9822//3\nf 9822//4 9823//4 9819//4\nf 9823//5 9824//5 9820//5\nf 9817//6 9820//6 9824//6\nf 9826//1 9827//1 9828//1\nf 9832//2 9831//2 9830//2\nf 9825//3 9829//3 9830//3\nf 9830//4 9831//4 9827//4\nf 9831//5 9832//5 9828//5\nf 9825//6 9828//6 9832//6\nf 9834//1 9835//1 9836//1\nf 9840//2 9839//2 9838//2\nf 9833//3 9837//3 9838//3\nf 9838//4 9839//4 9835//4\nf 9839//5 9840//5 9836//5\nf 9833//6 9836//6 9840//6\nf 9841//1 9842//1 9843//1\nf 9848//2 9847//2 9846//2\nf 9841//3 9845//3 9846//3\nf 9842//4 9846//4 9847//4\nf 9847//5 9848//5 9844//5\nf 9841//6 9844//6 9848//6\nf 9849//1 9850//1 9851//1\nf 9856//2 9855//2 9854//2\nf 9849//3 9853//3 9854//3\nf 9850//4 9854//4 9855//4\nf 9855//5 9856//5 9852//5\nf 9849//6 9852//6 9856//6\nf 9858//1 9859//1 9860//1\nf 9864//2 9863//2 9862//2\nf 9857//3 9861//3 9862//3\nf 9858//4 9862//4 9863//4\nf 9863//5 9864//5 9860//5\nf 9861//6 9857//6 9860//6\nf 9866//1 9867//1 9868//1\nf 9872//2 9871//2 9870//2\nf 9865//3 9869//3 9870//3\nf 9866//4 9870//4 9871//4\nf 9871//5 9872//5 9868//5\nf 9865//6 9868//6 9872//6\nf 9874//1 9875//1 9876//1\nf 9880//2 9879//2 9878//2\nf 9873//3 9877//3 9878//3\nf 9874//4 9878//4 9879//4\nf 9879//5 9880//5 9876//5\nf 9877//6 9873//6 9876//6\nf 9882//1 9883//1 9884//1\nf 9888//2 9887//2 9886//2\nf 9881//3 9885//3 9886//3\nf 9886//4 9887//4 9883//4\nf 9887//5 9888//5 9884//5\nf 9881//6 9884//6 9888//6\nf 9890//1 9891//1 9892//1\nf 9896//2 9895//2 9894//2\nf 9889//3 9893//3 9894//3\nf 9894//4 9895//4 9891//4\nf 9895//5 9896//5 9892//5\nf 9889//6 9892//6 9896//6\nf 9898//1 9899//1 9900//1\nf 9904//2 9903//2 9902//2\nf 9897//3 9901//3 9902//3\nf 9902//4 9903//4 9899//4\nf 9903//5 9904//5 9900//5\nf 9897//6 9900//6 9904//6\nf 9906//1 9907//1 9908//1\nf 9912//2 9911//2 9910//2\nf 9905//3 9909//3 9910//3\nf 9910//4 9911//4 9907//4\nf 9911//5 9912//5 9908//5\nf 9905//6 9908//6 9912//6\nf 9914//1 9915//1 9916//1\nf 9920//2 9919//2 9918//2\nf 9913//3 9917//3 9918//3\nf 9918//4 9919//4 9915//4\nf 9919//5 9920//5 9916//5\nf 9913//6 9916//6 9920//6\nf 9921//1 9922//1 9923//1\nf 9928//2 9927//2 9926//2\nf 9921//3 9925//3 9926//3\nf 9922//4 9926//4 9927//4\nf 9927//5 9928//5 9924//5\nf 9921//6 9924//6 9928//6\nf 9929//1 9930//1 9931//1\nf 9936//2 9935//2 9934//2\nf 9929//3 9933//3 9934//3\nf 9930//4 9934//4 9935//4\nf 9935//5 9936//5 9932//5\nf 9929//6 9932//6 9936//6\nf 9938//1 9939//1 9940//1\nf 9944//2 9943//2 9942//2\nf 9937//3 9941//3 9942//3\nf 9938//4 9942//4 9943//4\nf 9943//5 9944//5 9940//5\nf 9941//6 9937//6 9940//6\nf 9946//1 9947//1 9948//1\nf 9952//2 9951//2 9950//2\nf 9945//3 9949//3 9950//3\nf 9946//4 9950//4 9951//4\nf 9951//5 9952//5 9948//5\nf 9945//6 9948//6 9952//6\nf 9954//1 9955//1 9956//1\nf 9960//2 9959//2 9958//2\nf 9953//3 9957//3 9958//3\nf 9954//4 9958//4 9959//4\nf 9959//5 9960//5 9956//5\nf 9957//6 9953//6 9956//6\nf 9962//1 9963//1 9964//1\nf 9968//2 9967//2 9966//2\nf 9961//3 9965//3 9966//3\nf 9966//4 9967//4 9963//4\nf 9967//5 9968//5 9964//5\nf 9961//6 9964//6 9968//6\nf 9970//1 9971//1 9972//1\nf 9976//2 9975//2 9974//2\nf 9969//3 9973//3 9974//3\nf 9974//4 9975//4 9971//4\nf 9975//5 9976//5 9972//5\nf 9969//6 9972//6 9976//6\nf 9978//1 9979//1 9980//1\nf 9984//2 9983//2 9982//2\nf 9977//3 9981//3 9982//3\nf 9982//4 9983//4 9979//4\nf 9983//5 9984//5 9980//5\nf 9977//6 9980//6 9984//6\nf 9986//1 9987//1 9988//1\nf 9992//2 9991//2 9990//2\nf 9985//3 9989//3 9990//3\nf 9990//4 9991//4 9987//4\nf 9991//5 9992//5 9988//5\nf 9985//6 9988//6 9992//6\nf 9994//1 9995//1 9996//1\nf 10000//2 9999//2 9998//2\nf 9993//3 9997//3 9998//3\nf 9998//4 9999//4 9995//4\nf 9999//5 10000//5 9996//5\nf 9993//6 9996//6 10000//6\nf 10001//1 10002//1 10003//1\nf 10005//2 10008//2 10007//2\nf 10005//3 10006//3 10002//3\nf 10002//4 10006//4 10007//4\nf 10007//5 10008//5 10004//5\nf 10001//6 10004//6 10008//6\nf 10009//1 10010//1 10011//1\nf 10013//2 10016//2 10015//2\nf 10013//3 10014//3 10010//3\nf 10010//4 10014//4 10015//4\nf 10015//5 10016//5 10012//5\nf 10009//6 10012//6 10016//6\nf 10018//1 10019//1 10020//1\nf 10021//2 10024//2 10023//2\nf 10021//3 10022//3 10018//3\nf 10018//4 10022//4 10023//4\nf 10023//5 10024//5 10020//5\nf 10021//6 10017//6 10020//6\nf 10026//1 10027//1 10028//1\nf 10029//2 10032//2 10031//2\nf 10029//3 10030//3 10026//3\nf 10026//4 10030//4 10031//4\nf 10031//5 10032//5 10028//5\nf 10025//6 10028//6 10032//6\nf 10034//1 10035//1 10036//1\nf 10037//2 10040//2 10039//2\nf 10037//3 10038//3 10034//3\nf 10034//4 10038//4 10039//4\nf 10039//5 10040//5 10036//5\nf 10037//6 10033//6 10036//6\nf 10042//1 10043//1 10044//1\nf 10048//2 10047//2 10046//2\nf 10045//3 10046//3 10042//3\nf 10046//4 10047//4 10043//4\nf 10047//5 10048//5 10044//5\nf 10041//6 10044//6 10048//6\nf 10050//1 10051//1 10052//1\nf 10056//2 10055//2 10054//2\nf 10053//3 10054//3 10050//3\nf 10054//4 10055//4 10051//4\nf 10055//5 10056//5 10052//5\nf 10049//6 10052//6 10056//6\nf 10058//1 10059//1 10060//1\nf 10064//2 10063//2 10062//2\nf 10061//3 10062//3 10058//3\nf 10062//4 10063//4 10059//4\nf 10063//5 10064//5 10060//5\nf 10057//6 10060//6 10064//6\nf 10066//1 10067//1 10068//1\nf 10072//2 10071//2 10070//2\nf 10069//3 10070//3 10066//3\nf 10070//4 10071//4 10067//4\nf 10071//5 10072//5 10068//5\nf 10065//6 10068//6 10072//6\nf 10074//1 10075//1 10076//1\nf 10080//2 10079//2 10078//2\nf 10077//3 10078//3 10074//3\nf 10078//4 10079//4 10075//4\nf 10079//5 10080//5 10076//5\nf 10073//6 10076//6 10080//6\nf 10081//1 10082//1 10083//1\nf 10085//2 10088//2 10087//2\nf 10085//3 10086//3 10082//3\nf 10082//4 10086//4 10087//4\nf 10087//5 10088//5 10084//5\nf 10081//6 10084//6 10088//6\nf 10089//1 10090//1 10091//1\nf 10093//2 10096//2 10095//2\nf 10093//3 10094//3 10090//3\nf 10090//4 10094//4 10095//4\nf 10095//5 10096//5 10092//5\nf 10089//6 10092//6 10096//6\nf 10098//1 10099//1 10100//1\nf 10101//2 10104//2 10103//2\nf 10101//3 10102//3 10098//3\nf 10098//4 10102//4 10103//4\nf 10103//5 10104//5 10100//5\nf 10101//6 10097//6 10100//6\nf 10106//1 10107//1 10108//1\nf 10109//2 10112//2 10111//2\nf 10109//3 10110//3 10106//3\nf 10106//4 10110//4 10111//4\nf 10111//5 10112//5 10108//5\nf 10105//6 10108//6 10112//6\nf 10114//1 10115//1 10116//1\nf 10117//2 10120//2 10119//2\nf 10117//3 10118//3 10114//3\nf 10114//4 10118//4 10119//4\nf 10119//5 10120//5 10116//5\nf 10117//6 10113//6 10116//6\nf 10122//1 10123//1 10124//1\nf 10128//2 10127//2 10126//2\nf 10125//3 10126//3 10122//3\nf 10126//4 10127//4 10123//4\nf 10127//5 10128//5 10124//5\nf 10121//6 10124//6 10128//6\nf 10130//1 10131//1 10132//1\nf 10136//2 10135//2 10134//2\nf 10133//3 10134//3 10130//3\nf 10134//4 10135//4 10131//4\nf 10135//5 10136//5 10132//5\nf 10129//6 10132//6 10136//6\nf 10138//1 10139//1 10140//1\nf 10144//2 10143//2 10142//2\nf 10141//3 10142//3 10138//3\nf 10142//4 10143//4 10139//4\nf 10143//5 10144//5 10140//5\nf 10137//6 10140//6 10144//6\nf 10146//1 10147//1 10148//1\nf 10152//2 10151//2 10150//2\nf 10149//3 10150//3 10146//3\nf 10150//4 10151//4 10147//4\nf 10151//5 10152//5 10148//5\nf 10145//6 10148//6 10152//6\nf 10154//1 10155//1 10156//1\nf 10160//2 10159//2 10158//2\nf 10157//3 10158//3 10154//3\nf 10158//4 10159//4 10155//4\nf 10159//5 10160//5 10156//5\nf 10153//6 10156//6 10160//6\nf 10161//1 10162//1 10163//1\nf 10165//2 10168//2 10167//2\nf 10165//3 10166//3 10162//3\nf 10162//4 10166//4 10167//4\nf 10167//5 10168//5 10164//5\nf 10161//6 10164//6 10168//6\nf 10169//1 10170//1 10171//1\nf 10173//2 10176//2 10175//2\nf 10173//3 10174//3 10170//3\nf 10170//4 10174//4 10175//4\nf 10175//5 10176//5 10172//5\nf 10169//6 10172//6 10176//6\nf 10178//1 10179//1 10180//1\nf 10181//2 10184//2 10183//2\nf 10181//3 10182//3 10178//3\nf 10178//4 10182//4 10183//4\nf 10183//5 10184//5 10180//5\nf 10181//6 10177//6 10180//6\nf 10186//1 10187//1 10188//1\nf 10189//2 10192//2 10191//2\nf 10189//3 10190//3 10186//3\nf 10186//4 10190//4 10191//4\nf 10191//5 10192//5 10188//5\nf 10185//6 10188//6 10192//6\nf 10194//1 10195//1 10196//1\nf 10197//2 10200//2 10199//2\nf 10197//3 10198//3 10194//3\nf 10194//4 10198//4 10199//4\nf 10199//5 10200//5 10196//5\nf 10197//6 10193//6 10196//6\nf 10202//1 10203//1 10204//1\nf 10208//2 10207//2 10206//2\nf 10205//3 10206//3 10202//3\nf 10206//4 10207//4 10203//4\nf 10207//5 10208//5 10204//5\nf 10201//6 10204//6 10208//6\nf 10210//1 10211//1 10212//1\nf 10216//2 10215//2 10214//2\nf 10213//3 10214//3 10210//3\nf 10214//4 10215//4 10211//4\nf 10215//5 10216//5 10212//5\nf 10209//6 10212//6 10216//6\nf 10218//1 10219//1 10220//1\nf 10224//2 10223//2 10222//2\nf 10221//3 10222//3 10218//3\nf 10222//4 10223//4 10219//4\nf 10223//5 10224//5 10220//5\nf 10217//6 10220//6 10224//6\nf 10226//1 10227//1 10228//1\nf 10232//2 10231//2 10230//2\nf 10229//3 10230//3 10226//3\nf 10230//4 10231//4 10227//4\nf 10231//5 10232//5 10228//5\nf 10225//6 10228//6 10232//6\nf 10234//1 10235//1 10236//1\nf 10240//2 10239//2 10238//2\nf 10237//3 10238//3 10234//3\nf 10238//4 10239//4 10235//4\nf 10239//5 10240//5 10236//5\nf 10233//6 10236//6 10240//6\nf 10241//1 10242//1 10243//1\nf 10245//2 10248//2 10247//2\nf 10245//3 10246//3 10242//3\nf 10242//4 10246//4 10247//4\nf 10247//5 10248//5 10244//5\nf 10241//6 10244//6 10248//6\nf 10249//1 10250//1 10251//1\nf 10253//2 10256//2 10255//2\nf 10253//3 10254//3 10250//3\nf 10250//4 10254//4 10255//4\nf 10255//5 10256//5 10252//5\nf 10249//6 10252//6 10256//6\nf 10258//1 10259//1 10260//1\nf 10261//2 10264//2 10263//2\nf 10261//3 10262//3 10258//3\nf 10258//4 10262//4 10263//4\nf 10263//5 10264//5 10260//5\nf 10261//6 10257//6 10260//6\nf 10266//1 10267//1 10268//1\nf 10269//2 10272//2 10271//2\nf 10269//3 10270//3 10266//3\nf 10266//4 10270//4 10271//4\nf 10271//5 10272//5 10268//5\nf 10265//6 10268//6 10272//6\nf 10274//1 10275//1 10276//1\nf 10277//2 10280//2 10279//2\nf 10277//3 10278//3 10274//3\nf 10274//4 10278//4 10279//4\nf 10279//5 10280//5 10276//5\nf 10277//6 10273//6 10276//6\nf 10282//1 10283//1 10284//1\nf 10288//2 10287//2 10286//2\nf 10285//3 10286//3 10282//3\nf 10286//4 10287//4 10283//4\nf 10287//5 10288//5 10284//5\nf 10281//6 10284//6 10288//6\nf 10290//1 10291//1 10292//1\nf 10296//2 10295//2 10294//2\nf 10293//3 10294//3 10290//3\nf 10294//4 10295//4 10291//4\nf 10295//5 10296//5 10292//5\nf 10289//6 10292//6 10296//6\nf 10298//1 10299//1 10300//1\nf 10304//2 10303//2 10302//2\nf 10301//3 10302//3 10298//3\nf 10302//4 10303//4 10299//4\nf 10303//5 10304//5 10300//5\nf 10297//6 10300//6 10304//6\nf 10306//1 10307//1 10308//1\nf 10312//2 10311//2 10310//2\nf 10309//3 10310//3 10306//3\nf 10310//4 10311//4 10307//4\nf 10311//5 10312//5 10308//5\nf 10305//6 10308//6 10312//6\nf 10314//1 10315//1 10316//1\nf 10320//2 10319//2 10318//2\nf 10317//3 10318//3 10314//3\nf 10318//4 10319//4 10315//4\nf 10319//5 10320//5 10316//5\nf 10313//6 10316//6 10320//6\nf 10321//1 10322//1 10323//1\nf 10325//2 10328//2 10327//2\nf 10325//3 10326//3 10322//3\nf 10322//4 10326//4 10327//4\nf 10327//5 10328//5 10324//5\nf 10321//6 10324//6 10328//6\nf 10329//1 10330//1 10331//1\nf 10333//2 10336//2 10335//2\nf 10333//3 10334//3 10330//3\nf 10330//4 10334//4 10335//4\nf 10335//5 10336//5 10332//5\nf 10329//6 10332//6 10336//6\nf 10338//1 10339//1 10340//1\nf 10341//2 10344//2 10343//2\nf 10341//3 10342//3 10338//3\nf 10338//4 10342//4 10343//4\nf 10343//5 10344//5 10340//5\nf 10341//6 10337//6 10340//6\nf 10346//1 10347//1 10348//1\nf 10349//2 10352//2 10351//2\nf 10349//3 10350//3 10346//3\nf 10346//4 10350//4 10351//4\nf 10351//5 10352//5 10348//5\nf 10345//6 10348//6 10352//6\nf 10354//1 10355//1 10356//1\nf 10357//2 10360//2 10359//2\nf 10357//3 10358//3 10354//3\nf 10354//4 10358//4 10359//4\nf 10359//5 10360//5 10356//5\nf 10357//6 10353//6 10356//6\nf 10362//1 10363//1 10364//1\nf 10368//2 10367//2 10366//2\nf 10365//3 10366//3 10362//3\nf 10366//4 10367//4 10363//4\nf 10367//5 10368//5 10364//5\nf 10361//6 10364//6 10368//6\nf 10370//1 10371//1 10372//1\nf 10376//2 10375//2 10374//2\nf 10373//3 10374//3 10370//3\nf 10374//4 10375//4 10371//4\nf 10375//5 10376//5 10372//5\nf 10369//6 10372//6 10376//6\nf 10378//1 10379//1 10380//1\nf 10384//2 10383//2 10382//2\nf 10381//3 10382//3 10378//3\nf 10382//4 10383//4 10379//4\nf 10383//5 10384//5 10380//5\nf 10377//6 10380//6 10384//6\nf 10386//1 10387//1 10388//1\nf 10392//2 10391//2 10390//2\nf 10389//3 10390//3 10386//3\nf 10390//4 10391//4 10387//4\nf 10391//5 10392//5 10388//5\nf 10385//6 10388//6 10392//6\nf 10394//1 10395//1 10396//1\nf 10400//2 10399//2 10398//2\nf 10397//3 10398//3 10394//3\nf 10398//4 10399//4 10395//4\nf 10399//5 10400//5 10396//5\nf 10393//6 10396//6 10400//6\nf 10404//1 10403//1 10402//1\nf 10405//2 10406//2 10407//2\nf 10401//5 10402//5 10406//5\nf 10402//4 10403//4 10407//4\nf 10404//3 10408//3 10407//3\nf 10408//6 10404//6 10401//6\nf 10412//1 10411//1 10410//1\nf 10413//2 10414//2 10415//2\nf 10409//5 10410//5 10414//5\nf 10410//4 10411//4 10415//4\nf 10412//3 10416//3 10415//3\nf 10413//6 10416//6 10412//6\nf 10420//1 10419//1 10418//1\nf 10421//2 10422//2 10423//2\nf 10417//5 10418//5 10422//5\nf 10418//4 10419//4 10423//4\nf 10420//3 10424//3 10423//3\nf 10421//6 10424//6 10420//6\nf 10428//1 10427//1 10426//1\nf 10430//2 10431//2 10432//2\nf 10425//5 10426//5 10430//5\nf 10426//4 10427//4 10431//4\nf 10428//3 10432//3 10431//3\nf 10432//6 10428//6 10425//6\nf 10436//1 10435//1 10434//1\nf 10437//2 10438//2 10439//2\nf 10433//5 10434//5 10438//5\nf 10434//4 10435//4 10439//4\nf 10436//3 10440//3 10439//3\nf 10437//6 10440//6 10436//6\nf 10444//1 10443//1 10442//1\nf 10446//2 10447//2 10448//2\nf 10441//5 10442//5 10446//5\nf 10443//4 10447//4 10446//4\nf 10444//3 10448//3 10447//3\nf 10448//6 10444//6 10441//6\nf 10452//1 10451//1 10450//1\nf 10454//2 10455//2 10456//2\nf 10449//5 10450//5 10454//5\nf 10451//4 10455//4 10454//4\nf 10452//3 10456//3 10455//3\nf 10456//6 10452//6 10449//6\nf 10460//1 10459//1 10458//1\nf 10462//2 10463//2 10464//2\nf 10457//5 10458//5 10462//5\nf 10459//4 10463//4 10462//4\nf 10460//3 10464//3 10463//3\nf 10464//6 10460//6 10457//6\nf 10468//1 10467//1 10466//1\nf 10470//2 10471//2 10472//2\nf 10465//5 10466//5 10470//5\nf 10467//4 10471//4 10470//4\nf 10468//3 10472//3 10471//3\nf 10472//6 10468//6 10465//6\nf 10476//1 10475//1 10474//1\nf 10478//2 10479//2 10480//2\nf 10473//5 10474//5 10478//5\nf 10475//4 10479//4 10478//4\nf 10476//3 10480//3 10479//3\nf 10480//6 10476//6 10473//6\nf 10484//1 10483//1 10482//1\nf 10485//2 10486//2 10487//2\nf 10482//5 10486//5 10485//5\nf 10482//4 10483//4 10487//4\nf 10484//3 10488//3 10487//3\nf 10488//6 10484//6 10481//6\nf 10492//1 10491//1 10490//1\nf 10493//2 10494//2 10495//2\nf 10489//5 10490//5 10494//5\nf 10490//4 10491//4 10495//4\nf 10492//3 10496//3 10495//3\nf 10493//6 10496//6 10492//6\nf 10500//1 10499//1 10498//1\nf 10501//2 10502//2 10503//2\nf 10497//5 10498//5 10502//5\nf 10498//4 10499//4 10503//4\nf 10500//3 10504//3 10503//3\nf 10501//6 10504//6 10500//6\nf 10508//1 10507//1 10506//1\nf 10510//2 10511//2 10512//2\nf 10505//5 10506//5 10510//5\nf 10506//4 10507//4 10511//4\nf 10508//3 10512//3 10511//3\nf 10512//6 10508//6 10505//6\nf 10516//1 10515//1 10514//1\nf 10518//2 10519//2 10520//2\nf 10513//5 10514//5 10518//5\nf 10514//4 10515//4 10519//4\nf 10516//3 10520//3 10519//3\nf 10517//6 10520//6 10516//6\nf 10524//1 10523//1 10522//1\nf 10526//2 10527//2 10528//2\nf 10521//5 10522//5 10526//5\nf 10523//4 10527//4 10526//4\nf 10524//3 10528//3 10527//3\nf 10528//6 10524//6 10521//6\nf 10532//1 10531//1 10530//1\nf 10534//2 10535//2 10536//2\nf 10529//5 10530//5 10534//5\nf 10531//4 10535//4 10534//4\nf 10532//3 10536//3 10535//3\nf 10536//6 10532//6 10529//6\nf 10540//1 10539//1 10538//1\nf 10542//2 10543//2 10544//2\nf 10537//5 10538//5 10542//5\nf 10539//4 10543//4 10542//4\nf 10540//3 10544//3 10543//3\nf 10544//6 10540//6 10537//6\nf 10548//1 10547//1 10546//1\nf 10550//2 10551//2 10552//2\nf 10545//5 10546//5 10550//5\nf 10547//4 10551//4 10550//4\nf 10548//3 10552//3 10551//3\nf 10552//6 10548//6 10545//6\nf 10556//1 10555//1 10554//1\nf 10558//2 10559//2 10560//2\nf 10553//5 10554//5 10558//5\nf 10555//4 10559//4 10558//4\nf 10556//3 10560//3 10559//3\nf 10560//6 10556//6 10553//6\nf 10561//1 10564//1 10563//1\nf 10565//2 10566//2 10567//2\nf 10562//5 10566//5 10565//5\nf 10562//4 10563//4 10567//4\nf 10564//3 10568//3 10567//3\nf 10568//6 10564//6 10561//6\nf 10572//1 10571//1 10570//1\nf 10573//2 10574//2 10575//2\nf 10570//5 10574//5 10573//5\nf 10570//4 10571//4 10575//4\nf 10572//3 10576//3 10575//3\nf 10573//6 10576//6 10572//6\nf 10580//1 10579//1 10578//1\nf 10581//2 10582//2 10583//2\nf 10577//5 10578//5 10582//5\nf 10578//4 10579//4 10583//4\nf 10580//3 10584//3 10583//3\nf 10581//6 10584//6 10580//6\nf 10588//1 10587//1 10586//1\nf 10589//2 10590//2 10591//2\nf 10585//5 10586//5 10590//5\nf 10586//4 10587//4 10591//4\nf 10588//3 10592//3 10591//3\nf 10592//6 10588//6 10585//6\nf 10596//1 10595//1 10594//1\nf 10597//2 10598//2 10599//2\nf 10594//5 10598//5 10597//5\nf 10594//4 10595//4 10599//4\nf 10596//3 10600//3 10599//3\nf 10597//6 10600//6 10596//6\nf 10604//1 10603//1 10602//1\nf 10606//2 10607//2 10608//2\nf 10601//5 10602//5 10606//5\nf 10603//4 10607//4 10606//4\nf 10604//3 10608//3 10607//3\nf 10608//6 10604//6 10601//6\nf 10612//1 10611//1 10610//1\nf 10614//2 10615//2 10616//2\nf 10609//5 10610//5 10614//5\nf 10611//4 10615//4 10614//4\nf 10612//3 10616//3 10615//3\nf 10616//6 10612//6 10609//6\nf 10620//1 10619//1 10618//1\nf 10622//2 10623//2 10624//2\nf 10617//5 10618//5 10622//5\nf 10619//4 10623//4 10622//4\nf 10620//3 10624//3 10623//3\nf 10624//6 10620//6 10617//6\nf 10628//1 10627//1 10626//1\nf 10630//2 10631//2 10632//2\nf 10625//5 10626//5 10630//5\nf 10627//4 10631//4 10630//4\nf 10628//3 10632//3 10631//3\nf 10632//6 10628//6 10625//6\nf 10636//1 10635//1 10634//1\nf 10638//2 10639//2 10640//2\nf 10633//5 10634//5 10638//5\nf 10635//4 10639//4 10638//4\nf 10636//3 10640//3 10639//3\nf 10640//6 10636//6 10633//6\nf 10641//1 10644//1 10643//1\nf 10646//2 10647//2 10648//2\nf 10641//5 10642//5 10646//5\nf 10642//4 10643//4 10647//4\nf 10644//3 10648//3 10647//3\nf 10648//6 10644//6 10641//6\nf 10649//1 10652//1 10651//1\nf 10654//2 10655//2 10656//2\nf 10649//5 10650//5 10654//5\nf 10650//4 10651//4 10655//4\nf 10652//3 10656//3 10655//3\nf 10653//6 10656//6 10652//6\nf 10660//1 10659//1 10658//1\nf 10662//2 10663//2 10664//2\nf 10657//5 10658//5 10662//5\nf 10658//4 10659//4 10663//4\nf 10660//3 10664//3 10663//3\nf 10661//6 10664//6 10660//6\nf 10668//1 10667//1 10666//1\nf 10670//2 10671//2 10672//2\nf 10665//5 10666//5 10670//5\nf 10666//4 10667//4 10671//4\nf 10668//3 10672//3 10671//3\nf 10672//6 10668//6 10665//6\nf 10676//1 10675//1 10674//1\nf 10678//2 10679//2 10680//2\nf 10673//5 10674//5 10678//5\nf 10674//4 10675//4 10679//4\nf 10676//3 10680//3 10679//3\nf 10677//6 10680//6 10676//6\nf 10684//1 10683//1 10682//1\nf 10686//2 10687//2 10688//2\nf 10681//5 10682//5 10686//5\nf 10683//4 10687//4 10686//4\nf 10684//3 10688//3 10687//3\nf 10688//6 10684//6 10681//6\nf 10692//1 10691//1 10690//1\nf 10694//2 10695//2 10696//2\nf 10689//5 10690//5 10694//5\nf 10691//4 10695//4 10694//4\nf 10692//3 10696//3 10695//3\nf 10696//6 10692//6 10689//6\nf 10700//1 10699//1 10698//1\nf 10702//2 10703//2 10704//2\nf 10697//5 10698//5 10702//5\nf 10699//4 10703//4 10702//4\nf 10700//3 10704//3 10703//3\nf 10704//6 10700//6 10697//6\nf 10708//1 10707//1 10706//1\nf 10710//2 10711//2 10712//2\nf 10705//5 10706//5 10710//5\nf 10707//4 10711//4 10710//4\nf 10708//3 10712//3 10711//3\nf 10712//6 10708//6 10705//6\nf 10716//1 10715//1 10714//1\nf 10718//2 10719//2 10720//2\nf 10713//5 10714//5 10718//5\nf 10715//4 10719//4 10718//4\nf 10716//3 10720//3 10719//3\nf 10720//6 10716//6 10713//6\nf 10721//1 10724//1 10723//1\nf 10726//2 10727//2 10728//2\nf 10721//5 10722//5 10726//5\nf 10722//4 10723//4 10727//4\nf 10724//3 10728//3 10727//3\nf 10728//6 10724//6 10721//6\nf 10729//1 10732//1 10731//1\nf 10734//2 10735//2 10736//2\nf 10729//5 10730//5 10734//5\nf 10730//4 10731//4 10735//4\nf 10732//3 10736//3 10735//3\nf 10733//6 10736//6 10732//6\nf 10740//1 10739//1 10738//1\nf 10742//2 10743//2 10744//2\nf 10737//5 10738//5 10742//5\nf 10738//4 10739//4 10743//4\nf 10740//3 10744//3 10743//3\nf 10741//6 10744//6 10740//6\nf 10748//1 10747//1 10746//1\nf 10750//2 10751//2 10752//2\nf 10745//5 10746//5 10750//5\nf 10746//4 10747//4 10751//4\nf 10748//3 10752//3 10751//3\nf 10752//6 10748//6 10745//6\nf 10756//1 10755//1 10754//1\nf 10758//2 10759//2 10760//2\nf 10753//5 10754//5 10758//5\nf 10754//4 10755//4 10759//4\nf 10756//3 10760//3 10759//3\nf 10757//6 10760//6 10756//6\nf 10764//1 10763//1 10762//1\nf 10766//2 10767//2 10768//2\nf 10761//5 10762//5 10766//5\nf 10763//4 10767//4 10766//4\nf 10764//3 10768//3 10767//3\nf 10768//6 10764//6 10761//6\nf 10772//1 10771//1 10770//1\nf 10774//2 10775//2 10776//2\nf 10769//5 10770//5 10774//5\nf 10771//4 10775//4 10774//4\nf 10772//3 10776//3 10775//3\nf 10776//6 10772//6 10769//6\nf 10780//1 10779//1 10778//1\nf 10782//2 10783//2 10784//2\nf 10777//5 10778//5 10782//5\nf 10779//4 10783//4 10782//4\nf 10780//3 10784//3 10783//3\nf 10784//6 10780//6 10777//6\nf 10788//1 10787//1 10786//1\nf 10790//2 10791//2 10792//2\nf 10785//5 10786//5 10790//5\nf 10787//4 10791//4 10790//4\nf 10788//3 10792//3 10791//3\nf 10792//6 10788//6 10785//6\nf 10796//1 10795//1 10794//1\nf 10798//2 10799//2 10800//2\nf 10793//5 10794//5 10798//5\nf 10795//4 10799//4 10798//4\nf 10796//3 10800//3 10799//3\nf 10800//6 10796//6 10793//6\nf 10801//1 10804//1 10803//1\nf 10805//2 10806//2 10807//2\nf 10802//5 10806//5 10805//5\nf 10802//4 10803//4 10807//4\nf 10804//3 10808//3 10807//3\nf 10808//6 10804//6 10801//6\nf 10809//1 10812//1 10811//1\nf 10813//2 10814//2 10815//2\nf 10810//5 10814//5 10813//5\nf 10810//4 10811//4 10815//4\nf 10812//3 10816//3 10815//3\nf 10813//6 10816//6 10812//6\nf 10820//1 10819//1 10818//1\nf 10821//2 10822//2 10823//2\nf 10818//5 10822//5 10821//5\nf 10818//4 10819//4 10823//4\nf 10820//3 10824//3 10823//3\nf 10821//6 10824//6 10820//6\nf 10828//1 10827//1 10826//1\nf 10829//2 10830//2 10831//2\nf 10826//5 10830//5 10829//5\nf 10826//4 10827//4 10831//4\nf 10828//3 10832//3 10831//3\nf 10832//6 10828//6 10825//6\nf 10836//1 10835//1 10834//1\nf 10837//2 10838//2 10839//2\nf 10834//5 10838//5 10837//5\nf 10834//4 10835//4 10839//4\nf 10836//3 10840//3 10839//3\nf 10837//6 10840//6 10836//6\nf 10844//1 10843//1 10842//1\nf 10846//2 10847//2 10848//2\nf 10842//5 10846//5 10845//5\nf 10843//4 10847//4 10846//4\nf 10844//3 10848//3 10847//3\nf 10848//6 10844//6 10841//6\nf 10852//1 10851//1 10850//1\nf 10854//2 10855//2 10856//2\nf 10850//5 10854//5 10853//5\nf 10851//4 10855//4 10854//4\nf 10852//3 10856//3 10855//3\nf 10856//6 10852//6 10849//6\nf 10860//1 10859//1 10858//1\nf 10862//2 10863//2 10864//2\nf 10858//5 10862//5 10861//5\nf 10859//4 10863//4 10862//4\nf 10860//3 10864//3 10863//3\nf 10864//6 10860//6 10857//6\nf 10868//1 10867//1 10866//1\nf 10870//2 10871//2 10872//2\nf 10866//5 10870//5 10869//5\nf 10867//4 10871//4 10870//4\nf 10868//3 10872//3 10871//3\nf 10872//6 10868//6 10865//6\nf 10876//1 10875//1 10874//1\nf 10878//2 10879//2 10880//2\nf 10874//5 10878//5 10877//5\nf 10875//4 10879//4 10878//4\nf 10876//3 10880//3 10879//3\nf 10880//6 10876//6 10873//6\nf 10881//1 10884//1 10883//1\nf 10885//2 10886//2 10887//2\nf 10882//5 10886//5 10885//5\nf 10882//4 10883//4 10887//4\nf 10884//3 10888//3 10887//3\nf 10888//6 10884//6 10881//6\nf 10889//1 10892//1 10891//1\nf 10893//2 10894//2 10895//2\nf 10890//5 10894//5 10893//5\nf 10890//4 10891//4 10895//4\nf 10892//3 10896//3 10895//3\nf 10893//6 10896//6 10892//6\nf 10900//1 10899//1 10898//1\nf 10901//2 10902//2 10903//2\nf 10898//5 10902//5 10901//5\nf 10898//4 10899//4 10903//4\nf 10900//3 10904//3 10903//3\nf 10901//6 10904//6 10900//6\nf 10908//1 10907//1 10906//1\nf 10909//2 10910//2 10911//2\nf 10906//5 10910//5 10909//5\nf 10906//4 10907//4 10911//4\nf 10908//3 10912//3 10911//3\nf 10912//6 10908//6 10905//6\nf 10916//1 10915//1 10914//1\nf 10917//2 10918//2 10919//2\nf 10914//5 10918//5 10917//5\nf 10914//4 10915//4 10919//4\nf 10916//3 10920//3 10919//3\nf 10917//6 10920//6 10916//6\nf 10924//1 10923//1 10922//1\nf 10926//2 10927//2 10928//2\nf 10922//5 10926//5 10925//5\nf 10923//4 10927//4 10926//4\nf 10924//3 10928//3 10927//3\nf 10928//6 10924//6 10921//6\nf 10932//1 10931//1 10930//1\nf 10934//2 10935//2 10936//2\nf 10930//5 10934//5 10933//5\nf 10931//4 10935//4 10934//4\nf 10932//3 10936//3 10935//3\nf 10936//6 10932//6 10929//6\nf 10940//1 10939//1 10938//1\nf 10942//2 10943//2 10944//2\nf 10938//5 10942//5 10941//5\nf 10939//4 10943//4 10942//4\nf 10940//3 10944//3 10943//3\nf 10944//6 10940//6 10937//6\nf 10948//1 10947//1 10946//1\nf 10950//2 10951//2 10952//2\nf 10946//5 10950//5 10949//5\nf 10947//4 10951//4 10950//4\nf 10948//3 10952//3 10951//3\nf 10952//6 10948//6 10945//6\nf 10956//1 10955//1 10954//1\nf 10958//2 10959//2 10960//2\nf 10954//5 10958//5 10957//5\nf 10955//4 10959//4 10958//4\nf 10956//3 10960//3 10959//3\nf 10960//6 10956//6 10953//6\nf 10961//1 10964//1 10963//1\nf 10965//2 10966//2 10967//2\nf 10962//5 10966//5 10965//5\nf 10962//4 10963//4 10967//4\nf 10964//3 10968//3 10967//3\nf 10968//6 10964//6 10961//6\nf 10969//1 10972//1 10971//1\nf 10973//2 10974//2 10975//2\nf 10970//5 10974//5 10973//5\nf 10970//4 10971//4 10975//4\nf 10972//3 10976//3 10975//3\nf 10973//6 10976//6 10972//6\nf 10980//1 10979//1 10978//1\nf 10981//2 10982//2 10983//2\nf 10978//5 10982//5 10981//5\nf 10978//4 10979//4 10983//4\nf 10980//3 10984//3 10983//3\nf 10981//6 10984//6 10980//6\nf 10988//1 10987//1 10986//1\nf 10989//2 10990//2 10991//2\nf 10986//5 10990//5 10989//5\nf 10986//4 10987//4 10991//4\nf 10988//3 10992//3 10991//3\nf 10992//6 10988//6 10985//6\nf 10996//1 10995//1 10994//1\nf 10997//2 10998//2 10999//2\nf 10994//5 10998//5 10997//5\nf 10994//4 10995//4 10999//4\nf 10996//3 11000//3 10999//3\nf 10997//6 11000//6 10996//6\nf 11004//1 11003//1 11002//1\nf 11006//2 11007//2 11008//2\nf 11002//5 11006//5 11005//5\nf 11003//4 11007//4 11006//4\nf 11004//3 11008//3 11007//3\nf 11008//6 11004//6 11001//6\nf 11012//1 11011//1 11010//1\nf 11014//2 11015//2 11016//2\nf 11010//5 11014//5 11013//5\nf 11011//4 11015//4 11014//4\nf 11012//3 11016//3 11015//3\nf 11016//6 11012//6 11009//6\nf 11020//1 11019//1 11018//1\nf 11022//2 11023//2 11024//2\nf 11018//5 11022//5 11021//5\nf 11019//4 11023//4 11022//4\nf 11020//3 11024//3 11023//3\nf 11024//6 11020//6 11017//6\nf 11028//1 11027//1 11026//1\nf 11030//2 11031//2 11032//2\nf 11026//5 11030//5 11029//5\nf 11027//4 11031//4 11030//4\nf 11028//3 11032//3 11031//3\nf 11032//6 11028//6 11025//6\nf 11036//1 11035//1 11034//1\nf 11038//2 11039//2 11040//2\nf 11034//5 11038//5 11037//5\nf 11035//4 11039//4 11038//4\nf 11036//3 11040//3 11039//3\nf 11040//6 11036//6 11033//6\nf 11041//1 11044//1 11043//1\nf 11045//2 11046//2 11047//2\nf 11042//5 11046//5 11045//5\nf 11042//4 11043//4 11047//4\nf 11044//3 11048//3 11047//3\nf 11048//6 11044//6 11041//6\nf 11049//1 11052//1 11051//1\nf 11053//2 11054//2 11055//2\nf 11050//5 11054//5 11053//5\nf 11050//4 11051//4 11055//4\nf 11052//3 11056//3 11055//3\nf 11053//6 11056//6 11052//6\nf 11060//1 11059//1 11058//1\nf 11061//2 11062//2 11063//2\nf 11058//5 11062//5 11061//5\nf 11058//4 11059//4 11063//4\nf 11060//3 11064//3 11063//3\nf 11061//6 11064//6 11060//6\nf 11068//1 11067//1 11066//1\nf 11069//2 11070//2 11071//2\nf 11066//5 11070//5 11069//5\nf 11066//4 11067//4 11071//4\nf 11068//3 11072//3 11071//3\nf 11072//6 11068//6 11065//6\nf 11076//1 11075//1 11074//1\nf 11077//2 11078//2 11079//2\nf 11074//5 11078//5 11077//5\nf 11074//4 11075//4 11079//4\nf 11076//3 11080//3 11079//3\nf 11077//6 11080//6 11076//6\nf 11084//1 11083//1 11082//1\nf 11086//2 11087//2 11088//2\nf 11082//5 11086//5 11085//5\nf 11083//4 11087//4 11086//4\nf 11084//3 11088//3 11087//3\nf 11088//6 11084//6 11081//6\nf 11092//1 11091//1 11090//1\nf 11094//2 11095//2 11096//2\nf 11090//5 11094//5 11093//5\nf 11091//4 11095//4 11094//4\nf 11092//3 11096//3 11095//3\nf 11096//6 11092//6 11089//6\nf 11100//1 11099//1 11098//1\nf 11102//2 11103//2 11104//2\nf 11098//5 11102//5 11101//5\nf 11099//4 11103//4 11102//4\nf 11100//3 11104//3 11103//3\nf 11104//6 11100//6 11097//6\nf 11108//1 11107//1 11106//1\nf 11110//2 11111//2 11112//2\nf 11106//5 11110//5 11109//5\nf 11107//4 11111//4 11110//4\nf 11108//3 11112//3 11111//3\nf 11112//6 11108//6 11105//6\nf 11116//1 11115//1 11114//1\nf 11118//2 11119//2 11120//2\nf 11114//5 11118//5 11117//5\nf 11115//4 11119//4 11118//4\nf 11116//3 11120//3 11119//3\nf 11120//6 11116//6 11113//6\nf 11121//1 11124//1 11123//1\nf 11125//2 11126//2 11127//2\nf 11122//5 11126//5 11125//5\nf 11122//4 11123//4 11127//4\nf 11124//3 11128//3 11127//3\nf 11128//6 11124//6 11121//6\nf 11129//1 11132//1 11131//1\nf 11133//2 11134//2 11135//2\nf 11130//5 11134//5 11133//5\nf 11130//4 11131//4 11135//4\nf 11132//3 11136//3 11135//3\nf 11133//6 11136//6 11132//6\nf 11140//1 11139//1 11138//1\nf 11141//2 11142//2 11143//2\nf 11138//5 11142//5 11141//5\nf 11138//4 11139//4 11143//4\nf 11140//3 11144//3 11143//3\nf 11141//6 11144//6 11140//6\nf 11148//1 11147//1 11146//1\nf 11149//2 11150//2 11151//2\nf 11146//5 11150//5 11149//5\nf 11146//4 11147//4 11151//4\nf 11148//3 11152//3 11151//3\nf 11152//6 11148//6 11145//6\nf 11156//1 11155//1 11154//1\nf 11157//2 11158//2 11159//2\nf 11154//5 11158//5 11157//5\nf 11154//4 11155//4 11159//4\nf 11156//3 11160//3 11159//3\nf 11157//6 11160//6 11156//6\nf 11164//1 11163//1 11162//1\nf 11166//2 11167//2 11168//2\nf 11162//5 11166//5 11165//5\nf 11163//4 11167//4 11166//4\nf 11164//3 11168//3 11167//3\nf 11168//6 11164//6 11161//6\nf 11172//1 11171//1 11170//1\nf 11174//2 11175//2 11176//2\nf 11170//5 11174//5 11173//5\nf 11171//4 11175//4 11174//4\nf 11172//3 11176//3 11175//3\nf 11176//6 11172//6 11169//6\nf 11180//1 11179//1 11178//1\nf 11182//2 11183//2 11184//2\nf 11178//5 11182//5 11181//5\nf 11179//4 11183//4 11182//4\nf 11180//3 11184//3 11183//3\nf 11184//6 11180//6 11177//6\nf 11188//1 11187//1 11186//1\nf 11190//2 11191//2 11192//2\nf 11186//5 11190//5 11189//5\nf 11187//4 11191//4 11190//4\nf 11188//3 11192//3 11191//3\nf 11192//6 11188//6 11185//6\nf 11196//1 11195//1 11194//1\nf 11198//2 11199//2 11200//2\nf 11194//5 11198//5 11197//5\nf 11195//4 11199//4 11198//4\nf 11196//3 11200//3 11199//3\nf 11200//6 11196//6 11193//6\nf 11202//1 11203//1 11204//1\nf 11208//2 11207//2 11206//2\nf 11201//3 11205//3 11206//3\nf 11202//4 11206//4 11207//4\nf 11207//5 11208//5 11204//5\nf 11201//6 11204//6 11208//6\nf 11210//1 11211//1 11212//1\nf 11213//2 11216//2 11215//2\nf 11209//3 11213//3 11214//3\nf 11210//4 11214//4 11215//4\nf 11215//5 11216//5 11212//5\nf 11209//6 11212//6 11216//6\nf 11218//1 11219//1 11220//1\nf 11224//2 11223//2 11222//2\nf 11217//3 11221//3 11222//3\nf 11218//4 11222//4 11223//4\nf 11223//5 11224//5 11220//5\nf 11221//6 11217//6 11220//6\nf 11226//1 11227//1 11228//1\nf 11232//2 11231//2 11230//2\nf 11225//3 11229//3 11230//3\nf 11226//4 11230//4 11231//4\nf 11231//5 11232//5 11228//5\nf 11225//6 11228//6 11232//6\nf 11234//1 11235//1 11236//1\nf 11237//2 11240//2 11239//2\nf 11233//3 11237//3 11238//3\nf 11234//4 11238//4 11239//4\nf 11239//5 11240//5 11236//5\nf 11237//6 11233//6 11236//6\nf 11242//1 11243//1 11244//1\nf 11248//2 11247//2 11246//2\nf 11241//3 11245//3 11246//3\nf 11246//4 11247//4 11243//4\nf 11247//5 11248//5 11244//5\nf 11241//6 11244//6 11248//6\nf 11250//1 11251//1 11252//1\nf 11256//2 11255//2 11254//2\nf 11249//3 11253//3 11254//3\nf 11254//4 11255//4 11251//4\nf 11255//5 11256//5 11252//5\nf 11249//6 11252//6 11256//6\nf 11258//1 11259//1 11260//1\nf 11264//2 11263//2 11262//2\nf 11257//3 11261//3 11262//3\nf 11262//4 11263//4 11259//4\nf 11263//5 11264//5 11260//5\nf 11257//6 11260//6 11264//6\nf 11266//1 11267//1 11268//1\nf 11272//2 11271//2 11270//2\nf 11265//3 11269//3 11270//3\nf 11270//4 11271//4 11267//4\nf 11271//5 11272//5 11268//5\nf 11265//6 11268//6 11272//6\nf 11274//1 11275//1 11276//1\nf 11280//2 11279//2 11278//2\nf 11273//3 11277//3 11278//3\nf 11278//4 11279//4 11275//4\nf 11279//5 11280//5 11276//5\nf 11273//6 11276//6 11280//6\nf 11282//1 11283//1 11284//1\nf 11288//2 11287//2 11286//2\nf 11285//3 11286//3 11282//3\nf 11282//4 11286//4 11287//4\nf 11287//5 11288//5 11284//5\nf 11281//6 11284//6 11288//6\nf 11290//1 11291//1 11292//1\nf 11293//2 11296//2 11295//2\nf 11289//3 11293//3 11294//3\nf 11290//4 11294//4 11295//4\nf 11295//5 11296//5 11292//5\nf 11289//6 11292//6 11296//6\nf 11298//1 11299//1 11300//1\nf 11304//2 11303//2 11302//2\nf 11297//3 11301//3 11302//3\nf 11298//4 11302//4 11303//4\nf 11303//5 11304//5 11300//5\nf 11301//6 11297//6 11300//6\nf 11306//1 11307//1 11308//1\nf 11312//2 11311//2 11310//2\nf 11305//3 11309//3 11310//3\nf 11306//4 11310//4 11311//4\nf 11311//5 11312//5 11308//5\nf 11305//6 11308//6 11312//6\nf 11314//1 11315//1 11316//1\nf 11317//2 11320//2 11319//2\nf 11313//3 11317//3 11318//3\nf 11314//4 11318//4 11319//4\nf 11319//5 11320//5 11316//5\nf 11317//6 11313//6 11316//6\nf 11322//1 11323//1 11324//1\nf 11328//2 11327//2 11326//2\nf 11321//3 11325//3 11326//3\nf 11326//4 11327//4 11323//4\nf 11327//5 11328//5 11324//5\nf 11321//6 11324//6 11328//6\nf 11330//1 11331//1 11332//1\nf 11336//2 11335//2 11334//2\nf 11329//3 11333//3 11334//3\nf 11334//4 11335//4 11331//4\nf 11335//5 11336//5 11332//5\nf 11329//6 11332//6 11336//6\nf 11338//1 11339//1 11340//1\nf 11344//2 11343//2 11342//2\nf 11337//3 11341//3 11342//3\nf 11342//4 11343//4 11339//4\nf 11343//5 11344//5 11340//5\nf 11337//6 11340//6 11344//6\nf 11346//1 11347//1 11348//1\nf 11352//2 11351//2 11350//2\nf 11345//3 11349//3 11350//3\nf 11350//4 11351//4 11347//4\nf 11351//5 11352//5 11348//5\nf 11345//6 11348//6 11352//6\nf 11354//1 11355//1 11356//1\nf 11360//2 11359//2 11358//2\nf 11353//3 11357//3 11358//3\nf 11358//4 11359//4 11355//4\nf 11359//5 11360//5 11356//5\nf 11353//6 11356//6 11360//6\nf 11362//1 11363//1 11364//1\nf 11365//2 11368//2 11367//2\nf 11365//3 11366//3 11362//3\nf 11362//4 11366//4 11367//4\nf 11367//5 11368//5 11364//5\nf 11361//6 11364//6 11368//6\nf 11370//1 11371//1 11372//1\nf 11373//2 11376//2 11375//2\nf 11373//3 11374//3 11370//3\nf 11370//4 11374//4 11375//4\nf 11375//5 11376//5 11372//5\nf 11369//6 11372//6 11376//6\nf 11378//1 11379//1 11380//1\nf 11381//2 11384//2 11383//2\nf 11377//3 11381//3 11382//3\nf 11378//4 11382//4 11383//4\nf 11383//5 11384//5 11380//5\nf 11381//6 11377//6 11380//6\nf 11386//1 11387//1 11388//1\nf 11389//2 11392//2 11391//2\nf 11385//3 11389//3 11390//3\nf 11386//4 11390//4 11391//4\nf 11391//5 11392//5 11388//5\nf 11385//6 11388//6 11392//6\nf 11394//1 11395//1 11396//1\nf 11397//2 11400//2 11399//2\nf 11397//3 11398//3 11394//3\nf 11394//4 11398//4 11399//4\nf 11399//5 11400//5 11396//5\nf 11397//6 11393//6 11396//6\nf 11402//1 11403//1 11404//1\nf 11408//2 11407//2 11406//2\nf 11401//3 11405//3 11406//3\nf 11406//4 11407//4 11403//4\nf 11407//5 11408//5 11404//5\nf 11401//6 11404//6 11408//6\nf 11410//1 11411//1 11412//1\nf 11416//2 11415//2 11414//2\nf 11409//3 11413//3 11414//3\nf 11414//4 11415//4 11411//4\nf 11415//5 11416//5 11412//5\nf 11409//6 11412//6 11416//6\nf 11418//1 11419//1 11420//1\nf 11424//2 11423//2 11422//2\nf 11417//3 11421//3 11422//3\nf 11422//4 11423//4 11419//4\nf 11423//5 11424//5 11420//5\nf 11417//6 11420//6 11424//6\nf 11426//1 11427//1 11428//1\nf 11432//2 11431//2 11430//2\nf 11425//3 11429//3 11430//3\nf 11430//4 11431//4 11427//4\nf 11431//5 11432//5 11428//5\nf 11425//6 11428//6 11432//6\nf 11434//1 11435//1 11436//1\nf 11440//2 11439//2 11438//2\nf 11433//3 11437//3 11438//3\nf 11438//4 11439//4 11435//4\nf 11439//5 11440//5 11436//5\nf 11433//6 11436//6 11440//6\nf 11441//1 11442//1 11443//1\nf 11448//2 11447//2 11446//2\nf 11441//3 11445//3 11446//3\nf 11442//4 11446//4 11447//4\nf 11447//5 11448//5 11444//5\nf 11441//6 11444//6 11448//6\nf 11449//1 11450//1 11451//1\nf 11456//2 11455//2 11454//2\nf 11449//3 11453//3 11454//3\nf 11450//4 11454//4 11455//4\nf 11455//5 11456//5 11452//5\nf 11449//6 11452//6 11456//6\nf 11458//1 11459//1 11460//1\nf 11464//2 11463//2 11462//2\nf 11457//3 11461//3 11462//3\nf 11458//4 11462//4 11463//4\nf 11463//5 11464//5 11460//5\nf 11461//6 11457//6 11460//6\nf 11466//1 11467//1 11468//1\nf 11472//2 11471//2 11470//2\nf 11465//3 11469//3 11470//3\nf 11466//4 11470//4 11471//4\nf 11471//5 11472//5 11468//5\nf 11465//6 11468//6 11472//6\nf 11474//1 11475//1 11476//1\nf 11480//2 11479//2 11478//2\nf 11473//3 11477//3 11478//3\nf 11474//4 11478//4 11479//4\nf 11479//5 11480//5 11476//5\nf 11477//6 11473//6 11476//6\nf 11482//1 11483//1 11484//1\nf 11488//2 11487//2 11486//2\nf 11481//3 11485//3 11486//3\nf 11486//4 11487//4 11483//4\nf 11487//5 11488//5 11484//5\nf 11481//6 11484//6 11488//6\nf 11490//1 11491//1 11492//1\nf 11496//2 11495//2 11494//2\nf 11489//3 11493//3 11494//3\nf 11494//4 11495//4 11491//4\nf 11495//5 11496//5 11492//5\nf 11489//6 11492//6 11496//6\nf 11498//1 11499//1 11500//1\nf 11504//2 11503//2 11502//2\nf 11497//3 11501//3 11502//3\nf 11502//4 11503//4 11499//4\nf 11503//5 11504//5 11500//5\nf 11497//6 11500//6 11504//6\nf 11506//1 11507//1 11508//1\nf 11512//2 11511//2 11510//2\nf 11505//3 11509//3 11510//3\nf 11510//4 11511//4 11507//4\nf 11511//5 11512//5 11508//5\nf 11505//6 11508//6 11512//6\nf 11514//1 11515//1 11516//1\nf 11520//2 11519//2 11518//2\nf 11513//3 11517//3 11518//3\nf 11518//4 11519//4 11515//4\nf 11519//5 11520//5 11516//5\nf 11513//6 11516//6 11520//6\nf 11521//1 11522//1 11523//1\nf 11528//2 11527//2 11526//2\nf 11521//3 11525//3 11526//3\nf 11522//4 11526//4 11527//4\nf 11527//5 11528//5 11524//5\nf 11521//6 11524//6 11528//6\nf 11529//1 11530//1 11531//1\nf 11536//2 11535//2 11534//2\nf 11529//3 11533//3 11534//3\nf 11530//4 11534//4 11535//4\nf 11535//5 11536//5 11532//5\nf 11529//6 11532//6 11536//6\nf 11538//1 11539//1 11540//1\nf 11544//2 11543//2 11542//2\nf 11537//3 11541//3 11542//3\nf 11538//4 11542//4 11543//4\nf 11543//5 11544//5 11540//5\nf 11541//6 11537//6 11540//6\nf 11546//1 11547//1 11548//1\nf 11552//2 11551//2 11550//2\nf 11545//3 11549//3 11550//3\nf 11546//4 11550//4 11551//4\nf 11551//5 11552//5 11548//5\nf 11545//6 11548//6 11552//6\nf 11554//1 11555//1 11556//1\nf 11560//2 11559//2 11558//2\nf 11553//3 11557//3 11558//3\nf 11554//4 11558//4 11559//4\nf 11559//5 11560//5 11556//5\nf 11557//6 11553//6 11556//6\nf 11562//1 11563//1 11564//1\nf 11568//2 11567//2 11566//2\nf 11561//3 11565//3 11566//3\nf 11566//4 11567//4 11563//4\nf 11567//5 11568//5 11564//5\nf 11561//6 11564//6 11568//6\nf 11570//1 11571//1 11572//1\nf 11576//2 11575//2 11574//2\nf 11569//3 11573//3 11574//3\nf 11574//4 11575//4 11571//4\nf 11575//5 11576//5 11572//5\nf 11569//6 11572//6 11576//6\nf 11578//1 11579//1 11580//1\nf 11584//2 11583//2 11582//2\nf 11577//3 11581//3 11582//3\nf 11582//4 11583//4 11579//4\nf 11583//5 11584//5 11580//5\nf 11577//6 11580//6 11584//6\nf 11586//1 11587//1 11588//1\nf 11592//2 11591//2 11590//2\nf 11585//3 11589//3 11590//3\nf 11590//4 11591//4 11587//4\nf 11591//5 11592//5 11588//5\nf 11585//6 11588//6 11592//6\nf 11594//1 11595//1 11596//1\nf 11600//2 11599//2 11598//2\nf 11593//3 11597//3 11598//3\nf 11598//4 11599//4 11595//4\nf 11599//5 11600//5 11596//5\nf 11593//6 11596//6 11600//6\nf 11601//1 11602//1 11603//1\nf 11605//2 11608//2 11607//2\nf 11605//3 11606//3 11602//3\nf 11602//4 11606//4 11607//4\nf 11607//5 11608//5 11604//5\nf 11601//6 11604//6 11608//6\nf 11609//1 11610//1 11611//1\nf 11613//2 11616//2 11615//2\nf 11613//3 11614//3 11610//3\nf 11610//4 11614//4 11615//4\nf 11615//5 11616//5 11612//5\nf 11609//6 11612//6 11616//6\nf 11618//1 11619//1 11620//1\nf 11621//2 11624//2 11623//2\nf 11621//3 11622//3 11618//3\nf 11618//4 11622//4 11623//4\nf 11623//5 11624//5 11620//5\nf 11621//6 11617//6 11620//6\nf 11626//1 11627//1 11628//1\nf 11629//2 11632//2 11631//2\nf 11629//3 11630//3 11626//3\nf 11626//4 11630//4 11631//4\nf 11631//5 11632//5 11628//5\nf 11625//6 11628//6 11632//6\nf 11634//1 11635//1 11636//1\nf 11637//2 11640//2 11639//2\nf 11637//3 11638//3 11634//3\nf 11634//4 11638//4 11639//4\nf 11639//5 11640//5 11636//5\nf 11637//6 11633//6 11636//6\nf 11642//1 11643//1 11644//1\nf 11648//2 11647//2 11646//2\nf 11645//3 11646//3 11642//3\nf 11646//4 11647//4 11643//4\nf 11647//5 11648//5 11644//5\nf 11641//6 11644//6 11648//6\nf 11650//1 11651//1 11652//1\nf 11656//2 11655//2 11654//2\nf 11653//3 11654//3 11650//3\nf 11654//4 11655//4 11651//4\nf 11655//5 11656//5 11652//5\nf 11649//6 11652//6 11656//6\nf 11658//1 11659//1 11660//1\nf 11664//2 11663//2 11662//2\nf 11661//3 11662//3 11658//3\nf 11662//4 11663//4 11659//4\nf 11663//5 11664//5 11660//5\nf 11657//6 11660//6 11664//6\nf 11666//1 11667//1 11668//1\nf 11672//2 11671//2 11670//2\nf 11669//3 11670//3 11666//3\nf 11670//4 11671//4 11667//4\nf 11671//5 11672//5 11668//5\nf 11665//6 11668//6 11672//6\nf 11674//1 11675//1 11676//1\nf 11680//2 11679//2 11678//2\nf 11677//3 11678//3 11674//3\nf 11678//4 11679//4 11675//4\nf 11679//5 11680//5 11676//5\nf 11673//6 11676//6 11680//6\nf 11681//1 11682//1 11683//1\nf 11685//2 11688//2 11687//2\nf 11685//3 11686//3 11682//3\nf 11682//4 11686//4 11687//4\nf 11687//5 11688//5 11684//5\nf 11681//6 11684//6 11688//6\nf 11689//1 11690//1 11691//1\nf 11693//2 11696//2 11695//2\nf 11693//3 11694//3 11690//3\nf 11690//4 11694//4 11695//4\nf 11695//5 11696//5 11692//5\nf 11689//6 11692//6 11696//6\nf 11698//1 11699//1 11700//1\nf 11701//2 11704//2 11703//2\nf 11701//3 11702//3 11698//3\nf 11698//4 11702//4 11703//4\nf 11703//5 11704//5 11700//5\nf 11701//6 11697//6 11700//6\nf 11706//1 11707//1 11708//1\nf 11709//2 11712//2 11711//2\nf 11709//3 11710//3 11706//3\nf 11706//4 11710//4 11711//4\nf 11711//5 11712//5 11708//5\nf 11705//6 11708//6 11712//6\nf 11714//1 11715//1 11716//1\nf 11717//2 11720//2 11719//2\nf 11717//3 11718//3 11714//3\nf 11714//4 11718//4 11719//4\nf 11719//5 11720//5 11716//5\nf 11717//6 11713//6 11716//6\nf 11722//1 11723//1 11724//1\nf 11728//2 11727//2 11726//2\nf 11725//3 11726//3 11722//3\nf 11726//4 11727//4 11723//4\nf 11727//5 11728//5 11724//5\nf 11721//6 11724//6 11728//6\nf 11730//1 11731//1 11732//1\nf 11736//2 11735//2 11734//2\nf 11733//3 11734//3 11730//3\nf 11734//4 11735//4 11731//4\nf 11735//5 11736//5 11732//5\nf 11729//6 11732//6 11736//6\nf 11738//1 11739//1 11740//1\nf 11744//2 11743//2 11742//2\nf 11741//3 11742//3 11738//3\nf 11742//4 11743//4 11739//4\nf 11743//5 11744//5 11740//5\nf 11737//6 11740//6 11744//6\nf 11746//1 11747//1 11748//1\nf 11752//2 11751//2 11750//2\nf 11749//3 11750//3 11746//3\nf 11750//4 11751//4 11747//4\nf 11751//5 11752//5 11748//5\nf 11745//6 11748//6 11752//6\nf 11754//1 11755//1 11756//1\nf 11760//2 11759//2 11758//2\nf 11757//3 11758//3 11754//3\nf 11758//4 11759//4 11755//4\nf 11759//5 11760//5 11756//5\nf 11753//6 11756//6 11760//6\nf 11761//1 11762//1 11763//1\nf 11765//2 11768//2 11767//2\nf 11765//3 11766//3 11762//3\nf 11762//4 11766//4 11767//4\nf 11767//5 11768//5 11764//5\nf 11761//6 11764//6 11768//6\nf 11769//1 11770//1 11771//1\nf 11773//2 11776//2 11775//2\nf 11773//3 11774//3 11770//3\nf 11770//4 11774//4 11775//4\nf 11775//5 11776//5 11772//5\nf 11769//6 11772//6 11776//6\nf 11778//1 11779//1 11780//1\nf 11781//2 11784//2 11783//2\nf 11781//3 11782//3 11778//3\nf 11778//4 11782//4 11783//4\nf 11783//5 11784//5 11780//5\nf 11781//6 11777//6 11780//6\nf 11786//1 11787//1 11788//1\nf 11789//2 11792//2 11791//2\nf 11789//3 11790//3 11786//3\nf 11786//4 11790//4 11791//4\nf 11791//5 11792//5 11788//5\nf 11785//6 11788//6 11792//6\nf 11794//1 11795//1 11796//1\nf 11797//2 11800//2 11799//2\nf 11797//3 11798//3 11794//3\nf 11794//4 11798//4 11799//4\nf 11799//5 11800//5 11796//5\nf 11797//6 11793//6 11796//6\nf 11802//1 11803//1 11804//1\nf 11808//2 11807//2 11806//2\nf 11805//3 11806//3 11802//3\nf 11806//4 11807//4 11803//4\nf 11807//5 11808//5 11804//5\nf 11801//6 11804//6 11808//6\nf 11810//1 11811//1 11812//1\nf 11816//2 11815//2 11814//2\nf 11813//3 11814//3 11810//3\nf 11814//4 11815//4 11811//4\nf 11815//5 11816//5 11812//5\nf 11809//6 11812//6 11816//6\nf 11818//1 11819//1 11820//1\nf 11824//2 11823//2 11822//2\nf 11821//3 11822//3 11818//3\nf 11822//4 11823//4 11819//4\nf 11823//5 11824//5 11820//5\nf 11817//6 11820//6 11824//6\nf 11826//1 11827//1 11828//1\nf 11832//2 11831//2 11830//2\nf 11829//3 11830//3 11826//3\nf 11830//4 11831//4 11827//4\nf 11831//5 11832//5 11828//5\nf 11825//6 11828//6 11832//6\nf 11834//1 11835//1 11836//1\nf 11840//2 11839//2 11838//2\nf 11837//3 11838//3 11834//3\nf 11838//4 11839//4 11835//4\nf 11839//5 11840//5 11836//5\nf 11833//6 11836//6 11840//6\nf 11841//1 11842//1 11843//1\nf 11845//2 11848//2 11847//2\nf 11845//3 11846//3 11842//3\nf 11842//4 11846//4 11847//4\nf 11847//5 11848//5 11844//5\nf 11841//6 11844//6 11848//6\nf 11849//1 11850//1 11851//1\nf 11853//2 11856//2 11855//2\nf 11853//3 11854//3 11850//3\nf 11850//4 11854//4 11855//4\nf 11855//5 11856//5 11852//5\nf 11849//6 11852//6 11856//6\nf 11858//1 11859//1 11860//1\nf 11861//2 11864//2 11863//2\nf 11861//3 11862//3 11858//3\nf 11858//4 11862//4 11863//4\nf 11863//5 11864//5 11860//5\nf 11861//6 11857//6 11860//6\nf 11866//1 11867//1 11868//1\nf 11869//2 11872//2 11871//2\nf 11869//3 11870//3 11866//3\nf 11866//4 11870//4 11871//4\nf 11871//5 11872//5 11868//5\nf 11865//6 11868//6 11872//6\nf 11874//1 11875//1 11876//1\nf 11877//2 11880//2 11879//2\nf 11877//3 11878//3 11874//3\nf 11874//4 11878//4 11879//4\nf 11879//5 11880//5 11876//5\nf 11877//6 11873//6 11876//6\nf 11882//1 11883//1 11884//1\nf 11888//2 11887//2 11886//2\nf 11885//3 11886//3 11882//3\nf 11886//4 11887//4 11883//4\nf 11887//5 11888//5 11884//5\nf 11881//6 11884//6 11888//6\nf 11890//1 11891//1 11892//1\nf 11896//2 11895//2 11894//2\nf 11893//3 11894//3 11890//3\nf 11894//4 11895//4 11891//4\nf 11895//5 11896//5 11892//5\nf 11889//6 11892//6 11896//6\nf 11898//1 11899//1 11900//1\nf 11904//2 11903//2 11902//2\nf 11901//3 11902//3 11898//3\nf 11902//4 11903//4 11899//4\nf 11903//5 11904//5 11900//5\nf 11897//6 11900//6 11904//6\nf 11906//1 11907//1 11908//1\nf 11912//2 11911//2 11910//2\nf 11909//3 11910//3 11906//3\nf 11910//4 11911//4 11907//4\nf 11911//5 11912//5 11908//5\nf 11905//6 11908//6 11912//6\nf 11914//1 11915//1 11916//1\nf 11920//2 11919//2 11918//2\nf 11917//3 11918//3 11914//3\nf 11918//4 11919//4 11915//4\nf 11919//5 11920//5 11916//5\nf 11913//6 11916//6 11920//6\nf 11921//1 11922//1 11923//1\nf 11925//2 11928//2 11927//2\nf 11925//3 11926//3 11922//3\nf 11922//4 11926//4 11927//4\nf 11927//5 11928//5 11924//5\nf 11921//6 11924//6 11928//6\nf 11929//1 11930//1 11931//1\nf 11933//2 11936//2 11935//2\nf 11933//3 11934//3 11930//3\nf 11930//4 11934//4 11935//4\nf 11935//5 11936//5 11932//5\nf 11929//6 11932//6 11936//6\nf 11938//1 11939//1 11940//1\nf 11941//2 11944//2 11943//2\nf 11941//3 11942//3 11938//3\nf 11938//4 11942//4 11943//4\nf 11943//5 11944//5 11940//5\nf 11941//6 11937//6 11940//6\nf 11946//1 11947//1 11948//1\nf 11949//2 11952//2 11951//2\nf 11949//3 11950//3 11946//3\nf 11946//4 11950//4 11951//4\nf 11951//5 11952//5 11948//5\nf 11945//6 11948//6 11952//6\nf 11954//1 11955//1 11956//1\nf 11957//2 11960//2 11959//2\nf 11957//3 11958//3 11954//3\nf 11954//4 11958//4 11959//4\nf 11959//5 11960//5 11956//5\nf 11957//6 11953//6 11956//6\nf 11962//1 11963//1 11964//1\nf 11968//2 11967//2 11966//2\nf 11965//3 11966//3 11962//3\nf 11966//4 11967//4 11963//4\nf 11967//5 11968//5 11964//5\nf 11961//6 11964//6 11968//6\nf 11970//1 11971//1 11972//1\nf 11976//2 11975//2 11974//2\nf 11973//3 11974//3 11970//3\nf 11974//4 11975//4 11971//4\nf 11975//5 11976//5 11972//5\nf 11969//6 11972//6 11976//6\nf 11978//1 11979//1 11980//1\nf 11984//2 11983//2 11982//2\nf 11981//3 11982//3 11978//3\nf 11982//4 11983//4 11979//4\nf 11983//5 11984//5 11980//5\nf 11977//6 11980//6 11984//6\nf 11986//1 11987//1 11988//1\nf 11992//2 11991//2 11990//2\nf 11989//3 11990//3 11986//3\nf 11990//4 11991//4 11987//4\nf 11991//5 11992//5 11988//5\nf 11985//6 11988//6 11992//6\nf 11994//1 11995//1 11996//1\nf 12000//2 11999//2 11998//2\nf 11997//3 11998//3 11994//3\nf 11998//4 11999//4 11995//4\nf 11999//5 12000//5 11996//5\nf 11993//6 11996//6 12000//6\nf 12004//1 12003//1 12002//1\nf 12005//2 12006//2 12007//2\nf 12001//5 12002//5 12006//5\nf 12002//4 12003//4 12007//4\nf 12004//3 12008//3 12007//3\nf 12008//6 12004//6 12001//6\nf 12012//1 12011//1 12010//1\nf 12013//2 12014//2 12015//2\nf 12009//5 12010//5 12014//5\nf 12010//4 12011//4 12015//4\nf 12012//3 12016//3 12015//3\nf 12013//6 12016//6 12012//6\nf 12020//1 12019//1 12018//1\nf 12021//2 12022//2 12023//2\nf 12017//5 12018//5 12022//5\nf 12018//4 12019//4 12023//4\nf 12020//3 12024//3 12023//3\nf 12021//6 12024//6 12020//6\nf 12028//1 12027//1 12026//1\nf 12030//2 12031//2 12032//2\nf 12025//5 12026//5 12030//5\nf 12026//4 12027//4 12031//4\nf 12028//3 12032//3 12031//3\nf 12032//6 12028//6 12025//6\nf 12036//1 12035//1 12034//1\nf 12037//2 12038//2 12039//2\nf 12033//5 12034//5 12038//5\nf 12034//4 12035//4 12039//4\nf 12036//3 12040//3 12039//3\nf 12037//6 12040//6 12036//6\nf 12044//1 12043//1 12042//1\nf 12046//2 12047//2 12048//2\nf 12041//5 12042//5 12046//5\nf 12043//4 12047//4 12046//4\nf 12044//3 12048//3 12047//3\nf 12048//6 12044//6 12041//6\nf 12052//1 12051//1 12050//1\nf 12054//2 12055//2 12056//2\nf 12049//5 12050//5 12054//5\nf 12051//4 12055//4 12054//4\nf 12052//3 12056//3 12055//3\nf 12056//6 12052//6 12049//6\nf 12060//1 12059//1 12058//1\nf 12062//2 12063//2 12064//2\nf 12057//5 12058//5 12062//5\nf 12059//4 12063//4 12062//4\nf 12060//3 12064//3 12063//3\nf 12064//6 12060//6 12057//6\nf 12068//1 12067//1 12066//1\nf 12070//2 12071//2 12072//2\nf 12065//5 12066//5 12070//5\nf 12067//4 12071//4 12070//4\nf 12068//3 12072//3 12071//3\nf 12072//6 12068//6 12065//6\nf 12076//1 12075//1 12074//1\nf 12078//2 12079//2 12080//2\nf 12073//5 12074//5 12078//5\nf 12075//4 12079//4 12078//4\nf 12076//3 12080//3 12079//3\nf 12080//6 12076//6 12073//6\nf 12084//1 12083//1 12082//1\nf 12085//2 12086//2 12087//2\nf 12082//5 12086//5 12085//5\nf 12082//4 12083//4 12087//4\nf 12084//3 12088//3 12087//3\nf 12088//6 12084//6 12081//6\nf 12092//1 12091//1 12090//1\nf 12093//2 12094//2 12095//2\nf 12089//5 12090//5 12094//5\nf 12090//4 12091//4 12095//4\nf 12092//3 12096//3 12095//3\nf 12093//6 12096//6 12092//6\nf 12100//1 12099//1 12098//1\nf 12101//2 12102//2 12103//2\nf 12097//5 12098//5 12102//5\nf 12098//4 12099//4 12103//4\nf 12100//3 12104//3 12103//3\nf 12101//6 12104//6 12100//6\nf 12108//1 12107//1 12106//1\nf 12110//2 12111//2 12112//2\nf 12105//5 12106//5 12110//5\nf 12106//4 12107//4 12111//4\nf 12108//3 12112//3 12111//3\nf 12112//6 12108//6 12105//6\nf 12116//1 12115//1 12114//1\nf 12118//2 12119//2 12120//2\nf 12113//5 12114//5 12118//5\nf 12114//4 12115//4 12119//4\nf 12116//3 12120//3 12119//3\nf 12117//6 12120//6 12116//6\nf 12124//1 12123//1 12122//1\nf 12126//2 12127//2 12128//2\nf 12121//5 12122//5 12126//5\nf 12123//4 12127//4 12126//4\nf 12124//3 12128//3 12127//3\nf 12128//6 12124//6 12121//6\nf 12132//1 12131//1 12130//1\nf 12134//2 12135//2 12136//2\nf 12129//5 12130//5 12134//5\nf 12131//4 12135//4 12134//4\nf 12132//3 12136//3 12135//3\nf 12136//6 12132//6 12129//6\nf 12140//1 12139//1 12138//1\nf 12142//2 12143//2 12144//2\nf 12137//5 12138//5 12142//5\nf 12139//4 12143//4 12142//4\nf 12140//3 12144//3 12143//3\nf 12144//6 12140//6 12137//6\nf 12148//1 12147//1 12146//1\nf 12150//2 12151//2 12152//2\nf 12145//5 12146//5 12150//5\nf 12147//4 12151//4 12150//4\nf 12148//3 12152//3 12151//3\nf 12152//6 12148//6 12145//6\nf 12156//1 12155//1 12154//1\nf 12158//2 12159//2 12160//2\nf 12153//5 12154//5 12158//5\nf 12155//4 12159//4 12158//4\nf 12156//3 12160//3 12159//3\nf 12160//6 12156//6 12153//6\nf 12161//1 12164//1 12163//1\nf 12165//2 12166//2 12167//2\nf 12162//5 12166//5 12165//5\nf 12162//4 12163//4 12167//4\nf 12164//3 12168//3 12167//3\nf 12168//6 12164//6 12161//6\nf 12172//1 12171//1 12170//1\nf 12173//2 12174//2 12175//2\nf 12170//5 12174//5 12173//5\nf 12170//4 12171//4 12175//4\nf 12172//3 12176//3 12175//3\nf 12173//6 12176//6 12172//6\nf 12180//1 12179//1 12178//1\nf 12181//2 12182//2 12183//2\nf 12177//5 12178//5 12182//5\nf 12178//4 12179//4 12183//4\nf 12180//3 12184//3 12183//3\nf 12181//6 12184//6 12180//6\nf 12188//1 12187//1 12186//1\nf 12189//2 12190//2 12191//2\nf 12185//5 12186//5 12190//5\nf 12186//4 12187//4 12191//4\nf 12188//3 12192//3 12191//3\nf 12192//6 12188//6 12185//6\nf 12196//1 12195//1 12194//1\nf 12197//2 12198//2 12199//2\nf 12194//5 12198//5 12197//5\nf 12194//4 12195//4 12199//4\nf 12196//3 12200//3 12199//3\nf 12197//6 12200//6 12196//6\nf 12204//1 12203//1 12202//1\nf 12206//2 12207//2 12208//2\nf 12201//5 12202//5 12206//5\nf 12203//4 12207//4 12206//4\nf 12204//3 12208//3 12207//3\nf 12208//6 12204//6 12201//6\nf 12212//1 12211//1 12210//1\nf 12214//2 12215//2 12216//2\nf 12209//5 12210//5 12214//5\nf 12211//4 12215//4 12214//4\nf 12212//3 12216//3 12215//3\nf 12216//6 12212//6 12209//6\nf 12220//1 12219//1 12218//1\nf 12222//2 12223//2 12224//2\nf 12217//5 12218//5 12222//5\nf 12219//4 12223//4 12222//4\nf 12220//3 12224//3 12223//3\nf 12224//6 12220//6 12217//6\nf 12228//1 12227//1 12226//1\nf 12230//2 12231//2 12232//2\nf 12225//5 12226//5 12230//5\nf 12227//4 12231//4 12230//4\nf 12228//3 12232//3 12231//3\nf 12232//6 12228//6 12225//6\nf 12236//1 12235//1 12234//1\nf 12238//2 12239//2 12240//2\nf 12233//5 12234//5 12238//5\nf 12235//4 12239//4 12238//4\nf 12236//3 12240//3 12239//3\nf 12240//6 12236//6 12233//6\nf 12241//1 12244//1 12243//1\nf 12246//2 12247//2 12248//2\nf 12241//5 12242//5 12246//5\nf 12242//4 12243//4 12247//4\nf 12244//3 12248//3 12247//3\nf 12248//6 12244//6 12241//6\nf 12249//1 12252//1 12251//1\nf 12254//2 12255//2 12256//2\nf 12249//5 12250//5 12254//5\nf 12250//4 12251//4 12255//4\nf 12252//3 12256//3 12255//3\nf 12253//6 12256//6 12252//6\nf 12260//1 12259//1 12258//1\nf 12262//2 12263//2 12264//2\nf 12257//5 12258//5 12262//5\nf 12258//4 12259//4 12263//4\nf 12260//3 12264//3 12263//3\nf 12261//6 12264//6 12260//6\nf 12268//1 12267//1 12266//1\nf 12270//2 12271//2 12272//2\nf 12265//5 12266//5 12270//5\nf 12266//4 12267//4 12271//4\nf 12268//3 12272//3 12271//3\nf 12272//6 12268//6 12265//6\nf 12276//1 12275//1 12274//1\nf 12278//2 12279//2 12280//2\nf 12273//5 12274//5 12278//5\nf 12274//4 12275//4 12279//4\nf 12276//3 12280//3 12279//3\nf 12277//6 12280//6 12276//6\nf 12284//1 12283//1 12282//1\nf 12286//2 12287//2 12288//2\nf 12281//5 12282//5 12286//5\nf 12283//4 12287//4 12286//4\nf 12284//3 12288//3 12287//3\nf 12288//6 12284//6 12281//6\nf 12292//1 12291//1 12290//1\nf 12294//2 12295//2 12296//2\nf 12289//5 12290//5 12294//5\nf 12291//4 12295//4 12294//4\nf 12292//3 12296//3 12295//3\nf 12296//6 12292//6 12289//6\nf 12300//1 12299//1 12298//1\nf 12302//2 12303//2 12304//2\nf 12297//5 12298//5 12302//5\nf 12299//4 12303//4 12302//4\nf 12300//3 12304//3 12303//3\nf 12304//6 12300//6 12297//6\nf 12308//1 12307//1 12306//1\nf 12310//2 12311//2 12312//2\nf 12305//5 12306//5 12310//5\nf 12307//4 12311//4 12310//4\nf 12308//3 12312//3 12311//3\nf 12312//6 12308//6 12305//6\nf 12316//1 12315//1 12314//1\nf 12318//2 12319//2 12320//2\nf 12313//5 12314//5 12318//5\nf 12315//4 12319//4 12318//4\nf 12316//3 12320//3 12319//3\nf 12320//6 12316//6 12313//6\nf 12321//1 12324//1 12323//1\nf 12326//2 12327//2 12328//2\nf 12321//5 12322//5 12326//5\nf 12322//4 12323//4 12327//4\nf 12324//3 12328//3 12327//3\nf 12328//6 12324//6 12321//6\nf 12329//1 12332//1 12331//1\nf 12334//2 12335//2 12336//2\nf 12329//5 12330//5 12334//5\nf 12330//4 12331//4 12335//4\nf 12332//3 12336//3 12335//3\nf 12333//6 12336//6 12332//6\nf 12340//1 12339//1 12338//1\nf 12342//2 12343//2 12344//2\nf 12337//5 12338//5 12342//5\nf 12338//4 12339//4 12343//4\nf 12340//3 12344//3 12343//3\nf 12341//6 12344//6 12340//6\nf 12348//1 12347//1 12346//1\nf 12350//2 12351//2 12352//2\nf 12345//5 12346//5 12350//5\nf 12346//4 12347//4 12351//4\nf 12348//3 12352//3 12351//3\nf 12352//6 12348//6 12345//6\nf 12356//1 12355//1 12354//1\nf 12358//2 12359//2 12360//2\nf 12353//5 12354//5 12358//5\nf 12354//4 12355//4 12359//4\nf 12356//3 12360//3 12359//3\nf 12357//6 12360//6 12356//6\nf 12364//1 12363//1 12362//1\nf 12366//2 12367//2 12368//2\nf 12361//5 12362//5 12366//5\nf 12363//4 12367//4 12366//4\nf 12364//3 12368//3 12367//3\nf 12368//6 12364//6 12361//6\nf 12372//1 12371//1 12370//1\nf 12374//2 12375//2 12376//2\nf 12369//5 12370//5 12374//5\nf 12371//4 12375//4 12374//4\nf 12372//3 12376//3 12375//3\nf 12376//6 12372//6 12369//6\nf 12380//1 12379//1 12378//1\nf 12382//2 12383//2 12384//2\nf 12377//5 12378//5 12382//5\nf 12379//4 12383//4 12382//4\nf 12380//3 12384//3 12383//3\nf 12384//6 12380//6 12377//6\nf 12388//1 12387//1 12386//1\nf 12390//2 12391//2 12392//2\nf 12385//5 12386//5 12390//5\nf 12387//4 12391//4 12390//4\nf 12388//3 12392//3 12391//3\nf 12392//6 12388//6 12385//6\nf 12396//1 12395//1 12394//1\nf 12398//2 12399//2 12400//2\nf 12393//5 12394//5 12398//5\nf 12395//4 12399//4 12398//4\nf 12396//3 12400//3 12399//3\nf 12400//6 12396//6 12393//6\nf 12401//1 12404//1 12403//1\nf 12405//2 12406//2 12407//2\nf 12402//5 12406//5 12405//5\nf 12402//4 12403//4 12407//4\nf 12404//3 12408//3 12407//3\nf 12408//6 12404//6 12401//6\nf 12409//1 12412//1 12411//1\nf 12413//2 12414//2 12415//2\nf 12410//5 12414//5 12413//5\nf 12410//4 12411//4 12415//4\nf 12412//3 12416//3 12415//3\nf 12413//6 12416//6 12412//6\nf 12420//1 12419//1 12418//1\nf 12421//2 12422//2 12423//2\nf 12418//5 12422//5 12421//5\nf 12418//4 12419//4 12423//4\nf 12420//3 12424//3 12423//3\nf 12421//6 12424//6 12420//6\nf 12428//1 12427//1 12426//1\nf 12429//2 12430//2 12431//2\nf 12426//5 12430//5 12429//5\nf 12426//4 12427//4 12431//4\nf 12428//3 12432//3 12431//3\nf 12432//6 12428//6 12425//6\nf 12436//1 12435//1 12434//1\nf 12437//2 12438//2 12439//2\nf 12434//5 12438//5 12437//5\nf 12434//4 12435//4 12439//4\nf 12436//3 12440//3 12439//3\nf 12437//6 12440//6 12436//6\nf 12444//1 12443//1 12442//1\nf 12446//2 12447//2 12448//2\nf 12442//5 12446//5 12445//5\nf 12443//4 12447//4 12446//4\nf 12444//3 12448//3 12447//3\nf 12448//6 12444//6 12441//6\nf 12452//1 12451//1 12450//1\nf 12454//2 12455//2 12456//2\nf 12450//5 12454//5 12453//5\nf 12451//4 12455//4 12454//4\nf 12452//3 12456//3 12455//3\nf 12456//6 12452//6 12449//6\nf 12460//1 12459//1 12458//1\nf 12462//2 12463//2 12464//2\nf 12458//5 12462//5 12461//5\nf 12459//4 12463//4 12462//4\nf 12460//3 12464//3 12463//3\nf 12464//6 12460//6 12457//6\nf 12468//1 12467//1 12466//1\nf 12470//2 12471//2 12472//2\nf 12466//5 12470//5 12469//5\nf 12467//4 12471//4 12470//4\nf 12468//3 12472//3 12471//3\nf 12472//6 12468//6 12465//6\nf 12476//1 12475//1 12474//1\nf 12478//2 12479//2 12480//2\nf 12474//5 12478//5 12477//5\nf 12475//4 12479//4 12478//4\nf 12476//3 12480//3 12479//3\nf 12480//6 12476//6 12473//6\nf 12481//1 12484//1 12483//1\nf 12485//2 12486//2 12487//2\nf 12482//5 12486//5 12485//5\nf 12482//4 12483//4 12487//4\nf 12484//3 12488//3 12487//3\nf 12488//6 12484//6 12481//6\nf 12489//1 12492//1 12491//1\nf 12493//2 12494//2 12495//2\nf 12490//5 12494//5 12493//5\nf 12490//4 12491//4 12495//4\nf 12492//3 12496//3 12495//3\nf 12493//6 12496//6 12492//6\nf 12500//1 12499//1 12498//1\nf 12501//2 12502//2 12503//2\nf 12498//5 12502//5 12501//5\nf 12498//4 12499//4 12503//4\nf 12500//3 12504//3 12503//3\nf 12501//6 12504//6 12500//6\nf 12508//1 12507//1 12506//1\nf 12509//2 12510//2 12511//2\nf 12506//5 12510//5 12509//5\nf 12506//4 12507//4 12511//4\nf 12508//3 12512//3 12511//3\nf 12512//6 12508//6 12505//6\nf 12516//1 12515//1 12514//1\nf 12517//2 12518//2 12519//2\nf 12514//5 12518//5 12517//5\nf 12514//4 12515//4 12519//4\nf 12516//3 12520//3 12519//3\nf 12517//6 12520//6 12516//6\nf 12524//1 12523//1 12522//1\nf 12526//2 12527//2 12528//2\nf 12522//5 12526//5 12525//5\nf 12523//4 12527//4 12526//4\nf 12524//3 12528//3 12527//3\nf 12528//6 12524//6 12521//6\nf 12532//1 12531//1 12530//1\nf 12534//2 12535//2 12536//2\nf 12530//5 12534//5 12533//5\nf 12531//4 12535//4 12534//4\nf 12532//3 12536//3 12535//3\nf 12536//6 12532//6 12529//6\nf 12540//1 12539//1 12538//1\nf 12542//2 12543//2 12544//2\nf 12538//5 12542//5 12541//5\nf 12539//4 12543//4 12542//4\nf 12540//3 12544//3 12543//3\nf 12544//6 12540//6 12537//6\nf 12548//1 12547//1 12546//1\nf 12550//2 12551//2 12552//2\nf 12546//5 12550//5 12549//5\nf 12547//4 12551//4 12550//4\nf 12548//3 12552//3 12551//3\nf 12552//6 12548//6 12545//6\nf 12556//1 12555//1 12554//1\nf 12558//2 12559//2 12560//2\nf 12554//5 12558//5 12557//5\nf 12555//4 12559//4 12558//4\nf 12556//3 12560//3 12559//3\nf 12560//6 12556//6 12553//6\nf 12561//1 12564//1 12563//1\nf 12565//2 12566//2 12567//2\nf 12562//5 12566//5 12565//5\nf 12562//4 12563//4 12567//4\nf 12564//3 12568//3 12567//3\nf 12568//6 12564//6 12561//6\nf 12569//1 12572//1 12571//1\nf 12573//2 12574//2 12575//2\nf 12570//5 12574//5 12573//5\nf 12570//4 12571//4 12575//4\nf 12572//3 12576//3 12575//3\nf 12573//6 12576//6 12572//6\nf 12580//1 12579//1 12578//1\nf 12581//2 12582//2 12583//2\nf 12578//5 12582//5 12581//5\nf 12578//4 12579//4 12583//4\nf 12580//3 12584//3 12583//3\nf 12581//6 12584//6 12580//6\nf 12588//1 12587//1 12586//1\nf 12589//2 12590//2 12591//2\nf 12586//5 12590//5 12589//5\nf 12586//4 12587//4 12591//4\nf 12588//3 12592//3 12591//3\nf 12592//6 12588//6 12585//6\nf 12596//1 12595//1 12594//1\nf 12597//2 12598//2 12599//2\nf 12594//5 12598//5 12597//5\nf 12594//4 12595//4 12599//4\nf 12596//3 12600//3 12599//3\nf 12597//6 12600//6 12596//6\nf 12604//1 12603//1 12602//1\nf 12606//2 12607//2 12608//2\nf 12602//5 12606//5 12605//5\nf 12603//4 12607//4 12606//4\nf 12604//3 12608//3 12607//3\nf 12608//6 12604//6 12601//6\nf 12612//1 12611//1 12610//1\nf 12614//2 12615//2 12616//2\nf 12610//5 12614//5 12613//5\nf 12611//4 12615//4 12614//4\nf 12612//3 12616//3 12615//3\nf 12616//6 12612//6 12609//6\nf 12620//1 12619//1 12618//1\nf 12622//2 12623//2 12624//2\nf 12618//5 12622//5 12621//5\nf 12619//4 12623//4 12622//4\nf 12620//3 12624//3 12623//3\nf 12624//6 12620//6 12617//6\nf 12628//1 12627//1 12626//1\nf 12630//2 12631//2 12632//2\nf 12626//5 12630//5 12629//5\nf 12627//4 12631//4 12630//4\nf 12628//3 12632//3 12631//3\nf 12632//6 12628//6 12625//6\nf 12636//1 12635//1 12634//1\nf 12638//2 12639//2 12640//2\nf 12634//5 12638//5 12637//5\nf 12635//4 12639//4 12638//4\nf 12636//3 12640//3 12639//3\nf 12640//6 12636//6 12633//6\nf 12641//1 12644//1 12643//1\nf 12645//2 12646//2 12647//2\nf 12642//5 12646//5 12645//5\nf 12642//4 12643//4 12647//4\nf 12644//3 12648//3 12647//3\nf 12648//6 12644//6 12641//6\nf 12649//1 12652//1 12651//1\nf 12653//2 12654//2 12655//2\nf 12650//5 12654//5 12653//5\nf 12650//4 12651//4 12655//4\nf 12652//3 12656//3 12655//3\nf 12653//6 12656//6 12652//6\nf 12660//1 12659//1 12658//1\nf 12661//2 12662//2 12663//2\nf 12658//5 12662//5 12661//5\nf 12658//4 12659//4 12663//4\nf 12660//3 12664//3 12663//3\nf 12661//6 12664//6 12660//6\nf 12668//1 12667//1 12666//1\nf 12669//2 12670//2 12671//2\nf 12666//5 12670//5 12669//5\nf 12666//4 12667//4 12671//4\nf 12668//3 12672//3 12671//3\nf 12672//6 12668//6 12665//6\nf 12676//1 12675//1 12674//1\nf 12677//2 12678//2 12679//2\nf 12674//5 12678//5 12677//5\nf 12674//4 12675//4 12679//4\nf 12676//3 12680//3 12679//3\nf 12677//6 12680//6 12676//6\nf 12684//1 12683//1 12682//1\nf 12686//2 12687//2 12688//2\nf 12682//5 12686//5 12685//5\nf 12683//4 12687//4 12686//4\nf 12684//3 12688//3 12687//3\nf 12688//6 12684//6 12681//6\nf 12692//1 12691//1 12690//1\nf 12694//2 12695//2 12696//2\nf 12690//5 12694//5 12693//5\nf 12691//4 12695//4 12694//4\nf 12692//3 12696//3 12695//3\nf 12696//6 12692//6 12689//6\nf 12700//1 12699//1 12698//1\nf 12702//2 12703//2 12704//2\nf 12698//5 12702//5 12701//5\nf 12699//4 12703//4 12702//4\nf 12700//3 12704//3 12703//3\nf 12704//6 12700//6 12697//6\nf 12708//1 12707//1 12706//1\nf 12710//2 12711//2 12712//2\nf 12706//5 12710//5 12709//5\nf 12707//4 12711//4 12710//4\nf 12708//3 12712//3 12711//3\nf 12712//6 12708//6 12705//6\nf 12716//1 12715//1 12714//1\nf 12718//2 12719//2 12720//2\nf 12714//5 12718//5 12717//5\nf 12715//4 12719//4 12718//4\nf 12716//3 12720//3 12719//3\nf 12720//6 12716//6 12713//6\nf 12721//1 12724//1 12723//1\nf 12725//2 12726//2 12727//2\nf 12722//5 12726//5 12725//5\nf 12722//4 12723//4 12727//4\nf 12724//3 12728//3 12727//3\nf 12728//6 12724//6 12721//6\nf 12729//1 12732//1 12731//1\nf 12733//2 12734//2 12735//2\nf 12730//5 12734//5 12733//5\nf 12730//4 12731//4 12735//4\nf 12732//3 12736//3 12735//3\nf 12733//6 12736//6 12732//6\nf 12740//1 12739//1 12738//1\nf 12741//2 12742//2 12743//2\nf 12738//5 12742//5 12741//5\nf 12738//4 12739//4 12743//4\nf 12740//3 12744//3 12743//3\nf 12741//6 12744//6 12740//6\nf 12748//1 12747//1 12746//1\nf 12749//2 12750//2 12751//2\nf 12746//5 12750//5 12749//5\nf 12746//4 12747//4 12751//4\nf 12748//3 12752//3 12751//3\nf 12752//6 12748//6 12745//6\nf 12756//1 12755//1 12754//1\nf 12757//2 12758//2 12759//2\nf 12754//5 12758//5 12757//5\nf 12754//4 12755//4 12759//4\nf 12756//3 12760//3 12759//3\nf 12757//6 12760//6 12756//6\nf 12764//1 12763//1 12762//1\nf 12766//2 12767//2 12768//2\nf 12762//5 12766//5 12765//5\nf 12763//4 12767//4 12766//4\nf 12764//3 12768//3 12767//3\nf 12768//6 12764//6 12761//6\nf 12772//1 12771//1 12770//1\nf 12774//2 12775//2 12776//2\nf 12770//5 12774//5 12773//5\nf 12771//4 12775//4 12774//4\nf 12772//3 12776//3 12775//3\nf 12776//6 12772//6 12769//6\nf 12780//1 12779//1 12778//1\nf 12782//2 12783//2 12784//2\nf 12778//5 12782//5 12781//5\nf 12779//4 12783//4 12782//4\nf 12780//3 12784//3 12783//3\nf 12784//6 12780//6 12777//6\nf 12788//1 12787//1 12786//1\nf 12790//2 12791//2 12792//2\nf 12786//5 12790//5 12789//5\nf 12787//4 12791//4 12790//4\nf 12788//3 12792//3 12791//3\nf 12792//6 12788//6 12785//6\nf 12796//1 12795//1 12794//1\nf 12798//2 12799//2 12800//2\nf 12794//5 12798//5 12797//5\nf 12795//4 12799//4 12798//4\nf 12796//3 12800//3 12799//3\nf 12800//6 12796//6 12793//6\nf 12802//1 12803//1 12804//1\nf 12808//2 12807//2 12806//2\nf 12801//3 12805//3 12806//3\nf 12802//4 12806//4 12807//4\nf 12807//5 12808//5 12804//5\nf 12801//6 12804//6 12808//6\nf 12810//1 12811//1 12812//1\nf 12813//2 12816//2 12815//2\nf 12809//3 12813//3 12814//3\nf 12810//4 12814//4 12815//4\nf 12815//5 12816//5 12812//5\nf 12809//6 12812//6 12816//6\nf 12818//1 12819//1 12820//1\nf 12824//2 12823//2 12822//2\nf 12817//3 12821//3 12822//3\nf 12818//4 12822//4 12823//4\nf 12823//5 12824//5 12820//5\nf 12821//6 12817//6 12820//6\nf 12826//1 12827//1 12828//1\nf 12832//2 12831//2 12830//2\nf 12825//3 12829//3 12830//3\nf 12826//4 12830//4 12831//4\nf 12831//5 12832//5 12828//5\nf 12825//6 12828//6 12832//6\nf 12834//1 12835//1 12836//1\nf 12837//2 12840//2 12839//2\nf 12833//3 12837//3 12838//3\nf 12834//4 12838//4 12839//4\nf 12839//5 12840//5 12836//5\nf 12837//6 12833//6 12836//6\nf 12842//1 12843//1 12844//1\nf 12848//2 12847//2 12846//2\nf 12841//3 12845//3 12846//3\nf 12846//4 12847//4 12843//4\nf 12847//5 12848//5 12844//5\nf 12841//6 12844//6 12848//6\nf 12850//1 12851//1 12852//1\nf 12856//2 12855//2 12854//2\nf 12849//3 12853//3 12854//3\nf 12854//4 12855//4 12851//4\nf 12855//5 12856//5 12852//5\nf 12849//6 12852//6 12856//6\nf 12858//1 12859//1 12860//1\nf 12864//2 12863//2 12862//2\nf 12857//3 12861//3 12862//3\nf 12862//4 12863//4 12859//4\nf 12863//5 12864//5 12860//5\nf 12857//6 12860//6 12864//6\nf 12866//1 12867//1 12868//1\nf 12872//2 12871//2 12870//2\nf 12865//3 12869//3 12870//3\nf 12870//4 12871//4 12867//4\nf 12871//5 12872//5 12868//5\nf 12865//6 12868//6 12872//6\nf 12874//1 12875//1 12876//1\nf 12880//2 12879//2 12878//2\nf 12873//3 12877//3 12878//3\nf 12878//4 12879//4 12875//4\nf 12879//5 12880//5 12876//5\nf 12873//6 12876//6 12880//6\nf 12882//1 12883//1 12884//1\nf 12888//2 12887//2 12886//2\nf 12885//3 12886//3 12882//3\nf 12882//4 12886//4 12887//4\nf 12887//5 12888//5 12884//5\nf 12881//6 12884//6 12888//6\nf 12890//1 12891//1 12892//1\nf 12893//2 12896//2 12895//2\nf 12889//3 12893//3 12894//3\nf 12890//4 12894//4 12895//4\nf 12895//5 12896//5 12892//5\nf 12889//6 12892//6 12896//6\nf 12898//1 12899//1 12900//1\nf 12904//2 12903//2 12902//2\nf 12897//3 12901//3 12902//3\nf 12898//4 12902//4 12903//4\nf 12903//5 12904//5 12900//5\nf 12901//6 12897//6 12900//6\nf 12906//1 12907//1 12908//1\nf 12912//2 12911//2 12910//2\nf 12905//3 12909//3 12910//3\nf 12906//4 12910//4 12911//4\nf 12911//5 12912//5 12908//5\nf 12905//6 12908//6 12912//6\nf 12914//1 12915//1 12916//1\nf 12917//2 12920//2 12919//2\nf 12913//3 12917//3 12918//3\nf 12914//4 12918//4 12919//4\nf 12919//5 12920//5 12916//5\nf 12917//6 12913//6 12916//6\nf 12922//1 12923//1 12924//1\nf 12928//2 12927//2 12926//2\nf 12921//3 12925//3 12926//3\nf 12926//4 12927//4 12923//4\nf 12927//5 12928//5 12924//5\nf 12921//6 12924//6 12928//6\nf 12930//1 12931//1 12932//1\nf 12936//2 12935//2 12934//2\nf 12929//3 12933//3 12934//3\nf 12934//4 12935//4 12931//4\nf 12935//5 12936//5 12932//5\nf 12929//6 12932//6 12936//6\nf 12938//1 12939//1 12940//1\nf 12944//2 12943//2 12942//2\nf 12937//3 12941//3 12942//3\nf 12942//4 12943//4 12939//4\nf 12943//5 12944//5 12940//5\nf 12937//6 12940//6 12944//6\nf 12946//1 12947//1 12948//1\nf 12952//2 12951//2 12950//2\nf 12945//3 12949//3 12950//3\nf 12950//4 12951//4 12947//4\nf 12951//5 12952//5 12948//5\nf 12945//6 12948//6 12952//6\nf 12954//1 12955//1 12956//1\nf 12960//2 12959//2 12958//2\nf 12953//3 12957//3 12958//3\nf 12958//4 12959//4 12955//4\nf 12959//5 12960//5 12956//5\nf 12953//6 12956//6 12960//6\nf 12962//1 12963//1 12964//1\nf 12965//2 12968//2 12967//2\nf 12965//3 12966//3 12962//3\nf 12962//4 12966//4 12967//4\nf 12967//5 12968//5 12964//5\nf 12961//6 12964//6 12968//6\nf 12970//1 12971//1 12972//1\nf 12973//2 12976//2 12975//2\nf 12973//3 12974//3 12970//3\nf 12970//4 12974//4 12975//4\nf 12975//5 12976//5 12972//5\nf 12969//6 12972//6 12976//6\nf 12978//1 12979//1 12980//1\nf 12981//2 12984//2 12983//2\nf 12977//3 12981//3 12982//3\nf 12978//4 12982//4 12983//4\nf 12983//5 12984//5 12980//5\nf 12981//6 12977//6 12980//6\nf 12986//1 12987//1 12988//1\nf 12989//2 12992//2 12991//2\nf 12985//3 12989//3 12990//3\nf 12986//4 12990//4 12991//4\nf 12991//5 12992//5 12988//5\nf 12985//6 12988//6 12992//6\nf 12994//1 12995//1 12996//1\nf 12997//2 13000//2 12999//2\nf 12997//3 12998//3 12994//3\nf 12994//4 12998//4 12999//4\nf 12999//5 13000//5 12996//5\nf 12997//6 12993//6 12996//6\nf 13002//1 13003//1 13004//1\nf 13008//2 13007//2 13006//2\nf 13001//3 13005//3 13006//3\nf 13006//4 13007//4 13003//4\nf 13007//5 13008//5 13004//5\nf 13001//6 13004//6 13008//6\nf 13010//1 13011//1 13012//1\nf 13016//2 13015//2 13014//2\nf 13009//3 13013//3 13014//3\nf 13014//4 13015//4 13011//4\nf 13015//5 13016//5 13012//5\nf 13009//6 13012//6 13016//6\nf 13018//1 13019//1 13020//1\nf 13024//2 13023//2 13022//2\nf 13017//3 13021//3 13022//3\nf 13022//4 13023//4 13019//4\nf 13023//5 13024//5 13020//5\nf 13017//6 13020//6 13024//6\nf 13026//1 13027//1 13028//1\nf 13032//2 13031//2 13030//2\nf 13025//3 13029//3 13030//3\nf 13030//4 13031//4 13027//4\nf 13031//5 13032//5 13028//5\nf 13025//6 13028//6 13032//6\nf 13034//1 13035//1 13036//1\nf 13040//2 13039//2 13038//2\nf 13033//3 13037//3 13038//3\nf 13038//4 13039//4 13035//4\nf 13039//5 13040//5 13036//5\nf 13033//6 13036//6 13040//6\nf 13041//1 13042//1 13043//1\nf 13048//2 13047//2 13046//2\nf 13041//3 13045//3 13046//3\nf 13042//4 13046//4 13047//4\nf 13047//5 13048//5 13044//5\nf 13041//6 13044//6 13048//6\nf 13049//1 13050//1 13051//1\nf 13056//2 13055//2 13054//2\nf 13049//3 13053//3 13054//3\nf 13050//4 13054//4 13055//4\nf 13055//5 13056//5 13052//5\nf 13049//6 13052//6 13056//6\nf 13058//1 13059//1 13060//1\nf 13064//2 13063//2 13062//2\nf 13057//3 13061//3 13062//3\nf 13058//4 13062//4 13063//4\nf 13063//5 13064//5 13060//5\nf 13061//6 13057//6 13060//6\nf 13066//1 13067//1 13068//1\nf 13072//2 13071//2 13070//2\nf 13065//3 13069//3 13070//3\nf 13066//4 13070//4 13071//4\nf 13071//5 13072//5 13068//5\nf 13065//6 13068//6 13072//6\nf 13074//1 13075//1 13076//1\nf 13080//2 13079//2 13078//2\nf 13073//3 13077//3 13078//3\nf 13074//4 13078//4 13079//4\nf 13079//5 13080//5 13076//5\nf 13077//6 13073//6 13076//6\nf 13082//1 13083//1 13084//1\nf 13088//2 13087//2 13086//2\nf 13081//3 13085//3 13086//3\nf 13086//4 13087//4 13083//4\nf 13087//5 13088//5 13084//5\nf 13081//6 13084//6 13088//6\nf 13090//1 13091//1 13092//1\nf 13096//2 13095//2 13094//2\nf 13089//3 13093//3 13094//3\nf 13094//4 13095//4 13091//4\nf 13095//5 13096//5 13092//5\nf 13089//6 13092//6 13096//6\nf 13098//1 13099//1 13100//1\nf 13104//2 13103//2 13102//2\nf 13097//3 13101//3 13102//3\nf 13102//4 13103//4 13099//4\nf 13103//5 13104//5 13100//5\nf 13097//6 13100//6 13104//6\nf 13106//1 13107//1 13108//1\nf 13112//2 13111//2 13110//2\nf 13105//3 13109//3 13110//3\nf 13110//4 13111//4 13107//4\nf 13111//5 13112//5 13108//5\nf 13105//6 13108//6 13112//6\nf 13114//1 13115//1 13116//1\nf 13120//2 13119//2 13118//2\nf 13113//3 13117//3 13118//3\nf 13118//4 13119//4 13115//4\nf 13119//5 13120//5 13116//5\nf 13113//6 13116//6 13120//6\nf 13121//1 13122//1 13123//1\nf 13128//2 13127//2 13126//2\nf 13121//3 13125//3 13126//3\nf 13122//4 13126//4 13127//4\nf 13127//5 13128//5 13124//5\nf 13121//6 13124//6 13128//6\nf 13129//1 13130//1 13131//1\nf 13136//2 13135//2 13134//2\nf 13129//3 13133//3 13134//3\nf 13130//4 13134//4 13135//4\nf 13135//5 13136//5 13132//5\nf 13129//6 13132//6 13136//6\nf 13138//1 13139//1 13140//1\nf 13144//2 13143//2 13142//2\nf 13137//3 13141//3 13142//3\nf 13138//4 13142//4 13143//4\nf 13143//5 13144//5 13140//5\nf 13141//6 13137//6 13140//6\nf 13146//1 13147//1 13148//1\nf 13152//2 13151//2 13150//2\nf 13145//3 13149//3 13150//3\nf 13146//4 13150//4 13151//4\nf 13151//5 13152//5 13148//5\nf 13145//6 13148//6 13152//6\nf 13154//1 13155//1 13156//1\nf 13160//2 13159//2 13158//2\nf 13153//3 13157//3 13158//3\nf 13154//4 13158//4 13159//4\nf 13159//5 13160//5 13156//5\nf 13157//6 13153//6 13156//6\nf 13162//1 13163//1 13164//1\nf 13168//2 13167//2 13166//2\nf 13161//3 13165//3 13166//3\nf 13166//4 13167//4 13163//4\nf 13167//5 13168//5 13164//5\nf 13161//6 13164//6 13168//6\nf 13170//1 13171//1 13172//1\nf 13176//2 13175//2 13174//2\nf 13169//3 13173//3 13174//3\nf 13174//4 13175//4 13171//4\nf 13175//5 13176//5 13172//5\nf 13169//6 13172//6 13176//6\nf 13178//1 13179//1 13180//1\nf 13184//2 13183//2 13182//2\nf 13177//3 13181//3 13182//3\nf 13182//4 13183//4 13179//4\nf 13183//5 13184//5 13180//5\nf 13177//6 13180//6 13184//6\nf 13186//1 13187//1 13188//1\nf 13192//2 13191//2 13190//2\nf 13185//3 13189//3 13190//3\nf 13190//4 13191//4 13187//4\nf 13191//5 13192//5 13188//5\nf 13185//6 13188//6 13192//6\nf 13194//1 13195//1 13196//1\nf 13200//2 13199//2 13198//2\nf 13193//3 13197//3 13198//3\nf 13198//4 13199//4 13195//4\nf 13199//5 13200//5 13196//5\nf 13193//6 13196//6 13200//6\nf 13201//1 13202//1 13203//1\nf 13205//2 13208//2 13207//2\nf 13205//3 13206//3 13202//3\nf 13202//4 13206//4 13207//4\nf 13207//5 13208//5 13204//5\nf 13201//6 13204//6 13208//6\nf 13209//1 13210//1 13211//1\nf 13213//2 13216//2 13215//2\nf 13213//3 13214//3 13210//3\nf 13210//4 13214//4 13215//4\nf 13215//5 13216//5 13212//5\nf 13209//6 13212//6 13216//6\nf 13218//1 13219//1 13220//1\nf 13221//2 13224//2 13223//2\nf 13221//3 13222//3 13218//3\nf 13218//4 13222//4 13223//4\nf 13223//5 13224//5 13220//5\nf 13221//6 13217//6 13220//6\nf 13226//1 13227//1 13228//1\nf 13229//2 13232//2 13231//2\nf 13229//3 13230//3 13226//3\nf 13226//4 13230//4 13231//4\nf 13231//5 13232//5 13228//5\nf 13225//6 13228//6 13232//6\nf 13234//1 13235//1 13236//1\nf 13237//2 13240//2 13239//2\nf 13237//3 13238//3 13234//3\nf 13234//4 13238//4 13239//4\nf 13239//5 13240//5 13236//5\nf 13237//6 13233//6 13236//6\nf 13242//1 13243//1 13244//1\nf 13248//2 13247//2 13246//2\nf 13245//3 13246//3 13242//3\nf 13246//4 13247//4 13243//4\nf 13247//5 13248//5 13244//5\nf 13241//6 13244//6 13248//6\nf 13250//1 13251//1 13252//1\nf 13256//2 13255//2 13254//2\nf 13253//3 13254//3 13250//3\nf 13254//4 13255//4 13251//4\nf 13255//5 13256//5 13252//5\nf 13249//6 13252//6 13256//6\nf 13258//1 13259//1 13260//1\nf 13264//2 13263//2 13262//2\nf 13261//3 13262//3 13258//3\nf 13262//4 13263//4 13259//4\nf 13263//5 13264//5 13260//5\nf 13257//6 13260//6 13264//6\nf 13266//1 13267//1 13268//1\nf 13272//2 13271//2 13270//2\nf 13269//3 13270//3 13266//3\nf 13270//4 13271//4 13267//4\nf 13271//5 13272//5 13268//5\nf 13265//6 13268//6 13272//6\nf 13274//1 13275//1 13276//1\nf 13280//2 13279//2 13278//2\nf 13277//3 13278//3 13274//3\nf 13278//4 13279//4 13275//4\nf 13279//5 13280//5 13276//5\nf 13273//6 13276//6 13280//6\nf 13281//1 13282//1 13283//1\nf 13285//2 13288//2 13287//2\nf 13285//3 13286//3 13282//3\nf 13282//4 13286//4 13287//4\nf 13287//5 13288//5 13284//5\nf 13281//6 13284//6 13288//6\nf 13289//1 13290//1 13291//1\nf 13293//2 13296//2 13295//2\nf 13293//3 13294//3 13290//3\nf 13290//4 13294//4 13295//4\nf 13295//5 13296//5 13292//5\nf 13289//6 13292//6 13296//6\nf 13298//1 13299//1 13300//1\nf 13301//2 13304//2 13303//2\nf 13301//3 13302//3 13298//3\nf 13298//4 13302//4 13303//4\nf 13303//5 13304//5 13300//5\nf 13301//6 13297//6 13300//6\nf 13306//1 13307//1 13308//1\nf 13309//2 13312//2 13311//2\nf 13309//3 13310//3 13306//3\nf 13306//4 13310//4 13311//4\nf 13311//5 13312//5 13308//5\nf 13305//6 13308//6 13312//6\nf 13314//1 13315//1 13316//1\nf 13317//2 13320//2 13319//2\nf 13317//3 13318//3 13314//3\nf 13314//4 13318//4 13319//4\nf 13319//5 13320//5 13316//5\nf 13317//6 13313//6 13316//6\nf 13322//1 13323//1 13324//1\nf 13328//2 13327//2 13326//2\nf 13325//3 13326//3 13322//3\nf 13326//4 13327//4 13323//4\nf 13327//5 13328//5 13324//5\nf 13321//6 13324//6 13328//6\nf 13330//1 13331//1 13332//1\nf 13336//2 13335//2 13334//2\nf 13333//3 13334//3 13330//3\nf 13334//4 13335//4 13331//4\nf 13335//5 13336//5 13332//5\nf 13329//6 13332//6 13336//6\nf 13338//1 13339//1 13340//1\nf 13344//2 13343//2 13342//2\nf 13341//3 13342//3 13338//3\nf 13342//4 13343//4 13339//4\nf 13343//5 13344//5 13340//5\nf 13337//6 13340//6 13344//6\nf 13346//1 13347//1 13348//1\nf 13352//2 13351//2 13350//2\nf 13349//3 13350//3 13346//3\nf 13350//4 13351//4 13347//4\nf 13351//5 13352//5 13348//5\nf 13345//6 13348//6 13352//6\nf 13354//1 13355//1 13356//1\nf 13360//2 13359//2 13358//2\nf 13357//3 13358//3 13354//3\nf 13358//4 13359//4 13355//4\nf 13359//5 13360//5 13356//5\nf 13353//6 13356//6 13360//6\nf 13361//1 13362//1 13363//1\nf 13365//2 13368//2 13367//2\nf 13365//3 13366//3 13362//3\nf 13362//4 13366//4 13367//4\nf 13367//5 13368//5 13364//5\nf 13361//6 13364//6 13368//6\nf 13369//1 13370//1 13371//1\nf 13373//2 13376//2 13375//2\nf 13373//3 13374//3 13370//3\nf 13370//4 13374//4 13375//4\nf 13375//5 13376//5 13372//5\nf 13369//6 13372//6 13376//6\nf 13378//1 13379//1 13380//1\nf 13381//2 13384//2 13383//2\nf 13381//3 13382//3 13378//3\nf 13378//4 13382//4 13383//4\nf 13383//5 13384//5 13380//5\nf 13381//6 13377//6 13380//6\nf 13386//1 13387//1 13388//1\nf 13389//2 13392//2 13391//2\nf 13389//3 13390//3 13386//3\nf 13386//4 13390//4 13391//4\nf 13391//5 13392//5 13388//5\nf 13385//6 13388//6 13392//6\nf 13394//1 13395//1 13396//1\nf 13397//2 13400//2 13399//2\nf 13397//3 13398//3 13394//3\nf 13394//4 13398//4 13399//4\nf 13399//5 13400//5 13396//5\nf 13397//6 13393//6 13396//6\nf 13402//1 13403//1 13404//1\nf 13408//2 13407//2 13406//2\nf 13405//3 13406//3 13402//3\nf 13406//4 13407//4 13403//4\nf 13407//5 13408//5 13404//5\nf 13401//6 13404//6 13408//6\nf 13410//1 13411//1 13412//1\nf 13416//2 13415//2 13414//2\nf 13413//3 13414//3 13410//3\nf 13414//4 13415//4 13411//4\nf 13415//5 13416//5 13412//5\nf 13409//6 13412//6 13416//6\nf 13418//1 13419//1 13420//1\nf 13424//2 13423//2 13422//2\nf 13421//3 13422//3 13418//3\nf 13422//4 13423//4 13419//4\nf 13423//5 13424//5 13420//5\nf 13417//6 13420//6 13424//6\nf 13426//1 13427//1 13428//1\nf 13432//2 13431//2 13430//2\nf 13429//3 13430//3 13426//3\nf 13430//4 13431//4 13427//4\nf 13431//5 13432//5 13428//5\nf 13425//6 13428//6 13432//6\nf 13434//1 13435//1 13436//1\nf 13440//2 13439//2 13438//2\nf 13437//3 13438//3 13434//3\nf 13438//4 13439//4 13435//4\nf 13439//5 13440//5 13436//5\nf 13433//6 13436//6 13440//6\nf 13441//1 13442//1 13443//1\nf 13445//2 13448//2 13447//2\nf 13445//3 13446//3 13442//3\nf 13442//4 13446//4 13447//4\nf 13447//5 13448//5 13444//5\nf 13441//6 13444//6 13448//6\nf 13449//1 13450//1 13451//1\nf 13453//2 13456//2 13455//2\nf 13453//3 13454//3 13450//3\nf 13450//4 13454//4 13455//4\nf 13455//5 13456//5 13452//5\nf 13449//6 13452//6 13456//6\nf 13458//1 13459//1 13460//1\nf 13461//2 13464//2 13463//2\nf 13461//3 13462//3 13458//3\nf 13458//4 13462//4 13463//4\nf 13463//5 13464//5 13460//5\nf 13461//6 13457//6 13460//6\nf 13466//1 13467//1 13468//1\nf 13469//2 13472//2 13471//2\nf 13469//3 13470//3 13466//3\nf 13466//4 13470//4 13471//4\nf 13471//5 13472//5 13468//5\nf 13465//6 13468//6 13472//6\nf 13474//1 13475//1 13476//1\nf 13477//2 13480//2 13479//2\nf 13477//3 13478//3 13474//3\nf 13474//4 13478//4 13479//4\nf 13479//5 13480//5 13476//5\nf 13477//6 13473//6 13476//6\nf 13482//1 13483//1 13484//1\nf 13488//2 13487//2 13486//2\nf 13485//3 13486//3 13482//3\nf 13486//4 13487//4 13483//4\nf 13487//5 13488//5 13484//5\nf 13481//6 13484//6 13488//6\nf 13490//1 13491//1 13492//1\nf 13496//2 13495//2 13494//2\nf 13493//3 13494//3 13490//3\nf 13494//4 13495//4 13491//4\nf 13495//5 13496//5 13492//5\nf 13489//6 13492//6 13496//6\nf 13498//1 13499//1 13500//1\nf 13504//2 13503//2 13502//2\nf 13501//3 13502//3 13498//3\nf 13502//4 13503//4 13499//4\nf 13503//5 13504//5 13500//5\nf 13497//6 13500//6 13504//6\nf 13506//1 13507//1 13508//1\nf 13512//2 13511//2 13510//2\nf 13509//3 13510//3 13506//3\nf 13510//4 13511//4 13507//4\nf 13511//5 13512//5 13508//5\nf 13505//6 13508//6 13512//6\nf 13514//1 13515//1 13516//1\nf 13520//2 13519//2 13518//2\nf 13517//3 13518//3 13514//3\nf 13518//4 13519//4 13515//4\nf 13519//5 13520//5 13516//5\nf 13513//6 13516//6 13520//6\nf 13521//1 13522//1 13523//1\nf 13525//2 13528//2 13527//2\nf 13525//3 13526//3 13522//3\nf 13522//4 13526//4 13527//4\nf 13527//5 13528//5 13524//5\nf 13521//6 13524//6 13528//6\nf 13529//1 13530//1 13531//1\nf 13533//2 13536//2 13535//2\nf 13533//3 13534//3 13530//3\nf 13530//4 13534//4 13535//4\nf 13535//5 13536//5 13532//5\nf 13529//6 13532//6 13536//6\nf 13538//1 13539//1 13540//1\nf 13541//2 13544//2 13543//2\nf 13541//3 13542//3 13538//3\nf 13538//4 13542//4 13543//4\nf 13543//5 13544//5 13540//5\nf 13541//6 13537//6 13540//6\nf 13546//1 13547//1 13548//1\nf 13549//2 13552//2 13551//2\nf 13549//3 13550//3 13546//3\nf 13546//4 13550//4 13551//4\nf 13551//5 13552//5 13548//5\nf 13545//6 13548//6 13552//6\nf 13554//1 13555//1 13556//1\nf 13557//2 13560//2 13559//2\nf 13557//3 13558//3 13554//3\nf 13554//4 13558//4 13559//4\nf 13559//5 13560//5 13556//5\nf 13557//6 13553//6 13556//6\nf 13562//1 13563//1 13564//1\nf 13568//2 13567//2 13566//2\nf 13565//3 13566//3 13562//3\nf 13566//4 13567//4 13563//4\nf 13567//5 13568//5 13564//5\nf 13561//6 13564//6 13568//6\nf 13570//1 13571//1 13572//1\nf 13576//2 13575//2 13574//2\nf 13573//3 13574//3 13570//3\nf 13574//4 13575//4 13571//4\nf 13575//5 13576//5 13572//5\nf 13569//6 13572//6 13576//6\nf 13578//1 13579//1 13580//1\nf 13584//2 13583//2 13582//2\nf 13581//3 13582//3 13578//3\nf 13582//4 13583//4 13579//4\nf 13583//5 13584//5 13580//5\nf 13577//6 13580//6 13584//6\nf 13586//1 13587//1 13588//1\nf 13592//2 13591//2 13590//2\nf 13589//3 13590//3 13586//3\nf 13590//4 13591//4 13587//4\nf 13591//5 13592//5 13588//5\nf 13585//6 13588//6 13592//6\nf 13594//1 13595//1 13596//1\nf 13600//2 13599//2 13598//2\nf 13597//3 13598//3 13594//3\nf 13598//4 13599//4 13595//4\nf 13599//5 13600//5 13596//5\nf 13593//6 13596//6 13600//6\nf 13604//1 13603//1 13602//1\nf 13605//2 13606//2 13607//2\nf 13601//5 13602//5 13606//5\nf 13602//4 13603//4 13607//4\nf 13604//3 13608//3 13607//3\nf 13608//6 13604//6 13601//6\nf 13612//1 13611//1 13610//1\nf 13613//2 13614//2 13615//2\nf 13609//5 13610//5 13614//5\nf 13610//4 13611//4 13615//4\nf 13612//3 13616//3 13615//3\nf 13613//6 13616//6 13612//6\nf 13620//1 13619//1 13618//1\nf 13621//2 13622//2 13623//2\nf 13617//5 13618//5 13622//5\nf 13618//4 13619//4 13623//4\nf 13620//3 13624//3 13623//3\nf 13621//6 13624//6 13620//6\nf 13628//1 13627//1 13626//1\nf 13630//2 13631//2 13632//2\nf 13625//5 13626//5 13630//5\nf 13626//4 13627//4 13631//4\nf 13628//3 13632//3 13631//3\nf 13632//6 13628//6 13625//6\nf 13636//1 13635//1 13634//1\nf 13637//2 13638//2 13639//2\nf 13633//5 13634//5 13638//5\nf 13634//4 13635//4 13639//4\nf 13636//3 13640//3 13639//3\nf 13637//6 13640//6 13636//6\nf 13644//1 13643//1 13642//1\nf 13646//2 13647//2 13648//2\nf 13641//5 13642//5 13646//5\nf 13643//4 13647//4 13646//4\nf 13644//3 13648//3 13647//3\nf 13648//6 13644//6 13641//6\nf 13652//1 13651//1 13650//1\nf 13654//2 13655//2 13656//2\nf 13649//5 13650//5 13654//5\nf 13651//4 13655//4 13654//4\nf 13652//3 13656//3 13655//3\nf 13656//6 13652//6 13649//6\nf 13660//1 13659//1 13658//1\nf 13662//2 13663//2 13664//2\nf 13657//5 13658//5 13662//5\nf 13659//4 13663//4 13662//4\nf 13660//3 13664//3 13663//3\nf 13664//6 13660//6 13657//6\nf 13668//1 13667//1 13666//1\nf 13670//2 13671//2 13672//2\nf 13665//5 13666//5 13670//5\nf 13667//4 13671//4 13670//4\nf 13668//3 13672//3 13671//3\nf 13672//6 13668//6 13665//6\nf 13676//1 13675//1 13674//1\nf 13678//2 13679//2 13680//2\nf 13673//5 13674//5 13678//5\nf 13675//4 13679//4 13678//4\nf 13676//3 13680//3 13679//3\nf 13680//6 13676//6 13673//6\nf 13684//1 13683//1 13682//1\nf 13685//2 13686//2 13687//2\nf 13682//5 13686//5 13685//5\nf 13682//4 13683//4 13687//4\nf 13684//3 13688//3 13687//3\nf 13688//6 13684//6 13681//6\nf 13692//1 13691//1 13690//1\nf 13693//2 13694//2 13695//2\nf 13689//5 13690//5 13694//5\nf 13690//4 13691//4 13695//4\nf 13692//3 13696//3 13695//3\nf 13693//6 13696//6 13692//6\nf 13700//1 13699//1 13698//1\nf 13701//2 13702//2 13703//2\nf 13697//5 13698//5 13702//5\nf 13698//4 13699//4 13703//4\nf 13700//3 13704//3 13703//3\nf 13701//6 13704//6 13700//6\nf 13708//1 13707//1 13706//1\nf 13710//2 13711//2 13712//2\nf 13705//5 13706//5 13710//5\nf 13706//4 13707//4 13711//4\nf 13708//3 13712//3 13711//3\nf 13712//6 13708//6 13705//6\nf 13716//1 13715//1 13714//1\nf 13718//2 13719//2 13720//2\nf 13713//5 13714//5 13718//5\nf 13714//4 13715//4 13719//4\nf 13716//3 13720//3 13719//3\nf 13717//6 13720//6 13716//6\nf 13724//1 13723//1 13722//1\nf 13726//2 13727//2 13728//2\nf 13721//5 13722//5 13726//5\nf 13723//4 13727//4 13726//4\nf 13724//3 13728//3 13727//3\nf 13728//6 13724//6 13721//6\nf 13732//1 13731//1 13730//1\nf 13734//2 13735//2 13736//2\nf 13729//5 13730//5 13734//5\nf 13731//4 13735//4 13734//4\nf 13732//3 13736//3 13735//3\nf 13736//6 13732//6 13729//6\nf 13740//1 13739//1 13738//1\nf 13742//2 13743//2 13744//2\nf 13737//5 13738//5 13742//5\nf 13739//4 13743//4 13742//4\nf 13740//3 13744//3 13743//3\nf 13744//6 13740//6 13737//6\nf 13748//1 13747//1 13746//1\nf 13750//2 13751//2 13752//2\nf 13745//5 13746//5 13750//5\nf 13747//4 13751//4 13750//4\nf 13748//3 13752//3 13751//3\nf 13752//6 13748//6 13745//6\nf 13756//1 13755//1 13754//1\nf 13758//2 13759//2 13760//2\nf 13753//5 13754//5 13758//5\nf 13755//4 13759//4 13758//4\nf 13756//3 13760//3 13759//3\nf 13760//6 13756//6 13753//6\nf 13761//1 13764//1 13763//1\nf 13765//2 13766//2 13767//2\nf 13762//5 13766//5 13765//5\nf 13762//4 13763//4 13767//4\nf 13764//3 13768//3 13767//3\nf 13768//6 13764//6 13761//6\nf 13772//1 13771//1 13770//1\nf 13773//2 13774//2 13775//2\nf 13770//5 13774//5 13773//5\nf 13770//4 13771//4 13775//4\nf 13772//3 13776//3 13775//3\nf 13773//6 13776//6 13772//6\nf 13780//1 13779//1 13778//1\nf 13781//2 13782//2 13783//2\nf 13777//5 13778//5 13782//5\nf 13778//4 13779//4 13783//4\nf 13780//3 13784//3 13783//3\nf 13781//6 13784//6 13780//6\nf 13788//1 13787//1 13786//1\nf 13789//2 13790//2 13791//2\nf 13785//5 13786//5 13790//5\nf 13786//4 13787//4 13791//4\nf 13788//3 13792//3 13791//3\nf 13792//6 13788//6 13785//6\nf 13796//1 13795//1 13794//1\nf 13797//2 13798//2 13799//2\nf 13794//5 13798//5 13797//5\nf 13794//4 13795//4 13799//4\nf 13796//3 13800//3 13799//3\nf 13797//6 13800//6 13796//6\nf 13804//1 13803//1 13802//1\nf 13806//2 13807//2 13808//2\nf 13801//5 13802//5 13806//5\nf 13803//4 13807//4 13806//4\nf 13804//3 13808//3 13807//3\nf 13808//6 13804//6 13801//6\nf 13812//1 13811//1 13810//1\nf 13814//2 13815//2 13816//2\nf 13809//5 13810//5 13814//5\nf 13811//4 13815//4 13814//4\nf 13812//3 13816//3 13815//3\nf 13816//6 13812//6 13809//6\nf 13820//1 13819//1 13818//1\nf 13822//2 13823//2 13824//2\nf 13817//5 13818//5 13822//5\nf 13819//4 13823//4 13822//4\nf 13820//3 13824//3 13823//3\nf 13824//6 13820//6 13817//6\nf 13828//1 13827//1 13826//1\nf 13830//2 13831//2 13832//2\nf 13825//5 13826//5 13830//5\nf 13827//4 13831//4 13830//4\nf 13828//3 13832//3 13831//3\nf 13832//6 13828//6 13825//6\nf 13836//1 13835//1 13834//1\nf 13838//2 13839//2 13840//2\nf 13833//5 13834//5 13838//5\nf 13835//4 13839//4 13838//4\nf 13836//3 13840//3 13839//3\nf 13840//6 13836//6 13833//6\nf 13841//1 13844//1 13843//1\nf 13846//2 13847//2 13848//2\nf 13841//5 13842//5 13846//5\nf 13842//4 13843//4 13847//4\nf 13844//3 13848//3 13847//3\nf 13848//6 13844//6 13841//6\nf 13849//1 13852//1 13851//1\nf 13854//2 13855//2 13856//2\nf 13849//5 13850//5 13854//5\nf 13850//4 13851//4 13855//4\nf 13852//3 13856//3 13855//3\nf 13853//6 13856//6 13852//6\nf 13860//1 13859//1 13858//1\nf 13862//2 13863//2 13864//2\nf 13857//5 13858//5 13862//5\nf 13858//4 13859//4 13863//4\nf 13860//3 13864//3 13863//3\nf 13861//6 13864//6 13860//6\nf 13868//1 13867//1 13866//1\nf 13870//2 13871//2 13872//2\nf 13865//5 13866//5 13870//5\nf 13866//4 13867//4 13871//4\nf 13868//3 13872//3 13871//3\nf 13872//6 13868//6 13865//6\nf 13876//1 13875//1 13874//1\nf 13878//2 13879//2 13880//2\nf 13873//5 13874//5 13878//5\nf 13874//4 13875//4 13879//4\nf 13876//3 13880//3 13879//3\nf 13877//6 13880//6 13876//6\nf 13884//1 13883//1 13882//1\nf 13886//2 13887//2 13888//2\nf 13881//5 13882//5 13886//5\nf 13883//4 13887//4 13886//4\nf 13884//3 13888//3 13887//3\nf 13888//6 13884//6 13881//6\nf 13892//1 13891//1 13890//1\nf 13894//2 13895//2 13896//2\nf 13889//5 13890//5 13894//5\nf 13891//4 13895//4 13894//4\nf 13892//3 13896//3 13895//3\nf 13896//6 13892//6 13889//6\nf 13900//1 13899//1 13898//1\nf 13902//2 13903//2 13904//2\nf 13897//5 13898//5 13902//5\nf 13899//4 13903//4 13902//4\nf 13900//3 13904//3 13903//3\nf 13904//6 13900//6 13897//6\nf 13908//1 13907//1 13906//1\nf 13910//2 13911//2 13912//2\nf 13905//5 13906//5 13910//5\nf 13907//4 13911//4 13910//4\nf 13908//3 13912//3 13911//3\nf 13912//6 13908//6 13905//6\nf 13916//1 13915//1 13914//1\nf 13918//2 13919//2 13920//2\nf 13913//5 13914//5 13918//5\nf 13915//4 13919//4 13918//4\nf 13916//3 13920//3 13919//3\nf 13920//6 13916//6 13913//6\nf 13921//1 13924//1 13923//1\nf 13926//2 13927//2 13928//2\nf 13921//5 13922//5 13926//5\nf 13922//4 13923//4 13927//4\nf 13924//3 13928//3 13927//3\nf 13928//6 13924//6 13921//6\nf 13929//1 13932//1 13931//1\nf 13934//2 13935//2 13936//2\nf 13929//5 13930//5 13934//5\nf 13930//4 13931//4 13935//4\nf 13932//3 13936//3 13935//3\nf 13933//6 13936//6 13932//6\nf 13940//1 13939//1 13938//1\nf 13942//2 13943//2 13944//2\nf 13937//5 13938//5 13942//5\nf 13938//4 13939//4 13943//4\nf 13940//3 13944//3 13943//3\nf 13941//6 13944//6 13940//6\nf 13948//1 13947//1 13946//1\nf 13950//2 13951//2 13952//2\nf 13945//5 13946//5 13950//5\nf 13946//4 13947//4 13951//4\nf 13948//3 13952//3 13951//3\nf 13952//6 13948//6 13945//6\nf 13956//1 13955//1 13954//1\nf 13958//2 13959//2 13960//2\nf 13953//5 13954//5 13958//5\nf 13954//4 13955//4 13959//4\nf 13956//3 13960//3 13959//3\nf 13957//6 13960//6 13956//6\nf 13964//1 13963//1 13962//1\nf 13966//2 13967//2 13968//2\nf 13961//5 13962//5 13966//5\nf 13963//4 13967//4 13966//4\nf 13964//3 13968//3 13967//3\nf 13968//6 13964//6 13961//6\nf 13972//1 13971//1 13970//1\nf 13974//2 13975//2 13976//2\nf 13969//5 13970//5 13974//5\nf 13971//4 13975//4 13974//4\nf 13972//3 13976//3 13975//3\nf 13976//6 13972//6 13969//6\nf 13980//1 13979//1 13978//1\nf 13982//2 13983//2 13984//2\nf 13977//5 13978//5 13982//5\nf 13979//4 13983//4 13982//4\nf 13980//3 13984//3 13983//3\nf 13984//6 13980//6 13977//6\nf 13988//1 13987//1 13986//1\nf 13990//2 13991//2 13992//2\nf 13985//5 13986//5 13990//5\nf 13987//4 13991//4 13990//4\nf 13988//3 13992//3 13991//3\nf 13992//6 13988//6 13985//6\nf 13996//1 13995//1 13994//1\nf 13998//2 13999//2 14000//2\nf 13993//5 13994//5 13998//5\nf 13995//4 13999//4 13998//4\nf 13996//3 14000//3 13999//3\nf 14000//6 13996//6 13993//6\nf 14001//1 14004//1 14003//1\nf 14005//2 14006//2 14007//2\nf 14002//5 14006//5 14005//5\nf 14002//4 14003//4 14007//4\nf 14004//3 14008//3 14007//3\nf 14008//6 14004//6 14001//6\nf 14009//1 14012//1 14011//1\nf 14013//2 14014//2 14015//2\nf 14010//5 14014//5 14013//5\nf 14010//4 14011//4 14015//4\nf 14012//3 14016//3 14015//3\nf 14013//6 14016//6 14012//6\nf 14020//1 14019//1 14018//1\nf 14021//2 14022//2 14023//2\nf 14018//5 14022//5 14021//5\nf 14018//4 14019//4 14023//4\nf 14020//3 14024//3 14023//3\nf 14021//6 14024//6 14020//6\nf 14028//1 14027//1 14026//1\nf 14029//2 14030//2 14031//2\nf 14026//5 14030//5 14029//5\nf 14026//4 14027//4 14031//4\nf 14028//3 14032//3 14031//3\nf 14032//6 14028//6 14025//6\nf 14036//1 14035//1 14034//1\nf 14037//2 14038//2 14039//2\nf 14034//5 14038//5 14037//5\nf 14034//4 14035//4 14039//4\nf 14036//3 14040//3 14039//3\nf 14037//6 14040//6 14036//6\nf 14044//1 14043//1 14042//1\nf 14046//2 14047//2 14048//2\nf 14042//5 14046//5 14045//5\nf 14043//4 14047//4 14046//4\nf 14044//3 14048//3 14047//3\nf 14048//6 14044//6 14041//6\nf 14052//1 14051//1 14050//1\nf 14054//2 14055//2 14056//2\nf 14050//5 14054//5 14053//5\nf 14051//4 14055//4 14054//4\nf 14052//3 14056//3 14055//3\nf 14056//6 14052//6 14049//6\nf 14060//1 14059//1 14058//1\nf 14062//2 14063//2 14064//2\nf 14058//5 14062//5 14061//5\nf 14059//4 14063//4 14062//4\nf 14060//3 14064//3 14063//3\nf 14064//6 14060//6 14057//6\nf 14068//1 14067//1 14066//1\nf 14070//2 14071//2 14072//2\nf 14066//5 14070//5 14069//5\nf 14067//4 14071//4 14070//4\nf 14068//3 14072//3 14071//3\nf 14072//6 14068//6 14065//6\nf 14076//1 14075//1 14074//1\nf 14078//2 14079//2 14080//2\nf 14074//5 14078//5 14077//5\nf 14075//4 14079//4 14078//4\nf 14076//3 14080//3 14079//3\nf 14080//6 14076//6 14073//6\nf 14081//1 14084//1 14083//1\nf 14085//2 14086//2 14087//2\nf 14082//5 14086//5 14085//5\nf 14082//4 14083//4 14087//4\nf 14084//3 14088//3 14087//3\nf 14088//6 14084//6 14081//6\nf 14089//1 14092//1 14091//1\nf 14093//2 14094//2 14095//2\nf 14090//5 14094//5 14093//5\nf 14090//4 14091//4 14095//4\nf 14092//3 14096//3 14095//3\nf 14093//6 14096//6 14092//6\nf 14100//1 14099//1 14098//1\nf 14101//2 14102//2 14103//2\nf 14098//5 14102//5 14101//5\nf 14098//4 14099//4 14103//4\nf 14100//3 14104//3 14103//3\nf 14101//6 14104//6 14100//6\nf 14108//1 14107//1 14106//1\nf 14109//2 14110//2 14111//2\nf 14106//5 14110//5 14109//5\nf 14106//4 14107//4 14111//4\nf 14108//3 14112//3 14111//3\nf 14112//6 14108//6 14105//6\nf 14116//1 14115//1 14114//1\nf 14117//2 14118//2 14119//2\nf 14114//5 14118//5 14117//5\nf 14114//4 14115//4 14119//4\nf 14116//3 14120//3 14119//3\nf 14117//6 14120//6 14116//6\nf 14124//1 14123//1 14122//1\nf 14126//2 14127//2 14128//2\nf 14122//5 14126//5 14125//5\nf 14123//4 14127//4 14126//4\nf 14124//3 14128//3 14127//3\nf 14128//6 14124//6 14121//6\nf 14132//1 14131//1 14130//1\nf 14134//2 14135//2 14136//2\nf 14130//5 14134//5 14133//5\nf 14131//4 14135//4 14134//4\nf 14132//3 14136//3 14135//3\nf 14136//6 14132//6 14129//6\nf 14140//1 14139//1 14138//1\nf 14142//2 14143//2 14144//2\nf 14138//5 14142//5 14141//5\nf 14139//4 14143//4 14142//4\nf 14140//3 14144//3 14143//3\nf 14144//6 14140//6 14137//6\nf 14148//1 14147//1 14146//1\nf 14150//2 14151//2 14152//2\nf 14146//5 14150//5 14149//5\nf 14147//4 14151//4 14150//4\nf 14148//3 14152//3 14151//3\nf 14152//6 14148//6 14145//6\nf 14156//1 14155//1 14154//1\nf 14158//2 14159//2 14160//2\nf 14154//5 14158//5 14157//5\nf 14155//4 14159//4 14158//4\nf 14156//3 14160//3 14159//3\nf 14160//6 14156//6 14153//6\nf 14161//1 14164//1 14163//1\nf 14165//2 14166//2 14167//2\nf 14162//5 14166//5 14165//5\nf 14162//4 14163//4 14167//4\nf 14164//3 14168//3 14167//3\nf 14168//6 14164//6 14161//6\nf 14169//1 14172//1 14171//1\nf 14173//2 14174//2 14175//2\nf 14170//5 14174//5 14173//5\nf 14170//4 14171//4 14175//4\nf 14172//3 14176//3 14175//3\nf 14173//6 14176//6 14172//6\nf 14180//1 14179//1 14178//1\nf 14181//2 14182//2 14183//2\nf 14178//5 14182//5 14181//5\nf 14178//4 14179//4 14183//4\nf 14180//3 14184//3 14183//3\nf 14181//6 14184//6 14180//6\nf 14188//1 14187//1 14186//1\nf 14189//2 14190//2 14191//2\nf 14186//5 14190//5 14189//5\nf 14186//4 14187//4 14191//4\nf 14188//3 14192//3 14191//3\nf 14192//6 14188//6 14185//6\nf 14196//1 14195//1 14194//1\nf 14197//2 14198//2 14199//2\nf 14194//5 14198//5 14197//5\nf 14194//4 14195//4 14199//4\nf 14196//3 14200//3 14199//3\nf 14197//6 14200//6 14196//6\nf 14204//1 14203//1 14202//1\nf 14206//2 14207//2 14208//2\nf 14202//5 14206//5 14205//5\nf 14203//4 14207//4 14206//4\nf 14204//3 14208//3 14207//3\nf 14208//6 14204//6 14201//6\nf 14212//1 14211//1 14210//1\nf 14214//2 14215//2 14216//2\nf 14210//5 14214//5 14213//5\nf 14211//4 14215//4 14214//4\nf 14212//3 14216//3 14215//3\nf 14216//6 14212//6 14209//6\nf 14220//1 14219//1 14218//1\nf 14222//2 14223//2 14224//2\nf 14218//5 14222//5 14221//5\nf 14219//4 14223//4 14222//4\nf 14220//3 14224//3 14223//3\nf 14224//6 14220//6 14217//6\nf 14228//1 14227//1 14226//1\nf 14230//2 14231//2 14232//2\nf 14226//5 14230//5 14229//5\nf 14227//4 14231//4 14230//4\nf 14228//3 14232//3 14231//3\nf 14232//6 14228//6 14225//6\nf 14236//1 14235//1 14234//1\nf 14238//2 14239//2 14240//2\nf 14234//5 14238//5 14237//5\nf 14235//4 14239//4 14238//4\nf 14236//3 14240//3 14239//3\nf 14240//6 14236//6 14233//6\nf 14241//1 14244//1 14243//1\nf 14245//2 14246//2 14247//2\nf 14242//5 14246//5 14245//5\nf 14242//4 14243//4 14247//4\nf 14244//3 14248//3 14247//3\nf 14248//6 14244//6 14241//6\nf 14249//1 14252//1 14251//1\nf 14253//2 14254//2 14255//2\nf 14250//5 14254//5 14253//5\nf 14250//4 14251//4 14255//4\nf 14252//3 14256//3 14255//3\nf 14253//6 14256//6 14252//6\nf 14260//1 14259//1 14258//1\nf 14261//2 14262//2 14263//2\nf 14258//5 14262//5 14261//5\nf 14258//4 14259//4 14263//4\nf 14260//3 14264//3 14263//3\nf 14261//6 14264//6 14260//6\nf 14268//1 14267//1 14266//1\nf 14269//2 14270//2 14271//2\nf 14266//5 14270//5 14269//5\nf 14266//4 14267//4 14271//4\nf 14268//3 14272//3 14271//3\nf 14272//6 14268//6 14265//6\nf 14276//1 14275//1 14274//1\nf 14277//2 14278//2 14279//2\nf 14274//5 14278//5 14277//5\nf 14274//4 14275//4 14279//4\nf 14276//3 14280//3 14279//3\nf 14277//6 14280//6 14276//6\nf 14284//1 14283//1 14282//1\nf 14286//2 14287//2 14288//2\nf 14282//5 14286//5 14285//5\nf 14283//4 14287//4 14286//4\nf 14284//3 14288//3 14287//3\nf 14288//6 14284//6 14281//6\nf 14292//1 14291//1 14290//1\nf 14294//2 14295//2 14296//2\nf 14290//5 14294//5 14293//5\nf 14291//4 14295//4 14294//4\nf 14292//3 14296//3 14295//3\nf 14296//6 14292//6 14289//6\nf 14300//1 14299//1 14298//1\nf 14302//2 14303//2 14304//2\nf 14298//5 14302//5 14301//5\nf 14299//4 14303//4 14302//4\nf 14300//3 14304//3 14303//3\nf 14304//6 14300//6 14297//6\nf 14308//1 14307//1 14306//1\nf 14310//2 14311//2 14312//2\nf 14306//5 14310//5 14309//5\nf 14307//4 14311//4 14310//4\nf 14308//3 14312//3 14311//3\nf 14312//6 14308//6 14305//6\nf 14316//1 14315//1 14314//1\nf 14318//2 14319//2 14320//2\nf 14314//5 14318//5 14317//5\nf 14315//4 14319//4 14318//4\nf 14316//3 14320//3 14319//3\nf 14320//6 14316//6 14313//6\nf 14321//1 14324//1 14323//1\nf 14325//2 14326//2 14327//2\nf 14322//5 14326//5 14325//5\nf 14322//4 14323//4 14327//4\nf 14324//3 14328//3 14327//3\nf 14328//6 14324//6 14321//6\nf 14329//1 14332//1 14331//1\nf 14333//2 14334//2 14335//2\nf 14330//5 14334//5 14333//5\nf 14330//4 14331//4 14335//4\nf 14332//3 14336//3 14335//3\nf 14333//6 14336//6 14332//6\nf 14340//1 14339//1 14338//1\nf 14341//2 14342//2 14343//2\nf 14338//5 14342//5 14341//5\nf 14338//4 14339//4 14343//4\nf 14340//3 14344//3 14343//3\nf 14341//6 14344//6 14340//6\nf 14348//1 14347//1 14346//1\nf 14349//2 14350//2 14351//2\nf 14346//5 14350//5 14349//5\nf 14346//4 14347//4 14351//4\nf 14348//3 14352//3 14351//3\nf 14352//6 14348//6 14345//6\nf 14356//1 14355//1 14354//1\nf 14357//2 14358//2 14359//2\nf 14354//5 14358//5 14357//5\nf 14354//4 14355//4 14359//4\nf 14356//3 14360//3 14359//3\nf 14357//6 14360//6 14356//6\nf 14364//1 14363//1 14362//1\nf 14366//2 14367//2 14368//2\nf 14362//5 14366//5 14365//5\nf 14363//4 14367//4 14366//4\nf 14364//3 14368//3 14367//3\nf 14368//6 14364//6 14361//6\nf 14372//1 14371//1 14370//1\nf 14374//2 14375//2 14376//2\nf 14370//5 14374//5 14373//5\nf 14371//4 14375//4 14374//4\nf 14372//3 14376//3 14375//3\nf 14376//6 14372//6 14369//6\nf 14380//1 14379//1 14378//1\nf 14382//2 14383//2 14384//2\nf 14378//5 14382//5 14381//5\nf 14379//4 14383//4 14382//4\nf 14380//3 14384//3 14383//3\nf 14384//6 14380//6 14377//6\nf 14388//1 14387//1 14386//1\nf 14390//2 14391//2 14392//2\nf 14386//5 14390//5 14389//5\nf 14387//4 14391//4 14390//4\nf 14388//3 14392//3 14391//3\nf 14392//6 14388//6 14385//6\nf 14396//1 14395//1 14394//1\nf 14398//2 14399//2 14400//2\nf 14394//5 14398//5 14397//5\nf 14395//4 14399//4 14398//4\nf 14396//3 14400//3 14399//3\nf 14400//6 14396//6 14393//6\nf 14402//1 14403//1 14404//1\nf 14408//2 14407//2 14406//2\nf 14401//3 14405//3 14406//3\nf 14402//4 14406//4 14407//4\nf 14407//5 14408//5 14404//5\nf 14401//6 14404//6 14408//6\nf 14410//1 14411//1 14412//1\nf 14413//2 14416//2 14415//2\nf 14409//3 14413//3 14414//3\nf 14410//4 14414//4 14415//4\nf 14415//5 14416//5 14412//5\nf 14409//6 14412//6 14416//6\nf 14418//1 14419//1 14420//1\nf 14424//2 14423//2 14422//2\nf 14417//3 14421//3 14422//3\nf 14418//4 14422//4 14423//4\nf 14423//5 14424//5 14420//5\nf 14421//6 14417//6 14420//6\nf 14426//1 14427//1 14428//1\nf 14432//2 14431//2 14430//2\nf 14425//3 14429//3 14430//3\nf 14426//4 14430//4 14431//4\nf 14431//5 14432//5 14428//5\nf 14425//6 14428//6 14432//6\nf 14434//1 14435//1 14436//1\nf 14437//2 14440//2 14439//2\nf 14433//3 14437//3 14438//3\nf 14434//4 14438//4 14439//4\nf 14439//5 14440//5 14436//5\nf 14437//6 14433//6 14436//6\nf 14442//1 14443//1 14444//1\nf 14448//2 14447//2 14446//2\nf 14441//3 14445//3 14446//3\nf 14446//4 14447//4 14443//4\nf 14447//5 14448//5 14444//5\nf 14441//6 14444//6 14448//6\nf 14450//1 14451//1 14452//1\nf 14456//2 14455//2 14454//2\nf 14449//3 14453//3 14454//3\nf 14454//4 14455//4 14451//4\nf 14455//5 14456//5 14452//5\nf 14449//6 14452//6 14456//6\nf 14458//1 14459//1 14460//1\nf 14464//2 14463//2 14462//2\nf 14457//3 14461//3 14462//3\nf 14462//4 14463//4 14459//4\nf 14463//5 14464//5 14460//5\nf 14457//6 14460//6 14464//6\nf 14466//1 14467//1 14468//1\nf 14472//2 14471//2 14470//2\nf 14465//3 14469//3 14470//3\nf 14470//4 14471//4 14467//4\nf 14471//5 14472//5 14468//5\nf 14465//6 14468//6 14472//6\nf 14474//1 14475//1 14476//1\nf 14480//2 14479//2 14478//2\nf 14473//3 14477//3 14478//3\nf 14478//4 14479//4 14475//4\nf 14479//5 14480//5 14476//5\nf 14473//6 14476//6 14480//6\nf 14482//1 14483//1 14484//1\nf 14488//2 14487//2 14486//2\nf 14485//3 14486//3 14482//3\nf 14482//4 14486//4 14487//4\nf 14487//5 14488//5 14484//5\nf 14481//6 14484//6 14488//6\nf 14490//1 14491//1 14492//1\nf 14493//2 14496//2 14495//2\nf 14489//3 14493//3 14494//3\nf 14490//4 14494//4 14495//4\nf 14495//5 14496//5 14492//5\nf 14489//6 14492//6 14496//6\nf 14498//1 14499//1 14500//1\nf 14504//2 14503//2 14502//2\nf 14501//3 14502//3 14498//3\nf 14498//4 14502//4 14503//4\nf 14503//5 14504//5 14500//5\nf 14501//6 14497//6 14500//6\nf 14506//1 14507//1 14508//1\nf 14512//2 14511//2 14510//2\nf 14505//3 14509//3 14510//3\nf 14506//4 14510//4 14511//4\nf 14511//5 14512//5 14508//5\nf 14505//6 14508//6 14512//6\nf 14514//1 14515//1 14516//1\nf 14517//2 14520//2 14519//2\nf 14513//3 14517//3 14518//3\nf 14514//4 14518//4 14519//4\nf 14519//5 14520//5 14516//5\nf 14517//6 14513//6 14516//6\nf 14522//1 14523//1 14524//1\nf 14528//2 14527//2 14526//2\nf 14521//3 14525//3 14526//3\nf 14526//4 14527//4 14523//4\nf 14527//5 14528//5 14524//5\nf 14521//6 14524//6 14528//6\nf 14530//1 14531//1 14532//1\nf 14536//2 14535//2 14534//2\nf 14529//3 14533//3 14534//3\nf 14534//4 14535//4 14531//4\nf 14535//5 14536//5 14532//5\nf 14529//6 14532//6 14536//6\nf 14538//1 14539//1 14540//1\nf 14544//2 14543//2 14542//2\nf 14537//3 14541//3 14542//3\nf 14542//4 14543//4 14539//4\nf 14543//5 14544//5 14540//5\nf 14537//6 14540//6 14544//6\nf 14546//1 14547//1 14548//1\nf 14552//2 14551//2 14550//2\nf 14545//3 14549//3 14550//3\nf 14550//4 14551//4 14547//4\nf 14551//5 14552//5 14548//5\nf 14545//6 14548//6 14552//6\nf 14554//1 14555//1 14556//1\nf 14560//2 14559//2 14558//2\nf 14553//3 14557//3 14558//3\nf 14558//4 14559//4 14555//4\nf 14559//5 14560//5 14556//5\nf 14553//6 14556//6 14560//6\nf 14562//1 14563//1 14564//1\nf 14565//2 14568//2 14567//2\nf 14565//3 14566//3 14562//3\nf 14562//4 14566//4 14567//4\nf 14567//5 14568//5 14564//5\nf 14561//6 14564//6 14568//6\nf 14570//1 14571//1 14572//1\nf 14573//2 14576//2 14575//2\nf 14573//3 14574//3 14570//3\nf 14570//4 14574//4 14575//4\nf 14575//5 14576//5 14572//5\nf 14569//6 14572//6 14576//6\nf 14578//1 14579//1 14580//1\nf 14581//2 14584//2 14583//2\nf 14581//3 14582//3 14578//3\nf 14578//4 14582//4 14583//4\nf 14583//5 14584//5 14580//5\nf 14581//6 14577//6 14580//6\nf 14586//1 14587//1 14588//1\nf 14589//2 14592//2 14591//2\nf 14589//3 14590//3 14586//3\nf 14586//4 14590//4 14591//4\nf 14591//5 14592//5 14588//5\nf 14585//6 14588//6 14592//6\nf 14594//1 14595//1 14596//1\nf 14597//2 14600//2 14599//2\nf 14597//3 14598//3 14594//3\nf 14594//4 14598//4 14599//4\nf 14599//5 14600//5 14596//5\nf 14597//6 14593//6 14596//6\nf 14602//1 14603//1 14604//1\nf 14608//2 14607//2 14606//2\nf 14601//3 14605//3 14606//3\nf 14606//4 14607//4 14603//4\nf 14607//5 14608//5 14604//5\nf 14601//6 14604//6 14608//6\nf 14610//1 14611//1 14612//1\nf 14616//2 14615//2 14614//2\nf 14609//3 14613//3 14614//3\nf 14614//4 14615//4 14611//4\nf 14615//5 14616//5 14612//5\nf 14609//6 14612//6 14616//6\nf 14618//1 14619//1 14620//1\nf 14624//2 14623//2 14622//2\nf 14617//3 14621//3 14622//3\nf 14622//4 14623//4 14619//4\nf 14623//5 14624//5 14620//5\nf 14617//6 14620//6 14624//6\nf 14626//1 14627//1 14628//1\nf 14632//2 14631//2 14630//2\nf 14625//3 14629//3 14630//3\nf 14630//4 14631//4 14627//4\nf 14631//5 14632//5 14628//5\nf 14625//6 14628//6 14632//6\nf 14634//1 14635//1 14636//1\nf 14640//2 14639//2 14638//2\nf 14633//3 14637//3 14638//3\nf 14638//4 14639//4 14635//4\nf 14639//5 14640//5 14636//5\nf 14633//6 14636//6 14640//6\nf 14641//1 14642//1 14643//1\nf 14648//2 14647//2 14646//2\nf 14641//3 14645//3 14646//3\nf 14642//4 14646//4 14647//4\nf 14647//5 14648//5 14644//5\nf 14641//6 14644//6 14648//6\nf 14649//1 14650//1 14651//1\nf 14656//2 14655//2 14654//2\nf 14649//3 14653//3 14654//3\nf 14650//4 14654//4 14655//4\nf 14655//5 14656//5 14652//5\nf 14649//6 14652//6 14656//6\nf 14658//1 14659//1 14660//1\nf 14664//2 14663//2 14662//2\nf 14657//3 14661//3 14662//3\nf 14658//4 14662//4 14663//4\nf 14663//5 14664//5 14660//5\nf 14661//6 14657//6 14660//6\nf 14666//1 14667//1 14668//1\nf 14672//2 14671//2 14670//2\nf 14665//3 14669//3 14670//3\nf 14666//4 14670//4 14671//4\nf 14671//5 14672//5 14668//5\nf 14665//6 14668//6 14672//6\nf 14674//1 14675//1 14676//1\nf 14680//2 14679//2 14678//2\nf 14673//3 14677//3 14678//3\nf 14674//4 14678//4 14679//4\nf 14679//5 14680//5 14676//5\nf 14677//6 14673//6 14676//6\nf 14682//1 14683//1 14684//1\nf 14688//2 14687//2 14686//2\nf 14681//3 14685//3 14686//3\nf 14686//4 14687//4 14683//4\nf 14687//5 14688//5 14684//5\nf 14681//6 14684//6 14688//6\nf 14690//1 14691//1 14692//1\nf 14696//2 14695//2 14694//2\nf 14689//3 14693//3 14694//3\nf 14694//4 14695//4 14691//4\nf 14695//5 14696//5 14692//5\nf 14689//6 14692//6 14696//6\nf 14698//1 14699//1 14700//1\nf 14704//2 14703//2 14702//2\nf 14697//3 14701//3 14702//3\nf 14702//4 14703//4 14699//4\nf 14703//5 14704//5 14700//5\nf 14697//6 14700//6 14704//6\nf 14706//1 14707//1 14708//1\nf 14712//2 14711//2 14710//2\nf 14705//3 14709//3 14710//3\nf 14710//4 14711//4 14707//4\nf 14711//5 14712//5 14708//5\nf 14705//6 14708//6 14712//6\nf 14714//1 14715//1 14716//1\nf 14720//2 14719//2 14718//2\nf 14713//3 14717//3 14718//3\nf 14718//4 14719//4 14715//4\nf 14719//5 14720//5 14716//5\nf 14713//6 14716//6 14720//6\nf 14721//1 14722//1 14723//1\nf 14728//2 14727//2 14726//2\nf 14721//3 14725//3 14726//3\nf 14722//4 14726//4 14727//4\nf 14727//5 14728//5 14724//5\nf 14721//6 14724//6 14728//6\nf 14729//1 14730//1 14731//1\nf 14736//2 14735//2 14734//2\nf 14729//3 14733//3 14734//3\nf 14730//4 14734//4 14735//4\nf 14735//5 14736//5 14732//5\nf 14729//6 14732//6 14736//6\nf 14738//1 14739//1 14740//1\nf 14744//2 14743//2 14742//2\nf 14737//3 14741//3 14742//3\nf 14738//4 14742//4 14743//4\nf 14743//5 14744//5 14740//5\nf 14741//6 14737//6 14740//6\nf 14746//1 14747//1 14748//1\nf 14752//2 14751//2 14750//2\nf 14745//3 14749//3 14750//3\nf 14746//4 14750//4 14751//4\nf 14751//5 14752//5 14748//5\nf 14745//6 14748//6 14752//6\nf 14754//1 14755//1 14756//1\nf 14760//2 14759//2 14758//2\nf 14753//3 14757//3 14758//3\nf 14754//4 14758//4 14759//4\nf 14759//5 14760//5 14756//5\nf 14757//6 14753//6 14756//6\nf 14762//1 14763//1 14764//1\nf 14768//2 14767//2 14766//2\nf 14761//3 14765//3 14766//3\nf 14766//4 14767//4 14763//4\nf 14767//5 14768//5 14764//5\nf 14761//6 14764//6 14768//6\nf 14770//1 14771//1 14772//1\nf 14776//2 14775//2 14774//2\nf 14769//3 14773//3 14774//3\nf 14774//4 14775//4 14771//4\nf 14775//5 14776//5 14772//5\nf 14769//6 14772//6 14776//6\nf 14778//1 14779//1 14780//1\nf 14784//2 14783//2 14782//2\nf 14777//3 14781//3 14782//3\nf 14782//4 14783//4 14779//4\nf 14783//5 14784//5 14780//5\nf 14777//6 14780//6 14784//6\nf 14786//1 14787//1 14788//1\nf 14792//2 14791//2 14790//2\nf 14785//3 14789//3 14790//3\nf 14790//4 14791//4 14787//4\nf 14791//5 14792//5 14788//5\nf 14785//6 14788//6 14792//6\nf 14794//1 14795//1 14796//1\nf 14800//2 14799//2 14798//2\nf 14793//3 14797//3 14798//3\nf 14798//4 14799//4 14795//4\nf 14799//5 14800//5 14796//5\nf 14793//6 14796//6 14800//6\nf 14801//1 14802//1 14803//1\nf 14805//2 14808//2 14807//2\nf 14805//3 14806//3 14802//3\nf 14802//4 14806//4 14807//4\nf 14807//5 14808//5 14804//5\nf 14801//6 14804//6 14808//6\nf 14809//1 14810//1 14811//1\nf 14813//2 14816//2 14815//2\nf 14813//3 14814//3 14810//3\nf 14810//4 14814//4 14815//4\nf 14815//5 14816//5 14812//5\nf 14809//6 14812//6 14816//6\nf 14818//1 14819//1 14820//1\nf 14821//2 14824//2 14823//2\nf 14821//3 14822//3 14818//3\nf 14818//4 14822//4 14823//4\nf 14823//5 14824//5 14820//5\nf 14821//6 14817//6 14820//6\nf 14826//1 14827//1 14828//1\nf 14829//2 14832//2 14831//2\nf 14829//3 14830//3 14826//3\nf 14826//4 14830//4 14831//4\nf 14831//5 14832//5 14828//5\nf 14825//6 14828//6 14832//6\nf 14834//1 14835//1 14836//1\nf 14837//2 14840//2 14839//2\nf 14837//3 14838//3 14834//3\nf 14834//4 14838//4 14839//4\nf 14839//5 14840//5 14836//5\nf 14837//6 14833//6 14836//6\nf 14842//1 14843//1 14844//1\nf 14848//2 14847//2 14846//2\nf 14845//3 14846//3 14842//3\nf 14846//4 14847//4 14843//4\nf 14847//5 14848//5 14844//5\nf 14841//6 14844//6 14848//6\nf 14850//1 14851//1 14852//1\nf 14856//2 14855//2 14854//2\nf 14853//3 14854//3 14850//3\nf 14854//4 14855//4 14851//4\nf 14855//5 14856//5 14852//5\nf 14849//6 14852//6 14856//6\nf 14858//1 14859//1 14860//1\nf 14864//2 14863//2 14862//2\nf 14861//3 14862//3 14858//3\nf 14862//4 14863//4 14859//4\nf 14863//5 14864//5 14860//5\nf 14857//6 14860//6 14864//6\nf 14866//1 14867//1 14868//1\nf 14872//2 14871//2 14870//2\nf 14869//3 14870//3 14866//3\nf 14870//4 14871//4 14867//4\nf 14871//5 14872//5 14868//5\nf 14865//6 14868//6 14872//6\nf 14874//1 14875//1 14876//1\nf 14880//2 14879//2 14878//2\nf 14877//3 14878//3 14874//3\nf 14878//4 14879//4 14875//4\nf 14879//5 14880//5 14876//5\nf 14873//6 14876//6 14880//6\nf 14881//1 14882//1 14883//1\nf 14885//2 14888//2 14887//2\nf 14885//3 14886//3 14882//3\nf 14882//4 14886//4 14887//4\nf 14887//5 14888//5 14884//5\nf 14881//6 14884//6 14888//6\nf 14889//1 14890//1 14891//1\nf 14893//2 14896//2 14895//2\nf 14893//3 14894//3 14890//3\nf 14890//4 14894//4 14895//4\nf 14895//5 14896//5 14892//5\nf 14889//6 14892//6 14896//6\nf 14898//1 14899//1 14900//1\nf 14901//2 14904//2 14903//2\nf 14901//3 14902//3 14898//3\nf 14898//4 14902//4 14903//4\nf 14903//5 14904//5 14900//5\nf 14901//6 14897//6 14900//6\nf 14906//1 14907//1 14908//1\nf 14909//2 14912//2 14911//2\nf 14909//3 14910//3 14906//3\nf 14906//4 14910//4 14911//4\nf 14911//5 14912//5 14908//5\nf 14905//6 14908//6 14912//6\nf 14914//1 14915//1 14916//1\nf 14917//2 14920//2 14919//2\nf 14917//3 14918//3 14914//3\nf 14914//4 14918//4 14919//4\nf 14919//5 14920//5 14916//5\nf 14917//6 14913//6 14916//6\nf 14922//1 14923//1 14924//1\nf 14928//2 14927//2 14926//2\nf 14925//3 14926//3 14922//3\nf 14926//4 14927//4 14923//4\nf 14927//5 14928//5 14924//5\nf 14921//6 14924//6 14928//6\nf 14930//1 14931//1 14932//1\nf 14936//2 14935//2 14934//2\nf 14933//3 14934//3 14930//3\nf 14934//4 14935//4 14931//4\nf 14935//5 14936//5 14932//5\nf 14929//6 14932//6 14936//6\nf 14938//1 14939//1 14940//1\nf 14944//2 14943//2 14942//2\nf 14941//3 14942//3 14938//3\nf 14942//4 14943//4 14939//4\nf 14943//5 14944//5 14940//5\nf 14937//6 14940//6 14944//6\nf 14946//1 14947//1 14948//1\nf 14952//2 14951//2 14950//2\nf 14949//3 14950//3 14946//3\nf 14950//4 14951//4 14947//4\nf 14951//5 14952//5 14948//5\nf 14945//6 14948//6 14952//6\nf 14954//1 14955//1 14956//1\nf 14960//2 14959//2 14958//2\nf 14957//3 14958//3 14954//3\nf 14958//4 14959//4 14955//4\nf 14959//5 14960//5 14956//5\nf 14953//6 14956//6 14960//6\nf 14961//1 14962//1 14963//1\nf 14965//2 14968//2 14967//2\nf 14965//3 14966//3 14962//3\nf 14962//4 14966//4 14967//4\nf 14967//5 14968//5 14964//5\nf 14961//6 14964//6 14968//6\nf 14969//1 14970//1 14971//1\nf 14973//2 14976//2 14975//2\nf 14973//3 14974//3 14970//3\nf 14970//4 14974//4 14975//4\nf 14975//5 14976//5 14972//5\nf 14969//6 14972//6 14976//6\nf 14978//1 14979//1 14980//1\nf 14981//2 14984//2 14983//2\nf 14981//3 14982//3 14978//3\nf 14978//4 14982//4 14983//4\nf 14983//5 14984//5 14980//5\nf 14981//6 14977//6 14980//6\nf 14986//1 14987//1 14988//1\nf 14989//2 14992//2 14991//2\nf 14989//3 14990//3 14986//3\nf 14986//4 14990//4 14991//4\nf 14991//5 14992//5 14988//5\nf 14985//6 14988//6 14992//6\nf 14994//1 14995//1 14996//1\nf 14997//2 15000//2 14999//2\nf 14997//3 14998//3 14994//3\nf 14994//4 14998//4 14999//4\nf 14999//5 15000//5 14996//5\nf 14997//6 14993//6 14996//6\nf 15002//1 15003//1 15004//1\nf 15008//2 15007//2 15006//2\nf 15005//3 15006//3 15002//3\nf 15006//4 15007//4 15003//4\nf 15007//5 15008//5 15004//5\nf 15001//6 15004//6 15008//6\nf 15010//1 15011//1 15012//1\nf 15016//2 15015//2 15014//2\nf 15013//3 15014//3 15010//3\nf 15014//4 15015//4 15011//4\nf 15015//5 15016//5 15012//5\nf 15009//6 15012//6 15016//6\nf 15018//1 15019//1 15020//1\nf 15024//2 15023//2 15022//2\nf 15021//3 15022//3 15018//3\nf 15022//4 15023//4 15019//4\nf 15023//5 15024//5 15020//5\nf 15017//6 15020//6 15024//6\nf 15026//1 15027//1 15028//1\nf 15032//2 15031//2 15030//2\nf 15029//3 15030//3 15026//3\nf 15030//4 15031//4 15027//4\nf 15031//5 15032//5 15028//5\nf 15025//6 15028//6 15032//6\nf 15034//1 15035//1 15036//1\nf 15040//2 15039//2 15038//2\nf 15037//3 15038//3 15034//3\nf 15038//4 15039//4 15035//4\nf 15039//5 15040//5 15036//5\nf 15033//6 15036//6 15040//6\nf 15041//1 15042//1 15043//1\nf 15045//2 15048//2 15047//2\nf 15045//3 15046//3 15042//3\nf 15042//4 15046//4 15047//4\nf 15047//5 15048//5 15044//5\nf 15041//6 15044//6 15048//6\nf 15049//1 15050//1 15051//1\nf 15053//2 15056//2 15055//2\nf 15053//3 15054//3 15050//3\nf 15050//4 15054//4 15055//4\nf 15055//5 15056//5 15052//5\nf 15049//6 15052//6 15056//6\nf 15058//1 15059//1 15060//1\nf 15061//2 15064//2 15063//2\nf 15061//3 15062//3 15058//3\nf 15058//4 15062//4 15063//4\nf 15063//5 15064//5 15060//5\nf 15061//6 15057//6 15060//6\nf 15066//1 15067//1 15068//1\nf 15069//2 15072//2 15071//2\nf 15069//3 15070//3 15066//3\nf 15066//4 15070//4 15071//4\nf 15071//5 15072//5 15068//5\nf 15065//6 15068//6 15072//6\nf 15074//1 15075//1 15076//1\nf 15077//2 15080//2 15079//2\nf 15077//3 15078//3 15074//3\nf 15074//4 15078//4 15079//4\nf 15079//5 15080//5 15076//5\nf 15077//6 15073//6 15076//6\nf 15082//1 15083//1 15084//1\nf 15088//2 15087//2 15086//2\nf 15085//3 15086//3 15082//3\nf 15086//4 15087//4 15083//4\nf 15087//5 15088//5 15084//5\nf 15081//6 15084//6 15088//6\nf 15090//1 15091//1 15092//1\nf 15096//2 15095//2 15094//2\nf 15093//3 15094//3 15090//3\nf 15094//4 15095//4 15091//4\nf 15095//5 15096//5 15092//5\nf 15089//6 15092//6 15096//6\nf 15098//1 15099//1 15100//1\nf 15104//2 15103//2 15102//2\nf 15101//3 15102//3 15098//3\nf 15102//4 15103//4 15099//4\nf 15103//5 15104//5 15100//5\nf 15097//6 15100//6 15104//6\nf 15106//1 15107//1 15108//1\nf 15112//2 15111//2 15110//2\nf 15109//3 15110//3 15106//3\nf 15110//4 15111//4 15107//4\nf 15111//5 15112//5 15108//5\nf 15105//6 15108//6 15112//6\nf 15114//1 15115//1 15116//1\nf 15120//2 15119//2 15118//2\nf 15117//3 15118//3 15114//3\nf 15118//4 15119//4 15115//4\nf 15119//5 15120//5 15116//5\nf 15113//6 15116//6 15120//6\nf 15121//1 15122//1 15123//1\nf 15125//2 15128//2 15127//2\nf 15125//3 15126//3 15122//3\nf 15122//4 15126//4 15127//4\nf 15127//5 15128//5 15124//5\nf 15121//6 15124//6 15128//6\nf 15129//1 15130//1 15131//1\nf 15133//2 15136//2 15135//2\nf 15133//3 15134//3 15130//3\nf 15130//4 15134//4 15135//4\nf 15135//5 15136//5 15132//5\nf 15129//6 15132//6 15136//6\nf 15138//1 15139//1 15140//1\nf 15141//2 15144//2 15143//2\nf 15141//3 15142//3 15138//3\nf 15138//4 15142//4 15143//4\nf 15143//5 15144//5 15140//5\nf 15141//6 15137//6 15140//6\nf 15146//1 15147//1 15148//1\nf 15149//2 15152//2 15151//2\nf 15149//3 15150//3 15146//3\nf 15146//4 15150//4 15151//4\nf 15151//5 15152//5 15148//5\nf 15145//6 15148//6 15152//6\nf 15154//1 15155//1 15156//1\nf 15157//2 15160//2 15159//2\nf 15157//3 15158//3 15154//3\nf 15154//4 15158//4 15159//4\nf 15159//5 15160//5 15156//5\nf 15157//6 15153//6 15156//6\nf 15162//1 15163//1 15164//1\nf 15168//2 15167//2 15166//2\nf 15165//3 15166//3 15162//3\nf 15166//4 15167//4 15163//4\nf 15167//5 15168//5 15164//5\nf 15161//6 15164//6 15168//6\nf 15170//1 15171//1 15172//1\nf 15176//2 15175//2 15174//2\nf 15173//3 15174//3 15170//3\nf 15174//4 15175//4 15171//4\nf 15175//5 15176//5 15172//5\nf 15169//6 15172//6 15176//6\nf 15178//1 15179//1 15180//1\nf 15184//2 15183//2 15182//2\nf 15181//3 15182//3 15178//3\nf 15182//4 15183//4 15179//4\nf 15183//5 15184//5 15180//5\nf 15177//6 15180//6 15184//6\nf 15186//1 15187//1 15188//1\nf 15192//2 15191//2 15190//2\nf 15189//3 15190//3 15186//3\nf 15190//4 15191//4 15187//4\nf 15191//5 15192//5 15188//5\nf 15185//6 15188//6 15192//6\nf 15194//1 15195//1 15196//1\nf 15200//2 15199//2 15198//2\nf 15197//3 15198//3 15194//3\nf 15198//4 15199//4 15195//4\nf 15199//5 15200//5 15196//5\nf 15193//6 15196//6 15200//6\nf 15204//1 15203//1 15202//1\nf 15205//2 15206//2 15207//2\nf 15201//5 15202//5 15206//5\nf 15202//4 15203//4 15207//4\nf 15204//3 15208//3 15207//3\nf 15208//6 15204//6 15201//6\nf 15212//1 15211//1 15210//1\nf 15213//2 15214//2 15215//2\nf 15209//5 15210//5 15214//5\nf 15210//4 15211//4 15215//4\nf 15212//3 15216//3 15215//3\nf 15213//6 15216//6 15212//6\nf 15220//1 15219//1 15218//1\nf 15221//2 15222//2 15223//2\nf 15217//5 15218//5 15222//5\nf 15218//4 15219//4 15223//4\nf 15220//3 15224//3 15223//3\nf 15221//6 15224//6 15220//6\nf 15228//1 15227//1 15226//1\nf 15230//2 15231//2 15232//2\nf 15225//5 15226//5 15230//5\nf 15226//4 15227//4 15231//4\nf 15228//3 15232//3 15231//3\nf 15232//6 15228//6 15225//6\nf 15236//1 15235//1 15234//1\nf 15237//2 15238//2 15239//2\nf 15233//5 15234//5 15238//5\nf 15234//4 15235//4 15239//4\nf 15236//3 15240//3 15239//3\nf 15237//6 15240//6 15236//6\nf 15244//1 15243//1 15242//1\nf 15246//2 15247//2 15248//2\nf 15241//5 15242//5 15246//5\nf 15243//4 15247//4 15246//4\nf 15244//3 15248//3 15247//3\nf 15248//6 15244//6 15241//6\nf 15252//1 15251//1 15250//1\nf 15254//2 15255//2 15256//2\nf 15249//5 15250//5 15254//5\nf 15251//4 15255//4 15254//4\nf 15252//3 15256//3 15255//3\nf 15256//6 15252//6 15249//6\nf 15260//1 15259//1 15258//1\nf 15262//2 15263//2 15264//2\nf 15257//5 15258//5 15262//5\nf 15259//4 15263//4 15262//4\nf 15260//3 15264//3 15263//3\nf 15264//6 15260//6 15257//6\nf 15268//1 15267//1 15266//1\nf 15270//2 15271//2 15272//2\nf 15265//5 15266//5 15270//5\nf 15267//4 15271//4 15270//4\nf 15268//3 15272//3 15271//3\nf 15272//6 15268//6 15265//6\nf 15276//1 15275//1 15274//1\nf 15278//2 15279//2 15280//2\nf 15273//5 15274//5 15278//5\nf 15275//4 15279//4 15278//4\nf 15276//3 15280//3 15279//3\nf 15280//6 15276//6 15273//6\nf 15284//1 15283//1 15282//1\nf 15285//2 15286//2 15287//2\nf 15282//5 15286//5 15285//5\nf 15282//4 15283//4 15287//4\nf 15284//3 15288//3 15287//3\nf 15288//6 15284//6 15281//6\nf 15292//1 15291//1 15290//1\nf 15293//2 15294//2 15295//2\nf 15289//5 15290//5 15294//5\nf 15290//4 15291//4 15295//4\nf 15292//3 15296//3 15295//3\nf 15293//6 15296//6 15292//6\nf 15300//1 15299//1 15298//1\nf 15301//2 15302//2 15303//2\nf 15298//5 15302//5 15301//5\nf 15298//4 15299//4 15303//4\nf 15300//3 15304//3 15303//3\nf 15301//6 15304//6 15300//6\nf 15308//1 15307//1 15306//1\nf 15310//2 15311//2 15312//2\nf 15305//5 15306//5 15310//5\nf 15306//4 15307//4 15311//4\nf 15308//3 15312//3 15311//3\nf 15312//6 15308//6 15305//6\nf 15316//1 15315//1 15314//1\nf 15318//2 15319//2 15320//2\nf 15313//5 15314//5 15318//5\nf 15314//4 15315//4 15319//4\nf 15316//3 15320//3 15319//3\nf 15317//6 15320//6 15316//6\nf 15324//1 15323//1 15322//1\nf 15326//2 15327//2 15328//2\nf 15321//5 15322//5 15326//5\nf 15323//4 15327//4 15326//4\nf 15324//3 15328//3 15327//3\nf 15328//6 15324//6 15321//6\nf 15332//1 15331//1 15330//1\nf 15334//2 15335//2 15336//2\nf 15329//5 15330//5 15334//5\nf 15331//4 15335//4 15334//4\nf 15332//3 15336//3 15335//3\nf 15336//6 15332//6 15329//6\nf 15340//1 15339//1 15338//1\nf 15342//2 15343//2 15344//2\nf 15337//5 15338//5 15342//5\nf 15339//4 15343//4 15342//4\nf 15340//3 15344//3 15343//3\nf 15344//6 15340//6 15337//6\nf 15348//1 15347//1 15346//1\nf 15350//2 15351//2 15352//2\nf 15345//5 15346//5 15350//5\nf 15347//4 15351//4 15350//4\nf 15348//3 15352//3 15351//3\nf 15352//6 15348//6 15345//6\nf 15356//1 15355//1 15354//1\nf 15358//2 15359//2 15360//2\nf 15353//5 15354//5 15358//5\nf 15355//4 15359//4 15358//4\nf 15356//3 15360//3 15359//3\nf 15360//6 15356//6 15353//6\nf 15361//1 15364//1 15363//1\nf 15365//2 15366//2 15367//2\nf 15362//5 15366//5 15365//5\nf 15362//4 15363//4 15367//4\nf 15364//3 15368//3 15367//3\nf 15368//6 15364//6 15361//6\nf 15372//1 15371//1 15370//1\nf 15373//2 15374//2 15375//2\nf 15370//5 15374//5 15373//5\nf 15370//4 15371//4 15375//4\nf 15372//3 15376//3 15375//3\nf 15373//6 15376//6 15372//6\nf 15380//1 15379//1 15378//1\nf 15381//2 15382//2 15383//2\nf 15378//5 15382//5 15381//5\nf 15378//4 15379//4 15383//4\nf 15380//3 15384//3 15383//3\nf 15381//6 15384//6 15380//6\nf 15388//1 15387//1 15386//1\nf 15389//2 15390//2 15391//2\nf 15386//5 15390//5 15389//5\nf 15386//4 15387//4 15391//4\nf 15388//3 15392//3 15391//3\nf 15392//6 15388//6 15385//6\nf 15396//1 15395//1 15394//1\nf 15397//2 15398//2 15399//2\nf 15394//5 15398//5 15397//5\nf 15394//4 15395//4 15399//4\nf 15396//3 15400//3 15399//3\nf 15397//6 15400//6 15396//6\nf 15404//1 15403//1 15402//1\nf 15406//2 15407//2 15408//2\nf 15401//5 15402//5 15406//5\nf 15403//4 15407//4 15406//4\nf 15404//3 15408//3 15407//3\nf 15408//6 15404//6 15401//6\nf 15412//1 15411//1 15410//1\nf 15414//2 15415//2 15416//2\nf 15409//5 15410//5 15414//5\nf 15411//4 15415//4 15414//4\nf 15412//3 15416//3 15415//3\nf 15416//6 15412//6 15409//6\nf 15420//1 15419//1 15418//1\nf 15422//2 15423//2 15424//2\nf 15417//5 15418//5 15422//5\nf 15419//4 15423//4 15422//4\nf 15420//3 15424//3 15423//3\nf 15424//6 15420//6 15417//6\nf 15428//1 15427//1 15426//1\nf 15430//2 15431//2 15432//2\nf 15425//5 15426//5 15430//5\nf 15427//4 15431//4 15430//4\nf 15428//3 15432//3 15431//3\nf 15432//6 15428//6 15425//6\nf 15436//1 15435//1 15434//1\nf 15438//2 15439//2 15440//2\nf 15433//5 15434//5 15438//5\nf 15435//4 15439//4 15438//4\nf 15436//3 15440//3 15439//3\nf 15440//6 15436//6 15433//6\nf 15441//1 15444//1 15443//1\nf 15446//2 15447//2 15448//2\nf 15441//5 15442//5 15446//5\nf 15442//4 15443//4 15447//4\nf 15444//3 15448//3 15447//3\nf 15448//6 15444//6 15441//6\nf 15449//1 15452//1 15451//1\nf 15454//2 15455//2 15456//2\nf 15449//5 15450//5 15454//5\nf 15450//4 15451//4 15455//4\nf 15452//3 15456//3 15455//3\nf 15453//6 15456//6 15452//6\nf 15460//1 15459//1 15458//1\nf 15462//2 15463//2 15464//2\nf 15457//5 15458//5 15462//5\nf 15458//4 15459//4 15463//4\nf 15460//3 15464//3 15463//3\nf 15461//6 15464//6 15460//6\nf 15468//1 15467//1 15466//1\nf 15470//2 15471//2 15472//2\nf 15465//5 15466//5 15470//5\nf 15466//4 15467//4 15471//4\nf 15468//3 15472//3 15471//3\nf 15472//6 15468//6 15465//6\nf 15476//1 15475//1 15474//1\nf 15478//2 15479//2 15480//2\nf 15473//5 15474//5 15478//5\nf 15474//4 15475//4 15479//4\nf 15476//3 15480//3 15479//3\nf 15477//6 15480//6 15476//6\nf 15484//1 15483//1 15482//1\nf 15486//2 15487//2 15488//2\nf 15481//5 15482//5 15486//5\nf 15483//4 15487//4 15486//4\nf 15484//3 15488//3 15487//3\nf 15488//6 15484//6 15481//6\nf 15492//1 15491//1 15490//1\nf 15494//2 15495//2 15496//2\nf 15489//5 15490//5 15494//5\nf 15491//4 15495//4 15494//4\nf 15492//3 15496//3 15495//3\nf 15496//6 15492//6 15489//6\nf 15500//1 15499//1 15498//1\nf 15502//2 15503//2 15504//2\nf 15497//5 15498//5 15502//5\nf 15499//4 15503//4 15502//4\nf 15500//3 15504//3 15503//3\nf 15504//6 15500//6 15497//6\nf 15508//1 15507//1 15506//1\nf 15510//2 15511//2 15512//2\nf 15505//5 15506//5 15510//5\nf 15507//4 15511//4 15510//4\nf 15508//3 15512//3 15511//3\nf 15512//6 15508//6 15505//6\nf 15516//1 15515//1 15514//1\nf 15518//2 15519//2 15520//2\nf 15513//5 15514//5 15518//5\nf 15515//4 15519//4 15518//4\nf 15516//3 15520//3 15519//3\nf 15520//6 15516//6 15513//6\nf 15521//1 15524//1 15523//1\nf 15526//2 15527//2 15528//2\nf 15521//5 15522//5 15526//5\nf 15522//4 15523//4 15527//4\nf 15524//3 15528//3 15527//3\nf 15528//6 15524//6 15521//6\nf 15529//1 15532//1 15531//1\nf 15534//2 15535//2 15536//2\nf 15529//5 15530//5 15534//5\nf 15530//4 15531//4 15535//4\nf 15532//3 15536//3 15535//3\nf 15533//6 15536//6 15532//6\nf 15540//1 15539//1 15538//1\nf 15542//2 15543//2 15544//2\nf 15537//5 15538//5 15542//5\nf 15538//4 15539//4 15543//4\nf 15540//3 15544//3 15543//3\nf 15541//6 15544//6 15540//6\nf 15548//1 15547//1 15546//1\nf 15550//2 15551//2 15552//2\nf 15545//5 15546//5 15550//5\nf 15546//4 15547//4 15551//4\nf 15548//3 15552//3 15551//3\nf 15552//6 15548//6 15545//6\nf 15556//1 15555//1 15554//1\nf 15558//2 15559//2 15560//2\nf 15553//5 15554//5 15558//5\nf 15554//4 15555//4 15559//4\nf 15556//3 15560//3 15559//3\nf 15557//6 15560//6 15556//6\nf 15564//1 15563//1 15562//1\nf 15566//2 15567//2 15568//2\nf 15561//5 15562//5 15566//5\nf 15563//4 15567//4 15566//4\nf 15564//3 15568//3 15567//3\nf 15568//6 15564//6 15561//6\nf 15572//1 15571//1 15570//1\nf 15574//2 15575//2 15576//2\nf 15569//5 15570//5 15574//5\nf 15571//4 15575//4 15574//4\nf 15572//3 15576//3 15575//3\nf 15576//6 15572//6 15569//6\nf 15580//1 15579//1 15578//1\nf 15582//2 15583//2 15584//2\nf 15577//5 15578//5 15582//5\nf 15579//4 15583//4 15582//4\nf 15580//3 15584//3 15583//3\nf 15584//6 15580//6 15577//6\nf 15588//1 15587//1 15586//1\nf 15590//2 15591//2 15592//2\nf 15585//5 15586//5 15590//5\nf 15587//4 15591//4 15590//4\nf 15588//3 15592//3 15591//3\nf 15592//6 15588//6 15585//6\nf 15596//1 15595//1 15594//1\nf 15598//2 15599//2 15600//2\nf 15593//5 15594//5 15598//5\nf 15595//4 15599//4 15598//4\nf 15596//3 15600//3 15599//3\nf 15600//6 15596//6 15593//6\nf 15601//1 15604//1 15603//1\nf 15605//2 15606//2 15607//2\nf 15602//5 15606//5 15605//5\nf 15602//4 15603//4 15607//4\nf 15604//3 15608//3 15607//3\nf 15608//6 15604//6 15601//6\nf 15609//1 15612//1 15611//1\nf 15613//2 15614//2 15615//2\nf 15610//5 15614//5 15613//5\nf 15610//4 15611//4 15615//4\nf 15612//3 15616//3 15615//3\nf 15613//6 15616//6 15612//6\nf 15620//1 15619//1 15618//1\nf 15621//2 15622//2 15623//2\nf 15618//5 15622//5 15621//5\nf 15618//4 15619//4 15623//4\nf 15620//3 15624//3 15623//3\nf 15621//6 15624//6 15620//6\nf 15628//1 15627//1 15626//1\nf 15629//2 15630//2 15631//2\nf 15626//5 15630//5 15629//5\nf 15626//4 15627//4 15631//4\nf 15628//3 15632//3 15631//3\nf 15632//6 15628//6 15625//6\nf 15636//1 15635//1 15634//1\nf 15637//2 15638//2 15639//2\nf 15634//5 15638//5 15637//5\nf 15634//4 15635//4 15639//4\nf 15636//3 15640//3 15639//3\nf 15637//6 15640//6 15636//6\nf 15644//1 15643//1 15642//1\nf 15646//2 15647//2 15648//2\nf 15642//5 15646//5 15645//5\nf 15643//4 15647//4 15646//4\nf 15644//3 15648//3 15647//3\nf 15648//6 15644//6 15641//6\nf 15652//1 15651//1 15650//1\nf 15654//2 15655//2 15656//2\nf 15650//5 15654//5 15653//5\nf 15651//4 15655//4 15654//4\nf 15652//3 15656//3 15655//3\nf 15656//6 15652//6 15649//6\nf 15660//1 15659//1 15658//1\nf 15662//2 15663//2 15664//2\nf 15658//5 15662//5 15661//5\nf 15659//4 15663//4 15662//4\nf 15660//3 15664//3 15663//3\nf 15664//6 15660//6 15657//6\nf 15668//1 15667//1 15666//1\nf 15670//2 15671//2 15672//2\nf 15666//5 15670//5 15669//5\nf 15667//4 15671//4 15670//4\nf 15668//3 15672//3 15671//3\nf 15672//6 15668//6 15665//6\nf 15676//1 15675//1 15674//1\nf 15678//2 15679//2 15680//2\nf 15674//5 15678//5 15677//5\nf 15675//4 15679//4 15678//4\nf 15676//3 15680//3 15679//3\nf 15680//6 15676//6 15673//6\nf 15681//1 15684//1 15683//1\nf 15685//2 15686//2 15687//2\nf 15682//5 15686//5 15685//5\nf 15682//4 15683//4 15687//4\nf 15684//3 15688//3 15687//3\nf 15688//6 15684//6 15681//6\nf 15689//1 15692//1 15691//1\nf 15693//2 15694//2 15695//2\nf 15690//5 15694//5 15693//5\nf 15690//4 15691//4 15695//4\nf 15692//3 15696//3 15695//3\nf 15693//6 15696//6 15692//6\nf 15700//1 15699//1 15698//1\nf 15701//2 15702//2 15703//2\nf 15698//5 15702//5 15701//5\nf 15698//4 15699//4 15703//4\nf 15700//3 15704//3 15703//3\nf 15701//6 15704//6 15700//6\nf 15708//1 15707//1 15706//1\nf 15709//2 15710//2 15711//2\nf 15706//5 15710//5 15709//5\nf 15706//4 15707//4 15711//4\nf 15708//3 15712//3 15711//3\nf 15712//6 15708//6 15705//6\nf 15716//1 15715//1 15714//1\nf 15717//2 15718//2 15719//2\nf 15714//5 15718//5 15717//5\nf 15714//4 15715//4 15719//4\nf 15716//3 15720//3 15719//3\nf 15717//6 15720//6 15716//6\nf 15724//1 15723//1 15722//1\nf 15726//2 15727//2 15728//2\nf 15722//5 15726//5 15725//5\nf 15723//4 15727//4 15726//4\nf 15724//3 15728//3 15727//3\nf 15728//6 15724//6 15721//6\nf 15732//1 15731//1 15730//1\nf 15734//2 15735//2 15736//2\nf 15730//5 15734//5 15733//5\nf 15731//4 15735//4 15734//4\nf 15732//3 15736//3 15735//3\nf 15736//6 15732//6 15729//6\nf 15740//1 15739//1 15738//1\nf 15742//2 15743//2 15744//2\nf 15738//5 15742//5 15741//5\nf 15739//4 15743//4 15742//4\nf 15740//3 15744//3 15743//3\nf 15744//6 15740//6 15737//6\nf 15748//1 15747//1 15746//1\nf 15750//2 15751//2 15752//2\nf 15746//5 15750//5 15749//5\nf 15747//4 15751//4 15750//4\nf 15748//3 15752//3 15751//3\nf 15752//6 15748//6 15745//6\nf 15756//1 15755//1 15754//1\nf 15758//2 15759//2 15760//2\nf 15754//5 15758//5 15757//5\nf 15755//4 15759//4 15758//4\nf 15756//3 15760//3 15759//3\nf 15760//6 15756//6 15753//6\nf 15761//1 15764//1 15763//1\nf 15765//2 15766//2 15767//2\nf 15762//5 15766//5 15765//5\nf 15762//4 15763//4 15767//4\nf 15764//3 15768//3 15767//3\nf 15768//6 15764//6 15761//6\nf 15769//1 15772//1 15771//1\nf 15773//2 15774//2 15775//2\nf 15770//5 15774//5 15773//5\nf 15770//4 15771//4 15775//4\nf 15772//3 15776//3 15775//3\nf 15773//6 15776//6 15772//6\nf 15780//1 15779//1 15778//1\nf 15781//2 15782//2 15783//2\nf 15778//5 15782//5 15781//5\nf 15778//4 15779//4 15783//4\nf 15780//3 15784//3 15783//3\nf 15781//6 15784//6 15780//6\nf 15788//1 15787//1 15786//1\nf 15789//2 15790//2 15791//2\nf 15786//5 15790//5 15789//5\nf 15786//4 15787//4 15791//4\nf 15788//3 15792//3 15791//3\nf 15792//6 15788//6 15785//6\nf 15796//1 15795//1 15794//1\nf 15797//2 15798//2 15799//2\nf 15794//5 15798//5 15797//5\nf 15794//4 15795//4 15799//4\nf 15796//3 15800//3 15799//3\nf 15797//6 15800//6 15796//6\nf 15804//1 15803//1 15802//1\nf 15806//2 15807//2 15808//2\nf 15802//5 15806//5 15805//5\nf 15803//4 15807//4 15806//4\nf 15804//3 15808//3 15807//3\nf 15808//6 15804//6 15801//6\nf 15812//1 15811//1 15810//1\nf 15814//2 15815//2 15816//2\nf 15810//5 15814//5 15813//5\nf 15811//4 15815//4 15814//4\nf 15812//3 15816//3 15815//3\nf 15816//6 15812//6 15809//6\nf 15820//1 15819//1 15818//1\nf 15822//2 15823//2 15824//2\nf 15818//5 15822//5 15821//5\nf 15819//4 15823//4 15822//4\nf 15820//3 15824//3 15823//3\nf 15824//6 15820//6 15817//6\nf 15828//1 15827//1 15826//1\nf 15830//2 15831//2 15832//2\nf 15826//5 15830//5 15829//5\nf 15827//4 15831//4 15830//4\nf 15828//3 15832//3 15831//3\nf 15832//6 15828//6 15825//6\nf 15836//1 15835//1 15834//1\nf 15838//2 15839//2 15840//2\nf 15834//5 15838//5 15837//5\nf 15835//4 15839//4 15838//4\nf 15836//3 15840//3 15839//3\nf 15840//6 15836//6 15833//6\nf 15841//1 15844//1 15843//1\nf 15845//2 15846//2 15847//2\nf 15842//5 15846//5 15845//5\nf 15842//4 15843//4 15847//4\nf 15844//3 15848//3 15847//3\nf 15848//6 15844//6 15841//6\nf 15849//1 15852//1 15851//1\nf 15853//2 15854//2 15855//2\nf 15850//5 15854//5 15853//5\nf 15850//4 15851//4 15855//4\nf 15852//3 15856//3 15855//3\nf 15853//6 15856//6 15852//6\nf 15860//1 15859//1 15858//1\nf 15861//2 15862//2 15863//2\nf 15858//5 15862//5 15861//5\nf 15858//4 15859//4 15863//4\nf 15860//3 15864//3 15863//3\nf 15861//6 15864//6 15860//6\nf 15868//1 15867//1 15866//1\nf 15869//2 15870//2 15871//2\nf 15866//5 15870//5 15869//5\nf 15866//4 15867//4 15871//4\nf 15868//3 15872//3 15871//3\nf 15872//6 15868//6 15865//6\nf 15876//1 15875//1 15874//1\nf 15877//2 15878//2 15879//2\nf 15874//5 15878//5 15877//5\nf 15874//4 15875//4 15879//4\nf 15876//3 15880//3 15879//3\nf 15877//6 15880//6 15876//6\nf 15884//1 15883//1 15882//1\nf 15886//2 15887//2 15888//2\nf 15882//5 15886//5 15885//5\nf 15883//4 15887//4 15886//4\nf 15884//3 15888//3 15887//3\nf 15888//6 15884//6 15881//6\nf 15892//1 15891//1 15890//1\nf 15894//2 15895//2 15896//2\nf 15890//5 15894//5 15893//5\nf 15891//4 15895//4 15894//4\nf 15892//3 15896//3 15895//3\nf 15896//6 15892//6 15889//6\nf 15900//1 15899//1 15898//1\nf 15902//2 15903//2 15904//2\nf 15898//5 15902//5 15901//5\nf 15899//4 15903//4 15902//4\nf 15900//3 15904//3 15903//3\nf 15904//6 15900//6 15897//6\nf 15908//1 15907//1 15906//1\nf 15910//2 15911//2 15912//2\nf 15906//5 15910//5 15909//5\nf 15907//4 15911//4 15910//4\nf 15908//3 15912//3 15911//3\nf 15912//6 15908//6 15905//6\nf 15916//1 15915//1 15914//1\nf 15918//2 15919//2 15920//2\nf 15914//5 15918//5 15917//5\nf 15915//4 15919//4 15918//4\nf 15916//3 15920//3 15919//3\nf 15920//6 15916//6 15913//6\nf 15921//1 15924//1 15923//1\nf 15925//2 15926//2 15927//2\nf 15922//5 15926//5 15925//5\nf 15922//4 15923//4 15927//4\nf 15924//3 15928//3 15927//3\nf 15928//6 15924//6 15921//6\nf 15929//1 15932//1 15931//1\nf 15933//2 15934//2 15935//2\nf 15930//5 15934//5 15933//5\nf 15930//4 15931//4 15935//4\nf 15932//3 15936//3 15935//3\nf 15933//6 15936//6 15932//6\nf 15940//1 15939//1 15938//1\nf 15941//2 15942//2 15943//2\nf 15938//5 15942//5 15941//5\nf 15938//4 15939//4 15943//4\nf 15940//3 15944//3 15943//3\nf 15941//6 15944//6 15940//6\nf 15948//1 15947//1 15946//1\nf 15949//2 15950//2 15951//2\nf 15946//5 15950//5 15949//5\nf 15946//4 15947//4 15951//4\nf 15948//3 15952//3 15951//3\nf 15952//6 15948//6 15945//6\nf 15956//1 15955//1 15954//1\nf 15957//2 15958//2 15959//2\nf 15954//5 15958//5 15957//5\nf 15954//4 15955//4 15959//4\nf 15956//3 15960//3 15959//3\nf 15957//6 15960//6 15956//6\nf 15964//1 15963//1 15962//1\nf 15966//2 15967//2 15968//2\nf 15962//5 15966//5 15965//5\nf 15963//4 15967//4 15966//4\nf 15964//3 15968//3 15967//3\nf 15968//6 15964//6 15961//6\nf 15972//1 15971//1 15970//1\nf 15974//2 15975//2 15976//2\nf 15970//5 15974//5 15973//5\nf 15971//4 15975//4 15974//4\nf 15972//3 15976//3 15975//3\nf 15976//6 15972//6 15969//6\nf 15980//1 15979//1 15978//1\nf 15982//2 15983//2 15984//2\nf 15978//5 15982//5 15981//5\nf 15979//4 15983//4 15982//4\nf 15980//3 15984//3 15983//3\nf 15984//6 15980//6 15977//6\nf 15988//1 15987//1 15986//1\nf 15990//2 15991//2 15992//2\nf 15986//5 15990//5 15989//5\nf 15987//4 15991//4 15990//4\nf 15988//3 15992//3 15991//3\nf 15992//6 15988//6 15985//6\nf 15996//1 15995//1 15994//1\nf 15998//2 15999//2 16000//2\nf 15994//5 15998//5 15997//5\nf 15995//4 15999//4 15998//4\nf 15996//3 16000//3 15999//3\nf 16000//6 15996//6 15993//6\nf 1//1 2//1 4//1\nf 5//2 8//2 6//2\nf 2//3 1//3 6//3\nf 3//4 2//4 7//4\nf 3//5 7//5 4//5\nf 5//6 1//6 8//6\nf 9//1 10//1 12//1\nf 14//2 13//2 15//2\nf 10//3 9//3 14//3\nf 11//4 10//4 15//4\nf 11//5 15//5 12//5\nf 13//6 9//6 16//6\nf 17//1 18//1 20//1\nf 21//2 24//2 22//2\nf 18//3 17//3 22//3\nf 19//4 18//4 23//4\nf 19//5 23//5 20//5\nf 24//6 21//6 20//6\nf 25//1 26//1 28//1\nf 29//2 32//2 30//2\nf 26//3 25//3 30//3\nf 27//4 26//4 31//4\nf 27//5 31//5 28//5\nf 29//6 25//6 32//6\nf 33//1 34//1 36//1\nf 38//2 37//2 39//2\nf 34//3 33//3 38//3\nf 35//4 34//4 39//4\nf 35//5 39//5 36//5\nf 40//6 37//6 36//6\nf 41//1 42//1 44//1\nf 45//2 48//2 46//2\nf 42//3 41//3 46//3\nf 42//4 46//4 43//4\nf 43//5 47//5 44//5\nf 45//6 41//6 48//6\nf 49//1 50//1 52//1\nf 53//2 56//2 54//2\nf 50//3 49//3 54//3\nf 50//4 54//4 51//4\nf 51//5 55//5 52//5\nf 53//6 49//6 56//6\nf 57//1 58//1 60//1\nf 61//2 64//2 62//2\nf 58//3 57//3 62//3\nf 58//4 62//4 59//4\nf 59//5 63//5 60//5\nf 61//6 57//6 64//6\nf 65//1 66//1 68//1\nf 69//2 72//2 70//2\nf 66//3 65//3 70//3\nf 66//4 70//4 67//4\nf 67//5 71//5 68//5\nf 69//6 65//6 72//6\nf 73//1 74//1 76//1\nf 77//2 80//2 78//2\nf 74//3 73//3 78//3\nf 74//4 78//4 75//4\nf 75//5 79//5 76//5\nf 77//6 73//6 80//6\nf 81//1 82//1 84//1\nf 85//2 88//2 86//2\nf 81//3 85//3 82//3\nf 83//4 82//4 87//4\nf 83//5 87//5 84//5\nf 85//6 81//6 88//6\nf 89//1 90//1 92//1\nf 94//2 93//2 95//2\nf 90//3 89//3 94//3\nf 91//4 90//4 95//4\nf 91//5 95//5 92//5\nf 93//6 89//6 96//6\nf 97//1 98//1 100//1\nf 101//2 104//2 102//2\nf 98//3 97//3 102//3\nf 99//4 98//4 103//4\nf 99//5 103//5 100//5\nf 104//6 101//6 100//6\nf 105//1 106//1 108//1\nf 109//2 112//2 110//2\nf 106//3 105//3 110//3\nf 107//4 106//4 111//4\nf 107//5 111//5 108//5\nf 109//6 105//6 112//6\nf 113//1 114//1 116//1\nf 118//2 117//2 119//2\nf 114//3 113//3 118//3\nf 115//4 114//4 119//4\nf 115//5 119//5 116//5\nf 120//6 117//6 116//6\nf 121//1 122//1 124//1\nf 125//2 128//2 126//2\nf 122//3 121//3 126//3\nf 122//4 126//4 123//4\nf 123//5 127//5 124//5\nf 125//6 121//6 128//6\nf 129//1 130//1 132//1\nf 133//2 136//2 134//2\nf 130//3 129//3 134//3\nf 130//4 134//4 131//4\nf 131//5 135//5 132//5\nf 133//6 129//6 136//6\nf 137//1 138//1 140//1\nf 141//2 144//2 142//2\nf 138//3 137//3 142//3\nf 138//4 142//4 139//4\nf 139//5 143//5 140//5\nf 141//6 137//6 144//6\nf 145//1 146//1 148//1\nf 149//2 152//2 150//2\nf 146//3 145//3 150//3\nf 146//4 150//4 147//4\nf 147//5 151//5 148//5\nf 149//6 145//6 152//6\nf 153//1 154//1 156//1\nf 157//2 160//2 158//2\nf 154//3 153//3 158//3\nf 154//4 158//4 155//4\nf 155//5 159//5 156//5\nf 157//6 153//6 160//6\nf 161//1 162//1 164//1\nf 166//2 165//2 167//2\nf 161//3 165//3 162//3\nf 163//4 162//4 167//4\nf 163//5 167//5 164//5\nf 165//6 161//6 168//6\nf 169//1 170//1 172//1\nf 174//2 173//2 175//2\nf 169//3 173//3 170//3\nf 171//4 170//4 175//4\nf 171//5 175//5 172//5\nf 173//6 169//6 176//6\nf 177//1 178//1 180//1\nf 182//2 181//2 183//2\nf 178//3 177//3 182//3\nf 179//4 178//4 183//4\nf 179//5 183//5 180//5\nf 184//6 181//6 180//6\nf 185//1 186//1 188//1\nf 190//2 189//2 191//2\nf 186//3 185//3 190//3\nf 187//4 186//4 191//4\nf 187//5 191//5 188//5\nf 189//6 185//6 192//6\nf 193//1 194//1 196//1\nf 198//2 197//2 199//2\nf 193//3 197//3 194//3\nf 195//4 194//4 199//4\nf 195//5 199//5 196//5\nf 200//6 197//6 196//6\nf 201//1 202//1 204//1\nf 205//2 208//2 206//2\nf 202//3 201//3 206//3\nf 202//4 206//4 203//4\nf 203//5 207//5 204//5\nf 205//6 201//6 208//6\nf 209//1 210//1 212//1\nf 213//2 216//2 214//2\nf 210//3 209//3 214//3\nf 210//4 214//4 211//4\nf 211//5 215//5 212//5\nf 213//6 209//6 216//6\nf 217//1 218//1 220//1\nf 221//2 224//2 222//2\nf 218//3 217//3 222//3\nf 218//4 222//4 219//4\nf 219//5 223//5 220//5\nf 221//6 217//6 224//6\nf 225//1 226//1 228//1\nf 229//2 232//2 230//2\nf 226//3 225//3 230//3\nf 226//4 230//4 227//4\nf 227//5 231//5 228//5\nf 229//6 225//6 232//6\nf 233//1 234//1 236//1\nf 237//2 240//2 238//2\nf 234//3 233//3 238//3\nf 234//4 238//4 235//4\nf 235//5 239//5 236//5\nf 237//6 233//6 240//6\nf 244//1 241//1 243//1\nf 245//2 248//2 246//2\nf 242//3 241//3 246//3\nf 243//4 242//4 247//4\nf 243//5 247//5 244//5\nf 245//6 241//6 248//6\nf 252//1 249//1 251//1\nf 253//2 256//2 254//2\nf 250//3 249//3 254//3\nf 251//4 250//4 255//4\nf 251//5 255//5 252//5\nf 253//6 249//6 256//6\nf 257//1 258//1 260//1\nf 261//2 264//2 262//2\nf 258//3 257//3 262//3\nf 259//4 258//4 263//4\nf 259//5 263//5 260//5\nf 264//6 261//6 260//6\nf 265//1 266//1 268//1\nf 269//2 272//2 270//2\nf 266//3 265//3 270//3\nf 267//4 266//4 271//4\nf 267//5 271//5 268//5\nf 269//6 265//6 272//6\nf 273//1 274//1 276//1\nf 277//2 280//2 278//2\nf 274//3 273//3 278//3\nf 275//4 274//4 279//4\nf 275//5 279//5 276//5\nf 280//6 277//6 276//6\nf 281//1 282//1 284//1\nf 285//2 288//2 286//2\nf 282//3 281//3 286//3\nf 282//4 286//4 283//4\nf 283//5 287//5 284//5\nf 285//6 281//6 288//6\nf 289//1 290//1 292//1\nf 293//2 296//2 294//2\nf 290//3 289//3 294//3\nf 290//4 294//4 291//4\nf 291//5 295//5 292//5\nf 293//6 289//6 296//6\nf 297//1 298//1 300//1\nf 301//2 304//2 302//2\nf 298//3 297//3 302//3\nf 298//4 302//4 299//4\nf 299//5 303//5 300//5\nf 301//6 297//6 304//6\nf 305//1 306//1 308//1\nf 309//2 312//2 310//2\nf 306//3 305//3 310//3\nf 306//4 310//4 307//4\nf 307//5 311//5 308//5\nf 309//6 305//6 312//6\nf 313//1 314//1 316//1\nf 317//2 320//2 318//2\nf 314//3 313//3 318//3\nf 314//4 318//4 315//4\nf 315//5 319//5 316//5\nf 317//6 313//6 320//6\nf 324//1 321//1 323//1\nf 325//2 328//2 326//2\nf 322//3 321//3 326//3\nf 323//4 322//4 327//4\nf 323//5 327//5 324//5\nf 325//6 321//6 328//6\nf 332//1 329//1 331//1\nf 333//2 336//2 334//2\nf 330//3 329//3 334//3\nf 331//4 330//4 335//4\nf 331//5 335//5 332//5\nf 333//6 329//6 336//6\nf 337//1 338//1 340//1\nf 341//2 344//2 342//2\nf 338//3 337//3 342//3\nf 339//4 338//4 343//4\nf 339//5 343//5 340//5\nf 344//6 341//6 340//6\nf 345//1 346//1 348//1\nf 349//2 352//2 350//2\nf 346//3 345//3 350//3\nf 347//4 346//4 351//4\nf 347//5 351//5 348//5\nf 349//6 345//6 352//6\nf 353//1 354//1 356//1\nf 357//2 360//2 358//2\nf 354//3 353//3 358//3\nf 355//4 354//4 359//4\nf 355//5 359//5 356//5\nf 360//6 357//6 356//6\nf 361//1 362//1 364//1\nf 365//2 368//2 366//2\nf 362//3 361//3 366//3\nf 362//4 366//4 363//4\nf 363//5 367//5 364//5\nf 365//6 361//6 368//6\nf 369//1 370//1 372//1\nf 373//2 376//2 374//2\nf 370//3 369//3 374//3\nf 370//4 374//4 371//4\nf 371//5 375//5 372//5\nf 373//6 369//6 376//6\nf 377//1 378//1 380//1\nf 381//2 384//2 382//2\nf 378//3 377//3 382//3\nf 378//4 382//4 379//4\nf 379//5 383//5 380//5\nf 381//6 377//6 384//6\nf 385//1 386//1 388//1\nf 389//2 392//2 390//2\nf 386//3 385//3 390//3\nf 386//4 390//4 387//4\nf 387//5 391//5 388//5\nf 389//6 385//6 392//6\nf 393//1 394//1 396//1\nf 397//2 400//2 398//2\nf 394//3 393//3 398//3\nf 394//4 398//4 395//4\nf 395//5 399//5 396//5\nf 397//6 393//6 400//6\nf 404//1 401//1 403//1\nf 406//2 405//2 407//2\nf 401//3 405//3 402//3\nf 403//4 402//4 407//4\nf 403//5 407//5 404//5\nf 405//6 401//6 408//6\nf 412//1 409//1 411//1\nf 414//2 413//2 415//2\nf 409//3 413//3 410//3\nf 411//4 410//4 415//4\nf 411//5 415//5 412//5\nf 413//6 409//6 416//6\nf 417//1 418//1 420//1\nf 422//2 421//2 423//2\nf 417//3 421//3 418//3\nf 419//4 418//4 423//4\nf 419//5 423//5 420//5\nf 424//6 421//6 420//6\nf 425//1 426//1 428//1\nf 430//2 429//2 431//2\nf 425//3 429//3 426//3\nf 427//4 426//4 431//4\nf 427//5 431//5 428//5\nf 429//6 425//6 432//6\nf 433//1 434//1 436//1\nf 438//2 437//2 439//2\nf 433//3 437//3 434//3\nf 435//4 434//4 439//4\nf 435//5 439//5 436//5\nf 440//6 437//6 436//6\nf 441//1 442//1 444//1\nf 445//2 448//2 446//2\nf 441//3 445//3 442//3\nf 442//4 446//4 443//4\nf 443//5 447//5 444//5\nf 445//6 441//6 448//6\nf 449//1 450//1 452//1\nf 453//2 456//2 454//2\nf 449//3 453//3 450//3\nf 450//4 454//4 451//4\nf 451//5 455//5 452//5\nf 453//6 449//6 456//6\nf 457//1 458//1 460//1\nf 461//2 464//2 462//2\nf 457//3 461//3 458//3\nf 458//4 462//4 459//4\nf 459//5 463//5 460//5\nf 461//6 457//6 464//6\nf 465//1 466//1 468//1\nf 469//2 472//2 470//2\nf 465//3 469//3 466//3\nf 466//4 470//4 467//4\nf 467//5 471//5 468//5\nf 469//6 465//6 472//6\nf 473//1 474//1 476//1\nf 477//2 480//2 478//2\nf 473//3 477//3 474//3\nf 474//4 478//4 475//4\nf 475//5 479//5 476//5\nf 477//6 473//6 480//6\nf 484//1 481//1 483//1\nf 486//2 485//2 487//2\nf 481//3 485//3 482//3\nf 483//4 482//4 487//4\nf 483//5 487//5 484//5\nf 485//6 481//6 488//6\nf 492//1 489//1 491//1\nf 494//2 493//2 495//2\nf 489//3 493//3 490//3\nf 491//4 490//4 495//4\nf 491//5 495//5 492//5\nf 493//6 489//6 496//6\nf 497//1 498//1 500//1\nf 502//2 501//2 503//2\nf 497//3 501//3 498//3\nf 499//4 498//4 503//4\nf 499//5 503//5 500//5\nf 504//6 501//6 500//6\nf 505//1 506//1 508//1\nf 510//2 509//2 511//2\nf 505//3 509//3 506//3\nf 507//4 506//4 511//4\nf 507//5 511//5 508//5\nf 509//6 505//6 512//6\nf 513//1 514//1 516//1\nf 518//2 517//2 519//2\nf 513//3 517//3 514//3\nf 515//4 514//4 519//4\nf 515//5 519//5 516//5\nf 520//6 517//6 516//6\nf 521//1 522//1 524//1\nf 525//2 528//2 526//2\nf 521//3 525//3 522//3\nf 522//4 526//4 523//4\nf 523//5 527//5 524//5\nf 525//6 521//6 528//6\nf 529//1 530//1 532//1\nf 533//2 536//2 534//2\nf 529//3 533//3 530//3\nf 530//4 534//4 531//4\nf 531//5 535//5 532//5\nf 533//6 529//6 536//6\nf 537//1 538//1 540//1\nf 541//2 544//2 542//2\nf 537//3 541//3 538//3\nf 538//4 542//4 539//4\nf 539//5 543//5 540//5\nf 541//6 537//6 544//6\nf 545//1 546//1 548//1\nf 549//2 552//2 550//2\nf 545//3 549//3 546//3\nf 546//4 550//4 547//4\nf 547//5 551//5 548//5\nf 549//6 545//6 552//6\nf 553//1 554//1 556//1\nf 557//2 560//2 558//2\nf 553//3 557//3 554//3\nf 554//4 558//4 555//4\nf 555//5 559//5 556//5\nf 557//6 553//6 560//6\nf 564//1 561//1 563//1\nf 566//2 565//2 567//2\nf 561//3 565//3 562//3\nf 563//4 562//4 567//4\nf 563//5 567//5 564//5\nf 565//6 561//6 568//6\nf 572//1 569//1 571//1\nf 574//2 573//2 575//2\nf 569//3 573//3 570//3\nf 571//4 570//4 575//4\nf 571//5 575//5 572//5\nf 573//6 569//6 576//6\nf 577//1 578//1 580//1\nf 582//2 581//2 583//2\nf 577//3 581//3 578//3\nf 579//4 578//4 583//4\nf 579//5 583//5 580//5\nf 584//6 581//6 580//6\nf 585//1 586//1 588//1\nf 590//2 589//2 591//2\nf 585//3 589//3 586//3\nf 587//4 586//4 591//4\nf 587//5 591//5 588//5\nf 589//6 585//6 592//6\nf 593//1 594//1 596//1\nf 598//2 597//2 599//2\nf 593//3 597//3 594//3\nf 595//4 594//4 599//4\nf 595//5 599//5 596//5\nf 600//6 597//6 596//6\nf 601//1 602//1 604//1\nf 605//2 608//2 606//2\nf 601//3 605//3 602//3\nf 602//4 606//4 603//4\nf 603//5 607//5 604//5\nf 605//6 601//6 608//6\nf 609//1 610//1 612//1\nf 613//2 616//2 614//2\nf 609//3 613//3 610//3\nf 610//4 614//4 611//4\nf 611//5 615//5 612//5\nf 613//6 609//6 616//6\nf 617//1 618//1 620//1\nf 621//2 624//2 622//2\nf 617//3 621//3 618//3\nf 618//4 622//4 619//4\nf 619//5 623//5 620//5\nf 621//6 617//6 624//6\nf 625//1 626//1 628//1\nf 629//2 632//2 630//2\nf 625//3 629//3 626//3\nf 626//4 630//4 627//4\nf 627//5 631//5 628//5\nf 629//6 625//6 632//6\nf 633//1 634//1 636//1\nf 637//2 640//2 638//2\nf 633//3 637//3 634//3\nf 634//4 638//4 635//4\nf 635//5 639//5 636//5\nf 637//6 633//6 640//6\nf 644//1 641//1 643//1\nf 646//2 645//2 647//2\nf 641//3 645//3 642//3\nf 643//4 642//4 647//4\nf 643//5 647//5 644//5\nf 645//6 641//6 648//6\nf 652//1 649//1 651//1\nf 654//2 653//2 655//2\nf 649//3 653//3 650//3\nf 651//4 650//4 655//4\nf 651//5 655//5 652//5\nf 653//6 649//6 656//6\nf 657//1 658//1 660//1\nf 662//2 661//2 663//2\nf 657//3 661//3 658//3\nf 659//4 658//4 663//4\nf 659//5 663//5 660//5\nf 664//6 661//6 660//6\nf 665//1 666//1 668//1\nf 670//2 669//2 671//2\nf 665//3 669//3 666//3\nf 667//4 666//4 671//4\nf 667//5 671//5 668//5\nf 669//6 665//6 672//6\nf 673//1 674//1 676//1\nf 678//2 677//2 679//2\nf 673//3 677//3 674//3\nf 675//4 674//4 679//4\nf 675//5 679//5 676//5\nf 680//6 677//6 676//6\nf 681//1 682//1 684//1\nf 685//2 688//2 686//2\nf 681//3 685//3 682//3\nf 682//4 686//4 683//4\nf 683//5 687//5 684//5\nf 685//6 681//6 688//6\nf 689//1 690//1 692//1\nf 693//2 696//2 694//2\nf 689//3 693//3 690//3\nf 690//4 694//4 691//4\nf 691//5 695//5 692//5\nf 693//6 689//6 696//6\nf 697//1 698//1 700//1\nf 701//2 704//2 702//2\nf 697//3 701//3 698//3\nf 698//4 702//4 699//4\nf 699//5 703//5 700//5\nf 701//6 697//6 704//6\nf 705//1 706//1 708//1\nf 709//2 712//2 710//2\nf 705//3 709//3 706//3\nf 706//4 710//4 707//4\nf 707//5 711//5 708//5\nf 709//6 705//6 712//6\nf 713//1 714//1 716//1\nf 717//2 720//2 718//2\nf 713//3 717//3 714//3\nf 714//4 718//4 715//4\nf 715//5 719//5 716//5\nf 717//6 713//6 720//6\nf 724//1 721//1 723//1\nf 726//2 725//2 727//2\nf 721//3 725//3 722//3\nf 723//4 722//4 727//4\nf 723//5 727//5 724//5\nf 725//6 721//6 728//6\nf 732//1 729//1 731//1\nf 734//2 733//2 735//2\nf 729//3 733//3 730//3\nf 731//4 730//4 735//4\nf 731//5 735//5 732//5\nf 733//6 729//6 736//6\nf 737//1 738//1 740//1\nf 742//2 741//2 743//2\nf 737//3 741//3 738//3\nf 739//4 738//4 743//4\nf 739//5 743//5 740//5\nf 744//6 741//6 740//6\nf 745//1 746//1 748//1\nf 750//2 749//2 751//2\nf 745//3 749//3 746//3\nf 747//4 746//4 751//4\nf 747//5 751//5 748//5\nf 749//6 745//6 752//6\nf 753//1 754//1 756//1\nf 758//2 757//2 759//2\nf 753//3 757//3 754//3\nf 755//4 754//4 759//4\nf 755//5 759//5 756//5\nf 760//6 757//6 756//6\nf 761//1 762//1 764//1\nf 765//2 768//2 766//2\nf 761//3 765//3 762//3\nf 762//4 766//4 763//4\nf 763//5 767//5 764//5\nf 765//6 761//6 768//6\nf 769//1 770//1 772//1\nf 773//2 776//2 774//2\nf 769//3 773//3 770//3\nf 770//4 774//4 771//4\nf 771//5 775//5 772//5\nf 773//6 769//6 776//6\nf 777//1 778//1 780//1\nf 781//2 784//2 782//2\nf 777//3 781//3 778//3\nf 778//4 782//4 779//4\nf 779//5 783//5 780//5\nf 781//6 777//6 784//6\nf 785//1 786//1 788//1\nf 789//2 792//2 790//2\nf 785//3 789//3 786//3\nf 786//4 790//4 787//4\nf 787//5 791//5 788//5\nf 789//6 785//6 792//6\nf 793//1 794//1 796//1\nf 797//2 800//2 798//2\nf 793//3 797//3 794//3\nf 794//4 798//4 795//4\nf 795//5 799//5 796//5\nf 797//6 793//6 800//6\nf 801//1 804//1 802//1\nf 808//2 805//2 807//2\nf 805//5 801//5 806//5\nf 806//4 802//4 807//4\nf 803//3 804//3 807//3\nf 805//6 808//6 801//6\nf 809//1 812//1 810//1\nf 816//2 813//2 815//2\nf 813//5 809//5 814//5\nf 814//4 810//4 815//4\nf 811//3 812//3 815//3\nf 809//6 813//6 812//6\nf 817//1 820//1 818//1\nf 824//2 821//2 823//2\nf 821//5 817//5 822//5\nf 822//4 818//4 823//4\nf 819//3 820//3 823//3\nf 817//6 821//6 820//6\nf 825//1 828//1 826//1\nf 829//2 830//2 832//2\nf 829//5 825//5 830//5\nf 830//4 826//4 831//4\nf 827//3 828//3 831//3\nf 829//6 832//6 825//6\nf 833//1 836//1 834//1\nf 840//2 837//2 839//2\nf 837//5 833//5 838//5\nf 838//4 834//4 839//4\nf 835//3 836//3 839//3\nf 833//6 837//6 836//6\nf 841//1 844//1 842//1\nf 845//2 846//2 848//2\nf 845//5 841//5 846//5\nf 842//4 843//4 846//4\nf 843//3 844//3 847//3\nf 845//6 848//6 841//6\nf 849//1 852//1 850//1\nf 853//2 854//2 856//2\nf 853//5 849//5 854//5\nf 850//4 851//4 854//4\nf 851//3 852//3 855//3\nf 853//6 856//6 849//6\nf 857//1 860//1 858//1\nf 861//2 862//2 864//2\nf 861//5 857//5 862//5\nf 858//4 859//4 862//4\nf 859//3 860//3 863//3\nf 861//6 864//6 857//6\nf 865//1 868//1 866//1\nf 869//2 870//2 872//2\nf 869//5 865//5 870//5\nf 866//4 867//4 870//4\nf 867//3 868//3 871//3\nf 869//6 872//6 865//6\nf 873//1 876//1 874//1\nf 877//2 878//2 880//2\nf 877//5 873//5 878//5\nf 874//4 875//4 878//4\nf 875//3 876//3 879//3\nf 877//6 880//6 873//6\nf 881//1 884//1 882//1\nf 888//2 885//2 887//2\nf 881//5 882//5 885//5\nf 886//4 882//4 887//4\nf 883//3 884//3 887//3\nf 885//6 888//6 881//6\nf 889//1 892//1 890//1\nf 896//2 893//2 895//2\nf 893//5 889//5 894//5\nf 894//4 890//4 895//4\nf 891//3 892//3 895//3\nf 889//6 893//6 892//6\nf 897//1 900//1 898//1\nf 904//2 901//2 903//2\nf 901//5 897//5 902//5\nf 902//4 898//4 903//4\nf 899//3 900//3 903//3\nf 897//6 901//6 900//6\nf 905//1 908//1 906//1\nf 909//2 910//2 912//2\nf 909//5 905//5 910//5\nf 910//4 906//4 911//4\nf 907//3 908//3 911//3\nf 909//6 912//6 905//6\nf 913//1 916//1 914//1\nf 917//2 918//2 920//2\nf 917//5 913//5 918//5\nf 918//4 914//4 919//4\nf 915//3 916//3 919//3\nf 913//6 917//6 916//6\nf 921//1 924//1 922//1\nf 925//2 926//2 928//2\nf 925//5 921//5 926//5\nf 922//4 923//4 926//4\nf 923//3 924//3 927//3\nf 925//6 928//6 921//6\nf 929//1 932//1 930//1\nf 933//2 934//2 936//2\nf 933//5 929//5 934//5\nf 930//4 931//4 934//4\nf 931//3 932//3 935//3\nf 933//6 936//6 929//6\nf 937//1 940//1 938//1\nf 941//2 942//2 944//2\nf 941//5 937//5 942//5\nf 938//4 939//4 942//4\nf 939//3 940//3 943//3\nf 941//6 944//6 937//6\nf 945//1 948//1 946//1\nf 949//2 950//2 952//2\nf 949//5 945//5 950//5\nf 946//4 947//4 950//4\nf 947//3 948//3 951//3\nf 949//6 952//6 945//6\nf 953//1 956//1 954//1\nf 957//2 958//2 960//2\nf 957//5 953//5 958//5\nf 954//4 955//4 958//4\nf 955//3 956//3 959//3\nf 957//6 960//6 953//6\nf 962//1 961//1 963//1\nf 968//2 965//2 967//2\nf 961//5 962//5 965//5\nf 966//4 962//4 967//4\nf 963//3 964//3 967//3\nf 965//6 968//6 961//6\nf 969//1 972//1 970//1\nf 976//2 973//2 975//2\nf 969//5 970//5 973//5\nf 974//4 970//4 975//4\nf 971//3 972//3 975//3\nf 969//6 973//6 972//6\nf 977//1 980//1 978//1\nf 984//2 981//2 983//2\nf 981//5 977//5 982//5\nf 982//4 978//4 983//4\nf 979//3 980//3 983//3\nf 977//6 981//6 980//6\nf 985//1 988//1 986//1\nf 992//2 989//2 991//2\nf 989//5 985//5 990//5\nf 990//4 986//4 991//4\nf 987//3 988//3 991//3\nf 989//6 992//6 985//6\nf 993//1 996//1 994//1\nf 1000//2 997//2 999//2\nf 993//5 994//5 997//5\nf 998//4 994//4 999//4\nf 995//3 996//3 999//3\nf 993//6 997//6 996//6\nf 1001//1 1004//1 1002//1\nf 1005//2 1006//2 1008//2\nf 1005//5 1001//5 1006//5\nf 1002//4 1003//4 1006//4\nf 1003//3 1004//3 1007//3\nf 1005//6 1008//6 1001//6\nf 1009//1 1012//1 1010//1\nf 1013//2 1014//2 1016//2\nf 1013//5 1009//5 1014//5\nf 1010//4 1011//4 1014//4\nf 1011//3 1012//3 1015//3\nf 1013//6 1016//6 1009//6\nf 1017//1 1020//1 1018//1\nf 1021//2 1022//2 1024//2\nf 1021//5 1017//5 1022//5\nf 1018//4 1019//4 1022//4\nf 1019//3 1020//3 1023//3\nf 1021//6 1024//6 1017//6\nf 1025//1 1028//1 1026//1\nf 1029//2 1030//2 1032//2\nf 1029//5 1025//5 1030//5\nf 1026//4 1027//4 1030//4\nf 1027//3 1028//3 1031//3\nf 1029//6 1032//6 1025//6\nf 1033//1 1036//1 1034//1\nf 1037//2 1038//2 1040//2\nf 1037//5 1033//5 1038//5\nf 1034//4 1035//4 1038//4\nf 1035//3 1036//3 1039//3\nf 1037//6 1040//6 1033//6\nf 1042//1 1041//1 1043//1\nf 1045//2 1046//2 1048//2\nf 1045//5 1041//5 1046//5\nf 1046//4 1042//4 1047//4\nf 1043//3 1044//3 1047//3\nf 1045//6 1048//6 1041//6\nf 1050//1 1049//1 1051//1\nf 1053//2 1054//2 1056//2\nf 1053//5 1049//5 1054//5\nf 1054//4 1050//4 1055//4\nf 1051//3 1052//3 1055//3\nf 1049//6 1053//6 1052//6\nf 1057//1 1060//1 1058//1\nf 1061//2 1062//2 1064//2\nf 1061//5 1057//5 1062//5\nf 1062//4 1058//4 1063//4\nf 1059//3 1060//3 1063//3\nf 1057//6 1061//6 1060//6\nf 1065//1 1068//1 1066//1\nf 1069//2 1070//2 1072//2\nf 1069//5 1065//5 1070//5\nf 1070//4 1066//4 1071//4\nf 1067//3 1068//3 1071//3\nf 1069//6 1072//6 1065//6\nf 1073//1 1076//1 1074//1\nf 1077//2 1078//2 1080//2\nf 1077//5 1073//5 1078//5\nf 1078//4 1074//4 1079//4\nf 1075//3 1076//3 1079//3\nf 1073//6 1077//6 1076//6\nf 1081//1 1084//1 1082//1\nf 1085//2 1086//2 1088//2\nf 1085//5 1081//5 1086//5\nf 1082//4 1083//4 1086//4\nf 1083//3 1084//3 1087//3\nf 1085//6 1088//6 1081//6\nf 1089//1 1092//1 1090//1\nf 1093//2 1094//2 1096//2\nf 1093//5 1089//5 1094//5\nf 1090//4 1091//4 1094//4\nf 1091//3 1092//3 1095//3\nf 1093//6 1096//6 1089//6\nf 1097//1 1100//1 1098//1\nf 1101//2 1102//2 1104//2\nf 1101//5 1097//5 1102//5\nf 1098//4 1099//4 1102//4\nf 1099//3 1100//3 1103//3\nf 1101//6 1104//6 1097//6\nf 1105//1 1108//1 1106//1\nf 1109//2 1110//2 1112//2\nf 1109//5 1105//5 1110//5\nf 1106//4 1107//4 1110//4\nf 1107//3 1108//3 1111//3\nf 1109//6 1112//6 1105//6\nf 1113//1 1116//1 1114//1\nf 1117//2 1118//2 1120//2\nf 1117//5 1113//5 1118//5\nf 1114//4 1115//4 1118//4\nf 1115//3 1116//3 1119//3\nf 1117//6 1120//6 1113//6\nf 1122//1 1121//1 1123//1\nf 1125//2 1126//2 1128//2\nf 1125//5 1121//5 1126//5\nf 1126//4 1122//4 1127//4\nf 1123//3 1124//3 1127//3\nf 1125//6 1128//6 1121//6\nf 1130//1 1129//1 1131//1\nf 1133//2 1134//2 1136//2\nf 1133//5 1129//5 1134//5\nf 1134//4 1130//4 1135//4\nf 1131//3 1132//3 1135//3\nf 1129//6 1133//6 1132//6\nf 1137//1 1140//1 1138//1\nf 1141//2 1142//2 1144//2\nf 1141//5 1137//5 1142//5\nf 1142//4 1138//4 1143//4\nf 1139//3 1140//3 1143//3\nf 1137//6 1141//6 1140//6\nf 1145//1 1148//1 1146//1\nf 1149//2 1150//2 1152//2\nf 1149//5 1145//5 1150//5\nf 1150//4 1146//4 1151//4\nf 1147//3 1148//3 1151//3\nf 1149//6 1152//6 1145//6\nf 1153//1 1156//1 1154//1\nf 1157//2 1158//2 1160//2\nf 1157//5 1153//5 1158//5\nf 1158//4 1154//4 1159//4\nf 1155//3 1156//3 1159//3\nf 1153//6 1157//6 1156//6\nf 1161//1 1164//1 1162//1\nf 1165//2 1166//2 1168//2\nf 1165//5 1161//5 1166//5\nf 1162//4 1163//4 1166//4\nf 1163//3 1164//3 1167//3\nf 1165//6 1168//6 1161//6\nf 1169//1 1172//1 1170//1\nf 1173//2 1174//2 1176//2\nf 1173//5 1169//5 1174//5\nf 1170//4 1171//4 1174//4\nf 1171//3 1172//3 1175//3\nf 1173//6 1176//6 1169//6\nf 1177//1 1180//1 1178//1\nf 1181//2 1182//2 1184//2\nf 1181//5 1177//5 1182//5\nf 1178//4 1179//4 1182//4\nf 1179//3 1180//3 1183//3\nf 1181//6 1184//6 1177//6\nf 1185//1 1188//1 1186//1\nf 1189//2 1190//2 1192//2\nf 1189//5 1185//5 1190//5\nf 1186//4 1187//4 1190//4\nf 1187//3 1188//3 1191//3\nf 1189//6 1192//6 1185//6\nf 1193//1 1196//1 1194//1\nf 1197//2 1198//2 1200//2\nf 1197//5 1193//5 1198//5\nf 1194//4 1195//4 1198//4\nf 1195//3 1196//3 1199//3\nf 1197//6 1200//6 1193//6\nf 1202//1 1201//1 1203//1\nf 1208//2 1205//2 1207//2\nf 1201//5 1202//5 1205//5\nf 1206//4 1202//4 1207//4\nf 1203//3 1204//3 1207//3\nf 1205//6 1208//6 1201//6\nf 1210//1 1209//1 1211//1\nf 1216//2 1213//2 1215//2\nf 1209//5 1210//5 1213//5\nf 1214//4 1210//4 1215//4\nf 1211//3 1212//3 1215//3\nf 1209//6 1213//6 1212//6\nf 1217//1 1220//1 1218//1\nf 1224//2 1221//2 1223//2\nf 1217//5 1218//5 1221//5\nf 1222//4 1218//4 1223//4\nf 1219//3 1220//3 1223//3\nf 1217//6 1221//6 1220//6\nf 1225//1 1228//1 1226//1\nf 1232//2 1229//2 1231//2\nf 1225//5 1226//5 1229//5\nf 1230//4 1226//4 1231//4\nf 1227//3 1228//3 1231//3\nf 1229//6 1232//6 1225//6\nf 1233//1 1236//1 1234//1\nf 1240//2 1237//2 1239//2\nf 1233//5 1234//5 1237//5\nf 1238//4 1234//4 1239//4\nf 1235//3 1236//3 1239//3\nf 1233//6 1237//6 1236//6\nf 1241//1 1244//1 1242//1\nf 1245//2 1246//2 1248//2\nf 1241//5 1242//5 1245//5\nf 1242//4 1243//4 1246//4\nf 1243//3 1244//3 1247//3\nf 1245//6 1248//6 1241//6\nf 1249//1 1252//1 1250//1\nf 1253//2 1254//2 1256//2\nf 1249//5 1250//5 1253//5\nf 1250//4 1251//4 1254//4\nf 1251//3 1252//3 1255//3\nf 1253//6 1256//6 1249//6\nf 1257//1 1260//1 1258//1\nf 1261//2 1262//2 1264//2\nf 1257//5 1258//5 1261//5\nf 1258//4 1259//4 1262//4\nf 1259//3 1260//3 1263//3\nf 1261//6 1264//6 1257//6\nf 1265//1 1268//1 1266//1\nf 1269//2 1270//2 1272//2\nf 1265//5 1266//5 1269//5\nf 1266//4 1267//4 1270//4\nf 1267//3 1268//3 1271//3\nf 1269//6 1272//6 1265//6\nf 1273//1 1276//1 1274//1\nf 1277//2 1278//2 1280//2\nf 1273//5 1274//5 1277//5\nf 1274//4 1275//4 1278//4\nf 1275//3 1276//3 1279//3\nf 1277//6 1280//6 1273//6\nf 1282//1 1281//1 1283//1\nf 1288//2 1285//2 1287//2\nf 1281//5 1282//5 1285//5\nf 1286//4 1282//4 1287//4\nf 1283//3 1284//3 1287//3\nf 1285//6 1288//6 1281//6\nf 1290//1 1289//1 1291//1\nf 1296//2 1293//2 1295//2\nf 1289//5 1290//5 1293//5\nf 1294//4 1290//4 1295//4\nf 1291//3 1292//3 1295//3\nf 1289//6 1293//6 1292//6\nf 1297//1 1300//1 1298//1\nf 1304//2 1301//2 1303//2\nf 1297//5 1298//5 1301//5\nf 1302//4 1298//4 1303//4\nf 1299//3 1300//3 1303//3\nf 1297//6 1301//6 1300//6\nf 1305//1 1308//1 1306//1\nf 1312//2 1309//2 1311//2\nf 1305//5 1306//5 1309//5\nf 1310//4 1306//4 1311//4\nf 1307//3 1308//3 1311//3\nf 1309//6 1312//6 1305//6\nf 1313//1 1316//1 1314//1\nf 1320//2 1317//2 1319//2\nf 1313//5 1314//5 1317//5\nf 1318//4 1314//4 1319//4\nf 1315//3 1316//3 1319//3\nf 1313//6 1317//6 1316//6\nf 1321//1 1324//1 1322//1\nf 1325//2 1326//2 1328//2\nf 1321//5 1322//5 1325//5\nf 1322//4 1323//4 1326//4\nf 1323//3 1324//3 1327//3\nf 1325//6 1328//6 1321//6\nf 1329//1 1332//1 1330//1\nf 1333//2 1334//2 1336//2\nf 1329//5 1330//5 1333//5\nf 1330//4 1331//4 1334//4\nf 1331//3 1332//3 1335//3\nf 1333//6 1336//6 1329//6\nf 1337//1 1340//1 1338//1\nf 1341//2 1342//2 1344//2\nf 1337//5 1338//5 1341//5\nf 1338//4 1339//4 1342//4\nf 1339//3 1340//3 1343//3\nf 1341//6 1344//6 1337//6\nf 1345//1 1348//1 1346//1\nf 1349//2 1350//2 1352//2\nf 1345//5 1346//5 1349//5\nf 1346//4 1347//4 1350//4\nf 1347//3 1348//3 1351//3\nf 1349//6 1352//6 1345//6\nf 1353//1 1356//1 1354//1\nf 1357//2 1358//2 1360//2\nf 1353//5 1354//5 1357//5\nf 1354//4 1355//4 1358//4\nf 1355//3 1356//3 1359//3\nf 1357//6 1360//6 1353//6\nf 1362//1 1361//1 1363//1\nf 1368//2 1365//2 1367//2\nf 1361//5 1362//5 1365//5\nf 1366//4 1362//4 1367//4\nf 1363//3 1364//3 1367//3\nf 1365//6 1368//6 1361//6\nf 1370//1 1369//1 1371//1\nf 1376//2 1373//2 1375//2\nf 1369//5 1370//5 1373//5\nf 1374//4 1370//4 1375//4\nf 1371//3 1372//3 1375//3\nf 1369//6 1373//6 1372//6\nf 1377//1 1380//1 1378//1\nf 1384//2 1381//2 1383//2\nf 1377//5 1378//5 1381//5\nf 1382//4 1378//4 1383//4\nf 1379//3 1380//3 1383//3\nf 1377//6 1381//6 1380//6\nf 1385//1 1388//1 1386//1\nf 1392//2 1389//2 1391//2\nf 1385//5 1386//5 1389//5\nf 1390//4 1386//4 1391//4\nf 1387//3 1388//3 1391//3\nf 1389//6 1392//6 1385//6\nf 1393//1 1396//1 1394//1\nf 1400//2 1397//2 1399//2\nf 1393//5 1394//5 1397//5\nf 1398//4 1394//4 1399//4\nf 1395//3 1396//3 1399//3\nf 1393//6 1397//6 1396//6\nf 1401//1 1404//1 1402//1\nf 1405//2 1406//2 1408//2\nf 1401//5 1402//5 1405//5\nf 1402//4 1403//4 1406//4\nf 1403//3 1404//3 1407//3\nf 1405//6 1408//6 1401//6\nf 1409//1 1412//1 1410//1\nf 1413//2 1414//2 1416//2\nf 1409//5 1410//5 1413//5\nf 1410//4 1411//4 1414//4\nf 1411//3 1412//3 1415//3\nf 1413//6 1416//6 1409//6\nf 1417//1 1420//1 1418//1\nf 1421//2 1422//2 1424//2\nf 1417//5 1418//5 1421//5\nf 1418//4 1419//4 1422//4\nf 1419//3 1420//3 1423//3\nf 1421//6 1424//6 1417//6\nf 1425//1 1428//1 1426//1\nf 1429//2 1430//2 1432//2\nf 1425//5 1426//5 1429//5\nf 1426//4 1427//4 1430//4\nf 1427//3 1428//3 1431//3\nf 1429//6 1432//6 1425//6\nf 1433//1 1436//1 1434//1\nf 1437//2 1438//2 1440//2\nf 1433//5 1434//5 1437//5\nf 1434//4 1435//4 1438//4\nf 1435//3 1436//3 1439//3\nf 1437//6 1440//6 1433//6\nf 1442//1 1441//1 1443//1\nf 1448//2 1445//2 1447//2\nf 1441//5 1442//5 1445//5\nf 1446//4 1442//4 1447//4\nf 1443//3 1444//3 1447//3\nf 1445//6 1448//6 1441//6\nf 1450//1 1449//1 1451//1\nf 1456//2 1453//2 1455//2\nf 1449//5 1450//5 1453//5\nf 1454//4 1450//4 1455//4\nf 1451//3 1452//3 1455//3\nf 1449//6 1453//6 1452//6\nf 1457//1 1460//1 1458//1\nf 1464//2 1461//2 1463//2\nf 1457//5 1458//5 1461//5\nf 1462//4 1458//4 1463//4\nf 1459//3 1460//3 1463//3\nf 1457//6 1461//6 1460//6\nf 1465//1 1468//1 1466//1\nf 1472//2 1469//2 1471//2\nf 1465//5 1466//5 1469//5\nf 1470//4 1466//4 1471//4\nf 1467//3 1468//3 1471//3\nf 1469//6 1472//6 1465//6\nf 1473//1 1476//1 1474//1\nf 1480//2 1477//2 1479//2\nf 1473//5 1474//5 1477//5\nf 1478//4 1474//4 1479//4\nf 1475//3 1476//3 1479//3\nf 1473//6 1477//6 1476//6\nf 1481//1 1484//1 1482//1\nf 1485//2 1486//2 1488//2\nf 1481//5 1482//5 1485//5\nf 1482//4 1483//4 1486//4\nf 1483//3 1484//3 1487//3\nf 1485//6 1488//6 1481//6\nf 1489//1 1492//1 1490//1\nf 1493//2 1494//2 1496//2\nf 1489//5 1490//5 1493//5\nf 1490//4 1491//4 1494//4\nf 1491//3 1492//3 1495//3\nf 1493//6 1496//6 1489//6\nf 1497//1 1500//1 1498//1\nf 1501//2 1502//2 1504//2\nf 1497//5 1498//5 1501//5\nf 1498//4 1499//4 1502//4\nf 1499//3 1500//3 1503//3\nf 1501//6 1504//6 1497//6\nf 1505//1 1508//1 1506//1\nf 1509//2 1510//2 1512//2\nf 1505//5 1506//5 1509//5\nf 1506//4 1507//4 1510//4\nf 1507//3 1508//3 1511//3\nf 1509//6 1512//6 1505//6\nf 1513//1 1516//1 1514//1\nf 1517//2 1518//2 1520//2\nf 1513//5 1514//5 1517//5\nf 1514//4 1515//4 1518//4\nf 1515//3 1516//3 1519//3\nf 1517//6 1520//6 1513//6\nf 1522//1 1521//1 1523//1\nf 1528//2 1525//2 1527//2\nf 1521//5 1522//5 1525//5\nf 1526//4 1522//4 1527//4\nf 1523//3 1524//3 1527//3\nf 1525//6 1528//6 1521//6\nf 1530//1 1529//1 1531//1\nf 1536//2 1533//2 1535//2\nf 1529//5 1530//5 1533//5\nf 1534//4 1530//4 1535//4\nf 1531//3 1532//3 1535//3\nf 1529//6 1533//6 1532//6\nf 1537//1 1540//1 1538//1\nf 1544//2 1541//2 1543//2\nf 1537//5 1538//5 1541//5\nf 1542//4 1538//4 1543//4\nf 1539//3 1540//3 1543//3\nf 1537//6 1541//6 1540//6\nf 1545//1 1548//1 1546//1\nf 1552//2 1549//2 1551//2\nf 1545//5 1546//5 1549//5\nf 1550//4 1546//4 1551//4\nf 1547//3 1548//3 1551//3\nf 1549//6 1552//6 1545//6\nf 1553//1 1556//1 1554//1\nf 1560//2 1557//2 1559//2\nf 1553//5 1554//5 1557//5\nf 1558//4 1554//4 1559//4\nf 1555//3 1556//3 1559//3\nf 1553//6 1557//6 1556//6\nf 1561//1 1564//1 1562//1\nf 1565//2 1566//2 1568//2\nf 1561//5 1562//5 1565//5\nf 1562//4 1563//4 1566//4\nf 1563//3 1564//3 1567//3\nf 1565//6 1568//6 1561//6\nf 1569//1 1572//1 1570//1\nf 1573//2 1574//2 1576//2\nf 1569//5 1570//5 1573//5\nf 1570//4 1571//4 1574//4\nf 1571//3 1572//3 1575//3\nf 1573//6 1576//6 1569//6\nf 1577//1 1580//1 1578//1\nf 1581//2 1582//2 1584//2\nf 1577//5 1578//5 1581//5\nf 1578//4 1579//4 1582//4\nf 1579//3 1580//3 1583//3\nf 1581//6 1584//6 1577//6\nf 1585//1 1588//1 1586//1\nf 1589//2 1590//2 1592//2\nf 1585//5 1586//5 1589//5\nf 1586//4 1587//4 1590//4\nf 1587//3 1588//3 1591//3\nf 1589//6 1592//6 1585//6\nf 1593//1 1596//1 1594//1\nf 1597//2 1598//2 1600//2\nf 1593//5 1594//5 1597//5\nf 1594//4 1595//4 1598//4\nf 1595//3 1596//3 1599//3\nf 1597//6 1600//6 1593//6\nf 1601//1 1602//1 1604//1\nf 1605//2 1608//2 1606//2\nf 1602//3 1601//3 1606//3\nf 1603//4 1602//4 1607//4\nf 1603//5 1607//5 1604//5\nf 1605//6 1601//6 1608//6\nf 1609//1 1610//1 1612//1\nf 1614//2 1613//2 1615//2\nf 1610//3 1609//3 1614//3\nf 1611//4 1610//4 1615//4\nf 1611//5 1615//5 1612//5\nf 1613//6 1609//6 1616//6\nf 1617//1 1618//1 1620//1\nf 1621//2 1624//2 1622//2\nf 1618//3 1617//3 1622//3\nf 1619//4 1618//4 1623//4\nf 1619//5 1623//5 1620//5\nf 1624//6 1621//6 1620//6\nf 1625//1 1626//1 1628//1\nf 1629//2 1632//2 1630//2\nf 1626//3 1625//3 1630//3\nf 1627//4 1626//4 1631//4\nf 1627//5 1631//5 1628//5\nf 1629//6 1625//6 1632//6\nf 1633//1 1634//1 1636//1\nf 1638//2 1637//2 1639//2\nf 1634//3 1633//3 1638//3\nf 1635//4 1634//4 1639//4\nf 1635//5 1639//5 1636//5\nf 1640//6 1637//6 1636//6\nf 1641//1 1642//1 1644//1\nf 1645//2 1648//2 1646//2\nf 1642//3 1641//3 1646//3\nf 1642//4 1646//4 1643//4\nf 1643//5 1647//5 1644//5\nf 1645//6 1641//6 1648//6\nf 1649//1 1650//1 1652//1\nf 1653//2 1656//2 1654//2\nf 1650//3 1649//3 1654//3\nf 1650//4 1654//4 1651//4\nf 1651//5 1655//5 1652//5\nf 1653//6 1649//6 1656//6\nf 1657//1 1658//1 1660//1\nf 1661//2 1664//2 1662//2\nf 1658//3 1657//3 1662//3\nf 1658//4 1662//4 1659//4\nf 1659//5 1663//5 1660//5\nf 1661//6 1657//6 1664//6\nf 1665//1 1666//1 1668//1\nf 1669//2 1672//2 1670//2\nf 1666//3 1665//3 1670//3\nf 1666//4 1670//4 1667//4\nf 1667//5 1671//5 1668//5\nf 1669//6 1665//6 1672//6\nf 1673//1 1674//1 1676//1\nf 1677//2 1680//2 1678//2\nf 1674//3 1673//3 1678//3\nf 1674//4 1678//4 1675//4\nf 1675//5 1679//5 1676//5\nf 1677//6 1673//6 1680//6\nf 1681//1 1682//1 1684//1\nf 1685//2 1688//2 1686//2\nf 1681//3 1685//3 1682//3\nf 1683//4 1682//4 1687//4\nf 1683//5 1687//5 1684//5\nf 1685//6 1681//6 1688//6\nf 1689//1 1690//1 1692//1\nf 1694//2 1693//2 1695//2\nf 1690//3 1689//3 1694//3\nf 1691//4 1690//4 1695//4\nf 1691//5 1695//5 1692//5\nf 1693//6 1689//6 1696//6\nf 1697//1 1698//1 1700//1\nf 1701//2 1704//2 1702//2\nf 1698//3 1697//3 1702//3\nf 1699//4 1698//4 1703//4\nf 1699//5 1703//5 1700//5\nf 1704//6 1701//6 1700//6\nf 1705//1 1706//1 1708//1\nf 1709//2 1712//2 1710//2\nf 1706//3 1705//3 1710//3\nf 1707//4 1706//4 1711//4\nf 1707//5 1711//5 1708//5\nf 1709//6 1705//6 1712//6\nf 1713//1 1714//1 1716//1\nf 1718//2 1717//2 1719//2\nf 1714//3 1713//3 1718//3\nf 1715//4 1714//4 1719//4\nf 1715//5 1719//5 1716//5\nf 1720//6 1717//6 1716//6\nf 1721//1 1722//1 1724//1\nf 1725//2 1728//2 1726//2\nf 1722//3 1721//3 1726//3\nf 1722//4 1726//4 1723//4\nf 1723//5 1727//5 1724//5\nf 1725//6 1721//6 1728//6\nf 1729//1 1730//1 1732//1\nf 1733//2 1736//2 1734//2\nf 1730//3 1729//3 1734//3\nf 1730//4 1734//4 1731//4\nf 1731//5 1735//5 1732//5\nf 1733//6 1729//6 1736//6\nf 1737//1 1738//1 1740//1\nf 1741//2 1744//2 1742//2\nf 1738//3 1737//3 1742//3\nf 1738//4 1742//4 1739//4\nf 1739//5 1743//5 1740//5\nf 1741//6 1737//6 1744//6\nf 1745//1 1746//1 1748//1\nf 1749//2 1752//2 1750//2\nf 1746//3 1745//3 1750//3\nf 1746//4 1750//4 1747//4\nf 1747//5 1751//5 1748//5\nf 1749//6 1745//6 1752//6\nf 1753//1 1754//1 1756//1\nf 1757//2 1760//2 1758//2\nf 1754//3 1753//3 1758//3\nf 1754//4 1758//4 1755//4\nf 1755//5 1759//5 1756//5\nf 1757//6 1753//6 1760//6\nf 1761//1 1762//1 1764//1\nf 1766//2 1765//2 1767//2\nf 1761//3 1765//3 1762//3\nf 1763//4 1762//4 1767//4\nf 1763//5 1767//5 1764//5\nf 1765//6 1761//6 1768//6\nf 1769//1 1770//1 1772//1\nf 1774//2 1773//2 1775//2\nf 1769//3 1773//3 1770//3\nf 1771//4 1770//4 1775//4\nf 1771//5 1775//5 1772//5\nf 1773//6 1769//6 1776//6\nf 1777//1 1778//1 1780//1\nf 1782//2 1781//2 1783//2\nf 1778//3 1777//3 1782//3\nf 1779//4 1778//4 1783//4\nf 1779//5 1783//5 1780//5\nf 1784//6 1781//6 1780//6\nf 1785//1 1786//1 1788//1\nf 1790//2 1789//2 1791//2\nf 1786//3 1785//3 1790//3\nf 1787//4 1786//4 1791//4\nf 1787//5 1791//5 1788//5\nf 1789//6 1785//6 1792//6\nf 1793//1 1794//1 1796//1\nf 1798//2 1797//2 1799//2\nf 1793//3 1797//3 1794//3\nf 1795//4 1794//4 1799//4\nf 1795//5 1799//5 1796//5\nf 1800//6 1797//6 1796//6\nf 1801//1 1802//1 1804//1\nf 1805//2 1808//2 1806//2\nf 1802//3 1801//3 1806//3\nf 1802//4 1806//4 1803//4\nf 1803//5 1807//5 1804//5\nf 1805//6 1801//6 1808//6\nf 1809//1 1810//1 1812//1\nf 1813//2 1816//2 1814//2\nf 1810//3 1809//3 1814//3\nf 1810//4 1814//4 1811//4\nf 1811//5 1815//5 1812//5\nf 1813//6 1809//6 1816//6\nf 1817//1 1818//1 1820//1\nf 1821//2 1824//2 1822//2\nf 1818//3 1817//3 1822//3\nf 1818//4 1822//4 1819//4\nf 1819//5 1823//5 1820//5\nf 1821//6 1817//6 1824//6\nf 1825//1 1826//1 1828//1\nf 1829//2 1832//2 1830//2\nf 1826//3 1825//3 1830//3\nf 1826//4 1830//4 1827//4\nf 1827//5 1831//5 1828//5\nf 1829//6 1825//6 1832//6\nf 1833//1 1834//1 1836//1\nf 1837//2 1840//2 1838//2\nf 1834//3 1833//3 1838//3\nf 1834//4 1838//4 1835//4\nf 1835//5 1839//5 1836//5\nf 1837//6 1833//6 1840//6\nf 1844//1 1841//1 1843//1\nf 1845//2 1848//2 1846//2\nf 1842//3 1841//3 1846//3\nf 1843//4 1842//4 1847//4\nf 1843//5 1847//5 1844//5\nf 1845//6 1841//6 1848//6\nf 1852//1 1849//1 1851//1\nf 1853//2 1856//2 1854//2\nf 1850//3 1849//3 1854//3\nf 1851//4 1850//4 1855//4\nf 1851//5 1855//5 1852//5\nf 1853//6 1849//6 1856//6\nf 1857//1 1858//1 1860//1\nf 1861//2 1864//2 1862//2\nf 1858//3 1857//3 1862//3\nf 1859//4 1858//4 1863//4\nf 1859//5 1863//5 1860//5\nf 1864//6 1861//6 1860//6\nf 1865//1 1866//1 1868//1\nf 1869//2 1872//2 1870//2\nf 1866//3 1865//3 1870//3\nf 1867//4 1866//4 1871//4\nf 1867//5 1871//5 1868//5\nf 1869//6 1865//6 1872//6\nf 1873//1 1874//1 1876//1\nf 1877//2 1880//2 1878//2\nf 1874//3 1873//3 1878//3\nf 1875//4 1874//4 1879//4\nf 1875//5 1879//5 1876//5\nf 1880//6 1877//6 1876//6\nf 1881//1 1882//1 1884//1\nf 1885//2 1888//2 1886//2\nf 1882//3 1881//3 1886//3\nf 1882//4 1886//4 1883//4\nf 1883//5 1887//5 1884//5\nf 1885//6 1881//6 1888//6\nf 1889//1 1890//1 1892//1\nf 1893//2 1896//2 1894//2\nf 1890//3 1889//3 1894//3\nf 1890//4 1894//4 1891//4\nf 1891//5 1895//5 1892//5\nf 1893//6 1889//6 1896//6\nf 1897//1 1898//1 1900//1\nf 1901//2 1904//2 1902//2\nf 1898//3 1897//3 1902//3\nf 1898//4 1902//4 1899//4\nf 1899//5 1903//5 1900//5\nf 1901//6 1897//6 1904//6\nf 1905//1 1906//1 1908//1\nf 1909//2 1912//2 1910//2\nf 1906//3 1905//3 1910//3\nf 1906//4 1910//4 1907//4\nf 1907//5 1911//5 1908//5\nf 1909//6 1905//6 1912//6\nf 1913//1 1914//1 1916//1\nf 1917//2 1920//2 1918//2\nf 1914//3 1913//3 1918//3\nf 1914//4 1918//4 1915//4\nf 1915//5 1919//5 1916//5\nf 1917//6 1913//6 1920//6\nf 1924//1 1921//1 1923//1\nf 1925//2 1928//2 1926//2\nf 1922//3 1921//3 1926//3\nf 1923//4 1922//4 1927//4\nf 1923//5 1927//5 1924//5\nf 1925//6 1921//6 1928//6\nf 1932//1 1929//1 1931//1\nf 1933//2 1936//2 1934//2\nf 1930//3 1929//3 1934//3\nf 1931//4 1930//4 1935//4\nf 1931//5 1935//5 1932//5\nf 1933//6 1929//6 1936//6\nf 1937//1 1938//1 1940//1\nf 1941//2 1944//2 1942//2\nf 1938//3 1937//3 1942//3\nf 1939//4 1938//4 1943//4\nf 1939//5 1943//5 1940//5\nf 1944//6 1941//6 1940//6\nf 1945//1 1946//1 1948//1\nf 1949//2 1952//2 1950//2\nf 1946//3 1945//3 1950//3\nf 1947//4 1946//4 1951//4\nf 1947//5 1951//5 1948//5\nf 1949//6 1945//6 1952//6\nf 1953//1 1954//1 1956//1\nf 1957//2 1960//2 1958//2\nf 1954//3 1953//3 1958//3\nf 1955//4 1954//4 1959//4\nf 1955//5 1959//5 1956//5\nf 1960//6 1957//6 1956//6\nf 1961//1 1962//1 1964//1\nf 1965//2 1968//2 1966//2\nf 1962//3 1961//3 1966//3\nf 1962//4 1966//4 1963//4\nf 1963//5 1967//5 1964//5\nf 1965//6 1961//6 1968//6\nf 1969//1 1970//1 1972//1\nf 1973//2 1976//2 1974//2\nf 1970//3 1969//3 1974//3\nf 1970//4 1974//4 1971//4\nf 1971//5 1975//5 1972//5\nf 1973//6 1969//6 1976//6\nf 1977//1 1978//1 1980//1\nf 1981//2 1984//2 1982//2\nf 1978//3 1977//3 1982//3\nf 1978//4 1982//4 1979//4\nf 1979//5 1983//5 1980//5\nf 1981//6 1977//6 1984//6\nf 1985//1 1986//1 1988//1\nf 1989//2 1992//2 1990//2\nf 1986//3 1985//3 1990//3\nf 1986//4 1990//4 1987//4\nf 1987//5 1991//5 1988//5\nf 1989//6 1985//6 1992//6\nf 1993//1 1994//1 1996//1\nf 1997//2 2000//2 1998//2\nf 1994//3 1993//3 1998//3\nf 1994//4 1998//4 1995//4\nf 1995//5 1999//5 1996//5\nf 1997//6 1993//6 2000//6\nf 2004//1 2001//1 2003//1\nf 2006//2 2005//2 2007//2\nf 2001//3 2005//3 2002//3\nf 2003//4 2002//4 2007//4\nf 2003//5 2007//5 2004//5\nf 2005//6 2001//6 2008//6\nf 2012//1 2009//1 2011//1\nf 2014//2 2013//2 2015//2\nf 2009//3 2013//3 2010//3\nf 2011//4 2010//4 2015//4\nf 2011//5 2015//5 2012//5\nf 2013//6 2009//6 2016//6\nf 2017//1 2018//1 2020//1\nf 2022//2 2021//2 2023//2\nf 2017//3 2021//3 2018//3\nf 2019//4 2018//4 2023//4\nf 2019//5 2023//5 2020//5\nf 2024//6 2021//6 2020//6\nf 2025//1 2026//1 2028//1\nf 2030//2 2029//2 2031//2\nf 2025//3 2029//3 2026//3\nf 2027//4 2026//4 2031//4\nf 2027//5 2031//5 2028//5\nf 2029//6 2025//6 2032//6\nf 2033//1 2034//1 2036//1\nf 2038//2 2037//2 2039//2\nf 2033//3 2037//3 2034//3\nf 2035//4 2034//4 2039//4\nf 2035//5 2039//5 2036//5\nf 2040//6 2037//6 2036//6\nf 2041//1 2042//1 2044//1\nf 2045//2 2048//2 2046//2\nf 2041//3 2045//3 2042//3\nf 2042//4 2046//4 2043//4\nf 2043//5 2047//5 2044//5\nf 2045//6 2041//6 2048//6\nf 2049//1 2050//1 2052//1\nf 2053//2 2056//2 2054//2\nf 2049//3 2053//3 2050//3\nf 2050//4 2054//4 2051//4\nf 2051//5 2055//5 2052//5\nf 2053//6 2049//6 2056//6\nf 2057//1 2058//1 2060//1\nf 2061//2 2064//2 2062//2\nf 2057//3 2061//3 2058//3\nf 2058//4 2062//4 2059//4\nf 2059//5 2063//5 2060//5\nf 2061//6 2057//6 2064//6\nf 2065//1 2066//1 2068//1\nf 2069//2 2072//2 2070//2\nf 2065//3 2069//3 2066//3\nf 2066//4 2070//4 2067//4\nf 2067//5 2071//5 2068//5\nf 2069//6 2065//6 2072//6\nf 2073//1 2074//1 2076//1\nf 2077//2 2080//2 2078//2\nf 2073//3 2077//3 2074//3\nf 2074//4 2078//4 2075//4\nf 2075//5 2079//5 2076//5\nf 2077//6 2073//6 2080//6\nf 2084//1 2081//1 2083//1\nf 2086//2 2085//2 2087//2\nf 2081//3 2085//3 2082//3\nf 2083//4 2082//4 2087//4\nf 2083//5 2087//5 2084//5\nf 2085//6 2081//6 2088//6\nf 2092//1 2089//1 2091//1\nf 2094//2 2093//2 2095//2\nf 2089//3 2093//3 2090//3\nf 2091//4 2090//4 2095//4\nf 2091//5 2095//5 2092//5\nf 2093//6 2089//6 2096//6\nf 2097//1 2098//1 2100//1\nf 2102//2 2101//2 2103//2\nf 2097//3 2101//3 2098//3\nf 2099//4 2098//4 2103//4\nf 2099//5 2103//5 2100//5\nf 2104//6 2101//6 2100//6\nf 2105//1 2106//1 2108//1\nf 2110//2 2109//2 2111//2\nf 2105//3 2109//3 2106//3\nf 2107//4 2106//4 2111//4\nf 2107//5 2111//5 2108//5\nf 2109//6 2105//6 2112//6\nf 2113//1 2114//1 2116//1\nf 2118//2 2117//2 2119//2\nf 2113//3 2117//3 2114//3\nf 2115//4 2114//4 2119//4\nf 2115//5 2119//5 2116//5\nf 2120//6 2117//6 2116//6\nf 2121//1 2122//1 2124//1\nf 2125//2 2128//2 2126//2\nf 2121//3 2125//3 2122//3\nf 2122//4 2126//4 2123//4\nf 2123//5 2127//5 2124//5\nf 2125//6 2121//6 2128//6\nf 2129//1 2130//1 2132//1\nf 2133//2 2136//2 2134//2\nf 2129//3 2133//3 2130//3\nf 2130//4 2134//4 2131//4\nf 2131//5 2135//5 2132//5\nf 2133//6 2129//6 2136//6\nf 2137//1 2138//1 2140//1\nf 2141//2 2144//2 2142//2\nf 2137//3 2141//3 2138//3\nf 2138//4 2142//4 2139//4\nf 2139//5 2143//5 2140//5\nf 2141//6 2137//6 2144//6\nf 2145//1 2146//1 2148//1\nf 2149//2 2152//2 2150//2\nf 2145//3 2149//3 2146//3\nf 2146//4 2150//4 2147//4\nf 2147//5 2151//5 2148//5\nf 2149//6 2145//6 2152//6\nf 2153//1 2154//1 2156//1\nf 2157//2 2160//2 2158//2\nf 2153//3 2157//3 2154//3\nf 2154//4 2158//4 2155//4\nf 2155//5 2159//5 2156//5\nf 2157//6 2153//6 2160//6\nf 2164//1 2161//1 2163//1\nf 2166//2 2165//2 2167//2\nf 2161//3 2165//3 2162//3\nf 2163//4 2162//4 2167//4\nf 2163//5 2167//5 2164//5\nf 2165//6 2161//6 2168//6\nf 2172//1 2169//1 2171//1\nf 2174//2 2173//2 2175//2\nf 2169//3 2173//3 2170//3\nf 2171//4 2170//4 2175//4\nf 2171//5 2175//5 2172//5\nf 2173//6 2169//6 2176//6\nf 2177//1 2178//1 2180//1\nf 2182//2 2181//2 2183//2\nf 2177//3 2181//3 2178//3\nf 2179//4 2178//4 2183//4\nf 2179//5 2183//5 2180//5\nf 2184//6 2181//6 2180//6\nf 2185//1 2186//1 2188//1\nf 2190//2 2189//2 2191//2\nf 2185//3 2189//3 2186//3\nf 2187//4 2186//4 2191//4\nf 2187//5 2191//5 2188//5\nf 2189//6 2185//6 2192//6\nf 2193//1 2194//1 2196//1\nf 2198//2 2197//2 2199//2\nf 2193//3 2197//3 2194//3\nf 2195//4 2194//4 2199//4\nf 2195//5 2199//5 2196//5\nf 2200//6 2197//6 2196//6\nf 2201//1 2202//1 2204//1\nf 2205//2 2208//2 2206//2\nf 2201//3 2205//3 2202//3\nf 2202//4 2206//4 2203//4\nf 2203//5 2207//5 2204//5\nf 2205//6 2201//6 2208//6\nf 2209//1 2210//1 2212//1\nf 2213//2 2216//2 2214//2\nf 2209//3 2213//3 2210//3\nf 2210//4 2214//4 2211//4\nf 2211//5 2215//5 2212//5\nf 2213//6 2209//6 2216//6\nf 2217//1 2218//1 2220//1\nf 2221//2 2224//2 2222//2\nf 2217//3 2221//3 2218//3\nf 2218//4 2222//4 2219//4\nf 2219//5 2223//5 2220//5\nf 2221//6 2217//6 2224//6\nf 2225//1 2226//1 2228//1\nf 2229//2 2232//2 2230//2\nf 2225//3 2229//3 2226//3\nf 2226//4 2230//4 2227//4\nf 2227//5 2231//5 2228//5\nf 2229//6 2225//6 2232//6\nf 2233//1 2234//1 2236//1\nf 2237//2 2240//2 2238//2\nf 2233//3 2237//3 2234//3\nf 2234//4 2238//4 2235//4\nf 2235//5 2239//5 2236//5\nf 2237//6 2233//6 2240//6\nf 2244//1 2241//1 2243//1\nf 2246//2 2245//2 2247//2\nf 2241//3 2245//3 2242//3\nf 2243//4 2242//4 2247//4\nf 2243//5 2247//5 2244//5\nf 2245//6 2241//6 2248//6\nf 2252//1 2249//1 2251//1\nf 2254//2 2253//2 2255//2\nf 2249//3 2253//3 2250//3\nf 2251//4 2250//4 2255//4\nf 2251//5 2255//5 2252//5\nf 2253//6 2249//6 2256//6\nf 2257//1 2258//1 2260//1\nf 2262//2 2261//2 2263//2\nf 2257//3 2261//3 2258//3\nf 2259//4 2258//4 2263//4\nf 2259//5 2263//5 2260//5\nf 2264//6 2261//6 2260//6\nf 2265//1 2266//1 2268//1\nf 2270//2 2269//2 2271//2\nf 2265//3 2269//3 2266//3\nf 2267//4 2266//4 2271//4\nf 2267//5 2271//5 2268//5\nf 2269//6 2265//6 2272//6\nf 2273//1 2274//1 2276//1\nf 2278//2 2277//2 2279//2\nf 2273//3 2277//3 2274//3\nf 2275//4 2274//4 2279//4\nf 2275//5 2279//5 2276//5\nf 2280//6 2277//6 2276//6\nf 2281//1 2282//1 2284//1\nf 2285//2 2288//2 2286//2\nf 2281//3 2285//3 2282//3\nf 2282//4 2286//4 2283//4\nf 2283//5 2287//5 2284//5\nf 2285//6 2281//6 2288//6\nf 2289//1 2290//1 2292//1\nf 2293//2 2296//2 2294//2\nf 2289//3 2293//3 2290//3\nf 2290//4 2294//4 2291//4\nf 2291//5 2295//5 2292//5\nf 2293//6 2289//6 2296//6\nf 2297//1 2298//1 2300//1\nf 2301//2 2304//2 2302//2\nf 2297//3 2301//3 2298//3\nf 2298//4 2302//4 2299//4\nf 2299//5 2303//5 2300//5\nf 2301//6 2297//6 2304//6\nf 2305//1 2306//1 2308//1\nf 2309//2 2312//2 2310//2\nf 2305//3 2309//3 2306//3\nf 2306//4 2310//4 2307//4\nf 2307//5 2311//5 2308//5\nf 2309//6 2305//6 2312//6\nf 2313//1 2314//1 2316//1\nf 2317//2 2320//2 2318//2\nf 2313//3 2317//3 2314//3\nf 2314//4 2318//4 2315//4\nf 2315//5 2319//5 2316//5\nf 2317//6 2313//6 2320//6\nf 2324//1 2321//1 2323//1\nf 2326//2 2325//2 2327//2\nf 2321//3 2325//3 2322//3\nf 2323//4 2322//4 2327//4\nf 2323//5 2327//5 2324//5\nf 2325//6 2321//6 2328//6\nf 2332//1 2329//1 2331//1\nf 2334//2 2333//2 2335//2\nf 2329//3 2333//3 2330//3\nf 2331//4 2330//4 2335//4\nf 2331//5 2335//5 2332//5\nf 2333//6 2329//6 2336//6\nf 2337//1 2338//1 2340//1\nf 2342//2 2341//2 2343//2\nf 2337//3 2341//3 2338//3\nf 2339//4 2338//4 2343//4\nf 2339//5 2343//5 2340//5\nf 2344//6 2341//6 2340//6\nf 2345//1 2346//1 2348//1\nf 2350//2 2349//2 2351//2\nf 2345//3 2349//3 2346//3\nf 2347//4 2346//4 2351//4\nf 2347//5 2351//5 2348//5\nf 2349//6 2345//6 2352//6\nf 2353//1 2354//1 2356//1\nf 2358//2 2357//2 2359//2\nf 2353//3 2357//3 2354//3\nf 2355//4 2354//4 2359//4\nf 2355//5 2359//5 2356//5\nf 2360//6 2357//6 2356//6\nf 2361//1 2362//1 2364//1\nf 2365//2 2368//2 2366//2\nf 2361//3 2365//3 2362//3\nf 2362//4 2366//4 2363//4\nf 2363//5 2367//5 2364//5\nf 2365//6 2361//6 2368//6\nf 2369//1 2370//1 2372//1\nf 2373//2 2376//2 2374//2\nf 2369//3 2373//3 2370//3\nf 2370//4 2374//4 2371//4\nf 2371//5 2375//5 2372//5\nf 2373//6 2369//6 2376//6\nf 2377//1 2378//1 2380//1\nf 2381//2 2384//2 2382//2\nf 2377//3 2381//3 2378//3\nf 2378//4 2382//4 2379//4\nf 2379//5 2383//5 2380//5\nf 2381//6 2377//6 2384//6\nf 2385//1 2386//1 2388//1\nf 2389//2 2392//2 2390//2\nf 2385//3 2389//3 2386//3\nf 2386//4 2390//4 2387//4\nf 2387//5 2391//5 2388//5\nf 2389//6 2385//6 2392//6\nf 2393//1 2394//1 2396//1\nf 2397//2 2400//2 2398//2\nf 2393//3 2397//3 2394//3\nf 2394//4 2398//4 2395//4\nf 2395//5 2399//5 2396//5\nf 2397//6 2393//6 2400//6\nf 2401//1 2404//1 2402//1\nf 2408//2 2405//2 2407//2\nf 2405//5 2401//5 2406//5\nf 2406//4 2402//4 2407//4\nf 2403//3 2404//3 2407//3\nf 2405//6 2408//6 2401//6\nf 2409//1 2412//1 2410//1\nf 2416//2 2413//2 2415//2\nf 2413//5 2409//5 2414//5\nf 2414//4 2410//4 2415//4\nf 2411//3 2412//3 2415//3\nf 2409//6 2413//6 2412//6\nf 2417//1 2420//1 2418//1\nf 2424//2 2421//2 2423//2\nf 2421//5 2417//5 2422//5\nf 2422//4 2418//4 2423//4\nf 2419//3 2420//3 2423//3\nf 2417//6 2421//6 2420//6\nf 2425//1 2428//1 2426//1\nf 2429//2 2430//2 2432//2\nf 2429//5 2425//5 2430//5\nf 2430//4 2426//4 2431//4\nf 2427//3 2428//3 2431//3\nf 2429//6 2432//6 2425//6\nf 2433//1 2436//1 2434//1\nf 2440//2 2437//2 2439//2\nf 2437//5 2433//5 2438//5\nf 2438//4 2434//4 2439//4\nf 2435//3 2436//3 2439//3\nf 2433//6 2437//6 2436//6\nf 2441//1 2444//1 2442//1\nf 2445//2 2446//2 2448//2\nf 2445//5 2441//5 2446//5\nf 2442//4 2443//4 2446//4\nf 2443//3 2444//3 2447//3\nf 2445//6 2448//6 2441//6\nf 2449//1 2452//1 2450//1\nf 2453//2 2454//2 2456//2\nf 2453//5 2449//5 2454//5\nf 2450//4 2451//4 2454//4\nf 2451//3 2452//3 2455//3\nf 2453//6 2456//6 2449//6\nf 2457//1 2460//1 2458//1\nf 2461//2 2462//2 2464//2\nf 2461//5 2457//5 2462//5\nf 2458//4 2459//4 2462//4\nf 2459//3 2460//3 2463//3\nf 2461//6 2464//6 2457//6\nf 2465//1 2468//1 2466//1\nf 2469//2 2470//2 2472//2\nf 2469//5 2465//5 2470//5\nf 2466//4 2467//4 2470//4\nf 2467//3 2468//3 2471//3\nf 2469//6 2472//6 2465//6\nf 2473//1 2476//1 2474//1\nf 2477//2 2478//2 2480//2\nf 2477//5 2473//5 2478//5\nf 2474//4 2475//4 2478//4\nf 2475//3 2476//3 2479//3\nf 2477//6 2480//6 2473//6\nf 2481//1 2484//1 2482//1\nf 2488//2 2485//2 2487//2\nf 2481//5 2482//5 2485//5\nf 2486//4 2482//4 2487//4\nf 2483//3 2484//3 2487//3\nf 2485//6 2488//6 2481//6\nf 2489//1 2492//1 2490//1\nf 2496//2 2493//2 2495//2\nf 2493//5 2489//5 2494//5\nf 2494//4 2490//4 2495//4\nf 2491//3 2492//3 2495//3\nf 2489//6 2493//6 2492//6\nf 2497//1 2500//1 2498//1\nf 2504//2 2501//2 2503//2\nf 2501//5 2497//5 2502//5\nf 2502//4 2498//4 2503//4\nf 2499//3 2500//3 2503//3\nf 2497//6 2501//6 2500//6\nf 2505//1 2508//1 2506//1\nf 2509//2 2510//2 2512//2\nf 2509//5 2505//5 2510//5\nf 2510//4 2506//4 2511//4\nf 2507//3 2508//3 2511//3\nf 2509//6 2512//6 2505//6\nf 2513//1 2516//1 2514//1\nf 2517//2 2518//2 2520//2\nf 2517//5 2513//5 2518//5\nf 2518//4 2514//4 2519//4\nf 2515//3 2516//3 2519//3\nf 2513//6 2517//6 2516//6\nf 2521//1 2524//1 2522//1\nf 2525//2 2526//2 2528//2\nf 2525//5 2521//5 2526//5\nf 2522//4 2523//4 2526//4\nf 2523//3 2524//3 2527//3\nf 2525//6 2528//6 2521//6\nf 2529//1 2532//1 2530//1\nf 2533//2 2534//2 2536//2\nf 2533//5 2529//5 2534//5\nf 2530//4 2531//4 2534//4\nf 2531//3 2532//3 2535//3\nf 2533//6 2536//6 2529//6\nf 2537//1 2540//1 2538//1\nf 2541//2 2542//2 2544//2\nf 2541//5 2537//5 2542//5\nf 2538//4 2539//4 2542//4\nf 2539//3 2540//3 2543//3\nf 2541//6 2544//6 2537//6\nf 2545//1 2548//1 2546//1\nf 2549//2 2550//2 2552//2\nf 2549//5 2545//5 2550//5\nf 2546//4 2547//4 2550//4\nf 2547//3 2548//3 2551//3\nf 2549//6 2552//6 2545//6\nf 2553//1 2556//1 2554//1\nf 2557//2 2558//2 2560//2\nf 2557//5 2553//5 2558//5\nf 2554//4 2555//4 2558//4\nf 2555//3 2556//3 2559//3\nf 2557//6 2560//6 2553//6\nf 2562//1 2561//1 2563//1\nf 2568//2 2565//2 2567//2\nf 2561//5 2562//5 2565//5\nf 2566//4 2562//4 2567//4\nf 2563//3 2564//3 2567//3\nf 2565//6 2568//6 2561//6\nf 2569//1 2572//1 2570//1\nf 2576//2 2573//2 2575//2\nf 2569//5 2570//5 2573//5\nf 2574//4 2570//4 2575//4\nf 2571//3 2572//3 2575//3\nf 2569//6 2573//6 2572//6\nf 2577//1 2580//1 2578//1\nf 2584//2 2581//2 2583//2\nf 2581//5 2577//5 2582//5\nf 2582//4 2578//4 2583//4\nf 2579//3 2580//3 2583//3\nf 2577//6 2581//6 2580//6\nf 2585//1 2588//1 2586//1\nf 2592//2 2589//2 2591//2\nf 2589//5 2585//5 2590//5\nf 2590//4 2586//4 2591//4\nf 2587//3 2588//3 2591//3\nf 2589//6 2592//6 2585//6\nf 2593//1 2596//1 2594//1\nf 2600//2 2597//2 2599//2\nf 2593//5 2594//5 2597//5\nf 2598//4 2594//4 2599//4\nf 2595//3 2596//3 2599//3\nf 2593//6 2597//6 2596//6\nf 2601//1 2604//1 2602//1\nf 2605//2 2606//2 2608//2\nf 2605//5 2601//5 2606//5\nf 2602//4 2603//4 2606//4\nf 2603//3 2604//3 2607//3\nf 2605//6 2608//6 2601//6\nf 2609//1 2612//1 2610//1\nf 2613//2 2614//2 2616//2\nf 2613//5 2609//5 2614//5\nf 2610//4 2611//4 2614//4\nf 2611//3 2612//3 2615//3\nf 2613//6 2616//6 2609//6\nf 2617//1 2620//1 2618//1\nf 2621//2 2622//2 2624//2\nf 2621//5 2617//5 2622//5\nf 2618//4 2619//4 2622//4\nf 2619//3 2620//3 2623//3\nf 2621//6 2624//6 2617//6\nf 2625//1 2628//1 2626//1\nf 2629//2 2630//2 2632//2\nf 2629//5 2625//5 2630//5\nf 2626//4 2627//4 2630//4\nf 2627//3 2628//3 2631//3\nf 2629//6 2632//6 2625//6\nf 2633//1 2636//1 2634//1\nf 2637//2 2638//2 2640//2\nf 2637//5 2633//5 2638//5\nf 2634//4 2635//4 2638//4\nf 2635//3 2636//3 2639//3\nf 2637//6 2640//6 2633//6\nf 2642//1 2641//1 2643//1\nf 2645//2 2646//2 2648//2\nf 2645//5 2641//5 2646//5\nf 2646//4 2642//4 2647//4\nf 2643//3 2644//3 2647//3\nf 2645//6 2648//6 2641//6\nf 2650//1 2649//1 2651//1\nf 2653//2 2654//2 2656//2\nf 2653//5 2649//5 2654//5\nf 2654//4 2650//4 2655//4\nf 2651//3 2652//3 2655//3\nf 2649//6 2653//6 2652//6\nf 2657//1 2660//1 2658//1\nf 2661//2 2662//2 2664//2\nf 2661//5 2657//5 2662//5\nf 2662//4 2658//4 2663//4\nf 2659//3 2660//3 2663//3\nf 2657//6 2661//6 2660//6\nf 2665//1 2668//1 2666//1\nf 2669//2 2670//2 2672//2\nf 2669//5 2665//5 2670//5\nf 2670//4 2666//4 2671//4\nf 2667//3 2668//3 2671//3\nf 2669//6 2672//6 2665//6\nf 2673//1 2676//1 2674//1\nf 2677//2 2678//2 2680//2\nf 2677//5 2673//5 2678//5\nf 2678//4 2674//4 2679//4\nf 2675//3 2676//3 2679//3\nf 2673//6 2677//6 2676//6\nf 2681//1 2684//1 2682//1\nf 2685//2 2686//2 2688//2\nf 2685//5 2681//5 2686//5\nf 2682//4 2683//4 2686//4\nf 2683//3 2684//3 2687//3\nf 2685//6 2688//6 2681//6\nf 2689//1 2692//1 2690//1\nf 2693//2 2694//2 2696//2\nf 2693//5 2689//5 2694//5\nf 2690//4 2691//4 2694//4\nf 2691//3 2692//3 2695//3\nf 2693//6 2696//6 2689//6\nf 2697//1 2700//1 2698//1\nf 2701//2 2702//2 2704//2\nf 2701//5 2697//5 2702//5\nf 2698//4 2699//4 2702//4\nf 2699//3 2700//3 2703//3\nf 2701//6 2704//6 2697//6\nf 2705//1 2708//1 2706//1\nf 2709//2 2710//2 2712//2\nf 2709//5 2705//5 2710//5\nf 2706//4 2707//4 2710//4\nf 2707//3 2708//3 2711//3\nf 2709//6 2712//6 2705//6\nf 2713//1 2716//1 2714//1\nf 2717//2 2718//2 2720//2\nf 2717//5 2713//5 2718//5\nf 2714//4 2715//4 2718//4\nf 2715//3 2716//3 2719//3\nf 2717//6 2720//6 2713//6\nf 2722//1 2721//1 2723//1\nf 2725//2 2726//2 2728//2\nf 2725//5 2721//5 2726//5\nf 2726//4 2722//4 2727//4\nf 2723//3 2724//3 2727//3\nf 2725//6 2728//6 2721//6\nf 2730//1 2729//1 2731//1\nf 2733//2 2734//2 2736//2\nf 2733//5 2729//5 2734//5\nf 2734//4 2730//4 2735//4\nf 2731//3 2732//3 2735//3\nf 2729//6 2733//6 2732//6\nf 2737//1 2740//1 2738//1\nf 2741//2 2742//2 2744//2\nf 2741//5 2737//5 2742//5\nf 2742//4 2738//4 2743//4\nf 2739//3 2740//3 2743//3\nf 2737//6 2741//6 2740//6\nf 2745//1 2748//1 2746//1\nf 2749//2 2750//2 2752//2\nf 2749//5 2745//5 2750//5\nf 2750//4 2746//4 2751//4\nf 2747//3 2748//3 2751//3\nf 2749//6 2752//6 2745//6\nf 2753//1 2756//1 2754//1\nf 2757//2 2758//2 2760//2\nf 2757//5 2753//5 2758//5\nf 2758//4 2754//4 2759//4\nf 2755//3 2756//3 2759//3\nf 2753//6 2757//6 2756//6\nf 2761//1 2764//1 2762//1\nf 2765//2 2766//2 2768//2\nf 2765//5 2761//5 2766//5\nf 2762//4 2763//4 2766//4\nf 2763//3 2764//3 2767//3\nf 2765//6 2768//6 2761//6\nf 2769//1 2772//1 2770//1\nf 2773//2 2774//2 2776//2\nf 2773//5 2769//5 2774//5\nf 2770//4 2771//4 2774//4\nf 2771//3 2772//3 2775//3\nf 2773//6 2776//6 2769//6\nf 2777//1 2780//1 2778//1\nf 2781//2 2782//2 2784//2\nf 2781//5 2777//5 2782//5\nf 2778//4 2779//4 2782//4\nf 2779//3 2780//3 2783//3\nf 2781//6 2784//6 2777//6\nf 2785//1 2788//1 2786//1\nf 2789//2 2790//2 2792//2\nf 2789//5 2785//5 2790//5\nf 2786//4 2787//4 2790//4\nf 2787//3 2788//3 2791//3\nf 2789//6 2792//6 2785//6\nf 2793//1 2796//1 2794//1\nf 2797//2 2798//2 2800//2\nf 2797//5 2793//5 2798//5\nf 2794//4 2795//4 2798//4\nf 2795//3 2796//3 2799//3\nf 2797//6 2800//6 2793//6\nf 2802//1 2801//1 2803//1\nf 2808//2 2805//2 2807//2\nf 2801//5 2802//5 2805//5\nf 2806//4 2802//4 2807//4\nf 2803//3 2804//3 2807//3\nf 2805//6 2808//6 2801//6\nf 2810//1 2809//1 2811//1\nf 2816//2 2813//2 2815//2\nf 2809//5 2810//5 2813//5\nf 2814//4 2810//4 2815//4\nf 2811//3 2812//3 2815//3\nf 2809//6 2813//6 2812//6\nf 2817//1 2820//1 2818//1\nf 2824//2 2821//2 2823//2\nf 2817//5 2818//5 2821//5\nf 2822//4 2818//4 2823//4\nf 2819//3 2820//3 2823//3\nf 2817//6 2821//6 2820//6\nf 2825//1 2828//1 2826//1\nf 2832//2 2829//2 2831//2\nf 2825//5 2826//5 2829//5\nf 2830//4 2826//4 2831//4\nf 2827//3 2828//3 2831//3\nf 2829//6 2832//6 2825//6\nf 2833//1 2836//1 2834//1\nf 2840//2 2837//2 2839//2\nf 2833//5 2834//5 2837//5\nf 2838//4 2834//4 2839//4\nf 2835//3 2836//3 2839//3\nf 2833//6 2837//6 2836//6\nf 2841//1 2844//1 2842//1\nf 2845//2 2846//2 2848//2\nf 2841//5 2842//5 2845//5\nf 2842//4 2843//4 2846//4\nf 2843//3 2844//3 2847//3\nf 2845//6 2848//6 2841//6\nf 2849//1 2852//1 2850//1\nf 2853//2 2854//2 2856//2\nf 2849//5 2850//5 2853//5\nf 2850//4 2851//4 2854//4\nf 2851//3 2852//3 2855//3\nf 2853//6 2856//6 2849//6\nf 2857//1 2860//1 2858//1\nf 2861//2 2862//2 2864//2\nf 2857//5 2858//5 2861//5\nf 2858//4 2859//4 2862//4\nf 2859//3 2860//3 2863//3\nf 2861//6 2864//6 2857//6\nf 2865//1 2868//1 2866//1\nf 2869//2 2870//2 2872//2\nf 2865//5 2866//5 2869//5\nf 2866//4 2867//4 2870//4\nf 2867//3 2868//3 2871//3\nf 2869//6 2872//6 2865//6\nf 2873//1 2876//1 2874//1\nf 2877//2 2878//2 2880//2\nf 2873//5 2874//5 2877//5\nf 2874//4 2875//4 2878//4\nf 2875//3 2876//3 2879//3\nf 2877//6 2880//6 2873//6\nf 2882//1 2881//1 2883//1\nf 2888//2 2885//2 2887//2\nf 2881//5 2882//5 2885//5\nf 2886//4 2882//4 2887//4\nf 2883//3 2884//3 2887//3\nf 2885//6 2888//6 2881//6\nf 2890//1 2889//1 2891//1\nf 2896//2 2893//2 2895//2\nf 2889//5 2890//5 2893//5\nf 2894//4 2890//4 2895//4\nf 2891//3 2892//3 2895//3\nf 2889//6 2893//6 2892//6\nf 2897//1 2900//1 2898//1\nf 2904//2 2901//2 2903//2\nf 2897//5 2898//5 2901//5\nf 2902//4 2898//4 2903//4\nf 2899//3 2900//3 2903//3\nf 2897//6 2901//6 2900//6\nf 2905//1 2908//1 2906//1\nf 2912//2 2909//2 2911//2\nf 2905//5 2906//5 2909//5\nf 2910//4 2906//4 2911//4\nf 2907//3 2908//3 2911//3\nf 2909//6 2912//6 2905//6\nf 2913//1 2916//1 2914//1\nf 2920//2 2917//2 2919//2\nf 2913//5 2914//5 2917//5\nf 2918//4 2914//4 2919//4\nf 2915//3 2916//3 2919//3\nf 2913//6 2917//6 2916//6\nf 2921//1 2924//1 2922//1\nf 2925//2 2926//2 2928//2\nf 2921//5 2922//5 2925//5\nf 2922//4 2923//4 2926//4\nf 2923//3 2924//3 2927//3\nf 2925//6 2928//6 2921//6\nf 2929//1 2932//1 2930//1\nf 2933//2 2934//2 2936//2\nf 2929//5 2930//5 2933//5\nf 2930//4 2931//4 2934//4\nf 2931//3 2932//3 2935//3\nf 2933//6 2936//6 2929//6\nf 2937//1 2940//1 2938//1\nf 2941//2 2942//2 2944//2\nf 2937//5 2938//5 2941//5\nf 2938//4 2939//4 2942//4\nf 2939//3 2940//3 2943//3\nf 2941//6 2944//6 2937//6\nf 2945//1 2948//1 2946//1\nf 2949//2 2950//2 2952//2\nf 2945//5 2946//5 2949//5\nf 2946//4 2947//4 2950//4\nf 2947//3 2948//3 2951//3\nf 2949//6 2952//6 2945//6\nf 2953//1 2956//1 2954//1\nf 2957//2 2958//2 2960//2\nf 2953//5 2954//5 2957//5\nf 2954//4 2955//4 2958//4\nf 2955//3 2956//3 2959//3\nf 2957//6 2960//6 2953//6\nf 2962//1 2961//1 2963//1\nf 2968//2 2965//2 2967//2\nf 2961//5 2962//5 2965//5\nf 2966//4 2962//4 2967//4\nf 2963//3 2964//3 2967//3\nf 2965//6 2968//6 2961//6\nf 2970//1 2969//1 2971//1\nf 2976//2 2973//2 2975//2\nf 2969//5 2970//5 2973//5\nf 2974//4 2970//4 2975//4\nf 2971//3 2972//3 2975//3\nf 2969//6 2973//6 2972//6\nf 2977//1 2980//1 2978//1\nf 2984//2 2981//2 2983//2\nf 2977//5 2978//5 2981//5\nf 2982//4 2978//4 2983//4\nf 2979//3 2980//3 2983//3\nf 2977//6 2981//6 2980//6\nf 2985//1 2988//1 2986//1\nf 2992//2 2989//2 2991//2\nf 2985//5 2986//5 2989//5\nf 2990//4 2986//4 2991//4\nf 2987//3 2988//3 2991//3\nf 2989//6 2992//6 2985//6\nf 2993//1 2996//1 2994//1\nf 3000//2 2997//2 2999//2\nf 2993//5 2994//5 2997//5\nf 2998//4 2994//4 2999//4\nf 2995//3 2996//3 2999//3\nf 2993//6 2997//6 2996//6\nf 3001//1 3004//1 3002//1\nf 3005//2 3006//2 3008//2\nf 3001//5 3002//5 3005//5\nf 3002//4 3003//4 3006//4\nf 3003//3 3004//3 3007//3\nf 3005//6 3008//6 3001//6\nf 3009//1 3012//1 3010//1\nf 3013//2 3014//2 3016//2\nf 3009//5 3010//5 3013//5\nf 3010//4 3011//4 3014//4\nf 3011//3 3012//3 3015//3\nf 3013//6 3016//6 3009//6\nf 3017//1 3020//1 3018//1\nf 3021//2 3022//2 3024//2\nf 3017//5 3018//5 3021//5\nf 3018//4 3019//4 3022//4\nf 3019//3 3020//3 3023//3\nf 3021//6 3024//6 3017//6\nf 3025//1 3028//1 3026//1\nf 3029//2 3030//2 3032//2\nf 3025//5 3026//5 3029//5\nf 3026//4 3027//4 3030//4\nf 3027//3 3028//3 3031//3\nf 3029//6 3032//6 3025//6\nf 3033//1 3036//1 3034//1\nf 3037//2 3038//2 3040//2\nf 3033//5 3034//5 3037//5\nf 3034//4 3035//4 3038//4\nf 3035//3 3036//3 3039//3\nf 3037//6 3040//6 3033//6\nf 3042//1 3041//1 3043//1\nf 3048//2 3045//2 3047//2\nf 3041//5 3042//5 3045//5\nf 3046//4 3042//4 3047//4\nf 3043//3 3044//3 3047//3\nf 3045//6 3048//6 3041//6\nf 3050//1 3049//1 3051//1\nf 3056//2 3053//2 3055//2\nf 3049//5 3050//5 3053//5\nf 3054//4 3050//4 3055//4\nf 3051//3 3052//3 3055//3\nf 3049//6 3053//6 3052//6\nf 3057//1 3060//1 3058//1\nf 3064//2 3061//2 3063//2\nf 3057//5 3058//5 3061//5\nf 3062//4 3058//4 3063//4\nf 3059//3 3060//3 3063//3\nf 3057//6 3061//6 3060//6\nf 3065//1 3068//1 3066//1\nf 3072//2 3069//2 3071//2\nf 3065//5 3066//5 3069//5\nf 3070//4 3066//4 3071//4\nf 3067//3 3068//3 3071//3\nf 3069//6 3072//6 3065//6\nf 3073//1 3076//1 3074//1\nf 3080//2 3077//2 3079//2\nf 3073//5 3074//5 3077//5\nf 3078//4 3074//4 3079//4\nf 3075//3 3076//3 3079//3\nf 3073//6 3077//6 3076//6\nf 3081//1 3084//1 3082//1\nf 3085//2 3086//2 3088//2\nf 3081//5 3082//5 3085//5\nf 3082//4 3083//4 3086//4\nf 3083//3 3084//3 3087//3\nf 3085//6 3088//6 3081//6\nf 3089//1 3092//1 3090//1\nf 3093//2 3094//2 3096//2\nf 3089//5 3090//5 3093//5\nf 3090//4 3091//4 3094//4\nf 3091//3 3092//3 3095//3\nf 3093//6 3096//6 3089//6\nf 3097//1 3100//1 3098//1\nf 3101//2 3102//2 3104//2\nf 3097//5 3098//5 3101//5\nf 3098//4 3099//4 3102//4\nf 3099//3 3100//3 3103//3\nf 3101//6 3104//6 3097//6\nf 3105//1 3108//1 3106//1\nf 3109//2 3110//2 3112//2\nf 3105//5 3106//5 3109//5\nf 3106//4 3107//4 3110//4\nf 3107//3 3108//3 3111//3\nf 3109//6 3112//6 3105//6\nf 3113//1 3116//1 3114//1\nf 3117//2 3118//2 3120//2\nf 3113//5 3114//5 3117//5\nf 3114//4 3115//4 3118//4\nf 3115//3 3116//3 3119//3\nf 3117//6 3120//6 3113//6\nf 3122//1 3121//1 3123//1\nf 3128//2 3125//2 3127//2\nf 3121//5 3122//5 3125//5\nf 3126//4 3122//4 3127//4\nf 3123//3 3124//3 3127//3\nf 3125//6 3128//6 3121//6\nf 3130//1 3129//1 3131//1\nf 3136//2 3133//2 3135//2\nf 3129//5 3130//5 3133//5\nf 3134//4 3130//4 3135//4\nf 3131//3 3132//3 3135//3\nf 3129//6 3133//6 3132//6\nf 3137//1 3140//1 3138//1\nf 3144//2 3141//2 3143//2\nf 3137//5 3138//5 3141//5\nf 3142//4 3138//4 3143//4\nf 3139//3 3140//3 3143//3\nf 3137//6 3141//6 3140//6\nf 3145//1 3148//1 3146//1\nf 3152//2 3149//2 3151//2\nf 3145//5 3146//5 3149//5\nf 3150//4 3146//4 3151//4\nf 3147//3 3148//3 3151//3\nf 3149//6 3152//6 3145//6\nf 3153//1 3156//1 3154//1\nf 3160//2 3157//2 3159//2\nf 3153//5 3154//5 3157//5\nf 3158//4 3154//4 3159//4\nf 3155//3 3156//3 3159//3\nf 3153//6 3157//6 3156//6\nf 3161//1 3164//1 3162//1\nf 3165//2 3166//2 3168//2\nf 3161//5 3162//5 3165//5\nf 3162//4 3163//4 3166//4\nf 3163//3 3164//3 3167//3\nf 3165//6 3168//6 3161//6\nf 3169//1 3172//1 3170//1\nf 3173//2 3174//2 3176//2\nf 3169//5 3170//5 3173//5\nf 3170//4 3171//4 3174//4\nf 3171//3 3172//3 3175//3\nf 3173//6 3176//6 3169//6\nf 3177//1 3180//1 3178//1\nf 3181//2 3182//2 3184//2\nf 3177//5 3178//5 3181//5\nf 3178//4 3179//4 3182//4\nf 3179//3 3180//3 3183//3\nf 3181//6 3184//6 3177//6\nf 3185//1 3188//1 3186//1\nf 3189//2 3190//2 3192//2\nf 3185//5 3186//5 3189//5\nf 3186//4 3187//4 3190//4\nf 3187//3 3188//3 3191//3\nf 3189//6 3192//6 3185//6\nf 3193//1 3196//1 3194//1\nf 3197//2 3198//2 3200//2\nf 3193//5 3194//5 3197//5\nf 3194//4 3195//4 3198//4\nf 3195//3 3196//3 3199//3\nf 3197//6 3200//6 3193//6\nf 3201//1 3202//1 3204//1\nf 3205//2 3208//2 3206//2\nf 3202//3 3201//3 3206//3\nf 3203//4 3202//4 3207//4\nf 3203//5 3207//5 3204//5\nf 3205//6 3201//6 3208//6\nf 3209//1 3210//1 3212//1\nf 3214//2 3213//2 3215//2\nf 3210//3 3209//3 3214//3\nf 3211//4 3210//4 3215//4\nf 3211//5 3215//5 3212//5\nf 3213//6 3209//6 3216//6\nf 3217//1 3218//1 3220//1\nf 3221//2 3224//2 3222//2\nf 3218//3 3217//3 3222//3\nf 3219//4 3218//4 3223//4\nf 3219//5 3223//5 3220//5\nf 3224//6 3221//6 3220//6\nf 3225//1 3226//1 3228//1\nf 3229//2 3232//2 3230//2\nf 3226//3 3225//3 3230//3\nf 3227//4 3226//4 3231//4\nf 3227//5 3231//5 3228//5\nf 3229//6 3225//6 3232//6\nf 3233//1 3234//1 3236//1\nf 3238//2 3237//2 3239//2\nf 3234//3 3233//3 3238//3\nf 3235//4 3234//4 3239//4\nf 3235//5 3239//5 3236//5\nf 3240//6 3237//6 3236//6\nf 3241//1 3242//1 3244//1\nf 3245//2 3248//2 3246//2\nf 3242//3 3241//3 3246//3\nf 3242//4 3246//4 3243//4\nf 3243//5 3247//5 3244//5\nf 3245//6 3241//6 3248//6\nf 3249//1 3250//1 3252//1\nf 3253//2 3256//2 3254//2\nf 3250//3 3249//3 3254//3\nf 3250//4 3254//4 3251//4\nf 3251//5 3255//5 3252//5\nf 3253//6 3249//6 3256//6\nf 3257//1 3258//1 3260//1\nf 3261//2 3264//2 3262//2\nf 3258//3 3257//3 3262//3\nf 3258//4 3262//4 3259//4\nf 3259//5 3263//5 3260//5\nf 3261//6 3257//6 3264//6\nf 3265//1 3266//1 3268//1\nf 3269//2 3272//2 3270//2\nf 3266//3 3265//3 3270//3\nf 3266//4 3270//4 3267//4\nf 3267//5 3271//5 3268//5\nf 3269//6 3265//6 3272//6\nf 3273//1 3274//1 3276//1\nf 3277//2 3280//2 3278//2\nf 3274//3 3273//3 3278//3\nf 3274//4 3278//4 3275//4\nf 3275//5 3279//5 3276//5\nf 3277//6 3273//6 3280//6\nf 3281//1 3282//1 3284//1\nf 3285//2 3288//2 3286//2\nf 3281//3 3285//3 3282//3\nf 3283//4 3282//4 3287//4\nf 3283//5 3287//5 3284//5\nf 3285//6 3281//6 3288//6\nf 3289//1 3290//1 3292//1\nf 3294//2 3293//2 3295//2\nf 3290//3 3289//3 3294//3\nf 3291//4 3290//4 3295//4\nf 3291//5 3295//5 3292//5\nf 3293//6 3289//6 3296//6\nf 3297//1 3298//1 3300//1\nf 3301//2 3304//2 3302//2\nf 3298//3 3297//3 3302//3\nf 3299//4 3298//4 3303//4\nf 3299//5 3303//5 3300//5\nf 3304//6 3301//6 3300//6\nf 3305//1 3306//1 3308//1\nf 3309//2 3312//2 3310//2\nf 3306//3 3305//3 3310//3\nf 3307//4 3306//4 3311//4\nf 3307//5 3311//5 3308//5\nf 3309//6 3305//6 3312//6\nf 3313//1 3314//1 3316//1\nf 3318//2 3317//2 3319//2\nf 3314//3 3313//3 3318//3\nf 3315//4 3314//4 3319//4\nf 3315//5 3319//5 3316//5\nf 3320//6 3317//6 3316//6\nf 3321//1 3322//1 3324//1\nf 3325//2 3328//2 3326//2\nf 3322//3 3321//3 3326//3\nf 3322//4 3326//4 3323//4\nf 3323//5 3327//5 3324//5\nf 3325//6 3321//6 3328//6\nf 3329//1 3330//1 3332//1\nf 3333//2 3336//2 3334//2\nf 3330//3 3329//3 3334//3\nf 3330//4 3334//4 3331//4\nf 3331//5 3335//5 3332//5\nf 3333//6 3329//6 3336//6\nf 3337//1 3338//1 3340//1\nf 3341//2 3344//2 3342//2\nf 3338//3 3337//3 3342//3\nf 3338//4 3342//4 3339//4\nf 3339//5 3343//5 3340//5\nf 3341//6 3337//6 3344//6\nf 3345//1 3346//1 3348//1\nf 3349//2 3352//2 3350//2\nf 3346//3 3345//3 3350//3\nf 3346//4 3350//4 3347//4\nf 3347//5 3351//5 3348//5\nf 3349//6 3345//6 3352//6\nf 3353//1 3354//1 3356//1\nf 3357//2 3360//2 3358//2\nf 3354//3 3353//3 3358//3\nf 3354//4 3358//4 3355//4\nf 3355//5 3359//5 3356//5\nf 3357//6 3353//6 3360//6\nf 3361//1 3362//1 3364//1\nf 3366//2 3365//2 3367//2\nf 3361//3 3365//3 3362//3\nf 3363//4 3362//4 3367//4\nf 3363//5 3367//5 3364//5\nf 3365//6 3361//6 3368//6\nf 3369//1 3370//1 3372//1\nf 3374//2 3373//2 3375//2\nf 3370//3 3369//3 3374//3\nf 3371//4 3370//4 3375//4\nf 3371//5 3375//5 3372//5\nf 3373//6 3369//6 3376//6\nf 3377//1 3378//1 3380//1\nf 3382//2 3381//2 3383//2\nf 3378//3 3377//3 3382//3\nf 3379//4 3378//4 3383//4\nf 3379//5 3383//5 3380//5\nf 3384//6 3381//6 3380//6\nf 3385//1 3386//1 3388//1\nf 3390//2 3389//2 3391//2\nf 3386//3 3385//3 3390//3\nf 3387//4 3386//4 3391//4\nf 3387//5 3391//5 3388//5\nf 3389//6 3385//6 3392//6\nf 3393//1 3394//1 3396//1\nf 3398//2 3397//2 3399//2\nf 3393//3 3397//3 3394//3\nf 3395//4 3394//4 3399//4\nf 3395//5 3399//5 3396//5\nf 3400//6 3397//6 3396//6\nf 3401//1 3402//1 3404//1\nf 3405//2 3408//2 3406//2\nf 3402//3 3401//3 3406//3\nf 3402//4 3406//4 3403//4\nf 3403//5 3407//5 3404//5\nf 3405//6 3401//6 3408//6\nf 3409//1 3410//1 3412//1\nf 3413//2 3416//2 3414//2\nf 3410//3 3409//3 3414//3\nf 3410//4 3414//4 3411//4\nf 3411//5 3415//5 3412//5\nf 3413//6 3409//6 3416//6\nf 3417//1 3418//1 3420//1\nf 3421//2 3424//2 3422//2\nf 3418//3 3417//3 3422//3\nf 3418//4 3422//4 3419//4\nf 3419//5 3423//5 3420//5\nf 3421//6 3417//6 3424//6\nf 3425//1 3426//1 3428//1\nf 3429//2 3432//2 3430//2\nf 3426//3 3425//3 3430//3\nf 3426//4 3430//4 3427//4\nf 3427//5 3431//5 3428//5\nf 3429//6 3425//6 3432//6\nf 3433//1 3434//1 3436//1\nf 3437//2 3440//2 3438//2\nf 3434//3 3433//3 3438//3\nf 3434//4 3438//4 3435//4\nf 3435//5 3439//5 3436//5\nf 3437//6 3433//6 3440//6\nf 3444//1 3441//1 3443//1\nf 3445//2 3448//2 3446//2\nf 3442//3 3441//3 3446//3\nf 3443//4 3442//4 3447//4\nf 3443//5 3447//5 3444//5\nf 3445//6 3441//6 3448//6\nf 3452//1 3449//1 3451//1\nf 3453//2 3456//2 3454//2\nf 3450//3 3449//3 3454//3\nf 3451//4 3450//4 3455//4\nf 3451//5 3455//5 3452//5\nf 3453//6 3449//6 3456//6\nf 3457//1 3458//1 3460//1\nf 3461//2 3464//2 3462//2\nf 3458//3 3457//3 3462//3\nf 3459//4 3458//4 3463//4\nf 3459//5 3463//5 3460//5\nf 3464//6 3461//6 3460//6\nf 3465//1 3466//1 3468//1\nf 3469//2 3472//2 3470//2\nf 3466//3 3465//3 3470//3\nf 3467//4 3466//4 3471//4\nf 3467//5 3471//5 3468//5\nf 3469//6 3465//6 3472//6\nf 3473//1 3474//1 3476//1\nf 3477//2 3480//2 3478//2\nf 3474//3 3473//3 3478//3\nf 3475//4 3474//4 3479//4\nf 3475//5 3479//5 3476//5\nf 3480//6 3477//6 3476//6\nf 3481//1 3482//1 3484//1\nf 3485//2 3488//2 3486//2\nf 3482//3 3481//3 3486//3\nf 3482//4 3486//4 3483//4\nf 3483//5 3487//5 3484//5\nf 3485//6 3481//6 3488//6\nf 3489//1 3490//1 3492//1\nf 3493//2 3496//2 3494//2\nf 3490//3 3489//3 3494//3\nf 3490//4 3494//4 3491//4\nf 3491//5 3495//5 3492//5\nf 3493//6 3489//6 3496//6\nf 3497//1 3498//1 3500//1\nf 3501//2 3504//2 3502//2\nf 3498//3 3497//3 3502//3\nf 3498//4 3502//4 3499//4\nf 3499//5 3503//5 3500//5\nf 3501//6 3497//6 3504//6\nf 3505//1 3506//1 3508//1\nf 3509//2 3512//2 3510//2\nf 3506//3 3505//3 3510//3\nf 3506//4 3510//4 3507//4\nf 3507//5 3511//5 3508//5\nf 3509//6 3505//6 3512//6\nf 3513//1 3514//1 3516//1\nf 3517//2 3520//2 3518//2\nf 3514//3 3513//3 3518//3\nf 3514//4 3518//4 3515//4\nf 3515//5 3519//5 3516//5\nf 3517//6 3513//6 3520//6\nf 3524//1 3521//1 3523//1\nf 3525//2 3528//2 3526//2\nf 3522//3 3521//3 3526//3\nf 3523//4 3522//4 3527//4\nf 3523//5 3527//5 3524//5\nf 3525//6 3521//6 3528//6\nf 3532//1 3529//1 3531//1\nf 3533//2 3536//2 3534//2\nf 3530//3 3529//3 3534//3\nf 3531//4 3530//4 3535//4\nf 3531//5 3535//5 3532//5\nf 3533//6 3529//6 3536//6\nf 3537//1 3538//1 3540//1\nf 3541//2 3544//2 3542//2\nf 3538//3 3537//3 3542//3\nf 3539//4 3538//4 3543//4\nf 3539//5 3543//5 3540//5\nf 3544//6 3541//6 3540//6\nf 3545//1 3546//1 3548//1\nf 3549//2 3552//2 3550//2\nf 3546//3 3545//3 3550//3\nf 3547//4 3546//4 3551//4\nf 3547//5 3551//5 3548//5\nf 3549//6 3545//6 3552//6\nf 3553//1 3554//1 3556//1\nf 3557//2 3560//2 3558//2\nf 3554//3 3553//3 3558//3\nf 3555//4 3554//4 3559//4\nf 3555//5 3559//5 3556//5\nf 3560//6 3557//6 3556//6\nf 3561//1 3562//1 3564//1\nf 3565//2 3568//2 3566//2\nf 3562//3 3561//3 3566//3\nf 3562//4 3566//4 3563//4\nf 3563//5 3567//5 3564//5\nf 3565//6 3561//6 3568//6\nf 3569//1 3570//1 3572//1\nf 3573//2 3576//2 3574//2\nf 3570//3 3569//3 3574//3\nf 3570//4 3574//4 3571//4\nf 3571//5 3575//5 3572//5\nf 3573//6 3569//6 3576//6\nf 3577//1 3578//1 3580//1\nf 3581//2 3584//2 3582//2\nf 3578//3 3577//3 3582//3\nf 3578//4 3582//4 3579//4\nf 3579//5 3583//5 3580//5\nf 3581//6 3577//6 3584//6\nf 3585//1 3586//1 3588//1\nf 3589//2 3592//2 3590//2\nf 3586//3 3585//3 3590//3\nf 3586//4 3590//4 3587//4\nf 3587//5 3591//5 3588//5\nf 3589//6 3585//6 3592//6\nf 3593//1 3594//1 3596//1\nf 3597//2 3600//2 3598//2\nf 3594//3 3593//3 3598//3\nf 3594//4 3598//4 3595//4\nf 3595//5 3599//5 3596//5\nf 3597//6 3593//6 3600//6\nf 3604//1 3601//1 3603//1\nf 3606//2 3605//2 3607//2\nf 3601//3 3605//3 3602//3\nf 3603//4 3602//4 3607//4\nf 3603//5 3607//5 3604//5\nf 3605//6 3601//6 3608//6\nf 3612//1 3609//1 3611//1\nf 3614//2 3613//2 3615//2\nf 3609//3 3613//3 3610//3\nf 3611//4 3610//4 3615//4\nf 3611//5 3615//5 3612//5\nf 3613//6 3609//6 3616//6\nf 3617//1 3618//1 3620//1\nf 3622//2 3621//2 3623//2\nf 3617//3 3621//3 3618//3\nf 3619//4 3618//4 3623//4\nf 3619//5 3623//5 3620//5\nf 3624//6 3621//6 3620//6\nf 3625//1 3626//1 3628//1\nf 3630//2 3629//2 3631//2\nf 3625//3 3629//3 3626//3\nf 3627//4 3626//4 3631//4\nf 3627//5 3631//5 3628//5\nf 3629//6 3625//6 3632//6\nf 3633//1 3634//1 3636//1\nf 3638//2 3637//2 3639//2\nf 3633//3 3637//3 3634//3\nf 3635//4 3634//4 3639//4\nf 3635//5 3639//5 3636//5\nf 3640//6 3637//6 3636//6\nf 3641//1 3642//1 3644//1\nf 3645//2 3648//2 3646//2\nf 3641//3 3645//3 3642//3\nf 3642//4 3646//4 3643//4\nf 3643//5 3647//5 3644//5\nf 3645//6 3641//6 3648//6\nf 3649//1 3650//1 3652//1\nf 3653//2 3656//2 3654//2\nf 3649//3 3653//3 3650//3\nf 3650//4 3654//4 3651//4\nf 3651//5 3655//5 3652//5\nf 3653//6 3649//6 3656//6\nf 3657//1 3658//1 3660//1\nf 3661//2 3664//2 3662//2\nf 3657//3 3661//3 3658//3\nf 3658//4 3662//4 3659//4\nf 3659//5 3663//5 3660//5\nf 3661//6 3657//6 3664//6\nf 3665//1 3666//1 3668//1\nf 3669//2 3672//2 3670//2\nf 3665//3 3669//3 3666//3\nf 3666//4 3670//4 3667//4\nf 3667//5 3671//5 3668//5\nf 3669//6 3665//6 3672//6\nf 3673//1 3674//1 3676//1\nf 3677//2 3680//2 3678//2\nf 3673//3 3677//3 3674//3\nf 3674//4 3678//4 3675//4\nf 3675//5 3679//5 3676//5\nf 3677//6 3673//6 3680//6\nf 3684//1 3681//1 3683//1\nf 3686//2 3685//2 3687//2\nf 3681//3 3685//3 3682//3\nf 3683//4 3682//4 3687//4\nf 3683//5 3687//5 3684//5\nf 3685//6 3681//6 3688//6\nf 3692//1 3689//1 3691//1\nf 3694//2 3693//2 3695//2\nf 3689//3 3693//3 3690//3\nf 3691//4 3690//4 3695//4\nf 3691//5 3695//5 3692//5\nf 3693//6 3689//6 3696//6\nf 3697//1 3698//1 3700//1\nf 3702//2 3701//2 3703//2\nf 3697//3 3701//3 3698//3\nf 3699//4 3698//4 3703//4\nf 3699//5 3703//5 3700//5\nf 3704//6 3701//6 3700//6\nf 3705//1 3706//1 3708//1\nf 3710//2 3709//2 3711//2\nf 3705//3 3709//3 3706//3\nf 3707//4 3706//4 3711//4\nf 3707//5 3711//5 3708//5\nf 3709//6 3705//6 3712//6\nf 3713//1 3714//1 3716//1\nf 3718//2 3717//2 3719//2\nf 3713//3 3717//3 3714//3\nf 3715//4 3714//4 3719//4\nf 3715//5 3719//5 3716//5\nf 3720//6 3717//6 3716//6\nf 3721//1 3722//1 3724//1\nf 3725//2 3728//2 3726//2\nf 3721//3 3725//3 3722//3\nf 3722//4 3726//4 3723//4\nf 3723//5 3727//5 3724//5\nf 3725//6 3721//6 3728//6\nf 3729//1 3730//1 3732//1\nf 3733//2 3736//2 3734//2\nf 3729//3 3733//3 3730//3\nf 3730//4 3734//4 3731//4\nf 3731//5 3735//5 3732//5\nf 3733//6 3729//6 3736//6\nf 3737//1 3738//1 3740//1\nf 3741//2 3744//2 3742//2\nf 3737//3 3741//3 3738//3\nf 3738//4 3742//4 3739//4\nf 3739//5 3743//5 3740//5\nf 3741//6 3737//6 3744//6\nf 3745//1 3746//1 3748//1\nf 3749//2 3752//2 3750//2\nf 3745//3 3749//3 3746//3\nf 3746//4 3750//4 3747//4\nf 3747//5 3751//5 3748//5\nf 3749//6 3745//6 3752//6\nf 3753//1 3754//1 3756//1\nf 3757//2 3760//2 3758//2\nf 3753//3 3757//3 3754//3\nf 3754//4 3758//4 3755//4\nf 3755//5 3759//5 3756//5\nf 3757//6 3753//6 3760//6\nf 3764//1 3761//1 3763//1\nf 3766//2 3765//2 3767//2\nf 3761//3 3765//3 3762//3\nf 3763//4 3762//4 3767//4\nf 3763//5 3767//5 3764//5\nf 3765//6 3761//6 3768//6\nf 3772//1 3769//1 3771//1\nf 3774//2 3773//2 3775//2\nf 3769//3 3773//3 3770//3\nf 3771//4 3770//4 3775//4\nf 3771//5 3775//5 3772//5\nf 3773//6 3769//6 3776//6\nf 3777//1 3778//1 3780//1\nf 3782//2 3781//2 3783//2\nf 3777//3 3781//3 3778//3\nf 3779//4 3778//4 3783//4\nf 3779//5 3783//5 3780//5\nf 3784//6 3781//6 3780//6\nf 3785//1 3786//1 3788//1\nf 3790//2 3789//2 3791//2\nf 3785//3 3789//3 3786//3\nf 3787//4 3786//4 3791//4\nf 3787//5 3791//5 3788//5\nf 3789//6 3785//6 3792//6\nf 3793//1 3794//1 3796//1\nf 3798//2 3797//2 3799//2\nf 3793//3 3797//3 3794//3\nf 3795//4 3794//4 3799//4\nf 3795//5 3799//5 3796//5\nf 3800//6 3797//6 3796//6\nf 3801//1 3802//1 3804//1\nf 3805//2 3808//2 3806//2\nf 3801//3 3805//3 3802//3\nf 3802//4 3806//4 3803//4\nf 3803//5 3807//5 3804//5\nf 3805//6 3801//6 3808//6\nf 3809//1 3810//1 3812//1\nf 3813//2 3816//2 3814//2\nf 3809//3 3813//3 3810//3\nf 3810//4 3814//4 3811//4\nf 3811//5 3815//5 3812//5\nf 3813//6 3809//6 3816//6\nf 3817//1 3818//1 3820//1\nf 3821//2 3824//2 3822//2\nf 3817//3 3821//3 3818//3\nf 3818//4 3822//4 3819//4\nf 3819//5 3823//5 3820//5\nf 3821//6 3817//6 3824//6\nf 3825//1 3826//1 3828//1\nf 3829//2 3832//2 3830//2\nf 3825//3 3829//3 3826//3\nf 3826//4 3830//4 3827//4\nf 3827//5 3831//5 3828//5\nf 3829//6 3825//6 3832//6\nf 3833//1 3834//1 3836//1\nf 3837//2 3840//2 3838//2\nf 3833//3 3837//3 3834//3\nf 3834//4 3838//4 3835//4\nf 3835//5 3839//5 3836//5\nf 3837//6 3833//6 3840//6\nf 3844//1 3841//1 3843//1\nf 3846//2 3845//2 3847//2\nf 3841//3 3845//3 3842//3\nf 3843//4 3842//4 3847//4\nf 3843//5 3847//5 3844//5\nf 3845//6 3841//6 3848//6\nf 3852//1 3849//1 3851//1\nf 3854//2 3853//2 3855//2\nf 3849//3 3853//3 3850//3\nf 3851//4 3850//4 3855//4\nf 3851//5 3855//5 3852//5\nf 3853//6 3849//6 3856//6\nf 3857//1 3858//1 3860//1\nf 3862//2 3861//2 3863//2\nf 3857//3 3861//3 3858//3\nf 3859//4 3858//4 3863//4\nf 3859//5 3863//5 3860//5\nf 3864//6 3861//6 3860//6\nf 3865//1 3866//1 3868//1\nf 3870//2 3869//2 3871//2\nf 3865//3 3869//3 3866//3\nf 3867//4 3866//4 3871//4\nf 3867//5 3871//5 3868//5\nf 3869//6 3865//6 3872//6\nf 3873//1 3874//1 3876//1\nf 3878//2 3877//2 3879//2\nf 3873//3 3877//3 3874//3\nf 3875//4 3874//4 3879//4\nf 3875//5 3879//5 3876//5\nf 3880//6 3877//6 3876//6\nf 3881//1 3882//1 3884//1\nf 3885//2 3888//2 3886//2\nf 3881//3 3885//3 3882//3\nf 3882//4 3886//4 3883//4\nf 3883//5 3887//5 3884//5\nf 3885//6 3881//6 3888//6\nf 3889//1 3890//1 3892//1\nf 3893//2 3896//2 3894//2\nf 3889//3 3893//3 3890//3\nf 3890//4 3894//4 3891//4\nf 3891//5 3895//5 3892//5\nf 3893//6 3889//6 3896//6\nf 3897//1 3898//1 3900//1\nf 3901//2 3904//2 3902//2\nf 3897//3 3901//3 3898//3\nf 3898//4 3902//4 3899//4\nf 3899//5 3903//5 3900//5\nf 3901//6 3897//6 3904//6\nf 3905//1 3906//1 3908//1\nf 3909//2 3912//2 3910//2\nf 3905//3 3909//3 3906//3\nf 3906//4 3910//4 3907//4\nf 3907//5 3911//5 3908//5\nf 3909//6 3905//6 3912//6\nf 3913//1 3914//1 3916//1\nf 3917//2 3920//2 3918//2\nf 3913//3 3917//3 3914//3\nf 3914//4 3918//4 3915//4\nf 3915//5 3919//5 3916//5\nf 3917//6 3913//6 3920//6\nf 3924//1 3921//1 3923//1\nf 3926//2 3925//2 3927//2\nf 3921//3 3925//3 3922//3\nf 3923//4 3922//4 3927//4\nf 3923//5 3927//5 3924//5\nf 3925//6 3921//6 3928//6\nf 3932//1 3929//1 3931//1\nf 3934//2 3933//2 3935//2\nf 3929//3 3933//3 3930//3\nf 3931//4 3930//4 3935//4\nf 3931//5 3935//5 3932//5\nf 3933//6 3929//6 3936//6\nf 3937//1 3938//1 3940//1\nf 3942//2 3941//2 3943//2\nf 3937//3 3941//3 3938//3\nf 3939//4 3938//4 3943//4\nf 3939//5 3943//5 3940//5\nf 3944//6 3941//6 3940//6\nf 3945//1 3946//1 3948//1\nf 3950//2 3949//2 3951//2\nf 3945//3 3949//3 3946//3\nf 3947//4 3946//4 3951//4\nf 3947//5 3951//5 3948//5\nf 3949//6 3945//6 3952//6\nf 3953//1 3954//1 3956//1\nf 3958//2 3957//2 3959//2\nf 3953//3 3957//3 3954//3\nf 3955//4 3954//4 3959//4\nf 3955//5 3959//5 3956//5\nf 3960//6 3957//6 3956//6\nf 3961//1 3962//1 3964//1\nf 3965//2 3968//2 3966//2\nf 3961//3 3965//3 3962//3\nf 3962//4 3966//4 3963//4\nf 3963//5 3967//5 3964//5\nf 3965//6 3961//6 3968//6\nf 3969//1 3970//1 3972//1\nf 3973//2 3976//2 3974//2\nf 3969//3 3973//3 3970//3\nf 3970//4 3974//4 3971//4\nf 3971//5 3975//5 3972//5\nf 3973//6 3969//6 3976//6\nf 3977//1 3978//1 3980//1\nf 3981//2 3984//2 3982//2\nf 3977//3 3981//3 3978//3\nf 3978//4 3982//4 3979//4\nf 3979//5 3983//5 3980//5\nf 3981//6 3977//6 3984//6\nf 3985//1 3986//1 3988//1\nf 3989//2 3992//2 3990//2\nf 3985//3 3989//3 3986//3\nf 3986//4 3990//4 3987//4\nf 3987//5 3991//5 3988//5\nf 3989//6 3985//6 3992//6\nf 3993//1 3994//1 3996//1\nf 3997//2 4000//2 3998//2\nf 3993//3 3997//3 3994//3\nf 3994//4 3998//4 3995//4\nf 3995//5 3999//5 3996//5\nf 3997//6 3993//6 4000//6\nf 4001//1 4004//1 4002//1\nf 4008//2 4005//2 4007//2\nf 4005//5 4001//5 4006//5\nf 4006//4 4002//4 4007//4\nf 4003//3 4004//3 4007//3\nf 4005//6 4008//6 4001//6\nf 4009//1 4012//1 4010//1\nf 4016//2 4013//2 4015//2\nf 4013//5 4009//5 4014//5\nf 4014//4 4010//4 4015//4\nf 4011//3 4012//3 4015//3\nf 4009//6 4013//6 4012//6\nf 4017//1 4020//1 4018//1\nf 4024//2 4021//2 4023//2\nf 4021//5 4017//5 4022//5\nf 4022//4 4018//4 4023//4\nf 4019//3 4020//3 4023//3\nf 4017//6 4021//6 4020//6\nf 4025//1 4028//1 4026//1\nf 4029//2 4030//2 4032//2\nf 4029//5 4025//5 4030//5\nf 4030//4 4026//4 4031//4\nf 4027//3 4028//3 4031//3\nf 4029//6 4032//6 4025//6\nf 4033//1 4036//1 4034//1\nf 4040//2 4037//2 4039//2\nf 4037//5 4033//5 4038//5\nf 4038//4 4034//4 4039//4\nf 4035//3 4036//3 4039//3\nf 4033//6 4037//6 4036//6\nf 4041//1 4044//1 4042//1\nf 4045//2 4046//2 4048//2\nf 4045//5 4041//5 4046//5\nf 4042//4 4043//4 4046//4\nf 4043//3 4044//3 4047//3\nf 4045//6 4048//6 4041//6\nf 4049//1 4052//1 4050//1\nf 4053//2 4054//2 4056//2\nf 4053//5 4049//5 4054//5\nf 4050//4 4051//4 4054//4\nf 4051//3 4052//3 4055//3\nf 4053//6 4056//6 4049//6\nf 4057//1 4060//1 4058//1\nf 4061//2 4062//2 4064//2\nf 4061//5 4057//5 4062//5\nf 4058//4 4059//4 4062//4\nf 4059//3 4060//3 4063//3\nf 4061//6 4064//6 4057//6\nf 4065//1 4068//1 4066//1\nf 4069//2 4070//2 4072//2\nf 4069//5 4065//5 4070//5\nf 4066//4 4067//4 4070//4\nf 4067//3 4068//3 4071//3\nf 4069//6 4072//6 4065//6\nf 4073//1 4076//1 4074//1\nf 4077//2 4078//2 4080//2\nf 4077//5 4073//5 4078//5\nf 4074//4 4075//4 4078//4\nf 4075//3 4076//3 4079//3\nf 4077//6 4080//6 4073//6\nf 4081//1 4084//1 4082//1\nf 4088//2 4085//2 4087//2\nf 4081//5 4082//5 4085//5\nf 4086//4 4082//4 4087//4\nf 4083//3 4084//3 4087//3\nf 4085//6 4088//6 4081//6\nf 4089//1 4092//1 4090//1\nf 4096//2 4093//2 4095//2\nf 4089//5 4090//5 4093//5\nf 4094//4 4090//4 4095//4\nf 4091//3 4092//3 4095//3\nf 4089//6 4093//6 4092//6\nf 4097//1 4100//1 4098//1\nf 4104//2 4101//2 4103//2\nf 4101//5 4097//5 4102//5\nf 4102//4 4098//4 4103//4\nf 4099//3 4100//3 4103//3\nf 4097//6 4101//6 4100//6\nf 4105//1 4108//1 4106//1\nf 4109//2 4110//2 4112//2\nf 4109//5 4105//5 4110//5\nf 4110//4 4106//4 4111//4\nf 4107//3 4108//3 4111//3\nf 4109//6 4112//6 4105//6\nf 4113//1 4116//1 4114//1\nf 4117//2 4118//2 4120//2\nf 4117//5 4113//5 4118//5\nf 4118//4 4114//4 4119//4\nf 4115//3 4116//3 4119//3\nf 4113//6 4117//6 4116//6\nf 4121//1 4124//1 4122//1\nf 4125//2 4126//2 4128//2\nf 4125//5 4121//5 4126//5\nf 4122//4 4123//4 4126//4\nf 4123//3 4124//3 4127//3\nf 4125//6 4128//6 4121//6\nf 4129//1 4132//1 4130//1\nf 4133//2 4134//2 4136//2\nf 4133//5 4129//5 4134//5\nf 4130//4 4131//4 4134//4\nf 4131//3 4132//3 4135//3\nf 4133//6 4136//6 4129//6\nf 4137//1 4140//1 4138//1\nf 4141//2 4142//2 4144//2\nf 4141//5 4137//5 4142//5\nf 4138//4 4139//4 4142//4\nf 4139//3 4140//3 4143//3\nf 4141//6 4144//6 4137//6\nf 4145//1 4148//1 4146//1\nf 4149//2 4150//2 4152//2\nf 4149//5 4145//5 4150//5\nf 4146//4 4147//4 4150//4\nf 4147//3 4148//3 4151//3\nf 4149//6 4152//6 4145//6\nf 4153//1 4156//1 4154//1\nf 4157//2 4158//2 4160//2\nf 4157//5 4153//5 4158//5\nf 4154//4 4155//4 4158//4\nf 4155//3 4156//3 4159//3\nf 4157//6 4160//6 4153//6\nf 4162//1 4161//1 4163//1\nf 4168//2 4165//2 4167//2\nf 4161//5 4162//5 4165//5\nf 4166//4 4162//4 4167//4\nf 4163//3 4164//3 4167//3\nf 4165//6 4168//6 4161//6\nf 4169//1 4172//1 4170//1\nf 4176//2 4173//2 4175//2\nf 4173//5 4169//5 4174//5\nf 4174//4 4170//4 4175//4\nf 4171//3 4172//3 4175//3\nf 4169//6 4173//6 4172//6\nf 4177//1 4180//1 4178//1\nf 4184//2 4181//2 4183//2\nf 4181//5 4177//5 4182//5\nf 4182//4 4178//4 4183//4\nf 4179//3 4180//3 4183//3\nf 4177//6 4181//6 4180//6\nf 4185//1 4188//1 4186//1\nf 4192//2 4189//2 4191//2\nf 4189//5 4185//5 4190//5\nf 4190//4 4186//4 4191//4\nf 4187//3 4188//3 4191//3\nf 4189//6 4192//6 4185//6\nf 4193//1 4196//1 4194//1\nf 4200//2 4197//2 4199//2\nf 4193//5 4194//5 4197//5\nf 4198//4 4194//4 4199//4\nf 4195//3 4196//3 4199//3\nf 4193//6 4197//6 4196//6\nf 4201//1 4204//1 4202//1\nf 4205//2 4206//2 4208//2\nf 4205//5 4201//5 4206//5\nf 4202//4 4203//4 4206//4\nf 4203//3 4204//3 4207//3\nf 4205//6 4208//6 4201//6\nf 4209//1 4212//1 4210//1\nf 4213//2 4214//2 4216//2\nf 4213//5 4209//5 4214//5\nf 4210//4 4211//4 4214//4\nf 4211//3 4212//3 4215//3\nf 4213//6 4216//6 4209//6\nf 4217//1 4220//1 4218//1\nf 4221//2 4222//2 4224//2\nf 4221//5 4217//5 4222//5\nf 4218//4 4219//4 4222//4\nf 4219//3 4220//3 4223//3\nf 4221//6 4224//6 4217//6\nf 4225//1 4228//1 4226//1\nf 4229//2 4230//2 4232//2\nf 4229//5 4225//5 4230//5\nf 4226//4 4227//4 4230//4\nf 4227//3 4228//3 4231//3\nf 4229//6 4232//6 4225//6\nf 4233//1 4236//1 4234//1\nf 4237//2 4238//2 4240//2\nf 4237//5 4233//5 4238//5\nf 4234//4 4235//4 4238//4\nf 4235//3 4236//3 4239//3\nf 4237//6 4240//6 4233//6\nf 4242//1 4241//1 4243//1\nf 4245//2 4246//2 4248//2\nf 4245//5 4241//5 4246//5\nf 4246//4 4242//4 4247//4\nf 4243//3 4244//3 4247//3\nf 4245//6 4248//6 4241//6\nf 4250//1 4249//1 4251//1\nf 4253//2 4254//2 4256//2\nf 4253//5 4249//5 4254//5\nf 4254//4 4250//4 4255//4\nf 4251//3 4252//3 4255//3\nf 4249//6 4253//6 4252//6\nf 4257//1 4260//1 4258//1\nf 4261//2 4262//2 4264//2\nf 4261//5 4257//5 4262//5\nf 4262//4 4258//4 4263//4\nf 4259//3 4260//3 4263//3\nf 4257//6 4261//6 4260//6\nf 4265//1 4268//1 4266//1\nf 4269//2 4270//2 4272//2\nf 4269//5 4265//5 4270//5\nf 4270//4 4266//4 4271//4\nf 4267//3 4268//3 4271//3\nf 4269//6 4272//6 4265//6\nf 4273//1 4276//1 4274//1\nf 4277//2 4278//2 4280//2\nf 4277//5 4273//5 4278//5\nf 4278//4 4274//4 4279//4\nf 4275//3 4276//3 4279//3\nf 4273//6 4277//6 4276//6\nf 4281//1 4284//1 4282//1\nf 4285//2 4286//2 4288//2\nf 4285//5 4281//5 4286//5\nf 4282//4 4283//4 4286//4\nf 4283//3 4284//3 4287//3\nf 4285//6 4288//6 4281//6\nf 4289//1 4292//1 4290//1\nf 4293//2 4294//2 4296//2\nf 4293//5 4289//5 4294//5\nf 4290//4 4291//4 4294//4\nf 4291//3 4292//3 4295//3\nf 4293//6 4296//6 4289//6\nf 4297//1 4300//1 4298//1\nf 4301//2 4302//2 4304//2\nf 4301//5 4297//5 4302//5\nf 4298//4 4299//4 4302//4\nf 4299//3 4300//3 4303//3\nf 4301//6 4304//6 4297//6\nf 4305//1 4308//1 4306//1\nf 4309//2 4310//2 4312//2\nf 4309//5 4305//5 4310//5\nf 4306//4 4307//4 4310//4\nf 4307//3 4308//3 4311//3\nf 4309//6 4312//6 4305//6\nf 4313//1 4316//1 4314//1\nf 4317//2 4318//2 4320//2\nf 4317//5 4313//5 4318//5\nf 4314//4 4315//4 4318//4\nf 4315//3 4316//3 4319//3\nf 4317//6 4320//6 4313//6\nf 4322//1 4321//1 4323//1\nf 4325//2 4326//2 4328//2\nf 4325//5 4321//5 4326//5\nf 4326//4 4322//4 4327//4\nf 4323//3 4324//3 4327//3\nf 4325//6 4328//6 4321//6\nf 4330//1 4329//1 4331//1\nf 4333//2 4334//2 4336//2\nf 4333//5 4329//5 4334//5\nf 4334//4 4330//4 4335//4\nf 4331//3 4332//3 4335//3\nf 4329//6 4333//6 4332//6\nf 4337//1 4340//1 4338//1\nf 4341//2 4342//2 4344//2\nf 4341//5 4337//5 4342//5\nf 4342//4 4338//4 4343//4\nf 4339//3 4340//3 4343//3\nf 4337//6 4341//6 4340//6\nf 4345//1 4348//1 4346//1\nf 4349//2 4350//2 4352//2\nf 4349//5 4345//5 4350//5\nf 4350//4 4346//4 4351//4\nf 4347//3 4348//3 4351//3\nf 4349//6 4352//6 4345//6\nf 4353//1 4356//1 4354//1\nf 4357//2 4358//2 4360//2\nf 4357//5 4353//5 4358//5\nf 4358//4 4354//4 4359//4\nf 4355//3 4356//3 4359//3\nf 4353//6 4357//6 4356//6\nf 4361//1 4364//1 4362//1\nf 4365//2 4366//2 4368//2\nf 4365//5 4361//5 4366//5\nf 4362//4 4363//4 4366//4\nf 4363//3 4364//3 4367//3\nf 4365//6 4368//6 4361//6\nf 4369//1 4372//1 4370//1\nf 4373//2 4374//2 4376//2\nf 4373//5 4369//5 4374//5\nf 4370//4 4371//4 4374//4\nf 4371//3 4372//3 4375//3\nf 4373//6 4376//6 4369//6\nf 4377//1 4380//1 4378//1\nf 4381//2 4382//2 4384//2\nf 4381//5 4377//5 4382//5\nf 4378//4 4379//4 4382//4\nf 4379//3 4380//3 4383//3\nf 4381//6 4384//6 4377//6\nf 4385//1 4388//1 4386//1\nf 4389//2 4390//2 4392//2\nf 4389//5 4385//5 4390//5\nf 4386//4 4387//4 4390//4\nf 4387//3 4388//3 4391//3\nf 4389//6 4392//6 4385//6\nf 4393//1 4396//1 4394//1\nf 4397//2 4398//2 4400//2\nf 4397//5 4393//5 4398//5\nf 4394//4 4395//4 4398//4\nf 4395//3 4396//3 4399//3\nf 4397//6 4400//6 4393//6\nf 4402//1 4401//1 4403//1\nf 4408//2 4405//2 4407//2\nf 4401//5 4402//5 4405//5\nf 4406//4 4402//4 4407//4\nf 4403//3 4404//3 4407//3\nf 4405//6 4408//6 4401//6\nf 4410//1 4409//1 4411//1\nf 4416//2 4413//2 4415//2\nf 4409//5 4410//5 4413//5\nf 4414//4 4410//4 4415//4\nf 4411//3 4412//3 4415//3\nf 4409//6 4413//6 4412//6\nf 4417//1 4420//1 4418//1\nf 4424//2 4421//2 4423//2\nf 4417//5 4418//5 4421//5\nf 4422//4 4418//4 4423//4\nf 4419//3 4420//3 4423//3\nf 4417//6 4421//6 4420//6\nf 4425//1 4428//1 4426//1\nf 4432//2 4429//2 4431//2\nf 4425//5 4426//5 4429//5\nf 4430//4 4426//4 4431//4\nf 4427//3 4428//3 4431//3\nf 4429//6 4432//6 4425//6\nf 4433//1 4436//1 4434//1\nf 4440//2 4437//2 4439//2\nf 4433//5 4434//5 4437//5\nf 4438//4 4434//4 4439//4\nf 4435//3 4436//3 4439//3\nf 4433//6 4437//6 4436//6\nf 4441//1 4444//1 4442//1\nf 4445//2 4446//2 4448//2\nf 4441//5 4442//5 4445//5\nf 4442//4 4443//4 4446//4\nf 4443//3 4444//3 4447//3\nf 4445//6 4448//6 4441//6\nf 4449//1 4452//1 4450//1\nf 4453//2 4454//2 4456//2\nf 4449//5 4450//5 4453//5\nf 4450//4 4451//4 4454//4\nf 4451//3 4452//3 4455//3\nf 4453//6 4456//6 4449//6\nf 4457//1 4460//1 4458//1\nf 4461//2 4462//2 4464//2\nf 4457//5 4458//5 4461//5\nf 4458//4 4459//4 4462//4\nf 4459//3 4460//3 4463//3\nf 4461//6 4464//6 4457//6\nf 4465//1 4468//1 4466//1\nf 4469//2 4470//2 4472//2\nf 4465//5 4466//5 4469//5\nf 4466//4 4467//4 4470//4\nf 4467//3 4468//3 4471//3\nf 4469//6 4472//6 4465//6\nf 4473//1 4476//1 4474//1\nf 4477//2 4478//2 4480//2\nf 4473//5 4474//5 4477//5\nf 4474//4 4475//4 4478//4\nf 4475//3 4476//3 4479//3\nf 4477//6 4480//6 4473//6\nf 4482//1 4481//1 4483//1\nf 4488//2 4485//2 4487//2\nf 4481//5 4482//5 4485//5\nf 4486//4 4482//4 4487//4\nf 4483//3 4484//3 4487//3\nf 4485//6 4488//6 4481//6\nf 4490//1 4489//1 4491//1\nf 4496//2 4493//2 4495//2\nf 4489//5 4490//5 4493//5\nf 4494//4 4490//4 4495//4\nf 4491//3 4492//3 4495//3\nf 4489//6 4493//6 4492//6\nf 4497//1 4500//1 4498//1\nf 4504//2 4501//2 4503//2\nf 4497//5 4498//5 4501//5\nf 4502//4 4498//4 4503//4\nf 4499//3 4500//3 4503//3\nf 4497//6 4501//6 4500//6\nf 4505//1 4508//1 4506//1\nf 4512//2 4509//2 4511//2\nf 4505//5 4506//5 4509//5\nf 4510//4 4506//4 4511//4\nf 4507//3 4508//3 4511//3\nf 4509//6 4512//6 4505//6\nf 4513//1 4516//1 4514//1\nf 4520//2 4517//2 4519//2\nf 4513//5 4514//5 4517//5\nf 4518//4 4514//4 4519//4\nf 4515//3 4516//3 4519//3\nf 4513//6 4517//6 4516//6\nf 4521//1 4524//1 4522//1\nf 4525//2 4526//2 4528//2\nf 4521//5 4522//5 4525//5\nf 4522//4 4523//4 4526//4\nf 4523//3 4524//3 4527//3\nf 4525//6 4528//6 4521//6\nf 4529//1 4532//1 4530//1\nf 4533//2 4534//2 4536//2\nf 4529//5 4530//5 4533//5\nf 4530//4 4531//4 4534//4\nf 4531//3 4532//3 4535//3\nf 4533//6 4536//6 4529//6\nf 4537//1 4540//1 4538//1\nf 4541//2 4542//2 4544//2\nf 4537//5 4538//5 4541//5\nf 4538//4 4539//4 4542//4\nf 4539//3 4540//3 4543//3\nf 4541//6 4544//6 4537//6\nf 4545//1 4548//1 4546//1\nf 4549//2 4550//2 4552//2\nf 4545//5 4546//5 4549//5\nf 4546//4 4547//4 4550//4\nf 4547//3 4548//3 4551//3\nf 4549//6 4552//6 4545//6\nf 4553//1 4556//1 4554//1\nf 4557//2 4558//2 4560//2\nf 4553//5 4554//5 4557//5\nf 4554//4 4555//4 4558//4\nf 4555//3 4556//3 4559//3\nf 4557//6 4560//6 4553//6\nf 4562//1 4561//1 4563//1\nf 4568//2 4565//2 4567//2\nf 4561//5 4562//5 4565//5\nf 4566//4 4562//4 4567//4\nf 4563//3 4564//3 4567//3\nf 4565//6 4568//6 4561//6\nf 4570//1 4569//1 4571//1\nf 4576//2 4573//2 4575//2\nf 4569//5 4570//5 4573//5\nf 4574//4 4570//4 4575//4\nf 4571//3 4572//3 4575//3\nf 4569//6 4573//6 4572//6\nf 4577//1 4580//1 4578//1\nf 4584//2 4581//2 4583//2\nf 4577//5 4578//5 4581//5\nf 4582//4 4578//4 4583//4\nf 4579//3 4580//3 4583//3\nf 4577//6 4581//6 4580//6\nf 4585//1 4588//1 4586//1\nf 4592//2 4589//2 4591//2\nf 4585//5 4586//5 4589//5\nf 4590//4 4586//4 4591//4\nf 4587//3 4588//3 4591//3\nf 4589//6 4592//6 4585//6\nf 4593//1 4596//1 4594//1\nf 4600//2 4597//2 4599//2\nf 4593//5 4594//5 4597//5\nf 4598//4 4594//4 4599//4\nf 4595//3 4596//3 4599//3\nf 4593//6 4597//6 4596//6\nf 4601//1 4604//1 4602//1\nf 4605//2 4606//2 4608//2\nf 4601//5 4602//5 4605//5\nf 4602//4 4603//4 4606//4\nf 4603//3 4604//3 4607//3\nf 4605//6 4608//6 4601//6\nf 4609//1 4612//1 4610//1\nf 4613//2 4614//2 4616//2\nf 4609//5 4610//5 4613//5\nf 4610//4 4611//4 4614//4\nf 4611//3 4612//3 4615//3\nf 4613//6 4616//6 4609//6\nf 4617//1 4620//1 4618//1\nf 4621//2 4622//2 4624//2\nf 4617//5 4618//5 4621//5\nf 4618//4 4619//4 4622//4\nf 4619//3 4620//3 4623//3\nf 4621//6 4624//6 4617//6\nf 4625//1 4628//1 4626//1\nf 4629//2 4630//2 4632//2\nf 4625//5 4626//5 4629//5\nf 4626//4 4627//4 4630//4\nf 4627//3 4628//3 4631//3\nf 4629//6 4632//6 4625//6\nf 4633//1 4636//1 4634//1\nf 4637//2 4638//2 4640//2\nf 4633//5 4634//5 4637//5\nf 4634//4 4635//4 4638//4\nf 4635//3 4636//3 4639//3\nf 4637//6 4640//6 4633//6\nf 4642//1 4641//1 4643//1\nf 4648//2 4645//2 4647//2\nf 4641//5 4642//5 4645//5\nf 4646//4 4642//4 4647//4\nf 4643//3 4644//3 4647//3\nf 4645//6 4648//6 4641//6\nf 4650//1 4649//1 4651//1\nf 4656//2 4653//2 4655//2\nf 4649//5 4650//5 4653//5\nf 4654//4 4650//4 4655//4\nf 4651//3 4652//3 4655//3\nf 4649//6 4653//6 4652//6\nf 4657//1 4660//1 4658//1\nf 4664//2 4661//2 4663//2\nf 4657//5 4658//5 4661//5\nf 4662//4 4658//4 4663//4\nf 4659//3 4660//3 4663//3\nf 4657//6 4661//6 4660//6\nf 4665//1 4668//1 4666//1\nf 4672//2 4669//2 4671//2\nf 4665//5 4666//5 4669//5\nf 4670//4 4666//4 4671//4\nf 4667//3 4668//3 4671//3\nf 4669//6 4672//6 4665//6\nf 4673//1 4676//1 4674//1\nf 4680//2 4677//2 4679//2\nf 4673//5 4674//5 4677//5\nf 4678//4 4674//4 4679//4\nf 4675//3 4676//3 4679//3\nf 4673//6 4677//6 4676//6\nf 4681//1 4684//1 4682//1\nf 4685//2 4686//2 4688//2\nf 4681//5 4682//5 4685//5\nf 4682//4 4683//4 4686//4\nf 4683//3 4684//3 4687//3\nf 4685//6 4688//6 4681//6\nf 4689//1 4692//1 4690//1\nf 4693//2 4694//2 4696//2\nf 4689//5 4690//5 4693//5\nf 4690//4 4691//4 4694//4\nf 4691//3 4692//3 4695//3\nf 4693//6 4696//6 4689//6\nf 4697//1 4700//1 4698//1\nf 4701//2 4702//2 4704//2\nf 4697//5 4698//5 4701//5\nf 4698//4 4699//4 4702//4\nf 4699//3 4700//3 4703//3\nf 4701//6 4704//6 4697//6\nf 4705//1 4708//1 4706//1\nf 4709//2 4710//2 4712//2\nf 4705//5 4706//5 4709//5\nf 4706//4 4707//4 4710//4\nf 4707//3 4708//3 4711//3\nf 4709//6 4712//6 4705//6\nf 4713//1 4716//1 4714//1\nf 4717//2 4718//2 4720//2\nf 4713//5 4714//5 4717//5\nf 4714//4 4715//4 4718//4\nf 4715//3 4716//3 4719//3\nf 4717//6 4720//6 4713//6\nf 4722//1 4721//1 4723//1\nf 4728//2 4725//2 4727//2\nf 4721//5 4722//5 4725//5\nf 4726//4 4722//4 4727//4\nf 4723//3 4724//3 4727//3\nf 4725//6 4728//6 4721//6\nf 4730//1 4729//1 4731//1\nf 4736//2 4733//2 4735//2\nf 4729//5 4730//5 4733//5\nf 4734//4 4730//4 4735//4\nf 4731//3 4732//3 4735//3\nf 4729//6 4733//6 4732//6\nf 4737//1 4740//1 4738//1\nf 4744//2 4741//2 4743//2\nf 4737//5 4738//5 4741//5\nf 4742//4 4738//4 4743//4\nf 4739//3 4740//3 4743//3\nf 4737//6 4741//6 4740//6\nf 4745//1 4748//1 4746//1\nf 4752//2 4749//2 4751//2\nf 4745//5 4746//5 4749//5\nf 4750//4 4746//4 4751//4\nf 4747//3 4748//3 4751//3\nf 4749//6 4752//6 4745//6\nf 4753//1 4756//1 4754//1\nf 4760//2 4757//2 4759//2\nf 4753//5 4754//5 4757//5\nf 4758//4 4754//4 4759//4\nf 4755//3 4756//3 4759//3\nf 4753//6 4757//6 4756//6\nf 4761//1 4764//1 4762//1\nf 4765//2 4766//2 4768//2\nf 4761//5 4762//5 4765//5\nf 4762//4 4763//4 4766//4\nf 4763//3 4764//3 4767//3\nf 4765//6 4768//6 4761//6\nf 4769//1 4772//1 4770//1\nf 4773//2 4774//2 4776//2\nf 4769//5 4770//5 4773//5\nf 4770//4 4771//4 4774//4\nf 4771//3 4772//3 4775//3\nf 4773//6 4776//6 4769//6\nf 4777//1 4780//1 4778//1\nf 4781//2 4782//2 4784//2\nf 4777//5 4778//5 4781//5\nf 4778//4 4779//4 4782//4\nf 4779//3 4780//3 4783//3\nf 4781//6 4784//6 4777//6\nf 4785//1 4788//1 4786//1\nf 4789//2 4790//2 4792//2\nf 4785//5 4786//5 4789//5\nf 4786//4 4787//4 4790//4\nf 4787//3 4788//3 4791//3\nf 4789//6 4792//6 4785//6\nf 4793//1 4796//1 4794//1\nf 4797//2 4798//2 4800//2\nf 4793//5 4794//5 4797//5\nf 4794//4 4795//4 4798//4\nf 4795//3 4796//3 4799//3\nf 4797//6 4800//6 4793//6\nf 4801//1 4802//1 4804//1\nf 4805//2 4808//2 4806//2\nf 4802//3 4801//3 4806//3\nf 4803//4 4802//4 4807//4\nf 4803//5 4807//5 4804//5\nf 4805//6 4801//6 4808//6\nf 4809//1 4810//1 4812//1\nf 4814//2 4813//2 4815//2\nf 4810//3 4809//3 4814//3\nf 4811//4 4810//4 4815//4\nf 4811//5 4815//5 4812//5\nf 4813//6 4809//6 4816//6\nf 4817//1 4818//1 4820//1\nf 4821//2 4824//2 4822//2\nf 4818//3 4817//3 4822//3\nf 4819//4 4818//4 4823//4\nf 4819//5 4823//5 4820//5\nf 4824//6 4821//6 4820//6\nf 4825//1 4826//1 4828//1\nf 4829//2 4832//2 4830//2\nf 4826//3 4825//3 4830//3\nf 4827//4 4826//4 4831//4\nf 4827//5 4831//5 4828//5\nf 4829//6 4825//6 4832//6\nf 4833//1 4834//1 4836//1\nf 4838//2 4837//2 4839//2\nf 4834//3 4833//3 4838//3\nf 4835//4 4834//4 4839//4\nf 4835//5 4839//5 4836//5\nf 4840//6 4837//6 4836//6\nf 4841//1 4842//1 4844//1\nf 4845//2 4848//2 4846//2\nf 4842//3 4841//3 4846//3\nf 4842//4 4846//4 4843//4\nf 4843//5 4847//5 4844//5\nf 4845//6 4841//6 4848//6\nf 4849//1 4850//1 4852//1\nf 4853//2 4856//2 4854//2\nf 4850//3 4849//3 4854//3\nf 4850//4 4854//4 4851//4\nf 4851//5 4855//5 4852//5\nf 4853//6 4849//6 4856//6\nf 4857//1 4858//1 4860//1\nf 4861//2 4864//2 4862//2\nf 4858//3 4857//3 4862//3\nf 4858//4 4862//4 4859//4\nf 4859//5 4863//5 4860//5\nf 4861//6 4857//6 4864//6\nf 4865//1 4866//1 4868//1\nf 4869//2 4872//2 4870//2\nf 4866//3 4865//3 4870//3\nf 4866//4 4870//4 4867//4\nf 4867//5 4871//5 4868//5\nf 4869//6 4865//6 4872//6\nf 4873//1 4874//1 4876//1\nf 4877//2 4880//2 4878//2\nf 4874//3 4873//3 4878//3\nf 4874//4 4878//4 4875//4\nf 4875//5 4879//5 4876//5\nf 4877//6 4873//6 4880//6\nf 4881//1 4882//1 4884//1\nf 4885//2 4888//2 4886//2\nf 4881//3 4885//3 4882//3\nf 4883//4 4882//4 4887//4\nf 4883//5 4887//5 4884//5\nf 4885//6 4881//6 4888//6\nf 4889//1 4890//1 4892//1\nf 4894//2 4893//2 4895//2\nf 4890//3 4889//3 4894//3\nf 4891//4 4890//4 4895//4\nf 4891//5 4895//5 4892//5\nf 4893//6 4889//6 4896//6\nf 4897//1 4898//1 4900//1\nf 4901//2 4904//2 4902//2\nf 4898//3 4897//3 4902//3\nf 4899//4 4898//4 4903//4\nf 4899//5 4903//5 4900//5\nf 4904//6 4901//6 4900//6\nf 4905//1 4906//1 4908//1\nf 4909//2 4912//2 4910//2\nf 4906//3 4905//3 4910//3\nf 4907//4 4906//4 4911//4\nf 4907//5 4911//5 4908//5\nf 4909//6 4905//6 4912//6\nf 4913//1 4914//1 4916//1\nf 4918//2 4917//2 4919//2\nf 4914//3 4913//3 4918//3\nf 4915//4 4914//4 4919//4\nf 4915//5 4919//5 4916//5\nf 4920//6 4917//6 4916//6\nf 4921//1 4922//1 4924//1\nf 4925//2 4928//2 4926//2\nf 4922//3 4921//3 4926//3\nf 4922//4 4926//4 4923//4\nf 4923//5 4927//5 4924//5\nf 4925//6 4921//6 4928//6\nf 4929//1 4930//1 4932//1\nf 4933//2 4936//2 4934//2\nf 4930//3 4929//3 4934//3\nf 4930//4 4934//4 4931//4\nf 4931//5 4935//5 4932//5\nf 4933//6 4929//6 4936//6\nf 4937//1 4938//1 4940//1\nf 4941//2 4944//2 4942//2\nf 4938//3 4937//3 4942//3\nf 4938//4 4942//4 4939//4\nf 4939//5 4943//5 4940//5\nf 4941//6 4937//6 4944//6\nf 4945//1 4946//1 4948//1\nf 4949//2 4952//2 4950//2\nf 4946//3 4945//3 4950//3\nf 4946//4 4950//4 4947//4\nf 4947//5 4951//5 4948//5\nf 4949//6 4945//6 4952//6\nf 4953//1 4954//1 4956//1\nf 4957//2 4960//2 4958//2\nf 4954//3 4953//3 4958//3\nf 4954//4 4958//4 4955//4\nf 4955//5 4959//5 4956//5\nf 4957//6 4953//6 4960//6\nf 4961//1 4962//1 4964//1\nf 4966//2 4965//2 4967//2\nf 4961//3 4965//3 4962//3\nf 4963//4 4962//4 4967//4\nf 4963//5 4967//5 4964//5\nf 4965//6 4961//6 4968//6\nf 4969//1 4970//1 4972//1\nf 4974//2 4973//2 4975//2\nf 4969//3 4973//3 4970//3\nf 4971//4 4970//4 4975//4\nf 4971//5 4975//5 4972//5\nf 4973//6 4969//6 4976//6\nf 4977//1 4978//1 4980//1\nf 4982//2 4981//2 4983//2\nf 4978//3 4977//3 4982//3\nf 4979//4 4978//4 4983//4\nf 4979//5 4983//5 4980//5\nf 4984//6 4981//6 4980//6\nf 4985//1 4986//1 4988//1\nf 4990//2 4989//2 4991//2\nf 4986//3 4985//3 4990//3\nf 4987//4 4986//4 4991//4\nf 4987//5 4991//5 4988//5\nf 4989//6 4985//6 4992//6\nf 4993//1 4994//1 4996//1\nf 4998//2 4997//2 4999//2\nf 4993//3 4997//3 4994//3\nf 4995//4 4994//4 4999//4\nf 4995//5 4999//5 4996//5\nf 5000//6 4997//6 4996//6\nf 5001//1 5002//1 5004//1\nf 5005//2 5008//2 5006//2\nf 5002//3 5001//3 5006//3\nf 5002//4 5006//4 5003//4\nf 5003//5 5007//5 5004//5\nf 5005//6 5001//6 5008//6\nf 5009//1 5010//1 5012//1\nf 5013//2 5016//2 5014//2\nf 5010//3 5009//3 5014//3\nf 5010//4 5014//4 5011//4\nf 5011//5 5015//5 5012//5\nf 5013//6 5009//6 5016//6\nf 5017//1 5018//1 5020//1\nf 5021//2 5024//2 5022//2\nf 5018//3 5017//3 5022//3\nf 5018//4 5022//4 5019//4\nf 5019//5 5023//5 5020//5\nf 5021//6 5017//6 5024//6\nf 5025//1 5026//1 5028//1\nf 5029//2 5032//2 5030//2\nf 5026//3 5025//3 5030//3\nf 5026//4 5030//4 5027//4\nf 5027//5 5031//5 5028//5\nf 5029//6 5025//6 5032//6\nf 5033//1 5034//1 5036//1\nf 5037//2 5040//2 5038//2\nf 5034//3 5033//3 5038//3\nf 5034//4 5038//4 5035//4\nf 5035//5 5039//5 5036//5\nf 5037//6 5033//6 5040//6\nf 5044//1 5041//1 5043//1\nf 5045//2 5048//2 5046//2\nf 5042//3 5041//3 5046//3\nf 5043//4 5042//4 5047//4\nf 5043//5 5047//5 5044//5\nf 5045//6 5041//6 5048//6\nf 5052//1 5049//1 5051//1\nf 5053//2 5056//2 5054//2\nf 5050//3 5049//3 5054//3\nf 5051//4 5050//4 5055//4\nf 5051//5 5055//5 5052//5\nf 5053//6 5049//6 5056//6\nf 5057//1 5058//1 5060//1\nf 5061//2 5064//2 5062//2\nf 5058//3 5057//3 5062//3\nf 5059//4 5058//4 5063//4\nf 5059//5 5063//5 5060//5\nf 5064//6 5061//6 5060//6\nf 5065//1 5066//1 5068//1\nf 5069//2 5072//2 5070//2\nf 5066//3 5065//3 5070//3\nf 5067//4 5066//4 5071//4\nf 5067//5 5071//5 5068//5\nf 5069//6 5065//6 5072//6\nf 5073//1 5074//1 5076//1\nf 5077//2 5080//2 5078//2\nf 5074//3 5073//3 5078//3\nf 5075//4 5074//4 5079//4\nf 5075//5 5079//5 5076//5\nf 5080//6 5077//6 5076//6\nf 5081//1 5082//1 5084//1\nf 5085//2 5088//2 5086//2\nf 5082//3 5081//3 5086//3\nf 5082//4 5086//4 5083//4\nf 5083//5 5087//5 5084//5\nf 5085//6 5081//6 5088//6\nf 5089//1 5090//1 5092//1\nf 5093//2 5096//2 5094//2\nf 5090//3 5089//3 5094//3\nf 5090//4 5094//4 5091//4\nf 5091//5 5095//5 5092//5\nf 5093//6 5089//6 5096//6\nf 5097//1 5098//1 5100//1\nf 5101//2 5104//2 5102//2\nf 5098//3 5097//3 5102//3\nf 5098//4 5102//4 5099//4\nf 5099//5 5103//5 5100//5\nf 5101//6 5097//6 5104//6\nf 5105//1 5106//1 5108//1\nf 5109//2 5112//2 5110//2\nf 5106//3 5105//3 5110//3\nf 5106//4 5110//4 5107//4\nf 5107//5 5111//5 5108//5\nf 5109//6 5105//6 5112//6\nf 5113//1 5114//1 5116//1\nf 5117//2 5120//2 5118//2\nf 5114//3 5113//3 5118//3\nf 5114//4 5118//4 5115//4\nf 5115//5 5119//5 5116//5\nf 5117//6 5113//6 5120//6\nf 5124//1 5121//1 5123//1\nf 5125//2 5128//2 5126//2\nf 5122//3 5121//3 5126//3\nf 5123//4 5122//4 5127//4\nf 5123//5 5127//5 5124//5\nf 5125//6 5121//6 5128//6\nf 5132//1 5129//1 5131//1\nf 5133//2 5136//2 5134//2\nf 5130//3 5129//3 5134//3\nf 5131//4 5130//4 5135//4\nf 5131//5 5135//5 5132//5\nf 5133//6 5129//6 5136//6\nf 5137//1 5138//1 5140//1\nf 5141//2 5144//2 5142//2\nf 5138//3 5137//3 5142//3\nf 5139//4 5138//4 5143//4\nf 5139//5 5143//5 5140//5\nf 5144//6 5141//6 5140//6\nf 5145//1 5146//1 5148//1\nf 5149//2 5152//2 5150//2\nf 5146//3 5145//3 5150//3\nf 5147//4 5146//4 5151//4\nf 5147//5 5151//5 5148//5\nf 5149//6 5145//6 5152//6\nf 5153//1 5154//1 5156//1\nf 5157//2 5160//2 5158//2\nf 5154//3 5153//3 5158//3\nf 5155//4 5154//4 5159//4\nf 5155//5 5159//5 5156//5\nf 5160//6 5157//6 5156//6\nf 5161//1 5162//1 5164//1\nf 5165//2 5168//2 5166//2\nf 5162//3 5161//3 5166//3\nf 5162//4 5166//4 5163//4\nf 5163//5 5167//5 5164//5\nf 5165//6 5161//6 5168//6\nf 5169//1 5170//1 5172//1\nf 5173//2 5176//2 5174//2\nf 5170//3 5169//3 5174//3\nf 5170//4 5174//4 5171//4\nf 5171//5 5175//5 5172//5\nf 5173//6 5169//6 5176//6\nf 5177//1 5178//1 5180//1\nf 5181//2 5184//2 5182//2\nf 5178//3 5177//3 5182//3\nf 5178//4 5182//4 5179//4\nf 5179//5 5183//5 5180//5\nf 5181//6 5177//6 5184//6\nf 5185//1 5186//1 5188//1\nf 5189//2 5192//2 5190//2\nf 5186//3 5185//3 5190//3\nf 5186//4 5190//4 5187//4\nf 5187//5 5191//5 5188//5\nf 5189//6 5185//6 5192//6\nf 5193//1 5194//1 5196//1\nf 5197//2 5200//2 5198//2\nf 5194//3 5193//3 5198//3\nf 5194//4 5198//4 5195//4\nf 5195//5 5199//5 5196//5\nf 5197//6 5193//6 5200//6\nf 5204//1 5201//1 5203//1\nf 5206//2 5205//2 5207//2\nf 5201//3 5205//3 5202//3\nf 5203//4 5202//4 5207//4\nf 5203//5 5207//5 5204//5\nf 5205//6 5201//6 5208//6\nf 5212//1 5209//1 5211//1\nf 5214//2 5213//2 5215//2\nf 5209//3 5213//3 5210//3\nf 5211//4 5210//4 5215//4\nf 5211//5 5215//5 5212//5\nf 5213//6 5209//6 5216//6\nf 5217//1 5218//1 5220//1\nf 5222//2 5221//2 5223//2\nf 5217//3 5221//3 5218//3\nf 5219//4 5218//4 5223//4\nf 5219//5 5223//5 5220//5\nf 5224//6 5221//6 5220//6\nf 5225//1 5226//1 5228//1\nf 5230//2 5229//2 5231//2\nf 5225//3 5229//3 5226//3\nf 5227//4 5226//4 5231//4\nf 5227//5 5231//5 5228//5\nf 5229//6 5225//6 5232//6\nf 5233//1 5234//1 5236//1\nf 5238//2 5237//2 5239//2\nf 5233//3 5237//3 5234//3\nf 5235//4 5234//4 5239//4\nf 5235//5 5239//5 5236//5\nf 5240//6 5237//6 5236//6\nf 5241//1 5242//1 5244//1\nf 5245//2 5248//2 5246//2\nf 5241//3 5245//3 5242//3\nf 5242//4 5246//4 5243//4\nf 5243//5 5247//5 5244//5\nf 5245//6 5241//6 5248//6\nf 5249//1 5250//1 5252//1\nf 5253//2 5256//2 5254//2\nf 5249//3 5253//3 5250//3\nf 5250//4 5254//4 5251//4\nf 5251//5 5255//5 5252//5\nf 5253//6 5249//6 5256//6\nf 5257//1 5258//1 5260//1\nf 5261//2 5264//2 5262//2\nf 5257//3 5261//3 5258//3\nf 5258//4 5262//4 5259//4\nf 5259//5 5263//5 5260//5\nf 5261//6 5257//6 5264//6\nf 5265//1 5266//1 5268//1\nf 5269//2 5272//2 5270//2\nf 5265//3 5269//3 5266//3\nf 5266//4 5270//4 5267//4\nf 5267//5 5271//5 5268//5\nf 5269//6 5265//6 5272//6\nf 5273//1 5274//1 5276//1\nf 5277//2 5280//2 5278//2\nf 5273//3 5277//3 5274//3\nf 5274//4 5278//4 5275//4\nf 5275//5 5279//5 5276//5\nf 5277//6 5273//6 5280//6\nf 5284//1 5281//1 5283//1\nf 5286//2 5285//2 5287//2\nf 5281//3 5285//3 5282//3\nf 5283//4 5282//4 5287//4\nf 5283//5 5287//5 5284//5\nf 5285//6 5281//6 5288//6\nf 5292//1 5289//1 5291//1\nf 5294//2 5293//2 5295//2\nf 5289//3 5293//3 5290//3\nf 5291//4 5290//4 5295//4\nf 5291//5 5295//5 5292//5\nf 5293//6 5289//6 5296//6\nf 5297//1 5298//1 5300//1\nf 5302//2 5301//2 5303//2\nf 5297//3 5301//3 5298//3\nf 5299//4 5298//4 5303//4\nf 5299//5 5303//5 5300//5\nf 5304//6 5301//6 5300//6\nf 5305//1 5306//1 5308//1\nf 5310//2 5309//2 5311//2\nf 5305//3 5309//3 5306//3\nf 5307//4 5306//4 5311//4\nf 5307//5 5311//5 5308//5\nf 5309//6 5305//6 5312//6\nf 5313//1 5314//1 5316//1\nf 5318//2 5317//2 5319//2\nf 5313//3 5317//3 5314//3\nf 5315//4 5314//4 5319//4\nf 5315//5 5319//5 5316//5\nf 5320//6 5317//6 5316//6\nf 5321//1 5322//1 5324//1\nf 5325//2 5328//2 5326//2\nf 5321//3 5325//3 5322//3\nf 5322//4 5326//4 5323//4\nf 5323//5 5327//5 5324//5\nf 5325//6 5321//6 5328//6\nf 5329//1 5330//1 5332//1\nf 5333//2 5336//2 5334//2\nf 5329//3 5333//3 5330//3\nf 5330//4 5334//4 5331//4\nf 5331//5 5335//5 5332//5\nf 5333//6 5329//6 5336//6\nf 5337//1 5338//1 5340//1\nf 5341//2 5344//2 5342//2\nf 5337//3 5341//3 5338//3\nf 5338//4 5342//4 5339//4\nf 5339//5 5343//5 5340//5\nf 5341//6 5337//6 5344//6\nf 5345//1 5346//1 5348//1\nf 5349//2 5352//2 5350//2\nf 5345//3 5349//3 5346//3\nf 5346//4 5350//4 5347//4\nf 5347//5 5351//5 5348//5\nf 5349//6 5345//6 5352//6\nf 5353//1 5354//1 5356//1\nf 5357//2 5360//2 5358//2\nf 5353//3 5357//3 5354//3\nf 5354//4 5358//4 5355//4\nf 5355//5 5359//5 5356//5\nf 5357//6 5353//6 5360//6\nf 5364//1 5361//1 5363//1\nf 5366//2 5365//2 5367//2\nf 5361//3 5365//3 5362//3\nf 5363//4 5362//4 5367//4\nf 5363//5 5367//5 5364//5\nf 5365//6 5361//6 5368//6\nf 5372//1 5369//1 5371//1\nf 5374//2 5373//2 5375//2\nf 5369//3 5373//3 5370//3\nf 5371//4 5370//4 5375//4\nf 5371//5 5375//5 5372//5\nf 5373//6 5369//6 5376//6\nf 5377//1 5378//1 5380//1\nf 5382//2 5381//2 5383//2\nf 5377//3 5381//3 5378//3\nf 5379//4 5378//4 5383//4\nf 5379//5 5383//5 5380//5\nf 5384//6 5381//6 5380//6\nf 5385//1 5386//1 5388//1\nf 5390//2 5389//2 5391//2\nf 5385//3 5389//3 5386//3\nf 5387//4 5386//4 5391//4\nf 5387//5 5391//5 5388//5\nf 5389//6 5385//6 5392//6\nf 5393//1 5394//1 5396//1\nf 5398//2 5397//2 5399//2\nf 5393//3 5397//3 5394//3\nf 5395//4 5394//4 5399//4\nf 5395//5 5399//5 5396//5\nf 5400//6 5397//6 5396//6\nf 5401//1 5402//1 5404//1\nf 5405//2 5408//2 5406//2\nf 5401//3 5405//3 5402//3\nf 5402//4 5406//4 5403//4\nf 5403//5 5407//5 5404//5\nf 5405//6 5401//6 5408//6\nf 5409//1 5410//1 5412//1\nf 5413//2 5416//2 5414//2\nf 5409//3 5413//3 5410//3\nf 5410//4 5414//4 5411//4\nf 5411//5 5415//5 5412//5\nf 5413//6 5409//6 5416//6\nf 5417//1 5418//1 5420//1\nf 5421//2 5424//2 5422//2\nf 5417//3 5421//3 5418//3\nf 5418//4 5422//4 5419//4\nf 5419//5 5423//5 5420//5\nf 5421//6 5417//6 5424//6\nf 5425//1 5426//1 5428//1\nf 5429//2 5432//2 5430//2\nf 5425//3 5429//3 5426//3\nf 5426//4 5430//4 5427//4\nf 5427//5 5431//5 5428//5\nf 5429//6 5425//6 5432//6\nf 5433//1 5434//1 5436//1\nf 5437//2 5440//2 5438//2\nf 5433//3 5437//3 5434//3\nf 5434//4 5438//4 5435//4\nf 5435//5 5439//5 5436//5\nf 5437//6 5433//6 5440//6\nf 5444//1 5441//1 5443//1\nf 5446//2 5445//2 5447//2\nf 5441//3 5445//3 5442//3\nf 5443//4 5442//4 5447//4\nf 5443//5 5447//5 5444//5\nf 5445//6 5441//6 5448//6\nf 5452//1 5449//1 5451//1\nf 5454//2 5453//2 5455//2\nf 5449//3 5453//3 5450//3\nf 5451//4 5450//4 5455//4\nf 5451//5 5455//5 5452//5\nf 5453//6 5449//6 5456//6\nf 5457//1 5458//1 5460//1\nf 5462//2 5461//2 5463//2\nf 5457//3 5461//3 5458//3\nf 5459//4 5458//4 5463//4\nf 5459//5 5463//5 5460//5\nf 5464//6 5461//6 5460//6\nf 5465//1 5466//1 5468//1\nf 5470//2 5469//2 5471//2\nf 5465//3 5469//3 5466//3\nf 5467//4 5466//4 5471//4\nf 5467//5 5471//5 5468//5\nf 5469//6 5465//6 5472//6\nf 5473//1 5474//1 5476//1\nf 5478//2 5477//2 5479//2\nf 5473//3 5477//3 5474//3\nf 5475//4 5474//4 5479//4\nf 5475//5 5479//5 5476//5\nf 5480//6 5477//6 5476//6\nf 5481//1 5482//1 5484//1\nf 5485//2 5488//2 5486//2\nf 5481//3 5485//3 5482//3\nf 5482//4 5486//4 5483//4\nf 5483//5 5487//5 5484//5\nf 5485//6 5481//6 5488//6\nf 5489//1 5490//1 5492//1\nf 5493//2 5496//2 5494//2\nf 5489//3 5493//3 5490//3\nf 5490//4 5494//4 5491//4\nf 5491//5 5495//5 5492//5\nf 5493//6 5489//6 5496//6\nf 5497//1 5498//1 5500//1\nf 5501//2 5504//2 5502//2\nf 5497//3 5501//3 5498//3\nf 5498//4 5502//4 5499//4\nf 5499//5 5503//5 5500//5\nf 5501//6 5497//6 5504//6\nf 5505//1 5506//1 5508//1\nf 5509//2 5512//2 5510//2\nf 5505//3 5509//3 5506//3\nf 5506//4 5510//4 5507//4\nf 5507//5 5511//5 5508//5\nf 5509//6 5505//6 5512//6\nf 5513//1 5514//1 5516//1\nf 5517//2 5520//2 5518//2\nf 5513//3 5517//3 5514//3\nf 5514//4 5518//4 5515//4\nf 5515//5 5519//5 5516//5\nf 5517//6 5513//6 5520//6\nf 5524//1 5521//1 5523//1\nf 5526//2 5525//2 5527//2\nf 5521//3 5525//3 5522//3\nf 5523//4 5522//4 5527//4\nf 5523//5 5527//5 5524//5\nf 5525//6 5521//6 5528//6\nf 5532//1 5529//1 5531//1\nf 5534//2 5533//2 5535//2\nf 5529//3 5533//3 5530//3\nf 5531//4 5530//4 5535//4\nf 5531//5 5535//5 5532//5\nf 5533//6 5529//6 5536//6\nf 5537//1 5538//1 5540//1\nf 5542//2 5541//2 5543//2\nf 5537//3 5541//3 5538//3\nf 5539//4 5538//4 5543//4\nf 5539//5 5543//5 5540//5\nf 5544//6 5541//6 5540//6\nf 5545//1 5546//1 5548//1\nf 5550//2 5549//2 5551//2\nf 5545//3 5549//3 5546//3\nf 5547//4 5546//4 5551//4\nf 5547//5 5551//5 5548//5\nf 5549//6 5545//6 5552//6\nf 5553//1 5554//1 5556//1\nf 5558//2 5557//2 5559//2\nf 5553//3 5557//3 5554//3\nf 5555//4 5554//4 5559//4\nf 5555//5 5559//5 5556//5\nf 5560//6 5557//6 5556//6\nf 5561//1 5562//1 5564//1\nf 5565//2 5568//2 5566//2\nf 5561//3 5565//3 5562//3\nf 5562//4 5566//4 5563//4\nf 5563//5 5567//5 5564//5\nf 5565//6 5561//6 5568//6\nf 5569//1 5570//1 5572//1\nf 5573//2 5576//2 5574//2\nf 5569//3 5573//3 5570//3\nf 5570//4 5574//4 5571//4\nf 5571//5 5575//5 5572//5\nf 5573//6 5569//6 5576//6\nf 5577//1 5578//1 5580//1\nf 5581//2 5584//2 5582//2\nf 5577//3 5581//3 5578//3\nf 5578//4 5582//4 5579//4\nf 5579//5 5583//5 5580//5\nf 5581//6 5577//6 5584//6\nf 5585//1 5586//1 5588//1\nf 5589//2 5592//2 5590//2\nf 5585//3 5589//3 5586//3\nf 5586//4 5590//4 5587//4\nf 5587//5 5591//5 5588//5\nf 5589//6 5585//6 5592//6\nf 5593//1 5594//1 5596//1\nf 5597//2 5600//2 5598//2\nf 5593//3 5597//3 5594//3\nf 5594//4 5598//4 5595//4\nf 5595//5 5599//5 5596//5\nf 5597//6 5593//6 5600//6\nf 5601//1 5604//1 5602//1\nf 5608//2 5605//2 5607//2\nf 5605//5 5601//5 5606//5\nf 5606//4 5602//4 5607//4\nf 5603//3 5604//3 5607//3\nf 5605//6 5608//6 5601//6\nf 5609//1 5612//1 5610//1\nf 5616//2 5613//2 5615//2\nf 5613//5 5609//5 5614//5\nf 5614//4 5610//4 5615//4\nf 5611//3 5612//3 5615//3\nf 5609//6 5613//6 5612//6\nf 5617//1 5620//1 5618//1\nf 5624//2 5621//2 5623//2\nf 5621//5 5617//5 5622//5\nf 5622//4 5618//4 5623//4\nf 5619//3 5620//3 5623//3\nf 5617//6 5621//6 5620//6\nf 5625//1 5628//1 5626//1\nf 5629//2 5630//2 5632//2\nf 5629//5 5625//5 5630//5\nf 5630//4 5626//4 5631//4\nf 5627//3 5628//3 5631//3\nf 5629//6 5632//6 5625//6\nf 5633//1 5636//1 5634//1\nf 5640//2 5637//2 5639//2\nf 5637//5 5633//5 5638//5\nf 5638//4 5634//4 5639//4\nf 5635//3 5636//3 5639//3\nf 5633//6 5637//6 5636//6\nf 5641//1 5644//1 5642//1\nf 5645//2 5646//2 5648//2\nf 5645//5 5641//5 5646//5\nf 5642//4 5643//4 5646//4\nf 5643//3 5644//3 5647//3\nf 5645//6 5648//6 5641//6\nf 5649//1 5652//1 5650//1\nf 5653//2 5654//2 5656//2\nf 5653//5 5649//5 5654//5\nf 5650//4 5651//4 5654//4\nf 5651//3 5652//3 5655//3\nf 5653//6 5656//6 5649//6\nf 5657//1 5660//1 5658//1\nf 5661//2 5662//2 5664//2\nf 5661//5 5657//5 5662//5\nf 5658//4 5659//4 5662//4\nf 5659//3 5660//3 5663//3\nf 5661//6 5664//6 5657//6\nf 5665//1 5668//1 5666//1\nf 5669//2 5670//2 5672//2\nf 5669//5 5665//5 5670//5\nf 5666//4 5667//4 5670//4\nf 5667//3 5668//3 5671//3\nf 5669//6 5672//6 5665//6\nf 5673//1 5676//1 5674//1\nf 5677//2 5678//2 5680//2\nf 5677//5 5673//5 5678//5\nf 5674//4 5675//4 5678//4\nf 5675//3 5676//3 5679//3\nf 5677//6 5680//6 5673//6\nf 5681//1 5684//1 5682//1\nf 5688//2 5685//2 5687//2\nf 5681//5 5682//5 5685//5\nf 5686//4 5682//4 5687//4\nf 5683//3 5684//3 5687//3\nf 5685//6 5688//6 5681//6\nf 5689//1 5692//1 5690//1\nf 5696//2 5693//2 5695//2\nf 5693//5 5689//5 5694//5\nf 5694//4 5690//4 5695//4\nf 5691//3 5692//3 5695//3\nf 5689//6 5693//6 5692//6\nf 5697//1 5700//1 5698//1\nf 5704//2 5701//2 5703//2\nf 5701//5 5697//5 5702//5\nf 5702//4 5698//4 5703//4\nf 5699//3 5700//3 5703//3\nf 5697//6 5701//6 5700//6\nf 5705//1 5708//1 5706//1\nf 5709//2 5710//2 5712//2\nf 5709//5 5705//5 5710//5\nf 5710//4 5706//4 5711//4\nf 5707//3 5708//3 5711//3\nf 5709//6 5712//6 5705//6\nf 5713//1 5716//1 5714//1\nf 5717//2 5718//2 5720//2\nf 5717//5 5713//5 5718//5\nf 5718//4 5714//4 5719//4\nf 5715//3 5716//3 5719//3\nf 5713//6 5717//6 5716//6\nf 5721//1 5724//1 5722//1\nf 5725//2 5726//2 5728//2\nf 5725//5 5721//5 5726//5\nf 5722//4 5723//4 5726//4\nf 5723//3 5724//3 5727//3\nf 5725//6 5728//6 5721//6\nf 5729//1 5732//1 5730//1\nf 5733//2 5734//2 5736//2\nf 5733//5 5729//5 5734//5\nf 5730//4 5731//4 5734//4\nf 5731//3 5732//3 5735//3\nf 5733//6 5736//6 5729//6\nf 5737//1 5740//1 5738//1\nf 5741//2 5742//2 5744//2\nf 5741//5 5737//5 5742//5\nf 5738//4 5739//4 5742//4\nf 5739//3 5740//3 5743//3\nf 5741//6 5744//6 5737//6\nf 5745//1 5748//1 5746//1\nf 5749//2 5750//2 5752//2\nf 5749//5 5745//5 5750//5\nf 5746//4 5747//4 5750//4\nf 5747//3 5748//3 5751//3\nf 5749//6 5752//6 5745//6\nf 5753//1 5756//1 5754//1\nf 5757//2 5758//2 5760//2\nf 5757//5 5753//5 5758//5\nf 5754//4 5755//4 5758//4\nf 5755//3 5756//3 5759//3\nf 5757//6 5760//6 5753//6\nf 5762//1 5761//1 5763//1\nf 5768//2 5765//2 5767//2\nf 5761//5 5762//5 5765//5\nf 5766//4 5762//4 5767//4\nf 5763//3 5764//3 5767//3\nf 5765//6 5768//6 5761//6\nf 5769//1 5772//1 5770//1\nf 5776//2 5773//2 5775//2\nf 5769//5 5770//5 5773//5\nf 5774//4 5770//4 5775//4\nf 5771//3 5772//3 5775//3\nf 5769//6 5773//6 5772//6\nf 5777//1 5780//1 5778//1\nf 5784//2 5781//2 5783//2\nf 5781//5 5777//5 5782//5\nf 5782//4 5778//4 5783//4\nf 5779//3 5780//3 5783//3\nf 5777//6 5781//6 5780//6\nf 5785//1 5788//1 5786//1\nf 5792//2 5789//2 5791//2\nf 5789//5 5785//5 5790//5\nf 5790//4 5786//4 5791//4\nf 5787//3 5788//3 5791//3\nf 5789//6 5792//6 5785//6\nf 5793//1 5796//1 5794//1\nf 5800//2 5797//2 5799//2\nf 5793//5 5794//5 5797//5\nf 5798//4 5794//4 5799//4\nf 5795//3 5796//3 5799//3\nf 5793//6 5797//6 5796//6\nf 5801//1 5804//1 5802//1\nf 5805//2 5806//2 5808//2\nf 5805//5 5801//5 5806//5\nf 5802//4 5803//4 5806//4\nf 5803//3 5804//3 5807//3\nf 5805//6 5808//6 5801//6\nf 5809//1 5812//1 5810//1\nf 5813//2 5814//2 5816//2\nf 5813//5 5809//5 5814//5\nf 5810//4 5811//4 5814//4\nf 5811//3 5812//3 5815//3\nf 5813//6 5816//6 5809//6\nf 5817//1 5820//1 5818//1\nf 5821//2 5822//2 5824//2\nf 5821//5 5817//5 5822//5\nf 5818//4 5819//4 5822//4\nf 5819//3 5820//3 5823//3\nf 5821//6 5824//6 5817//6\nf 5825//1 5828//1 5826//1\nf 5829//2 5830//2 5832//2\nf 5829//5 5825//5 5830//5\nf 5826//4 5827//4 5830//4\nf 5827//3 5828//3 5831//3\nf 5829//6 5832//6 5825//6\nf 5833//1 5836//1 5834//1\nf 5837//2 5838//2 5840//2\nf 5837//5 5833//5 5838//5\nf 5834//4 5835//4 5838//4\nf 5835//3 5836//3 5839//3\nf 5837//6 5840//6 5833//6\nf 5842//1 5841//1 5843//1\nf 5845//2 5846//2 5848//2\nf 5845//5 5841//5 5846//5\nf 5846//4 5842//4 5847//4\nf 5843//3 5844//3 5847//3\nf 5845//6 5848//6 5841//6\nf 5850//1 5849//1 5851//1\nf 5853//2 5854//2 5856//2\nf 5853//5 5849//5 5854//5\nf 5854//4 5850//4 5855//4\nf 5851//3 5852//3 5855//3\nf 5849//6 5853//6 5852//6\nf 5857//1 5860//1 5858//1\nf 5861//2 5862//2 5864//2\nf 5861//5 5857//5 5862//5\nf 5862//4 5858//4 5863//4\nf 5859//3 5860//3 5863//3\nf 5857//6 5861//6 5860//6\nf 5865//1 5868//1 5866//1\nf 5869//2 5870//2 5872//2\nf 5869//5 5865//5 5870//5\nf 5870//4 5866//4 5871//4\nf 5867//3 5868//3 5871//3\nf 5869//6 5872//6 5865//6\nf 5873//1 5876//1 5874//1\nf 5877//2 5878//2 5880//2\nf 5877//5 5873//5 5878//5\nf 5878//4 5874//4 5879//4\nf 5875//3 5876//3 5879//3\nf 5873//6 5877//6 5876//6\nf 5881//1 5884//1 5882//1\nf 5885//2 5886//2 5888//2\nf 5885//5 5881//5 5886//5\nf 5882//4 5883//4 5886//4\nf 5883//3 5884//3 5887//3\nf 5885//6 5888//6 5881//6\nf 5889//1 5892//1 5890//1\nf 5893//2 5894//2 5896//2\nf 5893//5 5889//5 5894//5\nf 5890//4 5891//4 5894//4\nf 5891//3 5892//3 5895//3\nf 5893//6 5896//6 5889//6\nf 5897//1 5900//1 5898//1\nf 5901//2 5902//2 5904//2\nf 5901//5 5897//5 5902//5\nf 5898//4 5899//4 5902//4\nf 5899//3 5900//3 5903//3\nf 5901//6 5904//6 5897//6\nf 5905//1 5908//1 5906//1\nf 5909//2 5910//2 5912//2\nf 5909//5 5905//5 5910//5\nf 5906//4 5907//4 5910//4\nf 5907//3 5908//3 5911//3\nf 5909//6 5912//6 5905//6\nf 5913//1 5916//1 5914//1\nf 5917//2 5918//2 5920//2\nf 5917//5 5913//5 5918//5\nf 5914//4 5915//4 5918//4\nf 5915//3 5916//3 5919//3\nf 5917//6 5920//6 5913//6\nf 5922//1 5921//1 5923//1\nf 5925//2 5926//2 5928//2\nf 5925//5 5921//5 5926//5\nf 5926//4 5922//4 5927//4\nf 5923//3 5924//3 5927//3\nf 5925//6 5928//6 5921//6\nf 5930//1 5929//1 5931//1\nf 5933//2 5934//2 5936//2\nf 5933//5 5929//5 5934//5\nf 5934//4 5930//4 5935//4\nf 5931//3 5932//3 5935//3\nf 5929//6 5933//6 5932//6\nf 5937//1 5940//1 5938//1\nf 5941//2 5942//2 5944//2\nf 5941//5 5937//5 5942//5\nf 5942//4 5938//4 5943//4\nf 5939//3 5940//3 5943//3\nf 5937//6 5941//6 5940//6\nf 5945//1 5948//1 5946//1\nf 5949//2 5950//2 5952//2\nf 5949//5 5945//5 5950//5\nf 5950//4 5946//4 5951//4\nf 5947//3 5948//3 5951//3\nf 5949//6 5952//6 5945//6\nf 5953//1 5956//1 5954//1\nf 5957//2 5958//2 5960//2\nf 5957//5 5953//5 5958//5\nf 5958//4 5954//4 5959//4\nf 5955//3 5956//3 5959//3\nf 5953//6 5957//6 5956//6\nf 5961//1 5964//1 5962//1\nf 5965//2 5966//2 5968//2\nf 5965//5 5961//5 5966//5\nf 5962//4 5963//4 5966//4\nf 5963//3 5964//3 5967//3\nf 5965//6 5968//6 5961//6\nf 5969//1 5972//1 5970//1\nf 5973//2 5974//2 5976//2\nf 5973//5 5969//5 5974//5\nf 5970//4 5971//4 5974//4\nf 5971//3 5972//3 5975//3\nf 5973//6 5976//6 5969//6\nf 5977//1 5980//1 5978//1\nf 5981//2 5982//2 5984//2\nf 5981//5 5977//5 5982//5\nf 5978//4 5979//4 5982//4\nf 5979//3 5980//3 5983//3\nf 5981//6 5984//6 5977//6\nf 5985//1 5988//1 5986//1\nf 5989//2 5990//2 5992//2\nf 5989//5 5985//5 5990//5\nf 5986//4 5987//4 5990//4\nf 5987//3 5988//3 5991//3\nf 5989//6 5992//6 5985//6\nf 5993//1 5996//1 5994//1\nf 5997//2 5998//2 6000//2\nf 5997//5 5993//5 5998//5\nf 5994//4 5995//4 5998//4\nf 5995//3 5996//3 5999//3\nf 5997//6 6000//6 5993//6\nf 6002//1 6001//1 6003//1\nf 6008//2 6005//2 6007//2\nf 6001//5 6002//5 6005//5\nf 6006//4 6002//4 6007//4\nf 6003//3 6004//3 6007//3\nf 6005//6 6008//6 6001//6\nf 6010//1 6009//1 6011//1\nf 6016//2 6013//2 6015//2\nf 6009//5 6010//5 6013//5\nf 6014//4 6010//4 6015//4\nf 6011//3 6012//3 6015//3\nf 6009//6 6013//6 6012//6\nf 6017//1 6020//1 6018//1\nf 6024//2 6021//2 6023//2\nf 6017//5 6018//5 6021//5\nf 6022//4 6018//4 6023//4\nf 6019//3 6020//3 6023//3\nf 6017//6 6021//6 6020//6\nf 6025//1 6028//1 6026//1\nf 6032//2 6029//2 6031//2\nf 6025//5 6026//5 6029//5\nf 6030//4 6026//4 6031//4\nf 6027//3 6028//3 6031//3\nf 6029//6 6032//6 6025//6\nf 6033//1 6036//1 6034//1\nf 6040//2 6037//2 6039//2\nf 6033//5 6034//5 6037//5\nf 6038//4 6034//4 6039//4\nf 6035//3 6036//3 6039//3\nf 6033//6 6037//6 6036//6\nf 6041//1 6044//1 6042//1\nf 6045//2 6046//2 6048//2\nf 6041//5 6042//5 6045//5\nf 6042//4 6043//4 6046//4\nf 6043//3 6044//3 6047//3\nf 6045//6 6048//6 6041//6\nf 6049//1 6052//1 6050//1\nf 6053//2 6054//2 6056//2\nf 6049//5 6050//5 6053//5\nf 6050//4 6051//4 6054//4\nf 6051//3 6052//3 6055//3\nf 6053//6 6056//6 6049//6\nf 6057//1 6060//1 6058//1\nf 6061//2 6062//2 6064//2\nf 6057//5 6058//5 6061//5\nf 6058//4 6059//4 6062//4\nf 6059//3 6060//3 6063//3\nf 6061//6 6064//6 6057//6\nf 6065//1 6068//1 6066//1\nf 6069//2 6070//2 6072//2\nf 6065//5 6066//5 6069//5\nf 6066//4 6067//4 6070//4\nf 6067//3 6068//3 6071//3\nf 6069//6 6072//6 6065//6\nf 6073//1 6076//1 6074//1\nf 6077//2 6078//2 6080//2\nf 6073//5 6074//5 6077//5\nf 6074//4 6075//4 6078//4\nf 6075//3 6076//3 6079//3\nf 6077//6 6080//6 6073//6\nf 6082//1 6081//1 6083//1\nf 6088//2 6085//2 6087//2\nf 6081//5 6082//5 6085//5\nf 6086//4 6082//4 6087//4\nf 6083//3 6084//3 6087//3\nf 6085//6 6088//6 6081//6\nf 6090//1 6089//1 6091//1\nf 6096//2 6093//2 6095//2\nf 6089//5 6090//5 6093//5\nf 6094//4 6090//4 6095//4\nf 6091//3 6092//3 6095//3\nf 6089//6 6093//6 6092//6\nf 6097//1 6100//1 6098//1\nf 6104//2 6101//2 6103//2\nf 6097//5 6098//5 6101//5\nf 6102//4 6098//4 6103//4\nf 6099//3 6100//3 6103//3\nf 6097//6 6101//6 6100//6\nf 6105//1 6108//1 6106//1\nf 6112//2 6109//2 6111//2\nf 6105//5 6106//5 6109//5\nf 6110//4 6106//4 6111//4\nf 6107//3 6108//3 6111//3\nf 6109//6 6112//6 6105//6\nf 6113//1 6116//1 6114//1\nf 6120//2 6117//2 6119//2\nf 6113//5 6114//5 6117//5\nf 6118//4 6114//4 6119//4\nf 6115//3 6116//3 6119//3\nf 6113//6 6117//6 6116//6\nf 6121//1 6124//1 6122//1\nf 6125//2 6126//2 6128//2\nf 6121//5 6122//5 6125//5\nf 6122//4 6123//4 6126//4\nf 6123//3 6124//3 6127//3\nf 6125//6 6128//6 6121//6\nf 6129//1 6132//1 6130//1\nf 6133//2 6134//2 6136//2\nf 6129//5 6130//5 6133//5\nf 6130//4 6131//4 6134//4\nf 6131//3 6132//3 6135//3\nf 6133//6 6136//6 6129//6\nf 6137//1 6140//1 6138//1\nf 6141//2 6142//2 6144//2\nf 6137//5 6138//5 6141//5\nf 6138//4 6139//4 6142//4\nf 6139//3 6140//3 6143//3\nf 6141//6 6144//6 6137//6\nf 6145//1 6148//1 6146//1\nf 6149//2 6150//2 6152//2\nf 6145//5 6146//5 6149//5\nf 6146//4 6147//4 6150//4\nf 6147//3 6148//3 6151//3\nf 6149//6 6152//6 6145//6\nf 6153//1 6156//1 6154//1\nf 6157//2 6158//2 6160//2\nf 6153//5 6154//5 6157//5\nf 6154//4 6155//4 6158//4\nf 6155//3 6156//3 6159//3\nf 6157//6 6160//6 6153//6\nf 6162//1 6161//1 6163//1\nf 6168//2 6165//2 6167//2\nf 6161//5 6162//5 6165//5\nf 6166//4 6162//4 6167//4\nf 6163//3 6164//3 6167//3\nf 6165//6 6168//6 6161//6\nf 6170//1 6169//1 6171//1\nf 6176//2 6173//2 6175//2\nf 6169//5 6170//5 6173//5\nf 6174//4 6170//4 6175//4\nf 6171//3 6172//3 6175//3\nf 6169//6 6173//6 6172//6\nf 6177//1 6180//1 6178//1\nf 6184//2 6181//2 6183//2\nf 6177//5 6178//5 6181//5\nf 6182//4 6178//4 6183//4\nf 6179//3 6180//3 6183//3\nf 6177//6 6181//6 6180//6\nf 6185//1 6188//1 6186//1\nf 6192//2 6189//2 6191//2\nf 6185//5 6186//5 6189//5\nf 6190//4 6186//4 6191//4\nf 6187//3 6188//3 6191//3\nf 6189//6 6192//6 6185//6\nf 6193//1 6196//1 6194//1\nf 6200//2 6197//2 6199//2\nf 6193//5 6194//5 6197//5\nf 6198//4 6194//4 6199//4\nf 6195//3 6196//3 6199//3\nf 6193//6 6197//6 6196//6\nf 6201//1 6204//1 6202//1\nf 6205//2 6206//2 6208//2\nf 6201//5 6202//5 6205//5\nf 6202//4 6203//4 6206//4\nf 6203//3 6204//3 6207//3\nf 6205//6 6208//6 6201//6\nf 6209//1 6212//1 6210//1\nf 6213//2 6214//2 6216//2\nf 6209//5 6210//5 6213//5\nf 6210//4 6211//4 6214//4\nf 6211//3 6212//3 6215//3\nf 6213//6 6216//6 6209//6\nf 6217//1 6220//1 6218//1\nf 6221//2 6222//2 6224//2\nf 6217//5 6218//5 6221//5\nf 6218//4 6219//4 6222//4\nf 6219//3 6220//3 6223//3\nf 6221//6 6224//6 6217//6\nf 6225//1 6228//1 6226//1\nf 6229//2 6230//2 6232//2\nf 6225//5 6226//5 6229//5\nf 6226//4 6227//4 6230//4\nf 6227//3 6228//3 6231//3\nf 6229//6 6232//6 6225//6\nf 6233//1 6236//1 6234//1\nf 6237//2 6238//2 6240//2\nf 6233//5 6234//5 6237//5\nf 6234//4 6235//4 6238//4\nf 6235//3 6236//3 6239//3\nf 6237//6 6240//6 6233//6\nf 6242//1 6241//1 6243//1\nf 6248//2 6245//2 6247//2\nf 6241//5 6242//5 6245//5\nf 6246//4 6242//4 6247//4\nf 6243//3 6244//3 6247//3\nf 6245//6 6248//6 6241//6\nf 6250//1 6249//1 6251//1\nf 6256//2 6253//2 6255//2\nf 6249//5 6250//5 6253//5\nf 6254//4 6250//4 6255//4\nf 6251//3 6252//3 6255//3\nf 6249//6 6253//6 6252//6\nf 6257//1 6260//1 6258//1\nf 6264//2 6261//2 6263//2\nf 6257//5 6258//5 6261//5\nf 6262//4 6258//4 6263//4\nf 6259//3 6260//3 6263//3\nf 6257//6 6261//6 6260//6\nf 6265//1 6268//1 6266//1\nf 6272//2 6269//2 6271//2\nf 6265//5 6266//5 6269//5\nf 6270//4 6266//4 6271//4\nf 6267//3 6268//3 6271//3\nf 6269//6 6272//6 6265//6\nf 6273//1 6276//1 6274//1\nf 6280//2 6277//2 6279//2\nf 6273//5 6274//5 6277//5\nf 6278//4 6274//4 6279//4\nf 6275//3 6276//3 6279//3\nf 6273//6 6277//6 6276//6\nf 6281//1 6284//1 6282//1\nf 6285//2 6286//2 6288//2\nf 6281//5 6282//5 6285//5\nf 6282//4 6283//4 6286//4\nf 6283//3 6284//3 6287//3\nf 6285//6 6288//6 6281//6\nf 6289//1 6292//1 6290//1\nf 6293//2 6294//2 6296//2\nf 6289//5 6290//5 6293//5\nf 6290//4 6291//4 6294//4\nf 6291//3 6292//3 6295//3\nf 6293//6 6296//6 6289//6\nf 6297//1 6300//1 6298//1\nf 6301//2 6302//2 6304//2\nf 6297//5 6298//5 6301//5\nf 6298//4 6299//4 6302//4\nf 6299//3 6300//3 6303//3\nf 6301//6 6304//6 6297//6\nf 6305//1 6308//1 6306//1\nf 6309//2 6310//2 6312//2\nf 6305//5 6306//5 6309//5\nf 6306//4 6307//4 6310//4\nf 6307//3 6308//3 6311//3\nf 6309//6 6312//6 6305//6\nf 6313//1 6316//1 6314//1\nf 6317//2 6318//2 6320//2\nf 6313//5 6314//5 6317//5\nf 6314//4 6315//4 6318//4\nf 6315//3 6316//3 6319//3\nf 6317//6 6320//6 6313//6\nf 6322//1 6321//1 6323//1\nf 6328//2 6325//2 6327//2\nf 6321//5 6322//5 6325//5\nf 6326//4 6322//4 6327//4\nf 6323//3 6324//3 6327//3\nf 6325//6 6328//6 6321//6\nf 6330//1 6329//1 6331//1\nf 6336//2 6333//2 6335//2\nf 6329//5 6330//5 6333//5\nf 6334//4 6330//4 6335//4\nf 6331//3 6332//3 6335//3\nf 6329//6 6333//6 6332//6\nf 6337//1 6340//1 6338//1\nf 6344//2 6341//2 6343//2\nf 6337//5 6338//5 6341//5\nf 6342//4 6338//4 6343//4\nf 6339//3 6340//3 6343//3\nf 6337//6 6341//6 6340//6\nf 6345//1 6348//1 6346//1\nf 6352//2 6349//2 6351//2\nf 6345//5 6346//5 6349//5\nf 6350//4 6346//4 6351//4\nf 6347//3 6348//3 6351//3\nf 6349//6 6352//6 6345//6\nf 6353//1 6356//1 6354//1\nf 6360//2 6357//2 6359//2\nf 6353//5 6354//5 6357//5\nf 6358//4 6354//4 6359//4\nf 6355//3 6356//3 6359//3\nf 6353//6 6357//6 6356//6\nf 6361//1 6364//1 6362//1\nf 6365//2 6366//2 6368//2\nf 6361//5 6362//5 6365//5\nf 6362//4 6363//4 6366//4\nf 6363//3 6364//3 6367//3\nf 6365//6 6368//6 6361//6\nf 6369//1 6372//1 6370//1\nf 6373//2 6374//2 6376//2\nf 6369//5 6370//5 6373//5\nf 6370//4 6371//4 6374//4\nf 6371//3 6372//3 6375//3\nf 6373//6 6376//6 6369//6\nf 6377//1 6380//1 6378//1\nf 6381//2 6382//2 6384//2\nf 6377//5 6378//5 6381//5\nf 6378//4 6379//4 6382//4\nf 6379//3 6380//3 6383//3\nf 6381//6 6384//6 6377//6\nf 6385//1 6388//1 6386//1\nf 6389//2 6390//2 6392//2\nf 6385//5 6386//5 6389//5\nf 6386//4 6387//4 6390//4\nf 6387//3 6388//3 6391//3\nf 6389//6 6392//6 6385//6\nf 6393//1 6396//1 6394//1\nf 6397//2 6398//2 6400//2\nf 6393//5 6394//5 6397//5\nf 6394//4 6395//4 6398//4\nf 6395//3 6396//3 6399//3\nf 6397//6 6400//6 6393//6\nf 6401//1 6402//1 6404//1\nf 6405//2 6408//2 6406//2\nf 6402//3 6401//3 6406//3\nf 6403//4 6402//4 6407//4\nf 6403//5 6407//5 6404//5\nf 6405//6 6401//6 6408//6\nf 6409//1 6410//1 6412//1\nf 6414//2 6413//2 6415//2\nf 6410//3 6409//3 6414//3\nf 6411//4 6410//4 6415//4\nf 6411//5 6415//5 6412//5\nf 6413//6 6409//6 6416//6\nf 6417//1 6418//1 6420//1\nf 6421//2 6424//2 6422//2\nf 6418//3 6417//3 6422//3\nf 6419//4 6418//4 6423//4\nf 6419//5 6423//5 6420//5\nf 6424//6 6421//6 6420//6\nf 6425//1 6426//1 6428//1\nf 6429//2 6432//2 6430//2\nf 6426//3 6425//3 6430//3\nf 6427//4 6426//4 6431//4\nf 6427//5 6431//5 6428//5\nf 6429//6 6425//6 6432//6\nf 6433//1 6434//1 6436//1\nf 6438//2 6437//2 6439//2\nf 6434//3 6433//3 6438//3\nf 6435//4 6434//4 6439//4\nf 6435//5 6439//5 6436//5\nf 6440//6 6437//6 6436//6\nf 6441//1 6442//1 6444//1\nf 6445//2 6448//2 6446//2\nf 6442//3 6441//3 6446//3\nf 6442//4 6446//4 6443//4\nf 6443//5 6447//5 6444//5\nf 6445//6 6441//6 6448//6\nf 6449//1 6450//1 6452//1\nf 6453//2 6456//2 6454//2\nf 6450//3 6449//3 6454//3\nf 6450//4 6454//4 6451//4\nf 6451//5 6455//5 6452//5\nf 6453//6 6449//6 6456//6\nf 6457//1 6458//1 6460//1\nf 6461//2 6464//2 6462//2\nf 6458//3 6457//3 6462//3\nf 6458//4 6462//4 6459//4\nf 6459//5 6463//5 6460//5\nf 6461//6 6457//6 6464//6\nf 6465//1 6466//1 6468//1\nf 6469//2 6472//2 6470//2\nf 6466//3 6465//3 6470//3\nf 6466//4 6470//4 6467//4\nf 6467//5 6471//5 6468//5\nf 6469//6 6465//6 6472//6\nf 6473//1 6474//1 6476//1\nf 6477//2 6480//2 6478//2\nf 6474//3 6473//3 6478//3\nf 6474//4 6478//4 6475//4\nf 6475//5 6479//5 6476//5\nf 6477//6 6473//6 6480//6\nf 6481//1 6482//1 6484//1\nf 6485//2 6488//2 6486//2\nf 6481//3 6485//3 6482//3\nf 6483//4 6482//4 6487//4\nf 6483//5 6487//5 6484//5\nf 6485//6 6481//6 6488//6\nf 6489//1 6490//1 6492//1\nf 6494//2 6493//2 6495//2\nf 6490//3 6489//3 6494//3\nf 6491//4 6490//4 6495//4\nf 6491//5 6495//5 6492//5\nf 6493//6 6489//6 6496//6\nf 6497//1 6498//1 6500//1\nf 6501//2 6504//2 6502//2\nf 6498//3 6497//3 6502//3\nf 6499//4 6498//4 6503//4\nf 6499//5 6503//5 6500//5\nf 6504//6 6501//6 6500//6\nf 6505//1 6506//1 6508//1\nf 6509//2 6512//2 6510//2\nf 6506//3 6505//3 6510//3\nf 6507//4 6506//4 6511//4\nf 6507//5 6511//5 6508//5\nf 6509//6 6505//6 6512//6\nf 6513//1 6514//1 6516//1\nf 6518//2 6517//2 6519//2\nf 6514//3 6513//3 6518//3\nf 6515//4 6514//4 6519//4\nf 6515//5 6519//5 6516//5\nf 6520//6 6517//6 6516//6\nf 6521//1 6522//1 6524//1\nf 6525//2 6528//2 6526//2\nf 6522//3 6521//3 6526//3\nf 6522//4 6526//4 6523//4\nf 6523//5 6527//5 6524//5\nf 6525//6 6521//6 6528//6\nf 6529//1 6530//1 6532//1\nf 6533//2 6536//2 6534//2\nf 6530//3 6529//3 6534//3\nf 6530//4 6534//4 6531//4\nf 6531//5 6535//5 6532//5\nf 6533//6 6529//6 6536//6\nf 6537//1 6538//1 6540//1\nf 6541//2 6544//2 6542//2\nf 6538//3 6537//3 6542//3\nf 6538//4 6542//4 6539//4\nf 6539//5 6543//5 6540//5\nf 6541//6 6537//6 6544//6\nf 6545//1 6546//1 6548//1\nf 6549//2 6552//2 6550//2\nf 6546//3 6545//3 6550//3\nf 6546//4 6550//4 6547//4\nf 6547//5 6551//5 6548//5\nf 6549//6 6545//6 6552//6\nf 6553//1 6554//1 6556//1\nf 6557//2 6560//2 6558//2\nf 6554//3 6553//3 6558//3\nf 6554//4 6558//4 6555//4\nf 6555//5 6559//5 6556//5\nf 6557//6 6553//6 6560//6\nf 6561//1 6562//1 6564//1\nf 6566//2 6565//2 6567//2\nf 6561//3 6565//3 6562//3\nf 6563//4 6562//4 6567//4\nf 6563//5 6567//5 6564//5\nf 6565//6 6561//6 6568//6\nf 6569//1 6570//1 6572//1\nf 6574//2 6573//2 6575//2\nf 6569//3 6573//3 6570//3\nf 6571//4 6570//4 6575//4\nf 6571//5 6575//5 6572//5\nf 6573//6 6569//6 6576//6\nf 6577//1 6578//1 6580//1\nf 6582//2 6581//2 6583//2\nf 6578//3 6577//3 6582//3\nf 6579//4 6578//4 6583//4\nf 6579//5 6583//5 6580//5\nf 6584//6 6581//6 6580//6\nf 6585//1 6586//1 6588//1\nf 6590//2 6589//2 6591//2\nf 6586//3 6585//3 6590//3\nf 6587//4 6586//4 6591//4\nf 6587//5 6591//5 6588//5\nf 6589//6 6585//6 6592//6\nf 6593//1 6594//1 6596//1\nf 6598//2 6597//2 6599//2\nf 6593//3 6597//3 6594//3\nf 6595//4 6594//4 6599//4\nf 6595//5 6599//5 6596//5\nf 6600//6 6597//6 6596//6\nf 6601//1 6602//1 6604//1\nf 6605//2 6608//2 6606//2\nf 6602//3 6601//3 6606//3\nf 6602//4 6606//4 6603//4\nf 6603//5 6607//5 6604//5\nf 6605//6 6601//6 6608//6\nf 6609//1 6610//1 6612//1\nf 6613//2 6616//2 6614//2\nf 6610//3 6609//3 6614//3\nf 6610//4 6614//4 6611//4\nf 6611//5 6615//5 6612//5\nf 6613//6 6609//6 6616//6\nf 6617//1 6618//1 6620//1\nf 6621//2 6624//2 6622//2\nf 6618//3 6617//3 6622//3\nf 6618//4 6622//4 6619//4\nf 6619//5 6623//5 6620//5\nf 6621//6 6617//6 6624//6\nf 6625//1 6626//1 6628//1\nf 6629//2 6632//2 6630//2\nf 6626//3 6625//3 6630//3\nf 6626//4 6630//4 6627//4\nf 6627//5 6631//5 6628//5\nf 6629//6 6625//6 6632//6\nf 6633//1 6634//1 6636//1\nf 6637//2 6640//2 6638//2\nf 6634//3 6633//3 6638//3\nf 6634//4 6638//4 6635//4\nf 6635//5 6639//5 6636//5\nf 6637//6 6633//6 6640//6\nf 6644//1 6641//1 6643//1\nf 6645//2 6648//2 6646//2\nf 6642//3 6641//3 6646//3\nf 6643//4 6642//4 6647//4\nf 6643//5 6647//5 6644//5\nf 6645//6 6641//6 6648//6\nf 6652//1 6649//1 6651//1\nf 6653//2 6656//2 6654//2\nf 6650//3 6649//3 6654//3\nf 6651//4 6650//4 6655//4\nf 6651//5 6655//5 6652//5\nf 6653//6 6649//6 6656//6\nf 6657//1 6658//1 6660//1\nf 6661//2 6664//2 6662//2\nf 6658//3 6657//3 6662//3\nf 6659//4 6658//4 6663//4\nf 6659//5 6663//5 6660//5\nf 6664//6 6661//6 6660//6\nf 6665//1 6666//1 6668//1\nf 6669//2 6672//2 6670//2\nf 6666//3 6665//3 6670//3\nf 6667//4 6666//4 6671//4\nf 6667//5 6671//5 6668//5\nf 6669//6 6665//6 6672//6\nf 6673//1 6674//1 6676//1\nf 6677//2 6680//2 6678//2\nf 6674//3 6673//3 6678//3\nf 6675//4 6674//4 6679//4\nf 6675//5 6679//5 6676//5\nf 6680//6 6677//6 6676//6\nf 6681//1 6682//1 6684//1\nf 6685//2 6688//2 6686//2\nf 6682//3 6681//3 6686//3\nf 6682//4 6686//4 6683//4\nf 6683//5 6687//5 6684//5\nf 6685//6 6681//6 6688//6\nf 6689//1 6690//1 6692//1\nf 6693//2 6696//2 6694//2\nf 6690//3 6689//3 6694//3\nf 6690//4 6694//4 6691//4\nf 6691//5 6695//5 6692//5\nf 6693//6 6689//6 6696//6\nf 6697//1 6698//1 6700//1\nf 6701//2 6704//2 6702//2\nf 6698//3 6697//3 6702//3\nf 6698//4 6702//4 6699//4\nf 6699//5 6703//5 6700//5\nf 6701//6 6697//6 6704//6\nf 6705//1 6706//1 6708//1\nf 6709//2 6712//2 6710//2\nf 6706//3 6705//3 6710//3\nf 6706//4 6710//4 6707//4\nf 6707//5 6711//5 6708//5\nf 6709//6 6705//6 6712//6\nf 6713//1 6714//1 6716//1\nf 6717//2 6720//2 6718//2\nf 6714//3 6713//3 6718//3\nf 6714//4 6718//4 6715//4\nf 6715//5 6719//5 6716//5\nf 6717//6 6713//6 6720//6\nf 6724//1 6721//1 6723//1\nf 6725//2 6728//2 6726//2\nf 6722//3 6721//3 6726//3\nf 6723//4 6722//4 6727//4\nf 6723//5 6727//5 6724//5\nf 6725//6 6721//6 6728//6\nf 6732//1 6729//1 6731//1\nf 6733//2 6736//2 6734//2\nf 6730//3 6729//3 6734//3\nf 6731//4 6730//4 6735//4\nf 6731//5 6735//5 6732//5\nf 6733//6 6729//6 6736//6\nf 6737//1 6738//1 6740//1\nf 6741//2 6744//2 6742//2\nf 6738//3 6737//3 6742//3\nf 6739//4 6738//4 6743//4\nf 6739//5 6743//5 6740//5\nf 6744//6 6741//6 6740//6\nf 6745//1 6746//1 6748//1\nf 6749//2 6752//2 6750//2\nf 6746//3 6745//3 6750//3\nf 6747//4 6746//4 6751//4\nf 6747//5 6751//5 6748//5\nf 6749//6 6745//6 6752//6\nf 6753//1 6754//1 6756//1\nf 6757//2 6760//2 6758//2\nf 6754//3 6753//3 6758//3\nf 6755//4 6754//4 6759//4\nf 6755//5 6759//5 6756//5\nf 6760//6 6757//6 6756//6\nf 6761//1 6762//1 6764//1\nf 6765//2 6768//2 6766//2\nf 6762//3 6761//3 6766//3\nf 6762//4 6766//4 6763//4\nf 6763//5 6767//5 6764//5\nf 6765//6 6761//6 6768//6\nf 6769//1 6770//1 6772//1\nf 6773//2 6776//2 6774//2\nf 6770//3 6769//3 6774//3\nf 6770//4 6774//4 6771//4\nf 6771//5 6775//5 6772//5\nf 6773//6 6769//6 6776//6\nf 6777//1 6778//1 6780//1\nf 6781//2 6784//2 6782//2\nf 6778//3 6777//3 6782//3\nf 6778//4 6782//4 6779//4\nf 6779//5 6783//5 6780//5\nf 6781//6 6777//6 6784//6\nf 6785//1 6786//1 6788//1\nf 6789//2 6792//2 6790//2\nf 6786//3 6785//3 6790//3\nf 6786//4 6790//4 6787//4\nf 6787//5 6791//5 6788//5\nf 6789//6 6785//6 6792//6\nf 6793//1 6794//1 6796//1\nf 6797//2 6800//2 6798//2\nf 6794//3 6793//3 6798//3\nf 6794//4 6798//4 6795//4\nf 6795//5 6799//5 6796//5\nf 6797//6 6793//6 6800//6\nf 6804//1 6801//1 6803//1\nf 6806//2 6805//2 6807//2\nf 6801//3 6805//3 6802//3\nf 6803//4 6802//4 6807//4\nf 6803//5 6807//5 6804//5\nf 6805//6 6801//6 6808//6\nf 6812//1 6809//1 6811//1\nf 6814//2 6813//2 6815//2\nf 6809//3 6813//3 6810//3\nf 6811//4 6810//4 6815//4\nf 6811//5 6815//5 6812//5\nf 6813//6 6809//6 6816//6\nf 6817//1 6818//1 6820//1\nf 6822//2 6821//2 6823//2\nf 6817//3 6821//3 6818//3\nf 6819//4 6818//4 6823//4\nf 6819//5 6823//5 6820//5\nf 6824//6 6821//6 6820//6\nf 6825//1 6826//1 6828//1\nf 6830//2 6829//2 6831//2\nf 6825//3 6829//3 6826//3\nf 6827//4 6826//4 6831//4\nf 6827//5 6831//5 6828//5\nf 6829//6 6825//6 6832//6\nf 6833//1 6834//1 6836//1\nf 6838//2 6837//2 6839//2\nf 6833//3 6837//3 6834//3\nf 6835//4 6834//4 6839//4\nf 6835//5 6839//5 6836//5\nf 6840//6 6837//6 6836//6\nf 6841//1 6842//1 6844//1\nf 6845//2 6848//2 6846//2\nf 6841//3 6845//3 6842//3\nf 6842//4 6846//4 6843//4\nf 6843//5 6847//5 6844//5\nf 6845//6 6841//6 6848//6\nf 6849//1 6850//1 6852//1\nf 6853//2 6856//2 6854//2\nf 6849//3 6853//3 6850//3\nf 6850//4 6854//4 6851//4\nf 6851//5 6855//5 6852//5\nf 6853//6 6849//6 6856//6\nf 6857//1 6858//1 6860//1\nf 6861//2 6864//2 6862//2\nf 6857//3 6861//3 6858//3\nf 6858//4 6862//4 6859//4\nf 6859//5 6863//5 6860//5\nf 6861//6 6857//6 6864//6\nf 6865//1 6866//1 6868//1\nf 6869//2 6872//2 6870//2\nf 6865//3 6869//3 6866//3\nf 6866//4 6870//4 6867//4\nf 6867//5 6871//5 6868//5\nf 6869//6 6865//6 6872//6\nf 6873//1 6874//1 6876//1\nf 6877//2 6880//2 6878//2\nf 6873//3 6877//3 6874//3\nf 6874//4 6878//4 6875//4\nf 6875//5 6879//5 6876//5\nf 6877//6 6873//6 6880//6\nf 6884//1 6881//1 6883//1\nf 6886//2 6885//2 6887//2\nf 6881//3 6885//3 6882//3\nf 6883//4 6882//4 6887//4\nf 6883//5 6887//5 6884//5\nf 6885//6 6881//6 6888//6\nf 6892//1 6889//1 6891//1\nf 6894//2 6893//2 6895//2\nf 6889//3 6893//3 6890//3\nf 6891//4 6890//4 6895//4\nf 6891//5 6895//5 6892//5\nf 6893//6 6889//6 6896//6\nf 6897//1 6898//1 6900//1\nf 6902//2 6901//2 6903//2\nf 6897//3 6901//3 6898//3\nf 6899//4 6898//4 6903//4\nf 6899//5 6903//5 6900//5\nf 6904//6 6901//6 6900//6\nf 6905//1 6906//1 6908//1\nf 6910//2 6909//2 6911//2\nf 6905//3 6909//3 6906//3\nf 6907//4 6906//4 6911//4\nf 6907//5 6911//5 6908//5\nf 6909//6 6905//6 6912//6\nf 6913//1 6914//1 6916//1\nf 6918//2 6917//2 6919//2\nf 6913//3 6917//3 6914//3\nf 6915//4 6914//4 6919//4\nf 6915//5 6919//5 6916//5\nf 6920//6 6917//6 6916//6\nf 6921//1 6922//1 6924//1\nf 6925//2 6928//2 6926//2\nf 6921//3 6925//3 6922//3\nf 6922//4 6926//4 6923//4\nf 6923//5 6927//5 6924//5\nf 6925//6 6921//6 6928//6\nf 6929//1 6930//1 6932//1\nf 6933//2 6936//2 6934//2\nf 6929//3 6933//3 6930//3\nf 6930//4 6934//4 6931//4\nf 6931//5 6935//5 6932//5\nf 6933//6 6929//6 6936//6\nf 6937//1 6938//1 6940//1\nf 6941//2 6944//2 6942//2\nf 6937//3 6941//3 6938//3\nf 6938//4 6942//4 6939//4\nf 6939//5 6943//5 6940//5\nf 6941//6 6937//6 6944//6\nf 6945//1 6946//1 6948//1\nf 6949//2 6952//2 6950//2\nf 6945//3 6949//3 6946//3\nf 6946//4 6950//4 6947//4\nf 6947//5 6951//5 6948//5\nf 6949//6 6945//6 6952//6\nf 6953//1 6954//1 6956//1\nf 6957//2 6960//2 6958//2\nf 6953//3 6957//3 6954//3\nf 6954//4 6958//4 6955//4\nf 6955//5 6959//5 6956//5\nf 6957//6 6953//6 6960//6\nf 6964//1 6961//1 6963//1\nf 6966//2 6965//2 6967//2\nf 6961//3 6965//3 6962//3\nf 6963//4 6962//4 6967//4\nf 6963//5 6967//5 6964//5\nf 6965//6 6961//6 6968//6\nf 6972//1 6969//1 6971//1\nf 6974//2 6973//2 6975//2\nf 6969//3 6973//3 6970//3\nf 6971//4 6970//4 6975//4\nf 6971//5 6975//5 6972//5\nf 6973//6 6969//6 6976//6\nf 6977//1 6978//1 6980//1\nf 6982//2 6981//2 6983//2\nf 6977//3 6981//3 6978//3\nf 6979//4 6978//4 6983//4\nf 6979//5 6983//5 6980//5\nf 6984//6 6981//6 6980//6\nf 6985//1 6986//1 6988//1\nf 6990//2 6989//2 6991//2\nf 6985//3 6989//3 6986//3\nf 6987//4 6986//4 6991//4\nf 6987//5 6991//5 6988//5\nf 6989//6 6985//6 6992//6\nf 6993//1 6994//1 6996//1\nf 6998//2 6997//2 6999//2\nf 6993//3 6997//3 6994//3\nf 6995//4 6994//4 6999//4\nf 6995//5 6999//5 6996//5\nf 7000//6 6997//6 6996//6\nf 7001//1 7002//1 7004//1\nf 7005//2 7008//2 7006//2\nf 7001//3 7005//3 7002//3\nf 7002//4 7006//4 7003//4\nf 7003//5 7007//5 7004//5\nf 7005//6 7001//6 7008//6\nf 7009//1 7010//1 7012//1\nf 7013//2 7016//2 7014//2\nf 7009//3 7013//3 7010//3\nf 7010//4 7014//4 7011//4\nf 7011//5 7015//5 7012//5\nf 7013//6 7009//6 7016//6\nf 7017//1 7018//1 7020//1\nf 7021//2 7024//2 7022//2\nf 7017//3 7021//3 7018//3\nf 7018//4 7022//4 7019//4\nf 7019//5 7023//5 7020//5\nf 7021//6 7017//6 7024//6\nf 7025//1 7026//1 7028//1\nf 7029//2 7032//2 7030//2\nf 7025//3 7029//3 7026//3\nf 7026//4 7030//4 7027//4\nf 7027//5 7031//5 7028//5\nf 7029//6 7025//6 7032//6\nf 7033//1 7034//1 7036//1\nf 7037//2 7040//2 7038//2\nf 7033//3 7037//3 7034//3\nf 7034//4 7038//4 7035//4\nf 7035//5 7039//5 7036//5\nf 7037//6 7033//6 7040//6\nf 7044//1 7041//1 7043//1\nf 7046//2 7045//2 7047//2\nf 7041//3 7045//3 7042//3\nf 7043//4 7042//4 7047//4\nf 7043//5 7047//5 7044//5\nf 7045//6 7041//6 7048//6\nf 7052//1 7049//1 7051//1\nf 7054//2 7053//2 7055//2\nf 7049//3 7053//3 7050//3\nf 7051//4 7050//4 7055//4\nf 7051//5 7055//5 7052//5\nf 7053//6 7049//6 7056//6\nf 7057//1 7058//1 7060//1\nf 7062//2 7061//2 7063//2\nf 7057//3 7061//3 7058//3\nf 7059//4 7058//4 7063//4\nf 7059//5 7063//5 7060//5\nf 7064//6 7061//6 7060//6\nf 7065//1 7066//1 7068//1\nf 7070//2 7069//2 7071//2\nf 7065//3 7069//3 7066//3\nf 7067//4 7066//4 7071//4\nf 7067//5 7071//5 7068//5\nf 7069//6 7065//6 7072//6\nf 7073//1 7074//1 7076//1\nf 7078//2 7077//2 7079//2\nf 7073//3 7077//3 7074//3\nf 7075//4 7074//4 7079//4\nf 7075//5 7079//5 7076//5\nf 7080//6 7077//6 7076//6\nf 7081//1 7082//1 7084//1\nf 7085//2 7088//2 7086//2\nf 7081//3 7085//3 7082//3\nf 7082//4 7086//4 7083//4\nf 7083//5 7087//5 7084//5\nf 7085//6 7081//6 7088//6\nf 7089//1 7090//1 7092//1\nf 7093//2 7096//2 7094//2\nf 7089//3 7093//3 7090//3\nf 7090//4 7094//4 7091//4\nf 7091//5 7095//5 7092//5\nf 7093//6 7089//6 7096//6\nf 7097//1 7098//1 7100//1\nf 7101//2 7104//2 7102//2\nf 7097//3 7101//3 7098//3\nf 7098//4 7102//4 7099//4\nf 7099//5 7103//5 7100//5\nf 7101//6 7097//6 7104//6\nf 7105//1 7106//1 7108//1\nf 7109//2 7112//2 7110//2\nf 7105//3 7109//3 7106//3\nf 7106//4 7110//4 7107//4\nf 7107//5 7111//5 7108//5\nf 7109//6 7105//6 7112//6\nf 7113//1 7114//1 7116//1\nf 7117//2 7120//2 7118//2\nf 7113//3 7117//3 7114//3\nf 7114//4 7118//4 7115//4\nf 7115//5 7119//5 7116//5\nf 7117//6 7113//6 7120//6\nf 7124//1 7121//1 7123//1\nf 7126//2 7125//2 7127//2\nf 7121//3 7125//3 7122//3\nf 7123//4 7122//4 7127//4\nf 7123//5 7127//5 7124//5\nf 7125//6 7121//6 7128//6\nf 7132//1 7129//1 7131//1\nf 7134//2 7133//2 7135//2\nf 7129//3 7133//3 7130//3\nf 7131//4 7130//4 7135//4\nf 7131//5 7135//5 7132//5\nf 7133//6 7129//6 7136//6\nf 7137//1 7138//1 7140//1\nf 7142//2 7141//2 7143//2\nf 7137//3 7141//3 7138//3\nf 7139//4 7138//4 7143//4\nf 7139//5 7143//5 7140//5\nf 7144//6 7141//6 7140//6\nf 7145//1 7146//1 7148//1\nf 7150//2 7149//2 7151//2\nf 7145//3 7149//3 7146//3\nf 7147//4 7146//4 7151//4\nf 7147//5 7151//5 7148//5\nf 7149//6 7145//6 7152//6\nf 7153//1 7154//1 7156//1\nf 7158//2 7157//2 7159//2\nf 7153//3 7157//3 7154//3\nf 7155//4 7154//4 7159//4\nf 7155//5 7159//5 7156//5\nf 7160//6 7157//6 7156//6\nf 7161//1 7162//1 7164//1\nf 7165//2 7168//2 7166//2\nf 7161//3 7165//3 7162//3\nf 7162//4 7166//4 7163//4\nf 7163//5 7167//5 7164//5\nf 7165//6 7161//6 7168//6\nf 7169//1 7170//1 7172//1\nf 7173//2 7176//2 7174//2\nf 7169//3 7173//3 7170//3\nf 7170//4 7174//4 7171//4\nf 7171//5 7175//5 7172//5\nf 7173//6 7169//6 7176//6\nf 7177//1 7178//1 7180//1\nf 7181//2 7184//2 7182//2\nf 7177//3 7181//3 7178//3\nf 7178//4 7182//4 7179//4\nf 7179//5 7183//5 7180//5\nf 7181//6 7177//6 7184//6\nf 7185//1 7186//1 7188//1\nf 7189//2 7192//2 7190//2\nf 7185//3 7189//3 7186//3\nf 7186//4 7190//4 7187//4\nf 7187//5 7191//5 7188//5\nf 7189//6 7185//6 7192//6\nf 7193//1 7194//1 7196//1\nf 7197//2 7200//2 7198//2\nf 7193//3 7197//3 7194//3\nf 7194//4 7198//4 7195//4\nf 7195//5 7199//5 7196//5\nf 7197//6 7193//6 7200//6\nf 7201//1 7204//1 7202//1\nf 7208//2 7205//2 7207//2\nf 7205//5 7201//5 7206//5\nf 7206//4 7202//4 7207//4\nf 7203//3 7204//3 7207//3\nf 7205//6 7208//6 7201//6\nf 7209//1 7212//1 7210//1\nf 7216//2 7213//2 7215//2\nf 7213//5 7209//5 7214//5\nf 7214//4 7210//4 7215//4\nf 7211//3 7212//3 7215//3\nf 7209//6 7213//6 7212//6\nf 7217//1 7220//1 7218//1\nf 7224//2 7221//2 7223//2\nf 7221//5 7217//5 7222//5\nf 7222//4 7218//4 7223//4\nf 7219//3 7220//3 7223//3\nf 7217//6 7221//6 7220//6\nf 7225//1 7228//1 7226//1\nf 7229//2 7230//2 7232//2\nf 7229//5 7225//5 7230//5\nf 7230//4 7226//4 7231//4\nf 7227//3 7228//3 7231//3\nf 7229//6 7232//6 7225//6\nf 7233//1 7236//1 7234//1\nf 7240//2 7237//2 7239//2\nf 7237//5 7233//5 7238//5\nf 7238//4 7234//4 7239//4\nf 7235//3 7236//3 7239//3\nf 7233//6 7237//6 7236//6\nf 7241//1 7244//1 7242//1\nf 7245//2 7246//2 7248//2\nf 7245//5 7241//5 7246//5\nf 7242//4 7243//4 7246//4\nf 7243//3 7244//3 7247//3\nf 7245//6 7248//6 7241//6\nf 7249//1 7252//1 7250//1\nf 7253//2 7254//2 7256//2\nf 7253//5 7249//5 7254//5\nf 7250//4 7251//4 7254//4\nf 7251//3 7252//3 7255//3\nf 7253//6 7256//6 7249//6\nf 7257//1 7260//1 7258//1\nf 7261//2 7262//2 7264//2\nf 7261//5 7257//5 7262//5\nf 7258//4 7259//4 7262//4\nf 7259//3 7260//3 7263//3\nf 7261//6 7264//6 7257//6\nf 7265//1 7268//1 7266//1\nf 7269//2 7270//2 7272//2\nf 7269//5 7265//5 7270//5\nf 7266//4 7267//4 7270//4\nf 7267//3 7268//3 7271//3\nf 7269//6 7272//6 7265//6\nf 7273//1 7276//1 7274//1\nf 7277//2 7278//2 7280//2\nf 7277//5 7273//5 7278//5\nf 7274//4 7275//4 7278//4\nf 7275//3 7276//3 7279//3\nf 7277//6 7280//6 7273//6\nf 7281//1 7284//1 7282//1\nf 7288//2 7285//2 7287//2\nf 7281//5 7282//5 7285//5\nf 7286//4 7282//4 7287//4\nf 7283//3 7284//3 7287//3\nf 7285//6 7288//6 7281//6\nf 7289//1 7292//1 7290//1\nf 7296//2 7293//2 7295//2\nf 7293//5 7289//5 7294//5\nf 7294//4 7290//4 7295//4\nf 7291//3 7292//3 7295//3\nf 7289//6 7293//6 7292//6\nf 7297//1 7300//1 7298//1\nf 7304//2 7301//2 7303//2\nf 7301//5 7297//5 7302//5\nf 7302//4 7298//4 7303//4\nf 7299//3 7300//3 7303//3\nf 7297//6 7301//6 7300//6\nf 7305//1 7308//1 7306//1\nf 7309//2 7310//2 7312//2\nf 7309//5 7305//5 7310//5\nf 7310//4 7306//4 7311//4\nf 7307//3 7308//3 7311//3\nf 7309//6 7312//6 7305//6\nf 7313//1 7316//1 7314//1\nf 7317//2 7318//2 7320//2\nf 7317//5 7313//5 7318//5\nf 7318//4 7314//4 7319//4\nf 7315//3 7316//3 7319//3\nf 7313//6 7317//6 7316//6\nf 7321//1 7324//1 7322//1\nf 7325//2 7326//2 7328//2\nf 7325//5 7321//5 7326//5\nf 7322//4 7323//4 7326//4\nf 7323//3 7324//3 7327//3\nf 7325//6 7328//6 7321//6\nf 7329//1 7332//1 7330//1\nf 7333//2 7334//2 7336//2\nf 7333//5 7329//5 7334//5\nf 7330//4 7331//4 7334//4\nf 7331//3 7332//3 7335//3\nf 7333//6 7336//6 7329//6\nf 7337//1 7340//1 7338//1\nf 7341//2 7342//2 7344//2\nf 7341//5 7337//5 7342//5\nf 7338//4 7339//4 7342//4\nf 7339//3 7340//3 7343//3\nf 7341//6 7344//6 7337//6\nf 7345//1 7348//1 7346//1\nf 7349//2 7350//2 7352//2\nf 7349//5 7345//5 7350//5\nf 7346//4 7347//4 7350//4\nf 7347//3 7348//3 7351//3\nf 7349//6 7352//6 7345//6\nf 7353//1 7356//1 7354//1\nf 7357//2 7358//2 7360//2\nf 7357//5 7353//5 7358//5\nf 7354//4 7355//4 7358//4\nf 7355//3 7356//3 7359//3\nf 7357//6 7360//6 7353//6\nf 7362//1 7361//1 7363//1\nf 7368//2 7365//2 7367//2\nf 7361//5 7362//5 7365//5\nf 7366//4 7362//4 7367//4\nf 7363//3 7364//3 7367//3\nf 7365//6 7368//6 7361//6\nf 7369//1 7372//1 7370//1\nf 7376//2 7373//2 7375//2\nf 7369//5 7370//5 7373//5\nf 7374//4 7370//4 7375//4\nf 7371//3 7372//3 7375//3\nf 7369//6 7373//6 7372//6\nf 7377//1 7380//1 7378//1\nf 7384//2 7381//2 7383//2\nf 7381//5 7377//5 7382//5\nf 7382//4 7378//4 7383//4\nf 7379//3 7380//3 7383//3\nf 7377//6 7381//6 7380//6\nf 7385//1 7388//1 7386//1\nf 7392//2 7389//2 7391//2\nf 7389//5 7385//5 7390//5\nf 7390//4 7386//4 7391//4\nf 7387//3 7388//3 7391//3\nf 7389//6 7392//6 7385//6\nf 7393//1 7396//1 7394//1\nf 7400//2 7397//2 7399//2\nf 7393//5 7394//5 7397//5\nf 7398//4 7394//4 7399//4\nf 7395//3 7396//3 7399//3\nf 7393//6 7397//6 7396//6\nf 7401//1 7404//1 7402//1\nf 7405//2 7406//2 7408//2\nf 7405//5 7401//5 7406//5\nf 7402//4 7403//4 7406//4\nf 7403//3 7404//3 7407//3\nf 7405//6 7408//6 7401//6\nf 7409//1 7412//1 7410//1\nf 7413//2 7414//2 7416//2\nf 7413//5 7409//5 7414//5\nf 7410//4 7411//4 7414//4\nf 7411//3 7412//3 7415//3\nf 7413//6 7416//6 7409//6\nf 7417//1 7420//1 7418//1\nf 7421//2 7422//2 7424//2\nf 7421//5 7417//5 7422//5\nf 7418//4 7419//4 7422//4\nf 7419//3 7420//3 7423//3\nf 7421//6 7424//6 7417//6\nf 7425//1 7428//1 7426//1\nf 7429//2 7430//2 7432//2\nf 7429//5 7425//5 7430//5\nf 7426//4 7427//4 7430//4\nf 7427//3 7428//3 7431//3\nf 7429//6 7432//6 7425//6\nf 7433//1 7436//1 7434//1\nf 7437//2 7438//2 7440//2\nf 7437//5 7433//5 7438//5\nf 7434//4 7435//4 7438//4\nf 7435//3 7436//3 7439//3\nf 7437//6 7440//6 7433//6\nf 7442//1 7441//1 7443//1\nf 7445//2 7446//2 7448//2\nf 7445//5 7441//5 7446//5\nf 7446//4 7442//4 7447//4\nf 7443//3 7444//3 7447//3\nf 7445//6 7448//6 7441//6\nf 7450//1 7449//1 7451//1\nf 7453//2 7454//2 7456//2\nf 7453//5 7449//5 7454//5\nf 7454//4 7450//4 7455//4\nf 7451//3 7452//3 7455//3\nf 7449//6 7453//6 7452//6\nf 7457//1 7460//1 7458//1\nf 7461//2 7462//2 7464//2\nf 7461//5 7457//5 7462//5\nf 7462//4 7458//4 7463//4\nf 7459//3 7460//3 7463//3\nf 7457//6 7461//6 7460//6\nf 7465//1 7468//1 7466//1\nf 7469//2 7470//2 7472//2\nf 7469//5 7465//5 7470//5\nf 7470//4 7466//4 7471//4\nf 7467//3 7468//3 7471//3\nf 7469//6 7472//6 7465//6\nf 7473//1 7476//1 7474//1\nf 7477//2 7478//2 7480//2\nf 7477//5 7473//5 7478//5\nf 7478//4 7474//4 7479//4\nf 7475//3 7476//3 7479//3\nf 7473//6 7477//6 7476//6\nf 7481//1 7484//1 7482//1\nf 7485//2 7486//2 7488//2\nf 7485//5 7481//5 7486//5\nf 7482//4 7483//4 7486//4\nf 7483//3 7484//3 7487//3\nf 7485//6 7488//6 7481//6\nf 7489//1 7492//1 7490//1\nf 7493//2 7494//2 7496//2\nf 7493//5 7489//5 7494//5\nf 7490//4 7491//4 7494//4\nf 7491//3 7492//3 7495//3\nf 7493//6 7496//6 7489//6\nf 7497//1 7500//1 7498//1\nf 7501//2 7502//2 7504//2\nf 7501//5 7497//5 7502//5\nf 7498//4 7499//4 7502//4\nf 7499//3 7500//3 7503//3\nf 7501//6 7504//6 7497//6\nf 7505//1 7508//1 7506//1\nf 7509//2 7510//2 7512//2\nf 7509//5 7505//5 7510//5\nf 7506//4 7507//4 7510//4\nf 7507//3 7508//3 7511//3\nf 7509//6 7512//6 7505//6\nf 7513//1 7516//1 7514//1\nf 7517//2 7518//2 7520//2\nf 7517//5 7513//5 7518//5\nf 7514//4 7515//4 7518//4\nf 7515//3 7516//3 7519//3\nf 7517//6 7520//6 7513//6\nf 7522//1 7521//1 7523//1\nf 7525//2 7526//2 7528//2\nf 7525//5 7521//5 7526//5\nf 7526//4 7522//4 7527//4\nf 7523//3 7524//3 7527//3\nf 7525//6 7528//6 7521//6\nf 7530//1 7529//1 7531//1\nf 7533//2 7534//2 7536//2\nf 7533//5 7529//5 7534//5\nf 7534//4 7530//4 7535//4\nf 7531//3 7532//3 7535//3\nf 7529//6 7533//6 7532//6\nf 7537//1 7540//1 7538//1\nf 7541//2 7542//2 7544//2\nf 7541//5 7537//5 7542//5\nf 7542//4 7538//4 7543//4\nf 7539//3 7540//3 7543//3\nf 7537//6 7541//6 7540//6\nf 7545//1 7548//1 7546//1\nf 7549//2 7550//2 7552//2\nf 7549//5 7545//5 7550//5\nf 7550//4 7546//4 7551//4\nf 7547//3 7548//3 7551//3\nf 7549//6 7552//6 7545//6\nf 7553//1 7556//1 7554//1\nf 7557//2 7558//2 7560//2\nf 7557//5 7553//5 7558//5\nf 7558//4 7554//4 7559//4\nf 7555//3 7556//3 7559//3\nf 7553//6 7557//6 7556//6\nf 7561//1 7564//1 7562//1\nf 7565//2 7566//2 7568//2\nf 7565//5 7561//5 7566//5\nf 7562//4 7563//4 7566//4\nf 7563//3 7564//3 7567//3\nf 7565//6 7568//6 7561//6\nf 7569//1 7572//1 7570//1\nf 7573//2 7574//2 7576//2\nf 7573//5 7569//5 7574//5\nf 7570//4 7571//4 7574//4\nf 7571//3 7572//3 7575//3\nf 7573//6 7576//6 7569//6\nf 7577//1 7580//1 7578//1\nf 7581//2 7582//2 7584//2\nf 7581//5 7577//5 7582//5\nf 7578//4 7579//4 7582//4\nf 7579//3 7580//3 7583//3\nf 7581//6 7584//6 7577//6\nf 7585//1 7588//1 7586//1\nf 7589//2 7590//2 7592//2\nf 7589//5 7585//5 7590//5\nf 7586//4 7587//4 7590//4\nf 7587//3 7588//3 7591//3\nf 7589//6 7592//6 7585//6\nf 7593//1 7596//1 7594//1\nf 7597//2 7598//2 7600//2\nf 7597//5 7593//5 7598//5\nf 7594//4 7595//4 7598//4\nf 7595//3 7596//3 7599//3\nf 7597//6 7600//6 7593//6\nf 7602//1 7601//1 7603//1\nf 7608//2 7605//2 7607//2\nf 7601//5 7602//5 7605//5\nf 7606//4 7602//4 7607//4\nf 7603//3 7604//3 7607//3\nf 7605//6 7608//6 7601//6\nf 7610//1 7609//1 7611//1\nf 7616//2 7613//2 7615//2\nf 7609//5 7610//5 7613//5\nf 7614//4 7610//4 7615//4\nf 7611//3 7612//3 7615//3\nf 7609//6 7613//6 7612//6\nf 7617//1 7620//1 7618//1\nf 7624//2 7621//2 7623//2\nf 7617//5 7618//5 7621//5\nf 7622//4 7618//4 7623//4\nf 7619//3 7620//3 7623//3\nf 7617//6 7621//6 7620//6\nf 7625//1 7628//1 7626//1\nf 7632//2 7629//2 7631//2\nf 7625//5 7626//5 7629//5\nf 7630//4 7626//4 7631//4\nf 7627//3 7628//3 7631//3\nf 7629//6 7632//6 7625//6\nf 7633//1 7636//1 7634//1\nf 7640//2 7637//2 7639//2\nf 7633//5 7634//5 7637//5\nf 7638//4 7634//4 7639//4\nf 7635//3 7636//3 7639//3\nf 7633//6 7637//6 7636//6\nf 7641//1 7644//1 7642//1\nf 7645//2 7646//2 7648//2\nf 7641//5 7642//5 7645//5\nf 7642//4 7643//4 7646//4\nf 7643//3 7644//3 7647//3\nf 7645//6 7648//6 7641//6\nf 7649//1 7652//1 7650//1\nf 7653//2 7654//2 7656//2\nf 7649//5 7650//5 7653//5\nf 7650//4 7651//4 7654//4\nf 7651//3 7652//3 7655//3\nf 7653//6 7656//6 7649//6\nf 7657//1 7660//1 7658//1\nf 7661//2 7662//2 7664//2\nf 7657//5 7658//5 7661//5\nf 7658//4 7659//4 7662//4\nf 7659//3 7660//3 7663//3\nf 7661//6 7664//6 7657//6\nf 7665//1 7668//1 7666//1\nf 7669//2 7670//2 7672//2\nf 7665//5 7666//5 7669//5\nf 7666//4 7667//4 7670//4\nf 7667//3 7668//3 7671//3\nf 7669//6 7672//6 7665//6\nf 7673//1 7676//1 7674//1\nf 7677//2 7678//2 7680//2\nf 7673//5 7674//5 7677//5\nf 7674//4 7675//4 7678//4\nf 7675//3 7676//3 7679//3\nf 7677//6 7680//6 7673//6\nf 7682//1 7681//1 7683//1\nf 7688//2 7685//2 7687//2\nf 7681//5 7682//5 7685//5\nf 7686//4 7682//4 7687//4\nf 7683//3 7684//3 7687//3\nf 7685//6 7688//6 7681//6\nf 7690//1 7689//1 7691//1\nf 7696//2 7693//2 7695//2\nf 7689//5 7690//5 7693//5\nf 7694//4 7690//4 7695//4\nf 7691//3 7692//3 7695//3\nf 7689//6 7693//6 7692//6\nf 7697//1 7700//1 7698//1\nf 7704//2 7701//2 7703//2\nf 7697//5 7698//5 7701//5\nf 7702//4 7698//4 7703//4\nf 7699//3 7700//3 7703//3\nf 7697//6 7701//6 7700//6\nf 7705//1 7708//1 7706//1\nf 7712//2 7709//2 7711//2\nf 7705//5 7706//5 7709//5\nf 7710//4 7706//4 7711//4\nf 7707//3 7708//3 7711//3\nf 7709//6 7712//6 7705//6\nf 7713//1 7716//1 7714//1\nf 7720//2 7717//2 7719//2\nf 7713//5 7714//5 7717//5\nf 7718//4 7714//4 7719//4\nf 7715//3 7716//3 7719//3\nf 7713//6 7717//6 7716//6\nf 7721//1 7724//1 7722//1\nf 7725//2 7726//2 7728//2\nf 7721//5 7722//5 7725//5\nf 7722//4 7723//4 7726//4\nf 7723//3 7724//3 7727//3\nf 7725//6 7728//6 7721//6\nf 7729//1 7732//1 7730//1\nf 7733//2 7734//2 7736//2\nf 7729//5 7730//5 7733//5\nf 7730//4 7731//4 7734//4\nf 7731//3 7732//3 7735//3\nf 7733//6 7736//6 7729//6\nf 7737//1 7740//1 7738//1\nf 7741//2 7742//2 7744//2\nf 7737//5 7738//5 7741//5\nf 7738//4 7739//4 7742//4\nf 7739//3 7740//3 7743//3\nf 7741//6 7744//6 7737//6\nf 7745//1 7748//1 7746//1\nf 7749//2 7750//2 7752//2\nf 7745//5 7746//5 7749//5\nf 7746//4 7747//4 7750//4\nf 7747//3 7748//3 7751//3\nf 7749//6 7752//6 7745//6\nf 7753//1 7756//1 7754//1\nf 7757//2 7758//2 7760//2\nf 7753//5 7754//5 7757//5\nf 7754//4 7755//4 7758//4\nf 7755//3 7756//3 7759//3\nf 7757//6 7760//6 7753//6\nf 7762//1 7761//1 7763//1\nf 7768//2 7765//2 7767//2\nf 7761//5 7762//5 7765//5\nf 7766//4 7762//4 7767//4\nf 7763//3 7764//3 7767//3\nf 7765//6 7768//6 7761//6\nf 7770//1 7769//1 7771//1\nf 7776//2 7773//2 7775//2\nf 7769//5 7770//5 7773//5\nf 7774//4 7770//4 7775//4\nf 7771//3 7772//3 7775//3\nf 7769//6 7773//6 7772//6\nf 7777//1 7780//1 7778//1\nf 7784//2 7781//2 7783//2\nf 7777//5 7778//5 7781//5\nf 7782//4 7778//4 7783//4\nf 7779//3 7780//3 7783//3\nf 7777//6 7781//6 7780//6\nf 7785//1 7788//1 7786//1\nf 7792//2 7789//2 7791//2\nf 7785//5 7786//5 7789//5\nf 7790//4 7786//4 7791//4\nf 7787//3 7788//3 7791//3\nf 7789//6 7792//6 7785//6\nf 7793//1 7796//1 7794//1\nf 7800//2 7797//2 7799//2\nf 7793//5 7794//5 7797//5\nf 7798//4 7794//4 7799//4\nf 7795//3 7796//3 7799//3\nf 7793//6 7797//6 7796//6\nf 7801//1 7804//1 7802//1\nf 7805//2 7806//2 7808//2\nf 7801//5 7802//5 7805//5\nf 7802//4 7803//4 7806//4\nf 7803//3 7804//3 7807//3\nf 7805//6 7808//6 7801//6\nf 7809//1 7812//1 7810//1\nf 7813//2 7814//2 7816//2\nf 7809//5 7810//5 7813//5\nf 7810//4 7811//4 7814//4\nf 7811//3 7812//3 7815//3\nf 7813//6 7816//6 7809//6\nf 7817//1 7820//1 7818//1\nf 7821//2 7822//2 7824//2\nf 7817//5 7818//5 7821//5\nf 7818//4 7819//4 7822//4\nf 7819//3 7820//3 7823//3\nf 7821//6 7824//6 7817//6\nf 7825//1 7828//1 7826//1\nf 7829//2 7830//2 7832//2\nf 7825//5 7826//5 7829//5\nf 7826//4 7827//4 7830//4\nf 7827//3 7828//3 7831//3\nf 7829//6 7832//6 7825//6\nf 7833//1 7836//1 7834//1\nf 7837//2 7838//2 7840//2\nf 7833//5 7834//5 7837//5\nf 7834//4 7835//4 7838//4\nf 7835//3 7836//3 7839//3\nf 7837//6 7840//6 7833//6\nf 7842//1 7841//1 7843//1\nf 7848//2 7845//2 7847//2\nf 7841//5 7842//5 7845//5\nf 7846//4 7842//4 7847//4\nf 7843//3 7844//3 7847//3\nf 7845//6 7848//6 7841//6\nf 7850//1 7849//1 7851//1\nf 7856//2 7853//2 7855//2\nf 7849//5 7850//5 7853//5\nf 7854//4 7850//4 7855//4\nf 7851//3 7852//3 7855//3\nf 7849//6 7853//6 7852//6\nf 7857//1 7860//1 7858//1\nf 7864//2 7861//2 7863//2\nf 7857//5 7858//5 7861//5\nf 7862//4 7858//4 7863//4\nf 7859//3 7860//3 7863//3\nf 7857//6 7861//6 7860//6\nf 7865//1 7868//1 7866//1\nf 7872//2 7869//2 7871//2\nf 7865//5 7866//5 7869//5\nf 7870//4 7866//4 7871//4\nf 7867//3 7868//3 7871//3\nf 7869//6 7872//6 7865//6\nf 7873//1 7876//1 7874//1\nf 7880//2 7877//2 7879//2\nf 7873//5 7874//5 7877//5\nf 7878//4 7874//4 7879//4\nf 7875//3 7876//3 7879//3\nf 7873//6 7877//6 7876//6\nf 7881//1 7884//1 7882//1\nf 7885//2 7886//2 7888//2\nf 7881//5 7882//5 7885//5\nf 7882//4 7883//4 7886//4\nf 7883//3 7884//3 7887//3\nf 7885//6 7888//6 7881//6\nf 7889//1 7892//1 7890//1\nf 7893//2 7894//2 7896//2\nf 7889//5 7890//5 7893//5\nf 7890//4 7891//4 7894//4\nf 7891//3 7892//3 7895//3\nf 7893//6 7896//6 7889//6\nf 7897//1 7900//1 7898//1\nf 7901//2 7902//2 7904//2\nf 7897//5 7898//5 7901//5\nf 7898//4 7899//4 7902//4\nf 7899//3 7900//3 7903//3\nf 7901//6 7904//6 7897//6\nf 7905//1 7908//1 7906//1\nf 7909//2 7910//2 7912//2\nf 7905//5 7906//5 7909//5\nf 7906//4 7907//4 7910//4\nf 7907//3 7908//3 7911//3\nf 7909//6 7912//6 7905//6\nf 7913//1 7916//1 7914//1\nf 7917//2 7918//2 7920//2\nf 7913//5 7914//5 7917//5\nf 7914//4 7915//4 7918//4\nf 7915//3 7916//3 7919//3\nf 7917//6 7920//6 7913//6\nf 7922//1 7921//1 7923//1\nf 7928//2 7925//2 7927//2\nf 7921//5 7922//5 7925//5\nf 7926//4 7922//4 7927//4\nf 7923//3 7924//3 7927//3\nf 7925//6 7928//6 7921//6\nf 7930//1 7929//1 7931//1\nf 7936//2 7933//2 7935//2\nf 7929//5 7930//5 7933//5\nf 7934//4 7930//4 7935//4\nf 7931//3 7932//3 7935//3\nf 7929//6 7933//6 7932//6\nf 7937//1 7940//1 7938//1\nf 7944//2 7941//2 7943//2\nf 7937//5 7938//5 7941//5\nf 7942//4 7938//4 7943//4\nf 7939//3 7940//3 7943//3\nf 7937//6 7941//6 7940//6\nf 7945//1 7948//1 7946//1\nf 7952//2 7949//2 7951//2\nf 7945//5 7946//5 7949//5\nf 7950//4 7946//4 7951//4\nf 7947//3 7948//3 7951//3\nf 7949//6 7952//6 7945//6\nf 7953//1 7956//1 7954//1\nf 7960//2 7957//2 7959//2\nf 7953//5 7954//5 7957//5\nf 7958//4 7954//4 7959//4\nf 7955//3 7956//3 7959//3\nf 7953//6 7957//6 7956//6\nf 7961//1 7964//1 7962//1\nf 7965//2 7966//2 7968//2\nf 7961//5 7962//5 7965//5\nf 7962//4 7963//4 7966//4\nf 7963//3 7964//3 7967//3\nf 7965//6 7968//6 7961//6\nf 7969//1 7972//1 7970//1\nf 7973//2 7974//2 7976//2\nf 7969//5 7970//5 7973//5\nf 7970//4 7971//4 7974//4\nf 7971//3 7972//3 7975//3\nf 7973//6 7976//6 7969//6\nf 7977//1 7980//1 7978//1\nf 7981//2 7982//2 7984//2\nf 7977//5 7978//5 7981//5\nf 7978//4 7979//4 7982//4\nf 7979//3 7980//3 7983//3\nf 7981//6 7984//6 7977//6\nf 7985//1 7988//1 7986//1\nf 7989//2 7990//2 7992//2\nf 7985//5 7986//5 7989//5\nf 7986//4 7987//4 7990//4\nf 7987//3 7988//3 7991//3\nf 7989//6 7992//6 7985//6\nf 7993//1 7996//1 7994//1\nf 7997//2 7998//2 8000//2\nf 7993//5 7994//5 7997//5\nf 7994//4 7995//4 7998//4\nf 7995//3 7996//3 7999//3\nf 7997//6 8000//6 7993//6\nf 8001//1 8002//1 8004//1\nf 8005//2 8008//2 8006//2\nf 8002//3 8001//3 8006//3\nf 8003//4 8002//4 8007//4\nf 8003//5 8007//5 8004//5\nf 8005//6 8001//6 8008//6\nf 8009//1 8010//1 8012//1\nf 8014//2 8013//2 8015//2\nf 8010//3 8009//3 8014//3\nf 8011//4 8010//4 8015//4\nf 8011//5 8015//5 8012//5\nf 8013//6 8009//6 8016//6\nf 8017//1 8018//1 8020//1\nf 8021//2 8024//2 8022//2\nf 8018//3 8017//3 8022//3\nf 8019//4 8018//4 8023//4\nf 8019//5 8023//5 8020//5\nf 8024//6 8021//6 8020//6\nf 8025//1 8026//1 8028//1\nf 8029//2 8032//2 8030//2\nf 8026//3 8025//3 8030//3\nf 8027//4 8026//4 8031//4\nf 8027//5 8031//5 8028//5\nf 8029//6 8025//6 8032//6\nf 8033//1 8034//1 8036//1\nf 8038//2 8037//2 8039//2\nf 8034//3 8033//3 8038//3\nf 8035//4 8034//4 8039//4\nf 8035//5 8039//5 8036//5\nf 8040//6 8037//6 8036//6\nf 8041//1 8042//1 8044//1\nf 8045//2 8048//2 8046//2\nf 8042//3 8041//3 8046//3\nf 8042//4 8046//4 8043//4\nf 8043//5 8047//5 8044//5\nf 8045//6 8041//6 8048//6\nf 8049//1 8050//1 8052//1\nf 8053//2 8056//2 8054//2\nf 8050//3 8049//3 8054//3\nf 8050//4 8054//4 8051//4\nf 8051//5 8055//5 8052//5\nf 8053//6 8049//6 8056//6\nf 8057//1 8058//1 8060//1\nf 8061//2 8064//2 8062//2\nf 8058//3 8057//3 8062//3\nf 8058//4 8062//4 8059//4\nf 8059//5 8063//5 8060//5\nf 8061//6 8057//6 8064//6\nf 8065//1 8066//1 8068//1\nf 8069//2 8072//2 8070//2\nf 8066//3 8065//3 8070//3\nf 8066//4 8070//4 8067//4\nf 8067//5 8071//5 8068//5\nf 8069//6 8065//6 8072//6\nf 8073//1 8074//1 8076//1\nf 8077//2 8080//2 8078//2\nf 8074//3 8073//3 8078//3\nf 8074//4 8078//4 8075//4\nf 8075//5 8079//5 8076//5\nf 8077//6 8073//6 8080//6\nf 8081//1 8082//1 8084//1\nf 8085//2 8088//2 8086//2\nf 8081//3 8085//3 8082//3\nf 8083//4 8082//4 8087//4\nf 8083//5 8087//5 8084//5\nf 8085//6 8081//6 8088//6\nf 8089//1 8090//1 8092//1\nf 8094//2 8093//2 8095//2\nf 8090//3 8089//3 8094//3\nf 8091//4 8090//4 8095//4\nf 8091//5 8095//5 8092//5\nf 8093//6 8089//6 8096//6\nf 8097//1 8098//1 8100//1\nf 8101//2 8104//2 8102//2\nf 8098//3 8097//3 8102//3\nf 8099//4 8098//4 8103//4\nf 8099//5 8103//5 8100//5\nf 8104//6 8101//6 8100//6\nf 8105//1 8106//1 8108//1\nf 8109//2 8112//2 8110//2\nf 8106//3 8105//3 8110//3\nf 8107//4 8106//4 8111//4\nf 8107//5 8111//5 8108//5\nf 8109//6 8105//6 8112//6\nf 8113//1 8114//1 8116//1\nf 8118//2 8117//2 8119//2\nf 8114//3 8113//3 8118//3\nf 8115//4 8114//4 8119//4\nf 8115//5 8119//5 8116//5\nf 8120//6 8117//6 8116//6\nf 8121//1 8122//1 8124//1\nf 8125//2 8128//2 8126//2\nf 8122//3 8121//3 8126//3\nf 8122//4 8126//4 8123//4\nf 8123//5 8127//5 8124//5\nf 8125//6 8121//6 8128//6\nf 8129//1 8130//1 8132//1\nf 8133//2 8136//2 8134//2\nf 8130//3 8129//3 8134//3\nf 8130//4 8134//4 8131//4\nf 8131//5 8135//5 8132//5\nf 8133//6 8129//6 8136//6\nf 8137//1 8138//1 8140//1\nf 8141//2 8144//2 8142//2\nf 8138//3 8137//3 8142//3\nf 8138//4 8142//4 8139//4\nf 8139//5 8143//5 8140//5\nf 8141//6 8137//6 8144//6\nf 8145//1 8146//1 8148//1\nf 8149//2 8152//2 8150//2\nf 8146//3 8145//3 8150//3\nf 8146//4 8150//4 8147//4\nf 8147//5 8151//5 8148//5\nf 8149//6 8145//6 8152//6\nf 8153//1 8154//1 8156//1\nf 8157//2 8160//2 8158//2\nf 8154//3 8153//3 8158//3\nf 8154//4 8158//4 8155//4\nf 8155//5 8159//5 8156//5\nf 8157//6 8153//6 8160//6\nf 8161//1 8162//1 8164//1\nf 8166//2 8165//2 8167//2\nf 8161//3 8165//3 8162//3\nf 8163//4 8162//4 8167//4\nf 8163//5 8167//5 8164//5\nf 8165//6 8161//6 8168//6\nf 8169//1 8170//1 8172//1\nf 8174//2 8173//2 8175//2\nf 8169//3 8173//3 8170//3\nf 8171//4 8170//4 8175//4\nf 8171//5 8175//5 8172//5\nf 8173//6 8169//6 8176//6\nf 8177//1 8178//1 8180//1\nf 8182//2 8181//2 8183//2\nf 8178//3 8177//3 8182//3\nf 8179//4 8178//4 8183//4\nf 8179//5 8183//5 8180//5\nf 8184//6 8181//6 8180//6\nf 8185//1 8186//1 8188//1\nf 8190//2 8189//2 8191//2\nf 8186//3 8185//3 8190//3\nf 8187//4 8186//4 8191//4\nf 8187//5 8191//5 8188//5\nf 8189//6 8185//6 8192//6\nf 8193//1 8194//1 8196//1\nf 8198//2 8197//2 8199//2\nf 8193//3 8197//3 8194//3\nf 8195//4 8194//4 8199//4\nf 8195//5 8199//5 8196//5\nf 8200//6 8197//6 8196//6\nf 8201//1 8202//1 8204//1\nf 8205//2 8208//2 8206//2\nf 8202//3 8201//3 8206//3\nf 8202//4 8206//4 8203//4\nf 8203//5 8207//5 8204//5\nf 8205//6 8201//6 8208//6\nf 8209//1 8210//1 8212//1\nf 8213//2 8216//2 8214//2\nf 8210//3 8209//3 8214//3\nf 8210//4 8214//4 8211//4\nf 8211//5 8215//5 8212//5\nf 8213//6 8209//6 8216//6\nf 8217//1 8218//1 8220//1\nf 8221//2 8224//2 8222//2\nf 8218//3 8217//3 8222//3\nf 8218//4 8222//4 8219//4\nf 8219//5 8223//5 8220//5\nf 8221//6 8217//6 8224//6\nf 8225//1 8226//1 8228//1\nf 8229//2 8232//2 8230//2\nf 8226//3 8225//3 8230//3\nf 8226//4 8230//4 8227//4\nf 8227//5 8231//5 8228//5\nf 8229//6 8225//6 8232//6\nf 8233//1 8234//1 8236//1\nf 8237//2 8240//2 8238//2\nf 8234//3 8233//3 8238//3\nf 8234//4 8238//4 8235//4\nf 8235//5 8239//5 8236//5\nf 8237//6 8233//6 8240//6\nf 8244//1 8241//1 8243//1\nf 8245//2 8248//2 8246//2\nf 8242//3 8241//3 8246//3\nf 8243//4 8242//4 8247//4\nf 8243//5 8247//5 8244//5\nf 8245//6 8241//6 8248//6\nf 8252//1 8249//1 8251//1\nf 8253//2 8256//2 8254//2\nf 8250//3 8249//3 8254//3\nf 8251//4 8250//4 8255//4\nf 8251//5 8255//5 8252//5\nf 8253//6 8249//6 8256//6\nf 8257//1 8258//1 8260//1\nf 8261//2 8264//2 8262//2\nf 8258//3 8257//3 8262//3\nf 8259//4 8258//4 8263//4\nf 8259//5 8263//5 8260//5\nf 8264//6 8261//6 8260//6\nf 8265//1 8266//1 8268//1\nf 8269//2 8272//2 8270//2\nf 8266//3 8265//3 8270//3\nf 8267//4 8266//4 8271//4\nf 8267//5 8271//5 8268//5\nf 8269//6 8265//6 8272//6\nf 8273//1 8274//1 8276//1\nf 8277//2 8280//2 8278//2\nf 8274//3 8273//3 8278//3\nf 8275//4 8274//4 8279//4\nf 8275//5 8279//5 8276//5\nf 8280//6 8277//6 8276//6\nf 8281//1 8282//1 8284//1\nf 8285//2 8288//2 8286//2\nf 8282//3 8281//3 8286//3\nf 8282//4 8286//4 8283//4\nf 8283//5 8287//5 8284//5\nf 8285//6 8281//6 8288//6\nf 8289//1 8290//1 8292//1\nf 8293//2 8296//2 8294//2\nf 8290//3 8289//3 8294//3\nf 8290//4 8294//4 8291//4\nf 8291//5 8295//5 8292//5\nf 8293//6 8289//6 8296//6\nf 8297//1 8298//1 8300//1\nf 8301//2 8304//2 8302//2\nf 8298//3 8297//3 8302//3\nf 8298//4 8302//4 8299//4\nf 8299//5 8303//5 8300//5\nf 8301//6 8297//6 8304//6\nf 8305//1 8306//1 8308//1\nf 8309//2 8312//2 8310//2\nf 8306//3 8305//3 8310//3\nf 8306//4 8310//4 8307//4\nf 8307//5 8311//5 8308//5\nf 8309//6 8305//6 8312//6\nf 8313//1 8314//1 8316//1\nf 8317//2 8320//2 8318//2\nf 8314//3 8313//3 8318//3\nf 8314//4 8318//4 8315//4\nf 8315//5 8319//5 8316//5\nf 8317//6 8313//6 8320//6\nf 8324//1 8321//1 8323//1\nf 8325//2 8328//2 8326//2\nf 8322//3 8321//3 8326//3\nf 8323//4 8322//4 8327//4\nf 8323//5 8327//5 8324//5\nf 8325//6 8321//6 8328//6\nf 8332//1 8329//1 8331//1\nf 8333//2 8336//2 8334//2\nf 8330//3 8329//3 8334//3\nf 8331//4 8330//4 8335//4\nf 8331//5 8335//5 8332//5\nf 8333//6 8329//6 8336//6\nf 8337//1 8338//1 8340//1\nf 8341//2 8344//2 8342//2\nf 8338//3 8337//3 8342//3\nf 8339//4 8338//4 8343//4\nf 8339//5 8343//5 8340//5\nf 8344//6 8341//6 8340//6\nf 8345//1 8346//1 8348//1\nf 8349//2 8352//2 8350//2\nf 8346//3 8345//3 8350//3\nf 8347//4 8346//4 8351//4\nf 8347//5 8351//5 8348//5\nf 8349//6 8345//6 8352//6\nf 8353//1 8354//1 8356//1\nf 8357//2 8360//2 8358//2\nf 8354//3 8353//3 8358//3\nf 8355//4 8354//4 8359//4\nf 8355//5 8359//5 8356//5\nf 8360//6 8357//6 8356//6\nf 8361//1 8362//1 8364//1\nf 8365//2 8368//2 8366//2\nf 8362//3 8361//3 8366//3\nf 8362//4 8366//4 8363//4\nf 8363//5 8367//5 8364//5\nf 8365//6 8361//6 8368//6\nf 8369//1 8370//1 8372//1\nf 8373//2 8376//2 8374//2\nf 8370//3 8369//3 8374//3\nf 8370//4 8374//4 8371//4\nf 8371//5 8375//5 8372//5\nf 8373//6 8369//6 8376//6\nf 8377//1 8378//1 8380//1\nf 8381//2 8384//2 8382//2\nf 8378//3 8377//3 8382//3\nf 8378//4 8382//4 8379//4\nf 8379//5 8383//5 8380//5\nf 8381//6 8377//6 8384//6\nf 8385//1 8386//1 8388//1\nf 8389//2 8392//2 8390//2\nf 8386//3 8385//3 8390//3\nf 8386//4 8390//4 8387//4\nf 8387//5 8391//5 8388//5\nf 8389//6 8385//6 8392//6\nf 8393//1 8394//1 8396//1\nf 8397//2 8400//2 8398//2\nf 8394//3 8393//3 8398//3\nf 8394//4 8398//4 8395//4\nf 8395//5 8399//5 8396//5\nf 8397//6 8393//6 8400//6\nf 8404//1 8401//1 8403//1\nf 8406//2 8405//2 8407//2\nf 8401//3 8405//3 8402//3\nf 8403//4 8402//4 8407//4\nf 8403//5 8407//5 8404//5\nf 8405//6 8401//6 8408//6\nf 8412//1 8409//1 8411//1\nf 8414//2 8413//2 8415//2\nf 8409//3 8413//3 8410//3\nf 8411//4 8410//4 8415//4\nf 8411//5 8415//5 8412//5\nf 8413//6 8409//6 8416//6\nf 8417//1 8418//1 8420//1\nf 8422//2 8421//2 8423//2\nf 8417//3 8421//3 8418//3\nf 8419//4 8418//4 8423//4\nf 8419//5 8423//5 8420//5\nf 8424//6 8421//6 8420//6\nf 8425//1 8426//1 8428//1\nf 8430//2 8429//2 8431//2\nf 8425//3 8429//3 8426//3\nf 8427//4 8426//4 8431//4\nf 8427//5 8431//5 8428//5\nf 8429//6 8425//6 8432//6\nf 8433//1 8434//1 8436//1\nf 8438//2 8437//2 8439//2\nf 8433//3 8437//3 8434//3\nf 8435//4 8434//4 8439//4\nf 8435//5 8439//5 8436//5\nf 8440//6 8437//6 8436//6\nf 8441//1 8442//1 8444//1\nf 8445//2 8448//2 8446//2\nf 8441//3 8445//3 8442//3\nf 8442//4 8446//4 8443//4\nf 8443//5 8447//5 8444//5\nf 8445//6 8441//6 8448//6\nf 8449//1 8450//1 8452//1\nf 8453//2 8456//2 8454//2\nf 8449//3 8453//3 8450//3\nf 8450//4 8454//4 8451//4\nf 8451//5 8455//5 8452//5\nf 8453//6 8449//6 8456//6\nf 8457//1 8458//1 8460//1\nf 8461//2 8464//2 8462//2\nf 8457//3 8461//3 8458//3\nf 8458//4 8462//4 8459//4\nf 8459//5 8463//5 8460//5\nf 8461//6 8457//6 8464//6\nf 8465//1 8466//1 8468//1\nf 8469//2 8472//2 8470//2\nf 8465//3 8469//3 8466//3\nf 8466//4 8470//4 8467//4\nf 8467//5 8471//5 8468//5\nf 8469//6 8465//6 8472//6\nf 8473//1 8474//1 8476//1\nf 8477//2 8480//2 8478//2\nf 8473//3 8477//3 8474//3\nf 8474//4 8478//4 8475//4\nf 8475//5 8479//5 8476//5\nf 8477//6 8473//6 8480//6\nf 8484//1 8481//1 8483//1\nf 8486//2 8485//2 8487//2\nf 8481//3 8485//3 8482//3\nf 8483//4 8482//4 8487//4\nf 8483//5 8487//5 8484//5\nf 8485//6 8481//6 8488//6\nf 8492//1 8489//1 8491//1\nf 8494//2 8493//2 8495//2\nf 8489//3 8493//3 8490//3\nf 8491//4 8490//4 8495//4\nf 8491//5 8495//5 8492//5\nf 8493//6 8489//6 8496//6\nf 8497//1 8498//1 8500//1\nf 8502//2 8501//2 8503//2\nf 8497//3 8501//3 8498//3\nf 8499//4 8498//4 8503//4\nf 8499//5 8503//5 8500//5\nf 8504//6 8501//6 8500//6\nf 8505//1 8506//1 8508//1\nf 8510//2 8509//2 8511//2\nf 8505//3 8509//3 8506//3\nf 8507//4 8506//4 8511//4\nf 8507//5 8511//5 8508//5\nf 8509//6 8505//6 8512//6\nf 8513//1 8514//1 8516//1\nf 8518//2 8517//2 8519//2\nf 8513//3 8517//3 8514//3\nf 8515//4 8514//4 8519//4\nf 8515//5 8519//5 8516//5\nf 8520//6 8517//6 8516//6\nf 8521//1 8522//1 8524//1\nf 8525//2 8528//2 8526//2\nf 8521//3 8525//3 8522//3\nf 8522//4 8526//4 8523//4\nf 8523//5 8527//5 8524//5\nf 8525//6 8521//6 8528//6\nf 8529//1 8530//1 8532//1\nf 8533//2 8536//2 8534//2\nf 8529//3 8533//3 8530//3\nf 8530//4 8534//4 8531//4\nf 8531//5 8535//5 8532//5\nf 8533//6 8529//6 8536//6\nf 8537//1 8538//1 8540//1\nf 8541//2 8544//2 8542//2\nf 8537//3 8541//3 8538//3\nf 8538//4 8542//4 8539//4\nf 8539//5 8543//5 8540//5\nf 8541//6 8537//6 8544//6\nf 8545//1 8546//1 8548//1\nf 8549//2 8552//2 8550//2\nf 8545//3 8549//3 8546//3\nf 8546//4 8550//4 8547//4\nf 8547//5 8551//5 8548//5\nf 8549//6 8545//6 8552//6\nf 8553//1 8554//1 8556//1\nf 8557//2 8560//2 8558//2\nf 8553//3 8557//3 8554//3\nf 8554//4 8558//4 8555//4\nf 8555//5 8559//5 8556//5\nf 8557//6 8553//6 8560//6\nf 8564//1 8561//1 8563//1\nf 8566//2 8565//2 8567//2\nf 8561//3 8565//3 8562//3\nf 8563//4 8562//4 8567//4\nf 8563//5 8567//5 8564//5\nf 8565//6 8561//6 8568//6\nf 8572//1 8569//1 8571//1\nf 8574//2 8573//2 8575//2\nf 8569//3 8573//3 8570//3\nf 8571//4 8570//4 8575//4\nf 8571//5 8575//5 8572//5\nf 8573//6 8569//6 8576//6\nf 8577//1 8578//1 8580//1\nf 8582//2 8581//2 8583//2\nf 8577//3 8581//3 8578//3\nf 8579//4 8578//4 8583//4\nf 8579//5 8583//5 8580//5\nf 8584//6 8581//6 8580//6\nf 8585//1 8586//1 8588//1\nf 8590//2 8589//2 8591//2\nf 8585//3 8589//3 8586//3\nf 8587//4 8586//4 8591//4\nf 8587//5 8591//5 8588//5\nf 8589//6 8585//6 8592//6\nf 8593//1 8594//1 8596//1\nf 8598//2 8597//2 8599//2\nf 8593//3 8597//3 8594//3\nf 8595//4 8594//4 8599//4\nf 8595//5 8599//5 8596//5\nf 8600//6 8597//6 8596//6\nf 8601//1 8602//1 8604//1\nf 8605//2 8608//2 8606//2\nf 8601//3 8605//3 8602//3\nf 8602//4 8606//4 8603//4\nf 8603//5 8607//5 8604//5\nf 8605//6 8601//6 8608//6\nf 8609//1 8610//1 8612//1\nf 8613//2 8616//2 8614//2\nf 8609//3 8613//3 8610//3\nf 8610//4 8614//4 8611//4\nf 8611//5 8615//5 8612//5\nf 8613//6 8609//6 8616//6\nf 8617//1 8618//1 8620//1\nf 8621//2 8624//2 8622//2\nf 8617//3 8621//3 8618//3\nf 8618//4 8622//4 8619//4\nf 8619//5 8623//5 8620//5\nf 8621//6 8617//6 8624//6\nf 8625//1 8626//1 8628//1\nf 8629//2 8632//2 8630//2\nf 8625//3 8629//3 8626//3\nf 8626//4 8630//4 8627//4\nf 8627//5 8631//5 8628//5\nf 8629//6 8625//6 8632//6\nf 8633//1 8634//1 8636//1\nf 8637//2 8640//2 8638//2\nf 8633//3 8637//3 8634//3\nf 8634//4 8638//4 8635//4\nf 8635//5 8639//5 8636//5\nf 8637//6 8633//6 8640//6\nf 8644//1 8641//1 8643//1\nf 8646//2 8645//2 8647//2\nf 8641//3 8645//3 8642//3\nf 8643//4 8642//4 8647//4\nf 8643//5 8647//5 8644//5\nf 8645//6 8641//6 8648//6\nf 8652//1 8649//1 8651//1\nf 8654//2 8653//2 8655//2\nf 8649//3 8653//3 8650//3\nf 8651//4 8650//4 8655//4\nf 8651//5 8655//5 8652//5\nf 8653//6 8649//6 8656//6\nf 8657//1 8658//1 8660//1\nf 8662//2 8661//2 8663//2\nf 8657//3 8661//3 8658//3\nf 8659//4 8658//4 8663//4\nf 8659//5 8663//5 8660//5\nf 8664//6 8661//6 8660//6\nf 8665//1 8666//1 8668//1\nf 8670//2 8669//2 8671//2\nf 8665//3 8669//3 8666//3\nf 8667//4 8666//4 8671//4\nf 8667//5 8671//5 8668//5\nf 8669//6 8665//6 8672//6\nf 8673//1 8674//1 8676//1\nf 8678//2 8677//2 8679//2\nf 8673//3 8677//3 8674//3\nf 8675//4 8674//4 8679//4\nf 8675//5 8679//5 8676//5\nf 8680//6 8677//6 8676//6\nf 8681//1 8682//1 8684//1\nf 8685//2 8688//2 8686//2\nf 8681//3 8685//3 8682//3\nf 8682//4 8686//4 8683//4\nf 8683//5 8687//5 8684//5\nf 8685//6 8681//6 8688//6\nf 8689//1 8690//1 8692//1\nf 8693//2 8696//2 8694//2\nf 8689//3 8693//3 8690//3\nf 8690//4 8694//4 8691//4\nf 8691//5 8695//5 8692//5\nf 8693//6 8689//6 8696//6\nf 8697//1 8698//1 8700//1\nf 8701//2 8704//2 8702//2\nf 8697//3 8701//3 8698//3\nf 8698//4 8702//4 8699//4\nf 8699//5 8703//5 8700//5\nf 8701//6 8697//6 8704//6\nf 8705//1 8706//1 8708//1\nf 8709//2 8712//2 8710//2\nf 8705//3 8709//3 8706//3\nf 8706//4 8710//4 8707//4\nf 8707//5 8711//5 8708//5\nf 8709//6 8705//6 8712//6\nf 8713//1 8714//1 8716//1\nf 8717//2 8720//2 8718//2\nf 8713//3 8717//3 8714//3\nf 8714//4 8718//4 8715//4\nf 8715//5 8719//5 8716//5\nf 8717//6 8713//6 8720//6\nf 8724//1 8721//1 8723//1\nf 8726//2 8725//2 8727//2\nf 8721//3 8725//3 8722//3\nf 8723//4 8722//4 8727//4\nf 8723//5 8727//5 8724//5\nf 8725//6 8721//6 8728//6\nf 8732//1 8729//1 8731//1\nf 8734//2 8733//2 8735//2\nf 8729//3 8733//3 8730//3\nf 8731//4 8730//4 8735//4\nf 8731//5 8735//5 8732//5\nf 8733//6 8729//6 8736//6\nf 8737//1 8738//1 8740//1\nf 8742//2 8741//2 8743//2\nf 8737//3 8741//3 8738//3\nf 8739//4 8738//4 8743//4\nf 8739//5 8743//5 8740//5\nf 8744//6 8741//6 8740//6\nf 8745//1 8746//1 8748//1\nf 8750//2 8749//2 8751//2\nf 8745//3 8749//3 8746//3\nf 8747//4 8746//4 8751//4\nf 8747//5 8751//5 8748//5\nf 8749//6 8745//6 8752//6\nf 8753//1 8754//1 8756//1\nf 8758//2 8757//2 8759//2\nf 8753//3 8757//3 8754//3\nf 8755//4 8754//4 8759//4\nf 8755//5 8759//5 8756//5\nf 8760//6 8757//6 8756//6\nf 8761//1 8762//1 8764//1\nf 8765//2 8768//2 8766//2\nf 8761//3 8765//3 8762//3\nf 8762//4 8766//4 8763//4\nf 8763//5 8767//5 8764//5\nf 8765//6 8761//6 8768//6\nf 8769//1 8770//1 8772//1\nf 8773//2 8776//2 8774//2\nf 8769//3 8773//3 8770//3\nf 8770//4 8774//4 8771//4\nf 8771//5 8775//5 8772//5\nf 8773//6 8769//6 8776//6\nf 8777//1 8778//1 8780//1\nf 8781//2 8784//2 8782//2\nf 8777//3 8781//3 8778//3\nf 8778//4 8782//4 8779//4\nf 8779//5 8783//5 8780//5\nf 8781//6 8777//6 8784//6\nf 8785//1 8786//1 8788//1\nf 8789//2 8792//2 8790//2\nf 8785//3 8789//3 8786//3\nf 8786//4 8790//4 8787//4\nf 8787//5 8791//5 8788//5\nf 8789//6 8785//6 8792//6\nf 8793//1 8794//1 8796//1\nf 8797//2 8800//2 8798//2\nf 8793//3 8797//3 8794//3\nf 8794//4 8798//4 8795//4\nf 8795//5 8799//5 8796//5\nf 8797//6 8793//6 8800//6\nf 8801//1 8804//1 8802//1\nf 8808//2 8805//2 8807//2\nf 8805//5 8801//5 8806//5\nf 8806//4 8802//4 8807//4\nf 8803//3 8804//3 8807//3\nf 8805//6 8808//6 8801//6\nf 8809//1 8812//1 8810//1\nf 8816//2 8813//2 8815//2\nf 8813//5 8809//5 8814//5\nf 8814//4 8810//4 8815//4\nf 8811//3 8812//3 8815//3\nf 8809//6 8813//6 8812//6\nf 8817//1 8820//1 8818//1\nf 8824//2 8821//2 8823//2\nf 8821//5 8817//5 8822//5\nf 8822//4 8818//4 8823//4\nf 8819//3 8820//3 8823//3\nf 8817//6 8821//6 8820//6\nf 8825//1 8828//1 8826//1\nf 8829//2 8830//2 8832//2\nf 8829//5 8825//5 8830//5\nf 8830//4 8826//4 8831//4\nf 8827//3 8828//3 8831//3\nf 8829//6 8832//6 8825//6\nf 8833//1 8836//1 8834//1\nf 8840//2 8837//2 8839//2\nf 8837//5 8833//5 8838//5\nf 8838//4 8834//4 8839//4\nf 8835//3 8836//3 8839//3\nf 8833//6 8837//6 8836//6\nf 8841//1 8844//1 8842//1\nf 8845//2 8846//2 8848//2\nf 8845//5 8841//5 8846//5\nf 8842//4 8843//4 8846//4\nf 8843//3 8844//3 8847//3\nf 8845//6 8848//6 8841//6\nf 8849//1 8852//1 8850//1\nf 8853//2 8854//2 8856//2\nf 8853//5 8849//5 8854//5\nf 8850//4 8851//4 8854//4\nf 8851//3 8852//3 8855//3\nf 8853//6 8856//6 8849//6\nf 8857//1 8860//1 8858//1\nf 8861//2 8862//2 8864//2\nf 8861//5 8857//5 8862//5\nf 8858//4 8859//4 8862//4\nf 8859//3 8860//3 8863//3\nf 8861//6 8864//6 8857//6\nf 8865//1 8868//1 8866//1\nf 8869//2 8870//2 8872//2\nf 8869//5 8865//5 8870//5\nf 8866//4 8867//4 8870//4\nf 8867//3 8868//3 8871//3\nf 8869//6 8872//6 8865//6\nf 8873//1 8876//1 8874//1\nf 8877//2 8878//2 8880//2\nf 8877//5 8873//5 8878//5\nf 8874//4 8875//4 8878//4\nf 8875//3 8876//3 8879//3\nf 8877//6 8880//6 8873//6\nf 8881//1 8884//1 8882//1\nf 8888//2 8885//2 8887//2\nf 8881//5 8882//5 8885//5\nf 8886//4 8882//4 8887//4\nf 8883//3 8884//3 8887//3\nf 8885//6 8888//6 8881//6\nf 8889//1 8892//1 8890//1\nf 8896//2 8893//2 8895//2\nf 8893//5 8889//5 8894//5\nf 8894//4 8890//4 8895//4\nf 8891//3 8892//3 8895//3\nf 8889//6 8893//6 8892//6\nf 8897//1 8900//1 8898//1\nf 8904//2 8901//2 8903//2\nf 8901//5 8897//5 8902//5\nf 8902//4 8898//4 8903//4\nf 8899//3 8900//3 8903//3\nf 8897//6 8901//6 8900//6\nf 8905//1 8908//1 8906//1\nf 8909//2 8910//2 8912//2\nf 8909//5 8905//5 8910//5\nf 8910//4 8906//4 8911//4\nf 8907//3 8908//3 8911//3\nf 8909//6 8912//6 8905//6\nf 8913//1 8916//1 8914//1\nf 8917//2 8918//2 8920//2\nf 8917//5 8913//5 8918//5\nf 8918//4 8914//4 8919//4\nf 8915//3 8916//3 8919//3\nf 8913//6 8917//6 8916//6\nf 8921//1 8924//1 8922//1\nf 8925//2 8926//2 8928//2\nf 8925//5 8921//5 8926//5\nf 8922//4 8923//4 8926//4\nf 8923//3 8924//3 8927//3\nf 8925//6 8928//6 8921//6\nf 8929//1 8932//1 8930//1\nf 8933//2 8934//2 8936//2\nf 8933//5 8929//5 8934//5\nf 8930//4 8931//4 8934//4\nf 8931//3 8932//3 8935//3\nf 8933//6 8936//6 8929//6\nf 8937//1 8940//1 8938//1\nf 8941//2 8942//2 8944//2\nf 8941//5 8937//5 8942//5\nf 8938//4 8939//4 8942//4\nf 8939//3 8940//3 8943//3\nf 8941//6 8944//6 8937//6\nf 8945//1 8948//1 8946//1\nf 8949//2 8950//2 8952//2\nf 8949//5 8945//5 8950//5\nf 8946//4 8947//4 8950//4\nf 8947//3 8948//3 8951//3\nf 8949//6 8952//6 8945//6\nf 8953//1 8956//1 8954//1\nf 8957//2 8958//2 8960//2\nf 8957//5 8953//5 8958//5\nf 8954//4 8955//4 8958//4\nf 8955//3 8956//3 8959//3\nf 8957//6 8960//6 8953//6\nf 8962//1 8961//1 8963//1\nf 8968//2 8965//2 8967//2\nf 8961//5 8962//5 8965//5\nf 8966//4 8962//4 8967//4\nf 8963//3 8964//3 8967//3\nf 8965//6 8968//6 8961//6\nf 8969//1 8972//1 8970//1\nf 8976//2 8973//2 8975//2\nf 8969//5 8970//5 8973//5\nf 8974//4 8970//4 8975//4\nf 8971//3 8972//3 8975//3\nf 8969//6 8973//6 8972//6\nf 8977//1 8980//1 8978//1\nf 8984//2 8981//2 8983//2\nf 8981//5 8977//5 8982//5\nf 8982//4 8978//4 8983//4\nf 8979//3 8980//3 8983//3\nf 8977//6 8981//6 8980//6\nf 8985//1 8988//1 8986//1\nf 8992//2 8989//2 8991//2\nf 8989//5 8985//5 8990//5\nf 8990//4 8986//4 8991//4\nf 8987//3 8988//3 8991//3\nf 8989//6 8992//6 8985//6\nf 8993//1 8996//1 8994//1\nf 9000//2 8997//2 8999//2\nf 8993//5 8994//5 8997//5\nf 8998//4 8994//4 8999//4\nf 8995//3 8996//3 8999//3\nf 8993//6 8997//6 8996//6\nf 9001//1 9004//1 9002//1\nf 9005//2 9006//2 9008//2\nf 9005//5 9001//5 9006//5\nf 9002//4 9003//4 9006//4\nf 9003//3 9004//3 9007//3\nf 9005//6 9008//6 9001//6\nf 9009//1 9012//1 9010//1\nf 9013//2 9014//2 9016//2\nf 9013//5 9009//5 9014//5\nf 9010//4 9011//4 9014//4\nf 9011//3 9012//3 9015//3\nf 9013//6 9016//6 9009//6\nf 9017//1 9020//1 9018//1\nf 9021//2 9022//2 9024//2\nf 9021//5 9017//5 9022//5\nf 9018//4 9019//4 9022//4\nf 9019//3 9020//3 9023//3\nf 9021//6 9024//6 9017//6\nf 9025//1 9028//1 9026//1\nf 9029//2 9030//2 9032//2\nf 9029//5 9025//5 9030//5\nf 9026//4 9027//4 9030//4\nf 9027//3 9028//3 9031//3\nf 9029//6 9032//6 9025//6\nf 9033//1 9036//1 9034//1\nf 9037//2 9038//2 9040//2\nf 9037//5 9033//5 9038//5\nf 9034//4 9035//4 9038//4\nf 9035//3 9036//3 9039//3\nf 9037//6 9040//6 9033//6\nf 9042//1 9041//1 9043//1\nf 9045//2 9046//2 9048//2\nf 9045//5 9041//5 9046//5\nf 9046//4 9042//4 9047//4\nf 9043//3 9044//3 9047//3\nf 9045//6 9048//6 9041//6\nf 9050//1 9049//1 9051//1\nf 9053//2 9054//2 9056//2\nf 9053//5 9049//5 9054//5\nf 9054//4 9050//4 9055//4\nf 9051//3 9052//3 9055//3\nf 9049//6 9053//6 9052//6\nf 9057//1 9060//1 9058//1\nf 9061//2 9062//2 9064//2\nf 9061//5 9057//5 9062//5\nf 9062//4 9058//4 9063//4\nf 9059//3 9060//3 9063//3\nf 9057//6 9061//6 9060//6\nf 9065//1 9068//1 9066//1\nf 9069//2 9070//2 9072//2\nf 9069//5 9065//5 9070//5\nf 9070//4 9066//4 9071//4\nf 9067//3 9068//3 9071//3\nf 9069//6 9072//6 9065//6\nf 9073//1 9076//1 9074//1\nf 9077//2 9078//2 9080//2\nf 9077//5 9073//5 9078//5\nf 9078//4 9074//4 9079//4\nf 9075//3 9076//3 9079//3\nf 9073//6 9077//6 9076//6\nf 9081//1 9084//1 9082//1\nf 9085//2 9086//2 9088//2\nf 9085//5 9081//5 9086//5\nf 9082//4 9083//4 9086//4\nf 9083//3 9084//3 9087//3\nf 9085//6 9088//6 9081//6\nf 9089//1 9092//1 9090//1\nf 9093//2 9094//2 9096//2\nf 9093//5 9089//5 9094//5\nf 9090//4 9091//4 9094//4\nf 9091//3 9092//3 9095//3\nf 9093//6 9096//6 9089//6\nf 9097//1 9100//1 9098//1\nf 9101//2 9102//2 9104//2\nf 9101//5 9097//5 9102//5\nf 9098//4 9099//4 9102//4\nf 9099//3 9100//3 9103//3\nf 9101//6 9104//6 9097//6\nf 9105//1 9108//1 9106//1\nf 9109//2 9110//2 9112//2\nf 9109//5 9105//5 9110//5\nf 9106//4 9107//4 9110//4\nf 9107//3 9108//3 9111//3\nf 9109//6 9112//6 9105//6\nf 9113//1 9116//1 9114//1\nf 9117//2 9118//2 9120//2\nf 9117//5 9113//5 9118//5\nf 9114//4 9115//4 9118//4\nf 9115//3 9116//3 9119//3\nf 9117//6 9120//6 9113//6\nf 9122//1 9121//1 9123//1\nf 9125//2 9126//2 9128//2\nf 9125//5 9121//5 9126//5\nf 9126//4 9122//4 9127//4\nf 9123//3 9124//3 9127//3\nf 9125//6 9128//6 9121//6\nf 9130//1 9129//1 9131//1\nf 9133//2 9134//2 9136//2\nf 9133//5 9129//5 9134//5\nf 9134//4 9130//4 9135//4\nf 9131//3 9132//3 9135//3\nf 9129//6 9133//6 9132//6\nf 9137//1 9140//1 9138//1\nf 9141//2 9142//2 9144//2\nf 9141//5 9137//5 9142//5\nf 9142//4 9138//4 9143//4\nf 9139//3 9140//3 9143//3\nf 9137//6 9141//6 9140//6\nf 9145//1 9148//1 9146//1\nf 9149//2 9150//2 9152//2\nf 9149//5 9145//5 9150//5\nf 9150//4 9146//4 9151//4\nf 9147//3 9148//3 9151//3\nf 9149//6 9152//6 9145//6\nf 9153//1 9156//1 9154//1\nf 9157//2 9158//2 9160//2\nf 9157//5 9153//5 9158//5\nf 9158//4 9154//4 9159//4\nf 9155//3 9156//3 9159//3\nf 9153//6 9157//6 9156//6\nf 9161//1 9164//1 9162//1\nf 9165//2 9166//2 9168//2\nf 9165//5 9161//5 9166//5\nf 9162//4 9163//4 9166//4\nf 9163//3 9164//3 9167//3\nf 9165//6 9168//6 9161//6\nf 9169//1 9172//1 9170//1\nf 9173//2 9174//2 9176//2\nf 9173//5 9169//5 9174//5\nf 9170//4 9171//4 9174//4\nf 9171//3 9172//3 9175//3\nf 9173//6 9176//6 9169//6\nf 9177//1 9180//1 9178//1\nf 9181//2 9182//2 9184//2\nf 9181//5 9177//5 9182//5\nf 9178//4 9179//4 9182//4\nf 9179//3 9180//3 9183//3\nf 9181//6 9184//6 9177//6\nf 9185//1 9188//1 9186//1\nf 9189//2 9190//2 9192//2\nf 9189//5 9185//5 9190//5\nf 9186//4 9187//4 9190//4\nf 9187//3 9188//3 9191//3\nf 9189//6 9192//6 9185//6\nf 9193//1 9196//1 9194//1\nf 9197//2 9198//2 9200//2\nf 9197//5 9193//5 9198//5\nf 9194//4 9195//4 9198//4\nf 9195//3 9196//3 9199//3\nf 9197//6 9200//6 9193//6\nf 9202//1 9201//1 9203//1\nf 9208//2 9205//2 9207//2\nf 9201//5 9202//5 9205//5\nf 9206//4 9202//4 9207//4\nf 9203//3 9204//3 9207//3\nf 9205//6 9208//6 9201//6\nf 9210//1 9209//1 9211//1\nf 9216//2 9213//2 9215//2\nf 9209//5 9210//5 9213//5\nf 9214//4 9210//4 9215//4\nf 9211//3 9212//3 9215//3\nf 9209//6 9213//6 9212//6\nf 9217//1 9220//1 9218//1\nf 9224//2 9221//2 9223//2\nf 9217//5 9218//5 9221//5\nf 9222//4 9218//4 9223//4\nf 9219//3 9220//3 9223//3\nf 9217//6 9221//6 9220//6\nf 9225//1 9228//1 9226//1\nf 9232//2 9229//2 9231//2\nf 9225//5 9226//5 9229//5\nf 9230//4 9226//4 9231//4\nf 9227//3 9228//3 9231//3\nf 9229//6 9232//6 9225//6\nf 9233//1 9236//1 9234//1\nf 9240//2 9237//2 9239//2\nf 9233//5 9234//5 9237//5\nf 9238//4 9234//4 9239//4\nf 9235//3 9236//3 9239//3\nf 9233//6 9237//6 9236//6\nf 9241//1 9244//1 9242//1\nf 9245//2 9246//2 9248//2\nf 9241//5 9242//5 9245//5\nf 9242//4 9243//4 9246//4\nf 9243//3 9244//3 9247//3\nf 9245//6 9248//6 9241//6\nf 9249//1 9252//1 9250//1\nf 9253//2 9254//2 9256//2\nf 9249//5 9250//5 9253//5\nf 9250//4 9251//4 9254//4\nf 9251//3 9252//3 9255//3\nf 9253//6 9256//6 9249//6\nf 9257//1 9260//1 9258//1\nf 9261//2 9262//2 9264//2\nf 9257//5 9258//5 9261//5\nf 9258//4 9259//4 9262//4\nf 9259//3 9260//3 9263//3\nf 9261//6 9264//6 9257//6\nf 9265//1 9268//1 9266//1\nf 9269//2 9270//2 9272//2\nf 9265//5 9266//5 9269//5\nf 9266//4 9267//4 9270//4\nf 9267//3 9268//3 9271//3\nf 9269//6 9272//6 9265//6\nf 9273//1 9276//1 9274//1\nf 9277//2 9278//2 9280//2\nf 9273//5 9274//5 9277//5\nf 9274//4 9275//4 9278//4\nf 9275//3 9276//3 9279//3\nf 9277//6 9280//6 9273//6\nf 9282//1 9281//1 9283//1\nf 9288//2 9285//2 9287//2\nf 9281//5 9282//5 9285//5\nf 9286//4 9282//4 9287//4\nf 9283//3 9284//3 9287//3\nf 9285//6 9288//6 9281//6\nf 9290//1 9289//1 9291//1\nf 9296//2 9293//2 9295//2\nf 9289//5 9290//5 9293//5\nf 9294//4 9290//4 9295//4\nf 9291//3 9292//3 9295//3\nf 9289//6 9293//6 9292//6\nf 9297//1 9300//1 9298//1\nf 9304//2 9301//2 9303//2\nf 9297//5 9298//5 9301//5\nf 9302//4 9298//4 9303//4\nf 9299//3 9300//3 9303//3\nf 9297//6 9301//6 9300//6\nf 9305//1 9308//1 9306//1\nf 9312//2 9309//2 9311//2\nf 9305//5 9306//5 9309//5\nf 9310//4 9306//4 9311//4\nf 9307//3 9308//3 9311//3\nf 9309//6 9312//6 9305//6\nf 9313//1 9316//1 9314//1\nf 9320//2 9317//2 9319//2\nf 9313//5 9314//5 9317//5\nf 9318//4 9314//4 9319//4\nf 9315//3 9316//3 9319//3\nf 9313//6 9317//6 9316//6\nf 9321//1 9324//1 9322//1\nf 9325//2 9326//2 9328//2\nf 9321//5 9322//5 9325//5\nf 9322//4 9323//4 9326//4\nf 9323//3 9324//3 9327//3\nf 9325//6 9328//6 9321//6\nf 9329//1 9332//1 9330//1\nf 9333//2 9334//2 9336//2\nf 9329//5 9330//5 9333//5\nf 9330//4 9331//4 9334//4\nf 9331//3 9332//3 9335//3\nf 9333//6 9336//6 9329//6\nf 9337//1 9340//1 9338//1\nf 9341//2 9342//2 9344//2\nf 9337//5 9338//5 9341//5\nf 9338//4 9339//4 9342//4\nf 9339//3 9340//3 9343//3\nf 9341//6 9344//6 9337//6\nf 9345//1 9348//1 9346//1\nf 9349//2 9350//2 9352//2\nf 9345//5 9346//5 9349//5\nf 9346//4 9347//4 9350//4\nf 9347//3 9348//3 9351//3\nf 9349//6 9352//6 9345//6\nf 9353//1 9356//1 9354//1\nf 9357//2 9358//2 9360//2\nf 9353//5 9354//5 9357//5\nf 9354//4 9355//4 9358//4\nf 9355//3 9356//3 9359//3\nf 9357//6 9360//6 9353//6\nf 9362//1 9361//1 9363//1\nf 9368//2 9365//2 9367//2\nf 9361//5 9362//5 9365//5\nf 9366//4 9362//4 9367//4\nf 9363//3 9364//3 9367//3\nf 9365//6 9368//6 9361//6\nf 9370//1 9369//1 9371//1\nf 9376//2 9373//2 9375//2\nf 9369//5 9370//5 9373//5\nf 9374//4 9370//4 9375//4\nf 9371//3 9372//3 9375//3\nf 9369//6 9373//6 9372//6\nf 9377//1 9380//1 9378//1\nf 9384//2 9381//2 9383//2\nf 9377//5 9378//5 9381//5\nf 9382//4 9378//4 9383//4\nf 9379//3 9380//3 9383//3\nf 9377//6 9381//6 9380//6\nf 9385//1 9388//1 9386//1\nf 9392//2 9389//2 9391//2\nf 9385//5 9386//5 9389//5\nf 9390//4 9386//4 9391//4\nf 9387//3 9388//3 9391//3\nf 9389//6 9392//6 9385//6\nf 9393//1 9396//1 9394//1\nf 9400//2 9397//2 9399//2\nf 9393//5 9394//5 9397//5\nf 9398//4 9394//4 9399//4\nf 9395//3 9396//3 9399//3\nf 9393//6 9397//6 9396//6\nf 9401//1 9404//1 9402//1\nf 9405//2 9406//2 9408//2\nf 9401//5 9402//5 9405//5\nf 9402//4 9403//4 9406//4\nf 9403//3 9404//3 9407//3\nf 9405//6 9408//6 9401//6\nf 9409//1 9412//1 9410//1\nf 9413//2 9414//2 9416//2\nf 9409//5 9410//5 9413//5\nf 9410//4 9411//4 9414//4\nf 9411//3 9412//3 9415//3\nf 9413//6 9416//6 9409//6\nf 9417//1 9420//1 9418//1\nf 9421//2 9422//2 9424//2\nf 9417//5 9418//5 9421//5\nf 9418//4 9419//4 9422//4\nf 9419//3 9420//3 9423//3\nf 9421//6 9424//6 9417//6\nf 9425//1 9428//1 9426//1\nf 9429//2 9430//2 9432//2\nf 9425//5 9426//5 9429//5\nf 9426//4 9427//4 9430//4\nf 9427//3 9428//3 9431//3\nf 9429//6 9432//6 9425//6\nf 9433//1 9436//1 9434//1\nf 9437//2 9438//2 9440//2\nf 9433//5 9434//5 9437//5\nf 9434//4 9435//4 9438//4\nf 9435//3 9436//3 9439//3\nf 9437//6 9440//6 9433//6\nf 9442//1 9441//1 9443//1\nf 9448//2 9445//2 9447//2\nf 9441//5 9442//5 9445//5\nf 9446//4 9442//4 9447//4\nf 9443//3 9444//3 9447//3\nf 9445//6 9448//6 9441//6\nf 9450//1 9449//1 9451//1\nf 9456//2 9453//2 9455//2\nf 9449//5 9450//5 9453//5\nf 9454//4 9450//4 9455//4\nf 9451//3 9452//3 9455//3\nf 9449//6 9453//6 9452//6\nf 9457//1 9460//1 9458//1\nf 9464//2 9461//2 9463//2\nf 9457//5 9458//5 9461//5\nf 9462//4 9458//4 9463//4\nf 9459//3 9460//3 9463//3\nf 9457//6 9461//6 9460//6\nf 9465//1 9468//1 9466//1\nf 9472//2 9469//2 9471//2\nf 9465//5 9466//5 9469//5\nf 9470//4 9466//4 9471//4\nf 9467//3 9468//3 9471//3\nf 9469//6 9472//6 9465//6\nf 9473//1 9476//1 9474//1\nf 9480//2 9477//2 9479//2\nf 9473//5 9474//5 9477//5\nf 9478//4 9474//4 9479//4\nf 9475//3 9476//3 9479//3\nf 9473//6 9477//6 9476//6\nf 9481//1 9484//1 9482//1\nf 9485//2 9486//2 9488//2\nf 9481//5 9482//5 9485//5\nf 9482//4 9483//4 9486//4\nf 9483//3 9484//3 9487//3\nf 9485//6 9488//6 9481//6\nf 9489//1 9492//1 9490//1\nf 9493//2 9494//2 9496//2\nf 9489//5 9490//5 9493//5\nf 9490//4 9491//4 9494//4\nf 9491//3 9492//3 9495//3\nf 9493//6 9496//6 9489//6\nf 9497//1 9500//1 9498//1\nf 9501//2 9502//2 9504//2\nf 9497//5 9498//5 9501//5\nf 9498//4 9499//4 9502//4\nf 9499//3 9500//3 9503//3\nf 9501//6 9504//6 9497//6\nf 9505//1 9508//1 9506//1\nf 9509//2 9510//2 9512//2\nf 9505//5 9506//5 9509//5\nf 9506//4 9507//4 9510//4\nf 9507//3 9508//3 9511//3\nf 9509//6 9512//6 9505//6\nf 9513//1 9516//1 9514//1\nf 9517//2 9518//2 9520//2\nf 9513//5 9514//5 9517//5\nf 9514//4 9515//4 9518//4\nf 9515//3 9516//3 9519//3\nf 9517//6 9520//6 9513//6\nf 9522//1 9521//1 9523//1\nf 9528//2 9525//2 9527//2\nf 9521//5 9522//5 9525//5\nf 9526//4 9522//4 9527//4\nf 9523//3 9524//3 9527//3\nf 9525//6 9528//6 9521//6\nf 9530//1 9529//1 9531//1\nf 9536//2 9533//2 9535//2\nf 9529//5 9530//5 9533//5\nf 9534//4 9530//4 9535//4\nf 9531//3 9532//3 9535//3\nf 9529//6 9533//6 9532//6\nf 9537//1 9540//1 9538//1\nf 9544//2 9541//2 9543//2\nf 9537//5 9538//5 9541//5\nf 9542//4 9538//4 9543//4\nf 9539//3 9540//3 9543//3\nf 9537//6 9541//6 9540//6\nf 9545//1 9548//1 9546//1\nf 9552//2 9549//2 9551//2\nf 9545//5 9546//5 9549//5\nf 9550//4 9546//4 9551//4\nf 9547//3 9548//3 9551//3\nf 9549//6 9552//6 9545//6\nf 9553//1 9556//1 9554//1\nf 9560//2 9557//2 9559//2\nf 9553//5 9554//5 9557//5\nf 9558//4 9554//4 9559//4\nf 9555//3 9556//3 9559//3\nf 9553//6 9557//6 9556//6\nf 9561//1 9564//1 9562//1\nf 9565//2 9566//2 9568//2\nf 9561//5 9562//5 9565//5\nf 9562//4 9563//4 9566//4\nf 9563//3 9564//3 9567//3\nf 9565//6 9568//6 9561//6\nf 9569//1 9572//1 9570//1\nf 9573//2 9574//2 9576//2\nf 9569//5 9570//5 9573//5\nf 9570//4 9571//4 9574//4\nf 9571//3 9572//3 9575//3\nf 9573//6 9576//6 9569//6\nf 9577//1 9580//1 9578//1\nf 9581//2 9582//2 9584//2\nf 9577//5 9578//5 9581//5\nf 9578//4 9579//4 9582//4\nf 9579//3 9580//3 9583//3\nf 9581//6 9584//6 9577//6\nf 9585//1 9588//1 9586//1\nf 9589//2 9590//2 9592//2\nf 9585//5 9586//5 9589//5\nf 9586//4 9587//4 9590//4\nf 9587//3 9588//3 9591//3\nf 9589//6 9592//6 9585//6\nf 9593//1 9596//1 9594//1\nf 9597//2 9598//2 9600//2\nf 9593//5 9594//5 9597//5\nf 9594//4 9595//4 9598//4\nf 9595//3 9596//3 9599//3\nf 9597//6 9600//6 9593//6\nf 9601//1 9602//1 9604//1\nf 9605//2 9608//2 9606//2\nf 9602//3 9601//3 9606//3\nf 9603//4 9602//4 9607//4\nf 9603//5 9607//5 9604//5\nf 9605//6 9601//6 9608//6\nf 9609//1 9610//1 9612//1\nf 9614//2 9613//2 9615//2\nf 9610//3 9609//3 9614//3\nf 9611//4 9610//4 9615//4\nf 9611//5 9615//5 9612//5\nf 9613//6 9609//6 9616//6\nf 9617//1 9618//1 9620//1\nf 9621//2 9624//2 9622//2\nf 9618//3 9617//3 9622//3\nf 9619//4 9618//4 9623//4\nf 9619//5 9623//5 9620//5\nf 9624//6 9621//6 9620//6\nf 9625//1 9626//1 9628//1\nf 9629//2 9632//2 9630//2\nf 9626//3 9625//3 9630//3\nf 9627//4 9626//4 9631//4\nf 9627//5 9631//5 9628//5\nf 9629//6 9625//6 9632//6\nf 9633//1 9634//1 9636//1\nf 9638//2 9637//2 9639//2\nf 9634//3 9633//3 9638//3\nf 9635//4 9634//4 9639//4\nf 9635//5 9639//5 9636//5\nf 9640//6 9637//6 9636//6\nf 9641//1 9642//1 9644//1\nf 9645//2 9648//2 9646//2\nf 9642//3 9641//3 9646//3\nf 9642//4 9646//4 9643//4\nf 9643//5 9647//5 9644//5\nf 9645//6 9641//6 9648//6\nf 9649//1 9650//1 9652//1\nf 9653//2 9656//2 9654//2\nf 9650//3 9649//3 9654//3\nf 9650//4 9654//4 9651//4\nf 9651//5 9655//5 9652//5\nf 9653//6 9649//6 9656//6\nf 9657//1 9658//1 9660//1\nf 9661//2 9664//2 9662//2\nf 9658//3 9657//3 9662//3\nf 9658//4 9662//4 9659//4\nf 9659//5 9663//5 9660//5\nf 9661//6 9657//6 9664//6\nf 9665//1 9666//1 9668//1\nf 9669//2 9672//2 9670//2\nf 9666//3 9665//3 9670//3\nf 9666//4 9670//4 9667//4\nf 9667//5 9671//5 9668//5\nf 9669//6 9665//6 9672//6\nf 9673//1 9674//1 9676//1\nf 9677//2 9680//2 9678//2\nf 9674//3 9673//3 9678//3\nf 9674//4 9678//4 9675//4\nf 9675//5 9679//5 9676//5\nf 9677//6 9673//6 9680//6\nf 9681//1 9682//1 9684//1\nf 9685//2 9688//2 9686//2\nf 9681//3 9685//3 9682//3\nf 9683//4 9682//4 9687//4\nf 9683//5 9687//5 9684//5\nf 9685//6 9681//6 9688//6\nf 9689//1 9690//1 9692//1\nf 9694//2 9693//2 9695//2\nf 9690//3 9689//3 9694//3\nf 9691//4 9690//4 9695//4\nf 9691//5 9695//5 9692//5\nf 9693//6 9689//6 9696//6\nf 9697//1 9698//1 9700//1\nf 9701//2 9704//2 9702//2\nf 9698//3 9697//3 9702//3\nf 9699//4 9698//4 9703//4\nf 9699//5 9703//5 9700//5\nf 9704//6 9701//6 9700//6\nf 9705//1 9706//1 9708//1\nf 9709//2 9712//2 9710//2\nf 9706//3 9705//3 9710//3\nf 9707//4 9706//4 9711//4\nf 9707//5 9711//5 9708//5\nf 9709//6 9705//6 9712//6\nf 9713//1 9714//1 9716//1\nf 9718//2 9717//2 9719//2\nf 9714//3 9713//3 9718//3\nf 9715//4 9714//4 9719//4\nf 9715//5 9719//5 9716//5\nf 9720//6 9717//6 9716//6\nf 9721//1 9722//1 9724//1\nf 9725//2 9728//2 9726//2\nf 9722//3 9721//3 9726//3\nf 9722//4 9726//4 9723//4\nf 9723//5 9727//5 9724//5\nf 9725//6 9721//6 9728//6\nf 9729//1 9730//1 9732//1\nf 9733//2 9736//2 9734//2\nf 9730//3 9729//3 9734//3\nf 9730//4 9734//4 9731//4\nf 9731//5 9735//5 9732//5\nf 9733//6 9729//6 9736//6\nf 9737//1 9738//1 9740//1\nf 9741//2 9744//2 9742//2\nf 9738//3 9737//3 9742//3\nf 9738//4 9742//4 9739//4\nf 9739//5 9743//5 9740//5\nf 9741//6 9737//6 9744//6\nf 9745//1 9746//1 9748//1\nf 9749//2 9752//2 9750//2\nf 9746//3 9745//3 9750//3\nf 9746//4 9750//4 9747//4\nf 9747//5 9751//5 9748//5\nf 9749//6 9745//6 9752//6\nf 9753//1 9754//1 9756//1\nf 9757//2 9760//2 9758//2\nf 9754//3 9753//3 9758//3\nf 9754//4 9758//4 9755//4\nf 9755//5 9759//5 9756//5\nf 9757//6 9753//6 9760//6\nf 9761//1 9762//1 9764//1\nf 9766//2 9765//2 9767//2\nf 9761//3 9765//3 9762//3\nf 9763//4 9762//4 9767//4\nf 9763//5 9767//5 9764//5\nf 9765//6 9761//6 9768//6\nf 9769//1 9770//1 9772//1\nf 9774//2 9773//2 9775//2\nf 9769//3 9773//3 9770//3\nf 9771//4 9770//4 9775//4\nf 9771//5 9775//5 9772//5\nf 9773//6 9769//6 9776//6\nf 9777//1 9778//1 9780//1\nf 9782//2 9781//2 9783//2\nf 9778//3 9777//3 9782//3\nf 9779//4 9778//4 9783//4\nf 9779//5 9783//5 9780//5\nf 9784//6 9781//6 9780//6\nf 9785//1 9786//1 9788//1\nf 9790//2 9789//2 9791//2\nf 9786//3 9785//3 9790//3\nf 9787//4 9786//4 9791//4\nf 9787//5 9791//5 9788//5\nf 9789//6 9785//6 9792//6\nf 9793//1 9794//1 9796//1\nf 9798//2 9797//2 9799//2\nf 9793//3 9797//3 9794//3\nf 9795//4 9794//4 9799//4\nf 9795//5 9799//5 9796//5\nf 9800//6 9797//6 9796//6\nf 9801//1 9802//1 9804//1\nf 9805//2 9808//2 9806//2\nf 9802//3 9801//3 9806//3\nf 9802//4 9806//4 9803//4\nf 9803//5 9807//5 9804//5\nf 9805//6 9801//6 9808//6\nf 9809//1 9810//1 9812//1\nf 9813//2 9816//2 9814//2\nf 9810//3 9809//3 9814//3\nf 9810//4 9814//4 9811//4\nf 9811//5 9815//5 9812//5\nf 9813//6 9809//6 9816//6\nf 9817//1 9818//1 9820//1\nf 9821//2 9824//2 9822//2\nf 9818//3 9817//3 9822//3\nf 9818//4 9822//4 9819//4\nf 9819//5 9823//5 9820//5\nf 9821//6 9817//6 9824//6\nf 9825//1 9826//1 9828//1\nf 9829//2 9832//2 9830//2\nf 9826//3 9825//3 9830//3\nf 9826//4 9830//4 9827//4\nf 9827//5 9831//5 9828//5\nf 9829//6 9825//6 9832//6\nf 9833//1 9834//1 9836//1\nf 9837//2 9840//2 9838//2\nf 9834//3 9833//3 9838//3\nf 9834//4 9838//4 9835//4\nf 9835//5 9839//5 9836//5\nf 9837//6 9833//6 9840//6\nf 9844//1 9841//1 9843//1\nf 9845//2 9848//2 9846//2\nf 9842//3 9841//3 9846//3\nf 9843//4 9842//4 9847//4\nf 9843//5 9847//5 9844//5\nf 9845//6 9841//6 9848//6\nf 9852//1 9849//1 9851//1\nf 9853//2 9856//2 9854//2\nf 9850//3 9849//3 9854//3\nf 9851//4 9850//4 9855//4\nf 9851//5 9855//5 9852//5\nf 9853//6 9849//6 9856//6\nf 9857//1 9858//1 9860//1\nf 9861//2 9864//2 9862//2\nf 9858//3 9857//3 9862//3\nf 9859//4 9858//4 9863//4\nf 9859//5 9863//5 9860//5\nf 9864//6 9861//6 9860//6\nf 9865//1 9866//1 9868//1\nf 9869//2 9872//2 9870//2\nf 9866//3 9865//3 9870//3\nf 9867//4 9866//4 9871//4\nf 9867//5 9871//5 9868//5\nf 9869//6 9865//6 9872//6\nf 9873//1 9874//1 9876//1\nf 9877//2 9880//2 9878//2\nf 9874//3 9873//3 9878//3\nf 9875//4 9874//4 9879//4\nf 9875//5 9879//5 9876//5\nf 9880//6 9877//6 9876//6\nf 9881//1 9882//1 9884//1\nf 9885//2 9888//2 9886//2\nf 9882//3 9881//3 9886//3\nf 9882//4 9886//4 9883//4\nf 9883//5 9887//5 9884//5\nf 9885//6 9881//6 9888//6\nf 9889//1 9890//1 9892//1\nf 9893//2 9896//2 9894//2\nf 9890//3 9889//3 9894//3\nf 9890//4 9894//4 9891//4\nf 9891//5 9895//5 9892//5\nf 9893//6 9889//6 9896//6\nf 9897//1 9898//1 9900//1\nf 9901//2 9904//2 9902//2\nf 9898//3 9897//3 9902//3\nf 9898//4 9902//4 9899//4\nf 9899//5 9903//5 9900//5\nf 9901//6 9897//6 9904//6\nf 9905//1 9906//1 9908//1\nf 9909//2 9912//2 9910//2\nf 9906//3 9905//3 9910//3\nf 9906//4 9910//4 9907//4\nf 9907//5 9911//5 9908//5\nf 9909//6 9905//6 9912//6\nf 9913//1 9914//1 9916//1\nf 9917//2 9920//2 9918//2\nf 9914//3 9913//3 9918//3\nf 9914//4 9918//4 9915//4\nf 9915//5 9919//5 9916//5\nf 9917//6 9913//6 9920//6\nf 9924//1 9921//1 9923//1\nf 9925//2 9928//2 9926//2\nf 9922//3 9921//3 9926//3\nf 9923//4 9922//4 9927//4\nf 9923//5 9927//5 9924//5\nf 9925//6 9921//6 9928//6\nf 9932//1 9929//1 9931//1\nf 9933//2 9936//2 9934//2\nf 9930//3 9929//3 9934//3\nf 9931//4 9930//4 9935//4\nf 9931//5 9935//5 9932//5\nf 9933//6 9929//6 9936//6\nf 9937//1 9938//1 9940//1\nf 9941//2 9944//2 9942//2\nf 9938//3 9937//3 9942//3\nf 9939//4 9938//4 9943//4\nf 9939//5 9943//5 9940//5\nf 9944//6 9941//6 9940//6\nf 9945//1 9946//1 9948//1\nf 9949//2 9952//2 9950//2\nf 9946//3 9945//3 9950//3\nf 9947//4 9946//4 9951//4\nf 9947//5 9951//5 9948//5\nf 9949//6 9945//6 9952//6\nf 9953//1 9954//1 9956//1\nf 9957//2 9960//2 9958//2\nf 9954//3 9953//3 9958//3\nf 9955//4 9954//4 9959//4\nf 9955//5 9959//5 9956//5\nf 9960//6 9957//6 9956//6\nf 9961//1 9962//1 9964//1\nf 9965//2 9968//2 9966//2\nf 9962//3 9961//3 9966//3\nf 9962//4 9966//4 9963//4\nf 9963//5 9967//5 9964//5\nf 9965//6 9961//6 9968//6\nf 9969//1 9970//1 9972//1\nf 9973//2 9976//2 9974//2\nf 9970//3 9969//3 9974//3\nf 9970//4 9974//4 9971//4\nf 9971//5 9975//5 9972//5\nf 9973//6 9969//6 9976//6\nf 9977//1 9978//1 9980//1\nf 9981//2 9984//2 9982//2\nf 9978//3 9977//3 9982//3\nf 9978//4 9982//4 9979//4\nf 9979//5 9983//5 9980//5\nf 9981//6 9977//6 9984//6\nf 9985//1 9986//1 9988//1\nf 9989//2 9992//2 9990//2\nf 9986//3 9985//3 9990//3\nf 9986//4 9990//4 9987//4\nf 9987//5 9991//5 9988//5\nf 9989//6 9985//6 9992//6\nf 9993//1 9994//1 9996//1\nf 9997//2 10000//2 9998//2\nf 9994//3 9993//3 9998//3\nf 9994//4 9998//4 9995//4\nf 9995//5 9999//5 9996//5\nf 9997//6 9993//6 10000//6\nf 10004//1 10001//1 10003//1\nf 10006//2 10005//2 10007//2\nf 10001//3 10005//3 10002//3\nf 10003//4 10002//4 10007//4\nf 10003//5 10007//5 10004//5\nf 10005//6 10001//6 10008//6\nf 10012//1 10009//1 10011//1\nf 10014//2 10013//2 10015//2\nf 10009//3 10013//3 10010//3\nf 10011//4 10010//4 10015//4\nf 10011//5 10015//5 10012//5\nf 10013//6 10009//6 10016//6\nf 10017//1 10018//1 10020//1\nf 10022//2 10021//2 10023//2\nf 10017//3 10021//3 10018//3\nf 10019//4 10018//4 10023//4\nf 10019//5 10023//5 10020//5\nf 10024//6 10021//6 10020//6\nf 10025//1 10026//1 10028//1\nf 10030//2 10029//2 10031//2\nf 10025//3 10029//3 10026//3\nf 10027//4 10026//4 10031//4\nf 10027//5 10031//5 10028//5\nf 10029//6 10025//6 10032//6\nf 10033//1 10034//1 10036//1\nf 10038//2 10037//2 10039//2\nf 10033//3 10037//3 10034//3\nf 10035//4 10034//4 10039//4\nf 10035//5 10039//5 10036//5\nf 10040//6 10037//6 10036//6\nf 10041//1 10042//1 10044//1\nf 10045//2 10048//2 10046//2\nf 10041//3 10045//3 10042//3\nf 10042//4 10046//4 10043//4\nf 10043//5 10047//5 10044//5\nf 10045//6 10041//6 10048//6\nf 10049//1 10050//1 10052//1\nf 10053//2 10056//2 10054//2\nf 10049//3 10053//3 10050//3\nf 10050//4 10054//4 10051//4\nf 10051//5 10055//5 10052//5\nf 10053//6 10049//6 10056//6\nf 10057//1 10058//1 10060//1\nf 10061//2 10064//2 10062//2\nf 10057//3 10061//3 10058//3\nf 10058//4 10062//4 10059//4\nf 10059//5 10063//5 10060//5\nf 10061//6 10057//6 10064//6\nf 10065//1 10066//1 10068//1\nf 10069//2 10072//2 10070//2\nf 10065//3 10069//3 10066//3\nf 10066//4 10070//4 10067//4\nf 10067//5 10071//5 10068//5\nf 10069//6 10065//6 10072//6\nf 10073//1 10074//1 10076//1\nf 10077//2 10080//2 10078//2\nf 10073//3 10077//3 10074//3\nf 10074//4 10078//4 10075//4\nf 10075//5 10079//5 10076//5\nf 10077//6 10073//6 10080//6\nf 10084//1 10081//1 10083//1\nf 10086//2 10085//2 10087//2\nf 10081//3 10085//3 10082//3\nf 10083//4 10082//4 10087//4\nf 10083//5 10087//5 10084//5\nf 10085//6 10081//6 10088//6\nf 10092//1 10089//1 10091//1\nf 10094//2 10093//2 10095//2\nf 10089//3 10093//3 10090//3\nf 10091//4 10090//4 10095//4\nf 10091//5 10095//5 10092//5\nf 10093//6 10089//6 10096//6\nf 10097//1 10098//1 10100//1\nf 10102//2 10101//2 10103//2\nf 10097//3 10101//3 10098//3\nf 10099//4 10098//4 10103//4\nf 10099//5 10103//5 10100//5\nf 10104//6 10101//6 10100//6\nf 10105//1 10106//1 10108//1\nf 10110//2 10109//2 10111//2\nf 10105//3 10109//3 10106//3\nf 10107//4 10106//4 10111//4\nf 10107//5 10111//5 10108//5\nf 10109//6 10105//6 10112//6\nf 10113//1 10114//1 10116//1\nf 10118//2 10117//2 10119//2\nf 10113//3 10117//3 10114//3\nf 10115//4 10114//4 10119//4\nf 10115//5 10119//5 10116//5\nf 10120//6 10117//6 10116//6\nf 10121//1 10122//1 10124//1\nf 10125//2 10128//2 10126//2\nf 10121//3 10125//3 10122//3\nf 10122//4 10126//4 10123//4\nf 10123//5 10127//5 10124//5\nf 10125//6 10121//6 10128//6\nf 10129//1 10130//1 10132//1\nf 10133//2 10136//2 10134//2\nf 10129//3 10133//3 10130//3\nf 10130//4 10134//4 10131//4\nf 10131//5 10135//5 10132//5\nf 10133//6 10129//6 10136//6\nf 10137//1 10138//1 10140//1\nf 10141//2 10144//2 10142//2\nf 10137//3 10141//3 10138//3\nf 10138//4 10142//4 10139//4\nf 10139//5 10143//5 10140//5\nf 10141//6 10137//6 10144//6\nf 10145//1 10146//1 10148//1\nf 10149//2 10152//2 10150//2\nf 10145//3 10149//3 10146//3\nf 10146//4 10150//4 10147//4\nf 10147//5 10151//5 10148//5\nf 10149//6 10145//6 10152//6\nf 10153//1 10154//1 10156//1\nf 10157//2 10160//2 10158//2\nf 10153//3 10157//3 10154//3\nf 10154//4 10158//4 10155//4\nf 10155//5 10159//5 10156//5\nf 10157//6 10153//6 10160//6\nf 10164//1 10161//1 10163//1\nf 10166//2 10165//2 10167//2\nf 10161//3 10165//3 10162//3\nf 10163//4 10162//4 10167//4\nf 10163//5 10167//5 10164//5\nf 10165//6 10161//6 10168//6\nf 10172//1 10169//1 10171//1\nf 10174//2 10173//2 10175//2\nf 10169//3 10173//3 10170//3\nf 10171//4 10170//4 10175//4\nf 10171//5 10175//5 10172//5\nf 10173//6 10169//6 10176//6\nf 10177//1 10178//1 10180//1\nf 10182//2 10181//2 10183//2\nf 10177//3 10181//3 10178//3\nf 10179//4 10178//4 10183//4\nf 10179//5 10183//5 10180//5\nf 10184//6 10181//6 10180//6\nf 10185//1 10186//1 10188//1\nf 10190//2 10189//2 10191//2\nf 10185//3 10189//3 10186//3\nf 10187//4 10186//4 10191//4\nf 10187//5 10191//5 10188//5\nf 10189//6 10185//6 10192//6\nf 10193//1 10194//1 10196//1\nf 10198//2 10197//2 10199//2\nf 10193//3 10197//3 10194//3\nf 10195//4 10194//4 10199//4\nf 10195//5 10199//5 10196//5\nf 10200//6 10197//6 10196//6\nf 10201//1 10202//1 10204//1\nf 10205//2 10208//2 10206//2\nf 10201//3 10205//3 10202//3\nf 10202//4 10206//4 10203//4\nf 10203//5 10207//5 10204//5\nf 10205//6 10201//6 10208//6\nf 10209//1 10210//1 10212//1\nf 10213//2 10216//2 10214//2\nf 10209//3 10213//3 10210//3\nf 10210//4 10214//4 10211//4\nf 10211//5 10215//5 10212//5\nf 10213//6 10209//6 10216//6\nf 10217//1 10218//1 10220//1\nf 10221//2 10224//2 10222//2\nf 10217//3 10221//3 10218//3\nf 10218//4 10222//4 10219//4\nf 10219//5 10223//5 10220//5\nf 10221//6 10217//6 10224//6\nf 10225//1 10226//1 10228//1\nf 10229//2 10232//2 10230//2\nf 10225//3 10229//3 10226//3\nf 10226//4 10230//4 10227//4\nf 10227//5 10231//5 10228//5\nf 10229//6 10225//6 10232//6\nf 10233//1 10234//1 10236//1\nf 10237//2 10240//2 10238//2\nf 10233//3 10237//3 10234//3\nf 10234//4 10238//4 10235//4\nf 10235//5 10239//5 10236//5\nf 10237//6 10233//6 10240//6\nf 10244//1 10241//1 10243//1\nf 10246//2 10245//2 10247//2\nf 10241//3 10245//3 10242//3\nf 10243//4 10242//4 10247//4\nf 10243//5 10247//5 10244//5\nf 10245//6 10241//6 10248//6\nf 10252//1 10249//1 10251//1\nf 10254//2 10253//2 10255//2\nf 10249//3 10253//3 10250//3\nf 10251//4 10250//4 10255//4\nf 10251//5 10255//5 10252//5\nf 10253//6 10249//6 10256//6\nf 10257//1 10258//1 10260//1\nf 10262//2 10261//2 10263//2\nf 10257//3 10261//3 10258//3\nf 10259//4 10258//4 10263//4\nf 10259//5 10263//5 10260//5\nf 10264//6 10261//6 10260//6\nf 10265//1 10266//1 10268//1\nf 10270//2 10269//2 10271//2\nf 10265//3 10269//3 10266//3\nf 10267//4 10266//4 10271//4\nf 10267//5 10271//5 10268//5\nf 10269//6 10265//6 10272//6\nf 10273//1 10274//1 10276//1\nf 10278//2 10277//2 10279//2\nf 10273//3 10277//3 10274//3\nf 10275//4 10274//4 10279//4\nf 10275//5 10279//5 10276//5\nf 10280//6 10277//6 10276//6\nf 10281//1 10282//1 10284//1\nf 10285//2 10288//2 10286//2\nf 10281//3 10285//3 10282//3\nf 10282//4 10286//4 10283//4\nf 10283//5 10287//5 10284//5\nf 10285//6 10281//6 10288//6\nf 10289//1 10290//1 10292//1\nf 10293//2 10296//2 10294//2\nf 10289//3 10293//3 10290//3\nf 10290//4 10294//4 10291//4\nf 10291//5 10295//5 10292//5\nf 10293//6 10289//6 10296//6\nf 10297//1 10298//1 10300//1\nf 10301//2 10304//2 10302//2\nf 10297//3 10301//3 10298//3\nf 10298//4 10302//4 10299//4\nf 10299//5 10303//5 10300//5\nf 10301//6 10297//6 10304//6\nf 10305//1 10306//1 10308//1\nf 10309//2 10312//2 10310//2\nf 10305//3 10309//3 10306//3\nf 10306//4 10310//4 10307//4\nf 10307//5 10311//5 10308//5\nf 10309//6 10305//6 10312//6\nf 10313//1 10314//1 10316//1\nf 10317//2 10320//2 10318//2\nf 10313//3 10317//3 10314//3\nf 10314//4 10318//4 10315//4\nf 10315//5 10319//5 10316//5\nf 10317//6 10313//6 10320//6\nf 10324//1 10321//1 10323//1\nf 10326//2 10325//2 10327//2\nf 10321//3 10325//3 10322//3\nf 10323//4 10322//4 10327//4\nf 10323//5 10327//5 10324//5\nf 10325//6 10321//6 10328//6\nf 10332//1 10329//1 10331//1\nf 10334//2 10333//2 10335//2\nf 10329//3 10333//3 10330//3\nf 10331//4 10330//4 10335//4\nf 10331//5 10335//5 10332//5\nf 10333//6 10329//6 10336//6\nf 10337//1 10338//1 10340//1\nf 10342//2 10341//2 10343//2\nf 10337//3 10341//3 10338//3\nf 10339//4 10338//4 10343//4\nf 10339//5 10343//5 10340//5\nf 10344//6 10341//6 10340//6\nf 10345//1 10346//1 10348//1\nf 10350//2 10349//2 10351//2\nf 10345//3 10349//3 10346//3\nf 10347//4 10346//4 10351//4\nf 10347//5 10351//5 10348//5\nf 10349//6 10345//6 10352//6\nf 10353//1 10354//1 10356//1\nf 10358//2 10357//2 10359//2\nf 10353//3 10357//3 10354//3\nf 10355//4 10354//4 10359//4\nf 10355//5 10359//5 10356//5\nf 10360//6 10357//6 10356//6\nf 10361//1 10362//1 10364//1\nf 10365//2 10368//2 10366//2\nf 10361//3 10365//3 10362//3\nf 10362//4 10366//4 10363//4\nf 10363//5 10367//5 10364//5\nf 10365//6 10361//6 10368//6\nf 10369//1 10370//1 10372//1\nf 10373//2 10376//2 10374//2\nf 10369//3 10373//3 10370//3\nf 10370//4 10374//4 10371//4\nf 10371//5 10375//5 10372//5\nf 10373//6 10369//6 10376//6\nf 10377//1 10378//1 10380//1\nf 10381//2 10384//2 10382//2\nf 10377//3 10381//3 10378//3\nf 10378//4 10382//4 10379//4\nf 10379//5 10383//5 10380//5\nf 10381//6 10377//6 10384//6\nf 10385//1 10386//1 10388//1\nf 10389//2 10392//2 10390//2\nf 10385//3 10389//3 10386//3\nf 10386//4 10390//4 10387//4\nf 10387//5 10391//5 10388//5\nf 10389//6 10385//6 10392//6\nf 10393//1 10394//1 10396//1\nf 10397//2 10400//2 10398//2\nf 10393//3 10397//3 10394//3\nf 10394//4 10398//4 10395//4\nf 10395//5 10399//5 10396//5\nf 10397//6 10393//6 10400//6\nf 10401//1 10404//1 10402//1\nf 10408//2 10405//2 10407//2\nf 10405//5 10401//5 10406//5\nf 10406//4 10402//4 10407//4\nf 10403//3 10404//3 10407//3\nf 10405//6 10408//6 10401//6\nf 10409//1 10412//1 10410//1\nf 10416//2 10413//2 10415//2\nf 10413//5 10409//5 10414//5\nf 10414//4 10410//4 10415//4\nf 10411//3 10412//3 10415//3\nf 10409//6 10413//6 10412//6\nf 10417//1 10420//1 10418//1\nf 10424//2 10421//2 10423//2\nf 10421//5 10417//5 10422//5\nf 10422//4 10418//4 10423//4\nf 10419//3 10420//3 10423//3\nf 10417//6 10421//6 10420//6\nf 10425//1 10428//1 10426//1\nf 10429//2 10430//2 10432//2\nf 10429//5 10425//5 10430//5\nf 10430//4 10426//4 10431//4\nf 10427//3 10428//3 10431//3\nf 10429//6 10432//6 10425//6\nf 10433//1 10436//1 10434//1\nf 10440//2 10437//2 10439//2\nf 10437//5 10433//5 10438//5\nf 10438//4 10434//4 10439//4\nf 10435//3 10436//3 10439//3\nf 10433//6 10437//6 10436//6\nf 10441//1 10444//1 10442//1\nf 10445//2 10446//2 10448//2\nf 10445//5 10441//5 10446//5\nf 10442//4 10443//4 10446//4\nf 10443//3 10444//3 10447//3\nf 10445//6 10448//6 10441//6\nf 10449//1 10452//1 10450//1\nf 10453//2 10454//2 10456//2\nf 10453//5 10449//5 10454//5\nf 10450//4 10451//4 10454//4\nf 10451//3 10452//3 10455//3\nf 10453//6 10456//6 10449//6\nf 10457//1 10460//1 10458//1\nf 10461//2 10462//2 10464//2\nf 10461//5 10457//5 10462//5\nf 10458//4 10459//4 10462//4\nf 10459//3 10460//3 10463//3\nf 10461//6 10464//6 10457//6\nf 10465//1 10468//1 10466//1\nf 10469//2 10470//2 10472//2\nf 10469//5 10465//5 10470//5\nf 10466//4 10467//4 10470//4\nf 10467//3 10468//3 10471//3\nf 10469//6 10472//6 10465//6\nf 10473//1 10476//1 10474//1\nf 10477//2 10478//2 10480//2\nf 10477//5 10473//5 10478//5\nf 10474//4 10475//4 10478//4\nf 10475//3 10476//3 10479//3\nf 10477//6 10480//6 10473//6\nf 10481//1 10484//1 10482//1\nf 10488//2 10485//2 10487//2\nf 10481//5 10482//5 10485//5\nf 10486//4 10482//4 10487//4\nf 10483//3 10484//3 10487//3\nf 10485//6 10488//6 10481//6\nf 10489//1 10492//1 10490//1\nf 10496//2 10493//2 10495//2\nf 10493//5 10489//5 10494//5\nf 10494//4 10490//4 10495//4\nf 10491//3 10492//3 10495//3\nf 10489//6 10493//6 10492//6\nf 10497//1 10500//1 10498//1\nf 10504//2 10501//2 10503//2\nf 10501//5 10497//5 10502//5\nf 10502//4 10498//4 10503//4\nf 10499//3 10500//3 10503//3\nf 10497//6 10501//6 10500//6\nf 10505//1 10508//1 10506//1\nf 10509//2 10510//2 10512//2\nf 10509//5 10505//5 10510//5\nf 10510//4 10506//4 10511//4\nf 10507//3 10508//3 10511//3\nf 10509//6 10512//6 10505//6\nf 10513//1 10516//1 10514//1\nf 10517//2 10518//2 10520//2\nf 10517//5 10513//5 10518//5\nf 10518//4 10514//4 10519//4\nf 10515//3 10516//3 10519//3\nf 10513//6 10517//6 10516//6\nf 10521//1 10524//1 10522//1\nf 10525//2 10526//2 10528//2\nf 10525//5 10521//5 10526//5\nf 10522//4 10523//4 10526//4\nf 10523//3 10524//3 10527//3\nf 10525//6 10528//6 10521//6\nf 10529//1 10532//1 10530//1\nf 10533//2 10534//2 10536//2\nf 10533//5 10529//5 10534//5\nf 10530//4 10531//4 10534//4\nf 10531//3 10532//3 10535//3\nf 10533//6 10536//6 10529//6\nf 10537//1 10540//1 10538//1\nf 10541//2 10542//2 10544//2\nf 10541//5 10537//5 10542//5\nf 10538//4 10539//4 10542//4\nf 10539//3 10540//3 10543//3\nf 10541//6 10544//6 10537//6\nf 10545//1 10548//1 10546//1\nf 10549//2 10550//2 10552//2\nf 10549//5 10545//5 10550//5\nf 10546//4 10547//4 10550//4\nf 10547//3 10548//3 10551//3\nf 10549//6 10552//6 10545//6\nf 10553//1 10556//1 10554//1\nf 10557//2 10558//2 10560//2\nf 10557//5 10553//5 10558//5\nf 10554//4 10555//4 10558//4\nf 10555//3 10556//3 10559//3\nf 10557//6 10560//6 10553//6\nf 10562//1 10561//1 10563//1\nf 10568//2 10565//2 10567//2\nf 10561//5 10562//5 10565//5\nf 10566//4 10562//4 10567//4\nf 10563//3 10564//3 10567//3\nf 10565//6 10568//6 10561//6\nf 10569//1 10572//1 10570//1\nf 10576//2 10573//2 10575//2\nf 10569//5 10570//5 10573//5\nf 10574//4 10570//4 10575//4\nf 10571//3 10572//3 10575//3\nf 10569//6 10573//6 10572//6\nf 10577//1 10580//1 10578//1\nf 10584//2 10581//2 10583//2\nf 10581//5 10577//5 10582//5\nf 10582//4 10578//4 10583//4\nf 10579//3 10580//3 10583//3\nf 10577//6 10581//6 10580//6\nf 10585//1 10588//1 10586//1\nf 10592//2 10589//2 10591//2\nf 10589//5 10585//5 10590//5\nf 10590//4 10586//4 10591//4\nf 10587//3 10588//3 10591//3\nf 10589//6 10592//6 10585//6\nf 10593//1 10596//1 10594//1\nf 10600//2 10597//2 10599//2\nf 10593//5 10594//5 10597//5\nf 10598//4 10594//4 10599//4\nf 10595//3 10596//3 10599//3\nf 10593//6 10597//6 10596//6\nf 10601//1 10604//1 10602//1\nf 10605//2 10606//2 10608//2\nf 10605//5 10601//5 10606//5\nf 10602//4 10603//4 10606//4\nf 10603//3 10604//3 10607//3\nf 10605//6 10608//6 10601//6\nf 10609//1 10612//1 10610//1\nf 10613//2 10614//2 10616//2\nf 10613//5 10609//5 10614//5\nf 10610//4 10611//4 10614//4\nf 10611//3 10612//3 10615//3\nf 10613//6 10616//6 10609//6\nf 10617//1 10620//1 10618//1\nf 10621//2 10622//2 10624//2\nf 10621//5 10617//5 10622//5\nf 10618//4 10619//4 10622//4\nf 10619//3 10620//3 10623//3\nf 10621//6 10624//6 10617//6\nf 10625//1 10628//1 10626//1\nf 10629//2 10630//2 10632//2\nf 10629//5 10625//5 10630//5\nf 10626//4 10627//4 10630//4\nf 10627//3 10628//3 10631//3\nf 10629//6 10632//6 10625//6\nf 10633//1 10636//1 10634//1\nf 10637//2 10638//2 10640//2\nf 10637//5 10633//5 10638//5\nf 10634//4 10635//4 10638//4\nf 10635//3 10636//3 10639//3\nf 10637//6 10640//6 10633//6\nf 10642//1 10641//1 10643//1\nf 10645//2 10646//2 10648//2\nf 10645//5 10641//5 10646//5\nf 10646//4 10642//4 10647//4\nf 10643//3 10644//3 10647//3\nf 10645//6 10648//6 10641//6\nf 10650//1 10649//1 10651//1\nf 10653//2 10654//2 10656//2\nf 10653//5 10649//5 10654//5\nf 10654//4 10650//4 10655//4\nf 10651//3 10652//3 10655//3\nf 10649//6 10653//6 10652//6\nf 10657//1 10660//1 10658//1\nf 10661//2 10662//2 10664//2\nf 10661//5 10657//5 10662//5\nf 10662//4 10658//4 10663//4\nf 10659//3 10660//3 10663//3\nf 10657//6 10661//6 10660//6\nf 10665//1 10668//1 10666//1\nf 10669//2 10670//2 10672//2\nf 10669//5 10665//5 10670//5\nf 10670//4 10666//4 10671//4\nf 10667//3 10668//3 10671//3\nf 10669//6 10672//6 10665//6\nf 10673//1 10676//1 10674//1\nf 10677//2 10678//2 10680//2\nf 10677//5 10673//5 10678//5\nf 10678//4 10674//4 10679//4\nf 10675//3 10676//3 10679//3\nf 10673//6 10677//6 10676//6\nf 10681//1 10684//1 10682//1\nf 10685//2 10686//2 10688//2\nf 10685//5 10681//5 10686//5\nf 10682//4 10683//4 10686//4\nf 10683//3 10684//3 10687//3\nf 10685//6 10688//6 10681//6\nf 10689//1 10692//1 10690//1\nf 10693//2 10694//2 10696//2\nf 10693//5 10689//5 10694//5\nf 10690//4 10691//4 10694//4\nf 10691//3 10692//3 10695//3\nf 10693//6 10696//6 10689//6\nf 10697//1 10700//1 10698//1\nf 10701//2 10702//2 10704//2\nf 10701//5 10697//5 10702//5\nf 10698//4 10699//4 10702//4\nf 10699//3 10700//3 10703//3\nf 10701//6 10704//6 10697//6\nf 10705//1 10708//1 10706//1\nf 10709//2 10710//2 10712//2\nf 10709//5 10705//5 10710//5\nf 10706//4 10707//4 10710//4\nf 10707//3 10708//3 10711//3\nf 10709//6 10712//6 10705//6\nf 10713//1 10716//1 10714//1\nf 10717//2 10718//2 10720//2\nf 10717//5 10713//5 10718//5\nf 10714//4 10715//4 10718//4\nf 10715//3 10716//3 10719//3\nf 10717//6 10720//6 10713//6\nf 10722//1 10721//1 10723//1\nf 10725//2 10726//2 10728//2\nf 10725//5 10721//5 10726//5\nf 10726//4 10722//4 10727//4\nf 10723//3 10724//3 10727//3\nf 10725//6 10728//6 10721//6\nf 10730//1 10729//1 10731//1\nf 10733//2 10734//2 10736//2\nf 10733//5 10729//5 10734//5\nf 10734//4 10730//4 10735//4\nf 10731//3 10732//3 10735//3\nf 10729//6 10733//6 10732//6\nf 10737//1 10740//1 10738//1\nf 10741//2 10742//2 10744//2\nf 10741//5 10737//5 10742//5\nf 10742//4 10738//4 10743//4\nf 10739//3 10740//3 10743//3\nf 10737//6 10741//6 10740//6\nf 10745//1 10748//1 10746//1\nf 10749//2 10750//2 10752//2\nf 10749//5 10745//5 10750//5\nf 10750//4 10746//4 10751//4\nf 10747//3 10748//3 10751//3\nf 10749//6 10752//6 10745//6\nf 10753//1 10756//1 10754//1\nf 10757//2 10758//2 10760//2\nf 10757//5 10753//5 10758//5\nf 10758//4 10754//4 10759//4\nf 10755//3 10756//3 10759//3\nf 10753//6 10757//6 10756//6\nf 10761//1 10764//1 10762//1\nf 10765//2 10766//2 10768//2\nf 10765//5 10761//5 10766//5\nf 10762//4 10763//4 10766//4\nf 10763//3 10764//3 10767//3\nf 10765//6 10768//6 10761//6\nf 10769//1 10772//1 10770//1\nf 10773//2 10774//2 10776//2\nf 10773//5 10769//5 10774//5\nf 10770//4 10771//4 10774//4\nf 10771//3 10772//3 10775//3\nf 10773//6 10776//6 10769//6\nf 10777//1 10780//1 10778//1\nf 10781//2 10782//2 10784//2\nf 10781//5 10777//5 10782//5\nf 10778//4 10779//4 10782//4\nf 10779//3 10780//3 10783//3\nf 10781//6 10784//6 10777//6\nf 10785//1 10788//1 10786//1\nf 10789//2 10790//2 10792//2\nf 10789//5 10785//5 10790//5\nf 10786//4 10787//4 10790//4\nf 10787//3 10788//3 10791//3\nf 10789//6 10792//6 10785//6\nf 10793//1 10796//1 10794//1\nf 10797//2 10798//2 10800//2\nf 10797//5 10793//5 10798//5\nf 10794//4 10795//4 10798//4\nf 10795//3 10796//3 10799//3\nf 10797//6 10800//6 10793//6\nf 10802//1 10801//1 10803//1\nf 10808//2 10805//2 10807//2\nf 10801//5 10802//5 10805//5\nf 10806//4 10802//4 10807//4\nf 10803//3 10804//3 10807//3\nf 10805//6 10808//6 10801//6\nf 10810//1 10809//1 10811//1\nf 10816//2 10813//2 10815//2\nf 10809//5 10810//5 10813//5\nf 10814//4 10810//4 10815//4\nf 10811//3 10812//3 10815//3\nf 10809//6 10813//6 10812//6\nf 10817//1 10820//1 10818//1\nf 10824//2 10821//2 10823//2\nf 10817//5 10818//5 10821//5\nf 10822//4 10818//4 10823//4\nf 10819//3 10820//3 10823//3\nf 10817//6 10821//6 10820//6\nf 10825//1 10828//1 10826//1\nf 10832//2 10829//2 10831//2\nf 10825//5 10826//5 10829//5\nf 10830//4 10826//4 10831//4\nf 10827//3 10828//3 10831//3\nf 10829//6 10832//6 10825//6\nf 10833//1 10836//1 10834//1\nf 10840//2 10837//2 10839//2\nf 10833//5 10834//5 10837//5\nf 10838//4 10834//4 10839//4\nf 10835//3 10836//3 10839//3\nf 10833//6 10837//6 10836//6\nf 10841//1 10844//1 10842//1\nf 10845//2 10846//2 10848//2\nf 10841//5 10842//5 10845//5\nf 10842//4 10843//4 10846//4\nf 10843//3 10844//3 10847//3\nf 10845//6 10848//6 10841//6\nf 10849//1 10852//1 10850//1\nf 10853//2 10854//2 10856//2\nf 10849//5 10850//5 10853//5\nf 10850//4 10851//4 10854//4\nf 10851//3 10852//3 10855//3\nf 10853//6 10856//6 10849//6\nf 10857//1 10860//1 10858//1\nf 10861//2 10862//2 10864//2\nf 10857//5 10858//5 10861//5\nf 10858//4 10859//4 10862//4\nf 10859//3 10860//3 10863//3\nf 10861//6 10864//6 10857//6\nf 10865//1 10868//1 10866//1\nf 10869//2 10870//2 10872//2\nf 10865//5 10866//5 10869//5\nf 10866//4 10867//4 10870//4\nf 10867//3 10868//3 10871//3\nf 10869//6 10872//6 10865//6\nf 10873//1 10876//1 10874//1\nf 10877//2 10878//2 10880//2\nf 10873//5 10874//5 10877//5\nf 10874//4 10875//4 10878//4\nf 10875//3 10876//3 10879//3\nf 10877//6 10880//6 10873//6\nf 10882//1 10881//1 10883//1\nf 10888//2 10885//2 10887//2\nf 10881//5 10882//5 10885//5\nf 10886//4 10882//4 10887//4\nf 10883//3 10884//3 10887//3\nf 10885//6 10888//6 10881//6\nf 10890//1 10889//1 10891//1\nf 10896//2 10893//2 10895//2\nf 10889//5 10890//5 10893//5\nf 10894//4 10890//4 10895//4\nf 10891//3 10892//3 10895//3\nf 10889//6 10893//6 10892//6\nf 10897//1 10900//1 10898//1\nf 10904//2 10901//2 10903//2\nf 10897//5 10898//5 10901//5\nf 10902//4 10898//4 10903//4\nf 10899//3 10900//3 10903//3\nf 10897//6 10901//6 10900//6\nf 10905//1 10908//1 10906//1\nf 10912//2 10909//2 10911//2\nf 10905//5 10906//5 10909//5\nf 10910//4 10906//4 10911//4\nf 10907//3 10908//3 10911//3\nf 10909//6 10912//6 10905//6\nf 10913//1 10916//1 10914//1\nf 10920//2 10917//2 10919//2\nf 10913//5 10914//5 10917//5\nf 10918//4 10914//4 10919//4\nf 10915//3 10916//3 10919//3\nf 10913//6 10917//6 10916//6\nf 10921//1 10924//1 10922//1\nf 10925//2 10926//2 10928//2\nf 10921//5 10922//5 10925//5\nf 10922//4 10923//4 10926//4\nf 10923//3 10924//3 10927//3\nf 10925//6 10928//6 10921//6\nf 10929//1 10932//1 10930//1\nf 10933//2 10934//2 10936//2\nf 10929//5 10930//5 10933//5\nf 10930//4 10931//4 10934//4\nf 10931//3 10932//3 10935//3\nf 10933//6 10936//6 10929//6\nf 10937//1 10940//1 10938//1\nf 10941//2 10942//2 10944//2\nf 10937//5 10938//5 10941//5\nf 10938//4 10939//4 10942//4\nf 10939//3 10940//3 10943//3\nf 10941//6 10944//6 10937//6\nf 10945//1 10948//1 10946//1\nf 10949//2 10950//2 10952//2\nf 10945//5 10946//5 10949//5\nf 10946//4 10947//4 10950//4\nf 10947//3 10948//3 10951//3\nf 10949//6 10952//6 10945//6\nf 10953//1 10956//1 10954//1\nf 10957//2 10958//2 10960//2\nf 10953//5 10954//5 10957//5\nf 10954//4 10955//4 10958//4\nf 10955//3 10956//3 10959//3\nf 10957//6 10960//6 10953//6\nf 10962//1 10961//1 10963//1\nf 10968//2 10965//2 10967//2\nf 10961//5 10962//5 10965//5\nf 10966//4 10962//4 10967//4\nf 10963//3 10964//3 10967//3\nf 10965//6 10968//6 10961//6\nf 10970//1 10969//1 10971//1\nf 10976//2 10973//2 10975//2\nf 10969//5 10970//5 10973//5\nf 10974//4 10970//4 10975//4\nf 10971//3 10972//3 10975//3\nf 10969//6 10973//6 10972//6\nf 10977//1 10980//1 10978//1\nf 10984//2 10981//2 10983//2\nf 10977//5 10978//5 10981//5\nf 10982//4 10978//4 10983//4\nf 10979//3 10980//3 10983//3\nf 10977//6 10981//6 10980//6\nf 10985//1 10988//1 10986//1\nf 10992//2 10989//2 10991//2\nf 10985//5 10986//5 10989//5\nf 10990//4 10986//4 10991//4\nf 10987//3 10988//3 10991//3\nf 10989//6 10992//6 10985//6\nf 10993//1 10996//1 10994//1\nf 11000//2 10997//2 10999//2\nf 10993//5 10994//5 10997//5\nf 10998//4 10994//4 10999//4\nf 10995//3 10996//3 10999//3\nf 10993//6 10997//6 10996//6\nf 11001//1 11004//1 11002//1\nf 11005//2 11006//2 11008//2\nf 11001//5 11002//5 11005//5\nf 11002//4 11003//4 11006//4\nf 11003//3 11004//3 11007//3\nf 11005//6 11008//6 11001//6\nf 11009//1 11012//1 11010//1\nf 11013//2 11014//2 11016//2\nf 11009//5 11010//5 11013//5\nf 11010//4 11011//4 11014//4\nf 11011//3 11012//3 11015//3\nf 11013//6 11016//6 11009//6\nf 11017//1 11020//1 11018//1\nf 11021//2 11022//2 11024//2\nf 11017//5 11018//5 11021//5\nf 11018//4 11019//4 11022//4\nf 11019//3 11020//3 11023//3\nf 11021//6 11024//6 11017//6\nf 11025//1 11028//1 11026//1\nf 11029//2 11030//2 11032//2\nf 11025//5 11026//5 11029//5\nf 11026//4 11027//4 11030//4\nf 11027//3 11028//3 11031//3\nf 11029//6 11032//6 11025//6\nf 11033//1 11036//1 11034//1\nf 11037//2 11038//2 11040//2\nf 11033//5 11034//5 11037//5\nf 11034//4 11035//4 11038//4\nf 11035//3 11036//3 11039//3\nf 11037//6 11040//6 11033//6\nf 11042//1 11041//1 11043//1\nf 11048//2 11045//2 11047//2\nf 11041//5 11042//5 11045//5\nf 11046//4 11042//4 11047//4\nf 11043//3 11044//3 11047//3\nf 11045//6 11048//6 11041//6\nf 11050//1 11049//1 11051//1\nf 11056//2 11053//2 11055//2\nf 11049//5 11050//5 11053//5\nf 11054//4 11050//4 11055//4\nf 11051//3 11052//3 11055//3\nf 11049//6 11053//6 11052//6\nf 11057//1 11060//1 11058//1\nf 11064//2 11061//2 11063//2\nf 11057//5 11058//5 11061//5\nf 11062//4 11058//4 11063//4\nf 11059//3 11060//3 11063//3\nf 11057//6 11061//6 11060//6\nf 11065//1 11068//1 11066//1\nf 11072//2 11069//2 11071//2\nf 11065//5 11066//5 11069//5\nf 11070//4 11066//4 11071//4\nf 11067//3 11068//3 11071//3\nf 11069//6 11072//6 11065//6\nf 11073//1 11076//1 11074//1\nf 11080//2 11077//2 11079//2\nf 11073//5 11074//5 11077//5\nf 11078//4 11074//4 11079//4\nf 11075//3 11076//3 11079//3\nf 11073//6 11077//6 11076//6\nf 11081//1 11084//1 11082//1\nf 11085//2 11086//2 11088//2\nf 11081//5 11082//5 11085//5\nf 11082//4 11083//4 11086//4\nf 11083//3 11084//3 11087//3\nf 11085//6 11088//6 11081//6\nf 11089//1 11092//1 11090//1\nf 11093//2 11094//2 11096//2\nf 11089//5 11090//5 11093//5\nf 11090//4 11091//4 11094//4\nf 11091//3 11092//3 11095//3\nf 11093//6 11096//6 11089//6\nf 11097//1 11100//1 11098//1\nf 11101//2 11102//2 11104//2\nf 11097//5 11098//5 11101//5\nf 11098//4 11099//4 11102//4\nf 11099//3 11100//3 11103//3\nf 11101//6 11104//6 11097//6\nf 11105//1 11108//1 11106//1\nf 11109//2 11110//2 11112//2\nf 11105//5 11106//5 11109//5\nf 11106//4 11107//4 11110//4\nf 11107//3 11108//3 11111//3\nf 11109//6 11112//6 11105//6\nf 11113//1 11116//1 11114//1\nf 11117//2 11118//2 11120//2\nf 11113//5 11114//5 11117//5\nf 11114//4 11115//4 11118//4\nf 11115//3 11116//3 11119//3\nf 11117//6 11120//6 11113//6\nf 11122//1 11121//1 11123//1\nf 11128//2 11125//2 11127//2\nf 11121//5 11122//5 11125//5\nf 11126//4 11122//4 11127//4\nf 11123//3 11124//3 11127//3\nf 11125//6 11128//6 11121//6\nf 11130//1 11129//1 11131//1\nf 11136//2 11133//2 11135//2\nf 11129//5 11130//5 11133//5\nf 11134//4 11130//4 11135//4\nf 11131//3 11132//3 11135//3\nf 11129//6 11133//6 11132//6\nf 11137//1 11140//1 11138//1\nf 11144//2 11141//2 11143//2\nf 11137//5 11138//5 11141//5\nf 11142//4 11138//4 11143//4\nf 11139//3 11140//3 11143//3\nf 11137//6 11141//6 11140//6\nf 11145//1 11148//1 11146//1\nf 11152//2 11149//2 11151//2\nf 11145//5 11146//5 11149//5\nf 11150//4 11146//4 11151//4\nf 11147//3 11148//3 11151//3\nf 11149//6 11152//6 11145//6\nf 11153//1 11156//1 11154//1\nf 11160//2 11157//2 11159//2\nf 11153//5 11154//5 11157//5\nf 11158//4 11154//4 11159//4\nf 11155//3 11156//3 11159//3\nf 11153//6 11157//6 11156//6\nf 11161//1 11164//1 11162//1\nf 11165//2 11166//2 11168//2\nf 11161//5 11162//5 11165//5\nf 11162//4 11163//4 11166//4\nf 11163//3 11164//3 11167//3\nf 11165//6 11168//6 11161//6\nf 11169//1 11172//1 11170//1\nf 11173//2 11174//2 11176//2\nf 11169//5 11170//5 11173//5\nf 11170//4 11171//4 11174//4\nf 11171//3 11172//3 11175//3\nf 11173//6 11176//6 11169//6\nf 11177//1 11180//1 11178//1\nf 11181//2 11182//2 11184//2\nf 11177//5 11178//5 11181//5\nf 11178//4 11179//4 11182//4\nf 11179//3 11180//3 11183//3\nf 11181//6 11184//6 11177//6\nf 11185//1 11188//1 11186//1\nf 11189//2 11190//2 11192//2\nf 11185//5 11186//5 11189//5\nf 11186//4 11187//4 11190//4\nf 11187//3 11188//3 11191//3\nf 11189//6 11192//6 11185//6\nf 11193//1 11196//1 11194//1\nf 11197//2 11198//2 11200//2\nf 11193//5 11194//5 11197//5\nf 11194//4 11195//4 11198//4\nf 11195//3 11196//3 11199//3\nf 11197//6 11200//6 11193//6\nf 11201//1 11202//1 11204//1\nf 11205//2 11208//2 11206//2\nf 11202//3 11201//3 11206//3\nf 11203//4 11202//4 11207//4\nf 11203//5 11207//5 11204//5\nf 11205//6 11201//6 11208//6\nf 11209//1 11210//1 11212//1\nf 11214//2 11213//2 11215//2\nf 11210//3 11209//3 11214//3\nf 11211//4 11210//4 11215//4\nf 11211//5 11215//5 11212//5\nf 11213//6 11209//6 11216//6\nf 11217//1 11218//1 11220//1\nf 11221//2 11224//2 11222//2\nf 11218//3 11217//3 11222//3\nf 11219//4 11218//4 11223//4\nf 11219//5 11223//5 11220//5\nf 11224//6 11221//6 11220//6\nf 11225//1 11226//1 11228//1\nf 11229//2 11232//2 11230//2\nf 11226//3 11225//3 11230//3\nf 11227//4 11226//4 11231//4\nf 11227//5 11231//5 11228//5\nf 11229//6 11225//6 11232//6\nf 11233//1 11234//1 11236//1\nf 11238//2 11237//2 11239//2\nf 11234//3 11233//3 11238//3\nf 11235//4 11234//4 11239//4\nf 11235//5 11239//5 11236//5\nf 11240//6 11237//6 11236//6\nf 11241//1 11242//1 11244//1\nf 11245//2 11248//2 11246//2\nf 11242//3 11241//3 11246//3\nf 11242//4 11246//4 11243//4\nf 11243//5 11247//5 11244//5\nf 11245//6 11241//6 11248//6\nf 11249//1 11250//1 11252//1\nf 11253//2 11256//2 11254//2\nf 11250//3 11249//3 11254//3\nf 11250//4 11254//4 11251//4\nf 11251//5 11255//5 11252//5\nf 11253//6 11249//6 11256//6\nf 11257//1 11258//1 11260//1\nf 11261//2 11264//2 11262//2\nf 11258//3 11257//3 11262//3\nf 11258//4 11262//4 11259//4\nf 11259//5 11263//5 11260//5\nf 11261//6 11257//6 11264//6\nf 11265//1 11266//1 11268//1\nf 11269//2 11272//2 11270//2\nf 11266//3 11265//3 11270//3\nf 11266//4 11270//4 11267//4\nf 11267//5 11271//5 11268//5\nf 11269//6 11265//6 11272//6\nf 11273//1 11274//1 11276//1\nf 11277//2 11280//2 11278//2\nf 11274//3 11273//3 11278//3\nf 11274//4 11278//4 11275//4\nf 11275//5 11279//5 11276//5\nf 11277//6 11273//6 11280//6\nf 11281//1 11282//1 11284//1\nf 11285//2 11288//2 11286//2\nf 11281//3 11285//3 11282//3\nf 11283//4 11282//4 11287//4\nf 11283//5 11287//5 11284//5\nf 11285//6 11281//6 11288//6\nf 11289//1 11290//1 11292//1\nf 11294//2 11293//2 11295//2\nf 11290//3 11289//3 11294//3\nf 11291//4 11290//4 11295//4\nf 11291//5 11295//5 11292//5\nf 11293//6 11289//6 11296//6\nf 11297//1 11298//1 11300//1\nf 11301//2 11304//2 11302//2\nf 11298//3 11297//3 11302//3\nf 11299//4 11298//4 11303//4\nf 11299//5 11303//5 11300//5\nf 11304//6 11301//6 11300//6\nf 11305//1 11306//1 11308//1\nf 11309//2 11312//2 11310//2\nf 11306//3 11305//3 11310//3\nf 11307//4 11306//4 11311//4\nf 11307//5 11311//5 11308//5\nf 11309//6 11305//6 11312//6\nf 11313//1 11314//1 11316//1\nf 11318//2 11317//2 11319//2\nf 11314//3 11313//3 11318//3\nf 11315//4 11314//4 11319//4\nf 11315//5 11319//5 11316//5\nf 11320//6 11317//6 11316//6\nf 11321//1 11322//1 11324//1\nf 11325//2 11328//2 11326//2\nf 11322//3 11321//3 11326//3\nf 11322//4 11326//4 11323//4\nf 11323//5 11327//5 11324//5\nf 11325//6 11321//6 11328//6\nf 11329//1 11330//1 11332//1\nf 11333//2 11336//2 11334//2\nf 11330//3 11329//3 11334//3\nf 11330//4 11334//4 11331//4\nf 11331//5 11335//5 11332//5\nf 11333//6 11329//6 11336//6\nf 11337//1 11338//1 11340//1\nf 11341//2 11344//2 11342//2\nf 11338//3 11337//3 11342//3\nf 11338//4 11342//4 11339//4\nf 11339//5 11343//5 11340//5\nf 11341//6 11337//6 11344//6\nf 11345//1 11346//1 11348//1\nf 11349//2 11352//2 11350//2\nf 11346//3 11345//3 11350//3\nf 11346//4 11350//4 11347//4\nf 11347//5 11351//5 11348//5\nf 11349//6 11345//6 11352//6\nf 11353//1 11354//1 11356//1\nf 11357//2 11360//2 11358//2\nf 11354//3 11353//3 11358//3\nf 11354//4 11358//4 11355//4\nf 11355//5 11359//5 11356//5\nf 11357//6 11353//6 11360//6\nf 11361//1 11362//1 11364//1\nf 11366//2 11365//2 11367//2\nf 11361//3 11365//3 11362//3\nf 11363//4 11362//4 11367//4\nf 11363//5 11367//5 11364//5\nf 11365//6 11361//6 11368//6\nf 11369//1 11370//1 11372//1\nf 11374//2 11373//2 11375//2\nf 11369//3 11373//3 11370//3\nf 11371//4 11370//4 11375//4\nf 11371//5 11375//5 11372//5\nf 11373//6 11369//6 11376//6\nf 11377//1 11378//1 11380//1\nf 11382//2 11381//2 11383//2\nf 11378//3 11377//3 11382//3\nf 11379//4 11378//4 11383//4\nf 11379//5 11383//5 11380//5\nf 11384//6 11381//6 11380//6\nf 11385//1 11386//1 11388//1\nf 11390//2 11389//2 11391//2\nf 11386//3 11385//3 11390//3\nf 11387//4 11386//4 11391//4\nf 11387//5 11391//5 11388//5\nf 11389//6 11385//6 11392//6\nf 11393//1 11394//1 11396//1\nf 11398//2 11397//2 11399//2\nf 11393//3 11397//3 11394//3\nf 11395//4 11394//4 11399//4\nf 11395//5 11399//5 11396//5\nf 11400//6 11397//6 11396//6\nf 11401//1 11402//1 11404//1\nf 11405//2 11408//2 11406//2\nf 11402//3 11401//3 11406//3\nf 11402//4 11406//4 11403//4\nf 11403//5 11407//5 11404//5\nf 11405//6 11401//6 11408//6\nf 11409//1 11410//1 11412//1\nf 11413//2 11416//2 11414//2\nf 11410//3 11409//3 11414//3\nf 11410//4 11414//4 11411//4\nf 11411//5 11415//5 11412//5\nf 11413//6 11409//6 11416//6\nf 11417//1 11418//1 11420//1\nf 11421//2 11424//2 11422//2\nf 11418//3 11417//3 11422//3\nf 11418//4 11422//4 11419//4\nf 11419//5 11423//5 11420//5\nf 11421//6 11417//6 11424//6\nf 11425//1 11426//1 11428//1\nf 11429//2 11432//2 11430//2\nf 11426//3 11425//3 11430//3\nf 11426//4 11430//4 11427//4\nf 11427//5 11431//5 11428//5\nf 11429//6 11425//6 11432//6\nf 11433//1 11434//1 11436//1\nf 11437//2 11440//2 11438//2\nf 11434//3 11433//3 11438//3\nf 11434//4 11438//4 11435//4\nf 11435//5 11439//5 11436//5\nf 11437//6 11433//6 11440//6\nf 11444//1 11441//1 11443//1\nf 11445//2 11448//2 11446//2\nf 11442//3 11441//3 11446//3\nf 11443//4 11442//4 11447//4\nf 11443//5 11447//5 11444//5\nf 11445//6 11441//6 11448//6\nf 11452//1 11449//1 11451//1\nf 11453//2 11456//2 11454//2\nf 11450//3 11449//3 11454//3\nf 11451//4 11450//4 11455//4\nf 11451//5 11455//5 11452//5\nf 11453//6 11449//6 11456//6\nf 11457//1 11458//1 11460//1\nf 11461//2 11464//2 11462//2\nf 11458//3 11457//3 11462//3\nf 11459//4 11458//4 11463//4\nf 11459//5 11463//5 11460//5\nf 11464//6 11461//6 11460//6\nf 11465//1 11466//1 11468//1\nf 11469//2 11472//2 11470//2\nf 11466//3 11465//3 11470//3\nf 11467//4 11466//4 11471//4\nf 11467//5 11471//5 11468//5\nf 11469//6 11465//6 11472//6\nf 11473//1 11474//1 11476//1\nf 11477//2 11480//2 11478//2\nf 11474//3 11473//3 11478//3\nf 11475//4 11474//4 11479//4\nf 11475//5 11479//5 11476//5\nf 11480//6 11477//6 11476//6\nf 11481//1 11482//1 11484//1\nf 11485//2 11488//2 11486//2\nf 11482//3 11481//3 11486//3\nf 11482//4 11486//4 11483//4\nf 11483//5 11487//5 11484//5\nf 11485//6 11481//6 11488//6\nf 11489//1 11490//1 11492//1\nf 11493//2 11496//2 11494//2\nf 11490//3 11489//3 11494//3\nf 11490//4 11494//4 11491//4\nf 11491//5 11495//5 11492//5\nf 11493//6 11489//6 11496//6\nf 11497//1 11498//1 11500//1\nf 11501//2 11504//2 11502//2\nf 11498//3 11497//3 11502//3\nf 11498//4 11502//4 11499//4\nf 11499//5 11503//5 11500//5\nf 11501//6 11497//6 11504//6\nf 11505//1 11506//1 11508//1\nf 11509//2 11512//2 11510//2\nf 11506//3 11505//3 11510//3\nf 11506//4 11510//4 11507//4\nf 11507//5 11511//5 11508//5\nf 11509//6 11505//6 11512//6\nf 11513//1 11514//1 11516//1\nf 11517//2 11520//2 11518//2\nf 11514//3 11513//3 11518//3\nf 11514//4 11518//4 11515//4\nf 11515//5 11519//5 11516//5\nf 11517//6 11513//6 11520//6\nf 11524//1 11521//1 11523//1\nf 11525//2 11528//2 11526//2\nf 11522//3 11521//3 11526//3\nf 11523//4 11522//4 11527//4\nf 11523//5 11527//5 11524//5\nf 11525//6 11521//6 11528//6\nf 11532//1 11529//1 11531//1\nf 11533//2 11536//2 11534//2\nf 11530//3 11529//3 11534//3\nf 11531//4 11530//4 11535//4\nf 11531//5 11535//5 11532//5\nf 11533//6 11529//6 11536//6\nf 11537//1 11538//1 11540//1\nf 11541//2 11544//2 11542//2\nf 11538//3 11537//3 11542//3\nf 11539//4 11538//4 11543//4\nf 11539//5 11543//5 11540//5\nf 11544//6 11541//6 11540//6\nf 11545//1 11546//1 11548//1\nf 11549//2 11552//2 11550//2\nf 11546//3 11545//3 11550//3\nf 11547//4 11546//4 11551//4\nf 11547//5 11551//5 11548//5\nf 11549//6 11545//6 11552//6\nf 11553//1 11554//1 11556//1\nf 11557//2 11560//2 11558//2\nf 11554//3 11553//3 11558//3\nf 11555//4 11554//4 11559//4\nf 11555//5 11559//5 11556//5\nf 11560//6 11557//6 11556//6\nf 11561//1 11562//1 11564//1\nf 11565//2 11568//2 11566//2\nf 11562//3 11561//3 11566//3\nf 11562//4 11566//4 11563//4\nf 11563//5 11567//5 11564//5\nf 11565//6 11561//6 11568//6\nf 11569//1 11570//1 11572//1\nf 11573//2 11576//2 11574//2\nf 11570//3 11569//3 11574//3\nf 11570//4 11574//4 11571//4\nf 11571//5 11575//5 11572//5\nf 11573//6 11569//6 11576//6\nf 11577//1 11578//1 11580//1\nf 11581//2 11584//2 11582//2\nf 11578//3 11577//3 11582//3\nf 11578//4 11582//4 11579//4\nf 11579//5 11583//5 11580//5\nf 11581//6 11577//6 11584//6\nf 11585//1 11586//1 11588//1\nf 11589//2 11592//2 11590//2\nf 11586//3 11585//3 11590//3\nf 11586//4 11590//4 11587//4\nf 11587//5 11591//5 11588//5\nf 11589//6 11585//6 11592//6\nf 11593//1 11594//1 11596//1\nf 11597//2 11600//2 11598//2\nf 11594//3 11593//3 11598//3\nf 11594//4 11598//4 11595//4\nf 11595//5 11599//5 11596//5\nf 11597//6 11593//6 11600//6\nf 11604//1 11601//1 11603//1\nf 11606//2 11605//2 11607//2\nf 11601//3 11605//3 11602//3\nf 11603//4 11602//4 11607//4\nf 11603//5 11607//5 11604//5\nf 11605//6 11601//6 11608//6\nf 11612//1 11609//1 11611//1\nf 11614//2 11613//2 11615//2\nf 11609//3 11613//3 11610//3\nf 11611//4 11610//4 11615//4\nf 11611//5 11615//5 11612//5\nf 11613//6 11609//6 11616//6\nf 11617//1 11618//1 11620//1\nf 11622//2 11621//2 11623//2\nf 11617//3 11621//3 11618//3\nf 11619//4 11618//4 11623//4\nf 11619//5 11623//5 11620//5\nf 11624//6 11621//6 11620//6\nf 11625//1 11626//1 11628//1\nf 11630//2 11629//2 11631//2\nf 11625//3 11629//3 11626//3\nf 11627//4 11626//4 11631//4\nf 11627//5 11631//5 11628//5\nf 11629//6 11625//6 11632//6\nf 11633//1 11634//1 11636//1\nf 11638//2 11637//2 11639//2\nf 11633//3 11637//3 11634//3\nf 11635//4 11634//4 11639//4\nf 11635//5 11639//5 11636//5\nf 11640//6 11637//6 11636//6\nf 11641//1 11642//1 11644//1\nf 11645//2 11648//2 11646//2\nf 11641//3 11645//3 11642//3\nf 11642//4 11646//4 11643//4\nf 11643//5 11647//5 11644//5\nf 11645//6 11641//6 11648//6\nf 11649//1 11650//1 11652//1\nf 11653//2 11656//2 11654//2\nf 11649//3 11653//3 11650//3\nf 11650//4 11654//4 11651//4\nf 11651//5 11655//5 11652//5\nf 11653//6 11649//6 11656//6\nf 11657//1 11658//1 11660//1\nf 11661//2 11664//2 11662//2\nf 11657//3 11661//3 11658//3\nf 11658//4 11662//4 11659//4\nf 11659//5 11663//5 11660//5\nf 11661//6 11657//6 11664//6\nf 11665//1 11666//1 11668//1\nf 11669//2 11672//2 11670//2\nf 11665//3 11669//3 11666//3\nf 11666//4 11670//4 11667//4\nf 11667//5 11671//5 11668//5\nf 11669//6 11665//6 11672//6\nf 11673//1 11674//1 11676//1\nf 11677//2 11680//2 11678//2\nf 11673//3 11677//3 11674//3\nf 11674//4 11678//4 11675//4\nf 11675//5 11679//5 11676//5\nf 11677//6 11673//6 11680//6\nf 11684//1 11681//1 11683//1\nf 11686//2 11685//2 11687//2\nf 11681//3 11685//3 11682//3\nf 11683//4 11682//4 11687//4\nf 11683//5 11687//5 11684//5\nf 11685//6 11681//6 11688//6\nf 11692//1 11689//1 11691//1\nf 11694//2 11693//2 11695//2\nf 11689//3 11693//3 11690//3\nf 11691//4 11690//4 11695//4\nf 11691//5 11695//5 11692//5\nf 11693//6 11689//6 11696//6\nf 11697//1 11698//1 11700//1\nf 11702//2 11701//2 11703//2\nf 11697//3 11701//3 11698//3\nf 11699//4 11698//4 11703//4\nf 11699//5 11703//5 11700//5\nf 11704//6 11701//6 11700//6\nf 11705//1 11706//1 11708//1\nf 11710//2 11709//2 11711//2\nf 11705//3 11709//3 11706//3\nf 11707//4 11706//4 11711//4\nf 11707//5 11711//5 11708//5\nf 11709//6 11705//6 11712//6\nf 11713//1 11714//1 11716//1\nf 11718//2 11717//2 11719//2\nf 11713//3 11717//3 11714//3\nf 11715//4 11714//4 11719//4\nf 11715//5 11719//5 11716//5\nf 11720//6 11717//6 11716//6\nf 11721//1 11722//1 11724//1\nf 11725//2 11728//2 11726//2\nf 11721//3 11725//3 11722//3\nf 11722//4 11726//4 11723//4\nf 11723//5 11727//5 11724//5\nf 11725//6 11721//6 11728//6\nf 11729//1 11730//1 11732//1\nf 11733//2 11736//2 11734//2\nf 11729//3 11733//3 11730//3\nf 11730//4 11734//4 11731//4\nf 11731//5 11735//5 11732//5\nf 11733//6 11729//6 11736//6\nf 11737//1 11738//1 11740//1\nf 11741//2 11744//2 11742//2\nf 11737//3 11741//3 11738//3\nf 11738//4 11742//4 11739//4\nf 11739//5 11743//5 11740//5\nf 11741//6 11737//6 11744//6\nf 11745//1 11746//1 11748//1\nf 11749//2 11752//2 11750//2\nf 11745//3 11749//3 11746//3\nf 11746//4 11750//4 11747//4\nf 11747//5 11751//5 11748//5\nf 11749//6 11745//6 11752//6\nf 11753//1 11754//1 11756//1\nf 11757//2 11760//2 11758//2\nf 11753//3 11757//3 11754//3\nf 11754//4 11758//4 11755//4\nf 11755//5 11759//5 11756//5\nf 11757//6 11753//6 11760//6\nf 11764//1 11761//1 11763//1\nf 11766//2 11765//2 11767//2\nf 11761//3 11765//3 11762//3\nf 11763//4 11762//4 11767//4\nf 11763//5 11767//5 11764//5\nf 11765//6 11761//6 11768//6\nf 11772//1 11769//1 11771//1\nf 11774//2 11773//2 11775//2\nf 11769//3 11773//3 11770//3\nf 11771//4 11770//4 11775//4\nf 11771//5 11775//5 11772//5\nf 11773//6 11769//6 11776//6\nf 11777//1 11778//1 11780//1\nf 11782//2 11781//2 11783//2\nf 11777//3 11781//3 11778//3\nf 11779//4 11778//4 11783//4\nf 11779//5 11783//5 11780//5\nf 11784//6 11781//6 11780//6\nf 11785//1 11786//1 11788//1\nf 11790//2 11789//2 11791//2\nf 11785//3 11789//3 11786//3\nf 11787//4 11786//4 11791//4\nf 11787//5 11791//5 11788//5\nf 11789//6 11785//6 11792//6\nf 11793//1 11794//1 11796//1\nf 11798//2 11797//2 11799//2\nf 11793//3 11797//3 11794//3\nf 11795//4 11794//4 11799//4\nf 11795//5 11799//5 11796//5\nf 11800//6 11797//6 11796//6\nf 11801//1 11802//1 11804//1\nf 11805//2 11808//2 11806//2\nf 11801//3 11805//3 11802//3\nf 11802//4 11806//4 11803//4\nf 11803//5 11807//5 11804//5\nf 11805//6 11801//6 11808//6\nf 11809//1 11810//1 11812//1\nf 11813//2 11816//2 11814//2\nf 11809//3 11813//3 11810//3\nf 11810//4 11814//4 11811//4\nf 11811//5 11815//5 11812//5\nf 11813//6 11809//6 11816//6\nf 11817//1 11818//1 11820//1\nf 11821//2 11824//2 11822//2\nf 11817//3 11821//3 11818//3\nf 11818//4 11822//4 11819//4\nf 11819//5 11823//5 11820//5\nf 11821//6 11817//6 11824//6\nf 11825//1 11826//1 11828//1\nf 11829//2 11832//2 11830//2\nf 11825//3 11829//3 11826//3\nf 11826//4 11830//4 11827//4\nf 11827//5 11831//5 11828//5\nf 11829//6 11825//6 11832//6\nf 11833//1 11834//1 11836//1\nf 11837//2 11840//2 11838//2\nf 11833//3 11837//3 11834//3\nf 11834//4 11838//4 11835//4\nf 11835//5 11839//5 11836//5\nf 11837//6 11833//6 11840//6\nf 11844//1 11841//1 11843//1\nf 11846//2 11845//2 11847//2\nf 11841//3 11845//3 11842//3\nf 11843//4 11842//4 11847//4\nf 11843//5 11847//5 11844//5\nf 11845//6 11841//6 11848//6\nf 11852//1 11849//1 11851//1\nf 11854//2 11853//2 11855//2\nf 11849//3 11853//3 11850//3\nf 11851//4 11850//4 11855//4\nf 11851//5 11855//5 11852//5\nf 11853//6 11849//6 11856//6\nf 11857//1 11858//1 11860//1\nf 11862//2 11861//2 11863//2\nf 11857//3 11861//3 11858//3\nf 11859//4 11858//4 11863//4\nf 11859//5 11863//5 11860//5\nf 11864//6 11861//6 11860//6\nf 11865//1 11866//1 11868//1\nf 11870//2 11869//2 11871//2\nf 11865//3 11869//3 11866//3\nf 11867//4 11866//4 11871//4\nf 11867//5 11871//5 11868//5\nf 11869//6 11865//6 11872//6\nf 11873//1 11874//1 11876//1\nf 11878//2 11877//2 11879//2\nf 11873//3 11877//3 11874//3\nf 11875//4 11874//4 11879//4\nf 11875//5 11879//5 11876//5\nf 11880//6 11877//6 11876//6\nf 11881//1 11882//1 11884//1\nf 11885//2 11888//2 11886//2\nf 11881//3 11885//3 11882//3\nf 11882//4 11886//4 11883//4\nf 11883//5 11887//5 11884//5\nf 11885//6 11881//6 11888//6\nf 11889//1 11890//1 11892//1\nf 11893//2 11896//2 11894//2\nf 11889//3 11893//3 11890//3\nf 11890//4 11894//4 11891//4\nf 11891//5 11895//5 11892//5\nf 11893//6 11889//6 11896//6\nf 11897//1 11898//1 11900//1\nf 11901//2 11904//2 11902//2\nf 11897//3 11901//3 11898//3\nf 11898//4 11902//4 11899//4\nf 11899//5 11903//5 11900//5\nf 11901//6 11897//6 11904//6\nf 11905//1 11906//1 11908//1\nf 11909//2 11912//2 11910//2\nf 11905//3 11909//3 11906//3\nf 11906//4 11910//4 11907//4\nf 11907//5 11911//5 11908//5\nf 11909//6 11905//6 11912//6\nf 11913//1 11914//1 11916//1\nf 11917//2 11920//2 11918//2\nf 11913//3 11917//3 11914//3\nf 11914//4 11918//4 11915//4\nf 11915//5 11919//5 11916//5\nf 11917//6 11913//6 11920//6\nf 11924//1 11921//1 11923//1\nf 11926//2 11925//2 11927//2\nf 11921//3 11925//3 11922//3\nf 11923//4 11922//4 11927//4\nf 11923//5 11927//5 11924//5\nf 11925//6 11921//6 11928//6\nf 11932//1 11929//1 11931//1\nf 11934//2 11933//2 11935//2\nf 11929//3 11933//3 11930//3\nf 11931//4 11930//4 11935//4\nf 11931//5 11935//5 11932//5\nf 11933//6 11929//6 11936//6\nf 11937//1 11938//1 11940//1\nf 11942//2 11941//2 11943//2\nf 11937//3 11941//3 11938//3\nf 11939//4 11938//4 11943//4\nf 11939//5 11943//5 11940//5\nf 11944//6 11941//6 11940//6\nf 11945//1 11946//1 11948//1\nf 11950//2 11949//2 11951//2\nf 11945//3 11949//3 11946//3\nf 11947//4 11946//4 11951//4\nf 11947//5 11951//5 11948//5\nf 11949//6 11945//6 11952//6\nf 11953//1 11954//1 11956//1\nf 11958//2 11957//2 11959//2\nf 11953//3 11957//3 11954//3\nf 11955//4 11954//4 11959//4\nf 11955//5 11959//5 11956//5\nf 11960//6 11957//6 11956//6\nf 11961//1 11962//1 11964//1\nf 11965//2 11968//2 11966//2\nf 11961//3 11965//3 11962//3\nf 11962//4 11966//4 11963//4\nf 11963//5 11967//5 11964//5\nf 11965//6 11961//6 11968//6\nf 11969//1 11970//1 11972//1\nf 11973//2 11976//2 11974//2\nf 11969//3 11973//3 11970//3\nf 11970//4 11974//4 11971//4\nf 11971//5 11975//5 11972//5\nf 11973//6 11969//6 11976//6\nf 11977//1 11978//1 11980//1\nf 11981//2 11984//2 11982//2\nf 11977//3 11981//3 11978//3\nf 11978//4 11982//4 11979//4\nf 11979//5 11983//5 11980//5\nf 11981//6 11977//6 11984//6\nf 11985//1 11986//1 11988//1\nf 11989//2 11992//2 11990//2\nf 11985//3 11989//3 11986//3\nf 11986//4 11990//4 11987//4\nf 11987//5 11991//5 11988//5\nf 11989//6 11985//6 11992//6\nf 11993//1 11994//1 11996//1\nf 11997//2 12000//2 11998//2\nf 11993//3 11997//3 11994//3\nf 11994//4 11998//4 11995//4\nf 11995//5 11999//5 11996//5\nf 11997//6 11993//6 12000//6\nf 12001//1 12004//1 12002//1\nf 12008//2 12005//2 12007//2\nf 12005//5 12001//5 12006//5\nf 12006//4 12002//4 12007//4\nf 12003//3 12004//3 12007//3\nf 12005//6 12008//6 12001//6\nf 12009//1 12012//1 12010//1\nf 12016//2 12013//2 12015//2\nf 12013//5 12009//5 12014//5\nf 12014//4 12010//4 12015//4\nf 12011//3 12012//3 12015//3\nf 12009//6 12013//6 12012//6\nf 12017//1 12020//1 12018//1\nf 12024//2 12021//2 12023//2\nf 12021//5 12017//5 12022//5\nf 12022//4 12018//4 12023//4\nf 12019//3 12020//3 12023//3\nf 12017//6 12021//6 12020//6\nf 12025//1 12028//1 12026//1\nf 12029//2 12030//2 12032//2\nf 12029//5 12025//5 12030//5\nf 12030//4 12026//4 12031//4\nf 12027//3 12028//3 12031//3\nf 12029//6 12032//6 12025//6\nf 12033//1 12036//1 12034//1\nf 12040//2 12037//2 12039//2\nf 12037//5 12033//5 12038//5\nf 12038//4 12034//4 12039//4\nf 12035//3 12036//3 12039//3\nf 12033//6 12037//6 12036//6\nf 12041//1 12044//1 12042//1\nf 12045//2 12046//2 12048//2\nf 12045//5 12041//5 12046//5\nf 12042//4 12043//4 12046//4\nf 12043//3 12044//3 12047//3\nf 12045//6 12048//6 12041//6\nf 12049//1 12052//1 12050//1\nf 12053//2 12054//2 12056//2\nf 12053//5 12049//5 12054//5\nf 12050//4 12051//4 12054//4\nf 12051//3 12052//3 12055//3\nf 12053//6 12056//6 12049//6\nf 12057//1 12060//1 12058//1\nf 12061//2 12062//2 12064//2\nf 12061//5 12057//5 12062//5\nf 12058//4 12059//4 12062//4\nf 12059//3 12060//3 12063//3\nf 12061//6 12064//6 12057//6\nf 12065//1 12068//1 12066//1\nf 12069//2 12070//2 12072//2\nf 12069//5 12065//5 12070//5\nf 12066//4 12067//4 12070//4\nf 12067//3 12068//3 12071//3\nf 12069//6 12072//6 12065//6\nf 12073//1 12076//1 12074//1\nf 12077//2 12078//2 12080//2\nf 12077//5 12073//5 12078//5\nf 12074//4 12075//4 12078//4\nf 12075//3 12076//3 12079//3\nf 12077//6 12080//6 12073//6\nf 12081//1 12084//1 12082//1\nf 12088//2 12085//2 12087//2\nf 12081//5 12082//5 12085//5\nf 12086//4 12082//4 12087//4\nf 12083//3 12084//3 12087//3\nf 12085//6 12088//6 12081//6\nf 12089//1 12092//1 12090//1\nf 12096//2 12093//2 12095//2\nf 12093//5 12089//5 12094//5\nf 12094//4 12090//4 12095//4\nf 12091//3 12092//3 12095//3\nf 12089//6 12093//6 12092//6\nf 12097//1 12100//1 12098//1\nf 12104//2 12101//2 12103//2\nf 12101//5 12097//5 12102//5\nf 12102//4 12098//4 12103//4\nf 12099//3 12100//3 12103//3\nf 12097//6 12101//6 12100//6\nf 12105//1 12108//1 12106//1\nf 12109//2 12110//2 12112//2\nf 12109//5 12105//5 12110//5\nf 12110//4 12106//4 12111//4\nf 12107//3 12108//3 12111//3\nf 12109//6 12112//6 12105//6\nf 12113//1 12116//1 12114//1\nf 12117//2 12118//2 12120//2\nf 12117//5 12113//5 12118//5\nf 12118//4 12114//4 12119//4\nf 12115//3 12116//3 12119//3\nf 12113//6 12117//6 12116//6\nf 12121//1 12124//1 12122//1\nf 12125//2 12126//2 12128//2\nf 12125//5 12121//5 12126//5\nf 12122//4 12123//4 12126//4\nf 12123//3 12124//3 12127//3\nf 12125//6 12128//6 12121//6\nf 12129//1 12132//1 12130//1\nf 12133//2 12134//2 12136//2\nf 12133//5 12129//5 12134//5\nf 12130//4 12131//4 12134//4\nf 12131//3 12132//3 12135//3\nf 12133//6 12136//6 12129//6\nf 12137//1 12140//1 12138//1\nf 12141//2 12142//2 12144//2\nf 12141//5 12137//5 12142//5\nf 12138//4 12139//4 12142//4\nf 12139//3 12140//3 12143//3\nf 12141//6 12144//6 12137//6\nf 12145//1 12148//1 12146//1\nf 12149//2 12150//2 12152//2\nf 12149//5 12145//5 12150//5\nf 12146//4 12147//4 12150//4\nf 12147//3 12148//3 12151//3\nf 12149//6 12152//6 12145//6\nf 12153//1 12156//1 12154//1\nf 12157//2 12158//2 12160//2\nf 12157//5 12153//5 12158//5\nf 12154//4 12155//4 12158//4\nf 12155//3 12156//3 12159//3\nf 12157//6 12160//6 12153//6\nf 12162//1 12161//1 12163//1\nf 12168//2 12165//2 12167//2\nf 12161//5 12162//5 12165//5\nf 12166//4 12162//4 12167//4\nf 12163//3 12164//3 12167//3\nf 12165//6 12168//6 12161//6\nf 12169//1 12172//1 12170//1\nf 12176//2 12173//2 12175//2\nf 12169//5 12170//5 12173//5\nf 12174//4 12170//4 12175//4\nf 12171//3 12172//3 12175//3\nf 12169//6 12173//6 12172//6\nf 12177//1 12180//1 12178//1\nf 12184//2 12181//2 12183//2\nf 12181//5 12177//5 12182//5\nf 12182//4 12178//4 12183//4\nf 12179//3 12180//3 12183//3\nf 12177//6 12181//6 12180//6\nf 12185//1 12188//1 12186//1\nf 12192//2 12189//2 12191//2\nf 12189//5 12185//5 12190//5\nf 12190//4 12186//4 12191//4\nf 12187//3 12188//3 12191//3\nf 12189//6 12192//6 12185//6\nf 12193//1 12196//1 12194//1\nf 12200//2 12197//2 12199//2\nf 12193//5 12194//5 12197//5\nf 12198//4 12194//4 12199//4\nf 12195//3 12196//3 12199//3\nf 12193//6 12197//6 12196//6\nf 12201//1 12204//1 12202//1\nf 12205//2 12206//2 12208//2\nf 12205//5 12201//5 12206//5\nf 12202//4 12203//4 12206//4\nf 12203//3 12204//3 12207//3\nf 12205//6 12208//6 12201//6\nf 12209//1 12212//1 12210//1\nf 12213//2 12214//2 12216//2\nf 12213//5 12209//5 12214//5\nf 12210//4 12211//4 12214//4\nf 12211//3 12212//3 12215//3\nf 12213//6 12216//6 12209//6\nf 12217//1 12220//1 12218//1\nf 12221//2 12222//2 12224//2\nf 12221//5 12217//5 12222//5\nf 12218//4 12219//4 12222//4\nf 12219//3 12220//3 12223//3\nf 12221//6 12224//6 12217//6\nf 12225//1 12228//1 12226//1\nf 12229//2 12230//2 12232//2\nf 12229//5 12225//5 12230//5\nf 12226//4 12227//4 12230//4\nf 12227//3 12228//3 12231//3\nf 12229//6 12232//6 12225//6\nf 12233//1 12236//1 12234//1\nf 12237//2 12238//2 12240//2\nf 12237//5 12233//5 12238//5\nf 12234//4 12235//4 12238//4\nf 12235//3 12236//3 12239//3\nf 12237//6 12240//6 12233//6\nf 12242//1 12241//1 12243//1\nf 12245//2 12246//2 12248//2\nf 12245//5 12241//5 12246//5\nf 12246//4 12242//4 12247//4\nf 12243//3 12244//3 12247//3\nf 12245//6 12248//6 12241//6\nf 12250//1 12249//1 12251//1\nf 12253//2 12254//2 12256//2\nf 12253//5 12249//5 12254//5\nf 12254//4 12250//4 12255//4\nf 12251//3 12252//3 12255//3\nf 12249//6 12253//6 12252//6\nf 12257//1 12260//1 12258//1\nf 12261//2 12262//2 12264//2\nf 12261//5 12257//5 12262//5\nf 12262//4 12258//4 12263//4\nf 12259//3 12260//3 12263//3\nf 12257//6 12261//6 12260//6\nf 12265//1 12268//1 12266//1\nf 12269//2 12270//2 12272//2\nf 12269//5 12265//5 12270//5\nf 12270//4 12266//4 12271//4\nf 12267//3 12268//3 12271//3\nf 12269//6 12272//6 12265//6\nf 12273//1 12276//1 12274//1\nf 12277//2 12278//2 12280//2\nf 12277//5 12273//5 12278//5\nf 12278//4 12274//4 12279//4\nf 12275//3 12276//3 12279//3\nf 12273//6 12277//6 12276//6\nf 12281//1 12284//1 12282//1\nf 12285//2 12286//2 12288//2\nf 12285//5 12281//5 12286//5\nf 12282//4 12283//4 12286//4\nf 12283//3 12284//3 12287//3\nf 12285//6 12288//6 12281//6\nf 12289//1 12292//1 12290//1\nf 12293//2 12294//2 12296//2\nf 12293//5 12289//5 12294//5\nf 12290//4 12291//4 12294//4\nf 12291//3 12292//3 12295//3\nf 12293//6 12296//6 12289//6\nf 12297//1 12300//1 12298//1\nf 12301//2 12302//2 12304//2\nf 12301//5 12297//5 12302//5\nf 12298//4 12299//4 12302//4\nf 12299//3 12300//3 12303//3\nf 12301//6 12304//6 12297//6\nf 12305//1 12308//1 12306//1\nf 12309//2 12310//2 12312//2\nf 12309//5 12305//5 12310//5\nf 12306//4 12307//4 12310//4\nf 12307//3 12308//3 12311//3\nf 12309//6 12312//6 12305//6\nf 12313//1 12316//1 12314//1\nf 12317//2 12318//2 12320//2\nf 12317//5 12313//5 12318//5\nf 12314//4 12315//4 12318//4\nf 12315//3 12316//3 12319//3\nf 12317//6 12320//6 12313//6\nf 12322//1 12321//1 12323//1\nf 12325//2 12326//2 12328//2\nf 12325//5 12321//5 12326//5\nf 12326//4 12322//4 12327//4\nf 12323//3 12324//3 12327//3\nf 12325//6 12328//6 12321//6\nf 12330//1 12329//1 12331//1\nf 12333//2 12334//2 12336//2\nf 12333//5 12329//5 12334//5\nf 12334//4 12330//4 12335//4\nf 12331//3 12332//3 12335//3\nf 12329//6 12333//6 12332//6\nf 12337//1 12340//1 12338//1\nf 12341//2 12342//2 12344//2\nf 12341//5 12337//5 12342//5\nf 12342//4 12338//4 12343//4\nf 12339//3 12340//3 12343//3\nf 12337//6 12341//6 12340//6\nf 12345//1 12348//1 12346//1\nf 12349//2 12350//2 12352//2\nf 12349//5 12345//5 12350//5\nf 12350//4 12346//4 12351//4\nf 12347//3 12348//3 12351//3\nf 12349//6 12352//6 12345//6\nf 12353//1 12356//1 12354//1\nf 12357//2 12358//2 12360//2\nf 12357//5 12353//5 12358//5\nf 12358//4 12354//4 12359//4\nf 12355//3 12356//3 12359//3\nf 12353//6 12357//6 12356//6\nf 12361//1 12364//1 12362//1\nf 12365//2 12366//2 12368//2\nf 12365//5 12361//5 12366//5\nf 12362//4 12363//4 12366//4\nf 12363//3 12364//3 12367//3\nf 12365//6 12368//6 12361//6\nf 12369//1 12372//1 12370//1\nf 12373//2 12374//2 12376//2\nf 12373//5 12369//5 12374//5\nf 12370//4 12371//4 12374//4\nf 12371//3 12372//3 12375//3\nf 12373//6 12376//6 12369//6\nf 12377//1 12380//1 12378//1\nf 12381//2 12382//2 12384//2\nf 12381//5 12377//5 12382//5\nf 12378//4 12379//4 12382//4\nf 12379//3 12380//3 12383//3\nf 12381//6 12384//6 12377//6\nf 12385//1 12388//1 12386//1\nf 12389//2 12390//2 12392//2\nf 12389//5 12385//5 12390//5\nf 12386//4 12387//4 12390//4\nf 12387//3 12388//3 12391//3\nf 12389//6 12392//6 12385//6\nf 12393//1 12396//1 12394//1\nf 12397//2 12398//2 12400//2\nf 12397//5 12393//5 12398//5\nf 12394//4 12395//4 12398//4\nf 12395//3 12396//3 12399//3\nf 12397//6 12400//6 12393//6\nf 12402//1 12401//1 12403//1\nf 12408//2 12405//2 12407//2\nf 12401//5 12402//5 12405//5\nf 12406//4 12402//4 12407//4\nf 12403//3 12404//3 12407//3\nf 12405//6 12408//6 12401//6\nf 12410//1 12409//1 12411//1\nf 12416//2 12413//2 12415//2\nf 12409//5 12410//5 12413//5\nf 12414//4 12410//4 12415//4\nf 12411//3 12412//3 12415//3\nf 12409//6 12413//6 12412//6\nf 12417//1 12420//1 12418//1\nf 12424//2 12421//2 12423//2\nf 12417//5 12418//5 12421//5\nf 12422//4 12418//4 12423//4\nf 12419//3 12420//3 12423//3\nf 12417//6 12421//6 12420//6\nf 12425//1 12428//1 12426//1\nf 12432//2 12429//2 12431//2\nf 12425//5 12426//5 12429//5\nf 12430//4 12426//4 12431//4\nf 12427//3 12428//3 12431//3\nf 12429//6 12432//6 12425//6\nf 12433//1 12436//1 12434//1\nf 12440//2 12437//2 12439//2\nf 12433//5 12434//5 12437//5\nf 12438//4 12434//4 12439//4\nf 12435//3 12436//3 12439//3\nf 12433//6 12437//6 12436//6\nf 12441//1 12444//1 12442//1\nf 12445//2 12446//2 12448//2\nf 12441//5 12442//5 12445//5\nf 12442//4 12443//4 12446//4\nf 12443//3 12444//3 12447//3\nf 12445//6 12448//6 12441//6\nf 12449//1 12452//1 12450//1\nf 12453//2 12454//2 12456//2\nf 12449//5 12450//5 12453//5\nf 12450//4 12451//4 12454//4\nf 12451//3 12452//3 12455//3\nf 12453//6 12456//6 12449//6\nf 12457//1 12460//1 12458//1\nf 12461//2 12462//2 12464//2\nf 12457//5 12458//5 12461//5\nf 12458//4 12459//4 12462//4\nf 12459//3 12460//3 12463//3\nf 12461//6 12464//6 12457//6\nf 12465//1 12468//1 12466//1\nf 12469//2 12470//2 12472//2\nf 12465//5 12466//5 12469//5\nf 12466//4 12467//4 12470//4\nf 12467//3 12468//3 12471//3\nf 12469//6 12472//6 12465//6\nf 12473//1 12476//1 12474//1\nf 12477//2 12478//2 12480//2\nf 12473//5 12474//5 12477//5\nf 12474//4 12475//4 12478//4\nf 12475//3 12476//3 12479//3\nf 12477//6 12480//6 12473//6\nf 12482//1 12481//1 12483//1\nf 12488//2 12485//2 12487//2\nf 12481//5 12482//5 12485//5\nf 12486//4 12482//4 12487//4\nf 12483//3 12484//3 12487//3\nf 12485//6 12488//6 12481//6\nf 12490//1 12489//1 12491//1\nf 12496//2 12493//2 12495//2\nf 12489//5 12490//5 12493//5\nf 12494//4 12490//4 12495//4\nf 12491//3 12492//3 12495//3\nf 12489//6 12493//6 12492//6\nf 12497//1 12500//1 12498//1\nf 12504//2 12501//2 12503//2\nf 12497//5 12498//5 12501//5\nf 12502//4 12498//4 12503//4\nf 12499//3 12500//3 12503//3\nf 12497//6 12501//6 12500//6\nf 12505//1 12508//1 12506//1\nf 12512//2 12509//2 12511//2\nf 12505//5 12506//5 12509//5\nf 12510//4 12506//4 12511//4\nf 12507//3 12508//3 12511//3\nf 12509//6 12512//6 12505//6\nf 12513//1 12516//1 12514//1\nf 12520//2 12517//2 12519//2\nf 12513//5 12514//5 12517//5\nf 12518//4 12514//4 12519//4\nf 12515//3 12516//3 12519//3\nf 12513//6 12517//6 12516//6\nf 12521//1 12524//1 12522//1\nf 12525//2 12526//2 12528//2\nf 12521//5 12522//5 12525//5\nf 12522//4 12523//4 12526//4\nf 12523//3 12524//3 12527//3\nf 12525//6 12528//6 12521//6\nf 12529//1 12532//1 12530//1\nf 12533//2 12534//2 12536//2\nf 12529//5 12530//5 12533//5\nf 12530//4 12531//4 12534//4\nf 12531//3 12532//3 12535//3\nf 12533//6 12536//6 12529//6\nf 12537//1 12540//1 12538//1\nf 12541//2 12542//2 12544//2\nf 12537//5 12538//5 12541//5\nf 12538//4 12539//4 12542//4\nf 12539//3 12540//3 12543//3\nf 12541//6 12544//6 12537//6\nf 12545//1 12548//1 12546//1\nf 12549//2 12550//2 12552//2\nf 12545//5 12546//5 12549//5\nf 12546//4 12547//4 12550//4\nf 12547//3 12548//3 12551//3\nf 12549//6 12552//6 12545//6\nf 12553//1 12556//1 12554//1\nf 12557//2 12558//2 12560//2\nf 12553//5 12554//5 12557//5\nf 12554//4 12555//4 12558//4\nf 12555//3 12556//3 12559//3\nf 12557//6 12560//6 12553//6\nf 12562//1 12561//1 12563//1\nf 12568//2 12565//2 12567//2\nf 12561//5 12562//5 12565//5\nf 12566//4 12562//4 12567//4\nf 12563//3 12564//3 12567//3\nf 12565//6 12568//6 12561//6\nf 12570//1 12569//1 12571//1\nf 12576//2 12573//2 12575//2\nf 12569//5 12570//5 12573//5\nf 12574//4 12570//4 12575//4\nf 12571//3 12572//3 12575//3\nf 12569//6 12573//6 12572//6\nf 12577//1 12580//1 12578//1\nf 12584//2 12581//2 12583//2\nf 12577//5 12578//5 12581//5\nf 12582//4 12578//4 12583//4\nf 12579//3 12580//3 12583//3\nf 12577//6 12581//6 12580//6\nf 12585//1 12588//1 12586//1\nf 12592//2 12589//2 12591//2\nf 12585//5 12586//5 12589//5\nf 12590//4 12586//4 12591//4\nf 12587//3 12588//3 12591//3\nf 12589//6 12592//6 12585//6\nf 12593//1 12596//1 12594//1\nf 12600//2 12597//2 12599//2\nf 12593//5 12594//5 12597//5\nf 12598//4 12594//4 12599//4\nf 12595//3 12596//3 12599//3\nf 12593//6 12597//6 12596//6\nf 12601//1 12604//1 12602//1\nf 12605//2 12606//2 12608//2\nf 12601//5 12602//5 12605//5\nf 12602//4 12603//4 12606//4\nf 12603//3 12604//3 12607//3\nf 12605//6 12608//6 12601//6\nf 12609//1 12612//1 12610//1\nf 12613//2 12614//2 12616//2\nf 12609//5 12610//5 12613//5\nf 12610//4 12611//4 12614//4\nf 12611//3 12612//3 12615//3\nf 12613//6 12616//6 12609//6\nf 12617//1 12620//1 12618//1\nf 12621//2 12622//2 12624//2\nf 12617//5 12618//5 12621//5\nf 12618//4 12619//4 12622//4\nf 12619//3 12620//3 12623//3\nf 12621//6 12624//6 12617//6\nf 12625//1 12628//1 12626//1\nf 12629//2 12630//2 12632//2\nf 12625//5 12626//5 12629//5\nf 12626//4 12627//4 12630//4\nf 12627//3 12628//3 12631//3\nf 12629//6 12632//6 12625//6\nf 12633//1 12636//1 12634//1\nf 12637//2 12638//2 12640//2\nf 12633//5 12634//5 12637//5\nf 12634//4 12635//4 12638//4\nf 12635//3 12636//3 12639//3\nf 12637//6 12640//6 12633//6\nf 12642//1 12641//1 12643//1\nf 12648//2 12645//2 12647//2\nf 12641//5 12642//5 12645//5\nf 12646//4 12642//4 12647//4\nf 12643//3 12644//3 12647//3\nf 12645//6 12648//6 12641//6\nf 12650//1 12649//1 12651//1\nf 12656//2 12653//2 12655//2\nf 12649//5 12650//5 12653//5\nf 12654//4 12650//4 12655//4\nf 12651//3 12652//3 12655//3\nf 12649//6 12653//6 12652//6\nf 12657//1 12660//1 12658//1\nf 12664//2 12661//2 12663//2\nf 12657//5 12658//5 12661//5\nf 12662//4 12658//4 12663//4\nf 12659//3 12660//3 12663//3\nf 12657//6 12661//6 12660//6\nf 12665//1 12668//1 12666//1\nf 12672//2 12669//2 12671//2\nf 12665//5 12666//5 12669//5\nf 12670//4 12666//4 12671//4\nf 12667//3 12668//3 12671//3\nf 12669//6 12672//6 12665//6\nf 12673//1 12676//1 12674//1\nf 12680//2 12677//2 12679//2\nf 12673//5 12674//5 12677//5\nf 12678//4 12674//4 12679//4\nf 12675//3 12676//3 12679//3\nf 12673//6 12677//6 12676//6\nf 12681//1 12684//1 12682//1\nf 12685//2 12686//2 12688//2\nf 12681//5 12682//5 12685//5\nf 12682//4 12683//4 12686//4\nf 12683//3 12684//3 12687//3\nf 12685//6 12688//6 12681//6\nf 12689//1 12692//1 12690//1\nf 12693//2 12694//2 12696//2\nf 12689//5 12690//5 12693//5\nf 12690//4 12691//4 12694//4\nf 12691//3 12692//3 12695//3\nf 12693//6 12696//6 12689//6\nf 12697//1 12700//1 12698//1\nf 12701//2 12702//2 12704//2\nf 12697//5 12698//5 12701//5\nf 12698//4 12699//4 12702//4\nf 12699//3 12700//3 12703//3\nf 12701//6 12704//6 12697//6\nf 12705//1 12708//1 12706//1\nf 12709//2 12710//2 12712//2\nf 12705//5 12706//5 12709//5\nf 12706//4 12707//4 12710//4\nf 12707//3 12708//3 12711//3\nf 12709//6 12712//6 12705//6\nf 12713//1 12716//1 12714//1\nf 12717//2 12718//2 12720//2\nf 12713//5 12714//5 12717//5\nf 12714//4 12715//4 12718//4\nf 12715//3 12716//3 12719//3\nf 12717//6 12720//6 12713//6\nf 12722//1 12721//1 12723//1\nf 12728//2 12725//2 12727//2\nf 12721//5 12722//5 12725//5\nf 12726//4 12722//4 12727//4\nf 12723//3 12724//3 12727//3\nf 12725//6 12728//6 12721//6\nf 12730//1 12729//1 12731//1\nf 12736//2 12733//2 12735//2\nf 12729//5 12730//5 12733//5\nf 12734//4 12730//4 12735//4\nf 12731//3 12732//3 12735//3\nf 12729//6 12733//6 12732//6\nf 12737//1 12740//1 12738//1\nf 12744//2 12741//2 12743//2\nf 12737//5 12738//5 12741//5\nf 12742//4 12738//4 12743//4\nf 12739//3 12740//3 12743//3\nf 12737//6 12741//6 12740//6\nf 12745//1 12748//1 12746//1\nf 12752//2 12749//2 12751//2\nf 12745//5 12746//5 12749//5\nf 12750//4 12746//4 12751//4\nf 12747//3 12748//3 12751//3\nf 12749//6 12752//6 12745//6\nf 12753//1 12756//1 12754//1\nf 12760//2 12757//2 12759//2\nf 12753//5 12754//5 12757//5\nf 12758//4 12754//4 12759//4\nf 12755//3 12756//3 12759//3\nf 12753//6 12757//6 12756//6\nf 12761//1 12764//1 12762//1\nf 12765//2 12766//2 12768//2\nf 12761//5 12762//5 12765//5\nf 12762//4 12763//4 12766//4\nf 12763//3 12764//3 12767//3\nf 12765//6 12768//6 12761//6\nf 12769//1 12772//1 12770//1\nf 12773//2 12774//2 12776//2\nf 12769//5 12770//5 12773//5\nf 12770//4 12771//4 12774//4\nf 12771//3 12772//3 12775//3\nf 12773//6 12776//6 12769//6\nf 12777//1 12780//1 12778//1\nf 12781//2 12782//2 12784//2\nf 12777//5 12778//5 12781//5\nf 12778//4 12779//4 12782//4\nf 12779//3 12780//3 12783//3\nf 12781//6 12784//6 12777//6\nf 12785//1 12788//1 12786//1\nf 12789//2 12790//2 12792//2\nf 12785//5 12786//5 12789//5\nf 12786//4 12787//4 12790//4\nf 12787//3 12788//3 12791//3\nf 12789//6 12792//6 12785//6\nf 12793//1 12796//1 12794//1\nf 12797//2 12798//2 12800//2\nf 12793//5 12794//5 12797//5\nf 12794//4 12795//4 12798//4\nf 12795//3 12796//3 12799//3\nf 12797//6 12800//6 12793//6\nf 12801//1 12802//1 12804//1\nf 12805//2 12808//2 12806//2\nf 12802//3 12801//3 12806//3\nf 12803//4 12802//4 12807//4\nf 12803//5 12807//5 12804//5\nf 12805//6 12801//6 12808//6\nf 12809//1 12810//1 12812//1\nf 12814//2 12813//2 12815//2\nf 12810//3 12809//3 12814//3\nf 12811//4 12810//4 12815//4\nf 12811//5 12815//5 12812//5\nf 12813//6 12809//6 12816//6\nf 12817//1 12818//1 12820//1\nf 12821//2 12824//2 12822//2\nf 12818//3 12817//3 12822//3\nf 12819//4 12818//4 12823//4\nf 12819//5 12823//5 12820//5\nf 12824//6 12821//6 12820//6\nf 12825//1 12826//1 12828//1\nf 12829//2 12832//2 12830//2\nf 12826//3 12825//3 12830//3\nf 12827//4 12826//4 12831//4\nf 12827//5 12831//5 12828//5\nf 12829//6 12825//6 12832//6\nf 12833//1 12834//1 12836//1\nf 12838//2 12837//2 12839//2\nf 12834//3 12833//3 12838//3\nf 12835//4 12834//4 12839//4\nf 12835//5 12839//5 12836//5\nf 12840//6 12837//6 12836//6\nf 12841//1 12842//1 12844//1\nf 12845//2 12848//2 12846//2\nf 12842//3 12841//3 12846//3\nf 12842//4 12846//4 12843//4\nf 12843//5 12847//5 12844//5\nf 12845//6 12841//6 12848//6\nf 12849//1 12850//1 12852//1\nf 12853//2 12856//2 12854//2\nf 12850//3 12849//3 12854//3\nf 12850//4 12854//4 12851//4\nf 12851//5 12855//5 12852//5\nf 12853//6 12849//6 12856//6\nf 12857//1 12858//1 12860//1\nf 12861//2 12864//2 12862//2\nf 12858//3 12857//3 12862//3\nf 12858//4 12862//4 12859//4\nf 12859//5 12863//5 12860//5\nf 12861//6 12857//6 12864//6\nf 12865//1 12866//1 12868//1\nf 12869//2 12872//2 12870//2\nf 12866//3 12865//3 12870//3\nf 12866//4 12870//4 12867//4\nf 12867//5 12871//5 12868//5\nf 12869//6 12865//6 12872//6\nf 12873//1 12874//1 12876//1\nf 12877//2 12880//2 12878//2\nf 12874//3 12873//3 12878//3\nf 12874//4 12878//4 12875//4\nf 12875//5 12879//5 12876//5\nf 12877//6 12873//6 12880//6\nf 12881//1 12882//1 12884//1\nf 12885//2 12888//2 12886//2\nf 12881//3 12885//3 12882//3\nf 12883//4 12882//4 12887//4\nf 12883//5 12887//5 12884//5\nf 12885//6 12881//6 12888//6\nf 12889//1 12890//1 12892//1\nf 12894//2 12893//2 12895//2\nf 12890//3 12889//3 12894//3\nf 12891//4 12890//4 12895//4\nf 12891//5 12895//5 12892//5\nf 12893//6 12889//6 12896//6\nf 12897//1 12898//1 12900//1\nf 12901//2 12904//2 12902//2\nf 12898//3 12897//3 12902//3\nf 12899//4 12898//4 12903//4\nf 12899//5 12903//5 12900//5\nf 12904//6 12901//6 12900//6\nf 12905//1 12906//1 12908//1\nf 12909//2 12912//2 12910//2\nf 12906//3 12905//3 12910//3\nf 12907//4 12906//4 12911//4\nf 12907//5 12911//5 12908//5\nf 12909//6 12905//6 12912//6\nf 12913//1 12914//1 12916//1\nf 12918//2 12917//2 12919//2\nf 12914//3 12913//3 12918//3\nf 12915//4 12914//4 12919//4\nf 12915//5 12919//5 12916//5\nf 12920//6 12917//6 12916//6\nf 12921//1 12922//1 12924//1\nf 12925//2 12928//2 12926//2\nf 12922//3 12921//3 12926//3\nf 12922//4 12926//4 12923//4\nf 12923//5 12927//5 12924//5\nf 12925//6 12921//6 12928//6\nf 12929//1 12930//1 12932//1\nf 12933//2 12936//2 12934//2\nf 12930//3 12929//3 12934//3\nf 12930//4 12934//4 12931//4\nf 12931//5 12935//5 12932//5\nf 12933//6 12929//6 12936//6\nf 12937//1 12938//1 12940//1\nf 12941//2 12944//2 12942//2\nf 12938//3 12937//3 12942//3\nf 12938//4 12942//4 12939//4\nf 12939//5 12943//5 12940//5\nf 12941//6 12937//6 12944//6\nf 12945//1 12946//1 12948//1\nf 12949//2 12952//2 12950//2\nf 12946//3 12945//3 12950//3\nf 12946//4 12950//4 12947//4\nf 12947//5 12951//5 12948//5\nf 12949//6 12945//6 12952//6\nf 12953//1 12954//1 12956//1\nf 12957//2 12960//2 12958//2\nf 12954//3 12953//3 12958//3\nf 12954//4 12958//4 12955//4\nf 12955//5 12959//5 12956//5\nf 12957//6 12953//6 12960//6\nf 12961//1 12962//1 12964//1\nf 12966//2 12965//2 12967//2\nf 12961//3 12965//3 12962//3\nf 12963//4 12962//4 12967//4\nf 12963//5 12967//5 12964//5\nf 12965//6 12961//6 12968//6\nf 12969//1 12970//1 12972//1\nf 12974//2 12973//2 12975//2\nf 12969//3 12973//3 12970//3\nf 12971//4 12970//4 12975//4\nf 12971//5 12975//5 12972//5\nf 12973//6 12969//6 12976//6\nf 12977//1 12978//1 12980//1\nf 12982//2 12981//2 12983//2\nf 12978//3 12977//3 12982//3\nf 12979//4 12978//4 12983//4\nf 12979//5 12983//5 12980//5\nf 12984//6 12981//6 12980//6\nf 12985//1 12986//1 12988//1\nf 12990//2 12989//2 12991//2\nf 12986//3 12985//3 12990//3\nf 12987//4 12986//4 12991//4\nf 12987//5 12991//5 12988//5\nf 12989//6 12985//6 12992//6\nf 12993//1 12994//1 12996//1\nf 12998//2 12997//2 12999//2\nf 12993//3 12997//3 12994//3\nf 12995//4 12994//4 12999//4\nf 12995//5 12999//5 12996//5\nf 13000//6 12997//6 12996//6\nf 13001//1 13002//1 13004//1\nf 13005//2 13008//2 13006//2\nf 13002//3 13001//3 13006//3\nf 13002//4 13006//4 13003//4\nf 13003//5 13007//5 13004//5\nf 13005//6 13001//6 13008//6\nf 13009//1 13010//1 13012//1\nf 13013//2 13016//2 13014//2\nf 13010//3 13009//3 13014//3\nf 13010//4 13014//4 13011//4\nf 13011//5 13015//5 13012//5\nf 13013//6 13009//6 13016//6\nf 13017//1 13018//1 13020//1\nf 13021//2 13024//2 13022//2\nf 13018//3 13017//3 13022//3\nf 13018//4 13022//4 13019//4\nf 13019//5 13023//5 13020//5\nf 13021//6 13017//6 13024//6\nf 13025//1 13026//1 13028//1\nf 13029//2 13032//2 13030//2\nf 13026//3 13025//3 13030//3\nf 13026//4 13030//4 13027//4\nf 13027//5 13031//5 13028//5\nf 13029//6 13025//6 13032//6\nf 13033//1 13034//1 13036//1\nf 13037//2 13040//2 13038//2\nf 13034//3 13033//3 13038//3\nf 13034//4 13038//4 13035//4\nf 13035//5 13039//5 13036//5\nf 13037//6 13033//6 13040//6\nf 13044//1 13041//1 13043//1\nf 13045//2 13048//2 13046//2\nf 13042//3 13041//3 13046//3\nf 13043//4 13042//4 13047//4\nf 13043//5 13047//5 13044//5\nf 13045//6 13041//6 13048//6\nf 13052//1 13049//1 13051//1\nf 13053//2 13056//2 13054//2\nf 13050//3 13049//3 13054//3\nf 13051//4 13050//4 13055//4\nf 13051//5 13055//5 13052//5\nf 13053//6 13049//6 13056//6\nf 13057//1 13058//1 13060//1\nf 13061//2 13064//2 13062//2\nf 13058//3 13057//3 13062//3\nf 13059//4 13058//4 13063//4\nf 13059//5 13063//5 13060//5\nf 13064//6 13061//6 13060//6\nf 13065//1 13066//1 13068//1\nf 13069//2 13072//2 13070//2\nf 13066//3 13065//3 13070//3\nf 13067//4 13066//4 13071//4\nf 13067//5 13071//5 13068//5\nf 13069//6 13065//6 13072//6\nf 13073//1 13074//1 13076//1\nf 13077//2 13080//2 13078//2\nf 13074//3 13073//3 13078//3\nf 13075//4 13074//4 13079//4\nf 13075//5 13079//5 13076//5\nf 13080//6 13077//6 13076//6\nf 13081//1 13082//1 13084//1\nf 13085//2 13088//2 13086//2\nf 13082//3 13081//3 13086//3\nf 13082//4 13086//4 13083//4\nf 13083//5 13087//5 13084//5\nf 13085//6 13081//6 13088//6\nf 13089//1 13090//1 13092//1\nf 13093//2 13096//2 13094//2\nf 13090//3 13089//3 13094//3\nf 13090//4 13094//4 13091//4\nf 13091//5 13095//5 13092//5\nf 13093//6 13089//6 13096//6\nf 13097//1 13098//1 13100//1\nf 13101//2 13104//2 13102//2\nf 13098//3 13097//3 13102//3\nf 13098//4 13102//4 13099//4\nf 13099//5 13103//5 13100//5\nf 13101//6 13097//6 13104//6\nf 13105//1 13106//1 13108//1\nf 13109//2 13112//2 13110//2\nf 13106//3 13105//3 13110//3\nf 13106//4 13110//4 13107//4\nf 13107//5 13111//5 13108//5\nf 13109//6 13105//6 13112//6\nf 13113//1 13114//1 13116//1\nf 13117//2 13120//2 13118//2\nf 13114//3 13113//3 13118//3\nf 13114//4 13118//4 13115//4\nf 13115//5 13119//5 13116//5\nf 13117//6 13113//6 13120//6\nf 13124//1 13121//1 13123//1\nf 13125//2 13128//2 13126//2\nf 13122//3 13121//3 13126//3\nf 13123//4 13122//4 13127//4\nf 13123//5 13127//5 13124//5\nf 13125//6 13121//6 13128//6\nf 13132//1 13129//1 13131//1\nf 13133//2 13136//2 13134//2\nf 13130//3 13129//3 13134//3\nf 13131//4 13130//4 13135//4\nf 13131//5 13135//5 13132//5\nf 13133//6 13129//6 13136//6\nf 13137//1 13138//1 13140//1\nf 13141//2 13144//2 13142//2\nf 13138//3 13137//3 13142//3\nf 13139//4 13138//4 13143//4\nf 13139//5 13143//5 13140//5\nf 13144//6 13141//6 13140//6\nf 13145//1 13146//1 13148//1\nf 13149//2 13152//2 13150//2\nf 13146//3 13145//3 13150//3\nf 13147//4 13146//4 13151//4\nf 13147//5 13151//5 13148//5\nf 13149//6 13145//6 13152//6\nf 13153//1 13154//1 13156//1\nf 13157//2 13160//2 13158//2\nf 13154//3 13153//3 13158//3\nf 13155//4 13154//4 13159//4\nf 13155//5 13159//5 13156//5\nf 13160//6 13157//6 13156//6\nf 13161//1 13162//1 13164//1\nf 13165//2 13168//2 13166//2\nf 13162//3 13161//3 13166//3\nf 13162//4 13166//4 13163//4\nf 13163//5 13167//5 13164//5\nf 13165//6 13161//6 13168//6\nf 13169//1 13170//1 13172//1\nf 13173//2 13176//2 13174//2\nf 13170//3 13169//3 13174//3\nf 13170//4 13174//4 13171//4\nf 13171//5 13175//5 13172//5\nf 13173//6 13169//6 13176//6\nf 13177//1 13178//1 13180//1\nf 13181//2 13184//2 13182//2\nf 13178//3 13177//3 13182//3\nf 13178//4 13182//4 13179//4\nf 13179//5 13183//5 13180//5\nf 13181//6 13177//6 13184//6\nf 13185//1 13186//1 13188//1\nf 13189//2 13192//2 13190//2\nf 13186//3 13185//3 13190//3\nf 13186//4 13190//4 13187//4\nf 13187//5 13191//5 13188//5\nf 13189//6 13185//6 13192//6\nf 13193//1 13194//1 13196//1\nf 13197//2 13200//2 13198//2\nf 13194//3 13193//3 13198//3\nf 13194//4 13198//4 13195//4\nf 13195//5 13199//5 13196//5\nf 13197//6 13193//6 13200//6\nf 13204//1 13201//1 13203//1\nf 13206//2 13205//2 13207//2\nf 13201//3 13205//3 13202//3\nf 13203//4 13202//4 13207//4\nf 13203//5 13207//5 13204//5\nf 13205//6 13201//6 13208//6\nf 13212//1 13209//1 13211//1\nf 13214//2 13213//2 13215//2\nf 13209//3 13213//3 13210//3\nf 13211//4 13210//4 13215//4\nf 13211//5 13215//5 13212//5\nf 13213//6 13209//6 13216//6\nf 13217//1 13218//1 13220//1\nf 13222//2 13221//2 13223//2\nf 13217//3 13221//3 13218//3\nf 13219//4 13218//4 13223//4\nf 13219//5 13223//5 13220//5\nf 13224//6 13221//6 13220//6\nf 13225//1 13226//1 13228//1\nf 13230//2 13229//2 13231//2\nf 13225//3 13229//3 13226//3\nf 13227//4 13226//4 13231//4\nf 13227//5 13231//5 13228//5\nf 13229//6 13225//6 13232//6\nf 13233//1 13234//1 13236//1\nf 13238//2 13237//2 13239//2\nf 13233//3 13237//3 13234//3\nf 13235//4 13234//4 13239//4\nf 13235//5 13239//5 13236//5\nf 13240//6 13237//6 13236//6\nf 13241//1 13242//1 13244//1\nf 13245//2 13248//2 13246//2\nf 13241//3 13245//3 13242//3\nf 13242//4 13246//4 13243//4\nf 13243//5 13247//5 13244//5\nf 13245//6 13241//6 13248//6\nf 13249//1 13250//1 13252//1\nf 13253//2 13256//2 13254//2\nf 13249//3 13253//3 13250//3\nf 13250//4 13254//4 13251//4\nf 13251//5 13255//5 13252//5\nf 13253//6 13249//6 13256//6\nf 13257//1 13258//1 13260//1\nf 13261//2 13264//2 13262//2\nf 13257//3 13261//3 13258//3\nf 13258//4 13262//4 13259//4\nf 13259//5 13263//5 13260//5\nf 13261//6 13257//6 13264//6\nf 13265//1 13266//1 13268//1\nf 13269//2 13272//2 13270//2\nf 13265//3 13269//3 13266//3\nf 13266//4 13270//4 13267//4\nf 13267//5 13271//5 13268//5\nf 13269//6 13265//6 13272//6\nf 13273//1 13274//1 13276//1\nf 13277//2 13280//2 13278//2\nf 13273//3 13277//3 13274//3\nf 13274//4 13278//4 13275//4\nf 13275//5 13279//5 13276//5\nf 13277//6 13273//6 13280//6\nf 13284//1 13281//1 13283//1\nf 13286//2 13285//2 13287//2\nf 13281//3 13285//3 13282//3\nf 13283//4 13282//4 13287//4\nf 13283//5 13287//5 13284//5\nf 13285//6 13281//6 13288//6\nf 13292//1 13289//1 13291//1\nf 13294//2 13293//2 13295//2\nf 13289//3 13293//3 13290//3\nf 13291//4 13290//4 13295//4\nf 13291//5 13295//5 13292//5\nf 13293//6 13289//6 13296//6\nf 13297//1 13298//1 13300//1\nf 13302//2 13301//2 13303//2\nf 13297//3 13301//3 13298//3\nf 13299//4 13298//4 13303//4\nf 13299//5 13303//5 13300//5\nf 13304//6 13301//6 13300//6\nf 13305//1 13306//1 13308//1\nf 13310//2 13309//2 13311//2\nf 13305//3 13309//3 13306//3\nf 13307//4 13306//4 13311//4\nf 13307//5 13311//5 13308//5\nf 13309//6 13305//6 13312//6\nf 13313//1 13314//1 13316//1\nf 13318//2 13317//2 13319//2\nf 13313//3 13317//3 13314//3\nf 13315//4 13314//4 13319//4\nf 13315//5 13319//5 13316//5\nf 13320//6 13317//6 13316//6\nf 13321//1 13322//1 13324//1\nf 13325//2 13328//2 13326//2\nf 13321//3 13325//3 13322//3\nf 13322//4 13326//4 13323//4\nf 13323//5 13327//5 13324//5\nf 13325//6 13321//6 13328//6\nf 13329//1 13330//1 13332//1\nf 13333//2 13336//2 13334//2\nf 13329//3 13333//3 13330//3\nf 13330//4 13334//4 13331//4\nf 13331//5 13335//5 13332//5\nf 13333//6 13329//6 13336//6\nf 13337//1 13338//1 13340//1\nf 13341//2 13344//2 13342//2\nf 13337//3 13341//3 13338//3\nf 13338//4 13342//4 13339//4\nf 13339//5 13343//5 13340//5\nf 13341//6 13337//6 13344//6\nf 13345//1 13346//1 13348//1\nf 13349//2 13352//2 13350//2\nf 13345//3 13349//3 13346//3\nf 13346//4 13350//4 13347//4\nf 13347//5 13351//5 13348//5\nf 13349//6 13345//6 13352//6\nf 13353//1 13354//1 13356//1\nf 13357//2 13360//2 13358//2\nf 13353//3 13357//3 13354//3\nf 13354//4 13358//4 13355//4\nf 13355//5 13359//5 13356//5\nf 13357//6 13353//6 13360//6\nf 13364//1 13361//1 13363//1\nf 13366//2 13365//2 13367//2\nf 13361//3 13365//3 13362//3\nf 13363//4 13362//4 13367//4\nf 13363//5 13367//5 13364//5\nf 13365//6 13361//6 13368//6\nf 13372//1 13369//1 13371//1\nf 13374//2 13373//2 13375//2\nf 13369//3 13373//3 13370//3\nf 13371//4 13370//4 13375//4\nf 13371//5 13375//5 13372//5\nf 13373//6 13369//6 13376//6\nf 13377//1 13378//1 13380//1\nf 13382//2 13381//2 13383//2\nf 13377//3 13381//3 13378//3\nf 13379//4 13378//4 13383//4\nf 13379//5 13383//5 13380//5\nf 13384//6 13381//6 13380//6\nf 13385//1 13386//1 13388//1\nf 13390//2 13389//2 13391//2\nf 13385//3 13389//3 13386//3\nf 13387//4 13386//4 13391//4\nf 13387//5 13391//5 13388//5\nf 13389//6 13385//6 13392//6\nf 13393//1 13394//1 13396//1\nf 13398//2 13397//2 13399//2\nf 13393//3 13397//3 13394//3\nf 13395//4 13394//4 13399//4\nf 13395//5 13399//5 13396//5\nf 13400//6 13397//6 13396//6\nf 13401//1 13402//1 13404//1\nf 13405//2 13408//2 13406//2\nf 13401//3 13405//3 13402//3\nf 13402//4 13406//4 13403//4\nf 13403//5 13407//5 13404//5\nf 13405//6 13401//6 13408//6\nf 13409//1 13410//1 13412//1\nf 13413//2 13416//2 13414//2\nf 13409//3 13413//3 13410//3\nf 13410//4 13414//4 13411//4\nf 13411//5 13415//5 13412//5\nf 13413//6 13409//6 13416//6\nf 13417//1 13418//1 13420//1\nf 13421//2 13424//2 13422//2\nf 13417//3 13421//3 13418//3\nf 13418//4 13422//4 13419//4\nf 13419//5 13423//5 13420//5\nf 13421//6 13417//6 13424//6\nf 13425//1 13426//1 13428//1\nf 13429//2 13432//2 13430//2\nf 13425//3 13429//3 13426//3\nf 13426//4 13430//4 13427//4\nf 13427//5 13431//5 13428//5\nf 13429//6 13425//6 13432//6\nf 13433//1 13434//1 13436//1\nf 13437//2 13440//2 13438//2\nf 13433//3 13437//3 13434//3\nf 13434//4 13438//4 13435//4\nf 13435//5 13439//5 13436//5\nf 13437//6 13433//6 13440//6\nf 13444//1 13441//1 13443//1\nf 13446//2 13445//2 13447//2\nf 13441//3 13445//3 13442//3\nf 13443//4 13442//4 13447//4\nf 13443//5 13447//5 13444//5\nf 13445//6 13441//6 13448//6\nf 13452//1 13449//1 13451//1\nf 13454//2 13453//2 13455//2\nf 13449//3 13453//3 13450//3\nf 13451//4 13450//4 13455//4\nf 13451//5 13455//5 13452//5\nf 13453//6 13449//6 13456//6\nf 13457//1 13458//1 13460//1\nf 13462//2 13461//2 13463//2\nf 13457//3 13461//3 13458//3\nf 13459//4 13458//4 13463//4\nf 13459//5 13463//5 13460//5\nf 13464//6 13461//6 13460//6\nf 13465//1 13466//1 13468//1\nf 13470//2 13469//2 13471//2\nf 13465//3 13469//3 13466//3\nf 13467//4 13466//4 13471//4\nf 13467//5 13471//5 13468//5\nf 13469//6 13465//6 13472//6\nf 13473//1 13474//1 13476//1\nf 13478//2 13477//2 13479//2\nf 13473//3 13477//3 13474//3\nf 13475//4 13474//4 13479//4\nf 13475//5 13479//5 13476//5\nf 13480//6 13477//6 13476//6\nf 13481//1 13482//1 13484//1\nf 13485//2 13488//2 13486//2\nf 13481//3 13485//3 13482//3\nf 13482//4 13486//4 13483//4\nf 13483//5 13487//5 13484//5\nf 13485//6 13481//6 13488//6\nf 13489//1 13490//1 13492//1\nf 13493//2 13496//2 13494//2\nf 13489//3 13493//3 13490//3\nf 13490//4 13494//4 13491//4\nf 13491//5 13495//5 13492//5\nf 13493//6 13489//6 13496//6\nf 13497//1 13498//1 13500//1\nf 13501//2 13504//2 13502//2\nf 13497//3 13501//3 13498//3\nf 13498//4 13502//4 13499//4\nf 13499//5 13503//5 13500//5\nf 13501//6 13497//6 13504//6\nf 13505//1 13506//1 13508//1\nf 13509//2 13512//2 13510//2\nf 13505//3 13509//3 13506//3\nf 13506//4 13510//4 13507//4\nf 13507//5 13511//5 13508//5\nf 13509//6 13505//6 13512//6\nf 13513//1 13514//1 13516//1\nf 13517//2 13520//2 13518//2\nf 13513//3 13517//3 13514//3\nf 13514//4 13518//4 13515//4\nf 13515//5 13519//5 13516//5\nf 13517//6 13513//6 13520//6\nf 13524//1 13521//1 13523//1\nf 13526//2 13525//2 13527//2\nf 13521//3 13525//3 13522//3\nf 13523//4 13522//4 13527//4\nf 13523//5 13527//5 13524//5\nf 13525//6 13521//6 13528//6\nf 13532//1 13529//1 13531//1\nf 13534//2 13533//2 13535//2\nf 13529//3 13533//3 13530//3\nf 13531//4 13530//4 13535//4\nf 13531//5 13535//5 13532//5\nf 13533//6 13529//6 13536//6\nf 13537//1 13538//1 13540//1\nf 13542//2 13541//2 13543//2\nf 13537//3 13541//3 13538//3\nf 13539//4 13538//4 13543//4\nf 13539//5 13543//5 13540//5\nf 13544//6 13541//6 13540//6\nf 13545//1 13546//1 13548//1\nf 13550//2 13549//2 13551//2\nf 13545//3 13549//3 13546//3\nf 13547//4 13546//4 13551//4\nf 13547//5 13551//5 13548//5\nf 13549//6 13545//6 13552//6\nf 13553//1 13554//1 13556//1\nf 13558//2 13557//2 13559//2\nf 13553//3 13557//3 13554//3\nf 13555//4 13554//4 13559//4\nf 13555//5 13559//5 13556//5\nf 13560//6 13557//6 13556//6\nf 13561//1 13562//1 13564//1\nf 13565//2 13568//2 13566//2\nf 13561//3 13565//3 13562//3\nf 13562//4 13566//4 13563//4\nf 13563//5 13567//5 13564//5\nf 13565//6 13561//6 13568//6\nf 13569//1 13570//1 13572//1\nf 13573//2 13576//2 13574//2\nf 13569//3 13573//3 13570//3\nf 13570//4 13574//4 13571//4\nf 13571//5 13575//5 13572//5\nf 13573//6 13569//6 13576//6\nf 13577//1 13578//1 13580//1\nf 13581//2 13584//2 13582//2\nf 13577//3 13581//3 13578//3\nf 13578//4 13582//4 13579//4\nf 13579//5 13583//5 13580//5\nf 13581//6 13577//6 13584//6\nf 13585//1 13586//1 13588//1\nf 13589//2 13592//2 13590//2\nf 13585//3 13589//3 13586//3\nf 13586//4 13590//4 13587//4\nf 13587//5 13591//5 13588//5\nf 13589//6 13585//6 13592//6\nf 13593//1 13594//1 13596//1\nf 13597//2 13600//2 13598//2\nf 13593//3 13597//3 13594//3\nf 13594//4 13598//4 13595//4\nf 13595//5 13599//5 13596//5\nf 13597//6 13593//6 13600//6\nf 13601//1 13604//1 13602//1\nf 13608//2 13605//2 13607//2\nf 13605//5 13601//5 13606//5\nf 13606//4 13602//4 13607//4\nf 13603//3 13604//3 13607//3\nf 13605//6 13608//6 13601//6\nf 13609//1 13612//1 13610//1\nf 13616//2 13613//2 13615//2\nf 13613//5 13609//5 13614//5\nf 13614//4 13610//4 13615//4\nf 13611//3 13612//3 13615//3\nf 13609//6 13613//6 13612//6\nf 13617//1 13620//1 13618//1\nf 13624//2 13621//2 13623//2\nf 13621//5 13617//5 13622//5\nf 13622//4 13618//4 13623//4\nf 13619//3 13620//3 13623//3\nf 13617//6 13621//6 13620//6\nf 13625//1 13628//1 13626//1\nf 13629//2 13630//2 13632//2\nf 13629//5 13625//5 13630//5\nf 13630//4 13626//4 13631//4\nf 13627//3 13628//3 13631//3\nf 13629//6 13632//6 13625//6\nf 13633//1 13636//1 13634//1\nf 13640//2 13637//2 13639//2\nf 13637//5 13633//5 13638//5\nf 13638//4 13634//4 13639//4\nf 13635//3 13636//3 13639//3\nf 13633//6 13637//6 13636//6\nf 13641//1 13644//1 13642//1\nf 13645//2 13646//2 13648//2\nf 13645//5 13641//5 13646//5\nf 13642//4 13643//4 13646//4\nf 13643//3 13644//3 13647//3\nf 13645//6 13648//6 13641//6\nf 13649//1 13652//1 13650//1\nf 13653//2 13654//2 13656//2\nf 13653//5 13649//5 13654//5\nf 13650//4 13651//4 13654//4\nf 13651//3 13652//3 13655//3\nf 13653//6 13656//6 13649//6\nf 13657//1 13660//1 13658//1\nf 13661//2 13662//2 13664//2\nf 13661//5 13657//5 13662//5\nf 13658//4 13659//4 13662//4\nf 13659//3 13660//3 13663//3\nf 13661//6 13664//6 13657//6\nf 13665//1 13668//1 13666//1\nf 13669//2 13670//2 13672//2\nf 13669//5 13665//5 13670//5\nf 13666//4 13667//4 13670//4\nf 13667//3 13668//3 13671//3\nf 13669//6 13672//6 13665//6\nf 13673//1 13676//1 13674//1\nf 13677//2 13678//2 13680//2\nf 13677//5 13673//5 13678//5\nf 13674//4 13675//4 13678//4\nf 13675//3 13676//3 13679//3\nf 13677//6 13680//6 13673//6\nf 13681//1 13684//1 13682//1\nf 13688//2 13685//2 13687//2\nf 13681//5 13682//5 13685//5\nf 13686//4 13682//4 13687//4\nf 13683//3 13684//3 13687//3\nf 13685//6 13688//6 13681//6\nf 13689//1 13692//1 13690//1\nf 13696//2 13693//2 13695//2\nf 13693//5 13689//5 13694//5\nf 13694//4 13690//4 13695//4\nf 13691//3 13692//3 13695//3\nf 13689//6 13693//6 13692//6\nf 13697//1 13700//1 13698//1\nf 13704//2 13701//2 13703//2\nf 13701//5 13697//5 13702//5\nf 13702//4 13698//4 13703//4\nf 13699//3 13700//3 13703//3\nf 13697//6 13701//6 13700//6\nf 13705//1 13708//1 13706//1\nf 13709//2 13710//2 13712//2\nf 13709//5 13705//5 13710//5\nf 13710//4 13706//4 13711//4\nf 13707//3 13708//3 13711//3\nf 13709//6 13712//6 13705//6\nf 13713//1 13716//1 13714//1\nf 13717//2 13718//2 13720//2\nf 13717//5 13713//5 13718//5\nf 13718//4 13714//4 13719//4\nf 13715//3 13716//3 13719//3\nf 13713//6 13717//6 13716//6\nf 13721//1 13724//1 13722//1\nf 13725//2 13726//2 13728//2\nf 13725//5 13721//5 13726//5\nf 13722//4 13723//4 13726//4\nf 13723//3 13724//3 13727//3\nf 13725//6 13728//6 13721//6\nf 13729//1 13732//1 13730//1\nf 13733//2 13734//2 13736//2\nf 13733//5 13729//5 13734//5\nf 13730//4 13731//4 13734//4\nf 13731//3 13732//3 13735//3\nf 13733//6 13736//6 13729//6\nf 13737//1 13740//1 13738//1\nf 13741//2 13742//2 13744//2\nf 13741//5 13737//5 13742//5\nf 13738//4 13739//4 13742//4\nf 13739//3 13740//3 13743//3\nf 13741//6 13744//6 13737//6\nf 13745//1 13748//1 13746//1\nf 13749//2 13750//2 13752//2\nf 13749//5 13745//5 13750//5\nf 13746//4 13747//4 13750//4\nf 13747//3 13748//3 13751//3\nf 13749//6 13752//6 13745//6\nf 13753//1 13756//1 13754//1\nf 13757//2 13758//2 13760//2\nf 13757//5 13753//5 13758//5\nf 13754//4 13755//4 13758//4\nf 13755//3 13756//3 13759//3\nf 13757//6 13760//6 13753//6\nf 13762//1 13761//1 13763//1\nf 13768//2 13765//2 13767//2\nf 13761//5 13762//5 13765//5\nf 13766//4 13762//4 13767//4\nf 13763//3 13764//3 13767//3\nf 13765//6 13768//6 13761//6\nf 13769//1 13772//1 13770//1\nf 13776//2 13773//2 13775//2\nf 13769//5 13770//5 13773//5\nf 13774//4 13770//4 13775//4\nf 13771//3 13772//3 13775//3\nf 13769//6 13773//6 13772//6\nf 13777//1 13780//1 13778//1\nf 13784//2 13781//2 13783//2\nf 13781//5 13777//5 13782//5\nf 13782//4 13778//4 13783//4\nf 13779//3 13780//3 13783//3\nf 13777//6 13781//6 13780//6\nf 13785//1 13788//1 13786//1\nf 13792//2 13789//2 13791//2\nf 13789//5 13785//5 13790//5\nf 13790//4 13786//4 13791//4\nf 13787//3 13788//3 13791//3\nf 13789//6 13792//6 13785//6\nf 13793//1 13796//1 13794//1\nf 13800//2 13797//2 13799//2\nf 13793//5 13794//5 13797//5\nf 13798//4 13794//4 13799//4\nf 13795//3 13796//3 13799//3\nf 13793//6 13797//6 13796//6\nf 13801//1 13804//1 13802//1\nf 13805//2 13806//2 13808//2\nf 13805//5 13801//5 13806//5\nf 13802//4 13803//4 13806//4\nf 13803//3 13804//3 13807//3\nf 13805//6 13808//6 13801//6\nf 13809//1 13812//1 13810//1\nf 13813//2 13814//2 13816//2\nf 13813//5 13809//5 13814//5\nf 13810//4 13811//4 13814//4\nf 13811//3 13812//3 13815//3\nf 13813//6 13816//6 13809//6\nf 13817//1 13820//1 13818//1\nf 13821//2 13822//2 13824//2\nf 13821//5 13817//5 13822//5\nf 13818//4 13819//4 13822//4\nf 13819//3 13820//3 13823//3\nf 13821//6 13824//6 13817//6\nf 13825//1 13828//1 13826//1\nf 13829//2 13830//2 13832//2\nf 13829//5 13825//5 13830//5\nf 13826//4 13827//4 13830//4\nf 13827//3 13828//3 13831//3\nf 13829//6 13832//6 13825//6\nf 13833//1 13836//1 13834//1\nf 13837//2 13838//2 13840//2\nf 13837//5 13833//5 13838//5\nf 13834//4 13835//4 13838//4\nf 13835//3 13836//3 13839//3\nf 13837//6 13840//6 13833//6\nf 13842//1 13841//1 13843//1\nf 13845//2 13846//2 13848//2\nf 13845//5 13841//5 13846//5\nf 13846//4 13842//4 13847//4\nf 13843//3 13844//3 13847//3\nf 13845//6 13848//6 13841//6\nf 13850//1 13849//1 13851//1\nf 13853//2 13854//2 13856//2\nf 13853//5 13849//5 13854//5\nf 13854//4 13850//4 13855//4\nf 13851//3 13852//3 13855//3\nf 13849//6 13853//6 13852//6\nf 13857//1 13860//1 13858//1\nf 13861//2 13862//2 13864//2\nf 13861//5 13857//5 13862//5\nf 13862//4 13858//4 13863//4\nf 13859//3 13860//3 13863//3\nf 13857//6 13861//6 13860//6\nf 13865//1 13868//1 13866//1\nf 13869//2 13870//2 13872//2\nf 13869//5 13865//5 13870//5\nf 13870//4 13866//4 13871//4\nf 13867//3 13868//3 13871//3\nf 13869//6 13872//6 13865//6\nf 13873//1 13876//1 13874//1\nf 13877//2 13878//2 13880//2\nf 13877//5 13873//5 13878//5\nf 13878//4 13874//4 13879//4\nf 13875//3 13876//3 13879//3\nf 13873//6 13877//6 13876//6\nf 13881//1 13884//1 13882//1\nf 13885//2 13886//2 13888//2\nf 13885//5 13881//5 13886//5\nf 13882//4 13883//4 13886//4\nf 13883//3 13884//3 13887//3\nf 13885//6 13888//6 13881//6\nf 13889//1 13892//1 13890//1\nf 13893//2 13894//2 13896//2\nf 13893//5 13889//5 13894//5\nf 13890//4 13891//4 13894//4\nf 13891//3 13892//3 13895//3\nf 13893//6 13896//6 13889//6\nf 13897//1 13900//1 13898//1\nf 13901//2 13902//2 13904//2\nf 13901//5 13897//5 13902//5\nf 13898//4 13899//4 13902//4\nf 13899//3 13900//3 13903//3\nf 13901//6 13904//6 13897//6\nf 13905//1 13908//1 13906//1\nf 13909//2 13910//2 13912//2\nf 13909//5 13905//5 13910//5\nf 13906//4 13907//4 13910//4\nf 13907//3 13908//3 13911//3\nf 13909//6 13912//6 13905//6\nf 13913//1 13916//1 13914//1\nf 13917//2 13918//2 13920//2\nf 13917//5 13913//5 13918//5\nf 13914//4 13915//4 13918//4\nf 13915//3 13916//3 13919//3\nf 13917//6 13920//6 13913//6\nf 13922//1 13921//1 13923//1\nf 13925//2 13926//2 13928//2\nf 13925//5 13921//5 13926//5\nf 13926//4 13922//4 13927//4\nf 13923//3 13924//3 13927//3\nf 13925//6 13928//6 13921//6\nf 13930//1 13929//1 13931//1\nf 13933//2 13934//2 13936//2\nf 13933//5 13929//5 13934//5\nf 13934//4 13930//4 13935//4\nf 13931//3 13932//3 13935//3\nf 13929//6 13933//6 13932//6\nf 13937//1 13940//1 13938//1\nf 13941//2 13942//2 13944//2\nf 13941//5 13937//5 13942//5\nf 13942//4 13938//4 13943//4\nf 13939//3 13940//3 13943//3\nf 13937//6 13941//6 13940//6\nf 13945//1 13948//1 13946//1\nf 13949//2 13950//2 13952//2\nf 13949//5 13945//5 13950//5\nf 13950//4 13946//4 13951//4\nf 13947//3 13948//3 13951//3\nf 13949//6 13952//6 13945//6\nf 13953//1 13956//1 13954//1\nf 13957//2 13958//2 13960//2\nf 13957//5 13953//5 13958//5\nf 13958//4 13954//4 13959//4\nf 13955//3 13956//3 13959//3\nf 13953//6 13957//6 13956//6\nf 13961//1 13964//1 13962//1\nf 13965//2 13966//2 13968//2\nf 13965//5 13961//5 13966//5\nf 13962//4 13963//4 13966//4\nf 13963//3 13964//3 13967//3\nf 13965//6 13968//6 13961//6\nf 13969//1 13972//1 13970//1\nf 13973//2 13974//2 13976//2\nf 13973//5 13969//5 13974//5\nf 13970//4 13971//4 13974//4\nf 13971//3 13972//3 13975//3\nf 13973//6 13976//6 13969//6\nf 13977//1 13980//1 13978//1\nf 13981//2 13982//2 13984//2\nf 13981//5 13977//5 13982//5\nf 13978//4 13979//4 13982//4\nf 13979//3 13980//3 13983//3\nf 13981//6 13984//6 13977//6\nf 13985//1 13988//1 13986//1\nf 13989//2 13990//2 13992//2\nf 13989//5 13985//5 13990//5\nf 13986//4 13987//4 13990//4\nf 13987//3 13988//3 13991//3\nf 13989//6 13992//6 13985//6\nf 13993//1 13996//1 13994//1\nf 13997//2 13998//2 14000//2\nf 13997//5 13993//5 13998//5\nf 13994//4 13995//4 13998//4\nf 13995//3 13996//3 13999//3\nf 13997//6 14000//6 13993//6\nf 14002//1 14001//1 14003//1\nf 14008//2 14005//2 14007//2\nf 14001//5 14002//5 14005//5\nf 14006//4 14002//4 14007//4\nf 14003//3 14004//3 14007//3\nf 14005//6 14008//6 14001//6\nf 14010//1 14009//1 14011//1\nf 14016//2 14013//2 14015//2\nf 14009//5 14010//5 14013//5\nf 14014//4 14010//4 14015//4\nf 14011//3 14012//3 14015//3\nf 14009//6 14013//6 14012//6\nf 14017//1 14020//1 14018//1\nf 14024//2 14021//2 14023//2\nf 14017//5 14018//5 14021//5\nf 14022//4 14018//4 14023//4\nf 14019//3 14020//3 14023//3\nf 14017//6 14021//6 14020//6\nf 14025//1 14028//1 14026//1\nf 14032//2 14029//2 14031//2\nf 14025//5 14026//5 14029//5\nf 14030//4 14026//4 14031//4\nf 14027//3 14028//3 14031//3\nf 14029//6 14032//6 14025//6\nf 14033//1 14036//1 14034//1\nf 14040//2 14037//2 14039//2\nf 14033//5 14034//5 14037//5\nf 14038//4 14034//4 14039//4\nf 14035//3 14036//3 14039//3\nf 14033//6 14037//6 14036//6\nf 14041//1 14044//1 14042//1\nf 14045//2 14046//2 14048//2\nf 14041//5 14042//5 14045//5\nf 14042//4 14043//4 14046//4\nf 14043//3 14044//3 14047//3\nf 14045//6 14048//6 14041//6\nf 14049//1 14052//1 14050//1\nf 14053//2 14054//2 14056//2\nf 14049//5 14050//5 14053//5\nf 14050//4 14051//4 14054//4\nf 14051//3 14052//3 14055//3\nf 14053//6 14056//6 14049//6\nf 14057//1 14060//1 14058//1\nf 14061//2 14062//2 14064//2\nf 14057//5 14058//5 14061//5\nf 14058//4 14059//4 14062//4\nf 14059//3 14060//3 14063//3\nf 14061//6 14064//6 14057//6\nf 14065//1 14068//1 14066//1\nf 14069//2 14070//2 14072//2\nf 14065//5 14066//5 14069//5\nf 14066//4 14067//4 14070//4\nf 14067//3 14068//3 14071//3\nf 14069//6 14072//6 14065//6\nf 14073//1 14076//1 14074//1\nf 14077//2 14078//2 14080//2\nf 14073//5 14074//5 14077//5\nf 14074//4 14075//4 14078//4\nf 14075//3 14076//3 14079//3\nf 14077//6 14080//6 14073//6\nf 14082//1 14081//1 14083//1\nf 14088//2 14085//2 14087//2\nf 14081//5 14082//5 14085//5\nf 14086//4 14082//4 14087//4\nf 14083//3 14084//3 14087//3\nf 14085//6 14088//6 14081//6\nf 14090//1 14089//1 14091//1\nf 14096//2 14093//2 14095//2\nf 14089//5 14090//5 14093//5\nf 14094//4 14090//4 14095//4\nf 14091//3 14092//3 14095//3\nf 14089//6 14093//6 14092//6\nf 14097//1 14100//1 14098//1\nf 14104//2 14101//2 14103//2\nf 14097//5 14098//5 14101//5\nf 14102//4 14098//4 14103//4\nf 14099//3 14100//3 14103//3\nf 14097//6 14101//6 14100//6\nf 14105//1 14108//1 14106//1\nf 14112//2 14109//2 14111//2\nf 14105//5 14106//5 14109//5\nf 14110//4 14106//4 14111//4\nf 14107//3 14108//3 14111//3\nf 14109//6 14112//6 14105//6\nf 14113//1 14116//1 14114//1\nf 14120//2 14117//2 14119//2\nf 14113//5 14114//5 14117//5\nf 14118//4 14114//4 14119//4\nf 14115//3 14116//3 14119//3\nf 14113//6 14117//6 14116//6\nf 14121//1 14124//1 14122//1\nf 14125//2 14126//2 14128//2\nf 14121//5 14122//5 14125//5\nf 14122//4 14123//4 14126//4\nf 14123//3 14124//3 14127//3\nf 14125//6 14128//6 14121//6\nf 14129//1 14132//1 14130//1\nf 14133//2 14134//2 14136//2\nf 14129//5 14130//5 14133//5\nf 14130//4 14131//4 14134//4\nf 14131//3 14132//3 14135//3\nf 14133//6 14136//6 14129//6\nf 14137//1 14140//1 14138//1\nf 14141//2 14142//2 14144//2\nf 14137//5 14138//5 14141//5\nf 14138//4 14139//4 14142//4\nf 14139//3 14140//3 14143//3\nf 14141//6 14144//6 14137//6\nf 14145//1 14148//1 14146//1\nf 14149//2 14150//2 14152//2\nf 14145//5 14146//5 14149//5\nf 14146//4 14147//4 14150//4\nf 14147//3 14148//3 14151//3\nf 14149//6 14152//6 14145//6\nf 14153//1 14156//1 14154//1\nf 14157//2 14158//2 14160//2\nf 14153//5 14154//5 14157//5\nf 14154//4 14155//4 14158//4\nf 14155//3 14156//3 14159//3\nf 14157//6 14160//6 14153//6\nf 14162//1 14161//1 14163//1\nf 14168//2 14165//2 14167//2\nf 14161//5 14162//5 14165//5\nf 14166//4 14162//4 14167//4\nf 14163//3 14164//3 14167//3\nf 14165//6 14168//6 14161//6\nf 14170//1 14169//1 14171//1\nf 14176//2 14173//2 14175//2\nf 14169//5 14170//5 14173//5\nf 14174//4 14170//4 14175//4\nf 14171//3 14172//3 14175//3\nf 14169//6 14173//6 14172//6\nf 14177//1 14180//1 14178//1\nf 14184//2 14181//2 14183//2\nf 14177//5 14178//5 14181//5\nf 14182//4 14178//4 14183//4\nf 14179//3 14180//3 14183//3\nf 14177//6 14181//6 14180//6\nf 14185//1 14188//1 14186//1\nf 14192//2 14189//2 14191//2\nf 14185//5 14186//5 14189//5\nf 14190//4 14186//4 14191//4\nf 14187//3 14188//3 14191//3\nf 14189//6 14192//6 14185//6\nf 14193//1 14196//1 14194//1\nf 14200//2 14197//2 14199//2\nf 14193//5 14194//5 14197//5\nf 14198//4 14194//4 14199//4\nf 14195//3 14196//3 14199//3\nf 14193//6 14197//6 14196//6\nf 14201//1 14204//1 14202//1\nf 14205//2 14206//2 14208//2\nf 14201//5 14202//5 14205//5\nf 14202//4 14203//4 14206//4\nf 14203//3 14204//3 14207//3\nf 14205//6 14208//6 14201//6\nf 14209//1 14212//1 14210//1\nf 14213//2 14214//2 14216//2\nf 14209//5 14210//5 14213//5\nf 14210//4 14211//4 14214//4\nf 14211//3 14212//3 14215//3\nf 14213//6 14216//6 14209//6\nf 14217//1 14220//1 14218//1\nf 14221//2 14222//2 14224//2\nf 14217//5 14218//5 14221//5\nf 14218//4 14219//4 14222//4\nf 14219//3 14220//3 14223//3\nf 14221//6 14224//6 14217//6\nf 14225//1 14228//1 14226//1\nf 14229//2 14230//2 14232//2\nf 14225//5 14226//5 14229//5\nf 14226//4 14227//4 14230//4\nf 14227//3 14228//3 14231//3\nf 14229//6 14232//6 14225//6\nf 14233//1 14236//1 14234//1\nf 14237//2 14238//2 14240//2\nf 14233//5 14234//5 14237//5\nf 14234//4 14235//4 14238//4\nf 14235//3 14236//3 14239//3\nf 14237//6 14240//6 14233//6\nf 14242//1 14241//1 14243//1\nf 14248//2 14245//2 14247//2\nf 14241//5 14242//5 14245//5\nf 14246//4 14242//4 14247//4\nf 14243//3 14244//3 14247//3\nf 14245//6 14248//6 14241//6\nf 14250//1 14249//1 14251//1\nf 14256//2 14253//2 14255//2\nf 14249//5 14250//5 14253//5\nf 14254//4 14250//4 14255//4\nf 14251//3 14252//3 14255//3\nf 14249//6 14253//6 14252//6\nf 14257//1 14260//1 14258//1\nf 14264//2 14261//2 14263//2\nf 14257//5 14258//5 14261//5\nf 14262//4 14258//4 14263//4\nf 14259//3 14260//3 14263//3\nf 14257//6 14261//6 14260//6\nf 14265//1 14268//1 14266//1\nf 14272//2 14269//2 14271//2\nf 14265//5 14266//5 14269//5\nf 14270//4 14266//4 14271//4\nf 14267//3 14268//3 14271//3\nf 14269//6 14272//6 14265//6\nf 14273//1 14276//1 14274//1\nf 14280//2 14277//2 14279//2\nf 14273//5 14274//5 14277//5\nf 14278//4 14274//4 14279//4\nf 14275//3 14276//3 14279//3\nf 14273//6 14277//6 14276//6\nf 14281//1 14284//1 14282//1\nf 14285//2 14286//2 14288//2\nf 14281//5 14282//5 14285//5\nf 14282//4 14283//4 14286//4\nf 14283//3 14284//3 14287//3\nf 14285//6 14288//6 14281//6\nf 14289//1 14292//1 14290//1\nf 14293//2 14294//2 14296//2\nf 14289//5 14290//5 14293//5\nf 14290//4 14291//4 14294//4\nf 14291//3 14292//3 14295//3\nf 14293//6 14296//6 14289//6\nf 14297//1 14300//1 14298//1\nf 14301//2 14302//2 14304//2\nf 14297//5 14298//5 14301//5\nf 14298//4 14299//4 14302//4\nf 14299//3 14300//3 14303//3\nf 14301//6 14304//6 14297//6\nf 14305//1 14308//1 14306//1\nf 14309//2 14310//2 14312//2\nf 14305//5 14306//5 14309//5\nf 14306//4 14307//4 14310//4\nf 14307//3 14308//3 14311//3\nf 14309//6 14312//6 14305//6\nf 14313//1 14316//1 14314//1\nf 14317//2 14318//2 14320//2\nf 14313//5 14314//5 14317//5\nf 14314//4 14315//4 14318//4\nf 14315//3 14316//3 14319//3\nf 14317//6 14320//6 14313//6\nf 14322//1 14321//1 14323//1\nf 14328//2 14325//2 14327//2\nf 14321//5 14322//5 14325//5\nf 14326//4 14322//4 14327//4\nf 14323//3 14324//3 14327//3\nf 14325//6 14328//6 14321//6\nf 14330//1 14329//1 14331//1\nf 14336//2 14333//2 14335//2\nf 14329//5 14330//5 14333//5\nf 14334//4 14330//4 14335//4\nf 14331//3 14332//3 14335//3\nf 14329//6 14333//6 14332//6\nf 14337//1 14340//1 14338//1\nf 14344//2 14341//2 14343//2\nf 14337//5 14338//5 14341//5\nf 14342//4 14338//4 14343//4\nf 14339//3 14340//3 14343//3\nf 14337//6 14341//6 14340//6\nf 14345//1 14348//1 14346//1\nf 14352//2 14349//2 14351//2\nf 14345//5 14346//5 14349//5\nf 14350//4 14346//4 14351//4\nf 14347//3 14348//3 14351//3\nf 14349//6 14352//6 14345//6\nf 14353//1 14356//1 14354//1\nf 14360//2 14357//2 14359//2\nf 14353//5 14354//5 14357//5\nf 14358//4 14354//4 14359//4\nf 14355//3 14356//3 14359//3\nf 14353//6 14357//6 14356//6\nf 14361//1 14364//1 14362//1\nf 14365//2 14366//2 14368//2\nf 14361//5 14362//5 14365//5\nf 14362//4 14363//4 14366//4\nf 14363//3 14364//3 14367//3\nf 14365//6 14368//6 14361//6\nf 14369//1 14372//1 14370//1\nf 14373//2 14374//2 14376//2\nf 14369//5 14370//5 14373//5\nf 14370//4 14371//4 14374//4\nf 14371//3 14372//3 14375//3\nf 14373//6 14376//6 14369//6\nf 14377//1 14380//1 14378//1\nf 14381//2 14382//2 14384//2\nf 14377//5 14378//5 14381//5\nf 14378//4 14379//4 14382//4\nf 14379//3 14380//3 14383//3\nf 14381//6 14384//6 14377//6\nf 14385//1 14388//1 14386//1\nf 14389//2 14390//2 14392//2\nf 14385//5 14386//5 14389//5\nf 14386//4 14387//4 14390//4\nf 14387//3 14388//3 14391//3\nf 14389//6 14392//6 14385//6\nf 14393//1 14396//1 14394//1\nf 14397//2 14398//2 14400//2\nf 14393//5 14394//5 14397//5\nf 14394//4 14395//4 14398//4\nf 14395//3 14396//3 14399//3\nf 14397//6 14400//6 14393//6\nf 14401//1 14402//1 14404//1\nf 14405//2 14408//2 14406//2\nf 14402//3 14401//3 14406//3\nf 14403//4 14402//4 14407//4\nf 14403//5 14407//5 14404//5\nf 14405//6 14401//6 14408//6\nf 14409//1 14410//1 14412//1\nf 14414//2 14413//2 14415//2\nf 14410//3 14409//3 14414//3\nf 14411//4 14410//4 14415//4\nf 14411//5 14415//5 14412//5\nf 14413//6 14409//6 14416//6\nf 14417//1 14418//1 14420//1\nf 14421//2 14424//2 14422//2\nf 14418//3 14417//3 14422//3\nf 14419//4 14418//4 14423//4\nf 14419//5 14423//5 14420//5\nf 14424//6 14421//6 14420//6\nf 14425//1 14426//1 14428//1\nf 14429//2 14432//2 14430//2\nf 14426//3 14425//3 14430//3\nf 14427//4 14426//4 14431//4\nf 14427//5 14431//5 14428//5\nf 14429//6 14425//6 14432//6\nf 14433//1 14434//1 14436//1\nf 14438//2 14437//2 14439//2\nf 14434//3 14433//3 14438//3\nf 14435//4 14434//4 14439//4\nf 14435//5 14439//5 14436//5\nf 14440//6 14437//6 14436//6\nf 14441//1 14442//1 14444//1\nf 14445//2 14448//2 14446//2\nf 14442//3 14441//3 14446//3\nf 14442//4 14446//4 14443//4\nf 14443//5 14447//5 14444//5\nf 14445//6 14441//6 14448//6\nf 14449//1 14450//1 14452//1\nf 14453//2 14456//2 14454//2\nf 14450//3 14449//3 14454//3\nf 14450//4 14454//4 14451//4\nf 14451//5 14455//5 14452//5\nf 14453//6 14449//6 14456//6\nf 14457//1 14458//1 14460//1\nf 14461//2 14464//2 14462//2\nf 14458//3 14457//3 14462//3\nf 14458//4 14462//4 14459//4\nf 14459//5 14463//5 14460//5\nf 14461//6 14457//6 14464//6\nf 14465//1 14466//1 14468//1\nf 14469//2 14472//2 14470//2\nf 14466//3 14465//3 14470//3\nf 14466//4 14470//4 14467//4\nf 14467//5 14471//5 14468//5\nf 14469//6 14465//6 14472//6\nf 14473//1 14474//1 14476//1\nf 14477//2 14480//2 14478//2\nf 14474//3 14473//3 14478//3\nf 14474//4 14478//4 14475//4\nf 14475//5 14479//5 14476//5\nf 14477//6 14473//6 14480//6\nf 14481//1 14482//1 14484//1\nf 14485//2 14488//2 14486//2\nf 14481//3 14485//3 14482//3\nf 14483//4 14482//4 14487//4\nf 14483//5 14487//5 14484//5\nf 14485//6 14481//6 14488//6\nf 14489//1 14490//1 14492//1\nf 14494//2 14493//2 14495//2\nf 14490//3 14489//3 14494//3\nf 14491//4 14490//4 14495//4\nf 14491//5 14495//5 14492//5\nf 14493//6 14489//6 14496//6\nf 14497//1 14498//1 14500//1\nf 14501//2 14504//2 14502//2\nf 14497//3 14501//3 14498//3\nf 14499//4 14498//4 14503//4\nf 14499//5 14503//5 14500//5\nf 14504//6 14501//6 14500//6\nf 14505//1 14506//1 14508//1\nf 14509//2 14512//2 14510//2\nf 14506//3 14505//3 14510//3\nf 14507//4 14506//4 14511//4\nf 14507//5 14511//5 14508//5\nf 14509//6 14505//6 14512//6\nf 14513//1 14514//1 14516//1\nf 14518//2 14517//2 14519//2\nf 14514//3 14513//3 14518//3\nf 14515//4 14514//4 14519//4\nf 14515//5 14519//5 14516//5\nf 14520//6 14517//6 14516//6\nf 14521//1 14522//1 14524//1\nf 14525//2 14528//2 14526//2\nf 14522//3 14521//3 14526//3\nf 14522//4 14526//4 14523//4\nf 14523//5 14527//5 14524//5\nf 14525//6 14521//6 14528//6\nf 14529//1 14530//1 14532//1\nf 14533//2 14536//2 14534//2\nf 14530//3 14529//3 14534//3\nf 14530//4 14534//4 14531//4\nf 14531//5 14535//5 14532//5\nf 14533//6 14529//6 14536//6\nf 14537//1 14538//1 14540//1\nf 14541//2 14544//2 14542//2\nf 14538//3 14537//3 14542//3\nf 14538//4 14542//4 14539//4\nf 14539//5 14543//5 14540//5\nf 14541//6 14537//6 14544//6\nf 14545//1 14546//1 14548//1\nf 14549//2 14552//2 14550//2\nf 14546//3 14545//3 14550//3\nf 14546//4 14550//4 14547//4\nf 14547//5 14551//5 14548//5\nf 14549//6 14545//6 14552//6\nf 14553//1 14554//1 14556//1\nf 14557//2 14560//2 14558//2\nf 14554//3 14553//3 14558//3\nf 14554//4 14558//4 14555//4\nf 14555//5 14559//5 14556//5\nf 14557//6 14553//6 14560//6\nf 14561//1 14562//1 14564//1\nf 14566//2 14565//2 14567//2\nf 14561//3 14565//3 14562//3\nf 14563//4 14562//4 14567//4\nf 14563//5 14567//5 14564//5\nf 14565//6 14561//6 14568//6\nf 14569//1 14570//1 14572//1\nf 14574//2 14573//2 14575//2\nf 14569//3 14573//3 14570//3\nf 14571//4 14570//4 14575//4\nf 14571//5 14575//5 14572//5\nf 14573//6 14569//6 14576//6\nf 14577//1 14578//1 14580//1\nf 14582//2 14581//2 14583//2\nf 14577//3 14581//3 14578//3\nf 14579//4 14578//4 14583//4\nf 14579//5 14583//5 14580//5\nf 14584//6 14581//6 14580//6\nf 14585//1 14586//1 14588//1\nf 14590//2 14589//2 14591//2\nf 14585//3 14589//3 14586//3\nf 14587//4 14586//4 14591//4\nf 14587//5 14591//5 14588//5\nf 14589//6 14585//6 14592//6\nf 14593//1 14594//1 14596//1\nf 14598//2 14597//2 14599//2\nf 14593//3 14597//3 14594//3\nf 14595//4 14594//4 14599//4\nf 14595//5 14599//5 14596//5\nf 14600//6 14597//6 14596//6\nf 14601//1 14602//1 14604//1\nf 14605//2 14608//2 14606//2\nf 14602//3 14601//3 14606//3\nf 14602//4 14606//4 14603//4\nf 14603//5 14607//5 14604//5\nf 14605//6 14601//6 14608//6\nf 14609//1 14610//1 14612//1\nf 14613//2 14616//2 14614//2\nf 14610//3 14609//3 14614//3\nf 14610//4 14614//4 14611//4\nf 14611//5 14615//5 14612//5\nf 14613//6 14609//6 14616//6\nf 14617//1 14618//1 14620//1\nf 14621//2 14624//2 14622//2\nf 14618//3 14617//3 14622//3\nf 14618//4 14622//4 14619//4\nf 14619//5 14623//5 14620//5\nf 14621//6 14617//6 14624//6\nf 14625//1 14626//1 14628//1\nf 14629//2 14632//2 14630//2\nf 14626//3 14625//3 14630//3\nf 14626//4 14630//4 14627//4\nf 14627//5 14631//5 14628//5\nf 14629//6 14625//6 14632//6\nf 14633//1 14634//1 14636//1\nf 14637//2 14640//2 14638//2\nf 14634//3 14633//3 14638//3\nf 14634//4 14638//4 14635//4\nf 14635//5 14639//5 14636//5\nf 14637//6 14633//6 14640//6\nf 14644//1 14641//1 14643//1\nf 14645//2 14648//2 14646//2\nf 14642//3 14641//3 14646//3\nf 14643//4 14642//4 14647//4\nf 14643//5 14647//5 14644//5\nf 14645//6 14641//6 14648//6\nf 14652//1 14649//1 14651//1\nf 14653//2 14656//2 14654//2\nf 14650//3 14649//3 14654//3\nf 14651//4 14650//4 14655//4\nf 14651//5 14655//5 14652//5\nf 14653//6 14649//6 14656//6\nf 14657//1 14658//1 14660//1\nf 14661//2 14664//2 14662//2\nf 14658//3 14657//3 14662//3\nf 14659//4 14658//4 14663//4\nf 14659//5 14663//5 14660//5\nf 14664//6 14661//6 14660//6\nf 14665//1 14666//1 14668//1\nf 14669//2 14672//2 14670//2\nf 14666//3 14665//3 14670//3\nf 14667//4 14666//4 14671//4\nf 14667//5 14671//5 14668//5\nf 14669//6 14665//6 14672//6\nf 14673//1 14674//1 14676//1\nf 14677//2 14680//2 14678//2\nf 14674//3 14673//3 14678//3\nf 14675//4 14674//4 14679//4\nf 14675//5 14679//5 14676//5\nf 14680//6 14677//6 14676//6\nf 14681//1 14682//1 14684//1\nf 14685//2 14688//2 14686//2\nf 14682//3 14681//3 14686//3\nf 14682//4 14686//4 14683//4\nf 14683//5 14687//5 14684//5\nf 14685//6 14681//6 14688//6\nf 14689//1 14690//1 14692//1\nf 14693//2 14696//2 14694//2\nf 14690//3 14689//3 14694//3\nf 14690//4 14694//4 14691//4\nf 14691//5 14695//5 14692//5\nf 14693//6 14689//6 14696//6\nf 14697//1 14698//1 14700//1\nf 14701//2 14704//2 14702//2\nf 14698//3 14697//3 14702//3\nf 14698//4 14702//4 14699//4\nf 14699//5 14703//5 14700//5\nf 14701//6 14697//6 14704//6\nf 14705//1 14706//1 14708//1\nf 14709//2 14712//2 14710//2\nf 14706//3 14705//3 14710//3\nf 14706//4 14710//4 14707//4\nf 14707//5 14711//5 14708//5\nf 14709//6 14705//6 14712//6\nf 14713//1 14714//1 14716//1\nf 14717//2 14720//2 14718//2\nf 14714//3 14713//3 14718//3\nf 14714//4 14718//4 14715//4\nf 14715//5 14719//5 14716//5\nf 14717//6 14713//6 14720//6\nf 14724//1 14721//1 14723//1\nf 14725//2 14728//2 14726//2\nf 14722//3 14721//3 14726//3\nf 14723//4 14722//4 14727//4\nf 14723//5 14727//5 14724//5\nf 14725//6 14721//6 14728//6\nf 14732//1 14729//1 14731//1\nf 14733//2 14736//2 14734//2\nf 14730//3 14729//3 14734//3\nf 14731//4 14730//4 14735//4\nf 14731//5 14735//5 14732//5\nf 14733//6 14729//6 14736//6\nf 14737//1 14738//1 14740//1\nf 14741//2 14744//2 14742//2\nf 14738//3 14737//3 14742//3\nf 14739//4 14738//4 14743//4\nf 14739//5 14743//5 14740//5\nf 14744//6 14741//6 14740//6\nf 14745//1 14746//1 14748//1\nf 14749//2 14752//2 14750//2\nf 14746//3 14745//3 14750//3\nf 14747//4 14746//4 14751//4\nf 14747//5 14751//5 14748//5\nf 14749//6 14745//6 14752//6\nf 14753//1 14754//1 14756//1\nf 14757//2 14760//2 14758//2\nf 14754//3 14753//3 14758//3\nf 14755//4 14754//4 14759//4\nf 14755//5 14759//5 14756//5\nf 14760//6 14757//6 14756//6\nf 14761//1 14762//1 14764//1\nf 14765//2 14768//2 14766//2\nf 14762//3 14761//3 14766//3\nf 14762//4 14766//4 14763//4\nf 14763//5 14767//5 14764//5\nf 14765//6 14761//6 14768//6\nf 14769//1 14770//1 14772//1\nf 14773//2 14776//2 14774//2\nf 14770//3 14769//3 14774//3\nf 14770//4 14774//4 14771//4\nf 14771//5 14775//5 14772//5\nf 14773//6 14769//6 14776//6\nf 14777//1 14778//1 14780//1\nf 14781//2 14784//2 14782//2\nf 14778//3 14777//3 14782//3\nf 14778//4 14782//4 14779//4\nf 14779//5 14783//5 14780//5\nf 14781//6 14777//6 14784//6\nf 14785//1 14786//1 14788//1\nf 14789//2 14792//2 14790//2\nf 14786//3 14785//3 14790//3\nf 14786//4 14790//4 14787//4\nf 14787//5 14791//5 14788//5\nf 14789//6 14785//6 14792//6\nf 14793//1 14794//1 14796//1\nf 14797//2 14800//2 14798//2\nf 14794//3 14793//3 14798//3\nf 14794//4 14798//4 14795//4\nf 14795//5 14799//5 14796//5\nf 14797//6 14793//6 14800//6\nf 14804//1 14801//1 14803//1\nf 14806//2 14805//2 14807//2\nf 14801//3 14805//3 14802//3\nf 14803//4 14802//4 14807//4\nf 14803//5 14807//5 14804//5\nf 14805//6 14801//6 14808//6\nf 14812//1 14809//1 14811//1\nf 14814//2 14813//2 14815//2\nf 14809//3 14813//3 14810//3\nf 14811//4 14810//4 14815//4\nf 14811//5 14815//5 14812//5\nf 14813//6 14809//6 14816//6\nf 14817//1 14818//1 14820//1\nf 14822//2 14821//2 14823//2\nf 14817//3 14821//3 14818//3\nf 14819//4 14818//4 14823//4\nf 14819//5 14823//5 14820//5\nf 14824//6 14821//6 14820//6\nf 14825//1 14826//1 14828//1\nf 14830//2 14829//2 14831//2\nf 14825//3 14829//3 14826//3\nf 14827//4 14826//4 14831//4\nf 14827//5 14831//5 14828//5\nf 14829//6 14825//6 14832//6\nf 14833//1 14834//1 14836//1\nf 14838//2 14837//2 14839//2\nf 14833//3 14837//3 14834//3\nf 14835//4 14834//4 14839//4\nf 14835//5 14839//5 14836//5\nf 14840//6 14837//6 14836//6\nf 14841//1 14842//1 14844//1\nf 14845//2 14848//2 14846//2\nf 14841//3 14845//3 14842//3\nf 14842//4 14846//4 14843//4\nf 14843//5 14847//5 14844//5\nf 14845//6 14841//6 14848//6\nf 14849//1 14850//1 14852//1\nf 14853//2 14856//2 14854//2\nf 14849//3 14853//3 14850//3\nf 14850//4 14854//4 14851//4\nf 14851//5 14855//5 14852//5\nf 14853//6 14849//6 14856//6\nf 14857//1 14858//1 14860//1\nf 14861//2 14864//2 14862//2\nf 14857//3 14861//3 14858//3\nf 14858//4 14862//4 14859//4\nf 14859//5 14863//5 14860//5\nf 14861//6 14857//6 14864//6\nf 14865//1 14866//1 14868//1\nf 14869//2 14872//2 14870//2\nf 14865//3 14869//3 14866//3\nf 14866//4 14870//4 14867//4\nf 14867//5 14871//5 14868//5\nf 14869//6 14865//6 14872//6\nf 14873//1 14874//1 14876//1\nf 14877//2 14880//2 14878//2\nf 14873//3 14877//3 14874//3\nf 14874//4 14878//4 14875//4\nf 14875//5 14879//5 14876//5\nf 14877//6 14873//6 14880//6\nf 14884//1 14881//1 14883//1\nf 14886//2 14885//2 14887//2\nf 14881//3 14885//3 14882//3\nf 14883//4 14882//4 14887//4\nf 14883//5 14887//5 14884//5\nf 14885//6 14881//6 14888//6\nf 14892//1 14889//1 14891//1\nf 14894//2 14893//2 14895//2\nf 14889//3 14893//3 14890//3\nf 14891//4 14890//4 14895//4\nf 14891//5 14895//5 14892//5\nf 14893//6 14889//6 14896//6\nf 14897//1 14898//1 14900//1\nf 14902//2 14901//2 14903//2\nf 14897//3 14901//3 14898//3\nf 14899//4 14898//4 14903//4\nf 14899//5 14903//5 14900//5\nf 14904//6 14901//6 14900//6\nf 14905//1 14906//1 14908//1\nf 14910//2 14909//2 14911//2\nf 14905//3 14909//3 14906//3\nf 14907//4 14906//4 14911//4\nf 14907//5 14911//5 14908//5\nf 14909//6 14905//6 14912//6\nf 14913//1 14914//1 14916//1\nf 14918//2 14917//2 14919//2\nf 14913//3 14917//3 14914//3\nf 14915//4 14914//4 14919//4\nf 14915//5 14919//5 14916//5\nf 14920//6 14917//6 14916//6\nf 14921//1 14922//1 14924//1\nf 14925//2 14928//2 14926//2\nf 14921//3 14925//3 14922//3\nf 14922//4 14926//4 14923//4\nf 14923//5 14927//5 14924//5\nf 14925//6 14921//6 14928//6\nf 14929//1 14930//1 14932//1\nf 14933//2 14936//2 14934//2\nf 14929//3 14933//3 14930//3\nf 14930//4 14934//4 14931//4\nf 14931//5 14935//5 14932//5\nf 14933//6 14929//6 14936//6\nf 14937//1 14938//1 14940//1\nf 14941//2 14944//2 14942//2\nf 14937//3 14941//3 14938//3\nf 14938//4 14942//4 14939//4\nf 14939//5 14943//5 14940//5\nf 14941//6 14937//6 14944//6\nf 14945//1 14946//1 14948//1\nf 14949//2 14952//2 14950//2\nf 14945//3 14949//3 14946//3\nf 14946//4 14950//4 14947//4\nf 14947//5 14951//5 14948//5\nf 14949//6 14945//6 14952//6\nf 14953//1 14954//1 14956//1\nf 14957//2 14960//2 14958//2\nf 14953//3 14957//3 14954//3\nf 14954//4 14958//4 14955//4\nf 14955//5 14959//5 14956//5\nf 14957//6 14953//6 14960//6\nf 14964//1 14961//1 14963//1\nf 14966//2 14965//2 14967//2\nf 14961//3 14965//3 14962//3\nf 14963//4 14962//4 14967//4\nf 14963//5 14967//5 14964//5\nf 14965//6 14961//6 14968//6\nf 14972//1 14969//1 14971//1\nf 14974//2 14973//2 14975//2\nf 14969//3 14973//3 14970//3\nf 14971//4 14970//4 14975//4\nf 14971//5 14975//5 14972//5\nf 14973//6 14969//6 14976//6\nf 14977//1 14978//1 14980//1\nf 14982//2 14981//2 14983//2\nf 14977//3 14981//3 14978//3\nf 14979//4 14978//4 14983//4\nf 14979//5 14983//5 14980//5\nf 14984//6 14981//6 14980//6\nf 14985//1 14986//1 14988//1\nf 14990//2 14989//2 14991//2\nf 14985//3 14989//3 14986//3\nf 14987//4 14986//4 14991//4\nf 14987//5 14991//5 14988//5\nf 14989//6 14985//6 14992//6\nf 14993//1 14994//1 14996//1\nf 14998//2 14997//2 14999//2\nf 14993//3 14997//3 14994//3\nf 14995//4 14994//4 14999//4\nf 14995//5 14999//5 14996//5\nf 15000//6 14997//6 14996//6\nf 15001//1 15002//1 15004//1\nf 15005//2 15008//2 15006//2\nf 15001//3 15005//3 15002//3\nf 15002//4 15006//4 15003//4\nf 15003//5 15007//5 15004//5\nf 15005//6 15001//6 15008//6\nf 15009//1 15010//1 15012//1\nf 15013//2 15016//2 15014//2\nf 15009//3 15013//3 15010//3\nf 15010//4 15014//4 15011//4\nf 15011//5 15015//5 15012//5\nf 15013//6 15009//6 15016//6\nf 15017//1 15018//1 15020//1\nf 15021//2 15024//2 15022//2\nf 15017//3 15021//3 15018//3\nf 15018//4 15022//4 15019//4\nf 15019//5 15023//5 15020//5\nf 15021//6 15017//6 15024//6\nf 15025//1 15026//1 15028//1\nf 15029//2 15032//2 15030//2\nf 15025//3 15029//3 15026//3\nf 15026//4 15030//4 15027//4\nf 15027//5 15031//5 15028//5\nf 15029//6 15025//6 15032//6\nf 15033//1 15034//1 15036//1\nf 15037//2 15040//2 15038//2\nf 15033//3 15037//3 15034//3\nf 15034//4 15038//4 15035//4\nf 15035//5 15039//5 15036//5\nf 15037//6 15033//6 15040//6\nf 15044//1 15041//1 15043//1\nf 15046//2 15045//2 15047//2\nf 15041//3 15045//3 15042//3\nf 15043//4 15042//4 15047//4\nf 15043//5 15047//5 15044//5\nf 15045//6 15041//6 15048//6\nf 15052//1 15049//1 15051//1\nf 15054//2 15053//2 15055//2\nf 15049//3 15053//3 15050//3\nf 15051//4 15050//4 15055//4\nf 15051//5 15055//5 15052//5\nf 15053//6 15049//6 15056//6\nf 15057//1 15058//1 15060//1\nf 15062//2 15061//2 15063//2\nf 15057//3 15061//3 15058//3\nf 15059//4 15058//4 15063//4\nf 15059//5 15063//5 15060//5\nf 15064//6 15061//6 15060//6\nf 15065//1 15066//1 15068//1\nf 15070//2 15069//2 15071//2\nf 15065//3 15069//3 15066//3\nf 15067//4 15066//4 15071//4\nf 15067//5 15071//5 15068//5\nf 15069//6 15065//6 15072//6\nf 15073//1 15074//1 15076//1\nf 15078//2 15077//2 15079//2\nf 15073//3 15077//3 15074//3\nf 15075//4 15074//4 15079//4\nf 15075//5 15079//5 15076//5\nf 15080//6 15077//6 15076//6\nf 15081//1 15082//1 15084//1\nf 15085//2 15088//2 15086//2\nf 15081//3 15085//3 15082//3\nf 15082//4 15086//4 15083//4\nf 15083//5 15087//5 15084//5\nf 15085//6 15081//6 15088//6\nf 15089//1 15090//1 15092//1\nf 15093//2 15096//2 15094//2\nf 15089//3 15093//3 15090//3\nf 15090//4 15094//4 15091//4\nf 15091//5 15095//5 15092//5\nf 15093//6 15089//6 15096//6\nf 15097//1 15098//1 15100//1\nf 15101//2 15104//2 15102//2\nf 15097//3 15101//3 15098//3\nf 15098//4 15102//4 15099//4\nf 15099//5 15103//5 15100//5\nf 15101//6 15097//6 15104//6\nf 15105//1 15106//1 15108//1\nf 15109//2 15112//2 15110//2\nf 15105//3 15109//3 15106//3\nf 15106//4 15110//4 15107//4\nf 15107//5 15111//5 15108//5\nf 15109//6 15105//6 15112//6\nf 15113//1 15114//1 15116//1\nf 15117//2 15120//2 15118//2\nf 15113//3 15117//3 15114//3\nf 15114//4 15118//4 15115//4\nf 15115//5 15119//5 15116//5\nf 15117//6 15113//6 15120//6\nf 15124//1 15121//1 15123//1\nf 15126//2 15125//2 15127//2\nf 15121//3 15125//3 15122//3\nf 15123//4 15122//4 15127//4\nf 15123//5 15127//5 15124//5\nf 15125//6 15121//6 15128//6\nf 15132//1 15129//1 15131//1\nf 15134//2 15133//2 15135//2\nf 15129//3 15133//3 15130//3\nf 15131//4 15130//4 15135//4\nf 15131//5 15135//5 15132//5\nf 15133//6 15129//6 15136//6\nf 15137//1 15138//1 15140//1\nf 15142//2 15141//2 15143//2\nf 15137//3 15141//3 15138//3\nf 15139//4 15138//4 15143//4\nf 15139//5 15143//5 15140//5\nf 15144//6 15141//6 15140//6\nf 15145//1 15146//1 15148//1\nf 15150//2 15149//2 15151//2\nf 15145//3 15149//3 15146//3\nf 15147//4 15146//4 15151//4\nf 15147//5 15151//5 15148//5\nf 15149//6 15145//6 15152//6\nf 15153//1 15154//1 15156//1\nf 15158//2 15157//2 15159//2\nf 15153//3 15157//3 15154//3\nf 15155//4 15154//4 15159//4\nf 15155//5 15159//5 15156//5\nf 15160//6 15157//6 15156//6\nf 15161//1 15162//1 15164//1\nf 15165//2 15168//2 15166//2\nf 15161//3 15165//3 15162//3\nf 15162//4 15166//4 15163//4\nf 15163//5 15167//5 15164//5\nf 15165//6 15161//6 15168//6\nf 15169//1 15170//1 15172//1\nf 15173//2 15176//2 15174//2\nf 15169//3 15173//3 15170//3\nf 15170//4 15174//4 15171//4\nf 15171//5 15175//5 15172//5\nf 15173//6 15169//6 15176//6\nf 15177//1 15178//1 15180//1\nf 15181//2 15184//2 15182//2\nf 15177//3 15181//3 15178//3\nf 15178//4 15182//4 15179//4\nf 15179//5 15183//5 15180//5\nf 15181//6 15177//6 15184//6\nf 15185//1 15186//1 15188//1\nf 15189//2 15192//2 15190//2\nf 15185//3 15189//3 15186//3\nf 15186//4 15190//4 15187//4\nf 15187//5 15191//5 15188//5\nf 15189//6 15185//6 15192//6\nf 15193//1 15194//1 15196//1\nf 15197//2 15200//2 15198//2\nf 15193//3 15197//3 15194//3\nf 15194//4 15198//4 15195//4\nf 15195//5 15199//5 15196//5\nf 15197//6 15193//6 15200//6\nf 15201//1 15204//1 15202//1\nf 15208//2 15205//2 15207//2\nf 15205//5 15201//5 15206//5\nf 15206//4 15202//4 15207//4\nf 15203//3 15204//3 15207//3\nf 15205//6 15208//6 15201//6\nf 15209//1 15212//1 15210//1\nf 15216//2 15213//2 15215//2\nf 15213//5 15209//5 15214//5\nf 15214//4 15210//4 15215//4\nf 15211//3 15212//3 15215//3\nf 15209//6 15213//6 15212//6\nf 15217//1 15220//1 15218//1\nf 15224//2 15221//2 15223//2\nf 15221//5 15217//5 15222//5\nf 15222//4 15218//4 15223//4\nf 15219//3 15220//3 15223//3\nf 15217//6 15221//6 15220//6\nf 15225//1 15228//1 15226//1\nf 15229//2 15230//2 15232//2\nf 15229//5 15225//5 15230//5\nf 15230//4 15226//4 15231//4\nf 15227//3 15228//3 15231//3\nf 15229//6 15232//6 15225//6\nf 15233//1 15236//1 15234//1\nf 15240//2 15237//2 15239//2\nf 15237//5 15233//5 15238//5\nf 15238//4 15234//4 15239//4\nf 15235//3 15236//3 15239//3\nf 15233//6 15237//6 15236//6\nf 15241//1 15244//1 15242//1\nf 15245//2 15246//2 15248//2\nf 15245//5 15241//5 15246//5\nf 15242//4 15243//4 15246//4\nf 15243//3 15244//3 15247//3\nf 15245//6 15248//6 15241//6\nf 15249//1 15252//1 15250//1\nf 15253//2 15254//2 15256//2\nf 15253//5 15249//5 15254//5\nf 15250//4 15251//4 15254//4\nf 15251//3 15252//3 15255//3\nf 15253//6 15256//6 15249//6\nf 15257//1 15260//1 15258//1\nf 15261//2 15262//2 15264//2\nf 15261//5 15257//5 15262//5\nf 15258//4 15259//4 15262//4\nf 15259//3 15260//3 15263//3\nf 15261//6 15264//6 15257//6\nf 15265//1 15268//1 15266//1\nf 15269//2 15270//2 15272//2\nf 15269//5 15265//5 15270//5\nf 15266//4 15267//4 15270//4\nf 15267//3 15268//3 15271//3\nf 15269//6 15272//6 15265//6\nf 15273//1 15276//1 15274//1\nf 15277//2 15278//2 15280//2\nf 15277//5 15273//5 15278//5\nf 15274//4 15275//4 15278//4\nf 15275//3 15276//3 15279//3\nf 15277//6 15280//6 15273//6\nf 15281//1 15284//1 15282//1\nf 15288//2 15285//2 15287//2\nf 15281//5 15282//5 15285//5\nf 15286//4 15282//4 15287//4\nf 15283//3 15284//3 15287//3\nf 15285//6 15288//6 15281//6\nf 15289//1 15292//1 15290//1\nf 15296//2 15293//2 15295//2\nf 15293//5 15289//5 15294//5\nf 15294//4 15290//4 15295//4\nf 15291//3 15292//3 15295//3\nf 15289//6 15293//6 15292//6\nf 15297//1 15300//1 15298//1\nf 15304//2 15301//2 15303//2\nf 15297//5 15298//5 15301//5\nf 15302//4 15298//4 15303//4\nf 15299//3 15300//3 15303//3\nf 15297//6 15301//6 15300//6\nf 15305//1 15308//1 15306//1\nf 15309//2 15310//2 15312//2\nf 15309//5 15305//5 15310//5\nf 15310//4 15306//4 15311//4\nf 15307//3 15308//3 15311//3\nf 15309//6 15312//6 15305//6\nf 15313//1 15316//1 15314//1\nf 15317//2 15318//2 15320//2\nf 15317//5 15313//5 15318//5\nf 15318//4 15314//4 15319//4\nf 15315//3 15316//3 15319//3\nf 15313//6 15317//6 15316//6\nf 15321//1 15324//1 15322//1\nf 15325//2 15326//2 15328//2\nf 15325//5 15321//5 15326//5\nf 15322//4 15323//4 15326//4\nf 15323//3 15324//3 15327//3\nf 15325//6 15328//6 15321//6\nf 15329//1 15332//1 15330//1\nf 15333//2 15334//2 15336//2\nf 15333//5 15329//5 15334//5\nf 15330//4 15331//4 15334//4\nf 15331//3 15332//3 15335//3\nf 15333//6 15336//6 15329//6\nf 15337//1 15340//1 15338//1\nf 15341//2 15342//2 15344//2\nf 15341//5 15337//5 15342//5\nf 15338//4 15339//4 15342//4\nf 15339//3 15340//3 15343//3\nf 15341//6 15344//6 15337//6\nf 15345//1 15348//1 15346//1\nf 15349//2 15350//2 15352//2\nf 15349//5 15345//5 15350//5\nf 15346//4 15347//4 15350//4\nf 15347//3 15348//3 15351//3\nf 15349//6 15352//6 15345//6\nf 15353//1 15356//1 15354//1\nf 15357//2 15358//2 15360//2\nf 15357//5 15353//5 15358//5\nf 15354//4 15355//4 15358//4\nf 15355//3 15356//3 15359//3\nf 15357//6 15360//6 15353//6\nf 15362//1 15361//1 15363//1\nf 15368//2 15365//2 15367//2\nf 15361//5 15362//5 15365//5\nf 15366//4 15362//4 15367//4\nf 15363//3 15364//3 15367//3\nf 15365//6 15368//6 15361//6\nf 15369//1 15372//1 15370//1\nf 15376//2 15373//2 15375//2\nf 15369//5 15370//5 15373//5\nf 15374//4 15370//4 15375//4\nf 15371//3 15372//3 15375//3\nf 15369//6 15373//6 15372//6\nf 15377//1 15380//1 15378//1\nf 15384//2 15381//2 15383//2\nf 15377//5 15378//5 15381//5\nf 15382//4 15378//4 15383//4\nf 15379//3 15380//3 15383//3\nf 15377//6 15381//6 15380//6\nf 15385//1 15388//1 15386//1\nf 15392//2 15389//2 15391//2\nf 15385//5 15386//5 15389//5\nf 15390//4 15386//4 15391//4\nf 15387//3 15388//3 15391//3\nf 15389//6 15392//6 15385//6\nf 15393//1 15396//1 15394//1\nf 15400//2 15397//2 15399//2\nf 15393//5 15394//5 15397//5\nf 15398//4 15394//4 15399//4\nf 15395//3 15396//3 15399//3\nf 15393//6 15397//6 15396//6\nf 15401//1 15404//1 15402//1\nf 15405//2 15406//2 15408//2\nf 15405//5 15401//5 15406//5\nf 15402//4 15403//4 15406//4\nf 15403//3 15404//3 15407//3\nf 15405//6 15408//6 15401//6\nf 15409//1 15412//1 15410//1\nf 15413//2 15414//2 15416//2\nf 15413//5 15409//5 15414//5\nf 15410//4 15411//4 15414//4\nf 15411//3 15412//3 15415//3\nf 15413//6 15416//6 15409//6\nf 15417//1 15420//1 15418//1\nf 15421//2 15422//2 15424//2\nf 15421//5 15417//5 15422//5\nf 15418//4 15419//4 15422//4\nf 15419//3 15420//3 15423//3\nf 15421//6 15424//6 15417//6\nf 15425//1 15428//1 15426//1\nf 15429//2 15430//2 15432//2\nf 15429//5 15425//5 15430//5\nf 15426//4 15427//4 15430//4\nf 15427//3 15428//3 15431//3\nf 15429//6 15432//6 15425//6\nf 15433//1 15436//1 15434//1\nf 15437//2 15438//2 15440//2\nf 15437//5 15433//5 15438//5\nf 15434//4 15435//4 15438//4\nf 15435//3 15436//3 15439//3\nf 15437//6 15440//6 15433//6\nf 15442//1 15441//1 15443//1\nf 15445//2 15446//2 15448//2\nf 15445//5 15441//5 15446//5\nf 15446//4 15442//4 15447//4\nf 15443//3 15444//3 15447//3\nf 15445//6 15448//6 15441//6\nf 15450//1 15449//1 15451//1\nf 15453//2 15454//2 15456//2\nf 15453//5 15449//5 15454//5\nf 15454//4 15450//4 15455//4\nf 15451//3 15452//3 15455//3\nf 15449//6 15453//6 15452//6\nf 15457//1 15460//1 15458//1\nf 15461//2 15462//2 15464//2\nf 15461//5 15457//5 15462//5\nf 15462//4 15458//4 15463//4\nf 15459//3 15460//3 15463//3\nf 15457//6 15461//6 15460//6\nf 15465//1 15468//1 15466//1\nf 15469//2 15470//2 15472//2\nf 15469//5 15465//5 15470//5\nf 15470//4 15466//4 15471//4\nf 15467//3 15468//3 15471//3\nf 15469//6 15472//6 15465//6\nf 15473//1 15476//1 15474//1\nf 15477//2 15478//2 15480//2\nf 15477//5 15473//5 15478//5\nf 15478//4 15474//4 15479//4\nf 15475//3 15476//3 15479//3\nf 15473//6 15477//6 15476//6\nf 15481//1 15484//1 15482//1\nf 15485//2 15486//2 15488//2\nf 15485//5 15481//5 15486//5\nf 15482//4 15483//4 15486//4\nf 15483//3 15484//3 15487//3\nf 15485//6 15488//6 15481//6\nf 15489//1 15492//1 15490//1\nf 15493//2 15494//2 15496//2\nf 15493//5 15489//5 15494//5\nf 15490//4 15491//4 15494//4\nf 15491//3 15492//3 15495//3\nf 15493//6 15496//6 15489//6\nf 15497//1 15500//1 15498//1\nf 15501//2 15502//2 15504//2\nf 15501//5 15497//5 15502//5\nf 15498//4 15499//4 15502//4\nf 15499//3 15500//3 15503//3\nf 15501//6 15504//6 15497//6\nf 15505//1 15508//1 15506//1\nf 15509//2 15510//2 15512//2\nf 15509//5 15505//5 15510//5\nf 15506//4 15507//4 15510//4\nf 15507//3 15508//3 15511//3\nf 15509//6 15512//6 15505//6\nf 15513//1 15516//1 15514//1\nf 15517//2 15518//2 15520//2\nf 15517//5 15513//5 15518//5\nf 15514//4 15515//4 15518//4\nf 15515//3 15516//3 15519//3\nf 15517//6 15520//6 15513//6\nf 15522//1 15521//1 15523//1\nf 15525//2 15526//2 15528//2\nf 15525//5 15521//5 15526//5\nf 15526//4 15522//4 15527//4\nf 15523//3 15524//3 15527//3\nf 15525//6 15528//6 15521//6\nf 15530//1 15529//1 15531//1\nf 15533//2 15534//2 15536//2\nf 15533//5 15529//5 15534//5\nf 15534//4 15530//4 15535//4\nf 15531//3 15532//3 15535//3\nf 15529//6 15533//6 15532//6\nf 15537//1 15540//1 15538//1\nf 15541//2 15542//2 15544//2\nf 15541//5 15537//5 15542//5\nf 15542//4 15538//4 15543//4\nf 15539//3 15540//3 15543//3\nf 15537//6 15541//6 15540//6\nf 15545//1 15548//1 15546//1\nf 15549//2 15550//2 15552//2\nf 15549//5 15545//5 15550//5\nf 15550//4 15546//4 15551//4\nf 15547//3 15548//3 15551//3\nf 15549//6 15552//6 15545//6\nf 15553//1 15556//1 15554//1\nf 15557//2 15558//2 15560//2\nf 15557//5 15553//5 15558//5\nf 15558//4 15554//4 15559//4\nf 15555//3 15556//3 15559//3\nf 15553//6 15557//6 15556//6\nf 15561//1 15564//1 15562//1\nf 15565//2 15566//2 15568//2\nf 15565//5 15561//5 15566//5\nf 15562//4 15563//4 15566//4\nf 15563//3 15564//3 15567//3\nf 15565//6 15568//6 15561//6\nf 15569//1 15572//1 15570//1\nf 15573//2 15574//2 15576//2\nf 15573//5 15569//5 15574//5\nf 15570//4 15571//4 15574//4\nf 15571//3 15572//3 15575//3\nf 15573//6 15576//6 15569//6\nf 15577//1 15580//1 15578//1\nf 15581//2 15582//2 15584//2\nf 15581//5 15577//5 15582//5\nf 15578//4 15579//4 15582//4\nf 15579//3 15580//3 15583//3\nf 15581//6 15584//6 15577//6\nf 15585//1 15588//1 15586//1\nf 15589//2 15590//2 15592//2\nf 15589//5 15585//5 15590//5\nf 15586//4 15587//4 15590//4\nf 15587//3 15588//3 15591//3\nf 15589//6 15592//6 15585//6\nf 15593//1 15596//1 15594//1\nf 15597//2 15598//2 15600//2\nf 15597//5 15593//5 15598//5\nf 15594//4 15595//4 15598//4\nf 15595//3 15596//3 15599//3\nf 15597//6 15600//6 15593//6\nf 15602//1 15601//1 15603//1\nf 15608//2 15605//2 15607//2\nf 15601//5 15602//5 15605//5\nf 15606//4 15602//4 15607//4\nf 15603//3 15604//3 15607//3\nf 15605//6 15608//6 15601//6\nf 15610//1 15609//1 15611//1\nf 15616//2 15613//2 15615//2\nf 15609//5 15610//5 15613//5\nf 15614//4 15610//4 15615//4\nf 15611//3 15612//3 15615//3\nf 15609//6 15613//6 15612//6\nf 15617//1 15620//1 15618//1\nf 15624//2 15621//2 15623//2\nf 15617//5 15618//5 15621//5\nf 15622//4 15618//4 15623//4\nf 15619//3 15620//3 15623//3\nf 15617//6 15621//6 15620//6\nf 15625//1 15628//1 15626//1\nf 15632//2 15629//2 15631//2\nf 15625//5 15626//5 15629//5\nf 15630//4 15626//4 15631//4\nf 15627//3 15628//3 15631//3\nf 15629//6 15632//6 15625//6\nf 15633//1 15636//1 15634//1\nf 15640//2 15637//2 15639//2\nf 15633//5 15634//5 15637//5\nf 15638//4 15634//4 15639//4\nf 15635//3 15636//3 15639//3\nf 15633//6 15637//6 15636//6\nf 15641//1 15644//1 15642//1\nf 15645//2 15646//2 15648//2\nf 15641//5 15642//5 15645//5\nf 15642//4 15643//4 15646//4\nf 15643//3 15644//3 15647//3\nf 15645//6 15648//6 15641//6\nf 15649//1 15652//1 15650//1\nf 15653//2 15654//2 15656//2\nf 15649//5 15650//5 15653//5\nf 15650//4 15651//4 15654//4\nf 15651//3 15652//3 15655//3\nf 15653//6 15656//6 15649//6\nf 15657//1 15660//1 15658//1\nf 15661//2 15662//2 15664//2\nf 15657//5 15658//5 15661//5\nf 15658//4 15659//4 15662//4\nf 15659//3 15660//3 15663//3\nf 15661//6 15664//6 15657//6\nf 15665//1 15668//1 15666//1\nf 15669//2 15670//2 15672//2\nf 15665//5 15666//5 15669//5\nf 15666//4 15667//4 15670//4\nf 15667//3 15668//3 15671//3\nf 15669//6 15672//6 15665//6\nf 15673//1 15676//1 15674//1\nf 15677//2 15678//2 15680//2\nf 15673//5 15674//5 15677//5\nf 15674//4 15675//4 15678//4\nf 15675//3 15676//3 15679//3\nf 15677//6 15680//6 15673//6\nf 15682//1 15681//1 15683//1\nf 15688//2 15685//2 15687//2\nf 15681//5 15682//5 15685//5\nf 15686//4 15682//4 15687//4\nf 15683//3 15684//3 15687//3\nf 15685//6 15688//6 15681//6\nf 15690//1 15689//1 15691//1\nf 15696//2 15693//2 15695//2\nf 15689//5 15690//5 15693//5\nf 15694//4 15690//4 15695//4\nf 15691//3 15692//3 15695//3\nf 15689//6 15693//6 15692//6\nf 15697//1 15700//1 15698//1\nf 15704//2 15701//2 15703//2\nf 15697//5 15698//5 15701//5\nf 15702//4 15698//4 15703//4\nf 15699//3 15700//3 15703//3\nf 15697//6 15701//6 15700//6\nf 15705//1 15708//1 15706//1\nf 15712//2 15709//2 15711//2\nf 15705//5 15706//5 15709//5\nf 15710//4 15706//4 15711//4\nf 15707//3 15708//3 15711//3\nf 15709//6 15712//6 15705//6\nf 15713//1 15716//1 15714//1\nf 15720//2 15717//2 15719//2\nf 15713//5 15714//5 15717//5\nf 15718//4 15714//4 15719//4\nf 15715//3 15716//3 15719//3\nf 15713//6 15717//6 15716//6\nf 15721//1 15724//1 15722//1\nf 15725//2 15726//2 15728//2\nf 15721//5 15722//5 15725//5\nf 15722//4 15723//4 15726//4\nf 15723//3 15724//3 15727//3\nf 15725//6 15728//6 15721//6\nf 15729//1 15732//1 15730//1\nf 15733//2 15734//2 15736//2\nf 15729//5 15730//5 15733//5\nf 15730//4 15731//4 15734//4\nf 15731//3 15732//3 15735//3\nf 15733//6 15736//6 15729//6\nf 15737//1 15740//1 15738//1\nf 15741//2 15742//2 15744//2\nf 15737//5 15738//5 15741//5\nf 15738//4 15739//4 15742//4\nf 15739//3 15740//3 15743//3\nf 15741//6 15744//6 15737//6\nf 15745//1 15748//1 15746//1\nf 15749//2 15750//2 15752//2\nf 15745//5 15746//5 15749//5\nf 15746//4 15747//4 15750//4\nf 15747//3 15748//3 15751//3\nf 15749//6 15752//6 15745//6\nf 15753//1 15756//1 15754//1\nf 15757//2 15758//2 15760//2\nf 15753//5 15754//5 15757//5\nf 15754//4 15755//4 15758//4\nf 15755//3 15756//3 15759//3\nf 15757//6 15760//6 15753//6\nf 15762//1 15761//1 15763//1\nf 15768//2 15765//2 15767//2\nf 15761//5 15762//5 15765//5\nf 15766//4 15762//4 15767//4\nf 15763//3 15764//3 15767//3\nf 15765//6 15768//6 15761//6\nf 15770//1 15769//1 15771//1\nf 15776//2 15773//2 15775//2\nf 15769//5 15770//5 15773//5\nf 15774//4 15770//4 15775//4\nf 15771//3 15772//3 15775//3\nf 15769//6 15773//6 15772//6\nf 15777//1 15780//1 15778//1\nf 15784//2 15781//2 15783//2\nf 15777//5 15778//5 15781//5\nf 15782//4 15778//4 15783//4\nf 15779//3 15780//3 15783//3\nf 15777//6 15781//6 15780//6\nf 15785//1 15788//1 15786//1\nf 15792//2 15789//2 15791//2\nf 15785//5 15786//5 15789//5\nf 15790//4 15786//4 15791//4\nf 15787//3 15788//3 15791//3\nf 15789//6 15792//6 15785//6\nf 15793//1 15796//1 15794//1\nf 15800//2 15797//2 15799//2\nf 15793//5 15794//5 15797//5\nf 15798//4 15794//4 15799//4\nf 15795//3 15796//3 15799//3\nf 15793//6 15797//6 15796//6\nf 15801//1 15804//1 15802//1\nf 15805//2 15806//2 15808//2\nf 15801//5 15802//5 15805//5\nf 15802//4 15803//4 15806//4\nf 15803//3 15804//3 15807//3\nf 15805//6 15808//6 15801//6\nf 15809//1 15812//1 15810//1\nf 15813//2 15814//2 15816//2\nf 15809//5 15810//5 15813//5\nf 15810//4 15811//4 15814//4\nf 15811//3 15812//3 15815//3\nf 15813//6 15816//6 15809//6\nf 15817//1 15820//1 15818//1\nf 15821//2 15822//2 15824//2\nf 15817//5 15818//5 15821//5\nf 15818//4 15819//4 15822//4\nf 15819//3 15820//3 15823//3\nf 15821//6 15824//6 15817//6\nf 15825//1 15828//1 15826//1\nf 15829//2 15830//2 15832//2\nf 15825//5 15826//5 15829//5\nf 15826//4 15827//4 15830//4\nf 15827//3 15828//3 15831//3\nf 15829//6 15832//6 15825//6\nf 15833//1 15836//1 15834//1\nf 15837//2 15838//2 15840//2\nf 15833//5 15834//5 15837//5\nf 15834//4 15835//4 15838//4\nf 15835//3 15836//3 15839//3\nf 15837//6 15840//6 15833//6\nf 15842//1 15841//1 15843//1\nf 15848//2 15845//2 15847//2\nf 15841//5 15842//5 15845//5\nf 15846//4 15842//4 15847//4\nf 15843//3 15844//3 15847//3\nf 15845//6 15848//6 15841//6\nf 15850//1 15849//1 15851//1\nf 15856//2 15853//2 15855//2\nf 15849//5 15850//5 15853//5\nf 15854//4 15850//4 15855//4\nf 15851//3 15852//3 15855//3\nf 15849//6 15853//6 15852//6\nf 15857//1 15860//1 15858//1\nf 15864//2 15861//2 15863//2\nf 15857//5 15858//5 15861//5\nf 15862//4 15858//4 15863//4\nf 15859//3 15860//3 15863//3\nf 15857//6 15861//6 15860//6\nf 15865//1 15868//1 15866//1\nf 15872//2 15869//2 15871//2\nf 15865//5 15866//5 15869//5\nf 15870//4 15866//4 15871//4\nf 15867//3 15868//3 15871//3\nf 15869//6 15872//6 15865//6\nf 15873//1 15876//1 15874//1\nf 15880//2 15877//2 15879//2\nf 15873//5 15874//5 15877//5\nf 15878//4 15874//4 15879//4\nf 15875//3 15876//3 15879//3\nf 15873//6 15877//6 15876//6\nf 15881//1 15884//1 15882//1\nf 15885//2 15886//2 15888//2\nf 15881//5 15882//5 15885//5\nf 15882//4 15883//4 15886//4\nf 15883//3 15884//3 15887//3\nf 15885//6 15888//6 15881//6\nf 15889//1 15892//1 15890//1\nf 15893//2 15894//2 15896//2\nf 15889//5 15890//5 15893//5\nf 15890//4 15891//4 15894//4\nf 15891//3 15892//3 15895//3\nf 15893//6 15896//6 15889//6\nf 15897//1 15900//1 15898//1\nf 15901//2 15902//2 15904//2\nf 15897//5 15898//5 15901//5\nf 15898//4 15899//4 15902//4\nf 15899//3 15900//3 15903//3\nf 15901//6 15904//6 15897//6\nf 15905//1 15908//1 15906//1\nf 15909//2 15910//2 15912//2\nf 15905//5 15906//5 15909//5\nf 15906//4 15907//4 15910//4\nf 15907//3 15908//3 15911//3\nf 15909//6 15912//6 15905//6\nf 15913//1 15916//1 15914//1\nf 15917//2 15918//2 15920//2\nf 15913//5 15914//5 15917//5\nf 15914//4 15915//4 15918//4\nf 15915//3 15916//3 15919//3\nf 15917//6 15920//6 15913//6\nf 15922//1 15921//1 15923//1\nf 15928//2 15925//2 15927//2\nf 15921//5 15922//5 15925//5\nf 15926//4 15922//4 15927//4\nf 15923//3 15924//3 15927//3\nf 15925//6 15928//6 15921//6\nf 15930//1 15929//1 15931//1\nf 15936//2 15933//2 15935//2\nf 15929//5 15930//5 15933//5\nf 15934//4 15930//4 15935//4\nf 15931//3 15932//3 15935//3\nf 15929//6 15933//6 15932//6\nf 15937//1 15940//1 15938//1\nf 15944//2 15941//2 15943//2\nf 15937//5 15938//5 15941//5\nf 15942//4 15938//4 15943//4\nf 15939//3 15940//3 15943//3\nf 15937//6 15941//6 15940//6\nf 15945//1 15948//1 15946//1\nf 15952//2 15949//2 15951//2\nf 15945//5 15946//5 15949//5\nf 15950//4 15946//4 15951//4\nf 15947//3 15948//3 15951//3\nf 15949//6 15952//6 15945//6\nf 15953//1 15956//1 15954//1\nf 15960//2 15957//2 15959//2\nf 15953//5 15954//5 15957//5\nf 15958//4 15954//4 15959//4\nf 15955//3 15956//3 15959//3\nf 15953//6 15957//6 15956//6\nf 15961//1 15964//1 15962//1\nf 15965//2 15966//2 15968//2\nf 15961//5 15962//5 15965//5\nf 15962//4 15963//4 15966//4\nf 15963//3 15964//3 15967//3\nf 15965//6 15968//6 15961//6\nf 15969//1 15972//1 15970//1\nf 15973//2 15974//2 15976//2\nf 15969//5 15970//5 15973//5\nf 15970//4 15971//4 15974//4\nf 15971//3 15972//3 15975//3\nf 15973//6 15976//6 15969//6\nf 15977//1 15980//1 15978//1\nf 15981//2 15982//2 15984//2\nf 15977//5 15978//5 15981//5\nf 15978//4 15979//4 15982//4\nf 15979//3 15980//3 15983//3\nf 15981//6 15984//6 15977//6\nf 15985//1 15988//1 15986//1\nf 15989//2 15990//2 15992//2\nf 15985//5 15986//5 15989//5\nf 15986//4 15987//4 15990//4\nf 15987//3 15988//3 15991//3\nf 15989//6 15992//6 15985//6\nf 15993//1 15996//1 15994//1\nf 15997//2 15998//2 16000//2\nf 15993//5 15994//5 15997//5\nf 15994//4 15995//4 15998//4\nf 15995//3 15996//3 15999//3\nf 15997//6 16000//6 15993//6\n"
  },
  {
    "path": "obj/grid.obj",
    "content": "# Blender v2.72 (sub 0) OBJ File: ''\n# www.blender.org\no Grid\nv 8.879965 0.232593 -10.331104\nv 7.633565 0.286623 -10.448493\nv 5.616924 0.272599 -9.788268\nv 4.011429 0.342873 -8.934740\nv 2.245481 0.414213 -8.627546\nv -0.110348 0.793483 -9.488501\nv -2.389660 0.460206 -9.664577\nv -5.151165 -0.119866 -9.512475\nv -7.258804 -0.626173 -9.442591\nv -8.300592 -0.628345 -9.484616\nv 9.340451 0.474812 -8.598719\nv 7.938484 0.341501 -8.486372\nv 5.906322 0.181590 -8.097298\nv 3.624341 0.221707 -7.544794\nv 1.486475 0.790422 -8.033167\nv -0.678746 0.476566 -8.488295\nv -3.000516 0.588176 -8.548774\nv -5.202332 -0.130308 -8.637259\nv -7.298379 -0.535651 -8.276630\nv -8.717083 -0.486611 -8.199297\nv 9.675587 0.394242 -5.722599\nv 8.512507 0.562366 -5.382900\nv 6.039755 0.774244 -5.488337\nv 2.854863 0.235457 -5.592362\nv 0.662994 0.283459 -6.041487\nv -1.266669 0.073149 -6.175837\nv -2.987508 -0.144206 -6.306033\nv -5.099494 -0.442396 -5.975354\nv -7.483592 -0.512508 -6.041816\nv -8.893818 -0.278132 -5.660740\nv 9.479836 0.110907 -3.132507\nv 8.210496 0.301570 -3.398895\nv 5.384735 0.984241 -3.255593\nv 2.371464 0.340148 -2.934479\nv 0.404907 -0.349581 -3.647141\nv -1.102804 -0.271755 -3.625811\nv -2.967355 0.080902 -3.513140\nv -4.568417 -0.142047 -3.588563\nv -7.640546 -0.156078 -3.879945\nv -9.515914 0.027592 -3.542724\nv 8.850996 -0.372156 -1.107010\nv 7.946621 0.172077 -1.400406\nv 4.728510 0.649720 -0.976593\nv 1.972496 0.018548 -0.698100\nv 0.320419 -0.442981 -0.804558\nv -1.402593 -0.777932 -1.281072\nv -2.937999 -0.492534 -1.077407\nv -4.657229 -0.487902 -0.963962\nv -7.666102 -0.165774 -1.433060\nv -9.608099 -0.021331 -1.459952\nv 8.898974 -0.832874 1.035220\nv 7.342916 -0.405251 1.223837\nv 4.820632 0.386918 1.077547\nv 1.963285 0.389350 1.403004\nv 0.277734 -0.627953 1.574542\nv -1.074269 -0.702581 1.275066\nv -2.659978 -0.347119 1.564416\nv -5.237530 -0.662638 1.626532\nv -8.003612 -0.443682 1.576177\nv -9.506745 -0.282749 1.593640\nv 8.609321 -0.290464 3.075547\nv 7.112012 -0.181037 3.450714\nv 4.760516 0.269344 3.333912\nv 2.182056 0.486465 3.525782\nv 0.839353 -0.016312 3.870497\nv -0.524878 -0.230290 3.875580\nv -2.898852 -0.492931 4.354976\nv -5.189868 -0.439152 4.523329\nv -7.743896 -0.414150 4.282265\nv -9.837560 0.037981 4.646285\nv 9.059677 0.670504 5.252854\nv 7.217594 0.481257 5.678931\nv 4.494983 0.295756 5.856079\nv 3.046876 0.367706 5.762499\nv 1.448667 -0.008967 5.646611\nv 0.140321 -0.173599 6.345447\nv -2.750667 -0.212699 6.542095\nv -5.453431 -0.638916 6.117112\nv -7.590033 -0.812049 6.198724\nv -9.450613 -0.206556 6.616438\nv 9.016369 0.542242 7.911300\nv 7.294821 0.538626 8.412653\nv 4.972964 -0.055987 8.560163\nv 3.539990 0.406729 8.205370\nv 2.163369 0.413900 7.615253\nv 0.159556 -0.004493 7.891093\nv -2.709493 0.176643 7.663254\nv -5.615275 -0.600200 7.264638\nv -8.026692 -0.415561 7.416830\nv -9.408880 0.019888 8.209227\nv 8.688843 0.300092 9.719303\nv 7.720376 -0.109121 10.431890\nv 5.139550 0.105586 10.483572\nv 3.766435 -0.142480 9.967603\nv 2.004329 0.202941 9.217229\nv -0.130603 0.015157 9.157329\nv -2.815223 0.152400 8.730521\nv -5.452823 -0.111052 8.396418\nv -7.646044 0.028450 9.036012\nv -9.492038 0.299679 9.003201\nv 9.117451 0.314150 -9.654844\nv 8.421214 0.153697 -10.374987\nv 7.732100 0.181950 -9.905031\nv 8.761627 0.422681 -8.732490\nv 6.447129 0.209855 -10.241861\nv 5.617608 0.214832 -9.264999\nv 6.837118 0.286471 -8.252503\nv 4.745542 0.278283 -9.373945\nv 3.952536 0.300980 -8.301437\nv 4.757335 0.100463 -7.903703\nv 3.466834 0.366016 -8.613586\nv 2.219784 0.687092 -8.426300\nv 2.496381 0.647645 -7.739375\nv 1.083408 0.485004 -9.070143\nv -0.270794 0.693971 -9.141976\nv 0.398110 0.566939 -8.300062\nv -1.269037 0.630960 -9.355869\nv -2.685272 0.840642 -9.457344\nv -2.080234 0.712647 -8.517054\nv -3.655518 0.012851 -9.577057\nv -5.251355 -0.096023 -9.278207\nv -4.132231 0.358174 -8.665478\nv -6.365740 -0.334978 -9.322661\nv -7.265803 -0.643744 -9.045629\nv -6.208994 -0.473987 -8.375257\nv -7.916917 -0.618640 -9.465706\nv -8.491599 -0.486294 -8.927600\nv -8.192747 -0.509197 -8.299707\nv 9.583155 0.379669 -7.463479\nv 8.145863 0.631822 -6.881768\nv 9.601732 0.621850 -5.434338\nv 6.049548 0.331416 -6.894753\nv 7.474905 0.579775 -5.400359\nv 3.339668 0.333084 -6.614825\nv 4.518146 0.605892 -5.523493\nv 1.061986 0.652824 -6.974499\nv 1.651218 0.394427 -5.972233\nv -0.917113 0.275073 -7.542918\nv -0.355381 0.122156 -6.080111\nv -3.246867 0.251025 -7.545459\nv -2.403989 -0.026098 -6.440166\nv -5.179280 -0.404415 -7.426443\nv -3.983314 -0.466922 -6.145879\nv -7.381513 -0.593416 -7.215016\nv -6.281518 -0.599466 -6.072849\nv -8.795112 -0.525610 -6.870132\nv -8.510014 -0.388940 -5.791679\nv 9.505285 0.426636 -4.313080\nv 8.519704 0.320762 -4.403426\nv 9.000754 0.187304 -3.213354\nv 5.844044 0.851766 -4.409309\nv 6.897372 0.814668 -3.481080\nv 2.610361 0.189150 -4.222679\nv 3.744831 0.734881 -2.981835\nv 0.516751 -0.075882 -4.877954\nv 1.213980 -0.027757 -2.989206\nv -1.141095 -0.020080 -4.929192\nv -0.217070 -0.426454 -3.776927\nv -2.877059 -0.080870 -4.734282\nv -2.152453 -0.224569 -3.458263\nv -4.519765 -0.137619 -4.754902\nv -3.496533 0.039811 -3.605559\nv -7.658287 -0.415622 -5.166929\nv -6.321585 -0.279623 -3.820489\nv -8.959643 -0.123188 -4.754409\nv -8.631561 0.006109 -3.542044\nv 9.086120 -0.291505 -2.112625\nv 7.955619 0.347133 -2.394366\nv 8.400374 -0.210919 -1.248398\nv 4.771887 0.840396 -2.232405\nv 6.446753 0.619197 -1.155312\nv 1.854705 0.106587 -1.704054\nv 3.083505 0.440838 -1.010107\nv 0.239363 -0.293984 -2.442630\nv 1.004024 -0.319558 -0.737007\nv -1.266673 -0.448485 -2.350718\nv -0.545356 -0.671613 -1.275375\nv -2.978799 -0.234481 -2.373792\nv -2.204526 -0.742510 -0.981234\nv -4.482751 -0.232312 -2.393970\nv -3.704557 -0.710633 -1.089571\nv -7.497066 -0.056779 -2.526806\nv -6.105844 -0.299598 -1.236321\nv -9.819729 -0.032621 -2.457178\nv -8.720958 -0.149955 -1.483238\nv 8.764578 -0.791697 -0.157548\nv 7.756145 -0.153167 -0.111543\nv 8.170788 -0.700675 1.094893\nv 4.607755 0.584722 0.129611\nv 6.075467 0.031116 0.944339\nv 1.931501 0.124650 0.335859\nv 3.355260 0.471831 1.246102\nv 0.390805 -0.892065 0.561602\nv 1.075062 -0.009541 1.673952\nv -1.231133 -0.936339 -0.062821\nv -0.526063 -0.757560 1.298118\nv -2.640486 -0.409889 0.377950\nv -1.473476 -0.607406 1.238266\nv -4.956782 -0.598498 0.152518\nv -3.810656 -0.525845 1.625854\nv -8.031309 -0.269045 0.086788\nv -6.527967 -0.580813 1.573749\nv -9.439052 -0.180856 0.056086\nv -8.886126 -0.213399 1.751742\nv 8.843424 -0.636294 2.058629\nv 7.097735 -0.471551 2.386118\nv 7.752596 -0.308213 3.306520\nv 4.693306 0.389043 2.303075\nv 6.072005 -0.026998 3.310804\nv 1.815272 0.516144 2.647949\nv 3.299663 0.601533 3.484962\nv 0.350622 -0.266585 2.630998\nv 1.401145 0.160498 3.688114\nv -0.785876 -0.376299 2.442988\nv 0.114599 -0.170559 4.004869\nv -2.875076 -0.260777 2.905538\nv -1.599685 -0.342152 4.090714\nv -5.066237 -0.521734 3.172648\nv -3.956202 -0.454255 4.431493\nv -8.085638 -0.453314 2.875710\nv -6.621538 -0.482183 4.454926\nv -9.940704 0.120590 3.137635\nv -8.983021 -0.173056 4.498940\nv 8.838345 0.297838 4.278247\nv 7.009015 0.017456 4.443756\nv 8.154228 0.635755 5.461774\nv 4.519763 0.176106 4.593347\nv 5.897959 0.469426 5.560750\nv 2.734350 0.676501 4.775013\nv 3.744888 0.228874 5.737422\nv 0.994819 0.012779 4.540521\nv 2.234560 0.067260 5.709876\nv -0.101250 -0.176797 5.152985\nv 0.950733 -0.240463 6.015045\nv -2.739297 -0.426802 5.582465\nv -1.452948 -0.058801 6.826356\nv -5.431028 -0.485273 5.636003\nv -4.003157 -0.322516 6.217006\nv -7.471565 -0.763591 5.452672\nv -6.457521 -0.981735 6.275138\nv -9.710379 -0.206686 5.752410\nv -8.686115 -0.369678 6.450339\nv 8.925484 0.675876 6.643477\nv 7.020201 0.668414 7.176059\nv 8.211950 0.566523 7.792388\nv 4.606681 0.199684 7.338657\nv 6.130586 0.132417 8.764125\nv 3.229834 0.298998 6.867308\nv 3.964768 0.259069 8.268139\nv 2.030123 0.256670 6.583712\nv 2.851613 0.508554 8.108104\nv 0.447949 0.000010 7.190108\nv 1.405599 -0.008272 7.471418\nv -2.728367 0.094145 7.240705\nv -1.249085 0.265946 7.945167\nv -5.277183 -0.827297 6.673686\nv -4.500725 -0.336531 7.338138\nv -7.837008 -0.585490 6.629360\nv -6.862638 -0.667502 7.213399\nv -9.435836 -0.057634 7.430991\nv -8.789086 -0.180623 8.032653\nv 8.897786 0.588063 8.838524\nv 7.630926 0.109084 9.526480\nv 8.594129 -0.047610 10.246283\nv 4.906359 -0.013916 9.689371\nv 6.269724 -0.096328 10.278019\nv 3.687265 0.155293 9.135860\nv 4.432363 0.077753 10.320164\nv 2.258393 0.154860 8.534935\nv 2.885377 0.290464 9.444759\nv 0.033834 -0.117514 8.374592\nv 0.936737 0.098005 9.304058\nv -2.752801 0.099166 8.007290\nv -1.480428 0.054802 8.999449\nv -5.616887 -0.290372 7.587935\nv -4.283344 -0.066665 8.505287\nv -8.048125 -0.128260 8.295520\nv -6.526865 -0.352787 8.538887\nv -9.538947 0.152516 8.735493\nv -8.725740 0.360418 9.176398\nv 8.526941 0.093310 -9.899101\nv 6.487325 0.236895 -9.556245\nv 4.862828 0.132835 -8.866712\nv 3.161015 0.558972 -8.170341\nv 0.960994 0.476691 -8.749201\nv -1.507729 0.951091 -9.156160\nv -4.024747 0.267864 -9.440552\nv -6.223061 -0.486917 -8.928092\nv -8.087576 -0.490334 -8.899831\nv 9.174544 0.496678 -7.165772\nv 7.091569 0.396743 -6.891863\nv 4.872369 0.344899 -6.771818\nv 2.089750 0.672469 -6.885360\nv 0.069790 0.519491 -7.275319\nv -2.340835 0.273082 -7.766013\nv -4.172155 0.011365 -7.505716\nv -6.339435 -0.580606 -7.508380\nv -8.216967 -0.636596 -7.130292\nv 9.318130 0.530824 -4.517257\nv 7.253163 0.618259 -4.311430\nv 4.150315 0.642440 -4.353089\nv 1.454438 -0.047315 -4.464962\nv -0.268784 0.020650 -4.912455\nv -2.142357 -0.139705 -4.687288\nv -3.652499 -0.222353 -4.723812\nv -6.009716 -0.516128 -4.821261\nv -8.684913 -0.131969 -4.797189\nv 8.619853 -0.108361 -2.136476\nv 6.519141 0.919442 -2.214986\nv 3.059478 0.490378 -2.064300\nv 0.891499 -0.128153 -2.010036\nv -0.290777 -0.551036 -2.476944\nv -2.171894 -0.535939 -2.329142\nv -3.516272 -0.323277 -2.445678\nv -6.202051 -0.039835 -2.693933\nv -8.553806 -0.068473 -2.414526\nv 8.184740 -0.618443 -0.091996\nv 6.184424 0.256056 -0.224547\nv 3.187015 0.365229 0.287930\nv 1.152444 -0.361355 0.556827\nv -0.435325 -0.920541 -0.024512\nv -1.759869 -0.775389 0.084095\nv -3.673807 -0.533858 0.246537\nv -6.333477 -0.395801 0.281259\nv -8.911993 -0.310064 0.107894\nv 7.994563 -0.608128 2.296761\nv 5.920854 0.081376 2.158221\nv 3.200619 0.627987 2.630582\nv 1.094331 0.241182 2.634639\nv -0.267840 -0.283799 2.554545\nv -1.642504 -0.388864 2.657831\nv -3.799210 -0.463836 3.016561\nv -6.561853 -0.422474 3.042288\nv -9.157991 -0.024132 3.054485\nv 7.841386 0.219666 4.417421\nv 5.932347 -0.051177 4.512118\nv 3.425038 0.365732 4.540689\nv 1.643572 0.176001 4.763402\nv 0.590521 -0.145148 4.893995\nv -1.506352 -0.269272 5.500791\nv -3.875130 -0.464623 5.549547\nv -6.534510 -0.780377 5.598875\nv -8.977213 -0.455255 5.543236\nv 7.975573 0.672087 6.671358\nv 5.883434 0.282463 7.342436\nv 3.876360 0.311030 6.967852\nv 2.646882 0.114798 6.702341\nv 1.430300 0.003352 6.760807\nv -1.015362 0.134757 7.430807\nv -4.318465 -0.361552 6.956265\nv -6.430381 -0.923584 6.650175\nv -8.759725 -0.182080 7.045850\nv 8.553310 0.325964 9.120401\nv 6.074759 -0.025847 9.531742\nv 4.110269 0.191475 9.417331\nv 2.995122 0.538067 9.000423\nv 1.106971 -0.261399 8.315781\nv -1.407241 0.072968 8.356163\nv -4.386002 -0.156068 7.733332\nv -6.931255 -0.575032 7.780780\nv -8.871105 0.113321 8.820444\nv 8.960510 0.243280 -10.093969\nv 8.103636 0.197374 -10.437165\nv 7.836104 0.188016 -9.281155\nv 9.086601 0.483555 -8.716221\nv 5.977623 0.191363 -10.037779\nv 5.759486 0.238073 -8.698282\nv 7.376492 0.355868 -8.336744\nv 4.306951 0.332196 -9.151376\nv 3.810977 0.247893 -7.893587\nv 5.314943 0.150959 -8.059202\nv 2.917732 0.384530 -8.591416\nv 1.870875 0.756819 -8.294962\nv 3.029656 0.451801 -7.563682\nv 0.517393 0.648914 -9.429609\nv -0.528986 0.582701 -8.850804\nv 0.894434 0.699069 -8.134213\nv -1.864376 0.571206 -9.527348\nv -2.916912 0.753385 -9.077444\nv -1.427257 0.601440 -8.454409\nv -4.419478 -0.112220 -9.523623\nv -5.210426 -0.125882 -9.024603\nv -3.530617 0.514604 -8.587507\nv -6.866922 -0.497317 -9.340803\nv -7.286261 -0.620173 -8.712837\nv -5.733319 -0.410742 -8.513526\nv -8.192135 -0.633057 -9.476166\nv -8.648308 -0.460517 -8.588051\nv -7.776401 -0.573262 -8.290733\nv 9.429278 0.425041 -8.067612\nv 8.370857 0.651543 -6.096613\nv 9.715671 0.487114 -5.571067\nv 6.056170 0.582300 -6.150394\nv 7.979697 0.521061 -5.381085\nv 3.155646 0.371386 -6.128111\nv 5.305047 0.754154 -5.527558\nv 0.839745 0.463059 -6.423431\nv 2.202590 0.275729 -5.792978\nv -1.113494 0.155288 -6.911109\nv 0.125063 0.159508 -6.074172\nv -3.232813 0.045841 -7.018920\nv -1.829451 0.040345 -6.316542\nv -5.207232 -0.559829 -6.639058\nv -3.382925 -0.285100 -6.213305\nv -7.441662 -0.610563 -6.651544\nv -5.669815 -0.552904 -6.017069\nv -8.897208 -0.446958 -6.201432\nv -8.041761 -0.541983 -5.974583\nv 9.531301 0.411635 -4.947298\nv 8.375968 0.278543 -3.947878\nv 9.314173 0.163494 -3.103838\nv 5.642157 0.898348 -3.815279\nv 7.616493 0.496717 -3.456256\nv 2.567634 0.299597 -3.517787\nv 4.585984 0.877416 -3.045871\nv 0.471642 -0.294048 -4.223738\nv 1.810768 0.127656 -2.833553\nv -1.059296 -0.212173 -4.342169\nv 0.118018 -0.416387 -3.820194\nv -2.885064 0.101352 -4.076440\nv -1.600876 -0.260035 -3.493695\nv -4.454076 -0.096883 -4.083624\nv -3.228079 0.110332 -3.594925\nv -7.656713 -0.275811 -4.563587\nv -5.431267 -0.225446 -3.708686\nv -9.232124 -0.096689 -4.191921\nv -8.183426 -0.082190 -3.706113\nv 9.300777 -0.194255 -2.626613\nv 7.928933 0.280817 -1.859362\nv 8.613757 -0.324274 -1.107937\nv 4.755939 0.635860 -1.586905\nv 7.323443 0.376924 -1.235570\nv 1.889986 0.021375 -1.160565\nv 3.873765 0.541730 -1.018054\nv 0.262159 -0.326544 -1.660162\nv 1.462962 -0.204127 -0.648864\nv -1.389340 -0.632128 -1.750738\nv -0.149648 -0.511305 -1.007705\nv -2.964900 -0.394843 -1.777894\nv -1.850086 -0.737069 -1.154127\nv -4.486687 -0.362649 -1.674809\nv -3.336085 -0.554968 -1.092114\nv -7.517133 -0.122699 -1.998114\nv -5.382713 -0.346041 -1.057134\nv -9.758608 -0.056285 -2.032497\nv -8.240920 -0.141585 -1.462238\nv 8.758558 -0.627363 -0.648141\nv 7.605330 -0.314630 0.677192\nv 8.593185 -0.810877 1.060744\nv 4.771401 0.495489 0.522132\nv 6.734902 -0.167473 1.135006\nv 1.944755 0.232205 0.794735\nv 4.107678 0.442482 1.175328\nv 0.385392 -0.783332 1.143084\nv 1.491536 0.234216 1.565482\nv -1.179777 -0.878456 0.673867\nv -0.140281 -0.717138 1.405165\nv -2.631074 -0.391453 0.975402\nv -1.222379 -0.675854 1.232213\nv -5.073558 -0.632873 0.811333\nv -3.258495 -0.349405 1.627180\nv -8.019865 -0.376574 0.876258\nv -5.928399 -0.614556 1.609007\nv -9.410400 -0.323283 0.847197\nv -8.511416 -0.312258 1.711180\nv 8.851089 -0.774435 1.594553\nv 7.090859 -0.342868 2.988188\nv 8.248158 -0.311407 3.105260\nv 4.707357 0.391572 2.819027\nv 6.614848 -0.114525 3.384743\nv 1.927883 0.427254 3.083245\nv 3.966074 0.446150 3.385694\nv 0.592830 -0.104105 3.341765\nv 1.725811 0.308230 3.567044\nv -0.647312 -0.340044 3.182466\nv 0.432878 -0.084386 3.973006\nv -2.863250 -0.424280 3.669114\nv -1.055692 -0.311829 3.987430\nv -5.059299 -0.489710 3.808650\nv -3.481780 -0.558070 4.432865\nv -7.976755 -0.372957 3.601610\nv -5.987663 -0.479246 4.499323\nv -9.974225 0.122755 3.937255\nv -8.334585 -0.315193 4.306269\nv 8.642687 -0.002356 3.739300\nv 7.105889 0.224052 5.066498\nv 8.685566 0.670185 5.322917\nv 4.459531 0.246050 5.222252\nv 6.606560 0.454704 5.570520\nv 2.936275 0.477197 5.281944\nv 4.040083 0.141342 5.814937\nv 1.134603 -0.044338 5.015344\nv 2.618144 0.198045 5.773765\nv 0.008178 -0.228372 5.745322\nv 1.156707 -0.170327 5.793102\nv -2.679574 -0.282901 6.116271\nv -0.636449 -0.108648 6.622477\nv -5.519502 -0.528940 5.871885\nv -3.348158 -0.273569 6.391434\nv -7.476816 -0.843473 5.907641\nv -6.048082 -0.881875 6.203674\nv -9.574640 -0.236269 6.200035\nv -8.126581 -0.520203 6.259810\nv 8.969551 0.717406 5.925764\nv 7.055148 0.627935 7.934265\nv 8.761578 0.511237 7.827945\nv 4.840900 0.034070 7.933162\nv 6.788626 0.419595 8.656687\nv 3.387277 0.358942 7.499603\nv 4.441141 0.104247 8.368929\nv 2.129778 0.426300 7.092994\nv 3.278624 0.433763 8.200465\nv 0.391350 0.023334 7.603589\nv 1.905348 0.217023 7.396432\nv -2.708628 0.211230 7.581925\nv -0.491147 0.124387 7.955210\nv -5.390505 -0.729341 6.988329\nv -3.605411 -0.047122 7.501418\nv -7.926597 -0.527203 7.050630\nv -6.174407 -0.651589 7.236698\nv -9.425171 0.017485 7.806359\nv -8.419076 -0.274658 7.720106\nv 8.990606 0.594718 8.367464\nv 7.679361 -0.038634 10.125751\nv 8.673564 0.138518 9.981859\nv 5.022359 0.054719 10.176468\nv 6.993351 -0.087118 10.360399\nv 3.737098 -0.095697 9.645645\nv 4.737635 0.165580 10.470469\nv 2.124852 0.164737 8.951693\nv 3.301278 0.042206 9.740079\nv -0.047946 -0.031563 8.881746\nv 1.499516 0.118962 9.265676\nv -2.802572 0.170798 8.483580\nv -0.751012 -0.046532 9.124113\nv -5.494470 -0.174981 8.058173\nv -3.501372 0.000494 8.614733\nv -7.779610 -0.019088 8.814313\nv -5.926965 -0.261784 8.444091\nv -9.558741 0.276987 8.900257\nv -8.138910 0.257172 9.185382\nv 9.268663 0.435225 -9.122818\nv 8.678038 0.178507 -10.340837\nv 7.639635 0.266378 -10.304392\nv 8.389298 0.359361 -8.612050\nv 7.041907 0.291250 -10.372675\nv 5.574109 0.269841 -9.631380\nv 6.418237 0.173951 -8.174881\nv 5.222114 0.277524 -9.583701\nv 4.026980 0.357524 -8.673763\nv 4.229421 0.116776 -7.709784\nv 3.802329 0.348233 -8.730732\nv 2.279363 0.535797 -8.515624\nv 2.033695 0.758461 -7.894245\nv 1.619114 0.439515 -8.755436\nv -0.123314 0.764001 -9.397694\nv -0.058871 0.455433 -8.494049\nv -0.705734 0.753441 -9.339599\nv -2.453066 0.692749 -9.614952\nv -2.539971 0.692583 -8.566402\nv -2.940723 0.241896 -9.654083\nv -5.210971 -0.076102 -9.423717\nv -4.676547 0.181703 -8.709131\nv -5.798524 -0.193247 -9.420237\nv -7.299831 -0.659579 -9.298651\nv -6.721063 -0.488686 -8.287416\nv -7.571513 -0.630534 -9.509102\nv -8.363607 -0.569941 -9.283292\nv -8.529346 -0.474352 -8.298344\nv 9.700670 0.371359 -6.659094\nv 7.999674 0.511407 -7.658834\nv 9.104795 0.663812 -5.378376\nv 6.022575 0.172613 -7.508578\nv 6.803114 0.696490 -5.431515\nv 3.477344 0.258011 -7.110344\nv 3.673246 0.431616 -5.495131\nv 1.223056 0.803886 -7.577704\nv 1.102954 0.401082 -6.016246\nv -0.788761 0.383985 -8.053429\nv -0.785923 0.097105 -6.067462\nv -3.079323 0.436528 -8.033833\nv -2.775310 -0.075613 -6.417708\nv -5.235115 -0.206907 -8.114525\nv -4.561932 -0.458130 -6.043909\nv -7.317028 -0.506172 -7.749417\nv -6.863536 -0.534284 -6.047226\nv -8.704224 -0.535366 -7.598727\nv -8.782506 -0.299870 -5.675477\nv 9.556816 0.379739 -3.691363\nv 8.574965 0.458658 -4.828136\nv 8.645976 0.196397 -3.337842\nv 5.967958 0.843385 -4.954060\nv 6.128734 1.039249 -3.441299\nv 2.645862 0.130870 -4.963818\nv 2.955455 0.583977 -3.022004\nv 0.564893 0.115327 -5.575173\nv 0.727907 -0.221416 -3.328907\nv -1.247503 0.071876 -5.472183\nv -0.630958 -0.379069 -3.733938\nv -2.856885 -0.222392 -5.498373\nv -2.672503 -0.042948 -3.474906\nv -4.798272 -0.240063 -5.398500\nv -3.894149 -0.057855 -3.528475\nv -7.608773 -0.465657 -5.553569\nv -7.044996 -0.212589 -3.900850\nv -8.853977 -0.130225 -5.217983\nv -9.138515 0.034964 -3.528299\nv 8.943914 -0.279296 -1.590470\nv 8.046693 0.333851 -2.920732\nv 8.254293 -0.005279 -1.433548\nv 5.024911 1.040739 -2.793084\nv 5.563734 0.725671 -1.057003\nv 2.068349 0.224836 -2.321725\nv 2.413914 0.261174 -0.855382\nv 0.303575 -0.307809 -3.093081\nv 0.689827 -0.365923 -0.738554\nv -1.170328 -0.292986 -2.967809\nv -0.909632 -0.815013 -1.374967\nv -3.007467 -0.082327 -2.941382\nv -2.536148 -0.614450 -0.984404\nv -4.574577 -0.158150 -3.098880\nv -4.030085 -0.696872 -0.991806\nv -7.561399 -0.049830 -3.214481\nv -6.920213 -0.223643 -1.363568\nv -9.724411 0.067170 -2.918086\nv -9.214157 -0.086805 -1.490632\nv 8.895033 -0.824555 0.419556\nv 7.885631 0.023448 -0.869458\nv 7.775033 -0.588964 1.194371\nv 4.598241 0.671388 -0.368248\nv 5.448917 0.217133 0.928228\nv 2.009728 0.066164 -0.189766\nv 2.595668 0.488763 1.303751\nv 0.373397 -0.703092 -0.125318\nv 0.676162 -0.347268 1.695062\nv -1.330086 -0.920343 -0.776595\nv -0.840761 -0.756490 1.248731\nv -2.775279 -0.463800 -0.320294\nv -2.000777 -0.500874 1.395452\nv -4.835766 -0.576697 -0.377025\nv -4.477129 -0.661912 1.622043\nv -7.907491 -0.220074 -0.751005\nv -7.246103 -0.526070 1.559499\nv -9.494781 -0.058771 -0.760130\nv -9.245705 -0.245739 1.646993\nv 8.730324 -0.489199 2.497995\nv 7.145186 -0.477063 1.736656\nv 7.407265 -0.272579 3.488739\nv 4.742970 0.346828 1.731938\nv 5.497955 0.104282 3.306992\nv 1.870116 0.528158 2.049428\nv 2.692638 0.638983 3.533270\nv 0.220316 -0.474018 2.051112\nv 1.138005 0.058002 3.787965\nv -0.934281 -0.477194 1.804490\nv -0.126480 -0.190678 3.877611\nv -2.764021 -0.256680 2.198432\nv -2.241058 -0.377340 4.263098\nv -5.231624 -0.616193 2.468626\nv -4.488725 -0.401190 4.476067\nv -8.048996 -0.493540 2.201543\nv -7.187708 -0.453485 4.397677\nv -9.721368 -0.057258 2.337933\nv -9.541050 -0.040791 4.642917\nv 9.028991 0.515260 4.720512\nv 7.035285 -0.109699 3.927849\nv 7.705765 0.583530 5.674359\nv 4.689775 0.147665 3.906747\nv 5.166501 0.446415 5.742085\nv 2.495683 0.683665 4.130317\nv 3.408031 0.407805 5.734286\nv 0.992748 0.034322 4.196321\nv 1.815834 0.044882 5.640968\nv -0.284463 -0.132570 4.530482\nv 0.651391 -0.205147 6.162349\nv -2.867054 -0.506569 4.976025\nv -2.129812 -0.119440 6.780585\nv -5.271094 -0.442187 5.218725\nv -4.686800 -0.431552 6.069775\nv -7.536163 -0.588258 4.880375\nv -6.983021 -0.945592 6.276187\nv -9.765636 -0.077039 5.224914\nv -9.186094 -0.289934 6.556709\nv 8.975767 0.586200 7.349571\nv 7.148938 0.632028 6.348451\nv 7.699209 0.618144 8.073020\nv 4.503442 0.293064 6.625072\nv 5.491915 -0.096592 8.739964\nv 3.105952 0.305036 6.261952\nv 3.720279 0.386748 8.268384\nv 1.824891 0.085678 6.140754\nv 2.458733 0.526507 7.901978\nv 0.322955 -0.097125 6.826189\nv 0.769855 -0.056773 7.690872\nv -2.766257 -0.112548 6.867527\nv -1.917209 0.305837 7.833959\nv -5.315907 -0.819991 6.415964\nv -5.142741 -0.545962 7.247595\nv -7.742826 -0.734655 6.329205\nv -7.499958 -0.583125 7.242680\nv -9.423465 -0.150095 7.036643\nv -9.165016 -0.094345 8.202496\nv 8.760969 0.437319 9.353457\nv 7.521550 0.341876 8.918090\nv 8.283033 -0.101233 10.404274\nv 4.924226 -0.050461 9.192930\nv 5.651300 -0.035291 10.344244\nv 3.617424 0.360253 8.740638\nv 4.149028 -0.073031 10.144893\nv 2.246208 0.249486 8.091763\nv 2.475413 0.317049 9.264853\nv 0.069881 -0.085169 8.064898\nv 0.390813 0.101482 9.230130\nv -2.717988 0.073649 7.700835\nv -2.162622 0.168867 8.822326\nv -5.711531 -0.456703 7.354307\nv -4.961537 -0.044039 8.409244\nv -8.092309 -0.258776 7.790969\nv -7.145177 -0.251333 8.774726\nv -9.469668 0.030529 8.528061\nv -9.252020 0.343120 9.084900\nv 8.653187 0.259162 -9.390383\nv 8.411884 0.085217 -10.207109\nv 8.837502 0.204838 -9.758089\nv 8.209616 0.074952 -9.962185\nv 6.667437 0.295469 -8.945628\nv 6.413943 0.224605 -10.029751\nv 7.121511 0.273064 -9.721761\nv 5.985307 0.174331 -9.409924\nv 4.819303 0.120902 -8.381807\nv 4.803867 0.236520 -9.207484\nv 5.265836 0.152860 -9.121473\nv 4.422391 0.233794 -8.569978\nv 2.836426 0.601140 -7.944776\nv 3.397991 0.461732 -8.400035\nv 3.530372 0.428817 -8.158566\nv 2.772820 0.640727 -8.275078\nv 0.636938 0.490593 -8.568443\nv 1.092264 0.476226 -8.939304\nv 1.564016 0.614926 -8.544570\nv 0.379995 0.508504 -9.055773\nv -1.886670 0.911604 -8.866366\nv -1.276255 0.778643 -9.298983\nv -0.927157 0.850142 -9.087276\nv -2.093492 0.987500 -9.319349\nv -4.117505 0.343274 -9.167631\nv -3.806846 0.134360 -9.510355\nv -3.315876 0.564985 -9.497322\nv -4.670340 0.071362 -9.358359\nv -6.165686 -0.544217 -8.628880\nv -6.321679 -0.384843 -9.175320\nv -5.757455 -0.339751 -9.088147\nv -6.742637 -0.584408 -8.956985\nv -8.175745 -0.488815 -8.643593\nv -8.007956 -0.562718 -9.226104\nv -7.674671 -0.560874 -9.028784\nv -8.383139 -0.485672 -8.903909\nv 9.481577 0.535959 -6.294200\nv 8.903844 0.484759 -7.953714\nv 9.440341 0.426424 -7.365030\nv 8.698827 0.602123 -6.974944\nv 7.332483 0.517697 -6.129046\nv 6.935907 0.279100 -7.574909\nv 7.563824 0.559069 -6.839504\nv 6.640906 0.298268 -6.915462\nv 4.762092 0.554481 -6.082425\nv 4.836343 0.157894 -7.374907\nv 5.472163 0.369311 -6.885921\nv 4.150081 0.303657 -6.626649\nv 1.900893 0.589666 -6.401232\nv 2.235307 0.702582 -7.403395\nv 2.684080 0.516025 -6.738376\nv 1.547550 0.718155 -6.922091\nv -0.188308 0.298932 -6.657057\nv 0.227593 0.637552 -7.863196\nv 0.524833 0.563792 -7.101542\nv -0.350141 0.376708 -7.414333\nv -2.457769 0.119564 -7.201212\nv -2.171384 0.468713 -8.174967\nv -1.632816 0.271241 -7.664001\nv -2.856395 0.245821 -7.711401\nv -4.187720 -0.313737 -6.879668\nv -4.144841 0.278372 -8.095271\nv -3.654409 0.223882 -7.472454\nv -4.679344 -0.185361 -7.478278\nv -6.330858 -0.662577 -6.787291\nv -6.332291 -0.468699 -8.046869\nv -5.747205 -0.544278 -7.498657\nv -6.882175 -0.565534 -7.331241\nv -8.365929 -0.597843 -6.485970\nv -8.136139 -0.569853 -7.747972\nv -7.823919 -0.711653 -7.213363\nv -8.551781 -0.547450 -6.987183\nv 9.188885 0.413518 -3.921727\nv 9.477850 0.644770 -4.918584\nv 9.438131 0.475550 -4.407419\nv 9.019091 0.453263 -4.501390\nv 7.039211 0.698065 -3.950888\nv 7.445296 0.606357 -4.750313\nv 7.891464 0.365735 -4.343355\nv 6.570484 0.850604 -4.353593\nv 4.019121 0.705820 -3.586751\nv 4.274962 0.610040 -5.037387\nv 5.013362 0.768341 -4.398544\nv 3.300516 0.482619 -4.297157\nv 1.395089 -0.115167 -3.608169\nv 1.502068 0.141522 -5.358974\nv 2.035058 0.022582 -4.244759\nv 0.882535 -0.106058 -4.716993\nv -0.247590 -0.246616 -4.376302\nv -0.335485 0.099367 -5.484702\nv 0.155789 -0.017877 -4.912730\nv -0.726002 0.020761 -4.949155\nv -2.085622 -0.162120 -4.013902\nv -2.258097 -0.097314 -5.539851\nv -1.588964 -0.108601 -4.785192\nv -2.616242 -0.069080 -4.688814\nv -3.506369 0.025172 -4.120769\nv -3.797894 -0.452344 -5.392749\nv -3.236103 -0.145797 -4.755801\nv -4.030890 -0.182417 -4.712667\nv -6.104642 -0.415230 -4.232477\nv -6.135214 -0.542453 -5.432361\nv -5.207678 -0.298726 -4.771586\nv -6.818438 -0.522920 -4.979870\nv -8.683397 -0.093985 -4.203588\nv -8.636468 -0.178881 -5.244411\nv -8.308891 -0.283947 -5.056082\nv -8.873119 -0.118952 -4.722632\nv 8.505695 -0.099183 -1.711708\nv 8.802999 -0.057851 -2.596026\nv 8.901022 -0.222613 -2.036380\nv 8.340166 0.075734 -2.342890\nv 6.461019 0.766941 -1.571146\nv 6.699678 0.953667 -2.952359\nv 7.325825 0.631389 -2.288878\nv 5.637330 1.003601 -2.218237\nv 3.068495 0.394911 -1.553282\nv 3.340835 0.652698 -2.510539\nv 3.908607 0.654453 -2.217870\nv 2.338567 0.319765 -1.858427\nv 0.939129 -0.274430 -1.413368\nv 0.998882 -0.011574 -2.523132\nv 1.362455 -0.060176 -1.743485\nv 0.541039 -0.197088 -2.260242\nv -0.486212 -0.571517 -1.843222\nv -0.200575 -0.506154 -3.136411\nv -0.036782 -0.421735 -2.529111\nv -0.690740 -0.558137 -2.410577\nv -2.218574 -0.708847 -1.589248\nv -2.176945 -0.335592 -2.950402\nv -1.747014 -0.477233 -2.349732\nv -2.609828 -0.388521 -2.329816\nv -3.573681 -0.552111 -1.802172\nv -3.511301 -0.127681 -3.061013\nv -3.267669 -0.234988 -2.406965\nv -3.841698 -0.312636 -2.373436\nv -6.057034 -0.167713 -1.991584\nv -6.361620 -0.063585 -3.386263\nv -5.314259 -0.163775 -2.542608\nv -6.954044 0.053873 -2.667623\nv -8.606832 -0.141429 -2.034429\nv -8.555625 0.043911 -2.912814\nv -8.006762 -0.112190 -2.425151\nv -9.256639 -0.048186 -2.458545\nv 8.253006 -0.641877 0.555147\nv 8.262173 -0.486814 -0.710517\nv 8.446180 -0.785489 -0.139719\nv 8.034534 -0.343178 -0.069237\nv 6.161595 0.092970 0.358642\nv 6.290569 0.460885 -0.762462\nv 7.099641 0.031840 -0.163797\nv 5.341309 0.492964 -0.095608\nv 3.361932 0.410810 0.686378\nv 3.090742 0.414953 -0.309698\nv 3.874957 0.488646 0.253414\nv 2.493758 0.294681 0.306402\nv 1.148298 -0.220307 1.141731\nv 1.112411 -0.328530 -0.118708\nv 1.481655 -0.096090 0.436337\nv 0.831892 -0.653225 0.670451\nv -0.481208 -0.886397 0.720827\nv -0.483550 -0.853564 -0.742180\nv -0.090283 -0.912826 0.257803\nv -0.772135 -0.961623 -0.121490\nv -1.574578 -0.722976 0.669397\nv -2.013812 -0.763200 -0.477021\nv -1.555168 -0.879519 -0.022454\nv -2.114906 -0.590073 0.219391\nv -3.703930 -0.502107 0.930227\nv -3.714033 -0.658993 -0.410907\nv -3.160686 -0.412553 0.388929\nv -4.200976 -0.621217 0.140388\nv -6.398833 -0.502407 0.894925\nv -6.260708 -0.379626 -0.451415\nv -5.698772 -0.496914 0.254730\nv -7.162989 -0.308372 0.184501\nv -8.858565 -0.345615 0.980481\nv -8.866648 -0.226881 -0.778713\nv -8.576561 -0.292024 0.106085\nv -9.203896 -0.238838 0.073703\nv 7.838033 -0.504869 2.832839\nv 8.053660 -0.699450 1.655628\nv 8.532267 -0.631247 2.139402\nv 7.534373 -0.620122 2.424226\nv 5.995323 0.114234 2.728167\nv 5.954124 0.034343 1.560630\nv 6.520529 -0.189207 2.264524\nv 5.334688 0.258490 2.193561\nv 3.236983 0.647705 3.118068\nv 3.241050 0.542538 1.941409\nv 3.950057 0.488320 2.434031\nv 2.417882 0.639940 2.704398\nv 1.253918 0.198136 3.163724\nv 1.013562 0.173343 2.157288\nv 1.456883 0.401970 2.614131\nv 0.677000 -0.031559 2.664175\nv -0.091507 -0.206825 3.390369\nv -0.439871 -0.494792 1.849031\nv 0.044153 -0.310124 2.596246\nv -0.518025 -0.268597 2.423647\nv -1.592904 -0.380363 3.445477\nv -1.549567 -0.491024 1.874685\nv -1.150198 -0.476611 2.558117\nv -2.260000 -0.275132 2.819707\nv -3.837610 -0.489864 3.700558\nv -3.837386 -0.488467 2.334135\nv -3.377669 -0.371138 2.980825\nv -4.391835 -0.497198 3.100703\nv -6.625536 -0.380084 3.747193\nv -6.575316 -0.559579 2.328291\nv -5.816142 -0.496771 3.125851\nv -7.344055 -0.426719 2.955262\nv -9.106564 -0.084705 3.821297\nv -9.026977 -0.055361 2.381335\nv -8.646426 -0.308557 2.941180\nv -9.667101 0.135771 3.108788\nv 8.031024 0.445808 4.946757\nv 7.750187 -0.051197 3.862792\nv 8.406024 0.305329 4.317799\nv 7.407359 0.101166 4.495697\nv 5.903570 0.252011 5.001899\nv 6.004618 -0.182818 3.943945\nv 6.486304 -0.060475 4.467215\nv 5.266920 0.082699 4.583437\nv 3.572385 0.254672 5.160317\nv 3.366273 0.500648 3.925830\nv 3.900329 0.194169 4.526312\nv 3.057707 0.677903 4.664842\nv 1.908073 0.077768 5.187593\nv 1.541354 0.203543 4.242508\nv 2.155975 0.418666 4.838576\nv 1.287593 0.067704 4.589718\nv 0.754574 -0.238442 5.453575\nv 0.378762 -0.123484 4.419813\nv 0.748925 -0.082428 4.693843\nv 0.366564 -0.151475 4.990520\nv -1.497328 -0.168349 6.238916\nv -1.558863 -0.287798 4.738302\nv -0.812172 -0.229021 5.361372\nv -2.144004 -0.335256 5.604961\nv -3.884255 -0.376801 5.863473\nv -3.924687 -0.478678 5.107243\nv -3.290869 -0.489977 5.568789\nv -4.563877 -0.464872 5.569372\nv -6.545064 -0.886627 5.991869\nv -6.510836 -0.660598 5.097199\nv -6.154930 -0.610419 5.642973\nv -6.921261 -0.827309 5.564927\nv -8.807501 -0.450969 6.046646\nv -8.995703 -0.297914 4.996886\nv -8.197784 -0.560625 5.422481\nv -9.510470 -0.356743 5.680374\nv 8.036310 0.650402 7.284901\nv 8.075336 0.667710 6.036373\nv 8.579283 0.637438 6.613789\nv 7.429464 0.752266 6.987182\nv 6.025339 0.121514 8.199418\nv 5.849320 0.460788 6.378165\nv 6.557304 0.496095 7.238994\nv 5.173081 0.177832 7.460421\nv 3.913328 0.286671 7.522269\nv 3.844152 0.259926 6.356332\nv 4.205487 0.244499 7.119622\nv 3.545038 0.357454 6.933167\nv 2.769416 0.303343 7.393917\nv 2.477255 0.074850 6.158357\nv 2.966412 0.164274 6.803455\nv 2.303253 0.203797 6.614009\nv 1.540364 0.093223 7.134387\nv 1.223463 -0.164652 6.442842\nv 1.768295 0.147251 6.617122\nv 0.982151 -0.002358 6.960485\nv -1.036659 0.242034 7.742325\nv -1.242261 0.011593 7.158531\nv -0.227733 0.045325 7.334335\nv -1.801014 0.184813 7.382642\nv -4.444145 -0.384746 7.218486\nv -4.146405 -0.343656 6.619353\nv -3.621078 -0.111266 7.151997\nv -4.791839 -0.597926 6.742637\nv -6.603682 -0.824378 6.963650\nv -6.394874 -1.022570 6.443877\nv -5.783229 -0.981920 6.608395\nv -7.179161 -0.760646 6.680319\nv -8.781412 -0.155454 7.501580\nv -8.709438 -0.293810 6.713121\nv -8.290421 -0.334079 6.739555\nv -9.201468 -0.110831 7.297823\nv 8.588949 0.086963 9.824893\nv 8.414160 0.485309 8.409803\nv 8.818834 0.483016 8.965694\nv 8.160978 0.226021 9.336512\nv 6.175120 -0.088346 9.967350\nv 6.088974 0.086974 9.160694\nv 6.873611 0.096659 9.587086\nv 5.418520 -0.117566 9.582997\nv 4.304166 0.091151 9.944050\nv 3.992812 0.268290 8.962591\nv 4.457022 0.139572 9.620125\nv 3.925450 0.175971 9.245129\nv 2.933100 0.388697 9.273401\nv 2.945131 0.590344 8.657740\nv 3.322600 0.342066 9.115589\nv 2.691435 0.454812 8.819449\nv 1.009331 -0.060624 8.950027\nv 1.230631 -0.224421 7.810358\nv 1.745667 -0.131228 8.317151\nv 0.525421 -0.170287 8.346743\nv -1.473212 0.079648 8.801823\nv -1.348242 0.155498 8.070074\nv -0.595155 -0.068721 8.422935\nv -2.099532 0.143030 8.157440\nv -4.328414 -0.111585 8.224768\nv -4.467712 -0.251193 7.410641\nv -3.488412 -0.031883 7.849337\nv -5.105628 -0.213452 7.610785\nv -6.648431 -0.491303 8.236982\nv -7.008265 -0.581376 7.428644\nv -6.213684 -0.469410 7.662116\nv -7.579176 -0.438789 7.995976\nv -8.800192 0.336722 9.083005\nv -8.847180 -0.116512 8.473768\nv -8.431218 0.055070 8.619520\nv -9.311855 0.117626 8.824450\nv 8.301366 0.162503 -9.377907\nv 6.201678 0.225072 -8.818455\nv 4.352094 0.172416 -8.130779\nv 2.430635 0.707313 -8.113581\nv 0.115393 0.445531 -8.815984\nv -2.392906 0.909340 -8.986801\nv -4.679750 0.156517 -9.140308\nv -6.699844 -0.582731 -8.635309\nv -8.505390 -0.459505 -8.634590\nv 8.969042 0.643094 -6.156250\nv 6.753195 0.508729 -6.164923\nv 3.987609 0.451620 -6.036276\nv 1.327668 0.583832 -6.389983\nv -0.587446 0.208834 -6.744257\nv -2.918505 0.076173 -7.158456\nv -4.720275 -0.446207 -6.744783\nv -6.900096 -0.603180 -6.700428\nv -8.700646 -0.489714 -6.298132\nv 8.865716 0.319392 -3.987659\nv 6.342144 0.937122 -3.939114\nv 3.205628 0.573545 -3.605433\nv 0.840084 -0.273665 -3.937447\nv -0.656874 -0.242734 -4.410417\nv -2.600115 0.020680 -4.010238\nv -3.874992 -0.040846 -4.048382\nv -6.901845 -0.390206 -4.407955\nv -9.019327 -0.103401 -4.162000\nv 8.300743 0.073988 -1.912215\nv 5.602266 0.806869 -1.563526\nv 2.360437 0.242412 -1.329222\nv 0.617007 -0.292469 -1.553606\nv -0.862919 -0.676642 -1.835857\nv -2.584617 -0.554320 -1.637502\nv -3.869893 -0.528291 -1.683857\nv -6.862880 -0.078186 -2.021992\nv -9.247337 -0.105230 -2.062949\nv 7.971298 -0.466155 0.676450\nv 5.432677 0.333991 0.354731\nv 2.599241 0.375114 0.716170\nv 0.819436 -0.534338 1.243411\nv -0.825320 -0.923606 0.650000\nv -2.022440 -0.570154 0.805721\nv -4.300559 -0.619396 0.843599\nv -7.183746 -0.428047 0.890110\nv -9.160846 -0.343996 0.897957\nv 7.433065 -0.492035 3.039392\nv 5.404953 0.265346 2.740538\nv 2.514692 0.602308 3.160636\nv 0.915238 0.037872 3.276733\nv -0.325006 -0.236193 3.211838\nv -2.225180 -0.338678 3.616947\nv -4.386486 -0.454511 3.752342\nv -7.333882 -0.354804 3.688106\nv -9.674685 0.081683 3.929289\nv 7.570973 0.324280 5.105661\nv 5.186015 0.308658 5.139544\nv 3.258780 0.508592 5.229100\nv 1.482725 0.015274 5.033331\nv 0.502281 -0.230531 5.575449\nv -2.118677 -0.209821 6.283225\nv -4.640615 -0.435202 5.797089\nv -6.933257 -0.933800 5.986766\nv -9.338535 -0.362891 6.141543\nv 7.457772 0.733877 7.629910\nv 5.377642 -0.042545 8.188246\nv 3.617776 0.376586 7.541575\nv 2.389934 0.399374 7.241200\nv 0.985229 0.021718 7.366263\nv -1.782667 0.325393 7.705420\nv -4.956861 -0.610608 7.029469\nv -7.324774 -0.713210 7.004038\nv -9.190961 -0.063746 7.715096\nv 8.241062 0.017443 10.026853\nv 5.542061 -0.083621 10.025043\nv 4.073637 -0.031753 9.771422\nv 2.587995 0.370421 9.087570\nv 0.455695 0.002061 8.910208\nv -2.161161 0.198477 8.594868\nv -5.020420 -0.098833 8.092680\nv -7.295205 -0.364833 8.507416\nv -9.326427 0.317854 8.997301\nv 8.994425 0.382715 -9.270760\nv 8.696093 0.144246 -10.117717\nv 8.105549 0.131712 -10.302229\nv 7.255752 0.287391 -9.092522\nv 7.039265 0.309495 -10.181837\nv 5.919627 0.185099 -9.844374\nv 5.287108 0.170739 -8.594557\nv 5.228865 0.243979 -9.450592\nv 4.378219 0.325944 -8.929890\nv 3.281747 0.429599 -7.829812\nv 3.747030 0.403728 -8.474369\nv 2.906801 0.500867 -8.430617\nv 1.212901 0.659152 -8.402894\nv 1.646008 0.518883 -8.644927\nv 0.516686 0.592488 -9.318165\nv -1.259930 0.773093 -8.804417\nv -0.724774 0.800197 -9.262901\nv -1.886952 0.801013 -9.475962\nv -3.492809 0.564859 -9.148611\nv -3.055400 0.423838 -9.602169\nv -4.541293 -0.030656 -9.438290\nv -5.707015 -0.439844 -8.805893\nv -5.792788 -0.215777 -9.300793\nv -6.847017 -0.546812 -9.199408\nv -7.745790 -0.572614 -8.712976\nv -7.643223 -0.607572 -9.328016\nv -8.271749 -0.572877 -9.244186\nv 9.667336 0.434119 -6.498249\nv 9.210534 0.462115 -8.073892\nv 8.485465 0.520698 -7.765961\nv 7.812143 0.602719 -6.067744\nv 7.427298 0.437056 -7.583147\nv 6.550979 0.153361 -7.547023\nv 5.423348 0.623321 -6.130283\nv 5.428220 0.185490 -7.511553\nv 4.201350 0.154438 -7.194934\nv 2.489688 0.477037 -6.292227\nv 2.828935 0.499498 -7.208815\nv 1.728170 0.805762 -7.500785\nv 0.273482 0.343880 -6.536669\nv 0.686982 0.721627 -7.686689\nv -0.205950 0.475979 -8.017673\nv -1.786048 0.152010 -7.078195\nv -1.502389 0.414119 -8.091221\nv -2.651587 0.455585 -8.155779\nv -3.635548 -0.067030 -6.929023\nv -3.558136 0.438223 -8.011187\nv -4.697796 0.080964 -8.145042\nv -5.735463 -0.658276 -6.714729\nv -5.809008 -0.416160 -8.117589\nv -6.817799 -0.469872 -7.862062\nv -7.925024 -0.708153 -6.641140\nv -7.757274 -0.609665 -7.749092\nv -8.462049 -0.529866 -7.706347\nv 9.425057 0.425553 -3.761187\nv 9.543239 0.503781 -4.929338\nv 9.103905 0.627797 -4.877716\nv 7.729266 0.398795 -3.943952\nv 8.013821 0.434547 -4.783216\nv 6.741763 0.799928 -4.808180\nv 4.846330 0.809274 -3.647063\nv 5.146779 0.775301 -5.047542\nv 3.400371 0.412484 -4.963956\nv 1.999412 0.063280 -3.437449\nv 2.044820 0.074390 -5.111552\nv 0.951331 0.151031 -5.516631\nv 0.134531 -0.263271 -4.363990\nv 0.125816 0.084200 -5.543570\nv -0.801508 0.110805 -5.444259\nv -1.521835 -0.222786 -4.144024\nv -1.722669 -0.013376 -5.492365\nv -2.648509 -0.131953 -5.543476\nv -3.190154 0.098758 -4.148115\nv -3.249546 -0.351554 -5.439436\nv -4.289983 -0.343616 -5.381783\nv -5.240137 -0.242303 -4.141697\nv -5.426822 -0.381353 -5.411479\nv -6.842145 -0.530465 -5.477249\nv -8.276394 -0.168062 -4.435894\nv -8.229118 -0.380888 -5.451263\nv -8.805334 -0.118220 -5.183102\nv 8.736856 -0.207995 -1.561955\nv 9.132792 -0.142108 -2.531914\nv 8.446812 0.080938 -2.780823\nv 7.282876 0.518510 -1.654998\nv 7.461978 0.618738 -2.967715\nv 5.847754 1.136702 -2.912190\nv 3.894939 0.487320 -1.646807\nv 4.193336 0.868345 -2.641468\nv 2.591837 0.453632 -2.433539\nv 1.389043 -0.182621 -1.189200\nv 1.541364 0.064194 -2.300805\nv 0.588413 -0.150174 -2.834761\nv -0.146138 -0.407143 -1.764760\nv 0.067216 -0.442997 -3.220599\nv -0.619138 -0.442994 -3.055177\nv -1.841635 -0.658514 -1.685942\nv -1.673931 -0.296364 -2.934192\nv -2.679408 -0.206228 -2.945296\nv -3.293561 -0.423041 -1.811946\nv -3.261832 -0.063518 -2.998525\nv -3.891655 -0.159576 -3.025293\nv -5.248018 -0.256790 -1.817340\nv -5.453096 -0.138170 -3.254794\nv -7.061657 0.015563 -3.377102\nv -8.067505 -0.152365 -2.005234\nv -8.052616 -0.050631 -3.018625\nv -9.206992 0.085045 -2.912204\nv 8.595766 -0.790071 0.458624\nv 8.476775 -0.630618 -0.649406\nv 8.150504 -0.194128 -0.827905\nv 6.955922 -0.123352 0.562391\nv 7.239918 0.225353 -0.817570\nv 5.391194 0.652041 -0.577302\nv 4.077073 0.480067 0.635243\nv 3.803412 0.554231 -0.306628\nv 2.459712 0.271865 -0.252964\nv 1.477427 0.042019 0.971068\nv 1.531218 -0.146849 -0.134596\nv 0.781381 -0.508626 -0.041821\nv -0.097781 -0.841532 0.909494\nv -0.105995 -0.763951 -0.412628\nv -0.838286 -0.955920 -0.865289\nv -1.383588 -0.823043 0.638980\nv -1.738217 -0.838006 -0.659450\nv -2.327031 -0.603164 -0.379630\nv -3.184076 -0.372352 1.008228\nv -3.247584 -0.512107 -0.320796\nv -4.138310 -0.699802 -0.420840\nv -5.793249 -0.569791 0.854210\nv -5.582577 -0.446557 -0.350597\nv -7.086042 -0.297484 -0.626773\nv -8.534759 -0.352172 0.962723\nv -8.475417 -0.208735 -0.767429\nv -9.214281 -0.136444 -0.784762\nv 8.386581 -0.507007 2.575420\nv 8.537157 -0.765079 1.627887\nv 7.603502 -0.658024 1.726649\nv 6.571638 -0.111997 2.847702\nv 6.556890 -0.197993 1.666756\nv 5.367205 0.202766 1.598968\nv 3.936420 0.524008 2.941170\nv 4.009080 0.424780 1.823465\nv 2.472847 0.603556 2.013330\nv 1.554281 0.310182 3.064964\nv 1.449285 0.396548 2.115425\nv 0.570239 -0.178626 2.154804\nv 0.224680 -0.159600 3.402165\nv -0.102157 -0.533200 1.928602\nv -0.716163 -0.447539 1.767812\nv -1.080773 -0.432236 3.311756\nv -1.172063 -0.546383 1.835896\nv -2.123939 -0.375567 2.045253\nv -3.402962 -0.527045 3.712900\nv -3.327970 -0.308474 2.291121\nv -4.507246 -0.603059 2.402577\nv -5.871163 -0.469756 3.785036\nv -5.924768 -0.592345 2.427818\nv -7.307257 -0.541998 2.244269\nv -8.529749 -0.290456 3.656114\nv -8.584230 -0.297388 2.309120\nv -9.456876 -0.000154 2.341083\nv 8.607015 0.522148 4.791917\nv 8.250227 -0.010114 3.756049\nv 7.376324 -0.089750 3.961330\nv 6.532734 0.205230 4.996770\nv 6.524759 -0.182931 3.952582\nv 5.423864 -0.033705 3.933146\nv 3.930385 0.136025 5.176248\nv 3.962842 0.295982 3.877000\nv 2.889426 0.734440 4.035972\nv 2.397122 0.257433 5.294725\nv 1.962635 0.435891 4.211251\nv 1.271302 0.089232 4.194441\nv 0.897338 -0.178773 5.207767\nv 0.639664 -0.042981 4.306602\nv 0.149690 -0.124841 4.429952\nv -0.746743 -0.201646 6.023229\nv -0.921406 -0.208441 4.662077\nv -2.226652 -0.378074 4.881140\nv -3.229985 -0.346741 5.983253\nv -3.426462 -0.569868 5.070671\nv -4.496542 -0.428811 5.167499\nv -6.197053 -0.711724 5.956611\nv -6.024716 -0.540911 5.177234\nv -6.975170 -0.664940 5.030738\nv -8.118269 -0.577684 5.920490\nv -8.238867 -0.422385 4.840115\nv -9.533754 -0.188831 5.165720\nv 8.659986 0.566465 7.273364\nv 8.617271 0.680004 5.957263\nv 7.599800 0.703873 6.274518\nv 6.631636 0.420591 8.102409\nv 6.584702 0.548401 6.311944\nv 5.110830 0.390993 6.581557\nv 4.351665 0.170570 7.653197\nv 4.118929 0.204689 6.508299\nv 3.483405 0.349971 6.291986\nv 3.152642 0.286568 7.483409\nv 2.777806 0.166946 6.228924\nv 2.131624 0.100641 6.118931\nv 1.927954 0.303293 7.013573\nv 1.516778 -0.066877 6.249227\nv 0.848564 -0.124024 6.624971\nv -0.269848 0.108051 7.694762\nv -0.420050 -0.044672 7.026804\nv -1.989982 -0.017434 7.070925\nv -3.656654 -0.063418 7.445954\nv -3.498279 -0.216185 6.780768\nv -4.697289 -0.537670 6.435162\nv -5.905123 -0.825248 6.938427\nv -5.856350 -1.045832 6.406431\nv -7.077449 -0.886168 6.429280\nv -8.354919 -0.302497 7.220009\nv -8.219436 -0.460546 6.420713\nv -9.173163 -0.210659 6.924881\nv 8.726875 0.281869 9.579496\nv 8.826305 0.536495 8.373983\nv 7.979523 0.444973 8.639147\nv 6.929600 -0.029010 10.081938\nv 6.856269 0.296862 9.107533\nv 5.430919 -0.106569 9.191543\nv 4.606310 0.147470 10.134014\nv 4.422454 0.128879 9.106071\nv 3.794740 0.351481 8.852211\nv 3.292957 0.120735 9.515007\nv 3.319554 0.472424 8.738581\nv 2.609026 0.514615 8.449690\nv 1.606396 -0.007169 8.913430\nv 1.840476 -0.034731 7.794641\nv 0.605959 -0.178725 7.949249\nv -0.686612 -0.059389 8.905294\nv -0.556304 0.029381 8.117561\nv -2.021673 0.168386 7.891248\nv -3.492898 -0.011744 8.343422\nv -3.530583 -0.057886 7.530095\nv -5.192613 -0.404298 7.336010\nv -5.995003 -0.368093 8.119190\nv -6.317331 -0.542435 7.389133\nv -7.612600 -0.469677 7.531390\nv -8.235049 0.233106 9.035156\nv -8.469770 -0.152341 8.162365\nv -9.235332 -0.075570 8.583813\nvn 0.014000 0.981400 -0.191300\nvn 0.028000 0.995800 0.086700\nvn 0.215800 0.958300 0.187400\nvn 0.087800 0.996100 0.001000\nvn 0.177800 0.922200 0.343400\nvn -0.314600 0.919000 0.237400\nvn -0.466300 0.884400 0.019800\nvn -0.083100 0.977900 -0.191800\nvn 0.015600 0.997400 0.069700\nvn -0.167900 0.973500 0.155000\nvn 0.117600 0.954600 -0.273800\nvn -0.114400 0.976300 0.183500\nvn -0.248300 0.915800 0.315700\nvn -0.071100 0.992800 0.096100\nvn 0.018300 0.967600 0.251700\nvn 0.006500 0.984500 -0.175200\nvn -0.027900 0.986600 -0.160600\nvn 0.060700 0.952700 -0.297800\nvn -0.088400 0.993700 -0.068300\nvn -0.087900 0.977800 -0.190500\nvn -0.409600 0.890100 -0.199600\nvn -0.403400 0.914100 0.041300\nvn 0.090300 0.992000 0.088000\nvn 0.376000 0.922400 0.088400\nvn -0.100200 0.992700 0.067400\nvn 0.182500 0.967700 -0.173800\nvn 0.054200 0.984800 -0.164800\nvn 0.497600 0.848100 0.181800\nvn -0.197100 0.979900 -0.031100\nvn -0.401200 0.912700 0.077200\nvn -0.227000 0.962800 0.146500\nvn 0.128100 0.946100 0.297300\nvn 0.261800 0.957200 0.123400\nvn 0.255700 0.939700 0.226900\nvn -0.065600 0.996100 0.058600\nvn 0.155500 0.982700 -0.100900\nvn 0.363100 0.875300 0.319400\nvn 0.272500 0.948500 0.161300\nvn -0.234300 0.943000 -0.236500\nvn -0.444100 0.801900 -0.399600\nvn 0.101100 0.949900 -0.295600\nvn 0.265900 0.962200 -0.059400\nvn -0.018800 0.999300 0.032700\nvn 0.059600 0.993800 0.093900\nvn -0.126000 0.989600 -0.070000\nvn 0.418400 0.851100 -0.316900\nvn 0.220900 0.953800 0.203600\nvn -0.286500 0.957400 0.036500\nvn -0.252400 0.966700 -0.042800\nvn -0.097300 0.985500 -0.138900\nvn -0.125000 0.987800 0.092400\nvn -0.058800 0.995000 -0.081100\nvn 0.062400 0.997300 0.039000\nvn 0.256900 0.964200 0.065800\nvn -0.195300 0.916500 -0.349300\nvn -0.093800 0.992900 -0.072600\nvn -0.088500 0.966600 0.240600\nvn -0.144800 0.989300 0.016600\nvn -0.025000 0.996000 -0.085400\nvn -0.080100 0.981300 -0.175100\nvn -0.060600 0.904600 0.422000\nvn 0.169500 0.984700 -0.040400\nvn 0.266900 0.952400 -0.147500\nvn -0.085900 0.970700 0.224300\nvn 0.030400 0.990300 0.135800\nvn 0.143300 0.984800 -0.097700\nvn -0.395500 0.917200 0.047200\nvn 0.060300 0.987700 0.144200\nvn -0.163300 0.908500 0.384600\nvn -0.176600 0.828800 -0.531000\nvn 0.273700 0.938300 -0.211300\nvn 0.321100 0.946800 -0.018600\nvn -0.056300 0.971300 0.231200\nvn 0.198500 0.951900 -0.233400\nvn -0.248200 0.955200 0.161400\nvn -0.321300 0.905800 -0.276100\nvn -0.055200 0.981600 -0.183000\nvn -0.035300 0.996700 0.072500\nvn -0.128900 0.977200 -0.168800\nvn 0.354400 0.847400 -0.395300\nvn -0.133600 0.982500 -0.130000\nvn -0.169700 0.962600 -0.211300\nvn -0.383000 0.916000 0.119000\nvn 0.233200 0.960900 0.149200\nvn -0.121000 0.991700 0.042500\nvn -0.135600 0.990700 -0.004700\nvn 0.298500 0.948400 0.106900\nvn -0.092100 0.995300 0.030600\nvn 0.135900 0.954100 0.266800\nvn 0.224500 0.955800 0.190000\nvn 0.286200 0.920700 0.265300\nvn 0.092300 0.947600 -0.305900\nvn 0.142300 0.544200 -0.826800\nvn -0.152300 0.906700 -0.393400\nvn -0.055300 0.997600 -0.040600\nvn 0.198700 0.910000 0.363800\nvn 0.129500 0.829100 0.543900\nvn 0.023700 0.656300 -0.754100\nvn 0.021400 0.744600 -0.667200\nvn -0.247100 0.968300 -0.036000\nvn -0.191300 0.191200 -0.962700\nvn -0.064700 0.990900 0.117700\nvn -0.321200 0.897100 -0.303300\nvn -0.178700 0.882300 0.435500\nvn -0.104500 0.993400 -0.048100\nvn 0.201400 0.977200 0.067900\nvn 0.064000 0.977500 -0.201200\nvn 0.111700 0.975600 -0.189200\nvn 0.351800 0.925300 -0.141600\nvn 0.059700 0.997600 -0.035600\nvn 0.026400 0.987100 -0.157900\nvn 0.118900 0.987100 -0.107300\nvn -0.314700 0.944800 -0.091000\nvn 0.045400 0.966600 -0.252100\nvn -0.112500 0.983800 -0.139600\nvn -0.110900 0.951100 -0.288300\nvn 0.127700 0.985300 -0.113800\nvn 0.085700 0.887100 0.453600\nvn 0.281100 0.950200 0.134200\nvn -0.039100 0.971700 0.232900\nvn -0.157500 0.956000 0.247300\nvn -0.154100 0.975900 0.154600\nvn -0.163700 0.972400 0.166300\nvn -0.154200 0.968400 0.196200\nvn 0.018600 0.898900 0.437700\nvn 0.065400 0.925200 0.373800\nvn -0.252200 0.930800 0.264600\nvn -0.293500 0.875800 0.383100\nvn -0.440900 0.852600 0.280500\nvn -0.068100 0.994200 -0.083100\nvn -0.070800 0.976800 0.202100\nvn -0.036400 0.987000 0.156700\nvn 0.148700 0.955000 -0.256500\nvn 0.104100 0.987300 0.120300\nvn -0.030300 0.999400 -0.017200\nvn -0.031100 0.954500 0.296600\nvn 0.137900 0.937000 0.320900\nvn -0.271000 0.925300 0.265200\nvn 0.396500 0.911800 -0.106600\nvn 0.293200 0.950500 0.102600\nvn 0.056500 0.998400 -0.002500\nvn -0.131000 0.985600 -0.106800\nvn -0.186500 0.979200 -0.080300\nvn -0.348300 0.933100 -0.090100\nvn -0.199500 0.960500 -0.194000\nvn -0.189200 0.962700 0.193300\nvn -0.035700 0.964400 0.262000\nvn 0.032500 0.957800 0.285700\nvn 0.089700 0.988000 0.125500\nvn -0.087500 0.979200 0.183000\nvn 0.135000 0.982700 0.126700\nvn -0.046200 0.997400 0.055900\nvn -0.012600 0.983100 -0.182400\nvn -0.228500 0.973300 -0.023300\nvn -0.194400 0.939900 -0.280900\nvn 0.106600 0.973700 -0.201100\nvn -0.143500 0.915100 -0.376800\nvn -0.262300 0.964900 0.012300\nvn 0.149600 0.982800 -0.108000\nvn 0.090100 0.983700 -0.155900\nvn 0.423700 0.904500 -0.049000\nvn -0.040000 0.998900 -0.024300\nvn 0.295300 0.911300 0.286900\nvn 0.208500 0.959700 0.188600\nvn 0.567900 0.819400 0.077600\nvn 0.279400 0.901700 0.330000\nvn 0.400600 0.905500 0.140100\nvn -0.065900 0.948700 0.309300\nvn -0.119700 0.989500 -0.080400\nvn -0.208200 0.954000 0.215800\nvn -0.393000 0.918700 0.039900\nvn -0.259000 0.961800 0.089000\nvn -0.233700 0.957600 0.168700\nvn -0.279100 0.959100 -0.047900\nvn -0.437100 0.892400 0.111800\nvn -0.218500 0.975200 0.036500\nvn 0.292900 0.915300 0.276400\nvn -0.117600 0.991400 0.057600\nvn -0.083800 0.948200 0.306500\nvn 0.352300 0.908300 0.225700\nvn -0.411600 0.902700 0.125200\nvn -0.359700 0.890100 0.280000\nvn 0.121100 0.988700 0.088300\nvn 0.020300 0.984700 0.173300\nvn 0.149300 0.986400 -0.068300\nvn -0.122800 0.992200 0.021500\nvn 0.019200 0.999600 0.019400\nvn 0.223700 0.951000 0.213700\nvn -0.036100 0.978200 0.204300\nvn 0.429700 0.888300 0.162200\nvn 0.553400 0.797900 0.239100\nvn 0.512600 0.812700 0.277000\nvn 0.248900 0.958700 0.137800\nvn 0.243100 0.889600 0.386700\nvn 0.068800 0.983100 0.169800\nvn -0.103500 0.988600 -0.109000\nvn -0.170200 0.979400 0.108900\nvn -0.429000 0.888500 -0.162700\nvn -0.688000 0.637400 -0.347100\nvn -0.394900 0.916200 0.067900\nvn -0.507400 0.827500 0.240500\nvn -0.040900 0.974500 -0.220700\nvn -0.103400 0.989700 0.099300\nvn 0.074300 0.997200 0.012000\nvn 0.250300 0.939100 -0.235300\nvn 0.214200 0.973900 -0.075800\nvn 0.286700 0.949400 -0.128600\nvn -0.241600 0.970400 -0.004000\nvn -0.180800 0.968100 -0.173200\nvn 0.178200 0.980600 0.081100\nvn 0.118600 0.983600 0.136200\nvn 0.093600 0.995100 0.031300\nvn 0.038000 0.997200 0.063900\nvn 0.010700 0.985600 -0.168600\nvn -0.048800 0.994700 0.090800\nvn 0.228300 0.965000 0.128800\nvn -0.186700 0.895000 -0.405200\nvn 0.126100 0.983700 -0.128500\nvn 0.367500 0.929800 0.019000\nvn 0.126300 0.967700 0.218000\nvn 0.417900 0.907200 -0.048100\nvn 0.213700 0.975400 -0.053500\nvn 0.195400 0.976600 0.089500\nvn 0.133400 0.984500 -0.114200\nvn -0.123600 0.992300 0.008600\nvn -0.301100 0.941400 0.152100\nvn -0.407500 0.911200 -0.060500\nvn -0.565700 0.808500 -0.162100\nvn -0.258500 0.965600 0.029700\nvn 0.121200 0.942500 -0.311400\nvn -0.376100 0.924700 -0.058700\nvn 0.085600 0.994600 -0.058000\nvn 0.132800 0.984700 -0.112700\nvn 0.190700 0.981000 0.035600\nvn 0.086200 0.995700 -0.034500\nvn -0.334300 0.942400 -0.015300\nvn -0.049000 0.991400 -0.121500\nvn 0.109900 0.983900 0.141300\nvn 0.118300 0.974700 -0.189400\nvn -0.029200 0.997700 -0.061100\nvn 0.350100 0.934900 0.058100\nvn 0.485700 0.872400 0.054100\nvn -0.200500 0.943200 -0.264800\nvn -0.203200 0.933400 -0.295700\nvn -0.206300 0.892200 -0.401800\nvn -0.168900 0.955000 -0.244000\nvn 0.024400 0.931800 -0.362200\nvn 0.004000 0.974300 -0.225200\nvn 0.239200 0.970800 0.019000\nvn 0.295000 0.954400 -0.045500\nvn 0.339100 0.925200 0.170600\nvn -0.000500 0.999900 0.011300\nvn -0.348600 0.907000 0.236200\nvn -0.440100 0.888000 0.133300\nvn -0.194200 0.979000 0.062400\nvn -0.248000 0.964600 0.090100\nvn -0.232500 0.961300 0.147800\nvn -0.026600 0.996500 0.078600\nvn -0.008900 0.983100 -0.182700\nvn -0.125300 0.992000 -0.015500\nvn -0.147600 0.984100 -0.098300\nvn -0.016600 0.987400 -0.157200\nvn 0.044500 0.998300 -0.036700\nvn -0.010700 0.995100 0.098700\nvn -0.161600 0.919400 0.358600\nvn -0.266400 0.940300 0.211900\nvn 0.052200 0.956500 0.287100\nvn 0.134200 0.962900 -0.234200\nvn 0.209500 0.941500 0.264000\nvn 0.462300 0.871100 0.165700\nvn 0.090800 0.987100 0.131700\nvn -0.024200 0.999600 -0.010700\nvn -0.168100 0.983300 -0.069400\nvn -0.391800 0.918400 0.055300\nvn -0.099900 0.977800 0.184400\nvn 0.010700 0.991700 0.128200\nvn 0.306400 0.951800 0.014100\nvn 0.238400 0.966700 -0.093300\nvn -0.192000 0.980200 0.049100\nvn 0.226100 0.929000 -0.293000\nvn -0.144400 0.989100 -0.027600\nvn 0.217400 0.872500 -0.437600\nvn -0.454000 0.886900 0.085500\nvn -0.447100 0.877600 -0.172900\nvn -0.043700 0.968900 -0.243600\nvn 0.175800 0.982000 0.068400\nvn 0.047200 0.894700 -0.444100\nvn -0.011600 0.875200 -0.483600\nvn -0.200500 0.872100 -0.446300\nvn -0.182900 0.982300 -0.041200\nvn -0.415800 0.905200 0.088100\nvn -0.018700 0.837800 -0.545600\nvn 0.054100 0.903900 -0.424400\nvn 0.258500 0.895000 -0.363600\nvn 0.354500 0.933700 0.049400\nvn 0.145200 0.944300 -0.295200\nvn 0.134400 0.965700 -0.222200\nvn -0.617600 0.747000 0.246100\nvn -0.099500 0.966600 0.236200\nvn 0.006700 0.934300 0.356300\nvn -0.016200 0.999400 0.030600\nvn -0.236000 0.932200 0.274400\nvn 0.109600 0.991600 -0.069000\nvn -0.340500 0.928300 0.149100\nvn 0.059100 0.986700 0.151400\nvn -0.292200 0.826900 0.480500\nvn 0.133700 0.843300 0.520600\nvn 0.497200 0.865600 0.059500\nvn -0.636600 0.750400 0.177700\nvn -0.106500 0.899100 -0.424700\nvn -0.297100 0.954900 -0.002800\nvn 0.196600 0.972600 0.124500\nvn 0.156100 0.979300 0.128800\nvn 0.132500 0.944700 0.299900\nvn -0.046600 0.995000 -0.088100\nvn -0.064100 0.986900 -0.147700\nvn -0.099600 0.961000 -0.258100\nvn -0.100200 0.829300 -0.549800\nvn -0.193700 0.918900 -0.343600\nvn -0.143400 0.989600 0.013500\nvn 0.265400 0.927500 -0.263200\nvn 0.166700 0.915800 -0.365300\nvn -0.366100 0.763800 -0.531600\nvn 0.453600 0.826100 -0.334300\nvn -0.231500 0.948300 -0.217200\nvn -0.266900 0.958300 -0.101700\nvn 0.213300 0.975900 -0.045000\nvn -0.229700 0.961100 0.153600\nvn -0.156700 0.987300 -0.027400\nvn 0.085100 0.994400 -0.062100\nvn 0.206400 0.960400 0.187100\nvn 0.335000 0.924300 0.182800\nvn 0.255800 0.943300 0.211600\nvn 0.198700 0.971000 0.133100\nvn 0.200600 0.979500 0.021100\nvn 0.129500 0.976200 -0.174200\nvn -0.056900 0.996500 -0.061500\nvn -0.051800 0.978500 0.199800\nvn 0.179400 0.855400 0.486000\nvn -0.105400 0.898400 0.426300\nvn -0.002600 0.974000 0.226600\nvn -0.254800 0.964700 0.066200\nvn -0.304100 0.951100 -0.053300\nvn -0.313300 0.879900 -0.357200\nvn -0.254000 0.955000 0.153400\nvn -0.066200 0.962200 -0.264100\nvn -0.072000 0.997400 0.004400\nvn -0.053800 0.995800 -0.073800\nvn 0.089800 0.994700 0.050300\nvn 0.016900 0.995900 -0.089100\nvn 0.009800 0.997400 -0.071200\nvn 0.189000 0.980200 -0.059100\nvn 0.174300 0.978900 -0.106500\nvn 0.011300 0.999500 -0.028300\nvn 0.177000 0.950500 -0.255400\nvn 0.001800 0.962800 -0.270300\nvn 0.092900 0.943300 -0.318800\nvn -0.134000 0.990100 -0.041200\nvn -0.108800 0.956800 -0.269700\nvn 0.035300 0.997300 -0.065100\nvn -0.000500 0.898500 0.439000\nvn 0.062800 0.961200 0.268600\nvn -0.156600 0.951600 0.264500\nvn -0.237900 0.967100 0.089900\nvn -0.352000 0.929700 0.108300\nvn -0.201800 0.971900 0.121500\nvn -0.115800 0.968400 0.220800\nvn -0.019700 0.956400 0.291200\nvn 0.162900 0.920800 0.354500\nvn 0.017500 0.999800 0.013100\nvn -0.330900 0.894800 0.299800\nvn -0.381300 0.909400 0.166000\nvn 0.086600 0.990200 -0.109300\nvn 0.047500 0.997000 0.060900\nvn -0.049900 0.998400 0.025100\nvn 0.155900 0.950400 -0.269300\nvn 0.246000 0.968900 -0.028000\nvn 0.035600 0.993100 -0.111400\nvn -0.293900 0.952400 0.080900\nvn -0.238200 0.954800 0.177700\nvn -0.254800 0.967000 0.009200\nvn 0.323100 0.944800 -0.055300\nvn 0.323200 0.946100 -0.019400\nvn 0.007400 0.997100 -0.075700\nvn -0.158000 0.983700 -0.085300\nvn -0.192400 0.969200 -0.153800\nvn -0.401000 0.901000 -0.165500\nvn -0.284600 0.949200 -0.134000\nvn -0.365700 0.913800 0.176600\nvn -0.273900 0.917900 0.287200\nvn 0.131200 0.972800 0.191000\nvn -0.028300 0.896500 0.442100\nvn 0.121800 0.948200 0.293300\nvn 0.331700 0.930500 0.155400\nvn 0.331100 0.934400 -0.131500\nvn 0.317000 0.915000 -0.249600\nvn -0.171300 0.984900 0.025900\nvn -0.204100 0.966100 -0.158000\nvn -0.093100 0.994300 -0.051200\nvn 0.096800 0.947600 -0.304600\nvn 0.077800 0.973600 -0.214600\nvn 0.190700 0.956200 -0.222100\nvn -0.054900 0.973300 -0.222800\nvn 0.064700 0.997800 -0.010800\nvn -0.026800 0.997800 -0.060000\nvn 0.717500 0.672700 0.181000\nvn 0.609900 0.790200 0.059000\nvn 0.560200 0.818200 0.129400\nvn 0.047300 0.985700 0.161600\nvn 0.089800 0.952500 0.291000\nvn -0.181800 0.938700 0.292900\nvn -0.214900 0.976500 -0.014400\nvn -0.187000 0.970900 0.149600\nvn -0.352300 0.920800 0.167200\nvn -0.145700 0.984100 0.101700\nvn -0.118300 0.982300 0.145300\nvn -0.108700 0.993100 0.044500\nvn -0.255400 0.932800 0.254200\nvn 0.016900 0.978200 0.206800\nvn 0.209400 0.922200 0.325100\nvn 0.359100 0.931400 0.059100\nvn 0.357600 0.911100 0.205200\nvn 0.298100 0.923500 0.241600\nvn 0.184900 0.944100 0.272800\nvn 0.097800 0.948700 0.300700\nvn 0.257800 0.950500 0.173700\nvn 0.056400 0.973900 0.220100\nvn 0.101600 0.977400 0.185600\nvn -0.169500 0.978700 0.115600\nvn 0.058000 0.997700 -0.035500\nvn 0.049600 0.988700 0.141400\nvn 0.097700 0.994400 0.041400\nvn 0.602500 0.694600 0.393000\nvn 0.873000 0.463900 0.150500\nvn 0.370500 0.893500 0.253700\nvn 0.275400 0.943500 0.184500\nvn 0.301700 0.916600 0.262400\nvn 0.261800 0.959000 0.108900\nvn -0.053300 0.980300 -0.189900\nvn -0.053000 0.982400 -0.179200\nvn -0.232900 0.948300 -0.215500\nvn -0.684900 0.570400 -0.453500\nvn -0.695000 0.700800 -0.160500\nvn -0.461200 0.871400 -0.167200\nvn 0.045200 0.962500 -0.267500\nvn -0.096000 0.993800 -0.055600\nvn 0.044500 0.995700 -0.081300\nvn 0.287000 0.950100 -0.122200\nvn 0.430700 0.897100 -0.098400\nvn 0.314900 0.948500 -0.034200\nvn -0.194200 0.980900 0.009500\nvn -0.188700 0.981600 -0.029300\nvn 0.030900 0.997900 0.057500\nvn 0.092300 0.984000 0.152700\nvn 0.091900 0.981300 0.169100\nvn 0.058700 0.989300 0.133900\nvn -0.049600 0.989500 -0.135400\nvn -0.029600 0.991300 0.128000\nvn 0.045900 0.983400 0.175400\nvn -0.196300 0.876600 -0.439400\nvn -0.085300 0.972500 -0.216500\nvn 0.331100 0.923500 -0.193600\nvn 0.215300 0.948100 0.234200\nvn 0.246900 0.968100 -0.043800\nvn 0.197800 0.980200 -0.010200\nvn 0.051400 0.991200 -0.122100\nvn -0.056900 0.993900 0.094100\nvn -0.307600 0.913500 0.266100\nvn -0.387400 0.912300 0.132900\nvn -0.411500 0.909700 0.056900\nvn -0.413400 0.908100 -0.066700\nvn -0.056100 0.997100 -0.051500\nvn -0.115300 0.993300 -0.012600\nvn -0.307600 0.951500 0.011000\nvn 0.082300 0.994700 0.061500\nvn 0.198200 0.977700 0.069300\nvn 0.051900 0.976700 0.208300\nvn 0.058000 0.996200 -0.065200\nvn -0.065200 0.995800 -0.064700\nvn -0.041600 0.997900 -0.049800\nvn 0.037100 0.990800 0.130200\nvn 0.043700 0.994200 -0.098200\nvn -0.013500 0.994100 -0.108000\nvn 0.257400 0.959300 0.116400\nvn 0.305400 0.950000 0.065400\nvn -0.055900 0.998400 -0.005000\nvn -0.343900 0.882500 -0.320800\nvn -0.326200 0.912600 -0.246300\nvn -0.179000 0.941800 -0.284600\nvn 0.034400 0.974500 -0.221700\nvn 0.147900 0.923600 -0.353800\nvn 0.122200 0.987600 -0.098100\nvn 0.468500 0.882700 0.037700\nvn 0.630300 0.776300 0.008300\nvn -0.028600 0.926300 0.375600\nvn -0.049900 0.998500 -0.021300\nvn -0.215500 0.954200 0.207600\nvn -0.174800 0.970100 0.168200\nvn 0.009300 0.998900 -0.045600\nvn 0.027000 0.991400 0.127700\nvn -0.022400 0.995600 0.090800\nvn -0.075700 0.980800 -0.179900\nvn -0.129700 0.975900 -0.175600\nvn -0.050000 0.965700 -0.254700\nvn -0.074700 0.996900 -0.026000\nvn -0.004100 0.991400 -0.130600\nvn -0.009400 0.983900 0.178600\nvn 0.068600 0.996300 0.052400\nvn -0.137600 0.961300 0.238800\nvn 0.136900 0.975400 0.172800\nvn 0.110000 0.971300 -0.211100\nvn 0.155700 0.986800 -0.044900\nvn 0.455700 0.886600 -0.079600\nvn 0.218900 0.966600 0.133200\nvn 0.157300 0.987300 0.021300\nvn -0.173500 0.983000 0.060500\nvn -0.338500 0.927100 0.160900\nvn -0.236300 0.909600 0.341800\nvn 0.012300 0.964500 0.263800\nvn 0.461500 0.883800 -0.077400\nvn 0.286600 0.955900 -0.064300\nvn -0.061800 0.995000 -0.078900\nvn 0.150100 0.967800 -0.201800\nvn 0.352200 0.878600 -0.322600\nvn 0.293200 0.888400 -0.353300\nvn -0.037600 0.976700 0.211200\nvn -0.038900 0.997500 -0.058900\nvn -0.021000 0.998000 -0.059200\nvn 0.095600 0.964400 0.246700\nvn 0.121300 0.907500 -0.402100\nvn -0.073800 0.944600 -0.319900\nvn -0.219000 0.868800 -0.444100\nvn -0.375200 0.910100 -0.175600\nvn -0.347400 0.852500 -0.390500\nvn 0.116800 0.905500 -0.407900\nvn 0.210500 0.976400 -0.048400\nvn 0.262100 0.961900 -0.077400\nvn 0.242000 0.969100 0.048000\nvn 0.094500 0.989000 -0.114000\nvn 0.108600 0.974200 -0.198000\nvn -0.015500 0.953300 0.301500\nvn -0.079000 0.951700 0.296700\nvn -0.123600 0.961100 0.246900\nvn 0.078100 0.981400 -0.175300\nvn 0.000500 0.997100 -0.076700\nvn 0.160200 0.971400 -0.175000\nvn -0.554300 0.807700 0.201200\nvn -0.653900 0.622700 0.429900\nvn -0.324400 0.835700 0.443200\nvn -0.050800 0.964800 0.258200\nvn -0.176100 0.956400 0.233100\nvn -0.367400 0.919500 -0.139500\nvn 0.127500 0.954200 -0.270700\nvn 0.134500 0.952100 -0.274600\nvn 0.097000 0.983700 -0.151100\nvn 0.130900 0.983000 0.128800\nvn 0.197400 0.975600 -0.095900\nvn -0.016600 0.988500 -0.150400\nvn 0.058400 0.981800 -0.180800\nvn 0.064000 0.968300 -0.241600\nvn -0.141100 0.969400 -0.201100\nvn 0.001600 0.920100 -0.391600\nvn 0.106800 0.973900 -0.200100\nvn 0.343900 0.867100 -0.360500\nvn 0.019400 0.956100 -0.292200\nvn 0.098600 0.654400 -0.749700\nvn 0.106300 0.799500 -0.591200\nvn 0.124900 0.972300 -0.197600\nvn 0.006200 0.938700 -0.344600\nvn -0.254100 0.936400 -0.242200\nvn -0.358400 0.933400 -0.016300\nvn -0.359000 0.917700 0.170000\nvn -0.294100 0.890600 0.346900\nvn -0.094700 0.976800 0.192000\nvn 0.000600 0.899200 0.437600\nvn 0.275100 0.953600 0.122400\nvn 0.132800 0.985000 -0.110500\nvn 0.132500 0.989900 -0.050800\nvn -0.075800 0.994400 -0.073000\nvn 0.084400 0.994400 0.063700\nvn -0.004400 0.995400 -0.095200\nvn -0.155000 0.983600 -0.092600\nvn -0.066600 0.997200 0.034800\nvn -0.029100 0.999300 0.023600\nvn 0.279600 0.955600 0.093100\nvn -0.131600 0.990300 0.043400\nvn -0.183700 0.982600 -0.025900\nvn -0.036200 0.999100 0.021300\nvn 0.063800 0.963600 0.259600\nvn 0.134200 0.962500 0.235800\nvn 0.094400 0.972900 0.211000\nvn 0.323100 0.925600 0.197300\nvn 0.117200 0.993100 -0.009700\nvn -0.004800 0.998400 -0.055800\nvn 0.341200 0.906800 0.247500\nvn 0.362000 0.891700 0.271600\nvn 0.311300 0.908700 0.278100\nvn 0.207100 0.976200 0.064500\nvn -0.221400 0.942100 -0.251700\nvn -0.104300 0.894600 -0.434600\nvn 0.100600 0.781400 -0.615900\nvn 0.003700 0.810300 -0.586000\nvn 0.137500 0.649800 -0.747500\nvn -0.099700 0.960200 -0.260900\nvn -0.034400 0.926600 -0.374500\nvn -0.120000 0.950000 -0.288200\nvn 0.110100 0.761500 -0.638800\nvn 0.100500 0.796400 -0.596400\nvn -0.115800 0.990500 0.074300\nvn -0.086000 0.961000 0.262800\nvn -0.115900 0.886400 0.448100\nvn 0.206200 0.921700 0.328700\nvn 0.246100 0.818500 0.519100\nvn 0.239300 0.828000 0.507000\nvn 0.129100 0.945900 0.297700\nvn -0.004600 0.960400 -0.278400\nvn -0.191200 0.816300 -0.545100\nvn -0.050600 0.356800 -0.932800\nvn 0.208200 0.753900 -0.623100\nvn 0.278500 0.235600 -0.931100\nvn 0.184800 0.253000 -0.949600\nvn -0.317600 0.946100 0.063300\nvn -0.382600 0.903400 -0.193800\nvn -0.384600 0.847900 -0.365000\nvn -0.177600 0.354200 -0.918100\nvn -0.102700 0.212500 -0.971700\nvn -0.190800 0.279000 -0.941100\nvn -0.186600 0.448700 -0.874000\nvn -0.152800 0.596400 -0.788100\nvn -0.016200 0.892400 -0.450900\nvn -0.570600 0.810500 -0.132000\nvn -0.288900 0.884900 0.365400\nvn -0.222700 0.948700 0.224400\nvn -0.096300 0.852800 0.513200\nvn -0.084000 0.978500 0.188600\nvn -0.167300 0.917600 0.360600\nvn -0.191800 0.954000 0.230500\nvn -0.290500 0.889700 0.352300\nvn -0.268800 0.952300 0.144400\nvn 0.102900 0.994600 0.009000\nvn 0.201200 0.976100 0.081600\nvn 0.185700 0.980900 0.058100\nvn 0.191700 0.972600 -0.131600\nvn 0.011900 0.992600 -0.121100\nvn 0.005200 0.974300 -0.225400\nvn -0.019800 0.966900 -0.254300\nvn -0.040500 0.963700 -0.263900\nvn 0.062100 0.963600 -0.260100\nvn 0.786700 0.612700 -0.076000\nvn 0.261800 0.962000 -0.077100\nvn 0.178400 0.978100 -0.106900\nvn 0.283500 0.958000 -0.043700\nvn 0.167100 0.985900 0.000700\nvn 0.039600 0.995500 -0.086600\nvn 0.035200 0.993100 -0.111700\nvn -0.215400 0.963500 -0.159200\nvn -0.092700 0.976700 -0.193700\nvn -0.076100 0.987800 0.136000\nvn -0.088400 0.995700 -0.027900\nvn -0.160600 0.981400 -0.104900\nvn -0.132600 0.981700 -0.136700\nvn -0.003000 0.994300 -0.106900\nvn -0.304700 0.950900 0.054800\nvn -0.199900 0.960800 -0.192000\nvn -0.302900 0.948300 0.095100\nvn 0.037000 0.999300 0.007900\nvn 0.057000 0.977900 -0.201100\nvn 0.057400 0.947400 -0.314800\nvn -0.096300 0.947900 -0.303600\nvn 0.058400 0.956700 -0.285200\nvn 0.021900 0.997500 -0.067400\nvn -0.114800 0.989300 -0.090300\nvn -0.078900 0.962400 -0.259800\nvn 0.004100 0.997300 -0.072700\nvn 0.163600 0.986100 -0.027000\nvn 0.047600 0.916600 0.397000\nvn 0.231800 0.955100 0.184400\nvn 0.191900 0.952200 0.237700\nvn 0.338600 0.938200 0.071300\nvn 0.357600 0.930700 0.077200\nvn 0.316600 0.944100 0.091600\nvn 0.159200 0.967600 0.196200\nvn 0.216500 0.975000 0.050900\nvn 0.057400 0.998300 0.003700\nvn -0.252000 0.924000 0.287500\nvn -0.218900 0.938300 0.267900\nvn -0.190800 0.947100 0.258200\nvn -0.189300 0.960000 0.206500\nvn -0.133000 0.984900 -0.111300\nvn -0.179800 0.957600 -0.225000\nvn -0.342400 0.936800 0.072300\nvn -0.303600 0.943300 -0.134400\nvn 0.035300 0.975600 0.216600\nvn -0.092300 0.985900 0.139300\nvn -0.037400 0.981100 0.189900\nvn -0.034300 0.966200 0.255500\nvn 0.022800 0.946000 0.323300\nvn 0.165500 0.862100 0.478900\nvn 0.079600 0.801500 0.592700\nvn -0.007800 0.905700 0.423900\nvn -0.089600 0.873000 0.479500\nvn -0.205200 0.946900 0.247500\nvn -0.237500 0.902700 0.358900\nvn 0.025700 0.881700 0.471100\nvn -0.367400 0.829100 0.421400\nvn 0.020900 0.927700 0.372800\nvn -0.145200 0.981700 0.123200\nvn -0.277700 0.952200 0.127100\nvn -0.342400 0.869200 0.356700\nvn -0.344400 0.926300 0.152500\nvn -0.498400 0.861700 0.095000\nvn -0.179400 0.975100 -0.130400\nvn -0.201200 0.968900 0.143900\nvn -0.021000 0.993400 0.113200\nvn -0.259600 0.940200 0.220500\nvn -0.480000 0.873600 -0.079800\nvn -0.152300 0.985600 -0.073000\nvn 0.068000 0.980400 0.184900\nvn -0.037700 0.997900 -0.052700\nvn -0.082000 0.994900 -0.058500\nvn -0.196200 0.942800 -0.269400\nvn -0.258000 0.964800 -0.051500\nvn 0.184200 0.982800 -0.016500\nvn -0.226000 0.961700 0.155000\nvn -0.228200 0.970900 0.073300\nvn 0.104300 0.989700 0.098100\nvn 0.126700 0.991100 0.040000\nvn 0.131200 0.988300 0.077800\nvn -0.022100 0.996400 0.081400\nvn 0.339400 0.852700 0.397200\nvn 0.289500 0.953900 0.079700\nvn -0.157000 0.974900 0.157900\nvn 0.448900 0.882800 0.138200\nvn 0.723400 -0.657200 0.211500\nvn 0.832700 0.524800 0.176700\nvn 0.004900 0.906700 0.421600\nvn 0.091900 0.993200 0.071600\nvn -0.166900 0.965600 0.199300\nvn 0.179700 0.971700 -0.153500\nvn 0.066000 0.996300 -0.055700\nvn 0.368400 0.929600 0.012900\nvn -0.030800 0.988800 0.146100\nvn -0.030900 0.989000 0.144900\nvn 0.287800 0.957300 -0.026000\nvn 0.265800 0.964000 -0.007300\nvn 0.175900 0.973800 -0.144300\nvn 0.077800 0.990000 -0.117700\nvn -0.145700 0.974000 -0.173500\nvn -0.100600 0.992000 -0.076400\nvn -0.149000 0.983000 -0.106800\nvn -0.081900 0.996600 -0.006200\nvn -0.024500 0.998300 -0.052100\nvn -0.184700 0.977600 -0.100700\nvn -0.229100 0.963900 -0.135700\nvn -0.203800 0.976500 -0.069500\nvn -0.241400 0.967100 0.080700\nvn -0.401000 0.889300 -0.220000\nvn -0.275500 0.959400 -0.060500\nvn -0.297000 0.953300 0.054900\nvn -0.279600 0.958600 0.054100\nvn -0.026100 0.960300 0.277700\nvn -0.053700 0.927700 0.369500\nvn -0.219900 0.934100 0.281400\nvn -0.024600 0.896900 0.441500\nvn -0.263000 0.923900 0.277800\nvn -0.356700 0.902000 0.243100\nvn -0.084900 0.910800 0.404000\nvn 0.024700 0.895100 0.445200\nvn 0.142600 0.978100 0.151500\nvn -0.230300 0.963400 0.137100\nvn -0.077900 0.996100 0.040700\nvn -0.014300 0.983400 0.181000\nvn -0.058800 0.998000 -0.023400\nvn -0.087200 0.996200 0.004200\nvn 0.001700 0.998400 0.057400\nvn -0.132200 0.973400 0.187200\nvn -0.049500 0.998100 0.037400\nvn -0.142200 0.977100 0.158400\nvn -0.179500 0.979900 0.087100\nvn -0.163000 0.981100 0.104000\nvn 0.147200 0.986000 -0.078100\nvn -0.088800 0.993100 0.076900\nvn -0.241300 0.961400 0.132100\nvn 0.116100 0.993200 -0.012800\nvn 0.080800 0.922500 -0.377400\nvn -0.240900 0.917000 -0.318000\nvn -0.154300 0.946900 -0.282000\nvn -0.304700 0.943000 0.133500\nvn -0.178700 0.983600 0.024900\nvn 0.093400 0.959100 -0.267200\nvn 0.203800 0.947200 -0.247500\nvn 0.194800 0.889400 -0.413700\nvn -0.172600 0.978400 -0.114200\nvn -0.174100 0.980000 -0.096800\nvn -0.172900 0.965800 -0.193400\nvn -0.226700 0.972800 -0.048000\nvn -0.211800 0.959300 -0.186800\nvn -0.220600 0.974700 -0.036400\nvn -0.005500 0.999900 -0.014900\nvn 0.017400 0.999800 -0.007400\nvn 0.034200 0.995600 -0.086800\nvn 0.143000 0.980700 -0.133600\nvn 0.163700 0.968100 -0.189500\nvn 0.337700 0.939300 -0.061000\nvn 0.096600 0.971000 -0.218700\nvn -0.088500 0.942600 -0.321900\nvn 0.181100 0.931400 -0.315700\nvn 0.354800 0.933400 0.053700\nvn 0.160600 0.928400 -0.335100\nvn -0.007300 0.948600 -0.316200\nvn 0.347600 0.881400 0.320000\nvn 0.384500 0.917100 0.104800\nvn 0.380300 0.921200 0.082300\nvn 0.449900 0.824000 0.344300\nvn 0.338700 0.781000 0.524700\nvn 0.151200 0.901100 0.406300\nvn 0.478400 0.869000 0.126800\nvn 0.222700 0.935700 0.273600\nvn 0.232900 0.972400 0.014100\nvn 0.404300 0.877700 0.257200\nvn 0.429900 0.883400 0.186400\nvn 0.345900 0.905500 0.245700\nvn 0.432400 0.899000 0.070000\nvn 0.320900 0.937800 -0.132700\nvn 0.405300 0.909900 -0.087700\nvn 0.214700 0.945100 0.246400\nvn 0.279000 0.959900 -0.028600\nvn -0.125500 0.968300 -0.215900\nvn -0.120600 0.988700 -0.089600\nvn -0.198300 0.941900 0.270900\nvn -0.154300 0.970700 0.184100\nvn -0.120400 0.916400 0.381800\nvn -0.167400 0.975800 -0.140700\nvn -0.164700 0.985900 0.030700\nvn -0.243900 0.962800 0.116700\nvn -0.191700 0.976600 0.097900\nvn -0.387600 0.921700 -0.018300\nvn -0.391500 0.915800 0.090000\nvn -0.378800 0.899700 0.216900\nvn -0.311500 0.916900 0.249600\nvn -0.285100 0.950900 0.120700\nvn -0.365000 0.928000 -0.074000\nvn -0.216900 0.967000 -0.133700\nvn -0.233700 0.970500 0.060000\nvn -0.181300 0.964800 -0.190300\nvn -0.380400 0.914400 -0.138500\nvn -0.198500 0.971100 0.132700\nvn -0.182400 0.982200 -0.044800\nvn -0.469500 0.875200 -0.116500\nvn -0.395500 0.914300 -0.087600\nvn -0.495100 0.868800 -0.003400\nvn -0.013800 0.992200 0.123800\nvn 0.182800 0.964100 0.192500\nvn 0.122600 0.988300 0.090900\nvn 0.233500 0.970800 0.055300\nvn -0.036800 0.988700 0.145500\nvn -0.057200 0.965100 0.255400\nvn -0.123200 0.968000 0.218500\nvn 0.013400 0.954700 0.297100\nvn 0.042100 0.996600 0.070200\nvn 0.076500 0.973300 0.216500\nvn 0.309600 0.920700 0.237700\nvn 0.241500 0.926400 0.288800\nvn 0.342100 0.897000 0.280100\nvn -0.158800 0.972800 0.168900\nvn -0.112000 0.948900 0.295000\nvn -0.359800 0.888800 0.283900\nvn -0.033600 0.960000 0.277900\nvn 0.008000 0.959900 0.280300\nvn -0.303100 0.913100 0.272600\nvn -0.059600 0.970800 0.232500\nvn -0.198100 0.960600 0.195200\nvn -0.001500 0.999500 0.032800\nvn 0.111600 0.984500 0.135300\nvn 0.115500 0.986500 0.116000\nvn 0.073000 0.983700 0.164000\nvn 0.078500 0.996700 0.020500\nvn 0.055300 0.981000 -0.186000\nvn 0.135600 0.892000 -0.431300\nvn 0.120900 0.990100 -0.071800\nvn 0.128000 0.910700 -0.392700\nvn 0.087300 0.982100 -0.167200\nvn -0.053300 0.997900 -0.036800\nvn -0.091600 0.992400 0.081700\nvn 0.081900 0.976600 0.198900\nvn 0.038300 0.994200 0.100200\nvn 0.113400 0.991300 -0.067100\nvn 0.164800 0.983200 -0.079000\nvn 0.060600 0.955900 0.287400\nvn 0.054600 0.995700 -0.074900\nvn -0.016900 0.997500 -0.068800\nvn 0.118900 0.992300 0.034800\nvn 0.111800 0.993500 -0.020300\nvn 0.534900 0.844500 -0.025800\nvn -0.012400 0.956900 0.290000\nvn 0.158900 0.798400 0.580800\nvn 0.380600 0.779400 0.497600\nvn 0.863700 0.453000 0.221000\nvn 0.852800 0.438900 0.283000\nvn 0.582600 0.762800 0.280500\nvn 0.250600 0.953000 0.170200\nvn 0.244300 0.937300 0.248700\nvn 0.187500 0.944000 0.271300\nvn 0.305800 0.893100 0.330000\nvn 0.378200 0.843500 0.381400\nvn 0.275800 0.848500 0.451600\nvn 0.260400 0.908400 0.327000\nvn 0.139100 0.970100 0.198900\nvn -0.095800 0.993800 -0.055900\nvn -0.010700 0.997500 0.070000\nvn -0.017100 0.999400 0.031500\nvn -0.101100 0.992500 -0.069200\nvn -0.134500 0.982100 0.132200\nvn -0.123900 0.991900 -0.029700\nvn -0.126200 0.991300 0.037900\nvn -0.102100 0.994200 -0.034300\nvn -0.258600 0.966000 0.002500\nvn -0.493500 0.868600 -0.045200\nvn -0.447700 0.853900 -0.265500\nvn -0.469200 0.854100 -0.224300\nvn -0.656400 0.732300 -0.181200\nvn -0.415100 0.902300 -0.116300\nvn -0.410700 0.910500 -0.046900\nvn -0.394000 0.915400 0.082400\nvn -0.429500 0.878600 0.208800\nvn -0.421900 0.875700 0.234800\nvn -0.460500 0.816400 0.348500\nvn -0.103900 0.962500 -0.250500\nvn -0.066600 0.991800 -0.109300\nvn -0.091200 0.994500 -0.051200\nvn -0.178600 0.959600 0.217300\nvn -0.341400 0.855900 0.388400\nvn -0.482500 0.810300 0.332500\nvn -0.126400 0.991800 0.018800\nvn -0.358000 0.885900 0.295000\nvn 0.120500 0.959800 0.253600\nvn 0.252100 0.921000 -0.297000\nvn 0.283700 0.946400 -0.154400\nvn 0.361600 0.911500 -0.196100\nvn 0.174400 0.984600 0.014100\nvn 0.136900 0.976200 0.168200\nvn 0.003900 0.999200 0.039500\nvn 0.406700 0.898800 -0.163700\nvn 0.409700 0.898300 -0.158400\nvn 0.283700 0.954000 -0.097200\nvn 0.032500 0.998900 -0.033100\nvn -0.006500 0.997900 -0.065000\nvn -0.234000 0.970700 -0.055400\nvn -0.008000 0.990400 -0.137900\nvn -0.101600 0.993900 -0.043600\nvn -0.286000 0.955200 -0.076700\nvn -0.131700 0.979600 -0.151900\nvn 0.046400 0.998800 0.013900\nvn 0.316600 0.918900 0.235300\nvn 0.091500 0.993000 0.075300\nvn 0.153600 0.977700 0.143100\nvn 0.162200 0.969100 0.185600\nvn 0.174500 0.977900 0.114800\nvn 0.165700 0.968700 0.184700\nvn 0.036900 0.993400 0.108600\nvn 0.102100 0.994500 0.023000\nvn 0.074300 0.990500 0.116000\nvn 0.067400 0.992400 0.102900\nvn 0.038200 0.997800 -0.054400\nvn -0.039500 0.996600 0.071900\nvn 0.022400 0.999000 0.039300\nvn 0.017100 0.995200 0.096900\nvn 0.036300 0.993500 0.108300\nvn -0.021900 0.994300 0.104000\nvn 0.223000 0.968300 0.112800\nvn 0.125700 0.989600 0.069600\nvn 0.267500 0.963500 0.008200\nvn -0.131700 0.918300 -0.373400\nvn -0.060400 0.954500 -0.292100\nvn -0.014300 0.981100 -0.193200\nvn 0.002000 0.967400 -0.253100\nvn 0.065400 0.995100 -0.073900\nvn 0.256000 0.965300 0.051400\nvn 0.084400 0.995400 -0.045700\nvn 0.316100 0.922500 0.221500\nvn 0.392000 0.878200 0.274100\nvn 0.133400 0.991000 -0.006100\nvn 0.436200 0.886300 -0.155600\nvn 0.381900 0.918500 -0.102800\nvn 0.437100 0.899300 0.013400\nvn 0.338000 0.926300 0.166300\nvn 0.275000 0.960200 0.049100\nvn 0.270500 0.959800 -0.075200\nvn 0.282900 0.957600 0.055000\nvn 0.280000 0.955600 0.091800\nvn 0.224200 0.962400 0.153600\nvn 0.120600 0.990500 -0.066500\nvn 0.169600 0.984100 -0.052500\nvn 0.093500 0.991200 -0.094100\nvn 0.083100 0.995700 0.039800\nvn 0.029800 0.994900 -0.096300\nvn 0.074800 0.996100 -0.046500\nvn 0.010000 0.987400 -0.158000\nvn -0.186500 0.954700 -0.231900\nvn -0.351400 0.928000 0.123600\nvn -0.300600 0.919800 0.252200\nvn -0.296300 0.940600 0.165900\nvn -0.299300 0.954100 -0.005800\nvn -0.387300 0.875700 -0.288300\nvn -0.539400 0.762600 -0.357200\nvn -0.549000 0.826600 -0.123600\nvn -0.569700 0.720400 -0.395500\nvn -0.555800 0.769100 -0.315400\nvn -0.180400 0.981500 -0.063500\nvn -0.170500 0.974800 -0.143900\nvn -0.145200 0.987600 -0.060300\nvn -0.101500 0.950000 -0.295200\nvn -0.048500 0.943400 -0.328000\nvn 0.204400 0.870700 -0.447300\nvn 0.222700 0.921300 -0.318700\nvn 0.293600 0.788800 -0.540000\nvn -0.183000 0.921100 -0.343700\nvn -0.251000 0.954500 -0.160800\nvn -0.274500 0.961100 -0.031300\nvn 0.171200 0.985000 -0.021400\nvn -0.288600 0.953800 -0.083400\nvn -0.296400 0.938600 -0.176600\nvn 0.257000 0.955600 -0.144000\nvn 0.168200 0.980900 -0.097700\nvn 0.149500 0.975800 -0.159800\nvn 0.200000 0.974000 -0.106100\nvn -0.185300 0.982400 0.022100\nvn -0.181700 0.963000 0.198800\nvn -0.212700 0.976800 0.025200\nvn -0.077300 0.993400 0.084700\nvn -0.010400 0.998000 -0.062600\nvn -0.303700 0.950800 -0.061600\nvn -0.179200 0.976700 -0.118500\nvn -0.198900 0.976600 -0.081300\nvn -0.001300 0.998500 -0.055100\nvn 0.024100 0.999600 0.017200\nvn 0.025700 0.998900 -0.038800\nvn 0.104600 0.993200 -0.050300\nvn 0.041800 0.989000 -0.141900\nvn 0.036000 0.999000 -0.027300\nvn 0.054100 0.998200 -0.024700\nvn 0.012400 0.987100 -0.159400\nvn 0.075400 0.996700 0.029900\nvn 0.109600 0.990200 0.086900\nvn 0.164700 0.986300 -0.011900\nvn 0.142700 0.988600 -0.048300\nvn 0.491700 0.870100 0.035800\nvn 0.352700 0.934300 0.051200\nvn 0.252200 0.967700 0.006600\nvn 0.231500 0.954500 -0.187800\nvn 0.138700 0.981000 -0.135700\nvn 0.011400 0.943800 -0.330500\nvn -0.071500 0.948700 -0.308000\nvn -0.029000 0.964000 -0.264500\nvn -0.052200 0.916400 -0.396900\nvn -0.208500 0.924100 -0.320100\nvn -0.029100 0.875000 -0.483300\nvn -0.086800 0.904100 -0.418300\nvn -0.162500 0.895400 -0.414400\nvn -0.180600 0.929500 -0.321600\nvn -0.096800 0.926100 -0.364600\nvn 0.305700 0.947600 -0.092500\nvn 0.031600 0.915100 -0.402000\nvn 0.025400 0.892600 -0.450100\nvn -0.028500 0.849200 -0.527300\nvn -0.149200 0.959400 -0.239400\nvn 0.113500 0.984100 0.136600\nvn 0.121000 0.960800 0.249300\nvn 0.249100 0.962000 -0.112100\nvn 0.215200 0.948000 0.234400\nvn 0.220600 0.948200 0.228600\nvn -0.324900 0.944500 0.047900\nvn -0.210700 0.972800 0.096800\nvn 0.309300 0.946100 0.096000\nvn 0.190300 0.966900 0.169900\nvn 0.225900 0.931200 0.286100\nvn 0.332100 0.929200 0.162500\nvn 0.625100 0.774400 -0.097700\nvn 0.360400 0.880400 -0.308300\nvn -0.176700 0.959100 -0.221200\nvn -0.347900 0.897300 0.271800\nvn -0.325100 0.824400 0.463300\nvn -0.392900 0.811300 0.432900\nvn -0.389500 0.909500 0.145000\nvn -0.424300 0.905200 -0.023400\nvn -0.479200 0.876100 0.053200\nvn -0.319200 0.945500 0.064600\nvn -0.398200 0.915300 0.060300\nvn -0.193400 0.979200 -0.061100\nvn -0.386500 0.908600 0.158200\nvn -0.216700 0.946300 0.240000\nvn -0.131300 0.970900 0.200400\nvn -0.167600 0.974900 0.146600\nvn -0.211000 0.977400 0.009500\nvn -0.269400 0.961000 0.062500\nvn -0.006700 0.998700 0.050000\nvn -0.010900 0.993500 -0.113000\nvn -0.047800 0.990300 -0.130200\nvn -0.020100 0.988500 -0.149700\nvn -0.082800 0.996000 -0.033000\nvn -0.084200 0.987400 -0.134000\nvn -0.108700 0.993000 0.046200\nvn -0.142300 0.982300 -0.122200\nvn -0.070400 0.994400 -0.079000\nvn -0.142700 0.988900 -0.042200\nvn -0.054100 0.998500 0.002400\nvn -0.168900 0.985200 0.030300\nvn -0.051800 0.980300 -0.190700\nvn -0.031800 0.946100 -0.322300\nvn 0.005000 0.963100 -0.269300\nvn -0.109700 0.985700 -0.128200\nvn -0.107400 0.993800 0.027700\nvn 0.181900 0.982900 0.027000\nvn 0.097400 0.989700 0.105100\nvn 0.102500 0.993900 0.040900\nvn -0.054200 0.998500 -0.002000\nvn -0.210100 0.741400 0.637300\nvn -0.160700 0.945300 0.283800\nvn -0.419800 0.878900 0.226300\nvn -0.135000 0.984800 0.109200\nvn -0.052600 0.994800 0.087600\nvn -0.274400 0.913300 0.301000\nvn -0.140900 0.943200 0.300900\nvn -0.056500 0.941100 0.333300\nvn 0.062400 0.963900 0.258900\nvn 0.376200 0.915000 -0.145800\nvn 0.382100 0.923600 -0.029400\nvn 0.168900 0.983500 -0.065300\nvn 0.255400 0.944600 0.206200\nvn 0.218600 0.963500 0.154300\nvn 0.275500 0.930800 0.240400\nvn 0.276000 0.917400 0.286800\nvn 0.285200 0.923200 0.257400\nvn 0.455600 0.882200 0.118700\nvn -0.160600 0.978800 0.126900\nvn -0.090100 0.989000 0.117400\nvn 0.133700 0.990800 0.021800\nvn -0.100200 0.993200 0.058600\nvn -0.003800 0.999900 -0.015900\nvn -0.081800 0.994400 -0.066500\nvn 0.047600 0.997300 -0.056300\nvn -0.218900 0.948500 -0.228900\nvn -0.201400 0.950900 -0.234800\nvn -0.399700 0.909400 0.114800\nvn -0.333500 0.936200 0.110600\nvn -0.263900 0.939100 0.220100\nvn -0.149700 0.987400 0.051300\nvn -0.137300 0.982200 -0.128200\nvn 0.020600 0.999700 0.011800\nvn -0.026400 0.971100 0.237400\nvn -0.015300 0.997800 0.064900\nvn -0.218000 0.975900 0.005800\nvn 0.269700 0.961300 0.055400\nvn 0.229900 0.970600 0.071500\nvn 0.248700 0.968200 0.026000\nvn 0.157000 0.983800 -0.086300\nvn -0.204400 0.976700 -0.066000\nvn 0.242600 0.966200 -0.087400\nvn 0.141300 0.989600 -0.025100\nvn 0.229900 0.970700 0.069600\nvn -0.127900 0.982100 0.138400\nvn 0.104500 0.970400 -0.217600\nvn -0.287600 0.953200 -0.092700\nvn 0.107000 0.954300 -0.279100\nvn -0.480100 0.862200 0.161600\nvn -0.397100 0.895600 0.200500\nvn -0.323200 0.932900 0.159100\nvn 0.310000 0.903600 -0.295700\nvn 0.093200 0.980000 -0.175900\nvn -0.058500 0.987800 -0.144700\nvn -0.667100 0.734200 0.126000\nvn -0.469700 0.869500 -0.153100\nvn -0.490900 0.868800 -0.064400\nvn -0.400200 0.884200 -0.241000\nvn -0.407500 0.905800 0.116300\nvn -0.300400 0.953500 0.022500\nvn -0.140300 0.947400 -0.287700\nvn 0.018900 0.983400 -0.180500\nvn -0.008400 0.988000 -0.154000\nvn 0.133900 0.989600 0.051700\nvn 0.030200 0.985300 -0.167900\nvn 0.068000 0.944700 -0.320700\nvn 0.003900 0.959100 -0.283100\nvn 0.024000 0.985400 -0.168800\nvn 0.030500 0.973700 -0.225700\nvn 0.087100 0.810800 -0.578900\nvn 0.002300 0.943100 -0.332500\nvn -0.039500 0.954500 -0.295600\nvn -0.229100 0.970600 -0.073500\nvn -0.248900 0.950700 -0.184900\nvn -0.354600 0.930900 -0.087600\nvn -0.181700 0.928900 -0.322600\nvn -0.058000 0.984200 -0.167400\nvn -0.080700 0.996500 0.023600\nvn -0.353200 0.932600 0.074100\nvn -0.394100 0.885600 0.245900\nvn -0.348100 0.722200 0.597800\nvn -0.097800 0.819100 -0.565200\nvn -0.199300 0.854700 -0.479400\nvn 0.069500 0.961500 -0.265900\nvn -0.262000 0.943300 -0.203700\nvn -0.267900 0.609500 0.746200\nvn 0.057000 0.975000 0.214800\nvn 0.189300 0.906800 -0.376700\nvn 0.064200 0.943000 -0.326400\nvn 0.239700 0.931900 -0.272000\nvn 0.467900 0.883700 0.010800\nvn 0.486400 0.873700 0.007900\nvn 0.282600 0.958300 -0.042500\nvn 0.448500 0.860500 -0.241500\nvn 0.472400 0.879700 -0.053600\nvn 0.167400 0.951100 -0.259700\nvn 0.057100 0.965500 -0.254100\nvn 0.109600 0.970900 -0.212900\nvn 0.267400 0.952600 -0.145300\nvn -0.992200 0.054900 -0.111900\nvn -0.721900 0.682300 0.115500\nvn -0.338800 0.885600 0.317600\nvn -0.330100 0.940500 0.080800\nvn -0.334200 0.942500 -0.004000\nvn -0.107500 0.980600 0.164200\nvn 0.061300 0.956700 0.284400\nvn 0.202500 0.960000 0.193400\nvn 0.089100 0.941000 0.326400\nvn 0.009800 0.979300 0.202100\nvn -0.002000 0.969200 0.246300\nvn -0.102100 0.981100 0.164300\nvn 0.046800 0.922400 0.383400\nvn -0.092700 0.957100 0.274500\nvn -0.390300 0.918400 0.064300\nvn -0.281300 0.959400 0.018000\nvn -0.336600 0.941300 -0.024700\nvn 0.110100 0.993900 -0.000200\nvn 0.150300 0.982300 -0.111500\nvn 0.224700 0.971100 -0.080200\nvn -0.353100 0.886500 0.298900\nvn 0.328700 0.943500 -0.041700\nvn 0.340000 0.940200 -0.022800\nvn 0.316200 0.948400 -0.025400\nvn -0.512700 0.707400 0.486500\nvn 0.384000 0.923300 0.006800\nvn -0.005700 0.996200 0.087300\nvn 0.213200 0.924900 0.314800\nvn 0.265000 0.834900 0.482300\nvn 0.267800 0.818300 0.508600\nvn 0.422900 0.857500 0.293100\nvn 0.351400 0.931500 -0.093700\nvn 0.332500 0.922900 -0.193900\nvn -0.382400 0.894900 0.230000\nvn -0.275100 0.956600 0.096300\nvn -0.746900 0.577700 0.329200\nvn -0.262700 0.880300 -0.394900\nvn -0.286700 0.922400 -0.258900\nvn -0.188400 0.927600 -0.322600\nvn -0.507600 0.859000 0.066500\nvn -0.686200 0.660100 0.305600\nvn -0.332400 0.863600 0.379100\nvn 0.071500 0.997400 -0.006700\nvn 0.097000 0.874900 0.474500\nvn 0.237300 0.828600 0.507100\nvn -0.046100 0.996300 -0.072100\nvn 0.077000 0.997000 -0.004700\nvn 0.171000 0.985200 0.010500\nvn 0.196500 0.926000 0.322500\nvn 0.213900 0.803300 0.555900\nvn 0.120300 0.694400 0.709500\nvn 0.067500 0.991200 0.114200\nvn -0.119300 0.457900 0.881000\nvn -0.251500 0.350000 0.902400\nvn -0.207700 0.976900 -0.050600\nvn -0.247500 0.968000 -0.041700\nvn -0.107500 0.991200 -0.077100\nvn -0.162900 0.984900 -0.058700\nvn -0.254000 0.476600 0.841600\nvn -0.039100 0.655700 -0.754000\nvn 0.033200 0.815900 -0.577200\nvn -0.022900 0.523500 -0.851700\nvn -0.087100 0.485300 -0.870000\nvn -0.315900 0.919300 -0.234700\nvn -0.363200 0.931100 -0.032600\nvn -0.195200 0.979000 -0.058700\nvn -0.300300 0.943700 -0.138400\nvn -0.042500 0.793000 -0.607700\nvn -0.008700 0.926400 -0.376500\nvn 0.168500 0.982700 -0.077500\nvn 0.109300 0.938900 -0.326300\nvn 0.175100 0.918600 -0.354200\nvn 0.309100 0.888100 -0.340100\nvn 0.075100 0.903300 -0.422400\nvn 0.081400 0.748100 -0.658500\nvn -0.137600 0.906300 -0.399600\nvn 0.152600 0.956900 -0.247200\nvn 0.145100 0.981700 -0.123600\nvn -0.102000 0.759600 -0.642300\nvn 0.220500 0.975400 -0.007400\nvn 0.424800 0.903900 0.050800\nvn -0.104200 0.966100 -0.236400\nvn 0.046600 0.996900 0.063500\nvn 0.217800 0.957300 0.190000\nvn 0.080000 0.993000 -0.086700\nvn 0.034000 0.999300 -0.012400\nvn -0.188400 0.898200 0.397200\nvn -0.514400 0.856300 -0.046200\nvn -0.026900 0.964600 -0.262400\nvn -0.043600 0.998200 0.041000\nvn 0.011300 0.999500 -0.028600\nvn 0.096300 0.962700 -0.253000\nvn -0.221600 0.970700 -0.092900\nvn -0.262600 0.919700 0.291800\nvn -0.138600 0.982900 0.121600\nvn -0.186700 0.954700 0.231700\nvn -0.213400 0.974800 0.064800\nvn 0.034000 0.993700 -0.106700\nvn 0.149900 0.951000 -0.270300\nvn 0.194900 0.949600 0.245600\nvn -0.134200 0.957800 -0.254000\nvn -0.402300 0.895900 -0.188500\nvn 0.009900 0.996400 -0.083700\nvn 0.257400 0.949100 0.181400\nvn 0.237900 0.960200 0.146300\nvn -0.126300 0.991600 0.027800\nvn 0.079000 0.947600 -0.309600\nvn -0.010800 0.976500 -0.215300\nvn 0.505600 0.841900 0.188500\nvn -0.075000 0.985500 0.152300\nvn -0.476400 0.879000 0.019000\nvn -0.124900 0.987100 0.100100\nvn 0.127800 0.946300 0.297000\nvn 0.367700 0.928100 0.058200\nvn 0.313900 0.903200 0.292700\nvn 0.055100 0.974000 0.220000\nvn 0.093000 0.995000 -0.037400\nvn 0.386700 0.853600 0.349000\nvn 0.296700 0.937400 0.182600\nvn -0.181200 0.965300 -0.187800\nvn -0.362700 0.814700 -0.452500\nvn 0.189400 0.947000 -0.259400\nvn 0.195800 0.973100 -0.121500\nvn -0.000600 0.998500 0.054400\nvn 0.110200 0.981900 0.154100\nvn 0.105900 0.987400 -0.117500\nvn 0.318000 0.859000 -0.401300\nvn 0.198800 0.950800 0.237700\nvn -0.291000 0.955700 0.044900\nvn -0.377800 0.916900 0.128500\nvn -0.308800 0.950700 0.027100\nvn -0.165400 0.984700 0.054900\nvn -0.059400 0.994900 -0.081700\nvn -0.047700 0.988000 0.147200\nvn 0.138200 0.980100 0.142300\nvn -0.164800 0.911600 -0.376500\nvn -0.249300 0.942300 -0.223500\nvn -0.060200 0.975300 0.212400\nvn -0.170900 0.984200 0.045700\nvn 0.042300 0.997700 -0.053900\nvn -0.074200 0.980900 -0.179900\nvn -0.264000 0.962800 -0.057600\nvn 0.205100 0.975900 0.075000\nvn 0.393000 0.870200 -0.297200\nvn 0.015100 0.969400 0.245000\nvn 0.105800 0.991500 0.075200\nvn -0.075700 0.997100 -0.003300\nvn 0.216200 0.954300 -0.206100\nvn 0.193300 0.916600 0.349900\nvn -0.157800 0.987400 -0.014900\nvn -0.119100 0.919700 -0.374000\nvn 0.166000 0.911900 -0.375200\nvn 0.424700 0.904700 0.034200\nvn 0.001300 0.954000 0.299800\nvn 0.193500 0.958100 -0.211300\nvn -0.239800 0.958500 0.154300\nvn -0.246000 0.960100 0.132800\nvn -0.111900 0.942300 -0.315500\nvn -0.065000 0.989600 0.128400\nvn -0.146900 0.978900 -0.142100\nvn 0.220900 0.847000 -0.483600\nvn -0.083700 0.974100 -0.209900\nvn -0.299700 0.946200 -0.122200\nvn -0.173000 0.980100 -0.097100\nvn 0.276600 0.958000 0.075300\nvn -0.008500 0.996000 -0.088900\nvn -0.034600 0.995800 0.085000\nvn 0.112500 0.993600 0.007600\nvn -0.078800 0.996100 0.040900\nvn 0.112400 0.960800 0.253400\nvn 0.255200 0.943700 0.210300\nvn 0.282900 0.940300 0.189500\nvn 0.324500 0.934200 0.148400\nvn 0.216500 0.811300 -0.543000\nvn -0.145600 0.938800 -0.312100\nvn 0.055600 0.743700 -0.666200\nvn 0.203500 0.896700 0.393000\nvn 0.102900 0.872800 0.477200\nvn 0.179200 0.981100 -0.072500\nvn 0.014700 0.652500 -0.757600\nvn -0.335300 0.940100 0.061600\nvn -0.204800 0.311300 -0.928000\nvn -0.236500 0.396000 -0.887300\nvn -0.163000 0.980200 -0.112200\nvn -0.093400 0.853300 0.513000\nvn -0.287500 0.920000 0.266500\nvn 0.151800 0.988300 0.012500\nvn 0.124000 0.982300 -0.140300\nvn 0.045500 0.971200 -0.234000\nvn 0.721500 0.688200 -0.076900\nvn 0.236000 0.971400 -0.027600\nvn -0.039300 0.995000 -0.091800\nvn -0.192300 0.967900 0.162000\nvn -0.306000 0.946800 -0.099200\nvn 0.019000 0.973900 -0.226200\nvn -0.180800 0.953200 -0.242400\nvn -0.091200 0.957200 -0.274800\nvn 0.031500 0.967400 -0.251200\nvn 0.064700 0.912000 0.405000\nvn 0.244800 0.968700 0.041300\nvn -0.143700 0.984100 0.104100\nvn -0.076900 0.934400 0.347800\nvn -0.246300 0.950700 0.188200\nvn -0.200000 0.973300 0.112400\nvn -0.073400 0.987300 0.140600\nvn -0.041500 0.951300 0.305500\nvn 0.222900 0.837900 0.498300\nvn -0.348000 0.855500 0.383500\nvn -0.379700 0.880900 0.282600\nvn -0.343700 0.868800 0.356500\nvn 0.011200 0.988600 -0.150400\nvn -0.063300 0.976000 0.208400\nvn -0.014100 0.984300 0.175700\nvn 0.234500 0.952100 -0.196300\nvn 0.225900 0.951400 0.209200\nvn 0.107300 0.993500 0.037700\nvn -0.263000 0.910600 0.318700\nvn 0.894300 0.399400 0.201700\nvn -0.165700 0.908400 0.383900\nvn 0.405300 0.909800 -0.089000\nvn 0.367400 0.897900 0.242600\nvn 0.009800 0.994200 -0.107100\nvn -0.177900 0.966200 -0.186600\nvn -0.145300 0.989200 -0.019300\nvn -0.400700 0.903000 -0.155000\nvn -0.233100 0.956600 -0.174800\nvn 0.095300 0.993600 0.060500\nvn -0.131900 0.946900 0.293100\nvn 0.006100 0.962500 0.271200\nvn 0.052500 0.986200 0.157100\nvn -0.097300 0.976500 0.192400\nvn 0.068200 0.995500 0.065300\nvn -0.166900 0.972500 0.162500\nvn -0.407000 0.912000 -0.051700\nvn -0.252500 0.966900 -0.037500\nvn -0.196500 0.940000 -0.279000\nvn 0.199800 0.932100 -0.301900\nvn -0.052800 0.996700 -0.062100\nvn -0.220100 0.974200 -0.050400\nvn 0.086100 0.996100 -0.019200\nvn 0.144200 0.980500 -0.133700\nvn 0.259300 0.948800 -0.180400\nvn -0.218700 0.975300 -0.030600\nvn 0.239300 0.923000 0.301300\nvn 0.275000 0.920300 0.278100\nvn 0.496500 0.858100 0.131100\nvn 0.303800 0.911200 0.278200\nvn 0.340000 0.939100 0.050700\nvn -0.185800 0.973900 0.130500\nvn -0.127000 0.987800 -0.089800\nvn -0.106100 0.914500 0.390500\nvn -0.391700 0.919100 0.041400\nvn -0.233000 0.969900 0.070500\nvn -0.197800 0.968300 0.152600\nvn -0.504000 0.863200 0.028900\nvn -0.454300 0.882800 0.119400\nvn -0.467300 0.878700 -0.097300\nvn 0.202900 0.959800 0.194000\nvn 0.056400 0.987600 0.146800\nvn -0.118100 0.952700 0.280100\nvn 0.346200 0.909500 0.230200\nvn -0.384200 0.911900 0.144400\nvn -0.301500 0.916600 0.262700\nvn -0.022800 0.972900 0.230200\nvn 0.080700 0.988200 0.130300\nvn 0.078900 0.996700 0.020500\nvn -0.205000 0.978500 -0.021700\nvn -0.016300 0.999600 -0.025100\nvn 0.081200 0.992000 0.096600\nvn 0.027200 0.958300 0.284400\nvn 0.254900 0.966400 0.034500\nvn 0.477500 0.832300 0.281600\nvn 0.593000 0.768100 0.241600\nvn 0.221100 0.962100 0.159500\nvn 0.205600 0.925500 0.318100\nvn 0.215300 0.920400 0.326300\nvn 0.045200 0.996700 0.066800\nvn -0.190500 0.971900 0.138200\nvn -0.290400 0.956700 -0.021300\nvn -0.536700 0.806500 -0.248000\nvn -0.649600 0.750300 -0.123100\nvn -0.455200 0.865700 0.208000\nvn 0.006000 0.970000 -0.242900\nvn -0.394100 0.895200 0.208000\nvn 0.055300 0.998500 0.002700\nvn 0.398800 0.858900 -0.321500\nvn 0.426000 0.902500 -0.063600\nvn 0.280200 0.952400 -0.120000\nvn -0.303400 0.950100 -0.071700\nvn -0.281300 0.954400 -0.099400\nvn 0.027600 0.990400 -0.135600\nvn 0.052000 0.996300 0.068400\nvn 0.160900 0.980500 0.112500\nvn 0.090500 0.995700 0.021900\nvn 0.248600 0.966800 -0.059300\nvn -0.053000 0.994600 0.088700\nvn 0.274200 0.955300 0.110600\nvn -0.146800 0.914900 -0.376100\nvn -0.032500 0.966800 -0.253300\nvn 0.323600 0.946000 -0.019300\nvn 0.369800 0.928700 -0.025400\nvn 0.358400 0.933500 0.008100\nvn 0.185400 0.979300 -0.081600\nvn 0.245800 0.957400 0.151300\nvn 0.160500 0.983200 -0.086800\nvn -0.194800 0.978600 -0.067000\nvn -0.370100 0.919900 0.130000\nvn -0.456100 0.889900 -0.002700\nvn -0.626200 0.774200 -0.092300\nvn -0.144500 0.986500 -0.077300\nvn 0.186500 0.918800 -0.347900\nvn -0.166600 0.962900 -0.212400\nvn -0.087300 0.981300 -0.171600\nvn 0.155000 0.982900 -0.099600\nvn 0.005300 0.991800 -0.127700\nvn 0.213100 0.974800 0.065300\nvn -0.208200 0.975300 0.073600\nvn -0.031100 0.989000 -0.144800\nvn -0.005500 0.999900 0.012400\nvn 0.072100 0.986600 -0.146300\nvn 0.073300 0.985000 -0.155900\nvn 0.207000 0.978000 -0.024900\nvn 0.495700 0.866100 0.064100\nvn -0.074700 0.978200 -0.193700\nvn -0.127200 0.960100 -0.248900\nvn -0.167600 0.878700 -0.446900\nvn -0.022200 0.941900 -0.335200\nvn 0.064500 0.912100 -0.404900\nvn -0.002400 0.972800 -0.231700\nvn 0.120800 0.981800 -0.146600\nvn 0.316500 0.946600 -0.062200\nvn 0.332300 0.926400 0.177200\nvn -0.099800 0.988300 0.115500\nvn -0.385100 0.877300 0.286400\nvn -0.466500 0.868500 0.167600\nvn -0.192600 0.979400 0.061300\nvn -0.233300 0.968300 0.089400\nvn -0.191000 0.969600 0.152700\nvn -0.006200 0.998700 0.049900\nvn 0.021000 0.987400 -0.157100\nvn -0.050400 0.998000 0.037200\nvn -0.201600 0.978900 -0.034900\nvn -0.024600 0.982700 -0.183300\nvn 0.162300 0.966400 -0.199200\nvn -0.016800 0.996100 0.086600\nvn -0.285600 0.700200 0.654400\nvn -0.410600 0.911600 0.021200\nvn 0.054300 0.956900 0.285400\nvn 0.205800 0.965700 -0.158500\nvn 0.163700 0.962400 0.216900\nvn 0.634500 0.742800 0.213600\nvn 0.134400 0.988200 0.073800\nvn 0.063700 0.995600 0.068200\nvn -0.254600 0.958800 -0.126000\nvn -0.423400 0.897800 0.121500\nvn -0.295600 0.954200 0.045100\nvn -0.137400 0.960300 0.242700\nvn 0.238800 0.969200 0.060000\nvn 0.247900 0.963800 -0.097900\nvn -0.118200 0.993000 -0.000200\nvn 0.093000 0.972000 -0.215900\nvn -0.314300 0.943200 0.107600\nvn -0.060900 0.981200 -0.183300\nvn -0.381400 0.906400 0.181700\nvn -0.433000 0.875700 -0.213700\nvn -0.122500 0.947700 -0.294900\nvn 0.181600 0.979000 0.092900\nvn 0.018700 0.956400 -0.291600\nvn 0.046600 0.824900 -0.563400\nvn -0.401200 0.910100 0.103300\nvn -0.233500 0.912800 -0.335200\nvn -0.431900 0.900800 0.043700\nvn -0.002900 0.863100 -0.505100\nvn 0.019700 0.951100 -0.308100\nvn 0.266400 0.900900 -0.342500\nvn 0.226200 0.973800 -0.025200\nvn 0.070900 0.932500 -0.354100\nvn 0.075500 0.964700 -0.252500\nvn -0.899900 0.434700 0.035600\nvn -0.475800 0.876500 0.073200\nvn -0.093200 0.942700 0.320200\nvn -0.110600 0.967500 0.227200\nvn -0.165900 0.907900 0.385000\nvn 0.205000 0.978200 0.034000\nvn -0.198100 0.979900 0.024600\nvn 0.320800 0.946200 -0.041300\nvn -0.249200 0.850700 0.462900\nvn 0.445100 0.850500 0.280300\nvn 0.221900 0.922100 0.317000\nvn -0.725300 0.635600 0.264500\nvn -0.058800 0.934000 -0.352300\nvn -0.197900 0.969700 0.143200\nvn 0.106800 0.994300 0.000500\nvn 0.140400 0.990000 -0.016800\nvn 0.137400 0.937800 0.318800\nvn -0.148200 0.987600 0.050700\nvn -0.111800 0.992600 -0.048300\nvn -0.195100 0.979300 -0.054000\nvn -0.103200 0.832000 -0.545200\nvn -0.224000 0.939200 -0.260400\nvn -0.068000 0.969900 -0.233600\nvn 0.507500 0.856600 -0.093500\nvn 0.153900 0.955500 -0.251600\nvn -0.065600 0.910800 -0.407700\nvn 0.326800 0.785000 -0.526300\nvn -0.266300 0.944800 -0.190900\nvn 0.007000 0.950200 -0.311500\nvn 0.022700 0.988200 -0.151600\nvn -0.136900 0.989500 0.046400\nvn -0.138900 0.988800 -0.053900\nvn 0.005500 0.996200 -0.087500\nvn 0.048800 0.997600 0.049000\nvn 0.128600 0.991000 0.035900\nvn 0.208000 0.963600 0.168000\nvn 0.197700 0.974400 0.106600\nvn 0.206300 0.971700 0.115200\nvn 0.129400 0.982900 -0.131100\nvn -0.083800 0.936400 -0.340900\nvn -0.026700 0.991900 -0.124200\nvn 0.167300 0.892400 0.419000\nvn -0.087600 0.885700 0.455900\nvn -0.028000 0.994700 0.098900\nvn -0.280800 0.959400 -0.027300\nvn -0.316600 0.947800 -0.037400\nvn -0.310600 0.883900 -0.349800\nvn -0.498500 0.800000 -0.333900\nvn -0.075200 0.957600 -0.278000\nvn -0.191700 0.956500 0.219900\nvn -0.114400 0.993400 0.010000\nvn 0.103000 0.992600 0.063900\nvn 0.089200 0.995700 0.024800\nvn -0.045100 0.992100 -0.116900\nvn 0.071400 0.991500 -0.109000\nvn 0.176000 0.978700 -0.106100\nvn 0.042800 0.997000 -0.064000\nvn -0.010300 0.996500 -0.082900\nvn -0.208200 0.974100 -0.088700\nvn 0.044200 0.960200 -0.275900\nvn -0.204500 0.962600 -0.177800\nvn -0.143300 0.940300 -0.308800\nvn -0.064300 0.963700 -0.259200\nvn -0.021300 0.914600 0.403800\nvn -0.006800 0.986100 0.166000\nvn -0.246900 0.958900 0.140000\nvn -0.047600 0.958800 0.280000\nvn -0.261200 0.938500 0.225800\nvn -0.158000 0.969600 0.187000\nvn -0.074300 0.978500 0.192500\nvn -0.067900 0.966200 0.248600\nvn 0.039900 0.954000 0.297200\nvn -0.174400 0.953100 0.247500\nvn -0.104200 0.883700 0.456300\nvn -0.147700 0.934400 0.324100\nvn 0.106700 0.989800 -0.094800\nvn 0.119800 0.986600 0.110700\nvn -0.008300 0.998200 0.059300\nvn 0.206500 0.948000 -0.242400\nvn 0.315400 0.948800 0.015900\nvn 0.193400 0.980300 -0.040400\nvn -0.075500 0.955500 0.285100\nvn -0.300300 0.946100 0.121200\nvn -0.061900 0.970200 0.234300\nvn 0.269700 0.950500 -0.154500\nvn 0.324100 0.945900 -0.017000\nvn -0.098400 0.961900 -0.255000\nvn -0.179900 0.975300 -0.128400\nvn -0.157100 0.981600 -0.108100\nvn -0.408600 0.896000 -0.173800\nvn -0.166500 0.968400 -0.185500\nvn -0.132000 0.988800 0.069200\nvn -0.011600 0.977700 0.209600\nvn -0.014900 0.957500 0.288000\nvn -0.035700 0.893800 0.447000\nvn -0.066400 0.892900 0.445300\nvn 0.322200 0.935700 0.143900\nvn 0.147300 0.988900 0.020500\nvn -0.022000 0.991200 -0.130600\nvn -0.242700 0.969800 -0.022900\nvn 0.084800 0.914400 -0.395900\nvn 0.108600 0.966800 -0.231500\nvn 0.117200 0.960000 -0.254300\nvn 0.024100 0.986000 -0.165100\nvn 0.167800 0.965400 -0.199600\nvn 0.052000 0.986800 -0.153400\nvn -0.035800 0.997300 -0.063700\nvn 0.034200 0.999200 -0.018800\nvn 0.425100 0.853200 0.302400\nvn 0.487200 0.866000 0.112200\nvn 0.490800 0.869900 0.048500\nvn 0.149500 0.930100 0.335600\nvn 0.047200 0.971000 0.234300\nvn -0.197800 0.941600 0.272400\nvn -0.274300 0.958800 -0.073500\nvn -0.150900 0.971200 0.184100\nvn -0.376200 0.914500 0.149200\nvn -0.088200 0.993300 0.074700\nvn -0.355200 0.901000 0.249200\nvn -0.390300 0.905900 0.164200\nvn -0.391900 0.912200 0.120000\nvn -0.269400 0.961600 -0.052000\nvn 0.119500 0.964700 0.234700\nvn 0.383800 0.922400 0.042200\nvn 0.309800 0.921300 0.234900\nvn 0.356100 0.911600 0.205300\nvn 0.111500 0.965500 0.235300\nvn 0.211000 0.914900 0.344200\nvn 0.109100 0.947400 0.300800\nvn 0.102000 0.978800 0.177500\nvn 0.127500 0.980100 0.152100\nvn -0.058800 0.976400 0.208000\nvn 0.126300 0.991100 0.041500\nvn 0.016400 0.981500 0.190700\nvn 0.027700 0.989500 0.142000\nvn 0.303100 0.941300 0.148700\nvn 0.521600 0.852900 -0.024100\nvn 0.535400 0.824900 0.181400\nvn 0.309900 0.939700 0.144800\nvn 0.298400 0.916100 0.267900\nvn 0.205500 0.935200 0.288400\nvn 0.013900 0.994000 -0.108200\nvn -0.102800 0.992300 -0.068400\nvn -0.293000 0.949700 -0.111000\nvn -0.613400 0.701800 -0.362300\nvn -0.707600 0.685800 -0.170400\nvn -0.430100 0.882000 -0.192400\nvn -0.059600 0.973300 -0.221800\nvn -0.106100 0.993000 -0.052000\nvn 0.123600 0.991500 -0.040300\nvn 0.129900 0.966900 -0.219500\nvn 0.271300 0.947200 -0.170700\nvn 0.261900 0.962300 -0.074000\nvn -0.200000 0.979800 0.002700\nvn -0.152900 0.986800 -0.052600\nvn -0.017200 0.999800 -0.005000\nvn 0.072900 0.989100 0.128100\nvn 0.082400 0.980400 0.179100\nvn 0.025700 0.985500 0.167900\nvn 0.050900 0.984600 -0.167000\nvn 0.234200 0.971900 0.025300\nvn 0.230000 0.966800 0.111300\nvn -0.116500 0.909700 -0.398700\nvn -0.076200 0.974700 -0.210000\nvn 0.411800 0.903300 -0.120300\nvn 0.247000 0.948700 0.197500\nvn 0.282900 0.954700 -0.092000\nvn 0.174200 0.984100 -0.034700\nvn -0.054300 0.989500 0.133800\nvn 0.011400 0.999100 -0.041300\nvn -0.210900 0.969500 0.124700\nvn -0.307400 0.939100 0.153700\nvn -0.521900 0.822900 0.224400\nvn -0.588000 0.797000 0.138300\nvn -0.107800 0.993900 -0.022500\nvn 0.120700 0.985900 -0.116300\nvn -0.369300 0.927800 0.052300\nvn -0.070700 0.995700 -0.059700\nvn 0.061800 0.998000 -0.014700\nvn -0.125700 0.988500 0.084300\nvn 0.096400 0.994800 -0.032800\nvn 0.068100 0.996800 0.041800\nvn -0.057500 0.996200 -0.064800\nvn 0.023400 0.989500 0.142600\nvn 0.001200 0.998200 -0.059900\nvn -0.025200 0.994900 -0.097300\nvn 0.292800 0.953600 0.071000\nvn 0.290400 0.955300 0.056000\nvn 0.137300 0.988300 0.066400\nvn -0.242700 0.927600 -0.284100\nvn -0.299700 0.911400 -0.282000\nvn -0.158300 0.940200 -0.301500\nvn -0.118600 0.925000 -0.361000\nvn -0.034200 0.848900 -0.527500\nvn -0.123000 0.913000 -0.388900\nvn 0.603200 0.784300 -0.145200\nvn 0.644300 0.764600 -0.016200\nvn 0.084000 0.962300 0.258800\nvn -0.193600 0.970900 0.140600\nvn -0.456400 0.761100 0.460800\nvn -0.213900 0.954700 0.206900\nvn 0.101600 0.994300 -0.031900\nvn 0.096600 0.986000 0.136100\nvn 0.046700 0.991300 0.123100\nvn -0.078100 0.981100 -0.177100\nvn -0.075500 0.988100 -0.134200\nvn -0.143200 0.974100 -0.174800\nvn -0.115000 0.975300 -0.188400\nvn -0.050500 0.961400 -0.270400\nvn -0.118600 0.978700 -0.167500\nvn -0.117600 0.929900 0.348500\nvn -0.119900 0.959200 0.256100\nvn 0.061800 0.967300 0.246000\nvn 0.119000 0.965800 -0.230300\nvn 0.165300 0.984200 -0.064100\nvn 0.544000 0.816800 -0.191900\nvn 0.157700 0.981600 0.107600\nvn 0.154200 0.987800 0.019600\nvn -0.227400 0.973100 0.037900\nvn -0.245900 0.968900 0.027100\nvn -0.110000 0.973400 0.201000\nvn -0.026900 0.954600 0.296600\nvn 0.291900 0.956300 0.015300\nvn 0.135100 0.990200 0.034500\nvn -0.180400 0.983500 -0.009400\nvn 0.344500 0.891000 -0.295700\nvn 0.310800 0.901600 -0.300900\nvn 0.214100 0.923700 -0.317600\nvn 0.030600 0.953600 0.299400\nvn -0.197000 0.964800 -0.174100\nvn -0.020900 0.998000 -0.059100\nvn 0.067300 0.996600 -0.047000\nvn 0.079800 0.944200 -0.319700\nvn -0.028800 0.917000 -0.397800\nvn -0.218400 0.864900 -0.451800\nvn -0.371300 0.923500 -0.096300\nvn -0.253500 0.961800 -0.103300\nvn 0.096200 0.884800 -0.456000\nvn 0.135700 0.963700 -0.230000\nvn 0.294800 0.955500 -0.007400\nvn 0.244600 0.968400 0.049400\nvn 0.194400 0.979800 -0.048000\nvn 0.285400 0.951500 -0.114600\nvn -0.009600 0.952500 0.304300\nvn -0.002700 0.946900 0.321400\nvn -0.043600 0.954900 0.293600\nvn 0.009500 0.999700 0.022800\nvn -0.123500 0.977900 0.168800\nvn 0.217900 0.966600 -0.135100\nvn -0.585100 0.778500 0.227200\nvn -0.352700 0.886700 0.298800\nvn -0.267100 0.868300 0.417900\nvn -0.272200 0.865600 0.420400\nvn -0.437200 0.827100 0.353200\nvn -0.582700 0.812100 0.030800\nvn 0.059700 0.915500 -0.397900\nvn 0.127900 0.951000 -0.281400\nvn -0.046900 0.953600 -0.297500\nvn 0.131200 0.983000 0.128400\nvn 0.100700 0.994900 -0.000000\nvn -0.036500 0.990700 -0.130700\nvn 0.049800 0.984900 -0.165700\nvn -0.065300 0.994500 -0.082400\nvn -0.136600 0.968900 -0.206300\nvn 0.002900 0.908500 -0.418000\nvn 0.119000 0.960900 -0.250100\nvn 0.392900 0.853800 -0.341600\nvn 0.006100 0.968100 -0.250500\nvn 0.001500 0.761400 -0.648300\nvn 0.366400 0.623200 -0.691000\nvn -0.160400 0.985700 -0.052500\nvn -0.321500 0.939000 -0.122300\nvn -0.212500 0.938000 -0.274000\nvn -0.348500 0.936900 -0.026600\nvn -0.260500 0.964400 0.045000\nvn -0.116000 0.980300 0.159900\nvn 0.177300 0.979900 -0.092000\nvn 0.052700 0.923600 0.379700\nvn 0.158400 0.888700 0.430200\nvn -0.024500 0.982100 -0.186500\nvn 0.157300 0.986900 -0.035800\nvn 0.007600 0.999700 -0.024400\nvn 0.192500 0.968100 0.160100\nvn 0.098200 0.986000 0.134400\nvn -0.156800 0.982900 -0.096100\nvn -0.125500 0.992100 -0.006300\nvn -0.111500 0.990000 -0.086300\nvn 0.307100 0.943700 0.122600\nvn -0.044700 0.993500 0.104300\nvn -0.142200 0.989800 -0.005000\nvn -0.118900 0.992500 -0.028900\nvn -0.107500 0.981200 0.160100\nvn -0.076400 0.997100 -0.003300\nvn 0.118600 0.964200 0.237000\nvn 0.353900 0.910100 0.215700\nvn 0.288300 0.947700 0.136800\nvn 0.089100 0.996000 -0.000600\nvn 0.342300 0.905400 0.251200\nvn 0.340900 0.909800 0.236700\nvn 0.299400 0.927400 0.224200\nvn 0.347400 0.914300 0.208300\nvn 0.118900 0.990900 -0.062700\nvn 0.122700 0.975100 -0.184600\nvn 0.243300 0.957600 -0.154400\nvn 0.097000 0.919500 -0.380900\nvn 0.067100 0.810500 -0.581900\nvn -0.101300 0.957100 -0.271600\nvn -0.035900 0.840000 -0.541300\nvn -0.100800 0.850900 -0.515500\nvn 0.093000 0.533100 -0.840900\nvn 0.178600 0.639000 -0.748200\nvn 0.408800 0.691200 -0.595900\nvn 0.138000 0.986100 0.092900\nvn 0.249600 0.967200 0.048000\nvn 0.160800 0.880100 0.446700\nvn 0.169700 0.924700 0.340800\nvn 0.245300 0.813000 0.528200\nvn 0.155000 0.891700 0.425300\nvn 0.243900 0.890300 0.384500\nvn 0.128800 0.937700 0.322800\nvn 0.000700 0.853900 -0.520400\nvn 0.213300 0.776900 -0.592400\nvn 0.224700 0.359800 -0.905600\nvn 0.199600 0.232500 -0.951900\nvn -0.151800 0.950000 0.272900\nvn -0.314000 0.949100 0.026500\nvn -0.325300 0.931200 -0.164700\nvn -0.192700 0.557800 -0.807300\nvn -0.101600 0.181100 -0.978200\nvn -0.181100 0.162600 -0.969900\nvn -0.184100 0.202500 -0.961800\nvn -0.162000 0.312100 -0.936100\nvn -0.061900 0.675900 -0.734400\nvn -0.463300 0.886000 0.019800\nvn -0.468800 0.865300 0.177500\nvn -0.079300 0.935000 0.345700\nvn -0.432900 0.901400 0.003300\nvn -0.303900 0.757200 -0.578100\nvn -0.257500 0.947200 0.191000\nvn -0.280800 0.842400 0.459800\nvn -0.297000 0.874000 0.384600\nvn -0.373700 0.857800 0.352900\nvn -0.071400 0.978900 -0.191700\nvn 0.102800 0.992600 -0.064000\nvn 0.203400 0.975700 0.082100\nvn 0.156100 0.984300 -0.082600\nvn 0.123100 0.958400 0.257500\nvn 0.097600 0.991400 -0.087100\nvn 0.018300 0.977000 -0.212300\nvn -0.021300 0.971800 -0.234900\nvn 0.120500 0.970200 -0.210300\nvn 0.895700 -0.443400 0.034800\nvn 0.746000 0.658100 -0.102200\nvn 0.383500 0.917100 -0.108600\nvn 0.166100 0.985600 0.031700\nvn -0.009600 0.995400 0.094900\nvn -0.187000 0.979900 0.068800\nvn 0.185600 0.979500 -0.078600\nvn 0.046100 0.995100 -0.087700\nvn -0.058600 0.981800 -0.180600\nvn -0.079100 0.987100 0.139000\nvn -0.123300 0.992300 0.010400\nvn -0.329800 0.942600 0.052800\nvn -0.144000 0.981600 -0.125000\nvn -0.150900 0.970500 -0.188100\nvn -0.141800 0.985200 -0.096600\nvn -0.315200 0.944700 -0.090900\nvn -0.251000 0.966800 0.047100\nvn 0.019300 0.999400 0.028700\nvn -0.011400 0.960300 -0.278700\nvn 0.051200 0.946200 -0.319400\nvn -0.121100 0.938500 -0.323300\nvn 0.022200 0.967600 -0.251300\nvn -0.050100 0.998400 0.025100\nvn -0.058200 0.997000 -0.050800\nvn -0.112200 0.951000 -0.288200\nvn -0.034500 0.994100 -0.102800\nvn 0.133900 0.988900 -0.065000\nvn -0.013500 0.971000 0.238800\nvn 0.160700 0.986900 -0.016900\nvn 0.158000 0.975300 0.154100\nvn 0.279900 0.957700 -0.067300\nvn 0.343700 0.938300 0.037900\nvn 0.309400 0.949800 0.047300\nvn 0.078300 0.993700 0.079800\nvn 0.200200 0.979700 -0.004600\nvn 0.013000 0.993900 -0.109400\nvn -0.231100 0.917300 0.324400\nvn -0.243800 0.943000 0.226400\nvn -0.167800 0.941600 0.291900\nvn -0.203400 0.961200 0.186400\nvn -0.130100 0.986000 -0.104400\nvn -0.136700 0.984100 -0.113000\nvn -0.374400 0.923400 0.084900\nvn -0.145400 0.966200 -0.212900\nvn -0.150000 0.984700 -0.088800\nvn -0.030800 0.994000 0.104600\nvn -0.047500 0.984000 0.171800\nvn -0.080100 0.980600 0.178600\nvn -0.038900 0.979200 0.199100\nvn 0.029800 0.976100 0.215300\nvn 0.014700 0.887400 0.460700\nvn -0.002100 0.902400 0.430800\nvn 0.001000 0.814100 0.580800\nvn 0.110200 0.847500 0.519100\nvn -0.190700 0.930200 0.313600\nvn -0.175900 0.915600 0.361500\nvn -0.329200 0.827700 0.454500\nvn 0.001400 0.934700 0.355500\nvn 0.016900 0.958400 0.284800\nvn -0.263900 0.957800 0.114300\nvn -0.316700 0.869500 0.379100\nvn -0.315000 0.940900 0.124700\nvn -0.461500 0.876200 0.139100\nvn -0.160900 0.976000 -0.146600\nvn -0.256600 0.949900 0.178400\nvn -0.062900 0.987500 0.144500\nvn -0.329700 0.900000 0.285100\nvn -0.340800 0.933000 0.115300\nvn -0.100700 0.994900 -0.005600\nvn 0.093600 0.974500 0.203800\nvn -0.010000 0.999800 -0.019800\nvn -0.086700 0.994200 -0.063700\nvn -0.071600 0.984000 -0.163200\nvn -0.197700 0.980200 0.008700\nvn 0.255500 0.966000 0.039200\nvn -0.255700 0.958600 0.125600\nvn -0.076600 0.995400 -0.058400\nvn 0.150500 0.986700 0.061000\nvn 0.311000 0.939700 0.142200\nvn 0.102900 0.989800 0.098300\nvn 0.018000 0.995700 0.091300\nvn 0.077300 0.894300 0.440800\nvn 0.575800 0.817400 0.013900\nvn 0.356300 0.931000 0.079200\nvn 0.989600 -0.136700 0.043800\nvn 0.969600 -0.161500 0.184100\nvn 0.889700 0.395200 0.228800\nvn -0.238400 0.955000 0.176300\nvn -0.051400 0.997100 -0.056700\nvn -0.298100 0.952100 0.068000\nvn 0.307100 0.950200 0.052700\nvn 0.181700 0.972200 0.147400\nvn 0.395700 0.914400 0.085000\nvn 0.098000 0.942700 0.318800\nvn -0.075200 0.978600 0.191400\nvn 0.109300 0.984600 0.136200\nvn 0.314000 0.942800 0.111900\nvn 0.267300 0.963200 -0.027200\nvn 0.111300 0.982100 -0.152000\nvn -0.188800 0.953900 -0.233200\nvn -0.136100 0.983000 -0.123300\nvn -0.129600 0.988100 -0.082600\nvn -0.100300 0.994200 -0.038100\nvn -0.066400 0.988400 -0.136800\nvn -0.186400 0.976900 -0.104500\nvn -0.189400 0.978600 -0.080800\nvn -0.228400 0.965800 -0.122500\nvn -0.346000 0.927000 -0.144400\nvn -0.377600 0.906200 -0.190000\nvn -0.398600 0.902100 -0.165500\nvn -0.099000 0.993600 -0.054500\nvn -0.073300 0.994000 -0.081700\nvn -0.122800 0.984800 0.123000\nvn 0.105000 0.946800 0.304100\nvn -0.041600 0.978000 0.204400\nvn -0.087500 0.928200 0.361500\nvn -0.145000 0.901700 0.407300\nvn 0.048600 0.993700 0.101300\nvn 0.120000 0.939300 0.321500\nvn 0.082700 0.908600 0.409500\nvn -0.049600 0.964100 0.261000\nvn -0.043000 0.942700 0.330800\nvn 0.050400 0.988800 0.140300\nvn 0.035800 0.990600 0.132100\nvn 0.027800 0.998900 0.037300\nvn -0.044600 0.998700 -0.023100\nvn 0.046100 0.995300 0.085600\nvn 0.105000 0.949400 0.296000\nvn 0.141900 0.977000 0.159100\nvn -0.181200 0.963200 0.198600\nvn -0.059000 0.998200 0.003400\nvn -0.131800 0.987900 0.081500\nvn -0.088800 0.994200 0.061500\nvn -0.125700 0.987200 0.098500\nvn -0.374800 0.920100 0.113700\nvn -0.016500 0.999300 0.033900\nvn -0.156100 0.951400 -0.265400\nvn -0.195300 0.914800 -0.353400\nvn -0.331700 0.926000 -0.180300\nvn -0.290600 0.946700 0.138700\nvn -0.274100 0.953000 0.129100\nvn 0.194000 0.914000 -0.356400\nvn 0.011300 0.999700 -0.022100\nvn 0.006700 0.984900 -0.173100\nvn -0.105100 0.992300 0.066200\nvn -0.227000 0.973200 -0.036800\nvn -0.254600 0.961900 -0.099300\nvn -0.217700 0.974100 -0.060800\nvn -0.166800 0.954400 -0.247600\nvn -0.050400 0.966000 -0.253400\nvn 0.019900 0.998700 -0.047100\nvn 0.105700 0.988100 -0.112100\nvn 0.085200 0.996300 -0.009900\nvn 0.078000 0.981700 -0.173800\nvn 0.121900 0.966900 -0.224400\nvn 0.071700 0.979800 -0.186800\nvn 0.180300 0.978100 -0.103500\nvn 0.124900 0.990200 -0.063000\nvn 0.379300 0.913800 -0.145500\nvn 0.028700 0.994500 -0.101200\nvn 0.222300 0.926300 -0.304200\nvn 0.137200 0.931400 -0.337200\nvn 0.192100 0.956300 0.220600\nvn 0.333300 0.940300 0.068800\nvn 0.346800 0.933500 0.091300\nvn 0.448600 0.825100 0.343500\nvn 0.518700 0.638400 0.568700\nvn -0.088700 0.889900 0.447400\nvn 0.260000 0.943100 0.207300\nvn -0.095600 0.935300 0.340800\nvn 0.421000 0.846400 0.326000\nvn 0.353800 0.913100 0.202700\nvn 0.378900 0.915900 0.132400\nvn 0.301700 0.934900 0.186900\nvn 0.417700 0.907200 0.049400\nvn 0.430700 0.898300 0.086900\nvn 0.398500 0.911500 -0.101700\nvn 0.094500 0.993100 0.069200\nvn 0.198600 0.963600 -0.179100\nvn -0.148300 0.955600 -0.254800\nvn -0.167900 0.985300 -0.029900\nvn -0.182300 0.938600 0.292900\nvn -0.075600 0.957500 0.278400\nvn -0.200000 0.947800 0.248400\nvn -0.246200 0.920300 -0.304000\nvn -0.272900 0.930600 -0.244100\nvn -0.154800 0.955800 0.250100\nvn -0.261900 0.963400 -0.056500\nvn -0.409100 0.911100 -0.051000\nvn -0.379700 0.922200 0.073400\nvn -0.328300 0.929700 0.167100\nvn -0.260300 0.940100 0.220200\nvn -0.325000 0.943300 0.068200\nvn -0.290100 0.956300 0.036500\nvn -0.154100 0.987300 0.039700\nvn -0.399900 0.908300 0.122700\nvn -0.268800 0.950300 -0.157100\nvn -0.191800 0.962300 -0.192900\nvn -0.227600 0.962700 0.146500\nvn -0.432200 0.900400 0.050100\nvn -0.419400 0.904500 -0.077300\nvn -0.468800 0.880900 -0.065000\nvn -0.165500 0.980700 -0.104200\nvn -0.222200 0.974700 0.024400\nvn -0.006600 0.997700 0.067000\nvn 0.170400 0.978400 0.117300\nvn 0.274200 0.957900 0.085400\nvn 0.169900 0.939800 0.296500\nvn -0.014300 0.956900 0.290000\nvn -0.063600 0.965000 0.254500\nvn -0.057600 0.970200 0.235500\nvn -0.004600 0.999500 0.031800\nvn -0.079400 0.995400 0.054300\nvn 0.241000 0.924300 0.296100\nvn 0.315600 0.923700 0.217200\nvn 0.340400 0.897300 0.281100\nvn -0.099100 0.985000 0.141200\nvn -0.031600 0.965000 0.260400\nvn -0.396500 0.880200 0.260900\nvn 0.013400 0.966000 0.258300\nvn 0.021900 0.960900 0.275900\nvn -0.255000 0.932100 0.257300\nvn 0.098100 0.948200 0.302200\nvn -0.052600 0.954900 0.292300\nvn -0.138700 0.970600 0.196900\nvn 0.161800 0.964500 0.208800\nvn 0.049100 0.982700 0.178400\nvn 0.118000 0.986300 0.115700\nvn 0.004100 0.994600 0.104100\nvn -0.100500 0.994400 0.031400\nvn -0.035800 0.981100 -0.190400\nvn 0.111400 0.992000 -0.059700\nvn 0.095400 0.894700 -0.436300\nvn -0.244100 0.886200 -0.393800\nvn 0.037500 0.995600 0.085800\nvn -0.055000 0.991100 0.121500\nvn 0.014900 0.995100 0.097400\nvn -0.104200 0.994400 0.019800\nvn -0.061500 0.986700 -0.150200\nvn 0.168500 0.982700 -0.077200\nvn 0.014400 0.975400 0.219900\nvn 0.062800 0.995700 -0.067400\nvn -0.033400 0.995800 -0.084700\nvn 0.072800 0.997300 0.013000\nvn 0.022400 0.998400 0.051800\nvn 0.374700 0.923100 -0.086600\nvn 0.036200 0.947700 0.317000\nvn -0.012300 0.874900 0.484100\nvn 0.062700 0.821100 0.567300\nvn 0.886100 0.418200 0.199900\nvn 0.430500 0.753400 0.497100\nvn 0.497400 0.800300 0.334800\nvn 0.309500 0.902900 0.298300\nvn 0.235500 0.942300 0.237900\nvn 0.215400 0.945400 0.244700\nvn 0.242800 0.934800 0.259300\nvn 0.306800 0.906800 0.289100\nvn 0.243700 0.895100 0.373300\nvn 0.303900 0.868900 0.390800\nvn 0.273400 0.849600 0.451100\nvn 0.070400 0.981900 0.176000\nvn 0.101200 0.978000 0.182200\nvn -0.083500 0.963600 0.253900\nvn -0.170000 0.979100 0.112000\nvn -0.099300 0.980000 0.172500\nvn -0.150600 0.986300 -0.067400\nvn -0.191500 0.980800 -0.036200\nvn -0.209900 0.971000 0.114600\nvn -0.217700 0.975300 0.038300\nvn -0.413900 0.910200 0.015300\nvn -0.372600 0.901200 -0.221500\nvn -0.431700 0.880900 -0.194000\nvn -0.670400 0.717100 -0.190500\nvn -0.464000 0.870100 -0.165900\nvn -0.404400 0.912900 -0.055900\nvn -0.229100 0.970300 -0.077700\nvn -0.656600 0.750500 0.075400\nvn -0.146100 0.988500 0.039900\nvn -0.237300 0.945100 0.224800\nvn 0.045200 0.943400 -0.328500\nvn 0.073000 0.980500 -0.182700\nvn 0.066000 0.992000 -0.107800\nvn -0.274200 0.925400 0.261500\nvn -0.285500 0.887400 0.362100\nvn -0.549200 0.754000 0.360400\nvn -0.310300 0.944400 0.109000\nvn -0.423100 0.841400 0.336200\nvn 0.114600 0.961500 0.249800\nvn 0.298900 0.900500 -0.315900\nvn 0.161300 0.982900 -0.088500\nvn 0.432300 0.882000 -0.187400\nvn 0.196300 0.980500 -0.005200\nvn 0.255100 0.939500 0.228500\nvn 0.331100 0.936400 0.116200\nvn 0.407600 0.898100 -0.165000\nvn 0.359300 0.928100 -0.097800\nvn 0.314700 0.940800 -0.126400\nvn -0.011700 0.997100 -0.075600\nvn 0.032600 0.999000 -0.031300\nvn -0.210700 0.974900 -0.071200\nvn -0.101500 0.993200 -0.057100\nvn -0.154800 0.987900 -0.004200\nvn -0.389200 0.921100 -0.006500\nvn -0.090000 0.979400 -0.180900\nvn -0.093700 0.992600 -0.076800\nvn 0.176000 0.983600 0.038400\nvn 0.068100 0.996400 0.050100\nvn 0.091100 0.993500 0.068000\nvn 0.118700 0.983300 0.138200\nvn 0.145200 0.986600 0.073800\nvn 0.175100 0.964200 0.199100\nvn 0.073200 0.984300 0.160700\nvn 0.092400 0.995200 0.031200\nvn 0.074000 0.990500 0.115600\nvn 0.075700 0.990300 0.116300\nvn 0.270900 0.958800 0.085600\nvn 0.069300 0.988600 0.133600\nvn -0.053200 0.995900 0.072500\nvn -0.040200 0.997800 0.052400\nvn 0.017400 0.996200 0.085500\nvn -0.048500 0.995600 0.079900\nvn 0.248700 0.963100 0.103100\nvn 0.246200 0.956700 0.155400\nvn 0.168800 0.983200 0.069200\nvn -0.082300 0.936900 -0.339600\nvn -0.125700 0.930600 -0.343900\nvn -0.144400 0.937900 -0.315500\nvn -0.058700 0.956500 -0.285700\nvn 0.018800 0.994600 -0.102300\nvn 0.130400 0.989200 -0.067000\nvn -0.066400 0.987000 -0.146700\nvn 0.094400 0.995400 0.017500\nvn 0.361500 0.902600 0.233600\nvn 0.455300 0.833700 -0.312500\nvn 0.462600 0.868100 -0.180300\nvn 0.429000 0.889800 -0.155400\nvn 0.426200 0.904300 0.023500\nvn 0.385800 0.881500 0.272200\nvn 0.329600 0.929800 0.163700\nvn 0.285400 0.956600 -0.059400\nvn 0.278500 0.959100 0.049800\nvn 0.234600 0.970800 0.049400\nvn 0.197400 0.958200 0.207100\nvn 0.167900 0.985800 -0.009400\nvn 0.157800 0.985300 -0.065100\nvn 0.121300 0.990600 -0.062700\nvn 0.114500 0.990600 0.074300\nvn 0.159000 0.986000 0.051100\nvn 0.003600 0.992400 -0.122800\nvn 0.070500 0.993500 -0.089400\nvn -0.132700 0.974600 -0.180600\nvn -0.300700 0.952600 0.045300\nvn -0.315300 0.910500 0.267500\nvn -0.378700 0.887500 0.262500\nvn -0.302800 0.953000 -0.008600\nvn -0.324000 0.914300 -0.243000\nvn -0.458600 0.842100 -0.283800\nvn -0.621800 0.783200 -0.006100\nvn -0.616900 0.707000 -0.346000\nvn -0.445300 0.802600 -0.397000\nvn -0.162500 0.982800 -0.087400\nvn -0.117900 0.976000 -0.182900\nvn 0.109600 0.972400 -0.206200\nvn -0.049100 0.943900 -0.326600\nvn -0.074400 0.946300 -0.314600\nvn -0.007000 0.943600 -0.331100\nvn 0.253300 0.908100 -0.333400\nvn 0.071900 0.895800 -0.438500\nvn 0.133500 0.837200 -0.530300\nvn -0.176000 0.976600 -0.123500\nvn -0.210500 0.977600 -0.008500\nvn 0.083400 0.994300 -0.066200\nvn -0.289000 0.953700 -0.083500\nvn 0.280800 0.854100 -0.437800\nvn 0.119700 0.968600 -0.217700\nvn 0.152000 0.982200 -0.110100\nvn 0.148400 0.975800 -0.160700\nvn 0.142800 0.976500 -0.161200\nvn -0.098100 0.990700 0.094100\nvn -0.166500 0.963600 0.208900\nvn 0.077400 0.974600 0.210200\nvn -0.218500 0.975400 -0.028700\nvn -0.116200 0.980400 -0.158900\nvn -0.338700 0.936300 -0.093200\nvn -0.060800 0.997600 -0.032600\nvn -0.174100 0.983000 -0.058400\nvn -0.025000 0.996800 -0.076100\nvn -0.047700 0.995700 -0.079100\nvn 0.036400 0.998100 -0.050700\nvn 0.119500 0.992400 -0.030700\nvn 0.042400 0.988900 -0.142600\nvn 0.070700 0.996000 -0.055400\nvn 0.057800 0.998000 -0.027300\nvn 0.045300 0.980900 -0.189200\nvn 0.027000 0.999300 -0.026400\nvn 0.063500 0.997600 0.028900\nvn 0.148400 0.988900 0.009100\nvn 0.231900 0.962400 -0.141300\nvn 0.315800 0.945800 -0.075500\nvn 0.244800 0.968500 -0.044500\nvn 0.360000 0.927600 0.100100\nvn 0.484000 0.874300 0.037200\nvn 0.301000 0.953500 0.014400\nvn 0.143900 0.966900 -0.210500\nvn -0.191000 0.905700 -0.378600\nvn -0.052700 0.959500 -0.276800\nvn -0.024000 0.901200 -0.432700\nvn -0.199000 0.920400 -0.336500\nvn -0.037700 0.878800 -0.475800\nvn -0.035100 0.917400 -0.396400\nvn -0.162000 0.895700 -0.414200\nvn -0.306600 0.874200 -0.376500\nvn -0.200200 0.889100 -0.411700\nvn -0.019000 0.932100 -0.361800\nvn 0.017200 0.920700 -0.389800\nvn -0.153800 0.944700 -0.289500\nvn 0.062500 0.889800 -0.452000\nvn -0.153700 0.957600 -0.243800\nvn -0.148000 0.974400 -0.169500\nvn -0.001800 0.992900 0.119300\nvn 0.172400 0.964200 -0.201500\nvn 0.235900 0.937500 0.255800\nvn 0.225200 0.945600 0.235000\nvn -0.197700 0.978100 -0.065600\nvn 0.040500 0.993500 -0.106600\nvn 0.340600 0.937800 0.068100\nvn 0.032700 0.998900 -0.033300\nvn 0.185800 0.956200 0.226100\nvn 0.257600 0.923600 0.284000\nvn 0.462700 0.874200 0.147600\nvn 0.076900 0.974400 0.211300\nvn -0.284600 0.956100 -0.070200\nvn -0.356000 0.890000 0.284700\nvn -0.320600 0.831100 0.454400\nvn -0.430200 0.755300 0.494400\nvn -0.396600 0.904500 0.156900\nvn -0.370200 0.922500 -0.108900\nvn -0.421600 0.906400 -0.024600\nvn -0.405800 0.905000 0.127500\nvn -0.357000 0.933900 0.017800\nvn -0.240400 0.970700 0.004200\nvn -0.416300 0.895600 0.156900\nvn -0.346100 0.914000 0.211800\nvn -0.062100 0.977600 0.201200\nvn -0.327100 0.943000 0.061000\nvn -0.181200 0.981100 -0.067100\nvn -0.257400 0.965500 0.039700\nvn -0.003800 0.998900 0.047300\nvn -0.035300 0.995300 -0.090400\nvn -0.098400 0.992700 -0.069200\nvn 0.047100 0.993800 -0.101100\nvn 0.062900 0.995200 0.075000\nvn 0.031500 0.998500 -0.044400\nvn -0.048200 0.995200 0.084900\nvn -0.168700 0.982000 -0.084600\nvn -0.137100 0.982800 -0.123300\nvn -0.105600 0.994300 -0.016900\nvn -0.149000 0.986100 -0.073400\nvn -0.195900 0.980600 0.005700\nvn -0.071900 0.982100 -0.173900\nvn -0.104200 0.963100 -0.248000\nvn 0.051800 0.941500 -0.333000\nvn -0.129000 0.986300 -0.102600\nvn -0.107800 0.993800 0.027300\nvn 0.213800 0.976900 -0.000500\nvn -0.001300 0.999500 -0.031600\nvn 0.090200 0.995400 0.031800\nvn -0.014600 0.999100 0.039700\nvn -0.181500 0.878100 0.442700\nvn -0.249600 0.964600 0.085000\nvn -0.418700 0.879100 0.227700\nvn -0.169900 0.984800 0.036600\nvn -0.129300 0.991500 -0.010800\nvn -0.010900 0.995900 0.090000\nvn -0.042000 0.972200 0.230100\nvn 0.022200 0.964300 0.264000\nvn 0.001400 0.948600 0.316400\nvn 0.484000 0.870000 0.094300\nvn 0.258700 0.950900 0.169900\nvn 0.135800 0.990700 0.012200\nvn 0.207100 0.941700 0.265100\nvn 0.169900 0.960500 0.220600\nvn 0.192400 0.968200 0.159900\nvn 0.239900 0.935000 0.261200\nvn 0.264900 0.933700 0.240900\nvn 0.250700 0.932400 0.260500\nvn -0.082300 0.993100 0.083700\nvn -0.120700 0.983700 0.133500\nvn 0.066400 0.992900 0.098700\nvn -0.114500 0.992100 0.050400\nvn -0.112600 0.990100 -0.084100\nvn -0.025300 0.999500 -0.018200\nvn 0.155200 0.987700 0.017600\nvn 0.051600 0.997500 -0.048400\nvn -0.189200 0.955800 -0.225100\nvn -0.112800 0.965000 0.236700\nvn -0.416900 0.906400 0.067600\nvn -0.424600 0.898000 0.115100\nvn -0.358800 0.928400 -0.096600\nvn -0.003400 0.975500 -0.220000\nvn -0.128700 0.983400 -0.128100\nvn -0.113200 0.976300 0.184600\nvn -0.092700 0.995700 0.005000\nvn -0.155100 0.986400 0.054800\nvn 0.217400 0.971600 0.093800\nvn -0.049200 0.957000 0.286000\nvn 0.155600 0.983400 0.093600\nvn -0.267800 0.949600 0.163000\nvn -0.322000 0.946700 0.006900\nvn 0.311400 0.942500 -0.121500\nvn 0.256800 0.961900 -0.093900\nvn 0.466600 0.876400 -0.118800\nvn -0.100600 0.988100 0.116100\nvn -0.294700 0.955600 -0.000900\nvn -0.461000 0.886900 0.030700\nvn -0.105400 0.983400 -0.148000\nvn -0.394000 0.914700 0.089700\nvn -0.359800 0.919600 0.157900\nvn -0.344500 0.920600 0.183700\nvn 0.085300 0.991400 -0.099400\nvn -0.055500 0.998400 0.013100\nvn -0.145400 0.989200 -0.019300\nvn -0.535200 0.843000 0.054400\nvn -0.399900 0.890200 -0.218300\nvn -0.445400 0.879600 -0.166800\nvn -0.473600 0.872900 -0.117500\nvn -0.420200 0.895200 0.148500\nvn -0.302600 0.952800 0.022800\nvn -0.102000 0.905400 -0.412000\nvn 0.023000 0.981800 -0.188600\nvn -0.000900 0.985000 -0.172300\nvn 0.212300 0.941400 0.262300\nvn 0.121700 0.991800 -0.039300\nvn 0.161100 0.975300 -0.150900\nvn -0.001300 0.966300 -0.257500\nvn 0.023300 0.985900 -0.165700\nvn 0.018700 0.985900 -0.166000\nvn 0.014200 0.906500 -0.421900\nvn -0.077400 0.984200 -0.159500\nvn -0.017700 0.946000 -0.323800\nvn -0.307100 0.876900 0.369700\nvn -0.183900 0.932900 -0.309500\nvn -0.284800 0.940100 -0.187500\nvn -0.067300 0.875700 -0.478200\nvn -0.099300 0.949700 -0.297000\nvn -0.141600 0.970000 -0.197600\nvn -0.387000 0.909900 -0.149300\nvn -0.156700 0.987600 -0.003900\nvn -0.236500 0.934900 0.264700\nvn -0.058300 0.885400 -0.461200\nvn -0.140300 0.929900 -0.340000\nvn -0.014500 0.901200 -0.433200\nvn -0.385500 0.918900 0.084000\nvn -0.234200 0.780000 0.580400\nvn -0.065700 0.744600 0.664200\nvn 0.179400 0.898600 -0.400300\nvn 0.189900 0.968000 0.163700\nvn 0.247400 0.944900 -0.214200\nvn 0.149700 0.956400 -0.250700\nvn 0.456300 0.889400 -0.026000\nvn 0.313900 0.949200 -0.020300\nvn 0.405200 0.863000 -0.301700\nvn 0.509300 0.856000 0.088700\nvn 0.172800 0.951900 -0.253200\nvn -0.031300 0.946100 -0.322400\nvn 0.047500 0.960800 -0.273200\nvn 0.138800 0.967100 -0.213100\nvn -0.814900 -0.471200 -0.337400\nvn -0.910000 -0.264600 -0.319300\nvn -0.745300 0.658600 0.104200\nvn -0.874200 0.456300 -0.165800\nvn -0.081700 0.989600 -0.118500\nvn 0.103600 0.992900 -0.058200\nvn -0.114200 0.964400 0.238600\nvn -0.019800 0.990400 0.136700\nvn -0.028400 0.951900 0.305200\nvn -0.000600 0.974500 0.224500\nvn 0.003200 0.971000 0.239100\nvn -0.163900 0.951500 0.260200\nvn 0.013100 0.934700 0.355300\nvn 0.035900 0.936600 0.348500\nvn -0.234100 0.928600 0.287900\nvn -0.110800 0.952000 0.285200\nvn -0.277800 0.957300 0.080500\nvn 0.067200 0.997300 0.031100\nvn 0.234700 0.940600 -0.245400\nvn 0.344900 0.914600 -0.211000\nvn 0.187300 0.979800 -0.069500\nvn 0.344700 0.937000 -0.056600\nvn 0.284000 0.958700 0.013500\nvn 0.313500 0.949300 -0.023800\nvn 0.355000 0.932600 0.065800\nvn 0.462700 0.886000 -0.030400\nvn 0.093400 0.994500 0.048200\nvn 0.413700 0.905600 0.093900\nvn 0.406900 0.834700 0.371200\nvn 0.321700 0.817900 0.477100\nvn 0.322100 0.862500 0.390400\nvn 0.101300 0.992300 0.071500\nvn 0.189700 0.978200 -0.084700\nvn -0.325600 0.926400 0.188800\nvn 0.132700 0.976800 -0.167900\nvn -0.475500 0.867000 0.149300\nvn -0.180600 0.958700 -0.219900\nvn -0.428900 0.889300 -0.158500\nvn -0.100600 0.969100 -0.225100\nvn -0.648000 0.741000 0.176000\nvn -0.733800 0.592700 0.332100\nvn -0.247600 0.836600 0.488600\nvn 0.159600 0.980900 0.110800\nvn 0.189500 0.780600 0.595600\nvn 0.256500 0.801100 0.540800\nvn -0.086900 0.977600 -0.191800\nvn -0.049300 0.983400 -0.174600\nvn 0.172300 0.984900 0.013600\nvn 0.085500 0.989900 0.113300\nvn 0.196500 0.846700 0.494400\nvn 0.101900 0.840200 0.532600\nvn -0.052400 0.962300 0.266800\nvn -0.141500 0.794700 0.590300\nvn -0.289200 0.547200 0.785400\nvn -0.266200 0.962200 0.058000\nvn -0.139400 0.977000 -0.161500\nvn -0.131700 0.990400 -0.041600\nvn -0.139000 0.985500 -0.097800\nvn -0.250500 0.350000 0.902600\nvn -0.283200 0.378900 0.881100\nvn -0.177400 0.955300 -0.236700\nvn -0.114500 0.668600 -0.734800\nvn -0.081500 0.506900 -0.858100\nvn -0.370500 0.919900 -0.128200\nvn -0.301300 0.941200 -0.152500\nvn -0.166400 0.976500 -0.136900\nvn -0.148500 0.833000 -0.532900\nvn -0.116700 0.468800 -0.875500\nvn -0.079500 0.773700 -0.628600\nvn 0.186800 0.980700 -0.058500\nvn 0.125000 0.947400 -0.294500\nvn 0.267000 0.927800 -0.260400\nvn 0.305200 0.876700 -0.371800\nvn 0.318100 0.881100 -0.350100\nvn -0.048200 0.926200 -0.374000\nvn 0.226800 0.937900 -0.262500\nvn -0.142400 0.903800 -0.403700\nvn -0.139800 0.950100 -0.278800\nvn 0.003100 0.833600 -0.552400\nvn 0.066000 0.988600 -0.135000\nvn 0.406300 0.913200 0.030000\ns off\nf 1046//1 364//1 12//1\nf 367//2 13//2 548//2\nf 1048//3 370//3 14//3\nf 1049//4 373//4 15//4\nf 1050//5 376//5 16//5\nf 1051//6 379//6 17//6\nf 1052//7 382//7 18//7\nf 385//8 19//8 566//8\nf 1054//9 388//9 20//9\nf 391//10 22//10 572//10\nf 393//11 23//11 574//11\nf 1057//12 395//12 24//12\nf 1058//13 397//13 25//13\nf 399//14 26//14 580//14\nf 1060//15 401//15 27//15\nf 403//16 28//16 584//16\nf 1062//17 405//17 29//17\nf 1063//18 407//18 30//18\nf 1064//19 410//19 32//19\nf 1065//20 412//20 33//20\nf 1066//21 414//21 34//21\nf 416//22 35//22 597//22\nf 1068//23 418//23 36//23\nf 420//24 37//24 601//24\nf 1070//25 422//25 38//25\nf 1071//26 424//26 39//26\nf 1072//27 426//27 40//27\nf 1073//28 429//28 42//28\nf 1074//29 431//29 43//29\nf 1075//30 433//30 44//30\nf 435//31 45//31 616//31\nf 1077//32 437//32 46//32\nf 439//33 47//33 620//33\nf 1079//34 441//34 48//34\nf 1080//35 443//35 49//35\nf 445//36 50//36 626//36\nf 1082//37 448//37 52//37\nf 1083//38 450//38 53//38\nf 1084//39 452//39 54//39\nf 454//40 55//40 635//40\nf 1086//41 456//41 56//41\nf 1087//42 458//42 57//42\nf 1088//43 460//43 58//43\nf 1089//44 462//44 59//44\nf 464//45 60//45 645//45\nf 1091//46 467//46 62//46\nf 469//47 63//47 650//47\nf 471//48 64//48 652//48\nf 473//49 65//49 654//49\nf 475//50 66//50 656//50\nf 1096//51 477//51 67//51\nf 1097//52 479//52 68//52\nf 481//53 69//53 662//53\nf 483//54 70//54 664//54\nf 486//55 72//55 667//55\nf 1101//56 488//56 73//56\nf 490//57 74//57 671//57\nf 492//58 75//58 673//58\nf 1104//59 494//59 76//59\nf 496//60 77//60 677//60\nf 1106//61 498//61 78//61\nf 1107//62 500//62 79//62\nf 502//63 80//63 683//63\nf 1109//64 505//64 82//64\nf 507//65 83//65 688//65\nf 509//66 84//66 690//66\nf 511//67 85//67 692//67\nf 1113//68 513//68 86//68\nf 1114//69 515//69 87//69\nf 1115//70 517//70 88//70\nf 1116//71 519//71 89//71\nf 1117//72 521//72 90//72\nf 1118//73 524//73 92//73\nf 526//74 93//74 707//74\nf 528//75 94//75 709//75\nf 1121//76 530//76 95//76\nf 1122//77 532//77 96//77\nf 534//78 97//78 715//78\nf 536//79 98//79 717//79\nf 1125//80 538//80 99//80\nf 540//81 100//81 721//81\nf 722//82 104//82 365//82\nf 723//83 281//83 724//83\nf 544//84 103//84 725//84\nf 726//85 107//85 368//85\nf 1131//86 727//86 282//86\nf 1132//87 547//87 106//87\nf 1133//88 730//88 110//88\nf 1134//89 731//89 283//89\nf 1135//90 550//90 109//90\nf 1136//91 734//91 113//91\nf 1137//92 735//92 284//92\nf 1138//93 553//93 112//93\nf 1139//94 738//94 116//94\nf 1140//95 739//95 285//95\nf 1141//96 556//96 115//96\nf 1142//97 742//97 119//97\nf 1143//98 743//98 286//98\nf 1144//99 559//99 118//99\nf 746//100 122//100 383//100\nf 1146//101 747//101 287//101\nf 1147//102 562//102 121//102\nf 1148//103 750//103 125//103\nf 1149//104 751//104 288//104\nf 565//105 124//105 753//105\nf 1151//106 754//106 128//106\nf 1152//107 755//107 289//107\nf 1153//108 568//108 127//108\nf 1154//109 758//109 131//109\nf 1155//110 759//110 290//110\nf 571//111 130//111 761//111\nf 762//112 133//112 394//112\nf 763//113 291//113 764//113\nf 573//114 132//114 765//114\nf 1160//115 766//115 135//115\nf 1161//116 767//116 292//116\nf 1162//117 575//117 134//117\nf 1163//118 770//118 137//118\nf 1164//119 771//119 293//119\nf 1165//120 577//120 136//120\nf 1166//121 774//121 139//121\nf 775//122 294//122 776//122\nf 1168//123 579//123 138//123\nf 778//124 141//124 402//124\nf 1170//125 779//125 295//125\nf 1171//126 581//126 140//126\nf 782//127 143//127 404//127\nf 1173//128 783//128 296//128\nf 1174//129 583//129 142//129\nf 786//130 145//130 406//130\nf 1176//131 787//131 297//131\nf 1177//132 585//132 144//132\nf 1178//133 790//133 147//133\nf 1179//134 791//134 298//134\nf 1180//135 587//135 146//135\nf 794//136 150//136 411//136\nf 795//137 299//137 796//137\nf 1183//138 590//138 149//138\nf 1184//139 798//139 152//139\nf 1185//140 799//140 300//140\nf 1186//141 592//141 151//141\nf 1187//142 802//142 154//142\nf 1188//143 803//143 301//143\nf 1189//144 594//144 153//144\nf 806//145 156//145 417//145\nf 807//146 302//146 808//146\nf 596//147 155//147 809//147\nf 1193//148 810//148 158//148\nf 811//149 303//149 812//149\nf 598//150 157//150 813//150\nf 1196//151 814//151 160//151\nf 815//152 304//152 816//152\nf 600//153 159//153 817//153\nf 1199//154 818//154 162//154\nf 819//155 305//155 820//155\nf 602//156 161//156 821//156\nf 1202//157 822//157 164//157\nf 823//158 306//158 824//158\nf 604//159 163//159 825//159\nf 1205//160 826//160 166//160\nf 1206//161 827//161 307//161\nf 606//162 165//162 829//162\nf 830//163 169//163 430//163\nf 1209//164 831//164 308//164\nf 609//165 168//165 833//165\nf 834//166 171//166 432//166\nf 1212//167 835//167 309//167\nf 1213//168 611//168 170//168\nf 1214//169 838//169 173//169\nf 1215//170 839//170 310//170\nf 1216//171 613//171 172//171\nf 842//172 175//172 436//172\nf 843//173 311//173 844//173\nf 615//174 174//174 845//174\nf 846//175 177//175 438//175\nf 1221//176 847//176 312//176\nf 1222//177 617//177 176//177\nf 1223//178 850//178 179//178\nf 1224//179 851//179 313//179\nf 619//180 178//180 853//180\nf 1226//181 854//181 181//181\nf 855//182 314//182 856//182\nf 621//183 180//183 857//183\nf 858//184 183//184 444//184\nf 859//185 315//185 860//185\nf 1231//186 623//186 182//186\nf 1232//187 862//187 185//187\nf 1233//188 863//188 316//188\nf 1234//189 625//189 184//189\nf 1235//190 866//190 188//190\nf 867//191 317//191 868//191\nf 628//192 187//192 869//192\nf 870//193 190//193 451//193\nf 1239//194 871//194 318//194\nf 1240//195 630//195 189//195\nf 1241//196 874//196 192//196\nf 875//197 319//197 876//197\nf 1243//198 632//198 191//198\nf 1244//199 878//199 194//199\nf 1245//200 879//200 320//200\nf 634//201 193//201 881//201\nf 882//202 196//202 457//202\nf 883//203 321//203 884//203\nf 1249//204 636//204 195//204\nf 886//205 198//205 459//205\nf 1251//206 887//206 322//206\nf 638//207 197//207 889//207\nf 1253//208 890//208 200//208\nf 891//209 323//209 892//209\nf 1255//210 640//210 199//210\nf 1256//211 894//211 202//211\nf 1257//212 895//212 324//212\nf 642//213 201//213 897//213\nf 1259//214 898//214 204//214\nf 1260//215 899//215 325//215\nf 644//216 203//216 901//216\nf 1262//217 902//217 207//217\nf 1263//218 903//218 326//218\nf 1264//219 647//219 206//219\nf 906//220 209//220 470//220\nf 907//221 327//221 908//221\nf 1267//222 649//222 208//222\nf 1268//223 910//223 211//223\nf 1269//224 911//224 328//224\nf 1270//225 651//225 210//225\nf 1271//226 914//226 213//226\nf 915//227 329//227 916//227\nf 653//228 212//228 917//228\nf 918//229 215//229 476//229\nf 919//230 330//230 920//230\nf 655//231 214//231 921//231\nf 1277//232 922//232 217//232\nf 1278//233 923//233 331//233\nf 1279//234 657//234 216//234\nf 1280//235 926//235 219//235\nf 1281//236 927//236 332//236\nf 659//237 218//237 929//237\nf 1283//238 930//238 221//238\nf 931//239 333//239 932//239\nf 661//240 220//240 933//240\nf 1286//241 934//241 223//241\nf 1287//242 935//242 334//242\nf 1288//243 663//243 222//243\nf 1289//244 938//244 226//244\nf 939//245 335//245 940//245\nf 666//246 225//246 941//246\nf 942//247 228//247 489//247\nf 1293//248 943//248 336//248\nf 1294//249 668//249 227//249\nf 946//250 230//250 491//250\nf 947//251 337//251 948//251\nf 670//252 229//252 949//252\nf 950//253 232//253 493//253\nf 951//254 338//254 952//254\nf 672//255 231//255 953//255\nf 1301//256 954//256 234//256\nf 1302//257 955//257 339//257\nf 674//258 233//258 957//258\nf 1304//259 958//259 236//259\nf 1305//260 959//260 340//260\nf 676//261 235//261 961//261\nf 1307//262 962//262 238//262\nf 963//263 341//263 964//263\nf 1309//264 678//264 237//264\nf 966//265 240//265 501//265\nf 1311//266 967//266 342//266\nf 680//267 239//267 969//267\nf 1313//268 970//268 242//268\nf 1314//269 971//269 343//269\nf 1315//270 682//270 241//270\nf 974//271 245//271 506//271\nf 1317//272 975//272 344//272\nf 1318//273 685//273 244//273\nf 978//274 247//274 508//274\nf 1320//275 979//275 345//275\nf 687//276 246//276 981//276\nf 982//277 249//277 510//277\nf 983//278 346//278 984//278\nf 689//279 248//279 985//279\nf 986//280 251//280 512//280\nf 987//281 347//281 988//281\nf 691//282 250//282 989//282\nf 1328//283 990//283 253//283\nf 991//284 348//284 992//284\nf 1330//285 693//285 252//285\nf 1331//286 994//286 255//286\nf 995//287 349//287 996//287\nf 695//288 254//288 997//288\nf 998//289 257//289 518//289\nf 1335//290 999//290 350//290\nf 1336//291 697//291 256//291\nf 1337//292 1002//292 259//292\nf 1003//293 351//293 1004//293\nf 1339//294 699//294 258//294\nf 1340//295 1006//295 261//295\nf 1341//296 1007//296 352//296\nf 1342//297 701//297 260//297\nf 1343//298 1010//298 264//298\nf 1344//299 1011//299 353//299\nf 1345//300 704//300 263//300\nf 1014//301 266//301 527//301\nf 1347//302 1015//302 354//302\nf 1348//303 706//303 265//303\nf 1018//304 268//304 529//304\nf 1019//305 355//305 1020//305\nf 708//306 267//306 1021//306\nf 1022//307 270//307 531//307\nf 1023//308 356//308 1024//308\nf 710//309 269//309 1025//309\nf 1355//310 1026//310 272//310\nf 1356//311 1027//311 357//311\nf 1357//312 712//312 271//312\nf 1358//313 1030//313 274//313\nf 1359//314 1031//314 358//314\nf 714//315 273//315 1033//315\nf 1034//316 276//316 537//316\nf 1035//317 359//317 1036//317\nf 716//318 275//318 1037//318\nf 1038//319 278//319 539//319\nf 1039//320 360//320 1040//320\nf 1366//321 718//321 277//321\nf 1042//322 280//322 541//322\nf 1368//323 1043//323 361//323\nf 1369//324 720//324 279//324\nf 1046//325 545//325 104//325\nf 725//326 1046//326 722//326\nf 725//327 103//327 364//327\nf 1047//328 548//328 107//328\nf 729//329 1047//329 726//329\nf 729//330 106//330 367//330\nf 730//331 1048//331 551//331\nf 283//332 733//332 1048//332\nf 733//333 109//333 370//333\nf 734//334 1049//334 554//334\nf 284//335 737//335 1049//335\nf 737//336 112//336 373//336\nf 738//337 1050//337 557//337\nf 285//338 741//338 1050//338\nf 741//339 115//339 376//339\nf 742//340 1051//340 560//340\nf 286//341 745//341 1051//341\nf 745//342 118//342 379//342\nf 1052//343 563//343 122//343\nf 287//344 749//344 1052//344\nf 749//345 121//345 382//345\nf 750//346 1053//346 566//346\nf 753//347 1053//347 750//347\nf 124//348 385//348 1053//348\nf 754//349 1054//349 569//349\nf 289//350 757//350 1054//350\nf 757//351 127//351 388//351\nf 758//352 1055//352 572//352\nf 290//353 761//353 1055//353\nf 130//354 391//354 1055//354\nf 1056//355 574//355 133//355\nf 765//356 1056//356 762//356\nf 132//357 393//357 1056//357\nf 766//358 1057//358 576//358\nf 292//359 769//359 1057//359\nf 769//360 134//360 395//360\nf 770//361 1058//361 578//361\nf 293//362 773//362 1058//362\nf 773//363 136//363 397//363\nf 774//364 1059//364 580//364\nf 294//365 777//365 1059//365\nf 777//366 138//366 399//366\nf 1060//367 582//367 141//367\nf 295//368 781//368 1060//368\nf 781//369 140//369 401//369\nf 1061//370 584//370 143//370\nf 296//371 785//371 1061//371\nf 785//372 142//372 403//372\nf 786//373 1062//373 586//373\nf 297//374 789//374 1062//374\nf 789//375 144//375 405//375\nf 790//376 1063//376 588//376\nf 298//377 793//377 1063//377\nf 793//378 146//378 407//378\nf 794//379 1064//379 591//379\nf 299//380 797//380 1064//380\nf 797//381 149//381 410//381\nf 798//382 1065//382 593//382\nf 300//383 801//383 1065//383\nf 801//384 151//384 412//384\nf 802//385 1066//385 595//385\nf 301//386 805//386 1066//386\nf 805//387 153//387 414//387\nf 1067//388 597//388 156//388\nf 809//389 1067//389 806//389\nf 155//390 416//390 1067//390\nf 1068//391 599//391 158//391\nf 813//392 1068//392 810//392\nf 157//393 418//393 1068//393\nf 814//394 1069//394 601//394\nf 817//395 1069//395 814//395\nf 159//396 420//396 1069//396\nf 818//397 1070//397 603//397\nf 821//398 1070//398 818//398\nf 161//399 422//399 1070//399\nf 822//400 1071//400 605//400\nf 825//401 1071//401 822//401\nf 163//402 424//402 1071//402\nf 826//403 1072//403 607//403\nf 307//404 829//404 1072//404\nf 829//405 165//405 426//405\nf 1073//406 610//406 169//406\nf 833//407 1073//407 830//407\nf 833//408 168//408 429//408\nf 834//409 1074//409 612//409\nf 309//410 837//410 1074//410\nf 837//411 170//411 431//411\nf 838//412 1075//412 614//412\nf 310//413 841//413 1075//413\nf 841//414 172//414 433//414\nf 1076//415 616//415 175//415\nf 845//416 1076//416 842//416\nf 174//417 435//417 1076//417\nf 846//418 1077//418 618//418\nf 312//419 849//419 1077//419\nf 849//420 176//420 437//420\nf 1078//421 620//421 179//421\nf 853//422 1078//422 850//422\nf 178//423 439//423 1078//423\nf 854//424 1079//424 622//424\nf 314//425 857//425 1079//425\nf 180//426 441//426 1079//426\nf 1080//427 624//427 183//427\nf 861//428 1080//428 858//428\nf 861//429 182//429 443//429\nf 862//430 1081//430 626//430\nf 865//431 1081//431 862//431\nf 184//432 445//432 1081//432\nf 866//433 1082//433 629//433\nf 317//434 869//434 1082//434\nf 187//435 448//435 1082//435\nf 1083//436 631//436 190//436\nf 873//437 1083//437 870//437\nf 189//438 450//438 1083//438\nf 874//439 1084//439 633//439\nf 877//440 1084//440 874//440\nf 191//441 452//441 1084//441\nf 878//442 1085//442 635//442\nf 320//443 881//443 1085//443\nf 193//444 454//444 1085//444\nf 1086//445 637//445 196//445\nf 885//446 1086//446 882//446\nf 885//447 195//447 456//447\nf 886//448 1087//448 639//448\nf 322//449 889//449 1087//449\nf 889//450 197//450 458//450\nf 890//451 1088//451 641//451\nf 893//452 1088//452 890//452\nf 893//453 199//453 460//453\nf 894//454 1089//454 643//454\nf 897//455 1089//455 894//455\nf 201//456 462//456 1089//456\nf 1090//457 645//457 204//457\nf 901//458 1090//458 898//458\nf 203//459 464//459 1090//459\nf 902//460 1091//460 648//460\nf 326//461 905//461 1091//461\nf 905//462 206//462 467//462\nf 1092//463 650//463 209//463\nf 909//464 1092//464 906//464\nf 909//465 208//465 469//465\nf 1093//466 652//466 211//466\nf 913//467 1093//467 910//467\nf 210//468 471//468 1093//468\nf 914//469 1094//469 654//469\nf 917//470 1094//470 914//470\nf 212//471 473//471 1094//471\nf 1095//472 656//472 215//472\nf 921//473 1095//473 918//473\nf 214//474 475//474 1095//474\nf 922//475 1096//475 658//475\nf 331//476 925//476 1096//476\nf 925//477 216//477 477//477\nf 926//478 1097//478 660//478\nf 332//479 929//479 1097//479\nf 929//480 218//480 479//480\nf 1098//481 662//481 221//481\nf 933//482 1098//482 930//482\nf 220//483 481//483 1098//483\nf 1099//484 664//484 223//484\nf 334//485 937//485 1099//485\nf 937//486 222//486 483//486\nf 938//487 1100//487 667//487\nf 941//488 1100//488 938//488\nf 225//489 486//489 1100//489\nf 942//490 1101//490 669//490\nf 336//491 945//491 1101//491\nf 945//492 227//492 488//492\nf 1102//493 671//493 230//493\nf 949//494 1102//494 946//494\nf 229//495 490//495 1102//495\nf 1103//496 673//496 232//496\nf 953//497 1103//497 950//497\nf 231//498 492//498 1103//498\nf 954//499 1104//499 675//499\nf 339//500 957//500 1104//500\nf 957//501 233//501 494//501\nf 1105//502 677//502 236//502\nf 340//503 961//503 1105//503\nf 235//504 496//504 1105//504\nf 962//505 1106//505 679//505\nf 341//506 965//506 1106//506\nf 965//507 237//507 498//507\nf 1107//508 681//508 240//508\nf 342//509 969//509 1107//509\nf 239//510 500//510 1107//510\nf 1108//511 683//511 242//511\nf 973//512 1108//512 970//512\nf 241//513 502//513 1108//513\nf 974//514 1109//514 686//514\nf 344//515 977//515 1109//515\nf 977//516 244//516 505//516\nf 1110//517 688//517 247//517\nf 981//518 1110//518 978//518\nf 246//519 507//519 1110//519\nf 1111//520 690//520 249//520\nf 985//521 1111//521 982//521\nf 248//522 509//522 1111//522\nf 1112//523 692//523 251//523\nf 989//524 1112//524 986//524\nf 250//525 511//525 1112//525\nf 990//526 1113//526 694//526\nf 348//527 993//527 1113//527\nf 993//528 252//528 513//528\nf 994//529 1114//529 696//529\nf 997//530 1114//530 994//530\nf 254//531 515//531 1114//531\nf 998//532 1115//532 698//532\nf 350//533 1001//533 1115//533\nf 1001//534 256//534 517//534\nf 1002//535 1116//535 700//535\nf 351//536 1005//536 1116//536\nf 1005//537 258//537 519//537\nf 1006//538 1117//538 702//538\nf 352//539 1009//539 1117//539\nf 1009//540 260//540 521//540\nf 1010//541 1118//541 705//541\nf 353//542 1013//542 1118//542\nf 1013//543 263//543 524//543\nf 1119//544 707//544 266//544\nf 1017//545 1119//545 1014//545\nf 1017//546 265//546 526//546\nf 1120//547 709//547 268//547\nf 1021//548 1120//548 1018//548\nf 267//549 528//549 1120//549\nf 1121//550 711//550 270//550\nf 1025//551 1121//551 1022//551\nf 269//552 530//552 1121//552\nf 1026//553 1122//553 713//553\nf 357//554 1029//554 1122//554\nf 1029//555 271//555 532//555\nf 1123//556 715//556 274//556\nf 1033//557 1123//557 1030//557\nf 273//558 534//558 1123//558\nf 1124//559 717//559 276//559\nf 1037//560 1124//560 1034//560\nf 275//561 536//561 1124//561\nf 1125//562 719//562 278//562\nf 1041//563 1125//563 1038//563\nf 1041//564 277//564 538//564\nf 1126//565 721//565 280//565\nf 1045//566 1126//566 1042//566\nf 279//567 540//567 1126//567\nf 1127//568 365//568 11//568\nf 724//569 1127//569 542//569\nf 281//570 722//570 1127//570\nf 1128//571 724//571 101//571\nf 543//572 1128//572 362//572\nf 102//573 723//573 1128//573\nf 1129//574 725//574 281//574\nf 363//575 1129//575 723//575\nf 2//576 544//576 1129//576\nf 364//577 1130//577 368//577\nf 103//578 728//578 1130//578\nf 728//579 282//579 726//579\nf 544//580 1131//580 728//580\nf 2//581 546//581 1131//581\nf 546//582 105//582 727//582\nf 727//583 1132//583 729//583\nf 105//584 366//584 1132//584\nf 366//585 3//585 547//585\nf 367//586 1133//586 371//586\nf 106//587 732//587 1133//587\nf 732//588 283//588 730//588\nf 547//589 1134//589 732//589\nf 3//590 549//590 1134//590\nf 549//591 108//591 731//591\nf 731//592 1135//592 733//592\nf 108//593 369//593 1135//593\nf 369//594 4//594 550//594\nf 370//595 1136//595 374//595\nf 109//596 736//596 1136//596\nf 736//597 284//597 734//597\nf 550//598 1137//598 736//598\nf 4//599 552//599 1137//599\nf 552//600 111//600 735//600\nf 735//601 1138//601 737//601\nf 111//602 372//602 1138//602\nf 5//603 553//603 1138//603\nf 373//604 1139//604 377//604\nf 112//605 740//605 1139//605\nf 740//606 285//606 738//606\nf 553//607 1140//607 740//607\nf 555//608 1140//608 553//608\nf 114//609 739//609 1140//609\nf 1141//610 741//610 285//610\nf 375//611 1141//611 739//611\nf 6//612 556//612 1141//612\nf 376//613 1142//613 380//613\nf 115//614 744//614 1142//614\nf 744//615 286//615 742//615\nf 556//616 1143//616 744//616\nf 6//617 558//617 1143//617\nf 558//618 117//618 743//618\nf 743//619 1144//619 745//619\nf 378//620 1144//620 743//620\nf 7//621 559//621 1144//621\nf 379//622 1145//622 383//622\nf 118//623 748//623 1145//623\nf 748//624 287//624 746//624\nf 559//625 1146//625 748//625\nf 7//626 561//626 1146//626\nf 561//627 120//627 747//627\nf 747//628 1147//628 749//628\nf 120//629 381//629 1147//629\nf 381//630 8//630 562//630\nf 382//631 1148//631 386//631\nf 121//632 752//632 1148//632\nf 752//633 288//633 750//633\nf 562//634 1149//634 752//634\nf 8//635 564//635 1149//635\nf 564//636 123//636 751//636\nf 1150//637 753//637 288//637\nf 384//638 1150//638 751//638\nf 9//639 565//639 1150//639\nf 385//640 1151//640 389//640\nf 124//641 756//641 1151//641\nf 756//642 289//642 754//642\nf 1152//643 756//643 124//643\nf 9//644 567//644 1152//644\nf 567//645 126//645 755//645\nf 755//646 1153//646 757//646\nf 126//647 387//647 1153//647\nf 387//648 10//648 568//648\nf 570//649 1154//649 392//649\nf 129//650 760//650 1154//650\nf 760//651 290//651 758//651\nf 1155//652 760//652 129//652\nf 365//653 1155//653 390//653\nf 104//654 759//654 1155//654\nf 759//655 1156//655 761//655\nf 104//656 545//656 1156//656\nf 545//657 12//657 571//657\nf 1157//658 394//658 22//658\nf 764//659 1157//659 391//659\nf 291//660 762//660 1157//660\nf 1158//661 764//661 130//661\nf 12//662 368//662 1158//662\nf 107//663 763//663 1158//663\nf 1159//664 765//664 291//664\nf 548//665 1159//665 763//665\nf 13//666 573//666 1159//666\nf 393//667 1160//667 396//667\nf 132//668 768//668 1160//668\nf 768//669 292//669 766//669\nf 1161//670 768//670 132//670\nf 371//671 1161//671 573//671\nf 371//672 110//672 767//672\nf 767//673 1162//673 769//673\nf 110//674 551//674 1162//674\nf 551//675 14//675 575//675\nf 395//676 1163//676 398//676\nf 134//677 772//677 1163//677\nf 772//678 293//678 770//678\nf 575//679 1164//679 772//679\nf 14//680 374//680 1164//680\nf 374//681 113//681 771//681\nf 771//682 1165//682 773//682\nf 113//683 554//683 1165//683\nf 554//684 15//684 577//684\nf 397//685 1166//685 400//685\nf 136//686 776//686 1166//686\nf 776//687 294//687 774//687\nf 577//688 1167//688 776//688\nf 15//689 377//689 1167//689\nf 377//690 116//690 775//690\nf 1168//691 777//691 294//691\nf 557//692 1168//692 775//692\nf 557//693 16//693 579//693\nf 1169//694 402//694 26//694\nf 138//695 780//695 1169//695\nf 780//696 295//696 778//696\nf 579//697 1170//697 780//697\nf 16//698 380//698 1170//698\nf 380//699 119//699 779//699\nf 779//700 1171//700 781//700\nf 119//701 560//701 1171//701\nf 560//702 17//702 581//702\nf 1172//703 404//703 27//703\nf 140//704 784//704 1172//704\nf 784//705 296//705 782//705\nf 581//706 1173//706 784//706\nf 17//707 383//707 1173//707\nf 122//708 783//708 1173//708\nf 783//709 1174//709 785//709\nf 563//710 1174//710 783//710\nf 563//711 18//711 583//711\nf 1175//712 406//712 28//712\nf 788//713 1175//713 403//713\nf 297//714 786//714 1175//714\nf 1176//715 788//715 142//715\nf 18//716 386//716 1176//716\nf 386//717 125//717 787//717\nf 787//718 1177//718 789//718\nf 125//719 566//719 1177//719\nf 566//720 19//720 585//720\nf 405//721 1178//721 408//721\nf 144//722 792//722 1178//722\nf 792//723 298//723 790//723\nf 585//724 1179//724 792//724\nf 389//725 1179//725 585//725\nf 128//726 791//726 1179//726\nf 791//727 1180//727 793//727\nf 569//728 1180//728 791//728\nf 569//729 20//729 587//729\nf 1181//730 411//730 31//730\nf 796//731 1181//731 589//731\nf 299//732 794//732 1181//732\nf 1182//733 796//733 148//733\nf 21//734 392//734 1182//734\nf 392//735 131//735 795//735\nf 795//736 1183//736 797//736\nf 131//737 572//737 1183//737\nf 572//738 22//738 590//738\nf 410//739 1184//739 413//739\nf 149//740 800//740 1184//740\nf 800//741 300//741 798//741\nf 590//742 1185//742 800//742\nf 394//743 1185//743 590//743\nf 133//744 799//744 1185//744\nf 799//745 1186//745 801//745\nf 133//746 574//746 1186//746\nf 23//747 592//747 1186//747\nf 412//748 1187//748 415//748\nf 151//749 804//749 1187//749\nf 804//750 301//750 802//750\nf 592//751 1188//751 804//751\nf 23//752 396//752 1188//752\nf 396//753 135//753 803//753\nf 803//754 1189//754 805//754\nf 135//755 576//755 1189//755\nf 576//756 24//756 594//756\nf 414//757 1190//757 417//757\nf 153//758 808//758 1190//758\nf 302//759 806//759 1190//759\nf 1191//760 808//760 153//760\nf 24//761 398//761 1191//761\nf 137//762 807//762 1191//762\nf 1192//763 809//763 302//763\nf 137//764 578//764 1192//764\nf 578//765 25//765 596//765\nf 1193//766 419//766 35//766\nf 812//767 1193//767 416//767\nf 303//768 810//768 1193//768\nf 1194//769 812//769 155//769\nf 25//770 400//770 1194//770\nf 400//771 139//771 811//771\nf 1195//772 813//772 303//772\nf 139//773 580//773 1195//773\nf 26//774 598//774 1195//774\nf 418//775 1196//775 421//775\nf 157//776 816//776 1196//776\nf 816//777 304//777 814//777\nf 1197//778 816//778 157//778\nf 402//779 1197//779 598//779\nf 141//780 815//780 1197//780\nf 1198//781 817//781 304//781\nf 582//782 1198//782 815//782\nf 582//783 27//783 600//783\nf 1199//784 423//784 37//784\nf 820//785 1199//785 420//785\nf 305//786 818//786 1199//786\nf 1200//787 820//787 159//787\nf 27//788 404//788 1200//788\nf 143//789 819//789 1200//789\nf 1201//790 821//790 305//790\nf 584//791 1201//791 819//791\nf 28//792 602//792 1201//792\nf 422//793 1202//793 425//793\nf 824//794 1202//794 422//794\nf 306//795 822//795 1202//795\nf 1203//796 824//796 161//796\nf 406//797 1203//797 602//797\nf 145//798 823//798 1203//798\nf 1204//799 825//799 306//799\nf 586//800 1204//800 823//800\nf 586//801 29//801 604//801\nf 424//802 1205//802 427//802\nf 163//803 828//803 1205//803\nf 828//804 307//804 826//804\nf 604//805 1206//805 828//805\nf 29//806 408//806 1206//806\nf 408//807 147//807 827//807\nf 827//808 1207//808 829//808\nf 147//809 588//809 1207//809\nf 30//810 606//810 1207//810\nf 608//811 1208//811 430//811\nf 167//812 832//812 1208//812\nf 308//813 830//813 1208//813\nf 428//814 1209//814 832//814\nf 31//815 411//815 1209//815\nf 150//816 831//816 1209//816\nf 1210//817 833//817 308//817\nf 591//818 1210//818 831//818\nf 591//819 32//819 609//819\nf 429//820 1211//820 432//820\nf 168//821 836//821 1211//821\nf 836//822 309//822 834//822\nf 609//823 1212//823 836//823\nf 32//824 413//824 1212//824\nf 413//825 152//825 835//825\nf 835//826 1213//826 837//826\nf 152//827 593//827 1213//827\nf 593//828 33//828 611//828\nf 1214//829 434//829 43//829\nf 170//830 840//830 1214//830\nf 840//831 310//831 838//831\nf 611//832 1215//832 840//832\nf 33//833 415//833 1215//833\nf 415//834 154//834 839//834\nf 839//835 1216//835 841//835\nf 154//836 595//836 1216//836\nf 595//837 34//837 613//837\nf 1217//838 436//838 44//838\nf 844//839 1217//839 433//839\nf 311//840 842//840 1217//840\nf 613//841 1218//841 844//841\nf 34//842 417//842 1218//842\nf 417//843 156//843 843//843\nf 1219//844 845//844 311//844\nf 597//845 1219//845 843//845\nf 35//846 615//846 1219//846\nf 1220//847 438//847 45//847\nf 848//848 1220//848 435//848\nf 848//849 312//849 846//849\nf 1221//850 848//850 174//850\nf 419//851 1221//851 615//851\nf 419//852 158//852 847//852\nf 847//853 1222//853 849//853\nf 158//854 599//854 1222//854\nf 599//855 36//855 617//855\nf 437//856 1223//856 440//856\nf 176//857 852//857 1223//857\nf 852//858 313//858 850//858\nf 617//859 1224//859 852//859\nf 36//860 421//860 1224//860\nf 421//861 160//861 851//861\nf 1225//862 853//862 313//862\nf 601//863 1225//863 851//863\nf 37//864 619//864 1225//864\nf 1226//865 442//865 47//865\nf 856//866 1226//866 439//866\nf 856//867 314//867 854//867\nf 1227//868 856//868 178//868\nf 423//869 1227//869 619//869\nf 162//870 855//870 1227//870\nf 855//871 1228//871 857//871\nf 162//872 603//872 1228//872\nf 38//873 621//873 1228//873\nf 441//874 1229//874 444//874\nf 860//875 1229//875 441//875\nf 315//876 858//876 1229//876\nf 1230//877 860//877 180//877\nf 425//878 1230//878 621//878\nf 164//879 859//879 1230//879\nf 1231//880 861//880 315//880\nf 164//881 605//881 1231//881\nf 605//882 39//882 623//882\nf 443//883 1232//883 446//883\nf 182//884 864//884 1232//884\nf 864//885 316//885 862//885\nf 623//886 1233//886 864//886\nf 39//887 427//887 1233//887\nf 427//888 166//888 863//888\nf 863//889 1234//889 865//889\nf 166//890 607//890 1234//890\nf 607//891 40//891 625//891\nf 627//892 1235//892 449//892\nf 868//893 1235//893 627//893\nf 868//894 317//894 866//894\nf 447//895 1236//895 868//895\nf 41//896 430//896 1236//896\nf 169//897 867//897 1236//897\nf 1237//898 869//898 317//898\nf 610//899 1237//899 867//899\nf 42//900 628//900 1237//900\nf 448//901 1238//901 451//901\nf 187//902 872//902 1238//902\nf 318//903 870//903 1238//903\nf 628//904 1239//904 872//904\nf 42//905 432//905 1239//905\nf 432//906 171//906 871//906\nf 871//907 1240//907 873//907\nf 171//908 612//908 1240//908\nf 612//909 43//909 630//909\nf 450//910 1241//910 453//910\nf 876//911 1241//911 450//911\nf 319//912 874//912 1241//912\nf 630//913 1242//913 876//913\nf 43//914 434//914 1242//914\nf 434//915 173//915 875//915\nf 1243//916 877//916 319//916\nf 173//917 614//917 1243//917\nf 614//918 44//918 632//918\nf 452//919 1244//919 455//919\nf 191//920 880//920 1244//920\nf 880//921 320//921 878//921\nf 632//922 1245//922 880//922\nf 436//923 1245//923 632//923\nf 175//924 879//924 1245//924\nf 879//925 1246//925 881//925\nf 616//926 1246//926 879//926\nf 45//927 634//927 1246//927\nf 1247//928 457//928 55//928\nf 884//929 1247//929 454//929\nf 321//930 882//930 1247//930\nf 1248//931 884//931 193//931\nf 438//932 1248//932 634//932\nf 177//933 883//933 1248//933\nf 1249//934 885//934 321//934\nf 618//935 1249//935 883//935\nf 618//936 46//936 636//936\nf 1250//937 459//937 56//937\nf 888//938 1250//938 456//938\nf 888//939 322//939 886//939\nf 1251//940 888//940 195//940\nf 46//941 440//941 1251//941\nf 440//942 179//942 887//942\nf 1252//943 889//943 322//943\nf 620//944 1252//944 887//944\nf 47//945 638//945 1252//945\nf 458//946 1253//946 461//946\nf 197//947 892//947 1253//947\nf 323//948 890//948 1253//948\nf 1254//949 892//949 197//949\nf 442//950 1254//950 638//950\nf 181//951 891//951 1254//951\nf 1255//952 893//952 323//952\nf 181//953 622//953 1255//953\nf 622//954 48//954 640//954\nf 460//955 1256//955 463//955\nf 199//956 896//956 1256//956\nf 896//957 324//957 894//957\nf 640//958 1257//958 896//958\nf 48//959 444//959 1257//959\nf 444//960 183//960 895//960\nf 1258//961 897//961 324//961\nf 183//962 624//962 1258//962\nf 624//963 49//963 642//963\nf 462//964 1259//964 465//964\nf 201//965 900//965 1259//965\nf 325//966 898//966 1259//966\nf 642//967 1260//967 900//967\nf 49//968 446//968 1260//968\nf 446//969 185//969 899//969\nf 1261//970 901//970 325//970\nf 185//971 626//971 1261//971\nf 50//972 644//972 1261//972\nf 646//973 1262//973 468//973\nf 205//974 904//974 1262//974\nf 904//975 326//975 902//975\nf 466//976 1263//976 904//976\nf 51//977 449//977 1263//977\nf 449//978 188//978 903//978\nf 903//979 1264//979 905//979\nf 188//980 629//980 1264//980\nf 629//981 52//981 647//981\nf 1265//982 470//982 62//982\nf 908//983 1265//983 467//983\nf 327//984 906//984 1265//984\nf 1266//985 908//985 206//985\nf 52//986 451//986 1266//986\nf 451//987 190//987 907//987\nf 907//988 1267//988 909//988\nf 190//989 631//989 1267//989\nf 631//990 53//990 649//990\nf 1268//991 472//991 63//991\nf 208//992 912//992 1268//992\nf 912//993 328//993 910//993\nf 649//994 1269//994 912//994\nf 53//995 453//995 1269//995\nf 453//996 192//996 911//996\nf 911//997 1270//997 913//997\nf 192//998 633//998 1270//998\nf 633//999 54//999 651//999\nf 1271//1000 474//1000 64//1000\nf 916//1001 1271//1001 471//1001\nf 329//1002 914//1002 1271//1002\nf 651//1003 1272//1003 916//1003\nf 54//1004 455//1004 1272//1004\nf 455//1005 194//1005 915//1005\nf 1273//1006 917//1006 329//1006\nf 635//1007 1273//1007 915//1007\nf 55//1008 653//1008 1273//1008\nf 1274//1009 476//1009 65//1009\nf 920//1010 1274//1010 473//1010\nf 330//1011 918//1011 1274//1011\nf 1275//1012 920//1012 212//1012\nf 457//1013 1275//1013 653//1013\nf 196//1014 919//1014 1275//1014\nf 1276//1015 921//1015 330//1015\nf 637//1016 1276//1016 919//1016\nf 56//1017 655//1017 1276//1017\nf 475//1018 1277//1018 478//1018\nf 214//1019 924//1019 1277//1019\nf 924//1020 331//1020 922//1020\nf 655//1021 1278//1021 924//1021\nf 459//1022 1278//1022 655//1022\nf 459//1023 198//1023 923//1023\nf 923//1024 1279//1024 925//1024\nf 198//1025 639//1025 1279//1025\nf 639//1026 57//1026 657//1026\nf 477//1027 1280//1027 480//1027\nf 216//1028 928//1028 1280//1028\nf 928//1029 332//1029 926//1029\nf 657//1030 1281//1030 928//1030\nf 57//1031 461//1031 1281//1031\nf 461//1032 200//1032 927//1032\nf 927//1033 1282//1033 929//1033\nf 200//1034 641//1034 1282//1034\nf 641//1035 58//1035 659//1035\nf 479//1036 1283//1036 482//1036\nf 932//1037 1283//1037 479//1037\nf 932//1038 333//1038 930//1038\nf 1284//1039 932//1039 218//1039\nf 463//1040 1284//1040 659//1040\nf 202//1041 931//1041 1284//1041\nf 1285//1042 933//1042 333//1042\nf 202//1043 643//1043 1285//1043\nf 643//1044 59//1044 661//1044\nf 1286//1045 484//1045 69//1045\nf 936//1046 1286//1046 481//1046\nf 936//1047 334//1047 934//1047\nf 661//1048 1287//1048 936//1048\nf 59//1049 465//1049 1287//1049\nf 465//1050 204//1050 935//1050\nf 935//1051 1288//1051 937//1051\nf 204//1052 645//1052 1288//1052\nf 645//1053 60//1053 663//1053\nf 665//1054 1289//1054 487//1054\nf 940//1055 1289//1055 665//1055\nf 335//1056 938//1056 1289//1056\nf 1290//1057 940//1057 224//1057\nf 61//1058 468//1058 1290//1058\nf 468//1059 207//1059 939//1059\nf 939//1060 1291//1060 941//1060\nf 207//1061 648//1061 1291//1061\nf 648//1062 62//1062 666//1062\nf 1292//1063 489//1063 72//1063\nf 944//1064 1292//1064 486//1064\nf 944//1065 336//1065 942//1065\nf 666//1066 1293//1066 944//1066\nf 62//1067 470//1067 1293//1067\nf 470//1068 209//1068 943//1068\nf 943//1069 1294//1069 945//1069\nf 209//1070 650//1070 1294//1070\nf 650//1071 63//1071 668//1071\nf 1295//1072 491//1072 73//1072\nf 948//1073 1295//1073 488//1073\nf 337//1074 946//1074 1295//1074\nf 668//1075 1296//1075 948//1075\nf 63//1076 472//1076 1296//1076\nf 211//1077 947//1077 1296//1077\nf 1297//1078 949//1078 337//1078\nf 652//1079 1297//1079 947//1079\nf 64//1080 670//1080 1297//1080\nf 1298//1081 493//1081 74//1081\nf 952//1082 1298//1082 490//1082\nf 338//1083 950//1083 1298//1083\nf 1299//1084 952//1084 229//1084\nf 474//1085 1299//1085 670//1085\nf 213//1086 951//1086 1299//1086\nf 1300//1087 953//1087 338//1087\nf 654//1088 1300//1088 951//1088\nf 65//1089 672//1089 1300//1089\nf 492//1090 1301//1090 495//1090\nf 231//1091 956//1091 1301//1091\nf 956//1092 339//1092 954//1092\nf 672//1093 1302//1093 956//1093\nf 476//1094 1302//1094 672//1094\nf 215//1095 955//1095 1302//1095\nf 1303//1096 957//1096 339//1096\nf 656//1097 1303//1097 955//1097\nf 66//1098 674//1098 1303//1098\nf 494//1099 1304//1099 497//1099\nf 233//1100 960//1100 1304//1100\nf 960//1101 340//1101 958//1101\nf 674//1102 1305//1102 960//1102\nf 478//1103 1305//1103 674//1103\nf 478//1104 217//1104 959//1104\nf 959//1105 1306//1105 961//1105\nf 217//1106 658//1106 1306//1106\nf 658//1107 67//1107 676//1107\nf 1307//1108 499//1108 77//1108\nf 964//1109 1307//1109 496//1109\nf 341//1110 962//1110 1307//1110\nf 1308//1111 964//1111 235//1111\nf 67//1112 480//1112 1308//1112\nf 219//1113 963//1113 1308//1113\nf 963//1114 1309//1114 965//1114\nf 219//1115 660//1115 1309//1115\nf 660//1116 68//1116 678//1116\nf 1310//1117 501//1117 78//1117\nf 237//1118 968//1118 1310//1118\nf 968//1119 342//1119 966//1119\nf 678//1120 1311//1120 968//1120\nf 68//1121 482//1121 1311//1121\nf 221//1122 967//1122 1311//1122\nf 1312//1123 969//1123 342//1123\nf 662//1124 1312//1124 967//1124\nf 69//1125 680//1125 1312//1125\nf 500//1126 1313//1126 503//1126\nf 972//1127 1313//1127 500//1127\nf 343//1128 970//1128 1313//1128\nf 1314//1129 972//1129 239//1129\nf 484//1130 1314//1130 680//1130\nf 484//1131 223//1131 971//1131\nf 971//1132 1315//1132 973//1132\nf 223//1133 664//1133 1315//1133\nf 70//1134 682//1134 1315//1134\nf 1316//1135 506//1135 81//1135\nf 976//1136 1316//1136 684//1136\nf 344//1137 974//1137 1316//1137\nf 504//1138 1317//1138 976//1138\nf 71//1139 487//1139 1317//1139\nf 487//1140 226//1140 975//1140\nf 975//1141 1318//1141 977//1141\nf 226//1142 667//1142 1318//1142\nf 667//1143 72//1143 685//1143\nf 505//1144 1319//1144 508//1144\nf 244//1145 980//1145 1319//1145\nf 980//1146 345//1146 978//1146\nf 685//1147 1320//1147 980//1147\nf 489//1148 1320//1148 685//1148\nf 489//1149 228//1149 979//1149\nf 979//1150 1321//1150 981//1150\nf 228//1151 669//1151 1321//1151\nf 669//1152 73//1152 687//1152\nf 1322//1153 510//1153 83//1153\nf 984//1154 1322//1154 507//1154\nf 346//1155 982//1155 1322//1155\nf 1323//1156 984//1156 246//1156\nf 491//1157 1323//1157 687//1157\nf 230//1158 983//1158 1323//1158\nf 1324//1159 985//1159 346//1159\nf 671//1160 1324//1160 983//1160\nf 74//1161 689//1161 1324//1161\nf 1325//1162 512//1162 84//1162\nf 988//1163 1325//1163 509//1163\nf 347//1164 986//1164 1325//1164\nf 1326//1165 988//1165 248//1165\nf 493//1166 1326//1166 689//1166\nf 232//1167 987//1167 1326//1167\nf 1327//1168 989//1168 347//1168\nf 673//1169 1327//1169 987//1169\nf 75//1170 691//1170 1327//1170\nf 1328//1171 514//1171 85//1171\nf 992//1172 1328//1172 511//1172\nf 348//1173 990//1173 1328//1173\nf 1329//1174 992//1174 250//1174\nf 495//1175 1329//1175 691//1175\nf 495//1176 234//1176 991//1176\nf 1330//1177 993//1177 348//1177\nf 675//1178 1330//1178 991//1178\nf 76//1179 693//1179 1330//1179\nf 513//1180 1331//1180 516//1180\nf 252//1181 996//1181 1331//1181\nf 996//1182 349//1182 994//1182\nf 1332//1183 996//1183 252//1183\nf 497//1184 1332//1184 693//1184\nf 236//1185 995//1185 1332//1185\nf 1333//1186 997//1186 349//1186\nf 677//1187 1333//1187 995//1187\nf 77//1188 695//1188 1333//1188\nf 1334//1189 518//1189 87//1189\nf 1000//1190 1334//1190 515//1190\nf 350//1191 998//1191 1334//1191\nf 1335//1192 1000//1192 254//1192\nf 77//1193 499//1193 1335//1193\nf 499//1194 238//1194 999//1194\nf 999//1195 1336//1195 1001//1195\nf 679//1196 1336//1196 999//1196\nf 78//1197 697//1197 1336//1197\nf 517//1198 1337//1198 520//1198\nf 256//1199 1004//1199 1337//1199\nf 1004//1200 351//1200 1002//1200\nf 1338//1201 1004//1201 256//1201\nf 501//1202 1338//1202 697//1202\nf 240//1203 1003//1203 1338//1203\nf 1003//1204 1339//1204 1005//1204\nf 240//1205 681//1205 1339//1205\nf 681//1206 79//1206 699//1206\nf 519//1207 1340//1207 522//1207\nf 258//1208 1008//1208 1340//1208\nf 1008//1209 352//1209 1006//1209\nf 699//1210 1341//1210 1008//1210\nf 79//1211 503//1211 1341//1211\nf 503//1212 242//1212 1007//1212\nf 1007//1213 1342//1213 1009//1213\nf 242//1214 683//1214 1342//1214\nf 683//1215 80//1215 701//1215\nf 703//1216 1343//1216 525//1216\nf 262//1217 1012//1217 1343//1217\nf 1012//1218 353//1218 1010//1218\nf 523//1219 1344//1219 1012//1219\nf 506//1220 1344//1220 523//1220\nf 245//1221 1011//1221 1344//1221\nf 1011//1222 1345//1222 1013//1222\nf 245//1223 686//1223 1345//1223\nf 686//1224 82//1224 704//1224\nf 1346//1225 527//1225 92//1225\nf 1016//1226 1346//1226 524//1226\nf 354//1227 1014//1227 1346//1227\nf 704//1228 1347//1228 1016//1228\nf 82//1229 508//1229 1347//1229\nf 508//1230 247//1230 1015//1230\nf 1015//1231 1348//1231 1017//1231\nf 247//1232 688//1232 1348//1232\nf 83//1233 706//1233 1348//1233\nf 1349//1234 529//1234 93//1234\nf 1020//1235 1349//1235 526//1235\nf 355//1236 1018//1236 1349//1236\nf 1350//1237 1020//1237 265//1237\nf 510//1238 1350//1238 706//1238\nf 249//1239 1019//1239 1350//1239\nf 1351//1240 1021//1240 355//1240\nf 690//1241 1351//1241 1019//1241\nf 84//1242 708//1242 1351//1242\nf 1352//1243 531//1243 94//1243\nf 1024//1244 1352//1244 528//1244\nf 356//1245 1022//1245 1352//1245\nf 1353//1246 1024//1246 267//1246\nf 512//1247 1353//1247 708//1247\nf 251//1248 1023//1248 1353//1248\nf 1354//1249 1025//1249 356//1249\nf 692//1250 1354//1250 1023//1250\nf 85//1251 710//1251 1354//1251\nf 530//1252 1355//1252 533//1252\nf 1028//1253 1355//1253 530//1253\nf 1028//1254 357//1254 1026//1254\nf 1356//1255 1028//1255 269//1255\nf 514//1256 1356//1256 710//1256\nf 514//1257 253//1257 1027//1257\nf 1027//1258 1357//1258 1029//1258\nf 253//1259 694//1259 1357//1259\nf 694//1260 86//1260 712//1260\nf 532//1261 1358//1261 535//1261\nf 271//1262 1032//1262 1358//1262\nf 1032//1263 358//1263 1030//1263\nf 712//1264 1359//1264 1032//1264\nf 86//1265 516//1265 1359//1265\nf 516//1266 255//1266 1031//1266\nf 1360//1267 1033//1267 358//1267\nf 255//1268 696//1268 1360//1268\nf 696//1269 87//1269 714//1269\nf 1361//1270 537//1270 97//1270\nf 1036//1271 1361//1271 534//1271\nf 359//1272 1034//1272 1361//1272\nf 1362//1273 1036//1273 273//1273\nf 518//1274 1362//1274 714//1274\nf 257//1275 1035//1275 1362//1275\nf 1363//1276 1037//1276 359//1276\nf 698//1277 1363//1277 1035//1277\nf 698//1278 88//1278 716//1278\nf 1364//1279 539//1279 98//1279\nf 1040//1280 1364//1280 536//1280\nf 360//1281 1038//1281 1364//1281\nf 1365//1282 1040//1282 275//1282\nf 88//1283 520//1283 1365//1283\nf 520//1284 259//1284 1039//1284\nf 1039//1285 1366//1285 1041//1285\nf 259//1286 700//1286 1366//1286\nf 700//1287 89//1287 718//1287\nf 1367//1288 541//1288 99//1288\nf 277//1289 1044//1289 1367//1289\nf 361//1290 1042//1290 1367//1290\nf 718//1291 1368//1291 1044//1291\nf 89//1292 522//1292 1368//1292\nf 522//1293 261//1293 1043//1293\nf 1043//1294 1369//1294 1045//1294\nf 261//1295 702//1295 1369//1295\nf 702//1296 90//1296 720//1296\nf 545//1297 1046//1297 12//1297\nf 1047//1298 367//1298 548//1298\nf 551//1299 1048//1299 14//1299\nf 554//1300 1049//1300 15//1300\nf 557//1301 1050//1301 16//1301\nf 560//1302 1051//1302 17//1302\nf 563//1303 1052//1303 18//1303\nf 1053//1304 385//1304 566//1304\nf 569//1305 1054//1305 20//1305\nf 1055//1306 391//1306 572//1306\nf 1056//1307 393//1307 574//1307\nf 576//1308 1057//1308 24//1308\nf 578//1309 1058//1309 25//1309\nf 1059//1310 399//1310 580//1310\nf 582//1311 1060//1311 27//1311\nf 1061//1312 403//1312 584//1312\nf 586//1313 1062//1313 29//1313\nf 588//1314 1063//1314 30//1314\nf 591//1315 1064//1315 32//1315\nf 593//1316 1065//1316 33//1316\nf 595//1317 1066//1317 34//1317\nf 1067//1318 416//1318 597//1318\nf 599//1319 1068//1319 36//1319\nf 1069//1320 420//1320 601//1320\nf 603//1321 1070//1321 38//1321\nf 605//1322 1071//1322 39//1322\nf 607//1323 1072//1323 40//1323\nf 610//1324 1073//1324 42//1324\nf 612//1325 1074//1325 43//1325\nf 614//1326 1075//1326 44//1326\nf 1076//1327 435//1327 616//1327\nf 618//1328 1077//1328 46//1328\nf 1078//1329 439//1329 620//1329\nf 622//1330 1079//1330 48//1330\nf 624//1331 1080//1331 49//1331\nf 1081//1332 445//1332 626//1332\nf 629//1333 1082//1333 52//1333\nf 631//1334 1083//1334 53//1334\nf 633//1335 1084//1335 54//1335\nf 1085//1336 454//1336 635//1336\nf 637//1337 1086//1337 56//1337\nf 639//1338 1087//1338 57//1338\nf 641//1339 1088//1339 58//1339\nf 643//1340 1089//1340 59//1340\nf 1090//1341 464//1341 645//1341\nf 648//1342 1091//1342 62//1342\nf 1092//1343 469//1343 650//1343\nf 1093//1344 471//1344 652//1344\nf 1094//1345 473//1345 654//1345\nf 1095//1346 475//1346 656//1346\nf 658//1347 1096//1347 67//1347\nf 660//1348 1097//1348 68//1348\nf 1098//1349 481//1349 662//1349\nf 1099//1350 483//1350 664//1350\nf 1100//1351 486//1351 667//1351\nf 669//1352 1101//1352 73//1352\nf 1102//1353 490//1353 671//1353\nf 1103//1354 492//1354 673//1354\nf 675//1355 1104//1355 76//1355\nf 1105//1356 496//1356 677//1356\nf 679//1357 1106//1357 78//1357\nf 681//1358 1107//1358 79//1358\nf 1108//1359 502//1359 683//1359\nf 686//1360 1109//1360 82//1360\nf 1110//1361 507//1361 688//1361\nf 1111//1362 509//1362 690//1362\nf 1112//1363 511//1363 692//1363\nf 694//1364 1113//1364 86//1364\nf 696//1365 1114//1365 87//1365\nf 698//1366 1115//1366 88//1366\nf 700//1367 1116//1367 89//1367\nf 702//1368 1117//1368 90//1368\nf 705//1369 1118//1369 92//1369\nf 1119//1370 526//1370 707//1370\nf 1120//1371 528//1371 709//1371\nf 711//1372 1121//1372 95//1372\nf 713//1373 1122//1373 96//1373\nf 1123//1374 534//1374 715//1374\nf 1124//1375 536//1375 717//1375\nf 719//1376 1125//1376 99//1376\nf 1126//1377 540//1377 721//1377\nf 1127//1378 722//1378 365//1378\nf 1128//1379 723//1379 724//1379\nf 1129//1380 544//1380 725//1380\nf 1130//1381 726//1381 368//1381\nf 728//1382 1131//1382 282//1382\nf 729//1383 1132//1383 106//1383\nf 371//1384 1133//1384 110//1384\nf 732//1385 1134//1385 283//1385\nf 733//1386 1135//1386 109//1386\nf 374//1387 1136//1387 113//1387\nf 736//1388 1137//1388 284//1388\nf 737//1389 1138//1389 112//1389\nf 377//1390 1139//1390 116//1390\nf 740//1391 1140//1391 285//1391\nf 741//1392 1141//1392 115//1392\nf 380//1393 1142//1393 119//1393\nf 744//1394 1143//1394 286//1394\nf 745//1395 1144//1395 118//1395\nf 1145//1396 746//1396 383//1396\nf 748//1397 1146//1397 287//1397\nf 749//1398 1147//1398 121//1398\nf 386//1399 1148//1399 125//1399\nf 752//1400 1149//1400 288//1400\nf 1150//1401 565//1401 753//1401\nf 389//1402 1151//1402 128//1402\nf 756//1403 1152//1403 289//1403\nf 757//1404 1153//1404 127//1404\nf 392//1405 1154//1405 131//1405\nf 760//1406 1155//1406 290//1406\nf 1156//1407 571//1407 761//1407\nf 1157//1408 762//1408 394//1408\nf 1158//1409 763//1409 764//1409\nf 1159//1410 573//1410 765//1410\nf 396//1411 1160//1411 135//1411\nf 768//1412 1161//1412 292//1412\nf 769//1413 1162//1413 134//1413\nf 398//1414 1163//1414 137//1414\nf 772//1415 1164//1415 293//1415\nf 773//1416 1165//1416 136//1416\nf 400//1417 1166//1417 139//1417\nf 1167//1418 775//1418 776//1418\nf 777//1419 1168//1419 138//1419\nf 1169//1420 778//1420 402//1420\nf 780//1421 1170//1421 295//1421\nf 781//1422 1171//1422 140//1422\nf 1172//1423 782//1423 404//1423\nf 784//1424 1173//1424 296//1424\nf 785//1425 1174//1425 142//1425\nf 1175//1426 786//1426 406//1426\nf 788//1427 1176//1427 297//1427\nf 789//1428 1177//1428 144//1428\nf 408//1429 1178//1429 147//1429\nf 792//1430 1179//1430 298//1430\nf 793//1431 1180//1431 146//1431\nf 1181//1432 794//1432 411//1432\nf 1182//1433 795//1433 796//1433\nf 797//1434 1183//1434 149//1434\nf 413//1435 1184//1435 152//1435\nf 800//1436 1185//1436 300//1436\nf 801//1437 1186//1437 151//1437\nf 415//1438 1187//1438 154//1438\nf 804//1439 1188//1439 301//1439\nf 805//1440 1189//1440 153//1440\nf 1190//1441 806//1441 417//1441\nf 1191//1442 807//1442 808//1442\nf 1192//1443 596//1443 809//1443\nf 419//1444 1193//1444 158//1444\nf 1194//1445 811//1445 812//1445\nf 1195//1446 598//1446 813//1446\nf 421//1447 1196//1447 160//1447\nf 1197//1448 815//1448 816//1448\nf 1198//1449 600//1449 817//1449\nf 423//1450 1199//1450 162//1450\nf 1200//1451 819//1451 820//1451\nf 1201//1452 602//1452 821//1452\nf 425//1453 1202//1453 164//1453\nf 1203//1454 823//1454 824//1454\nf 1204//1455 604//1455 825//1455\nf 427//1456 1205//1456 166//1456\nf 828//1457 1206//1457 307//1457\nf 1207//1458 606//1458 829//1458\nf 1208//1459 830//1459 430//1459\nf 832//1460 1209//1460 308//1460\nf 1210//1461 609//1461 833//1461\nf 1211//1462 834//1462 432//1462\nf 836//1463 1212//1463 309//1463\nf 837//1464 1213//1464 170//1464\nf 434//1465 1214//1465 173//1465\nf 840//1466 1215//1466 310//1466\nf 841//1467 1216//1467 172//1467\nf 1217//1468 842//1468 436//1468\nf 1218//1469 843//1469 844//1469\nf 1219//1470 615//1470 845//1470\nf 1220//1471 846//1471 438//1471\nf 848//1472 1221//1472 312//1472\nf 849//1473 1222//1473 176//1473\nf 440//1474 1223//1474 179//1474\nf 852//1475 1224//1475 313//1475\nf 1225//1476 619//1476 853//1476\nf 442//1477 1226//1477 181//1477\nf 1227//1478 855//1478 856//1478\nf 1228//1479 621//1479 857//1479\nf 1229//1480 858//1480 444//1480\nf 1230//1481 859//1481 860//1481\nf 861//1482 1231//1482 182//1482\nf 446//1483 1232//1483 185//1483\nf 864//1484 1233//1484 316//1484\nf 865//1485 1234//1485 184//1485\nf 449//1486 1235//1486 188//1486\nf 1236//1487 867//1487 868//1487\nf 1237//1488 628//1488 869//1488\nf 1238//1489 870//1489 451//1489\nf 872//1490 1239//1490 318//1490\nf 873//1491 1240//1491 189//1491\nf 453//1492 1241//1492 192//1492\nf 1242//1493 875//1493 876//1493\nf 877//1494 1243//1494 191//1494\nf 455//1495 1244//1495 194//1495\nf 880//1496 1245//1496 320//1496\nf 1246//1497 634//1497 881//1497\nf 1247//1498 882//1498 457//1498\nf 1248//1499 883//1499 884//1499\nf 885//1500 1249//1500 195//1500\nf 1250//1501 886//1501 459//1501\nf 888//1502 1251//1502 322//1502\nf 1252//1503 638//1503 889//1503\nf 461//1504 1253//1504 200//1504\nf 1254//1505 891//1505 892//1505\nf 893//1506 1255//1506 199//1506\nf 463//1507 1256//1507 202//1507\nf 896//1508 1257//1508 324//1508\nf 1258//1509 642//1509 897//1509\nf 465//1510 1259//1510 204//1510\nf 900//1511 1260//1511 325//1511\nf 1261//1512 644//1512 901//1512\nf 468//1513 1262//1513 207//1513\nf 904//1514 1263//1514 326//1514\nf 905//1515 1264//1515 206//1515\nf 1265//1516 906//1516 470//1516\nf 1266//1517 907//1517 908//1517\nf 909//1518 1267//1518 208//1518\nf 472//1519 1268//1519 211//1519\nf 912//1520 1269//1520 328//1520\nf 913//1521 1270//1521 210//1521\nf 474//1522 1271//1522 213//1522\nf 1272//1523 915//1523 916//1523\nf 1273//1524 653//1524 917//1524\nf 1274//1525 918//1525 476//1525\nf 1275//1526 919//1526 920//1526\nf 1276//1527 655//1527 921//1527\nf 478//1528 1277//1528 217//1528\nf 924//1529 1278//1529 331//1529\nf 925//1530 1279//1530 216//1530\nf 480//1531 1280//1531 219//1531\nf 928//1532 1281//1532 332//1532\nf 1282//1533 659//1533 929//1533\nf 482//1534 1283//1534 221//1534\nf 1284//1535 931//1535 932//1535\nf 1285//1536 661//1536 933//1536\nf 484//1537 1286//1537 223//1537\nf 936//1538 1287//1538 334//1538\nf 937//1539 1288//1539 222//1539\nf 487//1540 1289//1540 226//1540\nf 1290//1541 939//1541 940//1541\nf 1291//1542 666//1542 941//1542\nf 1292//1543 942//1543 489//1543\nf 944//1544 1293//1544 336//1544\nf 945//1545 1294//1545 227//1545\nf 1295//1546 946//1546 491//1546\nf 1296//1547 947//1547 948//1547\nf 1297//1548 670//1548 949//1548\nf 1298//1549 950//1549 493//1549\nf 1299//1550 951//1550 952//1550\nf 1300//1551 672//1551 953//1551\nf 495//1552 1301//1552 234//1552\nf 956//1553 1302//1553 339//1553\nf 1303//1554 674//1554 957//1554\nf 497//1555 1304//1555 236//1555\nf 960//1556 1305//1556 340//1556\nf 1306//1557 676//1557 961//1557\nf 499//1558 1307//1558 238//1558\nf 1308//1559 963//1559 964//1559\nf 965//1560 1309//1560 237//1560\nf 1310//1561 966//1561 501//1561\nf 968//1562 1311//1562 342//1562\nf 1312//1563 680//1563 969//1563\nf 503//1564 1313//1564 242//1564\nf 972//1565 1314//1565 343//1565\nf 973//1566 1315//1566 241//1566\nf 1316//1567 974//1567 506//1567\nf 976//1568 1317//1568 344//1568\nf 977//1569 1318//1569 244//1569\nf 1319//1570 978//1570 508//1570\nf 980//1571 1320//1571 345//1571\nf 1321//1572 687//1572 981//1572\nf 1322//1573 982//1573 510//1573\nf 1323//1574 983//1574 984//1574\nf 1324//1575 689//1575 985//1575\nf 1325//1576 986//1576 512//1576\nf 1326//1577 987//1577 988//1577\nf 1327//1578 691//1578 989//1578\nf 514//1579 1328//1579 253//1579\nf 1329//1580 991//1580 992//1580\nf 993//1581 1330//1581 252//1581\nf 516//1582 1331//1582 255//1582\nf 1332//1583 995//1583 996//1583\nf 1333//1584 695//1584 997//1584\nf 1334//1585 998//1585 518//1585\nf 1000//1586 1335//1586 350//1586\nf 1001//1587 1336//1587 256//1587\nf 520//1588 1337//1588 259//1588\nf 1338//1589 1003//1589 1004//1589\nf 1005//1590 1339//1590 258//1590\nf 522//1591 1340//1591 261//1591\nf 1008//1592 1341//1592 352//1592\nf 1009//1593 1342//1593 260//1593\nf 525//1594 1343//1594 264//1594\nf 1012//1595 1344//1595 353//1595\nf 1013//1596 1345//1596 263//1596\nf 1346//1597 1014//1597 527//1597\nf 1016//1598 1347//1598 354//1598\nf 1017//1599 1348//1599 265//1599\nf 1349//1600 1018//1600 529//1600\nf 1350//1601 1019//1601 1020//1601\nf 1351//1602 708//1602 1021//1602\nf 1352//1603 1022//1603 531//1603\nf 1353//1604 1023//1604 1024//1604\nf 1354//1605 710//1605 1025//1605\nf 533//1606 1355//1606 272//1606\nf 1028//1607 1356//1607 357//1607\nf 1029//1608 1357//1608 271//1608\nf 535//1609 1358//1609 274//1609\nf 1032//1610 1359//1610 358//1610\nf 1360//1611 714//1611 1033//1611\nf 1361//1612 1034//1612 537//1612\nf 1362//1613 1035//1613 1036//1613\nf 1363//1614 716//1614 1037//1614\nf 1364//1615 1038//1615 539//1615\nf 1365//1616 1039//1616 1040//1616\nf 1041//1617 1366//1617 277//1617\nf 1367//1618 1042//1618 541//1618\nf 1044//1619 1368//1619 361//1619\nf 1045//1620 1369//1620 279//1620\nf 722//1621 1046//1621 104//1621\nf 281//1622 725//1622 722//1622\nf 1046//1623 725//1623 364//1623\nf 726//1624 1047//1624 107//1624\nf 282//1625 729//1625 726//1625\nf 1047//1626 729//1626 367//1626\nf 110//1627 730//1627 551//1627\nf 730//1628 283//1628 1048//1628\nf 1048//1629 733//1629 370//1629\nf 113//1630 734//1630 554//1630\nf 734//1631 284//1631 1049//1631\nf 1049//1632 737//1632 373//1632\nf 116//1633 738//1633 557//1633\nf 738//1634 285//1634 1050//1634\nf 1050//1635 741//1635 376//1635\nf 119//1636 742//1636 560//1636\nf 742//1637 286//1637 1051//1637\nf 1051//1638 745//1638 379//1638\nf 746//1639 1052//1639 122//1639\nf 746//1640 287//1640 1052//1640\nf 1052//1641 749//1641 382//1641\nf 125//1642 750//1642 566//1642\nf 288//1643 753//1643 750//1643\nf 753//1644 124//1644 1053//1644\nf 128//1645 754//1645 569//1645\nf 754//1646 289//1646 1054//1646\nf 1054//1647 757//1647 388//1647\nf 131//1648 758//1648 572//1648\nf 758//1649 290//1649 1055//1649\nf 761//1650 130//1650 1055//1650\nf 762//1651 1056//1651 133//1651\nf 291//1652 765//1652 762//1652\nf 765//1653 132//1653 1056//1653\nf 135//1654 766//1654 576//1654\nf 766//1655 292//1655 1057//1655\nf 1057//1656 769//1656 395//1656\nf 137//1657 770//1657 578//1657\nf 770//1658 293//1658 1058//1658\nf 1058//1659 773//1659 397//1659\nf 139//1660 774//1660 580//1660\nf 774//1661 294//1661 1059//1661\nf 1059//1662 777//1662 399//1662\nf 778//1663 1060//1663 141//1663\nf 778//1664 295//1664 1060//1664\nf 1060//1665 781//1665 401//1665\nf 782//1666 1061//1666 143//1666\nf 782//1667 296//1667 1061//1667\nf 1061//1668 785//1668 403//1668\nf 145//1669 786//1669 586//1669\nf 786//1670 297//1670 1062//1670\nf 1062//1671 789//1671 405//1671\nf 147//1672 790//1672 588//1672\nf 790//1673 298//1673 1063//1673\nf 1063//1674 793//1674 407//1674\nf 150//1675 794//1675 591//1675\nf 794//1676 299//1676 1064//1676\nf 1064//1677 797//1677 410//1677\nf 152//1678 798//1678 593//1678\nf 798//1679 300//1679 1065//1679\nf 1065//1680 801//1680 412//1680\nf 154//1681 802//1681 595//1681\nf 802//1682 301//1682 1066//1682\nf 1066//1683 805//1683 414//1683\nf 806//1684 1067//1684 156//1684\nf 302//1685 809//1685 806//1685\nf 809//1686 155//1686 1067//1686\nf 810//1687 1068//1687 158//1687\nf 303//1688 813//1688 810//1688\nf 813//1689 157//1689 1068//1689\nf 160//1690 814//1690 601//1690\nf 304//1691 817//1691 814//1691\nf 817//1692 159//1692 1069//1692\nf 162//1693 818//1693 603//1693\nf 305//1694 821//1694 818//1694\nf 821//1695 161//1695 1070//1695\nf 164//1696 822//1696 605//1696\nf 306//1697 825//1697 822//1697\nf 825//1698 163//1698 1071//1698\nf 166//1699 826//1699 607//1699\nf 826//1700 307//1700 1072//1700\nf 1072//1701 829//1701 426//1701\nf 830//1702 1073//1702 169//1702\nf 308//1703 833//1703 830//1703\nf 1073//1704 833//1704 429//1704\nf 171//1705 834//1705 612//1705\nf 834//1706 309//1706 1074//1706\nf 1074//1707 837//1707 431//1707\nf 173//1708 838//1708 614//1708\nf 838//1709 310//1709 1075//1709\nf 1075//1710 841//1710 433//1710\nf 842//1711 1076//1711 175//1711\nf 311//1712 845//1712 842//1712\nf 845//1713 174//1713 1076//1713\nf 177//1714 846//1714 618//1714\nf 846//1715 312//1715 1077//1715\nf 1077//1716 849//1716 437//1716\nf 850//1717 1078//1717 179//1717\nf 313//1718 853//1718 850//1718\nf 853//1719 178//1719 1078//1719\nf 181//1720 854//1720 622//1720\nf 854//1721 314//1721 1079//1721\nf 857//1722 180//1722 1079//1722\nf 858//1723 1080//1723 183//1723\nf 315//1724 861//1724 858//1724\nf 1080//1725 861//1725 443//1725\nf 185//1726 862//1726 626//1726\nf 316//1727 865//1727 862//1727\nf 865//1728 184//1728 1081//1728\nf 188//1729 866//1729 629//1729\nf 866//1730 317//1730 1082//1730\nf 869//1731 187//1731 1082//1731\nf 870//1732 1083//1732 190//1732\nf 318//1733 873//1733 870//1733\nf 873//1734 189//1734 1083//1734\nf 192//1735 874//1735 633//1735\nf 319//1736 877//1736 874//1736\nf 877//1737 191//1737 1084//1737\nf 194//1738 878//1738 635//1738\nf 878//1739 320//1739 1085//1739\nf 881//1740 193//1740 1085//1740\nf 882//1741 1086//1741 196//1741\nf 321//1742 885//1742 882//1742\nf 1086//1743 885//1743 456//1743\nf 198//1744 886//1744 639//1744\nf 886//1745 322//1745 1087//1745\nf 1087//1746 889//1746 458//1746\nf 200//1747 890//1747 641//1747\nf 323//1748 893//1748 890//1748\nf 1088//1749 893//1749 460//1749\nf 202//1750 894//1750 643//1750\nf 324//1751 897//1751 894//1751\nf 897//1752 201//1752 1089//1752\nf 898//1753 1090//1753 204//1753\nf 325//1754 901//1754 898//1754\nf 901//1755 203//1755 1090//1755\nf 207//1756 902//1756 648//1756\nf 902//1757 326//1757 1091//1757\nf 1091//1758 905//1758 467//1758\nf 906//1759 1092//1759 209//1759\nf 327//1760 909//1760 906//1760\nf 1092//1761 909//1761 469//1761\nf 910//1762 1093//1762 211//1762\nf 328//1763 913//1763 910//1763\nf 913//1764 210//1764 1093//1764\nf 213//1765 914//1765 654//1765\nf 329//1766 917//1766 914//1766\nf 917//1767 212//1767 1094//1767\nf 918//1768 1095//1768 215//1768\nf 330//1769 921//1769 918//1769\nf 921//1770 214//1770 1095//1770\nf 217//1771 922//1771 658//1771\nf 922//1772 331//1772 1096//1772\nf 1096//1773 925//1773 477//1773\nf 219//1774 926//1774 660//1774\nf 926//1775 332//1775 1097//1775\nf 1097//1776 929//1776 479//1776\nf 930//1777 1098//1777 221//1777\nf 333//1778 933//1778 930//1778\nf 933//1779 220//1779 1098//1779\nf 934//1780 1099//1780 223//1780\nf 934//1781 334//1781 1099//1781\nf 1099//1782 937//1782 483//1782\nf 226//1783 938//1783 667//1783\nf 335//1784 941//1784 938//1784\nf 941//1785 225//1785 1100//1785\nf 228//1786 942//1786 669//1786\nf 942//1787 336//1787 1101//1787\nf 1101//1788 945//1788 488//1788\nf 946//1789 1102//1789 230//1789\nf 337//1790 949//1790 946//1790\nf 949//1791 229//1791 1102//1791\nf 950//1792 1103//1792 232//1792\nf 338//1793 953//1793 950//1793\nf 953//1794 231//1794 1103//1794\nf 234//1795 954//1795 675//1795\nf 954//1796 339//1796 1104//1796\nf 1104//1797 957//1797 494//1797\nf 958//1798 1105//1798 236//1798\nf 958//1799 340//1799 1105//1799\nf 961//1800 235//1800 1105//1800\nf 238//1801 962//1801 679//1801\nf 962//1802 341//1802 1106//1802\nf 1106//1803 965//1803 498//1803\nf 966//1804 1107//1804 240//1804\nf 966//1805 342//1805 1107//1805\nf 969//1806 239//1806 1107//1806\nf 970//1807 1108//1807 242//1807\nf 343//1808 973//1808 970//1808\nf 973//1809 241//1809 1108//1809\nf 245//1810 974//1810 686//1810\nf 974//1811 344//1811 1109//1811\nf 1109//1812 977//1812 505//1812\nf 978//1813 1110//1813 247//1813\nf 345//1814 981//1814 978//1814\nf 981//1815 246//1815 1110//1815\nf 982//1816 1111//1816 249//1816\nf 346//1817 985//1817 982//1817\nf 985//1818 248//1818 1111//1818\nf 986//1819 1112//1819 251//1819\nf 347//1820 989//1820 986//1820\nf 989//1821 250//1821 1112//1821\nf 253//1822 990//1822 694//1822\nf 990//1823 348//1823 1113//1823\nf 1113//1824 993//1824 513//1824\nf 255//1825 994//1825 696//1825\nf 349//1826 997//1826 994//1826\nf 997//1827 254//1827 1114//1827\nf 257//1828 998//1828 698//1828\nf 998//1829 350//1829 1115//1829\nf 1115//1830 1001//1830 517//1830\nf 259//1831 1002//1831 700//1831\nf 1002//1832 351//1832 1116//1832\nf 1116//1833 1005//1833 519//1833\nf 261//1834 1006//1834 702//1834\nf 1006//1835 352//1835 1117//1835\nf 1117//1836 1009//1836 521//1836\nf 264//1837 1010//1837 705//1837\nf 1010//1838 353//1838 1118//1838\nf 1118//1839 1013//1839 524//1839\nf 1014//1840 1119//1840 266//1840\nf 354//1841 1017//1841 1014//1841\nf 1119//1842 1017//1842 526//1842\nf 1018//1843 1120//1843 268//1843\nf 355//1844 1021//1844 1018//1844\nf 1021//1845 267//1845 1120//1845\nf 1022//1846 1121//1846 270//1846\nf 356//1847 1025//1847 1022//1847\nf 1025//1848 269//1848 1121//1848\nf 272//1849 1026//1849 713//1849\nf 1026//1850 357//1850 1122//1850\nf 1122//1851 1029//1851 532//1851\nf 1030//1852 1123//1852 274//1852\nf 358//1853 1033//1853 1030//1853\nf 1033//1854 273//1854 1123//1854\nf 1034//1855 1124//1855 276//1855\nf 359//1856 1037//1856 1034//1856\nf 1037//1857 275//1857 1124//1857\nf 1038//1858 1125//1858 278//1858\nf 360//1859 1041//1859 1038//1859\nf 1125//1860 1041//1860 538//1860\nf 1042//1861 1126//1861 280//1861\nf 361//1862 1045//1862 1042//1862\nf 1045//1863 279//1863 1126//1863\nf 542//1864 1127//1864 11//1864\nf 101//1865 724//1865 542//1865\nf 724//1866 281//1866 1127//1866\nf 362//1867 1128//1867 101//1867\nf 1//1868 543//1868 362//1868\nf 543//1869 102//1869 1128//1869\nf 723//1870 1129//1870 281//1870\nf 102//1871 363//1871 723//1871\nf 363//1872 2//1872 1129//1872\nf 12//1873 364//1873 368//1873\nf 364//1874 103//1874 1130//1874\nf 1130//1875 728//1875 726//1875\nf 103//1876 544//1876 728//1876\nf 544//1877 2//1877 1131//1877\nf 1131//1878 546//1878 727//1878\nf 282//1879 727//1879 729//1879\nf 727//1880 105//1880 1132//1880\nf 1132//1881 366//1881 547//1881\nf 13//1882 367//1882 371//1882\nf 367//1883 106//1883 1133//1883\nf 1133//1884 732//1884 730//1884\nf 106//1885 547//1885 732//1885\nf 547//1886 3//1886 1134//1886\nf 1134//1887 549//1887 731//1887\nf 283//1888 731//1888 733//1888\nf 731//1889 108//1889 1135//1889\nf 1135//1890 369//1890 550//1890\nf 14//1891 370//1891 374//1891\nf 370//1892 109//1892 1136//1892\nf 1136//1893 736//1893 734//1893\nf 109//1894 550//1894 736//1894\nf 550//1895 4//1895 1137//1895\nf 1137//1896 552//1896 735//1896\nf 284//1897 735//1897 737//1897\nf 735//1898 111//1898 1138//1898\nf 372//1899 5//1899 1138//1899\nf 15//1900 373//1900 377//1900\nf 373//1901 112//1901 1139//1901\nf 1139//1902 740//1902 738//1902\nf 112//1903 553//1903 740//1903\nf 5//1904 555//1904 553//1904\nf 555//1905 114//1905 1140//1905\nf 739//1906 1141//1906 285//1906\nf 114//1907 375//1907 739//1907\nf 375//1908 6//1908 1141//1908\nf 16//1909 376//1909 380//1909\nf 376//1910 115//1910 1142//1910\nf 1142//1911 744//1911 742//1911\nf 115//1912 556//1912 744//1912\nf 556//1913 6//1913 1143//1913\nf 1143//1914 558//1914 743//1914\nf 286//1915 743//1915 745//1915\nf 117//1916 378//1916 743//1916\nf 378//1917 7//1917 1144//1917\nf 17//1918 379//1918 383//1918\nf 379//1919 118//1919 1145//1919\nf 1145//1920 748//1920 746//1920\nf 118//1921 559//1921 748//1921\nf 559//1922 7//1922 1146//1922\nf 1146//1923 561//1923 747//1923\nf 287//1924 747//1924 749//1924\nf 747//1925 120//1925 1147//1925\nf 1147//1926 381//1926 562//1926\nf 18//1927 382//1927 386//1927\nf 382//1928 121//1928 1148//1928\nf 1148//1929 752//1929 750//1929\nf 121//1930 562//1930 752//1930\nf 562//1931 8//1931 1149//1931\nf 1149//1932 564//1932 751//1932\nf 751//1933 1150//1933 288//1933\nf 123//1934 384//1934 751//1934\nf 384//1935 9//1935 1150//1935\nf 19//1936 385//1936 389//1936\nf 385//1937 124//1937 1151//1937\nf 1151//1938 756//1938 754//1938\nf 565//1939 1152//1939 124//1939\nf 565//1940 9//1940 1152//1940\nf 1152//1941 567//1941 755//1941\nf 289//1942 755//1942 757//1942\nf 755//1943 126//1943 1153//1943\nf 1153//1944 387//1944 568//1944\nf 21//1945 570//1945 392//1945\nf 570//1946 129//1946 1154//1946\nf 1154//1947 760//1947 758//1947\nf 390//1948 1155//1948 129//1948\nf 11//1949 365//1949 390//1949\nf 365//1950 104//1950 1155//1950\nf 290//1951 759//1951 761//1951\nf 759//1952 104//1952 1156//1952\nf 1156//1953 545//1953 571//1953\nf 391//1954 1157//1954 22//1954\nf 130//1955 764//1955 391//1955\nf 764//1956 291//1956 1157//1956\nf 571//1957 1158//1957 130//1957\nf 571//1958 12//1958 1158//1958\nf 368//1959 107//1959 1158//1959\nf 763//1960 1159//1960 291//1960\nf 107//1961 548//1961 763//1961\nf 548//1962 13//1962 1159//1962\nf 23//1963 393//1963 396//1963\nf 393//1964 132//1964 1160//1964\nf 1160//1965 768//1965 766//1965\nf 573//1966 1161//1966 132//1966\nf 13//1967 371//1967 573//1967\nf 1161//1968 371//1968 767//1968\nf 292//1969 767//1969 769//1969\nf 767//1970 110//1970 1162//1970\nf 1162//1971 551//1971 575//1971\nf 24//1972 395//1972 398//1972\nf 395//1973 134//1973 1163//1973\nf 1163//1974 772//1974 770//1974\nf 134//1975 575//1975 772//1975\nf 575//1976 14//1976 1164//1976\nf 1164//1977 374//1977 771//1977\nf 293//1978 771//1978 773//1978\nf 771//1979 113//1979 1165//1979\nf 1165//1980 554//1980 577//1980\nf 25//1981 397//1981 400//1981\nf 397//1982 136//1982 1166//1982\nf 1166//1983 776//1983 774//1983\nf 136//1984 577//1984 776//1984\nf 577//1985 15//1985 1167//1985\nf 1167//1986 377//1986 775//1986\nf 775//1987 1168//1987 294//1987\nf 116//1988 557//1988 775//1988\nf 1168//1989 557//1989 579//1989\nf 399//1990 1169//1990 26//1990\nf 399//1991 138//1991 1169//1991\nf 1169//1992 780//1992 778//1992\nf 138//1993 579//1993 780//1993\nf 579//1994 16//1994 1170//1994\nf 1170//1995 380//1995 779//1995\nf 295//1996 779//1996 781//1996\nf 779//1997 119//1997 1171//1997\nf 1171//1998 560//1998 581//1998\nf 401//1999 1172//1999 27//1999\nf 401//2000 140//2000 1172//2000\nf 1172//2001 784//2001 782//2001\nf 140//2002 581//2002 784//2002\nf 581//2003 17//2003 1173//2003\nf 383//2004 122//2004 1173//2004\nf 296//2005 783//2005 785//2005\nf 122//2006 563//2006 783//2006\nf 1174//2007 563//2007 583//2007\nf 403//2008 1175//2008 28//2008\nf 142//2009 788//2009 403//2009\nf 788//2010 297//2010 1175//2010\nf 583//2011 1176//2011 142//2011\nf 583//2012 18//2012 1176//2012\nf 1176//2013 386//2013 787//2013\nf 297//2014 787//2014 789//2014\nf 787//2015 125//2015 1177//2015\nf 1177//2016 566//2016 585//2016\nf 29//2017 405//2017 408//2017\nf 405//2018 144//2018 1178//2018\nf 1178//2019 792//2019 790//2019\nf 144//2020 585//2020 792//2020\nf 19//2021 389//2021 585//2021\nf 389//2022 128//2022 1179//2022\nf 298//2023 791//2023 793//2023\nf 128//2024 569//2024 791//2024\nf 1180//2025 569//2025 587//2025\nf 589//2026 1181//2026 31//2026\nf 148//2027 796//2027 589//2027\nf 796//2028 299//2028 1181//2028\nf 409//2029 1182//2029 148//2029\nf 409//2030 21//2030 1182//2030\nf 1182//2031 392//2031 795//2031\nf 299//2032 795//2032 797//2032\nf 795//2033 131//2033 1183//2033\nf 1183//2034 572//2034 590//2034\nf 32//2035 410//2035 413//2035\nf 410//2036 149//2036 1184//2036\nf 1184//2037 800//2037 798//2037\nf 149//2038 590//2038 800//2038\nf 22//2039 394//2039 590//2039\nf 394//2040 133//2040 1185//2040\nf 300//2041 799//2041 801//2041\nf 799//2042 133//2042 1186//2042\nf 574//2043 23//2043 1186//2043\nf 33//2044 412//2044 415//2044\nf 412//2045 151//2045 1187//2045\nf 1187//2046 804//2046 802//2046\nf 151//2047 592//2047 804//2047\nf 592//2048 23//2048 1188//2048\nf 1188//2049 396//2049 803//2049\nf 301//2050 803//2050 805//2050\nf 803//2051 135//2051 1189//2051\nf 1189//2052 576//2052 594//2052\nf 34//2053 414//2053 417//2053\nf 414//2054 153//2054 1190//2054\nf 808//2055 302//2055 1190//2055\nf 594//2056 1191//2056 153//2056\nf 594//2057 24//2057 1191//2057\nf 398//2058 137//2058 1191//2058\nf 807//2059 1192//2059 302//2059\nf 807//2060 137//2060 1192//2060\nf 1192//2061 578//2061 596//2061\nf 416//2062 1193//2062 35//2062\nf 155//2063 812//2063 416//2063\nf 812//2064 303//2064 1193//2064\nf 596//2065 1194//2065 155//2065\nf 596//2066 25//2066 1194//2066\nf 1194//2067 400//2067 811//2067\nf 811//2068 1195//2068 303//2068\nf 811//2069 139//2069 1195//2069\nf 580//2070 26//2070 1195//2070\nf 36//2071 418//2071 421//2071\nf 418//2072 157//2072 1196//2072\nf 1196//2073 816//2073 814//2073\nf 598//2074 1197//2074 157//2074\nf 26//2075 402//2075 598//2075\nf 402//2076 141//2076 1197//2076\nf 815//2077 1198//2077 304//2077\nf 141//2078 582//2078 815//2078\nf 1198//2079 582//2079 600//2079\nf 420//2080 1199//2080 37//2080\nf 159//2081 820//2081 420//2081\nf 820//2082 305//2082 1199//2082\nf 600//2083 1200//2083 159//2083\nf 600//2084 27//2084 1200//2084\nf 404//2085 143//2085 1200//2085\nf 819//2086 1201//2086 305//2086\nf 143//2087 584//2087 819//2087\nf 584//2088 28//2088 1201//2088\nf 38//2089 422//2089 425//2089\nf 161//2090 824//2090 422//2090\nf 824//2091 306//2091 1202//2091\nf 602//2092 1203//2092 161//2092\nf 28//2093 406//2093 602//2093\nf 406//2094 145//2094 1203//2094\nf 823//2095 1204//2095 306//2095\nf 145//2096 586//2096 823//2096\nf 1204//2097 586//2097 604//2097\nf 39//2098 424//2098 427//2098\nf 424//2099 163//2099 1205//2099\nf 1205//2100 828//2100 826//2100\nf 163//2101 604//2101 828//2101\nf 604//2102 29//2102 1206//2102\nf 1206//2103 408//2103 827//2103\nf 307//2104 827//2104 829//2104\nf 827//2105 147//2105 1207//2105\nf 588//2106 30//2106 1207//2106\nf 41//2107 608//2107 430//2107\nf 608//2108 167//2108 1208//2108\nf 832//2109 308//2109 1208//2109\nf 167//2110 428//2110 832//2110\nf 428//2111 31//2111 1209//2111\nf 411//2112 150//2112 1209//2112\nf 831//2113 1210//2113 308//2113\nf 150//2114 591//2114 831//2114\nf 1210//2115 591//2115 609//2115\nf 42//2116 429//2116 432//2116\nf 429//2117 168//2117 1211//2117\nf 1211//2118 836//2118 834//2118\nf 168//2119 609//2119 836//2119\nf 609//2120 32//2120 1212//2120\nf 1212//2121 413//2121 835//2121\nf 309//2122 835//2122 837//2122\nf 835//2123 152//2123 1213//2123\nf 1213//2124 593//2124 611//2124\nf 431//2125 1214//2125 43//2125\nf 431//2126 170//2126 1214//2126\nf 1214//2127 840//2127 838//2127\nf 170//2128 611//2128 840//2128\nf 611//2129 33//2129 1215//2129\nf 1215//2130 415//2130 839//2130\nf 310//2131 839//2131 841//2131\nf 839//2132 154//2132 1216//2132\nf 1216//2133 595//2133 613//2133\nf 433//2134 1217//2134 44//2134\nf 172//2135 844//2135 433//2135\nf 844//2136 311//2136 1217//2136\nf 172//2137 613//2137 844//2137\nf 613//2138 34//2138 1218//2138\nf 1218//2139 417//2139 843//2139\nf 843//2140 1219//2140 311//2140\nf 156//2141 597//2141 843//2141\nf 597//2142 35//2142 1219//2142\nf 435//2143 1220//2143 45//2143\nf 174//2144 848//2144 435//2144\nf 1220//2145 848//2145 846//2145\nf 615//2146 1221//2146 174//2146\nf 35//2147 419//2147 615//2147\nf 1221//2148 419//2148 847//2148\nf 312//2149 847//2149 849//2149\nf 847//2150 158//2150 1222//2150\nf 1222//2151 599//2151 617//2151\nf 46//2152 437//2152 440//2152\nf 437//2153 176//2153 1223//2153\nf 1223//2154 852//2154 850//2154\nf 176//2155 617//2155 852//2155\nf 617//2156 36//2156 1224//2156\nf 1224//2157 421//2157 851//2157\nf 851//2158 1225//2158 313//2158\nf 160//2159 601//2159 851//2159\nf 601//2160 37//2160 1225//2160\nf 439//2161 1226//2161 47//2161\nf 178//2162 856//2162 439//2162\nf 1226//2163 856//2163 854//2163\nf 619//2164 1227//2164 178//2164\nf 37//2165 423//2165 619//2165\nf 423//2166 162//2166 1227//2166\nf 314//2167 855//2167 857//2167\nf 855//2168 162//2168 1228//2168\nf 603//2169 38//2169 1228//2169\nf 48//2170 441//2170 444//2170\nf 180//2171 860//2171 441//2171\nf 860//2172 315//2172 1229//2172\nf 621//2173 1230//2173 180//2173\nf 38//2174 425//2174 621//2174\nf 425//2175 164//2175 1230//2175\nf 859//2176 1231//2176 315//2176\nf 859//2177 164//2177 1231//2177\nf 1231//2178 605//2178 623//2178\nf 49//2179 443//2179 446//2179\nf 443//2180 182//2180 1232//2180\nf 1232//2181 864//2181 862//2181\nf 182//2182 623//2182 864//2182\nf 623//2183 39//2183 1233//2183\nf 1233//2184 427//2184 863//2184\nf 316//2185 863//2185 865//2185\nf 863//2186 166//2186 1234//2186\nf 1234//2187 607//2187 625//2187\nf 51//2188 627//2188 449//2188\nf 186//2189 868//2189 627//2189\nf 1235//2190 868//2190 866//2190\nf 186//2191 447//2191 868//2191\nf 447//2192 41//2192 1236//2192\nf 430//2193 169//2193 1236//2193\nf 867//2194 1237//2194 317//2194\nf 169//2195 610//2195 867//2195\nf 610//2196 42//2196 1237//2196\nf 52//2197 448//2197 451//2197\nf 448//2198 187//2198 1238//2198\nf 872//2199 318//2199 1238//2199\nf 187//2200 628//2200 872//2200\nf 628//2201 42//2201 1239//2201\nf 1239//2202 432//2202 871//2202\nf 318//2203 871//2203 873//2203\nf 871//2204 171//2204 1240//2204\nf 1240//2205 612//2205 630//2205\nf 53//2206 450//2206 453//2206\nf 189//2207 876//2207 450//2207\nf 876//2208 319//2208 1241//2208\nf 189//2209 630//2209 876//2209\nf 630//2210 43//2210 1242//2210\nf 1242//2211 434//2211 875//2211\nf 875//2212 1243//2212 319//2212\nf 875//2213 173//2213 1243//2213\nf 1243//2214 614//2214 632//2214\nf 54//2215 452//2215 455//2215\nf 452//2216 191//2216 1244//2216\nf 1244//2217 880//2217 878//2217\nf 191//2218 632//2218 880//2218\nf 44//2219 436//2219 632//2219\nf 436//2220 175//2220 1245//2220\nf 320//2221 879//2221 881//2221\nf 175//2222 616//2222 879//2222\nf 616//2223 45//2223 1246//2223\nf 454//2224 1247//2224 55//2224\nf 193//2225 884//2225 454//2225\nf 884//2226 321//2226 1247//2226\nf 634//2227 1248//2227 193//2227\nf 45//2228 438//2228 634//2228\nf 438//2229 177//2229 1248//2229\nf 883//2230 1249//2230 321//2230\nf 177//2231 618//2231 883//2231\nf 1249//2232 618//2232 636//2232\nf 456//2233 1250//2233 56//2233\nf 195//2234 888//2234 456//2234\nf 1250//2235 888//2235 886//2235\nf 636//2236 1251//2236 195//2236\nf 636//2237 46//2237 1251//2237\nf 1251//2238 440//2238 887//2238\nf 887//2239 1252//2239 322//2239\nf 179//2240 620//2240 887//2240\nf 620//2241 47//2241 1252//2241\nf 57//2242 458//2242 461//2242\nf 458//2243 197//2243 1253//2243\nf 892//2244 323//2244 1253//2244\nf 638//2245 1254//2245 197//2245\nf 47//2246 442//2246 638//2246\nf 442//2247 181//2247 1254//2247\nf 891//2248 1255//2248 323//2248\nf 891//2249 181//2249 1255//2249\nf 1255//2250 622//2250 640//2250\nf 58//2251 460//2251 463//2251\nf 460//2252 199//2252 1256//2252\nf 1256//2253 896//2253 894//2253\nf 199//2254 640//2254 896//2254\nf 640//2255 48//2255 1257//2255\nf 1257//2256 444//2256 895//2256\nf 895//2257 1258//2257 324//2257\nf 895//2258 183//2258 1258//2258\nf 1258//2259 624//2259 642//2259\nf 59//2260 462//2260 465//2260\nf 462//2261 201//2261 1259//2261\nf 900//2262 325//2262 1259//2262\nf 201//2263 642//2263 900//2263\nf 642//2264 49//2264 1260//2264\nf 1260//2265 446//2265 899//2265\nf 899//2266 1261//2266 325//2266\nf 899//2267 185//2267 1261//2267\nf 626//2268 50//2268 1261//2268\nf 61//2269 646//2269 468//2269\nf 646//2270 205//2270 1262//2270\nf 1262//2271 904//2271 902//2271\nf 205//2272 466//2272 904//2272\nf 466//2273 51//2273 1263//2273\nf 1263//2274 449//2274 903//2274\nf 326//2275 903//2275 905//2275\nf 903//2276 188//2276 1264//2276\nf 1264//2277 629//2277 647//2277\nf 467//2278 1265//2278 62//2278\nf 206//2279 908//2279 467//2279\nf 908//2280 327//2280 1265//2280\nf 647//2281 1266//2281 206//2281\nf 647//2282 52//2282 1266//2282\nf 1266//2283 451//2283 907//2283\nf 327//2284 907//2284 909//2284\nf 907//2285 190//2285 1267//2285\nf 1267//2286 631//2286 649//2286\nf 469//2287 1268//2287 63//2287\nf 469//2288 208//2288 1268//2288\nf 1268//2289 912//2289 910//2289\nf 208//2290 649//2290 912//2290\nf 649//2291 53//2291 1269//2291\nf 1269//2292 453//2292 911//2292\nf 328//2293 911//2293 913//2293\nf 911//2294 192//2294 1270//2294\nf 1270//2295 633//2295 651//2295\nf 471//2296 1271//2296 64//2296\nf 210//2297 916//2297 471//2297\nf 916//2298 329//2298 1271//2298\nf 210//2299 651//2299 916//2299\nf 651//2300 54//2300 1272//2300\nf 1272//2301 455//2301 915//2301\nf 915//2302 1273//2302 329//2302\nf 194//2303 635//2303 915//2303\nf 635//2304 55//2304 1273//2304\nf 473//2305 1274//2305 65//2305\nf 212//2306 920//2306 473//2306\nf 920//2307 330//2307 1274//2307\nf 653//2308 1275//2308 212//2308\nf 55//2309 457//2309 653//2309\nf 457//2310 196//2310 1275//2310\nf 919//2311 1276//2311 330//2311\nf 196//2312 637//2312 919//2312\nf 637//2313 56//2313 1276//2313\nf 66//2314 475//2314 478//2314\nf 475//2315 214//2315 1277//2315\nf 1277//2316 924//2316 922//2316\nf 214//2317 655//2317 924//2317\nf 56//2318 459//2318 655//2318\nf 1278//2319 459//2319 923//2319\nf 331//2320 923//2320 925//2320\nf 923//2321 198//2321 1279//2321\nf 1279//2322 639//2322 657//2322\nf 67//2323 477//2323 480//2323\nf 477//2324 216//2324 1280//2324\nf 1280//2325 928//2325 926//2325\nf 216//2326 657//2326 928//2326\nf 657//2327 57//2327 1281//2327\nf 1281//2328 461//2328 927//2328\nf 332//2329 927//2329 929//2329\nf 927//2330 200//2330 1282//2330\nf 1282//2331 641//2331 659//2331\nf 68//2332 479//2332 482//2332\nf 218//2333 932//2333 479//2333\nf 1283//2334 932//2334 930//2334\nf 659//2335 1284//2335 218//2335\nf 58//2336 463//2336 659//2336\nf 463//2337 202//2337 1284//2337\nf 931//2338 1285//2338 333//2338\nf 931//2339 202//2339 1285//2339\nf 1285//2340 643//2340 661//2340\nf 481//2341 1286//2341 69//2341\nf 220//2342 936//2342 481//2342\nf 1286//2343 936//2343 934//2343\nf 220//2344 661//2344 936//2344\nf 661//2345 59//2345 1287//2345\nf 1287//2346 465//2346 935//2346\nf 334//2347 935//2347 937//2347\nf 935//2348 204//2348 1288//2348\nf 1288//2349 645//2349 663//2349\nf 71//2350 665//2350 487//2350\nf 224//2351 940//2351 665//2351\nf 940//2352 335//2352 1289//2352\nf 485//2353 1290//2353 224//2353\nf 485//2354 61//2354 1290//2354\nf 1290//2355 468//2355 939//2355\nf 335//2356 939//2356 941//2356\nf 939//2357 207//2357 1291//2357\nf 1291//2358 648//2358 666//2358\nf 486//2359 1292//2359 72//2359\nf 225//2360 944//2360 486//2360\nf 1292//2361 944//2361 942//2361\nf 225//2362 666//2362 944//2362\nf 666//2363 62//2363 1293//2363\nf 1293//2364 470//2364 943//2364\nf 336//2365 943//2365 945//2365\nf 943//2366 209//2366 1294//2366\nf 1294//2367 650//2367 668//2367\nf 488//2368 1295//2368 73//2368\nf 227//2369 948//2369 488//2369\nf 948//2370 337//2370 1295//2370\nf 227//2371 668//2371 948//2371\nf 668//2372 63//2372 1296//2372\nf 472//2373 211//2373 1296//2373\nf 947//2374 1297//2374 337//2374\nf 211//2375 652//2375 947//2375\nf 652//2376 64//2376 1297//2376\nf 490//2377 1298//2377 74//2377\nf 229//2378 952//2378 490//2378\nf 952//2379 338//2379 1298//2379\nf 670//2380 1299//2380 229//2380\nf 64//2381 474//2381 670//2381\nf 474//2382 213//2382 1299//2382\nf 951//2383 1300//2383 338//2383\nf 213//2384 654//2384 951//2384\nf 654//2385 65//2385 1300//2385\nf 75//2386 492//2386 495//2386\nf 492//2387 231//2387 1301//2387\nf 1301//2388 956//2388 954//2388\nf 231//2389 672//2389 956//2389\nf 65//2390 476//2390 672//2390\nf 476//2391 215//2391 1302//2391\nf 955//2392 1303//2392 339//2392\nf 215//2393 656//2393 955//2393\nf 656//2394 66//2394 1303//2394\nf 76//2395 494//2395 497//2395\nf 494//2396 233//2396 1304//2396\nf 1304//2397 960//2397 958//2397\nf 233//2398 674//2398 960//2398\nf 66//2399 478//2399 674//2399\nf 1305//2400 478//2400 959//2400\nf 340//2401 959//2401 961//2401\nf 959//2402 217//2402 1306//2402\nf 1306//2403 658//2403 676//2403\nf 496//2404 1307//2404 77//2404\nf 235//2405 964//2405 496//2405\nf 964//2406 341//2406 1307//2406\nf 676//2407 1308//2407 235//2407\nf 676//2408 67//2408 1308//2408\nf 480//2409 219//2409 1308//2409\nf 341//2410 963//2410 965//2410\nf 963//2411 219//2411 1309//2411\nf 1309//2412 660//2412 678//2412\nf 498//2413 1310//2413 78//2413\nf 498//2414 237//2414 1310//2414\nf 1310//2415 968//2415 966//2415\nf 237//2416 678//2416 968//2416\nf 678//2417 68//2417 1311//2417\nf 482//2418 221//2418 1311//2418\nf 967//2419 1312//2419 342//2419\nf 221//2420 662//2420 967//2420\nf 662//2421 69//2421 1312//2421\nf 79//2422 500//2422 503//2422\nf 239//2423 972//2423 500//2423\nf 972//2424 343//2424 1313//2424\nf 680//2425 1314//2425 239//2425\nf 69//2426 484//2426 680//2426\nf 1314//2427 484//2427 971//2427\nf 343//2428 971//2428 973//2428\nf 971//2429 223//2429 1315//2429\nf 664//2430 70//2430 1315//2430\nf 684//2431 1316//2431 81//2431\nf 243//2432 976//2432 684//2432\nf 976//2433 344//2433 1316//2433\nf 243//2434 504//2434 976//2434\nf 504//2435 71//2435 1317//2435\nf 1317//2436 487//2436 975//2436\nf 344//2437 975//2437 977//2437\nf 975//2438 226//2438 1318//2438\nf 1318//2439 667//2439 685//2439\nf 82//2440 505//2440 508//2440\nf 505//2441 244//2441 1319//2441\nf 1319//2442 980//2442 978//2442\nf 244//2443 685//2443 980//2443\nf 72//2444 489//2444 685//2444\nf 1320//2445 489//2445 979//2445\nf 345//2446 979//2446 981//2446\nf 979//2447 228//2447 1321//2447\nf 1321//2448 669//2448 687//2448\nf 507//2449 1322//2449 83//2449\nf 246//2450 984//2450 507//2450\nf 984//2451 346//2451 1322//2451\nf 687//2452 1323//2452 246//2452\nf 73//2453 491//2453 687//2453\nf 491//2454 230//2454 1323//2454\nf 983//2455 1324//2455 346//2455\nf 230//2456 671//2456 983//2456\nf 671//2457 74//2457 1324//2457\nf 509//2458 1325//2458 84//2458\nf 248//2459 988//2459 509//2459\nf 988//2460 347//2460 1325//2460\nf 689//2461 1326//2461 248//2461\nf 74//2462 493//2462 689//2462\nf 493//2463 232//2463 1326//2463\nf 987//2464 1327//2464 347//2464\nf 232//2465 673//2465 987//2465\nf 673//2466 75//2466 1327//2466\nf 511//2467 1328//2467 85//2467\nf 250//2468 992//2468 511//2468\nf 992//2469 348//2469 1328//2469\nf 691//2470 1329//2470 250//2470\nf 75//2471 495//2471 691//2471\nf 1329//2472 495//2472 991//2472\nf 991//2473 1330//2473 348//2473\nf 234//2474 675//2474 991//2474\nf 675//2475 76//2475 1330//2475\nf 86//2476 513//2476 516//2476\nf 513//2477 252//2477 1331//2477\nf 1331//2478 996//2478 994//2478\nf 693//2479 1332//2479 252//2479\nf 76//2480 497//2480 693//2480\nf 497//2481 236//2481 1332//2481\nf 995//2482 1333//2482 349//2482\nf 236//2483 677//2483 995//2483\nf 677//2484 77//2484 1333//2484\nf 515//2485 1334//2485 87//2485\nf 254//2486 1000//2486 515//2486\nf 1000//2487 350//2487 1334//2487\nf 695//2488 1335//2488 254//2488\nf 695//2489 77//2489 1335//2489\nf 1335//2490 499//2490 999//2490\nf 350//2491 999//2491 1001//2491\nf 238//2492 679//2492 999//2492\nf 679//2493 78//2493 1336//2493\nf 88//2494 517//2494 520//2494\nf 517//2495 256//2495 1337//2495\nf 1337//2496 1004//2496 1002//2496\nf 697//2497 1338//2497 256//2497\nf 78//2498 501//2498 697//2498\nf 501//2499 240//2499 1338//2499\nf 351//2500 1003//2500 1005//2500\nf 1003//2501 240//2501 1339//2501\nf 1339//2502 681//2502 699//2502\nf 89//2503 519//2503 522//2503\nf 519//2504 258//2504 1340//2504\nf 1340//2505 1008//2505 1006//2505\nf 258//2506 699//2506 1008//2506\nf 699//2507 79//2507 1341//2507\nf 1341//2508 503//2508 1007//2508\nf 352//2509 1007//2509 1009//2509\nf 1007//2510 242//2510 1342//2510\nf 1342//2511 683//2511 701//2511\nf 91//2512 703//2512 525//2512\nf 703//2513 262//2513 1343//2513\nf 1343//2514 1012//2514 1010//2514\nf 262//2515 523//2515 1012//2515\nf 81//2516 506//2516 523//2516\nf 506//2517 245//2517 1344//2517\nf 353//2518 1011//2518 1013//2518\nf 1011//2519 245//2519 1345//2519\nf 1345//2520 686//2520 704//2520\nf 524//2521 1346//2521 92//2521\nf 263//2522 1016//2522 524//2522\nf 1016//2523 354//2523 1346//2523\nf 263//2524 704//2524 1016//2524\nf 704//2525 82//2525 1347//2525\nf 1347//2526 508//2526 1015//2526\nf 354//2527 1015//2527 1017//2527\nf 1015//2528 247//2528 1348//2528\nf 688//2529 83//2529 1348//2529\nf 526//2530 1349//2530 93//2530\nf 265//2531 1020//2531 526//2531\nf 1020//2532 355//2532 1349//2532\nf 706//2533 1350//2533 265//2533\nf 83//2534 510//2534 706//2534\nf 510//2535 249//2535 1350//2535\nf 1019//2536 1351//2536 355//2536\nf 249//2537 690//2537 1019//2537\nf 690//2538 84//2538 1351//2538\nf 528//2539 1352//2539 94//2539\nf 267//2540 1024//2540 528//2540\nf 1024//2541 356//2541 1352//2541\nf 708//2542 1353//2542 267//2542\nf 84//2543 512//2543 708//2543\nf 512//2544 251//2544 1353//2544\nf 1023//2545 1354//2545 356//2545\nf 251//2546 692//2546 1023//2546\nf 692//2547 85//2547 1354//2547\nf 95//2548 530//2548 533//2548\nf 269//2549 1028//2549 530//2549\nf 1355//2550 1028//2550 1026//2550\nf 710//2551 1356//2551 269//2551\nf 85//2552 514//2552 710//2552\nf 1356//2553 514//2553 1027//2553\nf 357//2554 1027//2554 1029//2554\nf 1027//2555 253//2555 1357//2555\nf 1357//2556 694//2556 712//2556\nf 96//2557 532//2557 535//2557\nf 532//2558 271//2558 1358//2558\nf 1358//2559 1032//2559 1030//2559\nf 271//2560 712//2560 1032//2560\nf 712//2561 86//2561 1359//2561\nf 1359//2562 516//2562 1031//2562\nf 1031//2563 1360//2563 358//2563\nf 1031//2564 255//2564 1360//2564\nf 1360//2565 696//2565 714//2565\nf 534//2566 1361//2566 97//2566\nf 273//2567 1036//2567 534//2567\nf 1036//2568 359//2568 1361//2568\nf 714//2569 1362//2569 273//2569\nf 87//2570 518//2570 714//2570\nf 518//2571 257//2571 1362//2571\nf 1035//2572 1363//2572 359//2572\nf 257//2573 698//2573 1035//2573\nf 1363//2574 698//2574 716//2574\nf 536//2575 1364//2575 98//2575\nf 275//2576 1040//2576 536//2576\nf 1040//2577 360//2577 1364//2577\nf 716//2578 1365//2578 275//2578\nf 716//2579 88//2579 1365//2579\nf 1365//2580 520//2580 1039//2580\nf 360//2581 1039//2581 1041//2581\nf 1039//2582 259//2582 1366//2582\nf 1366//2583 700//2583 718//2583\nf 538//2584 1367//2584 99//2584\nf 538//2585 277//2585 1367//2585\nf 1044//2586 361//2586 1367//2586\nf 277//2587 718//2587 1044//2587\nf 718//2588 89//2588 1368//2588\nf 1368//2589 522//2589 1043//2589\nf 361//2590 1043//2590 1045//2590\nf 1043//2591 261//2591 1369//2591\nf 1369//2592 702//2592 720//2592\n"
  },
  {
    "path": "obj/monkey.obj",
    "content": "# Blender v2.72 (sub 0) OBJ File: ''\n# www.blender.org\no Suzanne\nv 0.203275 0.093236 0.371580\nv -0.234225 0.093236 0.371580\nv 0.234525 0.058079 0.332517\nv -0.265475 0.058079 0.332517\nv 0.257963 0.038548 0.277830\nv -0.288912 0.038548 0.277830\nv 0.160307 -0.000514 0.297361\nv -0.191256 -0.000514 0.297361\nv 0.160307 0.026829 0.348142\nv -0.191256 0.026829 0.348142\nv 0.160307 0.077611 0.379392\nv -0.191256 0.077611 0.379392\nv 0.121244 0.093236 0.387205\nv -0.152193 0.093236 0.387205\nv 0.086088 0.058079 0.359861\nv -0.117037 0.058079 0.359861\nv 0.062650 0.038548 0.312986\nv -0.093600 0.038548 0.312986\nv 0.023588 0.132298 0.316892\nv -0.054537 0.132298 0.316892\nv 0.054838 0.132298 0.359861\nv -0.085787 0.132298 0.359861\nv 0.105619 0.132298 0.387205\nv -0.136568 0.132298 0.387205\nv 0.121244 0.175267 0.387205\nv -0.152193 0.175267 0.387205\nv 0.086088 0.206517 0.359861\nv -0.117037 0.206517 0.359861\nv 0.062650 0.229954 0.312986\nv -0.093600 0.229954 0.312986\nv 0.160307 0.269017 0.297361\nv -0.191256 0.269017 0.297361\nv 0.160307 0.237767 0.348142\nv -0.191256 0.237767 0.348142\nv 0.160307 0.190892 0.379392\nv -0.191256 0.190892 0.379392\nv 0.203275 0.175267 0.371580\nv -0.234225 0.175267 0.371580\nv 0.234525 0.206517 0.332517\nv -0.265475 0.206517 0.332517\nv 0.257963 0.229954 0.277830\nv -0.288912 0.229954 0.277830\nv 0.297025 0.132298 0.270017\nv -0.327975 0.132298 0.270017\nv 0.265775 0.132298 0.324705\nv -0.296725 0.132298 0.324705\nv 0.218900 0.132298 0.367674\nv -0.249850 0.132298 0.367674\nv 0.222807 0.132298 0.375486\nv -0.253756 0.132298 0.375486\nv 0.207182 0.179173 0.379392\nv -0.238131 0.179173 0.379392\nv 0.160307 0.198704 0.391111\nv -0.191256 0.198704 0.391111\nv 0.117338 0.179173 0.398924\nv -0.148287 0.179173 0.398924\nv 0.097807 0.132298 0.398924\nv -0.128756 0.132298 0.398924\nv 0.117338 0.089329 0.398924\nv -0.148287 0.089329 0.398924\nv 0.160307 0.132298 0.402830\nv -0.191256 0.132298 0.402830\nv 0.160307 0.069798 0.391111\nv -0.191256 0.069798 0.391111\nv 0.207182 0.089329 0.379392\nv -0.238131 0.089329 0.379392\nv -0.015475 0.226048 0.359861\nv -0.015475 0.186986 0.398924\nv -0.015475 -0.328639 0.355955\nv -0.015475 -0.148952 0.379392\nv -0.015475 -0.082546 0.387205\nv -0.015475 -0.375514 0.348142\nv -0.015475 0.214329 0.289549\nv -0.015475 0.296361 0.273924\nv -0.015475 0.460423 -0.284670\nv -0.015475 0.292454 -0.437014\nv -0.015475 0.046361 -0.425295\nv -0.015475 -0.180202 -0.187014\nv 0.086088 -0.082546 0.270017\nv -0.117037 -0.082546 0.270017\nv 0.140775 -0.207546 0.273924\nv -0.171725 -0.207546 0.273924\nv 0.160307 -0.336452 0.273924\nv -0.191256 -0.336452 0.273924\nv 0.168119 -0.434108 0.254392\nv -0.199068 -0.434108 0.254392\nv 0.148588 -0.461452 0.250486\nv -0.179537 -0.461452 0.250486\nv 0.074369 -0.473171 0.266111\nv -0.105318 -0.473171 0.266111\nv -0.015475 -0.480983 0.277830\nv 0.203275 -0.059108 0.254392\nv -0.234225 -0.059108 0.254392\nv 0.300932 -0.008327 0.258299\nv -0.331881 -0.008327 0.258299\nv 0.398588 0.085423 0.211424\nv -0.429537 0.085423 0.211424\nv 0.414213 0.226048 0.285642\nv -0.445162 0.226048 0.285642\nv 0.339994 0.253392 0.301267\nv -0.370943 0.253392 0.301267\nv 0.230619 0.311986 0.332517\nv -0.261568 0.311986 0.332517\nv 0.144682 0.390111 0.355955\nv -0.175631 0.390111 0.355955\nv 0.062650 0.370579 0.367674\nv -0.093600 0.370579 0.367674\nv 0.015775 0.257298 0.363767\nv -0.046725 0.257298 0.363767\nv 0.066557 0.218236 0.375486\nv -0.097506 0.218236 0.375486\nv 0.047025 0.163548 0.371580\nv -0.077975 0.163548 0.371580\nv 0.086088 0.058079 0.359861\nv -0.117037 0.058079 0.359861\nv 0.172025 0.019017 0.340330\nv -0.202975 0.019017 0.340330\nv 0.230619 0.042454 0.324705\nv -0.261568 0.042454 0.324705\nv 0.297025 0.104954 0.312986\nv -0.327975 0.104954 0.312986\nv 0.304838 0.159642 0.312986\nv -0.335787 0.159642 0.312986\nv 0.285307 0.198704 0.320799\nv -0.316256 0.198704 0.320799\nv 0.199369 0.229954 0.348142\nv -0.230318 0.229954 0.348142\nv 0.109525 0.245579 0.367674\nv -0.140475 0.245579 0.367674\nv -0.015475 -0.371608 0.355955\nv 0.039213 -0.348171 0.355955\nv -0.070162 -0.348171 0.355955\nv 0.043119 -0.406764 0.344236\nv -0.074068 -0.406764 0.344236\nv 0.015775 -0.430202 0.336424\nv -0.046725 -0.430202 0.336424\nv -0.015475 -0.434108 0.332517\nv -0.015475 -0.086452 0.363767\nv -0.015475 -0.059108 0.359861\nv 0.035307 -0.063014 0.359861\nv -0.066256 -0.063014 0.359861\nv 0.047025 -0.102077 0.363767\nv -0.077975 -0.102077 0.363767\nv 0.027494 -0.133327 0.359861\nv -0.058443 -0.133327 0.359861\nv 0.183744 -0.012233 0.324705\nv -0.214693 -0.012233 0.324705\nv 0.293119 0.038548 0.301267\nv -0.324068 0.038548 0.301267\nv 0.347807 0.112767 0.289549\nv -0.378756 0.112767 0.289549\nv 0.355619 0.198704 0.316892\nv -0.386568 0.198704 0.316892\nv 0.328275 0.218236 0.352049\nv -0.359225 0.218236 0.352049\nv 0.203275 0.284642 0.387205\nv -0.234225 0.284642 0.387205\nv 0.140775 0.331517 0.406736\nv -0.171725 0.331517 0.406736\nv 0.086088 0.319798 0.414549\nv -0.117037 0.319798 0.414549\nv 0.035307 0.226048 0.410642\nv -0.066256 0.226048 0.410642\nv 0.047025 -0.039577 0.395017\nv -0.077975 -0.039577 0.395017\nv 0.089994 -0.211452 0.344236\nv -0.120943 -0.211452 0.344236\nv 0.109525 -0.340358 0.332517\nv -0.140475 -0.340358 0.332517\nv 0.117338 -0.398952 0.320799\nv -0.148287 -0.398952 0.320799\nv 0.101713 -0.445827 0.305174\nv -0.132662 -0.445827 0.305174\nv 0.066557 -0.453639 0.305174\nv -0.097506 -0.453639 0.305174\nv -0.015475 -0.461452 0.309080\nv -0.015475 0.034642 0.352049\nv -0.015475 0.116673 0.371580\nv 0.148588 0.249486 0.359861\nv -0.179537 0.249486 0.359861\nv 0.066557 0.081517 0.363767\nv -0.097506 0.081517 0.363767\nv 0.050932 0.116673 0.367674\nv -0.081881 0.116673 0.367674\nv 0.043119 -0.332546 0.355955\nv -0.074068 -0.332546 0.355955\nv 0.023588 -0.211452 0.363767\nv -0.054537 -0.211452 0.363767\nv -0.015475 -0.211452 0.363767\nv -0.015475 -0.152858 0.359861\nv 0.031400 -0.125514 0.379392\nv -0.062350 -0.125514 0.379392\nv 0.050932 -0.102077 0.387205\nv -0.081881 -0.102077 0.387205\nv 0.039213 -0.055202 0.379392\nv -0.070162 -0.055202 0.379392\nv 0.004057 -0.051296 0.379392\nv -0.035006 -0.051296 0.379392\nv -0.015475 -0.090358 0.402830\nv 0.007963 -0.063014 0.395017\nv -0.038912 -0.063014 0.395017\nv 0.031400 -0.066921 0.395017\nv -0.062350 -0.066921 0.395017\nv 0.039213 -0.102077 0.402830\nv -0.070162 -0.102077 0.402830\nv 0.023588 -0.113796 0.391111\nv -0.054537 -0.113796 0.391111\nv -0.015475 -0.133327 0.391111\nv 0.113432 -0.145046 0.266111\nv -0.144381 -0.145046 0.266111\nv 0.066557 -0.109889 0.344236\nv -0.097506 -0.109889 0.344236\nv 0.074369 -0.145046 0.344236\nv -0.105318 -0.145046 0.344236\nv 0.101713 -0.113796 0.266111\nv -0.132662 -0.113796 0.266111\nv -0.015475 -0.426296 0.332517\nv 0.007963 -0.422389 0.332517\nv -0.038912 -0.422389 0.332517\nv 0.031400 -0.398952 0.344236\nv -0.062350 -0.398952 0.344236\nv 0.031400 -0.359889 0.352049\nv -0.062350 -0.359889 0.352049\nv -0.015475 -0.379421 0.316892\nv 0.031400 -0.363796 0.320799\nv -0.062350 -0.363796 0.320799\nv 0.031400 -0.395046 0.309080\nv -0.062350 -0.395046 0.309080\nv 0.007963 -0.414577 0.305174\nv -0.038912 -0.414577 0.305174\nv -0.015475 -0.418483 0.305174\nv 0.070463 0.120579 0.379392\nv -0.101412 0.120579 0.379392\nv 0.078275 0.089329 0.375486\nv -0.109225 0.089329 0.375486\nv 0.152494 0.226048 0.367674\nv -0.183443 0.226048 0.367674\nv 0.121244 0.222142 0.375486\nv -0.152193 0.222142 0.375486\nv 0.195463 0.210423 0.375486\nv -0.226412 0.210423 0.375486\nv 0.265775 0.186986 0.336424\nv -0.296725 0.186986 0.336424\nv 0.277494 0.155736 0.332517\nv -0.308443 0.155736 0.332517\nv 0.273588 0.108861 0.328611\nv -0.304537 0.108861 0.328611\nv 0.222807 0.061986 0.348142\nv -0.253756 0.061986 0.348142\nv 0.172025 0.042454 0.359861\nv -0.202975 0.042454 0.359861\nv 0.097807 0.065892 0.379392\nv -0.128756 0.065892 0.379392\nv 0.074369 0.159642 0.379392\nv -0.105318 0.159642 0.379392\nv 0.089994 0.198704 0.379392\nv -0.120943 0.198704 0.379392\nv 0.101713 0.190892 0.367674\nv -0.132662 0.190892 0.367674\nv 0.082182 0.159642 0.367674\nv -0.113131 0.159642 0.367674\nv 0.105619 0.073704 0.367674\nv -0.136568 0.073704 0.367674\nv 0.172025 0.054173 0.352049\nv -0.202975 0.054173 0.352049\nv 0.214994 0.069798 0.340330\nv -0.245943 0.069798 0.340330\nv 0.257963 0.116673 0.324705\nv -0.288912 0.116673 0.324705\nv 0.261869 0.151829 0.324705\nv -0.292818 0.151829 0.324705\nv 0.250150 0.179173 0.328611\nv -0.281100 0.179173 0.328611\nv 0.191557 0.206517 0.363767\nv -0.222506 0.206517 0.363767\nv 0.125150 0.210423 0.371580\nv -0.156100 0.210423 0.371580\nv 0.152494 0.214329 0.363767\nv -0.183443 0.214329 0.363767\nv 0.086088 0.097142 0.363767\nv -0.117037 0.097142 0.363767\nv 0.082182 0.124486 0.363767\nv -0.113131 0.124486 0.363767\nv 0.039213 0.241673 0.293455\nv -0.070162 0.241673 0.293455\nv 0.082182 0.343236 0.297361\nv -0.113131 0.343236 0.297361\nv 0.152494 0.354954 0.285642\nv -0.183443 0.354954 0.285642\nv 0.226713 0.288548 0.266111\nv -0.257662 0.288548 0.266111\nv 0.324369 0.237767 0.234861\nv -0.355318 0.237767 0.234861\nv 0.382963 0.214329 0.219236\nv -0.413912 0.214329 0.219236\nv 0.371244 0.093236 0.176267\nv -0.402193 0.093236 0.176267\nv 0.285307 0.011204 0.195799\nv -0.316256 0.011204 0.195799\nv 0.203275 -0.035671 0.223142\nv -0.234225 -0.035671 0.223142\nv -0.015475 0.460423 0.133299\nv -0.015475 0.503392 -0.050295\nv -0.015475 -0.086452 -0.347170\nv -0.015475 -0.219264 0.082517\nv -0.015475 -0.477077 0.219236\nv -0.015475 -0.391139 0.160642\nv -0.015475 -0.273952 0.148924\nv -0.015475 -0.230983 0.129392\nv 0.410307 0.128392 0.016111\nv -0.441256 0.128392 0.016111\nv 0.414213 0.171361 -0.034670\nv -0.445162 0.171361 -0.034670\nv 0.371244 0.144017 -0.229983\nv -0.402193 0.144017 -0.229983\nv 0.214994 0.229954 -0.362795\nv -0.245943 0.229954 -0.362795\nv 0.351713 -0.012233 0.023924\nv -0.382662 -0.012233 0.023924\nv 0.281400 -0.051296 -0.093264\nv -0.312350 -0.051296 -0.093264\nv 0.304838 0.007298 -0.226076\nv -0.335787 0.007298 -0.226076\nv 0.152494 0.038548 -0.343264\nv -0.183443 0.038548 -0.343264\nv 0.101713 -0.164577 0.191892\nv -0.132662 -0.164577 0.191892\nv 0.074369 -0.195827 0.117674\nv -0.105318 -0.195827 0.117674\nv 0.129057 -0.344264 0.180174\nv -0.160006 -0.344264 0.180174\nv 0.109525 -0.238796 0.184080\nv -0.140475 -0.238796 0.184080\nv 0.148588 -0.445827 0.187986\nv -0.179537 -0.445827 0.187986\nv 0.054838 -0.367702 0.172361\nv -0.085787 -0.367702 0.172361\nv 0.047025 -0.258327 0.168455\nv -0.077975 -0.258327 0.168455\nv 0.066557 -0.461452 0.207517\nv -0.097506 -0.461452 0.207517\nv 0.093900 -0.129421 0.203611\nv -0.124850 -0.129421 0.203611\nv 0.089994 -0.102077 0.223142\nv -0.120943 -0.102077 0.223142\nv 0.086088 -0.074733 0.238767\nv -0.117037 -0.074733 0.238767\nv 0.089994 -0.184108 0.070799\nv -0.120943 -0.184108 0.070799\nv 0.132963 -0.145046 -0.144045\nv -0.163912 -0.145046 -0.144045\nv 0.156400 -0.063014 -0.280764\nv -0.187350 -0.063014 -0.280764\nv 0.211088 0.444798 -0.202639\nv -0.242037 0.444798 -0.202639\nv 0.211088 0.476048 -0.046389\nv -0.242037 0.476048 -0.046389\nv 0.211088 0.436986 0.105955\nv -0.242037 0.436986 0.105955\nv 0.214994 0.272923 0.203611\nv -0.245943 0.272923 0.203611\nv 0.347807 0.214329 0.156736\nv -0.378756 0.214329 0.156736\nv 0.300932 0.237767 0.129392\nv -0.331881 0.237767 0.129392\nv 0.304838 0.362767 0.016111\nv -0.335787 0.362767 0.016111\nv 0.382963 0.292454 0.051267\nv -0.413912 0.292454 0.051267\nv 0.382963 0.319798 -0.069826\nv -0.413912 0.319798 -0.069826\nv 0.304838 0.386204 -0.108889\nv -0.335787 0.386204 -0.108889\nv 0.304838 0.351048 -0.233889\nv -0.335787 0.351048 -0.233889\nv 0.382963 0.280736 -0.190920\nv -0.413912 0.280736 -0.190920\nv 0.293119 0.175267 -0.304201\nv -0.324068 0.175267 -0.304201\nv 0.226713 0.022923 -0.284670\nv -0.257662 0.022923 -0.284670\nv 0.394682 0.175267 -0.112795\nv -0.425631 0.175267 -0.112795\nv 0.187650 -0.074733 0.062986\nv -0.218600 -0.074733 0.062986\nv 0.199369 -0.086452 -0.116701\nv -0.230318 -0.086452 -0.116701\nv 0.429838 0.214329 -0.128420\nv -0.460787 0.214329 -0.128420\nv 0.371244 -0.059108 -0.073733\nv -0.402193 -0.059108 -0.073733\nv 0.504057 -0.039577 -0.175295\nv -0.535006 -0.039577 -0.175295\nv 0.625150 0.038548 -0.226076\nv -0.656100 0.038548 -0.226076\nv 0.660307 0.171361 -0.222170\nv -0.691256 0.171361 -0.222170\nv 0.601713 0.265111 -0.222170\nv -0.632662 0.265111 -0.222170\nv 0.496244 0.249486 -0.167483\nv -0.527193 0.249486 -0.167483\nv 0.492338 0.218236 -0.155764\nv -0.523287 0.218236 -0.155764\nv 0.578275 0.229954 -0.206545\nv -0.609225 0.229954 -0.206545\nv 0.617338 0.155736 -0.214358\nv -0.648287 0.155736 -0.214358\nv 0.589994 0.050267 -0.214358\nv -0.620943 0.050267 -0.214358\nv 0.500150 -0.008327 -0.163576\nv -0.531100 -0.008327 -0.163576\nv 0.398588 -0.023952 -0.077639\nv -0.429537 -0.023952 -0.077639\nv 0.445463 0.190892 -0.120608\nv -0.476412 0.190892 -0.120608\nv 0.457182 0.163548 -0.155764\nv -0.488131 0.163548 -0.155764\nv 0.425932 -0.000514 -0.116701\nv -0.456881 -0.000514 -0.116701\nv 0.504057 0.011204 -0.194826\nv -0.535006 0.011204 -0.194826\nv 0.578275 0.058079 -0.233889\nv -0.609225 0.058079 -0.233889\nv 0.601713 0.136204 -0.233889\nv -0.632662 0.136204 -0.233889\nv 0.570463 0.190892 -0.229983\nv -0.601412 0.190892 -0.229983\nv 0.496244 0.183079 -0.190920\nv -0.527193 0.183079 -0.190920\nv 0.406400 0.155736 -0.116701\nv -0.437350 0.155736 -0.116701\nv 0.402494 0.097142 -0.147951\nv -0.433443 0.097142 -0.147951\nv 0.363432 0.058079 -0.147951\nv -0.394381 0.058079 -0.147951\nv 0.394682 0.054173 -0.147951\nv -0.425631 0.054173 -0.147951\nv 0.406400 0.019017 -0.147951\nv -0.437350 0.019017 -0.147951\nv 0.390775 0.003392 -0.147951\nv -0.421725 0.003392 -0.147951\nv 0.347807 0.011204 -0.046389\nv -0.378756 0.011204 -0.046389\nv 0.343900 -0.000514 -0.097170\nv -0.374850 -0.000514 -0.097170\nv 0.343900 0.030736 -0.104983\nv -0.374850 0.030736 -0.104983\nv 0.382963 0.112767 -0.116701\nv -0.413912 0.112767 -0.116701\nv 0.429838 0.132298 -0.144045\nv -0.460787 0.132298 -0.144045\nv 0.429838 0.128392 -0.171389\nv -0.460787 0.128392 -0.171389\nv 0.390775 0.003392 -0.171389\nv -0.421725 0.003392 -0.171389\nv 0.410307 0.019017 -0.171389\nv -0.441256 0.019017 -0.171389\nv 0.398588 0.050267 -0.171389\nv -0.429537 0.050267 -0.171389\nv 0.367338 0.058079 -0.171389\nv -0.398287 0.058079 -0.171389\nv 0.406400 0.097142 -0.171389\nv -0.437350 0.097142 -0.171389\nv 0.504057 0.175267 -0.218264\nv -0.535006 0.175267 -0.218264\nv 0.578275 0.183079 -0.253420\nv -0.609225 0.183079 -0.253420\nv 0.613432 0.132298 -0.257326\nv -0.644381 0.132298 -0.257326\nv 0.589994 0.054173 -0.253420\nv -0.620943 0.054173 -0.253420\nv 0.507963 0.011204 -0.222170\nv -0.538912 0.011204 -0.222170\nv 0.425932 0.003392 -0.144045\nv -0.456881 0.003392 -0.144045\nv 0.461088 0.155736 -0.183108\nv -0.492037 0.155736 -0.183108\nv 0.429838 0.065892 -0.175295\nv -0.460787 0.065892 -0.175295\nv 0.453275 0.042454 -0.179201\nv -0.484225 0.042454 -0.179201\nv 0.484525 0.073704 -0.194826\nv -0.515475 0.073704 -0.194826\nv 0.464994 0.097142 -0.187014\nv -0.495943 0.097142 -0.187014\nv 0.492338 0.128392 -0.198733\nv -0.523287 0.128392 -0.198733\nv 0.511869 0.104954 -0.202639\nv -0.542818 0.104954 -0.202639\nv 0.539213 0.116673 -0.206545\nv -0.570162 0.116673 -0.206545\nv 0.527494 0.147923 -0.206545\nv -0.558443 0.147923 -0.206545\nv 0.496244 0.229954 -0.253420\nv -0.527193 0.229954 -0.253420\nv 0.609525 0.245579 -0.284670\nv -0.640475 0.245579 -0.284670\nv 0.668119 0.159642 -0.261233\nv -0.699068 0.159642 -0.261233\nv 0.640775 0.038548 -0.276858\nv -0.671725 0.038548 -0.276858\nv 0.504057 -0.031764 -0.257326\nv -0.535006 -0.031764 -0.257326\nv 0.379057 -0.051296 -0.175295\nv -0.410006 -0.051296 -0.175295\nv 0.414213 0.202611 -0.202639\nv -0.445162 0.202611 -0.202639\nvn 0.666000 -0.204900 0.717200\nvn -0.663000 -0.192900 0.723300\nvn 0.830100 -0.307100 0.465400\nvn -0.828500 -0.299000 0.473400\nvn 0.408100 -0.803800 0.432800\nvn -0.425100 -0.779300 0.460500\nvn 0.371400 -0.486600 0.790800\nvn -0.338500 -0.548600 0.764500\nvn -0.099200 -0.547200 0.831100\nvn 0.039300 -0.523700 0.851000\nvn -0.258900 -0.838800 0.478900\nvn 0.283700 -0.844300 0.454600\nvn -0.765600 -0.322300 0.556800\nvn 0.765600 -0.322300 0.556800\nvn -0.464900 -0.195800 0.863400\nvn 0.476700 -0.190700 0.858100\nvn -0.482300 0.203100 0.852200\nvn 0.467200 0.169900 0.867700\nvn -0.771000 0.324600 0.547800\nvn 0.771000 0.324600 0.547800\nvn -0.265900 0.821000 0.505200\nvn 0.265900 0.821000 0.505200\nvn -0.055400 0.553800 0.830800\nvn 0.055400 0.553800 0.830800\nvn 0.344800 0.578800 0.738900\nvn -0.344800 0.578800 0.738900\nvn 0.423100 0.752900 0.504000\nvn -0.423100 0.752900 0.504000\nvn 0.828500 0.299000 0.473400\nvn -0.828500 0.299000 0.473400\nvn 0.665200 0.175900 0.725700\nvn -0.665200 0.175900 0.725700\nvn 0.768300 0.329300 -0.548800\nvn -0.768300 0.329300 -0.548800\nvn 0.197700 0.815600 -0.543700\nvn -0.197700 0.815600 -0.543700\nvn -0.408200 0.816500 -0.408200\nvn 0.408200 0.816500 -0.408200\nvn -0.796400 0.289600 -0.530900\nvn 0.796400 0.289600 -0.530900\nvn -0.832800 -0.378600 -0.403800\nvn 0.789500 -0.315800 -0.526300\nvn -0.432000 -0.750400 -0.500300\nvn 0.408200 -0.816500 -0.408200\nvn 0.214300 -0.826600 -0.520400\nvn -0.197700 -0.815600 -0.543700\nvn 0.840000 -0.343600 -0.420000\nvn -0.752200 -0.356300 -0.554300\nvn 0.400000 -0.062300 0.914400\nvn -0.400000 -0.062300 0.914400\nvn 0.306900 -0.175400 0.935400\nvn -0.306900 -0.175400 0.935400\nvn 0.094500 -0.183500 0.978500\nvn -0.094500 -0.183500 0.978500\nvn -0.062400 -0.028300 0.997700\nvn 0.062400 -0.028300 0.997700\nvn -0.062400 0.026000 0.997700\nvn 0.062400 0.026000 0.997700\nvn 0.099600 0.172900 0.979900\nvn -0.099600 0.172900 0.979900\nvn 0.303600 0.165600 0.938300\nvn -0.303600 0.165600 0.938300\nvn 0.400200 0.057200 0.914700\nvn -0.400200 0.057200 0.914700\nvn 0.105900 -0.880800 0.461600\nvn -0.105900 -0.880800 0.461600\nvn 0.196700 -0.885200 0.421500\nvn -0.196700 -0.885200 0.421500\nvn 0.623000 -0.426300 0.655800\nvn -0.548600 -0.488800 0.678300\nvn 0.789800 -0.017300 0.613100\nvn -0.756100 -0.069600 0.650700\nvn 0.752800 0.054400 0.656000\nvn -0.801500 0.121400 0.585600\nvn 0.435900 -0.688300 0.579900\nvn -0.229900 -0.896000 0.379800\nvn 0.292800 -0.619100 0.728700\nvn -0.292800 -0.619100 0.728700\nvn 0.689800 -0.414600 0.593500\nvn -0.689100 -0.423900 0.587700\nvn 0.573000 -0.431400 0.696800\nvn -0.573000 -0.431400 0.696800\nvn 0.386100 0.714400 0.583600\nvn -0.386100 0.714400 0.583600\nvn 0.507900 0.641600 0.574800\nvn -0.507900 0.641600 0.574800\nvn 0.581000 0.510600 0.633800\nvn -0.630400 0.520800 0.575600\nvn -0.051700 0.664400 0.745600\nvn 0.051700 0.664400 0.745600\nvn -0.787900 0.307600 0.533400\nvn 0.787900 0.307600 0.533400\nvn -0.622500 0.553400 0.553400\nvn 0.622500 0.553400 0.553400\nvn 0.401600 -0.395000 0.826200\nvn -0.401600 -0.395000 0.826200\nvn 0.222400 -0.467700 0.855500\nvn -0.218100 -0.471000 0.854800\nvn -0.171100 -0.564500 0.807500\nvn 0.171100 -0.564500 0.807500\nvn -0.180300 -0.703400 0.687500\nvn 0.180300 -0.703400 0.687500\nvn 0.420700 -0.613700 0.668100\nvn -0.420700 -0.613700 0.668100\nvn 0.437300 -0.308500 0.844700\nvn -0.437300 -0.308500 0.844700\nvn 0.343400 -0.105700 0.933200\nvn -0.343400 -0.105700 0.933200\nvn 0.337100 -0.316900 0.886500\nvn -0.337100 -0.316900 0.886500\nvn 0.428400 0.149400 0.891100\nvn -0.428400 0.149400 0.891100\nvn -0.292200 0.282900 0.913600\nvn -0.386900 0.171400 0.906000\nvn 0.429900 -0.721700 0.542500\nvn -0.429900 -0.721700 0.542500\nvn 0.054700 -0.361900 0.930600\nvn -0.386300 -0.044600 0.921300\nvn -0.062600 -0.137600 0.988500\nvn 0.062600 -0.137600 0.988500\nvn 0.097700 -0.647700 0.755600\nvn -0.020400 -0.783700 0.620800\nvn 0.147000 -0.661700 0.735200\nvn -0.207400 -0.518500 0.829600\nvn 0.482500 -0.140700 0.864500\nvn -0.482500 -0.140700 0.864500\nvn 0.332000 -0.007300 0.943200\nvn -0.281900 -0.044400 0.958400\nvn 0.314000 -0.145800 0.938200\nvn -0.359500 -0.089900 0.928800\nvn -0.030200 0.066500 0.997300\nvn 0.030200 0.066500 0.997300\nvn 0.000000 -0.064400 0.997900\nvn 0.000000 0.000000 1.000000\nvn 0.744100 -0.658200 0.114500\nvn -0.847300 -0.511900 -0.141200\nvn 0.963500 0.214100 -0.160600\nvn -0.925600 0.249200 -0.284800\nvn 0.098500 0.886100 -0.452900\nvn -0.098500 0.886100 -0.452900\nvn -0.854400 0.512600 -0.085400\nvn 0.854400 0.512600 -0.085400\nvn 0.398300 -0.876300 0.270900\nvn -0.398300 -0.876300 0.270900\nvn 0.287300 -0.574700 0.766300\nvn -0.287300 -0.574700 0.766300\nvn -0.520700 0.615400 0.591700\nvn 0.781400 0.558100 0.279100\nvn 0.127000 0.762000 0.635000\nvn -0.089700 0.807400 0.583100\nvn 0.745400 0.298100 0.596300\nvn -0.745400 0.298100 0.596300\nvn 0.000000 -0.707100 0.707100\nvn -0.604600 -0.654900 0.453400\nvn 0.048600 0.227000 0.972700\nvn -0.048600 0.227000 0.972700\nvn 0.428600 -0.857100 0.285700\nvn 0.056300 -0.262700 0.963200\nvn -0.781800 -0.366200 0.504700\nvn -0.006400 0.083000 0.996500\nvn 0.581900 -0.363700 0.727400\nvn 0.872900 -0.218200 0.436400\nvn 0.243500 -0.268700 0.932000\nvn -0.243500 -0.268700 0.932000\nvn 0.282000 0.033800 0.958800\nvn -0.282000 0.033800 0.958800\nvn 0.816500 0.408200 0.408200\nvn -0.816500 0.408200 0.408200\nvn 0.868200 0.325600 0.374400\nvn -0.868200 0.325600 0.374400\nvn 0.910200 -0.044600 0.411800\nvn -0.893200 0.430200 0.131200\nvn 0.357900 -0.835200 0.417600\nvn -0.357900 -0.835200 0.417600\nvn -0.192400 -0.192500 0.962300\nvn 0.135300 -0.203000 0.969800\nvn -0.188100 -0.282200 0.940700\nvn 0.356900 0.107100 0.928000\nvn -0.065500 0.393100 0.917200\nvn 0.124000 0.000000 0.992300\nvn -0.158200 0.949400 0.271300\nvn 0.158200 0.949400 0.271300\nvn -0.646200 0.758500 0.084300\nvn 0.739600 0.647200 0.184900\nvn -1.000000 0.000000 0.000000\nvn 1.000000 0.000000 0.000000\nvn 0.305100 -0.945000 0.118100\nvn -0.305100 -0.945000 0.118100\nvn 0.052600 -0.315800 0.947400\nvn -0.016000 -0.287300 0.957700\nvn 0.135300 -0.347900 0.927700\nvn -0.135300 -0.347900 0.927700\nvn -0.599000 -0.245000 0.762300\nvn 0.448100 -0.293000 0.844600\nvn -0.521400 0.052100 0.851700\nvn 0.286900 -0.103300 0.952400\nvn -0.270900 0.028000 0.962200\nvn 0.270900 0.028000 0.962200\nvn -0.577400 -0.577400 0.577400\nvn 0.577400 -0.577400 0.577400\nvn 0.000000 -0.640200 0.768200\nvn 0.265500 -0.829600 0.491100\nvn 0.397200 -0.635600 0.662000\nvn -0.418600 -0.581400 0.697700\nvn 0.516800 -0.214500 0.828800\nvn -0.591400 -0.511500 0.623400\nvn 0.588200 -0.115700 0.800400\nvn -0.544000 -0.077700 0.835500\nvn 0.573200 0.124600 0.809900\nvn -0.573200 0.124600 0.809900\nvn 0.434700 0.702300 0.563700\nvn -0.434700 0.702300 0.563700\nvn -0.061300 0.306400 0.949900\nvn -0.406300 0.715100 0.568800\nvn 0.177200 0.389800 0.903700\nvn -0.152400 0.335300 0.929700\nvn -0.012900 0.181100 0.983400\nvn 0.021900 0.306300 0.951700\nvn 0.447500 -0.469900 0.760800\nvn -0.447500 -0.469900 0.760800\nvn 0.296300 -0.211700 0.931300\nvn -0.266700 -0.304800 0.914300\nvn -0.276300 -0.303900 0.911800\nvn 0.276300 -0.303900 0.911800\nvn -0.116200 -0.930000 0.348700\nvn 0.116200 -0.930000 0.348700\nvn -0.320700 -0.267300 0.908700\nvn 0.381000 -0.254000 0.889000\nvn -0.439200 -0.038200 0.897600\nvn 0.439200 -0.038200 0.897600\nvn -0.053200 0.359400 0.931700\nvn 0.221600 0.569800 0.791400\nvn -0.082800 0.662100 0.744800\nvn 0.082800 0.662100 0.744800\nvn 0.366700 0.516100 0.774100\nvn -0.366700 0.516100 0.774100\nvn 0.498800 0.530000 0.685800\nvn -0.498800 0.530000 0.685800\nvn 0.738200 -0.461400 0.492100\nvn -0.601400 -0.240600 0.761800\nvn 0.806100 -0.065400 0.588200\nvn -0.829200 -0.082900 0.552800\nvn 0.790300 0.112900 0.602200\nvn -0.780000 0.118200 0.614500\nvn -0.404300 0.855000 -0.324800\nvn 0.694700 0.709500 -0.118200\nvn -0.846500 0.372800 -0.380100\nvn 0.855200 0.366500 -0.366500\nvn -0.267200 0.849700 -0.454500\nvn 0.267200 0.849700 -0.454500\nvn 0.596300 0.745400 -0.298100\nvn -0.596300 0.745400 -0.298100\nvn 0.383900 0.874600 -0.296100\nvn -0.383900 0.874600 -0.296100\nvn 0.285900 0.911600 -0.295400\nvn -0.278900 0.918100 -0.281700\nvn 0.793600 0.212700 -0.570000\nvn -0.793600 0.212700 -0.570000\nvn 0.595500 -0.712300 -0.371500\nvn -0.452700 -0.728600 -0.514000\nvn 0.249000 -0.774800 -0.581100\nvn -0.440800 -0.819500 -0.366300\nvn 0.043100 -0.413400 -0.909500\nvn -0.043100 -0.413400 -0.909500\nvn 0.318400 -0.094300 -0.943300\nvn -0.318400 -0.094300 -0.943300\nvn 0.309500 -0.535700 -0.785700\nvn -0.309500 -0.535700 -0.785700\nvn 0.177700 -0.981900 -0.065500\nvn -0.058500 -0.977400 -0.203300\nvn 0.134100 -0.968100 -0.211500\nvn -0.101600 -0.965100 -0.241300\nvn 0.980200 0.192200 0.048000\nvn -0.608200 -0.331400 -0.721300\nvn 0.944100 0.184900 -0.273000\nvn -0.920800 0.146000 -0.361700\nvn 0.247500 -0.016900 -0.968700\nvn -0.087900 0.053100 -0.994700\nvn -0.209300 -0.114900 -0.971100\nvn 0.209300 -0.114900 -0.971100\nvn 0.204100 0.123700 -0.971100\nvn -0.204100 0.123700 -0.971100\nvn 0.918400 0.135800 -0.371500\nvn -0.920400 0.139500 -0.365200\nvn 0.931800 0.289400 -0.218800\nvn -0.931800 0.289400 -0.218800\nvn 0.913200 0.296200 -0.279700\nvn -0.913200 0.296200 -0.279700\nvn 0.882500 0.455800 -0.116400\nvn -0.882500 0.455800 -0.116400\nvn 0.279400 -0.931500 -0.232900\nvn -0.279400 -0.931500 -0.232900\nvn 0.367700 -0.477100 -0.798300\nvn -0.367700 -0.477100 -0.798300\nvn 0.290600 -0.841600 -0.455200\nvn -0.290600 -0.841600 -0.455200\nvn 0.303100 -0.946400 -0.111500\nvn -0.266000 -0.954000 -0.138300\nvn 0.348700 -0.930000 -0.116200\nvn -0.284200 -0.930100 -0.232500\nvn 0.690300 -0.721800 0.049600\nvn -0.690300 -0.721800 0.049600\nvn 0.861500 -0.337900 0.378900\nvn -0.691600 -0.722200 0.010200\nvn 0.256700 -0.180700 -0.949400\nvn -0.256700 -0.180700 -0.949400\nvn 0.129100 0.960600 0.246300\nvn -0.129100 0.960600 0.246300\nvn 0.137300 0.971300 -0.194300\nvn -0.120900 0.976400 -0.179000\nvn 0.387600 0.555500 -0.735700\nvn -0.300000 0.640900 -0.706600\nvn 0.566000 0.760500 -0.318300\nvn -0.352200 0.932700 -0.078300\nvn 0.343200 0.696400 0.630300\nvn 0.094400 0.670100 0.736200\nvn 0.583800 0.792000 0.178800\nvn -0.625500 0.766900 0.143800\nvn 0.715900 0.664500 -0.214300\nvn -0.690100 0.696700 -0.195900\nvn 0.716600 0.217300 -0.662800\nvn -0.716600 0.217300 -0.662800\nvn 0.058000 0.367400 -0.928200\nvn -0.714500 0.426500 -0.554600\nvn 0.595900 0.773100 -0.217400\nvn -0.675100 0.723400 -0.144700\nvn 0.690500 0.710900 0.133300\nvn -0.738100 0.653600 0.167600\nvn 0.677200 0.482400 0.555600\nvn -0.776600 0.335800 0.533000\nvn 0.434700 0.895400 -0.096600\nvn -0.434700 0.895400 -0.096600\nvn 0.299300 0.493300 0.816700\nvn -0.299300 0.493300 0.816700\nvn -0.178200 0.089100 -0.980000\nvn 0.170200 0.109700 -0.979300\nvn 0.023300 0.968800 -0.246600\nvn -0.041900 0.373000 0.926900\nvn -0.161600 0.184700 0.969400\nvn 0.161600 0.184700 0.969400\nvn 0.966000 -0.164300 0.199500\nvn -0.966000 -0.164300 0.199500\nvn 0.945600 0.013300 0.325100\nvn -0.933400 0.235400 0.271000\nvn 0.997000 0.075800 0.017100\nvn -0.901900 0.379300 -0.206500\nvn 0.995100 -0.094000 0.030300\nvn -0.995100 -0.094000 0.030300\nvn 0.662500 -0.749100 -0.003700\nvn -0.662500 -0.749100 -0.003700\nvn 0.372200 -0.924300 0.084600\nvn -0.372200 -0.924300 0.084600\nvn 0.387700 -0.903500 0.182600\nvn -0.548000 -0.774000 0.317300\nvn 0.848900 -0.221500 0.479800\nvn -0.499300 -0.851700 0.159000\nvn 0.732500 -0.636800 0.240700\nvn -0.732500 -0.636800 0.240700\nvn 0.263700 -0.449900 0.853300\nvn -0.263700 -0.449900 0.853300\nvn 0.538300 -0.284100 -0.793400\nvn -0.538300 -0.284100 -0.793400\nvn 0.431000 -0.297100 -0.852000\nvn -0.431000 -0.297100 -0.852000\nvn 0.456700 -0.777700 -0.432000\nvn -0.456700 -0.777700 -0.432000\nvn 0.745000 -0.620600 -0.244700\nvn -0.745000 -0.620600 -0.244700\nvn 0.497200 -0.440800 -0.747300\nvn -0.497200 -0.440800 -0.747300\nvn 0.259100 0.456400 0.851200\nvn -0.259100 0.456400 0.851200\nvn 0.503300 0.047900 0.862800\nvn -0.410200 0.274800 0.869600\nvn 0.415300 0.123700 0.901200\nvn -0.415300 0.123700 0.901200\nvn 0.196600 -0.051000 0.979200\nvn -0.196600 -0.051000 0.979200\nvn 0.372000 0.212600 0.903500\nvn -0.372000 0.212600 0.903500\nvn 0.624700 -0.412100 0.663300\nvn -0.613200 -0.209000 0.761700\nvn 0.613800 0.409200 0.675200\nvn -0.328000 0.782100 0.529800\nvn -0.269300 0.831400 0.486000\nvn 0.264200 0.830300 0.490700\nvn -0.863900 0.259200 0.431900\nvn 0.863900 0.259200 0.431900\nvn -0.528000 -0.356800 0.770600\nvn 0.528000 -0.356800 0.770600\nvn 0.415600 -0.619600 0.665800\nvn -0.415600 -0.619600 0.665800\nvn 0.714300 -0.416700 0.562200\nvn -0.688400 -0.473200 0.549700\nvn 0.622100 -0.774500 -0.115100\nvn -0.622100 -0.774500 -0.115100\nvn -0.185000 0.249500 0.950600\nvn 0.185000 0.249500 0.950600\nvn 0.914200 -0.366400 -0.172900\nvn -0.887000 -0.383900 -0.256600\nvn -0.120400 0.240800 0.963100\nvn -0.371100 0.037100 0.927800\nvn 0.023400 0.994900 0.098100\nvn -0.137800 0.803800 0.578700\nvn 0.580200 0.197500 0.790100\nvn -0.580200 0.197500 0.790100\nvn 0.580200 0.193400 0.791200\nvn -0.102200 0.817600 0.566700\nvn 0.749700 -0.270700 0.603900\nvn -0.749700 -0.270700 0.603900\nvn 0.689500 -0.376100 0.619000\nvn -0.689500 -0.376100 0.619000\nvn 0.466800 -0.432900 0.771200\nvn -0.466800 -0.432900 0.771200\nvn 0.171200 -0.093400 0.980800\nvn -0.955100 -0.163600 -0.247000\nvn 0.912900 -0.365100 -0.182600\nvn -0.912900 -0.365100 -0.182600\nvn 0.997200 -0.018100 -0.072500\nvn -0.997200 -0.018100 -0.072500\nvn 0.676800 -0.728800 0.104100\nvn -0.772300 -0.573000 0.274100\nvn 0.775700 -0.617700 0.129300\nvn -0.775700 -0.617700 0.129300\nvn 0.702200 -0.702200 0.117000\nvn -0.702200 -0.702200 0.117000\nvn 0.122800 0.982000 -0.143200\nvn -0.122800 0.982000 -0.143200\nvn 0.937000 0.312300 0.156200\nvn -0.937000 0.312300 0.156200\nvn 0.624700 -0.780900 0.000000\nvn -0.109300 0.984000 0.140600\nvn -0.110400 0.993900 0.000000\nvn 0.586600 -0.752700 0.298900\nvn -0.661800 -0.649300 0.374600\nvn 0.252900 -0.908800 0.331900\nvn -0.296800 -0.871900 0.389600\nvn -0.822200 -0.562600 -0.086500\nvn 0.827100 -0.448400 -0.338800\nvn -0.847400 0.254200 -0.466100\nvn 0.847400 0.254200 -0.466100\nvn -0.635100 0.589700 -0.499000\nvn 0.635100 0.589700 -0.499000\nvn -0.172300 0.984700 -0.024600\nvn 0.172300 0.984700 -0.024600\nvn 0.149000 0.055900 0.987300\nvn -0.149000 0.055900 0.987300\nvn 0.312300 0.156200 0.937000\nvn -0.312300 0.156200 0.937000\nvn 0.236800 0.035500 0.970900\nvn -0.383000 0.011300 0.923700\nvn 0.155900 -0.034600 0.987200\nvn -0.155900 -0.034600 0.987200\nvn 0.308300 -0.181300 0.933900\nvn -0.328700 0.595800 0.732800\nvn 0.400800 -0.007200 0.916100\nvn -0.400800 -0.007200 0.916100\nvn 0.082900 -0.062200 0.994600\nvn -0.082900 -0.062200 0.994600\nvn 0.071100 -0.071100 0.994900\nvn -0.041100 0.164300 0.985600\nvn -0.404800 0.751800 0.520500\nvn 0.404800 0.751800 0.520500\nvn -0.538100 0.739900 0.403600\nvn -0.691400 -0.055900 0.720300\nvn 0.452600 -0.177600 0.873900\nvn -0.452600 -0.177600 0.873900\nvn 0.411100 -0.845600 0.340600\nvn -0.411100 -0.845600 0.340600\nvn 0.525100 0.196900 0.828000\nvn -0.525100 0.302300 0.795600\nvn 0.298000 0.580200 0.758000\nvn -0.298000 0.580200 0.758000\nvn 0.110500 -0.991600 -0.067800\nvn -0.073700 -0.992800 -0.094600\nvn 0.446100 -0.891000 -0.084900\nvn -0.585500 -0.790400 0.180200\nvn 0.924700 -0.253100 0.284500\nvn -0.924700 -0.253100 0.284500\nvn 0.848000 0.530000 0.010600\nvn -0.848000 0.530000 0.010600\nvn -0.298400 0.899700 -0.318500\nvn 0.298400 0.899700 -0.318500\nvn -0.543000 0.818900 -0.186100\nvn 0.543000 0.818900 -0.186100\nvn -0.548200 -0.003900 -0.836300\nvn 0.548200 -0.003900 -0.836300\nvn -0.113600 -0.054600 -0.992000\nvn 0.266700 0.006400 -0.963700\nvn 0.404600 0.026600 -0.914100\nvn -0.404600 0.026600 -0.914100\nvn -0.748400 0.662700 -0.027000\nvn 0.748400 0.662700 -0.027000\nvn 0.469200 -0.158500 -0.868700\nvn -0.816500 -0.408200 -0.408200\nvn -0.570200 -0.814600 -0.106500\nvn -0.007900 -0.915400 -0.402500\nvn 0.663000 -0.192900 0.723300\nvn -0.666000 -0.204900 0.717200\nvn 0.828500 -0.299000 0.473400\nvn -0.830100 -0.307100 0.465400\nvn 0.425100 -0.779300 0.460500\nvn -0.408100 -0.803800 0.432800\nvn 0.338500 -0.548600 0.764500\nvn -0.371400 -0.486600 0.790800\nvn -0.039300 -0.523700 0.851000\nvn 0.099200 -0.547200 0.831100\nvn -0.283700 -0.844300 0.454600\nvn 0.258900 -0.838800 0.478900\nvn -0.774300 -0.344700 0.530800\nvn 0.774300 -0.344700 0.530800\nvn -0.476700 -0.190700 0.858100\nvn 0.464900 -0.195800 0.863400\nvn -0.467200 0.169900 0.867700\nvn 0.482300 0.203100 0.852200\nvn -0.764000 0.327800 0.555700\nvn 0.764000 0.327800 0.555700\nvn -0.241300 0.814400 0.527800\nvn 0.241300 0.814400 0.527800\nvn -0.115500 0.577400 0.808300\nvn 0.115500 0.577400 0.808300\nvn 0.378300 0.513500 0.770200\nvn -0.378300 0.513500 0.770200\nvn 0.406900 0.778000 0.478700\nvn -0.406900 0.778000 0.478700\nvn 0.827200 0.292500 0.479800\nvn -0.827200 0.292500 0.479800\nvn 0.674800 0.209700 0.707600\nvn -0.674800 0.209700 0.707600\nvn 0.848000 0.318000 -0.424000\nvn -0.848000 0.318000 -0.424000\nvn 0.214300 0.826600 -0.520400\nvn -0.214300 0.826600 -0.520400\nvn -0.432000 0.750400 -0.500300\nvn 0.432000 0.750400 -0.500300\nvn -0.846200 0.352600 -0.399600\nvn 0.846200 0.352600 -0.399600\nvn -0.789500 -0.315800 -0.526300\nvn 0.832800 -0.378600 -0.403800\nvn -0.408200 -0.816500 -0.408200\nvn 0.432000 -0.750400 -0.500300\nvn 0.197700 -0.815600 -0.543700\nvn -0.214300 -0.826600 -0.520400\nvn 0.752200 -0.356300 -0.554300\nvn -0.840000 -0.343600 -0.420000\nvn 0.141400 -0.839500 0.524700\nvn -0.141400 -0.839500 0.524700\nvn 0.233600 -0.850200 0.471800\nvn -0.233600 -0.850200 0.471800\nvn 0.548600 -0.488800 0.678300\nvn -0.623000 -0.426300 0.655800\nvn 0.756100 -0.069600 0.650700\nvn -0.789800 -0.017300 0.613100\nvn 0.801500 0.121400 0.585600\nvn -0.752800 0.054400 0.656000\nvn 0.229900 -0.896000 0.379800\nvn -0.435900 -0.688300 0.579900\nvn 0.442100 -0.684800 0.579300\nvn -0.442100 -0.684800 0.579300\nvn 0.689100 -0.423900 0.587700\nvn -0.689800 -0.414600 0.593500\nvn 0.766800 -0.256900 0.588300\nvn -0.766800 -0.256900 0.588300\nvn 0.573800 -0.440100 0.690700\nvn -0.573800 -0.440100 0.690700\nvn 0.505100 0.650600 0.567000\nvn -0.505100 0.650600 0.567000\nvn 0.630400 0.520800 0.575600\nvn -0.581000 0.510600 0.633800\nvn -0.032800 0.655800 0.754200\nvn 0.032800 0.655800 0.754200\nvn -0.655200 0.326500 0.681300\nvn 0.655200 0.326500 0.681300\nvn -0.567700 0.555900 0.607200\nvn 0.567700 0.555900 0.607200\nvn 0.648400 -0.378700 0.660500\nvn -0.648400 -0.378700 0.660500\nvn 0.218100 -0.471000 0.854800\nvn -0.222400 -0.467700 0.855500\nvn 0.009900 -0.495400 0.868600\nvn -0.009900 -0.495400 0.868600\nvn 0.046200 -0.582800 0.811300\nvn -0.046200 -0.582800 0.811300\nvn -0.426300 -0.377500 0.822100\nvn 0.426300 -0.377500 0.822100\nvn -0.086100 0.012300 0.996200\nvn 0.086100 0.012300 0.996200\nvn 0.437400 -0.306200 0.845600\nvn -0.437400 -0.306200 0.845600\nvn 0.331100 -0.215200 0.918700\nvn -0.331100 -0.215200 0.918700\nvn 0.000000 -0.447200 0.894400\nvn 0.386900 0.171400 0.906000\nvn 0.292200 0.282900 0.913600\nvn 0.334600 -0.185500 0.923900\nvn -0.334600 -0.185500 0.923900\nvn 0.386300 -0.044600 0.921300\nvn -0.054700 -0.361900 0.930600\nvn 0.057100 -0.231200 0.971200\nvn -0.057100 -0.231200 0.971200\nvn 0.020400 -0.783700 0.620800\nvn -0.097700 -0.647700 0.755600\nvn 0.207400 -0.518500 0.829600\nvn -0.147000 -0.661700 0.735200\nvn 0.175500 -0.363500 0.914900\nvn -0.175500 -0.363500 0.914900\nvn 0.281900 -0.044400 0.958400\nvn -0.332000 -0.007300 0.943200\nvn 0.359500 -0.089900 0.928800\nvn -0.314000 -0.145800 0.938200\nvn 0.000000 0.049900 0.998800\nvn -0.004400 -0.066500 0.997800\nvn 0.004400 -0.066500 0.997800\nvn 0.847300 -0.511900 -0.141200\nvn -0.744100 -0.658200 0.114500\nvn 0.925600 0.249200 -0.284800\nvn -0.963500 0.214100 -0.160600\nvn 0.070900 0.921200 -0.382600\nvn -0.070900 0.921200 -0.382600\nvn -0.723000 0.097700 0.683900\nvn 0.723000 0.097700 0.683900\nvn 0.440200 -0.880500 0.176100\nvn -0.440200 -0.880500 0.176100\nvn 0.287400 -0.574700 0.766300\nvn -0.287400 -0.574700 0.766300\nvn -0.781400 0.558100 0.279100\nvn 0.520700 0.615400 0.591700\nvn 0.089700 0.807400 0.583100\nvn -0.127000 0.762000 0.635000\nvn 0.766300 0.287300 0.574700\nvn -0.766300 0.287300 0.574700\nvn 0.604600 -0.654900 0.453400\nvn 0.040400 0.242300 0.969400\nvn -0.040400 0.242300 0.969400\nvn -0.056300 -0.262700 0.963200\nvn -0.428600 -0.857100 0.285700\nvn 0.006400 0.083000 0.996500\nvn 0.781800 -0.366200 0.504700\nvn -0.872900 -0.218200 0.436400\nvn -0.581900 -0.363700 0.727400\nvn 0.729400 0.162100 0.664600\nvn -0.729400 0.162100 0.664600\nvn 0.332800 0.078300 0.939700\nvn -0.332800 0.078300 0.939700\nvn 0.791600 0.186200 0.582000\nvn -0.791600 0.186200 0.582000\nvn 0.877300 0.194900 0.438600\nvn -0.877300 0.194900 0.438600\nvn 0.893200 0.430200 0.131200\nvn -0.910200 -0.044600 0.411800\nvn 0.033600 -0.336100 0.941200\nvn -0.033600 -0.336100 0.941200\nvn -0.135300 -0.203000 0.969800\nvn 0.192500 -0.192500 0.962300\nvn -0.356900 0.107100 0.928000\nvn 0.188100 -0.282200 0.940700\nvn -0.124000 0.000000 0.992300\nvn 0.065500 0.393100 0.917200\nvn -0.739600 0.647200 0.184900\nvn 0.646200 0.758500 0.084300\nvn 0.016000 -0.287300 0.957700\nvn -0.052600 -0.315800 0.947400\nvn -0.448100 -0.293000 0.844600\nvn 0.599000 -0.245000 0.762300\nvn -0.286900 -0.103300 0.952400\nvn 0.521400 0.052100 0.851700\nvn -0.123900 0.049600 0.991100\nvn 0.123900 0.049600 0.991100\nvn -0.548800 -0.329300 0.768300\nvn 0.548800 -0.329300 0.768300\nvn -0.265500 -0.829600 0.491100\nvn 0.418600 -0.581400 0.697700\nvn -0.397200 -0.635600 0.662000\nvn 0.591400 -0.511500 0.623400\nvn -0.516800 -0.214500 0.828800\nvn 0.544000 -0.077700 0.835500\nvn -0.588200 -0.115700 0.800400\nvn 0.567200 0.110700 0.816100\nvn -0.567200 0.110700 0.816100\nvn 0.528100 0.215100 0.821500\nvn -0.528100 0.215100 0.821500\nvn 0.406300 0.715100 0.568800\nvn 0.061300 0.306400 0.949900\nvn 0.152400 0.335300 0.929700\nvn -0.177200 0.389800 0.903700\nvn -0.021900 0.306300 0.951700\nvn 0.012900 0.181100 0.983400\nvn 0.082900 -0.290200 0.953400\nvn -0.082900 -0.290200 0.953400\nvn 0.266700 -0.304800 0.914300\nvn -0.296300 -0.211700 0.931300\nvn -0.182600 -0.912900 0.365100\nvn 0.182600 -0.912900 0.365100\nvn 0.045500 -0.750400 0.659400\nvn -0.045500 -0.750400 0.659400\nvn -0.381000 -0.254000 0.889000\nvn 0.320700 -0.267300 0.908700\nvn -0.230400 0.025600 0.972800\nvn 0.230400 0.025600 0.972800\nvn -0.221600 0.569800 0.791400\nvn 0.053200 0.359400 0.931700\nvn 0.025200 0.554500 0.831800\nvn -0.025200 0.554500 0.831800\nvn 0.350200 0.654700 0.669900\nvn -0.350200 0.654700 0.669900\nvn 0.601400 -0.240600 0.761800\nvn -0.738200 -0.461400 0.492100\nvn 0.829200 -0.082900 0.552800\nvn -0.806100 -0.065400 0.588200\nvn 0.780000 0.118200 0.614500\nvn -0.790300 0.112900 0.602200\nvn -0.694700 0.709500 -0.118200\nvn 0.404300 0.855000 -0.324800\nvn -0.855200 0.366500 -0.366500\nvn 0.846500 0.372800 -0.380100\nvn -0.215600 0.888400 -0.405400\nvn 0.215600 0.888400 -0.405400\nvn 0.587900 0.747800 -0.308600\nvn -0.587900 0.747800 -0.308600\nvn 0.350200 0.876600 -0.330000\nvn -0.350200 0.876600 -0.330000\nvn 0.278900 0.918100 -0.281700\nvn -0.285900 0.911600 -0.295400\nvn 0.898100 0.067300 -0.434500\nvn -0.898100 0.067300 -0.434500\nvn 0.452700 -0.728600 -0.514000\nvn -0.595500 -0.712300 -0.371500\nvn 0.440800 -0.819500 -0.366300\nvn -0.249000 -0.774800 -0.581100\nvn 0.368300 -0.678000 -0.636100\nvn -0.368300 -0.678000 -0.636100\nvn 0.171800 -0.022900 -0.984900\nvn -0.171800 -0.022900 -0.984900\nvn -0.065000 -0.357500 -0.931700\nvn 0.065000 -0.357500 -0.931700\nvn 0.058500 -0.977400 -0.203300\nvn -0.177700 -0.981900 -0.065500\nvn 0.101600 -0.965100 -0.241300\nvn -0.134100 -0.968100 -0.211500\nvn 0.608200 -0.331400 -0.721300\nvn -0.980200 0.192200 0.048000\nvn 0.920800 0.146000 -0.361700\nvn -0.944100 0.184900 -0.273000\nvn 0.087900 0.053100 -0.994700\nvn -0.247500 -0.016900 -0.968700\nvn 0.199200 -0.322200 -0.925500\nvn -0.199200 -0.322200 -0.925500\nvn 0.870300 -0.477800 -0.119500\nvn -0.870300 -0.477800 -0.119500\nvn 0.920400 0.139500 -0.365200\nvn -0.918400 0.135800 -0.371500\nvn 0.924600 0.346700 -0.157600\nvn -0.924600 0.346700 -0.157600\nvn 0.907900 0.373400 -0.190400\nvn -0.907900 0.373400 -0.190400\nvn 0.991800 0.124000 0.031000\nvn -0.991800 0.124000 0.031000\nvn 0.079700 -0.797500 -0.598100\nvn -0.079700 -0.797500 -0.598100\nvn 0.373100 -0.470400 -0.799700\nvn -0.373100 -0.470400 -0.799700\nvn 0.330900 -0.814400 -0.476700\nvn -0.330900 -0.814400 -0.476700\nvn 0.266000 -0.954000 -0.138300\nvn -0.303100 -0.946400 -0.111500\nvn 0.284200 -0.930100 -0.232500\nvn -0.348700 -0.930000 -0.116200\nvn 0.957000 0.257400 -0.134100\nvn -0.957000 0.257400 -0.134100\nvn 0.691600 -0.722200 0.010200\nvn -0.861500 -0.337900 0.378900\nvn 0.436800 -0.042800 -0.898500\nvn -0.436800 -0.042800 -0.898500\nvn 0.112900 0.967500 0.226400\nvn -0.112900 0.967500 0.226400\nvn 0.120900 0.976400 -0.179000\nvn -0.137300 0.971300 -0.194300\nvn 0.300000 0.640900 -0.706600\nvn -0.387600 0.555500 -0.735700\nvn 0.352200 0.932700 -0.078300\nvn -0.566000 0.760500 -0.318300\nvn -0.094400 0.670100 0.736200\nvn -0.343200 0.696400 0.630300\nvn 0.625500 0.766900 0.143800\nvn -0.583800 0.792000 0.178800\nvn 0.690100 0.696700 -0.195900\nvn -0.715900 0.664500 -0.214300\nvn 0.590500 0.174500 -0.788000\nvn -0.590500 0.174500 -0.788000\nvn 0.714500 0.426500 -0.554600\nvn -0.058000 0.367400 -0.928200\nvn 0.675100 0.723400 -0.144700\nvn -0.595900 0.773100 -0.217400\nvn 0.738100 0.653600 0.167600\nvn -0.690500 0.710900 0.133300\nvn 0.776600 0.335800 0.533000\nvn -0.677200 0.482400 0.555600\nvn 0.158000 0.950600 -0.267300\nvn -0.158000 0.950600 -0.267300\nvn 0.157000 0.642700 0.749800\nvn -0.157000 0.642700 0.749800\nvn -0.170200 0.109700 -0.979300\nvn 0.178200 0.089100 -0.980000\nvn 0.041900 0.373000 0.926900\nvn -0.023300 0.968800 -0.246600\nvn 0.498000 0.820600 -0.280200\nvn -0.498000 0.820600 -0.280200\nvn 0.933400 0.235400 0.271000\nvn -0.945600 0.013300 0.325100\nvn 0.901900 0.379300 -0.206500\nvn -0.997000 0.075800 0.017100\nvn 0.961700 0.146800 -0.231500\nvn -0.961700 0.146800 -0.231500\nvn 0.746000 -0.659600 0.091700\nvn -0.746000 -0.659600 0.091700\nvn 0.371900 -0.924400 0.085000\nvn -0.371900 -0.924400 0.085000\nvn 0.548000 -0.774000 0.317300\nvn -0.387700 -0.903500 0.182600\nvn 0.499300 -0.851700 0.159000\nvn -0.848900 -0.221500 0.479800\nvn 0.570600 -0.344300 -0.745600\nvn -0.570600 -0.344300 -0.745600\nvn 0.562900 -0.263700 -0.783300\nvn -0.562900 -0.263700 -0.783300\nvn 0.105900 -0.916500 -0.385700\nvn -0.105900 -0.916500 -0.385700\nvn 0.697600 -0.647000 -0.307700\nvn -0.697600 -0.647000 -0.307700\nvn 0.480800 0.254500 0.839100\nvn -0.480800 0.254500 0.839100\nvn 0.410200 0.274800 0.869600\nvn -0.503300 0.047900 0.862800\nvn 0.145900 0.091200 0.985100\nvn -0.145900 0.091200 0.985100\nvn 0.283500 -0.103100 0.953400\nvn -0.283500 -0.103100 0.953400\nvn 0.505800 -0.246700 0.826600\nvn -0.505800 -0.246700 0.826600\nvn 0.613200 -0.209000 0.761700\nvn -0.624700 -0.412100 0.663300\nvn 0.328000 0.782100 0.529800\nvn -0.613800 0.409200 0.675200\nvn -0.264200 0.830300 0.490700\nvn 0.269300 0.831400 0.486000\nvn -0.800000 0.207400 0.563000\nvn 0.800000 0.207400 0.563000\nvn -0.522500 -0.356500 0.774500\nvn 0.522500 -0.356500 0.774500\nvn 0.486200 -0.519000 0.703000\nvn -0.486200 -0.519000 0.703000\nvn 0.688400 -0.473200 0.549700\nvn -0.714300 -0.416700 0.562200\nvn 0.997000 -0.037800 -0.068000\nvn -0.997000 -0.037800 -0.068000\nvn -0.197100 0.314000 0.928700\nvn 0.197100 0.314000 0.928700\nvn 0.887000 -0.383900 -0.256600\nvn -0.914200 -0.366400 -0.172900\nvn 0.371100 0.037100 0.927800\nvn 0.120400 0.240800 0.963100\nvn 0.137800 0.803800 0.578700\nvn -0.023400 0.994900 0.098100\nvn 0.606800 -0.606800 0.513400\nvn -0.606800 -0.606800 0.513400\nvn 0.102200 0.817600 0.566700\nvn -0.580200 0.193400 0.791200\nvn 0.701300 -0.701300 -0.127500\nvn -0.701300 -0.701300 -0.127500\nvn 0.458000 -0.441900 0.771300\nvn -0.458000 -0.441900 0.771300\nvn 0.715500 -0.415500 0.561600\nvn -0.715500 -0.415500 0.561600\nvn 0.955100 -0.163600 -0.247000\nvn -0.171200 -0.093400 0.980800\nvn 0.900500 -0.433600 -0.033400\nvn -0.900500 -0.433600 -0.033400\nvn 0.772300 -0.573000 0.274100\nvn -0.676800 -0.728800 0.104100\nvn 0.797100 -0.597800 0.085400\nvn -0.797100 -0.597800 0.085400\nvn 0.242300 0.969400 0.040400\nvn -0.242300 0.969400 0.040400\nvn 0.931900 0.349500 0.097100\nvn -0.931900 0.349500 0.097100\nvn -0.624700 -0.780900 0.000000\nvn 0.110400 0.993900 0.000000\nvn 0.109300 0.984000 0.140600\nvn 0.661800 -0.649300 0.374600\nvn -0.586600 -0.752700 0.298900\nvn 0.296800 -0.871900 0.389600\nvn -0.252900 -0.908800 0.331900\nvn -0.827100 -0.448400 -0.338800\nvn 0.822200 -0.562600 -0.086500\nvn -0.816900 0.218400 -0.533800\nvn 0.816900 0.218400 -0.533800\nvn -0.483400 0.872700 -0.069100\nvn 0.483400 0.872700 -0.069100\nvn 0.040400 0.989100 0.141300\nvn -0.040400 0.989100 0.141300\nvn 0.137500 -0.027500 0.990100\nvn -0.137500 -0.027500 0.990100\nvn 0.340000 -0.030000 0.940000\nvn -0.340000 -0.030000 0.940000\nvn 0.383000 0.011300 0.923700\nvn -0.236800 0.035500 0.970900\nvn 0.180500 0.067700 0.981300\nvn -0.180500 0.067700 0.981300\nvn 0.328700 0.595800 0.732800\nvn -0.308300 -0.181300 0.933900\nvn 0.400000 -0.065300 0.914200\nvn -0.400000 -0.065300 0.914200\nvn 0.361800 -0.058200 0.930400\nvn -0.361800 -0.058200 0.930400\nvn 0.041100 0.164300 0.985600\nvn -0.071100 -0.071100 0.994900\nvn 0.421600 -0.527000 0.737900\nvn -0.421600 -0.527000 0.737900\nvn 0.691400 -0.055900 0.720300\nvn 0.538100 0.739900 0.403600\nvn 0.443700 -0.214300 0.870200\nvn -0.443700 -0.214300 0.870200\nvn 0.493200 -0.104800 0.863600\nvn -0.493200 -0.104800 0.863600\nvn 0.525100 0.302300 0.795600\nvn -0.525100 0.196900 0.828000\nvn 0.073700 -0.992800 -0.094600\nvn -0.110500 -0.991600 -0.067800\nvn 0.585500 -0.790400 0.180200\nvn -0.446100 -0.891000 -0.084900\nvn 0.934100 -0.244500 0.260200\nvn -0.934100 -0.244500 0.260200\nvn 0.832800 0.549400 -0.067600\nvn -0.832800 0.549400 -0.067600\nvn -0.192000 0.957000 -0.217500\nvn 0.192000 0.957000 -0.217500\nvn -0.355400 0.931900 -0.072300\nvn 0.355400 0.931900 -0.072300\nvn -0.521500 -0.019700 -0.853000\nvn 0.521500 -0.019700 -0.853000\nvn -0.266700 0.006400 -0.963700\nvn 0.113600 -0.054600 -0.992000\nvn -0.821900 0.563500 0.084100\nvn 0.821900 0.563500 0.084100\nvn 0.816500 -0.408200 -0.408200\nvn -0.469200 -0.158500 -0.868700\nvn 0.007900 -0.915400 -0.402500\nvn 0.570200 -0.814600 -0.106500\ns off\nf 1//1 3//1 45//1\nf 2//2 48//2 46//2\nf 3//3 5//3 43//3\nf 4//4 46//4 44//4\nf 9//5 7//5 5//5\nf 10//6 4//6 6//6\nf 11//7 9//7 3//7\nf 12//8 2//8 4//8\nf 13//9 15//9 9//9\nf 14//10 12//10 10//10\nf 15//11 17//11 7//11\nf 16//12 10//12 8//12\nf 15//13 21//13 19//13\nf 20//14 22//14 16//14\nf 23//15 21//15 15//15\nf 24//16 14//16 16//16\nf 25//17 27//17 21//17\nf 26//18 24//18 22//18\nf 21//19 27//19 29//19\nf 30//20 28//20 22//20\nf 27//21 33//21 31//21\nf 32//22 34//22 28//22\nf 25//23 35//23 33//23\nf 34//24 36//24 26//24\nf 35//25 37//25 39//25\nf 40//26 38//26 36//26\nf 33//27 39//27 41//27\nf 42//28 40//28 34//28\nf 39//29 45//29 43//29\nf 44//30 46//30 40//30\nf 37//31 47//31 45//31\nf 46//32 48//32 38//32\nf 47//33 37//33 51//33\nf 52//34 38//34 48//34\nf 37//35 35//35 53//35\nf 54//36 36//36 38//36\nf 35//37 25//37 55//37\nf 56//38 26//38 36//38\nf 25//39 23//39 57//39\nf 58//40 24//40 26//40\nf 13//41 59//41 57//41\nf 14//42 24//42 58//42\nf 11//43 63//43 59//43\nf 12//44 14//44 60//44\nf 1//45 65//45 63//45\nf 2//46 12//46 64//46\nf 47//47 49//47 65//47\nf 48//48 2//48 66//48\nf 61//49 65//49 49//49\nf 50//50 66//50 62//50\nf 63//51 65//51 61//51\nf 62//52 66//52 64//52\nf 61//53 59//53 63//53\nf 64//54 60//54 62//54\nf 61//55 57//55 59//55\nf 60//56 58//56 62//56\nf 61//57 55//57 57//57\nf 58//58 56//58 62//58\nf 61//59 53//59 55//59\nf 56//60 54//60 62//60\nf 61//61 51//61 53//61\nf 54//62 52//62 62//62\nf 61//63 49//63 51//63\nf 52//64 50//64 62//64\nf 89//65 174//65 176//65\nf 176//66 175//66 90//66\nf 87//67 172//67 174//67\nf 175//68 173//68 88//68\nf 170//69 172//69 87//69\nf 171//70 86//70 88//70\nf 168//71 170//71 85//71\nf 169//72 84//72 86//72\nf 166//73 168//73 83//73\nf 167//74 82//74 84//74\nf 92//75 146//75 164//75\nf 93//76 80//76 165//76\nf 92//77 94//77 148//77\nf 149//78 95//78 93//78\nf 96//79 150//79 148//79\nf 97//80 95//80 149//80\nf 96//81 98//81 152//81\nf 153//82 99//82 97//82\nf 98//83 100//83 154//83\nf 155//84 101//84 99//84\nf 100//85 102//85 156//85\nf 157//86 103//86 101//86\nf 104//87 158//87 156//87\nf 105//88 103//88 157//88\nf 104//89 106//89 160//89\nf 161//90 107//90 105//90\nf 106//91 108//91 162//91\nf 163//92 109//92 107//92\nf 108//93 67//93 68//93\nf 68//94 67//94 109//94\nf 110//95 128//95 160//95\nf 161//96 129//96 111//96\nf 179//97 158//97 160//97\nf 180//98 129//98 161//98\nf 126//99 156//99 158//99\nf 159//100 157//100 127//100\nf 124//101 154//101 156//101\nf 157//102 155//102 125//102\nf 122//103 152//103 154//103\nf 155//104 153//104 123//104\nf 120//105 150//105 152//105\nf 153//106 151//106 121//106\nf 118//107 148//107 150//107\nf 151//108 149//108 119//108\nf 116//109 146//109 148//109\nf 149//110 147//110 117//110\nf 114//111 164//111 146//111\nf 147//112 165//112 115//112\nf 181//113 177//113 164//113\nf 182//114 115//114 165//114\nf 110//115 162//115 68//115\nf 68//116 163//116 111//116\nf 68//117 178//117 183//117\nf 68//118 113//118 184//118\nf 177//119 181//119 183//119\nf 184//120 182//120 177//120\nf 137//121 176//121 174//121\nf 137//122 136//122 175//122\nf 135//123 174//123 172//123\nf 136//124 134//124 173//124\nf 131//125 133//125 172//125\nf 173//126 134//126 132//126\nf 187//127 185//127 168//127\nf 188//128 167//128 169//128\nf 170//129 168//129 185//129\nf 171//130 132//130 186//130\nf 144//131 190//131 189//131\nf 189//132 190//132 145//132\nf 185//133 187//133 189//133\nf 189//133 188//133 186//133\nf 130//134 131//134 185//134\nf 186//134 132//134 130//134\nf 193//135 191//135 144//135\nf 194//136 143//136 145//136\nf 195//137 193//137 142//137\nf 196//138 141//138 143//138\nf 139//139 197//139 195//139\nf 196//140 198//140 139//140\nf 138//141 71//141 197//141\nf 198//142 71//142 138//142\nf 190//143 144//143 191//143\nf 192//144 145//144 190//144\nf 70//145 191//145 206//145\nf 207//146 192//146 70//146\nf 199//147 200//147 197//147\nf 199//148 71//148 198//148\nf 200//149 202//149 195//149\nf 201//150 198//150 196//150\nf 195//151 202//151 204//151\nf 205//152 203//152 196//152\nf 204//153 206//153 191//153\nf 205//154 194//154 192//154\nf 199//155 204//155 202//155\nf 203//156 205//156 199//156\nf 208//157 206//157 204//157\nf 208//158 199//158 205//158\nf 140//159 164//159 177//159\nf 141//160 139//160 177//160\nf 142//161 211//161 164//161\nf 143//162 141//162 165//162\nf 142//163 144//163 213//163\nf 214//164 145//164 143//164\nf 144//165 187//165 166//165\nf 167//166 188//166 145//166\nf 81//167 209//167 213//167\nf 214//168 210//168 82//168\nf 209//169 215//169 211//169\nf 212//170 216//170 210//170\nf 164//171 211//171 215//171\nf 165//172 80//172 216//172\nf 131//173 130//173 72//173\nf 72//174 130//174 132//174\nf 131//175 222//175 220//175\nf 132//176 134//176 221//176\nf 133//177 220//177 218//177\nf 134//178 136//178 219//178\nf 135//179 218//179 217//179\nf 136//180 137//180 217//180\nf 217//181 218//181 229//181\nf 230//182 219//182 217//182\nf 220//183 227//183 229//183\nf 221//184 219//184 230//184\nf 222//185 225//185 227//185\nf 223//186 221//186 228//186\nf 222//187 72//187 224//187\nf 224//188 72//188 223//188\nf 231//189 229//189 225//189\nf 231//190 224//190 226//190\nf 225//191 229//191 227//191\nf 228//192 230//192 226//192\nf 181//193 234//193 232//193\nf 182//194 184//194 233//194\nf 183//195 232//195 254//195\nf 184//196 113//196 255//196\nf 110//197 112//197 254//197\nf 255//198 113//198 111//198\nf 181//199 114//199 252//199\nf 253//200 115//200 182//200\nf 116//201 250//201 252//201\nf 117//202 115//202 253//202\nf 118//203 248//203 250//203\nf 119//204 117//204 251//204\nf 120//205 246//205 248//205\nf 121//206 119//206 249//206\nf 122//207 244//207 246//207\nf 123//208 121//208 247//208\nf 122//209 124//209 242//209\nf 243//210 125//210 123//210\nf 124//211 126//211 240//211\nf 241//212 127//212 125//212\nf 179//213 236//213 240//213\nf 180//214 127//214 241//214\nf 128//215 238//215 236//215\nf 129//216 180//216 237//216\nf 110//217 256//217 238//217\nf 111//218 129//218 239//218\nf 238//219 256//219 258//219\nf 259//220 257//220 239//220\nf 238//221 276//221 278//221\nf 239//222 237//222 279//222\nf 240//223 236//223 278//223\nf 279//224 237//224 241//224\nf 242//225 240//225 274//225\nf 275//226 241//226 243//226\nf 242//227 272//227 270//227\nf 243//228 245//228 271//228\nf 246//229 244//229 270//229\nf 271//230 245//230 247//230\nf 246//231 268//231 266//231\nf 247//232 249//232 267//232\nf 250//233 248//233 266//233\nf 267//234 249//234 251//234\nf 252//235 250//235 264//235\nf 265//236 251//236 253//236\nf 252//237 262//237 280//237\nf 253//238 235//238 281//238\nf 254//239 260//239 258//239\nf 255//240 257//240 259//240\nf 232//241 282//241 260//241\nf 233//242 255//242 261//242\nf 234//243 280//243 282//243\nf 235//244 233//244 283//244\nf 108//245 284//245 73//245\nf 109//246 67//246 73//246\nf 106//247 286//247 284//247\nf 107//248 109//248 285//248\nf 106//249 104//249 288//249\nf 289//250 105//250 107//250\nf 104//251 102//251 290//251\nf 291//252 103//252 105//252\nf 102//253 100//253 292//253\nf 293//254 101//254 103//254\nf 98//255 294//255 292//255\nf 99//256 101//256 293//256\nf 98//257 96//257 296//257\nf 297//258 97//258 99//258\nf 94//259 298//259 296//259\nf 95//260 97//260 297//260\nf 92//261 300//261 298//261\nf 93//262 95//262 299//262\nf 308//263 309//263 328//263\nf 329//264 309//264 308//264\nf 307//265 308//265 338//265\nf 339//266 308//266 307//266\nf 306//267 307//267 336//267\nf 337//268 307//268 306//268\nf 91//269 306//269 340//269\nf 91//270 90//270 341//270\nf 89//271 340//271 334//271\nf 90//272 88//272 335//272\nf 87//273 334//273 330//273\nf 88//274 86//274 331//274\nf 85//275 330//275 332//275\nf 86//276 84//276 333//276\nf 336//277 338//277 332//277\nf 337//278 331//278 333//278\nf 330//279 334//279 340//279\nf 341//280 335//280 331//280\nf 326//281 332//281 338//281\nf 339//282 333//282 327//282\nf 83//283 332//283 326//283\nf 84//284 82//284 327//284\nf 209//285 342//285 344//285\nf 345//286 343//286 210//286\nf 81//287 326//287 342//287\nf 343//288 327//288 82//288\nf 79//289 215//289 344//289\nf 345//290 216//290 80//290\nf 79//291 346//291 300//291\nf 301//292 347//292 80//292\nf 77//293 324//293 352//293\nf 353//294 325//294 77//294\nf 304//295 352//295 350//295\nf 351//296 353//296 304//296\nf 350//297 348//297 305//297\nf 351//298 78//298 305//298\nf 348//299 328//299 309//299\nf 349//300 305//300 309//300\nf 326//301 328//301 348//301\nf 349//302 329//302 327//302\nf 298//303 318//303 310//303\nf 299//304 297//304 311//304\nf 76//305 316//305 324//305\nf 325//306 317//306 76//306\nf 302//307 358//307 356//307\nf 357//308 359//308 302//308\nf 356//309 354//309 75//309\nf 357//310 303//310 75//310\nf 354//311 316//311 76//311\nf 355//312 75//312 76//312\nf 294//313 362//313 364//313\nf 295//314 293//314 365//314\nf 362//315 368//315 366//315\nf 363//316 365//316 367//316\nf 368//317 370//317 372//317\nf 369//318 367//318 373//318\nf 370//319 376//319 374//319\nf 371//320 373//320 375//320\nf 314//321 378//321 374//321\nf 375//322 379//322 315//322\nf 354//323 374//323 378//323\nf 355//324 317//324 379//324\nf 356//325 372//325 374//325\nf 357//326 355//326 375//326\nf 358//327 366//327 372//327\nf 359//328 357//328 373//328\nf 360//329 364//329 366//329\nf 361//330 359//330 367//330\nf 290//331 292//331 364//331\nf 365//332 293//332 291//332\nf 74//333 360//333 358//333\nf 359//334 361//334 74//334\nf 286//335 288//335 290//335\nf 287//336 285//336 291//336\nf 290//337 360//337 74//337\nf 291//338 285//338 74//338\nf 73//339 284//339 74//339\nf 74//340 285//340 73//340\nf 294//341 296//341 310//341\nf 311//342 297//342 295//342\nf 312//343 368//343 362//343\nf 313//344 311//344 363//344\nf 382//345 370//345 368//345\nf 383//346 313//346 369//346\nf 314//347 376//347 370//347\nf 371//348 377//348 315//348\nf 348//349 350//349 386//349\nf 387//350 351//350 349//350\nf 318//351 384//351 386//351\nf 387//352 385//352 319//352\nf 300//353 384//353 318//353\nf 301//354 299//354 319//354\nf 344//355 342//355 384//355\nf 345//356 301//356 385//356\nf 342//357 348//357 384//357\nf 385//358 349//358 343//358\nf 300//359 346//359 344//359\nf 345//360 347//360 301//360\nf 314//361 322//361 380//361\nf 381//362 323//362 315//362\nf 316//363 378//363 380//363\nf 381//364 379//364 317//364\nf 320//365 386//365 380//365\nf 381//366 387//366 321//366\nf 350//367 352//367 380//367\nf 381//368 353//368 351//368\nf 324//369 380//369 352//369\nf 353//370 381//370 325//370\nf 400//371 388//371 414//371\nf 415//372 389//372 401//372\nf 402//373 404//373 398//373\nf 403//374 401//374 399//374\nf 398//375 404//375 406//375\nf 407//376 405//376 399//376\nf 396//377 406//377 408//377\nf 409//378 407//378 397//378\nf 394//379 408//379 410//379\nf 411//380 409//380 395//380\nf 410//381 412//381 390//381\nf 411//382 393//382 391//382\nf 420//383 418//383 412//383\nf 421//384 411//384 413//384\nf 422//385 420//385 410//385\nf 423//386 409//386 411//386\nf 406//387 424//387 422//387\nf 423//388 425//388 407//388\nf 404//389 426//389 424//389\nf 425//390 427//390 405//390\nf 402//391 428//391 426//391\nf 427//392 429//392 403//392\nf 414//393 416//393 428//393\nf 415//394 403//394 429//394\nf 318//395 320//395 444//395\nf 445//396 321//396 319//396\nf 320//397 390//397 412//397\nf 413//398 391//398 321//398\nf 318//399 442//399 312//399\nf 319//400 311//400 313//400\nf 430//401 414//401 388//401\nf 431//402 383//402 389//402\nf 418//403 440//403 444//403\nf 419//404 413//404 445//404\nf 438//405 446//405 444//405\nf 445//406 447//406 439//406\nf 446//407 438//407 436//407\nf 447//408 435//408 437//408\nf 432//409 448//409 446//409\nf 447//410 449//410 433//410\nf 430//411 448//411 432//411\nf 433//412 449//412 431//412\nf 414//413 430//413 450//413\nf 451//414 431//414 415//414\nf 448//415 430//415 382//415\nf 449//416 313//416 383//416\nf 312//417 442//417 446//417\nf 447//418 443//418 313//418\nf 442//419 444//419 446//419\nf 447//420 445//420 443//420\nf 450//421 452//421 476//421\nf 451//422 417//422 477//422\nf 450//423 432//423 462//423\nf 463//424 433//424 451//424\nf 434//425 460//425 462//425\nf 435//426 433//426 463//426\nf 434//427 436//427 458//427\nf 459//428 437//428 435//428\nf 436//429 438//429 456//429\nf 457//430 439//430 437//430\nf 440//431 454//431 456//431\nf 441//426 439//426 457//426\nf 418//432 474//432 454//432\nf 419//433 441//433 455//433\nf 416//434 476//434 464//434\nf 417//435 429//435 465//435\nf 428//436 464//436 466//436\nf 429//437 427//437 467//437\nf 426//438 466//438 468//438\nf 427//439 425//439 469//439\nf 422//440 424//440 468//440\nf 469//441 425//441 423//441\nf 420//442 422//442 470//442\nf 471//443 423//443 421//443\nf 418//444 420//444 472//444\nf 473//445 421//445 419//445\nf 458//446 456//446 480//446\nf 481//447 457//447 459//447\nf 478//448 480//448 482//448\nf 483//449 481//449 479//449\nf 482//450 488//450 486//450\nf 483//451 485//451 487//451\nf 486//452 488//452 490//452\nf 491//453 489//453 487//453\nf 476//454 486//454 492//454\nf 477//455 465//455 493//455\nf 452//456 484//456 486//456\nf 487//457 485//457 453//457\nf 452//458 462//458 478//458\nf 479//459 463//459 453//459\nf 478//460 462//460 460//460\nf 479//461 459//461 461//461\nf 454//462 474//462 480//462\nf 481//463 475//463 455//463\nf 482//464 480//464 474//464\nf 483//465 473//465 475//465\nf 470//466 488//466 482//466\nf 483//467 489//467 471//467\nf 468//468 490//468 488//468\nf 489//469 491//469 469//469\nf 492//470 490//470 468//470\nf 493//471 467//471 469//471\nf 464//472 492//472 466//472\nf 467//473 493//473 465//473\nf 390//474 504//474 502//474\nf 391//475 393//475 503//475\nf 392//476 502//476 500//476\nf 393//477 395//477 501//477\nf 396//478 394//478 500//478\nf 501//479 395//479 397//479\nf 398//480 396//480 498//480\nf 499//481 397//481 399//481\nf 400//482 398//482 496//482\nf 497//483 399//483 401//483\nf 388//484 400//484 494//484\nf 495//485 401//485 389//485\nf 494//486 502//486 504//486\nf 505//487 503//487 495//487\nf 496//488 500//488 502//488\nf 497//489 495//489 503//489\nf 496//490 498//490 500//490\nf 501//491 499//491 497//491\nf 314//492 382//492 388//492\nf 389//493 383//493 315//493\nf 506//494 504//494 322//494\nf 507//495 315//495 323//495\nf 322//496 504//496 390//496\nf 323//497 321//497 391//497\nf 47//498 1//498 45//498\nf 4//499 2//499 46//499\nf 45//500 3//500 43//500\nf 6//501 4//501 44//501\nf 3//502 9//502 5//502\nf 8//503 10//503 6//503\nf 1//504 11//504 3//504\nf 10//505 12//505 4//505\nf 11//506 13//506 9//506\nf 16//507 14//507 10//507\nf 9//508 15//508 7//508\nf 18//509 16//509 8//509\nf 17//510 15//510 19//510\nf 18//511 20//511 16//511\nf 13//512 23//512 15//512\nf 22//513 24//513 16//513\nf 23//514 25//514 21//514\nf 28//515 26//515 22//515\nf 19//516 21//516 29//516\nf 20//517 30//517 22//517\nf 29//518 27//518 31//518\nf 30//519 32//519 28//519\nf 27//520 25//520 33//520\nf 28//521 34//521 26//521\nf 33//522 35//522 39//522\nf 34//523 40//523 36//523\nf 31//524 33//524 41//524\nf 32//525 42//525 34//525\nf 41//526 39//526 43//526\nf 42//527 44//527 40//527\nf 39//528 37//528 45//528\nf 40//529 46//529 38//529\nf 49//530 47//530 51//530\nf 50//531 52//531 48//531\nf 51//532 37//532 53//532\nf 52//533 54//533 38//533\nf 53//534 35//534 55//534\nf 54//535 56//535 36//535\nf 55//536 25//536 57//536\nf 56//537 58//537 26//537\nf 23//538 13//538 57//538\nf 60//539 14//539 58//539\nf 13//540 11//540 59//540\nf 64//541 12//541 60//541\nf 11//542 1//542 63//542\nf 66//543 2//543 64//543\nf 1//544 47//544 65//544\nf 50//545 48//545 66//545\nf 91//546 89//546 176//546\nf 91//547 176//547 90//547\nf 89//548 87//548 174//548\nf 90//549 175//549 88//549\nf 85//550 170//550 87//550\nf 173//551 171//551 88//551\nf 83//552 168//552 85//552\nf 171//553 169//553 86//553\nf 81//554 166//554 83//554\nf 169//555 167//555 84//555\nf 79//556 92//556 164//556\nf 147//557 93//557 165//557\nf 146//558 92//558 148//558\nf 147//559 149//559 93//559\nf 94//560 96//560 148//560\nf 151//561 97//561 149//561\nf 150//562 96//562 152//562\nf 151//563 153//563 97//563\nf 152//564 98//564 154//564\nf 153//565 155//565 99//565\nf 154//566 100//566 156//566\nf 155//567 157//567 101//567\nf 102//568 104//568 156//568\nf 159//569 105//569 157//569\nf 158//570 104//570 160//570\nf 159//571 161//571 105//571\nf 160//572 106//572 162//572\nf 161//573 163//573 107//573\nf 162//574 108//574 68//574\nf 163//575 68//575 109//575\nf 162//576 110//576 160//576\nf 163//577 161//577 111//577\nf 128//578 179//578 160//578\nf 159//579 180//579 161//579\nf 179//580 126//580 158//580\nf 180//581 159//581 127//581\nf 126//582 124//582 156//582\nf 127//583 157//583 125//583\nf 124//584 122//584 154//584\nf 125//585 155//585 123//585\nf 122//586 120//586 152//586\nf 123//587 153//587 121//587\nf 120//588 118//588 150//588\nf 121//589 151//589 119//589\nf 118//590 116//590 148//590\nf 119//591 149//591 117//591\nf 116//592 114//592 146//592\nf 117//592 147//592 115//592\nf 114//593 181//593 164//593\nf 177//594 182//594 165//594\nf 112//595 110//595 68//595\nf 113//596 68//596 111//596\nf 112//597 68//597 183//597\nf 178//598 68//598 184//598\nf 178//599 177//599 183//599\nf 178//600 184//600 177//600\nf 135//601 137//601 174//601\nf 176//602 137//602 175//602\nf 133//603 135//603 172//603\nf 175//604 136//604 173//604\nf 170//605 131//605 172//605\nf 171//606 173//606 132//606\nf 166//607 187//607 168//607\nf 186//608 188//608 169//608\nf 131//609 170//609 185//609\nf 169//610 171//610 186//610\nf 187//611 144//611 189//611\nf 188//611 189//611 145//611\nf 69//612 185//612 189//612\nf 69//613 189//613 186//613\nf 69//134 130//134 185//134\nf 69//134 186//134 130//134\nf 142//614 193//614 144//614\nf 192//615 194//615 145//615\nf 140//616 195//616 142//616\nf 194//617 196//617 143//617\nf 140//618 139//618 195//618\nf 141//619 196//619 139//619\nf 139//620 138//620 197//620\nf 139//621 198//621 138//621\nf 70//622 190//622 191//622\nf 70//623 192//623 190//623\nf 208//624 70//624 206//624\nf 208//625 207//625 70//625\nf 71//626 199//626 197//626\nf 201//627 199//627 198//627\nf 197//628 200//628 195//628\nf 203//629 201//629 196//629\nf 193//630 195//630 204//630\nf 194//631 205//631 196//631\nf 193//632 204//632 191//632\nf 207//153 205//153 192//153\nf 200//633 199//633 202//633\nf 201//634 203//634 199//634\nf 199//635 208//635 204//635\nf 207//636 208//636 205//636\nf 139//637 140//637 177//637\nf 165//638 141//638 177//638\nf 140//639 142//639 164//639\nf 212//640 143//640 165//640\nf 211//641 142//641 213//641\nf 212//642 214//642 143//642\nf 213//643 144//643 166//643\nf 214//644 167//644 145//644\nf 166//645 81//645 213//645\nf 167//646 214//646 82//646\nf 213//647 209//647 211//647\nf 214//648 212//648 210//648\nf 79//649 164//649 215//649\nf 212//650 165//650 216//650\nf 222//651 131//651 72//651\nf 223//652 72//652 132//652\nf 133//653 131//653 220//653\nf 223//654 132//654 221//654\nf 135//655 133//655 218//655\nf 221//656 134//656 219//656\nf 137//657 135//657 217//657\nf 219//658 136//658 217//658\nf 231//181 217//181 229//181\nf 231//182 230//182 217//182\nf 218//659 220//659 229//659\nf 228//660 221//660 230//660\nf 220//185 222//185 227//185\nf 226//186 223//186 228//186\nf 225//187 222//187 224//187\nf 226//188 224//188 223//188\nf 224//661 231//661 225//661\nf 230//662 231//662 226//662\nf 183//663 181//663 232//663\nf 235//664 182//664 233//664\nf 112//665 183//665 254//665\nf 233//666 184//666 255//666\nf 256//667 110//667 254//667\nf 257//668 255//668 111//668\nf 234//669 181//669 252//669\nf 235//670 253//670 182//670\nf 114//671 116//671 252//671\nf 251//201 117//201 253//201\nf 116//672 118//672 250//672\nf 249//673 119//673 251//673\nf 118//674 120//674 248//674\nf 247//675 121//675 249//675\nf 120//676 122//676 246//676\nf 245//677 123//677 247//677\nf 244//678 122//678 242//678\nf 245//679 243//679 123//679\nf 242//680 124//680 240//680\nf 243//681 241//681 125//681\nf 126//682 179//682 240//682\nf 237//683 180//683 241//683\nf 179//684 128//684 236//684\nf 239//685 129//685 237//685\nf 128//686 110//686 238//686\nf 257//687 111//687 239//687\nf 276//688 238//688 258//688\nf 277//689 259//689 239//689\nf 236//690 238//690 278//690\nf 277//691 239//691 279//691\nf 274//692 240//692 278//692\nf 275//693 279//693 241//693\nf 272//694 242//694 274//694\nf 273//695 275//695 243//695\nf 244//696 242//696 270//696\nf 273//697 243//697 271//697\nf 268//698 246//698 270//698\nf 269//699 271//699 247//699\nf 248//700 246//700 266//700\nf 269//701 247//701 267//701\nf 264//702 250//702 266//702\nf 265//703 267//703 251//703\nf 262//704 252//704 264//704\nf 263//705 265//705 253//705\nf 234//237 252//237 280//237\nf 263//238 253//238 281//238\nf 256//706 254//706 258//706\nf 261//707 255//707 259//707\nf 254//708 232//708 260//708\nf 283//709 233//709 261//709\nf 232//710 234//710 282//710\nf 281//711 235//711 283//711\nf 67//712 108//712 73//712\nf 285//713 109//713 73//713\nf 108//714 106//714 284//714\nf 287//715 107//715 285//715\nf 286//716 106//716 288//716\nf 287//717 289//717 107//717\nf 288//718 104//718 290//718\nf 289//719 291//719 105//719\nf 290//720 102//720 292//720\nf 291//721 293//721 103//721\nf 100//722 98//722 292//722\nf 295//723 99//723 293//723\nf 294//724 98//724 296//724\nf 295//725 297//725 99//725\nf 96//726 94//726 296//726\nf 299//727 95//727 297//727\nf 94//728 92//728 298//728\nf 301//729 93//729 299//729\nf 338//730 308//730 328//730\nf 339//731 329//731 308//731\nf 336//732 307//732 338//732\nf 337//733 339//733 307//733\nf 340//734 306//734 336//734\nf 341//735 337//735 306//735\nf 89//736 91//736 340//736\nf 306//737 91//737 341//737\nf 87//738 89//738 334//738\nf 341//739 90//739 335//739\nf 85//740 87//740 330//740\nf 335//741 88//741 331//741\nf 83//742 85//742 332//742\nf 331//743 86//743 333//743\nf 330//744 336//744 332//744\nf 339//745 337//745 333//745\nf 336//746 330//746 340//746\nf 337//747 341//747 331//747\nf 328//748 326//748 338//748\nf 329//749 339//749 327//749\nf 81//750 83//750 326//750\nf 333//751 84//751 327//751\nf 215//752 209//752 344//752\nf 216//753 345//753 210//753\nf 209//754 81//754 342//754\nf 210//755 343//755 82//755\nf 346//756 79//756 344//756\nf 347//757 345//757 80//757\nf 92//758 79//758 300//758\nf 93//759 301//759 80//759\nf 304//760 77//760 352//760\nf 304//761 353//761 77//761\nf 78//762 304//762 350//762\nf 78//763 351//763 304//763\nf 78//764 350//764 305//764\nf 349//765 351//765 305//765\nf 305//766 348//766 309//766\nf 329//767 349//767 309//767\nf 342//768 326//768 348//768\nf 343//769 349//769 327//769\nf 296//770 298//770 310//770\nf 319//771 299//771 311//771\nf 77//772 76//772 324//772\nf 77//773 325//773 76//773\nf 303//774 302//774 356//774\nf 303//775 357//775 302//775\nf 303//776 356//776 75//776\nf 355//777 357//777 75//777\nf 75//778 354//778 76//778\nf 317//779 355//779 76//779\nf 292//780 294//780 364//780\nf 363//781 295//781 365//781\nf 364//782 362//782 366//782\nf 369//783 363//783 367//783\nf 366//784 368//784 372//784\nf 371//785 369//785 373//785\nf 372//786 370//786 374//786\nf 377//787 371//787 375//787\nf 376//788 314//788 374//788\nf 377//789 375//789 315//789\nf 316//790 354//790 378//790\nf 375//791 355//791 379//791\nf 354//792 356//792 374//792\nf 373//793 357//793 375//793\nf 356//794 358//794 372//794\nf 367//795 359//795 373//795\nf 358//796 360//796 366//796\nf 365//797 361//797 367//797\nf 360//798 290//798 364//798\nf 361//799 365//799 291//799\nf 302//800 74//800 358//800\nf 302//801 359//801 74//801\nf 284//802 286//802 290//802\nf 289//803 287//803 291//803\nf 284//804 290//804 74//804\nf 361//805 291//805 74//805\nf 362//806 294//806 310//806\nf 363//807 311//807 295//807\nf 310//808 312//808 362//808\nf 369//809 313//809 363//809\nf 312//810 382//810 368//810\nf 371//811 383//811 369//811\nf 382//812 314//812 370//812\nf 383//813 371//813 315//813\nf 384//814 348//814 386//814\nf 385//815 387//815 349//815\nf 320//816 318//816 386//816\nf 321//817 387//817 319//817\nf 298//818 300//818 318//818\nf 385//819 301//819 319//819\nf 300//820 344//820 384//820\nf 343//821 345//821 385//821\nf 378//822 314//822 380//822\nf 379//823 381//823 315//823\nf 324//824 316//824 380//824\nf 325//825 381//825 317//825\nf 322//826 320//826 380//826\nf 323//827 381//827 321//827\nf 386//828 350//828 380//828\nf 387//829 381//829 351//829\nf 402//830 400//830 414//830\nf 403//831 415//831 401//831\nf 400//832 402//832 398//832\nf 405//833 403//833 399//833\nf 396//834 398//834 406//834\nf 397//835 407//835 399//835\nf 394//836 396//836 408//836\nf 395//837 409//837 397//837\nf 392//838 394//838 410//838\nf 393//839 411//839 395//839\nf 392//840 410//840 390//840\nf 413//841 411//841 391//841\nf 410//842 420//842 412//842\nf 419//843 421//843 413//843\nf 408//844 422//844 410//844\nf 421//845 423//845 411//845\nf 408//846 406//846 422//846\nf 409//847 423//847 407//847\nf 406//848 404//848 424//848\nf 407//849 425//849 405//849\nf 404//850 402//850 426//850\nf 405//851 427//851 403//851\nf 402//852 414//852 428//852\nf 417//853 415//853 429//853\nf 442//854 318//854 444//854\nf 443//855 445//855 319//855\nf 444//856 320//856 412//856\nf 445//857 413//857 321//857\nf 310//858 318//858 312//858\nf 443//859 319//859 313//859\nf 382//860 430//860 388//860\nf 415//861 431//861 389//861\nf 412//862 418//862 444//862\nf 441//863 419//863 445//863\nf 440//864 438//864 444//864\nf 441//865 445//865 439//865\nf 434//866 446//866 436//866\nf 439//867 447//867 437//867\nf 434//868 432//868 446//868\nf 435//869 447//869 433//869\nf 450//870 430//870 432//870\nf 451//871 433//871 431//871\nf 416//872 414//872 450//872\nf 417//873 451//873 415//873\nf 312//874 448//874 382//874\nf 431//875 449//875 383//875\nf 448//876 312//876 446//876\nf 449//877 447//877 313//877\nf 416//878 450//878 476//878\nf 453//879 451//879 477//879\nf 452//880 450//880 462//880\nf 453//881 463//881 451//881\nf 432//425 434//425 462//425\nf 461//426 435//426 463//426\nf 460//882 434//882 458//882\nf 461//883 459//883 435//883\nf 458//884 436//884 456//884\nf 459//885 457//885 437//885\nf 438//425 440//425 456//425\nf 455//886 441//886 457//886\nf 440//887 418//887 454//887\nf 475//888 419//888 455//888\nf 428//889 416//889 464//889\nf 477//890 417//890 465//890\nf 426//891 428//891 466//891\nf 465//892 429//892 467//892\nf 424//893 426//893 468//893\nf 467//894 427//894 469//894\nf 470//895 422//895 468//895\nf 471//896 469//896 423//896\nf 472//897 420//897 470//897\nf 473//898 471//898 421//898\nf 474//899 418//899 472//899\nf 475//900 473//900 419//900\nf 478//901 458//901 480//901\nf 479//902 481//902 459//902\nf 484//903 478//903 482//903\nf 485//904 483//904 479//904\nf 484//905 482//905 486//905\nf 489//906 483//906 487//906\nf 492//907 486//907 490//907\nf 493//908 491//908 487//908\nf 464//909 476//909 492//909\nf 487//910 477//910 493//910\nf 476//911 452//911 486//911\nf 477//912 487//912 453//912\nf 484//913 452//913 478//913\nf 485//914 479//914 453//914\nf 458//915 478//915 460//915\nf 463//916 479//916 461//916\nf 456//917 454//917 480//917\nf 457//918 481//918 455//918\nf 472//919 482//919 474//919\nf 481//920 483//920 475//920\nf 472//921 470//921 482//921\nf 473//922 483//922 471//922\nf 470//923 468//923 488//923\nf 471//924 489//924 469//924\nf 466//925 492//925 468//925\nf 491//926 493//926 469//926\nf 392//927 390//927 502//927\nf 505//928 391//928 503//928\nf 394//929 392//929 500//929\nf 503//930 393//930 501//930\nf 498//931 396//931 500//931\nf 499//932 501//932 397//932\nf 496//933 398//933 498//933\nf 497//934 499//934 399//934\nf 494//935 400//935 496//935\nf 495//936 497//936 401//936\nf 506//937 388//937 494//937\nf 507//938 495//938 389//938\nf 506//939 494//939 504//939\nf 507//940 505//940 495//940\nf 494//941 496//941 502//941\nf 501//942 497//942 503//942\nf 506//943 314//943 388//943\nf 507//944 389//944 315//944\nf 314//945 506//945 322//945\nf 505//946 507//946 323//946\nf 320//947 322//947 390//947\nf 505//948 323//948 391//948\n"
  },
  {
    "path": "rfdata/rf-2.500-3.raw",
    "content": "\\^`bfdfcfbfbb`_[\\VWWZVUPTSTQTTUWUSUTXSWY\\Y^WXTUQRLNDE=>À97Ā5:;=;>>BüBAAEEKIMMNRSRVVW]cbcfjjprtvvvxuwvvstsuqsppnpfe_aZ\\XXTXRUSWSROPORKNJFHHEKKNPSQZWYY\\bdacdikjpqrunrkqjmijfebc]`UURQIJGD@B;<þ<>@EBDFGGJMPOQNTRUXZ\\bdfimjqornqsxvxwyqtqqrtqqkolnklfidc`ccfcd_`\\[W]VZWUTUQTSTQRPSQVPYZ[Z_[[ZZXZXXXZ\\^\\^]]Y^ZYYWQSOOEI?=Ā87ˀ4:Ȁ24р.3̀/4̀15ǀ58Ȁ8;ý??º@BADIIHMNSW\\[^aabedhkpstsqpqrtroknghcfacbd]_[\\WXUWQRJKKLNKIIKLJLNRRROUV[[]_cabbccdgfegbc^^[\\SSPQPLLOHFCB?DDCAGAB@E?BDG@CABAHGFLLLQSU[\\bfglmoqrrruvrtvvppii_`VRRRKMGMGIHMGJIKIJIKJLKNMPNSQUSVW[\\__b`e^`bbeegfeebd]ZWVPQOQNOMMHLFKFIFHKJGGFHDA@EGHMPLRPUY^_bagfhihhkhiab]_XXSQPNJJJILLLKNQLLKOQOPTQVQQRTQVWXY\\^__acfjljnkihmilllfgcd^aVWPSIIFHBDBCCC?BCGEEFIGMLLMPNPNSLOPVRUX\\^adgkpotsvttpnlkjhab\\][XMLLI@C8:ƀ45ɀ5::;:@@ECDILINLOSSVUWXUW\\ZZ_cdbggjijghcfccaa]`]aZ[VVUVQNLNJKHKEKGJGHEHGIFHDGIMQSVW^^bechjlknknlnmqmifd^]YZOMEHAB?@::7:ƀ577=ž::;@þ>A?AAD>CGLJNMRPSTY]_eghjkmnpqsnnkmkljmmolklliihjegdgbd__\\]Y]Y\\WWSTQOLMHLFGED?B9:ǀ13Ӏ \"　\u0017\u001b쀀\u0010\u0018퀀\u000f\u0010ꀀ\u0011\u0013耀\u0019\u0018　\u001e\u001c؀!%р,.̀1/̀47<@ÿ9;DGEHKMTVVWVVW\\_bdhlopuqsoqmmgicgbcab\\][ZZ\\ZYUTLONNKKJMGIAE=DCDEDDHGLMOT\\]``eefgllmkkllfgbdZZWVPSOONQJLBD?@:<@?>==<<A¼@?EHGKKONTSVUZ][\\`cdefgiehffdh`d``\\^TWNOKJEE=B=A?>AB>BDB<A:A;<=CBFEFMMOSWY\\^\\^^daeeedefkefef`_[\\STONKKDF<C>?¾<:;<À8:À:8Ȁ56ɀ06<;9=ļCACGFIJNRTQYW]]^`bfefidd_`\\`\\_Z]W[VWPQOMJPJIBCAB==ÿ:;;@ÿ=>@?¾DFFKKLPTVY[`__dhghejccad^`Y[UTUVRQLPCFBEAEB=?;ƾ9;ÿ:9Ļ;>==<=DDCGJQUSUW\\^ad`badbc_a_]X\\WYSXRSNOPQLPMOKNQPMNIJHIHHFFDEEDIMNNRVV[Zc]_]`]bbcffbd`c^]V[UWQRMKGH>@CDC@¾=:Ā9<8;½>=?EFFIGDFCGBH@EGKMRTTW^_``fcfdgebbbad_b[[UXQSONLKKFDEA?;<ǀ67ɀ/3ʀ15Ȁ79ǀ659:À=>@BGJMQUY[[_edfjkmpqutywwqtnolkijdg`_[_\\\\YXQSMNFE@A:<68Ȁ20̀03ƀ56ˀ03Ѐ/.Ӏ)*ۀ $ހ\u001a\u001a䀀\u0017\u0019耀\u000e\u0015退\n\u0015\t\n\u000b\u000f\r\u0012က\u0018\u001eـ#,ˀ19:=@CEDJJGNORV\\[`_bhlosrvvwsuutonilgg``]\\TUOROOOQPPKNGLFHKLJLGIJIEJHLMOPQRYY_afbfabbb__X[WXQONNHJAA9::>Ā6:Ā::ŀ43Ā5:ƀ699<Ľ:=À=;>=¸CEDHKMMRRRXXXZ\\]Z`\\^\\_]^]^[\\RPGMDD>B<=ŀ7=Ā46ŀ77::7:À7;À8<ŀ6:ƀ18ŀ55ɀ16ŀ8:¾?@?AEHIOMUUY^^ad_bac`eaabc]^WXTSKJHGA?<;ŀ37Ȁ57ƀ66ˀ.6Ȁ47Ā5:;=@@Ā;:CC>BFGFNKROSW[_adgghdjghgd`]X[USMPKRJHDB:>ǀ7899Ż=?=>:=<>99ǀ66Ȁ37ŀ69ƀ:>BFJMOTW[Z^_`ca_b]`]\\YWSWQQMOGJAE<?9=À:<ƀ56ƀ47ƀ27Ȁ59Ā;=ľ;=;>ÿ==½=>?>û>BADELORVZZ\\`c`aad]\\[YRRNOHFCD;@8;Ȁ+.ˀ--Հ%)Հ&(Ӏ(*Ҁ(+Ѐ,7ƀ4577Ā6;7;ǀ7:8:üA@HNQSUZ[]_a_^^`_a^]Y\\WWORLKFGBD@A<;;><>@D=>?AA@CGAHELEKGKKRQTSVVZX`bbdehjloikgkhkjhegab_bY[WUXXTTPQHNGNHJGKINLLJMJIEFFE?DCGFF@BA?=B=;¾7:;<ľ?@žCA?AABAGDHDF?A@FBBAEBC@CAEDFFIEJHLILMQOSPPLPRWSUIMKIGHMNHNNONQNPJLHJGDFMGLJLJKLIKJKLKMJHGKIKLOILGJDFAB>?=ADFKKKOJOIJFKGHBGEHDD@D??BDEHCHDE@EBE??CBCGHGBDAEDCBFDFDGFEEIIKINOROQPQLLHHCF@@>?BFHKHKKNKLILHJHJGGGHEHFJHMMMOPPUSTVYVXVXUVSRMSQSMPHKEJGLIJJJIKHOJIFIEDGG?FAA?EAECJIIEHIHHLLLGGDGEHEIEELMMILMLNIJFGED@EAD?B?BCAAA<<BC<AACCFDD?DACA>?HHIILOPNOONLNGHIICGC@AC=A<=¾?A>@@BCHCEEFHJIKIOHKHLGJHKLOLQNQPORTQOMOHIEJEKEGGHDEEHIFHJED@BBEBEFFIKDDFEFJCFJIFKFKGGFJFECCDCAJEJHHEHCFDEEFJIFJGHJKKNGKGIHKNOLOMNKLKMEIILJJFIEGHJEFCACEBBAB?BACA@CF@@=?8>5;ƀ::ŀ9=8@<@ABHJCHJHKKKJGIEKFFCEDF@FBA=>º<?<D>@<=Ā:<;;=>Ā5ACF?CFIKONQONOOMMLJIH>EABCEEIAEDEAF>?>@¾=>;=@B?BEFCAHFEHHKIKKONNMNMKEEFHFGDF?C@ECEABEDBA??BE@>BC>DCECGEICCDG??½:>?@?BGEIHHIDIAFA@@DDJFIAAED>A=?8:À64Ȁ86ǀ33̀02΀22ˀ/4ˀ34ǀ9:ž<>þ>DAFFHGFEIBBA?»>A@@<??CAB?CCDCDCD?DAJCFAHFFFD?@A>BBEB<A<A?BBE==þ=AĿ<B@D@CCFECBF?=;>9=7<68À6<À;>@A>?>A<@@@>@AEDE@=ſ<?7:9>;=ľ?@>B<?AFAGDFGDFHGJGICF;<þ;><:58ƀ57Ȁ4:Ȁ49Ā9=@AADAGAIEHDFDHFHHJKMLPOPQSPPKPNMFJEGBE@@<B=>8=À68ƀ55ɀ77Ȁ77Ā5:À7;=B>@@@CDBCAB@CBHIIKKLOJPLJGIEHFHDCBDAFDGDBBD?A>C<D=AĀ:;Ā:=@B@A>C?E<@9>=9ŀ6;=B½><>A8<7;;=Ŀ<=7;;;>@BDCGEHFKHIEGAC=>>B;?=>;>ÿ@BAE?CBDCDFE@EABCDDCEGACDCBC@BBFBD@CEEDFEGAHEG@EAA@A?C=B=?¿::6<Ŀ:;À;;59À6167ɀ58ɀ78ǀ46À7<ÿ;AAFFFHKKJPSQTRUTSQRPUJMIMGJIIGKIGDGADACCFBIHIHJIJHHCBCHBCCGGHFFEHFDCDDBDGGFCFCK@DBEBCCA¿;<:<ÿ;>@D@CBFCGBGGFBHCDFKFF?C??Ȁ36ʀ31π,/р',π+.ɀ34ʀ68À;@??;??@¾?B>>?@B@>??>AA=?=>?A¿=95<;<ſ<>==@B=?ABAGFHEHHIJHDA?A;:À79ʀ67ɀ595;Ľ>BBEFKGGEJBEAB?A;<ǀ999Aÿ?B>@>B@=<A=<ÿ:=Ž9<û9;9:Ā5=Ā:99;6:9=Ŀ9?ÿ?A>A?BCD?@CFDE@B?B>A>A:CA@=>>>ýA?A@CIMKIFLLMKHJGILOKIGMDDGKFDCE;=ÿ<?:?ŀ48ŀ35ƀ58Ȁ59ý:==;:=;><=?C?B@EDIDHHKIMKOKJEH@C<?;@?@BC??ACAA=@½<DCDFGKKLNKLKKIKGHGH>C9?:A>D>@BD?B=@@B:@;:8=8::=78ŀ39¾9=@CA@BECFDEEGFKGKHOIJIMIKIJHLHJGHGGCGCHDFIKBG@B:<797::<ý=@BC@A@@>=½:@?BCB?@@B@EAB?B?A@C??¾>CAB>@<<==þ=>@DDAA?==À57ƀ8;;<<=;@?BDFHIKKJMEHHFDIIIFIIJFJDHFGCECD=?=@>>:A699<;AĿ<=<C=@AB?B>BDGGHEHFEHJKKFJAEAEDDA?<@<==C@@¾<?>=À;<==<?@CDGGGCGIJCFFBFHCDBDCCADCGEIIKHJEFCC>??ADEAADDAC=?<>=>?B=@@F<=>?@BBE@B:=¾@@9;ƀ5:À99À25Ā44ǀ35ƀ06ŀ55ƀ79ɀ89ǀ58ǀ67ŀ6;ƀ6;ŀ5<:=À;@?D<?CBEELKGKBGAB?A>A:;9>À::9<8=9=ſ=BAB>@=?9=¿;?»<C=BB@A??D@?>BA?DFFJAECC<>9<ÿ;>8;ÿ;<=;<>Ā87ŀ88ǀ36ŀ58ŀ6>6;ļ?@ý>BCDABAE9=À9864ʀ16ˀ)+π$(܀\u001d\"\u0019\u001dހ\u001c\u001e߀\u001b\u0018䀀\u0018\u001a耀\u0013\u0014뀀\f\r\u0006\f\u0007\u000f\u0015\u001c倀\u001f\u001f \u001e#؀!%Հ++Ԁ.4ǀ3577==<@GHKNMPOTQVVXVVQURPMOFJDGB>;>À66ǀ23ˀ/4̀+/΀./π/4̀37Ȁ06ɀ::Ā6::>þ<ACDCFLMNRRWY]Y\\UYZ]VVSSMNOLNKKLFBADA>??:@¿:7Ā56À38À59ɀ36ʀ/1π2/р**׀*,׀&+Ҁ*0р/7ƀ7:ƽ=AIMRRUZY\\[_]]YYSUNMCD?<:4̀12ǀ33ɀ-0ʀ.3΀/2΀+-Ѐ+-Ԁ&'ր%)ـ',Ӏ,4ʀ36ŀ56ŀ7:ž=@KLNQWWTYY]\\]Y\\Y\\ZYORJPKMC@ý<:Ȁ30р,-ـ\"#\u001a\u001a退\r\u0018퀀\u0013\u0018퀀\u0015\u0017퀀\u000e\u0016쀀\u0015\u0013退\u0015\u0017怀\u0019\u0019\u001d%݀\"%׀&+΀.1ŀ6:Ŀ=CDHNRMUWY\\\\VZVTPOMKGECB86ƀ.2΀-,р*0π-0Ѐ.2̀/1ˀ/1ˀ-/Ѐ*,р&)ڀ('ր((Ӏ!*Ѐ(0΀04ŀ57<=@BMMWZZZ]Z\\^\\]^_UTMM@D;<ŀ4678Ȁ24ɀ-1΀..΀03ˀ32π-,Հ$%܀ \"ր%%Ԁ((Հ''ր')π(.̀-5ƀ6;û?GKMNTTUX]]_][WVSSLOHH??ǀ78ˀ,,ـ$&ۀ\u001f\"݀\u001e\u001c߀\u0019\u0016倀\u0015\u0019耀\u0014\u0015倀\u0017\u0018ހ\u001f\"܀ #ր#'ـ&(Ԁ)1Հ*5΀,4̀08ƀ7>=?EHIOOQPVRTWZ[^[[Z^ZYXXPSOONNLMFG@EAD==<=::ŀ77À36Ȁ52ǀ54ǀ1/ŀ57ƀ46Ȁ12ɀ00ʀ/1ʀ./؀$%݀\u001c\u001a瀀\u0011\u0018\u000b\u0010\b\t\u0000\u0005\u0003\u0001\u0013\b\u0003\u0006\u0005\u000b\u000b\u000f뀀\u0013\u0015퀀\u0011\u0015怀\u001a\u001d倀\u0019\u0018　\u001f#ۀ&.π24;?BFMOORPSPTQVOPLOFGFHDF@BB@<?ú>A=?8>ŀ9:67ˀ37ɀ26ˀ15ɀ-/ʀ02̀14ŀ/4Ȁ89Ā:@BDFLMPNOPTQPDGEE9:ŀ04π*,ր!&܀!(߀!\u001eހ\u001d\u001f倀\u001e\u001e　\u0017\u001b倀\u001b\u001cက\u001b!　\u001c\"݀\u001d\u001e߀\u001c\u001d܀!#ր&,Ѐ-/ʀ/3Ā7;Ā99ľ;<ĺBFGOKOOOKMFJFD<?<9ǀ57Ȁ10р''Ԁ$-Հ(-Հ%&׀\"%݀\u001e%ހ\u001b\u001fހ!&ڀ$#׀!!ր&(Ҁ,*Ԁ,1ƀ35Ȁ59Ā;@>@=CCBAEBDEIGIIJHIHKCHAA7802̀/2ʀ/1ʀ+-Ӏ%*ր\u001f#݀\u001d \u001c\u001c怀\u0017\u001c \u001b\u001dۀ\u001e\u001f \u001c$׀#$Հ%'Հ!-Ѐ(1ɀ77=@ùDENPSUUXRTQQIKJICE=>77̀/1̀+(Հ#$က\u0018\u001cက\u0014\u0018က\u0015\u0017耀\u0018\u0019瀀\u000f\u0018倀\u001b  \u001b\u0018ހ\u0019\u001eڀ\u001e ׀$#Ҁ,,Ѐ/2̀05ŀ5:À;=;BDGIKJNRURUQVOQIIEFCA<<Ā7<ǀ35̀01΀,)Ҁ%&ڀ#'ـ##܀ \u001e݀\u001f\"߀\u001b$ހ %ڀ\u001a  \u0019\u001b\u001f$߀\u001d!ր#-ʀ.4ŀ7=8AAFGFHIKPOUMQMOINDECC::À64΀/.ʀ00ڀ$-р,(؀))׀()ր'+Ԁ)-π-/π-2Ȁ33ˀ02ǀ34Ȁ45ŀ28Ā><?BCHGKJNPQPROOGLINFHC?º?<Ā69Ȁ40Ѐ,.Ԁ$&Հ!& \u001f ߀\u001b\u001cက\u0017 ހ  ۀ!#ـ##׀(,ր**ր)-ր%*ր(+׀)0ˀ13ƀ9;¾@@CDDHKONQQRNMGMDF;>ŀ44Ȁ./Ӏ(,Ӏ)(ր&*Ԁ! ؀\"'\u0018\u001c倀\u001b\u001d䀀\u0017\u001d߀\u001c\u001e䀀\u001b 　\u001d\u001eۀ\u001d\u001dހ\u001a\u001bހ!\u001f݀\"%ڀ)*ˀ249;û@CEJKMPPQSVXWYSQOTPRORNQMMJLJLGJFFBA¾;;ǀ22̀03̀11̀,-Ԁ))Ԁ\"'ـ$%܀ \u001d䀀\u001b\u001c\u000b\f\n\u000b\u0000\f\b\u0012\b\u0019\u0016\u001e\u0014\u001f\u0017\u0012\f\u0010\u0003\f\u0000\u0006\u0002\t\u0006\u0001\u0005\u0005\f\u0012\u0014\u0017䀀\u001a\u0013瀀\u0018\u001b܀\u001f&Ӏ',ʀ.6:>FIKRPQOSMRJKHIED@@?A99ŀ45Ѐ.2Ӏ),р)*؀\"&܀\"&\u001e\"ۀ 'ۀ (\u001b\u001e\u0017\"\u001d!ހ\u001c$က\u001d\"ـ%,΀16ǀ:@BDEJCJEHBFECC@A>51΀..Ҁ--׀$&\u001b\u001e耀\u0011\u0015倀\u000f\u0012ꀀ\u0011\u0014쀀\u0012\u0016\u000e\r\u0007\u000b\u0003\u0007\u0007\u0007퀀\n\n\u000f\u0010\f\u0011\u0010\u000e\u000e\u0015退\u0014\u001c݀!&ր.*̀16=@DIFIJJHLGFED=?87Ȁ03π++܀!#܀\u001f\u001d倀\u0011\u0013耀\u000f\u0011瀀\r\u0014ꀀ\u0012\u0015ꀀ\u0010\u0015䀀\u0017\u0019䀀\u0018\u0019ꀀ\u0015\u0018倀\u001a\u001fހ\"\"Ԁ**΀.4Ȁ3::<÷@AJHMMTVVYX[XXRUOMDI<?¾66Ѐ+*ۀ\"\"ހ\u0019\u0017\u000f\u0012\u000f\u000e퀀\f\u0010쀀\u0010\u000f\f\u000f\u0010\u0011耀\u0013\u0016退\u0015\u0019耀\u0015\u001c\"(߀$'Ӏ**Ԁ(/Ѐ.3π/5ǀ5;ƿ<@?GGLLPNSKOJLCF?>ƀ69Ѐ+/׀\u001f#က\u0012\u0018退\u0012\u0011\u000b\t\u0001\n\u0005\n\b\u0010\u000b\u000f쀀\u000e\u0011\u0011\u0010퀀\u0012\u0016退\u0013\u001a耀\u0015\u0019 \u0018%݀ )Ԁ)-Ѐ15ǀ88::¿>@ABABB?AFDG?D@=?@=>¿87΀/2΀$%Ӏ#(݀\u001c$က\u001c\"倀\u001c\u001e怀\u0016\u001c耀\u0012\u0015怀\u0012\u0011耀\u0013\u0016뀀\u0018\u0014\u0012\u0019倀\u001b\u001e\u001d\u001dڀ\"%р)*΀/3ƀ9@BECEHMIKLLIKIKHD@>Ā99Ȁ/3΀-/р-*ր!&؀\u001e\u001d瀀\u0014\u0019怀\u0010\u0012퀀\u000f\u0017退\u0011\u0019倀\u0018\u0016က\u0018\u001a　\u0018\u001cက\u0017\u0019䀀\u0016\u001dက\u0018\u001eހ '܀!(р02ŀ<<ļAEGIKMHLMPLONNJKEHDC?@9896ǀ2-Ҁ%&ـ\u001a\u001e䀀\u0014\u001b退\u000b\r\b\b\u0006\b\u0003\u0006\u0000\u000e\u000b\n\u0004\u000e\u0005\u0005\t\f\u0010\f\u0013ꀀ\u0014\u001b\u001d ـ&*؀+1ƀ7:ż?BCDEG?D??9968À6?À36ɀ66ǀ56ʀ56π-.Ԁ%'ۀ!&݀%$\u001c ڀ\"&܀!#܀ &܀ \u001f܀\u001f\u001fက\u001c\u001d݀\u001f\"ـ\u001f$ހ $Ԁ.3΀/9Ā9>>A@ECGDFBDDGBEFGHFILDIBFEE:><><@8?86ŀ34ɀ.1Ѐ*.Հ''ր#$ـ\u001f!䀀\u0011\u0012\u0001\u0007\u0003\n\u000f\u0018\u000e\u001d\u0017( '\u001e\u001e\u001a\u001f\u0014\u0016\r\u0010\u0003\u0005\u0001\t\u0000\u0007\u0001\u0000\u0003\n\r\r쀀\n\t\u000e\u0014耀\u0015\u0018ހ\u001e%ـ(,̀01Ā6=ûAFGKMTUXX[[]Y^[\\XWMLGF@@91ˀ*/Ԁ$(݀\"\u001f倀\u0015\u0017쀀\u000e\r\u0006\b\u0001\u0003\u0003\u0005\u000b\r\u000e\u000b\t\f\b\u0014\u000f\u0013퀀\r\u0015퀀\u0016\u001dڀ $ր%)р.5ŀ98;>:;A@ACCC?>::Ȁ02Ԁ)*׀#%Ԁ#$׀\u001f#݀\u001b\u001d倀\u0011\u0013\u000b\b\t\f쀀\u000b\u0005\r\f\r\u0011\r\u0019退\u0012\u0015  \u001b߀\u0016\u001c　\u001c ؀ \u001cـ!#ۀ\u001f#Ԁ*,̀/27=:@@FEKHJDEA?<@9:Ā47ˀ12Ѐ+)؀\"#\u0018\u001b退\u0012\u0012쀀\r\u0014\u0006\r\n\u000e\b\u000b\b\u0006\b\u0006\u0004\u0002\u0002\u0006\f\u0007\u0006\u0000\n\u0011\u000f\u0011耀\u0010\u001aက\u001a!ր'/΀679ACEHIJMIKKNONOSLOLPMOJMHJHE@E><ſ67ƀ55Ȁ01р+-Ҁ/1Ҁ+,Ԁ%,؀\"\"ր\u001f$݀\u0019\u001f\u0015\u001c߀\u0018\u001d　\u0018\u001cꀀ\u0011\u0018ꀀ\u0013\u0018退\u0018\u0018䀀\u0018\u0019က\u001d\u001c　\u001a ݀\u001e\"܀ #܀$'Ԁ#+р,/р+-΀,,΀-2ɀ13ɀ35ƀ58̀8<8=Ȁ66̀/5ˀ23̀3/̀,6ɀ03Ȁ04̀34ʀ43Ȁ-6ˀ44΀22ǀ31ʀ53ƀ43ƀ37ǀ13ǀ.5Ȁ/1Ѐ.,Ӏ'+Հ)&Ԁ')ր&*Հ)0΀*0ˀ/5ˀ11ǀ68ǀ677<688:ŀ;=À:;;=Ā8<;;ŀ46ˀ/-Ѐ+/Ҁ++Ԁ&*Ӏ')Հ%&ڀ%&ڀ()܀%(π()Ԁ*.π*1ˀ15ŀ69ǀ68ƀ69ɀ57ǀ22ƀ66ŀ88¿<<À9>ƀ8?ÿ@?;<À43ŀ57Ȁ01̀.0΀-.π/0Ѐ/3ˀ0/΀.1׀&+Ӏ%(׀\u001f&؀((ۀ%&ڀ%(ր\"*Ҁ+-Ԁ,/р-/̀,3΀*4р+0Ѐ+*Ҁ,,Ѐ))Հ(-Ӏ'.Ҁ.1΀.,Ԁ+*р&+Ԁ*/Ѐ/0Ѐ*.Ӏ*,Ҁ-.΀..Ӏ,1΀+&ـ\"(ހ #ۀ\u001f$߀\u001f\"߀ )؀!$܀\u001d!߀\u001e&݀\u001d ׀$(׀# ܀#%݀!!݀!!݀&%Ԁ&(Հ$-Ҁ+'Հ&*Ҁ)-̀*.΀-3̀*4̀03ɀ74ˀ-,π+,Ҁ$*؀#\"׀&(Ѐ)'р*.р-2π))р)*р#%Հ%*Ҁ'(Ѐ*+׀*-Ҁ'+Ӏ)+ր(*р+.΀0.Ѐ*.΀,.р,-р0-̀*1р'+Ԁ#%ۀ \"ۀ \"  \u001fހ\"$ހ\u001f#߀\u0019\u001d \u001b\u001eހ\u001d\"ڀ\u001e\u001fހ\u001e$݀\u001f&܀ $ۀ$&؀#\"ڀ%#ր''Ҁ-+ր)+Հ(*Հ''ڀ$(؀&&ڀ%'Ԁ&.Ԁ*/р()׀$%׀&$܀\"\"ހ\u001a\u001c怀\u0017\u001a\u0016\u0019\u0018\u001e݀!\"ـ!$ـ&$Ԁ)(Ԁ'(ـ'&ۀ #ـ\"-Ҁ,-̀/3ɀ3667ŀ77ɀ35ƀ34ƀ22ʀ43Ѐ-+Ӏ.,̀-/ɀ.0Ҁ/2΀,,Ѐ'(׀('Ԁ+,Հ'-Ӏ$'ـ\"#݀ #؀#\"ـ!'܀$(Հ'&ր$(Ԁ(*׀((؀\u001f&݀\u001c\u001fހ!$ڀ $܀\"\"ۀ\u001e\"؀##ڀ#%ۀ 'ր$'׀\u001f&ڀ#'ۀ\"\u001fހ\u001a\u001c܀\"$ۀ\"%Հ#$р+.Ѐ/2ˀ11ˀ./р,(̀(-΀*0Ӏ,,Ԁ&-Ԁ)+π//΀00Հ+-Ҁ*.Ӏ+-̀03̀+0Ҁ%)р&,݀#&р)*Ѐ,0π14΀.5ǀ87ƀ59Ā9:Ȁ66π-/Հ&(ڀ\"\"\u001b\u0016뀀\u0012\u001a\u000f\u0012退\u0014\u0016܀\u0019%׀&(Հ()Ԁ&,Ԁ(0̀.1̀..΀*.Ҁ(-Ҁ+.р,.р*1΀/2ǀ35Ȁ23̀-/̀/,̀,+Ҁ.1ʀ0.̀20Ѐ).р+*Ѐ(+Ԁ+,Ҁ)-Ԁ(,΀-/р(/Ѐ'%ր((Հ\u001e!߀!!ހ\u001b\u001c　\u0017\u001d\u001d'؀&+΀+/Ѐ+/р*0р*,Ӏ**Հ*-΀.,р*)Ѐ).π,.р''Ӏ&\"܀\"\"ր#&Հ')Ԁ'(Ԁ'+ր*1Ѐ,+Ӏ%(Ԁ*,̀-6ˀ/6ʀ.3π'+Ӏ(*̀,0Ѐ)-р)/ʀ/2̀/1Ԁ,*Հ$.Հ%%Ӏ&(Ѐ.1π.3π02Ȁ55̀-0̀+-р,+ր((׀#'׀&!ـ$&ր#(ڀ$,Հ&,Ҁ(*Ԁ(*Հ%%Ԁ('Ҁ(*Ӏ(&Հ++Ӏ$)Հ&,Ԁ%&Ҁ+-Ҁ*)Ӏ(+π)-Ԁ*/Ԁ'(ـ$'ր\")׀$)Ԁ)(Ҁ,-Ҁ(/р(3ƀ44ɀ3/̀-/Ԁ)*Ӏ''Հ$#ր\u001f\"ڀ\u001d\u001dހ\" ـ!&ր#\"ڀ$&Հ$(Ҁ&$Հ,-Ѐ).р+/π-0΀24Ȁ15ˀ11ɀ46ƀ96Ȁ54Ȁ/6ɀ/1ʀ/0р))π+&׀#(ڀ %܀ %׀%!ڀ\u001d ܀\u001f\u001fހ\u001f\u001d \u0018\u001e瀀\u0017\u0019퀀\u000f\u0017䀀\u001a\u0017倀\u0013\u0017䀀\u0013\u0014뀀\u0012\u0013\u000b\u0014뀀\u0015\u0014\u001b\u001b߀\" ڀ#(Հ$(Հ%,р&'׀((Հ%#ր%(ۀ!\"Հ%'Ӏ((π+.̀,,̀',΀-)׀%'؀$&ހ\u001f!݀\u001d!ـ\u001d!ۀ $ր\u001c!׀)#ڀ!\" \u001f\u001b  \u001b\u001c䀀\u001c\u001eက\u001d 䀀\u0015\u001c　\u0018\u0018倀\u001b\u001c׀\u001f\u001f\u001c\u001f܀\u001a\u001e !$߀\u001d\u001d߀ !ڀ#$׀$(ր%)Ҁ+-ր!+ۀ !؀\"\u001fހ\u001f\u001d݀ !䀀\u001b  \u0017\u0018뀀\u0014\u0018뀀\u0016\u0019退\u0010\u0016䀀\u0013\u0016耀\u0012\u0017䀀\u0017\u0016က\u001a\u001f \u001f$׀'+̀.4ʀ27Ȁ47ǀ47Ȁ,.׀&)ـ!%ڀ\u001e\" \u001a\u001f݀\u001b က\u001d\u001f \u001c\"ڀ #ր!$׀#(Հ$&Ӏ-,Հ-2π'&р+-؀(%׀$&؀%(Հ*(Ӏ#&׀\")ր#'ր*'׀*(ր+)ڀ%)က!$Հ\"$ \u001b 怀\u001a\u001a　\u0019\u001c܀\u001f!ۀ $ـ)*̀00̀-3Ā55ʀ16ɀ39̀09Ȁ34΀06̀24̀/0̀.0̀+-π,/̀+.Ԁ,/̀.0΀/.Ѐ,.ր#*Հ'&Ԁ*+ր%(ր#'؀ %ހ\u001e ۀ!!\u001f ۀ\u001f$\u001d!ހ\u0016\u001b \u001b\u0019　\u0016\u001c怀\u0015\u001a䀀\u0017\u001a䀀\u0018\u001d\u0014\u0019倀\u0019\u0018က\u001f!׀$%р'+ր**׀)*׀)+Ԁ(*р))Ԁ%'Հ\"%݀  ۀ\u001d\"ۀ\u001f%܀!#ۀ!$ـ&)Ѐ+/Ҁ+.΀-0Ȁ35ˀ/2̀.1Ӏ-/Հ(.Ԁ*&؀%#ۀ\u001f\"က\u001f\u001e\u001a\u001b\r\u000e쀀\u0010\u0014퀀\u0013\u0017䀀\u0018\u0019뀀\u0013\u0013怀\u0012\u000b\t\t\u0005\u000b\u0004\b\u000e\u000f쀀\u0011\u0015退\u0013\u001a߀ %ր%+Հ,2ˀ46ƀ78ʀ78Ā:7À;?97ɀ..р)&݀\u001d\u001fހ\u001f\u001cހ!#ۀ!+׀(.Ѐ-,΀+-π+.Ԁ&*ڀ %ހ\u0019 က\u001a\u001fހ\u001d\u001b瀀\u0011\u0019退\u0015\u0019倀\u0014\u0017瀀\u0017\u001c瀀\u0014\u001c߀\u001c\u001d　\u0017\u001c뀀\u0012\u0015뀀\u0013\u0011퀀\u0010\u0011倀\u0018\u001b䀀\u0017  \u001f ݀\u001e\"܀#(Հ!&ڀ &Ҁ$&؀*(Ҁ(-΀,5ˀ48À59<<8:79ǀ87Ȁ/6π10р,/Ҁ&)ـ'(Ӏ')р)*Ԁ+)Ԁ%&׀!$ڀ\"$݀ #ހ#%܀\u001f$ڀ!#܀\"$က\u001c က\u001f!ڀ\u001e!က\u001e#܀##ր&(Հ&*ր\"(ր$'ۀ\u001e$ހ\u001b\"݀\u001c!ހ\u001e\u001e\u001a\u001f\u0016\u001c߀\u001a\u001e\u001f$؀!\"݀\u001f!݀#$ހ#\"ۀ#&ڀ\u001e#؀!(؀$\"ۀ !က\u0019!܀\u001b\u001e܀\"'׀'*ր'&Ԁ&+Ҁ+-р+'ր)*Հ$%ـ\"*ր()Ӏ**Ҁ,+΀&)Ԁ&&؀'&Ԁ()ր,,Ԁ'.Ҁ%&ـ)-̀./π,0΀,+Ѐ%*Հ#\"ۀ\u001d\u001c؀\u001e\u001eڀ\u001c\"က\u001b 怀\u0017\u001b耀\u0010\u0014쀀\f\u000e\u0014\u0010쀀\u0012\u0017뀀\u000e\u0013쀀\u0011\u0012\u000b\r\u000b\u000b퀀\u000e\u0014쀀\u000e\u0011ꀀ\u0014\u0016耀\u0015\u0016ꀀ\u0015\u0018耀\u0014\u0019　\u0017\u001c\u0018\u001f܀\u001a\u001e܀\u001e\"ۀ\"\"׀&)Հ#$؀&$ր$\"݀\u001d\u001f܀##܀%'݀ #䀀\u001a\u0017　\u0018\u001eက\u0018\u0019䀀\u0016\u0014瀀\u0014\u0018耀\u0019\u001a　\u0016\u0019耀\u0017\u0019䀀\u0017!　\u001d\u001b݀\u001d\"݀$(݀\u001f&׀\"#\u0019\u001e　\u0016\u0017耀\u0015\u0013쀀\u0011\u0012\r\u0011\n\u000e\u000f\u0011\u000e\u0011耀\u0012\u0010ꀀ\u0012\u0016耀\u001a\u001d \u001c\u001b　\u0016\u0015瀀\u0011\u0018 \u0019\u0017䀀\u0011\u0016䀀\u0017\u0018怀\u0019\u001a耀\u0017\u001b倀\u001c\u001e耀\u0014\u0015瀀\u0019\u0017\t\u0012\u000e\f쀀\u000f\u000e\u0004\f\u0011\u0016怀\u0011\u0015　\u0015\u0017耀\u0015\u0019ހ\u001c! \u001e$\u001d\"က\u001a\u001cက\u001c\u001f瀀\u0015\u001b瀀\u0017\u0018怀\u0015\u0019倀\u0015 䀀\u001c\u001f܀\u001f#ۀ\u001d\u001e　\u001b\u001e߀\u001d\u001e　\u001a\u0018　\u0015\u001a݀\u0019\u001c䀀\u001d\u001f\u0018\u001d倀\u0014\u0018က\u0015\u0019 \u001c\u001a　\u0019\u001c\u001b!ހ  ۀ\u001e\u001f䀀\u001c\u0018怀\u0019 䀀\u0015\u001b瀀\u0013\u0016退\u0010\u0018瀀\u0017\u001b \u001b\u001b܀\u001b\u001b倀\u001a\u0019䀀\u0019\u001fက\u001b\u001d \u001d$ \u001e$߀\u001f$܀ '܀\"%܀!'؀%(Ӏ(,ր \"ڀ#'ހ!!ހ\u0016\u0019怀\u0016\u001b怀\u0019\u0014䀀\u0019\u0017䀀\u0011\u001d怀\u0017\u0017倀\u0015\u001a耀\u0015\u001b退\u001a\u001e\u001b\u001d\u001c ڀ\u001f ܀\u001e\u001f \u001a\u001b܀ !߀$ ހ\u001d\u001fހ\u001c\u001d瀀\u0019\u0019耀\u0014\u001a䀀\u001a\u001b　\u001a\u001cހ\u001b\u001f݀\u001b\u001d䀀\u0015\u0017뀀\f\u0011\u0002\u0004\f\u0010\u000b\u0007\u0006\u0005\u0004\u0005\u0001\u0000\u0005\b\u0006\r\u000e\u0011\u000b\u000f\n\u000e퀀\u0013\u0014耀\u0014\u0017䀀\u0019\u001e݀\u001b\u001eހ\u001e\u001cက\u0017\u001a倀\u001a\u0015倀\u0018\u001c　\u001f ܀\u001c! \u001f ܀\u001e ݀\u001f\u001f܀\u001b\"က\u001b 䀀\u0019\u001b߀\u001e\u001fހ $׀)(Ӏ&+р,+Հ&.ـ$&؀\u001f!ۀ!%؀\u001e\u001f݀\u001a\u001eڀ\u001c\u001e܀ \"ۀ\u001e\"؀\u001d\u001f܀#%܀&\"؀ !　\u001f\"က\u001e\"က\u001c\u001b \u001a\u001d \u0016\u0018退\u0015\u0018怀\u0013\u0017瀀\u0015\u0017倀\u001a\u001c䀀\u0017\u001b倀\u0015\u0018　\u0014\u001a\u001d\u001eက\u001d$؀#!ր##ـ#$ڀ\u001c \u0017\u001b怀\u0010\u0014\u0010\r\u0005\u0006\u0002\u0002\u0001\u0001\u0006\u0002\u0004\u0001\n\u0001\u0004\u000b\n\u0012\u0015怀\u0019\u0018뀀\u0012\u001b\u001c\u001d倀\u001b\u001e䀀\u0019\u001dက\u0019!ހ\u001a\u001a \u0017\u0019 \u0017%䀀\u001b\"ۀ\u001e#݀\u001e\u0019ހ\u001d$ހ\u001c\u001d　\u001a\u001d　\u001a\u001a耀\u0018\u001b뀀\u0012\u0018ꀀ\u0010\u0015ꀀ\u0015\u0018怀\u0018\u0014뀀\u0010\u0014耀\u0015\u0012ꀀ\u0014\u0011쀀\u0011\u0010瀀\u0017\u001b瀀\u0011\u0015倀\u0014\u0015怀\u0011\u0010\f\u0010쀀\u0014\u0016뀀\u0013\u0014뀀\u0018\u001e\u001e!؀\"&؀\"&ـ\u001e\u001c߀\u001a\u001c \u0016\u0017怀\u0012\u0017ꀀ\u0010\u0011怀\u0015\u0017䀀\u0013\u0019　\u0014\u0013ꀀ\r\u0011\n\f\t\f\u0000\u000b\u000b\u001a\u001e2*-*;4=34.+$)\u001e \u001a\u001a\u0014\f\u0007\f\u0014退\u0010\u001c߀\u001f#Ԁ&*΀14Ȁ44π*0̀.1Ȁ97:@<A=C9<ŀ36Ȁ10΀,-ـ$%\u001d$　\u001a\u001d瀀\u0015\u0013\u000f\r\f\u000b\t\u0006\u0006\u0002\r\u0011\u0018\r\u0017\u0014\u0015\n\u0015\r\u000e\f\u0006\u0003\u0007\u0000\b\u0011耀\u0015\u0019䀀\u001b!؀&%Հ#)Ҁ*,̀-/π-.ʀ27ƀ77ƀ9;ŀ9>ŀ8;:;Ā39΀0.Ѐ,0π-.Ԁ&+ր'.р'(Ҁ'+ր#$߀\u001b\u001e退\u0010\u000e\n\n\u0006\r\u000b\u0010\f\u000f\r\u0014퀀\u000f\u0012退\u0016\u001c耀\u000f\u0017퀀\u0011\u0016怀\u0016\u0018瀀\u0014\u0018退\u0018\u001c倀\u001b\u001c䀀\u0019\u0019瀀\u0018\u001a퀀\u0010\u0016\r\u0016瀀\u000e\u001c怀\u0018\u001c倀\u001c\u001d܀\u001b\u001fހ\u0018\u0016瀀\u000e\u000e\u0003\u0002\r\u0005\u0013\u0011+$519&)\u001c$\u001c$ %#%\u0018 \u0018\u001b\u0015\u0012\u0011\u001b\r\u0011\n\u0004\u0003\u0002\u0006\u0010\u0014ꀀ\u0016\u001d߀\u001b ؀&*΀-1ǀ29ſ====?>8<77Ȁ57π.2Ѐ'*Հ'(ր #က\u0017\u001a \u0016\u0018　\u0015\u001d耀\u0011\u0013ꀀ\u0012\u0013퀀\u0014\u0011\n\f\u0006\n\u0001\u0005\n\u0003\u0003\u0002\u0005\u0007\u0002\u0005\u0004\f퀀\u000f\u000f뀀\u0013\u0018䀀\u0016\u0017ـ\u001e)Ѐ+-ʀ//̀.0ʀ,.π+,Հ#&ـ\u001e!߀\u0019\u001a瀀\u0012\u0016\u0012\u0014\f\r\u000b\u000e\u0006\u0005\b\t\u0004\u0005\b\u0001\u0006\u0005\u0001\u000b\u0000\u0011\u000b\u0011\r\u0011\u0006\u0007\u0004\u0001\u0003\u0002\b\r뀀\u0013\u0017䀀\u001b!ހ\u001e'Ԁ#&Ԁ')р,0̀-/Ҁ))׀\"$܀\u001a  \u001a\u001d怀\u0010\u0010\u000f\u000e\u0006\u0002\u0004\u0006\u0002\t\u0007\u0007\u0004\r\u000b\f\r\f\u0011퀀\u0011\u0015\u000e\u0012\u000b\r\u0003\t\f\u0006\u000b\u0010\r\n\f퀀\u0010\u0014怀\u0018\u001f܀\"#ـ%)Ҁ),΀+,΀/.Ѐ)'ր\u001f#݀\u001a\u001b怀\u0015\u0012\f\b\u0007\t\u0000\u0003\u0007\u0003\u0007\u0001\b\u0005\u0013\r\u0017\u000b\b\u0005\u0005\u0003\u0002\u0004\u0002\u0003\b\u0001\b\u0005\u0006\u0007\u0003\t\u0007\u0006\u0003\u000f\r\u000e\u0011\u0017倀\u0014\"׀&+΀/2Ȁ36ɀ11̀-)π(%؀!\"ހ\u001c\u001a怀\u0014\u000f\u0001\u0002\u0005\u0001\u0001\u0004\u0004\t\u000b\u0004\u0000\u0005\u0000\u0007\u0003\u0003\u0000\u0004\u0001\u0000\n\b\u000f\b\u0013\t\u0005\u0001\u0001\u0006\u0001\u0007\n\u000fꀀ\u0017\u0017߀\u001a!ۀ$&Ԁ*-Ѐ35::À7<ǀ77ǀ54̀+,Ӏ'&؀\u001e!瀀\u0016\u0018\b\r\u0002\u0004\u0007\u0003\u0000\t\u0006\f\u0004\u001c\u0014\u001a\u001b$\u001e\u001f\u001e\"\u0016\u0014\r\u0011\t\u0003\u0006\u0002\u0003\u0006\u0007\u000f\u000b\u0012쀀\u0012\u0016耀\u0016\u0016뀀\u0016\u0017倀\u0018\u0019!!׀!%؀&*׀%&ۀ\u001f\u001eހ\u001a\u001e\u001b\u0019ހ\u001c\u001e　\u0019\u0016耀\u0015\u0013퀀\r\t\n\u0001\u0001\u0003\b\u0006\u0004\u0004\u0003\u0004\u0005\b\u0004\u0003\u0003\u0001\u0003\b\u0002\u0006\u0002\u0006\t\u0002\u000b\u0000\f\r\u0010\u0016退\u0012\u001a䀀\u0016\u001bက\u001d\u001e׀ *Ӏ+-Ѐ,2Ҁ'&ۀ\u001c က\u001a\u0018耀\u000e\u0010\r\n\u0005\r\u0006\n쀀\u000f\u0015뀀\u000f\u0013\u0013\u0013뀀\r\u0014ꀀ\b\f\t\u000b\u0005\t\u0003\b\t\u000f\n\u0012퀀\u0010\u0016倀\u0014\u001cက\u001b\u001d \u001e%ր)/π01ƀ44ʀ00ɀ11̀..π'(ڀ\u001c\u001d怀\u0015\u0016뀀\t\u000f\u0000\u0005\u0006\u0004\u0014\u0010\u0014\u0014 \u0018\u0012\u0012\t\t\u000b\u0006\t\u0002\u0000\u0001\u0005\b\u0007\u0007\u0003\u0002\u0004\b\u0003\b\u0002\n\u0000\u0007\u0003\u0000\u0000\u0005\u0007\n\t\u0012퀀\u0011\u0017　\u0017\u0019 \u001d\u001dۀ\"\u001e݀%%\u001e!　\u001c\u001cꀀ\u0010\u0017퀀\r\u0012\u0005\r\u0005\u0004\u0001\u0001\u0005\b\u0002\u000b\u0004\u0019\u000e\u0011\u000b\n\b\r\u0003\u000b\b\t\u0003\u0005\u0000\u0000\u0006\b耀\u0015\u0017䀀\u001b!ـ\u001f(Ԁ&*΀-.̀26Ȁ58À=?¿>?>?þ;<5;Ā66Ȁ35ǀ20Ѐ/2ր)+׀' 瀀\u0013\u0010\u0003\t\n\u0007\u0019\u0015*$8<E?QDWHNBB00&)\u001d!\u0019\u001d\u0015\u0012\u0011\u0014\u000f\u0011\u000e\f\u0003\u0006\u0001\u0004\f\t\u0012倀\u0018\u001f߀!'Ԁ..̀36Ȁ04ʀ32ǀ23ˀ.0Ѐ-(ڀ\u001f\"　\u0019\u001b뀀\u0013\u001a瀀\u0012\u0010\r\f\u000b\n\u0007\b\u0000\u0004\u0004\u0006\b\u0000\u0005\u000b\u0001\u0006\n\u0003\u0005\u0005\u0007\u0005\u0002\u0007\u0010\u0014耀\u0014\u001eက\u001f ـ%+π-/Հ&)؀%)Հ!#ހ\u001c!䀀\u001d&ۀ \"ڀ#%ۀ\u001f\"က\u0017\u0017怀\u0011\u0012\t\u000e\u0006\u0007\u0006\u0007\u0006\u0004\u0001\t\u0005\u0005\u0005\u0006\u0001\u0007\u0005\u0001\u0002\u0000\u0006\u000e\u000f\u0011怀\u0010\u0016䀀\u001a\u0013쀀\u0014\u0018怀\u0018\u001dހ\u001b\u001dڀ %܀\"&؀$&ր#$݀\u001c!܀\u001c\u001a䀀\u0017\u0018䀀\u0016\u0016뀀\u0010\u0010쀀\u0012\u000f\u000b\u000e\n\r\u0004\u0001\u0005\u0002\u0003\u0001\u0006\u0004\u0000\u0001\u0001\u000b\u0003\u0003\u0007\u0005\u0006\n\r\n\b\u000b\u0015쀀\u0012\u0016 \u0017\u001e߀ 'ڀ#'Ԁ,,΀*-Ӏ('ր((Հ$&ڀ\u001e\u001eꀀ\u0016\u0016退\u0012\u0012\u0013\u0018\u0015\u0016\u000b\n\u0005\b\u0001\u0000\b\u0003\u0014\f\u000e\n\u0013\t\u0011\u0007\u0013\t\u000f\n\u000e\u0005\u000b\u0000\u0003\u0005\u0005\r\r\u0011\u0014ꀀ\u0017\u001f \u001c\"܀#$π*/Ԁ%)׀'(ր%$　\u001b 䀀\u0015\u0017\u000b\u000e\t\u0007\n\u0007\u0001\b\u0002\u0014\b\u0015\u000b\u0016\u000b\u0014\r\u0012\u000b\u000e\b\u000b\u0005\u0006\u0000\u0005\u0004\u0002\t\u000b\r\u000e\u0012\u000f\u0013쀀\u0012\u0018倀\u001a\u001eڀ\"(Ӏ.0ǀ56ɀ77Ȁ/1΀+.ր#&ހ\u001a\u001a瀀\u0010\u0018\u0005\f\u0005\u0005\u0001\u0004\u0002\u0001\u0001\t\u0001\u0006\u0003\u0001\u0001\u0001\u0003\u0004\n\u000b\u0012\u000f\u0014뀀\r\u000f\u0005\b\u0000\u0003\u0001\u0001\u0003\u0001\n\u0004\n\u0001\u0006\u0000\u0007\t\f\u0013耀\u0015\u001a䀀\u001b\u001f߀\u001a\u001eހ!$ڀ\"'ڀ #؀&$݀\u0019\u001fက\u001c\u001b退\u0014\u0017瀀\u000f\u0014\u0010\u0012\r\u000f\u0003\f\b\u0007\u0004\u0002\u0005\u0002\u0001\n\u0005\r\u0003\u0004\u0002\u0001\t\u0001\u0006\u0005\n\u0000\b\u0004\u0012倀\u001c\u001cۀ!&ր%)Ҁ('Ҁ(,Ѐ+*π'*Հ%%က\u001b\"䀀\u0019\u0018退\u0012\u0015\r\r\u0006\u0005\u0001\u0006\u0004\u0000\t\u0000\u0004\u0002\b\u0000\u0001\u0003\u0000\u0000\u0005\u0001\u0000\b\u0007\f\u0005\u0019\u000e\u0015\t\f\u0004\u0002\u0001\u0005\r\u000f\u0011\u001d \u001a\u001e݀\u001f'̀.3ǀ36ŀ43Ȁ14ˀ-*΀,)ـ&'؀\"#܀\u001c\u001c뀀\u000f\u0016ꀀ\u000e\u000b\n\u000b\b\f\u0001\u0001\u000b\t\u0019\n\u0019\u0013 \u0016\u0013\f\u0012\u0011\n\b\u0001\u0002\u0004\u0004\u0005\u0006\u000b퀀\r\u0013퀀\u0010\u0019倀\u001a!߀ 'ڀ#$ۀ $ڀ!$退\u001c\u001d뀀\u000b\u0010뀀\r\u000e\t\u0007\t\u0005\n\u0004\u0003\u0001\u0003\u0010\u0006\u0002\u000b\b\u0011\u0006\u0015\r\u0014\f \u000e\f\b\f\u0001\u0000\b\u0002\u0006\n\b퀀\u0010\u0014\u000b\r\r\u0012뀀\u0019\u001eހ\u001f#Հ+-̀15Ā77ž=>9A?CýAA>Aû?=Ā;9ƀ23Ԁ''ހ\u001f\u001d　\u0017\u001c쀀\u000e\u0010\f\f\u0001\u0002\b\u0002\u0012\u0017\"\u001f)/67BEPE`Xf]ibbYYSSIF@=,/&  \u0014\f\u0013\u0003\u0002\u0004\u0004\u000bꀀ\u000f\u0017䀀\u001b ܀#(Ԁ(,р,.̀,5ƀ21ʀ24̀/1̀./π'3р()؀#\u001f\u0018\u001d䀀\u0017\u0018　\u0015\u0014쀀\u0012\u0016뀀\u0012\u0012뀀\f\u0014퀀\u000f\n\n\u000b\u0000\u0006\b\u0001\n\u0001\u0006\u0007\u0002\r\u0007\n\u0006\u000b\u0005\r\u000b\u0013ꀀ\u0012\u001bက\u001b\u001d׀$'Ԁ)*Հ&)ڀ$$߀\u001b\u001f\u0015\u0016쀀\u000f\u000b\n\u0001\u0010\t\u0012\f\u0014\u0010\u001c\u0015\u001d\u001a\u001c\u0018\u001e\u001a\u001f\u0016\u001d\u0015\u001b\u0014\u0018\u0017 \u0013\u0019\u0012\u001a\u0012\u0019\u0012\f\u0005\u0007\u000b\u0013退\u000f\u0013倀\u001a\u0018ۀ\u001e\u001c܀#\"݀!!ـ%\"က\u001c \u001c\u001c倀\u0017\u0018퀀\u000f\f\u0006\u0005\u0001\u0011\u0003\u001b\u0012\u0014\u000f\n\n\u0010\u0003\r\b\u0012\u000b\u0011\u000e\u0011\f\u0015\u000e\u0017\t\t\u0002\u0007\u0001\u0004\u0001\b\t\u000e\u0015䀀\u001b\u001e߀\u001c\u001fހ\u001d\"ۀ \"߀\u001e က\u001c#က\u0017\u0019䀀\r\u0015\b\u000b\u0000\u0000\u0004\f\r\u0018\u0015\u001c\u0019#\u001a)\u001b\u001b\u0018\u001b\u0013\u0014\r\u000e\b\t\t\u0001\u0005\u0001\u0005\u0002\u0003\u0006\u0004\u0005\u0001\r\f\u000e倀\u0014\u0019ހ\u001b$ـ(*Ԁ()؀&(ڀ\"'က\u001f#ހ\u0018\u0019뀀\u000e\u0014\u0004\b\u0001\u0007\n\u0006\u0011\u0004\n\b\u0011\r\u001f\u0015!\u0013\u0018\u0013\u0015\u0010\u000e\u000e\u0015\u0007\u001b\u0012\u001a\u0014\u0017\u000e\u0012\u0005\u0002\u0003\r\u0010\u0012\u0011\u0019\u001c䀀\u0019 䀀\u001c\"\u001c\u001a倀\u001a\u001a倀\u0016\u0018耀\u0014\u0014退\u0012\u0011퀀\u0010\u0012\u000b\u0011\u0005\r\u0000\u0003\u0005\u0002\u0001\u0001\u0001\u000e\u0007\u000b\u0005\r\n\r\u000e\t\u0006\u000e\u0006\u0001\u0003\u0003\u0002\u0004\u0002\u0004\u0001\u0006\u0002\u0007\u0006\t\r\u0011쀀\u000f\u0015耀\u0018\u0018倀\u0017\u001d \u0019 ܀\u001e$ۀ%)Ҁ,-Հ&'ڀ\u001f!ހ\u001e\u001f倀\u0016\u0011퀀\u0012\u000e\f\u0006\u0005\u0001\u0004\u0001\u0003\u0007\u0002\u0004\t\b\f\r\f\f\f\u000b\u000b\n\n\u000b\u0007\b\b뀀\u000e\u000e耀\u0010\u001c퀀\u0015\u001d䀀\u0017\u001d\u001f\"Ԁ'&р,,΀.1Ȁ4:ƀ79@>;=:<À;<17ˀ./Ӏ&\"؀\u001f# \u0018\u0018퀀\f\u0012ꀀ\u0010\u0011퀀\u0010\u0011쀀\r\u0011뀀\u000e\u0015\u0011\u000f\r\u0016\f\u000f\n\u000e\u0004\u0006\u0005\u0004\u0001\u0007\u0005\f\u0005\u0001\u0003\u0005\u000b\u0004\u0005\u0003\u0002\u0001\u0005\u0003\u0002\u0004\u0006\u0002\u0002\u0003\u0000\t\u0002\t\u0005\f\u0000\b\u0002\b\b\u000f\t\n\u0013\u0010怀\u0014\u001a退\u001a\u001cހ\u001f!ހ!&က\u001b\u001c\u0019\u001c \u0019\u001c怀\u000f\u0013ꀀ\u0014\u0017\u0010\u0011ꀀ\u0011\u0012\u000f\u0014뀀\u0010\u0013\t\r\u0007\u0006\n\u000e\u0006\n\u0002\b\u0000\u0003\u0002\u0003\u0007\b\t\b\u0010\u0007\f\u0004\r\f\u000e\u000f\u0014퀀\u0013\u0013퀀\u000e\u0019耀\u0017\u0014耀\u0010\u000f쀀\u000f\u0010\u000b\r\f\u0010\n\u000b\u0003\u0003\u0007\t\u0007\u0007\u0014\u0010\u0014耀\u0012\u0012ꀀ\u0013\u0016怀\u0014\u0017瀀\u0013\u001d䀀\u001a\u0017退\u0016\u0012\u0012\u0014ꀀ\u000b\u0010뀀\u0011\u0014ꀀ\u0017\u0014뀀\u0014\u0017뀀\u0013\u0016쀀\u0014\u0019\u0010\u0010\u000b\t\n\u000e\b\b\u0006\f\n\n\t\u000f\n\u000b\u000b\u0012쀀\u0010\u0012뀀\u0010\u0014ꀀ\u000b\f\f\t\u0005\u0002\u0006\u0011\f\r\u000e\u0011퀀\u0011\u0013က\u0019\u001c܀\u001d\u001a怀\u0016\u0015\u000f\u0010\u000b\u0012\f\u0013\t\u000f\u000e\u0010\u000b\u0010\n\u000b\u0006\u0006\u0005\u0003\u0005\u0006\u0002\u0006\u0007\u0006\u0001\u0003\u0001\u0006\u0004\u0001\u0007\u0001\u0002\u0002\n\u0002\u0000\t\u0006\u000e\u0007\t\n\r\u0005\f\u0003\u0001\u0005\n\u0002\u0007\u0006\u0004\u0003\u0006\u0006\n\t\f\u0005\u000b\u0005\u0005\u0001\u0001\u0005\u0000\u0002\u0000\u0001\u0007\u0000\u0006\u0002\u0003\u0006\u0000\u0003\r\u0006\r\u0010\u0011退\u0010\u0010ꀀ\u0013\u0015뀀\u0011\u0015퀀\u0010\u0011\t\r\u0006\u000b\u000f\r\u0005\b\u0007\f\u0003\u0004\u0000\u0000\u0004\u0004\u0001\u0000\b\u0003\u0003\u0004\u0003\u0006\t\u0003\u0003\u0005\u000b\u0005\u0000\f\u0013\f\u0010퀀\u0016\u0017怀\u0014\u0019 \u0015\u0018ꀀ\u0013\u0014ꀀ\t\u0014\f\u000b\u0002\u0006\u0002\u0002\u0005\u0007\u0000\u0005\u0002\u0005\b\u0004\u0003\u0001\u0000\r\u0004\u0006\u0001\b\t\t\u0002\u0003\u0004\u0003\u0000\u0000\u0007\u0005\b\u0011\u0011\n\u0014\u000f\u0012퀀\r\u0013\b\n\u0007\u0007\u0004\n\u0003\t\u0006\u0007\u0000\u0001\u0004\u0002\u0004\u0003\b\u0006\u0001\u0001\b\u0005\u0004\u0000\u0004\u0006\u0002\u0006\u0001\r\u0003\u000b\u0006\r\r\u0010\t\n\n\r\u0007\u000b\u0005\u0006\u0000\u0003\u0003\u0001\t\r\u0002\u0012\u0006\u000e\u0006\u000b\u0000\u0006\u0001\u0004\u0002\u0007\u0000\n\u0006\u0007\u0002\u0007\u0002\u0001\f\u0006\u0001\b\u0006\u0001\u0006\u0004\u0006\u0006\u0004\u000b\n\u000e\f\u0010ꀀ\u0011\u0013ꀀ\u000f\u0013\f\u0011뀀\n\r\u0010\r\n\u0005\u0001\u0001\u0006\u0004\u0004\t\u0004\u0005\u0006\u0005\u0000\u0003\u0000\u0002\b\u000e\n\u0006\u0005\u0004\u0000\t\u0006\u0005\u0004\u000e\r\u000b\u0007\u0001\u0005\u0007\t\u0002\f\u0000\t\t\u0001\u0007\u0002\n\u0000\u0003\b\u0001\u0006\u0005\u000b\f\u000e\n\r\n\u000f쀀\u000f\u000e쀀\u0014\u0016\u0014\u0015뀀\u0013\u0016쀀\u0011\u0011쀀\f\r\t\u0010\t\t\u0004\u0007\u0001\u0004\u0005\u0006\u0000\u0000\u0011\t\u0011\u000b\u0014\u0004\u0011\u000e\f\b\u0001\u0007\u0002\u0004\u0002\u0007\u0003\u0011\n\u000e\u000b\u0011\b\u000e\u0007\u0010\u0002\u000b\u0006\u0001\u0000\u0001\u0004\u0001\u0000\u0002\u0002\t\u0000\u0002\u0005\u0002\n\u0002\u0007\u0000\b\r\u000b\r\n\u000f\u000f\u0014쀀\r\u0012瀀\u0010\u0013쀀\u0013\u0016ꀀ\u0015\u0016退\u0016\u0019耀\u001a\u001a倀\u0013\u0017瀀\u0013\u0015\u000b\u0012\n\f\u0004\u0006\u0002\u0003\u0003\t\u0000\u0006\u0007\u0002\u0017\t\u001b\u0017\u001a\u001d!\u0017\u001d\u0015\u001b\u000b\u0017\u000b\u0014\u0007\r\u0005\u0015\n\u0013\n\u0012\u0004\u0013\t\u0010\u0004\b\u0003\u0004\u0001\u0004\u0000\u0004\u000b\t\r\n\u0000\u0002\u0003\b\u000e\u0006\u0012\u0004\u0012\f\u0011\u000b\u000e\t\u000b\u0004\u0005\u0006\f\t\f\u0004\u0004\u0006\u000b\b\u000b\u0005\u000b\u0004\t\u0002\u000b\u0001\r\u0004\t\u0007\u0004\u0004\u0002\u0006\t\t\u0002\u0000\u0004\u0002\u0003\u0004\u0000\u0001\u0006\u0001\t\u0004\b\n\u000b\u0003\u0002\u0005\u0006\u0002\u0003\f\u0004\u0006\u0003\u000e\u000b\u000f\n\u0013\r\u0017\u0013\u0012\u0010\u001a\u0016\u001a\u0015\u0018\u000b\u0015\r\u000f\u0007\u000f\b\f\u0005\u0012\f\u0014\u0014\u001c\u0018\u000f\t\u000e\u0006\n\u0002\u0000\u0006\u0004\u0005\n\t\u0005\u0001\u0001\u0001\u0000\u0003\n\u0001\u0001\u0004\u000f\u0005\u0004\u0004\t\u0004\u000b\u0003\r\u0004\u0000\u0006\u0003\u000f\n\u0011\u000f\u0011\u0002\u0013\r\t\u0003\u000b\n\u0015\u0006\u0012\u000b\u0011\f\u000e\b\u000b\u0004\u0011\u000b\u0010\u0002\u0014\u000f\u0015\u0014\u0013\r\u0012\u0007\u0011\f\u000e\u0004\u0004\b\t\u0007\n\u0004\r\b\r\u0005\u000b\u0003\u0000\u0007\u0004\u0004\u0002\u0001\u0004\u0003\t\u0001\u0006\u0007\u0001\u0003\u0006\u0001\u0000\n\u0007\u001a\u0011\u0019\u0018\u0018\u0011\u0012\f\u0016\u0010\n\u0004\u0001\u0003\u0005\f\r\u0006\u000f퀀\u0011\u000e\f\f\u0004\t\u0005\b\u0001\u0005\u0005\u0001\u0006\u0001\u0003\u0004\u0004\u0005\u0000\u0003\u0000\u0004\u0000\u0000\u0001\u0000\u000b\u0007\u000f\u0006\u0015\u000e\b\u0002\t\u0007\u0007\u0006\f\u0007\u0015\u0011\u000b\u0002\u0000\u0006\u0007\u0002\f\u0007\u0006\u0002\u0004\u0000\u0004\u0001\b\u0001\u0001\u0006\u0000\t\u000b\u000b\t\u000b\t\u0018\u000f\u0019\u0010%\u0012\u0013\u000f\u0011\t\t\u0006\u0007\u0005\u0002\u0007\u0004\b\u0006\n\u0004\u0006\u0003\b\u0002\f\u0002\u000b\u0007\u0011\b\u000e\u0003\u0005\u0000\n\u0002\u0002\u0004\u0003쀀\u000f\u0010\u0000\u0006\u0001\u0004\u0001\u0000\u0003\u0001\u0007\u0006\u0007\u0005\u0007\u0007\u0007\n\u0007\u000b\t\n\b\r\u0002\u0004\f\u0004\u0003\u0003\t\u0003\u0006\u0001\u0003\u0003\u0000\u0006\u0005\b\u0004\u000b\u0005\u000e\u0007\u0000\u0006\u0005\u0001\b\u0003\u0002\u0006\u0006\u0003\u0006\u0004\u0001\u0001\u0000\u0002\b\u0005\u000b\b\u000e\t\u0014\b\u0013\u000b\r\u0005\u000f\u0002\n\u0004\u000f\u0000\b\u0003\u000f\t\u0010\u0004\u0015\u0010\u0010\u0007\f\u0007\t\b\u0001\u0010\f\u0011\n\u0014\u0011\u000f\u000e$\u000f\u000f\u0007\b\u0001\u0003\u0000\u0000\u0000\u0006\u0005\u0007\u0000\u000e\u0001\u0003\u0007\u0000\f\u0003\u0012\f\u0015\u0010\u0013\u000b\u0011\n\u000f\u0000\u0004\u0007\u0006\b\u0010\u000b\u0010\u0006\n\u0002\t\u0003\u0007\u0003\u0002\t\u0001\t\u0004\u000b\t\u0013\u0007\u0000\u0007\u0005\u0019\u000f\u0012\u000b\u0013\f\u0017\t\u0015\u0017\u001a\u0014\"\u0016\u001e\u0011\u0014\r\u0015\u000f\u0013\u000b\u0010\u0005\u0010\f\b\u0005\f\u0003\u0002\u0003\u0000\u0006\u0007\u0002\u0015\u0004\u0017\r\u0019\u0019\u001a\u0012\u001f\u0017\u001e\u0013\u001f\u0019\u001f\u001b\u001b\u0011\u001b\u0013\u0015\n\r\u0005\u0004\u0006\u0005\t\r\u000e\u0013\u0016쀀\u0011\u0015\r\u0012\u000e\u000e\b\u0013\u000e\u0012\f\u0010\r\u0010\n\t\t\u000b\t\u0010\u0004\u0007\u0000\u0001\u0002\u0004\u0001\u0000\u0000\u0000\u0005\u0006\u0001\u000e\u0000\u0002\u0001\u0003\b\u0001\b\u0001\u0002\b\u0006\u0000\n\u0000\u0010\u0006\u0012\f\u0013\u000e\u0013\f\u0018\f\u0015\b\u0011\u0014\b\u0001\u0002\t\u0002\u0005\t\u0002\u0001\u0006\u0006\u0004\u0000\u0002\u000b\t\u000f\r\u0010\t\r\u0007\f\f\f\b\u000b\u0005\u0003\u0001\t\b\u0007\u000b\u0000\u0004\u0003\u0003\u0003\b\u0004\u0000\u0000\u000e\u0003\u000e\n\f\b\u0002\u000b\u0007\u0011\u0006\u0013\u0011\u0017\u0010\u0011\u000e\u0015\u0017 \u0013\u0016\u000f\u0011\f\u0010\u0007\r\n\r\b\u001a\r\u0013\u0013\u0018\u0018'\u001a\u001d\u0013\u0016\u0010\u0016\u0014\u001c\u0012\u0014\u0004\f\u0005\u0007\u000f\u0000\t\u0007\u000e\u0007\f\u000f\u0019\u001c$$1'4*5&*!\u001c\u0012\u001c\u000e\u0013\u0006\u0003\u0001\u0007\t\f\b\u000b\u0006\u0007\u0005\u0000\u0003\u000f\u0004\u000b\u000b\u0011\u0004\u0016\n\u0001\u0003\u0000\u0002\u0006\u0006\b\u0000\u0001\u0005\u0004\b\u0002\u0000\r\u0007\u000e\u0005\u0015\u0012\u0018\u0010\u001b\u0015\u0017\u0011\u001a\u0010%\u0015#\u001d!\u001e\"\u0019\u001c\u001b\u001d\u0012\u001a\u0014\u0013\u0010\u0018\u0019$\u0014\u0012\u0015\u0013\b\u0016\u0000\u0010\n\u0015\u000f\u0012\u0010\u0017\u000f!\u000f&\u0017 \u0018(\u0016#\u0018\u0010\r\f\u0004\u000b\f\u0001\u000b\u0007\u0005\b\u0003\t\u0004\t\r\u0000\u0011\n\u0018\u000b\u0018\u0010\u0016\u0015)\u001d*\"*#0 #\u001f\" \u001f\u001b$\u001b\u0019\u001a\u001d \u001d\u0014\u0013\b\u0013\t\u0010\u0010\u0013\u0010\u001b\u0011\u0017\u0013 \u0016%\u0014\u0015\u000f\u001f\u001c\u001f\u0016\u001b\u001c\u001b\u0016\u0013\u0014\u001b\u000f\u001c\u001e\u0011\u0010\u001d\u0017\u001c\u001f!\u001a\u001f\u0016\u0015\u0012\u0015\u0015\u001b\u0015\u001e\u0016\u001e\u0016+%,#(\u001b\u001b\u001d(\u0016\u001d\u0018\"\u0018\u001c\u0016\u0019\u0014\u001d\u001b\u001d\u001a\u0016\u0014\u0016\u0015\u001e\u0017&\u001a&\u001c+!-%.7<.9+/&/\u001e.*1'+$)# \u001a\u0014\u000f\u0015\f\u0010\f\f\n\f\t\u0015\u0007\u0012\u000e\u000f\u000b\u0017\u0011\u0018\u000f\u0013\b\u0013\u000e\u0014\u000b\u001a\u0015\u001c\u001a\u001d\u0017\u001e\u0019(! \u0019\"\u0019\u001d\u0011\u0016\u0010\u001b\u000f \u001a$\u001c\u0017\t\u0015\u0010\u001e\u0017\u001e\u0017\u001d\u001e\u001b\u001b\u001c\u0012\u0016\u000f\u0013\f\f\u0006\f\u0005\u0012\u000f\u0013\u0007\u0007\u0003\u000b\u0002\u0006\n\u0005\b\u0002\u0007\u0005\b\t\u000b\u0005\u000b\u0005\n\u0003\u0010\u0011\u0019\u0019\u001c\u0012\u0018\r\u0014\u0015\u001b\u0019 \u001a$\u0015# #\u0018\"\u001c*\u001a\u001e\u001c#\u001f!\u0018\u001d\u0014\u0019\u0017#\u0019\u001f\u001f0#) \"\u0018\u001d\u0016\u001c\u0010\u0018\u000f\u000e\u0004\u0003\u0000\u0000\b\b\u0012\u000b\u0011\t\f\u0005\u0000\u0005\f\u0007\u0013\r\u0015\u0018$'1$+'3,02@+/*&#!\u0019%!\u001c\u0019\u001e\u0012\u0016\u000e\u0015\u0012\u001a\u0018\u001c\u000f\u001a\u0017\u001e\u0015 \u0019\u001c\u001a\u001d\u0015 \u0015#\u0019\u001f\u0017\"\u0019' !$)%#!)!% \u0017\u0018\u0014\u000e\u0019\u0013\u0017\u0015%\u0013\u001c\u0016* -1.*) %\u001a\u000f\t\u000e\u0002\u0001\u0000\t\u0000\u0003\f\u0000\u0003\n\u0004\u0004\u0007\u0000\t\b\r\n\u0012\u0007\u0014\n\u000b\u0002\u0003\t\u0004\u0000\u000b\u0005\r\u0006\u0013\b\r\u0003\n\u000b\u0014\u0011\u0017\u0014&\u001f&\u001d&\u001c$'/(&\"*\u0015\u001c\u001e\u001b\u0011\u001b\r\u0014\u0012\u0017\f\u0019\u001c\u0017\u0018\u0018\u0011\u001d\u0012\u0016\u0019\u001a\u0016\u001f\u0018$\u001f #*%862+-%3\u001c*\u0016\u001e\u000f\u001c\u0011\u0015\f\u0018\u0014\u0018\u0012\r\u000e\r\u0005\u0014\u000e\u0015\u0011\u0014\u0013\u001c\r\u0017\u0010\u0013\u000f\u001b\u0013\u0010\f\u0010\u0005\u0012\u000b\r\u000e\r\u0003\n\t\u0017\u0017 \u001c#&*\u001e\u001f\u0018\"\u0016\u001d\u0011\n\u0005\u0002\u0005\t\n\u000b\t\n\u0001\u0005\u0002\u0004\u0013\n\u0014\u0013\u0012\u000e\u001c\u0015\u001e\u001e,\u001e!\u001a\"\u001e(\u001a \u0018\u0015\u000f\u001d\u0018\u001a\u0014\u001a\u0016\u001e\u0019\u001a\u0012\u001e\u0010\u001e\u0017\u0016\u0011\u0013\u000b\u0014\t\u0010\u000b\u0013\u000b\u0011\f\u0014\u0012\u000f\u000f\u0015\f\u0017\u0011\n\b\u0011\n\u0014\u0010\u0010\r!\u0012\u001f\u001b$\u001c$\u001a!\u0019\u001c\u001a\u001f\u0019\u001a\u0015\u0014\u000f\u001b\u0018\u001e\u0017&\u001c$\u001a%\u001d+&)!+.62%(!\u001f$\u001d\u0014\u0016\u000e\f\u0017\u000f\u000f\u000b\u000e\t\u0012\u0011\u0017\u0011\u001b\u0017\"!% \u001a\u0015\u001a\u0012\u0012\u0012\u0011\u000f\u0019\n\u0019\u000b\u001b\u0013\u0017\u0011\u001d\u0013\u0016\u0013\u0013\u0011\u001a\u0017\u0014\u0010\u0014\f\u0010\n\f\u0007\u000f\f\u001f\u0015$%+\"\"\u001b \u001b)\u001e$\u0019\u0016\f\u001c\u000b\u000e\u000b\u000e\f\u000e\n\u0011\r\u001b\u0017\u0017\u0017\u000e\u0011\u0012\b\u000f\u0016\u001f\u0017%\u001a\u0019\u0015\u001d\u0015\u001c &%<3GAZYRN\\RQT`TNAWFMHKCJ;A1E5B4<4;2,%)$ \u0014\u001e\u000e\f\u0003\u0001\u0007\u0012쀀\u0011\u0016瀀\u0016\u0019怀\u001a\u0019䀀\u001e!က\u001b\u001a瀀\u0016\u001d耀\u0013\u0017\u0007\u0010\u0002\u0003\u0006\n\u0011\u0011\u0017\u001b0(<4C8G>YWVPZUZSdP\\RQGBE=5. )\" \u001a\u0019\u0010\u0013\b\t\u0004\u0002\u0002\u0006\b\u0001\u0004\u0005\u0003\u0006\u0000\u0006\u0001\u0001\u0001\b\u0005\u0012\r\u0017\u000f!\u001d$\u0017'&-\u001e3)5/1#,,:+/$%\u0018\u001b\u0015\u001a\u000e\"\u001d$\u0014\u001a\u0014\u000f\u0001\u0001\u0006\f\r退\u0015\u0019倀\u0018\u001b　\u001d\u001f \u0017\u001a耀\u0011\u0014퀀\t\u000b\u0006\u0004\u0001\u0000\b\u0005\u0018\u0011*\u001b0+8*77B6D:C=G=419#/(,*( ))\u001f\u0012\"\u000e\u0002\u0000\u0000\u0004\u0003\u0000\u0001\u0002\u0001\u0003\u0001\u0007\u0006\n\u0006\u0019\r\u001c\u0016'\u001d*'>6@<CC>::7@632\"\u0018 \u0014#\u000e\u001f\u0017\u001c\u0016\u0015\u0012\u0011\n\u0000\u0005\u0001\u0003\u0003\u0005\b\b\r\u000b\u0010\u0006\u000e\u0006\u0003\u000b\f\b\n\u0002\u000b\u0003\f\f\u0014\u001a(!86½HBQM\\MKJTA<-4(>/?:6<A6GCM5;+\u001b\u0017\r\u0004\u0002\u0007\u0001\u0013\u0012倀\u0017\u0016怀\u0019\u001b怀\u0019\u0018倀\u0018\u001a怀\u000e\u0015\u000f\u0010\u0005\u0007\n\u0004\u0010\u0015\"# \u001f5+:/ECA7B=;,B4=45$-#%\u001f$\u001b\u0019\u0017\u0019\u0011\t\u0001\u0007\u0004\f\r\r뀀\u0013\u001c䀀\u0018\u0019܀\u001f%؀!*Ӏ%(Ҁ-,΀(+Ԁ*+Հ%&ۀ\u001f\"倀\u0018\u0014쀀\u0010\n\u0000\u0002\u0007\u0001\u000e\u000b\u0018\u0018-\u001e50C891.%0&+$+#.).'5/6+=53085B==8M8I;GAG=F;JJUPcdgbrlgXYORRM?K>G<K=C;>1/,+!&\"\u001f\u0017\u0014\u0004\n\u0001\u0002\u0002\u0006\u0006\u0001\u0002\b\u0001\u0002\b\u0005\u0007\u0013\u0013退\u0012\u0016\u000e\u0012\u000b\u000e\t\u000b\u0004\u0001\u0002\n\u0007\u0016\u0011\u001b\u0017)!)%,*2,2,765)0+*%0&.+!\u0018 \u0019\u001a\u0017\u0016\u000e\u000e\u0006\u000f\u0004\u0010\u0006\u0012\b\u0017\u0010\u0012\u0013\u001d\u0018\u001b\u0017%\u001b0)9/7/F:44;3<67,6&90<5=/?3?3?*+&#\u0011\u0010\b\u000b\u0000\u0004\u0001\b\u0005\u0006\n\u0005\u0006\u0005\u0002\u0005\u0014\f\u001f\u001a#\u001f#$1$;.95<1/0-%7/>:@:A;:17.( \u001d\r\u0014\u000b\u0003\u0007\r\r\u000b\u000f쀀\f\r뀀\n\u0015退\u0011\u000f\f\u000e\u0005\u0005\u0003\u0006\u0007\u000f\u000f\u001e\u001b3-:2>/>1B6>5JBNEPLYNULTKB@1*9*)\u001b\u001f\u0010\u0017\u000b\u000b\u0002\u0000\u0001\u0007\u000f\u000e\u0006\u0007\u0006\u0006\u0005\u0000\u0010\u0006\u0015\u0013\u0011\u000e\u001a\u0011\u0019\u0013\u001b\u0011 \u0015 \u001b)#5-?55)4!1*' \u001d\u0015\u0017\u000e\u0016\t\u0016\b\u0007\u0000\u0005\u0006\t\u0010\u0004\b\u0005\f\u0003\u0002\u0002\u0010\b\u0018\u0014\"\u001a$\u001f%\u001f4+7064B=A=E8=6<>JBOIG8C@@@>5;33#&\u0018\u0019\u0010\u001c\u000b\u0012\b\t\b\u0011\u0006\r\u0007\u0010\u0007\u0019\u000f!\u000f\u001c\u0012\u0015\u0012\u001c\u001a,\u001a0-:7A9A;>6;8457/>,)%+$(\"&$6\u001e\u001c\u0016\u001f\u0016\u0015\r\u0007\u0002\u0006\u0004\u0005\u0003\u0006\t\u0006\n\u0000\u000e\u0007\f\u000e\u0018\u0016\"!!\u001a)\"/\":12/.%1\u001f\u001f\u001f-&3-.((#\u0018\u0011\u001a\u0016\u0019\u0014\u001f\u0017\u0019\u0018\r\r\u0010\t\u0002\u0006\f\u000e\u0015쀀\u0011\u0011\n\u000f\u0007\u0007\u0000\u0004\u0004\u0005\u0004\u0005\u0000\u0010\u000f\u001b\u001a8.A<GHbVekbPSIL?KFEGE=;?>;2%(\u001e%\u001b\u001d\u0015\u0017\u000e\t\u000b\u0004\u0003\u0003\u0006\t\u000f怀\u0017\u001b \u001e ݀\u001f$܀\u001f$ـ%!ـ\"$݀\u001c\u001a \u001b\u001e瀀\u0016\u0013\t\u0006퀀\n\u000f\u0004\u0006\u0002\u0000\u0004\u0002\u0001\r\u000b\u001f\u001c*\u001e/$2%+ +$-#.#* -\"0(822&2//+)!%\u0019,\"!\u001e)*53?;HJd\\kiytslsjo_ZMRGO=C7/'\u001f\u001b!\u0012\u0016\r\u0017\r\u0014\n\u000e\b\u0000\u0007\b\u000f\u0012倀\u0018\u0019倀\u0017\u001d瀀\u0012\u0016퀀\u0011\u0011\n\f\u0000\u0003\u0005\u0000\u0000\n\t\u001d\u0018%#5(33G>JCMOXX_[d^dX`L]KC<FFE;A4/2/)\"\u0016\u0015\u0010\u0010\f\f\u0005\u0000\u0002\n\u0002\u0010\u000b\u0000\u000e\u000f\u0014\u0011\u001d\u0018(&9/:3>3J@RDWIWNYLXPNLH@H6?35,-(.\u001e\u001e \u001d\r\t\u0002\u0007\u0006\u000b\f\u0010퀀\u000e\u0010\u0007\u000f\u0005\t\u0007\u000b\u0013\u0015+ 3&8.HCX]a`khdcpZkpocegsjg_]UTGN78/1)'\u001c\u0017\u000f\u0010\u0004\b\u0002\u0003\u0006\u0001\u0004\u0004\u0003\u0006\u0000\u000b\u0006\u0013\u000e\u001a\f\u0011\u000e\u0012\n\u001f\u0017(\"/*3):;B;59@6@?IBTFUJTLSHHC<<85,!\"\u0013\u0010\n\r\u0006\u0006\u0007\t\b\t\u0005\n\u000b\u0012\u0003\u0006\u0001\u0003\u0003\f\u0003\u0010\u0015 #1,CARHSHaUf]f^jWXT[OQMMAC31-1)) \u001f\u001f\"\u0014\u000f\u0007\u0001\u0004\u0006\b\r\u000e\u000f\u0016쀀\u0013\u0019뀀\u000f\u0013\u000b\u000e\u0001\u0000\u0003\u0003\u0001\u001a\u0011'\u001f/3<2G>¾M@PCYIZL\\ST@MAüLCNDGHIAA., \u0019\u000e\u0010\u0001\u0005\u0002\u0000\u0001\u0006\b\f\u0010\u0013뀀\u0010\u0013퀀\n\u000b\u0005\u0003\u0006\u000f\r!\u001a,,7;A;VPaXjdg_c`pqsal^cPLGI;E4?0551..*$\u001c\u001e\t\f\u0005\b\u0004\u0003\u0004\u0002\u0002\u000e\b\u0013\f\u0019\u0015 \u00197.639@B>ſJJWJ[X[W[XWKOEFAFISMfYdPZFA;9,521*3-+ *#'&\u001a\u0016&!$''\u0019)\u001c/(2(70EBP?PEJJM?OGBALAEAQDKJMKSCZH[NKB=6,'\u001f\u0016\u0016\f\f\u0007\u0003\u0000\u0001\u0005\u0001\n\u0003\u0006\n\u0006\r\u000b\n\n\n\u0000\u0004\n\u0006\u0003\t\u0001\u0006\u0001\t\u0002\u0001\f\n\u000f\f\u0019\f\"\u001b,-;7PGknzxnsjbT[MOFF49,2\u001f\u001f\u0018\u000f\u0011\u0013\r\t\u0000\u0007\u0000\t\f\r\u0010\u0013\u0014뀀\u000e\u0010쀀\u0010\u0013\u0007\n\u0006\u0005\u0002\f\n#\u001f,);2E>IJVR_QXPXGNBJ=;8B3:36.3.?2C7;-5#&\u0013\u0013\u000f\u0014\u0007\t\u0005\u0007\u0004\u0013\f\u0015\b\u0015\r\u0016\u001a&+9:JBZF^Zlcykxzxpjc^TVU_NC<D61*+ \u001c\u001c\u000f\u0002\u0000\u0004\u0001\b\u000f\u0016退\u0015\u0019䀀\u0015\u0018쀀\n\u0010\u0004\u0006\u0001\u000f\t\u001b\u0010$$3,@<MH_PgZ^O[Ua_h[h\\g^iiqhfbhSL@E1/#'\u001a\u0017\u0013\u000e\u0003\b\u0000\r\u0004\r\t\u000e\n\u0016\u000f\u001f\u0019'+:;SMRPTNaXTTbcnannxo|sshm\\fPeZY[ZSUKI@8-'\u001d\u0017\u000e\u000b\u0001\u0001\u0003\u0007\u0007\u0010退\r\u0011쀀\u0010\u0011퀀\u000f\u000b\u0013\u0012뀀\u000e\u0015\n\u0010쀀\f\u000f\r\u000e\u0007\u0007\u0001\b\u0004\u0016\u000e\u001e#+'&(5)6-427'74;4B7PINNOIQGTMPJGFRFVKWOSKPGNCREK@==@9NELDDEH<K<A9C1;5>:B99,0-/(3/&**),)2,3)83E;O?A6I@D<C5G@JL[[[OUH`X`XZXVHSOG@@<=:549:@4709+C:46956)0(#!2 .(+'+-9+C4B7G:?8;6D>EDSILTMHYNWQ^QXN\\V_WVVRKRDQGLBDBL>@?E:;<A3:0=1>1948)5-0&0!.%6-4&6);(8/>5@:<9<7M;KCOGB?98=1;8A3885/39<2;790.-45=+?554?3F7D<QFJD>9<;E76791E9A2>09:H<þOAF<C;CBE8010'0'*(3058E<H;D8FAQN^ZdZZW\\DRIN>H;>7<16+/,92?8A68./1:4A5M>I;KCI=I;G8=;;.4-7-/$(\u0019)!*%-31+I@G?QI`Taed`fY_Wb[na`\\QJSAG@E<LEOLbMZPUJR>K@J<DDCHMHRCTSaOTL_R\\VTDPHC6RBHAE?B@ļQG=>D>MBGA>:7.<-:*757,:4CAHBLFWKUOXEQ>G7C5B>:2'\u001e\u001f\u001a&\u001e#\u001c$\u0014\u0019\u0015\u001e$\"\u001b' ##0+?5D<?9G8H@A4?7;0C;I?J@A8C8=;?2@5D:GFNIMD[MYEF<NFF1ECEBHFA<F:B9B=J;I8B;A:B8;=JCKDUXYMVRMHTKZOZP^UaPdX]SZH[V^PZOGEFA»M2@<:7M7G=A@F?GBK?MCQJ[IQNZMVLXLXMZMWQeQ^RNRMM]Me_jcp[_NQN[QaSTFQ@K<B:=;IC@ANFQ:D6=535;89./)1,B06;B7GBQIRISHLCG792@7D>D<OPONUR^Xmdobscf\\`\\UMZHUGMDJED7G9D?IAPKRM[QVF_T_USM^XdZbZWW_LaN_X\\MYINHOIYKSAHFLJYUgZeX`UVMPJUCOGLKXQSQ]I\\KYLREVOYZeX^Y\\JUU`QRGZOLNHDXBK=C;ýYC`VRVc[WQVKIBD:9'D8I8J@=7A>A;?49->4711/7-3':<VBSHZJ_RaSYLVO`Qb[]^_QRIODJDOLVSTIUGFCC:<;G<ǿDCNJZT[RYKVV_QMKUT]Q^YWGPFNDK@=6</=0=7723*7.7355?8A7@=M=ûG@PH`Vc^lellylxgjbfWZU^W\\Xbao`_SVUKAFED;:9:2A8P?SFJ@K>KFIAIAI1B7B8@5@685:7D2A=K?J@A:CELKW[a_bZ^X`H[M\\RPHKDCAK>KBRB>:E=D?OJVHaS`WbT\\XVOYSMKYNZT^_ndiVZGHA?9@8=3<162><I5C=I8H:QLTNYQ_Z\\Q`[a]^Xc\\kSlckgf\\]UaM^QPLK@P@@@IGMJQLE>RFRLWI[RZMYW[VWX^TbYcXf_aX`S]P`YiXa`i_vl|rqxqp[e[ocf`j]m]`Q_Qh]l_i]`V[OZYgYi]_RTKPRTSVYdVURUOWJS@RI[F[MPTXUUMVNb]iYeWWRaWXUZXbUPFLKQQULMCP=;0@72<A8J>M=WR[Sm`e\\cRVSZFGBRIHNZJSKNDG3A26*?/(\u001f$!\u001c\u0017$#+#12=3;3OIbRbWaM]NSNZOWHNJJDMFWOXJcRQFVQMMVNUJPNNKII`Ugdlep_oanU]XVPYHMHKCTFF?5/1'7',,-2@7IGSAZS\\PWLGCCMXIOKSSZY[RSLVPTTTCSV\\ZbRNELCNEPPMKWUdY\\[l`ypuirjief[a\\jWhYcX[[\\RXMWP\\Uhh_]kWn[temnwmxrypunrk^VXTYQfQYMPCHCA3=6L=@7QF^[hUdYb\\j_jYfTeV[KNENDPILHQKYMQKZPdPgYbSfag[WT]R[]e[iZoYdgjZ_R`Q\\LVVaY]WdQRQK@?9G;OLQLMGJ=EAHCG;B?KJE<FELKM<E?PDNDNHSJaVYPPKOGNBZR[YdM\\IUJOLSFVRPMT?F;3),\u001f8'30KAQGNHHEFFDJXMeXdeh]\\OcMVEJBD:A>C6þB?M==:A9??L?QBD@@@UJV_kdxm{qxr{zqj_V\\L^JWNXQRHJDK@J>><>;F:C7B@TJeUlgz_ut{tuixvvnm\\bXdVcTTOYLdYh\\ZRk`eapk{jtkqggc`beYd_`L^KQFG>:-30?9=6IBTRd\\gZ]ZlUmbugyn}l|w{srmxdof]_\\JI<A/-\u001d\"\u0012\u0015\u0007\f\u0005\b\u0007\r\f\u0011퀀\u0013\u0010\b\u0007\u0003\u0011\f\u0015\u0011\u0015\u0010\u001d\u0018*\"/&9087I@KITHSRXP\\Me\\l`umzy}lvpqveuk|u~qvpzhwkwkq\\aOD0-\u001f\u001a\r\u0017\b\u0012\r\u0015\u000b\u001a\u0011 \u0011\"\u001d0)62LL`[xnz{|tpsa]DK51%&\u001f\u001c\u0017\u001b\u0018\u001b\u0017\u001a\u0011\u001a\u0018+';7JJ`\\roque`NREA79(.\"2%&-=595;5D=DEUQhbsfplzv}z~|zxrjga_T[ZA15'(%'\u001f%\u0019\"\u0016\"\u001a1+81MFTJaWjTd`mjpmeqjwlx{swxv{uugj_]QJ>D6-*6(6.<>TJZZjistq{}}y{o~pp~uyjmg_[KC?94,..,':+1,;0E:E;FGD;OBPK\\We_c]haf`g\\paYZ_PZSZN_RTONEC=74;)646,4.8.;3:8E:RPidst}~yu{}x|zsm]bSI>8%-\u001f\u001d\u001b\u001f\u0017\u0015\u0012\u001c\u0011! ,(;>DEYXk`upui`R\\ON=9-3$\u001e\u001b\u0019\u0011\u0018\u0019\u0013\u000b\u000e\u000b\r\u000f\u001a\u0018&&34MEa[klvq~}}}z~{rvow`ob[M@5700\u001f%\u0018\u0011\t\u000e\u0006\u0005\t\u0005\r\u0007\u000e\u0005\u000b\b\f\u0003\u0014\u000f\u001d\u001d(#61>1@8E<PFWYniwq{ppiyb}vxxv}|qm`ZLG//)%\u001e\u001f\u001a\u0019\r\u0014\u000f\u001a\u0018%\u001d.(7232><C=LF\\So^sl}yzsrij\\kboQaZiXl\\fYkj`^S@W@?:71!\u001c*\u001f.)94MHg`z|wfgZeXUKM>D34.-\u001a#\u0013\u001b\u0017&$1,C8RMf`wvzhldkZl^f\\bUr^^LQG<70(-\u001f*)8.><LKdYvso\\WMMH82/&-,;.8.=0:2A=MFWVkZxp|rfZdTZGA0;&##\u001e\u001a#\u001a(#;5RNh^qmxr~{ncVK:0'\u001f\u001b\u001d\u0016\u0019\u0010\u001d\u0019(&2,:5KGfX{t~{~ptkjXTED8?.40/1=8ULQH[Ueaql}~xkcaZEB6;4@08/A?QL]Xfcsm{xqqYLB@9+\"'\u0017\u0018\u000f\u0015\r\u0018\u000f\u0018\u000f\u0015\f\u0015\u0017$\u001d,*2,C9AEPJ\\Xj`sdro{qphyv~qmnc[PFA5+/\u001f\u001a\u0017\u000f\u0003\f\u000b\u0013\t\u001f\u001b,&CAVSmd{|u^cU\\FMHPIYJ?7IAPGLGMFaaru}~nobZP></'*\" \u001e#\u001f*\"94HC^[qu}mhbJC61 ' '#2*8/65HIQQaYyqtv}w||lbYaTZHL;:55,<2IAUS\\Ztf}w}jfYQKG794?3=ASQXS\\YhYi_ndv{nf`_W^PH8?8A7EI_XVUj_nl|yqeOMFC7:.;3B<KFTRbgu{{inigZYRSIGDI>FEJA`Rga{m}}yrmkaQND:/5)4,:09,=6A9>=SEXOh^k[eYrhyr~ulhWJB6+1')\u001e\u001e$\"\u001c\u001b\u0018\u0018\u0014\u001c\u0014(!&#*\u001f31C6IETPc^h`zrz}uvs~y}||}zw{w|uy}~wwv~x}v{sw~}zztskxw|~~~{}y{y}x|qrqox|wnksfsn|lvvpt{s{m|{{lijz}}|{{~w~{wwoi}y~yzzw~|p}y~ovpsff^le}vyy~sxsyiqr}qt~vwmz~zwwsyr|xu|{ux||}sj{o~|~~py}vvy}zo|w~~}wtnrnmiyswvtitli]_\\d\\gkzs{}|~{|~vnsv~}xw~u~~v~}z}vvxy|u{wlz~wuvy~~}zw~|vtbcR\\KE:A7<:SG]Zto|wzqk^dWYVa]hjtb}wfqho]nephmgvv|z|xzzjo^kf~w}q}jnqll^a\\RHB35&=1>3H?`Ukjqn}umVQI>C;H<VXddeg~umcdb[e]ogtn~opvo~n~kwvvqmt|}}{t|{~ozlyiuvnaaUj`cYnfz|qhjk|q{qqg[^^WNZRUTOMYLSEXXadkn{|~ye]SMKLCOMMMe]yn}xwovv}~uyl~p~xx{xx~wqncuhxv~uupne}jvsykoiq`mcqfndypn{vzemeujrj|r|}{yzzvpeietgvm{zuohyfxqy|y{xxuyxyuz|~~z}yzwxuwwyvx{{|{|~}~}}~~}}y{{}}}{}~}}|~||x{vxwrpuruppqtsutuvzx|z}{}}{|uxxxyx|{{~}|}y{v{{}~~~{|{zzz}y|{~}}~||zz~|}yz{{x||}|~~}~z{rrlojlfiimijikimkoqsqustwxwy{~~|~~|~}{}z~{{||{}~{}wzwzxwwzwtuxz{|{zzuxyzyy}{{|x}vyy|{{z||~}}}}~{yzxxuwuwrtrtrusvsssvvxx{|~~~|}}|~{wzwywvx{wzy|{|~}}||zzy{{zyy{x{wvu{z{zyy}}~~~{}||z|wwy|{|~~~}}|{}~~}|}}~~~||~}}}~x|}}~~}y{w{z|yzz}|~{~{~||~z{zzyvvzx{}|~~~|}{{}}~~~z~}|~|}{}yzyz{~}}}{|x{wyv|x{y}{}{|~}|}~|{|~}z~|~~~z}~~}~|~yz~~{}||}{||{}{zz{|~{~}{~{|~~~~{~|}~|zy|xwuwuxwuzzz{~|}~~}|{|~|}}}{~w{{}}y|{|~~~}~~~|||{|y|y{}~}~~~}|y~yy{|z|z|~~~}~|~}~y}{{~}~~~~~}}~x{wwtwstsyy~||~{}}~|~||}|}~~{|z}zzyzyzy~z}|}{|}}||wzz{wxuwuxw{w{}~~}~{zwxtuorqssvwww{y}|~~}}{}{{{~z|}{~~~|z{{{}~}|{|x{x{}}}|}~{|{{y{}~|~||z{~y|z{y~{~}|~~{|z|y{y{{|xzx~{}}~~~{~|{~|~{}{}|~yzx{|}y~tywzwvz|}}~~|~~~~{~~~~~}zxyww{yyyw|y{}}z{~}~{|z}z}{}|y{z}z|wzyyx{v{y|yzy{z~||{{||z}{~|}~~~|~||}~}}}{~w{vzwwwx{||{}||{y~{~}y}z}xzy}{{xzvwy{zy|yyvzvyuzswuxx}v}{~}~~}~||z~||}~{{xzwztuosnqnplnhkfhffegcgdefjkmfijnkkhllnostxvvty{}~xyttnojihlikijikilglhjhjhmgjimjmklqsrxx{|{zuwqqjkgjgieedeeiehfhgghiionrrty}}~}|y}vxvyqtppmnknmqonoqppsuquqtqrptwy{~{zuvsvrsruqrppqpkniommlplljljijilnooqssvxy|}~{{wwsukpjlgjbghjkmkonqppsssvz}|}{xvsqlnmlhjhkkkklllnnmlkorrtwxzy~|}yzvwpssrsrqrqrqurvrsrsqstxw|{|u{z|z|}}}xzvvvwwwwyvvqtoqrurspqmnnojmmorrrxtx|}}yxpunqlpkplnmnmooqmnlonqstu{x|{zzuvpphhccY[UXTRRRMSLOORVVRWVXZ[]`^bchjmsurwx}~|~{|z|y{wyuzwyvyuxwzuwuzwyz}}~~{|yyuvrtlqiigjegjlinkmmorrnnmpptotqtvxvxw{z~}z~x{{}|}xwvvrsnpnnmnorpqlnlmlompjniooqrsuzyx}|~vysvlojlnmdjklknlnjonpnqmptvy|y{{|}|~~wvqsnoloijghfjbeficfde`cbb]`^dcgjjkoqusww}}~zzz|wxz{uxuystrpprnomplngkjolplpqtuzz}xysyrsmmgfejdfgiilkplplrrrqsqtpsoqturttuwzz}|{|yxvxqpjlgkjkglhjkllnhllkmrqrqsvzwy|||vvoojjhmhmkmnmikhgedgifgdhfhijilnrsvuxz{}|~|y{z{wzwvssprkjfhef]a\\^XXVZVXUZ\\^\\baecehjknnrqzv{z~~z{yzuursrsstqtlortptsvxwvxwx{|z|}~xwsvsusompjkilhlggdeeefgejjnlprvuttutstwtyx|{{|vztxtwnrpqnpmlhlhkegdebcffdffieifjortyy}~z{rtllgjeeddab_e_edcccadbeejinosttv{y~~zzvupsmnnqnolomnklmkillkjjfhdgeiimnstvx|~{|xytrnpkoklkmhmmmjmjkikjkjljmijhlhmmntux{y}w{tspqnodkhieefhbcceddfhhhikkjinlnlmjprvxzz~~|~{~wyuuqpjnjkghdfcdeecf^cccaddceifimmmqqutxwy|~~|vvpqklfg`b`b`ccffe`c`_`bcgcggjnqlnnnpsrtuz{}|~}~x}wywwppmoklcda`XZX[TXQXRUNQRSSURTSUSVZ^]^[baeekikmmrrqvvx~||{}{{y{z}yyz{y{yzwyxzxzuunnloilillprsqstwvzz~||}|~~~z}wzuwqtptoqjnjlhihhfhfgehhhdggjdhefeffhimlnosptnprrxuxxyyuxyzwxvyuvssussvruqtsvuxsupuuwwzwxyxw|y{vwrwuvntooknnpprtrrtrttvsxtxrurwvvuytvsuntruuvvvvyvusvvwrtrqturvsutvqqnqoqpsmrmonnkooporpsqqnooomnkmjolomnoqorruproojkfhfifhhigjikglillpmqrtrtqtrpnpnolpmnkmhmfkjllnoononolnlrrurvuvxystrrorprprnmonmmijillolnlmototqrqquvqtrrptpspqolmoknknlnnqoqnonqknnqorqqooqrmspvuxx{xzuwxxuxsttutuprrsquqrlpoqjljjjnmommmnlmkmpomonoqplooqosprpsqrppnpoporqusututvtvtvuuutptstmsrsqooqpsttsrotornrrtvwtvrurusvwyw{wwywtvotmroomollklhhghhhjkknprqvssturtorrtptorrqnppqororophkjlkmnoqpmrnolnprprssptpsqvuuqsosrsspooopmkgiceehbceefgeecdcddhiljlklsuuvssprmrjojlmonqoropljlmlnjkklkkjjjkikkmmnmoprpsrorwtvtvrtuxvwoqlmklgkghgjlnoqsuwutursmpknikgigiegcghjhlijgmklikkiiiikjlkllorvttwxsuvvqvusrvwvuwtupvrtntorpsqrqroqnmlkikfihfggdfgiegilinknjolmnnnnnqmolpjmmmnoprptpxtvvxyzyzuwrsrtrsormploontuvxwyyzsrqrpqoqoroqmpqtoqoqrsnpnmkllplrnslpqruuuwttoqoqosrrppqspplmkonljnkporqrqnrtorququrqttpsqolmfigibdcac``feeghhkhlkjlmlonooqmokjhmhhfgghefijjjjkikgjhiikkmmnmslonopqproqmrnqosprusrvswssquqrrumsornpmlmmoplmjnnmlplmnkmmoulpnpopoolnmpmpnqpqrrsxrwwzwxwwutttsrornpjnklilijgfeffdcgfgfhfgfjjkggggglikhoopqqoqopqrlqnqorsrutqsrssuqtrwsstwvwtvqsmplnijjkknlplmkkkjiighfilnknjnhhihgigjhjikijjkinkoonnnnppqprtutuqspqlomqotpqqtmqmoglklfhikjjllikgjiiffbb`cdffiikhllpjokoklkmlomonolpltlonnnoljhlejehhkhlhjihgkhjgggjgiijhminknklimlkgkgihjjklmmmmqkrjohjjjgiijdhdhhjlqssrtwyy{ywrxtvsyrtrtqrnmnnhlmmlmijkmifeheehnoqoqttsttuuyuwtsmqkkkoikhjiniiihgkghdhdfegghijlolmhlhjmlgighgldginlnorptpvqsqtnsnllmlnjmfiegffbcacbgijmlloqstvqupsmpmllmklhijlhkhkhmklloloiifieeehjljnmrpsoqlnospprrtsqqnqopqolmeghhfffgegdlhjimikimghddab]_]_]^`bdgfhjlilmmmpmsprosqqormmnonnloknlnhihkfjfijkhihlhlkokoimknimijiklmmnmnikhljlhnimjihjhlmpoopsnmjkgjghdfa`_a`bcfeheigkjkmlooorosrstvptsqnohiddae_c^`\\_]^`b_cbedfhkkljlkljmjnlnklhkhkkjimimjkjkjkhijkjninhkkmnonoqqmpmoknjmllnnjlmqqrqtpsqsoqoqpooplnjjghedghfjhjhiffgjggghejjighgjdfdgchfhdegjinijhkfhgjkmkkihiljjilgjmoimhjhhgi"
  },
  {
    "path": "rfdata/rf-4.000-1.raw",
    "content": "~~~|~|~|zwwqrlleifkegikjmkmnqqtpqsvrvswwzxzz{uvqokkggddba`a_`\\`_`aecfhllpsvvvw|y}}}{}wwvxssqspqosttswtzy|}}z}{{{{xzuytutuuxtyw|{zz{uvvyyz{~|~{|y|y{z|wyxzw|z}wtuywtvyz}z}|~~{|ttqtoporrtwvwyvyxy||}z~~~|z||zxyvzwyuxwyyyuvrvwxwyz{|{z|{{}yxwztuuuuyxyz|{}~}~~~{zxysursoonoopqttsuusvuwux{zz|{|~~~~|}|x{vxuusuuwx{y{}|z|swsropnnlkhnlmqqptyzy|||y}|}~uuophhfiehdedbdeecca__\\_]\\]_bdcfeheillpttv|~}~vxvvsvosnpqqprqtrutww{|}|~vwqqmkjoosppkmllnnprrrovsuuyuyzzz|||zytwrtmompqrrspsrvstsrrtuuvzw|~~~~~|~|~y{xxwwwxtwxyz|}~~~~|~v{tvqrsrprorrrsvxwuwtxuvv{y~{~|{{|uuounqqpqsnnkmllmmkmiloqppopptz||~|~}{}zzwxvzsxz{zyw|yzxyvxvuquruw{y|~~~z}wwtwuwvxx{vywzxyyzuxy}}y|rtroprlnmkjigifedgeffhiiimnpptuyx|}|}x{wyvvstty{{z~wvuxrvptpqlkhgfe`b_a[]Y[XYXYXZ]\\_ccdhijjknloqtwyzz~}zzvzuxtunpmmklknikmngkhlmnorqtuux~~~xxutoqqsqrrsqqnpoqqsrurtruwwvz{{y{~ywsuspppnqlposprrsrwsrrsptuuuz{}}}~wtrqmpmmmpmpmmlnlnllimmmmmilijijkprvuz{}}~{zxytxrvswsvptsupsrsqrrtpsrsttvwu~|~{{z|wvutqsonkomrrsrssuqwsxsxtvusuxu{}y{uwpqponsnnmompjjjmjlmpotqstvxz{~~~}uwtsqrmolljjhkjllmjpoqoqnnpssxx{z}}||{zzvwsrqtppppopnpmllmkmkmnqqstwy{{}wuloggbd[\\\\]X\\TYUXY^[\\WXY[X^\\__aacejikiomqrvx}~~y{twprorlpqtppqtsuosprqsqrotqtrqprnpnqnoooptrsruostuuwuxvzxyvz|~|}}y}wwttsxrutzx{vxty|}~~{~}~|~~|}xz{{ywyyvvwxuwwyv{uxtwsttuvuuutvw{zzy{{~}}|}y|{~|}~{~|z{{z{z|z{uxtyuywzxzwzxwxzvww}|~~}}~~}~~|}{{xxyxxxx{y|vzy||}{{vyrsoqqsqsqsssvvuvvvuzwzxxwyy|yywyxzwzvzuxswwwuxvyvzvy|}{}|}{|z{zzuwtunonooqqqmqmqmorqnspsrqqroqqsoptwuwvzz|y|~|}z}{~{|wxy{w{yyxwvyyzy|x|y|wzwwwxuxuvsvtwttsvtsrtprnopqqvsxz}z|x|{y{xx{wxrtrtvsuwuywxuvsytytxuututwtvtttutvrruwuxw{y}||||}}~~|~{|x{wzx~||zzvwsuqsqpqtqttvtutttxuzuwxzvztvutttvuxyxyy{y{zyz}szxyz|{}x{x|{||}yzyyvvuvsttvvwuwwwv{tysrssprnplnkplololqmpruposurvtvvztzuwuuwwvwvxw{uxwwuvuxvyyz}~|z~{}{}z{ywsxvwrsqroqpqqsptstuurtsrsuvvwxwzxzttptororpspspstvtsvvssrqsrnqnqlpmnnpqtqtuvw}xzxzwxtvqsrrmninjlljjknmmnmkkqoojnlokonnknosutvwsyw{xzwzy{z~{{xztuxywvuxwuwwxzyyyyxzuwtwswsuruprtxuxz{wxxxtwwyrtsruv\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0004\u0004\u0003\u0004\u0000\u0003\u0005\u0005\u0000\u0006\u0001\u0005\u0001\u0005\u0002\u0004\u0001\u0004\u0001\u0006\u0006\u0002&96`\u0000;Pc\u001c\u000fkcEz3\u0018{Igmq][t{Ilb\u001d\u0001\u001b4Uu:x\u0012=ˀ=T=F}a7('km]\u0010UXFPS&94\u00010\u0010\u001a \u00022\u0000\t\u0014*\u0014\u001d7)\u001c\u0002\u0017\u001e#&#\u0014%9'\u001b$&'0+$ \u0017\u0010\u0015\u001d($\u0015\u001d' \u001d\u0018\u0014\u0014\u0014%*&2\"\u0001\u0000\u0013\u001d\u001d\u0010\u0000\u0012\u001b\u0010\u001c4+\u0016\u0002#./\u001f '\u0016\u0016%&\u0003+\u001b\u00135\t6\u000es\u0001eڀ\u001d[B}t4.Dw\"\u001dMNЀ \u0001itm\u0016ƀs=\u0011ui\u0011p\bZ\u0001Mb;xހo퀀2Td&r\u0019C\u0000\\;　e5рr\rŀw\tv\u0002zw\u0003t\u000bŀv\u000bn\u0016πn\"πg= bG退[]怀WzSwMi\u0003H}\u0004KG\fH\u0004L}\u0012Ky\u0013Kw\u0005Q\u0000H\u0003IGTf\u0003N}\u0002P\fPvL\u0006J|N\rO~N\u0002Q\bM~\bKu\u0001QQ\u0001OKr\u0003SwQgGm\u000bLKy\tI|\rEz\u000fF|!Hy\u001dE\u001aF|\u001bH|\u0007J|\u000fL\u0002I\tG|D\u0005V{NgOtK~MbH\u0006G}\u001dJ\fO\u0014G\u0003D\nG~\u0006F|\u0000G{N\u0015Ip\u000fH{\u0003K\bH\rF|\u0007G~\u0014B|!<\u0016Ex\u001dDx!Gy&Bu\"@}\u0012@x\tD~\rE}\u0017B}\u0018H\u0000GM\u0004Q\u0014QO\u0004J\tK{\u0007M\u0007O H~|\u000fH~\u0017Bw\u0015B{\u0018?wmɀŀҀ耀}\u0001x\u001fǀh@ހbNOe\u0005D|\u0016Bw 6p&5m42m/&l7*l),p+3n\u001f9p$?t\u0016D\u0019J{\f>\u0016Fy\u0019=u\u0018Bv*B|\u0015Ay\r@z\u0002@}\u0006F}~H|\rGy\u000eD{\rA{\u0012?t\u0013C~\u00159{\u0013;}\u0017Dy\u001eFw$B|\u001aBy\u0016;s\u001b>r)<q80t*7r ;r\u0014;v\"?v\u001e>}\u0013HzF|\u0007K@q~M~\u0000Gx~Pl\u0006QkNNv\u0005O}\u0000J{\tB|\u0002G|\u0005A}\u000eEv\u0004E}\u0018H}\u0015Bw\rEv\u0019I}|\bKz\u0012Ay\u0018:x\"5x$;w\u001a>v\u00177t\u00119w\u00198w\u0013@x\u000fE{\u0018:v\u000e?y\u0018Cz\u0016Bw\u0012Ay\u000f<t\nD{\u001e;y\u0016Cw!=y$>w\u0018Cw\u0011:z\u0016;y\u0014Ds\u001bKv\u001bEz\u0013F{\u0011FzFz\u0016H~\u0003L}\tFy\u0010Jx\u0012Fy\fD~\u000bI\tBz\u000fEy\u0014Nz\u001aGx\u0015Ay\u0014Cv\u0011>u!Ax\u001c@w\u001e<q(;w1?t\u001a<u ;v*=t+;s%9t(:v\u0019Ey\u001eFx\u0015?{\u0006Iy\u0006Ix\u0015=z\u0016L}\u0003I}\fC{\u001a;v\u0017@t\u0010>y\u001d<y\u00179t\u0011Bu\u0014Gz\u0019Ew\u001aI|\u0010F{\u0006G|!Cw!@z\u001c@x\u0016@s\u0013?t\u0019Ap\u0011=o\u001d<v\u000f:q\"E|\u001f?w\u000f?s\u0013D~\u0007I}\u0007J}\u0002Kq\u0002KK}Ju\bK}\u0006JH}\fS\u0003H{\u0000G|\nFm\nK\u0001J~\u0004FL~\u0000ENq\u0005M\u0002Nv~NNHG|\nH~\n?z\tC{\u0012?v\n@v$@u\u001c?p\u0019Dn%Fv(;p\u0013:z\u001aFw)9v\u001eBs\n?y\f=u';s\u00135o\u000eAv%=u\u0013@z\u000f?s\u001a9v\u000f=u\u0012>v\u001a?q\u001fEv\u0018Gv :q\u0014=t\u0018=w\u001f8y\u0012Ax\u000bGy\u0004J{\bDz\u0003G{\u0017Hw\f@t\u0005:w\u001c;q29q 3j2,jH&eL%d@$k[\"eO$gG*k:,l10p\u001d8u97t'<v\u0018?w\u0002I|M{Pb_^ۀbf؀a\\؀`^ހU_퀀TRu\u0002Nw\u0006Hz\u0016At\u0011@m+7m4$f),g13lE.i,-r;1k0-p80o%6m\";s\u0019Gw\u0000Gw\fOMRy}\u0000Ix\u0007Ex\rGv2?m 8r\u001e8r\u00188m\u001e<p83p97o14l1+i%7k0;q%:t'@v\u0017Bu\u0003BwIz\u0001S}MpZaW[退ZO݀V^䀀Zm_Q߀Y\\ \\r退WOUw}WM~\fHz\u0017G\u0017@p\u001f;u'2l=/k/)d6:j=5i9/k9-gG,dI'ea\u0018ZY\u0016]t\u0012U~\u0006Sm\u0017Um\u0017Vg\u0016`^\u0016Y]\u001ebV\u001feD&g=1k3-n$6v\u001c9r\u0010Dz\u0010DtMTk怀Wb倀^U׀^_܀^Tۀ_Q XW　VhSw\u000bO}\u0012>t\u000fFv\u001a<w\u0013=n\u000f=u\u001f;p82n18o/2k33k42q96t\u0014>w\u0013By\u000bHx\rJz\bSP~퀀Q~FwPq~\u0007J~?w\u0010=s\u001e7m$7q!9h61l;/l22g1/nX,k:/j83k%9k\u001e=x\u0018H{\rJ}L\u0001S~~KT\u0004N}\bMy\u0004Cx\u000f=s\u0016>o\u00188q\u001d7k\u001e3o2:q02k\u001c2q11n0/l13h31m3=w%9u\u0011Az\rH|LzNmWOUxN\u0003R{M}\u0011Mv\u001aEr\u0014?u\u00198s\u001c6q(Fm82k%Bu*1n 9r\u001f7q\"E{\u000eEw\fMz\u0011M|\u0001J}\u0001P\u0000@{\tHz\bGy\nCy\fAu\u0017@w\u00114t\u0014Ar%4p#@q*4m+8i.;j87k00kC0j,8p%;r\u0012=t\u000eF~\u000eMIw\u0003Ox\u0002SrK|J~~N\rE||\u000bKs\u0006Eu$=o\u001f9n)1j%8o1.n&8o*,n6/n&?s$>r\u0016?w\u000fJ|\u0005ROo뀀[m䀀QwTiTM~\u0002Hu\u00047o\u0019=p88m.2f90g:-eN,hJ,h9.g43k>3o5:p\u001f@q\u0014Cx\u0015EtJyMMj뀀UoZ[UZ쀀WhWwS|LHt\u0011@o\u00124l-.h<,gI%j;,fJ+p96j55n <m\u0013Bq\f@x\u0005G\u0002KRTt퀀ZTހVw䀀XS퀀RK|\u0007Gw\u001eIz\nBv\"3m\u00129r.4r\":k*-l(/i*.k%+m*6o,)g,-m63j'>r\u0015>y\u0016Fx\u0004N}VaXW䀀aUZM　ae退YX퀀]gꀀThUmY~O~K{\u0003Gx\u000eFx\u001eAw\u00176r\u000b=u\u001f<n&4k*6l*2hG0cQ\"`T%XR X\\\u0012Yq\u0010X\u0011Yl\u001cW_\u001f^p%`i&h:0i(9o=:u\u001f9u\u0007;wOQj퀀VU݀ak䀀g]؀^nր_YۀR]က[m耀Wi\fPy\u0005K|\u0012Fw\u0018@r-7p'.s\"0m..h3.i\u001e5n(-m7@r!5u\u001aJ{\u0004K}\u0000O{}퀀Vl䀀T|ꀀTmL{N~\u0000E~\u0011Cr';p(;p /k'7l-4k,;n4;m$1o*7q\"Fk27m$Bn\u0011:u\u0006@x\u0005K}I{SvMuWe]怀St}M~D|Cu\u0004Hu\u0017Eu\u0012Ds$5s*.q(.h5,g7(cF*h>/j73l*9o\":s\u000e@y\u0017Ey\u0003NL{Vi퀀YmOwSt\u0006D~\u0007Hu\u001d?m\u001d7q\u001a4p32h.3k*/h34l15i*4e,1t-2k0=q\u001e:t\u0017Fw\u001eCx\nNyQSUrU怀O}~Vh\u0001N|\u0005L}\u000fFt\u0011Dq\u001b9m$?m.2m+4h#)g15n<,e,;gG(o:.m\u00107s\u0016Hw\u0006CyP}Uz퀀Zq　Yb߀cVԀeU退bh䀀WlကVp뀀TjKv~Nv\u0012=q\u001a3i\"9n4-kD&g=$eL%aT\u001f_\\#`b!]_\u001c\\]\u001daP&d62dP.e$3l!5l\u0013Bt\u001bH{~Pv퀀ZpWk瀀[\\ YoYrPb뀀PhJuRv}NwF\u0013Gw :p\u00179n*=j<*d0!gD,iG0hI/f(8r\u001b>w\u001aGwLy\u0006TLdV|退Sx䀀UXfOsRK~\u0007Fx\u0019=o\u0017.r\"7l=)h?\u001b[Q\u0018Zd$TP\u000f]j\u0015eW\"_P#aN,hQ-`>5l06t!9w\u0012F}JSf倀Wn[g _]怀a[ހ`P݀eM؀_Y䀀dW倀_v\\n߀[fꀀUyS}\u0004O|\fJt\u0019:t\u001b:p\u00182k&:l5.m(1p82hB.e*3kB)d=1k*,o92k01a7)bJ\"f[$ZS\u001bbb!Ve\u0013To\u0010Y\rVn\u0019Yi$`V#aJ(e8-i!5s'Bw\bG\bN}SpVy怀[e߀[X ^`䀀V^ WlSqT}R~\u0003Ky\u000eDs\u001e?s\u00184q28q 7k&:v\u001a5m\"<q%@r\u00167n':t\u0012Ew\u0011Pz\u0002MwM{F{J|Fz\u0000Hw\u0007At\u000eDn\u00179r$:v43p/6k3-iR,b?/aW&cC$^R\u001caA&cO%f=-d@-i'>m\u001d?v\u0014B{\u0005M~P|NzPuU}쀀U}RsL|~\u0000Kz\u0000>u\u0014Fv\u001b;s%6l\"2k34f+/h11g;+b1-fC&fA/j:3s&<u\u0010Gs\u0010CE|\u0002MR\u0001HzL|\u0000B{\u0003Dv\u001bBt(Bo$6k%<m2/m73k,;k45o29j 8o+;i<As\u00187r\u001aCy\u0012D|QSIWQ\u0006L}O{\u0003Hy\u001dD|\rEw\u00109u'/l(6o*-f4.f17i\u001b(j;0k<%k:*k.6k';o\u001e?u\u00137{\rI|K|UoTWxꀀSmKC{~\u0001G|\nGu\u000e?q\u00139q\"6o00m4/fG)cC0b@.dM*e@&j.-m.9n3=m\u000fDt\u0013A{OyU뀀PkPv倀VwQKz\bF{\u0003Aw\r?t\u001a=o :n$-nF4hL.iH*fG)dF-k81i45q(:h\rBw\u001fEw\u0004Kz\u0000J~L}RPxJ~Ix\u0011Fu\u001b@n';m30g0*iC5hK$eC(dM%bL(`S$a:#hD,p0@p\u0013Ez\u0005KS \\h退Xd倀^`倀Yn耀YN}\u0012?w\nIt'?s'5q2,g8.bX*b<(`[#Zk\u0018aR\u0018fF1e>+d22m54n\u001d5v\u0019?{\r>t\u0004P|\u0013G{NT~UpကZwր^\\　aLۀ^\\倀[wꀀV{}Q\u0001O|Gw\rFy\u0017@t\u0014;r\u001f<t\u001b>u\u0016Bl$6n20cD+`@%^U\u001f_M\u001b^`\u001c\\V']G\u001ecG*c;+k;+r9-k26o$4o\u001f7p @u!<t\u0011Gu\rCu\u001bDw\nEz\u0010@y\u000bCy\u000bB}\u0017Av\u000fFr!Bq\u001cDo\u0011Dw\u000fD|\u0018Cz\t;v\fCu!Aq,<s$Dq\u0019>o\u001f6m\u00115g\u0010;l.9n*7o,2m+,k,6m&-n?6l=9n#1r\u001d<qB2n\u00172q\u001f>r\u001a9m&-h0:f/5j56l)*i51g29pF5o5+n&*m.1n\u001c:s Et#Aw\u000f;q\u0012Hs\u001a<x\u0017=p\u001c2s5@m!6l!;p+;l'9n!2u-<l46p$9u\u001f:n\u001e@q\u001e:o\";t\u0016Ap\u0011Hw\u000b=x\bEv\tBx\u00117n\u0015;r\u001d=r!2h6<j&3o\u0014<m\u00109j\u0017=p-Bq\u0010;v 9q\u001b<x\u0017?v\u001d?p\u000eJr\rIw\u0015Hv\u000eBp\u0005>|\u001e@w\t?q\u000e<v\u000f7n%<j\u001b3o57g*5n(=s=9m\":s\u0018Bl\u000e=u*@r\u001aAt!>p\u001e>o\u0016>o\u0010@p\u001d=n-7o\u001d:r\"?t\u001f:p\"=p-7m?2i1.h/-n9?p\u001a7q\u00117s\u00127t\u0012Hs\u00158t\u001e@r\u001eAq\u0014=m\u0014=v\u0011@q'?t\u001f<t\u00171s$8u!7p#>r#@t':p ;r#<u#2o\u00189q\u001b9p\u0019<q\f>o\u000fAs\u0011?w\n5q\u0013Bt(=q,;y\u00185w\rFq\rHs\u0019Cu\u0014Eq >v\u0018Es\u0015<w\u001dDp\u001f:q\u001c?q\u00175q+1t(:o$7h\f>r\u0019?s!5n\u001a@r\u001e7u*;n6=t\u00154i\u0019:n'9m\u001e=q09o\u000e:q*>n'7j25d5-j73g>1g,.oQ0j03f37l8+i$.r70j%3k+Ao3:o\u0018An\u0013Aw\u001f>s\u0013Es\rFx\u0013>p+>q\u000e<s\u0019?r!?t\u001b6n\u000fBt'=t\u0014Iw\fFx\u0002G|\u0007K|\u0011Jw\u000f?v\u0013;t\u00188l\u0017:o :r.@o\u001e<p\">o->m\u001c5h<0g30jR+m9-g@0l0'd7(aH*h50k.1g7;l/6u$9n\u001bCn\u0013Ar.@m'Aq\u001dDn\u001e;n\u001a1j\u001e7p\u001e:t-<q As$?r\u001b9q\u0017=s\u0018Es-<p*Ao\f:v\u0016Dt\u001b:q\u0012=s\u001c:t\u00189v\u000eAr\u0014Am&?m 6k+5q)1s63p*>p(Eq%@s&As\u001b8o\u00197q,@t!5n\u001e9o#=l\"1o/4m/9o+;n,Al$;m!=k05q+7p%2m/?o0=m(9j%6n,8u'=w\u001a<v\f;r\u0010:l!;p\u001c9p(2p\u001f:m)<m\u001d<p\u0019>o!:n\u001b8l-5p\u001f?l#<q Bq&=o\u001e7p\u0016:s\u001e<r\u0014Cp\u00199k\u0010;r+4p\u0016>n\u0016;s Ds\u001d=u\u001b?p\u0014Fs\u0002Ev\u000fFu\r@n#Bn\u0015Cp\u0019;o\"=j\u001f4t\u0017>u\r:r+<o#=u.0o\u0011?q,=n\u001e8v\"Bq\u001c2r&Cr$=n#Cn\"Cp\u0017@u\u0017Es\u0016?u\u0010Fr\u001d7s\u0014Ar\u001c:u\u001d<s\u00149q+<l\u0011>j$8m#6o 6q)5n':n\u001e8q'At\u001f8q\u0018<r\r4p\u001e:t#>r+5o+.q,6r,<m%>q*;q'8o.5r-@v\u0013?x\u001cDv\u0018@w\u0007Nw\u0018Dv\u0018At!Iu\u0017>u\u0007Bw\u0010Ev\u001aGy\u0012Dt\u0011@x 5r07h#8u*1n#0j':s-9n(2j16v\u001eAk!8p29r./m\u0019;p%5m08p'9p/4o)Ar#>t\bAs\u0006Aq\u000fAt#@q\u001aCq\u001cDq#Co\u001a>r\u001c=w\rBp\u0017Eu\u001c8q\u0013;t\u001a6o\"=m\u0019>v\u00174s\"6n,?v$6j'Aq!;s\u0013:o'?m,@t);p!<p$Iq\u001d=m\u0015=v&;q\u001dCt\u001c>p\u001d@w\u0010Ix\u0018@x\f?r\u001a@v\u001e?u\u001d<o(>j,0e90f%5o(4l,>o\">u\u001fDx\u0005Dt\u0017Js\u0011Ez\u001fCu\u000eGo\u001a<n\u000f:w&?o31n\u001a/p'8i.,k%4o68g64j06g2;o60l$6m\u00124p\u0014:o%9n\u0016Ap!:r\u001e:n14i$?s(8v\u0017<n =n\u001a2r!<o\u0017<n\u001e:p 8u\n@r\u001a9h*9j95g\u001f:j=4m;;o!:k':j\u001cBn,;p\u000e<s+=q\u001d=o\u00198n#<i#<n42u.5n\u00148t+8o\u001c>q\u00173k%<v <q\u00197q\u000bCv\u001e>v\u001cD{\u0006Et\u0006Hx!>t\u001a:t-6u\u001b8n$<q\"7m#4p!/p.5pB9m\"/n.1h76m'5n\u001e7t\u000e;r\u0010>w\u001a?t\u0011GhAs\u0013Ax\u001f<s)@r\u001b=p\u0019@v\u0016As\u0019?q\u0014;s\u0014Es\u001a?s\u0016>u\u0013Ds\">v\u001b8q\u00135w\u0018<q\u001f9o\u00118s\u0014Fr\u001e@u\u001bCv#:q&?s\u0012;o\u001c=s\u001e9r&=t @t\u000e;u\u000f;m Bp\u001c>p\u0017>m%:n\u00183i\u001a8t0>q\u0018;p\u001a?y\u0007Iu%J{\u000fF~\u0007Nx\u0002>u\u0016Ft\u000eGw\u001cHn\u0010?p\u0018?o\u00168l):n\u001f8m+6r-;s\u001c5m\u0016<s\u0016;r\u001a;s)=s\u000f>o\u0013Br\u00199x\u0017Bo 9t&7l*9j/1i%.k6)h08d*1f32j$1h35o&2o+9r74o,7i+=l\u001e8p%@s\"?r\n=l\u0003>q!7n\u001d7o!@l#>t\u001a>z\u0019Ds\u0019Ev\u000fGt\u0004;q\u0018?r#@u\u001d@r\u0015;p%=p&7l%>t\u001b=n\u001a6r ;o\"4m\u001f7r\u001a4p\u001f;n!9o\u00167s)@r)?r(9l*?l\u001f2n/6m\u001e8p%1n+9o\u00149o\u0016?o\u0011=u\rDp\u000eBu\u0011Gx\u00165o\u0013@p\u00185p\u00188i'7n%4p\u0017<p2<n\u001bEw\u0015Cu\u000bEz\u000fFu\u0014Ew\u0012@u$?m\u0017>n\u001bHl\u00123q3:q-4o\u00147k09m#0l6;n,.p+5o=6r28q\u001d7p#Dm\u001b=q\u000f/p\u001a7o%;r <o)Ap @p\u001b9s#>t!<p\u0019>t,Et Cz\u0012Cy\nHw\u000bDw\nDt\u001dCt 7s\u00138q!6r(4p\u00188q26o\u001d>n$Ho\u001e=t\u0012>m\u001b:p\u00146k26p&4o08h2=j\u001bAo#>s\"<n\u001d<r'=l\u001f6n(=r2<q\u00172r Cx$?v\u001fCt2;h%3l4,n%2j./j\"1f%<o\u00138p#;s\u00129u\u0016@t\t<r\u000b;p+>j\";n*6n54q):i\u001b>o\u00199p\u0019;p\u001c9l*2n-3g9'h@ ]c'`Y\u0019[R\u0019^c\u0015]\\\u0018`i\u001aYR\u001cXg\u0014WI\u0017Ym\u0010]U\u001fcR\u001e^Q(b?(p.+l49n\"@z\u001c@{\u0006NW뀀^m`_ Z~UkR\u0004F|\u000eDq\rAr\u001d8q\u0011?n30j:6eG)aL!_P$gM%^7\"]D)eF&n/2i.=r\u001cDt\u000bHx\u0012Ix\u0000NvLz\u0006Is\u001aJw\u001c@q\u001d0r<1m9/j6/cI2`I'k;&a?-fF'iB'j?6m?9m)0o/8p/8n\u001a@q\u0011@z\u0017Gu\u0007Hz\u0001P|StP}Py\u0004I}\u0007Dv\r=u%<q'.q0+h\"+gJ/iS,b7-^=&fA\u001dl51o2-o-:q\u0012;o\u0019@t\u0012DzJz\u0011Ix\u000bJz\u0000L\tNv\u0004Bs\u001fBm\u001c-o)-p>+b>&`T%_c b;\"aD(g;4h+1h.:i,/k46n\u001d4t\u0017Er\u001cHx\bJzGQ~O{Q|\u0007Ex\u000eEs)>n98i+2j+.d?-h9$e7,hM&aF'iB\u001ea<)jI)aG0f@.i34l\u00167t\u0014@x\u0000F}L~ThSiRKyJz\u0014Aq\f2q#<e:9d4-cL)bF\u001fdL+aG\u001e^[$`>&f>+eJ*e@,k)5q4=q\u0007Fs\u0016Kx\u0000LyUL~Ly\tN{\u0002I{\u0002Mx\u000bKt\u0012Du\u001aBr\u001d=r\u001c8r(4k00i:/bX\"dK(eC(g7-f8/k16o\u001cAw\u0011E{\u0001OTsUp뀀S_X`怀^f܀YUကU^UqSuN}\u0003Ly\fFs\u0016<q\u001fBr\u00187m)3gB2n21bG\"eI\u0018`W\u001dah\u0015Y\nJ~\rIEKJy\u000eV{\u001a\\Z#aH,e\\ g+&bD0h12k78l\u0016Bv\u0004Gz\nM}QT~U~~Mu\u0001O|Kz\u0003?z\u000eEs =s&@q\u001c7r =h\u001d3o08e=.cB\u001d_Q\u001c`O\u001d_>\u001cYP(d=&e>:p+<t\u000eBvJy\rKz\u0007Az\u0007Av\u0013@t)<l<*d>(e1*eL)h2!gJ)g51i0-e6(h>2l(2k53m\"<r!;q\u001cHyDzJ{\u000bLx\rGz\u0013@q75p!0k(.j02g8)m2-f=.dI#cB&_>+c<$eE-d24f@&jP+f@)h30m\u001a6p\nCq\u001aBz\u0013Dt\u0018Fu\f?u\u000bEy\u0018Bw\u0019At(=m\u0018:o-5k*/iI0d;#eL$g30bL(kB(aD1b=&g=/hW.n9%n.3l%<q\u001eOv\u0002J{NM}M|\u0003Nz\u000bJy\t9t\u001a7v\u001a(m10g;#l>+e4.k:)jE)i*-oF-l18e-5o23q!=p\u0017@q\u0018Fz\u0006D{L{Qy\u000eJ{\u0005Jy\u0012@z\">m,2f(4g?\u001e^X\u0016^B\u001fYc\u0015_G\"Wf\u001cZq\u0015[d\u001d[`\u001eaL#d;'i98l0=m\u0016>v\u0015A}\u0013Et\u0006Fw\fMw\u001bIu\u001c>s\u0014Dq#5r&<j05k//j5&g7-bI0kL#mC#fA)gF\u001ab'-g+*n,1p,*m\u0017:r\u001eBr\u0011Ey\nIzG~\u0003T\u0005Lw\u000bGs\u0015Kv(Bq.1o+1h7%gI$cN$a[%fV\u001a^X\u0019^W\t[[\u001fbU\u000eTa&e^\u001fgF4e(6p'Bt\fGx\rQ}UyRkYzO|\u0001L}\u0003Dx\u0014:n'9n>)m@,c5'c?$dJ%Zd&`a\u001bZV&dR\u0018`R&eD+lB-p&?o\rBv\u000fFv\u0000J~\u0003KO}OHLR~QPMz\bKxOx\u0010@z\r?v\u00135p,:i*3g<*bA*cO\u000e_^\u0015Uf V\u0004WuQm\u0003P\u000fN\u0005Pn\tPl\bZf\u0018Uc \\a\u0015\\F$_M+nS*f32g*2p\u001a@u\u0016GsLx\u0011Ay\bDy\u0010Jx\u000fI~\u000fDz\u0007Bt\u001b<o$/o\"/j 4h1/m50oE)fA*g$1o\"3o'@u\u0018@w\u0014<u\u000fI{\bJ~\u0005O}\u0007H{\bBy\fFt\u001aAq\u001f>r!7k%/h.9iL.dA)`K)`S%_^\u0016[f\u0014[e\u000e]n\u000eYd\u0018ZZ\u001d`J cV$cH&i%5m\">r\u001f=t\u0018Lx\tM{\u0000Ct\u0017At\u0019<o\u001f>m*:i:1m4.kD.h>$b])d]%]L'eC*cN\"e=(h?+iF/i%/p\u001a:s\u0019@s\nGx\u0014N|Dy\u0004At\u0018Av\u0019Ey\u0017=o(9gD2hP$bY ^X\u001b_V\u001b\\Z\u0016\\e\u001b[f\u0019eV(a`$[E(^P'j<,m\u00185v\bBw\u0005O}\u0003P\u0002JS}H\u000eG{\r9r\u001c;g.0hB'f5*cK%dZ%eL!`K!bU\u001ccX\u001f]\\\u001edI)f<(g22k=,m\u001f8p\u0019Bx\u0005Hz\u0012L~\bNy\u0007Iz\u0013Cv\u001bCu\u0006<u\u001a:o!7q96k94f;,d=1hI&dC(aS\u001e[R%Xj ^U&_d\"_O(e9/f(:m\u001c>v Gx\u000eK}\u000bHz\nR}\rF{\u0002Ew\u0012Ep\u001cCs\u00128r(9r'>r-+m92bT\u001ecI\u001e_f$`c\u0016]]\u0018`Q%`\\ cG1k:0o(7n+Fu\u0003FzM}\u0002T~O{\u000fDv\u001a;s\u00139q-8m00m/1f@\u001faM+`Q#^Q\"g_\u001dbE\u0013`M.WN,f5)j49j 7k\"9m'9s\u001e@t\u0005Ew\u000bPv\u0002C{\rGt\u0012?q\u0012?n<5o43i:.hC$d^*`]\u001aXk\u001f_c\u001bZc\u0016]`!\\\\\u001f_F\"eF-d89eA5m\u001d=r\u0015?y\u000eD{\u0005JKU~Ul退VuRgS~Q~Nt\u0010FvJz\u0005K{\u0013@w\u00127n\u001e9k#9c?/aL\u001bb]\u0015]j\tO{\u0001JMKFDFK\u000eV\u0002Rg\bXZ\u001d]L'fQ,iF0j(8x\u001bFvDzR쀀U倀Xy뀀\\jYuTDx\u0001Cx\u00159t\u001c4j/0fT(_T&_^\u001e[W\u0011Vb\u0017Z^\u0017[p\u001b\\o\u0011\\v\u001b[m\u0018ZG%a70e@0o)9w\u0015@t\u001fFs\u001c;v!8s\"<n 3i>)f=+c60i:&bN-aT%dD&aJ%]G'^Z\u001a`7&b>.h-&h;4p,>s @y\tFw\u0003O{\u0004Mz퀀Q}\tV~GzMt\u0019<o&>v4/l52g]!\\\\\u001e]Q\u001aXc\u001eYw\u0010Zm\u0018XY\u001d^j\"aV(d?.d)5q+=o\u001c6s\u0018Cw\u0002K{NzWTnQ|쀀WN{Q}\u0002Gw\u0004J|\tJt\u001dAq%<t ;t#7g%2g;3iC)gV\"`_\u001f_]#Zi$aa\u0018^N'^d aP bV$cR(_T,gH(fJ$jF&eF.j@5g,2j:/fB.i>&h>,p22e?\"eF,hC4g53j;7l14n*2l11k2Ao#Ao\u001fAs\u0017;s\u00137n#9l.1f%.h20n85o3/k?-gB8m2+c6+eG.e31h<$g<.f10j9.b&)m\"7n(2o9;o65cA0j1)f,0j55k52l01eD2]!$lW*dH0c/5lB1n,6o+=i\u000bDt\u001a=r%>q%Ao-3r1:o-8p-8l+/o-4p%1j1%kD-`9.i:,d8/l.2h.0l,-j48q2/i8*eN'f7'dX%hR,bC,fJ*e:/gM%kD'g@(hO*gX-fA+h& h/6k3+k+3o.2k\"7p%3l\u001e8p\":j19l>:h<,i5'b)%f,-h8+m4*f7)kS*c.\"dG1hB1fA&cB1h6.i;-j/)a5)b?-b4/fK(^4'g>(i+.mM0j&1h*8j,7n+1n:.f16n?3l;/k7.n,4h-3l24i*1l.3k\")o+5o$7p(5q(2s&9o#?n1:r\"9t+/o-8h)9j0/l?&hE/m81d:<m13p\u000f>n'<r\u001f9n/8q#<o%6k =j)8i+2p'6n/9m/4j4>k/.m10i<(jH/hJ,h9.e/4k*-l&=m,8p!:l+Aq%:l)7l#6m+5j+0l=/l4;i+,j\"5n)2j41l<4e:3e4'd=2a@)gK/iC(jA+lH5h24i5,n32n@:h04k/5h<6l\u00195q)9s*7l!8o'2l92g/2j,8m&1p\u0019:q\">p$<p-8u\u001c.l+,f55m74q-7k0;m?1k)-g23h5.iI'dB.g3*hA1k,.m:+j;5l/,j3-h<2j12m78s,<p+8u$<t\fEt\u000eDx\u0013Cu\u000e?t\u0011=y\u00196n\u001d9q!>j.6fA4fK(c@0d*+h70l1/h71g;0l0/j#1nH2m\u001e8o);t\u001f@n,;r\u00176p/1p\u001c6i,7k:4l&9o(.m*4m//k(7q\u001d3o+=p(8n5(j03j9.i/7l\u001d+g)4l2(j*2f,5n+.kA*f?0hK)`/$bI%n>\u001da@.bN/j=4eB2j=1l75o\"8p.:v(7t&;j\u0016Dn,8o\u001c0j6/k8,g88l26h 7k68o)8o\u001e6i22gN+e10e;'o</k@5fI&fJ3f..k;,l.3h?5l3*jC5i4'f.,gB&dF)c:'j5-b11k/4i23m+8o\u00127w\u001d:q#;t(2o02gA-f36i;+j2-f58f05n80l=0j,2iB0h):p-2k,8i\"?o+9l#=p9:f4/hC,cI)hH0hM/i/6e>2m&0j4,m .p4'h 1h-5h<5k45k5/l,3h<5k)3g,4q)3jF6i7)j--fA6l93m)3j-5m!7k;.kA4f+-i0+i8*b20iU3lF%`:(g@5j9.l/5kC.lB8g72p$2n(3k?6r34l1;o-5p$5t&:m.5j(2n-<t(>n.5n*:r\u00184p\u001a=t\u0016;n\u001c>r\rEx\n=t\u0010<l\u0016;m#5l'3p#5q+6m/5j,9m-7m7,l1.g>3i9*i11k/1i20n2;h8:l;2k$9m,:l\u0018>o\u0012=t\u0016Bn+Al%8q#9j1/j;4m32q2.f#5jC2h67f%1eD5k0(k!4j/9e23g/9m82m31j*:m);j%9l,;m\"4l\u001d4j*7j\u0016.n$3o(;m!8j'8g'4c,/fK(d:$gD%g;#d:*h:$e7-j/9n%;q\u001e4o$/k\u0015:p76m3/j%:k?1g?.h.4k35j35j06h-+j@-i6-iJ*j92m0.q=7j</i:0o\u001f6j)5n+9m(;o0,l71j92l&9n-8o'0u$8u Bm\u0019Ct\u0018?q\u001a?r!@q\u001b5p'?s83l(5k54i<0m21nA4l,1i;5h3/iE6i76i4/i13h-;m*0o\u001c1f:/nC-g55n:8g75i?1f91i@0j=.k6&hF1p3(e:9j33h<1i83iI,eP3aL&eA%bN.b;+f20i@2m67l63h;2l/2i,<l.5m-9l72i*>n-5f*+n</h<'dA3hC2iH,e)#f,-k?.j)7j;1j)/i3,dF,g,\"l/(c55g?6g,0l\u001c4l(8q!:o\u001b<s\u00158o\u001e>p5;q/<k)*l:+h3*h?)lD,i-0c'1h@6l)1g?5g@3gC-h+-fK0k?,lE-jP.e<.i3)f0.g42k48q><n\u0018@q+<w\u001b>p\u0015Ap#Eq)6r17m03n1+l68j62j+,i*.h21k:'l?8d=1eA)j1*k9,gA.h2.bN*g6(j/4j09o,:r+:s\u00167p!7j#;m-5q\u00181o!9n#1h91k2/l--d+0n86pA:o76q#;t#:o\u001aCs\u001b3r 9i58j(3l:5j*-i87f7,`=-bE(bH$g>\u001ehJ\"j5)fF#hd,aM(`Y+eE+cI/bI/j*1h1:j11p 7u\u0016?q 8s%8q5Al./kA.g,0f9,gD,e7)h:.f0&f)&g@+h;/hL,hE&iI,l:2d<,m5,i2,l:6lA2d)3qH/hA'hG)k>+e<*gB.i=,j.-k(6m6<l46q64q\u001d5k&<p2@o94i&0i3/e<'gU*`_\u001c_F\u0018cU!\\I\u001fcP\u001a_[&gL\"fH'h*0j44j3.k7(l28l8.n-8l\u001e6i$9j+8l=8h!3k/Al @p\u001b6o\u0017?u+0m'7q.$m9/g(2h(9m'2n%/l;8h60g>3l>=i0*r+3l%5l,6iM1dI*k<&fC(kG1m.3k-@n\u001d8i$7j,.i1+[c\u001eX\u000fQL\u0007JID~L\u000fQ\u0013Qq\u0014Zh!aa\u0016\\>+jE5m5;o\u001d9r%;s\u0014Fw\u0018J|\fM}G}\u0000Iy\u000eH|\rEt\n?w\u0019=s\"3r+8m9+j23l>2hD\"fN,eZ\u001dd:#dG!_])^5&cH.g81i//h.;s->r\u001d:q\u0016;r#>z\u0019Ar)?t#<s\u001d<r\u0017;n%?r\u0017@s\u001e?n#8p,2g14gD)b9\"eN `\\!YR$bX\u001fc`\u001daI\u001dga\u001fcZ$g='e92c0.fC2i;0g:6h58dA(aK-[y\u001c\\m\u001aXn\u0012Sy\u0012Qv\u000eVw\r]|\u0011]_#^O\u0018\\W#^=$eI&iH2n>5n Du\u000fAq\u0011I{\u0003DM{K~G{\nCr\u000f=o\u00128u\u001c2o 6j)0m7)h8*cG%da(bJ!bZ!`R#`X,cM4f.4s\u001f:s&<y\u001cDx\u0003IxHz\u0012Ex\u0014Do&@m:7l00eF$b`,^O\u001f[_\u0019[_\u001b\\f$\\g\u001cX~\u0014Sh!]j\u001cdP!_R a<*cP(c;*h7;m*5o&?n\u001b<u\n>r Eq,<p\u000e8n-5m=!hK\"_N\u001cWf\u0014Z_\u0010RV\u0012Xc\u001aZb\u0018Yc#cv$dI$^]\"fI+l8/k\u001b:v\u0013;p\u0012Fy\u0011K}\u0003M\u0006J|Hz\u001b?r\u001a7s/0g&,g04fE aA'YY\u001e_S\u001b_c!^Q\u0018aT\u001b^E!^N\u001fcj+c/\"i(2r#7s\u0013Bt\u001c@w\bGs\u0019Hx\u0014Ez\u000b7t\u001bGr\u001a?l,:n?3bB#`R\u001f^W\u0014XZ\u0011_V\u001bZX\u001e[m(eb\u001d_P.aF4j70g'4n/8i$7q\u0013Dv\u0019Bu\u0006Fw\"Cs\u001e@t\u001eAr;8j(3i;(jH*dI,eU bR\u0019^G)\\L$[S%bO'cM*jN'h@,kB1j#6k\u0016@u\u001aKz\u0002K{T~O~\u0006Lz\nCy\u001c;n$:i\u00181n?1j=/g?0hP/cN\u0011^^ Yd\u001f_a!]V\u001dXm!bO\u001ca^!g='f50g25i/8p\u001e=q\u001d<x\u0011=u\f6n\u00168j+:l&1k3.dG&eQ$eS)iL'dQ*dL\u0019ZW\u0018\\T\u0015`W\rcP\u001e_J#[F,a?4k\u0015;m,;u\u0014At\tF|\u0014Av\u0019Hs!>k.<o,6p;2c1-bC'^N\u001beL!_c `S\u0015Zb\u0017\\i!dR#`H'cR#eE&f8)g3-l)4u+5r\u000e@q\nJ}\tJ|NzX|MtQ|E~\u0004K{\u0002E}\u0012Fv\u0015Gq%>n71hA/bG$dS\u001bYq\u000fUn\u0010Q\u000bK\u0002>IA=C\u0006HK\u000bN\tSp\u001a_\\\u001bZd\u001f_T\"aT%g;.g2-m 9q\u001aAs\u0007H|\nKy\u0003MI\u0002N~J{\u0000Jw\u0012H}\u001a:q\u00196o02i,/a9&eN$b['gE\u0017dG#c^#b?!^E!_S)c,7g?7o\u0012;l#=v\u001d;o\u0017<r%:l,.k/0hA2fY+dX'gB\u001ecN&]g'`V&\\P$ZM\"do dQ%a<,j95o ?q\u0016@v\u001bEz\u0013G|\u000bI}\u0011N}\u0016Hu\t=m#<m*.g=.eQ(dQ\"_q\u0017Zn\u0011S{\tWp\u0003Ux\u0016X\nRr\u0012Ku\u0016Qr\u0016^z\u0018cP `D*g74n68v.<r\u001b>{\u0006H}\u0007Ez\u0000ON}K|Dw\u00179o53j@(b\\\u0019\\[\u0011R\u0004Qx\u000fQ}\u000fWu\fTr\t\\i\u0017S\u001bXT\u0018\\h aN)b?3cF1l)9l)>p\u0010At\u001b7p!9n73i03hA+bB+eR\u001b_A _P\u0019][\"a`#Zr%dm\u001f\\Z\"cY\u001e_U'bP2e.5n0;o\u0014=s\u0010Hx\u0014I}\u0010Iw\fHu\u0013;n*0k0/eF1h[$cF\u001ebV\"``']T\u001f`['\\`$d]\u0015bf\u0014YS$T\\\u0014\\V\u001d^L!gH+mF;j*;m(8t\u0015Bw\u0016H\u000fG\u000bFx\u0011@v\u0017?o!>n$9j*3k3.jG'eK,gR*hQ'cN\u001ac>1a--g/+fF'g=3f45k0%i20m/4q=9l\u001c;l\u001f@q-7n 5n:1k:(hL(cO'bM\u001faY'dF _N\u001e\\S\u001a[d\u001f]N%Ze\u0017\\^&\\V!cC+o01l0=q\u001aIu\u0017GyL}\u0005N}By\fHu\u0016:t3;j@(dX$Za\u0013Xs\u0012T\u0010Tu\u0013Qr\u0014Xr\u0014Xs\u000eXb\u0007V{\u001cZf\u0015^g\u001feG,h(0p!=t\u000eCx\u000bFs\fK|\u0016PLJyOM}\u0002R|\u0006Eu\u0010Fu\u00078m%<m03h4.p./gD*b>\u001ca@\u001cYf\u0016^w\u0019S\bS\u0004KKKJH\u0001O\u000e\\}\fV`\u0019^W#cR$dL,_E0n:3q5Bp\u0014Lp\u0015Fw\u000bJ|\u0018Dt~\tFz\u0007K|\tAy\u0019Ap\r=p+4r\u00183n\"<p\";n+0m)3o#7n3*n67n+;m)2h;7m\u0017<m\u001f5r\u0017Dm'8s\u001f@o(5m);n..h? dO\u001fcK$aI%`V'ba%``\u0014_S\u0018`V\u0012b3'bN#bI\u001e^F,f'7j$.p%8m\u0019Cu\u0016@r\u0016At);t*=t\u0019<n&1l.2h5-f.-^9(ad(`Y$_g![d\u001d^\\ _^\u0016`J\u001fiR$f8,e61p3?w%Jw\tE{\u0002F~Nz\u0007@~\u000bAs\u0013>p35j-2o=.mL(`Z\u0018Xb\r`i\tT|\u0011Qk\u0012\\n\u0013T_\u0011Za\"Wc!ad\u001e^O#]?,p*/t\u0016=v\u0012D{\u0007F{\nK\u0005Gv\u000bHw\u0016=r51m?.cA(cZ\u001f]`\u0017Ym\u0018^\\\u0019\\\\!`Q\u0019aL!XP(]?\"]G*c<#bD-^*,fB6n$>r,:r\u001eCu\u0010As'<t\u001a?l39k&3e@,i6,cT.gS#\\d\u001eaY\u0013Zl\u0017Sa\u0014V\\\u001caR\u001cXJ!bV\u001b]A\"f=\"k77n'Av%;t\u001e@z\u0016Gs\n<v$6o 9m'6p\"-e6\u001fcE(a^\u001caa\u001b]Z\"_W&cK\u001ee;)cE)d@*k8$l70k+=s/;p2Ev\b>u\u000eGy\u0010@w\u000e>r\u0016?n&6m:-h;.kC0f=+_M\u001a`O!d=(aK(fK(fC(dK'a3.fD4b8/n#4m\u0018;s\u0019/v#>r\u0019?p Br%6r\u001f;p*2l2/eG$gT,eT fL\u0016`S\u001e^p\u001b[e\u001dYZ\"Ye\u0012Zb\u0015[c\"cL\u0019fV)hA6m!>n\u001cAv\u001c?y\u0010Hy\tH}\tE}\u0011G{\fKx\u0015Kz\u000bM}GyKw\tHx\nFw :p%<r52i%*eB'ch ad%c]%a]\u001f`=\u0018YW\u0015aP\u001ddR\u001d\\V ^K!`A\u001c_M bT/bW\u001dbZ\u001c_f'eP&eJ%e8(g0)jG8l49j07m>2m,2r.?o\":u/Ap*9k44n*5j20k<0m3+i54jB2m0+l77e+*h':o'=p6<o7=m,6k;6o&7k11s/5m'<s(6p\u001f;h)6m+7n1,f.8e/.l>1fB1a@\u001fbJ+dH gJ$dE ^L%\\R.aS\u001ed;(cL,f#2k3+j,8g4)h?2g>)dG,hI*d7\u001c`I\u0019]R$Y\\\u001ebJ#cP cY'fE*g>-m24i64n(3k\";i.0lH.m./j.1l@4e./eG2e?%_A2cL.eP+gI%h>+bG2gK*fE&cL+e@)j=,eJ2k=0l=4e?%e13h.4i12h@:p\u001c-m\".k9*m\"7g:9mK2eR1dJ$bG#aA%XM$f@)_F$dI)h8+k-;h71k-3k>2m=0l36j*0d&4pH*b&,f?:m03gE/f9+f7%cG*e<#dJ-f8)gK,e?/e01h5/j>2iQ)]C'g5)dB\u001feD\u001f_F,aA*]V*dE$gE'd<&h2,l@-g5/jA0f55n%/k53j;9m5$j8/e;,iG$dB/eM fC'cQ+b[,bM\"f9/cA#i7-h:)l7-h55hI+iC0c?-iI0bB\u001bd=)`D0c@\u001feR,hB2g3+j?+f10dE(hC%i@)f5)k*,h3:q97m-5n10j.1mF1m84d11fG3e?3l;/c',kB0cG.iG2g>-jB*f7.hF)hN*b=-bR&fS%f@-d>)dU)eF$_D*eL%ac(_C&`L$a? `P)iH(a],gB,h5+fI3iA0k'1l/8r:=i-2i4.j?)aG)fW)_`$`>(_U `R\"bO\u001d_Y\u001de]'dV,f0,fI:m.7l3-f#2j1&m2.j;,cB,dT0fG'f?\u001eiI#cd#fS#\\W\"hI\"gH#dB\u001cfS\"\\\\(Zg\u001bZ[\u001e[R\u0010_e\u001f_d'eS!\\G\"_B#hL$i62i21j-8h18o1-m4:k&4g02s*4o\u001e;p\u001f=q$1i54m*.j1-k@&eV(d]'dI)cJ)`Z\u001b_S2]Z,`X+hM'dB)f<)a8 g=-eP0gG%bN$[A\u001dg9*g;1i)1g.:o85k17m;0l>/l57i@6nJ7h;.cC\"iJ\u001fb7$^L\u001cf=$][*eH'f0/i<3k?2i3*c;)h?+eF3fC)g/)dF,j:0kF*h8.e+4h>4l@3g28k3:e)6b*2a6(g,+i>(f@.g7.h52j72e3(g/,iK+j98m43j82e*1j7*k?1k>/h+'d>.i<0n=7l(2o?4j02k%6m#0j@2h5.jA$bB0iA+iK1e7&a?/hD*gQ\u001diN(gL*eE)^B#cS\u001cc]\u001ecQ\u001d`]\u001ea`'_c$eR\u001fdU)g63l,2n\u00107m1;l%<m37p42o:2m93k70o?2k2,hE&e6)d<'i@$j?(f<%i%%dJ-hC)gD/aF1d4'aE0hD/h@6l=+l8.k+3j95f:1f=%g< gU bJ.`H2bK&cR$cH eQ-bC)hM2iL.k<0e,/h50m+(d74hC+dH&gL(e7&lP1iD,hB$aN,]D\"_J(cM.i=0i24l9%jF,j36m,4g23fJ,d9*h8-b=2eV)dN-f?/a6-e8,l9(g:)_2)jH'bS*bM\u001dbO YW\u001f`\\$b\")jD(l=,l2/m53n*5k3-j%0h>/hC2j*&fL,fW(bG'jL#aH0eP)eJ\u001ecO&d_\u0017[Z\u001fZb\u0010^W\u0014YV\u0013\\W\u001a[f aO&[:._<(j-0g\u001a8l1Ar\u001d<v'6o!2k01h4+d7)jF#`Z\u001ebb\u0018Zj\u0016_l\u0016Xe&]n'aS$\\P\u001bZV(bQ\u001b_<(eQ#cE eI%a:&dE\u0018dR%cH+bC(`A,d8)m;&c6$f:(iH.fE4h]'bY&bW `Q(bC!_E#fE+k:,i>7g'3n6,j9.h+)f58g5)iE\"g=&cG,fP\"a>+aS%jA(g80i1.k15n72k97gI-bF'h.&b]\u001a^B(^h\u0018_e!_d\u0018`G\u001e`b\u0017bS\u001fY[\u0019^X\"]t `k*aI\u001ffK,j?2j39j34q(5l-/o*:k6.k=5o#3o*8n(/mC5h>3bB%d[-b\\*`J)gO+hW(g<'hH.l9)eB4j.'iJ*`1\u001fdL&c[%`Z\u001dcb(^S(eR\u001b]P'_^*aS&`:2i<*f?1k4,i24p10m$3p04n1,f@*c/*`:)k+/m0:n16j10k21j06j62i7,fA,aV*_K\u001f_T\"_W\u001aYN\u001b^W ba\u001ff^*h72eJ/b>*h3(g?*k30gN.dG!dB'f@\"d?*bF$hL0iB:p$3j42k28j40jI(d3-f=$a2(d<%bF$c=*cN*dR7k2)j>6o.7j\".j32n91l85m/*i,,k>1i/1i31j;1iD\u001a^O\u001e]>\u000b_^\u0010\\[#`U\u0011`Q(dO\u001f]N&cM\"eP.`P'eA.g:'gG'`<-h5,j:0g@/j52h/3g>(i<.m-&h*0g?:n8*dN*i7'd5-hQ-a>!bQ#cG\u001da; cN'hM$d0)aB0cL'gH!ag bQ\u001dbF+dM\u001feN*[S\u0016`c&_V\u001aWh\u001b\\c\u0018b^%]V$fH$e[&dG(aH%cB-hN'gN.j21m35m$<p/9r-:o8>n-:o:3k7:j5/l;2fS)j90i/-fE'dG\u001f_H$h`)dP,bF+k>7d42h3*i?$hB'fL/W;-gf,]U\u001fbO,`X ]W$eY$bZ+c]%dJ'cG,hU&c;/eJ\"g4,f9)e:1e<,bY)dH(fQ#dT&_G(aN$eW\u001caS\u001c`W\u001a\\j\u001a[j\u001aXc\bNu\u0006Uo\u0011Yt\u000bT{\rXy\u0017Tn\u001a^c\u001f\\e\"[l `a\"bS$\\L&_C*d0,f8+l(/j\u001e@y\u0011Fw\u0007DzP\u0005OV퀀WK|\u0001Fs\u001c9n#6oA.i>#l-/dd _Y\"^_\u001dWY\u0016Xp\u0016X~\u0016Wp\u001b]y\u001aYh\u001a`Z'aK+d44t$>p(=r#=s(9t!;m72o;&g=\u001fbd%^k\"Xk\u0010WR\u001eXz\u0019aH\u000f[]\u0015Sb\u0004Xv\u000eWp\u0015Tr\u0017_p ]_*eO0f37m\u001f<o\u001cFx\u000eI{\u0012C{\u0007Cs\u001f?s&=q(8p*4g00gH,hC'bI*fL1`A\"cL\u0017_j\u001eWB\u001b\\c Xc\u001f]['cN'gE.k@4l\u001e5l!7p#<p\u001b;q)Co/3m30b;3bS(^U\u001aaH\u001cXj\u001agW\u0018__\u0011X^\u001cY]\u001aX[\u001aYQ\u0017c`\u001c^H%bR)hO(hD/j/6l#7s\u0014Bt\u0017Dy\u000fAt\u001fGr\u001dCq&8o&.hD$dI!bU']d\u0016S`\u0018[w\fY}\u0010Xn\u001a[o Va\u0011Sm\u001eXW\u001a]U#[Q&g@-k-2j#8m&<m-0k*3m*5s10j0+i)(g<%aT\u001f_Z ^d\u0012`P\u0013Yp#^Y\u001e\\g\"Ze\u001f`U dP\"dW eA2jC9n86r\u0014@w\bB\bJ\u0000IQLKxJ{\u0012F{\u0015Bw\rAw\t@q\u00189r30j9*\\R'ak\u0015[|\u000e\\t\u0004QGBI==<AIM\tP\u000fTs\u0016Y]\u001c]a bT+e@9o66n-Cu\u001bCu\u0013@vP|\u000eL{\nP\u0005E}\u0014>v%=q\u001c;m<,g=+dB\u001caQ\u0016Vi\u0014Zn\u001bTr\u0011^\u0006Vn\u0010]t\u0013Zn\u0014Yi\u0019]U\u001edU(f,1g\"4n*5r\u0011=t#>s\u000eD}\u001f<p\u001c2k*%fM&aX\u001c[c\u001c[h\u0014Or\bNr\nR\nP}\u000fR\u000fV\u0007M\u000eUu\u0012UY\"Ze fD%f&2g2;t&6m#;t/=p@8q*2m\u001f8i9'bK#aX\"`_ aV(_R\u001f^b$_S\u001f]P!^L&f`\u001acG\u0016`F&aJ,aP6k/-o\u000f@r\u000fD{\u0002K{\u0007Ay\u0017@x\u000e?s#2m16k5+aO _f\u0017^y\tUt\bS`\u0012R}\tS\u0007St\fU|\u0003Uu\tTq\u0014Y]%]M&f>-l(2q!7u!>x\u0012Fv\u0013@u\u001f;u\u0014,n-3fS-^B*`^#aj\u0017_[\u0017Yh\u001a[U\u001a][\u001c_X#ZQ\u001eb]\u0015_`#^S+eT*fF'n.<o$=y\u001a?y\u001bAv\u001cBt\u0012Bv\u001e=v\u001b4o,1d</dI&iO&cN\u001f\\V\u001fVr\u0012W^\u000eYz\u001fWe\u001aXu\u0010\\t\u0015^Y\u001a]M%dG,e>.i:?r%:w\u0013D{\u0014Bx\u0005Fz\u000eEx\u0016=p!:n,2k.5iD)fb!\\n\u0017ar\u0016Vg\u0014Qu\u000fYt\u001cUu\u000e]i\u0012[e\u0018]V\u0017aI&e@,h<3k-6q\u001c5p\u0015?u\u0018Fx\u0018@w\u000bB{ Cm\u00162s+=i87hE*fK+eh\u0019`N\u0012Qe\u0019Uo\u000fUp\u000eYo\u000fX}\u0005Su\tWX\u001e[d\u001c^j!^G\"gT&fH2k0=o,;p#8l&7hE2f7+cY'`J'Yi\u0018YU\u001d\\o\u001eZi\u0014X_\u000f_d']v\u001b]h\u0014[n\u0011\\f(_p#\\Z\u001fc?$eM1k64p\u0014<v\u0015Hs\u0014>s\u001dJp\u0013<n\u001e:x\u0016Ht\u001d@y!<v'9p%5oD/k@*eB#e@'cO(_a%Yb\u0015Zq\u000eU\bN\bLI;GKSP\nVs\bQu\u0010YV\u0013[R$e=3n,9r&Gs\u0006L|\rJ|\u0005K\u0004H}\u0003Hx\tAw$8p\u001e4o22h>']S\u001a]V&`Q\u001cdP\u001d\\o\u0019_c\u001aV^\u0016\\_\u001a_b\u001ac_\u001baW\u001d]Z\u001b]E%`<#k6,c\u001c2h=5j1-eQ(a:'d@\"gE$f:(gB\u001e^>\u001f^f%bX\u001d]c\u001d^W\"\\c\u0017Y[\u001cXq\fYJ#bM\u0018fe!bK\u001eb?/cC1i76k6-l\u001a>t\u001e=t\u001e6p\u001c8r.6m0,h0'cK ^g\u0019]l\u000eWt\u0010U\u0010Q~\u0015Yi\u0005Q{\fUz\u0017\\e\u0017Vb(]\\\"_P\u001ddK!i99n(9q\u0016<p\u001d<q%=o\u00188q\u001d4q24i:3cA)gP(iN(gQ\u001e^R%_Y\u0015Yx\u0019Vh\u001bWY\u000eW^\u0016]\\\u0018ad\u001baP\u0019cb+i<$hP&m..i26j(1q,1k.1iB0gB,d<,h>(gA(dO%_V\u001f]T\u001d^f\u001c^I\u0017aM\u0018aO\u001e`@'aR*_I$hE5j84i0,n)5p0:o\u001c8j!2d(;j2*fA/g@-dM\u001a\\S#X`\u0018UY\u0012Un\bXf\u0019Tm\u001cYk\u0011S}\rPT\u0014T\u000bXt\u0016Z`\u001e]I&dS)g2Am$Cw\u0013@z\u0007I}I\u0007Ew\tDv\u001a?o,4hK1cM\u0016TV\u001aVy\bZ\u0004K~\u0010K\u0011Q\u0001R\u0005M}\u000bW\rNg\u0012Vg\rUc\u0012TZ\u001acJ6fI+k0;m\"7n\u001f2l,4k,,k01p#,f)4n7*g>+dV'iM\u001e`k\u0016_g\u001bZm\rYf\u0019]c\u0001Zq\u000fUs\bXp\u001d\\S#d?.o16q(@w!Dw\u0013@u\u000fEy\u0017;w\u001d@s\u001b8o14k>-bL$ZH\"^j\u000e^f\u0019]]\u0018`Y\u001b\\f\u0014^j\u0018[r\u0015``\u0015^U\u001c]J\u001dcY\u001f^S$d95j!4q&AxGz\u0001FxI~M}Q}\u0005P{Py\u0005DyBv\u001dBr ;mC/eQ!_S\u001a^g\u0012X\u0001MD\u0000<;@;FH\u0007L\u0010Qz\t\\q\u0015YO\u0016[Y\u001baJ e8&fK/k<.q\u001c3o(>t\u0010Fy\u000eCy\rFs\u0013?q\u001bAq&8m63o8/g<.gM%eG\u001f_K\u001fZi\u001cWZ\u0015[b!Zm\u0013Xl\u001fTh$RQ\u001fTQ\u001cbK'c<2i:1n-6l%6o 5i0/pE(d4#mY(hT!_Q\u0018^a\u001e`^\u0014_e\u0017\\\\\u001e[[\"^Y\u001dZW \\i\u001c_U\u001d\\N\u0015^S\u001fg=*i:.f51f 3q=0i>.l/.d@(cK&cD!_v\u001fcf\u001bZ`\u0017\\`\u001aXp\u0014Tu\u0012V|\u0014[l\n]y\u000f^d\u001a\\S#dH%g>4f69m,5u*4n\u001b@u\u0014Bz\u001bBr\u0018:q\u0017=r-3pB/h?2fR'eP$ZP!Z\\!^l\u001b^q\u000fX[\u0013][\u0019Tl\u001ee^(gU*h?1lA;o\u00189q\u0018>x.Ct\u0018Az\n?q*Dt!;r\u00166s&6r\u001b4p\u001e6p+3j&1o43gF-gN)bU'd^'bZ\u001e]e Ut\u001fZh\u0015Sd\u0016Xf\u0014Rr\tXr\u0018Vq Z\\%[g\u001f`` [h#e[\u001acT\u001fgL$cI,j.*c=+h61l<\u001di@*jQ/e8-fK)jB+i9'aJ(dY\u001d_c'^c\u001ee]\u0014YU$`f\"bb _e\u001bZ]&\\W\u001f[M\u0015_f\u0012_f%WY\u001f`O#eH\u001ehP'_X&cH-hK+cG0eE(eG1a[1g;,e<*bI\"bE.fG-^C)\\K\u001dZ`\u0019\\k\u0017\\i\u0017`c\u001ecW\u0017\\O$\\Z#b\\\u001c_N!hi!_Y\u001e^P\u001e]P!\\R\u001b_U\u001b]b$^K%`[,gY\u001ea^!`\\ ^L\u001d^d\u001e_g\u001e`i\u0015YL\u0012]U\u001d_h\u0014aW\u0018aJ\u001fdZ\u001daK\u0018dW$][(d]\u001eaE(^J'bR+^_#eE'cH!`V\u001c^N\u001f]T\"dp\u001b_k!]G.cY#b;\u001aaR#dV#d` _^ cZ!`[&eB(d/-bA,eL*e=#h4#f^#`D\u001f\\U!bb#bc%\\U&b[\u001deZ&e;+h:,fD0e)7iE-cM'h=$dO*eM-ab\u001f[g\u001bYi\u0019^i\u001eYj#dZ!dH\u0019`Y)aL\"eN'bI.dJ\"aB(`X!bW\u001fbU\u0019bN!\\I\u0019_g$_U\u0017\\\\&^\\\u001c`g _b\u0018]a\u001d]w\u0013[Q!]V(]F\"dG!`H!bX\u001bX[#bl\u0018Y^\u001fbR\u001ecA\"\\M!^O\u001ff]\u001e_\\\u001ebg\u001bb^\fe?\u0015^S\u001fbN#ZR\u001dad\u0019Td\u0017Y[\rak!dg\u0010[\\\u001f`U\u001bb]\u0019\\\\#\\W\u001bbU\u0018_c\u001b^\\\faB\u001a[I\u0017^T\u0015[O\u0015`a\"`Y\"^S(]B$dE&gA(jE%i3#fS$`a\u001a\\o\u001c]O\u001b[_![R Zc\u0017Z`\u001f^X\u0015Xl\u0013V`\u001f`a\u0018\\N\u0019ZR.bC+f;&dE.m>,dE+hO$jW+bR%eD(fD.i1(eB-h:+f.)aD&_9%b9/f?'iB-i;0eD%f?'bR/gC)gI/fD\u001a]\\ [^\u0018X[\u0017Z\"\\i\u0019][\u0016Y\u0017Yl\u0018^[\"][\u0015YW#^c\u001c]d\u0016[Z\u0017cD aO$bQ*^G(gO%bJ\"_S+gR#Zf'a^\u0015ZU\u0012`T$aO\u001a_Y$`\\!^T!`R#dU$`J$f:)^=.j14m%9k+/k;)iP3f='dU#eU\"cR)``\u001ba`\"_R*cB0cH)fG2a8+fD(iW*aK0jF0h;*dE-j0)gD,_?0dW(cZ!^X'`U&]i\u001chN(aH\u001d`:1eE.fP!`M\u0017`A!c_\u0018[R ^Y&`H hT `O(jC/f?,eG+bU\u001f`_\u001a^h#_R!a^\u001eiJ\u001ceW-g?.d9/e3(g32i?.j<4f@3hD'e>#dQ\u001a^[\u001c\\c\u001f[Z\u001dah\u001a^j\u0017Z_\u0013Xy\u0017[d\u000eYc\u001d[c\u001dY_\u0019[\u0017^O\u001faR ^j\u001b\\b!^O!_E*aM)]>%`<(gH)cI$]J'\\M\u001ebU'b7&`U\u0014^X$_W!ce\u001d`g%bb\u001daT\u001fgU#_`!eX\u0011_`\u001e^W\u0015\\Z\"]N\u001eg? cR(bN,jF)cU*h>'dH&aM\u001abI ]X bZ,XQ\u001e_Q\u001fbW)fc\u001ffT\u001cbX'_V*by\u001eV_\u0016Yc\u001dYM\u001f]V\u001cgN$cI#g@\u001fgb'dO\u001eeS\u001ae[\"a_\u001faa\u0016^O$bh']Z\u001d`e%fQ.cM#^H,d;3fS0kE'iJ+kA*dF+^^#cI\u0012fI _W fF(e])gI-g*2dO/cD'\\n%_]#XN\u0014Zc#_\u0011X_\u0012Vv\rTj\u001bSK\u0012][\u001baD\u001eZV d\\\u001dY`\u0019Xj\u0016Ub$Zo [r\u001a[W\u001bcK!a@-aM\u001feB(e=*f=#h7+`H!^L&h_\u001a^V\u001f`d\u0017WS\u0019\\r\u0012[c\fUd\u001fY_\u001d_e\u001f`H$dS(_C\u001db>\u001fhI0c^\u001baY&`^\u0019c^\u001c^P\"br\"cX,_L$ag\u0019\\]\u0018`d\u0017^L\u001e\\`\u001a_j\"_`\u001e^U%_O&iG!_E(cQ aa\u001eaN ^L#cK(`Q!bU*aN'aX!`>$_M%ca1e7,b@2d]\u001fcY\u0016_[\u001caX\u0016aT\u0018_Y!^]\u001d\\J\u001efa\u001e^k\u001bbZ\u001cbZ!`U$^_\u0018\\]\u001e^[\u001daS\u0014`I\"eU\u001e`M\u0016_S\"dM#`R#cU)]Y c`&_T)dT%aR!aF\u001fbS dL'fS%]K\u001d\\a\u001e^S%^T&cI-`D.^8)cC,_U$`J%c[ fU(]P(fK h_\u001d^V\u001f]B!bP ]I(hX\u001cfG\u001e`I\u0016cP\u001c]T\u0014]\\(`C ]c\u001c_h\u001bYg\u0006Uf\u0013Qw\u000bT\u0000P\u0002Vu\tT~\r[d\u0014TO\u0012Ys\u001fZ`\u0011ZZ#`Y'eO\u001f`J)d6\u001efU#cG%fF(_C3b9,f.&cP#d9#bG/`P\u001c^c)[^!gW$_L+f9#eE0e9.lE)d;4dP-e:$fJ$hb']_\u001eZ}\u0013Zw\tSy\fT|\bX\u0012S{\fYr\u0007W[\u001bRm\u001d[p\u0012Ta\u0017Zt\u0019X\u0014Z_\u001dZT(`X#h[&iF'bA&aJ$d@*lR)f1/iK.h8!e0.o;2gQ*b?(dZ\"a_\u001f[X ]a\"`T0cR\u0018d?#`T#gG#[L#]U\u001eaZ\u0018`<\u0019bV\u0012]W\"fX\u001ceI\u001aaY\"f]\u001f`a$^I\u0019^^\u001ec]\u0019[f\u001b[b\u001f[n\u001d_S\u0019`I\u001b_Z\u0015^e!Ze&bk\u0016YT\u001cXZ\u001d`Y\u0014]`\u001d[[\u0016`p&\\c\u0016[d Xg#\\f\u0014Xm\u0018]d\u0018bf\u001c^C)eB\"c\\$ef'aa&WK$cI\u001e]T\u001c^O!YT\u0019`a\u0016Zj\u0017Yw\u0012To\u0011U^\u001fXs\u0011Wk\u000fWx\u001b__\u001d_L!bd\u001cZd\u0013\\c\u0017]e\u001eab&aD#iK/jF'c@2h>/gF*g>,cF/_T'cD)i2*q60l-1i-/f34b8*a4,_J\u001fcZ\u001f_M\u001a_d!Zj\u0016W\n\\\\\u0017\\g Z]\u001d]g [b\u0014Zn\u001d]`![Z\u0015Zc\u001cYf\u0019_d\u001d__\"b^\u001c_b\u0019`Q!dK%_W\u001daN*b[\u001f]W\u001dZS\u001bZV\u001d``\u001e_G)]R)dJ#h?-f+0d/&c=%eE1dT$eD$cD'iO1f>)hL-bK%aX(`X\u001dbW\u001e`I(dO\u001fcN)b5%fJ%iM&g7(e[\u001d`J!a\\\u001ceJ\"`T\u001b`R%\\Q\u001aa[\u001cc_#_K\u001f_g%aU\u001eZQ\u001f`[+cB&h>\"_D ]X!\\k\u0019\\\\\u001b^d\u001b[j\fZ]\u0017[d\u0019_c\u001a[G$WS\u001eWe\u0017QY\nV\u000fWp\fM\u0001LGJGH\u0006O\u0001R\u0005Ok\u0018Sm\u0014Yn\u001a[i\u001fd`\u001e_B/h72f,8r!:r!>r\u001c8q\u0013=n\u001b@mG0k9,i@)hF+jH\"gK!aE\u0017\\X#^h\u001c`R\u001e_V#\\o\u0011[s\rYb\u001bUj\u001abb\u001e_P\u001e[T\u001e^_&_O+d80r,.f(,l<)i%1q\"3m-0m!5q%Bl:1j&)i>,]X\u0017XW\u0000K\rLNG\u0000GDMJ\bI\u0006L\u000fG\u000bW\u0016Zd\u0017_K*hE8m'.p!Cp\u0015Dy\u0001M{\u000bH}Du\u001b:u)7j1.hF&cV$]\\ \\\u0012Vj\u0013Vx\fZn\u0013U\fV\u0006U\u0010Pt\u000eYh\u0013Xf\u001cZ`+\\@%h71l78r\u001dBx\u0018Cr,=p!8k03q.3gF$dR!_a\u001bSx\u0017YX\u0013Sl\u0015Uf\u001aUp\rZd\u0012Wj\u0016Zo\u001c\\[!`i\u001b`X\u001d]a!cN#fE-e33k1<o%3v#6l/6l%8l70k++cK\u001d^b\u0018`c\u0012Xr\u001aXk\u0013[c\u0011[l\u001bXx\u001b]^\u001e[q\u001eXf\u0014\\e\u001bZm!aU$cR f9+h:3j41n<)jJ'fK*f[+aV!^w\u0013Yt\u000bU\u0005Rt\u000eN\u0017Vw\rPs\u0005V\bY\tXj\u0019Yn!Xk\u0019[W#]\\&eK%g8-l96o38j/1n5)q8/hC(cY\u0018Zr\u001bWq\nXt\u000eMt\u000eP\u000eO\bJ\fS\u000bN~\rP\u000bV\u0007Ty\u0005Rt\u0013Xk\u0014[t\u0018aU*e,7n18p&6n+As16n03l=5j8+n:.cD)^P$^l\u000eY^\u000e^z\u0011Ta\u000bMP\u0000Rr\u0013[w\u001b\\\u0011[a\u0018Xm\rXe\u001a^[&`B+d40l66g>-lG7hI(fL'`K\u001ea`\u001b_B\u001bXe\u0016^g\u0015b^\u0011Za\u0016T\u0015V~\u0003PzN\u000eQ\u0003Rx\nT|\u0011Rl\u000bVt\u0016bg!bP$k=;m<5l12i+5l0/e2/jG)dS\u001e_h\u001b^f\u0014Ve\u0005Wh\nQ\bW\u000bS\bT\bPJt\nQxWp\rZq\u000fZZ\u001fhL/mC2k4Bo\u001c7s#7n$7o<*hK-eN(a?\u001a]j\u0019W\u000eOz\fF\u0005P\u0004HH|\u0006P~\u0005R\u0001L\u0005R\u0012U\\\u0016^Y&gV,h@7h7;n1Aq\u001cMx\u0010Fz\u0007HyIy\nCu\u0019>s\u0017Fp\u001c@x\u00158p\u001e;m.2l?+gJ bl\fTx\rOIB3375<59@@?U\u0005M\u0013On\u0019[a\u0019fI%h!6p!@s\u001aCx\u000bM~\u0003J\u0007Ex\u000eDx\u001dEx\":n\u001b3m@-g\\!bc\u001aUk\u001dSj\u0017Sj\nO\u0002W~\nM\rUySx\u0012Pw\tWc\u0017]=+fI'd;3l01s/:o1:k,6j4,f]$ca\u0018]S\u0014Z\\\u0015\\t\u0010S|\u0016Uj\fSRw\u0002Pz\u0010S\u0004Qj\u0014Yh\u0015Sv\fYt\u0012Y]\u0012XY\u001f`P\u001cgB0g:*l7,iK,eT-bJ+fL#ec\u001faN\u001a_Z\u0019Yb\u0019^o\u0018]q\nUe\u0018dO `k#\\Q\u0018_o\u0018Yl\u0016_j\t\\S\"c[#gD*j:2mC6m(6n\u001f@v78m*5gG7i>\"__&\\]\u0001Q\u0006MI\bR\u0007V\u0002MK\u0002P\u0006O~\nWt\ref\u0019c\\\u001daV/fD*hE)j&(i;3p:5l7.f?(iO+dY\"^T\u001e]f\u0015^i\u0014Wi\u0012U\u001bT\bT\fQw\u000eV\fXq\u0010Xb\u0016M{\u001bZu\u0013Ws dY+gE/g?6o16p,4n5.i1'eN!aa\u001b\\\\\u001e[^\u001f^Y\u0016[Y\fT\u000eUm\bS\u000eT\u0012T~\u000eTk\u001e[d\u0011]o\u001cYT\u001f]f\u0017jC-g4.j\u0019>q\u0014Br\u001c;p.5k-0i>&aX\u001e_\\\u001c^n\u0012Yu\u0012X{\u0002Qy\tO\u0000PH}\u0000NUL{\u0001W\u0010Pw\u0013Q~\u0013Zs\u001f_R'e8\u001fk13k:1m30k?']F)eL&gW\u001bfY#_D$`L%^T'^A\u0012Yn\u000eWl\u0010Ux\u0011[\u0010Wi\u0018Z`\u0013Si\u0015T\u0013Xr\u0010[c `P d9/i28q':u\nAq ;u\u0016Ft\u0017Kr\u0011Es.:t53gG)fe\u0015S\u0002Q@;<<DGD>>C\u0000K\u0007Nv\u0012U]\u0010[b$`H-h\"0l*=w\u001e>w\u000fAx\u0005EyJx\u0003Jw\u0013@w$>q,Ao66l:2jA\"\\R\u001f^[\u0014U\u0006H\u0006E\u0000H;??E?B@BE\u0001U\u0012[q\u0013UZ\u001fbC,h@-n0-r.;n!;r\u001a6q\u001a>n\u001c)g.*fN%ah\u0018`\\\u0016`f\u001c`e\u001c\\W&[_\u001dYz\u001dZ~\fV|\u001aR\u0013Vs\u001cVv\u0017`c\u0014^I eL+d,/h?+d<(Y;\"^g\u000eUY\u000eTw\bYw\u0005Oy\bVu\u0001ON\u0003QNL\tE\u0002N\u0005QMzUw\u0010[s\u001c`G'dT0h52g*1jB3d2.c?#]O\u001c[q\u0012Sf\u000bSMLJ\u0001Px\u0004P\u0000P\rR`\u0016Tg\u0013]q\u001c[U&dD'i8#i8/j6-j./l76p'7s'?n$:m04fF*cY,`o\u0015\\`\u0014Yq\u0007U}\u0004Uq\u0006Uz\u0015[l\u0012\\l\u0019b]\u001a_i [\\\u0013Za\u0010Tc\u0014Zu\rSv\u0013Vj\u001b`J'f=4n0'l(1e?+eS(cE\u001c`?%dT\u001caU\u0015aa!^v\u0019]g\u0014Vq\u0014PL\nKS~\u0004S}\rVq\rTo\u0010[q\u0017Z\\ aH$gC'kA.i(+i>/i7-fH%dP%a^\u0014Z[\u0005Ta\u0013Sv\u0010W|\u0001J~\u0003R\u0000Q\nX\fM\u0003S{\u0002Vq\u0017W{\u001fWV\"[_\"`@'cC*j;(k.)hG&eB#aI*`d\u001c[n\u000eXq\u000bWq\u000eS\u0012Qs\u0010Nr\rZ_\u0011Y[!Zf\u001c\\x\u0011XY\u0018Uq\u0017Q\u001c\\`\u0019Za cO\u001eh=3hC1p,8q&6h45e7'gB*\\Z\"`R\u0016_^\u0017WT\fUq\u0010U\u000fPRGFAJFEP{\u0011S|!^^\u001cb> ^A&d=&cT#f]'aM\u001ebK+\\K\u001b[X\u0019YZ\u0014Yq\u0014V\u0013L\u0003P\rR\u0000Pl\u0006Vj\nYf\u001b]h\u001bbS%gN%iC0l15n>2o)<s)6s!@q\u001f:p\u001d<t/8p*?p32f1/d@\u001caO\u001b\\g\u0014Pg\u0014VpT|\u0000Lx\tN\bV\u0005Ss\tQt\u0019Tt\bUwN\bI\u0004R\u000eS{\u0013Tr\u0014]j\u0017]f\u001e]W\u001d]a\u001bWU%_V\u001bcn\u0016^U\u0018\\V\u001aZ[\u001fXx\u001e]s\u000e]a\u0017Z?\"`V f[%bT\u001c]Y\"cR\u0013]e\u0015\\d\u0016[`\u001aTr\f[k\f_g\u0016Yi!\\{\u001aZS&cm\u001cb=\u0015`G\u001dac\"]`\u001edX\u001f_^!\\f\u0013[M\u001d\\_\u0014Tk\u000f[{\u0010Uw\u0016Ux\u0018Yj\u001dVs\u0013^u\u0018X\u001cYs\u001cWY%_M%]@$bV!^\\\u0011[o\u000eR|\u0006M{\nRz\u0007Wm\u0010XZ\u0011Zb\u0010Yk\u0015Yk\u0010S YW!Uv\u0010[m\u001f[d\u001b`c\u0014_^\u0019]R\u0015\\i\rWf\u0017Wt\u001bXl\u001e\\U\u0011X\\\u001f\\c\u0016^Y\u0017_g!al\u001c_G\u001cWQ\u001aak\u0011YX\u0015^L\u0017aj\u001fdM\u001cZN\u001b__\u0018\\c\u0015\\r\u000bVe\u000fSv\u0011Sv\u0013Z{\u0011Ou\u0015T\u000eYq\u0011Uw\u0012^e\u001a[g\u001f]]+aN\u001dd['b\\&b\\\u0019_W\u001d]^\u001a_a#cW\u001f]M\u001b]h&^g\u0015VY\u0017V`\u0018Zh\u001aYp\u0012ZY\u0019_\\\u0017`g\u0015Wl\u0018\\_\u001dYu\u0012Wt\u0016Un\u0018\\y\u0016Vx\u0018Xc\u0007W}\u0012To\u0019Xo\u0019Xl\u0013Zc\u0017Vr\nXr\u0010Tz\bT\nS~\nRd\u0017Za\u0015Zc\u0017[b\u001d\\[\u001a\\]&ZK\u001daZ&[a\u001a\\^\u000f[d\u0010U\u0017Yc\u0013XZ\r]s\u001ca[#\\g&]`%_h\"]?%\\V)fP\u001eb^%ba\u001cWk\u0015[h\u001cUX\u000f]y\u000e[i\u0003Pw\u0010VO\u0017bT\u001c^C\"]K\u001a[`\u001dcb\u0016Z|!Xb\u0018_n\bYx\u0010Qo\u0006Qu\u0003Zu\u0002Rk\u0018O\tS\u0007R\bOx\tVq\u0011Tt\u0014Ve\"Xe\u001dW_&Wu\"Y`\u001f]Z\u0012Xb\u0019\\n\u0014Zs\u0019Tp\u0019Yx\u0014]{\u001fal!]]\u001ae[\u001e^]\u001eeQ#aZ\u0019]h\u001b^c\u0011^Z\u001cQo\u0019\\j\u0011V\u0019Uo\u0012T\u0016Q}\u0002X{\u0017Ut\u0016[R [K$aO%Z[/dY(bS!cU\u001e\\a\u0018]f$Yb\u001cWn\u001cSi\u0018X{\rW\u0001SP\nW\u0010U~\u0011VW\u001aYo&[W\u0019\\^\u0014[^\r^u\u0012Va\u001bZt\u0018\\_\u0015XT\u001bUp\u0013[k\r][\u0013Ys\u0017Xp\u0010Zd\u001aWp\u0017[U\u001c`o\u001c]\\\u0019aO\u001a]I\"a\\\u001bYk\u0011O`\fX\tP\rT~\u0007Ws\u0007Pm\u000fOq\u0012P\u0018[x\u000eW|\u0013\\r\u0011Yj\u0018WU!\\Z\u0011^d#_s\u001b`W\u001f`R\u0018ca\u001dXJ\u001f^h\u0012a~\u0007Ys\u0013Vr\u0017Q\u0014Sl\fOx\u000bUj\u0011Rt\nR\u000fYp\u000fSg\u001bUo\u0019Yi\u001b\\Y [t\u0013]b\u001eYt Yl\u001b\\\\\u001bWk\u0013_q\tSs\u0005]d\u0019Wv\u0012[q\u0018[^#Zh!ac\u0010`f\u001d^b\u001b^R\u001c\\h\u0018[j\u000fe^\u0018]X\u0011\\f\u0018\\k\u0016W{\u0010Xt\nVv\u0006SL\bP\u0006LQI\u0002Q\u0006Ry\nN\u0002V\u0004Vx\rKs\u0014Tj\fS\nVz\bMv\nPj\u0011Uw\u0018\\^\u0015V]\u001bTb\u001aUi\u001c[i\u0014SO\u001f\\g\u0017Zc\u0014Zd\u0018Xe\u0014`b\u0015XZ\u001e_`\u0018XQ\u0019[X\u001eXe\u001f\\i\u0015Yp\u0015Yl\u001c_[\n]_\u001c^_\u001b_[\u0015bQ#Yj\u001fX_\u0018\\b\u001dXQ\u001e_e\u0016\\l!\\s\u0014Zk\u0019Zl\u000eZ\\\u0013YZ\u0011WT\u0015b]\u0019]d\u001bZV\u001f]`\u001c[Y\u001dbX\u0018^R\u0014YZ\"[`\u0010Us\u001a\\l\fVh\u0016Xm\u0019[r\u0011_\\\u0016Zo\u0014\\x\u001a\\t\u0014Uh\u0012V\u0010UrY`\u0015Yj\u0013Vk\u001bY_\u0019[e\u0016Zd\u0018^V\u0010]_%aU\u0018a[!`Z*bI UO!^Y+_^\u001f]n\u0010`W\u0017_c\u0018[a\u001baf \\a\u0017[S\u0019Yb\u0014[r\u0012V_\u0012Wh\u0017Xf\u001d\\Z\u001bZt\u001d`u\u000fWb\u0016Xk\u0017]u\u001b[{\u001bXz\u0014Vw\u0002Q\u0005K\u0002O\u000bT\u0012Sz\u000bPz\u0011[c\u001aTe\u0014aU\u0017_F'`Y!bY\u001f]p\"Y]\u001e\\P\u001b][\u0016bh&Z`\u001bYL\u0015Yf\u001d[U\u0016ZZ\u001eRq\u0010Vt\u0013N\rV|\u0013Zh\u0012Ye\u0013`f\u0017bV\u001eZZ\u0013\\g\u001c`g\u001f`h\u0017_R\u0017_]\u001d^Y!_]\u001c[q\u001e^m\u0012W`\u001aY[\u0013Vg!_o\u0015]T\u0015_i\u0016Un\u001bW\\\u0014[]\u0012V`\u000bW}\u0012Tc\bWm\u001aWq\u000bZk\u0016P\u0011Q\tRj\u0001T}\u0014Ns\u0018Oy\u0002RwRt\u000eVy\rX|\u0014Yz\u0019Xb\rXt\u0010[_\u0018\\q\u0016]o\u000f`L&_c ]M0]P$a[\u001ec[\u001d\\K#^W([[%aO'gL(bA&bJ%a[!^V\u0017^O\u001b]Z\u001c\\Z\u001eaX\u001aaX\u000fVV\"]] `Q\"Yg\u001e[b\tZn\u001dXa\u0018Vr\u0018Wi\u000bY{\u0002Vk\u001aQx\u000eRo\u0000Tg\u000bYr\u001eSv\u0016Vk\u0010Ti\u0015Wq\u0018Wx\u0013[^\u0017Yo\u0014W]\u0015V{\u0018Za\u0010b[\u001b[Y\u001b]f\u001fcT#eb\"bA'cX&cM-fM'X_\u001f^a%cU bN\"c^\u0017_@ a\\*bM,[]\u001f`X$\\?)_Y%eI\u0018dY$fb!_U \\U\"\\p\u0016Wk\u000fZ{\tYt Yr\fYZ\tXe\u0018[s\u001f\\b\u001fTc\u001b\\g\u001aRa\u0012V|\u0013Rv\u0019Xh\u001dZa\u0018Yc\u0013`c\u001f]]*^X\u0011`e\u001d^X\u001b]m\u001bVg\rTuUy\u0017[x\u0015Ts\f\\p\u000eVz\nV^\u000eR\u0004T{\u0000KFKPN\u0001M|\tRXt\u0010X}\u0012Um\u000fXb\u0010Yy\u0015Um\u000fUh\u000fY^\rYZ\u001a_`\u001bbX%\\S(eJ%a])cJ+hK+lP+b6)eQ%dF&dC\u001abP\u001b]F\u0019\\O\u001e\\U\u001aYf\u001da]\u0019]l\u001b`g\u0015Ql\u0010O\u0010Oy\u000fOu\u0013Up\u0018]N!b^#cN#b])ai bW\u001eYN#[f&cP(^V\u001d]F\"^X&cY\u001faA-eP%]Q,`A#^[\u001bbY\u0012Yf\u000fZh\u0011Tl\u0005Mz\u0015S~\u0007T\u0001V\u0013M\rR}\fU{\u0015\\x\u001bXe&Zj#^`#`X\"`K\u001beU\u001e_I\u001c`?\u001d_W\u001aXY\u001cZZ\u001f`d\u001f^z Tv\u0019Yc\u0013[e\u0019d[\u0017^a#gV\u001e_`\u001d_m\u001dbC!fY&c<#]V*bT\u001aaP\u0015Z\\\u0017[\\\fX\\\u001bWu\u0013`\\\u0016Y^ Z`\u001fZc\u000e\\e\u000bTl\u0015Y\u0017Xc\u0014[o\u001e_W `i\u001d^j!]a\u001bbd\u001b[V\u0017YX\u001fXY\u001e]\\\u001d^d\u0015XD ^Y\u0018cF'cO-i=#g>2e8'cA-eN'eC)`P!_S\u000eWm\u001dUi\u0012Sp\u0016]w\u001aWl\u0012]o\u0012V\u0004Pt\u0001[k\u000fW{\u0012]]\u0014\\E'^Z*^P)aC'bV!`f \\M\u001bYj\r[\u000f\\e\u000bXR\u0019[q\u0013UT\u0014V\\\u001aW\u000eTv\u0019V\bQq\u000bV\u0001MO\u000eKx\u0010W}\rSx\u0017Uz\r\\\u0012Ux\u0011_R\u001e[h aO\u001dYS(b[\"_I!cP#bO.\\M)fX\u001c[_\u001f]w\u001f^u\u0006Y{\u0010U{\nP\u0003JQw\u0001Lz\u0007St\u0011Tq\u0018TY\u0014Tf\u001e[c\u0017dR\u001a`R%_X'dc)f]\u0017_d%[\\\u001cYu\u0017Zs\u0006Uf\u000eY\u0010Rs\u001bVr\fTf\u0012^Z\fZo\u0017[d\u001bY\u0016]`\u0017Z\\!`K\"`R\u0016_?\"]K\"aT'[c%_b\u001e\\b\u0019cK\u0013da\fZn\u001fP\fQ\u0003RKJC@=ADHP\u0003G\u0005IMGQ\tP\u000fSl\u0012\\Z\u0019a<-d =h\u001eFr'>s*<p'=r1<k93l*3a2,cF/aW\u001cZp\u0016X\\\u0012\\x\u0015Yt\u0014U\u0016T|GBLQ~\u0016Nx\u0015W_\u001daY$_D4gP*l;0aT*dN,dU\u001f^s\u0013Zd\u000bV{\u0012T\u0005N\u0002JTKFDILL\u0003R{\tPf\u0015ZG\"]N!aM+f;(l;2p/3p!7n62o9)g+.d]#dk\u001e_V\u000eXg\u0019Uz\u0015Y{\u0011Uh\u0010Yt\u0015Uq\u000eN{\u0012Ut\u0006K\u0011X\u001cV[\"[g$^K,eF!fF%lF(hB(g\\\u001egV\u001e]N\u001dYv\u0015Xb\bOv\u000fUw\u0004Ot\nQ\fW~\u000eQ\fVv\fT^\fTn\u0002Po\u0010So\u000bQ{\u0019So\"ZM\u0019]U'cL2l85p73i11f',a?/e?\"a`\u0016\\t\u000fVd\u0012T\u0006O|OJ\u0000JT\u0003S\tV\u0002Z\u0017Xm\u000e\\W\u001c\\f\"dO d52k.6j'4h7-n5/n(2n'<o*Co\"8o\u001b6n43l((iC#`R aZ&YZ ]i\u0004V\\\u0011Pm\u000fQE@=201;/58;?CDE\tK|\tPx\u000b^m\u0015Ut!dK)e96m(9o\u001d@r\u0015Ds\u0016Bq\u001a?t\u000e=o.1k12gG*eP!aU&`_\u001c[e\u001eWj\u0014[\u000fZv\tP\u0000N~\u0004U\tU\u0006Qs\u0000T{\u0002\\g\u0016XR(cR\u001egB\"gQ(iB-hP\u001cZX\u001fZy\u0014Uc\u0011L\u0005RFEFGEKORR\rPm\u0018]j\u000f_S#]M*fG,kS+gI+aH\"dh `f\u0013Wu\u0010Vr\u000fT\u000fPw\nN\u0003R\nSS\u0003LD\u0007Rl\u000fSr\bUo\u000f\\n\u0019Yo\u001a_]\u0019^a%^L&d>5l4)hG5iJ2bC0b[#`l!Xj\u0016`V\u0012T\rR\u0012OL\u0002IST\nI\rO~\u000eRy\u0007Pq\u0010W\u0005YT\u001aaJ%dS-gH,cA,eF!^T\u0016Yc\u0010]r\u0019Wv\u000fN{\nKJC@GEE\u0001MV\u0010Vv\bVr\fVr\u0014RX\u0015ZS\u001a`>+a='jS$g@*f]\u001eb^#aO\u001db]\u001c[V\u0018Yi\u0011]l\u0012Z{\rTy\u0013Re\u0010Sj\u0012Z\u0010V\u0007R{\u0014R\u0003I\u000bHJrNr\u0013Zr\u0012\\M+dX+h>'i>0lD2lJ)bQ!V[\u0015Tv\bV\u0000FQLDI=HCHKM\u0000Su\u000fWj\u001eZ`\u001e\\R$^K+dP'c^\u0018_b Z]\u000eTr\nO\u0000R\u0000OKIDJLD\u0000F\u0013HO}\u0005PT\u0015WY\u0019]M\"bG&b8.h9+n63nC1o6%i2*dM([Z\u000e_m\u0015Wg\u000eT\u0011Wt\u0001PyEDHEEGPR\u0013Vr\u001b_l\"b:+g;'g12j<1j\":l\u001d8o&>r$5n)8h+5dB.dC1a-#`6.dS\u0019We\bRxHEA-0)\u001f.)48@A@MJL\u0003Uu\u0014V_\u0019\\Q*h70o%=x\u000fAw\u000fHx\u0010Fw\u001dDt\u0014<l(6hM\"ca!Yc\u0013M\tVDF\u0003EMMFK\u0000K\u0004N\u0000O\fT\u0012Rj\u0016Xb\u0016_Y!^I'cZ.dK,eQ$dY _^\u0015Z[\u000bM\u0010M\u0004N\u0005JMFCHCO\u0002P}\u0002Y\u0014To\u001d[d\u001ba:*bF)cC-f;\"`9)_P+^N$`R\u001cb]\u000e[p\u0018Xm\u0006Rr\u0011MF\u0003LJFFGMH\bQ\u0000K\u000eUn\u0016]Z\u0010WX!_O&b[+]= aV\u001fdU\u001dXl\u0014U~\nV\u0002I\tUHAEJFEHQ\nM~\u0005X~\u0016]u\u0015]e ^a\u001bhE\u001faS(^^\u001d]M!b]\u001d]T#`p\u001a]c\fWZ\nPn\nUrM\u0003GR\u0001N\u0007Vw\u0017Sw\u000bQi\nZ\u0012\\a\u0011]V!YS\u001cc_'b[&bO%_V'[P\u001b_Z!]k\u000eUy\u001bWz\rRz\fOO\u0006R\u0000M\u0004KE\tN\u0004L}J\u0004IT\u0005Q\nYk\u0019Sw\u0015]d\u001b^U'b_+^^&b^%iN%\\Q)a]\u001e\\x\u0019W\rP\u0001JFBBG=GDCBM\bD\rX\u0010Zb.bH5j\u001b)h%9q:)k#.fI(fb\u001dWq\u0014Ny\u000fRL\u0004IAJHHKDIS\u0002Os\u0007Tl\u0015Y]\"bd$dE!gC1k01f?+eA$_K\u001b[g\u000eVw\u0015Y\u0014Xk\tTs\u0005Q\u0006IDIH\u0001KJRWu\u0010Qd\u0012\\m\u001a^]\u001bdM\u0018fN\u001fe>(fL2fH+g74l*;m27q&6n 4g%5c60h9*dL$d>%[X\u001a\\n\u0011Yo\bEF;.,'\u001b'\"08D?\bN\u000fVf ^[&iE*l/1q(>u\u0015Jz\u001aFw\u0013Cr%Bn)5l*3i:)i1+eE.]D%]^\u0015Wb\rP}M~MI;C?I\u0004O\u0001T~\u0005Yk\u0010Vk#[G `O0i@(jP'`O!]`\u0019Z{\u0012MvOHECI\u0000J|I\u0007Q\u000bG{\u0002S\nM\u0014X\u000f^q\u0016bQ$dQ4f;+kA.j<(gD#aL\"_[\u001aZy\u000eTs\u0011X\rOO?C;D@AIED\tMS}\u0016Tn\u001e[Z!g/*h90o8,k2-i;\u001fdD'[b$Ze\u0019W~\u0013Xx\u0000KJ\u0003CEKEIP\u0002Q\u000bS\u0012X[\u001dVP(]` ^b,_U,bF*`Q(cM(]Z\u0014\\}\u0010U|\u000fUn\u0002Ot\tR\u0005S\u0011LM\u0001OGG\u0003H<JM\u0003P\u0012Uo\u0014Vu\u001fZQ$aN(g14i60m19r+8s!=q%3kD-lU*`Z(dQ*_[!W]\u001ea_\fW|\u0010Xm\u000eQ\u0006MDD=BGDA<KDNPw\u000eY{\u0011\\o\u0016]o\u0016Vs\u0018\\L\u0018\\e\u0014`U\u000faU\u001cZ[\u0013`g\u0017_T\"ao\u0011]Z\u001c[\\\"Xe\u001aXe\nYi\u0010Z_\t\\q\u0016S\u0012Pr$Y\u000fVU\u0017ZS\u001d^m\u001f\\t\u0015Z{\u0015Rz\rQU{\u0006I\u0012Q|\b\\o\bR\nVa\u0016Xd [c\u0019^P\u001f^a&bW*^h\"^]\u0013^x\u001cXe\u000eUw\bRl\u0015Rk\u0011Tv\u0011X\u0011V~\fQ~\nL\u0003JyMQ\fM\bMn\bPK\u0004T\u0000Oz\u000bNr\u0012V\tUz\nO\u0011St\u0007S\rP\u0007Or\tW\u0006Rm\u0003R\u0006Q\rN]\u0007Up\u0017V~\u000eWs\tTk\u0016[g\u001eUg\bWp\bUs\u000fZp\u0015YZ\u0014Ud\u0017X~\u001dZk\u0011Yb\u0011Vo\rX\u0014\\n\u0011Zl\u0016[c\u0016Yq\u0012cP\u001b]o\u001c\\_\u001bVK\u0019Wy\u0013Wv\fQo\nQ\rR\rSJ\u0000N\u0006Ji\rN\u0004N\bJ\u0000N\bJ\u0003Ny\u0003Q\u0003S]\u000fV\u0018[e\u0013Xa\u0014^}\u0016_R\u0014_T\u001dbP'\\T\u001aWg\u0017Zl\u0011Yg\u0019Wm\u001d\\o\u0015^f\u0013Xe\u0010R~\nQ\u0010T|\u0001Lw\u000fVq\u0012K\u0003V\u0003Rz\u0010Vs\u001aWh\u0007[[\u000fYc\u001ccg(VU _b\u001f\\s\u001fZ]\u001e[a#XN\u0016Zd\u0016_c\u0019]c\n\\k\u0017]s\u0015_f\u0013[_\u0019]r\u0017Zb\u0013Z[\u0017Yj\u0014TV\u0015V\u0010Ur\u0004U\nTy\u0010Rb\nUq\u0010Vp\u000bUy\u001cTp\u0012Xg\u001cTu\u001aYn\u0012U~\u0014]n\u0012Sc\u001c^d\u001fYo\u001acT\u0017bS!\\k\u001f[R\u001c^f\u001a[Q$]g#VQ\u001dYb\u0013W~\nUw\tQ\u0006Wg\u0016[u\u0016Wp\u001aUh\u0014Pm\u0014S\u0016WM\u0015Yq\u001b^n\u001a\\Z\u0015Ys\u0014X\u0010P\u0011Pa\u000eVk\u0011V]\u0015Yi\u0005Vo\u0013Zc\u0013Ng\u0013Xc\u001aY_\u0017]r\u000eRs\u0013T\u0017X\u001bV\u0003Vk\u0015Tm\rVb\u000eV\u000bTg\u0010Uj\u001cZh\u0017Ud\u0017Rz\u0019S\u001f[p\u001bYf\u0016\\^\u0018]U(]U\u001eaG\"^\\\u001cW}\u0015Xj\u0011W\u0017To\nQp\u0017R\u0013R|\u0019\\p\u0013[d$Ze\u000eVk\u0006V}\u0010V\u0012V}\u0004Ud\u0011Y}\u0013Xi\u0015Tx\rXo\tLv\u0001O\u0005O\u0003IBBJ\u0002MLSv\u0016Tr\u0018Xi\u0014Vk\u0016Yd!\\T\u001e_c\u001d]Y\u001f]d\u0019[a\u0016[u\u000bVa\u0010O\u0014V\u0004]\u0002Sz\u000fT\u0003[\u0006S\u0012Q\u0012X\bYr\u0014Sv\u0006R\u000bL~\fS\rJ\fUo\u0015Sp\u0012X}\nSn\u000eTx\u001bUs\u001bY~\u0013\\n\u000fT~\fQy\rW\u0010Xy\u000eV|\u0015Up\u0018Q\u0004Q\u0007UqU{\u000eXx\u000e[\u0015\\z\u000fW\u0010Sk\u0012V\u0011Wu\u0014Sw\rT`\u0007XtUu\u000fNm\tP\nV\nUv\nP\u0000Sy\u0011PX\u001cUU\u0018Xi\u0019_~\fX{\tT~\fXN\u000eXNz\u0007M\u0001O}\u0013N\bWz\u0013Xl\fWp\u000fSh\u0010`n\u001fZX(Z\\\u0012VP\u0016[q\u0016Xf\u0015Z]\u0019]r\u0015_z\u001dYo\u001d[`\u0015Y^\u0018Zl\u0013Vz\u0007Y}\r[|\tYk\u000bZ\fZa\u000bTx\u0012X~\u000eT|\tRRN\u0010N\u0002Qu\u0010Xt\u0015[v#_h\u0015S\nTy\fS\u0001NO\u0003L\u0002M\u0001M\rT\u000eUu\u0002Tq\u001bVx\n[v\u0013W^\u0014^p\u001eWc\u0015[h\u0016Zh\u0018Zk\u0015V\u001b]m\u000e]p\u0004J~\u0010R~Oj\bQ\u000eWx\u0013Ti\u0016Ut\u0015Vk\u000fYg\u001cZp\u001bYt\u0005Tc\fWs\u0012[f\u001eTg\u001d_c\u001d^\u0015Yw\u001bT\u001bTk\u0015\\x\u000fX\fO\rNKOxI\bOQ\u0006Q\u0010Q\u0015Mp\u0014K\u000eS\u000bS\u0006X~\u000fS\u001aW\u0005Uw\u000eN\u0002X\rWr\u0010R\u001cXr\u001dZz\u0014Y}\u0019YTy\u0002R\u0006P\fZ\bQ\u0011Tp\u000fSu\u0013Yu\rSj\u0017U\u0005Q}\rSi\u0018P\u0013Vl\u0018Z\u0013Th\u0017Wm\u000eXe\u0016W^\u0018Yr\u0016Yi\u001dah\u001b\\l(ce\u001f\\a\u0011]m\u0011_x\u0010Xg\u0016Xj\u0013\\f\u0013W{\u000eYz\tR\u0007R\u000eO\u000bR\bL\fO}\u0015Tj!ag\u001fdH,b</fE$cd\u001edK ]T%ZL\u0017]s\u001cTr\u0005Rt\fT\u0003Ox\u0011W\u0006V{\u0000So\u000fQx\u0011Vz\u0014S\u0012V\u0013Zi\u0014Pp\u001fT{\u0014Oz\u0014Pp\u0011R\u0007UiK\u0005QJJGH\nR\u0001NP\u0003G\u0000O{\u0006Rz\u0005Sz\u0010L\u0001O\u0004N\u0011V{\u0007Q\u0007O\u000fN\u0013Qu\fVl\u0010Zl\u0015Xu\u0016U\rO\u0012Sk\u0006X[\fV\bT\u0011Z{\bQq\u0010Yh\u0012Sq\u0015Zo\fSw\fQs\u0015Xi\u000bZk\u0010St\tU{\tT{Tt\u0001T~\u0005S\u0007L}\u000eTf#]e\u001d`p `]\u0015Zj\u0019V\nJ\u0012S~\u0018V\u0013Yl\u0010S\u0011R\u0014V~\u0007Sc\u0016Vq\u0005Oi\u0013Tt\u0010V}\u0014S\bP\u0006U\u000fT~\u0007N[\rTu\u000fT\u000eQ}\u0011S|\u0006Tp\fW\u0002R\bT\tPn\u000fY}\u000bSc\u0012Zw\u0005Yp\u0006^a\u000eZh\u0011Yx\u0019P}\u000bTx\u0004Q\rT\u0006R|\nI\rHGCMKAU\nM\u0012K\u0002ON\nRx\tS\nT\bOWb\u0003Sl\u0017W\u000eXy\u000eV{\u000fV\bPz\u0013Om\u000f\\i\u0011Yp\u0016Tf\u001aXs\u001cVu\u0018S|\rVu\u0005Yv\u0016O\u0005T\bRyIKJ\u0000JO\u0003P\u000eRS}\u0004LyNSFMQ\u0001P~MG\u0000PK{\u0002Q\u0000J\fUOs\u0007S\u0004M\u0001T\rG\u0006P\u0004MxP{L\u000bK~\fM\u0005Q\u0003U\u000bWw\u0007Z\u0014Xp\u001bTo\rTv\u000bT\u0016Yd\u001a\\S\u001aXj\u0018Xz\u000fVv\tZt\u001bWq\u0004Wl\u0005T\u0005Q\nS\u0002MKJ\u0006EJ\u0001R\bS\u0001I\tW\u000bOn\u0015P\nQxR\tG|\bKFDH\u0002KL\u0004KIOP\u0001Oy\u0007Rn\rUx\u0013[h\u0011[m\u001d^i\u000f]]#^Y\u001acM%\\=\u001aYV ^^#^W\u000eV{\tP{\u0002PS\u0007I\u000eL\u0004O~\u0005V\rXm\u0004U{\n_\rSzS{\u000fM}\nQ\u0005X\u0005T\u0015Y\u000eY\u0013[^\u001d]\u0014Tm\u0011Vk\u0011U|\u0005V\u0006Ry\fP\u0010S}\u000bSq\u0017T\u0013U\u000bVz\u0012V{\u000eO|\u0005W\tNu\u000bP|\u000eX\u000bR\u000eTa\u0006Rg\u0014[x\u0017S\u0018R\u0006Ux\nR{\u0007XMz\tL\u0005K}\u0003L\u0004L\u0001IF\u0006N\u0006T\u0001LiLzYk\u0005Ot\u0017Zx\u000bRk\u0005Ua\u0010Xj\u001a[k\tTu\u0011Ny\u0000QJ\u0002E\u0003GLIL\u0003Rs\u000eYy\tVu\u0019^r\u0013Yi\u0017V|\u0016Qo\u0015Xx\u000eX\u0007X\fU\u0015Un\u0014Tt\u0018Zu\u0013Yt\u0019S|\u0015Xy\u0016T\nWl\u0007Up\u0006Kq\u0006Rx\u0007S\u0000Yx\u000fQ\nN}\fRy\u0007L\u0003T\u0001P\tLg\u000eQo\u0007Q\u0003P\u0005HMC\u0000D\u0001>435/77;=KPF\fT\u0004Q{\u0012Te\u001a`e\"c]%fF0d@2kD%j03mA,m:'eH*dD%\\k#Z\u000eQx\bQ\u0004K\bK\u0000H\u0004KC5A6>CICG\rRo\u0017[g\u001a]d\u001a[`\u001ddJ\u0017^N\u0015]_\u0014Nz\u0016SQIC;EJ>JIEHF\bP\u0003N\u0010[{#Yn\u0015XN\u001eah,a_\u0019^]\u001c\\V\u0014Sm\u0012\\}\u000fMp\u0005L|\nO\u0006G\u0000A=7?>?=?DKz\fUq\u000f]N!a=-lA0gT-eD&eB%`[\u000f\\g\u0019Vq\u0014R\u000bSJMIDCF==@=DI\rOz\u0011Wj\u001eZN)g@/iN$f7+dD%^m\u0011Y\nVu\u000bV\u0007R\nQ~\u0011WO\u0006QLFMF?@I\u0001KO|\bWx\u000fTl Ym\u001c]V\u0017V]\u0017Wo\u0016\\m\u0012]i\u0007St\u001bU\u0014Nw\u0005U\nFL\bMEHIHFJ\u0003P\u0004Q\u001cYz\u001e[c\u001bcJ'g[\"hQ*bY\u001fa^\u0018dZ\u0010Yg\bQ|\u0010TKG=@I8D6=>C\u0000A\u0003O\nW{\u0015[`#_Q$^T*iV\u001f]6$hL\"]L\u001bWf\u0011QM\u0003ICC><=:49-<>HJ\u0004Ss\n[d\u0012]U\u0016\\f _[\u001acH\u001f^F \\S!`\\\u0016Z{\u001fZu\u000bUw\u0007O{\u0000U\u0002LOI\u0004K\u0002K\u0004RnM~\u0011Sz\u0018X`\u0012Vl(`U.hP%dX.i@7mF5q5*m<5g<0e9$aK/ad$]d\u001d\\_\u001b[l\u0014U\u0002G~H;')$+!\u001c)++11:DMQ\u0005[e\u0015\\_\u001ccT%gc(bY&_V\u0017cV#cE\u001fdO\"\\]\"b_\"bo\u0010Y\u0010Uo\u000fPSN\u0005HJLM\u0001KL\u0003P~\u000e\\_ aE,bS\u001adJ$dX\"aS\u0013]]\u001c_u\u0011Y~\nQMLIA<IC9@CD\u0005QP|\u0001We\u0012Xd\u0014Vf ^K _[\"aM!_H&cc\u0017Yf\u0011StKt\u0004NJIB@>B@E\u0003J\u0004P\nUm\u0018Xl\u001d[[\u001eac bg\"cL\u0016ck\u001b[_\u0017Tn\nZq\bNz\u000fM\u000bO\u0004K\u0002HCILQ\u0002O\u0007O\u0002Q|\u0003Pp\tN}\u000eMy\rN\u0012U\u0014Sm\u000fYj\"bW&aM\u001bcE)[[\u001e_j\u0012]q\u000bT~\u0002S\bL?EGIEDBIK\u0000IL\u000bP\u0005Te\rWe\u001ffP#gL(h>,i.9n28q\u001e8n-4m>-bH(^h!Yd\nOI:1\"0+-+*1)=BM\u0000T~\u0015U^\u0017X]\u0013c[\"aK%iC)_L\u001e_f\u001baW\u001b^a\u001b\\e\fRp\u0015W\u000eRm\rQ\u0016Q\bR\u0007O\u0000ROL\u0002O\u0002Pk\u0011Th\u0012YP\u0012_S\u001fb?\"eG$aI(b@,g4.c>&`P(c[\u001d[j\u001fW|\tSvH?;5819\u001d&3338BDI\tP|\u000bYs\u001ecM%_E-k(8n#=o\u001f>n\u001d4s$:r\u001e6kD/f4*hI&fJ-`M ^Y Wo\u0010U\u000bS\tM\u0004GFHDNHAFLMD?F@:64//,1:9?F=L\u0002M\fOm\fRi!]\\%b70j.4p83l(7n05l?.cI,c^\u0019[j\u0015R\u0007RNGGKIIC@BG@\u0000K\tR\u0010Yq\u001dYh\u0016[`\u001b[u\u001bXu\nSu\u0013Rz\u000fPv\u0007N~MHFKAAB??=HM\u0000N~\u0012Qa\u0012`G&h<+h80f7*f8,dD#[M#X^\u0016Uy\u0010RJ\u0003J\u0000G@KLIN_\u0002St\u0007V{\u0001Uw\u000fP\u0013Sw\u0005Xc#\\W$`P\u0018aK%e<\u001eeE%fG+e@1gM'd;1eB\"_D\u0016Zr\u001aVq\u000fN\u000eK\u0005H@7<4+48,1(0?DG\u0003G\u0007Sx\u0015Xo\u001abm!XV#^_\u001f^O\u001f_b\u001bd[\u0018aY\"Wg\u001aZj\u0017Vn\tQr\fRt\u0003K\u0002N\rJ{\u0010O\rJ~\u0003R\rRu\u0006Xy\u0010[h\u001c^Y ^b\"_`#aS&eL(b=!d=+k>!cT\u001f_Y\u0014YN\u001e^l\u0010R\u0002SA?1+'#3,,<BAA\u0003S\fSs\rSl `U\u0019eU+eL+g@/aB)\\<0cJ ZQ\u0015\\M\u0018[n\u001d`t\u0016Q\rOCCECEBD\u0006K\u000fT\u0002Vh\u0010Vi\u0015[q\u0010Wc\u0019Ue\u000ePRLFFC\u0007F?NDCIACPLy\u0006T\u0018Ug\u0014]L\u001c\\I)gT&j>/d?/l<1h53eH+j?%g?$`L\"`T\"bP\u001f^a\u001c`R\u001fXV\u0016Zu\u0012V}\u0011U\u0001PPHKHD<9=8;G<6682(&-55;CHC}N\u0001M\u0004R\u0006Qp\u001dYp\u000f_N\"_K'cN,f<)i90_C%ZM Zo!Ym\u0014Vy\u0002O\nSv\u0000LIC@@G8>GLG\u0007SvTn\u0013UZ\u0012^Z![i\u0014c^\u0017[_\u000fTy\u000fW\u0016P|\u0005OHJ\u0004E@?AIDJEJ\u0003Qt\bQ}\u0012af\u0015]W\u0019_K#`P+fY\u001c]V\u001e^m\u0016R\u0002X\u0005X\u000fR\u0002H\fGJKI\u0003KA\u0000B\u0001GHJ\rQ}\u0015Xg\u001dZf dZ\"ca fI%dT(kP/l9+h*-dA)f?&fY$_L%fU\u0018__\u0019^b\u0012Wm\u0018Uq\u0017Wz\u000bWMN\u0003JIM?CM\u0001DHJKN\u0000JL\u0004I\u0010Nw\u0004U\u000eRt\nY^\u0014T|\u000fS}Hj\u0006Xz\u0013Qr\u0016Vu\u0013Qi\fJ{\u0019Vi\u0011Zu\u0010Vs\u0010P\u0018X\fU\u0013Wk\u000bV\u0005Qw\fU\u0014W\u0013S\u0014V\u000eSo\u0010Oz\tY\fW~\rS\bT\u0003H\u0006H\u0007J\u0002H\bJPuS\fOy\u000bQw\u0010Um\u0004Yj\u000eWv\nS[\rYs\u0013Vq\u001cPk\u0018Zw\u0002S\u0003QO\u0001GKKHIEBIJ\u0003N\u0005X\u0001QrS\nRM\u0004GM\u0006JNKKNFIFEECM\u0004PN\bLL\u0002IKHKHL\u0001S\bMw\u0005K\bRLP\bL\u0003QU\nO\u0007HQ\u0003REHK\u0003PPPQ\u0002M\u0007IuJ\rO\nRV\u0001Qo\tS\u0005Lz\u0003DEOMG\u0000IKKK\bN~\u0007Y\fN}\u0017S}\u0011N\u0011N\u000bM\u0004K\u0006O\u000eQ\u0015M\u0010O\u0011I\u0004P}L\u0003O\u0002PO\u0000J\u0001OS\u0005M\u0003M\fS\bS}\u0003P|\rO\u000fR\u000bSJ\u0003FK\rMH\u0006V\u0002Q\rQQ{\u0006O\u0005P}\u0005Ow\rSv\fUt\fNt\tNL\u0002ILFQ\u000bH\u0017Pz\u000eR\u0006U\u0007Oi\fQN\tO\u0001NM\u0000K\u0002M\bQOPNDHN\u000eE\u000bNIOLGFAAFMK\u0005M\u000bS\u000eO\u0006N\u0000P~\rM\fSR\u0002O\bI\u0000KOUSl\u0000U\u000bR\rT\u0004R|\u0007TILQ\u0006R\u0004S~\u0005Op\u0004Qw\u0011Y\u000eSR\u000fV}\u0001S\u0001P\u0001NyM\u0001WTLx\rQ\nRuS\u0001R\u0000M\u0007QSPLq\u0001HHGBL\u0002SN\u0003M\nRu\u000eR\bQs\u0015O\fR\u0003O\u000eON\u0004M\u0003FH\bJNW\u000bN\u0007J\u0003R\nO~\u0014O\u0002V\u0004N\u0000NO\u0002PPHNMT\u0006OIED\u0001JILRLMP\u0003Z\u0007M\u0010W\nRu\u000eQw\bR\u0002QOL\nM|M\u0002LHSQF\u0006INzNFEGC\u000bI\u0000CTH\u0004LO\u0006JMK\rO\u0006Q\bSNMGIJKJA>@G@GCKN\u0006HM\u0002N\u0001QzQ\bL\u0013Pt\u0004R\u000bL\rIR\u0014R\rS\u0005S\bS\u000fQ\u0004P\u0005JJIE?;BB?EI\u0001@N\u0001M\u0006Nn\u0015Tx\u0014Ti\u0013YM\u000e]b\u0018Wp\u0017Wl\u001bXy\u0004O\bRMMJB\u0007L9KELEEKK\u0007O|\bJQ\u0010KQ\u0001JN\u000bQ\fOO\u0004ONQ\tO\u0005L\u0003R\u0001R{@\u0001DDE\u0002AN\u0000Py\u0003Uu\tPR\tP\u0003T\nO\rNx\u0017O\u0002V\u0003HGo\u0006KMK\rH\u0003MIO\u0004VHO\fK\u0007I>GKGGEN\u0007OIFHIEAHzT\u0002Pw\nS\nWi\rR^\u0016So\fVy\fR\u0007P\u0003I\fC\bPKP\u0001NK\u0011J\u0003MO\u0006LTP}\u0001O\u0002MGJ\u0003N\u0004FIMFKOPL\u0004S\u0005En\u0000U\fJ|\tMx\u0004Ru\u0003TMw\u0001PvKCFAHF\u0001NLt\nSLxOR\u0003N\u0003HKIp\fWu\bVk\u000fRZ\u0010Vt\u000fS\u0013Q\u000eV}\u000fZ\u0006T~\tWs\u0003M\u0016P\u0003S\u000bRMOH\u0001NOJE<C@DGAE?GGHJJ\u0003KsT\tL\bK~\u0003Nl\u0007Pj\u0017M{\u001dYo\bN\fU}\rFNHHHDC<HBGFLGGDKQPt\u0014S\u0016Pz\u0014R|\u0005S\bQ\u0000J\u0010J\u000fL\u0007NC\u0006NK\u0002KMOOn\u0007L\u0006SN\u0007M\u0000RJJEPMzO\u0005K\bL\tKP\u0005MLC\u0004KDBGEAFF\u0000L\u0004JM\u0004M\u0003K\u0004NH\u0000IM\u0005P\u0017Uu\bXx\u0014R\u0013U\bR\bZ\u0005Q\u0006MK\u0000KAMHN\u0002OLF?\u0001BJDH\u0000GOH\u0001J\u0006M\u0002Iw\u0006Q\u0005LJLKQ?\u0001KGMJJKOGQ\bM\u0010N\u000fU\nQ\u0004K\tJ\u0002MGJMNTI\u0005S\u0010T\bSz\u0001N\u0002K\u0001OGL\u000bH\u0003OP\u0002J}I\u0003MEG\u0004IC{P\u0006LM\u0006HHK\u0000FFLC\bJ\u0006JM\u0005P\u000eO\u0010Y{\u0010[}\u0006Q\u0004SLH@?>30-)094>>EADOz\fSe\u001a]f\u0018^U#iR)cE\u001fcV/]W(`U\"Y@\u0018\\y\u001aY{\fTr\u0000Kt\u0003PGFB6CABDGJ\u0004H\bY|\u0013Xm\u0016Wd\u0015_\\\u0017Zq\u001aY~\u0012[\u0004M\bM\u0000L?9G=GE849>:7ENv\tSl\u0011Zs\u001e][%]V\u001daS\u001dXW\u0016Yd\u0013Tz\u0006J\u0006@95>>:C=7;==EK\u0006It\u0013Zh\u001d\\a aF!`W\u001e_^\u0010au\u001cVn\tXe\rQ\u0001QM\u0001BEA;EE\u0003FJ\u0006KM\u0000H\u0002SyL\u000bSv\u0018U_![_\u001d\\S\u001ccI,iD*j?-g?%cB,gP ]T ]d\u001a[v\u0010W\u0017K\fMFF?9?44(%\u001c\"\u0018  ,+25@>@M\u0005P\u0016Zo\u0019_V&fP'h81i)7o.3l5)l@5kN,aD%]Z\u001f\\X\u001d[c\u0014Y}\u0004P\u0006PG>;96:7<;@L\u0001Nx\rO\tQ\bW~\nR\u000eZ\u0000O\u0002LLE?8C>D>D?=G\u0002IKO\\t\u000bYw\rab\u0012^g\u001aZw\u0019Ug\u000e^q\u0011Wx\fT\bLAL>;>?=@9HG}Ow\nZh\u001d]j'\\^*fC+j6.cC'gE#_d\u001f__\b[~\u0007P}\u0004QIEC<@?<>CNEFK\u0002Rt\fTe\u0018`c\u001fb`\u001a]T#^d\u001b`o\u0012Zl\u0014S\nUL:@@>HG?A\u0007JFO\u0005L\u000fPu\u0018Vh `g\u001bYa\u0019_N\u0017eZ\u001e\\\\\u0013_p\u0012Ts\rQ\u000bLF=C76:5:@HFILMx\u0007Rt\u0010[^!di\"fS!eU'dG dI _a\u0015\\n\rS\tO\u0002IFGHCCFCKDFMR}\u000bZq\u0017Xc\u0013^]&^D%dY'`\\#^Z\u001bSk\u000eT{\fI~\tJIEB:;45;34:HNr\u0006U]\u0018YZ\u001f]T$\\Q.cL\u001fZ\\ ^\\\u0018X\fRs\u0003M\u0005IDAFBF@A?89:<OH\u000bS\u000fW\u0015Y]\"Yk&cD$fS*gO5bF'h>!^8#bT\"bi\u001cXb\u0012Wd\u0010Q|P@/.&+\u001b \u001e\u0012\u001d&\u001f(<>GL\fR\u001aYp\u0017aZ c:,hB2j(/j=0e/2k1#bZ\u001d`Z\u0013_a\u0015Wq\bRNDJ9<<<;;9CI\u0005Nr\tRt\u0018X^\u0013]i\u0017[f\fYu\u000bQ\fVK\u0004FHG\u0005GFEC>AFCINJSUm\u000f[n\u0015^j\u0017Yh\u0018[o\u0018Tt\u0013Kz\tU}Rm\u0004L\u0004D==87476A6EDHR\u0010Qz\nYV\u0017]V\u001da_\u001aY\\\u0016\\c\u0016R\u0003Op\u0001QLBGEOCDEEMIJ\u0002VRy\u0015\\q\r^\\\"YU!Y^\u001d`a\u000fRy\u000eTs\u0001MI\u0007CGBG@B?FB@IDLP\u0005Vu\u000bXc\u0012[a\u0012`N\u001c_N ^o\u0019^e\u0012Wy\u0019St\u000eO\u0004LH?=<625=7KN\bUz\bQw\tV{\u0015Wk$_K `d$aH'fM'aK ^c\u0015X\u0013[u\u0003Ux\u0001VMLGF>FACJ@M\u0010P\t[f\u0017X\\\u001adC\"eQ\u001c[Q \\Z\u0013Ua\u0019Sn\u000eT\u0000SwE\u0000M>:4;49;8<:J\nJ\u0006Rz\u0011V\u0019St\u001dYu\u001aQl\u0007]z\u0018Zp\bO\u0006LKA>F:??E=GBIK\u0006R\nWl\u0016Z_!Z`\u001ddR#bF&d>2fT2e>.bI(iG\u001faB(_\\ \\N\u0017Tj\u0011RTF>50-'#\"\"!089=>@@>=JO\fQy\u0012Yb\u0018Vv\n[g\u000fYn\u0011]j\u0019^q\fW{\u0010Ru\fH\fN\u0001L\nJ\u0004HIKJM\u000eI\u0000I|\u000eR\u0011V{\u0016Pm\u0015UO\u001c^Q#[O cT\u0015Yl\u0016U\u0014O\u0000G>4.-'*368>BFD\bQ\u0000S\u0018Wp\u0017X\u001b^Z\u0016YW!]p\u0019Zy\u000fWySx\u0007Q\u0006I\u0003JMGCCCC;8<>?@JP|\u0005L~\u0016T{\u0019Ym\fUR\u0019[g\u0013[s\u0007R\u0002QI@AFBA81;/:?@CQf\rVl\u0017`W'c]!f^+^M\u001e\\W\u0015Uo\fQ\fMFJ;GCC@C:>>:DD\u0002N\tT\bYv\u0019^i$`U#_N\u001c`J#bW\u0015Vi\u0011Vr\u0007NF<;33<552@>H\u000fM\nT{\u0012Vw\u0019Y]\u001dcP%dB*aP\"fL#bU\u001fej\u0018]Z\u0013YT\u001bYe\u001dZm\u0010_w\u000eQm\u0016Qg\rP\u0003OIG7:B8::AA61688=CHJN{\u0002Q\u0011Xr\u0015Vd\u0018[m\u001aO\u000eQq\rJOOLKIHGMIK\u0006C\tKL\u0003LO\u0005IKIGKN\u0002F\u0001M\u0003E\u0005MOFx\u0003RM\u0006M\u0003KGFMBGIKH\u0000=LAHBFEHHAFGH\u0000FEFIH\u0002FHKJFFEENHO\u000bO\u0005U\u0006OHHGGMH\bKA{HGC\u0004?E?CJ\u0000L\u0003N\u0000IMJKKHEC>@>B\u0005@FLK\u0006M\u0000H\rR\u0001MK\u0002K\u0002N\u0002Qw\u0011W\u0012Ss\u0017Vq\u0003M\u0007M\u0005IL@D@<FB@EKHO\u0007JL~\u0006PMICLKJDH\u0007I\u0006LOGC\u0003KGDAFCEDCAJLP\u0006QFACADA8=C?HFKOOJFFIJGHPBDHJ\u0001KHE\u0004F\tJH\u0005PNJP\bMIL\u0001FK\u0006NJ\u0007CKIOJGF>ERJHHM:GIIGIC<CD<E<ILN\u0006O\u000bPNN\u0004N\u000bK\u0001O\nY\rO\u0003IN\u0003KBI@B?GBSP\rP\u0011W|\rQ\u0012Qo\u001cX\u0017^i\u0015Sw\u0015P\u0005O\rN\tJ|\u0007SM|\u0000PF\u0001EKCEJBKFCAICBHGIKJDwI\u0006I\u0006L\u0006PMFHGA?FIJOKE=EIBCD@@H=F\u0002>IF\u0002J\u0004HHI\u0002>BC\u0004K\u0000L\u0005X\u0001J\u0005G\u000bM{\u0000U|PD\u0002CB?EHHLMM\u0000L\u0003H\u0000EM\u0006H\rN\u0003P\u0004M\u0010NNT\u0003IKFO@DDMKFM\u0000MCEEAC=E9?8B=BKBDHLHOKDJK\u0005JNKMFHKK>MAAEE=JGADCLH\u0003CJz\u0002R\u0000M\u0001KDHGH@KF@EAIKIENKL\u0002IE\u0003IBDJLAHCDEKO\u0001N\u0002N\u0006FL\u0000IRMLEJCLKKM\u0000Tx\u000fUwM\u0016S\u0000SyN\nN\u0003R\u000fH\u0003KI\u0002A?DI<GF=\u000bCHGMNPFE\tPHEHCFI\u0003L\u0002KwRQM\u0003H\u0001Q\u0003O\nJx\fR\u0001O\u0000Q\u0004EGEHM\u0003IMKKG@CFMK\u0000P\rQv\u0003Pm\rNP\u0002O\u0000PEGBAAA8HH\u0001JR\u0003K\u000fO\u000bM~\tLNOJB\u0000NPJ\u0005IJF\u0003KJI\u0003JOKOL@BGICFKI?G9F@EEBIEK\u000fI\u0003D\u0002NCII\u0000HDB=@DFIHKHMLEA>GI\u0001I\u0001U\u0003N\u0006P\rM\u000bOGK\u0003MM\u0003JGEJEC@BHGK\u0002HGJFPD\nEOO\u0006O\u0005[r\u000fNt\u000fL\nIE\u0000DFDEMLNNK\u0004G\u0000LRGGHE@DHDFKBDIMC@=C@GJECB\u0004I\u0002L\u0005H\u0006KNLO@>AJB\u0003EK{OO\u0002LODKIyLMHBGIGDNJGHNCFK\u0004O\u0004L\u000bN\u0005P\u0001P\u0006NKNI\u0004KJ\u000fLNNJEHEE>C9>>DFHDKDDIFEIEMKKQJ\u0000CEGE\u0004ENFFF\u0000GL\u0006IHKGB:EJBF\u0001E\u0002E\u0000NKNKIQ\bDCK??99;.+52\"\u001f!-'.33:=AEP|\u000eR\u0017[{\u0015_]\u0011ce bc\u0017_i\u0018Ts\u0015U\nL\fML\u0000CyMICG:9;@AEHR\fTo\u0004Xo\u0018X\u0019R{\bK}GG?934,-3475::>BGK\u0001T{\u0007Sm\u001aY\u0006Y\f[j\u0004Xn\u0012Yq\u0007R|Kj\u0000MHC?;870?68:93BEJ\nP\u0012So\u0015Pf\u0018Wz\u0015Wi\bUS\bJEJHIDKFHCIDG\u0003O\u0010O\u0015]i\u0014_l\u0015]g\u0012[v\u0010Ro\fO\u0011RKJ=;6404614;4;8>J\u0000J\u001dT\u0014Zg\u0014[j\u001cYp\u0014Sv\u0003W\u0006J\u0006N\u0001OMGGF>?C>:;>CJIq\u0013Pt\u001aRt\u000fX\u000fQ~\rO}\fNMIF@;A@49<<=>A:L\u0003Qu\nQk\u001dX]\u0018Vu\u0013Wd\u0018Rx\u0002UG>@EAGH69989;GBI\u0001I~\u0001Rw\u0003Ve\u0018Xx\u0016\\f\u0011R~\u0010Z\u0007S{HJGB?:E=<B\u0001=?IH\u0000Q\u0007Vx\u0018`g\u0016Z`$YY\u001e[P\u001c_i!]O#bW\u001e_X$`O\u0018_h\u0019\\r\u0013_t\u0014Vv\nOw\bP\rN\u0003SK;-,\"\u001c\u0015!\u0010\n\u001d\u001e'+<4K@BGL|\u0005R~\u000eRt\u0018]f!`a\"`A\"gK!c4(\\K$ap\u0016\\x\u0016O\fPA9=C;7<<96@@I\tK\u0004Mw\u000eUu\fU\bW\tN\rKGB9A8<9>66:0:@>LN\u0007V~\u000fWv\u0015U\fV\u001cRy\tS~\u0000PL\u0002KF>B8F:C?=:3BDFN\u0007LNlS{\u0015U}\u0003O{\bL\u0005KEHKEBD?8;=B:?<EF\nVs\nSc\u001d]j\u001e_[\u001eYY\u0017Yr\u0014Xn\tU\nPEE:<C>BDCBLJO\bS\u0010S\u0011Tv\u000bQ{\u0012Qm\u0002\\q\fTz\u0002Ly\nLGD<=B<><6:@=4DBGI\u0001Q\u0010Wj\u0014Yd\u0015Xh\u001b]r\u0017Z]\u0010Vd\fRu\rTLwDE>489:,28:CE\u0006V\nQl\bZg\u0018[]\u0017[b\u0017Xj\u0011Yw\bS\bU{\u0003QL\u0003KEDB58>@;:@HOK\u000bN\u0012To\u0007Qx\rW{\u000eZ\nOIGFCFD?I=D@849;@>FOH\u0002Os\u0013P}\u0006Vq\u0015Z~\u001a]g [w\u0011\\b\rXZ\u001d[p\u001eYj\u0015\\p\u0016[v\u0002OH85-$(\u0016\u001d\u001c\u000f\u0003\u0013\u0010 )85:HS{\u0001U\u000f\\d\u0010]^\u001c]Z%_k\u0015\\\\\u001d[d\u0017Z]\u0012\\i\u0017Ss\u0013M\u0000LNCI@ACCFO\u000bQx\nMx\bOT\u001a\\g\u0011^j\u0016Tr\tVz\u0002HNH6?86,*\u001c%\u0017)(3;BHL\u000bYa\u0013]o\u001dWe#Xf\u0018]j\u0012Yo\nXR\fLNHCE<@7?65=>@CGIRQ\u0005M\nPIAIE@:65+3**3-,39@CI\u0005P\u0014[o\r[I\u0011Zb\u001fYZ\u0006Yv\u0017V\u0000QIH@B8>9:.2)279CL\bRz\u0014Sn\u0014_j\u0018\\f\u0019[_\u000eUj\u0005T|K\u0006K46:-8/-)-/7>BN\u000bO\u0001Pw\u0010Zi\u0011Wt\u0015Qx\u000fP\u000fKQLD>?CA=:=;B<>DJHMOs\tX\tZq\u000eX_\u0010Px\u000eWJOJ@@>@=;2-533@@>MEJ\u0001L\u0002N\u0007OK\u0003J=>>689:71457AGO\u0002S\u0018[r\u0018Zg\u001f_O ^J&gN)aM&bF#_G\u001e_]\u001bUv\u000fOk\u0007W\bQJA;1(-\u0013\u0019\u0014\u001b\r\u001b\u0019)%+68<?FJ\bQj\u0013_`\u001bd]%iX'_V\u0019[[\u0013Xf\u0010W\u000bR\tPCB?B?5@354??<F\u0003S\rTe\u0013]f\u0018`Y\u001fW\\\u0017Zd\u001aXl\u0006W\u0007R\u0002HIFDIBA@A7<47+++57>2:?>7@:9CDEGP\u0003SRJ?ELB@<@C@FDKEKOI\u0002L\u0013L\u000fI\u0002OFIG?>@=<>=8?=DF=F=4=5;:=JFADAIDABIFADDED@\u0002HKNF?BH>?>@9BHCJGCDIHA;99=:=;:=BEJHLFE@=??;:6A>@FHFKTG|\u0005K\rU\u0006Q\u0007K\u0001KGDCH=<;=<;8699;B=MAHCLMGFHHBB?;:69DHE9G;BCB;JFF:E>FEDDIBE;BCE=ACFEFCB=A@>>@:<EEB\u0002HJEM\u0001GIBBC<5?;A:CKEKKK?D??HJ\u0001H\u0000FNIRJAFFEC==;;??D;9FEBIG\u0001IGE?B@=A@EA@GI\u0000HJIPJA=FG@GDCE@CBDCEBC?C;A?GF\u0001IFEBB8=?75@?AEBD<D89E=JMNIACK?JDDBE>;=9<:A<>B7B:<<?CDB;C8=BDB?B?755:<CH?GDHHCFDH>99=6;6?AA=??;=A;EE<IHC>=E@@@AA;5@:ABC@FEMD\u0002H\u0002BJG@AIHC>D?DFDEJ\u0003E\fRFM\u0002KF<B>B;E@<CDAEBF@G@H;<ADACEAB@AA@B<BHI\u0000I\bEHLHCC=@E>@DKGGKAA8<BAB:\u0001FLRMHGC@CHD;ADJ\u0003P\bMM\u0002LL\u0002N\bCIJ?@J;EB@A=A5B@=GGA<@BDEI<@A@AHED@JGLFGDM\u0001NN\nDJDEFDB<><ECDFH@FH?B?HFHH@C=>6>JFDCBGOCLE\u0002IKEIB?G756>96<:9@BE@HJCBF?==7@@?=<7;:55>AC>>@BA@>267=387199@:CA@:A?<?<:EC@?GAMHN\bFKJKJFE>;BCHJIIE@@:IGMIGOPGE?<G87:>CBD@B9=BA?>@JCDBIEEJEBJF\u0000EHIFDH>@G;8@CDBACKIHEBA@D>>6:5?==?=644868@B?GI\u0002C>F><?EH?><EB97;/,%)#\u001e\u0017\u0013\u0010$$-\",3.B9>LJ\u0005Uu\u0011Un\u001dWe\u001cYh\u0013[o\u001aYz\u0004N|\u0005L\u0005KIH8:>040-/''1GI\u0000M\bV}\u0011]~\u0013Tl\fQu\nR\u0002JIA6&/#%!/)/5/,5BCLP\u0002Mt\u0007[x\u0016[j\u001aWb\u0016W\\\u000fYx\u0013Sz\fUm\u000eR\u0007PIEC855/18:B9A;:35298C86611*)!#!\u001f+)5-;0BEL\u0005Q\u000f[m\u0012_j\u0018_a\u001cZ^\u001bZn\u000eTpKJ9A>066.+3/40<@;II\u0004O\u0007T~\u0004P\u0014TOGC440.'%1+.2//A>\u0002PQ\bY\u0005V|\u000eVt\u0016Nt\u0002G\u0005LI643+3--77/8;@BCHCTQ\u000bU\u0010R\u0006LJC@7>1,-%'\u001c&&/+FBB\u0000DO\u0010SzPIJH?387602101/.A=?GNNwOLBC<A<497;32507;>CGJL\u0002Lv\u000eR\u0006Q\u0003ON@9A?9;=8A;9:7885ELL\u0004N\nALDJ<;303$1&&),.7:@DHKPS|\u0004V\u0007Rt\u0006MAG;6041',%+-3564:DL\u0005T{\rVt\u0018[b\u0016W^\u001fYc\u0016Zb\u0010Ur\u0011Uz\u0013V|\fLMD:5./(,$!\u0014\u0010\u0003\u000f\r\u0005\u0012\b\u000e\u000f\r\u001c%9=JNR\u0005Vc\u0012Z\tRn\u0000Q\u0007Sq\u0003NI\u0000I@E>E6945038269?GBB@48--411+0)<67606;AGK\nB\bJJGBCD37>*10424557C;EIDLKCDC<=;1.43-871>/==OO\u000bSw\nUy\u000eTx\u0004VHF@:.+\"\u001c&&,-#),-4@=HM\u0005U|\u000bLo\nVs\u0019R\tXIE?4500*+0$26.8@@JE\u0005M\u0005PRF>:536*-/.!106/7395EPUy\u000eVm\u0011\\s\u0015R}\u0012K{\u0007P\u0000IJD<61.\"*)304771<ABLHCGGDBA>=/323:?88@?FOS\u0014Sh\rWz\u0018]i\u001d[w\u001dZw\u0012Y\u0015Nu\u0006L\u0000ODF>@:///\u001c\u0017\u0013\u0010\t\r\u0012\u0002\u000e\u0014\u001e&+1<P\u0006Qs\u001a[Q\u001d`a)ca\u001aXh\u001fYo\fUx\u0006JGA>6;:14;;56@:9;H?ICACC@34.,+1//11239A\u0000DPL\u0001O\u0006K\u0002L;@=@0241112>0)69<BFQ\bJm\u0014Rv\u0012Yr\u0016W]\u0011Oz\rT\u000fS\fSy\nUMCA;$!\u001a\u0016\u0018\n\u0010\u0013\u001e\u001b!!$13?>EKL\bRt\tZc\u0013Wk\u0013Yq\fXr\u000bLG8:13'(*&-*/,3,<AFO\u000bU~\u0006P\u0012N~P\u0003G5:1-4/-*,(- ,9?<J\bK\u000bZz\nTr\u0006Rt\u0004QDH:/64(0\u001a\u001b(\u001f+,63A>\u0002J\u0001F\fOh\tRq\u0012Po\u0013Rk\u0015Sn\u0007TROE@92:7>4$5-5:?9N\u0000Q}\u0007Wx\u0014Wl\u001dVy\u000eYm\nXi\nWt\tP|\rQJF=>849/;)//&\".$ &(01-++2;@<@BA?@A=:5=@3>E?C@?=;><;7?8>@0*1200:87?@<DA?D<::D:<;91<;=;7:27666347620=9:848:4<?79AC9A:8===A8@@;AD:6<;;6/6-04490:.3286<7BD=CBBALGDB<9=?;5<1.0<9JEG;><99@+4:6DDA<BD5F:D@GA9>9=>BBG??B>B:BCC67:4?<C=:D>C6<=5<7;::;:34/;9974?<;69//5/-086;55;3:862487=::@:FDB;6:7@=/<5<FAC4>A7??9<>?7?5<G@EA>FA:?615:8561@:9>B9DD:AD>H=9BE=D5?:57*+9746>819864?<D/;5<4<8=5;29@67=C<68:5:<57=:96:9866;?99:?A@8F7<==:75539>6:<:CFKCGFA;G<=:>694=>>DG<DDHA:=B<;;609223751.2+.)736A:1557=6B=@<9:189<7<3131%4239=;C<=EA:@AAB>H?4/9+/)3./&-69?8@><?>EF@DA;:;:86<1948123974;<6.;085/5108.446<?24*'-134AB=GFHMGDGA:7?464.'4410.930847.<825;<=<D58554+14:ACGB8?;995384410,-0=67-0;5298;;@;D@<::>=3;6<3:8;-743:4237992.45;9?=A=@@<;01...2490397<=+5:89D;646<962451++++)/1852>A23:?57C1<8:746<@9:F>A=>;147:26;15--1<0=17>9;9&($\u001f\u0014\u0016\u0019\u0013\u0011\u0011\u001e\u001f\u0018\u0019&\u001e 26GEM\tR\u0014Vw\u0015Tu\u001aaN [e'^l\u001a]i\u001aVx\u0012T\u0001NGG<5/%\u001c\u0015\u0005\u0005\u0007\u0000\u0002\t\u0011\u0011\u0015!##-2:B\u0001Q\tO\tWf\u0013Xq\u0014Tv\u000bR\tRKG;5=22-*'\"&.66BDBEHAE21,1$'\u001a&!$ \u0019$ )0>OH\u0002OK?CF:993-\u001f\u001f++\u001e&'.+1<FGDNGJ@D50$-+&%\u001c\u0016$\u001f*-&6?C@=8:<8:@B@C51/3*+\u001c\u001b.<>A@AEB@628.3--,% \u001b$*88=AIEL\u0005V\u000eS{\u0013Nv\u0014R\u0001J|\tQRI;?16/,*\u001e/+#),+/+*'!'\"\u001f\u001d\u000b\u001a\b\u0015\u0015\u0012\u0016'((+6,(7AFJO\u0005Q\tO\u0004SLy\u0000I}DDEA726.**2+-7733;DB;84,(\u001f\u0013\u0013\n\u0018\u0014\u0011\u0011\u000b\u0011\u0019%2@JEMF\u0001I\u0000G\u0001A@A134)$\u001a\u001d\u001a\u001c\u001d#%*.5>GMORKMMO\u0000MGGB82-\u0018\u001a\u0017\u0014\f\u0005\u0015\u0004\u0016\u0014\f\u001b,.1A:ECI\u0001LJJ@:5:2534(!, ,62AID\u0000GCM@:<*0\u001f$\u0019+\"\"4('\",4@D@\u0000MJFG=65(,\".\u001e\u0010\u0016\u0018\u0015\u001b\u0018\u001f(-.58;C:>:CG5/3.)./353..49@FL\u0000M\u0006U\u0004S{\u0007U\u0013S|\u0013N\u000bO\u0004JJED<?104.61&(%+!#\u0014\u0010\u0015&\u001a-,0.74(++$&\u001c\u0014\u0015\n\u000f\u0019\u000b\"\u001d\")/187IOIG\u0000HIK><8:1+3-$$-'&))00;?C?KCG;<41+,'\u0019!\u001e\u0015\u0010\u001a\u0018 .4?@\u0003E\u0004BED=?652/,\u001f'\u001d\u001d\u001f.\u001c01758>CA6B=30-,$\u001d\u001b\u001f%\u0012\u0017\u0012$*(5=@DHH:>:+,#(\u001e'\u0019\u001b\u001e$,)07;9FHFBDHF?7:1#&%-\" #+\u001f!23BEGLx\bW|\u0004V\u0000J\u000bM\u0003JL\u0000LGHB72'\"\u001b\t\u000e\u000f\u0004\u0001\u0004\t\u000f\u001a)45?BNHKM\u0003IBF=30**#\u001f\"+\u001b$\u001f12<B;DMONND\u0002JC\nL:05,/(2,--/-1)$,),\"\u000f\u0014\u0018\u0012\u001a\u0010\u0011\u0011\n\u0012\u0015\"\u0019*/@G{\u0001L\u0005Wn\u0006Uv\u0012W\u000eO~\u0005L\u0000KJIA951-\" *#('/4:9<=<6:2-62*2,&\"\u001f\u001b\u001c!,-/9:HFMND7427#),!.'$-15082=>@AA?@3;)'\u0013%\u001d%\u001f!\u001e(0-*28CGBI@:>824.\"*#$$ \"\u0011 \"\"289:JG\bL\tOy\u0006V\u0004O~\u0003LK\tD\u0004F\u0002AC<8;-601!)!*) &%\"''0+-87.55342<:4:39255333276915>819669?:8;3.,,'32833-*.5*220(0,(+05:/1;248<77:005751(3;32.+.-3:1(\u001f,)%108.260:-./5,,0597;2=727,5/05/-1$,+**\"\u001d\"012.00003164*02.5++'+20.4/)1.120'*-2$,*.16555-<20.!+\"!&,.5/4C;25*)+)($*2/5/.(/+-(371'0-740'*+)**556.9>1554%''2-3&&2+--/1;/2,5%\u001f53/),&(,21.,3.);;8>99128002811*.&%,:.2./..56+,).\"&&003:;86./11/0)2-$&'!-3<<2+5)#-6270(%&/&3.))',0#%)'+635,.3:B;8=>784;31+0A27=:,;1'%'.-$&(,(,*$(%*)(095<8<6843//&-\u001d'53+3.4)+(\u001e#,+#%%04/00+.3*:4-.<4,73#-/63433,-))3-05963@0=:54-30'*),\"+\u001a.%+-#.60;9846:998212'%%2-5.1#=2=5429;5)\u001b\u001c&&\u001b!\u0016$$\u001d0'*1+68564.25:88=1<9?<97<96/\u001d!'*****%\"*)%$$\u001f((1<..--\u001e(02;6>;579>/-23,,(64,5-2:426630)+\u0015%((-.45:.:3;//+-&,&&6/0;=<88A/%%&0#+'+(%,/57439:6:+)('&\u001f())+14914<.89389+1$!\"&%!'&*!&-\" *\u001d %\"%'.()\u001c&+)+&0*+&\u001f\u001b\u001e\u0016\u0015! &%'\u001e\u001c\u000b\u0013\u0000\b\u0000\u000b\u0012\u001d\u001d$$,$:BDJ\u0004Q~\u0000P}\rSt\fW\u0011UxNE<93+%\u001c\u001e\u000e\u0012\u000f\u0010\u0019\u001e(#*:?DIMR\u0005MP\tKMz\u0006J==;A95+.&()%\"\u001b&\u001f!*,*'1(,($\u001b\u0012\t\t\r\u0007\u0003\u0012\u0016\u001c\"\u001e$-$,4@BX\u0000PN\u0006M\u0001KGEA@;5<1%(\u001c\"$\u001c+5978>BB\u0007K\u0003K\u0004LHOEC2 #\u0013\u0013\u0001\u0006\u0000\n\u001f )1=C\u0000I\u0002LQ\u000bSw\u0003SuRPH@<2(\",+#2,',%.682?A?@=9>7+&$\u001a\u001a\u0014\u0013\u0014\u0017'\u001d\u001e+2+8>EAKLAE=46,'!\u0018\u001f%\u000f#$#-473@DCJHIA:3-/\u001c\u0018\u001c\u0012\u0011\u001b\u0006\u0012\u0018\u001d\u001b\u001f,3;?BEE3+(*, \u001b%\u0018\u001f\u0013#%\u001e&)*5@CIF<B<766+)(&!%\u001f\"#!\"$(216@DJHHJFKIJCG:;51,!&\u001d*!\u001a\u001b\u001e)\u001b)&&%!\u0012\" \u0012\u0010\r\u0006\b\t\u0004\u0011\u0001\u0016'*<BBE\u0006P|\u0000St\u0011Vn\u000bYv\u0001Sd\u0015S{\u0010Vi\u0015S_\nR\u0004N@FB?73&\u0018ŀȀ\u0002\t\b\u0018\u001d %2@CIEJM\u0003MHKA?9/21.+0.\u001d- .,308@B758+71\u001e!&\u001d\u0014\u0010\u0012\u0006\u0012\u0017%/9<7OOJAA;& \u0019#\u001e\u001c\u001c$\u001f&#%(%-.?IEIIDG5((\u0014\u0019\u0012\f\n\f\u001b\u001e\u001e\u001f\u001f),2:9IPF93/+1\u001f%\u001e\u001b\u0019\u0013\u0012\u001b\u001d$*'09<@GDJCB22/$\"\u001c\u001d\u0016\"\u001d\u0012\u0013\u0014 \u001f46D@DGH958*( \u001d\u0013\u0015\u001b\u0012\u0012\u0012\u000b\u001c(/.<EIGPP\u0000R\u0010W\u0000OKL@:A,0&+#\u001b\u001e$#\u0019\u0014\u0018\u0019\u000e\u0011\u000e\r\n\u0003\u000f\u0001\u0000\r\u001b \u001c\u001a/+B4FL\u0003L\u0003VRO\u0000DDAB;;///(*\"\u001d\u0011#\u001d,,48:C4>8=01()\u001c\u001c\u001c\n\u000e\u000b\b\u000b\u000f\t&04BGEFH?=;41)-$\"\u001f\u0016\u001c\u0014\u0013\u001b \u001f02ADAIEE>40;:4 \u001a%\u001f&'!-+3;B@KLHK>:21 $\"! \u001b\u0016(' 01>;>MNKE@E6:0\",\u001c\u001e+\u001e!% ##))*118@/A9,,'\u0012\u000f\u0019\r\r\u0004\u001a\u0016$ +-:CGINF<9;:,#\u0016\u0017\u0016\u0011\f\u001b\u0010\u0012\u0017\")5979>8>356123\" \u001d&\u0018\u001c\u0016\u001d\"\"**8<;<C=AFDRBMA9.-+\u001e\u001d\r\b\u0001\u0000\u0003\n\u0013\u0016\u0018% !#8=HJJEJ\u0005NOH<?6:9!%\u0019\u001b\"\u0012\u0017\u001e\u001a\"*5:BFHIGFEGC830)\u001e()( #\u0017\u001d!\u0017\u001a!-1(*--0850,0./.33.096)0&!# #+,*++(++)*-4+2-))/+3,&1%+###1(+%00$ &\u0018 $%\u001d(.+.*(1))**/&\u001e,%2%2\u001e#2445896+.':-$\u001d\u001f\u001e! \u001c#\u001f\u001d\u0018%&-&\"\u0015\u001a\"&!\".*//,.2/12/*(*&'04*'\u001b$\u001b\").(##/302+')+'1+'&.\")!\u001d\u001b$\u001a\u001e!\u001f\u001b\u001b\u0014#*\u001c)'-*-/!%).-2:.,)%01)\"&+)/,*!$\u0015\u0017-\u001d$&'\u0018)!\u001d'-)..+-&+1#$\u001d&\u001c$&%7\u001f3//9+1.+/12):5\"!\"!\u001f*'&%))*\u001d!\u0019\u001e\u0012\u001d\"\u001e$\"$&)'&+!(\u001f(#,$! )('#'\u001d$((/)50-8*0*-\"-1*#+-1\"--*+-()).&-(,.;2.337:>81+\u001f!\u001f\u001a))+'\"%\u001b \"\u001d\u001c*#\u001d-$\u001c\u001d#\u001f#'\".14.6494.((),,5$$&\"\".*&(#\u001f(#\u0018\u001c!\u001b\u0018\u0016 \u0017#\u0013\u001b#*&/0%1-5/\u001c((%&#\u001a\u001f\u001a\u0018\u0011&\"#+%,%,)*\u001e#$$#%.)3245@.319-1.,4\"&'%#$ \u001e(\u001e\u0016&&& $!# \"\u001a($\"*!##!!\u001c(%(-*6,.(,*421,%*021$,-#-0*.$'%\u0012\u0017\u001e\u000b'%#&-2\")$&&\u001d!\u001f\u001e\u001f\u001f%\u0010\u0018\u0019\u0012\u0019$$%\u001a\u001a#*% (. ('/(-#\u001f\"' \u001a\u001d!\u001e-050)/32241'(&\"\u0019\u001c\u0019\u0017\u0010\u001b%'(+.$/4*&'.$\u001d!&.#!\"-#*)#%#*-&+.3*(&+\"%%*$(.)-++1,\u001a\u0017\u001c($&\"-'32%)./*'&*+6.))/*/*#\u001e# (\u001f\u001e*+#\"\u001d( &+)*)\u001a*2(3$\u0017\u001b\u001b(&'$\u001f!&+663465-$!+%&)2/,.-6.'\u001b/\u001f\u0016\r\u0014\f\u0006\u0000\u0003\u0004\u0014\n\u000f\u000e\u0014#&/169<C6;7==<::9-)\u001d*!\u001f\u0017\"#).%-))('\u0018 '.\u0019\u001e \u0016\u001d(+##,062.A==.7%\u001e\u0015\u0017\u001b\u000e \u0013&%'(-62.===@GA?9+&,\u001d\u0012\u0017\u0013\u0012\u0007\u0011\r\u0014\u001f\"\u001c,66<9D6:1'!&\u001c\u0014\u001a\u001e\u001b\u0018\u0007\u001d\u0010\u001f\u0018$\")8=?<>388.\u001c#\u000e\u001d \u001d\u0012\u001b\u0018--54465>A;=@>@=889;@5222!\u0017#\u0010\u000e\n\u0007\u0005\f\u000f\u0003\u0004\u0001\u0004\u0013\"#!&'.10?BHFGD?;73*(-\"!\u0012\u000b\u000f\u0013\u0013\u0011 \u0015#,69340,)%\u0019\u0018\t\u0014\u0007\f\b\u0004\u0013\u000e\u001b!*8CEB@B:;--$\u001a\u0016\u001b\u0017\u0012 \u0013!\u001d\u001d).7;5?@:CABG?436\u001e\u0013ĀÀ\b\u0002\u0014\u001b\".69=E9=3.,'\u001b\u001b\u001c\u001f\u0019\u0018 \u001d$#0)/5216/2'* \u0019\u0018\u001c \u001b\u0013\b\u000b\r\u0017\u0018#+\");8B?@48=+%\u001d\u001c\u0015\u001d\r\u0012\u000f\u000b\u0005\u0010\u001c\u0017&/*37?44,*!\u001d\u0013\u0012\u0002\f\u000b\u000f\f\u001f\u0015&/69DK\u0002HFKLLDB5/,2$& \u001e\u0012\u001a\u0010\u000e\u001b\u0016\u0014\u0007\f\u000f\b\u0010\u0016\u0006\r\u001c\r\u0011\b\u0006\u0012\u0011\u0017\u0019\u0016\u0012\u0019\u001f\u001e\u0016\u001b,31>4@A520,%%%%#\u0017\u001e\u0018\u0013\u000f\u001a\u0015\"\u001f\u001f/082090/-&\u001b\"$\u0019\u0014\u000f\u0013\u000b\u001b\u001d\u0019\u001d)%32:C7:5+,\u0014\u0010\n\u0015\u0019\u001a\u0018\u0017\b\u0007\u000e\u0004\u0006\u0014\u001e\".29<40;&'!'\u001c\u001b\u0016\u0015\u0019\u0016\u0010\u001b\u0017\u0019\u001c'006411'&(\u001f\u001e\u0018\u001c\u0014\n\u000e\r\u000e\u0015\u0014\u001a$'-7.28/-%\"##\u0018\u0016\u001d\n\u0011\u0010\u000e\u0017\t\u001a\u001f\u001d028@HE<>5/* (\u0011\u0010\u001d\u0018\u0000\u0007\u000f\u000f\u001b!\u001f+-@FB<C:;.,!!\u0018\u001c\u0018\u001b\u0017\u0016\u0019\u0016\u0017\u0016\u0014+3078E=37&%!#(\u001d\u0011\f\u0003\u0007\u0017\u000f\u000e#*+4?CCCIIFGFH?8+& \u0019\u000fɀ\u0002\u0004\u0002\t\u0011.-37CDI\u0006RILB<450!\u001a\u0011\r\u0006\r\u0011\u0010\u0017\u001c'19=8'+!'\"\u0011\u0011\u001c\f\u0013\u000b\u0011\u0003\u0011\u0001\u0006\r\u0011\u0017\u0017\u001d (5736+'#\u001a\u001a\t\u0015\u0007\u000e\f\u0011\u0006\u0010\u000f\u0013'-<<EBC<;,.&\u001d\u0017\b\u0014\u0005\r\b\u0003\u0012\u0015\u001b\u0017/*.*026.5)\u001a\u0019$\"!&\u0013$\u001e\u001f\u0018\u001e\u001f\u000f\u001c(+64=A<9B:=51)(&\u001b\u001a\u001f$\u0012\u001c\u001d\u001b\u0014\n\u0011\f\u0002\u000f\u001a\u0012\u0018\u0016\u001f)!,!.$ \u001e\u001f#\u0019\u001c\u001d'  !*3$\u001e\"\u0019\u001b,(-\u0013\u0012\u001e! $\u001c\u001a\u0015\u0017\u0010\u001b\u001e\u001a#\u001d!(-.50\"\u001b!+,$*%\u001f \u001e\u0018\u0014\u001e\u001a \u001f%&!#2\u001c,\"'\u001e\u001d\"\u001f\u0015\u001d(\u001c\u0010\u000e\u0019\u001a\u001c\u0019\u001d\u001e%-/,\u001f+\"))#\u001a\u001d\u0017#\u000f -\u001d/&\u001f2\u001b&%%\"'\u001f\u001e$&\u0018\u0018\u001e \u001c--,),--&\u001e,0)%!)$\u0016\u001d\u001a\u0019!'$)$$$\"(%,)!\u001d$#(!\u0018\u001f\"! %+(&'\"(!&%+$ \u001b#\u001b\u001c\u001e\u0011\u0018\u000b\u001c\u0010\u0018\u0017\"\u0018#0/151).'&*\u001a$#*&&\u001b\u0017\u000b!\u0012\u0018\u001d#\"&*&/\u001b!\"\u0018\u000f\u0019\u001b\u0015\u000f\u000f\u000b\u0013\u0016\u0019\u001b*\u001f+%$)#*322!((\u001f#+-!$(#\u001b(\u001e!\u0019)!!\u001c)+.&'$$\u001b% \u001c\u001b\u001f\u001e\u0014\u001a\u001c\u001b\u0017%!.+))(.($\u001e!$\u001f\u0019\u001d!\u001d\"\u001c\u0019\u001d!\u0015\u001a\u000f\u0010\u0019\b\u001d !%,\u001f\u001b%\u001f\u0018\u001d)**#*\"' .//2),*))\"%\u001d(&'\u001d%\"!!\u001f,)%/,#)&*)\u001d(%!!'('.%+&\u001e&\"'+..&'1\u001f\u001d\u001c%\u0010\u001d\u0018\u001a\u0011\u001d!\"!\u001e#'$+#0%''&'\u001d')\"$&$\"2)($'($\u0013-% \u0019\u001d\u001b$\u001d\u001a\u001d\u001b\"\u0019\u0018\u0014\u0017\u001c\u001e-*'\u001a\"(+*,(/00+/!'\u0017$\"%\u0019\u0018\u0012\u000e\u0016 !\u0016\u0019\u001f\u001d\u001e&\u001e&\u001a\u001f\u001c\"!\u001c \u0019\u0018\u0018\u001c\u0016\u0016\u001c\u001d\u0016\u001f#,\u001f-\"\u001c\u001f\"\u0017\u001f\"%,&0\u001d###\u0015\u001e$'#!\u001b\u001f\u001b\u0010\u0010\u0013\u001b\u001e\u001a&$((%\u001f%20.(/#%' \u001f )\u001f\u001f\"\u001d\u001b'#\u001f*\u0018 #\u001a!(+#\u001a$#\u001a\u001a\u001f$(\",..*'*'**03*!$%$\u001e'\u001f !*()'(+(!'\u001a!\b\u001b\u001d\u0017##$'\"\u0015\u001f\u0019\u0016\u0019 '& ,,1/-(,&)\u001f\u001f\u0014\u001e\u001e+&&$\"\u0019$$##\u001b)$\u0014)\u001b\u001f#&(\u001c\u001d\u001e\u001a\u001a\u001d\u001d#&'.%',/,2-&.'/%\u001e'!\u001d\u0018\u0018\u0011\u0013\u0016\u0013\u001a\u001e'',,#&&\u001e-%&\"*%##$#(' ,\u0010'+-.\u001f+&&#5$$$+\u001f\u0015 \f\u0014\u000f\u000b\u000f\u0012\u0016 !)\u001f\"%\u001c\u001f\u0019*\u001b\u0011\u001e$\u001e\u001e+\"\u001f!$\u001b\u0015\u0004\u0003\u000b\u0006\u0007\u0003\u0005\u0010\u0011\u001e\u0019 8:BLN\u000bQ\u0001N\tHLI\u0000DDA@;:6'\"\u001d\u0010\u0017\u0007\u0004\u0002\u0005\u000b\f\t\r\u0001\u0002\u0011\u0013\u0014\u0016\u001d+0,:CDE@;:90!\u001b!\u0018\u0011\u0011\u0000\u0000\n\n\u0010\u0010\u001e(*031-,#\u001e\u0013\u0016\u0004\u0012\n\u0019\u001c$284>GCB9$\u001e(\u001d\u0013\u001a\u000f\r\u0005\u0000\u000f\f\u0007\u0019\"24/=><:1.+\"\u001f\u001c\u0012\n\u0019\t\u0007\f\r\u0001\r\u0016\u001a \u001f#71380'#&\u001c\u0011\f\u0010\u0006\u0007\b\u0002\u0013\u0018\r\u001c215:=8=.)\u0018\u0015\u0011\f\u001a\u0014\u000f\u0011\u0012\u0015\u0014\u0013\u001b#$!\"'@9:30$\u001d\u0015\u0013\u0016\u0010\u0005\u000f\u0004\u0014\u001e\u0019\u0010\u0019\u001e(\u001f+12/7/)-\u001e\u001e\u0010\u001c\u0018\f\n\u001c\u0004\u0011\u000e\u0015\u0015\u000f\u001e)%3/59400\"\u001c\u0015\u001e\u0007\u0010\u001a$(2:=D\u0001@EHHLE>9&&\u0010\u0013\u0011\u0013\fÀǀˀ̀̀̀ŀǀ\u0002\n\u0011\u001b(277<55403.#%\u001c\u001b\u0019\t\u0015\u000f\b\u0004\u0010\u001a (&.74>62''\u000f\u0012\u0013\u0005\u0001\u0001\u0004\u0003\n\u001a+%36.2:'+!&!\u0013\u0014\u000e\u000e\t\u0000\u0005\f\u0014\u001f(+/3040\")&\u001c\f\u0002\u0004\u0001\u000e\u000f\u000b\u000f%)46447;,#\u001d\u0007\u0010\t\u000b\n\b\u0000\u0003\u0000\u0014\u0016\u0017\u001d&57977.,\u001f\u0011\u0002\u0003\u0001\u0001\f\t\u0018#&\"$)$+#.,#\u001f\u0013\b\u0016\u0004\u0012\f\u001b\b\u0018\u0016 %$1*70*-\u001b&\u001d\u0015\u000b\u0011\u0002\u0004\r\u0002\u0004\u0006\r\u001d$#,/7/-*#\u0016\u0015\u0007\u0003\u0006\u000b$\")\"\u001e/66:9@=7>@<799*.-\u001a\u000f\u0003\u0006\u0010\u0011\"'2:CC=;./#\u0019\u001a\u0017\u0014\u0016\u001a\r\t\u0005\u0015\u0015\u001a\u001b+1+'+ \u0019\u001f\u0012\r\u000e\u000b\b\r\u0007\u0007\u0007\u0013\u0018\u0014&&(-2/;83'\u0017\u000b\u0005\u0002\r\r\u0013\u001f/048'(&)'\u001b\u0018\b\u000f\u000b\u0007\u0006\f\u0011\u0016#*6,4=;4.(\u001b\u0011\u0013\u001a\u0002\u0010\u0014\u0018 \u001e+.5;54('\u001f\u0016\t\u0010\u0003\u0007\u0000\u0004\u0002\r\u000b\u0013\u0010\u001b\u001f((#24-,1\u0018\u0015\b\r\u0003\u0007\u0006\u000b\u000b\n\u001a\u001b+164-'0)\"\u0015\u0011\u000f\u0006\u0001\n\u0003\u000b\u0003\u0013\u0014\".(0=98.\"\u001e\u001e\u0013\n\u0004\u0005\u0006\u0005\u0005\u0007\u000b\t\r\u001a$.!36>=??C4:=44+%\u001d\t\u0002ǀǀǀƀ̀π\r#\u0015)/8FCDGF@BEA;99//%*\u001f\"\u0016\u0011\u0004\u0007\u0003\b\u0011\u0011\u0018\u0015 \u0014\u001f\u001c\u001b(\u001f(\u001c\u001c \u001e\u0010!\u001f\u0014  \u0019\u001c\u001e\u0016+'+$\u001d  &!\u001c\u0014%\u001d \u0018\u0019\u0017\u001a\u0015\u0019\u001a$!\u0014\u001c!\u0014\u001a\u0018\u001f\u0018\u0016!%$\u0015\u001b\u001c\u0017#\u001f\"%!'\u001e\u001e&\u001d\u0015\u0014\u001c\u0019\u0019\u001e\u0019\"\u0015\u000f\r\u000f\u0011\u0019\r\n\u001b\u0014\n\u0005\u0010\u000e\u0007\u001e \u001c&\u0015\u001c\u0017\u0019(\u001f\u001a\u0018\u001a\u001e/%0*',*\u0017 \u001c\u0017\"\u0017\u001b\u0019\u0017!\u001e\u0019\u0011\u001a\r\u0011\u0014\u0018\u0019\u0017\u001d\u001a%\u0017# \u0019\u0018\u001c\u0012\u001b\u001b\u0019&!\u0015%&&',!\u001f\u001b\u001f\u001a\"\u0017\"!\u0018\u000b\u0017\u001b&\u001c\u0019\u001c!#+##!!$!'#\u0015#\u001a\u0013$\u0016\"\u001e$)/\u001a$\u001f\u0018\u0018\u0019 \u001a\u001b\u0014\u001d\u0015\u0015\u001d\u001b\u001a\u0017\u0015\u0012\u0011\u0010\u0016\u0015\u001f%!# \u0018'\u001f!\u001d\u001b\u001c\u0018\u001c\u0014\u0017\u001b#\u0019\u001b%\u001b%\u001b\u0019\u0018&\u001c\u0019\u0017\u0012\u001b\u0016\u0017\u001b\u0014\u0017\u0016\u0010\u0010\u000e\u0010\u0010\u001e\u001b\u0017\u001a\u001e!)'&6%!\u001f%\u0019\u001d\u001d#\"\u0011%\u0017\u0019\u001d\u0017\u0018\u001e3+12-\u001c&'\u0016\u001a\u0013\u0000\u000f\u0011\u001c\u001b\n&\u001c&)&0,(+%\u001e\u001c\u0018\r\u0012\r\u0004\u0004\u0005\u0007\u0001\n\u000f&#\u0016 \u0016\u0018\"\u000e\u0014\u0018\u0015\u001c\u0017'( \u001f$%\"\u001a\u0018\u001f\n\r\u0010\u001a\u001a\u0012\u0014\u000e\u0013\u0017\u0010\u0015\u001b%\u001a#\u001b  !\u001e\u0018\u0010\u0014\u0011\f\u0013\u001e \u0019 \u001a(\"\u001e\u001c\u001e\u001c(\u001f\u001c\u001b\u001d\u0017\u001d\u001a\u001e\u0018\u001d\u001e\u0019\u0017\u0018\u0014\u001d\u001b! \u001f\u0018\u0019\u001b $\u0015\u000e\t\u0010\r\u000f\u0016\u0017\u001d\u001d\u001c\u0017\u0015\u001e\u0012\u0013\u0017\u001b\u0012!#\u0019&/(&!$\u0013 \u0013\u0014\n\u0015\u0015\u000b\r\f\r\u000f\u001c\u0015\u001c\u0017\u000f\u001b\u0019\u001f\u0015\u0014\u0017\u0010\u0015\u000f\u001f\u0016\u0019\u0016\u0013\u0014\u001c\u001b\u001f\u001a\u0016\u0016\u0017\u001d$\u000f\u001c\r\r\u000e\u0006\u0000\u0006\u0006\u000e\u0018\u001c\u0016\u0019\u001c\u001d\u0011\u0011\u0018\u0014\f\n\u0005\u0014\u001a\u0016\r\r\u0011\u0005\u0018\r\u0013\u0015\u0019\u0019\u001a\u0015\u0012\u0012\u001c\u0018\u001b\u0014\u001e\u0013\u0011\u0017\u000f\u0012\u0013\u0017\u000f\u001e\u0013\r\u000e\u000f\u001a\u000e\u001d%\u0012\u0018\u0012\u001e\u0015\u0006\r\b\u0007\n\u000e\u000f\u0018\u0012 %\"($ \u001d\f\u000e\u0004\u0007\u0006\n\u0005\u0017\u0011'#\u001a$#'+'&$\")$\u001d.$\u001e\u0015\u001d\u001c\u0019\u0014\u0015\u0011\u000b\u0012\u0013\u001a\u0013\u0017\u001f\u001f\u001b\u0014\u000f\u0010\u0011\u000e\u000f\u0010\u000b\u0017\u000f\u0018\u001b!\u001a\"#)\u001d $\"\u0013\u001c\u0011\u0013\u0019\u0013\u0017\u0014\u001a\u0007\u0013\u0014\f\u000b\u0014\u0019&\u001c!\u001b%\u001e&\"\u001a\u001f\u001e#\u0010\u000f\u0002\t\u0000\t\u000f\f\u0011\u0019 \u0017\u0014\u001a\u0019\u0011\n\r\f\r\u0013\r\u0010\u0013\u0012\u0001\b\u0013\u0015\u001a\u0019\u0018\u0019\u0019\u0015!\u001a\u001e\u0017\u0019\u001c\u001b\u0016\u0014\u0013\u0016\u0019!\u0017\u001c\u0017\u0015\u0016\u000e\u001a\u0017\u0017#)'.$\u001c\u0013 \u0011\u0014\u0007\u0000\u0011\u001c\u001f\u001a\u0019\u001f\u0016\u0019\u001d\u001c\u0015\u0007\u001a\u001c\u0010\u001e\t\b\u0001\u0000\u0000\u0004\u0013\t\u000f\u0012#\u0017!\u000e\u0019\u000e%\u001f \u001f\u001e\u001d\u0017\u0013\u0016\u0011\u0007\u0011\u000e\u0019$\u001a\u0018\u0019\u0015\u0017\u001e\u001f!\u0016\u0010\b\u0000\u0001\n\u001c ,53=3-*$'\u001c\u0015\t\n\u000e\u0007\b\u0001\u0006\u0010\f\u0016\u001c *42**\u001f\u0019\u0013\u0006\u0005\u0005\u000f\u0005\t\f\u0011\u0010\n\u0016\u001b\u001f+!4/\u001f'$\u001d\u001c\f\r\n\u0005\f\u0001\u0007\u0004\u0015\u0011#',(/0-!\u0018\u0012\u0006\r\u0004\u000b\t\u0002\u0010\u000b !-11;/)\u001f\u001d\u0018\f\u0007\r\u0001\b\u0017%\u0017$(#,/6.+.()4&\u0015\u001f\u001f\r\u0006ŀрҀҀ؀ЀÀʀ\u0007\u000f\".5266,,)\"\u001a\u001f\u0018\u0017\u0012\b\n\b\u0005\u0012\b\u0010\u0015\u0015\u000f\u0013\u0018 \u001d\"\u001f\u001a\u000f\tÀ\u0003\u0007\u000b\u0007\u0017\u0011)/#*-\u001e$\u0019!\u001e\u0018\u0002\b\t\u0006\u0003\u0001\u000b\u0011\u0015\u0014 ,*-7+&(\u001e\u0019\u000b\b\u0000\t\u0003\u0002\u0005&$++35.5*$\u001e\u001e\u0001\u0005\u0003\u0003\u0003\u0002\u0012\u0016%'.-1\u001e\u0019\u001a\f\u000b\u0017 \u001d#-139),!\"\u001e\u0019\u0013\u0003\u0003\u0003\t\u000e\n\"+,($#\u0015)\"\"\u0018\u0015\b\u0004\u0006\r\u001b\u0010\u0018\u001c\u001c\u001e%'\"\u0018\u000e\u0012\b\u0016\u0003\u0006\u0007\u0005\u000e\u0011(\u001e\"(1(50/.4)$!\u0015\f\u0006ǀ̀ˀƀĀ\u0003\u000f\u001d%5/:;7/3. \u001d\u000e\u0004\t\b\u000b\u0019+$.)0/$\u0018\u001f\u0010\u0017\u000f\u000f\u0016\u000f\u0017\u0006\u000b\u0019\u001a\u001d\u000f\u001d$$0'(.\u001e\u0018\u000e\n\u0006\f\u0007\u0001\u0001\u0000\t\u0003\u0001 \u0016-+43\"*\u001f\u0017\u001a\u0013\t\u0010\t\u0010\u0012\u001d.01,''\u0017\u0015\u0017\u0003\u000b\u0007\u0002\u0004\u0004\u0007\u0007\u0017\u001e\u001f\u001f(&#\u0016\u001d\u0014\u0015\u0016\u000f\u000f\n\u0000\b\u0000\u0001\u000e\u0006\u0010$()3).%\u001f\u001c\u0010\u0000\u0000\u0001\u0002\u0000\u0011\u000e\u0011\u0013\u001c\u001e .10)+\u001e\u001f\u0010\n\u0011\b\t\r\u0011\u0012\u0016'.83- \u001e\f\u0003\u0001\u0000\u0002\u0003\b\u0004\u000e\t!'&05164381%\u001d'\u001a\u0015\t\n\u0003ǀȀЀπӀ̀ƀ\u0001\u001b\u0011\u0017\u001e'38534% \u001d\u0012\u0013\b\u0016\u0005\u001d(+70.-+&\u0015\u0019\u0011\u0002\u0005\u000b\u0002\f\b\u0012\u001b'%$*\"\u0015\u0013\u0001\u0004\f\u0002\u000b\u000e\u0000\u0000\u0007\u0004\u0015\u001a\"&%'*0\u001e&\u001c!\u0012\f\r\u000f\u001a $$232,$#\u001c\u0013\t\u000e\u0000\u0000\u0003\u000b\u0016\u001e!*(32*3-'#(3.*$\u0013 \u001c\u0019\u0016\u0010\u001a\u0005\u0001\r\u0001\u0007\u0011\n\u0003\n\u0012\u0017#*#&\u0017\u001e\u001d\u0014\u001a\u001c\u001c\u0016\u0015\u001c\u001a\u000e\u0005\u000b\u0011\u0016\u000f\u001a\u0013\u0014\u0015\u0019$\u001f\u001f\u0016\u001e!\u001c\u0012\b\u000f\u000e\u0013\u000f\f\u000b\u0019\u0013\u001b\u0013\u0019\u000e\u0000\u0000\u0004\u0003\u0007\u0004\u0002\u0001\u0001\u000b\u0003\u0018\u001a\u0017\u0015\u001b\u0014\u0013\u000e\u0010\u0012\u0015\r\b\n\u0012\u000e\u000e\u0003\u000b\f\u000f\u0013\u0015\u0016\u0015\f\u0004\u0016\r\u001c\u0011\t\u0002\u0012\u0007\u001b\u001d\f\u0015\u0007\r\u0017\u0011\u0014\u0016\u000b\u0015\u0011\u0018\u0007\u0010\u0010\u000b\u001d\u0019\u0015\u001b\t\u0010\u0018\u0016\u0011\u001d\u0017\u0017\u0015\u0012\u001a\u0015\u000e\u001b\u0011\u0007\u0018\u000f\u0005\u0005\u0007\u000b\u0013\u0010\u0011\u000e\u0005\r\u0016\u001b\u0015\u001c\u0015\u0010\n\u0010\u000e\u0005\u000f\n\u000e\u000f\u0014\u0002\f\u000f\r\u0010\u0013\n\u0010\b\u0012\u0011\u0014#\u0013\u0016\u0014 \u001e !\u001a\u001a\u0018\u0019\u0013\u000f\u0013\u000b\u0014\u0005\u0003\b\u0002\u0003\u0006\u0000\u0003\r\u0003\u0007\u0015\u0018\u0016\u0018\u001e\u0011\u0015\u0014\u0014\u0017\u0007\u000b\u0012#\u0018\u001f'\u0011\u0012\f\t\u0006\u0004\f\b\b\u000b\u0000\r\f\u0005\u000f\u0013\u0017\u0017\u000f\r\u000b\b\n\r\u0017\u001b\u0006\u0013\u000b\t\u000b\u000b\t\r\f\f\t\u0013\u0005\u000e\u0014\b\u0019\u0014\u001a\u000f\u0017\u0013\u0003\u0013\u0011\u0007\u000e\u0015\u0011\u0011\"\b!\u0018\u0018\u0017\u0013\u0014\n\f\u0005\n\u000b\u0007\n\u000f\u0007\u0004\u000b\t\u000b\u000e\u0001\u0010\u0016\u001a\n\u0017\u0012\u0004\u0013\u001c\u0013!\u0013\u0017\u0001\u0003\u0006\u000e\u0002\u0014\u000b\u0013\r\n\t\f\u0002\f\b\t\u0013\t\u0007\b\u0010\u001a\r\u0010\u000b\u000b\u0006\u001a\u0010\u000b\u0003\r\u0005\u0002\u0013\u000e\f\u000b\u0011\r\u0013\u0013\b\u0007\u0011\u0019\f\u0015\u0007\u0006\u0011\u0015\u0013\u0014 \n\u0012\u0013\u000b\u0005\u0007\n\u0000\u0001\u000b\r\u0011\u0018\u0010\u0010\u0015\t\u0013\u0013\u0016\u001c\u0007\r\u0010\f\n\u000b\u0016\u0010\t\u000e\u0003\t\u0007\u0012\u000e\u0018\n\t\u0016\u000e\u000e\u0016\u0015\u0011\t\u0010\u0010\r\u0011\u0013\u0012\u0013\u0019\u0013\u0016\u001b\u0019\u0013\u000e\f\u000b\u0003\u0005\u0007\r\u0002\u0003\u0003\u0003\b\u0007\u0014\f\f\u0005\u0004\u0005\u0011\u0005\u0006\u0004\u0003\u0007\u0018\u001f\u001c\u001e\u0013\u001f\r\u0019\u0016\b\u0001\u000f\u0005\f\u0003\u0006\u0006\u0006\u0006\u0005\t\u0000\u000e\r\u0010\u0010\u0016\u0004\u001e\r\u001e\u0010\u0011\u0017\u0016\u0019\u000e\u0004\u0007\u0006\u0004\u0017\f\u0002\b\u0004\u0005\u0005\u0005\u0006\t\n\n\b\u0017\u0017\u0016\u000b\u000f\u0014\u0014\u0010\u0012\u0010\u0016\u0017\u0018\u000e\u000b\u0006\u0003\n\u0010\u0004\u001c\f\u001b\u0015\u001f\u001b\u0019\u0019\u001a\u0012\u0013\u001d\u001c\u001a\u0012\u0012\u0019\u0000\u0015\f\n\u0003\u000f\b\r\u000f\u0001\u0006\u0010\u0010\u0005\u0003\u000b\u0003\u0003\f\u0005\u0012\b\u000f\u0007\b\u0012\u0007\u0007\f\u0014\u0012\u0016\u0013\u0018!\u0014\u0016\u001b\u0019\u0010\t\u0004\u0004\u0007\u0003\u0001\u0016\u0012\n\n\u0015\b\u0003\f\b\u0000\b\u000f\u0010\u001b\u0005\u0019\u001c\u0014\t\n\u0007\u0000\f\u0005\u0000\u0001\u0003\r\u0003\u000f\u000b\u0006\u0015\t\u0016\u0016\u001c\u0013\u0010\u0005\u0011\u000b\u001b\u000f\u0010\u0012\u0007\u000b\f\u000f\u0016\u0006\u0001\n\u0002\u0019\u0006\u0006\u0007\u0003\u0003\u0007\u0010\u0013\u0010\r\u0010\f\u0011\u0017\b\u0007\u0012\u0010\r\r\u0010\u0010\u000e\u0016\u000b\u001a\u0016\r\u0011\u0011\u0019\u000f\u0015\b\f\u0007\u000b\u000e\u0002\n\u0004\u0000\u000e\b\u0002\u0006\u0004\u000b\u0003\u0005\u0011\r\u0005\f\u000f\u0017\f\r"
  },
  {
    "path": "rpi-fdb/Makefile",
    "content": "#CFLAGS+=-std=c99\nCFLAGS+=-Wall\n#CFLAGS+=-Werror\nCFLAGS+=-g\nCFLAGS+=-O3\n\nINCLUDES+=-I/opt/vc/include\nINCLUDES+=-I/opt/vc/include/interface/vcos/pthreads\nINCLUDES+=-I/opt/vc/include/interface/vmcs_host/linux\n\nLIBS+=-L/opt/vc/lib\nLIBS+=-lGLESv2\nLIBS+=-lEGL\nLIBS+=-lm\nLIBS+=-lrt\nLIBS+=-lbcm_host\nLIBS+=-lvcos\nLIBS+=-lvchiq_arm\nLIBS+=-lpthread\nLIBS+=-lrtlsdr\n\n\niqvis: iqvis.c\n\tgcc $(CFLAGS) $(INCLUDES) $(LIBS) -o iqvis iqvis.c\niqvis_lines: iqvis_lines.c\n\tgcc $(CFLAGS) $(INCLUDES) $(LIBS) -o iqvis_lines iqvis_lines.c\n\n"
  },
  {
    "path": "rpi-fdb/README",
    "content": "\nIQ visualisation on RPi \n=======================\n\n\n== Installation:\n(Debian/Raspbian)\n\n# rtl-sdr dependencies \nsudo apt-get install cmake\nsudo apt-get install libusb-1.0-0-dev\n\n# rtl-sdr library from source\ngit clone git://git.osmocom.org/rtl-sdr.git\ncd rtl-sdr/\n\n# set udev and modprobe rules\nsudo cp rtl-sdr.rules /etc/udev/rules.d/\nsudo cat <<EOF > /etc/modprobe.d/rtlsdr-blacklist.conf\nblacklist dvb_usb_rtl28xxu\nEOF\n# compile rtl-sdr\nmkdir build\ncd build/\ncmake ..\nmake\nsudo make install\n\n# make sure we got rid of default dvb kernel driver\nrmmod -f dvb_usb_rtl28xxu\n\n# frequensea\n\ngit clone https://github.com/fdb/frequensea.git\ncd frequensea/rpi-fdb/\nmake\n\nls -al ./iqvis\n\n\n== Usage\n\nstartup without parameters, usefull keys : '<' and '>' to scroll through spectrum\n\n./iqvis\n\n\n"
  },
  {
    "path": "rpi-fdb/iqvis.c",
    "content": "// Visualisation on the Raspberry PI\n\n#include <math.h>\n#include <pthread.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <unistd.h>\n#include <assert.h>\n\n\n#include <rtl-sdr.h>\n\n#include \"bcm_host.h\"\n#include \"GLES2/gl2.h\"\n#include \"EGL/egl.h\"\n#include \"EGL/eglext.h\"\n\n#include <fcntl.h>\n#include <termios.h>\n\n\n#define WIDTH 256\n#define HEIGHT 256\n\nEGL_DISPMANX_WINDOW_T window;\nEGLDisplay display;\nEGLSurface surface;\nEGLContext context;\nuint32_t screen_width;\nuint32_t screen_height;\n\nGLuint texture_id;\nGLuint program;\nGLuint position_vbo;\nGLuint uv_vbo;\nGLuint vao;\nuint8_t * buffer=0; \nuint8_t * buffer_wr=0; \nrtlsdr_dev_t *device;\npthread_t receive_thread;\npthread_mutex_t buffer_lock;\n\ndouble freq_mhz = 124.2;\nint paused = 0;\nint intensity = 3;\nvoid *rtl_buffer;\nconst uint32_t rtl_buffer_length = (16 * 16384);\nint rtl_should_quit = 0;\n\nvoid rtl_check_status(rtlsdr_dev_t *device, int status, const char *message, const char *file, int line) {\n    if (status != 0) {\n        fprintf(stderr, \"RTL-SDR: %s (Status code %d) %s:%d\\n\", message, status, file, line);\n        if (device != NULL) {\n            rtlsdr_close(device);\n        }\n        exit(EXIT_FAILURE);\n    }\n}\n\n#define RTL_CHECK_STATUS(device, status, message) rtl_check_status(device, status, message, __FILE__, __LINE__)\n\nvoid receive_block(unsigned char *in_buffer, uint32_t buffer_length, void *ctx) {\n    if (paused) return;\n    pthread_mutex_lock(&buffer_lock);\n    memset(buffer_wr, 0x0, WIDTH * HEIGHT * 3 );\n    int i = 0;\n    for (i = 0; i < buffer_length; i += 2) {\n        int vi = in_buffer[i];\n        int vq = in_buffer[i + 1];\n\n        int d = ((vq * WIDTH) + vi) * 3;\n        uint8_t v = buffer_wr[d];\n        v += intensity;\n        v = v < 0 ? 0 : v > 255 ? 255 : v;\n        buffer_wr[d] = v;\n    }\n    pthread_mutex_unlock(&buffer_lock);\n}\n\n// This function will block, so needs to be called on its own thread.\nvoid *_receive_loop(rtlsdr_dev_t *device) {\n    while (!rtl_should_quit) {\n        int n_read;\n        int status = rtlsdr_read_sync(device, rtl_buffer, rtl_buffer_length, &n_read);\n        RTL_CHECK_STATUS(device, status, \"rtlsdr_read_sync\");\n\n        if (n_read < rtl_buffer_length) {\n            fprintf(stderr, \"Short read, samples lost, exiting!\\n\");\n            exit(EXIT_FAILURE);\n        }\n\n        receive_block(rtl_buffer, rtl_buffer_length, device);\n    }\n    return NULL;\n}\n\nstatic void setup_rtl() {\n    int status;\n\n    rtl_buffer = calloc(rtl_buffer_length, sizeof(uint8_t));\n\n    int device_count = rtlsdr_get_device_count();\n    if (device_count == 0) {\n        fprintf(stderr, \"RTL-SDR: No devices found.\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    const char *device_name = rtlsdr_get_device_name(0);\n    printf(\"Device %s\\n\", device_name);\n\n    status = rtlsdr_open(&device, 0);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_open\");\n\n    status = rtlsdr_set_sample_rate(device, 3200000);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_sample_rate\");\n\n    // Set auto-gain mode\n    status = rtlsdr_set_tuner_gain_mode(device, 0);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_tuner_gain_mode\");\n\n    status = rtlsdr_set_agc_mode(device, 1);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_agc_mode\");\n\n    status = rtlsdr_set_center_freq(device, freq_mhz * 1e6);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_center_freq\");\n\n    status = rtlsdr_reset_buffer(device);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_reset_buffer\");\n\n    printf(\"Start\\n\");\n    pthread_create(&receive_thread, NULL, (void *(*)(void *))_receive_loop, device);\n    printf(\"Running\\n\");\n\n}\n\nstatic void set_frequency() {\n    freq_mhz = round(freq_mhz * 10.0) / 10.0;\n    printf(\"Setting freq to %f MHz.\\r\\n\", freq_mhz);\n    int status = rtlsdr_set_center_freq(device, freq_mhz * 1e6);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_center_freq\");\n}\n\nstatic void teardown_rtl() {\n    int status;\n\n    rtl_should_quit = 1;\n\n    printf(\"pthread_join\\n\");\n    pthread_join(receive_thread, NULL);\n\n    printf(\"rtlsdr_close\\n\");\n    status = rtlsdr_close(device);\n    //printf(\"Closed\\n\");\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_close\");\n}\n\n\nvoid ngl_check_gl_error(const char *file, int line) {\n    GLenum err = glGetError();\n    int has_error = 0;\n    while (err != GL_NO_ERROR) {\n        has_error = 1;\n        char *msg = NULL;\n        switch(err) {\n            case GL_INVALID_OPERATION:\n            msg = \"GL_INVALID_OPERATION\";\n            break;\n            case GL_INVALID_ENUM:\n            msg = \"GL_INVALID_ENUM\";\n            fprintf(stderr, \"OpenGL error: GL_INVALID_ENUM\\n\");\n            break;\n            case GL_INVALID_VALUE:\n            msg = \"GL_INVALID_VALUE\";\n            fprintf(stderr, \"OpenGL error: GL_INVALID_VALUE\\n\");\n            break;\n            case GL_OUT_OF_MEMORY:\n            msg = \"GL_OUT_OF_MEMORY\";\n            fprintf(stderr, \"OpenGL error: GL_OUT_OF_MEMORY\\n\");\n            break;\n            default:\n            msg = \"UNKNOWN_ERROR\";\n        }\n        fprintf(stderr, \"OpenGL error: %s - %s:%d\\n\", msg, file, line);\n        err = glGetError();\n    }\n    if (has_error) {\n        exit(EXIT_FAILURE);\n    }\n}\n\n#define NGL_CHECK_ERROR() ngl_check_gl_error(__FILE__, __LINE__)\n\nstatic void check_shader_error(GLuint shader) {\n    int length = 0;\n\n    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);\n\n    if (length > 0) {\n        char message[length];\n        glGetShaderInfoLog(shader, length, NULL, message);\n        printf(\"%s\\n\", message);\n    }\n}\n\n\nstatic const GLfloat positions[] = {\n    -1.0, -1.0,\n     1.0, -1.0,\n    -1.0,  1.0,\n     1.0,  1.0\n};\n\nstatic const GLfloat uvs[] = {\n    1.0, 1.0,\n    1.0, 0.0,\n    0.0, 1.0,\n    0.0, 0.0\n};\n\nGLuint u_texture;\nstatic void setup() {\n    glPixelStorei ( GL_UNPACK_ALIGNMENT, 1 );\n    NGL_CHECK_ERROR();\n\n    glActiveTexture(GL_TEXTURE0);\n    glBindTexture(GL_TEXTURE_2D, texture_id);\n    NGL_CHECK_ERROR();\n\n    glGenTextures(1, &texture_id);\n    glBindTexture(GL_TEXTURE_2D, texture_id);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE );\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE );\n    NGL_CHECK_ERROR();\n\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, buffer);\n    NGL_CHECK_ERROR();\n    //glBindTexture(GL_TEXTURE_2D, 0);\n    //NGL_CHECK_ERROR();\n\n    const char *vertex_shader_source =\n        \"#ifdef GL_ES\\n\"\n        \"precision mediump float;\\n\"\n        \"#endif\\n\"\n        \"attribute vec2 vp;\\n\"\n        \"attribute vec2 vt;\\n\"\n        \"varying vec2 uv;\\n\"\n        \"void main(void) {\\n\"\n        \"  uv = vt;\\n\"\n        \"  gl_Position = vec4(vp.x, vp.y, 0, 1);\\n\"\n        \"}\\n\";\n\n    const char *fragment_shader_source =\n        \"#ifdef GL_ES\\n\"\n        \"precision mediump float;\\n\"\n        \"#endif\\n\"\n        \"uniform sampler2D texture;\\n\"\n        \"varying vec2 uv;\\n\"\n        \"void main(void) {\\n\"\n        \"  vec4 c = texture2D(texture, uv);\\n\"\n        \"  float v = c.r;\\n\"\n        \"  gl_FragColor = vec4(v, v, v, 1);\\n\"\n        \"}\\n\";\n\n    GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);\n    glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);\n    glCompileShader(vertex_shader);\n    check_shader_error(vertex_shader);\n\n    GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);\n    glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);\n    glCompileShader(fragment_shader);\n    check_shader_error(fragment_shader);\n\n    program = glCreateProgram();\n    glAttachShader(program, vertex_shader);\n    glAttachShader(program, fragment_shader);\n    glLinkProgram(program);\n    NGL_CHECK_ERROR();\n\n    glUseProgram(program);\n    NGL_CHECK_ERROR();\n\n    u_texture = glGetUniformLocation(program, \"texture\");\n    glUniform1i(u_texture, 0);\n\n    NGL_CHECK_ERROR();\n\n    GLuint a_vp, a_vt;\n    a_vp = glGetAttribLocation(program, \"vp\");\n    a_vt = glGetAttribLocation(program, \"vt\");\n    glVertexAttribPointer(a_vp, 2, GL_FLOAT, 0, 0, positions);\n    glEnableVertexAttribArray(a_vp);\n    glVertexAttribPointer(a_vt, 2, GL_FLOAT, 0, 0, uvs);\n    glEnableVertexAttribArray(a_vt);\n    NGL_CHECK_ERROR();\n\n\n\n}\n\nstatic void prepare() {\n    uint32_t width, height;\n\n    int32_t success = graphics_get_display_size(0, &width, &height);\n    assert(success >= 0);\n\n    glViewport((width-height)/2.0, 0, height, height);\n    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);\n    glClear(GL_COLOR_BUFFER_BIT);\n    NGL_CHECK_ERROR();\n}\n\nstatic void update() {\n    \n    glBindTexture(GL_TEXTURE_2D, texture_id);\n    NGL_CHECK_ERROR();\n    //printf(\"Up: %d\\n\", buffer[(128*WIDTH + 128) * 3]);\n    //FILE *fp = fopen(\"buf.raw\", \"wb\");\n    //fwrite(buffer, 1, WIDTH * HEIGHT * 3, fp);\n    //fclose(fp);\n    //sleep(1);\n    //glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, WIDTH, HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, buffer);\n\n    if (!pthread_mutex_trylock(&buffer_lock)) {\n      memcpy(buffer, buffer_wr, WIDTH*HEIGHT*3);\n      pthread_mutex_unlock(&buffer_lock); \n    }\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, buffer);\n    NGL_CHECK_ERROR();\n}\n\nstatic void draw() {\n    glEnable(GL_BLEND);\n    glBlendFunc(GL_ONE, GL_SRC_COLOR);\n    NGL_CHECK_ERROR();\n\n    glUseProgram(program);\n    NGL_CHECK_ERROR();\n    //\n    //glActiveTexture ( GL_TEXTURE0 );\n    //glBindTexture ( GL_TEXTURE_2D, texture_id );\n    //NGL_CHECK_ERROR();\n    glUniform1i(u_texture,0);\n    NGL_CHECK_ERROR();\n    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\n    NGL_CHECK_ERROR();\n\n    //glUseProgram(0);\n    //NGL_CHECK_ERROR();\n\n    //glFlush();\n    glFinish();\n    //NGL_CHECK_ERROR();\n}\n\n/*\nstatic void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {\n    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) {\n        glfwSetWindowShouldClose(window, GL_TRUE);\n    } else if (key == GLFW_KEY_RIGHT && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        if (mods == 0) {\n            freq_mhz += 0.1;\n        } else {\n            freq_mhz += 10;\n        }\n        set_frequency();\n    } else if (key == GLFW_KEY_LEFT && (action == GLFW_PRESS || action == GLFW_REPEAT)) {\n        if (mods == 0) {\n            freq_mhz -= 0.1;\n        } else {\n            freq_mhz -= 10;\n        }\n        set_frequency();\n    } else if (key == GLFW_KEY_SPACE && action == GLFW_PRESS) {\n        paused = !paused;\n    } else if (key == GLFW_KEY_EQUAL && action == GLFW_PRESS) {\n        intensity += 0.01;\n        printf(\"Intensity: %.2f\\n\", intensity);\n    } else if (key == GLFW_KEY_MINUS && action == GLFW_PRESS) {\n        intensity -= 0.01;\n        printf(\"Intensity: %.2f\\n\", intensity);\n    }\n}\n*/\n\nvoid nwm_init() {\n    EGLBoolean result;\n\n    // Get an EGL display connection.\n    display = eglGetDisplay(EGL_DEFAULT_DISPLAY);\n    assert(display != EGL_NO_DISPLAY);\n\n    // Initialize the EGL display connection.\n    result = eglInitialize(display, NULL, NULL);\n    assert(result != EGL_FALSE);\n\n    // Get an appropriate frame buffer configuration.\n    static EGLint frame_buffer_attributes[] = {\n        EGL_RED_SIZE, 8,\n        EGL_GREEN_SIZE, 8,\n        EGL_BLUE_SIZE, 8,\n        EGL_ALPHA_SIZE, 8,\n        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,\n        EGL_NONE\n    };\n    EGLConfig config;\n    EGLint num_config;\n    result = eglChooseConfig(display, frame_buffer_attributes, &config, 1, &num_config);\n    assert(result != EGL_FALSE);\n\n    // Set the current rendering API.\n    result = eglBindAPI(EGL_OPENGL_ES_API);\n    assert(result != EGL_FALSE);\n\n    // Create an EGL rendering context.\n    static const EGLint context_attributes[] = {\n        EGL_CONTEXT_CLIENT_VERSION, 2,\n        EGL_NONE\n    };\n    context = eglCreateContext(display, config, EGL_NO_CONTEXT, context_attributes);\n    assert(context != EGL_NO_CONTEXT);\n\n    // Create an EGL window surface.\n    int32_t success = graphics_get_display_size(0, &screen_width, &screen_height);\n    assert(success >= 0);\n    printf(\"%d %d\\n\", screen_width, screen_height);\n\n    VC_RECT_T dst_rect;\n    dst_rect.x = 0;\n    dst_rect.y = 0;\n    dst_rect.width = screen_width;\n    dst_rect.height = screen_height;\n\n    VC_RECT_T src_rect;\n    src_rect.x = 0;\n    src_rect.y = 0;\n    src_rect.width = screen_width << 16;\n    src_rect.height = screen_height << 16;\n\n    DISPMANX_DISPLAY_HANDLE_T display_handle = vc_dispmanx_display_open(0 /* LCD */);\n    DISPMANX_UPDATE_HANDLE_T update_handle = vc_dispmanx_update_start(0);\n    DISPMANX_ELEMENT_HANDLE_T element_handle = vc_dispmanx_element_add(\n            update_handle, display_handle, 0, &dst_rect, 0,\n            &src_rect, DISPMANX_PROTECTION_NONE, 0, 0, 0);\n\n    window.element = element_handle;\n    window.width = screen_width;\n    window.height = screen_height;\n    vc_dispmanx_update_submit_sync(update_handle);\n\n    surface = eglCreateWindowSurface(display, config, &window, NULL);\n    assert(surface != EGL_NO_SURFACE);\n\n    // Connect the rendering context to the surface.\n    result = eglMakeCurrent(display, surface, surface, context);\n    assert(result != EGL_FALSE);\n\n}\n\n\nint main(void) {\n    buffer =  malloc(WIDTH * HEIGHT * 3);\n    buffer_wr =  malloc(WIDTH * HEIGHT * 3);\n    bcm_host_init();\n    nwm_init();\n\n    setup_rtl();\n    setup();\n\n   freq_mhz=94.2;\n   set_frequency();\n\n    struct termios ios_old, ios_new;\n    tcgetattr(STDIN_FILENO, &ios_old);\n    tcgetattr(STDIN_FILENO, &ios_new);\n    cfmakeraw(&ios_new);\n    tcsetattr(STDIN_FILENO, 0, &ios_new);\n    fcntl(0, F_SETFL, O_NONBLOCK);\n\n    while ( 1) {\n        switch (getchar()) {\n            case 'Q':\n            case 'q':\n            case 0x7f:      /* Ctrl+c */\n            case 0x03:      /* Ctrl+c */\n            case 0x1b:      /* ESC */\n                printf(\"\\r\\nexit\\r\\n\");\n                            goto goal;\n            case '<':\n                            freq_mhz-=.1;\n                            set_frequency();\n                            break;\n            case '>':\n                            freq_mhz+=.1;\n                            set_frequency();\n                            break;\n        }\n        prepare();\n        update();\n       draw();\n       eglSwapBuffers(display, surface);\n       //sleep(0);\n    }\ngoal:\n      teardown_rtl();\n \n      tcsetattr(STDIN_FILENO, 0, &ios_old);\n\n      exit(EXIT_SUCCESS);\n}\n"
  },
  {
    "path": "rpi-fdb/iqvis_lines.c",
    "content": "// Visualisation on the Raspberry PI\n\n#include <math.h>\n#include <pthread.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <unistd.h>\n#include <assert.h>\n\n\n#include <rtl-sdr.h>\n\n#include \"bcm_host.h\"\n#include \"GLES2/gl2.h\"\n#include \"EGL/egl.h\"\n#include \"EGL/eglext.h\"\n\n#include <fcntl.h>\n#include <termios.h>\n\n#define IQ_RESOLUTION 256\n#define SIZE_MULTIPLIER 2\n#define WINDOW_WIDTH (IQ_RESOLUTION * SIZE_MULTIPLIER)\n#define WINDOW_HEIGHT (IQ_RESOLUTION * SIZE_MULTIPLIER)\n#define SAMPLE_BUFFER_SIZE 262144\n\nEGL_DISPMANX_WINDOW_T window;\nEGLDisplay display;\nEGLSurface surface;\nEGLContext context;\nuint32_t screen_width;\nuint32_t screen_height;\n\nGLuint texture_id;\nGLuint program;\nGLuint position_vbo;\nGLuint uv_vbo;\nGLuint vao;\nuint8_t * buffer=0;\nuint8_t * buffer_wr=0;\nrtlsdr_dev_t *device;\npthread_t receive_thread;\npthread_mutex_t buffer_lock;\n\ndouble freq_mhz = 143.2;\nint paused = 0;\nvoid *rtl_buffer;\nconst uint32_t rtl_buffer_length = (16 * 16384);\nint rtl_should_quit = 0;\n\nint line_intensity = 3;\nfloat line_percentage = 0.05;\n\n// Utility //////////////////////////////////////////////////////////////////\n\nfloat clampf(float v, float min, float max) {\n    return v < min ? min : v > max ? max : v;\n}\n\n// Line drawing ///////////////////////////////////////////////////////////////\n\nvoid pixel_put(uint8_t *image_buffer, int x, int y, int color) {\n    int offset = 3 * (y * WINDOW_WIDTH  + x);\n    image_buffer[offset] = color;\n}\n\nvoid pixel_inc(uint8_t *image_buffer, int x, int y) {\n    int offset = 3 * (y * WINDOW_WIDTH + x);\n    int v = image_buffer[offset];\n    v += line_intensity;\n    if (v <= 255) {\n        image_buffer[offset] = v;\n    }\n}\n\nvoid draw_line(uint8_t *image_buffer, int x1, int y1, int x2, int y2, int color) {\n  int dx = abs(x2 - x1);\n  int sx = x1 < x2 ? 1 : -1;\n  int dy = abs(y2-y1);\n  int sy = y1 < y2 ? 1 : -1;\n  int err = (dx > dy ? dx : -dy) / 2;\n  int e2;\n\n  for(;;){\n    pixel_inc(image_buffer, x1, y1);\n    if (x1 == x2 && y1 == y2) break;\n    e2 = err;\n    if (e2 > -dx) { err -= dy; x1 += sx; }\n    if (e2 <  dy) { err += dx; y1 += sy; }\n  }\n}\n\n// RTL-SDR //////////////////////////////////////////////////////////////////\n\nvoid rtl_check_status(rtlsdr_dev_t *device, int status, const char *message, const char *file, int line) {\n    if (status != 0) {\n        fprintf(stderr, \"RTL-SDR: %s (Status code %d) %s:%d\\r\\n\", message, status, file, line);\n        if (device != NULL) {\n            rtlsdr_close(device);\n        }\n        exit(EXIT_FAILURE);\n    }\n}\n\n#define RTL_CHECK_STATUS(device, status, message) rtl_check_status(device, status, message, __FILE__, __LINE__)\n\nvoid receive_block(unsigned char *in_buffer, uint32_t buffer_length, void *ctx) {\n    if (paused) return;\n    pthread_mutex_lock(&buffer_lock);\n    memset(buffer_wr, 0x0, WINDOW_WIDTH * WINDOW_HEIGHT * 3);\n    int i = 0;\n    int x1 = 0;\n    int y1 = 0;\n    int max = SAMPLE_BUFFER_SIZE * line_percentage;\n    for (i = 0; i < max; i += 2) {\n        int x2 = in_buffer[i] ;\n        int y2 = in_buffer[i+1];\n        draw_line(buffer_wr, x1 * SIZE_MULTIPLIER, y1 * SIZE_MULTIPLIER, x2 * SIZE_MULTIPLIER, y2 * SIZE_MULTIPLIER, 0);\n        x1 = x2;\n        y1 = y2;\n    }\n    pthread_mutex_unlock(&buffer_lock);\n}\n\n// This function will block, so needs to be called on its own thread.\nvoid *_receive_loop(rtlsdr_dev_t *device) {\n    while (!rtl_should_quit) {\n        int n_read;\n        int status = rtlsdr_read_sync(device, rtl_buffer, rtl_buffer_length, &n_read);\n        RTL_CHECK_STATUS(device, status, \"rtlsdr_read_sync\");\n\n        if (n_read < rtl_buffer_length) {\n            fprintf(stderr, \"Short read, samples lost, exiting!\\r\\n\");\n            exit(EXIT_FAILURE);\n        }\n\n        receive_block(rtl_buffer, rtl_buffer_length, device);\n    }\n    return NULL;\n}\n\nstatic void setup_rtl() {\n    int status;\n\n    rtl_buffer = calloc(rtl_buffer_length, sizeof(uint8_t));\n\n    int device_count = rtlsdr_get_device_count();\n    if (device_count == 0) {\n        fprintf(stderr, \"RTL-SDR: No devices found.\\r\\n\");\n        exit(EXIT_FAILURE);\n    }\n\n    const char *device_name = rtlsdr_get_device_name(0);\n    printf(\"Device %s\\r\\n\", device_name);\n\n    status = rtlsdr_open(&device, 0);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_open\");\n\n    status = rtlsdr_set_sample_rate(device, 3e6);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_sample_rate\");\n\n    // Set auto-gain mode\n    status = rtlsdr_set_tuner_gain_mode(device, 0);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_tuner_gain_mode\");\n\n    status = rtlsdr_set_agc_mode(device, 1);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_agc_mode\");\n\n    status = rtlsdr_set_center_freq(device, freq_mhz * 1e6);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_center_freq\");\n\n    status = rtlsdr_reset_buffer(device);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_reset_buffer\");\n\n    printf(\"Start\\r\\n\");\n    pthread_create(&receive_thread, NULL, (void *(*)(void *))_receive_loop, device);\n    printf(\"Running\\r\\n\");\n\n}\n\nstatic void set_frequency() {\n    freq_mhz = round(freq_mhz * 10.0) / 10.0;\n    printf(\"Setting freq to %f MHz.\\r\\n\", freq_mhz);\n    int status = rtlsdr_set_center_freq(device, freq_mhz * 1e6);\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_set_center_freq\");\n}\n\nstatic void teardown_rtl() {\n    int status;\n\n    rtl_should_quit = 1;\n\n    printf(\"pthread_join\\r\\n\");\n    pthread_join(receive_thread, NULL);\n\n    printf(\"rtlsdr_close\\r\\n\");\n    status = rtlsdr_close(device);\n    //printf(\"Closed\\r\\n\");\n    RTL_CHECK_STATUS(device, status, \"rtlsdr_close\");\n}\n\n// OpenGL ///////////////////////////////////////////////////////////////////\n\nvoid ngl_check_gl_error(const char *file, int line) {\n    GLenum err = glGetError();\n    int has_error = 0;\n    while (err != GL_NO_ERROR) {\n        has_error = 1;\n        char *msg = NULL;\n        switch(err) {\n            case GL_INVALID_OPERATION:\n            msg = \"GL_INVALID_OPERATION\";\n            break;\n            case GL_INVALID_ENUM:\n            msg = \"GL_INVALID_ENUM\";\n            fprintf(stderr, \"OpenGL error: GL_INVALID_ENUM\\r\\n\");\n            break;\n            case GL_INVALID_VALUE:\n            msg = \"GL_INVALID_VALUE\";\n            fprintf(stderr, \"OpenGL error: GL_INVALID_VALUE\\r\\n\");\n            break;\n            case GL_OUT_OF_MEMORY:\n            msg = \"GL_OUT_OF_MEMORY\";\n            fprintf(stderr, \"OpenGL error: GL_OUT_OF_MEMORY\\r\\n\");\n            break;\n            default:\n            msg = \"UNKNOWN_ERROR\";\n        }\n        fprintf(stderr, \"OpenGL error: %s - %s:%d\\r\\n\", msg, file, line);\n        err = glGetError();\n    }\n    if (has_error) {\n        exit(EXIT_FAILURE);\n    }\n}\n\n#define NGL_CHECK_ERROR() ngl_check_gl_error(__FILE__, __LINE__)\n\nstatic void check_shader_error(GLuint shader) {\n    int length = 0;\n\n    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);\n\n    if (length > 0) {\n        char message[length];\n        glGetShaderInfoLog(shader, length, NULL, message);\n        printf(\"%s\\r\\n\", message);\n    }\n}\n\n\nstatic const GLfloat positions[] = {\n    -1.0, -1.0,\n     1.0, -1.0,\n    -1.0,  1.0,\n     1.0,  1.0\n};\n\nstatic const GLfloat uvs[] = {\n    1.0, 1.0,\n    1.0, 0.0,\n    0.0, 1.0,\n    0.0, 0.0\n};\n\n\nstatic void setup() {\n    glPixelStorei ( GL_UNPACK_ALIGNMENT, 1 );\n    NGL_CHECK_ERROR();\n\n    glActiveTexture(GL_TEXTURE0);\n    glBindTexture(GL_TEXTURE_2D, texture_id);\n    NGL_CHECK_ERROR();\n\n    glGenTextures(1, &texture_id);\n    glBindTexture(GL_TEXTURE_2D, texture_id);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE );\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE );\n    NGL_CHECK_ERROR();\n\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WINDOW_WIDTH, WINDOW_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, buffer);\n    NGL_CHECK_ERROR();\n    //glBindTexture(GL_TEXTURE_2D, 0);\n    //NGL_CHECK_ERROR();\n\n    const char *vertex_shader_source =\n        \"#ifdef GL_ES\\r\\n\"\n        \"precision mediump float;\\r\\n\"\n        \"#endif\\r\\n\"\n        \"attribute vec2 vp;\\r\\n\"\n        \"attribute vec2 vt;\\r\\n\"\n        \"varying vec2 uv;\\r\\n\"\n        \"void main(void) {\\r\\n\"\n        \"  uv = vt;\\r\\n\"\n        \"  gl_Position = vec4(vp.x, vp.y, 0, 1);\\r\\n\"\n        \"}\\r\\n\";\n\n    const char *fragment_shader_source =\n        \"#ifdef GL_ES\\r\\n\"\n        \"precision mediump float;\\r\\n\"\n        \"#endif\\r\\n\"\n        \"uniform sampler2D texture;\\r\\n\"\n        \"varying vec2 uv;\\r\\n\"\n        \"void main(void) {\\r\\n\"\n        \"  vec4 c = texture2D(texture, uv);\\r\\n\"\n        \"  float v = c.r;\\r\\n\"\n        \"  gl_FragColor = vec4(v, v, v, 1);\\r\\n\"\n        \"}\\r\\n\";\n\n    GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);\n    glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);\n    glCompileShader(vertex_shader);\n    check_shader_error(vertex_shader);\n\n    GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);\n    glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);\n    glCompileShader(fragment_shader);\n    check_shader_error(fragment_shader);\n\n    program = glCreateProgram();\n    glAttachShader(program, vertex_shader);\n    glAttachShader(program, fragment_shader);\n    glLinkProgram(program);\n    NGL_CHECK_ERROR();\n\n    glUseProgram(program);\n    NGL_CHECK_ERROR();\n\n    GLuint u_texture = glGetUniformLocation(program, \"texture\");\n    glUniform1i(u_texture, 0);\n\n    NGL_CHECK_ERROR();\n\n    GLuint a_vp, a_vt;\n    a_vp = glGetAttribLocation(program, \"vp\");\n    a_vt = glGetAttribLocation(program, \"vt\");\n    glVertexAttribPointer(a_vp, 2, GL_FLOAT, 0, 0, positions);\n    glEnableVertexAttribArray(a_vp);\n    glVertexAttribPointer(a_vt, 2, GL_FLOAT, 0, 0, uvs);\n    glEnableVertexAttribArray(a_vt);\n    NGL_CHECK_ERROR();\n}\n\nstatic void prepare() {\n    uint32_t width, height;\n\n    int32_t success = graphics_get_display_size(0, &width, &height);\n    assert(success >= 0);\n\n    glViewport((width-height)/2.0, 0, height, height);\n    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);\n    glClear(GL_COLOR_BUFFER_BIT);\n    NGL_CHECK_ERROR();\n}\n\nstatic void update() {\n    glBindTexture(GL_TEXTURE_2D, texture_id);\n    NGL_CHECK_ERROR();\n\n    if (!pthread_mutex_trylock(&buffer_lock)) {\n      memcpy(buffer, buffer_wr, WINDOW_WIDTH * WINDOW_HEIGHT * 3);\n      pthread_mutex_unlock(&buffer_lock);\n    }\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WINDOW_WIDTH, WINDOW_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, buffer);\n    NGL_CHECK_ERROR();\n}\n\nstatic void draw() {\n    glEnable(GL_BLEND);\n    glBlendFunc(GL_ONE, GL_SRC_COLOR);\n    NGL_CHECK_ERROR();\n\n    glUseProgram(program);\n    NGL_CHECK_ERROR();\n    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);\n    NGL_CHECK_ERROR();\n\n    glFinish();\n    NGL_CHECK_ERROR();\n}\n\nvoid nwm_init() {\n    EGLBoolean result;\n\n    // Get an EGL display connection.\n    display = eglGetDisplay(EGL_DEFAULT_DISPLAY);\n    assert(display != EGL_NO_DISPLAY);\n\n    // Initialize the EGL display connection.\n    result = eglInitialize(display, NULL, NULL);\n    assert(result != EGL_FALSE);\n\n    // Get an appropriate frame buffer configuration.\n    static EGLint frame_buffer_attributes[] = {\n        EGL_RED_SIZE, 8,\n        EGL_GREEN_SIZE, 8,\n        EGL_BLUE_SIZE, 8,\n        EGL_ALPHA_SIZE, 8,\n        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,\n        EGL_NONE\n    };\n\n    EGLConfig config;\n    EGLint num_config;\n    result = eglChooseConfig(display, frame_buffer_attributes, &config, 1, &num_config);\n    assert(result != EGL_FALSE);\n\n    // Set the current rendering API.\n    result = eglBindAPI(EGL_OPENGL_ES_API);\n    assert(result != EGL_FALSE);\n\n    // Create an EGL rendering context.\n    static const EGLint context_attributes[] = {\n        EGL_CONTEXT_CLIENT_VERSION, 2,\n        EGL_NONE\n    };\n    context = eglCreateContext(display, config, EGL_NO_CONTEXT, context_attributes);\n    assert(context != EGL_NO_CONTEXT);\n\n    // Create an EGL window surface.\n    int32_t success = graphics_get_display_size(0, &screen_width, &screen_height);\n    assert(success >= 0);\n    printf(\"%d %d\\r\\n\", screen_width, screen_height);\n\n    VC_RECT_T dst_rect;\n    dst_rect.x = 0;\n    dst_rect.y = 0;\n    dst_rect.width = screen_width;\n    dst_rect.height = screen_height;\n\n    VC_RECT_T src_rect;\n    src_rect.x = 0;\n    src_rect.y = 0;\n    src_rect.width = screen_width << 16;\n    src_rect.height = screen_height << 16;\n\n    DISPMANX_DISPLAY_HANDLE_T display_handle = vc_dispmanx_display_open(0 /* LCD */);\n    DISPMANX_UPDATE_HANDLE_T update_handle = vc_dispmanx_update_start(0);\n    DISPMANX_ELEMENT_HANDLE_T element_handle = vc_dispmanx_element_add(\n            update_handle, display_handle, 0, &dst_rect, 0,\n            &src_rect, DISPMANX_PROTECTION_NONE, 0, 0, 0);\n\n    window.element = element_handle;\n    window.width = screen_width;\n    window.height = screen_height;\n    vc_dispmanx_update_submit_sync(update_handle);\n\n    surface = eglCreateWindowSurface(display, config, &window, NULL);\n    assert(surface != EGL_NO_SURFACE);\n\n    // Connect the rendering context to the surface.\n    result = eglMakeCurrent(display, surface, surface, context);\n    assert(result != EGL_FALSE);\n}\n\n// Main /////////////////////////////////////////////////////////////////////\n\nint main(void) {\n    buffer =  calloc(WINDOW_WIDTH * WINDOW_HEIGHT * 3, 1);\n    buffer_wr =  calloc(WINDOW_HEIGHT * WINDOW_HEIGHT * 3, 1);\n    bcm_host_init();\n    nwm_init();\n\n    setup_rtl();\n    setup();\n\n    // set terminal nonblocking i/o\n    struct termios ios_old, ios_new;\n    tcgetattr(STDIN_FILENO, &ios_old);\n    tcgetattr(STDIN_FILENO, &ios_new);\n    cfmakeraw(&ios_new);\n    tcsetattr(STDIN_FILENO, 0, &ios_new);\n    fcntl(0, F_SETFL, O_NONBLOCK);\n\n    for (;;) {\n       switch (getchar()) {\n            case 'Q':\n            case 'q':\n            case 0x7f:      /* Ctrl+c */\n            case 0x03:      /* Ctrl+c */\n            case 0x1b:      /* ESC */\n                printf(\"\\r\\nexit\\r\\n\");\n                goto end;\n            case '[':\n                freq_mhz-=.1;\n                set_frequency();\n                break;\n            case ']':\n                freq_mhz+=.1;\n                set_frequency();\n                break;\n            case '-':\n                line_intensity--;\n                printf(\"Intensity: %d\\r\\n\", line_intensity);\n                break;\n            case '=':\n                line_intensity++;\n                printf(\"Intensity: %d\\r\\n\", line_intensity);\n                break;\n            case ',':\n                line_percentage = clampf(line_percentage - 0.01, 0, 1);\n                printf(\"Line percentage: %.2f%%\\r\\n\", line_percentage * 100);\n                break;\n            case '.':\n                line_percentage = clampf(line_percentage + 0.01, 0, 1);\n                printf(\"Line percentage: %.2f%%\\r\\n\", line_percentage * 100);\n                break;\n\n       }\n       prepare();\n       update();\n       draw();\n       eglSwapBuffers(display, surface);\n    }\nend:\n      teardown_rtl();\n\n      // reset terminal i/o parameters\n      tcsetattr(STDIN_FILENO, 0, &ios_old);\n\n      exit(EXIT_SUCCESS);\n}\n"
  },
  {
    "path": "rust/Cargo.toml",
    "content": "[package]\nname = \"frequensea\"\nversion = \"0.0.1\"\nauthors = [\"Frederik De Bleser <frederik@debleser.be>\"]\n\n[dependencies.sdl2]\ngit = \"https://github.com/cristicbz/rust-sdl2\"\nbranch = \"static_to_const\"\n\n[dependencies.gl]\ngit = \"https://github.com/bjz/gl-rs\"\n\n[dependencies.toml]\ngit = \"https://github.com/alexcrichton/toml-rs\"\n"
  },
  {
    "path": "rust/src/main.rs",
    "content": "\n\n//use ovr::{SensorCapabilities, Ovr};\n\nextern crate debug;\nextern crate libc;\n\nuse libc::{c_uint, c_int, c_float, c_char, c_void, c_double, c_short};\n\n#[cfg(target_os = \"macos\")]\n#[link(name=\"ovr\")]\n#[link(name=\"stdc++\")]\n#[link(name = \"Cocoa\", kind = \"framework\")]\n#[link(name = \"IOKit\", kind = \"framework\")]\n#[link(name = \"CoreFoundation\", kind = \"framework\")]\n#[link(name = \"OpenGL\", kind = \"framework\")]\nextern {}\n\n #[deriving(Clone, Default)]\n#[repr(C)]\npub struct Sizei {\n    pub x: c_int,\n    pub y: c_int\n}\n\n#[deriving(Clone, Default)]\n#[repr(C)]\npub struct Vector2i {\n    pub x: c_int,\n    pub y: c_int\n}\n\n\n#[deriving(Clone, Default)]\n#[repr(C)]\npub struct FovPort {\n    pub up_tan: c_float,\n    pub down_tan: c_float,\n    pub left_tan: c_float,\n    pub right_tan: c_float\n}\n\n#[deriving(Clone, Default)]\n#[repr(C)]\npub struct Vector3f {\n    pub x: c_float,\n    pub y: c_float,\n    pub z: c_float\n}\n\npub enum HmdStruct { }\n\n#[repr(C)]\npub struct Hmd {\n    pub handle: *const HmdStruct,\n    pub hmd_type: c_int,\n    pub product_name: *const c_char,\n    pub manufacturer: *const c_char,\n    pub hmd_capabilities: c_uint,\n    pub sensor_capabilities: c_uint,\n    pub distortion_capabilities: c_uint,\n    pub resolution: Sizei,\n    pub window_position: Vector2i,\n    pub default_eye_fov: [FovPort, ..2],\n    pub max_eye_fov: [FovPort, ..2],\n    pub eye_render_order: [c_uint, ..2],\n    pub display_device_name: *const c_char,\n    pub display_id: c_int\n}\n\n\nextern \"C\" {\n    pub fn ovr_Initialize() -> bool;\n    pub fn ovrHmd_Create(index: c_int) -> *const Hmd;\n}\n\n\n\nfn main() {\n    unsafe {\n        if ovr_Initialize() {\n            println!(\"Initialized.\");\n        } else {\n            println!(\"Initialization failed.\");\n        }\n        let hmd_ptr = ovrHmd_Create(0);\n        let hmd = match hmd_ptr.as_ref() {\n            Some(hmd) => hmd,\n            None => {\n                println!(\"Could not create HMD.\");\n                return;\n            }\n        };\n        println!(\"Resolution: {:?}\", hmd.resolution);\n        println!(\"Display Device Name: {:?}\", hmd.display_device_name);\n\n    }\n\n}"
  },
  {
    "path": "shaders/skybox.frag",
    "content": "#version 400\n\nin vec3 texcoords;\nuniform samplerCube cube_texture;\nout vec4 frag_colour;\n\nvoid main () {\n  frag_colour = texture (cube_texture, texcoords);\n}"
  },
  {
    "path": "shaders/skybox.vert",
    "content": "#version 400\n\nin vec3 vp;\nuniform mat4 uProjectionMatrix, uViewMatrix;\nout vec3 texcoords;\n\nvoid main () {\n  texcoords = vp * 10;\n  gl_Position = uProjectionMatrix * uViewMatrix * vec4 (vp * 10, 1.0);\n}"
  },
  {
    "path": "src/main.cpp",
    "content": "\nextern  \"C\" {\n    #include <assert.h>\n    #include <string.h>\n    #include <stdlib.h>\n    #include <lua.h>\n    #include <lauxlib.h>\n    #include <lualib.h>\n\n    #include \"ngl.h\"\n    #include \"nim.h\"\n    #include \"nosc.h\"\n    #include \"nrf.h\"\n    #include \"nwm.h\"\n    #include \"vec.h\"\n    #include \"nfile.h\"\n}\n\n#ifdef WITH_NVR\n    #include \"nvr.h\"\n#endif\n\n// Lua utility functions ////////////////////////////////////////////////////\n\nstatic void l_register_type(lua_State *L, const char *type, lua_CFunction gc_fn) {\n    luaL_newmetatable(L, type);\n    if (gc_fn != NULL) {\n        lua_pushcfunction(L, gc_fn);\n        lua_setfield(L, -2, \"__gc\");\n        lua_pop(L, 1);\n    }\n}\n\nstatic void l_to_table(lua_State *L, const char *type, void *obj) {\n    lua_newtable(L);\n    luaL_getmetatable(L, type);\n    lua_setmetatable(L, -2);\n    lua_pushliteral(L, \"__type__\");\n    lua_pushstring(L, type);\n    lua_settable(L, -3);\n    lua_pushliteral(L, \"__ptr__\");\n    lua_pushlightuserdata(L, obj);\n    lua_settable(L, -3);\n}\n\nstatic void* l_from_table(lua_State *L, const char *type, int index) {\n    luaL_checktype(L, index, LUA_TTABLE);\n    lua_pushliteral(L, \"__type__\");\n    lua_gettable(L, index);\n    const char *table_type = lua_tostring(L, -1);\n    if (strcmp(type, table_type) == 0) {\n        lua_pushliteral(L, \"__ptr__\");\n        lua_gettable(L, index);\n        void *data = lua_touserdata(L, -1);\n        return data;\n    } else {\n        fprintf(stderr, \"Lua: invalid type for param %d: expected %s, was %s\\n\", index, type, table_type);\n        exit(EXIT_FAILURE);\n    }\n}\n\nstatic double l_table_integer(lua_State *L, int table_index, const char *key, int _default) {\n    lua_getfield(L, table_index, key);\n    int is_num;\n    int v = lua_tointegerx(L, -1, &is_num);\n    return is_num ? v : _default;\n}\n\nstatic double l_table_double(lua_State *L, int table_index, const char *key, double _default) {\n    lua_getfield(L, table_index, key);\n    int is_num;\n    double v = lua_tonumberx(L, -1, &is_num);\n    return is_num ? v : _default;\n}\n\nstatic const char *l_table_string(lua_State *L, int table_index, const char *key, const char *_default) {\n    lua_getfield(L, table_index, key);\n    if (lua_isstring(L, -1)) {\n        return lua_tostring(L, -1);\n    } else {\n        return _default;\n    }\n}\n\nstatic void l_register_function(lua_State *L, const char *name, lua_CFunction fn) {\n    lua_pushcfunction(L, fn);\n    lua_setglobal(L, name);\n}\n\nstatic void l_register_constant(lua_State *L, const char *name, int value) {\n    lua_pushinteger(L, value);\n    lua_setglobal(L, name);\n}\n\nstatic int l_call_function(lua_State *L, const char *name) {\n    lua_getglobal(L, name);\n    if (lua_isfunction(L, -1)) {\n        int error = lua_pcall(L, 0, 0, 0);\n        if (error) {\n            fprintf(stderr, \"Error calling %s(): %s\\n\", name, lua_tostring(L, -1));\n            lua_pop(L, 1);\n            return -1;\n        } else {\n            return 0;\n        }\n    } else {\n        lua_pop(L, 1);\n        fprintf(stderr, \"WARN: No \\\"%s\\\" function.\\n\", name);\n        return -1;\n    }\n}\n\n// Lua NUL wrappers /////////////////////////////////////////////////////////\n\n// nut_buffer\n\nstatic nut_buffer* l_to_nut_buffer(lua_State *L, int index) {\n    return (nut_buffer*) l_from_table(L, \"nut_buffer\", index);\n}\n\nstatic int l_push_nut_buffer(lua_State *L, nut_buffer *buffer) {\n    l_to_table(L, \"nut_buffer\", buffer);\n\n    lua_pushliteral(L, \"length\");\n    lua_pushinteger(L, buffer->length);\n    lua_settable(L, -3);\n\n    lua_pushliteral(L, \"channels\");\n    lua_pushinteger(L, buffer->channels);\n    lua_settable(L, -3);\n\n    lua_pushliteral(L, \"size_bytes\");\n    lua_pushinteger(L, buffer->size_bytes);\n    lua_settable(L, -3);\n\n    return 1;\n}\n\nstatic int l_nut_buffer_append(lua_State *L) {\n    nut_buffer *dst = l_to_nut_buffer(L, 1);\n    nut_buffer *src = l_to_nut_buffer(L, 2);\n    nut_buffer_append(dst, src);\n    return 0;\n}\n\nstatic int l_nut_buffer_reduce(lua_State *L) {\n    nut_buffer *buffer = l_to_nut_buffer(L, 1);\n    double percentage = luaL_checknumber(L, 2);\n    nut_buffer *result = nut_buffer_reduce(buffer, percentage);\n    return l_push_nut_buffer(L, result);\n}\n\nstatic int l_nut_buffer_clip(lua_State *L) {\n    nut_buffer *buffer = l_to_nut_buffer(L, 1);\n    int offset = luaL_checkinteger(L, 2);\n    int length = luaL_checkinteger(L, 3);\n    nut_buffer *result = nut_buffer_clip(buffer, offset, length);\n    return l_push_nut_buffer(L, result);\n}\n\nstatic int l_nut_buffer_convert(lua_State *L) {\n    nut_buffer *buffer = l_to_nut_buffer(L, 1);\n    int new_type = luaL_checkinteger(L, 2);\n    nut_buffer *result = nut_buffer_convert(buffer, (nut_buffer_type) new_type);\n    return l_push_nut_buffer(L, result);\n}\n\nstatic int l_nut_buffer_save(lua_State *L) {\n    nut_buffer *buffer = l_to_nut_buffer(L, 1);\n    const char *fname = lua_tostring(L, 2);\n    nut_buffer_save(buffer, fname);\n    return 0;\n}\n\nstatic int l_nut_buffer_free(lua_State *L) {\n    nut_buffer *buffer = l_to_nut_buffer(L, 1);\n    nut_buffer_free(buffer);\n    return 0;\n}\n\n// Lua NWM wrappers /////////////////////////////////////////////////////////\n\nstatic int l_nwm_get_time(lua_State *L) {\n    lua_pushnumber(L, nwm_get_time());\n    return 1;\n}\n\n// Lua NGL wrappers /////////////////////////////////////////////////////////\n\nstatic int l_ngl_clear(lua_State *L) {\n    float red = luaL_checknumber(L, 1);\n    float green = luaL_checknumber(L, 2);\n    float blue = luaL_checknumber(L, 3);\n    float alpha = luaL_checknumber(L, 4);\n    ngl_clear(red, green, blue, alpha);\n    return 0;\n}\n\nstatic int l_ngl_clear_depth(lua_State *L) {\n    ngl_clear_depth();\n    return 0;\n}\n\n// ngl_camera\n\nstatic ngl_camera* l_to_ngl_camera(lua_State *L, int index) {\n    return (ngl_camera*) l_from_table(L, \"ngl_camera\", index);\n}\n\nstatic int l_ngl_camera_new(lua_State *L) {\n    ngl_camera *camera = ngl_camera_new();\n    l_to_table(L, \"ngl_camera\", camera);\n    return 1;\n}\n\nstatic int l_ngl_camera_new_look_at(lua_State *L) {\n    float camera_x = luaL_checknumber(L, 1);\n    float camera_y = luaL_checknumber(L, 2);\n    float camera_z = luaL_checknumber(L, 3);\n    ngl_camera *camera = ngl_camera_new_look_at(camera_x, camera_y, camera_z);\n    l_to_table(L, \"ngl_camera\", camera);\n    return 1;\n}\n\nstatic int l_ngl_camera_translate(lua_State *L) {\n    ngl_camera *camera = l_to_ngl_camera(L, 1);\n    float tx = luaL_checknumber(L, 2);\n    float ty = luaL_checknumber(L, 3);\n    float tz = luaL_checknumber(L, 4);\n    ngl_camera_translate(camera, tx, ty, tz);\n    return 0;\n}\n\nstatic int l_ngl_camera_rotate_x(lua_State *L) {\n    ngl_camera *camera = l_to_ngl_camera(L, 1);\n    float deg = luaL_checknumber(L, 2);\n    ngl_camera_rotate_x(camera, deg);\n    return 0;\n}\n\nstatic int l_ngl_camera_rotate_y(lua_State *L) {\n    ngl_camera *camera = l_to_ngl_camera(L, 1);\n    float deg = luaL_checknumber(L, 2);\n    ngl_camera_rotate_y(camera, deg);\n    return 0;\n}\n\nstatic int l_ngl_camera_rotate_z(lua_State *L) {\n    ngl_camera *camera = l_to_ngl_camera(L, 1);\n    float deg = luaL_checknumber(L, 2);\n    ngl_camera_rotate_z(camera, deg);\n    return 0;\n}\n\nstatic int l_ngl_camera_free(lua_State *L) {\n    ngl_camera *camera = l_to_ngl_camera(L, 1);\n    ngl_camera_free(camera);\n    return 0;\n}\n\n// ngl_shader\n\nstatic ngl_shader* l_to_ngl_shader(lua_State *L, int index) {\n    return (ngl_shader*) l_from_table(L, \"ngl_shader\", index);\n}\n\nstatic int l_ngl_shader_new(lua_State *L) {\n    GLenum draw_mode = luaL_checkinteger(L, 1);\n    const char *vertex_shader = lua_tostring(L, 2);\n    const char *fragment_shader = lua_tostring(L, 3);\n\n    ngl_shader *shader = ngl_shader_new(draw_mode, vertex_shader, fragment_shader);\n    l_to_table(L, \"ngl_shader\", shader);\n    return 1;\n}\n\nstatic int l_ngl_shader_new_from_file(lua_State *L) {\n    GLenum draw_mode = luaL_checkinteger(L, 1);\n    const char *vertex_fname = lua_tostring(L, 2);\n    const char *fragment_fname = lua_tostring(L, 3);\n\n    ngl_shader *shader = ngl_shader_new_from_file(draw_mode, vertex_fname, fragment_fname);\n    l_to_table(L, \"ngl_shader\", shader);\n    return 1;\n}\n\nstatic int l_ngl_shader_uniform_set_float(lua_State *L) {\n    ngl_shader *shader = l_to_ngl_shader(L, 1);\n    const char *uniform_name = lua_tostring(L, 2);\n    float value = luaL_checknumber(L, 3);\n    ngl_shader_uniform_set_float(shader, uniform_name, value);\n    return 0;\n}\n\nstatic int l_ngl_shader_free(lua_State *L) {\n    ngl_shader *shader = l_to_ngl_shader(L, 1);\n    ngl_shader_free(shader);\n    return 0;\n}\n\n// ngl_texture\n\nstatic ngl_texture* l_to_ngl_texture(lua_State *L, int index) {\n    return (ngl_texture*) l_from_table(L, \"ngl_texture\", index);\n}\n\nstatic int l_ngl_texture_new(lua_State *L) {\n    ngl_shader *shader = l_to_ngl_shader(L, 1);\n    const char *uniform_name = lua_tostring(L, 2);\n    ngl_texture *texture = ngl_texture_new(shader, uniform_name);\n    l_to_table(L, \"ngl_texture\", texture);\n    return 1;\n}\n\nstatic int l_ngl_texture_new_from_file(lua_State *L) {\n    const char *file_name = lua_tostring(L, 1);\n    ngl_shader *shader = l_to_ngl_shader(L, 2);\n    const char *uniform_name = lua_tostring(L, 3);\n    ngl_texture *texture = ngl_texture_new_from_file(file_name, shader, uniform_name);\n    l_to_table(L, \"ngl_texture\", texture);\n    return 1;\n}\n\nstatic int l_ngl_texture_update(lua_State *L) {\n    ngl_texture *texture = l_to_ngl_texture(L, 1);\n    nut_buffer *buffer = l_to_nut_buffer(L, 2);\n    int width = luaL_checkinteger(L, 3);\n    int height = luaL_checkinteger(L, 4);\n    ngl_texture_update(texture, buffer, width, height);\n    return 0;\n}\n\nstatic int l_ngl_texture_free(lua_State *L) {\n    ngl_texture *texture = l_to_ngl_texture(L, 1);\n    free(texture);\n    return 0;\n}\n\n// ngl_model\n\nstatic ngl_model* l_to_ngl_model(lua_State *L, int index) {\n    return (ngl_model*) l_from_table(L, \"ngl_model\", index);\n}\n\nstatic int l_ngl_model_new(lua_State *L) {\n    int component_count = luaL_checkinteger(L, 1);\n    int point_count = luaL_checkinteger(L, 2);\n    float *positions = NULL;\n    if (!lua_isnoneornil(L, 3)) {\n        luaL_checkany(L, 3);\n        positions = (float *) lua_touserdata(L, 3);\n    }\n    float *normals = NULL;\n    if (!lua_isnoneornil(L, 4)) {\n        luaL_checkany(L, 4);\n        normals = (float *) lua_touserdata(L, 4);\n    }\n    float *uvs = NULL;\n    if (!lua_isnoneornil(L, 5)) {\n        luaL_checkany(L, 5);\n        uvs = (float *) lua_touserdata(L, 5);\n    }\n    ngl_model *model = ngl_model_new(component_count, point_count, positions, normals, uvs);\n    l_to_table(L, \"ngl_model\", model);\n    return  1;\n}\n\nstatic int l_ngl_model_new_with_buffer(lua_State *L) {\n    nut_buffer *buffer = l_to_nut_buffer(L, 1);\n    ngl_model *model = ngl_model_new_with_buffer(buffer);\n    l_to_table(L, \"ngl_model\", model);\n    return  1;\n}\n\nstatic int l_ngl_model_new_grid_points(lua_State *L) {\n    int row_count = luaL_checkinteger(L, 1);\n    int column_count = luaL_checkinteger(L, 2);\n    float row_height = luaL_checknumber(L, 3);\n    float column_width = luaL_checknumber(L, 4);\n    ngl_model *model = ngl_model_new_grid_points(row_count, column_count, row_height, column_width);\n    l_to_table(L, \"ngl_model\", model);\n    return 1;\n}\n\nstatic int l_ngl_model_new_grid_triangles(lua_State *L) {\n    int row_count = luaL_checkinteger(L, 1);\n    int column_count = luaL_checkinteger(L, 2);\n    float row_height = luaL_checknumber(L, 3);\n    float column_width = luaL_checknumber(L, 4);\n    ngl_model *model = ngl_model_new_grid_triangles(row_count, column_count, row_height, column_width);\n    l_to_table(L, \"ngl_model\", model);\n    return 1;\n}\n\nstatic int l_ngl_model_new_with_height_map(lua_State *L) {\n    int row_count = luaL_checkinteger(L, 1);\n    int column_count = luaL_checkinteger(L, 2);\n    float row_height = luaL_checknumber(L, 3);\n    float column_width = luaL_checknumber(L, 4);\n    float height_multiplier = luaL_checknumber(L, 5);\n    int buffer_stride = luaL_checkinteger(L, 6);\n    int buffer_offset = luaL_checkinteger(L, 7);\n    luaL_checkany(L, 8);\n    float *positions = (float *) lua_touserdata(L, 8);\n    ngl_model *model = ngl_model_new_with_height_map(row_count, column_count, row_height, column_width, height_multiplier, buffer_stride, buffer_offset, positions);\n    l_to_table(L, \"ngl_model\", model);\n    return 1;\n}\n\nstatic int l_ngl_model_load_obj(lua_State *L) {\n    const char *fname = lua_tostring(L, 1);\n    ngl_model *model = ngl_model_load_obj(fname);\n    l_to_table(L, \"ngl_model\", model);\n    return 1;\n}\n\nstatic int l_ngl_model_translate(lua_State *L) {\n    ngl_model* model = l_to_ngl_model(L, 1);\n    float tx = luaL_checknumber(L, 2);\n    float ty = luaL_checknumber(L, 3);\n    float tz = luaL_checknumber(L, 4);\n    ngl_model_translate(model, tx, ty, tz);\n    return 0;\n}\n\nstatic int l_ngl_model_free(lua_State *L) {\n    ngl_model *model = l_to_ngl_model(L, 1);\n    ngl_model_free(model);\n    return 0;\n}\n\n// ngl_skybox\n\nstatic ngl_skybox* l_to_ngl_skybox(lua_State *L, int index) {\n    return (ngl_skybox*) l_from_table(L, \"ngl_skybox\", index);\n}\n\nstatic int l_ngl_skybox_new(lua_State *L) {\n    const char *front = lua_tostring(L, 1);\n    const char *back = lua_tostring(L, 2);\n    const char *top = lua_tostring(L, 3);\n    const char *bottom = lua_tostring(L, 4);\n    const char *left = lua_tostring(L, 5);\n    const char *right = lua_tostring(L, 6);\n    ngl_skybox *skybox = ngl_skybox_new(front, back, top, bottom, left, right);\n    l_to_table(L, \"ngl_skybox\", skybox);\n    return 1;\n}\n\nstatic int l_ngl_skybox_draw(lua_State *L) {\n    ngl_skybox *skybox = l_to_ngl_skybox(L, 1);\n    ngl_camera *camera = l_to_ngl_camera(L, 2);\n    ngl_skybox_draw(skybox, camera);\n    return 0;\n}\n\nstatic int l_ngl_skybox_free(lua_State *L) {\n    ngl_skybox *skybox = l_to_ngl_skybox(L, 1);\n    ngl_skybox_free(skybox);\n    return 0;\n}\n\nstatic int l_ngl_draw_model(lua_State *L) {\n    ngl_camera* camera = l_to_ngl_camera(L, 1);\n    ngl_model* model = l_to_ngl_model(L, 2);\n    ngl_shader *shader = l_to_ngl_shader(L, 3);\n    ngl_draw_model(camera, model, shader);\n    return 0;\n}\n\nstatic int l_ngl_capture_model(lua_State *L) {\n    ngl_camera* camera = l_to_ngl_camera(L, 1);\n    ngl_model* model = l_to_ngl_model(L, 2);\n    ngl_shader *shader = l_to_ngl_shader(L, 3);\n    const char *file_name = lua_tostring(L, 4);\n    ngl_capture_model(camera, model, shader, file_name);\n    return 0;\n}\n\nstatic int l_ngl_draw_background(lua_State *L) {\n    ngl_camera* camera = l_to_ngl_camera(L, 1);\n    ngl_model* model = l_to_ngl_model(L, 2);\n    ngl_shader *shader = l_to_ngl_shader(L, 3);\n    ngl_draw_background(camera, model, shader);\n    return 0;\n}\n\n// ngl_font\n\nstatic ngl_font* l_to_ngl_font(lua_State *L, int index) {\n    return (ngl_font*) l_from_table(L, \"ngl_font\", index);\n}\n\nstatic int l_ngl_font_new(lua_State *L) {\n    const char *file_name = lua_tostring(L, 1);\n    int font_size = luaL_checkinteger(L, 2);\n    ngl_font *font = ngl_font_new(file_name, font_size);\n    l_to_table(L, \"ngl_font\", font);\n    return 1;\n}\n\nstatic int l_ngl_font_draw(lua_State *L) {\n    ngl_font *font = l_to_ngl_font(L, 1);\n    const char *text = lua_tostring(L, 2);\n    double x = luaL_checknumber(L, 3);\n    double y = luaL_checknumber(L, 4);\n    double alpha = luaL_checknumber(L, 5);\n    ngl_font_draw(font, text, x, y, alpha);\n    return 0;\n}\n\nstatic int l_ngl_font_free(lua_State *L) {\n    ngl_font *font = l_to_ngl_font(L, 1);\n    ngl_font_free(font);\n    return 0;\n}\n\n// Lua NOSC wrappers ////////////////////////////////////////////////////////\n\n// nosc_server\n\nstatic nosc_server* l_to_nosc_server(lua_State *L, int index) {\n    return (nosc_server*) l_from_table(L, \"nosc_server\", index);\n}\n\nstatic int _l_to_nosc_server_table(lua_State *L, nosc_server* server) {\n    l_to_table(L, \"nosc_server\", server);\n\n    lua_pushliteral(L, \"port\");\n    lua_pushinteger(L, server->port);\n    lua_settable(L, -3);\n\n    return 1;\n}\n\ntypedef struct {\n    lua_State *L;\n    int handle_message_fn;\n} l_nosc_message_ctx;\n\nstatic void l_nosc_handle_message(nosc_server *server, nosc_message *message, void *ctx) {\n    l_nosc_message_ctx *message_ctx = (l_nosc_message_ctx *) ctx;\n    lua_State *L = message_ctx->L;\n\n    // Get the Lua function\n    lua_rawgeti(L, LUA_REGISTRYINDEX, message_ctx->handle_message_fn);\n\n    // Add the message path\n    lua_pushstring(L, message->path);\n\n    // Add the arguments\n    lua_newtable(L);\n\n    for (int i = 0; i < message->arg_count; i++) {\n        // Push argument index\n        lua_pushinteger(L, i + 1);\n\n        // Push argument value\n        char type = message->types[i];\n        if (type == 'i') {\n            int v = nosc_message_get_int(message, i);\n            lua_pushinteger(L, v);\n        } else if (type == 'f') {\n            float v = nosc_message_get_float(message, i);\n            lua_pushnumber(L, v);\n        } else if (type == 's') {\n            const char *v = nosc_message_get_string(message, i);\n            lua_pushstring(L, v);\n        } else {\n            fprintf(stderr, \"Warning: unknown OSC arg type %c\\n\", type);\n            lua_pushnil(L);\n        }\n        lua_settable(L, -3);\n    }\n\n    int error = lua_pcall(L, 2, 0, 0);\n    if (error) {\n        fprintf(stderr, \"Error calling OSC message handler: %s\\n\", lua_tostring(L, -1));\n        lua_pop(L, 1);\n    }\n}\n\nstatic int l_nosc_server_new(lua_State *L) {\n    int port = luaL_checkinteger(L, 1);\n    // Pop the port off the stack so the next element is the function.\n    //lua_pop(L, 1);\n    if (!lua_isfunction(L, -1)) {\n        fprintf(stderr, \"osc_server_new: argument 2 is not a function:\\n\");\n        exit(1);\n    }\n    int callback_function = luaL_ref(L, LUA_REGISTRYINDEX);\n    l_nosc_message_ctx *message_ctx = (l_nosc_message_ctx *) calloc(1, sizeof(l_nosc_message_ctx));\n    message_ctx->L = L;\n    message_ctx->handle_message_fn = callback_function;\n    nosc_server *server = nosc_server_new(port, l_nosc_handle_message, message_ctx);\n    return _l_to_nosc_server_table(L, server);\n}\n\nstatic int l_nosc_server_update(lua_State *L) {\n    nosc_server* server = l_to_nosc_server(L, 1);\n    nosc_server_update(server);\n    return 0;\n}\n\nstatic int l_nosc_server_free(lua_State *L) {\n    nosc_server* server = l_to_nosc_server(L, 1);\n    free(server->handle_message_ctx);\n    nosc_server_free(server);\n    return 0;\n}\n\n// Lua NRF wrappers /////////////////////////////////////////////////////////\n\n// nrf_block\n\nstatic nrf_block* l_to_nrf_block(lua_State *L, int index) {\n    // Since this is a base type, we can't use l_from_table.\n    luaL_checktype(L, index, LUA_TTABLE);\n    lua_pushliteral(L, \"__ptr__\");\n    lua_gettable(L, index);\n    nrf_block *block = (nrf_block*) lua_touserdata(L, -1);\n    assert(block->type == NRF_BLOCK_SOURCE || block->type == NRF_BLOCK_GENERIC || block->type == NRF_BLOCK_SINK);\n    return block;\n}\n\nstatic int l_nrf_block_connect(lua_State *L) {\n    nrf_block* input = l_to_nrf_block(L, 1);\n    nrf_block* output = l_to_nrf_block(L, 2);\n    nrf_block_connect(input, output);\n    return 0;\n}\n\n// nrf_device\n\nstatic nrf_device* l_to_nrf_device(lua_State *L, int index) {\n    return (nrf_device*) l_from_table(L, \"nrf_device\", index);\n}\n\nstatic int _l_to_nrf_device_table(lua_State *L, nrf_device* device) {\n    l_to_table(L, \"nrf_device\", device);\n\n    lua_pushliteral(L, \"sample_rate\");\n    lua_pushinteger(L, device->sample_rate);\n    lua_settable(L, -3);\n\n    return 1;\n}\n\nstatic int l_nrf_device_new(lua_State *L) {\n    double freq_mhz = luaL_checknumber(L, 1);\n    const char *file_name = lua_tostring(L, 2);\n    nrf_device *device = nrf_device_new(freq_mhz, file_name);\n    return _l_to_nrf_device_table(L, device);\n}\n\nstatic int l_nrf_device_new_with_config(lua_State *L) {\n    nrf_device_config config;\n    memset(&config, 0, sizeof(nrf_device_config));\n    if (lua_istable(L, 1)) {\n        config.sample_rate = l_table_integer(L, 1, \"sample_rate\", 0);\n        config.freq_mhz = l_table_double(L, 1, \"freq_mhz\", 0);\n        config.data_file = l_table_string(L, 1, \"data_file\", NULL);\n    }\n    nrf_device *device = nrf_device_new_with_config(config);\n    return _l_to_nrf_device_table(L, device);\n}\n\nstatic int l_nrf_device_free(lua_State *L) {\n    nrf_device* device = l_to_nrf_device(L, 1);\n    nrf_device_free(device);\n    return 0;\n}\n\nstatic int l_nrf_device_set_frequency(lua_State *L) {\n    nrf_device* device = l_to_nrf_device(L, 1);\n    double freq_mhz = luaL_checknumber(L, 2);\n    freq_mhz = nrf_device_set_frequency(device, freq_mhz);\n    lua_pushnumber(L, freq_mhz);\n    return 1;\n}\n\nstatic int l_nrf_device_set_paused(lua_State *L) {\n    nrf_device* device = l_to_nrf_device(L, 1);\n    if (lua_isboolean(L, 2)) {\n        int paused = lua_toboolean(L, 2);\n        nrf_device_set_paused(device, paused);\n    } else {\n        fprintf(stderr, \"nrf_device_set_paused expects boolean as second argument.\\n\");\n    }\n    return 0;\n}\n\nstatic int l_nrf_device_step(lua_State *L) {\n    nrf_device* device = l_to_nrf_device(L, 1);\n    nrf_device_step(device);\n    return 0;\n}\n\nstatic int l_nrf_device_get_samples_buffer(lua_State *L) {\n    nrf_device* device = l_to_nrf_device(L, 1);\n    nut_buffer* buffer = nrf_device_get_samples_buffer(device);\n    return l_push_nut_buffer(L, buffer);\n}\n\nstatic int l_nrf_device_get_iq_buffer(lua_State *L) {\n    nrf_device* device = l_to_nrf_device(L, 1);\n    nut_buffer* buffer = nrf_device_get_iq_buffer(device);\n    return l_push_nut_buffer(L, buffer);\n}\n\nstatic int l_nrf_device_get_iq_lines(lua_State *L) {\n    nrf_device* device = l_to_nrf_device(L, 1);\n    int size_multiplier = luaL_checkinteger(L, 2);\n    float line_percentage = luaL_checknumber(L, 3);\n    nut_buffer* buffer = nrf_device_get_iq_lines(device, size_multiplier, line_percentage);\n    return l_push_nut_buffer(L, buffer);\n}\n\n// nrf_interpolator\n\nstatic nrf_interpolator* l_to_nrf_interpolator(lua_State *L, int index) {\n    return (nrf_interpolator*) l_from_table(L, \"nrf_interpolator\", index);\n}\n\nstatic int l_nrf_interpolator_new(lua_State *L) {\n    double interpolate_step = luaL_checknumber(L, 1);\n    nrf_interpolator* interpolator = nrf_interpolator_new(interpolate_step);\n    l_to_table(L, \"nrf_interpolator\", interpolator);\n    return 1;\n}\n\nstatic int l_nrf_interpolator_process(lua_State *L) {\n    nrf_interpolator* interpolator = l_to_nrf_interpolator(L, 1);\n    nut_buffer* buffer = l_to_nut_buffer(L, 2);\n    nrf_interpolator_process(interpolator, buffer);\n    return 0;\n}\n\nstatic int l_nrf_interpolator_get_buffer(lua_State *L) {\n    nrf_interpolator* interpolator = l_to_nrf_interpolator(L, 1);\n    nut_buffer* buffer = nrf_interpolator_get_buffer(interpolator);\n    return l_push_nut_buffer(L, buffer);\n}\n\nstatic int l_nrf_interpolator_free(lua_State *L) {\n    nrf_interpolator* interpolator = l_to_nrf_interpolator(L, 1);\n    nrf_interpolator_free(interpolator);\n    return 0;\n}\n\n// iq drawing\n\nstatic int l_nrf_buffer_add_position_channel(lua_State *L) {\n    nut_buffer *buffer = l_to_nut_buffer(L, 1);\n    nut_buffer *result = nrf_buffer_add_position_channel(buffer);\n    return l_push_nut_buffer(L, result);\n}\n\nstatic int l_nrf_buffer_to_iq_points(lua_State *L) {\n    nut_buffer *buffer = l_to_nut_buffer(L, 1);\n    nut_buffer *img = nrf_buffer_to_iq_points(buffer);\n    return l_push_nut_buffer(L, img);\n}\n\nstatic int l_nrf_buffer_to_iq_lines(lua_State *L) {\n    nut_buffer *buffer = l_to_nut_buffer(L, 1);\n    int size_multiplier = luaL_checkinteger(L, 2);\n    float line_percentage = luaL_checknumber(L, 3);\n    nut_buffer *img = nrf_buffer_to_iq_lines(buffer, size_multiplier, line_percentage);\n    return l_push_nut_buffer(L, img);\n}\n\n// nrf_fft\n\nstatic nrf_fft* l_to_nrf_fft(lua_State *L, int index) {\n    return (nrf_fft*) l_from_table(L, \"nrf_fft\", index);\n}\n\nstatic int l_nrf_fft_new(lua_State *L) {\n    int fft_size = luaL_checkinteger(L, 1);\n    int fft_history_size = luaL_checkinteger(L, 2);\n    nrf_fft* fft = nrf_fft_new(fft_size, fft_history_size);\n    l_to_table(L, \"nrf_fft\", fft);\n    return 1;\n}\n\nstatic int l_nrf_fft_shift(lua_State *L) {\n    nrf_fft* fft = l_to_nrf_fft(L, 1);\n    float d = luaL_checknumber(L, 2);\n    nrf_fft_shift(fft, d);\n    return 0;\n}\n\nstatic int l_nrf_fft_process(lua_State *L) {\n    nrf_fft* fft = l_to_nrf_fft(L, 1);\n    nut_buffer* buffer = l_to_nut_buffer(L, 2);\n    nrf_fft_process(fft, buffer);\n    return 0;\n}\n\nstatic int l_nrf_fft_get_buffer(lua_State *L) {\n    nrf_fft* fft = l_to_nrf_fft(L, 1);\n    nut_buffer* buffer = nrf_fft_get_buffer(fft);\n    return l_push_nut_buffer(L, buffer);\n}\n\nstatic int l_nrf_fft_free(lua_State *L) {\n    nrf_fft* fft = l_to_nrf_fft(L, 1);\n    nrf_fft_free(fft);\n    return 0;\n}\n\n// nrf_iq_filter\n\nstatic nrf_iq_filter* l_to_nrf_iq_filter(lua_State *L, int index) {\n    return (nrf_iq_filter*) l_from_table(L, \"nrf_iq_filter\", index);\n}\n\nstatic int l_nrf_iq_filter_new(lua_State *L) {\n    int sample_rate = luaL_checkinteger(L, 1);\n    int filter_freq = luaL_checkinteger(L, 2);\n    int kernel_length = luaL_checkinteger(L, 3);\n    nrf_iq_filter *filter = nrf_iq_filter_new(sample_rate, filter_freq, kernel_length);\n    l_to_table(L, \"nrf_iq_filter\", filter);\n    return 1;\n}\n\nstatic int l_nrf_iq_filter_process(lua_State *L) {\n    nrf_iq_filter *filter = l_to_nrf_iq_filter(L, 1);\n    nut_buffer *buffer = l_to_nut_buffer(L, 2);\n    nrf_iq_filter_process(filter, buffer);\n    return 0;\n}\n\nstatic int l_nrf_iq_filter_get_buffer(lua_State *L) {\n    nrf_iq_filter* filter = l_to_nrf_iq_filter(L, 1);\n    nut_buffer* buffer = nrf_iq_filter_get_buffer(filter);\n    return l_push_nut_buffer(L, buffer);\n}\n\nstatic int l_nrf_iq_filter_free(lua_State *L) {\n    nrf_iq_filter* filter = l_to_nrf_iq_filter(L, 1);\n    nrf_iq_filter_free(filter);\n    return 0;\n}\n\n// nrf_freq_shifter\n\nstatic nrf_freq_shifter* l_to_nrf_freq_shifter(lua_State *L, int index) {\n    return (nrf_freq_shifter*) l_from_table(L, \"nrf_freq_shifter\", index);\n}\n\nstatic int l_nrf_freq_shifter_new(lua_State *L) {\n    int freq_offset = luaL_checkinteger(L, 1);\n    int sample_rate = luaL_checkinteger(L, 2);\n    nrf_freq_shifter *shifter = nrf_freq_shifter_new(freq_offset, sample_rate);\n    l_to_table(L, \"nrf_freq_shifter\", shifter);\n    return 1;\n}\n\nstatic int l_nrf_freq_shifter_process(lua_State *L) {\n    nrf_freq_shifter* shifter = l_to_nrf_freq_shifter(L, 1);\n    nut_buffer *buffer = l_to_nut_buffer(L, 2);\n    nrf_freq_shifter_process(shifter, buffer);\n    return 0;\n}\n\nstatic int l_nrf_freq_shifter_get_buffer(lua_State *L) {\n    nrf_freq_shifter* shifter = l_to_nrf_freq_shifter(L, 1);\n    nut_buffer* buffer = nrf_freq_shifter_get_buffer(shifter);\n    return l_push_nut_buffer(L, buffer);\n}\n\nstatic int l_nrf_freq_shifter_free(lua_State *L) {\n    nrf_freq_shifter* shifter = l_to_nrf_freq_shifter(L, 1);\n    nrf_freq_shifter_free(shifter);\n    return 0;\n}\n\n// nrf_signal_detector\n\nstatic nrf_signal_detector* l_to_nrf_signal_detector(lua_State *L, int index) {\n    return (nrf_signal_detector*) l_from_table(L, \"nrf_signal_detector\", index);\n}\n\nstatic int l_nrf_signal_detector_new(lua_State *L) {\n    nrf_signal_detector* detector = nrf_signal_detector_new();\n    l_to_table(L, \"nrf_signal_detector\", detector);\n    return 1;\n}\n\nstatic int l_nrf_signal_detector_process(lua_State *L) {\n    nrf_signal_detector* detector = l_to_nrf_signal_detector(L, 1);\n    nut_buffer* buffer = l_to_nut_buffer(L, 2);\n    nrf_signal_detector_process(detector, buffer);\n    return 0;\n}\n\nstatic int l_nrf_signal_detector_get_mean(lua_State *L) {\n    nrf_signal_detector* detector = l_to_nrf_signal_detector(L, 1);\n    lua_pushnumber(L, detector->mean);\n    return 1;\n}\n\nstatic int l_nrf_signal_detector_get_standard_deviation(lua_State *L) {\n    nrf_signal_detector* detector = l_to_nrf_signal_detector(L, 1);\n    lua_pushnumber(L, detector->standard_deviation);\n    return 1;\n}\n\nstatic int l_nrf_signal_detector_free(lua_State *L) {\n    nrf_signal_detector* signal_detector = l_to_nrf_signal_detector(L, 1);\n    nrf_signal_detector_free(signal_detector);\n    return 0;\n}\n\n// nrf_player\n\nstatic nrf_player* l_to_nrf_player(lua_State *L, int index) {\n    return (nrf_player*) l_from_table(L, \"nrf_player\", index);\n}\n\nstatic int l_nrf_player_new(lua_State *L) {\n    nrf_device* device = l_to_nrf_device(L, 1);\n    nrf_demodulate_type type = (nrf_demodulate_type) luaL_checkinteger(L, 2);\n    int freq_offset = luaL_checkinteger(L, 3);\n    nrf_player *player = nrf_player_new(device, type, freq_offset);\n    l_to_table(L, \"nrf_player\", player);\n    return 1;\n}\n\nstatic int l_nrf_player_set_freq_offset(lua_State *L) {\n    nrf_player* player = l_to_nrf_player(L, 1);\n    int freq_offset = luaL_checkinteger(L, 2);\n    nrf_player_set_freq_offset(player, freq_offset);\n    return 0;\n}\n\nstatic int l_nrf_player_set_gain(lua_State *L) {\n    nrf_player* player = l_to_nrf_player(L, 1);\n    float gain = luaL_checknumber(L, 2);\n    nrf_player_set_gain(player, gain);\n    return 0;\n}\n\nstatic int l_nrf_player_free(lua_State *L) {\n    nrf_player* player = l_to_nrf_player(L, 1);\n    nrf_player_free(player);\n    return 0;\n}\n\n// Main /////////////////////////////////////////////////////////////////////\n\nint use_vr = 0;\n#ifdef WITH_NVR\nnvr_device *device = NULL;\n#endif\n\nvoid usage() {\n    printf(\"Usage: frequensea [--vr] FILE.lua\\n\");\n    printf(\"Options:\\n\");\n    printf(\"    --vr    Render to Oculus VR\\n\");\n}\n\nint str_ends_with(const char *s, const char *suffix) {\n    if (!s || !suffix) {\n        return 0;\n    }\n    size_t s_length = strlen(s);\n    size_t suffix_length = strlen(suffix);\n    if (suffix_length >  s_length) {\n        return 0;\n    }\n    return strncmp(s + s_length - suffix_length, suffix, suffix_length) == 0;\n}\n\nstatic void draw(lua_State *L) {\n    int error = l_call_function(L, \"draw\");\n    if (error) {\n        exit(EXIT_FAILURE);\n    }\n}\n\ntypedef struct {\n    pthread_t thread;\n    int width;\n    int height;\n    double freq;\n    uint8_t *buffer;\n    char *fname;\n} screenshot_info;\n\nstatic void _take_screenshot(screenshot_info *info) {\n    const char *real_fname;\n    if (info->fname == NULL) {\n        time_t t;\n        time(&t);\n        struct tm* tm_info = localtime(&t);\n        char s_time[20];\n        strftime(s_time, 20, \"%Y-%m-%d_%H.%M.%S\", tm_info);\n        char time_fname[100];\n        if (info->freq > 0) {\n            snprintf(time_fname, 100, \"screenshot-%s-%.4f.png\", s_time, info->freq);\n        } else {\n            snprintf(time_fname, 100, \"screenshot-%s.png\", s_time);\n        }\n\n\n        real_fname = time_fname;\n    } else {\n        real_fname = info->fname;\n    }\n    nim_png_write(real_fname, info->width, info->height, NIM_RGB, info->buffer);\n    free(info->fname);\n    free(info->buffer);\n    free(info);\n}\n\nstatic void take_screenshot(nwm_window *window, const char *fname) {\n    screenshot_info *info = (screenshot_info *) calloc(1, sizeof(screenshot_info));\n    if (fname != NULL) {\n        info->fname = (char *) calloc(strlen(fname), sizeof(char));\n        strcpy(info->fname, fname);\n    }\n\n    // Capture the OpenGL framebuffer. Do this in the current thread.\n    glfwGetFramebufferSize(window, &info->width, &info->height);\n    int buffer_channels = 3;\n    int buffer_size = info->width * info->height * buffer_channels;\n    info->buffer = (uint8_t *) calloc(buffer_size, sizeof(uint8_t));\n    glReadPixels(0, 0, info->width, info->height, GL_RGB, GL_UNSIGNED_BYTE, info->buffer);\n\n    // If there is a current frequency, retrieve it.\n    lua_State *L = (lua_State *) nwm_window_get_user_data(window);\n    if (L) {\n        lua_getglobal(L, \"freq\");\n        if (lua_isnumber(L, -1)) {\n            info->freq = lua_tonumber(L, -1);\n        }\n    }\n\n    // Create a new thread to save the screenshot.\n    pthread_create(&info->thread, NULL, (void *(*)(void *))_take_screenshot, info);\n}\n\n#ifdef WITH_NVR\nstatic void draw_eye(nvr_device *device, nvr_eye *eye, lua_State *L) {\n    ngl_camera *camera = nvr_device_eye_to_camera(device, eye);\n    l_to_table(L, \"ngl_camera\", camera);\n    lua_setglobal(L, \"camera\");\n    draw(L);\n}\n#endif\n\nstatic void on_key(nwm_window* window, int key, int scancode, int action, int mods) {\n    if (action == GLFW_PRESS || action == GLFW_REPEAT) {\n        if (key == GLFW_KEY_ESCAPE) {\n            glfwSetWindowShouldClose(window, GL_TRUE);\n        } else if (key == GLFW_KEY_EQUAL) {\n            take_screenshot(window, NULL);\n        }\n        if (use_vr) {\n#ifdef WITH_NVR\n            static ovrHSWDisplayState hswDisplayState;\n            ovrHmd_GetHSWDisplayState(device->hmd, &hswDisplayState);\n            if (hswDisplayState.Displayed) {\n                ovrHmd_DismissHSWDisplay(device->hmd);\n                return;\n            }\n#endif\n        }\n        lua_State *L = (lua_State *) nwm_window_get_user_data(window);\n        if (L) {\n            lua_getglobal(L, \"on_key\");\n            if (lua_isfunction(L, -1)) {\n                lua_pushinteger(L, key);\n                lua_pushinteger(L, mods);\n                int error = lua_pcall(L, 2, 0, 0);\n                if (error) {\n                    fprintf(stderr, \"Error calling on_key(): %s\\n\", lua_tostring(L, -1));\n                    lua_pop(L, 1);\n                }\n            } else {\n                lua_pop(L, 1);\n            }\n        }\n    }\n}\n\n// Initializes Lua\nstatic lua_State *l_init() {\n    lua_State *L = luaL_newstate();\n    luaL_openlibs(L);\n\n    l_register_type(L, \"nut_buffer\", l_nut_buffer_free);\n    l_register_type(L, \"ngl_camera\", l_ngl_camera_free);\n    l_register_type(L, \"ngl_model\", l_ngl_model_free);\n    l_register_type(L, \"ngl_shader\", l_ngl_shader_free);\n    l_register_type(L, \"ngl_texture\", l_ngl_texture_free);\n    l_register_type(L, \"ngl_skybox\", l_ngl_skybox_free);\n    l_register_type(L, \"ngl_font\", l_ngl_font_free);\n    l_register_type(L, \"nosc_server\", l_nosc_server_free);\n    l_register_type(L, \"nrf_device\", l_nrf_device_free);\n    l_register_type(L, \"nrf_interpolator\", l_nrf_interpolator_free);\n    l_register_type(L, \"nrf_fft\", l_nrf_fft_free);\n    l_register_type(L, \"nrf_iq_filter\", l_nrf_iq_filter_free);\n    l_register_type(L, \"nrf_freq_shifter\", l_nrf_freq_shifter_free);\n    l_register_type(L, \"nrf_signal_detector\", l_nrf_signal_detector_free);\n    l_register_type(L, \"nrf_player\", l_nrf_player_free);\n\n    l_register_function(L, \"nut_buffer_append\", l_nut_buffer_append);\n    l_register_function(L, \"nut_buffer_reduce\", l_nut_buffer_reduce);\n    l_register_function(L, \"nut_buffer_clip\", l_nut_buffer_clip);\n    l_register_function(L, \"nut_buffer_convert\", l_nut_buffer_convert);\n    l_register_function(L, \"nut_buffer_save\", l_nut_buffer_save);\n    l_register_function(L, \"nwm_get_time\", l_nwm_get_time);\n    l_register_function(L, \"ngl_clear\", l_ngl_clear);\n    l_register_function(L, \"ngl_clear_depth\", l_ngl_clear_depth);\n    l_register_function(L, \"ngl_camera_new\", l_ngl_camera_new);\n    l_register_function(L, \"ngl_camera_new_look_at\", l_ngl_camera_new_look_at);\n    l_register_function(L, \"ngl_camera_translate\", l_ngl_camera_translate);\n    l_register_function(L, \"ngl_camera_rotate_x\", l_ngl_camera_rotate_x);\n    l_register_function(L, \"ngl_camera_rotate_y\", l_ngl_camera_rotate_y);\n    l_register_function(L, \"ngl_camera_rotate_z\", l_ngl_camera_rotate_z);\n    l_register_function(L, \"ngl_shader_new\", l_ngl_shader_new);\n    l_register_function(L, \"ngl_shader_new_from_file\", l_ngl_shader_new_from_file);\n    l_register_function(L, \"ngl_shader_uniform_set_float\", l_ngl_shader_uniform_set_float);\n    l_register_function(L, \"ngl_texture_new\", l_ngl_texture_new);\n    l_register_function(L, \"ngl_texture_new_from_file\", l_ngl_texture_new_from_file);\n    l_register_function(L, \"ngl_texture_update\", l_ngl_texture_update);\n    l_register_function(L, \"ngl_model_new\", l_ngl_model_new);\n    l_register_function(L, \"ngl_model_new_with_buffer\", l_ngl_model_new_with_buffer);\n    l_register_function(L, \"ngl_model_new_grid_points\", l_ngl_model_new_grid_points);\n    l_register_function(L, \"ngl_model_new_grid_triangles\", l_ngl_model_new_grid_triangles);\n    l_register_function(L, \"ngl_model_new_with_height_map\", l_ngl_model_new_with_height_map);\n    l_register_function(L, \"ngl_model_load_obj\", l_ngl_model_load_obj);\n    l_register_function(L, \"ngl_model_translate\", l_ngl_model_translate);\n    l_register_function(L, \"ngl_skybox_new\", l_ngl_skybox_new);\n    l_register_function(L, \"ngl_skybox_draw\", l_ngl_skybox_draw);\n    l_register_function(L, \"ngl_draw_model\", l_ngl_draw_model);\n    l_register_function(L, \"ngl_capture_model\", l_ngl_capture_model);\n    l_register_function(L, \"ngl_draw_background\", l_ngl_draw_background);\n    l_register_function(L, \"ngl_font_new\", l_ngl_font_new);\n    l_register_function(L, \"ngl_font_draw\", l_ngl_font_draw);\n    l_register_function(L, \"nosc_server_new\", l_nosc_server_new);\n    l_register_function(L, \"nosc_server_update\", l_nosc_server_update);\n    l_register_function(L, \"nrf_block_connect\", l_nrf_block_connect);\n    l_register_function(L, \"nrf_device_new\", l_nrf_device_new);\n    l_register_function(L, \"nrf_device_new_with_config\", l_nrf_device_new_with_config);\n    l_register_function(L, \"nrf_device_set_frequency\", l_nrf_device_set_frequency);\n    l_register_function(L, \"nrf_device_set_paused\", l_nrf_device_set_paused);\n    l_register_function(L, \"nrf_device_step\", l_nrf_device_step);\n    l_register_function(L, \"nrf_device_get_samples_buffer\", l_nrf_device_get_samples_buffer);\n    l_register_function(L, \"nrf_device_get_iq_buffer\", l_nrf_device_get_iq_buffer);\n    l_register_function(L, \"nrf_device_get_iq_lines\", l_nrf_device_get_iq_lines);\n    l_register_function(L, \"nrf_interpolator_new\", l_nrf_interpolator_new);\n    l_register_function(L, \"nrf_interpolator_process\", l_nrf_interpolator_process);\n    l_register_function(L, \"nrf_interpolator_get_buffer\", l_nrf_interpolator_get_buffer);\n    l_register_function(L, \"nrf_buffer_add_position_channel\", l_nrf_buffer_add_position_channel);\n    l_register_function(L, \"nrf_buffer_to_iq_points\", l_nrf_buffer_to_iq_points);\n    l_register_function(L, \"nrf_buffer_to_iq_lines\", l_nrf_buffer_to_iq_lines);\n    l_register_function(L, \"nrf_fft_new\", l_nrf_fft_new);\n    l_register_function(L, \"nrf_fft_shift\", l_nrf_fft_shift);\n    l_register_function(L, \"nrf_fft_process\", l_nrf_fft_process);\n    l_register_function(L, \"nrf_fft_get_buffer\", l_nrf_fft_get_buffer);\n    l_register_function(L, \"nrf_iq_filter_new\", l_nrf_iq_filter_new);\n    l_register_function(L, \"nrf_iq_filter_process\", l_nrf_iq_filter_process);\n    l_register_function(L, \"nrf_iq_filter_get_buffer\", l_nrf_iq_filter_get_buffer);\n    l_register_function(L, \"nrf_iq_filter_new\", l_nrf_iq_filter_new);\n    l_register_function(L, \"nrf_freq_shifter_new\", l_nrf_freq_shifter_new);\n    l_register_function(L, \"nrf_freq_shifter_process\", l_nrf_freq_shifter_process);\n    l_register_function(L, \"nrf_freq_shifter_get_buffer\", l_nrf_freq_shifter_get_buffer);\n    l_register_function(L, \"nrf_signal_detector_new\", l_nrf_signal_detector_new);\n    l_register_function(L, \"nrf_signal_detector_process\", l_nrf_signal_detector_process);\n    l_register_function(L, \"nrf_signal_detector_get_mean\", l_nrf_signal_detector_get_mean);\n    l_register_function(L, \"nrf_signal_detector_get_standard_deviation\", l_nrf_signal_detector_get_standard_deviation);\n    l_register_function(L, \"nrf_player_new\", l_nrf_player_new);\n    l_register_function(L, \"nrf_player_set_freq_offset\", l_nrf_player_set_freq_offset);\n    l_register_function(L, \"nrf_player_set_gain\", l_nrf_player_set_gain);\n\n    l_register_constant(L, \"NUT_BUFFER_U8\", NUT_BUFFER_U8);\n    l_register_constant(L, \"NUT_BUFFER_F64\", NUT_BUFFER_F64);\n    l_register_constant(L, \"NWM_PLATFORM\", NWM_PLATFORM);\n    l_register_constant(L, \"NWM_OPENGL_TYPE\", NWM_OPENGL_TYPE);\n    l_register_constant(L, \"NWM_WIN32\", NWM_WIN32);\n    l_register_constant(L, \"NWM_OSX\", NWM_OSX);\n    l_register_constant(L, \"NWM_LINUX\", NWM_LINUX);\n    l_register_constant(L, \"NWM_OPENGL\", NWM_OPENGL);\n    l_register_constant(L, \"NWM_OPENGL_ES\", NWM_OPENGL_ES);\n    l_register_constant(L, \"NRF_SAMPLES_LENGTH\", NRF_SAMPLES_LENGTH);\n    l_register_constant(L, \"NRF_DEMODULATE_RAW\", NRF_DEMODULATE_RAW);\n    l_register_constant(L, \"NRF_DEMODULATE_WBFM\", NRF_DEMODULATE_WBFM);\n    l_register_constant(L, \"GL_POINTS\", GL_POINTS);\n    l_register_constant(L, \"GL_LINE_STRIP\", GL_LINE_STRIP);\n    l_register_constant(L, \"GL_LINE_LOOP\", GL_LINE_LOOP);\n    l_register_constant(L, \"GL_LINES\", GL_LINES);\n    l_register_constant(L, \"GL_TRIANGLE_STRIP\", GL_TRIANGLE_STRIP);\n    l_register_constant(L, \"GL_TRIANGLE_FAN\", GL_TRIANGLE_FAN);\n    l_register_constant(L, \"GL_TRIANGLES\", GL_TRIANGLES);\n\n    int error = luaL_loadfile(L, \"../lua/_keys.lua\") || lua_pcall(L, 0, 0, 0);\n    if (error) {\n        fprintf(stderr, \"%s\\n\", lua_tostring(L, -1));\n        lua_pop(L, 1);\n    }\n\n    return L;\n}\n\nint main(int argc, char **argv) {\n    int frame = 1;\n    int capture = 0;\n    char *fname = NULL;\n    int window_width = 800;\n    int window_height = 600;\n\n    for (int i = 0; i < argc; i++) {\n        if (strcmp(argv[i], \"--help\") == 0 || strcmp(argv[i], \"-h\") == 0) {\n            usage();\n            exit(0);\n        } else if (strcmp(argv[i], \"--vr\") == 0) {\n            use_vr = 1;\n            window_width = 1920;\n            window_height = 1080;\n        } else if (strcmp(argv[i], \"--capture\") == 0) {\n            capture = 1;\n        } else if (strcmp(argv[i], \"--width\") == 0) {\n            window_width = atoi(argv[i + 1]);\n        } else if (strcmp(argv[i], \"--height\") == 0) {\n            window_height = atoi(argv[i + 1]);\n        } else if (str_ends_with(argv[i], \".lua\")) {\n            fname = argv[i];\n        }\n    }\n\n    if (fname == NULL) {\n        usage();\n        exit(0);\n    }\n\n    int error;\n\n    lua_State *L = l_init();\n\n    long old_mtime = nfile_mtime(fname);\n    long frames_to_check = 10;\n\n    error = luaL_loadfile(L, fname) || lua_pcall(L, 0, 0, 0);\n    if (error) {\n        fprintf(stderr, \"%s\\n\", lua_tostring(L, -1));\n        lua_pop(L, 1);\n    }\n\n    nwm_init();\n    nwm_window *window = NULL;\n    if (use_vr) {\n#ifdef WITH_NVR\n        device = nvr_device_init();\n        window = nvr_device_window_init(device);\n        nvr_device_init_eyes(device);\n#endif\n    } else {\n        window = nwm_window_init(0, 0, window_width, window_height);\n    }\n    assert(window);\n    nwm_window_set_user_data(window, L);\n    nwm_window_set_key_callback(window, on_key);\n\n    error = l_call_function(L, \"setup\");\n    if (error) {\n        exit(EXIT_FAILURE);\n    }\n\n    while (!nwm_window_should_close(window)) {\n        frames_to_check--;\n        if (frames_to_check <= 0) {\n            long new_mtime = nfile_mtime(fname);\n            if (old_mtime != new_mtime) {\n                fprintf(stderr, \"Reloading (%lu)\\n\", new_mtime);\n                // Close the Lua context. This triggers garbage collection on all objects.\n                lua_close(L);\n\n                // Re-initialize Lua.\n                L = l_init();\n                nwm_window_set_user_data(window, L);\n\n                // Load the file again\n                error = luaL_loadfile(L, fname) || lua_pcall(L, 0, 0, 0);\n                if (error) {\n                    fprintf(stderr, \"%s\\n\", lua_tostring(L, -1));\n                    lua_pop(L, 1);\n                }\n                // Call setup\n                error = l_call_function(L, \"setup\");\n                if (error) {\n                    exit(EXIT_FAILURE);\n                }\n                old_mtime = new_mtime;\n            }\n            frames_to_check = 10;\n        }\n        if (use_vr) {\n#ifdef WITH_NVR\n            nvr_device_draw(device, (nvr_render_cb_fn)draw_eye, L);\n#endif\n        } else {\n            draw(L);\n            nwm_window_swap_buffers(window);\n            if (capture) {\n                char fname[200];\n                snprintf(fname, 200, \"out-%04d.png\", frame);\n                take_screenshot(window, fname);\n            }\n        }\n        nwm_poll_events();\n        lua_gc(L, LUA_GCCOLLECT, 0);\n        frame++;\n    }\n\n    if (use_vr) {\n#ifdef WITH_NVR\n        nvr_device_destroy(device);\n#endif\n    }\n    nwm_window_destroy(window);\n    nwm_terminate();\n\n    lua_close(L);\n}\n"
  },
  {
    "path": "src/nfile.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <sys/stat.h>\n#include <time.h>\n\n#include \"nfile.h\"\n\nchar *nfile_read(const char* fname) {\n    FILE *fp = fopen(fname, \"rb\");\n    if (!fp) {\n        perror(fname);\n        exit(EXIT_FAILURE);\n    }\n\n    fseek(fp, 0L, SEEK_END);\n    long size = ftell(fp);\n    rewind(fp);\n\n    // Allocate memory for entire content\n    char *buffer = calloc(1, size + 1);\n    if (!buffer) {\n        fclose(fp);\n        fputs(\"ERR: nfile_read: failed to allocate memory.\", stderr);\n        exit(EXIT_FAILURE);\n    }\n\n    // Copy the file into the buffer\n    if (fread(buffer, size, 1, fp) != 1) {\n        fclose(fp);\n        free(buffer);\n        fputs(\"ERR: nfile_read: failed to read file.\", stderr);\n        exit(EXIT_FAILURE);\n    }\n\n    fclose(fp);\n    return buffer;\n}\n\nlong nfile_mtime(const char* fname) {\n    struct stat buf;\n    if (stat(fname, &buf) != -1) {\n        return (long) buf.st_mtime;\n    } else {\n        return 0;\n    }\n}\n"
  },
  {
    "path": "src/nfile.h",
    "content": "// NDBX File utility functions\n\n#ifndef NFILE_H\n#define NFILE_H\n\nchar *nfile_read(const char* fname);\nlong nfile_mtime(const char* fname);\n\n#endif // NFILE_H\n"
  },
  {
    "path": "src/ngl.c",
    "content": "// NDBX OpenGL Utility functions\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#define STB_IMAGE_IMPLEMENTATION\n#include \"stb_image.h\"\n\n#include \"nfile.h\"\n#include \"obj.h\"\n\n#include \"ngl.h\"\n#include \"nwm.h\"\n\n#define STB_TRUETYPE_IMPLEMENTATION\n#include \"stb_truetype.h\"\n\n// Error checking ////////////////////////////////////////////////////////////\n\nvoid ngl_check_gl_error(const char *file, int line) {\n    GLenum err = glGetError();\n    int has_error = 0;\n    while (err != GL_NO_ERROR) {\n        has_error = 1;\n        char *msg = NULL;\n        switch(err) {\n            case GL_INVALID_OPERATION:\n            msg = \"GL_INVALID_OPERATION\";\n            break;\n            case GL_INVALID_ENUM:\n            msg = \"GL_INVALID_ENUM\";\n            fprintf(stderr, \"OpenGL error: GL_INVALID_ENUM\\n\");\n            break;\n            case GL_INVALID_VALUE:\n            msg = \"GL_INVALID_VALUE\";\n            fprintf(stderr, \"OpenGL error: GL_INVALID_VALUE\\n\");\n            break;\n            case GL_OUT_OF_MEMORY:\n            msg = \"GL_OUT_OF_MEMORY\";\n            fprintf(stderr, \"OpenGL error: GL_OUT_OF_MEMORY\\n\");\n            break;\n            default:\n            msg = \"UNKNOWN_ERROR\";\n        }\n        fprintf(stderr, \"OpenGL error: %s - %s:%d\\n\", msg, file, line);\n        err = glGetError();\n    }\n    if (has_error) {\n        exit(EXIT_FAILURE);\n    }\n}\n\n// Color /////////////////////////////////////////////////////////////////////\n\nngl_color ngl_color_init_rgba(float red, float green, float blue, float alpha) {\n    ngl_color c;\n    c.red = red;\n    c.green = green;\n    c.blue = blue;\n    c.alpha = alpha;\n    return c;\n}\n\n// Background ////////////////////////////////////////////////////////////////\n\nvoid ngl_clear(float red, float green, float blue, float alpha) {\n    glClearColor(red, green, blue, alpha);\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n}\n\nvoid ngl_clear_depth() {\n    glClear(GL_DEPTH_BUFFER_BIT);\n}\n\n// Shaders ///////////////////////////////////////////////////////////////////\n\nvoid ngl_check_compile_error(GLuint shader) {\n    const int LOG_MAX_LENGTH = 2048;\n    GLint status = -1;\n    glGetShaderiv(shader, GL_COMPILE_STATUS, &status);\n    if (status != GL_TRUE) {\n        char infoLog[LOG_MAX_LENGTH];\n        glGetShaderInfoLog(shader, LOG_MAX_LENGTH, NULL, infoLog);\n        fprintf(stderr, \"Shader %d compile error: %s\\n\", shader, infoLog);\n        exit(EXIT_FAILURE);\n    }\n}\n\nvoid ngl_check_link_error(GLuint program) {\n    const int LOG_MAX_LENGTH = 2048;\n    GLint status = -1;\n    glGetProgramiv(program, GL_LINK_STATUS, &status);\n    if (status != GL_TRUE) {\n        char infoLog[LOG_MAX_LENGTH];\n        glGetProgramInfoLog(program, LOG_MAX_LENGTH, NULL, infoLog);\n        fprintf(stderr, \"Shader link error: %s\\n\", infoLog);\n        exit(EXIT_FAILURE);\n    }\n}\n\nngl_shader *ngl_shader_new(GLenum draw_mode, const char *vertex_shader_source, const char *fragment_shader_source) {\n    GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);\n    glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);\n    glCompileShader(vertex_shader);\n    ngl_check_compile_error(vertex_shader);\n    NGL_CHECK_ERROR();\n\n    GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);\n    glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);\n    glCompileShader(fragment_shader);\n    ngl_check_compile_error(fragment_shader);\n    NGL_CHECK_ERROR();\n\n    GLuint program = glCreateProgram();\n    glAttachShader(program, vertex_shader);\n    glAttachShader(program, fragment_shader);\n    const GLchar* varyings[1];\n    varyings[0] = \"gl_Position\";\n    glTransformFeedbackVaryings(program, 1, varyings, GL_INTERLEAVED_ATTRIBS);\n    glLinkProgram(program);\n    ngl_check_link_error(program);\n    NGL_CHECK_ERROR();\n\n    ngl_shader *shader = calloc(1, sizeof(ngl_shader));\n    shader->draw_mode = draw_mode;\n    shader->vertex_shader = vertex_shader;\n    shader->fragment_shader = fragment_shader;\n    shader->program = program;\n    shader->time_uniform = glGetUniformLocation(program, \"uTime\");\n    shader->view_matrix_uniform = glGetUniformLocation(program, \"uViewMatrix\");\n    shader->projection_matrix_uniform = glGetUniformLocation(program, \"uProjectionMatrix\");\n\n    return shader;\n}\n\nngl_shader *ngl_shader_new_from_file(GLenum draw_mode, const char *vertex_fname, const char *fragment_fname) {\n    char *vertex_shader_source = nfile_read(vertex_fname);\n    char *fragment_shader_source = nfile_read(fragment_fname);\n    ngl_shader *shader = ngl_shader_new(draw_mode, vertex_shader_source, fragment_shader_source);\n    free(vertex_shader_source);\n    free(fragment_shader_source);\n    return shader;\n}\n\nvoid ngl_shader_uniform_set_float(ngl_shader *shader, const char *uniform_name, GLfloat value) {\n    glUseProgram(shader->program);\n    int loc = glGetUniformLocation(shader->program, uniform_name);\n    NGL_CHECK_ERROR();\n    glUniform1f(loc, value);\n    NGL_CHECK_ERROR();\n    glUseProgram(0);\n}\n\nvoid ngl_shader_free(ngl_shader *shader) {\n    glDeleteShader(shader->vertex_shader);\n    glDeleteShader(shader->fragment_shader);\n    glDeleteProgram(shader->program);\n    NGL_CHECK_ERROR();\n    free(shader);\n}\n\n// Textures //////////////////////////////////////////////////////////////////\n\nngl_texture *ngl_texture_new(ngl_shader *shader, const char *uniform_name) {\n    ngl_texture *texture = calloc(1, sizeof(ngl_texture));\n    texture->shader = shader;\n\n    glGenTextures(1, &texture->texture_id);\n    NGL_CHECK_ERROR();\n    glActiveTexture(GL_TEXTURE0);\n    NGL_CHECK_ERROR();\n    glBindTexture(GL_TEXTURE_2D, texture->texture_id);\n    NGL_CHECK_ERROR();\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    NGL_CHECK_ERROR();\n    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n    NGL_CHECK_ERROR();\n\n    GLuint u_texture = glGetUniformLocation(shader->program, uniform_name);\n    NGL_CHECK_ERROR();\n    if (u_texture == -1) {\n        fprintf(stderr, \"WARN OpenGL: Could not find uniform %s\\n\", uniform_name);\n    }\n\n    return texture;\n}\n\nngl_texture *ngl_texture_new_from_file(const char *file_name, ngl_shader *shader, const char *uniform_name) {\n    int width, height, channels;\n    uint8_t *image_data = stbi_load(file_name, &width, &height, &channels, 4);\n    if (!image_data) {\n        fprintf (stderr, \"ERROR: could not load texture %s\\n\", file_name);\n        exit(1);\n    }\n    ngl_texture *texture = ngl_texture_new(shader, uniform_name);\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);\n    NGL_CHECK_ERROR();\n    free(image_data);\n    return texture;\n}\n\n// Update the texture with the given data.\n// Channels is the number of color channels. 1 = red only, 2 = red/green, 3 = r/g/b, 4 = r/g/b/a.\nvoid ngl_texture_update(ngl_texture *texture, nut_buffer *buffer, int width, int height) {\n    GLint format;\n    if (buffer->channels == 1) {\n        format = GL_RED;\n    } else if (buffer->channels == 2) {\n        format = GL_RG;\n    } else if (buffer->channels == 3) {\n        format = GL_RGB;\n    } else if (buffer->channels == 4) {\n        format = GL_RGBA;\n    } else {\n        fprintf(stderr, \"ERROR OpenGL: Invalid texture channels %d\\n\", buffer->channels);\n        exit(1);\n    }\n\n    glActiveTexture(GL_TEXTURE0);\n    NGL_CHECK_ERROR();\n    glBindTexture(GL_TEXTURE_2D, texture->texture_id);\n    NGL_CHECK_ERROR();\n\n    if (width * height > buffer->length) {\n        fprintf(stderr, \"ERROR ngl_texture_update: Invalid width / height (%d x %d) for buffer length %d\\n\", width, height, buffer->length);\n        exit(1);\n    }\n\n    if (buffer->type == NUT_BUFFER_U8) {\n        glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, buffer->data.u8);\n    } else {\n        const int size = width * height * buffer->channels;\n        float *tex = calloc(size, sizeof(float));\n        for (int i = 0; i < size; i++) {\n            tex[i] = (float) buffer->data.f64[i];\n        }\n        glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_FLOAT, tex);\n        free(tex);\n    }\n    NGL_CHECK_ERROR();\n}\n\nvoid ngl_texture_free(ngl_texture *texture) {\n    glDeleteTextures(1, &texture->texture_id);\n    NGL_CHECK_ERROR();\n    free(texture);\n}\n\n// Model initialization //////////////////////////////////////////////////////\n\nngl_model* ngl_model_new(int component_count, int point_count, float* positions, float* normals, float* uvs) {\n    ngl_model *model = calloc(1, sizeof(ngl_model));\n    model->component_count = component_count;\n    model->point_count = point_count;\n    model->transform = mat4_init_identity();\n\n    if (positions != NULL) {\n        glGenBuffers(1, &model->position_vbo);\n        glBindBuffer(GL_ARRAY_BUFFER, model->position_vbo);\n        glBufferData(GL_ARRAY_BUFFER, point_count * component_count * sizeof(GLfloat), positions, GL_DYNAMIC_DRAW);\n        NGL_CHECK_ERROR();\n    } else {\n        model->position_vbo = -1;\n    }\n\n    if (normals != NULL) {\n        glGenBuffers(1, &model->normal_vbo);\n        glBindBuffer(GL_ARRAY_BUFFER, model->normal_vbo);\n        glBufferData(GL_ARRAY_BUFFER, point_count * component_count * sizeof(GLfloat), normals, GL_DYNAMIC_DRAW);\n        NGL_CHECK_ERROR();\n    } else {\n        model->normal_vbo = -1;\n    }\n\n    if (uvs != NULL) {\n        glGenBuffers(1, &model->uv_vbo);\n        glBindBuffer(GL_ARRAY_BUFFER, model->uv_vbo);\n        glBufferData(GL_ARRAY_BUFFER, point_count * 2 * sizeof(GLfloat), uvs, GL_DYNAMIC_DRAW);\n        NGL_CHECK_ERROR();\n    } else {\n        model->uv_vbo = -1;\n    }\n\n    glGenVertexArrays(1, &model->vao);\n    glBindVertexArray(model->vao);\n\n    if (positions != NULL) {\n        glEnableVertexAttribArray(0);\n        glBindBuffer(GL_ARRAY_BUFFER, model->position_vbo);\n        glVertexAttribPointer(0, component_count, GL_FLOAT, GL_FALSE, 0, NULL);\n        NGL_CHECK_ERROR();\n    }\n\n    if (normals != NULL) {\n        glEnableVertexAttribArray(1);\n        glBindBuffer(GL_ARRAY_BUFFER, model->normal_vbo);\n        glVertexAttribPointer(1, component_count, GL_FLOAT, GL_FALSE, 0, NULL);\n        NGL_CHECK_ERROR();\n    }\n\n    if (uvs != NULL) {\n        glEnableVertexAttribArray(2);\n        glBindBuffer(GL_ARRAY_BUFFER, model->uv_vbo);\n        glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, NULL);\n        NGL_CHECK_ERROR();\n    }\n\n    return model;\n}\n\nngl_model* ngl_model_new_with_buffer(nut_buffer *buffer) {\n    int size = buffer->channels * buffer->length;\n    float *positions = calloc(size, sizeof(float));\n    for (int i = 0; i < size; i++) {\n        positions[i] = nut_buffer_get_f64(buffer, i);\n    }\n    ngl_model *model = ngl_model_new(buffer->channels, buffer->length, positions, NULL, NULL);\n    free(positions);\n    return model;\n}\n\nngl_model* ngl_model_new_grid_points(int row_count, int column_count, float row_height, float column_width) {\n    int point_count = row_count * column_count;\n    float* points = calloc(point_count * 2, sizeof(float));\n    float total_width = (column_count - 1) * column_width;\n    float total_height = (row_count - 1) * row_height;\n    float left = - total_width / 2;\n    float top = - total_height / 2;\n    int i = 0;\n    for (int y = 0; y < row_count; y++) {\n        for (int x = 0; x < column_count; x++) {\n            points[i++] = left + x * column_width;\n            points[i++] = top + y * row_height;\n        }\n    }\n    ngl_model *model = ngl_model_new(2, i / 2, points, NULL, NULL);\n    free(points);\n    return model;\n}\n\nngl_model* _ngl_model_new_grid_triangles_with_buffer(int row_count, int column_count, float row_height, float column_width, float height_multiplier, int buffer_stride, int buffer_offset, const float *buffer) {\n    int square_count = (row_count - 1) * (column_count - 1);\n    int face_count = square_count * 2;\n    int point_count = face_count * 3;\n    float* points = calloc(point_count * 3, sizeof(float));\n    float* normals = calloc(point_count * 3, sizeof(float));\n    float* uvs = calloc(point_count * 2, sizeof(float));\n    float total_width = (column_count - 1) * column_width;\n    float total_height = (row_count - 1) * row_height;\n    float left = - total_width / 2;\n    float top = - total_height / 2;\n    int pt_index = 0;\n    int uv_index = 0;\n    for (int ri = 0; ri < row_count - 1; ri++) {\n        for (int ci = 0; ci < column_count - 1; ci++) {\n            float x = left + ci * column_width;\n            float z = top + ri * row_height;\n\n            float y11, y12, y21, y22;\n            if (buffer != NULL) {\n                y11 = buffer[buffer_offset + (ri * column_count * buffer_stride) + ci * buffer_stride] * height_multiplier;\n                y12 = buffer[buffer_offset + (ri * column_count * buffer_stride) + (ci + 1) * buffer_stride] * height_multiplier;\n                y21 = buffer[buffer_offset + ((ri + 1) * column_count * buffer_stride) + ci * buffer_stride] * height_multiplier;\n                y22 = buffer[buffer_offset + ((ri + 1) * column_count * buffer_stride) + (ci + 1) * buffer_stride] * height_multiplier;\n            } else {\n                y11 = y12 = y21 = y22 = 0;\n            }\n\n            vec3 v11 = vec3_init(x, y11, z);\n            vec3 v12 = vec3_init(x + column_width, y12, z);\n            vec3 v21 = vec3_init(x, y21, z + row_height);\n            vec3 v22 = vec3_init(x + column_width, y22, z + row_height);\n            vec3 n1 = vec3_normal(&v11, &v12, &v21);\n            vec3 n2 = vec3_normal(&v12, &v22, &v21);\n            vec2 uv11 = vec2_init(ci / (float) (column_count - 1), ri / (float) (row_count - 1));\n            vec2 uv12 = vec2_init((ci + 1) / (float) (column_count - 1), ri / (float) (row_count - 1));\n            vec2 uv21 = vec2_init(ci / (float) (column_count - 1), (ri + 1) / (float) (row_count - 1));\n            vec2 uv22 = vec2_init((ci + 1) / (float) (column_count - 1), (ri + 1) / (float) (row_count - 1));\n\n            points[pt_index] = v11.x;\n            points[pt_index + 1] = v11.y;\n            points[pt_index + 2] = v11.z;\n            normals[pt_index] = n1.x;\n            normals[pt_index + 1] = n1.y;\n            normals[pt_index + 2] = n1.z;\n            uvs[uv_index] = uv11.x;\n            uvs[uv_index + 1] = uv11.y;\n\n            points[pt_index + 3] = v12.x;\n            points[pt_index + 4] = v12.y;\n            points[pt_index + 5] = v12.z;\n            normals[pt_index + 3] = n1.x;\n            normals[pt_index + 4] = n1.y;\n            normals[pt_index + 5] = n1.z;\n            uvs[uv_index + 2] = uv12.x;\n            uvs[uv_index + 3] = uv12.y;\n\n            points[pt_index + 6] = v21.x;\n            points[pt_index + 7] = v21.y;\n            points[pt_index + 8] = v21.z;\n            normals[pt_index + 6] = n1.x;\n            normals[pt_index + 7] = n1.y;\n            normals[pt_index + 8] = n1.z;\n            uvs[uv_index + 4] = uv21.x;\n            uvs[uv_index + 5] = uv21.y;\n\n            points[pt_index + 9] = v12.x;\n            points[pt_index + 10] = v12.y;\n            points[pt_index + 11] = v12.z;\n            normals[pt_index + 9] = n2.x;\n            normals[pt_index + 10] = n2.y;\n            normals[pt_index + 11] = n2.z;\n            uvs[uv_index + 6] = uv12.x;\n            uvs[uv_index + 7] = uv12.y;\n\n            points[pt_index + 12] = v22.x;\n            points[pt_index + 13] = v22.y;\n            points[pt_index + 14] = v22.z;\n            normals[pt_index + 12] = n2.x;\n            normals[pt_index + 13] = n2.y;\n            normals[pt_index + 14] = n2.z;\n            uvs[uv_index + 8] = uv22.x;\n            uvs[uv_index + 9] = uv22.y;\n\n            points[pt_index + 15] = v21.x;\n            points[pt_index + 16] = v21.y;\n            points[pt_index + 17] = v21.z;\n            normals[pt_index + 15] = n2.x;\n            normals[pt_index + 16] = n2.y;\n            normals[pt_index + 17] = n2.z;\n            uvs[uv_index + 10] = uv21.x;\n            uvs[uv_index + 11] = uv21.y;\n\n            pt_index += 18;\n            uv_index += 12;\n        }\n    }\n    ngl_model* model = ngl_model_new(3, point_count, points, normals, uvs);\n    free(points);\n    free(normals);\n    free(uvs);\n    return model;\n}\n\nngl_model* ngl_model_new_grid_triangles(int row_count, int column_count, float row_height, float column_width) {\n    return _ngl_model_new_grid_triangles_with_buffer(row_count, column_count, row_height, column_width, 0, 0, 0, NULL);\n}\n\n// We ask for the channels to calculate the stride, but only use the first value.\nngl_model* ngl_model_new_with_height_map(int row_count, int column_count, float row_height, float column_width, float height_multiplier, int stride, int offset, const float *buffer) {\n    return _ngl_model_new_grid_triangles_with_buffer(row_count, column_count, row_height, column_width, height_multiplier, stride, offset, buffer);\n}\n\nngl_model* ngl_model_load_obj(const char* fname) {\n    ngl_model *model = calloc(1, sizeof(ngl_model));\n\n    model->transform = mat4_init_identity();\n\n    static float *points;\n    static float *normals;\n    int face_count;\n    obj_parse(fname, &points, &normals, &face_count);\n    // Each triangle face has 3 vertices\n    model->component_count = 3;\n    model->point_count = face_count * 3;\n\n    glGenBuffers(1, &model->position_vbo);\n    glBindBuffer(GL_ARRAY_BUFFER, model->position_vbo);\n    glBufferData(GL_ARRAY_BUFFER, model->point_count * 3 * sizeof(GLfloat), points, GL_DYNAMIC_DRAW);\n    NGL_CHECK_ERROR();\n\n    glGenBuffers(1, &model->normal_vbo);\n    glBindBuffer(GL_ARRAY_BUFFER, model->normal_vbo);\n    glBufferData(GL_ARRAY_BUFFER, model->point_count * 3 * sizeof(GLfloat), normals, GL_DYNAMIC_DRAW);\n    NGL_CHECK_ERROR();\n\n    // Vertex array object\n    // FIXME glUseProgram?\n    glGenVertexArrays(1, &model->vao);\n    glBindVertexArray(model->vao);\n    glEnableVertexAttribArray(0);\n    glBindBuffer(GL_ARRAY_BUFFER, model->position_vbo);\n    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);\n    glEnableVertexAttribArray(1);\n    glBindBuffer(GL_ARRAY_BUFFER, model->normal_vbo);\n    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);\n    NGL_CHECK_ERROR();\n\n    return model;\n}\n\nvoid ngl_model_translate(ngl_model *model, float tx, float ty, float tz) {\n    mat4 m = mat4_init_translate(tx, ty, tz);\n    model->transform = mat4_mul(&model->transform, &m);\n}\n\nvoid ngl_model_free(ngl_model *model) {\n    glDeleteBuffers(1, &model->position_vbo);\n    glDeleteBuffers(1, &model->normal_vbo);\n    glDeleteBuffers(1, &model->uv_vbo);\n    glDeleteVertexArrays(1, &model->vao);\n    free(model);\n}\n\n// Camera ////////////////////////////////////////////////////////////////////\n\n#define NGL_CAMERA_DEFAULT_FOV 100\n\nngl_camera* ngl_camera_new() {\n    ngl_camera *camera = calloc(1, sizeof(ngl_camera));\n    camera->view = mat4_init_identity();\n    camera->projection = mat4_init_perspective(NGL_CAMERA_DEFAULT_FOV, 800 / 600, 0.01f, 1000.0f);\n    camera->background = ngl_color_init_rgba(0, 0, 1, 1);\n    return camera;\n}\n\nngl_camera* ngl_camera_new_look_at(float x, float y, float z) {\n    ngl_camera *camera = calloc(1, sizeof(ngl_camera));\n    vec3 loc = vec3_init(x, y, z);\n    vec3 target = vec3_zero();\n    vec3 up = vec3_init(0.0f, 1.0f, 0.0f);\n    camera->view = mat4_init_look_at(&loc, &target, &up);\n    camera->projection = mat4_init_perspective(NGL_CAMERA_DEFAULT_FOV, 800 / 600, 0.01f, 1000.0f);\n    camera->background = ngl_color_init_rgba(0, 0, 1, 1);\n    return camera;\n}\n\nvoid ngl_camera_translate(ngl_camera *camera, float tx, float ty, float tz) {\n    mat4 m = mat4_init_translate(tx, ty, tz);\n    camera->view = mat4_mul(&camera->view, &m);\n}\n\nvoid ngl_camera_rotate_x(ngl_camera *camera, float deg) {\n    mat4 m = mat4_init_rotation_x(deg);\n    camera->view = mat4_mul(&camera->view, &m);\n}\n\nvoid ngl_camera_rotate_y(ngl_camera *camera, float deg) {\n    mat4 m = mat4_init_rotation_y(deg);\n    camera->view = mat4_mul(&camera->view, &m);\n}\n\nvoid ngl_camera_rotate_z(ngl_camera *camera, float deg) {\n    mat4 m = mat4_init_rotation_z(deg);\n    camera->view = mat4_mul(&camera->view, &m);\n}\n\nvoid ngl_camera_free(ngl_camera* camera) {\n    free(camera);\n}\n\n// Skybox /////////////////////////////////////////////////////////////////////\n\nvoid _ngl_skybox_load_side(GLuint texture_id, GLenum side_target, const char *file_name) {\n    glBindTexture (GL_TEXTURE_CUBE_MAP, texture_id);\n    int width, height, n;\n    int force_channels = 4;\n    unsigned char *image_data = stbi_load(file_name, &width, &height, &n, force_channels);\n    if (!image_data) {\n        fprintf (stderr, \"ERROR: could not load %s\\n\", file_name);\n        exit(1);\n    }\n    // Non-power-of-2 dimensions check\n    if ((width & (width - 1)) != 0 || (height & (height - 1)) != 0) {\n        fprintf(stderr, \"WARNING: image %s is not power-of-2 dimensions\\n\", file_name);\n    }\n\n    // copy image data into 'target' side of cube map\n    glTexImage2D(side_target, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);\n\n    free(image_data);\n}\n\nngl_skybox *ngl_skybox_new(const char *front, const char *back, const char *top, const char *bottom, const char *left, const char *right) {\n    ngl_skybox *skybox = calloc(1, sizeof(ngl_skybox));\n\n    float points[] = {\n      -10.0f,  10.0f, -10.0f,\n      -10.0f, -10.0f, -10.0f,\n       10.0f, -10.0f, -10.0f,\n       10.0f, -10.0f, -10.0f,\n       10.0f,  10.0f, -10.0f,\n      -10.0f,  10.0f, -10.0f,\n\n      -10.0f, -10.0f,  10.0f,\n      -10.0f, -10.0f, -10.0f,\n      -10.0f,  10.0f, -10.0f,\n      -10.0f,  10.0f, -10.0f,\n      -10.0f,  10.0f,  10.0f,\n      -10.0f, -10.0f,  10.0f,\n\n       10.0f, -10.0f, -10.0f,\n       10.0f, -10.0f,  10.0f,\n       10.0f,  10.0f,  10.0f,\n       10.0f,  10.0f,  10.0f,\n       10.0f,  10.0f, -10.0f,\n       10.0f, -10.0f, -10.0f,\n\n      -10.0f, -10.0f,  10.0f,\n      -10.0f,  10.0f,  10.0f,\n       10.0f,  10.0f,  10.0f,\n       10.0f,  10.0f,  10.0f,\n       10.0f, -10.0f,  10.0f,\n      -10.0f, -10.0f,  10.0f,\n\n      -10.0f,  10.0f, -10.0f,\n       10.0f,  10.0f, -10.0f,\n       10.0f,  10.0f,  10.0f,\n       10.0f,  10.0f,  10.0f,\n      -10.0f,  10.0f,  10.0f,\n      -10.0f,  10.0f, -10.0f,\n\n      -10.0f, -10.0f, -10.0f,\n      -10.0f, -10.0f,  10.0f,\n       10.0f, -10.0f, -10.0f,\n       10.0f, -10.0f, -10.0f,\n      -10.0f, -10.0f,  10.0f,\n       10.0f, -10.0f,  10.0f\n    };\n    glGenBuffers(1, &skybox->vbo);\n    glBindBuffer(GL_ARRAY_BUFFER, skybox->vbo);\n    glBufferData(GL_ARRAY_BUFFER, 3 * 36 * sizeof (float), &points, GL_STATIC_DRAW);\n\n    glGenVertexArrays(1, &skybox->vao);\n    glBindVertexArray(skybox->vao);\n    glEnableVertexAttribArray(0);\n    glBindBuffer(GL_ARRAY_BUFFER, skybox->vbo);\n    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);\n\n    glActiveTexture(GL_TEXTURE0);\n    glGenTextures(1, &skybox->texture);\n    _ngl_skybox_load_side(skybox->texture, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, front);\n    _ngl_skybox_load_side(skybox->texture, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, back);\n    _ngl_skybox_load_side(skybox->texture, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, top);\n    _ngl_skybox_load_side(skybox->texture, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, bottom);\n    _ngl_skybox_load_side(skybox->texture, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, left);\n    _ngl_skybox_load_side(skybox->texture, GL_TEXTURE_CUBE_MAP_POSITIVE_X, right);\n    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);\n    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\n\n    skybox->shader = ngl_shader_new_from_file(GL_TRIANGLES, \"../shaders/skybox.vert\", \"../shaders/skybox.frag\");\n\n    return skybox;\n}\n\nvoid ngl_skybox_draw(ngl_skybox *skybox, ngl_camera *camera) {\n    glDepthMask(GL_FALSE);\n    NGL_CHECK_ERROR();\n    glUseProgram(skybox->shader->program);\n    NGL_CHECK_ERROR();\n    glUniformMatrix4fv(skybox->shader->view_matrix_uniform, 1, GL_FALSE, (GLfloat *)&camera->view.m);\n    NGL_CHECK_ERROR();\n    glUniformMatrix4fv(skybox->shader->projection_matrix_uniform, 1, GL_FALSE, (GLfloat *)&camera->projection.m);\n    NGL_CHECK_ERROR();\n    glActiveTexture(GL_TEXTURE0);\n    NGL_CHECK_ERROR();\n    glBindTexture(GL_TEXTURE_CUBE_MAP, skybox->texture);\n    NGL_CHECK_ERROR();\n    glBindVertexArray(skybox->vao);\n    NGL_CHECK_ERROR();\n    glDrawArrays(GL_TRIANGLES, 0, 36);\n    NGL_CHECK_ERROR();\n    glDepthMask(GL_TRUE);\n    NGL_CHECK_ERROR();\n}\n\nvoid ngl_skybox_free(ngl_skybox *skybox) {\n    glDeleteBuffers(1, &skybox->vbo);\n    glDeleteVertexArrays(1, &skybox->vao);\n    glDeleteTextures(1, &skybox->texture);\n    ngl_shader_free(skybox->shader);\n    free(skybox);\n}\n\n// Model drawing /////////////////////////////////////////////////////////////\n\nvoid _ngl_draw_model(ngl_camera* camera, ngl_model* model, ngl_shader *shader, int transform_feedback) {\n    mat4 view = camera->view;\n    mat4 projection = camera->projection;\n    mat4 mv = mat4_mul(&model->transform, &view);\n\n    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n    NGL_CHECK_ERROR();\n    glEnable(GL_BLEND);\n    NGL_CHECK_ERROR();\n    glUseProgram(shader->program);\n    NGL_CHECK_ERROR();\n    glUniform1f(shader->time_uniform, nwm_get_time());\n    NGL_CHECK_ERROR();\n    glUniformMatrix4fv(shader->view_matrix_uniform, 1, GL_FALSE, (GLfloat *)&mv.m);\n    NGL_CHECK_ERROR();\n    glUniformMatrix4fv(shader->projection_matrix_uniform, 1, GL_FALSE, (GLfloat *)&projection.m);\n    NGL_CHECK_ERROR();\n\n    glBindVertexArray(model->vao);\n    NGL_CHECK_ERROR();\n    if (transform_feedback) {\n        glBeginTransformFeedback(shader->draw_mode);\n        NGL_CHECK_ERROR();\n    }\n    glDrawArrays(shader->draw_mode, 0, model->point_count);\n    NGL_CHECK_ERROR();\n    if (transform_feedback) {\n        glEndTransformFeedback();\n        NGL_CHECK_ERROR();\n    }\n\n    glBindVertexArray(0);\n    NGL_CHECK_ERROR();\n    glUseProgram(0);\n    NGL_CHECK_ERROR();\n}\n\nvoid ngl_draw_model(ngl_camera* camera, ngl_model* model, ngl_shader *shader) {\n    _ngl_draw_model(camera, model, shader, 0);\n}\n\nvoid ngl_capture_model(ngl_camera* camera, ngl_model* model, ngl_shader *shader, const char *file_name) {\n    GLuint transform_feedback_buffer;\n    glGenTransformFeedbacks(1, &transform_feedback_buffer);\n    NGL_CHECK_ERROR();\n    GLuint feedback_buffer;\n    glGenBuffers(1, &feedback_buffer);\n    NGL_CHECK_ERROR();\n    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transform_feedback_buffer);\n    NGL_CHECK_ERROR();\n    glBindBuffer(GL_ARRAY_BUFFER, feedback_buffer);\n    NGL_CHECK_ERROR();\n    GLuint buffer_size = model->point_count * 4 * sizeof(GLfloat);\n    glBufferData(GL_ARRAY_BUFFER, buffer_size, NULL, GL_STATIC_READ);\n    NGL_CHECK_ERROR();\n    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, feedback_buffer);\n    NGL_CHECK_ERROR();\n\n    _ngl_draw_model(camera, model, shader, 1);\n    glFlush();\n    NGL_CHECK_ERROR();\n\n    GLfloat *feedback_points = calloc(1, buffer_size);\n    glGetBufferSubData(GL_TRANSFORM_FEEDBACK_BUFFER, 0, buffer_size, feedback_points);\n    NGL_CHECK_ERROR();\n\n    obj_write(file_name, 4, model->point_count, feedback_points);\n\n    glDeleteBuffers(1, &feedback_buffer);\n    NGL_CHECK_ERROR();\n    glDeleteTransformFeedbacks(1, &transform_feedback_buffer);\n    NGL_CHECK_ERROR();\n    free(feedback_points);\n}\n\nvoid ngl_draw_background(ngl_camera *camera, ngl_model *model, ngl_shader *shader) {\n    glDepthMask(GL_FALSE);\n    NGL_CHECK_ERROR();\n    ngl_draw_model(camera, model, shader);\n    glDepthMask(GL_TRUE);\n    NGL_CHECK_ERROR();\n}\n\n// Text drawing /////////////////////////////////////////////////////////////\n\n#define NGL_FONT_BITMAP_WIDTH 1024\n#define NGL_FONT_BITMAP_HEIGHT 1024\n\nconst char *_ngl_font_vertex_shader = \"#version 400\\n\"\n\"layout (location = 0) in vec3 vp;\\n\"\n\"layout (location = 1) in vec3 vn;\\n\"\n\"layout (location = 2) in vec2 vt;\\n\"\n\"out vec3 color;\\n\"\n\"out vec2 texCoord;\\n\"\n\"uniform float uWidth;\\n\"\n\"uniform float uHeight;\\n\"\n\"uniform vec2 uPosition;\\n\"\n\"void main() {\\n\"\n\"    float x = (vp.x / uWidth) * 2 - 1;\\n\"\n\"    float y = (vp.y / uHeight) * -2 + 1;\\n\"\n\"    color = vec3(1.0, 1.0, 1.0);\\n\"\n\"    texCoord = vt;\\n\"\n\"    gl_Position = vec4(uPosition.x + x, uPosition.y + y, 0, 1.0);\\n\"\n\"}\\n\";\n\nconst char *_ngl_font_fragment_shader = \"#version 400\\n\"\n\"in vec3 color;\\n\"\n\"in vec2 texCoord;\\n\"\n\"uniform sampler2D uTexture;\\n\"\n\"uniform float uAlpha;\\n\"\n\"layout (location = 0) out vec4 fragColor;\\n\"\n\"void main() {\\n\"\n\"    float v = texture(uTexture, texCoord).r;\\n\"\n\"    fragColor = vec4(1, 1, 1, v * uAlpha);\\n\"\n\"}\\n\";\n\nngl_font *ngl_font_new(const char *file_name, const int font_size) {\n    ngl_font *font = calloc(1, sizeof(ngl_font));\n    font->font_size = font_size;\n    font->bitmap = calloc(NGL_FONT_BITMAP_WIDTH * NGL_FONT_BITMAP_HEIGHT, 1);\n    font->first_char = 32;\n    font->num_chars = 96;\n    font->chars = calloc(font->num_chars, sizeof(stbtt_bakedchar));\n\n    font->shader = ngl_shader_new(GL_TRIANGLES, _ngl_font_vertex_shader, _ngl_font_fragment_shader);\n    glUseProgram(font->shader->program);\n    NGL_CHECK_ERROR();\n    font->position_uniform = glGetUniformLocation(font->shader->program, \"uPosition\");\n    NGL_CHECK_ERROR();\n    font->alpha_uniform = glGetUniformLocation(font->shader->program, \"uAlpha\");\n    NGL_CHECK_ERROR();\n    glUseProgram(0);\n    NGL_CHECK_ERROR();\n\n    GLint viewport[4];\n    glGetIntegerv(GL_VIEWPORT, (GLint *) &viewport);\n    int width = viewport[2];\n    int height = viewport[3];\n    ngl_shader_uniform_set_float(font->shader, \"uWidth\", width);\n    ngl_shader_uniform_set_float(font->shader, \"uHeight\", height);\n\n    FILE *fp = fopen(file_name, \"rb\");\n    fseek(fp, 0L, SEEK_END);\n    long file_size = ftell(fp);\n    rewind(fp);\n    font->buffer = calloc(file_size, 1);\n    fread(font->buffer, file_size, 1, fp);\n    fclose(fp);\n\n    stbtt_BakeFontBitmap(font->buffer, 0, font_size,\n        font->bitmap, NGL_FONT_BITMAP_WIDTH, NGL_FONT_BITMAP_HEIGHT,\n        font->first_char, font->num_chars, font->chars);\n\n    font->texture = ngl_texture_new(font->shader, \"uTexture\");\n    glActiveTexture(GL_TEXTURE0);\n    NGL_CHECK_ERROR();\n    glBindTexture(GL_TEXTURE_2D, font->texture->texture_id);\n    NGL_CHECK_ERROR();\n    glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, NGL_FONT_BITMAP_WIDTH, NGL_FONT_BITMAP_HEIGHT, 0, GL_RED, GL_UNSIGNED_BYTE, font->bitmap);\n    NGL_CHECK_ERROR();\n\n    return font;\n}\n\nvoid ngl_font_draw(ngl_font *font, const char *text, const double x, const double y, const double alpha) {\n    assert(font != NULL);\n    assert(text != NULL);\n\n    int len = strlen(text);\n\n    int point_count = len * 6; // Each glyph consists of two triangles.\n\n    float *positions = calloc(point_count * 2, sizeof(float));\n    float *uvs = calloc(point_count * 2, sizeof(float));\n\n    float xpos = 0;\n    float ypos = 0;\n    int p = 0;\n    int u = 0;\n\n    for (int i = 0; i < len; i++) {\n        stbtt_aligned_quad q;\n        char c = text[i];\n        int char_index = c - font->first_char;\n        stbtt_GetBakedQuad(font->chars, NGL_FONT_BITMAP_WIDTH, NGL_FONT_BITMAP_HEIGHT,\n            char_index, &xpos, &ypos, &q, 1);\n        positions[p++] = q.x1; // 0\n        positions[p++] = q.y1;\n        positions[p++] = q.x0; // 1\n        positions[p++] = q.y1;\n        positions[p++] = q.x1; // 2\n        positions[p++] = q.y0;\n        positions[p++] = q.x1; // 2\n        positions[p++] = q.y0;\n        positions[p++] = q.x0; // 1\n        positions[p++] = q.y1;\n        positions[p++] = q.x0; // 3\n        positions[p++] = q.y0;\n\n        uvs[u++] = q.s1; // 0\n        uvs[u++] = q.t1;\n        uvs[u++] = q.s0; // 1\n        uvs[u++] = q.t1;\n        uvs[u++] = q.s1; // 2\n        uvs[u++] = q.t0;\n        uvs[u++] = q.s1; // 2\n        uvs[u++] = q.t0;\n        uvs[u++] = q.s0; // 1\n        uvs[u++] = q.t1;\n        uvs[u++] = q.s0; // 3\n        uvs[u++] = q.t0;\n    }\n\n    for (int i = 0; i < p; i += 2) {\n        positions[i] -= xpos / 2;\n    }\n\n    ngl_model *model = ngl_model_new(2, point_count, positions, NULL, uvs);\n    free(positions);\n    free(uvs);\n\n    glDisable(GL_DEPTH_TEST);\n    NGL_CHECK_ERROR();\n    glUseProgram(font->shader->program);\n    NGL_CHECK_ERROR();\n    glUniform2f(font->position_uniform, x, -y);\n    NGL_CHECK_ERROR();\n    glUniform1f(font->alpha_uniform, alpha);\n    NGL_CHECK_ERROR();\n    glActiveTexture(GL_TEXTURE0);\n    NGL_CHECK_ERROR();\n    glBindTexture(GL_TEXTURE_2D, font->texture->texture_id);\n    NGL_CHECK_ERROR();\n    glBindVertexArray(model->vao);\n    NGL_CHECK_ERROR();\n    glDrawArrays(font->shader->draw_mode, 0, model->point_count);\n    NGL_CHECK_ERROR();\n\n    glBindVertexArray(0);\n    NGL_CHECK_ERROR();\n    glUseProgram(0);\n    NGL_CHECK_ERROR();\n    glEnable(GL_DEPTH_TEST);\n    NGL_CHECK_ERROR();\n\n    free(model);\n}\n\nvoid ngl_font_free(ngl_font *font) {\n    free(font->buffer);\n    free(font->bitmap);\n    free(font->chars);\n    free(font->shader);\n    free(font);\n}\n"
  },
  {
    "path": "src/ngl.h",
    "content": "// NDBX OpenGL Utility functions\n\n#ifndef NGL_H\n#define NGL_H\n\n#ifdef __APPLE__\n#   define GL_SILENCE_DEPRECATION\n#   define GLFW_INCLUDE_GLCOREARB\n#else\n    #include <GL/glew.h>\n#endif\n#include <GLFW/glfw3.h>\n\n#include \"stb_truetype.h\"\n\n#include \"vec.h\"\n#include \"nut.h\"\n\ntypedef struct {\n    float red;\n    float green;\n    float blue;\n    float alpha;\n} ngl_color;\n\ntypedef struct {\n    int component_count;\n    int point_count;\n    GLuint position_vbo;\n    GLuint normal_vbo;\n    GLuint uv_vbo;\n    GLuint vao;\n    mat4 transform;\n} ngl_model;\n\ntypedef struct {\n    GLenum draw_mode;\n    GLuint vertex_shader;\n    GLuint fragment_shader;\n    GLuint program;\n    GLint time_uniform;\n    GLint view_matrix_uniform;\n    GLint projection_matrix_uniform;\n} ngl_shader;\n\ntypedef struct {\n    ngl_shader *shader;\n    GLuint texture_id;\n} ngl_texture;\n\ntypedef struct {\n    mat4 view;\n    mat4 projection;\n    ngl_color background;\n} ngl_camera;\n\ntypedef struct {\n    GLuint vbo;\n    GLuint vao;\n    GLuint texture;\n    ngl_shader *shader;\n} ngl_skybox;\n\ntypedef struct {\n    uint8_t *buffer;\n    uint8_t *bitmap;\n    stbtt_fontinfo font;\n    int font_size;\n    stbtt_bakedchar *chars;\n    int first_char;\n    int num_chars;\n    ngl_shader *shader;\n    GLint position_uniform;\n    GLint alpha_uniform;\n    ngl_texture *texture;\n} ngl_font;\n\nvoid ngl_check_gl_error(const char *file, int line);\n#define NGL_CHECK_ERROR() ngl_check_gl_error(__FILE__, __LINE__)\nngl_color ngl_color_init_rgba(float red, float green, float blue, float alpha);\nvoid ngl_clear(float red, float green, float blue, float alpha);\nvoid ngl_clear_depth();\nvoid ngl_check_compile_error(GLuint shader);\nvoid ngl_check_link_error(GLuint program);\nngl_shader *ngl_shader_new(GLenum draw_mode, const char *vertex_shader_source, const char *fragment_shader_source);\nngl_shader *ngl_shader_new_from_file(GLenum draw_mode, const char *vertex_fname, const char *fragment_fname);\nvoid ngl_shader_uniform_set_float(ngl_shader *shader, const char *uniform_name, GLfloat value);\nvoid ngl_shader_free(ngl_shader *shader);\nngl_texture *ngl_texture_new(ngl_shader *shader, const char *uniform_name);\nngl_texture *ngl_texture_new_from_file(const char *file_name, ngl_shader *shader, const char *uniform_name);\nvoid ngl_texture_update(ngl_texture *texture, nut_buffer *buffer, int width, int height);\nvoid ngl_texture_free(ngl_texture *texture);\nngl_model* ngl_model_new(int component_count, int point_count, float* positions, float* normals, float* uvs);\nngl_model* ngl_model_new_with_buffer(nut_buffer *buffer);\nngl_model* ngl_model_new_grid_points(int row_count, int column_count, float row_height, float column_width);\nngl_model* ngl_model_new_grid_triangles(int row_count, int column_count, float row_height, float column_width);\nngl_model* ngl_model_new_with_height_map(int row_count, int column_count, float row_height, float column_width, float height_multiplier, int stride, int offset, const float *buffer);\nngl_model* ngl_model_load_obj(const char* fname);\nvoid ngl_model_translate(ngl_model *model, float tx, float ty, float tz);\nvoid ngl_model_free(ngl_model *model);\nngl_camera* ngl_camera_new();\nngl_camera* ngl_camera_new_look_at(float x, float y, float z);\nvoid ngl_camera_translate(ngl_camera *camera, float tx, float ty, float tz);\nvoid ngl_camera_rotate_x(ngl_camera *camera, float r);\nvoid ngl_camera_rotate_y(ngl_camera *camera, float r);\nvoid ngl_camera_rotate_z(ngl_camera *camera, float r);\nvoid ngl_camera_free(ngl_camera *camera);\nngl_skybox *ngl_skybox_new(const char *front, const char *back, const char *top, const char *bottom, const char *left, const char *right);\nvoid ngl_skybox_draw(ngl_skybox *skybox, ngl_camera *camera);\nvoid ngl_skybox_free(ngl_skybox *skybox);\nvoid ngl_draw_model(ngl_camera *camera, ngl_model* model, ngl_shader *shader);\nvoid ngl_capture_model(ngl_camera* camera, ngl_model* model, ngl_shader *shader, const char *file_name);\nvoid ngl_draw_background(ngl_camera *camera, ngl_model *model, ngl_shader *shader);\nngl_font *ngl_font_new(const char *file_name, const int font_size);\nvoid ngl_font_draw(ngl_font *font, const char *text, const double x, const double y, const double alpha);\nvoid ngl_font_free(ngl_font *font);\n\n#endif // NGL_H\n"
  },
  {
    "path": "src/nim.c",
    "content": "#include <assert.h>\n#include <stdlib.h>\n#include <stdio.h>\n\n#include \"nim.h\"\n\n// Write a PNG image.\nvoid nim_png_write(const char *fname, int width, int height, nim_color_mode color_mode, uint8_t *buffer) {\n    assert(color_mode == NIM_GRAY || color_mode == NIM_RGB);\n    png_structp png_ptr = NULL;\n    png_infop info_ptr = NULL;\n    png_bytepp row_pointers;\n\n    FILE *fp = fopen(fname, \"wb\");\n    if (!fp) {\n        printf(\"ERROR: Could not write open file %s for writing.\\n\", fname);\n        return;\n    }\n\n    // Init PNG writer.\n    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);\n    if (png_ptr == NULL) {\n        printf(\"ERROR: png_create_write_struct.\\n\");\n        return;\n    }\n\n    info_ptr = png_create_info_struct(png_ptr);\n    if (info_ptr == NULL) {\n        printf(\"ERROR: png_create_info_struct.\\n\");\n        png_destroy_write_struct(&png_ptr, NULL);\n        return;\n    }\n\n    png_set_IHDR(png_ptr, info_ptr,\n                 width, height,\n                 8,\n                 color_mode,\n                 PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);\n\n    int channels;\n    if (color_mode == NIM_GRAY) {\n        channels = 1;\n    } else { // color_mode == NIM_RGB per assertion\n        channels = 3;\n    }\n\n    // PNG expects a list of pointers. We just calculate offsets into our buffer.\n    row_pointers = (png_bytepp) png_malloc(png_ptr, height * sizeof(png_bytep));\n    for (int y = 0; y < height; y++) {\n        // The buffer coming from glReadPixels is upside down. Flip the rows.\n        int flipped_y = height - y - 1;\n        row_pointers[y] = buffer + (flipped_y * width * channels);\n    }\n\n    // Write out the image data.\n    png_init_io(png_ptr, fp);\n    png_set_rows(png_ptr, info_ptr, row_pointers);\n    png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);\n\n    // Cleanup.\n    png_free(png_ptr, row_pointers);\n    png_destroy_write_struct(&png_ptr, &info_ptr);\n    fclose(fp);\n    printf(\"Written %s.\\n\", fname);\n}\n"
  },
  {
    "path": "src/nim.h",
    "content": "// Image operations\n\n#ifndef NIM_H\n#define NIM_H\n\n#include <stdint.h>\n#include <png.h>\n\ntypedef enum {\n    NIM_GRAY = PNG_COLOR_TYPE_GRAY,\n    NIM_RGB = PNG_COLOR_TYPE_RGB\n} nim_color_mode;\n\nvoid nim_png_write(const char *fname, int width, int height, nim_color_mode mode, uint8_t *buffer);\n\n#endif // NIM_H\n"
  },
  {
    "path": "src/noise.c",
    "content": "#include <math.h>\n\n#include \"noise.h\"\n\nstatic double dot(int g[], double x, double y) {\n    return g[0] * x + g[1] * y;\n}\n\n// This method is a *lot* faster than using (int)Math.floor(x)\nstatic int fastfloor(double x) {\n    return x > 0 ? (int) x : (int) x - 1;\n}\n\nstatic int p[] = {151,160,137,91,90,15,\n    131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,\n    190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,\n    88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,\n    77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,\n    102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,\n    135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,\n    5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,\n    223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,\n    129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,\n    251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,\n    49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,\n    138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180};\n\n    static int grad3[12][3] = {\n    {1,1,0},{-1,1,0},{1,-1,0},{-1,-1,0},\n{1,0,1},{-1,0,1},{1,0,-1},{-1,0,-1},\n{0,1,1},{0,-1,1},{0,1,-1},{0,-1,-1}\n};\n\n// To remove the need for index wrapping, double the permutation table length\nstatic int perm[512];\ndouble F2, G2;\n\nvoid noise_init() {\n    for(int i=0; i<512; i++) {\n        perm[i]=p[i & 255];\n    }\n    F2 = 0.5 * (sqrt(3.0) - 1.0);\n    G2 = (3.0-sqrt(3.0))/6.0;\n\n}\n\ndouble noise_simplex(double xin, double yin) {\n    double n0, n1, n2; // Noise contributions from the three corners\n    // Skew the input space to determine which simplex cell we're in\n    double s = (xin+yin)*F2; // Hairy factor for 2D\n    int i = fastfloor(xin+s);\n    int j = fastfloor(yin+s);\n    double t = (i+j)*G2;\n    double X0 = i-t; // Unskew the cell origin back to (x,y) space\n    double Y0 = j-t;\n    double x0 = xin-X0; // The x,y distances from the cell origin\n    double y0 = yin-Y0;\n    // For the 2D case, the simplex shape is an equilateral triangle.\n    // Determine which simplex we are in.\n    int i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords\n    if (x0 > y0) { // lower triangle, XY order: (0,0)->(1,0)->(1,1)\n        i1=1;\n        j1=0;\n    } else { // upper triangle, YX order: (0,0)->(0,1)->(1,1)\n        i1=0;\n        j1=1;\n    }\n    // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and\n    // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where\n    // c = (3-sqrt(3))/6\n    double x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords\n    double y1 = y0 - j1 + G2;\n    double x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords\n    double y2 = y0 - 1.0 + 2.0 * G2;\n    // Work out the hashed gradient indices of the three simplex corners\n    int ii = i & 255;\n    int jj = j & 255;\n    int gi0 = perm[ii+perm[jj]] % 12;\n    int gi1 = perm[ii+i1+perm[jj+j1]] % 12;\n    int gi2 = perm[ii+1+perm[jj+1]] % 12;\n    // Calculate the contribution from the three corners\n    double t0 = 0.5 - x0*x0-y0*y0;\n    if(t0<0) n0 = 0.0;\n    else {\n        t0 *= t0;\n        n0 = t0 * t0 * dot(grad3[gi0], x0, y0); // (x,y) of grad3 used for 2D gradient\n    }\n    double t1 = 0.5 - x1*x1-y1*y1;\n    if(t1<0) n1 = 0.0;\n    else {\n        t1 *= t1;\n        n1 = t1 * t1 * dot(grad3[gi1], x1, y1);\n    } double t2 = 0.5 - x2*x2-y2*y2;\n    if(t2<0) n2 = 0.0;\n    else {\n        t2 *= t2;\n        n2 = t2 * t2 * dot(grad3[gi2], x2, y2);\n    }\n    // Add contributions from each corner to get the final noise value.\n    // The result is scaled to return values in the interval [-1,1].\n    return 70.0 * (n0 + n1 + n2);\n}\n"
  },
  {
    "path": "src/noise.h",
    "content": "#ifndef NOISE_H\n#define NOISE_H\n\nvoid noise_init();\ndouble noise_simplex(double x_in, double y_in);\n\n#endif // NOISE_H\n"
  },
  {
    "path": "src/nosc.c",
    "content": "// NDBX OSC Implementation\n// Can be used to receive messages from OSCulator.\n\n#include <assert.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n#include <netdb.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n\n#include \"nosc.h\"\n#include \"nut.h\"\n\nstatic void die(const char * format, ...)\n{\n    va_list vargs;\n    va_start(vargs, format);\n    vfprintf(stderr, format, vargs);\n    fprintf(stderr, \".\\n\");\n    exit(1);\n}\n\nstatic void warn(const char * format, ...) {\n    va_list vargs;\n    va_start(vargs, format);\n    vfprintf(stderr, format, vargs);\n    fprintf(stderr, \".\\n\");\n}\n\n#if defined( __BIG_ENDIAN__ ) || __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__\n    static inline void swap32(void *v) { }\n#elif defined( __LITTLE_ENDIAN__ ) || __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__\n    static inline void swap(char *a, char *b){\n        char t = *a;\n        *a = *b;\n        *b = t;\n    }\n\n    static inline void swap32(void *v) {\n        char *b = (char *) v;\n        swap(b  , b+3);\n        swap(b+1, b+2);\n    }\n#else\n    #error Either __BIG_ENDIAN__ or __LITTLE_ENDIAN__ must be defined.\n#endif\n\nstatic void check_arg(int cond, const char *format, ...) {\n    if (!cond) {\n        va_list vargs;\n        va_start(vargs, format);\n        fprintf(stderr, \"ERROR checking arg: \");\n        vfprintf(stderr, format, vargs);\n        fprintf(stderr, \".\\n\");\n        exit(1);\n    }\n}\n\nconst char *nosc_message_get_string(const nosc_message *msg, int index) {\n    char arg_type = msg->types[index];\n    check_arg(arg_type == 's', \"OSC argument %d is not a string.\", index);\n    return msg->args[index].s;\n}\n\nint32_t nosc_message_get_int(const nosc_message *msg, int index) {\n    char arg_type = msg->types[index];\n    check_arg(arg_type == 'i', \"OSC argument %d is not an int32.\", index);\n    return msg->args[index].i;\n}\n\nfloat nosc_message_get_float(const nosc_message *msg, int index) {\n    char arg_type = msg->types[index];\n    check_arg(arg_type == 'f', \"OSC argument %d is not a float.\", index);\n    return msg->args[index].f;\n}\n\ntypedef struct {\n    char *pos;\n    int remaining;\n} parser;\n\nchar *parse_string(parser *p) {\n    assert(p != NULL);\n    assert(p->pos != NULL);\n    assert(p->remaining >= 4);\n\n    // The string starts where the parser is.\n    char *start = p->pos;\n\n    // Now let's find the end\n    char *end = p->pos;\n    end += 3;\n    while (*end) {\n        end += 4;\n    }\n    end++;\n\n    p->pos = end;\n    p->remaining -= end - start;\n\n    return start;\n}\n\nint32_t parse_int32(parser *p) {\n    assert(p != NULL);\n    assert(p->pos != NULL);\n    assert(p->remaining >= 4);\n\n    swap32(p->pos);\n    uint32_t v = *(int32_t *)p->pos;\n\n    p->pos += 4;\n    p->remaining -= 4;\n\n    return v;\n}\n\nfloat parse_float(parser *p) {\n    assert(p != NULL);\n    assert(p->pos != NULL);\n    assert(p->remaining >= 4);\n\n    swap32(p->pos);\n    float v = *(float *)p->pos;\n\n    p->pos += 4;\n    p->remaining -= 4;\n\n    return v;\n}\n\nstatic nosc_message *_nosc_server_parse_message(char *data, size_t size) {\n    nosc_message *msg = calloc(1, sizeof(nosc_message));\n\n    parser p;\n    p.pos = data;\n    p.remaining = size;\n\n    // Parse the path\n    const char *path = parse_string(&p);\n    strncpy(msg->path, path, NOSC_MAX_PATH_LENGTH);\n\n    // Parse the types\n    const char *types = parse_string(&p);\n    check_arg(*types == ',', \"OSC message does not contain type tag string.\");\n    types++;\n    strncpy(msg->types, types, NOSC_MAX_TYPES_LENGTH);\n    int types_count = strlen(types);\n    msg->arg_count = types_count;\n\n    // Allocate the data structures.\n    msg->args = calloc(types_count, sizeof(nosc_arg));\n\n    // Parse the actual arguments.\n    //char *args_ptr = types_ptr + len;\n    for (int i = 0; i < types_count; i ++) {\n        char arg_type = types[i];\n        if (arg_type == 's') {\n            const char *str = parse_string(&p);\n            //len = get_string(args_ptr, remaining);\n            //remaining -= len;\n            int len = strlen(str);\n            msg->args[i].s = calloc(len, 1);\n            strncpy(msg->args[i].s, str, len);\n        } else if (arg_type == 'i') {\n            int v = parse_int32(&p);\n            msg->args[i].i = v;\n        } else if (arg_type == 'f') {\n            float v = parse_float(&p);\n            msg->args[i].f = v;\n        } else {\n            fprintf(stderr, \"_nosc_server_parse_message: Unknown argument type %c\\n\", arg_type);\n            exit(1);\n        }\n    }\n\n    return msg;\n}\n\nstatic void _nosc_server_push_message(nosc_server *server, nosc_message *message) {\n    pthread_mutex_lock(&server->message_mutex);\n    nosc_message_item *item = calloc(1, sizeof(nosc_message_item));\n    item->message = message;\n    if (server->rear == NULL) {\n        server->rear = item;\n        server->front = item;\n    } else {\n        server->rear->next = item;\n        server->rear = item;\n    }\n    pthread_mutex_unlock(&server->message_mutex);\n}\n\nstatic int _nosc_server_has_messages(nosc_server *server) {\n    return server->rear ? 1 : 0;\n}\n\nstatic nosc_message *_nosc_server_pop_message(nosc_server *server) {\n    nosc_message *msg = NULL;\n    pthread_mutex_lock(&server->message_mutex);\n    if (server->front != NULL) {\n        nosc_message_item *item = server->front;\n        if (server->front == server->rear) {\n            // Queue is empty;\n            server->front = NULL;\n            server->rear = NULL;\n        } else {\n            server->front = server->front->next;\n        }\n        msg = item->message;\n        free(item);\n    }\n    pthread_mutex_unlock(&server->message_mutex);\n    return msg;\n}\n\nstatic void _nosc_server_start(nosc_server *server) {\n    // Create the socket\n    int fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);\n    if (fd == -1) {\n        die(\"%s\", strerror(errno));\n    }\n\n    // Setup the socket address data structure\n    struct sockaddr_in address;\n    address.sin_family = AF_INET;\n    address.sin_port = htons(server->port);\n    address.sin_addr.s_addr = htonl(INADDR_ANY);\n\n    // Bind the local address to the socket\n    if (bind(fd, (struct sockaddr*) &address, sizeof(address)) == -1) {\n        die(\"%s\", strerror(errno));\n    }\n\n    char buffer[548];\n    struct sockaddr_storage src_addr;\n\n    struct iovec iov[1];\n    iov[0].iov_base = buffer;\n    iov[0].iov_len = sizeof(buffer);\n\n    struct msghdr message;\n    message.msg_name = &src_addr;\n    message.msg_namelen = sizeof(src_addr);\n    message.msg_iov = iov;\n    message.msg_iovlen = 1;\n    message.msg_control = 0;\n    message.msg_controllen = 0;\n\n    while(server->running) {\n        ssize_t count = recvmsg(fd, &message, MSG_DONTWAIT);\n        if (count == -1) {\n            if (errno == EAGAIN) {\n                nut_sleep_milliseconds(1);\n            } else {\n                die(\"%s\", strerror(errno));\n            }\n        } else if (message.msg_flags & MSG_TRUNC) {\n            warn(\"datagram too large for buffer: truncated\");\n        } else {\n            nosc_message *msg = _nosc_server_parse_message(buffer, count);\n            _nosc_server_push_message(server, msg);\n        }\n    }\n\n    close(fd);\n}\n\nnosc_server *nosc_server_new(int port, nosc_server_handle_message_fn fn, void *ctx) {\n    nosc_server *server = calloc(1, sizeof(nosc_server));\n    server->port = port;\n    server->running = 1;\n    server->handle_message_fn = fn;\n    server->handle_message_ctx = ctx;\n\n    pthread_create(&server->server_thread, NULL, (void *(*)(void *))&_nosc_server_start, server);\n\n    return server;\n}\n\nvoid nosc_server_update(nosc_server *server) {\n    while (_nosc_server_has_messages(server)) {\n        nosc_message *msg = _nosc_server_pop_message(server);\n        // The check is here to avoid a race condition between has_messages and pop_message\n        if (msg) {\n            server->handle_message_fn(server, msg, server->handle_message_ctx);\n            free(msg);\n        }\n    }\n}\n\nvoid nosc_server_free(nosc_server *server) {\n    server->running = 0;\n    pthread_join(server->server_thread, NULL);\n    free(server);\n}\n"
  },
  {
    "path": "src/nosc.h",
    "content": "// NDBX OSC Implementation\n// Can be used to receive messages from OSCulator.\n\n#ifndef NOSC_H\n#define NOSC_H\n\n#include <pthread.h>\n\n#define NOSC_MAX_PATH_LENGTH 200\n#define NOSC_MAX_TYPES_LENGTH 10\n\ntypedef union nosc_arg {\n    char *s;\n    int32_t i;\n    float f;\n} nosc_arg;\n\ntypedef struct {\n    char path[NOSC_MAX_PATH_LENGTH];\n    char types[NOSC_MAX_TYPES_LENGTH];\n    int arg_count;\n    nosc_arg *args;\n} nosc_message;\n\nconst char *nosc_message_get_string(const nosc_message *msg, int index);\nint32_t nosc_message_get_int(const nosc_message *msg, int index);\nfloat nosc_message_get_float(const nosc_message *msg, int index);\n\ntypedef struct nosc_message_item nosc_message_item;\n\nstruct nosc_message_item {\n    nosc_message *message;\n    nosc_message_item *next;\n};\n\ntypedef struct nosc_server nosc_server;\n\ntypedef void (*nosc_server_handle_message_fn)(nosc_server *server, nosc_message *message, void *ctx);\n\nstruct nosc_server {\n    int port;\n    int running;\n\n    nosc_server_handle_message_fn handle_message_fn;\n    void *handle_message_ctx;\n\n    pthread_t server_thread;\n\n    nosc_message_item *front;\n    nosc_message_item *rear;\n    pthread_mutex_t message_mutex;\n};\n\nnosc_server *nosc_server_new(int port, nosc_server_handle_message_fn fn, void *ctx);\nvoid nosc_server_update(nosc_server *server);\nvoid nosc_server_free(nosc_server *server);\n\n#endif // NOSC_H\n"
  },
  {
    "path": "src/nrf.c",
    "content": "// NDBX Radio Frequency functions, based on HackRF\n\n#include <assert.h>\n#include <math.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <unistd.h>\n#include <pthread.h>\n\n#include <libhackrf/hackrf.h>\n#include <rtl-sdr.h>\n\n#include \"nrf.h\"\n#include \"nut.h\"\n\n#ifndef M_PI\n#define M_PI 3.14159265358979323846\n#endif\nconst double TAU = M_PI * 2;\n\n// Block\n\nvoid nrf_block_init(nrf_block* block, nrf_block_type type, nrf_block_process_fn process_fn, nrf_block_result_fn result_fn) {\n    block->type = type;\n    block->process_fn = process_fn;\n    block->result_fn = result_fn;\n    assert(block->n_outputs == 0);\n}\n\nvoid nrf_block_connect(nrf_block* input, nrf_block* output) {\n    assert(input->n_outputs < NRF_BLOCK_MAX_OUTPUTS);\n    input->outputs[input->n_outputs] = output;\n    input->n_outputs++;\n}\n\nvoid nrf_block_process(nrf_block* block, nut_buffer* buffer) {\n    if (block->process_fn != NULL) {\n        block->process_fn(block, buffer);\n    }\n\n    if (block->n_outputs > 0) {\n        nut_buffer *result = block->result_fn(block);\n        for (int i = 0; i < block->n_outputs; i++) {\n            nrf_block *output = block->outputs[i];\n            nrf_block_process(output, result);\n        }\n        nut_buffer_free(result);\n    }\n}\n\n// Device\n\nvoid _nrf_rtlsdr_check_status(nrf_device *device, int status, const char *message, const char *file, int line) {\n    if (status != 0) {\n        fprintf(stderr, \"RTL-SDR: %s (Status code %d) %s:%d\\n\", message, status, file, line);\n        if (device == NULL && device->device != NULL) {\n\n            rtlsdr_close((rtlsdr_dev_t*) device->device);\n        }\n        exit(EXIT_FAILURE);\n    }\n}\n\n#define _NRF_RTLSDR_CHECK_STATUS(device, status, message) _nrf_rtlsdr_check_status(device, status, message, __FILE__, __LINE__)\n\nvoid _nrf_hackrf_check_status(nrf_device *device, int status, const char *message, const char *file, int line) {\n    if (status != 0) {\n        fprintf(stderr, \"NRF HackRF fatal error: %s\\n\", message);\n        if (device != NULL && device->device != NULL) {\n            hackrf_close((hackrf_device*) device->device);\n        }\n        hackrf_exit();\n        exit(EXIT_FAILURE);\n    }\n}\n\n#define _NRF_HACKRF_CHECK_STATUS(device, status, message) _nrf_hackrf_check_status(device, status, message, __FILE__, __LINE__)\n\nstatic float _nrf_clampf(float v, float min, float max) {\n    return v < min ? min : v > max ? max : v;\n}\n\n// Limit the frequency range to a possible value.\ndouble _nrf_clamp_frequency(nrf_device *device, double freq_mhz) {\n    if (device->device_type == NRF_DEVICE_RTLSDR) {\n        return freq_mhz < 10 ? 10 : freq_mhz > 1766 ? 1766 : freq_mhz;\n    } else if (device->device_type == NRF_DEVICE_HACKRF) {\n        return freq_mhz < 1 ? 1 : freq_mhz > 6000 ? 6000 : freq_mhz;\n    } else {\n        return freq_mhz;\n    }\n}\n\nstatic int _nrf_process_sample_block(nrf_device *device, uint8_t *buffer, int length) {\n    assert(length == NRF_BUFFER_SIZE_BYTES);\n    if (device->receiving == 0) return 0;\n\n    pthread_mutex_lock(&device->data_mutex);\n    for (int i = 0; i < length; i += 2) {\n        uint8_t u8i = buffer[i];\n        uint8_t u8q = buffer[i + 1];\n        if (device->device_type == NRF_DEVICE_HACKRF || device->device_type == NRF_DEVICE_DUMMY) {\n            u8i = (u8i + 128) % 256;\n            u8q = (u8q + 128) % 256;\n        }\n        device->samples[i] = u8i;\n        device->samples[i + 1] = u8q;\n    }\n    pthread_mutex_unlock(&device->data_mutex);\n\n    if (device->decode_cb_fn != NULL) {\n        device->decode_cb_fn(device, device->decode_cb_ctx);\n    }\n\n    if (device->receiving == 0) return 0;\n\n    nrf_block_process(&device->block, NULL);\n\n    // if (device->block.n_outputs > 0) {\n    //     nut_buffer *buffer = nrf_device_get_samples_buffer(device);\n    //     for (int i = 0; i < device->block.n_outputs; i++) {\n    //         if (device->receiving == 0) return 0;\n    //         nrf_block *output = device->block.outputs[i];\n    //         nrf_block_process(output, buffer);\n    //     }\n    //     nut_buffer_free(buffer);\n    // }\n\n    return 0;\n}\n\n// This function will block, so needs to be called on its own thread.\nvoid *_nrf_rtlsdr_receive_loop(nrf_device *device) {\n    while (device->receiving) {\n        int n_read;\n        int status = rtlsdr_read_sync((rtlsdr_dev_t*) device->device, device->receive_buffer, NRF_BUFFER_SIZE_BYTES, &n_read);\n        _NRF_RTLSDR_CHECK_STATUS(device, status, \"rtlsdr_read_sync\");\n        if (n_read < NRF_BUFFER_SIZE_BYTES) {\n            fprintf(stderr, \"Short read, samples lost, exiting!\\n\");\n            exit(EXIT_FAILURE);\n        }\n        _nrf_process_sample_block(device, device->receive_buffer, NRF_BUFFER_SIZE_BYTES);\n    }\n    return NULL;\n}\n\nstatic int _nrf_hackrf_receive_sample_block(hackrf_transfer *transfer) {\n    nrf_device *device = (nrf_device *)transfer->rx_ctx;\n    return _nrf_process_sample_block(device, transfer->buffer, transfer->valid_length);\n}\n\nstatic void _nrf_advance_block(nrf_device *device) {\n    if (!device->paused) {\n        device->dummy_block_index++;\n        if (device->dummy_block_index >= device->dummy_block_length) {\n            device->dummy_block_index = 0;\n        }\n    }\n}\n\nstatic void *_nrf_dummy_receive_loop(nrf_device *device) {\n    while (device->receiving) {\n        unsigned char *buffer = device->receive_buffer + (device->dummy_block_index * NRF_BUFFER_SIZE_BYTES);\n        _nrf_process_sample_block(device, buffer, NRF_BUFFER_SIZE_BYTES);\n        _nrf_advance_block(device);\n        nut_sleep_milliseconds(1000 / 60);\n    }\n    return NULL;\n}\n\nstatic const int RTLSDR_DEFAULT_SAMPLE_RATE = 3e6;\n\nstatic int _nrf_rtlsdr_start(nrf_device *device, double freq_mhz, int sample_rate) {\n    int status;\n\n    status = rtlsdr_open((rtlsdr_dev_t**)&device->device, 0);\n    if (status != 0) {\n        return status;\n    }\n\n    device->device_type = NRF_DEVICE_RTLSDR;\n    device->receive_buffer = calloc(NRF_BUFFER_SIZE_BYTES, sizeof(uint8_t));\n\n    rtlsdr_dev_t* dev = (rtlsdr_dev_t*) device->device;\n\n    sample_rate = sample_rate != 0 ? sample_rate : RTLSDR_DEFAULT_SAMPLE_RATE;\n    status = rtlsdr_set_sample_rate(dev, sample_rate);\n    _NRF_RTLSDR_CHECK_STATUS(device, status, \"rtlsdr_set_sample_rate\");\n    device->sample_rate = sample_rate;\n\n    // Set auto-gain mode\n    status = rtlsdr_set_tuner_gain_mode(dev, 0);\n    _NRF_RTLSDR_CHECK_STATUS(device, status, \"rtlsdr_set_tuner_gain_mode\");\n\n    status = rtlsdr_set_agc_mode(dev, 1);\n    _NRF_RTLSDR_CHECK_STATUS(device, status, \"rtlsdr_set_agc_mode\");\n\n    freq_mhz = _nrf_clamp_frequency(device, freq_mhz);\n    status = rtlsdr_set_center_freq(dev, freq_mhz * 1e6);\n    _NRF_RTLSDR_CHECK_STATUS(device, status, \"rtlsdr_set_center_freq\");\n\n    status = rtlsdr_reset_buffer(dev);\n    _NRF_RTLSDR_CHECK_STATUS(device, status, \"rtlsdr_reset_buffer\");\n\n    device->receiving = 1;\n    pthread_create(&device->receive_thread, NULL, (void *(*)(void *)) &_nrf_rtlsdr_receive_loop, device);\n\n    return 0;\n}\n\nstatic const int HACKRF_DEFAULT_SAMPLE_RATE = 10e6;\n\nstatic int _nrf_hackrf_start(nrf_device *device, double freq_mhz, int sample_rate) {\n    int status;\n\n    status = hackrf_init();\n    _NRF_HACKRF_CHECK_STATUS(NULL, status, \"hackrf_init\");\n\n    status = hackrf_open((hackrf_device**)&device->device);\n    if (status != 0) {\n        return status;\n    }\n\n    device->device_type = NRF_DEVICE_HACKRF;\n\n    hackrf_device *dev = (hackrf_device*) device->device;\n\n    freq_mhz = _nrf_clamp_frequency(device, freq_mhz);\n    status = hackrf_set_freq(dev, freq_mhz * 1e6);\n    _NRF_HACKRF_CHECK_STATUS(device, status, \"hackrf_set_freq\");\n\n    sample_rate = sample_rate != 0 ? sample_rate : HACKRF_DEFAULT_SAMPLE_RATE;\n    status = hackrf_set_sample_rate(dev, sample_rate);\n    _NRF_HACKRF_CHECK_STATUS(device, status, \"hackrf_set_sample_rate\");\n    device->sample_rate = sample_rate;\n\n    status = hackrf_set_amp_enable(dev, 0);\n    _NRF_HACKRF_CHECK_STATUS(device, status, \"hackrf_set_amp_enable\");\n\n    status = hackrf_set_lna_gain(dev, 36);\n    _NRF_HACKRF_CHECK_STATUS(device, status, \"hackrf_set_lna_gain\");\n\n    status = hackrf_set_vga_gain(dev, 28);\n    _NRF_HACKRF_CHECK_STATUS(device, status, \"hackrf_set_lna_gain\");\n\n    device->receiving = 1;\n    status = hackrf_start_rx(dev, _nrf_hackrf_receive_sample_block, device);\n    _NRF_HACKRF_CHECK_STATUS(device, status, \"hackrf_start_rx\");\n\n    return 0;\n}\n\nstatic const int DUMMY_DEFAULT_SAMPLE_RATE = 5e6;\n\nstatic int _nrf_dummy_start(nrf_device *device, const char *data_file) {\n    device->device_type = NRF_DEVICE_DUMMY;\n    device->sample_rate = DUMMY_DEFAULT_SAMPLE_RATE;\n\n    fprintf(stderr, \"WARN nrf_device_new: Couldn't open SDR device. Falling back on data file %s\\n\", data_file);\n    if (data_file != NULL) {\n        FILE *fp = fopen(data_file, \"rb\");\n        if (fp != NULL) {\n            fseek(fp, 0L, SEEK_END);\n            long size = ftell(fp);\n            rewind(fp);\n            device->receive_buffer = calloc(size, sizeof(uint8_t));\n            device->dummy_block_length = size / NRF_BUFFER_SIZE_BYTES;\n            device->dummy_block_index = 0;\n            fread(device->receive_buffer, size, 1, fp);\n            fclose(fp);\n        } else {\n            fprintf(stderr, \"WARN nrf_device_new: Couldn't open %s. Using empty buffer.\\n\", data_file);\n            device->receive_buffer = calloc(NRF_BUFFER_SIZE_BYTES, sizeof(uint8_t));\n            device->dummy_block_length = 1;\n            device->dummy_block_index = 0;\n        }\n    }\n\n    device->receiving = 1;\n    pthread_create(&device->receive_thread, NULL, (void *(*)(void *))&_nrf_dummy_receive_loop, device);\n\n    return 0;\n}\n\n// Start receiving on the given frequency.\n// If the device could not be opened, use the raw contents of the data_file\n// instead.\nnrf_device *nrf_device_new(double freq_mhz, const char* data_file) {\n    nrf_device_config config;\n    memset(&config, 0, sizeof(nrf_device_config));\n    config.freq_mhz = freq_mhz;\n    config.data_file = data_file;\n    return nrf_device_new_with_config(config);\n}\n\nnrf_device *nrf_device_new_with_config(const nrf_device_config config) {\n    int sample_rate = config.sample_rate;\n    double freq_mhz = config.freq_mhz > 0.1 ? config.freq_mhz : 100;\n    const char *data_file = config.data_file != 0 ? config.data_file : NULL;\n\n    int status;\n    nrf_device *device = calloc(1, sizeof(nrf_device));\n    nrf_block_init(&device->block, NRF_BLOCK_SOURCE, NULL, (nrf_block_result_fn) nrf_device_get_samples_buffer);\n    pthread_mutex_init(&device->data_mutex, NULL);\n    memset(device->samples, 0, NRF_BUFFER_SIZE_BYTES);\n\n    // Try to find a suitable hardware device, fall back to data file.\n    status = _nrf_rtlsdr_start(device, freq_mhz, sample_rate);\n    if (status != 0) {\n        status = _nrf_hackrf_start(device, freq_mhz, sample_rate);\n        if (status != 0) {\n            status = _nrf_dummy_start(device, data_file);\n            if (status != 0) {\n                fprintf(stderr, \"ERROR nrf_device_new: Couldn't even start dummy device. Exiting.\\n\");\n            }\n        }\n    }\n\n    return device;\n}\n\n// Change the frequency to the given frequency, in MHz.\ndouble nrf_device_set_frequency(nrf_device *device, double freq_mhz) {\n    freq_mhz = _nrf_clamp_frequency(device, freq_mhz);\n    if (device->device_type == NRF_DEVICE_RTLSDR) {\n        int status = rtlsdr_set_center_freq((rtlsdr_dev_t*) device->device, freq_mhz * 1e6);\n        _NRF_RTLSDR_CHECK_STATUS(device, status, \"rtlsdr_set_center_freq\");\n    } else if (device->device_type == NRF_DEVICE_HACKRF) {\n        int status = hackrf_set_freq(device->device, freq_mhz * 1e6);\n        _NRF_HACKRF_CHECK_STATUS(device, status, \"hackrf_set_freq\");\n    }\n    return freq_mhz;\n}\n\nvoid nrf_device_set_decode_handler(nrf_device *device, nrf_device_decode_cb_fn fn, void *ctx) {\n    device->decode_cb_fn = fn;\n    device->decode_cb_ctx = ctx;\n}\n\nvoid nrf_device_set_paused(nrf_device *device, int paused) {\n    device->paused = paused;\n}\n\nvoid nrf_device_step(nrf_device *device) {\n    device->dummy_block_index++;\n    if (device->dummy_block_index >= device->dummy_block_length) {\n        device->dummy_block_index = 0;\n    }\n}\n\nnut_buffer *nrf_device_get_samples_buffer(nrf_device *device) {\n    pthread_mutex_lock(&device->data_mutex);\n    nut_buffer *buffer = nut_buffer_new_u8(NRF_SAMPLES_LENGTH, 2, device->samples);\n    pthread_mutex_unlock(&device->data_mutex);\n    return buffer;\n}\n\nnut_buffer *nrf_device_get_iq_buffer(nrf_device *device) {\n    pthread_mutex_lock(&device->data_mutex);\n    nut_buffer *buffer = nut_buffer_new_u8(NRF_IQ_RESOLUTION * NRF_IQ_RESOLUTION, 1, NULL);\n    for (int i = 0; i < NRF_BUFFER_SIZE_BYTES; i += 2) {\n        int u8i = device->samples[i];\n        int u8q = device->samples[i + 1];\n        int offset = u8i * 256 + u8q;\n        buffer->data.u8[offset]++;\n    }\n    pthread_mutex_unlock(&device->data_mutex);\n    return buffer;\n}\n\nstatic void pixel_inc(nut_buffer *image_buffer, int stride, int x, int y) {\n    int offset = y * stride + x;\n    if (image_buffer->type == NUT_BUFFER_U8) {\n        int v = image_buffer->data.u8[offset];\n        if (v < 255) {\n            image_buffer->data.u8[offset]++;\n        }\n    } else {\n        image_buffer->data.f64[offset]++;\n    }\n}\n\nstatic void draw_line(nut_buffer *image_buffer, int stride, int x1, int y1, int x2, int y2, int color) {\n  int dx = abs(x2 - x1);\n  int sx = x1 < x2 ? 1 : -1;\n  int dy = abs(y2-y1);\n  int sy = y1 < y2 ? 1 : -1;\n  int err = (dx > dy ? dx : -dy) / 2;\n  int e2;\n\n  for(;;){\n    pixel_inc(image_buffer, stride, x1, y1);\n    if (x1 == x2 && y1 == y2) break;\n    e2 = err;\n    if (e2 > -dx) { err -= dy; x1 += sx; }\n    if (e2 <  dy) { err += dx; y1 += sy; }\n  }\n}\n\nnut_buffer *nrf_device_get_iq_lines(nrf_device *device, int size_multiplier, float line_percentage) {\n    line_percentage = _nrf_clampf(line_percentage, 0, 1);\n    pthread_mutex_lock(&device->data_mutex);\n    int sz = NRF_IQ_RESOLUTION * size_multiplier;\n    nut_buffer *image_buffer = nut_buffer_new_u8(sz * sz, 1, NULL);\n    int x1 = 0;\n    int y1 = 0;\n    int max = NRF_BUFFER_SIZE_BYTES * line_percentage;\n    for (int i = 0; i < max; i += 2) {\n        int x2 = device->samples[i] * size_multiplier;\n        int y2 = device->samples[i + 1] * size_multiplier;\n        if (i > 0) {\n            draw_line(image_buffer, NRF_IQ_RESOLUTION * size_multiplier, x1, y1, x2, y2, 0);\n        }\n        x1 = x2;\n        y1 = y2;\n    }\n    pthread_mutex_unlock(&device->data_mutex);\n    return image_buffer;\n}\n\n// Stop receiving data\nvoid nrf_device_free(nrf_device *device) {\n    if (device->device_type == NRF_DEVICE_RTLSDR) {\n        device->receiving = 0;\n        pthread_join(device->receive_thread, NULL);\n        rtlsdr_close((rtlsdr_dev_t*) device->device);\n    } else if (device->device_type == NRF_DEVICE_HACKRF) {\n        hackrf_stop_rx((hackrf_device*) device->device);\n        hackrf_close((hackrf_device*) device->device);\n        hackrf_exit();\n    } else if (device->device_type == NRF_DEVICE_DUMMY) {\n        device->receiving = 0;\n        pthread_join(device->receive_thread, NULL);\n    }\n    if (device->receive_buffer) {\n        free(device->receive_buffer);\n    }\n    free(device);\n}\n\n// Interpolator\n\nnrf_interpolator *nrf_interpolator_new(double interpolate_step) {\n    nrf_interpolator *interpolator = calloc(1, sizeof(nrf_interpolator));\n    interpolator->interpolate_step = interpolate_step;\n    interpolator->t = -1;\n    return interpolator;\n}\n\nvoid nrf_interpolator_process(nrf_interpolator *interpolator, nut_buffer *buffer) {\n    if (interpolator->t < 0.0) {\n        // Special start-up condition. Set b_buffer and interpolate from zero.\n        if (buffer->type == NUT_BUFFER_U8) {\n            interpolator->buffer_a = nut_buffer_new_u8(buffer->length, buffer->channels, NULL);\n        } else {\n            interpolator->buffer_a = nut_buffer_new_f64(buffer->length, buffer->channels, NULL);\n        }\n        interpolator->buffer_b = nut_buffer_copy(buffer);\n        interpolator->t = 0.0;\n    } else if (interpolator->t >= 1.0) {\n        nut_buffer_set_data(interpolator->buffer_a, interpolator->buffer_b);\n        nut_buffer_set_data(interpolator->buffer_b, buffer);\n        interpolator->t = 0.0;\n    } else\n\n    interpolator->t += interpolator->interpolate_step;\n}\n\nnut_buffer *nrf_interpolator_get_buffer(nrf_interpolator *interpolator) {\n    nut_buffer *a = interpolator->buffer_a;\n    nut_buffer *b = interpolator->buffer_b;\n    double t = interpolator->t;\n    assert(a->type == b->type);\n    assert(a->size_bytes == b->size_bytes);\n    nut_buffer *dst;\n    if (a->type == NUT_BUFFER_U8) {\n        dst = nut_buffer_new_u8(a->length, a->channels, NULL);\n    } else {\n        dst = nut_buffer_new_f64(a->length, a->channels, NULL);\n    }\n    int size = a->length * a->channels;\n    for (int i = 0; i < size; i++) {\n        double va = nut_buffer_get_f64(a, i);\n        double vb = nut_buffer_get_f64(b, i);\n        double v = va * (1.0 - t) + vb * t;\n        nut_buffer_set_f64(dst, i, v);\n    }\n    return dst;\n}\n\nvoid nrf_interpolator_free(nrf_interpolator *interpolator) {\n    nut_buffer_free(interpolator->buffer_a);\n    nut_buffer_free(interpolator->buffer_b);\n    free(interpolator);\n}\n\n// IQ Drawing\n\n// Take a buffer with 2 channels and a channel for \"t\", the position.\nnut_buffer *nrf_buffer_add_position_channel(nut_buffer *buffer) {\n    nut_buffer *result;\n    if (buffer->type == NUT_BUFFER_U8) {\n        result = nut_buffer_new_u8(buffer->length, buffer->channels + 1, NULL);\n    } else {\n        result = nut_buffer_new_f64(buffer->length, buffer->channels + 1, NULL);\n    }\n    int size = buffer->length * buffer->channels;\n    int k = 0;\n    for (int i = 0; i < size; i += buffer->channels) {\n        for (int j = 0; j < buffer->channels; j++) {\n            double v = nut_buffer_get_f64(buffer, i + j);\n            nut_buffer_set_f64(result, k++, v);\n        }\n        double t = i / (double) size;\n        nut_buffer_set_f64(result, k++, t);\n    }\n    return result;\n}\n\n// Convert a buffer with raw samples to a buffer with I/Q points.\nnut_buffer *nrf_buffer_to_iq_points(nut_buffer *buffer) {\n    nut_buffer *img = nut_buffer_new_u8(NRF_IQ_RESOLUTION * NRF_IQ_RESOLUTION, 1, NULL);\n    int size = buffer->length * buffer->channels;\n    for (int i = 0; i < size; i += 2) {\n        int u8i = nut_buffer_get_u8(buffer, i);\n        int u8q = nut_buffer_get_u8(buffer, i + 1);\n        int offset = u8i * NRF_IQ_RESOLUTION + u8q;\n        img->data.u8[offset]++;\n    }\n    return img;\n}\n\n// Convert a buffer to I/Q lines.\nnut_buffer *nrf_buffer_to_iq_lines(nut_buffer *buffer, int size_multiplier, float line_percentage) {\n    line_percentage = _nrf_clampf(line_percentage, 0, 1);\n    int sz = NRF_IQ_RESOLUTION * size_multiplier;\n    nut_buffer *image_buffer = nut_buffer_new_u8(sz * sz, 1, NULL);\n    int x1 = 0;\n    int y1 = 0;\n    int size = buffer->length * buffer->channels;\n    int max = size * line_percentage;\n    for (int i = 0; i < max; i += 2) {\n        int x2 = nut_buffer_get_u8(buffer, i) * size_multiplier;\n        int y2 = nut_buffer_get_u8(buffer, i + 1) * size_multiplier;\n        if (i > 0) {\n            draw_line(image_buffer, NRF_IQ_RESOLUTION * size_multiplier, x1, y1, x2, y2, 0);\n        }\n        x1 = x2;\n        y1 = y2;\n    }\n    return image_buffer;\n}\n\n// FFT Analysis\n\nnrf_fft *nrf_fft_new(int fft_size, int fft_history_size) {\n    nrf_fft *fft = calloc(1, sizeof(nrf_fft));\n    nrf_block_init(&fft->block, NRF_BLOCK_GENERIC, (nrf_block_process_fn) nrf_fft_process, (nrf_block_result_fn) nrf_fft_get_buffer);\n    fft->fft_size = fft_size;\n    fft->fft_history_size = fft_history_size;\n    fft->fft_in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * NRF_SAMPLES_LENGTH);\n    fft->fft_out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * NRF_SAMPLES_LENGTH);\n    fft->fft_plan = fftw_plan_dft_1d(fft_size, fft->fft_in, fft->fft_out, FFTW_FORWARD, FFTW_MEASURE);\n    fft->buffer = calloc(fft_size * fft_history_size, sizeof(double));\n    return fft;\n}\n\nvoid nrf_fft_shift(nrf_fft *fft, double d) {\n    int shift_pixels = round(fft->fft_size / d);\n    if (shift_pixels == 0) {\n        // Don't do anything.\n    } else if (abs(shift_pixels) >= fft->fft_size) {\n        // If we shifted so far that we're out of the range, start over.\n        memset(fft->buffer, 0, fft->fft_size * fft->fft_history_size * sizeof(double));\n    } else {\n        int stride = fft->fft_size;\n        for (int y = 0; y < fft->fft_history_size; y++) {\n            if (shift_pixels > 0) {\n                for (int x = 0; x < fft->fft_size - shift_pixels; x++) {\n                    fft->buffer[y * stride + x] = fft->buffer[y * stride + x + shift_pixels];\n                }\n                for (int x = fft->fft_size - shift_pixels; x < fft->fft_size; x++) {\n                    fft->buffer[y * stride + x] = 0;\n                }\n            } else {\n                for (int x = fft->fft_size - 1; x >= -shift_pixels; x--) {\n                    fft->buffer[y * stride + x] = fft->buffer[y * stride + x + shift_pixels];\n                }\n                for (int x = 0; x < -shift_pixels; x++) {\n                    fft->buffer[y * stride + x] = 0;\n                }\n            }\n        }\n    }\n}\n\nvoid nrf_fft_process(nrf_fft *fft, nut_buffer *buffer) {\n    int size = buffer->length * buffer->channels;\n    int ii = 0;\n    for (int i = 0; i < size; i += 2) {\n        fftw_complex *p = fft->fft_in;\n        double di, dq;\n        if (buffer->type == NUT_BUFFER_U8) {\n            di = buffer->data.u8[i] / 256.0;\n            dq = buffer->data.u8[i + 1] / 256.0;\n        } else {\n            di = buffer->data.f64[i];\n            dq = buffer->data.f64[i + 1];\n        }\n        p[ii][0] = powf(-1, ii) * di;\n        p[ii][1] = powf(-1, ii) * dq;\n        ii++;\n    }\n    fftw_execute(fft->fft_plan);\n    // Move the previous lines down\n    memcpy(fft->buffer + fft->fft_size, fft->buffer, fft->fft_size * (fft->fft_history_size - 1) * sizeof(double));\n    // Set the first line\n    for (int i = 0; i < fft->fft_size; i++) {\n        // DC compensation\n        if (i == fft->fft_size / 2) {\n            fft->buffer[i] = fft->buffer[i - 1];\n        } else {\n            fftw_complex *out = fft->fft_out;\n            double fi = out[i][0];\n            double fq = out[i][1];\n            double pwr = sqrt(fi * fi + fq * fq);\n            fft->buffer[i] = pwr;\n        }\n    }\n}\n\nnut_buffer *nrf_fft_get_buffer(nrf_fft *fft) {\n    return nut_buffer_new_f64(fft->fft_size * fft->fft_history_size, 1, (double *) fft->buffer);\n}\n\nvoid nrf_fft_free(nrf_fft *fft) {\n    fftw_destroy_plan(fft->fft_plan);\n    fftw_free(fft->fft_in);\n    fftw_free(fft->fft_out);\n    free(fft);\n}\n\n// Finite Impulse Response (FIR) Filter\n\n// Generates coefficients for a FIR low-pass filter with the given\n// half-amplitude frequency and kernel length at the given sample rate.\n//\n// sample_rate    - The signal's sample rate.\n// half_ampl_freq - The half-amplitude frequency in Hz.\n// length         - The filter kernel's length. Should be an odd number.\n//\n// Returns the FIR coefficients for the filter.\ndouble *nrf_fir_get_low_pass_coefficients(int sample_rate, int half_ampl_freq, int length) {\n    length += (length + 1) % 2;\n    double freq = half_ampl_freq / (double) sample_rate;\n    double *coefs = calloc(length, sizeof(double));\n    int center = floor(length / 2);\n    double sum = 0;\n    for (int i = 0; i < length; i++) {\n        double val;\n        if (i == center) {\n            val = TAU * freq;\n        } else {\n            double angle = TAU * (i + 1) / (double) (length + 1);\n            val = sin(TAU * freq * (i - center)) / (double) (i - center);\n            val *= 0.42 - 0.5 * cos(angle) + 0.08 * cos(2 * angle);\n        }\n        sum += val;\n        coefs[i] = val;\n    }\n    for (int i = 0; i < length; i++) {\n        coefs[i] /= sum;\n    }\n    return coefs;\n}\n\nnrf_fir_filter *nrf_fir_filter_new(int sample_rate, int half_ampl_freq, int length) {\n    nrf_fir_filter *filter = calloc(1, sizeof(nrf_fir_filter));\n    filter->length = length;\n    filter->coefficients = nrf_fir_get_low_pass_coefficients(sample_rate, half_ampl_freq, length);\n    filter->offset = length - 1;\n    filter->center = floor(length / 2);\n    filter->samples_length = filter->offset;\n    filter->samples = calloc(filter->samples_length, sizeof(double));\n    return filter;\n}\n\nvoid nrf_fir_filter_load(nrf_fir_filter *filter, double *samples, int length) {\n    int should_free = 0;\n    int new_length = length + filter->offset;\n    double *new_samples;\n    if (filter->samples_length != new_length) {\n        if (filter->samples_length != 0) {\n            should_free = 1;\n        }\n        new_samples = calloc(new_length, sizeof(double));\n    } else {\n        new_samples = filter->samples;\n    }\n\n    // Copy the last `offset` samples to the new buffer.\n    memcpy(new_samples, filter->samples + filter->samples_length - filter->offset, filter->offset * sizeof(double));\n    memcpy(new_samples + filter->offset, samples, length * sizeof(double));\n\n    if (should_free) {\n        free(filter->samples);\n    }\n    filter->samples = new_samples;\n    filter->samples_length = new_length;\n}\n\ndouble nrf_fir_filter_get(nrf_fir_filter *filter, int index) {\n    double v = 0;\n    for (int i = 0; i < filter->length; i++) {\n        v += filter->coefficients[i] * filter->samples[index + i];\n    }\n    return v;\n}\n\nvoid nrf_fir_filter_free(nrf_fir_filter *filter) {\n    filter->samples_length = 0;\n    free(filter->coefficients);\n    free(filter->samples);\n    free(filter);\n}\n\n// IQ Filter\n\nnrf_iq_filter *nrf_iq_filter_new(int sample_rate, int half_ampl_freq, int kernel_length) {\n    nrf_iq_filter *f = calloc(1, sizeof(nrf_iq_filter));\n    nrf_block_init(&f->block, NRF_BLOCK_GENERIC, (nrf_block_process_fn) nrf_iq_filter_process, (nrf_block_result_fn) nrf_iq_filter_get_buffer);\n    f->filter_i = nrf_fir_filter_new(sample_rate, half_ampl_freq, kernel_length);\n    f->filter_q = nrf_fir_filter_new(sample_rate, half_ampl_freq, kernel_length);\n    return f;\n}\n\nvoid nrf_iq_filter_process(nrf_iq_filter *filter, nut_buffer *buffer) {\n    int old_length = filter->samples_length;\n    int length = buffer->length;\n    if (length != old_length) {\n        free(filter->samples_i);\n        free(filter->samples_q);\n        filter->samples_i = calloc(length, sizeof(double));\n        filter->samples_q = calloc(length, sizeof(double));\n    }\n    filter->samples_length = length;\n\n    int j = 0;\n    for (int i = 0; i < length * 2; i += 2) {\n        filter->samples_i[j] = nut_buffer_get_f64(buffer, i);\n        filter->samples_q[j] = nut_buffer_get_f64(buffer, i + 1);\n        j++;\n    }\n    nrf_fir_filter_load(filter->filter_i, filter->samples_i, length);\n    nrf_fir_filter_load(filter->filter_q, filter->samples_q, length);\n}\n\nnut_buffer *nrf_iq_filter_get_buffer(nrf_iq_filter *f) {\n    int length = f->samples_length;\n    nut_buffer *result = nut_buffer_new_f64(length, 2, NULL);\n    int k = 0;\n    for (int i = 0; i < length; i++) {\n        result->data.f64[k++] = nrf_fir_filter_get(f->filter_i, i);\n        result->data.f64[k++] = nrf_fir_filter_get(f->filter_q, i);\n    }\n    return result;\n}\n\nvoid nrf_iq_filter_free(nrf_iq_filter *f) {\n    nrf_fir_filter_free(f->filter_i);\n    nrf_fir_filter_free(f->filter_q);\n    free(f->samples_i);\n    free(f->samples_q);\n    free(f);\n}\n\n// Downsampler\n\nnrf_downsampler *nrf_downsampler_new(int in_rate, int out_rate, int filter_freq, int kernel_length) {\n    nrf_downsampler *d = calloc(1, sizeof(nrf_downsampler));\n    d->in_rate = in_rate;\n    d->out_rate = out_rate;\n    d->filter = nrf_fir_filter_new(in_rate, filter_freq, kernel_length);\n    d->rate_mul = in_rate / (double) out_rate;\n    d->out_length = 0;\n    d->out_samples = NULL;\n    return d;\n}\n\nvoid nrf_downsampler_process(nrf_downsampler *d, double *samples, int length) {\n    nrf_fir_filter_load(d->filter, samples, length);\n\n    // FIXME: Optimize by comparing out_length to d->out_length\n    free(d->out_samples);\n    d->out_length = floor(length / d->rate_mul);\n    d->out_samples = calloc(d->out_length, sizeof(double));\n\n    double t = 0;\n    for (int i = 0; i < d->out_length; i++) {\n        d->out_samples[i] = nrf_fir_filter_get(d->filter, floor(t));\n        t += d->rate_mul;\n    }\n}\n\nvoid nrf_downsampler_free(nrf_downsampler *d) {\n    nrf_fir_filter_free(d->filter);\n    free(d->out_samples);\n    free(d);\n}\n\n// Frequency shifter\n\nnrf_freq_shifter *nrf_freq_shifter_new(int freq_offset, int sample_rate) {\n    nrf_freq_shifter *shifter = calloc(1, sizeof(nrf_freq_shifter));\n    nrf_block_init(&shifter->block, NRF_BLOCK_GENERIC, (nrf_block_process_fn) nrf_freq_shifter_process, (nrf_block_result_fn) nrf_freq_shifter_get_buffer);\n    shifter->freq_offset = freq_offset;\n    shifter->sample_rate = sample_rate;\n    shifter->cosine = 1;\n    shifter->sine = 0;\n    return shifter;\n}\n\nvoid nrf_freq_shifter_process_samples(nrf_freq_shifter *shifter, double *samples_i, double *samples_q, int length) {\n    double delta_cos = cos(TAU * shifter->freq_offset / (double) shifter->sample_rate);\n    double delta_sin = sin(TAU * shifter->freq_offset / (double) shifter->sample_rate);\n    double cosine = shifter->cosine;\n    double sine = shifter->sine;\n    for (int i = 0; i < length; i++) {\n        double vi = samples_i[i];\n        double vq = samples_q[i];\n        samples_i[i] = vi * cosine - vq * sine;\n        samples_q[i] = vi * sine + vq * cosine;\n        double new_sine = cosine * delta_sin + sine * delta_cos;\n        double new_cosine = cosine * delta_cos - sine * delta_sin;\n        sine = new_sine;\n        cosine = new_cosine;\n    }\n    shifter->cosine = cosine;\n    shifter->sine = sine;\n}\n\nvoid nrf_freq_shifter_process(nrf_freq_shifter *shifter, nut_buffer *buffer) {\n    double delta_cos = cos(TAU * shifter->freq_offset / (double) shifter->sample_rate);\n    double delta_sin = sin(TAU * shifter->freq_offset / (double) shifter->sample_rate);\n    double cosine = shifter->cosine;\n    double sine = shifter->sine;\n    assert(buffer->channels == 2);\n    int size = buffer->length * buffer->channels;\n    if (shifter->buffer == NULL) {\n        shifter->buffer = nut_buffer_new_f64(size, 2, NULL);\n    }\n    double *out_samples = shifter->buffer->data.f64;\n    for (int i = 0; i < size; i += 2) {\n        double vi = nut_buffer_get_f64(buffer, i);\n        double vq = nut_buffer_get_f64(buffer, i + 1);\n        out_samples[i] = vi * cosine - vq * sine + 0.5;\n        out_samples[i + 1] = vi * sine + vq * cosine + 0.5;\n        double new_sine = cosine * delta_sin + sine * delta_cos;\n        double new_cosine = cosine * delta_cos - sine * delta_sin;\n        sine = new_sine;\n        cosine = new_cosine;\n    }\n    shifter->cosine = cosine;\n    shifter->sine = sine;\n}\n\nnut_buffer *nrf_freq_shifter_get_buffer(nrf_freq_shifter *shifter) {\n    return nut_buffer_copy(shifter->buffer);\n}\n\nvoid nrf_freq_shifter_free(nrf_freq_shifter *shifter) {\n    free(shifter);\n}\n\n// Signal Detector\n\nnrf_signal_detector *nrf_signal_detector_new() {\n    nrf_signal_detector *detector = calloc(1, sizeof(nrf_signal_detector));\n    return detector;\n}\n\nvoid nrf_signal_detector_process(nrf_signal_detector *detector, nut_buffer *buffer) {\n    int size = buffer->length * buffer->channels;\n    double total = 0;\n    for (int i = 0; i < size; i += 2) {\n        total += nut_buffer_get_f64(buffer, i);\n    }\n\n    double mean = total / (double) size * 2;\n    double diffs_total = 0;\n    for (int i = 0; i < size; i++) {\n        double diff = nut_buffer_get_f64(buffer, i) - mean;\n        diffs_total += diff * diff;\n    }\n    detector->mean = mean;\n    detector->standard_deviation = sqrt(diffs_total / mean);\n}\n\nvoid nrf_signal_detector_free(nrf_signal_detector *detector) {\n    free(detector);\n}\n\n// RAW Demodulator\n\nnrf_raw_demodulator *nrf_raw_demodulator_new(int in_sample_rate, int out_sample_rate) {\n    nrf_raw_demodulator *d = calloc(1, sizeof(nrf_raw_demodulator));\n    d->in_sample_rate = in_sample_rate;\n    d->out_sample_rate = out_sample_rate;\n    d->downsampler_audio = nrf_downsampler_new(in_sample_rate, out_sample_rate, out_sample_rate / 2, 41);\n    return d;\n}\n\nvoid nrf_raw_demodulator_process(nrf_raw_demodulator *demodulator, double *samples_i, double *samples_q, int length) {\n    nrf_downsampler_process(demodulator->downsampler_audio, samples_i, length);\n\n    // Copy audio samples to demodulator\n    int audio_samples_length = demodulator->downsampler_audio->out_length;\n    if (audio_samples_length != demodulator->audio_samples_length) {\n        free(demodulator->audio_samples);\n        demodulator->audio_samples = calloc(audio_samples_length, sizeof(double));\n        demodulator->audio_samples_length = audio_samples_length;\n    }\n    memcpy(demodulator->audio_samples, demodulator->downsampler_audio->out_samples, audio_samples_length * sizeof(double));\n}\n\nvoid nrf_raw_demodulator_free(nrf_raw_demodulator *demodulator) {\n    nrf_downsampler_free(demodulator->downsampler_audio);\n    free(demodulator->audio_samples);\n    free(demodulator);\n}\n\n// FM Demodulator\n\nnrf_fm_demodulator *nrf_fm_demodulator_new(int in_sample_rate, int out_sample_rate) {\n    nrf_fm_demodulator *d = calloc(1, sizeof(nrf_fm_demodulator));\n    const int inter_rate = 336000;\n    const int  max_f = 75000;\n    const double filter_freq = max_f * 0.8;\n    d->in_sample_rate = in_sample_rate;\n    d->out_sample_rate = out_sample_rate;\n    d->ampl_conv = out_sample_rate / (TAU * max_f);\n    d->downsampler_i = nrf_downsampler_new(in_sample_rate, inter_rate, filter_freq, 51);\n    d->downsampler_q = nrf_downsampler_new(in_sample_rate, inter_rate, filter_freq, 51);\n    d->downsampler_audio = nrf_downsampler_new(inter_rate, out_sample_rate, 10000, 41);\n    return d;\n}\n\nvoid nrf_fm_demodulator_process(nrf_fm_demodulator *demodulator, double *samples_i, double *samples_q, int length) {\n    // Downsample\n    nrf_downsampler_process(demodulator->downsampler_i, samples_i, length);\n    nrf_downsampler_process(demodulator->downsampler_q, samples_q, length);\n\n    // Allocate demodulated samples buffer\n    int demodulated_length = demodulator->downsampler_i->out_length;\n    if (demodulated_length != demodulator->demodulated_length) {\n        free(demodulator->demodulated_samples);\n        demodulator->demodulated_samples = calloc(demodulated_length, sizeof(double));\n        demodulator->demodulated_length = demodulated_length;\n    }\n    double *demodulated_samples = demodulator->demodulated_samples;\n\n    // Actual FM demodulation\n    double prev = 0;\n    double delta_sum_squared = 0;\n    double l_i = demodulator->l_i;\n    double l_q = demodulator->l_q;\n    for (int i = 0; i < demodulated_length; i++) {\n        double real = l_i * demodulator->downsampler_i->out_samples[i] + l_q * demodulator->downsampler_q->out_samples[i];\n        double imag = l_i * demodulator->downsampler_q->out_samples[i] - demodulator->downsampler_i->out_samples[i] * l_q;\n        double sgn = 1;\n        if (imag < 0) {\n            sgn *= -1;\n            imag *= -1;\n        }\n        double ang = 0;\n        double div;\n        if (real == imag) {\n            div = 1;\n        } else if (real > imag) {\n            div = imag / real;\n        } else {\n            ang = -M_PI / 2;\n            div = real / imag;\n            sgn *= -1;\n        }\n        demodulated_samples[i] = sgn *\n            (ang + div\n                / (0.98419158358617365\n                    + div * (0.093485702629671305\n                        + div * 0.19556307900617517))) * demodulator->ampl_conv;\n        l_i = demodulator->downsampler_i->out_samples[i];\n        l_q = demodulator->downsampler_q->out_samples[i];\n        double delta = prev - demodulated_samples[i];\n        delta_sum_squared += delta * delta;\n        prev = demodulated_samples[i];\n    }\n    demodulator->l_i = l_i;\n    demodulator->l_q = l_q;\n\n    // Downsample again, for audio\n    nrf_downsampler_process(demodulator->downsampler_audio, demodulated_samples, demodulated_length);\n\n   // Copy audio samples to demodulator\n    int audio_samples_length = demodulator->downsampler_audio->out_length;\n    if (audio_samples_length != demodulator->audio_samples_length) {\n        free(demodulator->audio_samples);\n        demodulator->audio_samples = calloc(audio_samples_length, sizeof(double));\n        demodulator->audio_samples_length = audio_samples_length;\n    }\n    memcpy(demodulator->audio_samples, demodulator->downsampler_audio->out_samples, audio_samples_length * sizeof(double));\n    double *audio_samples = demodulator->audio_samples;\n\n    // De-emphasize samples\n    double alpha = 1.0 / (1.0 + demodulator->out_sample_rate * 50.0 / 1e6);\n    double val = demodulator->deemphasis_val;\n    for (int i = 0; i < audio_samples_length; i++) {\n        val = val + alpha * (audio_samples[i] - val);\n        audio_samples[i] = val;\n    }\n    demodulator->deemphasis_val = val;\n}\n\nvoid nrf_fm_demodulator_free(nrf_fm_demodulator *demodulator) {\n    nrf_downsampler_free(demodulator->downsampler_i);\n    nrf_downsampler_free(demodulator->downsampler_q);\n    nrf_downsampler_free(demodulator->downsampler_audio);\n    free(demodulator->demodulated_samples);\n    free(demodulator->audio_samples);\n    free(demodulator);\n}\n\n// Decoder\n\nnrf_decoder *nrf_decoder_new(nrf_demodulate_type demodulate_type, int in_sample_rate, int out_sample_rate, int freq_offset) {\n    nrf_decoder *decoder = calloc(1, sizeof(nrf_decoder));\n    decoder->in_sample_rate = in_sample_rate;\n    decoder->out_sample_rate = out_sample_rate;\n    decoder->demodulate_type = demodulate_type;\n    if (decoder->demodulate_type == NRF_DEMODULATE_RAW) {\n        decoder->demodulator = nrf_raw_demodulator_new(decoder->in_sample_rate, decoder->out_sample_rate);\n    } else if (decoder->demodulate_type == NRF_DEMODULATE_WBFM) {\n        decoder->demodulator = nrf_fm_demodulator_new(decoder->in_sample_rate, decoder->out_sample_rate);\n    }\n    decoder->freq_shifter = nrf_freq_shifter_new(freq_offset, in_sample_rate);\n    return decoder;\n}\n\nvoid nrf_decoder_process(nrf_decoder *decoder, uint8_t *buffer, size_t length) {\n    // Convert 8-bit samples to doubles\n    if (decoder->samples_length != length) {\n        free(decoder->samples_i);\n        free(decoder->samples_q);\n        decoder->samples_i = calloc(length, sizeof(double));\n        decoder->samples_q = calloc(length, sizeof(double));\n    }\n\n    double *samples_i = decoder->samples_i;\n    double *samples_q = decoder->samples_q;\n    for (int i = 0; i < length; i++) {\n        double vi = buffer[i * 2]  / 128.0 - 0.995;\n        double vq = buffer[i * 2 + 1]  / 128.0 - 0.995;\n        samples_i[i] = vi;\n        samples_q[i] = vq;\n    }\n\n    // Shift frequency\n    nrf_freq_shifter_process_samples(decoder->freq_shifter, samples_i, samples_q, length);\n\n    // Demodulate\n    if (decoder->demodulate_type == NRF_DEMODULATE_RAW) {\n        nrf_raw_demodulator *demodulator = (nrf_raw_demodulator*) decoder->demodulator;\n        nrf_raw_demodulator_process(demodulator, samples_i, samples_q, length);\n        // FIXME: memcpy?\n        decoder->audio_samples = demodulator->audio_samples;\n        decoder->audio_samples_length = demodulator->audio_samples_length;\n    } else if (decoder->demodulate_type == NRF_DEMODULATE_WBFM) {\n        nrf_fm_demodulator *demodulator = (nrf_fm_demodulator*) decoder->demodulator;\n        nrf_fm_demodulator_process(demodulator, samples_i, samples_q, length);\n        // FIXME: memcpy?\n        decoder->audio_samples = demodulator->audio_samples;\n        decoder->audio_samples_length = demodulator->audio_samples_length;\n    }\n}\n\nvoid nrf_decoder_free(nrf_decoder *decoder) {\n    if (decoder->demodulate_type == NRF_DEMODULATE_RAW) {\n        nrf_raw_demodulator_free(decoder->demodulator);\n    } else if (decoder->demodulate_type == NRF_DEMODULATE_WBFM) {\n        nrf_fm_demodulator_free(decoder->demodulator);\n    }\n    nrf_freq_shifter_free(decoder->freq_shifter);\n    free(decoder);\n}\n\n// Buffer queue\n\nstatic _nut_buffer_queue *_nut_buffer_queue_new(int capacity) {\n    _nut_buffer_queue *q = calloc(1, sizeof(_nut_buffer_queue));\n    q->size = 0;\n    q->capacity = capacity;\n    q->values = calloc(capacity, sizeof(ALuint));\n    return q;\n}\n\nstatic void _nut_buffer_queue_push(_nut_buffer_queue *q, ALuint v) {\n    if (q->size + 1 > q->capacity) {\n        fprintf(stderr, \"Queue is too small (capacity: %d)\\n\", q->capacity);\n    }\n    q->values[q->size] = v;\n    q->size++;\n}\n\nstatic ALuint _nut_buffer_queue_pop(_nut_buffer_queue *q) {\n    if (q->size == 0) {\n        fprintf(stderr, \"No more items to pop.\\n\");\n    }\n    int v = q->values[0];\n    // Shift all items.\n    for (int i = 1; i < q->size; i++) {\n        q->values[i-1] = q->values[i];\n    }\n    q->size--;\n    return v;\n}\n\nstatic void _nut_buffer_queue_free(_nut_buffer_queue *q) {\n    free(q->values);\n    free(q);\n}\n\n// Audio Player\n\nstatic const int AUDIO_SAMPLE_RATE = 48000;\nstatic const ALenum AL_BUFFER_FORMAT = AL_FORMAT_MONO16;\n\nstatic void _nrf_al_check_error(const char *file, int line) {\n    ALenum err = alGetError();\n    int has_error = 0;\n    while (err != AL_NO_ERROR) {\n        has_error = 1;\n        char *msg = NULL;\n        switch (err) {\n            case AL_INVALID_NAME:\n                msg = \"AL_INVALID_NAME\";\n                break;\n            case AL_INVALID_ENUM:\n                msg = \"AL_INVALID_ENUM\";\n                break;\n            case AL_INVALID_VALUE:\n                msg = \"AL_INVALID_VALUE\";\n                break;\n            case AL_INVALID_OPERATION:\n                msg = \"AL_INVALID_OPERATION\";\n                break;\n            case AL_OUT_OF_MEMORY:\n                msg = \"AL_OUT_OF_MEMORY\";\n                break;\n        }\n        fprintf(stderr, \"OpenAL error: %s - %s:%d\\n\", msg, file, line);\n        err = alGetError();\n    }\n    if (has_error) {\n        exit(EXIT_FAILURE);\n    }\n}\n\n#define _NRF_AL_CHECK_ERROR() _nrf_al_check_error(__FILE__, __LINE__)\n\nvoid _nrf_player_decode(nrf_device *device, void *ctx) {\n    nrf_player *player = (nrf_player *) ctx;\n\n    if (player->shutting_down) return;\n\n    // Decode/demodulate the signal.\n    nrf_decoder_process(player->decoder, device->samples, NRF_SAMPLES_LENGTH);\n\n    if (player->shutting_down) return;\n\n    // Convert to signed 16-bit integers.\n    double *audio_samples = player->decoder->audio_samples;\n    int audio_samples_length = player->decoder->audio_samples_length;\n    int16_t *pcm_samples = calloc(audio_samples_length, sizeof(int16_t));\n    for (int i = 0; i < audio_samples_length; i++) {\n        pcm_samples[i] = audio_samples[i] * 32000;\n    }\n\n    if (player->shutting_down) return;\n\n    // Check if there are processed buffers we need to unqueue\n    int processed_buffers;\n    alGetSourceiv(player->audio_source, AL_BUFFERS_PROCESSED, &processed_buffers);\n    _NRF_AL_CHECK_ERROR();\n    assert (processed_buffers <= player->audio_buffer_queue->size);\n    while (processed_buffers > 0) {\n        ALuint buffer_id = _nut_buffer_queue_pop(player->audio_buffer_queue);\n        alSourceUnqueueBuffers(player->audio_source, 1, &buffer_id);\n        _NRF_AL_CHECK_ERROR();\n        alDeleteBuffers(1, &buffer_id);\n        processed_buffers--;\n    }\n\n    // Initialize an audio buffer\n    ALuint buffer_id;\n    alGenBuffers(1, &buffer_id);\n    _NRF_AL_CHECK_ERROR();\n    _nut_buffer_queue_push(player->audio_buffer_queue, buffer_id);\n\n    // Set the data for the buffer\n    alBufferData(buffer_id, AL_BUFFER_FORMAT, pcm_samples, audio_samples_length * sizeof(int16_t), AUDIO_SAMPLE_RATE);\n    _NRF_AL_CHECK_ERROR();\n\n    alSourceQueueBuffers(player->audio_source, 1, &buffer_id);\n    _NRF_AL_CHECK_ERROR();\n\n    ALint source_state;\n    alGetSourcei(player->audio_source, AL_SOURCE_STATE, &source_state);\n    if (source_state != AL_PLAYING && player->audio_buffer_queue->size >= 1) {\n        alSourcePlay(player->audio_source);\n        _NRF_AL_CHECK_ERROR();\n    }\n\n    // The data is now stored in OpenAL, delete our PCM sample buffer.\n    free(pcm_samples);\n}\n\nnrf_player *nrf_player_new(nrf_device *device, nrf_demodulate_type demodulate_type, int freq_offset) {\n    nrf_player *player = calloc(1, sizeof(nrf_player));\n    player->device = device;\n    player->decoder = nrf_decoder_new(demodulate_type, device->sample_rate, AUDIO_SAMPLE_RATE, freq_offset);\n\n     // Initialize the audio context\n    player->audio_device = alcOpenDevice(NULL);\n    if (!device) {\n        fprintf(stderr, \"Could not open audio device.\\n\");\n        exit(EXIT_FAILURE);\n    }\n    player->audio_context = alcCreateContext(player->audio_device, NULL);\n    alcMakeContextCurrent(player->audio_context);\n    _NRF_AL_CHECK_ERROR();\n\n    // Initialize an audio source.\n    alGenSources(1, &player->audio_source);\n    _NRF_AL_CHECK_ERROR();\n\n    // Turn off looping.\n    alSourcei(player->audio_source, AL_LOOPING, AL_FALSE);\n    _NRF_AL_CHECK_ERROR();\n\n    // Create an audio buffer queue.\n    player->audio_buffer_queue = _nut_buffer_queue_new(1000);\n\n    // Register device callback\n    nrf_device_set_decode_handler(device, _nrf_player_decode, player);\n\n    return player;\n}\n\nvoid nrf_player_set_freq_offset(nrf_player *player, int freq_offset) {\n    player->decoder->freq_shifter->freq_offset = freq_offset;\n}\n\nvoid nrf_player_set_gain(nrf_player *player, float gain) {\n    gain = _nrf_clampf(gain, 0.0, 1.0);\n    alSourcef(player->audio_source, AL_GAIN, gain);\n}\n\nvoid nrf_player_free(nrf_player *player) {\n    player->shutting_down = 1;\n    nrf_device_set_decode_handler(player->device, NULL, NULL);\n    alcMakeContextCurrent(NULL);\n    alcDestroyContext(player->audio_context);\n    alcCloseDevice(player->audio_device);\n    player->shutting_down = 1;\n\n    // Note we don't own the NRF device, so we're not going to free it.\n    nrf_decoder_free(player->decoder);\n    _nut_buffer_queue_free(player->audio_buffer_queue);\n    free(player);\n}\n"
  },
  {
    "path": "src/nrf.h",
    "content": "// NDBX Software Defined Radio library\n\n#ifndef NRF_H\n#define NRF_H\n\n#include <fftw3.h>\n#include <pthread.h>\n#ifdef __APPLE__\n#include <OpenAL/al.h>\n#include <OpenAL/alc.h>\n#else\n#include <AL/al.h>\n#include <AL/alc.h>\n#endif // __APPLE__\n\n#include \"vec.h\"\n#include \"nut.h\"\n\n#define NRF_BUFFER_SIZE_BYTES (16 * 16384)\n#define NRF_SAMPLES_LENGTH 131072\n#define NRF_IQ_RESOLUTION 256\n#define DEFAULT_FFT_SIZE 128\n#define DEFAULT_FFT_HISTORY_SIZE 128\n\n// Block\n\n#define NRF_BLOCK_MAX_OUTPUTS 10\n\ntypedef enum {\n    NRF_BLOCK_SOURCE = 1,\n    NRF_BLOCK_GENERIC,\n    NRF_BLOCK_SINK\n} nrf_block_type;\n\ntypedef struct nrf_block nrf_block;\n\ntypedef void (*nrf_block_process_fn)(nrf_block *block, nut_buffer *buffer);\ntypedef nut_buffer* (*nrf_block_result_fn)(void *block);\n\nstruct nrf_block {\n    nrf_block_type type;\n    nrf_block_process_fn process_fn;\n    nrf_block_result_fn result_fn;\n    int n_outputs;\n    void* outputs[NRF_BLOCK_MAX_OUTPUTS];\n};\n\nvoid nrf_block_init(nrf_block* block, nrf_block_type type, nrf_block_process_fn process_fn, nrf_block_result_fn result_fn);\nvoid nrf_block_connect(nrf_block* input, nrf_block* output);\nvoid nrf_block_process(nrf_block* block, nut_buffer* buffer);\n\n#define NRF_BLOCK nrf_block block\n\n// Device\n\ntypedef struct {\n    int sample_rate;\n    double freq_mhz;\n    const char* data_file;\n} nrf_device_config;\n\ntypedef enum {\n    NRF_DEVICE_DUMMY = 0,\n    NRF_DEVICE_RTLSDR,\n    NRF_DEVICE_HACKRF\n} nrf_device_type;\n\ntypedef struct nrf_device nrf_device;\n\ntypedef void (*nrf_device_decode_cb_fn)(nrf_device *device, void *ctx);\n\nstruct nrf_device {\n    NRF_BLOCK;\n    nrf_device_type device_type;\n    void *device;\n    int sample_rate;\n\n    nrf_device_decode_cb_fn decode_cb_fn;\n    void *decode_cb_ctx;\n\n    pthread_t receive_thread;\n    pthread_mutex_t data_mutex;\n    int receiving;\n    int paused;\n\n    uint8_t *receive_buffer;\n    int dummy_block_length;\n    int dummy_block_index;\n\n    uint8_t samples[NRF_BUFFER_SIZE_BYTES];\n};\n\nnrf_device *nrf_device_new(double freq_mhz, const char* data_file);\nnrf_device *nrf_device_new_with_config(nrf_device_config config);\ndouble nrf_device_set_frequency(nrf_device *device, double freq_mhz);\nvoid nrf_device_set_decode_handler(nrf_device *device, nrf_device_decode_cb_fn fn, void *ctx);\nvoid nrf_device_set_paused(nrf_device *device, int paused);\nvoid nrf_device_step(nrf_device *device);\nnut_buffer *nrf_device_get_samples_buffer(nrf_device *device);\nnut_buffer *nrf_device_get_iq_buffer(nrf_device *device);\nnut_buffer *nrf_device_get_iq_lines(nrf_device *device, int size_multiplier, float line_percentage);\nnut_buffer *nrf_device_get_fft_buffer(nrf_device *device);\nvoid nrf_device_free(nrf_device *device);\n\n// Interpolator\n\ntypedef struct {\n    NRF_BLOCK;\n    double interpolate_step;\n    double t;\n    nut_buffer *buffer_a;\n    nut_buffer *buffer_b;\n} nrf_interpolator;\n\nnrf_interpolator *nrf_interpolator_new(double interpolate_step);\nvoid nrf_interpolator_process(nrf_interpolator *interpolator, nut_buffer *buffer);\nnut_buffer *nrf_interpolator_get_buffer(nrf_interpolator *interpolator);\nvoid nrf_interpolator_free(nrf_interpolator *interpolator);\n\n// IQ Drawing\n\nnut_buffer *nrf_buffer_add_position_channel(nut_buffer *buffer);\nnut_buffer *nrf_buffer_to_iq_points(nut_buffer *buffer);\nnut_buffer *nrf_buffer_to_iq_lines(nut_buffer *buffer, int size_multiplier, float line_percentage);\n\n// FFT Analysis\n\ntypedef struct {\n    NRF_BLOCK;\n    int fft_size;\n    int fft_history_size;\n    double *buffer;\n    fftw_complex *fft_in;\n    fftw_complex *fft_out;\n    fftw_plan fft_plan;\n} nrf_fft;\n\nnrf_fft *nrf_fft_new(int fft_size, int fft_history_size);\nvoid nrf_fft_shift(nrf_fft *fft, double d);\nvoid nrf_fft_process(nrf_fft *fft, nut_buffer *buffer);\nnut_buffer *nrf_fft_get_buffer(nrf_fft *fft);\nvoid nrf_fft_free(nrf_fft *fft);\n\n// Finite Impulse Response (FIR) Filter\n\ntypedef struct {\n    int length;\n    double *coefficients;\n    int offset;\n    int center;\n    int samples_length;\n    double *samples;\n} nrf_fir_filter;\n\ndouble *nrf_fir_get_low_pass_coefficients(int sample_rate, int half_ampl_freq, int length);\nnrf_fir_filter *nrf_fir_filter_new(int sample_rate, int half_ampl_freq, int length);\nvoid nrf_fir_filter_load(nrf_fir_filter *filter, double *samples, int length);\ndouble nrf_fir_filter_get(nrf_fir_filter *filter, int index);\nvoid nrf_fir_filter_free(nrf_fir_filter *filter);\n\n// IQ Filter, based on FIR filter\n\ntypedef struct {\n    NRF_BLOCK;\n    nrf_fir_filter *filter_i;\n    nrf_fir_filter *filter_q;\n    int samples_length;\n    double *samples_i;\n    double *samples_q;\n} nrf_iq_filter;\n\nnrf_iq_filter *nrf_iq_filter_new(int sample_rate, int half_ampl_freq, int kernel_length);\nvoid nrf_iq_filter_process(nrf_iq_filter *filter, nut_buffer *buffer);\nnut_buffer *nrf_iq_filter_get_buffer(nrf_iq_filter *f);\nvoid nrf_iq_filter_free(nrf_iq_filter *filter);\n\n// Downsampler\n\ntypedef struct {\n    int in_rate;\n    int out_rate;\n    nrf_fir_filter *filter;\n    double rate_mul;\n    int out_length;\n    double *out_samples;\n} nrf_downsampler;\n\nnrf_downsampler *nrf_downsampler_new(int in_rate, int out_rate, int filter_freq, int kernel_length);\nvoid nrf_downsampler_process(nrf_downsampler *d, double *samples, int length);\nvoid nrf_downsampler_free(nrf_downsampler *d);\n\n// Frequency shifter\n\ntypedef struct {\n    NRF_BLOCK;\n    int freq_offset;\n    int sample_rate;\n    double cosine;\n    double sine;\n    nut_buffer *buffer;\n} nrf_freq_shifter;\n\nnrf_freq_shifter *nrf_freq_shifter_new(int freq_offset, int sample_rate);\nvoid nrf_freq_shifter_process_samples(nrf_freq_shifter *shifter, double *samples_i, double *samples_q, int length);\nvoid nrf_freq_shifter_process(nrf_freq_shifter *shifter, nut_buffer *buffer);\nnut_buffer *nrf_freq_shifter_get_buffer(nrf_freq_shifter *shifter);\nvoid nrf_freq_shifter_free(nrf_freq_shifter *shifter);\n\n// Signal detector\n\ntypedef struct {\n    double mean;\n    double standard_deviation;\n} nrf_signal_detector;\n\nnrf_signal_detector *nrf_signal_detector_new();\nvoid nrf_signal_detector_process(nrf_signal_detector *detector, nut_buffer *buffer);\nvoid nrf_signal_detector_free(nrf_signal_detector *detector);\n\n// RAW Demodulator\n\ntypedef struct {\n    int in_sample_rate;\n    int out_sample_rate;\n    nrf_downsampler *downsampler_audio;\n    double *audio_samples;\n    int audio_samples_length;\n} nrf_raw_demodulator;\n\nnrf_raw_demodulator *nrf_raw_demodulator_new(int in_sample_rate, int out_sample_rate);\nvoid nrf_raw_demodulator_process(nrf_raw_demodulator *demodulator, double *samples_i, double *samples_q, int length);\nvoid nrf_raw_demodulator_free(nrf_raw_demodulator *demodulator);\n\n// FM Demodulator\n\ntypedef struct {\n    int in_sample_rate;\n    int out_sample_rate;\n    double ampl_conv;\n    double l_i;\n    double l_q;\n    double deemphasis_val;\n    nrf_downsampler *downsampler_i;\n    nrf_downsampler *downsampler_q;\n    nrf_downsampler *downsampler_audio;\n    double *demodulated_samples;\n    int demodulated_length;\n    double *audio_samples;\n    int audio_samples_length;\n} nrf_fm_demodulator;\n\nnrf_fm_demodulator *nrf_fm_demodulator_new(int in_sample_rate, int out_sample_rate);\nvoid nrf_fm_demodulator_process(nrf_fm_demodulator *demodulator, double *samples_i, double *samples_q, int length);\nvoid nrf_fm_demodulator_free(nrf_fm_demodulator *demodulator);\n\n// Decoder\n\ntypedef enum {\n    NRF_DEMODULATE_RAW = 0,\n    NRF_DEMODULATE_WBFM\n} nrf_demodulate_type;\n\ntypedef struct {\n    int in_sample_rate;\n    int out_sample_rate;\n    nrf_demodulate_type demodulate_type;\n    void *demodulator;\n    nrf_freq_shifter *freq_shifter;\n    double *samples_i;\n    double *samples_q;\n    int samples_length;\n    double *audio_samples;\n    int audio_samples_length;\n} nrf_decoder;\n\nnrf_decoder *nrf_decoder_new(nrf_demodulate_type demodulate_type, int in_sample_rate, int out_sample_rate, int freq_offset);\nvoid nrf_decoder_process(nrf_decoder *decoder, uint8_t *buffer, size_t length);\n\n// Player\n\ntypedef struct {\n    int size;\n    int capacity;\n    ALuint *values;\n} _nut_buffer_queue;\n\ntypedef struct {\n    nrf_demodulate_type demodulate_type;\n    nrf_device *device;\n    nrf_decoder *decoder;\n    ALCcontext *audio_context;\n    ALCdevice *audio_device;\n    ALuint audio_source;\n    _nut_buffer_queue *audio_buffer_queue;\n    int shutting_down;\n} nrf_player;\n\nnrf_player *nrf_player_new(nrf_device *device, nrf_demodulate_type demodulate_type, int freq_offset);\nvoid nrf_player_set_freq_offset(nrf_player *player, int freq_offset);\nvoid nrf_player_set_gain(nrf_player *player, float gain);\nvoid nrf_player_free(nrf_player *player);\n\n#endif // NRF_H\n"
  },
  {
    "path": "src/nut.c",
    "content": "#if __STDC_VERSION__ >= 199901L\n#define _XOPEN_SOURCE 600\n#else\n#define _XOPEN_SOURCE 500\n#endif /* __STDC_VERSION__ */\n\n#include <assert.h>\n#include <math.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n\n#include \"nut.h\"\n\n#define MILLIS_TO_NANOS 1000000\n\nvoid nut_sleep_milliseconds(int millis) {\n    struct timespec ts;\n    ts.tv_sec = 0;\n    ts.tv_nsec = millis * MILLIS_TO_NANOS;\n    nanosleep(&ts, NULL);\n}\n\nnut_buffer *nut_buffer_new_u8(int length, int channels, const uint8_t *data) {\n    nut_buffer *buffer = calloc(1, sizeof(nut_buffer));\n    buffer->type = NUT_BUFFER_U8;\n    buffer->length = length;\n    buffer->channels = channels;\n    buffer->size_bytes = length * channels * sizeof(uint8_t);\n    buffer->data.u8 = calloc(buffer->size_bytes, 1);\n    if (data != NULL) {\n        memcpy(buffer->data.u8, data, buffer->size_bytes);\n    }\n    return buffer;\n}\n\nnut_buffer *nut_buffer_new_f64(int length, int channels, const double *data) {\n    nut_buffer *buffer = calloc(1, sizeof(nut_buffer));\n    buffer->type = NUT_BUFFER_F64;\n    buffer->length = length;\n    buffer->channels = channels;\n    buffer->size_bytes = length * channels * sizeof(double);\n    buffer->data.f64 = calloc(buffer->size_bytes, 1);\n    if (data != NULL) {\n        memcpy(buffer->data.f64, data, buffer->size_bytes);\n    }\n    return buffer;\n}\n\nnut_buffer *nut_buffer_copy(nut_buffer *buffer) {\n    assert(buffer != NULL);\n    if (buffer->type == NUT_BUFFER_U8) {\n        return nut_buffer_new_u8(buffer->length, buffer->channels, buffer->data.u8);\n    } else {\n        return nut_buffer_new_f64(buffer->length, buffer->channels, buffer->data.f64);\n    }\n}\n\nnut_buffer *nut_buffer_reduce(nut_buffer *buffer, double percentage) {\n    percentage = percentage < 0.0 ? 0.0 : percentage > 1.0 ? 1.0 : percentage;\n    int new_length = round(buffer->length * percentage);\n    assert(buffer != NULL);\n    if (buffer->type == NUT_BUFFER_U8) {\n        return nut_buffer_new_u8(new_length, buffer->channels, buffer->data.u8);\n    } else {\n        return nut_buffer_new_f64(new_length, buffer->channels, buffer->data.f64);\n    }\n}\n\nnut_buffer *nut_buffer_clip(nut_buffer *buffer, int offset, int length) {\n    assert(buffer != NULL);\n    assert((length < 0) || ((buffer->length - offset) >= length));\n    int new_length = length;\n    if (new_length < 0 || new_length > buffer->length - offset)\n      new_length = buffer->length - offset;\n    if (buffer->type == NUT_BUFFER_U8) {\n        return nut_buffer_new_u8(new_length, buffer->channels, buffer->data.u8 + offset);\n    } else {\n        return nut_buffer_new_f64(new_length, buffer->channels, buffer->data.f64 + offset);\n    }\n}\n\nvoid nut_buffer_set_data(nut_buffer *dst, nut_buffer *src) {\n    assert(dst != NULL);\n    assert(src != NULL);\n    assert(dst->type == src->type);\n    assert(dst->size_bytes == src->size_bytes);\n    if (dst->type == NUT_BUFFER_U8) {\n        memcpy(dst->data.u8, src->data.u8, dst->size_bytes);\n    } else {\n        memcpy(dst->data.f64, src->data.f64, dst->size_bytes);\n    }\n}\n\nvoid nut_buffer_append(nut_buffer *dst, nut_buffer *src) {\n    assert(dst != NULL);\n    assert(src != NULL);\n    assert(dst->type == src->type);\n    int dst_size = dst->length * dst->channels;\n    int src_size = src->length * src->channels;\n    int new_size = dst_size + src_size;\n    if (dst->type == NUT_BUFFER_U8) {\n        uint8_t *new_data = calloc(new_size, sizeof(uint8_t));\n        memcpy(new_data, dst->data.u8, dst->size_bytes);\n        memcpy(new_data + dst_size, src->data.u8, src->size_bytes);\n        free(dst->data.u8);\n        dst->data.u8 = new_data;\n        dst->size_bytes = new_size * sizeof(uint8_t);\n    } else {\n        double *new_data = calloc(new_size, sizeof(double));\n        memcpy(new_data, dst->data.f64, dst->size_bytes);\n        memcpy(new_data + dst_size, src->data.f64, src->size_bytes);\n        free(dst->data.f64);\n        dst->data.f64 = new_data;\n        dst->size_bytes = new_size * sizeof(double);\n    }\n    dst->length = dst->length + src->length;\n}\n\nuint8_t nut_buffer_get_u8(nut_buffer *buffer, int offset) {\n    if (buffer->type == NUT_BUFFER_U8) {\n        return buffer->data.u8[offset];\n    } else {\n        return buffer->data.f64[offset] * 256.0;\n    }\n}\n\ndouble nut_buffer_get_f64(nut_buffer *buffer, int offset) {\n    if (buffer->type == NUT_BUFFER_U8) {\n        return buffer->data.u8[offset] / 256.0;\n    } else {\n        return buffer->data.f64[offset];\n    }\n}\n\nvoid nut_buffer_set_u8(nut_buffer *buffer, int offset, uint8_t value) {\n    if (buffer->type == NUT_BUFFER_U8) {\n        buffer->data.u8[offset] = value;\n    } else {\n        buffer->data.f64[offset] = value / 256.0;\n    }\n}\n\nvoid nut_buffer_set_f64(nut_buffer *buffer, int offset, double value) {\n    if (buffer->type == NUT_BUFFER_U8) {\n        buffer->data.u8[offset] = value * 256.0;\n    } else {\n        buffer->data.f64[offset] = value;\n    }\n}\n\nnut_buffer *nut_buffer_convert(nut_buffer *buffer, nut_buffer_type new_type) {\n    assert(buffer != NULL);\n    int size = buffer->length * buffer->channels;\n    if (new_type == NUT_BUFFER_U8) {\n        nut_buffer *out = nut_buffer_new_u8(buffer->length, buffer->channels, NULL);\n        uint8_t *out_data = out->data.u8;\n        for (int i = 0; i < size; i++) {\n            out_data[i] = nut_buffer_get_u8(buffer, i);\n        }\n        return out;\n    } else {\n        nut_buffer *out = nut_buffer_new_f64(buffer->length, buffer->channels, NULL);\n        double *out_data = out->data.f64;\n        for (int i = 0; i < size; i++) {\n            out_data[i] = nut_buffer_get_f64(buffer, i);\n        }\n        return out;\n    }\n}\n\nvoid nut_buffer_save(nut_buffer *buffer, const char *fname) {\n    assert(buffer != NULL);\n    FILE *fp = fopen(fname, \"wb\");\n    if (fp) {\n        fwrite(buffer->data.u8, buffer->size_bytes, 1, fp);\n        fclose(fp);\n        printf(\"Written %s.\\n\", fname);\n    }\n}\n\nvoid nut_buffer_free(nut_buffer *buffer) {\n    if (buffer->type == NUT_BUFFER_U8) {\n        free(buffer->data.u8);\n    } else {\n        free(buffer->data.f64);\n    }\n    free(buffer);\n}\n"
  },
  {
    "path": "src/nut.h",
    "content": "// Utility\n\n#ifndef NUT_H\n#define NUT_H\n\n#include <stdint.h>\n\n// Sleep\n\nvoid nut_sleep_milliseconds(int millis);\n\n// Buffer\n\ntypedef enum {\n    NUT_BUFFER_U8 = 1,\n    NUT_BUFFER_F64\n} nut_buffer_type;\n\ntypedef union nut_buffer_data {\n    uint8_t *u8;\n    double *f64;\n} nut_buffer_data;\n\ntypedef struct {\n    nut_buffer_type type;\n    int length;\n    int channels;\n    int size_bytes;\n    nut_buffer_data data;\n} nut_buffer;\n\nnut_buffer *nut_buffer_new_u8(int length, int channels, const uint8_t *data);\nnut_buffer *nut_buffer_new_f64(int length, int channels, const double *data);\nnut_buffer *nut_buffer_copy(nut_buffer *buffer);\nnut_buffer *nut_buffer_reduce(nut_buffer *buffer, double percentage);\nnut_buffer *nut_buffer_clip(nut_buffer *buffer, int offset, int length);\nvoid nut_buffer_set_data(nut_buffer *dst, nut_buffer *src);\nvoid nut_buffer_append(nut_buffer *dst, nut_buffer *src);\nuint8_t nut_buffer_get_u8(nut_buffer *buffer, int offset);\ndouble nut_buffer_get_f64(nut_buffer *buffer, int offset);\nvoid nut_buffer_set_u8(nut_buffer *buffer, int offset, uint8_t value);\nvoid nut_buffer_set_f64(nut_buffer *buffer, int offset, double value);\nnut_buffer *nut_buffer_convert(nut_buffer *buffer, nut_buffer_type new_type);\nvoid nut_buffer_save(nut_buffer *buffer, const char *fname);\nvoid nut_buffer_free(nut_buffer *buffer);\n\n#endif // NUT_H\n"
  },
  {
    "path": "src/nvr.cpp",
    "content": "#include <assert.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"nvr.h\"\n\nextern \"C\" {\n    #include \"ngl.h\"\n}\n\nmat4 ovr_matrix_to_mat4(const ovrMatrix4f* om) {\n    // OVR Matrix4 is stored in row-major order, but we use column-major order.\n    mat4 m;\n    m.m[0] = om->M[0][0];\n    m.m[1] = om->M[1][0];\n    m.m[2] = om->M[2][0];\n    m.m[3] = om->M[3][0];\n    m.m[4] = om->M[0][1];\n    m.m[5] = om->M[1][1];\n    m.m[6] = om->M[2][1];\n    m.m[7] = om->M[3][1];\n    m.m[8] = om->M[0][2];\n    m.m[9] = om->M[1][2];\n    m.m[10] = om->M[2][2];\n    m.m[11] = om->M[3][2];\n    m.m[12] = om->M[0][3];\n    m.m[13] = om->M[1][3];\n    m.m[14] = om->M[2][3];\n    m.m[15] = om->M[3][3];\n    return m;\n}\n\nvec3 ovr_vector3_to_vec3(const ovrVector3f* ov) {\n    vec3 v;\n    v.x = ov->x;\n    v.y = ov->y;\n    v.z = ov->z;\n    return v;\n}\n\nquat ovr_quat_to_quat(const ovrQuatf* oq) {\n    quat q;\n    q.x = oq->x;\n    q.y = oq->y;\n    q.z = oq->z;\n    q.w = oq->w;\n    return q;\n}\n\nnvr_device *nvr_device_init() {\n    ovr_Initialize();\n    ovrHmd hmd = ovrHmd_Create(0);\n    if (hmd == NULL) {\n        hmd = ovrHmd_CreateDebug(ovrHmd_DK1);\n        assert(hmd != NULL);\n    }\n    ovrHmd_ConfigureTracking(hmd, ovrTrackingCap_Orientation | ovrTrackingCap_Position, 0);\n    ovrHmd_RecenterPose(hmd);\n    nvr_device *device = (nvr_device *) calloc(1, sizeof(nvr_device));\n    device->hmd = hmd;\n    return device;\n}\n\nvoid nvr_device_destroy(nvr_device *device) {\n    ovrHmd_Destroy(device->hmd);\n    device->hmd = NULL;\n}\n\nnwm_window *nvr_device_window_init(nvr_device *device) {\n    assert(device != NULL);\n    ovrHmd hmd = device->hmd;\n    glfwWindowHint(GLFW_DECORATED, 0);\n    printf(\"Window %d %d %d %d\\n\", hmd->WindowsPos.x, hmd->WindowsPos.y, hmd->Resolution.w, hmd->Resolution.h);\n    nwm_window* window = nwm_window_init(hmd->WindowsPos.x, hmd->WindowsPos.y, hmd->Resolution.w, hmd->Resolution.h);\n    assert(window);\n    void *window_ptr = NULL;\n#if __APPLE__\n    window_ptr = glfwGetCocoaWindow(window);\n#endif\n    ovrHmd_AttachToWindow(hmd, window_ptr, NULL, NULL);\n    ovrHmd_SetEnabledCaps(hmd, ovrHmdCap_LowPersistence | ovrHmdCap_DynamicPrediction);\n    assert(!glfwGetWindowAttrib(window, GLFW_DECORATED));\n    return window;\n}\n\nvoid nvr_device_init_eyes(nvr_device *device) {\n    ovrHmd hmd = device->hmd;\n    printf(\"Product: %s\\n\", hmd->ProductName);\n\n    ovrFovPort eyeFovPorts[2];\n    for (int eyeIndex = 0; eyeIndex < ovrEye_Count; eyeIndex++) {\n        ovrEyeType eye_type = eyeIndex == 0 ? ovrEye_Left : ovrEye_Right;\n        nvr_eye *eye;\n        if (eye_type == 0) {\n            eye = &device->left_eye;\n        } else {\n            eye = &device->right_eye;\n        }\n        eye->type = eye_type;\n        ovrTextureHeader *eyeTextureHeader = &eye->texture.Header;\n        eyeFovPorts[eye_type] = hmd->DefaultEyeFov[eye_type];\n        ovrSizei texture_size = ovrHmd_GetFovTextureSize(hmd, eye_type, hmd->DefaultEyeFov[eye_type], 1.0f);\n        eye->width = texture_size.w;\n        eye->height = texture_size.h;\n        eyeTextureHeader->TextureSize = texture_size;\n        eyeTextureHeader->RenderViewport.Size = eyeTextureHeader->TextureSize;\n        eyeTextureHeader->RenderViewport.Pos.x = 0;\n        eyeTextureHeader->RenderViewport.Pos.y = 0;\n        eyeTextureHeader->API = ovrRenderAPI_OpenGL;\n        GLuint fbo;\n        glGenFramebuffers(1, &fbo);\n        glBindFramebuffer(GL_FRAMEBUFFER, fbo);\n        NGL_CHECK_ERROR();\n\n        GLuint color_texture;\n        glGenTextures(1, &color_texture);\n        glBindTexture(GL_TEXTURE_2D, color_texture);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\n        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture_size.w, texture_size.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);\n        glBindTexture(GL_TEXTURE_2D, 0);\n        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color_texture, 0);\n        NGL_CHECK_ERROR();\n\n        GLuint depth_texture;\n        glGenTextures(1, &depth_texture);\n        glBindTexture(GL_TEXTURE_2D, depth_texture);\n        glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, texture_size.w, texture_size.h, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);\n        glBindTexture(GL_TEXTURE_2D, 0);\n        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_texture, 0);\n        NGL_CHECK_ERROR();\n\n        GLuint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);\n        assert(status == GL_FRAMEBUFFER_COMPLETE);\n        NGL_CHECK_ERROR();\n        glBindFramebuffer(GL_FRAMEBUFFER, 0);\n        NGL_CHECK_ERROR();\n\n        ovrGLTexture *gl_texture = (ovrGLTexture *) &eye->texture;\n        gl_texture->OGL.TexId = color_texture;\n        eye->fbo = fbo;\n        eye->texture_id = color_texture;\n    }\n\n    ovrSizei window_size;\n    window_size.w = hmd->Resolution.w;\n    window_size.h = hmd->Resolution.h;\n\n    ovrGLConfigData cfg;\n    memset(&cfg, 0, sizeof(ovrGLConfigData));\n    cfg.Header.API = ovrRenderAPI_OpenGL;\n    cfg.Header.BackBufferSize = window_size;\n    cfg.Header.Multisample = 1;\n\n    int distortionCaps =\n    ovrDistortionCap_TimeWarp |\n    ovrDistortionCap_Chromatic |\n    ovrDistortionCap_Vignette;\n\n    ovrEyeRenderDesc eyeRenderDescs[2];\n    ovrHmd_ConfigureRendering(hmd, (ovrRenderAPIConfig *)&cfg, distortionCaps, eyeFovPorts, eyeRenderDescs);\n\n    for (int eyeIndex = 0; eyeIndex < ovrEye_Count; eyeIndex++) {\n        ovrEyeType eye_type = eyeIndex == 0 ? ovrEye_Left : ovrEye_Right;\n        nvr_eye *eye;\n        if (eye_type == 0) {\n            eye = &device->left_eye;\n        } else {\n            eye = &device->right_eye;\n        }\n        eye->index = (int) eye_type;\n        eye->render_desc = eyeRenderDescs[eyeIndex];\n        ovrMatrix4f projection = ovrMatrix4f_Projection(eyeRenderDescs[eyeIndex].Fov, 0.01f, 10000.0f, 1);\n        eye->projection = ovr_matrix_to_mat4(&projection);\n    }\n}\n\nvoid nvr_device_draw(nvr_device *device, nvr_render_cb_fn callback, void* ctx) {\n    ovrHmd hmd = device->hmd;\n    ovrFrameTiming frame_timing = ovrHmd_BeginFrame(hmd, 0);\n    ovrTrackingState tracking_state = ovrHmd_GetTrackingState(hmd, frame_timing.ScanoutMidpointSeconds);\n    ovrVector3f hmd_to_eye_view_offsets[2] = { device->right_eye.render_desc.HmdToEyeViewOffset, device->left_eye.render_desc.HmdToEyeViewOffset };\n\n    ovrPosef eye_render_poses[2];\n    ovrHmd_GetEyePoses(hmd, 0, hmd_to_eye_view_offsets, eye_render_poses, &tracking_state);\n\n    glEnable(GL_DEPTH_TEST);\n    for (int eyeIndex = 0; eyeIndex < ovrEye_Count; eyeIndex++) {\n        ovrEyeType eye_type = hmd->EyeRenderOrder[eyeIndex];\n        nvr_eye *eye;\n        if (eye_type == 0) {\n            eye = &device->left_eye;\n        } else {\n            eye = &device->right_eye;\n        }\n        glBindFramebuffer(GL_FRAMEBUFFER, eye->fbo);\n        glViewport(0, 0, eye->width, eye->height);\n        glClearColor(1.0f, 0.0f, 0.0f, 1.0f);\n        glClear(GL_COLOR_BUFFER_BIT);\n\n        callback(device, eye, ctx);\n    }\n    glBindFramebuffer(GL_FRAMEBUFFER, 0);\n    ovrTexture textures[2];\n    textures[0] = device->left_eye.texture;\n    textures[1] = device->right_eye.texture;\n    ovrHmd_EndFrame(hmd, eye_render_poses, textures);\n}\n\nngl_camera *nvr_device_eye_to_camera(nvr_device *device, nvr_eye *eye) {\n    ovrHmd hmd = device->hmd;\n    ovrTrackingState hmd_state;\n    ovrVector3f hmd_to_eye_view_offsets[2] = { device->left_eye.render_desc.HmdToEyeViewOffset, device->right_eye.render_desc.HmdToEyeViewOffset };\n    ovrPosef eye_render_poses[2];\n    ovrHmd_GetEyePoses(hmd, 0, hmd_to_eye_view_offsets, eye_render_poses, &hmd_state);\n    quat q = ovr_quat_to_quat(&eye_render_poses[eye->index].Orientation);\n    mat4 orientation = quat_to_mat4(&q);\n    mat4 position = mat4_init_identity();\n    mat4 eye_pose = mat4_mul(&orientation, &position);\n    mat4 inv_eye_pose = mat4_inverse(&eye_pose);\n    ngl_camera *camera = (ngl_camera *) calloc(1, sizeof(ngl_camera));\n    camera->view = inv_eye_pose;\n    camera->projection = eye->projection;\n    return camera;\n}\n\n"
  },
  {
    "path": "src/nvr.h",
    "content": "#ifndef NVR_H\n#define NVR_H\n\n#ifdef __APPLE__\n    #define OVR_OS_MAC\n#endif\n\nextern \"C\" {\n    #include \"vec.h\"\n    #include \"nwm.h\"\n    #include \"ngl.h\"\n}\n\n#include \"OVR.h\"\n#include \"OVR_CAPI_GL.h\"\n\ntypedef struct {\n    int index;\n    ovrEyeType type;\n    ovrEyeRenderDesc render_desc;\n    int width;\n    int height;\n    mat4 projection;\n    ovrPosef render_pose;\n    vec3 view_adjust;\n    GLuint fbo;\n    ovrTexture texture;\n    GLuint texture_id;\n} nvr_eye;\n\ntypedef struct {\n    ovrHmd hmd;\n    nvr_eye left_eye;\n    nvr_eye right_eye;\n} nvr_device;\n\ntypedef void (*nvr_render_cb_fn)(nvr_device *device, nvr_eye *eye, void *);\n\nnvr_device *nvr_device_init();\nvoid nvr_device_destroy(nvr_device *device);\nnwm_window *nvr_device_window_init(nvr_device *device);\nvoid nvr_device_init_eyes(nvr_device *device);\nvoid nvr_device_draw(nvr_device *device, nvr_render_cb_fn callback, void* ctx);\nngl_camera *nvr_device_eye_to_camera(nvr_device *device, nvr_eye *eye);\n\n#endif // NVR_H\n"
  },
  {
    "path": "src/nwm.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <assert.h>\n#include <string.h>\n\n#include \"nwm.h\"\n\nstatic void _nwm_on_error(int error, const char* message) {\n    fprintf(stderr, \"GLFW ERROR %d: %s\\n\", error, message);\n    exit(EXIT_FAILURE);\n}\n\nvoid nwm_init() {\n    glfwSetErrorCallback(_nwm_on_error);\n\n    if (!glfwInit()) {\n        fprintf(stderr, \"GLFW ERROR: Failed to initialize.\\n\");\n        exit(EXIT_FAILURE);\n    }\n}\n\nnwm_window *nwm_window_init(int x, int y, int width, int height) {\n    nwm_window* window;\n    glfwWindowHint(GLFW_DEPTH_BITS, 16);\n\n    #ifndef NWM_USE_OPENGL_ES\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);\n    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);\n    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);\n    glfwWindowHint(GLFW_SAMPLES, 4);\n    #endif\n    #if __APPLE__\n    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);\n    #endif\n    window = glfwCreateWindow(width, height, \"Frequensea\", NULL, NULL);\n    assert(window);\n    if (x != 0 || y != 0) {\n        glfwSetWindowPos(window, x, y);\n    }\n    glfwMakeContextCurrent(window);\n    glEnable(GL_BLEND);\n    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n    glEnable(GL_DEPTH_TEST);\n    glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);\n    glEnable(GL_LINE_SMOOTH);\n    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);\n\n    const GLubyte* renderer = glGetString(GL_RENDERER);\n    const GLubyte* version = glGetString(GL_VERSION);\n    printf(\"OpenGL Renderer: %s\\n\", renderer);\n    printf(\"OpenGL Version: %s\\n\", version);\n\n    return (nwm_window*) window;\n}\n\nvoid nwm_window_destroy(nwm_window* window) {\n    glfwDestroyWindow(window);\n}\n\nint nwm_window_should_close(nwm_window* window) {\n    return glfwWindowShouldClose(window);\n}\n\nvoid nwm_window_set_key_callback(nwm_window *window, nwm_key_cb_fn callback) {\n    glfwSetKeyCallback(window, callback);\n}\n\nvoid nwm_window_set_user_data(nwm_window *window, void *data) {\n    glfwSetWindowUserPointer(window, data);\n}\n\nvoid *nwm_window_get_user_data(nwm_window *window) {\n    return glfwGetWindowUserPointer(window);\n}\n\nvoid nwm_window_swap_buffers(nwm_window* window) {\n    glfwSwapBuffers(window);\n}\n\nvoid nwm_poll_events() {\n    glfwPollEvents();\n}\n\nvoid nwm_terminate() {\n    glfwTerminate();\n}\n\ndouble nwm_get_time() {\n    return glfwGetTime();\n}\n"
  },
  {
    "path": "src/nwm.h",
    "content": "#ifndef NWM_H\n#define NWM_H\n\n#ifdef __APPLE__\n#   define GL_SILENCE_DEPRECATION\n#   define GLFW_INCLUDE_GLCOREARB\n#else\n    #include <GL/glew.h>\n#endif\n#include <GLFW/glfw3.h>\n\n#ifdef __APPLE__\n    #define GLFW_EXPOSE_NATIVE_COCOA\n    #define GLFW_EXPOSE_NATIVE_NSGL\n#endif\n#ifdef __linux__\n    #define GLFW_EXPOSE_NATIVE_X11\n    #define GLFW_EXPOSE_NATIVE_GLX\n#endif\n\n#include <GLFW/glfw3native.h>\n\n#define NWM_WIN32 1\n#define NWM_OSX 2\n#define NWM_LINUX 3\n#define NWM_OPENGL 1\n#define NWM_OPENGL_ES 2\n\n#if defined( __WIN32__ ) || defined( _WIN32 )\n    #define NWM_USE_WIN32\n    #define NWM_USE_OPENGL\n    #define NWM_PLATFORM NWM_WIN32\n    #define NWM_OPENGL_TYPE NWM_OPENGL\n#elif defined( __APPLE_CC__)\n    #define NWM_USE_OSX\n    #define NWM_USE_OPENGL\n    #define NWM_PLATFORM NWM_OSX\n    #define NWM_OPENGL_TYPE NWM_OPENGL\n#elif defined(__ARMEL__)\n    #define NWM_USE_LINUX\n    #define NWM_USE_OPENGL_ES\n    #define NWM_PLATFORM NWM_LINUX\n    #define NWM_OPENGL_TYPE NWM_OPENGL_ES\n#else\n    #define NWM_USE_LINUX\n    #define NWM_USE_OPENGL\n    #define NWM_PLATFORM NWM_LINUX\n    #define NWM_OPENGL_TYPE NWM_OPENGL\n#endif\n\ntypedef GLFWwindow nwm_window;\n\ntypedef void (*nwm_key_cb_fn)(nwm_window *window, int key, int scancode, int action, int mods);\n\nvoid nwm_init();\nnwm_window *nwm_window_init(int x, int y, int width, int height);\nvoid nwm_window_destroy(nwm_window* window);\nint nwm_window_should_close(nwm_window* window);\nvoid nwm_window_set_key_callback(nwm_window *window, nwm_key_cb_fn callback);\nvoid *nwm_window_get_user_data(nwm_window *window);\nvoid nwm_window_set_user_data(nwm_window *window, void *data);\nvoid nwm_window_swap_buffers(nwm_window* window);\nvoid nwm_poll_events();\nvoid nwm_terminate();\ndouble nwm_get_time();\n\n#endif // NWM_H\n"
  },
  {
    "path": "src/obj.c",
    "content": "// Wavefront OBJ format parser\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"obj.h\"\n\nint obj_parse(const char *file_name, float** points_ptr, float** normals_ptr, int *face_count_ptr) {\n    FILE* fp = fopen(file_name, \"r\");\n    if (!fp) {\n        fprintf(stderr, \"ERROR: could not find file %s\\n\", file_name);\n        return 0;\n    }\n\n    // First count points in the file\n    int vp_count = 0;\n    int vn_count = 0;\n    int face_count = 0;\n    char line[1024];\n    while (fgets(line, 1024, fp)) {\n        if (line[0] == 'v') { // Vertex data\n            if (line[1] == ' ') { // Vertex point\n                vp_count++;\n            } else if (line[1] == 'n') { // Normal\n                vn_count++;\n            }\n        } else if (line[0] == 'f') { // Face\n            face_count++;\n        }\n    }\n    rewind(fp);\n\n    float* vp_array = calloc(vp_count * 3, sizeof(float));\n    float* vn_array = calloc(vn_count * 3, sizeof(float));\n    int vp_index = 0;\n    int vn_index = 0;\n    int pt_index = 0;\n    float* points = calloc(3 * face_count * 3, sizeof(float));\n    float* normals = calloc(3 * face_count * 3, sizeof(float));\n    *points_ptr = points;\n    *normals_ptr = normals;\n    *face_count_ptr = face_count;\n\n    while (fgets(line, 1024, fp)) {\n        if (line[0] == 'v') { // Vertex data\n            if (line[1] == ' ') { // Vertex point\n                float x = 0.f, y = 0.f, z = 0.f;\n                sscanf(line, \"v %f %f %f\", &x, &y, &z);\n                vp_array[vp_index++] = x;\n                vp_array[vp_index++] = y;\n                vp_array[vp_index++] = z;\n            } else if (line[1] == 'n') { // Normal\n                float x = 0.f, y = 0.f, z = 0.f;\n                sscanf(line, \"vn %f %f %f\", &x, &y, &z);\n                vn_array[vn_index++] = x;\n                vn_array[vn_index++] = y;\n                vn_array[vn_index++] = z;\n            }\n        } else if (line[0] == 'f') { // Face\n            int vp[3], vn[3];\n            sscanf(line, \"f %i//%i %i//%i %i//%i\",\n            &vp[0], &vn[0], &vp[1], &vn[1], &vp[2], &vn[2]);\n            for (int fi = 0; fi < 3; fi++) {\n                // Point IDs start at 1\n                int vpi = vp[fi] - 1;\n                int vni = vn[fi] - 1;\n                points[pt_index] = vp_array[vpi * 3];\n                points[pt_index + 1] = vp_array[vpi * 3 + 1];\n                points[pt_index + 2] = vp_array[vpi * 3 + 2];\n                normals[pt_index] = vn_array[vni * 3];\n                normals[pt_index + 1] = vn_array[vni * 3 + 1];\n                normals[pt_index + 2] = vn_array[vni * 3 + 2];\n                pt_index += 3;\n            }\n        }\n    }\n    fclose(fp);\n    free(vp_array);\n    free(vn_array);\n    return 1;\n}\n\nvoid obj_write(const char *file_name, int component_count, int point_count, float* points) {\n    FILE *fp = fopen(file_name, \"wb\");\n    if (!fp) {\n        perror(file_name);\n        exit(EXIT_FAILURE);\n    }\n\n    for (int row = 0; row < point_count; row++) {\n        fwrite(\"v \", 2, 1, fp);\n        for (int col = 0; col < component_count; col++) {\n            float coord = points[row * component_count + col];\n            char coord_string[100];\n            int len = snprintf(coord_string, 100, \"%.6f \", coord);\n            if (fwrite(coord_string, len, 1, fp) != 1) {\n                fclose(fp);\n                fputs(\"ERR: write capture data: failed to write file.\", stderr);\n                exit(EXIT_FAILURE);\n            }\n        }\n        fwrite(\"\\n\", 1, 1, fp);\n    }\n    for (int row = 0; row < point_count; row += 3) {\n        char face_string[100];\n        int len = snprintf(face_string, 100, \"f %d %d %d\\n\", row + 1, row + 2, row + 3);\n        if (fwrite(face_string, len, 1, fp) != 1) {\n            fclose(fp);\n            fputs(\"ERR: write capture data: failed to write file.\", stderr);\n            exit(EXIT_FAILURE);\n        }\n    }\n\n    fclose(fp);\n}\n\n// int main() {\n//     float* points;\n//     int face_count = 0;\n//     obj_parse(\"../cube.obj\", &points, &face_count);\n//     for (int i = 0; i < face_count; i++) {\n//         printf(\"%.1f %.1f %.1f - %.1f %.1f %.1f - %.1f %.1f %.1f\\n\",\n//                points[(i * 9)], points[(i * 9) + 1], points[(i * 9) + 2],\n//                points[(i * 9) + 3], points[(i * 9) + 4], points[(i * 9) + 5],\n//                points[(i * 9) + 6], points[(i * 9) + 7], points[(i * 9) + 8]);\n//     }\n//     printf(\"%d\\n\", face_count);\n// }\n"
  },
  {
    "path": "src/obj.h",
    "content": "#ifndef OBJ_H\n#define OBJ_H\n\nint obj_parse(const char *file_name, float** points_ptr, float** normals_ptr, int *face_count_ptr);\nvoid obj_write(const char *file_name, int component_count, int point_count, float* points);\n\n#endif // OBJ_H\n"
  },
  {
    "path": "src/vec.c",
    "content": "// Vector and matrix math\n\n#include <math.h>\n#include <string.h>\n\n#include \"vec.h\"\n\n#ifndef M_PI\n#define M_PI 3.14159265358979323846\n#endif\n#define TAU 2.0 * M_PI\n#define ONE_DEG_IN_RAD (2.0 * M_PI) / 360.0 // 0.017444444\n#define ONE_RAD_IN_DEG 360.0 / (2.0 * M_PI) //57.2957795\n\nvec2 vec2_init(float x, float y) {\n    vec2 v;\n    v.x = x;\n    v.y = y;\n    return v;\n}\n\nvec3 vec3_zero() {\n    vec3 v;\n    v.x = 0.0f;\n    v.y = 0.0f;\n    v.z = 0.0f;\n    return v;\n}\n\nvec3 vec3_init(float x, float y, float z) {\n    vec3 v;\n    v.x = x;\n    v.y = y;\n    v.z = z;\n    return v;\n}\n\nvec3 vec3_sub(const vec3* v1, const vec3* v2) {\n    vec3 r;\n    r.x = v1->x - v2->x;\n    r.y = v1->y - v2->y;\n    r.z = v1->z - v2->z;\n    return r;\n}\n\nfloat vec3_length(const vec3* v) {\n    return sqrt(v->x * v->x + v->y * v->y + v->z * v->z);\n}\n\nvec3 vec3_normalize(const vec3* v) {\n    vec3 r = {0};\n    float l = vec3_length(v);\n    if (l == 0.0f) {\n        return r;\n    } else {\n        r.x = v->x / l;\n        r.y = v->y / l;\n        r.z = v->z / l;\n        return r;\n    }\n}\n\nvec3 vec3_cross(const vec3* v1, const vec3* v2) {\n    vec3 r;\n    r.x = v1->y * v2->z - v1->z * v2->y;\n    r.y = v1->z * v2->x - v1->x * v2->z;\n    r.z = v1->x * v2->y - v1->y * v2->x;\n    return r;\n}\n\nfloat vec3_dot(const vec3* v1, const vec3* v2) {\n    return (v1->x * v2->x + v1->y * v2->y + v1->z * v2->z);\n}\n\nvec3 vec3_normal(const vec3* v1, const vec3* v2, const vec3* v3) {\n    vec3 u = vec3_sub(v2, v1);\n    vec3 v = vec3_sub(v3, v1);\n    float x = (u.y * v.z) - (u.z * v.y);\n    float y = (u.z * v.x) - (u.x * v.z);\n    float z = (u.x * v.y) - (u.y * v.x);\n    return vec3_init(x, y, z);\n}\n\nmat4 mat4_init_zero() {\n    mat4 m;\n    m.m[0] = 0.0f;\n    m.m[1] = 0.0f;\n    m.m[2] = 0.0f;\n    m.m[3] = 0.0f;\n    m.m[4] = 0.0f;\n    m.m[5] = 0.0f;\n    m.m[6] = 0.0f;\n    m.m[7] = 0.0f;\n    m.m[8] = 0.0f;\n    m.m[9] = 0.0f;\n    m.m[10] = 0.0f;\n    m.m[11] = 0.0f;\n    m.m[12] = 0.0f;\n    m.m[13] = 0.0f;\n    m.m[14] = 0.0f;\n    m.m[15] = 0.0f;\n    return m;\n}\n\nmat4 mat4_init_identity() {\n    mat4 m;\n    m.m[0] = 1.0f;\n    m.m[1] = 0.0f;\n    m.m[2] = 0.0f;\n    m.m[3] = 0.0f;\n    m.m[4] = 0.0f;\n    m.m[5] = 1.0f;\n    m.m[6] = 0.0f;\n    m.m[7] = 0.0f;\n    m.m[8] = 0.0f;\n    m.m[9] = 0.0f;\n    m.m[10] = 1.0f;\n    m.m[11] = 0.0f;\n    m.m[12] = 0.0f;\n    m.m[13] = 0.0f;\n    m.m[14] = 0.0f;\n    m.m[15] = 1.0f;\n    return m;\n}\n\nmat4 mat4_init_translate(float tx, float ty, float tz) {\n    mat4 m;\n    m.m[0] = 1.0f;\n    m.m[1] = 0.0f;\n    m.m[2] = 0.0f;\n    m.m[3] = 0.0f;\n    m.m[4] = 0.0f;\n    m.m[5] = 1.0f;\n    m.m[6] = 0.0f;\n    m.m[7] = 0.0f;\n    m.m[8] = 0.0f;\n    m.m[9] = 0.0f;\n    m.m[10] = 1.0f;\n    m.m[11] = 0.0f;\n    m.m[12] = tx;\n    m.m[13] = ty;\n    m.m[14] = tz;\n    m.m[15] = 1.0f;\n    return m;\n}\n\nmat4 mat4_init_scale(float sx, float sy, float sz) {\n    mat4 m;\n    m.m[0] = sx;\n    m.m[1] = 0.0f;\n    m.m[2] = 0.0f;\n    m.m[3] = 0.0f;\n    m.m[4] = 0.0f;\n    m.m[5] = sy;\n    m.m[6] = 0.0f;\n    m.m[7] = 0.0f;\n    m.m[8] = 0.0f;\n    m.m[9] = 0.0f;\n    m.m[10] = sz;\n    m.m[11] = 0.0f;\n    m.m[12] = 0.0f;\n    m.m[13] = 0.0f;\n    m.m[14] = 0.0f;\n    m.m[15] = 1.0f;\n    return m;\n}\n\nmat4 mat4_init_rotation_x(float deg) {\n    mat4 m;\n    float rad = deg * ONE_DEG_IN_RAD;\n    m.m[0] = 1.0f;\n    m.m[1] = 0.0f;\n    m.m[2] = 0.0f;\n    m.m[3] = 0.0f;\n    m.m[4] = 0.0f;\n    m.m[5] = cos(rad);\n    m.m[6] = sin(rad);\n    m.m[7] = 0.0f;\n    m.m[8] = 0.0f;\n    m.m[9] = -sin(rad);\n    m.m[10] = cos(rad);\n    m.m[11] = 0.0f;\n    m.m[12] = 0.0f;\n    m.m[13] = 0.0f;\n    m.m[14] = 0.0f;\n    m.m[15] = 1.0f;\n    return m;\n}\n\nmat4 mat4_init_rotation_y(float deg) {\n    mat4 m;\n    float rad = deg * ONE_DEG_IN_RAD;\n    m.m[0] = cos(rad);\n    m.m[1] = 0.0f;\n    m.m[2] = -sin(rad);\n    m.m[3] = 0.0f;\n    m.m[4] = 0.0f;\n    m.m[5] = 1.0f;\n    m.m[6] = 0.0f;\n    m.m[7] = 0.0f;\n    m.m[8] = sin(rad);\n    m.m[9] = 0.0f;\n    m.m[10] = cos(rad);\n    m.m[11] = 0.0f;\n    m.m[12] = 0.0f;\n    m.m[13] = 0.0f;\n    m.m[14] = 0.0f;\n    m.m[15] = 1.0f;\n    return m;\n}\n\nmat4 mat4_init_rotation_z(float deg) {\n    mat4 m;\n    float rad = deg * ONE_DEG_IN_RAD;\n    m.m[0] = cos(rad);\n    m.m[1] = sin(rad);\n    m.m[2] = 0.0f;\n    m.m[3] = 0.0f;\n    m.m[4] = -sin(rad);\n    m.m[5] = cos(rad);\n    m.m[6] = 0.0f;\n    m.m[7] = 0.0f;\n    m.m[8] = 0.0f;\n    m.m[9] = 0.0f;\n    m.m[10] = 1.0f;\n    m.m[11] = 0.0f;\n    m.m[12] = 0.0f;\n    m.m[13] = 0.0f;\n    m.m[14] = 0.0f;\n    m.m[15] = 1.0f;\n    return m;\n}\n\nmat4 mat4_init_perspective(float fov_y, float aspect, float near, float far) {\n    float range = 1.0 / (tan(fov_y * ONE_DEG_IN_RAD * 0.5));\n    mat4 m = mat4_init_zero();\n    m.m[0] = range / aspect;\n    m.m[5] = range;\n    m.m[10] = -far / (near - far);\n    m.m[11] = 1.0f;\n    m.m[14] = (near * far) / (near - far);\n    return m;\n}\n\nmat4 mat4_init_look_at(const vec3* camera, const vec3* target, const vec3* up) {\n    vec3 v1 = vec3_sub(target, camera);\n    vec3 zAxis = vec3_normalize(&v1);\n    vec3 v2 = vec3_cross(up, &zAxis);\n    vec3 xAxis = vec3_normalize(&v2);\n    vec3 v3 = vec3_cross(&zAxis, &xAxis);\n    vec3 yAxis = vec3_normalize(&v3);\n\n    float ex = -vec3_dot(&xAxis, camera);\n    float ey = -vec3_dot(&yAxis, camera);\n    float ez = -vec3_dot(&zAxis, camera);\n\n    mat4 m = mat4_init_zero();\n    m.m[0] = xAxis.x;\n    m.m[1] = xAxis.y;\n    m.m[2] = xAxis.z;\n    m.m[3] = 0.0f;\n    m.m[4] = yAxis.x;\n    m.m[5] = yAxis.y;\n    m.m[6] = yAxis.z;\n    m.m[7] = 0.0f;\n    m.m[8] = zAxis.x;\n    m.m[9] = zAxis.y;\n    m.m[10] = zAxis.z;\n    m.m[11] = 0.0f;\n    m.m[12] = ex;\n    m.m[13] = ey;\n    m.m[14] = ez;\n    m.m[15] = 1.0f;\n    return m;\n}\n\nmat4 mat4_mul(const mat4* m1, const mat4* m2) {\n    mat4 m;\n\n    m.m[0] = m1->m[0] * m2->m[0] + m1->m[1] * m2->m[4] + m1->m[2] * m2->m[8] + m1->m[3] * m2->m[12];\n    m.m[1] = m1->m[0] * m2->m[1] + m1->m[1] * m2->m[5] + m1->m[2] * m2->m[9] + m1->m[3] * m2->m[13];\n    m.m[2] = m1->m[0] * m2->m[2] + m1->m[1] * m2->m[6] + m1->m[2] * m2->m[10] + m1->m[3] * m2->m[14];\n    m.m[3] = m1->m[0] * m2->m[3] + m1->m[1] * m2->m[7] + m1->m[2] * m2->m[11] + m1->m[3] * m2->m[15];\n\n    m.m[4] = m1->m[4] * m2->m[0] + m1->m[5] * m2->m[4] + m1->m[6] * m2->m[8] + m1->m[7] * m2->m[12];\n    m.m[5] = m1->m[4] * m2->m[1] + m1->m[5] * m2->m[5] + m1->m[6] * m2->m[9] + m1->m[7] * m2->m[13];\n    m.m[6] = m1->m[4] * m2->m[2] + m1->m[5] * m2->m[6] + m1->m[6] * m2->m[10] + m1->m[7] * m2->m[14];\n    m.m[7] = m1->m[4] * m2->m[3] + m1->m[5] * m2->m[7] + m1->m[6] * m2->m[11] + m1->m[7] * m2->m[15];\n\n    m.m[8] = m1->m[8] * m2->m[0] + m1->m[9] * m2->m[4] + m1->m[10] * m2->m[8] + m1->m[11] * m2->m[12];\n    m.m[9] = m1->m[8] * m2->m[1] + m1->m[9] * m2->m[5] + m1->m[10] * m2->m[9] + m1->m[11] * m2->m[13];\n    m.m[10] = m1->m[8] * m2->m[2] + m1->m[9] * m2->m[6] + m1->m[10] * m2->m[10] + m1->m[11] * m2->m[14];\n    m.m[11] = m1->m[8] * m2->m[3] + m1->m[9] * m2->m[7] + m1->m[10] * m2->m[11] + m1->m[11] * m2->m[15];\n\n    m.m[12] = m1->m[12] * m2->m[0] + m1->m[13] * m2->m[4] + m1->m[14] * m2->m[8] + m1->m[15] * m2->m[12];\n    m.m[13] = m1->m[12] * m2->m[1] + m1->m[13] * m2->m[5] + m1->m[14] * m2->m[9] + m1->m[15] * m2->m[13];\n    m.m[14] = m1->m[12] * m2->m[2] + m1->m[13] * m2->m[6] + m1->m[14] * m2->m[10] + m1->m[15] * m2->m[14];\n    m.m[15] = m1->m[12] * m2->m[3] + m1->m[13] * m2->m[7] + m1->m[14] * m2->m[11] + m1->m[15] * m2->m[15];\n\n    return m;\n}\n\nmat4 mat4_mul_scalar(const mat4* m, float s) {\n    mat4 r;\n    r.m[0] = m->m[0] * s;\n    r.m[1] = m->m[1] * s;\n    r.m[2] = m->m[2] * s;\n    r.m[3] = m->m[3] * s;\n    r.m[4] = m->m[4] * s;\n    r.m[5] = m->m[5] * s;\n    r.m[6] = m->m[6] * s;\n    r.m[7] = m->m[7] * s;\n    r.m[8] = m->m[8] * s;\n    r.m[9] = m->m[9] * s;\n    r.m[10] = m->m[10] * s;\n    r.m[11] = m->m[11] * s;\n    r.m[12] = m->m[12] * s;\n    r.m[13] = m->m[13] * s;\n    r.m[14] = m->m[14] * s;\n    r.m[15] = m->m[15] * s;\n    return r;\n}\n\nfloat mat4_determinant(const mat4 *m) {\n    return\n    m->m[12] * m->m[9] * m->m[6] * m->m[3] -\n    m->m[8] * m->m[13] * m->m[6] * m->m[3] -\n    m->m[12] * m->m[5] * m->m[10] * m->m[3] +\n    m->m[4] * m->m[13] * m->m[10] * m->m[3] +\n    m->m[8] * m->m[5] * m->m[14] * m->m[3] -\n    m->m[4] * m->m[9] * m->m[14] * m->m[3] -\n    m->m[12] * m->m[9] * m->m[2] * m->m[7] +\n    m->m[8] * m->m[13] * m->m[2] * m->m[7] +\n    m->m[12] * m->m[1] * m->m[10] * m->m[7] -\n    m->m[0] * m->m[13] * m->m[10] * m->m[7] -\n    m->m[8] * m->m[1] * m->m[14] * m->m[7] +\n    m->m[0] * m->m[9] * m->m[14] * m->m[7] +\n    m->m[12] * m->m[5] * m->m[2] * m->m[11] -\n    m->m[4] * m->m[13] * m->m[2] * m->m[11] -\n    m->m[12] * m->m[1] * m->m[6] * m->m[11] +\n    m->m[0] * m->m[13] * m->m[6] * m->m[11] +\n    m->m[4] * m->m[1] * m->m[14] * m->m[11] -\n    m->m[0] * m->m[5] * m->m[14] * m->m[11] -\n    m->m[8] * m->m[5] * m->m[2] * m->m[15] +\n    m->m[4] * m->m[9] * m->m[2] * m->m[15] +\n    m->m[8] * m->m[1] * m->m[6] * m->m[15] -\n    m->m[0] * m->m[9] * m->m[6] * m->m[15] -\n    m->m[4] * m->m[1] * m->m[10] * m->m[15] +\n    m->m[0] * m->m[5] * m->m[10] * m->m[15];\n}\n\nmat4 mat4_inverse(const mat4 *m) {\n    float det = mat4_determinant(m);\n    if (det == 0.0f) {\n        return mat4_init_zero();\n    }\n    float inv_det = 1.0f / det;\n    mat4 r;\n    r.m[0] = inv_det * (\n    m->m[9] * m->m[14] * m->m[7] - m->m[13] * m->m[10] * m->m[7] +\n    m->m[13] * m->m[6] * m->m[11] - m->m[5] * m->m[14] * m->m[11] -\n    m->m[9] * m->m[6] * m->m[15] + m->m[5] * m->m[10] * m->m[15]);\n    r.m[1] = inv_det * (\n    m->m[13] * m->m[10] * m->m[3] - m->m[9] * m->m[14] * m->m[3] -\n    m->m[13] * m->m[2] * m->m[11] + m->m[1] * m->m[14] * m->m[11] +\n    m->m[9] * m->m[2] * m->m[15] - m->m[1] * m->m[10] * m->m[15]);\n    r.m[2] = inv_det * (\n    m->m[5] * m->m[14] * m->m[3] - m->m[13] * m->m[6] * m->m[3] +\n    m->m[13] * m->m[2] * m->m[7] - m->m[1] * m->m[14] * m->m[7] -\n    m->m[5] * m->m[2] * m->m[15] + m->m[1] * m->m[6] * m->m[15]);\n    r.m[3] = inv_det * (\n    m->m[9] * m->m[6] * m->m[3] - m->m[5] * m->m[10] * m->m[3] -\n    m->m[9] * m->m[2] * m->m[7] + m->m[1] * m->m[10] * m->m[7] +\n    m->m[5] * m->m[2] * m->m[11] - m->m[1] * m->m[6] * m->m[11]);\n    r.m[4] = inv_det * (\n    m->m[12] * m->m[10] * m->m[7] - m->m[8] * m->m[14] * m->m[7] -\n    m->m[12] * m->m[6] * m->m[11] + m->m[4] * m->m[14] * m->m[11] +\n    m->m[8] * m->m[6] * m->m[15] - m->m[4] * m->m[10] * m->m[15]);\n    r.m[5] = inv_det * (\n    m->m[8] * m->m[14] * m->m[3] - m->m[12] * m->m[10] * m->m[3] +\n    m->m[12] * m->m[2] * m->m[11] - m->m[0] * m->m[14] * m->m[11] -\n    m->m[8] * m->m[2] * m->m[15] + m->m[0] * m->m[10] * m->m[15]);\n    r.m[6] = inv_det * (\n    m->m[12] * m->m[6] * m->m[3] - m->m[4] * m->m[14] * m->m[3] -\n    m->m[12] * m->m[2] * m->m[7] + m->m[0] * m->m[14] * m->m[7] +\n    m->m[4] * m->m[2] * m->m[15] - m->m[0] * m->m[6] * m->m[15]);\n    r.m[7] = inv_det * (\n    m->m[4] * m->m[10] * m->m[3] - m->m[8] * m->m[6] * m->m[3] +\n    m->m[8] * m->m[2] * m->m[7] - m->m[0] * m->m[10] * m->m[7] -\n    m->m[4] * m->m[2] * m->m[11] + m->m[0] * m->m[6] * m->m[11]);\n    r.m[8] = inv_det * (\n    m->m[8] * m->m[13] * m->m[7] - m->m[12] * m->m[9] * m->m[7] +\n    m->m[12] * m->m[5] * m->m[11] - m->m[4] * m->m[13] * m->m[11] -\n    m->m[8] * m->m[5] * m->m[15] + m->m[4] * m->m[9] * m->m[15]);\n    r.m[9] = inv_det * (\n    m->m[12] * m->m[9] * m->m[3] - m->m[8] * m->m[13] * m->m[3] -\n    m->m[12] * m->m[1] * m->m[11] + m->m[0] * m->m[13] * m->m[11] +\n    m->m[8] * m->m[1] * m->m[15] - m->m[0] * m->m[9] * m->m[15]);\n    r.m[10] = inv_det * (\n    m->m[4] * m->m[13] * m->m[3] - m->m[12] * m->m[5] * m->m[3] +\n    m->m[12] * m->m[1] * m->m[7] - m->m[0] * m->m[13] * m->m[7] -\n    m->m[4] * m->m[1] * m->m[15] + m->m[0] * m->m[5] * m->m[15]);\n    r.m[11] = inv_det * (\n    m->m[8] * m->m[5] * m->m[3] - m->m[4] * m->m[9] * m->m[3] -\n    m->m[8] * m->m[1] * m->m[7] + m->m[0] * m->m[9] * m->m[7] +\n    m->m[4] * m->m[1] * m->m[11] - m->m[0] * m->m[5] * m->m[11]);\n    r.m[12] = inv_det * (\n    m->m[12] * m->m[9] * m->m[6] - m->m[8] * m->m[13] * m->m[6] -\n    m->m[12] * m->m[5] * m->m[10] + m->m[4] * m->m[13] * m->m[10] +\n    m->m[8] * m->m[5] * m->m[14] - m->m[4] * m->m[9] * m->m[14]);\n    r.m[13] = inv_det * (\n    m->m[8] * m->m[13] * m->m[2] - m->m[12] * m->m[9] * m->m[2] +\n    m->m[12] * m->m[1] * m->m[10] - m->m[0] * m->m[13] * m->m[10] -\n    m->m[8] * m->m[1] * m->m[14] + m->m[0] * m->m[9] * m->m[14]);\n    r.m[14] = inv_det * (\n    m->m[12] * m->m[5] * m->m[2] - m->m[4] * m->m[13] * m->m[2] -\n    m->m[12] * m->m[1] * m->m[6] + m->m[0] * m->m[13] * m->m[6] +\n    m->m[4] * m->m[1] * m->m[14] - m->m[0] * m->m[5] * m->m[14]);\n    r.m[15] = inv_det * (\n    m->m[4] * m->m[9] * m->m[2] - m->m[8] * m->m[5] * m->m[2] +\n    m->m[8] * m->m[1] * m->m[6] - m->m[0] * m->m[9] * m->m[6] -\n    m->m[4] * m->m[1] * m->m[10] + m->m[0] * m->m[5] * m->m[10]);\n    return r;\n}\n\nvoid mat4_set(mat4* m, const mat4* src) {\n    memcpy(m, src, sizeof(mat4));\n}\n\nmat4 mat4_translate(const mat4* m, float tx, float ty, float tz) {\n    mat4 t = mat4_init_translate(tx, ty, tz);\n    return mat4_mul(m, &t);\n}\n\nmat4 mat4_scale(const mat4* m, float sx, float sy, float sz) {\n    mat4 s = mat4_init_scale(sx, sy, sz);\n    return mat4_mul(m, &s);\n}\n\nmat4 mat4_rotate_x(const mat4* m, float deg) {\n    mat4 r = mat4_init_rotation_x(deg);\n    return mat4_mul(m, &r);\n}\n\nmat4 mat4_rotate_y(const mat4* m, float deg) {\n    mat4 r = mat4_init_rotation_y(deg);\n    return mat4_mul(m, &r);\n}\n\nmat4 mat4_rotate_z(const mat4* m, float deg) {\n    mat4 r = mat4_init_rotation_z(deg);\n    return mat4_mul(m, &r);\n}\n\nmat4 quat_to_mat4(const quat* q) {\n    float x = q->x;\n    float y = q->y;\n    float z = q->z;\n    float w = q->w;\n\n    float x2 = x + x, y2 = y + y, z2 = z + z;\n    float xx = x * x2, xy = x * y2, xz = x * z2;\n    float yy = y * y2, yz = y * z2, zz = z * z2;\n    float wx = w * x2, wy = w * y2, wz = w * z2;\n\n    mat4 m;\n    m.m[0] = 1.0f - (yy + zz);\n    m.m[1] = xy + wz;\n    m.m[2] = xz - wy;\n    m.m[3] = 0.0f;\n    m.m[4] = xy - wz;\n    m.m[5] = 1.0f - (xx + zz);\n    m.m[6] = yz + wx;\n    m.m[7] = 0.0f;\n    m.m[8] = xz + wy;\n    m.m[9] = yz - wx;\n    m.m[10] = 1.0f - (xx + yy);\n    m.m[11] = 0.0f;\n    m.m[12] = 0.0f;\n    m.m[13] = 0.0f;\n    m.m[14] = 0.0f;\n    m.m[15] = 1.0f;\n    return m;\n}\n"
  },
  {
    "path": "src/vec.h",
    "content": "// Vector and matrix math\n\n#ifndef VEC_H\n#define VEC_H\n\ntypedef struct {\n    float x;\n    float y;\n} vec2;\n\ntypedef struct {\n    float x;\n    float y;\n    float z;\n} vec3;\n\ntypedef struct {\n    float x;\n    float y;\n    float z;\n    float w;\n}  vec4;\n\n// Stored in column order:\n// 0  4  8 12\n// 1  5  9 13\n// 2  6 10 14\n// 3  7 11 15\ntypedef struct {\n    float m[16];\n} mat4;\n\ntypedef struct {\n    float x;\n    float y;\n    float z;\n    float w;\n} quat;\n\nvec2 vec2_init(float x, float y);\n\nvec3 vec3_zero();\nvec3 vec3_init(float x, float y, float z);\nvec3 vec3_sub(const vec3* v1, const vec3* v2);\nfloat vec3_length(const vec3* v);\nvec3 vec3_normalize(const vec3* v);\nvec3 vec3_cross(const vec3* v1, const vec3* v2);\nfloat vec3_dot(const vec3* v1, const vec3* v2);\nvec3 vec3_normal(const vec3* v1, const vec3* v2, const vec3* v3);\n\nmat4 mat4_init_zero();\nmat4 mat4_init_identity();\nmat4 mat4_init_translate(float tx, float ty, float tz);\nmat4 mat4_init_scale(float sx, float sy, float sz);\nmat4 mat4_init_rotation_x(float deg);\nmat4 mat4_init_rotation_y(float deg);\nmat4 mat4_init_rotation_z(float deg);\nmat4 mat4_init_perspective(float fov_y, float aspect, float near, float far);\nmat4 mat4_init_look_at(const vec3* camera, const vec3* target, const vec3* up);\n\nmat4 mat4_mul(const mat4* m1, const mat4* m2);\nmat4 mat4_mul_scalar(const mat4* m, float s);\nfloat mat4_determinant(const mat4 *m);\nmat4 mat4_inverse(const mat4 *m);\nvoid mat4_set(mat4* m, const mat4* src);\n\nmat4 mat4_translate(const mat4* m, float tx, float ty, float tz);\nmat4 mat4_scale(const mat4* m, float sx, float sy, float sz);\nmat4 mat4_rotate_x(const mat4* m, float deg);\nmat4 mat4_rotate_y(const mat4* m, float deg);\nmat4 mat4_rotate_z(const mat4* m, float deg);\n\nmat4 quat_to_mat4(const quat* q);\n\n#endif // VEC_H\n"
  }
]